From e527eed06daeb9471c9ed6e9ddecc92a7953acc0 Mon Sep 17 00:00:00 2001 From: Bastian Germann Date: Fri, 18 Sep 2020 19:16:53 +0100 Subject: [PATCH] Import gambas3_3.15.2.orig.tar.gz [dgit import orig gambas3_3.15.2.orig.tar.gz] --- .gitignore | 48 + .gitlab-ci.yml | 193 + AUTHORS | 287 + CONTRIBUTING.md | 149 + COPYING | 339 + ChangeLog | 0 INSTALL | 1 + Makefile.am | 60 + NEWS | 0 README | 38 + README.commit | 60 + README.md | 41 + TEMPLATE/README | 34 + TEMPLATE/TEMPLATE.c | 28 + TEMPLATE/TEMPLATE.conf | 79 + TEMPLATE/TEMPLATE.cpp | 28 + TEMPLATE/TEMPLATE.h | 35 + TEMPLATE/conf/gb.cairo.conf | 76 + TEMPLATE/conf/gb.dbus.conf | 76 + TEMPLATE/conf/gb.desktop.conf | 76 + TEMPLATE/conf/gb.gmp.conf | 76 + TEMPLATE/conf/gb.gsl.conf | 76 + TEMPLATE/conf/gb.image.io.conf | 76 + TEMPLATE/conf/gb.media.conf | 76 + TEMPLATE/conf/gb.mime.conf | 76 + TEMPLATE/conf/gb.net.pop3.conf | 76 + TEMPLATE/conf/gb.net.smtp.conf | 76 + TEMPLATE/conf/gb.openal.conf | 76 + TEMPLATE/conf/gb.poppler.conf | 79 + TEMPLATE/make-component | 64 + TEMPLATE/template/AUTHORS | 0 TEMPLATE/template/ChangeLog | 0 TEMPLATE/template/Makefile.am | 3 + TEMPLATE/template/NEWS | 0 TEMPLATE/template/README | 0 TEMPLATE/template/SOURCES | 2 + TEMPLATE/template/configure.ac | 72 + TEMPLATE/template/make-component | 3 + TEMPLATE/template/src/.component | 3 + TEMPLATE/template/src/Makefile.am | 12 + TODO | 74 + VERSION | 1 + acinclude.m4 | 1634 + app/AUTHORS | 0 app/COPYING | 1 + app/ChangeLog | 0 app/INSTALL | 231 + app/Makefile.am | 66 + app/NEWS | 0 app/README | 0 app/TODO | 0 app/acinclude.m4 | 1 + app/configure.ac | 20 + app/desktop/gambas3.appdata.xml | 31 + app/desktop/gambas3.desktop | 14 + app/desktop/gambas3.png | Bin 0 -> 3144 bytes app/desktop/gambas3.svg | 540 + app/examples/Basic/Blights/.directory | 2 + app/examples/Basic/Blights/.icon.png | Bin 0 -> 4209 bytes app/examples/Basic/Blights/.lang/ca.po | 28 + app/examples/Basic/Blights/.lang/cs.po | 20 + app/examples/Basic/Blights/.lang/de.po | 21 + app/examples/Basic/Blights/.lang/es.po | 20 + app/examples/Basic/Blights/.lang/fr.po | 3 + app/examples/Basic/Blights/.lang/nl.po | 20 + app/examples/Basic/Blights/.lang/ru.po | 34 + app/examples/Basic/Blights/.lang/sv.po | 15 + app/examples/Basic/Blights/.project | 16 + app/examples/Basic/Blights/.src/win1.class | 36 + app/examples/Basic/Blights/.src/win1.form | 53 + app/examples/Basic/Blights/ampoule.png | Bin 0 -> 1543 bytes app/examples/Basic/Blights/bloff.xpm | 1234 + app/examples/Basic/Blights/blon.xpm | 1503 + app/examples/Basic/Collection/.directory | 2 + app/examples/Basic/Collection/.icon.png | Bin 0 -> 4310 bytes app/examples/Basic/Collection/.lang/ca.po | 48 + app/examples/Basic/Collection/.lang/cs.po | 40 + app/examples/Basic/Collection/.lang/de.po | 41 + app/examples/Basic/Collection/.lang/es.po | 41 + app/examples/Basic/Collection/.lang/nl.po | 41 + app/examples/Basic/Collection/.lang/ru.po | 54 + app/examples/Basic/Collection/.project | 17 + .../Basic/Collection/.src/CThing.class | 6 + .../Basic/Collection/.src/FStart.class | 40 + .../Basic/Collection/.src/FStart.form | 20 + app/examples/Basic/Collection/collection.png | Bin 0 -> 2062 bytes app/examples/Basic/DragNDrop/.directory | 2 + app/examples/Basic/DragNDrop/.icon.png | Bin 0 -> 4159 bytes app/examples/Basic/DragNDrop/.lang/ru.po | 34 + app/examples/Basic/DragNDrop/.project | 17 + .../Basic/DragNDrop/.src/FDragNDrop.class | 138 + .../Basic/DragNDrop/.src/FDragNDrop.form | 108 + app/examples/Basic/DragNDrop/drop.png | Bin 0 -> 1503 bytes app/examples/Basic/Object/.directory | 2 + app/examples/Basic/Object/.icon.png | Bin 0 -> 4189 bytes app/examples/Basic/Object/.lang/ca.po | 43 + app/examples/Basic/Object/.lang/cs.po | 40 + app/examples/Basic/Object/.lang/de.po | 41 + app/examples/Basic/Object/.lang/es.po | 37 + app/examples/Basic/Object/.lang/nl.po | 41 + app/examples/Basic/Object/.lang/ru.po | 58 + app/examples/Basic/Object/.project | 17 + app/examples/Basic/Object/.src/CThing.class | 6 + app/examples/Basic/Object/.src/FStart.class | 44 + app/examples/Basic/Object/.src/FStart.form | 28 + app/examples/Basic/Object/object.png | Bin 0 -> 1499 bytes app/examples/Basic/Timer/.directory | 2 + app/examples/Basic/Timer/.icon.png | Bin 0 -> 4418 bytes app/examples/Basic/Timer/.lang/ca.po | 113 + app/examples/Basic/Timer/.lang/cs.po | 92 + app/examples/Basic/Timer/.lang/de.po | 93 + app/examples/Basic/Timer/.lang/es.po | 96 + app/examples/Basic/Timer/.lang/nl.po | 92 + app/examples/Basic/Timer/.lang/ru.po | 114 + app/examples/Basic/Timer/.project | 19 + .../Basic/Timer/.src/FOtherTimer.class | 85 + .../Basic/Timer/.src/FOtherTimer.form | 40 + app/examples/Basic/Timer/.src/FTimer.class | 56 + app/examples/Basic/Timer/.src/FTimer.form | 100 + app/examples/Basic/Timer/timer.png | Bin 0 -> 2778 bytes .../Control/ArrayOfControls/.directory | 2 + .../Control/ArrayOfControls/.icon.png | Bin 0 -> 4209 bytes .../Control/ArrayOfControls/.lang/ca.po | 45 + .../Control/ArrayOfControls/.lang/cs.po | 44 + .../Control/ArrayOfControls/.lang/de.po | 44 + .../Control/ArrayOfControls/.lang/nl.po | 43 + .../Control/ArrayOfControls/.lang/ru.po | 58 + app/examples/Control/ArrayOfControls/.project | 18 + .../Control/ArrayOfControls/.src/FMain.class | 83 + .../Control/ArrayOfControls/.src/FMain.form | 25 + .../Control/ArrayOfControls/green.png | Bin 0 -> 873 bytes .../Control/ArrayOfControls/green1.png | Bin 0 -> 1548 bytes .../Control/ArrayOfControls/phone.png | Bin 0 -> 18663 bytes app/examples/Control/ArrayOfControls/red.png | Bin 0 -> 1452 bytes app/examples/Control/ArrayOfControls/red1.png | Bin 0 -> 1571 bytes app/examples/Control/Embedder/.directory | 2 + app/examples/Control/Embedder/.icon.png | Bin 0 -> 4242 bytes app/examples/Control/Embedder/.lang/ca.po | 70 + app/examples/Control/Embedder/.lang/cs.po | 62 + app/examples/Control/Embedder/.lang/de.po | 59 + app/examples/Control/Embedder/.lang/es.po | 57 + app/examples/Control/Embedder/.lang/nl.po | 55 + app/examples/Control/Embedder/.lang/ru.po | 77 + app/examples/Control/Embedder/.project | 20 + .../Control/Embedder/.src/FMain.class | 89 + app/examples/Control/Embedder/.src/FMain.form | 54 + app/examples/Control/Embedder/embedder.png | Bin 0 -> 2623 bytes .../Control/HighlightEditor/.directory | 2 + .../.hidden/screenshots/2014-12-17.png | Bin 0 -> 58870 bytes .../Control/HighlightEditor/.icon.png | Bin 0 -> 18015 bytes .../Control/HighlightEditor/.lang/ca.po | 43 + .../Control/HighlightEditor/.lang/cs.po | 40 + .../Control/HighlightEditor/.lang/de.po | 41 + .../Control/HighlightEditor/.lang/es.po | 34 + .../Control/HighlightEditor/.lang/nl.po | 39 + .../Control/HighlightEditor/.lang/ru.po | 64 + app/examples/Control/HighlightEditor/.project | 21 + .../HighlightEditor/.src/FEditor.class | 184 + .../Control/HighlightEditor/.src/FEditor.form | 36 + .../Control/HighlightEditor/download.html | 155 + .../Control/HighlightEditor/editor.png | Bin 0 -> 1657 bytes app/examples/Control/LCDLabel/.directory | 2 + app/examples/Control/LCDLabel/.icon.png | Bin 0 -> 3429 bytes app/examples/Control/LCDLabel/.lang/ru.po | 48 + app/examples/Control/LCDLabel/.project | 17 + .../Control/LCDLabel/.src/FMain.class | 54 + app/examples/Control/LCDLabel/.src/FMain.form | 33 + .../Control/LCDLabel/.src/TimeBoxDemo.class | 152 + app/examples/Control/LCDLabel/alarm.ogg | Bin 0 -> 61621 bytes app/examples/Control/LCDLabel/lcdlabel.png | Bin 0 -> 492 bytes app/examples/Control/MapView/.directory | 2 + .../Control/MapView/.hidden/mapview.png | Bin 0 -> 1749 bytes app/examples/Control/MapView/.icon.png | Bin 0 -> 3486 bytes app/examples/Control/MapView/.lang/ru.po | 78 + app/examples/Control/MapView/.project | 19 + app/examples/Control/MapView/.src/FMain.class | 140 + app/examples/Control/MapView/.src/FMain.form | 80 + app/examples/Control/TextEdit/.directory | 2 + app/examples/Control/TextEdit/.icon.png | Bin 0 -> 4151 bytes app/examples/Control/TextEdit/.lang/ca.po | 118 + app/examples/Control/TextEdit/.lang/cs.po | 109 + app/examples/Control/TextEdit/.lang/de.po | 116 + app/examples/Control/TextEdit/.lang/es.po | 101 + app/examples/Control/TextEdit/.lang/fr.po | 83 + app/examples/Control/TextEdit/.lang/nl.po | 99 + app/examples/Control/TextEdit/.lang/ru.po | 120 + app/examples/Control/TextEdit/.lang/sv.po | 84 + app/examples/Control/TextEdit/.project | 22 + .../Control/TextEdit/.src/FMain.class | 171 + app/examples/Control/TextEdit/.src/FMain.form | 136 + .../Control/TextEdit/.src/frmShowHtml.class | 29 + .../Control/TextEdit/.src/frmShowHtml.form | 29 + app/examples/Control/TextEdit/edit.png | Bin 0 -> 1233 bytes app/examples/Control/TextEdit/text.html | 17 + app/examples/Control/TreeView/.directory | 2 + app/examples/Control/TreeView/.icon.png | Bin 0 -> 4093 bytes app/examples/Control/TreeView/.lang/ca.po | 88 + app/examples/Control/TreeView/.lang/cs.po | 76 + app/examples/Control/TreeView/.lang/de.po | 77 + app/examples/Control/TreeView/.lang/es.po | 73 + app/examples/Control/TreeView/.lang/nl.po | 75 + app/examples/Control/TreeView/.lang/ru.po | 154 + app/examples/Control/TreeView/.project | 17 + .../TreeView/.src/TreeViewExample.class | 184 + .../TreeView/.src/TreeViewExample.form | 59 + app/examples/Control/TreeView/Female.png | Bin 0 -> 293 bytes app/examples/Control/TreeView/Male.png | Bin 0 -> 323 bytes app/examples/Control/TreeView/treeview.png | Bin 0 -> 471 bytes app/examples/Control/Wizard/.directory | 2 + app/examples/Control/Wizard/.icon.png | Bin 0 -> 4168 bytes app/examples/Control/Wizard/.lang/ca.po | 139 + app/examples/Control/Wizard/.lang/cs.po | 138 + app/examples/Control/Wizard/.lang/de.po | 138 + app/examples/Control/Wizard/.lang/nl.po | 107 + app/examples/Control/Wizard/.lang/ru.po | 152 + app/examples/Control/Wizard/.project | 16 + app/examples/Control/Wizard/.src/FMain.class | 65 + app/examples/Control/Wizard/.src/FMain.form | 118 + app/examples/Control/Wizard/wizard.png | Bin 0 -> 1510 bytes app/examples/Database/Database/.component | 4 + app/examples/Database/Database/.directory | 2 + app/examples/Database/Database/.icon.png | Bin 0 -> 4336 bytes app/examples/Database/Database/.lang/ca.po | 160 + app/examples/Database/Database/.lang/cs.po | 157 + app/examples/Database/Database/.lang/de.po | 153 + app/examples/Database/Database/.lang/es.po | 151 + app/examples/Database/Database/.lang/nl.po | 147 + app/examples/Database/Database/.lang/ru.po | 198 + app/examples/Database/Database/.project | 20 + .../Database/Database/.src/FMain.class | 178 + .../Database/Database/.src/FMain.form | 118 + .../Database/Database/.src/FRequest.class | 131 + .../Database/Database/.src/FRequest.form | 12 + .../Database/Database/.src/FTest.class | 25 + .../Database/Database/.src/FTest.form | 121 + .../Database/Database/.src/Form1.class | 83 + .../Database/Database/.src/Form1.form | 8 + app/examples/Database/Database/database.png | Bin 0 -> 1142 bytes app/examples/Database/MySQLExample/.directory | 2 + app/examples/Database/MySQLExample/.icon.png | Bin 0 -> 4409 bytes .../Database/MySQLExample/.lang/ca.po | 539 + .../Database/MySQLExample/.lang/cs.po | 536 + .../Database/MySQLExample/.lang/de.po | 536 + .../Database/MySQLExample/.lang/es.po | 533 + .../Database/MySQLExample/.lang/fr.po | 1546 + .../Database/MySQLExample/.lang/nl.po | 531 + .../Database/MySQLExample/.lang/ru.po | 554 + app/examples/Database/MySQLExample/.project | 26 + .../.src/CreateObjects/FNewDatabase.class | 33 + .../.src/CreateObjects/FNewDatabase.form | 54 + .../.src/CreateObjects/FNewEvent.class | 51 + .../.src/CreateObjects/FNewEvent.form | 53 + .../.src/CreateObjects/FNewField.class | 53 + .../.src/CreateObjects/FNewField.form | 77 + .../.src/CreateObjects/FNewIndex.class | 79 + .../.src/CreateObjects/FNewIndex.form | 70 + .../.src/CreateObjects/FNewRoutine.class | 65 + .../.src/CreateObjects/FNewRoutine.form | 71 + .../.src/CreateObjects/FNewTable.class | 55 + .../.src/CreateObjects/FNewTable.form | 54 + .../.src/CreateObjects/FNewTrigger.class | 62 + .../.src/CreateObjects/FNewTrigger.form | 64 + .../.src/CreateObjects/FNewView.class | 45 + .../.src/CreateObjects/FNewView.form | 44 + .../Database/MySQLExample/.src/FConnect.class | 46 + .../Database/MySQLExample/.src/FConnect.form | 73 + .../Database/MySQLExample/.src/FMessage.class | 21 + .../Database/MySQLExample/.src/FMessage.form | 12 + .../Database/MySQLExample/.src/FTables.class | 1186 + .../Database/MySQLExample/.src/FTables.form | 206 + .../Database/MySQLExample/.src/modMain.module | 69 + .../Database/MySQLExample/icons/16/Admin.png | Bin 0 -> 1099 bytes .../Database/MySQLExample/icons/16/Blob.png | Bin 0 -> 646 bytes .../MySQLExample/icons/16/Column_FK.png | Bin 0 -> 529 bytes .../MySQLExample/icons/16/Database.png | Bin 0 -> 805 bytes .../MySQLExample/icons/16/Datetime.png | Bin 0 -> 1140 bytes .../Database/MySQLExample/icons/16/Field.png | Bin 0 -> 653 bytes .../MySQLExample/icons/16/Function.png | Bin 0 -> 245 bytes .../Database/MySQLExample/icons/16/Index.png | Bin 0 -> 1122 bytes .../Database/MySQLExample/icons/16/Lock.png | Bin 0 -> 1195 bytes .../Database/MySQLExample/icons/16/New.png | Bin 0 -> 817 bytes .../MySQLExample/icons/16/Numeric.png | Bin 0 -> 1021 bytes .../MySQLExample/icons/16/Primarykey.png | Bin 0 -> 585 bytes .../MySQLExample/icons/16/Refresh.png | Bin 0 -> 349 bytes .../MySQLExample/icons/16/Routine.png | Bin 0 -> 827 bytes .../Database/MySQLExample/icons/16/String.png | Bin 0 -> 1024 bytes .../Database/MySQLExample/icons/16/Table.png | Bin 0 -> 823 bytes .../MySQLExample/icons/16/Trigger.png | Bin 0 -> 930 bytes .../Database/MySQLExample/icons/16/View.png | Bin 0 -> 697 bytes .../MySQLExample/icons/16/Warning.png | Bin 0 -> 543 bytes .../Database/MySQLExample/icons/24/Null.png | Bin 0 -> 121 bytes .../Database/PictureDatabase/.directory | 2 + .../Database/PictureDatabase/.icon.png | Bin 0 -> 4228 bytes .../Database/PictureDatabase/.lang/ca.po | 84 + .../Database/PictureDatabase/.lang/cs.po | 75 + .../Database/PictureDatabase/.lang/de.po | 76 + .../Database/PictureDatabase/.lang/es.po | 36 + .../Database/PictureDatabase/.lang/nl.po | 67 + .../Database/PictureDatabase/.lang/ru.po | 194 + .../Database/PictureDatabase/.project | 25 + .../.src/FormPictureDatabase.class | 227 + .../.src/FormPictureDatabase.form | 67 + .../.src/ModuleDatabase.module | 215 + .../Images/document-save-as.png | Bin 0 -> 845 bytes .../PictureDatabase/Images/document-save.png | Bin 0 -> 903 bytes .../Images/image-x-generic.png | Bin 0 -> 1150 bytes .../PictureDatabase/Images/list-add.png | Bin 0 -> 366 bytes .../PictureDatabase/Images/list-remove.png | Bin 0 -> 282 bytes app/examples/Drawing/AnalogWatch/.directory | 2 + .../.hidden/screenshots/2014-12-14.png | Bin 0 -> 24631 bytes app/examples/Drawing/AnalogWatch/.icon.png | Bin 0 -> 3642 bytes app/examples/Drawing/AnalogWatch/.lang/ru.po | 72 + app/examples/Drawing/AnalogWatch/.project | 18 + .../Drawing/AnalogWatch/.src/FrmClock.class | 152 + .../Drawing/AnalogWatch/.src/FrmClock.form | 30 + app/examples/Drawing/AnalogWatch/timer.png | Bin 0 -> 2778 bytes app/examples/Drawing/Barcode/.directory | 2 + app/examples/Drawing/Barcode/.icon.png | Bin 0 -> 3990 bytes app/examples/Drawing/Barcode/.lang/ca.po | 77 + app/examples/Drawing/Barcode/.lang/cs.po | 76 + app/examples/Drawing/Barcode/.lang/de.po | 76 + app/examples/Drawing/Barcode/.lang/ru.po | 90 + app/examples/Drawing/Barcode/.project | 21 + app/examples/Drawing/Barcode/.src/FMain.class | 161 + app/examples/Drawing/Barcode/.src/FMain.form | 88 + .../Drawing/Barcode/.src/modCrBcode.module | 98 + app/examples/Drawing/Barcode/barcode.png | Bin 0 -> 765 bytes app/examples/Drawing/Chart/.directory | 2 + app/examples/Drawing/Chart/.icon.png | Bin 0 -> 4083 bytes app/examples/Drawing/Chart/.lang/ca.po | 85 + app/examples/Drawing/Chart/.lang/cs.po | 84 + app/examples/Drawing/Chart/.lang/de.po | 81 + app/examples/Drawing/Chart/.lang/es.po | 78 + app/examples/Drawing/Chart/.lang/ru.po | 114 + app/examples/Drawing/Chart/.project | 17 + .../Drawing/Chart/.src/FormChart.class | 112 + .../Drawing/Chart/.src/FormChart.form | 32 + .../Drawing/Chart/.src/FormData.class | 43 + app/examples/Drawing/Chart/.src/FormData.form | 89 + app/examples/Drawing/Chart/graph.png | Bin 0 -> 225 bytes app/examples/Drawing/Clock/.directory | 2 + app/examples/Drawing/Clock/.icon.png | Bin 0 -> 4367 bytes app/examples/Drawing/Clock/.icon/16.png | Bin 0 -> 949 bytes app/examples/Drawing/Clock/.icon/32.png | Bin 0 -> 2599 bytes app/examples/Drawing/Clock/.icon/48.png | Bin 0 -> 4946 bytes app/examples/Drawing/Clock/.lang/ca.po | 63 + app/examples/Drawing/Clock/.lang/cs.po | 56 + app/examples/Drawing/Clock/.lang/de.po | 57 + app/examples/Drawing/Clock/.lang/es.po | 53 + app/examples/Drawing/Clock/.lang/ru.po | 84 + app/examples/Drawing/Clock/.project | 21 + app/examples/Drawing/Clock/.src/FClock.class | 170 + app/examples/Drawing/Clock/.src/FClock.form | 55 + app/examples/Drawing/Clock/img/arrow_hour.png | Bin 0 -> 396 bytes app/examples/Drawing/Clock/img/arrow_min.png | Bin 0 -> 420 bytes app/examples/Drawing/Clock/img/arrow_sec.png | Bin 0 -> 1253 bytes .../Drawing/Clock/img/clock_bg_big1.png | Bin 0 -> 19642 bytes .../Drawing/Clock/img/clock_bg_big2.png | Bin 0 -> 24928 bytes .../Drawing/Clock/img/clock_bg_big3.png | Bin 0 -> 50841 bytes .../Drawing/Clock/img/clock_bg_big4.png | Bin 0 -> 21425 bytes app/examples/Drawing/Fractal/.directory | 2 + .../.hidden/screenshots/2014-12-14.png | Bin 0 -> 152730 bytes app/examples/Drawing/Fractal/.icon.png | Bin 0 -> 3483 bytes app/examples/Drawing/Fractal/.lang/cs.po | 60 + app/examples/Drawing/Fractal/.lang/fr.po | 61 + app/examples/Drawing/Fractal/.lang/ru.po | 80 + app/examples/Drawing/Fractal/.project | 18 + .../Drawing/Fractal/.src/FFractal.class | 245 + .../Drawing/Fractal/.src/FFractal.form | 18 + .../Drawing/Fractal/.src/FractalTask.class | 324 + app/examples/Drawing/Fractal/icon.png | Bin 0 -> 4737 bytes app/examples/Drawing/Fractal/rose.jpg | Bin 0 -> 26938 bytes app/examples/Drawing/GSLSpline/.directory | 2 + app/examples/Drawing/GSLSpline/.icon.png | Bin 0 -> 4045 bytes app/examples/Drawing/GSLSpline/.lang/ru.po | 54 + app/examples/Drawing/GSLSpline/.project | 15 + .../Drawing/GSLSpline/.src/FMain.class | 130 + .../Drawing/GSLSpline/.src/FMain.form | 45 + app/examples/Drawing/GSLSpline/spline.png | Bin 0 -> 1632 bytes app/examples/Drawing/Gravity/.directory | 2 + app/examples/Drawing/Gravity/.icon.png | Bin 0 -> 4437 bytes app/examples/Drawing/Gravity/.lang/ca.po | 135 + app/examples/Drawing/Gravity/.lang/cs.po | 128 + app/examples/Drawing/Gravity/.lang/de.po | 129 + app/examples/Drawing/Gravity/.lang/es.po | 126 + app/examples/Drawing/Gravity/.lang/ru.po | 162 + app/examples/Drawing/Gravity/.project | 18 + .../Drawing/Gravity/.src/FAbout.class | 8 + app/examples/Drawing/Gravity/.src/FAbout.form | 42 + app/examples/Drawing/Gravity/.src/FMain.class | 232 + app/examples/Drawing/Gravity/.src/FMain.form | 143 + app/examples/Drawing/Gravity/.src/cBall.class | 9 + app/examples/Drawing/Gravity/gravity.png | Bin 0 -> 7084 bytes .../Drawing/OnScreenDisplay/.directory | 2 + .../Drawing/OnScreenDisplay/.icon.png | Bin 0 -> 4186 bytes .../Drawing/OnScreenDisplay/.lang/ca.po | 27 + .../Drawing/OnScreenDisplay/.lang/cs.po | 20 + .../Drawing/OnScreenDisplay/.lang/de.po | 21 + .../Drawing/OnScreenDisplay/.lang/es.po | 15 + .../Drawing/OnScreenDisplay/.lang/ru.po | 34 + app/examples/Drawing/OnScreenDisplay/.project | 17 + .../.src/FOnScreenDisplay.class | 67 + .../.src/FOnScreenDisplay.form | 12 + app/examples/Drawing/OnScreenDisplay/icon.png | Bin 0 -> 1300 bytes app/examples/Drawing/Painting/.directory | 2 + .../.hidden/screenshots/2014-12-14.png | Bin 0 -> 90069 bytes app/examples/Drawing/Painting/.icon.png | Bin 0 -> 3331 bytes app/examples/Drawing/Painting/.lang/ca.po | 126 + app/examples/Drawing/Painting/.lang/cs.po | 128 + app/examples/Drawing/Painting/.lang/de.po | 129 + app/examples/Drawing/Painting/.lang/ru.po | 148 + app/examples/Drawing/Painting/.project | 16 + .../Drawing/Painting/.src/FMain.class | 548 + app/examples/Drawing/Painting/.src/FMain.form | 195 + .../Painting/.src/MMakeSourceFile.module | 32 + app/examples/Drawing/Painting/Example1 | 29 + app/examples/Drawing/Painting/Example10 | 11 + app/examples/Drawing/Painting/Example11 | 26 + app/examples/Drawing/Painting/Example12 | 18 + app/examples/Drawing/Painting/Example13 | 16 + app/examples/Drawing/Painting/Example14 | 28 + app/examples/Drawing/Painting/Example15 | 22 + app/examples/Drawing/Painting/Example16 | 25 + app/examples/Drawing/Painting/Example17 | 29 + app/examples/Drawing/Painting/Example18 | 16 + app/examples/Drawing/Painting/Example2 | 29 + app/examples/Drawing/Painting/Example20 | 17 + app/examples/Drawing/Painting/Example21 | 14 + app/examples/Drawing/Painting/Example22 | 10 + app/examples/Drawing/Painting/Example3 | 15 + app/examples/Drawing/Painting/Example4 | 13 + app/examples/Drawing/Painting/Example5 | 61 + app/examples/Drawing/Painting/Example6 | 27 + app/examples/Drawing/Painting/Example7 | 17 + app/examples/Drawing/Painting/Example8 | 22 + app/examples/Drawing/Painting/Example9 | 23 + app/examples/Drawing/Painting/clovis.jpg | Bin 0 -> 15838 bytes app/examples/Drawing/Painting/gambas.svg | 540 + app/examples/Drawing/Painting/icon.png | Bin 0 -> 2078 bytes app/examples/Drawing/Painting/image.jpg | Bin 0 -> 19496 bytes app/examples/Drawing/QuasiRegular/.directory | 2 + .../.hidden/screenshots/2014-12-14.png | Bin 0 -> 44667 bytes app/examples/Drawing/QuasiRegular/.icon.png | Bin 0 -> 3730 bytes app/examples/Drawing/QuasiRegular/.project | 14 + .../Drawing/QuasiRegular/.src/FMain.class | 87 + .../Drawing/QuasiRegular/.src/FMain.form | 10 + app/examples/Drawing/QuasiRegular/icon.png | Bin 0 -> 705 bytes .../Drawing/RandomColorSort/.directory | 2 + .../.hidden/screenshots/2014-12-14.png | Bin 0 -> 247987 bytes .../Drawing/RandomColorSort/.icon.png | Bin 0 -> 3663 bytes .../Drawing/RandomColorSort/.lang/ru.po | 96 + app/examples/Drawing/RandomColorSort/.project | 16 + .../Drawing/RandomColorSort/.src/FMain.class | 265 + .../Drawing/RandomColorSort/.src/FMain.form | 59 + .../RandomColorSort/RandomColorSort.png | Bin 0 -> 10533 bytes app/examples/Drawing/Tablet/.directory | 2 + .../Tablet/.hidden/screenshots/2014-12-14.png | Bin 0 -> 59466 bytes app/examples/Drawing/Tablet/.icon.png | Bin 0 -> 3536 bytes app/examples/Drawing/Tablet/.lang/ru.po | 112 + app/examples/Drawing/Tablet/.project | 16 + app/examples/Drawing/Tablet/.src/FMain.class | 178 + app/examples/Drawing/Tablet/.src/FMain.form | 174 + app/examples/Drawing/Tablet/Icon.png | Bin 0 -> 3753 bytes app/examples/Games/BeastScroll/.dir_icon.png | Bin 0 -> 1571 bytes app/examples/Games/BeastScroll/.directory | 2 + app/examples/Games/BeastScroll/.icon.png | Bin 0 -> 3371 bytes app/examples/Games/BeastScroll/.lang/ru.po | 56 + app/examples/Games/BeastScroll/.project | 18 + .../Games/BeastScroll/.src/MMain.module | 215 + app/examples/Games/BeastScroll/b-title.mod | Bin 0 -> 56838 bytes app/examples/Games/BeastScroll/bgd1_ciel.png | Bin 0 -> 6797 bytes .../Games/BeastScroll/bgd2_montagnes.png | Bin 0 -> 177395 bytes app/examples/Games/BeastScroll/bgd3_sol1.png | Bin 0 -> 9994 bytes app/examples/Games/BeastScroll/bgd4_sol2.png | Bin 0 -> 9668 bytes app/examples/Games/BeastScroll/bgd5_sol3.png | Bin 0 -> 4772 bytes app/examples/Games/BeastScroll/fireworks.png | Bin 0 -> 46710 bytes app/examples/Games/BeastScroll/logo.png | Bin 0 -> 4768 bytes app/examples/Games/BeastScroll/scrolltext.png | Bin 0 -> 18100 bytes .../Games/BeastScroll/sprite_arbre.png | Bin 0 -> 73213 bytes .../Games/BeastScroll/sprite_barriere.png | Bin 0 -> 6455 bytes .../Games/BeastScroll/sprite_nuages1.png | Bin 0 -> 14285 bytes .../Games/BeastScroll/sprite_nuages2.png | Bin 0 -> 5079 bytes .../Games/BeastScroll/sprite_nuages3.png | Bin 0 -> 2389 bytes .../Games/BeastScroll/sprite_nuages4.png | Bin 0 -> 1036 bytes app/examples/Games/Concent/.directory | 2 + app/examples/Games/Concent/.icon.png | Bin 0 -> 4417 bytes app/examples/Games/Concent/.icon/16.png | Bin 0 -> 949 bytes app/examples/Games/Concent/.icon/32.png | Bin 0 -> 2599 bytes app/examples/Games/Concent/.icon/48.png | Bin 0 -> 4946 bytes app/examples/Games/Concent/.lang/ca.po | 217 + app/examples/Games/Concent/.lang/cs.po | 224 + app/examples/Games/Concent/.lang/de.po | 168 + app/examples/Games/Concent/.lang/en.po | 226 + app/examples/Games/Concent/.lang/es.po | 120 + app/examples/Games/Concent/.lang/fr.po | 164 + app/examples/Games/Concent/.lang/ru.po | 222 + app/examples/Games/Concent/.project | 22 + app/examples/Games/Concent/.src/fotos.class | 7 + app/examples/Games/Concent/.src/fotos.form | 210 + .../Games/Concent/.src/frmAcerca.class | 12 + .../Games/Concent/.src/frmAcerca.form | 20 + .../Games/Concent/.src/frmInstrucciones.class | 11 + .../Games/Concent/.src/frmInstrucciones.form | 22 + .../Games/Concent/.src/funciones.module | 162 + .../Games/Concent/.src/principal.class | 390 + .../Games/Concent/.src/principal.form | 220 + app/examples/Games/Concent/Blockhit.wav | Bin 0 -> 1148 bytes app/examples/Games/Concent/CHANGELOG | 6 + app/examples/Games/Concent/Missed.wav | Bin 0 -> 15612 bytes app/examples/Games/Concent/Newlevel.wav | Bin 0 -> 19842 bytes app/examples/Games/Concent/Paddle.wav | Bin 0 -> 1754 bytes app/examples/Games/Concent/Setup.wav | Bin 0 -> 768 bytes app/examples/Games/Concent/Wallhit.wav | Bin 0 -> 768 bytes app/examples/Games/Concent/applause.wav | Bin 0 -> 33654 bytes app/examples/Games/Concent/imagenes/an1.gif | Bin 0 -> 1601 bytes app/examples/Games/Concent/imagenes/an10.gif | Bin 0 -> 2209 bytes app/examples/Games/Concent/imagenes/an11.gif | Bin 0 -> 1365 bytes app/examples/Games/Concent/imagenes/an12.gif | Bin 0 -> 1332 bytes app/examples/Games/Concent/imagenes/an13.gif | Bin 0 -> 2223 bytes app/examples/Games/Concent/imagenes/an14.gif | Bin 0 -> 1924 bytes app/examples/Games/Concent/imagenes/an15.gif | Bin 0 -> 1132 bytes app/examples/Games/Concent/imagenes/an16.gif | Bin 0 -> 1318 bytes app/examples/Games/Concent/imagenes/an17.gif | Bin 0 -> 1845 bytes app/examples/Games/Concent/imagenes/an18.gif | Bin 0 -> 1571 bytes app/examples/Games/Concent/imagenes/an19.gif | Bin 0 -> 1849 bytes app/examples/Games/Concent/imagenes/an2.gif | Bin 0 -> 1373 bytes app/examples/Games/Concent/imagenes/an20.gif | Bin 0 -> 1540 bytes app/examples/Games/Concent/imagenes/an21.gif | Bin 0 -> 1720 bytes app/examples/Games/Concent/imagenes/an22.gif | Bin 0 -> 1332 bytes app/examples/Games/Concent/imagenes/an23.gif | Bin 0 -> 961 bytes app/examples/Games/Concent/imagenes/an24.gif | Bin 0 -> 1627 bytes app/examples/Games/Concent/imagenes/an25.gif | Bin 0 -> 1694 bytes app/examples/Games/Concent/imagenes/an26.gif | Bin 0 -> 1931 bytes app/examples/Games/Concent/imagenes/an27.gif | Bin 0 -> 2124 bytes app/examples/Games/Concent/imagenes/an28.gif | Bin 0 -> 1944 bytes app/examples/Games/Concent/imagenes/an29.gif | Bin 0 -> 1414 bytes app/examples/Games/Concent/imagenes/an3.gif | Bin 0 -> 1279 bytes app/examples/Games/Concent/imagenes/an30.gif | Bin 0 -> 1891 bytes app/examples/Games/Concent/imagenes/an31.gif | Bin 0 -> 1910 bytes app/examples/Games/Concent/imagenes/an32.gif | Bin 0 -> 1455 bytes app/examples/Games/Concent/imagenes/an33.gif | Bin 0 -> 1444 bytes app/examples/Games/Concent/imagenes/an34.gif | Bin 0 -> 1772 bytes app/examples/Games/Concent/imagenes/an35.gif | Bin 0 -> 1737 bytes app/examples/Games/Concent/imagenes/an36.gif | Bin 0 -> 1686 bytes app/examples/Games/Concent/imagenes/an37.gif | Bin 0 -> 2003 bytes app/examples/Games/Concent/imagenes/an38.gif | Bin 0 -> 1782 bytes app/examples/Games/Concent/imagenes/an39.gif | Bin 0 -> 2443 bytes app/examples/Games/Concent/imagenes/an4.gif | Bin 0 -> 1227 bytes app/examples/Games/Concent/imagenes/an40.gif | Bin 0 -> 2582 bytes app/examples/Games/Concent/imagenes/an5.gif | Bin 0 -> 1628 bytes app/examples/Games/Concent/imagenes/an6.gif | Bin 0 -> 2511 bytes app/examples/Games/Concent/imagenes/an7.gif | Bin 0 -> 1811 bytes app/examples/Games/Concent/imagenes/an8.gif | Bin 0 -> 1756 bytes app/examples/Games/Concent/imagenes/an9.gif | Bin 0 -> 2486 bytes .../Games/Concent/imagenes/colombia.gif | Bin 0 -> 145 bytes app/examples/Games/Concent/imagenes/inter.gif | Bin 0 -> 131 bytes app/examples/Games/Concent/imagenes/inter.jpg | Bin 0 -> 1148 bytes app/examples/Games/Concent/imagenes/logo.gif | Bin 0 -> 6138 bytes app/examples/Games/Concent/imagenes/logo.png | Bin 0 -> 1591 bytes app/examples/Games/Concent/imagenes/ok.gif | Bin 0 -> 1355 bytes .../Games/Concent/imagenes/tierra.gif | Bin 0 -> 32485 bytes .../Games/Concent/imagenes/tierra3.jpg | Bin 0 -> 23070 bytes app/examples/Games/Concent/move.wav | Bin 0 -> 13318 bytes app/examples/Games/Concent/shuffle.wav | Bin 0 -> 6999 bytes app/examples/Games/DeepSpace/.directory | 2 + app/examples/Games/DeepSpace/.icon.png | Bin 0 -> 4334 bytes app/examples/Games/DeepSpace/.lang/ca.po | 51 + app/examples/Games/DeepSpace/.lang/cs.po | 44 + app/examples/Games/DeepSpace/.lang/de.po | 44 + app/examples/Games/DeepSpace/.lang/es.po | 44 + app/examples/Games/DeepSpace/.lang/ru.po | 78 + app/examples/Games/DeepSpace/.project | 17 + .../Games/DeepSpace/.src/CBullet.class | 11 + .../Games/DeepSpace/.src/CObject.class | 87 + .../Games/DeepSpace/.src/FAbout.class | 19 + app/examples/Games/DeepSpace/.src/FAbout.form | 19 + app/examples/Games/DeepSpace/.src/FMain.class | 81 + app/examples/Games/DeepSpace/.src/FMain.form | 35 + .../Games/DeepSpace/.src/MMain.module | 348 + .../Games/DeepSpace/.src/MMath.module | 64 + .../Games/DeepSpace/doc/.html_files/eg3.gif | Bin 0 -> 2782 bytes .../Games/DeepSpace/doc/.html_files/eg3b.gif | Bin 0 -> 4590 bytes .../Games/DeepSpace/doc/coordinates.html | 150 + app/examples/Games/DeepSpace/doc/howto.txt | 16 + app/examples/Games/DeepSpace/doc/todo.txt | 17 + .../Games/DeepSpace/images/deepspace.png | Bin 0 -> 14195 bytes .../Games/DeepSpace/object.data/kite.2do | 8 + .../Games/DeepSpace/object.data/main.lst | 12 + .../Games/DeepSpace/object.data/ship.2do | 13 + .../Games/DeepSpace/object.data/triangle.2do | 8 + .../Games/DeepSpace/object.data/x-wing.2do | 38 + app/examples/Games/GNUBoxWorld/.directory | 2 + .../.hidden/screenshots/2014-12-14.png | Bin 0 -> 185109 bytes app/examples/Games/GNUBoxWorld/.icon.png | Bin 0 -> 3722 bytes app/examples/Games/GNUBoxWorld/.lang/ca.po | 112 + app/examples/Games/GNUBoxWorld/.lang/cs.po | 116 + app/examples/Games/GNUBoxWorld/.lang/de.po | 105 + app/examples/Games/GNUBoxWorld/.lang/es_AR.po | 101 + app/examples/Games/GNUBoxWorld/.lang/ru.po | 160 + app/examples/Games/GNUBoxWorld/.project | 19 + .../Games/GNUBoxWorld/.src/Cell.class | 78 + .../Games/GNUBoxWorld/.src/FMain.class | 274 + .../Games/GNUBoxWorld/.src/FMain.form | 37 + .../Games/GNUBoxWorld/.src/FrmAbout.class | 19 + .../Games/GNUBoxWorld/.src/FrmAbout.form | 45 + .../Games/GNUBoxWorld/.src/GameBoard.class | 595 + app/examples/Games/GNUBoxWorld/License | 189 + app/examples/Games/GNUBoxWorld/abajo.png | Bin 0 -> 5205 bytes app/examples/Games/GNUBoxWorld/arriba.png | Bin 0 -> 5291 bytes app/examples/Games/GNUBoxWorld/derecha.png | Bin 0 -> 4347 bytes app/examples/Games/GNUBoxWorld/destino.png | Bin 0 -> 9527 bytes app/examples/Games/GNUBoxWorld/ganador.png | Bin 0 -> 255686 bytes app/examples/Games/GNUBoxWorld/icon.png | Bin 0 -> 5889 bytes app/examples/Games/GNUBoxWorld/izquierda.png | Bin 0 -> 4350 bytes app/examples/Games/GNUBoxWorld/logo.png | Bin 0 -> 108170 bytes app/examples/Games/GNUBoxWorld/movible.png | Bin 0 -> 3831 bytes .../Games/GNUBoxWorld/movibleendestino.png | Bin 0 -> 3656 bytes .../Games/GNUBoxWorld/obstaculo-l.png | Bin 0 -> 1633 bytes .../Games/GNUBoxWorld/obstaculo-lr.png | Bin 0 -> 1643 bytes .../Games/GNUBoxWorld/obstaculo-r.png | Bin 0 -> 1627 bytes app/examples/Games/GNUBoxWorld/obstaculo.png | Bin 0 -> 1575 bytes app/examples/Games/GNUBoxWorld/piso.png | Bin 0 -> 10046 bytes app/examples/Games/GameOfLife/.debug | 9 + app/examples/Games/GameOfLife/.directory | 2 + app/examples/Games/GameOfLife/.icon.png | Bin 0 -> 3502 bytes app/examples/Games/GameOfLife/.lang/ca.po | 131 + app/examples/Games/GameOfLife/.lang/cs.po | 130 + app/examples/Games/GameOfLife/.lang/de.po | 121 + app/examples/Games/GameOfLife/.lang/ru.po | 158 + app/examples/Games/GameOfLife/.project | 17 + .../Games/GameOfLife/.src/CGameField.class | 236 + .../Games/GameOfLife/.src/FMain.class | 95 + app/examples/Games/GameOfLife/.src/FMain.form | 162 + .../Games/GameOfLife/glob2-icon-48x48.png | Bin 0 -> 3390 bytes app/examples/Games/Invaders/.directory | 2 + app/examples/Games/Invaders/.icon.png | Bin 0 -> 3092 bytes app/examples/Games/Invaders/.project | 13 + .../Games/Invaders/.src/Enemies.class | 102 + app/examples/Games/Invaders/.src/Enemy.class | 161 + app/examples/Games/Invaders/.src/MMain.module | 139 + .../Games/Invaders/.src/Missile.class | 84 + .../Games/Invaders/.src/Missiles.class | 65 + app/examples/Games/Invaders/invaders.png | Bin 0 -> 125 bytes app/examples/Games/MineSweeper/.directory | 2 + .../.hidden/screenshots/2014-12-14.png | Bin 0 -> 48121 bytes app/examples/Games/MineSweeper/.icon.png | Bin 0 -> 3434 bytes app/examples/Games/MineSweeper/.lang/cs.po | 52 + app/examples/Games/MineSweeper/.lang/ja.po | 53 + app/examples/Games/MineSweeper/.lang/ru.po | 80 + app/examples/Games/MineSweeper/.lang/zh.po | 52 + app/examples/Games/MineSweeper/.lang/zh_TW.po | 52 + app/examples/Games/MineSweeper/.project | 19 + .../Games/MineSweeper/.src/FMain.class | 249 + .../Games/MineSweeper/.src/FMain.form | 77 + .../Games/MineSweeper/.src/FSettings.class | 66 + .../Games/MineSweeper/.src/FSettings.form | 71 + .../MineSweeper/.src/MineSweeperGame.class | 194 + .../Games/MineSweeper/image/bigflag.png | Bin 0 -> 6066 bytes .../Games/MineSweeper/image/cover.png | Bin 0 -> 331 bytes .../Games/MineSweeper/image/coveron.png | Bin 0 -> 238 bytes .../Games/MineSweeper/image/empty.png | Bin 0 -> 97 bytes .../Games/MineSweeper/image/expr_lose.png | Bin 0 -> 1941 bytes .../Games/MineSweeper/image/expr_normal.png | Bin 0 -> 1869 bytes .../Games/MineSweeper/image/expr_o.png | Bin 0 -> 1462 bytes .../Games/MineSweeper/image/expr_win.png | Bin 0 -> 2259 bytes .../Games/MineSweeper/image/false.png | Bin 0 -> 1021 bytes app/examples/Games/MineSweeper/image/flag.png | Bin 0 -> 765 bytes app/examples/Games/MineSweeper/image/mine.png | Bin 0 -> 755 bytes .../Games/MineSweeper/image/number_1.png | Bin 0 -> 388 bytes .../Games/MineSweeper/image/number_2.png | Bin 0 -> 407 bytes .../Games/MineSweeper/image/number_3.png | Bin 0 -> 428 bytes .../Games/MineSweeper/image/number_4.png | Bin 0 -> 387 bytes .../Games/MineSweeper/image/number_5.png | Bin 0 -> 381 bytes .../Games/MineSweeper/image/number_6.png | Bin 0 -> 462 bytes .../Games/MineSweeper/image/number_7.png | Bin 0 -> 367 bytes .../Games/MineSweeper/image/number_8.png | Bin 0 -> 454 bytes app/examples/Games/Pong/.directory | 2 + app/examples/Games/Pong/.icon.png | Bin 0 -> 4849 bytes app/examples/Games/Pong/.project | 11 + app/examples/Games/Pong/.src/Ball.class | 145 + app/examples/Games/Pong/.src/MMain.module | 191 + app/examples/Games/Pong/.src/NPC.class | 116 + app/examples/Games/Pong/.src/Paddle.class | 96 + app/examples/Games/Pong/SPEED | 47 + app/examples/Games/Pong/pong.png | Bin 0 -> 89 bytes app/examples/Games/Puzzle1To8/.directory | 2 + app/examples/Games/Puzzle1To8/.icon.png | Bin 0 -> 4303 bytes app/examples/Games/Puzzle1To8/.lang/ca.po | 98 + app/examples/Games/Puzzle1To8/.lang/cs.po | 92 + app/examples/Games/Puzzle1To8/.lang/de.po | 112 + app/examples/Games/Puzzle1To8/.lang/es_AR.po | 94 + app/examples/Games/Puzzle1To8/.lang/fr.po | 111 + app/examples/Games/Puzzle1To8/.lang/ru.po | 126 + app/examples/Games/Puzzle1To8/.project | 17 + .../Games/Puzzle1To8/.src/Casillero.class | 66 + .../Games/Puzzle1To8/.src/Esquema.class | 110 + .../Games/Puzzle1To8/.src/FMain.class | 111 + app/examples/Games/Puzzle1To8/.src/FMain.form | 95 + .../Games/Puzzle1To8/.src/FrmAbout.class | 18 + .../Games/Puzzle1To8/.src/FrmAbout.form | 39 + .../Games/Puzzle1To8/.src/FrmAyuda.class | 18 + .../Games/Puzzle1To8/.src/FrmAyuda.form | 37 + app/examples/Games/Puzzle1To8/Licence | 189 + app/examples/Games/Puzzle1To8/ejemplo1.png | Bin 0 -> 5594 bytes app/examples/Games/Puzzle1To8/ejemplo2.png | Bin 0 -> 5481 bytes app/examples/Games/Puzzle1To8/logo.png | Bin 0 -> 41279 bytes .../Games/RobotFindsKitten/.directory | 2 + app/examples/Games/RobotFindsKitten/.icon.png | Bin 0 -> 4141 bytes .../Games/RobotFindsKitten/.lang/ca.po | 40 + .../Games/RobotFindsKitten/.lang/cs.po | 32 + .../Games/RobotFindsKitten/.lang/de.po | 32 + .../Games/RobotFindsKitten/.lang/es.po | 28 + .../Games/RobotFindsKitten/.lang/ru.po | 50 + app/examples/Games/RobotFindsKitten/.project | 18 + .../Games/RobotFindsKitten/.src/Frfk.class | 193 + .../Games/RobotFindsKitten/.src/Frfk.form | 32 + app/examples/Games/RobotFindsKitten/COPYING | 340 + app/examples/Games/RobotFindsKitten/heart.png | Bin 0 -> 9149 bytes app/examples/Games/RobotFindsKitten/nkis.txt | 622 + .../Games/RobotFindsKitten/nkis_ru.txt | 622 + .../Games/RobotFindsKitten/readme.txt | 24 + app/examples/Games/Snake/.directory | 2 + app/examples/Games/Snake/.icon.png | Bin 0 -> 3584 bytes app/examples/Games/Snake/.lang/ca.po | 102 + app/examples/Games/Snake/.lang/cs.po | 114 + app/examples/Games/Snake/.lang/de.po | 101 + app/examples/Games/Snake/.lang/ru.po | 162 + app/examples/Games/Snake/.project | 18 + app/examples/Games/Snake/.src/FrmMain.class | 430 + app/examples/Games/Snake/.src/FrmMain.form | 89 + app/examples/Games/Snake/apple.png | Bin 0 -> 1141 bytes app/examples/Games/Snake/body.png | Bin 0 -> 1138 bytes app/examples/Games/Snake/dead.wav | Bin 0 -> 10026 bytes app/examples/Games/Snake/eat.wav | Bin 0 -> 1192 bytes app/examples/Games/Snake/head.png | Bin 0 -> 1197 bytes app/examples/Games/Snake/start.wav | Bin 0 -> 31810 bytes app/examples/Games/Solitaire/.directory | 2 + app/examples/Games/Solitaire/.icon.png | Bin 0 -> 4209 bytes app/examples/Games/Solitaire/.lang/ca.po | 96 + app/examples/Games/Solitaire/.lang/cs.po | 94 + app/examples/Games/Solitaire/.lang/de.po | 89 + app/examples/Games/Solitaire/.lang/es.po | 79 + app/examples/Games/Solitaire/.lang/ru.po | 116 + app/examples/Games/Solitaire/.project | 18 + .../Games/Solitaire/.src/CBoardDesign.class | 9 + app/examples/Games/Solitaire/.src/CMove.class | 5 + .../Games/Solitaire/.src/FBoardSelect.class | 35 + .../Games/Solitaire/.src/FBoardSelect.form | 23 + .../Games/Solitaire/.src/FGameArea.class | 368 + .../Games/Solitaire/.src/FGameArea.form | 64 + .../Games/Solitaire/.src/Global.class | 11 + .../Games/Solitaire/.src/MBoards.module | 69 + app/examples/Games/Solitaire/ball.png | Bin 0 -> 3327 bytes app/examples/Games/Solitaire/new.png | Bin 0 -> 155 bytes app/examples/Games/Solitaire/quit.png | Bin 0 -> 179 bytes app/examples/Games/Solitaire/redo.png | Bin 0 -> 131 bytes app/examples/Games/Solitaire/undo.png | Bin 0 -> 131 bytes app/examples/Games/StarField/.directory | 2 + app/examples/Games/StarField/.icon.png | Bin 0 -> 3140 bytes app/examples/Games/StarField/.project | 13 + .../Games/StarField/.src/MMain.module | 82 + app/examples/Games/StarField/enterprise.png | Bin 0 -> 4623 bytes app/examples/Games/StarField/logo.png | Bin 0 -> 12795 bytes app/examples/Image/ImageViewer/.directory | 2 + app/examples/Image/ImageViewer/.icon.png | Bin 0 -> 4419 bytes app/examples/Image/ImageViewer/.lang/ca.po | 64 + app/examples/Image/ImageViewer/.lang/cs.po | 60 + app/examples/Image/ImageViewer/.lang/de.po | 57 + app/examples/Image/ImageViewer/.lang/es.po | 43 + app/examples/Image/ImageViewer/.lang/nl.po | 55 + app/examples/Image/ImageViewer/.lang/ru.po | 82 + app/examples/Image/ImageViewer/.project | 21 + .../Image/ImageViewer/.src/FViewer.class | 106 + .../Image/ImageViewer/.src/FViewer.form | 52 + app/examples/Image/ImageViewer/image.png | Bin 0 -> 8428 bytes app/examples/Image/ImageViewer/test.png | Bin 0 -> 110 bytes app/examples/Image/Lighttable/.directory | 2 + app/examples/Image/Lighttable/.icon.png | Bin 0 -> 4434 bytes app/examples/Image/Lighttable/.lang/ca.po | 337 + app/examples/Image/Lighttable/.lang/cs.po | 330 + app/examples/Image/Lighttable/.lang/de.po | 330 + app/examples/Image/Lighttable/.lang/en.po | 264 + app/examples/Image/Lighttable/.lang/nl.po | 327 + app/examples/Image/Lighttable/.lang/ru.po | 350 + app/examples/Image/Lighttable/.project | 25 + .../Image/Lighttable/.src/FHelp.class | 28 + app/examples/Image/Lighttable/.src/FHelp.form | 26 + .../Image/Lighttable/.src/FInfo.class | 37 + app/examples/Image/Lighttable/.src/FInfo.form | 25 + .../Image/Lighttable/.src/FMain.class | 903 + app/examples/Image/Lighttable/.src/FMain.form | 162 + .../Image/Lighttable/.src/FRename.class | 58 + .../Image/Lighttable/.src/FRename.form | 25 + .../Image/Lighttable/.src/FRenameAll.class | 101 + .../Image/Lighttable/.src/FRenameAll.form | 77 + .../Lighttable/.src/FRenameAllWarning.class | 19 + .../Lighttable/.src/FRenameAllWarning.form | 29 + .../Image/Lighttable/.src/FSlideshow.class | 56 + .../Image/Lighttable/.src/FSlideshow.form | 46 + .../Image/Lighttable/.src/FStart.class | 135 + .../Image/Lighttable/.src/FStart.form | 42 + .../Image/Lighttable/.src/FTime.class | 27 + app/examples/Image/Lighttable/.src/FTime.form | 58 + .../Image/Lighttable/.src/MMain.module | 53 + app/examples/Image/Lighttable/CHANGELOG | 3 + app/examples/Image/Lighttable/FStart.class | 92 + app/examples/Image/Lighttable/FStart.form | 35 + app/examples/Image/Lighttable/Help_ca.html | 60 + app/examples/Image/Lighttable/Help_de.html | 74 + app/examples/Image/Lighttable/Help_en.html | 71 + app/examples/Image/Lighttable/Help_ru.html | 29 + app/examples/Image/Lighttable/LTicon.png | Bin 0 -> 296 bytes app/examples/Image/Lighttable/Liesmich.txt | 33 + app/examples/Image/Lighttable/Readme.txt | 33 + app/examples/Image/Lighttable/close.png | Bin 0 -> 596 bytes app/examples/Image/Lighttable/hand1.png | Bin 0 -> 176 bytes .../Image/Lighttable/help-contents.png | Bin 0 -> 742 bytes app/examples/Image/Lighttable/lighttable.png | Bin 0 -> 6536 bytes app/examples/Image/Lighttable/move.png | Bin 0 -> 169 bytes app/examples/Image/Lighttable/zoom-in.png | Bin 0 -> 710 bytes app/examples/Image/PhotoTouch/.directory | 2 + .../.hidden/screenshots/phototouch.jpg | Bin 0 -> 150309 bytes app/examples/Image/PhotoTouch/.icon.png | Bin 0 -> 3488 bytes app/examples/Image/PhotoTouch/.lang/fr.po | 184 + app/examples/Image/PhotoTouch/.lang/nl.po | 183 + app/examples/Image/PhotoTouch/.lang/ru.po | 212 + app/examples/Image/PhotoTouch/.project | 24 + .../Image/PhotoTouch/.src/CAnimation.class | 97 + .../Image/PhotoTouch/.src/CButton.class | 189 + .../Image/PhotoTouch/.src/FBrightness.class | 146 + .../Image/PhotoTouch/.src/FBrightness.form | 37 + .../Image/PhotoTouch/.src/FMain.class | 1117 + app/examples/Image/PhotoTouch/.src/FMain.form | 65 + .../Image/PhotoTouch/.src/FResize.class | 57 + .../Image/PhotoTouch/.src/FResize.form | 40 + .../Image/PhotoTouch/.src/FScissors.class | 260 + .../Image/PhotoTouch/.src/FScissors.form | 38 + app/examples/Image/PhotoTouch/balance.png | Bin 0 -> 1125 bytes app/examples/Image/PhotoTouch/blur.png | Bin 0 -> 1309 bytes app/examples/Image/PhotoTouch/brightness.png | Bin 0 -> 1534 bytes app/examples/Image/PhotoTouch/contrast.png | Bin 0 -> 1340 bytes app/examples/Image/PhotoTouch/delete.png | Bin 0 -> 853 bytes app/examples/Image/PhotoTouch/despeckle.png | Bin 0 -> 1530 bytes app/examples/Image/PhotoTouch/film.png | Bin 0 -> 756 bytes app/examples/Image/PhotoTouch/gamma.png | Bin 0 -> 693 bytes app/examples/Image/PhotoTouch/hflip.png | Bin 0 -> 953 bytes app/examples/Image/PhotoTouch/icon.png | Bin 0 -> 4904 bytes app/examples/Image/PhotoTouch/invert.png | Bin 0 -> 1942 bytes app/examples/Image/PhotoTouch/magic.png | Bin 0 -> 1093 bytes app/examples/Image/PhotoTouch/next.png | Bin 0 -> 749 bytes app/examples/Image/PhotoTouch/normalize.png | Bin 0 -> 910 bytes app/examples/Image/PhotoTouch/oil.png | Bin 0 -> 1189 bytes app/examples/Image/PhotoTouch/ok.png | Bin 0 -> 655 bytes app/examples/Image/PhotoTouch/photo.png | Bin 0 -> 1068 bytes app/examples/Image/PhotoTouch/previous.png | Bin 0 -> 724 bytes app/examples/Image/PhotoTouch/quit.png | Bin 0 -> 1034 bytes app/examples/Image/PhotoTouch/redo.png | Bin 0 -> 1042 bytes app/examples/Image/PhotoTouch/resize.png | Bin 0 -> 852 bytes app/examples/Image/PhotoTouch/rotate-left.png | Bin 0 -> 1204 bytes .../Image/PhotoTouch/rotate-right.png | Bin 0 -> 1192 bytes app/examples/Image/PhotoTouch/save-all.png | Bin 0 -> 998 bytes app/examples/Image/PhotoTouch/save.png | Bin 0 -> 674 bytes app/examples/Image/PhotoTouch/scissors.png | Bin 0 -> 1549 bytes app/examples/Image/PhotoTouch/sharpen.png | Bin 0 -> 1301 bytes app/examples/Image/PhotoTouch/undo.png | Bin 0 -> 1071 bytes app/examples/Image/PhotoTouch/usb.png | Bin 0 -> 739 bytes app/examples/Image/PhotoTouch/vflip.png | Bin 0 -> 1018 bytes app/examples/Image/PhotoTouch/zoom-fit.png | Bin 0 -> 1571 bytes app/examples/Image/PhotoTouch/zoom-in.png | Bin 0 -> 1634 bytes .../Image/PhotoTouch/zoom-original.png | Bin 0 -> 1615 bytes app/examples/Image/PhotoTouch/zoom-out.png | Bin 0 -> 1568 bytes app/examples/Misc/Console/.directory | 2 + app/examples/Misc/Console/.icon.png | Bin 0 -> 4129 bytes app/examples/Misc/Console/.lang/fr.po | 19 + app/examples/Misc/Console/.lang/ru.po | 46 + app/examples/Misc/Console/.project | 16 + app/examples/Misc/Console/.src/FConsole.class | 162 + app/examples/Misc/Console/.src/FConsole.form | 37 + app/examples/Misc/Console/terminal.png | Bin 0 -> 2312 bytes app/examples/Misc/DBusExplorer/.directory | 2 + .../.hidden/screenshots/2014-12-14.png | Bin 0 -> 131380 bytes app/examples/Misc/DBusExplorer/.icon.png | Bin 0 -> 3487 bytes app/examples/Misc/DBusExplorer/.lang/ru.po | 72 + app/examples/Misc/DBusExplorer/.project | 19 + .../DBusExplorer/.src/FVersiongbXML.class | 272 + .../Misc/DBusExplorer/.src/FVersiongbXML.form | 127 + app/examples/Misc/DBusExplorer/dbus22.png | Bin 0 -> 894 bytes app/examples/Misc/DBusExplorer/dbus64.png | Bin 0 -> 4222 bytes app/examples/Misc/DBusExplorer/method.png | Bin 0 -> 724 bytes app/examples/Misc/DBusExplorer/property.png | Bin 0 -> 728 bytes app/examples/Misc/DBusExplorer/signal.png | Bin 0 -> 780 bytes app/examples/Misc/Evaluator/.directory | 2 + app/examples/Misc/Evaluator/.icon.png | Bin 0 -> 4208 bytes app/examples/Misc/Evaluator/.lang/ca.po | 76 + app/examples/Misc/Evaluator/.lang/cs.po | 68 + app/examples/Misc/Evaluator/.lang/de.po | 69 + app/examples/Misc/Evaluator/.lang/es.po | 71 + app/examples/Misc/Evaluator/.lang/ru.po | 82 + app/examples/Misc/Evaluator/.project | 18 + app/examples/Misc/Evaluator/.src/FEval.class | 53 + app/examples/Misc/Evaluator/.src/FEval.form | 83 + app/examples/Misc/Evaluator/calculator.png | Bin 0 -> 3612 bytes app/examples/Misc/Explorer/.directory | 2 + app/examples/Misc/Explorer/.icon.png | Bin 0 -> 3277 bytes app/examples/Misc/Explorer/.lang/ca.po | 56 + app/examples/Misc/Explorer/.lang/cs.po | 52 + app/examples/Misc/Explorer/.lang/de.po | 49 + app/examples/Misc/Explorer/.lang/es.po | 35 + app/examples/Misc/Explorer/.lang/ru.po | 70 + app/examples/Misc/Explorer/.project | 20 + .../Misc/Explorer/.src/FExplorer.class | 175 + .../Misc/Explorer/.src/FExplorer.form | 38 + app/examples/Misc/Explorer/folder.png | Bin 0 -> 2450 bytes app/examples/Misc/Notepad/.directory | 2 + app/examples/Misc/Notepad/.icon.png | Bin 0 -> 4288 bytes app/examples/Misc/Notepad/.lang/ca.po | 148 + app/examples/Misc/Notepad/.lang/cs.po | 150 + app/examples/Misc/Notepad/.lang/de.po | 141 + app/examples/Misc/Notepad/.lang/es.po | 95 + app/examples/Misc/Notepad/.lang/ru.po | 164 + app/examples/Misc/Notepad/.project | 20 + app/examples/Misc/Notepad/.src/FAbout.class | 25 + app/examples/Misc/Notepad/.src/FAbout.form | 22 + app/examples/Misc/Notepad/.src/FNotepad.class | 222 + app/examples/Misc/Notepad/.src/FNotepad.form | 93 + app/examples/Misc/Notepad/notepad.png | Bin 0 -> 4015 bytes app/examples/Misc/PDFViewer/.directory | 2 + app/examples/Misc/PDFViewer/.icon.png | Bin 0 -> 4253 bytes app/examples/Misc/PDFViewer/.lang/ca.po | 80 + app/examples/Misc/PDFViewer/.lang/cs.po | 80 + app/examples/Misc/PDFViewer/.lang/de.po | 80 + app/examples/Misc/PDFViewer/.lang/es.po | 64 + app/examples/Misc/PDFViewer/.lang/ru.po | 112 + app/examples/Misc/PDFViewer/.project | 21 + app/examples/Misc/PDFViewer/.src/FMain.class | 472 + app/examples/Misc/PDFViewer/.src/FMain.form | 126 + app/examples/Misc/PDFViewer/.src/Fabout.class | 43 + app/examples/Misc/PDFViewer/.src/Fabout.form | 32 + app/examples/Misc/PDFViewer/pdf.png | Bin 0 -> 4588 bytes app/examples/Misc/SystemTray/.directory | 2 + app/examples/Misc/SystemTray/.icon.png | Bin 0 -> 3462 bytes app/examples/Misc/SystemTray/.lang/ru.po | 44 + app/examples/Misc/SystemTray/.project | 15 + app/examples/Misc/SystemTray/.src/FMain.class | 64 + app/examples/Misc/SystemTray/.src/FMain.form | 14 + app/examples/Misc/SystemTray/bg.png | Bin 0 -> 163 bytes app/examples/Misc/SystemTray/icon.png | Bin 0 -> 4363 bytes .../Misc/WatchGambasDirectory/.directory | 2 + .../Misc/WatchGambasDirectory/.icon.png | Bin 0 -> 3409 bytes .../Misc/WatchGambasDirectory/.lang/ru.po | 76 + .../Misc/WatchGambasDirectory/.project | 14 + .../WatchGambasDirectory/.src/MMain.module | 54 + .../Misc/WatchGambasDirectory/watch.svg | 1257 + app/examples/Multimedia/CDPlayer/.directory | 2 + app/examples/Multimedia/CDPlayer/.icon.png | Bin 0 -> 4311 bytes app/examples/Multimedia/CDPlayer/.lang/ca.po | 60 + app/examples/Multimedia/CDPlayer/.lang/cs.po | 52 + app/examples/Multimedia/CDPlayer/.lang/es.po | 44 + app/examples/Multimedia/CDPlayer/.lang/ru.po | 90 + app/examples/Multimedia/CDPlayer/.project | 19 + .../Multimedia/CDPlayer/.src/Fcdplayer.class | 139 + .../Multimedia/CDPlayer/.src/Fcdplayer.form | 47 + app/examples/Multimedia/CDPlayer/cdrom.png | Bin 0 -> 3987 bytes .../Multimedia/MediaPlayer/.directory | 2 + .../.hidden/screenshots/MediaPlayer.jpg | Bin 0 -> 144138 bytes app/examples/Multimedia/MediaPlayer/.icon.png | Bin 0 -> 3571 bytes .../Multimedia/MediaPlayer/.lang/fr.po | 64 + .../Multimedia/MediaPlayer/.lang/ru.po | 92 + app/examples/Multimedia/MediaPlayer/.project | 55 + .../MediaPlayer/.src/CAnimation.class | 101 + .../Multimedia/MediaPlayer/.src/CButton.class | 215 + .../MediaPlayer/.src/FControl.class | 133 + .../Multimedia/MediaPlayer/.src/FControl.form | 37 + .../Multimedia/MediaPlayer/.src/FMain.class | 616 + .../Multimedia/MediaPlayer/.src/FMain.form | 18 + .../Multimedia/MediaPlayer/.src/FTags.class | 147 + .../Multimedia/MediaPlayer/.src/FTags.form | 91 + .../Multimedia/MediaPlayer/.src/MTest.module | 67 + .../Multimedia/MediaPlayer/brightness.png | Bin 0 -> 1534 bytes .../Multimedia/MediaPlayer/config.png | Bin 0 -> 831 bytes .../Multimedia/MediaPlayer/contrast.png | Bin 0 -> 1340 bytes app/examples/Multimedia/MediaPlayer/eject.png | Bin 0 -> 1004 bytes app/examples/Multimedia/MediaPlayer/film.png | Bin 0 -> 756 bytes .../Multimedia/MediaPlayer/fullscreen.png | Bin 0 -> 598 bytes app/examples/Multimedia/MediaPlayer/gamma.png | Bin 0 -> 693 bytes app/examples/Multimedia/MediaPlayer/icon.png | Bin 0 -> 2509 bytes app/examples/Multimedia/MediaPlayer/info.png | Bin 0 -> 2413 bytes app/examples/Multimedia/MediaPlayer/mute.png | Bin 0 -> 958 bytes app/examples/Multimedia/MediaPlayer/pause.png | Bin 0 -> 393 bytes app/examples/Multimedia/MediaPlayer/play.png | Bin 0 -> 757 bytes app/examples/Multimedia/MediaPlayer/quit.png | Bin 0 -> 1034 bytes .../Multimedia/MediaPlayer/screenshot.png | Bin 0 -> 1090 bytes .../Multimedia/MediaPlayer/seek-backward.png | Bin 0 -> 1316 bytes .../Multimedia/MediaPlayer/seek-forward.png | Bin 0 -> 1283 bytes .../Multimedia/MediaPlayer/skip-backward.png | Bin 0 -> 1093 bytes .../Multimedia/MediaPlayer/skip-forward.png | Bin 0 -> 1085 bytes app/examples/Multimedia/MediaPlayer/stop.png | Bin 0 -> 495 bytes .../Multimedia/MediaPlayer/subtitle.png | Bin 0 -> 1174 bytes app/examples/Multimedia/MediaPlayer/undo.png | Bin 0 -> 1091 bytes app/examples/Multimedia/MediaPlayer/video.png | Bin 0 -> 762 bytes .../Multimedia/MediaPlayer/visualisation.png | Bin 0 -> 1093 bytes .../Multimedia/MediaPlayer/volume-0.png | Bin 0 -> 908 bytes .../Multimedia/MediaPlayer/volume-1.png | Bin 0 -> 785 bytes .../Multimedia/MediaPlayer/volume-2.png | Bin 0 -> 1052 bytes .../Multimedia/MediaPlayer/volume-3.png | Bin 0 -> 1384 bytes .../Multimedia/MediaPlayer/volume.png | Bin 0 -> 1384 bytes .../Multimedia/MediaPlayer/zoom-in.png | Bin 0 -> 1634 bytes .../Multimedia/MoviePlayer/.directory | 2 + app/examples/Multimedia/MoviePlayer/.icon.png | Bin 0 -> 4342 bytes .../Multimedia/MoviePlayer/.lang/ca.po | 32 + .../Multimedia/MoviePlayer/.lang/cs.po | 30 + .../Multimedia/MoviePlayer/.lang/es.po | 27 + .../Multimedia/MoviePlayer/.lang/ru.po | 52 + app/examples/Multimedia/MoviePlayer/.project | 19 + .../MoviePlayer/.src/FMoviePlayer.class | 136 + .../MoviePlayer/.src/FMoviePlayer.form | 42 + app/examples/Multimedia/MoviePlayer/video.png | Bin 0 -> 5244 bytes .../Multimedia/MusicPlayer/.directory | 2 + app/examples/Multimedia/MusicPlayer/.icon.png | Bin 0 -> 4226 bytes .../Multimedia/MusicPlayer/.icon/16.png | Bin 0 -> 288 bytes .../Multimedia/MusicPlayer/.icon/32.png | Bin 0 -> 272 bytes .../Multimedia/MusicPlayer/.icon/48.png | Bin 0 -> 555 bytes .../Multimedia/MusicPlayer/.lang/ca.po | 32 + .../Multimedia/MusicPlayer/.lang/cs.po | 24 + .../Multimedia/MusicPlayer/.lang/es.po | 24 + .../Multimedia/MusicPlayer/.lang/fr.po | 35 + .../Multimedia/MusicPlayer/.lang/ru.po | 38 + app/examples/Multimedia/MusicPlayer/.project | 25 + .../MusicPlayer/.src/FSoundPlayer.class | 145 + .../MusicPlayer/.src/FSoundPlayer.form | 62 + app/examples/Multimedia/MusicPlayer/sound.png | Bin 0 -> 3551 bytes app/examples/Multimedia/MyWebCam/.directory | 2 + app/examples/Multimedia/MyWebCam/.icon.png | Bin 0 -> 4360 bytes app/examples/Multimedia/MyWebCam/.lang/ca.po | 107 + app/examples/Multimedia/MyWebCam/.lang/cs.po | 112 + app/examples/Multimedia/MyWebCam/.lang/es.po | 95 + app/examples/Multimedia/MyWebCam/.lang/ru.po | 158 + app/examples/Multimedia/MyWebCam/.project | 19 + .../Multimedia/MyWebCam/.src/Form1.class | 203 + .../Multimedia/MyWebCam/.src/Form1.form | 122 + app/examples/Multimedia/MyWebCam/camera.png | Bin 0 -> 5363 bytes .../Multimedia/WaveGenerator/.directory | 2 + .../Multimedia/WaveGenerator/.icon.png | Bin 0 -> 4098 bytes .../Multimedia/WaveGenerator/.lang/ru.po | 106 + .../Multimedia/WaveGenerator/.project | 14 + .../Multimedia/WaveGenerator/.src/FMain.class | 102 + .../Multimedia/WaveGenerator/.src/FMain.form | 61 + .../WaveGenerator/audio-headphones.png | Bin 0 -> 2578 bytes app/examples/Multimedia/WebCam/.directory | 2 + app/examples/Multimedia/WebCam/.icon.png | Bin 0 -> 4272 bytes app/examples/Multimedia/WebCam/.lang/ru.po | 174 + app/examples/Multimedia/WebCam/.project | 17 + .../Multimedia/WebCam/.src/FDevice.class | 304 + .../Multimedia/WebCam/.src/FDevice.form | 149 + .../Multimedia/WebCam/.src/FMain.class | 126 + .../Multimedia/WebCam/.src/FMain.form | 62 + app/examples/Multimedia/WebCam/camera.png | Bin 0 -> 1027 bytes app/examples/Multimedia/WebCam/settings.png | Bin 0 -> 248 bytes .../Networking/ClientSocket/.directory | 2 + .../Networking/ClientSocket/.icon.png | Bin 0 -> 3551 bytes .../Networking/ClientSocket/.lang/ca.po | 127 + .../Networking/ClientSocket/.lang/cs.po | 120 + .../Networking/ClientSocket/.lang/de.po | 120 + .../Networking/ClientSocket/.lang/es.po | 63 + .../Networking/ClientSocket/.lang/nl.po | 120 + .../Networking/ClientSocket/.lang/ru.po | 148 + app/examples/Networking/ClientSocket/.project | 20 + .../ClientSocket/.src/FrmMain.class | 231 + .../Networking/ClientSocket/.src/FrmMain.form | 75 + .../Networking/ClientSocket/socket.png | Bin 0 -> 2200 bytes app/examples/Networking/DnsClient/.directory | 2 + app/examples/Networking/DnsClient/.icon.png | Bin 0 -> 18981 bytes app/examples/Networking/DnsClient/.lang/ca.po | 100 + app/examples/Networking/DnsClient/.lang/cs.po | 92 + app/examples/Networking/DnsClient/.lang/de.po | 93 + app/examples/Networking/DnsClient/.lang/es.po | 67 + app/examples/Networking/DnsClient/.lang/nl.po | 92 + app/examples/Networking/DnsClient/.lang/ru.po | 98 + app/examples/Networking/DnsClient/.project | 18 + .../Networking/DnsClient/.src/FMain.class | 308 + .../Networking/DnsClient/.src/FMain.form | 119 + .../Networking/DnsClient/dnsclient.png | Bin 0 -> 1808 bytes app/examples/Networking/HTTPGet/.directory | 2 + app/examples/Networking/HTTPGet/.icon.png | Bin 0 -> 3515 bytes app/examples/Networking/HTTPGet/.lang/ca.po | 124 + app/examples/Networking/HTTPGet/.lang/cs.po | 121 + app/examples/Networking/HTTPGet/.lang/de.po | 117 + .../Networking/HTTPGet/.lang/en_GB.po | 120 + app/examples/Networking/HTTPGet/.lang/es.po | 91 + app/examples/Networking/HTTPGet/.lang/nl.po | 120 + app/examples/Networking/HTTPGet/.lang/ru.po | 144 + app/examples/Networking/HTTPGet/.project | 22 + .../Networking/HTTPGet/.src/ClsParams.class | 8 + .../Networking/HTTPGet/.src/FConfig.class | 75 + .../Networking/HTTPGet/.src/FConfig.form | 64 + .../Networking/HTTPGet/.src/FHttpGet.class | 285 + .../Networking/HTTPGet/.src/FHttpGet.form | 65 + .../Networking/HTTPGet/httpclient.png | Bin 0 -> 1768 bytes app/examples/Networking/HTTPPost/.directory | 2 + app/examples/Networking/HTTPPost/.icon.png | Bin 0 -> 3515 bytes app/examples/Networking/HTTPPost/.lang/ca.po | 80 + app/examples/Networking/HTTPPost/.lang/cs.po | 72 + app/examples/Networking/HTTPPost/.lang/de.po | 73 + app/examples/Networking/HTTPPost/.lang/es.po | 56 + app/examples/Networking/HTTPPost/.lang/nl.po | 72 + app/examples/Networking/HTTPPost/.lang/ru.po | 104 + app/examples/Networking/HTTPPost/.project | 20 + .../Networking/HTTPPost/.src/FHttpPost.class | 105 + .../Networking/HTTPPost/.src/FHttpPost.form | 85 + .../Networking/HTTPPost/httpclient.png | Bin 0 -> 1768 bytes app/examples/Networking/POPMailbox/.directory | 2 + app/examples/Networking/POPMailbox/.icon.png | Bin 0 -> 4202 bytes .../Networking/POPMailbox/.lang/ru.po | 98 + app/examples/Networking/POPMailbox/.project | 19 + .../Networking/POPMailbox/.src/FMain.class | 106 + .../Networking/POPMailbox/.src/FMain.form | 50 + .../POPMailbox/.src/FSettings.class | 68 + .../Networking/POPMailbox/.src/FSettings.form | 66 + .../Networking/POPMailbox/pop3client.png | Bin 0 -> 957 bytes app/examples/Networking/SerialPort/.directory | 2 + app/examples/Networking/SerialPort/.icon.png | Bin 0 -> 4320 bytes .../Networking/SerialPort/.lang/ru.po | 266 + app/examples/Networking/SerialPort/.project | 17 + .../Networking/SerialPort/.src/FAbout.class | 16 + .../Networking/SerialPort/.src/FAbout.form | 32 + .../Networking/SerialPort/.src/FMain.class | 246 + .../Networking/SerialPort/.src/FMain.form | 189 + .../SerialPort/.src/Module_Config.module | 92 + .../SerialPort/.src/Module_RS232.module | 93 + .../Networking/SerialPort/serialport.png | Bin 0 -> 2498 bytes .../Networking/ServerSocket/.directory | 2 + .../Networking/ServerSocket/.icon.png | Bin 0 -> 3502 bytes .../Networking/ServerSocket/.lang/ca.po | 112 + .../Networking/ServerSocket/.lang/cs.po | 104 + .../Networking/ServerSocket/.lang/es.po | 99 + .../Networking/ServerSocket/.lang/nl.po | 104 + .../Networking/ServerSocket/.lang/ru.po | 172 + app/examples/Networking/ServerSocket/.project | 21 + .../ServerSocket/.src/FrmMain.class | 176 + .../Networking/ServerSocket/.src/FrmMain.form | 61 + .../Networking/ServerSocket/serversocket.png | Bin 0 -> 2122 bytes .../Networking/UDPServerClient/.directory | 2 + .../Networking/UDPServerClient/.icon.png | Bin 0 -> 4294 bytes .../Networking/UDPServerClient/.lang/ca.po | 104 + .../Networking/UDPServerClient/.lang/cs.po | 96 + .../Networking/UDPServerClient/.lang/es.po | 101 + .../Networking/UDPServerClient/.lang/nl.po | 96 + .../Networking/UDPServerClient/.lang/ru.po | 110 + .../Networking/UDPServerClient/.project | 17 + .../UDPServerClient/.src/FrmClient.class | 73 + .../UDPServerClient/.src/FrmClient.form | 68 + .../UDPServerClient/.src/FrmServer.class | 86 + .../UDPServerClient/.src/FrmServer.form | 38 + .../Networking/UDPServerClient/udpsocket.png | Bin 0 -> 2161 bytes app/examples/Networking/WebBrowser/.directory | 2 + app/examples/Networking/WebBrowser/.icon.png | Bin 0 -> 3585 bytes .../Networking/WebBrowser/.lang/ca.po | 212 + .../Networking/WebBrowser/.lang/cs.po | 204 + .../Networking/WebBrowser/.lang/de.po | 205 + .../Networking/WebBrowser/.lang/es.po | 62 + .../Networking/WebBrowser/.lang/nl.po | 204 + .../Networking/WebBrowser/.lang/ru.po | 258 + app/examples/Networking/WebBrowser/.project | 26 + .../Networking/WebBrowser/.src/FAuth.class | 38 + .../Networking/WebBrowser/.src/FAuth.form | 57 + .../Networking/WebBrowser/.src/FBrowser.class | 584 + .../Networking/WebBrowser/.src/FBrowser.form | 352 + .../WebBrowser/.src/FDownload.class | 50 + .../Networking/WebBrowser/.src/FDownload.form | 34 + .../WebBrowser/.src/FDownloadList.class | 20 + .../WebBrowser/.src/FDownloadList.form | 20 + .../WebBrowser/.src/FEditable.class | 15 + .../Networking/WebBrowser/.src/FEditable.form | 19 + .../Networking/WebBrowser/.src/FOption.class | 67 + .../Networking/WebBrowser/.src/FOption.form | 69 + app/examples/Networking/WebBrowser/icon.png | Bin 0 -> 2932 bytes .../Networking/WebBrowser/list-ordered.png | Bin 0 -> 518 bytes .../Networking/WebBrowser/list-unordered.png | Bin 0 -> 237 bytes app/examples/OpenGL/3DWebCam/.directory | 2 + app/examples/OpenGL/3DWebCam/.icon.png | Bin 0 -> 4343 bytes app/examples/OpenGL/3DWebCam/.lang/ru.po | 46 + app/examples/OpenGL/3DWebCam/.project | 19 + .../OpenGL/3DWebCam/.src/Mmain.module | 256 + app/examples/OpenGL/3DWebCam/webcam.png | Bin 0 -> 6442 bytes app/examples/OpenGL/GambasGears/.directory | 2 + app/examples/OpenGL/GambasGears/.icon.png | Bin 0 -> 3450 bytes app/examples/OpenGL/GambasGears/.lang/ru.po | 38 + app/examples/OpenGL/GambasGears/.project | 19 + .../OpenGL/GambasGears/.src/Module1.module | 256 + app/examples/OpenGL/GambasGears/gears.png | Bin 0 -> 3488 bytes app/examples/OpenGL/Md2Model/.directory | 2 + app/examples/OpenGL/Md2Model/.icon.png | Bin 0 -> 3521 bytes app/examples/OpenGL/Md2Model/.lang/ru.po | 50 + app/examples/OpenGL/Md2Model/.project | 22 + app/examples/OpenGL/Md2Model/.src/FMain.class | 243 + app/examples/OpenGL/Md2Model/.src/FMain.form | 31 + app/examples/OpenGL/Md2Model/Weapon.md2 | Bin 0 -> 71708 bytes app/examples/OpenGL/Md2Model/Weapon.png | Bin 0 -> 17376 bytes app/examples/OpenGL/Md2Model/bauul.jpg | Bin 0 -> 25801 bytes app/examples/OpenGL/Md2Model/bauul.md2 | Bin 0 -> 261308 bytes app/examples/OpenGL/Md2Model/goblin.jpg | Bin 0 -> 23224 bytes app/examples/OpenGL/Md2Model/goblin.md2 | Bin 0 -> 259348 bytes app/examples/OpenGL/Md2Model/icon.png | Bin 0 -> 5529 bytes app/examples/OpenGL/Md2Model/igdosh.png | Bin 0 -> 22466 bytes app/examples/OpenGL/Md2Model/knight.jpg | Bin 0 -> 16927 bytes app/examples/OpenGL/Md2Model/knight.md2 | Bin 0 -> 320236 bytes app/examples/OpenGL/Md2Model/ogro.jpg | Bin 0 -> 23954 bytes app/examples/OpenGL/Md2Model/ogro.md2 | Bin 0 -> 317276 bytes app/examples/OpenGL/Md2Model/rat.jpg | Bin 0 -> 22384 bytes app/examples/OpenGL/Md2Model/rat.md2 | Bin 0 -> 303388 bytes app/examples/OpenGL/Md2Model/rhino.jpg | Bin 0 -> 18925 bytes app/examples/OpenGL/Md2Model/rhino.md2 | Bin 0 -> 418932 bytes app/examples/OpenGL/NeHeTutorial/.directory | 2 + app/examples/OpenGL/NeHeTutorial/.icon.png | Bin 0 -> 4212 bytes app/examples/OpenGL/NeHeTutorial/.lang/ru.po | 34 + app/examples/OpenGL/NeHeTutorial/.project | 17 + .../OpenGL/NeHeTutorial/.src/Example1.module | 48 + .../OpenGL/NeHeTutorial/.src/Example10.module | 389 + .../OpenGL/NeHeTutorial/.src/Example11.module | 157 + .../OpenGL/NeHeTutorial/.src/Example16.module | 238 + .../OpenGL/NeHeTutorial/.src/Example19.module | 295 + .../OpenGL/NeHeTutorial/.src/Example2.module | 73 + .../OpenGL/NeHeTutorial/.src/Example25.module | 243 + .../OpenGL/NeHeTutorial/.src/Example3.module | 76 + .../OpenGL/NeHeTutorial/.src/Example4.module | 90 + .../OpenGL/NeHeTutorial/.src/Example42.module | 301 + .../OpenGL/NeHeTutorial/.src/Example5.module | 149 + .../OpenGL/NeHeTutorial/.src/Example6.module | 184 + .../OpenGL/NeHeTutorial/.src/Example7.module | 219 + .../OpenGL/NeHeTutorial/.src/Example8.module | 232 + .../OpenGL/NeHeTutorial/.src/Example9.module | 190 + .../OpenGL/NeHeTutorial/.src/MMain.module | 17 + app/examples/OpenGL/NeHeTutorial/NeHe.png | Bin 0 -> 14493 bytes app/examples/OpenGL/NeHeTutorial/Sphere.txt | 486 + app/examples/OpenGL/NeHeTutorial/Star.png | Bin 0 -> 4910 bytes app/examples/OpenGL/NeHeTutorial/Torus.txt | 486 + app/examples/OpenGL/NeHeTutorial/Tube.txt | 486 + app/examples/OpenGL/NeHeTutorial/barrel.png | Bin 0 -> 294 bytes app/examples/OpenGL/NeHeTutorial/ceiling.png | Bin 0 -> 140734 bytes app/examples/OpenGL/NeHeTutorial/crate.jpeg | Bin 0 -> 16088 bytes app/examples/OpenGL/NeHeTutorial/floor.png | Bin 0 -> 29009 bytes app/examples/OpenGL/NeHeTutorial/glass.png | Bin 0 -> 41118 bytes app/examples/OpenGL/NeHeTutorial/icon.png | Bin 0 -> 3377 bytes app/examples/OpenGL/NeHeTutorial/rainbow.txt | 12 + app/examples/OpenGL/NeHeTutorial/wall.jpeg | Bin 0 -> 121454 bytes app/examples/OpenGL/NeHeTutorial/world.txt | 16 + .../OpenGL/NeHeTutorialShell/.directory | 2 + .../OpenGL/NeHeTutorialShell/.icon.png | Bin 0 -> 4202 bytes .../OpenGL/NeHeTutorialShell/.lang/ru.po | 110 + .../OpenGL/NeHeTutorialShell/.project | 13 + .../OpenGL/NeHeTutorialShell/.src/FMain.class | 64 + .../OpenGL/NeHeTutorialShell/.src/FMain.form | 64 + .../OpenGL/NeHeTutorialShell/icon.png | Bin 0 -> 4015 bytes .../OpenGL/NeHeTutorialShell/nehe.png | Bin 0 -> 5785 bytes .../OpenGL/PDFPresentation/.directory | 2 + app/examples/OpenGL/PDFPresentation/.icon.png | Bin 0 -> 3540 bytes .../OpenGL/PDFPresentation/.lang/ru.po | 70 + app/examples/OpenGL/PDFPresentation/.project | 27 + .../OpenGL/PDFPresentation/.src/CLogo.class | 224 + .../.src/CPdfPresentation.class | 464 + .../OpenGL/PDFPresentation/.src/FMain.class | 111 + .../OpenGL/PDFPresentation/.src/FMain.form | 37 + .../OpenGL/PDFPresentation/.src/MMain.module | 12 + app/examples/OpenGL/PDFPresentation/icon.png | Bin 0 -> 14695 bytes app/examples/OpenGL/PDFPresentation/logo.png | Bin 0 -> 27199 bytes app/examples/OpenGL/PDFPresentation/music.xm | Bin 0 -> 482806 bytes app/examples/OpenGL/TunnelSDL/.dir_icon.png | Bin 0 -> 1571 bytes app/examples/OpenGL/TunnelSDL/.directory | 2 + app/examples/OpenGL/TunnelSDL/.icon.png | Bin 0 -> 3650 bytes app/examples/OpenGL/TunnelSDL/.lang/ru.po | 38 + app/examples/OpenGL/TunnelSDL/.project | 23 + .../OpenGL/TunnelSDL/.src/CTunnel.class | 132 + .../OpenGL/TunnelSDL/.src/MMain.module | 67 + app/examples/OpenGL/TunnelSDL/texture.png | Bin 0 -> 118636 bytes app/examples/OpenGL/TunnelSDL/tunnelsdl.png | Bin 0 -> 7012 bytes app/examples/Printing/Printing/.directory | 2 + .../.hidden/screenshots/2014-12-14.png | Bin 0 -> 76629 bytes app/examples/Printing/Printing/.icon.png | Bin 0 -> 3334 bytes app/examples/Printing/Printing/.lang/ru.po | 72 + app/examples/Printing/Printing/.project | 15 + .../Printing/Printing/.src/FMain.class | 174 + .../Printing/Printing/.src/FMain.form | 90 + .../Printing/Printing/molly-malone.txt | 35 + .../Printing/Printing/printer-laser.png | Bin 0 -> 1358 bytes .../.connection/Connection1.connection | 11 + .../.connection/Connection1.template | 65 + .../Printing/ReportExample/.directory | 2 + .../Printing/ReportExample/.hidden/report.png | Bin 0 -> 3154 bytes app/examples/Printing/ReportExample/.icon.png | Bin 0 -> 3544 bytes .../Printing/ReportExample/.lang/ru.po | 114 + app/examples/Printing/ReportExample/.project | 17 + .../Printing/ReportExample/.src/FMain.class | 41 + .../Printing/ReportExample/.src/FMain.form | 72 + .../Printing/ReportExample/.src/Report1.class | 32 + .../ReportExample/.src/Report1.report | 102 + .../Printing/ReportExample/.src/Report2.class | 19 + .../ReportExample/.src/Report2.report | 19 + .../Printing/ReportExample/.src/Report3.class | 45 + .../ReportExample/.src/Report3.report | 74 + .../Printing/ReportExample/gambas.svg | 540 + app/examples/Web/SmallWiki/.directory | 2 + app/examples/Web/SmallWiki/.icon.png | Bin 0 -> 15892 bytes app/examples/Web/SmallWiki/.lang/ru.po | 52 + app/examples/Web/SmallWiki/.project | 15 + .../Web/SmallWiki/.public/critical.png | Bin 0 -> 589 bytes app/examples/Web/SmallWiki/.public/edit.png | Bin 0 -> 116 bytes app/examples/Web/SmallWiki/.public/info.png | Bin 0 -> 777 bytes app/examples/Web/SmallWiki/.public/logo.png | Bin 0 -> 4125 bytes app/examples/Web/SmallWiki/.public/style.css | 233 + app/examples/Web/SmallWiki/.public/tip.png | Bin 0 -> 534 bytes app/examples/Web/SmallWiki/.public/up.png | Bin 0 -> 185 bytes .../Web/SmallWiki/.public/warning.png | Bin 0 -> 704 bytes app/examples/Web/SmallWiki/.src/Main.module | 282 + .../Web/SmallWiki/.src/Markdown.class | 40 + .../Web/SmallWiki/.src/MarkdownLink.class | 9 + app/examples/Web/SmallWiki/.src/Markup.module | 909 + app/examples/Web/SmallWiki/.src/Wiki.class | 47 + app/examples/Web/SmallWiki/.src/Wiki.webpage | 90 + .../Web/SmallWiki/.src/WikiMarkdown.class | 31 + app/examples/Web/SmallWiki/page | 8 + app/examples/Web/SmallWiki/passwd | 1 + app/man/Makefile.am | 1 + app/man/gambas3.1 | 53 + app/man/gbs3.1 | 54 + app/man/gbw3.1 | 51 + app/mime/application-x-gambasscript.png | Bin 0 -> 7529 bytes app/mime/application-x-gambasscript.xml | 14 + app/mime/application-x-gambasserverpage.png | Bin 0 -> 8809 bytes app/mime/application-x-gambasserverpage.xml | 13 + app/reconf | 1 + app/src/INSTALL | 1 + .../.connection/Connection1.connection | 11 + .../.connection/Connection1.template | 160 + .../.connection/Connection2.connection | 10 + .../.connection/gambas3_farm.connection | 11 + .../.connection/gambas3_farm.template | 213 + app/src/gambas-farm-server/.directory | 2 + app/src/gambas-farm-server/.icon.png | Bin 0 -> 8866 bytes app/src/gambas-farm-server/.project | 16 + app/src/gambas-farm-server/.src/MMain.module | 1031 + app/src/gambas-farm-server/logo.png | Bin 0 -> 743 bytes app/src/gambas-farm-server/usage.txt | 8 + .../.connection/Connection1.connection | 9 + app/src/gambas-wiki/.directory | 2 + app/src/gambas-wiki/.hidden/CHANGELOG | 7 + .../.hidden/Uncompressed/.public/hilitor.js | 236 + .../Uncompressed/.public/style-rtl.css | 16 + .../.hidden/Uncompressed/.public/style-w.css | 20 + .../.hidden/Uncompressed/.public/style.css | 677 + app/src/gambas-wiki/.icon.png | Bin 0 -> 14647 bytes app/src/gambas-wiki/.lang/ar.po | 224 + app/src/gambas-wiki/.lang/ca.po | 224 + app/src/gambas-wiki/.lang/cs.po | 224 + app/src/gambas-wiki/.lang/de.po | 335 + app/src/gambas-wiki/.lang/es.po | 319 + app/src/gambas-wiki/.lang/es_ES.po | 319 + app/src/gambas-wiki/.lang/fa.po | 224 + app/src/gambas-wiki/.lang/fr.po | 338 + app/src/gambas-wiki/.lang/it.po | 346 + app/src/gambas-wiki/.lang/nl.po | 336 + app/src/gambas-wiki/.lang/pt_BR.po | 342 + app/src/gambas-wiki/.lang/ru.po | 354 + app/src/gambas-wiki/.lang/sv.po | 224 + app/src/gambas-wiki/.lang/zh.po | 263 + app/src/gambas-wiki/.project | 29 + app/src/gambas-wiki/.public/critical.png | Bin 0 -> 495 bytes app/src/gambas-wiki/.public/edit.png | Bin 0 -> 237 bytes app/src/gambas-wiki/.public/error-bg.png | Bin 0 -> 153 bytes app/src/gambas-wiki/.public/gambas.png | Bin 0 -> 16241 bytes app/src/gambas-wiki/.public/hilitor.js | 305 + app/src/gambas-wiki/.public/home.png | Bin 0 -> 217 bytes app/src/gambas-wiki/.public/info.png | Bin 0 -> 313 bytes app/src/gambas-wiki/.public/logo.png | Bin 0 -> 4125 bytes app/src/gambas-wiki/.public/playground.js | 95 + app/src/gambas-wiki/.public/style-nh.css | 27 + app/src/gambas-wiki/.public/style-rtl.css | 4 + app/src/gambas-wiki/.public/style-w.css | 20 + app/src/gambas-wiki/.public/style.css | 785 + app/src/gambas-wiki/.public/tip.png | Bin 0 -> 241 bytes app/src/gambas-wiki/.public/up-gray.png | Bin 0 -> 197 bytes app/src/gambas-wiki/.public/up.png | Bin 0 -> 201 bytes app/src/gambas-wiki/.public/vb.png | Bin 0 -> 907 bytes app/src/gambas-wiki/.public/waiting.gif | Bin 0 -> 723 bytes app/src/gambas-wiki/.public/warning.png | Bin 0 -> 786 bytes app/src/gambas-wiki/.src/CAuthor.class | 108 + app/src/gambas-wiki/.src/CClassInfo.class | 583 + app/src/gambas-wiki/.src/CComponent.class | 1000 + app/src/gambas-wiki/.src/CPropertyInfo.class | 246 + app/src/gambas-wiki/.src/CSymbolInfo.class | 723 + app/src/gambas-wiki/.src/CUser.class | 99 + app/src/gambas-wiki/.src/Confirm.class | 24 + app/src/gambas-wiki/.src/Confirm.webpage | 43 + app/src/gambas-wiki/.src/HttpStat.module | 118 + app/src/gambas-wiki/.src/Main.module | 1601 + app/src/gambas-wiki/.src/OldWiki.module | 603 + app/src/gambas-wiki/.src/Register.class | 17 + app/src/gambas-wiki/.src/Register.webpage | 131 + app/src/gambas-wiki/.src/Wiki.class | 382 + app/src/gambas-wiki/.src/Wiki.webpage | 219 + app/src/gambas-wiki/.src/WikiMarkdown.class | 322 + app/src/gambas-wiki/AUTHORS | 1 + app/src/gambas-wiki/gambas3-ide.project | 1 + app/src/gambas-wiki/gambas3-scripter.project | 1 + app/src/gambas-wiki/icon.png | Bin 0 -> 1973 bytes app/src/gambas-wiki/page | 8 + app/src/gambas-wiki/passwd | 1 + app/src/gambas3/.directory | 2 + .../gambas3/.hidden/font/GambasBold-12.sfd | 26780 +++++++++ .../gambas3/.hidden/font/GambasBold-13.sfd | 47625 +++++++++++++++ .../gambas3/.hidden/font/GambasBold-16.sfd | 31048 ++++++++++ .../gambas3/.hidden/font/GambasMedium-12.sfd | 24951 ++++++++ .../gambas3/.hidden/font/GambasMedium-13.sfd | 27035 +++++++++ .../gambas3/.hidden/font/GambasMedium-16.sfd | 29974 ++++++++++ app/src/gambas3/.hidden/font/LICENSE | 97 + app/src/gambas3/.hidden/make-help-archive | 4 + app/src/gambas3/.hidden/report-ng.sh | 132 + app/src/gambas3/.icon.png | Bin 0 -> 12003 bytes app/src/gambas3/.lang/ar.po | 8139 +++ app/src/gambas3/.lang/ca.po | 8103 +++ app/src/gambas3/.lang/cs.po | 8386 +++ app/src/gambas3/.lang/cy.po | 7987 +++ app/src/gambas3/.lang/de.po | 8270 +++ app/src/gambas3/.lang/el.po | 8065 +++ app/src/gambas3/.lang/es.po | 7924 +++ app/src/gambas3/.lang/es_ES.po | 7960 +++ app/src/gambas3/.lang/fa.po | 8371 +++ app/src/gambas3/.lang/fr.po | 7963 +++ app/src/gambas3/.lang/gl_ES.po | 8037 +++ app/src/gambas3/.lang/hr.po | 8039 +++ app/src/gambas3/.lang/hu.po | 8132 +++ app/src/gambas3/.lang/id.po | 8034 +++ app/src/gambas3/.lang/it.po | 8164 +++ app/src/gambas3/.lang/ja.po | 8611 +++ app/src/gambas3/.lang/ko.po | 7727 +++ app/src/gambas3/.lang/lt.po | 8026 +++ app/src/gambas3/.lang/nl.po | 8018 +++ app/src/gambas3/.lang/no.po | 8040 +++ app/src/gambas3/.lang/pl.po | 7798 +++ app/src/gambas3/.lang/pt.po | 8304 +++ app/src/gambas3/.lang/pt_BR.po | 8159 +++ app/src/gambas3/.lang/ro.po | 8032 +++ app/src/gambas3/.lang/ru.po | 7934 +++ app/src/gambas3/.lang/sl.po | 8139 +++ app/src/gambas3/.lang/sv.po | 8670 +++ app/src/gambas3/.lang/tr.po | 8360 +++ app/src/gambas3/.lang/zh.po | 8558 +++ app/src/gambas3/.lang/zh_TW.po | 8669 +++ app/src/gambas3/.project | 59 + app/src/gambas3/.src/CRecentProject.class | 259 + app/src/gambas3/.src/CStyle.class | 76 + app/src/gambas3/.src/CWaitingAnimation.class | 113 + .../gambas3/.src/Component/CClassInfo.class | 1044 + .../gambas3/.src/Component/CComponent.class | 649 + .../.src/Component/CDocumentation.class | 1215 + app/src/gambas3/.src/Component/CModule.class | 107 + .../.src/Component/CPropertyInfo.class | 397 + .../gambas3/.src/Component/CSymbolInfo.class | 1481 + .../gambas3/.src/Connection/FExportData.class | 146 + .../gambas3/.src/Connection/FExportData.form | 47 + .../.src/Connection/FImportTable.class | 512 + .../gambas3/.src/Connection/FImportTable.form | 154 + .../.src/Connection/FNewConnection.class | 434 + .../.src/Connection/FNewConnection.form | 220 + .../gambas3/.src/Connection/FPasteTable.class | 226 + .../gambas3/.src/Connection/FPasteTable.form | 77 + .../.src/Connection/MConnection.module | 553 + app/src/gambas3/.src/Debug/CProfile.class | 128 + app/src/gambas3/.src/Debug/Design.module | 1556 + app/src/gambas3/.src/Debug/FCrash.class | 147 + app/src/gambas3/.src/Debug/FCrash.form | 75 + app/src/gambas3/.src/Debug/FDebugButton.class | 118 + app/src/gambas3/.src/Debug/FDebugButton.form | 70 + app/src/gambas3/.src/Debug/FDebugExpr.class | 883 + app/src/gambas3/.src/Debug/FDebugExpr.form | 73 + app/src/gambas3/.src/Debug/FDebugInfo.class | 1545 + app/src/gambas3/.src/Debug/FDebugInfo.form | 352 + app/src/gambas3/.src/Debug/FOutput.class | 513 + app/src/gambas3/.src/Debug/FOutput.form | 124 + app/src/gambas3/.src/Debug/FProfile.class | 1071 + app/src/gambas3/.src/Debug/FProfile.form | 151 + app/src/gambas3/.src/Debug/FTestSuite.class | 460 + app/src/gambas3/.src/Debug/FTestSuite.form | 126 + .../.src/Dialog/Database/FFieldChooser.class | 159 + .../.src/Dialog/Database/FFieldChooser.form | 104 + .../.src/Dialog/Database/FTableChooser.class | 75 + .../.src/Dialog/Database/FTableChooser.form | 52 + .../gambas3/.src/Dialog/FColorChooser.class | 304 + .../gambas3/.src/Dialog/FColorChooser.form | 54 + app/src/gambas3/.src/Dialog/FFileInfoVC.class | 149 + app/src/gambas3/.src/Dialog/FFileInfoVC.form | 58 + .../gambas3/.src/Dialog/FFileProperty.class | 96 + .../gambas3/.src/Dialog/FFileProperty.form | 38 + .../gambas3/.src/Dialog/FFontChooser.class | 41 + app/src/gambas3/.src/Dialog/FFontChooser.form | 32 + app/src/gambas3/.src/Dialog/FList.class | 225 + app/src/gambas3/.src/Dialog/FList.form | 94 + app/src/gambas3/.src/Dialog/FSelectIcon.class | 203 + app/src/gambas3/.src/Dialog/FSelectIcon.form | 69 + app/src/gambas3/.src/Editor/CBookmark.class | 181 + .../gambas3/.src/Editor/CInsertColor.class | 282 + app/src/gambas3/.src/Editor/CInsertDate.class | 174 + app/src/gambas3/.src/Editor/CPosition.class | 204 + app/src/gambas3/.src/Editor/CTask.class | 89 + app/src/gambas3/.src/Editor/CUndo.class | 188 + .../.src/Editor/Code/CCompletion.class | 129 + .../gambas3/.src/Editor/Code/CDatatype.class | 98 + .../.src/Editor/Code/CSampleCode.class | 505 + .../.src/Editor/Code/FCompletion.class | 1156 + .../gambas3/.src/Editor/Code/FCompletion.form | 53 + .../.src/Editor/Code/FConflictEditor.class | 1576 + .../.src/Editor/Code/FConflictEditor.form | 637 + .../gambas3/.src/Editor/Code/FEditor.class | 4023 ++ app/src/gambas3/.src/Editor/Code/FEditor.form | 752 + .../.src/Editor/Code/FPasteSpecial.class | 206 + .../.src/Editor/Code/FPasteSpecial.form | 64 + .../.src/Editor/Code/FProcedureList.class | 230 + .../.src/Editor/Code/FProcedureList.form | 22 + .../gambas3/.src/Editor/Code/FSignature.class | 272 + .../gambas3/.src/Editor/Code/FSignature.form | 58 + .../.src/Editor/Code/FTextEditor.class | 1911 + .../gambas3/.src/Editor/Code/FTextEditor.form | 743 + .../.src/Editor/Code/MPrettyCode.module | 496 + .../.src/Editor/Connection/CField.class | 31 + .../.src/Editor/Connection/CIndexField.class | 18 + .../Editor/Connection/FConnectionEditor.class | 2013 + .../Editor/Connection/FConnectionEditor.form | 517 + .../.src/Editor/Connection/FNewTable.class | 75 + .../.src/Editor/Connection/FNewTable.form | 64 + app/src/gambas3/.src/Editor/FGotoLine.class | 36 + app/src/gambas3/.src/Editor/FGotoLine.form | 31 + app/src/gambas3/.src/Editor/FInsertChar.class | 113 + app/src/gambas3/.src/Editor/FInsertChar.form | 16 + .../gambas3/.src/Editor/Form/CControl.class | 2376 + app/src/gambas3/.src/Editor/Form/CMenu.class | 79 + app/src/gambas3/.src/Editor/Form/FForm.class | 4518 ++ app/src/gambas3/.src/Editor/Form/FForm.form | 995 + .../gambas3/.src/Editor/Form/FFormStack.class | 334 + .../gambas3/.src/Editor/Form/FFormStack.form | 43 + app/src/gambas3/.src/Editor/Form/FMenu.class | 1141 + app/src/gambas3/.src/Editor/Form/FMenu.form | 313 + .../gambas3/.src/Editor/Form/FProperty.class | 1370 + .../gambas3/.src/Editor/Form/FProperty.form | 117 + app/src/gambas3/.src/Editor/Form/FText.class | 62 + app/src/gambas3/.src/Editor/Form/FText.form | 32 + .../gambas3/.src/Editor/Form/FToolBox.class | 401 + .../gambas3/.src/Editor/Form/FToolBox.form | 46 + .../gambas3/.src/Editor/Form/FToolPanel.class | 216 + .../gambas3/.src/Editor/Form/FToolPanel.form | 14 + .../.src/Editor/Image/CImageClipboard.class | 13 + .../.src/Editor/Image/CImageSelection.class | 1109 + .../.src/Editor/Image/CImageShape.class | 331 + .../.src/Editor/Image/FImageEditor.class | 3369 ++ .../.src/Editor/Image/FImageEditor.form | 827 + .../Editor/Image/FImageOffsetSelection.class | 26 + .../Editor/Image/FImageOffsetSelection.form | 30 + .../.src/Editor/Image/FImageProperty.class | 1549 + .../.src/Editor/Image/FImageProperty.form | 627 + .../.src/Editor/Image/FImageQuality.class | 20 + .../.src/Editor/Image/FImageQuality.form | 25 + .../.src/Editor/Image/FImageResize.class | 146 + .../.src/Editor/Image/FImageResize.form | 103 + .../.src/Editor/Image/FImageRotate.class | 39 + .../.src/Editor/Image/FImageRotate.form | 25 + .../gambas3/.src/Editor/MCompressFile.module | 557 + app/src/gambas3/.src/Editor/MPrint.module | 139 + .../ProjectChooser/FProjectChooser.class | 186 + .../ProjectChooser/FProjectChooser.form | 65 + .../ProjectChooser/ProjectChooser.class | 113 + app/src/gambas3/.src/Exported/TabPanel.class | 98 + .../gambas3/.src/Exported/TextEditor.class | 479 + app/src/gambas3/.src/FMain.class | 3121 + app/src/gambas3/.src/FMain.form | 1878 + app/src/gambas3/.src/FSave.class | 83 + app/src/gambas3/.src/FSave.form | 48 + app/src/gambas3/.src/FScreenshot.class | 46 + app/src/gambas3/.src/FScreenshot.form | 41 + app/src/gambas3/.src/Family/CFamily.class | 664 + .../.src/Family/Form/CFamilyForm.class | 161 + .../gambas3/.src/Family/Report/AngleBox.class | 90 + .../.src/Family/Report/CFamilyReport.class | 574 + .../.src/Family/Report/CReportBrush.class | 264 + .../gambas3/.src/Family/Report/CoordBox.class | 412 + .../Family/Report/FReportBorderChooser.class | 503 + .../Family/Report/FReportBorderChooser.form | 169 + .../Report/FReportBoxShadowChooser.class | 136 + .../Report/FReportBoxShadowChooser.form | 79 + .../Family/Report/FReportBrushChooser.class | 561 + .../Family/Report/FReportBrushChooser.form | 118 + .../Family/Report/FReportCoordChooser.class | 95 + .../Family/Report/FReportCoordChooser.form | 33 + .../Family/Report/FReportPaddingChooser.class | 97 + .../Family/Report/FReportPaddingChooser.form | 58 + .../Family/TermForm/CFamilyTermForm.class | 99 + .../.src/Family/WebForm/CFamilyWebForm.class | 272 + .../.src/Family/WebForm/FWebFontChooser.class | 126 + .../.src/Family/WebForm/FWebFontChooser.form | 103 + .../.src/Family/WebForm/WebformWebMenu.class | 51 + app/src/gambas3/.src/Help/FHelpBrowser.class | 340 + app/src/gambas3/.src/Help/FHelpBrowser.form | 126 + app/src/gambas3/.src/Help/FHelpShortcut.class | 44 + app/src/gambas3/.src/Help/FHelpShortcut.form | 39 + app/src/gambas3/.src/Help/FTips.class | 185 + app/src/gambas3/.src/Help/FTips.form | 66 + app/src/gambas3/.src/Help/HelpView.class | 185 + app/src/gambas3/.src/Help/MHelp.module | 1019 + app/src/gambas3/.src/Help/Markup.module | 587 + app/src/gambas3/.src/Help/Wiki/URL.class | 103 + app/src/gambas3/.src/Help/Wiki/Wiki.module | 919 + .../gambas3/.src/Help/Wiki/WikiMarkdown.class | 260 + app/src/gambas3/.src/MMime.module | 123 + app/src/gambas3/.src/MTheme.module | 262 + .../gambas3/.src/Options/CBackground.class | 68 + app/src/gambas3/.src/Options/FLayout.class | 58 + app/src/gambas3/.src/Options/FLayout.form | 38 + app/src/gambas3/.src/Options/FOption.class | 1835 + app/src/gambas3/.src/Options/FOption.form | 1268 + app/src/gambas3/.src/Options/FProxy.class | 55 + app/src/gambas3/.src/Options/FProxy.form | 67 + app/src/gambas3/.src/Options/FSnippet.class | 79 + app/src/gambas3/.src/Options/FSnippet.form | 43 + .../gambas3/.src/Packager/FMakeInstall.class | 1340 + .../gambas3/.src/Packager/FMakeInstall.form | 713 + .../.src/Packager/FSelectExtraFile.class | 39 + .../.src/Packager/FSelectExtraFile.form | 35 + app/src/gambas3/.src/Packager/Package.module | 2750 + app/src/gambas3/.src/Project.module | 6723 +++ app/src/gambas3/.src/Project/ArgListBox.class | 225 + .../gambas3/.src/Project/ArgListEditor.class | 204 + .../gambas3/.src/Project/CProjectInfo.class | 265 + .../gambas3/.src/Project/CProjectList.class | 678 + .../gambas3/.src/Project/CProjectTree.class | 1057 + .../Project/Component/ComponentChooser.class | 167 + .../Project/Component/FComponentChooser.class | 824 + .../Project/Component/FComponentChooser.form | 107 + .../Project/Component/FSelectComponent.class | 24 + .../Project/Component/FSelectComponent.form | 30 + .../.src/Project/Conversion/FConvert.class | 56 + .../.src/Project/Conversion/FConvert.form | 22 + .../.src/Project/Conversion/MConvert.module | 819 + app/src/gambas3/.src/Project/FArguments.class | 156 + app/src/gambas3/.src/Project/FArguments.form | 37 + .../gambas3/.src/Project/FCreateFile.class | 355 + app/src/gambas3/.src/Project/FCreateFile.form | 155 + .../gambas3/.src/Project/FCreateProject.class | 255 + .../gambas3/.src/Project/FCreateProject.form | 144 + .../gambas3/.src/Project/FImportFile.class | 204 + app/src/gambas3/.src/Project/FImportFile.form | 20 + .../.src/Project/FMakeExecutable.class | 68 + .../gambas3/.src/Project/FMakeExecutable.form | 79 + .../gambas3/.src/Project/FOpenProject.class | 196 + .../gambas3/.src/Project/FOpenProject.form | 117 + .../.src/Project/FProjectProperty.class | 1360 + .../.src/Project/FProjectProperty.form | 721 + .../gambas3/.src/Project/FSaveProjectAs.class | 103 + .../gambas3/.src/Project/FSaveProjectAs.form | 65 + .../gambas3/.src/Project/Farm/CSoftware.class | 692 + .../.src/Project/Farm/CSoftwareGroup.class | 27 + .../.src/Project/Farm/FFarmConfig.class | 32 + .../.src/Project/Farm/FFarmConfig.form | 30 + .../.src/Project/Farm/FFarmLogin.class | 113 + .../gambas3/.src/Project/Farm/FFarmLogin.form | 90 + .../.src/Project/Farm/FFarmRegister.class | 64 + .../.src/Project/Farm/FFarmRegister.form | 100 + .../.src/Project/Farm/FFarmRequest.class | 64 + .../.src/Project/Farm/FFarmRequest.form | 32 + .../gambas3/.src/Project/Farm/FPublish.class | 355 + .../gambas3/.src/Project/Farm/FPublish.form | 236 + .../.src/Project/Farm/FSoftwareFarm.class | 767 + .../.src/Project/Farm/FSoftwareFarm.form | 319 + .../.src/Project/Farm/FarmIdentity.class | 144 + .../.src/Project/Farm/FarmRequest.class | 396 + .../Project/Farm/FarmRequestManager.module | 97 + .../.src/Project/Farm/Publish/CTag.class | 78 + .../Project/Farm/Publish/CTagCompletion.class | 71 + .../Project/Farm/Publish/CTagEditor.class | 186 + .../.src/Project/Farm/SoftwareBox.class | 326 + .../.src/Project/Library/CLibraryInfo.class | 225 + .../.src/Project/Library/FSelectLibrary.class | 146 + .../.src/Project/Library/FSelectLibrary.form | 52 + .../.src/Project/Library/LibraryItem.class | 120 + .../.src/Project/Patch/FMakePatch.class | 155 + .../.src/Project/Patch/FMakePatch.form | 97 + .../gambas3/.src/Project/Patch/FPatch.class | 221 + .../gambas3/.src/Project/Patch/FPatch.form | 68 + .../gambas3/.src/Project/Patch/Patch.class | 212 + app/src/gambas3/.src/Project/ProjectBox.class | 471 + app/src/gambas3/.src/Save.module | 62 + app/src/gambas3/.src/Search/CGrepResult.class | 6 + .../gambas3/.src/Search/CSearchResult.class | 47 + app/src/gambas3/.src/Search/CSearchTask.class | 260 + app/src/gambas3/.src/Search/FSearch.class | 1543 + app/src/gambas3/.src/Search/FSearch.form | 174 + .../.src/Translation/CTranslation.class | 302 + .../.src/Translation/FNewTranslation.class | 45 + .../.src/Translation/FNewTranslation.form | 21 + .../gambas3/.src/Translation/FTranslate.class | 1780 + .../gambas3/.src/Translation/FTranslate.form | 347 + .../gambas3/.src/Translation/Language.module | 272 + app/src/gambas3/.src/Util.module | 68 + .../gambas3/.src/Util/MErrorMessage.module | 388 + .../gambas3/.src/Util/MRemoveAccents.module | 69 + .../gambas3/.src/Util/MSdlDefaultFont.module | 85 + .../.src/VersionControl/CVersionControl.class | 118 + .../VersionControl/CVersionControlGit.class | 497 + .../CVersionControlSubversion.class | 377 + .../.src/VersionControl/FConflict.class | 288 + .../.src/VersionControl/FConflict.form | 121 + .../.src/VersionControl/FProjectVersion.class | 307 + .../.src/VersionControl/FProjectVersion.form | 231 + .../.src/VersionControl/FVersionControl.class | 138 + .../.src/VersionControl/FVersionControl.form | 78 + .../.src/VersionControl/FVersionError.class | 49 + .../.src/VersionControl/FVersionError.form | 45 + .../.src/VersionControl/VersionControl.module | 710 + .../gambas3/.src/Welcome/CCoolButton.class | 230 + app/src/gambas3/.src/Welcome/CSnowFlake.class | 8 + app/src/gambas3/.src/Welcome/CTear.class | 4 + app/src/gambas3/.src/Welcome/CUser.class | 11 + app/src/gambas3/.src/Welcome/CWelcome.class | 366 + app/src/gambas3/.src/Welcome/FAbout.class | 431 + app/src/gambas3/.src/Welcome/FAbout.form | 37 + .../gambas3/.src/Welcome/FSystemInfo.class | 272 + app/src/gambas3/.src/Welcome/FSystemInfo.form | 38 + app/src/gambas3/.src/Welcome/FWelcome.class | 458 + app/src/gambas3/.src/Welcome/FWelcome.form | 114 + app/src/gambas3/AUTHORS | 1 + app/src/gambas3/_fake_project | 4 + app/src/gambas3/font/GambasBold-12.bdf | 36160 ++++++++++++ app/src/gambas3/font/GambasBold-13.bdf | 41652 +++++++++++++ app/src/gambas3/font/GambasBold-16.bdf | 47749 +++++++++++++++ app/src/gambas3/font/GambasMedium-12.bdf | 36575 ++++++++++++ app/src/gambas3/font/GambasMedium-13.bdf | 41608 +++++++++++++ app/src/gambas3/font/GambasMedium-16.bdf | 48934 ++++++++++++++++ app/src/gambas3/font/font.allow | 7 + app/src/gambas3/font/font.conf | 4 + app/src/gambas3/gitignore | 17 + app/src/gambas3/help/class-help.html | 36 + app/src/gambas3/help/component-help.html | 25 + app/src/gambas3/help/property-help.html | 22 + app/src/gambas3/help/symbol-help.html | 20 + app/src/gambas3/help/wiki/critical.png | Bin 0 -> 589 bytes app/src/gambas3/help/wiki/error-bg.png | Bin 0 -> 153 bytes app/src/gambas3/help/wiki/info.png | Bin 0 -> 777 bytes app/src/gambas3/help/wiki/page.html | 37 + app/src/gambas3/help/wiki/style-custom.css | 13 + app/src/gambas3/help/wiki/style-offline.css | 17 + app/src/gambas3/help/wiki/style.css | 1 + app/src/gambas3/help/wiki/tip.png | Bin 0 -> 534 bytes app/src/gambas3/help/wiki/up.png | Bin 0 -> 185 bytes app/src/gambas3/help/wiki/vb.png | Bin 0 -> 907 bytes app/src/gambas3/help/wiki/warning.png | Bin 0 -> 704 bytes app/src/gambas3/img/16/arrange-h.png | Bin 0 -> 161 bytes app/src/gambas3/img/16/arrange-hcenter.png | Bin 0 -> 164 bytes app/src/gambas3/img/16/arrange-lr.png | Bin 0 -> 164 bytes app/src/gambas3/img/16/arrange-tb.png | Bin 0 -> 162 bytes app/src/gambas3/img/16/arrange-v.png | Bin 0 -> 158 bytes app/src/gambas3/img/16/arrange-vcenter.png | Bin 0 -> 166 bytes app/src/gambas3/img/16/average.png | Bin 0 -> 416 bytes app/src/gambas3/img/16/checked-gray.png | Bin 0 -> 210 bytes app/src/gambas3/img/16/checked-lock.png | Bin 0 -> 157 bytes app/src/gambas3/img/16/checked.png | Bin 0 -> 190 bytes app/src/gambas3/img/16/close-window.png | Bin 0 -> 164 bytes app/src/gambas3/img/16/collapse-container.png | Bin 0 -> 165 bytes app/src/gambas3/img/16/control.png | Bin 0 -> 411 bytes app/src/gambas3/img/16/cursive.png | Bin 0 -> 551 bytes app/src/gambas3/img/16/delete-container.png | Bin 0 -> 171 bytes app/src/gambas3/img/16/embed-container.png | Bin 0 -> 159 bytes app/src/gambas3/img/16/expand-container.png | Bin 0 -> 165 bytes app/src/gambas3/img/16/fantasy.png | Bin 0 -> 478 bytes app/src/gambas3/img/16/max-window.png | Bin 0 -> 169 bytes app/src/gambas3/img/16/monospace.png | Bin 0 -> 372 bytes app/src/gambas3/img/16/percent.png | Bin 0 -> 547 bytes app/src/gambas3/img/16/red-arrow-c.png | Bin 0 -> 155 bytes app/src/gambas3/img/16/red-arrow-h.png | Bin 0 -> 148 bytes app/src/gambas3/img/16/red-arrow-r.png | Bin 0 -> 151 bytes app/src/gambas3/img/16/red-arrow-v.png | Bin 0 -> 152 bytes .../gambas3/img/16/remove-from-container.png | Bin 0 -> 159 bytes app/src/gambas3/img/16/rename.png | Bin 0 -> 219 bytes app/src/gambas3/img/16/round-ne.png | Bin 0 -> 219 bytes app/src/gambas3/img/16/round-nw.png | Bin 0 -> 221 bytes app/src/gambas3/img/16/round-se.png | Bin 0 -> 219 bytes app/src/gambas3/img/16/round-sw.png | Bin 0 -> 216 bytes app/src/gambas3/img/16/sans-serif.png | Bin 0 -> 487 bytes app/src/gambas3/img/16/select.png | Bin 0 -> 171 bytes app/src/gambas3/img/16/separator.png | Bin 0 -> 155 bytes app/src/gambas3/img/16/serif.png | Bin 0 -> 493 bytes app/src/gambas3/img/16/stack.png | Bin 0 -> 164 bytes app/src/gambas3/img/16/tabmove.png | Bin 0 -> 275 bytes app/src/gambas3/img/16/tabstrip.png | Bin 0 -> 248 bytes app/src/gambas3/img/16/tile.png | Bin 0 -> 120 bytes app/src/gambas3/img/16/toggle-container.png | Bin 0 -> 164 bytes app/src/gambas3/img/16/unchecked.png | Bin 0 -> 156 bytes app/src/gambas3/img/16/white-close.png | Bin 0 -> 157 bytes app/src/gambas3/img/32/added.png | Bin 0 -> 326 bytes app/src/gambas3/img/32/comment.png | Bin 0 -> 255 bytes app/src/gambas3/img/32/conflict.png | Bin 0 -> 326 bytes app/src/gambas3/img/32/cross.png | Bin 0 -> 171 bytes app/src/gambas3/img/32/do-not-translate.png | Bin 0 -> 433 bytes app/src/gambas3/img/32/eol.png | Bin 0 -> 194 bytes app/src/gambas3/img/32/exported.png | Bin 0 -> 600 bytes app/src/gambas3/img/32/filter-menu.png | Bin 0 -> 530 bytes app/src/gambas3/img/32/filter.png | Bin 0 -> 521 bytes app/src/gambas3/img/32/green-arrow.png | Bin 0 -> 217 bytes app/src/gambas3/img/32/linked.png | Bin 0 -> 198 bytes app/src/gambas3/img/32/magic.png | Bin 0 -> 241 bytes app/src/gambas3/img/32/modified.png | Bin 0 -> 395 bytes app/src/gambas3/img/32/opengl.png | Bin 0 -> 1329 bytes app/src/gambas3/img/32/startup.png | Bin 0 -> 191 bytes app/src/gambas3/img/32/tab.png | Bin 0 -> 206 bytes app/src/gambas3/img/32/uncomment.png | Bin 0 -> 325 bytes app/src/gambas3/img/32/wrap.png | Bin 0 -> 204 bytes app/src/gambas3/img/48/all.png | Bin 0 -> 1521 bytes app/src/gambas3/img/64/atari-dark.png | Bin 0 -> 202 bytes app/src/gambas3/img/64/atari.png | Bin 0 -> 202 bytes app/src/gambas3/img/background/baraka.png | Bin 0 -> 10448 bytes app/src/gambas3/img/background/christ.png | Bin 0 -> 215 bytes app/src/gambas3/img/background/circle.png | Bin 0 -> 193 bytes app/src/gambas3/img/background/cross.png | Bin 0 -> 146 bytes app/src/gambas3/img/background/cubism.png | Bin 0 -> 63853 bytes app/src/gambas3/img/background/dark.png | Bin 0 -> 113 bytes app/src/gambas3/img/background/gambas.png | Bin 0 -> 974 bytes app/src/gambas3/img/background/hline.png | Bin 0 -> 138 bytes app/src/gambas3/img/background/hose.png | Bin 0 -> 44520 bytes app/src/gambas3/img/background/illusion.png | Bin 0 -> 2946 bytes app/src/gambas3/img/background/labyrinth.png | Bin 0 -> 973 bytes app/src/gambas3/img/background/light.png | Bin 0 -> 113 bytes app/src/gambas3/img/background/list | 24 + app/src/gambas3/img/background/medracim.png | Bin 0 -> 172457 bytes app/src/gambas3/img/background/mosaic.png | Bin 0 -> 76015 bytes app/src/gambas3/img/background/muhammad.png | Bin 0 -> 17744 bytes app/src/gambas3/img/background/nature.png | Bin 0 -> 46970 bytes app/src/gambas3/img/background/oil.png | Bin 0 -> 74848 bytes app/src/gambas3/img/background/point.png | Bin 0 -> 135 bytes app/src/gambas3/img/background/quasi.png | Bin 0 -> 34460 bytes app/src/gambas3/img/background/smoke.png | Bin 0 -> 25578 bytes app/src/gambas3/img/background/square.png | Bin 0 -> 480 bytes app/src/gambas3/img/background/star.png | Bin 0 -> 34262 bytes app/src/gambas3/img/background/tawhid.png | Bin 0 -> 22454 bytes app/src/gambas3/img/background/vline.png | Bin 0 -> 133 bytes app/src/gambas3/img/background/warda.png | Bin 0 -> 24560 bytes app/src/gambas3/img/background/weave.png | Bin 0 -> 60153 bytes app/src/gambas3/img/broken.svg | 122 + app/src/gambas3/img/component/deprecated.png | Bin 0 -> 228 bytes .../gambas3/img/component/experimental.png | Bin 0 -> 208 bytes app/src/gambas3/img/component/finished.png | Bin 0 -> 206 bytes app/src/gambas3/img/component/unfinished.png | Bin 0 -> 274 bytes app/src/gambas3/img/component/unknown.png | Bin 0 -> 304 bytes app/src/gambas3/img/contrib/Radoslav.gif | Bin 0 -> 2405 bytes app/src/gambas3/img/control/button.png | Bin 0 -> 598 bytes app/src/gambas3/img/control/checkbox.png | Bin 0 -> 198 bytes app/src/gambas3/img/control/columnview.png | Bin 0 -> 157 bytes app/src/gambas3/img/control/combobox.png | Bin 0 -> 312 bytes app/src/gambas3/img/control/dial.png | Bin 0 -> 745 bytes app/src/gambas3/img/control/dnsclient.png | Bin 0 -> 1192 bytes app/src/gambas3/img/control/drawingarea.png | Bin 0 -> 652 bytes app/src/gambas3/img/control/editor.png | Bin 0 -> 350 bytes app/src/gambas3/img/control/embedder.png | Bin 0 -> 1510 bytes app/src/gambas3/img/control/frame.png | Bin 0 -> 554 bytes app/src/gambas3/img/control/ftpclient.png | Bin 0 -> 1128 bytes app/src/gambas3/img/control/glarea.png | Bin 0 -> 1617 bytes app/src/gambas3/img/control/gridview.png | Bin 0 -> 155 bytes app/src/gambas3/img/control/hbox.png | Bin 0 -> 189 bytes app/src/gambas3/img/control/hpanel.png | Bin 0 -> 191 bytes app/src/gambas3/img/control/hsplit.png | Bin 0 -> 207 bytes app/src/gambas3/img/control/httpclient.png | Bin 0 -> 1170 bytes app/src/gambas3/img/control/iconview.png | Bin 0 -> 145 bytes app/src/gambas3/img/control/label.png | Bin 0 -> 621 bytes app/src/gambas3/img/control/lcdnumber.png | Bin 0 -> 442 bytes app/src/gambas3/img/control/listbox.png | Bin 0 -> 135 bytes app/src/gambas3/img/control/listview.png | Bin 0 -> 141 bytes app/src/gambas3/img/control/moviebox.png | Bin 0 -> 493 bytes app/src/gambas3/img/control/panel.png | Bin 0 -> 138 bytes app/src/gambas3/img/control/picturebox.png | Bin 0 -> 237 bytes app/src/gambas3/img/control/printer.png | Bin 0 -> 171 bytes app/src/gambas3/img/control/progressbar.png | Bin 0 -> 176 bytes app/src/gambas3/img/control/radiobutton.png | Bin 0 -> 502 bytes app/src/gambas3/img/control/scrollarea.png | Bin 0 -> 642 bytes app/src/gambas3/img/control/scrollbar.png | Bin 0 -> 209 bytes app/src/gambas3/img/control/scrollview.png | Bin 0 -> 180 bytes app/src/gambas3/img/control/select.png | Bin 0 -> 984 bytes app/src/gambas3/img/control/separator.png | Bin 0 -> 133 bytes app/src/gambas3/img/control/serialport.png | Bin 0 -> 419 bytes app/src/gambas3/img/control/serversocket.png | Bin 0 -> 484 bytes app/src/gambas3/img/control/slider.png | Bin 0 -> 262 bytes app/src/gambas3/img/control/socket.png | Bin 0 -> 358 bytes app/src/gambas3/img/control/spinbox.png | Bin 0 -> 213 bytes app/src/gambas3/img/control/spring.png | Bin 0 -> 165 bytes app/src/gambas3/img/control/tabstrip.png | Bin 0 -> 236 bytes app/src/gambas3/img/control/textarea.png | Bin 0 -> 460 bytes app/src/gambas3/img/control/textbox.png | Bin 0 -> 483 bytes app/src/gambas3/img/control/textedit.png | Bin 0 -> 966 bytes app/src/gambas3/img/control/textlabel.png | Bin 0 -> 736 bytes app/src/gambas3/img/control/timer.png | Bin 0 -> 493 bytes app/src/gambas3/img/control/togglebutton.png | Bin 0 -> 252 bytes app/src/gambas3/img/control/toolbutton.png | Bin 0 -> 631 bytes app/src/gambas3/img/control/trayicon.png | Bin 0 -> 583 bytes app/src/gambas3/img/control/treeview.png | Bin 0 -> 172 bytes app/src/gambas3/img/control/udpsocket.png | Bin 0 -> 640 bytes app/src/gambas3/img/control/unknown.png | Bin 0 -> 125 bytes app/src/gambas3/img/control/vbox.png | Bin 0 -> 191 bytes app/src/gambas3/img/control/voidbutton.png | Bin 0 -> 445 bytes app/src/gambas3/img/control/vpanel.png | Bin 0 -> 200 bytes app/src/gambas3/img/control/vsplit.png | Bin 0 -> 219 bytes app/src/gambas3/img/control/webview.png | Bin 0 -> 1076 bytes app/src/gambas3/img/draw/cap-butt.png | Bin 0 -> 141 bytes app/src/gambas3/img/draw/cap-round.png | Bin 0 -> 288 bytes app/src/gambas3/img/draw/cap-square.png | Bin 0 -> 146 bytes app/src/gambas3/img/draw/duplicate.png | Bin 0 -> 155 bytes app/src/gambas3/img/draw/invert.png | Bin 0 -> 182 bytes app/src/gambas3/img/draw/join-bevel.png | Bin 0 -> 202 bytes app/src/gambas3/img/draw/join-miter.png | Bin 0 -> 146 bytes app/src/gambas3/img/draw/join-round.png | Bin 0 -> 289 bytes app/src/gambas3/img/draw/move.png | Bin 0 -> 163 bytes app/src/gambas3/img/draw/offset.png | Bin 0 -> 157 bytes app/src/gambas3/img/draw/scroll-dark.png | Bin 0 -> 212 bytes app/src/gambas3/img/draw/scroll.png | Bin 0 -> 219 bytes app/src/gambas3/img/draw/shgrid.png | Bin 0 -> 133 bytes app/src/gambas3/img/draw/text.png | Bin 0 -> 173 bytes app/src/gambas3/img/family/column-invert.png | Bin 0 -> 153 bytes app/src/gambas3/img/family/column.png | Bin 0 -> 150 bytes app/src/gambas3/img/family/expand.png | Bin 0 -> 155 bytes app/src/gambas3/img/family/fill.png | Bin 0 -> 138 bytes .../gambas3/img/family/horizontal-invert.png | Bin 0 -> 142 bytes app/src/gambas3/img/family/horizontal.png | Bin 0 -> 140 bytes app/src/gambas3/img/family/hsplit.png | Bin 0 -> 144 bytes app/src/gambas3/img/family/row-invert.png | Bin 0 -> 152 bytes app/src/gambas3/img/family/row.png | Bin 0 -> 151 bytes .../gambas3/img/family/vertical-invert.png | Bin 0 -> 141 bytes app/src/gambas3/img/family/vertical.png | Bin 0 -> 139 bytes app/src/gambas3/img/family/vsplit.png | Bin 0 -> 150 bytes app/src/gambas3/img/logo/archlinux.png | Bin 0 -> 2137 bytes app/src/gambas3/img/logo/autotools.png | Bin 0 -> 2115 bytes app/src/gambas3/img/logo/debian.png | Bin 0 -> 2277 bytes app/src/gambas3/img/logo/fedora.png | Bin 0 -> 2846 bytes app/src/gambas3/img/logo/folder.png | Bin 0 -> 2647 bytes app/src/gambas3/img/logo/gambas.svg | 540 + app/src/gambas3/img/logo/head-16.png | Bin 0 -> 514 bytes app/src/gambas3/img/logo/head-256.png | Bin 0 -> 14310 bytes app/src/gambas3/img/logo/head-32.png | Bin 0 -> 946 bytes app/src/gambas3/img/logo/logo-ide.png | Bin 0 -> 6834 bytes app/src/gambas3/img/logo/logo.png | Bin 0 -> 5164 bytes app/src/gambas3/img/logo/mageia.png | Bin 0 -> 1967 bytes app/src/gambas3/img/logo/mandriva.png | Bin 0 -> 2048 bytes app/src/gambas3/img/logo/package-gnu.png | Bin 0 -> 3166 bytes app/src/gambas3/img/logo/project.png | Bin 0 -> 1242 bytes app/src/gambas3/img/logo/redhat.png | Bin 0 -> 1373 bytes app/src/gambas3/img/logo/self-extractible.png | Bin 0 -> 2595 bytes app/src/gambas3/img/logo/slackware.png | Bin 0 -> 3840 bytes app/src/gambas3/img/logo/suse.png | Bin 0 -> 2386 bytes app/src/gambas3/img/logo/ubuntu.png | Bin 0 -> 2113 bytes app/src/gambas3/img/module/class.png | Bin 0 -> 594 bytes app/src/gambas3/img/module/form.png | Bin 0 -> 136 bytes app/src/gambas3/img/module/module.png | Bin 0 -> 368 bytes app/src/gambas3/img/module/report.png | Bin 0 -> 165 bytes app/src/gambas3/img/module/termform.png | Bin 0 -> 161 bytes app/src/gambas3/img/module/test.png | Bin 0 -> 222 bytes app/src/gambas3/img/module/webform.png | Bin 0 -> 673 bytes app/src/gambas3/img/module/webpage.png | Bin 0 -> 304 bytes app/src/gambas3/img/search.png | Bin 0 -> 2518 bytes app/src/gambas3/img/symbol/constant.png | Bin 0 -> 127 bytes app/src/gambas3/img/symbol/control.png | Bin 0 -> 129 bytes app/src/gambas3/img/symbol/event.png | Bin 0 -> 276 bytes app/src/gambas3/img/symbol/method.png | Bin 0 -> 313 bytes app/src/gambas3/img/symbol/property-ro.png | Bin 0 -> 127 bytes app/src/gambas3/img/symbol/property.png | Bin 0 -> 129 bytes app/src/gambas3/img/symbol/s-method.png | Bin 0 -> 390 bytes app/src/gambas3/img/symbol/s-property-ro.png | Bin 0 -> 138 bytes app/src/gambas3/img/symbol/s-property.png | Bin 0 -> 141 bytes app/src/gambas3/img/symbol/s-special.png | Bin 0 -> 375 bytes app/src/gambas3/img/symbol/s-variable.png | Bin 0 -> 141 bytes app/src/gambas3/img/symbol/special.png | Bin 0 -> 313 bytes app/src/gambas3/img/symbol/symbol.png | Bin 0 -> 210 bytes app/src/gambas3/img/symbol/unknown.png | Bin 0 -> 243 bytes app/src/gambas3/img/symbol/variable.png | Bin 0 -> 129 bytes app/src/gambas3/img/waiting.gif | Bin 0 -> 4931 bytes app/src/gambas3/install/Makefile.am | 64 + app/src/gambas3/install/acinclude.m4 | 161 + app/src/gambas3/install/categories | 136 + app/src/gambas3/install/group/archlinux | 51 + app/src/gambas3/install/group/autotools | 1 + app/src/gambas3/install/group/debian | 57 + app/src/gambas3/install/group/fedora | 34 + app/src/gambas3/install/group/mageia | 132 + app/src/gambas3/install/group/mandriva | 99 + app/src/gambas3/install/group/self | 1 + app/src/gambas3/install/group/slackware | 34 + app/src/gambas3/install/group/suse | 225 + app/src/gambas3/install/group/ubuntu | 57 + app/src/gambas3/install/menu/archlinux | 64 + app/src/gambas3/install/menu/autotools | 1 + app/src/gambas3/install/menu/debian | 64 + app/src/gambas3/install/menu/fedora | 109 + app/src/gambas3/install/menu/mageia | 111 + app/src/gambas3/install/menu/mandriva | 111 + app/src/gambas3/install/menu/self | 1 + app/src/gambas3/install/menu/slackware | 109 + app/src/gambas3/install/menu/suse | 109 + app/src/gambas3/install/menu/ubuntu | 64 + app/src/gambas3/install/slack-desc-header | 7 + app/src/gambas3/layout/$compact.layout | 23 + app/src/gambas3/layout/$default.layout | 23 + app/src/gambas3/license | 15 + app/src/gambas3/po-header.txt | 10 + app/src/gambas3/pot-header.txt | 10 + app/src/gambas3/shortcut.desktop | 10 + app/src/gambas3/snippets | 97 + app/src/gambas3/support.txt | 156 + app/src/gambas3/tags.txt | 19 + app/src/gambas3/template/CClass.class | 9 + app/src/gambas3/template/CContainer.class | 9 + app/src/gambas3/template/CControl.class | 29 + app/src/gambas3/template/FMain.class | 9 + app/src/gambas3/template/FMain.form | 6 + app/src/gambas3/template/FTest.class | 9 + app/src/gambas3/template/FTest.form | 5 + app/src/gambas3/template/MMain.module | 5 + app/src/gambas3/template/MTest.module | 9 + app/src/gambas3/template/_project | 108 + app/src/gambas3/template/ccontainer.png | Bin 0 -> 1606 bytes app/src/gambas3/template/ccontrol.png | Bin 0 -> 1606 bytes app/src/gambas3/template/list | 22 + app/src/gambas3/theme/amber | 23 + app/src/gambas3/theme/amethyst | 23 + app/src/gambas3/theme/blues | 24 + app/src/gambas3/theme/emerald | 23 + app/src/gambas3/theme/gambas | 23 + app/src/gambas3/theme/obsidian | 24 + app/src/gambas3/theme/pastel | 24 + app/src/gambas3/theme/quest | 23 + app/src/gambas3/theme/quick | 24 + app/src/gambas3/theme/ruby | 23 + app/src/gambas3/theme/sapphire | 24 + app/src/gambas3/theme/visual | 23 + app/src/gambas3/theme/zen | 24 + app/src/gambas3/tips/tips.ca | 463 + app/src/gambas3/tips/tips.cs | 547 + app/src/gambas3/tips/tips.de | 417 + app/src/gambas3/tips/tips.en | 592 + app/src/gambas3/tips/tips.es | 302 + app/src/gambas3/tips/tips.fr | 604 + app/src/gambas3/tips/tips.it | 527 + app/src/gambas3/tips/tips.nl | 274 + app/src/gambas3/tips/tips.pl | 280 + app/src/gambas3/tips/tips.ru | 578 + app/src/gambas3/tips/tips.sl | 236 + app/src/gambas3/tips/tips.sv | 401 + app/src/gambas3/tips/tips.tr | 278 + app/src/gambas3/tips/tips.zh | 341 + app/src/gambas3/tips/tips.zh_TW | 442 + app/src/gambas3/usage | 29 + app/src/gambas3/welcome/bells.mp3 | Bin 0 -> 139443 bytes app/src/gambas3/welcome/border.png | Bin 0 -> 445 bytes app/src/gambas3/welcome/corner.png | Bin 0 -> 2845 bytes app/src/gambas3/welcome/fir.png | Bin 0 -> 6977 bytes app/src/gambas3/welcome/snowflake.png | Bin 0 -> 5197 bytes app/src/gambas3/welcome/spiritus.mp3 | Bin 0 -> 131582 bytes app/src/gb.wiki/.directory | 2 + app/src/gb.wiki/.icon.png | Bin 0 -> 4229 bytes app/src/gb.wiki/.lang/it.po | 193 + app/src/gb.wiki/.lang/nl.po | 188 + app/src/gb.wiki/.lang/pt_BR.po | 190 + app/src/gb.wiki/.lang/ru.po | 210 + app/src/gb.wiki/.lang/zh.po | 188 + app/src/gb.wiki/.project | 15 + app/src/gb.wiki/.src/Actions.module | 189 + app/src/gb.wiki/.src/Controllers/Admin.module | 115 + app/src/gb.wiki/.src/Controllers/Image.module | 42 + .../.src/Controllers/UserManage.module | 109 + app/src/gb.wiki/.src/Controllers/Wiki.module | 64 + app/src/gb.wiki/.src/DBScheme.class | 21 + app/src/gb.wiki/.src/Main.module | 253 + app/src/gb.wiki/.src/Models/Comments.module | 2 + app/src/gb.wiki/.src/Models/Pages.module | 58 + app/src/gb.wiki/.src/Models/Users.module | 163 + app/src/gb.wiki/.src/Models/_Page.class | 171 + app/src/gb.wiki/.src/Models/_User.class | 162 + app/src/gb.wiki/.src/Parser.module | 1223 + app/src/gb.wiki/.src/Path.module | 120 + .../gb.wiki/.src/Views/Admin/WAdminMain.class | 2 + .../.src/Views/Admin/WAdminMain.webpage | 78 + app/src/gb.wiki/.src/Views/WAccount.class | 2 + app/src/gb.wiki/.src/Views/WAccount.webpage | 52 + app/src/gb.wiki/.src/Views/WEdit.class | 2 + app/src/gb.wiki/.src/Views/WEdit.webpage | 27 + app/src/gb.wiki/.src/Views/WHeader.class | 190 + app/src/gb.wiki/.src/Views/WHeader.webpage | 242 + app/src/gb.wiki/.src/Views/WLogin.class | 2 + app/src/gb.wiki/.src/Views/WLogin.webpage | 23 + app/src/gb.wiki/.src/Views/WWiki.class | 1 + app/src/gb.wiki/.src/Views/WWiki.webpage | 17 + app/src/gb.wiki/help.png | Bin 0 -> 1563 bytes app/src/gbs3/.directory | 2 + app/src/gbs3/.icon.png | Bin 0 -> 17137 bytes app/src/gbs3/.project | 18 + app/src/gbs3/.src/CComponent.class | 307 + app/src/gbs3/.src/MMain.module | 662 + app/src/gbs3/.src/MServerPage.module | 145 + app/src/gbs3/icon.png | Bin 0 -> 1528 bytes app/src/gbs3/license | 6 + app/src/gbs3/usage-gbs | 15 + app/src/gbs3/usage-gbw | 13 + app/template/console/.directory | 2 + app/template/console/.icon.png | Bin 0 -> 7173 bytes app/template/console/.lang/es.po | 19 + app/template/console/.lang/es_ES.po | 19 + app/template/console/.lang/fr.po | 19 + app/template/console/.lang/ru.po | 34 + app/template/console/.project | 11 + app/template/console/.src/Main.module | 7 + app/template/console/icon.png | Bin 0 -> 264 bytes app/template/database/.directory | 2 + app/template/database/.icon.png | Bin 0 -> 6607 bytes app/template/database/.lang/fr.po | 19 + app/template/database/.lang/ru.po | 34 + app/template/database/.project | 16 + app/template/database/.src/FMain.class | 2 + app/template/database/.src/FMain.form | 5 + app/template/database/icon.png | Bin 0 -> 147 bytes app/template/graphical/.directory | 2 + app/template/graphical/.icon.png | Bin 0 -> 9715 bytes app/template/graphical/.lang/es.po | 19 + app/template/graphical/.lang/es_ES.po | 19 + app/template/graphical/.lang/fr.po | 19 + app/template/graphical/.lang/ru.po | 34 + app/template/graphical/.project | 14 + app/template/graphical/.src/FMain.class | 2 + app/template/graphical/.src/FMain.form | 5 + app/template/graphical/icon.png | Bin 0 -> 429 bytes app/template/gtk2/.directory | 2 + app/template/gtk2/.icon.png | Bin 0 -> 13010 bytes app/template/gtk2/.lang/es.po | 19 + app/template/gtk2/.lang/es_ES.po | 19 + app/template/gtk2/.lang/fr.po | 19 + app/template/gtk2/.lang/ru.po | 34 + app/template/gtk2/.project | 14 + app/template/gtk2/.src/FMain.class | 2 + app/template/gtk2/.src/FMain.form | 5 + app/template/gtk2/icon.png | Bin 0 -> 644 bytes app/template/gtk3/.directory | 2 + app/template/gtk3/.icon.png | Bin 0 -> 13132 bytes app/template/gtk3/.lang/es.po | 19 + app/template/gtk3/.lang/fr.po | 19 + app/template/gtk3/.lang/ru.po | 34 + app/template/gtk3/.project | 14 + app/template/gtk3/.src/FMain.class | 2 + app/template/gtk3/.src/FMain.form | 5 + app/template/gtk3/icon.png | Bin 0 -> 647 bytes app/template/qt/.directory | 2 + app/template/qt/.icon.png | Bin 0 -> 13190 bytes app/template/qt/.lang/es.po | 19 + app/template/qt/.lang/es_ES.po | 19 + app/template/qt/.lang/fr.po | 19 + app/template/qt/.lang/ru.po | 34 + app/template/qt/.project | 14 + app/template/qt/.src/FMain.class | 2 + app/template/qt/.src/FMain.form | 5 + app/template/qt/icon.png | Bin 0 -> 769 bytes app/template/sdl/.directory | 2 + app/template/sdl/.icon.png | Bin 0 -> 10332 bytes app/template/sdl/.lang/es.po | 19 + app/template/sdl/.lang/es_ES.po | 19 + app/template/sdl/.lang/fr.po | 19 + app/template/sdl/.lang/ru.po | 34 + app/template/sdl/.project | 14 + app/template/sdl/.src/MMain.module | 40 + app/template/sdl/icon.png | Bin 0 -> 538 bytes app/template/web/.directory | 2 + app/template/web/.icon.png | Bin 0 -> 14817 bytes app/template/web/.lang/es.po | 19 + app/template/web/.lang/es_ES.po | 19 + app/template/web/.lang/fr.po | 19 + app/template/web/.lang/ru.po | 34 + app/template/web/.project | 14 + app/template/web/.src/Main.class | 2 + app/template/web/.src/Main.webpage | 27 + app/template/web/icon.png | Bin 0 -> 775 bytes app/template/webform/.directory | 2 + app/template/webform/.icon.png | Bin 0 -> 12020 bytes app/template/webform/.lang/fr.po | 27 + app/template/webform/.lang/ru.po | 42 + app/template/webform/.project | 16 + app/template/webform/.src/Webform1.class | 22 + app/template/webform/.src/Webform1.webform | 27 + app/template/webform/icon.png | Bin 0 -> 668 bytes app/template/~subversion/.directory | 2 + app/template/~subversion/.icon.png | Bin 0 -> 9478 bytes app/template/~subversion/.lang/es.po | 19 + app/template/~subversion/.lang/es_ES.po | 19 + app/template/~subversion/.lang/fr.po | 19 + app/template/~subversion/.lang/ru.po | 34 + app/template/~subversion/.project | 11 + app/template/~subversion/.src/Main.module | 7 + app/template/~subversion/icon.png | Bin 0 -> 465 bytes benchmark/benchmark.gbs | 136 + benchmark/mandelbrot.gbs | 80 + benchmark/mandelbrot.pl | 75 + benchmark/mandelbrot.py | 54 + benchmark/nbody.gbs | 212 + benchmark/nbody.pl | 112 + benchmark/nbody.py | 120 + benchmark/polynom.gbs | 34 + benchmark/polynom.pl | 35 + benchmark/polynom.py | 23 + benchmark/primes.gbs | 61 + benchmark/primes.pl | 44 + benchmark/primes.py | 30 + benchmark/sort.gbs | 69 + benchmark/sort.pl | 129 + benchmark/sort.py | 115 + benchmark/string.gbs | 23 + benchmark/string.pl | 18 + benchmark/string.py | 23 + benchmark/string2.gbs | 17 + benchmark/string2.pl | 16 + benchmark/string2.py | 11 + build-dist | 34 + comp/AUTHORS | 0 comp/COPYING | 1 + comp/ChangeLog | 0 comp/INSTALL | 231 + comp/Makefile.am | 52 + comp/NEWS | 0 comp/README | 0 comp/TODO | 0 comp/acinclude.m4 | 1 + comp/configure.ac | 16 + comp/reconf | 1 + comp/src/gb.args/.component | 4 + comp/src/gb.args/.directory | 2 + comp/src/gb.args/.icon.png | Bin 0 -> 10569 bytes comp/src/gb.args/.lang/cs.po | 36 + comp/src/gb.args/.lang/es.po | 35 + comp/src/gb.args/.lang/es_ES.po | 35 + comp/src/gb.args/.lang/fr.po | 35 + comp/src/gb.args/.lang/it.po | 35 + comp/src/gb.args/.lang/nl.po | 36 + comp/src/gb.args/.lang/pt_BR.po | 36 + comp/src/gb.args/.lang/ru.po | 50 + comp/src/gb.args/.lang/zh.po | 36 + comp/src/gb.args/.project | 12 + comp/src/gb.args/.src/Args.module | 214 + comp/src/gb.args/.src/MMain.module | 16 + comp/src/gb.chart/.component | 7 + comp/src/gb.chart/.directory | 2 + comp/src/gb.chart/.icon.png | Bin 0 -> 10569 bytes comp/src/gb.chart/.project | 15 + comp/src/gb.chart/.src/CPoint.class | 13 + comp/src/gb.chart/.src/CRect.class | 16 + comp/src/gb.chart/.src/Chart.class | 376 + comp/src/gb.chart/.src/ChartStyle.class | 9 + comp/src/gb.chart/.src/ChartType.class | 33 + comp/src/gb.chart/.src/FTest.class | 510 + comp/src/gb.chart/.src/FTest.form | 234 + comp/src/gb.chart/.src/FTest2.class | 45 + comp/src/gb.chart/.src/FTest2.form | 19 + comp/src/gb.chart/.src/MTools.module | 376 + comp/src/gb.chart/.src/Styles/_CSerie.class | 151 + .../gb.chart/.src/Styles/_CStyleAreas.class | 135 + .../src/gb.chart/.src/Styles/_CStyleBar.class | 109 + .../gb.chart/.src/Styles/_CStyleColumns.class | 113 + .../gb.chart/.src/Styles/_CStyleLine.class | 122 + .../src/gb.chart/.src/Styles/_CStylePie.class | 106 + .../gb.chart/.src/Styles/_CStylePlot.class | 94 + comp/src/gb.chart/.src/_CAxes.class | 89 + comp/src/gb.chart/.src/_CHeaders.class | 103 + comp/src/gb.chart/.src/_CLabel.class | 41 + comp/src/gb.chart/.src/_CLabels.class | 3 + comp/src/gb.chart/.src/_CLegend.class | 206 + comp/src/gb.chart/.src/_CTitle.class | 53 + comp/src/gb.chart/.src/_CXAxe.class | 25 + comp/src/gb.chart/.src/_CYAxe.class | 22 + comp/src/gb.chart/.src/_Colors.class | 65 + comp/src/gb.chart/img/areas.png | Bin 0 -> 308 bytes comp/src/gb.chart/img/areasnormal.png | Bin 0 -> 278 bytes comp/src/gb.chart/img/areaspercent.png | Bin 0 -> 226 bytes comp/src/gb.chart/img/areasstacked.png | Bin 0 -> 308 bytes comp/src/gb.chart/img/bars.png | Bin 0 -> 235 bytes comp/src/gb.chart/img/barsnormal.png | Bin 0 -> 204 bytes comp/src/gb.chart/img/barspercent.png | Bin 0 -> 172 bytes comp/src/gb.chart/img/barsstacked.png | Bin 0 -> 177 bytes comp/src/gb.chart/img/columns.png | Bin 0 -> 201 bytes .../gb.chart/img/columnslinecombination.png | Bin 0 -> 249 bytes comp/src/gb.chart/img/columnsnormal.png | Bin 0 -> 195 bytes comp/src/gb.chart/img/columnspercent.png | Bin 0 -> 194 bytes comp/src/gb.chart/img/columnsstacked.png | Bin 0 -> 191 bytes comp/src/gb.chart/img/lines.png | Bin 0 -> 307 bytes comp/src/gb.chart/img/linesnormal.png | Bin 0 -> 307 bytes comp/src/gb.chart/img/linespercent.png | Bin 0 -> 217 bytes comp/src/gb.chart/img/linesstacked.png | Bin 0 -> 309 bytes comp/src/gb.chart/img/linessymbols.png | Bin 0 -> 322 bytes comp/src/gb.chart/img/net.png | Bin 0 -> 334 bytes comp/src/gb.chart/img/pie.png | Bin 0 -> 290 bytes comp/src/gb.chart/img/pienormal.png | Bin 0 -> 290 bytes comp/src/gb.chart/img/pieoffset1.png | Bin 0 -> 315 bytes comp/src/gb.chart/img/pieoffset2.png | Bin 0 -> 333 bytes comp/src/gb.chart/img/pierings.png | Bin 0 -> 367 bytes comp/src/gb.chart/img/plots.png | Bin 0 -> 229 bytes comp/src/gb.chart/img/plotsnormal.png | Bin 0 -> 229 bytes comp/src/gb.chart/img/stockchart.png | Bin 0 -> 246 bytes comp/src/gb.db.form/.component | 6 + .../.connection/Connection1.connection | 8 + .../.connection/Connection2.connection | 11 + .../.connection/Connection3.connection | 12 + .../.connection/Connection4.connection | 12 + comp/src/gb.db.form/.directory | 2 + .../.hidden/control/databrowser.png | Bin 0 -> 184 bytes .../.hidden/control/datacheckbox.png | Bin 0 -> 169 bytes .../gb.db.form/.hidden/control/datacombo.png | Bin 0 -> 281 bytes .../.hidden/control/datacomboview.png | Bin 0 -> 243 bytes .../.hidden/control/datacontrol.png | Bin 0 -> 439 bytes .../gb.db.form/.hidden/control/datasource.png | Bin 0 -> 132 bytes .../gb.db.form/.hidden/control/dataview.png | Bin 0 -> 151 bytes comp/src/gb.db.form/.icon.png | Bin 0 -> 5464 bytes comp/src/gb.db.form/.lang/ca.po | 156 + comp/src/gb.db.form/.lang/cs.po | 152 + comp/src/gb.db.form/.lang/de.po | 152 + comp/src/gb.db.form/.lang/es.po | 203 + comp/src/gb.db.form/.lang/es_ES.po | 203 + comp/src/gb.db.form/.lang/fr.po | 302 + comp/src/gb.db.form/.lang/it.po | 119 + comp/src/gb.db.form/.lang/nl.po | 120 + comp/src/gb.db.form/.lang/pt_BR.po | 119 + comp/src/gb.db.form/.lang/ru.po | 210 + comp/src/gb.db.form/.lang/sv.po | 100 + comp/src/gb.db.form/.lang/zh.po | 207 + comp/src/gb.db.form/.project | 22 + comp/src/gb.db.form/.src/Common.module | 110 + comp/src/gb.db.form/.src/DataBrowser.class | 210 + comp/src/gb.db.form/.src/DataCheckBox.class | 163 + comp/src/gb.db.form/.src/DataCombo.class | 344 + comp/src/gb.db.form/.src/DataComboView.class | 482 + comp/src/gb.db.form/.src/DataConnection.class | 147 + comp/src/gb.db.form/.src/DataControl.class | 385 + comp/src/gb.db.form/.src/DataField.class | 82 + comp/src/gb.db.form/.src/DataSource.class | 784 + comp/src/gb.db.form/.src/DataTable.class | 454 + comp/src/gb.db.form/.src/DataTree.class | 145 + comp/src/gb.db.form/.src/DataView.class | 1298 + comp/src/gb.db.form/.src/FBlobEditor.class | 229 + comp/src/gb.db.form/.src/FBlobEditor.form | 49 + comp/src/gb.db.form/.src/FBrowser.class | 272 + comp/src/gb.db.form/.src/FBrowser.form | 75 + comp/src/gb.db.form/.src/Test/FMain.class | 9 + comp/src/gb.db.form/.src/Test/FMain.form | 16 + comp/src/gb.db.form/.src/Test/FMain2.class | 74 + comp/src/gb.db.form/.src/Test/FMain2.form | 139 + comp/src/gb.db.form/.src/Test/FMain3.class | 8 + comp/src/gb.db.form/.src/Test/FMain3.form | 33 + comp/src/gb.db.form/.src/Test/FTest.class | 36 + comp/src/gb.db.form/.src/Test/FTest.form | 62 + comp/src/gb.db.form/.src/Test/Main.module | 24 + comp/src/gb.dbus.trayicon/.component | 7 + comp/src/gb.dbus.trayicon/.directory | 2 + .../.hidden/com.canonical.dbusmenu.xml | 437 + comp/src/gb.dbus.trayicon/.hidden/doc.txt | 167 + comp/src/gb.dbus.trayicon/.icon.png | Bin 0 -> 10569 bytes comp/src/gb.dbus.trayicon/.project | 14 + .../.src/DBusStatusIcon.class | 348 + .../.src/DBusStatusIconMenu.class | 265 + comp/src/gb.dbus.trayicon/.src/FMain.class | 60 + comp/src/gb.dbus.trayicon/.src/FMain.form | 18 + comp/src/gb.dbus.trayicon/.src/FTest.class | 94 + comp/src/gb.dbus.trayicon/.src/FTest.form | 70 + comp/src/gb.dbus.trayicon/.src/Main.module | 56 + comp/src/gb.dbus.trayicon/.src/TrayIcon.class | 322 + .../src/gb.dbus.trayicon/.src/TrayIcons.class | 44 + .../gb.dbus.trayicon/.src/_DBusMenuItem.class | 6 + .../.src/_DBusMenuLayout.class | 6 + .../.src/_DBusMenuProperties.class | 6 + .../.src/_DBusStatusIconPixmap.class | 29 + .../.src/_DBusStatusIconTooltip.class | 16 + .../src/gb.dbus.trayicon/.src/_DBusUInt.class | 16 + comp/src/gb.dbus.trayicon/default.png | Bin 0 -> 9744 bytes comp/src/gb.desktop/.component | 6 + comp/src/gb.desktop/.directory | 2 + .../.hidden/control/desktopwatcher.png | Bin 0 -> 2758 bytes .../.hidden/xdg-utils-1.0.2/LICENSE | 18 + .../.hidden/xdg-utils-1.0.2/scripts/README | 17 + .../xdg-utils-1.0.2/scripts/xdg-desktop-icon | 549 + .../xdg-utils-1.0.2/scripts/xdg-desktop-menu | 1264 + .../.hidden/xdg-utils-1.0.2/scripts/xdg-email | 640 + .../xdg-utils-1.0.2/scripts/xdg-icon-resource | 837 + .../.hidden/xdg-utils-1.0.2/scripts/xdg-mime | 1090 + .../.hidden/xdg-utils-1.0.2/scripts/xdg-open | 436 + .../xdg-utils-1.0.2/scripts/xdg-screensaver | 786 + .../xdg-utils-1.0.3.pre.patch/xdg-email | 730 + .../.hidden/xdg-utils-1.0.3.pre/xdg-copy | 303 + .../xdg-utils-1.0.3.pre/xdg-desktop-icon | 559 + .../xdg-utils-1.0.3.pre/xdg-desktop-menu | 1224 + .../.hidden/xdg-utils-1.0.3.pre/xdg-email | 723 + .../xdg-utils-1.0.3.pre/xdg-file-dialog | 603 + .../xdg-utils-1.0.3.pre/xdg-icon-resource | 841 + .../.hidden/xdg-utils-1.0.3.pre/xdg-mime | 1212 + .../.hidden/xdg-utils-1.0.3.pre/xdg-open | 523 + .../xdg-utils-1.0.3.pre/xdg-screensaver | 888 + .../.hidden/xdg-utils-1.0.3.pre/xdg-settings | 872 + .../.hidden/xdg-utils-1.0.3.pre/xdg-su | 438 + .../.hidden/xdg-utils-1.0.3.pre/xdg-terminal | 462 + comp/src/gb.desktop/.icon.png | Bin 0 -> 10933 bytes comp/src/gb.desktop/.project | 16 + comp/src/gb.desktop/.src/Atom.class | 19 + comp/src/gb.desktop/.src/Desktop.class | 634 + comp/src/gb.desktop/.src/DesktopFile.class | 710 + comp/src/gb.desktop/.src/DesktopMime.class | 504 + comp/src/gb.desktop/.src/DesktopWatcher.class | 97 + comp/src/gb.desktop/.src/DesktopWindow.class | 329 + comp/src/gb.desktop/.src/Main.module | 306 + comp/src/gb.desktop/.src/Tests/Form1.class | 74 + comp/src/gb.desktop/.src/Tests/Form1.form | 25 + comp/src/gb.desktop/.src/Tests/Form11.class | 2 + comp/src/gb.desktop/.src/Tests/Form11.form | 11 + comp/src/gb.desktop/.src/Tests/Form2.class | 35 + comp/src/gb.desktop/.src/Tests/Form2.form | 10 + comp/src/gb.desktop/.src/Tests/Module1.module | 7 + comp/src/gb.desktop/.src/_DesktopIcons.class | 16 + comp/src/gb.desktop/.src/_DesktopMenus.class | 15 + .../src/gb.desktop/.src/_DesktopVirtual.class | 100 + .../gb.desktop/.src/_Desktop_Passwords.class | 185 + .../.src/_Desktop_ScreenSaver.class | 45 + .../gb.desktop/.src/_Desktop_Windows.class | 83 + .../src/gb.desktop/xdg-utils/xdg-desktop-icon | 758 + .../src/gb.desktop/xdg-utils/xdg-desktop-menu | 1448 + comp/src/gb.desktop/xdg-utils/xdg-email | 1037 + .../gb.desktop/xdg-utils/xdg-icon-resource | 1054 + comp/src/gb.desktop/xdg-utils/xdg-mime | 1585 + comp/src/gb.desktop/xdg-utils/xdg-open | 1066 + comp/src/gb.desktop/xdg-utils/xdg-screensaver | 1428 + comp/src/gb.desktop/xdg-utils/xdg-settings | 1390 + comp/src/gb.eval.highlight/.component | 4 + comp/src/gb.eval.highlight/.directory | 2 + comp/src/gb.eval.highlight/.icon.png | Bin 0 -> 10569 bytes comp/src/gb.eval.highlight/.project | 12 + comp/src/gb.eval.highlight/.src/Init.module | 167 + comp/src/gb.eval.highlight/.src/Main.module | 59 + .../.src/OldHighlighter/Helper.module | 71 + .../.src/OldHighlighter/Highlight.class | 75 + .../.src/OldHighlighter/HighlightC.module | 274 + .../OldHighlighter/HighlightCPlusPlus.module | 53 + .../.src/OldHighlighter/HighlightCSS.module | 243 + .../.src/OldHighlighter/HighlightDiff.module | 34 + .../.src/OldHighlighter/HighlightHTML.module | 538 + .../OldHighlighter/HighlightJavascript.module | 287 + .../.src/OldHighlighter/HighlightSQL.module | 159 + .../.src/TextHighlighter.class | 789 + .../.src/TextHighlighterStyle.class | 20 + .../.src/TextHighlighter_C.class | 282 + .../.src/TextHighlighter_CPlusPlus.class | 57 + .../.src/TextHighlighter_CSS.class | 294 + .../.src/TextHighlighter_Diff.class | 35 + .../.src/TextHighlighter_Gambas.class | 78 + .../.src/TextHighlighter_Html.class | 562 + .../.src/TextHighlighter_Javascript.class | 288 + .../.src/TextHighlighter_SQL.class | 171 + .../.src/TextHighlighter_WebPage.class | 11 + comp/src/gb.eval.highlight/css/properties | 232 + comp/src/gb.eval.highlight/css/values | 289 + comp/src/gb.eval.highlight/sql/datatypes | 67 + comp/src/gb.eval.highlight/sql/functions | 206 + comp/src/gb.eval.highlight/sql/keywords | 543 + comp/src/gb.eval.highlight/sql/operators | 58 + comp/src/gb.form.dialog/.component | 6 + comp/src/gb.form.dialog/.directory | 2 + comp/src/gb.form.dialog/.icon.png | Bin 0 -> 10569 bytes comp/src/gb.form.dialog/.lang/ca.po | 44 + comp/src/gb.form.dialog/.lang/cs.po | 42 + comp/src/gb.form.dialog/.lang/de.po | 42 + comp/src/gb.form.dialog/.lang/es.po | 46 + comp/src/gb.form.dialog/.lang/es_ES.po | 46 + comp/src/gb.form.dialog/.lang/fr.po | 63 + comp/src/gb.form.dialog/.lang/it.po | 55 + comp/src/gb.form.dialog/.lang/ja.po | 33 + comp/src/gb.form.dialog/.lang/nl.po | 56 + comp/src/gb.form.dialog/.lang/pt_BR.po | 55 + comp/src/gb.form.dialog/.lang/ru.po | 76 + comp/src/gb.form.dialog/.lang/sv.po | 32 + comp/src/gb.form.dialog/.lang/zh.po | 39 + comp/src/gb.form.dialog/.project | 20 + comp/src/gb.form.dialog/.src/Dialog.class | 142 + .../gb.form.dialog/.src/FAskPassword.class | 102 + .../src/gb.form.dialog/.src/FAskPassword.form | 76 + comp/src/gb.form.dialog/.src/FDirDialog.class | 61 + comp/src/gb.form.dialog/.src/FDirDialog.form | 30 + .../src/gb.form.dialog/.src/FFileDialog.class | 132 + comp/src/gb.form.dialog/.src/FFileDialog.form | 18 + .../src/gb.form.dialog/.src/FFontDialog.class | 60 + comp/src/gb.form.dialog/.src/FFontDialog.form | 33 + comp/src/gb.form.dialog/.src/FInputDate.class | 43 + comp/src/gb.form.dialog/.src/FInputDate.form | 37 + comp/src/gb.form.dialog/.src/Main.module | 15 + comp/src/gb.form.editor/.component | 5 + comp/src/gb.form.editor/.directory | 2 + comp/src/gb.form.editor/.hidden/CHANGELOG | 3 + .../.hidden/control/texteditor.png | Bin 0 -> 159 bytes comp/src/gb.form.editor/.icon.png | Bin 0 -> 6146 bytes comp/src/gb.form.editor/.project | 30 + comp/src/gb.form.editor/.src/CCommand.class | 261 + .../gb.form.editor/.src/CCommandBefore.class | 7 + comp/src/gb.form.editor/.src/CDocument.class | 1889 + comp/src/gb.form.editor/.src/CLineInfo.class | 105 + comp/src/gb.form.editor/.src/FFind.class | 108 + comp/src/gb.form.editor/.src/FFind.form | 41 + comp/src/gb.form.editor/.src/Helper.module | 71 + comp/src/gb.form.editor/.src/Main.module | 16 + comp/src/gb.form.editor/.src/TextEditor.class | 6219 ++ .../gb.form.editor/.src/TextEditorMode.class | 299 + .../.src/TextEditorMode_CSS.class | 5 + .../.src/TextEditorMode_Gambas.class | 71 + .../.src/TextEditorMode_HTML.class | 82 + .../.src/TextEditorMode_Javascript.class | 7 + .../.src/TextEditorMode_SQL.class | 5 + .../.src/TextEditorMode_WebPage.class | 3 + .../gb.form.editor/.src/TextEditorStyle.class | 110 + .../.src/_TextEditor_Line.class | 199 + .../.src/_TextEditor_Rows.class | 394 + .../.src/_TextEditor_State.class | 32 + .../.src/_TextEditor_Styles.class | 73 + comp/src/gb.form.editor/.src/test/FTest.class | 10 + comp/src/gb.form.editor/.src/test/FTest.form | 13 + .../.src/test/FTestEditor.class | 222 + .../gb.form.editor/.src/test/FTestEditor.form | 69 + comp/src/gb.form.editor/Text1 | 19 + comp/src/gb.form.editor/test.html | 89 + comp/src/gb.form.mdi/.component | 6 + comp/src/gb.form.mdi/.directory | 2 + .../gb.form.mdi/.hidden/control/toolbar.png | Bin 0 -> 539 bytes .../gb.form.mdi/.hidden/control/workspace.png | Bin 0 -> 198 bytes comp/src/gb.form.mdi/.icon.png | Bin 0 -> 5376 bytes comp/src/gb.form.mdi/.lang/ca.po | 160 + comp/src/gb.form.mdi/.lang/cs.po | 160 + comp/src/gb.form.mdi/.lang/de.po | 270 + comp/src/gb.form.mdi/.lang/es.po | 215 + comp/src/gb.form.mdi/.lang/es_ES.po | 215 + comp/src/gb.form.mdi/.lang/fr.po | 255 + comp/src/gb.form.mdi/.lang/it.po | 199 + comp/src/gb.form.mdi/.lang/ja.po | 39 + comp/src/gb.form.mdi/.lang/nl.po | 200 + comp/src/gb.form.mdi/.lang/pt_BR.po | 199 + comp/src/gb.form.mdi/.lang/ru.po | 278 + comp/src/gb.form.mdi/.lang/sv.po | 148 + comp/src/gb.form.mdi/.lang/zh.po | 161 + comp/src/gb.form.mdi/.project | 23 + comp/src/gb.form.mdi/.src/Action/Action.class | 112 + .../src/gb.form.mdi/.src/Action/CAction.class | 128 + .../gb.form.mdi/.src/Action/MAction.module | 170 + comp/src/gb.form.mdi/.src/MMain.module | 7 + .../gb.form.mdi/.src/Shortcut/FShortcut.class | 336 + .../gb.form.mdi/.src/Shortcut/FShortcut.form | 61 + .../.src/Shortcut/FShortcutEditor.class | 100 + .../.src/Shortcut/FShortcutEditor.form | 22 + comp/src/gb.form.mdi/.src/Tests/FMain.class | 66 + comp/src/gb.form.mdi/.src/Tests/FMain.form | 116 + comp/src/gb.form.mdi/.src/Tests/FMain1.class | 48 + comp/src/gb.form.mdi/.src/Tests/FMain1.form | 105 + comp/src/gb.form.mdi/.src/Tests/FMain2.class | 1 + comp/src/gb.form.mdi/.src/Tests/FMain2.form | 121 + .../.src/Tests/FTestSidePanel.class | 12 + .../.src/Tests/FTestSidePanel.form | 19 + comp/src/gb.form.mdi/.src/Tests/Form1.class | 17 + comp/src/gb.form.mdi/.src/Tests/Form1.form | 17 + comp/src/gb.form.mdi/.src/Tests/Form2.class | 17 + comp/src/gb.form.mdi/.src/Tests/Form2.form | 22 + .../gb.form.mdi/.src/ToolBar/CToolbar.class | 18 + .../gb.form.mdi/.src/ToolBar/FToolBar.class | 1793 + .../gb.form.mdi/.src/ToolBar/FToolBar.form | 27 + .../.src/ToolBar/FToolBarConfig.class | 500 + .../.src/ToolBar/FToolBarConfig.form | 98 + .../gb.form.mdi/.src/ToolBar/ToolBar.class | 205 + .../.src/ToolBar/ToolBarExpander.class | 9 + .../gb.form.mdi/.src/Workspace/CWindow.class | 9 + .../.src/Workspace/FWorkspace.class | 1046 + .../.src/Workspace/FWorkspace.form | 146 + .../.src/Workspace/Workspace.class | 283 + comp/src/gb.form.mdi/70a017.png | Bin 0 -> 1542 bytes comp/src/gb.form.mdi/control/buttonbox.png | Bin 0 -> 290 bytes comp/src/gb.form.mdi/control/combobox.png | Bin 0 -> 287 bytes comp/src/gb.form.mdi/control/datebox.png | Bin 0 -> 568 bytes comp/src/gb.form.mdi/control/valuebox.png | Bin 0 -> 374 bytes comp/src/gb.form.mdi/img/close.png | Bin 0 -> 112 bytes comp/src/gb.form.mdi/img/configure.png | Bin 0 -> 141 bytes comp/src/gb.form.mdi/img/configure_dark.png | Bin 0 -> 139 bytes comp/src/gb.form.mdi/img/expander.png | Bin 0 -> 188 bytes comp/src/gb.form.mdi/img/handle-v.png | Bin 0 -> 100 bytes comp/src/gb.form.mdi/img/handle.png | Bin 0 -> 97 bytes comp/src/gb.form.mdi/img/hash.png | Bin 0 -> 86 bytes comp/src/gb.form.mdi/img/roll.png | Bin 0 -> 90 bytes comp/src/gb.form.mdi/img/separator.png | Bin 0 -> 92 bytes comp/src/gb.form.mdi/img/space.png | Bin 0 -> 92 bytes comp/src/gb.form.mdi/img/unroll.png | Bin 0 -> 93 bytes comp/src/gb.form.print/.component | 6 + comp/src/gb.form.print/.directory | 2 + comp/src/gb.form.print/.hidden/printer.png | Bin 0 -> 258 bytes comp/src/gb.form.print/.icon.png | Bin 0 -> 6301 bytes comp/src/gb.form.print/.lang/es.po | 215 + comp/src/gb.form.print/.lang/es_ES.po | 215 + comp/src/gb.form.print/.lang/fr.po | 194 + comp/src/gb.form.print/.lang/it.po | 174 + comp/src/gb.form.print/.lang/nl.po | 219 + comp/src/gb.form.print/.lang/pt_BR.po | 174 + comp/src/gb.form.print/.lang/ru.po | 190 + comp/src/gb.form.print/.project | 17 + comp/src/gb.form.print/.src/FPreview.class | 694 + comp/src/gb.form.print/.src/FPreview.form | 331 + comp/src/gb.form.print/.src/FPrinting.class | 13 + comp/src/gb.form.print/.src/FPrinting.form | 24 + comp/src/gb.form.print/.src/MTest.module | 48 + comp/src/gb.form.print/.src/Printer.class | 31 + .../gb.form.print/img/print-full-width.png | Bin 0 -> 199 bytes comp/src/gb.form.print/img/print-one-page.png | Bin 0 -> 183 bytes .../src/gb.form.print/img/print-real-size.png | Bin 0 -> 568 bytes .../src/gb.form.print/img/print-two-pages.png | Bin 0 -> 194 bytes comp/src/gb.form.print/molly-malone.txt | 35 + comp/src/gb.form.stock/.component | 4 + comp/src/gb.form.stock/.directory | 2 + comp/src/gb.form.stock/.hidden/CHANGELOG | 3 + comp/src/gb.form.stock/.hidden/earth.png | Bin 0 -> 6367 bytes comp/src/gb.form.stock/.hidden/goutte.png | Bin 0 -> 575 bytes comp/src/gb.form.stock/.hidden/map | 163 + comp/src/gb.form.stock/.icon.png | Bin 0 -> 5522 bytes comp/src/gb.form.stock/.project | 21 + comp/src/gb.form.stock/.src/Main.module | 216 + .../gb.form.stock/.src/_DefaultStock.class | 112 + .../gb.form.stock/gambas-mono/128/delete.png | Bin 0 -> 1879 bytes .../gb.form.stock/gambas-mono/128/error.png | Bin 0 -> 1208 bytes .../gb.form.stock/gambas-mono/128/gambas.png | Bin 0 -> 2729 bytes .../gb.form.stock/gambas-mono/128/info.png | Bin 0 -> 302 bytes .../gambas-mono/128/question.png | Bin 0 -> 2723 bytes .../gb.form.stock/gambas-mono/128/warning.png | Bin 0 -> 929 bytes .../gb.form.stock/gambas-mono/32/access.png | Bin 0 -> 201 bytes comp/src/gb.form.stock/gambas-mono/32/add.png | Bin 0 -> 164 bytes .../gambas-mono/32/align-bottom.png | Bin 0 -> 142 bytes .../gambas-mono/32/align-center.png | Bin 0 -> 149 bytes .../gambas-mono/32/align-height.png | Bin 0 -> 143 bytes .../gambas-mono/32/align-left.png | Bin 0 -> 144 bytes .../gambas-mono/32/align-middle.png | Bin 0 -> 144 bytes .../gambas-mono/32/align-right.png | Bin 0 -> 147 bytes .../gambas-mono/32/align-top.png | Bin 0 -> 144 bytes .../gambas-mono/32/align-width.png | Bin 0 -> 144 bytes .../gb.form.stock/gambas-mono/32/apply.png | Bin 0 -> 232 bytes .../gb.form.stock/gambas-mono/32/archive.png | Bin 0 -> 163 bytes .../gb.form.stock/gambas-mono/32/attach.png | Bin 0 -> 751 bytes .../gb.form.stock/gambas-mono/32/audio.png | Bin 0 -> 475 bytes .../gb.form.stock/gambas-mono/32/battery.png | Bin 0 -> 161 bytes .../src/gb.form.stock/gambas-mono/32/blue.png | Bin 0 -> 602 bytes .../src/gb.form.stock/gambas-mono/32/blur.png | Bin 0 -> 1699 bytes .../src/gb.form.stock/gambas-mono/32/book.png | Bin 0 -> 187 bytes .../gb.form.stock/gambas-mono/32/bookmark.png | Bin 0 -> 265 bytes .../gb.form.stock/gambas-mono/32/bottom.png | Bin 0 -> 181 bytes .../gambas-mono/32/brightness.png | Bin 0 -> 337 bytes comp/src/gb.form.stock/gambas-mono/32/c.png | Bin 0 -> 424 bytes .../gambas-mono/32/calculator.png | Bin 0 -> 153 bytes .../gb.form.stock/gambas-mono/32/calendar.png | Bin 0 -> 189 bytes .../src/gb.form.stock/gambas-mono/32/call.png | Bin 0 -> 419 bytes .../gb.form.stock/gambas-mono/32/camera.png | Bin 0 -> 234 bytes .../gb.form.stock/gambas-mono/32/cancel.png | Bin 0 -> 337 bytes .../gb.form.stock/gambas-mono/32/cdrom.png | Bin 0 -> 428 bytes .../gambas-mono/32/clear-rtl.png | Bin 0 -> 258 bytes .../gb.form.stock/gambas-mono/32/clear.png | Bin 0 -> 259 bytes .../gb.form.stock/gambas-mono/32/clock.png | Bin 0 -> 493 bytes .../gb.form.stock/gambas-mono/32/close.png | Bin 0 -> 337 bytes .../gambas-mono/32/color-picker.png | Bin 0 -> 242 bytes .../gb.form.stock/gambas-mono/32/color.png | Bin 0 -> 292 bytes .../gambas-mono/32/component.png | Bin 0 -> 144 bytes .../gb.form.stock/gambas-mono/32/computer.png | Bin 0 -> 249 bytes .../gb.form.stock/gambas-mono/32/connect.png | Bin 0 -> 276 bytes .../gb.form.stock/gambas-mono/32/contrast.png | Bin 0 -> 390 bytes .../src/gb.form.stock/gambas-mono/32/copy.png | Bin 0 -> 196 bytes comp/src/gb.form.stock/gambas-mono/32/cpp.png | Bin 0 -> 493 bytes .../src/gb.form.stock/gambas-mono/32/crop.png | Bin 0 -> 206 bytes comp/src/gb.form.stock/gambas-mono/32/css.png | Bin 0 -> 666 bytes comp/src/gb.form.stock/gambas-mono/32/cut.png | Bin 0 -> 441 bytes .../gb.form.stock/gambas-mono/32/database.png | Bin 0 -> 362 bytes .../gb.form.stock/gambas-mono/32/delete.png | Bin 0 -> 526 bytes .../gb.form.stock/gambas-mono/32/desktop.png | Bin 0 -> 240 bytes .../gambas-mono/32/development.png | Bin 0 -> 242 bytes .../gambas-mono/32/difference.png | Bin 0 -> 173 bytes .../gambas-mono/32/directory.png | Bin 0 -> 151 bytes .../gambas-mono/32/disconnect.png | Bin 0 -> 280 bytes .../src/gb.form.stock/gambas-mono/32/down.png | Bin 0 -> 203 bytes .../gb.form.stock/gambas-mono/32/download.png | Bin 0 -> 357 bytes .../gambas-mono/32/draw-circle.png | Bin 0 -> 458 bytes .../gambas-mono/32/draw-line.png | Bin 0 -> 173 bytes .../gambas-mono/32/draw-path.png | Bin 0 -> 391 bytes .../gambas-mono/32/draw-rectangle.png | Bin 0 -> 136 bytes .../gambas-mono/32/draw-text.png | Bin 0 -> 547 bytes .../gb.form.stock/gambas-mono/32/earth.png | Bin 0 -> 1017 bytes .../src/gb.form.stock/gambas-mono/32/edit.png | Bin 0 -> 251 bytes .../gb.form.stock/gambas-mono/32/eject.png | Bin 0 -> 190 bytes comp/src/gb.form.stock/gambas-mono/32/end.png | Bin 0 -> 187 bytes .../gb.form.stock/gambas-mono/32/erase.png | Bin 0 -> 225 bytes .../gb.form.stock/gambas-mono/32/error.png | Bin 0 -> 357 bytes .../gambas-mono/32/exclusive.png | Bin 0 -> 156 bytes .../src/gb.form.stock/gambas-mono/32/exec.png | Bin 0 -> 278 bytes .../gambas-mono/32/file-manager.png | Bin 0 -> 140 bytes .../src/gb.form.stock/gambas-mono/32/file.png | Bin 0 -> 147 bytes .../src/gb.form.stock/gambas-mono/32/fill.png | Bin 0 -> 313 bytes .../gb.form.stock/gambas-mono/32/filter.png | Bin 0 -> 189 bytes .../src/gb.form.stock/gambas-mono/32/find.png | Bin 0 -> 402 bytes .../gb.form.stock/gambas-mono/32/first.png | Bin 0 -> 206 bytes .../src/gb.form.stock/gambas-mono/32/flag.png | Bin 0 -> 177 bytes .../gb.form.stock/gambas-mono/32/flip-h.png | Bin 0 -> 196 bytes .../gb.form.stock/gambas-mono/32/flip-v.png | Bin 0 -> 193 bytes .../gb.form.stock/gambas-mono/32/floppy.png | Bin 0 -> 184 bytes .../src/gb.form.stock/gambas-mono/32/font.png | Bin 0 -> 232 bytes .../gb.form.stock/gambas-mono/32/forward.png | Bin 0 -> 205 bytes .../gambas-mono/32/fullscreen.png | Bin 0 -> 220 bytes .../gb.form.stock/gambas-mono/32/gambas.png | Bin 0 -> 935 bytes .../src/gb.form.stock/gambas-mono/32/game.png | Bin 0 -> 223 bytes .../gb.form.stock/gambas-mono/32/gamma.png | Bin 0 -> 368 bytes comp/src/gb.form.stock/gambas-mono/32/gnu.png | Bin 0 -> 1370 bytes .../gb.form.stock/gambas-mono/32/green.png | Bin 0 -> 622 bytes .../src/gb.form.stock/gambas-mono/32/grid.png | Bin 0 -> 139 bytes .../gb.form.stock/gambas-mono/32/group.png | Bin 0 -> 830 bytes comp/src/gb.form.stock/gambas-mono/32/h.png | Bin 0 -> 237 bytes .../src/gb.form.stock/gambas-mono/32/halt.png | Bin 0 -> 381 bytes .../gb.form.stock/gambas-mono/32/harddisk.png | Bin 0 -> 147 bytes .../gb.form.stock/gambas-mono/32/hardware.png | Bin 0 -> 167 bytes .../src/gb.form.stock/gambas-mono/32/help.png | Bin 0 -> 607 bytes .../src/gb.form.stock/gambas-mono/32/home.png | Bin 0 -> 219 bytes .../src/gb.form.stock/gambas-mono/32/html.png | Bin 0 -> 488 bytes comp/src/gb.form.stock/gambas-mono/32/hue.png | Bin 0 -> 515 bytes .../gb.form.stock/gambas-mono/32/identity.png | Bin 0 -> 214 bytes .../gb.form.stock/gambas-mono/32/image.png | Bin 0 -> 225 bytes .../gambas-mono/32/important.png | Bin 0 -> 528 bytes .../gb.form.stock/gambas-mono/32/indent.png | Bin 0 -> 179 bytes .../src/gb.form.stock/gambas-mono/32/info.png | Bin 0 -> 172 bytes .../gambas-mono/32/insert-image.png | Bin 0 -> 265 bytes .../gambas-mono/32/insert-link.png | Bin 0 -> 1003 bytes .../gambas-mono/32/insert-text.png | Bin 0 -> 213 bytes .../gb.form.stock/gambas-mono/32/internet.png | Bin 0 -> 839 bytes .../gambas-mono/32/intersection.png | Bin 0 -> 164 bytes comp/src/gb.form.stock/gambas-mono/32/js.png | Bin 0 -> 547 bytes .../src/gb.form.stock/gambas-mono/32/jump.png | Bin 0 -> 246 bytes comp/src/gb.form.stock/gambas-mono/32/key.png | Bin 0 -> 287 bytes .../gb.form.stock/gambas-mono/32/keyboard.png | Bin 0 -> 439 bytes .../src/gb.form.stock/gambas-mono/32/lamp.png | Bin 0 -> 372 bytes .../gb.form.stock/gambas-mono/32/language.png | Bin 0 -> 168 bytes .../src/gb.form.stock/gambas-mono/32/last.png | Bin 0 -> 206 bytes .../gb.form.stock/gambas-mono/32/layout.png | Bin 0 -> 410 bytes .../src/gb.form.stock/gambas-mono/32/left.png | Bin 0 -> 235 bytes .../gambas-mono/32/lightness.png | Bin 0 -> 387 bytes .../src/gb.form.stock/gambas-mono/32/link.png | Bin 0 -> 984 bytes .../gb.form.stock/gambas-mono/32/linux.png | Bin 0 -> 1311 bytes .../src/gb.form.stock/gambas-mono/32/lock.png | Bin 0 -> 265 bytes .../gb.form.stock/gambas-mono/32/lower.png | Bin 0 -> 155 bytes .../src/gb.form.stock/gambas-mono/32/mail.png | Bin 0 -> 168 bytes .../gb.form.stock/gambas-mono/32/make-all.png | Bin 0 -> 192 bytes .../src/gb.form.stock/gambas-mono/32/make.png | Bin 0 -> 234 bytes .../gambas-mono/32/media-player.png | Bin 0 -> 176 bytes .../src/gb.form.stock/gambas-mono/32/menu.png | Bin 0 -> 131 bytes .../gambas-mono/32/microphone.png | Bin 0 -> 451 bytes .../gb.form.stock/gambas-mono/32/monitor.png | Bin 0 -> 223 bytes .../gb.form.stock/gambas-mono/32/mouse.png | Bin 0 -> 273 bytes .../gambas-mono/32/multimedia.png | Bin 0 -> 276 bytes .../gb.form.stock/gambas-mono/32/muted.png | Bin 0 -> 340 bytes .../gb.form.stock/gambas-mono/32/network.png | Bin 0 -> 206 bytes .../gb.form.stock/gambas-mono/32/new-dir.png | Bin 0 -> 209 bytes .../gb.form.stock/gambas-mono/32/new-tab.png | Bin 0 -> 222 bytes .../gb.form.stock/gambas-mono/32/new-tag.png | Bin 0 -> 260 bytes .../gambas-mono/32/new-window.png | Bin 0 -> 231 bytes comp/src/gb.form.stock/gambas-mono/32/new.png | Bin 0 -> 173 bytes .../src/gb.form.stock/gambas-mono/32/next.png | Bin 0 -> 194 bytes .../gambas-mono/32/office-calc.png | Bin 0 -> 158 bytes .../gambas-mono/32/office-draw.png | Bin 0 -> 237 bytes .../gb.form.stock/gambas-mono/32/office.png | Bin 0 -> 163 bytes comp/src/gb.form.stock/gambas-mono/32/ok.png | Bin 0 -> 240 bytes .../gb.form.stock/gambas-mono/32/opacity.png | Bin 0 -> 472 bytes .../gambas-mono/32/open-recent.png | Bin 0 -> 259 bytes .../src/gb.form.stock/gambas-mono/32/open.png | Bin 0 -> 197 bytes .../gb.form.stock/gambas-mono/32/options.png | Bin 0 -> 272 bytes .../gb.form.stock/gambas-mono/32/package.png | Bin 0 -> 200 bytes .../gb.form.stock/gambas-mono/32/paste.png | Bin 0 -> 184 bytes .../gb.form.stock/gambas-mono/32/pause.png | Bin 0 -> 137 bytes comp/src/gb.form.stock/gambas-mono/32/pda.png | Bin 0 -> 155 bytes comp/src/gb.form.stock/gambas-mono/32/pdf.png | Bin 0 -> 493 bytes comp/src/gb.form.stock/gambas-mono/32/pen.png | Bin 0 -> 223 bytes .../gb.form.stock/gambas-mono/32/people.png | Bin 0 -> 830 bytes .../gb.form.stock/gambas-mono/32/phone.png | Bin 0 -> 155 bytes .../src/gb.form.stock/gambas-mono/32/play.png | Bin 0 -> 184 bytes .../gb.form.stock/gambas-mono/32/plugin.png | Bin 0 -> 279 bytes .../gb.form.stock/gambas-mono/32/preview.png | Bin 0 -> 388 bytes .../gb.form.stock/gambas-mono/32/previous.png | Bin 0 -> 201 bytes .../gb.form.stock/gambas-mono/32/print.png | Bin 0 -> 173 bytes .../gb.form.stock/gambas-mono/32/printer.png | Bin 0 -> 237 bytes .../gb.form.stock/gambas-mono/32/program.png | Bin 0 -> 187 bytes .../gambas-mono/32/properties.png | Bin 0 -> 157 bytes .../gb.form.stock/gambas-mono/32/question.png | Bin 0 -> 684 bytes .../src/gb.form.stock/gambas-mono/32/quit.png | Bin 0 -> 382 bytes .../gb.form.stock/gambas-mono/32/raise.png | Bin 0 -> 158 bytes .../gb.form.stock/gambas-mono/32/recent.png | Bin 0 -> 348 bytes .../gb.form.stock/gambas-mono/32/record.png | Bin 0 -> 321 bytes comp/src/gb.form.stock/gambas-mono/32/red.png | Bin 0 -> 604 bytes .../src/gb.form.stock/gambas-mono/32/redo.png | Bin 0 -> 367 bytes .../gb.form.stock/gambas-mono/32/refresh.png | Bin 0 -> 467 bytes .../gb.form.stock/gambas-mono/32/remove.png | Bin 0 -> 158 bytes .../gb.form.stock/gambas-mono/32/rename.png | Bin 0 -> 211 bytes .../gb.form.stock/gambas-mono/32/replace.png | Bin 0 -> 404 bytes .../gb.form.stock/gambas-mono/32/resize.png | Bin 0 -> 191 bytes .../gb.form.stock/gambas-mono/32/revert.png | Bin 0 -> 251 bytes .../gb.form.stock/gambas-mono/32/rewind.png | Bin 0 -> 203 bytes .../gb.form.stock/gambas-mono/32/right.png | Bin 0 -> 225 bytes .../gambas-mono/32/rotate-left.png | Bin 0 -> 187 bytes .../gambas-mono/32/rotate-right.png | Bin 0 -> 187 bytes .../gb.form.stock/gambas-mono/32/rotate.png | Bin 0 -> 358 bytes .../gambas-mono/32/saturation.png | Bin 0 -> 446 bytes .../gb.form.stock/gambas-mono/32/save-as.png | Bin 0 -> 196 bytes .../src/gb.form.stock/gambas-mono/32/save.png | Bin 0 -> 198 bytes .../gb.form.stock/gambas-mono/32/scanner.png | Bin 0 -> 254 bytes .../gb.form.stock/gambas-mono/32/science.png | Bin 0 -> 370 bytes .../gb.form.stock/gambas-mono/32/screen.png | Bin 0 -> 174 bytes .../gb.form.stock/gambas-mono/32/script.png | Bin 0 -> 427 bytes .../gb.form.stock/gambas-mono/32/security.png | Bin 0 -> 580 bytes .../gambas-mono/32/select-all.png | Bin 0 -> 203 bytes .../gb.form.stock/gambas-mono/32/select.png | Bin 0 -> 188 bytes .../gb.form.stock/gambas-mono/32/server.png | Bin 0 -> 153 bytes .../gb.form.stock/gambas-mono/32/share.png | Bin 0 -> 267 bytes .../gb.form.stock/gambas-mono/32/shortcut.png | Bin 0 -> 220 bytes .../gambas-mono/32/sort-ascent.png | Bin 0 -> 171 bytes .../gambas-mono/32/sort-descent.png | Bin 0 -> 174 bytes .../gambas-mono/32/spell-check.png | Bin 0 -> 287 bytes .../src/gb.form.stock/gambas-mono/32/star.png | Bin 0 -> 897 bytes .../gb.form.stock/gambas-mono/32/start.png | Bin 0 -> 191 bytes .../src/gb.form.stock/gambas-mono/32/stop.png | Bin 0 -> 137 bytes comp/src/gb.form.stock/gambas-mono/32/sun.png | Bin 0 -> 420 bytes .../gb.form.stock/gambas-mono/32/system.png | Bin 0 -> 174 bytes .../gb.form.stock/gambas-mono/32/table.png | Bin 0 -> 151 bytes .../gb.form.stock/gambas-mono/32/tablet.png | Bin 0 -> 268 bytes comp/src/gb.form.stock/gambas-mono/32/tag.png | Bin 0 -> 248 bytes .../gb.form.stock/gambas-mono/32/terminal.png | Bin 0 -> 161 bytes .../gambas-mono/32/text-baseline.png | Bin 0 -> 184 bytes .../gambas-mono/32/text-bold.png | Bin 0 -> 568 bytes .../gambas-mono/32/text-bottom.png | Bin 0 -> 169 bytes .../gambas-mono/32/text-center.png | Bin 0 -> 147 bytes .../gambas-mono/32/text-fill.png | Bin 0 -> 131 bytes .../gambas-mono/32/text-italic.png | Bin 0 -> 686 bytes .../gambas-mono/32/text-left.png | Bin 0 -> 143 bytes .../gambas-mono/32/text-lower.png | Bin 0 -> 292 bytes .../gambas-mono/32/text-middle.png | Bin 0 -> 186 bytes .../gambas-mono/32/text-right.png | Bin 0 -> 143 bytes .../gambas-mono/32/text-strike.png | Bin 0 -> 622 bytes .../gb.form.stock/gambas-mono/32/text-top.png | Bin 0 -> 168 bytes .../gambas-mono/32/text-underline.png | Bin 0 -> 661 bytes .../gambas-mono/32/text-upper.png | Bin 0 -> 481 bytes .../src/gb.form.stock/gambas-mono/32/text.png | Bin 0 -> 157 bytes .../gb.form.stock/gambas-mono/32/tools.png | Bin 0 -> 311 bytes comp/src/gb.form.stock/gambas-mono/32/top.png | Bin 0 -> 179 bytes .../gambas-mono/32/transparency.png | Bin 0 -> 160 bytes .../gb.form.stock/gambas-mono/32/trash.png | Bin 0 -> 190 bytes .../src/gb.form.stock/gambas-mono/32/undo.png | Bin 0 -> 360 bytes .../gb.form.stock/gambas-mono/32/unindent.png | Bin 0 -> 179 bytes .../gb.form.stock/gambas-mono/32/union.png | Bin 0 -> 164 bytes .../gb.form.stock/gambas-mono/32/unlock.png | Bin 0 -> 289 bytes .../gb.form.stock/gambas-mono/32/unselect.png | Bin 0 -> 526 bytes comp/src/gb.form.stock/gambas-mono/32/up.png | Bin 0 -> 201 bytes .../gb.form.stock/gambas-mono/32/upload.png | Bin 0 -> 345 bytes .../src/gb.form.stock/gambas-mono/32/user.png | Bin 0 -> 414 bytes .../gb.form.stock/gambas-mono/32/vector.png | Bin 0 -> 273 bytes .../gb.form.stock/gambas-mono/32/video.png | Bin 0 -> 209 bytes .../gambas-mono/32/view-detail.png | Bin 0 -> 134 bytes .../gambas-mono/32/view-icon.png | Bin 0 -> 131 bytes .../gambas-mono/32/view-normal.png | Bin 0 -> 213 bytes .../gambas-mono/32/view-split-h.png | Bin 0 -> 151 bytes .../gambas-mono/32/view-split-v.png | Bin 0 -> 147 bytes .../gambas-mono/32/view-tree.png | Bin 0 -> 142 bytes .../gb.form.stock/gambas-mono/32/volume.png | Bin 0 -> 475 bytes comp/src/gb.form.stock/gambas-mono/32/vpn.png | Bin 0 -> 320 bytes .../gb.form.stock/gambas-mono/32/warning.png | Bin 0 -> 336 bytes .../gb.form.stock/gambas-mono/32/watch.png | Bin 0 -> 499 bytes .../gb.form.stock/gambas-mono/32/webcam.png | Bin 0 -> 440 bytes .../src/gb.form.stock/gambas-mono/32/wifi.png | Bin 0 -> 593 bytes .../gb.form.stock/gambas-mono/32/wizard.png | Bin 0 -> 302 bytes .../gb.form.stock/gambas-mono/32/zoom-fit.png | Bin 0 -> 554 bytes .../gb.form.stock/gambas-mono/32/zoom-in.png | Bin 0 -> 453 bytes .../gambas-mono/32/zoom-normal.png | Bin 0 -> 503 bytes .../gb.form.stock/gambas-mono/32/zoom-out.png | Bin 0 -> 450 bytes comp/src/gb.form.stock/gambas/128/access.png | Bin 0 -> 354 bytes comp/src/gb.form.stock/gambas/128/archive.png | Bin 0 -> 309 bytes comp/src/gb.form.stock/gambas/128/audio.png | Bin 0 -> 1560 bytes comp/src/gb.form.stock/gambas/128/book.png | Bin 0 -> 302 bytes .../src/gb.form.stock/gambas/128/bookmark.png | Bin 0 -> 669 bytes comp/src/gb.form.stock/gambas/128/c.png | Bin 0 -> 1221 bytes .../gb.form.stock/gambas/128/calculator.png | Bin 0 -> 205 bytes .../src/gb.form.stock/gambas/128/calendar.png | Bin 0 -> 429 bytes comp/src/gb.form.stock/gambas/128/camera.png | Bin 0 -> 575 bytes comp/src/gb.form.stock/gambas/128/cdrom.png | Bin 0 -> 1516 bytes comp/src/gb.form.stock/gambas/128/clock.png | Bin 0 -> 2016 bytes comp/src/gb.form.stock/gambas/128/color.png | Bin 0 -> 1145 bytes .../gb.form.stock/gambas/128/component.png | Bin 0 -> 167 bytes .../src/gb.form.stock/gambas/128/computer.png | Bin 0 -> 667 bytes comp/src/gb.form.stock/gambas/128/cpp.png | Bin 0 -> 1251 bytes comp/src/gb.form.stock/gambas/128/css.png | Bin 0 -> 2205 bytes comp/src/gb.form.stock/gambas/128/delete.png | Bin 0 -> 1876 bytes .../gb.form.stock/gambas/128/development.png | Bin 0 -> 460 bytes .../gb.form.stock/gambas/128/directory.png | Bin 0 -> 162 bytes .../src/gb.form.stock/gambas/128/download.png | Bin 0 -> 1126 bytes comp/src/gb.form.stock/gambas/128/earth.png | Bin 0 -> 4351 bytes comp/src/gb.form.stock/gambas/128/edit.png | Bin 0 -> 585 bytes comp/src/gb.form.stock/gambas/128/error.png | Bin 0 -> 1212 bytes comp/src/gb.form.stock/gambas/128/exec.png | Bin 0 -> 1166 bytes comp/src/gb.form.stock/gambas/128/file.png | Bin 0 -> 161 bytes comp/src/gb.form.stock/gambas/128/flag.png | Bin 0 -> 271 bytes comp/src/gb.form.stock/gambas/128/floppy.png | Bin 0 -> 238 bytes comp/src/gb.form.stock/gambas/128/font.png | Bin 0 -> 579 bytes comp/src/gb.form.stock/gambas/128/gambas.png | Bin 0 -> 2901 bytes comp/src/gb.form.stock/gambas/128/game.png | Bin 0 -> 638 bytes comp/src/gb.form.stock/gambas/128/h.png | Bin 0 -> 270 bytes .../src/gb.form.stock/gambas/128/harddisk.png | Bin 0 -> 192 bytes .../src/gb.form.stock/gambas/128/hardware.png | Bin 0 -> 212 bytes comp/src/gb.form.stock/gambas/128/help.png | Bin 0 -> 2201 bytes comp/src/gb.form.stock/gambas/128/html.png | Bin 0 -> 1514 bytes comp/src/gb.form.stock/gambas/128/image.png | Bin 0 -> 586 bytes comp/src/gb.form.stock/gambas/128/info.png | Bin 0 -> 283 bytes .../src/gb.form.stock/gambas/128/internet.png | Bin 0 -> 3722 bytes comp/src/gb.form.stock/gambas/128/js.png | Bin 0 -> 1453 bytes comp/src/gb.form.stock/gambas/128/lock.png | Bin 0 -> 788 bytes comp/src/gb.form.stock/gambas/128/monitor.png | Bin 0 -> 461 bytes comp/src/gb.form.stock/gambas/128/mouse.png | Bin 0 -> 744 bytes comp/src/gb.form.stock/gambas/128/new.png | Bin 0 -> 227 bytes comp/src/gb.form.stock/gambas/128/office.png | Bin 0 -> 181 bytes .../gb.form.stock/gambas/128/open-recent.png | Bin 0 -> 733 bytes comp/src/gb.form.stock/gambas/128/open.png | Bin 0 -> 349 bytes comp/src/gb.form.stock/gambas/128/options.png | Bin 0 -> 1234 bytes comp/src/gb.form.stock/gambas/128/pdf.png | Bin 0 -> 1776 bytes comp/src/gb.form.stock/gambas/128/pen.png | Bin 0 -> 395 bytes comp/src/gb.form.stock/gambas/128/phone.png | Bin 0 -> 170 bytes comp/src/gb.form.stock/gambas/128/plugin.png | Bin 0 -> 852 bytes comp/src/gb.form.stock/gambas/128/printer.png | Bin 0 -> 659 bytes comp/src/gb.form.stock/gambas/128/program.png | Bin 0 -> 310 bytes .../src/gb.form.stock/gambas/128/question.png | Bin 0 -> 2316 bytes comp/src/gb.form.stock/gambas/128/quit.png | Bin 0 -> 1296 bytes comp/src/gb.form.stock/gambas/128/rename.png | Bin 0 -> 384 bytes comp/src/gb.form.stock/gambas/128/scanner.png | Bin 0 -> 649 bytes comp/src/gb.form.stock/gambas/128/science.png | Bin 0 -> 1663 bytes comp/src/gb.form.stock/gambas/128/screen.png | Bin 0 -> 254 bytes comp/src/gb.form.stock/gambas/128/script.png | Bin 0 -> 1129 bytes comp/src/gb.form.stock/gambas/128/server.png | Bin 0 -> 198 bytes comp/src/gb.form.stock/gambas/128/table.png | Bin 0 -> 177 bytes comp/src/gb.form.stock/gambas/128/tablet.png | Bin 0 -> 843 bytes comp/src/gb.form.stock/gambas/128/tag.png | Bin 0 -> 669 bytes comp/src/gb.form.stock/gambas/128/text.png | Bin 0 -> 172 bytes comp/src/gb.form.stock/gambas/128/tools.png | Bin 0 -> 1026 bytes comp/src/gb.form.stock/gambas/128/trash.png | Bin 0 -> 435 bytes comp/src/gb.form.stock/gambas/128/unlock.png | Bin 0 -> 837 bytes comp/src/gb.form.stock/gambas/128/upload.png | Bin 0 -> 1113 bytes comp/src/gb.form.stock/gambas/128/user.png | Bin 0 -> 1675 bytes comp/src/gb.form.stock/gambas/128/vector.png | Bin 0 -> 499 bytes comp/src/gb.form.stock/gambas/128/video.png | Bin 0 -> 314 bytes comp/src/gb.form.stock/gambas/128/warning.png | Bin 0 -> 919 bytes comp/src/gb.form.stock/gambas/128/webcam.png | Bin 0 -> 2032 bytes comp/src/gb.form.stock/gambas/128/wizard.png | Bin 0 -> 619 bytes comp/src/gb.form.stock/gambas/32/access.png | Bin 0 -> 189 bytes comp/src/gb.form.stock/gambas/32/add.png | Bin 0 -> 164 bytes .../gb.form.stock/gambas/32/align-bottom.png | Bin 0 -> 136 bytes .../gb.form.stock/gambas/32/align-center.png | Bin 0 -> 140 bytes .../gb.form.stock/gambas/32/align-height.png | Bin 0 -> 134 bytes .../gb.form.stock/gambas/32/align-left.png | Bin 0 -> 141 bytes .../gb.form.stock/gambas/32/align-middle.png | Bin 0 -> 138 bytes .../gb.form.stock/gambas/32/align-right.png | Bin 0 -> 140 bytes .../src/gb.form.stock/gambas/32/align-top.png | Bin 0 -> 138 bytes .../gb.form.stock/gambas/32/align-width.png | Bin 0 -> 141 bytes comp/src/gb.form.stock/gambas/32/apply.png | Bin 0 -> 240 bytes comp/src/gb.form.stock/gambas/32/archive.png | Bin 0 -> 173 bytes comp/src/gb.form.stock/gambas/32/attach.png | Bin 0 -> 751 bytes comp/src/gb.form.stock/gambas/32/audio.png | Bin 0 -> 475 bytes comp/src/gb.form.stock/gambas/32/battery.png | Bin 0 -> 163 bytes comp/src/gb.form.stock/gambas/32/blue.png | Bin 0 -> 510 bytes comp/src/gb.form.stock/gambas/32/blur.png | Bin 0 -> 1699 bytes comp/src/gb.form.stock/gambas/32/book.png | Bin 0 -> 201 bytes comp/src/gb.form.stock/gambas/32/bookmark.png | Bin 0 -> 270 bytes comp/src/gb.form.stock/gambas/32/bottom.png | Bin 0 -> 181 bytes .../gb.form.stock/gambas/32/brightness.png | Bin 0 -> 337 bytes comp/src/gb.form.stock/gambas/32/c.png | Bin 0 -> 419 bytes .../gb.form.stock/gambas/32/calculator.png | Bin 0 -> 163 bytes comp/src/gb.form.stock/gambas/32/calendar.png | Bin 0 -> 218 bytes comp/src/gb.form.stock/gambas/32/call.png | Bin 0 -> 418 bytes comp/src/gb.form.stock/gambas/32/camera.png | Bin 0 -> 231 bytes comp/src/gb.form.stock/gambas/32/cancel.png | Bin 0 -> 332 bytes comp/src/gb.form.stock/gambas/32/cdrom.png | Bin 0 -> 408 bytes .../src/gb.form.stock/gambas/32/clear-rtl.png | Bin 0 -> 258 bytes comp/src/gb.form.stock/gambas/32/clear.png | Bin 0 -> 259 bytes comp/src/gb.form.stock/gambas/32/clock.png | Bin 0 -> 510 bytes comp/src/gb.form.stock/gambas/32/close.png | Bin 0 -> 337 bytes .../gb.form.stock/gambas/32/color-picker.png | Bin 0 -> 230 bytes comp/src/gb.form.stock/gambas/32/color.png | Bin 0 -> 292 bytes .../src/gb.form.stock/gambas/32/component.png | Bin 0 -> 152 bytes comp/src/gb.form.stock/gambas/32/computer.png | Bin 0 -> 257 bytes comp/src/gb.form.stock/gambas/32/connect.png | Bin 0 -> 292 bytes comp/src/gb.form.stock/gambas/32/contrast.png | Bin 0 -> 390 bytes comp/src/gb.form.stock/gambas/32/copy.png | Bin 0 -> 168 bytes comp/src/gb.form.stock/gambas/32/cpp.png | Bin 0 -> 482 bytes comp/src/gb.form.stock/gambas/32/crop.png | Bin 0 -> 206 bytes comp/src/gb.form.stock/gambas/32/css.png | Bin 0 -> 677 bytes comp/src/gb.form.stock/gambas/32/cut.png | Bin 0 -> 429 bytes comp/src/gb.form.stock/gambas/32/database.png | Bin 0 -> 353 bytes comp/src/gb.form.stock/gambas/32/delete.png | Bin 0 -> 526 bytes comp/src/gb.form.stock/gambas/32/desktop.png | Bin 0 -> 255 bytes .../gb.form.stock/gambas/32/development.png | Bin 0 -> 241 bytes .../gb.form.stock/gambas/32/difference.png | Bin 0 -> 173 bytes .../src/gb.form.stock/gambas/32/directory.png | Bin 0 -> 151 bytes .../gb.form.stock/gambas/32/disconnect.png | Bin 0 -> 298 bytes comp/src/gb.form.stock/gambas/32/down.png | Bin 0 -> 203 bytes comp/src/gb.form.stock/gambas/32/download.png | Bin 0 -> 351 bytes .../gb.form.stock/gambas/32/draw-circle.png | Bin 0 -> 458 bytes .../src/gb.form.stock/gambas/32/draw-line.png | Bin 0 -> 173 bytes .../src/gb.form.stock/gambas/32/draw-path.png | Bin 0 -> 391 bytes .../gambas/32/draw-rectangle.png | Bin 0 -> 136 bytes .../src/gb.form.stock/gambas/32/draw-text.png | Bin 0 -> 547 bytes comp/src/gb.form.stock/gambas/32/earth.png | Bin 0 -> 1090 bytes comp/src/gb.form.stock/gambas/32/edit.png | Bin 0 -> 269 bytes comp/src/gb.form.stock/gambas/32/eject.png | Bin 0 -> 190 bytes comp/src/gb.form.stock/gambas/32/end.png | Bin 0 -> 187 bytes comp/src/gb.form.stock/gambas/32/erase.png | Bin 0 -> 229 bytes comp/src/gb.form.stock/gambas/32/error.png | Bin 0 -> 357 bytes .../src/gb.form.stock/gambas/32/exclusive.png | Bin 0 -> 156 bytes comp/src/gb.form.stock/gambas/32/exec.png | Bin 0 -> 273 bytes .../gb.form.stock/gambas/32/file-manager.png | Bin 0 -> 140 bytes comp/src/gb.form.stock/gambas/32/file.png | Bin 0 -> 139 bytes comp/src/gb.form.stock/gambas/32/fill.png | Bin 0 -> 290 bytes comp/src/gb.form.stock/gambas/32/filter.png | Bin 0 -> 181 bytes comp/src/gb.form.stock/gambas/32/find.png | Bin 0 -> 402 bytes comp/src/gb.form.stock/gambas/32/first.png | Bin 0 -> 206 bytes comp/src/gb.form.stock/gambas/32/flag.png | Bin 0 -> 180 bytes comp/src/gb.form.stock/gambas/32/flip-h.png | Bin 0 -> 196 bytes comp/src/gb.form.stock/gambas/32/flip-v.png | Bin 0 -> 193 bytes comp/src/gb.form.stock/gambas/32/floppy.png | Bin 0 -> 184 bytes comp/src/gb.form.stock/gambas/32/font.png | Bin 0 -> 232 bytes comp/src/gb.form.stock/gambas/32/forward.png | Bin 0 -> 205 bytes .../gb.form.stock/gambas/32/fullscreen.png | Bin 0 -> 220 bytes comp/src/gb.form.stock/gambas/32/gambas.png | Bin 0 -> 946 bytes comp/src/gb.form.stock/gambas/32/game.png | Bin 0 -> 226 bytes comp/src/gb.form.stock/gambas/32/gamma.png | Bin 0 -> 368 bytes comp/src/gb.form.stock/gambas/32/gnu.png | Bin 0 -> 1370 bytes comp/src/gb.form.stock/gambas/32/green.png | Bin 0 -> 505 bytes comp/src/gb.form.stock/gambas/32/grid.png | Bin 0 -> 139 bytes comp/src/gb.form.stock/gambas/32/group.png | Bin 0 -> 917 bytes comp/src/gb.form.stock/gambas/32/h.png | Bin 0 -> 207 bytes comp/src/gb.form.stock/gambas/32/halt.png | Bin 0 -> 381 bytes comp/src/gb.form.stock/gambas/32/harddisk.png | Bin 0 -> 160 bytes comp/src/gb.form.stock/gambas/32/hardware.png | Bin 0 -> 172 bytes comp/src/gb.form.stock/gambas/32/help.png | Bin 0 -> 610 bytes comp/src/gb.form.stock/gambas/32/home.png | Bin 0 -> 197 bytes comp/src/gb.form.stock/gambas/32/html.png | Bin 0 -> 374 bytes comp/src/gb.form.stock/gambas/32/hue.png | Bin 0 -> 558 bytes comp/src/gb.form.stock/gambas/32/identity.png | Bin 0 -> 221 bytes comp/src/gb.form.stock/gambas/32/image.png | Bin 0 -> 229 bytes .../src/gb.form.stock/gambas/32/important.png | Bin 0 -> 532 bytes comp/src/gb.form.stock/gambas/32/indent.png | Bin 0 -> 179 bytes comp/src/gb.form.stock/gambas/32/info.png | Bin 0 -> 165 bytes .../gb.form.stock/gambas/32/insert-image.png | Bin 0 -> 299 bytes .../gb.form.stock/gambas/32/insert-link.png | Bin 0 -> 1003 bytes .../gb.form.stock/gambas/32/insert-text.png | Bin 0 -> 215 bytes comp/src/gb.form.stock/gambas/32/internet.png | Bin 0 -> 838 bytes .../gb.form.stock/gambas/32/intersection.png | Bin 0 -> 164 bytes comp/src/gb.form.stock/gambas/32/js.png | Bin 0 -> 539 bytes comp/src/gb.form.stock/gambas/32/jump.png | Bin 0 -> 229 bytes comp/src/gb.form.stock/gambas/32/key.png | Bin 0 -> 287 bytes comp/src/gb.form.stock/gambas/32/keyboard.png | Bin 0 -> 450 bytes comp/src/gb.form.stock/gambas/32/lamp.png | Bin 0 -> 366 bytes comp/src/gb.form.stock/gambas/32/language.png | Bin 0 -> 168 bytes comp/src/gb.form.stock/gambas/32/last.png | Bin 0 -> 206 bytes comp/src/gb.form.stock/gambas/32/layout.png | Bin 0 -> 423 bytes comp/src/gb.form.stock/gambas/32/left.png | Bin 0 -> 235 bytes .../src/gb.form.stock/gambas/32/lightness.png | Bin 0 -> 387 bytes comp/src/gb.form.stock/gambas/32/link.png | Bin 0 -> 984 bytes comp/src/gb.form.stock/gambas/32/linux.png | Bin 0 -> 1446 bytes comp/src/gb.form.stock/gambas/32/lock.png | Bin 0 -> 262 bytes comp/src/gb.form.stock/gambas/32/lower.png | Bin 0 -> 144 bytes comp/src/gb.form.stock/gambas/32/mail.png | Bin 0 -> 163 bytes comp/src/gb.form.stock/gambas/32/make-all.png | Bin 0 -> 192 bytes comp/src/gb.form.stock/gambas/32/make.png | Bin 0 -> 234 bytes .../gb.form.stock/gambas/32/media-player.png | Bin 0 -> 179 bytes comp/src/gb.form.stock/gambas/32/menu.png | Bin 0 -> 131 bytes .../gb.form.stock/gambas/32/microphone.png | Bin 0 -> 526 bytes comp/src/gb.form.stock/gambas/32/monitor.png | Bin 0 -> 226 bytes comp/src/gb.form.stock/gambas/32/mouse.png | Bin 0 -> 273 bytes .../gb.form.stock/gambas/32/multimedia.png | Bin 0 -> 297 bytes comp/src/gb.form.stock/gambas/32/muted.png | Bin 0 -> 340 bytes comp/src/gb.form.stock/gambas/32/network.png | Bin 0 -> 210 bytes comp/src/gb.form.stock/gambas/32/new-dir.png | Bin 0 -> 217 bytes comp/src/gb.form.stock/gambas/32/new-tab.png | Bin 0 -> 225 bytes comp/src/gb.form.stock/gambas/32/new-tag.png | Bin 0 -> 260 bytes .../gb.form.stock/gambas/32/new-window.png | Bin 0 -> 234 bytes comp/src/gb.form.stock/gambas/32/new.png | Bin 0 -> 173 bytes comp/src/gb.form.stock/gambas/32/next.png | Bin 0 -> 194 bytes .../gb.form.stock/gambas/32/office-calc.png | Bin 0 -> 157 bytes .../gb.form.stock/gambas/32/office-draw.png | Bin 0 -> 226 bytes comp/src/gb.form.stock/gambas/32/office.png | Bin 0 -> 163 bytes comp/src/gb.form.stock/gambas/32/ok.png | Bin 0 -> 240 bytes comp/src/gb.form.stock/gambas/32/opacity.png | Bin 0 -> 472 bytes .../gb.form.stock/gambas/32/open-recent.png | Bin 0 -> 251 bytes comp/src/gb.form.stock/gambas/32/open.png | Bin 0 -> 198 bytes comp/src/gb.form.stock/gambas/32/options.png | Bin 0 -> 275 bytes comp/src/gb.form.stock/gambas/32/package.png | Bin 0 -> 200 bytes comp/src/gb.form.stock/gambas/32/paste.png | Bin 0 -> 159 bytes comp/src/gb.form.stock/gambas/32/pause.png | Bin 0 -> 137 bytes comp/src/gb.form.stock/gambas/32/pda.png | Bin 0 -> 155 bytes comp/src/gb.form.stock/gambas/32/pdf.png | Bin 0 -> 505 bytes comp/src/gb.form.stock/gambas/32/pen.png | Bin 0 -> 223 bytes comp/src/gb.form.stock/gambas/32/people.png | Bin 0 -> 830 bytes comp/src/gb.form.stock/gambas/32/phone.png | Bin 0 -> 155 bytes comp/src/gb.form.stock/gambas/32/play.png | Bin 0 -> 183 bytes comp/src/gb.form.stock/gambas/32/plugin.png | Bin 0 -> 279 bytes comp/src/gb.form.stock/gambas/32/preview.png | Bin 0 -> 389 bytes comp/src/gb.form.stock/gambas/32/previous.png | Bin 0 -> 201 bytes comp/src/gb.form.stock/gambas/32/print.png | Bin 0 -> 173 bytes comp/src/gb.form.stock/gambas/32/printer.png | Bin 0 -> 258 bytes comp/src/gb.form.stock/gambas/32/program.png | Bin 0 -> 182 bytes .../gb.form.stock/gambas/32/properties.png | Bin 0 -> 160 bytes comp/src/gb.form.stock/gambas/32/question.png | Bin 0 -> 686 bytes comp/src/gb.form.stock/gambas/32/quit.png | Bin 0 -> 374 bytes comp/src/gb.form.stock/gambas/32/raise.png | Bin 0 -> 155 bytes comp/src/gb.form.stock/gambas/32/recent.png | Bin 0 -> 287 bytes comp/src/gb.form.stock/gambas/32/record.png | Bin 0 -> 321 bytes comp/src/gb.form.stock/gambas/32/red.png | Bin 0 -> 575 bytes comp/src/gb.form.stock/gambas/32/redo.png | Bin 0 -> 367 bytes comp/src/gb.form.stock/gambas/32/refresh.png | Bin 0 -> 467 bytes comp/src/gb.form.stock/gambas/32/remove.png | Bin 0 -> 158 bytes comp/src/gb.form.stock/gambas/32/rename.png | Bin 0 -> 214 bytes comp/src/gb.form.stock/gambas/32/replace.png | Bin 0 -> 400 bytes comp/src/gb.form.stock/gambas/32/resize.png | Bin 0 -> 194 bytes comp/src/gb.form.stock/gambas/32/revert.png | Bin 0 -> 246 bytes comp/src/gb.form.stock/gambas/32/rewind.png | Bin 0 -> 203 bytes comp/src/gb.form.stock/gambas/32/right.png | Bin 0 -> 225 bytes .../gb.form.stock/gambas/32/rotate-left.png | Bin 0 -> 187 bytes .../gb.form.stock/gambas/32/rotate-right.png | Bin 0 -> 187 bytes comp/src/gb.form.stock/gambas/32/rotate.png | Bin 0 -> 358 bytes .../gb.form.stock/gambas/32/saturation.png | Bin 0 -> 446 bytes comp/src/gb.form.stock/gambas/32/save-as.png | Bin 0 -> 197 bytes comp/src/gb.form.stock/gambas/32/save.png | Bin 0 -> 189 bytes comp/src/gb.form.stock/gambas/32/scanner.png | Bin 0 -> 282 bytes comp/src/gb.form.stock/gambas/32/science.png | Bin 0 -> 439 bytes comp/src/gb.form.stock/gambas/32/screen.png | Bin 0 -> 182 bytes comp/src/gb.form.stock/gambas/32/script.png | Bin 0 -> 421 bytes comp/src/gb.form.stock/gambas/32/security.png | Bin 0 -> 723 bytes .../gb.form.stock/gambas/32/select-all.png | Bin 0 -> 203 bytes comp/src/gb.form.stock/gambas/32/select.png | Bin 0 -> 188 bytes comp/src/gb.form.stock/gambas/32/server.png | Bin 0 -> 165 bytes comp/src/gb.form.stock/gambas/32/share.png | Bin 0 -> 288 bytes comp/src/gb.form.stock/gambas/32/shortcut.png | Bin 0 -> 220 bytes .../gb.form.stock/gambas/32/sort-ascent.png | Bin 0 -> 171 bytes .../gb.form.stock/gambas/32/sort-descent.png | Bin 0 -> 174 bytes .../gb.form.stock/gambas/32/spell-check.png | Bin 0 -> 291 bytes comp/src/gb.form.stock/gambas/32/star.png | Bin 0 -> 600 bytes comp/src/gb.form.stock/gambas/32/start.png | Bin 0 -> 191 bytes comp/src/gb.form.stock/gambas/32/stop.png | Bin 0 -> 137 bytes comp/src/gb.form.stock/gambas/32/sun.png | Bin 0 -> 339 bytes comp/src/gb.form.stock/gambas/32/system.png | Bin 0 -> 174 bytes comp/src/gb.form.stock/gambas/32/table.png | Bin 0 -> 153 bytes comp/src/gb.form.stock/gambas/32/tablet.png | Bin 0 -> 295 bytes comp/src/gb.form.stock/gambas/32/tag.png | Bin 0 -> 248 bytes comp/src/gb.form.stock/gambas/32/terminal.png | Bin 0 -> 166 bytes .../gb.form.stock/gambas/32/text-baseline.png | Bin 0 -> 184 bytes .../src/gb.form.stock/gambas/32/text-bold.png | Bin 0 -> 568 bytes .../gb.form.stock/gambas/32/text-bottom.png | Bin 0 -> 169 bytes .../gb.form.stock/gambas/32/text-center.png | Bin 0 -> 147 bytes .../src/gb.form.stock/gambas/32/text-fill.png | Bin 0 -> 131 bytes .../gb.form.stock/gambas/32/text-italic.png | Bin 0 -> 686 bytes .../src/gb.form.stock/gambas/32/text-left.png | Bin 0 -> 143 bytes .../gb.form.stock/gambas/32/text-lower.png | Bin 0 -> 292 bytes .../gb.form.stock/gambas/32/text-middle.png | Bin 0 -> 186 bytes .../gb.form.stock/gambas/32/text-right.png | Bin 0 -> 143 bytes .../gb.form.stock/gambas/32/text-strike.png | Bin 0 -> 621 bytes comp/src/gb.form.stock/gambas/32/text-top.png | Bin 0 -> 168 bytes .../gambas/32/text-underline.png | Bin 0 -> 663 bytes .../gb.form.stock/gambas/32/text-upper.png | Bin 0 -> 481 bytes comp/src/gb.form.stock/gambas/32/text.png | Bin 0 -> 152 bytes comp/src/gb.form.stock/gambas/32/tools.png | Bin 0 -> 341 bytes comp/src/gb.form.stock/gambas/32/top.png | Bin 0 -> 179 bytes .../gb.form.stock/gambas/32/transparency.png | Bin 0 -> 160 bytes comp/src/gb.form.stock/gambas/32/trash.png | Bin 0 -> 195 bytes comp/src/gb.form.stock/gambas/32/undo.png | Bin 0 -> 361 bytes comp/src/gb.form.stock/gambas/32/unindent.png | Bin 0 -> 179 bytes comp/src/gb.form.stock/gambas/32/union.png | Bin 0 -> 164 bytes comp/src/gb.form.stock/gambas/32/unlock.png | Bin 0 -> 290 bytes comp/src/gb.form.stock/gambas/32/unselect.png | Bin 0 -> 526 bytes comp/src/gb.form.stock/gambas/32/up.png | Bin 0 -> 201 bytes comp/src/gb.form.stock/gambas/32/upload.png | Bin 0 -> 344 bytes comp/src/gb.form.stock/gambas/32/user.png | Bin 0 -> 474 bytes comp/src/gb.form.stock/gambas/32/vector.png | Bin 0 -> 244 bytes comp/src/gb.form.stock/gambas/32/video.png | Bin 0 -> 209 bytes .../gb.form.stock/gambas/32/view-detail.png | Bin 0 -> 140 bytes .../src/gb.form.stock/gambas/32/view-icon.png | Bin 0 -> 131 bytes .../gb.form.stock/gambas/32/view-normal.png | Bin 0 -> 213 bytes .../gb.form.stock/gambas/32/view-split-h.png | Bin 0 -> 151 bytes .../gb.form.stock/gambas/32/view-split-v.png | Bin 0 -> 147 bytes .../src/gb.form.stock/gambas/32/view-tree.png | Bin 0 -> 150 bytes comp/src/gb.form.stock/gambas/32/volume.png | Bin 0 -> 475 bytes comp/src/gb.form.stock/gambas/32/vpn.png | Bin 0 -> 325 bytes comp/src/gb.form.stock/gambas/32/warning.png | Bin 0 -> 336 bytes comp/src/gb.form.stock/gambas/32/watch.png | Bin 0 -> 496 bytes comp/src/gb.form.stock/gambas/32/webcam.png | Bin 0 -> 539 bytes comp/src/gb.form.stock/gambas/32/wifi.png | Bin 0 -> 605 bytes comp/src/gb.form.stock/gambas/32/wizard.png | Bin 0 -> 307 bytes comp/src/gb.form.stock/gambas/32/zoom-fit.png | Bin 0 -> 554 bytes comp/src/gb.form.stock/gambas/32/zoom-in.png | Bin 0 -> 453 bytes .../gb.form.stock/gambas/32/zoom-normal.png | Bin 0 -> 503 bytes comp/src/gb.form.stock/gambas/32/zoom-out.png | Bin 0 -> 450 bytes comp/src/gb.form.stock/links | 44 + comp/src/gb.form.terminal/.component | 7 + comp/src/gb.form.terminal/.directory | 2 + .../.hidden/Konsole keys README.txt | 73 + .../gb.form.terminal/.hidden/Konsole keys.txt | 175 + .../.hidden/XTerm control sequences.txt | 1849 + .../.hidden/XtermTests/16colors.sh | 119 + .../.hidden/XtermTests/256colors.pl | 51 + .../.hidden/XtermTests/256colors2.pl | 180 + .../.hidden/XtermTests/88colors.pl | 49 + .../.hidden/XtermTests/88colors2.pl | 182 + .../.hidden/XtermTests/8colors.sh | 107 + .../.hidden/XtermTests/acolors.sh | 93 + .../.hidden/XtermTests/doublechars.sh | 116 + .../.hidden/XtermTests/dynamic.pl | 132 + .../.hidden/XtermTests/dynamic.sh | 89 + .../.hidden/XtermTests/dynamic2.sh | 114 + .../.hidden/XtermTests/fonts.sh | 88 + .../.hidden/XtermTests/paste64.pl | 190 + .../.hidden/XtermTests/query-color.pl | 169 + .../.hidden/XtermTests/query-fonts.pl | 167 + .../.hidden/XtermTests/resize.pl | 141 + .../.hidden/XtermTests/resize.sh | 111 + .../.hidden/XtermTests/tcapquery.pl | 325 + .../.hidden/XtermTests/title.sh | 84 + comp/src/gb.form.terminal/.hidden/XtermVT100 | 457 + .../.hidden/control/terminalview.png | Bin 0 -> 149 bytes comp/src/gb.form.terminal/.icon.png | Bin 0 -> 5678 bytes comp/src/gb.form.terminal/.lang/fr.po | 31 + comp/src/gb.form.terminal/.lang/it.po | 32 + comp/src/gb.form.terminal/.lang/pt_BR.po | 112 + comp/src/gb.form.terminal/.lang/ru.po | 42 + comp/src/gb.form.terminal/.project | 19 + .../.src/TerminalView/CTerminalLine.class | 144 + .../.src/TerminalView/TerminalAttr.class | 70 + .../.src/TerminalView/TerminalFilter.class | 25 + .../TerminalView/TerminalFilter_VT100.class | 874 + .../.src/TerminalView/TerminalScreen.class | 2257 + .../.src/TerminalView/TerminalView.class | 1491 + .../.src/TerminalView/test/FOtherTest.class | 11 + .../.src/TerminalView/test/FOtherTest.form | 8 + .../TerminalView/test/FTestTerminalView.class | 128 + .../TerminalView/test/FTestTerminalView.form | 56 + .../.src/TerminalView/test/Form1.class | 44 + .../.src/TerminalView/test/Form1.form | 9 + .../.src/TerminalView/test/MTest.module | 8 + .../.src/TerminalView/test/PipeTest.class | 224 + .../.src/TerminalView/test/PipeTest.form | 75 + .../.src/TerminalView/test/PipedTask.class | 73 + .../TerminalView/test/TelNetProtocol.class | 139 + .../.src/TerminalView/test/VT100/Attr.class | 220 + .../TerminalView/test/VT100/Console.class | 63 + .../.src/TerminalView/test/VT100/Main.module | 38 + comp/src/gb.form.terminal/brush_dark.png | Bin 0 -> 85 bytes comp/src/gb.form.terminal/brush_light.png | Bin 0 -> 85 bytes comp/src/gb.form.terminal/brush_medium.png | Bin 0 -> 85 bytes comp/src/gb.form/.component | 5 + comp/src/gb.form/.directory | 2 + comp/src/gb.form/.hidden/CHANGELOG | 9 + .../src/gb.form/.hidden/control/buttonbox.png | Bin 0 -> 162 bytes .../gb.form/.hidden/control/colorbutton.png | Bin 0 -> 504 bytes .../gb.form/.hidden/control/colorchooser.png | Bin 0 -> 745 bytes .../gb.form/.hidden/control/colorpalette.png | Bin 0 -> 221 bytes comp/src/gb.form/.hidden/control/datebox.png | Bin 0 -> 261 bytes .../gb.form/.hidden/control/datechooser.png | Bin 0 -> 547 bytes comp/src/gb.form/.hidden/control/dirbox.png | Bin 0 -> 154 bytes .../gb.form/.hidden/control/dirchooser.png | Bin 0 -> 164 bytes comp/src/gb.form/.hidden/control/dirview.png | Bin 0 -> 154 bytes .../gb.form/.hidden/control/documentview.png | Bin 0 -> 620 bytes comp/src/gb.form/.hidden/control/expander.png | Bin 0 -> 400 bytes .../gb.form/.hidden/control/filechooser.png | Bin 0 -> 155 bytes .../.hidden/control/fileproperties.png | Bin 0 -> 216 bytes comp/src/gb.form/.hidden/control/fileview.png | Bin 0 -> 194 bytes comp/src/gb.form/.hidden/control/fontbox.png | Bin 0 -> 267 bytes .../gb.form/.hidden/control/fontchooser.png | Bin 0 -> 372 bytes .../src/gb.form/.hidden/control/iconpanel.png | Bin 0 -> 139 bytes .../src/gb.form/.hidden/control/imageview.png | Bin 0 -> 363 bytes comp/src/gb.form/.hidden/control/lcdlabel.png | Bin 0 -> 492 bytes .../gb.form/.hidden/control/listcontainer.png | Bin 0 -> 356 bytes .../gb.form/.hidden/control/listeditor.png | Bin 0 -> 329 bytes comp/src/gb.form/.hidden/control/maskbox.png | Bin 0 -> 338 bytes .../gb.form/.hidden/control/menubutton.png | Bin 0 -> 600 bytes .../gb.form/.hidden/control/messageview.png | Bin 0 -> 138 bytes .../src/gb.form/.hidden/control/sidepanel.png | Bin 0 -> 927 bytes .../src/gb.form/.hidden/control/sliderbox.png | Bin 0 -> 292 bytes comp/src/gb.form/.hidden/control/spinbar.png | Bin 0 -> 201 bytes comp/src/gb.form/.hidden/control/spinner.png | Bin 0 -> 518 bytes .../gb.form/.hidden/control/switchbutton.png | Bin 0 -> 365 bytes .../src/gb.form/.hidden/control/tableview.png | Bin 0 -> 249 bytes comp/src/gb.form/.hidden/control/tabpanel.png | Bin 0 -> 128 bytes comp/src/gb.form/.hidden/control/timebox.png | Bin 0 -> 272 bytes .../src/gb.form/.hidden/control/toolpanel.png | Bin 0 -> 139 bytes comp/src/gb.form/.hidden/control/urllabel.png | Bin 0 -> 382 bytes comp/src/gb.form/.hidden/control/valuebox.png | Bin 0 -> 328 bytes comp/src/gb.form/.hidden/control/wizard.png | Bin 0 -> 198 bytes comp/src/gb.form/.icon.png | Bin 0 -> 10933 bytes comp/src/gb.form/.lang/ar.po | 710 + comp/src/gb.form/.lang/ca.po | 716 + comp/src/gb.form/.lang/cs.po | 716 + comp/src/gb.form/.lang/de.po | 720 + comp/src/gb.form/.lang/es.po | 718 + comp/src/gb.form/.lang/es_ES.po | 718 + comp/src/gb.form/.lang/fa.po | 710 + comp/src/gb.form/.lang/fr.po | 464 + comp/src/gb.form/.lang/it.po | 716 + comp/src/gb.form/.lang/ja.po | 712 + comp/src/gb.form/.lang/nl.po | 719 + comp/src/gb.form/.lang/pt_BR.po | 441 + comp/src/gb.form/.lang/ru.po | 722 + comp/src/gb.form/.lang/sv.po | 710 + comp/src/gb.form/.lang/zh.po | 716 + comp/src/gb.form/.lang/zh_TW.po | 710 + comp/src/gb.form/.project | 30 + comp/src/gb.form/.src/Balloon/Balloon.class | 89 + comp/src/gb.form/.src/Balloon/FBalloon.class | 421 + comp/src/gb.form/.src/Balloon/FBalloon.form | 26 + comp/src/gb.form/.src/Button/ButtonBox.class | 382 + comp/src/gb.form/.src/Button/MenuButton.class | 574 + .../gb.form/.src/Button/SwitchButton.class | 251 + comp/src/gb.form/.src/Color/ColorButton.class | 148 + .../src/gb.form/.src/Color/ColorChooser.class | 113 + .../src/gb.form/.src/Color/ColorPalette.class | 389 + .../gb.form/.src/Color/FColorChooser.class | 609 + .../src/gb.form/.src/Color/FColorChooser.form | 192 + comp/src/gb.form/.src/Completion.class | 342 + comp/src/gb.form/.src/Date/DateBox.class | 286 + comp/src/gb.form/.src/Date/DateChooser.class | 265 + comp/src/gb.form/.src/Date/FCalendar.class | 917 + comp/src/gb.form/.src/Date/FCalendar.form | 116 + comp/src/gb.form/.src/Date/TimeBox.class | 218 + .../.src/Date/_DateChooser_Colors.class | 26 + .../gb.form/.src/Date/_DateChooser_Data.class | 27 + .../gb.form/.src/Date/_DateChooser_Date.class | 68 + .../.src/DocumentView/DocumentView.class | 1048 + .../.src/DocumentView/_DocumentItem.class | 40 + .../.src/DocumentView/_DocumentLayout.class | 8 + comp/src/gb.form/.src/Expander/Expander.class | 100 + .../src/gb.form/.src/Expander/FExpander.class | 218 + comp/src/gb.form/.src/Expander/FExpander.form | 22 + comp/src/gb.form/.src/FInputBox.class | 56 + comp/src/gb.form/.src/FInputBox.form | 39 + comp/src/gb.form/.src/File/Bookmark.class | 11 + .../.src/File/Bookmark/CBookmark.class | 54 + .../.src/File/Bookmark/CBookmarkList.class | 190 + .../.src/File/Bookmark/FEditBookmark.class | 140 + .../.src/File/Bookmark/FEditBookmark.form | 50 + comp/src/gb.form/.src/File/Bookmarks.class | 63 + comp/src/gb.form/.src/File/CTaskPreview.class | 98 + .../gb.form/.src/File/Chooser/DirButton.class | 134 + .../.src/File/Chooser/DirChooser.class | 272 + .../.src/File/Chooser/FDirChooser.class | 1676 + .../.src/File/Chooser/FDirChooser.form | 183 + .../.src/File/Chooser/FileChooser.class | 414 + comp/src/gb.form/.src/File/DirBox.class | 65 + comp/src/gb.form/.src/File/DirCache.class | 159 + comp/src/gb.form/.src/File/DirView.class | 725 + comp/src/gb.form/.src/File/FileView.class | 1258 + .../.src/File/Properties/CTaskDirSize.class | 71 + .../File/Properties/FFileProperties.class | 467 + .../.src/File/Properties/FFileProperties.form | 198 + .../.src/File/Properties/FileProperties.class | 98 + .../File/Properties/_FilePropertiesData.class | 6 + comp/src/gb.form/.src/FileCompletion.class | 42 + comp/src/gb.form/.src/Font/FFontChooser.class | 574 + comp/src/gb.form/.src/Font/FFontChooser.form | 88 + comp/src/gb.form/.src/Font/FontBox.class | 114 + comp/src/gb.form/.src/Font/FontChooser.class | 153 + comp/src/gb.form/.src/Help.module | 74 + .../gb.form/.src/IconPanel/IconPanel.class | 383 + .../.src/IconPanel/_IconPanelContainer.class | 84 + .../gb.form/.src/ImageView/ImageView.class | 415 + comp/src/gb.form/.src/InputBox.class | 9 + comp/src/gb.form/.src/LCDLabel.class | 455 + comp/src/gb.form/.src/ListContainer.class | 413 + .../gb.form/.src/ListEditor/FListEditor.class | 341 + .../gb.form/.src/ListEditor/FListEditor.form | 52 + .../gb.form/.src/ListEditor/ListEditor.class | 170 + comp/src/gb.form/.src/Main.module | 251 + comp/src/gb.form/.src/MaskBox.class | 748 + comp/src/gb.form/.src/Message/FMessage.class | 87 + comp/src/gb.form/.src/Message/FMessage.form | 43 + comp/src/gb.form/.src/Message/Message.module | 9 + .../gb.form/.src/Message/MessageView.class | 235 + comp/src/gb.form/.src/MessageLabel.class | 151 + .../.src/MultiContainer/_MultiContainer.class | 237 + .../MultiContainer/_MultiContainerTab.class | 67 + .../gb.form/.src/SidePanel/FSidePanel.class | 1179 + .../gb.form/.src/SidePanel/FSidePanel.form | 25 + .../gb.form/.src/SidePanel/SidePanel.class | 228 + comp/src/gb.form/.src/SliderBox.class | 190 + comp/src/gb.form/.src/SpinBar/SpinBar.class | 433 + comp/src/gb.form/.src/Spinner.class | 200 + comp/src/gb.form/.src/Stock.class | 836 + comp/src/gb.form/.src/TabPanel/TabPanel.class | 1083 + .../.src/TabPanel/_TabPanelButton.class | 580 + .../.src/TabPanel/_TabPanelContainer.class | 108 + comp/src/gb.form/.src/TableView.class | 558 + comp/src/gb.form/.src/Test/FBugFileView.class | 22 + comp/src/gb.form/.src/Test/FBugFileView.form | 27 + .../src/gb.form/.src/Test/FDocumentView.class | 137 + comp/src/gb.form/.src/Test/FDocumentView.form | 84 + comp/src/gb.form/.src/Test/FFont.class | 2 + comp/src/gb.form/.src/Test/FFont.form | 10 + comp/src/gb.form/.src/Test/FIconPanel.class | 3 + comp/src/gb.form/.src/Test/FIconPanel.form | 32 + comp/src/gb.form/.src/Test/FIconView.class | 30 + comp/src/gb.form/.src/Test/FIconView.form | 20 + comp/src/gb.form/.src/Test/FLCDLabel.class | 17 + comp/src/gb.form/.src/Test/FLCDLabel.form | 19 + comp/src/gb.form/.src/Test/FMain.class | 20 + comp/src/gb.form/.src/Test/FMain.form | 70 + comp/src/gb.form/.src/Test/FSpinBar.class | 1 + comp/src/gb.form/.src/Test/FSpinBar.form | 27 + comp/src/gb.form/.src/Test/FSpinner.class | 15 + comp/src/gb.form/.src/Test/FSpinner.form | 17 + .../src/gb.form/.src/Test/FSwitchButton.class | 13 + comp/src/gb.form/.src/Test/FSwitchButton.form | 43 + comp/src/gb.form/.src/Test/FTableView.class | 51 + comp/src/gb.form/.src/Test/FTableView.form | 17 + .../gb.form/.src/Test/FTestArrangement.class | 14 + .../gb.form/.src/Test/FTestArrangement.form | 18 + comp/src/gb.form/.src/Test/FTestBalloon.class | 19 + comp/src/gb.form/.src/Test/FTestBalloon.form | 14 + .../gb.form/.src/Test/FTestColorChooser.class | 26 + .../gb.form/.src/Test/FTestColorChooser.form | 16 + .../gb.form/.src/Test/FTestCompletion.class | 24 + .../gb.form/.src/Test/FTestCompletion.form | 21 + .../gb.form/.src/Test/FTestDateChooser.class | 26 + .../gb.form/.src/Test/FTestDateChooser.form | 39 + .../src/gb.form/.src/Test/FTestExpander.class | 2 + comp/src/gb.form/.src/Test/FTestExpander.form | 22 + .../gb.form/.src/Test/FTestFileChooser.class | 51 + .../gb.form/.src/Test/FTestFileChooser.form | 77 + .../src/gb.form/.src/Test/FTestFileView.class | 2 + comp/src/gb.form/.src/Test/FTestFileView.form | 12 + .../gb.form/.src/Test/FTestImageView.class | 52 + .../src/gb.form/.src/Test/FTestImageView.form | 5 + .../gb.form/.src/Test/FTestListEditor.class | 8 + .../gb.form/.src/Test/FTestListEditor.form | 9 + comp/src/gb.form/.src/Test/FTestMaskBox.class | 14 + comp/src/gb.form/.src/Test/FTestMaskBox.form | 10 + .../gb.form/.src/Test/FTestMenuButton.class | 2 + .../gb.form/.src/Test/FTestMenuButton.form | 99 + .../gb.form/.src/Test/FTestMessageView.class | 8 + .../gb.form/.src/Test/FTestMessageView.form | 25 + .../gb.form/.src/Test/FTestSidePanel.class | 21 + .../src/gb.form/.src/Test/FTestSidePanel.form | 40 + .../src/gb.form/.src/Test/FTestTabPanel.class | 85 + comp/src/gb.form/.src/Test/FTestTabPanel.form | 56 + comp/src/gb.form/.src/Test/FTestTimeBox.class | 2 + comp/src/gb.form/.src/Test/FTestTimeBox.form | 12 + .../gb.form/.src/Test/FTestToolPanel.class | 2 + .../src/gb.form/.src/Test/FTestToolPanel.form | 16 + .../src/gb.form/.src/Test/FTestValueBox.class | 8 + comp/src/gb.form/.src/Test/FTestValueBox.form | 22 + comp/src/gb.form/.src/Test/FTestWizard.class | 8 + comp/src/gb.form/.src/Test/FTestWizard.form | 29 + comp/src/gb.form/.src/Test/FWiki.class | 10 + comp/src/gb.form/.src/Test/FWiki.form | 27 + comp/src/gb.form/.src/Test/Form1.class | 33 + comp/src/gb.form/.src/Test/Form1.form | 30 + comp/src/gb.form/.src/Test/Form2.class | 87 + comp/src/gb.form/.src/Test/Form2.form | 100 + comp/src/gb.form/.src/Test/Form4.class | 10 + comp/src/gb.form/.src/Test/Form4.form | 15 + comp/src/gb.form/.src/TestControl.class | 11 + .../src/gb.form/.src/ToolPanel/FToolBar.class | 73 + comp/src/gb.form/.src/ToolPanel/FToolBar.form | 15 + .../gb.form/.src/ToolPanel/ToolPanel.class | 270 + .../.src/ToolPanel/ToolPanelContainer.class | 97 + comp/src/gb.form/.src/URLLabel.class | 131 + comp/src/gb.form/.src/ValueBox.class | 392 + comp/src/gb.form/.src/Wizard/FWizard.class | 150 + comp/src/gb.form/.src/Wizard/FWizard.form | 51 + comp/src/gb.form/.src/Wizard/Wizard.class | 452 + .../.src/Wizard/_WizardContainer.class | 56 + comp/src/gb.form/img/16/cross.png | Bin 0 -> 115 bytes comp/src/gb.form/img/32/filter-menu.png | Bin 0 -> 533 bytes comp/src/gb.form/img/32/filter.png | Bin 0 -> 518 bytes comp/src/gb.form/img/32/warning.png | Bin 0 -> 1932 bytes .../gb.form/img/8/new/side-bottom-void.png | Bin 0 -> 117 bytes comp/src/gb.form/img/8/new/side-bottom.png | Bin 0 -> 111 bytes comp/src/gb.form/img/8/new/side-left.png | Bin 0 -> 112 bytes .../src/gb.form/img/8/new/side-right-void.png | Bin 0 -> 115 bytes comp/src/gb.form/img/8/new/side-right.png | Bin 0 -> 112 bytes comp/src/gb.form/img/8/new/side-top.png | Bin 0 -> 112 bytes comp/src/gb.form/img/8/side-bottom-void.png | Bin 0 -> 112 bytes comp/src/gb.form/img/8/side-bottom.png | Bin 0 -> 112 bytes comp/src/gb.form/img/8/side-left.png | Bin 0 -> 113 bytes comp/src/gb.form/img/8/side-right-void.png | Bin 0 -> 112 bytes comp/src/gb.form/img/8/side-right.png | Bin 0 -> 109 bytes comp/src/gb.form/img/8/side-top.png | Bin 0 -> 115 bytes comp/src/gb.form/img/colormap.png | Bin 0 -> 1440 bytes comp/src/gb.form/img/cross.png | Bin 0 -> 299 bytes comp/src/gb.form/img/handle-h.png | Bin 0 -> 102 bytes comp/src/gb.form/img/handle-v.png | Bin 0 -> 97 bytes comp/src/gb.form/img/lock.png | Bin 0 -> 724 bytes comp/src/gb.form/img/round.png | Bin 0 -> 124 bytes comp/src/gb.form/img/select-dark.png | Bin 0 -> 112 bytes comp/src/gb.form/img/select.png | Bin 0 -> 114 bytes comp/src/gb.form/img/unknown.svg | 72 + comp/src/gb.form/img/valuemap.png | Bin 0 -> 897 bytes comp/src/gb.form/map/icon.map | 243 + comp/src/gb.form/stock/16/gambas.png | Bin 0 -> 489 bytes comp/src/gb.form/stock/16/gnu.png | Bin 0 -> 360 bytes comp/src/gb.form/stock/16/linux.png | Bin 0 -> 638 bytes comp/src/gb.form/stock/32/gambas.png | Bin 0 -> 925 bytes comp/src/gb.form/stock/32/gnu.png | Bin 0 -> 1022 bytes comp/src/gb.form/stock/32/linux.png | Bin 0 -> 1446 bytes comp/src/gb.form/stock/scalable/gambas.svg | 91 + comp/src/gb.form/stock/scalable/gnu.svg | 94 + comp/src/gb.form/stock/scalable/linux.svg | 1 + comp/src/gb.gui.base/.component | 5 + comp/src/gb.gui.base/.directory | 2 + comp/src/gb.gui.base/.icon.png | Bin 0 -> 10933 bytes comp/src/gb.gui.base/.lang/de.po | 39 + comp/src/gb.gui.base/.lang/es.po | 40 + comp/src/gb.gui.base/.lang/fr.po | 224 + comp/src/gb.gui.base/.project | 15 + comp/src/gb.gui.base/.src/Action.class | 549 + comp/src/gb.gui.base/.src/Border.class | 861 + comp/src/gb.gui.base/.src/Draw.module | 674 + comp/src/gb.gui.base/.src/Fill.class | 5 + .../gb.gui.base/.src/GridView/GridView.class | 2455 + .../.src/GridView/GridViewSelection.class | 197 + .../.src/GridView/_GridView_Cell.class | 244 + .../.src/GridView/_GridView_Column.class | 149 + .../.src/GridView/_GridView_Columns.class | 260 + .../.src/GridView/_GridView_Data.class | 37 + .../.src/GridView/_GridView_Row.class | 109 + .../.src/GridView/_GridView_Rows.class | 558 + .../gb.gui.base/.src/IconView/IconView.class | 1639 + .../.src/IconView/_IconView_Item.class | 772 + comp/src/gb.gui.base/.src/Line.class | 5 + .../gb.gui.base/.src/ListBox/ListBox.class | 450 + .../.src/ListBox/_ListBox_Item.class | 47 + comp/src/gb.gui.base/.src/Main.module | 65 + .../gb.gui.base/.src/Message/FMessage.class | 106 + .../gb.gui.base/.src/Message/FMessage.form | 38 + .../gb.gui.base/.src/Message/Message.class | 75 + comp/src/gb.gui.base/.src/MyComboBox.class | 43 + comp/src/gb.gui.base/.src/Paint.class | 483 + comp/src/gb.gui.base/.src/Picture.class | 138 + comp/src/gb.gui.base/.src/PictureBox.class | 311 + comp/src/gb.gui.base/.src/ProgressBar.class | 188 + comp/src/gb.gui.base/.src/ScrollArea.class | 1076 + comp/src/gb.gui.base/.src/ScrollView.class | 127 + comp/src/gb.gui.base/.src/Shortcut.class | 49 + comp/src/gb.gui.base/.src/SpinBox.class | 550 + comp/src/gb.gui.base/.src/Split/HSplit.class | 15 + comp/src/gb.gui.base/.src/Split/VSplit.class | 15 + comp/src/gb.gui.base/.src/Split/_Split.class | 448 + comp/src/gb.gui.base/.src/Spring.class | 15 + comp/src/gb.gui.base/.src/Test/FBorder.class | 28 + comp/src/gb.gui.base/.src/Test/FBorder.form | 16 + .../src/gb.gui.base/.src/Test/FGridView.class | 206 + comp/src/gb.gui.base/.src/Test/FGridView.form | 57 + .../src/gb.gui.base/.src/Test/FIconView.class | 56 + comp/src/gb.gui.base/.src/Test/FIconView.form | 29 + comp/src/gb.gui.base/.src/Test/FListBox.class | 40 + comp/src/gb.gui.base/.src/Test/FListBox.form | 26 + comp/src/gb.gui.base/.src/Test/FMain.class | 35 + comp/src/gb.gui.base/.src/Test/FMain.form | 21 + comp/src/gb.gui.base/.src/Test/FPaint.class | 29 + comp/src/gb.gui.base/.src/Test/FPaint.form | 10 + .../gb.gui.base/.src/Test/FProgressBar.class | 21 + .../gb.gui.base/.src/Test/FProgressBar.form | 23 + .../gb.gui.base/.src/Test/FScrollArea.class | 45 + .../gb.gui.base/.src/Test/FScrollArea.form | 219 + .../gb.gui.base/.src/Test/FTestClipping.class | 36 + .../gb.gui.base/.src/Test/FTestClipping.form | 10 + .../gb.gui.base/.src/Test/FTestCombo.class | 48 + .../src/gb.gui.base/.src/Test/FTestCombo.form | 85 + .../.src/Test/FTestMouseWheel.class | 14 + .../.src/Test/FTestMouseWheel.form | 25 + .../src/gb.gui.base/.src/Test/FTreeView.class | 160 + comp/src/gb.gui.base/.src/Test/FTreeView.form | 75 + .../.src/Test/FileView/CTaskPreview.class | 98 + .../.src/Test/FileView/DirCache.class | 159 + .../.src/Test/FileView/FTestFileView.class | 14 + .../.src/Test/FileView/FTestFileView.form | 17 + .../.src/Test/FileView/FileView.class | 1126 + .../.src/Test/FileView/Help.module | 74 + .../gb.gui.base/.src/Test/TestMessage.module | 18 + .../.src/TreeView/ColumnView.class | 232 + .../gb.gui.base/.src/TreeView/ListView.class | 17 + .../gb.gui.base/.src/TreeView/RenameBox.class | 84 + .../gb.gui.base/.src/TreeView/TreeView.class | 44 + .../.src/TreeView/TreeViewSelection.class | 125 + .../.src/TreeView/_ColumnView_Columns.class | 66 + .../gb.gui.base/.src/TreeView/_TreeView.class | 1824 + .../.src/TreeView/_TreeView_Item.class | 584 + comp/src/gb.gui.base/.src/_Draw_Clip.class | 76 + comp/src/gb.gui.base/.src/_Draw_Style.class | 55 + comp/src/gb.gui.base/.src/_Gui.class | 368 + comp/src/gb.gui.base/message/copy.png | Bin 0 -> 168 bytes comp/src/gb.gui.base/message/delete.png | Bin 0 -> 1876 bytes comp/src/gb.gui.base/message/error.png | Bin 0 -> 1212 bytes comp/src/gb.gui.base/message/info.png | Bin 0 -> 308 bytes comp/src/gb.gui.base/message/question.png | Bin 0 -> 2316 bytes comp/src/gb.gui.base/message/warning.png | Bin 0 -> 919 bytes comp/src/gb.gui.base/pattern/10.png | Bin 0 -> 69 bytes comp/src/gb.gui.base/pattern/11.png | Bin 0 -> 70 bytes comp/src/gb.gui.base/pattern/12.png | Bin 0 -> 82 bytes comp/src/gb.gui.base/pattern/13.png | Bin 0 -> 82 bytes comp/src/gb.gui.base/pattern/14.png | Bin 0 -> 78 bytes comp/src/gb.gui.base/pattern/2.png | Bin 0 -> 71 bytes comp/src/gb.gui.base/pattern/3.png | Bin 0 -> 74 bytes comp/src/gb.gui.base/pattern/4.png | Bin 0 -> 74 bytes comp/src/gb.gui.base/pattern/5.png | Bin 0 -> 71 bytes comp/src/gb.gui.base/pattern/6.png | Bin 0 -> 76 bytes comp/src/gb.gui.base/pattern/7.png | Bin 0 -> 76 bytes comp/src/gb.gui.base/pattern/8.png | Bin 0 -> 73 bytes comp/src/gb.gui.base/pattern/9.png | Bin 0 -> 70 bytes comp/src/gb.gui.base/picturebox.png | 1 + comp/src/gb.logging/.component | 4 + comp/src/gb.logging/.directory | 2 + comp/src/gb.logging/.icon.png | Bin 0 -> 10569 bytes comp/src/gb.logging/.project | 11 + comp/src/gb.logging/.src/ComplexLogger.class | 118 + comp/src/gb.logging/.src/ConsoleHandler.class | 50 + comp/src/gb.logging/.src/FileHandler.class | 91 + comp/src/gb.logging/.src/Formatter.module | 167 + comp/src/gb.logging/.src/LogHandler.class | 64 + comp/src/gb.logging/.src/LogLevel.module | 11 + comp/src/gb.logging/.src/LogRotator.module | 65 + comp/src/gb.logging/.src/Logger.class | 108 + comp/src/gb.logging/.src/MTest.module | 36 + comp/src/gb.map/.component | 7 + comp/src/gb.map/.directory | 2 + comp/src/gb.map/.hidden/control/mapview.png | Bin 0 -> 1749 bytes comp/src/gb.map/.icon.png | Bin 0 -> 18676 bytes comp/src/gb.map/.project | 19 + comp/src/gb.map/.src/FCarto.class | 133 + comp/src/gb.map/.src/FCarto.form | 13 + comp/src/gb.map/.src/Map.class | 460 + comp/src/gb.map/.src/MapView.class | 390 + comp/src/gb.map/.src/Shapes/_ShapeItem.class | 112 + comp/src/gb.map/.src/Sprite.class | 119 + comp/src/gb.map/.src/Tests/FMain.class | 193 + comp/src/gb.map/.src/Tests/FMain.form | 35 + comp/src/gb.map/.src/Tests/FTestWmts.class | 24 + comp/src/gb.map/.src/Tests/FTestWmts.form | 8 + comp/src/gb.map/.src/Tests/Form1.class | 23 + comp/src/gb.map/.src/Tests/Form1.form | 21 + comp/src/gb.map/.src/Tests/Form2.class | 96 + comp/src/gb.map/.src/Tests/Form2.form | 17 + comp/src/gb.map/.src/Tests/Form3.class | 42 + comp/src/gb.map/.src/Tests/Form3.form | 8 + comp/src/gb.map/.src/Tests/Form4.class | 75 + comp/src/gb.map/.src/Tests/Form4.form | 10 + comp/src/gb.map/.src/Tests/Form5.class | 28 + comp/src/gb.map/.src/Tests/Form5.form | 8 + comp/src/gb.map/.src/Tests/Form6.class | 40 + comp/src/gb.map/.src/Tests/Form6.form | 10 + comp/src/gb.map/.src/Tests/MMain.module | 24 + comp/src/gb.map/.src/Tools/Geo.module | 131 + comp/src/gb.map/.src/Tools/MyPaint.class | 18 + comp/src/gb.map/.src/Tools/Proj.class | 84 + comp/src/gb.map/.src/Tools/_MapProxy.class | 20 + comp/src/gb.map/.src/Types/MapBounds.class | 143 + comp/src/gb.map/.src/Types/MapPoint.class | 211 + comp/src/gb.map/.src/Types/TileSource.module | 13 + comp/src/gb.map/.src/Types/_Tile.class | 16 + comp/src/gb.map/.src/_MapLayer.class | 66 + comp/src/gb.map/.src/_MapShape.class | 583 + comp/src/gb.map/.src/_MapTile.class | 769 + comp/src/gb.map/.src/_ViewLayer.class | 124 + comp/src/gb.map/Text1 | 10 + comp/src/gb.map/bar.png | Bin 0 -> 96 bytes comp/src/gb.map/cursor.png | Bin 0 -> 349 bytes comp/src/gb.map/minus.png | Bin 0 -> 283 bytes comp/src/gb.map/plus.png | Bin 0 -> 304 bytes comp/src/gb.map/point.png | Bin 0 -> 1010 bytes comp/src/gb.map/pointsparcelle | 0 comp/src/gb.markdown/.component | 4 + comp/src/gb.markdown/.directory | 2 + comp/src/gb.markdown/.icon.png | Bin 0 -> 10933 bytes comp/src/gb.markdown/.project | 10 + comp/src/gb.markdown/.src/MTest.module | 10 + comp/src/gb.markdown/.src/Markdown.class | 66 + comp/src/gb.markdown/.src/MarkdownLink.class | 10 + comp/src/gb.markdown/.src/Markup.module | 1066 + comp/src/gb.markdown/.src/TMarkdown.test | 424 + comp/src/gb.markdown/.test | 9 + comp/src/gb.markdown/test.txt | 43 + comp/src/gb.media.form/.component | 5 + comp/src/gb.media.form/.directory | 2 + .../.hidden/control/mediaview.png | Bin 0 -> 285 bytes comp/src/gb.media.form/.icon.png | Bin 0 -> 6679 bytes comp/src/gb.media.form/.project | 14 + .../src/gb.media.form/.src/FMediaPlayer.class | 481 + comp/src/gb.media.form/.src/FMediaPlayer.form | 72 + comp/src/gb.media.form/.src/FTest.class | 14 + comp/src/gb.media.form/.src/FTest.form | 20 + comp/src/gb.media.form/.src/MediaView.class | 182 + comp/src/gb.memcached/.component | 6 + comp/src/gb.memcached/.directory | 2 + comp/src/gb.memcached/.icon.png | Bin 0 -> 10569 bytes comp/src/gb.memcached/.project | 14 + comp/src/gb.memcached/.src/FMain.class | 51 + comp/src/gb.memcached/.src/FMain.form | 76 + comp/src/gb.memcached/.src/Main.module | 57 + comp/src/gb.memcached/.src/Memcached.class | 414 + .../gb.memcached/.src/_Memcached_Key.class | 130 + comp/src/gb.mysql/.component | 6 + comp/src/gb.mysql/.directory | 2 + comp/src/gb.mysql/.icon.png | Bin 0 -> 10724 bytes comp/src/gb.mysql/.lang/es.po | 34 + comp/src/gb.mysql/.project | 18 + comp/src/gb.mysql/.src/Connection.class | 12 + comp/src/gb.mysql/.src/DB.class | 12 + comp/src/gb.mysql/.src/_DataBase.class | 153 + comp/src/gb.mysql/.src/_DataTypes.class | 241 + comp/src/gb.mysql/.src/_Event.class | 51 + comp/src/gb.mysql/.src/_Field.class | 94 + .../gb.mysql/.src/_FieldEspecifications.class | 62 + comp/src/gb.mysql/.src/_Index.class | 50 + comp/src/gb.mysql/.src/_MySQL.class | 324 + comp/src/gb.mysql/.src/_Result.class | 124 + comp/src/gb.mysql/.src/_Routines.class | 83 + comp/src/gb.mysql/.src/_Table.class | 161 + .../src/gb.mysql/.src/_TableMaintenance.class | 71 + comp/src/gb.mysql/.src/_Trigger.class | 53 + comp/src/gb.mysql/.src/_User.class | 79 + comp/src/gb.mysql/.src/_Version.class | 34 + comp/src/gb.mysql/.src/_View.class | 43 + comp/src/gb.mysql/.src/modMain.module | 67 + comp/src/gb.mysql/logo.png | Bin 0 -> 6577 bytes comp/src/gb.net.pop3/.component | 5 + comp/src/gb.net.pop3/.directory | 2 + .../.hidden/control/pop3client.png | Bin 0 -> 490 bytes comp/src/gb.net.pop3/.icon.png | Bin 0 -> 8203 bytes comp/src/gb.net.pop3/.lang/cs.po | 44 + comp/src/gb.net.pop3/.lang/es.po | 19 + comp/src/gb.net.pop3/.lang/es_ES.po | 19 + comp/src/gb.net.pop3/.lang/it.po | 19 + comp/src/gb.net.pop3/.lang/nl.po | 20 + comp/src/gb.net.pop3/.lang/ru.po | 34 + comp/src/gb.net.pop3/.lang/zh.po | 20 + comp/src/gb.net.pop3/.project | 15 + comp/src/gb.net.pop3/.src/MTest.module | 54 + comp/src/gb.net.pop3/.src/Net.class | 18 + comp/src/gb.net.pop3/.src/POPClient.class | 72 + comp/src/gb.net.pop3/.src/Pop3Client.class | 530 + comp/src/gb.net.pop3/.src/SSLClient.class | 76 + comp/src/gb.net.pop3/.src/TCPClient.class | 102 + .../.src/_Pop3Client_Message.class | 144 + comp/src/gb.net.smtp/.component | 4 + comp/src/gb.net.smtp/.directory | 2 + .../.hidden/control/smtpclient.png | Bin 0 -> 469 bytes comp/src/gb.net.smtp/.icon.png | Bin 0 -> 16837 bytes comp/src/gb.net.smtp/.project | 11 + comp/src/gb.net.smtp/.src/Encode.module | 210 + comp/src/gb.net.smtp/.src/Main.module | 63 + comp/src/gb.net.smtp/.src/Net.class | 7 + comp/src/gb.net.smtp/.src/SmtpClient.class | 601 + comp/src/gb.net.smtp/.src/SmtpPart.class | 126 + comp/src/gb.net.smtp/.src/SmtpSession.class | 147 + comp/src/gb.net.smtp/.src/SslSession.class | 76 + comp/src/gb.net.smtp/.src/TcpSession.class | 89 + comp/src/gb.net.smtp/.src/TlsSession.class | 77 + comp/src/gb.report/.component | 7 + .../.connection/Connection1.connection | 10 + .../.connection/Connection2.connection | 10 + .../gb.report/.connection/MainConn.connection | 9 + comp/src/gb.report/.dir_icon.png | Bin 0 -> 1571 bytes comp/src/gb.report/.directory | 2 + .../.hidden/control/reportdrawingarea.png | Bin 0 -> 621 bytes .../.hidden/control/reportgridview.png | Bin 0 -> 139 bytes .../gb.report/.hidden/control/reporthbox.png | Bin 0 -> 153 bytes .../gb.report/.hidden/control/reportimage.png | Bin 0 -> 1531 bytes .../gb.report/.hidden/control/reportlabel.png | Bin 0 -> 449 bytes .../gb.report/.hidden/control/reportline.png | Bin 0 -> 113 bytes .../.hidden/control/reportpagebreak.png | Bin 0 -> 158 bytes .../gb.report/.hidden/control/reportpanel.png | Bin 0 -> 154 bytes .../.hidden/control/reportsvgimage.png | Bin 0 -> 2284 bytes .../.hidden/control/reporttextlabel.png | Bin 0 -> 686 bytes .../gb.report/.hidden/control/reportvbox.png | Bin 0 -> 241 bytes .../gb.report/.hidden/control/reportview.png | Bin 0 -> 732 bytes .../.hidden/control/reportvpanel.png | Bin 0 -> 200 bytes comp/src/gb.report/.icon.png | Bin 0 -> 16142 bytes comp/src/gb.report/.lang/ca.po | 224 + comp/src/gb.report/.lang/cs.po | 233 + comp/src/gb.report/.lang/es.po | 423 + comp/src/gb.report/.lang/es_ES.po | 436 + comp/src/gb.report/.lang/fr.po | 454 + comp/src/gb.report/.lang/nl.po | 436 + comp/src/gb.report/.lang/ru.po | 450 + comp/src/gb.report/.lang/zh.po | 423 + comp/src/gb.report/.project | 25 + .../gb.report/.src/Borders/ReportBorder.class | 209 + .../.src/Borders/_ReportBorderSide.class | 16 + .../.src/Borders/_ReportRoundCorner.class | 136 + .../.src/BoxShadow/FReportBoxEditor.class | 26 + .../.src/BoxShadow/FReportBoxEditor.form | 11 + .../.src/BoxShadow/ReportBoxShadow.class | 222 + .../.src/BoxShadow/_ReportBoxShadow.class | 13 + .../gb.report/.src/Brush/ReportBrush.class | 222 + .../.src/Controls/ReportControl.class | 596 + .../gb.report/.src/MainTools/MReport.module | 26 + .../.src/MainTools/ReportUnits.module | 92 + .../.src/MainTools/Types/TControl.class | 76 + .../.src/MainTools/Types/TPageColumn.class | 8 + .../.src/MainTools/Types/TSizeHint.class | 5 + .../.src/MainTools/Types/TSizeParse.class | 70 + comp/src/gb.report/.src/Optional/Align.class | 10 + .../src/gb.report/.src/Optional/Arrange.class | 9 + comp/src/gb.report/.src/Optional/Line.class | 13 + .../.src/Padding/ReportPadding.class | 63 + comp/src/gb.report/.src/Preview/CPrint.class | 54 + .../src/gb.report/.src/Preview/FOptions.class | 9 + comp/src/gb.report/.src/Preview/FOptions.form | 52 + .../src/gb.report/.src/Preview/FPreview.class | 400 + comp/src/gb.report/.src/Preview/FPreview.form | 275 + comp/src/gb.report/.src/Preview/FPrint.class | 37 + comp/src/gb.report/.src/Preview/FPrint.form | 132 + comp/src/gb.report/.src/Preview/Form1.class | 30 + comp/src/gb.report/.src/Preview/Form1.form | 59 + .../gb.report/.src/Preview/ReportView.class | 709 + .../.src/Preview/ReportViewTask.class | 33 + comp/src/gb.report/.src/Report.class | 794 + comp/src/gb.report/.src/ReportContainer.class | 945 + .../gb.report/.src/ReportDrawingArea.class | 63 + comp/src/gb.report/.src/ReportFrame.class | 354 + comp/src/gb.report/.src/ReportGridView.class | 188 + .../ReportGridView/_ReportGridViewCell.class | 1 + .../_ReportGridViewColumn.class | 18 + .../_ReportGridViewColumns.class | 117 + .../ReportGridView/_ReportGridViewRow.class | 51 + .../ReportGridView/_ReportGridViewRows.class | 160 + comp/src/gb.report/.src/ReportHBox.class | 21 + comp/src/gb.report/.src/ReportImage.class | 186 + comp/src/gb.report/.src/ReportLabel.class | 226 + comp/src/gb.report/.src/ReportLine.class | 127 + comp/src/gb.report/.src/ReportPageBreak.class | 6 + comp/src/gb.report/.src/ReportPanel.class | 25 + comp/src/gb.report/.src/ReportSection.class | 23 + comp/src/gb.report/.src/ReportSvgImage.class | 185 + comp/src/gb.report/.src/ReportTextLabel.class | 97 + comp/src/gb.report/.src/ReportVBox.class | 33 + comp/src/gb.report/.src/ReportVPanel.class | 336 + .../src/gb.report/.src/Tests/Old/Paints.class | 33 + .../gb.report/.src/Tests/Old/Report1.class | 8 + .../gb.report/.src/Tests/Old/Report1.report | 55 + .../gb.report/.src/Tests/Old/Report10.class | 8 + .../gb.report/.src/Tests/Old/Report10.report | 64 + .../gb.report/.src/Tests/Old/Report12.class | 16 + .../gb.report/.src/Tests/Old/Report12.report | 17 + .../gb.report/.src/Tests/Old/Report13.class | 38 + .../gb.report/.src/Tests/Old/Report13.report | 21 + .../gb.report/.src/Tests/Old/Report14.class | 32 + .../gb.report/.src/Tests/Old/Report14.report | 90 + .../gb.report/.src/Tests/Old/Report2.class | 20 + .../gb.report/.src/Tests/Old/Report2.report | 19 + .../gb.report/.src/Tests/Old/Report3.class | 20 + .../gb.report/.src/Tests/Old/Report3.report | 42 + .../gb.report/.src/Tests/Old/Report4.class | 46 + .../gb.report/.src/Tests/Old/Report4.report | 96 + .../gb.report/.src/Tests/Old/Report5.class | 1 + .../gb.report/.src/Tests/Old/Report5.report | 85 + .../gb.report/.src/Tests/Old/Report6.class | 2 + .../gb.report/.src/Tests/Old/Report6.report | 17 + .../gb.report/.src/Tests/Old/Report7.class | 29 + .../gb.report/.src/Tests/Old/Report7.report | 59 + .../gb.report/.src/Tests/Old/Report8.class | 56 + .../gb.report/.src/Tests/Old/Report8.report | 79 + .../gb.report/.src/Tests/Old/myReport1.class | 43 + .../gb.report/.src/Tests/Old/myReport1.report | 142 + .../gb.report/.src/Tests/Old/myReport2.class | 85 + .../gb.report/.src/Tests/Old/myReport2.report | 228 + .../gb.report/.src/Tests/Old/myReport5.class | 22 + .../gb.report/.src/Tests/Old/myReport5.report | 91 + .../gb.report/.src/Tests/OutputReport.class | 146 + .../gb.report/.src/Tests/OutputReport.report | 306 + .../gb.report/.src/Tests/OutputReport2.class | 166 + .../gb.report/.src/Tests/OutputReport2.report | 308 + comp/src/gb.report/.src/Tests/Paints.class | 33 + comp/src/gb.report/.src/Tests/Report11.class | 29 + comp/src/gb.report/.src/Tests/Report11.report | 29 + comp/src/gb.report/.src/Tests/Report41.class | 36 + comp/src/gb.report/.src/Tests/Report41.report | 34 + comp/src/gb.report/.src/Tests/Report51.class | 69 + comp/src/gb.report/.src/Tests/Report51.report | 15 + comp/src/gb.report/.src/Tests/Report52.class | 69 + comp/src/gb.report/.src/Tests/Report52.report | 15 + comp/src/gb.report/.src/Tests/Report9.class | 17 + comp/src/gb.report/.src/Tests/Report9.report | 22 + comp/src/gb.report/.src/Tests/Test.module | 9 + .../.src/Tests/rpTestShadowGrid.class | 23 + .../.src/Tests/rpTestShadowGrid.report | 25 + comp/src/gb.report/ChangeLog | 6 + comp/src/gb.report/gambas.svg | 540 + comp/src/gb.report/img/16/red-arrow-h.png | Bin 0 -> 117 bytes comp/src/gb.report/img/16/red-arrow-v.png | Bin 0 -> 120 bytes comp/src/gb.report/img/22/FullWidth.png | Bin 0 -> 139 bytes comp/src/gb.report/img/22/OnePage.png | Bin 0 -> 117 bytes comp/src/gb.report/img/22/RealSize.png | Bin 0 -> 204 bytes comp/src/gb.report/img/22/TwoPage.png | Bin 0 -> 121 bytes comp/src/gb.report/img/32/Collatecopie.png | Bin 0 -> 449 bytes comp/src/gb.report/img/32/Empty.png | Bin 0 -> 719 bytes comp/src/gb.report/img/32/grayscale.png | Bin 0 -> 1564 bytes comp/src/gb.report/img/32/reverse.png | Bin 0 -> 820 bytes comp/src/gb.report/img/control/hbox.png | Bin 0 -> 158 bytes comp/src/gb.report/img/control/label.png | Bin 0 -> 466 bytes comp/src/gb.report/img/control/picturebox.png | Bin 0 -> 2381 bytes comp/src/gb.report/img/control/vbox.png | Bin 0 -> 250 bytes comp/src/gb.report/img/control/vpanel.png | Bin 0 -> 200 bytes comp/src/gb.report/img/logo.svg | 540 + comp/src/gb.report/printer1.png | Bin 0 -> 1630 bytes comp/src/gb.report2/.component | 5 + .../.connection/Connection1.connection | 11 + .../.connection/Connection2.connection | 10 + .../.connection/Connection2.template | 398 + comp/src/gb.report2/.directory | 2 + .../.hidden/control/reportdrawingarea.png | 1 + .../.hidden/control/reportgridview.png | 1 + .../gb.report2/.hidden/control/reporthbox.png | 1 + .../.hidden/control/reportimage.png | 1 + .../.hidden/control/reportlabel.png | 1 + .../gb.report2/.hidden/control/reportline.png | Bin 0 -> 101 bytes .../.hidden/control/reportpagebreak.png | Bin 0 -> 558 bytes .../.hidden/control/reportpanel.png | 1 + .../.hidden/control/reportsvgimage.png | Bin 0 -> 273 bytes .../.hidden/control/reporttextlabel.png | 1 + .../gb.report2/.hidden/control/reportvbox.png | 1 + .../gb.report2/.hidden/control/reportview.png | Bin 0 -> 233 bytes .../.hidden/control/reportvpanel.png | 1 + comp/src/gb.report2/.icon.png | Bin 0 -> 6238 bytes comp/src/gb.report2/.lang/es.po | 343 + comp/src/gb.report2/.lang/es_ES.po | 343 + comp/src/gb.report2/.lang/fr.po | 389 + comp/src/gb.report2/.lang/it.po | 211 + comp/src/gb.report2/.lang/nl.po | 212 + comp/src/gb.report2/.lang/pt_BR.po | 221 + comp/src/gb.report2/.lang/ru.po | 396 + comp/src/gb.report2/.project | 19 + .../gb.report2/.src/Evaluator/CResult.class | 55 + .../gb.report2/.src/Evaluator/_RepExp.class | 50 + comp/src/gb.report2/.src/Optional/Align.class | 10 + .../gb.report2/.src/Optional/Arrange.class | 11 + comp/src/gb.report2/.src/Optional/Line.class | 13 + comp/src/gb.report2/.src/Report.class | 799 + .../src/gb.report2/.src/ReportContainer.class | 1080 + comp/src/gb.report2/.src/ReportControl.class | 648 + .../gb.report2/.src/ReportDrawingArea.class | 96 + comp/src/gb.report2/.src/ReportFrame.class | 366 + .../.src/ReportGridView/ReportGridView.class | 52 + .../_ReportGridViewColumn.class | 96 + .../_ReportGridViewColumns.class | 141 + .../ReportGridView/_ReportGridViewData.class | 2 + .../ReportGridView/_ReportGridViewRow.class | 52 + .../ReportGridView/_ReportGridViewRows.class | 120 + comp/src/gb.report2/.src/ReportHBox.class | 21 + comp/src/gb.report2/.src/ReportImage.class | 200 + comp/src/gb.report2/.src/ReportLabel.class | 239 + comp/src/gb.report2/.src/ReportLine.class | 127 + .../src/gb.report2/.src/ReportPageBreak.class | 6 + comp/src/gb.report2/.src/ReportPanel.class | 25 + comp/src/gb.report2/.src/ReportSection.class | 23 + comp/src/gb.report2/.src/ReportSvgImage.class | 200 + .../src/gb.report2/.src/ReportTextLabel.class | 143 + comp/src/gb.report2/.src/ReportVBox.class | 17 + comp/src/gb.report2/.src/ReportVPanel.class | 26 + comp/src/gb.report2/.src/Tests/Report10.class | 15 + .../src/gb.report2/.src/Tests/Report10.report | 50 + comp/src/gb.report2/.src/Tests/Report13.class | 8 + .../src/gb.report2/.src/Tests/Report13.report | 48 + comp/src/gb.report2/.src/Tests/Report14.class | 8 + .../src/gb.report2/.src/Tests/Report14.report | 66 + comp/src/gb.report2/.src/Tests/Report15.class | 2 + .../src/gb.report2/.src/Tests/Report15.report | 13 + comp/src/gb.report2/.src/Tests/Report16.class | 14 + .../src/gb.report2/.src/Tests/Report16.report | 27 + comp/src/gb.report2/.src/Tests/Report17.class | 8 + .../src/gb.report2/.src/Tests/Report17.report | 24 + .../src/gb.report2/.src/Tests/old/FMain.class | 16 + comp/src/gb.report2/.src/Tests/old/FMain.form | 10 + .../gb.report2/.src/Tests/old/Module1.module | 19 + .../.src/Tests/old/OutputReport2.class | 166 + .../.src/Tests/old/OutputReport2.report | 308 + .../gb.report2/.src/Tests/old/Report1.class | 43 + .../gb.report2/.src/Tests/old/Report1.report | 50 + .../gb.report2/.src/Tests/old/Report11.class | 32 + .../gb.report2/.src/Tests/old/Report11.report | 101 + .../gb.report2/.src/Tests/old/Report12.class | 20 + .../gb.report2/.src/Tests/old/Report12.report | 47 + .../gb.report2/.src/Tests/old/Report2.class | 22 + .../gb.report2/.src/Tests/old/Report2.report | 26 + .../gb.report2/.src/Tests/old/Report3.class | 26 + .../gb.report2/.src/Tests/old/Report3.report | 27 + .../gb.report2/.src/Tests/old/Report4.class | 18 + .../gb.report2/.src/Tests/old/Report4.report | 23 + .../gb.report2/.src/Tests/old/Report5.class | 8 + .../gb.report2/.src/Tests/old/Report5.report | 34 + .../gb.report2/.src/Tests/old/Report51.class | 207 + .../gb.report2/.src/Tests/old/Report51.report | 128 + .../gb.report2/.src/Tests/old/Report6.class | 2 + .../gb.report2/.src/Tests/old/Report6.report | 14 + .../gb.report2/.src/Tests/old/Report7.class | 30 + .../gb.report2/.src/Tests/old/Report7.report | 13 + .../gb.report2/.src/Tests/old/Report8.class | 2 + .../gb.report2/.src/Tests/old/Report8.report | 22 + .../gb.report2/.src/Tests/old/Report9.class | 9 + .../gb.report2/.src/Tests/old/Report9.report | 12 + comp/src/gb.report2/.src/Tools/CPrint.class | 72 + comp/src/gb.report2/.src/Tools/MUtil.module | 24 + .../.src/Types/Base/ReportBrush.class | 222 + .../.src/Types/Base/ReportMargin.class | 40 + .../.src/Types/Base/ReportPadding.class | 94 + .../.src/Types/Border/ReportBorder.class | 205 + .../.src/Types/Border/_ReportBorderSide.class | 16 + .../Types/Border/_ReportRoundCorner.class | 137 + .../Types/BoxShadow/ReportBoxShadow.class | 225 + .../Types/BoxShadow/_ReportBoxShadow.class | 14 + .../.src/Types/ReportSizeHints.class | 26 + .../.src/Types/ReportSizeParser.class | 83 + comp/src/gb.report2/.src/Types/TControl.class | 3 + .../gb.report2/.src/Types/TSizeParse.class | 5 + .../.src/Types/_ReportVirtualControl.class | 78 + .../src/gb.report2/.src/Viewer/FPreview.class | 537 + comp/src/gb.report2/.src/Viewer/FPreview.form | 362 + .../gb.report2/.src/Viewer/ReportView.class | 413 + comp/src/gb.report2/16/full-width.png | Bin 0 -> 134 bytes comp/src/gb.report2/16/one-page.png | Bin 0 -> 126 bytes comp/src/gb.report2/16/real-size.png | Bin 0 -> 192 bytes comp/src/gb.report2/16/red-arrow-h.png | Bin 0 -> 117 bytes comp/src/gb.report2/16/red-arrow-v.png | Bin 0 -> 120 bytes comp/src/gb.report2/16/two-pages.png | Bin 0 -> 130 bytes comp/src/gb.report2/22/FullWidth.png | Bin 0 -> 139 bytes comp/src/gb.report2/22/OnePage.png | Bin 0 -> 117 bytes comp/src/gb.report2/22/RealSize.png | Bin 0 -> 204 bytes comp/src/gb.report2/22/TwoPage.png | Bin 0 -> 121 bytes comp/src/gb.report2/32/Collatecopie.png | Bin 0 -> 449 bytes comp/src/gb.report2/32/Empty.png | Bin 0 -> 719 bytes comp/src/gb.report2/32/grayscale.png | Bin 0 -> 1564 bytes comp/src/gb.report2/32/reverse.png | Bin 0 -> 820 bytes comp/src/gb.report2/FunctionsList | 52 + comp/src/gb.report2/Structure | 9 + comp/src/gb.report2/gambas.svg | 540 + comp/src/gb.report2/icon.png | Bin 0 -> 2357 bytes comp/src/gb.report2/tmpJournal | 12 + comp/src/gb.report2/tortueface.gif | Bin 0 -> 1019 bytes comp/src/gb.scanner/.component | 4 + comp/src/gb.scanner/.directory | 2 + comp/src/gb.scanner/.hidden/scanner.png | Bin 0 -> 282 bytes comp/src/gb.scanner/.icon.png | Bin 0 -> 8599 bytes comp/src/gb.scanner/.project | 20 + comp/src/gb.scanner/.src/Demo/FScan.class | 397 + comp/src/gb.scanner/.src/Demo/FScan.form | 211 + comp/src/gb.scanner/.src/Demo/Form1.class | 25 + comp/src/gb.scanner/.src/Demo/Form1.form | 11 + comp/src/gb.scanner/.src/Demo/Main.module | 8 + comp/src/gb.scanner/.src/Demo/Main2.module | 31 + comp/src/gb.scanner/.src/MTest.module | 17 + comp/src/gb.scanner/.src/MTest2.module | 21 + comp/src/gb.scanner/.src/Module1.module | 28 + comp/src/gb.scanner/.src/Module2.module | 10 + comp/src/gb.scanner/.src/Scanner.class | 446 + comp/src/gb.scanner/.src/ScannerOption.class | 126 + comp/src/gb.scanner/.src/Scanners.class | 168 + comp/src/gb.scanner/next.png | Bin 0 -> 1304 bytes comp/src/gb.settings/.component | 4 + comp/src/gb.settings/.directory | 2 + comp/src/gb.settings/.icon.png | Bin 0 -> 10569 bytes comp/src/gb.settings/.project | 14 + comp/src/gb.settings/.src/Main.module | 35 + comp/src/gb.settings/.src/Settings.class | 886 + .../src/gb.settings/.src/_Settings_Keys.class | 93 + comp/src/gb.term.form/.component | 7 + comp/src/gb.term.form/.directory | 2 + comp/src/gb.term.form/.hidden/CHANGELOG | 4 + .../.hidden/control/termbutton.png | 1 + .../.hidden/control/termcheckbox.png | 1 + .../.hidden/control/termframe.png | 1 + .../gb.term.form/.hidden/control/termhbox.png | 1 + .../.hidden/control/termlabel.png | 1 + .../.hidden/control/termlistbox.png | 1 + .../.hidden/control/termpanel.png | 1 + .../.hidden/control/termpicturebox.png | 1 + .../.hidden/control/termradiobutton.png | 1 + .../.hidden/control/termscrollbar.png | 1 + .../.hidden/control/termtextbox.png | 1 + .../gb.term.form/.hidden/control/termvbox.png | 1 + comp/src/gb.term.form/.icon.png | Bin 0 -> 10932 bytes comp/src/gb.term.form/.lang/it.po | 15 + comp/src/gb.term.form/.lang/nl.po | 15 + comp/src/gb.term.form/.lang/ru.po | 40 + comp/src/gb.term.form/.project | 17 + comp/src/gb.term.form/.src/Align.class | 8 + comp/src/gb.term.form/.src/Arrange.class | 4 + comp/src/gb.term.form/.src/Attr.class | 341 + comp/src/gb.term.form/.src/Border.class | 4 + comp/src/gb.term.form/.src/Char.class | 14 + comp/src/gb.term.form/.src/Desktop.class | 45 + .../gb.term.form/.src/Dialog/Message.class | 42 + comp/src/gb.term.form/.src/Key.class | 65 + comp/src/gb.term.form/.src/Mouse.class | 102 + comp/src/gb.term.form/.src/TermButton.class | 150 + comp/src/gb.term.form/.src/TermCheckBox.class | 114 + comp/src/gb.term.form/.src/TermColor.class | 21 + .../src/gb.term.form/.src/TermContainer.class | 243 + comp/src/gb.term.form/.src/TermControl.class | 783 + comp/src/gb.term.form/.src/TermForm.class | 23 + comp/src/gb.term.form/.src/TermFrame.class | 57 + comp/src/gb.term.form/.src/TermHBox.class | 9 + comp/src/gb.term.form/.src/TermLabel.class | 73 + comp/src/gb.term.form/.src/TermListBox.class | 201 + comp/src/gb.term.form/.src/TermPanel.class | 23 + .../gb.term.form/.src/TermPictureBox.class | 222 + .../gb.term.form/.src/TermRadioButton.class | 112 + .../src/gb.term.form/.src/TermScrollBar.class | 173 + comp/src/gb.term.form/.src/TermTextBox.class | 187 + comp/src/gb.term.form/.src/TermVBox.class | 11 + comp/src/gb.term.form/.src/TermWindow.class | 577 + comp/src/gb.term.form/.src/TermWindows.class | 715 + comp/src/gb.term.form/.src/Test/FTest2.class | 61 + comp/src/gb.term.form/.src/Test/Main.module | 136 + comp/src/gb.term.form/.src/Test/Main2.module | 61 + comp/src/gb.term.form/.src/Test/Main3.module | 7 + .../src/gb.term.form/.src/Test/Module1.module | 7 + .../gb.term.form/.src/Test/Termform1.class | 8 + .../gb.term.form/.src/Test/Termform1.termform | 16 + .../gb.term.form/.src/Test/Termform2.class | 9 + .../gb.term.form/.src/Test/Termform2.termform | 5 + comp/src/gb.term.form/.src/Test/trfTest.class | 85 + comp/src/gb.term.form/all.png | Bin 0 -> 1507 bytes comp/src/gb.util.web/.component | 4 + comp/src/gb.util.web/.directory | 2 + .../.hidden/control/ccontainer.png | Bin 0 -> 1606 bytes .../gb.util.web/.hidden/control/ccontrol.png | Bin 0 -> 1606 bytes comp/src/gb.util.web/.icon.png | Bin 0 -> 10569 bytes comp/src/gb.util.web/.project | 9 + comp/src/gb.util.web/.src/JS.class | 68 + comp/src/gb.util.web/.src/JSON.module | 381 + .../src/gb.util.web/.src/JSONCollection.class | 42 + comp/src/gb.util.web/.src/MMain.module | 30 + comp/src/gb.util.web/.src/URL.class | 185 + comp/src/gb.util.web/.src/URLQuery.class | 113 + comp/src/gb.util/.component | 4 + comp/src/gb.util/.directory | 2 + comp/src/gb.util/.icon.png | Bin 0 -> 10933 bytes comp/src/gb.util/.lang/fr.po | 43 + comp/src/gb.util/.lang/it.po | 50 + comp/src/gb.util/.lang/ru.po | 62 + comp/src/gb.util/.project | 10 + comp/src/gb.util/.src/Class.class | 127 + comp/src/gb.util/.src/ClassStat.class | 12 + comp/src/gb.util/.src/CsvFile.class | 216 + comp/src/gb.util/.src/Date.module | 201 + comp/src/gb.util/.src/File.class | 29 + comp/src/gb.util/.src/MMain.module | 61 + .../src/gb.util/.src/MPhonetic_English.module | 876 + comp/src/gb.util/.src/MPhonetic_French.module | 278 + comp/src/gb.util/.src/Process.class | 22 + comp/src/gb.util/.src/ProcessExpect.class | 53 + comp/src/gb.util/.src/Shell.module | 59 + comp/src/gb.util/.src/String.class | 335 + comp/src/gb.web.feed/.component | 7 + comp/src/gb.web.feed/.directory | 2 + comp/src/gb.web.feed/.hidden/TODO | 10 + comp/src/gb.web.feed/.icon.png | Bin 0 -> 12094 bytes comp/src/gb.web.feed/.lang/it.po | 119 + comp/src/gb.web.feed/.lang/nl.po | 141 + comp/src/gb.web.feed/.lang/ru.po | 106 + comp/src/gb.web.feed/.project | 14 + comp/src/gb.web.feed/.src/Main.module | 28 + comp/src/gb.web.feed/.src/Rss.class | 427 + comp/src/gb.web.feed/.src/RssCategory.class | 24 + comp/src/gb.web.feed/.src/RssCloud.class | 64 + comp/src/gb.web.feed/.src/RssDate.class | 38 + comp/src/gb.web.feed/.src/RssEnclosure.class | 29 + comp/src/gb.web.feed/.src/RssGuid.class | 37 + comp/src/gb.web.feed/.src/RssImage.class | 79 + comp/src/gb.web.feed/.src/RssItem.class | 113 + comp/src/gb.web.feed/.src/RssSource.class | 27 + comp/src/gb.web.feed/.src/RssTextInput.class | 51 + comp/src/gb.web.feed/Feed-icon.svg | 18 + comp/src/gb.web.feed/test.xml | 41 + comp/src/gb.web.form/.component | 7 + comp/src/gb.web.form/.directory | 2 + .../.hidden/Uncompressed/gw-style.css | 504 + .../gb.web.form/.hidden/Uncompressed/lib.js | 1321 + .../.hidden/Uncompressed/style.css | 732 + comp/src/gb.web.form/.hidden/calendar.js | 1577 + .../gb.web.form/.hidden/control/webbutton.png | 1 + .../.hidden/control/webcheckbox.png | 1 + .../.hidden/control/webcombobox.png | 1 + .../.hidden/control/webcontainer.png | Bin 0 -> 109 bytes .../.hidden/control/webdatebox.png | 1 + .../.hidden/control/webdatechooser.png | 1 + .../.hidden/control/webexpander.png | 1 + .../gb.web.form/.hidden/control/webhbox.png | 1 + .../gb.web.form/.hidden/control/webhtml.png | Bin 0 -> 403 bytes .../gb.web.form/.hidden/control/webimage.png | 1 + .../gb.web.form/.hidden/control/weblabel.png | 1 + .../.hidden/control/weblistbox.png | 1 + .../gb.web.form/.hidden/control/webmenu.png | Bin 0 -> 637 bytes .../.hidden/control/webmenubar.png | Bin 0 -> 472 bytes .../.hidden/control/webmenuitem.png | Bin 0 -> 1059 bytes .../.hidden/control/webprogressbar.png | 1 + .../.hidden/control/webradiobutton.png | 1 + .../.hidden/control/webscrollview.png | 1 + .../.hidden/control/webseparator.png | 1 + .../gb.web.form/.hidden/control/webslider.png | 1 + .../.hidden/control/webspinbox.png | 1 + .../gb.web.form/.hidden/control/webtable.png | Bin 0 -> 195 bytes .../.hidden/control/webtabpanel.png | 1 + .../.hidden/control/webtextarea.png | 1 + .../.hidden/control/webtextbox.png | 1 + .../gb.web.form/.hidden/control/webtimer.png | 1 + .../.hidden/control/webuploadarea.png | Bin 0 -> 245 bytes .../.hidden/control/webuploadbutton.png | Bin 0 -> 153 bytes .../.hidden/control/webuploader.png | Bin 0 -> 387 bytes .../gb.web.form/.hidden/control/webvbox.png | 1 + comp/src/gb.web.form/.icon.png | Bin 0 -> 10933 bytes comp/src/gb.web.form/.lang/fr.po | 43 + comp/src/gb.web.form/.lang/it.po | 43 + comp/src/gb.web.form/.lang/nl.po | 283 + comp/src/gb.web.form/.lang/pt_BR.po | 44 + comp/src/gb.web.form/.lang/ru.po | 300 + comp/src/gb.web.form/.project | 18 + comp/src/gb.web.form/.public/favicon.png | Bin 0 -> 16241 bytes .../src/gb.web.form/.public/gw-arrow-down.png | Bin 0 -> 132 bytes .../src/gb.web.form/.public/gw-arrow-left.png | Bin 0 -> 117 bytes .../gb.web.form/.public/gw-arrow-right.png | Bin 0 -> 114 bytes comp/src/gb.web.form/.public/gw-arrow-up.png | Bin 0 -> 130 bytes comp/src/gb.web.form/.public/gw-close.png | Bin 0 -> 478 bytes comp/src/gb.web.form/.public/gw-max.png | Bin 0 -> 233 bytes .../src/gb.web.form/.public/gw-table-more.gif | Bin 0 -> 723 bytes comp/src/gb.web.form/.public/gw-waiting.gif | Bin 0 -> 6968 bytes .../src/gb.web.form/.public/message/close.svg | 148 + .../src/gb.web.form/.public/message/error.png | Bin 0 -> 1173 bytes comp/src/gb.web.form/.public/message/info.png | Bin 0 -> 828 bytes .../gb.web.form/.public/message/question.png | Bin 0 -> 1189 bytes .../gb.web.form/.public/message/warning.png | Bin 0 -> 588 bytes comp/src/gb.web.form/.public/new.png | Bin 0 -> 608 bytes comp/src/gb.web.form/.public/open.png | Bin 0 -> 817 bytes comp/src/gb.web.form/.src/Align.class | 11 + comp/src/gb.web.form/.src/Arrange.class | 16 + .../gb.web.form/.src/Calendar/FCalendar.class | 25 + .../.src/Calendar/FCalendar.webform | 9 + .../.src/Calendar/WebDateBox.class | 121 + .../.src/Calendar/WebDateChooser.class | 244 + comp/src/gb.web.form/.src/Color.class | 44 + comp/src/gb.web.form/.src/Header.class | 36 + comp/src/gb.web.form/.src/Header.webpage | 12 + comp/src/gb.web.form/.src/Main.module | 30 + .../gb.web.form/.src/Message/FMessage.class | 94 + .../gb.web.form/.src/Message/FMessage.webform | 43 + .../gb.web.form/.src/Message/Message.class | 61 + comp/src/gb.web.form/.src/Scroll.class | 14 + comp/src/gb.web.form/.src/Select.class | 12 + comp/src/gb.web.form/.src/Test/Embed1.class | 20 + comp/src/gb.web.form/.src/Test/Embed1.webform | 12 + comp/src/gb.web.form/.src/Test/Embed2.class | 10 + comp/src/gb.web.form/.src/Test/Embed2.webform | 17 + comp/src/gb.web.form/.src/Test/FHello.class | 8 + comp/src/gb.web.form/.src/Test/FHello.webform | 31 + .../.src/Test/FTestWebUploader.class | 16 + .../.src/Test/FTestWebUploader.webform | 18 + comp/src/gb.web.form/.src/Test/Webform1.class | 83 + .../gb.web.form/.src/Test/Webform1.webform | 147 + comp/src/gb.web.form/.src/Test/Webform2.class | 146 + .../gb.web.form/.src/Test/Webform2.webform | 275 + comp/src/gb.web.form/.src/Test/Webform3.class | 75 + .../gb.web.form/.src/Test/Webform3.webform | 41 + comp/src/gb.web.form/.src/Test/Webform4.class | 41 + .../gb.web.form/.src/Test/Webform4.webform | 45 + comp/src/gb.web.form/.src/Test/Webform5.class | 16 + .../gb.web.form/.src/Test/Webform5.webform | 25 + comp/src/gb.web.form/.src/Test/Webform6.class | 20 + .../gb.web.form/.src/Test/Webform6.webform | 30 + comp/src/gb.web.form/.src/Test/Webform7.class | 4 + .../gb.web.form/.src/Test/Webform7.webform | 15 + comp/src/gb.web.form/.src/Test/Webform8.class | 13 + .../gb.web.form/.src/Test/Webform8.webform | 12 + comp/src/gb.web.form/.src/WebButton.class | 141 + comp/src/gb.web.form/.src/WebCheckBox.class | 71 + comp/src/gb.web.form/.src/WebComboBox.class | 269 + comp/src/gb.web.form/.src/WebContainer.class | 445 + comp/src/gb.web.form/.src/WebControl.class | 1102 + .../gb.web.form/.src/WebControlStyle.class | 46 + comp/src/gb.web.form/.src/WebExpander.class | 109 + comp/src/gb.web.form/.src/WebForm.class | 1040 + comp/src/gb.web.form/.src/WebHBox.class | 17 + comp/src/gb.web.form/.src/WebHtml.class | 32 + comp/src/gb.web.form/.src/WebImage.class | 61 + comp/src/gb.web.form/.src/WebLabel.class | 83 + comp/src/gb.web.form/.src/WebMenu.class | 133 + comp/src/gb.web.form/.src/WebMenuBar.class | 14 + comp/src/gb.web.form/.src/WebMenuItem.class | 70 + .../src/gb.web.form/.src/WebProgressBar.class | 58 + .../src/gb.web.form/.src/WebRadioButton.class | 81 + comp/src/gb.web.form/.src/WebScrollView.class | 188 + comp/src/gb.web.form/.src/WebSeparator.class | 18 + comp/src/gb.web.form/.src/WebSlider.class | 21 + comp/src/gb.web.form/.src/WebSpinBox.class | 123 + comp/src/gb.web.form/.src/WebTabPanel.class | 193 + .../gb.web.form/.src/WebTable/WebTable.class | 644 + .../.src/WebTable/WebTableData.class | 8 + .../.src/WebTable/WebTableSelection.class | 296 + .../.src/WebTable/_WebTableColumn.class | 136 + .../.src/WebTable/_WebTableColumns.class | 115 + comp/src/gb.web.form/.src/WebTextArea.class | 148 + comp/src/gb.web.form/.src/WebTextBox.class | 187 + comp/src/gb.web.form/.src/WebTimer.class | 93 + comp/src/gb.web.form/.src/WebUploadArea.class | 198 + .../gb.web.form/.src/WebUploadButton.class | 137 + comp/src/gb.web.form/.src/WebUploader.class | 135 + comp/src/gb.web.form/.src/WebVBox.class | 17 + comp/src/gb.web.form/.src/WebWindow.class | 368 + comp/src/gb.web.form/ac.js | 225 + comp/src/gb.web.form/arrow-down.png | Bin 0 -> 91 bytes comp/src/gb.web.form/arrow-right.png | Bin 0 -> 94 bytes comp/src/gb.web.form/clear.png | Bin 0 -> 116 bytes comp/src/gb.web.form/lib.js | 1440 + comp/src/gb.web.form/shadow.png | Bin 0 -> 76 bytes comp/src/gb.web.form/style.css | 878 + comp/src/gb.web.gui/.component | 6 + comp/src/gb.web.gui/.directory | 2 + .../gb.web.gui/.hidden/control/webbutton.png | 1 + .../.hidden/control/webcheckbox.png | 1 + .../.hidden/control/webcombobox.png | 1 + .../.hidden/control/webcontainer.png | Bin 0 -> 109 bytes .../gb.web.gui/.hidden/control/webdatebox.png | 1 + .../.hidden/control/webdatechooser.png | 1 + .../.hidden/control/webexpander.png | 1 + .../.hidden/control/webfilebutton.png | Bin 0 -> 323 bytes .../gb.web.gui/.hidden/control/webhbox.png | 1 + .../gb.web.gui/.hidden/control/webhtml.png | Bin 0 -> 403 bytes .../gb.web.gui/.hidden/control/webimage.png | 1 + .../gb.web.gui/.hidden/control/weblabel.png | 1 + .../gb.web.gui/.hidden/control/weblistbox.png | 1 + .../gb.web.gui/.hidden/control/webmenu.png | Bin 0 -> 637 bytes .../gb.web.gui/.hidden/control/webmenubar.png | Bin 0 -> 472 bytes .../.hidden/control/webmenuitem.png | Bin 0 -> 1059 bytes .../.hidden/control/webprogressbar.png | 1 + .../.hidden/control/webradiobutton.png | 1 + .../.hidden/control/webscrollview.png | 1 + .../.hidden/control/webseparator.png | 1 + .../gb.web.gui/.hidden/control/webslider.png | 1 + .../gb.web.gui/.hidden/control/webspinbox.png | 1 + .../gb.web.gui/.hidden/control/webtable.png | Bin 0 -> 195 bytes .../.hidden/control/webtabpanel.png | 1 + .../.hidden/control/webtextarea.png | 1 + .../gb.web.gui/.hidden/control/webtextbox.png | 1 + .../gb.web.gui/.hidden/control/webtimer.png | 1 + .../gb.web.gui/.hidden/control/webupload.png | Bin 0 -> 344 bytes .../.hidden/control/webuploadarea.png | Bin 0 -> 245 bytes .../.hidden/control/webuploadbutton.png | Bin 0 -> 153 bytes .../.hidden/control/webuploader.png | Bin 0 -> 387 bytes .../gb.web.gui/.hidden/control/webvbox.png | 1 + comp/src/gb.web.gui/.hidden/lib.js.copy | 1477 + comp/src/gb.web.gui/.hidden/webform.png | Bin 0 -> 958 bytes comp/src/gb.web.gui/.icon.png | Bin 0 -> 13285 bytes comp/src/gb.web.gui/.lang/it.po | 32 + comp/src/gb.web.gui/.lang/pt_BR.po | 37 + comp/src/gb.web.gui/.project | 19 + comp/src/gb.web.gui/.public/favicon.png | Bin 0 -> 16241 bytes comp/src/gb.web.gui/.public/gw-arrow-down.png | Bin 0 -> 899 bytes comp/src/gb.web.gui/.public/gw-arrow-left.png | Bin 0 -> 863 bytes .../src/gb.web.gui/.public/gw-arrow-right.png | Bin 0 -> 963 bytes comp/src/gb.web.gui/.public/gw-arrow-up.png | Bin 0 -> 885 bytes comp/src/gb.web.gui/.public/gw-close.png | Bin 0 -> 568 bytes comp/src/gb.web.gui/.public/gw-table-more.gif | Bin 0 -> 723 bytes comp/src/gb.web.gui/.public/gw-waiting.gif | Bin 0 -> 6968 bytes comp/src/gb.web.gui/.public/message/error.png | Bin 0 -> 1212 bytes comp/src/gb.web.gui/.public/message/info.png | Bin 0 -> 283 bytes .../gb.web.gui/.public/message/question.png | Bin 0 -> 2316 bytes .../gb.web.gui/.public/message/warning.png | Bin 0 -> 919 bytes comp/src/gb.web.gui/.src/Align.class | 55 + comp/src/gb.web.gui/.src/Arrange.class | 16 + comp/src/gb.web.gui/.src/CSelection.class | 256 + .../gb.web.gui/.src/Calendar/FCalendar.class | 32 + .../.src/Calendar/FCalendar.webform | 10 + .../gb.web.gui/.src/Calendar/WebDateBox.class | 128 + .../.src/Calendar/WebDateChooser.class | 257 + comp/src/gb.web.gui/.src/Color.class | 44 + comp/src/gb.web.gui/.src/Header.class | 36 + comp/src/gb.web.gui/.src/Header.webpage | 12 + .../src/gb.web.gui/.src/Menu/FPopupMenu.class | 92 + .../gb.web.gui/.src/Menu/FPopupMenu.webform | 10 + comp/src/gb.web.gui/.src/Menu/WebMenu.class | 98 + .../src/gb.web.gui/.src/Menu/WebMenuBar.class | 4 + .../gb.web.gui/.src/Message/FMessage.class | 76 + .../gb.web.gui/.src/Message/FMessage.webform | 46 + .../src/gb.web.gui/.src/Message/Message.class | 71 + comp/src/gb.web.gui/.src/Scroll.class | 14 + comp/src/gb.web.gui/.src/Select.class | 12 + comp/src/gb.web.gui/.src/Session.module | 227 + comp/src/gb.web.gui/.src/Table/WebTable.class | 601 + .../gb.web.gui/.src/Table/WebTableData.class | 9 + .../.src/Table/_WebTableColumn.class | 140 + .../.src/Table/_WebTableColumns.class | 122 + comp/src/gb.web.gui/.src/Test/Webform1.class | 219 + .../src/gb.web.gui/.src/Test/Webform1.webform | 204 + comp/src/gb.web.gui/.src/Test/Webform2.class | 23 + .../src/gb.web.gui/.src/Test/Webform2.webform | 41 + comp/src/gb.web.gui/.src/Test/Webform3.class | 4 + .../src/gb.web.gui/.src/Test/Webform3.webform | 9 + comp/src/gb.web.gui/.src/Upload.module | 72 + comp/src/gb.web.gui/.src/WebButton.class | 171 + comp/src/gb.web.gui/.src/WebCheckBox.class | 74 + comp/src/gb.web.gui/.src/WebComboBox.class | 280 + comp/src/gb.web.gui/.src/WebContainer.class | 332 + comp/src/gb.web.gui/.src/WebControl.class | 1147 + .../src/gb.web.gui/.src/WebControlStyle.class | 46 + comp/src/gb.web.gui/.src/WebFileButton.class | 204 + comp/src/gb.web.gui/.src/WebForm.class | 1358 + comp/src/gb.web.gui/.src/WebHBox.class | 17 + comp/src/gb.web.gui/.src/WebHtml.class | 38 + comp/src/gb.web.gui/.src/WebImage.class | 135 + comp/src/gb.web.gui/.src/WebLabel.class | 95 + comp/src/gb.web.gui/.src/WebListBox.class | 295 + comp/src/gb.web.gui/.src/WebProgressBar.class | 56 + comp/src/gb.web.gui/.src/WebRadioButton.class | 84 + comp/src/gb.web.gui/.src/WebScrollView.class | 178 + comp/src/gb.web.gui/.src/WebSeparator.class | 18 + comp/src/gb.web.gui/.src/WebSlider.class | 21 + comp/src/gb.web.gui/.src/WebSpinBox.class | 121 + comp/src/gb.web.gui/.src/WebTabPanel.class | 217 + comp/src/gb.web.gui/.src/WebTextArea.class | 145 + comp/src/gb.web.gui/.src/WebTextBox.class | 183 + comp/src/gb.web.gui/.src/WebTimer.class | 112 + comp/src/gb.web.gui/.src/WebVBox.class | 17 + comp/src/gb.web.gui/.src/WebWindow.class | 367 + comp/src/gb.web.gui/ac.js | 225 + comp/src/gb.web.gui/lib.js | 1549 + comp/src/gb.web.gui/style.css | 945 + comp/src/gb.web/.component | 5 + comp/src/gb.web/.directory | 2 + comp/src/gb.web/.hidden/Session_opt | 527 + comp/src/gb.web/.icon.png | Bin 0 -> 10569 bytes comp/src/gb.web/.project | 16 + comp/src/gb.web/.src/Application.module | 87 + comp/src/gb.web/.src/CGI.module | 154 + comp/src/gb.web/.src/FileSessionManager.class | 316 + comp/src/gb.web/.src/Main.module | 345 + comp/src/gb.web/.src/Request.module | 320 + comp/src/gb.web/.src/Response.module | 386 + comp/src/gb.web/.src/Session.module | 296 + comp/src/gb.web/.src/SessionManager.class | 38 + .../gb.web/.src/SqliteSessionManager.class | 382 + comp/src/gb.web/.src/URL.class | 62 + comp/src/gb.web/.src/WebPage.class | 104 + comp/src/gb.web/.src/Webpage1.class | 7 + comp/src/gb.web/.src/Webpage1.webpage | 22 + comp/src/gb.web/.src/Webpage2.class | 2 + comp/src/gb.web/.src/Webpage2.webpage | 1 + comp/src/gb.web/.src/_Request_Get.class | 46 + comp/src/gb.web/.src/_Request_Post.class | 257 + comp/src/gb.web/.src/_ResponseCache.module | 13 + comp/src/gb.web/lang.cache | 1 + comp/src/order | 1 + component.am | 65 + configure.ac | 96 + gb.cairo/AUTHORS | 0 gb.cairo/COPYING | 1 + gb.cairo/ChangeLog | 0 gb.cairo/INSTALL | 1 + gb.cairo/Makefile.am | 3 + gb.cairo/NEWS | 0 gb.cairo/README | 0 gb.cairo/acinclude.m4 | 1 + gb.cairo/component.am | 1 + gb.cairo/configure.ac | 17 + gb.cairo/gambas.h | 1 + gb.cairo/gb.image.h | 1 + gb.cairo/gb_common.h | 1 + gb.cairo/m4 | 1 + gb.cairo/reconf | 1 + gb.cairo/src/Makefile.am | 11 + gb.cairo/src/c_cairo.c | 1199 + gb.cairo/src/c_cairo.h | 85 + gb.cairo/src/c_surface.c | 210 + gb.cairo/src/c_surface.h | 50 + gb.cairo/src/gb.cairo.component | 4 + gb.cairo/src/main.c | 57 + gb.cairo/src/main.h | 37 + gb.compress.bzlib2/AUTHORS | 0 gb.compress.bzlib2/COPYING | 1 + gb.compress.bzlib2/ChangeLog | 0 gb.compress.bzlib2/INSTALL | 1 + gb.compress.bzlib2/Makefile.am | 3 + gb.compress.bzlib2/NEWS | 0 gb.compress.bzlib2/README | 0 gb.compress.bzlib2/acinclude.m4 | 1 + gb.compress.bzlib2/component.am | 1 + gb.compress.bzlib2/configure.ac | 25 + gb.compress.bzlib2/gambas.h | 1 + gb.compress.bzlib2/gb.compress.h | 1 + gb.compress.bzlib2/gb_common.h | 1 + gb.compress.bzlib2/m4 | 1 + gb.compress.bzlib2/reconf | 1 + gb.compress.bzlib2/src/Makefile.am | 10 + .../src/gb.compress.bzlib2.component | 5 + gb.compress.bzlib2/src/main.c | 579 + gb.compress.bzlib2/src/main.h | 49 + gb.compress.zlib/AUTHORS | 0 gb.compress.zlib/COPYING | 1 + gb.compress.zlib/ChangeLog | 0 gb.compress.zlib/INSTALL | 1 + gb.compress.zlib/Makefile.am | 3 + gb.compress.zlib/NEWS | 0 gb.compress.zlib/README | 0 gb.compress.zlib/acinclude.m4 | 1 + gb.compress.zlib/component.am | 1 + gb.compress.zlib/configure.ac | 23 + gb.compress.zlib/gambas.h | 1 + gb.compress.zlib/gb.compress.h | 1 + gb.compress.zlib/gb_common.h | 1 + gb.compress.zlib/m4 | 1 + gb.compress.zlib/reconf | 1 + gb.compress.zlib/src/Makefile.am | 10 + .../src/gb.compress.zlib.component | 5 + gb.compress.zlib/src/main.c | 527 + gb.compress.zlib/src/main.h | 47 + gb.crypt/AUTHORS | 0 gb.crypt/COPYING | 1 + gb.crypt/ChangeLog | 0 gb.crypt/INSTALL | 1 + gb.crypt/Makefile.am | 3 + gb.crypt/NEWS | 0 gb.crypt/README | 0 gb.crypt/acinclude.m4 | 1 + gb.crypt/component.am | 1 + gb.crypt/configure.ac | 27 + gb.crypt/gambas.h | 1 + gb.crypt/gb_common.h | 1 + gb.crypt/m4 | 1 + gb.crypt/reconf | 1 + gb.crypt/src/Makefile.am | 14 + gb.crypt/src/c_crypt.c | 203 + gb.crypt/src/c_crypt.h | 33 + gb.crypt/src/gb.crypt.component | 7 + gb.crypt/src/main.c | 47 + gb.crypt/src/main.h | 34 + gb.db.mysql/AUTHORS | 0 gb.db.mysql/COPYING | 1 + gb.db.mysql/ChangeLog | 0 gb.db.mysql/INSTALL | 1 + gb.db.mysql/Makefile.am | 3 + gb.db.mysql/NEWS | 0 gb.db.mysql/README | 0 gb.db.mysql/acinclude.m4 | 1 + gb.db.mysql/component.am | 1 + gb.db.mysql/configure.ac | 44 + gb.db.mysql/gambas.h | 1 + gb.db.mysql/gb.db.h | 1 + gb.db.mysql/gb.db.proto.h | 1 + gb.db.mysql/gb_common.h | 1 + gb.db.mysql/m4 | 1 + gb.db.mysql/reconf | 1 + gb.db.mysql/src/Makefile.am | 11 + gb.db.mysql/src/gb.db.mysql.component | 5 + gb.db.mysql/src/main.c | 2715 + gb.db.mysql/src/main.h | 38 + gb.db.odbc/AUTHORS | 0 gb.db.odbc/COPYING | 1 + gb.db.odbc/ChangeLog | 37 + gb.db.odbc/INSTALL | 1 + gb.db.odbc/Makefile.am | 3 + gb.db.odbc/NEWS | 0 gb.db.odbc/README | 0 gb.db.odbc/acinclude.m4 | 1 + gb.db.odbc/component.am | 1 + gb.db.odbc/configure.ac | 27 + gb.db.odbc/gambas.h | 1 + gb.db.odbc/gb.db.h | 1 + gb.db.odbc/gb.db.proto.h | 1 + gb.db.odbc/gb_common.h | 1 + gb.db.odbc/m4 | 1 + gb.db.odbc/reconf | 1 + gb.db.odbc/src/Makefile.am | 11 + gb.db.odbc/src/gb.db.odbc.component | 6 + gb.db.odbc/src/main.c | 3358 ++ gb.db.odbc/src/main.h | 38 + gb.db.postgresql/AUTHORS | 0 gb.db.postgresql/COPYING | 26 + gb.db.postgresql/COPYING.GPL | 339 + gb.db.postgresql/ChangeLog | 0 gb.db.postgresql/INSTALL | 1 + gb.db.postgresql/Makefile.am | 3 + gb.db.postgresql/NEWS | 0 gb.db.postgresql/README | 0 gb.db.postgresql/acinclude.m4 | 1 + gb.db.postgresql/component.am | 1 + gb.db.postgresql/configure.ac | 27 + gb.db.postgresql/gambas.h | 1 + gb.db.postgresql/gb.db.h | 1 + gb.db.postgresql/gb.db.proto.h | 1 + gb.db.postgresql/gb_common.h | 1 + gb.db.postgresql/m4 | 1 + gb.db.postgresql/reconf | 1 + gb.db.postgresql/src/Makefile.am | 11 + .../src/gb.db.postgresql.component | 6 + gb.db.postgresql/src/main.c | 3013 + gb.db.postgresql/src/main.h | 56 + gb.db.sqlite2/AUTHORS | 0 gb.db.sqlite2/COPYING | 1 + gb.db.sqlite2/ChangeLog | 38 + gb.db.sqlite2/INSTALL | 1 + gb.db.sqlite2/Makefile.am | 3 + gb.db.sqlite2/NEWS | 0 gb.db.sqlite2/README | 56 + gb.db.sqlite2/TODO | 15 + gb.db.sqlite2/acinclude.m4 | 1 + gb.db.sqlite2/component.am | 1 + gb.db.sqlite2/configure.ac | 25 + gb.db.sqlite2/gambas.h | 1 + gb.db.sqlite2/gb.db.h | 1 + gb.db.sqlite2/gb.db.proto.h | 1 + gb.db.sqlite2/gb_common.h | 1 + gb.db.sqlite2/m4 | 1 + gb.db.sqlite2/reconf | 1 + gb.db.sqlite2/src/Makefile.am | 13 + gb.db.sqlite2/src/dataset.cpp | 585 + gb.db.sqlite2/src/dataset.h | 420 + gb.db.sqlite2/src/gb.db.sqlite2.component | 6 + gb.db.sqlite2/src/main.cpp | 2517 + gb.db.sqlite2/src/main.h | 44 + gb.db.sqlite2/src/qry_dat.cpp | 469 + gb.db.sqlite2/src/qry_dat.h | 302 + gb.db.sqlite2/src/sqlitedataset.cpp | 783 + gb.db.sqlite2/src/sqlitedataset.h | 208 + gb.db.sqlite2/src/stringhelper.cpp | 95 + gb.db.sqlite2/src/stringhelper.h | 72 + gb.db.sqlite3/AUTHORS | 0 gb.db.sqlite3/COPYING | 1 + gb.db.sqlite3/ChangeLog | 55 + gb.db.sqlite3/INSTALL | 1 + gb.db.sqlite3/Makefile.am | 3 + gb.db.sqlite3/NEWS | 0 gb.db.sqlite3/README | 60 + gb.db.sqlite3/acinclude.m4 | 1 + gb.db.sqlite3/component.am | 1 + gb.db.sqlite3/configure.ac | 19 + gb.db.sqlite3/gambas.h | 1 + gb.db.sqlite3/gb.db.h | 1 + gb.db.sqlite3/gb.db.proto.h | 1 + gb.db.sqlite3/gb_common.h | 1 + gb.db.sqlite3/m4 | 1 + gb.db.sqlite3/reconf | 1 + gb.db.sqlite3/src/Makefile.am | 14 + gb.db.sqlite3/src/README | 56 + gb.db.sqlite3/src/gb.db.sqlite3.component | 6 + gb.db.sqlite3/src/gb_buffer.c | 104 + gb.db.sqlite3/src/gb_buffer.h | 47 + gb.db.sqlite3/src/helper.c | 533 + gb.db.sqlite3/src/helper.h | 68 + gb.db.sqlite3/src/main.c | 2536 + gb.db.sqlite3/src/main.h | 39 + gb.dbus/AUTHORS | 0 gb.dbus/COPYING | 1 + gb.dbus/ChangeLog | 0 gb.dbus/INSTALL | 1 + gb.dbus/Makefile.am | 3 + gb.dbus/NEWS | 0 gb.dbus/README | 0 gb.dbus/acinclude.m4 | 1 + gb.dbus/component.am | 1 + gb.dbus/configure.ac | 15 + gb.dbus/gambas.h | 1 + gb.dbus/gb_common.h | 1 + gb.dbus/m4 | 1 + gb.dbus/reconf | 1 + gb.dbus/src/Makefile.am | 17 + gb.dbus/src/c_dbus.c | 74 + gb.dbus/src/c_dbus.h | 35 + gb.dbus/src/c_dbusconnection.c | 286 + gb.dbus/src/c_dbusconnection.h | 49 + gb.dbus/src/c_dbusobserver.c | 322 + gb.dbus/src/c_dbusobserver.h | 63 + gb.dbus/src/c_dbusvariant.c | 72 + gb.dbus/src/c_dbusvariant.h | 48 + gb.dbus/src/dbus_print_message.c | 435 + gb.dbus/src/dbus_print_message.h | 55 + gb.dbus/src/gb.dbus.component | 4 + gb.dbus/src/gb.dbus/.directory | 2 + gb.dbus/src/gb.dbus/.icon.png | Bin 0 -> 10569 bytes gb.dbus/src/gb.dbus/.project | 9 + gb.dbus/src/gb.dbus/.src/CTest.class | 65 + gb.dbus/src/gb.dbus/.src/CTest2.class | 9 + gb.dbus/src/gb.dbus/.src/CTest3.class | 15 + gb.dbus/src/gb.dbus/.src/DBus.class | 165 + .../src/gb.dbus/.src/DBusApplication.class | 135 + gb.dbus/src/gb.dbus/.src/DBusObject.class | 702 + gb.dbus/src/gb.dbus/.src/DBusProxy.class | 309 + gb.dbus/src/gb.dbus/.src/DBusSignal.class | 33 + gb.dbus/src/gb.dbus/.src/DBusValues.class | 4 + gb.dbus/src/gb.dbus/.src/MMain.module | 154 + gb.dbus/src/gb.dbus/.src/MyObject.class | 32 + gb.dbus/src/gb.dbus/.src/MyValue.class | 5 + gb.dbus/src/gb.dbus/.src/_DBusNull.class | 5 + gb.dbus/src/gb.dbus/.src/mpris.class | 205 + gb.dbus/src/helper.c | 1557 + gb.dbus/src/helper.h | 57 + gb.dbus/src/main.c | 60 + gb.dbus/src/main.h | 39 + gb.desktop.gnome.keyring/AUTHORS | 0 gb.desktop.gnome.keyring/COPYING | 1 + gb.desktop.gnome.keyring/ChangeLog | 0 gb.desktop.gnome.keyring/INSTALL | 1 + gb.desktop.gnome.keyring/Makefile.am | 3 + gb.desktop.gnome.keyring/NEWS | 0 gb.desktop.gnome.keyring/README | 0 gb.desktop.gnome.keyring/acinclude.m4 | 1 + gb.desktop.gnome.keyring/component.am | 1 + gb.desktop.gnome.keyring/configure.ac | 18 + gb.desktop.gnome.keyring/gambas.h | 1 + gb.desktop.gnome.keyring/gb_common.h | 1 + gb.desktop.gnome.keyring/m4 | 1 + gb.desktop.gnome.keyring/reconf | 1 + gb.desktop.gnome.keyring/src/Makefile.am | 11 + .../src/gb.desktop.gnome.keyring.component | 3 + gb.desktop.gnome.keyring/src/keyring.c | 161 + gb.desktop.gnome.keyring/src/keyring.h | 34 + gb.desktop.gnome.keyring/src/main.c | 49 + gb.desktop.gnome.keyring/src/main.h | 33 + gb.desktop.x11/AUTHORS | 0 gb.desktop.x11/COPYING | 1 + gb.desktop.x11/ChangeLog | 0 gb.desktop.x11/INSTALL | 1 + gb.desktop.x11/Makefile.am | 3 + gb.desktop.x11/NEWS | 0 gb.desktop.x11/README | 0 gb.desktop.x11/acinclude.m4 | 1 + gb.desktop.x11/component.am | 1 + gb.desktop.x11/configure.ac | 23 + gb.desktop.x11/gambas.h | 1 + gb.desktop.x11/gb.image.h | 1 + gb.desktop.x11/gb_common.h | 1 + gb.desktop.x11/gb_list.h | 1 + gb.desktop.x11/gb_list_temp.h | 1 + gb.desktop.x11/m4 | 1 + gb.desktop.x11/reconf | 1 + gb.desktop.x11/src/Makefile.am | 38 + gb.desktop.x11/src/c_x11.c | 759 + gb.desktop.x11/src/c_x11.h | 48 + gb.desktop.x11/src/c_x11systray.c | 187 + gb.desktop.x11/src/c_x11systray.h | 38 + gb.desktop.x11/src/gb.desktop.x11.component | 4 + gb.desktop.x11/src/gb_list.c | 24 + gb.desktop.x11/src/main.c | 53 + gb.desktop.x11/src/main.h | 35 + gb.desktop.x11/src/systray/common.h | 82 + gb.desktop.x11/src/systray/debug.c | 150 + gb.desktop.x11/src/systray/debug.h | 88 + gb.desktop.x11/src/systray/embed.c | 358 + gb.desktop.x11/src/systray/embed.h | 43 + gb.desktop.x11/src/systray/icons.c | 242 + gb.desktop.x11/src/systray/icons.h | 117 + gb.desktop.x11/src/systray/kde_tray.c | 161 + gb.desktop.x11/src/systray/kde_tray.h | 34 + gb.desktop.x11/src/systray/list.h | 76 + gb.desktop.x11/src/systray/settings.c | 949 + gb.desktop.x11/src/systray/settings.h | 94 + gb.desktop.x11/src/systray/systray.c | 969 + gb.desktop.x11/src/systray/systray.h | 45 + gb.desktop.x11/src/systray/tray.c | 732 + gb.desktop.x11/src/systray/tray.h | 142 + gb.desktop.x11/src/systray/wmh.c | 232 + gb.desktop.x11/src/systray/wmh.h | 102 + gb.desktop.x11/src/systray/xembed.c | 537 + gb.desktop.x11/src/systray/xembed.h | 49 + gb.desktop.x11/src/systray/xutils.c | 442 + gb.desktop.x11/src/systray/xutils.h | 116 + gb.desktop.x11/src/x11.c | 835 + gb.desktop.x11/src/x11.h | 116 + gb.gmp/AUTHORS | 0 gb.gmp/COPYING | 1 + gb.gmp/ChangeLog | 0 gb.gmp/INSTALL | 1 + gb.gmp/Makefile.am | 3 + gb.gmp/NEWS | 0 gb.gmp/README | 0 gb.gmp/acinclude.m4 | 1 + gb.gmp/component.am | 1 + gb.gmp/configure.ac | 20 + gb.gmp/gambas.h | 1 + gb.gmp/gb_common.h | 1 + gb.gmp/m4 | 1 + gb.gmp/reconf | 1 + gb.gmp/src/Makefile.am | 13 + gb.gmp/src/c_bigint.c | 682 + gb.gmp/src/c_bigint.h | 44 + gb.gmp/src/c_rational.c | 730 + gb.gmp/src/c_rational.h | 42 + gb.gmp/src/gb.gmp.component | 3 + gb.gmp/src/main.c | 84 + gb.gmp/src/main.h | 39 + gb.gsl/AUTHORS | 0 gb.gsl/COPYING | 1 + gb.gsl/ChangeLog | 0 gb.gsl/INSTALL | 1 + gb.gsl/Makefile.am | 3 + gb.gsl/NEWS | 0 gb.gsl/README | 0 gb.gsl/Test/test/.directory | 2 + gb.gsl/Test/test/.icon.png | Bin 0 -> 3682 bytes gb.gsl/Test/test/.project | 9 + gb.gsl/Test/test/.src/MMain.module | 247 + gb.gsl/Test/test/.src/Test.class | 199 + gb.gsl/Test/test/.src/TestComplex.class | 94 + gb.gsl/Test/test/.src/TestSuite.class | 141 + gb.gsl/acinclude.m4 | 1 + gb.gsl/component.am | 1 + gb.gsl/configure.ac | 18 + gb.gsl/gambas.h | 1 + gb.gsl/gb_common.h | 1 + gb.gsl/m4 | 1 + gb.gsl/reconf | 1 + gb.gsl/src/Makefile.am | 16 + gb.gsl/src/c_complex.c | 689 + gb.gsl/src/c_complex.h | 70 + gb.gsl/src/c_gsl.c | 315 + gb.gsl/src/c_gsl.h | 37 + gb.gsl/src/c_matrix.c | 1300 + gb.gsl/src/c_matrix.h | 44 + gb.gsl/src/c_newtonpolynomial.c | 53 + gb.gsl/src/c_newtonpolynomial.h | 48 + gb.gsl/src/c_polynomial.c | 914 + gb.gsl/src/c_polynomial.h | 48 + gb.gsl/src/c_vector.c | 817 + gb.gsl/src/c_vector.h | 52 + gb.gsl/src/gb.gsl.component | 5 + gb.gsl/src/main.c | 88 + gb.gsl/src/main.h | 50 + gb.gtk/AUTHORS | 0 gb.gtk/COPYING | 1 + gb.gtk/ChangeLog | 118 + gb.gtk/INSTALL | 1 + gb.gtk/Makefile.am | 3 + gb.gtk/NEWS | 0 gb.gtk/README | 0 gb.gtk/TODO | 16 + gb.gtk/acinclude.m4 | 1 + gb.gtk/component.am | 1 + gb.gtk/configure.ac | 28 + gb.gtk/gambas.h | 1 + gb.gtk/gb.draw.h | 1 + gb.gtk/gb.geom.h | 1 + gb.gtk/gb.gl.h | 1 + gb.gtk/gb.image.h | 1 + gb.gtk/gb.paint.h | 1 + gb.gtk/gb_common.h | 1 + gb.gtk/m4 | 1 + gb.gtk/reconf | 1 + gb.gtk/share | 1 + gb.gtk/src/CButton.cpp | 323 + gb.gtk/src/CButton.h | 53 + gb.gtk/src/CClipboard.cpp | 609 + gb.gtk/src/CClipboard.h | 36 + gb.gtk/src/CColor.cpp | 139 + gb.gtk/src/CColor.h | 33 + gb.gtk/src/CConst.cpp | 133 + gb.gtk/src/CConst.h | 42 + gb.gtk/src/CContainer.cpp | 616 + gb.gtk/src/CContainer.h | 92 + gb.gtk/src/CDialog.cpp | 294 + gb.gtk/src/CDialog.h | 34 + gb.gtk/src/CDraw.cpp | 39 + gb.gtk/src/CDraw.h | 39 + gb.gtk/src/CDrawingArea.cpp | 258 + gb.gtk/src/CDrawingArea.h | 53 + gb.gtk/src/CFont.cpp | 421 + gb.gtk/src/CFont.h | 57 + gb.gtk/src/CFrame.cpp | 211 + gb.gtk/src/CFrame.h | 55 + gb.gtk/src/CImage.cpp | 285 + gb.gtk/src/CImage.h | 55 + gb.gtk/src/CKey.cpp | 184 + gb.gtk/src/CKey.h | 34 + gb.gtk/src/CLabel.cpp | 166 + gb.gtk/src/CLabel.h | 49 + gb.gtk/src/CMenu.cpp | 600 + gb.gtk/src/CMenu.h | 57 + gb.gtk/src/CMouse.cpp | 439 + gb.gtk/src/CMouse.h | 54 + gb.gtk/src/CMovieBox.cpp | 135 + gb.gtk/src/CMovieBox.h | 50 + gb.gtk/src/CPicture.cpp | 276 + gb.gtk/src/CPicture.h | 57 + gb.gtk/src/CScreen.cpp | 510 + gb.gtk/src/CScreen.h | 54 + gb.gtk/src/CSeparator.cpp | 51 + gb.gtk/src/CSeparator.h | 47 + gb.gtk/src/CSlider.cpp | 161 + gb.gtk/src/CSlider.h | 59 + gb.gtk/src/CStock.cpp | 52 + gb.gtk/src/CStock.h | 35 + gb.gtk/src/CStyle.cpp | 935 + gb.gtk/src/CStyle.h | 35 + gb.gtk/src/CTabStrip.cpp | 386 + gb.gtk/src/CTabStrip.h | 53 + gb.gtk/src/CTextArea.cpp | 501 + gb.gtk/src/CTextArea.h | 52 + gb.gtk/src/CTextBox.cpp | 551 + gb.gtk/src/CTextBox.h | 62 + gb.gtk/src/CTrayIcon.cpp | 336 + gb.gtk/src/CTrayIcon.h | 52 + gb.gtk/src/CWatcher.cpp | 141 + gb.gtk/src/CWatcher.h | 44 + gb.gtk/src/CWidget.cpp | 1055 + gb.gtk/src/CWidget.h | 88 + gb.gtk/src/CWindow.cpp | 960 + gb.gtk/src/CWindow.h | 69 + gb.gtk/src/Makefile.am | 101 + gb.gtk/src/cpaint_impl.cpp | 1685 + gb.gtk/src/cpaint_impl.h | 49 + gb.gtk/src/cprinter.cpp | 394 + gb.gtk/src/cprinter.h | 52 + gb.gtk/src/csvgimage.cpp | 266 + gb.gtk/src/csvgimage.h | 62 + gb.gtk/src/desktop.c | 1 + gb.gtk/src/desktop.h | 1 + gb.gtk/src/font-parser.cpp | 175 + gb.gtk/src/font-parser.h | 32 + gb.gtk/src/gapplication.cpp | 1605 + gb.gtk/src/gapplication.h | 136 + gb.gtk/src/gb.gtk.component | 6 + gb.gtk/src/gb.gtk.h | 64 + gb.gtk/src/gbutton.cpp | 806 + gb.gtk/src/gbutton.h | 100 + gb.gtk/src/gclipboard.h | 55 + gb.gtk/src/gcolor.h | 32 + gb.gtk/src/gcombobox.cpp | 645 + gb.gtk/src/gcombobox.h | 94 + gb.gtk/src/gcontainer.cpp | 842 + gb.gtk/src/gcontainer.h | 147 + gb.gtk/src/gcontrol.cpp | 2817 + gb.gtk/src/gcontrol.h | 322 + gb.gtk/src/gcursor.cpp | 89 + gb.gtk/src/gcursor.h | 49 + gb.gtk/src/gdesktop.cpp | 402 + gb.gtk/src/gdesktop.h | 78 + gb.gtk/src/gdialog.h | 59 + gb.gtk/src/gdrag.cpp | 783 + gb.gtk/src/gdrag.h | 121 + gb.gtk/src/gdrawingarea.cpp | 468 + gb.gtk/src/gdrawingarea.h | 86 + gb.gtk/src/gfont.cpp | 738 + gb.gtk/src/gfont.h | 107 + gb.gtk/src/gframe.cpp | 255 + gb.gtk/src/gframe.h | 74 + gb.gtk/src/ggambastag.h | 38 + gb.gtk/src/gglarea.cpp | 38 + gb.gtk/src/gglarea.h | 33 + gb.gtk/src/gkey.cpp | 569 + gb.gtk/src/gkey.h | 70 + gb.gtk/src/glabel.cpp | 381 + gb.gtk/src/glabel.h | 74 + gb.gtk/src/gmainwindow.cpp | 1968 + gb.gtk/src/gmainwindow.h | 215 + gb.gtk/src/gmenu.cpp | 1173 + gb.gtk/src/gmenu.h | 150 + gb.gtk/src/gmessage.cpp | 759 + gb.gtk/src/gmessage.h | 42 + gb.gtk/src/gmouse.cpp | 361 + gb.gtk/src/gmouse.h | 99 + gb.gtk/src/gmoviebox.cpp | 163 + gb.gtk/src/gmoviebox.h | 53 + gb.gtk/src/gpicture.cpp | 1230 + gb.gtk/src/gpicture.h | 134 + gb.gtk/src/gplugin.h | 45 + gb.gtk/src/gprinter.cpp | 738 + gb.gtk/src/gprinter.h | 115 + gb.gtk/src/gscrollbar.h | 36 + gb.gtk/src/gseparator.cpp | 103 + gb.gtk/src/gseparator.h | 33 + gb.gtk/src/gshare.h | 92 + gb.gtk/src/gsignals.cpp | 362 + gb.gtk/src/gslider.cpp | 332 + gb.gtk/src/gslider.h | 75 + gb.gtk/src/gtabstrip.cpp | 861 + gb.gtk/src/gtabstrip.h | 93 + gb.gtk/src/gtag.h | 42 + gb.gtk/src/gtextarea.cpp | 1081 + gb.gtk/src/gtextarea.h | 122 + gb.gtk/src/gtextbox.cpp | 550 + gb.gtk/src/gtextbox.h | 90 + gb.gtk/src/gtools.cpp | 2356 + gb.gtk/src/gtools.h | 226 + gb.gtk/src/gtrayicon.cpp | 284 + gb.gtk/src/gtrayicon.h | 84 + gb.gtk/src/gtree.cpp | 1291 + gb.gtk/src/gtree.h | 190 + gb.gtk/src/kentities.h | 860 + gb.gtk/src/main.cpp | 610 + gb.gtk/src/main.h | 61 + gb.gtk/src/opengl/Makefile.am | 13 + gb.gtk/src/opengl/c_glarea.c | 185 + gb.gtk/src/opengl/c_glarea.h | 48 + gb.gtk/src/opengl/gb.gtk.opengl.component | 6 + gb.gtk/src/opengl/main.c | 61 + gb.gtk/src/opengl/main.h | 39 + gb.gtk/src/sm/bonobo-macros.h | 100 + gb.gtk/src/sm/gnome-client.c | 3083 + gb.gtk/src/sm/gnome-client.h | 487 + gb.gtk/src/sm/gnome-ice.c | 153 + gb.gtk/src/sm/gnome-ice.h | 44 + gb.gtk/src/sm/gnome-macros.h | 64 + gb.gtk/src/sm/gnome-marshal.c | 369 + gb.gtk/src/sm/gnome-marshal.h | 79 + gb.gtk/src/sm/gnome-uidefs.h | 122 + gb.gtk/src/sm/gnometypebuiltins.c | 459 + gb.gtk/src/sm/gnometypebuiltins.h | 76 + gb.gtk/src/sm/libgnomeui.h | 88 + gb.gtk/src/sm/libgnomeuiP.h | 56 + gb.gtk/src/sm/sm.h | 38 + gb.gtk/src/watcher.cpp | 150 + gb.gtk/src/watcher.h | 58 + gb.gtk/src/widgets.h | 170 + gb.gtk/src/x11.c | 1 + gb.gtk/src/x11.h | 1 + gb.gtk3/AUTHORS | 0 gb.gtk3/COPYING | 1 + gb.gtk3/ChangeLog | 0 gb.gtk3/INSTALL | 1 + gb.gtk3/Makefile.am | 3 + gb.gtk3/NEWS | 0 gb.gtk3/README | 0 gb.gtk3/TODO | 0 gb.gtk3/acinclude.m4 | 1 + gb.gtk3/component.am | 1 + gb.gtk3/configure.ac | 22 + gb.gtk3/gambas.h | 1 + gb.gtk3/gb.draw.h | 1 + gb.gtk3/gb.geom.h | 1 + gb.gtk3/gb.gl.h | 1 + gb.gtk3/gb.image.h | 1 + gb.gtk3/gb.paint.h | 1 + gb.gtk3/gb_common.h | 1 + gb.gtk3/m4 | 1 + gb.gtk3/reconf | 1 + gb.gtk3/share | 1 + gb.gtk3/src/CButton.cpp | 1 + gb.gtk3/src/CButton.h | 1 + gb.gtk3/src/CClipboard.cpp | 1 + gb.gtk3/src/CClipboard.h | 1 + gb.gtk3/src/CColor.cpp | 1 + gb.gtk3/src/CColor.h | 1 + gb.gtk3/src/CConst.cpp | 1 + gb.gtk3/src/CConst.h | 1 + gb.gtk3/src/CContainer.cpp | 1 + gb.gtk3/src/CContainer.h | 1 + gb.gtk3/src/CDialog.cpp | 1 + gb.gtk3/src/CDialog.h | 1 + gb.gtk3/src/CDraw.cpp | 1 + gb.gtk3/src/CDraw.h | 1 + gb.gtk3/src/CDrawingArea.cpp | 1 + gb.gtk3/src/CDrawingArea.h | 1 + gb.gtk3/src/CFont.cpp | 1 + gb.gtk3/src/CFont.h | 1 + gb.gtk3/src/CFrame.cpp | 1 + gb.gtk3/src/CFrame.h | 1 + gb.gtk3/src/CImage.cpp | 1 + gb.gtk3/src/CImage.h | 1 + gb.gtk3/src/CKey.cpp | 1 + gb.gtk3/src/CKey.h | 1 + gb.gtk3/src/CLabel.cpp | 1 + gb.gtk3/src/CLabel.h | 1 + gb.gtk3/src/CMenu.cpp | 1 + gb.gtk3/src/CMenu.h | 1 + gb.gtk3/src/CMouse.cpp | 1 + gb.gtk3/src/CMouse.h | 1 + gb.gtk3/src/CMovieBox.cpp | 1 + gb.gtk3/src/CMovieBox.h | 1 + gb.gtk3/src/CPicture.cpp | 1 + gb.gtk3/src/CPicture.h | 1 + gb.gtk3/src/CScreen.cpp | 1 + gb.gtk3/src/CScreen.h | 1 + gb.gtk3/src/CSeparator.cpp | 1 + gb.gtk3/src/CSeparator.h | 1 + gb.gtk3/src/CSlider.cpp | 1 + gb.gtk3/src/CSlider.h | 1 + gb.gtk3/src/CStock.cpp | 1 + gb.gtk3/src/CStock.h | 1 + gb.gtk3/src/CStyle.cpp | 1 + gb.gtk3/src/CStyle.h | 1 + gb.gtk3/src/CTabStrip.cpp | 1 + gb.gtk3/src/CTabStrip.h | 1 + gb.gtk3/src/CTextArea.cpp | 1 + gb.gtk3/src/CTextArea.h | 1 + gb.gtk3/src/CTextBox.cpp | 1 + gb.gtk3/src/CTextBox.h | 1 + gb.gtk3/src/CTrayIcon.cpp | 1 + gb.gtk3/src/CTrayIcon.h | 1 + gb.gtk3/src/CWatcher.cpp | 1 + gb.gtk3/src/CWatcher.h | 1 + gb.gtk3/src/CWidget.cpp | 1 + gb.gtk3/src/CWidget.h | 1 + gb.gtk3/src/CWindow.cpp | 1 + gb.gtk3/src/CWindow.h | 1 + gb.gtk3/src/Makefile.am | 101 + gb.gtk3/src/cpaint_impl.cpp | 1 + gb.gtk3/src/cpaint_impl.h | 1 + gb.gtk3/src/cprinter.cpp | 1 + gb.gtk3/src/cprinter.h | 1 + gb.gtk3/src/csvgimage.cpp | 1 + gb.gtk3/src/csvgimage.h | 1 + gb.gtk3/src/desktop.c | 1 + gb.gtk3/src/desktop.h | 1 + gb.gtk3/src/font-parser.cpp | 1 + gb.gtk3/src/font-parser.h | 1 + gb.gtk3/src/gapplication.cpp | 1 + gb.gtk3/src/gapplication.h | 1 + gb.gtk3/src/gb.gtk.h | 1 + gb.gtk3/src/gb.gtk3.component | 7 + gb.gtk3/src/gbutton.cpp | 1 + gb.gtk3/src/gbutton.h | 1 + gb.gtk3/src/gclipboard.h | 1 + gb.gtk3/src/gcolor.h | 1 + gb.gtk3/src/gcombobox.cpp | 1 + gb.gtk3/src/gcombobox.h | 1 + gb.gtk3/src/gcontainer.cpp | 1 + gb.gtk3/src/gcontainer.h | 1 + gb.gtk3/src/gcontrol.cpp | 1 + gb.gtk3/src/gcontrol.h | 1 + gb.gtk3/src/gcursor.cpp | 1 + gb.gtk3/src/gcursor.h | 1 + gb.gtk3/src/gdesktop.cpp | 1 + gb.gtk3/src/gdesktop.h | 1 + gb.gtk3/src/gdialog.h | 1 + gb.gtk3/src/gdrag.cpp | 1 + gb.gtk3/src/gdrag.h | 1 + gb.gtk3/src/gdrawingarea.cpp | 1 + gb.gtk3/src/gdrawingarea.h | 1 + gb.gtk3/src/gfont.cpp | 1 + gb.gtk3/src/gfont.h | 1 + gb.gtk3/src/gframe.cpp | 1 + gb.gtk3/src/gframe.h | 1 + gb.gtk3/src/ggambastag.h | 1 + gb.gtk3/src/gglarea.cpp | 1 + gb.gtk3/src/gglarea.h | 1 + gb.gtk3/src/gkey.cpp | 1 + gb.gtk3/src/gkey.h | 1 + gb.gtk3/src/glabel.cpp | 1 + gb.gtk3/src/glabel.h | 1 + gb.gtk3/src/gmainwindow.cpp | 1 + gb.gtk3/src/gmainwindow.h | 1 + gb.gtk3/src/gmenu.cpp | 1 + gb.gtk3/src/gmenu.h | 1 + gb.gtk3/src/gmessage.cpp | 1 + gb.gtk3/src/gmessage.h | 1 + gb.gtk3/src/gmouse.cpp | 1 + gb.gtk3/src/gmouse.h | 1 + gb.gtk3/src/gmoviebox.cpp | 1 + gb.gtk3/src/gmoviebox.h | 1 + gb.gtk3/src/gpicture.cpp | 1 + gb.gtk3/src/gpicture.h | 1 + gb.gtk3/src/gplugin.h | 1 + gb.gtk3/src/gprinter.cpp | 1 + gb.gtk3/src/gprinter.h | 1 + gb.gtk3/src/gscrollbar.h | 1 + gb.gtk3/src/gseparator.cpp | 1 + gb.gtk3/src/gseparator.h | 1 + gb.gtk3/src/gshare.h | 1 + gb.gtk3/src/gsignals.cpp | 1 + gb.gtk3/src/gslider.cpp | 1 + gb.gtk3/src/gslider.h | 1 + gb.gtk3/src/gtabstrip.cpp | 1 + gb.gtk3/src/gtabstrip.h | 1 + gb.gtk3/src/gtag.h | 1 + gb.gtk3/src/gtextarea.cpp | 1 + gb.gtk3/src/gtextarea.h | 1 + gb.gtk3/src/gtextbox.cpp | 1 + gb.gtk3/src/gtextbox.h | 1 + gb.gtk3/src/gtools.cpp | 1 + gb.gtk3/src/gtools.h | 1 + gb.gtk3/src/gtrayicon.cpp | 1 + gb.gtk3/src/gtrayicon.h | 1 + gb.gtk3/src/gtree.cpp | 1 + gb.gtk3/src/gtree.h | 1 + gb.gtk3/src/kentities.h | 1 + gb.gtk3/src/main.cpp | 1 + gb.gtk3/src/main.h | 1 + gb.gtk3/src/sm/bonobo-macros.h | 1 + gb.gtk3/src/sm/gnome-client.c | 1 + gb.gtk3/src/sm/gnome-client.h | 1 + gb.gtk3/src/sm/gnome-ice.c | 1 + gb.gtk3/src/sm/gnome-ice.h | 1 + gb.gtk3/src/sm/gnome-macros.h | 1 + gb.gtk3/src/sm/gnome-marshal.c | 1 + gb.gtk3/src/sm/gnome-marshal.h | 1 + gb.gtk3/src/sm/gnome-uidefs.h | 1 + gb.gtk3/src/sm/gnometypebuiltins.c | 1 + gb.gtk3/src/sm/gnometypebuiltins.h | 1 + gb.gtk3/src/sm/libgnomeui.h | 1 + gb.gtk3/src/sm/libgnomeuiP.h | 1 + gb.gtk3/src/sm/sm.h | 1 + gb.gtk3/src/watcher.cpp | 1 + gb.gtk3/src/watcher.h | 1 + gb.gtk3/src/widgets.h | 1 + gb.gtk3/src/x11.c | 1 + gb.gtk3/src/x11.h | 1 + gb.httpd/AUTHORS | 0 gb.httpd/COPYING | 1 + gb.httpd/ChangeLog | 0 gb.httpd/INSTALL | 1 + gb.httpd/Makefile.am | 3 + gb.httpd/NEWS | 0 gb.httpd/README | 0 gb.httpd/acinclude.m4 | 1 + gb.httpd/component.am | 1 + gb.httpd/configure.ac | 150 + gb.httpd/gambas.h | 1 + gb.httpd/gb_common.h | 1 + gb.httpd/m4 | 1 + gb.httpd/reconf | 1 + gb.httpd/src/Makefile.am | 20 + gb.httpd/src/fdwatch.c | 840 + gb.httpd/src/fdwatch.h | 85 + gb.httpd/src/gb.httpd.component | 3 + gb.httpd/src/libhttpd.c | 4376 ++ gb.httpd/src/libhttpd.h | 298 + gb.httpd/src/main.c | 90 + gb.httpd/src/main.h | 52 + gb.httpd/src/match.c | 86 + gb.httpd/src/match.h | 36 + gb.httpd/src/mime_encodings.h | 8 + gb.httpd/src/mime_types.h | 569 + gb.httpd/src/strerror.c | 37 + gb.httpd/src/tdate_parse.c | 312 + gb.httpd/src/tdate_parse.h | 33 + gb.httpd/src/thttpd.c | 2277 + gb.httpd/src/thttpd.h | 405 + gb.httpd/src/timers.c | 334 + gb.httpd/src/timers.h | 110 + gb.httpd/src/version.h | 9 + gb.image.imlib/AUTHORS | 0 gb.image.imlib/COPYING | 1 + gb.image.imlib/ChangeLog | 0 gb.image.imlib/INSTALL | 1 + gb.image.imlib/Makefile.am | 3 + gb.image.imlib/NEWS | 0 gb.image.imlib/README | 0 gb.image.imlib/acinclude.m4 | 1 + gb.image.imlib/component.am | 1 + gb.image.imlib/configure.ac | 17 + gb.image.imlib/gambas.h | 1 + gb.image.imlib/gb.draw.h | 1 + gb.image.imlib/gb.image.h | 1 + gb.image.imlib/gb_common.h | 1 + gb.image.imlib/m4 | 1 + gb.image.imlib/reconf | 1 + gb.image.imlib/src/Makefile.am | 10 + gb.image.imlib/src/c_image.c | 281 + gb.image.imlib/src/c_image.h | 47 + gb.image.imlib/src/c_imlib.c | 129 + gb.image.imlib/src/c_imlib.h | 33 + gb.image.imlib/src/gb.image.imlib.component | 5 + gb.image.imlib/src/main.c | 49 + gb.image.imlib/src/main.h | 38 + gb.image.io/AUTHORS | 0 gb.image.io/COPYING | 1 + gb.image.io/ChangeLog | 0 gb.image.io/INSTALL | 1 + gb.image.io/Makefile.am | 3 + gb.image.io/NEWS | 0 gb.image.io/README | 0 gb.image.io/acinclude.m4 | 1 + gb.image.io/component.am | 1 + gb.image.io/configure.ac | 17 + gb.image.io/gambas.h | 1 + gb.image.io/gb.image.h | 1 + gb.image.io/gb_common.h | 1 + gb.image.io/m4 | 1 + gb.image.io/reconf | 1 + gb.image.io/src/Makefile.am | 10 + gb.image.io/src/c_image.c | 311 + gb.image.io/src/c_image.h | 44 + gb.image.io/src/gb.image.io.component | 6 + gb.image.io/src/main.c | 51 + gb.image.io/src/main.h | 38 + gb.jit.llvm/AUTHORS | 1 + gb.jit.llvm/COPYING | 1 + gb.jit.llvm/ChangeLog | 0 gb.jit.llvm/INSTALL | 1 + gb.jit.llvm/Makefile.am | 3 + gb.jit.llvm/NEWS | 0 gb.jit.llvm/README | 17 + gb.jit.llvm/acinclude.m4 | 1 + gb.jit.llvm/component.am | 1 + gb.jit.llvm/configure.ac | 53 + gb.jit.llvm/gambas.h | 1 + gb.jit.llvm/gb_common.h | 1 + gb.jit.llvm/m4 | 1 + gb.jit.llvm/reconf | 1 + gb.jit.llvm/src/Makefile.am | 34 + gb.jit.llvm/src/gb.jit.h | 218 + gb.jit.llvm/src/gb.jit.llvm.component | 5 + gb.jit.llvm/src/jit.h | 1309 + gb.jit.llvm/src/jit_api.cpp | 79 + gb.jit.llvm/src/jit_codegen.cpp | 7001 +++ gb.jit.llvm/src/jit_codegen_conv.h | 786 + gb.jit.llvm/src/jit_compile.cpp | 139 + gb.jit.llvm/src/jit_conv.cpp | 280 + gb.jit.llvm/src/jit_expressions.cpp | 1872 + gb.jit.llvm/src/jit_gambas_pass.cpp | 139 + gb.jit.llvm/src/jit_gambas_pass.h | 31 + gb.jit.llvm/src/jit_read.cpp | 1100 + gb.jit.llvm/src/jit_runtime.c | 1090 + gb.jit.llvm/src/jit_runtime.h | 64 + gb.jit.llvm/src/main.cpp | 78 + gb.jit.llvm/src/main.h | 257 + gb.libxml/AUTHORS | 0 gb.libxml/COPYING | 1 + gb.libxml/ChangeLog | 0 gb.libxml/INSTALL | 1 + gb.libxml/Makefile.am | 3 + gb.libxml/NEWS | 0 gb.libxml/README | 0 gb.libxml/acinclude.m4 | 1 + gb.libxml/component.am | 1 + gb.libxml/configure.ac | 19 + gb.libxml/gambas.h | 1 + gb.libxml/m4 | 1 + gb.libxml/reconf | 1 + gb.libxml/src/CXMLDocument.c | 174 + gb.libxml/src/CXMLDocument.h | 54 + gb.libxml/src/CXMLNode.c | 300 + gb.libxml/src/CXMLNode.h | 52 + gb.libxml/src/CXMLReader.c | 517 + gb.libxml/src/CXMLReader.h | 54 + gb.libxml/src/CXMLWriter.c | 429 + gb.libxml/src/CXMLWriter.h | 52 + gb.libxml/src/Makefile.am | 15 + gb.libxml/src/gb.libxml.component | 7 + gb.libxml/src/libxml.kateproject | 7 + gb.libxml/src/main.c | 73 + gb.libxml/src/main.h | 35 + gb.media/AUTHORS | 0 gb.media/COPYING | 1 + gb.media/ChangeLog | 0 gb.media/INSTALL | 1 + gb.media/Makefile.am | 3 + gb.media/NEWS | 0 gb.media/README | 0 gb.media/acinclude.m4 | 1 + gb.media/component.am | 1 + gb.media/configure.ac | 16 + gb.media/gambas.h | 1 + gb.media/gb.image.h | 1 + gb.media/gb_common.h | 1 + gb.media/m4 | 1 + gb.media/reconf | 1 + gb.media/src/Makefile.am | 13 + gb.media/src/c_media.c | 2240 + gb.media/src/c_media.h | 138 + gb.media/src/c_mediaplayer.c | 658 + gb.media/src/c_mediaplayer.h | 62 + gb.media/src/c_mediavideo.c | 73 + gb.media/src/c_mediavideo.h | 50 + gb.media/src/gb.media.component | 4 + gb.media/src/main.c | 92 + gb.media/src/main.h | 46 + gb.mime/AUTHORS | 0 gb.mime/COPYING | 1 + gb.mime/ChangeLog | 0 gb.mime/INSTALL | 1 + gb.mime/Makefile.am | 3 + gb.mime/NEWS | 0 gb.mime/README | 0 gb.mime/acinclude.m4 | 1 + gb.mime/component.am | 1 + gb.mime/configure.ac | 57 + gb.mime/gambas.h | 1 + gb.mime/gb_common.h | 1 + gb.mime/m4 | 1 + gb.mime/reconf | 1 + gb.mime/src/Makefile.am | 13 + gb.mime/src/c_mime.c | 108 + gb.mime/src/c_mime.h | 35 + gb.mime/src/c_mimemessage.c | 304 + gb.mime/src/c_mimemessage.h | 48 + gb.mime/src/c_mimepart.c | 459 + gb.mime/src/c_mimepart.h | 45 + gb.mime/src/gb.mime.component | 3 + gb.mime/src/main.c | 61 + gb.mime/src/main.h | 46 + gb.ncurses/AUTHORS | 0 gb.ncurses/COPYING | 1 + gb.ncurses/ChangeLog | 0 gb.ncurses/INSTALL | 1 + gb.ncurses/Makefile.am | 3 + gb.ncurses/NEWS | 0 gb.ncurses/README | 0 gb.ncurses/acinclude.m4 | 1 + gb.ncurses/component.am | 1 + gb.ncurses/configure.ac | 31 + gb.ncurses/gambas.h | 1 + gb.ncurses/gb_common.h | 1 + gb.ncurses/m4 | 1 + gb.ncurses/reconf | 1 + gb.ncurses/src/Makefile.am | 17 + gb.ncurses/src/c_color.c | 279 + gb.ncurses/src/c_color.h | 13 + gb.ncurses/src/c_input.c | 632 + gb.ncurses/src/c_input.h | 63 + gb.ncurses/src/c_key.c | 76 + gb.ncurses/src/c_key.h | 29 + gb.ncurses/src/c_screen.c | 272 + gb.ncurses/src/c_screen.h | 49 + gb.ncurses/src/c_window.c | 944 + gb.ncurses/src/c_window.h | 63 + gb.ncurses/src/gb.ncurses.component | 3 + gb.ncurses/src/main.c | 106 + gb.ncurses/src/main.h | 37 + gb.net.curl/AUTHORS | 0 gb.net.curl/COPYING | 1 + gb.net.curl/ChangeLog | 0 gb.net.curl/INSTALL | 1 + gb.net.curl/Makefile.am | 3 + gb.net.curl/NEWS | 0 gb.net.curl/README | 0 gb.net.curl/acinclude.m4 | 1 + gb.net.curl/component.am | 1 + gb.net.curl/configure.ac | 20 + gb.net.curl/gambas.h | 1 + gb.net.curl/gb_common.h | 1 + gb.net.curl/m4 | 1 + gb.net.curl/reconf | 1 + gb.net.curl/src/CCurl.c | 777 + gb.net.curl/src/CCurl.h | 121 + gb.net.curl/src/CFtpClient.c | 333 + gb.net.curl/src/CFtpClient.h | 56 + gb.net.curl/src/CHttpClient.c | 701 + gb.net.curl/src/CHttpClient.h | 77 + gb.net.curl/src/CNet.c | 201 + gb.net.curl/src/CNet.h | 47 + gb.net.curl/src/CProxy.c | 147 + gb.net.curl/src/CProxy.h | 38 + gb.net.curl/src/Makefile.am | 21 + gb.net.curl/src/gb.net.curl.component | 12 + gb.net.curl/src/gb.net.curl/.directory | 2 + gb.net.curl/src/gb.net.curl/.icon.png | Bin 0 -> 10569 bytes gb.net.curl/src/gb.net.curl/.project | 10 + .../src/gb.net.curl/.src/Download.class | 96 + .../gb.net.curl/.src/DownloadManager.class | 361 + .../src/gb.net.curl/.src/HttpForm.class | 124 + gb.net.curl/src/gb.net.curl/.src/MMain.module | 42 + gb.net.curl/src/gbcurl.c | 379 + gb.net.curl/src/gbcurl.h | 79 + gb.net.curl/src/main.c | 60 + gb.net.curl/src/main.h | 34 + gb.net/AUTHORS | 0 gb.net/COPYING | 1 + gb.net/ChangeLog | 241 + gb.net/INSTALL | 1 + gb.net/Makefile.am | 3 + gb.net/NEWS | 0 gb.net/README | 0 gb.net/acinclude.m4 | 1 + gb.net/component.am | 1 + gb.net/configure.ac | 19 + gb.net/gambas.h | 1 + gb.net/gb_common.h | 1 + gb.net/m4 | 1 + gb.net/reconf | 1 + gb.net/src/CDnsClient.c | 720 + gb.net/src/CDnsClient.h | 68 + gb.net/src/CNet.c | 160 + gb.net/src/CNet.h | 85 + gb.net/src/CSerialPort.c | 746 + gb.net/src/CSerialPort.h | 82 + gb.net/src/CServerSocket.c | 629 + gb.net/src/CServerSocket.h | 69 + gb.net/src/CSocket.c | 937 + gb.net/src/CSocket.h | 112 + gb.net/src/CUdpSocket.c | 679 + gb.net/src/CUdpSocket.h | 72 + gb.net/src/Makefile.am | 25 + gb.net/src/doc/README | 146 + gb.net/src/doc/changes.txt | 87 + gb.net/src/doc/threading.sxw | Bin 0 -> 8432 bytes gb.net/src/gb.net.component | 12 + gb.net/src/gb_network.h | 37 + gb.net/src/main.c | 67 + gb.net/src/main.h | 34 + gb.net/src/speed.c | 66 + gb.net/src/speed.h | 29 + gb.net/src/tools.c | 464 + gb.net/src/tools.h | 70 + gb.openal/AUTHORS | 0 gb.openal/COPYING | 1 + gb.openal/ChangeLog | 0 gb.openal/INSTALL | 1 + gb.openal/Makefile.am | 3 + gb.openal/NEWS | 0 gb.openal/README | 0 gb.openal/acinclude.m4 | 1 + gb.openal/component.am | 1 + gb.openal/configure.ac | 17 + gb.openal/gambas.h | 1 + gb.openal/gb_common.h | 1 + gb.openal/m4 | 1 + gb.openal/reconf | 1 + gb.openal/src/Makefile.am | 10 + gb.openal/src/c_al.c | 673 + gb.openal/src/c_al.h | 33 + gb.openal/src/c_alc.c | 509 + gb.openal/src/c_alc.h | 52 + gb.openal/src/c_alure.c | 411 + gb.openal/src/c_alure.h | 45 + gb.openal/src/gb.openal.component | 3 + gb.openal/src/main.c | 55 + gb.openal/src/main.h | 45 + gb.opengl/AUTHORS | 0 gb.opengl/COPYING | 1 + gb.opengl/ChangeLog | 0 gb.opengl/INSTALL | 1 + gb.opengl/Makefile.am | 3 + gb.opengl/NEWS | 0 gb.opengl/README | 7 + gb.opengl/acinclude.m4 | 1 + gb.opengl/component.am | 1 + gb.opengl/configure.ac | 34 + gb.opengl/gambas.h | 1 + gb.opengl/gb.image.h | 1 + gb.opengl/gb_common.h | 1 + gb.opengl/m4 | 1 + gb.opengl/reconf | 1 + gb.opengl/src/GL.c | 1069 + gb.opengl/src/GL.h | 35 + gb.opengl/src/GLclipping.c | 58 + gb.opengl/src/GLclipping.h | 32 + gb.opengl/src/GLcolorLighting.c | 421 + gb.opengl/src/GLcolorLighting.h | 61 + gb.opengl/src/GLcoordTransf.c | 122 + gb.opengl/src/GLcoordTransf.h | 43 + gb.opengl/src/GLdisplayList.c | 81 + gb.opengl/src/GLdisplayList.h | 38 + gb.opengl/src/GLeval.c | 115 + gb.opengl/src/GLeval.h | 45 + gb.opengl/src/GLfog.c | 68 + gb.opengl/src/GLfog.h | 34 + gb.opengl/src/GLframeBufferOps.c | 142 + gb.opengl/src/GLframeBufferOps.h | 49 + gb.opengl/src/GLinfo.c | 501 + gb.opengl/src/GLinfo.h | 34 + gb.opengl/src/GLmodesExec.c | 64 + gb.opengl/src/GLmodesExec.h | 36 + gb.opengl/src/GLpixelOperations.c | 75 + gb.opengl/src/GLpixelOperations.h | 37 + gb.opengl/src/GLprimitives.c | 178 + gb.opengl/src/GLprimitives.h | 43 + gb.opengl/src/GLrasterization.c | 214 + gb.opengl/src/GLrasterization.h | 49 + gb.opengl/src/GLselectFeedback.c | 150 + gb.opengl/src/GLselectFeedback.h | 38 + gb.opengl/src/GLtextureMapping.c | 334 + gb.opengl/src/GLtextureMapping.h | 59 + gb.opengl/src/Makefile.am | 29 + gb.opengl/src/framebufferobject.c | 194 + gb.opengl/src/framebufferobject.h | 46 + gb.opengl/src/gb.gl.h | 42 + gb.opengl/src/gb.opengl.component | 6 + gb.opengl/src/glsl/GL.c | 114 + gb.opengl/src/glsl/GL.h | 35 + gb.opengl/src/glsl/GLattributes.c | 175 + gb.opengl/src/glsl/GLattributes.h | 38 + gb.opengl/src/glsl/GLinfo.h | 31 + gb.opengl/src/glsl/GLprogram.c | 98 + gb.opengl/src/glsl/GLprogram.h | 38 + gb.opengl/src/glsl/GLshader.c | 154 + gb.opengl/src/glsl/GLshader.h | 41 + gb.opengl/src/glsl/GLuniform.c | 519 + gb.opengl/src/glsl/GLuniform.h | 56 + gb.opengl/src/glsl/Makefile.am | 17 + gb.opengl/src/glsl/gb.opengl.glsl.component | 6 + gb.opengl/src/glsl/main.c | 48 + gb.opengl/src/glsl/main.h | 39 + gb.opengl/src/glu/GLU.c | 151 + gb.opengl/src/glu/GLU.h | 33 + gb.opengl/src/glu/GLUcoordTransf.c | 61 + gb.opengl/src/glu/GLUcoordTransf.h | 34 + gb.opengl/src/glu/GLUnurb.c | 153 + gb.opengl/src/glu/GLUnurb.h | 47 + gb.opengl/src/glu/GLUproject.c | 138 + gb.opengl/src/glu/GLUproject.h | 34 + gb.opengl/src/glu/GLUquadratic.c | 112 + gb.opengl/src/glu/GLUquadratic.h | 40 + gb.opengl/src/glu/GLUtextureImage.c | 53 + gb.opengl/src/glu/GLUtextureImage.h | 33 + gb.opengl/src/glu/Makefile.am | 20 + gb.opengl/src/glu/cglunurb.c | 74 + gb.opengl/src/glu/cglunurb.h | 50 + gb.opengl/src/glu/cgluquadric.c | 64 + gb.opengl/src/glu/cgluquadric.h | 63 + gb.opengl/src/glu/gb.opengl.glu.component | 6 + gb.opengl/src/glu/main.c | 84 + gb.opengl/src/glu/main.h | 45 + gb.opengl/src/main.c | 111 + gb.opengl/src/main.h | 47 + gb.opengl/src/sge/Makefile.am | 13 + gb.opengl/src/sge/cmd2model.c | 589 + gb.opengl/src/sge/cmd2model.h | 167 + gb.opengl/src/sge/cmd2object.c | 175 + gb.opengl/src/sge/cmd2object.h | 48 + gb.opengl/src/sge/gb.opengl.sge.component | 4 + gb.opengl/src/sge/main.c | 49 + gb.opengl/src/sge/main.h | 36 + gb.openssl/AUTHORS | 0 gb.openssl/COPYING | 28 + gb.openssl/COPYING.GPL | 339 + gb.openssl/ChangeLog | 0 gb.openssl/INSTALL | 1 + gb.openssl/Makefile.am | 3 + gb.openssl/NEWS | 0 gb.openssl/README | 0 gb.openssl/acinclude.m4 | 1 + gb.openssl/component.am | 1 + gb.openssl/configure.ac | 20 + gb.openssl/gambas.h | 1 + gb.openssl/gb_common.h | 1 + gb.openssl/m4 | 1 + gb.openssl/openssl-test/.directory | 2 + gb.openssl/openssl-test/.icon.png | Bin 0 -> 11170 bytes gb.openssl/openssl-test/.project | 8 + gb.openssl/openssl-test/.src/Main.module | 36 + gb.openssl/reconf | 1 + gb.openssl/src/Makefile.am | 17 + gb.openssl/src/c_cipher.c | 500 + gb.openssl/src/c_cipher.h | 42 + gb.openssl/src/c_digest.c | 289 + gb.openssl/src/c_digest.h | 43 + gb.openssl/src/c_hmac.c | 115 + gb.openssl/src/c_hmac.h | 43 + gb.openssl/src/c_openssl.c | 201 + gb.openssl/src/c_openssl.h | 43 + gb.openssl/src/gb.openssl.component | 3 + gb.openssl/src/main.c | 108 + gb.openssl/src/main.h | 47 + gb.pcre/AUTHORS | 0 gb.pcre/COPYING | 1 + gb.pcre/ChangeLog | 0 gb.pcre/INSTALL | 1 + gb.pcre/Makefile.am | 3 + gb.pcre/NEWS | 0 gb.pcre/README | 0 gb.pcre/acinclude.m4 | 1 + gb.pcre/component.am | 1 + gb.pcre/configure.ac | 19 + gb.pcre/gambas.h | 1 + gb.pcre/gb_common.h | 1 + gb.pcre/m4 | 1 + gb.pcre/reconf | 1 + gb.pcre/src/Makefile.am | 15 + gb.pcre/src/README | 62 + gb.pcre/src/gb.pcre.component | 7 + gb.pcre/src/gb.pcre.h | 40 + gb.pcre/src/main.c | 62 + gb.pcre/src/main.h | 37 + gb.pcre/src/regexp.c | 532 + gb.pcre/src/regexp.h | 63 + gb.pdf/AUTHORS | 0 gb.pdf/COPYING | 1 + gb.pdf/ChangeLog | 15 + gb.pdf/INSTALL | 1 + gb.pdf/Makefile.am | 3 + gb.pdf/NEWS | 0 gb.pdf/README | 0 gb.pdf/acinclude.m4 | 1 + gb.pdf/component.am | 1 + gb.pdf/configure.ac | 39 + gb.pdf/gambas.h | 1 + gb.pdf/gb.gtk.h | 1 + gb.pdf/gb.image.h | 1 + gb.pdf/gb_common.h | 1 + gb.pdf/m4 | 1 + gb.pdf/reconf | 1 + gb.pdf/src/CPdfDocument.cpp | 1495 + gb.pdf/src/CPdfDocument.h | 142 + gb.pdf/src/Makefile.am | 16 + gb.pdf/src/gb.pdf.component | 5 + gb.pdf/src/main.cpp | 78 + gb.pdf/src/main.h | 36 + gb.poppler/AUTHORS | 0 gb.poppler/COPYING | 1 + gb.poppler/ChangeLog | 0 gb.poppler/INSTALL | 1 + gb.poppler/Makefile.am | 3 + gb.poppler/NEWS | 0 gb.poppler/README | 0 gb.poppler/acinclude.m4 | 1 + gb.poppler/component.am | 1 + gb.poppler/configure.ac | 14 + gb.poppler/gambas.h | 1 + gb.poppler/gb.geom.h | 1 + gb.poppler/gb.image.h | 1 + gb.poppler/gb_common.h | 1 + gb.poppler/m4 | 1 + gb.poppler/reconf | 1 + gb.poppler/src/Makefile.am | 11 + gb.poppler/src/c_pdf_document.cpp | 827 + gb.poppler/src/c_pdf_document.h | 85 + gb.poppler/src/gb.poppler.component | 4 + gb.poppler/src/main.cpp | 67 + gb.poppler/src/main.h | 40 + gb.qt4/AUTHORS | 0 gb.qt4/COPYING | 1 + gb.qt4/ChangeLog | 0 gb.qt4/INSTALL | 1 + gb.qt4/Makefile.am | 3 + gb.qt4/NEWS | 0 gb.qt4/README | 0 gb.qt4/acinclude.m4 | 1 + gb.qt4/component.am | 1 + gb.qt4/configure.ac | 55 + gb.qt4/gambas.h | 1 + gb.qt4/gb.draw.h | 1 + gb.qt4/gb.eval.h | 1 + gb.qt4/gb.geom.h | 1 + gb.qt4/gb.gl.h | 1 + gb.qt4/gb.image.h | 1 + gb.qt4/gb.paint.h | 1 + gb.qt4/gb.qt.am | 6 + gb.qt4/gb_common.h | 1 + gb.qt4/gbc_read_common.h | 1 + gb.qt4/m4 | 1 + gb.qt4/reconf | 1 + gb.qt4/share/gb.form.action.h | 93 + gb.qt4/share/gb.form.arrangement.h | 692 + gb.qt4/share/gb.form.const.h | 112 + gb.qt4/share/gb.form.font.h | 37 + gb.qt4/share/gb.form.print.h | 55 + gb.qt4/share/gb.form.properties.h | 194 + gb.qt4/share/gb.form.trayicon.h | 615 + gb.qt4/share/gb.form.trayicon.large.h | 263 + gb.qt4/src/CButton.cpp | 685 + gb.qt4/src/CButton.h | 114 + gb.qt4/src/CCheckBox.cpp | 184 + gb.qt4/src/CCheckBox.h | 83 + gb.qt4/src/CClipboard.cpp | 922 + gb.qt4/src/CClipboard.h | 60 + gb.qt4/src/CColor.cpp | 181 + gb.qt4/src/CColor.h | 37 + gb.qt4/src/CConst.cpp | 251 + gb.qt4/src/CConst.h | 46 + gb.qt4/src/CContainer.cpp | 1483 + gb.qt4/src/CContainer.h | 170 + gb.qt4/src/CDialog.cpp | 404 + gb.qt4/src/CDialog.h | 34 + gb.qt4/src/CDraw.cpp | 299 + gb.qt4/src/CDraw.h | 50 + gb.qt4/src/CDrawingArea.cpp | 761 + gb.qt4/src/CDrawingArea.h | 147 + gb.qt4/src/CEmbedder.cpp | 143 + gb.qt4/src/CEmbedder.h | 67 + gb.qt4/src/CFont.cpp | 654 + gb.qt4/src/CFont.h | 85 + gb.qt4/src/CFrame.cpp | 118 + gb.qt4/src/CFrame.h | 68 + gb.qt4/src/CImage.cpp | 344 + gb.qt4/src/CImage.h | 56 + gb.qt4/src/CKey.cpp | 222 + gb.qt4/src/CKey.h | 51 + gb.qt4/src/CLabel.cpp | 445 + gb.qt4/src/CLabel.h | 106 + gb.qt4/src/CMenu.cpp | 1250 + gb.qt4/src/CMenu.h | 137 + gb.qt4/src/CMouse.cpp | 588 + gb.qt4/src/CMouse.h | 107 + gb.qt4/src/CMovieBox.cpp | 179 + gb.qt4/src/CMovieBox.h | 57 + gb.qt4/src/CPanel.cpp | 194 + gb.qt4/src/CPanel.h | 67 + gb.qt4/src/CPicture.cpp | 392 + gb.qt4/src/CPicture.h | 78 + gb.qt4/src/CRadioButton.cpp | 195 + gb.qt4/src/CRadioButton.h | 83 + gb.qt4/src/CScreen.cpp | 546 + gb.qt4/src/CScreen.h | 53 + gb.qt4/src/CScrollBar.cpp | 226 + gb.qt4/src/CScrollBar.h | 81 + gb.qt4/src/CSlider.cpp | 283 + gb.qt4/src/CSlider.h | 83 + gb.qt4/src/CStyle.cpp | 565 + gb.qt4/src/CStyle.h | 35 + gb.qt4/src/CTabStrip.cpp | 934 + gb.qt4/src/CTabStrip.h | 106 + gb.qt4/src/CTextArea.cpp | 696 + gb.qt4/src/CTextArea.h | 70 + gb.qt4/src/CTextBox.cpp | 976 + gb.qt4/src/CTextBox.h | 112 + gb.qt4/src/CWatch.cpp | 153 + gb.qt4/src/CWatch.h | 62 + gb.qt4/src/CWatcher.cpp | 179 + gb.qt4/src/CWatcher.h | 74 + gb.qt4/src/CWidget.cpp | 3476 ++ gb.qt4/src/CWidget.h | 304 + gb.qt4/src/CWindow.cpp | 3049 + gb.qt4/src/CWindow.h | 283 + gb.qt4/src/Makefile.am | 60 + gb.qt4/src/cpaint_impl.cpp | 1608 + gb.qt4/src/cpaint_impl.h | 92 + gb.qt4/src/cprinter.cpp | 535 + gb.qt4/src/cprinter.h | 55 + gb.qt4/src/csvgimage.cpp | 274 + gb.qt4/src/csvgimage.h | 57 + gb.qt4/src/ctrayicon.cpp | 456 + gb.qt4/src/ctrayicon.h | 71 + gb.qt4/src/desktop.c | 119 + gb.qt4/src/desktop.h | 40 + gb.qt4/src/ext/CDial.cpp | 198 + gb.qt4/src/ext/CDial.h | 63 + gb.qt4/src/ext/CEditor.cpp | 1865 + gb.qt4/src/ext/CEditor.h | 80 + gb.qt4/src/ext/CLCDNumber.cpp | 178 + gb.qt4/src/ext/CLCDNumber.h | 43 + gb.qt4/src/ext/CTextEdit.cpp | 734 + gb.qt4/src/ext/CTextEdit.h | 86 + gb.qt4/src/ext/Makefile.am | 20 + gb.qt4/src/ext/garray.cpp | 71 + gb.qt4/src/ext/garray.h | 112 + gb.qt4/src/ext/gb.qt4.ext.component | 4 + gb.qt4/src/ext/gdocument.cpp | 1786 + gb.qt4/src/ext/gdocument.h | 238 + gb.qt4/src/ext/gstring.cpp | 70 + gb.qt4/src/ext/gstring.h | 275 + gb.qt4/src/ext/gview.cpp | 3447 ++ gb.qt4/src/ext/gview.h | 317 + gb.qt4/src/ext/main.cpp | 93 + gb.qt4/src/ext/main.h | 41 + gb.qt4/src/fix_breeze.cpp | 266 + gb.qt4/src/fix_breeze.h | 55 + gb.qt4/src/gb.qt.h | 172 + gb.qt4/src/gb.qt4.component | 6 + gb.qt4/src/main.cpp | 1573 + gb.qt4/src/main.h | 167 + gb.qt4/src/opengl/CGLarea.cpp | 202 + gb.qt4/src/opengl/CGLarea.h | 60 + gb.qt4/src/opengl/Makefile.am | 14 + gb.qt4/src/opengl/gb.qt4.opengl.component | 6 + gb.qt4/src/opengl/main.cpp | 53 + gb.qt4/src/opengl/main.h | 37 + gb.qt4/src/trayicon.xpm | 163 + gb.qt4/src/webkit/Makefile.am | 19 + gb.qt4/src/webkit/ccookiejar.cpp | 188 + gb.qt4/src/webkit/ccookiejar.h | 77 + gb.qt4/src/webkit/control/webview.png | Bin 0 -> 1160 bytes gb.qt4/src/webkit/cwebdownload.cpp | 369 + gb.qt4/src/webkit/cwebdownload.h | 89 + gb.qt4/src/webkit/cwebelement.cpp | 399 + gb.qt4/src/webkit/cwebelement.h | 52 + gb.qt4/src/webkit/cwebframe.cpp | 177 + gb.qt4/src/webkit/cwebframe.h | 56 + gb.qt4/src/webkit/cwebhittest.cpp | 121 + gb.qt4/src/webkit/cwebhittest.h | 54 + gb.qt4/src/webkit/cwebsettings.cpp | 489 + gb.qt4/src/webkit/cwebsettings.h | 50 + gb.qt4/src/webkit/cwebview.cpp | 943 + gb.qt4/src/webkit/cwebview.h | 122 + gb.qt4/src/webkit/gb.qt4.webkit.component | 10 + gb.qt4/src/webkit/main.cpp | 143 + gb.qt4/src/webkit/main.h | 41 + gb.qt4/src/x11.c | 810 + gb.qt4/src/x11.h | 132 + gb.qt5/AUTHORS | 0 gb.qt5/COPYING | 1 + gb.qt5/ChangeLog | 0 gb.qt5/INSTALL | 1 + gb.qt5/Makefile.am | 3 + gb.qt5/NEWS | 0 gb.qt5/README | 0 gb.qt5/acinclude.m4 | 1 + gb.qt5/component.am | 1 + gb.qt5/configure.ac | 53 + gb.qt5/gambas.h | 1 + gb.qt5/gb.draw.h | 1 + gb.qt5/gb.eval.h | 1 + gb.qt5/gb.geom.h | 1 + gb.qt5/gb.gl.h | 1 + gb.qt5/gb.image.h | 1 + gb.qt5/gb.paint.h | 1 + gb.qt5/gb.qt.am | 6 + gb.qt5/gb_common.h | 1 + gb.qt5/m4 | 1 + gb.qt5/reconf | 1 + gb.qt5/share | 1 + gb.qt5/src/CButton.cpp | 1 + gb.qt5/src/CButton.h | 1 + gb.qt5/src/CCheckBox.cpp | 1 + gb.qt5/src/CCheckBox.h | 1 + gb.qt5/src/CClipboard.cpp | 1 + gb.qt5/src/CClipboard.h | 1 + gb.qt5/src/CColor.cpp | 1 + gb.qt5/src/CColor.h | 1 + gb.qt5/src/CConst.cpp | 1 + gb.qt5/src/CConst.h | 1 + gb.qt5/src/CContainer.cpp | 1 + gb.qt5/src/CContainer.h | 1 + gb.qt5/src/CDialog.cpp | 1 + gb.qt5/src/CDialog.h | 1 + gb.qt5/src/CDraw.cpp | 1 + gb.qt5/src/CDraw.h | 1 + gb.qt5/src/CDrawingArea.cpp | 1 + gb.qt5/src/CDrawingArea.h | 1 + gb.qt5/src/CEmbedder.cpp | 1 + gb.qt5/src/CEmbedder.h | 1 + gb.qt5/src/CFont.cpp | 1 + gb.qt5/src/CFont.h | 1 + gb.qt5/src/CFrame.cpp | 1 + gb.qt5/src/CFrame.h | 1 + gb.qt5/src/CImage.cpp | 1 + gb.qt5/src/CImage.h | 1 + gb.qt5/src/CKey.cpp | 1 + gb.qt5/src/CKey.h | 1 + gb.qt5/src/CLabel.cpp | 1 + gb.qt5/src/CLabel.h | 1 + gb.qt5/src/CMenu.cpp | 1 + gb.qt5/src/CMenu.h | 1 + gb.qt5/src/CMouse.cpp | 1 + gb.qt5/src/CMouse.h | 1 + gb.qt5/src/CMovieBox.cpp | 1 + gb.qt5/src/CMovieBox.h | 1 + gb.qt5/src/CPanel.cpp | 1 + gb.qt5/src/CPanel.h | 1 + gb.qt5/src/CPicture.cpp | 1 + gb.qt5/src/CPicture.h | 1 + gb.qt5/src/CRadioButton.cpp | 1 + gb.qt5/src/CRadioButton.h | 1 + gb.qt5/src/CScreen.cpp | 1 + gb.qt5/src/CScreen.h | 1 + gb.qt5/src/CScrollBar.cpp | 1 + gb.qt5/src/CScrollBar.h | 1 + gb.qt5/src/CSlider.cpp | 1 + gb.qt5/src/CSlider.h | 1 + gb.qt5/src/CStyle.cpp | 1 + gb.qt5/src/CStyle.h | 1 + gb.qt5/src/CTabStrip.cpp | 1 + gb.qt5/src/CTabStrip.h | 1 + gb.qt5/src/CTextArea.cpp | 1 + gb.qt5/src/CTextArea.h | 1 + gb.qt5/src/CTextBox.cpp | 1 + gb.qt5/src/CTextBox.h | 1 + gb.qt5/src/CWatch.cpp | 1 + gb.qt5/src/CWatch.h | 1 + gb.qt5/src/CWatcher.cpp | 1 + gb.qt5/src/CWatcher.h | 1 + gb.qt5/src/CWidget.cpp | 1 + gb.qt5/src/CWidget.h | 1 + gb.qt5/src/CWindow.cpp | 1 + gb.qt5/src/CWindow.h | 1 + gb.qt5/src/Makefile.am | 54 + gb.qt5/src/cpaint_impl.cpp | 1 + gb.qt5/src/cpaint_impl.h | 1 + gb.qt5/src/cprinter.cpp | 1 + gb.qt5/src/cprinter.h | 1 + gb.qt5/src/csvgimage.cpp | 1 + gb.qt5/src/csvgimage.h | 1 + gb.qt5/src/ctrayicon.cpp | 1 + gb.qt5/src/ctrayicon.h | 1 + gb.qt5/src/desktop.c | 1 + gb.qt5/src/desktop.h | 1 + gb.qt5/src/ext/CDial.cpp | 1 + gb.qt5/src/ext/CDial.h | 1 + gb.qt5/src/ext/CLCDNumber.cpp | 1 + gb.qt5/src/ext/CLCDNumber.h | 1 + gb.qt5/src/ext/CTextEdit.cpp | 1 + gb.qt5/src/ext/CTextEdit.h | 1 + gb.qt5/src/ext/Makefile.am | 16 + gb.qt5/src/ext/gb.qt5.ext.component | 4 + gb.qt5/src/ext/main.cpp | 67 + gb.qt5/src/ext/main.h | 36 + gb.qt5/src/fix_breeze.cpp | 1 + gb.qt5/src/fix_breeze.h | 1 + gb.qt5/src/gb.qt.h | 1 + gb.qt5/src/gb.qt5.component | 6 + gb.qt5/src/main.cpp | 1 + gb.qt5/src/main.h | 1 + gb.qt5/src/opengl/CGLarea.cpp | 158 + gb.qt5/src/opengl/CGLarea.h | 60 + gb.qt5/src/opengl/COldGLarea.cpp | 204 + gb.qt5/src/opengl/COldGLarea.h | 60 + gb.qt5/src/opengl/Makefile.am | 23 + gb.qt5/src/opengl/gb.qt5.opengl.component | 6 + gb.qt5/src/opengl/main.cpp | 58 + gb.qt5/src/opengl/main.h | 37 + gb.qt5/src/trayicon.xpm | 1 + gb.qt5/src/webkit/Makefile.am | 20 + gb.qt5/src/webkit/ccookiejar.cpp | 1 + gb.qt5/src/webkit/ccookiejar.h | 1 + gb.qt5/src/webkit/control/webview.png | Bin 0 -> 1572 bytes gb.qt5/src/webkit/cwebdownload.cpp | 1 + gb.qt5/src/webkit/cwebdownload.h | 1 + gb.qt5/src/webkit/cwebelement.cpp | 1 + gb.qt5/src/webkit/cwebelement.h | 1 + gb.qt5/src/webkit/cwebframe.cpp | 1 + gb.qt5/src/webkit/cwebframe.h | 1 + gb.qt5/src/webkit/cwebhittest.cpp | 1 + gb.qt5/src/webkit/cwebhittest.h | 1 + gb.qt5/src/webkit/cwebsettings.cpp | 1 + gb.qt5/src/webkit/cwebsettings.h | 1 + gb.qt5/src/webkit/cwebview.cpp | 1 + gb.qt5/src/webkit/cwebview.h | 1 + gb.qt5/src/webkit/gb.qt5.webkit.component | 10 + gb.qt5/src/webkit/main.cpp | 1 + gb.qt5/src/webkit/main.h | 1 + gb.qt5/src/x11.c | 1 + gb.qt5/src/x11.h | 1 + gb.sdl.sound/AUTHORS | 5 + gb.sdl.sound/COPYING | 1 + gb.sdl.sound/ChangeLog | 0 gb.sdl.sound/INSTALL | 1 + gb.sdl.sound/Makefile.am | 3 + gb.sdl.sound/NEWS | 0 gb.sdl.sound/README | 10 + gb.sdl.sound/acinclude.m4 | 1 + gb.sdl.sound/component.am | 1 + gb.sdl.sound/configure.ac | 23 + gb.sdl.sound/gambas.h | 1 + gb.sdl.sound/gb_common.h | 1 + gb.sdl.sound/m4 | 1 + gb.sdl.sound/reconf | 1 + gb.sdl.sound/src/Makefile.am | 13 + gb.sdl.sound/src/cdrom.c | 491 + gb.sdl.sound/src/cdrom.h | 52 + gb.sdl.sound/src/gb.sdl.sound.component | 9 + gb.sdl.sound/src/main.c | 97 + gb.sdl.sound/src/main.h | 33 + gb.sdl.sound/src/sound.c | 604 + gb.sdl.sound/src/sound.h | 72 + gb.sdl/AUTHORS | 6 + gb.sdl/COPYING | 1 + gb.sdl/ChangeLog | 0 gb.sdl/INSTALL | 1 + gb.sdl/Makefile.am | 3 + gb.sdl/NEWS | 0 gb.sdl/README | 12 + gb.sdl/acinclude.m4 | 1 + gb.sdl/component.am | 1 + gb.sdl/configure.ac | 48 + gb.sdl/gambas.h | 1 + gb.sdl/gb.image.h | 1 + gb.sdl/gb_common.h | 1 + gb.sdl/m4 | 1 + gb.sdl/reconf | 1 + gb.sdl/src/Cconst.cpp | 69 + gb.sdl/src/Cconst.h | 34 + gb.sdl/src/Cdesktop.cpp | 51 + gb.sdl/src/Cdesktop.h | 34 + gb.sdl/src/Cdraw.cpp | 367 + gb.sdl/src/Cdraw.h | 49 + gb.sdl/src/Cfont.cpp | 243 + gb.sdl/src/Cfont.h | 47 + gb.sdl/src/Cimage.cpp | 160 + gb.sdl/src/Cimage.h | 58 + gb.sdl/src/Cjoystick.cpp | 296 + gb.sdl/src/Cjoystick.h | 52 + gb.sdl/src/Ckey.cpp | 235 + gb.sdl/src/Ckey.h | 50 + gb.sdl/src/Cmouse.cpp | 319 + gb.sdl/src/Cmouse.h | 65 + gb.sdl/src/Cwindow.cpp | 548 + gb.sdl/src/Cwindow.h | 78 + gb.sdl/src/Makefile.am | 34 + gb.sdl/src/SDL_h.h | 84 + gb.sdl/src/SDLapp.cpp | 266 + gb.sdl/src/SDLapp.h | 61 + gb.sdl/src/SDLcore.cpp | 52 + gb.sdl/src/SDLcore.h | 50 + gb.sdl/src/SDLcursor.cpp | 126 + gb.sdl/src/SDLcursor.h | 52 + gb.sdl/src/SDLdebug.cpp | 98 + gb.sdl/src/SDLdebug.h | 34 + gb.sdl/src/SDLerror.cpp | 30 + gb.sdl/src/SDLerror.h | 41 + gb.sdl/src/SDLfont.cpp | 586 + gb.sdl/src/SDLfont.h | 95 + gb.sdl/src/SDLgfx.cpp | 533 + gb.sdl/src/SDLgfx.h | 76 + gb.sdl/src/SDLosrender.cpp | 79 + gb.sdl/src/SDLosrender.h | 45 + gb.sdl/src/SDLsurface.cpp | 284 + gb.sdl/src/SDLsurface.h | 74 + gb.sdl/src/SDLtexture.cpp | 177 + gb.sdl/src/SDLtexture.h | 73 + gb.sdl/src/SDLwindow.cpp | 276 + gb.sdl/src/SDLwindow.h | 105 + gb.sdl/src/default_font.h | 632 + gb.sdl/src/gb.sdl.component | 6 + gb.sdl/src/main.cpp | 155 + gb.sdl/src/main.h | 42 + gb.sdl2/AUTHORS | 0 gb.sdl2/COPYING | 1 + gb.sdl2/ChangeLog | 0 gb.sdl2/INSTALL | 1 + gb.sdl2/Makefile.am | 3 + gb.sdl2/NEWS | 0 gb.sdl2/README | 0 gb.sdl2/acinclude.m4 | 1 + gb.sdl2/component.am | 1 + gb.sdl2/configure.ac | 26 + gb.sdl2/gambas.h | 1 + gb.sdl2/gb.geom.h | 1 + gb.sdl2/gb.image.h | 1 + gb.sdl2/gb_common.h | 1 + gb.sdl2/gb_list.h | 1 + gb.sdl2/gb_list_temp.h | 1 + gb.sdl2/m4 | 1 + gb.sdl2/reconf | 1 + gb.sdl2/src/Makefile.am | 29 + gb.sdl2/src/audio/Makefile.am | 15 + gb.sdl2/src/audio/c_channel.c | 411 + gb.sdl2/src/audio/c_channel.h | 55 + gb.sdl2/src/audio/c_music.c | 241 + gb.sdl2/src/audio/c_music.h | 36 + gb.sdl2/src/audio/c_sound.c | 141 + gb.sdl2/src/audio/c_sound.h | 41 + gb.sdl2/src/audio/gb.sdl2.audio.component | 2 + gb.sdl2/src/audio/main.c | 159 + gb.sdl2/src/audio/main.h | 52 + gb.sdl2/src/c_draw.c | 423 + gb.sdl2/src/c_draw.h | 49 + gb.sdl2/src/c_font.c | 527 + gb.sdl2/src/c_font.h | 52 + gb.sdl2/src/c_image.c | 204 + gb.sdl2/src/c_image.h | 57 + gb.sdl2/src/c_key.c | 256 + gb.sdl2/src/c_key.h | 37 + gb.sdl2/src/c_mouse.c | 276 + gb.sdl2/src/c_mouse.h | 50 + gb.sdl2/src/c_window.c | 670 + gb.sdl2/src/c_window.h | 72 + gb.sdl2/src/default_font.c | 202 + gb.sdl2/src/default_font.h | 38 + gb.sdl2/src/default_font_data.h | 1075 + gb.sdl2/src/gb.sdl2.component | 5 + gb.sdl2/src/main.c | 225 + gb.sdl2/src/main.h | 78 + gb.v4l/AUTHORS | 0 gb.v4l/COPYING | 1 + gb.v4l/ChangeLog | 241 + gb.v4l/INSTALL | 1 + gb.v4l/Makefile.am | 3 + gb.v4l/NEWS | 0 gb.v4l/README | 4 + gb.v4l/acinclude.m4 | 1 + gb.v4l/component.am | 1 + gb.v4l/configure.ac | 25 + gb.v4l/gambas.h | 1 + gb.v4l/gb.image.h | 1 + gb.v4l/gb_common.h | 1 + gb.v4l/m4 | 1 + gb.v4l/orig/video-capture-0.2.tar.gz | Bin 0 -> 10049 bytes gb.v4l/reconf | 1 + gb.v4l/src/CConverters.c | 255 + gb.v4l/src/CWebcam.c | 1906 + gb.v4l/src/CWebcam.h | 197 + gb.v4l/src/Makefile.am | 14 + gb.v4l/src/gb.v4l.component | 10 + gb.v4l/src/gv4l2.c | 803 + gb.v4l/src/main.c | 50 + gb.v4l/src/main.h | 36 + gb.v4l/src/videodev.h | 343 + gb.xml/AUTHORS | 0 gb.xml/COPYING | 1 + gb.xml/ChangeLog | 0 gb.xml/INSTALL | 1 + gb.xml/Makefile.am | 4 + gb.xml/NEWS | 0 gb.xml/README | 7 + gb.xml/TODO | 8 + gb.xml/acinclude.m4 | 1 + gb.xml/component.am | 1 + gb.xml/configure.ac | 37 + gb.xml/gambas.h | 1 + gb.xml/gb_common.h | 1 + gb.xml/m4 | 1 + gb.xml/reconf | 1 + gb.xml/src/.directory | 6 + gb.xml/src/CDocument.cpp | 238 + gb.xml/src/CDocument.h | 29 + gb.xml/src/CElement.cpp | 411 + gb.xml/src/CElement.h | 29 + gb.xml/src/CExplorer.cpp | 154 + gb.xml/src/CExplorer.h | 37 + gb.xml/src/CNode.cpp | 438 + gb.xml/src/CNode.h | 31 + gb.xml/src/CReader.cpp | 435 + gb.xml/src/CReader.h | 42 + gb.xml/src/CTextNode.cpp | 94 + gb.xml/src/CTextNode.h | 31 + gb.xml/src/Makefile.am | 18 + gb.xml/src/document.cpp | 214 + gb.xml/src/document.h | 38 + gb.xml/src/element.cpp | 335 + gb.xml/src/element.h | 63 + gb.xml/src/explorer.cpp | 138 + gb.xml/src/explorer.h | 65 + gb.xml/src/gb.xml.component | 5 + gb.xml/src/gb.xml.h | 204 + gb.xml/src/gb.xml/.component | 4 + gb.xml/src/gb.xml/.directory | 2 + gb.xml/src/gb.xml/.icon.png | Bin 0 -> 10933 bytes gb.xml/src/gb.xml/.project | 10 + gb.xml/src/gb.xml/.src/MTest.module | 34 + gb.xml/src/gb.xml/.src/MTest2.module | 32 + gb.xml/src/gb.xml/.src/XmlReader.class | 104 + gb.xml/src/gb.xml/.src/XmlWriter.class | 241 + gb.xml/src/gb.xml/.src/_XmlWriterDTD.class | 8 + gb.xml/src/gb.xml/text.xml | 2 + gb.xml/src/gbinterface.h | 27 + gb.xml/src/html/CHTMLDocument.cpp | 236 + gb.xml/src/html/CHTMLDocument.h | 34 + gb.xml/src/html/CHTMLElement.cpp | 121 + gb.xml/src/html/CHTMLElement.h | 32 + gb.xml/src/html/Makefile.am | 19 + gb.xml/src/html/cssfilter.cpp | 195 + gb.xml/src/html/cssfilter.h | 8 + gb.xml/src/html/gb.xml.html.component | 5 + gb.xml/src/html/gb.xml.html.h | 26 + gb.xml/src/html/htmldocument.cpp | 317 + gb.xml/src/html/htmldocument.h | 61 + gb.xml/src/html/htmlelement.cpp | 104 + gb.xml/src/html/htmlelement.h | 42 + gb.xml/src/html/htmlmain.cpp | 63 + gb.xml/src/html/htmlmain.h | 35 + gb.xml/src/html/htmlparser.cpp | 342 + gb.xml/src/html/htmlparser.h | 9 + gb.xml/src/html/htmlserializer.cpp | 239 + gb.xml/src/html/htmlserializer.h | 10 + gb.xml/src/main.cpp | 139 + gb.xml/src/main.h | 32 + gb.xml/src/node.cpp | 635 + gb.xml/src/node.h | 98 + gb.xml/src/parser.cpp | 341 + gb.xml/src/parser.h | 14 + gb.xml/src/reader.cpp | 499 + gb.xml/src/reader.h | 114 + gb.xml/src/rpc/Makefile.am | 2 + gb.xml/src/rpc/gb.xml.rpc.component | 1 + gb.xml/src/rpc/gb.xml.rpc/.component | 4 + gb.xml/src/rpc/gb.xml.rpc/.directory | 2 + gb.xml/src/rpc/gb.xml.rpc/.icon.png | Bin 0 -> 10569 bytes gb.xml/src/rpc/gb.xml.rpc/.project | 14 + gb.xml/src/rpc/gb.xml.rpc/.src/RpcArray.class | 250 + gb.xml/src/rpc/gb.xml.rpc/.src/RpcAtom.class | 29 + .../src/rpc/gb.xml.rpc/.src/RpcClient.class | 372 + .../src/rpc/gb.xml.rpc/.src/RpcFunction.class | 125 + .../src/rpc/gb.xml.rpc/.src/RpcServer.class | 357 + .../src/rpc/gb.xml.rpc/.src/RpcStruct.class | 151 + gb.xml/src/rpc/gb.xml.rpc/.src/RpcType.class | 101 + .../rpc/gb.xml.rpc/.src/Test/CXMLRPC.class | 94 + .../src/rpc/gb.xml.rpc/.src/Test/MMain.module | 63 + .../src/rpc/gb.xml.rpc/.src/Test/MTest.module | 61 + gb.xml/src/rpc/gb.xml.rpc/.src/Tools.module | 338 + gb.xml/src/rpc/gb.xml.rpc/.src/XmlRpc.class | 101 + gb.xml/src/rpc/gb.xml.rpc/.src/hPost.class | 94 + .../src/rpc/gb.xml.rpc/.src/miniServer.class | 465 + gb.xml/src/serializer.cpp | 351 + gb.xml/src/serializer.h | 18 + gb.xml/src/textnode.cpp | 336 + gb.xml/src/textnode.h | 51 + gb.xml/src/utils.cpp | 372 + gb.xml/src/utils.h | 62 + gb.xml/src/xslt/CXSLT.cpp | 181 + gb.xml/src/xslt/CXSLT.h | 44 + gb.xml/src/xslt/Makefile.am | 11 + gb.xml/src/xslt/gb.xml.xslt.component | 6 + gb.xml/src/xslt/main.cpp | 48 + gb.xml/src/xslt/main.h | 38 + gb.xml/src/xslt/xslt.pro | 14 + logo/gambas-ide.svg | 166 + logo/gambas.svg | 91 + m4/ax_compare_version.m4 | 177 + m4/gb_cflags_gcc_option.m4 | 226 + m4/gb_httpd.m4 | 188 + m4/gb_sdl.m4 | 185 + main/AUTHORS | 0 main/COPYING | 1 + main/ChangeLog | 1 + main/INSTALL | 231 + main/Makefile.am | 89 + main/NEWS | 0 main/README | 0 main/TODO | 0 main/acinclude.m4 | 1 + main/component.am | 1 + main/configure.ac | 148 + main/gb.pcre.h | 1 + main/gbc/Makefile.am | 72 + main/gbc/gb_alloc.c | 24 + main/gbc/gb_array.c | 25 + main/gbc/gb_buffer.c | 25 + main/gbc/gb_common.c | 32 + main/gbc/gb_error.c | 274 + main/gbc/gb_error.h | 127 + main/gbc/gb_file.c | 29 + main/gbc/gb_file.h | 24 + main/gbc/gb_str.c | 199 + main/gbc/gb_str.h | 42 + main/gbc/gb_table.c | 26 + main/gbc/gba.c | 415 + main/gbc/gbc.c | 644 + main/gbc/gbc_arch.c | 43 + main/gbc/gbc_archive.c | 444 + main/gbc/gbc_archive.h | 49 + main/gbc/gbc_chown.c | 52 + main/gbc/gbc_chown.h | 29 + main/gbc/gbc_class.c | 1022 + main/gbc/gbc_class.h | 270 + main/gbc/gbc_code.c | 36 + main/gbc/gbc_compile.c | 730 + main/gbc/gbc_compile.h | 126 + main/gbc/gbc_dump.c | 838 + main/gbc/gbc_form.c | 531 + main/gbc/gbc_form.h | 57 + main/gbc/gbc_form_webpage.c | 526 + main/gbc/gbc_header.c | 1194 + main/gbc/gbc_header.h | 69 + main/gbc/gbc_help.c | 182 + main/gbc/gbc_help.h | 40 + main/gbc/gbc_output.c | 1393 + main/gbc/gbc_output.h | 52 + main/gbc/gbc_pcode.c | 28 + main/gbc/gbc_preprocess.c | 325 + main/gbc/gbc_preprocess.h | 37 + main/gbc/gbc_read.c | 1255 + main/gbc/gbc_read.h | 47 + main/gbc/gbc_reserved.c | 27 + main/gbc/gbc_reserved_make.c | 469 + main/gbc/gbc_trans.c | 851 + main/gbc/gbc_trans.h | 262 + main/gbc/gbc_trans_code.c | 743 + main/gbc/gbc_trans_ctrl.c | 1350 + main/gbc/gbc_trans_expr.c | 1173 + main/gbc/gbc_trans_subr.c | 1048 + main/gbc/gbc_trans_tree.c | 846 + main/gbc/gbc_type.c | 126 + main/gbc/gbc_type.h | 110 + main/gbc/gbi.c | 932 + main/gbx/Makefile.am | 98 + main/gbx/gb.jit.h | 117 + main/gbx/gb_alloc.c | 27 + main/gbx/gb_array.c | 25 + main/gbx/gb_buffer.c | 25 + main/gbx/gb_common.c | 111 + main/gbx/gb_common_check.h | 40 + main/gbx/gb_error.c | 784 + main/gbx/gb_error.h | 189 + main/gbx/gb_file.c | 38 + main/gbx/gb_file.h | 26 + main/gbx/gb_hash.c | 24 + main/gbx/gb_list.c | 24 + main/gbx/gb_table.c | 28 + main/gbx/gbx.c | 517 + main/gbx/gbx.h | 29 + main/gbx/gbx_api.c | 2494 + main/gbx/gbx_api.h | 230 + main/gbx/gbx_archive.c | 794 + main/gbx/gbx_archive.h | 103 + main/gbx/gbx_c_application.c | 356 + main/gbx/gbx_c_application.h | 35 + main/gbx/gbx_c_array.c | 2434 + main/gbx/gbx_c_array.h | 130 + main/gbx/gbx_c_class.c | 991 + main/gbx/gbx_c_class.h | 38 + main/gbx/gbx_c_collection.c | 422 + main/gbx/gbx_c_collection.h | 70 + main/gbx/gbx_c_enum.c | 207 + main/gbx/gbx_c_enum.h | 53 + main/gbx/gbx_c_error.c | 169 + main/gbx/gbx_c_error.h | 33 + main/gbx/gbx_c_file.c | 1155 + main/gbx/gbx_c_file.h | 82 + main/gbx/gbx_c_gambas.c | 270 + main/gbx/gbx_c_gambas.h | 35 + main/gbx/gbx_c_observer.c | 148 + main/gbx/gbx_c_observer.h | 57 + main/gbx/gbx_c_process.c | 1309 + main/gbx/gbx_c_process.h | 82 + main/gbx/gbx_c_string.c | 1050 + main/gbx/gbx_c_string.h | 50 + main/gbx/gbx_c_system.c | 401 + main/gbx/gbx_c_system.h | 35 + main/gbx/gbx_c_task.c | 739 + main/gbx/gbx_c_task.h | 60 + main/gbx/gbx_c_timer.c | 207 + main/gbx/gbx_c_timer.h | 45 + main/gbx/gbx_class.c | 1588 + main/gbx/gbx_class.h | 561 + main/gbx/gbx_class_desc.h | 207 + main/gbx/gbx_class_info.c | 448 + main/gbx/gbx_class_init.c | 173 + main/gbx/gbx_class_load.c | 1356 + main/gbx/gbx_class_load.h | 302 + main/gbx/gbx_class_native.c | 356 + main/gbx/gbx_compare.c | 686 + main/gbx/gbx_compare.h | 63 + main/gbx/gbx_component.c | 438 + main/gbx/gbx_component.h | 89 + main/gbx/gbx_date.c | 913 + main/gbx/gbx_date.h | 109 + main/gbx/gbx_debug.c | 623 + main/gbx/gbx_debug.h | 88 + main/gbx/gbx_eval.c | 163 + main/gbx/gbx_eval.h | 41 + main/gbx/gbx_event.c | 271 + main/gbx/gbx_event.h | 59 + main/gbx/gbx_exec.c | 2039 + main/gbx/gbx_exec.h | 364 + main/gbx/gbx_exec_enum.c | 97 + main/gbx/gbx_exec_loop.c | 4170 ++ main/gbx/gbx_exec_operator.c | 368 + main/gbx/gbx_exec_pop.c | 319 + main/gbx/gbx_exec_push.c | 743 + main/gbx/gbx_expression.h | 75 + main/gbx/gbx_extern.c | 786 + main/gbx/gbx_extern.h | 49 + main/gbx/gbx_info.h | 70 + main/gbx/gbx_jit.c | 490 + main/gbx/gbx_jit.h | 62 + main/gbx/gbx_library.c | 365 + main/gbx/gbx_library.h | 77 + main/gbx/gbx_local.c | 1773 + main/gbx/gbx_local.h | 123 + main/gbx/gbx_math.c | 242 + main/gbx/gbx_math.h | 72 + main/gbx/gbx_number.c | 601 + main/gbx/gbx_number.h | 45 + main/gbx/gbx_object.c | 522 + main/gbx/gbx_object.h | 251 + main/gbx/gbx_project.c | 407 + main/gbx/gbx_project.h | 62 + main/gbx/gbx_regexp.c | 304 + main/gbx/gbx_regexp.h | 37 + main/gbx/gbx_replace.c | 25 + main/gbx/gbx_signal.c | 408 + main/gbx/gbx_signal.h | 61 + main/gbx/gbx_split.c | 243 + main/gbx/gbx_split.h | 31 + main/gbx/gbx_stack.c | 184 + main/gbx/gbx_stack.h | 133 + main/gbx/gbx_stream.c | 2089 + main/gbx/gbx_stream.h | 275 + main/gbx/gbx_stream_arch.c | 165 + main/gbx/gbx_stream_buffer.c | 245 + main/gbx/gbx_stream_direct.c | 223 + main/gbx/gbx_stream_lock.c | 109 + main/gbx/gbx_stream_memory.c | 187 + main/gbx/gbx_stream_null.c | 117 + main/gbx/gbx_stream_pipe.c | 130 + main/gbx/gbx_stream_process.c | 118 + main/gbx/gbx_stream_string.c | 140 + main/gbx/gbx_string.c | 1336 + main/gbx/gbx_string.h | 224 + main/gbx/gbx_struct.c | 102 + main/gbx/gbx_struct.h | 51 + main/gbx/gbx_subr.c | 244 + main/gbx/gbx_subr.h | 262 + main/gbx/gbx_subr_conv.c | 286 + main/gbx/gbx_subr_extern.c | 343 + main/gbx/gbx_subr_file.c | 1154 + main/gbx/gbx_subr_math.c | 942 + main/gbx/gbx_subr_math_temp.h | 463 + main/gbx/gbx_subr_misc.c | 444 + main/gbx/gbx_subr_string.c | 1357 + main/gbx/gbx_subr_test.c | 989 + main/gbx/gbx_subr_test_temp.h | 333 + main/gbx/gbx_subr_time.c | 287 + main/gbx/gbx_test.c | 93 + main/gbx/gbx_test.h | 32 + main/gbx/gbx_type.c | 351 + main/gbx/gbx_type.h | 99 + main/gbx/gbx_value.c | 2195 + main/gbx/gbx_value.h | 656 + main/gbx/gbx_variant.h | 99 + main/gbx/gbx_watch.c | 766 + main/gbx/gbx_watch.h | 75 + main/lib/Makefile.am | 2 + main/lib/clipper/LICENSE | 26 + main/lib/clipper/Makefile.am | 19 + main/lib/clipper/c_clipper.cpp | 485 + main/lib/clipper/c_clipper.h | 48 + main/lib/clipper/clipper.cpp | 4630 ++ main/lib/clipper/clipper.hpp | 406 + main/lib/clipper/gb.clipper.component | 4 + main/lib/clipper/gb.geom.h | 1 + main/lib/clipper/main.cpp | 62 + main/lib/clipper/main.h | 36 + main/lib/complex/Makefile.am | 14 + main/lib/complex/ccomplex.c | 531 + main/lib/complex/ccomplex.h | 44 + main/lib/complex/gb.complex.component | 4 + main/lib/complex/main.c | 58 + main/lib/complex/main.h | 34 + main/lib/compress/CCompress.c | 187 + main/lib/compress/CCompress.h | 51 + main/lib/compress/CUncompress.c | 149 + main/lib/compress/CUncompress.h | 49 + main/lib/compress/Makefile.am | 12 + main/lib/compress/gb.compress.component | 3 + main/lib/compress/gb.compress.h | 68 + main/lib/compress/main.c | 111 + main/lib/compress/main.h | 39 + main/lib/data/Makefile.am | 21 + main/lib/data/TODO | 55 + main/lib/data/c_avltree.c | 777 + main/lib/data/c_avltree.h | 33 + main/lib/data/c_circular.c | 307 + main/lib/data/c_circular.h | 33 + main/lib/data/c_deque.c | 391 + main/lib/data/c_deque.h | 36 + main/lib/data/c_graph.c | 485 + main/lib/data/c_graph.h | 66 + main/lib/data/c_graphmatrix.c | 699 + main/lib/data/c_graphmatrix.h | 34 + main/lib/data/c_heap.c | 406 + main/lib/data/c_heap.h | 33 + main/lib/data/c_list.c | 1363 + main/lib/data/c_list.h | 36 + main/lib/data/c_trie.c | 590 + main/lib/data/c_trie.h | 33 + main/lib/data/gb.data.component | 3 + main/lib/data/gb.data/.component | 3 + main/lib/data/gb.data/.directory | 2 + main/lib/data/gb.data/.icon.png | Bin 0 -> 10569 bytes main/lib/data/gb.data/.project | 10 + main/lib/data/gb.data/.src/MMain.module | 4 + main/lib/data/gb.data/.src/PrioSet.class | 63 + .../data/gb.data/.src/_PrioSet_Entry.class | 17 + main/lib/data/list.h | 99 + main/lib/data/lookup3.h | 142 + main/lib/data/main.c | 81 + main/lib/data/main.h | 32 + main/lib/data/string_compare.h | 43 + main/lib/data/trie.c | 756 + main/lib/data/trie.h | 82 + main/lib/db/CConnection.c | 885 + main/lib/db/CConnection.h | 56 + main/lib/db/CDatabase.c | 206 + main/lib/db/CDatabase.h | 55 + main/lib/db/CField.c | 329 + main/lib/db/CField.h | 58 + main/lib/db/CIndex.c | 274 + main/lib/db/CIndex.h | 56 + main/lib/db/CResult.c | 998 + main/lib/db/CResult.h | 78 + main/lib/db/CResultField.c | 258 + main/lib/db/CResultField.h | 57 + main/lib/db/CTable.c | 446 + main/lib/db/CTable.h | 63 + main/lib/db/CUser.c | 229 + main/lib/db/CUser.h | 56 + main/lib/db/Makefile.am | 25 + main/lib/db/c_subcollection.c | 265 + main/lib/db/c_subcollection.h | 68 + main/lib/db/deletemap.c | 183 + main/lib/db/deletemap.h | 35 + main/lib/db/gb.db.component | 4 + main/lib/db/gb.db.h | 269 + main/lib/db/gb.db.proto.h | 148 + main/lib/db/gb.db/.component | 3 + main/lib/db/gb.db/.directory | 2 + main/lib/db/gb.db/.icon.png | Bin 0 -> 10933 bytes main/lib/db/gb.db/.project | 11 + main/lib/db/gb.db/.src/Connection.class | 512 + main/lib/db/gb.db/.src/Connections.class | 215 + main/lib/db/gb.db/.src/Main.module | 16 + main/lib/db/gb.db/.src/SQLRequest.class | 174 + main/lib/db/gb_barray.h | 57 + main/lib/db/main.c | 729 + main/lib/db/main.h | 65 + main/lib/db/sqlite.c | 213 + main/lib/db/sqlite.h | 35 + main/lib/debug/CDebug.c | 319 + main/lib/debug/CDebug.h | 39 + main/lib/debug/Makefile.am | 18 + main/lib/debug/debug.c | 1140 + main/lib/debug/debug.h | 95 + main/lib/debug/gb.debug.component | 2 + main/lib/debug/gb.debug.h | 120 + main/lib/debug/main.c | 72 + main/lib/debug/main.h | 36 + main/lib/debug/print.c | 486 + main/lib/debug/print.h | 39 + main/lib/debug/profile.c | 245 + main/lib/debug/profile.h | 34 + main/lib/draw/Makefile.am | 15 + main/lib/draw/cdraw.c | 1309 + main/lib/draw/cdraw.h | 45 + main/lib/draw/cpaint.c | 1830 + main/lib/draw/cpaint.h | 49 + main/lib/draw/gb.draw.h | 98 + main/lib/draw/gb.geom.h | 1 + main/lib/draw/gb.image.h | 1 + main/lib/draw/gb.paint.h | 244 + main/lib/draw/gb_list.c | 24 + main/lib/draw/main.c | 75 + main/lib/draw/main.h | 39 + main/lib/draw/matrix.c | 221 + main/lib/draw/matrix.h | 49 + main/lib/eval/Makefile.am | 29 + main/lib/eval/c_expression.c | 196 + main/lib/eval/c_expression.h | 49 + main/lib/eval/c_highlight.c | 310 + main/lib/eval/c_highlight.h | 36 + main/lib/eval/c_system.c | 110 + main/lib/eval/c_system.h | 35 + main/lib/eval/eval.c | 291 + main/lib/eval/eval.h | 62 + main/lib/eval/eval_analyze.c | 777 + main/lib/eval/eval_analyze.h | 32 + main/lib/eval/eval_code.c | 37 + main/lib/eval/eval_code.h | 110 + main/lib/eval/eval_read.c | 1414 + main/lib/eval/eval_read.h | 36 + main/lib/eval/eval_reserved.c | 26 + main/lib/eval/eval_trans.c | 458 + main/lib/eval/eval_trans.h | 73 + main/lib/eval/eval_trans_expr.c | 618 + main/lib/eval/eval_trans_tree.c | 713 + main/lib/eval/gb.eval.component | 20 + main/lib/eval/gb.eval.h | 121 + main/lib/eval/gb_alloc_override.h | 34 + main/lib/eval/gb_array.c | 26 + main/lib/eval/gb_error.c | 116 + main/lib/eval/gb_error.h | 59 + main/lib/eval/gb_table.c | 28 + main/lib/eval/main.c | 78 + main/lib/eval/main.h | 35 + main/lib/gb.component | 26 + main/lib/geom/Makefile.am | 10 + main/lib/geom/cpoint.c | 33 + main/lib/geom/cpoint.h | 54 + main/lib/geom/cpoint_temp.h | 258 + main/lib/geom/crect.c | 32 + main/lib/geom/crect.h | 60 + main/lib/geom/crect_temp.h | 404 + main/lib/geom/gb.geom.h | 103 + main/lib/geom/main.c | 67 + main/lib/geom/main.h | 37 + main/lib/gui.opengl/Makefile.am | 11 + main/lib/gui.opengl/gb.gui.opengl.component | 6 + main/lib/gui.opengl/main.c | 73 + main/lib/gui.opengl/main.h | 34 + main/lib/gui.qt.opengl/Makefile.am | 12 + .../gui.qt.opengl/gb.gui.qt.opengl.component | 4 + main/lib/gui.qt.opengl/main.c | 71 + main/lib/gui.qt.opengl/main.h | 34 + main/lib/gui.qt.webkit/Makefile.am | 12 + .../gui.qt.webkit/gb.gui.qt.webkit.component | 4 + main/lib/gui.qt.webkit/main.c | 71 + main/lib/gui.qt.webkit/main.h | 34 + main/lib/gui.qt/Makefile.am | 12 + main/lib/gui.qt/gb.gui.qt.component | 6 + main/lib/gui.qt/gb_gui_test_temp.h | 1 + main/lib/gui.qt/main.c | 131 + main/lib/gui.qt/main.h | 36 + main/lib/gui.trayicon/Makefile.am | 13 + main/lib/gui.trayicon/cfaketrayicon.c | 83 + main/lib/gui.trayicon/cfaketrayicon.h | 35 + .../gui.trayicon/gb.gui.trayicon.component | 5 + main/lib/gui.trayicon/main.c | 73 + main/lib/gui.trayicon/main.h | 34 + main/lib/gui/Makefile.am | 12 + main/lib/gui/gb.gui.component | 6 + main/lib/gui/gb_gui_test_temp.h | 55 + main/lib/gui/main.c | 149 + main/lib/gui/main.h | 34 + main/lib/image.effect/CImage.cpp | 473 + main/lib/image.effect/CImage.h | 48 + main/lib/image.effect/Makefile.am | 29 + main/lib/image.effect/effect.cpp | 153 + main/lib/image.effect/effect.h | 44 + .../image.effect/gb.image.effect.component | 5 + main/lib/image.effect/kcpuinfo.cpp | 212 + main/lib/image.effect/kcpuinfo.h | 92 + main/lib/image.effect/kimageeffect.cpp | 5043 ++ main/lib/image.effect/kimageeffect.h | 811 + main/lib/image.effect/main.cpp | 51 + main/lib/image.effect/main.h | 36 + main/lib/image.effect/qcolor.cpp | 1021 + main/lib/image.effect/qcolor.h | 255 + main/lib/image.effect/qimage.cpp | 147 + main/lib/image.effect/qimage.h | 493 + main/lib/image.effect/qpoint.cpp | 463 + main/lib/image.effect/qpoint.h | 235 + main/lib/image.effect/qrect.cpp | 981 + main/lib/image.effect/qrect.h | 294 + main/lib/image.effect/qsize.cpp | 452 + main/lib/image.effect/qsize.h | 256 + main/lib/image.effect/qt.h | 57 + main/lib/image/CImage.c | 598 + main/lib/image/CImage.h | 48 + main/lib/image/CImageStat.c | 140 + main/lib/image/CImageStat.h | 51 + main/lib/image/Makefile.am | 24 + main/lib/image/c_color.c | 709 + main/lib/image/c_color.h | 53 + main/lib/image/gb.image.component | 5 + main/lib/image/gb.image.h | 173 + main/lib/image/image.c | 2446 + main/lib/image/image.h | 89 + main/lib/image/image_stat.c | 624 + main/lib/image/image_stat.h | 66 + main/lib/image/main.c | 83 + main/lib/image/main.h | 35 + main/lib/inotify/Makefile.am | 13 + main/lib/inotify/TODO | 5 + main/lib/inotify/c_watch.c | 709 + main/lib/inotify/c_watch.h | 46 + main/lib/inotify/gb.inotify.component | 3 + main/lib/inotify/gb_list.c | 24 + main/lib/inotify/main.c | 43 + main/lib/inotify/main.h | 32 + main/lib/jit/Makefile.am | 16 + main/lib/jit/gb.jit.component | 6 + main/lib/jit/gb.jit/.component | 4 + main/lib/jit/gb.jit/.directory | 2 + main/lib/jit/gb.jit/.icon.png | Bin 0 -> 10569 bytes main/lib/jit/gb.jit/.project | 13 + main/lib/jit/gb.jit/.src/CCompilation.class | 165 + main/lib/jit/gb.jit/.src/Jit.module | 195 + main/lib/jit/gb.jit/.src/Main.module | 7 + main/lib/jit/gb.jit/.src/_ClassStat.class | 100 + main/lib/jit/gb.jit/gambas.h | 1 + main/lib/jit/gb.jit/gb.jit.h | 1 + main/lib/jit/gb.jit/gb_error_common.h | 1 + main/lib/jit/gb.jit/jit.h | 582 + main/lib/jit/gb_str.c | 227 + main/lib/jit/gb_str.h | 42 + main/lib/jit/gbc_reserved.c | 30 + main/lib/jit/jit.c | 556 + main/lib/jit/jit.h | 94 + main/lib/jit/jit_body.c | 3528 ++ main/lib/jit/main.c | 66 + main/lib/jit/main.h | 39 + main/lib/option/Makefile.am | 14 + main/lib/option/gb.option.component | 4 + main/lib/option/getoptions.c | 396 + main/lib/option/getoptions.h | 56 + main/lib/option/main.c | 90 + main/lib/option/main.h | 35 + main/lib/signal/Makefile.am | 14 + main/lib/signal/csignal.c | 261 + main/lib/signal/csignal.h | 34 + main/lib/signal/gb.signal.component | 3 + main/lib/signal/main.c | 48 + main/lib/signal/main.h | 34 + main/lib/term/Makefile.am | 14 + main/lib/term/cterm.c | 478 + main/lib/term/cterm.h | 44 + main/lib/term/gb.term.component | 3 + main/lib/term/main.c | 49 + main/lib/term/main.h | 36 + main/lib/test/Makefile.am | 14 + main/lib/test/gb.test.component | 5 + main/lib/test/gb.test/.component | 5 + main/lib/test/gb.test/.directory | 2 + main/lib/test/gb.test/.hidden/CHANGELOG | 177 + main/lib/test/gb.test/.hidden/flowchart.fodg | 617 + main/lib/test/gb.test/.hidden/flowchart.svg | 352 + main/lib/test/gb.test/.hidden/gb.test.png | Bin 0 -> 240 bytes .../test/gb.test/.hidden/summary-example.txt | 14 + main/lib/test/gb.test/.icon.png | Bin 0 -> 8205 bytes main/lib/test/gb.test/.lang/de.po | 135 + main/lib/test/gb.test/.lang/it.po | 20 + main/lib/test/gb.test/.lang/pt_BR.po | 157 + main/lib/test/gb.test/.project | 24 + main/lib/test/gb.test/.src/Helper.module | 141 + .../test/gb.test/.src/Tap/TapContext.class | 16 + .../lib/test/gb.test/.src/Tap/TapParser.class | 189 + .../test/gb.test/.src/Tap/TapPrinter.class | 200 + .../lib/test/gb.test/.src/TestAssertion.class | 52 + .../gb.test/.src/TestMyself/TAllAsserts.test | 368 + .../gb.test/.src/TestMyself/TBailout.test | 8 + .../gb.test/.src/TestMyself/TCrashes.test | 22 + .../test/gb.test/.src/TestMyself/TElse.test | 58 + .../test/gb.test/.src/TestMyself/TEmpty.test | 3 + .../gb.test/.src/TestMyself/TFailures.test | 66 + .../gb.test/.src/TestMyself/TInternals.test | 141 + .../test/gb.test/.src/TestMyself/TParser.test | 123 + .../test/gb.test/.src/TestMyself/TSetup.test | 52 + .../gb.test/.src/TestMyself/TSkipAll.test | 7 + .../gb.test/.src/TestMyself/TSummary.test | 62 + .../gb.test/.src/TestMyself/TWrongPlan.test | 10 + main/lib/test/gb.test/.src/TestRunner.module | 179 + main/lib/test/gb.test/.src/TestStats.class | 47 + .../test/gb.test/.src/TestSuite/Assert.module | 309 + .../test/gb.test/.src/TestSuite/Test.module | 489 + .../gb.test/.src/TestSuite/TestCase.class | 79 + .../gb.test/.src/TestSuite/TestCommand.class | 127 + .../gb.test/.src/TestSuite/TestSuite.class | 136 + main/lib/test/gb.test/.src/ZzzDoSth.module | 23 + main/lib/test/gb.test/.test | 33 + main/lib/test/gb.test/LICENSE | 340 + main/lib/test/gb.test/README.md | 151 + main/lib/test/gb.test/taskell.md | 54 + main/lib/test/gb.test/test.sh | 5 + .../gb.test/unittesthelloworld-1.0.0.tar.gz | Bin 0 -> 12298 bytes main/lib/test/main.c | 64 + main/lib/test/main.h | 36 + main/lib/vb/Makefile.am | 14 + main/lib/vb/gb.vb.component | 6 + main/lib/vb/main.c | 50 + main/lib/vb/main.h | 35 + main/lib/vb/vb.c | 312 + main/lib/vb/vb.h | 33 + main/lib/vb/vbdate.c | 215 + main/lib/vb/vbdate.h | 32 + main/m4 | 1 + main/man/Makefile.am | 1 + main/man/gba3.1 | 54 + main/man/gbc3.1 | 72 + main/man/gbh3.1 | 49 + main/man/gbi3.1 | 45 + main/man/gbr3.1 | 66 + main/man/gbx3.1 | 72 + main/mime/application-x-gambas3.png | Bin 0 -> 7788 bytes main/mime/application-x-gambas3.xml | 12 + main/reconf | 1 + main/share/Makefile.am | 1 + main/share/gambas.h | 1261 + main/share/gb_alloc.h | 117 + main/share/gb_alloc_temp.h | 493 + main/share/gb_arch.h | 90 + main/share/gb_arch_temp.h | 362 + main/share/gb_array.h | 117 + main/share/gb_array_temp.h | 223 + main/share/gb_buffer.h | 49 + main/share/gb_buffer_temp.h | 163 + main/share/gb_class_desc_common.h | 40 + main/share/gb_code.h | 158 + main/share/gb_code_temp.h | 1472 + main/share/gb_common.h | 212 + main/share/gb_common_buffer.h | 64 + main/share/gb_common_buffer_temp.h | 66 + main/share/gb_common_case.h | 60 + main/share/gb_common_case_temp.h | 104 + main/share/gb_common_string.h | 37 + main/share/gb_common_string_temp.h | 197 + main/share/gb_common_swap.h | 42 + main/share/gb_common_swap_temp.h | 71 + main/share/gb_component.h | 71 + main/share/gb_error_common.h | 213 + main/share/gb_file_share.h | 141 + main/share/gb_file_temp.h | 1288 + main/share/gb_hash.h | 106 + main/share/gb_hash_temp.h | 534 + main/share/gb_limit.h | 106 + main/share/gb_list.h | 43 + main/share/gb_list_temp.h | 90 + main/share/gb_magic.h | 35 + main/share/gb_pcode.h | 173 + main/share/gb_pcode_temp.h | 480 + main/share/gb_replace.h | 51 + main/share/gb_replace_temp.h | 133 + main/share/gb_reserved.h | 372 + main/share/gb_reserved_keyword.h | 590 + main/share/gb_reserved_temp.h | 970 + main/share/gb_table.h | 105 + main/share/gb_table_temp.h | 597 + main/share/gb_type_common.h | 92 + main/share/gbc_read_common.h | 93 + main/share/gbc_trans_common.h | 172 + main/share/gbx_subr_common.h | 680 + main/tools/gbh3/.directory | 2 + main/tools/gbh3/.icon.png | Bin 0 -> 3398 bytes main/tools/gbh3/.project | 11 + main/tools/gbh3/.src/MMain.module | 447 + main/tools/gbh3/.src/MOldMain.module | 256 + main/tools/gbh3/README | 112 + main/tools/gbh3/icon.png | Bin 0 -> 3211 bytes main/tools/gbh3/license | 6 + main/tools/gbh3/usage | 18 + reconf | 7 + reconf-all | 9 + version.m4 | 13 + 6869 files changed, 1525634 insertions(+) create mode 100644 .gitignore create mode 100644 .gitlab-ci.yml create mode 100644 AUTHORS create mode 100644 CONTRIBUTING.md create mode 100644 COPYING create mode 100644 ChangeLog create mode 100644 INSTALL create mode 100644 Makefile.am create mode 100644 NEWS create mode 100644 README create mode 100644 README.commit create mode 100644 README.md create mode 100644 TEMPLATE/README create mode 100644 TEMPLATE/TEMPLATE.c create mode 100644 TEMPLATE/TEMPLATE.conf create mode 100644 TEMPLATE/TEMPLATE.cpp create mode 100644 TEMPLATE/TEMPLATE.h create mode 100644 TEMPLATE/conf/gb.cairo.conf create mode 100644 TEMPLATE/conf/gb.dbus.conf create mode 100644 TEMPLATE/conf/gb.desktop.conf create mode 100644 TEMPLATE/conf/gb.gmp.conf create mode 100644 TEMPLATE/conf/gb.gsl.conf create mode 100644 TEMPLATE/conf/gb.image.io.conf create mode 100644 TEMPLATE/conf/gb.media.conf create mode 100644 TEMPLATE/conf/gb.mime.conf create mode 100644 TEMPLATE/conf/gb.net.pop3.conf create mode 100644 TEMPLATE/conf/gb.net.smtp.conf create mode 100644 TEMPLATE/conf/gb.openal.conf create mode 100644 TEMPLATE/conf/gb.poppler.conf create mode 100755 TEMPLATE/make-component create mode 100644 TEMPLATE/template/AUTHORS create mode 100644 TEMPLATE/template/ChangeLog create mode 100644 TEMPLATE/template/Makefile.am create mode 100644 TEMPLATE/template/NEWS create mode 100644 TEMPLATE/template/README create mode 100644 TEMPLATE/template/SOURCES create mode 100644 TEMPLATE/template/configure.ac create mode 100755 TEMPLATE/template/make-component create mode 100644 TEMPLATE/template/src/.component create mode 100644 TEMPLATE/template/src/Makefile.am create mode 100644 TODO create mode 100644 VERSION create mode 100644 acinclude.m4 create mode 100644 app/AUTHORS create mode 120000 app/COPYING create mode 100644 app/ChangeLog create mode 100644 app/INSTALL create mode 100644 app/Makefile.am create mode 100644 app/NEWS create mode 100644 app/README create mode 100644 app/TODO create mode 120000 app/acinclude.m4 create mode 100644 app/configure.ac create mode 100644 app/desktop/gambas3.appdata.xml create mode 100644 app/desktop/gambas3.desktop create mode 100644 app/desktop/gambas3.png create mode 100644 app/desktop/gambas3.svg create mode 100644 app/examples/Basic/Blights/.directory create mode 100644 app/examples/Basic/Blights/.icon.png create mode 100644 app/examples/Basic/Blights/.lang/ca.po create mode 100644 app/examples/Basic/Blights/.lang/cs.po create mode 100644 app/examples/Basic/Blights/.lang/de.po create mode 100644 app/examples/Basic/Blights/.lang/es.po create mode 100644 app/examples/Basic/Blights/.lang/fr.po create mode 100644 app/examples/Basic/Blights/.lang/nl.po create mode 100644 app/examples/Basic/Blights/.lang/ru.po create mode 100644 app/examples/Basic/Blights/.lang/sv.po create mode 100644 app/examples/Basic/Blights/.project create mode 100644 app/examples/Basic/Blights/.src/win1.class create mode 100644 app/examples/Basic/Blights/.src/win1.form create mode 100644 app/examples/Basic/Blights/ampoule.png create mode 100644 app/examples/Basic/Blights/bloff.xpm create mode 100644 app/examples/Basic/Blights/blon.xpm create mode 100644 app/examples/Basic/Collection/.directory create mode 100644 app/examples/Basic/Collection/.icon.png create mode 100644 app/examples/Basic/Collection/.lang/ca.po create mode 100644 app/examples/Basic/Collection/.lang/cs.po create mode 100644 app/examples/Basic/Collection/.lang/de.po create mode 100644 app/examples/Basic/Collection/.lang/es.po create mode 100644 app/examples/Basic/Collection/.lang/nl.po create mode 100644 app/examples/Basic/Collection/.lang/ru.po create mode 100644 app/examples/Basic/Collection/.project create mode 100644 app/examples/Basic/Collection/.src/CThing.class create mode 100644 app/examples/Basic/Collection/.src/FStart.class create mode 100644 app/examples/Basic/Collection/.src/FStart.form create mode 100644 app/examples/Basic/Collection/collection.png create mode 100644 app/examples/Basic/DragNDrop/.directory create mode 100644 app/examples/Basic/DragNDrop/.icon.png create mode 100644 app/examples/Basic/DragNDrop/.lang/ru.po create mode 100644 app/examples/Basic/DragNDrop/.project create mode 100644 app/examples/Basic/DragNDrop/.src/FDragNDrop.class create mode 100644 app/examples/Basic/DragNDrop/.src/FDragNDrop.form create mode 100644 app/examples/Basic/DragNDrop/drop.png create mode 100644 app/examples/Basic/Object/.directory create mode 100644 app/examples/Basic/Object/.icon.png create mode 100644 app/examples/Basic/Object/.lang/ca.po create mode 100644 app/examples/Basic/Object/.lang/cs.po create mode 100644 app/examples/Basic/Object/.lang/de.po create mode 100644 app/examples/Basic/Object/.lang/es.po create mode 100644 app/examples/Basic/Object/.lang/nl.po create mode 100644 app/examples/Basic/Object/.lang/ru.po create mode 100644 app/examples/Basic/Object/.project create mode 100644 app/examples/Basic/Object/.src/CThing.class create mode 100644 app/examples/Basic/Object/.src/FStart.class create mode 100644 app/examples/Basic/Object/.src/FStart.form create mode 100644 app/examples/Basic/Object/object.png create mode 100644 app/examples/Basic/Timer/.directory create mode 100644 app/examples/Basic/Timer/.icon.png create mode 100644 app/examples/Basic/Timer/.lang/ca.po create mode 100644 app/examples/Basic/Timer/.lang/cs.po create mode 100644 app/examples/Basic/Timer/.lang/de.po create mode 100644 app/examples/Basic/Timer/.lang/es.po create mode 100644 app/examples/Basic/Timer/.lang/nl.po create mode 100644 app/examples/Basic/Timer/.lang/ru.po create mode 100644 app/examples/Basic/Timer/.project create mode 100644 app/examples/Basic/Timer/.src/FOtherTimer.class create mode 100644 app/examples/Basic/Timer/.src/FOtherTimer.form create mode 100644 app/examples/Basic/Timer/.src/FTimer.class create mode 100644 app/examples/Basic/Timer/.src/FTimer.form create mode 100644 app/examples/Basic/Timer/timer.png create mode 100644 app/examples/Control/ArrayOfControls/.directory create mode 100644 app/examples/Control/ArrayOfControls/.icon.png create mode 100644 app/examples/Control/ArrayOfControls/.lang/ca.po create mode 100644 app/examples/Control/ArrayOfControls/.lang/cs.po create mode 100644 app/examples/Control/ArrayOfControls/.lang/de.po create mode 100644 app/examples/Control/ArrayOfControls/.lang/nl.po create mode 100644 app/examples/Control/ArrayOfControls/.lang/ru.po create mode 100644 app/examples/Control/ArrayOfControls/.project create mode 100644 app/examples/Control/ArrayOfControls/.src/FMain.class create mode 100644 app/examples/Control/ArrayOfControls/.src/FMain.form create mode 100644 app/examples/Control/ArrayOfControls/green.png create mode 100644 app/examples/Control/ArrayOfControls/green1.png create mode 100644 app/examples/Control/ArrayOfControls/phone.png create mode 100644 app/examples/Control/ArrayOfControls/red.png create mode 100644 app/examples/Control/ArrayOfControls/red1.png create mode 100644 app/examples/Control/Embedder/.directory create mode 100644 app/examples/Control/Embedder/.icon.png create mode 100644 app/examples/Control/Embedder/.lang/ca.po create mode 100644 app/examples/Control/Embedder/.lang/cs.po create mode 100644 app/examples/Control/Embedder/.lang/de.po create mode 100644 app/examples/Control/Embedder/.lang/es.po create mode 100644 app/examples/Control/Embedder/.lang/nl.po create mode 100644 app/examples/Control/Embedder/.lang/ru.po create mode 100644 app/examples/Control/Embedder/.project create mode 100644 app/examples/Control/Embedder/.src/FMain.class create mode 100644 app/examples/Control/Embedder/.src/FMain.form create mode 100644 app/examples/Control/Embedder/embedder.png create mode 100644 app/examples/Control/HighlightEditor/.directory create mode 100644 app/examples/Control/HighlightEditor/.hidden/screenshots/2014-12-17.png create mode 100644 app/examples/Control/HighlightEditor/.icon.png create mode 100644 app/examples/Control/HighlightEditor/.lang/ca.po create mode 100644 app/examples/Control/HighlightEditor/.lang/cs.po create mode 100644 app/examples/Control/HighlightEditor/.lang/de.po create mode 100644 app/examples/Control/HighlightEditor/.lang/es.po create mode 100644 app/examples/Control/HighlightEditor/.lang/nl.po create mode 100644 app/examples/Control/HighlightEditor/.lang/ru.po create mode 100644 app/examples/Control/HighlightEditor/.project create mode 100644 app/examples/Control/HighlightEditor/.src/FEditor.class create mode 100644 app/examples/Control/HighlightEditor/.src/FEditor.form create mode 100644 app/examples/Control/HighlightEditor/download.html create mode 100644 app/examples/Control/HighlightEditor/editor.png create mode 100644 app/examples/Control/LCDLabel/.directory create mode 100644 app/examples/Control/LCDLabel/.icon.png create mode 100644 app/examples/Control/LCDLabel/.lang/ru.po create mode 100644 app/examples/Control/LCDLabel/.project create mode 100644 app/examples/Control/LCDLabel/.src/FMain.class create mode 100644 app/examples/Control/LCDLabel/.src/FMain.form create mode 100644 app/examples/Control/LCDLabel/.src/TimeBoxDemo.class create mode 100644 app/examples/Control/LCDLabel/alarm.ogg create mode 100644 app/examples/Control/LCDLabel/lcdlabel.png create mode 100644 app/examples/Control/MapView/.directory create mode 100644 app/examples/Control/MapView/.hidden/mapview.png create mode 100644 app/examples/Control/MapView/.icon.png create mode 100644 app/examples/Control/MapView/.lang/ru.po create mode 100644 app/examples/Control/MapView/.project create mode 100644 app/examples/Control/MapView/.src/FMain.class create mode 100644 app/examples/Control/MapView/.src/FMain.form create mode 100644 app/examples/Control/TextEdit/.directory create mode 100644 app/examples/Control/TextEdit/.icon.png create mode 100644 app/examples/Control/TextEdit/.lang/ca.po create mode 100644 app/examples/Control/TextEdit/.lang/cs.po create mode 100644 app/examples/Control/TextEdit/.lang/de.po create mode 100644 app/examples/Control/TextEdit/.lang/es.po create mode 100644 app/examples/Control/TextEdit/.lang/fr.po create mode 100644 app/examples/Control/TextEdit/.lang/nl.po create mode 100644 app/examples/Control/TextEdit/.lang/ru.po create mode 100644 app/examples/Control/TextEdit/.lang/sv.po create mode 100644 app/examples/Control/TextEdit/.project create mode 100644 app/examples/Control/TextEdit/.src/FMain.class create mode 100644 app/examples/Control/TextEdit/.src/FMain.form create mode 100644 app/examples/Control/TextEdit/.src/frmShowHtml.class create mode 100644 app/examples/Control/TextEdit/.src/frmShowHtml.form create mode 100644 app/examples/Control/TextEdit/edit.png create mode 100644 app/examples/Control/TextEdit/text.html create mode 100644 app/examples/Control/TreeView/.directory create mode 100644 app/examples/Control/TreeView/.icon.png create mode 100644 app/examples/Control/TreeView/.lang/ca.po create mode 100644 app/examples/Control/TreeView/.lang/cs.po create mode 100644 app/examples/Control/TreeView/.lang/de.po create mode 100644 app/examples/Control/TreeView/.lang/es.po create mode 100644 app/examples/Control/TreeView/.lang/nl.po create mode 100644 app/examples/Control/TreeView/.lang/ru.po create mode 100644 app/examples/Control/TreeView/.project create mode 100644 app/examples/Control/TreeView/.src/TreeViewExample.class create mode 100644 app/examples/Control/TreeView/.src/TreeViewExample.form create mode 100644 app/examples/Control/TreeView/Female.png create mode 100644 app/examples/Control/TreeView/Male.png create mode 100644 app/examples/Control/TreeView/treeview.png create mode 100644 app/examples/Control/Wizard/.directory create mode 100644 app/examples/Control/Wizard/.icon.png create mode 100644 app/examples/Control/Wizard/.lang/ca.po create mode 100644 app/examples/Control/Wizard/.lang/cs.po create mode 100644 app/examples/Control/Wizard/.lang/de.po create mode 100644 app/examples/Control/Wizard/.lang/nl.po create mode 100644 app/examples/Control/Wizard/.lang/ru.po create mode 100644 app/examples/Control/Wizard/.project create mode 100644 app/examples/Control/Wizard/.src/FMain.class create mode 100644 app/examples/Control/Wizard/.src/FMain.form create mode 100644 app/examples/Control/Wizard/wizard.png create mode 100644 app/examples/Database/Database/.component create mode 100644 app/examples/Database/Database/.directory create mode 100644 app/examples/Database/Database/.icon.png create mode 100644 app/examples/Database/Database/.lang/ca.po create mode 100644 app/examples/Database/Database/.lang/cs.po create mode 100644 app/examples/Database/Database/.lang/de.po create mode 100644 app/examples/Database/Database/.lang/es.po create mode 100644 app/examples/Database/Database/.lang/nl.po create mode 100644 app/examples/Database/Database/.lang/ru.po create mode 100644 app/examples/Database/Database/.project create mode 100644 app/examples/Database/Database/.src/FMain.class create mode 100644 app/examples/Database/Database/.src/FMain.form create mode 100644 app/examples/Database/Database/.src/FRequest.class create mode 100644 app/examples/Database/Database/.src/FRequest.form create mode 100644 app/examples/Database/Database/.src/FTest.class create mode 100644 app/examples/Database/Database/.src/FTest.form create mode 100644 app/examples/Database/Database/.src/Form1.class create mode 100644 app/examples/Database/Database/.src/Form1.form create mode 100644 app/examples/Database/Database/database.png create mode 100644 app/examples/Database/MySQLExample/.directory create mode 100644 app/examples/Database/MySQLExample/.icon.png create mode 100644 app/examples/Database/MySQLExample/.lang/ca.po create mode 100644 app/examples/Database/MySQLExample/.lang/cs.po create mode 100644 app/examples/Database/MySQLExample/.lang/de.po create mode 100644 app/examples/Database/MySQLExample/.lang/es.po create mode 100644 app/examples/Database/MySQLExample/.lang/fr.po create mode 100644 app/examples/Database/MySQLExample/.lang/nl.po create mode 100644 app/examples/Database/MySQLExample/.lang/ru.po create mode 100644 app/examples/Database/MySQLExample/.project create mode 100644 app/examples/Database/MySQLExample/.src/CreateObjects/FNewDatabase.class create mode 100644 app/examples/Database/MySQLExample/.src/CreateObjects/FNewDatabase.form create mode 100644 app/examples/Database/MySQLExample/.src/CreateObjects/FNewEvent.class create mode 100644 app/examples/Database/MySQLExample/.src/CreateObjects/FNewEvent.form create mode 100644 app/examples/Database/MySQLExample/.src/CreateObjects/FNewField.class create mode 100644 app/examples/Database/MySQLExample/.src/CreateObjects/FNewField.form create mode 100644 app/examples/Database/MySQLExample/.src/CreateObjects/FNewIndex.class create mode 100644 app/examples/Database/MySQLExample/.src/CreateObjects/FNewIndex.form create mode 100644 app/examples/Database/MySQLExample/.src/CreateObjects/FNewRoutine.class create mode 100644 app/examples/Database/MySQLExample/.src/CreateObjects/FNewRoutine.form create mode 100644 app/examples/Database/MySQLExample/.src/CreateObjects/FNewTable.class create mode 100644 app/examples/Database/MySQLExample/.src/CreateObjects/FNewTable.form create mode 100644 app/examples/Database/MySQLExample/.src/CreateObjects/FNewTrigger.class create mode 100644 app/examples/Database/MySQLExample/.src/CreateObjects/FNewTrigger.form create mode 100644 app/examples/Database/MySQLExample/.src/CreateObjects/FNewView.class create mode 100644 app/examples/Database/MySQLExample/.src/CreateObjects/FNewView.form create mode 100644 app/examples/Database/MySQLExample/.src/FConnect.class create mode 100644 app/examples/Database/MySQLExample/.src/FConnect.form create mode 100644 app/examples/Database/MySQLExample/.src/FMessage.class create mode 100644 app/examples/Database/MySQLExample/.src/FMessage.form create mode 100644 app/examples/Database/MySQLExample/.src/FTables.class create mode 100644 app/examples/Database/MySQLExample/.src/FTables.form create mode 100644 app/examples/Database/MySQLExample/.src/modMain.module create mode 100644 app/examples/Database/MySQLExample/icons/16/Admin.png create mode 100644 app/examples/Database/MySQLExample/icons/16/Blob.png create mode 100644 app/examples/Database/MySQLExample/icons/16/Column_FK.png create mode 100644 app/examples/Database/MySQLExample/icons/16/Database.png create mode 100644 app/examples/Database/MySQLExample/icons/16/Datetime.png create mode 100644 app/examples/Database/MySQLExample/icons/16/Field.png create mode 100644 app/examples/Database/MySQLExample/icons/16/Function.png create mode 100644 app/examples/Database/MySQLExample/icons/16/Index.png create mode 100644 app/examples/Database/MySQLExample/icons/16/Lock.png create mode 100644 app/examples/Database/MySQLExample/icons/16/New.png create mode 100644 app/examples/Database/MySQLExample/icons/16/Numeric.png create mode 100644 app/examples/Database/MySQLExample/icons/16/Primarykey.png create mode 100644 app/examples/Database/MySQLExample/icons/16/Refresh.png create mode 100644 app/examples/Database/MySQLExample/icons/16/Routine.png create mode 100644 app/examples/Database/MySQLExample/icons/16/String.png create mode 100644 app/examples/Database/MySQLExample/icons/16/Table.png create mode 100644 app/examples/Database/MySQLExample/icons/16/Trigger.png create mode 100644 app/examples/Database/MySQLExample/icons/16/View.png create mode 100644 app/examples/Database/MySQLExample/icons/16/Warning.png create mode 100644 app/examples/Database/MySQLExample/icons/24/Null.png create mode 100644 app/examples/Database/PictureDatabase/.directory create mode 100644 app/examples/Database/PictureDatabase/.icon.png create mode 100644 app/examples/Database/PictureDatabase/.lang/ca.po create mode 100644 app/examples/Database/PictureDatabase/.lang/cs.po create mode 100644 app/examples/Database/PictureDatabase/.lang/de.po create mode 100644 app/examples/Database/PictureDatabase/.lang/es.po create mode 100644 app/examples/Database/PictureDatabase/.lang/nl.po create mode 100644 app/examples/Database/PictureDatabase/.lang/ru.po create mode 100644 app/examples/Database/PictureDatabase/.project create mode 100644 app/examples/Database/PictureDatabase/.src/FormPictureDatabase.class create mode 100644 app/examples/Database/PictureDatabase/.src/FormPictureDatabase.form create mode 100644 app/examples/Database/PictureDatabase/.src/ModuleDatabase.module create mode 100644 app/examples/Database/PictureDatabase/Images/document-save-as.png create mode 100644 app/examples/Database/PictureDatabase/Images/document-save.png create mode 100644 app/examples/Database/PictureDatabase/Images/image-x-generic.png create mode 100644 app/examples/Database/PictureDatabase/Images/list-add.png create mode 100644 app/examples/Database/PictureDatabase/Images/list-remove.png create mode 100644 app/examples/Drawing/AnalogWatch/.directory create mode 100644 app/examples/Drawing/AnalogWatch/.hidden/screenshots/2014-12-14.png create mode 100644 app/examples/Drawing/AnalogWatch/.icon.png create mode 100644 app/examples/Drawing/AnalogWatch/.lang/ru.po create mode 100644 app/examples/Drawing/AnalogWatch/.project create mode 100644 app/examples/Drawing/AnalogWatch/.src/FrmClock.class create mode 100644 app/examples/Drawing/AnalogWatch/.src/FrmClock.form create mode 100644 app/examples/Drawing/AnalogWatch/timer.png create mode 100644 app/examples/Drawing/Barcode/.directory create mode 100644 app/examples/Drawing/Barcode/.icon.png create mode 100644 app/examples/Drawing/Barcode/.lang/ca.po create mode 100644 app/examples/Drawing/Barcode/.lang/cs.po create mode 100644 app/examples/Drawing/Barcode/.lang/de.po create mode 100644 app/examples/Drawing/Barcode/.lang/ru.po create mode 100644 app/examples/Drawing/Barcode/.project create mode 100644 app/examples/Drawing/Barcode/.src/FMain.class create mode 100644 app/examples/Drawing/Barcode/.src/FMain.form create mode 100644 app/examples/Drawing/Barcode/.src/modCrBcode.module create mode 100644 app/examples/Drawing/Barcode/barcode.png create mode 100644 app/examples/Drawing/Chart/.directory create mode 100644 app/examples/Drawing/Chart/.icon.png create mode 100644 app/examples/Drawing/Chart/.lang/ca.po create mode 100644 app/examples/Drawing/Chart/.lang/cs.po create mode 100644 app/examples/Drawing/Chart/.lang/de.po create mode 100644 app/examples/Drawing/Chart/.lang/es.po create mode 100644 app/examples/Drawing/Chart/.lang/ru.po create mode 100644 app/examples/Drawing/Chart/.project create mode 100644 app/examples/Drawing/Chart/.src/FormChart.class create mode 100644 app/examples/Drawing/Chart/.src/FormChart.form create mode 100644 app/examples/Drawing/Chart/.src/FormData.class create mode 100644 app/examples/Drawing/Chart/.src/FormData.form create mode 100644 app/examples/Drawing/Chart/graph.png create mode 100644 app/examples/Drawing/Clock/.directory create mode 100644 app/examples/Drawing/Clock/.icon.png create mode 100644 app/examples/Drawing/Clock/.icon/16.png create mode 100644 app/examples/Drawing/Clock/.icon/32.png create mode 100644 app/examples/Drawing/Clock/.icon/48.png create mode 100644 app/examples/Drawing/Clock/.lang/ca.po create mode 100644 app/examples/Drawing/Clock/.lang/cs.po create mode 100644 app/examples/Drawing/Clock/.lang/de.po create mode 100644 app/examples/Drawing/Clock/.lang/es.po create mode 100644 app/examples/Drawing/Clock/.lang/ru.po create mode 100644 app/examples/Drawing/Clock/.project create mode 100644 app/examples/Drawing/Clock/.src/FClock.class create mode 100644 app/examples/Drawing/Clock/.src/FClock.form create mode 100644 app/examples/Drawing/Clock/img/arrow_hour.png create mode 100644 app/examples/Drawing/Clock/img/arrow_min.png create mode 100644 app/examples/Drawing/Clock/img/arrow_sec.png create mode 100644 app/examples/Drawing/Clock/img/clock_bg_big1.png create mode 100644 app/examples/Drawing/Clock/img/clock_bg_big2.png create mode 100644 app/examples/Drawing/Clock/img/clock_bg_big3.png create mode 100644 app/examples/Drawing/Clock/img/clock_bg_big4.png create mode 100644 app/examples/Drawing/Fractal/.directory create mode 100644 app/examples/Drawing/Fractal/.hidden/screenshots/2014-12-14.png create mode 100644 app/examples/Drawing/Fractal/.icon.png create mode 100644 app/examples/Drawing/Fractal/.lang/cs.po create mode 100644 app/examples/Drawing/Fractal/.lang/fr.po create mode 100644 app/examples/Drawing/Fractal/.lang/ru.po create mode 100644 app/examples/Drawing/Fractal/.project create mode 100644 app/examples/Drawing/Fractal/.src/FFractal.class create mode 100644 app/examples/Drawing/Fractal/.src/FFractal.form create mode 100644 app/examples/Drawing/Fractal/.src/FractalTask.class create mode 100644 app/examples/Drawing/Fractal/icon.png create mode 100644 app/examples/Drawing/Fractal/rose.jpg create mode 100644 app/examples/Drawing/GSLSpline/.directory create mode 100644 app/examples/Drawing/GSLSpline/.icon.png create mode 100644 app/examples/Drawing/GSLSpline/.lang/ru.po create mode 100644 app/examples/Drawing/GSLSpline/.project create mode 100644 app/examples/Drawing/GSLSpline/.src/FMain.class create mode 100644 app/examples/Drawing/GSLSpline/.src/FMain.form create mode 100644 app/examples/Drawing/GSLSpline/spline.png create mode 100644 app/examples/Drawing/Gravity/.directory create mode 100644 app/examples/Drawing/Gravity/.icon.png create mode 100644 app/examples/Drawing/Gravity/.lang/ca.po create mode 100644 app/examples/Drawing/Gravity/.lang/cs.po create mode 100644 app/examples/Drawing/Gravity/.lang/de.po create mode 100644 app/examples/Drawing/Gravity/.lang/es.po create mode 100644 app/examples/Drawing/Gravity/.lang/ru.po create mode 100644 app/examples/Drawing/Gravity/.project create mode 100644 app/examples/Drawing/Gravity/.src/FAbout.class create mode 100644 app/examples/Drawing/Gravity/.src/FAbout.form create mode 100644 app/examples/Drawing/Gravity/.src/FMain.class create mode 100644 app/examples/Drawing/Gravity/.src/FMain.form create mode 100644 app/examples/Drawing/Gravity/.src/cBall.class create mode 100644 app/examples/Drawing/Gravity/gravity.png create mode 100644 app/examples/Drawing/OnScreenDisplay/.directory create mode 100644 app/examples/Drawing/OnScreenDisplay/.icon.png create mode 100644 app/examples/Drawing/OnScreenDisplay/.lang/ca.po create mode 100644 app/examples/Drawing/OnScreenDisplay/.lang/cs.po create mode 100644 app/examples/Drawing/OnScreenDisplay/.lang/de.po create mode 100644 app/examples/Drawing/OnScreenDisplay/.lang/es.po create mode 100644 app/examples/Drawing/OnScreenDisplay/.lang/ru.po create mode 100644 app/examples/Drawing/OnScreenDisplay/.project create mode 100644 app/examples/Drawing/OnScreenDisplay/.src/FOnScreenDisplay.class create mode 100644 app/examples/Drawing/OnScreenDisplay/.src/FOnScreenDisplay.form create mode 100644 app/examples/Drawing/OnScreenDisplay/icon.png create mode 100644 app/examples/Drawing/Painting/.directory create mode 100644 app/examples/Drawing/Painting/.hidden/screenshots/2014-12-14.png create mode 100644 app/examples/Drawing/Painting/.icon.png create mode 100644 app/examples/Drawing/Painting/.lang/ca.po create mode 100644 app/examples/Drawing/Painting/.lang/cs.po create mode 100644 app/examples/Drawing/Painting/.lang/de.po create mode 100644 app/examples/Drawing/Painting/.lang/ru.po create mode 100644 app/examples/Drawing/Painting/.project create mode 100644 app/examples/Drawing/Painting/.src/FMain.class create mode 100644 app/examples/Drawing/Painting/.src/FMain.form create mode 100644 app/examples/Drawing/Painting/.src/MMakeSourceFile.module create mode 100644 app/examples/Drawing/Painting/Example1 create mode 100644 app/examples/Drawing/Painting/Example10 create mode 100644 app/examples/Drawing/Painting/Example11 create mode 100644 app/examples/Drawing/Painting/Example12 create mode 100644 app/examples/Drawing/Painting/Example13 create mode 100644 app/examples/Drawing/Painting/Example14 create mode 100644 app/examples/Drawing/Painting/Example15 create mode 100644 app/examples/Drawing/Painting/Example16 create mode 100644 app/examples/Drawing/Painting/Example17 create mode 100644 app/examples/Drawing/Painting/Example18 create mode 100644 app/examples/Drawing/Painting/Example2 create mode 100644 app/examples/Drawing/Painting/Example20 create mode 100644 app/examples/Drawing/Painting/Example21 create mode 100644 app/examples/Drawing/Painting/Example22 create mode 100644 app/examples/Drawing/Painting/Example3 create mode 100644 app/examples/Drawing/Painting/Example4 create mode 100644 app/examples/Drawing/Painting/Example5 create mode 100644 app/examples/Drawing/Painting/Example6 create mode 100644 app/examples/Drawing/Painting/Example7 create mode 100644 app/examples/Drawing/Painting/Example8 create mode 100644 app/examples/Drawing/Painting/Example9 create mode 100644 app/examples/Drawing/Painting/clovis.jpg create mode 100644 app/examples/Drawing/Painting/gambas.svg create mode 100644 app/examples/Drawing/Painting/icon.png create mode 100644 app/examples/Drawing/Painting/image.jpg create mode 100644 app/examples/Drawing/QuasiRegular/.directory create mode 100644 app/examples/Drawing/QuasiRegular/.hidden/screenshots/2014-12-14.png create mode 100644 app/examples/Drawing/QuasiRegular/.icon.png create mode 100644 app/examples/Drawing/QuasiRegular/.project create mode 100644 app/examples/Drawing/QuasiRegular/.src/FMain.class create mode 100644 app/examples/Drawing/QuasiRegular/.src/FMain.form create mode 100644 app/examples/Drawing/QuasiRegular/icon.png create mode 100644 app/examples/Drawing/RandomColorSort/.directory create mode 100644 app/examples/Drawing/RandomColorSort/.hidden/screenshots/2014-12-14.png create mode 100644 app/examples/Drawing/RandomColorSort/.icon.png create mode 100644 app/examples/Drawing/RandomColorSort/.lang/ru.po create mode 100644 app/examples/Drawing/RandomColorSort/.project create mode 100644 app/examples/Drawing/RandomColorSort/.src/FMain.class create mode 100644 app/examples/Drawing/RandomColorSort/.src/FMain.form create mode 100644 app/examples/Drawing/RandomColorSort/RandomColorSort.png create mode 100644 app/examples/Drawing/Tablet/.directory create mode 100644 app/examples/Drawing/Tablet/.hidden/screenshots/2014-12-14.png create mode 100644 app/examples/Drawing/Tablet/.icon.png create mode 100644 app/examples/Drawing/Tablet/.lang/ru.po create mode 100644 app/examples/Drawing/Tablet/.project create mode 100644 app/examples/Drawing/Tablet/.src/FMain.class create mode 100644 app/examples/Drawing/Tablet/.src/FMain.form create mode 100644 app/examples/Drawing/Tablet/Icon.png create mode 100644 app/examples/Games/BeastScroll/.dir_icon.png create mode 100644 app/examples/Games/BeastScroll/.directory create mode 100644 app/examples/Games/BeastScroll/.icon.png create mode 100644 app/examples/Games/BeastScroll/.lang/ru.po create mode 100644 app/examples/Games/BeastScroll/.project create mode 100644 app/examples/Games/BeastScroll/.src/MMain.module create mode 100644 app/examples/Games/BeastScroll/b-title.mod create mode 100644 app/examples/Games/BeastScroll/bgd1_ciel.png create mode 100644 app/examples/Games/BeastScroll/bgd2_montagnes.png create mode 100644 app/examples/Games/BeastScroll/bgd3_sol1.png create mode 100644 app/examples/Games/BeastScroll/bgd4_sol2.png create mode 100644 app/examples/Games/BeastScroll/bgd5_sol3.png create mode 100644 app/examples/Games/BeastScroll/fireworks.png create mode 100644 app/examples/Games/BeastScroll/logo.png create mode 100644 app/examples/Games/BeastScroll/scrolltext.png create mode 100644 app/examples/Games/BeastScroll/sprite_arbre.png create mode 100644 app/examples/Games/BeastScroll/sprite_barriere.png create mode 100644 app/examples/Games/BeastScroll/sprite_nuages1.png create mode 100644 app/examples/Games/BeastScroll/sprite_nuages2.png create mode 100644 app/examples/Games/BeastScroll/sprite_nuages3.png create mode 100644 app/examples/Games/BeastScroll/sprite_nuages4.png create mode 100644 app/examples/Games/Concent/.directory create mode 100644 app/examples/Games/Concent/.icon.png create mode 100644 app/examples/Games/Concent/.icon/16.png create mode 100644 app/examples/Games/Concent/.icon/32.png create mode 100644 app/examples/Games/Concent/.icon/48.png create mode 100644 app/examples/Games/Concent/.lang/ca.po create mode 100644 app/examples/Games/Concent/.lang/cs.po create mode 100644 app/examples/Games/Concent/.lang/de.po create mode 100644 app/examples/Games/Concent/.lang/en.po create mode 100644 app/examples/Games/Concent/.lang/es.po create mode 100644 app/examples/Games/Concent/.lang/fr.po create mode 100644 app/examples/Games/Concent/.lang/ru.po create mode 100644 app/examples/Games/Concent/.project create mode 100644 app/examples/Games/Concent/.src/fotos.class create mode 100644 app/examples/Games/Concent/.src/fotos.form create mode 100644 app/examples/Games/Concent/.src/frmAcerca.class create mode 100644 app/examples/Games/Concent/.src/frmAcerca.form create mode 100644 app/examples/Games/Concent/.src/frmInstrucciones.class create mode 100644 app/examples/Games/Concent/.src/frmInstrucciones.form create mode 100644 app/examples/Games/Concent/.src/funciones.module create mode 100644 app/examples/Games/Concent/.src/principal.class create mode 100644 app/examples/Games/Concent/.src/principal.form create mode 100644 app/examples/Games/Concent/Blockhit.wav create mode 100644 app/examples/Games/Concent/CHANGELOG create mode 100644 app/examples/Games/Concent/Missed.wav create mode 100644 app/examples/Games/Concent/Newlevel.wav create mode 100644 app/examples/Games/Concent/Paddle.wav create mode 100644 app/examples/Games/Concent/Setup.wav create mode 100644 app/examples/Games/Concent/Wallhit.wav create mode 100644 app/examples/Games/Concent/applause.wav create mode 100644 app/examples/Games/Concent/imagenes/an1.gif create mode 100644 app/examples/Games/Concent/imagenes/an10.gif create mode 100644 app/examples/Games/Concent/imagenes/an11.gif create mode 100644 app/examples/Games/Concent/imagenes/an12.gif create mode 100644 app/examples/Games/Concent/imagenes/an13.gif create mode 100644 app/examples/Games/Concent/imagenes/an14.gif create mode 100644 app/examples/Games/Concent/imagenes/an15.gif create mode 100644 app/examples/Games/Concent/imagenes/an16.gif create mode 100644 app/examples/Games/Concent/imagenes/an17.gif create mode 100644 app/examples/Games/Concent/imagenes/an18.gif create mode 100644 app/examples/Games/Concent/imagenes/an19.gif create mode 100644 app/examples/Games/Concent/imagenes/an2.gif create mode 100644 app/examples/Games/Concent/imagenes/an20.gif create mode 100644 app/examples/Games/Concent/imagenes/an21.gif create mode 100644 app/examples/Games/Concent/imagenes/an22.gif create mode 100644 app/examples/Games/Concent/imagenes/an23.gif create mode 100644 app/examples/Games/Concent/imagenes/an24.gif create mode 100644 app/examples/Games/Concent/imagenes/an25.gif create mode 100644 app/examples/Games/Concent/imagenes/an26.gif create mode 100644 app/examples/Games/Concent/imagenes/an27.gif create mode 100644 app/examples/Games/Concent/imagenes/an28.gif create mode 100644 app/examples/Games/Concent/imagenes/an29.gif create mode 100644 app/examples/Games/Concent/imagenes/an3.gif create mode 100644 app/examples/Games/Concent/imagenes/an30.gif create mode 100644 app/examples/Games/Concent/imagenes/an31.gif create mode 100644 app/examples/Games/Concent/imagenes/an32.gif create mode 100644 app/examples/Games/Concent/imagenes/an33.gif create mode 100644 app/examples/Games/Concent/imagenes/an34.gif create mode 100644 app/examples/Games/Concent/imagenes/an35.gif create mode 100644 app/examples/Games/Concent/imagenes/an36.gif create mode 100644 app/examples/Games/Concent/imagenes/an37.gif create mode 100644 app/examples/Games/Concent/imagenes/an38.gif create mode 100644 app/examples/Games/Concent/imagenes/an39.gif create mode 100644 app/examples/Games/Concent/imagenes/an4.gif create mode 100644 app/examples/Games/Concent/imagenes/an40.gif create mode 100644 app/examples/Games/Concent/imagenes/an5.gif create mode 100644 app/examples/Games/Concent/imagenes/an6.gif create mode 100644 app/examples/Games/Concent/imagenes/an7.gif create mode 100644 app/examples/Games/Concent/imagenes/an8.gif create mode 100644 app/examples/Games/Concent/imagenes/an9.gif create mode 100644 app/examples/Games/Concent/imagenes/colombia.gif create mode 100644 app/examples/Games/Concent/imagenes/inter.gif create mode 100644 app/examples/Games/Concent/imagenes/inter.jpg create mode 100644 app/examples/Games/Concent/imagenes/logo.gif create mode 100644 app/examples/Games/Concent/imagenes/logo.png create mode 100644 app/examples/Games/Concent/imagenes/ok.gif create mode 100644 app/examples/Games/Concent/imagenes/tierra.gif create mode 100644 app/examples/Games/Concent/imagenes/tierra3.jpg create mode 100644 app/examples/Games/Concent/move.wav create mode 100644 app/examples/Games/Concent/shuffle.wav create mode 100644 app/examples/Games/DeepSpace/.directory create mode 100644 app/examples/Games/DeepSpace/.icon.png create mode 100644 app/examples/Games/DeepSpace/.lang/ca.po create mode 100644 app/examples/Games/DeepSpace/.lang/cs.po create mode 100644 app/examples/Games/DeepSpace/.lang/de.po create mode 100644 app/examples/Games/DeepSpace/.lang/es.po create mode 100644 app/examples/Games/DeepSpace/.lang/ru.po create mode 100644 app/examples/Games/DeepSpace/.project create mode 100644 app/examples/Games/DeepSpace/.src/CBullet.class create mode 100644 app/examples/Games/DeepSpace/.src/CObject.class create mode 100644 app/examples/Games/DeepSpace/.src/FAbout.class create mode 100644 app/examples/Games/DeepSpace/.src/FAbout.form create mode 100644 app/examples/Games/DeepSpace/.src/FMain.class create mode 100644 app/examples/Games/DeepSpace/.src/FMain.form create mode 100644 app/examples/Games/DeepSpace/.src/MMain.module create mode 100644 app/examples/Games/DeepSpace/.src/MMath.module create mode 100644 app/examples/Games/DeepSpace/doc/.html_files/eg3.gif create mode 100644 app/examples/Games/DeepSpace/doc/.html_files/eg3b.gif create mode 100644 app/examples/Games/DeepSpace/doc/coordinates.html create mode 100644 app/examples/Games/DeepSpace/doc/howto.txt create mode 100644 app/examples/Games/DeepSpace/doc/todo.txt create mode 100644 app/examples/Games/DeepSpace/images/deepspace.png create mode 100644 app/examples/Games/DeepSpace/object.data/kite.2do create mode 100644 app/examples/Games/DeepSpace/object.data/main.lst create mode 100644 app/examples/Games/DeepSpace/object.data/ship.2do create mode 100644 app/examples/Games/DeepSpace/object.data/triangle.2do create mode 100644 app/examples/Games/DeepSpace/object.data/x-wing.2do create mode 100644 app/examples/Games/GNUBoxWorld/.directory create mode 100644 app/examples/Games/GNUBoxWorld/.hidden/screenshots/2014-12-14.png create mode 100644 app/examples/Games/GNUBoxWorld/.icon.png create mode 100644 app/examples/Games/GNUBoxWorld/.lang/ca.po create mode 100644 app/examples/Games/GNUBoxWorld/.lang/cs.po create mode 100644 app/examples/Games/GNUBoxWorld/.lang/de.po create mode 100644 app/examples/Games/GNUBoxWorld/.lang/es_AR.po create mode 100644 app/examples/Games/GNUBoxWorld/.lang/ru.po create mode 100644 app/examples/Games/GNUBoxWorld/.project create mode 100644 app/examples/Games/GNUBoxWorld/.src/Cell.class create mode 100644 app/examples/Games/GNUBoxWorld/.src/FMain.class create mode 100644 app/examples/Games/GNUBoxWorld/.src/FMain.form create mode 100644 app/examples/Games/GNUBoxWorld/.src/FrmAbout.class create mode 100644 app/examples/Games/GNUBoxWorld/.src/FrmAbout.form create mode 100644 app/examples/Games/GNUBoxWorld/.src/GameBoard.class create mode 100644 app/examples/Games/GNUBoxWorld/License create mode 100644 app/examples/Games/GNUBoxWorld/abajo.png create mode 100644 app/examples/Games/GNUBoxWorld/arriba.png create mode 100644 app/examples/Games/GNUBoxWorld/derecha.png create mode 100644 app/examples/Games/GNUBoxWorld/destino.png create mode 100644 app/examples/Games/GNUBoxWorld/ganador.png create mode 100644 app/examples/Games/GNUBoxWorld/icon.png create mode 100644 app/examples/Games/GNUBoxWorld/izquierda.png create mode 100644 app/examples/Games/GNUBoxWorld/logo.png create mode 100644 app/examples/Games/GNUBoxWorld/movible.png create mode 100644 app/examples/Games/GNUBoxWorld/movibleendestino.png create mode 100644 app/examples/Games/GNUBoxWorld/obstaculo-l.png create mode 100644 app/examples/Games/GNUBoxWorld/obstaculo-lr.png create mode 100644 app/examples/Games/GNUBoxWorld/obstaculo-r.png create mode 100644 app/examples/Games/GNUBoxWorld/obstaculo.png create mode 100644 app/examples/Games/GNUBoxWorld/piso.png create mode 100644 app/examples/Games/GameOfLife/.debug create mode 100644 app/examples/Games/GameOfLife/.directory create mode 100644 app/examples/Games/GameOfLife/.icon.png create mode 100644 app/examples/Games/GameOfLife/.lang/ca.po create mode 100644 app/examples/Games/GameOfLife/.lang/cs.po create mode 100644 app/examples/Games/GameOfLife/.lang/de.po create mode 100644 app/examples/Games/GameOfLife/.lang/ru.po create mode 100644 app/examples/Games/GameOfLife/.project create mode 100644 app/examples/Games/GameOfLife/.src/CGameField.class create mode 100644 app/examples/Games/GameOfLife/.src/FMain.class create mode 100644 app/examples/Games/GameOfLife/.src/FMain.form create mode 100644 app/examples/Games/GameOfLife/glob2-icon-48x48.png create mode 100644 app/examples/Games/Invaders/.directory create mode 100644 app/examples/Games/Invaders/.icon.png create mode 100644 app/examples/Games/Invaders/.project create mode 100644 app/examples/Games/Invaders/.src/Enemies.class create mode 100644 app/examples/Games/Invaders/.src/Enemy.class create mode 100644 app/examples/Games/Invaders/.src/MMain.module create mode 100644 app/examples/Games/Invaders/.src/Missile.class create mode 100644 app/examples/Games/Invaders/.src/Missiles.class create mode 100644 app/examples/Games/Invaders/invaders.png create mode 100644 app/examples/Games/MineSweeper/.directory create mode 100644 app/examples/Games/MineSweeper/.hidden/screenshots/2014-12-14.png create mode 100644 app/examples/Games/MineSweeper/.icon.png create mode 100644 app/examples/Games/MineSweeper/.lang/cs.po create mode 100644 app/examples/Games/MineSweeper/.lang/ja.po create mode 100644 app/examples/Games/MineSweeper/.lang/ru.po create mode 100644 app/examples/Games/MineSweeper/.lang/zh.po create mode 100644 app/examples/Games/MineSweeper/.lang/zh_TW.po create mode 100644 app/examples/Games/MineSweeper/.project create mode 100644 app/examples/Games/MineSweeper/.src/FMain.class create mode 100644 app/examples/Games/MineSweeper/.src/FMain.form create mode 100644 app/examples/Games/MineSweeper/.src/FSettings.class create mode 100644 app/examples/Games/MineSweeper/.src/FSettings.form create mode 100644 app/examples/Games/MineSweeper/.src/MineSweeperGame.class create mode 100644 app/examples/Games/MineSweeper/image/bigflag.png create mode 100644 app/examples/Games/MineSweeper/image/cover.png create mode 100644 app/examples/Games/MineSweeper/image/coveron.png create mode 100644 app/examples/Games/MineSweeper/image/empty.png create mode 100644 app/examples/Games/MineSweeper/image/expr_lose.png create mode 100644 app/examples/Games/MineSweeper/image/expr_normal.png create mode 100644 app/examples/Games/MineSweeper/image/expr_o.png create mode 100644 app/examples/Games/MineSweeper/image/expr_win.png create mode 100644 app/examples/Games/MineSweeper/image/false.png create mode 100644 app/examples/Games/MineSweeper/image/flag.png create mode 100644 app/examples/Games/MineSweeper/image/mine.png create mode 100644 app/examples/Games/MineSweeper/image/number_1.png create mode 100644 app/examples/Games/MineSweeper/image/number_2.png create mode 100644 app/examples/Games/MineSweeper/image/number_3.png create mode 100644 app/examples/Games/MineSweeper/image/number_4.png create mode 100644 app/examples/Games/MineSweeper/image/number_5.png create mode 100644 app/examples/Games/MineSweeper/image/number_6.png create mode 100644 app/examples/Games/MineSweeper/image/number_7.png create mode 100644 app/examples/Games/MineSweeper/image/number_8.png create mode 100644 app/examples/Games/Pong/.directory create mode 100644 app/examples/Games/Pong/.icon.png create mode 100644 app/examples/Games/Pong/.project create mode 100644 app/examples/Games/Pong/.src/Ball.class create mode 100644 app/examples/Games/Pong/.src/MMain.module create mode 100644 app/examples/Games/Pong/.src/NPC.class create mode 100644 app/examples/Games/Pong/.src/Paddle.class create mode 100644 app/examples/Games/Pong/SPEED create mode 100644 app/examples/Games/Pong/pong.png create mode 100644 app/examples/Games/Puzzle1To8/.directory create mode 100644 app/examples/Games/Puzzle1To8/.icon.png create mode 100644 app/examples/Games/Puzzle1To8/.lang/ca.po create mode 100644 app/examples/Games/Puzzle1To8/.lang/cs.po create mode 100644 app/examples/Games/Puzzle1To8/.lang/de.po create mode 100644 app/examples/Games/Puzzle1To8/.lang/es_AR.po create mode 100644 app/examples/Games/Puzzle1To8/.lang/fr.po create mode 100644 app/examples/Games/Puzzle1To8/.lang/ru.po create mode 100644 app/examples/Games/Puzzle1To8/.project create mode 100644 app/examples/Games/Puzzle1To8/.src/Casillero.class create mode 100644 app/examples/Games/Puzzle1To8/.src/Esquema.class create mode 100644 app/examples/Games/Puzzle1To8/.src/FMain.class create mode 100644 app/examples/Games/Puzzle1To8/.src/FMain.form create mode 100644 app/examples/Games/Puzzle1To8/.src/FrmAbout.class create mode 100644 app/examples/Games/Puzzle1To8/.src/FrmAbout.form create mode 100644 app/examples/Games/Puzzle1To8/.src/FrmAyuda.class create mode 100644 app/examples/Games/Puzzle1To8/.src/FrmAyuda.form create mode 100644 app/examples/Games/Puzzle1To8/Licence create mode 100644 app/examples/Games/Puzzle1To8/ejemplo1.png create mode 100644 app/examples/Games/Puzzle1To8/ejemplo2.png create mode 100644 app/examples/Games/Puzzle1To8/logo.png create mode 100644 app/examples/Games/RobotFindsKitten/.directory create mode 100644 app/examples/Games/RobotFindsKitten/.icon.png create mode 100644 app/examples/Games/RobotFindsKitten/.lang/ca.po create mode 100644 app/examples/Games/RobotFindsKitten/.lang/cs.po create mode 100644 app/examples/Games/RobotFindsKitten/.lang/de.po create mode 100644 app/examples/Games/RobotFindsKitten/.lang/es.po create mode 100644 app/examples/Games/RobotFindsKitten/.lang/ru.po create mode 100644 app/examples/Games/RobotFindsKitten/.project create mode 100644 app/examples/Games/RobotFindsKitten/.src/Frfk.class create mode 100644 app/examples/Games/RobotFindsKitten/.src/Frfk.form create mode 100644 app/examples/Games/RobotFindsKitten/COPYING create mode 100644 app/examples/Games/RobotFindsKitten/heart.png create mode 100644 app/examples/Games/RobotFindsKitten/nkis.txt create mode 100644 app/examples/Games/RobotFindsKitten/nkis_ru.txt create mode 100644 app/examples/Games/RobotFindsKitten/readme.txt create mode 100644 app/examples/Games/Snake/.directory create mode 100644 app/examples/Games/Snake/.icon.png create mode 100644 app/examples/Games/Snake/.lang/ca.po create mode 100644 app/examples/Games/Snake/.lang/cs.po create mode 100644 app/examples/Games/Snake/.lang/de.po create mode 100644 app/examples/Games/Snake/.lang/ru.po create mode 100644 app/examples/Games/Snake/.project create mode 100644 app/examples/Games/Snake/.src/FrmMain.class create mode 100644 app/examples/Games/Snake/.src/FrmMain.form create mode 100644 app/examples/Games/Snake/apple.png create mode 100644 app/examples/Games/Snake/body.png create mode 100644 app/examples/Games/Snake/dead.wav create mode 100644 app/examples/Games/Snake/eat.wav create mode 100644 app/examples/Games/Snake/head.png create mode 100644 app/examples/Games/Snake/start.wav create mode 100644 app/examples/Games/Solitaire/.directory create mode 100644 app/examples/Games/Solitaire/.icon.png create mode 100644 app/examples/Games/Solitaire/.lang/ca.po create mode 100644 app/examples/Games/Solitaire/.lang/cs.po create mode 100644 app/examples/Games/Solitaire/.lang/de.po create mode 100644 app/examples/Games/Solitaire/.lang/es.po create mode 100644 app/examples/Games/Solitaire/.lang/ru.po create mode 100644 app/examples/Games/Solitaire/.project create mode 100644 app/examples/Games/Solitaire/.src/CBoardDesign.class create mode 100644 app/examples/Games/Solitaire/.src/CMove.class create mode 100644 app/examples/Games/Solitaire/.src/FBoardSelect.class create mode 100644 app/examples/Games/Solitaire/.src/FBoardSelect.form create mode 100644 app/examples/Games/Solitaire/.src/FGameArea.class create mode 100644 app/examples/Games/Solitaire/.src/FGameArea.form create mode 100644 app/examples/Games/Solitaire/.src/Global.class create mode 100644 app/examples/Games/Solitaire/.src/MBoards.module create mode 100644 app/examples/Games/Solitaire/ball.png create mode 100644 app/examples/Games/Solitaire/new.png create mode 100644 app/examples/Games/Solitaire/quit.png create mode 100644 app/examples/Games/Solitaire/redo.png create mode 100644 app/examples/Games/Solitaire/undo.png create mode 100644 app/examples/Games/StarField/.directory create mode 100644 app/examples/Games/StarField/.icon.png create mode 100644 app/examples/Games/StarField/.project create mode 100644 app/examples/Games/StarField/.src/MMain.module create mode 100644 app/examples/Games/StarField/enterprise.png create mode 100644 app/examples/Games/StarField/logo.png create mode 100644 app/examples/Image/ImageViewer/.directory create mode 100644 app/examples/Image/ImageViewer/.icon.png create mode 100644 app/examples/Image/ImageViewer/.lang/ca.po create mode 100644 app/examples/Image/ImageViewer/.lang/cs.po create mode 100644 app/examples/Image/ImageViewer/.lang/de.po create mode 100644 app/examples/Image/ImageViewer/.lang/es.po create mode 100644 app/examples/Image/ImageViewer/.lang/nl.po create mode 100644 app/examples/Image/ImageViewer/.lang/ru.po create mode 100644 app/examples/Image/ImageViewer/.project create mode 100644 app/examples/Image/ImageViewer/.src/FViewer.class create mode 100644 app/examples/Image/ImageViewer/.src/FViewer.form create mode 100644 app/examples/Image/ImageViewer/image.png create mode 100644 app/examples/Image/ImageViewer/test.png create mode 100644 app/examples/Image/Lighttable/.directory create mode 100644 app/examples/Image/Lighttable/.icon.png create mode 100644 app/examples/Image/Lighttable/.lang/ca.po create mode 100644 app/examples/Image/Lighttable/.lang/cs.po create mode 100644 app/examples/Image/Lighttable/.lang/de.po create mode 100644 app/examples/Image/Lighttable/.lang/en.po create mode 100644 app/examples/Image/Lighttable/.lang/nl.po create mode 100644 app/examples/Image/Lighttable/.lang/ru.po create mode 100644 app/examples/Image/Lighttable/.project create mode 100644 app/examples/Image/Lighttable/.src/FHelp.class create mode 100644 app/examples/Image/Lighttable/.src/FHelp.form create mode 100644 app/examples/Image/Lighttable/.src/FInfo.class create mode 100644 app/examples/Image/Lighttable/.src/FInfo.form create mode 100644 app/examples/Image/Lighttable/.src/FMain.class create mode 100644 app/examples/Image/Lighttable/.src/FMain.form create mode 100644 app/examples/Image/Lighttable/.src/FRename.class create mode 100644 app/examples/Image/Lighttable/.src/FRename.form create mode 100644 app/examples/Image/Lighttable/.src/FRenameAll.class create mode 100644 app/examples/Image/Lighttable/.src/FRenameAll.form create mode 100644 app/examples/Image/Lighttable/.src/FRenameAllWarning.class create mode 100644 app/examples/Image/Lighttable/.src/FRenameAllWarning.form create mode 100644 app/examples/Image/Lighttable/.src/FSlideshow.class create mode 100644 app/examples/Image/Lighttable/.src/FSlideshow.form create mode 100644 app/examples/Image/Lighttable/.src/FStart.class create mode 100644 app/examples/Image/Lighttable/.src/FStart.form create mode 100644 app/examples/Image/Lighttable/.src/FTime.class create mode 100644 app/examples/Image/Lighttable/.src/FTime.form create mode 100644 app/examples/Image/Lighttable/.src/MMain.module create mode 100644 app/examples/Image/Lighttable/CHANGELOG create mode 100644 app/examples/Image/Lighttable/FStart.class create mode 100644 app/examples/Image/Lighttable/FStart.form create mode 100644 app/examples/Image/Lighttable/Help_ca.html create mode 100644 app/examples/Image/Lighttable/Help_de.html create mode 100644 app/examples/Image/Lighttable/Help_en.html create mode 100644 app/examples/Image/Lighttable/Help_ru.html create mode 100644 app/examples/Image/Lighttable/LTicon.png create mode 100644 app/examples/Image/Lighttable/Liesmich.txt create mode 100644 app/examples/Image/Lighttable/Readme.txt create mode 100644 app/examples/Image/Lighttable/close.png create mode 100644 app/examples/Image/Lighttable/hand1.png create mode 100644 app/examples/Image/Lighttable/help-contents.png create mode 100644 app/examples/Image/Lighttable/lighttable.png create mode 100644 app/examples/Image/Lighttable/move.png create mode 100644 app/examples/Image/Lighttable/zoom-in.png create mode 100644 app/examples/Image/PhotoTouch/.directory create mode 100644 app/examples/Image/PhotoTouch/.hidden/screenshots/phototouch.jpg create mode 100644 app/examples/Image/PhotoTouch/.icon.png create mode 100644 app/examples/Image/PhotoTouch/.lang/fr.po create mode 100644 app/examples/Image/PhotoTouch/.lang/nl.po create mode 100644 app/examples/Image/PhotoTouch/.lang/ru.po create mode 100644 app/examples/Image/PhotoTouch/.project create mode 100644 app/examples/Image/PhotoTouch/.src/CAnimation.class create mode 100644 app/examples/Image/PhotoTouch/.src/CButton.class create mode 100644 app/examples/Image/PhotoTouch/.src/FBrightness.class create mode 100644 app/examples/Image/PhotoTouch/.src/FBrightness.form create mode 100644 app/examples/Image/PhotoTouch/.src/FMain.class create mode 100644 app/examples/Image/PhotoTouch/.src/FMain.form create mode 100644 app/examples/Image/PhotoTouch/.src/FResize.class create mode 100644 app/examples/Image/PhotoTouch/.src/FResize.form create mode 100644 app/examples/Image/PhotoTouch/.src/FScissors.class create mode 100644 app/examples/Image/PhotoTouch/.src/FScissors.form create mode 100644 app/examples/Image/PhotoTouch/balance.png create mode 100644 app/examples/Image/PhotoTouch/blur.png create mode 100644 app/examples/Image/PhotoTouch/brightness.png create mode 100644 app/examples/Image/PhotoTouch/contrast.png create mode 100644 app/examples/Image/PhotoTouch/delete.png create mode 100644 app/examples/Image/PhotoTouch/despeckle.png create mode 100644 app/examples/Image/PhotoTouch/film.png create mode 100644 app/examples/Image/PhotoTouch/gamma.png create mode 100644 app/examples/Image/PhotoTouch/hflip.png create mode 100644 app/examples/Image/PhotoTouch/icon.png create mode 100644 app/examples/Image/PhotoTouch/invert.png create mode 100644 app/examples/Image/PhotoTouch/magic.png create mode 100644 app/examples/Image/PhotoTouch/next.png create mode 100644 app/examples/Image/PhotoTouch/normalize.png create mode 100644 app/examples/Image/PhotoTouch/oil.png create mode 100644 app/examples/Image/PhotoTouch/ok.png create mode 100644 app/examples/Image/PhotoTouch/photo.png create mode 100644 app/examples/Image/PhotoTouch/previous.png create mode 100644 app/examples/Image/PhotoTouch/quit.png create mode 100644 app/examples/Image/PhotoTouch/redo.png create mode 100644 app/examples/Image/PhotoTouch/resize.png create mode 100644 app/examples/Image/PhotoTouch/rotate-left.png create mode 100644 app/examples/Image/PhotoTouch/rotate-right.png create mode 100644 app/examples/Image/PhotoTouch/save-all.png create mode 100644 app/examples/Image/PhotoTouch/save.png create mode 100644 app/examples/Image/PhotoTouch/scissors.png create mode 100644 app/examples/Image/PhotoTouch/sharpen.png create mode 100644 app/examples/Image/PhotoTouch/undo.png create mode 100644 app/examples/Image/PhotoTouch/usb.png create mode 100644 app/examples/Image/PhotoTouch/vflip.png create mode 100644 app/examples/Image/PhotoTouch/zoom-fit.png create mode 100644 app/examples/Image/PhotoTouch/zoom-in.png create mode 100644 app/examples/Image/PhotoTouch/zoom-original.png create mode 100644 app/examples/Image/PhotoTouch/zoom-out.png create mode 100644 app/examples/Misc/Console/.directory create mode 100644 app/examples/Misc/Console/.icon.png create mode 100644 app/examples/Misc/Console/.lang/fr.po create mode 100644 app/examples/Misc/Console/.lang/ru.po create mode 100644 app/examples/Misc/Console/.project create mode 100644 app/examples/Misc/Console/.src/FConsole.class create mode 100644 app/examples/Misc/Console/.src/FConsole.form create mode 100644 app/examples/Misc/Console/terminal.png create mode 100644 app/examples/Misc/DBusExplorer/.directory create mode 100644 app/examples/Misc/DBusExplorer/.hidden/screenshots/2014-12-14.png create mode 100644 app/examples/Misc/DBusExplorer/.icon.png create mode 100644 app/examples/Misc/DBusExplorer/.lang/ru.po create mode 100644 app/examples/Misc/DBusExplorer/.project create mode 100644 app/examples/Misc/DBusExplorer/.src/FVersiongbXML.class create mode 100644 app/examples/Misc/DBusExplorer/.src/FVersiongbXML.form create mode 100644 app/examples/Misc/DBusExplorer/dbus22.png create mode 100644 app/examples/Misc/DBusExplorer/dbus64.png create mode 100644 app/examples/Misc/DBusExplorer/method.png create mode 100644 app/examples/Misc/DBusExplorer/property.png create mode 100644 app/examples/Misc/DBusExplorer/signal.png create mode 100644 app/examples/Misc/Evaluator/.directory create mode 100644 app/examples/Misc/Evaluator/.icon.png create mode 100644 app/examples/Misc/Evaluator/.lang/ca.po create mode 100644 app/examples/Misc/Evaluator/.lang/cs.po create mode 100644 app/examples/Misc/Evaluator/.lang/de.po create mode 100644 app/examples/Misc/Evaluator/.lang/es.po create mode 100644 app/examples/Misc/Evaluator/.lang/ru.po create mode 100644 app/examples/Misc/Evaluator/.project create mode 100644 app/examples/Misc/Evaluator/.src/FEval.class create mode 100644 app/examples/Misc/Evaluator/.src/FEval.form create mode 100644 app/examples/Misc/Evaluator/calculator.png create mode 100644 app/examples/Misc/Explorer/.directory create mode 100644 app/examples/Misc/Explorer/.icon.png create mode 100644 app/examples/Misc/Explorer/.lang/ca.po create mode 100644 app/examples/Misc/Explorer/.lang/cs.po create mode 100644 app/examples/Misc/Explorer/.lang/de.po create mode 100644 app/examples/Misc/Explorer/.lang/es.po create mode 100644 app/examples/Misc/Explorer/.lang/ru.po create mode 100644 app/examples/Misc/Explorer/.project create mode 100644 app/examples/Misc/Explorer/.src/FExplorer.class create mode 100644 app/examples/Misc/Explorer/.src/FExplorer.form create mode 100644 app/examples/Misc/Explorer/folder.png create mode 100644 app/examples/Misc/Notepad/.directory create mode 100644 app/examples/Misc/Notepad/.icon.png create mode 100644 app/examples/Misc/Notepad/.lang/ca.po create mode 100644 app/examples/Misc/Notepad/.lang/cs.po create mode 100644 app/examples/Misc/Notepad/.lang/de.po create mode 100644 app/examples/Misc/Notepad/.lang/es.po create mode 100644 app/examples/Misc/Notepad/.lang/ru.po create mode 100644 app/examples/Misc/Notepad/.project create mode 100644 app/examples/Misc/Notepad/.src/FAbout.class create mode 100644 app/examples/Misc/Notepad/.src/FAbout.form create mode 100644 app/examples/Misc/Notepad/.src/FNotepad.class create mode 100644 app/examples/Misc/Notepad/.src/FNotepad.form create mode 100644 app/examples/Misc/Notepad/notepad.png create mode 100644 app/examples/Misc/PDFViewer/.directory create mode 100644 app/examples/Misc/PDFViewer/.icon.png create mode 100644 app/examples/Misc/PDFViewer/.lang/ca.po create mode 100644 app/examples/Misc/PDFViewer/.lang/cs.po create mode 100644 app/examples/Misc/PDFViewer/.lang/de.po create mode 100644 app/examples/Misc/PDFViewer/.lang/es.po create mode 100644 app/examples/Misc/PDFViewer/.lang/ru.po create mode 100644 app/examples/Misc/PDFViewer/.project create mode 100644 app/examples/Misc/PDFViewer/.src/FMain.class create mode 100644 app/examples/Misc/PDFViewer/.src/FMain.form create mode 100644 app/examples/Misc/PDFViewer/.src/Fabout.class create mode 100644 app/examples/Misc/PDFViewer/.src/Fabout.form create mode 100644 app/examples/Misc/PDFViewer/pdf.png create mode 100644 app/examples/Misc/SystemTray/.directory create mode 100644 app/examples/Misc/SystemTray/.icon.png create mode 100644 app/examples/Misc/SystemTray/.lang/ru.po create mode 100644 app/examples/Misc/SystemTray/.project create mode 100644 app/examples/Misc/SystemTray/.src/FMain.class create mode 100644 app/examples/Misc/SystemTray/.src/FMain.form create mode 100644 app/examples/Misc/SystemTray/bg.png create mode 100644 app/examples/Misc/SystemTray/icon.png create mode 100644 app/examples/Misc/WatchGambasDirectory/.directory create mode 100644 app/examples/Misc/WatchGambasDirectory/.icon.png create mode 100644 app/examples/Misc/WatchGambasDirectory/.lang/ru.po create mode 100644 app/examples/Misc/WatchGambasDirectory/.project create mode 100644 app/examples/Misc/WatchGambasDirectory/.src/MMain.module create mode 100644 app/examples/Misc/WatchGambasDirectory/watch.svg create mode 100644 app/examples/Multimedia/CDPlayer/.directory create mode 100644 app/examples/Multimedia/CDPlayer/.icon.png create mode 100644 app/examples/Multimedia/CDPlayer/.lang/ca.po create mode 100644 app/examples/Multimedia/CDPlayer/.lang/cs.po create mode 100644 app/examples/Multimedia/CDPlayer/.lang/es.po create mode 100644 app/examples/Multimedia/CDPlayer/.lang/ru.po create mode 100644 app/examples/Multimedia/CDPlayer/.project create mode 100644 app/examples/Multimedia/CDPlayer/.src/Fcdplayer.class create mode 100644 app/examples/Multimedia/CDPlayer/.src/Fcdplayer.form create mode 100644 app/examples/Multimedia/CDPlayer/cdrom.png create mode 100644 app/examples/Multimedia/MediaPlayer/.directory create mode 100644 app/examples/Multimedia/MediaPlayer/.hidden/screenshots/MediaPlayer.jpg create mode 100644 app/examples/Multimedia/MediaPlayer/.icon.png create mode 100644 app/examples/Multimedia/MediaPlayer/.lang/fr.po create mode 100644 app/examples/Multimedia/MediaPlayer/.lang/ru.po create mode 100644 app/examples/Multimedia/MediaPlayer/.project create mode 100644 app/examples/Multimedia/MediaPlayer/.src/CAnimation.class create mode 100644 app/examples/Multimedia/MediaPlayer/.src/CButton.class create mode 100644 app/examples/Multimedia/MediaPlayer/.src/FControl.class create mode 100644 app/examples/Multimedia/MediaPlayer/.src/FControl.form create mode 100644 app/examples/Multimedia/MediaPlayer/.src/FMain.class create mode 100644 app/examples/Multimedia/MediaPlayer/.src/FMain.form create mode 100644 app/examples/Multimedia/MediaPlayer/.src/FTags.class create mode 100644 app/examples/Multimedia/MediaPlayer/.src/FTags.form create mode 100644 app/examples/Multimedia/MediaPlayer/.src/MTest.module create mode 100644 app/examples/Multimedia/MediaPlayer/brightness.png create mode 100644 app/examples/Multimedia/MediaPlayer/config.png create mode 100644 app/examples/Multimedia/MediaPlayer/contrast.png create mode 100644 app/examples/Multimedia/MediaPlayer/eject.png create mode 100644 app/examples/Multimedia/MediaPlayer/film.png create mode 100644 app/examples/Multimedia/MediaPlayer/fullscreen.png create mode 100644 app/examples/Multimedia/MediaPlayer/gamma.png create mode 100644 app/examples/Multimedia/MediaPlayer/icon.png create mode 100644 app/examples/Multimedia/MediaPlayer/info.png create mode 100644 app/examples/Multimedia/MediaPlayer/mute.png create mode 100644 app/examples/Multimedia/MediaPlayer/pause.png create mode 100644 app/examples/Multimedia/MediaPlayer/play.png create mode 100644 app/examples/Multimedia/MediaPlayer/quit.png create mode 100644 app/examples/Multimedia/MediaPlayer/screenshot.png create mode 100644 app/examples/Multimedia/MediaPlayer/seek-backward.png create mode 100644 app/examples/Multimedia/MediaPlayer/seek-forward.png create mode 100644 app/examples/Multimedia/MediaPlayer/skip-backward.png create mode 100644 app/examples/Multimedia/MediaPlayer/skip-forward.png create mode 100644 app/examples/Multimedia/MediaPlayer/stop.png create mode 100644 app/examples/Multimedia/MediaPlayer/subtitle.png create mode 100644 app/examples/Multimedia/MediaPlayer/undo.png create mode 100644 app/examples/Multimedia/MediaPlayer/video.png create mode 100644 app/examples/Multimedia/MediaPlayer/visualisation.png create mode 100644 app/examples/Multimedia/MediaPlayer/volume-0.png create mode 100644 app/examples/Multimedia/MediaPlayer/volume-1.png create mode 100644 app/examples/Multimedia/MediaPlayer/volume-2.png create mode 100644 app/examples/Multimedia/MediaPlayer/volume-3.png create mode 100644 app/examples/Multimedia/MediaPlayer/volume.png create mode 100644 app/examples/Multimedia/MediaPlayer/zoom-in.png create mode 100644 app/examples/Multimedia/MoviePlayer/.directory create mode 100644 app/examples/Multimedia/MoviePlayer/.icon.png create mode 100644 app/examples/Multimedia/MoviePlayer/.lang/ca.po create mode 100644 app/examples/Multimedia/MoviePlayer/.lang/cs.po create mode 100644 app/examples/Multimedia/MoviePlayer/.lang/es.po create mode 100644 app/examples/Multimedia/MoviePlayer/.lang/ru.po create mode 100644 app/examples/Multimedia/MoviePlayer/.project create mode 100644 app/examples/Multimedia/MoviePlayer/.src/FMoviePlayer.class create mode 100644 app/examples/Multimedia/MoviePlayer/.src/FMoviePlayer.form create mode 100644 app/examples/Multimedia/MoviePlayer/video.png create mode 100644 app/examples/Multimedia/MusicPlayer/.directory create mode 100644 app/examples/Multimedia/MusicPlayer/.icon.png create mode 100644 app/examples/Multimedia/MusicPlayer/.icon/16.png create mode 100644 app/examples/Multimedia/MusicPlayer/.icon/32.png create mode 100644 app/examples/Multimedia/MusicPlayer/.icon/48.png create mode 100644 app/examples/Multimedia/MusicPlayer/.lang/ca.po create mode 100644 app/examples/Multimedia/MusicPlayer/.lang/cs.po create mode 100644 app/examples/Multimedia/MusicPlayer/.lang/es.po create mode 100644 app/examples/Multimedia/MusicPlayer/.lang/fr.po create mode 100644 app/examples/Multimedia/MusicPlayer/.lang/ru.po create mode 100644 app/examples/Multimedia/MusicPlayer/.project create mode 100644 app/examples/Multimedia/MusicPlayer/.src/FSoundPlayer.class create mode 100644 app/examples/Multimedia/MusicPlayer/.src/FSoundPlayer.form create mode 100644 app/examples/Multimedia/MusicPlayer/sound.png create mode 100644 app/examples/Multimedia/MyWebCam/.directory create mode 100644 app/examples/Multimedia/MyWebCam/.icon.png create mode 100644 app/examples/Multimedia/MyWebCam/.lang/ca.po create mode 100644 app/examples/Multimedia/MyWebCam/.lang/cs.po create mode 100644 app/examples/Multimedia/MyWebCam/.lang/es.po create mode 100644 app/examples/Multimedia/MyWebCam/.lang/ru.po create mode 100644 app/examples/Multimedia/MyWebCam/.project create mode 100644 app/examples/Multimedia/MyWebCam/.src/Form1.class create mode 100644 app/examples/Multimedia/MyWebCam/.src/Form1.form create mode 100644 app/examples/Multimedia/MyWebCam/camera.png create mode 100644 app/examples/Multimedia/WaveGenerator/.directory create mode 100644 app/examples/Multimedia/WaveGenerator/.icon.png create mode 100644 app/examples/Multimedia/WaveGenerator/.lang/ru.po create mode 100644 app/examples/Multimedia/WaveGenerator/.project create mode 100644 app/examples/Multimedia/WaveGenerator/.src/FMain.class create mode 100644 app/examples/Multimedia/WaveGenerator/.src/FMain.form create mode 100644 app/examples/Multimedia/WaveGenerator/audio-headphones.png create mode 100644 app/examples/Multimedia/WebCam/.directory create mode 100644 app/examples/Multimedia/WebCam/.icon.png create mode 100644 app/examples/Multimedia/WebCam/.lang/ru.po create mode 100644 app/examples/Multimedia/WebCam/.project create mode 100644 app/examples/Multimedia/WebCam/.src/FDevice.class create mode 100644 app/examples/Multimedia/WebCam/.src/FDevice.form create mode 100644 app/examples/Multimedia/WebCam/.src/FMain.class create mode 100644 app/examples/Multimedia/WebCam/.src/FMain.form create mode 100644 app/examples/Multimedia/WebCam/camera.png create mode 100644 app/examples/Multimedia/WebCam/settings.png create mode 100644 app/examples/Networking/ClientSocket/.directory create mode 100644 app/examples/Networking/ClientSocket/.icon.png create mode 100644 app/examples/Networking/ClientSocket/.lang/ca.po create mode 100644 app/examples/Networking/ClientSocket/.lang/cs.po create mode 100644 app/examples/Networking/ClientSocket/.lang/de.po create mode 100644 app/examples/Networking/ClientSocket/.lang/es.po create mode 100644 app/examples/Networking/ClientSocket/.lang/nl.po create mode 100644 app/examples/Networking/ClientSocket/.lang/ru.po create mode 100644 app/examples/Networking/ClientSocket/.project create mode 100644 app/examples/Networking/ClientSocket/.src/FrmMain.class create mode 100644 app/examples/Networking/ClientSocket/.src/FrmMain.form create mode 100644 app/examples/Networking/ClientSocket/socket.png create mode 100644 app/examples/Networking/DnsClient/.directory create mode 100644 app/examples/Networking/DnsClient/.icon.png create mode 100644 app/examples/Networking/DnsClient/.lang/ca.po create mode 100644 app/examples/Networking/DnsClient/.lang/cs.po create mode 100644 app/examples/Networking/DnsClient/.lang/de.po create mode 100644 app/examples/Networking/DnsClient/.lang/es.po create mode 100644 app/examples/Networking/DnsClient/.lang/nl.po create mode 100644 app/examples/Networking/DnsClient/.lang/ru.po create mode 100644 app/examples/Networking/DnsClient/.project create mode 100644 app/examples/Networking/DnsClient/.src/FMain.class create mode 100644 app/examples/Networking/DnsClient/.src/FMain.form create mode 100644 app/examples/Networking/DnsClient/dnsclient.png create mode 100644 app/examples/Networking/HTTPGet/.directory create mode 100644 app/examples/Networking/HTTPGet/.icon.png create mode 100644 app/examples/Networking/HTTPGet/.lang/ca.po create mode 100644 app/examples/Networking/HTTPGet/.lang/cs.po create mode 100644 app/examples/Networking/HTTPGet/.lang/de.po create mode 100644 app/examples/Networking/HTTPGet/.lang/en_GB.po create mode 100644 app/examples/Networking/HTTPGet/.lang/es.po create mode 100644 app/examples/Networking/HTTPGet/.lang/nl.po create mode 100644 app/examples/Networking/HTTPGet/.lang/ru.po create mode 100644 app/examples/Networking/HTTPGet/.project create mode 100644 app/examples/Networking/HTTPGet/.src/ClsParams.class create mode 100644 app/examples/Networking/HTTPGet/.src/FConfig.class create mode 100644 app/examples/Networking/HTTPGet/.src/FConfig.form create mode 100644 app/examples/Networking/HTTPGet/.src/FHttpGet.class create mode 100644 app/examples/Networking/HTTPGet/.src/FHttpGet.form create mode 100644 app/examples/Networking/HTTPGet/httpclient.png create mode 100644 app/examples/Networking/HTTPPost/.directory create mode 100644 app/examples/Networking/HTTPPost/.icon.png create mode 100644 app/examples/Networking/HTTPPost/.lang/ca.po create mode 100644 app/examples/Networking/HTTPPost/.lang/cs.po create mode 100644 app/examples/Networking/HTTPPost/.lang/de.po create mode 100644 app/examples/Networking/HTTPPost/.lang/es.po create mode 100644 app/examples/Networking/HTTPPost/.lang/nl.po create mode 100644 app/examples/Networking/HTTPPost/.lang/ru.po create mode 100644 app/examples/Networking/HTTPPost/.project create mode 100644 app/examples/Networking/HTTPPost/.src/FHttpPost.class create mode 100644 app/examples/Networking/HTTPPost/.src/FHttpPost.form create mode 100644 app/examples/Networking/HTTPPost/httpclient.png create mode 100644 app/examples/Networking/POPMailbox/.directory create mode 100644 app/examples/Networking/POPMailbox/.icon.png create mode 100644 app/examples/Networking/POPMailbox/.lang/ru.po create mode 100644 app/examples/Networking/POPMailbox/.project create mode 100644 app/examples/Networking/POPMailbox/.src/FMain.class create mode 100644 app/examples/Networking/POPMailbox/.src/FMain.form create mode 100644 app/examples/Networking/POPMailbox/.src/FSettings.class create mode 100644 app/examples/Networking/POPMailbox/.src/FSettings.form create mode 100644 app/examples/Networking/POPMailbox/pop3client.png create mode 100644 app/examples/Networking/SerialPort/.directory create mode 100644 app/examples/Networking/SerialPort/.icon.png create mode 100644 app/examples/Networking/SerialPort/.lang/ru.po create mode 100644 app/examples/Networking/SerialPort/.project create mode 100644 app/examples/Networking/SerialPort/.src/FAbout.class create mode 100644 app/examples/Networking/SerialPort/.src/FAbout.form create mode 100644 app/examples/Networking/SerialPort/.src/FMain.class create mode 100644 app/examples/Networking/SerialPort/.src/FMain.form create mode 100644 app/examples/Networking/SerialPort/.src/Module_Config.module create mode 100644 app/examples/Networking/SerialPort/.src/Module_RS232.module create mode 100644 app/examples/Networking/SerialPort/serialport.png create mode 100644 app/examples/Networking/ServerSocket/.directory create mode 100644 app/examples/Networking/ServerSocket/.icon.png create mode 100644 app/examples/Networking/ServerSocket/.lang/ca.po create mode 100644 app/examples/Networking/ServerSocket/.lang/cs.po create mode 100644 app/examples/Networking/ServerSocket/.lang/es.po create mode 100644 app/examples/Networking/ServerSocket/.lang/nl.po create mode 100644 app/examples/Networking/ServerSocket/.lang/ru.po create mode 100644 app/examples/Networking/ServerSocket/.project create mode 100644 app/examples/Networking/ServerSocket/.src/FrmMain.class create mode 100644 app/examples/Networking/ServerSocket/.src/FrmMain.form create mode 100644 app/examples/Networking/ServerSocket/serversocket.png create mode 100644 app/examples/Networking/UDPServerClient/.directory create mode 100644 app/examples/Networking/UDPServerClient/.icon.png create mode 100644 app/examples/Networking/UDPServerClient/.lang/ca.po create mode 100644 app/examples/Networking/UDPServerClient/.lang/cs.po create mode 100644 app/examples/Networking/UDPServerClient/.lang/es.po create mode 100644 app/examples/Networking/UDPServerClient/.lang/nl.po create mode 100644 app/examples/Networking/UDPServerClient/.lang/ru.po create mode 100644 app/examples/Networking/UDPServerClient/.project create mode 100644 app/examples/Networking/UDPServerClient/.src/FrmClient.class create mode 100644 app/examples/Networking/UDPServerClient/.src/FrmClient.form create mode 100644 app/examples/Networking/UDPServerClient/.src/FrmServer.class create mode 100644 app/examples/Networking/UDPServerClient/.src/FrmServer.form create mode 100644 app/examples/Networking/UDPServerClient/udpsocket.png create mode 100644 app/examples/Networking/WebBrowser/.directory create mode 100644 app/examples/Networking/WebBrowser/.icon.png create mode 100644 app/examples/Networking/WebBrowser/.lang/ca.po create mode 100644 app/examples/Networking/WebBrowser/.lang/cs.po create mode 100644 app/examples/Networking/WebBrowser/.lang/de.po create mode 100644 app/examples/Networking/WebBrowser/.lang/es.po create mode 100644 app/examples/Networking/WebBrowser/.lang/nl.po create mode 100644 app/examples/Networking/WebBrowser/.lang/ru.po create mode 100644 app/examples/Networking/WebBrowser/.project create mode 100644 app/examples/Networking/WebBrowser/.src/FAuth.class create mode 100644 app/examples/Networking/WebBrowser/.src/FAuth.form create mode 100644 app/examples/Networking/WebBrowser/.src/FBrowser.class create mode 100644 app/examples/Networking/WebBrowser/.src/FBrowser.form create mode 100644 app/examples/Networking/WebBrowser/.src/FDownload.class create mode 100644 app/examples/Networking/WebBrowser/.src/FDownload.form create mode 100644 app/examples/Networking/WebBrowser/.src/FDownloadList.class create mode 100644 app/examples/Networking/WebBrowser/.src/FDownloadList.form create mode 100644 app/examples/Networking/WebBrowser/.src/FEditable.class create mode 100644 app/examples/Networking/WebBrowser/.src/FEditable.form create mode 100644 app/examples/Networking/WebBrowser/.src/FOption.class create mode 100644 app/examples/Networking/WebBrowser/.src/FOption.form create mode 100644 app/examples/Networking/WebBrowser/icon.png create mode 100644 app/examples/Networking/WebBrowser/list-ordered.png create mode 100644 app/examples/Networking/WebBrowser/list-unordered.png create mode 100644 app/examples/OpenGL/3DWebCam/.directory create mode 100644 app/examples/OpenGL/3DWebCam/.icon.png create mode 100644 app/examples/OpenGL/3DWebCam/.lang/ru.po create mode 100644 app/examples/OpenGL/3DWebCam/.project create mode 100644 app/examples/OpenGL/3DWebCam/.src/Mmain.module create mode 100644 app/examples/OpenGL/3DWebCam/webcam.png create mode 100644 app/examples/OpenGL/GambasGears/.directory create mode 100644 app/examples/OpenGL/GambasGears/.icon.png create mode 100644 app/examples/OpenGL/GambasGears/.lang/ru.po create mode 100644 app/examples/OpenGL/GambasGears/.project create mode 100644 app/examples/OpenGL/GambasGears/.src/Module1.module create mode 100644 app/examples/OpenGL/GambasGears/gears.png create mode 100644 app/examples/OpenGL/Md2Model/.directory create mode 100644 app/examples/OpenGL/Md2Model/.icon.png create mode 100644 app/examples/OpenGL/Md2Model/.lang/ru.po create mode 100644 app/examples/OpenGL/Md2Model/.project create mode 100644 app/examples/OpenGL/Md2Model/.src/FMain.class create mode 100644 app/examples/OpenGL/Md2Model/.src/FMain.form create mode 100644 app/examples/OpenGL/Md2Model/Weapon.md2 create mode 100644 app/examples/OpenGL/Md2Model/Weapon.png create mode 100644 app/examples/OpenGL/Md2Model/bauul.jpg create mode 100644 app/examples/OpenGL/Md2Model/bauul.md2 create mode 100644 app/examples/OpenGL/Md2Model/goblin.jpg create mode 100644 app/examples/OpenGL/Md2Model/goblin.md2 create mode 100644 app/examples/OpenGL/Md2Model/icon.png create mode 100644 app/examples/OpenGL/Md2Model/igdosh.png create mode 100644 app/examples/OpenGL/Md2Model/knight.jpg create mode 100644 app/examples/OpenGL/Md2Model/knight.md2 create mode 100644 app/examples/OpenGL/Md2Model/ogro.jpg create mode 100644 app/examples/OpenGL/Md2Model/ogro.md2 create mode 100644 app/examples/OpenGL/Md2Model/rat.jpg create mode 100644 app/examples/OpenGL/Md2Model/rat.md2 create mode 100644 app/examples/OpenGL/Md2Model/rhino.jpg create mode 100644 app/examples/OpenGL/Md2Model/rhino.md2 create mode 100644 app/examples/OpenGL/NeHeTutorial/.directory create mode 100644 app/examples/OpenGL/NeHeTutorial/.icon.png create mode 100644 app/examples/OpenGL/NeHeTutorial/.lang/ru.po create mode 100644 app/examples/OpenGL/NeHeTutorial/.project create mode 100644 app/examples/OpenGL/NeHeTutorial/.src/Example1.module create mode 100644 app/examples/OpenGL/NeHeTutorial/.src/Example10.module create mode 100644 app/examples/OpenGL/NeHeTutorial/.src/Example11.module create mode 100644 app/examples/OpenGL/NeHeTutorial/.src/Example16.module create mode 100644 app/examples/OpenGL/NeHeTutorial/.src/Example19.module create mode 100644 app/examples/OpenGL/NeHeTutorial/.src/Example2.module create mode 100644 app/examples/OpenGL/NeHeTutorial/.src/Example25.module create mode 100644 app/examples/OpenGL/NeHeTutorial/.src/Example3.module create mode 100644 app/examples/OpenGL/NeHeTutorial/.src/Example4.module create mode 100644 app/examples/OpenGL/NeHeTutorial/.src/Example42.module create mode 100644 app/examples/OpenGL/NeHeTutorial/.src/Example5.module create mode 100644 app/examples/OpenGL/NeHeTutorial/.src/Example6.module create mode 100644 app/examples/OpenGL/NeHeTutorial/.src/Example7.module create mode 100644 app/examples/OpenGL/NeHeTutorial/.src/Example8.module create mode 100644 app/examples/OpenGL/NeHeTutorial/.src/Example9.module create mode 100644 app/examples/OpenGL/NeHeTutorial/.src/MMain.module create mode 100644 app/examples/OpenGL/NeHeTutorial/NeHe.png create mode 100644 app/examples/OpenGL/NeHeTutorial/Sphere.txt create mode 100644 app/examples/OpenGL/NeHeTutorial/Star.png create mode 100644 app/examples/OpenGL/NeHeTutorial/Torus.txt create mode 100644 app/examples/OpenGL/NeHeTutorial/Tube.txt create mode 100644 app/examples/OpenGL/NeHeTutorial/barrel.png create mode 100644 app/examples/OpenGL/NeHeTutorial/ceiling.png create mode 100644 app/examples/OpenGL/NeHeTutorial/crate.jpeg create mode 100644 app/examples/OpenGL/NeHeTutorial/floor.png create mode 100644 app/examples/OpenGL/NeHeTutorial/glass.png create mode 100644 app/examples/OpenGL/NeHeTutorial/icon.png create mode 100644 app/examples/OpenGL/NeHeTutorial/rainbow.txt create mode 100644 app/examples/OpenGL/NeHeTutorial/wall.jpeg create mode 100644 app/examples/OpenGL/NeHeTutorial/world.txt create mode 100644 app/examples/OpenGL/NeHeTutorialShell/.directory create mode 100644 app/examples/OpenGL/NeHeTutorialShell/.icon.png create mode 100644 app/examples/OpenGL/NeHeTutorialShell/.lang/ru.po create mode 100644 app/examples/OpenGL/NeHeTutorialShell/.project create mode 100644 app/examples/OpenGL/NeHeTutorialShell/.src/FMain.class create mode 100644 app/examples/OpenGL/NeHeTutorialShell/.src/FMain.form create mode 100644 app/examples/OpenGL/NeHeTutorialShell/icon.png create mode 100644 app/examples/OpenGL/NeHeTutorialShell/nehe.png create mode 100644 app/examples/OpenGL/PDFPresentation/.directory create mode 100644 app/examples/OpenGL/PDFPresentation/.icon.png create mode 100644 app/examples/OpenGL/PDFPresentation/.lang/ru.po create mode 100644 app/examples/OpenGL/PDFPresentation/.project create mode 100644 app/examples/OpenGL/PDFPresentation/.src/CLogo.class create mode 100644 app/examples/OpenGL/PDFPresentation/.src/CPdfPresentation.class create mode 100644 app/examples/OpenGL/PDFPresentation/.src/FMain.class create mode 100644 app/examples/OpenGL/PDFPresentation/.src/FMain.form create mode 100644 app/examples/OpenGL/PDFPresentation/.src/MMain.module create mode 100644 app/examples/OpenGL/PDFPresentation/icon.png create mode 100644 app/examples/OpenGL/PDFPresentation/logo.png create mode 100644 app/examples/OpenGL/PDFPresentation/music.xm create mode 100644 app/examples/OpenGL/TunnelSDL/.dir_icon.png create mode 100644 app/examples/OpenGL/TunnelSDL/.directory create mode 100644 app/examples/OpenGL/TunnelSDL/.icon.png create mode 100644 app/examples/OpenGL/TunnelSDL/.lang/ru.po create mode 100644 app/examples/OpenGL/TunnelSDL/.project create mode 100644 app/examples/OpenGL/TunnelSDL/.src/CTunnel.class create mode 100644 app/examples/OpenGL/TunnelSDL/.src/MMain.module create mode 100644 app/examples/OpenGL/TunnelSDL/texture.png create mode 100644 app/examples/OpenGL/TunnelSDL/tunnelsdl.png create mode 100644 app/examples/Printing/Printing/.directory create mode 100644 app/examples/Printing/Printing/.hidden/screenshots/2014-12-14.png create mode 100644 app/examples/Printing/Printing/.icon.png create mode 100644 app/examples/Printing/Printing/.lang/ru.po create mode 100644 app/examples/Printing/Printing/.project create mode 100644 app/examples/Printing/Printing/.src/FMain.class create mode 100644 app/examples/Printing/Printing/.src/FMain.form create mode 100644 app/examples/Printing/Printing/molly-malone.txt create mode 100644 app/examples/Printing/Printing/printer-laser.png create mode 100644 app/examples/Printing/ReportExample/.connection/Connection1.connection create mode 100644 app/examples/Printing/ReportExample/.connection/Connection1.template create mode 100644 app/examples/Printing/ReportExample/.directory create mode 100644 app/examples/Printing/ReportExample/.hidden/report.png create mode 100644 app/examples/Printing/ReportExample/.icon.png create mode 100644 app/examples/Printing/ReportExample/.lang/ru.po create mode 100644 app/examples/Printing/ReportExample/.project create mode 100644 app/examples/Printing/ReportExample/.src/FMain.class create mode 100644 app/examples/Printing/ReportExample/.src/FMain.form create mode 100644 app/examples/Printing/ReportExample/.src/Report1.class create mode 100644 app/examples/Printing/ReportExample/.src/Report1.report create mode 100644 app/examples/Printing/ReportExample/.src/Report2.class create mode 100644 app/examples/Printing/ReportExample/.src/Report2.report create mode 100644 app/examples/Printing/ReportExample/.src/Report3.class create mode 100644 app/examples/Printing/ReportExample/.src/Report3.report create mode 100644 app/examples/Printing/ReportExample/gambas.svg create mode 100644 app/examples/Web/SmallWiki/.directory create mode 100644 app/examples/Web/SmallWiki/.icon.png create mode 100644 app/examples/Web/SmallWiki/.lang/ru.po create mode 100644 app/examples/Web/SmallWiki/.project create mode 100644 app/examples/Web/SmallWiki/.public/critical.png create mode 100644 app/examples/Web/SmallWiki/.public/edit.png create mode 100644 app/examples/Web/SmallWiki/.public/info.png create mode 100644 app/examples/Web/SmallWiki/.public/logo.png create mode 100644 app/examples/Web/SmallWiki/.public/style.css create mode 100644 app/examples/Web/SmallWiki/.public/tip.png create mode 100644 app/examples/Web/SmallWiki/.public/up.png create mode 100644 app/examples/Web/SmallWiki/.public/warning.png create mode 100644 app/examples/Web/SmallWiki/.src/Main.module create mode 100644 app/examples/Web/SmallWiki/.src/Markdown.class create mode 100644 app/examples/Web/SmallWiki/.src/MarkdownLink.class create mode 100644 app/examples/Web/SmallWiki/.src/Markup.module create mode 100644 app/examples/Web/SmallWiki/.src/Wiki.class create mode 100644 app/examples/Web/SmallWiki/.src/Wiki.webpage create mode 100644 app/examples/Web/SmallWiki/.src/WikiMarkdown.class create mode 100644 app/examples/Web/SmallWiki/page create mode 100644 app/examples/Web/SmallWiki/passwd create mode 100644 app/man/Makefile.am create mode 100644 app/man/gambas3.1 create mode 100644 app/man/gbs3.1 create mode 100644 app/man/gbw3.1 create mode 100644 app/mime/application-x-gambasscript.png create mode 100644 app/mime/application-x-gambasscript.xml create mode 100644 app/mime/application-x-gambasserverpage.png create mode 100644 app/mime/application-x-gambasserverpage.xml create mode 120000 app/reconf create mode 100644 app/src/INSTALL create mode 100644 app/src/gambas-farm-server/.connection/Connection1.connection create mode 100644 app/src/gambas-farm-server/.connection/Connection1.template create mode 100644 app/src/gambas-farm-server/.connection/Connection2.connection create mode 100644 app/src/gambas-farm-server/.connection/gambas3_farm.connection create mode 100644 app/src/gambas-farm-server/.connection/gambas3_farm.template create mode 100644 app/src/gambas-farm-server/.directory create mode 100644 app/src/gambas-farm-server/.icon.png create mode 100644 app/src/gambas-farm-server/.project create mode 100644 app/src/gambas-farm-server/.src/MMain.module create mode 100644 app/src/gambas-farm-server/logo.png create mode 100644 app/src/gambas-farm-server/usage.txt create mode 100644 app/src/gambas-wiki/.connection/Connection1.connection create mode 100644 app/src/gambas-wiki/.directory create mode 100644 app/src/gambas-wiki/.hidden/CHANGELOG create mode 100644 app/src/gambas-wiki/.hidden/Uncompressed/.public/hilitor.js create mode 100644 app/src/gambas-wiki/.hidden/Uncompressed/.public/style-rtl.css create mode 100644 app/src/gambas-wiki/.hidden/Uncompressed/.public/style-w.css create mode 100644 app/src/gambas-wiki/.hidden/Uncompressed/.public/style.css create mode 100644 app/src/gambas-wiki/.icon.png create mode 100644 app/src/gambas-wiki/.lang/ar.po create mode 100644 app/src/gambas-wiki/.lang/ca.po create mode 100644 app/src/gambas-wiki/.lang/cs.po create mode 100644 app/src/gambas-wiki/.lang/de.po create mode 100644 app/src/gambas-wiki/.lang/es.po create mode 100644 app/src/gambas-wiki/.lang/es_ES.po create mode 100644 app/src/gambas-wiki/.lang/fa.po create mode 100644 app/src/gambas-wiki/.lang/fr.po create mode 100644 app/src/gambas-wiki/.lang/it.po create mode 100644 app/src/gambas-wiki/.lang/nl.po create mode 100644 app/src/gambas-wiki/.lang/pt_BR.po create mode 100644 app/src/gambas-wiki/.lang/ru.po create mode 100644 app/src/gambas-wiki/.lang/sv.po create mode 100644 app/src/gambas-wiki/.lang/zh.po create mode 100644 app/src/gambas-wiki/.project create mode 100644 app/src/gambas-wiki/.public/critical.png create mode 100644 app/src/gambas-wiki/.public/edit.png create mode 100644 app/src/gambas-wiki/.public/error-bg.png create mode 100644 app/src/gambas-wiki/.public/gambas.png create mode 100644 app/src/gambas-wiki/.public/hilitor.js create mode 100644 app/src/gambas-wiki/.public/home.png create mode 100644 app/src/gambas-wiki/.public/info.png create mode 100644 app/src/gambas-wiki/.public/logo.png create mode 100644 app/src/gambas-wiki/.public/playground.js create mode 100644 app/src/gambas-wiki/.public/style-nh.css create mode 100644 app/src/gambas-wiki/.public/style-rtl.css create mode 100644 app/src/gambas-wiki/.public/style-w.css create mode 100644 app/src/gambas-wiki/.public/style.css create mode 100644 app/src/gambas-wiki/.public/tip.png create mode 100644 app/src/gambas-wiki/.public/up-gray.png create mode 100644 app/src/gambas-wiki/.public/up.png create mode 100644 app/src/gambas-wiki/.public/vb.png create mode 100644 app/src/gambas-wiki/.public/waiting.gif create mode 100644 app/src/gambas-wiki/.public/warning.png create mode 100644 app/src/gambas-wiki/.src/CAuthor.class create mode 100644 app/src/gambas-wiki/.src/CClassInfo.class create mode 100644 app/src/gambas-wiki/.src/CComponent.class create mode 100644 app/src/gambas-wiki/.src/CPropertyInfo.class create mode 100644 app/src/gambas-wiki/.src/CSymbolInfo.class create mode 100644 app/src/gambas-wiki/.src/CUser.class create mode 100644 app/src/gambas-wiki/.src/Confirm.class create mode 100644 app/src/gambas-wiki/.src/Confirm.webpage create mode 100644 app/src/gambas-wiki/.src/HttpStat.module create mode 100644 app/src/gambas-wiki/.src/Main.module create mode 100644 app/src/gambas-wiki/.src/OldWiki.module create mode 100644 app/src/gambas-wiki/.src/Register.class create mode 100644 app/src/gambas-wiki/.src/Register.webpage create mode 100644 app/src/gambas-wiki/.src/Wiki.class create mode 100644 app/src/gambas-wiki/.src/Wiki.webpage create mode 100644 app/src/gambas-wiki/.src/WikiMarkdown.class create mode 120000 app/src/gambas-wiki/AUTHORS create mode 120000 app/src/gambas-wiki/gambas3-ide.project create mode 120000 app/src/gambas-wiki/gambas3-scripter.project create mode 100644 app/src/gambas-wiki/icon.png create mode 100644 app/src/gambas-wiki/page create mode 100644 app/src/gambas-wiki/passwd create mode 100644 app/src/gambas3/.directory create mode 100644 app/src/gambas3/.hidden/font/GambasBold-12.sfd create mode 100644 app/src/gambas3/.hidden/font/GambasBold-13.sfd create mode 100644 app/src/gambas3/.hidden/font/GambasBold-16.sfd create mode 100644 app/src/gambas3/.hidden/font/GambasMedium-12.sfd create mode 100644 app/src/gambas3/.hidden/font/GambasMedium-13.sfd create mode 100644 app/src/gambas3/.hidden/font/GambasMedium-16.sfd create mode 100644 app/src/gambas3/.hidden/font/LICENSE create mode 100644 app/src/gambas3/.hidden/make-help-archive create mode 100644 app/src/gambas3/.hidden/report-ng.sh create mode 100644 app/src/gambas3/.icon.png create mode 100644 app/src/gambas3/.lang/ar.po create mode 100644 app/src/gambas3/.lang/ca.po create mode 100644 app/src/gambas3/.lang/cs.po create mode 100644 app/src/gambas3/.lang/cy.po create mode 100644 app/src/gambas3/.lang/de.po create mode 100644 app/src/gambas3/.lang/el.po create mode 100644 app/src/gambas3/.lang/es.po create mode 100644 app/src/gambas3/.lang/es_ES.po create mode 100644 app/src/gambas3/.lang/fa.po create mode 100644 app/src/gambas3/.lang/fr.po create mode 100644 app/src/gambas3/.lang/gl_ES.po create mode 100644 app/src/gambas3/.lang/hr.po create mode 100644 app/src/gambas3/.lang/hu.po create mode 100644 app/src/gambas3/.lang/id.po create mode 100644 app/src/gambas3/.lang/it.po create mode 100644 app/src/gambas3/.lang/ja.po create mode 100644 app/src/gambas3/.lang/ko.po create mode 100644 app/src/gambas3/.lang/lt.po create mode 100644 app/src/gambas3/.lang/nl.po create mode 100644 app/src/gambas3/.lang/no.po create mode 100644 app/src/gambas3/.lang/pl.po create mode 100644 app/src/gambas3/.lang/pt.po create mode 100644 app/src/gambas3/.lang/pt_BR.po create mode 100644 app/src/gambas3/.lang/ro.po create mode 100644 app/src/gambas3/.lang/ru.po create mode 100644 app/src/gambas3/.lang/sl.po create mode 100644 app/src/gambas3/.lang/sv.po create mode 100644 app/src/gambas3/.lang/tr.po create mode 100644 app/src/gambas3/.lang/zh.po create mode 100644 app/src/gambas3/.lang/zh_TW.po create mode 100644 app/src/gambas3/.project create mode 100644 app/src/gambas3/.src/CRecentProject.class create mode 100644 app/src/gambas3/.src/CStyle.class create mode 100644 app/src/gambas3/.src/CWaitingAnimation.class create mode 100644 app/src/gambas3/.src/Component/CClassInfo.class create mode 100644 app/src/gambas3/.src/Component/CComponent.class create mode 100644 app/src/gambas3/.src/Component/CDocumentation.class create mode 100644 app/src/gambas3/.src/Component/CModule.class create mode 100644 app/src/gambas3/.src/Component/CPropertyInfo.class create mode 100644 app/src/gambas3/.src/Component/CSymbolInfo.class create mode 100644 app/src/gambas3/.src/Connection/FExportData.class create mode 100644 app/src/gambas3/.src/Connection/FExportData.form create mode 100644 app/src/gambas3/.src/Connection/FImportTable.class create mode 100644 app/src/gambas3/.src/Connection/FImportTable.form create mode 100644 app/src/gambas3/.src/Connection/FNewConnection.class create mode 100644 app/src/gambas3/.src/Connection/FNewConnection.form create mode 100644 app/src/gambas3/.src/Connection/FPasteTable.class create mode 100644 app/src/gambas3/.src/Connection/FPasteTable.form create mode 100644 app/src/gambas3/.src/Connection/MConnection.module create mode 100644 app/src/gambas3/.src/Debug/CProfile.class create mode 100644 app/src/gambas3/.src/Debug/Design.module create mode 100644 app/src/gambas3/.src/Debug/FCrash.class create mode 100644 app/src/gambas3/.src/Debug/FCrash.form create mode 100644 app/src/gambas3/.src/Debug/FDebugButton.class create mode 100644 app/src/gambas3/.src/Debug/FDebugButton.form create mode 100644 app/src/gambas3/.src/Debug/FDebugExpr.class create mode 100644 app/src/gambas3/.src/Debug/FDebugExpr.form create mode 100644 app/src/gambas3/.src/Debug/FDebugInfo.class create mode 100644 app/src/gambas3/.src/Debug/FDebugInfo.form create mode 100644 app/src/gambas3/.src/Debug/FOutput.class create mode 100644 app/src/gambas3/.src/Debug/FOutput.form create mode 100644 app/src/gambas3/.src/Debug/FProfile.class create mode 100644 app/src/gambas3/.src/Debug/FProfile.form create mode 100644 app/src/gambas3/.src/Debug/FTestSuite.class create mode 100644 app/src/gambas3/.src/Debug/FTestSuite.form create mode 100644 app/src/gambas3/.src/Dialog/Database/FFieldChooser.class create mode 100644 app/src/gambas3/.src/Dialog/Database/FFieldChooser.form create mode 100644 app/src/gambas3/.src/Dialog/Database/FTableChooser.class create mode 100644 app/src/gambas3/.src/Dialog/Database/FTableChooser.form create mode 100644 app/src/gambas3/.src/Dialog/FColorChooser.class create mode 100644 app/src/gambas3/.src/Dialog/FColorChooser.form create mode 100644 app/src/gambas3/.src/Dialog/FFileInfoVC.class create mode 100644 app/src/gambas3/.src/Dialog/FFileInfoVC.form create mode 100644 app/src/gambas3/.src/Dialog/FFileProperty.class create mode 100644 app/src/gambas3/.src/Dialog/FFileProperty.form create mode 100644 app/src/gambas3/.src/Dialog/FFontChooser.class create mode 100644 app/src/gambas3/.src/Dialog/FFontChooser.form create mode 100644 app/src/gambas3/.src/Dialog/FList.class create mode 100644 app/src/gambas3/.src/Dialog/FList.form create mode 100644 app/src/gambas3/.src/Dialog/FSelectIcon.class create mode 100644 app/src/gambas3/.src/Dialog/FSelectIcon.form create mode 100644 app/src/gambas3/.src/Editor/CBookmark.class create mode 100644 app/src/gambas3/.src/Editor/CInsertColor.class create mode 100644 app/src/gambas3/.src/Editor/CInsertDate.class create mode 100644 app/src/gambas3/.src/Editor/CPosition.class create mode 100644 app/src/gambas3/.src/Editor/CTask.class create mode 100644 app/src/gambas3/.src/Editor/CUndo.class create mode 100644 app/src/gambas3/.src/Editor/Code/CCompletion.class create mode 100644 app/src/gambas3/.src/Editor/Code/CDatatype.class create mode 100644 app/src/gambas3/.src/Editor/Code/CSampleCode.class create mode 100644 app/src/gambas3/.src/Editor/Code/FCompletion.class create mode 100644 app/src/gambas3/.src/Editor/Code/FCompletion.form create mode 100644 app/src/gambas3/.src/Editor/Code/FConflictEditor.class create mode 100644 app/src/gambas3/.src/Editor/Code/FConflictEditor.form create mode 100644 app/src/gambas3/.src/Editor/Code/FEditor.class create mode 100644 app/src/gambas3/.src/Editor/Code/FEditor.form create mode 100644 app/src/gambas3/.src/Editor/Code/FPasteSpecial.class create mode 100644 app/src/gambas3/.src/Editor/Code/FPasteSpecial.form create mode 100644 app/src/gambas3/.src/Editor/Code/FProcedureList.class create mode 100644 app/src/gambas3/.src/Editor/Code/FProcedureList.form create mode 100644 app/src/gambas3/.src/Editor/Code/FSignature.class create mode 100644 app/src/gambas3/.src/Editor/Code/FSignature.form create mode 100644 app/src/gambas3/.src/Editor/Code/FTextEditor.class create mode 100644 app/src/gambas3/.src/Editor/Code/FTextEditor.form create mode 100644 app/src/gambas3/.src/Editor/Code/MPrettyCode.module create mode 100644 app/src/gambas3/.src/Editor/Connection/CField.class create mode 100644 app/src/gambas3/.src/Editor/Connection/CIndexField.class create mode 100644 app/src/gambas3/.src/Editor/Connection/FConnectionEditor.class create mode 100644 app/src/gambas3/.src/Editor/Connection/FConnectionEditor.form create mode 100644 app/src/gambas3/.src/Editor/Connection/FNewTable.class create mode 100644 app/src/gambas3/.src/Editor/Connection/FNewTable.form create mode 100644 app/src/gambas3/.src/Editor/FGotoLine.class create mode 100644 app/src/gambas3/.src/Editor/FGotoLine.form create mode 100644 app/src/gambas3/.src/Editor/FInsertChar.class create mode 100644 app/src/gambas3/.src/Editor/FInsertChar.form create mode 100644 app/src/gambas3/.src/Editor/Form/CControl.class create mode 100644 app/src/gambas3/.src/Editor/Form/CMenu.class create mode 100644 app/src/gambas3/.src/Editor/Form/FForm.class create mode 100644 app/src/gambas3/.src/Editor/Form/FForm.form create mode 100644 app/src/gambas3/.src/Editor/Form/FFormStack.class create mode 100644 app/src/gambas3/.src/Editor/Form/FFormStack.form create mode 100644 app/src/gambas3/.src/Editor/Form/FMenu.class create mode 100644 app/src/gambas3/.src/Editor/Form/FMenu.form create mode 100644 app/src/gambas3/.src/Editor/Form/FProperty.class create mode 100644 app/src/gambas3/.src/Editor/Form/FProperty.form create mode 100644 app/src/gambas3/.src/Editor/Form/FText.class create mode 100644 app/src/gambas3/.src/Editor/Form/FText.form create mode 100644 app/src/gambas3/.src/Editor/Form/FToolBox.class create mode 100644 app/src/gambas3/.src/Editor/Form/FToolBox.form create mode 100644 app/src/gambas3/.src/Editor/Form/FToolPanel.class create mode 100644 app/src/gambas3/.src/Editor/Form/FToolPanel.form create mode 100644 app/src/gambas3/.src/Editor/Image/CImageClipboard.class create mode 100644 app/src/gambas3/.src/Editor/Image/CImageSelection.class create mode 100644 app/src/gambas3/.src/Editor/Image/CImageShape.class create mode 100644 app/src/gambas3/.src/Editor/Image/FImageEditor.class create mode 100644 app/src/gambas3/.src/Editor/Image/FImageEditor.form create mode 100644 app/src/gambas3/.src/Editor/Image/FImageOffsetSelection.class create mode 100644 app/src/gambas3/.src/Editor/Image/FImageOffsetSelection.form create mode 100644 app/src/gambas3/.src/Editor/Image/FImageProperty.class create mode 100644 app/src/gambas3/.src/Editor/Image/FImageProperty.form create mode 100644 app/src/gambas3/.src/Editor/Image/FImageQuality.class create mode 100644 app/src/gambas3/.src/Editor/Image/FImageQuality.form create mode 100644 app/src/gambas3/.src/Editor/Image/FImageResize.class create mode 100644 app/src/gambas3/.src/Editor/Image/FImageResize.form create mode 100644 app/src/gambas3/.src/Editor/Image/FImageRotate.class create mode 100644 app/src/gambas3/.src/Editor/Image/FImageRotate.form create mode 100644 app/src/gambas3/.src/Editor/MCompressFile.module create mode 100644 app/src/gambas3/.src/Editor/MPrint.module create mode 100644 app/src/gambas3/.src/Exported/ProjectChooser/FProjectChooser.class create mode 100644 app/src/gambas3/.src/Exported/ProjectChooser/FProjectChooser.form create mode 100644 app/src/gambas3/.src/Exported/ProjectChooser/ProjectChooser.class create mode 100644 app/src/gambas3/.src/Exported/TabPanel.class create mode 100644 app/src/gambas3/.src/Exported/TextEditor.class create mode 100644 app/src/gambas3/.src/FMain.class create mode 100644 app/src/gambas3/.src/FMain.form create mode 100644 app/src/gambas3/.src/FSave.class create mode 100644 app/src/gambas3/.src/FSave.form create mode 100644 app/src/gambas3/.src/FScreenshot.class create mode 100644 app/src/gambas3/.src/FScreenshot.form create mode 100644 app/src/gambas3/.src/Family/CFamily.class create mode 100644 app/src/gambas3/.src/Family/Form/CFamilyForm.class create mode 100644 app/src/gambas3/.src/Family/Report/AngleBox.class create mode 100644 app/src/gambas3/.src/Family/Report/CFamilyReport.class create mode 100644 app/src/gambas3/.src/Family/Report/CReportBrush.class create mode 100644 app/src/gambas3/.src/Family/Report/CoordBox.class create mode 100644 app/src/gambas3/.src/Family/Report/FReportBorderChooser.class create mode 100644 app/src/gambas3/.src/Family/Report/FReportBorderChooser.form create mode 100644 app/src/gambas3/.src/Family/Report/FReportBoxShadowChooser.class create mode 100644 app/src/gambas3/.src/Family/Report/FReportBoxShadowChooser.form create mode 100644 app/src/gambas3/.src/Family/Report/FReportBrushChooser.class create mode 100644 app/src/gambas3/.src/Family/Report/FReportBrushChooser.form create mode 100644 app/src/gambas3/.src/Family/Report/FReportCoordChooser.class create mode 100644 app/src/gambas3/.src/Family/Report/FReportCoordChooser.form create mode 100644 app/src/gambas3/.src/Family/Report/FReportPaddingChooser.class create mode 100644 app/src/gambas3/.src/Family/Report/FReportPaddingChooser.form create mode 100644 app/src/gambas3/.src/Family/TermForm/CFamilyTermForm.class create mode 100644 app/src/gambas3/.src/Family/WebForm/CFamilyWebForm.class create mode 100644 app/src/gambas3/.src/Family/WebForm/FWebFontChooser.class create mode 100644 app/src/gambas3/.src/Family/WebForm/FWebFontChooser.form create mode 100644 app/src/gambas3/.src/Family/WebForm/WebformWebMenu.class create mode 100644 app/src/gambas3/.src/Help/FHelpBrowser.class create mode 100644 app/src/gambas3/.src/Help/FHelpBrowser.form create mode 100644 app/src/gambas3/.src/Help/FHelpShortcut.class create mode 100644 app/src/gambas3/.src/Help/FHelpShortcut.form create mode 100644 app/src/gambas3/.src/Help/FTips.class create mode 100644 app/src/gambas3/.src/Help/FTips.form create mode 100644 app/src/gambas3/.src/Help/HelpView.class create mode 100644 app/src/gambas3/.src/Help/MHelp.module create mode 100644 app/src/gambas3/.src/Help/Markup.module create mode 100644 app/src/gambas3/.src/Help/Wiki/URL.class create mode 100644 app/src/gambas3/.src/Help/Wiki/Wiki.module create mode 100644 app/src/gambas3/.src/Help/Wiki/WikiMarkdown.class create mode 100644 app/src/gambas3/.src/MMime.module create mode 100644 app/src/gambas3/.src/MTheme.module create mode 100644 app/src/gambas3/.src/Options/CBackground.class create mode 100644 app/src/gambas3/.src/Options/FLayout.class create mode 100644 app/src/gambas3/.src/Options/FLayout.form create mode 100644 app/src/gambas3/.src/Options/FOption.class create mode 100644 app/src/gambas3/.src/Options/FOption.form create mode 100644 app/src/gambas3/.src/Options/FProxy.class create mode 100644 app/src/gambas3/.src/Options/FProxy.form create mode 100644 app/src/gambas3/.src/Options/FSnippet.class create mode 100644 app/src/gambas3/.src/Options/FSnippet.form create mode 100644 app/src/gambas3/.src/Packager/FMakeInstall.class create mode 100644 app/src/gambas3/.src/Packager/FMakeInstall.form create mode 100644 app/src/gambas3/.src/Packager/FSelectExtraFile.class create mode 100644 app/src/gambas3/.src/Packager/FSelectExtraFile.form create mode 100644 app/src/gambas3/.src/Packager/Package.module create mode 100644 app/src/gambas3/.src/Project.module create mode 100644 app/src/gambas3/.src/Project/ArgListBox.class create mode 100644 app/src/gambas3/.src/Project/ArgListEditor.class create mode 100644 app/src/gambas3/.src/Project/CProjectInfo.class create mode 100644 app/src/gambas3/.src/Project/CProjectList.class create mode 100644 app/src/gambas3/.src/Project/CProjectTree.class create mode 100644 app/src/gambas3/.src/Project/Component/ComponentChooser.class create mode 100644 app/src/gambas3/.src/Project/Component/FComponentChooser.class create mode 100644 app/src/gambas3/.src/Project/Component/FComponentChooser.form create mode 100644 app/src/gambas3/.src/Project/Component/FSelectComponent.class create mode 100644 app/src/gambas3/.src/Project/Component/FSelectComponent.form create mode 100644 app/src/gambas3/.src/Project/Conversion/FConvert.class create mode 100644 app/src/gambas3/.src/Project/Conversion/FConvert.form create mode 100644 app/src/gambas3/.src/Project/Conversion/MConvert.module create mode 100644 app/src/gambas3/.src/Project/FArguments.class create mode 100644 app/src/gambas3/.src/Project/FArguments.form create mode 100644 app/src/gambas3/.src/Project/FCreateFile.class create mode 100644 app/src/gambas3/.src/Project/FCreateFile.form create mode 100644 app/src/gambas3/.src/Project/FCreateProject.class create mode 100644 app/src/gambas3/.src/Project/FCreateProject.form create mode 100644 app/src/gambas3/.src/Project/FImportFile.class create mode 100644 app/src/gambas3/.src/Project/FImportFile.form create mode 100644 app/src/gambas3/.src/Project/FMakeExecutable.class create mode 100644 app/src/gambas3/.src/Project/FMakeExecutable.form create mode 100644 app/src/gambas3/.src/Project/FOpenProject.class create mode 100644 app/src/gambas3/.src/Project/FOpenProject.form create mode 100644 app/src/gambas3/.src/Project/FProjectProperty.class create mode 100644 app/src/gambas3/.src/Project/FProjectProperty.form create mode 100644 app/src/gambas3/.src/Project/FSaveProjectAs.class create mode 100644 app/src/gambas3/.src/Project/FSaveProjectAs.form create mode 100644 app/src/gambas3/.src/Project/Farm/CSoftware.class create mode 100644 app/src/gambas3/.src/Project/Farm/CSoftwareGroup.class create mode 100644 app/src/gambas3/.src/Project/Farm/FFarmConfig.class create mode 100644 app/src/gambas3/.src/Project/Farm/FFarmConfig.form create mode 100644 app/src/gambas3/.src/Project/Farm/FFarmLogin.class create mode 100644 app/src/gambas3/.src/Project/Farm/FFarmLogin.form create mode 100644 app/src/gambas3/.src/Project/Farm/FFarmRegister.class create mode 100644 app/src/gambas3/.src/Project/Farm/FFarmRegister.form create mode 100644 app/src/gambas3/.src/Project/Farm/FFarmRequest.class create mode 100644 app/src/gambas3/.src/Project/Farm/FFarmRequest.form create mode 100644 app/src/gambas3/.src/Project/Farm/FPublish.class create mode 100644 app/src/gambas3/.src/Project/Farm/FPublish.form create mode 100644 app/src/gambas3/.src/Project/Farm/FSoftwareFarm.class create mode 100644 app/src/gambas3/.src/Project/Farm/FSoftwareFarm.form create mode 100644 app/src/gambas3/.src/Project/Farm/FarmIdentity.class create mode 100644 app/src/gambas3/.src/Project/Farm/FarmRequest.class create mode 100644 app/src/gambas3/.src/Project/Farm/FarmRequestManager.module create mode 100644 app/src/gambas3/.src/Project/Farm/Publish/CTag.class create mode 100644 app/src/gambas3/.src/Project/Farm/Publish/CTagCompletion.class create mode 100644 app/src/gambas3/.src/Project/Farm/Publish/CTagEditor.class create mode 100644 app/src/gambas3/.src/Project/Farm/SoftwareBox.class create mode 100644 app/src/gambas3/.src/Project/Library/CLibraryInfo.class create mode 100644 app/src/gambas3/.src/Project/Library/FSelectLibrary.class create mode 100644 app/src/gambas3/.src/Project/Library/FSelectLibrary.form create mode 100644 app/src/gambas3/.src/Project/Library/LibraryItem.class create mode 100644 app/src/gambas3/.src/Project/Patch/FMakePatch.class create mode 100644 app/src/gambas3/.src/Project/Patch/FMakePatch.form create mode 100644 app/src/gambas3/.src/Project/Patch/FPatch.class create mode 100644 app/src/gambas3/.src/Project/Patch/FPatch.form create mode 100644 app/src/gambas3/.src/Project/Patch/Patch.class create mode 100644 app/src/gambas3/.src/Project/ProjectBox.class create mode 100644 app/src/gambas3/.src/Save.module create mode 100644 app/src/gambas3/.src/Search/CGrepResult.class create mode 100644 app/src/gambas3/.src/Search/CSearchResult.class create mode 100644 app/src/gambas3/.src/Search/CSearchTask.class create mode 100644 app/src/gambas3/.src/Search/FSearch.class create mode 100644 app/src/gambas3/.src/Search/FSearch.form create mode 100644 app/src/gambas3/.src/Translation/CTranslation.class create mode 100644 app/src/gambas3/.src/Translation/FNewTranslation.class create mode 100644 app/src/gambas3/.src/Translation/FNewTranslation.form create mode 100644 app/src/gambas3/.src/Translation/FTranslate.class create mode 100644 app/src/gambas3/.src/Translation/FTranslate.form create mode 100644 app/src/gambas3/.src/Translation/Language.module create mode 100644 app/src/gambas3/.src/Util.module create mode 100644 app/src/gambas3/.src/Util/MErrorMessage.module create mode 100644 app/src/gambas3/.src/Util/MRemoveAccents.module create mode 100644 app/src/gambas3/.src/Util/MSdlDefaultFont.module create mode 100644 app/src/gambas3/.src/VersionControl/CVersionControl.class create mode 100644 app/src/gambas3/.src/VersionControl/CVersionControlGit.class create mode 100644 app/src/gambas3/.src/VersionControl/CVersionControlSubversion.class create mode 100644 app/src/gambas3/.src/VersionControl/FConflict.class create mode 100644 app/src/gambas3/.src/VersionControl/FConflict.form create mode 100644 app/src/gambas3/.src/VersionControl/FProjectVersion.class create mode 100644 app/src/gambas3/.src/VersionControl/FProjectVersion.form create mode 100644 app/src/gambas3/.src/VersionControl/FVersionControl.class create mode 100644 app/src/gambas3/.src/VersionControl/FVersionControl.form create mode 100644 app/src/gambas3/.src/VersionControl/FVersionError.class create mode 100644 app/src/gambas3/.src/VersionControl/FVersionError.form create mode 100644 app/src/gambas3/.src/VersionControl/VersionControl.module create mode 100644 app/src/gambas3/.src/Welcome/CCoolButton.class create mode 100644 app/src/gambas3/.src/Welcome/CSnowFlake.class create mode 100644 app/src/gambas3/.src/Welcome/CTear.class create mode 100644 app/src/gambas3/.src/Welcome/CUser.class create mode 100644 app/src/gambas3/.src/Welcome/CWelcome.class create mode 100644 app/src/gambas3/.src/Welcome/FAbout.class create mode 100644 app/src/gambas3/.src/Welcome/FAbout.form create mode 100644 app/src/gambas3/.src/Welcome/FSystemInfo.class create mode 100644 app/src/gambas3/.src/Welcome/FSystemInfo.form create mode 100644 app/src/gambas3/.src/Welcome/FWelcome.class create mode 100644 app/src/gambas3/.src/Welcome/FWelcome.form create mode 120000 app/src/gambas3/AUTHORS create mode 100644 app/src/gambas3/_fake_project create mode 100644 app/src/gambas3/font/GambasBold-12.bdf create mode 100644 app/src/gambas3/font/GambasBold-13.bdf create mode 100644 app/src/gambas3/font/GambasBold-16.bdf create mode 100644 app/src/gambas3/font/GambasMedium-12.bdf create mode 100644 app/src/gambas3/font/GambasMedium-13.bdf create mode 100644 app/src/gambas3/font/GambasMedium-16.bdf create mode 100644 app/src/gambas3/font/font.allow create mode 100644 app/src/gambas3/font/font.conf create mode 100644 app/src/gambas3/gitignore create mode 100644 app/src/gambas3/help/class-help.html create mode 100644 app/src/gambas3/help/component-help.html create mode 100644 app/src/gambas3/help/property-help.html create mode 100644 app/src/gambas3/help/symbol-help.html create mode 100644 app/src/gambas3/help/wiki/critical.png create mode 100644 app/src/gambas3/help/wiki/error-bg.png create mode 100644 app/src/gambas3/help/wiki/info.png create mode 100644 app/src/gambas3/help/wiki/page.html create mode 100644 app/src/gambas3/help/wiki/style-custom.css create mode 100644 app/src/gambas3/help/wiki/style-offline.css create mode 120000 app/src/gambas3/help/wiki/style.css create mode 100644 app/src/gambas3/help/wiki/tip.png create mode 100644 app/src/gambas3/help/wiki/up.png create mode 100644 app/src/gambas3/help/wiki/vb.png create mode 100644 app/src/gambas3/help/wiki/warning.png create mode 100644 app/src/gambas3/img/16/arrange-h.png create mode 100644 app/src/gambas3/img/16/arrange-hcenter.png create mode 100644 app/src/gambas3/img/16/arrange-lr.png create mode 100644 app/src/gambas3/img/16/arrange-tb.png create mode 100644 app/src/gambas3/img/16/arrange-v.png create mode 100644 app/src/gambas3/img/16/arrange-vcenter.png create mode 100644 app/src/gambas3/img/16/average.png create mode 100644 app/src/gambas3/img/16/checked-gray.png create mode 100644 app/src/gambas3/img/16/checked-lock.png create mode 100644 app/src/gambas3/img/16/checked.png create mode 100644 app/src/gambas3/img/16/close-window.png create mode 100644 app/src/gambas3/img/16/collapse-container.png create mode 100644 app/src/gambas3/img/16/control.png create mode 100644 app/src/gambas3/img/16/cursive.png create mode 100644 app/src/gambas3/img/16/delete-container.png create mode 100644 app/src/gambas3/img/16/embed-container.png create mode 100644 app/src/gambas3/img/16/expand-container.png create mode 100644 app/src/gambas3/img/16/fantasy.png create mode 100644 app/src/gambas3/img/16/max-window.png create mode 100644 app/src/gambas3/img/16/monospace.png create mode 100644 app/src/gambas3/img/16/percent.png create mode 100644 app/src/gambas3/img/16/red-arrow-c.png create mode 100644 app/src/gambas3/img/16/red-arrow-h.png create mode 100644 app/src/gambas3/img/16/red-arrow-r.png create mode 100644 app/src/gambas3/img/16/red-arrow-v.png create mode 100644 app/src/gambas3/img/16/remove-from-container.png create mode 100644 app/src/gambas3/img/16/rename.png create mode 100644 app/src/gambas3/img/16/round-ne.png create mode 100644 app/src/gambas3/img/16/round-nw.png create mode 100644 app/src/gambas3/img/16/round-se.png create mode 100644 app/src/gambas3/img/16/round-sw.png create mode 100644 app/src/gambas3/img/16/sans-serif.png create mode 100644 app/src/gambas3/img/16/select.png create mode 100644 app/src/gambas3/img/16/separator.png create mode 100644 app/src/gambas3/img/16/serif.png create mode 100644 app/src/gambas3/img/16/stack.png create mode 100644 app/src/gambas3/img/16/tabmove.png create mode 100644 app/src/gambas3/img/16/tabstrip.png create mode 100644 app/src/gambas3/img/16/tile.png create mode 100644 app/src/gambas3/img/16/toggle-container.png create mode 100644 app/src/gambas3/img/16/unchecked.png create mode 100644 app/src/gambas3/img/16/white-close.png create mode 100644 app/src/gambas3/img/32/added.png create mode 100644 app/src/gambas3/img/32/comment.png create mode 100644 app/src/gambas3/img/32/conflict.png create mode 100644 app/src/gambas3/img/32/cross.png create mode 100644 app/src/gambas3/img/32/do-not-translate.png create mode 100644 app/src/gambas3/img/32/eol.png create mode 100644 app/src/gambas3/img/32/exported.png create mode 100644 app/src/gambas3/img/32/filter-menu.png create mode 100644 app/src/gambas3/img/32/filter.png create mode 100644 app/src/gambas3/img/32/green-arrow.png create mode 100644 app/src/gambas3/img/32/linked.png create mode 100644 app/src/gambas3/img/32/magic.png create mode 100644 app/src/gambas3/img/32/modified.png create mode 100644 app/src/gambas3/img/32/opengl.png create mode 100644 app/src/gambas3/img/32/startup.png create mode 100644 app/src/gambas3/img/32/tab.png create mode 100644 app/src/gambas3/img/32/uncomment.png create mode 100644 app/src/gambas3/img/32/wrap.png create mode 100644 app/src/gambas3/img/48/all.png create mode 100644 app/src/gambas3/img/64/atari-dark.png create mode 100644 app/src/gambas3/img/64/atari.png create mode 100644 app/src/gambas3/img/background/baraka.png create mode 100644 app/src/gambas3/img/background/christ.png create mode 100644 app/src/gambas3/img/background/circle.png create mode 100644 app/src/gambas3/img/background/cross.png create mode 100644 app/src/gambas3/img/background/cubism.png create mode 100644 app/src/gambas3/img/background/dark.png create mode 100644 app/src/gambas3/img/background/gambas.png create mode 100644 app/src/gambas3/img/background/hline.png create mode 100644 app/src/gambas3/img/background/hose.png create mode 100644 app/src/gambas3/img/background/illusion.png create mode 100644 app/src/gambas3/img/background/labyrinth.png create mode 100644 app/src/gambas3/img/background/light.png create mode 100644 app/src/gambas3/img/background/list create mode 100644 app/src/gambas3/img/background/medracim.png create mode 100644 app/src/gambas3/img/background/mosaic.png create mode 100644 app/src/gambas3/img/background/muhammad.png create mode 100644 app/src/gambas3/img/background/nature.png create mode 100644 app/src/gambas3/img/background/oil.png create mode 100644 app/src/gambas3/img/background/point.png create mode 100644 app/src/gambas3/img/background/quasi.png create mode 100644 app/src/gambas3/img/background/smoke.png create mode 100644 app/src/gambas3/img/background/square.png create mode 100644 app/src/gambas3/img/background/star.png create mode 100644 app/src/gambas3/img/background/tawhid.png create mode 100644 app/src/gambas3/img/background/vline.png create mode 100644 app/src/gambas3/img/background/warda.png create mode 100644 app/src/gambas3/img/background/weave.png create mode 100644 app/src/gambas3/img/broken.svg create mode 100644 app/src/gambas3/img/component/deprecated.png create mode 100644 app/src/gambas3/img/component/experimental.png create mode 100644 app/src/gambas3/img/component/finished.png create mode 100644 app/src/gambas3/img/component/unfinished.png create mode 100644 app/src/gambas3/img/component/unknown.png create mode 100644 app/src/gambas3/img/contrib/Radoslav.gif create mode 100644 app/src/gambas3/img/control/button.png create mode 100644 app/src/gambas3/img/control/checkbox.png create mode 100644 app/src/gambas3/img/control/columnview.png create mode 100644 app/src/gambas3/img/control/combobox.png create mode 100644 app/src/gambas3/img/control/dial.png create mode 100644 app/src/gambas3/img/control/dnsclient.png create mode 100644 app/src/gambas3/img/control/drawingarea.png create mode 100644 app/src/gambas3/img/control/editor.png create mode 100644 app/src/gambas3/img/control/embedder.png create mode 100644 app/src/gambas3/img/control/frame.png create mode 100644 app/src/gambas3/img/control/ftpclient.png create mode 100644 app/src/gambas3/img/control/glarea.png create mode 100644 app/src/gambas3/img/control/gridview.png create mode 100644 app/src/gambas3/img/control/hbox.png create mode 100644 app/src/gambas3/img/control/hpanel.png create mode 100644 app/src/gambas3/img/control/hsplit.png create mode 100644 app/src/gambas3/img/control/httpclient.png create mode 100644 app/src/gambas3/img/control/iconview.png create mode 100644 app/src/gambas3/img/control/label.png create mode 100644 app/src/gambas3/img/control/lcdnumber.png create mode 100644 app/src/gambas3/img/control/listbox.png create mode 100644 app/src/gambas3/img/control/listview.png create mode 100644 app/src/gambas3/img/control/moviebox.png create mode 100644 app/src/gambas3/img/control/panel.png create mode 100644 app/src/gambas3/img/control/picturebox.png create mode 100644 app/src/gambas3/img/control/printer.png create mode 100644 app/src/gambas3/img/control/progressbar.png create mode 100644 app/src/gambas3/img/control/radiobutton.png create mode 100644 app/src/gambas3/img/control/scrollarea.png create mode 100644 app/src/gambas3/img/control/scrollbar.png create mode 100644 app/src/gambas3/img/control/scrollview.png create mode 100644 app/src/gambas3/img/control/select.png create mode 100644 app/src/gambas3/img/control/separator.png create mode 100644 app/src/gambas3/img/control/serialport.png create mode 100644 app/src/gambas3/img/control/serversocket.png create mode 100644 app/src/gambas3/img/control/slider.png create mode 100644 app/src/gambas3/img/control/socket.png create mode 100644 app/src/gambas3/img/control/spinbox.png create mode 100644 app/src/gambas3/img/control/spring.png create mode 100644 app/src/gambas3/img/control/tabstrip.png create mode 100644 app/src/gambas3/img/control/textarea.png create mode 100644 app/src/gambas3/img/control/textbox.png create mode 100644 app/src/gambas3/img/control/textedit.png create mode 100644 app/src/gambas3/img/control/textlabel.png create mode 100644 app/src/gambas3/img/control/timer.png create mode 100644 app/src/gambas3/img/control/togglebutton.png create mode 100644 app/src/gambas3/img/control/toolbutton.png create mode 100644 app/src/gambas3/img/control/trayicon.png create mode 100644 app/src/gambas3/img/control/treeview.png create mode 100644 app/src/gambas3/img/control/udpsocket.png create mode 100644 app/src/gambas3/img/control/unknown.png create mode 100644 app/src/gambas3/img/control/vbox.png create mode 100644 app/src/gambas3/img/control/voidbutton.png create mode 100644 app/src/gambas3/img/control/vpanel.png create mode 100644 app/src/gambas3/img/control/vsplit.png create mode 100644 app/src/gambas3/img/control/webview.png create mode 100644 app/src/gambas3/img/draw/cap-butt.png create mode 100644 app/src/gambas3/img/draw/cap-round.png create mode 100644 app/src/gambas3/img/draw/cap-square.png create mode 100644 app/src/gambas3/img/draw/duplicate.png create mode 100644 app/src/gambas3/img/draw/invert.png create mode 100644 app/src/gambas3/img/draw/join-bevel.png create mode 100644 app/src/gambas3/img/draw/join-miter.png create mode 100644 app/src/gambas3/img/draw/join-round.png create mode 100644 app/src/gambas3/img/draw/move.png create mode 100644 app/src/gambas3/img/draw/offset.png create mode 100644 app/src/gambas3/img/draw/scroll-dark.png create mode 100644 app/src/gambas3/img/draw/scroll.png create mode 100644 app/src/gambas3/img/draw/shgrid.png create mode 100644 app/src/gambas3/img/draw/text.png create mode 100644 app/src/gambas3/img/family/column-invert.png create mode 100644 app/src/gambas3/img/family/column.png create mode 100644 app/src/gambas3/img/family/expand.png create mode 100644 app/src/gambas3/img/family/fill.png create mode 100644 app/src/gambas3/img/family/horizontal-invert.png create mode 100644 app/src/gambas3/img/family/horizontal.png create mode 100644 app/src/gambas3/img/family/hsplit.png create mode 100644 app/src/gambas3/img/family/row-invert.png create mode 100644 app/src/gambas3/img/family/row.png create mode 100644 app/src/gambas3/img/family/vertical-invert.png create mode 100644 app/src/gambas3/img/family/vertical.png create mode 100644 app/src/gambas3/img/family/vsplit.png create mode 100644 app/src/gambas3/img/logo/archlinux.png create mode 100644 app/src/gambas3/img/logo/autotools.png create mode 100644 app/src/gambas3/img/logo/debian.png create mode 100644 app/src/gambas3/img/logo/fedora.png create mode 100644 app/src/gambas3/img/logo/folder.png create mode 100644 app/src/gambas3/img/logo/gambas.svg create mode 100644 app/src/gambas3/img/logo/head-16.png create mode 100644 app/src/gambas3/img/logo/head-256.png create mode 100644 app/src/gambas3/img/logo/head-32.png create mode 100644 app/src/gambas3/img/logo/logo-ide.png create mode 100644 app/src/gambas3/img/logo/logo.png create mode 100644 app/src/gambas3/img/logo/mageia.png create mode 100644 app/src/gambas3/img/logo/mandriva.png create mode 100644 app/src/gambas3/img/logo/package-gnu.png create mode 100644 app/src/gambas3/img/logo/project.png create mode 100644 app/src/gambas3/img/logo/redhat.png create mode 100644 app/src/gambas3/img/logo/self-extractible.png create mode 100644 app/src/gambas3/img/logo/slackware.png create mode 100644 app/src/gambas3/img/logo/suse.png create mode 100644 app/src/gambas3/img/logo/ubuntu.png create mode 100644 app/src/gambas3/img/module/class.png create mode 100644 app/src/gambas3/img/module/form.png create mode 100644 app/src/gambas3/img/module/module.png create mode 100644 app/src/gambas3/img/module/report.png create mode 100644 app/src/gambas3/img/module/termform.png create mode 100644 app/src/gambas3/img/module/test.png create mode 100644 app/src/gambas3/img/module/webform.png create mode 100644 app/src/gambas3/img/module/webpage.png create mode 100644 app/src/gambas3/img/search.png create mode 100644 app/src/gambas3/img/symbol/constant.png create mode 100644 app/src/gambas3/img/symbol/control.png create mode 100644 app/src/gambas3/img/symbol/event.png create mode 100644 app/src/gambas3/img/symbol/method.png create mode 100644 app/src/gambas3/img/symbol/property-ro.png create mode 100644 app/src/gambas3/img/symbol/property.png create mode 100644 app/src/gambas3/img/symbol/s-method.png create mode 100644 app/src/gambas3/img/symbol/s-property-ro.png create mode 100644 app/src/gambas3/img/symbol/s-property.png create mode 100644 app/src/gambas3/img/symbol/s-special.png create mode 100644 app/src/gambas3/img/symbol/s-variable.png create mode 100644 app/src/gambas3/img/symbol/special.png create mode 100644 app/src/gambas3/img/symbol/symbol.png create mode 100644 app/src/gambas3/img/symbol/unknown.png create mode 100644 app/src/gambas3/img/symbol/variable.png create mode 100644 app/src/gambas3/img/waiting.gif create mode 100644 app/src/gambas3/install/Makefile.am create mode 100644 app/src/gambas3/install/acinclude.m4 create mode 100644 app/src/gambas3/install/categories create mode 100644 app/src/gambas3/install/group/archlinux create mode 100644 app/src/gambas3/install/group/autotools create mode 100644 app/src/gambas3/install/group/debian create mode 100644 app/src/gambas3/install/group/fedora create mode 100644 app/src/gambas3/install/group/mageia create mode 100644 app/src/gambas3/install/group/mandriva create mode 100644 app/src/gambas3/install/group/self create mode 100644 app/src/gambas3/install/group/slackware create mode 100644 app/src/gambas3/install/group/suse create mode 100644 app/src/gambas3/install/group/ubuntu create mode 100644 app/src/gambas3/install/menu/archlinux create mode 100644 app/src/gambas3/install/menu/autotools create mode 100644 app/src/gambas3/install/menu/debian create mode 100644 app/src/gambas3/install/menu/fedora create mode 100644 app/src/gambas3/install/menu/mageia create mode 100644 app/src/gambas3/install/menu/mandriva create mode 100644 app/src/gambas3/install/menu/self create mode 100644 app/src/gambas3/install/menu/slackware create mode 100644 app/src/gambas3/install/menu/suse create mode 100644 app/src/gambas3/install/menu/ubuntu create mode 100644 app/src/gambas3/install/slack-desc-header create mode 100644 app/src/gambas3/layout/$compact.layout create mode 100644 app/src/gambas3/layout/$default.layout create mode 100644 app/src/gambas3/license create mode 100644 app/src/gambas3/po-header.txt create mode 100644 app/src/gambas3/pot-header.txt create mode 100644 app/src/gambas3/shortcut.desktop create mode 100644 app/src/gambas3/snippets create mode 100644 app/src/gambas3/support.txt create mode 100644 app/src/gambas3/tags.txt create mode 100644 app/src/gambas3/template/CClass.class create mode 100644 app/src/gambas3/template/CContainer.class create mode 100644 app/src/gambas3/template/CControl.class create mode 100644 app/src/gambas3/template/FMain.class create mode 100644 app/src/gambas3/template/FMain.form create mode 100644 app/src/gambas3/template/FTest.class create mode 100644 app/src/gambas3/template/FTest.form create mode 100644 app/src/gambas3/template/MMain.module create mode 100644 app/src/gambas3/template/MTest.module create mode 100644 app/src/gambas3/template/_project create mode 100644 app/src/gambas3/template/ccontainer.png create mode 100644 app/src/gambas3/template/ccontrol.png create mode 100644 app/src/gambas3/template/list create mode 100644 app/src/gambas3/theme/amber create mode 100644 app/src/gambas3/theme/amethyst create mode 100644 app/src/gambas3/theme/blues create mode 100644 app/src/gambas3/theme/emerald create mode 100644 app/src/gambas3/theme/gambas create mode 100644 app/src/gambas3/theme/obsidian create mode 100644 app/src/gambas3/theme/pastel create mode 100644 app/src/gambas3/theme/quest create mode 100644 app/src/gambas3/theme/quick create mode 100644 app/src/gambas3/theme/ruby create mode 100644 app/src/gambas3/theme/sapphire create mode 100644 app/src/gambas3/theme/visual create mode 100644 app/src/gambas3/theme/zen create mode 100644 app/src/gambas3/tips/tips.ca create mode 100644 app/src/gambas3/tips/tips.cs create mode 100644 app/src/gambas3/tips/tips.de create mode 100644 app/src/gambas3/tips/tips.en create mode 100644 app/src/gambas3/tips/tips.es create mode 100644 app/src/gambas3/tips/tips.fr create mode 100644 app/src/gambas3/tips/tips.it create mode 100644 app/src/gambas3/tips/tips.nl create mode 100644 app/src/gambas3/tips/tips.pl create mode 100644 app/src/gambas3/tips/tips.ru create mode 100644 app/src/gambas3/tips/tips.sl create mode 100644 app/src/gambas3/tips/tips.sv create mode 100644 app/src/gambas3/tips/tips.tr create mode 100644 app/src/gambas3/tips/tips.zh create mode 100644 app/src/gambas3/tips/tips.zh_TW create mode 100644 app/src/gambas3/usage create mode 100644 app/src/gambas3/welcome/bells.mp3 create mode 100644 app/src/gambas3/welcome/border.png create mode 100644 app/src/gambas3/welcome/corner.png create mode 100644 app/src/gambas3/welcome/fir.png create mode 100644 app/src/gambas3/welcome/snowflake.png create mode 100644 app/src/gambas3/welcome/spiritus.mp3 create mode 100644 app/src/gb.wiki/.directory create mode 100644 app/src/gb.wiki/.icon.png create mode 100644 app/src/gb.wiki/.lang/it.po create mode 100644 app/src/gb.wiki/.lang/nl.po create mode 100644 app/src/gb.wiki/.lang/pt_BR.po create mode 100644 app/src/gb.wiki/.lang/ru.po create mode 100644 app/src/gb.wiki/.lang/zh.po create mode 100644 app/src/gb.wiki/.project create mode 100644 app/src/gb.wiki/.src/Actions.module create mode 100644 app/src/gb.wiki/.src/Controllers/Admin.module create mode 100644 app/src/gb.wiki/.src/Controllers/Image.module create mode 100644 app/src/gb.wiki/.src/Controllers/UserManage.module create mode 100644 app/src/gb.wiki/.src/Controllers/Wiki.module create mode 100644 app/src/gb.wiki/.src/DBScheme.class create mode 100644 app/src/gb.wiki/.src/Main.module create mode 100644 app/src/gb.wiki/.src/Models/Comments.module create mode 100644 app/src/gb.wiki/.src/Models/Pages.module create mode 100644 app/src/gb.wiki/.src/Models/Users.module create mode 100644 app/src/gb.wiki/.src/Models/_Page.class create mode 100644 app/src/gb.wiki/.src/Models/_User.class create mode 100644 app/src/gb.wiki/.src/Parser.module create mode 100644 app/src/gb.wiki/.src/Path.module create mode 100644 app/src/gb.wiki/.src/Views/Admin/WAdminMain.class create mode 100644 app/src/gb.wiki/.src/Views/Admin/WAdminMain.webpage create mode 100644 app/src/gb.wiki/.src/Views/WAccount.class create mode 100644 app/src/gb.wiki/.src/Views/WAccount.webpage create mode 100644 app/src/gb.wiki/.src/Views/WEdit.class create mode 100644 app/src/gb.wiki/.src/Views/WEdit.webpage create mode 100644 app/src/gb.wiki/.src/Views/WHeader.class create mode 100644 app/src/gb.wiki/.src/Views/WHeader.webpage create mode 100644 app/src/gb.wiki/.src/Views/WLogin.class create mode 100644 app/src/gb.wiki/.src/Views/WLogin.webpage create mode 100644 app/src/gb.wiki/.src/Views/WWiki.class create mode 100644 app/src/gb.wiki/.src/Views/WWiki.webpage create mode 100644 app/src/gb.wiki/help.png create mode 100644 app/src/gbs3/.directory create mode 100644 app/src/gbs3/.icon.png create mode 100644 app/src/gbs3/.project create mode 100644 app/src/gbs3/.src/CComponent.class create mode 100644 app/src/gbs3/.src/MMain.module create mode 100644 app/src/gbs3/.src/MServerPage.module create mode 100644 app/src/gbs3/icon.png create mode 100644 app/src/gbs3/license create mode 100644 app/src/gbs3/usage-gbs create mode 100644 app/src/gbs3/usage-gbw create mode 100644 app/template/console/.directory create mode 100644 app/template/console/.icon.png create mode 100644 app/template/console/.lang/es.po create mode 100644 app/template/console/.lang/es_ES.po create mode 100644 app/template/console/.lang/fr.po create mode 100644 app/template/console/.lang/ru.po create mode 100644 app/template/console/.project create mode 100644 app/template/console/.src/Main.module create mode 100644 app/template/console/icon.png create mode 100644 app/template/database/.directory create mode 100644 app/template/database/.icon.png create mode 100644 app/template/database/.lang/fr.po create mode 100644 app/template/database/.lang/ru.po create mode 100644 app/template/database/.project create mode 100644 app/template/database/.src/FMain.class create mode 100644 app/template/database/.src/FMain.form create mode 100644 app/template/database/icon.png create mode 100644 app/template/graphical/.directory create mode 100644 app/template/graphical/.icon.png create mode 100644 app/template/graphical/.lang/es.po create mode 100644 app/template/graphical/.lang/es_ES.po create mode 100644 app/template/graphical/.lang/fr.po create mode 100644 app/template/graphical/.lang/ru.po create mode 100644 app/template/graphical/.project create mode 100644 app/template/graphical/.src/FMain.class create mode 100644 app/template/graphical/.src/FMain.form create mode 100644 app/template/graphical/icon.png create mode 100644 app/template/gtk2/.directory create mode 100644 app/template/gtk2/.icon.png create mode 100644 app/template/gtk2/.lang/es.po create mode 100644 app/template/gtk2/.lang/es_ES.po create mode 100644 app/template/gtk2/.lang/fr.po create mode 100644 app/template/gtk2/.lang/ru.po create mode 100644 app/template/gtk2/.project create mode 100644 app/template/gtk2/.src/FMain.class create mode 100644 app/template/gtk2/.src/FMain.form create mode 100644 app/template/gtk2/icon.png create mode 100644 app/template/gtk3/.directory create mode 100644 app/template/gtk3/.icon.png create mode 100644 app/template/gtk3/.lang/es.po create mode 100644 app/template/gtk3/.lang/fr.po create mode 100644 app/template/gtk3/.lang/ru.po create mode 100644 app/template/gtk3/.project create mode 100644 app/template/gtk3/.src/FMain.class create mode 100644 app/template/gtk3/.src/FMain.form create mode 100644 app/template/gtk3/icon.png create mode 100644 app/template/qt/.directory create mode 100644 app/template/qt/.icon.png create mode 100644 app/template/qt/.lang/es.po create mode 100644 app/template/qt/.lang/es_ES.po create mode 100644 app/template/qt/.lang/fr.po create mode 100644 app/template/qt/.lang/ru.po create mode 100644 app/template/qt/.project create mode 100644 app/template/qt/.src/FMain.class create mode 100644 app/template/qt/.src/FMain.form create mode 100644 app/template/qt/icon.png create mode 100644 app/template/sdl/.directory create mode 100644 app/template/sdl/.icon.png create mode 100644 app/template/sdl/.lang/es.po create mode 100644 app/template/sdl/.lang/es_ES.po create mode 100644 app/template/sdl/.lang/fr.po create mode 100644 app/template/sdl/.lang/ru.po create mode 100644 app/template/sdl/.project create mode 100644 app/template/sdl/.src/MMain.module create mode 100644 app/template/sdl/icon.png create mode 100644 app/template/web/.directory create mode 100644 app/template/web/.icon.png create mode 100644 app/template/web/.lang/es.po create mode 100644 app/template/web/.lang/es_ES.po create mode 100644 app/template/web/.lang/fr.po create mode 100644 app/template/web/.lang/ru.po create mode 100644 app/template/web/.project create mode 100644 app/template/web/.src/Main.class create mode 100644 app/template/web/.src/Main.webpage create mode 100644 app/template/web/icon.png create mode 100644 app/template/webform/.directory create mode 100644 app/template/webform/.icon.png create mode 100644 app/template/webform/.lang/fr.po create mode 100644 app/template/webform/.lang/ru.po create mode 100644 app/template/webform/.project create mode 100644 app/template/webform/.src/Webform1.class create mode 100644 app/template/webform/.src/Webform1.webform create mode 100644 app/template/webform/icon.png create mode 100644 app/template/~subversion/.directory create mode 100644 app/template/~subversion/.icon.png create mode 100644 app/template/~subversion/.lang/es.po create mode 100644 app/template/~subversion/.lang/es_ES.po create mode 100644 app/template/~subversion/.lang/fr.po create mode 100644 app/template/~subversion/.lang/ru.po create mode 100644 app/template/~subversion/.project create mode 100644 app/template/~subversion/.src/Main.module create mode 100644 app/template/~subversion/icon.png create mode 100755 benchmark/benchmark.gbs create mode 100755 benchmark/mandelbrot.gbs create mode 100755 benchmark/mandelbrot.pl create mode 100755 benchmark/mandelbrot.py create mode 100755 benchmark/nbody.gbs create mode 100755 benchmark/nbody.pl create mode 100755 benchmark/nbody.py create mode 100755 benchmark/polynom.gbs create mode 100755 benchmark/polynom.pl create mode 100755 benchmark/polynom.py create mode 100755 benchmark/primes.gbs create mode 100755 benchmark/primes.pl create mode 100755 benchmark/primes.py create mode 100755 benchmark/sort.gbs create mode 100755 benchmark/sort.pl create mode 100755 benchmark/sort.py create mode 100755 benchmark/string.gbs create mode 100755 benchmark/string.pl create mode 100755 benchmark/string.py create mode 100755 benchmark/string2.gbs create mode 100755 benchmark/string2.pl create mode 100755 benchmark/string2.py create mode 100755 build-dist create mode 100644 comp/AUTHORS create mode 120000 comp/COPYING create mode 100644 comp/ChangeLog create mode 100644 comp/INSTALL create mode 100644 comp/Makefile.am create mode 100644 comp/NEWS create mode 100644 comp/README create mode 100644 comp/TODO create mode 120000 comp/acinclude.m4 create mode 100644 comp/configure.ac create mode 120000 comp/reconf create mode 100644 comp/src/gb.args/.component create mode 100644 comp/src/gb.args/.directory create mode 100644 comp/src/gb.args/.icon.png create mode 100644 comp/src/gb.args/.lang/cs.po create mode 100644 comp/src/gb.args/.lang/es.po create mode 100644 comp/src/gb.args/.lang/es_ES.po create mode 100644 comp/src/gb.args/.lang/fr.po create mode 100644 comp/src/gb.args/.lang/it.po create mode 100644 comp/src/gb.args/.lang/nl.po create mode 100644 comp/src/gb.args/.lang/pt_BR.po create mode 100644 comp/src/gb.args/.lang/ru.po create mode 100644 comp/src/gb.args/.lang/zh.po create mode 100644 comp/src/gb.args/.project create mode 100644 comp/src/gb.args/.src/Args.module create mode 100644 comp/src/gb.args/.src/MMain.module create mode 100644 comp/src/gb.chart/.component create mode 100644 comp/src/gb.chart/.directory create mode 100644 comp/src/gb.chart/.icon.png create mode 100644 comp/src/gb.chart/.project create mode 100644 comp/src/gb.chart/.src/CPoint.class create mode 100644 comp/src/gb.chart/.src/CRect.class create mode 100644 comp/src/gb.chart/.src/Chart.class create mode 100644 comp/src/gb.chart/.src/ChartStyle.class create mode 100644 comp/src/gb.chart/.src/ChartType.class create mode 100644 comp/src/gb.chart/.src/FTest.class create mode 100644 comp/src/gb.chart/.src/FTest.form create mode 100644 comp/src/gb.chart/.src/FTest2.class create mode 100644 comp/src/gb.chart/.src/FTest2.form create mode 100644 comp/src/gb.chart/.src/MTools.module create mode 100644 comp/src/gb.chart/.src/Styles/_CSerie.class create mode 100644 comp/src/gb.chart/.src/Styles/_CStyleAreas.class create mode 100644 comp/src/gb.chart/.src/Styles/_CStyleBar.class create mode 100644 comp/src/gb.chart/.src/Styles/_CStyleColumns.class create mode 100644 comp/src/gb.chart/.src/Styles/_CStyleLine.class create mode 100644 comp/src/gb.chart/.src/Styles/_CStylePie.class create mode 100644 comp/src/gb.chart/.src/Styles/_CStylePlot.class create mode 100644 comp/src/gb.chart/.src/_CAxes.class create mode 100644 comp/src/gb.chart/.src/_CHeaders.class create mode 100644 comp/src/gb.chart/.src/_CLabel.class create mode 100644 comp/src/gb.chart/.src/_CLabels.class create mode 100644 comp/src/gb.chart/.src/_CLegend.class create mode 100644 comp/src/gb.chart/.src/_CTitle.class create mode 100644 comp/src/gb.chart/.src/_CXAxe.class create mode 100644 comp/src/gb.chart/.src/_CYAxe.class create mode 100644 comp/src/gb.chart/.src/_Colors.class create mode 100644 comp/src/gb.chart/img/areas.png create mode 100644 comp/src/gb.chart/img/areasnormal.png create mode 100644 comp/src/gb.chart/img/areaspercent.png create mode 100644 comp/src/gb.chart/img/areasstacked.png create mode 100644 comp/src/gb.chart/img/bars.png create mode 100644 comp/src/gb.chart/img/barsnormal.png create mode 100644 comp/src/gb.chart/img/barspercent.png create mode 100644 comp/src/gb.chart/img/barsstacked.png create mode 100644 comp/src/gb.chart/img/columns.png create mode 100644 comp/src/gb.chart/img/columnslinecombination.png create mode 100644 comp/src/gb.chart/img/columnsnormal.png create mode 100644 comp/src/gb.chart/img/columnspercent.png create mode 100644 comp/src/gb.chart/img/columnsstacked.png create mode 100644 comp/src/gb.chart/img/lines.png create mode 100644 comp/src/gb.chart/img/linesnormal.png create mode 100644 comp/src/gb.chart/img/linespercent.png create mode 100644 comp/src/gb.chart/img/linesstacked.png create mode 100644 comp/src/gb.chart/img/linessymbols.png create mode 100644 comp/src/gb.chart/img/net.png create mode 100644 comp/src/gb.chart/img/pie.png create mode 100644 comp/src/gb.chart/img/pienormal.png create mode 100644 comp/src/gb.chart/img/pieoffset1.png create mode 100644 comp/src/gb.chart/img/pieoffset2.png create mode 100644 comp/src/gb.chart/img/pierings.png create mode 100644 comp/src/gb.chart/img/plots.png create mode 100644 comp/src/gb.chart/img/plotsnormal.png create mode 100644 comp/src/gb.chart/img/stockchart.png create mode 100644 comp/src/gb.db.form/.component create mode 100644 comp/src/gb.db.form/.connection/Connection1.connection create mode 100644 comp/src/gb.db.form/.connection/Connection2.connection create mode 100644 comp/src/gb.db.form/.connection/Connection3.connection create mode 100644 comp/src/gb.db.form/.connection/Connection4.connection create mode 100644 comp/src/gb.db.form/.directory create mode 100644 comp/src/gb.db.form/.hidden/control/databrowser.png create mode 100644 comp/src/gb.db.form/.hidden/control/datacheckbox.png create mode 100644 comp/src/gb.db.form/.hidden/control/datacombo.png create mode 100644 comp/src/gb.db.form/.hidden/control/datacomboview.png create mode 100644 comp/src/gb.db.form/.hidden/control/datacontrol.png create mode 100644 comp/src/gb.db.form/.hidden/control/datasource.png create mode 100644 comp/src/gb.db.form/.hidden/control/dataview.png create mode 100644 comp/src/gb.db.form/.icon.png create mode 100644 comp/src/gb.db.form/.lang/ca.po create mode 100644 comp/src/gb.db.form/.lang/cs.po create mode 100644 comp/src/gb.db.form/.lang/de.po create mode 100644 comp/src/gb.db.form/.lang/es.po create mode 100644 comp/src/gb.db.form/.lang/es_ES.po create mode 100644 comp/src/gb.db.form/.lang/fr.po create mode 100644 comp/src/gb.db.form/.lang/it.po create mode 100644 comp/src/gb.db.form/.lang/nl.po create mode 100644 comp/src/gb.db.form/.lang/pt_BR.po create mode 100644 comp/src/gb.db.form/.lang/ru.po create mode 100644 comp/src/gb.db.form/.lang/sv.po create mode 100644 comp/src/gb.db.form/.lang/zh.po create mode 100644 comp/src/gb.db.form/.project create mode 100644 comp/src/gb.db.form/.src/Common.module create mode 100644 comp/src/gb.db.form/.src/DataBrowser.class create mode 100644 comp/src/gb.db.form/.src/DataCheckBox.class create mode 100644 comp/src/gb.db.form/.src/DataCombo.class create mode 100644 comp/src/gb.db.form/.src/DataComboView.class create mode 100644 comp/src/gb.db.form/.src/DataConnection.class create mode 100644 comp/src/gb.db.form/.src/DataControl.class create mode 100644 comp/src/gb.db.form/.src/DataField.class create mode 100644 comp/src/gb.db.form/.src/DataSource.class create mode 100644 comp/src/gb.db.form/.src/DataTable.class create mode 100644 comp/src/gb.db.form/.src/DataTree.class create mode 100644 comp/src/gb.db.form/.src/DataView.class create mode 100644 comp/src/gb.db.form/.src/FBlobEditor.class create mode 100644 comp/src/gb.db.form/.src/FBlobEditor.form create mode 100644 comp/src/gb.db.form/.src/FBrowser.class create mode 100644 comp/src/gb.db.form/.src/FBrowser.form create mode 100644 comp/src/gb.db.form/.src/Test/FMain.class create mode 100644 comp/src/gb.db.form/.src/Test/FMain.form create mode 100644 comp/src/gb.db.form/.src/Test/FMain2.class create mode 100644 comp/src/gb.db.form/.src/Test/FMain2.form create mode 100644 comp/src/gb.db.form/.src/Test/FMain3.class create mode 100644 comp/src/gb.db.form/.src/Test/FMain3.form create mode 100644 comp/src/gb.db.form/.src/Test/FTest.class create mode 100644 comp/src/gb.db.form/.src/Test/FTest.form create mode 100644 comp/src/gb.db.form/.src/Test/Main.module create mode 100644 comp/src/gb.dbus.trayicon/.component create mode 100644 comp/src/gb.dbus.trayicon/.directory create mode 100644 comp/src/gb.dbus.trayicon/.hidden/com.canonical.dbusmenu.xml create mode 100644 comp/src/gb.dbus.trayicon/.hidden/doc.txt create mode 100644 comp/src/gb.dbus.trayicon/.icon.png create mode 100644 comp/src/gb.dbus.trayicon/.project create mode 100644 comp/src/gb.dbus.trayicon/.src/DBusStatusIcon.class create mode 100644 comp/src/gb.dbus.trayicon/.src/DBusStatusIconMenu.class create mode 100644 comp/src/gb.dbus.trayicon/.src/FMain.class create mode 100644 comp/src/gb.dbus.trayicon/.src/FMain.form create mode 100644 comp/src/gb.dbus.trayicon/.src/FTest.class create mode 100644 comp/src/gb.dbus.trayicon/.src/FTest.form create mode 100644 comp/src/gb.dbus.trayicon/.src/Main.module create mode 100644 comp/src/gb.dbus.trayicon/.src/TrayIcon.class create mode 100644 comp/src/gb.dbus.trayicon/.src/TrayIcons.class create mode 100644 comp/src/gb.dbus.trayicon/.src/_DBusMenuItem.class create mode 100644 comp/src/gb.dbus.trayicon/.src/_DBusMenuLayout.class create mode 100644 comp/src/gb.dbus.trayicon/.src/_DBusMenuProperties.class create mode 100644 comp/src/gb.dbus.trayicon/.src/_DBusStatusIconPixmap.class create mode 100644 comp/src/gb.dbus.trayicon/.src/_DBusStatusIconTooltip.class create mode 100644 comp/src/gb.dbus.trayicon/.src/_DBusUInt.class create mode 100644 comp/src/gb.dbus.trayicon/default.png create mode 100644 comp/src/gb.desktop/.component create mode 100644 comp/src/gb.desktop/.directory create mode 100644 comp/src/gb.desktop/.hidden/control/desktopwatcher.png create mode 100644 comp/src/gb.desktop/.hidden/xdg-utils-1.0.2/LICENSE create mode 100644 comp/src/gb.desktop/.hidden/xdg-utils-1.0.2/scripts/README create mode 100755 comp/src/gb.desktop/.hidden/xdg-utils-1.0.2/scripts/xdg-desktop-icon create mode 100755 comp/src/gb.desktop/.hidden/xdg-utils-1.0.2/scripts/xdg-desktop-menu create mode 100755 comp/src/gb.desktop/.hidden/xdg-utils-1.0.2/scripts/xdg-email create mode 100755 comp/src/gb.desktop/.hidden/xdg-utils-1.0.2/scripts/xdg-icon-resource create mode 100755 comp/src/gb.desktop/.hidden/xdg-utils-1.0.2/scripts/xdg-mime create mode 100755 comp/src/gb.desktop/.hidden/xdg-utils-1.0.2/scripts/xdg-open create mode 100755 comp/src/gb.desktop/.hidden/xdg-utils-1.0.2/scripts/xdg-screensaver create mode 100644 comp/src/gb.desktop/.hidden/xdg-utils-1.0.3.pre.patch/xdg-email create mode 100644 comp/src/gb.desktop/.hidden/xdg-utils-1.0.3.pre/xdg-copy create mode 100644 comp/src/gb.desktop/.hidden/xdg-utils-1.0.3.pre/xdg-desktop-icon create mode 100644 comp/src/gb.desktop/.hidden/xdg-utils-1.0.3.pre/xdg-desktop-menu create mode 100644 comp/src/gb.desktop/.hidden/xdg-utils-1.0.3.pre/xdg-email create mode 100644 comp/src/gb.desktop/.hidden/xdg-utils-1.0.3.pre/xdg-file-dialog create mode 100644 comp/src/gb.desktop/.hidden/xdg-utils-1.0.3.pre/xdg-icon-resource create mode 100644 comp/src/gb.desktop/.hidden/xdg-utils-1.0.3.pre/xdg-mime create mode 100644 comp/src/gb.desktop/.hidden/xdg-utils-1.0.3.pre/xdg-open create mode 100644 comp/src/gb.desktop/.hidden/xdg-utils-1.0.3.pre/xdg-screensaver create mode 100644 comp/src/gb.desktop/.hidden/xdg-utils-1.0.3.pre/xdg-settings create mode 100644 comp/src/gb.desktop/.hidden/xdg-utils-1.0.3.pre/xdg-su create mode 100644 comp/src/gb.desktop/.hidden/xdg-utils-1.0.3.pre/xdg-terminal create mode 100644 comp/src/gb.desktop/.icon.png create mode 100644 comp/src/gb.desktop/.project create mode 100644 comp/src/gb.desktop/.src/Atom.class create mode 100644 comp/src/gb.desktop/.src/Desktop.class create mode 100644 comp/src/gb.desktop/.src/DesktopFile.class create mode 100644 comp/src/gb.desktop/.src/DesktopMime.class create mode 100644 comp/src/gb.desktop/.src/DesktopWatcher.class create mode 100644 comp/src/gb.desktop/.src/DesktopWindow.class create mode 100644 comp/src/gb.desktop/.src/Main.module create mode 100644 comp/src/gb.desktop/.src/Tests/Form1.class create mode 100644 comp/src/gb.desktop/.src/Tests/Form1.form create mode 100644 comp/src/gb.desktop/.src/Tests/Form11.class create mode 100644 comp/src/gb.desktop/.src/Tests/Form11.form create mode 100644 comp/src/gb.desktop/.src/Tests/Form2.class create mode 100644 comp/src/gb.desktop/.src/Tests/Form2.form create mode 100644 comp/src/gb.desktop/.src/Tests/Module1.module create mode 100644 comp/src/gb.desktop/.src/_DesktopIcons.class create mode 100644 comp/src/gb.desktop/.src/_DesktopMenus.class create mode 100644 comp/src/gb.desktop/.src/_DesktopVirtual.class create mode 100644 comp/src/gb.desktop/.src/_Desktop_Passwords.class create mode 100644 comp/src/gb.desktop/.src/_Desktop_ScreenSaver.class create mode 100644 comp/src/gb.desktop/.src/_Desktop_Windows.class create mode 100755 comp/src/gb.desktop/xdg-utils/xdg-desktop-icon create mode 100755 comp/src/gb.desktop/xdg-utils/xdg-desktop-menu create mode 100755 comp/src/gb.desktop/xdg-utils/xdg-email create mode 100755 comp/src/gb.desktop/xdg-utils/xdg-icon-resource create mode 100755 comp/src/gb.desktop/xdg-utils/xdg-mime create mode 100755 comp/src/gb.desktop/xdg-utils/xdg-open create mode 100755 comp/src/gb.desktop/xdg-utils/xdg-screensaver create mode 100755 comp/src/gb.desktop/xdg-utils/xdg-settings create mode 100644 comp/src/gb.eval.highlight/.component create mode 100644 comp/src/gb.eval.highlight/.directory create mode 100644 comp/src/gb.eval.highlight/.icon.png create mode 100644 comp/src/gb.eval.highlight/.project create mode 100644 comp/src/gb.eval.highlight/.src/Init.module create mode 100644 comp/src/gb.eval.highlight/.src/Main.module create mode 100644 comp/src/gb.eval.highlight/.src/OldHighlighter/Helper.module create mode 100644 comp/src/gb.eval.highlight/.src/OldHighlighter/Highlight.class create mode 100644 comp/src/gb.eval.highlight/.src/OldHighlighter/HighlightC.module create mode 100644 comp/src/gb.eval.highlight/.src/OldHighlighter/HighlightCPlusPlus.module create mode 100644 comp/src/gb.eval.highlight/.src/OldHighlighter/HighlightCSS.module create mode 100644 comp/src/gb.eval.highlight/.src/OldHighlighter/HighlightDiff.module create mode 100644 comp/src/gb.eval.highlight/.src/OldHighlighter/HighlightHTML.module create mode 100644 comp/src/gb.eval.highlight/.src/OldHighlighter/HighlightJavascript.module create mode 100644 comp/src/gb.eval.highlight/.src/OldHighlighter/HighlightSQL.module create mode 100644 comp/src/gb.eval.highlight/.src/TextHighlighter.class create mode 100644 comp/src/gb.eval.highlight/.src/TextHighlighterStyle.class create mode 100644 comp/src/gb.eval.highlight/.src/TextHighlighter_C.class create mode 100644 comp/src/gb.eval.highlight/.src/TextHighlighter_CPlusPlus.class create mode 100644 comp/src/gb.eval.highlight/.src/TextHighlighter_CSS.class create mode 100644 comp/src/gb.eval.highlight/.src/TextHighlighter_Diff.class create mode 100644 comp/src/gb.eval.highlight/.src/TextHighlighter_Gambas.class create mode 100644 comp/src/gb.eval.highlight/.src/TextHighlighter_Html.class create mode 100644 comp/src/gb.eval.highlight/.src/TextHighlighter_Javascript.class create mode 100644 comp/src/gb.eval.highlight/.src/TextHighlighter_SQL.class create mode 100644 comp/src/gb.eval.highlight/.src/TextHighlighter_WebPage.class create mode 100644 comp/src/gb.eval.highlight/css/properties create mode 100644 comp/src/gb.eval.highlight/css/values create mode 100644 comp/src/gb.eval.highlight/sql/datatypes create mode 100644 comp/src/gb.eval.highlight/sql/functions create mode 100644 comp/src/gb.eval.highlight/sql/keywords create mode 100644 comp/src/gb.eval.highlight/sql/operators create mode 100644 comp/src/gb.form.dialog/.component create mode 100644 comp/src/gb.form.dialog/.directory create mode 100644 comp/src/gb.form.dialog/.icon.png create mode 100644 comp/src/gb.form.dialog/.lang/ca.po create mode 100644 comp/src/gb.form.dialog/.lang/cs.po create mode 100644 comp/src/gb.form.dialog/.lang/de.po create mode 100644 comp/src/gb.form.dialog/.lang/es.po create mode 100644 comp/src/gb.form.dialog/.lang/es_ES.po create mode 100644 comp/src/gb.form.dialog/.lang/fr.po create mode 100644 comp/src/gb.form.dialog/.lang/it.po create mode 100644 comp/src/gb.form.dialog/.lang/ja.po create mode 100644 comp/src/gb.form.dialog/.lang/nl.po create mode 100644 comp/src/gb.form.dialog/.lang/pt_BR.po create mode 100644 comp/src/gb.form.dialog/.lang/ru.po create mode 100644 comp/src/gb.form.dialog/.lang/sv.po create mode 100644 comp/src/gb.form.dialog/.lang/zh.po create mode 100644 comp/src/gb.form.dialog/.project create mode 100644 comp/src/gb.form.dialog/.src/Dialog.class create mode 100644 comp/src/gb.form.dialog/.src/FAskPassword.class create mode 100644 comp/src/gb.form.dialog/.src/FAskPassword.form create mode 100644 comp/src/gb.form.dialog/.src/FDirDialog.class create mode 100644 comp/src/gb.form.dialog/.src/FDirDialog.form create mode 100644 comp/src/gb.form.dialog/.src/FFileDialog.class create mode 100644 comp/src/gb.form.dialog/.src/FFileDialog.form create mode 100644 comp/src/gb.form.dialog/.src/FFontDialog.class create mode 100644 comp/src/gb.form.dialog/.src/FFontDialog.form create mode 100644 comp/src/gb.form.dialog/.src/FInputDate.class create mode 100644 comp/src/gb.form.dialog/.src/FInputDate.form create mode 100644 comp/src/gb.form.dialog/.src/Main.module create mode 100644 comp/src/gb.form.editor/.component create mode 100644 comp/src/gb.form.editor/.directory create mode 100644 comp/src/gb.form.editor/.hidden/CHANGELOG create mode 100644 comp/src/gb.form.editor/.hidden/control/texteditor.png create mode 100644 comp/src/gb.form.editor/.icon.png create mode 100644 comp/src/gb.form.editor/.project create mode 100644 comp/src/gb.form.editor/.src/CCommand.class create mode 100644 comp/src/gb.form.editor/.src/CCommandBefore.class create mode 100644 comp/src/gb.form.editor/.src/CDocument.class create mode 100644 comp/src/gb.form.editor/.src/CLineInfo.class create mode 100644 comp/src/gb.form.editor/.src/FFind.class create mode 100644 comp/src/gb.form.editor/.src/FFind.form create mode 100644 comp/src/gb.form.editor/.src/Helper.module create mode 100644 comp/src/gb.form.editor/.src/Main.module create mode 100644 comp/src/gb.form.editor/.src/TextEditor.class create mode 100644 comp/src/gb.form.editor/.src/TextEditorMode.class create mode 100644 comp/src/gb.form.editor/.src/TextEditorMode_CSS.class create mode 100644 comp/src/gb.form.editor/.src/TextEditorMode_Gambas.class create mode 100644 comp/src/gb.form.editor/.src/TextEditorMode_HTML.class create mode 100644 comp/src/gb.form.editor/.src/TextEditorMode_Javascript.class create mode 100644 comp/src/gb.form.editor/.src/TextEditorMode_SQL.class create mode 100644 comp/src/gb.form.editor/.src/TextEditorMode_WebPage.class create mode 100644 comp/src/gb.form.editor/.src/TextEditorStyle.class create mode 100644 comp/src/gb.form.editor/.src/_TextEditor_Line.class create mode 100644 comp/src/gb.form.editor/.src/_TextEditor_Rows.class create mode 100644 comp/src/gb.form.editor/.src/_TextEditor_State.class create mode 100644 comp/src/gb.form.editor/.src/_TextEditor_Styles.class create mode 100644 comp/src/gb.form.editor/.src/test/FTest.class create mode 100644 comp/src/gb.form.editor/.src/test/FTest.form create mode 100644 comp/src/gb.form.editor/.src/test/FTestEditor.class create mode 100644 comp/src/gb.form.editor/.src/test/FTestEditor.form create mode 100644 comp/src/gb.form.editor/Text1 create mode 100644 comp/src/gb.form.editor/test.html create mode 100644 comp/src/gb.form.mdi/.component create mode 100644 comp/src/gb.form.mdi/.directory create mode 100644 comp/src/gb.form.mdi/.hidden/control/toolbar.png create mode 100644 comp/src/gb.form.mdi/.hidden/control/workspace.png create mode 100644 comp/src/gb.form.mdi/.icon.png create mode 100644 comp/src/gb.form.mdi/.lang/ca.po create mode 100644 comp/src/gb.form.mdi/.lang/cs.po create mode 100644 comp/src/gb.form.mdi/.lang/de.po create mode 100644 comp/src/gb.form.mdi/.lang/es.po create mode 100644 comp/src/gb.form.mdi/.lang/es_ES.po create mode 100644 comp/src/gb.form.mdi/.lang/fr.po create mode 100644 comp/src/gb.form.mdi/.lang/it.po create mode 100644 comp/src/gb.form.mdi/.lang/ja.po create mode 100644 comp/src/gb.form.mdi/.lang/nl.po create mode 100644 comp/src/gb.form.mdi/.lang/pt_BR.po create mode 100644 comp/src/gb.form.mdi/.lang/ru.po create mode 100644 comp/src/gb.form.mdi/.lang/sv.po create mode 100644 comp/src/gb.form.mdi/.lang/zh.po create mode 100644 comp/src/gb.form.mdi/.project create mode 100644 comp/src/gb.form.mdi/.src/Action/Action.class create mode 100644 comp/src/gb.form.mdi/.src/Action/CAction.class create mode 100644 comp/src/gb.form.mdi/.src/Action/MAction.module create mode 100644 comp/src/gb.form.mdi/.src/MMain.module create mode 100644 comp/src/gb.form.mdi/.src/Shortcut/FShortcut.class create mode 100644 comp/src/gb.form.mdi/.src/Shortcut/FShortcut.form create mode 100644 comp/src/gb.form.mdi/.src/Shortcut/FShortcutEditor.class create mode 100644 comp/src/gb.form.mdi/.src/Shortcut/FShortcutEditor.form create mode 100644 comp/src/gb.form.mdi/.src/Tests/FMain.class create mode 100644 comp/src/gb.form.mdi/.src/Tests/FMain.form create mode 100644 comp/src/gb.form.mdi/.src/Tests/FMain1.class create mode 100644 comp/src/gb.form.mdi/.src/Tests/FMain1.form create mode 100644 comp/src/gb.form.mdi/.src/Tests/FMain2.class create mode 100644 comp/src/gb.form.mdi/.src/Tests/FMain2.form create mode 100644 comp/src/gb.form.mdi/.src/Tests/FTestSidePanel.class create mode 100644 comp/src/gb.form.mdi/.src/Tests/FTestSidePanel.form create mode 100644 comp/src/gb.form.mdi/.src/Tests/Form1.class create mode 100644 comp/src/gb.form.mdi/.src/Tests/Form1.form create mode 100644 comp/src/gb.form.mdi/.src/Tests/Form2.class create mode 100644 comp/src/gb.form.mdi/.src/Tests/Form2.form create mode 100644 comp/src/gb.form.mdi/.src/ToolBar/CToolbar.class create mode 100644 comp/src/gb.form.mdi/.src/ToolBar/FToolBar.class create mode 100644 comp/src/gb.form.mdi/.src/ToolBar/FToolBar.form create mode 100644 comp/src/gb.form.mdi/.src/ToolBar/FToolBarConfig.class create mode 100644 comp/src/gb.form.mdi/.src/ToolBar/FToolBarConfig.form create mode 100644 comp/src/gb.form.mdi/.src/ToolBar/ToolBar.class create mode 100644 comp/src/gb.form.mdi/.src/ToolBar/ToolBarExpander.class create mode 100644 comp/src/gb.form.mdi/.src/Workspace/CWindow.class create mode 100644 comp/src/gb.form.mdi/.src/Workspace/FWorkspace.class create mode 100644 comp/src/gb.form.mdi/.src/Workspace/FWorkspace.form create mode 100644 comp/src/gb.form.mdi/.src/Workspace/Workspace.class create mode 100644 comp/src/gb.form.mdi/70a017.png create mode 100644 comp/src/gb.form.mdi/control/buttonbox.png create mode 100644 comp/src/gb.form.mdi/control/combobox.png create mode 100644 comp/src/gb.form.mdi/control/datebox.png create mode 100644 comp/src/gb.form.mdi/control/valuebox.png create mode 100644 comp/src/gb.form.mdi/img/close.png create mode 100644 comp/src/gb.form.mdi/img/configure.png create mode 100644 comp/src/gb.form.mdi/img/configure_dark.png create mode 100644 comp/src/gb.form.mdi/img/expander.png create mode 100644 comp/src/gb.form.mdi/img/handle-v.png create mode 100644 comp/src/gb.form.mdi/img/handle.png create mode 100644 comp/src/gb.form.mdi/img/hash.png create mode 100644 comp/src/gb.form.mdi/img/roll.png create mode 100644 comp/src/gb.form.mdi/img/separator.png create mode 100644 comp/src/gb.form.mdi/img/space.png create mode 100644 comp/src/gb.form.mdi/img/unroll.png create mode 100644 comp/src/gb.form.print/.component create mode 100644 comp/src/gb.form.print/.directory create mode 100644 comp/src/gb.form.print/.hidden/printer.png create mode 100644 comp/src/gb.form.print/.icon.png create mode 100644 comp/src/gb.form.print/.lang/es.po create mode 100644 comp/src/gb.form.print/.lang/es_ES.po create mode 100644 comp/src/gb.form.print/.lang/fr.po create mode 100644 comp/src/gb.form.print/.lang/it.po create mode 100644 comp/src/gb.form.print/.lang/nl.po create mode 100644 comp/src/gb.form.print/.lang/pt_BR.po create mode 100644 comp/src/gb.form.print/.lang/ru.po create mode 100644 comp/src/gb.form.print/.project create mode 100644 comp/src/gb.form.print/.src/FPreview.class create mode 100644 comp/src/gb.form.print/.src/FPreview.form create mode 100644 comp/src/gb.form.print/.src/FPrinting.class create mode 100644 comp/src/gb.form.print/.src/FPrinting.form create mode 100644 comp/src/gb.form.print/.src/MTest.module create mode 100644 comp/src/gb.form.print/.src/Printer.class create mode 100644 comp/src/gb.form.print/img/print-full-width.png create mode 100644 comp/src/gb.form.print/img/print-one-page.png create mode 100644 comp/src/gb.form.print/img/print-real-size.png create mode 100644 comp/src/gb.form.print/img/print-two-pages.png create mode 100644 comp/src/gb.form.print/molly-malone.txt create mode 100644 comp/src/gb.form.stock/.component create mode 100644 comp/src/gb.form.stock/.directory create mode 100644 comp/src/gb.form.stock/.hidden/CHANGELOG create mode 100644 comp/src/gb.form.stock/.hidden/earth.png create mode 100644 comp/src/gb.form.stock/.hidden/goutte.png create mode 100644 comp/src/gb.form.stock/.hidden/map create mode 100644 comp/src/gb.form.stock/.icon.png create mode 100644 comp/src/gb.form.stock/.project create mode 100644 comp/src/gb.form.stock/.src/Main.module create mode 100644 comp/src/gb.form.stock/.src/_DefaultStock.class create mode 100644 comp/src/gb.form.stock/gambas-mono/128/delete.png create mode 100644 comp/src/gb.form.stock/gambas-mono/128/error.png create mode 100644 comp/src/gb.form.stock/gambas-mono/128/gambas.png create mode 100644 comp/src/gb.form.stock/gambas-mono/128/info.png create mode 100644 comp/src/gb.form.stock/gambas-mono/128/question.png create mode 100644 comp/src/gb.form.stock/gambas-mono/128/warning.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/access.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/add.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/align-bottom.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/align-center.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/align-height.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/align-left.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/align-middle.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/align-right.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/align-top.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/align-width.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/apply.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/archive.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/attach.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/audio.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/battery.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/blue.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/blur.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/book.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/bookmark.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/bottom.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/brightness.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/c.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/calculator.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/calendar.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/call.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/camera.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/cancel.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/cdrom.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/clear-rtl.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/clear.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/clock.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/close.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/color-picker.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/color.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/component.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/computer.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/connect.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/contrast.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/copy.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/cpp.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/crop.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/css.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/cut.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/database.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/delete.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/desktop.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/development.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/difference.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/directory.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/disconnect.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/down.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/download.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/draw-circle.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/draw-line.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/draw-path.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/draw-rectangle.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/draw-text.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/earth.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/edit.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/eject.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/end.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/erase.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/error.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/exclusive.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/exec.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/file-manager.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/file.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/fill.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/filter.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/find.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/first.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/flag.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/flip-h.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/flip-v.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/floppy.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/font.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/forward.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/fullscreen.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/gambas.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/game.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/gamma.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/gnu.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/green.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/grid.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/group.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/h.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/halt.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/harddisk.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/hardware.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/help.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/home.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/html.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/hue.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/identity.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/image.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/important.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/indent.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/info.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/insert-image.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/insert-link.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/insert-text.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/internet.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/intersection.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/js.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/jump.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/key.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/keyboard.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/lamp.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/language.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/last.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/layout.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/left.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/lightness.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/link.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/linux.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/lock.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/lower.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/mail.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/make-all.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/make.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/media-player.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/menu.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/microphone.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/monitor.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/mouse.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/multimedia.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/muted.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/network.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/new-dir.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/new-tab.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/new-tag.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/new-window.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/new.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/next.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/office-calc.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/office-draw.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/office.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/ok.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/opacity.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/open-recent.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/open.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/options.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/package.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/paste.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/pause.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/pda.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/pdf.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/pen.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/people.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/phone.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/play.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/plugin.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/preview.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/previous.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/print.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/printer.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/program.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/properties.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/question.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/quit.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/raise.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/recent.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/record.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/red.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/redo.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/refresh.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/remove.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/rename.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/replace.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/resize.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/revert.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/rewind.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/right.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/rotate-left.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/rotate-right.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/rotate.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/saturation.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/save-as.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/save.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/scanner.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/science.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/screen.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/script.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/security.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/select-all.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/select.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/server.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/share.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/shortcut.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/sort-ascent.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/sort-descent.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/spell-check.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/star.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/start.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/stop.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/sun.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/system.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/table.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/tablet.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/tag.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/terminal.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/text-baseline.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/text-bold.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/text-bottom.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/text-center.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/text-fill.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/text-italic.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/text-left.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/text-lower.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/text-middle.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/text-right.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/text-strike.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/text-top.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/text-underline.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/text-upper.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/text.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/tools.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/top.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/transparency.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/trash.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/undo.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/unindent.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/union.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/unlock.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/unselect.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/up.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/upload.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/user.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/vector.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/video.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/view-detail.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/view-icon.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/view-normal.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/view-split-h.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/view-split-v.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/view-tree.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/volume.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/vpn.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/warning.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/watch.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/webcam.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/wifi.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/wizard.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/zoom-fit.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/zoom-in.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/zoom-normal.png create mode 100644 comp/src/gb.form.stock/gambas-mono/32/zoom-out.png create mode 100644 comp/src/gb.form.stock/gambas/128/access.png create mode 100644 comp/src/gb.form.stock/gambas/128/archive.png create mode 100644 comp/src/gb.form.stock/gambas/128/audio.png create mode 100644 comp/src/gb.form.stock/gambas/128/book.png create mode 100644 comp/src/gb.form.stock/gambas/128/bookmark.png create mode 100644 comp/src/gb.form.stock/gambas/128/c.png create mode 100644 comp/src/gb.form.stock/gambas/128/calculator.png create mode 100644 comp/src/gb.form.stock/gambas/128/calendar.png create mode 100644 comp/src/gb.form.stock/gambas/128/camera.png create mode 100644 comp/src/gb.form.stock/gambas/128/cdrom.png create mode 100644 comp/src/gb.form.stock/gambas/128/clock.png create mode 100644 comp/src/gb.form.stock/gambas/128/color.png create mode 100644 comp/src/gb.form.stock/gambas/128/component.png create mode 100644 comp/src/gb.form.stock/gambas/128/computer.png create mode 100644 comp/src/gb.form.stock/gambas/128/cpp.png create mode 100644 comp/src/gb.form.stock/gambas/128/css.png create mode 100644 comp/src/gb.form.stock/gambas/128/delete.png create mode 100644 comp/src/gb.form.stock/gambas/128/development.png create mode 100644 comp/src/gb.form.stock/gambas/128/directory.png create mode 100644 comp/src/gb.form.stock/gambas/128/download.png create mode 100644 comp/src/gb.form.stock/gambas/128/earth.png create mode 100644 comp/src/gb.form.stock/gambas/128/edit.png create mode 100644 comp/src/gb.form.stock/gambas/128/error.png create mode 100644 comp/src/gb.form.stock/gambas/128/exec.png create mode 100644 comp/src/gb.form.stock/gambas/128/file.png create mode 100644 comp/src/gb.form.stock/gambas/128/flag.png create mode 100644 comp/src/gb.form.stock/gambas/128/floppy.png create mode 100644 comp/src/gb.form.stock/gambas/128/font.png create mode 100644 comp/src/gb.form.stock/gambas/128/gambas.png create mode 100644 comp/src/gb.form.stock/gambas/128/game.png create mode 100644 comp/src/gb.form.stock/gambas/128/h.png create mode 100644 comp/src/gb.form.stock/gambas/128/harddisk.png create mode 100644 comp/src/gb.form.stock/gambas/128/hardware.png create mode 100644 comp/src/gb.form.stock/gambas/128/help.png create mode 100644 comp/src/gb.form.stock/gambas/128/html.png create mode 100644 comp/src/gb.form.stock/gambas/128/image.png create mode 100644 comp/src/gb.form.stock/gambas/128/info.png create mode 100644 comp/src/gb.form.stock/gambas/128/internet.png create mode 100644 comp/src/gb.form.stock/gambas/128/js.png create mode 100644 comp/src/gb.form.stock/gambas/128/lock.png create mode 100644 comp/src/gb.form.stock/gambas/128/monitor.png create mode 100644 comp/src/gb.form.stock/gambas/128/mouse.png create mode 100644 comp/src/gb.form.stock/gambas/128/new.png create mode 100644 comp/src/gb.form.stock/gambas/128/office.png create mode 100644 comp/src/gb.form.stock/gambas/128/open-recent.png create mode 100644 comp/src/gb.form.stock/gambas/128/open.png create mode 100644 comp/src/gb.form.stock/gambas/128/options.png create mode 100644 comp/src/gb.form.stock/gambas/128/pdf.png create mode 100644 comp/src/gb.form.stock/gambas/128/pen.png create mode 100644 comp/src/gb.form.stock/gambas/128/phone.png create mode 100644 comp/src/gb.form.stock/gambas/128/plugin.png create mode 100644 comp/src/gb.form.stock/gambas/128/printer.png create mode 100644 comp/src/gb.form.stock/gambas/128/program.png create mode 100644 comp/src/gb.form.stock/gambas/128/question.png create mode 100644 comp/src/gb.form.stock/gambas/128/quit.png create mode 100644 comp/src/gb.form.stock/gambas/128/rename.png create mode 100644 comp/src/gb.form.stock/gambas/128/scanner.png create mode 100644 comp/src/gb.form.stock/gambas/128/science.png create mode 100644 comp/src/gb.form.stock/gambas/128/screen.png create mode 100644 comp/src/gb.form.stock/gambas/128/script.png create mode 100644 comp/src/gb.form.stock/gambas/128/server.png create mode 100644 comp/src/gb.form.stock/gambas/128/table.png create mode 100644 comp/src/gb.form.stock/gambas/128/tablet.png create mode 100644 comp/src/gb.form.stock/gambas/128/tag.png create mode 100644 comp/src/gb.form.stock/gambas/128/text.png create mode 100644 comp/src/gb.form.stock/gambas/128/tools.png create mode 100644 comp/src/gb.form.stock/gambas/128/trash.png create mode 100644 comp/src/gb.form.stock/gambas/128/unlock.png create mode 100644 comp/src/gb.form.stock/gambas/128/upload.png create mode 100644 comp/src/gb.form.stock/gambas/128/user.png create mode 100644 comp/src/gb.form.stock/gambas/128/vector.png create mode 100644 comp/src/gb.form.stock/gambas/128/video.png create mode 100644 comp/src/gb.form.stock/gambas/128/warning.png create mode 100644 comp/src/gb.form.stock/gambas/128/webcam.png create mode 100644 comp/src/gb.form.stock/gambas/128/wizard.png create mode 100644 comp/src/gb.form.stock/gambas/32/access.png create mode 100644 comp/src/gb.form.stock/gambas/32/add.png create mode 100644 comp/src/gb.form.stock/gambas/32/align-bottom.png create mode 100644 comp/src/gb.form.stock/gambas/32/align-center.png create mode 100644 comp/src/gb.form.stock/gambas/32/align-height.png create mode 100644 comp/src/gb.form.stock/gambas/32/align-left.png create mode 100644 comp/src/gb.form.stock/gambas/32/align-middle.png create mode 100644 comp/src/gb.form.stock/gambas/32/align-right.png create mode 100644 comp/src/gb.form.stock/gambas/32/align-top.png create mode 100644 comp/src/gb.form.stock/gambas/32/align-width.png create mode 100644 comp/src/gb.form.stock/gambas/32/apply.png create mode 100644 comp/src/gb.form.stock/gambas/32/archive.png create mode 100644 comp/src/gb.form.stock/gambas/32/attach.png create mode 100644 comp/src/gb.form.stock/gambas/32/audio.png create mode 100644 comp/src/gb.form.stock/gambas/32/battery.png create mode 100644 comp/src/gb.form.stock/gambas/32/blue.png create mode 100644 comp/src/gb.form.stock/gambas/32/blur.png create mode 100644 comp/src/gb.form.stock/gambas/32/book.png create mode 100644 comp/src/gb.form.stock/gambas/32/bookmark.png create mode 100644 comp/src/gb.form.stock/gambas/32/bottom.png create mode 100644 comp/src/gb.form.stock/gambas/32/brightness.png create mode 100644 comp/src/gb.form.stock/gambas/32/c.png create mode 100644 comp/src/gb.form.stock/gambas/32/calculator.png create mode 100644 comp/src/gb.form.stock/gambas/32/calendar.png create mode 100644 comp/src/gb.form.stock/gambas/32/call.png create mode 100644 comp/src/gb.form.stock/gambas/32/camera.png create mode 100644 comp/src/gb.form.stock/gambas/32/cancel.png create mode 100644 comp/src/gb.form.stock/gambas/32/cdrom.png create mode 100644 comp/src/gb.form.stock/gambas/32/clear-rtl.png create mode 100644 comp/src/gb.form.stock/gambas/32/clear.png create mode 100644 comp/src/gb.form.stock/gambas/32/clock.png create mode 100644 comp/src/gb.form.stock/gambas/32/close.png create mode 100644 comp/src/gb.form.stock/gambas/32/color-picker.png create mode 100644 comp/src/gb.form.stock/gambas/32/color.png create mode 100644 comp/src/gb.form.stock/gambas/32/component.png create mode 100644 comp/src/gb.form.stock/gambas/32/computer.png create mode 100644 comp/src/gb.form.stock/gambas/32/connect.png create mode 100644 comp/src/gb.form.stock/gambas/32/contrast.png create mode 100644 comp/src/gb.form.stock/gambas/32/copy.png create mode 100644 comp/src/gb.form.stock/gambas/32/cpp.png create mode 100644 comp/src/gb.form.stock/gambas/32/crop.png create mode 100644 comp/src/gb.form.stock/gambas/32/css.png create mode 100644 comp/src/gb.form.stock/gambas/32/cut.png create mode 100644 comp/src/gb.form.stock/gambas/32/database.png create mode 100644 comp/src/gb.form.stock/gambas/32/delete.png create mode 100644 comp/src/gb.form.stock/gambas/32/desktop.png create mode 100644 comp/src/gb.form.stock/gambas/32/development.png create mode 100644 comp/src/gb.form.stock/gambas/32/difference.png create mode 100644 comp/src/gb.form.stock/gambas/32/directory.png create mode 100644 comp/src/gb.form.stock/gambas/32/disconnect.png create mode 100644 comp/src/gb.form.stock/gambas/32/down.png create mode 100644 comp/src/gb.form.stock/gambas/32/download.png create mode 100644 comp/src/gb.form.stock/gambas/32/draw-circle.png create mode 100644 comp/src/gb.form.stock/gambas/32/draw-line.png create mode 100644 comp/src/gb.form.stock/gambas/32/draw-path.png create mode 100644 comp/src/gb.form.stock/gambas/32/draw-rectangle.png create mode 100644 comp/src/gb.form.stock/gambas/32/draw-text.png create mode 100644 comp/src/gb.form.stock/gambas/32/earth.png create mode 100644 comp/src/gb.form.stock/gambas/32/edit.png create mode 100644 comp/src/gb.form.stock/gambas/32/eject.png create mode 100644 comp/src/gb.form.stock/gambas/32/end.png create mode 100644 comp/src/gb.form.stock/gambas/32/erase.png create mode 100644 comp/src/gb.form.stock/gambas/32/error.png create mode 100644 comp/src/gb.form.stock/gambas/32/exclusive.png create mode 100644 comp/src/gb.form.stock/gambas/32/exec.png create mode 100644 comp/src/gb.form.stock/gambas/32/file-manager.png create mode 100644 comp/src/gb.form.stock/gambas/32/file.png create mode 100644 comp/src/gb.form.stock/gambas/32/fill.png create mode 100644 comp/src/gb.form.stock/gambas/32/filter.png create mode 100644 comp/src/gb.form.stock/gambas/32/find.png create mode 100644 comp/src/gb.form.stock/gambas/32/first.png create mode 100644 comp/src/gb.form.stock/gambas/32/flag.png create mode 100644 comp/src/gb.form.stock/gambas/32/flip-h.png create mode 100644 comp/src/gb.form.stock/gambas/32/flip-v.png create mode 100644 comp/src/gb.form.stock/gambas/32/floppy.png create mode 100644 comp/src/gb.form.stock/gambas/32/font.png create mode 100644 comp/src/gb.form.stock/gambas/32/forward.png create mode 100644 comp/src/gb.form.stock/gambas/32/fullscreen.png create mode 100644 comp/src/gb.form.stock/gambas/32/gambas.png create mode 100644 comp/src/gb.form.stock/gambas/32/game.png create mode 100644 comp/src/gb.form.stock/gambas/32/gamma.png create mode 100644 comp/src/gb.form.stock/gambas/32/gnu.png create mode 100644 comp/src/gb.form.stock/gambas/32/green.png create mode 100644 comp/src/gb.form.stock/gambas/32/grid.png create mode 100644 comp/src/gb.form.stock/gambas/32/group.png create mode 100644 comp/src/gb.form.stock/gambas/32/h.png create mode 100644 comp/src/gb.form.stock/gambas/32/halt.png create mode 100644 comp/src/gb.form.stock/gambas/32/harddisk.png create mode 100644 comp/src/gb.form.stock/gambas/32/hardware.png create mode 100644 comp/src/gb.form.stock/gambas/32/help.png create mode 100644 comp/src/gb.form.stock/gambas/32/home.png create mode 100644 comp/src/gb.form.stock/gambas/32/html.png create mode 100644 comp/src/gb.form.stock/gambas/32/hue.png create mode 100644 comp/src/gb.form.stock/gambas/32/identity.png create mode 100644 comp/src/gb.form.stock/gambas/32/image.png create mode 100644 comp/src/gb.form.stock/gambas/32/important.png create mode 100644 comp/src/gb.form.stock/gambas/32/indent.png create mode 100644 comp/src/gb.form.stock/gambas/32/info.png create mode 100644 comp/src/gb.form.stock/gambas/32/insert-image.png create mode 100644 comp/src/gb.form.stock/gambas/32/insert-link.png create mode 100644 comp/src/gb.form.stock/gambas/32/insert-text.png create mode 100644 comp/src/gb.form.stock/gambas/32/internet.png create mode 100644 comp/src/gb.form.stock/gambas/32/intersection.png create mode 100644 comp/src/gb.form.stock/gambas/32/js.png create mode 100644 comp/src/gb.form.stock/gambas/32/jump.png create mode 100644 comp/src/gb.form.stock/gambas/32/key.png create mode 100644 comp/src/gb.form.stock/gambas/32/keyboard.png create mode 100644 comp/src/gb.form.stock/gambas/32/lamp.png create mode 100644 comp/src/gb.form.stock/gambas/32/language.png create mode 100644 comp/src/gb.form.stock/gambas/32/last.png create mode 100644 comp/src/gb.form.stock/gambas/32/layout.png create mode 100644 comp/src/gb.form.stock/gambas/32/left.png create mode 100644 comp/src/gb.form.stock/gambas/32/lightness.png create mode 100644 comp/src/gb.form.stock/gambas/32/link.png create mode 100644 comp/src/gb.form.stock/gambas/32/linux.png create mode 100644 comp/src/gb.form.stock/gambas/32/lock.png create mode 100644 comp/src/gb.form.stock/gambas/32/lower.png create mode 100644 comp/src/gb.form.stock/gambas/32/mail.png create mode 100644 comp/src/gb.form.stock/gambas/32/make-all.png create mode 100644 comp/src/gb.form.stock/gambas/32/make.png create mode 100644 comp/src/gb.form.stock/gambas/32/media-player.png create mode 100644 comp/src/gb.form.stock/gambas/32/menu.png create mode 100644 comp/src/gb.form.stock/gambas/32/microphone.png create mode 100644 comp/src/gb.form.stock/gambas/32/monitor.png create mode 100644 comp/src/gb.form.stock/gambas/32/mouse.png create mode 100644 comp/src/gb.form.stock/gambas/32/multimedia.png create mode 100644 comp/src/gb.form.stock/gambas/32/muted.png create mode 100644 comp/src/gb.form.stock/gambas/32/network.png create mode 100644 comp/src/gb.form.stock/gambas/32/new-dir.png create mode 100644 comp/src/gb.form.stock/gambas/32/new-tab.png create mode 100644 comp/src/gb.form.stock/gambas/32/new-tag.png create mode 100644 comp/src/gb.form.stock/gambas/32/new-window.png create mode 100644 comp/src/gb.form.stock/gambas/32/new.png create mode 100644 comp/src/gb.form.stock/gambas/32/next.png create mode 100644 comp/src/gb.form.stock/gambas/32/office-calc.png create mode 100644 comp/src/gb.form.stock/gambas/32/office-draw.png create mode 100644 comp/src/gb.form.stock/gambas/32/office.png create mode 100644 comp/src/gb.form.stock/gambas/32/ok.png create mode 100644 comp/src/gb.form.stock/gambas/32/opacity.png create mode 100644 comp/src/gb.form.stock/gambas/32/open-recent.png create mode 100644 comp/src/gb.form.stock/gambas/32/open.png create mode 100644 comp/src/gb.form.stock/gambas/32/options.png create mode 100644 comp/src/gb.form.stock/gambas/32/package.png create mode 100644 comp/src/gb.form.stock/gambas/32/paste.png create mode 100644 comp/src/gb.form.stock/gambas/32/pause.png create mode 100644 comp/src/gb.form.stock/gambas/32/pda.png create mode 100644 comp/src/gb.form.stock/gambas/32/pdf.png create mode 100644 comp/src/gb.form.stock/gambas/32/pen.png create mode 100644 comp/src/gb.form.stock/gambas/32/people.png create mode 100644 comp/src/gb.form.stock/gambas/32/phone.png create mode 100644 comp/src/gb.form.stock/gambas/32/play.png create mode 100644 comp/src/gb.form.stock/gambas/32/plugin.png create mode 100644 comp/src/gb.form.stock/gambas/32/preview.png create mode 100644 comp/src/gb.form.stock/gambas/32/previous.png create mode 100644 comp/src/gb.form.stock/gambas/32/print.png create mode 100644 comp/src/gb.form.stock/gambas/32/printer.png create mode 100644 comp/src/gb.form.stock/gambas/32/program.png create mode 100644 comp/src/gb.form.stock/gambas/32/properties.png create mode 100644 comp/src/gb.form.stock/gambas/32/question.png create mode 100644 comp/src/gb.form.stock/gambas/32/quit.png create mode 100644 comp/src/gb.form.stock/gambas/32/raise.png create mode 100644 comp/src/gb.form.stock/gambas/32/recent.png create mode 100644 comp/src/gb.form.stock/gambas/32/record.png create mode 100644 comp/src/gb.form.stock/gambas/32/red.png create mode 100644 comp/src/gb.form.stock/gambas/32/redo.png create mode 100644 comp/src/gb.form.stock/gambas/32/refresh.png create mode 100644 comp/src/gb.form.stock/gambas/32/remove.png create mode 100644 comp/src/gb.form.stock/gambas/32/rename.png create mode 100644 comp/src/gb.form.stock/gambas/32/replace.png create mode 100644 comp/src/gb.form.stock/gambas/32/resize.png create mode 100644 comp/src/gb.form.stock/gambas/32/revert.png create mode 100644 comp/src/gb.form.stock/gambas/32/rewind.png create mode 100644 comp/src/gb.form.stock/gambas/32/right.png create mode 100644 comp/src/gb.form.stock/gambas/32/rotate-left.png create mode 100644 comp/src/gb.form.stock/gambas/32/rotate-right.png create mode 100644 comp/src/gb.form.stock/gambas/32/rotate.png create mode 100644 comp/src/gb.form.stock/gambas/32/saturation.png create mode 100644 comp/src/gb.form.stock/gambas/32/save-as.png create mode 100644 comp/src/gb.form.stock/gambas/32/save.png create mode 100644 comp/src/gb.form.stock/gambas/32/scanner.png create mode 100644 comp/src/gb.form.stock/gambas/32/science.png create mode 100644 comp/src/gb.form.stock/gambas/32/screen.png create mode 100644 comp/src/gb.form.stock/gambas/32/script.png create mode 100644 comp/src/gb.form.stock/gambas/32/security.png create mode 100644 comp/src/gb.form.stock/gambas/32/select-all.png create mode 100644 comp/src/gb.form.stock/gambas/32/select.png create mode 100644 comp/src/gb.form.stock/gambas/32/server.png create mode 100644 comp/src/gb.form.stock/gambas/32/share.png create mode 100644 comp/src/gb.form.stock/gambas/32/shortcut.png create mode 100644 comp/src/gb.form.stock/gambas/32/sort-ascent.png create mode 100644 comp/src/gb.form.stock/gambas/32/sort-descent.png create mode 100644 comp/src/gb.form.stock/gambas/32/spell-check.png create mode 100644 comp/src/gb.form.stock/gambas/32/star.png create mode 100644 comp/src/gb.form.stock/gambas/32/start.png create mode 100644 comp/src/gb.form.stock/gambas/32/stop.png create mode 100644 comp/src/gb.form.stock/gambas/32/sun.png create mode 100644 comp/src/gb.form.stock/gambas/32/system.png create mode 100644 comp/src/gb.form.stock/gambas/32/table.png create mode 100644 comp/src/gb.form.stock/gambas/32/tablet.png create mode 100644 comp/src/gb.form.stock/gambas/32/tag.png create mode 100644 comp/src/gb.form.stock/gambas/32/terminal.png create mode 100644 comp/src/gb.form.stock/gambas/32/text-baseline.png create mode 100644 comp/src/gb.form.stock/gambas/32/text-bold.png create mode 100644 comp/src/gb.form.stock/gambas/32/text-bottom.png create mode 100644 comp/src/gb.form.stock/gambas/32/text-center.png create mode 100644 comp/src/gb.form.stock/gambas/32/text-fill.png create mode 100644 comp/src/gb.form.stock/gambas/32/text-italic.png create mode 100644 comp/src/gb.form.stock/gambas/32/text-left.png create mode 100644 comp/src/gb.form.stock/gambas/32/text-lower.png create mode 100644 comp/src/gb.form.stock/gambas/32/text-middle.png create mode 100644 comp/src/gb.form.stock/gambas/32/text-right.png create mode 100644 comp/src/gb.form.stock/gambas/32/text-strike.png create mode 100644 comp/src/gb.form.stock/gambas/32/text-top.png create mode 100644 comp/src/gb.form.stock/gambas/32/text-underline.png create mode 100644 comp/src/gb.form.stock/gambas/32/text-upper.png create mode 100644 comp/src/gb.form.stock/gambas/32/text.png create mode 100644 comp/src/gb.form.stock/gambas/32/tools.png create mode 100644 comp/src/gb.form.stock/gambas/32/top.png create mode 100644 comp/src/gb.form.stock/gambas/32/transparency.png create mode 100644 comp/src/gb.form.stock/gambas/32/trash.png create mode 100644 comp/src/gb.form.stock/gambas/32/undo.png create mode 100644 comp/src/gb.form.stock/gambas/32/unindent.png create mode 100644 comp/src/gb.form.stock/gambas/32/union.png create mode 100644 comp/src/gb.form.stock/gambas/32/unlock.png create mode 100644 comp/src/gb.form.stock/gambas/32/unselect.png create mode 100644 comp/src/gb.form.stock/gambas/32/up.png create mode 100644 comp/src/gb.form.stock/gambas/32/upload.png create mode 100644 comp/src/gb.form.stock/gambas/32/user.png create mode 100644 comp/src/gb.form.stock/gambas/32/vector.png create mode 100644 comp/src/gb.form.stock/gambas/32/video.png create mode 100644 comp/src/gb.form.stock/gambas/32/view-detail.png create mode 100644 comp/src/gb.form.stock/gambas/32/view-icon.png create mode 100644 comp/src/gb.form.stock/gambas/32/view-normal.png create mode 100644 comp/src/gb.form.stock/gambas/32/view-split-h.png create mode 100644 comp/src/gb.form.stock/gambas/32/view-split-v.png create mode 100644 comp/src/gb.form.stock/gambas/32/view-tree.png create mode 100644 comp/src/gb.form.stock/gambas/32/volume.png create mode 100644 comp/src/gb.form.stock/gambas/32/vpn.png create mode 100644 comp/src/gb.form.stock/gambas/32/warning.png create mode 100644 comp/src/gb.form.stock/gambas/32/watch.png create mode 100644 comp/src/gb.form.stock/gambas/32/webcam.png create mode 100644 comp/src/gb.form.stock/gambas/32/wifi.png create mode 100644 comp/src/gb.form.stock/gambas/32/wizard.png create mode 100644 comp/src/gb.form.stock/gambas/32/zoom-fit.png create mode 100644 comp/src/gb.form.stock/gambas/32/zoom-in.png create mode 100644 comp/src/gb.form.stock/gambas/32/zoom-normal.png create mode 100644 comp/src/gb.form.stock/gambas/32/zoom-out.png create mode 100644 comp/src/gb.form.stock/links create mode 100644 comp/src/gb.form.terminal/.component create mode 100644 comp/src/gb.form.terminal/.directory create mode 100644 comp/src/gb.form.terminal/.hidden/Konsole keys README.txt create mode 100644 comp/src/gb.form.terminal/.hidden/Konsole keys.txt create mode 100644 comp/src/gb.form.terminal/.hidden/XTerm control sequences.txt create mode 100644 comp/src/gb.form.terminal/.hidden/XtermTests/16colors.sh create mode 100644 comp/src/gb.form.terminal/.hidden/XtermTests/256colors.pl create mode 100644 comp/src/gb.form.terminal/.hidden/XtermTests/256colors2.pl create mode 100644 comp/src/gb.form.terminal/.hidden/XtermTests/88colors.pl create mode 100644 comp/src/gb.form.terminal/.hidden/XtermTests/88colors2.pl create mode 100644 comp/src/gb.form.terminal/.hidden/XtermTests/8colors.sh create mode 100644 comp/src/gb.form.terminal/.hidden/XtermTests/acolors.sh create mode 100644 comp/src/gb.form.terminal/.hidden/XtermTests/doublechars.sh create mode 100644 comp/src/gb.form.terminal/.hidden/XtermTests/dynamic.pl create mode 100644 comp/src/gb.form.terminal/.hidden/XtermTests/dynamic.sh create mode 100644 comp/src/gb.form.terminal/.hidden/XtermTests/dynamic2.sh create mode 100644 comp/src/gb.form.terminal/.hidden/XtermTests/fonts.sh create mode 100644 comp/src/gb.form.terminal/.hidden/XtermTests/paste64.pl create mode 100644 comp/src/gb.form.terminal/.hidden/XtermTests/query-color.pl create mode 100644 comp/src/gb.form.terminal/.hidden/XtermTests/query-fonts.pl create mode 100644 comp/src/gb.form.terminal/.hidden/XtermTests/resize.pl create mode 100644 comp/src/gb.form.terminal/.hidden/XtermTests/resize.sh create mode 100644 comp/src/gb.form.terminal/.hidden/XtermTests/tcapquery.pl create mode 100644 comp/src/gb.form.terminal/.hidden/XtermTests/title.sh create mode 100644 comp/src/gb.form.terminal/.hidden/XtermVT100 create mode 100644 comp/src/gb.form.terminal/.hidden/control/terminalview.png create mode 100644 comp/src/gb.form.terminal/.icon.png create mode 100644 comp/src/gb.form.terminal/.lang/fr.po create mode 100644 comp/src/gb.form.terminal/.lang/it.po create mode 100644 comp/src/gb.form.terminal/.lang/pt_BR.po create mode 100644 comp/src/gb.form.terminal/.lang/ru.po create mode 100644 comp/src/gb.form.terminal/.project create mode 100644 comp/src/gb.form.terminal/.src/TerminalView/CTerminalLine.class create mode 100644 comp/src/gb.form.terminal/.src/TerminalView/TerminalAttr.class create mode 100644 comp/src/gb.form.terminal/.src/TerminalView/TerminalFilter.class create mode 100644 comp/src/gb.form.terminal/.src/TerminalView/TerminalFilter_VT100.class create mode 100644 comp/src/gb.form.terminal/.src/TerminalView/TerminalScreen.class create mode 100644 comp/src/gb.form.terminal/.src/TerminalView/TerminalView.class create mode 100644 comp/src/gb.form.terminal/.src/TerminalView/test/FOtherTest.class create mode 100644 comp/src/gb.form.terminal/.src/TerminalView/test/FOtherTest.form create mode 100644 comp/src/gb.form.terminal/.src/TerminalView/test/FTestTerminalView.class create mode 100644 comp/src/gb.form.terminal/.src/TerminalView/test/FTestTerminalView.form create mode 100644 comp/src/gb.form.terminal/.src/TerminalView/test/Form1.class create mode 100644 comp/src/gb.form.terminal/.src/TerminalView/test/Form1.form create mode 100644 comp/src/gb.form.terminal/.src/TerminalView/test/MTest.module create mode 100644 comp/src/gb.form.terminal/.src/TerminalView/test/PipeTest.class create mode 100644 comp/src/gb.form.terminal/.src/TerminalView/test/PipeTest.form create mode 100644 comp/src/gb.form.terminal/.src/TerminalView/test/PipedTask.class create mode 100644 comp/src/gb.form.terminal/.src/TerminalView/test/TelNetProtocol.class create mode 100644 comp/src/gb.form.terminal/.src/TerminalView/test/VT100/Attr.class create mode 100644 comp/src/gb.form.terminal/.src/TerminalView/test/VT100/Console.class create mode 100644 comp/src/gb.form.terminal/.src/TerminalView/test/VT100/Main.module create mode 100644 comp/src/gb.form.terminal/brush_dark.png create mode 100644 comp/src/gb.form.terminal/brush_light.png create mode 100644 comp/src/gb.form.terminal/brush_medium.png create mode 100644 comp/src/gb.form/.component create mode 100644 comp/src/gb.form/.directory create mode 100644 comp/src/gb.form/.hidden/CHANGELOG create mode 100644 comp/src/gb.form/.hidden/control/buttonbox.png create mode 100644 comp/src/gb.form/.hidden/control/colorbutton.png create mode 100644 comp/src/gb.form/.hidden/control/colorchooser.png create mode 100644 comp/src/gb.form/.hidden/control/colorpalette.png create mode 100644 comp/src/gb.form/.hidden/control/datebox.png create mode 100644 comp/src/gb.form/.hidden/control/datechooser.png create mode 100644 comp/src/gb.form/.hidden/control/dirbox.png create mode 100644 comp/src/gb.form/.hidden/control/dirchooser.png create mode 100644 comp/src/gb.form/.hidden/control/dirview.png create mode 100644 comp/src/gb.form/.hidden/control/documentview.png create mode 100644 comp/src/gb.form/.hidden/control/expander.png create mode 100644 comp/src/gb.form/.hidden/control/filechooser.png create mode 100644 comp/src/gb.form/.hidden/control/fileproperties.png create mode 100644 comp/src/gb.form/.hidden/control/fileview.png create mode 100644 comp/src/gb.form/.hidden/control/fontbox.png create mode 100644 comp/src/gb.form/.hidden/control/fontchooser.png create mode 100644 comp/src/gb.form/.hidden/control/iconpanel.png create mode 100644 comp/src/gb.form/.hidden/control/imageview.png create mode 100644 comp/src/gb.form/.hidden/control/lcdlabel.png create mode 100644 comp/src/gb.form/.hidden/control/listcontainer.png create mode 100644 comp/src/gb.form/.hidden/control/listeditor.png create mode 100644 comp/src/gb.form/.hidden/control/maskbox.png create mode 100644 comp/src/gb.form/.hidden/control/menubutton.png create mode 100644 comp/src/gb.form/.hidden/control/messageview.png create mode 100644 comp/src/gb.form/.hidden/control/sidepanel.png create mode 100644 comp/src/gb.form/.hidden/control/sliderbox.png create mode 100644 comp/src/gb.form/.hidden/control/spinbar.png create mode 100644 comp/src/gb.form/.hidden/control/spinner.png create mode 100644 comp/src/gb.form/.hidden/control/switchbutton.png create mode 100644 comp/src/gb.form/.hidden/control/tableview.png create mode 100644 comp/src/gb.form/.hidden/control/tabpanel.png create mode 100644 comp/src/gb.form/.hidden/control/timebox.png create mode 100644 comp/src/gb.form/.hidden/control/toolpanel.png create mode 100644 comp/src/gb.form/.hidden/control/urllabel.png create mode 100644 comp/src/gb.form/.hidden/control/valuebox.png create mode 100644 comp/src/gb.form/.hidden/control/wizard.png create mode 100644 comp/src/gb.form/.icon.png create mode 100644 comp/src/gb.form/.lang/ar.po create mode 100644 comp/src/gb.form/.lang/ca.po create mode 100644 comp/src/gb.form/.lang/cs.po create mode 100644 comp/src/gb.form/.lang/de.po create mode 100644 comp/src/gb.form/.lang/es.po create mode 100644 comp/src/gb.form/.lang/es_ES.po create mode 100644 comp/src/gb.form/.lang/fa.po create mode 100644 comp/src/gb.form/.lang/fr.po create mode 100644 comp/src/gb.form/.lang/it.po create mode 100644 comp/src/gb.form/.lang/ja.po create mode 100644 comp/src/gb.form/.lang/nl.po create mode 100644 comp/src/gb.form/.lang/pt_BR.po create mode 100644 comp/src/gb.form/.lang/ru.po create mode 100644 comp/src/gb.form/.lang/sv.po create mode 100644 comp/src/gb.form/.lang/zh.po create mode 100644 comp/src/gb.form/.lang/zh_TW.po create mode 100644 comp/src/gb.form/.project create mode 100644 comp/src/gb.form/.src/Balloon/Balloon.class create mode 100644 comp/src/gb.form/.src/Balloon/FBalloon.class create mode 100644 comp/src/gb.form/.src/Balloon/FBalloon.form create mode 100644 comp/src/gb.form/.src/Button/ButtonBox.class create mode 100644 comp/src/gb.form/.src/Button/MenuButton.class create mode 100644 comp/src/gb.form/.src/Button/SwitchButton.class create mode 100644 comp/src/gb.form/.src/Color/ColorButton.class create mode 100644 comp/src/gb.form/.src/Color/ColorChooser.class create mode 100644 comp/src/gb.form/.src/Color/ColorPalette.class create mode 100644 comp/src/gb.form/.src/Color/FColorChooser.class create mode 100644 comp/src/gb.form/.src/Color/FColorChooser.form create mode 100644 comp/src/gb.form/.src/Completion.class create mode 100644 comp/src/gb.form/.src/Date/DateBox.class create mode 100644 comp/src/gb.form/.src/Date/DateChooser.class create mode 100644 comp/src/gb.form/.src/Date/FCalendar.class create mode 100644 comp/src/gb.form/.src/Date/FCalendar.form create mode 100644 comp/src/gb.form/.src/Date/TimeBox.class create mode 100644 comp/src/gb.form/.src/Date/_DateChooser_Colors.class create mode 100644 comp/src/gb.form/.src/Date/_DateChooser_Data.class create mode 100644 comp/src/gb.form/.src/Date/_DateChooser_Date.class create mode 100644 comp/src/gb.form/.src/DocumentView/DocumentView.class create mode 100644 comp/src/gb.form/.src/DocumentView/_DocumentItem.class create mode 100644 comp/src/gb.form/.src/DocumentView/_DocumentLayout.class create mode 100644 comp/src/gb.form/.src/Expander/Expander.class create mode 100644 comp/src/gb.form/.src/Expander/FExpander.class create mode 100644 comp/src/gb.form/.src/Expander/FExpander.form create mode 100644 comp/src/gb.form/.src/FInputBox.class create mode 100644 comp/src/gb.form/.src/FInputBox.form create mode 100644 comp/src/gb.form/.src/File/Bookmark.class create mode 100644 comp/src/gb.form/.src/File/Bookmark/CBookmark.class create mode 100644 comp/src/gb.form/.src/File/Bookmark/CBookmarkList.class create mode 100644 comp/src/gb.form/.src/File/Bookmark/FEditBookmark.class create mode 100644 comp/src/gb.form/.src/File/Bookmark/FEditBookmark.form create mode 100644 comp/src/gb.form/.src/File/Bookmarks.class create mode 100644 comp/src/gb.form/.src/File/CTaskPreview.class create mode 100644 comp/src/gb.form/.src/File/Chooser/DirButton.class create mode 100644 comp/src/gb.form/.src/File/Chooser/DirChooser.class create mode 100644 comp/src/gb.form/.src/File/Chooser/FDirChooser.class create mode 100644 comp/src/gb.form/.src/File/Chooser/FDirChooser.form create mode 100644 comp/src/gb.form/.src/File/Chooser/FileChooser.class create mode 100644 comp/src/gb.form/.src/File/DirBox.class create mode 100644 comp/src/gb.form/.src/File/DirCache.class create mode 100644 comp/src/gb.form/.src/File/DirView.class create mode 100644 comp/src/gb.form/.src/File/FileView.class create mode 100644 comp/src/gb.form/.src/File/Properties/CTaskDirSize.class create mode 100644 comp/src/gb.form/.src/File/Properties/FFileProperties.class create mode 100644 comp/src/gb.form/.src/File/Properties/FFileProperties.form create mode 100644 comp/src/gb.form/.src/File/Properties/FileProperties.class create mode 100644 comp/src/gb.form/.src/File/Properties/_FilePropertiesData.class create mode 100644 comp/src/gb.form/.src/FileCompletion.class create mode 100644 comp/src/gb.form/.src/Font/FFontChooser.class create mode 100644 comp/src/gb.form/.src/Font/FFontChooser.form create mode 100644 comp/src/gb.form/.src/Font/FontBox.class create mode 100644 comp/src/gb.form/.src/Font/FontChooser.class create mode 100644 comp/src/gb.form/.src/Help.module create mode 100644 comp/src/gb.form/.src/IconPanel/IconPanel.class create mode 100644 comp/src/gb.form/.src/IconPanel/_IconPanelContainer.class create mode 100644 comp/src/gb.form/.src/ImageView/ImageView.class create mode 100644 comp/src/gb.form/.src/InputBox.class create mode 100644 comp/src/gb.form/.src/LCDLabel.class create mode 100644 comp/src/gb.form/.src/ListContainer.class create mode 100644 comp/src/gb.form/.src/ListEditor/FListEditor.class create mode 100644 comp/src/gb.form/.src/ListEditor/FListEditor.form create mode 100644 comp/src/gb.form/.src/ListEditor/ListEditor.class create mode 100644 comp/src/gb.form/.src/Main.module create mode 100644 comp/src/gb.form/.src/MaskBox.class create mode 100644 comp/src/gb.form/.src/Message/FMessage.class create mode 100644 comp/src/gb.form/.src/Message/FMessage.form create mode 100644 comp/src/gb.form/.src/Message/Message.module create mode 100644 comp/src/gb.form/.src/Message/MessageView.class create mode 100644 comp/src/gb.form/.src/MessageLabel.class create mode 100644 comp/src/gb.form/.src/MultiContainer/_MultiContainer.class create mode 100644 comp/src/gb.form/.src/MultiContainer/_MultiContainerTab.class create mode 100644 comp/src/gb.form/.src/SidePanel/FSidePanel.class create mode 100644 comp/src/gb.form/.src/SidePanel/FSidePanel.form create mode 100644 comp/src/gb.form/.src/SidePanel/SidePanel.class create mode 100644 comp/src/gb.form/.src/SliderBox.class create mode 100644 comp/src/gb.form/.src/SpinBar/SpinBar.class create mode 100644 comp/src/gb.form/.src/Spinner.class create mode 100644 comp/src/gb.form/.src/Stock.class create mode 100644 comp/src/gb.form/.src/TabPanel/TabPanel.class create mode 100644 comp/src/gb.form/.src/TabPanel/_TabPanelButton.class create mode 100644 comp/src/gb.form/.src/TabPanel/_TabPanelContainer.class create mode 100644 comp/src/gb.form/.src/TableView.class create mode 100644 comp/src/gb.form/.src/Test/FBugFileView.class create mode 100644 comp/src/gb.form/.src/Test/FBugFileView.form create mode 100644 comp/src/gb.form/.src/Test/FDocumentView.class create mode 100644 comp/src/gb.form/.src/Test/FDocumentView.form create mode 100644 comp/src/gb.form/.src/Test/FFont.class create mode 100644 comp/src/gb.form/.src/Test/FFont.form create mode 100644 comp/src/gb.form/.src/Test/FIconPanel.class create mode 100644 comp/src/gb.form/.src/Test/FIconPanel.form create mode 100644 comp/src/gb.form/.src/Test/FIconView.class create mode 100644 comp/src/gb.form/.src/Test/FIconView.form create mode 100644 comp/src/gb.form/.src/Test/FLCDLabel.class create mode 100644 comp/src/gb.form/.src/Test/FLCDLabel.form create mode 100644 comp/src/gb.form/.src/Test/FMain.class create mode 100644 comp/src/gb.form/.src/Test/FMain.form create mode 100644 comp/src/gb.form/.src/Test/FSpinBar.class create mode 100644 comp/src/gb.form/.src/Test/FSpinBar.form create mode 100644 comp/src/gb.form/.src/Test/FSpinner.class create mode 100644 comp/src/gb.form/.src/Test/FSpinner.form create mode 100644 comp/src/gb.form/.src/Test/FSwitchButton.class create mode 100644 comp/src/gb.form/.src/Test/FSwitchButton.form create mode 100644 comp/src/gb.form/.src/Test/FTableView.class create mode 100644 comp/src/gb.form/.src/Test/FTableView.form create mode 100644 comp/src/gb.form/.src/Test/FTestArrangement.class create mode 100644 comp/src/gb.form/.src/Test/FTestArrangement.form create mode 100644 comp/src/gb.form/.src/Test/FTestBalloon.class create mode 100644 comp/src/gb.form/.src/Test/FTestBalloon.form create mode 100644 comp/src/gb.form/.src/Test/FTestColorChooser.class create mode 100644 comp/src/gb.form/.src/Test/FTestColorChooser.form create mode 100644 comp/src/gb.form/.src/Test/FTestCompletion.class create mode 100644 comp/src/gb.form/.src/Test/FTestCompletion.form create mode 100644 comp/src/gb.form/.src/Test/FTestDateChooser.class create mode 100644 comp/src/gb.form/.src/Test/FTestDateChooser.form create mode 100644 comp/src/gb.form/.src/Test/FTestExpander.class create mode 100644 comp/src/gb.form/.src/Test/FTestExpander.form create mode 100644 comp/src/gb.form/.src/Test/FTestFileChooser.class create mode 100644 comp/src/gb.form/.src/Test/FTestFileChooser.form create mode 100644 comp/src/gb.form/.src/Test/FTestFileView.class create mode 100644 comp/src/gb.form/.src/Test/FTestFileView.form create mode 100644 comp/src/gb.form/.src/Test/FTestImageView.class create mode 100644 comp/src/gb.form/.src/Test/FTestImageView.form create mode 100644 comp/src/gb.form/.src/Test/FTestListEditor.class create mode 100644 comp/src/gb.form/.src/Test/FTestListEditor.form create mode 100644 comp/src/gb.form/.src/Test/FTestMaskBox.class create mode 100644 comp/src/gb.form/.src/Test/FTestMaskBox.form create mode 100644 comp/src/gb.form/.src/Test/FTestMenuButton.class create mode 100644 comp/src/gb.form/.src/Test/FTestMenuButton.form create mode 100644 comp/src/gb.form/.src/Test/FTestMessageView.class create mode 100644 comp/src/gb.form/.src/Test/FTestMessageView.form create mode 100644 comp/src/gb.form/.src/Test/FTestSidePanel.class create mode 100644 comp/src/gb.form/.src/Test/FTestSidePanel.form create mode 100644 comp/src/gb.form/.src/Test/FTestTabPanel.class create mode 100644 comp/src/gb.form/.src/Test/FTestTabPanel.form create mode 100644 comp/src/gb.form/.src/Test/FTestTimeBox.class create mode 100644 comp/src/gb.form/.src/Test/FTestTimeBox.form create mode 100644 comp/src/gb.form/.src/Test/FTestToolPanel.class create mode 100644 comp/src/gb.form/.src/Test/FTestToolPanel.form create mode 100644 comp/src/gb.form/.src/Test/FTestValueBox.class create mode 100644 comp/src/gb.form/.src/Test/FTestValueBox.form create mode 100644 comp/src/gb.form/.src/Test/FTestWizard.class create mode 100644 comp/src/gb.form/.src/Test/FTestWizard.form create mode 100644 comp/src/gb.form/.src/Test/FWiki.class create mode 100644 comp/src/gb.form/.src/Test/FWiki.form create mode 100644 comp/src/gb.form/.src/Test/Form1.class create mode 100644 comp/src/gb.form/.src/Test/Form1.form create mode 100644 comp/src/gb.form/.src/Test/Form2.class create mode 100644 comp/src/gb.form/.src/Test/Form2.form create mode 100644 comp/src/gb.form/.src/Test/Form4.class create mode 100644 comp/src/gb.form/.src/Test/Form4.form create mode 100644 comp/src/gb.form/.src/TestControl.class create mode 100644 comp/src/gb.form/.src/ToolPanel/FToolBar.class create mode 100644 comp/src/gb.form/.src/ToolPanel/FToolBar.form create mode 100644 comp/src/gb.form/.src/ToolPanel/ToolPanel.class create mode 100644 comp/src/gb.form/.src/ToolPanel/ToolPanelContainer.class create mode 100644 comp/src/gb.form/.src/URLLabel.class create mode 100644 comp/src/gb.form/.src/ValueBox.class create mode 100644 comp/src/gb.form/.src/Wizard/FWizard.class create mode 100644 comp/src/gb.form/.src/Wizard/FWizard.form create mode 100644 comp/src/gb.form/.src/Wizard/Wizard.class create mode 100644 comp/src/gb.form/.src/Wizard/_WizardContainer.class create mode 100644 comp/src/gb.form/img/16/cross.png create mode 100644 comp/src/gb.form/img/32/filter-menu.png create mode 100644 comp/src/gb.form/img/32/filter.png create mode 100644 comp/src/gb.form/img/32/warning.png create mode 100644 comp/src/gb.form/img/8/new/side-bottom-void.png create mode 100644 comp/src/gb.form/img/8/new/side-bottom.png create mode 100644 comp/src/gb.form/img/8/new/side-left.png create mode 100644 comp/src/gb.form/img/8/new/side-right-void.png create mode 100644 comp/src/gb.form/img/8/new/side-right.png create mode 100644 comp/src/gb.form/img/8/new/side-top.png create mode 100644 comp/src/gb.form/img/8/side-bottom-void.png create mode 100644 comp/src/gb.form/img/8/side-bottom.png create mode 100644 comp/src/gb.form/img/8/side-left.png create mode 100644 comp/src/gb.form/img/8/side-right-void.png create mode 100644 comp/src/gb.form/img/8/side-right.png create mode 100644 comp/src/gb.form/img/8/side-top.png create mode 100644 comp/src/gb.form/img/colormap.png create mode 100644 comp/src/gb.form/img/cross.png create mode 100644 comp/src/gb.form/img/handle-h.png create mode 100644 comp/src/gb.form/img/handle-v.png create mode 100644 comp/src/gb.form/img/lock.png create mode 100644 comp/src/gb.form/img/round.png create mode 100644 comp/src/gb.form/img/select-dark.png create mode 100644 comp/src/gb.form/img/select.png create mode 100644 comp/src/gb.form/img/unknown.svg create mode 100644 comp/src/gb.form/img/valuemap.png create mode 100644 comp/src/gb.form/map/icon.map create mode 100644 comp/src/gb.form/stock/16/gambas.png create mode 100644 comp/src/gb.form/stock/16/gnu.png create mode 100644 comp/src/gb.form/stock/16/linux.png create mode 100644 comp/src/gb.form/stock/32/gambas.png create mode 100644 comp/src/gb.form/stock/32/gnu.png create mode 100644 comp/src/gb.form/stock/32/linux.png create mode 100644 comp/src/gb.form/stock/scalable/gambas.svg create mode 100644 comp/src/gb.form/stock/scalable/gnu.svg create mode 100644 comp/src/gb.form/stock/scalable/linux.svg create mode 100644 comp/src/gb.gui.base/.component create mode 100644 comp/src/gb.gui.base/.directory create mode 100644 comp/src/gb.gui.base/.icon.png create mode 100644 comp/src/gb.gui.base/.lang/de.po create mode 100644 comp/src/gb.gui.base/.lang/es.po create mode 100644 comp/src/gb.gui.base/.lang/fr.po create mode 100644 comp/src/gb.gui.base/.project create mode 100644 comp/src/gb.gui.base/.src/Action.class create mode 100644 comp/src/gb.gui.base/.src/Border.class create mode 100644 comp/src/gb.gui.base/.src/Draw.module create mode 100644 comp/src/gb.gui.base/.src/Fill.class create mode 100644 comp/src/gb.gui.base/.src/GridView/GridView.class create mode 100644 comp/src/gb.gui.base/.src/GridView/GridViewSelection.class create mode 100644 comp/src/gb.gui.base/.src/GridView/_GridView_Cell.class create mode 100644 comp/src/gb.gui.base/.src/GridView/_GridView_Column.class create mode 100644 comp/src/gb.gui.base/.src/GridView/_GridView_Columns.class create mode 100644 comp/src/gb.gui.base/.src/GridView/_GridView_Data.class create mode 100644 comp/src/gb.gui.base/.src/GridView/_GridView_Row.class create mode 100644 comp/src/gb.gui.base/.src/GridView/_GridView_Rows.class create mode 100644 comp/src/gb.gui.base/.src/IconView/IconView.class create mode 100644 comp/src/gb.gui.base/.src/IconView/_IconView_Item.class create mode 100644 comp/src/gb.gui.base/.src/Line.class create mode 100644 comp/src/gb.gui.base/.src/ListBox/ListBox.class create mode 100644 comp/src/gb.gui.base/.src/ListBox/_ListBox_Item.class create mode 100644 comp/src/gb.gui.base/.src/Main.module create mode 100644 comp/src/gb.gui.base/.src/Message/FMessage.class create mode 100644 comp/src/gb.gui.base/.src/Message/FMessage.form create mode 100644 comp/src/gb.gui.base/.src/Message/Message.class create mode 100644 comp/src/gb.gui.base/.src/MyComboBox.class create mode 100644 comp/src/gb.gui.base/.src/Paint.class create mode 100644 comp/src/gb.gui.base/.src/Picture.class create mode 100644 comp/src/gb.gui.base/.src/PictureBox.class create mode 100644 comp/src/gb.gui.base/.src/ProgressBar.class create mode 100644 comp/src/gb.gui.base/.src/ScrollArea.class create mode 100644 comp/src/gb.gui.base/.src/ScrollView.class create mode 100644 comp/src/gb.gui.base/.src/Shortcut.class create mode 100644 comp/src/gb.gui.base/.src/SpinBox.class create mode 100644 comp/src/gb.gui.base/.src/Split/HSplit.class create mode 100644 comp/src/gb.gui.base/.src/Split/VSplit.class create mode 100644 comp/src/gb.gui.base/.src/Split/_Split.class create mode 100644 comp/src/gb.gui.base/.src/Spring.class create mode 100644 comp/src/gb.gui.base/.src/Test/FBorder.class create mode 100644 comp/src/gb.gui.base/.src/Test/FBorder.form create mode 100644 comp/src/gb.gui.base/.src/Test/FGridView.class create mode 100644 comp/src/gb.gui.base/.src/Test/FGridView.form create mode 100644 comp/src/gb.gui.base/.src/Test/FIconView.class create mode 100644 comp/src/gb.gui.base/.src/Test/FIconView.form create mode 100644 comp/src/gb.gui.base/.src/Test/FListBox.class create mode 100644 comp/src/gb.gui.base/.src/Test/FListBox.form create mode 100644 comp/src/gb.gui.base/.src/Test/FMain.class create mode 100644 comp/src/gb.gui.base/.src/Test/FMain.form create mode 100644 comp/src/gb.gui.base/.src/Test/FPaint.class create mode 100644 comp/src/gb.gui.base/.src/Test/FPaint.form create mode 100644 comp/src/gb.gui.base/.src/Test/FProgressBar.class create mode 100644 comp/src/gb.gui.base/.src/Test/FProgressBar.form create mode 100644 comp/src/gb.gui.base/.src/Test/FScrollArea.class create mode 100644 comp/src/gb.gui.base/.src/Test/FScrollArea.form create mode 100644 comp/src/gb.gui.base/.src/Test/FTestClipping.class create mode 100644 comp/src/gb.gui.base/.src/Test/FTestClipping.form create mode 100644 comp/src/gb.gui.base/.src/Test/FTestCombo.class create mode 100644 comp/src/gb.gui.base/.src/Test/FTestCombo.form create mode 100644 comp/src/gb.gui.base/.src/Test/FTestMouseWheel.class create mode 100644 comp/src/gb.gui.base/.src/Test/FTestMouseWheel.form create mode 100644 comp/src/gb.gui.base/.src/Test/FTreeView.class create mode 100644 comp/src/gb.gui.base/.src/Test/FTreeView.form create mode 100644 comp/src/gb.gui.base/.src/Test/FileView/CTaskPreview.class create mode 100644 comp/src/gb.gui.base/.src/Test/FileView/DirCache.class create mode 100644 comp/src/gb.gui.base/.src/Test/FileView/FTestFileView.class create mode 100644 comp/src/gb.gui.base/.src/Test/FileView/FTestFileView.form create mode 100644 comp/src/gb.gui.base/.src/Test/FileView/FileView.class create mode 100644 comp/src/gb.gui.base/.src/Test/FileView/Help.module create mode 100644 comp/src/gb.gui.base/.src/Test/TestMessage.module create mode 100644 comp/src/gb.gui.base/.src/TreeView/ColumnView.class create mode 100644 comp/src/gb.gui.base/.src/TreeView/ListView.class create mode 100644 comp/src/gb.gui.base/.src/TreeView/RenameBox.class create mode 100644 comp/src/gb.gui.base/.src/TreeView/TreeView.class create mode 100644 comp/src/gb.gui.base/.src/TreeView/TreeViewSelection.class create mode 100644 comp/src/gb.gui.base/.src/TreeView/_ColumnView_Columns.class create mode 100644 comp/src/gb.gui.base/.src/TreeView/_TreeView.class create mode 100644 comp/src/gb.gui.base/.src/TreeView/_TreeView_Item.class create mode 100644 comp/src/gb.gui.base/.src/_Draw_Clip.class create mode 100644 comp/src/gb.gui.base/.src/_Draw_Style.class create mode 100644 comp/src/gb.gui.base/.src/_Gui.class create mode 100644 comp/src/gb.gui.base/message/copy.png create mode 100644 comp/src/gb.gui.base/message/delete.png create mode 100644 comp/src/gb.gui.base/message/error.png create mode 100644 comp/src/gb.gui.base/message/info.png create mode 100644 comp/src/gb.gui.base/message/question.png create mode 100644 comp/src/gb.gui.base/message/warning.png create mode 100644 comp/src/gb.gui.base/pattern/10.png create mode 100644 comp/src/gb.gui.base/pattern/11.png create mode 100644 comp/src/gb.gui.base/pattern/12.png create mode 100644 comp/src/gb.gui.base/pattern/13.png create mode 100644 comp/src/gb.gui.base/pattern/14.png create mode 100644 comp/src/gb.gui.base/pattern/2.png create mode 100644 comp/src/gb.gui.base/pattern/3.png create mode 100644 comp/src/gb.gui.base/pattern/4.png create mode 100644 comp/src/gb.gui.base/pattern/5.png create mode 100644 comp/src/gb.gui.base/pattern/6.png create mode 100644 comp/src/gb.gui.base/pattern/7.png create mode 100644 comp/src/gb.gui.base/pattern/8.png create mode 100644 comp/src/gb.gui.base/pattern/9.png create mode 120000 comp/src/gb.gui.base/picturebox.png create mode 100644 comp/src/gb.logging/.component create mode 100644 comp/src/gb.logging/.directory create mode 100644 comp/src/gb.logging/.icon.png create mode 100644 comp/src/gb.logging/.project create mode 100644 comp/src/gb.logging/.src/ComplexLogger.class create mode 100644 comp/src/gb.logging/.src/ConsoleHandler.class create mode 100644 comp/src/gb.logging/.src/FileHandler.class create mode 100644 comp/src/gb.logging/.src/Formatter.module create mode 100644 comp/src/gb.logging/.src/LogHandler.class create mode 100644 comp/src/gb.logging/.src/LogLevel.module create mode 100644 comp/src/gb.logging/.src/LogRotator.module create mode 100644 comp/src/gb.logging/.src/Logger.class create mode 100644 comp/src/gb.logging/.src/MTest.module create mode 100644 comp/src/gb.map/.component create mode 100644 comp/src/gb.map/.directory create mode 100644 comp/src/gb.map/.hidden/control/mapview.png create mode 100644 comp/src/gb.map/.icon.png create mode 100644 comp/src/gb.map/.project create mode 100644 comp/src/gb.map/.src/FCarto.class create mode 100644 comp/src/gb.map/.src/FCarto.form create mode 100644 comp/src/gb.map/.src/Map.class create mode 100644 comp/src/gb.map/.src/MapView.class create mode 100644 comp/src/gb.map/.src/Shapes/_ShapeItem.class create mode 100644 comp/src/gb.map/.src/Sprite.class create mode 100644 comp/src/gb.map/.src/Tests/FMain.class create mode 100644 comp/src/gb.map/.src/Tests/FMain.form create mode 100644 comp/src/gb.map/.src/Tests/FTestWmts.class create mode 100644 comp/src/gb.map/.src/Tests/FTestWmts.form create mode 100644 comp/src/gb.map/.src/Tests/Form1.class create mode 100644 comp/src/gb.map/.src/Tests/Form1.form create mode 100644 comp/src/gb.map/.src/Tests/Form2.class create mode 100644 comp/src/gb.map/.src/Tests/Form2.form create mode 100644 comp/src/gb.map/.src/Tests/Form3.class create mode 100644 comp/src/gb.map/.src/Tests/Form3.form create mode 100644 comp/src/gb.map/.src/Tests/Form4.class create mode 100644 comp/src/gb.map/.src/Tests/Form4.form create mode 100644 comp/src/gb.map/.src/Tests/Form5.class create mode 100644 comp/src/gb.map/.src/Tests/Form5.form create mode 100644 comp/src/gb.map/.src/Tests/Form6.class create mode 100644 comp/src/gb.map/.src/Tests/Form6.form create mode 100644 comp/src/gb.map/.src/Tests/MMain.module create mode 100644 comp/src/gb.map/.src/Tools/Geo.module create mode 100644 comp/src/gb.map/.src/Tools/MyPaint.class create mode 100644 comp/src/gb.map/.src/Tools/Proj.class create mode 100644 comp/src/gb.map/.src/Tools/_MapProxy.class create mode 100644 comp/src/gb.map/.src/Types/MapBounds.class create mode 100644 comp/src/gb.map/.src/Types/MapPoint.class create mode 100644 comp/src/gb.map/.src/Types/TileSource.module create mode 100644 comp/src/gb.map/.src/Types/_Tile.class create mode 100644 comp/src/gb.map/.src/_MapLayer.class create mode 100644 comp/src/gb.map/.src/_MapShape.class create mode 100644 comp/src/gb.map/.src/_MapTile.class create mode 100644 comp/src/gb.map/.src/_ViewLayer.class create mode 100644 comp/src/gb.map/Text1 create mode 100644 comp/src/gb.map/bar.png create mode 100644 comp/src/gb.map/cursor.png create mode 100644 comp/src/gb.map/minus.png create mode 100644 comp/src/gb.map/plus.png create mode 100644 comp/src/gb.map/point.png create mode 100644 comp/src/gb.map/pointsparcelle create mode 100644 comp/src/gb.markdown/.component create mode 100644 comp/src/gb.markdown/.directory create mode 100644 comp/src/gb.markdown/.icon.png create mode 100644 comp/src/gb.markdown/.project create mode 100644 comp/src/gb.markdown/.src/MTest.module create mode 100644 comp/src/gb.markdown/.src/Markdown.class create mode 100644 comp/src/gb.markdown/.src/MarkdownLink.class create mode 100644 comp/src/gb.markdown/.src/Markup.module create mode 100644 comp/src/gb.markdown/.src/TMarkdown.test create mode 100644 comp/src/gb.markdown/.test create mode 100644 comp/src/gb.markdown/test.txt create mode 100644 comp/src/gb.media.form/.component create mode 100644 comp/src/gb.media.form/.directory create mode 100644 comp/src/gb.media.form/.hidden/control/mediaview.png create mode 100644 comp/src/gb.media.form/.icon.png create mode 100644 comp/src/gb.media.form/.project create mode 100644 comp/src/gb.media.form/.src/FMediaPlayer.class create mode 100644 comp/src/gb.media.form/.src/FMediaPlayer.form create mode 100644 comp/src/gb.media.form/.src/FTest.class create mode 100644 comp/src/gb.media.form/.src/FTest.form create mode 100644 comp/src/gb.media.form/.src/MediaView.class create mode 100644 comp/src/gb.memcached/.component create mode 100644 comp/src/gb.memcached/.directory create mode 100644 comp/src/gb.memcached/.icon.png create mode 100644 comp/src/gb.memcached/.project create mode 100644 comp/src/gb.memcached/.src/FMain.class create mode 100644 comp/src/gb.memcached/.src/FMain.form create mode 100644 comp/src/gb.memcached/.src/Main.module create mode 100644 comp/src/gb.memcached/.src/Memcached.class create mode 100644 comp/src/gb.memcached/.src/_Memcached_Key.class create mode 100644 comp/src/gb.mysql/.component create mode 100644 comp/src/gb.mysql/.directory create mode 100644 comp/src/gb.mysql/.icon.png create mode 100644 comp/src/gb.mysql/.lang/es.po create mode 100644 comp/src/gb.mysql/.project create mode 100644 comp/src/gb.mysql/.src/Connection.class create mode 100644 comp/src/gb.mysql/.src/DB.class create mode 100644 comp/src/gb.mysql/.src/_DataBase.class create mode 100644 comp/src/gb.mysql/.src/_DataTypes.class create mode 100644 comp/src/gb.mysql/.src/_Event.class create mode 100644 comp/src/gb.mysql/.src/_Field.class create mode 100644 comp/src/gb.mysql/.src/_FieldEspecifications.class create mode 100644 comp/src/gb.mysql/.src/_Index.class create mode 100644 comp/src/gb.mysql/.src/_MySQL.class create mode 100644 comp/src/gb.mysql/.src/_Result.class create mode 100644 comp/src/gb.mysql/.src/_Routines.class create mode 100644 comp/src/gb.mysql/.src/_Table.class create mode 100644 comp/src/gb.mysql/.src/_TableMaintenance.class create mode 100644 comp/src/gb.mysql/.src/_Trigger.class create mode 100644 comp/src/gb.mysql/.src/_User.class create mode 100644 comp/src/gb.mysql/.src/_Version.class create mode 100644 comp/src/gb.mysql/.src/_View.class create mode 100644 comp/src/gb.mysql/.src/modMain.module create mode 100644 comp/src/gb.mysql/logo.png create mode 100644 comp/src/gb.net.pop3/.component create mode 100644 comp/src/gb.net.pop3/.directory create mode 100644 comp/src/gb.net.pop3/.hidden/control/pop3client.png create mode 100644 comp/src/gb.net.pop3/.icon.png create mode 100644 comp/src/gb.net.pop3/.lang/cs.po create mode 100644 comp/src/gb.net.pop3/.lang/es.po create mode 100644 comp/src/gb.net.pop3/.lang/es_ES.po create mode 100644 comp/src/gb.net.pop3/.lang/it.po create mode 100644 comp/src/gb.net.pop3/.lang/nl.po create mode 100644 comp/src/gb.net.pop3/.lang/ru.po create mode 100644 comp/src/gb.net.pop3/.lang/zh.po create mode 100644 comp/src/gb.net.pop3/.project create mode 100644 comp/src/gb.net.pop3/.src/MTest.module create mode 100644 comp/src/gb.net.pop3/.src/Net.class create mode 100644 comp/src/gb.net.pop3/.src/POPClient.class create mode 100644 comp/src/gb.net.pop3/.src/Pop3Client.class create mode 100644 comp/src/gb.net.pop3/.src/SSLClient.class create mode 100644 comp/src/gb.net.pop3/.src/TCPClient.class create mode 100644 comp/src/gb.net.pop3/.src/_Pop3Client_Message.class create mode 100644 comp/src/gb.net.smtp/.component create mode 100644 comp/src/gb.net.smtp/.directory create mode 100644 comp/src/gb.net.smtp/.hidden/control/smtpclient.png create mode 100644 comp/src/gb.net.smtp/.icon.png create mode 100644 comp/src/gb.net.smtp/.project create mode 100644 comp/src/gb.net.smtp/.src/Encode.module create mode 100644 comp/src/gb.net.smtp/.src/Main.module create mode 100644 comp/src/gb.net.smtp/.src/Net.class create mode 100644 comp/src/gb.net.smtp/.src/SmtpClient.class create mode 100644 comp/src/gb.net.smtp/.src/SmtpPart.class create mode 100644 comp/src/gb.net.smtp/.src/SmtpSession.class create mode 100644 comp/src/gb.net.smtp/.src/SslSession.class create mode 100644 comp/src/gb.net.smtp/.src/TcpSession.class create mode 100644 comp/src/gb.net.smtp/.src/TlsSession.class create mode 100644 comp/src/gb.report/.component create mode 100644 comp/src/gb.report/.connection/Connection1.connection create mode 100644 comp/src/gb.report/.connection/Connection2.connection create mode 100644 comp/src/gb.report/.connection/MainConn.connection create mode 100644 comp/src/gb.report/.dir_icon.png create mode 100644 comp/src/gb.report/.directory create mode 100644 comp/src/gb.report/.hidden/control/reportdrawingarea.png create mode 100644 comp/src/gb.report/.hidden/control/reportgridview.png create mode 100644 comp/src/gb.report/.hidden/control/reporthbox.png create mode 100644 comp/src/gb.report/.hidden/control/reportimage.png create mode 100644 comp/src/gb.report/.hidden/control/reportlabel.png create mode 100644 comp/src/gb.report/.hidden/control/reportline.png create mode 100644 comp/src/gb.report/.hidden/control/reportpagebreak.png create mode 100644 comp/src/gb.report/.hidden/control/reportpanel.png create mode 100644 comp/src/gb.report/.hidden/control/reportsvgimage.png create mode 100644 comp/src/gb.report/.hidden/control/reporttextlabel.png create mode 100644 comp/src/gb.report/.hidden/control/reportvbox.png create mode 100644 comp/src/gb.report/.hidden/control/reportview.png create mode 100644 comp/src/gb.report/.hidden/control/reportvpanel.png create mode 100644 comp/src/gb.report/.icon.png create mode 100644 comp/src/gb.report/.lang/ca.po create mode 100644 comp/src/gb.report/.lang/cs.po create mode 100644 comp/src/gb.report/.lang/es.po create mode 100644 comp/src/gb.report/.lang/es_ES.po create mode 100644 comp/src/gb.report/.lang/fr.po create mode 100644 comp/src/gb.report/.lang/nl.po create mode 100644 comp/src/gb.report/.lang/ru.po create mode 100644 comp/src/gb.report/.lang/zh.po create mode 100644 comp/src/gb.report/.project create mode 100644 comp/src/gb.report/.src/Borders/ReportBorder.class create mode 100644 comp/src/gb.report/.src/Borders/_ReportBorderSide.class create mode 100644 comp/src/gb.report/.src/Borders/_ReportRoundCorner.class create mode 100644 comp/src/gb.report/.src/BoxShadow/FReportBoxEditor.class create mode 100644 comp/src/gb.report/.src/BoxShadow/FReportBoxEditor.form create mode 100644 comp/src/gb.report/.src/BoxShadow/ReportBoxShadow.class create mode 100644 comp/src/gb.report/.src/BoxShadow/_ReportBoxShadow.class create mode 100644 comp/src/gb.report/.src/Brush/ReportBrush.class create mode 100644 comp/src/gb.report/.src/Controls/ReportControl.class create mode 100644 comp/src/gb.report/.src/MainTools/MReport.module create mode 100644 comp/src/gb.report/.src/MainTools/ReportUnits.module create mode 100644 comp/src/gb.report/.src/MainTools/Types/TControl.class create mode 100644 comp/src/gb.report/.src/MainTools/Types/TPageColumn.class create mode 100644 comp/src/gb.report/.src/MainTools/Types/TSizeHint.class create mode 100644 comp/src/gb.report/.src/MainTools/Types/TSizeParse.class create mode 100644 comp/src/gb.report/.src/Optional/Align.class create mode 100644 comp/src/gb.report/.src/Optional/Arrange.class create mode 100644 comp/src/gb.report/.src/Optional/Line.class create mode 100644 comp/src/gb.report/.src/Padding/ReportPadding.class create mode 100644 comp/src/gb.report/.src/Preview/CPrint.class create mode 100644 comp/src/gb.report/.src/Preview/FOptions.class create mode 100644 comp/src/gb.report/.src/Preview/FOptions.form create mode 100644 comp/src/gb.report/.src/Preview/FPreview.class create mode 100644 comp/src/gb.report/.src/Preview/FPreview.form create mode 100644 comp/src/gb.report/.src/Preview/FPrint.class create mode 100644 comp/src/gb.report/.src/Preview/FPrint.form create mode 100644 comp/src/gb.report/.src/Preview/Form1.class create mode 100644 comp/src/gb.report/.src/Preview/Form1.form create mode 100644 comp/src/gb.report/.src/Preview/ReportView.class create mode 100644 comp/src/gb.report/.src/Preview/ReportViewTask.class create mode 100644 comp/src/gb.report/.src/Report.class create mode 100644 comp/src/gb.report/.src/ReportContainer.class create mode 100644 comp/src/gb.report/.src/ReportDrawingArea.class create mode 100644 comp/src/gb.report/.src/ReportFrame.class create mode 100644 comp/src/gb.report/.src/ReportGridView.class create mode 100644 comp/src/gb.report/.src/ReportGridView/_ReportGridViewCell.class create mode 100644 comp/src/gb.report/.src/ReportGridView/_ReportGridViewColumn.class create mode 100644 comp/src/gb.report/.src/ReportGridView/_ReportGridViewColumns.class create mode 100644 comp/src/gb.report/.src/ReportGridView/_ReportGridViewRow.class create mode 100644 comp/src/gb.report/.src/ReportGridView/_ReportGridViewRows.class create mode 100644 comp/src/gb.report/.src/ReportHBox.class create mode 100644 comp/src/gb.report/.src/ReportImage.class create mode 100644 comp/src/gb.report/.src/ReportLabel.class create mode 100644 comp/src/gb.report/.src/ReportLine.class create mode 100644 comp/src/gb.report/.src/ReportPageBreak.class create mode 100644 comp/src/gb.report/.src/ReportPanel.class create mode 100644 comp/src/gb.report/.src/ReportSection.class create mode 100644 comp/src/gb.report/.src/ReportSvgImage.class create mode 100644 comp/src/gb.report/.src/ReportTextLabel.class create mode 100644 comp/src/gb.report/.src/ReportVBox.class create mode 100644 comp/src/gb.report/.src/ReportVPanel.class create mode 100644 comp/src/gb.report/.src/Tests/Old/Paints.class create mode 100644 comp/src/gb.report/.src/Tests/Old/Report1.class create mode 100644 comp/src/gb.report/.src/Tests/Old/Report1.report create mode 100644 comp/src/gb.report/.src/Tests/Old/Report10.class create mode 100644 comp/src/gb.report/.src/Tests/Old/Report10.report create mode 100644 comp/src/gb.report/.src/Tests/Old/Report12.class create mode 100644 comp/src/gb.report/.src/Tests/Old/Report12.report create mode 100644 comp/src/gb.report/.src/Tests/Old/Report13.class create mode 100644 comp/src/gb.report/.src/Tests/Old/Report13.report create mode 100644 comp/src/gb.report/.src/Tests/Old/Report14.class create mode 100644 comp/src/gb.report/.src/Tests/Old/Report14.report create mode 100644 comp/src/gb.report/.src/Tests/Old/Report2.class create mode 100644 comp/src/gb.report/.src/Tests/Old/Report2.report create mode 100644 comp/src/gb.report/.src/Tests/Old/Report3.class create mode 100644 comp/src/gb.report/.src/Tests/Old/Report3.report create mode 100644 comp/src/gb.report/.src/Tests/Old/Report4.class create mode 100644 comp/src/gb.report/.src/Tests/Old/Report4.report create mode 100644 comp/src/gb.report/.src/Tests/Old/Report5.class create mode 100644 comp/src/gb.report/.src/Tests/Old/Report5.report create mode 100644 comp/src/gb.report/.src/Tests/Old/Report6.class create mode 100644 comp/src/gb.report/.src/Tests/Old/Report6.report create mode 100644 comp/src/gb.report/.src/Tests/Old/Report7.class create mode 100644 comp/src/gb.report/.src/Tests/Old/Report7.report create mode 100644 comp/src/gb.report/.src/Tests/Old/Report8.class create mode 100644 comp/src/gb.report/.src/Tests/Old/Report8.report create mode 100644 comp/src/gb.report/.src/Tests/Old/myReport1.class create mode 100644 comp/src/gb.report/.src/Tests/Old/myReport1.report create mode 100644 comp/src/gb.report/.src/Tests/Old/myReport2.class create mode 100644 comp/src/gb.report/.src/Tests/Old/myReport2.report create mode 100644 comp/src/gb.report/.src/Tests/Old/myReport5.class create mode 100644 comp/src/gb.report/.src/Tests/Old/myReport5.report create mode 100644 comp/src/gb.report/.src/Tests/OutputReport.class create mode 100644 comp/src/gb.report/.src/Tests/OutputReport.report create mode 100644 comp/src/gb.report/.src/Tests/OutputReport2.class create mode 100644 comp/src/gb.report/.src/Tests/OutputReport2.report create mode 100644 comp/src/gb.report/.src/Tests/Paints.class create mode 100644 comp/src/gb.report/.src/Tests/Report11.class create mode 100644 comp/src/gb.report/.src/Tests/Report11.report create mode 100644 comp/src/gb.report/.src/Tests/Report41.class create mode 100644 comp/src/gb.report/.src/Tests/Report41.report create mode 100644 comp/src/gb.report/.src/Tests/Report51.class create mode 100644 comp/src/gb.report/.src/Tests/Report51.report create mode 100644 comp/src/gb.report/.src/Tests/Report52.class create mode 100644 comp/src/gb.report/.src/Tests/Report52.report create mode 100644 comp/src/gb.report/.src/Tests/Report9.class create mode 100644 comp/src/gb.report/.src/Tests/Report9.report create mode 100644 comp/src/gb.report/.src/Tests/Test.module create mode 100644 comp/src/gb.report/.src/Tests/rpTestShadowGrid.class create mode 100644 comp/src/gb.report/.src/Tests/rpTestShadowGrid.report create mode 100644 comp/src/gb.report/ChangeLog create mode 100644 comp/src/gb.report/gambas.svg create mode 100644 comp/src/gb.report/img/16/red-arrow-h.png create mode 100644 comp/src/gb.report/img/16/red-arrow-v.png create mode 100644 comp/src/gb.report/img/22/FullWidth.png create mode 100644 comp/src/gb.report/img/22/OnePage.png create mode 100644 comp/src/gb.report/img/22/RealSize.png create mode 100644 comp/src/gb.report/img/22/TwoPage.png create mode 100644 comp/src/gb.report/img/32/Collatecopie.png create mode 100644 comp/src/gb.report/img/32/Empty.png create mode 100644 comp/src/gb.report/img/32/grayscale.png create mode 100644 comp/src/gb.report/img/32/reverse.png create mode 100644 comp/src/gb.report/img/control/hbox.png create mode 100644 comp/src/gb.report/img/control/label.png create mode 100644 comp/src/gb.report/img/control/picturebox.png create mode 100644 comp/src/gb.report/img/control/vbox.png create mode 100644 comp/src/gb.report/img/control/vpanel.png create mode 100644 comp/src/gb.report/img/logo.svg create mode 100644 comp/src/gb.report/printer1.png create mode 100644 comp/src/gb.report2/.component create mode 100644 comp/src/gb.report2/.connection/Connection1.connection create mode 100644 comp/src/gb.report2/.connection/Connection2.connection create mode 100644 comp/src/gb.report2/.connection/Connection2.template create mode 100644 comp/src/gb.report2/.directory create mode 120000 comp/src/gb.report2/.hidden/control/reportdrawingarea.png create mode 120000 comp/src/gb.report2/.hidden/control/reportgridview.png create mode 120000 comp/src/gb.report2/.hidden/control/reporthbox.png create mode 120000 comp/src/gb.report2/.hidden/control/reportimage.png create mode 120000 comp/src/gb.report2/.hidden/control/reportlabel.png create mode 100644 comp/src/gb.report2/.hidden/control/reportline.png create mode 100644 comp/src/gb.report2/.hidden/control/reportpagebreak.png create mode 120000 comp/src/gb.report2/.hidden/control/reportpanel.png create mode 100644 comp/src/gb.report2/.hidden/control/reportsvgimage.png create mode 120000 comp/src/gb.report2/.hidden/control/reporttextlabel.png create mode 120000 comp/src/gb.report2/.hidden/control/reportvbox.png create mode 100644 comp/src/gb.report2/.hidden/control/reportview.png create mode 120000 comp/src/gb.report2/.hidden/control/reportvpanel.png create mode 100644 comp/src/gb.report2/.icon.png create mode 100644 comp/src/gb.report2/.lang/es.po create mode 100644 comp/src/gb.report2/.lang/es_ES.po create mode 100644 comp/src/gb.report2/.lang/fr.po create mode 100644 comp/src/gb.report2/.lang/it.po create mode 100644 comp/src/gb.report2/.lang/nl.po create mode 100644 comp/src/gb.report2/.lang/pt_BR.po create mode 100644 comp/src/gb.report2/.lang/ru.po create mode 100644 comp/src/gb.report2/.project create mode 100644 comp/src/gb.report2/.src/Evaluator/CResult.class create mode 100644 comp/src/gb.report2/.src/Evaluator/_RepExp.class create mode 100644 comp/src/gb.report2/.src/Optional/Align.class create mode 100644 comp/src/gb.report2/.src/Optional/Arrange.class create mode 100644 comp/src/gb.report2/.src/Optional/Line.class create mode 100644 comp/src/gb.report2/.src/Report.class create mode 100644 comp/src/gb.report2/.src/ReportContainer.class create mode 100644 comp/src/gb.report2/.src/ReportControl.class create mode 100644 comp/src/gb.report2/.src/ReportDrawingArea.class create mode 100644 comp/src/gb.report2/.src/ReportFrame.class create mode 100644 comp/src/gb.report2/.src/ReportGridView/ReportGridView.class create mode 100644 comp/src/gb.report2/.src/ReportGridView/_ReportGridViewColumn.class create mode 100644 comp/src/gb.report2/.src/ReportGridView/_ReportGridViewColumns.class create mode 100644 comp/src/gb.report2/.src/ReportGridView/_ReportGridViewData.class create mode 100644 comp/src/gb.report2/.src/ReportGridView/_ReportGridViewRow.class create mode 100644 comp/src/gb.report2/.src/ReportGridView/_ReportGridViewRows.class create mode 100644 comp/src/gb.report2/.src/ReportHBox.class create mode 100644 comp/src/gb.report2/.src/ReportImage.class create mode 100644 comp/src/gb.report2/.src/ReportLabel.class create mode 100644 comp/src/gb.report2/.src/ReportLine.class create mode 100644 comp/src/gb.report2/.src/ReportPageBreak.class create mode 100644 comp/src/gb.report2/.src/ReportPanel.class create mode 100644 comp/src/gb.report2/.src/ReportSection.class create mode 100644 comp/src/gb.report2/.src/ReportSvgImage.class create mode 100644 comp/src/gb.report2/.src/ReportTextLabel.class create mode 100644 comp/src/gb.report2/.src/ReportVBox.class create mode 100644 comp/src/gb.report2/.src/ReportVPanel.class create mode 100644 comp/src/gb.report2/.src/Tests/Report10.class create mode 100644 comp/src/gb.report2/.src/Tests/Report10.report create mode 100644 comp/src/gb.report2/.src/Tests/Report13.class create mode 100644 comp/src/gb.report2/.src/Tests/Report13.report create mode 100644 comp/src/gb.report2/.src/Tests/Report14.class create mode 100644 comp/src/gb.report2/.src/Tests/Report14.report create mode 100644 comp/src/gb.report2/.src/Tests/Report15.class create mode 100644 comp/src/gb.report2/.src/Tests/Report15.report create mode 100644 comp/src/gb.report2/.src/Tests/Report16.class create mode 100644 comp/src/gb.report2/.src/Tests/Report16.report create mode 100644 comp/src/gb.report2/.src/Tests/Report17.class create mode 100644 comp/src/gb.report2/.src/Tests/Report17.report create mode 100644 comp/src/gb.report2/.src/Tests/old/FMain.class create mode 100644 comp/src/gb.report2/.src/Tests/old/FMain.form create mode 100644 comp/src/gb.report2/.src/Tests/old/Module1.module create mode 100644 comp/src/gb.report2/.src/Tests/old/OutputReport2.class create mode 100644 comp/src/gb.report2/.src/Tests/old/OutputReport2.report create mode 100644 comp/src/gb.report2/.src/Tests/old/Report1.class create mode 100644 comp/src/gb.report2/.src/Tests/old/Report1.report create mode 100644 comp/src/gb.report2/.src/Tests/old/Report11.class create mode 100644 comp/src/gb.report2/.src/Tests/old/Report11.report create mode 100644 comp/src/gb.report2/.src/Tests/old/Report12.class create mode 100644 comp/src/gb.report2/.src/Tests/old/Report12.report create mode 100644 comp/src/gb.report2/.src/Tests/old/Report2.class create mode 100644 comp/src/gb.report2/.src/Tests/old/Report2.report create mode 100644 comp/src/gb.report2/.src/Tests/old/Report3.class create mode 100644 comp/src/gb.report2/.src/Tests/old/Report3.report create mode 100644 comp/src/gb.report2/.src/Tests/old/Report4.class create mode 100644 comp/src/gb.report2/.src/Tests/old/Report4.report create mode 100644 comp/src/gb.report2/.src/Tests/old/Report5.class create mode 100644 comp/src/gb.report2/.src/Tests/old/Report5.report create mode 100644 comp/src/gb.report2/.src/Tests/old/Report51.class create mode 100644 comp/src/gb.report2/.src/Tests/old/Report51.report create mode 100644 comp/src/gb.report2/.src/Tests/old/Report6.class create mode 100644 comp/src/gb.report2/.src/Tests/old/Report6.report create mode 100644 comp/src/gb.report2/.src/Tests/old/Report7.class create mode 100644 comp/src/gb.report2/.src/Tests/old/Report7.report create mode 100644 comp/src/gb.report2/.src/Tests/old/Report8.class create mode 100644 comp/src/gb.report2/.src/Tests/old/Report8.report create mode 100644 comp/src/gb.report2/.src/Tests/old/Report9.class create mode 100644 comp/src/gb.report2/.src/Tests/old/Report9.report create mode 100644 comp/src/gb.report2/.src/Tools/CPrint.class create mode 100644 comp/src/gb.report2/.src/Tools/MUtil.module create mode 100644 comp/src/gb.report2/.src/Types/Base/ReportBrush.class create mode 100644 comp/src/gb.report2/.src/Types/Base/ReportMargin.class create mode 100644 comp/src/gb.report2/.src/Types/Base/ReportPadding.class create mode 100644 comp/src/gb.report2/.src/Types/Border/ReportBorder.class create mode 100644 comp/src/gb.report2/.src/Types/Border/_ReportBorderSide.class create mode 100644 comp/src/gb.report2/.src/Types/Border/_ReportRoundCorner.class create mode 100644 comp/src/gb.report2/.src/Types/BoxShadow/ReportBoxShadow.class create mode 100644 comp/src/gb.report2/.src/Types/BoxShadow/_ReportBoxShadow.class create mode 100644 comp/src/gb.report2/.src/Types/ReportSizeHints.class create mode 100644 comp/src/gb.report2/.src/Types/ReportSizeParser.class create mode 100644 comp/src/gb.report2/.src/Types/TControl.class create mode 100644 comp/src/gb.report2/.src/Types/TSizeParse.class create mode 100644 comp/src/gb.report2/.src/Types/_ReportVirtualControl.class create mode 100644 comp/src/gb.report2/.src/Viewer/FPreview.class create mode 100644 comp/src/gb.report2/.src/Viewer/FPreview.form create mode 100644 comp/src/gb.report2/.src/Viewer/ReportView.class create mode 100644 comp/src/gb.report2/16/full-width.png create mode 100644 comp/src/gb.report2/16/one-page.png create mode 100644 comp/src/gb.report2/16/real-size.png create mode 100644 comp/src/gb.report2/16/red-arrow-h.png create mode 100644 comp/src/gb.report2/16/red-arrow-v.png create mode 100644 comp/src/gb.report2/16/two-pages.png create mode 100644 comp/src/gb.report2/22/FullWidth.png create mode 100644 comp/src/gb.report2/22/OnePage.png create mode 100644 comp/src/gb.report2/22/RealSize.png create mode 100644 comp/src/gb.report2/22/TwoPage.png create mode 100644 comp/src/gb.report2/32/Collatecopie.png create mode 100644 comp/src/gb.report2/32/Empty.png create mode 100644 comp/src/gb.report2/32/grayscale.png create mode 100644 comp/src/gb.report2/32/reverse.png create mode 100644 comp/src/gb.report2/FunctionsList create mode 100644 comp/src/gb.report2/Structure create mode 100644 comp/src/gb.report2/gambas.svg create mode 100644 comp/src/gb.report2/icon.png create mode 100644 comp/src/gb.report2/tmpJournal create mode 100644 comp/src/gb.report2/tortueface.gif create mode 100644 comp/src/gb.scanner/.component create mode 100644 comp/src/gb.scanner/.directory create mode 100644 comp/src/gb.scanner/.hidden/scanner.png create mode 100644 comp/src/gb.scanner/.icon.png create mode 100644 comp/src/gb.scanner/.project create mode 100644 comp/src/gb.scanner/.src/Demo/FScan.class create mode 100644 comp/src/gb.scanner/.src/Demo/FScan.form create mode 100644 comp/src/gb.scanner/.src/Demo/Form1.class create mode 100644 comp/src/gb.scanner/.src/Demo/Form1.form create mode 100644 comp/src/gb.scanner/.src/Demo/Main.module create mode 100644 comp/src/gb.scanner/.src/Demo/Main2.module create mode 100644 comp/src/gb.scanner/.src/MTest.module create mode 100644 comp/src/gb.scanner/.src/MTest2.module create mode 100644 comp/src/gb.scanner/.src/Module1.module create mode 100644 comp/src/gb.scanner/.src/Module2.module create mode 100644 comp/src/gb.scanner/.src/Scanner.class create mode 100644 comp/src/gb.scanner/.src/ScannerOption.class create mode 100644 comp/src/gb.scanner/.src/Scanners.class create mode 100644 comp/src/gb.scanner/next.png create mode 100644 comp/src/gb.settings/.component create mode 100644 comp/src/gb.settings/.directory create mode 100644 comp/src/gb.settings/.icon.png create mode 100644 comp/src/gb.settings/.project create mode 100644 comp/src/gb.settings/.src/Main.module create mode 100644 comp/src/gb.settings/.src/Settings.class create mode 100644 comp/src/gb.settings/.src/_Settings_Keys.class create mode 100644 comp/src/gb.term.form/.component create mode 100644 comp/src/gb.term.form/.directory create mode 100644 comp/src/gb.term.form/.hidden/CHANGELOG create mode 120000 comp/src/gb.term.form/.hidden/control/termbutton.png create mode 120000 comp/src/gb.term.form/.hidden/control/termcheckbox.png create mode 120000 comp/src/gb.term.form/.hidden/control/termframe.png create mode 120000 comp/src/gb.term.form/.hidden/control/termhbox.png create mode 120000 comp/src/gb.term.form/.hidden/control/termlabel.png create mode 120000 comp/src/gb.term.form/.hidden/control/termlistbox.png create mode 120000 comp/src/gb.term.form/.hidden/control/termpanel.png create mode 120000 comp/src/gb.term.form/.hidden/control/termpicturebox.png create mode 120000 comp/src/gb.term.form/.hidden/control/termradiobutton.png create mode 120000 comp/src/gb.term.form/.hidden/control/termscrollbar.png create mode 120000 comp/src/gb.term.form/.hidden/control/termtextbox.png create mode 120000 comp/src/gb.term.form/.hidden/control/termvbox.png create mode 100644 comp/src/gb.term.form/.icon.png create mode 100644 comp/src/gb.term.form/.lang/it.po create mode 100644 comp/src/gb.term.form/.lang/nl.po create mode 100644 comp/src/gb.term.form/.lang/ru.po create mode 100644 comp/src/gb.term.form/.project create mode 100644 comp/src/gb.term.form/.src/Align.class create mode 100644 comp/src/gb.term.form/.src/Arrange.class create mode 100644 comp/src/gb.term.form/.src/Attr.class create mode 100644 comp/src/gb.term.form/.src/Border.class create mode 100644 comp/src/gb.term.form/.src/Char.class create mode 100644 comp/src/gb.term.form/.src/Desktop.class create mode 100644 comp/src/gb.term.form/.src/Dialog/Message.class create mode 100644 comp/src/gb.term.form/.src/Key.class create mode 100644 comp/src/gb.term.form/.src/Mouse.class create mode 100644 comp/src/gb.term.form/.src/TermButton.class create mode 100644 comp/src/gb.term.form/.src/TermCheckBox.class create mode 100644 comp/src/gb.term.form/.src/TermColor.class create mode 100644 comp/src/gb.term.form/.src/TermContainer.class create mode 100644 comp/src/gb.term.form/.src/TermControl.class create mode 100644 comp/src/gb.term.form/.src/TermForm.class create mode 100644 comp/src/gb.term.form/.src/TermFrame.class create mode 100644 comp/src/gb.term.form/.src/TermHBox.class create mode 100644 comp/src/gb.term.form/.src/TermLabel.class create mode 100644 comp/src/gb.term.form/.src/TermListBox.class create mode 100644 comp/src/gb.term.form/.src/TermPanel.class create mode 100644 comp/src/gb.term.form/.src/TermPictureBox.class create mode 100644 comp/src/gb.term.form/.src/TermRadioButton.class create mode 100644 comp/src/gb.term.form/.src/TermScrollBar.class create mode 100644 comp/src/gb.term.form/.src/TermTextBox.class create mode 100644 comp/src/gb.term.form/.src/TermVBox.class create mode 100644 comp/src/gb.term.form/.src/TermWindow.class create mode 100644 comp/src/gb.term.form/.src/TermWindows.class create mode 100644 comp/src/gb.term.form/.src/Test/FTest2.class create mode 100644 comp/src/gb.term.form/.src/Test/Main.module create mode 100644 comp/src/gb.term.form/.src/Test/Main2.module create mode 100644 comp/src/gb.term.form/.src/Test/Main3.module create mode 100644 comp/src/gb.term.form/.src/Test/Module1.module create mode 100644 comp/src/gb.term.form/.src/Test/Termform1.class create mode 100644 comp/src/gb.term.form/.src/Test/Termform1.termform create mode 100644 comp/src/gb.term.form/.src/Test/Termform2.class create mode 100644 comp/src/gb.term.form/.src/Test/Termform2.termform create mode 100644 comp/src/gb.term.form/.src/Test/trfTest.class create mode 100644 comp/src/gb.term.form/all.png create mode 100644 comp/src/gb.util.web/.component create mode 100644 comp/src/gb.util.web/.directory create mode 100644 comp/src/gb.util.web/.hidden/control/ccontainer.png create mode 100644 comp/src/gb.util.web/.hidden/control/ccontrol.png create mode 100644 comp/src/gb.util.web/.icon.png create mode 100644 comp/src/gb.util.web/.project create mode 100644 comp/src/gb.util.web/.src/JS.class create mode 100644 comp/src/gb.util.web/.src/JSON.module create mode 100644 comp/src/gb.util.web/.src/JSONCollection.class create mode 100644 comp/src/gb.util.web/.src/MMain.module create mode 100644 comp/src/gb.util.web/.src/URL.class create mode 100644 comp/src/gb.util.web/.src/URLQuery.class create mode 100644 comp/src/gb.util/.component create mode 100644 comp/src/gb.util/.directory create mode 100644 comp/src/gb.util/.icon.png create mode 100644 comp/src/gb.util/.lang/fr.po create mode 100644 comp/src/gb.util/.lang/it.po create mode 100644 comp/src/gb.util/.lang/ru.po create mode 100644 comp/src/gb.util/.project create mode 100644 comp/src/gb.util/.src/Class.class create mode 100644 comp/src/gb.util/.src/ClassStat.class create mode 100644 comp/src/gb.util/.src/CsvFile.class create mode 100644 comp/src/gb.util/.src/Date.module create mode 100644 comp/src/gb.util/.src/File.class create mode 100644 comp/src/gb.util/.src/MMain.module create mode 100644 comp/src/gb.util/.src/MPhonetic_English.module create mode 100644 comp/src/gb.util/.src/MPhonetic_French.module create mode 100644 comp/src/gb.util/.src/Process.class create mode 100644 comp/src/gb.util/.src/ProcessExpect.class create mode 100644 comp/src/gb.util/.src/Shell.module create mode 100644 comp/src/gb.util/.src/String.class create mode 100644 comp/src/gb.web.feed/.component create mode 100644 comp/src/gb.web.feed/.directory create mode 100644 comp/src/gb.web.feed/.hidden/TODO create mode 100644 comp/src/gb.web.feed/.icon.png create mode 100644 comp/src/gb.web.feed/.lang/it.po create mode 100644 comp/src/gb.web.feed/.lang/nl.po create mode 100644 comp/src/gb.web.feed/.lang/ru.po create mode 100644 comp/src/gb.web.feed/.project create mode 100644 comp/src/gb.web.feed/.src/Main.module create mode 100644 comp/src/gb.web.feed/.src/Rss.class create mode 100644 comp/src/gb.web.feed/.src/RssCategory.class create mode 100644 comp/src/gb.web.feed/.src/RssCloud.class create mode 100644 comp/src/gb.web.feed/.src/RssDate.class create mode 100644 comp/src/gb.web.feed/.src/RssEnclosure.class create mode 100644 comp/src/gb.web.feed/.src/RssGuid.class create mode 100644 comp/src/gb.web.feed/.src/RssImage.class create mode 100644 comp/src/gb.web.feed/.src/RssItem.class create mode 100644 comp/src/gb.web.feed/.src/RssSource.class create mode 100644 comp/src/gb.web.feed/.src/RssTextInput.class create mode 100644 comp/src/gb.web.feed/Feed-icon.svg create mode 100644 comp/src/gb.web.feed/test.xml create mode 100644 comp/src/gb.web.form/.component create mode 100644 comp/src/gb.web.form/.directory create mode 100644 comp/src/gb.web.form/.hidden/Uncompressed/gw-style.css create mode 100644 comp/src/gb.web.form/.hidden/Uncompressed/lib.js create mode 100644 comp/src/gb.web.form/.hidden/Uncompressed/style.css create mode 100644 comp/src/gb.web.form/.hidden/calendar.js create mode 120000 comp/src/gb.web.form/.hidden/control/webbutton.png create mode 120000 comp/src/gb.web.form/.hidden/control/webcheckbox.png create mode 120000 comp/src/gb.web.form/.hidden/control/webcombobox.png create mode 100644 comp/src/gb.web.form/.hidden/control/webcontainer.png create mode 120000 comp/src/gb.web.form/.hidden/control/webdatebox.png create mode 120000 comp/src/gb.web.form/.hidden/control/webdatechooser.png create mode 120000 comp/src/gb.web.form/.hidden/control/webexpander.png create mode 120000 comp/src/gb.web.form/.hidden/control/webhbox.png create mode 100644 comp/src/gb.web.form/.hidden/control/webhtml.png create mode 120000 comp/src/gb.web.form/.hidden/control/webimage.png create mode 120000 comp/src/gb.web.form/.hidden/control/weblabel.png create mode 120000 comp/src/gb.web.form/.hidden/control/weblistbox.png create mode 100644 comp/src/gb.web.form/.hidden/control/webmenu.png create mode 100644 comp/src/gb.web.form/.hidden/control/webmenubar.png create mode 100644 comp/src/gb.web.form/.hidden/control/webmenuitem.png create mode 120000 comp/src/gb.web.form/.hidden/control/webprogressbar.png create mode 120000 comp/src/gb.web.form/.hidden/control/webradiobutton.png create mode 120000 comp/src/gb.web.form/.hidden/control/webscrollview.png create mode 120000 comp/src/gb.web.form/.hidden/control/webseparator.png create mode 120000 comp/src/gb.web.form/.hidden/control/webslider.png create mode 120000 comp/src/gb.web.form/.hidden/control/webspinbox.png create mode 100644 comp/src/gb.web.form/.hidden/control/webtable.png create mode 120000 comp/src/gb.web.form/.hidden/control/webtabpanel.png create mode 120000 comp/src/gb.web.form/.hidden/control/webtextarea.png create mode 120000 comp/src/gb.web.form/.hidden/control/webtextbox.png create mode 120000 comp/src/gb.web.form/.hidden/control/webtimer.png create mode 100644 comp/src/gb.web.form/.hidden/control/webuploadarea.png create mode 100644 comp/src/gb.web.form/.hidden/control/webuploadbutton.png create mode 100644 comp/src/gb.web.form/.hidden/control/webuploader.png create mode 120000 comp/src/gb.web.form/.hidden/control/webvbox.png create mode 100644 comp/src/gb.web.form/.icon.png create mode 100644 comp/src/gb.web.form/.lang/fr.po create mode 100644 comp/src/gb.web.form/.lang/it.po create mode 100644 comp/src/gb.web.form/.lang/nl.po create mode 100644 comp/src/gb.web.form/.lang/pt_BR.po create mode 100644 comp/src/gb.web.form/.lang/ru.po create mode 100644 comp/src/gb.web.form/.project create mode 100644 comp/src/gb.web.form/.public/favicon.png create mode 100644 comp/src/gb.web.form/.public/gw-arrow-down.png create mode 100644 comp/src/gb.web.form/.public/gw-arrow-left.png create mode 100644 comp/src/gb.web.form/.public/gw-arrow-right.png create mode 100644 comp/src/gb.web.form/.public/gw-arrow-up.png create mode 100644 comp/src/gb.web.form/.public/gw-close.png create mode 100644 comp/src/gb.web.form/.public/gw-max.png create mode 100644 comp/src/gb.web.form/.public/gw-table-more.gif create mode 100644 comp/src/gb.web.form/.public/gw-waiting.gif create mode 100644 comp/src/gb.web.form/.public/message/close.svg create mode 100644 comp/src/gb.web.form/.public/message/error.png create mode 100644 comp/src/gb.web.form/.public/message/info.png create mode 100644 comp/src/gb.web.form/.public/message/question.png create mode 100644 comp/src/gb.web.form/.public/message/warning.png create mode 100644 comp/src/gb.web.form/.public/new.png create mode 100644 comp/src/gb.web.form/.public/open.png create mode 100644 comp/src/gb.web.form/.src/Align.class create mode 100644 comp/src/gb.web.form/.src/Arrange.class create mode 100644 comp/src/gb.web.form/.src/Calendar/FCalendar.class create mode 100644 comp/src/gb.web.form/.src/Calendar/FCalendar.webform create mode 100644 comp/src/gb.web.form/.src/Calendar/WebDateBox.class create mode 100644 comp/src/gb.web.form/.src/Calendar/WebDateChooser.class create mode 100644 comp/src/gb.web.form/.src/Color.class create mode 100644 comp/src/gb.web.form/.src/Header.class create mode 100644 comp/src/gb.web.form/.src/Header.webpage create mode 100644 comp/src/gb.web.form/.src/Main.module create mode 100644 comp/src/gb.web.form/.src/Message/FMessage.class create mode 100644 comp/src/gb.web.form/.src/Message/FMessage.webform create mode 100644 comp/src/gb.web.form/.src/Message/Message.class create mode 100644 comp/src/gb.web.form/.src/Scroll.class create mode 100644 comp/src/gb.web.form/.src/Select.class create mode 100644 comp/src/gb.web.form/.src/Test/Embed1.class create mode 100644 comp/src/gb.web.form/.src/Test/Embed1.webform create mode 100644 comp/src/gb.web.form/.src/Test/Embed2.class create mode 100644 comp/src/gb.web.form/.src/Test/Embed2.webform create mode 100644 comp/src/gb.web.form/.src/Test/FHello.class create mode 100644 comp/src/gb.web.form/.src/Test/FHello.webform create mode 100644 comp/src/gb.web.form/.src/Test/FTestWebUploader.class create mode 100644 comp/src/gb.web.form/.src/Test/FTestWebUploader.webform create mode 100644 comp/src/gb.web.form/.src/Test/Webform1.class create mode 100644 comp/src/gb.web.form/.src/Test/Webform1.webform create mode 100644 comp/src/gb.web.form/.src/Test/Webform2.class create mode 100644 comp/src/gb.web.form/.src/Test/Webform2.webform create mode 100644 comp/src/gb.web.form/.src/Test/Webform3.class create mode 100644 comp/src/gb.web.form/.src/Test/Webform3.webform create mode 100644 comp/src/gb.web.form/.src/Test/Webform4.class create mode 100644 comp/src/gb.web.form/.src/Test/Webform4.webform create mode 100644 comp/src/gb.web.form/.src/Test/Webform5.class create mode 100644 comp/src/gb.web.form/.src/Test/Webform5.webform create mode 100644 comp/src/gb.web.form/.src/Test/Webform6.class create mode 100644 comp/src/gb.web.form/.src/Test/Webform6.webform create mode 100644 comp/src/gb.web.form/.src/Test/Webform7.class create mode 100644 comp/src/gb.web.form/.src/Test/Webform7.webform create mode 100644 comp/src/gb.web.form/.src/Test/Webform8.class create mode 100644 comp/src/gb.web.form/.src/Test/Webform8.webform create mode 100644 comp/src/gb.web.form/.src/WebButton.class create mode 100644 comp/src/gb.web.form/.src/WebCheckBox.class create mode 100644 comp/src/gb.web.form/.src/WebComboBox.class create mode 100644 comp/src/gb.web.form/.src/WebContainer.class create mode 100644 comp/src/gb.web.form/.src/WebControl.class create mode 100644 comp/src/gb.web.form/.src/WebControlStyle.class create mode 100644 comp/src/gb.web.form/.src/WebExpander.class create mode 100644 comp/src/gb.web.form/.src/WebForm.class create mode 100644 comp/src/gb.web.form/.src/WebHBox.class create mode 100644 comp/src/gb.web.form/.src/WebHtml.class create mode 100644 comp/src/gb.web.form/.src/WebImage.class create mode 100644 comp/src/gb.web.form/.src/WebLabel.class create mode 100644 comp/src/gb.web.form/.src/WebMenu.class create mode 100644 comp/src/gb.web.form/.src/WebMenuBar.class create mode 100644 comp/src/gb.web.form/.src/WebMenuItem.class create mode 100644 comp/src/gb.web.form/.src/WebProgressBar.class create mode 100644 comp/src/gb.web.form/.src/WebRadioButton.class create mode 100644 comp/src/gb.web.form/.src/WebScrollView.class create mode 100644 comp/src/gb.web.form/.src/WebSeparator.class create mode 100644 comp/src/gb.web.form/.src/WebSlider.class create mode 100644 comp/src/gb.web.form/.src/WebSpinBox.class create mode 100644 comp/src/gb.web.form/.src/WebTabPanel.class create mode 100644 comp/src/gb.web.form/.src/WebTable/WebTable.class create mode 100644 comp/src/gb.web.form/.src/WebTable/WebTableData.class create mode 100644 comp/src/gb.web.form/.src/WebTable/WebTableSelection.class create mode 100644 comp/src/gb.web.form/.src/WebTable/_WebTableColumn.class create mode 100644 comp/src/gb.web.form/.src/WebTable/_WebTableColumns.class create mode 100644 comp/src/gb.web.form/.src/WebTextArea.class create mode 100644 comp/src/gb.web.form/.src/WebTextBox.class create mode 100644 comp/src/gb.web.form/.src/WebTimer.class create mode 100644 comp/src/gb.web.form/.src/WebUploadArea.class create mode 100644 comp/src/gb.web.form/.src/WebUploadButton.class create mode 100644 comp/src/gb.web.form/.src/WebUploader.class create mode 100644 comp/src/gb.web.form/.src/WebVBox.class create mode 100644 comp/src/gb.web.form/.src/WebWindow.class create mode 100644 comp/src/gb.web.form/ac.js create mode 100644 comp/src/gb.web.form/arrow-down.png create mode 100644 comp/src/gb.web.form/arrow-right.png create mode 100644 comp/src/gb.web.form/clear.png create mode 100644 comp/src/gb.web.form/lib.js create mode 100644 comp/src/gb.web.form/shadow.png create mode 100644 comp/src/gb.web.form/style.css create mode 100644 comp/src/gb.web.gui/.component create mode 100644 comp/src/gb.web.gui/.directory create mode 120000 comp/src/gb.web.gui/.hidden/control/webbutton.png create mode 120000 comp/src/gb.web.gui/.hidden/control/webcheckbox.png create mode 120000 comp/src/gb.web.gui/.hidden/control/webcombobox.png create mode 100644 comp/src/gb.web.gui/.hidden/control/webcontainer.png create mode 120000 comp/src/gb.web.gui/.hidden/control/webdatebox.png create mode 120000 comp/src/gb.web.gui/.hidden/control/webdatechooser.png create mode 120000 comp/src/gb.web.gui/.hidden/control/webexpander.png create mode 100644 comp/src/gb.web.gui/.hidden/control/webfilebutton.png create mode 120000 comp/src/gb.web.gui/.hidden/control/webhbox.png create mode 100644 comp/src/gb.web.gui/.hidden/control/webhtml.png create mode 120000 comp/src/gb.web.gui/.hidden/control/webimage.png create mode 120000 comp/src/gb.web.gui/.hidden/control/weblabel.png create mode 120000 comp/src/gb.web.gui/.hidden/control/weblistbox.png create mode 100644 comp/src/gb.web.gui/.hidden/control/webmenu.png create mode 100644 comp/src/gb.web.gui/.hidden/control/webmenubar.png create mode 100644 comp/src/gb.web.gui/.hidden/control/webmenuitem.png create mode 120000 comp/src/gb.web.gui/.hidden/control/webprogressbar.png create mode 120000 comp/src/gb.web.gui/.hidden/control/webradiobutton.png create mode 120000 comp/src/gb.web.gui/.hidden/control/webscrollview.png create mode 120000 comp/src/gb.web.gui/.hidden/control/webseparator.png create mode 120000 comp/src/gb.web.gui/.hidden/control/webslider.png create mode 120000 comp/src/gb.web.gui/.hidden/control/webspinbox.png create mode 100644 comp/src/gb.web.gui/.hidden/control/webtable.png create mode 120000 comp/src/gb.web.gui/.hidden/control/webtabpanel.png create mode 120000 comp/src/gb.web.gui/.hidden/control/webtextarea.png create mode 120000 comp/src/gb.web.gui/.hidden/control/webtextbox.png create mode 120000 comp/src/gb.web.gui/.hidden/control/webtimer.png create mode 100644 comp/src/gb.web.gui/.hidden/control/webupload.png create mode 100644 comp/src/gb.web.gui/.hidden/control/webuploadarea.png create mode 100644 comp/src/gb.web.gui/.hidden/control/webuploadbutton.png create mode 100644 comp/src/gb.web.gui/.hidden/control/webuploader.png create mode 120000 comp/src/gb.web.gui/.hidden/control/webvbox.png create mode 100644 comp/src/gb.web.gui/.hidden/lib.js.copy create mode 100644 comp/src/gb.web.gui/.hidden/webform.png create mode 100644 comp/src/gb.web.gui/.icon.png create mode 100644 comp/src/gb.web.gui/.lang/it.po create mode 100644 comp/src/gb.web.gui/.lang/pt_BR.po create mode 100644 comp/src/gb.web.gui/.project create mode 100644 comp/src/gb.web.gui/.public/favicon.png create mode 100644 comp/src/gb.web.gui/.public/gw-arrow-down.png create mode 100644 comp/src/gb.web.gui/.public/gw-arrow-left.png create mode 100644 comp/src/gb.web.gui/.public/gw-arrow-right.png create mode 100644 comp/src/gb.web.gui/.public/gw-arrow-up.png create mode 100644 comp/src/gb.web.gui/.public/gw-close.png create mode 100644 comp/src/gb.web.gui/.public/gw-table-more.gif create mode 100644 comp/src/gb.web.gui/.public/gw-waiting.gif create mode 100644 comp/src/gb.web.gui/.public/message/error.png create mode 100644 comp/src/gb.web.gui/.public/message/info.png create mode 100644 comp/src/gb.web.gui/.public/message/question.png create mode 100644 comp/src/gb.web.gui/.public/message/warning.png create mode 100644 comp/src/gb.web.gui/.src/Align.class create mode 100644 comp/src/gb.web.gui/.src/Arrange.class create mode 100644 comp/src/gb.web.gui/.src/CSelection.class create mode 100644 comp/src/gb.web.gui/.src/Calendar/FCalendar.class create mode 100644 comp/src/gb.web.gui/.src/Calendar/FCalendar.webform create mode 100644 comp/src/gb.web.gui/.src/Calendar/WebDateBox.class create mode 100644 comp/src/gb.web.gui/.src/Calendar/WebDateChooser.class create mode 100644 comp/src/gb.web.gui/.src/Color.class create mode 100644 comp/src/gb.web.gui/.src/Header.class create mode 100644 comp/src/gb.web.gui/.src/Header.webpage create mode 100644 comp/src/gb.web.gui/.src/Menu/FPopupMenu.class create mode 100644 comp/src/gb.web.gui/.src/Menu/FPopupMenu.webform create mode 100644 comp/src/gb.web.gui/.src/Menu/WebMenu.class create mode 100644 comp/src/gb.web.gui/.src/Menu/WebMenuBar.class create mode 100644 comp/src/gb.web.gui/.src/Message/FMessage.class create mode 100644 comp/src/gb.web.gui/.src/Message/FMessage.webform create mode 100644 comp/src/gb.web.gui/.src/Message/Message.class create mode 100644 comp/src/gb.web.gui/.src/Scroll.class create mode 100644 comp/src/gb.web.gui/.src/Select.class create mode 100644 comp/src/gb.web.gui/.src/Session.module create mode 100644 comp/src/gb.web.gui/.src/Table/WebTable.class create mode 100644 comp/src/gb.web.gui/.src/Table/WebTableData.class create mode 100644 comp/src/gb.web.gui/.src/Table/_WebTableColumn.class create mode 100644 comp/src/gb.web.gui/.src/Table/_WebTableColumns.class create mode 100644 comp/src/gb.web.gui/.src/Test/Webform1.class create mode 100644 comp/src/gb.web.gui/.src/Test/Webform1.webform create mode 100644 comp/src/gb.web.gui/.src/Test/Webform2.class create mode 100644 comp/src/gb.web.gui/.src/Test/Webform2.webform create mode 100644 comp/src/gb.web.gui/.src/Test/Webform3.class create mode 100644 comp/src/gb.web.gui/.src/Test/Webform3.webform create mode 100644 comp/src/gb.web.gui/.src/Upload.module create mode 100644 comp/src/gb.web.gui/.src/WebButton.class create mode 100644 comp/src/gb.web.gui/.src/WebCheckBox.class create mode 100644 comp/src/gb.web.gui/.src/WebComboBox.class create mode 100644 comp/src/gb.web.gui/.src/WebContainer.class create mode 100644 comp/src/gb.web.gui/.src/WebControl.class create mode 100644 comp/src/gb.web.gui/.src/WebControlStyle.class create mode 100644 comp/src/gb.web.gui/.src/WebFileButton.class create mode 100644 comp/src/gb.web.gui/.src/WebForm.class create mode 100644 comp/src/gb.web.gui/.src/WebHBox.class create mode 100644 comp/src/gb.web.gui/.src/WebHtml.class create mode 100644 comp/src/gb.web.gui/.src/WebImage.class create mode 100644 comp/src/gb.web.gui/.src/WebLabel.class create mode 100644 comp/src/gb.web.gui/.src/WebListBox.class create mode 100644 comp/src/gb.web.gui/.src/WebProgressBar.class create mode 100644 comp/src/gb.web.gui/.src/WebRadioButton.class create mode 100644 comp/src/gb.web.gui/.src/WebScrollView.class create mode 100644 comp/src/gb.web.gui/.src/WebSeparator.class create mode 100644 comp/src/gb.web.gui/.src/WebSlider.class create mode 100644 comp/src/gb.web.gui/.src/WebSpinBox.class create mode 100644 comp/src/gb.web.gui/.src/WebTabPanel.class create mode 100644 comp/src/gb.web.gui/.src/WebTextArea.class create mode 100644 comp/src/gb.web.gui/.src/WebTextBox.class create mode 100644 comp/src/gb.web.gui/.src/WebTimer.class create mode 100644 comp/src/gb.web.gui/.src/WebVBox.class create mode 100644 comp/src/gb.web.gui/.src/WebWindow.class create mode 100644 comp/src/gb.web.gui/ac.js create mode 100644 comp/src/gb.web.gui/lib.js create mode 100644 comp/src/gb.web.gui/style.css create mode 100644 comp/src/gb.web/.component create mode 100644 comp/src/gb.web/.directory create mode 100644 comp/src/gb.web/.hidden/Session_opt create mode 100644 comp/src/gb.web/.icon.png create mode 100644 comp/src/gb.web/.project create mode 100644 comp/src/gb.web/.src/Application.module create mode 100644 comp/src/gb.web/.src/CGI.module create mode 100644 comp/src/gb.web/.src/FileSessionManager.class create mode 100644 comp/src/gb.web/.src/Main.module create mode 100644 comp/src/gb.web/.src/Request.module create mode 100644 comp/src/gb.web/.src/Response.module create mode 100644 comp/src/gb.web/.src/Session.module create mode 100644 comp/src/gb.web/.src/SessionManager.class create mode 100644 comp/src/gb.web/.src/SqliteSessionManager.class create mode 100644 comp/src/gb.web/.src/URL.class create mode 100644 comp/src/gb.web/.src/WebPage.class create mode 100644 comp/src/gb.web/.src/Webpage1.class create mode 100644 comp/src/gb.web/.src/Webpage1.webpage create mode 100644 comp/src/gb.web/.src/Webpage2.class create mode 100644 comp/src/gb.web/.src/Webpage2.webpage create mode 100644 comp/src/gb.web/.src/_Request_Get.class create mode 100644 comp/src/gb.web/.src/_Request_Post.class create mode 100644 comp/src/gb.web/.src/_ResponseCache.module create mode 100644 comp/src/gb.web/lang.cache create mode 100644 comp/src/order create mode 100644 component.am create mode 100644 configure.ac create mode 100644 gb.cairo/AUTHORS create mode 120000 gb.cairo/COPYING create mode 100644 gb.cairo/ChangeLog create mode 120000 gb.cairo/INSTALL create mode 100644 gb.cairo/Makefile.am create mode 100644 gb.cairo/NEWS create mode 100644 gb.cairo/README create mode 120000 gb.cairo/acinclude.m4 create mode 120000 gb.cairo/component.am create mode 100644 gb.cairo/configure.ac create mode 120000 gb.cairo/gambas.h create mode 120000 gb.cairo/gb.image.h create mode 120000 gb.cairo/gb_common.h create mode 120000 gb.cairo/m4 create mode 120000 gb.cairo/reconf create mode 100644 gb.cairo/src/Makefile.am create mode 100644 gb.cairo/src/c_cairo.c create mode 100644 gb.cairo/src/c_cairo.h create mode 100644 gb.cairo/src/c_surface.c create mode 100644 gb.cairo/src/c_surface.h create mode 100644 gb.cairo/src/gb.cairo.component create mode 100644 gb.cairo/src/main.c create mode 100644 gb.cairo/src/main.h create mode 100644 gb.compress.bzlib2/AUTHORS create mode 120000 gb.compress.bzlib2/COPYING create mode 100644 gb.compress.bzlib2/ChangeLog create mode 120000 gb.compress.bzlib2/INSTALL create mode 100644 gb.compress.bzlib2/Makefile.am create mode 100644 gb.compress.bzlib2/NEWS create mode 100644 gb.compress.bzlib2/README create mode 120000 gb.compress.bzlib2/acinclude.m4 create mode 120000 gb.compress.bzlib2/component.am create mode 100644 gb.compress.bzlib2/configure.ac create mode 120000 gb.compress.bzlib2/gambas.h create mode 120000 gb.compress.bzlib2/gb.compress.h create mode 120000 gb.compress.bzlib2/gb_common.h create mode 120000 gb.compress.bzlib2/m4 create mode 120000 gb.compress.bzlib2/reconf create mode 100644 gb.compress.bzlib2/src/Makefile.am create mode 100644 gb.compress.bzlib2/src/gb.compress.bzlib2.component create mode 100644 gb.compress.bzlib2/src/main.c create mode 100644 gb.compress.bzlib2/src/main.h create mode 100644 gb.compress.zlib/AUTHORS create mode 120000 gb.compress.zlib/COPYING create mode 100644 gb.compress.zlib/ChangeLog create mode 120000 gb.compress.zlib/INSTALL create mode 100644 gb.compress.zlib/Makefile.am create mode 100644 gb.compress.zlib/NEWS create mode 100644 gb.compress.zlib/README create mode 120000 gb.compress.zlib/acinclude.m4 create mode 120000 gb.compress.zlib/component.am create mode 100644 gb.compress.zlib/configure.ac create mode 120000 gb.compress.zlib/gambas.h create mode 120000 gb.compress.zlib/gb.compress.h create mode 120000 gb.compress.zlib/gb_common.h create mode 120000 gb.compress.zlib/m4 create mode 120000 gb.compress.zlib/reconf create mode 100644 gb.compress.zlib/src/Makefile.am create mode 100644 gb.compress.zlib/src/gb.compress.zlib.component create mode 100644 gb.compress.zlib/src/main.c create mode 100644 gb.compress.zlib/src/main.h create mode 100644 gb.crypt/AUTHORS create mode 120000 gb.crypt/COPYING create mode 100644 gb.crypt/ChangeLog create mode 120000 gb.crypt/INSTALL create mode 100644 gb.crypt/Makefile.am create mode 100644 gb.crypt/NEWS create mode 100644 gb.crypt/README create mode 120000 gb.crypt/acinclude.m4 create mode 120000 gb.crypt/component.am create mode 100644 gb.crypt/configure.ac create mode 120000 gb.crypt/gambas.h create mode 120000 gb.crypt/gb_common.h create mode 120000 gb.crypt/m4 create mode 120000 gb.crypt/reconf create mode 100644 gb.crypt/src/Makefile.am create mode 100644 gb.crypt/src/c_crypt.c create mode 100644 gb.crypt/src/c_crypt.h create mode 100644 gb.crypt/src/gb.crypt.component create mode 100644 gb.crypt/src/main.c create mode 100644 gb.crypt/src/main.h create mode 100644 gb.db.mysql/AUTHORS create mode 120000 gb.db.mysql/COPYING create mode 100644 gb.db.mysql/ChangeLog create mode 120000 gb.db.mysql/INSTALL create mode 100644 gb.db.mysql/Makefile.am create mode 100644 gb.db.mysql/NEWS create mode 100644 gb.db.mysql/README create mode 120000 gb.db.mysql/acinclude.m4 create mode 120000 gb.db.mysql/component.am create mode 100644 gb.db.mysql/configure.ac create mode 120000 gb.db.mysql/gambas.h create mode 120000 gb.db.mysql/gb.db.h create mode 120000 gb.db.mysql/gb.db.proto.h create mode 120000 gb.db.mysql/gb_common.h create mode 120000 gb.db.mysql/m4 create mode 120000 gb.db.mysql/reconf create mode 100755 gb.db.mysql/src/Makefile.am create mode 100644 gb.db.mysql/src/gb.db.mysql.component create mode 100644 gb.db.mysql/src/main.c create mode 100644 gb.db.mysql/src/main.h create mode 100644 gb.db.odbc/AUTHORS create mode 120000 gb.db.odbc/COPYING create mode 100644 gb.db.odbc/ChangeLog create mode 120000 gb.db.odbc/INSTALL create mode 100644 gb.db.odbc/Makefile.am create mode 100644 gb.db.odbc/NEWS create mode 100644 gb.db.odbc/README create mode 120000 gb.db.odbc/acinclude.m4 create mode 120000 gb.db.odbc/component.am create mode 100644 gb.db.odbc/configure.ac create mode 120000 gb.db.odbc/gambas.h create mode 120000 gb.db.odbc/gb.db.h create mode 120000 gb.db.odbc/gb.db.proto.h create mode 120000 gb.db.odbc/gb_common.h create mode 120000 gb.db.odbc/m4 create mode 120000 gb.db.odbc/reconf create mode 100644 gb.db.odbc/src/Makefile.am create mode 100644 gb.db.odbc/src/gb.db.odbc.component create mode 100644 gb.db.odbc/src/main.c create mode 100644 gb.db.odbc/src/main.h create mode 100644 gb.db.postgresql/AUTHORS create mode 100644 gb.db.postgresql/COPYING create mode 100644 gb.db.postgresql/COPYING.GPL create mode 100644 gb.db.postgresql/ChangeLog create mode 120000 gb.db.postgresql/INSTALL create mode 100644 gb.db.postgresql/Makefile.am create mode 100644 gb.db.postgresql/NEWS create mode 100644 gb.db.postgresql/README create mode 120000 gb.db.postgresql/acinclude.m4 create mode 120000 gb.db.postgresql/component.am create mode 100644 gb.db.postgresql/configure.ac create mode 120000 gb.db.postgresql/gambas.h create mode 120000 gb.db.postgresql/gb.db.h create mode 120000 gb.db.postgresql/gb.db.proto.h create mode 120000 gb.db.postgresql/gb_common.h create mode 120000 gb.db.postgresql/m4 create mode 120000 gb.db.postgresql/reconf create mode 100644 gb.db.postgresql/src/Makefile.am create mode 100644 gb.db.postgresql/src/gb.db.postgresql.component create mode 100644 gb.db.postgresql/src/main.c create mode 100644 gb.db.postgresql/src/main.h create mode 100644 gb.db.sqlite2/AUTHORS create mode 120000 gb.db.sqlite2/COPYING create mode 100644 gb.db.sqlite2/ChangeLog create mode 120000 gb.db.sqlite2/INSTALL create mode 100644 gb.db.sqlite2/Makefile.am create mode 100644 gb.db.sqlite2/NEWS create mode 100644 gb.db.sqlite2/README create mode 100644 gb.db.sqlite2/TODO create mode 120000 gb.db.sqlite2/acinclude.m4 create mode 120000 gb.db.sqlite2/component.am create mode 100644 gb.db.sqlite2/configure.ac create mode 120000 gb.db.sqlite2/gambas.h create mode 120000 gb.db.sqlite2/gb.db.h create mode 120000 gb.db.sqlite2/gb.db.proto.h create mode 120000 gb.db.sqlite2/gb_common.h create mode 120000 gb.db.sqlite2/m4 create mode 120000 gb.db.sqlite2/reconf create mode 100755 gb.db.sqlite2/src/Makefile.am create mode 100644 gb.db.sqlite2/src/dataset.cpp create mode 100644 gb.db.sqlite2/src/dataset.h create mode 100644 gb.db.sqlite2/src/gb.db.sqlite2.component create mode 100644 gb.db.sqlite2/src/main.cpp create mode 100644 gb.db.sqlite2/src/main.h create mode 100644 gb.db.sqlite2/src/qry_dat.cpp create mode 100644 gb.db.sqlite2/src/qry_dat.h create mode 100644 gb.db.sqlite2/src/sqlitedataset.cpp create mode 100644 gb.db.sqlite2/src/sqlitedataset.h create mode 100644 gb.db.sqlite2/src/stringhelper.cpp create mode 100644 gb.db.sqlite2/src/stringhelper.h create mode 100644 gb.db.sqlite3/AUTHORS create mode 120000 gb.db.sqlite3/COPYING create mode 100644 gb.db.sqlite3/ChangeLog create mode 120000 gb.db.sqlite3/INSTALL create mode 100644 gb.db.sqlite3/Makefile.am create mode 100644 gb.db.sqlite3/NEWS create mode 100644 gb.db.sqlite3/README create mode 120000 gb.db.sqlite3/acinclude.m4 create mode 120000 gb.db.sqlite3/component.am create mode 100644 gb.db.sqlite3/configure.ac create mode 120000 gb.db.sqlite3/gambas.h create mode 120000 gb.db.sqlite3/gb.db.h create mode 120000 gb.db.sqlite3/gb.db.proto.h create mode 120000 gb.db.sqlite3/gb_common.h create mode 120000 gb.db.sqlite3/m4 create mode 120000 gb.db.sqlite3/reconf create mode 100755 gb.db.sqlite3/src/Makefile.am create mode 100644 gb.db.sqlite3/src/README create mode 100644 gb.db.sqlite3/src/gb.db.sqlite3.component create mode 100644 gb.db.sqlite3/src/gb_buffer.c create mode 100644 gb.db.sqlite3/src/gb_buffer.h create mode 100644 gb.db.sqlite3/src/helper.c create mode 100644 gb.db.sqlite3/src/helper.h create mode 100644 gb.db.sqlite3/src/main.c create mode 100644 gb.db.sqlite3/src/main.h create mode 100644 gb.dbus/AUTHORS create mode 120000 gb.dbus/COPYING create mode 100644 gb.dbus/ChangeLog create mode 120000 gb.dbus/INSTALL create mode 100644 gb.dbus/Makefile.am create mode 100644 gb.dbus/NEWS create mode 100644 gb.dbus/README create mode 120000 gb.dbus/acinclude.m4 create mode 120000 gb.dbus/component.am create mode 100644 gb.dbus/configure.ac create mode 120000 gb.dbus/gambas.h create mode 120000 gb.dbus/gb_common.h create mode 120000 gb.dbus/m4 create mode 120000 gb.dbus/reconf create mode 100644 gb.dbus/src/Makefile.am create mode 100644 gb.dbus/src/c_dbus.c create mode 100644 gb.dbus/src/c_dbus.h create mode 100644 gb.dbus/src/c_dbusconnection.c create mode 100644 gb.dbus/src/c_dbusconnection.h create mode 100644 gb.dbus/src/c_dbusobserver.c create mode 100644 gb.dbus/src/c_dbusobserver.h create mode 100644 gb.dbus/src/c_dbusvariant.c create mode 100644 gb.dbus/src/c_dbusvariant.h create mode 100644 gb.dbus/src/dbus_print_message.c create mode 100644 gb.dbus/src/dbus_print_message.h create mode 100644 gb.dbus/src/gb.dbus.component create mode 100644 gb.dbus/src/gb.dbus/.directory create mode 100644 gb.dbus/src/gb.dbus/.icon.png create mode 100644 gb.dbus/src/gb.dbus/.project create mode 100644 gb.dbus/src/gb.dbus/.src/CTest.class create mode 100644 gb.dbus/src/gb.dbus/.src/CTest2.class create mode 100644 gb.dbus/src/gb.dbus/.src/CTest3.class create mode 100644 gb.dbus/src/gb.dbus/.src/DBus.class create mode 100644 gb.dbus/src/gb.dbus/.src/DBusApplication.class create mode 100644 gb.dbus/src/gb.dbus/.src/DBusObject.class create mode 100644 gb.dbus/src/gb.dbus/.src/DBusProxy.class create mode 100644 gb.dbus/src/gb.dbus/.src/DBusSignal.class create mode 100644 gb.dbus/src/gb.dbus/.src/DBusValues.class create mode 100644 gb.dbus/src/gb.dbus/.src/MMain.module create mode 100644 gb.dbus/src/gb.dbus/.src/MyObject.class create mode 100644 gb.dbus/src/gb.dbus/.src/MyValue.class create mode 100644 gb.dbus/src/gb.dbus/.src/_DBusNull.class create mode 100644 gb.dbus/src/gb.dbus/.src/mpris.class create mode 100644 gb.dbus/src/helper.c create mode 100644 gb.dbus/src/helper.h create mode 100644 gb.dbus/src/main.c create mode 100644 gb.dbus/src/main.h create mode 100644 gb.desktop.gnome.keyring/AUTHORS create mode 120000 gb.desktop.gnome.keyring/COPYING create mode 100644 gb.desktop.gnome.keyring/ChangeLog create mode 120000 gb.desktop.gnome.keyring/INSTALL create mode 100644 gb.desktop.gnome.keyring/Makefile.am create mode 100644 gb.desktop.gnome.keyring/NEWS create mode 100644 gb.desktop.gnome.keyring/README create mode 120000 gb.desktop.gnome.keyring/acinclude.m4 create mode 120000 gb.desktop.gnome.keyring/component.am create mode 100644 gb.desktop.gnome.keyring/configure.ac create mode 120000 gb.desktop.gnome.keyring/gambas.h create mode 120000 gb.desktop.gnome.keyring/gb_common.h create mode 120000 gb.desktop.gnome.keyring/m4 create mode 120000 gb.desktop.gnome.keyring/reconf create mode 100644 gb.desktop.gnome.keyring/src/Makefile.am create mode 100644 gb.desktop.gnome.keyring/src/gb.desktop.gnome.keyring.component create mode 100644 gb.desktop.gnome.keyring/src/keyring.c create mode 100644 gb.desktop.gnome.keyring/src/keyring.h create mode 100644 gb.desktop.gnome.keyring/src/main.c create mode 100644 gb.desktop.gnome.keyring/src/main.h create mode 100644 gb.desktop.x11/AUTHORS create mode 120000 gb.desktop.x11/COPYING create mode 100644 gb.desktop.x11/ChangeLog create mode 120000 gb.desktop.x11/INSTALL create mode 100644 gb.desktop.x11/Makefile.am create mode 100644 gb.desktop.x11/NEWS create mode 100644 gb.desktop.x11/README create mode 120000 gb.desktop.x11/acinclude.m4 create mode 120000 gb.desktop.x11/component.am create mode 100644 gb.desktop.x11/configure.ac create mode 120000 gb.desktop.x11/gambas.h create mode 120000 gb.desktop.x11/gb.image.h create mode 120000 gb.desktop.x11/gb_common.h create mode 120000 gb.desktop.x11/gb_list.h create mode 120000 gb.desktop.x11/gb_list_temp.h create mode 120000 gb.desktop.x11/m4 create mode 120000 gb.desktop.x11/reconf create mode 100644 gb.desktop.x11/src/Makefile.am create mode 100644 gb.desktop.x11/src/c_x11.c create mode 100644 gb.desktop.x11/src/c_x11.h create mode 100644 gb.desktop.x11/src/c_x11systray.c create mode 100644 gb.desktop.x11/src/c_x11systray.h create mode 100644 gb.desktop.x11/src/gb.desktop.x11.component create mode 100644 gb.desktop.x11/src/gb_list.c create mode 100644 gb.desktop.x11/src/main.c create mode 100644 gb.desktop.x11/src/main.h create mode 100644 gb.desktop.x11/src/systray/common.h create mode 100644 gb.desktop.x11/src/systray/debug.c create mode 100644 gb.desktop.x11/src/systray/debug.h create mode 100644 gb.desktop.x11/src/systray/embed.c create mode 100644 gb.desktop.x11/src/systray/embed.h create mode 100644 gb.desktop.x11/src/systray/icons.c create mode 100644 gb.desktop.x11/src/systray/icons.h create mode 100644 gb.desktop.x11/src/systray/kde_tray.c create mode 100644 gb.desktop.x11/src/systray/kde_tray.h create mode 100644 gb.desktop.x11/src/systray/list.h create mode 100644 gb.desktop.x11/src/systray/settings.c create mode 100644 gb.desktop.x11/src/systray/settings.h create mode 100644 gb.desktop.x11/src/systray/systray.c create mode 100644 gb.desktop.x11/src/systray/systray.h create mode 100644 gb.desktop.x11/src/systray/tray.c create mode 100644 gb.desktop.x11/src/systray/tray.h create mode 100644 gb.desktop.x11/src/systray/wmh.c create mode 100644 gb.desktop.x11/src/systray/wmh.h create mode 100644 gb.desktop.x11/src/systray/xembed.c create mode 100644 gb.desktop.x11/src/systray/xembed.h create mode 100644 gb.desktop.x11/src/systray/xutils.c create mode 100644 gb.desktop.x11/src/systray/xutils.h create mode 100644 gb.desktop.x11/src/x11.c create mode 100644 gb.desktop.x11/src/x11.h create mode 100644 gb.gmp/AUTHORS create mode 120000 gb.gmp/COPYING create mode 100644 gb.gmp/ChangeLog create mode 120000 gb.gmp/INSTALL create mode 100644 gb.gmp/Makefile.am create mode 100644 gb.gmp/NEWS create mode 100644 gb.gmp/README create mode 120000 gb.gmp/acinclude.m4 create mode 120000 gb.gmp/component.am create mode 100644 gb.gmp/configure.ac create mode 120000 gb.gmp/gambas.h create mode 120000 gb.gmp/gb_common.h create mode 120000 gb.gmp/m4 create mode 120000 gb.gmp/reconf create mode 100644 gb.gmp/src/Makefile.am create mode 100644 gb.gmp/src/c_bigint.c create mode 100644 gb.gmp/src/c_bigint.h create mode 100644 gb.gmp/src/c_rational.c create mode 100644 gb.gmp/src/c_rational.h create mode 100644 gb.gmp/src/gb.gmp.component create mode 100644 gb.gmp/src/main.c create mode 100644 gb.gmp/src/main.h create mode 100644 gb.gsl/AUTHORS create mode 120000 gb.gsl/COPYING create mode 100644 gb.gsl/ChangeLog create mode 120000 gb.gsl/INSTALL create mode 100644 gb.gsl/Makefile.am create mode 100644 gb.gsl/NEWS create mode 100644 gb.gsl/README create mode 100644 gb.gsl/Test/test/.directory create mode 100644 gb.gsl/Test/test/.icon.png create mode 100644 gb.gsl/Test/test/.project create mode 100644 gb.gsl/Test/test/.src/MMain.module create mode 100644 gb.gsl/Test/test/.src/Test.class create mode 100644 gb.gsl/Test/test/.src/TestComplex.class create mode 100644 gb.gsl/Test/test/.src/TestSuite.class create mode 120000 gb.gsl/acinclude.m4 create mode 120000 gb.gsl/component.am create mode 100644 gb.gsl/configure.ac create mode 120000 gb.gsl/gambas.h create mode 120000 gb.gsl/gb_common.h create mode 120000 gb.gsl/m4 create mode 120000 gb.gsl/reconf create mode 100644 gb.gsl/src/Makefile.am create mode 100644 gb.gsl/src/c_complex.c create mode 100644 gb.gsl/src/c_complex.h create mode 100644 gb.gsl/src/c_gsl.c create mode 100644 gb.gsl/src/c_gsl.h create mode 100644 gb.gsl/src/c_matrix.c create mode 100644 gb.gsl/src/c_matrix.h create mode 100644 gb.gsl/src/c_newtonpolynomial.c create mode 100644 gb.gsl/src/c_newtonpolynomial.h create mode 100644 gb.gsl/src/c_polynomial.c create mode 100644 gb.gsl/src/c_polynomial.h create mode 100644 gb.gsl/src/c_vector.c create mode 100644 gb.gsl/src/c_vector.h create mode 100644 gb.gsl/src/gb.gsl.component create mode 100644 gb.gsl/src/main.c create mode 100644 gb.gsl/src/main.h create mode 100644 gb.gtk/AUTHORS create mode 120000 gb.gtk/COPYING create mode 100644 gb.gtk/ChangeLog create mode 120000 gb.gtk/INSTALL create mode 100644 gb.gtk/Makefile.am create mode 100644 gb.gtk/NEWS create mode 100644 gb.gtk/README create mode 100644 gb.gtk/TODO create mode 120000 gb.gtk/acinclude.m4 create mode 120000 gb.gtk/component.am create mode 100644 gb.gtk/configure.ac create mode 120000 gb.gtk/gambas.h create mode 120000 gb.gtk/gb.draw.h create mode 120000 gb.gtk/gb.geom.h create mode 120000 gb.gtk/gb.gl.h create mode 120000 gb.gtk/gb.image.h create mode 120000 gb.gtk/gb.paint.h create mode 120000 gb.gtk/gb_common.h create mode 120000 gb.gtk/m4 create mode 120000 gb.gtk/reconf create mode 120000 gb.gtk/share create mode 100644 gb.gtk/src/CButton.cpp create mode 100644 gb.gtk/src/CButton.h create mode 100644 gb.gtk/src/CClipboard.cpp create mode 100644 gb.gtk/src/CClipboard.h create mode 100644 gb.gtk/src/CColor.cpp create mode 100644 gb.gtk/src/CColor.h create mode 100644 gb.gtk/src/CConst.cpp create mode 100644 gb.gtk/src/CConst.h create mode 100644 gb.gtk/src/CContainer.cpp create mode 100644 gb.gtk/src/CContainer.h create mode 100644 gb.gtk/src/CDialog.cpp create mode 100644 gb.gtk/src/CDialog.h create mode 100644 gb.gtk/src/CDraw.cpp create mode 100644 gb.gtk/src/CDraw.h create mode 100644 gb.gtk/src/CDrawingArea.cpp create mode 100644 gb.gtk/src/CDrawingArea.h create mode 100644 gb.gtk/src/CFont.cpp create mode 100644 gb.gtk/src/CFont.h create mode 100644 gb.gtk/src/CFrame.cpp create mode 100644 gb.gtk/src/CFrame.h create mode 100644 gb.gtk/src/CImage.cpp create mode 100644 gb.gtk/src/CImage.h create mode 100644 gb.gtk/src/CKey.cpp create mode 100644 gb.gtk/src/CKey.h create mode 100644 gb.gtk/src/CLabel.cpp create mode 100644 gb.gtk/src/CLabel.h create mode 100644 gb.gtk/src/CMenu.cpp create mode 100644 gb.gtk/src/CMenu.h create mode 100644 gb.gtk/src/CMouse.cpp create mode 100644 gb.gtk/src/CMouse.h create mode 100644 gb.gtk/src/CMovieBox.cpp create mode 100644 gb.gtk/src/CMovieBox.h create mode 100644 gb.gtk/src/CPicture.cpp create mode 100644 gb.gtk/src/CPicture.h create mode 100644 gb.gtk/src/CScreen.cpp create mode 100644 gb.gtk/src/CScreen.h create mode 100644 gb.gtk/src/CSeparator.cpp create mode 100644 gb.gtk/src/CSeparator.h create mode 100644 gb.gtk/src/CSlider.cpp create mode 100644 gb.gtk/src/CSlider.h create mode 100644 gb.gtk/src/CStock.cpp create mode 100644 gb.gtk/src/CStock.h create mode 100644 gb.gtk/src/CStyle.cpp create mode 100644 gb.gtk/src/CStyle.h create mode 100644 gb.gtk/src/CTabStrip.cpp create mode 100644 gb.gtk/src/CTabStrip.h create mode 100644 gb.gtk/src/CTextArea.cpp create mode 100644 gb.gtk/src/CTextArea.h create mode 100644 gb.gtk/src/CTextBox.cpp create mode 100644 gb.gtk/src/CTextBox.h create mode 100644 gb.gtk/src/CTrayIcon.cpp create mode 100644 gb.gtk/src/CTrayIcon.h create mode 100644 gb.gtk/src/CWatcher.cpp create mode 100644 gb.gtk/src/CWatcher.h create mode 100644 gb.gtk/src/CWidget.cpp create mode 100644 gb.gtk/src/CWidget.h create mode 100644 gb.gtk/src/CWindow.cpp create mode 100644 gb.gtk/src/CWindow.h create mode 100644 gb.gtk/src/Makefile.am create mode 100644 gb.gtk/src/cpaint_impl.cpp create mode 100644 gb.gtk/src/cpaint_impl.h create mode 100644 gb.gtk/src/cprinter.cpp create mode 100644 gb.gtk/src/cprinter.h create mode 100644 gb.gtk/src/csvgimage.cpp create mode 100644 gb.gtk/src/csvgimage.h create mode 120000 gb.gtk/src/desktop.c create mode 120000 gb.gtk/src/desktop.h create mode 100644 gb.gtk/src/font-parser.cpp create mode 100644 gb.gtk/src/font-parser.h create mode 100644 gb.gtk/src/gapplication.cpp create mode 100644 gb.gtk/src/gapplication.h create mode 100644 gb.gtk/src/gb.gtk.component create mode 100644 gb.gtk/src/gb.gtk.h create mode 100644 gb.gtk/src/gbutton.cpp create mode 100644 gb.gtk/src/gbutton.h create mode 100644 gb.gtk/src/gclipboard.h create mode 100644 gb.gtk/src/gcolor.h create mode 100644 gb.gtk/src/gcombobox.cpp create mode 100644 gb.gtk/src/gcombobox.h create mode 100644 gb.gtk/src/gcontainer.cpp create mode 100644 gb.gtk/src/gcontainer.h create mode 100644 gb.gtk/src/gcontrol.cpp create mode 100644 gb.gtk/src/gcontrol.h create mode 100644 gb.gtk/src/gcursor.cpp create mode 100644 gb.gtk/src/gcursor.h create mode 100644 gb.gtk/src/gdesktop.cpp create mode 100644 gb.gtk/src/gdesktop.h create mode 100644 gb.gtk/src/gdialog.h create mode 100644 gb.gtk/src/gdrag.cpp create mode 100644 gb.gtk/src/gdrag.h create mode 100644 gb.gtk/src/gdrawingarea.cpp create mode 100644 gb.gtk/src/gdrawingarea.h create mode 100644 gb.gtk/src/gfont.cpp create mode 100644 gb.gtk/src/gfont.h create mode 100644 gb.gtk/src/gframe.cpp create mode 100644 gb.gtk/src/gframe.h create mode 100644 gb.gtk/src/ggambastag.h create mode 100644 gb.gtk/src/gglarea.cpp create mode 100644 gb.gtk/src/gglarea.h create mode 100644 gb.gtk/src/gkey.cpp create mode 100644 gb.gtk/src/gkey.h create mode 100644 gb.gtk/src/glabel.cpp create mode 100644 gb.gtk/src/glabel.h create mode 100644 gb.gtk/src/gmainwindow.cpp create mode 100644 gb.gtk/src/gmainwindow.h create mode 100644 gb.gtk/src/gmenu.cpp create mode 100644 gb.gtk/src/gmenu.h create mode 100644 gb.gtk/src/gmessage.cpp create mode 100644 gb.gtk/src/gmessage.h create mode 100644 gb.gtk/src/gmouse.cpp create mode 100644 gb.gtk/src/gmouse.h create mode 100644 gb.gtk/src/gmoviebox.cpp create mode 100644 gb.gtk/src/gmoviebox.h create mode 100644 gb.gtk/src/gpicture.cpp create mode 100644 gb.gtk/src/gpicture.h create mode 100644 gb.gtk/src/gplugin.h create mode 100644 gb.gtk/src/gprinter.cpp create mode 100644 gb.gtk/src/gprinter.h create mode 100644 gb.gtk/src/gscrollbar.h create mode 100644 gb.gtk/src/gseparator.cpp create mode 100644 gb.gtk/src/gseparator.h create mode 100644 gb.gtk/src/gshare.h create mode 100644 gb.gtk/src/gsignals.cpp create mode 100644 gb.gtk/src/gslider.cpp create mode 100644 gb.gtk/src/gslider.h create mode 100644 gb.gtk/src/gtabstrip.cpp create mode 100644 gb.gtk/src/gtabstrip.h create mode 100644 gb.gtk/src/gtag.h create mode 100644 gb.gtk/src/gtextarea.cpp create mode 100644 gb.gtk/src/gtextarea.h create mode 100644 gb.gtk/src/gtextbox.cpp create mode 100644 gb.gtk/src/gtextbox.h create mode 100644 gb.gtk/src/gtools.cpp create mode 100644 gb.gtk/src/gtools.h create mode 100644 gb.gtk/src/gtrayicon.cpp create mode 100644 gb.gtk/src/gtrayicon.h create mode 100644 gb.gtk/src/gtree.cpp create mode 100644 gb.gtk/src/gtree.h create mode 100644 gb.gtk/src/kentities.h create mode 100644 gb.gtk/src/main.cpp create mode 100644 gb.gtk/src/main.h create mode 100644 gb.gtk/src/opengl/Makefile.am create mode 100644 gb.gtk/src/opengl/c_glarea.c create mode 100644 gb.gtk/src/opengl/c_glarea.h create mode 100644 gb.gtk/src/opengl/gb.gtk.opengl.component create mode 100644 gb.gtk/src/opengl/main.c create mode 100644 gb.gtk/src/opengl/main.h create mode 100644 gb.gtk/src/sm/bonobo-macros.h create mode 100644 gb.gtk/src/sm/gnome-client.c create mode 100644 gb.gtk/src/sm/gnome-client.h create mode 100644 gb.gtk/src/sm/gnome-ice.c create mode 100644 gb.gtk/src/sm/gnome-ice.h create mode 100644 gb.gtk/src/sm/gnome-macros.h create mode 100644 gb.gtk/src/sm/gnome-marshal.c create mode 100644 gb.gtk/src/sm/gnome-marshal.h create mode 100644 gb.gtk/src/sm/gnome-uidefs.h create mode 100644 gb.gtk/src/sm/gnometypebuiltins.c create mode 100644 gb.gtk/src/sm/gnometypebuiltins.h create mode 100644 gb.gtk/src/sm/libgnomeui.h create mode 100644 gb.gtk/src/sm/libgnomeuiP.h create mode 100644 gb.gtk/src/sm/sm.h create mode 100644 gb.gtk/src/watcher.cpp create mode 100644 gb.gtk/src/watcher.h create mode 100644 gb.gtk/src/widgets.h create mode 120000 gb.gtk/src/x11.c create mode 120000 gb.gtk/src/x11.h create mode 100644 gb.gtk3/AUTHORS create mode 120000 gb.gtk3/COPYING create mode 100644 gb.gtk3/ChangeLog create mode 120000 gb.gtk3/INSTALL create mode 100644 gb.gtk3/Makefile.am create mode 100644 gb.gtk3/NEWS create mode 100644 gb.gtk3/README create mode 100644 gb.gtk3/TODO create mode 120000 gb.gtk3/acinclude.m4 create mode 120000 gb.gtk3/component.am create mode 100644 gb.gtk3/configure.ac create mode 120000 gb.gtk3/gambas.h create mode 120000 gb.gtk3/gb.draw.h create mode 120000 gb.gtk3/gb.geom.h create mode 120000 gb.gtk3/gb.gl.h create mode 120000 gb.gtk3/gb.image.h create mode 120000 gb.gtk3/gb.paint.h create mode 120000 gb.gtk3/gb_common.h create mode 120000 gb.gtk3/m4 create mode 120000 gb.gtk3/reconf create mode 120000 gb.gtk3/share create mode 120000 gb.gtk3/src/CButton.cpp create mode 120000 gb.gtk3/src/CButton.h create mode 120000 gb.gtk3/src/CClipboard.cpp create mode 120000 gb.gtk3/src/CClipboard.h create mode 120000 gb.gtk3/src/CColor.cpp create mode 120000 gb.gtk3/src/CColor.h create mode 120000 gb.gtk3/src/CConst.cpp create mode 120000 gb.gtk3/src/CConst.h create mode 120000 gb.gtk3/src/CContainer.cpp create mode 120000 gb.gtk3/src/CContainer.h create mode 120000 gb.gtk3/src/CDialog.cpp create mode 120000 gb.gtk3/src/CDialog.h create mode 120000 gb.gtk3/src/CDraw.cpp create mode 120000 gb.gtk3/src/CDraw.h create mode 120000 gb.gtk3/src/CDrawingArea.cpp create mode 120000 gb.gtk3/src/CDrawingArea.h create mode 120000 gb.gtk3/src/CFont.cpp create mode 120000 gb.gtk3/src/CFont.h create mode 120000 gb.gtk3/src/CFrame.cpp create mode 120000 gb.gtk3/src/CFrame.h create mode 120000 gb.gtk3/src/CImage.cpp create mode 120000 gb.gtk3/src/CImage.h create mode 120000 gb.gtk3/src/CKey.cpp create mode 120000 gb.gtk3/src/CKey.h create mode 120000 gb.gtk3/src/CLabel.cpp create mode 120000 gb.gtk3/src/CLabel.h create mode 120000 gb.gtk3/src/CMenu.cpp create mode 120000 gb.gtk3/src/CMenu.h create mode 120000 gb.gtk3/src/CMouse.cpp create mode 120000 gb.gtk3/src/CMouse.h create mode 120000 gb.gtk3/src/CMovieBox.cpp create mode 120000 gb.gtk3/src/CMovieBox.h create mode 120000 gb.gtk3/src/CPicture.cpp create mode 120000 gb.gtk3/src/CPicture.h create mode 120000 gb.gtk3/src/CScreen.cpp create mode 120000 gb.gtk3/src/CScreen.h create mode 120000 gb.gtk3/src/CSeparator.cpp create mode 120000 gb.gtk3/src/CSeparator.h create mode 120000 gb.gtk3/src/CSlider.cpp create mode 120000 gb.gtk3/src/CSlider.h create mode 120000 gb.gtk3/src/CStock.cpp create mode 120000 gb.gtk3/src/CStock.h create mode 120000 gb.gtk3/src/CStyle.cpp create mode 120000 gb.gtk3/src/CStyle.h create mode 120000 gb.gtk3/src/CTabStrip.cpp create mode 120000 gb.gtk3/src/CTabStrip.h create mode 120000 gb.gtk3/src/CTextArea.cpp create mode 120000 gb.gtk3/src/CTextArea.h create mode 120000 gb.gtk3/src/CTextBox.cpp create mode 120000 gb.gtk3/src/CTextBox.h create mode 120000 gb.gtk3/src/CTrayIcon.cpp create mode 120000 gb.gtk3/src/CTrayIcon.h create mode 120000 gb.gtk3/src/CWatcher.cpp create mode 120000 gb.gtk3/src/CWatcher.h create mode 120000 gb.gtk3/src/CWidget.cpp create mode 120000 gb.gtk3/src/CWidget.h create mode 120000 gb.gtk3/src/CWindow.cpp create mode 120000 gb.gtk3/src/CWindow.h create mode 100644 gb.gtk3/src/Makefile.am create mode 120000 gb.gtk3/src/cpaint_impl.cpp create mode 120000 gb.gtk3/src/cpaint_impl.h create mode 120000 gb.gtk3/src/cprinter.cpp create mode 120000 gb.gtk3/src/cprinter.h create mode 120000 gb.gtk3/src/csvgimage.cpp create mode 120000 gb.gtk3/src/csvgimage.h create mode 120000 gb.gtk3/src/desktop.c create mode 120000 gb.gtk3/src/desktop.h create mode 120000 gb.gtk3/src/font-parser.cpp create mode 120000 gb.gtk3/src/font-parser.h create mode 120000 gb.gtk3/src/gapplication.cpp create mode 120000 gb.gtk3/src/gapplication.h create mode 120000 gb.gtk3/src/gb.gtk.h create mode 100644 gb.gtk3/src/gb.gtk3.component create mode 120000 gb.gtk3/src/gbutton.cpp create mode 120000 gb.gtk3/src/gbutton.h create mode 120000 gb.gtk3/src/gclipboard.h create mode 120000 gb.gtk3/src/gcolor.h create mode 120000 gb.gtk3/src/gcombobox.cpp create mode 120000 gb.gtk3/src/gcombobox.h create mode 120000 gb.gtk3/src/gcontainer.cpp create mode 120000 gb.gtk3/src/gcontainer.h create mode 120000 gb.gtk3/src/gcontrol.cpp create mode 120000 gb.gtk3/src/gcontrol.h create mode 120000 gb.gtk3/src/gcursor.cpp create mode 120000 gb.gtk3/src/gcursor.h create mode 120000 gb.gtk3/src/gdesktop.cpp create mode 120000 gb.gtk3/src/gdesktop.h create mode 120000 gb.gtk3/src/gdialog.h create mode 120000 gb.gtk3/src/gdrag.cpp create mode 120000 gb.gtk3/src/gdrag.h create mode 120000 gb.gtk3/src/gdrawingarea.cpp create mode 120000 gb.gtk3/src/gdrawingarea.h create mode 120000 gb.gtk3/src/gfont.cpp create mode 120000 gb.gtk3/src/gfont.h create mode 120000 gb.gtk3/src/gframe.cpp create mode 120000 gb.gtk3/src/gframe.h create mode 120000 gb.gtk3/src/ggambastag.h create mode 120000 gb.gtk3/src/gglarea.cpp create mode 120000 gb.gtk3/src/gglarea.h create mode 120000 gb.gtk3/src/gkey.cpp create mode 120000 gb.gtk3/src/gkey.h create mode 120000 gb.gtk3/src/glabel.cpp create mode 120000 gb.gtk3/src/glabel.h create mode 120000 gb.gtk3/src/gmainwindow.cpp create mode 120000 gb.gtk3/src/gmainwindow.h create mode 120000 gb.gtk3/src/gmenu.cpp create mode 120000 gb.gtk3/src/gmenu.h create mode 120000 gb.gtk3/src/gmessage.cpp create mode 120000 gb.gtk3/src/gmessage.h create mode 120000 gb.gtk3/src/gmouse.cpp create mode 120000 gb.gtk3/src/gmouse.h create mode 120000 gb.gtk3/src/gmoviebox.cpp create mode 120000 gb.gtk3/src/gmoviebox.h create mode 120000 gb.gtk3/src/gpicture.cpp create mode 120000 gb.gtk3/src/gpicture.h create mode 120000 gb.gtk3/src/gplugin.h create mode 120000 gb.gtk3/src/gprinter.cpp create mode 120000 gb.gtk3/src/gprinter.h create mode 120000 gb.gtk3/src/gscrollbar.h create mode 120000 gb.gtk3/src/gseparator.cpp create mode 120000 gb.gtk3/src/gseparator.h create mode 120000 gb.gtk3/src/gshare.h create mode 120000 gb.gtk3/src/gsignals.cpp create mode 120000 gb.gtk3/src/gslider.cpp create mode 120000 gb.gtk3/src/gslider.h create mode 120000 gb.gtk3/src/gtabstrip.cpp create mode 120000 gb.gtk3/src/gtabstrip.h create mode 120000 gb.gtk3/src/gtag.h create mode 120000 gb.gtk3/src/gtextarea.cpp create mode 120000 gb.gtk3/src/gtextarea.h create mode 120000 gb.gtk3/src/gtextbox.cpp create mode 120000 gb.gtk3/src/gtextbox.h create mode 120000 gb.gtk3/src/gtools.cpp create mode 120000 gb.gtk3/src/gtools.h create mode 120000 gb.gtk3/src/gtrayicon.cpp create mode 120000 gb.gtk3/src/gtrayicon.h create mode 120000 gb.gtk3/src/gtree.cpp create mode 120000 gb.gtk3/src/gtree.h create mode 120000 gb.gtk3/src/kentities.h create mode 120000 gb.gtk3/src/main.cpp create mode 120000 gb.gtk3/src/main.h create mode 120000 gb.gtk3/src/sm/bonobo-macros.h create mode 120000 gb.gtk3/src/sm/gnome-client.c create mode 120000 gb.gtk3/src/sm/gnome-client.h create mode 120000 gb.gtk3/src/sm/gnome-ice.c create mode 120000 gb.gtk3/src/sm/gnome-ice.h create mode 120000 gb.gtk3/src/sm/gnome-macros.h create mode 120000 gb.gtk3/src/sm/gnome-marshal.c create mode 120000 gb.gtk3/src/sm/gnome-marshal.h create mode 120000 gb.gtk3/src/sm/gnome-uidefs.h create mode 120000 gb.gtk3/src/sm/gnometypebuiltins.c create mode 120000 gb.gtk3/src/sm/gnometypebuiltins.h create mode 120000 gb.gtk3/src/sm/libgnomeui.h create mode 120000 gb.gtk3/src/sm/libgnomeuiP.h create mode 120000 gb.gtk3/src/sm/sm.h create mode 120000 gb.gtk3/src/watcher.cpp create mode 120000 gb.gtk3/src/watcher.h create mode 120000 gb.gtk3/src/widgets.h create mode 120000 gb.gtk3/src/x11.c create mode 120000 gb.gtk3/src/x11.h create mode 100644 gb.httpd/AUTHORS create mode 120000 gb.httpd/COPYING create mode 100644 gb.httpd/ChangeLog create mode 120000 gb.httpd/INSTALL create mode 100644 gb.httpd/Makefile.am create mode 100644 gb.httpd/NEWS create mode 100644 gb.httpd/README create mode 120000 gb.httpd/acinclude.m4 create mode 120000 gb.httpd/component.am create mode 100644 gb.httpd/configure.ac create mode 120000 gb.httpd/gambas.h create mode 120000 gb.httpd/gb_common.h create mode 120000 gb.httpd/m4 create mode 120000 gb.httpd/reconf create mode 100644 gb.httpd/src/Makefile.am create mode 100644 gb.httpd/src/fdwatch.c create mode 100644 gb.httpd/src/fdwatch.h create mode 100644 gb.httpd/src/gb.httpd.component create mode 100644 gb.httpd/src/libhttpd.c create mode 100644 gb.httpd/src/libhttpd.h create mode 100644 gb.httpd/src/main.c create mode 100644 gb.httpd/src/main.h create mode 100644 gb.httpd/src/match.c create mode 100644 gb.httpd/src/match.h create mode 100644 gb.httpd/src/mime_encodings.h create mode 100644 gb.httpd/src/mime_types.h create mode 100644 gb.httpd/src/strerror.c create mode 100644 gb.httpd/src/tdate_parse.c create mode 100644 gb.httpd/src/tdate_parse.h create mode 100644 gb.httpd/src/thttpd.c create mode 100644 gb.httpd/src/thttpd.h create mode 100644 gb.httpd/src/timers.c create mode 100644 gb.httpd/src/timers.h create mode 100644 gb.httpd/src/version.h create mode 100644 gb.image.imlib/AUTHORS create mode 120000 gb.image.imlib/COPYING create mode 100644 gb.image.imlib/ChangeLog create mode 120000 gb.image.imlib/INSTALL create mode 100644 gb.image.imlib/Makefile.am create mode 100644 gb.image.imlib/NEWS create mode 100644 gb.image.imlib/README create mode 120000 gb.image.imlib/acinclude.m4 create mode 120000 gb.image.imlib/component.am create mode 100644 gb.image.imlib/configure.ac create mode 120000 gb.image.imlib/gambas.h create mode 120000 gb.image.imlib/gb.draw.h create mode 120000 gb.image.imlib/gb.image.h create mode 120000 gb.image.imlib/gb_common.h create mode 120000 gb.image.imlib/m4 create mode 120000 gb.image.imlib/reconf create mode 100644 gb.image.imlib/src/Makefile.am create mode 100644 gb.image.imlib/src/c_image.c create mode 100644 gb.image.imlib/src/c_image.h create mode 100644 gb.image.imlib/src/c_imlib.c create mode 100644 gb.image.imlib/src/c_imlib.h create mode 100644 gb.image.imlib/src/gb.image.imlib.component create mode 100644 gb.image.imlib/src/main.c create mode 100644 gb.image.imlib/src/main.h create mode 100644 gb.image.io/AUTHORS create mode 120000 gb.image.io/COPYING create mode 100644 gb.image.io/ChangeLog create mode 120000 gb.image.io/INSTALL create mode 100644 gb.image.io/Makefile.am create mode 100644 gb.image.io/NEWS create mode 100644 gb.image.io/README create mode 120000 gb.image.io/acinclude.m4 create mode 120000 gb.image.io/component.am create mode 100644 gb.image.io/configure.ac create mode 120000 gb.image.io/gambas.h create mode 120000 gb.image.io/gb.image.h create mode 120000 gb.image.io/gb_common.h create mode 120000 gb.image.io/m4 create mode 120000 gb.image.io/reconf create mode 100644 gb.image.io/src/Makefile.am create mode 100644 gb.image.io/src/c_image.c create mode 100644 gb.image.io/src/c_image.h create mode 100644 gb.image.io/src/gb.image.io.component create mode 100644 gb.image.io/src/main.c create mode 100644 gb.image.io/src/main.h create mode 100644 gb.jit.llvm/AUTHORS create mode 120000 gb.jit.llvm/COPYING create mode 100644 gb.jit.llvm/ChangeLog create mode 120000 gb.jit.llvm/INSTALL create mode 100644 gb.jit.llvm/Makefile.am create mode 100644 gb.jit.llvm/NEWS create mode 100644 gb.jit.llvm/README create mode 120000 gb.jit.llvm/acinclude.m4 create mode 120000 gb.jit.llvm/component.am create mode 100644 gb.jit.llvm/configure.ac create mode 120000 gb.jit.llvm/gambas.h create mode 120000 gb.jit.llvm/gb_common.h create mode 120000 gb.jit.llvm/m4 create mode 120000 gb.jit.llvm/reconf create mode 100644 gb.jit.llvm/src/Makefile.am create mode 100644 gb.jit.llvm/src/gb.jit.h create mode 100644 gb.jit.llvm/src/gb.jit.llvm.component create mode 100644 gb.jit.llvm/src/jit.h create mode 100644 gb.jit.llvm/src/jit_api.cpp create mode 100644 gb.jit.llvm/src/jit_codegen.cpp create mode 100644 gb.jit.llvm/src/jit_codegen_conv.h create mode 100644 gb.jit.llvm/src/jit_compile.cpp create mode 100644 gb.jit.llvm/src/jit_conv.cpp create mode 100644 gb.jit.llvm/src/jit_expressions.cpp create mode 100644 gb.jit.llvm/src/jit_gambas_pass.cpp create mode 100644 gb.jit.llvm/src/jit_gambas_pass.h create mode 100644 gb.jit.llvm/src/jit_read.cpp create mode 100644 gb.jit.llvm/src/jit_runtime.c create mode 100644 gb.jit.llvm/src/jit_runtime.h create mode 100644 gb.jit.llvm/src/main.cpp create mode 100644 gb.jit.llvm/src/main.h create mode 100644 gb.libxml/AUTHORS create mode 120000 gb.libxml/COPYING create mode 100644 gb.libxml/ChangeLog create mode 120000 gb.libxml/INSTALL create mode 100644 gb.libxml/Makefile.am create mode 100644 gb.libxml/NEWS create mode 100644 gb.libxml/README create mode 120000 gb.libxml/acinclude.m4 create mode 120000 gb.libxml/component.am create mode 100644 gb.libxml/configure.ac create mode 120000 gb.libxml/gambas.h create mode 120000 gb.libxml/m4 create mode 120000 gb.libxml/reconf create mode 100644 gb.libxml/src/CXMLDocument.c create mode 100644 gb.libxml/src/CXMLDocument.h create mode 100644 gb.libxml/src/CXMLNode.c create mode 100644 gb.libxml/src/CXMLNode.h create mode 100644 gb.libxml/src/CXMLReader.c create mode 100644 gb.libxml/src/CXMLReader.h create mode 100644 gb.libxml/src/CXMLWriter.c create mode 100644 gb.libxml/src/CXMLWriter.h create mode 100644 gb.libxml/src/Makefile.am create mode 100644 gb.libxml/src/gb.libxml.component create mode 100644 gb.libxml/src/libxml.kateproject create mode 100644 gb.libxml/src/main.c create mode 100644 gb.libxml/src/main.h create mode 100644 gb.media/AUTHORS create mode 120000 gb.media/COPYING create mode 100644 gb.media/ChangeLog create mode 120000 gb.media/INSTALL create mode 100644 gb.media/Makefile.am create mode 100644 gb.media/NEWS create mode 100644 gb.media/README create mode 120000 gb.media/acinclude.m4 create mode 120000 gb.media/component.am create mode 100644 gb.media/configure.ac create mode 120000 gb.media/gambas.h create mode 120000 gb.media/gb.image.h create mode 120000 gb.media/gb_common.h create mode 120000 gb.media/m4 create mode 120000 gb.media/reconf create mode 100644 gb.media/src/Makefile.am create mode 100644 gb.media/src/c_media.c create mode 100644 gb.media/src/c_media.h create mode 100644 gb.media/src/c_mediaplayer.c create mode 100644 gb.media/src/c_mediaplayer.h create mode 100644 gb.media/src/c_mediavideo.c create mode 100644 gb.media/src/c_mediavideo.h create mode 100644 gb.media/src/gb.media.component create mode 100644 gb.media/src/main.c create mode 100644 gb.media/src/main.h create mode 100644 gb.mime/AUTHORS create mode 120000 gb.mime/COPYING create mode 100644 gb.mime/ChangeLog create mode 120000 gb.mime/INSTALL create mode 100644 gb.mime/Makefile.am create mode 100644 gb.mime/NEWS create mode 100644 gb.mime/README create mode 120000 gb.mime/acinclude.m4 create mode 120000 gb.mime/component.am create mode 100644 gb.mime/configure.ac create mode 120000 gb.mime/gambas.h create mode 120000 gb.mime/gb_common.h create mode 120000 gb.mime/m4 create mode 120000 gb.mime/reconf create mode 100644 gb.mime/src/Makefile.am create mode 100644 gb.mime/src/c_mime.c create mode 100644 gb.mime/src/c_mime.h create mode 100644 gb.mime/src/c_mimemessage.c create mode 100644 gb.mime/src/c_mimemessage.h create mode 100644 gb.mime/src/c_mimepart.c create mode 100644 gb.mime/src/c_mimepart.h create mode 100644 gb.mime/src/gb.mime.component create mode 100644 gb.mime/src/main.c create mode 100644 gb.mime/src/main.h create mode 100644 gb.ncurses/AUTHORS create mode 120000 gb.ncurses/COPYING create mode 100644 gb.ncurses/ChangeLog create mode 120000 gb.ncurses/INSTALL create mode 100644 gb.ncurses/Makefile.am create mode 100644 gb.ncurses/NEWS create mode 100644 gb.ncurses/README create mode 120000 gb.ncurses/acinclude.m4 create mode 120000 gb.ncurses/component.am create mode 100644 gb.ncurses/configure.ac create mode 120000 gb.ncurses/gambas.h create mode 120000 gb.ncurses/gb_common.h create mode 120000 gb.ncurses/m4 create mode 120000 gb.ncurses/reconf create mode 100644 gb.ncurses/src/Makefile.am create mode 100644 gb.ncurses/src/c_color.c create mode 100644 gb.ncurses/src/c_color.h create mode 100644 gb.ncurses/src/c_input.c create mode 100644 gb.ncurses/src/c_input.h create mode 100644 gb.ncurses/src/c_key.c create mode 100644 gb.ncurses/src/c_key.h create mode 100644 gb.ncurses/src/c_screen.c create mode 100644 gb.ncurses/src/c_screen.h create mode 100644 gb.ncurses/src/c_window.c create mode 100644 gb.ncurses/src/c_window.h create mode 100644 gb.ncurses/src/gb.ncurses.component create mode 100644 gb.ncurses/src/main.c create mode 100644 gb.ncurses/src/main.h create mode 100644 gb.net.curl/AUTHORS create mode 120000 gb.net.curl/COPYING create mode 100644 gb.net.curl/ChangeLog create mode 120000 gb.net.curl/INSTALL create mode 100644 gb.net.curl/Makefile.am create mode 100644 gb.net.curl/NEWS create mode 100644 gb.net.curl/README create mode 120000 gb.net.curl/acinclude.m4 create mode 120000 gb.net.curl/component.am create mode 100644 gb.net.curl/configure.ac create mode 120000 gb.net.curl/gambas.h create mode 120000 gb.net.curl/gb_common.h create mode 120000 gb.net.curl/m4 create mode 120000 gb.net.curl/reconf create mode 100644 gb.net.curl/src/CCurl.c create mode 100644 gb.net.curl/src/CCurl.h create mode 100644 gb.net.curl/src/CFtpClient.c create mode 100644 gb.net.curl/src/CFtpClient.h create mode 100644 gb.net.curl/src/CHttpClient.c create mode 100644 gb.net.curl/src/CHttpClient.h create mode 100644 gb.net.curl/src/CNet.c create mode 100644 gb.net.curl/src/CNet.h create mode 100644 gb.net.curl/src/CProxy.c create mode 100644 gb.net.curl/src/CProxy.h create mode 100644 gb.net.curl/src/Makefile.am create mode 100644 gb.net.curl/src/gb.net.curl.component create mode 100644 gb.net.curl/src/gb.net.curl/.directory create mode 100644 gb.net.curl/src/gb.net.curl/.icon.png create mode 100644 gb.net.curl/src/gb.net.curl/.project create mode 100644 gb.net.curl/src/gb.net.curl/.src/Download.class create mode 100644 gb.net.curl/src/gb.net.curl/.src/DownloadManager.class create mode 100644 gb.net.curl/src/gb.net.curl/.src/HttpForm.class create mode 100644 gb.net.curl/src/gb.net.curl/.src/MMain.module create mode 100644 gb.net.curl/src/gbcurl.c create mode 100644 gb.net.curl/src/gbcurl.h create mode 100644 gb.net.curl/src/main.c create mode 100644 gb.net.curl/src/main.h create mode 100644 gb.net/AUTHORS create mode 120000 gb.net/COPYING create mode 100644 gb.net/ChangeLog create mode 120000 gb.net/INSTALL create mode 100644 gb.net/Makefile.am create mode 100644 gb.net/NEWS create mode 100644 gb.net/README create mode 120000 gb.net/acinclude.m4 create mode 120000 gb.net/component.am create mode 100644 gb.net/configure.ac create mode 120000 gb.net/gambas.h create mode 120000 gb.net/gb_common.h create mode 120000 gb.net/m4 create mode 120000 gb.net/reconf create mode 100644 gb.net/src/CDnsClient.c create mode 100644 gb.net/src/CDnsClient.h create mode 100644 gb.net/src/CNet.c create mode 100644 gb.net/src/CNet.h create mode 100644 gb.net/src/CSerialPort.c create mode 100644 gb.net/src/CSerialPort.h create mode 100644 gb.net/src/CServerSocket.c create mode 100644 gb.net/src/CServerSocket.h create mode 100644 gb.net/src/CSocket.c create mode 100644 gb.net/src/CSocket.h create mode 100644 gb.net/src/CUdpSocket.c create mode 100644 gb.net/src/CUdpSocket.h create mode 100644 gb.net/src/Makefile.am create mode 100644 gb.net/src/doc/README create mode 100644 gb.net/src/doc/changes.txt create mode 100644 gb.net/src/doc/threading.sxw create mode 100644 gb.net/src/gb.net.component create mode 100644 gb.net/src/gb_network.h create mode 100644 gb.net/src/main.c create mode 100644 gb.net/src/main.h create mode 100644 gb.net/src/speed.c create mode 100644 gb.net/src/speed.h create mode 100644 gb.net/src/tools.c create mode 100644 gb.net/src/tools.h create mode 100644 gb.openal/AUTHORS create mode 120000 gb.openal/COPYING create mode 100644 gb.openal/ChangeLog create mode 120000 gb.openal/INSTALL create mode 100644 gb.openal/Makefile.am create mode 100644 gb.openal/NEWS create mode 100644 gb.openal/README create mode 120000 gb.openal/acinclude.m4 create mode 120000 gb.openal/component.am create mode 100644 gb.openal/configure.ac create mode 120000 gb.openal/gambas.h create mode 120000 gb.openal/gb_common.h create mode 120000 gb.openal/m4 create mode 120000 gb.openal/reconf create mode 100644 gb.openal/src/Makefile.am create mode 100644 gb.openal/src/c_al.c create mode 100644 gb.openal/src/c_al.h create mode 100644 gb.openal/src/c_alc.c create mode 100644 gb.openal/src/c_alc.h create mode 100644 gb.openal/src/c_alure.c create mode 100644 gb.openal/src/c_alure.h create mode 100644 gb.openal/src/gb.openal.component create mode 100644 gb.openal/src/main.c create mode 100644 gb.openal/src/main.h create mode 100644 gb.opengl/AUTHORS create mode 120000 gb.opengl/COPYING create mode 100644 gb.opengl/ChangeLog create mode 120000 gb.opengl/INSTALL create mode 100644 gb.opengl/Makefile.am create mode 100644 gb.opengl/NEWS create mode 100644 gb.opengl/README create mode 120000 gb.opengl/acinclude.m4 create mode 120000 gb.opengl/component.am create mode 100644 gb.opengl/configure.ac create mode 120000 gb.opengl/gambas.h create mode 120000 gb.opengl/gb.image.h create mode 120000 gb.opengl/gb_common.h create mode 120000 gb.opengl/m4 create mode 120000 gb.opengl/reconf create mode 100644 gb.opengl/src/GL.c create mode 100644 gb.opengl/src/GL.h create mode 100644 gb.opengl/src/GLclipping.c create mode 100644 gb.opengl/src/GLclipping.h create mode 100644 gb.opengl/src/GLcolorLighting.c create mode 100644 gb.opengl/src/GLcolorLighting.h create mode 100644 gb.opengl/src/GLcoordTransf.c create mode 100644 gb.opengl/src/GLcoordTransf.h create mode 100644 gb.opengl/src/GLdisplayList.c create mode 100644 gb.opengl/src/GLdisplayList.h create mode 100644 gb.opengl/src/GLeval.c create mode 100644 gb.opengl/src/GLeval.h create mode 100644 gb.opengl/src/GLfog.c create mode 100644 gb.opengl/src/GLfog.h create mode 100644 gb.opengl/src/GLframeBufferOps.c create mode 100644 gb.opengl/src/GLframeBufferOps.h create mode 100644 gb.opengl/src/GLinfo.c create mode 100644 gb.opengl/src/GLinfo.h create mode 100644 gb.opengl/src/GLmodesExec.c create mode 100644 gb.opengl/src/GLmodesExec.h create mode 100644 gb.opengl/src/GLpixelOperations.c create mode 100644 gb.opengl/src/GLpixelOperations.h create mode 100644 gb.opengl/src/GLprimitives.c create mode 100644 gb.opengl/src/GLprimitives.h create mode 100644 gb.opengl/src/GLrasterization.c create mode 100644 gb.opengl/src/GLrasterization.h create mode 100644 gb.opengl/src/GLselectFeedback.c create mode 100644 gb.opengl/src/GLselectFeedback.h create mode 100644 gb.opengl/src/GLtextureMapping.c create mode 100644 gb.opengl/src/GLtextureMapping.h create mode 100644 gb.opengl/src/Makefile.am create mode 100644 gb.opengl/src/framebufferobject.c create mode 100644 gb.opengl/src/framebufferobject.h create mode 100644 gb.opengl/src/gb.gl.h create mode 100644 gb.opengl/src/gb.opengl.component create mode 100644 gb.opengl/src/glsl/GL.c create mode 100644 gb.opengl/src/glsl/GL.h create mode 100644 gb.opengl/src/glsl/GLattributes.c create mode 100644 gb.opengl/src/glsl/GLattributes.h create mode 100644 gb.opengl/src/glsl/GLinfo.h create mode 100644 gb.opengl/src/glsl/GLprogram.c create mode 100644 gb.opengl/src/glsl/GLprogram.h create mode 100644 gb.opengl/src/glsl/GLshader.c create mode 100644 gb.opengl/src/glsl/GLshader.h create mode 100644 gb.opengl/src/glsl/GLuniform.c create mode 100644 gb.opengl/src/glsl/GLuniform.h create mode 100644 gb.opengl/src/glsl/Makefile.am create mode 100644 gb.opengl/src/glsl/gb.opengl.glsl.component create mode 100644 gb.opengl/src/glsl/main.c create mode 100644 gb.opengl/src/glsl/main.h create mode 100644 gb.opengl/src/glu/GLU.c create mode 100644 gb.opengl/src/glu/GLU.h create mode 100644 gb.opengl/src/glu/GLUcoordTransf.c create mode 100644 gb.opengl/src/glu/GLUcoordTransf.h create mode 100644 gb.opengl/src/glu/GLUnurb.c create mode 100644 gb.opengl/src/glu/GLUnurb.h create mode 100644 gb.opengl/src/glu/GLUproject.c create mode 100644 gb.opengl/src/glu/GLUproject.h create mode 100644 gb.opengl/src/glu/GLUquadratic.c create mode 100644 gb.opengl/src/glu/GLUquadratic.h create mode 100644 gb.opengl/src/glu/GLUtextureImage.c create mode 100644 gb.opengl/src/glu/GLUtextureImage.h create mode 100644 gb.opengl/src/glu/Makefile.am create mode 100644 gb.opengl/src/glu/cglunurb.c create mode 100644 gb.opengl/src/glu/cglunurb.h create mode 100644 gb.opengl/src/glu/cgluquadric.c create mode 100644 gb.opengl/src/glu/cgluquadric.h create mode 100644 gb.opengl/src/glu/gb.opengl.glu.component create mode 100644 gb.opengl/src/glu/main.c create mode 100644 gb.opengl/src/glu/main.h create mode 100644 gb.opengl/src/main.c create mode 100644 gb.opengl/src/main.h create mode 100644 gb.opengl/src/sge/Makefile.am create mode 100644 gb.opengl/src/sge/cmd2model.c create mode 100644 gb.opengl/src/sge/cmd2model.h create mode 100644 gb.opengl/src/sge/cmd2object.c create mode 100644 gb.opengl/src/sge/cmd2object.h create mode 100644 gb.opengl/src/sge/gb.opengl.sge.component create mode 100644 gb.opengl/src/sge/main.c create mode 100644 gb.opengl/src/sge/main.h create mode 100644 gb.openssl/AUTHORS create mode 100644 gb.openssl/COPYING create mode 100644 gb.openssl/COPYING.GPL create mode 100644 gb.openssl/ChangeLog create mode 120000 gb.openssl/INSTALL create mode 100644 gb.openssl/Makefile.am create mode 100644 gb.openssl/NEWS create mode 100644 gb.openssl/README create mode 120000 gb.openssl/acinclude.m4 create mode 120000 gb.openssl/component.am create mode 100644 gb.openssl/configure.ac create mode 120000 gb.openssl/gambas.h create mode 120000 gb.openssl/gb_common.h create mode 120000 gb.openssl/m4 create mode 100644 gb.openssl/openssl-test/.directory create mode 100644 gb.openssl/openssl-test/.icon.png create mode 100644 gb.openssl/openssl-test/.project create mode 100644 gb.openssl/openssl-test/.src/Main.module create mode 120000 gb.openssl/reconf create mode 100644 gb.openssl/src/Makefile.am create mode 100644 gb.openssl/src/c_cipher.c create mode 100644 gb.openssl/src/c_cipher.h create mode 100644 gb.openssl/src/c_digest.c create mode 100644 gb.openssl/src/c_digest.h create mode 100644 gb.openssl/src/c_hmac.c create mode 100644 gb.openssl/src/c_hmac.h create mode 100644 gb.openssl/src/c_openssl.c create mode 100644 gb.openssl/src/c_openssl.h create mode 100644 gb.openssl/src/gb.openssl.component create mode 100644 gb.openssl/src/main.c create mode 100644 gb.openssl/src/main.h create mode 100644 gb.pcre/AUTHORS create mode 120000 gb.pcre/COPYING create mode 100644 gb.pcre/ChangeLog create mode 120000 gb.pcre/INSTALL create mode 100644 gb.pcre/Makefile.am create mode 100644 gb.pcre/NEWS create mode 100644 gb.pcre/README create mode 120000 gb.pcre/acinclude.m4 create mode 120000 gb.pcre/component.am create mode 100644 gb.pcre/configure.ac create mode 120000 gb.pcre/gambas.h create mode 120000 gb.pcre/gb_common.h create mode 120000 gb.pcre/m4 create mode 120000 gb.pcre/reconf create mode 100644 gb.pcre/src/Makefile.am create mode 100644 gb.pcre/src/README create mode 100644 gb.pcre/src/gb.pcre.component create mode 100644 gb.pcre/src/gb.pcre.h create mode 100644 gb.pcre/src/main.c create mode 100644 gb.pcre/src/main.h create mode 100644 gb.pcre/src/regexp.c create mode 100644 gb.pcre/src/regexp.h create mode 100644 gb.pdf/AUTHORS create mode 120000 gb.pdf/COPYING create mode 100644 gb.pdf/ChangeLog create mode 120000 gb.pdf/INSTALL create mode 100644 gb.pdf/Makefile.am create mode 100644 gb.pdf/NEWS create mode 100644 gb.pdf/README create mode 120000 gb.pdf/acinclude.m4 create mode 120000 gb.pdf/component.am create mode 100644 gb.pdf/configure.ac create mode 120000 gb.pdf/gambas.h create mode 120000 gb.pdf/gb.gtk.h create mode 120000 gb.pdf/gb.image.h create mode 120000 gb.pdf/gb_common.h create mode 120000 gb.pdf/m4 create mode 120000 gb.pdf/reconf create mode 100644 gb.pdf/src/CPdfDocument.cpp create mode 100644 gb.pdf/src/CPdfDocument.h create mode 100644 gb.pdf/src/Makefile.am create mode 100644 gb.pdf/src/gb.pdf.component create mode 100644 gb.pdf/src/main.cpp create mode 100644 gb.pdf/src/main.h create mode 100644 gb.poppler/AUTHORS create mode 120000 gb.poppler/COPYING create mode 100644 gb.poppler/ChangeLog create mode 120000 gb.poppler/INSTALL create mode 100644 gb.poppler/Makefile.am create mode 100644 gb.poppler/NEWS create mode 100644 gb.poppler/README create mode 120000 gb.poppler/acinclude.m4 create mode 120000 gb.poppler/component.am create mode 100644 gb.poppler/configure.ac create mode 120000 gb.poppler/gambas.h create mode 120000 gb.poppler/gb.geom.h create mode 120000 gb.poppler/gb.image.h create mode 120000 gb.poppler/gb_common.h create mode 120000 gb.poppler/m4 create mode 120000 gb.poppler/reconf create mode 100644 gb.poppler/src/Makefile.am create mode 100644 gb.poppler/src/c_pdf_document.cpp create mode 100644 gb.poppler/src/c_pdf_document.h create mode 100644 gb.poppler/src/gb.poppler.component create mode 100644 gb.poppler/src/main.cpp create mode 100644 gb.poppler/src/main.h create mode 100644 gb.qt4/AUTHORS create mode 120000 gb.qt4/COPYING create mode 100644 gb.qt4/ChangeLog create mode 120000 gb.qt4/INSTALL create mode 100644 gb.qt4/Makefile.am create mode 100644 gb.qt4/NEWS create mode 100644 gb.qt4/README create mode 120000 gb.qt4/acinclude.m4 create mode 120000 gb.qt4/component.am create mode 100644 gb.qt4/configure.ac create mode 120000 gb.qt4/gambas.h create mode 120000 gb.qt4/gb.draw.h create mode 120000 gb.qt4/gb.eval.h create mode 120000 gb.qt4/gb.geom.h create mode 120000 gb.qt4/gb.gl.h create mode 120000 gb.qt4/gb.image.h create mode 120000 gb.qt4/gb.paint.h create mode 100644 gb.qt4/gb.qt.am create mode 120000 gb.qt4/gb_common.h create mode 120000 gb.qt4/gbc_read_common.h create mode 120000 gb.qt4/m4 create mode 120000 gb.qt4/reconf create mode 100644 gb.qt4/share/gb.form.action.h create mode 100644 gb.qt4/share/gb.form.arrangement.h create mode 100644 gb.qt4/share/gb.form.const.h create mode 100644 gb.qt4/share/gb.form.font.h create mode 100644 gb.qt4/share/gb.form.print.h create mode 100644 gb.qt4/share/gb.form.properties.h create mode 100644 gb.qt4/share/gb.form.trayicon.h create mode 100644 gb.qt4/share/gb.form.trayicon.large.h create mode 100644 gb.qt4/src/CButton.cpp create mode 100644 gb.qt4/src/CButton.h create mode 100644 gb.qt4/src/CCheckBox.cpp create mode 100644 gb.qt4/src/CCheckBox.h create mode 100644 gb.qt4/src/CClipboard.cpp create mode 100644 gb.qt4/src/CClipboard.h create mode 100644 gb.qt4/src/CColor.cpp create mode 100644 gb.qt4/src/CColor.h create mode 100644 gb.qt4/src/CConst.cpp create mode 100644 gb.qt4/src/CConst.h create mode 100755 gb.qt4/src/CContainer.cpp create mode 100644 gb.qt4/src/CContainer.h create mode 100644 gb.qt4/src/CDialog.cpp create mode 100644 gb.qt4/src/CDialog.h create mode 100644 gb.qt4/src/CDraw.cpp create mode 100644 gb.qt4/src/CDraw.h create mode 100644 gb.qt4/src/CDrawingArea.cpp create mode 100644 gb.qt4/src/CDrawingArea.h create mode 100644 gb.qt4/src/CEmbedder.cpp create mode 100644 gb.qt4/src/CEmbedder.h create mode 100644 gb.qt4/src/CFont.cpp create mode 100644 gb.qt4/src/CFont.h create mode 100644 gb.qt4/src/CFrame.cpp create mode 100644 gb.qt4/src/CFrame.h create mode 100644 gb.qt4/src/CImage.cpp create mode 100644 gb.qt4/src/CImage.h create mode 100644 gb.qt4/src/CKey.cpp create mode 100644 gb.qt4/src/CKey.h create mode 100644 gb.qt4/src/CLabel.cpp create mode 100644 gb.qt4/src/CLabel.h create mode 100644 gb.qt4/src/CMenu.cpp create mode 100644 gb.qt4/src/CMenu.h create mode 100644 gb.qt4/src/CMouse.cpp create mode 100644 gb.qt4/src/CMouse.h create mode 100644 gb.qt4/src/CMovieBox.cpp create mode 100644 gb.qt4/src/CMovieBox.h create mode 100644 gb.qt4/src/CPanel.cpp create mode 100644 gb.qt4/src/CPanel.h create mode 100644 gb.qt4/src/CPicture.cpp create mode 100644 gb.qt4/src/CPicture.h create mode 100644 gb.qt4/src/CRadioButton.cpp create mode 100644 gb.qt4/src/CRadioButton.h create mode 100644 gb.qt4/src/CScreen.cpp create mode 100644 gb.qt4/src/CScreen.h create mode 100644 gb.qt4/src/CScrollBar.cpp create mode 100644 gb.qt4/src/CScrollBar.h create mode 100644 gb.qt4/src/CSlider.cpp create mode 100644 gb.qt4/src/CSlider.h create mode 100644 gb.qt4/src/CStyle.cpp create mode 100644 gb.qt4/src/CStyle.h create mode 100644 gb.qt4/src/CTabStrip.cpp create mode 100644 gb.qt4/src/CTabStrip.h create mode 100644 gb.qt4/src/CTextArea.cpp create mode 100644 gb.qt4/src/CTextArea.h create mode 100644 gb.qt4/src/CTextBox.cpp create mode 100644 gb.qt4/src/CTextBox.h create mode 100644 gb.qt4/src/CWatch.cpp create mode 100644 gb.qt4/src/CWatch.h create mode 100644 gb.qt4/src/CWatcher.cpp create mode 100644 gb.qt4/src/CWatcher.h create mode 100644 gb.qt4/src/CWidget.cpp create mode 100644 gb.qt4/src/CWidget.h create mode 100644 gb.qt4/src/CWindow.cpp create mode 100644 gb.qt4/src/CWindow.h create mode 100644 gb.qt4/src/Makefile.am create mode 100644 gb.qt4/src/cpaint_impl.cpp create mode 100644 gb.qt4/src/cpaint_impl.h create mode 100644 gb.qt4/src/cprinter.cpp create mode 100644 gb.qt4/src/cprinter.h create mode 100644 gb.qt4/src/csvgimage.cpp create mode 100644 gb.qt4/src/csvgimage.h create mode 100644 gb.qt4/src/ctrayicon.cpp create mode 100644 gb.qt4/src/ctrayicon.h create mode 100644 gb.qt4/src/desktop.c create mode 100644 gb.qt4/src/desktop.h create mode 100644 gb.qt4/src/ext/CDial.cpp create mode 100644 gb.qt4/src/ext/CDial.h create mode 100644 gb.qt4/src/ext/CEditor.cpp create mode 100644 gb.qt4/src/ext/CEditor.h create mode 100644 gb.qt4/src/ext/CLCDNumber.cpp create mode 100644 gb.qt4/src/ext/CLCDNumber.h create mode 100644 gb.qt4/src/ext/CTextEdit.cpp create mode 100644 gb.qt4/src/ext/CTextEdit.h create mode 100644 gb.qt4/src/ext/Makefile.am create mode 100644 gb.qt4/src/ext/garray.cpp create mode 100644 gb.qt4/src/ext/garray.h create mode 100644 gb.qt4/src/ext/gb.qt4.ext.component create mode 100644 gb.qt4/src/ext/gdocument.cpp create mode 100644 gb.qt4/src/ext/gdocument.h create mode 100644 gb.qt4/src/ext/gstring.cpp create mode 100644 gb.qt4/src/ext/gstring.h create mode 100644 gb.qt4/src/ext/gview.cpp create mode 100644 gb.qt4/src/ext/gview.h create mode 100644 gb.qt4/src/ext/main.cpp create mode 100644 gb.qt4/src/ext/main.h create mode 100644 gb.qt4/src/fix_breeze.cpp create mode 100644 gb.qt4/src/fix_breeze.h create mode 100644 gb.qt4/src/gb.qt.h create mode 100644 gb.qt4/src/gb.qt4.component create mode 100644 gb.qt4/src/main.cpp create mode 100644 gb.qt4/src/main.h create mode 100644 gb.qt4/src/opengl/CGLarea.cpp create mode 100644 gb.qt4/src/opengl/CGLarea.h create mode 100644 gb.qt4/src/opengl/Makefile.am create mode 100644 gb.qt4/src/opengl/gb.qt4.opengl.component create mode 100644 gb.qt4/src/opengl/main.cpp create mode 100644 gb.qt4/src/opengl/main.h create mode 100644 gb.qt4/src/trayicon.xpm create mode 100644 gb.qt4/src/webkit/Makefile.am create mode 100644 gb.qt4/src/webkit/ccookiejar.cpp create mode 100644 gb.qt4/src/webkit/ccookiejar.h create mode 100644 gb.qt4/src/webkit/control/webview.png create mode 100644 gb.qt4/src/webkit/cwebdownload.cpp create mode 100644 gb.qt4/src/webkit/cwebdownload.h create mode 100644 gb.qt4/src/webkit/cwebelement.cpp create mode 100644 gb.qt4/src/webkit/cwebelement.h create mode 100644 gb.qt4/src/webkit/cwebframe.cpp create mode 100644 gb.qt4/src/webkit/cwebframe.h create mode 100644 gb.qt4/src/webkit/cwebhittest.cpp create mode 100644 gb.qt4/src/webkit/cwebhittest.h create mode 100644 gb.qt4/src/webkit/cwebsettings.cpp create mode 100644 gb.qt4/src/webkit/cwebsettings.h create mode 100644 gb.qt4/src/webkit/cwebview.cpp create mode 100644 gb.qt4/src/webkit/cwebview.h create mode 100644 gb.qt4/src/webkit/gb.qt4.webkit.component create mode 100644 gb.qt4/src/webkit/main.cpp create mode 100644 gb.qt4/src/webkit/main.h create mode 100644 gb.qt4/src/x11.c create mode 100644 gb.qt4/src/x11.h create mode 100644 gb.qt5/AUTHORS create mode 120000 gb.qt5/COPYING create mode 100644 gb.qt5/ChangeLog create mode 120000 gb.qt5/INSTALL create mode 100644 gb.qt5/Makefile.am create mode 100644 gb.qt5/NEWS create mode 100644 gb.qt5/README create mode 120000 gb.qt5/acinclude.m4 create mode 120000 gb.qt5/component.am create mode 100644 gb.qt5/configure.ac create mode 120000 gb.qt5/gambas.h create mode 120000 gb.qt5/gb.draw.h create mode 120000 gb.qt5/gb.eval.h create mode 120000 gb.qt5/gb.geom.h create mode 120000 gb.qt5/gb.gl.h create mode 120000 gb.qt5/gb.image.h create mode 120000 gb.qt5/gb.paint.h create mode 100644 gb.qt5/gb.qt.am create mode 120000 gb.qt5/gb_common.h create mode 120000 gb.qt5/m4 create mode 120000 gb.qt5/reconf create mode 120000 gb.qt5/share create mode 120000 gb.qt5/src/CButton.cpp create mode 120000 gb.qt5/src/CButton.h create mode 120000 gb.qt5/src/CCheckBox.cpp create mode 120000 gb.qt5/src/CCheckBox.h create mode 120000 gb.qt5/src/CClipboard.cpp create mode 120000 gb.qt5/src/CClipboard.h create mode 120000 gb.qt5/src/CColor.cpp create mode 120000 gb.qt5/src/CColor.h create mode 120000 gb.qt5/src/CConst.cpp create mode 120000 gb.qt5/src/CConst.h create mode 120000 gb.qt5/src/CContainer.cpp create mode 120000 gb.qt5/src/CContainer.h create mode 120000 gb.qt5/src/CDialog.cpp create mode 120000 gb.qt5/src/CDialog.h create mode 120000 gb.qt5/src/CDraw.cpp create mode 120000 gb.qt5/src/CDraw.h create mode 120000 gb.qt5/src/CDrawingArea.cpp create mode 120000 gb.qt5/src/CDrawingArea.h create mode 120000 gb.qt5/src/CEmbedder.cpp create mode 120000 gb.qt5/src/CEmbedder.h create mode 120000 gb.qt5/src/CFont.cpp create mode 120000 gb.qt5/src/CFont.h create mode 120000 gb.qt5/src/CFrame.cpp create mode 120000 gb.qt5/src/CFrame.h create mode 120000 gb.qt5/src/CImage.cpp create mode 120000 gb.qt5/src/CImage.h create mode 120000 gb.qt5/src/CKey.cpp create mode 120000 gb.qt5/src/CKey.h create mode 120000 gb.qt5/src/CLabel.cpp create mode 120000 gb.qt5/src/CLabel.h create mode 120000 gb.qt5/src/CMenu.cpp create mode 120000 gb.qt5/src/CMenu.h create mode 120000 gb.qt5/src/CMouse.cpp create mode 120000 gb.qt5/src/CMouse.h create mode 120000 gb.qt5/src/CMovieBox.cpp create mode 120000 gb.qt5/src/CMovieBox.h create mode 120000 gb.qt5/src/CPanel.cpp create mode 120000 gb.qt5/src/CPanel.h create mode 120000 gb.qt5/src/CPicture.cpp create mode 120000 gb.qt5/src/CPicture.h create mode 120000 gb.qt5/src/CRadioButton.cpp create mode 120000 gb.qt5/src/CRadioButton.h create mode 120000 gb.qt5/src/CScreen.cpp create mode 120000 gb.qt5/src/CScreen.h create mode 120000 gb.qt5/src/CScrollBar.cpp create mode 120000 gb.qt5/src/CScrollBar.h create mode 120000 gb.qt5/src/CSlider.cpp create mode 120000 gb.qt5/src/CSlider.h create mode 120000 gb.qt5/src/CStyle.cpp create mode 120000 gb.qt5/src/CStyle.h create mode 120000 gb.qt5/src/CTabStrip.cpp create mode 120000 gb.qt5/src/CTabStrip.h create mode 120000 gb.qt5/src/CTextArea.cpp create mode 120000 gb.qt5/src/CTextArea.h create mode 120000 gb.qt5/src/CTextBox.cpp create mode 120000 gb.qt5/src/CTextBox.h create mode 120000 gb.qt5/src/CWatch.cpp create mode 120000 gb.qt5/src/CWatch.h create mode 120000 gb.qt5/src/CWatcher.cpp create mode 120000 gb.qt5/src/CWatcher.h create mode 120000 gb.qt5/src/CWidget.cpp create mode 120000 gb.qt5/src/CWidget.h create mode 120000 gb.qt5/src/CWindow.cpp create mode 120000 gb.qt5/src/CWindow.h create mode 100644 gb.qt5/src/Makefile.am create mode 120000 gb.qt5/src/cpaint_impl.cpp create mode 120000 gb.qt5/src/cpaint_impl.h create mode 120000 gb.qt5/src/cprinter.cpp create mode 120000 gb.qt5/src/cprinter.h create mode 120000 gb.qt5/src/csvgimage.cpp create mode 120000 gb.qt5/src/csvgimage.h create mode 120000 gb.qt5/src/ctrayicon.cpp create mode 120000 gb.qt5/src/ctrayicon.h create mode 120000 gb.qt5/src/desktop.c create mode 120000 gb.qt5/src/desktop.h create mode 120000 gb.qt5/src/ext/CDial.cpp create mode 120000 gb.qt5/src/ext/CDial.h create mode 120000 gb.qt5/src/ext/CLCDNumber.cpp create mode 120000 gb.qt5/src/ext/CLCDNumber.h create mode 120000 gb.qt5/src/ext/CTextEdit.cpp create mode 120000 gb.qt5/src/ext/CTextEdit.h create mode 100644 gb.qt5/src/ext/Makefile.am create mode 100644 gb.qt5/src/ext/gb.qt5.ext.component create mode 100644 gb.qt5/src/ext/main.cpp create mode 100644 gb.qt5/src/ext/main.h create mode 120000 gb.qt5/src/fix_breeze.cpp create mode 120000 gb.qt5/src/fix_breeze.h create mode 120000 gb.qt5/src/gb.qt.h create mode 100644 gb.qt5/src/gb.qt5.component create mode 120000 gb.qt5/src/main.cpp create mode 120000 gb.qt5/src/main.h create mode 100644 gb.qt5/src/opengl/CGLarea.cpp create mode 100644 gb.qt5/src/opengl/CGLarea.h create mode 100644 gb.qt5/src/opengl/COldGLarea.cpp create mode 100644 gb.qt5/src/opengl/COldGLarea.h create mode 100644 gb.qt5/src/opengl/Makefile.am create mode 100644 gb.qt5/src/opengl/gb.qt5.opengl.component create mode 100644 gb.qt5/src/opengl/main.cpp create mode 100644 gb.qt5/src/opengl/main.h create mode 120000 gb.qt5/src/trayicon.xpm create mode 100644 gb.qt5/src/webkit/Makefile.am create mode 120000 gb.qt5/src/webkit/ccookiejar.cpp create mode 120000 gb.qt5/src/webkit/ccookiejar.h create mode 100644 gb.qt5/src/webkit/control/webview.png create mode 120000 gb.qt5/src/webkit/cwebdownload.cpp create mode 120000 gb.qt5/src/webkit/cwebdownload.h create mode 120000 gb.qt5/src/webkit/cwebelement.cpp create mode 120000 gb.qt5/src/webkit/cwebelement.h create mode 120000 gb.qt5/src/webkit/cwebframe.cpp create mode 120000 gb.qt5/src/webkit/cwebframe.h create mode 120000 gb.qt5/src/webkit/cwebhittest.cpp create mode 120000 gb.qt5/src/webkit/cwebhittest.h create mode 120000 gb.qt5/src/webkit/cwebsettings.cpp create mode 120000 gb.qt5/src/webkit/cwebsettings.h create mode 120000 gb.qt5/src/webkit/cwebview.cpp create mode 120000 gb.qt5/src/webkit/cwebview.h create mode 100644 gb.qt5/src/webkit/gb.qt5.webkit.component create mode 120000 gb.qt5/src/webkit/main.cpp create mode 120000 gb.qt5/src/webkit/main.h create mode 120000 gb.qt5/src/x11.c create mode 120000 gb.qt5/src/x11.h create mode 100644 gb.sdl.sound/AUTHORS create mode 120000 gb.sdl.sound/COPYING create mode 100644 gb.sdl.sound/ChangeLog create mode 120000 gb.sdl.sound/INSTALL create mode 100644 gb.sdl.sound/Makefile.am create mode 100644 gb.sdl.sound/NEWS create mode 100644 gb.sdl.sound/README create mode 120000 gb.sdl.sound/acinclude.m4 create mode 120000 gb.sdl.sound/component.am create mode 100644 gb.sdl.sound/configure.ac create mode 120000 gb.sdl.sound/gambas.h create mode 120000 gb.sdl.sound/gb_common.h create mode 120000 gb.sdl.sound/m4 create mode 120000 gb.sdl.sound/reconf create mode 100644 gb.sdl.sound/src/Makefile.am create mode 100644 gb.sdl.sound/src/cdrom.c create mode 100644 gb.sdl.sound/src/cdrom.h create mode 100644 gb.sdl.sound/src/gb.sdl.sound.component create mode 100644 gb.sdl.sound/src/main.c create mode 100644 gb.sdl.sound/src/main.h create mode 100644 gb.sdl.sound/src/sound.c create mode 100644 gb.sdl.sound/src/sound.h create mode 100644 gb.sdl/AUTHORS create mode 120000 gb.sdl/COPYING create mode 100644 gb.sdl/ChangeLog create mode 120000 gb.sdl/INSTALL create mode 100644 gb.sdl/Makefile.am create mode 100644 gb.sdl/NEWS create mode 100644 gb.sdl/README create mode 120000 gb.sdl/acinclude.m4 create mode 120000 gb.sdl/component.am create mode 100644 gb.sdl/configure.ac create mode 120000 gb.sdl/gambas.h create mode 120000 gb.sdl/gb.image.h create mode 120000 gb.sdl/gb_common.h create mode 120000 gb.sdl/m4 create mode 120000 gb.sdl/reconf create mode 100644 gb.sdl/src/Cconst.cpp create mode 100644 gb.sdl/src/Cconst.h create mode 100644 gb.sdl/src/Cdesktop.cpp create mode 100644 gb.sdl/src/Cdesktop.h create mode 100644 gb.sdl/src/Cdraw.cpp create mode 100644 gb.sdl/src/Cdraw.h create mode 100644 gb.sdl/src/Cfont.cpp create mode 100644 gb.sdl/src/Cfont.h create mode 100644 gb.sdl/src/Cimage.cpp create mode 100644 gb.sdl/src/Cimage.h create mode 100644 gb.sdl/src/Cjoystick.cpp create mode 100644 gb.sdl/src/Cjoystick.h create mode 100644 gb.sdl/src/Ckey.cpp create mode 100644 gb.sdl/src/Ckey.h create mode 100644 gb.sdl/src/Cmouse.cpp create mode 100644 gb.sdl/src/Cmouse.h create mode 100644 gb.sdl/src/Cwindow.cpp create mode 100644 gb.sdl/src/Cwindow.h create mode 100644 gb.sdl/src/Makefile.am create mode 100644 gb.sdl/src/SDL_h.h create mode 100644 gb.sdl/src/SDLapp.cpp create mode 100644 gb.sdl/src/SDLapp.h create mode 100644 gb.sdl/src/SDLcore.cpp create mode 100644 gb.sdl/src/SDLcore.h create mode 100644 gb.sdl/src/SDLcursor.cpp create mode 100644 gb.sdl/src/SDLcursor.h create mode 100644 gb.sdl/src/SDLdebug.cpp create mode 100644 gb.sdl/src/SDLdebug.h create mode 100644 gb.sdl/src/SDLerror.cpp create mode 100644 gb.sdl/src/SDLerror.h create mode 100644 gb.sdl/src/SDLfont.cpp create mode 100644 gb.sdl/src/SDLfont.h create mode 100644 gb.sdl/src/SDLgfx.cpp create mode 100644 gb.sdl/src/SDLgfx.h create mode 100644 gb.sdl/src/SDLosrender.cpp create mode 100644 gb.sdl/src/SDLosrender.h create mode 100644 gb.sdl/src/SDLsurface.cpp create mode 100644 gb.sdl/src/SDLsurface.h create mode 100644 gb.sdl/src/SDLtexture.cpp create mode 100644 gb.sdl/src/SDLtexture.h create mode 100644 gb.sdl/src/SDLwindow.cpp create mode 100644 gb.sdl/src/SDLwindow.h create mode 100644 gb.sdl/src/default_font.h create mode 100644 gb.sdl/src/gb.sdl.component create mode 100644 gb.sdl/src/main.cpp create mode 100644 gb.sdl/src/main.h create mode 100644 gb.sdl2/AUTHORS create mode 120000 gb.sdl2/COPYING create mode 100644 gb.sdl2/ChangeLog create mode 120000 gb.sdl2/INSTALL create mode 100644 gb.sdl2/Makefile.am create mode 100644 gb.sdl2/NEWS create mode 100644 gb.sdl2/README create mode 120000 gb.sdl2/acinclude.m4 create mode 120000 gb.sdl2/component.am create mode 100644 gb.sdl2/configure.ac create mode 120000 gb.sdl2/gambas.h create mode 120000 gb.sdl2/gb.geom.h create mode 120000 gb.sdl2/gb.image.h create mode 120000 gb.sdl2/gb_common.h create mode 120000 gb.sdl2/gb_list.h create mode 120000 gb.sdl2/gb_list_temp.h create mode 120000 gb.sdl2/m4 create mode 120000 gb.sdl2/reconf create mode 100644 gb.sdl2/src/Makefile.am create mode 100644 gb.sdl2/src/audio/Makefile.am create mode 100644 gb.sdl2/src/audio/c_channel.c create mode 100644 gb.sdl2/src/audio/c_channel.h create mode 100644 gb.sdl2/src/audio/c_music.c create mode 100644 gb.sdl2/src/audio/c_music.h create mode 100644 gb.sdl2/src/audio/c_sound.c create mode 100644 gb.sdl2/src/audio/c_sound.h create mode 100644 gb.sdl2/src/audio/gb.sdl2.audio.component create mode 100644 gb.sdl2/src/audio/main.c create mode 100644 gb.sdl2/src/audio/main.h create mode 100644 gb.sdl2/src/c_draw.c create mode 100644 gb.sdl2/src/c_draw.h create mode 100644 gb.sdl2/src/c_font.c create mode 100644 gb.sdl2/src/c_font.h create mode 100644 gb.sdl2/src/c_image.c create mode 100644 gb.sdl2/src/c_image.h create mode 100644 gb.sdl2/src/c_key.c create mode 100644 gb.sdl2/src/c_key.h create mode 100644 gb.sdl2/src/c_mouse.c create mode 100644 gb.sdl2/src/c_mouse.h create mode 100644 gb.sdl2/src/c_window.c create mode 100644 gb.sdl2/src/c_window.h create mode 100644 gb.sdl2/src/default_font.c create mode 100644 gb.sdl2/src/default_font.h create mode 100644 gb.sdl2/src/default_font_data.h create mode 100644 gb.sdl2/src/gb.sdl2.component create mode 100644 gb.sdl2/src/main.c create mode 100644 gb.sdl2/src/main.h create mode 100644 gb.v4l/AUTHORS create mode 120000 gb.v4l/COPYING create mode 100644 gb.v4l/ChangeLog create mode 120000 gb.v4l/INSTALL create mode 100644 gb.v4l/Makefile.am create mode 100644 gb.v4l/NEWS create mode 100644 gb.v4l/README create mode 120000 gb.v4l/acinclude.m4 create mode 120000 gb.v4l/component.am create mode 100644 gb.v4l/configure.ac create mode 120000 gb.v4l/gambas.h create mode 120000 gb.v4l/gb.image.h create mode 120000 gb.v4l/gb_common.h create mode 120000 gb.v4l/m4 create mode 100644 gb.v4l/orig/video-capture-0.2.tar.gz create mode 120000 gb.v4l/reconf create mode 100644 gb.v4l/src/CConverters.c create mode 100644 gb.v4l/src/CWebcam.c create mode 100644 gb.v4l/src/CWebcam.h create mode 100644 gb.v4l/src/Makefile.am create mode 100644 gb.v4l/src/gb.v4l.component create mode 100644 gb.v4l/src/gv4l2.c create mode 100644 gb.v4l/src/main.c create mode 100644 gb.v4l/src/main.h create mode 100644 gb.v4l/src/videodev.h create mode 100755 gb.xml/AUTHORS create mode 120000 gb.xml/COPYING create mode 100755 gb.xml/ChangeLog create mode 120000 gb.xml/INSTALL create mode 100755 gb.xml/Makefile.am create mode 100755 gb.xml/NEWS create mode 100755 gb.xml/README create mode 100644 gb.xml/TODO create mode 120000 gb.xml/acinclude.m4 create mode 120000 gb.xml/component.am create mode 100755 gb.xml/configure.ac create mode 120000 gb.xml/gambas.h create mode 120000 gb.xml/gb_common.h create mode 120000 gb.xml/m4 create mode 120000 gb.xml/reconf create mode 100755 gb.xml/src/.directory create mode 100644 gb.xml/src/CDocument.cpp create mode 100644 gb.xml/src/CDocument.h create mode 100644 gb.xml/src/CElement.cpp create mode 100644 gb.xml/src/CElement.h create mode 100644 gb.xml/src/CExplorer.cpp create mode 100644 gb.xml/src/CExplorer.h create mode 100644 gb.xml/src/CNode.cpp create mode 100644 gb.xml/src/CNode.h create mode 100644 gb.xml/src/CReader.cpp create mode 100644 gb.xml/src/CReader.h create mode 100644 gb.xml/src/CTextNode.cpp create mode 100644 gb.xml/src/CTextNode.h create mode 100644 gb.xml/src/Makefile.am create mode 100644 gb.xml/src/document.cpp create mode 100644 gb.xml/src/document.h create mode 100644 gb.xml/src/element.cpp create mode 100644 gb.xml/src/element.h create mode 100644 gb.xml/src/explorer.cpp create mode 100644 gb.xml/src/explorer.h create mode 100755 gb.xml/src/gb.xml.component create mode 100644 gb.xml/src/gb.xml.h create mode 100644 gb.xml/src/gb.xml/.component create mode 100644 gb.xml/src/gb.xml/.directory create mode 100644 gb.xml/src/gb.xml/.icon.png create mode 100644 gb.xml/src/gb.xml/.project create mode 100644 gb.xml/src/gb.xml/.src/MTest.module create mode 100644 gb.xml/src/gb.xml/.src/MTest2.module create mode 100644 gb.xml/src/gb.xml/.src/XmlReader.class create mode 100644 gb.xml/src/gb.xml/.src/XmlWriter.class create mode 100644 gb.xml/src/gb.xml/.src/_XmlWriterDTD.class create mode 100644 gb.xml/src/gb.xml/text.xml create mode 100644 gb.xml/src/gbinterface.h create mode 100644 gb.xml/src/html/CHTMLDocument.cpp create mode 100644 gb.xml/src/html/CHTMLDocument.h create mode 100644 gb.xml/src/html/CHTMLElement.cpp create mode 100644 gb.xml/src/html/CHTMLElement.h create mode 100644 gb.xml/src/html/Makefile.am create mode 100644 gb.xml/src/html/cssfilter.cpp create mode 100644 gb.xml/src/html/cssfilter.h create mode 100755 gb.xml/src/html/gb.xml.html.component create mode 100644 gb.xml/src/html/gb.xml.html.h create mode 100644 gb.xml/src/html/htmldocument.cpp create mode 100644 gb.xml/src/html/htmldocument.h create mode 100644 gb.xml/src/html/htmlelement.cpp create mode 100644 gb.xml/src/html/htmlelement.h create mode 100644 gb.xml/src/html/htmlmain.cpp create mode 100644 gb.xml/src/html/htmlmain.h create mode 100644 gb.xml/src/html/htmlparser.cpp create mode 100644 gb.xml/src/html/htmlparser.h create mode 100644 gb.xml/src/html/htmlserializer.cpp create mode 100644 gb.xml/src/html/htmlserializer.h create mode 100644 gb.xml/src/main.cpp create mode 100644 gb.xml/src/main.h create mode 100644 gb.xml/src/node.cpp create mode 100644 gb.xml/src/node.h create mode 100644 gb.xml/src/parser.cpp create mode 100644 gb.xml/src/parser.h create mode 100644 gb.xml/src/reader.cpp create mode 100644 gb.xml/src/reader.h create mode 100644 gb.xml/src/rpc/Makefile.am create mode 120000 gb.xml/src/rpc/gb.xml.rpc.component create mode 100644 gb.xml/src/rpc/gb.xml.rpc/.component create mode 100644 gb.xml/src/rpc/gb.xml.rpc/.directory create mode 100644 gb.xml/src/rpc/gb.xml.rpc/.icon.png create mode 100644 gb.xml/src/rpc/gb.xml.rpc/.project create mode 100644 gb.xml/src/rpc/gb.xml.rpc/.src/RpcArray.class create mode 100644 gb.xml/src/rpc/gb.xml.rpc/.src/RpcAtom.class create mode 100644 gb.xml/src/rpc/gb.xml.rpc/.src/RpcClient.class create mode 100644 gb.xml/src/rpc/gb.xml.rpc/.src/RpcFunction.class create mode 100644 gb.xml/src/rpc/gb.xml.rpc/.src/RpcServer.class create mode 100644 gb.xml/src/rpc/gb.xml.rpc/.src/RpcStruct.class create mode 100644 gb.xml/src/rpc/gb.xml.rpc/.src/RpcType.class create mode 100644 gb.xml/src/rpc/gb.xml.rpc/.src/Test/CXMLRPC.class create mode 100644 gb.xml/src/rpc/gb.xml.rpc/.src/Test/MMain.module create mode 100644 gb.xml/src/rpc/gb.xml.rpc/.src/Test/MTest.module create mode 100644 gb.xml/src/rpc/gb.xml.rpc/.src/Tools.module create mode 100644 gb.xml/src/rpc/gb.xml.rpc/.src/XmlRpc.class create mode 100644 gb.xml/src/rpc/gb.xml.rpc/.src/hPost.class create mode 100644 gb.xml/src/rpc/gb.xml.rpc/.src/miniServer.class create mode 100644 gb.xml/src/serializer.cpp create mode 100644 gb.xml/src/serializer.h create mode 100644 gb.xml/src/textnode.cpp create mode 100644 gb.xml/src/textnode.h create mode 100644 gb.xml/src/utils.cpp create mode 100644 gb.xml/src/utils.h create mode 100755 gb.xml/src/xslt/CXSLT.cpp create mode 100755 gb.xml/src/xslt/CXSLT.h create mode 100755 gb.xml/src/xslt/Makefile.am create mode 100755 gb.xml/src/xslt/gb.xml.xslt.component create mode 100755 gb.xml/src/xslt/main.cpp create mode 100755 gb.xml/src/xslt/main.h create mode 100644 gb.xml/src/xslt/xslt.pro create mode 100644 logo/gambas-ide.svg create mode 100644 logo/gambas.svg create mode 100644 m4/ax_compare_version.m4 create mode 100644 m4/gb_cflags_gcc_option.m4 create mode 100644 m4/gb_httpd.m4 create mode 100644 m4/gb_sdl.m4 create mode 100644 main/AUTHORS create mode 120000 main/COPYING create mode 120000 main/ChangeLog create mode 100644 main/INSTALL create mode 100644 main/Makefile.am create mode 100644 main/NEWS create mode 100644 main/README create mode 100644 main/TODO create mode 120000 main/acinclude.m4 create mode 120000 main/component.am create mode 100644 main/configure.ac create mode 120000 main/gb.pcre.h create mode 100644 main/gbc/Makefile.am create mode 100644 main/gbc/gb_alloc.c create mode 100644 main/gbc/gb_array.c create mode 100644 main/gbc/gb_buffer.c create mode 100644 main/gbc/gb_common.c create mode 100644 main/gbc/gb_error.c create mode 100644 main/gbc/gb_error.h create mode 100644 main/gbc/gb_file.c create mode 100644 main/gbc/gb_file.h create mode 100644 main/gbc/gb_str.c create mode 100644 main/gbc/gb_str.h create mode 100644 main/gbc/gb_table.c create mode 100644 main/gbc/gba.c create mode 100644 main/gbc/gbc.c create mode 100644 main/gbc/gbc_arch.c create mode 100644 main/gbc/gbc_archive.c create mode 100644 main/gbc/gbc_archive.h create mode 100644 main/gbc/gbc_chown.c create mode 100644 main/gbc/gbc_chown.h create mode 100644 main/gbc/gbc_class.c create mode 100644 main/gbc/gbc_class.h create mode 100644 main/gbc/gbc_code.c create mode 100644 main/gbc/gbc_compile.c create mode 100644 main/gbc/gbc_compile.h create mode 100644 main/gbc/gbc_dump.c create mode 100644 main/gbc/gbc_form.c create mode 100644 main/gbc/gbc_form.h create mode 100644 main/gbc/gbc_form_webpage.c create mode 100644 main/gbc/gbc_header.c create mode 100644 main/gbc/gbc_header.h create mode 100644 main/gbc/gbc_help.c create mode 100644 main/gbc/gbc_help.h create mode 100644 main/gbc/gbc_output.c create mode 100644 main/gbc/gbc_output.h create mode 100644 main/gbc/gbc_pcode.c create mode 100644 main/gbc/gbc_preprocess.c create mode 100644 main/gbc/gbc_preprocess.h create mode 100644 main/gbc/gbc_read.c create mode 100644 main/gbc/gbc_read.h create mode 100644 main/gbc/gbc_reserved.c create mode 100644 main/gbc/gbc_reserved_make.c create mode 100644 main/gbc/gbc_trans.c create mode 100644 main/gbc/gbc_trans.h create mode 100644 main/gbc/gbc_trans_code.c create mode 100644 main/gbc/gbc_trans_ctrl.c create mode 100644 main/gbc/gbc_trans_expr.c create mode 100644 main/gbc/gbc_trans_subr.c create mode 100644 main/gbc/gbc_trans_tree.c create mode 100644 main/gbc/gbc_type.c create mode 100644 main/gbc/gbc_type.h create mode 100644 main/gbc/gbi.c create mode 100644 main/gbx/Makefile.am create mode 100644 main/gbx/gb.jit.h create mode 100644 main/gbx/gb_alloc.c create mode 100644 main/gbx/gb_array.c create mode 100644 main/gbx/gb_buffer.c create mode 100644 main/gbx/gb_common.c create mode 100644 main/gbx/gb_common_check.h create mode 100644 main/gbx/gb_error.c create mode 100644 main/gbx/gb_error.h create mode 100644 main/gbx/gb_file.c create mode 100644 main/gbx/gb_file.h create mode 100644 main/gbx/gb_hash.c create mode 100644 main/gbx/gb_list.c create mode 100644 main/gbx/gb_table.c create mode 100644 main/gbx/gbx.c create mode 100644 main/gbx/gbx.h create mode 100644 main/gbx/gbx_api.c create mode 100644 main/gbx/gbx_api.h create mode 100644 main/gbx/gbx_archive.c create mode 100644 main/gbx/gbx_archive.h create mode 100644 main/gbx/gbx_c_application.c create mode 100644 main/gbx/gbx_c_application.h create mode 100644 main/gbx/gbx_c_array.c create mode 100644 main/gbx/gbx_c_array.h create mode 100644 main/gbx/gbx_c_class.c create mode 100644 main/gbx/gbx_c_class.h create mode 100644 main/gbx/gbx_c_collection.c create mode 100644 main/gbx/gbx_c_collection.h create mode 100644 main/gbx/gbx_c_enum.c create mode 100644 main/gbx/gbx_c_enum.h create mode 100644 main/gbx/gbx_c_error.c create mode 100644 main/gbx/gbx_c_error.h create mode 100644 main/gbx/gbx_c_file.c create mode 100644 main/gbx/gbx_c_file.h create mode 100644 main/gbx/gbx_c_gambas.c create mode 100644 main/gbx/gbx_c_gambas.h create mode 100644 main/gbx/gbx_c_observer.c create mode 100644 main/gbx/gbx_c_observer.h create mode 100644 main/gbx/gbx_c_process.c create mode 100644 main/gbx/gbx_c_process.h create mode 100644 main/gbx/gbx_c_string.c create mode 100644 main/gbx/gbx_c_string.h create mode 100644 main/gbx/gbx_c_system.c create mode 100644 main/gbx/gbx_c_system.h create mode 100644 main/gbx/gbx_c_task.c create mode 100644 main/gbx/gbx_c_task.h create mode 100644 main/gbx/gbx_c_timer.c create mode 100644 main/gbx/gbx_c_timer.h create mode 100644 main/gbx/gbx_class.c create mode 100644 main/gbx/gbx_class.h create mode 100644 main/gbx/gbx_class_desc.h create mode 100644 main/gbx/gbx_class_info.c create mode 100644 main/gbx/gbx_class_init.c create mode 100644 main/gbx/gbx_class_load.c create mode 100644 main/gbx/gbx_class_load.h create mode 100644 main/gbx/gbx_class_native.c create mode 100644 main/gbx/gbx_compare.c create mode 100644 main/gbx/gbx_compare.h create mode 100644 main/gbx/gbx_component.c create mode 100644 main/gbx/gbx_component.h create mode 100644 main/gbx/gbx_date.c create mode 100644 main/gbx/gbx_date.h create mode 100644 main/gbx/gbx_debug.c create mode 100644 main/gbx/gbx_debug.h create mode 100644 main/gbx/gbx_eval.c create mode 100644 main/gbx/gbx_eval.h create mode 100644 main/gbx/gbx_event.c create mode 100644 main/gbx/gbx_event.h create mode 100644 main/gbx/gbx_exec.c create mode 100644 main/gbx/gbx_exec.h create mode 100644 main/gbx/gbx_exec_enum.c create mode 100644 main/gbx/gbx_exec_loop.c create mode 100644 main/gbx/gbx_exec_operator.c create mode 100644 main/gbx/gbx_exec_pop.c create mode 100644 main/gbx/gbx_exec_push.c create mode 100644 main/gbx/gbx_expression.h create mode 100644 main/gbx/gbx_extern.c create mode 100644 main/gbx/gbx_extern.h create mode 100644 main/gbx/gbx_info.h create mode 100644 main/gbx/gbx_jit.c create mode 100644 main/gbx/gbx_jit.h create mode 100644 main/gbx/gbx_library.c create mode 100644 main/gbx/gbx_library.h create mode 100644 main/gbx/gbx_local.c create mode 100755 main/gbx/gbx_local.h create mode 100644 main/gbx/gbx_math.c create mode 100644 main/gbx/gbx_math.h create mode 100644 main/gbx/gbx_number.c create mode 100644 main/gbx/gbx_number.h create mode 100644 main/gbx/gbx_object.c create mode 100644 main/gbx/gbx_object.h create mode 100644 main/gbx/gbx_project.c create mode 100644 main/gbx/gbx_project.h create mode 100644 main/gbx/gbx_regexp.c create mode 100644 main/gbx/gbx_regexp.h create mode 100644 main/gbx/gbx_replace.c create mode 100644 main/gbx/gbx_signal.c create mode 100644 main/gbx/gbx_signal.h create mode 100644 main/gbx/gbx_split.c create mode 100644 main/gbx/gbx_split.h create mode 100644 main/gbx/gbx_stack.c create mode 100644 main/gbx/gbx_stack.h create mode 100644 main/gbx/gbx_stream.c create mode 100644 main/gbx/gbx_stream.h create mode 100644 main/gbx/gbx_stream_arch.c create mode 100644 main/gbx/gbx_stream_buffer.c create mode 100644 main/gbx/gbx_stream_direct.c create mode 100644 main/gbx/gbx_stream_lock.c create mode 100644 main/gbx/gbx_stream_memory.c create mode 100644 main/gbx/gbx_stream_null.c create mode 100644 main/gbx/gbx_stream_pipe.c create mode 100644 main/gbx/gbx_stream_process.c create mode 100644 main/gbx/gbx_stream_string.c create mode 100644 main/gbx/gbx_string.c create mode 100644 main/gbx/gbx_string.h create mode 100644 main/gbx/gbx_struct.c create mode 100644 main/gbx/gbx_struct.h create mode 100644 main/gbx/gbx_subr.c create mode 100644 main/gbx/gbx_subr.h create mode 100644 main/gbx/gbx_subr_conv.c create mode 100644 main/gbx/gbx_subr_extern.c create mode 100755 main/gbx/gbx_subr_file.c create mode 100644 main/gbx/gbx_subr_math.c create mode 100644 main/gbx/gbx_subr_math_temp.h create mode 100644 main/gbx/gbx_subr_misc.c create mode 100644 main/gbx/gbx_subr_string.c create mode 100644 main/gbx/gbx_subr_test.c create mode 100644 main/gbx/gbx_subr_test_temp.h create mode 100644 main/gbx/gbx_subr_time.c create mode 100644 main/gbx/gbx_test.c create mode 100644 main/gbx/gbx_test.h create mode 100644 main/gbx/gbx_type.c create mode 100644 main/gbx/gbx_type.h create mode 100644 main/gbx/gbx_value.c create mode 100644 main/gbx/gbx_value.h create mode 100644 main/gbx/gbx_variant.h create mode 100644 main/gbx/gbx_watch.c create mode 100644 main/gbx/gbx_watch.h create mode 100644 main/lib/Makefile.am create mode 100644 main/lib/clipper/LICENSE create mode 100644 main/lib/clipper/Makefile.am create mode 100644 main/lib/clipper/c_clipper.cpp create mode 100644 main/lib/clipper/c_clipper.h create mode 100644 main/lib/clipper/clipper.cpp create mode 100644 main/lib/clipper/clipper.hpp create mode 100644 main/lib/clipper/gb.clipper.component create mode 120000 main/lib/clipper/gb.geom.h create mode 100644 main/lib/clipper/main.cpp create mode 100644 main/lib/clipper/main.h create mode 100644 main/lib/complex/Makefile.am create mode 100644 main/lib/complex/ccomplex.c create mode 100644 main/lib/complex/ccomplex.h create mode 100644 main/lib/complex/gb.complex.component create mode 100644 main/lib/complex/main.c create mode 100644 main/lib/complex/main.h create mode 100644 main/lib/compress/CCompress.c create mode 100644 main/lib/compress/CCompress.h create mode 100644 main/lib/compress/CUncompress.c create mode 100644 main/lib/compress/CUncompress.h create mode 100644 main/lib/compress/Makefile.am create mode 100644 main/lib/compress/gb.compress.component create mode 100644 main/lib/compress/gb.compress.h create mode 100644 main/lib/compress/main.c create mode 100644 main/lib/compress/main.h create mode 100644 main/lib/data/Makefile.am create mode 100644 main/lib/data/TODO create mode 100644 main/lib/data/c_avltree.c create mode 100644 main/lib/data/c_avltree.h create mode 100644 main/lib/data/c_circular.c create mode 100644 main/lib/data/c_circular.h create mode 100644 main/lib/data/c_deque.c create mode 100644 main/lib/data/c_deque.h create mode 100644 main/lib/data/c_graph.c create mode 100644 main/lib/data/c_graph.h create mode 100644 main/lib/data/c_graphmatrix.c create mode 100644 main/lib/data/c_graphmatrix.h create mode 100644 main/lib/data/c_heap.c create mode 100644 main/lib/data/c_heap.h create mode 100644 main/lib/data/c_list.c create mode 100644 main/lib/data/c_list.h create mode 100644 main/lib/data/c_trie.c create mode 100644 main/lib/data/c_trie.h create mode 100644 main/lib/data/gb.data.component create mode 100644 main/lib/data/gb.data/.component create mode 100644 main/lib/data/gb.data/.directory create mode 100644 main/lib/data/gb.data/.icon.png create mode 100644 main/lib/data/gb.data/.project create mode 100644 main/lib/data/gb.data/.src/MMain.module create mode 100644 main/lib/data/gb.data/.src/PrioSet.class create mode 100644 main/lib/data/gb.data/.src/_PrioSet_Entry.class create mode 100644 main/lib/data/list.h create mode 100644 main/lib/data/lookup3.h create mode 100644 main/lib/data/main.c create mode 100644 main/lib/data/main.h create mode 100644 main/lib/data/string_compare.h create mode 100644 main/lib/data/trie.c create mode 100644 main/lib/data/trie.h create mode 100644 main/lib/db/CConnection.c create mode 100644 main/lib/db/CConnection.h create mode 100644 main/lib/db/CDatabase.c create mode 100644 main/lib/db/CDatabase.h create mode 100644 main/lib/db/CField.c create mode 100644 main/lib/db/CField.h create mode 100644 main/lib/db/CIndex.c create mode 100644 main/lib/db/CIndex.h create mode 100644 main/lib/db/CResult.c create mode 100644 main/lib/db/CResult.h create mode 100644 main/lib/db/CResultField.c create mode 100644 main/lib/db/CResultField.h create mode 100644 main/lib/db/CTable.c create mode 100644 main/lib/db/CTable.h create mode 100644 main/lib/db/CUser.c create mode 100644 main/lib/db/CUser.h create mode 100644 main/lib/db/Makefile.am create mode 100644 main/lib/db/c_subcollection.c create mode 100644 main/lib/db/c_subcollection.h create mode 100644 main/lib/db/deletemap.c create mode 100644 main/lib/db/deletemap.h create mode 100644 main/lib/db/gb.db.component create mode 100644 main/lib/db/gb.db.h create mode 100644 main/lib/db/gb.db.proto.h create mode 100644 main/lib/db/gb.db/.component create mode 100644 main/lib/db/gb.db/.directory create mode 100644 main/lib/db/gb.db/.icon.png create mode 100644 main/lib/db/gb.db/.project create mode 100644 main/lib/db/gb.db/.src/Connection.class create mode 100644 main/lib/db/gb.db/.src/Connections.class create mode 100644 main/lib/db/gb.db/.src/Main.module create mode 100644 main/lib/db/gb.db/.src/SQLRequest.class create mode 100644 main/lib/db/gb_barray.h create mode 100644 main/lib/db/main.c create mode 100644 main/lib/db/main.h create mode 100644 main/lib/db/sqlite.c create mode 100644 main/lib/db/sqlite.h create mode 100644 main/lib/debug/CDebug.c create mode 100644 main/lib/debug/CDebug.h create mode 100644 main/lib/debug/Makefile.am create mode 100644 main/lib/debug/debug.c create mode 100644 main/lib/debug/debug.h create mode 100644 main/lib/debug/gb.debug.component create mode 100644 main/lib/debug/gb.debug.h create mode 100644 main/lib/debug/main.c create mode 100644 main/lib/debug/main.h create mode 100644 main/lib/debug/print.c create mode 100644 main/lib/debug/print.h create mode 100644 main/lib/debug/profile.c create mode 100644 main/lib/debug/profile.h create mode 100644 main/lib/draw/Makefile.am create mode 100644 main/lib/draw/cdraw.c create mode 100644 main/lib/draw/cdraw.h create mode 100644 main/lib/draw/cpaint.c create mode 100644 main/lib/draw/cpaint.h create mode 100644 main/lib/draw/gb.draw.h create mode 120000 main/lib/draw/gb.geom.h create mode 120000 main/lib/draw/gb.image.h create mode 100644 main/lib/draw/gb.paint.h create mode 100644 main/lib/draw/gb_list.c create mode 100644 main/lib/draw/main.c create mode 100644 main/lib/draw/main.h create mode 100644 main/lib/draw/matrix.c create mode 100644 main/lib/draw/matrix.h create mode 100644 main/lib/eval/Makefile.am create mode 100644 main/lib/eval/c_expression.c create mode 100644 main/lib/eval/c_expression.h create mode 100644 main/lib/eval/c_highlight.c create mode 100644 main/lib/eval/c_highlight.h create mode 100644 main/lib/eval/c_system.c create mode 100644 main/lib/eval/c_system.h create mode 100644 main/lib/eval/eval.c create mode 100644 main/lib/eval/eval.h create mode 100644 main/lib/eval/eval_analyze.c create mode 100644 main/lib/eval/eval_analyze.h create mode 100644 main/lib/eval/eval_code.c create mode 100644 main/lib/eval/eval_code.h create mode 100644 main/lib/eval/eval_read.c create mode 100644 main/lib/eval/eval_read.h create mode 100644 main/lib/eval/eval_reserved.c create mode 100644 main/lib/eval/eval_trans.c create mode 100644 main/lib/eval/eval_trans.h create mode 100644 main/lib/eval/eval_trans_expr.c create mode 100644 main/lib/eval/eval_trans_tree.c create mode 100644 main/lib/eval/gb.eval.component create mode 100644 main/lib/eval/gb.eval.h create mode 100644 main/lib/eval/gb_alloc_override.h create mode 100644 main/lib/eval/gb_array.c create mode 100644 main/lib/eval/gb_error.c create mode 100644 main/lib/eval/gb_error.h create mode 100644 main/lib/eval/gb_table.c create mode 100644 main/lib/eval/main.c create mode 100644 main/lib/eval/main.h create mode 100644 main/lib/gb.component create mode 100644 main/lib/geom/Makefile.am create mode 100644 main/lib/geom/cpoint.c create mode 100644 main/lib/geom/cpoint.h create mode 100644 main/lib/geom/cpoint_temp.h create mode 100644 main/lib/geom/crect.c create mode 100644 main/lib/geom/crect.h create mode 100644 main/lib/geom/crect_temp.h create mode 100644 main/lib/geom/gb.geom.h create mode 100644 main/lib/geom/main.c create mode 100644 main/lib/geom/main.h create mode 100644 main/lib/gui.opengl/Makefile.am create mode 100644 main/lib/gui.opengl/gb.gui.opengl.component create mode 100644 main/lib/gui.opengl/main.c create mode 100644 main/lib/gui.opengl/main.h create mode 100644 main/lib/gui.qt.opengl/Makefile.am create mode 100644 main/lib/gui.qt.opengl/gb.gui.qt.opengl.component create mode 100644 main/lib/gui.qt.opengl/main.c create mode 100644 main/lib/gui.qt.opengl/main.h create mode 100644 main/lib/gui.qt.webkit/Makefile.am create mode 100644 main/lib/gui.qt.webkit/gb.gui.qt.webkit.component create mode 100644 main/lib/gui.qt.webkit/main.c create mode 100644 main/lib/gui.qt.webkit/main.h create mode 100644 main/lib/gui.qt/Makefile.am create mode 100644 main/lib/gui.qt/gb.gui.qt.component create mode 120000 main/lib/gui.qt/gb_gui_test_temp.h create mode 100644 main/lib/gui.qt/main.c create mode 100644 main/lib/gui.qt/main.h create mode 100644 main/lib/gui.trayicon/Makefile.am create mode 100644 main/lib/gui.trayicon/cfaketrayicon.c create mode 100644 main/lib/gui.trayicon/cfaketrayicon.h create mode 100644 main/lib/gui.trayicon/gb.gui.trayicon.component create mode 100644 main/lib/gui.trayicon/main.c create mode 100644 main/lib/gui.trayicon/main.h create mode 100644 main/lib/gui/Makefile.am create mode 100644 main/lib/gui/gb.gui.component create mode 100644 main/lib/gui/gb_gui_test_temp.h create mode 100644 main/lib/gui/main.c create mode 100644 main/lib/gui/main.h create mode 100644 main/lib/image.effect/CImage.cpp create mode 100644 main/lib/image.effect/CImage.h create mode 100644 main/lib/image.effect/Makefile.am create mode 100644 main/lib/image.effect/effect.cpp create mode 100644 main/lib/image.effect/effect.h create mode 100644 main/lib/image.effect/gb.image.effect.component create mode 100644 main/lib/image.effect/kcpuinfo.cpp create mode 100644 main/lib/image.effect/kcpuinfo.h create mode 100644 main/lib/image.effect/kimageeffect.cpp create mode 100644 main/lib/image.effect/kimageeffect.h create mode 100644 main/lib/image.effect/main.cpp create mode 100644 main/lib/image.effect/main.h create mode 100644 main/lib/image.effect/qcolor.cpp create mode 100644 main/lib/image.effect/qcolor.h create mode 100644 main/lib/image.effect/qimage.cpp create mode 100644 main/lib/image.effect/qimage.h create mode 100644 main/lib/image.effect/qpoint.cpp create mode 100644 main/lib/image.effect/qpoint.h create mode 100644 main/lib/image.effect/qrect.cpp create mode 100644 main/lib/image.effect/qrect.h create mode 100644 main/lib/image.effect/qsize.cpp create mode 100644 main/lib/image.effect/qsize.h create mode 100644 main/lib/image.effect/qt.h create mode 100644 main/lib/image/CImage.c create mode 100644 main/lib/image/CImage.h create mode 100644 main/lib/image/CImageStat.c create mode 100644 main/lib/image/CImageStat.h create mode 100644 main/lib/image/Makefile.am create mode 100644 main/lib/image/c_color.c create mode 100644 main/lib/image/c_color.h create mode 100644 main/lib/image/gb.image.component create mode 100644 main/lib/image/gb.image.h create mode 100644 main/lib/image/image.c create mode 100644 main/lib/image/image.h create mode 100644 main/lib/image/image_stat.c create mode 100644 main/lib/image/image_stat.h create mode 100644 main/lib/image/main.c create mode 100644 main/lib/image/main.h create mode 100644 main/lib/inotify/Makefile.am create mode 100644 main/lib/inotify/TODO create mode 100644 main/lib/inotify/c_watch.c create mode 100644 main/lib/inotify/c_watch.h create mode 100644 main/lib/inotify/gb.inotify.component create mode 100644 main/lib/inotify/gb_list.c create mode 100644 main/lib/inotify/main.c create mode 100644 main/lib/inotify/main.h create mode 100644 main/lib/jit/Makefile.am create mode 100644 main/lib/jit/gb.jit.component create mode 100644 main/lib/jit/gb.jit/.component create mode 100644 main/lib/jit/gb.jit/.directory create mode 100644 main/lib/jit/gb.jit/.icon.png create mode 100644 main/lib/jit/gb.jit/.project create mode 100644 main/lib/jit/gb.jit/.src/CCompilation.class create mode 100644 main/lib/jit/gb.jit/.src/Jit.module create mode 100644 main/lib/jit/gb.jit/.src/Main.module create mode 100644 main/lib/jit/gb.jit/.src/_ClassStat.class create mode 120000 main/lib/jit/gb.jit/gambas.h create mode 120000 main/lib/jit/gb.jit/gb.jit.h create mode 120000 main/lib/jit/gb.jit/gb_error_common.h create mode 100644 main/lib/jit/gb.jit/jit.h create mode 100644 main/lib/jit/gb_str.c create mode 100644 main/lib/jit/gb_str.h create mode 100644 main/lib/jit/gbc_reserved.c create mode 100644 main/lib/jit/jit.c create mode 100644 main/lib/jit/jit.h create mode 100644 main/lib/jit/jit_body.c create mode 100644 main/lib/jit/main.c create mode 100644 main/lib/jit/main.h create mode 100755 main/lib/option/Makefile.am create mode 100755 main/lib/option/gb.option.component create mode 100755 main/lib/option/getoptions.c create mode 100755 main/lib/option/getoptions.h create mode 100755 main/lib/option/main.c create mode 100755 main/lib/option/main.h create mode 100644 main/lib/signal/Makefile.am create mode 100644 main/lib/signal/csignal.c create mode 100644 main/lib/signal/csignal.h create mode 100644 main/lib/signal/gb.signal.component create mode 100644 main/lib/signal/main.c create mode 100644 main/lib/signal/main.h create mode 100644 main/lib/term/Makefile.am create mode 100644 main/lib/term/cterm.c create mode 100644 main/lib/term/cterm.h create mode 100644 main/lib/term/gb.term.component create mode 100644 main/lib/term/main.c create mode 100644 main/lib/term/main.h create mode 100644 main/lib/test/Makefile.am create mode 100644 main/lib/test/gb.test.component create mode 100644 main/lib/test/gb.test/.component create mode 100644 main/lib/test/gb.test/.directory create mode 100644 main/lib/test/gb.test/.hidden/CHANGELOG create mode 100644 main/lib/test/gb.test/.hidden/flowchart.fodg create mode 100644 main/lib/test/gb.test/.hidden/flowchart.svg create mode 100644 main/lib/test/gb.test/.hidden/gb.test.png create mode 100644 main/lib/test/gb.test/.hidden/summary-example.txt create mode 100644 main/lib/test/gb.test/.icon.png create mode 100644 main/lib/test/gb.test/.lang/de.po create mode 100644 main/lib/test/gb.test/.lang/it.po create mode 100644 main/lib/test/gb.test/.lang/pt_BR.po create mode 100644 main/lib/test/gb.test/.project create mode 100644 main/lib/test/gb.test/.src/Helper.module create mode 100644 main/lib/test/gb.test/.src/Tap/TapContext.class create mode 100644 main/lib/test/gb.test/.src/Tap/TapParser.class create mode 100644 main/lib/test/gb.test/.src/Tap/TapPrinter.class create mode 100644 main/lib/test/gb.test/.src/TestAssertion.class create mode 100644 main/lib/test/gb.test/.src/TestMyself/TAllAsserts.test create mode 100644 main/lib/test/gb.test/.src/TestMyself/TBailout.test create mode 100644 main/lib/test/gb.test/.src/TestMyself/TCrashes.test create mode 100644 main/lib/test/gb.test/.src/TestMyself/TElse.test create mode 100644 main/lib/test/gb.test/.src/TestMyself/TEmpty.test create mode 100644 main/lib/test/gb.test/.src/TestMyself/TFailures.test create mode 100644 main/lib/test/gb.test/.src/TestMyself/TInternals.test create mode 100644 main/lib/test/gb.test/.src/TestMyself/TParser.test create mode 100644 main/lib/test/gb.test/.src/TestMyself/TSetup.test create mode 100644 main/lib/test/gb.test/.src/TestMyself/TSkipAll.test create mode 100644 main/lib/test/gb.test/.src/TestMyself/TSummary.test create mode 100644 main/lib/test/gb.test/.src/TestMyself/TWrongPlan.test create mode 100644 main/lib/test/gb.test/.src/TestRunner.module create mode 100644 main/lib/test/gb.test/.src/TestStats.class create mode 100644 main/lib/test/gb.test/.src/TestSuite/Assert.module create mode 100644 main/lib/test/gb.test/.src/TestSuite/Test.module create mode 100644 main/lib/test/gb.test/.src/TestSuite/TestCase.class create mode 100644 main/lib/test/gb.test/.src/TestSuite/TestCommand.class create mode 100644 main/lib/test/gb.test/.src/TestSuite/TestSuite.class create mode 100644 main/lib/test/gb.test/.src/ZzzDoSth.module create mode 100644 main/lib/test/gb.test/.test create mode 100644 main/lib/test/gb.test/LICENSE create mode 100644 main/lib/test/gb.test/README.md create mode 100644 main/lib/test/gb.test/taskell.md create mode 100755 main/lib/test/gb.test/test.sh create mode 100644 main/lib/test/gb.test/unittesthelloworld-1.0.0.tar.gz create mode 100644 main/lib/test/main.c create mode 100644 main/lib/test/main.h create mode 100644 main/lib/vb/Makefile.am create mode 100644 main/lib/vb/gb.vb.component create mode 100644 main/lib/vb/main.c create mode 100644 main/lib/vb/main.h create mode 100644 main/lib/vb/vb.c create mode 100644 main/lib/vb/vb.h create mode 100644 main/lib/vb/vbdate.c create mode 100644 main/lib/vb/vbdate.h create mode 120000 main/m4 create mode 100644 main/man/Makefile.am create mode 100644 main/man/gba3.1 create mode 100644 main/man/gbc3.1 create mode 100644 main/man/gbh3.1 create mode 100644 main/man/gbi3.1 create mode 100644 main/man/gbr3.1 create mode 100644 main/man/gbx3.1 create mode 100644 main/mime/application-x-gambas3.png create mode 100644 main/mime/application-x-gambas3.xml create mode 120000 main/reconf create mode 100644 main/share/Makefile.am create mode 100644 main/share/gambas.h create mode 100644 main/share/gb_alloc.h create mode 100644 main/share/gb_alloc_temp.h create mode 100644 main/share/gb_arch.h create mode 100644 main/share/gb_arch_temp.h create mode 100644 main/share/gb_array.h create mode 100644 main/share/gb_array_temp.h create mode 100644 main/share/gb_buffer.h create mode 100644 main/share/gb_buffer_temp.h create mode 100644 main/share/gb_class_desc_common.h create mode 100644 main/share/gb_code.h create mode 100644 main/share/gb_code_temp.h create mode 100644 main/share/gb_common.h create mode 100644 main/share/gb_common_buffer.h create mode 100644 main/share/gb_common_buffer_temp.h create mode 100644 main/share/gb_common_case.h create mode 100644 main/share/gb_common_case_temp.h create mode 100644 main/share/gb_common_string.h create mode 100644 main/share/gb_common_string_temp.h create mode 100644 main/share/gb_common_swap.h create mode 100644 main/share/gb_common_swap_temp.h create mode 100644 main/share/gb_component.h create mode 100644 main/share/gb_error_common.h create mode 100644 main/share/gb_file_share.h create mode 100644 main/share/gb_file_temp.h create mode 100644 main/share/gb_hash.h create mode 100644 main/share/gb_hash_temp.h create mode 100644 main/share/gb_limit.h create mode 100644 main/share/gb_list.h create mode 100644 main/share/gb_list_temp.h create mode 100644 main/share/gb_magic.h create mode 100644 main/share/gb_pcode.h create mode 100644 main/share/gb_pcode_temp.h create mode 100644 main/share/gb_replace.h create mode 100644 main/share/gb_replace_temp.h create mode 100644 main/share/gb_reserved.h create mode 100644 main/share/gb_reserved_keyword.h create mode 100644 main/share/gb_reserved_temp.h create mode 100644 main/share/gb_table.h create mode 100644 main/share/gb_table_temp.h create mode 100644 main/share/gb_type_common.h create mode 100644 main/share/gbc_read_common.h create mode 100644 main/share/gbc_trans_common.h create mode 100644 main/share/gbx_subr_common.h create mode 100644 main/tools/gbh3/.directory create mode 100644 main/tools/gbh3/.icon.png create mode 100644 main/tools/gbh3/.project create mode 100644 main/tools/gbh3/.src/MMain.module create mode 100644 main/tools/gbh3/.src/MOldMain.module create mode 100644 main/tools/gbh3/README create mode 100644 main/tools/gbh3/icon.png create mode 100644 main/tools/gbh3/license create mode 100644 main/tools/gbh3/usage create mode 100755 reconf create mode 100755 reconf-all create mode 100644 version.m4 diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..d7701998 --- /dev/null +++ b/.gitignore @@ -0,0 +1,48 @@ +Makefile +Makefile.in +libtool +ltmain.sh +stamp-h1 +warnings.log +.deps/ +aclocal.m4 +config.guess +config.log +config.sub +configure +install-sh +autom4te.cache +config.h +config.h.in +config.status +config.cache +compile +depcomp +missing +/m4/libtool.m4 +/m4/ltoptions.m4 +/m4/ltsugar.m4 +/m4/ltversion.m4 +/m4/lt~obsolete.m4 +.libs/ +*.la +*.lo +*.o +*.a +.dirstamp +*_moc.cpp +*.pot +*.mo +*.gambas +main/trunk_version.h +main/gb*/gb*3 +DISABLED* +.startup +.settings +.info +.list +.action/ +.jit/ +**/.gitignore +app/other/MakeWebSite/gambas.sourceforge.net/*/ +*~ diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 00000000..55405b23 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,193 @@ +build:archlinux: + image: archlinux/base + before_script: + - > + pacman -Syu --needed --noconfirm + alure autoconf automake bzip2 coreutils curl dbus gcc gdk-pixbuf2 git + glew glib2 gmime gsl gst-plugins-base gstreamer gtk2 gtk3 gtkglext imlib2 + intltool libffi libgl libgnome-keyring libmariadbclient librsvg libsm + libxcursor libxml2 libxslt libxtst mariadb make mesa ncurses pcre + pkg-config poppler-glib postgresql postgresql-libs qt5-svg + qt5-webkit qt5-x11extras sdl2 sdl2_gfx sdl2_image sdl2_mixer sdl2_net + sdl2_ttf sdl_mixer sdl_ttf smpeg sqlite unixodbc v4l-utils xdg-utils + zlib gettext + script: + - ./reconf-all + - GAMBAS_CONFIG_FAILURE=1 ./configure -C --disable-sqlite2 --disable-qt4 + - make -j$(nproc) + - make install + + +build:archlinux-clang: + image: archlinux/base + before_script: + - > + pacman -Syu --needed --noconfirm + alure autoconf automake bzip2 coreutils curl dbus clang gdk-pixbuf2 git + glew glib2 gmime gsl gst-plugins-base gstreamer gtk2 gtk3 gtkglext imlib2 + intltool libffi libgl libgnome-keyring libmariadbclient librsvg libsm + libxcursor libxml2 libxslt libxtst mariadb make mesa ncurses pcre + pkg-config poppler-glib postgresql postgresql-libs qt5-svg + qt5-webkit qt5-x11extras sdl2 sdl2_gfx sdl2_image sdl2_mixer sdl2_net + sdl2_ttf sdl_mixer sdl_ttf smpeg sqlite unixodbc v4l-utils xdg-utils + zlib gettext + script: + - ./reconf-all + - GAMBAS_CONFIG_FAILURE=1 ./configure CC=clang CXX=clang++ -C --disable-sqlite2 --disable-qt4 + - make -j$(nproc) + - make install + + +build:debian-oldstable: + image: debian:oldstable + before_script: + - > + apt-get update && apt-get install -y build-essential g++ automake + autoconf libbz2-dev default-libmysqlclient-dev unixodbc-dev libpq-dev + postgresql-server-dev-9.6 libsqlite0-dev libsqlite3-dev libglib2.0-dev + libgtk2.0-dev libcurl4-gnutls-dev libgtkglext1-dev libpcre3-dev + libsdl-sound1.2-dev libsdl-mixer1.2-dev libsdl-image1.2-dev libxml2-dev + libxslt1-dev librsvg2-dev libpoppler-dev libpoppler-glib-dev + libpoppler-private-dev libasound2-dev libesd0-dev libdirectfb-dev + libxtst-dev libffi-dev libqt4-dev libqtwebkit-dev libqt4-opengl-dev + libglew-dev libimlib2-dev libv4l-dev libsdl-ttf2.0-dev + libgnome-keyring-dev libgdk-pixbuf2.0-dev linux-libc-dev + libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libcairo2-dev + libgsl-dev libncurses5-dev libgmime-2.6-dev libalure-dev libgmp-dev + libgtk-3-dev libsdl2-dev libsdl2-mixer-dev libsdl2-ttf-dev + libsdl2-image-dev sane-utils libdumb1-dev libqt5opengl5-dev + libqt5svg5-dev libqt5webkit5-dev libqt5x11extras5-dev qtbase5-dev git + libssl-dev + script: + - ./reconf-all + - GAMBAS_CONFIG_FAILURE=1 ./configure -C + - make -j$(nproc) + - make install + +build:debian-stable: + image: debian:stable + before_script: + - > + apt-get update && apt-get install -y build-essential g++ automake + autoconf libbz2-dev default-libmysqlclient-dev unixodbc-dev libpq-dev + postgresql-server-dev-11 libsqlite0-dev libsqlite3-dev libglib2.0-dev + libgtk2.0-dev libcurl4-gnutls-dev libgtkglext1-dev libpcre3-dev + libsdl-sound1.2-dev libsdl-mixer1.2-dev libsdl-image1.2-dev libxml2-dev + libxslt1-dev librsvg2-dev libpoppler-dev libpoppler-glib-dev + libpoppler-private-dev libasound2-dev libdirectfb-dev libxtst-dev + libffi-dev libqt4-dev libqtwebkit-dev libqt4-opengl-dev libglew-dev + libimlib2-dev libv4l-dev libsdl-ttf2.0-dev libgdk-pixbuf2.0-dev + linux-libc-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev + libcairo2-dev libgsl-dev libncurses5-dev libgmime-2.6-dev libalure-dev + libgmp-dev libgtk-3-dev libsdl2-dev libsdl2-mixer-dev libsdl2-ttf-dev + libsdl2-image-dev sane-utils libdumb1-dev libqt5opengl5-dev + libqt5svg5-dev libqt5webkit5-dev libqt5x11extras5-dev qtbase5-dev git + libssl-dev + script: + - ./reconf-all + - GAMBAS_CONFIG_FAILURE=1 ./configure -C --disable-keyring + - make -j$(nproc) + - make install + +build:debian-testing: + image: debian:testing + before_script: + - > + apt-get update && apt-get install -y build-essential g++ automake + autoconf libbz2-dev default-libmysqlclient-dev unixodbc-dev libpq-dev + postgresql-server-dev-12 libsqlite0-dev libsqlite3-dev libglib2.0-dev + libgtk2.0-dev libcurl4-gnutls-dev libgtkglext1-dev libpcre3-dev + libsdl-sound1.2-dev libsdl-mixer1.2-dev libsdl-image1.2-dev libxml2-dev + libxslt1-dev librsvg2-dev libpoppler-dev libpoppler-glib-dev + libpoppler-private-dev libasound2-dev libdirectfb-dev libxtst-dev + libffi-dev libglew-dev + libimlib2-dev libv4l-dev libsdl-ttf2.0-dev libgdk-pixbuf2.0-dev + linux-libc-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev + libcairo2-dev libgsl-dev libncurses5-dev libgmime-3.0-dev libalure-dev + libgmp-dev libgtk-3-dev libsdl2-dev libsdl2-mixer-dev libsdl2-ttf-dev + libsdl2-image-dev sane-utils libdumb1-dev libqt5opengl5-dev + libqt5svg5-dev libqt5webkit5-dev libqt5x11extras5-dev qtbase5-dev git + libssl-dev + script: + - ./reconf-all + - GAMBAS_CONFIG_FAILURE=1 ./configure -C --disable-keyring --disable-qt4 --disable-qtwebkit + - make -j$(nproc) + - make install + + +build:debian-unstable: + image: debian:unstable + before_script: + - > + apt-get update && apt-get install -y build-essential g++ automake autoconf libbz2-dev default-libmysqlclient-dev unixodbc-dev libpq-dev postgresql-server-dev-12 libsqlite0-dev libsqlite3-dev libglib2.0-dev libgtk2.0-dev libcurl4-gnutls-dev libgtkglext1-dev libpcre3-dev libsdl-sound1.2-dev libsdl-mixer1.2-dev libsdl-image1.2-dev libxml2-dev libxslt1-dev librsvg2-dev libpoppler-dev libpoppler-glib-dev libpoppler-private-dev libasound2-dev libdirectfb-dev libxtst-dev libffi-dev libglew-dev libimlib2-dev libv4l-dev libsdl-ttf2.0-dev libgdk-pixbuf2.0-dev linux-libc-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libcairo2-dev libgsl-dev libncurses5-dev libgmime-3.0-dev libalure-dev libgmp-dev libgtk-3-dev libsdl2-dev libsdl2-mixer-dev libsdl2-ttf-dev libsdl2-image-dev sane-utils libdumb1-dev libqt5opengl5-dev libqt5svg5-dev libqt5webkit5-dev libqt5x11extras5-dev qtbase5-dev git libssl-dev + script: + - ./reconf-all + - GAMBAS_CONFIG_FAILURE=1 ./configure -C --disable-keyring --disable-qt4 + - make -j$(nproc) + - make install + +build:ubuntu-latest: + image: ubuntu:latest + before_script: + - > + apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y build-essential g++ automake autoconf libtool libbz2-dev libmysqlclient-dev unixodbc-dev libpq-dev postgresql-server-dev-12 libsqlite0-dev libsqlite3-dev libglib2.0-dev libgtk2.0-dev libcurl4-gnutls-dev libgtkglext1-dev libpcre3-dev libsdl-sound1.2-dev libsdl-mixer1.2-dev libsdl-image1.2-dev libxml2-dev libxslt1-dev librsvg2-dev libpoppler-dev libpoppler-glib-dev libpoppler-private-dev libasound2-dev libdirectfb-dev libxtst-dev libffi-dev libglew-dev libimlib2-dev libv4l-dev libsdl-ttf2.0-dev libgdk-pixbuf2.0-dev linux-libc-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libcairo2-dev libgsl-dev libncurses5-dev libgmime-2.6-dev llvm-dev llvm libalure-dev libgmp-dev libgtk-3-dev libsdl2-dev libsdl2-mixer-dev libsdl2-ttf-dev libsdl2-image-dev sane-utils libdumb1-dev libssl-dev libqt5opengl5-dev libqt5svg5-dev libqt5webkit5-dev libqt5x11extras5-dev qtbase5-dev git + + script: + - ./reconf-all + - GAMBAS_CONFIG_FAILURE=1 ./configure -C --disable-keyring --disable-qt4 + - make -j$(nproc) + - make install + +build:ubuntu-eoan: + image: ubuntu:eoan + before_script: + - > + apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y build-essential g++ automake autoconf libtool libbz2-dev libmysqlclient-dev unixodbc-dev libpq-dev postgresql-server-dev-11 libsqlite0-dev libsqlite3-dev libglib2.0-dev libgtk2.0-dev libcurl4-gnutls-dev libgtkglext1-dev libpcre3-dev libsdl-sound1.2-dev libsdl-mixer1.2-dev libsdl-image1.2-dev libxml2-dev libxslt1-dev librsvg2-dev libpoppler-dev libpoppler-glib-dev libpoppler-private-dev libasound2-dev libdirectfb-dev libxtst-dev libffi-dev libqt4-dev libqtwebkit-dev libqt4-opengl-dev libglew-dev libimlib2-dev libv4l-dev libsdl-ttf2.0-dev libgdk-pixbuf2.0-dev linux-libc-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libcairo2-dev libgsl-dev libncurses5-dev libgmime-2.6-dev llvm-dev llvm libalure-dev libgmp-dev libgtk-3-dev libsdl2-dev libsdl2-mixer-dev libsdl2-ttf-dev libsdl2-image-dev sane-utils libdumb1-dev libssl-dev libqt5opengl5-dev libqt5svg5-dev libqt5webkit5-dev libqt5x11extras5-dev qtbase5-dev git + + script: + - ./reconf-all + - GAMBAS_CONFIG_FAILURE=1 ./configure -C --disable-keyring + - make -j$(nproc) + - make install + +build:ubuntu-xenial: + image: ubuntu:xenial + before_script: + - > + apt-get update && apt-get install -y build-essential g++ automake autoconf libtool libbz2-dev libmysqlclient-dev unixodbc-dev libpq-dev postgresql-server-dev-9.5 libsqlite0-dev libsqlite3-dev libglib2.0-dev libgtk2.0-dev libcurl4-gnutls-dev libgtkglext1-dev libpcre3-dev libsdl-sound1.2-dev libsdl-mixer1.2-dev libsdl-image1.2-dev libxml2-dev libxslt1-dev librsvg2-dev libpoppler-dev libpoppler-glib-dev libpoppler-private-dev libasound2-dev libdirectfb-dev libxtst-dev libffi-dev libqt4-dev libqtwebkit-dev libqt4-opengl-dev libglew-dev libimlib2-dev libv4l-dev libsdl-ttf2.0-dev libgnome-keyring-dev libgdk-pixbuf2.0-dev linux-libc-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libcairo2-dev libgsl-dev libncurses5-dev libgmime-2.6-dev llvm-dev llvm libalure-dev libgmp-dev libgtk-3-dev libsdl2-dev libsdl2-mixer-dev libsdl2-ttf-dev libsdl2-image-dev sane-utils libdumb1-dev libssl-dev libqt5opengl5-dev libqt5svg5-dev libqt5webkit5-dev libqt5x11extras5-dev qtbase5-dev git + + script: + - ./reconf-all + - GAMBAS_CONFIG_FAILURE=1 ./configure -C + - make -j$(nproc) + - make install + +build:ubuntu-trusty: + image: ubuntu:trusty + before_script: + - > + apt-get update && apt-get install -y build-essential g++ automake autoconf libtool libbz2-dev libmysqlclient-dev unixodbc-dev libpq-dev postgresql-server-dev-9.3 libsqlite0-dev libsqlite3-dev libglib2.0-dev libgtk2.0-dev libcurl4-gnutls-dev libgtkglext1-dev libpcre3-dev libsdl-sound1.2-dev libsdl-mixer1.2-dev libsdl-image1.2-dev libxml2-dev libxslt1-dev librsvg2-dev libpoppler-dev libpoppler-glib-dev libpoppler-private-dev libasound2-dev libdirectfb-dev libxtst-dev libffi-dev libqt4-dev libqtwebkit-dev libqt4-opengl-dev libglew-dev libimlib2-dev libv4l-dev libsdl-ttf2.0-dev libgnome-keyring-dev libgdk-pixbuf2.0-dev linux-libc-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libcairo2-dev libgsl0-dev libncurses5-dev libgmime-2.6-dev llvm-dev llvm libalure-dev libgmp-dev libgtk-3-dev libsdl2-dev libsdl2-mixer-dev libsdl2-ttf-dev libsdl2-image-dev sane-utils libdumb1-dev libssl-dev git libglu1-mesa-dev libglu1-mesa-dev libglew1.10 libglu1-mesa libgles2-mesa-dev + + script: + - ./reconf-all + - GAMBAS_CONFIG_FAILURE=1 ./configure -C --disable-qt5 + - make -j$(nproc) + - make install + +build:alpine: + image: alpine + before_script: + - > + apk add --no-progress -q + autoconf automake libtool curl-dev dbus-dev g++ gdk-pixbuf-dev git gmp-dev + glew-dev glib-dev gmime-dev gsl-dev gst-plugins-base-dev gstreamer-dev gtk+2.0-dev gtk+3.0-dev + imlib2-dev gettext-dev libffi-dev mesa-dev libgnome-keyring-dev mariadb-dev librsvg-dev + libsm-dev libxcursor-dev libxml2-dev libxslt-dev libxtst-dev make ncurses-dev pcre-dev pkgconf + poppler-dev postgresql-dev qt5-qtsvg-dev qt5-qtwebkit-dev qt5-qtx11extras-dev sdl2-dev sdl2_image-dev + sdl2_mixer-dev sdl2_ttf-dev sdl_mixer-dev sqlite-dev unixodbc-dev xdg-utils zlib-dev + script: + - ./reconf-all + - GAMBAS_CONFIG_FAILURE=1 ./configure -C --disable-openal --disable-qt4 --disable-sdl --disable-sqlite2 --disable-v4l --disable-gtkopengl + - make -j$(nproc) + - make install + diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 00000000..4d31db62 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,287 @@ +# +# GAMBAS AUTHORS FILE +# +# This file should list all people that have written code or done translations for Gambas. +# +# If you want to add or fix anything, please write on the mailing-list, or submit a merge +# request with GitLab. +# +# I apologize by advance for any mistake or omission. +# +# The format of that file is the following: +# +# [Name of the author] ([Country]) <[mail address]> +# [Description in Gambas markup syntax] +# ... +# +# [Name of another author] ({Country]) <[mail address]> +# [Description in Gambas markup syntax] +# ... +# +# Void lines and lines beginning with '#' are ignored. +# + +Fabien Bodard (France) + IDE file/project/picture selector and mascot redesign. + The reporting components. + The 'gb.chart' component. + The 'gb.map' component. + The 'gb.scanner' component. + +Nigel Gerrard (United Kingdom) + The [MySQL database driver](http://mysql.com) + The now deprecated QT extended component. + The old SQLite database driver. + +Paul Gardner-Stephen (Australia) + Porting Gambas on Solaris. + +Daniel Campos (Spain) + The networking component + The compression component + The old XML component + The GTK+ component. + The now deprecated VideoForLinux component + The PDF component. + Spanish translation. + +Carlos F. A. Paniago (Brazil) + Porting Gambas on FreeBSD. + +Rob Kudla (USA) + The old Gambas Wiki hosting. + Mandriva RPM packages maintainer. + The 'gb.pcre' component. + +Ronald Onstenk (Netherlands) + The find list in the 1.0 Development Environnement + +Brandon Bergren (USA) + Porting Gambas on Cygwin. + +Laurent Carlier (France) + The SDL component. + The OpenGL component. + ArchLinux support. + +José L. Redrejo Rodríguez (Spain) + Let Gambas compile on all Debian architectures. + Allowed the Gambas IDE to make Debian packages. + Debian and Linex package maintainer. + Spanish translation. + +Andrea Bortolan (Italy) + The ODBC database driver. + +Ahmad Kamal + Arabic translation. + +Daif Al-Otaibi + Arabic translation. + +Dimitri Bellini (Italy) + Italian translation. + +Vincenzo Virgilio (Italy) + Italian translation. + +Maurizio Pozzobon (Italy) + Italian translation + +Jordi Sayol (Andorra) + Catalan translation + +Kazutaka Harada (Japan) + Japanese translation + +Yizhou He + Simplified Chinese translation. + +Knut Berg + Norwegian translation. + +Chunchi Lin + Traditional Chinese translation. + +Wojciech Saltarski (Poland) + Polish translation. + +Radoslav Dejanovic (Croatia) + Croatian translation. + +Luis Minero (Portugal) + Portuguese translation. + +Iuri Matias (Portugal) + Portuguese translation. + +Peter Cernoch (Czech Republic) + Czech translation. + +Nelson Ferraz + Brazilian Portuguese translation. + +Fermyno Gutierrez + Brazilian Portuguese translation. + +Ronald Onstenk (Netherlands) + Dutch translation. + +Fabrice Mous (Netherlands) + Dutch translation. + +Sergey Irupin (Russia) + Russian translation. + +Nima Mohammadi (Iran) + Farsi translation. + +Miha Ambroz + Slovenian translation. + +David Cendal Lago + Galician translation. + +Peter Landgren + Swedish translation. + +Marco Bauer (Germany) + German translation. + +Klaus-Peter Richter (Germany) + German translation. + +Fatih Asici (Turkey) + Turkish translation. + +Balázs Bárány + Hungarian translation. + +Kevin Donnelly + Welsh translation. + +Sahatma Petrus Dolok Marupa Siagian (Indonesia) + Indonesian translation. + +Rizky Tahara Shita + Indonesian translation + +Stefano Palmeri (Italy) + Italian translation. + +Alexander Kazancev (Russia) + Russian translation. + +Alexey Loginov (Russia) + Russian translation. + Mageia RPM packages maintainer. + Testing, ideas, bugfixes. + +Robert Rowe (USA) + Development environment enhancements. + +David Villalobos Cambronero (Costa Rica) + The 'gb.mysql' MySQL specific component. + Spanish translation. + +Peter Mathijssen + Dutch translation. + +Liang Wei (China) + Simplified Chinese translation. + +Philippe Séraphin (France) + IDE Packager wizard enhancements. + +Alexandros Prekates (Greece) + Greek translation. + +Pablo Mileti (Argentina) + GNUBoxWorld and Puzzle1To8 examples. + +Timothy Marshal-Nichols (United Kingdom) + PictureDatabase example. + Printing example. + +Jairo Alonso Badillo Bedoya (Columnia) + Concent game example. + +Gareth Bult (United Kingdom) + WebCam video example. + +Iman Karim (Germany) + Gravity example. + GameOfLife example. + +Stefan Lang (Germany) + German translation. + +Radek Fryšták (Czech Republic) + Czech translation. + +Mathias Ebermann (Germany) + German translation. + +Florin Iacob (Romania) + Romanian translation. + +Josef Kubíček (Czech Republic) + Czech translation. + +Regimantas Baublys (Lithuania) + Lithuanian translation. + +Edison Henrique Andreassy (Brazil) + Brazilian Portuguese translation. + +Randall Morgan + The 'gb.gsl' GNU Scientific Library component. + +Tobias Boege (Germany) + The 'gb.data' component. + The 'gb.inotify' component. + The 'gb.ncurses' component. + The 'gb.openssl' component. + +Adrien Prokopowicz (France) + The rewritten 'gb.xml' component. + The 'gb.xml.html' component. + +Emil Lenngren (Sweden) + The initial Just-In-Time compiler. + +Bruce Bruen (Australia) + IDE Packager wizard enhancements. + +Sebastian Kulesz + Spanish translation. + Gambas Debian/Ubuntu packaging. + The 'gb.logging' component. + The 'gb.memcached' component. + The 'gb.net.pop3' component. + +Paul Wheeler (USA) + English Grammar Check & Clarifications to Wiki entries. + +Willy Raets (Netherlands) + Dutch translation. + +Gianluigi Gradaschi + Italian translation. + +Marcelo López (Argentina) + ODBC driver enhancements. + +Bastian Germann (Germany) + Cygwin package. + Debian package. + pkgsrc package. + Porting on NetBSD and OpenBSD. + Portability fixes for Cygwin. + +Benoît Minisini (France) + French translation. + Main developer. Did everything else... + +Christof Thalhofer (Germany) + Unit test framework. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..74bf15c7 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,149 @@ +# How To Contribute + +This guide provides a step-by-step tutorial on how to contribute to the Gambas source code and translations. + +It will cover the sources' organization, some contributing guidelines and how to use Git and GitLab in order to submit your contribution. + +## Using Git and GitLab + +The Gambas source code is managed by a Git repository, hosted on [GitLab.com](https://gitlab.com/gambas/gambas). + +To handle new contributions, we use the [Project forking workflow](https://docs.gitlab.com/ce/workflow/forking_workflow.html) : +since contributors do not have the permission to write to the Gambas source code directly, you will have to create a separate repository containing your changes, and then create a merge request asking the Gambas developers to merge your changes into the main repository. + +While this might sound complex to new contributors, this document is made to guide through this process, step by step. + +If you are having trouble with the steps mentioned here, or if you have any question regarding a contribution, you can [ask on the mailing-list](http://gambaswiki.org/wiki/doc/forum). + +### Creating a GitLab account + +First, you will need a [GitLab account](https://gitlab.com/users/sign_in) in order to submit any changes. + +We also recommend you [use SSH to work with Git repositories](https://docs.gitlab.com/ce/ssh/README.html), instead of HTTPS. +Not only you won't have to enter your GitLab username and password every time you want to interact with the repository, but it is also more secure as your password is never sent through the network. + +You can also [use GPG to sign your commits](https://docs.gitlab.com/ee/user/project/gpg_signed_commits/index.html), although it is not required. + +### Forking the Gambas Repository + +Now that your GitLab account is set up, we can now [fork the Gambas repository](https://docs.gitlab.com/ce/gitlab-basics/fork-project.html). +This will create a copy of the Gambas repository, but it will belong to you, so you can make any change you want. + +To do this, just go over to the [Gambas project page](https://gitlab.com/gambas/gambas), and click the "Fork" button. + +You will then be asked where to put the forked repository. Once complete, the new repository will appear under your account. + +You can then clone the repository to your local machine, using the following command (replace `` with your GitLab username): + + git clone git@gitlab.com:/gambas.git + +### Making changes to your repository + +Once the cloning is complete, you can make changes to your local copy, which will then have to be commited and pushed. + +First, you can check which files you changed with the `git status`. It's always good to check before commiting ! +You can also view the full diff with the `git diff` command. + +Once everything is done, you will have to select which files you want to commit next using the [git add](https://git-scm.com/docs/git-add) command. + +You can either select specific files or directories using `git add file1.c file2.c main/gbx`, or just select everything using `git add -A`. + +You can then make your commit using the `git commit` command. +This command will open an editor to let you write your commit message. + +For some guidelines on how to write commit messages, see the Writing commit messages section. + +This command will start the default editor (usually `vi`), but you can change this by setting the `EDITOR` environment variable to the command starting your favorite editor. + +Now that the commit is done, you can push it to your GitLab repository using the `git push` command. + +### Creating the merge request + +With your changes now pushed to the GitLab repository, the final step is to create a [Merge Request](https://docs.gitlab.com/ee/user/project/merge_requests/index.html), +kindly asking the Gambas developers to merge your changes to the main Gambas repository. + +Since this process is entirerly made through GitLab, [use the following instructions to create your merge requests](https://docs.gitlab.com/ee/gitlab-basics/add-merge-request.html). + +Its is probable that your changes won't be accepted right away, and you will be asked by the Gambas maintainers to make some changes. + +In this case, you can make your changes, commit them and then push them. +The Merge request on GitLab will be automatically updated, you won't have to recreate it. + +### Keeping your repository up to date + +During the time you make changes to your version of the Gambas source code, or while your request is being reviewed, it is likely that the Gambas repository will receive some updates. + +Since a forked repository is basically a clone, the official version and your version are completely separate, it will not receive newer commits automatically. + +However, you can setup your local repository to connect to both repositories, so you can pull changes from the official Gambas repository, merge them with your changes locally, and then push them to your forked repository. + +First, we will setup your local Git repository by adding the original Gambas repository as a second remote : + + git remote add upstream https://gitlab.com/gambas/gambas.git + +We now have added a new remote named `upstream` to the local repository, pointing to the original Gambas repository. +(You can list all the remotes with the `git remote -v` command.) + +This means Git can now pull changes from the original Gambas repository using the following command : + + git pull upstream master + +This command will take the changes from the `master` branch of the `upstream` remote. + +If you made commits to your version of the repository, it will merge them with the new changes, creating a new merge commit. + +When the merge is complete, you can simply use `git push` to push all these changes to your version of the repository. If you have any Merge Request pending, they will get updated automatically. + + +## Writing commit messages + +In order to automatically generate changelogs for each release, commits in the Gambas repository have to follow a very specific format. + +Here is an example : + + This commit contains things, adds stuff and has lots of fluff. + (but this won't go in the changelog) + + [GB.QT4] + * NEW: Added things to the component. + * BUG: Fixed a bug in the Foo function. + * NEW: Added this very long modification... + ...and it takes more than one Line To Write it. + + This won't go into the changelog either. + + [COMPILER] + * BUG: What an awful bug! + * OPT: Make things go faster. + + [GB.GTK3] + * NEW: The component is now complete! + +As per the Git commit message convention, the first line of each commit is a short description of what it contains. +This line does not end up in the changelog, but it appears in git logs, as well as in the GitLab interface. + +Then, the commit message consists of the following parts : + +* A slot, between square brackets (e.g. `[GB.QT4]`) +* One or more modifications, each prefixed with a tag, which is either `* NEW: `, `* BUG: `, or `* OPT: `, with a space at the end. + +The slot's name is the one of the component modified (in uppercase), or one of these if the changes do not affect a component : +* `[INTERPRETER]` for changes in the interpreter (gbx3). +* `[COMPILER]` for changes in the compiler (gbc3). +* `[ARCHIVER]` for changes in the archiver (gba3). +* `[INFORMER]` for changes in the informer (gbi3). +* `[DEVELOPMENT ENVIRONMENT]` for changes in the IDE (gambas3). +* `[CONFIGURATION]` for changes in the automake/autoconf configuration process +* `[WIKI CGI SCRIPT]` for changes in the wiki CGI script. +* `[WEB SITE MAKER]` for changes in the Gambas web site generator. +* `[EXAMPLES]` for changes in any example. + +The tag's name is one of the following: + +* `NEW` is for new features or translations, updates or other improvements; +* `BUG` is for bug fixes and other corrections +* `OPT` is for optimizations + +Things without an impact for the user (such as refactorings or code cleanups) should not end up in the Changelog. + +All lines without a tag will not appear in the changelog, but if you want a modification to span across multiple lines, you will have to prefix it with two spaces. diff --git a/COPYING b/COPYING new file mode 100644 index 00000000..d159169d --- /dev/null +++ b/COPYING @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) 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 +this service 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 make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. 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. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +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 +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the 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 a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE 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. + + 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 +convey 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 2 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, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision 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, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This 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. diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 00000000..e69de29b diff --git a/INSTALL b/INSTALL new file mode 100644 index 00000000..94ca1b53 --- /dev/null +++ b/INSTALL @@ -0,0 +1 @@ +Visit http://gambaswiki.org/wiki/install. diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 00000000..2f9188c8 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,60 @@ +SUBDIRS = \ + main \ + @bzlib2_dir@ \ + @zlib_dir@ \ + @mysql_dir@ \ + @odbc_dir@ \ + @postgresql_dir@ \ + @sqlite2_dir@ \ + @sqlite3_dir@ \ + @net_dir@ \ + @curl_dir@ \ + @mime_dir@ \ + @pcre_dir@ \ + @sdl_dir@ \ + @sdlsound_dir@ \ + @sdl2_dir@ \ + @libxml_dir@ \ + @xml_dir@ \ + @v4l_dir@ \ + @crypt_dir@ \ + @qt4_dir@ \ + @qt5_dir@ \ + @gtk_dir@ \ + @gtk3_dir@ \ + @opengl_dir@ \ + @x11_dir@ \ + @keyring_dir@ \ + @pdf_dir@ \ + @poppler_dir@ \ + @cairo_dir@ \ + @imageio_dir@ \ + @imageimlib_dir@ \ + @dbus_dir@ \ + @gsl_dir@ \ + @gmp_dir@ \ + @ncurses_dir@ \ + @media_dir@ \ + @httpd_dir@ \ + @openssl_dir@ \ + @openal_dir@ \ + comp \ + app \ + . + +EXTRA_DIST = component.am README README.*[^~] TODO TEMPLATE reconf reconf-all VERSION + +am__tar = ${AMTAR} cof - "$$tardir" + +install-exec-local: + @if test -s $(srcdir)/warnings.log; then \ + echo ; \ + echo "||" ; \ + cat $(srcdir)/warnings.log ; \ + echo "||" ; \ + echo ; \ + fi + @rm -f $(srcdir)/warnings.log + +dist-hook: + @(cd $(distdir); rm -rf `find . -name ".gambas" -o -name ".lock" -o -name ".xvpics" -o -name "*~" -o -name "*.out" -o -name "*.pot" -o -name "*.gambas" -o -name "core.*" -o -name "vgcore.*" -o -name ".kdbg*" -o -name ".svn"`;) diff --git a/NEWS b/NEWS new file mode 100644 index 00000000..e69de29b diff --git a/README b/README new file mode 100644 index 00000000..7a63d96d --- /dev/null +++ b/README @@ -0,0 +1,38 @@ +WELCOME TO GAMBAS! + +GAMBAS is a free implementation of a graphical development environment +based on a BASIC interpreter and a full development platform. It is very +inspired by Visual Basic and Java. + +Go to http://gambas.sourceforge.net to get more information: how to compile +and install it, where to find binary packages, how to report a bug... + +Go to http://gambaswiki.org for language documentation. + +The following pieces of code were borrowed and adapted: + +- The natural string comparison algorithme was adapted from the algorithm + made by Martin Pol. See http://sourcefrog.net/projects/natsort/ for more + details. + +- The hash table implementation was adapted from the glib one. + +- The HTML entities parsing in gb.gtk comes from KHTML sources. + +- The gb.image.effect sources are adapted from KDE 3 image effect routines. + +- The gb.clipper library embeds the Clipper library. See + http://www.angusj.com/delphi/clipper.php for mode details. + +- The function that computes the easter day of a specific year uses an + algorithm made by Aloysius Lilius And Christophorus Clavius. + +- The blurring algoritm is based on the 'StackBlur' algorithm made by Mario Klingemann. + See http://incubator.quasimondo.com/processing/fast_blur_deluxe.php for more details. + +If I forget some borrowed code in the list above, just tell me. + +Enjoy Gambas! + +-- +Benoît diff --git a/README.commit b/README.commit new file mode 100644 index 00000000..3e4f88fe --- /dev/null +++ b/README.commit @@ -0,0 +1,60 @@ +STANDARD FORMAT FOR COMMIT MESSAGES +----------------------------------- + +This message is for all developers that will commit something +into the git repository. + +I want to have a standard way to write commit messages, so that ChangeLog can +be almost automatically generated. + +The format is the following: + +- One line that will be a summary of the changes displayed next to the commit + in GitLab. + +- A ChangeLog slot, between '[' & ']' + + Slots are the name of the component, in uppercase if possible, or some other + slots like [INTERPRETER], [COMPILER]... + +- A ChangeLog modification: a '*', a space, the word 'BUG','NEW' or 'OPT', a + colon, a space, and the text. + + 'BUG' is for a fix, 'NEW' for a new feature, and 'OPT' for an optimization. + + If a changelog modification is more than one line, you must use a two space + indent. + +- Other ChangeLog modifications for the same slot. + +- Other slots. + +- Void lines are ignored. + +- All other lines won't go into the changelog. + +For example: + +--8<----------- +I did this thing, and this will be the summary displayed in GitLab. + +[GB.QT5] +* BUG: I fixed this bug. +* NEW: I made this very long modification.... +  and it takes more than one line to write it. + +This won't go into the changelog too. + +[GB.SDL2] +* BUG: What an awful bug! + +[GB.GTK3] +* NEW: I finally finished the component :-) + +--8<----------- + +You should really try hard to follow this scheme, otherwise generating the +release notes becomes truly a pain for me. Be nice! + +-- +Benoît. diff --git a/README.md b/README.md new file mode 100644 index 00000000..b26e8b53 --- /dev/null +++ b/README.md @@ -0,0 +1,41 @@ + + + +# Gambas Almost Means BASIC + +GAMBAS is a free implementation of a graphical development environment +based on a BASIC interpreter and a full development platform. It is very +inspired by Visual Basic and Java. + +Go to http://gambas.sourceforge.net to get more information: how to compile +and install it, where to find binary packages, how to report a bug... + +Go to http://gambaswiki.org for the language documentation. + +The following pieces of code were borrowed and adapted: + +- The natural string comparison algorithme was adapted from the algorithm + made by Martin Pol. See http://sourcefrog.net/projects/natsort/ for more + details. + +- The hash table implementation was adapted from the glib one. + +- The HTML entities parsing in gb.gtk comes from KHTML sources. + +- The gb.image.effect sources are adapted from KDE 3 image effect routines. + +- The gb.clipper library embeds the Clipper library. See + http://www.angusj.com/delphi/clipper.php for mode details. + +- The function that computes the easter day of a specific year uses an + algorithm made by Aloysius Lilius And Christophorus Clavius. + +- The blurring algoritm is based on the 'StackBlur' algorithm made by Mario Klingemann. + See http://incubator.quasimondo.com/processing/fast_blur_deluxe.php for more details. + +If I forget some borrowed code in the list above, just tell me. + +Enjoy Gambas! + +Benoît. diff --git a/TEMPLATE/README b/TEMPLATE/README new file mode 100644 index 00000000..aa13e0fb --- /dev/null +++ b/TEMPLATE/README @@ -0,0 +1,34 @@ +COMPONENT DIRECTORY TEMPLATE + +Here you will find the 'make-component' script, that creates a initial +component source directory from a configuration file located in the +'conf' directory. + +BE CAREFUL! This template only works inside the complete gambas source +package structure. + +For example, let suppose you want to make a component named 'gb.test', +based on the well known 'test' library: + +1) Copy the file 'TEMPLATE.conf' in the 'conf' directory, and rename it + as 'gb.test.conf' + +2) Open a terminal, with the current directory being the one where + the 'make-component' script is located. This is important, because + otherwise the script won't work. + +3) Edit the file 'gb.test.conf', and replaces the value of each + '#define' directive by the appropriate ones. Each directive has + a commentary that explains its role. + +4) Once done, run './make-component gb.test'. + +5) If everything is ok, you will find a new component directory in the + parent directory named gb.test, with all needed files and symbolic + links ready to be build: configure.ac, Makefile.am, ... + +If something is weird, tell me on the gambas mailing-list! + +Benoît. + + diff --git a/TEMPLATE/TEMPLATE.c b/TEMPLATE/TEMPLATE.c new file mode 100644 index 00000000..99c76741 --- /dev/null +++ b/TEMPLATE/TEMPLATE.c @@ -0,0 +1,28 @@ +$/$*************************************************************************** +## + __SOURCE_NAME##.c +## + __COMPONENT component +## + __COPYRIGHT __AUTHOR __EMAIL +## + 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 1, 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, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + MA 02110-1301, USA. +## +***************************************************************************/ +## +$#$define _##_##__SOURCE_UNAME##_C +## +$#$include $:$##__SOURCE_NAME##.h$:$ diff --git a/TEMPLATE/TEMPLATE.conf b/TEMPLATE/TEMPLATE.conf new file mode 100644 index 00000000..92d4351c --- /dev/null +++ b/TEMPLATE/TEMPLATE.conf @@ -0,0 +1,79 @@ +/* Copyrights */ +#define __COPYRIGHT (c) 2012 +#define __AUTHOR Joe Smith +#define __EMAIL + +/* Name of the component */ +#define __COMPONENT gb.test + +/* Name of the component with points replaced by dashes */ +#define __COMPONENT_DASH gb-test + +/* Name of the component with points replaced by underscore */ +#define __COMPONENT_UNDERSCORE gb_test + +/* Short name of the component */ +#define __NAME test + +/* Short name of the component in uppercase */ +#define __UNAME TEST + +/* Description of the component */ +#define __DESCRIPTION Testing component + +/* If the component detection uses pkg-config */ +#define __USE_PKGCONFIG 0 + +#if __USE_PKGCONFIG + + /* Name of the package for pkg-config */ + #define __PKGCONFIG_NAME test-1.0 + + /* Minimum version needed */ + #define __PKGCONFIG_VERSION 1.2.8 + +#else /* __USE_PKGCONFIG */ + + /* If your component uses C */ + #define __USE_C 1 + + /* If your component uses C++ */ + #define __USE_CPLUSPLUS 1 + + /* If your component uses multi-threading */ + #define __USE_THREAD 1 + + /* If your component uses X-Window */ + #define __USE_XWINDOW 1 + + /* Includes to search for */ + #define __SEARCH_INCLUDE test.h test2.h + + /* Includes directories search path */ + #define __SEARCH_INCLUDE_PATH /usr/local/lib /usr/local /usr/lib /usr + + /* Includes sub-directories search */ + #define __SEARCH_INCLUDE_DIR test/include include test*/include test/*/include + + /* Libraries to search for */ + #define __SEARCH_LIBRARY libtest.$SHLIBEXT libjpeg.$SHLIBEXT libpng.$SHLIBEXT + + /* Libraries directories search path */ + #define __SEARCH_LIBRARY_PATH /usr/local /usr + + /* Libraries sub-directories search path */ + #define __SEARCH_LIBRARY_DIR lib + + /* Libraries to link with */ + #define __LIBRARY -ljpeg -lpng -ltest + + /* Includes to link with */ + #define __INCLUDE -ljpeg -lpng -ltest + +#endif /* __USE_PKGCONFIG */ + +/* Source file list */ +#define __SOURCES main.c main.h test.c test.h + +/* Main C/C++ source basename in uppercase */ +#define __MAIN_UNAME MAIN diff --git a/TEMPLATE/TEMPLATE.cpp b/TEMPLATE/TEMPLATE.cpp new file mode 100644 index 00000000..828c73ad --- /dev/null +++ b/TEMPLATE/TEMPLATE.cpp @@ -0,0 +1,28 @@ +$/$*************************************************************************** +## + __SOURCE_NAME##.c +## + __COMPONENT component +## + __COPYRIGHT __AUTHOR __EMAIL +## + 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 1, 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, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + MA 02110-1301, USA. +## +***************************************************************************/ +## +$#$define _##_##__SOURCE_UNAME##_C +## +$#$include $:$##__SOURCE_NAME##.h##$:$ diff --git a/TEMPLATE/TEMPLATE.h b/TEMPLATE/TEMPLATE.h new file mode 100644 index 00000000..894fd805 --- /dev/null +++ b/TEMPLATE/TEMPLATE.h @@ -0,0 +1,35 @@ +$/$*************************************************************************** +## + __SOURCE_NAME##.h +## + __COMPONENT component +## + __COPYRIGHT __AUTHOR __EMAIL +## + 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 1, 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, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + MA 02110-1301, USA. +## +***************************************************************************/ +## +$#$ifndef _##_##__SOURCE_UNAME##_H +$#$define _##_##__SOURCE_UNAME##_H +## +$#$include "gambas.h" +## +$#$ifndef _##_##__MAIN_UNAME##_C +extern GB_INTERFACE GB; +$#$endif +## +$#$endif $/$* _##_##__SOURCE_UNAME##_H */ diff --git a/TEMPLATE/conf/gb.cairo.conf b/TEMPLATE/conf/gb.cairo.conf new file mode 100644 index 00000000..33c6c173 --- /dev/null +++ b/TEMPLATE/conf/gb.cairo.conf @@ -0,0 +1,76 @@ +/* Copyrights */ +#define __COPYRIGHT (c) 2009 +#define __AUTHOR Benoît Minisini +#define __EMAIL + +/* Name of the component */ +#define __COMPONENT gb.cairo + +/* Name of the component with points replaced by underscore */ +#define __COMPONENT_UNDERSCORE gb_cairo + +/* Short name of the component */ +#define __NAME cairo + +/* Short name of the component in uppercase */ +#define __UNAME CAIRO + +/* Description of the component */ +#define __DESCRIPTION Cairo library + +/* If the component detection uses pkg-config */ +#define __USE_PKGCONFIG 1 + +#if __USE_PKGCONFIG + + /* Name of the package for pkg-config */ + #define __PKGCONFIG_NAME cairo + + /* Minimum version needed */ + #define __PKGCONFIG_VERSION 1.8.0 + +#else /* __USE_PKGCONFIG */ + + /* If your component uses C */ + #define __USE_C 1 + + /* If your component uses C++ */ + #define __USE_CPLUSPLUS 1 + + /* If your component uses multi-threading */ + #define __USE_THREAD 1 + + /* If your component uses X-Window */ + #define __USE_XWINDOW 1 + + /* Includes to search for */ + #define __SEARCH_INCLUDE test.h test2.h + + /* Includes directories search path */ + #define __SEARCH_INCLUDE_PATH /usr/local/lib /usr/local /usr/lib /usr + + /* Includes sub-directories search */ + #define __SEARCH_INCLUDE_DIR test/include include test*/include test/*/include + + /* Libraries to search for */ + #define __SEARCH_LIBRARY libtest.$SHLIBEXT libjpeg.$SHLIBEXT libpng.$SHLIBEXT + + /* Libraries directories search path */ + #define __SEARCH_LIBRARY_PATH /usr/local /usr + + /* Libraries sub-directories search path */ + #define __SEARCH_LIBRARY_DIR lib + + /* Libraries to link with */ + #define __LIBRARY -ljpeg -lpng -ltest + + /* Includes to link with */ + #define __INCLUDE -ljpeg -lpng -ltest + +#endif /* __USE_PKGCONFIG */ + +/* Source file list */ +#define __SOURCES main.c main.h + +/* Main C/C++ source basename in uppercase */ +#define __MAIN_UNAME MAIN diff --git a/TEMPLATE/conf/gb.dbus.conf b/TEMPLATE/conf/gb.dbus.conf new file mode 100644 index 00000000..828e9f1e --- /dev/null +++ b/TEMPLATE/conf/gb.dbus.conf @@ -0,0 +1,76 @@ +/* Copyrights */ +#define __COPYRIGHT (c) 2009 +#define __AUTHOR Benoît Minisini +#define __EMAIL + +/* Name of the component */ +#define __COMPONENT gb.dbus + +/* Name of the component with points replaced by underscore */ +#define __COMPONENT_UNDERSCORE gb_dbus + +/* Short name of the component */ +#define __NAME dbus + +/* Short name of the component in uppercase */ +#define __UNAME DBUS + +/* Description of the component */ +#define __DESCRIPTION DBUS management + +/* If the component detection uses pkg-config */ +#define __USE_PKGCONFIG 1 + +#if __USE_PKGCONFIG + +/* Name of the package for pkg-config */ +#define __PKGCONFIG_NAME dbus-1 + +/* Minimum version needed */ +//#define __PKGCONFIG_VERSION 2.14.3 + +#else /* __USE_PKGCONFIG */ + +/* If your component uses C */ +#define __USE_C 1 + +/* If your component uses C++ */ +#define __USE_CPLUSPLUS 0 + +/* If your component uses multi-threading */ +#define __USE_THREAD 0 + +/* If your component uses X-Window */ +#define __USE_XWINDOW 0 + +/* Includes to search for */ +#define __SEARCH_INCLUDE + +/* Includes directories search path */ +#define __SEARCH_INCLUDE_PATH + +/* Includes sub-directories search */ +#define __SEARCH_INCLUDE_DIR + +/* Libraries to search for */ +#define __SEARCH_LIBRARY + +/* Libraries directories search path */ +#define __SEARCH_LIBRARY_PATH + +/* Libraries sub-directories search path */ +#define __SEARCH_LIBRARY_DIR + +/* Libraries to link with */ +#define __LIBRARY + +/* Includes to look for */ +#define __INCLUDE + +#endif /* __USE_PKGCONFIG */ + +/* Source file list */ +#define __SOURCES main.c main.h cdbus.c cdbus.h + +/* Main C/C++ source basename in uppercase */ +#define __MAIN_UNAME MAIN diff --git a/TEMPLATE/conf/gb.desktop.conf b/TEMPLATE/conf/gb.desktop.conf new file mode 100644 index 00000000..d76ed3d9 --- /dev/null +++ b/TEMPLATE/conf/gb.desktop.conf @@ -0,0 +1,76 @@ +/* Copyrights */ +#define __COPYRIGHT (c) 2007 +#define __AUTHOR Benoît Minisini +#define __EMAIL + +/* Name of the component */ +#define __COMPONENT gb.desktop + +/* Name of the component with points replaced by underscore */ +#define __COMPONENT_UNDERSCORE gb_desktop + +/* Short name of the component */ +#define __NAME desktop + +/* Short name of the component in uppercase */ +#define __UNAME DESKTOP + +/* Description of the component */ +#define __DESCRIPTION Desktop-neutral routines + +/* If the component detection uses pkg-config */ +#define __USE_PKGCONFIG 0 + +#if __USE_PKGCONFIG + +/* Name of the package for pkg-config */ +#define __PKGCONFIG_NAME glib-2.0 + +/* Minimum version needed */ +#define __PKGCONFIG_VERSION + +#else /* __USE_PKGCONFIG */ + +/* If your component uses C */ +#define __USE_C 1 + +/* If your component uses C++ */ +#define __USE_CPLUSPLUS 0 + +/* If your component uses multi-threading */ +#define __USE_THREAD 1 + +/* If your component uses X-Window */ +#define __USE_XWINDOW 1 + +/* Includes to search for */ +#define __SEARCH_INCLUDE + +/* Includes directories search path */ +#define __SEARCH_INCLUDE_PATH + +/* Includes sub-directories search */ +#define __SEARCH_INCLUDE_DIR + +/* Libraries to search for */ +#define __SEARCH_LIBRARY + +/* Libraries directories search path */ +#define __SEARCH_LIBRARY_PATH + +/* Libraries sub-directories search path */ +#define __SEARCH_LIBRARY_DIR + +/* Libraries to link with */ +#define __LIBRARY + +/* Includes to look for */ +#define __INCLUDE + +#endif /* __USE_PKGCONFIG */ + +/* Source file list */ +#define __SOURCES main.c main.h + +/* Main C/C++ source basename in uppercase */ +#define __MAIN_UNAME MAIN diff --git a/TEMPLATE/conf/gb.gmp.conf b/TEMPLATE/conf/gb.gmp.conf new file mode 100644 index 00000000..70af8182 --- /dev/null +++ b/TEMPLATE/conf/gb.gmp.conf @@ -0,0 +1,76 @@ +/* Copyrights */ +#define __COPYRIGHT (c) 2012 +#define __AUTHOR Benoît Minisini +#define __EMAIL + +/* Name of the component */ +#define __COMPONENT gb.gmp + +/* Name of the component with points replaced by underscore */ +#define __COMPONENT_UNDERSCORE gb_gmp + +/* Short name of the component */ +#define __NAME gmp + +/* Short name of the component in uppercase */ +#define __UNAME GMP + +/* Description of the component */ +#define __DESCRIPTION GNU multi-precision arithmetic library component + +/* If the component detection uses pkg-config */ +#define __USE_PKGCONFIG 0 + +#if __USE_PKGCONFIG + + /* Name of the package for pkg-config */ + #define __PKGCONFIG_NAME gsl + + /* Minimum version needed */ + #define __PKGCONFIG_VERSION + +#else /* __USE_PKGCONFIG */ + + /* If your component uses C */ + #define __USE_C 1 + + /* If your component uses C++ */ + #define __USE_CPLUSPLUS 0 + + /* If your component uses multi-threading */ + #define __USE_THREAD 0 + + /* If your component uses X-Window */ + #define __USE_XWINDOW 0 + + /* Includes to search for */ + #define __SEARCH_INCLUDE gmp.h + + /* Includes directories search path */ + #define __SEARCH_INCLUDE_PATH /usr/local /usr + + /* Includes sub-directories search */ + #define __SEARCH_INCLUDE_DIR include + + /* Libraries to search for */ + #define __SEARCH_LIBRARY libgmp.$SHLIBEXT + + /* Libraries directories search path */ + #define __SEARCH_LIBRARY_PATH /usr/local /usr + + /* Libraries sub-directories search path */ + #define __SEARCH_LIBRARY_DIR lib/* lib + + /* Libraries to link with */ + #define __LIBRARY -lgmp + + /* Includes to link with */ + #define __INCLUDE + +#endif /* __USE_PKGCONFIG */ + +/* Source file list */ +#define __SOURCES main.c main.h + +/* Main C/C++ source basename in uppercase */ +#define __MAIN_UNAME MAIN diff --git a/TEMPLATE/conf/gb.gsl.conf b/TEMPLATE/conf/gb.gsl.conf new file mode 100644 index 00000000..9dc4a603 --- /dev/null +++ b/TEMPLATE/conf/gb.gsl.conf @@ -0,0 +1,76 @@ +/* Copyrights */ +#define __COPYRIGHT (c) 2012 +#define __AUTHOR Randall Morgan +#define __EMAIL + +/* Name of the component */ +#define __COMPONENT gb.gsl + +/* Name of the component with points replaced by underscore */ +#define __COMPONENT_UNDERSCORE gb_gsl + +/* Short name of the component */ +#define __NAME gsl + +/* Short name of the component in uppercase */ +#define __UNAME GSL + +/* Description of the component */ +#define __DESCRIPTION GNU Scientific Library component + +/* If the component detection uses pkg-config */ +#define __USE_PKGCONFIG 1 + +#if __USE_PKGCONFIG + + /* Name of the package for pkg-config */ + #define __PKGCONFIG_NAME gsl + + /* Minimum version needed */ + #define __PKGCONFIG_VERSION + +#else /* __USE_PKGCONFIG */ + + /* If your component uses C */ + #define __USE_C 1 + + /* If your component uses C++ */ + #define __USE_CPLUSPLUS 1 + + /* If your component uses multi-threading */ + #define __USE_THREAD 0 + + /* If your component uses X-Window */ + #define __USE_XWINDOW 0 + + /* Includes to search for */ + #define __SEARCH_INCLUDE + + /* Includes directories search path */ + #define __SEARCH_INCLUDE_PATH /usr/local/lib /usr/local /usr/lib /usr + + /* Includes sub-directories search */ + #define __SEARCH_INCLUDE_DIR /usr/local/include gsl/include include gsl*/include gsl/*/include + + /* Libraries to search for */ + #define __SEARCH_LIBRARY libgsl.$SHLIBEXT + + /* Libraries directories search path */ + #define __SEARCH_LIBRARY_PATH /usr/local /usr + + /* Libraries sub-directories search path */ + #define __SEARCH_LIBRARY_DIR local/lib lib + + /* Libraries to link with */ + #define __LIBRARY libgsl + + /* Includes to link with */ + #define __INCLUDE libgsl + +#endif /* __USE_PKGCONFIG */ + +/* Source file list */ +#define __SOURCES main.c main.h c_gsl.c c_gsl.h + +/* Main C/C++ source basename in uppercase */ +#define __MAIN_UNAME MAIN diff --git a/TEMPLATE/conf/gb.image.io.conf b/TEMPLATE/conf/gb.image.io.conf new file mode 100644 index 00000000..a38c7cf8 --- /dev/null +++ b/TEMPLATE/conf/gb.image.io.conf @@ -0,0 +1,76 @@ +/* Copyrights */ +#define __COPYRIGHT (c) 2009 +#define __AUTHOR Benoît Minisini +#define __EMAIL + +/* Name of the component */ +#define __COMPONENT gb.image.io + +/* Name of the component with points replaced by underscore */ +#define __COMPONENT_UNDERSCORE gb_image_io + +/* Short name of the component */ +#define __NAME image_io + +/* Short name of the component in uppercase */ +#define __UNAME IMAGE_IO + +/* Description of the component */ +#define __DESCRIPTION Image loading and saving + +/* If the component detection uses pkg-config */ +#define __USE_PKGCONFIG 1 + +#if __USE_PKGCONFIG + +/* Name of the package for pkg-config */ +#define __PKGCONFIG_NAME gdk-pixbuf-2.0 + +/* Minimum version needed */ +#define __PKGCONFIG_VERSION 2.14.3 + +#else /* __USE_PKGCONFIG */ + +/* If your component uses C */ +#define __USE_C 1 + +/* If your component uses C++ */ +#define __USE_CPLUSPLUS 0 + +/* If your component uses multi-threading */ +#define __USE_THREAD 0 + +/* If your component uses X-Window */ +#define __USE_XWINDOW 0 + +/* Includes to search for */ +#define __SEARCH_INCLUDE + +/* Includes directories search path */ +#define __SEARCH_INCLUDE_PATH + +/* Includes sub-directories search */ +#define __SEARCH_INCLUDE_DIR + +/* Libraries to search for */ +#define __SEARCH_LIBRARY + +/* Libraries directories search path */ +#define __SEARCH_LIBRARY_PATH + +/* Libraries sub-directories search path */ +#define __SEARCH_LIBRARY_DIR + +/* Libraries to link with */ +#define __LIBRARY + +/* Includes to look for */ +#define __INCLUDE + +#endif /* __USE_PKGCONFIG */ + +/* Source file list */ +#define __SOURCES main.c main.h CImage.c CImage.h + +/* Main C/C++ source basename in uppercase */ +#define __MAIN_UNAME MAIN diff --git a/TEMPLATE/conf/gb.media.conf b/TEMPLATE/conf/gb.media.conf new file mode 100644 index 00000000..31b75bd0 --- /dev/null +++ b/TEMPLATE/conf/gb.media.conf @@ -0,0 +1,76 @@ +/* Copyrights */ +#define __COPYRIGHT (c) 2012 +#define __AUTHOR Benoît Minisini +#define __EMAIL + +/* Name of the component */ +#define __COMPONENT gb.media + +/* Name of the component with points replaced by underscore */ +#define __COMPONENT_UNDERSCORE gb_media + +/* Short name of the component */ +#define __NAME media + +/* Short name of the component in uppercase */ +#define __UNAME MEDIA + +/* Description of the component */ +#define __DESCRIPTION GStreamer component + +/* If the component detection uses pkg-config */ +#define __USE_PKGCONFIG 1 + +#if __USE_PKGCONFIG + +/* Name of the package for pkg-config */ +#define __PKGCONFIG_NAME gstreamer-0.10 + +/* Minimum version needed */ +//#define __PKGCONFIG_VERSION 2.14.3 + +#else /* __USE_PKGCONFIG */ + +/* If your component uses C */ +#define __USE_C 1 + +/* If your component uses C++ */ +#define __USE_CPLUSPLUS 0 + +/* If your component uses multi-threading */ +#define __USE_THREAD 0 + +/* If your component uses X-Window */ +#define __USE_XWINDOW 0 + +/* Includes to search for */ +#define __SEARCH_INCLUDE + +/* Includes directories search path */ +#define __SEARCH_INCLUDE_PATH + +/* Includes sub-directories search */ +#define __SEARCH_INCLUDE_DIR + +/* Libraries to search for */ +#define __SEARCH_LIBRARY + +/* Libraries directories search path */ +#define __SEARCH_LIBRARY_PATH + +/* Libraries sub-directories search path */ +#define __SEARCH_LIBRARY_DIR + +/* Libraries to link with */ +#define __LIBRARY + +/* Includes to look for */ +#define __INCLUDE + +#endif /* __USE_PKGCONFIG */ + +/* Source file list */ +#define __SOURCES main.c main.h + +/* Main C/C++ source basename in uppercase */ +#define __MAIN_UNAME MAIN diff --git a/TEMPLATE/conf/gb.mime.conf b/TEMPLATE/conf/gb.mime.conf new file mode 100644 index 00000000..2866478c --- /dev/null +++ b/TEMPLATE/conf/gb.mime.conf @@ -0,0 +1,76 @@ +/* Copyrights */ +#define __COPYRIGHT (c) 2012 +#define __AUTHOR Benoît Minisini +#define __EMAIL + +/* Name of the component */ +#define __COMPONENT gb.mime + +/* Name of the component with points replaced by underscore */ +#define __COMPONENT_UNDERSCORE gb_mime + +/* Short name of the component */ +#define __NAME mime + +/* Short name of the component in uppercase */ +#define __UNAME MIME + +/* Description of the component */ +#define __DESCRIPTION MIME message management based on gmime library + +/* If the component detection uses pkg-config */ +#define __USE_PKGCONFIG 1 + +#if __USE_PKGCONFIG + + /* Name of the package for pkg-config */ + #define __PKGCONFIG_NAME gmime-2.6 + + /* Minimum version needed */ + #define __PKGCONFIG_VERSION + +#else /* __USE_PKGCONFIG */ + + /* If your component uses C */ + #define __USE_C 1 + + /* If your component uses C++ */ + #define __USE_CPLUSPLUS 0 + + /* If your component uses multi-threading */ + #define __USE_THREAD 0 + + /* If your component uses X-Window */ + #define __USE_XWINDOW 0 + + /* Includes to search for */ + #define __SEARCH_INCLUDE gmp.h + + /* Includes directories search path */ + #define __SEARCH_INCLUDE_PATH /usr/local /usr + + /* Includes sub-directories search */ + #define __SEARCH_INCLUDE_DIR include + + /* Libraries to search for */ + #define __SEARCH_LIBRARY libgmp.$SHLIBEXT + + /* Libraries directories search path */ + #define __SEARCH_LIBRARY_PATH /usr/local /usr + + /* Libraries sub-directories search path */ + #define __SEARCH_LIBRARY_DIR lib/* lib + + /* Libraries to link with */ + #define __LIBRARY -lgmp + + /* Includes to link with */ + #define __INCLUDE + +#endif /* __USE_PKGCONFIG */ + +/* Source file list */ +#define __SOURCES main.c main.h + +/* Main C/C++ source basename in uppercase */ +#define __MAIN_UNAME MAIN diff --git a/TEMPLATE/conf/gb.net.pop3.conf b/TEMPLATE/conf/gb.net.pop3.conf new file mode 100644 index 00000000..2ecaafcd --- /dev/null +++ b/TEMPLATE/conf/gb.net.pop3.conf @@ -0,0 +1,76 @@ +/* Copyrights */ +#define __COPYRIGHT (c) 2006 +#define __AUTHOR Benoît Minisini +#define __EMAIL + +/* Name of the component */ +#define __COMPONENT gb.image + +/* Name of the component with points replaced by underscore */ +#define __COMPONENT_UNDERSCORE gb_image + +/* Short name of the component */ +#define __NAME image + +/* Short name of the component in uppercase */ +#define __UNAME IMAGE + +/* Description of the component */ +#define __DESCRIPTION Image processing component + +/* If the component detection uses pkg-config */ +#define __USE_PKGCONFIG 0 + +#if __USE_PKGCONFIG + +/* Name of the package for pkg-config */ +#define __PKGCONFIG_NAME test-1.0 + +/* Minimum version needed */ +#define __PKGCONFIG_VERSION 1.2.8 + +#else /* __USE_PKGCONFIG */ + +/* If your component uses C */ +#define __USE_C 0 + +/* If your component uses C++ */ +#define __USE_CPLUSPLUS 1 + +/* If your component uses multi-threading */ +#define __USE_THREAD 1 + +/* If your component uses X-Window */ +#define __USE_XWINDOW 0 + +/* Includes to search for */ +#define __SEARCH_INCLUDE + +/* Includes directories search path */ +#define __SEARCH_INCLUDE_PATH + +/* Includes sub-directories search */ +#define __SEARCH_INCLUDE_DIR + +/* Libraries to search for */ +#define __SEARCH_LIBRARY + +/* Libraries directories search path */ +#define __SEARCH_LIBRARY_PATH + +/* Libraries sub-directories search path */ +#define __SEARCH_LIBRARY_DIR + +/* Libraries to link with */ +#define __LIBRARY + +/* Includes to look for */ +#define __INCLUDE + +#endif /* __USE_PKGCONFIG */ + +/* Source file list */ +#define __SOURCES main.cpp main.h + +/* Main C/C++ source basename in uppercase */ +#define __MAIN_UNAME MAIN diff --git a/TEMPLATE/conf/gb.net.smtp.conf b/TEMPLATE/conf/gb.net.smtp.conf new file mode 100644 index 00000000..7e074c17 --- /dev/null +++ b/TEMPLATE/conf/gb.net.smtp.conf @@ -0,0 +1,76 @@ +/* Copyrights */ +#define __COPYRIGHT (c) 2006 +#define __AUTHOR Benoît Minisini +#define __EMAIL + +/* Name of the component */ +#define __COMPONENT gb.net.smtp + +/* Name of the component with points replaced by underscore */ +#define __COMPONENT_UNDERSCORE gb_net_smtp + +/* Short name of the component */ +#define __NAME smtp + +/* Short name of the component in uppercase */ +#define __UNAME SMTP + +/* Description of the component */ +#define __DESCRIPTION SMTP client component + +/* If the component detection uses pkg-config */ +#define __USE_PKGCONFIG 1 + +#if __USE_PKGCONFIG + +/* Name of the package for pkg-config */ +#define __PKGCONFIG_NAME glib-2.0 + +/* Minimum version needed */ +#define __PKGCONFIG_VERSION + +#else /* __USE_PKGCONFIG */ + +/* If your component uses C */ +#define __USE_C 0 + +/* If your component uses C++ */ +#define __USE_CPLUSPLUS 1 + +/* If your component uses multi-threading */ +#define __USE_THREAD 1 + +/* If your component uses X-Window */ +#define __USE_XWINDOW 0 + +/* Includes to search for */ +#define __SEARCH_INCLUDE + +/* Includes directories search path */ +#define __SEARCH_INCLUDE_PATH + +/* Includes sub-directories search */ +#define __SEARCH_INCLUDE_DIR + +/* Libraries to search for */ +#define __SEARCH_LIBRARY + +/* Libraries directories search path */ +#define __SEARCH_LIBRARY_PATH + +/* Libraries sub-directories search path */ +#define __SEARCH_LIBRARY_DIR + +/* Libraries to link with */ +#define __LIBRARY + +/* Includes to look for */ +#define __INCLUDE + +#endif /* __USE_PKGCONFIG */ + +/* Source file list */ +#define __SOURCES main.cpp main.h + +/* Main C/C++ source basename in uppercase */ +#define __MAIN_UNAME MAIN diff --git a/TEMPLATE/conf/gb.openal.conf b/TEMPLATE/conf/gb.openal.conf new file mode 100644 index 00000000..e5f03861 --- /dev/null +++ b/TEMPLATE/conf/gb.openal.conf @@ -0,0 +1,76 @@ +/* Copyrights */ +#define __COPYRIGHT (c) 2013 +#define __AUTHOR Benoît Minisini +#define __EMAIL + +/* Name of the component */ +#define __COMPONENT gb.openal + +/* Name of the component with points replaced by underscore */ +#define __COMPONENT_UNDERSCORE gb_openal + +/* Short name of the component */ +#define __NAME openal + +/* Short name of the component in uppercase */ +#define __UNAME OPENAL + +/* Description of the component */ +#define __DESCRIPTION Open AL library + +/* If the component detection uses pkg-config */ +#define __USE_PKGCONFIG 1 + +#if __USE_PKGCONFIG + + /* Name of the package for pkg-config */ + #define __PKGCONFIG_NAME openal + + /* Minimum version needed */ + #define __PKGCONFIG_VERSION 1.14 + +#else /* __USE_PKGCONFIG */ + + /* If your component uses C */ + #define __USE_C 1 + + /* If your component uses C++ */ + #define __USE_CPLUSPLUS 1 + + /* If your component uses multi-threading */ + #define __USE_THREAD 1 + + /* If your component uses X-Window */ + #define __USE_XWINDOW 1 + + /* Includes to search for */ + #define __SEARCH_INCLUDE test.h test2.h + + /* Includes directories search path */ + #define __SEARCH_INCLUDE_PATH /usr/local/lib /usr/local /usr/lib /usr + + /* Includes sub-directories search */ + #define __SEARCH_INCLUDE_DIR test/include include test*/include test/*/include + + /* Libraries to search for */ + #define __SEARCH_LIBRARY libtest.$SHLIBEXT libjpeg.$SHLIBEXT libpng.$SHLIBEXT + + /* Libraries directories search path */ + #define __SEARCH_LIBRARY_PATH /usr/local /usr + + /* Libraries sub-directories search path */ + #define __SEARCH_LIBRARY_DIR lib + + /* Libraries to link with */ + #define __LIBRARY -ljpeg -lpng -ltest + + /* Includes to link with */ + #define __INCLUDE -ljpeg -lpng -ltest + +#endif /* __USE_PKGCONFIG */ + +/* Source file list */ +#define __SOURCES main.c main.h + +/* Main C/C++ source basename in uppercase */ +#define __MAIN_UNAME MAIN diff --git a/TEMPLATE/conf/gb.poppler.conf b/TEMPLATE/conf/gb.poppler.conf new file mode 100644 index 00000000..b927e928 --- /dev/null +++ b/TEMPLATE/conf/gb.poppler.conf @@ -0,0 +1,79 @@ +/* Copyrights */ +#define __COPYRIGHT (c) +#define __AUTHOR Benoît Minisini +#define __EMAIL + +/* Name of the component */ +#define __COMPONENT gb.poppler + +/* Name of the component with points replaced by dashes */ +#define __COMPONENT_DASH gb-poppler + +/* Name of the component with points replaced by underscore */ +#define __COMPONENT_UNDERSCORE gb_poppler + +/* Short name of the component */ +#define __NAME poppler + +/* Short name of the component in uppercase */ +#define __UNAME POPPLER + +/* Description of the component */ +#define __DESCRIPTION Pdf reader based on poppler library + +/* If the component detection uses pkg-config */ +#define __USE_PKGCONFIG 1 + +#if __USE_PKGCONFIG + + /* Name of the package for pkg-config */ + #define __PKGCONFIG_NAME poppler-cpp + + /* Minimum version needed */ + //#define __PKGCONFIG_VERSION 1.2.8 + +#else /* __USE_PKGCONFIG */ + + /* If your component uses C */ + #define __USE_C 1 + + /* If your component uses C++ */ + #define __USE_CPLUSPLUS 1 + + /* If your component uses multi-threading */ + #define __USE_THREAD 1 + + /* If your component uses X-Window */ + #define __USE_XWINDOW 1 + + /* Includes to search for */ + #define __SEARCH_INCLUDE poppler.h test2.h + + /* Includes directories search path */ + #define __SEARCH_INCLUDE_PATH /usr/local/lib /usr/local /usr/lib /usr + + /* Includes sub-directories search */ + #define __SEARCH_INCLUDE_DIR poppler/include include poppler*/include poppler/*/include + + /* Libraries to search for */ + #define __SEARCH_LIBRARY libtest.$SHLIBEXT libjpeg.$SHLIBEXT libpng.$SHLIBEXT + + /* Libraries directories search path */ + #define __SEARCH_LIBRARY_PATH /usr/local /usr + + /* Libraries sub-directories search path */ + #define __SEARCH_LIBRARY_DIR lib + + /* Libraries to link with */ + #define __LIBRARY -ljpeg -lpng -ltest + + /* Includes to link with */ + #define __INCLUDE -ljpeg -lpng -ltest + +#endif /* __USE_PKGCONFIG */ + +/* Source file list */ +#define __SOURCES main.c main.h + +/* Main C/C++ source basename in uppercase */ +#define __MAIN_UNAME MAIN diff --git a/TEMPLATE/make-component b/TEMPLATE/make-component new file mode 100755 index 00000000..c49eb522 --- /dev/null +++ b/TEMPLATE/make-component @@ -0,0 +1,64 @@ +#!/bin/bash + +if test -d ../$1; then + echo "$0: error: This component already exists"; + exit 1; +fi + +if test ! -e ./conf/$1.conf; then + echo "$0: error: The configuration file for this component does not exist"; + exit 1; +fi + +if test x`which cpp` == x; then + echo "$0: error: cpp was not found"; + exit 1; +fi + +echo "Creating component directory $1..." +cp -R template ../$1 +rm -rf ../$1/.svn ../$1/*/.svn + +echo "Applying template..." +for i in ../$1/* ../$1/*/*; do + if test ! -h $i && test ! -d $i; then + cpp -P -include ./conf/$1.conf -o $i.out $i; + rm -f $i; + cat $i.out | sed s/"\\$\/\\$"/"\/"/g | sed s/"\\$'\\$"/"\""/g | sed s/"\\$:\\$"/"\""/g | sed s/"\\$\#\\$"/"\#"/g | sed s/"\#@\#"/"@"/g | sed s/"\#\#"/""/g > $i; + rm -f $i.out; + fi +done + +echo "Creating source files..." +for i in `cat ../$1/SOURCES`; do + BASENAME=`basename $i`; + SOURCE=../$1/src/$i; + if test ! `basename $i .h` = $BASENAME; then + cpp -P -include ./conf/$1.conf -D__SOURCE_NAME=`basename $i .h` -D__SOURCE_UNAME=`basename $i .h | tr '[:lower:]' '[:upper:]'` -o $SOURCE TEMPLATE.h; + elif test ! `basename $i .c` = $BASENAME; then + cpp -P -include ./conf/$1.conf -D__SOURCE_NAME=`basename $i .c` -D__SOURCE_UNAME=`basename $i .c | tr '[:lower:]' '[:upper:]'` -o $SOURCE TEMPLATE.c; + elif test ! `basename $i .cpp` = $BASENAME; then + cpp -P -include ./conf/$1.conf -D__SOURCE_NAME=`basename $i .cpp` -D__SOURCE_UNAME=`basename $i .cpp | tr '[:lower:]' '[:upper:]'` -o $SOURCE TEMPLATE.cpp; + fi + cat $SOURCE | sed s/"\\$\/\\$"/"\/"/g | sed s/"\\$'\\$"/"\""/g | sed s/"\\$:\\$"/"\""/g | sed s/"\\$\#\\$"/"\#"/g | sed s/"\#@\#"/"@"/g | sed s/"\#\#"/""/g > $SOURCE.tmp; + rm -f $SOURCE; + mv $SOURCE.tmp $SOURCE; +done +rm -f ../$1/SOURCES + +echo "Creating symbolic links..." +pushd . > /dev/null +cd ../$1 +rm -f `find . -name \*~` +for i in ../acinclude.m4 ../component.am ../main/share/gambas.h ../main/share/gb_common.h ../reconf ../INSTALL ../COPYING ../missing ../m4; do + ln -s $i; +done +popd > /dev/null + +pushd . > /dev/null +cd ../$1 +(source ./make-component) +rm -f make-component +popd > /dev/null + + diff --git a/TEMPLATE/template/AUTHORS b/TEMPLATE/template/AUTHORS new file mode 100644 index 00000000..e69de29b diff --git a/TEMPLATE/template/ChangeLog b/TEMPLATE/template/ChangeLog new file mode 100644 index 00000000..e69de29b diff --git a/TEMPLATE/template/Makefile.am b/TEMPLATE/template/Makefile.am new file mode 100644 index 00000000..008b94a7 --- /dev/null +++ b/TEMPLATE/template/Makefile.am @@ -0,0 +1,3 @@ +ACLOCAL_AMFLAGS = -I m4 --install +SUBDIRS = @__UNAME##_DIR@ +EXTRA_DIST = reconf gambas.h gb*.h diff --git a/TEMPLATE/template/NEWS b/TEMPLATE/template/NEWS new file mode 100644 index 00000000..e69de29b diff --git a/TEMPLATE/template/README b/TEMPLATE/template/README new file mode 100644 index 00000000..e69de29b diff --git a/TEMPLATE/template/SOURCES b/TEMPLATE/template/SOURCES new file mode 100644 index 00000000..7e45e083 --- /dev/null +++ b/TEMPLATE/template/SOURCES @@ -0,0 +1,2 @@ +__SOURCES + diff --git a/TEMPLATE/template/configure.ac b/TEMPLATE/template/configure.ac new file mode 100644 index 00000000..b4e99781 --- /dev/null +++ b/TEMPLATE/template/configure.ac @@ -0,0 +1,72 @@ +dnl ---- configure.ac for __COMPONENT + +m4_include([../version.m4]) +AC_INIT(gambas3-__COMPONENT_DASH, GB_VERSION, GB_MAIL, [], GB_URL) +AC_CONFIG_MACRO_DIR([m4]) + +GB_INIT(__COMPONENT) +AC_PROG_LIBTOOL + +#if __USE_XWINDOW || __USE_QT +GB_CHECK_XWINDOW +#endif + +#if __USE_QT +GB_FIND_QT_MOC +#endif + +#if __USE_PKGCONFIG + +GB_COMPONENT_PKG_CONFIG( + __NAME, + __UNAME, + __COMPONENT, + [src], + __PKGCONFIG_NAME) + +#else + +#if __USE_C +#define __LIBRARY_C $C_LIB +#else +#define __LIBRARY_C +#endif +#if __USE_CPP +#define __LIBRARY_CPP $CXX_LIB +#else +#define __LIBRARY_CPP +#endif +#if __USE_THREAD +#define __LIBRARY_THREAD $THREAD_LIB +#define __INCLUDE_THREAD $THREAD_INC +#else +#define __LIBRARY_THREAD +#define __INCLUDE_THREAD +#endif + +GB_COMPONENT( + __NAME, + __UNAME, + __COMPONENT, + [src], +#ifdef __SEARCH_INCLUDE + [GB_FIND(__SEARCH_INCLUDE, __SEARCH_INCLUDE_PATH, __SEARCH_INCLUDE_DIR)], +#else + [], +#endif +#ifdef __SEARCH_LIBRARY + [GB_FIND(__SEARCH_LIBRARY, __SEARCH_LIBRARY_PATH, __SEARCH_LIBRARY_DIR)], +#else + [], +#endif + [__LIBRARY_C __LIBRARY_CPP __LIBRARY_THREAD __LIBRARY], + [__INCLUDE_THREAD __INCLUDE]) + +#endif + +AC_OUTPUT( \ +Makefile \ +src/Makefile \ +) + +GB_PRINT_MESSAGES diff --git a/TEMPLATE/template/make-component b/TEMPLATE/template/make-component new file mode 100755 index 00000000..ddce91cd --- /dev/null +++ b/TEMPLATE/template/make-component @@ -0,0 +1,3 @@ +$#$!/bin/sh +cd src +mv .component __COMPONENT.component diff --git a/TEMPLATE/template/src/.component b/TEMPLATE/template/src/.component new file mode 100644 index 00000000..10e636c3 --- /dev/null +++ b/TEMPLATE/template/src/.component @@ -0,0 +1,3 @@ +[Component] +Author= +Alpha=1 diff --git a/TEMPLATE/template/src/Makefile.am b/TEMPLATE/template/src/Makefile.am new file mode 100644 index 00000000..29c457f4 --- /dev/null +++ b/TEMPLATE/template/src/Makefile.am @@ -0,0 +1,12 @@ +COMPONENT = __COMPONENT +include $(top_srcdir)/component.am + +gblib_LTLIBRARIES = __COMPONENT.la + +__COMPONENT_UNDERSCORE##_la_LIBADD = #@#__UNAME##_LIB@ +__COMPONENT_UNDERSCORE##_la_LDFLAGS = -module @LD_FLAGS@ #@#__UNAME##_LDFLAGS@ +__COMPONENT_UNDERSCORE##_la_CPPFLAGS = #@#__UNAME##_INC@ + +__COMPONENT_UNDERSCORE##_la_SOURCES = __SOURCES + + diff --git a/TODO b/TODO new file mode 100644 index 00000000..b541cdb5 --- /dev/null +++ b/TODO @@ -0,0 +1,74 @@ +TODO list: always incomplete :-) +-------------------------------- + +COMPILER + +- Compilation error must always indicate the column, not sometimes only the line. + +INTERPRETER + +- A special syntax to make variable writable once only (for controls variables). +- Add global parameters for each component. Or no, a global configuration repository, to + tell, for example, which socket the mysql component must use... +- Make objects printable, with a "_print" hidden method or something else. +- Type mismatch error: print the mismatched values. +- Special runtime debugging commands for dumping all the variables for example. +- A new debugging compilation option to only put line number information in the output files. +- If project compilation version < compiler version then => compile all +- Catch kill signal to remove temporary files. +- MOD with floats. +- Make the error information associated with the current stack frame. +- Timer.TimeLeft. +- OPEN ... LOCK. True lock while reading/writing a file. +- select() system call can fail if a watched file descriptor is in error. But how can I know + the offending file descriptor? Maybe by using poll() instead. + +DEBUGGER + +- Add/Remove a breakpoint without pausing the program! + +DEVELOPMENT ENVIRONMENT + +- Manage Object properties in IDE. +- Make a visual control clipboard. +- Generates an index control->component to suggest components for missing controls. +- Be able to open a .tar.gz project, and compress it back when the project is closed. +- Conditional breakpoints. +- Define a control order somewhere for the toolbox. +- An option to interpret "." and "," when reading float in a CSV import. +- Class template files. +- Redesign the source code navigator (F2 and SHIFT+F2). + +GUI RELATED STUFF + +- Deleting a currently expanding item in TreeView crashes. +- ValueBox.Value should be visible in the IDE. +- ListView and GridView selection interface should be the same. +- More clever vertical toolbar. + +DESKTOP COMPONENT + +- Detect an already running application. + +DATABASE COMPONENT + +- Add Views support in database component. +- Changeable client Charset in database driver. +- Returns the number of records affected by a query. +- A new database driver model. +- Copy a result line into another one. + +DOCUMENTATION WIKI + +- Mass rename command. +- Fix last changes: only those in one language. +- A documentation page to explain the Gambas syntax. +- User comments on documentation pages. + +NETWORK COMPONENT + +- Do a big cleanup. + +COMPONENTS + +- Put version number in *.component files, and use it when making dependencies in the IDE. diff --git a/VERSION b/VERSION new file mode 100644 index 00000000..861845e4 --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +3.15.2 diff --git a/acinclude.m4 b/acinclude.m4 new file mode 100644 index 00000000..823712fe --- /dev/null +++ b/acinclude.m4 @@ -0,0 +1,1634 @@ +####################################################################################### +## +## The following macros are specific to Gambas. +## Some of them are made by me (Benoît Minisini) +## Feel free to use these macros as you need ! +## +## IMPORTANT: This file is shared by all Gambas +## source packages +## +####################################################################################### + +## --------------------------------------------------------------------------- +## GB_MESSAGE +## Prints a message, and stores it in a summay file to print it later +## --------------------------------------------------------------------------- + +AC_DEFUN([GB_MESSAGE], +[ + echo "|| $1" >> $srcdir/warnings.log +]) + +## --------------------------------------------------------------------------- +## GB_MESSAGE +## Prints a warning message, and stores it in a summay file to print it later +## --------------------------------------------------------------------------- + +AC_DEFUN([GB_WARNING], +[ + AC_MSG_WARN($1) + GB_MESSAGE([$1]) +]) + +## --------------------------------------------------------------------------- +## GB_CLEAR_MESSAGES +## Clear summary +## --------------------------------------------------------------------------- + +AC_DEFUN([GB_CLEAR_MESSAGES], +[ + rm -f $srcdir/warnings.log + touch $srcdir/warnings.log +]) + +## --------------------------------------------------------------------------- +## GB_PRINT_MESSAGES +## Print summary +## --------------------------------------------------------------------------- + +AC_DEFUN([GB_PRINT_MESSAGES], +[ + if test -s $srcdir/warnings.log; then + echo + echo "||" + cat $srcdir/warnings.log + echo "||" + echo + fi + + if test -e FAILED && test "x${GAMBAS_CONFIG_FAILURE}" != "x"; then + AC_MSG_ERROR([Failed to configure $3]) + fi +]) + +## --------------------------------------------------------------------------- +## GB_INIT_AUTOMAKE +## automake initialization with common version number +## --------------------------------------------------------------------------- + +AC_DEFUN([GB_INIT_AUTOMAKE], +[ + AM_INIT_AUTOMAKE([subdir-objects]) + m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES(yes)]) + AC_CONFIG_HEADER([config.h]) + AC_PREFIX_DEFAULT(/usr) + + GAMBAS_VERSION=GB_VERSION_MAJOR + GAMBAS_MINOR_VERSION=GB_VERSION_MINOR + + AC_SUBST(GAMBAS_VERSION) + AC_SUBST(GAMBAS_MINOR_VERSION) + + AC_DEFINE(GAMBAS_VERSION, GB_VERSION_MAJOR, Gambas version) + AC_DEFINE(GAMBAS_MINOR_VERSION, GB_VERSION_MINOR, Gambas minor version) + + AC_DEFINE(GAMBAS_VERSION_STRING, "GB_VERSION_MAJOR", Gambas version string) + AC_DEFINE(GAMBAS_FULL_VERSION_STRING, "GB_VERSION_MAJOR.GB_VERSION_MINOR", Gambas full version string) + + AC_DEFINE(GAMBAS_FULL_VERSION, GB_VERSION_FULL, [Full Gambas version]) + AC_DEFINE(GAMBAS_PCODE_VERSION, GB_PCODE_VERSION, [Gambas bytecode version]) + AC_DEFINE(GAMBAS_PCODE_VERSION_MIN, GB_PCODE_VERSION_MIN, [Minimum Gambas bytecode version]) + + GB_CLEAR_MESSAGES +]) + +## --------------------------------------------------------------------------- +## GB_CONFIG_SUBDIRS +## configuration of a component sub-directory, with a flag for disabling it +## --------------------------------------------------------------------------- + +AC_DEFUN([GB_CONFIG_SUBDIRS], +[ + AC_ARG_ENABLE( + $1, + [ --enable-$1 enable $1 component (default: yes)], + gb_enable_$1=$enableval, + gb_enable_$1=yes + ) + + if test "$gb_enable_$1" = "yes"; then + if test -d $srcdir/$2; then + AC_CONFIG_SUBDIRS($2) + $1_dir=$2 + fi + else + GB_WARNING([$1 component is disabled by configure option]) + $1_dir="" + fi + + AC_SUBST($1_dir) +]) + +## --------------------------------------------------------------------------- +## GB_INIT_SHORT GB_INIT GB_LIBTOOL +## configure.ac initialization +## --------------------------------------------------------------------------- + +AC_DEFUN([GB_INIT_SHORT], +[ + AC_CONFIG_SRCDIR([configure.ac]) + AM_MAINTAINER_MODE + + COMPONENT=$1 + + GB_INIT_AUTOMAKE + + AC_CANONICAL_HOST + + gbbindir=$bindir/gambas$GAMBAS_VERSION + AC_SUBST(gbbindir) + gblibdir=$libdir/gambas$GAMBAS_VERSION + AC_SUBST(gblibdir) + gbdatadir=$datadir/gambas$GAMBAS_VERSION + AC_SUBST(gbdatadir) + + AC_PROG_INSTALL + AC_PROG_LN_S +]) + +AC_DEFUN([GB_LIBTOOL], +[ + AC_LIBTOOL_DLOPEN + ##AC_LIBLTDL_CONVENIENCE + AC_LIBTOOL_WIN32_DLL + AC_DISABLE_STATIC + + AC_SUBST(INCLTDL) + AC_SUBST(LIBLTDL) + + dnl LD_FLAGS="-Wl,-O1" + if test $SYSTEM == "CYGWIN"; then + LD_FLAGS="$LD_FLAGS -no-undefined" + fi + AC_SUBST(LD_FLAGS) +]) + +AC_DEFUN([GB_INIT], +[ + GB_INIT_SHORT($1) + GB_SYSTEM + GB_LIBTOOL + + dnl ---- Checks for headers needed by the following tests + + AC_CHECK_HEADERS(unistd.h) + + dnl ---- Checks for header files. + + dnl AC_HEADER_DIRENT + dnl AC_HEADER_STDC + dnl AC_HEADER_SYS_WAIT + + dnl ---- Checks for typedefs, structures, and compiler characteristics. + + dnl AC_C_CONST + dnl AC_TYPE_PID_T + dnl AC_TYPE_SIZE_T + dnl AC_HEADER_TIME + dnl AC_STRUCT_TM + dnl AC_C_LONG_DOUBLE + + dnl ---- Checks for library functions. + + dnl AC_FUNC_ALLOCA + dnl AC_PROG_GCC_TRADITIONAL + dnl AC_TYPE_SIGNAL + dnl AC_FUNC_STRCOLL + dnl AC_FUNC_STRFTIME + dnl AC_FUNC_VPRINTF + dnl AC_FUNC_WAIT3 + dnl AC_CHECK_FUNCS(getcwd gettimeofday mkdir rmdir select socket strdup strerror strtod strtol sysinfo) + + AC_CHECK_FUNCS(setenv unsetenv getdomainname getpt cfmakeraw fstatat) + + dnl ---- Checks for libraries + + dnl AC_CHECK_LIB(m, main, echo) + dnl AC_CHECK_LIB(z, main, echo) + + GB_LIBC + + dnl ---- Check for C++ libraries + + AC_CHECK_LIB(gcc_s, main, CXX_LIB="$CXX_LIB -lgcc_s") + AC_CHECK_LIB(stdc++, main, CXX_LIB="$CXX_LIB -lstdc++") + + AC_SUBST(CXX_LIB) + + dnl ---- Check for shared library extension + + GB_SHARED_LIBRARY_EXT() + + dnl ---- Check for threading + + GB_THREAD() + + dnl ---- Check for mathematic libraries + + GB_MATH() + + dnl ---- Check for gettext library + + GB_GETTEXT() + + dnl ---- Check for inotify library + + GB_INOTIFY() + + dnl ---- Check for monotonic clock + + GB_MONOTONIC() + + dnl ---- Support for colorgcc + dnl ---- WARNING: libtool does not support colorgcc! + + dnl AC_PATH_PROG(COLORGCC, colorgcc) + + if test x"$COLORGCC" != x; then + if test "$gambas_colorgcc" = "yes"; then + CC="colorgcc" + CXX="g++" + fi + fi + + dnl ---- Support for ccache + + AC_ARG_ENABLE( + ccache, + [ --enable-ccache use ccache if present (default: yes)], + gambas_ccache=$enableval, + gambas_ccache=yes + ) + + AC_PATH_PROG(CCACHE, ccache) + + if test "$gambas_colorgcc" = "yes"; then + if test x"$CCACHE" != x; then + + CC="ccache $CC" + CXX="ccache $CXX" + + if test x"$COLORGCC" != x; then + if test "$gambas_colorgcc" = "yes"; then + CC="colorgcc" + CXX="colorgcc" + fi + fi + + fi + fi + + dnl ---- debug option + + AC_ARG_ENABLE( + debug, + [ --enable-debug compile for debugging (default: yes)], + gambas_debug=$enableval, + gambas_debug=yes + ) + + AM_CONDITIONAL(DEBUG, test "$gambas_debug" = yes) + + dnl ---- optimization option + + AC_ARG_ENABLE( + optimization, + [ --enable-optimization compile with optimizations (default: yes)], + gambas_optimization=$enableval, + gambas_optimization=yes + ) + + AM_CONDITIONAL(OPTIMIZE, test "$gambas_optimization" = yes) + + AM_CFLAGS="$AM_CFLAGS -pipe -Wall -Wno-unused-value -fsigned-char" + if test $SYSTEM = "MACOSX"; then + AM_CFLAGS="$AM_CFLAGS -fnested-functions" + fi + + AM_CXXFLAGS="$AM_CXXFLAGS -pipe -Wall -fno-exceptions -Wno-unused-value -fsigned-char" + + dnl ---- Check for gcc visibility flag + + have_gcc_visibility=no + + if test $SYSTEM != "CYGWIN"; then + GB_CFLAGS_GCC_OPTION([-fvisibility=hidden],, + [ + AM_CFLAGS="$AM_CFLAGS -fvisibility=hidden" + AM_CXXFLAGS="$AM_CXXFLAGS -fvisibility=hidden" + have_gcc_visibility=yes]) + fi + + if test "$have_gcc_visibility" = "yes"; then + AC_DEFINE(HAVE_GCC_VISIBILITY, 1, [Whether gcc supports -fvisibility=hidden]) + fi + + dnl ---- check for -flto compiler flag + + GB_CFLAGS_GCC_OPTION([-flto],, + [ + GB_CFLAGS_LTO=" -flto" + have_gcc_lto=yes + ]) + + AC_ARG_ENABLE( + lto, + [ --enable-lto enable link time optimization (default: no)], + gambas_lto=$enableval, + gambas_lto=no + ) + + if test "$gambas_lto" = "no"; then + have_gcc_lto=no; + GB_CFLAGS_LTO=""; + fi + + if test "$have_gcc_lto" = "yes"; then + AC_DEFINE(HAVE_GCC_LTO, 1, [Whether gcc supports -flto]) + fi + + dnl ---- check for -std=c++11 compiler flag + + GB_CXXFLAGS_GCC_OPTION([-std=c++11],, + [ + GB_CXXFLAGS_STD_CPP11=" -std=c++11" + have_gcc_std_cpp11x=yes + ]) + + if test "$have_gcc_std_cpp11" = "yes"; then + AC_DEFINE(HAVE_GCC_STD_CPP11, 1, [Whether g++ supports -std=c++11]) + fi + + dnl ---- Debug flags + + if test "$gambas_debug" = "yes"; then + AM_CFLAGS="$AM_CFLAGS -g -ggdb" + AM_CXXFLAGS="$AM_CXXFLAGS -g -ggdb" + fi + + dnl ---- Optimization flags + + if test "x$gambas_optimization" = "xyes"; then + AM_CFLAGS_OPT="$AM_CFLAGS -O3" + AM_CFLAGS="$AM_CFLAGS -Os" + AM_CXXFLAGS_OPT="$AM_CXXFLAGS -O3 -fno-omit-frame-pointer" + AM_CXXFLAGS="$AM_CXXFLAGS -Os -fno-omit-frame-pointer" + else + AM_CFLAGS_OPT="$AM_CFLAGS -O0" + AM_CFLAGS="$AM_CFLAGS -O0" + AM_CXXFLAGS_OPT="$AM_CXXFLAGS -O0" + AM_CXXFLAGS="$AM_CXXFLAGS -O0" + fi + + dnl ---- Checks for programs + + AC_PROG_CPP + AC_PROG_CXX + AC_PROG_CC + AC_PROG_MAKE_SET + + AC_SUBST(AM_CFLAGS) + AC_SUBST(AM_CFLAGS_OPT) + AC_SUBST(AM_CXXFLAGS) + AC_SUBST(AM_CXXFLAGS_OPT) + AC_SUBST(GB_CFLAGS_LTO) + AC_SUBST(GB_CXXFLAGS_STD_CPP11) + + rm -f DISABLED DISABLED.* FAILED +]) + + +## --------------------------------------------------------------------------- +## GB_THREAD +## Detect threading compiler options +## --------------------------------------------------------------------------- + +AC_DEFUN([GB_THREAD], +[ + case "${host}" in + *-*-freebsd* | *-*-netbsd* | *-*-darwin* ) + THREAD_LIB="" + THREAD_INC="-pthread -D_REENTRANT" + GBX_THREAD_LIB="" + GBX_THREAD_INC="-pthread -D_REENTRANT" + GBX_THREAD_LDFLAGS="" + ;; + *-*-haiku* ) + THREAD_LIB="" + THREAD_INC="" + GBX_THREAD_LIB="" + GBX_THREAD_INC="" + GBX_THREAD_LDFLAGS="" + ;; + *) + THREAD_LIB="-lpthread" + THREAD_INC="-D_REENTRANT" + GBX_THREAD_LIB="-lpthread" + GBX_THREAD_INC="-D_REENTRANT" + GBX_THREAD_LDFLAGS="-Wl,--no-as-needed" + ;; + esac + + AC_MSG_CHECKING(for threading compiler options) + AC_MSG_RESULT($THREAD_INC) + AC_MSG_CHECKING(for threading linker options) + AC_MSG_RESULT($THREAD_LIB) + + AC_SUBST(THREAD_LIB) + AC_SUBST(THREAD_INC) + AC_SUBST(GBX_THREAD_LIB) + AC_SUBST(GBX_THREAD_INC) + AC_SUBST(GBX_THREAD_LDFLAGS) +]) + + +## --------------------------------------------------------------------------- +## GB_LIBC +## Detect C library +## --------------------------------------------------------------------------- + +AC_DEFUN([GB_LIBC], +[ + case "${host}" in + *-*-haiku* ) + dnl Haiku has implicit C library in libroot. + C_LIB="" + ;; + *) + C_LIB="-lc" + ;; + esac + + AC_MSG_CHECKING(for C library) + AC_MSG_RESULT($C_LIB) + + AC_SUBST(C_LIB) +]) + + +## --------------------------------------------------------------------------- +## GB_MATH +## Detect mathematic libraries +## --------------------------------------------------------------------------- + +AC_DEFUN([GB_MATH], +[ + case "${host}" in + *-*-haiku* ) + MATH_LIB="" + ;; + *) + MATH_LIB="-lm" + ;; + esac + + AC_MSG_CHECKING(for mathematic libraries) + AC_MSG_RESULT($MATH_LIB) + + AC_SUBST(MATH_LIB) +]) + + +## --------------------------------------------------------------------------- +## GB_CHECK_MATH_FUNC +## Check a specific mathematical function +## +## $1 = name of the function +## $2 = macro to define +## --------------------------------------------------------------------------- + +AC_DEFUN([GB_CHECK_MATH_FUNC], +[AC_CACHE_CHECK(for $1, + gb_cv_math_$1, + [AC_TRY_COMPILE( + [ + #define _ISOC9X_SOURCE 1 + #define _ISOC99_SOURCE 1 + #define __USE_ISOC99 1 + #define __USE_ISOC9X 1 + #include + ], + [ + int value = $1 (1.0); + ], + gb_cv_math_$1=yes, gb_cv_math_$1=no + )]) + + if test $gb_cv_math_$1 = yes; then + AC_DEFINE(HAVE_$2, 1, [Define if you have $1 function.]) + fi +]) + +## --------------------------------------------------------------------------- +## GB_MATH_FUNC +## Detect which mathematical functions are available +## --------------------------------------------------------------------------- + +AC_DEFUN([GB_MATH_FUNC], +[ + ac_save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -$MATH_LIB" + + GB_CHECK_MATH_FUNC(exp10, EXP10) + GB_CHECK_MATH_FUNC(exp2, EXP2) + GB_CHECK_MATH_FUNC(log2, LOG2) + + LDFLAGS=$ac_save_LDFLAGS +]) + + +## --------------------------------------------------------------------------- +## GB_SYSTEM +## Detects the target system and its architecture +## --------------------------------------------------------------------------- + +AC_DEFUN([GB_SYSTEM], +[ + AC_MSG_CHECKING(target system) + + case "${host}" in + *-*-linux*-gnu* ) + SYSTEM=LINUX + AC_DEFINE(OS_GNU, 1, [Target system is of GNU family]) + AC_DEFINE(OS_LINUX, 1, [Target system is Linux]) + AC_DEFINE(SYSTEM, "Linux", [Operating system]) + ;; + *-*-linux* ) + SYSTEM=LINUX + AC_DEFINE(OS_LINUX, 1, [Target system is Linux]) + AC_DEFINE(SYSTEM, "Linux", [Operating system]) + ;; + *-*-freebsd* ) + SYSTEM=FREEBSD + AC_DEFINE(OS_BSD, 1, [Target system is of BSD family]) + AC_DEFINE(OS_FREEBSD, 1, [Target system is FreeBSD]) + AC_DEFINE(SYSTEM, "FreeBSD", [Operating system]) + ;; + *-*-netbsd* ) + SYSTEM=NETBSD + AC_DEFINE(OS_BSD, 1, [Target system is of BSD family]) + AC_DEFINE(OS_NETBSD, 1, [Target system is NetBSD]) + AC_DEFINE(SYSTEM, "NetBSD", [Operating system]) + ;; + *-*-openbsd* ) + SYSTEM=OPENBSD + AC_DEFINE(OS_BSD, 1, [Target system is of BSD family]) + AC_DEFINE(OS_OPENBSD, 1, [Target system is OpenBSD]) + AC_DEFINE(SYSTEM, "OpenBSD", [Operating system]) + ;; + *-*-cygwin* ) + SYSTEM=CYGWIN + AC_DEFINE(OS_CYGWIN, 1, [Target system is Cygwin/Windows]) + AC_DEFINE(SYSTEM, "Cygwin", [Operating system]) + ;; + *-*-darwin* | *-*-rhapsody* ) + SYSTEM=MACOSX + AC_DEFINE(OS_BSD, 1, [Target system is of BSD family]) + AC_DEFINE(OS_FREEBSD, 1, [Target system is FreeBSD]) + AC_DEFINE(OS_MACOSX, 1, [Target system is MacOS X]) + AC_DEFINE(SYSTEM, "MacOSX", [Operating system]) + ;; + *-*-solaris* ) + SYSTEM=SOLARIS + AC_DEFINE(OS_SOLARIS, 1, [Target system is Solaris]) + AC_DEFINE(SYSTEM, "Solaris", [Operating system]) + ;; + *-*-k*bsd*-gnu* ) + SYSTEM=KFREEBSD + AC_DEFINE(OS_BSD, 1, [Target system is of BSD family]) + AC_DEFINE(OS_GNU, 1, [Target system is of GNU family]) + AC_DEFINE(OS_KFREEBSD, 1, [Target system is kFREEBSD]) + AC_DEFINE(SYSTEM, "kFreeBSD", [Operating system]) + ;; + *-gnu* ) + SYSTEM=HURD + AC_DEFINE(OS_GNU, 1, [Target system is of GNU family]) + AC_DEFINE(OS_HURD, 1, [Target system is Hurd]) + AC_DEFINE(SYSTEM, "Hurd", [Operating system]) + ;; + *-*-haiku* ) + SYSTEM=HAIKU + dnl AC_DEFINE(OS_GNU, 1, [Target system is of GNU family]) + AC_DEFINE(OS_HAIKU, 1, [Target system is Haiku]) + AC_DEFINE(SYSTEM, "Haiku", [Operating system]) + ;; + * ) + SYSTEM=UNKNOWN + AC_DEFINE(SYSTEM, "unknown", [Operating system]) + GB_MESSAGE([System is unknown]) + ;; + esac + + AC_MSG_RESULT($SYSTEM) + + AC_MSG_CHECKING(target architecture) + + case "${host}" in + i*86-*-* ) + ARCH=X86 + AC_DEFINE(ARCH_X86, 1, [Target architecture is x86]) + AC_DEFINE(ARCHITECTURE, "x86", [Architecture]) + ;; + x86_64-*-* | amd64-* | ia64-* ) + ARCH=X86_64 + AC_DEFINE(ARCH_X86_64, 1, [Target architecture is x86_64]) + AC_DEFINE(ARCHITECTURE, "x86_64", [Architecture]) + ;; + arm*-*-* ) + ARCH=ARM + AC_DEFINE(ARCH_ARM, 1, [Target architecture is ARM]) + AC_DEFINE(ARCHITECTURE, "arm", [Architecture]) + ;; + powerpc*-*-* ) + ARCH=PPC + AC_DEFINE(ARCH_PPC, 1, [Target architecture is PowerPC]) + AC_DEFINE(ARCHITECTURE, "powerpc", [Architecture]) + ;; + *) + ARCH=UNKNOWN + AC_DEFINE(ARCHITECTURE, "unknown", [Architecture]) + GB_MESSAGE([Architecture is unknown]) + ;; + esac + + AC_MSG_RESULT($ARCH) +]) + + +## --------------------------------------------------------------------------- +## GB_SHARED_LIBRARY_EXT +## Detects shared library extension +## --------------------------------------------------------------------------- + +AC_DEFUN([GB_SHARED_LIBRARY_EXT], +[ + AC_MSG_CHECKING(which extension is used for shared libraries) + + case "${host}" in + *-*-cygwin* ) + SHLIBEXT="dll.a" + AC_DEFINE(SHARED_LIBRARY_EXT, "dll", [Shared library extension is '.dll.a']) + ;; + *-*-darwin* ) + SHLIBEXT="dylib" + AC_DEFINE(SHARED_LIBRARY_EXT, "dylib", [Shared library extension is '.dylib']) + ;; + *) + SHLIBEXT="so" + AC_DEFINE(SHARED_LIBRARY_EXT, "so", [Shared library extension is '.so']) + ;; + esac + + AC_SUBST(SHLIBEXT) + + AC_MSG_RESULT([.$SHLIBEXT]) +]) + + +## --------------------------------------------------------------------------- +## GB_GETTEXT +## Detects if we must link to an external gettext library +## --------------------------------------------------------------------------- + +AC_DEFUN([GB_GETTEXT], +[ + AC_MSG_CHECKING(for external gettext library) + + case "${host}" in + *-*-openbsd* ) + GETTEXT_LIB=-llibgettext + ;; + *) + GETTEXT_LIB= + ;; + esac + + AC_SUBST(GETTEXT_LIB) + AC_SUBST(GETTEXT_LDFLAGS) + + AC_MSG_RESULT($GETTEXT_LIB) +]) + + +## --------------------------------------------------------------------------- +## GB_INOTIFY +## Detects if we must link to an external inotify library +## --------------------------------------------------------------------------- + +AC_DEFUN([GB_INOTIFY], +[ + AC_MSG_CHECKING(for external inotify library) + + case "${host}" in + *-*-linux* ) + GB_INOTIFY_LIB= + ;; + *) + GB_INOTIFY_LIB=-linotify + ;; + esac + + AC_SUBST(GB_INOTIFY_LIB) + AC_MSG_RESULT($GB_INOTIFY_LIB) +]) + + +## --------------------------------------------------------------------------- +## GB_MONOTONIC +## Detect monotonic clock +## --------------------------------------------------------------------------- + +AC_DEFUN([GB_MONOTONIC], +[ + AC_CACHE_CHECK(for monotonic clock, gb_cv_monotonic_clock, + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include + #ifdef HAVE_UNISTD_H + #include + #endif + ]], [[ + #if !defined(_POSIX_MONOTONIC_CLOCK) || _POSIX_MONOTONIC_CLOCK < 0 || !defined(CLOCK_MONOTONIC) + #error Either _POSIX_MONOTONIC_CLOCK or CLOCK_MONOTONIC not defined + #endif + ]])],[ + gb_cv_monotonic_clock=yes + ],[ + gb_cv_monotonic_clock=no + ]) + ) + + if test "$gb_cv_monotonic_clock" = "yes"; then + + AC_DEFINE(HAVE_MONOTONIC_CLOCK,1,[Have a monotonic clock]) + + ac_save_LIBS="$LIBS" + AC_SEARCH_LIBS(clock_gettime, rt) + RT_LIB=$LIBS + LIBS=$ac_save_LIBS + + fi + + AC_SUBST(RT_LIB) + AC_SUBST(RT_LDFLAGS) +]) + + + + +## --------------------------------------------------------------------------- +## GB_FIND +## Find files in directories +## +## $1 = Files to search +## $2 = Directories +## $3 = Sub-directories patterns +## +## Returns a path list in $gb_val +## --------------------------------------------------------------------------- + +AC_DEFUN([GB_FIND], +[ +dnl echo "Searching $1, $2, $3" +gb_val="" +gb_save=`pwd` +gb_file_list="$1" + +gb_main_dir_list="$2" +gb_sub_dir_list="$3" + +gb_sub_dir_list_64=`echo "$gb_sub_dir_list" | sed s/"lib"/"lib64"/g` + +if test $SYSTEM == "HAIKU"; then + gb_arch="`getarch`" + gb_main_dir_list="$gb_main_dir_list `findpaths -c' ' -a "$gb_arch" B_FIND_PATH_DEVELOP_DIRECTORY`" + gb_arch_inc_subdir=headers + gb_arch_lib_subdir=lib + if test "$gb_arch" != "`getarch -p`"; then + gb_arch_inc_subdir="headers/$gb_arch" + gb_arch_lib_subdir="lib/$gb_arch" + fi + gb_sub_dir_list=`echo "$gb_sub_dir_list" | sed "s:include:$gb_arch_inc_subdir:g;s:lib:$gb_arch_lib_subdir:g"` +fi + +## if there is 'lib' inside sub-directories, then we decide to search "lib64" first. + +if test "$gb_sub_dir_list_64" != "$gb_sub_dir_list"; then + gb_sub_dir_list="$gb_sub_dir_list_64 $gb_sub_dir_list"; + + gb_main_dir_list_64=`echo "$gb_main_dir_list" | sed s/"lib"/"lib64"/g` + + if test "$gb_main_dir_list_64" != "$gb_main_dir_list"; then + gb_main_dir_list="$gb_main_dir_list_64 $gb_main_dir_list"; + fi + +fi + +for gb_main_dir in $gb_main_dir_list; do + dnl echo "search $gb_main_dir" + if test -d $gb_main_dir; then + cd $gb_main_dir + for gb_search_dir in $gb_sub_dir_list; do + for gb_dir in $gb_search_dir/ $gb_search_dir/*/ $gb_search_dir/*/*/ $gb_search_dir/*/*/*/; do + + dnl echo "search subdir $gb_dir" + gb_new_file_list="" + gb_find_dir="" + + for gb_file in $gb_file_list; do + + dnl echo "search file $gb_file" + gb_find=no + if test -r "$gb_main_dir/$gb_dir/$gb_file" || test -d "$gb_main_dir/$gb_dir/$gb_file"; then + + ifelse($4,[], + + gb_find=yes, + + for gb_test in $4; do + gb_output=`ls -la $gb_main_dir/$gb_dir/$gb_file | grep "$gb_test"` + if test "x$gb_output" != "x"; then + gb_find=yes + fi + done + ) + + fi + + if test "$gb_find" = "yes"; then + dnl echo "FOUND!" + if test "x$gb_find_dir" = "x"; then + if test "x$gb_val" = "x"; then + gb_val="$gb_main_dir/$gb_dir" + else + gb_val="$gb_val $gb_main_dir/$gb_dir" + fi + fi + gb_find_dir=yes + else + gb_new_file_list="$gb_new_file_list $gb_file" + fi + + done + + gb_file_list=$gb_new_file_list + + if test "x$gb_file_list" = "x " || test "x$gb_file_list" = "x"; then + break 3 + fi + + done + done + fi +done + +if test "x$gb_file_list" != "x " && test "x$gb_file_list" != "x"; then + gb_val=no +fi + +cd $gb_save +]) + + +## --------------------------------------------------------------------------- +## GB_COMPONENT_PKG_CONFIG +## Component detection macro based on pkg-config +## +## $1 = Component key in lower case (ex: pgsql) +## $2 = Component key in upper case (ex: PGSQL) +## $3 = Component name (ex: gb.db.postgresql) +## $4 = Sub-directory name +## $5 = pkg-config module(s) name(s) with optional required version(s) +## $6 = Warning message (optional) +## +## => defines HAVE_*_COMPONENT (to know if you can compile the component) +## *_INC (for the compiler) and *_LIB / *_LDFLAGS (for the linker) +## --------------------------------------------------------------------------- + +AC_DEFUN([GB_COMPONENT_PKG_CONFIG], +[ + AC_ARG_ENABLE( + $1, + [ --enable-$1 enable $3 (default: yes)], + gb_enable_$1=$enableval, + gb_enable_$1=yes + ) + + dnl AC_ARG_WITH($1-includes, + dnl [ --with-$1-includes where the $3 headers are located. ], + dnl [ gb_inc_$1="$withval" ]) + + dnl AC_ARG_WITH($1-libraries, + dnl [ --with-$1-libraries where the $3 libraries are located. ], + dnl [ gb_lib_$1="$withval" ]) + + have_$1=no + + if test "$gb_enable_$1" = "yes" && test ! -e DISABLED && test ! -e DISABLED.$3; then + + AC_MSG_CHECKING(for $3 component with pkg-config) + + gb_inc_$1="" + gb_lib_$1="" + gb_ldflags_$1="" + have_$1=yes + gb_testval="" + + pkg-config --silence-errors --exists $5 + if test $? -eq "0"; then + + ## Checking for headers + + $2_INC="`pkg-config --cflags $5`" + + ## Checking for libraries + + $2_LIB="`pkg-config --libs-only-l $5`" + $2_LDFLAGS="`pkg-config --libs-only-L $5` `pkg-config --libs-only-other $5`" + $2_DIR=$4 + + else + + have_$1=no + + fi + + fi + + if test "$have_$1" = "no"; then + + if test "$gb_in_component_search" != "yes"; then + touch DISABLED.$3 + if test "$gb_enable_$1" = "yes"; then + touch FAILED + fi + fi + + if test "$gb_enable_$1" = "yes"; then + AC_MSG_RESULT(no) + fi + + for pkgcmp in $5 + do + + pkg-config --silence-errors --exists $pkgcmp + if test $? -eq "1"; then + GB_WARNING([Unable to met pkg-config requirement: $pkgcmp]) + fi + + done + + else + + AC_DEFINE(HAVE_$2_COMPONENT, 1, [Have $3 component]) + + AC_MSG_RESULT(OK) + + fi + + if test "$have_$1" = "no"; then + + $2_INC="" + $2_LIB="" + $2_LDFLAGS="" + $2_DIR="" + if test "$gb_in_component_search" != "yes"; then + if test x"$6" = x; then + GB_WARNING([$3 is disabled]) + else + GB_WARNING([$6]) + fi + fi + + fi + + AC_SUBST($2_INC) + AC_SUBST($2_LIB) + AC_SUBST($2_LDFLAGS) + AC_SUBST($2_DIR) +]) + + +## --------------------------------------------------------------------------- +## GB_COMPONENT +## Component detection macro that searches for files +## +## $1 = Component key in lower case (ex: postgresql) +## $2 = Component key in upper case (ex: POSTGRESQL) +## $3 = Component name (ex: gb.db.postgresql) +## $4 = Sub-directory name +## $5 = How to get include path (must return it in gb_val) +## $6 = How to get library path (must return it in gb_val) +## $7 = Libraries +## $8 = Compiler flags (optional) +## $9 = Warning message (optional) +## +## => defines HAVE_*_COMPONENT (to know if you can compile the component) +## *_INC (for the compiler) and *_LIB (for the linker) +## --------------------------------------------------------------------------- + +AC_DEFUN([GB_COMPONENT], +[ + AC_ARG_ENABLE( + $1, + [ --enable-$1 enable $3 (default: yes)], + gb_enable_$1=$enableval, + gb_enable_$1=yes + ) + + gb_inc_$1=no + gb_lib_$1=no + + if test "$gb_enable_$1" = "yes" && test ! -e DISABLED && test ! -e DISABLED.$3; then + + ## Checking for headers + + AC_MSG_CHECKING(for $3 headers) + + AC_ARG_WITH($1-includes, + [ --with-$1-includes where the $3 headers are located. ], + [ gb_inc_$1="$withval" ]) + + AC_CACHE_VAL(gb_cv_header_$1, [ + + if test "$gb_inc_$1" = no; then + gb_val="" + $5 + gb_inc_$1=$gb_val + fi + + gb_cv_header_$1=$gb_inc_$1 + ]) + + AC_MSG_RESULT([$gb_cv_header_$1]) + + if test "$gb_cv_header_$1" = "no"; then + for gb_result in $gb_file_list; do + GB_WARNING([Unable to find file: $gb_result]) + done + fi + + $2_INC="" + + for gb_dir in $gb_cv_header_$1; do + if test "$gb_dir" != "/usr/include"; then + if test "$gb_dir" != "/usr/include/"; then + $2_INC="$$2_INC -I$gb_dir" + fi + fi + done + + if test "x$8" != "x"; then + $2_INC="$$2_INC $8" + fi + + if test "$gb_cv_header_$1" = no; then + have_inc_$1="no" + $2_INC="" + else + have_inc_$1="yes" + fi + + ## Checking for libraries + + AC_MSG_CHECKING(for $3 libraries) + + AC_ARG_WITH($1-libraries, + [ --with-$1-libraries where the $3 libraries are located. ], + [ gb_lib_$1="$withval" ]) + + AC_CACHE_VAL(gb_cv_lib_$1, [ + + if test "$gb_lib_$1" = no; then + gb_val="" + $6 + gb_lib_$1=$gb_val + fi + + gb_cv_lib_$1=$gb_lib_$1 + ]) + + if test "$gb_cv_lib_$1" = no; then + have_lib_$1="no" + else + have_lib_$1="yes" + fi + + AC_MSG_RESULT([$gb_cv_lib_$1]) + + if test "$gb_cv_lib_$1" = "no"; then + for gb_result in $gb_file_list; do + GB_WARNING([Unable to find file: $gb_result]) + done + fi + + $2_LIB="" + $2_LDFLAGS="" + $2_PATH="" + + for gb_dir in $gb_cv_lib_$1; do + if test "x$$2_PATH" = "x"; then + $2_PATH="$gb_dir/.." + fi + if test "$gb_dir" != "/lib" && test "$gb_dir" != "/lib/"&& test "$gb_dir" != "/usr/lib" && test "$gb_dir" != "/usr/lib/"; then + $2_LDFLAGS="$$2_LDFLAGS -L$gb_dir"; + fi + done + + $2_LIB="$$2_LIB $7" + + fi + + if test "$have_inc_$1" = "yes" && test "$have_lib_$1" = "yes"; then + + have_$1=yes + $2_DIR=$4 + AC_DEFINE(HAVE_$2_COMPONENT, 1, Have $3) + + else + + have_$1=no + touch DISABLED.$3 + if test "$gb_enable_$1" = "yes"; then + touch FAILED + fi + + fi + + if test "$have_$1" = "no"; then + + $2_INC="" + $2_LIB="" + $2_DIR="" + $2_LDFLAGS="" + if test x"$9" = x; then + GB_WARNING([$3 is disabled]) + else + GB_WARNING([$9]) + fi + + fi + + AC_SUBST($2_INC) + AC_SUBST($2_LIB) + AC_SUBST($2_LDFLAGS) + AC_SUBST($2_DIR) + AC_SUBST($2_PATH) + +]) + + +## --------------------------------------------------------------------------- +## GB_COMPONENT_SEARCH +## Component detection macro that uses GB_COMPONENT_PKG_CONFIG first, and +## then GB_COMPONENT. +## +## $1 = Component key in lower case (ex: postgresql) +## $2 = Component key in upper case (ex: POSTGRESQL) +## $3 = Component name (ex: PostgreSQL) +## $4 = Sub-directory name +## $5 = pkg-config module name (optional) +## $6 = How to get include path (must return it in gb_val) +## $7 = How to get library path (must return it in gb_val) +## $8 = Libraries +## $9 = Compiler flags (optional) +## $10 = Warning message (optional) +## +## => defines HAVE_*_COMPONENT (to know if you can compile the component) +## *_INC (for the compiler) and *_LIB (for the linker) +## --------------------------------------------------------------------------- + +AC_DEFUN([GB_COMPONENT_SEARCH], +[ +gb_in_component_search=yes + GB_COMPONENT_PKG_CONFIG( + $1, + $2, + $3, + $4, + $5, + $10 + ) +gb_in_component_search=no + if test -z "${$2_LIB}"; then + GB_COMPONENT( + $1, + $2, + $3, + $4, + $6, + $7, + $8, + $9, + $10 + ) + fi +]) + + +## --------------------------------------------------------------------------- +## GB_COMPONENT_SEARCH_BOTH +## Component detection macro that uses GB_COMPONENT_PKG_CONFIG and +## GB_COMPONENT. both having to succeed +## +## $1 = Component key in lower case (ex: postgresql) +## $2 = Component key in upper case (ex: POSTGRESQL) +## $3 = Component name (ex: gb.db.postgresql) +## $4 = Sub-directory name +## $5 = pkg-config module name (optional) +## $6 = How to get include path (must return it in gb_val) +## $7 = How to get library path (must return it in gb_val) +## $8 = Libraries +## $9 = Compiler flags (optional) +## $10 = Warning message (optional) +## +## => defines HAVE_*_COMPONENT (to know if you can compile the component) +## *_INC (for the compiler) and *_LIB (for the linker) +## --------------------------------------------------------------------------- + +AC_DEFUN([GB_COMPONENT_SEARCH_BOTH], +[ + GB_COMPONENT_PKG_CONFIG( + $1, + $2, + $3, + $4, + $5, + $10 + ) + if test ! -e DISABLED.$3; then + GB_COMPONENT( + $1, + $2, + $3, + $4, + $6, + $7, + $8, + $9, + $10 + ) + fi +]) + + +## --------------------------------------------------------------------------- +## GB_FIND_QT_MOC +## Find QT moc compiler +## +## $1 = QT version +## $2 = components to disable +## +## Returns a path list in $gb_val +## --------------------------------------------------------------------------- + +AC_DEFUN([GB_FIND_QT_MOC], +[ + gb_path_qt_moc=no + if test x$1 = x; then + gb_qt_version=3 + else + gb_qt_version=$1 + fi + + AC_ARG_WITH(moc, + [ --with-moc The path to the QT moc compiler. ], + [ gb_path_qt_moc="$withval" ]) + + AC_MSG_CHECKING(for QT meta-object compiler) + + AC_CACHE_VAL(gb_cv_path_qt_moc, [ + + gb_val="" + if test "$gb_path_qt_moc" = no; then + + for gb_dir in $QTDIR /usr/lib/qt$gb_qt_version /usr/lib/qt/$gb_qt_version /usr/local/lib/qt$gb_qt_version /usr/local/lib/qt/$gb_qt_version /usr/local/qt$gb_qt_version /usr/local/qt/$gb_qt_version /usr/share/qt$gb_qt_version /usr/qt/$gb_qt_version /usr/pkg/qt$gb_qt_version /usr/pkg /usr; do + + gb_dir=$gb_dir/bin + + if test -r "$gb_dir/moc"; then + if test "x`$gb_dir/moc -v 2>&1 | grep " $gb_qt_version\."`" != x; then + gb_val=$gb_dir/moc + break + fi + fi + + done + + gb_path_qt_moc=$gb_val + fi + + gb_cv_path_qt_moc=$gb_path_qt_moc + ]) + + AC_MSG_RESULT([$gb_cv_path_qt_moc]) + + if test x"$gb_cv_path_qt_moc" = x; then + GB_WARNING([QT moc compiler not found. Try --with-moc option.]) + MOC="" + touch DISABLED + else + MOC=$gb_cv_path_qt_moc + fi + + AC_SUBST(MOC) +]) + +## --------------------------------------------------------------------------- +## GB_CHECK_XWINDOW +## Check the X-Window system installation +## +## $1 = components to disable +## --------------------------------------------------------------------------- + +AC_DEFUN([GB_CHECK_XWINDOW], +[ + AC_PATH_XTRA + + if test x"$have_x" = xyes; then + if test -z `echo $X_LIBS | grep "\-lX11"`; then + X_LIBS="$X_LIBS -lX11" + fi + if test -z `echo $X_LIBS | grep "\-lXext"`; then + X_LIBS="$X_LIBS -lXext" + fi + X_LIBS="$X_PRE_LIBS $X_LIBS" + else + touch DISABLED + fi + +]) + +## --------------------------------------------------------------------------- +## Some macros +## --------------------------------------------------------------------------- + +dnl Like AC_CHECK_HEADER, but it uses the already-computed -I directories. + +AC_DEFUN([AC_CHECK_X_HEADER], [ + ac_save_CPPFLAGS="$CPPFLAGS" + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + AC_CHECK_HEADER([$1],[$2],[$3]) + CPPFLAGS="$ac_save_CPPFLAGS" +]) + +dnl Like AC_CHECK_LIB, but it used the -L dirs set up by the X checks. + +AC_DEFUN([AC_CHECK_X_LIB], [ + ac_save_CPPFLAGS="$CPPFLAGS" + ac_save_LDFLAGS="$LDFLAGS" + + if test \! -z "$includedir" ; then + CPPFLAGS="$CPPFLAGS -I$includedir" + fi + + dnl note: $X_CFLAGS includes $x_includes + CPPFLAGS="$CPPFLAGS $X_CFLAGS" + + if test \! -z "$libdir" ; then + LDFLAGS="$LDFLAGS -L$libdir" + fi + + dnl note: $X_LIBS includes $x_libraries + + LDFLAGS="$LDFLAGS $X_LIBS" + AC_CHECK_LIB([$1], [$2], [$3], [$4], [$5]) + CPPFLAGS="$ac_save_CPPFLAGS" + LDFLAGS="$ac_save_LDFLAGS"] +) + +dnl Check if it is possible to turn off run time type information (RTTI) +AC_DEFUN([AC_PROG_CXX_FNO_RTTI], +[AC_CACHE_CHECK(whether ${CXX-g++} accepts -fno-rtti, ac_cv_prog_cxx_fno_rtti, +[echo 'void f(){}' > conftest.cc +if test -z "`${CXX-g++} -fno-rtti -c conftest.cc 2>&1`"; then + ac_cv_prog_cxx_fno_rtti=yes + CXXFLAGS="${CXXFLAGS} -fno-rtti" +else + ac_cv_prog_cxx_fno_rtti=no +fi +rm -f conftest* +])]) + +dnl Check if the type socklen_t is defined anywhere +AC_DEFUN([AC_C_SOCKLEN_T], +[AC_CACHE_CHECK(for socklen_t, ac_cv_c_socklen_t, +[ AC_TRY_COMPILE([ +#include +#include +],[ +socklen_t foo; +],[ + ac_cv_c_socklen_t=yes +],[ + ac_cv_c_socklen_t=no + AC_DEFINE(socklen_t,int) +])])]) + +dnl Check for sys_errlist[] and sys_nerr, check for declaration +dnl Check nicked from aclocal.m4 from GNU bash 2.01 +AC_DEFUN([AC_SYS_ERRLIST], +[AC_MSG_CHECKING([for sys_errlist and sys_nerr]) +AC_CACHE_VAL(ac_cv_sys_errlist, +[AC_TRY_LINK([#include ], +[extern char *sys_errlist[]; + extern int sys_nerr; + char *msg = sys_errlist[sys_nerr - 1];], + ac_cv_sys_errlist=yes, ac_cv_sys_errlist=no)])dnl +AC_MSG_RESULT($ac_cv_sys_errlist) +if test $ac_cv_sys_errlist = yes; then +AC_DEFINE(HAVE_SYS_ERRLIST) +fi +]) + +dnl @synopsis AX_CFLAGS_GCC_OPTION (optionflag [,[shellvar][,[A][,[NA]]]) +dnl +dnl AX_CFLAGS_GCC_OPTION(-fvomit-frame) would show a message as like +dnl "checking CFLAGS for gcc -fvomit-frame ... yes" and adds the +dnl optionflag to CFLAGS if it is understood. You can override the +dnl shellvar-default of CFLAGS of course. The order of arguments stems +dnl from the explicit macros like AX_CFLAGS_WARN_ALL. +dnl +dnl The cousin AX_CXXFLAGS_GCC_OPTION would check for an option to add +dnl to CXXFLAGS - and it uses the autoconf setup for C++ instead of C +dnl (since it is possible to use different compilers for C and C++). +dnl +dnl The macro is a lot simpler than any special AX_CFLAGS_* macro (or +dnl ac_cxx_rtti.m4 macro) but allows to check for arbitrary options. +dnl However, if you use this macro in a few places, it would be great +dnl if you would make up a new function-macro and submit it to the +dnl ac-archive. +dnl +dnl - $1 option-to-check-for : required ("-option" as non-value) +dnl - $2 shell-variable-to-add-to : CFLAGS (or CXXFLAGS in the other case) +dnl - $3 action-if-found : add value to shellvariable +dnl - $4 action-if-not-found : nothing +dnl +dnl note: in earlier versions, $1-$2 were swapped. We try to detect the +dnl situation and accept a $2=~/-/ as being the old +dnl option-to-check-for. +dnl +dnl also: there are other variants that emerged from the original macro +dnl variant which did just test an option to be possibly added. +dnl However, some compilers accept an option silently, or possibly for +dnl just another option that was not intended. Therefore, we have to do +dnl a generic test for a compiler family. For gcc we check "-pedantic" +dnl being accepted which is also understood by compilers who just want +dnl to be compatible with gcc even when not being made from gcc +dnl sources. +dnl +dnl see also: +dnl +dnl AX_CFLAGS_SUN_OPTION AX_CFLAGS_HPUX_OPTION +dnl AX_CFLAGS_AIX_OPTION AX_CFLAGS_IRIX_OPTION +dnl +dnl @category C +dnl @author Guido Draheim +dnl @version 2003-11-04 +dnl @license GPLWithACException + +AC_DEFUN([AX_CFLAGS_GCC_OPTION_OLD], [dnl +AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl +AS_VAR_PUSHDEF([VAR],[ac_cv_cflags_gcc_option_$2])dnl +AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for gcc m4_ifval($2,$2,-option)], +VAR,[VAR="no, unknown" + AC_LANG_SAVE + AC_LANG_C + ac_save_[]FLAGS="$[]FLAGS" +for ac_arg dnl +in "-pedantic % m4_ifval($2,$2,-option)" dnl GCC + # +do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + AC_TRY_COMPILE([],[return 0;], + [VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break]) +done + FLAGS="$ac_save_[]FLAGS" + AC_LANG_RESTORE +]) +case ".$VAR" in + .ok|.ok,*) m4_ifvaln($3,$3) ;; + .|.no|.no,*) m4_ifvaln($4,$4) ;; + *) m4_ifvaln($3,$3,[ + if echo " $[]m4_ifval($1,$1,FLAGS) " | grep " $VAR " 2>&1 >/dev/null + then AC_RUN_LOG([: m4_ifval($1,$1,FLAGS) does contain $VAR]) + else AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"]) + m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR" + fi ]) ;; +esac +AS_VAR_POPDEF([VAR])dnl +AS_VAR_POPDEF([FLAGS])dnl +]) + + +dnl the only difference - the LANG selection... and the default FLAGS + +AC_DEFUN([AX_CXXFLAGS_GCC_OPTION_OLD], [dnl +AS_VAR_PUSHDEF([FLAGS],[CXXFLAGS])dnl +AS_VAR_PUSHDEF([VAR],[ac_cv_cxxflags_gcc_option_$2])dnl +AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for gcc m4_ifval($2,$2,-option)], +VAR,[VAR="no, unknown" + AC_LANG_SAVE + AC_LANG_CXX + ac_save_[]FLAGS="$[]FLAGS" +for ac_arg dnl +in "-pedantic % m4_ifval($2,$2,-option)" dnl GCC + # +do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + AC_TRY_COMPILE([],[return 0;], + [VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break]) +done + FLAGS="$ac_save_[]FLAGS" + AC_LANG_RESTORE +]) +case ".$VAR" in + .ok|.ok,*) m4_ifvaln($3,$3) ;; + .|.no|.no,*) m4_ifvaln($4,$4) ;; + *) m4_ifvaln($3,$3,[ + if echo " $[]m4_ifval($1,$1,FLAGS) " | grep " $VAR " 2>&1 >/dev/null + then AC_RUN_LOG([: m4_ifval($1,$1,FLAGS) does contain $VAR]) + else AC_RUN_LOG([: m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR"]) + m4_ifval($1,$1,FLAGS)="$m4_ifval($1,$1,FLAGS) $VAR" + fi ]) ;; +esac +AS_VAR_POPDEF([VAR])dnl +AS_VAR_POPDEF([FLAGS])dnl +]) + +dnl ------------------------------------------------------------------------- + +AC_DEFUN([AX_CFLAGS_GCC_OPTION_NEW], [dnl +AS_VAR_PUSHDEF([FLAGS],[CFLAGS])dnl +AS_VAR_PUSHDEF([VAR],[ac_cv_cflags_gcc_option_$1])dnl +AC_CACHE_CHECK([m4_ifval($2,$2,FLAGS) for gcc m4_ifval($1,$1,-option)], +VAR,[VAR="no, unknown" + AC_LANG_SAVE + AC_LANG_C + ac_save_[]FLAGS="$[]FLAGS" +for ac_arg dnl +in "-pedantic % m4_ifval($1,$1,-option)" dnl GCC + # +do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + AC_TRY_COMPILE([],[return 0;], + [VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break]) +done + FLAGS="$ac_save_[]FLAGS" + AC_LANG_RESTORE +]) +case ".$VAR" in + .ok|.ok,*) m4_ifvaln($3,$3) ;; + .|.no|.no,*) m4_ifvaln($4,$4) ;; + *) m4_ifvaln($3,$3,[ + if echo " $[]m4_ifval($2,$2,FLAGS) " | grep " $VAR " 2>&1 >/dev/null + then AC_RUN_LOG([: m4_ifval($2,$2,FLAGS) does contain $VAR]) + else AC_RUN_LOG([: m4_ifval($2,$2,FLAGS)="$m4_ifval($2,$2,FLAGS) $VAR"]) + m4_ifval($2,$2,FLAGS)="$m4_ifval($2,$2,FLAGS) $VAR" + fi ]) ;; +esac +AS_VAR_POPDEF([VAR])dnl +AS_VAR_POPDEF([FLAGS])dnl +]) + + +dnl the only difference - the LANG selection... and the default FLAGS + +AC_DEFUN([AX_CXXFLAGS_GCC_OPTION_NEW], [dnl +AS_VAR_PUSHDEF([FLAGS],[CXXFLAGS])dnl +AS_VAR_PUSHDEF([VAR],[ac_cv_cxxflags_gcc_option_$1])dnl +AC_CACHE_CHECK([m4_ifval($2,$2,FLAGS) for gcc m4_ifval($1,$1,-option)], +VAR,[VAR="no, unknown" + AC_LANG_SAVE + AC_LANG_CXX + ac_save_[]FLAGS="$[]FLAGS" +for ac_arg dnl +in "-pedantic % m4_ifval($1,$1,-option)" dnl GCC + # +do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` + AC_TRY_COMPILE([],[return 0;], + [VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break]) +done + FLAGS="$ac_save_[]FLAGS" + AC_LANG_RESTORE +]) +case ".$VAR" in + .ok|.ok,*) m4_ifvaln($3,$3) ;; + .|.no|.no,*) m4_ifvaln($4,$4) ;; + *) m4_ifvaln($3,$3,[ + if echo " $[]m4_ifval($2,$2,FLAGS) " | grep " $VAR " 2>&1 >/dev/null + then AC_RUN_LOG([: m4_ifval($2,$2,FLAGS) does contain $VAR]) + else AC_RUN_LOG([: m4_ifval($2,$2,FLAGS)="$m4_ifval($2,$2,FLAGS) $VAR"]) + m4_ifval($2,$2,FLAGS)="$m4_ifval($2,$2,FLAGS) $VAR" + fi ]) ;; +esac +AS_VAR_POPDEF([VAR])dnl +AS_VAR_POPDEF([FLAGS])dnl +]) + +AC_DEFUN([AX_CFLAGS_GCC_OPTION],[ifelse(m4_bregexp([$2],[-]),-1, +[AX_CFLAGS_GCC_OPTION_NEW($@)],[AX_CFLAGS_GCC_OPTION_OLD($@)])]) + +AC_DEFUN([AX_CXXFLAGS_GCC_OPTION],[ifelse(m4_bregexp([$2],[-]),-1, +[AX_CXXFLAGS_GCC_OPTION_NEW($@)],[AX_CXXFLAGS_GCC_OPTION_OLD($@)])]) + + diff --git a/app/AUTHORS b/app/AUTHORS new file mode 100644 index 00000000..e69de29b diff --git a/app/COPYING b/app/COPYING new file mode 120000 index 00000000..012065c8 --- /dev/null +++ b/app/COPYING @@ -0,0 +1 @@ +../COPYING \ No newline at end of file diff --git a/app/ChangeLog b/app/ChangeLog new file mode 100644 index 00000000..e69de29b diff --git a/app/INSTALL b/app/INSTALL new file mode 100644 index 00000000..64d33306 --- /dev/null +++ b/app/INSTALL @@ -0,0 +1,231 @@ + +REQUIREMENTS +============ + +Read the IMPORTANT NOTES in the README file. + + +Basic Installation +================== + + These are generic installation instructions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, a file +`config.cache' that saves the results of its tests to speed up +reconfiguring, and a file `config.log' containing compiler output +(useful mainly for debugging `configure'). + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If at some point `config.cache' +contains results you don't want to keep, you may remove or edit it. + + The file `configure.in' is used to create `configure' by a program +called `autoconf'. You only need `configure.in' if you want to change +it or regenerate `configure' using a newer version of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes awhile. While running, it prints some + messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. You can give `configure' +initial values for variables by setting them in the environment. Using +a Bourne-compatible shell, you can do that on the command line like +this: + CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure + +Or on systems that have the `env' program, you can do it like this: + env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure + + +Installation Names +================== + + By default, `make install' will install the package's files in +`/usr/local/bin', `/usr/local/man', etc. You can specify an +installation prefix other than `/usr/local' by giving `configure' the +option `--prefix=PATH'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. +Documentation and other data files will still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=PATH' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + + +Optional Features +================= + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + + +Specifying the System Type +========================== + + There may be some features `configure' can not figure out +automatically, but needs to determine by the type of host the package +will run on. Usually `configure' can figure that out, but if it prints +a message saying it can not guess the host type, give it the +`--host=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name with three fields: + CPU-COMPANY-SYSTEM + +See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the host type. + + If you are building compiler tools for cross-compiling, you can also +use the `--target=TYPE' option to select the type of system they will +produce code for and the `--build=TYPE' option to select the type of +system on which you are compiling the package. + + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + + +Operation Controls +================== + + `configure' recognizes the following options to control how it +operates. + +`--cache-file=FILE' + Use and save the results of the tests in FILE instead of + `./config.cache'. Set FILE to `/dev/null' to disable caching, for + debugging `configure'. + +`--help' + Print a summary of the options to `configure', and exit. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--version' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`configure' also accepts some other, not widely useful, options. + + +Gambas Options +============== + + --with-intl-includes where the internationalization headers are located. + --with-intl-libraries where the internationalization libraries are located. + --with-qt-includes where the QT component headers are located. + --with-qt-libraries where the QT component libraries are located. + --with-kde-includes where the KDE 3.x component headers are located. + --with-kde-libraries where the KDE 3.x component libraries are located. + --with-net-includes where the Networking component headers are located. + --with-net-libraries where the Networking component libraries are located. + --with-postgresql-includes where the PostgreSQL driver headers are located. + --with-postgresql-libraries where the PostgreSQL driver libraries are located. + --with-mysql-includes where the MySQL driver headers are located. + --with-mysql-libraries where the MySQL driver libraries are located. + --with-sdl-includes where the SDL component headers are located. + --with-sdl-libraries where the SDL component libraries are located. + +--disable-debug Remove debug information from binary files. + +--enable-optimization Enable optimization during compilation. + +--disable-preloading Disable the preloading of components. + +--disable-qt-component Do not compile the QT component. + + +Component options +================= + +XXX is a component or library name: + + intl internationalization library + kde KDE component + mysql MySQL driver + net Network component + postgresql PostgreSQL driver + qt QT component + sdl SDL component + +--with-XXX-libraries Where the libraries are located. + +--with-XXX-includes Where the headers are located. + +Use these options if the configure script cannot detect the +location of librairies and/or headers. + +The components or libraries that are not detected are automatically disables, +and then not compiled. + +That's all ! Good luck... diff --git a/app/Makefile.am b/app/Makefile.am new file mode 100644 index 00000000..8efc547f --- /dev/null +++ b/app/Makefile.am @@ -0,0 +1,66 @@ +EXTRA_DIST = reconf src spec mime desktop template +SUBDIRS = . man + +install-exec-local: + @if test "x$(ROOT)" != "x"; then \ + echo "[Installing with ROOT=$(ROOT)]"; \ + fi + @if test "x$(DESTDIR)" != "x"; then \ + echo "[Installing with DESTDIR=$(DESTDIR)]"; \ + ROOT=$DESTDIR; \ + fi + + @echo "Installing the development environment..." + @(cd $(srcdir)/src; d=`pwd`; \ + for p in `cat INSTALL`; do \ + echo "Compiling $$p..."; cd $$d/$$p; \ + $(DESTDIR)$(bindir)/gbc$(GAMBAS_VERSION) -agt -r $(DESTDIR)$(prefix); \ + if test $$? -eq 0; then \ + $(DESTDIR)$(bindir)/gba$(GAMBAS_VERSION); \ + rm -rf .gambas; \ + echo "Installing $$p..."; \ + $(INSTALL) $$p.gambas $(DESTDIR)$(bindir); \ + else \ + echo "|| Unable to compile $$p" >> ../../../warnings.log; \ + fi \ + done) + ##@if test "$(bindir)" != "$(ROOT)/usr/bin" && test "$(bindir)" != "$(ROOT)/usr/bin/"; then + @$(LN_S) -f gambas$(GAMBAS_VERSION).gambas $(DESTDIR)$(bindir)/gambas$(GAMBAS_VERSION) || true + + @echo "Installing the scripter..." + @$(LN_S) -f gbs$(GAMBAS_VERSION).gambas $(DESTDIR)$(bindir)/gbs$(GAMBAS_VERSION) || true + @$(LN_S) -f gbs$(GAMBAS_VERSION).gambas $(DESTDIR)$(bindir)/gbw$(GAMBAS_VERSION) || true + @if test x"$(XDG_UTILS)" != x; then \ + $(INSTALL) -d $(DESTDIR)$(gbdatadir)/icons; \ + cp -f $(srcdir)/mime/application-x-gambas*.png $(DESTDIR)$(gbdatadir)/icons; \ + echo "Registering Gambas script mimetype..."; \ + xdg-icon-resource install --context mimetypes --size 256 $(DESTDIR)$(gbdatadir)/icons/application-x-gambasscript.png application-x-gambasscript; \ + xdg-mime install $(srcdir)/mime/application-x-gambasscript.xml; \ + echo "Registering Gambas server page mimetype..."; \ + xdg-icon-resource install --context mimetypes --size 256 $(DESTDIR)$(gbdatadir)/icons/application-x-gambasserverpage.png application-x-gambasserverpage; \ + xdg-mime install $(srcdir)/mime/application-x-gambasserverpage.xml; \ + fi + + @echo "Installing the Gambas appdata file..." + @$(INSTALL) -d $(DESTDIR)$(datarootdir)/appdata; + @$(INSTALL) $(srcdir)/desktop/gambas3.appdata.xml $(DESTDIR)$(datarootdir)/appdata; + @$(INSTALL) -d $(DESTDIR)$(datarootdir)/metainfo; + @$(INSTALL) $(srcdir)/desktop/gambas3.appdata.xml $(DESTDIR)$(datarootdir)/metainfo; + + @echo "Installing the Gambas template projects..." + @$(INSTALL) -d $(DESTDIR)$(gbdatadir)/template; + @cp -R $(srcdir)/template/* $(DESTDIR)$(gbdatadir)/template; + +uninstall-local: + @rm -f $(DESTDIR)$(bindir)/gambas$(GAMBAS_VERSION) + @rm -f $(DESTDIR)$(bindir)/gbs$(GAMBAS_VERSION) + @rm -f $(DESTDIR)$(bindir)/gbw$(GAMBAS_VERSION) + @(cd $(srcdir)/src; for p in `cat INSTALL`; do rm -f $(DESTDIR)$(bindir)/$$p.gambas; done) + @rm -rf $(DESTDIR)$(datarootdir)/metainfo/gambas3.appdata.xml + @rm -rf $(DESTDIR)$(datarootdir)/appdata/gambas3.appdata.xml + @rm -rf $(DESTDIR)$(gbdatadir)/template + +dist-hook: + @(cd $(distdir)/src; \ + rm -rf `find . -name ".gambas" -o -name ".action" -o -name ".lock" -o -name ".xvpics" -o -name "*~" -o -name "*.out" -o -name "*.pot" -o -name "*.gambas" -o -name "core*" -o -name ".kdbg*" -o -name ".svn"`;) + diff --git a/app/NEWS b/app/NEWS new file mode 100644 index 00000000..e69de29b diff --git a/app/README b/app/README new file mode 100644 index 00000000..e69de29b diff --git a/app/TODO b/app/TODO new file mode 100644 index 00000000..e69de29b diff --git a/app/acinclude.m4 b/app/acinclude.m4 new file mode 120000 index 00000000..d84c32a3 --- /dev/null +++ b/app/acinclude.m4 @@ -0,0 +1 @@ +../acinclude.m4 \ No newline at end of file diff --git a/app/configure.ac b/app/configure.ac new file mode 100644 index 00000000..c11c0cec --- /dev/null +++ b/app/configure.ac @@ -0,0 +1,20 @@ +dnl ---- configure.ac for Gambas development environment + +dnl ---- Initialization + +m4_include([../version.m4]) +AC_INIT(gambas3-ide, GB_VERSION, GB_MAIL, [], GB_URL) +GB_INIT_SHORT(ide) + +dnl ---- Check for Portland scripts + +AC_CHECK_PROGS(XDG_UTILS, [xdg-mime xdg-icon-resource], []) + +dnl ---- Create makefiles + +AC_OUTPUT( \ +Makefile \ +man/Makefile \ +) + +GB_PRINT_MESSAGES diff --git a/app/desktop/gambas3.appdata.xml b/app/desktop/gambas3.appdata.xml new file mode 100644 index 00000000..cedb2b68 --- /dev/null +++ b/app/desktop/gambas3.appdata.xml @@ -0,0 +1,31 @@ + + + gambas3.desktop + CC0-1.0 + GPL-2.0+ + IDE for the Gambas language + +

Gambas is a free development environment and a full powerful development platform based on a Basic interpreter with object extensions, as easy as Visual Basic. This application provides a graphical IDE, with a database manager, an image editor, and a report designer, to assist in the creation of programs with Gambas.

+
+ + + http://gambas.sourceforge.net/2014-07-26.png + The Gambas 3 development environment + + + Benoît Minisini + g4mba5@gmail.com + gambas3.desktop + http://gambas.sourceforge.net/ + http://gambaswiki.org/bugtracker + http://gambas.sourceforge.net/ + http://gambas.sourceforge.net/ + + basic + interpreter + visual + graphical + object language + development environment + +
diff --git a/app/desktop/gambas3.desktop b/app/desktop/gambas3.desktop new file mode 100644 index 00000000..73daa0bc --- /dev/null +++ b/app/desktop/gambas3.desktop @@ -0,0 +1,14 @@ +[Desktop Entry] +Name=Gambas3 +Exec=gambas3 +GenericName=Gambas 3 IDE +GenericName[fr]=EDI Gambas 3 +GenericName[ru]=Gambas 3 IDE(ИСР) +Comment=Gambas3 Integrated Development Environment +Comment[fr]=Environnement de développement intégré Gambas 3 +Comment[ru]=Gambas 3 IDE(ИСР) - альтернатива для Visual Basic +Icon=gambas3 +Terminal=false +Type=Application +Categories=Development;IDE; +StartupNotify=true diff --git a/app/desktop/gambas3.png b/app/desktop/gambas3.png new file mode 100644 index 0000000000000000000000000000000000000000..c988a0a166b59daca0df236f6dc2b0c23a308547 GIT binary patch literal 3144 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 i-N7B)!5#b`;(q`SGc0E->M#NT0000 + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Gambas 3 + 15/09/2008 + + + Fabien Bodard + + + + + Common Creative + + + + + Fabien Bodard + + + gbFBodard150908 + http://gambas.sf.net + + + gambas3 logo basic shrimp + + + A pretty shrimp, a malicious new gambas logo... we got the power ! + + + Fabien Bodard + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/examples/Basic/Blights/.directory b/app/examples/Basic/Blights/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/app/examples/Basic/Blights/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/app/examples/Basic/Blights/.icon.png b/app/examples/Basic/Blights/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0c1982e11033bafde2fa4e869e77992384b3512e GIT binary patch literal 4209 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 Hu0mjfPqr0Z literal 0 HcmV?d00001 diff --git a/app/examples/Basic/Blights/.lang/ca.po b/app/examples/Basic/Blights/.lang/ca.po new file mode 100644 index 00000000..05b8bc79 --- /dev/null +++ b/app/examples/Basic/Blights/.lang/ca.po @@ -0,0 +1,28 @@ +# Catalan translation of Blights +# Copyright (C) 2000-2010 Benoît Minisini. +# This file is distributed under the same license as the Blights package. +# Jordi Sayol , 2007-2010. +# +# +msgid "" +msgstr "" +"Project-Id-Version: Blights\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2010-12-16 23:31+0100\n" +"Last-Translator: Jordi Sayol \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: win1.form:16 +msgid "Blinkenlights" +msgstr "Llums perpallejants" + +#: .project:1 +msgid "Blinking lights example" +msgstr "Enemple del Llums perpallejants" + diff --git a/app/examples/Basic/Blights/.lang/cs.po b/app/examples/Basic/Blights/.lang/cs.po new file mode 100644 index 00000000..dd532b12 --- /dev/null +++ b/app/examples/Basic/Blights/.lang/cs.po @@ -0,0 +1,20 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Blinking lights example" +msgstr "Příklad blikajícíh světel" + +#: win1.form:16 +msgid "Blinkenlights" +msgstr "Blikající světla" diff --git a/app/examples/Basic/Blights/.lang/de.po b/app/examples/Basic/Blights/.lang/de.po new file mode 100644 index 00000000..de41ad66 --- /dev/null +++ b/app/examples/Basic/Blights/.lang/de.po @@ -0,0 +1,21 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Blinking lights example" +msgstr "Beispiel für blinkende Lichter" + +#: win1.form:16 +msgid "Blinkenlights" +msgstr "blinkende Lichter" + diff --git a/app/examples/Basic/Blights/.lang/es.po b/app/examples/Basic/Blights/.lang/es.po new file mode 100644 index 00000000..7445bc3c --- /dev/null +++ b/app/examples/Basic/Blights/.lang/es.po @@ -0,0 +1,20 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2014-11-11 23:48 UTC\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Blinking lights example" +msgstr "Ejemplo de luces parpadeantes" + +#: win1.form:16 +msgid "Blinkenlights" +msgstr "Luces parpadeantes" diff --git a/app/examples/Basic/Blights/.lang/fr.po b/app/examples/Basic/Blights/.lang/fr.po new file mode 100644 index 00000000..0ce4e3df --- /dev/null +++ b/app/examples/Basic/Blights/.lang/fr.po @@ -0,0 +1,3 @@ +#: win1.class:54 +msgid "Blinkenlights" +msgstr "" diff --git a/app/examples/Basic/Blights/.lang/nl.po b/app/examples/Basic/Blights/.lang/nl.po new file mode 100644 index 00000000..60cc291d --- /dev/null +++ b/app/examples/Basic/Blights/.lang/nl.po @@ -0,0 +1,20 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2014-09-23 01:15+0100\n" +"Last-Translator: Willy Raets \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Blinking lights example" +msgstr "Blinking lights voorbeeld" + +#: win1.form:16 +msgid "Blinkenlights" +msgstr "Blinkenlights" + diff --git a/app/examples/Basic/Blights/.lang/ru.po b/app/examples/Basic/Blights/.lang/ru.po new file mode 100644 index 00000000..0701404c --- /dev/null +++ b/app/examples/Basic/Blights/.lang/ru.po @@ -0,0 +1,34 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Basic/Blights/.project:17 +msgid "Blinking lights example" +msgstr "Пример мигающих огней" + +#: app/examples/Basic/Blights/.src/win1.form:5 +msgid "Blinkenlights" +msgstr "Мигающие огни" + diff --git a/app/examples/Basic/Blights/.lang/sv.po b/app/examples/Basic/Blights/.lang/sv.po new file mode 100644 index 00000000..ba0558c1 --- /dev/null +++ b/app/examples/Basic/Blights/.lang/sv.po @@ -0,0 +1,15 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: win1.class:54 +msgid "Blinkenlights" +msgstr "Blinkande lampor" diff --git a/app/examples/Basic/Blights/.project b/app/examples/Basic/Blights/.project new file mode 100644 index 00000000..c9afd747 --- /dev/null +++ b/app/examples/Basic/Blights/.project @@ -0,0 +1,16 @@ +# Gambas Project File 3.0 +Title=Blinking lights example +Startup=win1 +Icon=ampoule.png +Version=3.11.90 +VersionFile=1 +Component=gb.image +Component=gb.gui +TabSize=2 +Translate=1 +Language=fr +Maintainer=benoit +Vendor=Princeton +Address=benoit@localhost +License=General Public Licence +Packager=1 diff --git a/app/examples/Basic/Blights/.src/win1.class b/app/examples/Basic/Blights/.src/win1.class new file mode 100644 index 00000000..910404ca --- /dev/null +++ b/app/examples/Basic/Blights/.src/win1.class @@ -0,0 +1,36 @@ +' Gambas class file + + +Public Sub Timer1_Timer() + + Dim diode As PictureBox + Dim l As Integer + + For Each diode In [l1, l2, l3, l4, l5, l6, l7, l8] + l = Rnd() * 2 + If l = 0 Then + diode.Picture = Picture["bloff.xpm"] + Else + diode.Picture = Picture["blon.xpm"] + Endif + Next + +End + + + +Public Sub Form_Open() + + Dim hPict As Picture + Dim diode As PictureBox + + hPict = Picture["blon.xpm"] + + For Each diode In [l1, l2, l3, l4, l5, l6, l7, l8] + diode.Resize(hPict.Width, hPict.Height) + diode.Background = Color.DarkGreen + Next + + Me.Resize(hPict.W * 8 + Me.W - Me.ClientW, hPict.H + Me.H - Me.ClientH) + +End diff --git a/app/examples/Basic/Blights/.src/win1.form b/app/examples/Basic/Blights/.src/win1.form new file mode 100644 index 00000000..2a3bcfa5 --- /dev/null +++ b/app/examples/Basic/Blights/.src/win1.form @@ -0,0 +1,53 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(20,29.5714,65,7) + Text = ("Blinkenlights") + Icon = Picture["blon.xpm"] + Resizable = False + Arrangement = Arrange.Horizontal + { l1 PictureBox + MoveScaled(0,0,7,7) + Picture = Picture["bloff.xpm"] + Alignment = Align.Center + } + { l2 PictureBox + MoveScaled(7,0,7,7) + Picture = Picture["bloff.xpm"] + Alignment = Align.Center + } + { l3 PictureBox + MoveScaled(14,0,7,7) + Picture = Picture["bloff.xpm"] + Alignment = Align.Center + } + { l4 PictureBox + MoveScaled(21,0,7,7) + Picture = Picture["bloff.xpm"] + Alignment = Align.Center + } + { l5 PictureBox + MoveScaled(28,0,7,7) + Picture = Picture["bloff.xpm"] + Alignment = Align.Center + } + { l6 PictureBox + MoveScaled(35,0,7,7) + Picture = Picture["bloff.xpm"] + Alignment = Align.Center + } + { l7 PictureBox + MoveScaled(42,0,7,7) + Picture = Picture["bloff.xpm"] + Alignment = Align.Center + } + { l8 PictureBox + MoveScaled(49,0,7,7) + Picture = Picture["blon.xpm"] + Alignment = Align.Center + } + { Timer1 #Timer + Enabled = True + Delay = 200 + } +} diff --git a/app/examples/Basic/Blights/ampoule.png b/app/examples/Basic/Blights/ampoule.png new file mode 100644 index 0000000000000000000000000000000000000000..169097084b60f2331cd91695f23bc6d8f92d9650 GIT binary patch literal 1543 zcmV+i2Kf1jP)2L`6zl35iHZ2t*%1s1;SI z+7c>0BDF73gqjB)nyBKTO-YIfML2Z}PD&D+&4s4___JTPekD2&o&;CgOOL(@BV6c|3hCx?$``+7l;s8I@ku#c!pih^RM%- zlbSfaRJGl2?R`G+#(zX$^2nzSh3?z@>%p%)joR~RP&b26!L@uhq4E*9<(6qKra$J! zsh_a8l>5%U7Z#2K&OH;j`tk!KN@U%+?O#8P-1!g$1^^q}YNI=OsLa-%-C(6moS8Gf zWa7r+!{0ob{)>0WG6AWbNMy-8}vn;RBVH zHQ<&SzfQ@^KvUF>wXWc}t^#xdffWhlO3wAZvH`{OU|t7x2S}l1@wvr1A(m>wZVL|J zlowgZT80lUuc(2uljeKh-tZA_WfwvzKy?A6Fh~(kw|7cVE9ENpi3s8>rFi?2Io-Uu zC4pyN%ilVhb&U zi#-zPjUwd0${_7bS%>Qeuoh-`^=$4BKncjRESR>9$UgAW?LSV>mEN%8*T8LVFvYfw z$IFy}zylz4Ve3iWJ^#=5e|5HW9Wa2U`V2_z=~H<2wc?RmbIG`yne#|Ac(Kk4fDLjd zsDlvP22uxhT4&+f`^hJdrGF1(fux^-J1Jc0GLnFv=N=2~fA+D^(csY5Fd@H*Dg7Wt zJwOovx#w;rq!T1#XOmz2LHyXP?xcWe;O{;W=U%Vl0I=Z~hqNc2KB)bifqn?7{-!X5 zc6zP4Ss#fBQrAY4!#~U%`&f4}z$`EYq-ynF%Y#G%HoyK<_ry4SWvxho64)4ox4o-Cs~|Wgzjyk>YX7Mt<~j#&@kg6-AR! zGzqzU4oT`mXrF=1MN*gEUKP9{*n4@B`FiLAwq}n-F5Q-F0-A)P36zi^pb2km!tc&m z?;QAP;my^+*YqazO+Iz%l%;7JrfE_r6v*Xr7=}SMn?+SsB9RFBe4g>~@!yP&j{X>! zZx{JmN>DSqyStl_kr6D*BAd+;kH@)kj$vVZ@65{U#CE?ltu(%GvWDy@!t zH){aLaj-0lN~LnwKFhK+pqHk{$0sIG4{qBw)oK;XvS==&ZQB8$gSuO2=_ zGiMM&kj-XEr_;>M&7tc$(P)$tCr*$^B-RwnnlccJ#STtQP0fZvA!J!b2!X1qsH#dh z9AUZ>6GCwF=1r!jr-{X4OiWC0^5jV_U%rfC81wmj z{w7f59z?jN5&$_()683T^vV84US37Vmji_cld-m-4(#Xijk1WgTG) c #5A301D", +", c #64331B", +"' c #65341B", +") c #6C341C", +"! c #6C321A", +"~ c #6B371D", +"{ c #68361F", +"] c #6D371C", +"^ c #73381D", +"/ c #79381D", +"( c #813C1A", +"_ c #753B1C", +": c #713A1D", +"< c #6E371D", +"[ c #6F391E", +"} c #7E3D19", +"| c #7B3E1C", +"1 c #6E371C", +"2 c #68351F", +"3 c #60311E", +"4 c #4E2C1C", +"5 c #4A2B1D", +"6 c #502D1C", +"7 c #582D1D", +"8 c #63301D", +"9 c #78391C", +"0 c #7A391A", +"a c #763619", +"b c #773A1B", +"c c #76391A", +"d c #76381A", +"e c #77381B", +"f c #773A1C", +"g c #733719", +"h c #743A1A", +"i c #76381B", +"j c #6F3719", +"k c #72391A", +"l c #73381A", +"m c #743619", +"n c #743518", +"o c #743517", +"p c #723719", +"q c #77391B", +"r c #6F3418", +"s c #68321D", +"t c #552D1B", +"u c #4F2C1B", +"v c #502C1B", +"w c #512D1B", +"x c #5B2F1B", +"y c #5F301B", +"z c #66361E", +"A c #6D381C", +"B c #6F391B", +"C c #6D381B", +"D c #6D351B", +"E c #743C1C", +"F c #753C1D", +"G c #823C1A", +"H c #793C1B", +"I c #793B1C", +"J c #773C1C", +"K c #783D1B", +"L c #86461C", +"M c #793E1C", +"N c #793F1C", +"O c #833D1A", +"P c #7A3C1C", +"Q c #77391C", +"R c #70381C", +"S c #66351B", +"T c #6B341B", +"U c #68351B", +"V c #67361C", +"W c #613119", +"X c #643119", +"Y c #63341B", +"Z c #60301A", +"` c #64311A", +" . c #65321A", +".. c #6A371C", +"+. c #61321A", +"@. c #5F301D", +"#. c #61331F", +"$. c #5E331D", +"%. c #5C321D", +"&. c #592F1E", +"*. c #62311B", +"=. c #693119", +"-. c #713519", +";. c #75381A", +">. c #69351E", +",. c #6D381D", +"'. c #62341D", +"). c #60331D", +"!. c #5D301C", +"~. c #5B311C", +"{. c #5C2F1B", +"]. c #62311C", +"^. c #6B361E", +"/. c #6C351A", +"(. c #6B351A", +"_. c #6E351A", +":. c #74381B", +"<. c #7B3B1B", +"[. c #7E3918", +"}. c #833D18", +"|. c #773B1B", +"1. c #713A1C", +"2. c #6C381D", +"3. c #69341B", +"4. c #6C371E", +"5. c #6C361E", +"6. c #6C351E", +"7. c #73391D", +"8. c #77381D", +"9. c #81401B", +"0. c #88451B", +"a. c #80411B", +"b. c #723A1B", +"c. c #703A1D", +"d. c #6A371E", +"e. c #68351D", +"f. c #65341E", +"g. c #6C341D", +"h. c #70351C", +"i. c #6F371F", +"j. c #6E3720", +"k. c #6F371A", +"l. c #6C341A", +"m. c #6B381C", +"n. c #6B391C", +"o. c #68341A", +"p. c #67321A", +"q. c #622D18", +"r. c #612C19", +"s. c #612D19", +"t. c #612E1A", +"u. c #64331C", +"v. c #66361F", +"w. c #6B3720", +"x. c #6F351E", +"y. c #76371A", +"z. c #6F371D", +"A. c #65351E", +"B. c #63321C", +"C. c #6A321A", +"D. c #6C351B", +"E. c #6C361C", +"F. c #6C341B", +"G. c #63341D", +"H. c #66351D", +"I. c #6E361A", +"J. c #72361A", +"K. c #773B1A", +"L. c #733A1B", +"M. c #6B351B", +"N. c #6E381C", +"O. c #743A1C", +"P. c #7A3F1C", +"Q. c #793B1A", +"R. c #72381B", +"S. c #71391B", +"T. c #6B391D", +"U. c #6D371B", +"V. c #6B351C", +"W. c #6A3A1E", +"X. c #6B381D", +"Y. c #6A381E", +"Z. c #6E391C", +"`. c #70361A", +" + c #73351A", +".+ c #6B341C", +"++ c #69341D", +"@+ c #64341D", +"#+ c #62321C", +"$+ c #65351C", +"%+ c #62341C", +"&+ c #57301D", +"*+ c #562E1C", +"=+ c #592E1E", +"-+ c #5C321E", +";+ c #582E1D", +">+ c #572E1E", +",+ c #572E1D", +"'+ c #562E1E", +")+ c #55301E", +"!+ c #5B341E", +"~+ c #5F341E", +"{+ c #61341E", +"]+ c #6A361F", +"^+ c #65331D", +"/+ c #69361E", +"(+ c #60321A", +"_+ c #60321B", +":+ c #5E341C", +"<+ c #6A361E", +"[+ c #6A331D", +"}+ c #70371C", +"|+ c #6B361C", +"1+ c #6C371C", +"2+ c #763B1A", +"3+ c #743C1D", +"4+ c #6F3B1E", +"5+ c #713B1D", +"6+ c #703C1E", +"7+ c #6F3A1D", +"8+ c #6B371B", +"9+ c #69371D", +"0+ c #71371A", +"a+ c #7D3C1B", +"b+ c #803B19", +"c+ c #853D18", +"d+ c #83411A", +"e+ c #803F1A", +"f+ c #7C3D1A", +"g+ c #773A19", +"h+ c #733B1C", +"i+ c #6C391C", +"j+ c #78391B", +"k+ c #7E3A19", +"l+ c #813A18", +"m+ c #7C3A1A", +"n+ c #7E3B1A", +"o+ c #7C3B1A", +"p+ c #71371B", +"q+ c #6D361B", +"r+ c #733B1E", +"s+ c #71381D", +"t+ c #6F351B", +"u+ c #6C351C", +"v+ c #69351B", +"w+ c #69351A", +"x+ c #6A3419", +"y+ c #6B341A", +"z+ c #6F361B", +"A+ c #6E311A", +"B+ c #6F341B", +"C+ c #6C351F", +"D+ c #69331A", +"E+ c #68321A", +"F+ c #5D301A", +"G+ c #5E301B", +"H+ c #64341B", +"I+ c #66321B", +"J+ c #5F311B", +"K+ c #5C301B", +"L+ c #67341C", +"M+ c #672F1B", +"N+ c #66341C", +"O+ c #6C361D", +"P+ c #6E381D", +"Q+ c #733C1C", +"R+ c #6B381E", +"S+ c #67351D", +"T+ c #6A361B", +"U+ c #71391C", +"V+ c #71381C", +"W+ c #763B1C", +"X+ c #61341C", +"Y+ c #58311C", +"Z+ c #532D1B", +"`+ c #533323", +" @ c #513729", +".@ c #503A2D", +"+@ c #4F392C", +"@@ c #4F3627", +"#@ c #50301F", +"$@ c #552E1B", +"%@ c #60331B", +"&@ c #6A341A", +"*@ c #68331B", +"=@ c #70361B", +"-@ c #74381A", +";@ c #723819", +">@ c #743719", +",@ c #75371A", +"'@ c #73371A", +")@ c #6E371B", +"!@ c #6F381C", +"~@ c #71371C", +"{@ c #70371A", +"]@ c #71381B", +"^@ c #6F381A", +"/@ c #69341A", +"(@ c #64321A", +"_@ c #65301A", +":@ c #6A331B", +"<@ c #5E2F1B", +"[@ c #8A3F17", +"}@ c #883E17", +"|@ c #813B18", +"1@ c #7B3818", +"2@ c #783919", +"3@ c #743A1B", +"4@ c #73391A", +"5@ c #6F371B", +"6@ c #733B1B", +"7@ c #72391B", +"8@ c #733A1C", +"9@ c #73391B", +"0@ c #75381C", +"a@ c #6D3A1C", +"b@ c #6F381B", +"c@ c #5F321C", +"d@ c #3F281D", +"e@ c #40342F", +"f@ c #4F4B49", +"g@ c #5E5E5E", +"h@ c #6B6B6B", +"i@ c #757575", +"j@ c #7B7B7B", +"k@ c #787878", +"l@ c #6F6F6F", +"m@ c #646464", +"n@ c #565554", +"o@ c #48413D", +"p@ c #3C2C25", +"q@ c #4A2B1C", +"r@ c #66321A", +"s@ c #68321B", +"t@ c #6C361B", +"u@ c #723B1B", +"v@ c #783C1A", +"w@ c #7E3C1A", +"x@ c #7F3E1A", +"y@ c #853E19", +"z@ c #854019", +"A@ c #894219", +"B@ c #843E18", +"C@ c #823D18", +"D@ c #803D18", +"E@ c #7C3818", +"F@ c #823C17", +"G@ c #823E18", +"H@ c #6A381C", +"I@ c #64341C", +"J@ c #6F3519", +"K@ c #793919", +"L@ c #853F18", +"M@ c #8C4419", +"N@ c #8C4217", +"O@ c #8A4017", +"P@ c #853C17", +"Q@ c #813A17", +"R@ c #7D3C19", +"S@ c #763718", +"T@ c #743819", +"U@ c #793D1B", +"V@ c #69341C", +"W@ c #6B371E", +"X@ c #733B1D", +"Y@ c #743B1B", +"Z@ c #68371E", +"`@ c #3A2921", +" # c #353433", +".# c #5B5A5A", +"+# c #6D6D6D", +"@# c #767676", +"## c #7F7F7F", +"$# c #858585", +"%# c #8B8B8B", +"&# c #8F8F8F", +"*# c #8D8D8D", +"=# c #878787", +"-# c #808080", +";# c #7A7A7A", +"># c #707070", +",# c #666666", +"'# c #484746", +")# c #2C2724", +"!# c #4F2E1E", +"~# c #6C3519", +"{# c #6F3619", +"]# c #763919", +"^# c #773819", +"/# c #7E3C19", +"(# c #7E3B19", +"_# c #77391A", +":# c #6F381D", +"<# c #6B361B", +"[# c #69361A", +"}# c #66341B", +"|# c #64351C", +"1# c #65331A", +"2# c #5F341C", +"3# c #58321D", +"4# c #592E1B", +"5# c #5D311B", +"6# c #703A1B", +"7# c #80421B", +"8# c #82401A", +"9# c #8B4017", +"0# c #873E17", +"a# c #833E18", +"b# c #7D3A18", +"c# c #773718", +"d# c #753719", +"e# c #502E1D", +"f# c #272727", +"g# c #444444", +"h# c #646363", +"i# c #696969", +"j# c #7C7C7C", +"k# c #818181", +"l# c #868686", +"m# c #888888", +"n# c #828282", +"o# c #7E7E7E", +"p# c #717171", +"q# c #5A5A5A", +"r# c #333333", +"s# c #372821", +"t# c #60301B", +"u# c #61321B", +"v# c #66341E", +"w# c #5F321D", +"x# c #62331D", +"y# c #65341C", +"z# c #6C3518", +"A# c #6D361C", +"B# c #6C351D", +"C# c #6D3319", +"D# c #70391B", +"E# c #83421C", +"F# c #833F1A", +"G# c #7C3B1B", +"H# c #763819", +"I# c #68361C", +"J# c #5C321C", +"K# c #592D1A", +"L# c #5D2F1A", +"M# c #63311A", +"N# c #64351B", +"O# c #6A341B", +"P# c #71361A", +"Q# c #763A1A", +"R# c #7B3A19", +"S# c #7A3919", +"T# c #7E3A17", +"U# c #482D1F", +"V# c #2A2A2A", +"W# c #484848", +"X# c #5F5F5F", +"Y# c #6C6C6C", +"Z# c #727272", +"`# c #797979", +" $ c #7D7D7D", +".$ c #747474", +"+$ c #6E6E6E", +"@$ c #686868", +"#$ c #616161", +"$$ c #535353", +"%$ c #373737", +"&$ c #312824", +"*$ c #6A351C", +"=$ c #6E361C", +"-$ c #72381A", +";$ c #70371B", +">$ c #6F361C", +",$ c #703619", +"'$ c #6E381E", +")$ c #6B391E", +"!$ c #6E361B", +"~$ c #733819", +"{$ c #743618", +"]$ c #78381A", +"^$ c #793819", +"/$ c #7F3D18", +"($ c #7F3C18", +"_$ c #864019", +":$ c #853F19", +"<$ c #803D1A", +"[$ c #7D3F1C", +"}$ c #713B1C", +"|$ c #6C381C", +"1$ c #60321C", +"2$ c #5C2E1A", +"3$ c #5C2F1A", +"4$ c #613019", +"5$ c #6E3519", +"6$ c #813E19", +"7$ c #873F18", +"8$ c #432C20", +"9$ c #282828", +"0$ c #414141", +"a$ c #504F4F", +"b$ c #555555", +"c$ c #5D5D5D", +"d$ c #6A6A6A", +"e$ c #777777", +"f$ c #585858", +"g$ c #525151", +"h$ c #4A4949", +"i$ c #2F2F2F", +"j$ c #2D2724", +"k$ c #7E3718", +"l$ c #753519", +"m$ c #7B3C1B", +"n$ c #783418", +"o$ c #773418", +"p$ c #773A1A", +"q$ c #6F3A1C", +"r$ c #6C3A1D", +"s$ c #6E381B", +"t$ c #6D3419", +"u$ c #66351C", +"v$ c #5F351E", +"w$ c #512F1E", +"x$ c #4B2A1B", +"y$ c #4F2B1C", +"z$ c #532D1C", +"A$ c #5E321D", +"B$ c #3E2D22", +"C$ c #252525", +"D$ c #323232", +"E$ c #464545", +"F$ c #4D4D4D", +"G$ c #545454", +"H$ c #5C5C5C", +"I$ c #636363", +"J$ c #737373", +"K$ c #656565", +"L$ c #565656", +"M$ c #4F4F4F", +"N$ c #494949", +"O$ c #3F3E3E", +"P$ c #2F2824", +"Q$ c #6F3B1D", +"R$ c #813F1B", +"S$ c #7F3C1A", +"T$ c #7B3B19", +"U$ c #783A19", +"V$ c #733919", +"W$ c #6D351A", +"X$ c #68371D", +"Y$ c #67361E", +"Z$ c #69361D", +"`$ c #6E391D", +" % c #81431B", +".% c #81441C", +"+% c #7B3F1B", +"@% c #703C1D", +"#% c #703C1C", +"$% c #6D361A", +"%% c #72371A", +"&% c #763B1B", +"*% c #7A3B1A", +"=% c #813D19", +"-% c #883F18", +";% c #56331F", +">% c #272726", +",% c #383838", +"'% c #4B4B4B", +")% c #5B5B5B", +"!% c #626262", +"~% c #4E4E4E", +"{% c #464646", +"]% c #3F3F3F", +"^% c #2C2C2C", +"/% c #362923", +"(% c #5D311C", +"_% c #5B321D", +":% c #582D1A", +"<% c #542B1A", +"[% c #532B1B", +"}% c #502B1C", +"|% c #552D1C", +"1% c #572E1B", +"2% c #783E1C", +"3% c #7C3E1A", +"4% c #7E3B1B", +"5% c #79381B", +"6% c #7F3C1B", +"7% c #843C18", +"8% c #833D17", +"9% c #833C17", +"0% c #823A17", +"a% c #7F3D19", +"b% c #823E1A", +"c% c #803D19", +"d% c #853F1A", +"e% c #863E17", +"f% c #863D18", +"g% c #2A2725", +"h% c #262625", +"i% c #292929", +"j% c #4A4A4A", +"k% c #676767", +"l% c #454545", +"m% c #3C3C3C", +"n% c #303030", +"o% c #4C2D1F", +"p% c #74371A", +"q% c #753A1C", +"r% c #7A3E1C", +"s% c #7E3D1B", +"t% c #894119", +"u% c #914518", +"v% c #954417", +"w% c #8C461B", +"x% c #61351E", +"y% c #63331C", +"z% c #67351B", +"A% c #763C1B", +"B% c #793E1B", +"C% c #7D421B", +"D% c #5F311C", +"E% c #542D1C", +"F% c #332722", +"G% c #262626", +"H% c #252524", +"I% c #404040", +"J% c #3B3B3B", +"K% c #272625", +"L% c #753517", +"M% c #723618", +"N% c #6B3318", +"O% c #663018", +"P% c #673018", +"Q% c #652E19", +"R% c #632F19", +"S% c #633019", +"T% c #592F1A", +"U% c #5A311B", +"V% c #5D341D", +"W% c #5E351D", +"X% c #8F3F17", +"Y% c #874018", +"Z% c #803C19", +"`% c #823C19", +" & c #833E19", +".& c #863E18", +"+& c #8C4117", +"@& c #8B3F17", +"#& c #893E17", +"$& c #61301A", +"%& c #4F2C1C", +"&& c #353535", +"*& c #606060", +"=& c #595959", +"-& c #3A3A3A", +";& c #2E2E2E", +">& c #452C20", +",& c #7D3718", +"'& c #7D3918", +")& c #853B17", +"!& c #843B17", +"~& c #843E19", +"{& c #833F19", +"]& c #873E16", +"^& c #8A3E17", +"/& c #6F3A1B", +"(& c #783A1A", +"_& c #783B1B", +":& c #753819", +"<& c #7E3B18", +"[& c #813C17", +"}& c #7E3917", +"|& c #7D3B1A", +"1& c #4B2E20", +"2& c #2B2B2B", +"3& c #343434", +"4& c #505050", +"5& c #575757", +"6& c #525252", +"7& c #4C4C4C", +"8& c #393939", +"9& c #68341B", +"0& c #65331B", +"a& c #65361C", +"b& c #67361D", +"c& c #68381D", +"d& c #693A1E", +"e& c #6A391E", +"f& c #6A3921", +"g& c #6D391D", +"h& c #68351E", +"i& c #68351C", +"j& c #69381C", +"k& c #723619", +"l& c #773818", +"m& c #793918", +"n& c #302824", +"o& c #2D2D2D", +"p& c #515151", +"q& c #424242", +"r& c #472C1F", +"s& c #562C1A", +"t& c #562E1B", +"u& c #5C311C", +"v& c #5A311C", +"w& c #592F1B", +"x& c #58301C", +"y& c #5E341D", +"z& c #65361D", +"A& c #673821", +"B& c #6E371A", +"C& c #6F361A", +"D& c #70351B", +"E& c #6E3419", +"F& c #3E3E3E", +"G& c #474747", +"H& c #382921", +"I& c #6C371A", +"J& c #6B3419", +"K& c #693419", +"L& c #6A361A", +"M& c #6A351B", +"N& c #6A361C", +"O& c #6E3A1B", +"P& c #71351A", +"Q& c #6D361D", +"R& c #70351A", +"S& c #753B1A", +"T& c #52311F", +"U& c #3D3D3D", +"V& c #65311B", +"W& c #6A361D", +"X& c #753A1B", +"Y& c #6E3A1D", +"Z& c #70391C", +"`& c #6F371C", +" * c #6C371D", +".* c #6D361E", +"+* c #783F1D", +"@* c #402C22", +"#* c #2B2624", +"$* c #67331C", +"%* c #6F391C", +"&* c #6D3A1E", +"** c #75391A", +"=* c #853D17", +"-* c #7D3D1B", +";* c #723E1D", +">* c #703B1C", +",* c #70381B", +"'* c #66361C", +")* c #382A23", +"!* c #434343", +"~* c #313131", +"{* c #2B2725", +"]* c #75391B", +"^* c #70381A", +"/* c #7C401C", +"(* c #7F421B", +"_* c #874119", +":* c #6A371B", +"<* c #6C391D", +"[* c #793D1A", +"}* c #783D1C", +"|* c #743B1D", +"1* c #6B371C", +"2* c #342822", +"3* c #292625", +"4* c #57331F", +"5* c #66361D", +"6* c #713618", +"7* c #723A1C", +"8* c #713A1B", +"9* c #6B3B1D", +"0* c #63331F", +"a* c #63341F", +"b* c #673620", +"c* c #63331B", +"d* c #803A18", +"e* c #7F3919", +"f* c #7D3A19", +"g* c #6D341A", +"h* c #372922", +"i* c #292624", +"j* c #5D3221", +"k* c #6B3521", +"l* c #62321F", +"m* c #833E1A", +"n* c #2B2625", +"o* c #462B1E", +"p* c #363636", +"q* c #372A23", +"r* c #282524", +"s* c #4D3020", +"t* c #83401A", +"u* c #7E3E1B", +"v* c #472E21", +"w* c #6A391D", +"x* c #86421B", +"y* c #763E1D", +"z* c #733D1D", +"A* c #6F3C1D", +"B* c #3C2C23", +"C* c #773B1C", +"D* c #67331B", +"E* c #3A2B23", +"F* c #67341D", +"G* c #72381C", +"H* c #68361D", +"I* c #61331B", +"J* c #62321A", +"K* c #67341B", +"L* c #61331C", +"M* c #462D20", +"N* c #68331C", +"O* c #6E391E", +"P* c #72371B", +"Q* c #6D381A", +"R* c #5D301B", +"S* c #59301C", +"T* c #59311D", +"U* c #512B1B", +"V* c #512A1B", +"W* c #5D2F1B", +"X* c #62311A", +"Y* c #3A2A22", +"Z* c #322823", +"`* c #6C3419", +" = c #69351C", +".= c #683820", +"+= c #65371E", +"@= c #69381E", +"#= c #65371D", +"$= c #62321B", +"%= c #5F341D", +"&= c #61341D", +"*= c #63311B", +"== c #66331B", +"-= c #6C3319", +";= c #352923", +">= c #5F331D", +",= c #733618", +"'= c #77381A", +")= c #76391B", +"!= c #6D371A", +"~= c #6B3A1E", +"{= c #853E18", +"]= c #823F1A", +"^= c #823F19", +"/= c #823A18", +"(= c #7D3818", +"_= c #7C3718", +":= c #78371A", +"<= c #7E3818", +"[= c #472B1E", +"}= c #8A4218", +"|= c #863C17", +"1= c #813C19", +"2= c #873E18", +"3= c #8E3E16", +"4= c #8E3E17", +"5= c #57331E", +"6= c #522E1C", +"7= c #532C1B", +"8= c #5D2D1A", +"9= c #5D2C19", +"0= c #5F2D19", +"a= c #612F19", +"b= c #642F19", +"c= c #6A3318", +"d= c #6E3318", +"e= c #6F3419", +"f= c #84411B", +"g= c #382A22", +"h= c #43291E", +"i= c #7A401B", +"j= c #743D1B", +"k= c #753D1C", +"l= c #6E381A", +"m= c #6E3A1C", +"n= c #62331C", +"o= c #5B351E", +"p= c #944316", +"q= c #884219", +"r= c #823F1B", +"s= c #7A3E1D", +"t= c #753E1D", +"u= c #723A1E", +"v= c #713C1E", +"w= c #6C391E", +"x= c #75361A", +"y= c #75381B", +"z= c #63301A", +"A= c #512A1A", +"B= c #332621", +"C= c #262524", +"D= c #2F2723", +"E= c #88421A", +"F= c #823E1B", +"G= c #7F3D1B", +"H= c #803B1A", +"I= c #844019", +"J= c #7B3C1C", +"K= c #813D1C", +"L= c #813D1B", +"M= c #8A441A", +"N= c #984717", +"O= c #63321B", +"P= c #5F2F1D", +"Q= c #592C1B", +"R= c #572C1B", +"S= c #4D2A1B", +"T= c #4D291B", +"U= c #4F291A", +"V= c #53291A", +"W= c #532A1A", +"X= c #57301C", +"Y= c #5A301B", +"Z= c #68331A", +"`= c #4B2C1C", +" - c #2E2621", +".- c #2B2523", +"+- c #422A1E", +"@- c #743818", +"#- c #853D16", +"$- c #713619", +"%- c #6C381B", +"&- c #6B3A1C", +"*- c #6E3B1D", +"=- c #763D1B", +"-- c #82441C", +";- c #7E411B", +">- c #793B19", +",- c #7E3E1A", +"'- c #67381E", +")- c #63371E", +"!- c #64381E", +"~- c #65361E", +"{- c #63351D", +"]- c #66351A", +"^- c #703719", +"/- c #7F3F1B", +"(- c #78391A", +"_- c #763618", +":- c #693217", +"<- c #602D16", +"[- c #5A2914", +"}- c #432012", +"|- c #2D1C15", +"1- c #241E1B", +"2- c #23211F", +"3- c #291C16", +"4- c #402313", +"5- c #5F3015", +"6- c #723C18", +"7- c #6A351A", +"8- c #4E2B1B", +"9- c #502A1B", +"0- c #532E1D", +"a- c #5C331D", +"b- c #6D3A1D", +"c- c #703519", +"d- c #6A3A1F", +"e- c #743519", +"f- c #783519", +"g- c #773719", +"h- c #763419", +"i- c #763519", +"j- c #7A3618", +"k- c #7F3918", +"l- c #7A3719", +"m- c #79381A", +"n- c #7A3716", +"o- c #733313", +"p- c #602B10", +"q- c #4A220E", +"r- c #351A0B", +"s- c #261309", +"t- c #21150E", +"u- c #211A17", +"v- c #221E1C", +"w- c #232120", +"x- c #242322", +"y- c #23201E", +"z- c #211C19", +"A- c #211712", +"B- c #22120A", +"C- c #2C160A", +"D- c #3F1D0B", +"E- c #59290E", +"F- c #6F3212", +"G- c #7D3815", +"H- c #7C3A18", +"I- c #6E3418", +"J- c #5B2E1A", +"K- c #5A2E1A", +"L- c #6B361D", +"M- c #813F1A", +"N- c #843F1A", +"O- c #7E3D1A", +"P- c #743B1C", +"Q- c #773B1D", +"R- c #6C371F", +"S- c #6E381F", +"T- c #6F351C", +"U- c #703419", +"V- c #713419", +"W- c #703319", +"X- c #6B351E", +"Y- c #633119", +"Z- c #653219", +"`- c #5F2F18", +" ; c #532A16", +".; c #472613", +"+; c #3A1E10", +"@; c #321A0E", +"#; c #2C170C", +"$; c #28160B", +"%; c #25140A", +"&; c #241209", +"*; c #231208", +"=; c #241308", +"-; c #271409", +";; c #2B150A", +">; c #30170A", +",; c #371B0C", +"'; c #3E1E0D", +"); c #4C2410", +"!; c #602D12", +"~; c #703414", +"{; c #773615", +"]; c #763818", +"^; c #6C361A", +"/; c #5D321D", +"(; c #65351D", +"_; c #703B1E", +":; c #7A401D", +"<; c #7F421D", +"[; c #80411C", +"}; c #773D1C", +"|; c #73371C", +"1; c #63321D", +"2; c #61321C", +"3; c #61331D", +"4; c #61321D", +"5; c #60311A", +"6; c #552D1A", +"7; c #542D19", +"8; c #4C2917", +"9; c #452415", +"0; c #3F2214", +"a; c #3C2012", +"b; c #3A2012", +"c; c #3C2011", +"d; c #3B2013", +"e; c #3E2010", +"f; c #401F0F", +"g; c #3F2012", +"h; c #432212", +"i; c #482613", +"j; c #4C2714", +"k; c #582B15", +"l; c #652F15", +"m; c #6B3317", +"n; c #743718", +"o; c #863F18", +"p; c #883F17", +"q; c #893F18", +"r; c #813C18", +"s; c #763918", +"t; c #64301A", +"u; c #5D331D", +"v; c #5C341D", +"w; c #6F3618", +"x; c #803B18", +"y; c #803C18", +"z; c #7D3C18", +"A; c #753919", +"B; c #733718", +"C; c #663218", +"D; c #623118", +"E; c #613117", +"F; c #5D2E17", +"G; c #5B2E18", +"H; c #5A2E17", +"I; c #592F16", +"J; c #542C16", +"K; c #552D16", +"L; c #572B14", +"M; c #592B15", +"N; c #5A2D15", +"O; c #5E2E15", +"P; c #623017", +"Q; c #652F18", +"R; c #693318", +"S; c #6F3819", +"T; c #773918", +"U; c #7B391A", +"V; c #8A3E16", +"W; c #8D4117", +"X; c #8D4218", +"Y; c #68371C", +"Z; c #813D18", +"`; c #803E19", +" > c #723B1C", +".> c #67321B", +"+> c #6E3619", +"@> c #673319", +"#> c #653118", +"$> c #6A3217", +"%> c #6B3218", +"&> c #6A341C", +"*> c #70391D", +"=> c #79361A", +"-> c #7A371A", +";> c #803917", +">> c #883D17", +",> c #7D3B19", +"'> c #72391C", +")> c #6F391D", +"!> c #7A381A", +"~> c #72391D", +"{> c #71371D", +"]> c #77371A", +"^> c #69371C", +"/> c #67371E", +"(> c #67331D", +"_> c #5C301C", +":> c #61301C", +"<> c #69321B", +"[> c #6D341B", +"}> c #67321E", +"|> c #60321D", +"1> c #66331A", +"2> c #64331A", +"3> c #74371B", +"4> c #7C391A", +"5> c #7B391B", +"6> c #74381C", +"7> c #7B3A1A", +"8> c #66341D", +"9> c #62361D", +"0> c #5F311A", +"a> c #60311B", +"b> c #68341D", +"c> c #60331F", +"d> c #60331E", +"e> c #5B2E1C", +"f> c #562D1C", +"g> c #582F1E", +"h> c #582F1D", +"i> c #542E1C", +"j> c #59301D", +"k> c #60311C", +"l> c #6A381D", +"m> c #65321D", +"n> c #65341D", +"o> c #6C3219", +"p> c #6B3119", +"q> c #693019", +"r> c #64321C", +"s> c #62311D", +"t> c #64351F", +"u> c #6B3721", +"v> c #693921", +"w> c #62341F", +"x> c #5A2D1B", +"y> c #592D1B", +"z> c #592F1C", +"A> c #5F2E1A", +"B> c #69391D", +"C> c #6D3621", +"D> c #70351E", +"E> c #6E3620", +"F> c #66331E", +"G> c #61321E", +"H> c #5B311D", +"I> c #5D311D", +"J> c #6A351F", +"K> c #6B3620", +"L> c #6B361F", +"M> c #6E3621", +"N> c #69371E", +". + @ # $ % % & * = - ; > = , ' ) ! ~ { ] ^ / ( _ : < < [ } | ^ / ( _ : < < [ 1 2 3 @ 4 5 6 7 8 1 9 0 a b c d e f g h i ", +"j k l m n n o p q r s t u v w x y z A B C D E F G H I J K L L M N M O P Q R S T ! U V W X Y Z ` ...+.@.#.$.%.&.*.=.-.;.", +"= >.,.'.).; !.~.{.].^.' /./.(._.:.<.[.}.|.1.2.3.4.5.6.7.8.9.0.a.K b.c.d.e.f.g.h.i.j.T _.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.", +"A.A.B.C.D.E.F.G.H.I.J.K.L.M.M.1 N.O.P.Q.R.S.T.e.1 M.U.V.A f.W.X.Y.X.Z./.`. +F..+++@+#+$+%+&+*+> =+-+;+>+,+,+'+)+!+~+{+]+", +"^+/+^.+.(+_+(+:+#+<+[+T }+Z.|+1+2+3+4+5+6+7+8+N.9+0+a+b+c+d+e+f+g+h+i+b.Q.j+k+l+m+d q n+o+p+q+r+s+t+u+v+w+x+y+z+! A+B+C+", +"+ D+E+F+G+H+I+J+K+L+M+N+e.O+P+Q+M R+^+S+T+U+V+W+V+X+Y+Z+`+ @.@+@@@#@$@%@&@*@=@-@J.;@p >@,@'@)@!@U+!@~@{@]@^@/@(@' _@:@<@", +"[@[@}@|@1@2@3@4@5@1 D 6@7@b.8@9@0@V+p+J.a@!@b@c@d@e@f@g@h@i@j@k@l@m@n@o@p@q@r@s@D.R ] *@t@u@v@w@x@y@z@A@B@C@D@E@F@G@}.k+", +"n.H@I@J@K@L@M@N@O@P@Q@R@S@T@U@l V@W@X@Y@,.Z@`@ #.#+#@###$#%#&#*#=#-#;#>#,#'#)#!#~#{#]#^#/#(#_#:#:#:#<#[#}#' ' D.3.1+}#|#", +"R.T 1#2#3#4#5#6#7#8#9#0#B@a#b#c#d#'@;@p e#f#g#h#i#l@@#j#k#l#m#l#n#o#k@p#h@m@q#r#s#{.t#u#v#N+, H+w#x#y#z#A#B#M.>@g C#3.D#", +"E#F#G#H#]@I#J#K#L#M#N#O#P#Q#R#S#o+T#R#U#V#W#.#X#,#Y#Z#`# $-#n#k#o#;#.$+$@$#$.#$$%$&${.*$=$V+-$`.;$>$D.,$'$)$R+!$~${$]$^$", +"D@/$($_$:$<$[$P.}$|$1$2$3$3$4$5$6$7$8$9$0$a$b$c$m@d$p#@#`#j# $j#;#e$Z#+#,#X#f$g$h$i$j$B.k$l$>@d#b m$S#n$o$a c#Q#p$_#c 2@", +"M.t@q$r$T.] s$t$u$v$w$x$y$z$A$<#2+B$C$D$E$F$G$H$I$i#+$J$@#k@`#`#e$.$>#h@K$g@L$M$N$O$C$P$Q$R$S$T$U$V$W$e.X$Y$* N+L+Z$* `$", +" %.%+%@%#%q$A $%-${@%%&%*%=%:$-%;%C$>%,%g#'%G$)%!%@$+#>#J$.$i@i@.$Z#+$i#m@g@L$~%{%]%^%C$/%L#(%_%:%<%[%}%y$|%1%x E+z+2%3%", +"4%5%6%7%8%9%0%a%b%c%d%L@e%f%<$T+g%h%i%,%0$j%$$)%!%k%d$+#l@>#p#p#>#+$h@@$I$c$L$~%l%m%n%C$C$o%p%y.,@N.7+U+;$q%r%s%t%u%v%w%", +"x%; G+y%z%n.a@^@A%B%C%&%<#D%E%F%G%H%i%%$I%j%$$q#X#I$k%i#d$Y#Y#Y#d$i#@$m@#$H$L$~%g#J%n%H%C$K%t$L%M%N%O%P%Q%R%S%T%U%V%W%p.", +"X%Y%P@Z%`% &b%.&+&@&#&Z%J@$&%&K%C$G%i%&&I%j%$$f$c$*&!%m@,#,#k%k%,#m@I$*&c$=&b$F$g#-&;&f#h%C$>&,&'&*%l+)&!&~&{&{&F#7$]&^&", +"s$/&Q+W+(&_&:&^#<&[&}&|&p$_#1&C$h%9$2&3&]%N$4&b$=&)%c$*&#$!%I$!%#$*&g@H$q#5&6&7&g#8&;&9$G%C$C$` + (@o.9&0&a&u.b&c&d&e&C ", +"f&g&q+h&i&j&}#/.M%p k&:&l&m&n&C$G%9$o&&&]%W#F$p&G$5&=&)%H$c$c$c$H$)%=&f$b$6&~%j%q&8&n%V#f#h%C$r&K#s&t&x u&v&w&x&v&y&z&A&", +"i+B&C&B&{@]@D&0+Y@X@O+++E&I#C$G%f#V#n%%$F&l%N$F$M$6&b$5&f$f$f$f$5&L$L$$$4&F$'%G&0$-&r#^%9$G%C$H&k.I&x+J&K&o.L&M&N&A O&j&", +"R 5@/.-.P&C&Q&7@R&=$] ]@S&T&C$h%9$2&D$8&]%g#l%W#'%~%M$p&6&$$$$$$6&p&4&~%7&N$G&g#q&U&&&;&i%f#G%j$V&V&i&1+v+W$z+..W&V+X&R ", +"L.Y&..Z&`& *|+U..*$+X.+*_ @*C$G%9$o&3&m%0$g#l%l%G&N$j%'%F$F$F$F$F$7&'%N$W#{%g#g#q&F&%$i$V#f#G%#*Y$t@J+$*..%*A#&*Y&b.c **", +"=*-*{@..q+$%Y&;*Q$>*L.,*'*)*C$G%9$;&&&U&q&l%g#l%l%{%{%G&W#W#W#W#W#G&{%{%l%{%g#l%!*]%8&~*V#f#G%{*D.K@q ]*8+* U.^*Y@/*(*_*", +":*<#N&%*' <*1.=@[*}*|* *1*2*G%f#i%;&&&U&q&g#l%l%{%l%l%l%{%{%{%{%l%l%l%l%{%{%l%l%!*I%8&~*V#f#G%3*4*5*6*k&`&7*z%g&8*;$S.9*", +"b%0*a*b*c*z&Q$X&d*e*f*p+g*h*C$G%i%;&&&m%q&l%l%l%{%{%{%{%l%l%l%l%l%{%{%{%l%{%g#g#!*I%8&~*V#f#G%i*j*k*l*0*a*b*c*z&Q$X&d*m*", +"| ^ / ( _ : < < [ 1 2 3 @ 2*C$G%9$^%3&m%q&!*l%l%{%{%{%{%{%{%{%{%{%{%{%l%{%l%l%g#!*]%,%n%V#f#h%n*~+{ ] ^ / ( _ : < < [ } ", +"L M N M O P Q R S T ! U V o*C$h%9$2&D$-&I%!*l%g#l%{%{%{%{%{%{%{%{%{%l%{%l%l%l%g#0$U&p*;&i%f#h%#*..B C D E F G H I J K L ", +"0.a.K b.c.d.e.f.g.h.i.j.T D%C$h%f#V#n%%$F&q&g#l%l%{%l%{%{%{%{%{%{%{%{%l%l%g#l%g#I%J%r#^%9$G%G%q*[.}.|.1.2.3.4.5.6.7.8.9.", +"W.X.Y.X.Z./.`. +F..+++@+#+%+r*C$G%i%;&&&m%0$!*g#l%l%{%{%l%{%{%{%{%l%{%g#g#l%g#q&F&%$~*2&f#G%C$s*P.Q.R.S.T.e.1 M.U.V.A f.", +"t*u*Q.h+i+b.Q.j+k+l+m+d q m+v*C$h%f#2&D$8&F&q&!*l%l%g#l%l%l%{%{%l%l%g#l%l%g#q&I%J%3&o&i%f#G%C$w*4+5+6+7+8+N.9+0+a+b+.&x*", +"y*z*A*Z.1+N.M.*@=@-@J.;@p >@w#h%C$f#i%;&3&-&]%0$!*l%l%g#g#l%l%l%l%g#l%g#g#q&0$m%%$n%2&f#h%C$B*R+^+S+T+U+V+W+V+9+X.C&|.J ", +"C*P+m.7*] E.N&i&D*s@D.R ] *@z%E*C$G%f#V#i$&&J%]%q&!*g#l%g#g#g#g#l%g#l%g#!*I%U&,%~*^%9$G%C$C$F*V+p+J.a@!@b@G*5@F.U.U.b@|.", +"Y&H*y#%+I*0&J*(+c*K*~#{#]#^#/#L*3*H%G%9$2&n%&&J%F&0$!*!*g#l%l%l%g#g#!*q&I%m%,%D$o&9$f#H%C$M*N*W@X@Y@,.O*R D#s$P*Q*Z&B q+", +"; R*S*x&x&T*1%U*V*<%W*X*t#u#v#N+Y*C$H%h%9$2&i$3&8&U&]%0$q&q&q&q&q&0$I%U&-&%$D$o&9$f#H%G%Z*`*d#'@;@p ~#9&l.M.D.T =.=+=Y ", +"@=#=$=%=&=|#' c*J+*===<#-=*$=$V+k.;=G%H%h%9$2&;&D$&&8&J%m%F&F&F&U&m%-&%$3&n%^%i%G%H%C$3*>=S#o+T#Z%/#g+,=S@'=)=3+%*B&!=~=", +".&{=C@]=^=0%/=(=n _=(=0 :=<=k$l$>@/.q*G%H%h%f#i%2&;&~*r#&&%$%$%$p*3&D$n%o&V#9$f#h%C$G%[=4$5$6$7$[@}=.&f%|=7%1=P@2=3=4==*", +"5=6=7=2$8=9=0=a=b=c=d=e=n c%f=R$S$T$k.g=C$C$G%f#f#i%V#o&o&;&i$i$;&^%2&V#9$f#f#H%C$G%h=z$A$<#2+i=j=k=l=m=m.'*%+V&n=}#i&o=", +"p=q=r=s=t=u=v=w=t@'@x=]$y=-$T z=(%_%:%A=B=C=C$C$h%G%f#9$9$i%i%i%9$9$f#f#h%h%C$h%D=a&*%=%:$-%E=r=} F=G=H=G I=b%J=K=L=M=N=", +"h+O=P=Q=R=S=T=U=V=W=t X=Y=*=Z=E&p%y.,@N.7+`= -h%G%G%h%G%G%G%f#G%G%G%h%C$G%G%.-+-@-L@#-f%<$/#v@-$P&g $-%-&-*-*-=---;->-,-", +"'-)-)-!-~-~-{-]-U.^-H#b (&/-|&(-_-L%M%:-<-[-}-|-1-H%f#f#G%G%G%G%G%G%f#G%2-3-4-5-6-k 7-D%*+8-9-0-a-y#y+q$S.b-<*1 c--=A d-", +")=S@S@M%$-e-_-f-(-g-h-i-j-k-<=l-m-,&'&U$n-o-p-q-r-s-t-u-v-w-x-w-y-z-A-B-C-D-E-F-G-H-I-$&J-:%K-y L-S.&%M-N-_$N-O-{&,-P-Q-", +"0+^#i-U.R-S-)@M&.*T-U-V-W-t+X-:@&@p.+ Y-Z-`- ;.;+;@;#;$;%;&;*;=;-;;;>;,;';);!;~;{;R#p$(&)=];^;I@G.W*{./;(;_;C*:;<;[;};!$", +"O#|;_#/@U N&T+= 1;2;3;L*= v#a*4;` 5;K#s&6;:%7;8;9;0;a;b;c;d;a;e;f;g;h;i;j;k;l;m;r n;l&H-a#o;p;}@q;r;s;t;K-u;v;+.O#q+1+V.", +"U 9&T K*}#K*[#w;6*-$U+;.x;y;(#z;A;B;k.I&x+c=C;D;E;F;G;H;I;J;K;L;M;N;O;P;Q;R;S;Z&V.++E&X&T@T;m$U;/=V;W;X;D@}* =L*I#Y;c*9&", +"a#C@E@Z;C@o;M@~&Z%`;*%h >9&0&] G*)@.>V&i&1+o.J&l.S 0&(.+>o.o.@>#>$>%>J&&>^*e==$] ]@S&b.b.L.3+*>5@c-p%=>->;>0%>>@&^&,>}.", +"*=|#|#K*I&5@5@R.'>Z&)>X&!>i ~>{>]>c 7.t@J+$*..%*A#&*Y&b.c **L.Y&..Z&`& *|+U..*$+X.+*_ ^>/>/+(>, '.u&_>:>z&x y <>[>}>|>0&", +"<>O#E.1>2>2>0&v+q+Z&u=_.3>4>5>i 6>7>l+K@q ]*8+* U.^*Y@/*(*_*=*-*{@..q+$%Y&;*Q$>*L.,*'*u$1 `&9&8>9>1$5#0>a>5;(+u$b>s Z$<>", +"c>d>e>,+f>f>,+,+g>h>h>i>j>2;k>c@>=(>l>5*6*k&`&7*z%g&8*;$S.9*:*<#N&%*' <*1.=@[*}*|* *1*3.t@L.L.-$F.m>n>[>o>p>q>r>r>s>@+t>", +"u>v>w>>=x>y>z>A>I#B>B>..T E.M.B#C>D>E>k*l*0*a*b*c*z&Q$X&d*m*b%0*a*b*c*z&Q$X&d*e*f*p+g*3.3.M&V@F>G>H>I>4;'.&={+J>K>L>M>N>"}; diff --git a/app/examples/Basic/Blights/blon.xpm b/app/examples/Basic/Blights/blon.xpm new file mode 100644 index 00000000..dee0b520 --- /dev/null +++ b/app/examples/Basic/Blights/blon.xpm @@ -0,0 +1,1503 @@ +/* XPM */ +static char * blon_xpm[] = { +"60 48 1452 2", +" c None", +". c #70341A", +"+ c #65321B", +"@ c #5C301D", +"# c #63311C", +"$ c #642E19", +"% c #642D19", +"& c #642E1A", +"* c #69381D", +"= c #65331C", +"- c #64311B", +"; c #5E321C", +"> c #5A301D", +", c #64331B", +"' c #65341B", +") c #6C341C", +"! c #6C321A", +"~ c #6B371D", +"{ c #68361F", +"] c #6D371C", +"^ c #73381D", +"/ c #79381D", +"( c #813C1A", +"_ c #753B1C", +": c #713A1D", +"< c #6E371D", +"[ c #6F391E", +"} c #7E3D19", +"| c #7B3E1C", +"1 c #6E371C", +"2 c #68351F", +"3 c #60311E", +"4 c #4E2C1C", +"5 c #4A2B1D", +"6 c #502D1C", +"7 c #582D1D", +"8 c #63301D", +"9 c #78391C", +"0 c #7A391A", +"a c #763619", +"b c #773A1B", +"c c #76391A", +"d c #76381A", +"e c #77381B", +"f c #773A1C", +"g c #733719", +"h c #743A1A", +"i c #76381B", +"j c #6F3719", +"k c #72391A", +"l c #73381A", +"m c #743619", +"n c #743518", +"o c #743517", +"p c #723719", +"q c #77391B", +"r c #6F3418", +"s c #68321D", +"t c #552D1B", +"u c #4F2C1B", +"v c #502C1B", +"w c #512D1B", +"x c #5B2F1B", +"y c #5F301B", +"z c #66361E", +"A c #6D381C", +"B c #6F391B", +"C c #6D381B", +"D c #6D351B", +"E c #743C1C", +"F c #753C1D", +"G c #823C1A", +"H c #793C1B", +"I c #793B1C", +"J c #773C1C", +"K c #783D1B", +"L c #86461C", +"M c #793E1C", +"N c #793F1C", +"O c #833D1A", +"P c #7A3C1C", +"Q c #77391C", +"R c #70381C", +"S c #66351B", +"T c #6B341B", +"U c #68351B", +"V c #67361C", +"W c #613119", +"X c #643119", +"Y c #63341B", +"Z c #60301A", +"` c #64311A", +" . c #65321A", +".. c #6A371C", +"+. c #61321A", +"@. c #5F301D", +"#. c #61331F", +"$. c #5E331D", +"%. c #5C321D", +"&. c #592F1E", +"*. c #62311B", +"=. c #693119", +"-. c #713519", +";. c #75381A", +">. c #69351E", +",. c #6D381D", +"'. c #62341D", +"). c #60331D", +"!. c #5D301C", +"~. c #5B311C", +"{. c #5C2F1B", +"]. c #62311C", +"^. c #6B361E", +"/. c #6C351A", +"(. c #6B351A", +"_. c #6E351A", +":. c #74381B", +"<. c #7B3B1B", +"[. c #7E3918", +"}. c #833D18", +"|. c #773B1B", +"1. c #713A1C", +"2. c #6C381D", +"3. c #69341B", +"4. c #6C371E", +"5. c #6C361E", +"6. c #6C351E", +"7. c #73391D", +"8. c #77381D", +"9. c #81401B", +"0. c #88451B", +"a. c #80411B", +"b. c #723A1B", +"c. c #703A1D", +"d. c #6A371E", +"e. c #68351D", +"f. c #65341E", +"g. c #6C341D", +"h. c #70351C", +"i. c #6F371F", +"j. c #6E3720", +"k. c #6F371A", +"l. c #6C341A", +"m. c #6B381C", +"n. c #6B391C", +"o. c #68341A", +"p. c #67321A", +"q. c #622D18", +"r. c #612C19", +"s. c #612D19", +"t. c #612E1A", +"u. c #64331C", +"v. c #66361F", +"w. c #6B3720", +"x. c #6F351E", +"y. c #76371A", +"z. c #6F371D", +"A. c #65351E", +"B. c #63321C", +"C. c #6A321A", +"D. c #6C351B", +"E. c #6C361C", +"F. c #6C341B", +"G. c #63341D", +"H. c #66351D", +"I. c #6E361A", +"J. c #72361A", +"K. c #773B1A", +"L. c #733A1B", +"M. c #6B351B", +"N. c #6E381C", +"O. c #743A1C", +"P. c #7A3F1C", +"Q. c #793B1A", +"R. c #72381B", +"S. c #71391B", +"T. c #6B391D", +"U. c #6D371B", +"V. c #6B351C", +"W. c #6A3A1E", +"X. c #6B381D", +"Y. c #6A381E", +"Z. c #6E391C", +"`. c #70361A", +" + c #73351A", +".+ c #6B341C", +"++ c #69341D", +"@+ c #64341D", +"#+ c #62321C", +"$+ c #65351C", +"%+ c #62341C", +"&+ c #57301D", +"*+ c #562E1C", +"=+ c #592E1E", +"-+ c #5C321E", +";+ c #582E1D", +">+ c #572E1E", +",+ c #572E1D", +"'+ c #562E1E", +")+ c #55301E", +"!+ c #5B341E", +"~+ c #5F341E", +"{+ c #61341E", +"]+ c #6A361F", +"^+ c #65331D", +"/+ c #69361E", +"(+ c #60321A", +"_+ c #60321B", +":+ c #5E341C", +"<+ c #6A361E", +"[+ c #6A331D", +"}+ c #70371C", +"|+ c #6B361C", +"1+ c #6C371C", +"2+ c #763B1A", +"3+ c #743C1D", +"4+ c #6F3B1E", +"5+ c #713B1D", +"6+ c #703C1E", +"7+ c #6F3A1D", +"8+ c #6B371B", +"9+ c #69371D", +"0+ c #71371A", +"a+ c #7D3C1B", +"b+ c #803B19", +"c+ c #883E18", +"d+ c #89431B", +"e+ c #87411A", +"f+ c #823F1B", +"g+ c #7C3B1A", +"h+ c #743B1C", +"i+ c #6C391C", +"j+ c #78391B", +"k+ c #7E3A19", +"l+ c #813A18", +"m+ c #7C3A1A", +"n+ c #7E3B1A", +"o+ c #71371B", +"p+ c #6D361B", +"q+ c #733B1E", +"r+ c #71381D", +"s+ c #6F351B", +"t+ c #6C351C", +"u+ c #69351B", +"v+ c #69351A", +"w+ c #6A3419", +"x+ c #6B341A", +"y+ c #6F361B", +"z+ c #6E311A", +"A+ c #6F341B", +"B+ c #6C351F", +"C+ c #69331A", +"D+ c #68321A", +"E+ c #5D301A", +"F+ c #5E301B", +"G+ c #64341B", +"H+ c #66321B", +"I+ c #5F311B", +"J+ c #5C301B", +"K+ c #67341C", +"L+ c #672F1B", +"M+ c #66341C", +"N+ c #6C361D", +"O+ c #6E381D", +"P+ c #733C1C", +"Q+ c #6B381E", +"R+ c #67351D", +"S+ c #6A361B", +"T+ c #71391C", +"U+ c #71381C", +"V+ c #763B1C", +"W+ c #7F3C1E", +"X+ c #954420", +"Y+ c #AC5328", +"Z+ c #C46938", +"`+ c #CF7543", +" @ c #D47848", +".@ c #D17746", +"+@ c #C56F3E", +"@@ c #B55F31", +"#@ c #9D4821", +"$@ c #8C3F1D", +"%@ c #73361B", +"&@ c #68331B", +"*@ c #70361B", +"=@ c #74381A", +"-@ c #723819", +";@ c #743719", +">@ c #75371A", +",@ c #73371A", +"'@ c #6E371B", +")@ c #6F381C", +"!@ c #71371C", +"~@ c #70371A", +"{@ c #71381B", +"]@ c #6F381A", +"^@ c #69341A", +"/@ c #64321A", +"(@ c #65301A", +"_@ c #6A331B", +":@ c #5E2F1B", +"<@ c #8A3F17", +"[@ c #883E17", +"}@ c #813B18", +"|@ c #7B3818", +"1@ c #783919", +"2@ c #743A1B", +"3@ c #73391A", +"4@ c #6F371B", +"5@ c #733B1B", +"6@ c #72391B", +"7@ c #733A1C", +"8@ c #73391B", +"9@ c #75381C", +"0@ c #6D3A1C", +"a@ c #6F381B", +"b@ c #A24621", +"c@ c #CF622F", +"d@ c #E89558", +"e@ c #FCC281", +"f@ c #FFD599", +"g@ c #FEE0AA", +"h@ c #FEE7B9", +"i@ c #FEE8C0", +"j@ c #FFE8BC", +"k@ c #FEE4B0", +"l@ c #FFDAA0", +"m@ c #FECE8E", +"n@ c #F1AD6C", +"o@ c #DB783F", +"p@ c #B34D25", +"q@ c #76371C", +"r@ c #68321B", +"s@ c #6C361B", +"t@ c #723B1B", +"u@ c #783C1A", +"v@ c #7E3C1A", +"w@ c #7F3E1A", +"x@ c #853E19", +"y@ c #854019", +"z@ c #894219", +"A@ c #843E18", +"B@ c #823D18", +"C@ c #803D18", +"D@ c #7C3818", +"E@ c #823C17", +"F@ c #823E18", +"G@ c #6A381C", +"H@ c #64341C", +"I@ c #6F3519", +"J@ c #793919", +"K@ c #853F18", +"L@ c #8C4419", +"M@ c #8C4217", +"N@ c #8A4017", +"O@ c #853C17", +"P@ c #813A17", +"Q@ c #7D3C19", +"R@ c #763718", +"S@ c #743819", +"T@ c #793D1B", +"U@ c #69341C", +"V@ c #6B371E", +"W@ c #733B1D", +"X@ c #743B1B", +"Y@ c #8D4523", +"Z@ c #E66B34", +"`@ c #FBAD62", +" # c #FFEE9F", +".# c #FFF9B2", +"+# c #FFFEBF", +"@# c #FEFECB", +"## c #FEFED1", +"$# c #FFFFD8", +"%# c #FFFFDB", +"&# c #FFFFD9", +"*# c #FFFFD4", +"=# c #FDFECB", +"-# c #FFFFC3", +";# c #FFFCB7", +"># c #FFF8AA", +",# c #FBD483", +"'# c #F37F40", +")# c #B44E26", +"!# c #6C3519", +"~# c #6F3619", +"{# c #763919", +"]# c #773819", +"^# c #7E3C19", +"/# c #7E3B19", +"(# c #77391A", +"_# c #6F381D", +":# c #6B361B", +"<# c #69361A", +"[# c #66341B", +"}# c #64351C", +"|# c #65331A", +"1# c #5F341C", +"2# c #58321D", +"3# c #592E1B", +"4# c #5D311B", +"5# c #703A1B", +"6# c #80421B", +"7# c #82401A", +"8# c #8B4017", +"9# c #873E17", +"0# c #833E18", +"a# c #7D3A18", +"b# c #773718", +"c# c #753719", +"d# c #753819", +"e# c #BB5729", +"f# c #FF8643", +"g# c #FFE185", +"h# c #FEFEAC", +"i# c #FFFFB3", +"j# c #FFFEBB", +"k# c #FFFFC5", +"l# c #FFFFCD", +"m# c #FFFFDA", +"n# c #FFFFD6", +"o# c #FFFFCF", +"p# c #FFFFC6", +"q# c #FFFEBE", +"r# c #FFFEB4", +"s# c #FFFFAB", +"t# c #FFFFA2", +"u# c #FFB261", +"v# c #DD6531", +"w# c #7A3A1E", +"x# c #60301B", +"y# c #61321B", +"z# c #66341E", +"A# c #5F321D", +"B# c #62331D", +"C# c #65341C", +"D# c #6C3518", +"E# c #6D361C", +"F# c #6C351D", +"G# c #6D3319", +"H# c #70391B", +"I# c #83421C", +"J# c #833F1A", +"K# c #7C3B1B", +"L# c #763819", +"M# c #68361C", +"N# c #5C321C", +"O# c #592D1A", +"P# c #5D2F1A", +"Q# c #63311A", +"R# c #64351B", +"S# c #6A341B", +"T# c #71361A", +"U# c #763A1A", +"V# c #7B3A19", +"W# c #7A3919", +"X# c #7E3A17", +"Y# c #8D421C", +"Z# c #D9622E", +"`# c #FF994D", +" $ c #FFF58F", +".$ c #FEFEA3", +"+$ c #FFFEAC", +"@$ c #FFFFB7", +"#$ c #FFFFC0", +"$$ c #FFFFCA", +"%$ c #FFFFD1", +"&$ c #FFFFDC", +"*$ c #FFFFDE", +"=$ c #FFFFDD", +"-$ c #FFFFD3", +";$ c #FFFFCB", +">$ c #FFFFC2", +",$ c #FFFFB8", +"'$ c #FFFEAE", +")$ c #FEFEA2", +"!$ c #FEFE99", +"~$ c #FFC56A", +"{$ c #F37439", +"]$ c #994622", +"^$ c #6A351C", +"/$ c #6E361C", +"($ c #72381A", +"_$ c #70371B", +":$ c #6F361C", +"<$ c #703619", +"[$ c #6E381E", +"}$ c #6B391E", +"|$ c #6E361B", +"1$ c #733819", +"2$ c #743618", +"3$ c #78381A", +"4$ c #793819", +"5$ c #7F3D18", +"6$ c #7F3C18", +"7$ c #864019", +"8$ c #853F19", +"9$ c #803D1A", +"0$ c #7D3F1C", +"a$ c #713B1C", +"b$ c #6C381C", +"c$ c #60321C", +"d$ c #5C2E1A", +"e$ c #5C2F1A", +"f$ c #613019", +"g$ c #6E3519", +"h$ c #813E19", +"i$ c #8F421A", +"j$ c #E66A32", +"k$ c #FF9148", +"l$ c #FEED83", +"m$ c #FEFE9A", +"n$ c #FFFEA5", +"o$ c #FFFFB1", +"p$ c #FFFFBC", +"q$ c #FFFFD7", +"r$ c #FFFFE1", +"s$ c #FFFFE3", +"t$ c #FFFFD0", +"u$ c #FFFFC8", +"v$ c #FFFFBD", +"w$ c #FFFFB2", +"x$ c #FFFEA6", +"y$ c #FFFF9B", +"z$ c #FEFE90", +"A$ c #FEB65D", +"B$ c #F97237", +"C$ c #B44F25", +"D$ c #7E3718", +"E$ c #753519", +"F$ c #7B3C1B", +"G$ c #783418", +"H$ c #773418", +"I$ c #773A1A", +"J$ c #6F3A1C", +"K$ c #6C3A1D", +"L$ c #6E381B", +"M$ c #6D3419", +"N$ c #66351C", +"O$ c #5F351E", +"P$ c #512F1E", +"Q$ c #4B2A1B", +"R$ c #4F2B1C", +"S$ c #532D1C", +"T$ c #5E321D", +"U$ c #E76E34", +"V$ c #FF803E", +"W$ c #FFC968", +"X$ c #FEFE91", +"Y$ c #FFFF9E", +"Z$ c #FFFFAA", +"`$ c #FFFFB6", +" % c #FFFFCE", +".% c #FFFFE4", +"+% c #FFFFE7", +"@% c #FFFFE8", +"#% c #FFFFE6", +"$% c #FFFFDF", +"%% c #FFFFC4", +"&% c #FFFE9F", +"*% c #FFFF93", +"=% c #FEFE85", +"-% c #FF8340", +";% c #F77137", +">% c #AB5024", +",% c #813F1B", +"'% c #7F3C1A", +")% c #7B3B19", +"!% c #783A19", +"~% c #733919", +"{% c #6D351A", +"]% c #68371D", +"^% c #67361E", +"/% c #69361D", +"(% c #6E391D", +"_% c #81431B", +":% c #81441C", +"<% c #7B3F1B", +"[% c #703C1D", +"}% c #703C1C", +"|% c #6D361A", +"1% c #72371A", +"2% c #763B1B", +"3% c #7A3B1A", +"4% c #813D19", +"5% c #883F18", +"6% c #D4642F", +"7% c #FF7E3D", +"8% c #FE9246", +"9% c #FFEF7E", +"0% c #FFFF94", +"a% c #FFFFBE", +"b% c #FFFFE5", +"c% c #FFFFEB", +"d% c #FFFFEE", +"e% c #FFFFEF", +"f% c #FFFFCC", +"g% c #FFFFA4", +"h% c #FFFE95", +"i% c #FFFF8B", +"j% c #FFC05F", +"k% c #FE7438", +"l% c #E66A34", +"m% c #78391E", +"n% c #5D311C", +"o% c #5B321D", +"p% c #582D1A", +"q% c #542B1A", +"r% c #532B1B", +"s% c #502B1C", +"t% c #552D1C", +"u% c #572E1B", +"v% c #783E1C", +"w% c #7C3E1A", +"x% c #7E3B1B", +"y% c #79381B", +"z% c #7F3C1B", +"A% c #843C18", +"B% c #833D17", +"C% c #833C17", +"D% c #823A17", +"E% c #7F3D19", +"F% c #823E1A", +"G% c #803D19", +"H% c #853F1A", +"I% c #863E17", +"J% c #863D18", +"K% c #A74F23", +"L% c #FA793B", +"M% c #FE823E", +"N% c #FFA651", +"O% c #FFFE88", +"P% c #FFFF98", +"Q% c #FFFFA8", +"R% c #FFFFED", +"S% c #FFFFF2", +"T% c #FFFFF4", +"U% c #FFFFF5", +"V% c #FFFFF1", +"W% c #FFFFC7", +"X% c #FFFF9A", +"Y% c #FFFF8C", +"Z% c #FFDB6C", +"`% c #FD7D3C", +" & c #FE773A", +".& c #C4592B", +"+& c #74371A", +"@& c #753A1C", +"#& c #7A3E1C", +"$& c #7E3D1B", +"%& c #894119", +"&& c #914518", +"*& c #954417", +"=& c #8C461B", +"-& c #61351E", +";& c #63331C", +">& c #67351B", +",& c #763C1B", +"'& c #793E1B", +")& c #7D421B", +"!& c #5F311C", +"~& c #61331E", +"{& c #D06633", +"]& c #FF7F3D", +"^& c #FF8F45", +"/& c #FFB156", +"(& c #FFFF89", +"_& c #FFFFAE", +":& c #FFFFF9", +"<& c #FFFFFC", +"[& c #FFFFFD", +"}& c #FFFFFB", +"|& c #FFFFF8", +"1& c #FFFFF3", +"2& c #FFFFEC", +"3& c #FFFFB0", +"4& c #FFFF9F", +"5& c #FFFF8E", +"6& c #FFDC6C", +"7& c #FE8841", +"8& c #FF7D3D", +"9& c #FF7639", +"0& c #92421E", +"a& c #753517", +"b& c #723618", +"c& c #6B3318", +"d& c #663018", +"e& c #673018", +"f& c #652E19", +"g& c #632F19", +"h& c #633019", +"i& c #592F1A", +"j& c #5A311B", +"k& c #5D341D", +"l& c #5E351D", +"m& c #8F3F17", +"n& c #874018", +"o& c #803C19", +"p& c #823C19", +"q& c #833E19", +"r& c #863E18", +"s& c #8C4117", +"t& c #8B3F17", +"u& c #893E17", +"v& c #61301A", +"w& c #894323", +"x& c #FE8842", +"y& c #FF9A4A", +"z& c #FFBF5C", +"A& c #FFFB89", +"B& c #FFFFA3", +"C& c #FFFFB5", +"D& c #FFFFE0", +"E& c #FFFFEA", +"F& c #FFFFFA", +"G& c #FFFFFE", +"H& c #FFFFFF", +"I& c #FFFFD2", +"J& c #FFFFA5", +"K& c #FFFF91", +"L& c #FFD969", +"M& c #FF9949", +"N& c #FE8440", +"O& c #FF7A3B", +"P& c #DE6431", +"Q& c #7D3718", +"R& c #7D3918", +"S& c #853B17", +"T& c #843B17", +"U& c #843E19", +"V& c #833F19", +"W& c #873F18", +"X& c #873E16", +"Y& c #8A3E17", +"Z& c #6F3A1B", +"`& c #783A1A", +" * c #783B1B", +".* c #7E3B18", +"+* c #813C17", +"@* c #7E3917", +"#* c #7D3B1A", +"$* c #7A3A1A", +"%* c #CF6430", +"&* c #FE813E", +"** c #FE9045", +"=* c #FFA750", +"-* c #FFD164", +";* c #FFFA8B", +">* c #FFFF95", +",* c #FFDD6C", +"'* c #FFAB53", +")* c #FE7C3B", +"!* c #7D3B1E", +"~* c #68341B", +"{* c #65331B", +"]* c #65361C", +"^* c #67361D", +"/* c #68381D", +"(* c #693A1E", +"_* c #6A391E", +":* c #6A3921", +"<* c #6D391D", +"[* c #68351E", +"}* c #68351C", +"|* c #69381C", +"1* c #723619", +"2* c #773818", +"3* c #833D19", +"4* c #FB7B3B", +"5* c #FF8741", +"6* c #FF994A", +"7* c #FFB858", +"8* c #FFE770", +"9* c #FFFF92", +"0* c #FFFFAD", +"a* c #FFFFE9", +"b* c #FFFFBF", +"c* c #FFF277", +"d* c #FF8440", +"e* c #FF793B", +"f* c #B7552A", +"g* c #562C1A", +"h* c #562E1B", +"i* c #5C311C", +"j* c #5A311C", +"k* c #592F1B", +"l* c #58301C", +"m* c #5E341D", +"n* c #65361D", +"o* c #673821", +"p* c #6E371A", +"q* c #6F361A", +"r* c #70351B", +"s* c #6E3419", +"t* c #9A4B23", +"u* c #FF7F3E", +"v* c #FE8B42", +"w* c #FFA24E", +"x* c #FFC960", +"y* c #FFF87D", +"z* c #FFFF9D", +"A* c #FFFEB1", +"B* c #FFFFF7", +"C* c #FFFFA0", +"D* c #FFFE84", +"E* c #FFD366", +"F* c #FFA44F", +"G* c #FF8C43", +"H* c #E76B33", +"I* c #6C371A", +"J* c #6B3419", +"K* c #693419", +"L* c #6A361A", +"M* c #6A351B", +"N* c #6A361C", +"O* c #6E3A1B", +"P* c #71351A", +"Q* c #6D361D", +"R* c #70351A", +"S* c #753B1A", +"T* c #BD5C2C", +"U* c #FF823F", +"V* c #FFAB52", +"W* c #FFD767", +"X* c #FFFF88", +"Y* c #FFFFA6", +"Z* c #FFFEA8", +"`* c #FFFF8F", +" = c #FFE56E", +".= c #FFAF54", +"+= c #FF9146", +"@= c #FE7C3C", +"#= c #F27237", +"$= c #76381D", +"%= c #65311B", +"&= c #6A361D", +"*= c #753A1B", +"== c #6E3A1D", +"-= c #70391C", +";= c #6F371C", +">= c #6C371D", +",= c #6D361E", +"'= c #783F1D", +")= c #D46833", +"!= c #FF9548", +"~= c #FFB356", +"{= c #FFE46F", +"]= c #FFFEAB", +"^= c #FFFFBB", +"/= c #FFFFD5", +"(= c #FFFFB9", +"_= c #FFFF97", +":= c #FFF075", +"<= c #FFB959", +"[= c #FF9648", +"}= c #F67438", +"|= c #934623", +"1= c #67331C", +"2= c #6F391C", +"3= c #6D3A1E", +"4= c #75391A", +"5= c #853D17", +"6= c #7D3D1B", +"7= c #723E1D", +"8= c #6F3B1D", +"9= c #703B1C", +"0= c #70381B", +"a= c #66361C", +"b= c #E57037", +"c= c #FE8640", +"d= c #FFB859", +"e= c #FFEC73", +"f= c #FFFFAF", +"g= c #FFF57A", +"h= c #FF833F", +"i= c #F77438", +"j= c #A74B21", +"k= c #75391B", +"l= c #70381A", +"m= c #7C401C", +"n= c #7F421B", +"o= c #874119", +"p= c #6A371B", +"q= c #6C391D", +"r= c #793D1A", +"s= c #783D1C", +"t= c #743B1D", +"u= c #6B371C", +"v= c #ED7439", +"w= c #FFBB5A", +"x= c #FFFF96", +"y= c #FFFFF0", +"z= c #FFF67C", +"A= c #FFC35E", +"B= c #FF9B4B", +"C= c #F87539", +"D= c #9D4C26", +"E= c #66361D", +"F= c #713618", +"G= c #723A1C", +"H= c #713A1B", +"I= c #6B3B1D", +"J= c #63331F", +"K= c #63341F", +"L= c #673620", +"M= c #63331B", +"N= c #803A18", +"O= c #7F3919", +"P= c #7D3A19", +"Q= c #6D341A", +"R= c #E57238", +"S= c #FFBA5A", +"T= c #FFEF73", +"U= c #FFFF9C", +"V= c #FFF67B", +"W= c #FFC25D", +"X= c #FF9B4A", +"Y= c #F87639", +"Z= c #9A4827", +"`= c #6B3521", +" - c #62321F", +".- c #833E1A", +"+- c #CF6834", +"@- c #FFB758", +"#- c #FFE871", +"$- c #FFFF99", +"%- c #FFF276", +"&- c #FFBC5A", +"*- c #FF9849", +"=- c #F57538", +"-- c #8E4523", +";- c #BB5D2D", +">- c #FFB154", +",- c #FFDE6B", +"'- c #FFFFA9", +")- c #FFFFF6", +"!- c #FFEB72", +"~- c #FFB557", +"{- c #FE7F3C", +"]- c #F17438", +"^- c #7F3F1F", +"/- c #9D4C25", +"(- c #FE8340", +"_- c #FFA851", +":- c #FFFD82", +"<- c #FFDD6A", +"[- c #FF9046", +"}- c #ED7036", +"|- c #6F3A1E", +"1- c #FF813E", +"2- c #FF8D44", +"3- c #FFA04D", +"4- c #FFF176", +"5- c #FFFEB0", +"6- c #FFFA7D", +"7- c #FFA24D", +"8- c #FF8A43", +"9- c #FE7C3D", +"0- c #CA5F2D", +"a- c #83401A", +"b- c #7E3E1B", +"c- c #733B1C", +"d- c #803C1A", +"e- c #DA6C33", +"f- c #FE8741", +"g- c #FE9848", +"h- c #FFB255", +"i- c #FFFE87", +"j- c #FFFEB6", +"k- c #FFFEB5", +"l- c #FFFFA7", +"m- c #FFFF8D", +"n- c #FFB657", +"o- c #FF9749", +"p- c #FF7B3B", +"q- c #954923", +"r- c #86421B", +"s- c #763E1D", +"t- c #733D1D", +"u- c #6F3C1D", +"v- c #A55026", +"w- c #FF9145", +"x- c #FFA44E", +"y- c #FFC65F", +"z- c #FFF177", +"A- c #FFFFBA", +"B- c #FFFEAD", +"C- c #FFF87C", +"D- c #FFCB62", +"E- c #FFA54F", +"F- c #FE8D44", +"G- c #E96F35", +"H- c #773B1C", +"I- c #67331B", +"J- c #7A3D1E", +"K- c #E37438", +"L- c #FFB054", +"M- c #FFD666", +"N- c #FFFA7F", +"O- c #FFFEAF", +"P- c #FFFD84", +"Q- c #FFDC6A", +"R- c #FF9748", +"S- c #FE8540", +"T- c #FE7B3C", +"U- c #9A4924", +"V- c #72381C", +"W- c #68361D", +"X- c #61331B", +"Y- c #62321A", +"Z- c #67341B", +"`- c #B45728", +" ; c #FA823F", +".; c #FE8C42", +"+; c #FFA14D", +"@; c #FFDE6A", +"#; c #FFFE81", +"$; c #FFE56F", +"%; c #FF9F4C", +"&; c #D56631", +"*; c #6E391E", +"=; c #72371B", +"-; c #6D381A", +";; c #5D301B", +">; c #59301C", +",; c #59311D", +"'; c #512B1B", +"); c #512A1B", +"!; c #5D2F1B", +"~; c #62311A", +"{; c #D86E35", +"]; c #FE9144", +"^; c #FFDF6B", +"/; c #FFFC7F", +"(; c #FFFFC1", +"_; c #FFE76F", +":; c #FFC05C", +"<; c #FFA34E", +"[; c #F57639", +"}; c #90431E", +"|; c #69351C", +"1; c #683820", +"2; c #65371E", +"3; c #69381E", +"4; c #65371D", +"5; c #62321B", +"6; c #5F341D", +"7; c #61341D", +"8; c #63311B", +"9; c #66331B", +"0; c #6C3319", +"a; c #813F1D", +"b; c #EB773A", +"c; c #FFB958", +"d; c #FFF378", +"e; c #FFFE8A", +"f; c #FFFEB3", +"g; c #FF843F", +"h; c #B15427", +"i; c #773A19", +"j; c #733618", +"k; c #77381A", +"l; c #76391B", +"m; c #6D371A", +"n; c #6B3A1E", +"o; c #853E18", +"p; c #823F1A", +"q; c #823F19", +"r; c #823A18", +"s; c #7D3818", +"t; c #7C3718", +"u; c #78371A", +"v; c #7E3818", +"w; c #8D431F", +"x; c #EF783A", +"y; c #FFC85F", +"z; c #FFE16C", +"A; c #FFF47A", +"B; c #FFFE86", +"C; c #FFF77C", +"D; c #FFCC61", +"E; c #FFB256", +"F; c #FE9044", +"G; c #FE833F", +"H; c #AC532A", +"I; c #8A4218", +"J; c #863C17", +"K; c #813C19", +"L; c #873E18", +"M; c #8E3E16", +"N; c #8E3E17", +"O; c #57331E", +"P; c #522E1C", +"Q; c #532C1B", +"R; c #5D2D1A", +"S; c #5D2C19", +"T; c #5F2D19", +"U; c #612F19", +"V; c #642F19", +"W; c #6A3318", +"X; c #6E3318", +"Y; c #6F3419", +"Z; c #84411B", +"`; c #8E451E", +" > c #EA7738", +".> c #FF8D43", +"+> c #FFB556", +"@> c #FFC75F", +"#> c #FFE66F", +"$> c #FFF679", +"%> c #FFF67A", +"&> c #FFE870", +"*> c #FFDA69", +"=> c #FFB757", +"-> c #FF9A49", +";> c #FE7D3C", +">> c #984B29", +",> c #7A401B", +"'> c #743D1B", +")> c #753D1C", +"!> c #6E381A", +"~> c #6E3A1C", +"{> c #62331C", +"]> c #5B351E", +"^> c #944316", +"/> c #884219", +"(> c #7A3E1D", +"_> c #753E1D", +":> c #723A1E", +"<> c #713C1E", +"[> c #6C391E", +"}> c #75361A", +"|> c #75381B", +"1> c #63301A", +"2> c #67331D", +"3> c #D76B36", +"4> c #FC833F", +"5> c #FF8842", +"6> c #FD9A49", +"7> c #FFAD53", +"8> c #FFBE5A", +"9> c #FFC55E", +"0> c #FFC35D", +"a> c #FFBE5B", +"b> c #FF8641", +"c> c #FF813F", +"d> c #F4773A", +"e> c #A04D24", +"f> c #88421A", +"g> c #823E1B", +"h> c #7F3D1B", +"i> c #803B1A", +"j> c #844019", +"k> c #7B3C1C", +"l> c #813D1C", +"m> c #813D1B", +"n> c #8A441A", +"o> c #984717", +"p> c #63321B", +"q> c #5F2F1D", +"r> c #592C1B", +"s> c #572C1B", +"t> c #4D2A1B", +"u> c #4D291B", +"v> c #4F291A", +"w> c #53291A", +"x> c #532A1A", +"y> c #57301C", +"z> c #5A301B", +"A> c #68331A", +"B> c #BD582A", +"C> c #ED7539", +"D> c #FF8A42", +"E> c #FF8E44", +"F> c #FE9346", +"G> c #FF9C4B", +"H> c #FF9E4B", +"I> c #FF9E4C", +"J> c #FF9C4A", +"K> c #FD9246", +"L> c #F97A3A", +"M> c #DA632F", +"N> c #9F451D", +"O> c #863D16", +"P> c #713619", +"Q> c #6C381B", +"R> c #6B3A1C", +"S> c #6E3B1D", +"T> c #763D1B", +"U> c #82441C", +"V> c #7E411B", +"W> c #793B19", +"X> c #7E3E1A", +"Y> c #67381E", +"Z> c #63371E", +"`> c #64381E", +" , c #65361E", +"., c #63351D", +"+, c #66351A", +"@, c #703719", +"#, c #7F3F1B", +"$, c #78391A", +"%, c #763618", +"&, c #6C3217", +"*, c #6E2F17", +"=, c #7A2C15", +"-, c #A3361B", +";, c #D14E26", +">, c #F26C34", +",, c #FF8943", +"', c #FF8B43", +"), c #FF8942", +"!, c #FA7539", +"~, c #E4592A", +"{, c #C1441F", +"], c #993918", +"^, c #873E19", +"/, c #4E2B1B", +"(, c #502A1B", +"_, c #532E1D", +":, c #5C331D", +"<, c #6D3A1D", +"[, c #703519", +"}, c #6A3A1F", +"|, c #743519", +"1, c #783519", +"2, c #773719", +"3, c #763419", +"4, c #763519", +"5, c #7A3618", +"6, c #7F3918", +"7, c #7A3719", +"8, c #79381A", +"9, c #863817", +"0, c #963715", +"a, c #A73414", +"b, c #BC3416", +"c, c #D03617", +"d, c #DE3B19", +"e, c #ED4F25", +"f, c #F5642F", +"g, c #FB7337", +"h, c #FE793A", +"i, c #FF7D3C", +"j, c #FC7538", +"k, c #F86932", +"l, c #F15629", +"m, c #E6421D", +"n, c #D73517", +"o, c #C73314", +"p, c #B63514", +"q, c #A33815", +"r, c #933B16", +"s, c #833B18", +"t, c #703418", +"u, c #5B2E1A", +"v, c #5A2E1A", +"w, c #6B361D", +"x, c #813F1A", +"y, c #843F1A", +"z, c #7E3D1A", +"A, c #773B1D", +"B, c #6C371F", +"C, c #6E381F", +"D, c #6F351C", +"E, c #703419", +"F, c #713419", +"G, c #703319", +"H, c #6B351E", +"I, c #6A341A", +"J, c #753119", +"K, c #812F18", +"L, c #952F17", +"M, c #A82C16", +"N, c #B72D16", +"O, c #C12D15", +"P, c #C82E15", +"Q, c #CD2D16", +"R, c #D02D14", +"S, c #D12D14", +"T, c #D12E14", +"U, c #CF2D14", +"V, c #CB2D14", +"W, c #C42E14", +"X, c #B82D14", +"Y, c #AA2E14", +"Z, c #9E3315", +"`, c #923715", +" ' c #853716", +".' c #763818", +"+' c #6C361A", +"@' c #5D321D", +"#' c #65351D", +"$' c #703B1E", +"%' c #7A401D", +"&' c #7F421D", +"*' c #80411C", +"=' c #773D1C", +"-' c #73371C", +";' c #63321D", +">' c #61321C", +",' c #61331D", +"'' c #61331C", +")' c #61321D", +"!' c #60311A", +"~' c #572D1A", +"{' c #6A2E1A", +"]' c #742D19", +"^' c #802A17", +"/' c #892A17", +"(' c #942A17", +"_' c #9D2C17", +":' c #A62D17", +"<' c #A92F19", +"[' c #AD2F19", +"}' c #AE2F16", +"|' c #AC2D15", +"1' c #A52C17", +"2' c #A02D16", +"3' c #9A2F17", +"4' c #8F2D16", +"5' c #882F17", +"6' c #833216", +"7' c #7A3417", +"8' c #753518", +"9' c #753718", +"0' c #7C3A18", +"a' c #863F18", +"b' c #883F17", +"c' c #893F18", +"d' c #813C18", +"e' c #763918", +"f' c #64301A", +"g' c #5D331D", +"h' c #5C341D", +"i' c #6F3618", +"j' c #803B18", +"k' c #803C18", +"l' c #7D3C18", +"m' c #753919", +"n' c #733718", +"o' c #6C3318", +"p' c #6D3318", +"q' c #703219", +"r' c #773318", +"s' c #7C3118", +"t' c #813119", +"u' c #873219", +"v' c #8B3317", +"w' c #893218", +"x' c #8C3218", +"y' c #8D3117", +"z' c #8C3017", +"A' c #893117", +"B' c #883117", +"C' c #843318", +"D' c #7F3119", +"E' c #7B3418", +"F' c #79391A", +"G' c #773918", +"H' c #7B391A", +"I' c #8A3E16", +"J' c #8D4117", +"K' c #8D4218", +"L' c #68371C", +"M' c #813D18", +"N' c #803E19", +"O' c #723B1C", +"P' c #67321B", +"Q' c #72351A", +"R' c #6E351B", +"S' c #70341C", +"T' c #78361A", +"U' c #7D3719", +"V' c #7A351A", +"W' c #793419", +"X' c #753218", +"Y' c #793318", +"Z' c #783319", +"`' c #743419", +" ) c #70391D", +".) c #79361A", +"+) c #7A371A", +"@) c #803917", +"#) c #883D17", +"$) c #7D3B19", +"%) c #72391C", +"&) c #6F391D", +"*) c #7A381A", +"=) c #72391D", +"-) c #71371D", +";) c #77371A", +">) c #69371C", +",) c #67371E", +"') c #5C301C", +")) c #61301C", +"!) c #69321B", +"~) c #6D341B", +"{) c #67321E", +"]) c #60321D", +"^) c #66331A", +"/) c #64331A", +"() c #74371B", +"_) c #7C391A", +":) c #7B391B", +"<) c #74381C", +"[) c #7B3A1A", +"}) c #66341D", +"|) c #62361D", +"1) c #5F311A", +"2) c #60311B", +"3) c #68341D", +"4) c #60331F", +"5) c #60331E", +"6) c #5B2E1C", +"7) c #562D1C", +"8) c #582F1E", +"9) c #582F1D", +"0) c #542E1C", +"a) c #59301D", +"b) c #60311C", +"c) c #5F321C", +"d) c #5F331D", +"e) c #6A381D", +"f) c #65321D", +"g) c #65341D", +"h) c #6C3219", +"i) c #6B3119", +"j) c #693019", +"k) c #64321C", +"l) c #62311D", +"m) c #64351F", +"n) c #6B3721", +"o) c #693921", +"p) c #62341F", +"q) c #5A2D1B", +"r) c #592D1B", +"s) c #592F1C", +"t) c #5F2E1A", +"u) c #69391D", +"v) c #6D3621", +"w) c #70351E", +"x) c #6E3620", +"y) c #66331E", +"z) c #61321E", +"A) c #5B311D", +"B) c #5D311D", +"C) c #6A351F", +"D) c #6B3620", +"E) c #6B361F", +"F) c #6E3621", +"G) c #69371E", +". + @ # $ % % & * = - ; > = , ' ) ! ~ { ] ^ / ( _ : < < [ } | ^ / ( _ : < < [ 1 2 3 @ 4 5 6 7 8 1 9 0 a b c d e f g h i ", +"j k l m n n o p q r s t u v w x y z A B C D E F G H I J K L L M N M O P Q R S T ! U V W X Y Z ` ...+.@.#.$.%.&.*.=.-.;.", +"= >.,.'.).; !.~.{.].^.' /./.(._.:.<.[.}.|.1.2.3.4.5.6.7.8.9.0.a.K b.c.d.e.f.g.h.i.j.T _.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.", +"A.A.B.C.D.E.F.G.H.I.J.K.L.M.M.1 N.O.P.Q.R.S.T.e.1 M.U.V.A f.W.X.Y.X.Z./.`. +F..+++@+#+$+%+&+*+> =+-+;+>+,+,+'+)+!+~+{+]+", +"^+/+^.+.(+_+(+:+#+<+[+T }+Z.|+1+2+3+4+5+6+7+8+N.9+0+a+b+c+d+e+f+g+h+i+b.Q.j+k+l+m+d q n+g+o+p+q+r+s+t+u+v+w+x+y+! z+A+B+", +"+ C+D+E+F+G+H+I+J+K+L+M+e.N+O+P+M Q+^+R+S+T+U+V+o+W+X+Y+Z+`+ @.@+@@@#@$@%@&@*@=@J.-@p ;@>@,@'@)@T+)@!@~@{@]@^@/@' (@_@:@", +"<@<@[@}@|@1@2@3@4@1 D 5@6@b.7@8@9@U+o+J.0@)@a@b@c@d@e@f@g@h@i@j@k@l@m@n@o@p@q@r@D.R ] &@s@t@u@v@w@x@y@z@A@B@C@D@E@F@}.k+", +"n.G@H@I@J@K@L@M@N@O@P@Q@R@S@T@l U@V@W@X@,.Y@Z@`@ #.#+#@###$#%#&#*#=#-#;#>#,#'#)#!#~#{#]#^#/#(#_#_#_#:#<#[#' ' D.3.1+[#}#", +"R.T |#1#2#3#4#5#6#7#8#9#A@0#a#b#c#,@-@d#e#f#g#h#i#j#k#l#*#&#%#m#n#o#p#q#r#s#t#u#v#w#x#y#z#M+, G+A#B#C#D#E#F#M.;@g G#3.H#", +"I#J#K#L#{@M#N#O#P#Q#R#S#T#U#V#W#g+X#Y#Z#`# $.$+$@$#$$$%$$#&$*$=$&#-$;$>$,$'$)$!$~${$]$^$/$U+($`._$:$D.<$[$}$Q+|$1$2$3$4$", +"C@5$6$7$8$9$0$P.a$b$c$d$e$e$f$g$h$i$j$k$l$m$n$o$p$p#o#q$=$r$s$r$*$$#t$u$v$w$x$y$z$A$B$C$D$E$;@c#b F$W#G$H$a b#U#I$(#c 1@", +"M.s@J$K$T.] L$M$N$O$P$Q$R$S$T$:#2+U$V$W$X$Y$Z$`$-# %q$*$.%+%@%#%.%$%n#o#%%,$s#&%*%=%-%;%>%,%'%)%!%~%{%e.]%^%* M+K+/%* (%", +"_%:%<%[%}%J$A |%($~@1%2%3%4%8$5%6%7%8%9%0%t#o$a%;$n#*$b%c%d%e%e%c%b%$%n#f%#$o$g%h%i%j%k%l%m%n%o%p%q%r%s%R$t%u%x D+y+v%w%", +"x%y%z%A%B%C%D%E%F%G%H%K@I%J%9$K%L%M%N%O%P%Q%,$p#-$*$#%R%S%T%U%T%V%R%#%=$-$W%,$Z$X%Y%Z%`% &.&+&y.>@N.7+T+_$@&#&$&%&&&*&=&", +"-&; F+;&>&n.0@]@,&'&)&2%:#!&~&{&]&^&/&(&Y$_&#$l#m#.%d%T%:&<&[&}&|&1&2&.%m# %#$3&4&5&6&7&8&9&0&a&b&c&d&e&f&g&h&i&j&k&l&p.", +"m&n&O@o&p&q&F%r&s&t&u&o&I@v&w&8&x&y&z&A&B&C&p#-$D&E&1&F&G&G&H&G&G&:&S%E&$%I&W%@$J&K&L&M&N&O&P&Q&R&3%l+S&T&U&V&V&J#W&X&Y&", +"L$Z&P+V+`& *d#]#.*+*@*#*I$$*%*&***=*-*;*Q%p$;$&#.%e%:&H&H&G&H&G&H&G&|&d%s$$#;$p$Z$>*,*'*^&)* &!*+ /@o.~*{*]*u.^*/*(*_*C ", +":*<*p+[*}*|*[#/.b&p 1*d#2*3*4*5*6*7*8*9*0*#$o#=$a*T%<&H&G&H&H&H&G&H&<&S%+%&$ %b*_&P%c*z&y&d*e*f*O#g*h*x i*j*k*l*j*m*n*o*", +"i+p*q*p*~@{@r*0+X@W@N+++s*t*u*v*w*x*y*z*A*>$I&$%2&|&H&H&H&H&H&H&H&H&G&B*E&=$t$>$3&C*D*E*F*G*O&H*k.I*w+J*K*o.L*M*N*A O*|*", +"R 4@/.-.P*q*Q*6@R*/$] {@S*T*U***V*W*X*Y*@$p#-$D&d%F&H&G&H&H&H&H&H&G&G&|&2&*$%$%%C&Z*`* =.=+=@=#=$=%=}*1+u+{%y+..&=U+*=R ", +"L.==..-=;=>=|+U.,=$+X.'=_ )=d*!=~={=`*]=^=;$$#s$e%}&H&H&H&H&H&H&H&H&G&:&R%D&/=u$(=s#_=:=<=[=V$}=|=s@I+1=..2=E#3===b.c 4=", +"5=6=~@..p+|%==7=8=9=L.0=a=b=c=6*d=e=0%f=a% %m#+%S%<&H&H&H&H&H&H&H&H&G&F&d%s$q$;$p$_&y$g=z&M&h=i=j=J@q k=8+* U.l=X@m=n=o=", +"p=:#N*2=' q=1.*@r=s=t=>=u=v=5*y&w=:=x=o$#$t$&$@%T%[&H&H&H&H&H&H&H&H&G&}&y=b%&#f%a%f=z*z=A=B=-%C=D=E=F=1*;=G=>&<*H=_$S.I=", +"F%J=K=L=M=n*8=*=N=O=P=o+Q=R=5*y&S=T=>*o$#$o#=$a*T%[&H&H&H&H&H&H&H&H&G&<&V%b%&#l#a%f=U=V=W=X=-%Y=Z=`= -J=K=L=M=n*8=*=N=.-", +"| ^ / ( _ : < < [ 1 2 3 @ +-5*M&@-#-K&'$a% %%#+%1&<&H&G&H&H&H&H&H&G&G&F&e%s$q$;$p$_&$-%-&-*-U*=---{ ] ^ / ( _ : < < [ } ", +"L M N M O P Q R S T ! U V ;-c=!=>-,-i%'-^=$$$#.%d%:&G&H&G&H&H&H&G&H&G&)-c%D&/=u$(=s#*%!-~-!={-]-^-B C D E F G H I J K L ", +"0.a.K b.c.d.e.f.g.h.i.j.T /-(-**_--*:-t#`$k#-$$%E&1&F&H&H&H&G&H&H&G&:&y=#%&$%$-#C&x$(&<-V*[-8&}-[.}.|.1.2.3.4.5.6.7.8.9.", +"W.X.Y.X.Z./.`. +F..+++@+#+|-1-2-3-A=4-_=5-a%f%&#s$2&1&F&[&H&H&H&[&|&V%a*D&n#$$v$3&U=6-x*7-8-9-0-P.Q.R.S.T.e.1 M.U.V.A f.", +"a-b-Q.c-i+b.Q.j+k+l+m+d q d-e-f-g-h-<-i-J&j--#t$m#s$c%V%)-B*:&B*T%e%a*D&$# %>$k-l-m-8*n-o-h=p-q-4+5+6+7+8+N.9+0+a+b+r&r-", +"s-t-u-Z.1+N.M.&@*@=@J.-@p ;@v-h=w-x-y-z-0%0*A-k#%$&#D&b%E&R%R%2&a*b%*$q$ %%%,$B-$-C-D-E-F-u*G-Q+^+R+S+T+U+V+U+9+X.q*|.J ", +"H-O+m.G=] E.N*}*I-r@D.R ] &@J-K-5*6*L-M-N-X%O-A-%%l#/=m#*$D&r$D&=$&#-$f%-#(='$Y$P-Q-~=R-S-T-U-U+o+J.0@)@a@V-4@F.U.U.a@|.", +"==W-C#%+X-{*Y-(+M=Z-!#~#{#]#^#`- ;.;+;7*@;#;X%B-,$b*W%l#%$*#*#-$t$l#W%b*@$0*Y$i-$;&-%;v*7%&;t+V@W@X@,.*;R H#L$=;-;-=B p+", +"; ;;>;l*l*,;u%';);q%!;~;x#y#z#M+{;c=];x-&-^;/;>*l-w$(=a%>$%%k#%%(;a%,$A*'-$-P-_;:;<;**&*[;};c#,@-@p !#~*l.M.D.T |;1;2;Y ", +"3;4;5;6;7;}#' M=I+8;9;:#0;^$/$U+a;b;f-8%<;c;W*d;e;y$Y*_&f;C&`$C&w$'$l-z*m-z=@;&-<;];g;4*h;W#g+X#o&^#i;j;R@k;l;3+2=p*m;n;", +"r&o;B@p;q;D%r;s;n t;s;0 u;v;D$E$;@w;x;5*];3-h-y;z;A;B;K&P%U=Y$z*$-9*X*C;$;D;E;3-F;G;8&H;f$g$h$W&<@I;r&J%J;A%K;O@L;M;N;5=", +"O;P;Q;d$R;S;T;U;V;W;X;Y;n G%Z;,%'%)%`; >5*.>X==*+>@>W*#>:=$>C;%>%-&>*>x*=>=*->v*h=;>>>S$T$:#2+,>'>)>!>~>m.a=%+%={>[#}*]>", +"^>/>f+(>_>:><>[>s@,@}>3$|>($T 1>n%o%p%2>3>4>5>w-6><;7>n-8>W=9>0>a>@-7><;y&F;b>c>d>e>3%4%8$5%f>f+} g>h>i>G j>F%k>l>m>n>o>", +"c-p>q>r>s>t>u>v>w>x>t y>z>8;A>s*+&y.>@N.9@B>C>c=D>E>F>*-G>H>%;I>J>*-K>E>x&d*L>M>N>K@O>J%9$^#u@($P*g P>Q>R>S>S>T>U>V>W>X>", +"Y>Z>Z>`> , ,.,+,U.@,L#b `&#,#*$,%,a&b&&,*,=,-,;,>,d*,,',',G*',',',),x&d*!,~,{,],^,$*/.!&*+/,(,_,:,C#x+J$S.<,q=1 [,0;A },", +"l;R@R@b&P>|,%,1,$,2,3,4,5,6,v;7,8,Q&R&V#9,0,a,b,c,d,e,f,g,h,V$i,j,k,l,m,n,o,p,q,r,s,t,v&u,p%v,y w,S.2%x,y,7$y,z,V&X>h+A,", +"0+]#4,U.B,C,'@M*,=D,E,F,G,s+H,_@I,p.+ X 0;J,K,L,M,N,O,P,Q,R,S,S,T,U,V,W,X,Y,Z,`, 'k+I$`&l;.'+'H@G.!;{.@'#'$'H-%'&'*'='|$", +"S#-'(#^@U N*S+= ;'>','''= z#K=)'` !'O#g*~'t.{']'^'/'('_':'<'['}'|'1'2'3'4'5'6'7'8'9'2*0'0#a'b'[@c'd'e'f'v,g'h'+.S#p+1+V.", +"U ~*T Z-[#Z-<#i'F=($T+;.j'k'/#l'm'n'k.I*w+o'p'q'r's't'u'v'w'x'y'z'A'B'C'D'E'F'@&t+++s**=S@G'F$H'r;I'J'K'C@s=|;''M#L'M=~*", +"0#B@D@M'B@a'L@U&o&N'3%h O'~*{*] V-'@P'%=}*1+^@s*Q'R'S'T'U'V'V'W'X'Y'Z'`'h.=@F,/$] {@S*b.b.L.3+ )4@[,+&.)+)@)D%#)t&Y&$)}.", +"8;}#}#Z-I*4@4@R.%)-=&)*=*)i =)-);)c 7.s@I+1=..2=E#3===b.c 4=L.==..-=;=>=|+U.,=$+X.'=_ >),)/+2>, '.i*')))n*x y !)~){)]){*", +"!)S#E.^)/)/){*u+p+-=:>_.()_):)i <)[)l+J@q k=8+* U.l=X@m=n=o=5=6=~@..p+|%==7=8=9=L.0=a=N$1 ;=~*})|)c$4#1)2)!'(+N$3)s /%!)", +"4)5)6),+7)7),+,+8)9)9)0)a)>'b)c)d)2>e)E=F=1*;=G=>&<*H=_$S.I=p=:#N*2=' q=1.*@r=s=t=>=u=3.s@L.L.($F.f)g)~)h)i)j)k)k)l)@+m)", +"n)o)p)d)q)r)s)t)M#u)u)..T E.M.F#v)w)x)`= -J=K=L=M=n*8=*=N=.-F%J=K=L=M=n*8=*=N=O=P=o+Q=3.3.M*U@y)z)A)B))''.7;{+C)D)E)F)G)"}; diff --git a/app/examples/Basic/Collection/.directory b/app/examples/Basic/Collection/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/app/examples/Basic/Collection/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/app/examples/Basic/Collection/.icon.png b/app/examples/Basic/Collection/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..52e66249c734d935df42d897a0ea6ab79841d9c4 GIT binary patch literal 4310 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 Ef@}{+iU0rr literal 0 HcmV?d00001 diff --git a/app/examples/Basic/Collection/.lang/ca.po b/app/examples/Basic/Collection/.lang/ca.po new file mode 100644 index 00000000..721125f0 --- /dev/null +++ b/app/examples/Basic/Collection/.lang/ca.po @@ -0,0 +1,48 @@ +# Catalan translation of Collection +# Copyright (C) 2000-2010 Benoît Minisini. +# This file is distributed under the same license as the Collection package. +# Jordi Sayol , 2007-2010. +# +# +msgid "" +msgstr "" +"Project-Id-Version: Collection\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2011-03-20 17:14+0100\n" +"Last-Translator: Jordi Sayol \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: FStart.form:26 +msgid "by juergen@zdero.com" +msgstr "per juergen@zdero.com" + +#: FStart.form:10 +msgid "Collection" +msgstr "Recoŀlecció" + +#: .project:1 +msgid "Collection example" +msgstr "Exemple de recoŀlecció " + +#: FStart.form:16 +msgid "Create Collection" +msgstr "Crea una recoŀlecció" + +#: FStart.class:18 +msgid "Item" +msgstr "Element" + +#: FStart.class:27 +msgid "myThings" +msgstr "CosesMeves" + +#: FStart.class:31 +msgid "Name = " +msgstr "Nom = " + diff --git a/app/examples/Basic/Collection/.lang/cs.po b/app/examples/Basic/Collection/.lang/cs.po new file mode 100644 index 00000000..fd96208e --- /dev/null +++ b/app/examples/Basic/Collection/.lang/cs.po @@ -0,0 +1,40 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Collection example" +msgstr "Příklad kolekcí" + +#: FStart.class:18 +msgid "Item" +msgstr "Položka" + +#: FStart.class:27 +msgid "myThings" +msgstr "moveVěci" + +#: FStart.class:31 +msgid "Name = " +msgstr "Název =" + +#: FStart.form:10 +msgid "Collection" +msgstr "Kolekce" + +#: FStart.form:16 +msgid "Create Collection" +msgstr "Vytvoř kolekci" + +#: FStart.form:26 +msgid "by juergen@zdero.com" +msgstr "-" diff --git a/app/examples/Basic/Collection/.lang/de.po b/app/examples/Basic/Collection/.lang/de.po new file mode 100644 index 00000000..5cfb1a51 --- /dev/null +++ b/app/examples/Basic/Collection/.lang/de.po @@ -0,0 +1,41 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Collection example" +msgstr "Beispiel für Collection" + +#: FStart.class:18 +msgid "Item" +msgstr "Ding" + +#: FStart.class:27 +msgid "myThings" +msgstr "meine Sachen" + +#: FStart.class:31 +msgid "Name = " +msgstr "-" + +#: FStart.form:10 +msgid "Collection" +msgstr "-" + +#: FStart.form:16 +msgid "Create Collection" +msgstr "Collection erstellen" + +#: FStart.form:26 +msgid "by juergen@zdero.com" +msgstr "-" + diff --git a/app/examples/Basic/Collection/.lang/es.po b/app/examples/Basic/Collection/.lang/es.po new file mode 100644 index 00000000..f6daebb5 --- /dev/null +++ b/app/examples/Basic/Collection/.lang/es.po @@ -0,0 +1,41 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: FStart.form:26 +msgid "by juergen@zdero.com" +msgstr "por juergen@zdero.com" + +#: FStart.form:10 +msgid "Collection" +msgstr "Colección" + +#: .project:1 +msgid "Collection example" +msgstr "Ejemplo de colección" + +#: FStart.form:16 +msgid "Create Collection" +msgstr "Crear colección" + +#: FStart.class:18 +msgid "Item" +msgstr "Artículo" + +#: FStart.class:27 +msgid "myThings" +msgstr "" + +#: FStart.class:31 +msgid "Name = " +msgstr "Nombre =" + diff --git a/app/examples/Basic/Collection/.lang/nl.po b/app/examples/Basic/Collection/.lang/nl.po new file mode 100644 index 00000000..90c0cc50 --- /dev/null +++ b/app/examples/Basic/Collection/.lang/nl.po @@ -0,0 +1,41 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2014-09-23 01:16+0100\n" +"Last-Translator: Willy Raets \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Collection example" +msgstr "Collectie voorbeeld" + +#: FStart.class:18 +msgid "Item" +msgstr "Element" + +#: FStart.class:27 +msgid "myThings" +msgstr "myThings" + +#: FStart.class:31 +msgid "Name = " +msgstr "Naam =" + +#: FStart.form:10 +msgid "Collection" +msgstr "Collectie" + +#: FStart.form:16 +msgid "Create Collection" +msgstr "Creëer collectie" + +#: FStart.form:26 +msgid "by juergen@zdero.com" +msgstr "door juergen@zdero.com" + diff --git a/app/examples/Basic/Collection/.lang/ru.po b/app/examples/Basic/Collection/.lang/ru.po new file mode 100644 index 00000000..b66dcb5a --- /dev/null +++ b/app/examples/Basic/Collection/.lang/ru.po @@ -0,0 +1,54 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Basic/Collection/.project:18 +msgid "Collection example" +msgstr "Пример коллекции" + +#: app/examples/Basic/Collection/.src/FStart.class:18 +msgid "Item" +msgstr "Элемент" + +#: app/examples/Basic/Collection/.src/FStart.class:27 +msgid "myThings" +msgstr "Мои вещи" + +#: app/examples/Basic/Collection/.src/FStart.class:31 +msgid "Name = " +msgstr "Имя = " + +#: app/examples/Basic/Collection/.src/FStart.form:5 +msgid "Collection" +msgstr "Коллекция" + +#: app/examples/Basic/Collection/.src/FStart.form:10 +msgid "Create Collection" +msgstr "Создать коллекцию" + +#: app/examples/Basic/Collection/.src/FStart.form:18 +msgid "by juergen@zdero.com" +msgstr "от juergen@zdero.com" + diff --git a/app/examples/Basic/Collection/.project b/app/examples/Basic/Collection/.project new file mode 100644 index 00000000..3f5d5a0b --- /dev/null +++ b/app/examples/Basic/Collection/.project @@ -0,0 +1,17 @@ +# Gambas Project File 3.0 +# Compiled with Gambas +Title=Collection example +Startup=FStart +Icon=collection.png +Version=3.6.2 +VersionFile=1 +Component=gb.image +Component=gb.gui +TabSize=2 +Translate=1 +Language=fr +Maintainer=benoit +Vendor=Princeton +Address=benoit@localhost +License=General Public Licence +Packager=1 diff --git a/app/examples/Basic/Collection/.src/CThing.class b/app/examples/Basic/Collection/.src/CThing.class new file mode 100644 index 00000000..4b526262 --- /dev/null +++ b/app/examples/Basic/Collection/.src/CThing.class @@ -0,0 +1,6 @@ +' Gambas class file + +Public Name As String +Public X As Integer +Public Y As Integer +Public ID As Integer diff --git a/app/examples/Basic/Collection/.src/FStart.class b/app/examples/Basic/Collection/.src/FStart.class new file mode 100644 index 00000000..66b8e5dd --- /dev/null +++ b/app/examples/Basic/Collection/.src/FStart.class @@ -0,0 +1,40 @@ +' Gambas class file + +Static Public Sub Main() + Dim myForm As Form + myForm = New FStart + myForm.Show +End + +Public myThings As Collection + +Public Sub btnCreate_Click() +'creating objects and add to collection + Dim i As Integer + Dim myThing As CThing + myThings = New Collection + For i = 1 To 7 + myThing = New CThing + myThing.Name = ("Item") & " " & CStr(i) + myThing.X = i + myThing.Y = i + myThing.ID = i + myThings.Add(myThing, CStr(myThing.ID)) + Next + +'show the collectionmembers in treeview + + tvThings.Add("root", ("myThings")) + + For Each myThing In myThings + tvThings.Add(myThing.ID, myThing.Name,, "root") + tvThings.Add(myThing.ID & "Name", ("Name = ") & myThing.Name,, CStr(myThing.ID)) + tvThings.Add(myThing.ID & "X", "X= " & myThing.X,, CStr(myThing.ID)) + tvThings.Add(myThing.ID & "Y", "Y= " & myThing.Y,, CStr(myThing.ID)) + tvThings.Add(myThing.ID & "ID", "ID= " & myThing.ID,, CStr(myThing.ID)) + Next + + tvThings["root"].Expanded = True + btnCreate.Enabled = False +End + diff --git a/app/examples/Basic/Collection/.src/FStart.form b/app/examples/Basic/Collection/.src/FStart.form new file mode 100644 index 00000000..715d33f5 --- /dev/null +++ b/app/examples/Basic/Collection/.src/FStart.form @@ -0,0 +1,20 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(33,14,61,40) + Text = ("Collection") + Icon = Picture["collection.png"] + Resizable = False + { btnCreate Button + MoveScaled(37,1,23,4) + Text = ("Create Collection") + } + { tvThings TreeView + MoveScaled(1,1,35,38) + Sorted = True + } + { Label1 Label + MoveScaled(37,35,24,4) + Text = ("by juergen@zdero.com") + } +} diff --git a/app/examples/Basic/Collection/collection.png b/app/examples/Basic/Collection/collection.png new file mode 100644 index 0000000000000000000000000000000000000000..ce524b157eba9740ff2e1f3fb51baedfe0b85c59 GIT binary patch literal 2062 zcmV+p2=VucP)w^CZR_|!#}AHeu`^X` zr>(Wc4^BI^?esB@_6-AC6>)&ESkV*<5~%~2z)eEl_kGX%oZS!S8Ys2~OWQSb=6tyO zto7S#{r6h?!ll@zzjY+OlKW}wj(vXwsxHabN3y$yXT|S5`RH9cvY8h%QhxW0l=08( zd>&$n|83w;|D_`Gxj)~t{#hgS)QBga_odunNx9pX@{tiK8}HnI5SrUQic4{E%N|nH zyYJYrysPCK>v}3WJK7a&9~|eLlV}u9=iu3Iz4gw}lbbfespJ10fRztimi+AZe%#aT ztXZ-!gbmmZNcq8~kqBf=c=-o?ss10{xf!$f^_kqOGcC~CuHD>q|GIlJH7bL7FfGts z&>bi_P%J+s2XZF3KuvdJZBD!S*3#SW9K-HE^`ZV}%z*Tj6Mz~5F$sqZh=-w4fsiGm7H(}zh|x!$9R1ban}C7;9KiRG9t^55CkZXXaApd8<$?lw!KiaF5U0MQT}Fu=AvSx(L+lmNg6 ztN>(OfZYh~E{vRos!EtQ8yXrw3B!;Hx&iO{pt%xv2G=tJ2p3zP2LO--L;}{-!*B?U z5S+0bA2AQ0M#FbwGs0n~CiN&le(FBD+#9EY!d`Z;=AF2f77DS&Y-gF2fKb#;W+u9LyZ$ z-)P~V`oPdy5?}9Dzm{0@@t><(wyk2tZQ7!yF#f3=e;u#Ij%$G)JP7$v4P-6A=bTu* zz^lwb&CrmR-2VEFInAo)HFIxy1dcdypj-2E|9s|Qz}jg%I!Pk)(U3+DhH zTtxTUo9FGWTfgy(;p=X#BbtCh28wAg3ZNIjEO1qFnAX8Djt;kwomGMA2J<&-GM#^M z+N0(002`9MeBsMynAcTAm6a?~=QDoo$g;7TQkTD1-vdnRLhYFo-n!=APi>*11#&si z^I+tIz(ziRDCVJ5WLbTR%f?b1O|?^OswSdB&IWZ15=Vx(K6-!+cl5G&-2}x*iAk$K z+RGqa!92B{LRWUd%idPDOgi~^W_E~Mz4px#H zNd+B72#`J~f{N-2IvQKKBGE}}MKixC{sCMR%?B_XDA~aW5J1#a!__??Lr_@*`2rLQ zL1`uipishd6@0tg&-^fF#1PGm&CInsNR6Jw*95UxC5;VnIvQGO4kxL0V;sr#F=0#s ziqxc!g6)852F@XIP4t7GXs5SdEG6ME(Ue?+#raQ5EdXaFqr|h+%TmFz8Ana65myj zHsGot-*2iaS(!%0T{KTcH!MtJ0tFRCC`>q$q-B<<6~+OyU!3uuZGUcH?Y31-p9m{n zpm-_EZPkX7ab9W4S0GJ*?qm4n-m0r0&%2#Sjf`3#ZROED6IG~zx}<~UnGjaX)73`> zN(Uy~J>yeG+p3nT%PVlfa;6=TDS#&fFy9AHk{WY({EghyQ}3mppGXQ>(-vl{k$26v))T5MoaPQnqpVgDsG?w8G>{n z2<%JJd7qygE9v(gDg0??$$PkH@PxfD`Y245tb^--*wA-CcEF;?L3Ojz6-DA z-jFT#zdERwmL_UeC!-;C&&h)P>PhFV?~gij-hzf{3!|V9|fsgq^?%X0~YL z`l@dxw=Q@f8m(nCKaQI#V859;?(EZ_CeQDH{)_Mf1lPMdF5=J21*U2%!Vh*lzQn4y swdM#39tJwg{{C+k0#*Z;&$NMm0Pgn9CQ=SiV*mgE07*qoM6N<$g298?_y7O^ literal 0 HcmV?d00001 diff --git a/app/examples/Basic/DragNDrop/.directory b/app/examples/Basic/DragNDrop/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/app/examples/Basic/DragNDrop/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/app/examples/Basic/DragNDrop/.icon.png b/app/examples/Basic/DragNDrop/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7b64ae2517d510933119ae063f03a1a0e736e9f6 GIT binary patch literal 4159 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, YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Basic/DragNDrop/.project:20 app/examples/Basic/DragNDrop/.src/FDragNDrop.form:5 +msgid "Drag & Drop" +msgstr "Бери-и-Брось" + +#: app/examples/Basic/DragNDrop/.src/FDragNDrop.class:107 +msgid "Test" +msgstr "Тест" + diff --git a/app/examples/Basic/DragNDrop/.project b/app/examples/Basic/DragNDrop/.project new file mode 100644 index 00000000..e4b30f58 --- /dev/null +++ b/app/examples/Basic/DragNDrop/.project @@ -0,0 +1,17 @@ +# Gambas Project File 3.0 +Title=Drag & Drop +Startup=FDragNDrop +Icon=drop.png +Version=3.13.90 +VersionFile=1 +Component=gb.image +Component=gb.gui +Component=gb.form +Environment="GB_GUI=gb.qt5" +TabSize=2 +Translate=1 +Maintainer=benoit +Vendor=Princeton +Address=benoit@localhost +License=General Public Licence +Packager=1 diff --git a/app/examples/Basic/DragNDrop/.src/FDragNDrop.class b/app/examples/Basic/DragNDrop/.src/FDragNDrop.class new file mode 100644 index 00000000..2fe80767 --- /dev/null +++ b/app/examples/Basic/DragNDrop/.src/FDragNDrop.class @@ -0,0 +1,138 @@ +' Gambas class file + +Private $iKey As Integer +Private Const MIME_TYPE As String = "text/x-gambas-dragndrop-example" + +Public Sub imgIcon_MouseDrag() + + If Mouse.Left Then + Drag.Icon = Last.Picture + Last.Drag(Last.Picture.Image) + 'LAST.Drag(LAST.Tag) + Endif + +End + +Public Sub TreeView1_Drag() + + If Drag.Type <> Drag.Image Then Stop Event + +End + +Public Sub TreeView1_DragMove() + + 'IF Drag.Type <> Drag.Image THEN STOP EVENT + + With TreeView1 + If Not .FindAt(Drag.X, Drag.Y) Then + Drag.Show(TreeView1, .Item.X, .Item.Y, .Item.W, .Item.H) + Else + Drag.Show(TreeView1) + Endif + End With + +End + +Public Sub TreeView1_Drop() + + Dim sKey As String + + With TreeView1 + + If Not .FindAt(Drag.X, Drag.Y) Then + sKey = .Item.Key + Endif + + Inc $iKey + + If Drag.Type = Drag.Image Then + .Add($iKey, "#" & $iKey, Drag.Data.Picture, sKey).EnsureVisible + ' ELSE IF Drag.Type = Drag.Text THEN + ' .Add($iKey, Drag.Data,, sKey).EnsureVisible + Endif + + End With + +End + +Public Sub TreeView1_MouseDrag() + + Dim hImage As Image + + If Not Mouse.Left Then Return + + With TreeView1 + If .FindAt(Mouse.X, Mouse.Y) Then Return + If Not .Key Then Return + + hImage = New Image(32 + 8 + .Font.TextWidth(.Current.Text), 32, Color.Transparent) + Paint.Begin(hImage) + Try Paint.DrawImage(.Current.Picture.Image, 0, 0) + 'Try Draw.Picture(.Current.Picture, 0, 0) + Paint.Font = .Font + Paint.Text(.Current.Text, 34, 0, hImage.Width, 32, Align.Left) + Paint.Fill + Paint.End + + Drag.Icon = hImage.Picture + 'hImage.Save("~/drag.png") + 'Drag.Icon = .Current.Picture + .Drag(.Key, MIME_TYPE) + End With + +End + +Public Sub imgHole_Drag() + + 'DEBUG Drag.Type;; Drag.Format + If Drag.Type = Drag.Text Then + If Drag.Format = MIME_TYPE Then + Return + Endif + Endif + + Stop Event + +End + +Public Sub imgHole_Drop() + + TreeView1.Remove(Drag.Data) + +End + +Public Sub Form_Open() + + Me.Center + TreeView1.Add("Test", ("Test"), Picture["drop.png"]) + +End + + +Public Sub imgHole_DragMove() + + 'DEBUG Drag.Type;; Drag.Format + If Drag.Type = Drag.Text Then + If Drag.Format = MIME_TYPE Then + Drag.Show(imgHole) + Return + Endif + Endif + + Stop Event + +End + + +Public Sub Test_DragMove() + + Drag.Show(Last) + 'PRINT LAST.ScreenX;; LAST.ScreenY;; LAST.Window.ScreenX;; LAST.Window.ScreenY + +End + +Public Sub Form_DragMove() + + Test_DragMove + +End diff --git a/app/examples/Basic/DragNDrop/.src/FDragNDrop.form b/app/examples/Basic/DragNDrop/.src/FDragNDrop.form new file mode 100644 index 00000000..a9bd890a --- /dev/null +++ b/app/examples/Basic/DragNDrop/.src/FDragNDrop.form @@ -0,0 +1,108 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(56,27,44,56) + Text = ("Drag & Drop") + Icon = Picture["drop.png"] + Arrangement = Arrange.Horizontal + Spacing = True + Margin = True + { VBox2 VBox Test + Name = "VBox2" + MoveScaled(1,3,10,42) + Visible = False + Drop = True + Spacing = True + { Button1 Button Test + Name = "Button1" + MoveScaled(0,2,10,4) + #Translate = False + Drop = True + Text = "Button1" + } + { Panel2 Panel Test + Name = "Panel2" + MoveScaled(2,9,6,8) + Drop = True + Border = Border.Etched + } + { ScrollView1 ScrollView Test + Name = "ScrollView1" + MoveScaled(2,20,7,19) + Drop = True + { ScrollView2 ScrollView Test + Name = "ScrollView2" + MoveScaled(1,5,4,7) + Background = &HF7FFDF& + Drop = True + } + } + } + { TreeView1 TreeView + MoveScaled(14,2,20,41) + Drop = True + Expand = True + } + { VBox1 VBox + MoveScaled(36,2,6,44) + Spacing = True + { PictureBox1 PictureBox imgIcon + Name = "PictureBox1" + MoveScaled(0,0,6,6) + Tag = "Bicycle" + Border = Border.Raised + Picture = Picture["icon:/32/flag"] + Alignment = Align.Center + } + { PictureBox2 PictureBox imgIcon + Name = "PictureBox2" + MoveScaled(0,6,6,6) + Tag = "Eye" + Border = Border.Raised + Picture = Picture["icon:/32/lamp"] + Alignment = Align.Center + } + { PictureBox3 PictureBox imgIcon + Name = "PictureBox3" + MoveScaled(0,12,6,6) + Tag = "Map" + Border = Border.Raised + Picture = Picture["icon:/32/internet"] + Alignment = Align.Center + } + { PictureBox4 PictureBox imgIcon + Name = "PictureBox4" + MoveScaled(0,18,6,6) + Tag = "Happy" + Border = Border.Raised + Picture = Picture["icon:/32/bookmark"] + Alignment = Align.Center + } + { PictureBox5 PictureBox imgIcon + Name = "PictureBox5" + MoveScaled(0,24,6,6) + Tag = "Magnify" + Border = Border.Raised + Picture = Picture["icon:/32/phone"] + Alignment = Align.Center + } + { PictureBox6 PictureBox imgIcon + Name = "PictureBox6" + MoveScaled(0,30,6,6) + Tag = "Highlight" + Border = Border.Raised + Picture = Picture["icon:/32/book"] + Alignment = Align.Center + } + { Panel1 Panel + MoveScaled(1,36,4,3) + Expand = True + } + { imgHole PictureBox + MoveScaled(0,38,6,6) + Drop = True + Picture = Picture["icon:/48/trash"] + Stretch = True + } + } +} diff --git a/app/examples/Basic/DragNDrop/drop.png b/app/examples/Basic/DragNDrop/drop.png new file mode 100644 index 0000000000000000000000000000000000000000..d286286f1313350b52ac0e13470a3c73429e6e81 GIT binary patch literal 1503 zcmah|2~1OG9B-=ytpYM-9)pD$j}Bp=qC+KG83dVttl$QCtf(l_;Uu!@B2GbM8y=hD z)B!48OL2&TAm~Jn77Dgt3*~70+P;>yuk>!;>p@{q_J~_z%#!`{`~K&b@1Oti{gjj# z>qS^bz+f<5aXX^Ps0^Grb7rADnqJ(6!Qh~z_>>sbY-?+5XlM}Le%|nB&GhtiFOM@c z-2b$>sk)XnHs&x}P5lEr#sgYq6&10=_vqyv?6&-(e0mj?+1bwQXhmOmO>8#%U-ci! zVzJ)xylEB|T|iAVBg(N@?3*D}=ka)Nd0v|t85vboRsR|KU#CPS2BacDA`(l4Vn8Sq z4*?RfbIjpz*lczLvB5B6vA|}t#b`1c3?{v6+$92r?M|CYts0pjg#v{_E=M5;K@^}& z2FgU@;lbg4p=d}Asgx?EQZ=Gfj*QFzy)RcNK)C`G17Z-A^80&-g@abaqEabA1t^gM zeSLgL18EJTgTn%g)ud1=WT3SBWmnC^2Y2t43kLf@xomJ~U|_JnPrx@>4Du1V-Z(m{ zgE&3i{63!1tXGVHMzc<580~$<FLSgb{kE43v5DcR&=;_hppts^=?iVTBONr^7r=-2ngtU*=dC>YPCv@ z5~PL^I5swx-Nk|+NTY!e1j)(CArgrlolMwf)r@LnGMU|OFD)%SeE6`Bj}NP(U8B*U zEk;L-ZU~J=^Y->`XSTwK6|o`cC@mI?+wEqu+H4NQ;k1vroUZXPv)SC**3#Pcq6I~3 zGrPOfX0y3muBoZ1$;nBh(O6MYL8VfwtE(p_CiHr})oS(f@)8IHFbqqjQWe@?r4k*F zL?QtI;MB{ei)g{Sa>iOvNPcccWsWKiT^J{DofKYnOA;zmy&qy*(wO z=OBebIYjb^pMU%Ot8IaSVPQmKL`3183nfdFw-dieJso{0B{%*n|5K4Zp^SpUPP+QW z;1m1h-Wp?h-QKP9@!wq=$6t(Lul%Dj6Y~3YayKqGi%@;+=%wQ1^N0@m#^H4(p&+W} zKB06EVb4x7dFKF^yB+|xY;G>>kJlDs^@$-N_|jj*0l>hT<;9GO+HH8^mJdQgS|Vx9 z&DlyiCyT&{Pe>>Wqvl49hgV#m)U99jDmpprSWut+iCyr-E`}i4Ne!>;X9k6tQV}fj zB_-W$Jkft39B->)(6N4WI-L=m_AFP7_^n|l`PHPiFjgHkJ^%5dLHI*<>f;0K`b<*P zUL2Kja9-csGBTNb{nE#^JN7qait8Wttf-{>5}L9@i9z=hfX63=k7Oj%nf5F;VQJc? z`vonZ#gTOTb~-nhw_#FFEV%3)Qt~Ag)2Ojt3uq*bchP?9zB&~Y@_jkpYL<>vI+I=hfP@#e6UR3v_dC_Vz!Cl}<|3_D z|DpE1CAfUwq-MB&ap=vKXLUws%`=?GhD{6SCa({qgq@o*iW@R}D03JXY%usD2FC|8 zh;@1AJm%)LhcmeoswzIGY~$HYPT27D>y1s{24xY90iOqAV^<$p9FAZ0sOY%a{60mY u)9Ik>g1Z;hd3n3@N%+}$XQ#r{9319*N2F&`%xclh;>N`!Mn8(86#NbK&oQY0 literal 0 HcmV?d00001 diff --git a/app/examples/Basic/Object/.directory b/app/examples/Basic/Object/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/app/examples/Basic/Object/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/app/examples/Basic/Object/.icon.png b/app/examples/Basic/Object/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..842f3355e0b50d39b8df71129ce8ee4d26c480f4 GIT binary patch literal 4189 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 literal 0 HcmV?d00001 diff --git a/app/examples/Basic/Object/.lang/ca.po b/app/examples/Basic/Object/.lang/ca.po new file mode 100644 index 00000000..44d7c6d1 --- /dev/null +++ b/app/examples/Basic/Object/.lang/ca.po @@ -0,0 +1,43 @@ +# Catalan translation of Object +# Copyright (C) 2000-2010 Benoît Minisini. +# This file is distributed under the same license as the Object package. +# Jordi Sayol , 2007-2010. +# +# +msgid "" +msgstr "" +"Project-Id-Version: Object\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2010-12-16 23:31+0100\n" +"Last-Translator: Jordi Sayol \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: .project:1 +msgid "Object manipulation example" +msgstr "Exemple de manipulacicó d'objectes" + +#: FStart.form:12 +msgid "Object " +msgstr "Objecte" + +#: FStart.form:17 +msgid "create the Thing !" +msgstr "crea l'objecte!" + +#: FStart.form:22 +msgid "check the Thing !" +msgstr "verifica l'objecte!" + +#: FStart.form:33 +msgid "destroy the Thing !" +msgstr "destrueix l'objecte!" + +#: FStart.form:38 +msgid " by juergen@zdero.com" +msgstr "per juergen@zdero.com" diff --git a/app/examples/Basic/Object/.lang/cs.po b/app/examples/Basic/Object/.lang/cs.po new file mode 100644 index 00000000..52d5e84d --- /dev/null +++ b/app/examples/Basic/Object/.lang/cs.po @@ -0,0 +1,40 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Object manipulation example" +msgstr "Příklad manipulace objeků" + +#: FStart.class:29 +msgid "You need to create the Thing first!" +msgstr "Potřebujete první vytvořit objekt!" + +#: FStart.form:12 +msgid "Object " +msgstr "Objekt" + +#: FStart.form:18 +msgid "create the Thing !" +msgstr "vytvořit Věc !" + +#: FStart.form:23 +msgid "check the Thing !" +msgstr "zkontroluj Věc !" + +#: FStart.form:33 +msgid "destroy the Thing !" +msgstr "zničit Věc !" + +#: FStart.form:38 +msgid " by juergen@zdero.com" +msgstr "-" diff --git a/app/examples/Basic/Object/.lang/de.po b/app/examples/Basic/Object/.lang/de.po new file mode 100644 index 00000000..337def3f --- /dev/null +++ b/app/examples/Basic/Object/.lang/de.po @@ -0,0 +1,41 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Object manipulation example" +msgstr "Beispiel für Objekt-Manipulation" + +#: FStart.class:29 +msgid "You need to create the Thing first!" +msgstr "Sie müssen das Objekt erst erstellen!" + +#: FStart.form:12 +msgid "Object " +msgstr "-" + +#: FStart.form:18 +msgid "create the Thing !" +msgstr "Objekt erstellen" + +#: FStart.form:23 +msgid "check the Thing !" +msgstr "Objekt prüfen" + +#: FStart.form:33 +msgid "destroy the Thing !" +msgstr "Objekt löschen" + +#: FStart.form:38 +msgid " by juergen@zdero.com" +msgstr "-" + diff --git a/app/examples/Basic/Object/.lang/es.po b/app/examples/Basic/Object/.lang/es.po new file mode 100644 index 00000000..ddaeb377 --- /dev/null +++ b/app/examples/Basic/Object/.lang/es.po @@ -0,0 +1,37 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: FStart.form:38 +msgid " by juergen@zdero.com" +msgstr "por juergen@zdero.com" + +#: FStart.form:22 +msgid "check the Thing !" +msgstr "¡ Comprobar la cosa !" + +#: FStart.form:17 +msgid "create the Thing !" +msgstr "¡ Crear la cosa !" + +#: FStart.form:33 +msgid "destroy the Thing !" +msgstr "¡ Destruir la cosa !" + +#: FStart.form:12 +msgid "Object " +msgstr "Objeto" + +#: .project:1 +msgid "Object manipulation example" +msgstr "Ejemplo de manipulación de objetos" + diff --git a/app/examples/Basic/Object/.lang/nl.po b/app/examples/Basic/Object/.lang/nl.po new file mode 100644 index 00000000..41b61e99 --- /dev/null +++ b/app/examples/Basic/Object/.lang/nl.po @@ -0,0 +1,41 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2014-09-23 01:18+0100\n" +"Last-Translator: Willy Raets \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Object manipulation example" +msgstr "Object manipulatie voorbeeld" + +#: FStart.class:29 +msgid "You need to create the Thing first!" +msgstr "Je dient het Ding! eerst te creëren!" + +#: FStart.form:12 +msgid "Object " +msgstr "Object " + +#: FStart.form:18 +msgid "create the Thing !" +msgstr "creëer het Ding!" + +#: FStart.form:23 +msgid "check the Thing !" +msgstr "controleer het Ding!" + +#: FStart.form:33 +msgid "destroy the Thing !" +msgstr "Vernietig het Ding!" + +#: FStart.form:38 +msgid " by juergen@zdero.com" +msgstr " door juergen@zdero.com" + diff --git a/app/examples/Basic/Object/.lang/ru.po b/app/examples/Basic/Object/.lang/ru.po new file mode 100644 index 00000000..2f7ac1ac --- /dev/null +++ b/app/examples/Basic/Object/.lang/ru.po @@ -0,0 +1,58 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Basic/Object/.project:18 +msgid "Object manipulation example" +msgstr "Пример манипулирования объектом" + +#: app/examples/Basic/Object/.src/FStart.class:10 +msgid "Dummy-Thing" +msgstr "Вещь-фикция" + +#: app/examples/Basic/Object/.src/FStart.class:29 app/examples/Basic/Object/.src/FStart.class:37 +msgid "You need to create the Thing first!" +msgstr "Вы должны сначала создать вещь!" + +#: app/examples/Basic/Object/.src/FStart.form:5 +msgid "Object " +msgstr "Объект " + +#: app/examples/Basic/Object/.src/FStart.form:10 +msgid "create the Thing !" +msgstr "создать вещь!" + +#: app/examples/Basic/Object/.src/FStart.form:14 +msgid "check the Thing !" +msgstr "проверить вещь!" + +#: app/examples/Basic/Object/.src/FStart.form:22 +msgid "destroy the Thing !" +msgstr "разрушить вещь!" + +#: app/examples/Basic/Object/.src/FStart.form:26 +msgid " by juergen@zdero.com" +msgstr " от juergen@zdero.com" + diff --git a/app/examples/Basic/Object/.project b/app/examples/Basic/Object/.project new file mode 100644 index 00000000..9e18e993 --- /dev/null +++ b/app/examples/Basic/Object/.project @@ -0,0 +1,17 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.5.90 +Title=Object manipulation example +Startup=FStart +Icon=object.png +Version=3.6.2 +VersionFile=1 +Component=gb.image +Component=gb.gui +TabSize=2 +Translate=1 +Language=fr +Maintainer=benoit +Vendor=Princeton +Address=benoit@localhost +License=General Public Licence +Packager=1 diff --git a/app/examples/Basic/Object/.src/CThing.class b/app/examples/Basic/Object/.src/CThing.class new file mode 100644 index 00000000..4b526262 --- /dev/null +++ b/app/examples/Basic/Object/.src/CThing.class @@ -0,0 +1,6 @@ +' Gambas class file + +Public Name As String +Public X As Integer +Public Y As Integer +Public ID As Integer diff --git a/app/examples/Basic/Object/.src/FStart.class b/app/examples/Basic/Object/.src/FStart.class new file mode 100644 index 00000000..4953cb40 --- /dev/null +++ b/app/examples/Basic/Object/.src/FStart.class @@ -0,0 +1,44 @@ +' Gambas class file + +Public myThing As CThing + +Public Sub btnCreateThing_Click() + + myThing = New CThing + + With mything + .Name = ("Dummy-Thing") + .X = 11 + .Y = 22 + .ID = 33 + End With + + txtCheckResult.Visible = True + +End + +Public Sub btnCheckThing_Click() + + If myThing Then + + With mything + txtCheckResult.Text = Subst("&1, X= &2, Y= &3, ID= &4", .Name, .X, .Y, .ID) + End With + + Else + Message.Warning(("You need to create the Thing first!")) + Endif + +End + +Public Sub btnDestroy_Click() + + If Not mything Then + Message.Warning(("You need to create the Thing first!")) + Return + Endif + + myThing = Null + txtCheckResult.Visible = False + +End diff --git a/app/examples/Basic/Object/.src/FStart.form b/app/examples/Basic/Object/.src/FStart.form new file mode 100644 index 00000000..c667a61a --- /dev/null +++ b/app/examples/Basic/Object/.src/FStart.form @@ -0,0 +1,28 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(35.7143,18.5714,67,17) + Text = ("Object ") + Icon = Picture["object.png"] + Resizable = False + { btnCreateThing Button + MoveScaled(1,1,21,4) + Text = ("create the Thing !") + } + { btnCheckThing Button + MoveScaled(23,1,21,4) + Text = ("check the Thing !") + } + { txtCheckResult TextBox + MoveScaled(1,7,65,4) + Visible = False + } + { btnDestroy Button + MoveScaled(45,1,21,4) + Text = ("destroy the Thing !") + } + { Label1 Label + MoveScaled(1,12,26,4) + Text = (" by juergen@zdero.com") + } +} diff --git a/app/examples/Basic/Object/object.png b/app/examples/Basic/Object/object.png new file mode 100644 index 0000000000000000000000000000000000000000..e2e3e67d7d8275e45eb1b5bc62151de5c2d8a16d GIT binary patch literal 1499 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, 2007-2010. +# +# +msgid "" +msgstr "" +"Project-Id-Version: Timer\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2011-03-20 23:21+0100\n" +"Last-Translator: Jordi Sayol \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: .project:1 +#: FTimer.class:74 +msgid "Timer example" +msgstr "Exemple de temporitzador" + +#: FOtherTimer.class:38 +msgid "Please fill in valid values!" +msgstr "Introduïu valors vàlids!" + +#: FOtherTimer.class:63 +msgid "Time is over!" +msgstr "El temps ha acabat!" + +#: FOtherTimer.class:95 +msgid "Other Example" +msgstr "Un altre exemple" + +#: FOtherTimer.class:103 +#: FTimer.class:80 +msgid "Start" +msgstr "Inicia" + +#: FOtherTimer.class:110 +msgid "3" +msgstr "-" + +#: FOtherTimer.class:117 +msgid ":" +msgstr "-" + +#: FOtherTimer.class:125 +msgid "0" +msgstr "-" + +#: FOtherTimer.class:131 +msgid "Another timer example by Maxim Lapis <maxim_lapis@web.de>" +msgstr "Un altre exemple de temporitzador per Maxim Lapis <maxim_lapis@web.de>" + +#: FTimer.class:81 +msgid "Trigger" +msgstr "Gatell" + +#: FTimer.class:94 +msgid "Reset" +msgstr "Restableix" + +#: FTimer.class:100 +msgid "1500" +msgstr "-" + +#: FTimer.class:106 +msgid "Start Timer in..." +msgstr "Inicia temporitzador en..." + +#: FTimer.class:113 +msgid "Start\ndelay" +msgstr "Temps\nencès" + +#: FTimer.class:120 +msgid "Stop\ndelay" +msgstr "Temps\napagat" + +#: FTimer.class:126 +msgid "200" +msgstr "-" + +#: FTimer.class:132 +msgid "800" +msgstr "-" + +#: FTimer.class:143 +msgid "Start/Stop" +msgstr "Inicia/Atura" + +#: FTimer.class:154 +msgid "Timer example by Juergen Zdero <juergen@zdero.com>" +msgstr "Exemple de temporitzador per Juergen Zdero <juergen@zdero.com>" + +#: FTimer.class:159 +msgid "ms" +msgstr "-" + +#: FTimer.class:172 +msgid "Or start and stop Timer" +msgstr "O temporitzador d'engega i apaga" + +#~ msgid "Delay" +#~ msgstr "Retard" +#~ msgid "High-Time" +#~ msgstr "Temps en alta" +#~ msgid "Low-Time" +#~ msgstr "Temps en baixa" + diff --git a/app/examples/Basic/Timer/.lang/cs.po b/app/examples/Basic/Timer/.lang/cs.po new file mode 100644 index 00000000..0929fbc5 --- /dev/null +++ b/app/examples/Basic/Timer/.lang/cs.po @@ -0,0 +1,92 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 FTimer.form:28 +msgid "Timer example" +msgstr "Příklad časovače" + +#: FOtherTimer.class:16 +msgid "The counter is set to stop at 0 seconds!" +msgstr "Počítadlo je nastaveno na 0 sekund!" + +#: FOtherTimer.class:44 +msgid "Stop" +msgstr "Stop" + +#: FOtherTimer.class:64 +msgid "Time is over!" +msgstr "Čas vypršel!" + +#: FOtherTimer.form:14 +msgid "Other Example" +msgstr "Jiné příklady" + +#: FOtherTimer.form:22 FTimer.form:34 +msgid "Start" +msgstr "-" + +#: FOtherTimer.form:35 +msgid ":" +msgstr "-" + +#: FOtherTimer.form:48 +msgid "Another timer example by Maxim Lapis <maxim_lapis@web.de>" +msgstr "Další příklad časovače od Maxim Lapis <maxim_lapis@web.de>" + +#: FTimer.form:35 +msgid "Trigger" +msgstr "-" + +#: FTimer.form:45 +msgid "Reset" +msgstr "-" + +#: FTimer.form:51 +msgid "1500" +msgstr "-" + +#: FTimer.form:57 +msgid "Start Timer in..." +msgstr "Start Časovače v..." + +#: FTimer.form:64 +msgid "Start\ndelay" +msgstr "Start\nčas" + +#: FTimer.form:71 +msgid "Stop\ndelay" +msgstr "Stop\nčas" + +#: FTimer.form:77 +msgid "200" +msgstr "-" + +#: FTimer.form:83 +msgid "800" +msgstr "-" + +#: FTimer.form:94 +msgid "Start/Stop" +msgstr "-" + +#: FTimer.form:102 +msgid "Timer example by Juergen Zdero <juergen@zdero.com>" +msgstr "Příklad časovače od Juergen Zdero <juergen@zdero.com>" + +#: FTimer.form:107 +msgid "ms" +msgstr "-" + +#: FTimer.form:120 +msgid "Or start and stop Timer" +msgstr "Nebo start a konec Časovače" diff --git a/app/examples/Basic/Timer/.lang/de.po b/app/examples/Basic/Timer/.lang/de.po new file mode 100644 index 00000000..fec1f00e --- /dev/null +++ b/app/examples/Basic/Timer/.lang/de.po @@ -0,0 +1,93 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 FTimer.form:28 +msgid "Timer example" +msgstr "Timer-Beispiel" + +#: FOtherTimer.class:16 +msgid "The counter is set to stop at 0 seconds!" +msgstr "Der Timer soll in 0 Sekunden stoppen!" + +#: FOtherTimer.class:44 +msgid "Stop" +msgstr "-" + +#: FOtherTimer.class:64 +msgid "Time is over!" +msgstr "Zeit ist abgelaufen !" + +#: FOtherTimer.form:14 +msgid "Other Example" +msgstr "Noch ein Beispiel" + +#: FOtherTimer.form:22 FTimer.form:34 +msgid "Start" +msgstr "-" + +#: FOtherTimer.form:35 +msgid ":" +msgstr "-" + +#: FOtherTimer.form:48 +msgid "Another timer example by Maxim Lapis <maxim_lapis@web.de>" +msgstr "Noch ein Timer-Beispiel von Maxim Lapis <maxim_lapis@web.de>" + +#: FTimer.form:35 +msgid "Trigger" +msgstr "Auslösen" + +#: FTimer.form:45 +msgid "Reset" +msgstr "Zurücksetzen" + +#: FTimer.form:51 +msgid "1500" +msgstr "-" + +#: FTimer.form:57 +msgid "Start Timer in..." +msgstr "Timer starten in..." + +#: FTimer.form:64 +msgid "Start\ndelay" +msgstr "Start\nnach" + +#: FTimer.form:71 +msgid "Stop\ndelay" +msgstr "Stop\nnach" + +#: FTimer.form:77 +msgid "200" +msgstr "-" + +#: FTimer.form:83 +msgid "800" +msgstr "-" + +#: FTimer.form:94 +msgid "Start/Stop" +msgstr "-" + +#: FTimer.form:102 +msgid "Timer example by Juergen Zdero <juergen@zdero.com>" +msgstr "Timer-Beispiel von Juergen Zdero <juergen@zdero.com>" + +#: FTimer.form:107 +msgid "ms" +msgstr "-" + +#: FTimer.form:120 +msgid "Or start and stop Timer" +msgstr "Oder Timer starten und stoppen" + diff --git a/app/examples/Basic/Timer/.lang/es.po b/app/examples/Basic/Timer/.lang/es.po new file mode 100644 index 00000000..376ac855 --- /dev/null +++ b/app/examples/Basic/Timer/.lang/es.po @@ -0,0 +1,96 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 FTimer.form:28 +msgid "Timer example" +msgstr "Ejemplo de Temporizador" + +#: FOtherTimer.class:38 +msgid "Please fill in valid values!" +msgstr "Ingrese valores validos!" + +#: FOtherTimer.class:63 +msgid "Time is over!" +msgstr "El tiempo ha terminado" + +#: FOtherTimer.form:14 +msgid "Other Example" +msgstr "Otro ejemplo" + +#: FOtherTimer.form:22 FTimer.form:34 +msgid "Start" +msgstr "Iniciar" + +#: FOtherTimer.form:29 +msgid "3" +msgstr "-" + +#: FOtherTimer.form:36 +msgid ":" +msgstr "-" + +#: FOtherTimer.form:44 +msgid "0" +msgstr "-" + +#: FOtherTimer.form:50 +msgid "Another timer example by Maxim Lapis <maxim_lapis@web.de>" +msgstr "Otro ejemplo de Temporizador por Maxim Lapis <maxim_lapis@web.de>" + +#: FTimer.form:35 +msgid "Trigger" +msgstr "Disparador" + +#: FTimer.form:48 +msgid "Reset" +msgstr "Reiniciar" + +#: FTimer.form:54 +msgid "1500" +msgstr "-" + +#: FTimer.form:60 +msgid "Start Timer in..." +msgstr "Iniciar temporizador en..." + +#: FTimer.form:67 +msgid "Start\ndelay" +msgstr "Retardar\ninicio" + +#: FTimer.form:74 +msgid "Stop\ndelay" +msgstr "Retardar\nparada" + +#: FTimer.form:80 +msgid "200" +msgstr "-" + +#: FTimer.form:86 +msgid "800" +msgstr "-" + +#: FTimer.form:97 +msgid "Start/Stop" +msgstr "Iniciar/Parar" + +#: FTimer.form:108 +msgid "Timer example by Juergen Zdero <juergen@zdero.com>" +msgstr "Ejemplo de Temporizador por Juergen Zdero <juergen@zdero.com>" + +#: FTimer.form:113 +msgid "ms" +msgstr "-" + +#: FTimer.form:126 +msgid "Or start and stop Timer" +msgstr "O iniciar y detener el Temporizador" diff --git a/app/examples/Basic/Timer/.lang/nl.po b/app/examples/Basic/Timer/.lang/nl.po new file mode 100644 index 00000000..2e27afe9 --- /dev/null +++ b/app/examples/Basic/Timer/.lang/nl.po @@ -0,0 +1,92 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2014-09-23 01:22+0100\n" +"Last-Translator: Willy Raets \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 FTimer.form:28 +msgid "Timer example" +msgstr "Timer voorbeeld" + +#: FOtherTimer.class:16 +msgid "The counter is set to stop at 0 seconds!" +msgstr "The teller is ingestelt om bij 0 seconden te stoppen!" + +#: FOtherTimer.class:44 +msgid "Stop" +msgstr "Stop" + +#: FOtherTimer.class:64 +msgid "Time is over!" +msgstr "Tijd is voorbij!" + +#: FOtherTimer.form:14 +msgid "Other Example" +msgstr "Ander Voorbeeld" + +#: FOtherTimer.form:22 FTimer.form:34 +msgid "Start" +msgstr "Start" + +#: FOtherTimer.form:35 +msgid ":" +msgstr "-" + +#: FOtherTimer.form:48 +msgid "Another timer example by Maxim Lapis <maxim_lapis@web.de>" +msgstr "Een ander timer voorbeeld door Maxim Lapsis <maxil_lapis@web.de>" + +#: FTimer.form:35 +msgid "Trigger" +msgstr "-" + +#: FTimer.form:45 +msgid "Reset" +msgstr "" + +#: FTimer.form:51 +msgid "1500" +msgstr "-" + +#: FTimer.form:57 +msgid "Start Timer in..." +msgstr "Start Timer in..." + +#: FTimer.form:64 +msgid "Start\ndelay" +msgstr "Start\nuitstel" + +#: FTimer.form:71 +msgid "Stop\ndelay" +msgstr "Stop\nuitstel" + +#: FTimer.form:77 +msgid "200" +msgstr "-" + +#: FTimer.form:83 +msgid "800" +msgstr "-" + +#: FTimer.form:94 +msgid "Start/Stop" +msgstr "Start/Stop" + +#: FTimer.form:102 +msgid "Timer example by Juergen Zdero <juergen@zdero.com>" +msgstr "Timer voorbeeld door Juergen Zdero <juergen@zdero.com>" + +#: FTimer.form:107 +msgid "ms" +msgstr "-" + +#: FTimer.form:120 +msgid "Or start and stop Timer" +msgstr "Of start en stop Timer" diff --git a/app/examples/Basic/Timer/.lang/ru.po b/app/examples/Basic/Timer/.lang/ru.po new file mode 100644 index 00000000..bf56ec24 --- /dev/null +++ b/app/examples/Basic/Timer/.lang/ru.po @@ -0,0 +1,114 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Basic/Timer/.project:20 app/examples/Basic/Timer/.src/FTimer.form:6 +msgid "Timer example" +msgstr "Пример таймера" + +#: app/examples/Basic/Timer/.src/FOtherTimer.class:16 +msgid "The counter is set to stop at 0 seconds!" +msgstr "Счётчик остановить установлен на 0 секунд!" + +#: app/examples/Basic/Timer/.src/FOtherTimer.class:44 +msgid "Stop" +msgstr "Стоп" + +#: app/examples/Basic/Timer/.src/FOtherTimer.class:49 app/examples/Basic/Timer/.src/FOtherTimer.class:62 app/examples/Basic/Timer/.src/FOtherTimer.form:13 app/examples/Basic/Timer/.src/FTimer.form:12 +msgid "Start" +msgstr "Начать" + +#: app/examples/Basic/Timer/.src/FOtherTimer.class:64 +msgid "Time is over!" +msgstr "Время вышло!" + +#: app/examples/Basic/Timer/.src/FOtherTimer.form:6 +msgid "Other Example" +msgstr "Другой пример" + +#: app/examples/Basic/Timer/.src/FOtherTimer.form:24 +msgid ":" +msgstr ":" + +#: app/examples/Basic/Timer/.src/FOtherTimer.form:35 +msgid "Another timer example by Maxim Lapis <maxim_lapis@web.de>" +msgstr "Ещё один пример таймера от Максима Ляписа <maxim_lapis@web.de>" + +#: app/examples/Basic/Timer/.src/FTimer.form:13 +msgid "Trigger" +msgstr "Триггер" + +#: app/examples/Basic/Timer/.src/FTimer.form:21 app/examples/Basic/Timer/.src/FTimer.form:22 +msgid "Reset" +msgstr "Сброс" + +#: app/examples/Basic/Timer/.src/FTimer.form:26 +msgid "1500" +msgstr "1500" + +#: app/examples/Basic/Timer/.src/FTimer.form:31 +msgid "Start Timer in..." +msgstr "Запустить таймер в..." + +#: app/examples/Basic/Timer/.src/FTimer.form:38 +msgid "" +"Start\n" +"delay" +msgstr "" +"Задержка\n" +"запуска" + +#: app/examples/Basic/Timer/.src/FTimer.form:44 +msgid "" +"Stop\n" +"delay" +msgstr "" +"Задержка\n" +"остановки" + +#: app/examples/Basic/Timer/.src/FTimer.form:49 +msgid "200" +msgstr "200" + +#: app/examples/Basic/Timer/.src/FTimer.form:54 +msgid "800" +msgstr "800" + +#: app/examples/Basic/Timer/.src/FTimer.form:63 +msgid "Start/Stop" +msgstr "Начать/Остановить" + +#: app/examples/Basic/Timer/.src/FTimer.form:70 +msgid "Timer example by Juergen Zdero <juergen@zdero.com>" +msgstr "Пример таймера от Юрген Здеро <juergen@zdero.com>" + +#: app/examples/Basic/Timer/.src/FTimer.form:74 app/examples/Basic/Timer/.src/FTimer.form:88 app/examples/Basic/Timer/.src/FTimer.form:92 +msgid "ms" +msgstr "мс" + +#: app/examples/Basic/Timer/.src/FTimer.form:84 +msgid "Or start and stop Timer" +msgstr "Или запустить и остановить таймер" + diff --git a/app/examples/Basic/Timer/.project b/app/examples/Basic/Timer/.project new file mode 100644 index 00000000..8be0e980 --- /dev/null +++ b/app/examples/Basic/Timer/.project @@ -0,0 +1,19 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.10.90 +Title=Timer example +Startup=FTimer +Icon=timer.png +Version=3.10.90 +VersionFile=1 +Component=gb.image +Component=gb.gui +Component=gb.form +Authors="Maxim Lapis" +TabSize=2 +Translate=1 +Language=fr +Maintainer=benoit +Vendor=Princeton +Address=benoit@localhost +License=General Public Licence +Packager=1 diff --git a/app/examples/Basic/Timer/.src/FOtherTimer.class b/app/examples/Basic/Timer/.src/FOtherTimer.class new file mode 100644 index 00000000..984d437b --- /dev/null +++ b/app/examples/Basic/Timer/.src/FOtherTimer.class @@ -0,0 +1,85 @@ +' Gambas class file + +'&HC00F47& = red +'&H4BC021& = green + +Private $iCounter As Integer + +Public Sub Button1_Click() + + Dim iSeconds, iMinutes As Integer + + iSeconds = vbSeconds.Value + iMinutes = vbMinutes.Value + + If iSeconds = 0 And iMinutes = 0 Then + Message.Info(("The counter is set to stop at 0 seconds!")) + Return + Endif + + If Not Timer1.enabled Then + + 'Normalize minutes and seconds + If iSeconds >= 60 Then + + While iSeconds > 59 + + Inc iMinutes + iSeconds = iSeconds - 60 + + Wend + + Endif + + 'Update normalized values + vbSeconds.Value = iSeconds + vbMinutes.Value = iMinutes + + 'Store the total count to simplify code + $iCounter = iSeconds + iMinutes * 60 + + 'Let the timer start! + Timer1.enabled = True + + Button1.Text = ("Stop") + Button1.Background = &HC00F47& + + Else + + Button1.Text = ("Start") + Button1.Background = &H4BC021& + Timer1.enabled = False + Endif + + 'thank you Benoit, that is just a great thing +End + +Public Sub Timer1_Timer() + + 'The counter has reached 0. Stop it and update the window + If $iCounter = 0 Then + Timer1.Enabled = False + Button1.Text = ("Start") + Button1.Background = &H4BC021& + Message.Info(("Time is over!")) + Else + + 'Seconds are over, decrease the minute count by 1 and reset the seconds count + If vbSeconds.Value = 0 Then + + Dec vbMinutes.Value + + vbSeconds.Value = 59 + + Else + + Dec vbSeconds.Value + + Endif + + Endif + + 'Also decrease the global counter + Dec $iCounter + +End diff --git a/app/examples/Basic/Timer/.src/FOtherTimer.form b/app/examples/Basic/Timer/.src/FOtherTimer.form new file mode 100644 index 00000000..ea90e61b --- /dev/null +++ b/app/examples/Basic/Timer/.src/FOtherTimer.form @@ -0,0 +1,40 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(52.7143,62.4286,32,18) + Background = &HB1C00E& + Text = ("Other Example") + Icon = Picture["timer.png"] + Resizable = False + { Button1 Button + MoveScaled(17,11,11,5) + Font = Font["14"] + Background = &H4BC021& + Text = ("Start") + } + { vbSeconds ValueBox + MoveScaled(10,11,6,5) + Font = Font["18"] + Background = &H93B8B0& + Value = "3" + } + { TextLabel2 TextLabel + MoveScaled(7,11,3,4) + Font = Font["Adobe Courier,18,Bold"] + Text = (":") + Alignment = Align.Center + } + { vbMinutes ValueBox + MoveScaled(1,11,6,5) + Font = Font["18"] + Background = &H93B8B0& + Value = "0" + } + { TextLabel1 TextLabel + MoveScaled(1,1,29,9) + Text = ("Another timer example by Maxim Lapis <maxim_lapis@web.de>") + } + { Timer1 #Timer + #MoveScaled(23,2) + } +} diff --git a/app/examples/Basic/Timer/.src/FTimer.class b/app/examples/Basic/Timer/.src/FTimer.class new file mode 100644 index 00000000..9400ca76 --- /dev/null +++ b/app/examples/Basic/Timer/.src/FTimer.class @@ -0,0 +1,56 @@ +' Gambas class file + +Public Sub Form_Open() + + FOtherTimer.Show + +End + +Public Sub Button1_Click() + + Timer1.Delay = CInt(TextBox1.Text) + Timer1.Enabled = True + +End + +Public Sub Timer1_Timer() + + Label1.Background = &HFF0000& + +End + +Public Sub Button2_Click() + + Timer1.Enabled = False 'try without this line + Label1.Background = &HDCDCDC& + +End + +Public Sub ToggleButton1_Click() + + If ToggleButton1.Value = True Then + Timer2.Delay = CInt(TextBox2.Text) 'low + Timer3.Delay = CInt(TextBox3.Text) 'high + Timer2.Enabled = True + Else + Timer2.Enabled = False + Timer3.Enabled = False + Endif + +End + +Public Sub Timer2_Timer() + + Label5.Background = &HFF0000& + Timer3.Enabled = True + Timer2.Enabled = False + +End + +Public Sub Timer3_Timer() + + Label5.Background = &H00FF00& + Timer2.Enabled = True + Timer3.Enabled = False + +End diff --git a/app/examples/Basic/Timer/.src/FTimer.form b/app/examples/Basic/Timer/.src/FTimer.form new file mode 100644 index 00000000..1f4cc961 --- /dev/null +++ b/app/examples/Basic/Timer/.src/FTimer.form @@ -0,0 +1,100 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(33.5714,24,57,40) + Expand = True + Text = ("Timer example") + Icon = Picture["timer.png"] + Resizable = False + Spacing = True + { Button1 Button + MoveScaled(35,14,20,4) + ToolTip = ("Start") + Text = ("Trigger") + } + { Label1 Label + MoveScaled(30,14,3.5714,4) + Border = Border.Etched + } + { Button2 Button + MoveScaled(14,14,14,4) + ToolTip = ("Reset") + Text = ("Reset") + } + { TextBox1 TextBox + MoveScaled(2,14,8,4) + Text = ("1500") + Alignment = Align.Right + } + { Label2 Label + MoveScaled(2,10,53,3) + Text = ("Start Timer in...") + Alignment = Align.Left + } + { Label3 Label + MoveScaled(2,24,11,8) + Foreground = &H00AA00& + Expand = True + Text = ("Start\ndelay") + Alignment = Align.Left + } + { Label4 Label + MoveScaled(15,24,13,8) + Foreground = &HFF0000& + Text = ("Stop\ndelay") + Alignment = Align.Left + } + { TextBox2 TextBox + MoveScaled(2,33,8,4) + Text = ("200") + Alignment = Align.Right + } + { TextBox3 TextBox + MoveScaled(14,33,8,4) + Text = ("800") + Alignment = Align.Right + } + { Label5 Label + MoveScaled(29,33,3.5714,4) + Border = Border.Etched + } + { ToggleButton1 ToggleButton + MoveScaled(34,33,21,4) + Text = ("Start/Stop") + } + { Timer2 #Timer + #MoveScaled(36,1) + } + { TextLabel1 TextLabel + MoveScaled(2,1,33,6) + Text = ("Timer example by Juergen Zdero <juergen@zdero.com>") + } + { Label6 Label + MoveScaled(10,14,4,4) + Text = ("ms") + } + { Separator1 Separator + MoveScaled(2,9,53,1) + } + { Separator2 Separator + MoveScaled(2,18,53,3) + } + { Label7 Label + MoveScaled(2,21,53,3) + Text = ("Or start and stop Timer") + } + { Label8 Label + MoveScaled(10,33,4,4) + Text = ("ms") + } + { Label9 Label + MoveScaled(22,33,4,4) + Text = ("ms") + } + { Timer1 #Timer + #MoveScaled(41,1) + } + { Timer3 #Timer + #MoveScaled(45,1) + } +} diff --git a/app/examples/Basic/Timer/timer.png b/app/examples/Basic/Timer/timer.png new file mode 100644 index 0000000000000000000000000000000000000000..6708fdd27788c95fe589ee232dff093831b8041a GIT binary patch literal 2778 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 literal 0 HcmV?d00001 diff --git a/app/examples/Control/ArrayOfControls/.directory b/app/examples/Control/ArrayOfControls/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/app/examples/Control/ArrayOfControls/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/app/examples/Control/ArrayOfControls/.icon.png b/app/examples/Control/ArrayOfControls/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..cc422dcf5e94a28456f006d4ef0f5368a1fc4a81 GIT binary patch literal 4209 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\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: .project:1 +msgid "Array of Controls" +msgstr "Matriu de controls" + +#: FMain.class:70 +msgid "Clear" +msgstr "Neteja" + +#: FMain.class:112 +msgid "Dial" +msgstr "Marcador" + +#: FMain.class:80 +msgid "Dialing " +msgstr "Marcant" + +#: .project:2 +msgid "Example how to use an array of controls" +msgstr "Exemple de com fer servir una matriu de controls" + +#: FMain.class:8 +msgid "Quit" +msgstr "Surt" + +#: FMain.class:78 +msgid "There is no number I could dial." +msgstr "No hi ha cap número que pugui marcar." + +#: FMain.class:45 +msgid "You have clicked the button &1" +msgstr "Heu fet clic al botó &1" + diff --git a/app/examples/Control/ArrayOfControls/.lang/cs.po b/app/examples/Control/ArrayOfControls/.lang/cs.po new file mode 100644 index 00000000..8d01fbca --- /dev/null +++ b/app/examples/Control/ArrayOfControls/.lang/cs.po @@ -0,0 +1,44 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Array of Controls" +msgstr "Řízení pole" + +#: .project:2 +msgid "Example how to use an array of controls" +msgstr "Příklad jak použít řízení pole" + +#: FMain.class:8 +msgid "Quit" +msgstr "Ukončit" + +#: FMain.class:45 +msgid "You have clicked the button &1" +msgstr "Kliknul si na tlačítko &1" + +#: FMain.class:70 +msgid "Clear" +msgstr "Vyčsti" + +#: FMain.class:78 +msgid "There is no number I could dial." +msgstr "Toto není číslo, nelze volat." + +#: FMain.class:80 +msgid "Dialing " +msgstr "Vytáčení " + +#: FMain.form:25 +msgid "Dial" +msgstr "Vytočit" diff --git a/app/examples/Control/ArrayOfControls/.lang/de.po b/app/examples/Control/ArrayOfControls/.lang/de.po new file mode 100644 index 00000000..9ce0bab0 --- /dev/null +++ b/app/examples/Control/ArrayOfControls/.lang/de.po @@ -0,0 +1,44 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Array of Controls" +msgstr "Steuerelement-Array" + +#: .project:2 +msgid "Example how to use an array of controls" +msgstr "Beispiel, wie man einen Array von Steuerelementen benutzt" + +#: FMain.class:8 +msgid "Quit" +msgstr "Beenden" + +#: FMain.class:45 +msgid "You have clicked the button &1" +msgstr "Du hast die Taste &1 angeklickt" + +#: FMain.class:70 +msgid "Clear" +msgstr "Löschen" + +#: FMain.class:78 +msgid "There is no number I could dial." +msgstr "Es gibt keine Nummer zum Wählen." + +#: FMain.class:80 +msgid "Dialing " +msgstr "Wähle " + +#: FMain.form:25 +msgid "Dial" +msgstr "Wählen" diff --git a/app/examples/Control/ArrayOfControls/.lang/nl.po b/app/examples/Control/ArrayOfControls/.lang/nl.po new file mode 100644 index 00000000..d2b10fc5 --- /dev/null +++ b/app/examples/Control/ArrayOfControls/.lang/nl.po @@ -0,0 +1,43 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: ArrayOfControls 3.5.90\n" +"PO-Revision-Date: 2014-10-02 15:13 UTC\n" +"Last-Translator: Willy Raets \n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Array of Controls" +msgstr "Reeks van controles" + +#: .project:2 +msgid "Example how to use an array of controls" +msgstr "Voorbeeld in hoe een 'Reeks van controles' te gebruiken" + +#: FMain.form:25 +msgid "Dial" +msgstr "Draai" + +#: FMain.class:8 +msgid "Quit" +msgstr "Afsluiten" + +#: FMain.class:45 +msgid "You have clicked the button &1" +msgstr "Je hebt op de knop &1 geklikt" + +#: FMain.class:70 +msgid "Clear" +msgstr "Opschonen" + +#: FMain.class:78 +msgid "There is no number I could dial." +msgstr "Er is geen nummer wat ik kan draaien" + +#: FMain.class:80 +msgid "Dialing " +msgstr "Nummer kiezen" + diff --git a/app/examples/Control/ArrayOfControls/.lang/ru.po b/app/examples/Control/ArrayOfControls/.lang/ru.po new file mode 100644 index 00000000..2328b02d --- /dev/null +++ b/app/examples/Control/ArrayOfControls/.lang/ru.po @@ -0,0 +1,58 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Control/ArrayOfControls/.project:19 +msgid "Array of Controls" +msgstr "Массив элементов управления" + +#: app/examples/Control/ArrayOfControls/.project:20 +msgid "Example how to use an array of controls" +msgstr "Пример использования массива элементов управления" + +#: app/examples/Control/ArrayOfControls/.src/FMain.class:8 app/examples/Control/ArrayOfControls/.src/FMain.class:68 +msgid "Quit" +msgstr "Выход" + +#: app/examples/Control/ArrayOfControls/.src/FMain.class:45 +msgid "You have clicked the button &1" +msgstr "Вы нажали кнопку &1" + +#: app/examples/Control/ArrayOfControls/.src/FMain.class:70 +msgid "Clear" +msgstr "Очистить" + +#: app/examples/Control/ArrayOfControls/.src/FMain.class:78 +msgid "There is no number I could dial." +msgstr "Нет номера для набора." + +#: app/examples/Control/ArrayOfControls/.src/FMain.class:80 +msgid "Dialing " +msgstr "Набор номера " + +#: app/examples/Control/ArrayOfControls/.src/FMain.form:18 +msgid "Dial" +msgstr "Набрать" + diff --git a/app/examples/Control/ArrayOfControls/.project b/app/examples/Control/ArrayOfControls/.project new file mode 100644 index 00000000..ac6590b4 --- /dev/null +++ b/app/examples/Control/ArrayOfControls/.project @@ -0,0 +1,18 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.5.90 +Title=Array of Controls +Startup=FMain +Icon=phone.png +Version=3.6.2 +VersionFile=1 +Component=gb.image +Component=gb.gui +Component=gb.form +Description="Example how to use an array of controls" +Authors="Matti (math.eber@t-online.de)" +TabSize=2 +Translate=1 +Language=de +ControlPublic=1 +SourcePath=/home/mathias/Basic +Packager=1 diff --git a/app/examples/Control/ArrayOfControls/.src/FMain.class b/app/examples/Control/ArrayOfControls/.src/FMain.class new file mode 100644 index 00000000..3f90faa8 --- /dev/null +++ b/app/examples/Control/ArrayOfControls/.src/FMain.class @@ -0,0 +1,83 @@ +' Gambas class file + +Private aButtons[13] As Button ' Dim the array of controls + +Public Sub Form_Open() + Dim i As Integer + + btnClose.Tooltip = ("Quit") + Me.Center + For i = 1 To 12 + aButtons[i] = New Button(Me) As "Buttongroup" ' Create a new button in the array and store it in an action group + With aButtons[i] + .X = (i - Int((i - 1) / 3) * 3) * 60 - 30 + .Y = Int((i - 1) / 3) * 60 + 170 + .Width = 42 + .Height = 42 + .Font.Grade = 5 + If i = 10 Then + .Text = "*" + Else If i = 11 Then + .Text = "0" + Else If i = 12 Then + .Text = "#" + Else + .Text = i + Endif + End With + Next + +End + + +Public Sub Buttongroup_Click() ' This is an event of the action group. This event is fired if any of the buttons is clicked + ' You see a list of available events if you type "Buttongroup_" +' Dim w As Integer + + tbNumber.Text = tbNumber.Text & Last.Text ' find out with LAST which button was clicked and hand its text over to TextBox + + ' w = Last.Width ' this would return the width of the last button + ' Print w +End + +Public Sub Buttongroup_Menu() ' Another event of the action group: Right-click on any of the buttons + + Message.Info(Subst(("You have clicked the button &1"), Last.Text)) + +End + +Public Sub btnClose_Click() + + If tbNumber.Text = "" Then + Me.Close + Else + tbNumber.Text = "" + Endif + +End + +Public Sub Form_KeyPress() + + If Key.code = Key.Esc Then Me.Close + +End + +Public Sub tbNumber_Change() + + If tbNumber.Text = "" Then + btnClose.Tooltip = ("Quit") + Else + btnClose.Tooltip = ("Clear") + Endif + +End + +Public Sub btnDial_Click() + + If tbNumber.Text = "" Then + Message.Warning(("There is no number I could dial.")) + Else + Message.Info(("Dialing ") & tbNumber.Text) + Endif + +End diff --git a/app/examples/Control/ArrayOfControls/.src/FMain.form b/app/examples/Control/ArrayOfControls/.src/FMain.form new file mode 100644 index 00000000..a4d87f51 --- /dev/null +++ b/app/examples/Control/ArrayOfControls/.src/FMain.form @@ -0,0 +1,25 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,32,61) + Background = &H525252& + Icon = Picture["Phone,.png"] + Resizable = False + Utility = True + { tbNumber TextBox + MoveScaled(3,5,26,6) + Font = Font["Bold,+4"] + Background = &HBBBFB7& + Alignment = Align.Right + ReadOnly = True + } + { btnDial Button + MoveScaled(3,15,12,6) + ToolTip = ("Dial") + Picture = Picture["green.png"] + } + { btnClose Button + MoveScaled(17,15,12,6) + Picture = Picture["red.png"] + } +} diff --git a/app/examples/Control/ArrayOfControls/green.png b/app/examples/Control/ArrayOfControls/green.png new file mode 100644 index 0000000000000000000000000000000000000000..930782f8a6a9d45d5f7703e9bd31a7cb1bde4341 GIT binary patch literal 873 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0VAK!r32_B-8R{7r)`8Im28LA( z4C@&ffD9msjDR8=85q{UlmVrHT!;dQ;IAt7$OemBAX9q z17#s@fT#!BvKnR)kOAZ(%L3H^&ELtuFcGF^F_;0g4z3JhGQ@)rHqZ))OCVf`+kgtT zfyIGRKsLl=h)STZVHyo%@>qbLN+}8Q3ua(auGqxvaO}J6;eSv1os@zep9uT*GWv>) znS{rmPtA;bu6YYQ`@2JI-n-imOD?}S{YL1*7CV3QpRp#DJZB*Ed{Z8_YK>NIKf}{qOvPZ`2wEK0f((GVPi5?%+-x&PB($_13$KoY0(a ze_-yUBle8@*WZ`tVJxy(q;YY@B9}u(0$jKLZnRjSR`s7#wBvZrKb0*Z_cuFvIUA*Y zUT%DDfzeAn!5;n(#Y*QMe`sBhnvwBCf1%=$qL0j)r=GdF9iQXE_2KnHmIYiU>z>;g zzGPq#Wo&dg!Ffvj%Navc+spncDIHH7XJnM+?K{D>i|Z=q@7G7c

z=MHo6Vej zy?puSWNC@(6N}}ezHcm#m-&9RI6m%I`QLg*+raF3+@4E6fbxu|tDnm{r-UW|-zYu- literal 0 HcmV?d00001 diff --git a/app/examples/Control/ArrayOfControls/green1.png b/app/examples/Control/ArrayOfControls/green1.png new file mode 100644 index 0000000000000000000000000000000000000000..3008e150da0d1f25b311fe7740bbdd0f2f46c0be GIT binary patch literal 1548 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 KMNUMnLSTY~xpcY! literal 0 HcmV?d00001 diff --git a/app/examples/Control/ArrayOfControls/red.png b/app/examples/Control/ArrayOfControls/red.png new file mode 100644 index 0000000000000000000000000000000000000000..19a5c61a361c0c7b1c17c1f926e96600fed650da GIT binary patch literal 1452 zcmV;d1ylNoP)0~Q;-*1~xMXUgPMx>~7sPDF&B&BQe3=BkNE{!g&KP52 zbWt}Yl5G*mlr1LUOQLge%g8dfsTs@EEx>b5dHNJOUJ8tt(muBz?t^rtEv@^1JLg>Y z{lDI?>jV?PUfz`P_Kce&%LAS03=BnDO0j*Bqk*Y`?{%?lB6o-JJ~nv6IX>Ft_P~t@ zfo3E_Z(vH~AQs^aT5(x<{1Cp2pHvx|lmd~K1I%x-9ZPXJ2C+NxS3FapHpJPCwhHwD z-k&iT`7l;T-ck~rj(i6{ta5rHUQw_n=dprV&|l*(HQw7~YVQS?UxXgAIvsVcEcjf` zi#ajpRL+m~Cr^!y9@@IOHs^Sr$m=<4dbn~znh(Qa+UmTk;OjYubIugpbMiunMzwrZ z&hDI8yRd6D2DW)!?o3O$>%Y%)aG5ell^ytClO+6d)y zHszcsIGwX$G)?a=$)D?H#YBk@GQGx%8V?mbTjNYlf6lQQy9;i4k!&A}bADeWjz)vU zlvQw!mInQ}EU=-StyggJQsmuyqRAKVLChLOWGL`_Lq;NAG;8ScoShdZR? zc)G%`FGZfSyvBV^euGtGki*%s9JklFzKeZLeue?8Xk$qzFYFD>#^<|u;1c9t4y=z{ zb-szjF{9&TWNx4hf5aCDsI;;h3-Gn9;1-GeK!q2^BJSbpf^XtpT;&4!N&E*p(JO_r zJ8~FvGp2>qJ62}A%^=jwC)ssB`%_et~7-g2l%pzY9DvkDU$X zMwVbRuEl(*WsCF$c6BDpMYaUi1g@#Xlz1YQj->r-(8u!DMlUUM%E@(tX-8O(j}MzzLy@Oid2qBm z*-Ud2TN_MkQm?Wjj4}zQaz&F@0|OOFn>R-m%^4)#g$}e5Q6Qdzg zX-VfgQOP1tmPAWi$}MIAJ%L|IwSGcsoihVdOW6)AzHgl6WGwX4KFDVF57o5V@$S$;JsiR$9=1PB)2U>V4q_9jF4ZzZH|HS^7rrN`SwF|j_ z{;;Mp84RRx{FT!ByI%7#XLGrb#DX8xnO?rXK4)DoGxlC$jUNwr+BLV896e(ReLH6$ zr!QyC|4TL;kx-)}=johg&Ypa%U2{K6i?k2MoKrP69ipT0IxH{vSivK;bmyTOUmf>A zgN}l&d0HMD-P~1Y*)g)7NhorV_8PYpZdu@m8RK6=uUrBt0Er>X!?mG-tK6jx8PjzU+!;r4~K>eI8N?Z>#d~cy~`K zxeBg}d@3>{V|L^{=nl+?9L2vPkK=DGy!>O%et*oJHQ~QVLJ-N|?SZ}k0000O3 literal 0 HcmV?d00001 diff --git a/app/examples/Control/ArrayOfControls/red1.png b/app/examples/Control/ArrayOfControls/red1.png new file mode 100644 index 0000000000000000000000000000000000000000..3cbb165d0469195eb69054977ea2a7c057924b2a GIT binary patch literal 1571 zcmV+;2Hg3HP)W)p+=2A+QCKSEUqf=YkVSd7dBy2;Fd@mLSzP`rOJ`WA^fw213kPQC}14z3v7giMq~M~ zue3D4#)5|nz8JYSFo_~E8kj9r=CCZXp}A?~cwk=(Pqnf4*PMJTtz8_zq~ualYCME* zM7CiHFG=2w1omYVZ5*9s6~-br7Tks{k&lN2=p8)S!fy`n#(iZp7LCAlgnevkup2jG zdElAAAC~e82D(zX&&d#>n>b9%C>;$tB6qiNU*zscXJCKekse+R6bqd_C&&3fmEYAU zYSe4|_$2RZrsr}bXH(Aia^A{`IeT;NkMH5QCkdzNtns5NMNVJNgJ)QKnReeLCuytk znJR~?6jcTXxbuvAbv9ODhWAHq2BReb8bY<);_j+jwZ^Cib_VeY)S8+2|mY{Hs?V5jE z%4=!4=4xD964+M)FL&|e5YMzRSZ6;DN4hEvHWzFNj8%B$8YUv4#-sQe*2VJ?5z@~j zPGce@?ysOXur|`=!n(K<+ouzO?JhVInG5t*ur8#YGZ<6u98c7G$9&^WuLGy>=Zrlo zd3J)?nPhQwq`Tnr_-3R#oCgir~Z?HP>1*|~~RGLvLSU*AksnkzYupCPR^%bdOY9*gxIC3_of||@| z#dN{5oxHKwQCrVYoxET)QVB^X3+Y(=1CPVK(u=j=+kHH6ews z6&)F0YS3|!v))-G@2?H1DXlB@H=uil`^(6lAt9V8A52WJ>I{=h*c!-U%3(`0m*u*h ztC(I4Kv{jgQd*nRTJ8~InjI9$cB4|^?b%e3-B`DUV>MnV_$XEc#w4Wzvys>9sV3eN z#7qLYJF=@BUfLpUA%Q3Y`53LI`4C1cjWkB>$Bhkk;MMiKaGawVm4cNGiY(FYOklPr z>0BTYql`}TM1wsT4pf$KszLWv{HvYu6ZC{cW~VArv789Bws3Wcb~5s2aCuU$pGCF2 z=F3~nn;O?dt`8i@ddV{mMOq8)8RDjSn_V$!)9eJ8H&*a2@ zes((1^o60yc`WBx&Qu?N=}(9+dFojx18lDI^_(MBCaV18Bq0h$XD0BXJo~Geg<*7k#TG(MPkTKdvxNDBbu_>mCeFo3Q)JFRvqZxA> z7kuf|*_yGs!LEXP12@Oi|M#xrfpNyy%+p!)xYrXe+#dN{U1E-OOXRuR^eok zyqdsvsZp&7+!~n;yoMk2@~37|&M(f3^35w`*U{ZblyG}wM@*?$Id9pV)bkrL@%?CI zJWDP6k3H#h#R;kJFO*9ryg}B^aD((!vppo*UXS*W4pIZJg+#$aIMiDnvv?6h{{^I3 VY5ioD5IFz<002ovPDHLkV1nS={i^@~ literal 0 HcmV?d00001 diff --git a/app/examples/Control/Embedder/.directory b/app/examples/Control/Embedder/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/app/examples/Control/Embedder/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/app/examples/Control/Embedder/.icon.png b/app/examples/Control/Embedder/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b6e995d784509d051e5a749b038edd8d78f83985 GIT binary patch literal 4242 zcmV;D5N+>?P)H3eCIOjBVO z-3*tj0CVnt11%KVgJqQ&JaS(JRplAHbOhcw0geN^n&8@+e75#2q-fJNlu~^8?sC3* z_Z+_Xy+ds6JU*@8`m++C@^5ybJr}K^C_BKn?kVT?Rr$Qu3_pDx%+#5_DcfVvk_7Wh zSi3Bb$L^oUsXm)qzIBwQlQEEi%S(WHU)qV*kQwŸ}f>-9zK>xJ*W1^sbw+%tVo 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, 2007-2010. +# +# +msgid "" +msgstr "" +"Project-Id-Version: Embedder\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2011-03-20 17:28+0100\n" +"Last-Translator: Jordi Sayol \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: .project:1 +msgid "Embedder" +msgstr "Incrustador" + +#: FMain.class:18 +msgid "Window not found!" +msgstr "Finestra no trobada." + +#: FMain.class:21 +msgid "Several windows found. I take the first one!" +msgstr "Diverses finestres trobades. Agafo la primera." + +#: FMain.class:60 +msgid "Embed error" +msgstr "Error d'Incrustat" + +#: FMain.class:106 +msgid "Desktop application embedder" +msgstr "Incrustador d'aplicació d'escriptori" + +#: FMain.class:120 +msgid "Window title" +msgstr "Títol de la finestra" + +#: FMain.class:125 +msgid "Enter there the title of the window you want to embed." +msgstr "Introduïu el títol de la finestra que voleu incrustar." + +#: FMain.class:132 +msgid "" +"Click on the Embed button to search the window whose title \n" +"is specified in the left field, and to embed it in the \n" +"blue rectangle below." +msgstr "" +"Feu clic al botó Incrusta per cercar la finestra, el títol de la qual \n" +"està especificat al camp de l'esquerra, i per incrustar a dins \n" +"del rectangle blau de sota." + +#: FMain.class:133 +msgid "&Embed" +msgstr "&Incrusta" + +#: FMain.class:140 +msgid "Click on the Discard button to free the application window from its jail." +msgstr "Feu clic al botó Descarta per alliberar la finestra de l'aplicació de la seva presó." + +#: FMain.class:141 +msgid "&Discard" +msgstr "&Descarta" + diff --git a/app/examples/Control/Embedder/.lang/cs.po b/app/examples/Control/Embedder/.lang/cs.po new file mode 100644 index 00000000..15a28af1 --- /dev/null +++ b/app/examples/Control/Embedder/.lang/cs.po @@ -0,0 +1,62 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Embedder" +msgstr "ZapoÅ¡těč" + +#: FMain.class:20 +msgid "Window not found!" +msgstr "Okno nenalezeno!" + +#: FMain.class:23 +msgid "Several windows found. I take the first one!" +msgstr "Nalezeno několik obek. Beru první!" + +#: FMain.class:62 +msgid "Embed error" +msgstr "Chyba zapuÅ¡tění" + +#: FMain.form:15 +msgid "Desktop application embedder" +msgstr "Aplikace zapuÅ¡těna" + +#: FMain.form:29 +msgid "Window title" +msgstr "Titulek okna" + +#: FMain.form:34 +msgid "Enter there the title of the window you want to embed." +msgstr "Zde zadejte název okna, které chcete zapustit." + +#: FMain.form:40 +msgid "" +"Click on the Embed button to search the window whose title \n" +"is specified in the left field, and to embed it in the \n" +"blue rectangle below." +msgstr "" +"Klikněte na tlačítko Zapustit pro vyhledávání okna, jehož název\n" +"je uvedené v levém poli, a zapuÅ¡těno bude do\n" +"modrého obdélníku níže." + +#: FMain.form:41 +msgid "&Embed" +msgstr "Za&pustit" + +#: FMain.form:48 +msgid "Click on the Discard button to free the application window from its jail." +msgstr "Klikněte na ZruÅ¡it a okno aplikace bude uvolněno." + +#: FMain.form:49 +msgid "&Discard" +msgstr "&ZruÅ¡it" diff --git a/app/examples/Control/Embedder/.lang/de.po b/app/examples/Control/Embedder/.lang/de.po new file mode 100644 index 00000000..4036899c --- /dev/null +++ b/app/examples/Control/Embedder/.lang/de.po @@ -0,0 +1,59 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Embedder" +msgstr "-" + +#: FMain.class:20 +msgid "Window not found!" +msgstr "Fenster nicht gefunden!" + +#: FMain.class:23 +msgid "Several windows found. I take the first one!" +msgstr "Mehrere Fenster gefunden. Ich nehme das erste!" + +#: FMain.class:62 +msgid "Embed error" +msgstr "Fehler beim Einbinden" + +#: FMain.form:15 +msgid "Desktop application embedder" +msgstr "Desktop-Anwendungs-Einbinder" + +#: FMain.form:29 +msgid "Window title" +msgstr "Fenstertitel" + +#: FMain.form:34 +msgid "Enter there the title of the window you want to embed." +msgstr "Geben Sie hier den Titel des Fensters ein, das Sie einbinden wollen." + +#: FMain.form:40 +msgid "" +"Click on the Embed button to search the window whose title \n" +"is specified in the left field, and to embed it in the \n" +"blue rectangle below." +msgstr "Klicken Sie auf die Einbetten Schaltfläche, um das Fenster, dessen Titel im linken Feld angegeben ist, zu suchen und es im blauen Rechteck unten einzubetten." + +#: FMain.form:41 +msgid "&Embed" +msgstr "&Einbinden" + +#: FMain.form:48 +msgid "Click on the Discard button to free the application window from its jail." +msgstr "Klicken Sie auf die Lösen Schaltfläche, um das Anwendungsfenster aus der Anbindung zu lösen." + +#: FMain.form:49 +msgid "&Discard" +msgstr "&Lösen" diff --git a/app/examples/Control/Embedder/.lang/es.po b/app/examples/Control/Embedder/.lang/es.po new file mode 100644 index 00000000..f3386436 --- /dev/null +++ b/app/examples/Control/Embedder/.lang/es.po @@ -0,0 +1,57 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: FMain.form:50 +msgid "&Discard" +msgstr "&Retornar" + +#: FMain.form:42 +msgid "&Embed" +msgstr "&Empotrar" + +#: FMain.form:49 +msgid "Click on the Discard button to free the application window from its jail." +msgstr "Haga click en el botón Retornar para liberar la ventana de la aplicación de su jaula." + +#: FMain.form:41 +msgid "Click on the Embed button to search the window whose title \nis specified in the left field, and to embed it in the \nblue rectangle below." +msgstr "Haga click en el botón Empotrar para buscar la ventana cuyo título \nha especificado en el campo de la izquierda \ncon el fin de empotrarla en el rectángulo azul de abajo. " + +#: FMain.form:15 +msgid "Desktop application embedder" +msgstr "Empotrador de aplicaciones de escritorio" + +#: FMain.class:60 +msgid "Embed error" +msgstr "Error de empotrado" + +#: .project:1 +msgid "Embedder" +msgstr "Empotrador" + +#: FMain.form:34 +msgid "Enter there the title of the window you want to embed." +msgstr "Introduzca el título de la ventana que desea empotrar." + +#: FMain.class:21 +msgid "Several windows found. I take the first one!" +msgstr "Multiples ventanas encontradas. ¡Usando la primera!" + +#: FMain.class:18 +msgid "Window not found!" +msgstr "¡Ventana no encontrada!" + +#: FMain.form:29 +msgid "Window title" +msgstr "Título de la ventana" + diff --git a/app/examples/Control/Embedder/.lang/nl.po b/app/examples/Control/Embedder/.lang/nl.po new file mode 100644 index 00000000..65b6f4f0 --- /dev/null +++ b/app/examples/Control/Embedder/.lang/nl.po @@ -0,0 +1,55 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Embedder 3.5.90\n" +"PO-Revision-Date: 2014-10-02 15:16 UTC\n" +"Last-Translator: Willy Raets \n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Embedder" +msgstr "-" + +#: FMain.form:15 +msgid "Desktop application embedder" +msgstr "Desktop applicatie embedder" + +#: FMain.form:29 +msgid "Window title" +msgstr "Venster titel" + +#: FMain.form:34 +msgid "Enter there the title of the window you want to embed." +msgstr "Voer hier de titel in van het venster dat je wilt embedden." + +#: FMain.form:40 +msgid "Click on the Embed button to search the window whose title \nis specified in the left field, and to embed it in the \nblue rectangle below." +msgstr "Klik op de Embed knop om het venster te zoeken wiens titel\ngespecificieerd is in het linker veld en om het te embedden in\n de blauwe rechthoek beneden." + +#: FMain.form:41 +msgid "&Embed" +msgstr "-" + +#: FMain.form:48 +msgid "Click on the Discard button to free the application window from its jail." +msgstr "Klik op de Uitsluiten knop op het applicatievenster uit zijn gevangenis te bevrijden." + +#: FMain.form:49 +msgid "&Discard" +msgstr "&Uitsluiten" + +#: FMain.class:20 +msgid "Window not found!" +msgstr "Venster niet gevonden!" + +#: FMain.class:23 +msgid "Several windows found. I take the first one!" +msgstr "Verschillende vensters gevonden. Ik gebruik het eerste!" + +#: FMain.class:62 +msgid "Embed error" +msgstr "Embed fout" + diff --git a/app/examples/Control/Embedder/.lang/ru.po b/app/examples/Control/Embedder/.lang/ru.po new file mode 100644 index 00000000..1e436589 --- /dev/null +++ b/app/examples/Control/Embedder/.lang/ru.po @@ -0,0 +1,77 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-28 09:00+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Control/Embedder/.project:21 +msgid "Embedder" +msgstr "Встраиватель" + +#: app/examples/Control/Embedder/.project:22 app/examples/Control/Embedder/.src/FMain.form:5 +msgid "Desktop application embedder" +msgstr "Встраиватель для приложения рабочего стола" + +#: app/examples/Control/Embedder/.src/FMain.class:20 +msgid "Window not found!" +msgstr "Окно не найдено!" + +#: app/examples/Control/Embedder/.src/FMain.class:23 +msgid "Several windows found. I take the first one!" +msgstr "Найдено несколько окон. Будет взято первое!" + +#: app/examples/Control/Embedder/.src/FMain.class:62 +msgid "Embed error" +msgstr "Ошибка встраивания" + +#: app/examples/Control/Embedder/.src/FMain.class:86 +msgid "Process_Kill" +msgstr "Процесс убийства" + +#: app/examples/Control/Embedder/.src/FMain.form:17 +msgid "Window title" +msgstr "Заголовок окна" + +#: app/examples/Control/Embedder/.src/FMain.form:21 +msgid "Enter there the title of the window you want to embed." +msgstr "Введите там заголовок окна, которое вы хотите встроить." + +#: app/examples/Control/Embedder/.src/FMain.form:26 +msgid "" +"Click on the Embed button to search the window whose title \n" +"is specified in the left field, and to embed it in the \n" +"blue rectangle below." +msgstr "Нажать кнопку Встроить, чтобы найти окно, заголовок которого указан в левом поле, и встроить его в синий прямоугольник ниже." + +#: app/examples/Control/Embedder/.src/FMain.form:27 +msgid "&Embed" +msgstr "Встроить" + +#: app/examples/Control/Embedder/.src/FMain.form:33 +msgid "Click on the Discard button to free the application window from its jail." +msgstr "Нажать кнопку Отказаться, чтобы освободить окно приложения из захвата." + +#: app/examples/Control/Embedder/.src/FMain.form:34 +msgid "&Discard" +msgstr "Отказаться" + diff --git a/app/examples/Control/Embedder/.project b/app/examples/Control/Embedder/.project new file mode 100644 index 00000000..38b4c637 --- /dev/null +++ b/app/examples/Control/Embedder/.project @@ -0,0 +1,20 @@ +# Gambas Project File 3.0 +Title=Embedder +Description="Desktop application embedder" +Startup=FMain +Icon=embedder.png +Version=3.13.90 +VersionFile=1 +Component=gb.image +Component=gb.gui +Component=gb.form +Component=gb.desktop +Environment="GB_GUI=gb.gtk3" +TabSize=2 +Translate=1 +Language=fr +Maintainer=benoit +Vendor=Princeton +Address=benoit@localhost +License=General Public Licence +Packager=1 diff --git a/app/examples/Control/Embedder/.src/FMain.class b/app/examples/Control/Embedder/.src/FMain.class new file mode 100644 index 00000000..1c3ed8f3 --- /dev/null +++ b/app/examples/Control/Embedder/.src/FMain.class @@ -0,0 +1,89 @@ +' Gambas class file + +Public Sub btnEmbed_Click() + + Dim sTitle As String + Dim aHandle As Integer[] + Dim iHandle As Integer + + sTitle = Trim(txtTitle.Text) + If Not sTitle Then Return + + If Left(sTitle, 2) = "0x" Then + iHandle = Val("&" & Mid$(sTitle, 3)) + Else If Left(sTitle) = "&" Then + iHandle = Val(sTitle) + Else +' aHandle = Desktop.FindWindow(Trim(txtTitle.Text)) + aHandle = Desktop.FindWindow(txtTitle.Text) + If aHandle.Count = 0 Then + Message.Warning(("Window not found!")) + Return + Else If aHandle.Count >= 2 Then + Message(("Several windows found. I take the first one!")) + Endif + iHandle = aHandle[0] + Endif + + Try embEmbedder.Embed(iHandle) + If Error Then Message.Warning(Error.Text) + +End + +Public Sub embEmbedder_Embed() + + btnEmbed.Enabled = False + btnDiscard.Enabled = True + +End + +Public Sub btnDiscard_Click() + + embEmbedder.Discard + embEmbedder_Close + +End + +Public Sub embEmbedder_Close() + + btnEmbed.Enabled = True + btnDiscard.Enabled = False + +End + +Public Sub Form_Open() + + lblID.Text = "&" & Hex$(embEmbedder.Id) + +End + +Public Sub embEmbedder_Error() + + Message.Error(("Embed error")) + +End + + +Public Sub Process_Read() + + Dim sStr As String + + 'READ #LAST, sStr, Lof(LAST) + Line Input #Last, sStr + Print "\t"; sStr + +End + +Public Sub Process_Error(sStr As String) + + Print "\t"; sStr; + If Right(sStr) <> "\n" Then Print + +End + +Public Sub Process_Kill() + + Print ("Process_Kill") + Print Last.State;; Last.Value + +End diff --git a/app/examples/Control/Embedder/.src/FMain.form b/app/examples/Control/Embedder/.src/FMain.form new file mode 100644 index 00000000..40465f3d --- /dev/null +++ b/app/examples/Control/Embedder/.src/FMain.form @@ -0,0 +1,54 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(32.7143,25,84,60) + Text = ("Desktop application embedder") + Icon = Picture["embedder.png"] + Arrangement = Arrange.Vertical + { Panel1 Panel + MoveScaled(0,0,82,6) + Arrangement = Arrange.Horizontal + Spacing = True + Margin = True + { Label1 Label + MoveScaled(2,1,16,4) + Font = Font["Bold"] + AutoResize = True + Text = ("Window title") + } + { txtTitle TextBox + MoveScaled(19,1,17,4) + ToolTip = ("Enter there the title of the window you want to embed.") + Expand = True + } + { btnEmbed Button + MoveScaled(37,1,14,4) + ToolTip = ("Click on the Embed button to search the window whose title \nis specified in the left field, and to embed it in the \nblue rectangle below.") + Text = ("&Embed") + Default = True + } + { btnDiscard Button + MoveScaled(52,1,14,4) + Enabled = False + ToolTip = ("Click on the Discard button to free the application window from its jail.") + Text = ("&Discard") + } + { lblID Label + MoveScaled(69,1,11,4) + Visible = False + Alignment = Align.Center + Border = Border.Sunken + } + } + { Panel2 Panel + MoveScaled(3,8,67,43) + Background = &H9FCFFF& + Expand = True + Arrangement = Arrange.Fill + Padding = 4 + { embEmbedder Embedder + MoveScaled(8,8,35,25) + Expand = True + } + } +} diff --git a/app/examples/Control/Embedder/embedder.png b/app/examples/Control/Embedder/embedder.png new file mode 100644 index 0000000000000000000000000000000000000000..fa90352044e39b15665b1fdc476fb55faa601013 GIT binary patch literal 2623 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 literal 0 HcmV?d00001 diff --git a/app/examples/Control/HighlightEditor/.directory b/app/examples/Control/HighlightEditor/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/app/examples/Control/HighlightEditor/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/app/examples/Control/HighlightEditor/.hidden/screenshots/2014-12-17.png b/app/examples/Control/HighlightEditor/.hidden/screenshots/2014-12-17.png new file mode 100644 index 0000000000000000000000000000000000000000..9db951a333c6c49e43dce7b34f41de25afaed402 GIT binary patch literal 58870 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 @|Wx1m7{5P?P@x84BZZm;c2)?VO0dj={x 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 literal 0 HcmV?d00001 diff --git a/app/examples/Control/HighlightEditor/.lang/ca.po b/app/examples/Control/HighlightEditor/.lang/ca.po new file mode 100644 index 00000000..2ea14157 --- /dev/null +++ b/app/examples/Control/HighlightEditor/.lang/ca.po @@ -0,0 +1,43 @@ +# Catalan translation of HighlightEditor +# Copyright (C) 2000-2010 Benoît Minisini. +# This file is distributed under the same license as the HighlightEditor package. +# Jordi Sayol , 2007-2010. +# +# +msgid "" +msgstr "" +"Project-Id-Version: HighlightEditor\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2010-12-16 23:32+0100\n" +"Last-Translator: Jordi Sayol \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: FEditor.class:208 +msgid "Highlight HTML" +msgstr "HTML ressaltat" + +#: FEditor.class:213 +msgid "Highlight immediately" +msgstr "Ressalta immediatament" + +#: FEditor.class:199 +msgid "HTML Highlighting Editor" +msgstr "Editor del ressalt d'HTML" + +#: .project:2 +msgid "HTML highlighting with the editor control" +msgstr "Ressaltador d'HTML amb el control de l'editor" + +#: FEditor.class:204 +msgid "Popup" +msgstr "Emergent" + +#: FEditor.class:221 +msgid "Quit" +msgstr "Surt" + diff --git a/app/examples/Control/HighlightEditor/.lang/cs.po b/app/examples/Control/HighlightEditor/.lang/cs.po new file mode 100644 index 00000000..6e3be1d3 --- /dev/null +++ b/app/examples/Control/HighlightEditor/.lang/cs.po @@ -0,0 +1,40 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "HTML highlighting with the editor control" +msgstr "HTML zvýrazňovač s editorem" + +#: .project:2 +msgid "This example show how to use the Editor control with custom highlighting." +msgstr "Tento příklad ukazuje jak použít Editor s volitelným zvýrazňováním." + +#: FEditor.form:15 +msgid "HTML Highlighting Editor" +msgstr "Editor zvýrazňující HTML" + +#: FEditor.form:20 +msgid "Popup" +msgstr "Vyskakovaví" + +#: FEditor.form:24 +msgid "Highlight HTML" +msgstr "Zvýraznění HTML" + +#: FEditor.form:29 +msgid "Highlight immediately" +msgstr "Zvýraznit ihned" + +#: FEditor.form:36 +msgid "Quit" +msgstr "Ukončit" diff --git a/app/examples/Control/HighlightEditor/.lang/de.po b/app/examples/Control/HighlightEditor/.lang/de.po new file mode 100644 index 00000000..8abe3e1e --- /dev/null +++ b/app/examples/Control/HighlightEditor/.lang/de.po @@ -0,0 +1,41 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "HTML highlighting with the editor control" +msgstr "HTML-Markierungen mit dem Editor-Steuerelement" + +#: .project:2 +msgid "This example show how to use the Editor control with custom highlighting." +msgstr "Dieses Beispiel zeigt, wie man das Editor-Steuerelement mit benutzerdefinierten Markierungen verwendet." + +#: FEditor.form:15 +msgid "HTML Highlighting Editor" +msgstr "HTML-Markierungseditor" + +#: FEditor.form:20 +msgid "Popup" +msgstr "-" + +#: FEditor.form:24 +msgid "Highlight HTML" +msgstr "HTML-Marks hervorheben" + +#: FEditor.form:29 +msgid "Highlight immediately" +msgstr "Sofort hervorheben" + +#: FEditor.form:36 +msgid "Quit" +msgstr "Beenden" + diff --git a/app/examples/Control/HighlightEditor/.lang/es.po b/app/examples/Control/HighlightEditor/.lang/es.po new file mode 100644 index 00000000..016970b6 --- /dev/null +++ b/app/examples/Control/HighlightEditor/.lang/es.po @@ -0,0 +1,34 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: FEditor.class:201 +msgid "HTML Highlighting Editor" +msgstr "Editor con resaltado HTML " + +#: FEditor.class:206 +msgid "Popup" +msgstr "Popup" + +#: FEditor.class:210 +msgid "Highlight HTML" +msgstr "Resaltado HTML" + +#: FEditor.class:215 +msgid "Highlight immediately" +msgstr "Resaltar instantáneamente" + +#: FEditor.class:222 +msgid "Quit" +msgstr "Salir" + +#~ msgid "HTML highlighting with the editor control" +#~ msgstr "Resaltado HTML con el control editor" diff --git a/app/examples/Control/HighlightEditor/.lang/nl.po b/app/examples/Control/HighlightEditor/.lang/nl.po new file mode 100644 index 00000000..2063ffd7 --- /dev/null +++ b/app/examples/Control/HighlightEditor/.lang/nl.po @@ -0,0 +1,39 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: HighlightEditor 3.5.90\n" +"PO-Revision-Date: 2014-10-02 15:21 UTC\n" +"Last-Translator: Willy Raets \n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "HTML highlighting with the editor control" +msgstr "HTML markering met editor control" + +#: .project:2 +msgid "This example shows how to use the Editor control with custom highlighting." +msgstr "Dit voorbeeld laat zien hoe je de Editor control kunt gebruiken met aangespaste markering." + +#: FEditor.form:15 +msgid "HTML Highlighting Editor" +msgstr "HTML markeer Editor" + +#: FEditor.form:20 +msgid "Popup" +msgstr "-" + +#: FEditor.form:24 +msgid "Highlight HTML" +msgstr "Markeer HTML" + +#: FEditor.form:29 +msgid "Highlight immediately" +msgstr "Onmiddelijk markeren" + +#: FEditor.form:36 +msgid "Quit" +msgstr "Afsluiten" + diff --git a/app/examples/Control/HighlightEditor/.lang/ru.po b/app/examples/Control/HighlightEditor/.lang/ru.po new file mode 100644 index 00000000..1cef47fd --- /dev/null +++ b/app/examples/Control/HighlightEditor/.lang/ru.po @@ -0,0 +1,64 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Control/HighlightEditor/.project:20 +msgid "HTML highlighting with the editor control" +msgstr "Подсветка HTML с контролем редактора" + +#: app/examples/Control/HighlightEditor/.project:21 +msgid "" +"Syntax highlighting example\n" +"\n" +"This example shows how to use the Editor control with custom highlighting." +msgstr "" +"Пример подсветки синтаксиса\n" +"\n" +"В этом примере показано, как использовать элемент управления редактора с пользовательской подсветкой." + +#: app/examples/Control/HighlightEditor/.src/FEditor.class:171 +msgid "modified" +msgstr "изменено" + +#: app/examples/Control/HighlightEditor/.src/FEditor.form:5 +msgid "HTML Highlighting Editor" +msgstr "Редактор подсветки HTML" + +#: app/examples/Control/HighlightEditor/.src/FEditor.form:9 +msgid "Popup" +msgstr "Всплывающее окно" + +#: app/examples/Control/HighlightEditor/.src/FEditor.form:12 +msgid "Highlight HTML" +msgstr "Подсветка HTML" + +#: app/examples/Control/HighlightEditor/.src/FEditor.form:16 +msgid "Highlight immediately" +msgstr "Немедленная подсветка" + +#: app/examples/Control/HighlightEditor/.src/FEditor.form:21 +msgid "Quit" +msgstr "Выход" + diff --git a/app/examples/Control/HighlightEditor/.project b/app/examples/Control/HighlightEditor/.project new file mode 100644 index 00000000..c3fa5e30 --- /dev/null +++ b/app/examples/Control/HighlightEditor/.project @@ -0,0 +1,21 @@ +# Gambas Project File 3.0 +Title=HTML highlighting with the editor control +Startup=FEditor +Icon=editor.png +Version=1.0.0 +Component=gb.image +Component=gb.qt4 +Component=gb.eval +Component=gb.eval.highlight +Component=gb.util +Component=gb.form.editor +Component=gb.qt4.ext +Description="Syntax highlighting example\n\nThis example shows how to use the Editor control with custom highlighting." +TabSize=2 +Translate=1 +Language=fr +Maintainer=benoit +Vendor=Example +Address=benoit@localhost +License=General Public Licence +Packager=1 diff --git a/app/examples/Control/HighlightEditor/.src/FEditor.class b/app/examples/Control/HighlightEditor/.src/FEditor.class new file mode 100644 index 00000000..f82eefe2 --- /dev/null +++ b/app/examples/Control/HighlightEditor/.src/FEditor.class @@ -0,0 +1,184 @@ +' Gambas class file + +Private hEditor As Editor +Private $bIgnore As Boolean +Private $bModified As Boolean + +Public Sub Form_Open() + + $bIgnore = True + Editor1.Text = File.Load("download.html") + + Editor1.Flags[Editor.HighlightBraces] = True + Editor1.Styles[Highlight.Operator].Color = Color.DarkGreen + Editor1.Styles[Highlight.Operator].Bold = True + Editor1.Styles[Highlight.String].Color = Color.DarkRed + Editor1.Flags[Editor.ShowLineNumbers] = True + Editor1.Flags[Editor.NoFolding] = True + Editor1.Flags[Editor.ShowCurrentLine] = True + + Editor2.Flags[Editor.HighlightBraces] = True + Editor2.Styles[Highlight.Operator].Color = Color.DarkGreen + Editor2.Styles[Highlight.Operator].Bold = True + Editor2.Styles[Highlight.String].Color = Color.DarkRed + + VSplit1.Layout = [1, 0] + mnuImmediately_Click + +End + +Public Sub Editor1_Highlight() + + Dim iState As Integer + Dim iNextState As Integer + Dim iInd As Integer + Dim J As Integer + Dim sText As String + Dim sCar As String + Dim iPos As Integer + Dim bMarkup As Boolean + + iState = Highlight.State + sText = Highlight.Text + + 'PRINT "Highlight:";; iState;; sText + + For iInd = 1 To String.Len(sText) + + iNextState = iState + sCar = String.Mid$(sText, iInd, 1) + + If bMarkup Then + + If sCar = ">" Then + bMarkup = False + iState = Highlight.Keyword + iNextState = Highlight.Normal + Else If sCar = " " Then + iNextState = Highlight.Operator + Else If sCar = "=" Then + iNextState = Highlight.String + Endif + + Else + + Select Case iState + Case Highlight.Normal + If sCar = "<" Then + If String.Mid$(sText, iInd, 4) = " +

+What is that new animal ? Well, Gambas +is a free development environment based on a Basic interpreter +with object extensions, like Visual Basic™ (but it is NOT +a clone !). Read the +introduction +for more information. +

+With Gambas, you can quickly design your program GUI, access +MySQL, PostgreSQL and SQLite databases, pilot KDE applications with DCOP, +translate your program into many languages, create network applications +easily, make 3D OpenGL applications, and so on... +

+http://gambas.sourceforge.net + \ No newline at end of file diff --git a/app/examples/Control/TreeView/.directory b/app/examples/Control/TreeView/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/app/examples/Control/TreeView/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/app/examples/Control/TreeView/.icon.png b/app/examples/Control/TreeView/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c56ed6572a0f49de4e39c792b26ed178176748e2 GIT binary patch literal 4093 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 literal 0 HcmV?d00001 diff --git a/app/examples/Control/TreeView/.lang/ca.po b/app/examples/Control/TreeView/.lang/ca.po new file mode 100644 index 00000000..5aea149b --- /dev/null +++ b/app/examples/Control/TreeView/.lang/ca.po @@ -0,0 +1,88 @@ +# Catalan translation of TreeView +# Copyright (C) 2000-2010 Benoît Minisini. +# This file is distributed under the same license as the TreeView package. +# Jordi Sayol , 2007-2010. +# +# +msgid "" +msgstr "" +"Project-Id-Version: TreeView\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2011-03-21 01:56+0100\n" +"Last-Translator: Jordi Sayol \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: TreeViewExample.form:28 +msgid "About" +msgstr "Quant a" + +#: TreeViewExample.class:49 +msgid "
Item rect is (" +msgstr "
Posició (" + +#: TreeViewExample.class:42 +msgid " children." +msgstr " fills." + +#: TreeViewExample.form:74 +msgid "&Clear events" +msgstr "&Neteja els esdeveniments" + +#: TreeViewExample.form:54 +msgid "Current item" +msgstr "Element actual" + +#: TreeViewExample.form:64 +msgid "Events" +msgstr "Esdeveniments" + +#: TreeViewExample.form:85 +msgid "Female" +msgstr "Femení" + +#: TreeViewExample.class:42 +msgid " has " +msgstr " té " + +#: TreeViewExample.class:46 +msgid " has 1 child." +msgstr " té un fill." + +#: TreeViewExample.class:44 +msgid " has no children." +msgstr " no té fills." + +#: TreeViewExample.form:25 +msgid "Help" +msgstr "Ajuda" + +#: TreeViewExample.form:40 +msgid "Insert Name" +msgstr "Insereix un nom" + +#: TreeViewExample.form:79 +msgid "Male" +msgstr "Masculí" + +#: TreeViewExample.form:45 +msgid "Remove Name" +msgstr "Elimina el nom" + +#: .project:1 +msgid "TreeView example" +msgstr "Exemple de visualització en arbre" + +#: TreeViewExample.form:20 +msgid "TreeView Example" +msgstr "Exemple de visualització en arbre" + +#: TreeViewExample.class:139 +msgid "TreeView example written by C. Packard and Fabien Hutrel." +msgstr "Exemple de Vista d'Arbre escrit per C. Packard i Fabien Hutrel." + diff --git a/app/examples/Control/TreeView/.lang/cs.po b/app/examples/Control/TreeView/.lang/cs.po new file mode 100644 index 00000000..23b02a14 --- /dev/null +++ b/app/examples/Control/TreeView/.lang/cs.po @@ -0,0 +1,76 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "TreeView example" +msgstr "Příklad stromového pohledu" + +#: TreeViewExample.class:42 +msgid "&1 has &2 children." +msgstr "&1 má &2 potomků." + +#: TreeViewExample.class:44 +msgid "&1 has no children." +msgstr "&1 nemá potomka." + +#: TreeViewExample.class:46 +msgid "&1 has 1 child." +msgstr "&1 má 1 potomka." + +#: TreeViewExample.class:49 +msgid "
Item rect is (" +msgstr "
Obdelník položky je (" + +#: TreeViewExample.class:150 +msgid "TreeView example written by C. Packard and Fabien Hutrel." +msgstr "Příklad Stromového pohledu napsaný C. Packard a Fabien Hutrel." + +#: TreeViewExample.form:20 +msgid "TreeView Example" +msgstr "Příklad Stromového pohledu" + +#: TreeViewExample.form:25 +msgid "Help" +msgstr "Nápověda" + +#: TreeViewExample.form:28 +msgid "About" +msgstr "O aplikaci" + +#: TreeViewExample.form:40 +msgid "Insert Name" +msgstr "Vložit jméno" + +#: TreeViewExample.form:45 +msgid "Remove Name" +msgstr "Odstranit jméno" + +#: TreeViewExample.form:54 +msgid "Current item" +msgstr "Aktuální položka" + +#: TreeViewExample.form:64 +msgid "Events" +msgstr "Události" + +#: TreeViewExample.form:74 +msgid "&Clear events" +msgstr "&Vyčistit události" + +#: TreeViewExample.form:79 +msgid "Male" +msgstr "Muž" + +#: TreeViewExample.form:85 +msgid "Female" +msgstr "Žena" diff --git a/app/examples/Control/TreeView/.lang/de.po b/app/examples/Control/TreeView/.lang/de.po new file mode 100644 index 00000000..f7b8900a --- /dev/null +++ b/app/examples/Control/TreeView/.lang/de.po @@ -0,0 +1,77 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "TreeView example" +msgstr "TreeView-Beispiel" + +#: TreeViewExample.class:42 +msgid "&1 has &2 children." +msgstr "&1 hat &2 Unterpunkte." + +#: TreeViewExample.class:44 +msgid "&1 has no children." +msgstr "&1 hat keine Unterpunkte." + +#: TreeViewExample.class:46 +msgid "&1 has 1 child." +msgstr "&1 hat 1 Unterpunkt." + +#: TreeViewExample.class:49 +msgid "
Item rect is (" +msgstr "
Element auf Position (" + +#: TreeViewExample.class:150 +msgid "TreeView example written by C. Packard and Fabien Hutrel." +msgstr "TreeView-Beispiel geschrieben von C. Packard und Fabien Hutrel." + +#: TreeViewExample.form:20 +msgid "TreeView Example" +msgstr "TreeView-Beispiel" + +#: TreeViewExample.form:25 +msgid "Help" +msgstr "Hilfe" + +#: TreeViewExample.form:28 +msgid "About" +msgstr "Uber" + +#: TreeViewExample.form:40 +msgid "Insert Name" +msgstr "Name einfügen" + +#: TreeViewExample.form:45 +msgid "Remove Name" +msgstr "Name entfernen" + +#: TreeViewExample.form:54 +msgid "Current item" +msgstr "Gegenwärtiges Element" + +#: TreeViewExample.form:64 +msgid "Events" +msgstr "Ereignisse" + +#: TreeViewExample.form:74 +msgid "&Clear events" +msgstr "&Ereignisse löschen" + +#: TreeViewExample.form:79 +msgid "Male" +msgstr "Männlich" + +#: TreeViewExample.form:85 +msgid "Female" +msgstr "Weiblich" + diff --git a/app/examples/Control/TreeView/.lang/es.po b/app/examples/Control/TreeView/.lang/es.po new file mode 100644 index 00000000..5140a0e7 --- /dev/null +++ b/app/examples/Control/TreeView/.lang/es.po @@ -0,0 +1,73 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: TreeViewExample.class:42 +msgid "&1 has &2 children." +msgstr "&1 tiene &2 hijos." + +#: TreeViewExample.class:46 +msgid "&1 has 1 child." +msgstr "&1 tiene 1 hijo." + +#: TreeViewExample.class:44 +msgid "&1 has no children." +msgstr "&1 no tiene hijos." + +#: TreeViewExample.form:74 +msgid "&Clear events" +msgstr "&Eliminar eventos" + +#: TreeViewExample.class:49 +msgid "
Item rect is (" +msgstr "" + +#: TreeViewExample.form:28 +msgid "About" +msgstr "Acerca de" + +#: TreeViewExample.form:54 +msgid "Current item" +msgstr "Elemento actual" + +#: TreeViewExample.form:64 +msgid "Events" +msgstr "Eventos" + +#: TreeViewExample.form:85 +msgid "Female" +msgstr "Mujer" + +#: TreeViewExample.form:25 +msgid "Help" +msgstr "Ayuda" + +#: TreeViewExample.form:40 +msgid "Insert Name" +msgstr "Insertar nombre" + +#: TreeViewExample.form:79 +msgid "Male" +msgstr "Hombre" + +#: TreeViewExample.form:45 +msgid "Remove Name" +msgstr "Eliminar nombre" + +#: .project:1 TreeViewExample.form:20 +msgid "TreeView Example" +msgstr "Ejemplo de TreeView" + +#: TreeViewExample.class:150 +msgid "TreeView example written by C. Packard and Fabien Hutrel." +msgstr "Ejemplo de TreeView escrito por C. Packard y Fabien Hutrel." + diff --git a/app/examples/Control/TreeView/.lang/nl.po b/app/examples/Control/TreeView/.lang/nl.po new file mode 100644 index 00000000..b3ad76d7 --- /dev/null +++ b/app/examples/Control/TreeView/.lang/nl.po @@ -0,0 +1,75 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: TreeView 3.6.0\n" +"PO-Revision-Date: 2014-10-10 13:53 UTC\n" +"Last-Translator: Willy Raets \n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "TreeView example" +msgstr "TreeView voorbeeld" + +#: TreeViewExample.form:20 +msgid "TreeView Example" +msgstr "TreeView Voorbeeld" + +#: TreeViewExample.form:25 +msgid "Help" +msgstr "-" + +#: TreeViewExample.form:28 +msgid "About" +msgstr "Over" + +#: TreeViewExample.form:40 +msgid "Insert Name" +msgstr "Naam tussenvoegen" + +#: TreeViewExample.form:45 +msgid "Remove Name" +msgstr "Naam verwijderen" + +#: TreeViewExample.form:54 +msgid "Current item" +msgstr "Huidig item" + +#: TreeViewExample.form:64 +msgid "Events" +msgstr "Gebeurtenissen" + +#: TreeViewExample.form:74 +msgid "&Clear events" +msgstr "&Gebeurtenissen opschonen" + +#: TreeViewExample.form:79 +msgid "Male" +msgstr "Mannelijk" + +#: TreeViewExample.form:85 +msgid "Female" +msgstr "Vrouwelijk" + +#: TreeViewExample.class:42 +msgid "&1 has &2 children." +msgstr "&1 heeft &2 kinderen." + +#: TreeViewExample.class:44 +msgid "&1 has no children." +msgstr "&1 heeft geen kinderen." + +#: TreeViewExample.class:46 +msgid "&1 has 1 child." +msgstr "&1 heeft 1 kind." + +#: TreeViewExample.class:49 +msgid "
Item rect is (" +msgstr "
Item rect is (" + +#: TreeViewExample.class:150 +msgid "TreeView example written by C. Packard and Fabien Hutrel." +msgstr "TreeView voorbeeld geschreven door C. Packard en Fabien Hutrel." + diff --git a/app/examples/Control/TreeView/.lang/ru.po b/app/examples/Control/TreeView/.lang/ru.po new file mode 100644 index 00000000..87b2c24c --- /dev/null +++ b/app/examples/Control/TreeView/.lang/ru.po @@ -0,0 +1,154 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Control/TreeView/.project:19 +msgid "TreeView example" +msgstr "Пример просмотра дерева" + +#: app/examples/Control/TreeView/.src/TreeViewExample.class:15 app/examples/Control/TreeView/.src/TreeViewExample.class:16 app/examples/Control/TreeView/.src/TreeViewExample.class:17 app/examples/Control/TreeView/.src/TreeViewExample.class:23 +msgid "Bill" +msgstr "Билл" + +#: app/examples/Control/TreeView/.src/TreeViewExample.class:16 +msgid "Ted" +msgstr "Тэд" + +#: app/examples/Control/TreeView/.src/TreeViewExample.class:17 app/examples/Control/TreeView/.src/TreeViewExample.class:18 +msgid "Sally" +msgstr "Салли" + +#: app/examples/Control/TreeView/.src/TreeViewExample.class:18 +msgid "Frank" +msgstr "Фрэнк" + +#: app/examples/Control/TreeView/.src/TreeViewExample.class:42 +msgid "&1 has &2 children." +msgstr "&1 имеет &2 детей." + +#: app/examples/Control/TreeView/.src/TreeViewExample.class:44 +msgid "&1 has no children." +msgstr "&1 не имеет детей." + +#: app/examples/Control/TreeView/.src/TreeViewExample.class:46 +msgid "&1 has 1 child." +msgstr "&1 имеет 1 ребёнка." + +#: app/examples/Control/TreeView/.src/TreeViewExample.class:49 +msgid "Item rect is" +msgstr "Прямоугольник элемента" + +#: app/examples/Control/TreeView/.src/TreeViewExample.class:60 +msgid "Click" +msgstr "Щелчок" + +#: app/examples/Control/TreeView/.src/TreeViewExample.class:108 +msgid "Collapse" +msgstr "Свернуть" + +#: app/examples/Control/TreeView/.src/TreeViewExample.class:115 +msgid "DblClick" +msgstr "Двойной щелчок" + +#: app/examples/Control/TreeView/.src/TreeViewExample.class:123 +msgid "Select" +msgstr "Выбрать" + +#: app/examples/Control/TreeView/.src/TreeViewExample.class:130 +msgid "Delete" +msgstr "Удалить" + +#: app/examples/Control/TreeView/.src/TreeViewExample.class:137 +msgid "Expand" +msgstr "Развернуть" + +#: app/examples/Control/TreeView/.src/TreeViewExample.class:150 +msgid "TreeView example written by C. Packard and Fabien Hutrel." +msgstr "Пример просмотра дерева, написанный К. Пакард и Фабьен Хатрел." + +#: app/examples/Control/TreeView/.src/TreeViewExample.class:157 +msgid "Activate" +msgstr "Активировать" + +#: app/examples/Control/TreeView/.src/TreeViewExample.class:164 +msgid "Rename" +msgstr "Переименовать" + +#: app/examples/Control/TreeView/.src/TreeViewExample.class:174 +msgid "Event" +msgstr "Событие" + +#: app/examples/Control/TreeView/.src/TreeViewExample.class:174 +msgid "Item:" +msgstr "Элемент:" + +#: app/examples/Control/TreeView/.src/TreeViewExample.class:182 +msgid "Cancel" +msgstr "Отмена" + +#: app/examples/Control/TreeView/.src/TreeViewExample.form:5 +msgid "TreeView Example" +msgstr "Пример просмотра дерева" + +#: app/examples/Control/TreeView/.src/TreeViewExample.form:9 +msgid "Help" +msgstr "Справка" + +#: app/examples/Control/TreeView/.src/TreeViewExample.form:11 +msgid "About" +msgstr "О программе" + +#: app/examples/Control/TreeView/.src/TreeViewExample.form:21 +msgid "Insert Name" +msgstr "Вставить имя" + +#: app/examples/Control/TreeView/.src/TreeViewExample.form:25 +msgid "Remove Name" +msgstr "Удалить имя" + +#: app/examples/Control/TreeView/.src/TreeViewExample.form:32 +msgid "Current item" +msgstr "Текущий элемент" + +#: app/examples/Control/TreeView/.src/TreeViewExample.form:40 +msgid "Events" +msgstr "События" + +#: app/examples/Control/TreeView/.src/TreeViewExample.form:48 +msgid "&Clear events" +msgstr "Очистить события" + +#: app/examples/Control/TreeView/.src/TreeViewExample.form:52 +msgid "Male" +msgstr "Мужчина" + +#: app/examples/Control/TreeView/.src/TreeViewExample.form:57 +msgid "Female" +msgstr "Женщина" + +#: app/examples/Control/TreeView/.src/workaround:1 +msgid "
Item rect is (" +msgstr "
Прямоугольник элемента (" + diff --git a/app/examples/Control/TreeView/.project b/app/examples/Control/TreeView/.project new file mode 100644 index 00000000..e1ab34f3 --- /dev/null +++ b/app/examples/Control/TreeView/.project @@ -0,0 +1,17 @@ +# Gambas Project File 3.0 +Title=TreeView example +Startup=TreeViewExample +Icon=treeview.png +Version=3.13.90 +VersionFile=1 +Component=gb.image +Component=gb.gui +Environment="GB_GUI=gb.qt5" +TabSize=2 +Translate=1 +Language=fr +Maintainer=fabien +Vendor=Princeton +Address=fabien@arcalis +License=General Public Licence +Packager=1 diff --git a/app/examples/Control/TreeView/.src/TreeViewExample.class b/app/examples/Control/TreeView/.src/TreeViewExample.class new file mode 100644 index 00000000..db79cddf --- /dev/null +++ b/app/examples/Control/TreeView/.src/TreeViewExample.class @@ -0,0 +1,184 @@ +' Gambas class file + +Public intEventNumber As Integer + +Public Sub Form_Open() + + Dim picMale As Picture + Dim picFemale As Picture + + picFemale = Picture["Female.png"] + picMale = Picture["Male.png"] + + 'This will populate our treeview with our starting entries + 'Note: I'll just keep the entries text and its key the same to keep it simple + TreeView1.Add(("Bill"), ("Bill"), picMale) + TreeView1.Add(("Ted"), ("Ted"), picMale, ("Bill")) + TreeView1.Add(("Sally"), ("Sally"), picFemale, ("Bill")) + TreeView1.Add(("Frank"), ("Frank"), picMale, ("Sally")) + 'TreeView1.MoveCurrent + 'TreeView1.Item.Selected = TRUE + 'TreeView1.Item.Expanded = TRUE + + TreeView1[("Bill")].Expanded = True + +End + +Private Sub RefreshInfo() + + 'This little check just updates our label so that we know how many + 'children an entry has. + + Dim sText As String + + If Not TreeView1.Current Then + Textlabel1.Text = "" + Return + Endif + + With TreeView1.Current + + If .Children > 1 Then + sText = Subst(("&1 has &2 children."), .Text, .Children) + Else If .Children = 0 Then + sText = Subst(("&1 has no children."), .Text) + Else + sText = Subst(("&1 has 1 child."), .Text) + End If + + sText &= "
" & ("Item rect is") & " (" & .X & "," & .Y & "," & .W & "," & .H & ")" + + End With + + TextLabel1.Text = sText + +End + +Public Sub TreeView1_Click() + + 'This just updates our event stack + AddLog(("Click")) + +End + +Public Sub Button1_Click() + + Dim sIcon As String + Dim sParent As String + + If Textbox1.Text <> Null Then + If RadioButton1.Value Then + sIcon = "Male.png" + Else + sIcon = "Female.png" + End If + 'Gets the parent item: the current item, or nothing is the treeview is void + sParent = TreeView1.Key + 'Now we will add a new entry with a key and a name of what was in the text box + 'We will place it as a child of the currently selected entry + TreeView1.Add(Textbox1.Text, Textbox1.Text, Picture[sIcon], sParent).EnsureVisible + TreeView1.Item.EnsureVisible 'This will make sure that the item we just added to the list is in the visable area of the control. (Scrolling if necessary) + TextBox1.Text = "" 'This empties out textbox + RefreshInfo ' This will update our label and reflect the new number of kids + End If + +End + +Public Sub Button2_Click() + + If Not TreeView1.Key Then Return + 'Lets remove the current cursor item + TreeView1.Remove(TreeView1.Key) + 'Now move the cursor to the current item (since we are now pointing at a deleted item) + 'But first we check the count to make sure we didn't delete the last item in the list + 'if we did then we obviously don't run this part. + If TreeView1.Count > 0 Then + 'TreeView1.MoveCurrent + 'This selects or 'highlights' our current item + 'TreeView1.Current.Selected = TRUE + 'This will update our label and reflect the new number of kids + RefreshInfo + End If + +End + +Public Sub TreeView1_Collapse() + 'This just updates our event stack + + AddLog(("Collapse")) + +End + +Public Sub TreeView1_DblClick() + 'This just updates our event stack + + AddLog(("DblClick")) + +End + +Public Sub TreeView1_Select() + 'This just updates our event stack + + RefreshInfo + AddLog(("Select")) + +End + +Public Sub TreeView1_Delete() + 'This just updates our event stack + + AddLog(("Delete")) + +End + +Public Sub TreeView1_Expand() + 'This just updates our event stack + + AddLog(("Expand")) + +End + +Public Sub Button3_Click() + + TextArea1.Text = "" + 'IntEventNumber = 0 + +End + +Public Sub About_Click() + + Message.Info(("TreeView example written by C. Packard and Fabien Hutrel.")) + +End + +Public Sub TreeView1_Activate() + 'This just updates our event stack + + AddLog(("Activate")) + +End + +Public Sub TreeView1_Rename() + 'This just updates our event stack + + AddLog(("Rename")) + +End + +Private Sub AddLog(anevent As String) + 'This updates our event stack, this sub is used by all events... it display the current node key. + + Dim sKey As String + + Try sKey = TreeView1.Item.Key + TextArea1.Text = ("Event") & "(" & intEventNumber & "): " & anevent & " " & ("Item:") & " '" & sKey & "'\n" & TextArea1.Text + TextArea1.Pos = 0 + Inc intEventNumber + +End + +Public Sub TreeView1_Cancel() + + AddLog(("Cancel")) + +End diff --git a/app/examples/Control/TreeView/.src/TreeViewExample.form b/app/examples/Control/TreeView/.src/TreeViewExample.form new file mode 100644 index 00000000..0c3b4392 --- /dev/null +++ b/app/examples/Control/TreeView/.src/TreeViewExample.form @@ -0,0 +1,59 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(25,11.1429,92,54) + Text = ("TreeView Example") + Icon = Picture["treeview.png"] + Resizable = False + { Help Menu + Text = ("Help") + { About Menu + Text = ("About") + } + } + { TreeView1 TreeView + MoveScaled(1,1,24,48) + Mode = Select.Multiple + Editable = True + } + { Button1 Button + MoveScaled(54,1,17,4) + Text = ("Insert Name") + } + { Button2 Button + MoveScaled(54,6,17,4) + Text = ("Remove Name") + } + { TextBox1 TextBox + MoveScaled(27,1,25,4) + } + { Frame1 Frame + MoveScaled(27,11,64,13) + Text = ("Current item") + { TextLabel1 TextLabel + MoveScaled(1,4,38,8) + } + } + { Label2 Label + MoveScaled(27,25,39,4) + Font = Font["Bold"] + Text = ("Events") + } + { TextArea1 TextArea + MoveScaled(27,29,64,15) + ReadOnly = True + } + { Button3 Button + MoveScaled(71,45,20,4) + Text = ("&Clear events") + } + { RadioButton1 RadioButton + MoveScaled(27,6,12,4) + Text = ("Male") + Value = True + } + { RadioButton2 RadioButton + MoveScaled(40,6,13,4) + Text = ("Female") + } +} diff --git a/app/examples/Control/TreeView/Female.png b/app/examples/Control/TreeView/Female.png new file mode 100644 index 0000000000000000000000000000000000000000..3c1a3bb21aae6cf2350be5eb3ece0d190ece3d0f GIT binary patch literal 293 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wtpJ}8S0Me5;Xebze;|n;UHPLY z1ys#j666;Qqh%dE5=RbAdOHBM$~39e3lbn4!2fxZ)Oo12=9s$~zz+_qK_J{QMUTqEr$)2p4} z_r^uQ{j=7L$-4!PT-?=mF0n;Jm`OXiL1F=mSwo{>%9aU2H!|4RCM@-`O7L!6@a@== zse7+4v`b>N7I|jBL;OI)cOmAc+VAgJ-^hrh^6U}dWH{`Tu{0|3H!;>XS(+ z1FGjM3GxdD()B!%TR%2;n{quciwdz?1r*ut>Eak7aXC35L4bvcjjgTxy_|u8L6Zd& zkJqs>egz>1O|_@T`40%Kt4vkoDLcmRAhhUxgTjxEMl&vdFM7DH@_o+?kp`KI=HjfZ zspnZ6EbHBp#Q*>R literal 0 HcmV?d00001 diff --git a/app/examples/Control/TreeView/treeview.png b/app/examples/Control/TreeView/treeview.png new file mode 100644 index 0000000000000000000000000000000000000000..760ff1f884602717f3388dd9e490e2797d8e48d0 GIT binary patch literal 471 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\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: FMain.class:114 +msgid "Amount" +msgstr "Quantitat" + +#: FMain.class:124 +msgid "Article" +msgstr "-" + +#: FMain.class:169 +msgid "As this is only an example,
nothing will be ordered,
nothing will be saved,
and nothing will be sent." +msgstr "Ja que això és només un exemple,
res s'ordenarà,
res es desarà,
ni res s'enviarà." + +#: FMain.class:147 +msgid "image files of the Gambas logo" +msgstr "Fitxers d'imatges del logotip del Gambas" + +#: FMain.class:95 +msgid "Introduction" +msgstr "Introducció" + +#: FMain.class:108 +msgid "I order, according to the terms & conditions, the following items:" +msgstr "Ordeno, d'acord amb els termes i condicions, els següents elements:" + +#: FMain.class:152 +msgid "I want to read the terms and conditions" +msgstr "Vull llegir els termes i condicions" + +#: FMain.class:158 +msgid "I want to save my order" +msgstr "Vull desar la meva comanda" + +#: FMain.class:138 +msgid "kg of frozen shrimps" +msgstr "kg de gambes congelades" + +#: FMain.class:129 +msgid "lines of code from gambas 3" +msgstr "Línies de codi del Gambas 3" + +#: FMain.class:100 +msgid "" +"Most of the properties of this wizard are selected in the properties window, not by code. This is because for designing the wizard you need the properties window anyway. \n" +"

\n" +"

\n" +"To see the properties window, you have to do save the project in your home directory so that it is not write protected anymore.\n" +"

\n" +"To design the pages of the wizard (or to see the properties), just click in the IDE on the \"Next\" button.\n" +"

\n" +"The essential property of the wizard container is Count. This defines the number of steps the user will have to click through. On the last page the button \"Next\" changes automatically to \"OK\" to finish the task.\n" +"

\n" +"In some situations you might want to skip steps of the wizard. You find this in the code of the CheckBoxes in step 2.\n" +"

\n" +msgstr "" +"La majoria de propietats d'aquest assistent es seleccionen a la finestra de propietats, i no al codi. Això es deu al fet que per dissenyar l'assistent es necessita la finestra de propietats de totes maneres. \n" +"

\n" +"

\n" +"Per veure la finestra de propietats, l'heu de desar al directori arrel del vostre projecte projecte, així ja no estarà protegit contra escriptura.\n" +"

\n" +"Per dissenyar les pàgines de l'assistent (o veure'n les propietats), a l'IDE feu clic al botó «Següent».\n" +"

\n" +"La propietat essencial del contenidor de l'assistent és Count. Aquesta defineix el nombre de passos que l'usuari haurà de fer. A l'última pàgina el botó «Següent» canvia automàticament a «D'acord» per acabar la tasca.\n" +"

\n" +"En algunes situacions podeu ometre els passos de l'assistent. Trobareu això en el codi de les caselles de verificació en el pas 2.\n" +"

\n" + +#: FMain.class:177 +msgid "Please enter your address here:" +msgstr "Introduïu la vostra adreça aquí:" + +#: FMain.class:184 +msgid "Save your order" +msgstr "Deseu la vostra comanda" + +#: FMain.class:196 +msgid "Send your order" +msgstr "Envieu la vostra comanda" + +#: FMain.class:162 +msgid "Terms and Conditions" +msgstr "Termes i condicions" + +#: FMain.class:204 +msgid "The following items:" +msgstr "Els següents articles:" + +#: FMain.class:189 +msgid "Where do you want to save your order?" +msgstr "On voleu desar la vostra comanda?" + +#: FMain.class:209 +msgid "will be delivered to:" +msgstr "serà lliurat a:" + +#: .project:1 +msgid "Wizard example" +msgstr "Exemple d'assistent" + +#: FMain.class:26 +msgid "" +"You didn't enter your address.\n" +"Your order can't be submitted." +msgstr "" +"No heu entrat la vostra adreça.\n" +"No es pot processar la vostra comanda." + +#: FMain.class:173 +msgid "Your address" +msgstr "La vostra adreça " + +#: FMain.class:103 +msgid "Your order" +msgstr "La vostra comanda" + +#: FMain.class:219 +msgid "Your order is now ready to be sent. Please check if everything is correct." +msgstr "La vostra comanda està llesta per a ser enviada. Reviseu si tot és correcte." + +#: FMain.class:39 +msgid "" +"Your order was submitted successfully.\n" +"The wizard will close now." +msgstr "" +"La vostra comanda s'ha processat correctament.\n" +"L'assistent s'acaba aquí." + diff --git a/app/examples/Control/Wizard/.lang/cs.po b/app/examples/Control/Wizard/.lang/cs.po new file mode 100644 index 00000000..87ec635b --- /dev/null +++ b/app/examples/Control/Wizard/.lang/cs.po @@ -0,0 +1,138 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Wizard example" +msgstr "Příklad průvodce" + +#: FMain.class:26 +msgid "" +"You didn't enter your address.\n" +"Your order can't be submitted." +msgstr "" +"Nezadali jste Vaši adresu.\n" +"Vaše objednávka je nedoručitelná." + +#: FMain.class:39 +msgid "" +"Your order was submitted successfully.\n" +"The wizard will close now." +msgstr "" +"Vaše objednávka byla úspěšně odeslána.\n" +"Průvodce bude ukončen." + +#: FMain.form:38 +msgid "Introduction" +msgstr "Úvod" + +#: FMain.form:43 +msgid "" +"Most of the properties of this wizard are selected in the properties window, not by code. This is because for designing the wizard you need the properties window anyway. \n" +"

\n" +"

\n" +"To see the properties window, you have to do save the project in your home directory so that it is not write protected anymore.\n" +"

\n" +"To design the pages of the wizard (or to see the properties), just click in the IDE on the \"Next\" button.\n" +"

\n" +"The essential property of the wizard container is Count. This defines the number of steps the user will have to click through. On the last page the button \"Next\" changes automatically to \"OK\" to finish the task.\n" +"

\n" +"In some situations you might want to skip steps of the wizard. You find this in the code of the CheckBoxes in step 2.\n" +"

\n" +msgstr "" +"Většina z vlastností tohoto průvodce jsou vybrané v okně vlastností, nikoli v kódu. Je to proto, že pro navrhování průvodce budete potřebovat okno vlastností tak jako tak. \n" +"

\n" +"

\n" +"Chcete-li zobrazit v okně vlastností, co musíte udělat, uložit projekt ve svém domovském adresáři, a ten není chráněn proti zápisu.\n" +"

\n" +"Chcete-li návrh stránkek průvodce (nebo viz vlastnosti), stačí kliknout na IDE na \"Další\" tlačítko.\n" +"

\n" +"V základní vlastnost je průvodce kontejneru Count(počet). Toto určuje počet kroků, které bude muset uživatele proklikat. Na poslední stráncena tlačítko \"Další\" se automaticky změní na \"OK\"prodokončení úkolu.\n" +"

\n" +"V některých situacích byste mohli chtít přeskočit kroky průvodce. Najdete to v kódu políček v kroku 2.\n" +"

\n" + +#: FMain.form:46 +msgid "Your order" +msgstr "Váše objednávka" + +#: FMain.form:51 +msgid "I order, according to the terms & conditions, the following items:" +msgstr "Objednávka, v souladu s podmínkami, následující položky:" + +#: FMain.form:57 +msgid "Amount" +msgstr "Částka" + +#: FMain.form:67 +msgid "Article" +msgstr "Předmět" + +#: FMain.form:72 +msgid "lines of code from gambas 3" +msgstr "řádků ku z gambasu 3" + +#: FMain.form:81 +msgid "kg of frozen shrimps" +msgstr "kg mražených krevet" + +#: FMain.form:90 +msgid "image files of the Gambas logo" +msgstr "obrazové soubory s logem Gambasu" + +#: FMain.form:95 +msgid "I want to read the terms and conditions" +msgstr "Chci si přečíst podmínky" + +#: FMain.form:101 +msgid "I want to save my order" +msgstr "Chci uložit moji objednávku" + +#: FMain.form:105 +msgid "Terms and Conditions" +msgstr "Podmínky" + +#: FMain.form:112 +msgid "As this is only an example,
nothing will be ordered,
nothing will be saved,
and nothing will be sent." +msgstr "Protože se jedná pouze o příklad,
nic se neobjedná,
nic se neuloženo
a nic nebude posláno." + +#: FMain.form:116 +msgid "Your address" +msgstr "Vaše adresa" + +#: FMain.form:120 +msgid "Please enter your address here:" +msgstr "Prosím, vložte sem vaši adresu:" + +#: FMain.form:127 +msgid "Save your order" +msgstr "Uložit objednávku" + +#: FMain.form:132 +msgid "Where do you want to save your order?" +msgstr "Kam chcete uložit objednávku?" + +#: FMain.form:139 +msgid "Send your order" +msgstr "Poslat objednávku" + +#: FMain.form:147 +msgid "The following items:" +msgstr "Následující položky:" + +#: FMain.form:152 +msgid "will be delivered to:" +msgstr "bude dodáno:" + +#: FMain.form:162 +msgid "Your order is now ready to be sent. Please check if everything is correct." +msgstr "Vaše objednávka je nyní připravena k odeslání. Zkontrolujte prosím, zda je vše v pořádku." diff --git a/app/examples/Control/Wizard/.lang/de.po b/app/examples/Control/Wizard/.lang/de.po new file mode 100644 index 00000000..3860e21b --- /dev/null +++ b/app/examples/Control/Wizard/.lang/de.po @@ -0,0 +1,138 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Wizard example" +msgstr "Beispiel: Wizard" + +#: FMain.class:26 +msgid "" +"You didn't enter your address.\n" +"Your order can't be submitted." +msgstr "" +"Sie haben Ihre Adresse nicht angegeben.\n" +"Ihre Bestellung kann nicht übermittelt werden." + +#: FMain.class:39 +msgid "" +"Your order was submitted successfully.\n" +"The wizard will close now." +msgstr "" +"Ihre Bestellung wurde erfolgreich übermittelt.\n" +"Der Assistent wird nun geschlossen." + +#: FMain.form:38 +msgid "Introduction" +msgstr "Einleitung" + +#: FMain.form:43 +msgid "" +"Most of the properties of this wizard are selected in the properties window, not by code. This is because for designing the wizard you need the properties window anyway. \n" +"

\n" +"

\n" +"To see the properties window, you have to do save the project in your home directory so that it is not write protected anymore.\n" +"

\n" +"To design the pages of the wizard (or to see the properties), just click in the IDE on the \"Next\" button.\n" +"

\n" +"The essential property of the wizard container is Count. This defines the number of steps the user will have to click through. On the last page the button \"Next\" changes automatically to \"OK\" to finish the task.\n" +"

\n" +"In some situations you might want to skip steps of the wizard. You find this in the code of the CheckBoxes in step 2.\n" +"

\n" +msgstr "" +"Die meisten Einstellungen dieses Assistenten sind im Eigenschaftenfenster eingestellt, nicht mittels Code. Weil man zum Design sowieso nicht um das Eigenschaftenfenster herumkommt. \n" +"

\n" +"

\n" +"Um das Eigenschaftenfenster zu sehen, musst du das Projekt in deinem home-Verzeichnis speichern, wo es nicht mehr schreibgeschützt ist.\n" +"

\n" +"Um die Seiten des Assistenten zu gestalten (oder die Eigenschaften anzusehen), klicke in der IDE einfach auf die \"Weiter\" Schaltfläche.\n" +"

\n" +"Die zentrale Eigenschaft des Assistenten ist Count. Damit wird die Anzahl der Schritte definiert, die der Anwender durchklicken muss. Auf der letzten Seite ändert sich \"Weiter\" automatisch in \"OK\", um den Assistenten abzuschließen.\n" +"

\n" +"In manchen Situationen mag man Schritte des Assistenten überspringen. Siehe hierzu den Code der CheckBoxen in Schritt 2.\n" +"

\n" + +#: FMain.form:46 +msgid "Your order" +msgstr "Ihre Bestellung" + +#: FMain.form:51 +msgid "I order, according to the terms & conditions, the following items:" +msgstr "Ich bestelle gemäß den Geschäftsbedingungen folgende Artikel:" + +#: FMain.form:57 +msgid "Amount" +msgstr "Menge" + +#: FMain.form:67 +msgid "Article" +msgstr "Artikel" + +#: FMain.form:72 +msgid "lines of code from gambas 3" +msgstr "Codezeilen aus Gambas 3" + +#: FMain.form:81 +msgid "kg of frozen shrimps" +msgstr "kg tiefgekühlte Scampi" + +#: FMain.form:90 +msgid "image files of the Gambas logo" +msgstr "Bilddateien des Gambas-Logos" + +#: FMain.form:95 +msgid "I want to read the terms and conditions" +msgstr "Ich möchte die Geschäftsbedingungen lesen" + +#: FMain.form:101 +msgid "I want to save my order" +msgstr "Ich möchte meine Bestellung speichern" + +#: FMain.form:105 +msgid "Terms and Conditions" +msgstr "Geschäftsbedingungen" + +#: FMain.form:112 +msgid "As this is only an example,
nothing will be ordered,
nothing will be saved,
and nothing will be sent." +msgstr "Da dies nur ein Beispiel ist,
wird nichts bestellt,
nichts gespeichert,
und nichts gesendet." + +#: FMain.form:116 +msgid "Your address" +msgstr "Ihre Adresse" + +#: FMain.form:120 +msgid "Please enter your address here:" +msgstr "Bitte geben Sie hier ihre Adresse ein:" + +#: FMain.form:127 +msgid "Save your order" +msgstr "Bestellung speichern" + +#: FMain.form:132 +msgid "Where do you want to save your order?" +msgstr "Wo möchten Sie Ihre Bestellung speichern?" + +#: FMain.form:139 +msgid "Send your order" +msgstr "Bestellung übermitteln" + +#: FMain.form:147 +msgid "The following items:" +msgstr "Die folgenden Artikel:" + +#: FMain.form:152 +msgid "will be delivered to:" +msgstr "werden geliefert an:" + +#: FMain.form:162 +msgid "Your order is now ready to be sent. Please check if everything is correct." +msgstr "Ihre Bestellung kann nun übermittelt werden. Bitte überprüfen Sie, ob alle Angaben korrekt sind." diff --git a/app/examples/Control/Wizard/.lang/nl.po b/app/examples/Control/Wizard/.lang/nl.po new file mode 100644 index 00000000..51708e2c --- /dev/null +++ b/app/examples/Control/Wizard/.lang/nl.po @@ -0,0 +1,107 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Wizard 3.6.0\n" +"PO-Revision-Date: 2014-10-10 13:56 UTC\n" +"Last-Translator: Willy Raets \n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Wizard example" +msgstr "Wizard voorbeeld" + +#: FMain.form:38 +msgid "Introduction" +msgstr "Introducties" + +#: FMain.form:43 +msgid "Most of the properties of this wizard are selected in the properties window, not by code. This is because for designing the wizard you need the properties window anyway. \n

\n

\nTo see the properties window, you have to do save the project in your home directory so that it is not write protected anymore.\n

\nTo design the pages of the wizard (or to see the properties), just click in the IDE on the \"Next\" button.\n

\nThe essential property of the wizard container is Count. This defines the number of steps the user will have to click through. On the last page the button \"Next\" changes automatically to \"OK\" to finish the task.\n

\nIn some situations you might want to skip steps of the wizard. You find this in the code of the CheckBoxes in step 2.\n

\n" +msgstr "" + +#: FMain.form:46 +msgid "Your order" +msgstr "Je order" + +#: FMain.form:51 +msgid "I order, according to the terms & conditions, the following items:" +msgstr "Ik bestel, volgens de voorwaarden en condities, de volgende items:" + +#: FMain.form:57 +msgid "Amount" +msgstr "Bedrag" + +#: FMain.form:67 +msgid "Article" +msgstr "Artikel" + +#: FMain.form:72 +msgid "lines of code from gambas 3" +msgstr "aantal code lijnen van gambas3" + +#: FMain.form:81 +msgid "kg of frozen shrimps" +msgstr "kg bevroren garnalen" + +#: FMain.form:90 +msgid "image files of the Gambas logo" +msgstr "afbeeldingsbestanden van het Gambas logo" + +#: FMain.form:95 +msgid "I want to read the terms and conditions" +msgstr "Ik wil de voorwaarden en condities lezen" + +#: FMain.form:101 +msgid "I want to save my order" +msgstr "Ik wil mijn order opslaan" + +#: FMain.form:105 +msgid "Terms and Conditions" +msgstr "Voorwaarden en condities" + +#: FMain.form:112 +msgid "As this is only an example,
nothing will be ordered,
nothing will be saved,
and nothing will be sent." +msgstr "Gezien dit slechts een voorbeeld is zal er,
niets besteld worden,
niets opgeslagen worden,
en niets verzonden worden." + +#: FMain.form:116 +msgid "Your address" +msgstr "Je adres" + +#: FMain.form:120 +msgid "Please enter your address here:" +msgstr "Voer je adres hier in:" + +#: FMain.form:127 +msgid "Save your order" +msgstr "Order opslaan" + +#: FMain.form:132 +msgid "Where do you want to save your order?" +msgstr "Waar wil je de order opslaan?" + +#: FMain.form:139 +msgid "Send your order" +msgstr "Verzend je order" + +#: FMain.form:147 +msgid "The following items:" +msgstr "De volgende items:" + +#: FMain.form:152 +msgid "will be delivered to:" +msgstr "zal afgeleverd worden aan:" + +#: FMain.form:162 +msgid "Your order is now ready to be sent. Please check if everything is correct." +msgstr "Je order is nu klaar voor verzending. Controleer of alles in orde is." + +#: FMain.class:34 +msgid "Your order was submitted successfully.\nThe wizard will close now." +msgstr "Je opdracht is succesvol ingedient.\nDe wizard zal nu sluiten." + +#: FMain.class:58 +msgid "You didn't enter your address.\nYour order can't be submitted." +msgstr "Je hebt je adres niet ingevoerd.\nDe order kan niet worden ingedient." + diff --git a/app/examples/Control/Wizard/.lang/ru.po b/app/examples/Control/Wizard/.lang/ru.po new file mode 100644 index 00000000..c92d60c6 --- /dev/null +++ b/app/examples/Control/Wizard/.lang/ru.po @@ -0,0 +1,152 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Control/Wizard/.project:18 +msgid "Wizard example" +msgstr "Пример мастера" + +#: app/examples/Control/Wizard/.src/FMain.class:34 +msgid "" +"Your order was submitted successfully.\n" +"The wizard will close now." +msgstr "" +"Ваш заказ был успешно отправлен.\n" +"Мастер сейчас закроется." + +#: app/examples/Control/Wizard/.src/FMain.class:58 +msgid "" +"You didn't enter your address.\n" +"Your order can't be submitted." +msgstr "" +"Вы не ввели свой адрес.\n" +"Ваш заказ не может быть отправлен." + +#: app/examples/Control/Wizard/.src/FMain.form:12 +msgid "Introduction" +msgstr "Введение" + +#: app/examples/Control/Wizard/.src/FMain.form:16 +msgid "" +"Most of the properties of this wizard are selected in the properties window, not by code. This is because for designing the wizard you need the properties window anyway. \n" +"

\n" +"

\n" +"To see the properties window, you have to do save the project in your home directory so that it is not write protected anymore.\n" +"

\n" +"To design the pages of the wizard (or to see the properties), just click in the IDE on the \"Next\" button.\n" +"

\n" +"The essential property of the wizard container is Count. This defines the number of steps the user will have to click through. On the last page the button \"Next\" changes automatically to \"OK\" to finish the task.\n" +"

\n" +"In some situations you might want to skip steps of the wizard. You find this in the code of the CheckBoxes in step 2.\n" +"

\n" +msgstr "" +"Большинство свойств этого мастера выбираются в окне свойств, а не по коду. Это потому, что для разработки мастера вам всё равно нужно окно свойств. \n" +"

\n" +"

\n" +"Чтобы увидеть окно свойств, вам нужно сохранить проект в вашем домашнем каталоге, чтобы он больше не был защищён от записи.\n" +"

\n" +"Чтобы создать страницы мастера (или просмотреть свойства), просто нажмите в среде IDE на кнопку «Далее».\n" +"

\n" +"Основным свойством контейнера мастера является Счёт. Это определяет количество шагов, которые пользователь должен будет пройти. На последней странице кнопка «Далее» автоматически меняется на «ОК» для завершения задачи.\n" +"

\n" +"В некоторых ситуациях вы можете пропустить шаги мастера. Вы найдёте это в коде чекбоксов (флажков) в шаге 2.\n" +"

\n" + +#: app/examples/Control/Wizard/.src/FMain.form:19 +msgid "Your order" +msgstr "Ваш заказ" + +#: app/examples/Control/Wizard/.src/FMain.form:23 +msgid "I order, according to the terms & conditions, the following items:" +msgstr "Я заказываю в соответствии с положения и условиями следующие пункты:" + +#: app/examples/Control/Wizard/.src/FMain.form:28 +msgid "Amount" +msgstr "Кол-во" + +#: app/examples/Control/Wizard/.src/FMain.form:36 +msgid "Article" +msgstr "Статья" + +#: app/examples/Control/Wizard/.src/FMain.form:40 +msgid "lines of code from gambas 3" +msgstr "строк кода из gambas 3" + +#: app/examples/Control/Wizard/.src/FMain.form:47 +msgid "kg of frozen shrimps" +msgstr "кг замороженных креветок" + +#: app/examples/Control/Wizard/.src/FMain.form:54 +msgid "image files of the Gambas logo" +msgstr "файлов изображений логотипа Gambas" + +#: app/examples/Control/Wizard/.src/FMain.form:58 +msgid "I want to read the terms and conditions" +msgstr "Я хочу прочитать положения и условия" + +#: app/examples/Control/Wizard/.src/FMain.form:63 +msgid "I want to save my order" +msgstr "Я хочу сохранить свой заказ" + +#: app/examples/Control/Wizard/.src/FMain.form:67 +msgid "Terms and Conditions" +msgstr "Условия и положения" + +#: app/examples/Control/Wizard/.src/FMain.form:73 +msgid "As this is only an example,
nothing will be ordered,
nothing will be saved,
and nothing will be sent." +msgstr "Поскольку это только пример,
ничего не будет заказано,
ничего не будет сохранено
и ничего не будет отправлено." + +#: app/examples/Control/Wizard/.src/FMain.form:77 +msgid "Your address" +msgstr "Ваш адрес" + +#: app/examples/Control/Wizard/.src/FMain.form:80 +msgid "Please enter your address here:" +msgstr "Пожалуйста, введите ваш адрес здесь:" + +#: app/examples/Control/Wizard/.src/FMain.form:86 +msgid "Save your order" +msgstr "Сохранить ваш заказ" + +#: app/examples/Control/Wizard/.src/FMain.form:90 +msgid "Where do you want to save your order?" +msgstr "Где вы хотите сохранить свой заказ?" + +#: app/examples/Control/Wizard/.src/FMain.form:96 +msgid "Send your order" +msgstr "Отправить ваш заказ" + +#: app/examples/Control/Wizard/.src/FMain.form:102 +msgid "The following items:" +msgstr "Следующие пункты:" + +#: app/examples/Control/Wizard/.src/FMain.form:106 +msgid "will be delivered to:" +msgstr "будет доставлено на:" + +#: app/examples/Control/Wizard/.src/FMain.form:114 +msgid "Your order is now ready to be sent. Please check if everything is correct." +msgstr "Ваш заказ готов к отправке. Пожалуйста, проверьте, всё ли правильно." + diff --git a/app/examples/Control/Wizard/.project b/app/examples/Control/Wizard/.project new file mode 100644 index 00000000..88700328 --- /dev/null +++ b/app/examples/Control/Wizard/.project @@ -0,0 +1,16 @@ +# Gambas Project File 3.0 +Title=Wizard example +Startup=FMain +Icon=wizard.png +Version=3.13.90 +VersionFile=1 +Component=gb.image +Component=gb.gui +Component=gb.form +Component=gb.desktop +Component=gb.pcre +Authors="Matti, slightly modified by Benoît Minisini" +TabSize=2 +Translate=1 +Language=de +Packager=1 diff --git a/app/examples/Control/Wizard/.src/FMain.class b/app/examples/Control/Wizard/.src/FMain.class new file mode 100644 index 00000000..7b91b974 --- /dev/null +++ b/app/examples/Control/Wizard/.src/FMain.class @@ -0,0 +1,65 @@ +' Gambas class file + +Public Sub _new() + Me.Center +End + +Public Sub Wizard1_Cancel() ' user clicks abort + + Me.Close + +End + +Public Sub Wizard1_Change() ' user clicks next + + Select Case Wizard1.Index ' be aware that the index starts with 0! + + Case 1 + vbCode.setFocus + + Case 3 + txaAddress.SetFocus + + Case 5 + + txlOrder.Text = vbCode.Text & " " & lblCode.Text & "
" & vbFrozen.Text & " " & lblFrozen.Text & "
" & vbImg.Text & " " & lblImg.Text + txlAddress.Text = Replace(txaAddress.Text, "\n", "
") + + End Select + +End + +Public Sub Wizard1_Close() ' user clicks ok on the last page + + Message.Info(("Your order was submitted successfully.\nThe wizard will close now.")) + Me.Close + +End + +Public Sub chbTerms_Click() ' user wants (not) to read "terms & conditions" + + Wizard1[2].Enabled = chbTerms.Value ' step 3 is visible or not, according to this decision + +End + +Public Sub chbSave_Click() ' user wants (not) to save + + Wizard1[4].Enabled = chbSave.Value ' step 5 is visible or not, according to this decision + +End + +Public Sub Wizard1_BeforeChange() + + Select Case Wizard1.Index + + Case 4 + + If txaAddress.Text = "" Then + Message.Error(("You didn't enter your address.\nYour order can't be submitted.")) + Wizard1.Index = 3 ' move back to step 4 + Stop Event + Endif + + End Select + +End diff --git a/app/examples/Control/Wizard/.src/FMain.form b/app/examples/Control/Wizard/.src/FMain.form new file mode 100644 index 00000000..0625d087 --- /dev/null +++ b/app/examples/Control/Wizard/.src/FMain.form @@ -0,0 +1,118 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,83,65) + Resizable = False + { Wizard1 Wizard + MoveScaled(1,1,81,63) + Count = 6 + TextFont = Font["Bold,Italic,+3"] + ShowIndex = True + Index = 0 + Text = ("Introduction") + { TextLabel1 TextLabel + MoveScaled(2,2,76,48) + Font = Font["+1"] + Text = ("Most of the properties of this wizard are selected in the properties window, not by code. This is because for designing the wizard you need the properties window anyway. \n

\n

\nTo see the properties window, you have to do save the project in your home directory so that it is not write protected anymore.\n

\nTo design the pages of the wizard (or to see the properties), just click in the IDE on the \"Next\" button.\n

\nThe essential property of the wizard container is Count. This defines the number of steps the user will have to click through. On the last page the button \"Next\" changes automatically to \"OK\" to finish the task.\n

\nIn some situations you might want to skip steps of the wizard. You find this in the code of the CheckBoxes in step 2.\n

\n") + } + Index = 1 + Text = ("Your order") + { TextLabel5 TextLabel + MoveScaled(2,2,75,7) + Font = Font["Bold,+1"] + Text = ("I order, according to the terms & conditions, the following items:") + } + { Label1 Label + MoveScaled(2,8,11,4) + Font = Font["+1"] + Text = ("Amount") + } + { vbCode ValueBox + MoveScaled(2,13,8,4) + } + { Label2 Label + MoveScaled(13,8,11,4) + Font = Font["+1"] + Text = ("Article") + } + { lblCode Label + MoveScaled(13,13,63,4) + Text = ("lines of code from gambas 3") + } + { vbFrozen ValueBox + MoveScaled(2,18,8,4) + } + { lblFrozen Label + MoveScaled(13,18,63,4) + Text = ("kg of frozen shrimps") + } + { vbImg ValueBox + MoveScaled(2,23,8,4) + } + { lblImg Label + MoveScaled(13,23,63,4) + Text = ("image files of the Gambas logo") + } + { chbTerms CheckBox + MoveScaled(2,31,75,5) + Text = ("I want to read the terms and conditions") + Value = CheckBox.True + } + { chbSave CheckBox + MoveScaled(2,37,40,4) + Text = ("I want to save my order") + Value = CheckBox.True + } + Index = 2 + Text = ("Terms and Conditions") + { TextLabel6 TextLabel + MoveScaled(2,2,76,41) + Font = Font["Serif,Bold,Italic,+1"] + Background = Color.TextBackground + Padding = 8 + Text = ("As this is only an example,
nothing will be ordered,
nothing will be saved,
and nothing will be sent.") + Border = Border.Plain + } + Index = 3 + Text = ("Your address") + { Label3 Label + MoveScaled(2,2,41,3) + Text = ("Please enter your address here:") + } + { txaAddress TextArea + MoveScaled(2,6,76,15) + } + Index = 4 + Text = ("Save your order") + { Label4 Label + MoveScaled(2,1,66,4) + Font = Font["Bold"] + Text = ("Where do you want to save your order?") + } + { DirChooser1 DirChooser + MoveScaled(2,5,76,38) + } + Index = 5 + Text = ("Send your order") + { txlOrder TextLabel + MoveScaled(4,13,70,8) + } + { Label6 Label + MoveScaled(2,9,22,3) + Text = ("The following items:") + } + { Label7 Label + MoveScaled(2,23,25,3) + Text = ("will be delivered to:") + } + { txlAddress TextLabel + MoveScaled(4,27,72,15) + } + { TextLabel2 TextLabel + MoveScaled(2,1,75,7) + Font = Font["Bold,+1"] + Text = ("Your order is now ready to be sent. Please check if everything is correct.") + } + Index = 0 + } +} diff --git a/app/examples/Control/Wizard/wizard.png b/app/examples/Control/Wizard/wizard.png new file mode 100644 index 0000000000000000000000000000000000000000..fff0e3f12ac0dfcd7a5137bca353a46c4d506c4d GIT binary patch literal 1510 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 e@IO~y@%VokW#eSwI&%;J0000, 2007-2010. +# +# +msgid "" +msgstr "" +"Project-Id-Version: Database\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2010-12-16 23:33+0100\n" +"Last-Translator: Jordi Sayol \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: FTest.class:136 +msgid "Active" +msgstr "Actiu" + +#: FTest.class:131 +msgid "Birth" +msgstr "Dia de naixement" + +#: FTest.class:60 +msgid "Bound controls example" +msgstr "Exemple de controls del límit" + +#: FMain.class:321 +msgid "" +"Bound controls\n" +"example..." +msgstr "" +"Controls del límit\n" +"exemple..." + +#: FTest.class:116 +msgid "Color" +msgstr "Color" + +#: FTest.class:146 +msgid "Comment" +msgstr "Comentari" + +#: FMain.class:249 +msgid "Connect" +msgstr "Connecta" + +#: FMain.class:220 +msgid "Connection" +msgstr "Connexió" + +#: FMain.class:298 +msgid "Create" +msgstr "Crea" + +#: FMain.class:282 +msgid "Create database if it does not exist" +msgstr "Crea la base de dades si no existeix" + +#: FMain.class:224 +msgid "Database" +msgstr "Base de dades" + +#: FMain.class:214 +msgid "Database example" +msgstr "Exemple de base de dades" + +#: FMain.class:287 +msgid "Debug" +msgstr "Depuració" + +#: FMain.class:303 +msgid "Delete" +msgstr "Suprimeix" + +#: FMain.class:308 +msgid "&Fill with" +msgstr "&Omple amb" + +#: FMain.class:255 +msgid "firebird" +msgstr "-" + +#: FTest.class:121 +msgid "First Name" +msgstr "Nom de pila" + +#: FMain.class:234 +msgid "Host" +msgstr "Ordinador central" + +#: FTest.class:111 +msgid "Id" +msgstr "Identificador" + +#: FMain.class:255 +msgid "mysql" +msgstr "-" + +#: FTest.class:126 +msgid "Name" +msgstr "Nom" + +#: FMain.class:255 +msgid "odbc" +msgstr "-" + +#: FMain.class:244 +msgid "Password" +msgstr "Contrasenya" + +#: FMain.class:255 +msgid "postgresql" +msgstr "-" + +#: FMain.class:326 +msgid "Records" +msgstr "Registres" + +#: FMain.class:337 +msgid "Run..." +msgstr "Executa..." + +#: FTest.class:141 +msgid "Salary" +msgstr "Salari" + +#: FMain.class:255 +msgid "sqlite3" +msgstr "-" + +#: FMain.class:333 +#: FRequest.class:27 +msgid "SQL request" +msgstr "Petició SQL" + +#: FMain.class:294 +msgid "Tables 'test' && 'color'" +msgstr "Taules «comprova» && «color»" + +#: FMain.class:265 +msgid "test" +msgstr "Comprova" + +#: FTest.class:78 +msgid "Test form" +msgstr "Formulari de prova" + +#: FMain.class:229 +msgid "Type" +msgstr "Tipus" + +#: FMain.class:239 +msgid "User" +msgstr "Usuari" + diff --git a/app/examples/Database/Database/.lang/cs.po b/app/examples/Database/Database/.lang/cs.po new file mode 100644 index 00000000..1961309b --- /dev/null +++ b/app/examples/Database/Database/.lang/cs.po @@ -0,0 +1,157 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 FMain.form:33 +msgid "Database example" +msgstr "Příklad databáze" + +#: FMain.form:39 +msgid "Connection" +msgstr "Připojení" + +#: FMain.form:43 +msgid "Database" +msgstr "Databáze" + +#: FMain.form:48 +msgid "Type" +msgstr "Typ" + +#: FMain.form:53 +msgid "Host" +msgstr "-" + +#: FMain.form:58 +msgid "User" +msgstr "Uživatel" + +#: FMain.form:63 +msgid "Password" +msgstr "Heslo" + +#: FMain.form:68 +msgid "Connect" +msgstr "Připojit" + +#: FMain.form:73 +msgid "firebird" +msgstr "-" + +#: FMain.form:73 +msgid "mysql" +msgstr "-" + +#: FMain.form:73 +msgid "odbc" +msgstr "-" + +#: FMain.form:73 +msgid "postgresql" +msgstr "-" + +#: FMain.form:73 +msgid "sqlite3" +msgstr "-" + +#: FMain.form:83 +msgid "test" +msgstr "-" + +#: FMain.form:98 +msgid "Create database if it does not exist" +msgstr "Vytvořit databázi když neexistuje" + +#: FMain.form:103 +msgid "Debug" +msgstr "Ladit" + +#: FMain.form:108 +msgid "Port" +msgstr "-" + +#: FMain.form:119 +msgid "Tables 'test' && 'color'" +msgstr "Takulky 'test' && 'color'" + +#: FMain.form:123 +msgid "Create" +msgstr "Vytvořit" + +#: FMain.form:128 +msgid "Delete" +msgstr "Smazat" + +#: FMain.form:133 +msgid "&Fill with" +msgstr "&Vyplnit s" + +#: FMain.form:146 +msgid "" +"Bound controls\n" +"example..." +msgstr "" +"Příklad na\n" +"vázané ovládací\n" +"prvky..." + +#: FMain.form:151 +msgid "Records" +msgstr "Záznamy" + +#: FMain.form:158 FRequest.class:26 +msgid "SQL request" +msgstr "SQL dotaz" + +#: FMain.form:162 +msgid "Run..." +msgstr "Spustit..." + +#: FTest.form:31 +msgid "Bound controls example" +msgstr "Příklad na vázané ovládací prvky" + +#: FTest.form:49 +msgid "Test form" +msgstr "Testovací formulář" + +#: FTest.form:82 +msgid "Id" +msgstr "-" + +#: FTest.form:87 +msgid "Color" +msgstr "-" + +#: FTest.form:92 +msgid "First Name" +msgstr "Jméno" + +#: FTest.form:97 +msgid "Name" +msgstr "Název" + +#: FTest.form:102 +msgid "Birth" +msgstr "Narození" + +#: FTest.form:107 +msgid "Active" +msgstr "Aktivita" + +#: FTest.form:112 +msgid "Salary" +msgstr "Plat" + +#: FTest.form:117 +msgid "Comment" +msgstr "Komentář" diff --git a/app/examples/Database/Database/.lang/de.po b/app/examples/Database/Database/.lang/de.po new file mode 100644 index 00000000..8362dcd4 --- /dev/null +++ b/app/examples/Database/Database/.lang/de.po @@ -0,0 +1,153 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 FMain.form:33 +msgid "Database example" +msgstr "Datenbank-Beispiel" + +#: FMain.form:39 +msgid "Connection" +msgstr "Verbindung" + +#: FMain.form:43 +msgid "Database" +msgstr "Datenbank" + +#: FMain.form:48 +msgid "Type" +msgstr "Typ" + +#: FMain.form:53 +msgid "Host" +msgstr "-" + +#: FMain.form:58 +msgid "User" +msgstr "Benutzer" + +#: FMain.form:63 +msgid "Password" +msgstr "Passwort" + +#: FMain.form:68 +msgid "Connect" +msgstr "Verbinden" + +#: FMain.form:73 +msgid "firebird" +msgstr "-" + +#: FMain.form:73 +msgid "mysql" +msgstr "-" + +#: FMain.form:73 +msgid "odbc" +msgstr "-" + +#: FMain.form:73 +msgid "postgresql" +msgstr "-" + +#: FMain.form:73 +msgid "sqlite3" +msgstr "-" + +#: FMain.form:83 +msgid "test" +msgstr "-" + +#: FMain.form:98 +msgid "Create database if it does not exist" +msgstr "Datenbank erstellen, falls sie nicht existiert" + +#: FMain.form:103 +msgid "Debug" +msgstr "Debuggen" + +#: FMain.form:108 +msgid "Port" +msgstr "-" + +#: FMain.form:119 +msgid "Tables 'test' && 'color'" +msgstr "Tabellen 'test' && 'color'" + +#: FMain.form:123 +msgid "Create" +msgstr "Erstellen" + +#: FMain.form:128 +msgid "Delete" +msgstr "Löschen" + +#: FMain.form:133 +msgid "&Fill with" +msgstr "&Füllen mit" + +#: FMain.form:146 +msgid "Bound controls\nexample..." +msgstr "Beispiel:\nGebundene\nSchaltflächen..." + +#: FMain.form:151 +msgid "Records" +msgstr "Datensätze" + +#: FMain.form:158 FRequest.class:26 +msgid "SQL request" +msgstr "SQL-Abfrage" + +#: FMain.form:162 +msgid "Run..." +msgstr "Ausführen..." + +#: FTest.form:31 +msgid "Bound controls example" +msgstr "Beispiel für gebundene Schaltflächen" + +#: FTest.form:49 +msgid "Test form" +msgstr "Testformular" + +#: FTest.form:82 +msgid "Id" +msgstr "ID" + +#: FTest.form:87 +msgid "Color" +msgstr "Farbe" + +#: FTest.form:92 +msgid "First Name" +msgstr "Vorname" + +#: FTest.form:97 +msgid "Name" +msgstr "Nachname" + +#: FTest.form:102 +msgid "Birth" +msgstr "Geburtsdatum" + +#: FTest.form:107 +msgid "Active" +msgstr "Aktiv" + +#: FTest.form:112 +msgid "Salary" +msgstr "Gehalt" + +#: FTest.form:117 +msgid "Comment" +msgstr "Kommentar" + diff --git a/app/examples/Database/Database/.lang/es.po b/app/examples/Database/Database/.lang/es.po new file mode 100644 index 00000000..d41e9b09 --- /dev/null +++ b/app/examples/Database/Database/.lang/es.po @@ -0,0 +1,151 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: FMain.class:211 +msgid "Database example" +msgstr "Ejemplo de base de datos" + +#: FMain.class:217 +msgid "Connection" +msgstr "Conexión" + +#: FMain.class:221 +msgid "Database" +msgstr "Base de datos" + +#: FMain.class:226 +msgid "Type" +msgstr "Tipo" + +#: FMain.class:231 +msgid "Host" +msgstr "Servidor" + +#: FMain.class:236 +msgid "User" +msgstr "Usuario" + +#: FMain.class:241 +msgid "Password" +msgstr "Contraseña" + +#: FMain.class:246 +msgid "Connect" +msgstr "Conectar" + +#: FMain.class:251 +msgid "firebird" +msgstr "firebird" + +#: FMain.class:251 +msgid "mysql" +msgstr "mysql" + +#: FMain.class:251 +msgid "odbc" +msgstr "odbc" + +#: FMain.class:251 +msgid "postgresql" +msgstr "postgresql" + +#: FMain.class:251 +msgid "sqlite3" +msgstr "sqlite3" + +#: FMain.class:261 +msgid "test" +msgstr "test" + +#: FMain.class:276 +msgid "Create database if it does not exist" +msgstr "Crear la base de datos si no existe" + +#: FMain.class:281 +msgid "Debug" +msgstr "Depurar" + +#: FMain.class:288 +msgid "Tables 'test' && 'color'" +msgstr "Tablas 'test' && 'color'" + +#: FMain.class:292 +msgid "Create" +msgstr "Crear" + +#: FMain.class:297 +msgid "Delete" +msgstr "Borrar" + +#: FMain.class:302 +msgid "&Fill with" +msgstr "&Llenar con" + +#: FMain.class:315 +msgid "" +"Bound controls\n" +"example..." +msgstr "" +"Ejemplo de\n" +"controles de acceso..." + +#: FMain.class:320 +msgid "Records" +msgstr "Registros" + +#: FMain.class:327 FRequest.class:26 +msgid "SQL request" +msgstr "Consulta SQL" + +#: FMain.class:331 +msgid "Run..." +msgstr "Correr..." + +#: FTest.class:53 +msgid "Bound controls example" +msgstr "Ejemplo de controles de acceso" + +#: FTest.class:71 +msgid "Test form" +msgstr "Formulario de prueba" + +#: FTest.class:104 +msgid "Id" +msgstr "Id" + +#: FTest.class:109 +msgid "Color" +msgstr "Color" + +#: FTest.class:114 +msgid "First Name" +msgstr "Primer nombre" + +#: FTest.class:119 +msgid "Name" +msgstr "Nombre" + +#: FTest.class:124 +msgid "Birth" +msgstr "Nacimiento" + +#: FTest.class:129 +msgid "Active" +msgstr "Activo" + +#: FTest.class:134 +msgid "Salary" +msgstr "Salario" + +#: FTest.class:139 +msgid "Comment" +msgstr "Comentario" diff --git a/app/examples/Database/Database/.lang/nl.po b/app/examples/Database/Database/.lang/nl.po new file mode 100644 index 00000000..73496e2f --- /dev/null +++ b/app/examples/Database/Database/.lang/nl.po @@ -0,0 +1,147 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Database 3.5.90\n" +"PO-Revision-Date: 2014-09-24 16:00 UTC\n" +"Last-Translator: Willy Raets \n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 FMain.form:33 +msgid "Database example" +msgstr "Database voorbeeld" + +#: FMain.form:39 +msgid "Connection" +msgstr "Verbinding" + +#: FMain.form:43 +msgid "Database" +msgstr "-" + +#: FMain.form:48 +msgid "Type" +msgstr "-" + +#: FMain.form:53 +msgid "Host" +msgstr "-" + +#: FMain.form:58 +msgid "User" +msgstr "Gebruiker" + +#: FMain.form:63 +msgid "Password" +msgstr "Wachtwoord" + +#: FMain.form:68 +msgid "Connect" +msgstr "Verbind" + +#: FMain.form:73 +msgid "postgresql" +msgstr "-" + +#: FMain.form:73 +msgid "mysql" +msgstr "-" + +#: FMain.form:73 +msgid "sqlite3" +msgstr "-" + +#: FMain.form:73 +msgid "odbc" +msgstr "-" + +#: FMain.form:83 +msgid "test" +msgstr "-" + +#: FMain.form:98 +msgid "Create database if it does not exist" +msgstr "Creëer database indien deze niet bestaat" + +#: FMain.form:103 +msgid "Debug" +msgstr "Foutenopsporing" + +#: FMain.form:108 +msgid "Port" +msgstr "Poort" + +#: FMain.form:119 +msgid "Tables 'test' && 'color'" +msgstr "Tabellen 'test' && 'kleur'" + +#: FMain.form:123 +msgid "Create" +msgstr "Creëer" + +#: FMain.form:128 +msgid "Delete" +msgstr "Verwijder" + +#: FMain.form:133 +msgid "&Fill with" +msgstr "&Vullen met" + +#: FMain.form:146 +msgid "Bound controls\nexample..." +msgstr "Gebonden controles\nvoorbeeld..." + +#: FMain.form:151 +msgid "Records" +msgstr "-" + +#: FMain.form:158 FRequest.class:26 +msgid "SQL request" +msgstr "SQL verzoek" + +#: FMain.form:162 +msgid "Run..." +msgstr "Uitvoeren..." + +#: FTest.form:31 +msgid "Bound controls example" +msgstr "Gebonden controles voorbeeld" + +#: FTest.form:49 +msgid "Test form" +msgstr "Test formulier" + +#: FTest.form:82 +msgid "Id" +msgstr "-" + +#: FTest.form:87 +msgid "Color" +msgstr "Kleur" + +#: FTest.form:92 +msgid "First Name" +msgstr "Voornaam" + +#: FTest.form:97 +msgid "Name" +msgstr "Naam" + +#: FTest.form:102 +msgid "Birth" +msgstr "Geboorte" + +#: FTest.form:107 +msgid "Active" +msgstr "Actief" + +#: FTest.form:112 +msgid "Salary" +msgstr "Salaris" + +#: FTest.form:117 +msgid "Comment" +msgstr "Commentaar" + diff --git a/app/examples/Database/Database/.lang/ru.po b/app/examples/Database/Database/.lang/ru.po new file mode 100644 index 00000000..607d1915 --- /dev/null +++ b/app/examples/Database/Database/.lang/ru.po @@ -0,0 +1,198 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Database/Database/.project:21 app/examples/Database/Database/.src/FMain.form:5 +msgid "Database example" +msgstr "Пример базы данных" + +#: app/examples/Database/Database/.src/FMain.class:102 +msgid "Black" +msgstr "Чёрный" + +#: app/examples/Database/Database/.src/FMain.class:102 +msgid "White" +msgstr "Белый" + +#: app/examples/Database/Database/.src/FMain.class:102 +msgid "Red" +msgstr "Красный" + +#: app/examples/Database/Database/.src/FMain.class:102 +msgid "Green" +msgstr "Зелёный" + +#: app/examples/Database/Database/.src/FMain.class:102 +msgid "Blue" +msgstr "Синий" + +#: app/examples/Database/Database/.src/FMain.class:102 +msgid "Yellow" +msgstr "Жёлтый" + +#: app/examples/Database/Database/.src/FMain.class:102 +msgid "Transparent" +msgstr "Прозрачный" + +#: app/examples/Database/Database/.src/FMain.class:118 +msgid "Name #" +msgstr "Имя #" + +#: app/examples/Database/Database/.src/FMain.form:10 +msgid "Connection" +msgstr "Соединение" + +#: app/examples/Database/Database/.src/FMain.form:13 +msgid "Database" +msgstr "База данных" + +#: app/examples/Database/Database/.src/FMain.form:17 +msgid "Type" +msgstr "Тип" + +#: app/examples/Database/Database/.src/FMain.form:21 +msgid "Host" +msgstr "Хост" + +#: app/examples/Database/Database/.src/FMain.form:25 +msgid "User" +msgstr "Пользователь" + +#: app/examples/Database/Database/.src/FMain.form:29 +msgid "Password" +msgstr "Пароль" + +#: app/examples/Database/Database/.src/FMain.form:33 +msgid "Connect" +msgstr "Соединить" + +#: app/examples/Database/Database/.src/FMain.form:37 +msgid "postgresql" +msgstr "postgresql" + +#: app/examples/Database/Database/.src/FMain.form:37 +msgid "mysql" +msgstr "mysql" + +#: app/examples/Database/Database/.src/FMain.form:37 +msgid "sqlite3" +msgstr "sqlite3" + +#: app/examples/Database/Database/.src/FMain.form:37 +msgid "odbc" +msgstr "odbc" + +#: app/examples/Database/Database/.src/FMain.form:58 +msgid "Create database if it does not exist" +msgstr "Создать базу данных, если она не существует" + +#: app/examples/Database/Database/.src/FMain.form:62 +msgid "Debug" +msgstr "Отладка" + +#: app/examples/Database/Database/.src/FMain.form:66 +msgid "Port" +msgstr "Порт" + +#: app/examples/Database/Database/.src/FMain.form:75 +msgid "Tables 'test' && 'color'" +msgstr "Таблицы 'тест' && 'цвет'" + +#: app/examples/Database/Database/.src/FMain.form:78 +msgid "Create" +msgstr "Создать" + +#: app/examples/Database/Database/.src/FMain.form:82 +msgid "Delete" +msgstr "Удалить" + +#: app/examples/Database/Database/.src/FMain.form:86 +msgid "&Fill with" +msgstr "Наполнить" + +#: app/examples/Database/Database/.src/FMain.form:97 +msgid "" +"Bound controls\n" +"example..." +msgstr "" +"Пр-р элементов\n" +"упр. границами..." + +#: app/examples/Database/Database/.src/FMain.form:101 +msgid "Records" +msgstr "Записей" + +#: app/examples/Database/Database/.src/FMain.form:107 app/examples/Database/Database/.src/FRequest.class:26 +msgid "SQL request" +msgstr "SQL запрос" + +#: app/examples/Database/Database/.src/FMain.form:110 +msgid "Run..." +msgstr "Запуск..." + +#: app/examples/Database/Database/.src/FRequest.class:66 +msgid "Cannot exec request." +msgstr "Невозможно выполнить запрос." + +#: app/examples/Database/Database/.src/FTest.form:5 +msgid "Bound controls example" +msgstr "Пример элементов управления границами" + +#: app/examples/Database/Database/.src/FTest.form:21 +msgid "Test form" +msgstr "Тестовая форма" + +#: app/examples/Database/Database/.src/FTest.form:48 +msgid "Id" +msgstr "Идентификатор" + +#: app/examples/Database/Database/.src/FTest.form:52 +msgid "Color" +msgstr "Цвет" + +#: app/examples/Database/Database/.src/FTest.form:56 +msgid "First Name" +msgstr "Первое имя" + +#: app/examples/Database/Database/.src/FTest.form:60 +msgid "Name" +msgstr "Имя" + +#: app/examples/Database/Database/.src/FTest.form:64 +msgid "Birth" +msgstr "Дата рождения" + +#: app/examples/Database/Database/.src/FTest.form:68 +msgid "Active" +msgstr "Активен" + +#: app/examples/Database/Database/.src/FTest.form:72 +msgid "Salary" +msgstr "Зарплата" + +#: app/examples/Database/Database/.src/FTest.form:76 +msgid "Comment" +msgstr "Комментарий" + diff --git a/app/examples/Database/Database/.project b/app/examples/Database/Database/.project new file mode 100644 index 00000000..9440cd6e --- /dev/null +++ b/app/examples/Database/Database/.project @@ -0,0 +1,20 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.8.90 +Title=Database example +Startup=FMain +Icon=database.png +Version=3.8.90 +VersionFile=1 +Component=gb.image +Component=gb.gui +Component=gb.form +Component=gb.db +Component=gb.db.form +TabSize=2 +Translate=1 +Language=fr +Maintainer=fabien +Vendor=Princeton +Address=fabien@arcalis +License=General Public Licence +Packager=1 diff --git a/app/examples/Database/Database/.src/FMain.class b/app/examples/Database/Database/.src/FMain.class new file mode 100644 index 00000000..1379445f --- /dev/null +++ b/app/examples/Database/Database/.src/FMain.class @@ -0,0 +1,178 @@ +' Gambas class file + +Private $hConn As Connection + +Public Sub btnConnect_Click() + + Dim sName As String + + Try $hConn.Close + '$hConn = NEW Connection + + sName = txtName.Text + + With $hConn + .Type = cmbType.Text + .Host = txtHost.Text + .Port = txtPort.Text + .Login = txtUser.Text + .Password = txtPassword.Text + .Name = "" + End With + + If chkCreate.Value Then + + $hConn.Open + If Not $hConn.Databases.Exist(sName) Then + $hConn.Databases.Add(sName) + Endif + $hConn.Close + + Endif + + $hConn.Name = sName + $hConn.Open + + frmDatabase.Enabled = True + frmRequest.Enabled = True + +Catch + + Message.Error(DConv(Error.Text)) + +End + +Public Sub btnCreate_Click() + + Dim hTable As Table + + hTable = $hConn.Tables.Add("test") + + hTable.Fields.Add("id", db.Long) + hTable.Fields.Add("color", db.Integer,, 1) + hTable.Fields.Add("firstname", db.String, 16) + hTable.Fields.Add("name", db.String, 32) + hTable.Fields.Add("birth", db.Date) + hTable.Fields.Add("active", db.Boolean) + hTable.Fields.Add("salary", db.Float) + hTable.Fields.Add("comment", db.String) + hTable.Fields.Add("image", db.Blob) + + hTable.PrimaryKey = ["id"] + + hTable.Update + + hTable = $hConn.Tables.Add("color") + + hTable.Fields.Add("color", db.Serial) + hTable.Fields.Add("name", gb.String, 32) + hTable.Fields.Add("french", gb.String, 32) + + hTable.PrimaryKey = ["color"] + + hTable.Update + +Catch + + Message.Error(DConv(Error.Text)) + +End + +Public Sub btnDelete_Click() + + Try $hConn.Tables.Remove("test") + Try $hConn.Tables.Remove("color") + +End + +Public Sub btnFill_Click() + + Dim iInd As Integer + Dim rTest As Result + Dim rColor As Result + Dim sColor As String + Dim aName As String[] = ["Paul", "Pierre", "Jacques", "Antoine", "Mathieu", "Robert", "Stéphane", "Yannick", "Frédéric"] + Dim aFrench As String[] = ["Noir", "Blanc", "Rouge", "Vert", "Bleu", "Jaune", "Transparent"] + Inc Application.Busy + + $hConn.Begin + + rColor = $hConn.Create("color") + + For Each sColor In [("Black"), ("White"), ("Red"), ("Green"), ("Blue"), ("Yellow"), ("Transparent")] + + rColor!name = sColor + rColor!french = aFrench[iInd] + Inc iInd + rColor.Update + + Next + + rTest = $hConn.Create("test") + + For iInd = 1 To txtCount.Value + + rTest!id = iInd + rTest!color = Int(Rnd(6)) + 1 + rTest!firstname = aName[Int(Rnd(aName.Count))] + rTest!name = ("Name #") & iInd + rTest!birth = CDate("01/01/1970") + Int(Rnd(10000)) + rTest!active = Int(Rnd(2)) + rTest!salary = Round(Rnd(1000, 10000), -2) + + rTest.Update + + Next + + $hConn.Commit + +Finally + + Dec Application.Busy + +Catch + + $hConn.Rollback + Message.Error(DConv(Error.Text)) + +End + +Public Sub btnRun_Click() + + Dim rData As Result + Dim hForm As FRequest + + rData = $hConn.Exec(txtRequest.Text) + hForm = New FRequest($hConn, rData) + hForm.Show + +'Catch + + 'Message.Error(DConv(Error.Text)) + +End + +Public Sub Form_Open() + + $hConn = New Connection + FRequest.Init = True + +End + +Public Sub Form_Close() + + $hConn.Close + +End + +Public Sub chkDebug_Click() + + DB.Debug = chkDebug.Value + +End + +Public Sub btnTest_Click() + + FTest.Show + +End diff --git a/app/examples/Database/Database/.src/FMain.form b/app/examples/Database/Database/.src/FMain.form new file mode 100644 index 00000000..11001875 --- /dev/null +++ b/app/examples/Database/Database/.src/FMain.form @@ -0,0 +1,118 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(43.5714,25,63,79) + Text = ("Database example") + Icon = Picture["database.png"] + Resizable = False + { Frame1 Frame + MoveScaled(1,1,61,40) + Text = ("Connection") + { Label5 Label + MoveScaled(2,19,14,4) + Text = ("Database") + } + { Label1 Label + MoveScaled(2,4,15,4) + Text = ("Type") + } + { Label2 Label + MoveScaled(2,9,15,4) + Text = ("Host") + } + { Label3 Label + MoveScaled(2,24,14,4) + Text = ("User") + } + { Label4 Label + MoveScaled(2,29,14,4) + Text = ("Password") + } + { btnConnect Button + MoveScaled(46,4,13,4) + Text = ("Connect") + } + { cmbType ComboBox + MoveScaled(18,4,24,4) + List = [("postgresql"), ("mysql"), ("sqlite3"), ("odbc")] + Text = (" ") + } + { txtHost TextBox + MoveScaled(18,9,24,4) + } + { txtName TextBox + MoveScaled(18,19,24,4) + #Translate = False + Text = "test" + } + { txtUser TextBox + MoveScaled(18,24,24,4) + MaxLength = 16 + } + { txtPassword TextBox + MoveScaled(18,29,24,4) + Password = True + } + { chkCreate CheckBox + MoveScaled(2,34,56,4) + Text = ("Create database if it does not exist") + } + { chkDebug CheckBox + MoveScaled(46,9,13,4) + Text = ("Debug") + } + { Label7 Label + MoveScaled(2,14,15,4) + Text = ("Port") + } + { txtPort TextBox + MoveScaled(18,14,24,4) + } + } + { frmDatabase Frame + MoveScaled(1,42,61,15) + Enabled = False + Text = ("Tables 'test' && 'color'") + { btnCreate Button + MoveScaled(2,4,12,4) + Text = ("Create") + } + { btnDelete Button + MoveScaled(2,9,12,4) + Text = ("Delete") + } + { btnFill Button + MoveScaled(18,4,16,4) + Text = ("&Fill with") + } + { txtCount SpinBox + MoveScaled(18,9,11,4) + MinValue = 10 + MaxValue = 100000 + Step = 1000 + Value = 10000 + } + { btnTest Button + MoveScaled(41,4,18,9) + Text = ("Bound controls\nexample...") + } + { Label6 Label + MoveScaled(30,9,10,4) + Text = ("Records") + } + } + { frmRequest Frame + MoveScaled(1,58,61,20) + Enabled = False + Text = ("SQL request") + { btnRun Button + MoveScaled(49,4,11,4) + Text = ("Run...") + Default = True + } + { txtRequest TextArea + MoveScaled(2,4,46,15) + Wrap = True + } + } +} diff --git a/app/examples/Database/Database/.src/FRequest.class b/app/examples/Database/Database/.src/FRequest.class new file mode 100644 index 00000000..0d82f97f --- /dev/null +++ b/app/examples/Database/Database/.src/FRequest.class @@ -0,0 +1,131 @@ +' Gambas class file + +Static Public Init As Boolean + +Private $hConn As Connection +Private $rData As Result + +Public Sub _new(hConn As Connection, rData As Result) + + $hConn = hConn + $rData = rData + + RefreshTitle + + ReadData + + Me.Move(Int(Rnd(Desktop.W - Me.W)), Int(Rnd(Desktop.H - Me.H))) + +End + + +Private Sub RefreshTitle() + + Dim sTitle As String + + sTitle = ("SQL request") & " - " & $hConn.Name + + Me.Title = sTitle + +End + + +Private Sub ReadData() + + Dim hField As ResultField + Dim iInd As Integer + + Inc Application.Busy + + tbvData.Rows.Count = 0 + + tbvData.Columns.Count = $rData.Fields.Count + + For Each hField In $rData.Fields + + With hField + + 'PRINT .Name; ": "; .Type; " "; .Length + + tbvData.Columns[iInd].Text = .Name + tbvData.Columns[iInd].Width = WidthFromType(tbvData, .Type, .Length, .Name) + + End With + + Inc iInd + Next + + tbvData.Rows.Count = $rData.Count + +Finally + + Dec Application.Busy + +Catch + + Message.Error(("Cannot exec request.") & "\n\n" & DConv(Error.Text)) + +End + + +Public Sub tbvData_Data(Row As Integer, Column As Integer) + + $rData.MoveTo(Row) + + tbvData.Data.Text = Str($rData[tbvData.Columns[Column].Text]) + tbvData.Data.Background = Color.RGB((Row Mod 31) * 8, (Row Mod 17) * 15, (Row Mod 13) * 21) + tbvData.Data.Foreground = Color.White + +End + + +Private Function WidthFromType(hCtrl As Control, iType As Integer, iLength As Integer, sTitle As String) As Integer + + Dim iWidth As Integer + + Select Case iType + + Case gb.Boolean + iWidth = hCtrl.Font.TextWidth(Str(False)) + 32 + + Case gb.Integer + iWidth = hCtrl.Font.TextWidth("1234567890") + 16 + + Case gb.Long + iWidth = hCtrl.Font.TextWidth("12345678901234567890") + 16 + + Case gb.Float + iWidth = hCtrl.Font.TextWidth(CStr(Pi) & "E+999") + 16 + + Case gb.Date + iWidth = hCtrl.Font.TextWidth(Str(Now)) + 16 + + Case gb.String + If iLength = 0 Then iLength = 255 + iLength = Min(32, iLength) + iWidth = hCtrl.Font.TextWidth("X") * iLength + 16 + + End Select + + iWidth = Max(iWidth, hCtrl.Font.TextWidth(sTitle) + 8) + + Return iWidth + +End + +' Private Function rowcount() As Integer +' +' Dim rows As Integer +' +' rows = 0 +' Do +' $rData.MoveTo(rows) +' Inc rows +' Loop +' +' Catch +' +' Return rows +' +' End + diff --git a/app/examples/Database/Database/.src/FRequest.form b/app/examples/Database/Database/.src/FRequest.form new file mode 100644 index 00000000..ba9a0184 --- /dev/null +++ b/app/examples/Database/Database/.src/FRequest.form @@ -0,0 +1,12 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(29.1667,19.3333,77.5,54.1667) + Text = ("") + Arrangement = Arrange.Fill + { tbvData GridView + MoveScaled(1,1,36,29) + Mode = Select.Single + Header = GridView.Both + } +} diff --git a/app/examples/Database/Database/.src/FTest.class b/app/examples/Database/Database/.src/FTest.class new file mode 100644 index 00000000..91803ebd --- /dev/null +++ b/app/examples/Database/Database/.src/FTest.class @@ -0,0 +1,25 @@ +' Gambas class file + +'PRIVATE $hConn AS NEW Connection + +Public Sub Form_Open() + + 'DataSource2.Connection = DB.Current + +End + +Public Sub DataControl6_Validate(Value As Variant) + + If IsNull(Value) Then Return + If Value < 0 Or Value > 10000 Then + Stop Event + Endif + +End + + +' Public Sub DataSource1_BeforeSave(Data As Result) +' +' Data["color"] = DataSource2["color"] +' +' End diff --git a/app/examples/Database/Database/.src/FTest.form b/app/examples/Database/Database/.src/FTest.form new file mode 100644 index 00000000..c81fefdc --- /dev/null +++ b/app/examples/Database/Database/.src/FTest.form @@ -0,0 +1,121 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(3,10,99,92) + Text = ("Bound controls example") + Arrangement = Arrange.Fill + Spacing = True + Margin = True + { DataSource2 DataSource + MoveScaled(1,1,97,90) + Arrangement = Arrange.Vertical + Spacing = True + Table = "color" + ReadOnly = True + { Label7 Label + MoveScaled(1,1,95,4) + Font = Font["Bold,+1"] + Background = Color.SelectedBackground + Foreground = Color.SelectedForeground + Padding = 4 + Text = ("Test form") + } + { DataBrowser2 DataBrowser + MoveScaled(1,6,95,10) + Control = False + Columns = ["name"] + Header = False + } + { DataSource1 DataSource + MoveScaled(1,17,95,72) + Expand = True + Arrangement = Arrange.Vertical + Spacing = True + Table = "test" + { DataBrowser1 DataBrowser + MoveScaled(7,4,87,14) + Expand = True + Columns = ["id", "active", "firstname"] + } + { HBox1 HBox + MoveScaled(2,21,90,50) + Spacing = True + { VBox2 VBox + MoveScaled(1,1,26,39) + Spacing = True + { Label1 Label + MoveScaled(1,3,30,4) + Text = ("Id") + } + { Label9 Label + MoveScaled(1,7,30,4) + Text = ("Color") + } + { Label2 Label + MoveScaled(1,11,30,4) + Text = ("First Name") + } + { Label3 Label + MoveScaled(1,15,30,4) + Text = ("Name") + } + { Label4 Label + MoveScaled(1,19,30,4) + Text = ("Birth") + } + { Label5 Label + MoveScaled(1,23,30,4) + Text = ("Active") + } + { Label6 Label + MoveScaled(1,27,30,4) + Text = ("Salary") + } + { Label8 Label + MoveScaled(1,31,30,4) + Text = ("Comment") + } + } + { VBox1 VBox + MoveScaled(28,1,61,48) + Expand = True + Spacing = True + { DataControl1 DataControl + MoveScaled(1,2,30,4) + Field = "id" + } + { DataCombo1 DataCombo + MoveScaled(1,7,30,4) + Field = "color" + Table = "color" + } + { DataControl2 DataControl + MoveScaled(1,12,30,4) + Field = "firstname" + } + { DataControl3 DataControl + MoveScaled(1,17,30,4) + Field = "name" + } + { DataControl4 DataControl + MoveScaled(1,22,30,4) + Field = "birth" + } + { DataControl5 DataControl + MoveScaled(1,27,30,4) + Field = "active" + } + { DataControl6 DataControl + MoveScaled(1,32,30,4) + Field = "salary" + } + { DataControl7 DataControl + MoveScaled(1,37,42,10) + Expand = True + Field = "comment" + } + } + } + } + } +} diff --git a/app/examples/Database/Database/.src/Form1.class b/app/examples/Database/Database/.src/Form1.class new file mode 100644 index 00000000..8239c98f --- /dev/null +++ b/app/examples/Database/Database/.src/Form1.class @@ -0,0 +1,83 @@ +' Gambas class file + +Private $hConn As New Connection +Private $res As Result +'------------------------------------------------- +Public Sub Form_Open() +Dim iCount As Integer +Dim hTable As Table +Dim rTest As Result +Dim sql As String + +'define the gridview layout +GridView1.header = GridView.Horizontal +GridView1.grid = True +GridView1.Rows.count = 0 +GridView1.Columns.count = 2 +GridView1.Columns[0].text = "ID" +GridView1.Columns[1].text = "Value" +GridView1.Columns[0].width = 55 +GridView1.Columns[1].width = 55 + + +With $hConn + .Type = "sqlite" + .host = User.home + .name = "" +End With + +' 'delete an existing test.sqlite +' If Exist(User.home & "/test.sqlite") Then +' Kill User.home & "/test.sqlite" +' Endif + +' 'create test.sqlite +' $hConn.Open +' $hConn.Databases.Add("test.sqlite") +' $hconn.Close + +'define the table sampleTable +$hconn.name = "test.sqlite" +$hConn.Open +' hTable = $hConn.Tables.Add("sampleTable") +' hTable.Fields.Add("s_seq", db.Integer) +' hTable.Fields.Add("s_rndm", db.Integer) +' hTable.PrimaryKey = ["s_seq"] +' hTable.Update +' +' 'fill the table with generated data +' $hconn.Begin +' rTest = $hConn.Create("sampleTable") +' For iCount = 1 To 1000000 +' rTest!s_seq = iCount +' rTest!s_rndm = Int(Rnd(0, 100)) +' rTest.Update +' Next +' $hConn.Commit + +'read the database +sql = "select s_seq as ID, s_rndm as Value from sampleTable" +$res = $hconn.Exec(sql) + +Catch +$hConn.Rollback +Message.Error(DConv(Error.Text)) + +End +'------------------------------------------------- +Public Sub Form_Activate() +'change the rowcount of the gridview from 0 to the number of records. +'This triggers the data handling event + +GridView1.Rows.Count = $res.Count +End +'------------------------------------------------- +Public Sub GridView1_Data(Row As Integer, Column As Integer) + $res.moveTo(row) + GridView1.Data.text = Str($res[GridView1.Columns[column].text]) +End +'------------------------------------------------- +Public Sub Form_Close() + $hconn.Close +End +'------------------------------------------------- \ No newline at end of file diff --git a/app/examples/Database/Database/.src/Form1.form b/app/examples/Database/Database/.src/Form1.form new file mode 100644 index 00000000..08c1b47e --- /dev/null +++ b/app/examples/Database/Database/.src/Form1.form @@ -0,0 +1,8 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,64,64) + { GridView1 GridView + MoveScaled(6,5,44,45) + } +} diff --git a/app/examples/Database/Database/database.png b/app/examples/Database/Database/database.png new file mode 100644 index 0000000000000000000000000000000000000000..e809be00a7a242c7d0723424ae6ac56f594d0b34 GIT binary patch literal 1142 zcmV-+1d02JP)kdg000C%Nkl0zzS9% z7Jwp^A|%8LRulnQfI?8(x^0})@z@^69(z1r_v5he%{a8B_v-3M=braD@B5tRyibV! z{}aOT7(ZrFh#w02S?$#?rOzEbJHC=!Y^*Taj1TMgXWl8+e*2g2=N|%#PrbLMwr;My zw$~fSEatI@WqcfWVm}r!kK;IsdxvYUZQZ;z^>oZ6gAnfg@Z67^(?M#ii&RvT$PkrI znN^5}{q~PO`;#Y`Q~-Z!E&gWp>m+Ithe|;}m}E(zCCC-n_+#fgU+qo+{=9hZ?!q~O z)FFbpL{L+g7|TVaQZATAf&F&-#>=}Tgk=1SnR8=fxxS*>EtjjQNi^gNr4og)+}POk za`y9(P(wKVkzJ=J+9>oT3R!g$^$H|Rc0W=Y zoMe!Pwj~|26Z{jAsmgeI_Ry3^M#%(VDDl80j5X9h=5}O88dC30z-thO<*6N|)KxR) zZ3%)@GU4U;aF-qEdC!Jf9jn6$!09woQ@7`y6&EaOxNqd8N{@fV4TZh~ZF_>TD;3K% zDC$$LyDzO|!km^(f0I^+nCQ4{q*NH;vdrVUcnlCn25N5D(9t%h5OkIDioQfmS1_<{ z-!oP{G^+m9V4OAT+eXg%l$JaGq2)j(ksw!ynzlt>(6j5`>iTB03BY{OsrSrz%Z5+5 zZrgd!C>%J%oH;ceZRb7qNZVLlVm6-uICWXmP-?8_z$Hs|ZL2wjeLD)vKBpsB%9NTe zYd4?L!I619aG)ncYD-r!;UKkR8GUVqYl2PL2?zb6nZ9qq^G5cp+0(NxMH0)SF=?*Kq*D7f zl~VI&ENW;-j0}u4)%EoZ6oQeLY&D zMsbqC`)e1jtvl;EL+==xwxq9AD8;I^^d0(-9T#2o&;zC2x5cWde)IXS-QKFL>RWY1 zLs!?Kp-dr4)l4~~WnR>F-@ZBP*}WHEzcXp;-}w9sf4H==r(wm4GiF4&hJT7)G?b~U z8`!dC)6n42?VG><*Z)}C7n?8q>f$THMdz(J>uo#ANePK1pR{e$hWFz3?{0thje!## zz#D_`>MNf<`-A?sij{>B^^}TA2Pt|o@5Z~EZ{6DY>Ff7S9P$I^8Uo+Ge&&0NpP9ap zEHzrS8AeB0cepd&*uT5~%U|F7pjU^FcJ9j9pE%p`@R3XZ3%msZw|{wOI{*Lx07*qo IM6N<$f-aytd;kCd literal 0 HcmV?d00001 diff --git a/app/examples/Database/MySQLExample/.directory b/app/examples/Database/MySQLExample/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/app/examples/Database/MySQLExample/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/app/examples/Database/MySQLExample/.icon.png b/app/examples/Database/MySQLExample/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0f8466493051fa0414212f65152a1637de7d3239 GIT binary patch literal 4409 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 literal 0 HcmV?d00001 diff --git a/app/examples/Database/MySQLExample/.lang/ca.po b/app/examples/Database/MySQLExample/.lang/ca.po new file mode 100644 index 00000000..279dac1f --- /dev/null +++ b/app/examples/Database/MySQLExample/.lang/ca.po @@ -0,0 +1,539 @@ +msgid "" +msgstr "" +"Project-Id-Version: MySQLExample\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2011-03-20 19:46+0100\n" +"Last-Translator: Jordi Sayol \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: FNewField.class:114 +msgid "Accepts NULLs:" +msgstr "Accepta NULLs:" + +#: FNewField.class:79 +msgid "Add Field" +msgstr "Afegeix camp" + +#: .project:2 +msgid "A simple GB.MYSQL Example" +msgstr "Un exemple sensill de GB.MYSQL" + +#: FNewTable.class:122 +#: FNewTrigger.class:146 +#: FNewView.class:101 +msgid "&Cancel" +msgstr "&Canceŀla" + +#: FTables.class:12 +msgid "Charset" +msgstr "Joc de caràcters" + +#: FNewDatabase.class:90 +#: FNewTable.class:112 +msgid "Charset:" +msgstr "Joc de caràcters:" + +#: FTables.class:23 +msgid "Check" +msgstr "Verificació" + +#: FConnect.class:142 +msgid "&Clear" +msgstr "&Neteja" + +#: FTables.class:13 +msgid "Collation" +msgstr "Coŀlació" + +#: FNewDatabase.class:79 +msgid "Collation:" +msgstr "Coŀlació:" + +#: FTables.class:30 +msgid "Column" +msgstr "Columna" + +#: FNewEvent.class:102 +#: FNewRoutine.class:119 +msgid "Comma separated values: Hola1 INT,Hola2 CHAR(5)" +msgstr "Valors separats per comes: Hola1 INT,Hola2 CHAR(5)" + +#: FTables.class:43 +msgid "Comment" +msgstr "Comentari" + +#: FNewField.class:146 +msgid "Comment:" +msgstr "Comentari:" + +#: FConnect.class:135 +msgid "&Connect" +msgstr "&Connecta" + +#: FConnect.class:86 +msgid "Connect to a MySQL Server" +msgstr "Connecta a un servidor MySQL" + +#: FNewDatabase.class:100 +msgid "&Create" +msgstr "&Crea" + +#: FTables.class:79 +msgid "Created" +msgstr "Creat" + +#: FNewDatabase.class:53 +msgid "Create Database" +msgstr "Crea una base de dades" + +#: FNewEvent.class:71 +msgid "Create Event" +msgstr "Crea un esdeveniment" + +#: FNewIndex.class:101 +msgid "Create Index" +msgstr "Crea un índex" + +#: FNewRoutine.class:88 +msgid "Create Routine" +msgstr "Crea una rutina" + +#: FNewTable.class:75 +msgid "Create Table" +msgstr "Crea una taula" + +#: FNewTrigger.class:84 +msgid "Create Trigger" +msgstr "Crea un activador" + +#: FNewView.class:63 +msgid "Create View" +msgstr "Crea una vista" + +#: FTables.class:39 +msgid "Creation Time" +msgstr "Hora de creació" + +#: FTables.class:85 +msgid "Database Collation" +msgstr "Coŀlació de la base de dades" + +#: FTables.class:51 +msgid "DataType" +msgstr "Tipus de dada" + +#: FNewField.class:104 +msgid "Data Type:" +msgstr "Tipus de dada:" + +#: FTables.class:49 +msgid "Default" +msgstr "Per defecte" + +#: FNewField.class:126 +msgid "Default:" +msgstr "Per defecte:" + +#: FTables.class:21 +msgid "Definer" +msgstr "Definidor" + +#: FNewIndex.class:106 +msgid "Delete" +msgstr "Suprimeix" + +#: FTables.class:1336 +msgid "Delete Database" +msgstr "Suprimeix la base de dades" + +#: FTables.class:900 +msgid "Delete Event" +msgstr "Suprimeix l'esdeveniment" + +#: FTables.class:891 +msgid "Delete Field" +msgstr "Suprimeix el camp" + +#: FTables.class:888 +msgid "Delete Index" +msgstr "Suprimeix l'índex" + +#: FTables.class:1267 +msgid "Delete Item" +msgstr "Suprimeix l'element" + +#: FTables.class:894 +msgid "Delete Routine" +msgstr "Suprimeix la rutina" + +#: FTables.class:882 +msgid "Delete Table" +msgstr "Suprimeix la taula" + +#: FTables.class:897 +msgid "Delete Trigger" +msgstr "Suprimeix l'activador" + +#: FTables.class:885 +msgid "Delete View" +msgstr "Suprimeix la vista" + +#: FTables.class:931 +msgid "Do you realy want to delete the database: &1?" +msgstr "Segur que voleu suprimir la base de dades: &1?" + +#: FTables.class:1035 +msgid "Do you realy want to delete the event: &1?" +msgstr "Segur que voleu suprimir l'esdeveniment: &1?" + +#: FTables.class:1029 +msgid "Do you realy want to delete the field: &1?" +msgstr "Segur que voleu suprimir el camp: &1?" + +#: FTables.class:1027 +msgid "Do you realy want to delete the index: &1?" +msgstr "Segur que voleu suprimir l'índex: &1?" + +#: FTables.class:1031 +msgid "Do you realy want to delete the routine: &1?" +msgstr "Segur que voleu suprimir la rutina: &1?" + +#: FTables.class:1023 +msgid "Do you realy want to delete the table: &1?" +msgstr "Segur que voleu suprimir la taula: &1?" + +#: FTables.class:1033 +msgid "Do you realy want to delete the trigger: &1?" +msgstr "Segur que voleu suprimir l'activador: &1?" + +#: FTables.class:1025 +msgid "Do you realy want to delete the view: &1?" +msgstr "Segur que voleu suprimir la vista: &1?" + +#: FNewEvent.class:19 +msgid "Edit Event" +msgstr "Edita l'esdeveniment" + +#: FNewField.class:22 +msgid "Edit Field" +msgstr "Edita el camp" + +#: FNewIndex.class:24 +msgid "Edit Index" +msgstr "Edita l'índex" + +#: FTables.class:1260 +msgid "Edit Item" +msgstr "Edita l'element" + +#: FNewRoutine.class:19 +msgid "Edit Routine" +msgstr "Edita la rutina" + +#: FNewTable.class:21 +msgid "Edit Table" +msgstr "Edita la taula" + +#: FNewTrigger.class:28 +msgid "Edit Trigger" +msgstr "Edita l'activador" + +#: FNewView.class:18 +msgid "Edit View" +msgstr "Edita la vista" + +#: FTables.class:77 +msgid "Ends" +msgstr "Extrems" + +#: FTables.class:11 +msgid "Engine" +msgstr "Motor" + +#: FNewTable.class:101 +msgid "Engine:" +msgstr "Motor:" + +#: FTables.class:61 +msgid "Event" +msgstr "Esdeveniment" + +#: FNewTrigger.class:122 +msgid "Event:" +msgstr "Esdeveniment:" + +#: FTables.class:1416 +msgid "Events" +msgstr "Esdeveniments" + +#: FTables.class:72 +msgid "Execute At" +msgstr "Executa a" + +#: FTables.class:53 +msgid "Extra" +msgstr "-" + +#: FNewField.class:136 +msgid "Extra:" +msgstr "-" + +#: FTables.class:116 +msgid "Fields" +msgstr "Camps" + +#: FNewIndex.class:138 +msgid "Fields:" +msgstr "Camps:" + +#: FTables.class:149 +msgid "Fields on:" +msgstr "Camps a:" + +#: FTables.class:115 +msgid "Indexes" +msgstr "Índexs" + +#: FTables.class:367 +msgid "Indexes on:" +msgstr "Índexs a:" + +#: FTables.class:74 +msgid "Interval Field" +msgstr "Interval del camp" + +#: FTables.class:73 +msgid "Interval Value" +msgstr "Interval del valor" + +#: FTables.class:1248 +msgid "Item" +msgstr "Element" + +#: FTables.class:1038 +msgid "Item deleted." +msgstr "Element suprimit." + +#: FTables.class:52 +msgid "Key" +msgstr "Clau" + +#: FTables.class:80 +msgid "Last Altered" +msgstr "L'últim modificat" + +#: FTables.class:81 +msgid "Last Executed" +msgstr "L'últim executat" + +#: FTables.class:1292 +msgid "Lock" +msgstr "Bloqueig" + +#: FMessage.class:33 +msgid "Message" +msgstr "Missatge" + +#: .project:1 +#: FConnect.class:79 +msgid "MySQL Example" +msgstr "Exemple de MySQL" + +#: FConnect.class:71 +msgid "MySQL GUI" +msgstr "Interfície del MySQL" + +#: FTables.class:9 +msgid "Name" +msgstr "Nom" + +#: FNewTrigger.class:100 +#: FNewView.class:79 +msgid "Name:" +msgstr "Nom:" + +#: FTables.class:1329 +msgid "New Database" +msgstr "Base de dades nova" + +#: FTables.class:899 +msgid "New Event" +msgstr "Nou esdeveniment" + +#: FTables.class:890 +msgid "New Field" +msgstr "Nou camp" + +#: FTables.class:887 +msgid "New Index" +msgstr "Nou índex" + +#: FTables.class:1253 +msgid "New Item" +msgstr "Nou element" + +#: FTables.class:893 +msgid "New Routine" +msgstr "Nova rutina" + +#: FTables.class:881 +msgid "New Table" +msgstr "Nova taula" + +#: FTables.class:896 +msgid "New Trigger" +msgstr "Nou activador" + +#: FTables.class:884 +msgid "New View" +msgstr "Nova vista" + +#: FNewField.class:120 +msgid "No" +msgstr "-" + +#: FTables.class:931 +msgid "&No" +msgstr "-" + +#: FTables.class:334 +msgid "Not available" +msgstr "No disponible" + +#: FTables.class:50 +msgid "Nullable" +msgstr "Anuŀlable" + +#: FNewView.class:94 +msgid "&Ok" +msgstr "D'ac&ord" + +#: FTables.class:78 +msgid "On Completion" +msgstr "En finalitzar" + +#: FTables.class:82 +msgid "Originator" +msgstr "Original" + +#: FNewRoutine.class:114 +msgid "Parameters:" +msgstr "Paràmetres:" + +#: FConnect.class:123 +msgid "Password:" +msgstr "Contrasenya:" + +#: FConnect.class:101 +msgid "Port:" +msgstr "-" + +#: FNewIndex.class:151 +msgid "Primary Key" +msgstr "Clau primària" + +#: FTables.class:1274 +msgid "Refresh" +msgstr "Actualitza" + +#: FTables.class:38 +msgid "Returns" +msgstr "Retorna" + +#: FNewRoutine.class:125 +msgid "Returns:" +msgstr "Retorna:" + +#: FTables.class:1396 +msgid "Routines" +msgstr "Rutines" + +#: FTables.class:10 +msgid "Rows" +msgstr "Files" + +#: FNewEvent.class:97 +msgid "Schedule:" +msgstr "Planificador:" + +#: FTables.class:22 +msgid "Security" +msgstr "Seguretat" + +#: FConnect.class:90 +msgid "Server:" +msgstr "Servidor:" + +#: FNewView.class:88 +msgid "Show a clue" +msgstr "Mostrar una pista" + +#: FTables.class:14 +msgid "Size" +msgstr "Mida" + +#: FTables.class:75 +msgid "SQL Mode" +msgstr "Mode SQL" + +#: FTables.class:76 +msgid "Starts" +msgstr "Inici" + +#: FTables.class:62 +msgid "Table" +msgstr "Taula" + +#: FTables.class:1243 +msgid "Tables" +msgstr "Taules" + +#: FNewTrigger.class:110 +msgid "Time:" +msgstr "Hora:" + +#: FTables.class:70 +msgid "Time Zone" +msgstr "Zona horària" + +#: FTables.class:63 +msgid "Timing" +msgstr "Temps" + +#: FTables.class:1406 +msgid "Triggers" +msgstr "Activadors" + +#: FTables.class:32 +msgid "Type" +msgstr "Tipus" + +#: FTables.class:20 +msgid "Updatable" +msgstr "Actualitzable" + +#: FTables.class:15 +msgid "Update Time" +msgstr "Hora d'actualització" + +#: FConnect.class:112 +msgid "User:" +msgstr "Usuari:" + +#: FTables.class:1367 +msgid "Views" +msgstr "Vistes" + +#: FNewField.class:120 +msgid "Yes" +msgstr "Sí" + +#: FTables.class:931 +msgid "&Yes" +msgstr "&Sí" + diff --git a/app/examples/Database/MySQLExample/.lang/cs.po b/app/examples/Database/MySQLExample/.lang/cs.po new file mode 100644 index 00000000..ac4dc8c6 --- /dev/null +++ b/app/examples/Database/MySQLExample/.lang/cs.po @@ -0,0 +1,536 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 FConnect.form:28 +msgid "MySQL Example" +msgstr "Příklad MySQL" + +#: .project:2 +msgid "A simple GB.MYSQL Example" +msgstr "Jednoduchý příklad GB.MYSQL" + +#: FConnect.form:20 +msgid "MySQL GUI" +msgstr "-" + +#: FConnect.form:35 +msgid "Connect to a MySQL Server" +msgstr "Připoejní k MySQL Serveru" + +#: FConnect.form:39 +msgid "Server:" +msgstr "Server:" + +#: FConnect.form:50 +msgid "Port:" +msgstr "Port:" + +#: FConnect.form:61 +msgid "User:" +msgstr "Uživate:" + +#: FConnect.form:72 +msgid "Password:" +msgstr "Heslo:" + +#: FConnect.form:84 +msgid "&Connect" +msgstr "&Připojení" + +#: FConnect.form:91 +msgid "&Clear" +msgstr "&Vyčistit" + +#: FConnect.form:97 FNewDatabase.form:70 FNewEvent.form:65 FNewField.form:105 +#: FNewIndex.form:80 FNewRoutine.form:82 FNewTable.form:63 FNewTrigger.form:80 +#: FNewView.form:52 +msgid "&Cancel" +msgstr "&Zrušit" + +#: FMessage.form:8 +msgid "Message" +msgstr "Zpráva" + +#: FNewDatabase.form:16 +msgid "Create Database" +msgstr "Vytvořit databázi" + +#: FNewDatabase.form:32 FNewEvent.form:32 FNewField.form:37 FNewIndex.form:45 +#: FNewRoutine.form:35 FNewTable.form:32 FNewTrigger.form:34 FNewView.form:30 +msgid "Name:" +msgstr "Jméno:" + +#: FNewDatabase.form:42 +msgid "Collation:" +msgstr "Porovnání:" + +#: FNewDatabase.form:53 FNewTable.form:53 +msgid "Charset:" +msgstr "Charset:" + +#: FNewDatabase.form:63 +msgid "&Create" +msgstr "&Vytvořit" + +#: FNewEvent.class:19 +msgid "Edit Event" +msgstr "Upravit událost" + +#: FNewEvent.form:16 +msgid "Create Event" +msgstr "Vytvořit událost" + +#: FNewEvent.form:42 +msgid "Schedule:" +msgstr "Plán:" + +#: FNewEvent.form:47 FNewRoutine.form:50 +msgid "Comma separated values: Hola1 INT,Hola2 CHAR(5)" +msgstr "Hodnoty oddělené čárkami: Hola1 INT,Hola2 CHAR(5)" + +#: FNewEvent.form:52 FNewRoutine.form:69 FNewTrigger.form:67 FNewView.form:39 +msgid "Show a clue" +msgstr "Ukaž vodítko" + +#: FNewEvent.form:58 FNewField.form:98 FNewIndex.form:73 FNewRoutine.form:75 +#: FNewTable.form:70 FNewTrigger.form:73 FNewView.form:45 +msgid "&Ok" +msgstr "-" + +#: FNewField.class:22 +msgid "Edit Field" +msgstr "Upravit pole" + +#: FNewField.form:22 +msgid "Add Field" +msgstr "Přidej pole" + +#: FNewField.form:47 +msgid "Data Type:" +msgstr "Typ dat:" + +#: FNewField.form:57 +msgid "Accepts NULLs:" +msgstr "Akceptuj NULL:" + +#: FNewField.form:63 +msgid "No" +msgstr "Ne" + +#: FNewField.form:63 +msgid "Yes" +msgstr "Ano" + +#: FNewField.form:69 +msgid "Default:" +msgstr "Výchozí:" + +#: FNewField.form:79 +msgid "Extra:" +msgstr "-" + +#: FNewField.form:89 +msgid "Comment:" +msgstr "Poznámka:" + +#: FNewIndex.class:24 +msgid "Edit Index" +msgstr "Upravit index" + +#: FNewIndex.form:18 +msgid "Create Index" +msgstr "Vytvořit index" + +#: FNewIndex.form:23 +msgid "Delete" +msgstr "Smazat" + +#: FNewIndex.form:55 +msgid "Fields:" +msgstr "Pole:" + +#: FNewIndex.form:68 +msgid "Primary Key" +msgstr "Primární klíč" + +#: FNewRoutine.class:19 +msgid "Edit Routine" +msgstr "Upravit rutinu" + +#: FNewRoutine.form:19 +msgid "Create Routine" +msgstr "Vytvořit rutinu" + +#: FNewRoutine.form:45 +msgid "Parameters:" +msgstr "Parametry:" + +#: FNewRoutine.form:56 +msgid "Returns:" +msgstr "Návrat:" + +#: FNewTable.class:21 +msgid "Edit Table" +msgstr "Upravit tabulku" + +#: FNewTable.form:16 +msgid "Create Table" +msgstr "Vytvořit tabulku" + +#: FNewTable.form:42 +msgid "Engine:" +msgstr "Motor:" + +#: FNewTrigger.class:28 +msgid "Edit Trigger" +msgstr "Upravit spouštěč" + +#: FNewTrigger.form:18 +msgid "Create Trigger" +msgstr "Vytvořit spouštěč" + +#: FNewTrigger.form:44 +msgid "Time:" +msgstr "Čas:" + +#: FNewTrigger.form:56 +msgid "Event:" +msgstr "Událost:" + +#: FNewView.class:18 +msgid "Edit View" +msgstr "Upravit pohled" + +#: FNewView.form:14 +msgid "Create View" +msgstr "Vytvořit čas" + +#: FTables.class:9 +msgid "Name" +msgstr "Jméno" + +#: FTables.class:10 +msgid "Rows" +msgstr "Řádky" + +#: FTables.class:11 +msgid "Engine" +msgstr "Motor:" + +#: FTables.class:12 +msgid "Charset" +msgstr "Charset" + +#: FTables.class:13 +msgid "Collation" +msgstr "Porovnání" + +#: FTables.class:14 +msgid "Size" +msgstr "Velikost" + +#: FTables.class:15 +msgid "Update Time" +msgstr "Aktualizace času" + +#: FTables.class:20 +msgid "Updatable" +msgstr "Aktualizovatelné" + +#: FTables.class:21 +msgid "Definer" +msgstr "Definovat" + +#: FTables.class:22 +msgid "Security" +msgstr "Bezpečnost" + +#: FTables.class:23 +msgid "Check" +msgstr "Kontrola" + +#: FTables.class:30 +msgid "Column" +msgstr "Sloupec" + +#: FTables.class:32 +msgid "Type" +msgstr "Typ" + +#: FTables.class:38 +msgid "Returns" +msgstr "Návrat" + +#: FTables.class:39 +msgid "Creation Time" +msgstr "Čas vytvoření" + +#: FTables.class:43 +msgid "Comment" +msgstr "Poznámka" + +#: FTables.class:49 +msgid "Default" +msgstr "Výchozí" + +#: FTables.class:50 +msgid "Nullable" +msgstr "Nulovatelné" + +#: FTables.class:51 +msgid "DataType" +msgstr "Typ dat" + +#: FTables.class:52 +msgid "Key" +msgstr "Klíč" + +#: FTables.class:53 +msgid "Extra" +msgstr "-" + +#: FTables.class:61 +msgid "Event" +msgstr "Událost" + +#: FTables.class:62 +msgid "Table" +msgstr "Tabulka" + +#: FTables.class:63 +msgid "Timing" +msgstr "Časování" + +#: FTables.class:70 +msgid "Time Zone" +msgstr "Časová zóna" + +#: FTables.class:72 +msgid "Execute At" +msgstr "Při spuštění" + +#: FTables.class:73 +msgid "Interval Value" +msgstr "Interval hodnoty" + +#: FTables.class:74 +msgid "Interval Field" +msgstr "Interval pole" + +#: FTables.class:75 +msgid "SQL Mode" +msgstr "SQL mod" + +#: FTables.class:76 +msgid "Starts" +msgstr "Začínáme" + +#: FTables.class:77 +msgid "Ends" +msgstr "Končí" + +#: FTables.class:78 +msgid "On Completion" +msgstr "Na dokončení" + +#: FTables.class:79 +msgid "Created" +msgstr "Vytvořeno" + +#: FTables.class:80 +msgid "Last Altered" +msgstr "Poslední výstraha" + +#: FTables.class:81 +msgid "Last Executed" +msgstr "Poslední spuštění" + +#: FTables.class:82 +msgid "Originator" +msgstr "Průvodce" + +#: FTables.class:85 +msgid "Database Collation" +msgstr "Porovnání databází" + +#: FTables.class:112 +msgid "Fields" +msgstr "Pole" + +#: FTables.class:330 +msgid "Not available" +msgstr "Nedostupné" + +#: FTables.class:363 +msgid "Indexes on:" +msgstr "Indexy na:" + +#: FTables.class:880 +msgid "New View" +msgstr "Nový pohled" + +#: FTables.class:881 +msgid "Delete View" +msgstr "Smazat pohled" + +#: FTables.class:883 +msgid "New Index" +msgstr "Nový index" + +#: FTables.class:884 +msgid "Delete Index" +msgstr "Smazat index" + +#: FTables.class:886 +msgid "New Field" +msgstr "Nové pole" + +#: FTables.class:887 +msgid "Delete Field" +msgstr "Smazat pole" + +#: FTables.class:889 +msgid "New Routine" +msgstr "Nový rutina" + +#: FTables.class:890 +msgid "Delete Routine" +msgstr "Smazat rutinu" + +#: FTables.class:892 +msgid "New Trigger" +msgstr "Nový spouštěč" + +#: FTables.class:893 +msgid "Delete Trigger" +msgstr "Smazat spouštěč" + +#: FTables.class:895 +msgid "New Event" +msgstr "Nová událost" + +#: FTables.class:896 +msgid "Delete Event" +msgstr "Smazat událost" + +#: FTables.class:927 +msgid "&No" +msgstr "&Ne" + +#: FTables.class:927 +msgid "&Yes" +msgstr "&Ano" + +#: FTables.class:927 +msgid "Do you realy want to delete the database: &1?" +msgstr "Opravdu chcete smazat databázi: &1?" + +#: FTables.class:1019 +msgid "Do you realy want to delete the table: &1?" +msgstr "Opravdu chcete smazat tabulku: &1?" + +#: FTables.class:1021 +msgid "Do you realy want to delete the view: &1?" +msgstr "Opravdu chcete smazat pohled: &1?" + +#: FTables.class:1023 +msgid "Do you realy want to delete the index: &1?" +msgstr "Opravdu chcete smazat index: &1?" + +#: FTables.class:1025 +msgid "Do you realy want to delete the field: &1?" +msgstr "Opravdu chcete smazat pole: &1?" + +#: FTables.class:1027 +msgid "Do you realy want to delete the routine: &1?" +msgstr "Opravdu chcete smazat rutinu: &1?" + +#: FTables.class:1029 +msgid "Do you realy want to delete the trigger: &1?" +msgstr "Opravdu chcete smazat spouštěč: &1?" + +#: FTables.class:1031 +msgid "Do you realy want to delete the event: &1?" +msgstr "Opravdu chcete smazat událost: &1?" + +#: FTables.class:1034 +msgid "Item deleted." +msgstr "Položka smazána." + +#: FTables.form:35 +msgid "Tables" +msgstr "Tabulky" + +#: FTables.form:40 +msgid "Item" +msgstr "Položka" + +#: FTables.form:45 +msgid "New Item" +msgstr "Nová položka" + +#: FTables.form:52 +msgid "Edit Item" +msgstr "Upravit položku" + +#: FTables.form:59 +msgid "Delete Item" +msgstr "Smazat polozku" + +#: FTables.form:66 +msgid "Refresh" +msgstr "Obnovit" + +#: FTables.form:84 +msgid "Lock" +msgstr "Zámek" + +#: FTables.form:96 +msgid "New Table" +msgstr "Nová tabulka" + +#: FTables.form:103 +msgid "Delete Table" +msgstr "Smazat tabulku" + +#: FTables.form:121 +msgid "New Database" +msgstr "Nová databáze" + +#: FTables.form:128 +msgid "Delete Database" +msgstr "Smazat databázi" + +#: FTables.form:159 +msgid "Views" +msgstr "Pohled" + +#: FTables.form:169 +msgid "Indexes" +msgstr "Indexy" + +#: FTables.form:179 +msgid "Fields on:" +msgstr "Pole na:" + +#: FTables.form:188 +msgid "Routines" +msgstr "Rutiny" + +#: FTables.form:198 +msgid "Triggers" +msgstr "Spouštěče" + +#: FTables.form:208 +msgid "Events" +msgstr "Události" diff --git a/app/examples/Database/MySQLExample/.lang/de.po b/app/examples/Database/MySQLExample/.lang/de.po new file mode 100644 index 00000000..b49f2663 --- /dev/null +++ b/app/examples/Database/MySQLExample/.lang/de.po @@ -0,0 +1,536 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 FConnect.form:28 +msgid "MySQL Example" +msgstr "MySQL-Beispiel" + +#: .project:2 +msgid "A simple GB.MYSQL Example" +msgstr "Ein einfaches gb.mysql-Beispiel" + +#: FConnect.form:20 +msgid "MySQL GUI" +msgstr "-" + +#: FConnect.form:35 +msgid "Connect to a MySQL Server" +msgstr "Zu einem SQL-Server verbinden" + +#: FConnect.form:39 +msgid "Server:" +msgstr "-" + +#: FConnect.form:50 +msgid "Port:" +msgstr "-" + +#: FConnect.form:61 +msgid "User:" +msgstr "Benutzer" + +#: FConnect.form:72 +msgid "Password:" +msgstr "Passwort:" + +#: FConnect.form:84 +msgid "&Connect" +msgstr "&Verbinden" + +#: FConnect.form:91 +msgid "&Clear" +msgstr "&Löschen" + +#: FConnect.form:97 FNewDatabase.form:70 FNewEvent.form:65 FNewField.form:105 +#: FNewIndex.form:80 FNewRoutine.form:82 FNewTable.form:63 FNewTrigger.form:80 +#: FNewView.form:52 +msgid "&Cancel" +msgstr "&Abbrechen" + +#: FMessage.form:8 +msgid "Message" +msgstr "Nachricht" + +#: FNewDatabase.form:16 +msgid "Create Database" +msgstr "Datenbank erstellen" + +#: FNewDatabase.form:32 FNewEvent.form:32 FNewField.form:37 FNewIndex.form:45 +#: FNewRoutine.form:35 FNewTable.form:32 FNewTrigger.form:34 FNewView.form:30 +msgid "Name:" +msgstr "-" + +#: FNewDatabase.form:42 +msgid "Collation:" +msgstr "Sortierfolge:" + +#: FNewDatabase.form:53 FNewTable.form:53 +msgid "Charset:" +msgstr "Zeichensatz:" + +#: FNewDatabase.form:63 +msgid "&Create" +msgstr "&Erstellen" + +#: FNewEvent.class:19 +msgid "Edit Event" +msgstr "Ereignis bearbeiten" + +#: FNewEvent.form:16 +msgid "Create Event" +msgstr "Ereignis erstellen" + +#: FNewEvent.form:42 +msgid "Schedule:" +msgstr "Zeitplan:" + +#: FNewEvent.form:47 FNewRoutine.form:50 +msgid "Comma separated values: Hola1 INT,Hola2 CHAR(5)" +msgstr "-" + +#: FNewEvent.form:52 FNewRoutine.form:69 FNewTrigger.form:67 FNewView.form:39 +msgid "Show a clue" +msgstr "Hinweis anzeigen" + +#: FNewEvent.form:58 FNewField.form:98 FNewIndex.form:73 FNewRoutine.form:75 +#: FNewTable.form:70 FNewTrigger.form:73 FNewView.form:45 +msgid "&Ok" +msgstr "-" + +#: FNewField.class:22 +msgid "Edit Field" +msgstr "Feld bearbeiten" + +#: FNewField.form:22 +msgid "Add Field" +msgstr "Feld hinzufügen" + +#: FNewField.form:47 +msgid "Data Type:" +msgstr "Datentyp:" + +#: FNewField.form:57 +msgid "Accepts NULLs:" +msgstr "Leere Eingabe möglich:" + +#: FNewField.form:63 +msgid "No" +msgstr "Nein" + +#: FNewField.form:63 +msgid "Yes" +msgstr "Ja" + +#: FNewField.form:69 +msgid "Default:" +msgstr "Standardwert:" + +#: FNewField.form:79 +msgid "Extra:" +msgstr "-" + +#: FNewField.form:89 +msgid "Comment:" +msgstr "Kommentar:" + +#: FNewIndex.class:24 +msgid "Edit Index" +msgstr "Index bearbeiten" + +#: FNewIndex.form:18 +msgid "Create Index" +msgstr "Index erstellen" + +#: FNewIndex.form:23 +msgid "Delete" +msgstr "Löschen" + +#: FNewIndex.form:55 +msgid "Fields:" +msgstr "Felder:" + +#: FNewIndex.form:68 +msgid "Primary Key" +msgstr "Primärschlüssel" + +#: FNewRoutine.class:19 +msgid "Edit Routine" +msgstr "Routine bearbeiten" + +#: FNewRoutine.form:19 +msgid "Create Routine" +msgstr "Routine erstellen" + +#: FNewRoutine.form:45 +msgid "Parameters:" +msgstr "Parameter:" + +#: FNewRoutine.form:56 +msgid "Returns:" +msgstr "Rückgabe:" + +#: FNewTable.class:21 +msgid "Edit Table" +msgstr "Tabelle bearbeiten" + +#: FNewTable.form:16 +msgid "Create Table" +msgstr "Tabelle erstellen" + +#: FNewTable.form:42 +msgid "Engine:" +msgstr "-" + +#: FNewTrigger.class:28 +msgid "Edit Trigger" +msgstr "Trigger bearbeiten" + +#: FNewTrigger.form:18 +msgid "Create Trigger" +msgstr "Trigger erstellen" + +#: FNewTrigger.form:44 +msgid "Time:" +msgstr "Zeit:" + +#: FNewTrigger.form:56 +msgid "Event:" +msgstr "Ereignis:" + +#: FNewView.class:18 +msgid "Edit View" +msgstr "Ansicht bearbeiten" + +#: FNewView.form:14 +msgid "Create View" +msgstr "Ansicht erstellen" + +#: FTables.class:9 +msgid "Name" +msgstr "-" + +#: FTables.class:10 +msgid "Rows" +msgstr "Zeilen" + +#: FTables.class:11 +msgid "Engine" +msgstr "-" + +#: FTables.class:12 +msgid "Charset" +msgstr "Zeichensatz" + +#: FTables.class:13 +msgid "Collation" +msgstr "Sortierfolge" + +#: FTables.class:14 +msgid "Size" +msgstr "Größe" + +#: FTables.class:15 +msgid "Update Time" +msgstr "Update-Zeit" + +#: FTables.class:20 +msgid "Updatable" +msgstr "Aktualisierbar" + +#: FTables.class:21 +msgid "Definer" +msgstr "Bestimmer" + +#: FTables.class:22 +msgid "Security" +msgstr "Sicherheit" + +#: FTables.class:23 +msgid "Check" +msgstr "Überprüfen" + +#: FTables.class:30 +msgid "Column" +msgstr "Spalte" + +#: FTables.class:32 +msgid "Type" +msgstr "Typ" + +#: FTables.class:38 +msgid "Returns" +msgstr "Rückgabe" + +#: FTables.class:39 +msgid "Creation Time" +msgstr "Erstellungszeit" + +#: FTables.class:43 +msgid "Comment" +msgstr "Kommentar" + +#: FTables.class:49 +msgid "Default" +msgstr "Standardwert" + +#: FTables.class:50 +msgid "Nullable" +msgstr "Nulleingabe möglich" + +#: FTables.class:51 +msgid "DataType" +msgstr "Datentyp" + +#: FTables.class:52 +msgid "Key" +msgstr "Schlüssel" + +#: FTables.class:53 +msgid "Extra" +msgstr "-" + +#: FTables.class:61 +msgid "Event" +msgstr "Ereignis" + +#: FTables.class:62 +msgid "Table" +msgstr "Tabelle" + +#: FTables.class:63 +msgid "Timing" +msgstr "Zeitplanung" + +#: FTables.class:70 +msgid "Time Zone" +msgstr "Zeitzone" + +#: FTables.class:72 +msgid "Execute At" +msgstr "Ausführen ab" + +#: FTables.class:73 +msgid "Interval Value" +msgstr "Intervall" + +#: FTables.class:74 +msgid "Interval Field" +msgstr "Autoeingabefeld" + +#: FTables.class:75 +msgid "SQL Mode" +msgstr "SQL-Modus" + +#: FTables.class:76 +msgid "Starts" +msgstr "Beginnt" + +#: FTables.class:77 +msgid "Ends" +msgstr "Endet" + +#: FTables.class:78 +msgid "On Completion" +msgstr "Bei Vervollständigung" + +#: FTables.class:79 +msgid "Created" +msgstr "Erstellt" + +#: FTables.class:80 +msgid "Last Altered" +msgstr "Zuletzt geändert" + +#: FTables.class:81 +msgid "Last Executed" +msgstr "Zuletzt ausgeführt" + +#: FTables.class:82 +msgid "Originator" +msgstr "Bearbeiter" + +#: FTables.class:85 +msgid "Database Collation" +msgstr "Datenbank-Sortierfolge" + +#: FTables.class:116 +msgid "Fields" +msgstr "Felder" + +#: FTables.class:334 +msgid "Not available" +msgstr "Nicht verfügbar" + +#: FTables.class:367 +msgid "Indexes on:" +msgstr "Indexes in:" + +#: FTables.class:884 +msgid "New View" +msgstr "Neue Ansicht" + +#: FTables.class:885 +msgid "Delete View" +msgstr "Ansicht löschen" + +#: FTables.class:887 +msgid "New Index" +msgstr "Neuer Index" + +#: FTables.class:888 +msgid "Delete Index" +msgstr "Index löschen" + +#: FTables.class:890 +msgid "New Field" +msgstr "Neues Feld" + +#: FTables.class:891 +msgid "Delete Field" +msgstr "Feld löschen" + +#: FTables.class:893 +msgid "New Routine" +msgstr "Neue Routine" + +#: FTables.class:894 +msgid "Delete Routine" +msgstr "Routine löschen" + +#: FTables.class:896 +msgid "New Trigger" +msgstr "Neuer Trigger" + +#: FTables.class:897 +msgid "Delete Trigger" +msgstr "Trigger löschen" + +#: FTables.class:899 +msgid "New Event" +msgstr "Neues Ereignis" + +#: FTables.class:900 +msgid "Delete Event" +msgstr "Ereignis löschen" + +#: FTables.class:931 +msgid "&No" +msgstr "&Nein" + +#: FTables.class:931 +msgid "&Yes" +msgstr "&Ja" + +#: FTables.class:931 +msgid "Do you realy want to delete the database: &1?" +msgstr "Wollen Sie wirklich die Datenbank &1 löschen?" + +#: FTables.class:1023 +msgid "Do you realy want to delete the table: &1?" +msgstr "Wollen Sie wirklich die Tabelle &1 löschen?" + +#: FTables.class:1025 +msgid "Do you realy want to delete the view: &1?" +msgstr "Wollen Sie wirklich die Ansicht &1 löschen?" + +#: FTables.class:1027 +msgid "Do you realy want to delete the index: &1?" +msgstr "Wollen Sie wirklich den Index &1 löschen?" + +#: FTables.class:1029 +msgid "Do you realy want to delete the field: &1?" +msgstr "Wollen Sie wirklich das Feld &1 löschen?" + +#: FTables.class:1031 +msgid "Do you realy want to delete the routine: &1?" +msgstr "Wollen Sie wirklich die Routine &1 löschen?" + +#: FTables.class:1033 +msgid "Do you realy want to delete the trigger: &1?" +msgstr "Wollen Sie wirklich den Trigger &1 löschen?" + +#: FTables.class:1035 +msgid "Do you realy want to delete the event: &1?" +msgstr "Wollen Sie wirklich das Ereignis &1 löschen?" + +#: FTables.class:1038 +msgid "Item deleted." +msgstr "Datensatz gelöscht" + +#: FTables.form:35 +msgid "Tables" +msgstr "Tabellen" + +#: FTables.form:40 +msgid "Item" +msgstr "Datensatz" + +#: FTables.form:45 +msgid "New Item" +msgstr "Neuer Datensatz" + +#: FTables.form:52 +msgid "Edit Item" +msgstr "Datensatz bearbeiten" + +#: FTables.form:59 +msgid "Delete Item" +msgstr "Datensatz löschen" + +#: FTables.form:66 +msgid "Refresh" +msgstr "Erneuern" + +#: FTables.form:84 +msgid "Lock" +msgstr "Sperren" + +#: FTables.form:96 +msgid "New Table" +msgstr "Neue Tabelle" + +#: FTables.form:103 +msgid "Delete Table" +msgstr "Tabelle löschen" + +#: FTables.form:121 +msgid "New Database" +msgstr "Neue Datenbank" + +#: FTables.form:128 +msgid "Delete Database" +msgstr "Datenbank löschen" + +#: FTables.form:159 +msgid "Views" +msgstr "Ansichten" + +#: FTables.form:169 +msgid "Indexes" +msgstr "-" + +#: FTables.form:179 +msgid "Fields on:" +msgstr "Felder in:" + +#: FTables.form:188 +msgid "Routines" +msgstr "Routinen" + +#: FTables.form:198 +msgid "Triggers" +msgstr "-" + +#: FTables.form:208 +msgid "Events" +msgstr "Ereignisse" diff --git a/app/examples/Database/MySQLExample/.lang/es.po b/app/examples/Database/MySQLExample/.lang/es.po new file mode 100644 index 00000000..02e62697 --- /dev/null +++ b/app/examples/Database/MySQLExample/.lang/es.po @@ -0,0 +1,533 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: FNewView.form:52 +msgid "&Cancel" +msgstr "&Cancelar" + +#: FConnect.form:91 +msgid "&Clear" +msgstr "&Limpiar" + +#: FConnect.form:84 +msgid "&Connect" +msgstr "&Conectar" + +#: FNewDatabase.form:63 +msgid "&Create" +msgstr "&Crear" + +#: FTables.class:931 +msgid "&No" +msgstr "-" + +#: FNewTable.form:70 FNewTrigger.form:73 FNewView.form:45 +msgid "&Ok" +msgstr "-" + +#: FTables.class:931 +msgid "&Yes" +msgstr "&Sí" + +#: .project:2 +msgid "A simple GB.MYSQL Example" +msgstr "Un simple Ejemplo de GB.MYSQL" + +#: FNewField.form:57 +msgid "Accepts NULLs:" +msgstr "Acepta NULOs:" + +#: FNewField.form:22 +msgid "Add Field" +msgstr "Agregar Campo" + +#: FTables.class:12 +msgid "Charset" +msgstr "Conjunto de caracteres" + +#: FNewDatabase.form:53 FNewTable.form:53 +msgid "Charset:" +msgstr "-" + +#: FTables.class:23 +msgid "Check" +msgstr "Chequeo" + +#: FTables.class:13 +msgid "Collation" +msgstr "-" + +#: FNewDatabase.form:42 +msgid "Collation:" +msgstr "-" + +#: FTables.class:30 +msgid "Column" +msgstr "Columna" + +#: FNewEvent.form:47 FNewRoutine.form:50 +msgid "Comma separated values: Hola1 INT,Hola2 CHAR(5)" +msgstr "Valores separados por coma: Hola1 INT,Hola2 CHAR(5)" + +#: FTables.class:43 +msgid "Comment" +msgstr "Comentario" + +#: FNewField.form:89 +msgid "Comment:" +msgstr "Comentario:" + +#: FConnect.form:35 +msgid "Connect to a MySQL Server" +msgstr "Conectar a un Servidor MySQL" + +#: FNewDatabase.form:16 +msgid "Create Database" +msgstr "Crear Base de Datos" + +#: FNewEvent.form:16 +msgid "Create Event" +msgstr "Crear Evento" + +#: FNewIndex.form:18 +msgid "Create Index" +msgstr "Crear Índice" + +#: FNewRoutine.form:19 +msgid "Create Routine" +msgstr "Crear Rutina" + +#: FNewTable.form:16 +msgid "Create Table" +msgstr "Crear Tabla" + +#: FNewTrigger.form:18 +msgid "Create Trigger" +msgstr "Crear Trigger" + +#: FNewView.form:14 +msgid "Create View" +msgstr "Crear Vista" + +#: FTables.class:79 +msgid "Created" +msgstr "Creado" + +#: FTables.class:39 +msgid "Creation Time" +msgstr "Hora de creación" + +#: FNewField.form:47 +msgid "Data Type:" +msgstr "Tipo de Datos:" + +#: FTables.class:85 +msgid "Database Collation" +msgstr "Colación de la Base de Datos" + +#: FTables.class:51 +msgid "DataType" +msgstr "Tipo de Datos" + +#: FTables.class:49 +msgid "Default" +msgstr "Predeterminado" + +#: FNewField.form:69 +msgid "Default:" +msgstr "Predeterminado:" + +#: FTables.class:21 +msgid "Definer" +msgstr "Definidor" + +#: FNewIndex.form:23 +msgid "Delete" +msgstr "Borrar" + +#: FTables.form:128 +msgid "Delete Database" +msgstr "Borrar Base de Datos" + +#: FTables.class:900 +msgid "Delete Event" +msgstr "Borrar Evento" + +#: FTables.class:891 +msgid "Delete Field" +msgstr "Borrar Campo" + +#: FTables.class:888 +msgid "Delete Index" +msgstr "Borrar Índice" + +#: FTables.form:59 +msgid "Delete Item" +msgstr "Borrar Item" + +#: FTables.class:894 +msgid "Delete Routine" +msgstr "Borrar Rutina" + +#: FTables.form:103 +msgid "Delete Table" +msgstr "Borrar Tabla" + +#: FTables.class:897 +msgid "Delete Trigger" +msgstr "Borrar Trigger" + +#: FTables.class:885 +msgid "Delete View" +msgstr "Borrar Vista" + +#: FTables.class:931 +msgid "Do you realy want to delete the database: &1?" +msgstr "¿Realmente desea borrar la base de datos: &1?" + +#: FTables.class:1035 +msgid "Do you realy want to delete the event: &1?" +msgstr "¿Realmente desea borrar el evento: &1?" + +#: FTables.class:1029 +msgid "Do you realy want to delete the field: &1?" +msgstr "¿Realmente desea borrar el campo: &1?" + +#: FTables.class:1027 +msgid "Do you realy want to delete the index: &1?" +msgstr "¿Realmente desea borrar el índice: &1?" + +#: FTables.class:1031 +msgid "Do you realy want to delete the routine: &1?" +msgstr "¿Realmente desea borrar la rutina: &1?" + +#: FTables.class:1023 +msgid "Do you realy want to delete the table: &1?" +msgstr "¿Realmente desea borrar la tabla: &1?" + +#: FTables.class:1033 +msgid "Do you realy want to delete the trigger: &1?" +msgstr "¿Realmente desea borrar el trigger: &1?" + +#: FTables.class:1025 +msgid "Do you realy want to delete the view: &1?" +msgstr "¿Realmente desea borrar la vista: &1?" + +#: FNewEvent.class:19 +msgid "Edit Event" +msgstr "Editar Evento" + +#: FNewField.class:22 +msgid "Edit Field" +msgstr "Editar Campo" + +#: FNewIndex.class:24 +msgid "Edit Index" +msgstr "Editar Índice" + +#: FTables.form:52 +msgid "Edit Item" +msgstr "Editar item" + +#: FNewRoutine.class:19 +msgid "Edit Routine" +msgstr "Editar rutina" + +#: FNewTable.class:21 +msgid "Edit Table" +msgstr "Editar Tabla" + +#: FNewTrigger.class:28 +msgid "Edit Trigger" +msgstr "Editar Trigger" + +#: FNewView.class:18 +msgid "Edit View" +msgstr "Editar Vista" + +#: FTables.class:77 +msgid "Ends" +msgstr "Finaliza" + +#: FTables.class:11 +msgid "Engine" +msgstr "Máquina" + +#: FNewTable.form:42 +msgid "Engine:" +msgstr "Máquina:" + +#: FTables.class:61 +msgid "Event" +msgstr "Evento" + +#: FNewTrigger.form:56 +msgid "Event:" +msgstr "Evento:" + +#: FTables.form:208 +msgid "Events" +msgstr "Eventos" + +#: FTables.class:72 +msgid "Execute At" +msgstr "Ejecutar En" + +#: FTables.class:53 +msgid "Extra" +msgstr "-" + +#: FNewField.form:79 +msgid "Extra:" +msgstr "-" + +#: FTables.class:116 +msgid "Fields" +msgstr "Campos" + +#: FTables.form:179 +msgid "Fields on:" +msgstr "Campos en:" + +#: FNewIndex.form:55 +msgid "Fields:" +msgstr "Campos:" + +#: FTables.form:169 +msgid "Indexes" +msgstr "Índices" + +#: FTables.class:367 +msgid "Indexes on:" +msgstr "Índices en:" + +#: FTables.class:74 +msgid "Interval Field" +msgstr "Campo del Intérvalo" + +#: FTables.class:73 +msgid "Interval Value" +msgstr "Valor del Intérvalo" + +#: FTables.form:40 +msgid "Item" +msgstr "-" + +#: FTables.class:1038 +msgid "Item deleted." +msgstr "Item borrado." + +#: FTables.class:52 +msgid "Key" +msgstr "Llave" + +#: FTables.class:80 +msgid "Last Altered" +msgstr "Última Alteración" + +#: FTables.class:81 +msgid "Last Executed" +msgstr "Última Ejecución" + +#: FTables.form:84 +msgid "Lock" +msgstr "Bloquear" + +#: FMessage.form:8 +msgid "Message" +msgstr "Mensaje" + +#: .project:1 FConnect.form:28 +msgid "MySQL Example" +msgstr "-" + +#: FConnect.form:20 +msgid "MySQL GUI" +msgstr "-" + +#: FTables.class:9 +msgid "Name" +msgstr "Nombre" + +#: FNewRoutine.form:35 FNewTable.form:32 FNewTrigger.form:34 FNewView.form:30 +msgid "Name:" +msgstr "Nombre:" + +#: FTables.form:121 +msgid "New Database" +msgstr "Nueva Base de Datos" + +#: FTables.class:899 +msgid "New Event" +msgstr "Nuevo Evento" + +#: FTables.class:890 +msgid "New Field" +msgstr "Nuevo Campo" + +#: FTables.class:887 +msgid "New Index" +msgstr "Nuevo Índice" + +#: FTables.form:45 +msgid "New Item" +msgstr "Nuevo Item" + +#: FTables.class:893 +msgid "New Routine" +msgstr "Nueva Rutina" + +#: FTables.form:96 +msgid "New Table" +msgstr "Nueva Tabla" + +#: FTables.class:896 +msgid "New Trigger" +msgstr "Nuevo Trigger" + +#: FTables.class:884 +msgid "New View" +msgstr "Nueva Vista" + +#: FNewField.form:63 +msgid "No" +msgstr "-" + +#: FTables.class:334 +msgid "Not available" +msgstr "No disponible" + +#: FTables.class:50 +msgid "Nullable" +msgstr "Anulable" + +#: FTables.class:78 +msgid "On Completion" +msgstr "En completado" + +#: FTables.class:82 +msgid "Originator" +msgstr "Originador" + +#: FNewRoutine.form:45 +msgid "Parameters:" +msgstr "Parámetros:" + +#: FConnect.form:72 +msgid "Password:" +msgstr "Contraseña:" + +#: FConnect.form:50 +msgid "Port:" +msgstr "Puerto:" + +#: FNewIndex.form:68 +msgid "Primary Key" +msgstr "Llave primaria" + +#: FTables.form:66 +msgid "Refresh" +msgstr "Refrescar" + +#: FTables.class:38 +msgid "Returns" +msgstr "Retorna" + +#: FNewRoutine.form:56 +msgid "Returns:" +msgstr "Retorna:" + +#: FTables.form:188 +msgid "Routines" +msgstr "Rutinas" + +#: FTables.class:10 +msgid "Rows" +msgstr "Filas" + +#: FNewEvent.form:42 +msgid "Schedule:" +msgstr "Programación:" + +#: FTables.class:22 +msgid "Security" +msgstr "Seguridad" + +#: FConnect.form:39 +msgid "Server:" +msgstr "Servidor:" + +#: FNewEvent.form:52 FNewRoutine.form:69 FNewTrigger.form:67 FNewView.form:39 +msgid "Show a clue" +msgstr "Mostrar una pista" + +#: FTables.class:14 +msgid "Size" +msgstr "Tamaño" + +#: FTables.class:75 +msgid "SQL Mode" +msgstr "Modo SQL" + +#: FTables.class:76 +msgid "Starts" +msgstr "Inicia" + +#: FTables.class:62 +msgid "Table" +msgstr "Tabla" + +#: FTables.form:35 +msgid "Tables" +msgstr "Tablas" + +#: FTables.class:70 +msgid "Time Zone" +msgstr "Zona de Tiempo" + +#: FNewTrigger.form:44 +msgid "Time:" +msgstr "Hora:" + +#: FTables.class:63 +msgid "Timing" +msgstr "-" + +#: FTables.form:198 +msgid "Triggers" +msgstr "-" + +#: FTables.class:32 +msgid "Type" +msgstr "Tipo" + +#: FTables.class:20 +msgid "Updatable" +msgstr "Actualizable" + +#: FTables.class:15 +msgid "Update Time" +msgstr "Hora de Actualización" + +#: FConnect.form:61 +msgid "User:" +msgstr "Usuario:" + +#: FTables.form:159 +msgid "Views" +msgstr "Vistas" + +#: FNewField.form:63 +msgid "Yes" +msgstr "Sí" + diff --git a/app/examples/Database/MySQLExample/.lang/fr.po b/app/examples/Database/MySQLExample/.lang/fr.po new file mode 100644 index 00000000..436af64d --- /dev/null +++ b/app/examples/Database/MySQLExample/.lang/fr.po @@ -0,0 +1,1546 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: FConnect.class:71 +msgid "MySQL GUI" +msgstr "-" + +#: FConnect.class:79 +#, fuzzy +msgid "MySQL Example" +msgstr "Exemple :" + +#: FConnect.class:86 +msgid "Connect to a MySQL Server" +msgstr "Connecter à un serveur Mysql" + +#: FConnect.class:90 +msgid "Server:" +msgstr "Serveur :" + +#: FConnect.class:101 +msgid "Port:" +msgstr "Port :" + +#: FConnect.class:112 +msgid "User:" +msgstr "Utilisateur :" + +#: FConnect.class:123 +msgid "Password:" +msgstr "Mot de passe :" + +#: FConnect.class:135 +msgid "&Connect" +msgstr "&Connecter" + +#: FConnect.class:142 +msgid "&Clear" +msgstr "&Effacer" + +#: FConnect.class:148 FNewDatabase.class:107 FNewEvent.class:120 +#: FNewField.class:162 FNewIndex.class:163 FNewRoutine.class:151 +#: FNewTable.class:122 FNewTrigger.class:146 FNewView.class:101 +msgid "&Cancel" +msgstr "&Annuler" + +#: FMessage.class:33 +msgid "Message" +msgstr "Message" + +#: FNewDatabase.class:53 +msgid "Create Database" +msgstr "Créer une base de données" + +#: FNewDatabase.class:69 FNewEvent.class:87 FNewField.class:94 +#: FNewIndex.class:128 FNewRoutine.class:104 FNewTable.class:91 +#: FNewTrigger.class:100 FNewView.class:79 +msgid "Name:" +msgstr "Name :" + +#: FNewDatabase.class:79 +msgid "Collation:" +msgstr "Action :" + +#: FNewDatabase.class:90 FNewTable.class:112 +msgid "Charset:" +msgstr "Charset :" + +#: FNewDatabase.class:100 +msgid "&Create" +msgstr "& Créer" + +#: FNewEvent.class:19 +#, fuzzy +msgid "Edit Event" +msgstr "Evénement" + +#: FNewEvent.class:71 +msgid "Create Event" +msgstr "Créer un évènement" + +#: FNewEvent.class:97 +msgid "Schedule:" +msgstr "Horaire :" + +#: FNewEvent.class:102 FNewRoutine.class:119 +msgid "Comma separated values: Hola1 INT,Hola2 CHAR(5)" +msgstr "Valeurs séparées par des virgules : Hola1 INT,Hola2 CHAR(5)" + +#: FNewEvent.class:107 FNewRoutine.class:138 FNewTrigger.class:133 +#: FNewView.class:88 +msgid "Show a clue" +msgstr "Affiche un truc" + +#: FNewEvent.class:113 FNewField.class:155 FNewIndex.class:156 +#: FNewRoutine.class:144 FNewTable.class:129 FNewTrigger.class:139 +#: FNewView.class:94 +msgid "&Ok" +msgstr "" + +#: FNewField.class:22 +#, fuzzy +msgid "Edit Field" +msgstr "Ajouter un champ" + +#: FNewField.class:79 +msgid "Add Field" +msgstr "Ajouter un champ" + +#: FNewField.class:104 +msgid "Data Type:" +msgstr "Type de donnée :" + +#: FNewField.class:114 +msgid "Accepts NULLs:" +msgstr "Accepte nul" + +#: FNewField.class:120 +msgid "No" +msgstr "Non" + +#: FNewField.class:120 +msgid "Yes" +msgstr "Oui" + +#: FNewField.class:126 +msgid "Default:" +msgstr "Par défaut :" + +#: FNewField.class:136 +msgid "Extra:" +msgstr "Extra :" + +#: FNewField.class:146 +msgid "Comment:" +msgstr "Commentaire :" + +#: FNewIndex.class:24 +#, fuzzy +msgid "Edit Index" +msgstr "Créer un index" + +#: FNewIndex.class:101 +msgid "Create Index" +msgstr "Créer un index" + +#: FNewIndex.class:106 +msgid "Delete" +msgstr "Effacer" + +#: FNewIndex.class:138 +msgid "Fields:" +msgstr "Champs :" + +#: FNewIndex.class:151 +msgid "Primary Key" +msgstr "Clé primaire" + +#: FNewRoutine.class:19 +#, fuzzy +msgid "Edit Routine" +msgstr "Créer une routine" + +#: FNewRoutine.class:88 +msgid "Create Routine" +msgstr "Créer une routine" + +#: FNewRoutine.class:114 +msgid "Parameters:" +msgstr "Paramètres :" + +#: FNewRoutine.class:125 +msgid "Returns:" +msgstr "Retourné :" + +#: FNewTable.class:21 +#, fuzzy +msgid "Edit Table" +msgstr "Créer une table" + +#: FNewTable.class:75 +msgid "Create Table" +msgstr "Créer une table" + +#: FNewTable.class:101 +msgid "Engine:" +msgstr "Moteur" + +#: FNewTrigger.class:28 +#, fuzzy +msgid "Edit Trigger" +msgstr "Déclencheurs" + +#: FNewTrigger.class:84 +msgid "Create Trigger" +msgstr "Créer un déclencheur" + +#: FNewTrigger.class:110 +msgid "Time:" +msgstr "Heure :" + +#: FNewTrigger.class:122 +msgid "Event:" +msgstr "Evénement :" + +#: FNewView.class:18 +#, fuzzy +msgid "Edit View" +msgstr "Editer" + +#: FNewView.class:63 +msgid "Create View" +msgstr "Créer une vue" + +#: FTables.class:9 +msgid "Name" +msgstr "Nom" + +#: FTables.class:10 +msgid "Rows" +msgstr "Lignes" + +#: FTables.class:11 +msgid "Engine" +msgstr "Moteur" + +#: FTables.class:12 +msgid "Charset" +msgstr "--" + +#: FTables.class:13 +msgid "Collation" +msgstr "Action" + +#: FTables.class:14 +msgid "Size" +msgstr "Taille" + +#: FTables.class:15 +msgid "Update Time" +msgstr "Heure de mise à jour" + +#: FTables.class:20 +msgid "Updatable" +msgstr "Mise à jour table" + +#: FTables.class:21 +msgid "Definer" +msgstr "Définir" + +#: FTables.class:22 +msgid "Security" +msgstr "Sécurité" + +#: FTables.class:23 +msgid "Check" +msgstr "Vérifier" + +#: FTables.class:30 +msgid "Column" +msgstr "Colonne" + +#: FTables.class:32 +msgid "Type" +msgstr "" + +#: FTables.class:38 +msgid "Returns" +msgstr "Retourné" + +#: FTables.class:39 +msgid "Creation Time" +msgstr "Heure de création" + +#: FTables.class:43 +msgid "Comment" +msgstr "Commentaire" + +#: FTables.class:49 +msgid "Default" +msgstr "Par défaut" + +#: FTables.class:50 +msgid "Nullable" +msgstr "Nul" + +#: FTables.class:51 +msgid "DataType" +msgstr "Type de donnée" + +#: FTables.class:52 +msgid "Key" +msgstr "Clé" + +#: FTables.class:53 +msgid "Extra" +msgstr "--" + +#: FTables.class:61 +msgid "Event" +msgstr "Evénement" + +#: FTables.class:62 +msgid "Table" +msgstr "" + +#: FTables.class:63 +msgid "Timing" +msgstr "Minutage" + +#: FTables.class:70 +msgid "Time Zone" +msgstr "Zone horaire" + +#: FTables.class:72 +msgid "Execute At" +msgstr "Exécuter à" + +#: FTables.class:73 +msgid "Interval Value" +msgstr "Valeur d'interval" + +#: FTables.class:74 +msgid "Interval Field" +msgstr "Champ d'interval" + +#: FTables.class:75 +msgid "SQL Mode" +msgstr "Mode SQL" + +#: FTables.class:76 +msgid "Starts" +msgstr "Démarrer" + +#: FTables.class:77 +msgid "Ends" +msgstr "Fins" + +#: FTables.class:78 +msgid "On Completion" +msgstr "Complétion " + +#: FTables.class:79 +msgid "Created" +msgstr "Crée" + +#: FTables.class:80 +msgid "Last Altered" +msgstr "Dernier changement" + +#: FTables.class:81 +msgid "Last Executed" +msgstr "Dernière exécution" + +#: FTables.class:82 +msgid "Originator" +msgstr "Originel" + +#: FTables.class:85 +msgid "Database Collation" +msgstr "Base de donnée active " + +#: FTables.class:115 +msgid "Indexes" +msgstr "Indexs" + +#: FTables.class:116 +msgid "Fields" +msgstr "Champs" + +#: FTables.class:149 +msgid "Fields on:" +msgstr "Champs actuel :" + +#: FTables.class:334 +msgid "Not available" +msgstr "Non disponible" + +#: FTables.class:367 +msgid "Indexes on:" +msgstr "Indexé sur :" + +#: FTables.class:881 +msgid "New Table" +msgstr "Nouvelle table" + +#: FTables.class:882 +msgid "Delete Table" +msgstr "Effacer la table" + +#: FTables.class:884 +msgid "New View" +msgstr "Nouvelle vue" + +#: FTables.class:885 +msgid "Delete View" +msgstr "Effacer la vue" + +#: FTables.class:887 +msgid "New Index" +msgstr "Nouvel index" + +#: FTables.class:888 +msgid "Delete Index" +msgstr "Effacer l'index" + +#: FTables.class:890 +msgid "New Field" +msgstr "Nouveau champ" + +#: FTables.class:891 +msgid "Delete Field" +msgstr "Effacer le champ" + +#: FTables.class:893 +msgid "New Routine" +msgstr "Nouvelle routine" + +#: FTables.class:894 +msgid "Delete Routine" +msgstr "Effacer la routine" + +#: FTables.class:896 +msgid "New Trigger" +msgstr "Nouveau déclencheur" + +#: FTables.class:897 +msgid "Delete Trigger" +msgstr "Effacer le déclencheur" + +#: FTables.class:899 +msgid "New Event" +msgstr "Nouvel événement" + +#: FTables.class:900 +msgid "Delete Event" +msgstr "Evénement effacé" + +#: FTables.class:931 +msgid "&No" +msgstr "&Non" + +#: FTables.class:931 +msgid "&Yes" +msgstr "&Oui" + +#: FTables.class:931 +msgid "Do you realy want to delete the database: &1?" +msgstr "Voulez vous vraiment effacer la base de données : &1?" + +#: FTables.class:1023 +msgid "Do you realy want to delete the table: &1?" +msgstr "Voulez vous vraiment effacer cette table : &1?" + +#: FTables.class:1025 +msgid "Do you realy want to delete the view: &1?" +msgstr "Voulez vous vraiment effacer cette vue : &1?" + +#: FTables.class:1027 +msgid "Do you realy want to delete the index: &1?" +msgstr "Voulez vous vraiment effacer cet index : &1?" + +#: FTables.class:1029 +msgid "Do you realy want to delete the field: &1?" +msgstr "Voulez vous vraiment effacer ce champ : &1?" + +#: FTables.class:1031 +msgid "Do you realy want to delete the routine: &1?" +msgstr "Voulez vous vraiment effacer cette routine : &1?" + +#: FTables.class:1033 +msgid "Do you realy want to delete the trigger: &1?" +msgstr "Voulez vous vraiment effacer ce déclencheur : &1?" + +#: FTables.class:1035 +msgid "Do you realy want to delete the event: &1?" +msgstr "Voulez vous vraiment effacer cet événement : &1?" + +#: FTables.class:1038 +msgid "Item deleted." +msgstr "Article effacé" + +#: FTables.class:1243 +msgid "Tables" +msgstr "" + +#: FTables.class:1248 +msgid "Item" +msgstr "Article" + +#: FTables.class:1253 +msgid "New Item" +msgstr "Nouvel article" + +#: FTables.class:1260 +#, fuzzy +msgid "Edit Item" +msgstr "Editer" + +#: FTables.class:1267 +msgid "Delete Item" +msgstr "Effacer l'article" + +#: FTables.class:1274 +msgid "Refresh" +msgstr "Rafraichir" + +#: FTables.class:1292 +msgid "Lock" +msgstr "Bloqué" + +#: FTables.class:1329 +msgid "New Database" +msgstr "Nouvelle base de données" + +#: FTables.class:1336 +msgid "Delete Database" +msgstr "Base de données effacée" + +#: FTables.class:1367 +msgid "Views" +msgstr "Vues" + +#: FTables.class:1396 +msgid "Routines" +msgstr "Routines" + +#: FTables.class:1406 +msgid "Triggers" +msgstr "Déclencheurs" + +#: FTables.class:1416 +msgid "Events" +msgstr "Evénements" + +#~ msgid "&Replace" +#~ msgstr "&Remplace" + +#~ msgid "Are you sure to want to replace all?" +#~ msgstr "Etes vous sûr de vouloir tout remplacer ?" + +#~ msgid "MySQL is great!!!" +#~ msgstr "Mysql est super !!!" + +#~ msgid "Gambas is great!!!" +#~ msgstr "Gambas est super !!!" + +#~ msgid "Wellcome!!! Have a nice day." +#~ msgstr "Bienvenue !!! Bonne continuation." + +#~ msgid "In a world without walls and fences, who needs windows and gates?" +#~ msgstr "Dans un monde sans murs et barrières, qui a besoin de fenetres et de portes ?" + +#~ msgid "In God we trust" +#~ msgstr "Grace à Dieu !" + +#~ msgid "Do you want to save the changes?" +#~ msgstr "Voulez vous sauver les changements ?" + +#~ msgid "Go to line" +#~ msgstr "Aller à la ligne " + +#~ msgid "Search string replaced &1 times." +#~ msgstr "Chaine de recherche remplacée &1 fois" + +#~ msgid "Search string replaced once." +#~ msgstr "Chaine de recherche remplacée une fois." + +#~ msgid "Search string cannot be found." +#~ msgstr "Chaine de recherche non trouvée." + +#~ msgid "Reached the beginning of the document." +#~ msgstr "Le début du document a été atteind" + +#~ msgid "Reached the end of the document." +#~ msgstr "La fin du document a été atteind " + +#~ msgid "Revision:" +#~ msgstr "Révision :" + +#~ msgid "Workig Version:" +#~ msgstr "Version de travail :" + +#~ msgid "Modified" +#~ msgstr "Modifié" + +#~ msgid "Missing or incomplete" +#~ msgstr "Manquant ou incomplet" + +#~ msgid "Not under version control" +#~ msgstr "Pas de CVS" + +#~ msgid "Existed" +#~ msgstr "Sortie" + +#~ msgid "Conflicting changes" +#~ msgstr "Changements pour éviter les conflits" + +#~ msgid "Merged" +#~ msgstr "fusionné" + +#~ msgid "Replaced" +#~ msgstr "Remplacé" + +#~ msgid "Deleted" +#~ msgstr "Effacé" + +#~ msgid "Added" +#~ msgstr "Ajouté" + +#~ msgid "Updated" +#~ msgstr "Mis à jour" + +#~ msgid "Status:" +#~ msgstr "Etats :" + +#~ msgid "Do you really want to revert the changes?" +#~ msgstr "Voulez vous vraiment rétablir les changements ?" + +#~ msgid "File saved." +#~ msgstr "Fichier sauvé." + +#~ msgid "Entire word" +#~ msgstr "Mot entier" + +#~ msgid "Case sensitive" +#~ msgstr "police sensitive" + +#~ msgid "Replace all" +#~ msgstr "Tout remplacer " + +#~ msgid "Replace current" +#~ msgstr "Remplacer l'actuel" + +#~ msgid "Find previous" +#~ msgstr "Recherche le précédent" + +#~ msgid "Find next" +#~ msgstr "Recherche le suivant" + +#~ msgid "Close" +#~ msgstr "Fermer" + +#~ msgid "Update" +#~ msgstr "Mise à jour" + +#~ msgid "Status" +#~ msgstr "Etats" + +#~ msgid "Revert" +#~ msgstr "Retour" + +#~ msgid "Go to symbol" +#~ msgstr "Aller au symbol" + +#~ msgid "Go to line..." +#~ msgstr "Aller à la ligne..." + +#~ msgid "Horizontal" +#~ msgstr "Horizontal" + +#~ msgid "View" +#~ msgstr "Vue" + +#~ msgid "Load" +#~ msgstr "Charger" + +#~ msgid "Save" +#~ msgstr "Sauver" + +#~ msgid "Show/Hide" +#~ msgstr "Afficher/Cacher" + +#~ msgid "Replace" +#~ msgstr "Remplacer" + +#~ msgid "Find" +#~ msgstr "Recherche" + +#~ msgid "Clean" +#~ msgstr "Nettoyer" + +#~ msgid "Show numbers" +#~ msgstr "Affiche les nombres" + +#~ msgid "Completion" +#~ msgstr "Complétion" + +#~ msgid "Uncomment" +#~ msgstr "Décommenter" + +#~ msgid "Load query" +#~ msgstr "Charger la requete" + +#~ msgid "Show/Hide tool bar" +#~ msgstr "Afficher/Cacher la barre d'outils" + +#~ msgid "Find & Replace" +#~ msgstr "Recherche et remplace" + +#~ msgid "Clean editor" +#~ msgstr "Nettoyer l'éditeur" + +#~ msgid "Save query" +#~ msgstr "Sauver une requete" + +#~ msgid "Columns with * are Key fields.
They will be used to perform any operation." +#~ msgstr "Les colonnes avec * sont des champs clés.
Ils seront utilisés comme jokers." + +#~ msgid "User
Schema (database) privileges assigned to the user" +#~ msgstr "Utilisateur
Schéma (base de données) des privilèges assignés à l'utilisateur" + +#~ msgid "Schema Privileges" +#~ msgstr "Droits du schéma" + +#~ msgid "New" +#~ msgstr "Nouveau" + +#~ msgid "&Change" +#~ msgstr "&Changer" + +#~ msgid "Icon:" +#~ msgstr "Icones :" + +#~ msgid "Contact Information:" +#~ msgstr "Information du contact :" + +#~ msgid "E-Mail:" +#~ msgstr "Courriel :" + +#~ msgid "Description:" +#~ msgstr "Description :" + +#~ msgid "Full name:" +#~ msgstr "Nom :" + +#~ msgid "Additional Information" +#~ msgstr "Information additionnelles" + +#~ msgid "Confirm Password:" +#~ msgstr "Confirmer le mot de passe :" + +#~ msgid "New Password:" +#~ msgstr "Nouveau mot de passe :" + +#~ msgid "MySQL User:" +#~ msgstr "Utilisateur Mysql :" + +#~ msgid "Login Information" +#~ msgstr "Information d'entrée" + +#~ msgid "User
Login and additional information on the user" +#~ msgstr "Utilisateur
Login et informations additionnelles de l'utilisateur" + +#~ msgid "User Information" +#~ msgstr "Info utilisateur" + +#~ msgid "Information strored successfully." +#~ msgstr "Information sauvegardée avec succès." + +#~ msgid "Please select a table." +#~ msgstr "SVP sélectionnez une table" + +#~ msgid "Item created." +#~ msgstr "Article créer." + +#~ msgid "Selected Tables:" +#~ msgstr "Tables sélectionnées :" + +#~ msgid "Tables:" +#~ msgstr "Tables :" + +#~ msgid "Do not write the command to the binary log file." +#~ msgstr "Ne pas écrire cette commande dans un fichier binaire" + +#~ msgid "This will repair the selected table(s)." +#~ msgstr "Ceci réparera les tables sélectionnées." + +#~ msgid "This will check whether the selected table(s) are corrupted or have other errors." +#~ msgstr "Ceci vérifiera si les tables sont corrompues ou ont d'autres erreurs." + +#~ msgid "If necessary this will repair the selected table(s), sort index pages and update statistics." +#~ msgstr "Si nécessaire, ceci réparera les tables sélectionnées, trier les index et mettre à jour les statistiques." + +#~ msgid "Repair Tables" +#~ msgstr "Réparer les tables" + +#~ msgid "Check Tables" +#~ msgstr "Vérifier les tables" + +#~ msgid "Optimize Tables" +#~ msgstr "Tables optimisées" + +#~ msgid "Tasks" +#~ msgstr "Taches" + +#~ msgid "Table Maintenance
Please select the task you want to perform on the selected table(s)." +#~ msgstr "Maintenance de la table
SVP sélectionner la tâche que vous vouler effectuée sur la/les table(s) sélectionnée(s)." + +#~ msgid "Tasks and Tables Selection" +#~ msgstr "Sélection des tables et des taches" + +#~ msgid "&Execute" +#~ msgstr "&Exécuter" + +#~ msgid "Do not show this message again" +#~ msgstr "Ne plus montrer ce message" + +#~ msgid "Statements to execute" +#~ msgstr "Commande à exécuter" + +#~ msgid "Server Parameters" +#~ msgstr "Paramètres serveur" + +#~ msgid "Server Parameters (local)" +#~ msgstr "Paramètres serveur local" + +#~ msgid "Replication Status" +#~ msgstr "Etat de réplication" + +#~ msgid "System Variables" +#~ msgstr "Variables système" + +#~ msgid "Server Status:" +#~ msgstr "Etat du serveur :" + +#~ msgid "Clock:" +#~ msgstr "Horloge :" + +#~ msgid "Memory:" +#~ msgstr "Mémoire :" + +#~ msgid "Operating System:" +#~ msgstr "Système d'exploitation :" + +#~ msgid "Processor:" +#~ msgstr "Processeur :" + +#~ msgid "Version:" +#~ msgstr "Version :" + +#~ msgid "Client Information" +#~ msgstr "Information Client" + +#~ msgid "Network Name:" +#~ msgstr "Nom de réseau :" + +#~ msgid "IP:" +#~ msgstr "IP :" + +#~ msgid "MySQL Version:" +#~ msgstr "Version Mysql :" + +#~ msgid "Host:" +#~ msgstr "Serveur :" + +#~ msgid "Socket:" +#~ msgstr "Prise :" + +#~ msgid "Connected to MySQL Server Instance" +#~ msgstr "Connecté à l'instance du serveur Mysql" + +#~ msgid "" +#~ "Server Status:
\n" +#~ "     Server is running" +#~ msgstr "" +#~ "Etat du serveur :
\n" +#~ "     Le serveur est lancé" + +#~ msgid "Couldn't find &1 in &2 or &3" +#~ msgstr "Impossible de trouver &1 dans &2 ou &3" + +#~ msgid "New Script" +#~ msgstr "Nouveau script" + +#~ msgid "Run script" +#~ msgstr "Exécuter un script" + +#~ msgid "Script executed successfully." +#~ msgstr "Script exécuté avec succès" + +#~ msgid "Empty table." +#~ msgstr "Table vide." + +#~ msgid "Paso #5" +#~ msgstr "Passe #5" + +#~ msgid "Local Test" +#~ msgstr "Test local" + +#~ msgid "Changes the restore path" +#~ msgstr "Changement du chemin de restauration" + +#~ msgid "Source schema:" +#~ msgstr "Source du schéma :" + +#~ msgid "Source Schema" +#~ msgstr "Source du schéma" + +#~ msgid "SMaRT" +#~ msgstr "Pratique" + +#~ msgid "Schema:" +#~ msgstr "Schéma :" + +#~ msgid "david123" +#~ msgstr "--" + +#~ msgid "3306" +#~ msgstr "-" + +#~ msgid "localhost" +#~ msgstr "Serveur local" + +#~ msgid "Main server" +#~ msgstr "Serveur principal" + +#~ msgid "Backup Main Server" +#~ msgstr "Sauvegarde du serveur principal" + +#~ msgid "Read this first!!!" +#~ msgstr "A lire en premier !!!!" + +#~ msgid "Remove row" +#~ msgstr "Effacer une ligne" + +#~ msgid "Add row" +#~ msgstr "Ajouter une ligne" + +#~ msgid "Save to file" +#~ msgstr "Sauver dans un fichier" + +#~ msgid "ResultSet" +#~ msgstr "Résultat" + +#~ msgid "Ignore SQL errors" +#~ msgstr "Ignorer les erreurs SQL" + +#~ msgid "Options:" +#~ msgstr "Options :" + +#~ msgid "Total data length:" +#~ msgstr "Longueur totale des données :" + +#~ msgid "Total tables:" +#~ msgstr "Total des tables :" + +#~ msgid "Total schemas:" +#~ msgstr "Schémas totaux :" + +#~ msgid "Character Set:" +#~ msgstr "jeu de caractères :" + +#~ msgid "File:" +#~ msgstr "Fichier " + +#~ msgid "Information:" +#~ msgstr "Informations :" + +#~ msgid "Restore backup" +#~ msgstr "Restauration de la sauvegarde" + +#~ msgid "Restore executed successfully." +#~ msgstr "Restauration effectuée avec succès" + +#~ msgid "Opens the output file" +#~ msgstr "Ouvre le fichier de sortie" + +#~ msgid "Output to file" +#~ msgstr "Fichier de sortie" + +#~ msgid "Prints the output to a specified file. By default /home/user/Tmp.sql." +#~ msgstr "Affiche la sortie d'un fichier spécifié. Par défaut /home/user/Tmp.sql." + +#~ msgid "-t" +#~ msgstr "-" + +#~ msgid "Output in table format" +#~ msgstr "Format de la table de sortie" + +#~ msgid "-vvv" +#~ msgstr "-" + +#~ msgid "Shows the Query and Rows in Set in Table Format" +#~ msgstr "Affiche la requete et les lignes ensemble dans une table " + +#~ msgid "-vv" +#~ msgstr "-" + +#~ msgid "Shows the Query and Rows in Set" +#~ msgstr "Affiche la requete et les lignes ensemble" + +#~ msgid "-v" +#~ msgstr "-" + +#~ msgid "Shows the Query" +#~ msgstr "Affiche la requete" + +#~ msgid "New result tab" +#~ msgstr "Nouveau signet" + +#~ msgid "New Query" +#~ msgstr "Nouvelle requete" + +#~ msgid "Run query" +#~ msgstr "exécuter une requete" + +#~ msgid "Program set to write mode" +#~ msgstr "Programme configuré en modede lecture " + +#~ msgid "Program set to read only mode" +#~ msgstr "Programme configuré en mode de lecture seul" + +#~ msgid "Nothing to show." +#~ msgstr "Rien à afficher" + +#~ msgid "Database changed." +#~ msgstr "La base de données a changé" + +#~ msgid "Action not allowed in read only mode." +#~ msgstr "Action non permise en mode lecture seule" + +#~ msgid "Kill process" +#~ msgstr "Tuer le process" + +#~ msgid "Process" +#~ msgstr "Tache" + +#~ msgid "System Processes" +#~ msgstr "Taches système" + +#~ msgid "Info" +#~ msgstr "Info" + +#~ msgid "State" +#~ msgstr "Etat" + +#~ msgid "Time" +#~ msgstr "Heure" + +#~ msgid "Command" +#~ msgstr "Commande" + +#~ msgid "Database" +#~ msgstr "Base de données" + +#~ msgid "Host" +#~ msgstr "Serveur" + +#~ msgid "Id" +#~ msgstr "ID" + +#~ msgid "Show statements before execute them:" +#~ msgstr "Afficher les commandes avant de les exécuter :" + +#~ msgid "Show statements before execute them" +#~ msgstr "Afficher les commandes avant de les exécuter" + +#~ msgid "Show the information message before start editing:" +#~ msgstr "Affiche le message d'information avant de démarrer l'édition :" + +#~ msgid "Show the information message before start editing" +#~ msgstr "Affiche le message d'information avant de démarrer l'édition" + +#~ msgid "Result:" +#~ msgstr "Résultat :" + +#~ msgid "Result" +#~ msgstr "Résultat" + +#~ msgid "Numbers:" +#~ msgstr "Numéro :" + +#~ msgid "Sets the color for numbers in the editor" +#~ msgstr "Configure la couleur des nombres dans l'éditeur" + +#~ msgid "Font" +#~ msgstr "Police" + +#~ msgid "Font:" +#~ msgstr "Police :" + +#~ msgid "Sets the font type for the editor" +#~ msgstr "Configure le type de police de l'éditeur" + +#~ msgid "Keywords:" +#~ msgstr "Mots clés :" + +#~ msgid "Sets the color for keywords in the editor" +#~ msgstr "Configure la couleur des mots clés dans l'éditeur" + +#~ msgid "Tab size:" +#~ msgstr "Taille tab :" + +#~ msgid "Sets the tab size for the editor" +#~ msgstr "Configure la taille de tabulation de l'éditeur" + +#~ msgid "Strings:" +#~ msgstr "Chaines :" + +#~ msgid "Sets the color for strings in the editor" +#~ msgstr "Configure la couleur des chaines dans l'éditeur" + +#~ msgid "Symbols:" +#~ msgstr "Symboles :" + +#~ msgid "Sets the color for symbols in the editor" +#~ msgstr "Configure la couleur des symbols dans l'éditeur" + +#~ msgid "Functions:" +#~ msgstr "Functions :" + +#~ msgid "Sets the color for functions in the editor" +#~ msgstr "Configure la couleur des fonctions dans l'éditeur" + +#~ msgid "Operators:" +#~ msgstr "Opérateurs :" + +#~ msgid "Sets the color for operators in the editor" +#~ msgstr "Configure la couleur des opérateurs dans l'éditeur" + +#~ msgid "Data Types:" +#~ msgstr "Type des données :" + +#~ msgid "Sets the color for datatypes in the editor" +#~ msgstr "Configure la couleur du type de données dans l'éditeur" + +#~ msgid "&Restore" +#~ msgstr "&Restauration" + +#~ msgid "Show modified lines:" +#~ msgstr "Affiche les lignes modifiées :" + +#~ msgid "Show modified lines" +#~ msgstr "Afficher les lignes modifiées" + +#~ msgid "Comments:" +#~ msgstr "Commentaires :" + +#~ msgid "Sets the color for comments in the editor" +#~ msgstr "Configure la couleur des commentaites dans l'éditeur" + +#~ msgid "Editor:" +#~ msgstr "Editeur :" + +#~ msgid "Editor" +#~ msgstr "Editeur" + +#~ msgid "Path for restore files:" +#~ msgstr "Chemin des fichiers de restauration :" + +#~ msgid "Change the path to look for restore files" +#~ msgstr "Cherche le chemin pour restaurer les fichiers" + +#~ msgid "Dif Color" +#~ msgstr "Dif couleur" + +#~ msgid "Color for rows in results:" +#~ msgstr "Couleur des lignes pour le résultat" + +#~ msgid "Sets the color for rows in results" +#~ msgstr "Configure la couleur des lignes de résultats" + +#~ msgid "Custom messages" +#~ msgstr "Messages personnalisés" + +#~ msgid "Custom messages color:" +#~ msgstr "Couleur de messages personnalisés" + +#~ msgid "Sets the color for custom messages" +#~ msgstr "Configure la couleur des messages personnalisés" + +#~ msgid "Warning messages" +#~ msgstr "Messages d'avertissement" + +#~ msgid "Warning messages color:" +#~ msgstr "Couleur des messages d'avertissement" + +#~ msgid "Sets the color for warning messages" +#~ msgstr "Configure la couleur des avertissements de messages" + +#~ msgid "Error messages" +#~ msgstr "Messages d'erreur" + +#~ msgid "Error messages color:" +#~ msgstr "Couleur des messages d'erreur" + +#~ msgid "Sets the color for error messages" +#~ msgstr "Configure la couleur des messages d'erreur" + +#~ msgid "Information messages" +#~ msgstr "Messages d'information" + +#~ msgid "Information messages color:" +#~ msgstr "Couleur des messages d'information :" + +#~ msgid "Sets the color for information messages" +#~ msgstr "Configure la couleur des messages d'information" + +#~ msgid "Remember last windows opened:" +#~ msgstr "Rappel de la dernière fenetre ouverte :" + +#~ msgid "Remember last windows opened" +#~ msgstr "Rappel de la dernière fenetre ouverte" + +#~ msgid "Show error messages in a popup window:" +#~ msgstr "Affiche tous les messages dans un popup :" + +#~ msgid "Show error messages in a popup window" +#~ msgstr "Affiche les messages d'erreur dans une fenetre surgissante" + +#~ msgid "Store passwords:" +#~ msgstr "Enregistre le mot de passe :" + +#~ msgid "Store passwords" +#~ msgstr "Enregistre le mot de passe " + +#~ msgid "All keywords in uppercase:" +#~ msgstr "Tous les mots clés en majuscule :" + +#~ msgid "Show all Keywords in Uppercase" +#~ msgstr "Affiche tous les mots clés en majuscule" + +#~ msgid "Restore default values" +#~ msgstr "Restauration des valeurs par défaut" + +#~ msgid "Close forms by pessing Alt+Esc:" +#~ msgstr "Fermer le formulaire en appuant sur les touches Alt+Esc" + +#~ msgid "All Tabs/Forms will close if you press Esc key" +#~ msgstr "Tous les formulaires fermeront si vous appuyez sur la touche Esc" + +#~ msgid "General:" +#~ msgstr "Général :" + +#~ msgid "General" +#~ msgstr "Général" + +#~ msgid "Default values restored." +#~ msgstr "Valeurs restaurées par défaut." + +#~ msgid "UPDATE" +#~ msgstr "MAJ" + +#~ msgid "INSERT" +#~ msgstr "INSERT" + +#~ msgid "DELETE" +#~ msgstr "EFFACER" + +#~ msgid "BEFORE" +#~ msgstr "AVANT" + +#~ msgid "AFTER" +#~ msgstr "APRES" + +#~ msgid "URL:" +#~ msgstr "-" + +#~ msgid "Syntax:" +#~ msgstr "Syntaxe :" + +#~ msgid "" +#~ "Could not find any help.\n" +#~ "Please check those tables:\n" +#~ msgstr "" +#~ "Impossible de trouver de l'aide .\n" +#~ "SVP Vérifier ces tables :\n" + +#~ msgid "In this option you will find the information about the application." +#~ msgstr "Dans cette option vous trouverez les informations à propos de cette application" + +#~ msgid "Shows this help" +#~ msgstr "Affiche cet aide" + +#~ msgid "In this option you will find this help" +#~ msgstr "Dans cette option vous trouverez cette aide " + +#~ msgid "Runs a script" +#~ msgstr "Exécute un script" + +#~ msgid "Runs a query" +#~ msgstr "Exécute une requete" + +#~ msgid "Shortcuts" +#~ msgstr "Raccourcis" + +#~ msgid "Generate a Gambas module to create the Database, Tables, Routines..." +#~ msgstr "Générer un module Gambas pour créer la base de données, tables, routines..." + +#~ msgid "Click the status bar to see the complete message in a new window." +#~ msgstr "Cliquer sur la barre d'état afin de voir le message complet dans la nouvelle fenêtre" + +#~ msgid "Features" +#~ msgstr "Caractéristiques" + +#~ msgid "is an application to interact with a MySQL Server and is based on gb.mysql. Its propose is to provide a friendly interface to MySQL, it is the fusion of: gb.database-manager, mysql-query-browser and mysql-administrator" +#~ msgstr "Ceci est une application pour gérer le serveur Mysql, elle est basée sur gb.mysql. Son propos est de procurer une interface conviviale à Mysql, c'est la fusion entre : gb.database-manager, mysql-query-browser et mysql-administrator" + +#~ msgid "General Information:" +#~ msgstr "Information générale :" + +#~ msgid "Generate" +#~ msgstr "Générer" + +#~ msgid "Destination:" +#~ msgstr "Destination" + +#~ msgid "TXT" +#~ msgstr "-" + +#~ msgid "XML" +#~ msgstr "-" + +#~ msgid "HTML" +#~ msgstr "HTML" + +#~ msgid "Format Selection:" +#~ msgstr "Sélection du format :" + +#~ msgid "Procedures" +#~ msgstr "Procédures" + +#~ msgid "Functions" +#~ msgstr "Functions" + +#~ msgid "Databases" +#~ msgstr "Base de données" + +#~ msgid "Object Selection:" +#~ msgstr "Sélection d'objet :" + +#~ msgid "Select the databases:" +#~ msgstr "Base de données sélectionnées :" + +#~ msgid "Generate Documentation" +#~ msgstr "Générer la documentation" + +#~ msgid "Diff" +#~ msgstr "Diff" + +#~ msgid "No difference" +#~ msgstr "Aucune différence" + +#~ msgid "Cancel" +#~ msgstr "Annuler" + +#~ msgid "Changes" +#~ msgstr "Changements" + +#~ msgid "Password" +#~ msgstr "Mot de passe " + +#~ msgid "User" +#~ msgstr "Utilisateur" + +#~ msgid "Authentification" +#~ msgstr "--" + +#~ msgid "Previous description" +#~ msgstr "Description précédentes" + +#~ msgid "Clean up" +#~ msgstr "Nettoyer tout" + +#~ msgid "Unindent" +#~ msgstr "Désindenter" + +#~ msgid "Indent" +#~ msgstr "Indenter" + +#~ msgid "Redo" +#~ msgstr "Refaire " + +#~ msgid "Undo" +#~ msgstr "Défaire" + +#~ msgid "Paste" +#~ msgstr "Coller" + +#~ msgid "Copy" +#~ msgstr "Copier" + +#~ msgid "Cut" +#~ msgstr "Couper" + +#~ msgid "Commit description" +#~ msgstr "Description de validation" + +#~ msgid "Description" +#~ msgstr "Description" + +#~ msgid "Commit" +#~ msgstr "Valider" + +#~ msgid "Please enter the password" +#~ msgstr "SVP entrez le mot de passe" + +#~ msgid "Please enter the change log" +#~ msgstr "SVP entrez le fichier log " + +#~ msgid "Please enter the versioning user name" +#~ msgstr "SVP entrez le nom de version utilisateur" + +#~ msgid "Server" +#~ msgstr "Serveur" + +#~ msgid "Close all forms" +#~ msgstr "Fermer tous les formulaires" + +#~ msgid "Close form" +#~ msgstr "Fermer le formulaire" + +#~ msgid "Hide panels" +#~ msgstr "Cacher le panneau" + +#~ msgid "Main" +#~ msgstr "Principal" + +#~ msgid "File" +#~ msgstr "Fichier" + +#~ msgid "Processes" +#~ msgstr "Taches" + +#~ msgid "Preferences" +#~ msgstr "Préferrences" + +#~ msgid "Documentation" +#~ msgstr "Documentation" + +#~ msgid "Help" +#~ msgstr "Aide" + +#~ msgid "MySQL Help" +#~ msgstr "Aide Mysql" + +#~ msgid "Script" +#~ msgstr "Script" + +#~ msgid "Table Maintenance" +#~ msgstr "Table de maintenance" + +#~ msgid "Query" +#~ msgstr "Requete" + +#~ msgid "Schemas" +#~ msgstr "Schémas" + +#~ msgid "Schema" +#~ msgstr "Schéma" + +#~ msgid "Restore Backup" +#~ msgstr "Restauration de la sauvergarde" + +#~ msgid "User Administration" +#~ msgstr "Administrateur " + +#~ msgid "Server Information" +#~ msgstr "Info serveur" + +#~ msgid "Backup Content" +#~ msgstr "Contenu de la sauvegarde" + +#~ msgid "Catalogs" +#~ msgstr "Catalogues" + +#~ msgid "&Start Backup" +#~ msgstr "&Démarrer la sauvegarde" + +#~ msgid "Project Name:" +#~ msgstr "Nom du projet :" + +#~ msgid "Backup Project
Define the project name and the content of the backup" +#~ msgstr "Projet de sauvegarde
Défini le nom du projet et le contenu de la sauvegarde" + +#~ msgid "Backup" +#~ msgstr "Sauvegarde" + +#~ msgid "Done" +#~ msgstr "Fait" + +#~ msgid "Please select a database" +#~ msgstr "SVP sélectionnez une base de données" + +#~ msgid "Data Length" +#~ msgstr "Longueur des données" + +#~ msgid "Table Type" +#~ msgstr "Type de table" + +#~ msgid "Objects" +#~ msgstr "Objets" + +#~ msgid "" +#~ "MYSQL-GUI MySQL Database administrator for Gambas.\n" +#~ "Copyright (C) 2008-2010 David Villalobos Cambronero.\n" +#~ "\n" +#~ "This program is free software: you can redistribute it and/or modify\n" +#~ "it under the terms of the GNU General Public License as published by\n" +#~ "the Free Software Foundation, either version 3 of the License, or\n" +#~ "(at your option) any later version.\n" +#~ "\n" +#~ "This program is distributed in the hope that it will be useful,\n" +#~ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" +#~ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" +#~ "GNU General Public License for more details.\n" +#~ "\n" +#~ "You should have received a copy of the GNU General Public License\n" +#~ "along with this program. If not, see ." +#~ msgstr "" +#~ "MYSQL-GUI MySQL administrateur de base de données pour Gambas.\n" +#~ "Copyright (C) 2008-2010 David Villalobos Cambronero.\n" +#~ "\n" +#~ " (traduction française Henri Girard). Ce programme est un logiciel libre : Vous pouvez le distribuer et/ou le modifier\n" +#~ "Selon les termes de GNU General Public License, telle que publiée part\n" +#~ "the Free Software Foundation, Soit en version 3 de la License, ou\n" +#~ "(selon votre choix) dans n'importe-quelle version ultérieure.\n" +#~ "\n" +#~ "Ce programme est distribué avec l'espoir qu'il soit utile,\n" +#~ "mais absolument sans aucune garantie ; Meme sans aucune garantie que l'on pourrait attendre d'un logiciel, de commercialisation ou d'utilité dans un domaine précis.\n" +#~ "Voir GNU General Public License pour plus de détail.\n" +#~ "\n" +#~ "Vous devriez avoir reçu une copie de GNU General Public License\n" +#~ "avec ce programme. Sinon voyez ." + +#~ msgid "License" +#~ msgstr "License" + +#~ msgid "About" +#~ msgstr "A propos" + +#~ msgid "A simple Graphic User Interface for MySQL" +#~ msgstr "Un simple GUI pour MySQL" + +#~ msgid "mysql-gui" +#~ msgstr "-" diff --git a/app/examples/Database/MySQLExample/.lang/nl.po b/app/examples/Database/MySQLExample/.lang/nl.po new file mode 100644 index 00000000..1f684132 --- /dev/null +++ b/app/examples/Database/MySQLExample/.lang/nl.po @@ -0,0 +1,531 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: MySQLExample 3.5.90\n" +"PO-Revision-Date: 2014-09-25 20:40 UTC\n" +"Last-Translator: Willy Raets \n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 FConnect.form:28 +msgid "MySQL Example" +msgstr "MySQL Voorbeeld" + +#: .project:2 +msgid "A simple GB.MYSQL Example" +msgstr "Een eenvoudig GB.MYSQL voorbeeld" + +#: FConnect.form:20 +msgid "MySQL GUI" +msgstr "-" + +#: FConnect.form:35 +msgid "Connect to a MySQL Server" +msgstr "Verbind met een MySQL Server" + +#: FConnect.form:39 +msgid "Server:" +msgstr "-" + +#: FConnect.form:50 +msgid "Port:" +msgstr "Poort:" + +#: FConnect.form:61 +msgid "User:" +msgstr "Gebruiker:" + +#: FConnect.form:72 +msgid "Password:" +msgstr "Wachtwoord:" + +#: FConnect.form:84 +msgid "&Connect" +msgstr "&Verbind" + +#: FConnect.form:91 +msgid "&Clear" +msgstr "&Opschonen" + +#: FNewView.form:52 +msgid "&Cancel" +msgstr "&Annuleren" + +#: FMessage.form:8 +msgid "Message" +msgstr "Bericht" + +#: FNewDatabase.form:16 +msgid "Create Database" +msgstr "Creëer Database" + +#: FNewRoutine.form:35 FNewTable.form:32 FNewTrigger.form:34 FNewView.form:30 +msgid "Name:" +msgstr "Naam:" + +#: FNewDatabase.form:42 +msgid "Collation:" +msgstr "Collatie:" + +#: FNewDatabase.form:53 FNewTable.form:53 +msgid "Charset:" +msgstr "Karakterset:" + +#: FNewDatabase.form:63 +msgid "&Create" +msgstr "&Creëer" + +#: FNewEvent.form:16 +msgid "Create Event" +msgstr "Creëer Gebeurtenis" + +#: FNewEvent.form:42 +msgid "Schedule:" +msgstr "Schema:" + +#: FNewEvent.form:47 FNewRoutine.form:50 +msgid "Comma separated values: Hola1 INT,Hola2 CHAR(5)" +msgstr "Comma gesepareerde waarden: Hola1 INT, Hola2 CHAR(5)" + +#: FNewEvent.form:52 FNewRoutine.form:69 FNewTrigger.form:67 FNewView.form:39 +msgid "Show a clue" +msgstr "Aanwijzing weergeven" + +#: FNewTable.form:70 FNewTrigger.form:73 FNewView.form:45 +msgid "&Ok" +msgstr "&Ok" + +#: FNewEvent.class:19 +msgid "Edit Event" +msgstr "Bewerk Gebeurtenis" + +#: FNewField.form:22 +msgid "Add Field" +msgstr "Veld toevoegen" + +#: FNewField.form:47 +msgid "Data Type:" +msgstr "-" + +#: FNewField.form:57 +msgid "Accepts NULLs:" +msgstr "Accepteert NULL's" + +#: FNewField.form:63 +msgid "No" +msgstr "Neen" + +#: FNewField.form:63 +msgid "Yes" +msgstr "Ja" + +#: FNewField.form:69 +msgid "Default:" +msgstr "Standaard:" + +#: FNewField.form:79 +msgid "Extra:" +msgstr "-" + +#: FNewField.form:89 +msgid "Comment:" +msgstr "Commentaar:" + +#: FNewField.class:22 +msgid "Edit Field" +msgstr "Bewerk Veld" + +#: FNewIndex.form:18 +msgid "Create Index" +msgstr "Creëer Index" + +#: FNewIndex.form:23 +msgid "Delete" +msgstr "Verwijder" + +#: FNewIndex.form:55 +msgid "Fields:" +msgstr "Velden:" + +#: FNewIndex.form:68 +msgid "Primary Key" +msgstr "Primaire Sleutel" + +#: FNewIndex.class:24 +msgid "Edit Index" +msgstr "Bewerk Index" + +#: FNewRoutine.form:19 +msgid "Create Routine" +msgstr "Creëer Routine" + +#: FNewRoutine.form:45 +msgid "Parameters:" +msgstr "-" + +#: FNewRoutine.form:56 +msgid "Returns:" +msgstr "Retourneren:" + +#: FNewRoutine.class:19 +msgid "Edit Routine" +msgstr "Bewerk Routine" + +#: FNewTable.form:16 +msgid "Create Table" +msgstr "Creëer Tabel" + +#: FNewTable.form:42 +msgid "Engine:" +msgstr "Motor:" + +#: FNewTable.class:21 +msgid "Edit Table" +msgstr "Bewerk Tabel" + +#: FNewTrigger.form:18 +msgid "Create Trigger" +msgstr "Creëer Trigger" + +#: FNewTrigger.form:44 +msgid "Time:" +msgstr "Tijd:" + +#: FNewTrigger.form:56 +msgid "Event:" +msgstr "Gebeurtenis:" + +#: FNewTrigger.class:28 +msgid "Edit Trigger" +msgstr "Bewerk Trigger" + +#: FNewView.form:14 +msgid "Create View" +msgstr "Creëer Weergave" + +#: FNewView.class:18 +msgid "Edit View" +msgstr "Bewerk Weergave" + +#: FTables.form:35 +msgid "Tables" +msgstr "Tabellen" + +#: FTables.form:40 +msgid "Item" +msgstr "Element" + +#: FTables.form:45 +msgid "New Item" +msgstr "Nieuw Element" + +#: FTables.form:52 +msgid "Edit Item" +msgstr "Bewerk Element" + +#: FTables.form:59 +msgid "Delete Item" +msgstr "Verwijder Element" + +#: FTables.form:66 +msgid "Refresh" +msgstr "Vernieuwen" + +#: FTables.form:84 +msgid "Lock" +msgstr "Slot" + +#: FTables.form:96 +msgid "New Table" +msgstr "Nieuwe Tabel" + +#: FTables.form:103 +msgid "Delete Table" +msgstr "Verwijder Tabel" + +#: FTables.form:121 +msgid "New Database" +msgstr "Nieuwe Database" + +#: FTables.form:128 +msgid "Delete Database" +msgstr "Verwijder Database" + +#: FTables.form:159 +msgid "Views" +msgstr "Weergaven" + +#: FTables.form:169 +msgid "Indexes" +msgstr "Indices" + +#: FTables.form:179 +msgid "Fields on:" +msgstr "Velden aan:" + +#: FTables.form:188 +msgid "Routines" +msgstr "-" + +#: FTables.form:198 +msgid "Triggers" +msgstr "-" + +#: FTables.form:208 +msgid "Events" +msgstr "Gebeurtenissen" + +#: FTables.class:9 +msgid "Name" +msgstr "Naam" + +#: FTables.class:10 +msgid "Rows" +msgstr "Rijen" + +#: FTables.class:11 +msgid "Engine" +msgstr "Motor" + +#: FTables.class:12 +msgid "Charset" +msgstr "Karakterset" + +#: FTables.class:13 +msgid "Collation" +msgstr "Collatie" + +#: FTables.class:14 +msgid "Size" +msgstr "Maat" + +#: FTables.class:15 +msgid "Update Time" +msgstr "Update tijd" + +#: FTables.class:20 +msgid "Updatable" +msgstr "Actualiseerbaar" + +#: FTables.class:21 +msgid "Definer" +msgstr "Definiëerder" + +#: FTables.class:22 +msgid "Security" +msgstr "Beveiliging" + +#: FTables.class:23 +msgid "Check" +msgstr "Controleer" + +#: FTables.class:30 +msgid "Column" +msgstr "Kolom" + +#: FTables.class:32 +msgid "Type" +msgstr "-" + +#: FTables.class:38 +msgid "Returns" +msgstr "Retourneren" + +#: FTables.class:39 +msgid "Creation Time" +msgstr "Creatietijd" + +#: FTables.class:43 +msgid "Comment" +msgstr "Commentaar" + +#: FTables.class:49 +msgid "Default" +msgstr "Standaard" + +#: FTables.class:50 +msgid "Nullable" +msgstr "-" + +#: FTables.class:51 +msgid "DataType" +msgstr "-" + +#: FTables.class:52 +msgid "Key" +msgstr "Sleutel" + +#: FTables.class:53 +msgid "Extra" +msgstr "-" + +#: FTables.class:61 +msgid "Event" +msgstr "Gebeurtenis" + +#: FTables.class:62 +msgid "Table" +msgstr "Tabel" + +#: FTables.class:63 +msgid "Timing" +msgstr "-" + +#: FTables.class:70 +msgid "Time Zone" +msgstr "Tijd Zone" + +#: FTables.class:72 +msgid "Execute At" +msgstr "Uitvoeren op" + +#: FTables.class:73 +msgid "Interval Value" +msgstr "Interval Waarde" + +#: FTables.class:74 +msgid "Interval Field" +msgstr "Interval Veld" + +#: FTables.class:75 +msgid "SQL Mode" +msgstr "SQL Modus" + +#: FTables.class:76 +msgid "Starts" +msgstr "-" + +#: FTables.class:77 +msgid "Ends" +msgstr "-" + +#: FTables.class:78 +msgid "On Completion" +msgstr "Bij voltooiing" + +#: FTables.class:79 +msgid "Created" +msgstr "Gecreëerd" + +#: FTables.class:80 +msgid "Last Altered" +msgstr "Laast gewijzigd" + +#: FTables.class:81 +msgid "Last Executed" +msgstr "Laatst uitgevoerd" + +#: FTables.class:82 +msgid "Originator" +msgstr "-" + +#: FTables.class:85 +msgid "Database Collation" +msgstr "Database collatie" + +#: FTables.class:112 +msgid "Fields" +msgstr "Velden" + +#: FTables.class:330 +msgid "Not available" +msgstr "Niet beschikbaar" + +#: FTables.class:363 +msgid "Indexes on:" +msgstr "Indices aan:" + +#: FTables.class:880 +msgid "New View" +msgstr "Nieuwe Weergave" + +#: FTables.class:881 +msgid "Delete View" +msgstr "Verwijder Weergave" + +#: FTables.class:883 +msgid "New Index" +msgstr "Nieuwe Index" + +#: FTables.class:884 +msgid "Delete Index" +msgstr "Verwijder Index" + +#: FTables.class:886 +msgid "New Field" +msgstr "Nieuw Veld" + +#: FTables.class:887 +msgid "Delete Field" +msgstr "Verwijder Veld" + +#: FTables.class:889 +msgid "New Routine" +msgstr "Nieuwe Routine" + +#: FTables.class:890 +msgid "Delete Routine" +msgstr "Verwijder Routine" + +#: FTables.class:892 +msgid "New Trigger" +msgstr "Nieuwe Trigger" + +#: FTables.class:893 +msgid "Delete Trigger" +msgstr "Verwijder Trigger" + +#: FTables.class:895 +msgid "New Event" +msgstr "Nieuwe Gebeurtenis" + +#: FTables.class:896 +msgid "Delete Event" +msgstr "Verwijder Gebeurtenis" + +#: FTables.class:927 +msgid "Do you realy want to delete the database: &1?" +msgstr "Wil je werkelijk de database &1 verwijderen?" + +#: FTables.class:927 +msgid "&Yes" +msgstr "&Ja" + +#: FTables.class:927 +msgid "&No" +msgstr "&Neen" + +#: FTables.class:1019 +msgid "Do you realy want to delete the table: &1?" +msgstr "Wil je werkelijk de tabel &1 verwijderen?" + +#: FTables.class:1021 +msgid "Do you realy want to delete the view: &1?" +msgstr "Wil je werkelijk de weergave &1 verwijderen?" + +#: FTables.class:1023 +msgid "Do you realy want to delete the index: &1?" +msgstr "Wil je werkelijk de index &1 verwijderen?" + +#: FTables.class:1025 +msgid "Do you realy want to delete the field: &1?" +msgstr "Wil je werkelijk het veld &1 verwijderen?" + +#: FTables.class:1027 +msgid "Do you realy want to delete the routine: &1?" +msgstr "Wil je werkelijk de routine &1 verwijderen?" + +#: FTables.class:1029 +msgid "Do you realy want to delete the trigger: &1?" +msgstr "Wil je werkelijk de trigger &1 verwijderen?" + +#: FTables.class:1031 +msgid "Do you realy want to delete the event: &1?" +msgstr "Wil je werkelijk de gebeurtenis &1 verwijderen?" + +#: FTables.class:1034 +msgid "Item deleted." +msgstr "Element verwijdert:" + diff --git a/app/examples/Database/MySQLExample/.lang/ru.po b/app/examples/Database/MySQLExample/.lang/ru.po new file mode 100644 index 00000000..b0907bbc --- /dev/null +++ b/app/examples/Database/MySQLExample/.lang/ru.po @@ -0,0 +1,554 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Database/MySQLExample/.project:27 app/examples/Database/MySQLExample/.src/FConnect.form:12 +msgid "MySQL Example" +msgstr "Пример MySQL" + +#: app/examples/Database/MySQLExample/.project:28 +msgid "A simple GB.MYSQL Example" +msgstr "Простой пример GB.MYSQL" + +#: app/examples/Database/MySQLExample/.src/FConnect.form:5 +msgid "MySQL GUI" +msgstr "GUI MySQL" + +#: app/examples/Database/MySQLExample/.src/FConnect.form:18 +msgid "Connect to a MySQL Server" +msgstr "Соединиться с сервером MySQL" + +#: app/examples/Database/MySQLExample/.src/FConnect.form:21 +msgid "Server:" +msgstr "Сервер:" + +#: app/examples/Database/MySQLExample/.src/FConnect.form:30 +msgid "Port:" +msgstr "Порт:" + +#: app/examples/Database/MySQLExample/.src/FConnect.form:39 +msgid "User:" +msgstr "Пользователь:" + +#: app/examples/Database/MySQLExample/.src/FConnect.form:48 +msgid "Password:" +msgstr "Пароль:" + +#: app/examples/Database/MySQLExample/.src/FConnect.form:58 +msgid "&Connect" +msgstr "Соединить" + +#: app/examples/Database/MySQLExample/.src/FConnect.form:64 +msgid "&Clear" +msgstr "Очистить" + +#: app/examples/Database/MySQLExample/.src/FConnect.form:69 app/examples/Database/MySQLExample/.src/CreateObjects/FNewDatabase.form:50 app/examples/Database/MySQLExample/.src/CreateObjects/FNewEvent.form:46 app/examples/Database/MySQLExample/.src/CreateObjects/FNewField.form:73 app/examples/Database/MySQLExample/.src/CreateObjects/FNewIndex.form:56 app/examples/Database/MySQLExample/.src/CreateObjects/FNewRoutine.form:58 app/examples/Database/MySQLExample/.src/CreateObjects/FNewTable.form:44 app/examples/Database/MySQLExample/.src/CreateObjects/FNewTrigger.form:57 app/examples/Database/MySQLExample/.src/CreateObjects/FNewView.form:37 +msgid "&Cancel" +msgstr "Отмена" + +#: app/examples/Database/MySQLExample/.src/FMessage.form:5 +msgid "Message" +msgstr "Сообщение" + +#: app/examples/Database/MySQLExample/.src/FTables.class:9 app/examples/Database/MySQLExample/.src/FTables.class:19 app/examples/Database/MySQLExample/.src/FTables.class:29 app/examples/Database/MySQLExample/.src/FTables.class:37 app/examples/Database/MySQLExample/.src/FTables.class:48 app/examples/Database/MySQLExample/.src/FTables.class:60 app/examples/Database/MySQLExample/.src/FTables.class:68 +msgid "Name" +msgstr "Имя" + +#: app/examples/Database/MySQLExample/.src/FTables.class:10 +msgid "Rows" +msgstr "Строки" + +#: app/examples/Database/MySQLExample/.src/FTables.class:11 +msgid "Engine" +msgstr "Движок" + +#: app/examples/Database/MySQLExample/.src/FTables.class:12 app/examples/Database/MySQLExample/.src/FTables.class:24 app/examples/Database/MySQLExample/.src/FTables.class:54 app/examples/Database/MySQLExample/.src/FTables.class:83 +msgid "Charset" +msgstr "Кодировка" + +#: app/examples/Database/MySQLExample/.src/FTables.class:13 app/examples/Database/MySQLExample/.src/FTables.class:25 app/examples/Database/MySQLExample/.src/FTables.class:31 app/examples/Database/MySQLExample/.src/FTables.class:55 app/examples/Database/MySQLExample/.src/FTables.class:84 +msgid "Collation" +msgstr "Упорядочение" + +#: app/examples/Database/MySQLExample/.src/FTables.class:14 +msgid "Size" +msgstr "Размер" + +#: app/examples/Database/MySQLExample/.src/FTables.class:15 app/examples/Database/MySQLExample/.src/FTables.class:40 +msgid "Update Time" +msgstr "Обновить время" + +#: app/examples/Database/MySQLExample/.src/FTables.class:20 +msgid "Updatable" +msgstr "Обновляемый" + +#: app/examples/Database/MySQLExample/.src/FTables.class:21 app/examples/Database/MySQLExample/.src/FTables.class:42 app/examples/Database/MySQLExample/.src/FTables.class:64 app/examples/Database/MySQLExample/.src/FTables.class:69 +msgid "Definer" +msgstr "Определитель" + +#: app/examples/Database/MySQLExample/.src/FTables.class:22 +msgid "Security" +msgstr "Безопасность" + +#: app/examples/Database/MySQLExample/.src/FTables.class:23 +msgid "Check" +msgstr "Проверить" + +#: app/examples/Database/MySQLExample/.src/FTables.class:30 +msgid "Column" +msgstr "Столбец" + +#: app/examples/Database/MySQLExample/.src/FTables.class:32 app/examples/Database/MySQLExample/.src/FTables.class:41 app/examples/Database/MySQLExample/.src/FTables.class:71 +msgid "Type" +msgstr "Тип" + +#: app/examples/Database/MySQLExample/.src/FTables.class:38 +msgid "Returns" +msgstr "Возвращаемые данные" + +#: app/examples/Database/MySQLExample/.src/FTables.class:39 +msgid "Creation Time" +msgstr "Время создания" + +#: app/examples/Database/MySQLExample/.src/FTables.class:43 app/examples/Database/MySQLExample/.src/FTables.class:56 app/examples/Database/MySQLExample/.src/FTables.class:86 +msgid "Comment" +msgstr "Комментарий" + +#: app/examples/Database/MySQLExample/.src/FTables.class:49 +msgid "Default" +msgstr "По умолчанию" + +#: app/examples/Database/MySQLExample/.src/FTables.class:50 +msgid "Nullable" +msgstr "Допустим null" + +#: app/examples/Database/MySQLExample/.src/FTables.class:51 +msgid "DataType" +msgstr "Тип данных" + +#: app/examples/Database/MySQLExample/.src/FTables.class:52 +msgid "Key" +msgstr "Ключ" + +#: app/examples/Database/MySQLExample/.src/FTables.class:53 +msgid "Extra" +msgstr "Дополнительно" + +#: app/examples/Database/MySQLExample/.src/FTables.class:61 +msgid "Event" +msgstr "Событие" + +#: app/examples/Database/MySQLExample/.src/FTables.class:62 +msgid "Table" +msgstr "Таблица" + +#: app/examples/Database/MySQLExample/.src/FTables.class:63 +msgid "Timing" +msgstr "Тайминг" + +#: app/examples/Database/MySQLExample/.src/FTables.class:70 +msgid "Time Zone" +msgstr "Часовой пояс" + +#: app/examples/Database/MySQLExample/.src/FTables.class:72 +msgid "Execute At" +msgstr "Выполнить в" + +#: app/examples/Database/MySQLExample/.src/FTables.class:73 +msgid "Interval Value" +msgstr "Значение интервала" + +#: app/examples/Database/MySQLExample/.src/FTables.class:74 +msgid "Interval Field" +msgstr "Поле интервала" + +#: app/examples/Database/MySQLExample/.src/FTables.class:75 +msgid "SQL Mode" +msgstr "Режим SQL" + +#: app/examples/Database/MySQLExample/.src/FTables.class:76 +msgid "Starts" +msgstr "Начала" + +#: app/examples/Database/MySQLExample/.src/FTables.class:77 +msgid "Ends" +msgstr "Концы" + +#: app/examples/Database/MySQLExample/.src/FTables.class:78 +msgid "On Completion" +msgstr "На завершение" + +#: app/examples/Database/MySQLExample/.src/FTables.class:79 +msgid "Created" +msgstr "Создан" + +#: app/examples/Database/MySQLExample/.src/FTables.class:80 +msgid "Last Altered" +msgstr "Последний изменённый" + +#: app/examples/Database/MySQLExample/.src/FTables.class:81 +msgid "Last Executed" +msgstr "Последний выполненный" + +#: app/examples/Database/MySQLExample/.src/FTables.class:82 +msgid "Originator" +msgstr "Инициатор" + +#: app/examples/Database/MySQLExample/.src/FTables.class:85 +msgid "Database Collation" +msgstr "Упорядочение базы данных" + +#: app/examples/Database/MySQLExample/.src/FTables.class:111 app/examples/Database/MySQLExample/.src/FTables.form:119 +msgid "Indexes" +msgstr "Индексы" + +#: app/examples/Database/MySQLExample/.src/FTables.class:112 +msgid "Fields" +msgstr "Поля" + +#: app/examples/Database/MySQLExample/.src/FTables.class:145 app/examples/Database/MySQLExample/.src/FTables.form:128 +msgid "Fields on:" +msgstr "Поля вкл:" + +#: app/examples/Database/MySQLExample/.src/FTables.class:330 app/examples/Database/MySQLExample/.src/FTables.class:331 +msgid "Not available" +msgstr "Недоступен" + +#: app/examples/Database/MySQLExample/.src/FTables.class:363 +msgid "Indexes on:" +msgstr "Индексы по:" + +#: app/examples/Database/MySQLExample/.src/FTables.class:877 app/examples/Database/MySQLExample/.src/FTables.form:56 +msgid "New Table" +msgstr "Новая таблица" + +#: app/examples/Database/MySQLExample/.src/FTables.class:878 app/examples/Database/MySQLExample/.src/FTables.form:62 +msgid "Delete Table" +msgstr "Удалить таблицу" + +#: app/examples/Database/MySQLExample/.src/FTables.class:880 +msgid "New View" +msgstr "Новый просмотр" + +#: app/examples/Database/MySQLExample/.src/FTables.class:881 +msgid "Delete View" +msgstr "Удалить вид" + +#: app/examples/Database/MySQLExample/.src/FTables.class:883 +msgid "New Index" +msgstr "Новый индекс" + +#: app/examples/Database/MySQLExample/.src/FTables.class:884 +msgid "Delete Index" +msgstr "Удалить индекс" + +#: app/examples/Database/MySQLExample/.src/FTables.class:886 +msgid "New Field" +msgstr "Новое поле" + +#: app/examples/Database/MySQLExample/.src/FTables.class:887 +msgid "Delete Field" +msgstr "Удалить поле" + +#: app/examples/Database/MySQLExample/.src/FTables.class:889 +msgid "New Routine" +msgstr "Новая подпрограмма" + +#: app/examples/Database/MySQLExample/.src/FTables.class:890 +msgid "Delete Routine" +msgstr "Удалить подпрограмму" + +#: app/examples/Database/MySQLExample/.src/FTables.class:892 +msgid "New Trigger" +msgstr "Новый триггер" + +#: app/examples/Database/MySQLExample/.src/FTables.class:893 +msgid "Delete Trigger" +msgstr "Удалить триггер" + +#: app/examples/Database/MySQLExample/.src/FTables.class:895 +msgid "New Event" +msgstr "Новое событие" + +#: app/examples/Database/MySQLExample/.src/FTables.class:896 +msgid "Delete Event" +msgstr "Удалить событие" + +#: app/examples/Database/MySQLExample/.src/FTables.class:927 +msgid "Do you realy want to delete the database: &1?" +msgstr "Вы действительно хотите удалить БД: &1?" + +#: app/examples/Database/MySQLExample/.src/FTables.class:927 app/examples/Database/MySQLExample/.src/FTables.class:1019 app/examples/Database/MySQLExample/.src/FTables.class:1021 app/examples/Database/MySQLExample/.src/FTables.class:1023 app/examples/Database/MySQLExample/.src/FTables.class:1025 app/examples/Database/MySQLExample/.src/FTables.class:1027 app/examples/Database/MySQLExample/.src/FTables.class:1029 app/examples/Database/MySQLExample/.src/FTables.class:1031 +msgid "&Yes" +msgstr "Да" + +#: app/examples/Database/MySQLExample/.src/FTables.class:927 app/examples/Database/MySQLExample/.src/FTables.class:1019 app/examples/Database/MySQLExample/.src/FTables.class:1021 app/examples/Database/MySQLExample/.src/FTables.class:1023 app/examples/Database/MySQLExample/.src/FTables.class:1025 app/examples/Database/MySQLExample/.src/FTables.class:1027 app/examples/Database/MySQLExample/.src/FTables.class:1029 app/examples/Database/MySQLExample/.src/FTables.class:1031 +msgid "&No" +msgstr "Нет" + +#: app/examples/Database/MySQLExample/.src/FTables.class:1019 +msgid "Do you realy want to delete the table: &1?" +msgstr "Вы действительно хотите удалить таблицу: &1?" + +#: app/examples/Database/MySQLExample/.src/FTables.class:1021 +msgid "Do you realy want to delete the view: &1?" +msgstr "Вы действительно хотите удалить вид: &1?" + +#: app/examples/Database/MySQLExample/.src/FTables.class:1023 +msgid "Do you realy want to delete the index: &1?" +msgstr "Вы действительно хотите удалить индекс: &1?" + +#: app/examples/Database/MySQLExample/.src/FTables.class:1025 +msgid "Do you realy want to delete the field: &1?" +msgstr "Вы действительно хотите удалить поле: &1?" + +#: app/examples/Database/MySQLExample/.src/FTables.class:1027 +msgid "Do you realy want to delete the routine: &1?" +msgstr "Вы действительно хотите удалить подпрограмму: &1?" + +#: app/examples/Database/MySQLExample/.src/FTables.class:1029 +msgid "Do you realy want to delete the trigger: &1?" +msgstr "Вы действительно хотите удалить триггер: &1?" + +#: app/examples/Database/MySQLExample/.src/FTables.class:1031 +msgid "Do you realy want to delete the event: &1?" +msgstr "Вы действительно хотите удалить событие: &1?" + +#: app/examples/Database/MySQLExample/.src/FTables.class:1034 +msgid "Item deleted." +msgstr "Элемент удалён." + +#: app/examples/Database/MySQLExample/.src/FTables.form:6 app/examples/Database/MySQLExample/.src/FTables.form:102 +msgid "Tables" +msgstr "Таблицы" + +#: app/examples/Database/MySQLExample/.src/FTables.form:10 +msgid "Item" +msgstr "Элемент" + +#: app/examples/Database/MySQLExample/.src/FTables.form:14 +msgid "New Item" +msgstr "Новый элемент" + +#: app/examples/Database/MySQLExample/.src/FTables.form:20 +msgid "Edit Item" +msgstr "Редактировать элемент" + +#: app/examples/Database/MySQLExample/.src/FTables.form:26 +msgid "Delete Item" +msgstr "Удалить элемент" + +#: app/examples/Database/MySQLExample/.src/FTables.form:32 app/examples/Database/MySQLExample/.src/FTables.form:68 +msgid "Refresh" +msgstr "Освежить" + +#: app/examples/Database/MySQLExample/.src/FTables.form:46 +msgid "Lock" +msgstr "Блокировка" + +#: app/examples/Database/MySQLExample/.src/FTables.form:77 +msgid "New Database" +msgstr "Новая база данных" + +#: app/examples/Database/MySQLExample/.src/FTables.form:83 +msgid "Delete Database" +msgstr "Удалить базу данных" + +#: app/examples/Database/MySQLExample/.src/FTables.form:110 +msgid "Views" +msgstr "Виды" + +#: app/examples/Database/MySQLExample/.src/FTables.form:136 +msgid "Routines" +msgstr "Подпрограммы" + +#: app/examples/Database/MySQLExample/.src/FTables.form:145 +msgid "Triggers" +msgstr "Триггеры" + +#: app/examples/Database/MySQLExample/.src/FTables.form:154 +msgid "Events" +msgstr "События" + +#: app/examples/Database/MySQLExample/.src/modMain.module:38 +msgid "" +"Seems that your MySQL version is lower than 5.1.\n" +"therefore you will get some error and warning messages." +msgstr "" +"Кажется, что ваша версия MySQL ниже, чем 5.1.\n" +"поэтому вы получите сообщения об ошибках и предупреждения." + +#: app/examples/Database/MySQLExample/.src/CreateObjects/FNewDatabase.form:5 app/examples/Database/MySQLExample/.src/CreateObjects/FNewDatabase.form:12 +msgid "Create Database" +msgstr "Создать базу данных" + +#: app/examples/Database/MySQLExample/.src/CreateObjects/FNewDatabase.form:19 app/examples/Database/MySQLExample/.src/CreateObjects/FNewEvent.form:19 app/examples/Database/MySQLExample/.src/CreateObjects/FNewField.form:18 app/examples/Database/MySQLExample/.src/CreateObjects/FNewIndex.form:28 app/examples/Database/MySQLExample/.src/CreateObjects/FNewRoutine.form:20 app/examples/Database/MySQLExample/.src/CreateObjects/FNewTable.form:19 app/examples/Database/MySQLExample/.src/CreateObjects/FNewTrigger.form:19 app/examples/Database/MySQLExample/.src/CreateObjects/FNewView.form:19 +msgid "Name:" +msgstr "Имя:" + +#: app/examples/Database/MySQLExample/.src/CreateObjects/FNewDatabase.form:27 +msgid "Collation:" +msgstr "Упорядочение:" + +#: app/examples/Database/MySQLExample/.src/CreateObjects/FNewDatabase.form:36 app/examples/Database/MySQLExample/.src/CreateObjects/FNewTable.form:36 +msgid "Charset:" +msgstr "Кодировка:" + +#: app/examples/Database/MySQLExample/.src/CreateObjects/FNewDatabase.form:44 +msgid "&Create" +msgstr "Создать" + +#: app/examples/Database/MySQLExample/.src/CreateObjects/FNewEvent.class:19 +msgid "Edit Event" +msgstr "Редактировать событие" + +#: app/examples/Database/MySQLExample/.src/CreateObjects/FNewEvent.form:5 app/examples/Database/MySQLExample/.src/CreateObjects/FNewEvent.form:12 +msgid "Create Event" +msgstr "Создать событие" + +#: app/examples/Database/MySQLExample/.src/CreateObjects/FNewEvent.form:27 +msgid "Schedule:" +msgstr "Расписание:" + +#: app/examples/Database/MySQLExample/.src/CreateObjects/FNewEvent.form:31 app/examples/Database/MySQLExample/.src/CreateObjects/FNewRoutine.form:32 +msgid "Comma separated values: Hola1 INT,Hola2 CHAR(5)" +msgstr "Значения, разделённые запятыми: Hola1 INT,Hola2 CHAR(5)" + +#: app/examples/Database/MySQLExample/.src/CreateObjects/FNewEvent.form:35 app/examples/Database/MySQLExample/.src/CreateObjects/FNewRoutine.form:47 app/examples/Database/MySQLExample/.src/CreateObjects/FNewTrigger.form:46 app/examples/Database/MySQLExample/.src/CreateObjects/FNewView.form:26 +msgid "Show a clue" +msgstr "Показать подсказку" + +#: app/examples/Database/MySQLExample/.src/CreateObjects/FNewEvent.form:40 app/examples/Database/MySQLExample/.src/CreateObjects/FNewField.form:67 app/examples/Database/MySQLExample/.src/CreateObjects/FNewIndex.form:50 app/examples/Database/MySQLExample/.src/CreateObjects/FNewRoutine.form:52 app/examples/Database/MySQLExample/.src/CreateObjects/FNewTable.form:50 app/examples/Database/MySQLExample/.src/CreateObjects/FNewTrigger.form:51 app/examples/Database/MySQLExample/.src/CreateObjects/FNewView.form:31 +msgid "&Ok" +msgstr "ОК" + +#: app/examples/Database/MySQLExample/.src/CreateObjects/FNewField.class:22 +msgid "Edit Field" +msgstr "Редактировать поле" + +#: app/examples/Database/MySQLExample/.src/CreateObjects/FNewField.form:5 app/examples/Database/MySQLExample/.src/CreateObjects/FNewField.form:11 +msgid "Add Field" +msgstr "Добавить поле" + +#: app/examples/Database/MySQLExample/.src/CreateObjects/FNewField.form:26 +msgid "Data Type:" +msgstr "Тип данных:" + +#: app/examples/Database/MySQLExample/.src/CreateObjects/FNewField.form:34 +msgid "Accepts NULLs:" +msgstr "Принимает NULL:" + +#: app/examples/Database/MySQLExample/.src/CreateObjects/FNewField.form:39 +msgid "No" +msgstr "Нет" + +#: app/examples/Database/MySQLExample/.src/CreateObjects/FNewField.form:39 +msgid "Yes" +msgstr "Да" + +#: app/examples/Database/MySQLExample/.src/CreateObjects/FNewField.form:44 +msgid "Default:" +msgstr "По умолчанию:" + +#: app/examples/Database/MySQLExample/.src/CreateObjects/FNewField.form:52 +msgid "Extra:" +msgstr "Дополнительно:" + +#: app/examples/Database/MySQLExample/.src/CreateObjects/FNewField.form:60 +msgid "Comment:" +msgstr "Комментарий:" + +#: app/examples/Database/MySQLExample/.src/CreateObjects/FNewIndex.class:24 +msgid "Edit Index" +msgstr "Редактировать индекс" + +#: app/examples/Database/MySQLExample/.src/CreateObjects/FNewIndex.form:5 app/examples/Database/MySQLExample/.src/CreateObjects/FNewIndex.form:22 +msgid "Create Index" +msgstr "Создать индекс" + +#: app/examples/Database/MySQLExample/.src/CreateObjects/FNewIndex.form:9 app/examples/Database/MySQLExample/.src/CreateObjects/FNewIndex.form:13 +msgid "Delete" +msgstr "Удалить" + +#: app/examples/Database/MySQLExample/.src/CreateObjects/FNewIndex.form:36 +msgid "Fields:" +msgstr "Поля:" + +#: app/examples/Database/MySQLExample/.src/CreateObjects/FNewIndex.form:46 +msgid "Primary Key" +msgstr "Первичный ключ" + +#: app/examples/Database/MySQLExample/.src/CreateObjects/FNewRoutine.class:19 +msgid "Edit Routine" +msgstr "Редактировать подпрограмму" + +#: app/examples/Database/MySQLExample/.src/CreateObjects/FNewRoutine.form:6 app/examples/Database/MySQLExample/.src/CreateObjects/FNewRoutine.form:13 +msgid "Create Routine" +msgstr "Создать подпрограмму" + +#: app/examples/Database/MySQLExample/.src/CreateObjects/FNewRoutine.form:28 +msgid "Parameters:" +msgstr "Параметры:" + +#: app/examples/Database/MySQLExample/.src/CreateObjects/FNewRoutine.form:37 +msgid "Returns:" +msgstr "Возвращаемые данные:" + +#: app/examples/Database/MySQLExample/.src/CreateObjects/FNewTable.class:21 +msgid "Edit Table" +msgstr "Редактировать таблицу" + +#: app/examples/Database/MySQLExample/.src/CreateObjects/FNewTable.form:5 app/examples/Database/MySQLExample/.src/CreateObjects/FNewTable.form:12 +msgid "Create Table" +msgstr "Создать таблицу" + +#: app/examples/Database/MySQLExample/.src/CreateObjects/FNewTable.form:27 +msgid "Engine:" +msgstr "Движок:" + +#: app/examples/Database/MySQLExample/.src/CreateObjects/FNewTrigger.class:28 +msgid "Edit Trigger" +msgstr "Изменить триггер" + +#: app/examples/Database/MySQLExample/.src/CreateObjects/FNewTrigger.form:5 app/examples/Database/MySQLExample/.src/CreateObjects/FNewTrigger.form:12 +msgid "Create Trigger" +msgstr "Создать триггер" + +#: app/examples/Database/MySQLExample/.src/CreateObjects/FNewTrigger.form:27 +msgid "Time:" +msgstr "Время:" + +#: app/examples/Database/MySQLExample/.src/CreateObjects/FNewTrigger.form:37 +msgid "Event:" +msgstr "Событие:" + +#: app/examples/Database/MySQLExample/.src/CreateObjects/FNewView.class:18 +msgid "Edit View" +msgstr "Редактировать вид" + +#: app/examples/Database/MySQLExample/.src/CreateObjects/FNewView.form:5 app/examples/Database/MySQLExample/.src/CreateObjects/FNewView.form:12 +msgid "Create View" +msgstr "Создать вид" + diff --git a/app/examples/Database/MySQLExample/.project b/app/examples/Database/MySQLExample/.project new file mode 100644 index 00000000..c52728fa --- /dev/null +++ b/app/examples/Database/MySQLExample/.project @@ -0,0 +1,26 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.5.90 +Title=MySQL Example +Startup=modMain +Icon=icons/16/Admin.png +Version=3.6.2 +VersionFile=1 +Component=gb.image +Component=gb.gui +Component=gb.form +Component=gb.db +Component=gb.db.mysql +Component=gb.settings +Component=gb.form.mdi +Component=gb.mysql +Description="A simple GB.MYSQL Example" +Authors="David Villalobos Cambronero\ndavid.villalobos.c@gmail.com" +TabSize=2 +Translate=1 +Language=en +SourcePath=/media +Maintainer=David Villalobos Cambronero +Address=david_villalobos_c@yahoo.com +License=General Public License +Packager=1 +Systems=autotools diff --git a/app/examples/Database/MySQLExample/.src/CreateObjects/FNewDatabase.class b/app/examples/Database/MySQLExample/.src/CreateObjects/FNewDatabase.class new file mode 100644 index 00000000..ab7f91bf --- /dev/null +++ b/app/examples/Database/MySQLExample/.src/CreateObjects/FNewDatabase.class @@ -0,0 +1,33 @@ +' Gambas class file + +Public Sub Form_Open() + + cmbCharset.List = modMain.$Connection.MySQL.Charsets + cmbCharset.Index = cmbCharset.Find("utf8") + Me.Center() + Catch + modMain.Error() + +End + +Public Sub btnCancel_Click() + + Me.Close() + +End + +Public Sub btnCreate_Click() + + modMain.$Connection.MySQL.DataBase.Add(txtNombre.Text, cmbCharset.Text, cmbCollations.Text) + modMain.$Connection.MySQL.Use(txtNombre.Text) + Me.Close() + Catch + modMain.Error() + +End + +Public Sub cmbCharset_Click() + + cmbCollations.List = modMain.$Connection.MySQL.CharsetCollations(cmbCharset.Text) + +End diff --git a/app/examples/Database/MySQLExample/.src/CreateObjects/FNewDatabase.form b/app/examples/Database/MySQLExample/.src/CreateObjects/FNewDatabase.form new file mode 100644 index 00000000..3f1c8c49 --- /dev/null +++ b/app/examples/Database/MySQLExample/.src/CreateObjects/FNewDatabase.form @@ -0,0 +1,54 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,36,28) + Text = ("Create Database") + Icon = Picture["icons/16/Database.png"] + Resizable = False + { lblTitle Label + MoveScaled(1,1,34,5) + Font = Font["+4"] + Background = Color.LightBackground + Text = ("Create Database") + Alignment = Align.Center + Border = Border.Sunken + } + { lblName Label + MoveScaled(1,8,11,3) + Font = Font["+1"] + Text = ("Name:") + } + { txtNombre TextBox + MoveScaled(13,8,22,3) + } + { lblCollation Label + MoveScaled(1,18,11,3) + Font = Font["+1"] + Text = ("Collation:") + } + { cmbCollations ComboBox + MoveScaled(13,18,22,3) + ReadOnly = True + } + { lblCharset Label + MoveScaled(1,13,11,3) + Font = Font["+1"] + Text = ("Charset:") + } + { cmbCharset ComboBox + MoveScaled(13,13,22,3) + ReadOnly = True + } + { btnCreate Button + MoveScaled(1,23,13,4) + Text = ("&Create") + Picture = Picture["icon:/16/new"] + Default = True + } + { btnCancel Button + MoveScaled(22,23,13,4) + Text = ("&Cancel") + Picture = Picture["icon:/16/cancel"] + Cancel = True + } +} diff --git a/app/examples/Database/MySQLExample/.src/CreateObjects/FNewEvent.class b/app/examples/Database/MySQLExample/.src/CreateObjects/FNewEvent.class new file mode 100644 index 00000000..497e99c3 --- /dev/null +++ b/app/examples/Database/MySQLExample/.src/CreateObjects/FNewEvent.class @@ -0,0 +1,51 @@ +' Gambas class file + +Private $sEvent As String +Private $bEdit As Boolean = False + +Public Sub _new(Optional {Event} As String) + + If {Event} Then + $sEvent = {Event} + $bEdit = True + Endif + +End + +Public Sub Form_Open() + + If $bEdit Then + txtName.Enabled = False + Me.Text = ("Edit Event") + lblTitle.Text = Me.Text + txtName.Text = $sEvent + txtSchedule.Text = modMain.$Connection.MySQL.Event.Schedule($sEvent) + txtData.Text = modMain.$Connection.MySQL.Event.Definition($sEvent) + Else + txtData.Text = "BEGIN\n \nEND" + Endif + +End + +Public Sub btnCancel_Click() + + Me.Close() + +End + +Public Sub tbnOK_Click() + + modMain.$Connection.MySQL.Event.Add(txtName.Text, txtSchedule.Text, txtData.Text, IIf($bEdit, True, False)) + Me.Close() + Catch + modMain.Error() + +End + +Public Sub btnClue_Click() + + txtName.Text = "FooEvent" + txtSchedule.Text = "EVERY 1 DAY STARTS NOW()" + txtData.Text = "BEGIN\n SELECT `User` FROM `mysql`.`user`;\nEND" + +End diff --git a/app/examples/Database/MySQLExample/.src/CreateObjects/FNewEvent.form b/app/examples/Database/MySQLExample/.src/CreateObjects/FNewEvent.form new file mode 100644 index 00000000..434054ee --- /dev/null +++ b/app/examples/Database/MySQLExample/.src/CreateObjects/FNewEvent.form @@ -0,0 +1,53 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,73,54) + Text = ("Create Event") + Icon = Picture["icon:/16/clock"] + Resizable = False + { lblTitle Label + MoveScaled(1,1,71,5) + Font = Font["+4"] + Background = Color.LightBackground + Text = ("Create Event") + Alignment = Align.Center + Border = Border.Sunken + } + { lblName Label + MoveScaled(1,8,15,3) + Font = Font["+1"] + Text = ("Name:") + } + { txtName TextBox + MoveScaled(17,8,55,3) + } + { lblSchedule Label + MoveScaled(1,12,15,3) + Font = Font["+1"] + Text = ("Schedule:") + } + { txtSchedule TextBox + MoveScaled(17,12,55,3) + ToolTip = ("Comma separated values: Hola1 INT,Hola2 CHAR(5)") + } + { btnClue Button + MoveScaled(1,49,5,4) + ToolTip = ("Show a clue") + Picture = Picture["icon:/22/help"] + } + { tbnOK Button + MoveScaled(44,49,13,4) + Text = ("&Ok") + Picture = Picture["icon:/16/ok"] + Default = True + } + { btnCancel Button + MoveScaled(59,49,13,4) + Text = ("&Cancel") + Picture = Picture["icon:/16/cancel"] + Cancel = True + } + { txtData TextArea + MoveScaled(1,16,71,32) + } +} diff --git a/app/examples/Database/MySQLExample/.src/CreateObjects/FNewField.class b/app/examples/Database/MySQLExample/.src/CreateObjects/FNewField.class new file mode 100644 index 00000000..afa34505 --- /dev/null +++ b/app/examples/Database/MySQLExample/.src/CreateObjects/FNewField.class @@ -0,0 +1,53 @@ +' Gambas class file + +Private $sTable As String +Private $sFlied As String +Private $bEdit As Boolean = False + +Public Sub _new(Table As String, Optional Field As String) + + If Field Then + $sFlied = Field + $bEdit = True + Endif + $sTable = Table + +End + +Public Sub Form_Open() + + txtName.Text = $sFlied + If $bEdit Then + txtName.Enabled = False + Me.Text = ("Edit Field") + lblTitle.Text = Me.Text + txtDatatype.Text = modMain.$Connection.MySQL.Field.FieldEspecifications($sFlied, $sTable).Datatype() + txtComment.Text = modMain.$Connection.MySQL.Field.FieldEspecifications($sFlied, $sTable).Commnet() + txtDefault.Text = modMain.$Connection.MySQL.Field.FieldEspecifications($sFlied, $sTable).DefaultValue() + txtExtra.Text = modMain.$Connection.MySQL.Field.FieldEspecifications($sFlied, $sTable).Extra() + cmbNull.Index = CInt(modMain.$Connection.MySQL.Field.FieldEspecifications($sFlied, $sTable).IsNullable()) + Endif + +End + +Public Sub btnCancel_Click() + + Me.Close() + +End + +Public Sub tbnOK_Click() + + Dim sDefinition As String + + sDefinition = txtDatatype.Text & " " + If cmbNull.Index = 0 Then sDefinition &= "NOT NULL" + If txtDefault.Text <> "" Then sDefinition &= " DEFAULT '" & txtDefault.Text & "'" + If txtExtra.Text <> "" Then sDefinition &= " " & txtExtra.Text + If txtComment.Text <> "" Then sDefinition &= " COMMENT '" & txtComment.Text & "'" + modMain.$Connection.MySQL.Table.ModifyColumn($sTable, IIf($bEdit, "MODIFY", "ADD"), txtName.Text, sDefinition) + Me.Close() + Catch + modMain.Error() + +End diff --git a/app/examples/Database/MySQLExample/.src/CreateObjects/FNewField.form b/app/examples/Database/MySQLExample/.src/CreateObjects/FNewField.form new file mode 100644 index 00000000..d143b622 --- /dev/null +++ b/app/examples/Database/MySQLExample/.src/CreateObjects/FNewField.form @@ -0,0 +1,77 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,40,37) + Text = ("Add Field") + Icon = Picture["icons/16/Field.png"] + { lblTitle Label + MoveScaled(1,1,38,5) + Font = Font["+4"] + Background = Color.LightBackground + Text = ("Add Field") + Alignment = Align.Center + Border = Border.Sunken + } + { lblName Label + MoveScaled(1,8,11,3) + Font = Font["+1"] + Text = ("Name:") + } + { txtName TextBox + MoveScaled(13,8,26,3) + } + { lblDatatype Label + MoveScaled(1,12,15,3) + Font = Font["+1"] + Text = ("Data Type:") + } + { txtDatatype TextBox + MoveScaled(17,12,22,3) + } + { lblNull Label + MoveScaled(1,16,15,3) + Font = Font["+1"] + Text = ("Accepts NULLs:") + } + { cmbNull ComboBox + MoveScaled(17,16,8,3) + ReadOnly = True + List = [("No"), ("Yes")] + } + { lblDefault Label + MoveScaled(1,20,11,3) + Font = Font["+1"] + Text = ("Default:") + } + { txtDefault TextBox + MoveScaled(13,20,26,3) + } + { lblExtra Label + MoveScaled(1,24,11,3) + Font = Font["+1"] + Text = ("Extra:") + } + { txtExtra TextBox + MoveScaled(13,24,26,3) + } + { lblComment Label + MoveScaled(1,28,15,3) + Font = Font["+1"] + Text = ("Comment:") + } + { txtComment TextBox + MoveScaled(17,28,22,3) + } + { tbnOK Button + MoveScaled(1,32,13,4) + Text = ("&Ok") + Picture = Picture["icon:/16/ok"] + Default = True + } + { btnCancel Button + MoveScaled(26,32,13,4) + Text = ("&Cancel") + Picture = Picture["icon:/16/cancel"] + Cancel = True + } +} diff --git a/app/examples/Database/MySQLExample/.src/CreateObjects/FNewIndex.class b/app/examples/Database/MySQLExample/.src/CreateObjects/FNewIndex.class new file mode 100644 index 00000000..c5b9242b --- /dev/null +++ b/app/examples/Database/MySQLExample/.src/CreateObjects/FNewIndex.class @@ -0,0 +1,79 @@ +' Gambas class file + +Private $sTable As String +Private $sIndex As String +Private $bEdit As Boolean = False + +Public Sub _new(Table As String, Optional Index As String) + + If Index Then + $sIndex = Index + $bEdit = True + Endif + $sTable = Table + cmbFields.List = modMain.$Connection.MySQL.Table.Fields(Table) + If Index = "PRIMARY" Then chkPrimaryKey.Value = True + +End + +Public Sub Form_Open() + + Dim sField As String + + If $bEdit Then + Me.Text = ("Edit Index") + lblTitle.Text = Me.Text + If $sIndex <> "PRIMARY" Then txtName.Enabled = False + txtName.Text = $sIndex + For Each sField In modMain.$Connection.MySQL.Index.Columns($sTable, $sIndex) + lstFields.Add(sField) + Next + Endif + +End + +Public Sub btnCancel_Click() + + Me.Close() + +End + +Public Sub tbnOK_Click() + + If $bEdit Then + If chkPrimaryKey.Value Then + modMain.$Connection.MySQL.Index.Delete($sTable, "PRIMARY") + modMain.$Connection.MySQL.Index.PrimaryKey($sTable, lstFields.List) + Else + modMain.$Connection.MySQL.Index.Modify(txtName.Text, lstFields.List, $sTable) + Endif + Else + If chkPrimaryKey.Value Then + modMain.$Connection.MySQL.Index.PrimaryKey($sTable, lstFields.List) + Else + modMain.$Connection.MySQL.Index.Add(txtName.Text, lstFields.List, $sTable) + Endif + Endif + Me.Close() + Catch + modMain.Error() + +End + +Public Sub cmbFields_Click() + + lstFields.Add(cmbFields.Text) + +End + +Public Sub lstFields_Menu() + + mnuDelete.Popup() + +End + +Public Sub Action_Activate(Name As String) As Boolean + + If Name = "Delete" Then lstFields.Remove(lstFields.Index) + +End diff --git a/app/examples/Database/MySQLExample/.src/CreateObjects/FNewIndex.form b/app/examples/Database/MySQLExample/.src/CreateObjects/FNewIndex.form new file mode 100644 index 00000000..1b732e44 --- /dev/null +++ b/app/examples/Database/MySQLExample/.src/CreateObjects/FNewIndex.form @@ -0,0 +1,70 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,36,46) + Text = ("Create Index") + Icon = Picture["icons/16/Index.png"] + Resizable = False + { mnuDelete Menu + Text = ("Delete") + Visible = False + { mnuDelete2 Menu + Action = "Delete" + Text = ("Delete") + Picture = Picture["icon:/16/trash"] + Shortcut = "Del" + } + } + { lblTitle Label + MoveScaled(1,1,34,5) + Font = Font["+4"] + Background = Color.LightBackground + Text = ("Create Index") + Alignment = Align.Center + } + { lblName Label + MoveScaled(1,8,11,3) + Font = Font["+1"] + Text = ("Name:") + } + { txtName TextBox + MoveScaled(13,8,22,3) + } + { lblFields Label + MoveScaled(1,12,11,3) + Font = Font["+1"] + Text = ("Fields:") + } + { lstFields ListBox + MoveScaled(13,12,22,19) + } + { cmbFields ComboBox + MoveScaled(13,32,22,3) + } + { chkPrimaryKey CheckBox + MoveScaled(1,37,34,3) + Text = ("Primary Key") + } + { tbnOK Button + MoveScaled(1,41,13,4) + Text = ("&Ok") + Picture = Picture["icon:/16/ok"] + Default = True + } + { btnCancel Button + MoveScaled(22,41,13,4) + Text = ("&Cancel") + Picture = Picture["icon:/16/cancel"] + Cancel = True + } +} + +# Gambas Action File 3.0 + +{ Actions + { Action Delete + Text = "Delete" + Shortcut = "Del" + Picture = "icon:/16/trash" + } +} diff --git a/app/examples/Database/MySQLExample/.src/CreateObjects/FNewRoutine.class b/app/examples/Database/MySQLExample/.src/CreateObjects/FNewRoutine.class new file mode 100644 index 00000000..e0bdb26b --- /dev/null +++ b/app/examples/Database/MySQLExample/.src/CreateObjects/FNewRoutine.class @@ -0,0 +1,65 @@ +' Gambas class file + +Private $sRutine As String +Private $bEdit As Boolean = False + +Public Sub _new(Optional Rutine As String) + + If Rutine Then + $sRutine = Rutine + $bEdit = True + Endif + txtName.Text = $sRutine + +End + +Public Sub Form_Open() + + If $bEdit Then + Me.Text = ("Edit Routine") + lblTitle.Text = Me.Text + txtName.Enabled = False + txtParameters.Text = modMain.$Connection.MySQL.Routines.Parameters($sRutine) + txtReturns.Text = modMain.$Connection.MySQL.Routines.Returns($sRutine) + txtData.Text = modMain.$Connection.MySQL.Routines.Definition($sRutine) + Else + txtData.Text = "BEGIN\n \nEND" + Endif + +End + +Public Sub btnCancel_Click() + + Me.Close() + +End + +Public Sub tbnOK_Click() + + If $bEdit Then + modMain.$Connection.MySQL.Routines.Modify($sRutine, txtData.Text, Split(Trim(txtParameters.Text)), txtReturns.Text) + Else + modMain.$Connection.MySQL.Routines.Add(txtName.Text, txtData.Text, Split(Trim(txtParameters.Text)), txtReturns.Text) + Endif + Me.Close() + Catch + modMain.Error() + +End + +Public Sub btnClue_Click() + + If txtName.Text = "FooProcedure" Then + txtName.Text = "FooFunction" + txtParameters.Text = "Param1 INT,Param2 VARCHAR(200)" + txtReturns.Text = "INT" + txtData.Text = "BEGIN\n SELECT `User` FROM `mysql`.`user` WHERE `User` = `Param2`;\n" + txtData.Text &= " RETURN `Param1`\nEND" + Else + txtName.Text = "FooProcedure" + txtParameters.Text = "Param1 INT,Param2 VARCHAR(200)" + txtReturns.Text = "" + txtData.Text = "BEGIN\n SELECT `User` FROM `mysql`.`user` WHERE `User` = `Param2`;\nEND" + Endif + +End diff --git a/app/examples/Database/MySQLExample/.src/CreateObjects/FNewRoutine.form b/app/examples/Database/MySQLExample/.src/CreateObjects/FNewRoutine.form new file mode 100644 index 00000000..6db63ba7 --- /dev/null +++ b/app/examples/Database/MySQLExample/.src/CreateObjects/FNewRoutine.form @@ -0,0 +1,71 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,73,58) + Action = "Show a clue" + Text = ("Create Routine") + Icon = Picture["icons/16/Routine.png"] + Resizable = False + { lblTitle Label + MoveScaled(1,1,71,5) + Font = Font["+4"] + Background = Color.LightBackground + Text = ("Create Routine") + Alignment = Align.Center + Border = Border.Sunken + } + { lblName Label + MoveScaled(1,8,11,3) + Font = Font["+1"] + Text = ("Name:") + } + { txtName TextBox + MoveScaled(15,8,57,3) + } + { lblParameters Label + MoveScaled(1,12,13,3) + Font = Font["+1"] + Text = ("Parameters:") + } + { txtParameters TextBox + MoveScaled(15,12,57,3) + ToolTip = ("Comma separated values: Hola1 INT,Hola2 CHAR(5)") + } + { lblReturns Label + MoveScaled(1,16,10,3) + Font = Font["+1"] + Text = ("Returns:") + } + { txtReturns TextBox + MoveScaled(15,16,57,3) + } + { txtData TextArea + MoveScaled(1,20,71,32) + } + { btnClue Button + MoveScaled(1,53,5,4) + ToolTip = ("Show a clue") + Picture = Picture["icon:/22/help"] + } + { tbnOK Button + MoveScaled(44,53,13,4) + Text = ("&Ok") + Picture = Picture["icon:/16/ok"] + Default = True + } + { btnCancel Button + MoveScaled(59,53,13,4) + Text = ("&Cancel") + Picture = Picture["icon:/16/cancel"] + Cancel = True + } +} + +# Gambas Action File 3.0 + +{ Actions + { Action Show a clue + Text = "Create Routine" + Picture = "icons/16/Routine.png" + } +} diff --git a/app/examples/Database/MySQLExample/.src/CreateObjects/FNewTable.class b/app/examples/Database/MySQLExample/.src/CreateObjects/FNewTable.class new file mode 100644 index 00000000..13070aeb --- /dev/null +++ b/app/examples/Database/MySQLExample/.src/CreateObjects/FNewTable.class @@ -0,0 +1,55 @@ +' Gambas class file + +Private $sTable As String +Private $bEdit As Boolean = False + +Public Sub _new(Optional Table As String) + + If Table Then + $sTable = Table + $bEdit = True + Endif + txtName.Text = $sTable + +End + +Public Sub Form_Open() + + cmbEngine.List = modMain.$Connection.MySQL.Engines + cmbCharset.List = modMain.$Connection.MySQL.Charsets + If $bEdit Then + Me.Text = ("Edit Table") + lblTitle.Text = Me.Text + txtName.Enabled = False + cmbEngine.Index = cmbEngine.Find(modMain.$Connection.MySQL.Table.Engine($sTable)) + cmbCharset.Index = cmbCharset.Find(modMain.$Connection.MySQL.Table.Charset($sTable)) + Else + cmbEngine.Index = cmbEngine.Find("InnoDB") + cmbCharset.Index = cmbCharset.Find("utf8") + Endif + Catch + modMain.Error() + +End + +Public Sub btnCancel_Click() + + Me.Close() + +End + +Public Sub tbnOK_Click() + + If $bEdit Then + modMain.$Connection.MySQL.Table.Modify($sTable,, cmbEngine.Text, cmbCharset.Text) + Else + modMain.$Connection.MySQL.Field.Add("Field01", modMain.$Connection.MySQL.DataTypes.Serial) + modMain.$Connection.MySQL.Table.Add(txtName.Text, cmbEngine.Text, cmbCharset.Text) + Endif + modMain.$hFBrowser.LoadDatabases() + modMain.$hFTables.SearchInfo() + Me.Close() + Catch + modMain.Error() + +End diff --git a/app/examples/Database/MySQLExample/.src/CreateObjects/FNewTable.form b/app/examples/Database/MySQLExample/.src/CreateObjects/FNewTable.form new file mode 100644 index 00000000..a28aa27e --- /dev/null +++ b/app/examples/Database/MySQLExample/.src/CreateObjects/FNewTable.form @@ -0,0 +1,54 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,36,28) + Text = ("Create Table") + Icon = Picture["icons/16/Table.png"] + Resizable = False + { lblTitle Label + MoveScaled(1,1,34,5) + Font = Font["+4"] + Background = Color.LightBackground + Text = ("Create Table") + Alignment = Align.Center + Border = Border.Sunken + } + { lblName Label + MoveScaled(1,8,11,3) + Font = Font["+1"] + Text = ("Name:") + } + { txtName TextBox + MoveScaled(13,8,22,3) + } + { lblEngine Label + MoveScaled(1,13,11,3) + Font = Font["+1"] + Text = ("Engine:") + } + { cmbEngine ComboBox + MoveScaled(13,13,22,3) + ReadOnly = True + } + { lblCharset Label + MoveScaled(1,18,11,3) + Font = Font["+1"] + Text = ("Charset:") + } + { cmbCharset ComboBox + MoveScaled(13,18,22,3) + ReadOnly = True + } + { btnCancel Button + MoveScaled(22,23,13,4) + Text = ("&Cancel") + Picture = Picture["icon:/16/cancel"] + Cancel = True + } + { tbnOK Button + MoveScaled(1,23,13,4) + Text = ("&Ok") + Picture = Picture["icon:/16/ok"] + Default = True + } +} diff --git a/app/examples/Database/MySQLExample/.src/CreateObjects/FNewTrigger.class b/app/examples/Database/MySQLExample/.src/CreateObjects/FNewTrigger.class new file mode 100644 index 00000000..dc57a785 --- /dev/null +++ b/app/examples/Database/MySQLExample/.src/CreateObjects/FNewTrigger.class @@ -0,0 +1,62 @@ +' Gambas class file + +Private $sTable As String +Private $sTrigger As String +Private $bEdit As Boolean = False + +Public Sub _new(Table As String, Optional Trigger As String) + + $sTable = Table + $sTrigger = Trigger + cmbTime.Add("AFTER") + cmbTime.Add("BEFORE") + cmbEvent.Add("DELETE") + cmbEvent.Add("INSERT") + cmbEvent.Add("UPDATE") + If Trigger Then + txtName.Text = Trigger + cmbTime.Text = modMain.$Connection.MySQL.Trigger.Time($sTrigger) + cmbEvent.Text = modMain.$Connection.MySQL.Trigger.Event($sTrigger) + $bEdit = True + Endif + +End + +Public Sub Form_Open() + + If $bEdit Then + Me.Text = ("Edit Trigger") + lblTitle.Text = Me.Text + txtName.Enabled = False + Endif + If $sTrigger Then txtData.Text = modMain.$Connection.MySQL.Trigger.Info($sTrigger) + +End + +Public Sub btnCancel_Click() + + Me.Close() + +End + +Public Sub tbnOK_Click() + + If $bEdit Then + modMain.$Connection.MySQL.Trigger.Modify($sTrigger, $sTable, cmbTime.Text, cmbEvent.Text, txtData.Text) + Else + modMain.$Connection.MySQL.Trigger.Add(txtName.Text, $sTable, cmbTime.Text, cmbEvent.Text, txtData.Text) + Endif + Me.Close() + Catch + modMain.Error() + +End + +Public Sub btnClue_Click() + + txtName.Text = "FooTrigger" + cmbEvent.Index = 0 + cmbTime.Index = 0 + txtData.Text = "BEGIN\n INSERT INTO `MyTABLE` VALUES ('VALUES');\nEND)" + +End diff --git a/app/examples/Database/MySQLExample/.src/CreateObjects/FNewTrigger.form b/app/examples/Database/MySQLExample/.src/CreateObjects/FNewTrigger.form new file mode 100644 index 00000000..1b38930e --- /dev/null +++ b/app/examples/Database/MySQLExample/.src/CreateObjects/FNewTrigger.form @@ -0,0 +1,64 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,73,55) + Text = ("Create Trigger") + Icon = Picture["icons/16/Trigger.png"] + Resizable = False + { lblTitle Label + MoveScaled(1,1,71,5) + Font = Font["+4"] + Background = Color.LightBackground + Text = ("Create Trigger") + Alignment = Align.Center + Border = Border.Sunken + } + { lblName Label + MoveScaled(1,8,11,3) + Font = Font["+1"] + Text = ("Name:") + } + { txtName TextBox + MoveScaled(13,8,59,3) + } + { lblTime Label + MoveScaled(1,13,11,3) + Font = Font["+1"] + Text = ("Time:") + } + { cmbTime ComboBox + MoveScaled(13,13,15,3) + ReadOnly = True + List = [] + } + { lblEvent Label + MoveScaled(30,13,11,3) + Font = Font["+1"] + Text = ("Event:") + } + { cmbEvent ComboBox + MoveScaled(42,13,15,3) + ReadOnly = True + List = [] + } + { btnClue Button + MoveScaled(1,50,5,4) + ToolTip = ("Show a clue") + Picture = Picture["icon:/22/help"] + } + { tbnOK Button + MoveScaled(44,50,13,4) + Text = ("&Ok") + Picture = Picture["icon:/16/ok"] + Default = True + } + { btnCancel Button + MoveScaled(59,50,13,4) + Text = ("&Cancel") + Picture = Picture["icon:/16/cancel"] + Cancel = True + } + { txtData TextArea + MoveScaled(1,17,71,32) + } +} diff --git a/app/examples/Database/MySQLExample/.src/CreateObjects/FNewView.class b/app/examples/Database/MySQLExample/.src/CreateObjects/FNewView.class new file mode 100644 index 00000000..c81ca558 --- /dev/null +++ b/app/examples/Database/MySQLExample/.src/CreateObjects/FNewView.class @@ -0,0 +1,45 @@ +' Gambas class file + +Private $bEdit As Boolean = False + +Public Sub _new(Optional View As String) + + If View Then + txtName.Text = View + $bEdit = True + txtData.Text = modMain.$Connection.MySQL.View.Definition(txtName.Text) & "\n" + Endif + +End + +Public Sub Form_Open() + + If $bEdit Then + Me.Text = ("Edit View") + lblTitle.Text = Me.Text + txtName.Enabled = False + Endif + +End + +Public Sub btnCancel_Click() + + Me.Close() + +End + +Public Sub tbnOK_Click() + + modMain.$Connection.MySQL.View.Add(txtName.Text, txtData.Text, $bEdit) + Me.Close() + Catch + modMain.Error() + +End + +Public Sub btnClue_Click() + + txtName.Text = "FooView" + txtData.Text = "SELECT * FROM `mysql`.`user`" + +End diff --git a/app/examples/Database/MySQLExample/.src/CreateObjects/FNewView.form b/app/examples/Database/MySQLExample/.src/CreateObjects/FNewView.form new file mode 100644 index 00000000..38e94b7d --- /dev/null +++ b/app/examples/Database/MySQLExample/.src/CreateObjects/FNewView.form @@ -0,0 +1,44 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,73,50) + Text = ("Create View") + Icon = Picture["icons/16/View.png"] + Resizable = False + { lblTitle Label + MoveScaled(1,1,71,5) + Font = Font["+4"] + Background = Color.LightBackground + Text = ("Create View") + Alignment = Align.Center + Border = Border.Sunken + } + { lblName Label + MoveScaled(1,8,11,3) + Font = Font["+1"] + Text = ("Name:") + } + { txtName TextBox + MoveScaled(13,8,59,3) + } + { btnClue Button + MoveScaled(1,45,5,4) + ToolTip = ("Show a clue") + Picture = Picture["icon:/22/help"] + } + { tbnOK Button + MoveScaled(44,45,13,4) + Text = ("&Ok") + Picture = Picture["icon:/16/ok"] + Default = True + } + { btnCancel Button + MoveScaled(59,45,13,4) + Text = ("&Cancel") + Picture = Picture["icon:/16/cancel"] + Cancel = True + } + { txtData TextArea + MoveScaled(1,12,71,32) + } +} diff --git a/app/examples/Database/MySQLExample/.src/FConnect.class b/app/examples/Database/MySQLExample/.src/FConnect.class new file mode 100644 index 00000000..f4e5f7e9 --- /dev/null +++ b/app/examples/Database/MySQLExample/.src/FConnect.class @@ -0,0 +1,46 @@ +' Gambas class file + +Public Sub btnCancel_Click() + + Me.Close(True) + +End + +Public Sub btnConnect_Click() + + modMain.$Host = txtServer.Text + modMain.$Password = txtPassword.Text + modMain.$Port = txtPort.Text + modMain.$User = txtUser.Text + Me.Close(False) + Catch + Message.Error(Error.Text) + +End + +Public Sub btnClear_Click() + + txtPassword.Text = Null + txtPort.Text = Null + txtServer.Text = Null + txtUser.Text = Null + txtPassword.SetFocus() + +End + +Public Sub Form_Open() + + txtServer.Text = Settings["/Conecction/Host", "localhost"] + txtUser.Text = Settings["/Conecction/User", "root"] + txtPort.Text = Settings["/Conecction/Port", "3306"] + txtPassword.SetFocus() + +End + +Public Sub Form_Close() + + If txtServer.Text Then Settings["/Conecction/Host"] = txtServer.Text + If txtUser.Text Then Settings["/Conecction/User"] = txtUser.Text + If txtPort.Text Then Settings["/Conecction/Port"] = txtPort.Text + +End diff --git a/app/examples/Database/MySQLExample/.src/FConnect.form b/app/examples/Database/MySQLExample/.src/FConnect.form new file mode 100644 index 00000000..1e29323b --- /dev/null +++ b/app/examples/Database/MySQLExample/.src/FConnect.form @@ -0,0 +1,73 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,49,33) + Text = ("MySQL GUI") + Icon = Picture["icons/16/Admin.png"] + Resizable = False + { lblTitle Label + MoveScaled(1,1,47,5) + Font = Font["+4"] + Background = Color.LightBackground + Text = ("MySQL Example") + Alignment = Align.Center + Border = Border.Sunken + } + { frmMain Frame + MoveScaled(1,8,47,19) + Text = ("Connect to a MySQL Server") + { lblServer Label + MoveScaled(1,3,19,3) + Text = ("Server:") + Alignment = Align.Right + } + { txtServer TextBox Texts + Name = "txtServer" + MoveScaled(21,3,25,3) + } + { lblPort Label + MoveScaled(1,7,19,3) + Text = ("Port:") + Alignment = Align.Right + } + { txtPort TextBox Texts + Name = "txtPort" + MoveScaled(21,7,25,3) + } + { lblUser Label + MoveScaled(1,11,19,3) + Text = ("User:") + Alignment = Align.Right + } + { txtUser TextBox Texts + Name = "txtUser" + MoveScaled(21,11,25,3) + } + { lblPassword Label + MoveScaled(1,15,19,3) + Text = ("Password:") + Alignment = Align.Right + } + { txtPassword TextBox + MoveScaled(21,15,25,3) + Password = True + } + } + { btnConnect Button + MoveScaled(1,28,15,4) + Text = ("&Connect") + Picture = Picture["icon:/16/connect"] + Default = True + } + { btnClear Button + MoveScaled(17,28,15,4) + Text = ("&Clear") + Picture = Picture["icon:/16/clear"] + } + { btnCancel Button + MoveScaled(33,28,15,4) + Text = ("&Cancel") + Picture = Picture["icon:/16/cancel"] + Cancel = True + } +} diff --git a/app/examples/Database/MySQLExample/.src/FMessage.class b/app/examples/Database/MySQLExample/.src/FMessage.class new file mode 100644 index 00000000..8cdb33f7 --- /dev/null +++ b/app/examples/Database/MySQLExample/.src/FMessage.class @@ -0,0 +1,21 @@ +' Gambas class file + +Public Sub _new(Message As String) + + txaMesage.Text = Message + +End + +Public Sub Form_KeyPress() + + If Key.Code = Key.Esc Then Me.Close() + +End + +Public Sub txaMesage_KeyPress() + + If Key.Code = 81 Then '81 is q (in lowercase) + If Key.Alt Then txaMesage.Text &= "\n\n\n" & modMain.$Connection.MySQL.Query + Endif + +End diff --git a/app/examples/Database/MySQLExample/.src/FMessage.form b/app/examples/Database/MySQLExample/.src/FMessage.form new file mode 100644 index 00000000..e0a2267c --- /dev/null +++ b/app/examples/Database/MySQLExample/.src/FMessage.form @@ -0,0 +1,12 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,67,39) + Text = ("Message") + Icon = Picture["icons/16/Warning.png"] + Resizable = False + { txaMesage TextArea + MoveScaled(1,1,65,37) + Wrap = True + } +} diff --git a/app/examples/Database/MySQLExample/.src/FTables.class b/app/examples/Database/MySQLExample/.src/FTables.class new file mode 100644 index 00000000..7d4fd2d7 --- /dev/null +++ b/app/examples/Database/MySQLExample/.src/FTables.class @@ -0,0 +1,1186 @@ +' Gambas class file + +Private $sColumnSort As String + +Public Procedure _new() + + 'tvwTables definition + tvwTables.Columns.Count = 7 + tvwTables.Columns[0].Title = ("Name") + tvwTables.Columns[1].Title = ("Rows") + tvwTables.Columns[2].Title = ("Engine") + tvwTables.Columns[3].Title = ("Charset") + tvwTables.Columns[4].Title = ("Collation") + tvwTables.Columns[5].Title = ("Size") + tvwTables.Columns[6].Title = ("Update Time") + + 'tvwViews definition + tvwViews.Columns.Count = 7 + tvwViews.Columns[0].Title = ("Name") + tvwViews.Columns[1].Title = ("Updatable") + tvwViews.Columns[2].Title = ("Definer") + tvwViews.Columns[3].Title = ("Security") + tvwViews.Columns[4].Title = ("Check") + tvwViews.Columns[5].Title = ("Charset") + tvwViews.Columns[6].Title = ("Collation") + + 'tvwIndex definition + tvwIndexes.Columns.Count = 4 + tvwIndexes.Columns[0].Title = ("Name") + tvwIndexes.Columns[1].Title = ("Column") + tvwIndexes.Columns[2].Title = ("Collation") + tvwIndexes.Columns[3].Title = ("Type") + + 'tvwProcedures definition + tvwProcedures.Columns.Count = 8 + tvwProcedures.Columns[0].Width = 30 + tvwProcedures.Columns[1].Title = ("Name") + tvwProcedures.Columns[2].Title = ("Returns") + tvwProcedures.Columns[3].Title = ("Creation Time") + tvwProcedures.Columns[4].Title = ("Update Time") + tvwProcedures.Columns[5].Title = ("Type") + tvwProcedures.Columns[6].Title = ("Definer") + tvwProcedures.Columns[7].Title = ("Comment") + + 'tvwFields definition + tvwFields.Columns.Count = 10 + tvwFields.Columns[0].Width = 30 + tvwFields.Columns[1].Title = ("Name") + tvwFields.Columns[2].Title = ("Default") + tvwFields.Columns[3].Title = ("Nullable") + tvwFields.Columns[4].Title = ("DataType") + tvwFields.Columns[5].Title = ("Key") + tvwFields.Columns[6].Title = ("Extra") + tvwFields.Columns[7].Title = ("Charset") + tvwFields.Columns[8].Title = ("Collation") + tvwFields.Columns[9].Title = ("Comment") + + 'tvwTrigger definition + tvwTriggers.Columns.Count = 5 + tvwTriggers.Columns[0].Title = ("Name") + tvwTriggers.Columns[1].Title = ("Event") + tvwTriggers.Columns[2].Title = ("Table") + tvwTriggers.Columns[3].Title = ("Timing") + tvwTriggers.Columns[4].Title = ("Definer") + + 'tvwEvents definition + tvwEvents.Columns.Count = 19 + tvwEvents.Columns[0].Title = ("Name") + tvwEvents.Columns[1].Title = ("Definer") + tvwEvents.Columns[2].Title = ("Time Zone") + tvwEvents.Columns[3].Title = ("Type") + tvwEvents.Columns[4].Title = ("Execute At") + tvwEvents.Columns[5].Title = ("Interval Value") + tvwEvents.Columns[6].Title = ("Interval Field") + tvwEvents.Columns[7].Title = ("SQL Mode") + tvwEvents.Columns[8].Title = ("Starts") + tvwEvents.Columns[9].Title = ("Ends") + tvwEvents.Columns[10].Title = ("On Completion") + tvwEvents.Columns[11].Title = ("Created") + tvwEvents.Columns[12].Title = ("Last Altered") + tvwEvents.Columns[13].Title = ("Last Executed") + tvwEvents.Columns[14].Title = ("Originator") + tvwEvents.Columns[15].Title = ("Charset") + tvwEvents.Columns[16].Title = ("Collation") + tvwEvents.Columns[17].Title = ("Database Collation") + tvwEvents.Columns[18].Title = ("Comment") + + Catch + modMain.Error() + +End + +Public Procedure SearchInfo() 'Search for the info in the database + + Inc Application.Busy + tvwTables.Clear() + tvwTables.Rows.Count = 0 + tvwViews.Clear() + tvwViews.Rows.Count = 0 + tvwIndexes.Clear() + tvwIndexes.Rows.Count = 0 + tvwFields.Clear() + tvwFields.Rows.Count = 0 + tvwProcedures.Clear() + tvwProcedures.Rows.Count = 0 + tvwTriggers.Clear() + tvwTriggers.Rows.Count = 0 + tvwEvents.Clear() + tvwEvents.Rows.Count = 0 + + tabData[2].Text = ("Indexes") + tabData[3].Text = ("Fields") + 'Database's info + textResult.Text = modMain.$Connection.MySQL.DataBase.Info(modMain.$Connection.Name) + + TableInfo() + + 'Returns if the database is information_schema + If modMain.$Connection.Name = "information_schema" Then + Dec Application.Busy + Return + Endif + + ViewInfo() + + IndexInfo() + + RoutinesInfo() + + TriggersInfo() + + If modMain.$bSchemaOk Then EventInfo() + + Dec Application.Busy + Catch + modMain.Error() + +End + +Public Procedure FieldInfo(Optional Column As Integer) 'Field's Info + + Dim iCounter As Integer + + If tvwTables.Rows.Count = 0 Or tvwTables.Row = -1 Then Return 'Empty set or not table selected + tabData[3].Text = ("Fields on:") & " " & tvwTables[tvwTables.Row, 0].Text + Select (Column) + Case 1 + $sColumnSort = "COLUMN_NAME" + Case 2 + $sColumnSort = "COLUMN_DEFAULT" + Case 3 + $sColumnSort = "IS_NULLABLE" + Case 4 + $sColumnSort = "COLUMN_TYPE" + Case 5 + $sColumnSort = "COLUMN_KEY" + Case 6 + $sColumnSort = "EXTRA" + Case 7 + $sColumnSort = "CHARACTER_SET_NAME" + Case 8 + $sColumnSort = "COLLATION_NAME" + Case 9 + $sColumnSort = "COLUMN_COMMENT" + Default + $sColumnSort = "COLUMN_NAME" + End Select + modMain.$hResult = modMain.$Connection.Exec("SELECT `COLUMN_KEY`, `DATA_TYPE`, `EXTRA`, `COLUMN_NAME`, `COLUMN_DEFAULT`, `IS_NULLABLE`, `COLUMN_TYPE`, `CHARACTER_SET_NAME`, `COLLATION_NAME`, `COLUMN_COMMENT` FROM `information_schema`.`COLUMNS` WHERE `TABLE_NAME` = '" & tvwTables[tvwTables.Row, 0].Text & "' AND `TABLE_SCHEMA` = '" & modMain.$Connection.Name & "' ORDER BY `" & $sColumnSort & "`") + tvwFields.Rows.Count = modMain.$hResult.Count + For iCounter = 0 To modMain.$hResult.Max + Select (Upper(modMain.$hResult!DATA_TYPE)) + Case "INT", "MEDIUMINT", "TINYINT", "BOOL", "BOOLEAN", "SMALLINT", "INTEGER", "FLOAT", "BIGINT", "SERIAL", "DOUBLE", "DOUBLEPRECISION", "DECIMAL", "DEC" + tvwFields[iCounter, 0].Picture = Picture["icons/16/Numeric.png"] + Case "VARCHAR", "CHAR", "BIT", "BINARY", "VARBINARY", "TINYTEXT", "TEXT", "MEDIUMTEXT", "LONGTEXT", "SET", "ENUM" + tvwFields[iCounter, 0].Picture = Picture["icons/16/String.png"] + Case "DATE", "DATETIME", "TIME", "TIMESTAMP", "YEAR" + tvwFields[iCounter, 0].Picture = Picture["icons/16/Datetime.png"] + Case "TINYBLOB", "MEDIUMBLOB", "LONGBLOB", "BLOB" + tvwFields[iCounter, 0].Picture = Picture["icons/16/Blob.png"] + Default + tvwFields[iCounter, 0].Picture = Picture["icons/16/Field.png"] + End Select + Select (Upper(modMain.$hResult!COLUMN_KEY)) + Case "PRI" + tvwFields[iCounter, 0].Picture = Picture["icons/16/Primarykey.png"] + Case "MUL" + tvwFields[iCounter, 0].Picture = Picture["icons/16/Column_FK.png"] + Default + End Select + tvwFields[iCounter, 0].Alignment = Align.Center + tvwFields[iCounter, 1].Text = modMain.$hResult!COLUMN_NAME + tvwFields[iCounter, 2].Text = modMain.$hResult!COLUMN_DEFAULT + tvwFields[iCounter, 3].Text = modMain.$hResult!IS_NULLABLE + tvwFields[iCounter, 4].Text = modMain.$hResult!COLUMN_TYPE + tvwFields[iCounter, 5].Text = modMain.$hResult!COLUMN_KEY + tvwFields[iCounter, 6].Text = modMain.$hResult!EXTRA + tvwFields[iCounter, 7].Text = modMain.$hResult!CHARACTER_SET_NAME + tvwFields[iCounter, 8].Text = modMain.$hResult!COLLATION_NAME + tvwFields[iCounter, 9].Text = modMain.$hResult!COLUMN_COMMENT + If (iCounter Mod 2) = 0 Then + tvwFields[iCounter, 0].Background = Color.RGB(239, 243, 247) + tvwFields[iCounter, 1].Background = Color.RGB(239, 243, 247) + tvwFields[iCounter, 2].Background = Color.RGB(239, 243, 247) + tvwFields[iCounter, 3].Background = Color.RGB(239, 243, 247) + tvwFields[iCounter, 4].Background = Color.RGB(239, 243, 247) + tvwFields[iCounter, 5].Background = Color.RGB(239, 243, 247) + tvwFields[iCounter, 6].Background = Color.RGB(239, 243, 247) + tvwFields[iCounter, 7].Background = Color.RGB(239, 243, 247) + tvwFields[iCounter, 8].Background = Color.RGB(239, 243, 247) + tvwFields[iCounter, 9].Background = Color.RGB(239, 243, 247) + Endif + modMain.$hResult.MoveNext() + Next + tvwFields.Columns[0].Width = -1 + tvwFields.Columns[1].Width = -1 + tvwFields.Columns[2].Width = -1 + tvwFields.Columns[3].Width = -1 + tvwFields.Columns[4].Width = -1 + tvwFields.Columns[5].Width = -1 + tvwFields.Columns[6].Width = -1 + tvwFields.Columns[7].Width = -1 + tvwFields.Columns[8].Width = -1 + tvwFields.Columns[9].Width = -1 + + Catch + modMain.Error() + +End + +Public Procedure TableInfo(Optional Column As Integer) 'Table's Info + + Dim iCounter As Integer + + tvwTables.Clear() + Select (Column) + Case 0 + $sColumnSort = "TABLE_NAME" + Case 1 + $sColumnSort = "TABLE_ROWS" + Case 2 + $sColumnSort = "ENGINE" + Case 3 + $sColumnSort = "CHARSET" + Case 4 + $sColumnSort = "TABLE_COLLATION" + Case 5 + $sColumnSort = "DATA_LENGTH" + Case 6 + $sColumnSort = "UPDATE_TIME" + Default + $sColumnSort = "TABLE_NAME" + End Select + + modMain.$hResult = modMain.$Connection.Exec("SELECT `a`.`TABLE_NAME` AS `TABLE_NAME`, `a`.`ENGINE` AS ENGINE, `a`.`TABLE_ROWS` AS TABLE_ROWS, `a`.`UPDATE_TIME` AS UPDATE_TIME, `b`.`CHARACTER_SET_NAME` AS CHARSET, `a`.`TABLE_COLLATION` AS TABLE_COLLATION FROM `information_schema`.`TABLES` `a`, `information_schema`.`COLLATIONS` `b` WHERE `a`.`TABLE_SCHEMA` = '" & modMain.$Connection.Name & "' AND `a`.`TABLE_COLLATION` = `b`.`COLLATION_NAME` ORDER BY `" & $sColumnSort & "`") + tvwTables.Rows.Count = modMain.$hResult.Count + For iCounter = 0 To modMain.$hResult.Max + tvwTables[iCounter, 0].Text = modMain.$hResult!TABLE_NAME + If modMain.$hResult!TABLE_ROWS <> Null Then tvwTables[iCounter, 1].Text = Format(modMain.$hResult!TABLE_ROWS, "#,#") + tvwTables[iCounter, 1].Alignment = Align.Right + tvwTables[iCounter, 2].Text = modMain.$hResult!ENGINE + tvwTables[iCounter, 3].Text = modMain.$hResult!CHARSET + tvwTables[iCounter, 4].Text = modMain.$hResult!TABLE_COLLATION + If modMain.$hResult!UPDATE_TIME = Null + tvwTables[iCounter, 6].Picture = Picture["icons/24/Null.png"] + Else + tvwTables[iCounter, 6].Text = modMain.$hResult!UPDATE_TIME + Endif + tvwTables[iCounter, 5].Text = Format((modMain.$Connection.Exec("SELECT `DATA_LENGTH` FROM `information_schema`.`TABLES` WHERE `TABLE_SCHEMA` = '" & modMain.$Connection.Name & "' AND `TABLE_NAME` = '" & modMain.$hResult!TABLE_NAME & "'")!DATA_LENGTH / 1024), "#,#.00 KB") + tvwTables[iCounter, 5].Alignment = Align.Right + If (iCounter Mod 2) = 0 Then + tvwTables[iCounter, 0].Background = Color.RGB(239, 243, 247) + tvwTables[iCounter, 1].Background = Color.RGB(239, 243, 247) + tvwTables[iCounter, 2].Background = Color.RGB(239, 243, 247) + tvwTables[iCounter, 3].Background = Color.RGB(239, 243, 247) + tvwTables[iCounter, 4].Background = Color.RGB(239, 243, 247) + tvwTables[iCounter, 5].Background = Color.RGB(239, 243, 247) + tvwTables[iCounter, 6].Background = Color.RGB(239, 243, 247) + Endif + modMain.$hResult.MoveNext() + Next + tvwTables.Columns[0].Width = -1 + tvwTables.Columns[1].Width = -1 + tvwTables.Columns[2].Width = -1 + tvwTables.Columns[3].Width = -1 + tvwTables.Columns[4].Width = -1 + tvwTables.Columns[5].Width = -1 + tvwTables.Columns[6].Width = -1 + + Catch + modMain.Error() + +End + +Public Procedure ViewInfo(Optional Column As Integer) 'View's Info + + Dim iCounter As Integer + + Select (Column) + Case 0 + $sColumnSort = "TABLE_NAME" + Case 1 + $sColumnSort = "IS_UPDATABLE" + Case 2 + $sColumnSort = "DEFINER" + Case 3 + $sColumnSort = "SECURITY_TYPE" + Case 4 + $sColumnSort = "CHECK_OPTION" + Case 5 + $sColumnSort = "CHARACTER_SET_CLIENT" + Case 6 + $sColumnSort = "COLLATION_CONNECTION" + Default + $sColumnSort = "TABLE_NAME" + End Select + modMain.$hResult = modMain.$Connection.Exec("SELECT * FROM `information_schema`.`VIEWS` WHERE `TABLE_SCHEMA` = '" & modMain.$Connection.Name & "' ORDER BY `" & $sColumnSort & "`") + tvwViews.Rows.Count = modMain.$hResult.Count + If modMain.$hResult.Available Then + tvwViews.Rows.Count = modMain.$hResult.Count + For iCounter = 0 To modMain.$hResult.Max + tvwViews[iCounter, 0].Text = modMain.$hResult!TABLE_NAME + tvwViews[iCounter, 1].Text = modMain.$hResult!IS_UPDATABLE + tvwViews[iCounter, 2].Text = modMain.$hResult!DEFINER + tvwViews[iCounter, 3].Text = modMain.$hResult!SECURITY_TYPE + tvwViews[iCounter, 4].Text = modMain.$hResult!CHECK_OPTION + If modMain.$bSchemaOk Then + tvwViews[iCounter, 5].Text = modMain.$hResult!CHARACTER_SET_CLIENT + tvwViews[iCounter, 6].Text = modMain.$hResult!COLLATION_CONNECTION + Else + tvwViews[iCounter, 5].Text = ("Not available") + tvwViews[iCounter, 6].Text = ("Not available") + Endif + If (iCounter Mod 2) = 0 Then + tvwViews[iCounter, 0].Background = Color.RGB(239, 243, 247) + tvwViews[iCounter, 1].Background = Color.RGB(239, 243, 247) + tvwViews[iCounter, 2].Background = Color.RGB(239, 243, 247) + tvwViews[iCounter, 3].Background = Color.RGB(239, 243, 247) + tvwViews[iCounter, 4].Background = Color.RGB(239, 243, 247) + tvwViews[iCounter, 5].Background = Color.RGB(239, 243, 247) + tvwViews[iCounter, 6].Background = Color.RGB(239, 243, 247) + Endif + modMain.$hResult.MoveNext() + Next + Endif + tvwViews.Columns[0].Width = -1 + tvwViews.Columns[1].Width = -1 + tvwViews.Columns[2].Width = -1 + tvwViews.Columns[3].Width = -1 + tvwViews.Columns[4].Width = -1 + tvwViews.Columns[5].Width = -1 + tvwViews.Columns[6].Width = -1 + + Catch + modMain.Error() + +End + +Public Procedure IndexInfo(Optional Column As Integer) 'Index's Info + + Dim iCounter As Integer + + If tvwTables.Rows.Count = 0 Or tvwTables.Row = -1 Then Return 'Empty set or not table selected + tabData[2].Text = ("Indexes on:") & " " & tvwTables[tvwTables.Row, 0].Text + tvwIndexes.Clear() + ' Select (Column) + ' Case 0 + ' $sColumnSort = "Key_name" + ' Case 1 + ' $sColumnSort = "Column_name" + ' Case 2 + ' $sColumnSort = "Collation" + ' Case 3 + ' $sColumnSort = "Index_type" + ' Default + ' $sColumnSort = "Key_name" + ' End Select + + modMain.$hResult = modMain.$Connection.Exec("SHOW INDEX FROM `" & modMain.$Connection.Name & "`.`" & tvwTables[tvwTables.Row, 0].Text & "`") + If modMain.$hResult.Available Then + tvwIndexes.Rows.Count = modMain.$hResult.Count + For iCounter = 0 To modMain.$hResult.Max + tvwIndexes[iCounter, 0].Text = modMain.$hResult!Key_name + tvwIndexes[iCounter, 1].Text = modMain.$hResult!Column_name + tvwIndexes[iCounter, 2].Text = modMain.$hResult!Collation + tvwIndexes[iCounter, 3].Text = modMain.$hResult!Index_type + If (iCounter Mod 2) = 0 Then + tvwIndexes[iCounter, 0].Background = Color.RGB(239, 243, 247) + tvwIndexes[iCounter, 1].Background = Color.RGB(239, 243, 247) + tvwIndexes[iCounter, 2].Background = Color.RGB(239, 243, 247) + tvwIndexes[iCounter, 3].Background = Color.RGB(239, 243, 247) + Endif + modMain.$hResult.MoveNext() + Next + Endif + tvwIndexes.Columns[0].Width = -1 + tvwIndexes.Columns[1].Width = -1 + tvwIndexes.Columns[2].Width = -1 + tvwIndexes.Columns[3].Width = -1 + + Catch + modMain.Error() + +End + +Public Procedure RoutinesInfo(Optional Column As Integer) 'Rotines's Info + + Dim iCounter As Integer + + tvwProcedures.Clear() + Select (Column) + Case 0 + $sColumnSort = "ROUTINE_TYPE" + Case 1 + $sColumnSort = "ROUTINE_NAME" + Case 2 + $sColumnSort = "DTD_IDENTIFIER" + Case 3 + $sColumnSort = "CREATED" + Case 4 + $sColumnSort = "LAST_ALTERED" + Case 5 + $sColumnSort = "ROUTINE_TYPE" + Case 6 + $sColumnSort = "DEFINER" + Case 7 + $sColumnSort = "ROUTINE_COMMENT" + Default + $sColumnSort = "ROUTINE_NAME" + End Select + + modMain.$hResult = modMain.$Connection.Exec("SELECT * FROM `information_schema`.`ROUTINES` WHERE `ROUTINE_SCHEMA` = '" & modMain.$Connection.Name & "' ORDER BY `" & $sColumnSort & "`") + If modMain.$hResult.Available Then + tvwProcedures.Rows.Count = modMain.$hResult.Count + For iCounter = 0 To modMain.$hResult.Max + If modMain.$hResult!ROUTINE_TYPE = "FUNCTION" Then + tvwProcedures[iCounter, 0].Picture = Picture["icons/16/Function.png"] + Else + tvwProcedures[iCounter, 0].Picture = Picture["icons/16/Routine.png"] + Endif + tvwProcedures[iCounter, 0].Alignment = Align.Center + tvwProcedures[iCounter, 1].Text = modMain.$hResult!ROUTINE_NAME + tvwProcedures[iCounter, 2].Text = modMain.$hResult!DTD_IDENTIFIER + tvwProcedures[iCounter, 3].Text = modMain.$hResult!CREATED + tvwProcedures[iCounter, 4].Text = modMain.$hResult!LAST_ALTERED + tvwProcedures[iCounter, 5].Text = modMain.$hResult!ROUTINE_TYPE + tvwProcedures[iCounter, 6].Text = modMain.$hResult!DEFINER + tvwProcedures[iCounter, 7].Text = modMain.$hResult!ROUTINE_COMMENT + If (iCounter Mod 2) = 0 Then + tvwProcedures[iCounter, 0].Background = Color.RGB(239, 243, 247) + tvwProcedures[iCounter, 1].Background = Color.RGB(239, 243, 247) + tvwProcedures[iCounter, 2].Background = Color.RGB(239, 243, 247) + tvwProcedures[iCounter, 3].Background = Color.RGB(239, 243, 247) + tvwProcedures[iCounter, 4].Background = Color.RGB(239, 243, 247) + tvwProcedures[iCounter, 5].Background = Color.RGB(239, 243, 247) + tvwProcedures[iCounter, 6].Background = Color.RGB(239, 243, 247) + tvwProcedures[iCounter, 7].Background = Color.RGB(239, 243, 247) + Endif + modMain.$hResult.MoveNext() + Next + Endif + tvwProcedures.Columns[0].Width = -1 + tvwProcedures.Columns[1].Width = -1 + tvwProcedures.Columns[2].Width = -1 + tvwProcedures.Columns[3].Width = -1 + tvwProcedures.Columns[4].Width = -1 + tvwProcedures.Columns[5].Width = -1 + tvwProcedures.Columns[6].Width = -1 + tvwProcedures.Columns[7].Width = -1 + + Catch + modMain.Error() + +End + +Public Procedure EventInfo(Optional Column As Integer) 'Event's Info + + Dim iCounter As Integer + + tvwEvents.Clear() + Select (Column) + Case 0 + $sColumnSort = "EVENT_NAME" + Case 1 + $sColumnSort = "DEFINER" + Case 2 + $sColumnSort = "TIME_ZONE" + Case 3 + $sColumnSort = "EVENT_TYPE" + Case 4 + $sColumnSort = "EXECUTE_AT" + Case 5 + $sColumnSort = "INTERVAL_VALUE" + Case 6 + $sColumnSort = "INTERVAL_FIELD" + Case 7 + $sColumnSort = "SQL_MODE" + Case 8 + $sColumnSort = "STARTS" + Case 9 + $sColumnSort = "ENDS" + Case 10 + $sColumnSort = "ON_COMPLETION" + Case 11 + $sColumnSort = "CREATED" + Case 12 + $sColumnSort = "LAST_ALTERED" + Case 13 + $sColumnSort = "LAST_EXECUTED" + Case 14 + $sColumnSort = "ORIGINATOR" + Case 15 + $sColumnSort = "CHARACTER_SET_CLIENT" + Case 16 + $sColumnSort = "COLLATION_CONNECTION" + Case 17 + $sColumnSort = "DATABASE_COLLATION" + Case 18 + $sColumnSort = "EVENT_COMMENT" + Default + $sColumnSort = "EVENT_NAME" + End Select + + modMain.$hResult = modMain.$Connection.Exec("SELECT * FROM `information_schema`.`EVENTS` WHERE `EVENT_SCHEMA` = '" & modMain.$Connection.Name & "' ORDER BY `" & $sColumnSort & "`") + If modMain.$hResult.Available Then + tvwEvents.Rows.Count = modMain.$hResult.Count + For iCounter = 0 To modMain.$hResult.Max + tvwEvents[iCounter, 0].Text = modMain.$hResult!EVENT_NAME + tvwEvents[iCounter, 1].Text = modMain.$hResult!DEFINER + tvwEvents[iCounter, 2].Text = modMain.$hResult!TIME_ZONE + tvwEvents[iCounter, 3].Text = modMain.$hResult!EVENT_TYPE + tvwEvents[iCounter, 4].Text = modMain.$hResult!EXECUTE_AT + tvwEvents[iCounter, 5].Text = modMain.$hResult!INTERVAL_VALUE + tvwEvents[iCounter, 6].Text = modMain.$hResult!INTERVAL_FIELD + tvwEvents[iCounter, 7].Text = modMain.$hResult!SQL_MODE + tvwEvents[iCounter, 8].Text = modMain.$hResult!STARTS + tvwEvents[iCounter, 9].Text = modMain.$hResult!ENDS + tvwEvents[iCounter, 10].Text = modMain.$hResult!ON_COMPLETION + tvwEvents[iCounter, 11].Text = modMain.$hResult!CREATED + tvwEvents[iCounter, 12].Text = modMain.$hResult!LAST_ALTERED + tvwEvents[iCounter, 13].Text = modMain.$hResult!LAST_EXECUTED + tvwEvents[iCounter, 14].Text = modMain.$hResult!ORIGINATOR + tvwEvents[iCounter, 15].Text = modMain.$hResult!CHARACTER_SET_CLIENT + tvwEvents[iCounter, 16].Text = modMain.$hResult!COLLATION_CONNECTION + tvwEvents[iCounter, 17].Text = modMain.$hResult!DATABASE_COLLATION + tvwEvents[iCounter, 18].Text = modMain.$hResult!EVENT_COMMENT + If (iCounter Mod 2) = 0 Then + tvwEvents[iCounter, 0].Background = Color.RGB(239, 243, 247) + tvwEvents[iCounter, 1].Background = Color.RGB(239, 243, 247) + tvwEvents[iCounter, 2].Background = Color.RGB(239, 243, 247) + tvwEvents[iCounter, 3].Background = Color.RGB(239, 243, 247) + tvwEvents[iCounter, 4].Background = Color.RGB(239, 243, 247) + tvwEvents[iCounter, 5].Background = Color.RGB(239, 243, 247) + tvwEvents[iCounter, 6].Background = Color.RGB(239, 243, 247) + tvwEvents[iCounter, 7].Background = Color.RGB(239, 243, 247) + tvwEvents[iCounter, 8].Background = Color.RGB(239, 243, 247) + tvwEvents[iCounter, 9].Background = Color.RGB(239, 243, 247) + tvwEvents[iCounter, 10].Background = Color.RGB(239, 243, 247) + tvwEvents[iCounter, 11].Background = Color.RGB(239, 243, 247) + tvwEvents[iCounter, 12].Background = Color.RGB(239, 243, 247) + tvwEvents[iCounter, 13].Background = Color.RGB(239, 243, 247) + tvwEvents[iCounter, 14].Background = Color.RGB(239, 243, 247) + tvwEvents[iCounter, 15].Background = Color.RGB(239, 243, 247) + tvwEvents[iCounter, 16].Background = Color.RGB(239, 243, 247) + tvwEvents[iCounter, 17].Background = Color.RGB(239, 243, 247) + tvwEvents[iCounter, 18].Background = Color.RGB(239, 243, 247) + Endif + modMain.$hResult.MoveNext() + Next + Endif + tvwEvents.Columns[0].Width = -1 + tvwEvents.Columns[1].Width = -1 + tvwEvents.Columns[2].Width = -1 + tvwEvents.Columns[3].Width = -1 + tvwEvents.Columns[4].Width = -1 + tvwEvents.Columns[5].Width = -1 + tvwEvents.Columns[6].Width = -1 + tvwEvents.Columns[7].Width = -1 + tvwEvents.Columns[8].Width = -1 + tvwEvents.Columns[9].Width = -1 + tvwEvents.Columns[10].Width = -1 + tvwEvents.Columns[11].Width = -1 + tvwEvents.Columns[12].Width = -1 + tvwEvents.Columns[13].Width = -1 + tvwEvents.Columns[14].Width = -1 + tvwEvents.Columns[15].Width = -1 + tvwEvents.Columns[16].Width = -1 + tvwEvents.Columns[17].Width = -1 + tvwEvents.Columns[18].Width = -1 + + Catch + modMain.Error() + +End + +Public Procedure TriggersInfo(Optional Column As Integer) 'Table's Info + + Dim iCounter As Integer + + tvwTriggers.Clear() + Select (Column) + Case 0 + $sColumnSort = "TRIGGER_NAME" + Case 1 + $sColumnSort = "EVENT_MANIPULATION" + Case 2 + $sColumnSort = "EVENT_OBJECT_TABLE" + Case 3 + $sColumnSort = "ACTION_TIMING" + Case 4 + $sColumnSort = "DEFINER" + Default + $sColumnSort = "TRIGGER_NAME" + End Select + + 'Triggers Info + modMain.$hResult = modMain.$Connection.Exec("SELECT `TRIGGER_NAME`, `EVENT_MANIPULATION`, `EVENT_OBJECT_TABLE`, `ACTION_TIMING`, `DEFINER` FROM `information_schema`.`TRIGGERS` WHERE `TRIGGER_SCHEMA` = '" & modMain.$Connection.Name & "' ORDER BY `" & $sColumnSort & "`") + If modMain.$hResult.Available Then + tvwTriggers.Rows.Count = modMain.$hResult.Count + For iCounter = 0 To modMain.$hResult.Max + tvwTriggers[iCounter, 0].Text = modMain.$hResult!TRIGGER_NAME + tvwTriggers[iCounter, 1].Text = modMain.$hResult!EVENT_MANIPULATION + tvwTriggers[iCounter, 2].Text = modMain.$hResult!EVENT_OBJECT_TABLE + tvwTriggers[iCounter, 3].Text = modMain.$hResult!ACTION_TIMING + tvwTriggers[iCounter, 4].Text = modMain.$hResult!DEFINER + If (iCounter Mod 2) = 0 Then + tvwTriggers[iCounter, 0].Background = Color.RGB(239, 243, 247) + tvwTriggers[iCounter, 1].Background = Color.RGB(239, 243, 247) + tvwTriggers[iCounter, 2].Background = Color.RGB(239, 243, 247) + tvwTriggers[iCounter, 3].Background = Color.RGB(239, 243, 247) + tvwTriggers[iCounter, 4].Background = Color.RGB(239, 243, 247) + Endif + modMain.$hResult.MoveNext() + Next + Endif + tvwTriggers.Columns[0].Width = -1 + tvwTriggers.Columns[1].Width = -1 + tvwTriggers.Columns[2].Width = -1 + tvwTriggers.Columns[3].Width = -1 + tvwTriggers.Columns[4].Width = -1 + + Catch + modMain.Error() + +End + +Public Sub Form_Open() + + Me.Text = "mysql://" & modMain.$Connection.User & "@" & modMain.$Connection.Host & "/" & modMain.$Connection.Name + cmbDatabases.List = modMain.$Connection.MySQL.Databases + cmbDatabases.Index = cmbDatabases.Find(modMain.$Connection.Name) + SearchInfo() + +End + +'***************************** Procedures for tables ************************** +Public Sub tvwTables_Select() + + If tvwTables.Row = -1 Then Return + textResult.Clear() + textResult.Text = modMain.$Connection.MySQL.Table.Info(tvwTables[tvwTables.Row, 0].Text) + FieldInfo() + IndexInfo() + Select (tvwTables.Column) + Case 0 + tvwTables.Edit() + Case 1, 5 + Return + Case 2 + tvwTables.Edit(modMain.$Connection.MySQL.Engines, True) + Case 3 + tvwTables.Edit(modMain.$Connection.MySQL.Charsets, True) + Case 4 + tvwTables.Edit(modMain.$Connection.MySQL.Collations, True) + Default + tvwTables.Edit() + End Select + Catch + modMain.Error() + +End + +Public Sub tvwTables_Save(Row As Integer, Column As Integer, Value As String) + + 'Alters the table definition, the value is never saved into the TableView, it is used to make the update + If tbtLock.Value Then Return + Select (Column) + Case 0 + modMain.$Connection.MySQL.Table.Rename(tvwTables[Row, 0].Text, Value) + Case 1, 5 + Return + Case 2 + modMain.$Connection.MySQL.Table.ModifyColumn(tvwTables[Row, 0].Text, "ENGINE",, Value) + Case 3 + modMain.$Connection.MySQL.Table.ModifyColumn(tvwTables[Row, 0].Text, "CHARACTER SET",, Value & " COLLATE " & Value & "_bin") + Case 4 + modMain.$Connection.MySQL.Table.ModifyColumn(tvwTables[Row, 0].Text, "CHARACTER SET",, tvwTables[Row, 3].Text & " COLLATE " & Value) + Default + End Select + RefreshData(tvwTables.Row, tabData.Index) + Catch + modMain.Error() + +End + +Public Sub tvwTables_DblClick() + + tabData.Index = 3 'Fields + +End +'***************************** End of Procedures for tables ******************* + +'***************************** Procedures for views *************************** +Public Sub tvwViews_Click() + + If tvwViews.Row = -1 Then Return + textResult.Text = modMain.$Connection.MySQL.View.Info(tvwViews[tvwViews.Row, 0].Text) + ViewInfo() + Catch + modMain.Error() + +End + +Public Sub tvwViews_DblClick() + + modMain.$hFNewView = New FNewView(Null, tvwViews[tvwViews.Row, 0].Text) + modMain.$hFNewView.ShowModal() + Catch + modMain.Error() + +End + +Public Sub tvwViews_Select() + + tvwViews_Click() + +End +'***************************** End of Procedures for views ******************** + +'***************************** Procedures for fields ********************* +Public Sub tvwFields_Click() + + 'If the tbtLock is true then the change is not made + If tbtLock.Value Then Return + Select (tvwFields.Column) + Case 0, 5, 6 + Return + Case 1, 2, 9 + tvwFields.Edit() + Case 3 + tvwFields.Edit(["YES", "NO"], True) + Case 7 + tvwFields.Edit(modMain.$Connection.MySQL.Charsets, True) + Case 8 + tvwFields.Edit(modMain.$Connection.MySQL.Collations, True) + Default + tvwFields.Edit() + End Select + Catch + modMain.Error() + +End + +Public Sub tvwFields_DblClick() + + 'If the tbtLock is true then the change is not made + If tbtLock.Value Then Return + If ValidateTableSelected() Then + modMain.$hFNewField = New FNewField(tvwTables[tvwTables.Row, 0].Text, Null, tvwFields[tvwFields.Row, 1].Text) + modMain.$hFNewField.ShowModal() + Endif + FieldInfo() + Catch + modMain.Error() + +End + +Public Sub tvwFields_Save(Row As Integer, Column As Integer, Value As String) + + Dim sDefinition As String + + Select (Column) + Case 0, 5, 6, 7, 8 + Return + Case 1 'Field name + modMain.$Connection.MySQL.Field.Rename(tvwTables[tvwTables.Row, 0].Text, tvwFields[Row, Column].Text, Value) + Case 2 'Default + If Value = "" Then + modMain.$Connection.MySQL.Table.ModifyColumn(tvwTables[tvwTables.Row, 0].Text, "ALTER", tvwFields[Row, 1].Text, "DROP DEFAULT") + Else + modMain.$Connection.MySQL.Table.ModifyColumn(tvwTables[tvwTables.Row, 0].Text, "ALTER", tvwFields[Row, 1].Text, "SET DEFAULT '" & Value & "'") + Endif + Case 3 'Nullable + sDefinition = tvwFields[Row, 4].Text + If Value = "NO" Then sDefinition &= " NOT NULL" + If tvwFields[Row, 2].Text <> "" Then sDefinition &= " DEFAULT '" & tvwFields[Row, 2].Text & "'" + If tvwFields[Row, 9].Text <> "" Then sDefinition &= " COMMENT '" & tvwFields[Row, 2].Text & "'" + modMain.$Connection.MySQL.Table.ModifyColumn(tvwTables[tvwTables.Row, 0].Text, "MODIFY", tvwFields[Row, 1].Text, sDefinition) + Case 4 'Datatype + sDefinition = Value + If tvwFields[Row, 3].Text = "NO" Then sDefinition &= " NOT NULL" + If tvwFields[Row, 2].Text <> "" Then sDefinition &= " DEFAULT '" & tvwFields[Row, 2].Text & "'" + If tvwFields[Row, 9].Text <> "" Then sDefinition &= " COMMENT '" & tvwFields[Row, 2].Text & "'" + modMain.$Connection.MySQL.Table.ModifyColumn(tvwTables[tvwTables.Row, 0].Text, "MODIFY", tvwFields[Row, 1].Text, sDefinition) + Case 9 'Comment + sDefinition = tvwFields[Row, 4].Text + If tvwFields[Row, 3].Text = "NO" Then sDefinition &= " NOT NULL" + If tvwFields[Row, 2].Text <> "" Then sDefinition &= " DEFAULT '" & tvwFields[Row, 2].Text & "'" + If Value <> "" Then sDefinition &= " COMMENT '" & Value & "'" + modMain.$Connection.MySQL.Table.ModifyColumn(tvwTables[tvwTables.Row, 0].Text, "MODIFY", tvwFields[Row, 1].Text, sDefinition) + Default + End Select + RefreshData(tvwTables.Row, tabData.Index) + Catch + modMain.Error() + +End +'***************************** End of Procedures for fields ******************** + +'***************************** Procedures for procedures *********************** +Public Sub tvwProcedures_Click() + + If tvwProcedures.Row = -1 Then Return + textResult.Text = modMain.$Connection.MySQL.Routines.Info(tvwProcedures[tvwProcedures.Row, 1].Text, modMain.$Connection.Name) + Catch + modMain.Error() + +End + +Public Sub tvwProcedures_DblClick() + + modMain.$hFNewRoutine = New FNewRoutine(Null, tvwProcedures[tvwProcedures.Row, 1].Text) + modMain.$hFNewRoutine.ShowModal() + RoutinesInfo() + Catch + modMain.Error() + +End + +Public Sub tvwProcedures_Select() + + tvwProcedures_Click() + +End +'***************************** End of Procedures for procedures **************** + +'***************************** Procedures for triggers ************************* +Public Sub tvwTriggers_Click() + + If tvwTriggers.Row = -1 Then Return + textResult.Text = modMain.$Connection.MySQL.Trigger.Info(tvwTriggers[tvwTriggers.Row, 0].Text, modMain.$Connection.Name) + Catch + modMain.Error() + +End + +Public Sub tvwTriggers_DblClick() + + modMain.$hFNewTrigger = New FNewTrigger(tvwTables[tvwTables.Row, 0].Text, Null, tvwTriggers[tvwTriggers.Row, 0].Text) + modMain.$hFNewTrigger.ShowModal() + TriggersInfo() + Catch + modMain.Error() + +End + +Public Sub tvwTriggers_Select() + + tvwTriggers_Click() + +End +'***************************** End of Procedures for triggers ****************** + +Public Sub tabData_Click() + + Select (tabData.Index) + Case 0 'Tables + tbtNew.ToolTip = ("New Table") + tbtDelete.ToolTip = ("Delete Table") + Case 1 'Views + tbtNew.ToolTip = ("New View") + tbtDelete.ToolTip = ("Delete View") + Case 2 'Indexes + tbtNew.ToolTip = ("New Index") + tbtDelete.ToolTip = ("Delete Index") + Case 3 'Fileds + tbtNew.ToolTip = ("New Field") + tbtDelete.ToolTip = ("Delete Field") + Case 4 'Routines + tbtNew.ToolTip = ("New Routine") + tbtDelete.ToolTip = ("Delete Routine") + Case 5 'Triggers + tbtNew.ToolTip = ("New Trigger") + tbtDelete.ToolTip = ("Delete Trigger") + Case 6 'Events + tbtNew.ToolTip = ("New Event") + tbtDelete.ToolTip = ("Delete Event") + Default + End Select + Catch + modMain.Error() + +End + +Public Sub Action_Activate(Name As String) As Boolean + + Select (Name) + Case "NewItem" 'tbtNew, F2 + If tbtLock.Value Then Return + NewItem() + RefreshData(tvwTables.Row, tabData.Index) + Case "EditItem" 'tbtNew, Ctrl + E + If tbtLock.Value Then Return + EditItem() + RefreshData(tvwTables.Row, tabData.Index) + Case "DeleteItem" 'tbtDelete, Del + If tbtLock.Value Then Return + DeleteItem() + RefreshData(tvwTables.Row, tabData.Index) + Case "Refresh" 'F5, tbtRefresh + RefreshData(tvwTables.Row, tabData.Index) + Case "NewDatabase" 'tbtNewDatabase + modMain.$hFNewDatabase = New FNewDatabase + modMain.$hFNewDatabase.ShowModal() + RefreshData(tvwTables.Row, tabData.Index) + Form_Open() + Case "DeleteDatabase" 'tbtDeleteDatabase + If Message.Question(Subst(("Do you realy want to delete the database: &1?"), modMain.$Connection.Name), ("&Yes"), ("&No")) = 1 Then + modMain.$Connection.MySQL.DataBase.Delete(modMain.$Connection.Name, False) + modMain.$Connection.MySQL.Use("mysql") + Form_Open() + Endif + RefreshData(tvwTables.Row, tabData.Index) + Case "Lock" + tbtDeleteDatabase.Enabled = Not tbtDeleteDatabase.Enabled + tbtNewDatabase.Enabled = Not tbtNewDatabase.Enabled + tbtNew.Enabled = Not tbtNew.Enabled + tbtDelete.Enabled = Not tbtDelete.Enabled + Default + End Select + Catch + modMain.Error() + +End + +Private Function ValidateTableSelected() As Boolean + + If tvwTables.Row = -1 Then Return False + Return True + +End + +Public Procedure NewItem() + + 'Add the item + Select (tabData.Index) + Case 0 'Tables + modMain.$hFNewTable = New FNewTable + modMain.$hFNewTable.ShowModal() + Case 1 'Views + modMain.$hFNewView = New FNewView(Null) + modMain.$hFNewView.ShowModal() + Case 2 'Indexes + If ValidateTableSelected() Then + modMain.$hFNewIndex = New FNewIndex(tvwTables[tvwTables.Row, 0].Text) + modMain.$hFNewIndex.ShowModal() + Endif + Case 3 'Fileds + If ValidateTableSelected() Then + modMain.$hFNewField = New FNewField(tvwTables[tvwTables.Row, 0].Text) + modMain.$hFNewField.ShowModal() + Endif + Case 4 'Routines + modMain.$hFNewRoutine = New FNewRoutine + modMain.$hFNewRoutine.ShowModal() + Case 5 'Triggers + If ValidateTableSelected() Then + modMain.$hFNewTrigger = New FNewTrigger(tvwTables[tvwTables.Row, 0].Text) + modMain.$hFNewTrigger.ShowModal() + Endif + Case 6 'Events + modMain.$hFNewEvent = New FNewEvent + modMain.$hFNewEvent.ShowModal() + Default + End Select + RefreshData(tvwTables.Row, tabData.Index) + +End + +Public Procedure EditItem() + + Select (tabData.Index) + Case 0 'Tables + modMain.$hFNewTable = New FNewTable(Null, tvwTables[tvwTables.Row, 0].Text) + modMain.$hFNewTable.ShowModal() + TableInfo() + Case 1 'Views + tvwViews_DblClick() + Case 2 'Indexes + tvwIndexes_DblClick() + Case 3 'Fileds + tvwFields_DblClick() + Case 4 'Routines + tvwProcedures_DblClick() + Case 5 'Triggers + tvwTriggers_DblClick() + Case 6 'Events + tvwEvents_DblClick() + Default + End Select + Catch + modMain.Error() + +End + +Public Procedure DeleteItem() + + Select (tabData.Index) + Case 0 'Tables + If Message.Question(Subst(("Do you realy want to delete the table: &1?"), tvwTables[tvwTables.Row, 0].Text), ("&Yes"), ("&No")) = 1 Then modMain.$Connection.MySQL.Table.Delete([tvwTables[tvwTables.Row, 0].Text], False) + Case 1 'Views + If Message.Question(Subst(("Do you realy want to delete the view: &1?"), tvwViews[tvwViews.Row, 0].Text), ("&Yes"), ("&No")) = 1 Then modMain.$Connection.MySQL.View.Delete([tvwViews[tvwViews.Row, 0].Text], False) + Case 2 'Indexes + If Message.Question(Subst(("Do you realy want to delete the index: &1?"), tvwIndexes[tvwIndexes.Row, 0].Text), ("&Yes"), ("&No")) = 1 Then modMain.$Connection.MySQL.Index.Delete(tvwTables[tvwTables.Row, 0].Text, tvwIndexes[tvwIndexes.Row, 0].Text) + Case 3 'Fileds + If Message.Question(Subst(("Do you realy want to delete the field: &1?"), tvwFields[tvwFields.Row, 1].Text), ("&Yes"), ("&No")) = 1 Then modMain.$Connection.MySQL.Table.ModifyColumn(tvwTables[tvwTables.Row, 0].Text, "DROP", tvwFields[tvwFields.Row, 1].Text) + Case 4 'Routines + If Message.Question(Subst(("Do you realy want to delete the routine: &1?"), tvwProcedures[tvwProcedures.Row, 1].Text), ("&Yes"), ("&No")) = 1 Then modMain.$Connection.MySQL.Routines.Delete(tvwProcedures[tvwProcedures.Row, 1].Text, False) + Case 5 'Triggers + If Message.Question(Subst(("Do you realy want to delete the trigger: &1?"), tvwTriggers[tvwTriggers.Row, 0].Text), ("&Yes"), ("&No")) = 1 Then modMain.$Connection.MySQL.Trigger.Delete(tvwTriggers[tvwTriggers.Row, 0].Text, False) + Case 6 'Events + If Message.Question(Subst(("Do you realy want to delete the event: &1?"), tvwEvents[tvwEvents.Row, 0].Text), ("&Yes"), ("&No")) = 1 Then modMain.$Connection.MySQL.Event.Delete(tvwEvents[tvwEvents.Row, 0].Text, False) + Default + End Select + modMain.$hFBrowser.SetMessage(("Item deleted."), 1) + +End + +Public Procedure RefreshData(Table As Integer, Tab As Integer) + + textResult.Clear() + SearchInfo() + If Table = -1 Then Table = 0 + tvwTables.Row = Table + FieldInfo() + IndexInfo() + tabData.Index = Tab + +End + +Public Procedure SetEditor() + + textResult.SetStyle() + +End + +'***************************** Procedures for events ************************* +Public Sub tvwEvents_Click() + + textResult.Text = modMain.$Connection.MySQL.Event.Info(tvwEvents[tvwEvents.Row, 0].Text, modMain.$Connection.Name) + Catch + modMain.Error() + +End + +Public Sub tvwEvents_DblClick() + + If Not modMain.$bSchemaOk Then Return + modMain.$hFNewEvent = New FNewEvent(Null, tvwEvents[tvwEvents.Row, 0].Text) + modMain.$hFNewEvent.ShowModal() + EventInfo() + Catch + modMain.Error() + +End + +Public Sub tvwEvents_Select() + + tvwEvents_Click() + +End + +'***************************** Procedures for indexes ************************* +Public Sub tvwIndexes_DblClick() + + modMain.$hFNewIndex = New FNewIndex(tvwTables[tvwTables.Row, 0].Text, Null, tvwIndexes[tvwIndexes.Row, 0].Text) + modMain.$hFNewIndex.ShowModal() + IndexInfo() + Catch + modMain.Error() + +End +'***************************** End of Procedures for indexes ************************* + +'**************************** Procedures for sorting info ******************** +Public Sub tvwFields_ColumnClick(Column As Integer) + + FieldInfo(Column) + +End + +Public Sub tvwTables_ColumnClick(Column As Integer) + + TableInfo(Column) + +End + +Public Sub tvwViews_ColumnClick(Column As Integer) + + ViewInfo(Column) + +End + +Public Sub tvwIndexes_ColumnClick(Column As Integer) + + IndexInfo(Column) + +End + +Public Sub tvwProcedures_ColumnClick(Column As Integer) + + RoutinesInfo(Column) + +End + +Public Sub tvwTriggers_ColumnClick(Column As Integer) + + TriggersInfo(Column) + +End + +Public Sub tvwEvents_ColumnClick(Column As Integer) + + EventInfo(Column) + +End +'**************************** End of Procedures for sorting info ************** + +Public Sub tvwTables_Menu() + + mnuItem.Popup() + +End + +Public Sub tvwViews_Menu() + + mnuItem.Popup() + +End + +Public Sub tvwIndexes_Menu() + + mnuItem.Popup() + +End + +Public Sub tvwFields_Menu() + + mnuItem.Popup() + +End + +Public Sub tvwProcedures_Menu() + + mnuItem.Popup() + +End + +Public Sub tvwTriggers_Menu() + + mnuItem.Popup() + +End + +Public Sub tvwEvents_Menu() + + mnuItem.Popup() + +End + +Public Sub cmbDatabases_Click() + + modMain.$Connection.MySQL.Use(cmbDatabases.Text) + Me.Text = "mysql://" & modMain.$Connection.User & "@" & modMain.$Connection.Host & "/" & modMain.$Connection.Name + SearchInfo() + +End diff --git a/app/examples/Database/MySQLExample/.src/FTables.form b/app/examples/Database/MySQLExample/.src/FTables.form new file mode 100644 index 00000000..fb079f0a --- /dev/null +++ b/app/examples/Database/MySQLExample/.src/FTables.form @@ -0,0 +1,206 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,99,72) + Tag = "Catalogs" + Text = ("Tables") + Icon = Picture["icons/16/Table.png"] + Arrangement = Arrange.Fill + { mnuItem Menu + Text = ("Item") + Visible = False + { mnuNewItem Menu + Action = "NewItem" + Text = ("New Item") + Picture = Picture["icons/16/New.png"] + Shortcut = "F2" + } + { mnuEditItem Menu + Action = "EditItem" + Text = ("Edit Item") + Picture = Picture["icon:/16/edit"] + Shortcut = "Ctrl+E" + } + { mnuDeleteItem Menu + Action = "DeleteItem" + Text = ("Delete Item") + Picture = Picture["icon:/16/trash"] + Shortcut = "Ctrl+Del" + } + { mnuRefresh Menu + Action = "Refresh" + Text = ("Refresh") + Picture = Picture["icons/16/Refresh.png"] + Shortcut = "F5" + } + } + { vplMain VSplit + MoveScaled(0,0,98,71) + Expand = True + { vbxTables VBox + MoveScaled(1,1,97,37) + { tbrMain ToolBar + MoveScaled(0,1,84,4) + { tbtLock ToolButton + MoveScaled(0,0,4,4) + ToolTip = ("Lock") + Action = "Lock" + Picture = Picture["icons/16/Lock.png"] + Toggle = True + } + { Separator2 Separator + MoveScaled(5,0,1,4) + } + { tbtNew ToolButton + MoveScaled(7,0,4,4) + ToolTip = ("New Table") + Action = "NewItem" + Picture = Picture["icons/16/New.png"] + } + { tbtDelete ToolButton + MoveScaled(11,0,4,4) + ToolTip = ("Delete Table") + Action = "DeleteItem" + Picture = Picture["icon:/16/trash"] + } + { tbtRefresh ToolButton + MoveScaled(15,0,4,4) + ToolTip = ("Refresh") + Action = "Refresh" + Picture = Picture["icons/16/Refresh.png"] + } + { Separator1 Separator + MoveScaled(19,0,1,4) + } + { tbtNewDatabase ToolButton + MoveScaled(21,0,4,4) + ToolTip = ("New Database") + Action = "NewDatabase" + Picture = Picture["icons/16/Database.png"] + } + { tbtDeleteDatabase ToolButton + MoveScaled(27,0,4,4) + ToolTip = ("Delete Database") + Action = "DeleteDatabase" + Picture = Picture["icon:/16/remove"] + } + { Separator3 Separator + MoveScaled(32,0,1,4) + } + { cmbDatabases ComboBox + MoveScaled(35,0,24,4) + ReadOnly = True + Sorted = True + } + } + { tabData TabStrip + MoveScaled(1,8,95,26) + Expand = True + Arrangement = Arrange.Fill + Count = 7 + Index = 0 + Text = ("Tables") + Picture = Picture["icons/16/Table.png"] + { tvwTables TableView + MoveScaled(1,3,41,16) + Mode = Select.Single + Header = GridView.Both + } + Index = 1 + Text = ("Views") + Picture = Picture["icons/16/View.png"] + { tvwViews TableView + MoveScaled(1,2,35,13) + Expand = True + Mode = Select.Single + Header = GridView.Both + } + Index = 2 + Text = ("Indexes") + Picture = Picture["icons/16/Index.png"] + { tvwIndexes TableView + MoveScaled(1,3,40,15) + Expand = True + Mode = Select.Single + Header = GridView.Both + } + Index = 3 + Text = ("Fields on:") + Picture = Picture["icons/16/Field.png"] + { tvwFields TableView + MoveScaled(2,3,39,16) + Mode = Select.Single + Header = GridView.Both + } + Index = 4 + Text = ("Routines") + Picture = Picture["icons/16/Routine.png"] + { tvwProcedures TableView + MoveScaled(1,3,41,16) + Expand = True + Mode = Select.Single + Header = GridView.Both + } + Index = 5 + Text = ("Triggers") + Picture = Picture["icons/16/Trigger.png"] + { tvwTriggers TableView + MoveScaled(1,2,41,16) + Expand = True + Mode = Select.Single + Header = GridView.Both + } + Index = 6 + Text = ("Events") + Picture = Picture["icon:/16/clock"] + { tvwEvents TableView + MoveScaled(2,2,41,16) + Expand = True + Mode = Select.Single + Header = GridView.Both + } + Index = 0 + } + } + { textResult TextArea + MoveScaled(1,39,96,32) + } + } +} + +# Gambas Action File 3.0 + +{ Actions + { Action DeleteDatabase + Text = "Delete Database" + Picture = "icon:/16/remove" + } + { Action DeleteItem + Text = "Delete Item" + Shortcut = "Ctrl+Del" + Picture = "icon:/16/trash" + } + { Action EditItem + Text = "Edit Item" + Shortcut = "Ctrl+E" + Picture = "icon:/16/edit" + } + { Action Lock + Text = "Lock" + Picture = "icons/16/Lock.png" + } + { Action NewDatabase + Text = "New Database" + Picture = "icons/16/Database.png" + } + { Action NewItem + Text = "New Item" + Shortcut = "F2" + Picture = "icons/16/New.png" + } + { Action Refresh + Text = "Refresh" + Shortcut = "F5" + Picture = "icons/16/Refresh.png" + } +} diff --git a/app/examples/Database/MySQLExample/.src/modMain.module b/app/examples/Database/MySQLExample/.src/modMain.module new file mode 100644 index 00000000..1c969160 --- /dev/null +++ b/app/examples/Database/MySQLExample/.src/modMain.module @@ -0,0 +1,69 @@ +' Gambas module file + +Public $Connection As New Connection +Public $hResult As Result +Public $Host As String +Public $Password As String +Public $Port As String +Public $User As String +Public $bSchemaOk As Boolean = True +Public $hFTables As FTables +Public $hFNewTable As FNewTable +Public $hFNewView As FNewView +Public $hFNewDatabase As FNewDatabase +Public $hFNewIndex As FNewIndex +Public $hFNewRoutine As FNewRoutine +Public $hFMessage As FMessage +Public $hFNewTrigger As FNewTrigger +Public $hFNewField As FNewField +Public $hFNewEvent As FNewEvent +Public $hFConnect As FConnect + +Public Procedure Main() + + $hFConnect = New FConnect + If $hFConnect.ShowModal() Or Not $Host Or Not $Password Or Not $Port Or Not $User Then Return + With $Connection + .Type = "mysql" + .Name = "mysql" + .Host = $Host + .Password = $Password + .Port = $Port + .User = $User + .Open() + End With + If Not $Connection.Opened Then Return + If CInt($Connection.MySQL.Version.MinorVersion()) < 1 Then + $bSchemaOk = False + Message.Warning(("Seems that your MySQL version is lower than 5.1.\ntherefore you will get some error and warning messages.")) + Endif + Try $Connection.MySQL.Use(Settings["/General/LastDatabase", "mysql"]) + $hFTables = New FTables + $hFTables.ShowModal() + Catch + Message.Error(Error.Where & "::" & Error.Text) + +End + +Public Procedure Error(Optional Message As String) + + Dec Application.Busy + If Error.Text Like "*MySQL server has gone away" Then + $Connection.Close() + $Connection = Null + $Connection = New Connection + With $Connection + .Type = "mysql" + .Name = "mysql" + .Host = $Host + .Password = $Password + .Port = $Port + .User = $User + .Open() + End With + Endif + If Not Message Then Message = Error.Where & "::" & Error.Text + modMain.$hFMessage = New FMessage(Message) + modMain.$hFMessage.ShowModal() + +End diff --git a/app/examples/Database/MySQLExample/icons/16/Admin.png b/app/examples/Database/MySQLExample/icons/16/Admin.png new file mode 100644 index 0000000000000000000000000000000000000000..44ff99df10f2fb1f32768671d75eca895e88652e GIT binary patch literal 1099 zcmV-R1ho5!P)w{4;0HGr`YL|;LMybw1`OLe3ZZj=>olLreB5j#*3GDHojh)b0s;gJ z4iQapgE(An1qTTN0Rk;MMO%TBZl=F$qr6aeiXJO900000000320SgTe7ab!N8zBe^ z3;+ND0001ox5KN>*tON)v(?|H&DeObz&nSZjJ?c}!_$tz(vri~lf~7P#nqa~*oC~! zE{duhcamhMzG zz|(EC%x$&JZnVv2ugG1g!aSL{2y>Spgr+QwuQ!&ra<$C6+vc~~gv&~zq z$V{TYHZ~)W+cH#Ng@2;p(l_;eWoXORcaJbP>ro%9qy(W&b9fqnwoV#JL%cj!d_WAqr`1;!H z^SR&bp3~)u$K7$c(NU(uGMKy`h^(j5;OX=Cyx!}k*XX3z=$X*sgv8ovw9ZPU#6zIL zE03{EqrrE&(1gO*h{oKL&ESyB--g87bh^`7tjJ5K$xEijIGDIkrNU*h&2_rdd%o3p zywq*C&|k33T(Z$+u*_4d%1@`nR;tHbuF7Ds%xAgOXRpg~vB}p~F}eT%07-OGPE!B? z0000000000Gm_Bo>BxvC0)PAOW&@gndtn~w*AH=6q>Z|vuAGE?Jo@%NsHg-d+}toT z%gj9&@U}WOr=Hcbz7Z7A-VPysK zg@i>sy}W&V{Y1ssfCB8|68-^!LBS!RVc`*y9IOnSQjt;7F|l#+35iL`DblPAGP0>@ z>9HA^S=l+cdHHhk3Ma3nhW#tu>Rn;}MiVRA1^$m?p%`L6XZS5VMUCIn9-95d1 z{SzimnmlFdwCOWc8PsOZnmuRky!i_jE?T@~=`wW&jpZv=u3Eij?Yi|FHg4LyMUz2G zduwmsw(UE1?%KU)?>-$}23EcO2M!)OeB|h{<0np@(l=mWH8eVX=Ipui7cO49e8t#= zm4TJj)a>fD>o;!Rx_!sof)ymdYH4L{bN8;ToxKAqM1a-N$=Su#&D{gU1^}|JV=qq- Rh@b!f002ovPDHLkV1n0V@Bf6>|CG+}V~oa(oW?P&LPD);d(ORUy{(+*|8u?XN}S#RO0|lT#6q<~2y+M! zdk_e75CB?x0At1gW6lg=ylQZLTD4jLQUCx-003hEDU_5DgtZ8S&IonPV|awDxVRyE zApki5LZw1uy<=avU}JoFxz5h#|Np|+*bs9N4PXyofOwP#+`_`r(#o0%EMQ}6 zXK&)*=;Z9;%FF^1aI>La-;UEwZ85JE9 z8yBCz$sm)Ml$4a5lA4yDk&&6j#mxY8v1WF5PHtX)L17UOFCWxLjQj$ELdC)&qGB)s gpoqAHq^KAp0BThwQ%&gz2mk;807*qoM6N<$f+9>2VgLXD literal 0 HcmV?d00001 diff --git a/app/examples/Database/MySQLExample/icons/16/Column_FK.png b/app/examples/Database/MySQLExample/icons/16/Column_FK.png new file mode 100644 index 0000000000000000000000000000000000000000..3a2999f124ac2d04088eadd26b5394dc115eeb0c GIT binary patch literal 529 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMf&j6ng*Z=?j1DQaOlbV_y6Jw;M zl@b?Mk)K}}6Jx5T1{BXoNT|rmEA;R%k(MqKt3=I1Ysj&>9m2Pv?%t#onm zla^*>VgeZi22SGQC7PPvQc^68j4&}MZ73+1p{mM)q!=QhFCgFrRF5H!tbNC#Mdxj=FZOld-nWaz50J==ikW4_aPx`Y;Eu4=KfDe z_!JuYI3Qr3v-5Fx_q%?6TO1swo0%=nWSs>x+NvbT4;UECiib319^TVnlz#Y7UGm;T zy%WdetlmD$l4aqJ`TSx+oHhr$O7WNeTsJ8$jp92!?rfStNy-K?tV!*=ih!o{db&7< zNL)@%aA5DrU{E{IqITfSp)REZ$MTLIJlQJn;MvA)8=pRX+{F2T`^HUc3oA~pLPyq? zxv?>K@7UV7y6jY7N_rG`&u(9x(4?SC0*sQ8mj4?ZDp_4sQ#%^ER?VuKu%~U=G_w%a z>3!?w?Q2}NaEjoWC_UL^;b0E=R|a~r#>L#qDa(r`Uq&pd;^SjrT*3d}drF}QDC9g{ L{an^LB{Ts5Hh!x| literal 0 HcmV?d00001 diff --git a/app/examples/Database/MySQLExample/icons/16/Database.png b/app/examples/Database/MySQLExample/icons/16/Database.png new file mode 100644 index 0000000000000000000000000000000000000000..a4f2fa4cdd49b69bfef57ea38b3c825fcdd07eda GIT binary patch literal 805 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GXl47&iy_gt-3y{~suFVXgY*^=fBV zDxFv=e`LP&{#g>cr-}CEgS6k@rE_4=?tYK`^DKZ25c`1Z?x~6p_Ol}{ zCufPm*sdpMi2&J84m+QiDSUgo@s2+J$GbK6&y)rV-rQ=uXM!+9<-Oew$EJgH-Q8_} zWSYp8^?Ez{gzjtsI>un{46S9YQb4JmVyTO(RW7bnJhx2##C+)!3uI0%lsz(EA>L0A zVhA$%;zIf7yOaJtTlDwQw0{q${(C&<|$|NCm)-zT&GJz4ng z<;MT-kN^90>F0|ze;-Z#cfaq~lhw~pCqF!q_4Y>J_opkr-JACORN#-rgVZ@UZ8%+gblV9R2_0hFgIf1XYJ{bt|A^`?){)_r__=;xwLi}$y}CZ}=HcoKJ5moU zve`4+@Ypi*Q!9<{?DPHm?%2o-$I?t6Kl3vG`6I{i{f9cw_a7SHe|-A7dMEeWkE&eX zf2e)`@$OUBzki)<1}pEs`1j)BdVd`WVR>ymaW)nQpn-QhT^vIsE+;1>q@<)Ir6r~& zKY#FqX_KUc#Lmi?yLW7D_U@^z`1!+;iD_TmKgM^Bjt3PNHaQ(~V4P@RKf$BIC1A;l z85RK!N?KNG*X$Ma>=XloyreV~CQq3&Y1XuP6K77<)n*r(;D74m+0*(OI$Gz#7`Qd2 z9boaAdVuLv>Qm9FKUqVsnr_t!TIImFb=R-9W6PdRySA;Yl-GAbgV-UST-ga+u`La9 zH+cT?&2U)G7;)gjiq*T-_b=GK{{9V?oVJxSceXCQ%91S|ZC%YCyntc)j>VIwZ0_#f eJZ17?3vmYfr4ApfrT=~hB^FOtKbLh*2~7a3w3D>} literal 0 HcmV?d00001 diff --git a/app/examples/Database/MySQLExample/icons/16/Datetime.png b/app/examples/Database/MySQLExample/icons/16/Datetime.png new file mode 100644 index 0000000000000000000000000000000000000000..0baf9a18ad1aa2cc5d161065067a22196763c43d GIT binary patch literal 1140 zcmV-)1dIELP)zrFwf z0313xCQVHS4GqP_!q?>N%hlP*&CtTo+L@S^xw^U3=I`$L|NZsr^YrPk-sO&^vxS9* z$=KoW`~Um@|Lp(&z2V|ze21*m?2DPBgMx(rnMMD5DgSB~|7H;XXcwrOlhNAX`R?QC z|Npnu)JsoKX@{Q3 zz=yWb(Bkm4r>%>Om*VE-v)1Lj;J0b{KM=2 z;`98Any$Xz@5tiu(%$Fd+}h#F!SUP9x}TVrueZGB`MJW&eSmZ|S z=JMC!=JxUM(>gVO=&cpQY z>*(9l+uGN0eSNvk&gcLC!r0if)%4cj=lb^Z?&96>@bKp1;N#-p&BnZJgoLBZ%hCS+ z)BgU@{{F1j*VyCi<>cex(8cKH?R4zyWzNpv=gw$7+}z>C#?Gm! zvRbybYS-6WxVXW@&bYY1m6f1KlaoFGP(%O#07`UHPE!B?00000004UV`T6;X0dac` zC^vP9GGBVE(Bu91`M~`^{c`>JPvk7|!PDDD*Y?=>-A@sY)|*=<8ea0+{a&vTbc6WGrdV73*egJ=ffr5jCg@%WSiHeJijUNCYj*pO$l9QB`mY0~B znwud2BAlI`pP-?lqok##r>G+a03@lZtE{cAuduPQv$Q291^~6Tx45~wyS%-=zrex5 zCnx|Z!^FkL$H>Xb%goKr&(JCWE78)^)YaD4*xB0J+uSTI0509$-{9fmFEBCVSAIB`3o8JOr5%W@7_nRUr$)OcH52}Kfiwm`gF_p?}78@Z{D`;``52m|Nrm*`#0tK zb*Hwr-r2KnzkmPv|Nm3}|4;b#E$!B=^lR5*_wF@JNon7|fA;U+wVyvHUAdBS_H6R; z?A>cyTWfpF^ghrL9wkA3zyL-Ard2AM#}erUe1!GU=OEK_TEU2mQY6Nq?pqC}sYEAip+Qgg=G2mg*1a>lPJH|60oV+#2D z`YzC<<(@8%ArhC96BL*Xj0`t(aB*(lw6VCriFJpIi|vskJ0CLH2u+$7cQ5GDo&ZKW z$w>Kl`~M7;M1%>*wwy2}x}2w+ES3 z666OoCaq(p(%pB0F1tfl8J{UXwdX(+P%hEa#W6(U^3=ZDd<_O1&f(>Wvz>qckJrB4 zW2koQ1oy*$jJdycbe6a;==W6ONfBJIfk``>{S3B)nzX w*L>#NvIC!wzr57u9e-9P^_j$jd0*;fJ6c$LcPa(H1X{-6>FVdQ&MBb@0MLYGXaE2J literal 0 HcmV?d00001 diff --git a/app/examples/Database/MySQLExample/icons/16/Index.png b/app/examples/Database/MySQLExample/icons/16/Index.png new file mode 100644 index 0000000000000000000000000000000000000000..391fd0041c3e5d65b852d9b9db2fe6896fdca447 GIT binary patch literal 1122 zcmV-o1fBbdP)_9tq*ECvaF40s;X5007{wE5e>Kj&d3o5(WSO z0Ih`?n0q90S{7kU5+xoA4h#kW000000JVq+(5pI(a2|DC7g0eJDiPMBrl$S*v;Y6P|NpW7 z|H{9@#s2^Q=>Pwi`u#(dng9Q*|NoT#{+Iv%oaE-Ih>wW0zQyo!;S)!qJby(2U8# ziQLnk^}3;v}ga7J<|LlkV?uY;IiU073|L%eD%18L&r2puU|KooD z=7Rs_d;j5c^wwtX$57U^M*ixl{@HH%&sFBYOU|i1yOblhlr26yxK9880Ah4fPE!B? z0000000000001+E2?h%b2ru211uE9_^WIbrK;D%HpYhA|lLPdpC+~po`+M)uJn#L1 z7VpzH2=DiM^Ug8{=J?uQ7lZP>u5v^h1X2Fx(57fqE*=m923mquDIf*|+Tq&g0003M zNklt)JUABD1%2lh^tX;R> z#MF$ze8a{~b(=SD*}84}j-3{kRt(m=cJJA{Z{NQC2M!*xu{GmhuseL@=&|D`PM$h_ z=B&MgBL{=ix$_q;Ub=kc>NRHPx# literal 0 HcmV?d00001 diff --git a/app/examples/Database/MySQLExample/icons/16/Lock.png b/app/examples/Database/MySQLExample/icons/16/Lock.png new file mode 100644 index 0000000000000000000000000000000000000000..a39c1a9afa9c5d31e1d7892a1ffccef8416dc2a0 GIT binary patch literal 1195 zcmV;c1XTNpP)f0008bP)t-s00018 zlPr0dq3#GSLnp0mcBvBj0Ez>uZ9ewD6pikg0y zwwbTQtG>;+%G0K|%ay0WhMKc&gPnbrww$rWx60F*tHghjtYvwUdXu!1sllY969@OXZ$*8@_tHR8YtGtArw9nV#tGmjEp{a+Ws;aum zk)^zuufm(J$cme`uEWflv%-a-vW}&=+~MfG$kwB@#HF>x;pOX^t-+D0yq2uQlBL0@ zz{-!RxqX?dsJO`V_4e%V^3vJj?C$aP_4c*G(TbzCkf^_nqQ0KC!ib}@d6lN7wZ-%F z_3G{Lth>kS?eO&U^|8OsgrBjBq`HTlxsIl^g`ci>lA@!t!t(O-^7He!#L%_D&hYW_ zuDr{Co2`SMwSJYcft#v!k)WZlzx4F~9Jac;@Vi85LvF{{Gu<9s&XrA1FP0wAkCZe?lrD9~C(Rh;je`0W3*G zK~xyi0U-h2{r~^~009940|W&I2LS;900000009UI3JVMk4i69!0RR91000sb6cu4& zV`LT=7#RQn000^r9A#!_XlZI|Y#kmS001B%B5iJOaB*^Tbai$kBqabQCwF*xdV73* zet&?0f+#5fDuaZDhKGoWii>lMjgF5i04$J^l9QB`mX~RmnVOrNEdVZ^o}ZwhqNAgv zrKYE-sV@L9s;jK6uCK7Lv9hzYwYD(;GPk(7y1Tr+zQ4S{!NS8c05mnk#m2wK$jQ9Q z%goI-Hvl*}&d<=%($mz{*4NnCIy(S7JwDpo+}+;a;NjxqKR`hM0YXDWTV?=P#TeawY{tz*&@4h`4B3xO|0n{1s-P1LEQ<+>;2@kF=Pxt?S{gM zX*=H9Fkyk%gck;kT5z>*Mlu)BcroL|I~ybxyjsAR5h4Sg>M&wLXYcg5+E2P6wPMnY zQ3Iao@kED58VC)zbYI3{b3{t-lmoBL_}_#PJ%n03)L>8rfgT+_Q%~fc2`gS2@LZ4o zbQsoPNDZC}{YnhXfz>S?lD-#P@tpps$73A?8t^sXs_|eJ1A4IT$=K~|_BG*O7kd7_ zc)zLnPG@JQf|T(Gxq>0y5T8quWIdYl={BrvI9ysrq3J(!^Y`8v z7jMb>x2ICxXQM{<=pH4w$}WZyzh~>?uD!Fa-Z&KmFtSH@1d-`)8hYqrs`3N_*RYj zTax`?nEzv(|8$=4m!7iE-v5ND>VB&EhOzmKv-ym$?~t?bpuY5(q_xZ3|ES6Kp}+2= z!SJBF>8#B5xX9ML$>W!!x5e21uFLqa%k8Pf@wU+Msk_(etANy~m5!OMzt;bux#hCU z_LQvMldtBPuh`0sa=N6cjhnK-)&G{V=6saUpuF*utJt5t@2JG*qrmR0xVX8`|Ea_D zx6tpJwd1wS^^>jKnzQGOrP*wGe7Vlf=l}o0*x0qq|CX@fm$2)Os^ou{(~+*~fSAT( zeuSgT%hCS+)BgU@{{F1j*Rsq1nz!wWq}86g@u|V*n6Teff{JIbu$uk-q5l4({{El- z{+a##Zoa;*#{Z$Z?6uGLjiua{ujYuN-(-NSI&XAh$;ou>?R4zyWzNp9$^Vh8>3)^m zj;!!@j?jCN&1iY1QDS#mwzg{5*IT%_k*MK>n$>oPwsnA^dx4dOhmJ^-lPI0cB>(^b zLUdA2Qvd)5H%3rZaFM8~Vy*i8`S|ez^d`Y9?f&E6D(v7T<=`yo!QtCR&_W?^Mx=iubxW`F=5UMFW4 zS2uSLPpE*Gw~w!%e?VYRFjRmqBs45MA~GsE1}eZG8yBCDn3SB73KbAYOV7y6%FfBn zg9-@d7Zes1mz0*3GYT;R0fTTwWmR=eZC!nXh^QDyK)kW3xuvzOy+cB>Q%V{rAk)>| z)7#fSVdA98Q>MzwF*3+cn?7Uatl4ws&YQnr;UWb^2BpPImM&YqV&$sUYu2t?zd@Nn zW#gvJTefc7zGLUEUAyV|I)z#BCIA>^N rY{Fn_W^Q3=Wo=_?XYb%>Y{Cct>$+5S?~kx!00000NkvXXu0mjf`SVAR literal 0 HcmV?d00001 diff --git a/app/examples/Database/MySQLExample/icons/16/Primarykey.png b/app/examples/Database/MySQLExample/icons/16/Primarykey.png new file mode 100644 index 0000000000000000000000000000000000000000..e09d139ed0f17256939edef506853bb342c5410f GIT binary patch literal 585 zcmV-P0=E5$P)GV;?QwU!0sy$1H-N%Pe(^4mT0&mePO1M=1{(YPbm!9dcl z5&!@I_u^0Aw-*2a0QBBO(ySB!0088~7W?a0kar0H000000OH3a`sPjg(dPI6at8S0OX{Oef#;!pk5 zDE;zq{q9)(>1h4hF#Xad{qbr2>{9*bLjB-1{n#u0&?EfmO#I+G{Mau1(kA@QA^qh` z{M|PG^N07}JpJ%={qAA?>rwsZL;d48{oXH>xYH^C002RBQchC<000Mb!^wdT0=W0| z&k<0{wu1wb#0`bM5it3D2?25W{j4Mc(Yh(m>^TL`@EXtSG0*Nr&%PMX`$Jmwh8iaq zT3hA40001#NklQT8CjTsoV-GKgrbtN9NbhD)yOC{bzy|P3>wjz zTG~i_2AvpPJw{{!{a6D-WIlsYoUw@tvVdv4nK=`(fJK6(l^n8wwT-PEihzo}1Jnor Xs^=3K{;}=3xW13 zmjw9%?U(Ji{43?(EE5UynSaBbKhJja+4fUh@cSVy_RSBAtPInye|7r(0jRvz)5S4F z;&N&KOQ9wMo|ftfP3#>_>KZ5Z{kNX9q|D9jrv1sf$xEV>|DF8Vqw!hqr$a!XK|ueW z8#(2_WjL5*rcULP%bLK@|2X~Yk?a_qSuei!F=SubP0l+XkK*n639 literal 0 HcmV?d00001 diff --git a/app/examples/Database/MySQLExample/icons/16/Routine.png b/app/examples/Database/MySQLExample/icons/16/Routine.png new file mode 100644 index 0000000000000000000000000000000000000000..7a83453bbaf40f2db075fcfd4470ae438f6b9541 GIT binary patch literal 827 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 B`jG$t literal 0 HcmV?d00001 diff --git a/app/examples/Database/MySQLExample/icons/16/Trigger.png b/app/examples/Database/MySQLExample/icons/16/Trigger.png new file mode 100644 index 0000000000000000000000000000000000000000..0ef24449c87af539ad5b2c1b38747f8b327e8da7 GIT binary patch literal 930 zcmV;T16}-yP)aSRvYASqRTZLqr zVMA#|I6~K%Yn6&$8LA-~y&DM93Ujz~MRYJEsv#hvA-j|9}A3aDca>$gkw z!%y$LL)WoYwUkD>hZoJ77tNUtq+kH{#8B$DJ?pkJ>$EK4t|{889oM4~zKboKZWrRN zGv~H3sACARatP3v34?2dJU=_wrY8}#6b#S~cffd%fR95;K>(2h0Imuf%ODEQ3wgVH zk9?0pM?nOR1puuFCf6h&&>#)X4_doihqzVt103psI8P6LQ z$r>-JGZ&N^0G9v&rU(F;1r2oo9?~Bh&K?cQ5d_N$0L%se!3qGh3jm}B8O<6Epa2V# z01C~j1a{8+#y>dW`ut-LjilB2`ttpHdh9+Q+|TF`EeW>akA=~vw6-v2Jxcb^ zyzXnB=^B-~&bI&n0OLtSK~xyiV_<*+MkZz!RyKARmxGhbKY*Kumk-M47YGar4hant z6oT-DMMT3RBBP>X#Ka}Q0+O+D@d=4Z$tkI6QeXk;^o-1`?3~=Z`~n#eUsg_Dp|Gg9 zq_nJDQ3)iVtfHz`QCU@8Q(LFbz@VY2rCr~kqpPRiXkch$%)nsM)ZEhA*4|-iW^Tb? zX~n=`-PzUM)7#f?V`~R-!-R>GCQq3`AhW>=`c+}u4pw|IH``1(Qk01}Wtqwq6OJOBUy07*qoM6N<$ Eg0Fg!u>b%7 literal 0 HcmV?d00001 diff --git a/app/examples/Database/MySQLExample/icons/16/View.png b/app/examples/Database/MySQLExample/icons/16/View.png new file mode 100644 index 0000000000000000000000000000000000000000..255a8e23be181824fda3537107fb9df1e694b637 GIT binary patch literal 697 zcmV;q0!ICbP)T)mm)jm%;hw>;2^F{o?8U;pzR}=ltE}{MzOG*W>)v;r!Cz z`_JC{%-#ErxAL9I`R(!jJ4M&&^Zw@X{o?NZ-|YR{>iv+r?wrT>_WJ*!#`@gl{LbC` zm$~od@crKG{o3mN*693>xa*q5_VoGxr_J~J{QvX#{_6Ao;qLv{==_$t=-ur7+3Ee( z=ls&;{EfBenZxt(_x_~E^3&q`&EouuvE-M)@b2~fpTX>wxbMl}{D`gKmA&oi^Zc5* z<;vjvmAU7|-us5C+>^TM=kWZ5rr3g`)q$YWfS=Kkvf;to`-G<1k+$aO^8Uo#`;4pF zz1jPZv*YCO{oU*R(d7HP*!zg3)wB9eVNOAm&y3p@2vm;00wkYPE#B|PZm5oAm{B=0002oNklB?5Kc|frFEii<^g+k6%DgNLWOai9t*pqEWq~w&;G@!QhjLfX;943a`y!?W~A}7z{lGxJhvT`Pdipr{L|A3nG+PeDkhRjAL f24)r}WWWjly{9gAMsoG@00000NkvXXu0mjfQWmu$ literal 0 HcmV?d00001 diff --git a/app/examples/Database/MySQLExample/icons/16/Warning.png b/app/examples/Database/MySQLExample/icons/16/Warning.png new file mode 100644 index 0000000000000000000000000000000000000000..4997cb9222cb0ed478b3c36eae0b36fc0ff1186b GIT binary patch literal 543 zcmV+)0^t3LP)A{= zedXol@$vD9h=_J}cK!YRxw*N5f`Y=r!j+Ykh=_=ZiHTBDQn|Ug^78VFi;GZDP}SAd zprD{QI5^(k-pXJ=3G605<>O=l}2T@3642hlhv9$H!`FYQDa{VPRpBk&%0Q zd)wpx;Nal;`uc-|gWKEN^YinFh=`Y$m(kJDot>Sks;X~qZ(UtoUS3{pZEa>qnH2y4 z04{V=PE!B?06~bAm6erYYTEqmrekgD?O|c+rUI4irj?bI?WSSsrfur&V{Pi~remb0 z4|6Y{0001SQ3;>{)AYA$?_0a$T002ovPDHLkV1nCU*Nd$B zVb9#-lCGGcGWox7z7aFCa^R_ld1)$6hTK}>NzBT3GJ8BsLJXCetvWp?%aky@*XN$b T_|VJ>XcmK~tDnm{r-UW|sJS1i literal 0 HcmV?d00001 diff --git a/app/examples/Database/PictureDatabase/.directory b/app/examples/Database/PictureDatabase/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/app/examples/Database/PictureDatabase/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/app/examples/Database/PictureDatabase/.icon.png b/app/examples/Database/PictureDatabase/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..983d37059f21a3a981c41ead71ba92c498b2a8c2 GIT binary patch literal 4228 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 akN*eZUZ?bJ#UmI10000, 2007-2010. +# +# +msgid "" +msgstr "" +"Project-Id-Version: PictureDatabase\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2011-03-20 21:43+0100\n" +"Last-Translator: Jordi Sayol \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: .project:1 +msgid "Picture Database Viewer" +msgstr "Visualitzador de la base de dades d'imatges" + +#: FormPictureDatabase.class:68 +msgid "Thumb" +msgstr "Miniatura" + +#: FormPictureDatabase.class:70 +msgid "Description" +msgstr "Descripció" + +#: FormPictureDatabase.class:101 +msgid "Add image to database" +msgstr "Afegeix una imatge a la base de dades" + +#: FormPictureDatabase.class:113 +msgid "Are you sure you want to delete image " +msgstr "Segur que voleu suprimir la imatge" + +#: FormPictureDatabase.class:114 +msgid "" +" from the database:\n" +"\n" +msgstr "" +"de la base de dades:\n" +"\n" + +#: FormPictureDatabase.class:115 +msgid "Cancel" +msgstr "Canceŀla" + +#: FormPictureDatabase.class:115 +msgid "Delete" +msgstr "Suprimeix" + +#: FormPictureDatabase.class:127 +msgid "Save image from database" +msgstr "Desa la imatge de la base de dades" + +#: FormPictureDatabase.class:131 +msgid "" +"Error saving image:\n" +"\n" +msgstr "" +"Error en desar la imatge:\n" +"\n" + +#: FormPictureDatabase.class:252 +msgid "Picture Database" +msgstr "Base de dades d'imatges" + +#: FormPictureDatabase.class:276 +msgid "Remove Image from database" +msgstr "Suprimeix la imatge de la base de dades" + +#: FormPictureDatabase.class:286 +msgid "Export image from database" +msgstr "Exporta la imatge de la base de dades" + +#: FormPictureDatabase.class:296 +msgid "Update image description" +msgstr "Actualitza la descripció de la imatge" + diff --git a/app/examples/Database/PictureDatabase/.lang/cs.po b/app/examples/Database/PictureDatabase/.lang/cs.po new file mode 100644 index 00000000..944ccb3e --- /dev/null +++ b/app/examples/Database/PictureDatabase/.lang/cs.po @@ -0,0 +1,75 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Picture Database Viewer" +msgstr "Prohlížeč obrázkové databáze" + +#: FormPictureDatabase.class:68 +msgid "Thumb" +msgstr "Náhled" + +#: FormPictureDatabase.class:70 +msgid "Description" +msgstr "Popis" + +#: FormPictureDatabase.class:113 +msgid "Are you sure you want to delete image " +msgstr "Jste si jisti, že chcete smazat obrázek" + +#: FormPictureDatabase.class:114 +msgid "" +" from the database:\n" +"\n" +msgstr "" +" z databáze:\n" +"\n" + +#: FormPictureDatabase.class:115 +msgid "Cancel" +msgstr "Zrušit" + +#: FormPictureDatabase.class:115 +msgid "Delete" +msgstr "Smazat" + +#: FormPictureDatabase.class:127 +msgid "Save image from database" +msgstr "Uložit obázek z databáze" + +#: FormPictureDatabase.class:131 +msgid "" +"Error saving image:\n" +"\n" +msgstr "" +"Chyba při ukládání obrázku:\n" +"\n" + +#: FormPictureDatabase.form:21 +msgid "Picture Database" +msgstr "Obrázková databáze" + +#: FormPictureDatabase.form:39 +msgid "Add image to database" +msgstr "Přidej obtázek do databáze" + +#: FormPictureDatabase.form:45 +msgid "Remove Image from database" +msgstr "Odstranit obrázek z databáze" + +#: FormPictureDatabase.form:55 +msgid "Export image from database" +msgstr "Export obrázku z databáze" + +#: FormPictureDatabase.form:65 +msgid "Update image description" +msgstr "Aktualizace popisu obrázku" diff --git a/app/examples/Database/PictureDatabase/.lang/de.po b/app/examples/Database/PictureDatabase/.lang/de.po new file mode 100644 index 00000000..5a0fb81b --- /dev/null +++ b/app/examples/Database/PictureDatabase/.lang/de.po @@ -0,0 +1,76 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Picture Database Viewer" +msgstr "Bilddatenbank-Betrachter" + +#: FormPictureDatabase.class:68 +msgid "Thumb" +msgstr "Vorschau" + +#: FormPictureDatabase.class:70 +msgid "Description" +msgstr "Beschreibung" + +#: FormPictureDatabase.class:113 +msgid "Are you sure you want to delete image " +msgstr "Soll dieses Bild wirklich gelöscht werden " + +#: FormPictureDatabase.class:114 +msgid "" +" from the database:\n" +"\n" +msgstr "" +" aus der Datenbank:\n" +"\n" + +#: FormPictureDatabase.class:115 +msgid "Cancel" +msgstr "Abbrechen" + +#: FormPictureDatabase.class:115 +msgid "Delete" +msgstr "Löschen" + +#: FormPictureDatabase.class:127 +msgid "Save image from database" +msgstr "Bild aus der Datenbank spechern" + +#: FormPictureDatabase.class:131 +msgid "" +"Error saving image:\n" +"\n" +msgstr "" +"Fehler beim Speichern des Bildes:\n" +"\n" + +#: FormPictureDatabase.form:21 +msgid "Picture Database" +msgstr "Bilddatenbank" + +#: FormPictureDatabase.form:39 +msgid "Add image to database" +msgstr "Bild zur Datenbank hinzufügen" + +#: FormPictureDatabase.form:45 +msgid "Remove Image from database" +msgstr "Bild aus der Datenbank entfernen" + +#: FormPictureDatabase.form:55 +msgid "Export image from database" +msgstr "Bild aus der Datenbank exportieren" + +#: FormPictureDatabase.form:65 +msgid "Update image description" +msgstr "Bildbeschreibung aktualisieren" diff --git a/app/examples/Database/PictureDatabase/.lang/es.po b/app/examples/Database/PictureDatabase/.lang/es.po new file mode 100644 index 00000000..65910ccc --- /dev/null +++ b/app/examples/Database/PictureDatabase/.lang/es.po @@ -0,0 +1,36 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: FormPictureDatabase.class:270 +msgid "Add image to database" +msgstr "Agregar imagen a la base de datos" + +#: FormPictureDatabase.class:288 +msgid "Export image from database" +msgstr "Exportar imagen desde la base de datos" + +#: FormPictureDatabase.class:252 +msgid "Picture Database" +msgstr "Base de datos de imágenes" + +#: .project:1 +msgid "Picture Database Viewer" +msgstr "Visor de la base de datos de imágenes" + +#: FormPictureDatabase.class:277 +msgid "Remove Image from database" +msgstr "Remover imagen de la base de datos" + +#: FormPictureDatabase.class:299 +msgid "Update image description" +msgstr "Actualizar descripción de la imagen" + diff --git a/app/examples/Database/PictureDatabase/.lang/nl.po b/app/examples/Database/PictureDatabase/.lang/nl.po new file mode 100644 index 00000000..bf304c93 --- /dev/null +++ b/app/examples/Database/PictureDatabase/.lang/nl.po @@ -0,0 +1,67 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PictureDatabase 3.5.90\n" +"PO-Revision-Date: 2014-09-25 21:01 UTC\n" +"Last-Translator: Willy Raets \n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Picture Database Viewer" +msgstr "AfbeeldingsDatabase Viewer" + +#: FormPictureDatabase.form:21 +msgid "Picture Database" +msgstr "AfbeeldingsDatabase" + +#: FormPictureDatabase.form:39 +msgid "Add image to database" +msgstr "Afbeelding aan database toevoegen" + +#: FormPictureDatabase.form:45 +msgid "Remove Image from database" +msgstr "Verwijder Afbeelding uit Database" + +#: FormPictureDatabase.form:55 +msgid "Export image from database" +msgstr "Exporteer afbeelding uit database" + +#: FormPictureDatabase.form:65 +msgid "Update image description" +msgstr "Afbeeldingomschrijving updaten" + +#: FormPictureDatabase.class:68 +msgid "Thumb" +msgstr "Pictogrammen" + +#: FormPictureDatabase.class:70 +msgid "Description" +msgstr "Omschrijving" + +#: FormPictureDatabase.class:113 +msgid "Are you sure you want to delete image " +msgstr "Weet je zeker dat je de afbeelding wilt verwijderen?" + +#: FormPictureDatabase.class:114 +msgid " from the database:\n\n" +msgstr " van de database:\n\n" + +#: FormPictureDatabase.class:115 +msgid "Delete" +msgstr "Verwijder" + +#: FormPictureDatabase.class:115 +msgid "Cancel" +msgstr "Annuleer" + +#: FormPictureDatabase.class:127 +msgid "Save image from database" +msgstr "Afbeelding uit database opslaan" + +#: FormPictureDatabase.class:131 +msgid "Error saving image:\n\n" +msgstr "Fout bij opslaan van afbeelding:\n\n" + diff --git a/app/examples/Database/PictureDatabase/.lang/ru.po b/app/examples/Database/PictureDatabase/.lang/ru.po new file mode 100644 index 00000000..703b9564 --- /dev/null +++ b/app/examples/Database/PictureDatabase/.lang/ru.po @@ -0,0 +1,194 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-30 08:04+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Database/PictureDatabase/.project:25 +msgid "Picture Database Viewer" +msgstr "Просмотрщик базы данных изображений" + +#: app/examples/Database/PictureDatabase/.src/ModuleDatabase.module:1 +msgid "sqlite3" +msgstr "sqlite3" + +#: app/examples/Database/PictureDatabase/.src/ModuleDatabase.module:2 +msgid "mysql" +msgstr "mysql" + +#: app/examples/Database/PictureDatabase/.src/ModuleDatabase.module:3 +msgid "postgresql" +msgstr "postgresql" + +#: app/examples/Database/PictureDatabase/.src/ModuleDatabase.module:4 +msgid "Could not open database connection" +msgstr "Не удалось открыть соединение с базой данных" + +#: app/examples/Database/PictureDatabase/.src/ModuleDatabase.module:5 +msgid "Database not found. Creating new database" +msgstr "База данных не найдена. Создание новой базы данных" + +#: app/examples/Database/PictureDatabase/.src/ModuleDatabase.module:6 +msgid "Could not open database" +msgstr "Не удалось открыть базу данных" + +#: app/examples/Database/PictureDatabase/.src/ModuleDatabase.module:7 app/examples/Database/PictureDatabase/.src/ModuleDatabase.module:9 app/examples/Database/PictureDatabase/.src/ModuleDatabase.module:12 app/examples/Database/PictureDatabase/.src/ModuleDatabase.module:18 +msgid "pictures" +msgstr "изображения" + +#: app/examples/Database/PictureDatabase/.src/ModuleDatabase.module:8 +msgid "Database tables not found. Creating new pictures table" +msgstr "Таблицы базы данных не найдены. Создание новой таблицы изображений" + +#: app/examples/Database/PictureDatabase/.src/ModuleDatabase.module:10 +msgid "Database connection error:" +msgstr "Ошибка подключения к базе данных:" + +#: app/examples/Database/PictureDatabase/.src/ModuleDatabase.module:11 +msgid "Error:" +msgstr "Ошибка:" + +#: app/examples/Database/PictureDatabase/.src/ModuleDatabase.module:13 +msgid "Image" +msgstr "Изображение" + +#: app/examples/Database/PictureDatabase/.src/ModuleDatabase.module:14 +msgid "added:" +msgstr "добавлено:" + +#: app/examples/Database/PictureDatabase/.src/ModuleDatabase.module:15 +msgid "Done in" +msgstr "Завершено за" + +#: app/examples/Database/PictureDatabase/.src/ModuleDatabase.module:16 +msgid "s" +msgstr "с" + +#: app/examples/Database/PictureDatabase/.src/ModuleDatabase.module:17 +msgid "Add database record error


Error:
" +msgstr "Ошибка добавления записи базы данных
Ошибка:
" + +#: app/examples/Database/PictureDatabase/.src/ModuleDatabase.module:19 +msgid "Select database records error
Error:
" +msgstr "Ошибка выбора записей базы данных
Ошибка:
" + +#: app/examples/Database/PictureDatabase/.src/ModuleDatabase.module:20 +msgid "Update database record error
Error:
" +msgstr "Ошибка обновления записи базы данных
Ошибка:
" + +#: app/examples/Database/PictureDatabase/.src/ModuleDatabase.module:21 +msgid "Delete database record error
Error:
" +msgstr "Ошибка удаления записи базы данных
Ошибка:
" + +#: app/examples/Database/PictureDatabase/.src/ModuleDatabase.module:22 +msgid "Error closing database" +msgstr "Ошибка закрытия базы данных" + +#: app/examples/Database/PictureDatabase/.src/FormPictureDatabase.class:101 app/examples/Database/PictureDatabase/.src/FormPictureDatabase.form:19 +msgid "Add image to database" +msgstr "Добавить изображение в базу данных" + +#: app/examples/Database/PictureDatabase/.src/FormPictureDatabase.class:113 +msgid "Are you sure you want to delete image " +msgstr "Вы уверены, что хотите удалить изображение " + +#: app/examples/Database/PictureDatabase/.src/FormPictureDatabase.class:114 +msgid "" +" from the database:\n" +"\n" +msgstr "" +" из базы данных:\n" +"\n" + +#: app/examples/Database/PictureDatabase/.src/FormPictureDatabase.class:115 +msgid "Delete" +msgstr "Удалить" + +#: app/examples/Database/PictureDatabase/.src/FormPictureDatabase.class:115 +msgid "Cancel" +msgstr "Отмена" + +#: app/examples/Database/PictureDatabase/.src/FormPictureDatabase.class:127 +msgid "Save image from database" +msgstr "Сохранить изображение из базы данных" + +#: app/examples/Database/PictureDatabase/.src/FormPictureDatabase.class:131 +msgid "" +"Error saving image:\n" +"\n" +msgstr "" +"Ошибка сохранения изображения:\n" +"\n" + +#: app/examples/Database/PictureDatabase/.src/FormPictureDatabase.class:208 +msgid "All Graphics" +msgstr "Все графические" + +#: app/examples/Database/PictureDatabase/.src/FormPictureDatabase.class:211 +msgid "Portable Network Graphics" +msgstr "Портативная сетевая графика" + +#: app/examples/Database/PictureDatabase/.src/FormPictureDatabase.class:213 +msgid "Joint Photographic Experts Group" +msgstr "Объединённая группа фото-экспертов" + +#: app/examples/Database/PictureDatabase/.src/FormPictureDatabase.class:215 +msgid "Windows Bitmap" +msgstr "Растр Windows" + +#: app/examples/Database/PictureDatabase/.src/FormPictureDatabase.class:217 +msgid "Graphics Interchange Format" +msgstr "Графический формат обмена" + +#: app/examples/Database/PictureDatabase/.src/FormPictureDatabase.class:219 +msgid "X PixMap" +msgstr "X PixMap" + +#: app/examples/Database/PictureDatabase/.src/FormPictureDatabase.class:222 +msgid "All Files" +msgstr "Все файлы" + +#: app/examples/Database/PictureDatabase/.src/FormPictureDatabase.form:5 +msgid "Picture Database" +msgstr "База данных изображений" + +#: app/examples/Database/PictureDatabase/.src/FormPictureDatabase.form:24 +msgid "Remove Image from database" +msgstr "Удалить изображение из базы данных" + +#: app/examples/Database/PictureDatabase/.src/FormPictureDatabase.form:32 +msgid "Export image from database" +msgstr "Экспортировать изображение из базы данных" + +#: app/examples/Database/PictureDatabase/.src/FormPictureDatabase.form:40 +msgid "Update image description" +msgstr "Обновить описание изображения" + +#: app/examples/Database/PictureDatabase/.src/workaround:1 +msgid "Thumb" +msgstr "Эскиз" + +#: app/examples/Database/PictureDatabase/.src/workaround:2 +msgid "Description" +msgstr "Описание" + diff --git a/app/examples/Database/PictureDatabase/.project b/app/examples/Database/PictureDatabase/.project new file mode 100644 index 00000000..1f962604 --- /dev/null +++ b/app/examples/Database/PictureDatabase/.project @@ -0,0 +1,25 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.5.90 +Title=Picture Database Viewer +Startup=FormPictureDatabase +Icon=Images/image-x-generic.png +Version=3.6.2 +VersionFile=1 +Component=gb.image +Component=gb.gui +Component=gb.form +Component=gb.db +Authors="Timothy Marshal-Nichols\ntimothy.marshal-nichols@ntlworld.com" +Environment="GB_GUI=gb.gtk" +TabSize=2 +Translate=1 +Language=fr +Maintainer=fabien +Vendor=Princeton +Address=fabien@arcalis +License=General Public Licence +Packager=1 +Systems=slackware +Menus=slackware:"Electronics" +Categories=slackware:"Database;Documentation" +Groups=slackware:"Development/Tools" diff --git a/app/examples/Database/PictureDatabase/.src/FormPictureDatabase.class b/app/examples/Database/PictureDatabase/.src/FormPictureDatabase.class new file mode 100644 index 00000000..7e3b884d --- /dev/null +++ b/app/examples/Database/PictureDatabase/.src/FormPictureDatabase.class @@ -0,0 +1,227 @@ +' Gambas class file + +''' +' Name: FormPictureDatabase +' Author: Timothy Marshal-Nichols +' eMail: timothy.marshal-nichols@ntlworld.com +' Version: 1.0 +' Version Date: April 2007 +' Version History: +' +''' +' Licence Information +' +' 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 2 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, write to the Free Software +' Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +' +' http://www.gnu.org/licenses/gpl.html +' +''' +' Description: +' +' Provides the interface to the pictures database. +' +''' +' Developed using Gambas2 Version +' +' Version: 1.9.48 +' +' Gambas Components Used: +' +' gb - Gambas internal native classes +' gb.qt - Graphical QT toolkit component +' +' Look in the Project menu then Properties... and select +' the Components tab. Check that the listed components +' are in the project. +' +''' +' External Dependencies: +' +' None. +' +''' +' Class Usage: +' +' Set as startup class +' +''' + +Public Sub Form_Open() + + 'DB.Debug = True + + Me.Center() + Dialog.Path = User.Home + GridViewImages.Columns.Count = 2 + GridViewImages.Columns[0].Text = ("Thumb") + GridViewImages.Columns[0].Width = 1.5 * ModuleDatabase.ThumbSize + GridViewImages.Columns[1].Text = ("Description") + GridViewImages.Columns[1].Width = 300 + ' Open database + ' + ' Use somthing like this for a SQLite3 database + ModuleDatabase.OpenDatabase("sqlite3", User.Home, Application.Name & ".db", "", "") + ' + ' Use somthing like this for a MySQL database + 'ModuleDatabase.OpenDatabase("mysql", "", Application.Name, "root", "") + ' + ' Use somthing like this for a PostgreSQL database + 'ModuleDatabase.OpenDatabase("postgresql", "localhost", Application.Name, "timothy", "password") + ' + ' Display the database content + ModuleDatabase.Select() + DisplayImages() +Catch + PanelButtons.Enabled = False + Message.Warning(ERROR.Text) +End + +Public Sub Form_Close() + ModuleDatabase.CloseDatabase() +End + +''' +''' Buttons +''' + +Public Sub ToolButtonAdd_Click() + Dialog.Filter = FileFilter(True) + Dialog.Title = ("Add image to database") + If Dialog.OpenFile() Then Return + ModuleDatabase.Add(Dialog.Path) + ModuleDatabase.Select() + DisplayImages() +Catch + Message.Warning(ERROR.Text) +End + +Public Sub ToolButtonRemove_Click() + Dim m As String + If GridViewImages.Row >= 0 Then + m = ("Are you sure you want to delete image ") & (GridViewImages.Row + 1) + m &= (" from the database:\n\n") & TextAreaDescription.Text + If Message.Question(m, ("Delete"), ("Cancel")) = 1 Then + ModuleDatabase.Delete(GridViewImages.Row) + ModuleDatabase.Select() + DisplayImages() + End If + End If +Catch + Message.Warning(ERROR.Text) +End + +Public Sub ToolButtonExport_Click() + Dialog.Filter = FileFilter(False) + Dialog.Title = ("Save image from database") + If Dialog.SaveFile() Then Return + PictureBoxImage.Picture.Save(Dialog.Path) +Catch + Message.Warning(("Error saving image:\n\n") & ERROR.Text) +End + +Public Sub ToolButtonUpdate_Click() + ModuleDatabase.Update(GridViewImages.Row, TextAreaDescription.Text) + GridViewImages[GridViewImages.Row, 1].Text = TextAreaDescription.Text +Catch + Message.Warning(ERROR.Text) +End + +''' +''' GridView events +''' + +Public Sub GridViewImages_Click() + If GridViewImages.Row >= 0 Then + ShowImage(GridViewImages.Row) + End If +End + +''' +''' Functions +''' + +Private Sub DisplayImages() + Dim i As Integer + Dim tempFile As String + Dim tempPicture As String + GridViewImages.Clear() + GridViewImages.Rows.Count = ModuleDatabase.ResultPictures.Count + If ModuleDatabase.ResultPictures.Count > 0 Then + tempFile = Temp() & ".png" + For Each ModuleDatabase.ResultPictures + i = ModuleDatabase.ResultPictures.Index + tempPicture = ModuleDatabase.ResultPictures["thumb"].Data + If tempPicture Then + File.Save(tempFile, tempPicture) + GridViewImages[i, 0].Picture = Picture.Load(tempFile) + End If + GridViewImages[i, 1].Text = ModuleDatabase.ResultPictures["description"] + Next + GridViewImages.Row = 0 + ShowImage(0) + Else + TextAreaDescription.Text = "" + PictureBoxImage.Picture = Null + PictureBoxImage.Resize(1, 1) + End If + If Exist(tempFile) Then Kill tempFile + GridViewImages.Rows.Height = ModuleDatabase.ThumbSize + ToolButtonRemove.Enabled = (GridViewImages.Rows.Count > 0) + ToolButtonExport.Enabled = ToolButtonRemove.Enabled + ToolButtonUpdate.Enabled = ToolButtonRemove.Enabled +End + +Private Sub ShowImage(Row As Integer) + Dim tempFile As String + Dim tempPicture As String + tempFile = Temp() & ".png" + ModuleDatabase.ResultPictures.MoveTo(Row) + TextAreaDescription.Text = ModuleDatabase.ResultPictures["description"] + If tempFile Then + 'tempPicture = ModuleDatabase.ResultPictures["image"].Data + File.Save(tempFile, ModuleDatabase.ResultPictures["image"].Data) + PictureBoxImage.Picture = Picture.Load(tempFile) + PictureBoxImage.Resize(PictureBoxImage.Picture.Width, PictureBoxImage.Picture.Height) + Else + PictureBoxImage.Picture = Null + End If + If Exist(tempFile) Then Kill tempFile +End + +' Filter for our user file open dialog. All image types supported by Gambas +Private Function FileFilter(Optional All As Boolean = False) As String[] + Dim filter As New String[] + If All Then + filter.Add("*.png;*.jpeg;*.jpg;*.bmp;*.gif;*.xpm") + filter.Add(("All Graphics")) + End If + filter.Add("*.png") + filter.Add(("Portable Network Graphics")) + filter.Add("*.jpeg *.jpg") + filter.Add(("Joint Photographic Experts Group")) + filter.Add("*.bmp") + filter.Add(("Windows Bitmap")) + filter.Add("*.gif") + filter.Add(("Graphics Interchange Format")) + filter.Add("*.xpm") + filter.Add(("X PixMap")) + If All Then + filter.Add("*") + filter.Add(("All Files")) + End If + Return filter +End + +''' End of class FormPictureDatabase ''' diff --git a/app/examples/Database/PictureDatabase/.src/FormPictureDatabase.form b/app/examples/Database/PictureDatabase/.src/FormPictureDatabase.form new file mode 100644 index 00000000..49edc095 --- /dev/null +++ b/app/examples/Database/PictureDatabase/.src/FormPictureDatabase.form @@ -0,0 +1,67 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,62,47) + Text = ("Picture Database") + Icon = Picture["Images/image-x-generic.png"] + Arrangement = Arrange.Vertical + { HSplit1 HSplit + MoveScaled(0,0,60,46) + Expand = True + { PanelButtons Panel + MoveScaled(0,0,21,42) + Arrangement = Arrange.Vertical + { HPanel1 HPanel + MoveScaled(0,0,21,5) + AutoResize = True + { ToolButtonAdd ToolButton + MoveScaled(0,0,5,5) + ToolTip = ("Add image to database") + Picture = Picture["Images/list-add.png"] + } + { ToolButtonRemove ToolButton + MoveScaled(5,0,5,5) + ToolTip = ("Remove Image from database") + Picture = Picture["Images/list-remove.png"] + } + { Separator1 Separator + MoveScaled(8,0,2,4) + } + { ToolButtonExport ToolButton + MoveScaled(10,0,5,5) + ToolTip = ("Export image from database") + Picture = Picture["Images/document-save-as.png"] + } + { Separator2 Separator + MoveScaled(14,0,2,4) + } + { ToolButtonUpdate ToolButton + MoveScaled(16,0,5,5) + ToolTip = ("Update image description") + Picture = Picture["Images/document-save.png"] + } + } + { GridViewImages GridView + MoveScaled(1,6,19,28) + Expand = True + Header = GridView.Both + Border = False + } + } + { VSplit1 VSplit + MoveScaled(23,1,34,44) + { TextAreaDescription TextArea + MoveScaled(0,0,23,7) + Wrap = True + Border = False + } + { ScrollView1 ScrollView + MoveScaled(0,7,24,35) + { PictureBoxImage PictureBox + MoveScaled(0,0,18,25) + Stretch = True + } + } + } + } +} diff --git a/app/examples/Database/PictureDatabase/.src/ModuleDatabase.module b/app/examples/Database/PictureDatabase/.src/ModuleDatabase.module new file mode 100644 index 00000000..374caf69 --- /dev/null +++ b/app/examples/Database/PictureDatabase/.src/ModuleDatabase.module @@ -0,0 +1,215 @@ +' Gambas module file + +''' +' Name: ModuleDatabase +' Author: Timothy Marshal-Nichols +' eMail: timothy.marshal-nichols@ntlworld.com +' Version: 1.0 +' Version Date: April 2007 +' Version History: +' +''' +' Licence Information +' +' 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 2 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, write to the Free Software +' Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +' +' http://www.gnu.org/licenses/gpl.html +' +''' +' Description: +' +' Provides the interface to the pictures database. +' +''' +' Developed using Gambas2 Version +' +' Version: 1.9.48 +' +' Gambas Components Used: +' +' gb - Gambas internal native classes +' gb.db - Database access +' +' Look in the Project menu then Properties... and select +' the Components tab. Check that the listed components +' are in the project. +' +''' +' External Dependencies: +' +' The required type of database must exist. +' +''' +' Class Usage: +' +' Open the pictures database. If the database or table does not +' exist then they are created. +' +' Use somthing like this for a SQLite3 database +' +' ModuleDatabase.OpenDatabase("sqlite3", User.Home, Application.Name, "", "") +' +' Use somthing like this for a MySQL database +' +' ModuleDatabase.OpenDatabase("mysql", "localhost", Application.Name, "mysql", "password") +' +' Use somthing like this for a PostgreSQL database +' +' ModuleDatabase.OpenDatabase("postgresql", "localhost", Application.Name, "timothy", "password") +' +' Call the Select() method to update items and then use ResultPictures to access the data. +' +' ModuleDatabase.Select() +' ModuleDatabase.ResultPictures.MoveTo(Row) +' +' You can then use the Add(), Update() and Delete() methods to change the database. +' +' ModuleDatabase.Add(Path) +' ModuleDatabase.Update(Row, NewDescription) +' ModuleDatabase.Delete(Row) +' +' Call the CloseDatabase method before you quit your application +' +' ModuleDatabase.CloseDatabase() +' +''' + +Public Const ThumbSize As Integer = 36 +Public ResultPictures As Result + +Private databaseConnection As New Connection +Private tempFile As String + +Public Sub _init() + tempFile = Temp() & ".png" +End + +' Opens the pictures database. If the database or table does not +' exist then they are created. +Public Sub OpenDatabase(DBType As String, DBHost As String, DBName As String, UserName As String, UserPassword As String) + Dim pictureTable As Table + Dim errorMessageHeader As String + ' If you wnat to see the commands sent to the + ' database then uncommant this line + ' DB.Debug = TRUE + ' DBName = Lower(DBName) + ' Open a connection (to the database server only) + databaseConnection.Type = Lower(DBType) + databaseConnection.Host = DBHost + databaseConnection.Name = "" + databaseConnection.Login = UserName + databaseConnection.Password = UserPassword + databaseConnection.Port = "" + ' Open the connection + Try databaseConnection.Open() + If Error Then + errorMessageHeader = ("Could not open database connection") & " " & DBHost + Error.Raise(Error.Text) + End If + ' Check if the server connection has a database with the + ' required database name. + If Not databaseConnection.Databases.Exist(DBName) Then + Print ("Database not found. Creating new database") + ' Create a new database + databaseConnection.Databases.Add(DBName) + ' I found I needed this with a SQLite database + ' (but not with a MySQL database) + Wait 0.5 + End If + ' Close the server connection + databaseConnection.Close() + ' Open a connection to the database + databaseConnection.Host = DBHost + databaseConnection.Name = DBName + Try databaseConnection.Open() + If Error Then + errorMessageHeader = ("Could not open database") & " " & DBName & " on " & DBHost + Error.Raise(Error.Text) + End If + ' Check if the database has a pictures table + If Not databaseConnection.Tables.Exist("pictures") Then + Print ("Database tables not found. Creating new pictures table") + ' Add a picture table to the database + pictureTable = databaseConnection.Tables.Add("pictures") + pictureTable.Fields.Add("id", db.Serial) ' id field as autoinc integer + pictureTable.Fields.Add("thumb", db.Blob) ' thumb field as blob + pictureTable.Fields.Add("image", db.Blob) ' ' image field as blob + pictureTable.Fields.Add("description", db.String, 0) ' description field as unlimited string + pictureTable.PrimaryKey = ["id"] + pictureTable.Update() + End If +Catch + If errorMessageHeader = "" Then + errorMessageHeader = ("Database connection error:") & " " & DBName & " on " & DBHost + End If + Error.Raise("" & errorMessageHeader & "
" & ("Error:") & "
" & DConv(Error.Text)) +End + +Public Sub Add(ImagePath As String) + Dim img As Image + Dim newPicture As Result + 'Dim pictureData As String + Dim scale As Float + Dim eTime As Float + newPicture = databaseConnection.Create("pictures") + ' Save temp image as png file + img = Image.Load(ImagePath) + img.Save(tempFile) + newPicture["image"] = File.Load(tempFile) + ' Create image thumb + If img.Width > thumbSize Or img.Height > thumbSize Then + ' Calc factor to scale isotropic + scale = Min(ThumbSize / img.Width, ThumbSize / img.Height) + img = img.Stretch(img.Width * scale, img.Height * scale) + img.Save(tempFile) + End If + newPicture["thumb"] = File.Load(tempFile) + ' Add description and update + newPicture["description"] = ("Image") & " " & File.BaseName(ImagePath) & " " & ("added:") & " " & Format(Now, "dddd, dd mmmm yyyy hh:nn:ss") + eTime = Timer + newPicture.Update() + Print ("Done in") & " "; Format(Timer - eTime, "#.###"); " " & ("s") + If Exist(tempFile) Then Kill tempFile +Catch + Error.Raise(("Add database record error
Error:
") & DConv(Error.Text)) +End + +Public Sub Select() + ResultPictures = databaseConnection.Edit("pictures") +Catch + Error.Raise(("Select database records error
Error:
") & DConv(Error.Text)) +End + +Public Sub Update(Row As Integer, Description As String) + ResultPictures.MoveTo(Row) + ResultPictures["description"] = Conv(Description, Desktop.Charset, databaseConnection.Charset) + ResultPictures.Update() +Catch + Error.Raise(("Update database record error
Error:
") & DConv(Error.Text)) +End + +Public Sub Delete(Row As Integer) + ResultPictures.MoveTo(Row) + ResultPictures.Delete() +Catch + Error.Raise(("Delete database record error
Error:
") & DConv(Error.Text)) +End + +Public Sub CloseDatabase() + Try databaseConnection.Close() + If Error Then Print ("Error closing database") +End + +''' End of ModuleDatabase ''' diff --git a/app/examples/Database/PictureDatabase/Images/document-save-as.png b/app/examples/Database/PictureDatabase/Images/document-save-as.png new file mode 100644 index 0000000000000000000000000000000000000000..fcd8c919711476175e6a2d5cb21df82ec8bcbb74 GIT binary patch literal 845 zcmV-T1G4;yP)hVPfM9)Y zTY7SQfo*PZYj}udZg6XEaBFUGYi@9BZg6XEaBJu1=iuPrZg6X7X=G+-WXsFT$jHc5 zS5sA2Q#fafkG9)&snuhk&O2<8M}4DosMKqv(@KD-UYf^SmcdhuwOEq9V4cfuaBFpW zY-ov-RC0TAb!+za_F$aKgN1rjcZW1-O4+Sr?&ndsQhplq= z?d`a@xasNW=jZ3s*v#VM;jyu>(9qCrbY*UIWzNpd-rwKf-rnBc-`?Kd-{0N<007_L z-{Ilm=;-Lm%F6EU?(p#M@bK~Q@bLQi`v3p`I}llY0000tbW%=J0G;jh$~!Rn^Y#7R zhzxxLg`Nb&yt@eAFq8FSO2vV?YNL@;MowS)ftkFlKo{#H373$lv<00B8k zL_t&-({0Z8Q^GJ5!11{E-g^(MxHSq6YK^A=pBB4$i4gI zT`mYAl$DL4oZLKQEx(|!sCahHQBqoF)$)qUD(AdoVR5OtCe5{V^$n=8soCX{TUy&v z+}_a%XP0wXkypBVQrz1|pjE6uYwKd}7d)^*MG0217>VFPw?-LbSn(*zCT47lxoyBh z+u9C=e+%BlI^JXZ67cZBA?&K^k>^;Ey(h4LY6m7~z~{PZ_zaKX)h`&+;Bnh!;%Prt z4a4Wfe#WSFWkXUx3sQP5JfV~ZwSa`|HzT)qa6v;@)kA>6`_YFnH2z4EJ>lo%^fG}6 zCE>^`5A!JJ;RuiM=o=6saq|9=>NEEB{R1TUH_c|uG|eQNmMol+;K_JKQv^+uf13FN Xun>Ufps_sO00000NkvXXu0mjf*fGY; literal 0 HcmV?d00001 diff --git a/app/examples/Database/PictureDatabase/Images/document-save.png b/app/examples/Database/PictureDatabase/Images/document-save.png new file mode 100644 index 0000000000000000000000000000000000000000..a89f010f2137b11b520783313bc5fdf2ed1837d2 GIT binary patch literal 903 zcmV;219<$2P)hVPfM9)Y zTY7SQfo*PZYj}udZg6XEaBFUGYi@9BZg6XEaBJu1=iuPrZg6X7X=G+-WXsFT$jHc5 zS5sA2Q#fafkG9)&snuhk&O2<8M}4DosMKqv(@KD-UYf^SmcdhuwOEq9V4cfuaBFpW zY-ov-RC0TAb!+za_F$aKgN1rjcZW1-O4+Sr?&ndsQhplq= z?d`a@xasNW=jZ3s*v#VM;jyu>(9qEH^Yg~cz{$?T;^X1*@$t^i&f($V&CSis%*@Eh z$lKf7k&%&@n3$uaqOh>Ava+(fySu!+yv4=E(b3Vsz`)kl*4Nk9l$4a0mzSlbrKzc@ ztgNiMy1K!^!NkPG$;rvZ#l*+Q$1kRBK>z>%H*``?QvjXq^vXLh`t$Yu-Q-){`~Cj* zNx8k$SxE8z{qYOkt{HRFp|XT_X+$t*R<(ov{*SSo{{B`uBMY*N0003-NkliqvqbO1bxWT>a7L_M9Y3~qE{@f+GFS%R*03ad~ z(xRecKxnaX@d=6DJ;tQulu%7gOV2R%8vFVOGP8a;J0~{}T{hx}W1OlPl?)z5< d0-Y#KT|XI$hBxuiCnf*@002ovPDHLkV1n+n60fcu?H8t$*42J5P7M z`+R!Ij+MEcn={)srZ%rnY*-styE>|BWmx(0ppvEjg^RuO7TN{oH_Y67l={b^p)b zcNgz$>{)oQW8T5GIs2Pu?Q58^w|2^oyvnZRtdhLW%~@?5J;IA;tvNM!{qfC*wjaH? zapC5}GghCRw(`W(6~`wpJ2r92(URKk?9#Ttz`(rPsrA$Lctw?ZMi#HwesRT)OUt)k zT(<4v(ybSkY&pMZ^SPdx>w|)WOY0{VRCY{Re%wE<+%+U`{>t6+R_>a&V%MDIJEtz# z(mQi)d}3O7L{vdpV`x}-OaH>YS?j$c3m!dsWbU41>z8ZmpKI-tt?!hiY!<0t60U9$ zVrb)UXzgca?`Lf5t7H;p>=gU>@ngr35{KXt+kip~pF9(fEMxa9BiD2-t8i5lUoGnh zRTDo0=M)R~Br~@px5!$jkTNT;jO>!;qMF|Nwh5=toU-&xjm)0l5mmo=`|cx0j+{Js zvY?{VAt1{!AbZEIU55@Gdi(b6^B2!wynL~4{o1XiqNjn$PNgKsFPNdR>0jP##%cV` z9XdR0ykc_7>RP%6CWdNCvclXf99*32%uL^SZ5}f)Fcx{bIEF}EPEJtZG+33u=)vrfHr7|Kq_lXnW<}kyvbwda>K7YZo7*w9WoggEra2^PXG=$0SF^jTr>BdDo0s$Z z>*vc)*wDCse!W9NK!JxxMnr{6N=OM$M1;PXo}HqhrlqQ?sjjWEv9>jPO2;z4ytq2Y z#K1yN&&5VO+>E{`nc7A@QAF-j};v-e>>ALY7g;e%reVt{x`ue)){fUQ<`Oe;+b9YY;rxeig0sW%Q>Ja%l^k|jJWISveq a9FiD(XU>n6v6Zg`6%wAVelF{r5}E)!3h_Pw literal 0 HcmV?d00001 diff --git a/app/examples/Database/PictureDatabase/Images/list-add.png b/app/examples/Database/PictureDatabase/Images/list-add.png new file mode 100644 index 0000000000000000000000000000000000000000..d4d751c9e4c163533061b83a0a1577f145d6acd3 GIT binary patch literal 366 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H3?x5i&EW)6(*k@#T!FMn>JlJH3;?R!dgket zGfy`I(dnlLF2C4)@%f&M&-Yz^x#`r?-4~v3Klg0g*=JkNJll5W+0^Z~r);}DY0Iq% zn{V}QyxFz>X4~4E&8u$Iuee^j?E3tD50)H!R5_tMtW&-3P7y8Ph% zsw0oJ9!50+9mHP}2G25qZ=bq5x;i_#y*<16?rmaW(_g$u61{f$xJX*kGjoF{>4~Y%VkyrbJYixLHRso77w#%Dvr|*E cGh@qQVkkA{aBa={%?1iDPgg&ebxsLQ06^xHVE_OC literal 0 HcmV?d00001 diff --git a/app/examples/Database/PictureDatabase/Images/list-remove.png b/app/examples/Database/PictureDatabase/Images/list-remove.png new file mode 100644 index 0000000000000000000000000000000000000000..902624de5a28d1191b6f4ce9e6163cea028fcd6d GIT binary patch literal 282 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 M07*qoM6N<$f=#3V(f|Me literal 0 HcmV?d00001 diff --git a/app/examples/Drawing/AnalogWatch/.lang/ru.po b/app/examples/Drawing/AnalogWatch/.lang/ru.po new file mode 100644 index 00000000..28a5cfeb --- /dev/null +++ b/app/examples/Drawing/AnalogWatch/.lang/ru.po @@ -0,0 +1,72 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Drawing/AnalogWatch/.project:19 +msgid "Analog watch" +msgstr "Аналоговые часы" + +#: app/examples/Drawing/AnalogWatch/.project:20 +msgid "" +"Analog watch example.\n" +"\n" +"This example uses the Paint class to draw an anti-aliased analog watch." +msgstr "" +"Пример аналоговых часов.\n" +"\n" +"В этом примере класс Paint используется для рисования аналоговых часов с сглаживанием." + +#: app/examples/Drawing/AnalogWatch/.src/FrmClock.class:122 +msgid "" +"Analog Clock Example Program for Gambas\n" +"Written by: Ahmad Kamal and Benoît Minisini" +msgstr "" +"Пример программы аналоговых часов для Gambas\n" +"Авторы: Ахмад Камаль и Бенуа Минисини" + +#: app/examples/Drawing/AnalogWatch/.src/FrmClock.form:5 +msgid "Analog clock" +msgstr "Аналоговые часы" + +#: app/examples/Drawing/AnalogWatch/.src/FrmClock.form:8 +msgid "File" +msgstr "Файл" + +#: app/examples/Drawing/AnalogWatch/.src/FrmClock.form:11 +msgid "&About" +msgstr "О программе" + +#: app/examples/Drawing/AnalogWatch/.src/FrmClock.form:17 +msgid "E&xit" +msgstr "Выход" + +#: app/examples/Drawing/AnalogWatch/.src/FrmClock.form:23 +msgid "" +"Resize Window and the clock will follow \n" +"Right click for a menu" +msgstr "" +"Изменить размер окна, и часы последуют тому же\n" +"Правая кнопка мыши для меню" + diff --git a/app/examples/Drawing/AnalogWatch/.project b/app/examples/Drawing/AnalogWatch/.project new file mode 100644 index 00000000..6e9aed87 --- /dev/null +++ b/app/examples/Drawing/AnalogWatch/.project @@ -0,0 +1,18 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.6.90 +Title=Analog watch +Startup=FrmClock +Icon=timer.png +Version=1.0.0 +Component=gb.image +Component=gb.gui +Description="Analog watch example.\n\nThis example uses the Paint class to draw an anti-aliased analog watch." +Environment="GB_GUI=gb.qt" +TabSize=2 +Maintainer=fabien +Vendor=Example +Address=fabien@arcalis +License=General Public Licence +Packager=1 +Screenshot=2014-12-14.png +Translate=1 diff --git a/app/examples/Drawing/AnalogWatch/.src/FrmClock.class b/app/examples/Drawing/AnalogWatch/.src/FrmClock.class new file mode 100644 index 00000000..0a163bfc --- /dev/null +++ b/app/examples/Drawing/AnalogWatch/.src/FrmClock.class @@ -0,0 +1,152 @@ +' Gambas class file + +'***********Analog Clock Example Program************************ +'***********By: Ahmad Kamal ****************** +'***********Written for Gambas: gambas.sourceforge.net********** +'***********V1.0: 22-July-2003*************************************** +'***********V1.1: 24-July-2003 Optimized by Benoit himself ;)***** + +Private $iLast As Integer +Private $dNow As Date + +' Fixed coordinate system +' We use the transformation matrix for scaling +Private Const W As Integer = 1024 +Private Const H As Integer = 1024 + +Public Sub TimerClk_Timer() + + If Second(Now) = $iLast Then Return + $dNow = Now + + dwgArea.Refresh + +End + +' Main routine that updates the clock + +Public Sub DrawClock() + + Dim angle As Float + Dim dNow As Date + Dim eScale As Float + Dim sTime As String + + eScale = Min(dwgArea.Width / W, dwgArea.Height / H) + + Paint.Translate(dwgArea.W / 2, dwgArea.H / 2) + Paint.Scale(eScale, eScale) + + dNow = $dNow + $iLast = Second(dNow) + + Paint.Brush = Paint.Color(&HDCDCDC&) 'Light gray color + Paint.Arc(0, 0, W / 2) + Paint.Fill + Paint.Brush = Paint.Color(dwgArea.Background) + Paint.Arc(0, 0, W / 2 * 0.9) + Paint.Fill + + sTime = Format(dNow, "hh:nn:ss") + + Paint.Font.Bold = True + Paint.Font.Size = 60 + Paint.Brush = Paint.Color(Color.Black) + Paint.Text(sTime, -W / 2, -H * 0.4, W, H * 0.1, Align.Top) + Paint.Fill + + ' Draw seconds + angle = Second(dNow) / 60 * Pi(2) - Pi(0.5) 'The angle that the arm makes, with a line from clock center to 12O'clock + + Paint.Brush = Paint.Color(Color.SetAlpha(Color.Red, 128)) + Paint.LineWidth = 6 + Paint.MoveTo(0, 0) + Paint.LineTo(Cos(angle) * W / 2, Sin(angle) * H / 2) + Paint.Stroke + + ' Draw minutes + angle = CFloat(Time(dNow)) * 24 * Pi(2) - Pi(0.5) + + Paint.Brush = Paint.Color(Color.SetAlpha(Color.Black, 128)) + Paint.MoveTo(Cos(angle) * W * 0.45, Sin(angle) * H * 0.45) + Paint.LineTo(Sin(angle) * W * 0.05, -Cos(angle) * H * 0.05) + Paint.LineTo(-Sin(angle) * W * 0.05, Cos(angle) * H * 0.05) + Paint.Fill + + ' Draw hours + angle = CFloat(Time(dNow)) * 2 * Pi(2) - Pi(0.5) + + Paint.Brush = Paint.Color(Color.SetAlpha(Color.Black, 128)) + Paint.MoveTo(Cos(angle) * W * 0.35, Sin(angle) * H * 0.35) + Paint.LineTo(Sin(angle) * W * 0.05, -Cos(angle) * H * 0.05) + Paint.LineTo(-Sin(angle) * W * 0.05, Cos(angle) * H * 0.05) + Paint.Fill + + ' Draw circle on the center of the clock to hide the arms intersection + + Paint.Brush = Paint.Color(Color.Black) + Paint.Arc(0, 0, 0.1 * W) + Paint.Fill + + DrawFrame + +End + +' Draw the clock frame + +Public Sub DrawFrame() + + Dim I As Integer + Dim angle As Float + + Paint.Brush = Paint.Color(Color.SetAlpha(Color.Black, 64)) + + For I = 0 To 59 + If I % 5 = 0 Then + Paint.LineWidth = 12 + Else + Paint.LineWidth = 2 + Endif + angle = Pi(2) * I / 60 + Paint.MoveTo(Cos(angle) * 0.45 * W, Sin(angle) * 0.45 * H) + Paint.LineTo(Cos(angle) * W / 2, Sin(angle) * H / 2) + Paint.Stroke + Next + +End + + +Public Sub MenuAbout_Click() + + Dim AboutMessage As String + AboutMessage = ("Analog Clock Example Program for Gambas\nWritten by: Ahmad Kamal and Benoît Minisini") + + Message.info(AboutMessage) + +End + + +Public Sub MenuExit_Click() + + Me.Close + +End + + +Public Sub DwgArea_Menu() + + MenuPopUp.popup + +End + +Public Sub DwgArea_Draw() + + DrawClock + +End + +Public Sub Form_Open() + + TimerClk_Timer + +End diff --git a/app/examples/Drawing/AnalogWatch/.src/FrmClock.form b/app/examples/Drawing/AnalogWatch/.src/FrmClock.form new file mode 100644 index 00000000..c8746890 --- /dev/null +++ b/app/examples/Drawing/AnalogWatch/.src/FrmClock.form @@ -0,0 +1,30 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(52.2857,29,39,39) + Text = ("Analog clock") + Arrangement = Arrange.Fill + { MenuPopUp Menu + Text = ("File") + Visible = False + { MenuAbout Menu + Text = ("&About") + Shortcut = "F11" + } + { MenuSep Menu + } + { MenuExit Menu + Text = ("E&xit") + } + } + { DwgArea DrawingArea + MoveScaled(2,0,21,24) + Background = Color.LightBackground + ToolTip = ("Resize Window and the clock will follow \nRight click for a menu") + } + { TimerClk #Timer + #MoveScaled(17.1429,2.2857) + Enabled = True + Delay = 250 + } +} diff --git a/app/examples/Drawing/AnalogWatch/timer.png b/app/examples/Drawing/AnalogWatch/timer.png new file mode 100644 index 0000000000000000000000000000000000000000..6708fdd27788c95fe589ee232dff093831b8041a GIT binary patch literal 2778 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 literal 0 HcmV?d00001 diff --git a/app/examples/Drawing/Barcode/.directory b/app/examples/Drawing/Barcode/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/app/examples/Drawing/Barcode/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/app/examples/Drawing/Barcode/.icon.png b/app/examples/Drawing/Barcode/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a4e3ec072e2c2cc337c467973d2ee992b03419c1 GIT binary patch literal 3990 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\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: FMain.class:280 +msgid "About..." +msgstr "Quant a..." + +#: .project:2 +msgid "A module to print EAN-13 barcodes. The barcode is constructed from first principles (http://en.wikipedia.org/wiki/European_Article_Number). The barcode can be formatted for screen or printer." +msgstr "Un mòdul per a imprimir codis de barres EAN-13. Els codis de barres es construeixen des de zero (http://en.wikipedia.org/wiki/European_Article_Number). El codi de barres pot tenir format per pantalla o per impressora." + +#: FMain.class:221 +msgid "Barcode" +msgstr "Codi de barres" + +#: .project:1 +msgid "Barcode Printing" +msgstr "Impressió de codi de barres" + +#: FMain.class:285 +msgid "E&xit" +msgstr "&Surt" + +#: FMain.class:236 +msgid "Height" +msgstr "Alçada" + +#: FMain.class:72 +msgid "Please enter a valid 13 digit EAN-13 number" +msgstr "Introduïu un número EAN-13 vàlid de 13 dígits" + +#: FMain.class:226 +msgid "PosX" +msgstr "-" + +#: FMain.class:231 +msgid "PosY" +msgstr "-" + +#: FMain.class:275 +msgid "&Print Barcode" +msgstr "Im&primeix el codi de barres" + +#: FMain.class:269 +msgid "&Refresh Barcode" +msgstr "&Actualitza el codi de barres" + +#: FMain.class:246 +msgid "Size for printer" +msgstr "Mida per la impressora" + +#: FMain.class:251 +msgid "Size for screen" +msgstr "Mida per la pantalla" + +#: FMain.class:153 +msgid "" +"This program was made by Charles Guerin and\n" +"modified by Benoît Minisini." +msgstr "" +"Aquest programa va ser creat per Charles Guerin i\n" +"modificat per Benoît Minisini." + +#: FMain.class:241 +msgid "Width" +msgstr "Amplada" + diff --git a/app/examples/Drawing/Barcode/.lang/cs.po b/app/examples/Drawing/Barcode/.lang/cs.po new file mode 100644 index 00000000..9368d9a5 --- /dev/null +++ b/app/examples/Drawing/Barcode/.lang/cs.po @@ -0,0 +1,76 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Barcode Printing" +msgstr "Tisk čárových kódů" + +#: .project:2 +msgid "A module to print EAN-13 barcodes. The barcode is constructed from first principles (http://en.wikipedia.org/wiki/European_Article_Number). The barcode can be formatted for screen or printer." +msgstr "Modul pro tisk čárových kódů EAN-13. Čárového kódu je postaven z prvních principů (http://en.wikipedia.org/wiki/European_Article_Number). Čárový kód může být formátovány pro obrazovku nebo tiskárnu." + +#: FMain.class:72 +msgid "Please enter a valid 13 digit EAN-13 number" +msgstr "Zadejte prosím platné 13-ti místné číslo EAN-13" + +#: FMain.class:153 +msgid "" +"This program was made by Charles Guerin and\n" +"modified by Benoît Minisini." +msgstr "" +"Tento program byl vytvořil Charles Guerin a\n" +"upravil Benoît Minisini." + +#: FMain.form:57 +msgid "Barcode" +msgstr "Čárový kód" + +#: FMain.form:62 +msgid "PosX" +msgstr "Pozice X" + +#: FMain.form:67 +msgid "PosY" +msgstr "Pozice Y" + +#: FMain.form:72 +msgid "Height" +msgstr "Výška" + +#: FMain.form:77 +msgid "Width" +msgstr "Šířka" + +#: FMain.form:83 +msgid "Size for printer" +msgstr "Velikost pro tiskárnu" + +#: FMain.form:89 +msgid "Size for screen" +msgstr "Velikost pro obrazovku" + +#: FMain.form:107 +msgid "&Refresh Barcode" +msgstr "&Obnovit čárový kód" + +#: FMain.form:114 +msgid "&Print Barcode" +msgstr "&Tisk čárového kódu" + +#: FMain.form:119 +msgid "About..." +msgstr "O programu..." + +#: FMain.form:124 +msgid "E&xit" +msgstr "&Ukončit" diff --git a/app/examples/Drawing/Barcode/.lang/de.po b/app/examples/Drawing/Barcode/.lang/de.po new file mode 100644 index 00000000..7067c161 --- /dev/null +++ b/app/examples/Drawing/Barcode/.lang/de.po @@ -0,0 +1,76 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Barcode Printing" +msgstr "Barcode drucken" + +#: .project:2 +msgid "A module to print EAN-13 barcodes. The barcode is constructed from first principles (http://en.wikipedia.org/wiki/European_Article_Number). The barcode can be formatted for screen or printer." +msgstr "Ein Modul, um EAN-13 Barcodes zu drucken. Der Barcode wird nach den Regeln (http://en.wikipedia.org/wiki/European_Article_Number) gebildet. Der Barcode kann für den Bildschirm oder für den Drucker formattiert werden." + +#: FMain.class:72 +msgid "Please enter a valid 13 digit EAN-13 number" +msgstr "Bitte gib eine gültige 13-stellige EAN-13 Zahl ein" + +#: FMain.class:153 +msgid "" +"This program was made by Charles Guerin and\n" +"modified by Benoît Minisini." +msgstr "" +"Dieses Programm wurde von Charles Guerin geschrieben\n" +"und von Benoît Minisini verändert." + +#: FMain.form:57 +msgid "Barcode" +msgstr "-" + +#: FMain.form:62 +msgid "PosX" +msgstr "-" + +#: FMain.form:67 +msgid "PosY" +msgstr "-" + +#: FMain.form:72 +msgid "Height" +msgstr "Höhe" + +#: FMain.form:77 +msgid "Width" +msgstr "Breite" + +#: FMain.form:83 +msgid "Size for printer" +msgstr "Größe für Drucker" + +#: FMain.form:89 +msgid "Size for screen" +msgstr "Größe für Bildschirm" + +#: FMain.form:107 +msgid "&Refresh Barcode" +msgstr "Barcode &neu laden" + +#: FMain.form:114 +msgid "&Print Barcode" +msgstr "Barcode &drucken" + +#: FMain.form:119 +msgid "About..." +msgstr "Über..." + +#: FMain.form:124 +msgid "E&xit" +msgstr "&Beenden" diff --git a/app/examples/Drawing/Barcode/.lang/ru.po b/app/examples/Drawing/Barcode/.lang/ru.po new file mode 100644 index 00000000..781038ca --- /dev/null +++ b/app/examples/Drawing/Barcode/.lang/ru.po @@ -0,0 +1,90 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Drawing/Barcode/.project:22 +msgid "Barcode Printing" +msgstr "Печать штрих-кодов" + +#: app/examples/Drawing/Barcode/.project:23 +msgid "A module to print EAN-13 barcodes. The barcode is constructed from first principles (http://en.wikipedia.org/wiki/European_Article_Number). The barcode can be formatted for screen or printer." +msgstr "Модуль для печати штрих-кодов EAN-13. Штрих-код создан на основе первых принципов (https://ru.wikipedia.org/wiki/European_Article_Number). Штрих-код может быть отформатирован для экрана или принтера." + +#: app/examples/Drawing/Barcode/.src/FMain.class:72 +msgid "Please enter a valid 13 digit EAN-13 number" +msgstr "Пожалуйста, введите действительный 13-значный номер EAN-13" + +#: app/examples/Drawing/Barcode/.src/FMain.class:153 +msgid "" +"This program was made by Charles Guerin and\n" +"modified by Benoît Minisini." +msgstr "" +"Эта программа была создана Чарльзом Гереном\n" +"и модифицирована Бенуа Минисини." + +#: app/examples/Drawing/Barcode/.src/FMain.form:29 +msgid "Barcode" +msgstr "Штрих-код" + +#: app/examples/Drawing/Barcode/.src/FMain.form:33 +msgid "PosX" +msgstr "ПозX" + +#: app/examples/Drawing/Barcode/.src/FMain.form:37 +msgid "PosY" +msgstr "ПозY" + +#: app/examples/Drawing/Barcode/.src/FMain.form:41 +msgid "Height" +msgstr "Высота" + +#: app/examples/Drawing/Barcode/.src/FMain.form:45 +msgid "Width" +msgstr "Ширина" + +#: app/examples/Drawing/Barcode/.src/FMain.form:50 +msgid "Size for printer" +msgstr "Размер для принтера" + +#: app/examples/Drawing/Barcode/.src/FMain.form:55 +msgid "Size for screen" +msgstr "Размер для экрана" + +#: app/examples/Drawing/Barcode/.src/FMain.form:70 +msgid "&Refresh Barcode" +msgstr "Освежить штрих-код" + +#: app/examples/Drawing/Barcode/.src/FMain.form:76 +msgid "&Print Barcode" +msgstr "Печать штрих-кода" + +#: app/examples/Drawing/Barcode/.src/FMain.form:80 +msgid "About..." +msgstr "О программе..." + +#: app/examples/Drawing/Barcode/.src/FMain.form:84 +msgid "E&xit" +msgstr "Выход" + diff --git a/app/examples/Drawing/Barcode/.project b/app/examples/Drawing/Barcode/.project new file mode 100644 index 00000000..5bbad76a --- /dev/null +++ b/app/examples/Drawing/Barcode/.project @@ -0,0 +1,21 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.5.90 +Title=Barcode Printing +Startup=FMain +Icon=barcode.png +Version=3.6.2 +VersionFile=1 +Component=gb.image +Component=gb.gui +Description="A module to print EAN-13 barcodes. The barcode is constructed from first principles (http://en.wikipedia.org/wiki/European_Article_Number). The barcode can be formatted for screen or printer." +Environment="GB_GUI=gb.gtk" +TabSize=2 +Translate=1 +Language=de +Maintainer=charles +Address=c_guerin@o2.co.uk +License=General Public Licence +Packager=1 +Systems=ubuntu +Menus=ubuntu:"Apps/Programming" +Groups=ubuntu:"Development/Databases" diff --git a/app/examples/Drawing/Barcode/.src/FMain.class b/app/examples/Drawing/Barcode/.src/FMain.class new file mode 100644 index 00000000..9207a99b --- /dev/null +++ b/app/examples/Drawing/Barcode/.src/FMain.class @@ -0,0 +1,161 @@ +' Gambas class file + +Public bcHeight As Integer +Public barThickness As Integer +'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +Public Sub SizeForScreen() + 'set up typical defaults for barcode size on screen + txtPosX.Text = "60" + txtPosY.text = "8" + txtHeight.Text = "150" + txtWidth.Text = "5" +End +'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +Public Sub SizeForPrinter() + 'set up typical defaults for barcode size on printer + txtPosX.Text = "500" + txtPosY.text = "400" + txtHeight.Text = "250" + txtWidth.Text = "7" +End +'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX +Public Sub ChkInput() + + ' make sure only valid characters + Select Key.Code + Case Key.BackSpace, Key.Tab, Key.Delete, Key.Enter, Key.Return, Key.Escape + Default + If Key.Text And If InStr("0123456789", Key.Text) = 0 Then Stop Event + End Select + +End +'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX + + +Public Sub Form_Open() + 'DrawingArea1.Cached = TRUE + txtBarcode.SetFocus + SizeForScreen + txtBarcode.Text = "8711577011208" 'sample barcode (so what's it for then?) + txtBarcode.Select +End +'------------------------------------------------------------------- +Public Sub btnExit_Click() + + FMain.Close +End + +Private Sub DrawBarCode(Optional bPrinter As Boolean) + + If Not bPrinter Then + + 'DrawingArea1.Refresh + 'Draw.Begin(DrawingArea1) + Draw.Clear + modCrBcode.PrintBarcode(txtBarcode.Text, Val(txtPosX.text), Val(txtPosY.text), Val(txtHeight.text), Val(txtWidth.text), True) + 'Draw.End() + + Else + + Draw.Begin(printer) + modCrBcode.PrintBarcode(txtBarcode.Text, Val(txtPosX.text), Val(txtPosY.text), Val(txtHeight.text), Val(txtWidth.text), False) + Draw.End() + + Endif + +End + + +Public Sub btnRun_Click() + + If Len(txtBarcode.Text) <> 13 Then + Message.Error(("Please enter a valid 13 digit EAN-13 number")) + Else + If Val(txtPosX.Text) = 0 Then + If rbutScreen Then + txtPosX.Text = "40" + Else + txtPosX.Text = "500" + Endif + Endif + If Val(txtPosY.Text) = 0 Then + If rbutScreen Then + txtPosY.Text = "0" + Else + txtPosY.Text = "300" + Endif + Endif + If Val(txtHeight.Text) = 0 Then + If rbutScreen Then + txtHeight.Text = "150" + Else + txtHeight.Text = "250" + Endif + Endif + If Val(txtWidth.Text) = 0 Then + If rbutScreen Then + txtWidth.Text = "5" + Else + txtWidth.Text = "7" + Endif + Endif + + 'DrawBarCode + DrawingArea1.Refresh + + Endif + +End +'------------------------------------------------------------------- +Public Sub rbutPrinter_Click() + SizeForPrinter +End +'------------------------------------------------------------------- +Public Sub rbutScreen_Click() + SizeForScreen +End +'------------------------------------------------------------------- +Public Sub txtPosX_KeyPress() + ChkInput +End +'------------------------------------------------------------------- +Public Sub txtBarcode_KeyPress() + ChkInput +End +'------------------------------------------------------------------- +Public Sub txtPosY_KeyPress() + ChkInput +End +'------------------------------------------------------------------- +Public Sub txtHeight_KeyPress() + ChkInput +End +'------------------------------------------------------------------- +Public Sub txtWidth_KeyPress() + ChkInput +End +'------------------------------------------------------------------- + +' PUBLIC SUB Form_Resize() +' +' DrawBarCode +' +' END + +Public Sub btnPrint_Click() + + DrawBarCode(True) + +End + +Public Sub btnAbout_Click() + + Message.Info(("This program was made by Charles Guerin and\nmodified by Benoît Minisini.")) + +End + +Public Sub DrawingArea1_Draw() + + DrawBarCode + +End diff --git a/app/examples/Drawing/Barcode/.src/FMain.form b/app/examples/Drawing/Barcode/.src/FMain.form new file mode 100644 index 00000000..1a293c03 --- /dev/null +++ b/app/examples/Drawing/Barcode/.src/FMain.form @@ -0,0 +1,88 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,106,62) + Icon = Picture["barcode.png"] + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + Padding = 8 + { Panel1 Panel + MoveScaled(1,1,95,8) + { txtBarcode TextBox + MoveScaled(0,4,24,4) + } + { txtPosX TextBox + MoveScaled(25,4,8,4) + } + { txtPosY TextBox + MoveScaled(34,4,8,4) + } + { txtHeight TextBox + MoveScaled(43,4,8,4) + } + { txtWidth TextBox + MoveScaled(52,4,8,4) + } + { Label1 Label + MoveScaled(0,0,18,4) + Text = ("Barcode") + } + { Label2 Label + MoveScaled(25,0,7,4) + Text = ("PosX") + } + { Label3 Label + MoveScaled(34,0,6,4) + Text = ("PosY") + } + { Label4 Label + MoveScaled(43,0,8,4) + Text = ("Height") + } + { Label5 Label + MoveScaled(52,0,8,4) + Text = ("Width") + } + { rbutPrinter RadioButton + MoveScaled(63,3,27,4) + Visible = False + Text = ("Size for printer") + } + { rbutScreen RadioButton + MoveScaled(63,0,27,4) + Visible = False + Text = ("Size for screen") + Value = True + } + } + { DrawingArea1 DrawingArea + MoveScaled(1,10,104,45) + Background = Color.TextBackground + Expand = True + Border = Border.Sunken + } + { HBox1 HBox + MoveScaled(1,56,104,5) + Spacing = True + { btnRun Button + MoveScaled(0,0,25.1429,4) + Text = ("&Refresh Barcode") + Default = True + } + { btnPrint Button + MoveScaled(26,0,25,4) + Visible = False + Text = ("&Print Barcode") + } + { btnAbout Button + MoveScaled(52,0,25.1429,4) + Text = ("About...") + } + { btnExit Button + MoveScaled(78,0,25.1429,4) + Text = ("E&xit") + Cancel = True + } + } +} diff --git a/app/examples/Drawing/Barcode/.src/modCrBcode.module b/app/examples/Drawing/Barcode/.src/modCrBcode.module new file mode 100644 index 00000000..453a0e5a --- /dev/null +++ b/app/examples/Drawing/Barcode/.src/modCrBcode.module @@ -0,0 +1,98 @@ +' Gambas module file + +Public Sub PrintBarcode(bcode As String, posX As Integer, posY As Integer, bcHeight As Integer, barThickness As Integer, SorP As Boolean) + Dim structure As New String[10] + 'DIM enc AS String[10, 3]. I did it the following way 'cos I get not get the prg to read a multi-dimension array! + Dim enc1 As New String[10] + Dim enc2 As New String[10] + Dim enc3 As New String[10] + Dim fontSizeScreen As New Integer[10] + Dim fontSizePrinter As New Integer[10] + + Dim first6 As String ' encoding for first 6: l-code(1), g-code(2) + Dim j As Integer + Dim l As Integer + Dim k As Integer + Dim frst As Integer 'the first digit + Dim num As Integer 'each digit in turn + Dim bars As String ' the bars for the digit + 'Dim thkns As Integer 'thickness of each bar + Dim LinePos As Integer 'used to horizontaly locate the next bar + + ' + structure = ["111111", "112122", "112212", "112221", "121122", "122112", "122211", "121212", "121221", "122121"] + enc1 = ["0001101", "0011001", "0010011", "0111101", "0100011", "0110001", "0101111", "0111011", "0110111", "0001011"] + enc2 = ["0100111", "0110011", "0011011", "0100001", "0011101", "0111001", "0000101", "0010001", "0001001", "0010111"] + enc3 = ["1110010", "1100110", "1101100", "1000010", "1011100", "1001110", "1010000", "1000100", "1001000", "1110100"] + fontSizeScreen = [6, 9, 12, 16, 20, 24, 26, 28, 28, 30] + fontSizePrinter = [2, 2, 2, 4, 4, 6, 6, 8, 8, 10] + + frst = Val(Left(bcode, 1)) + first6 = structure[frst] + + 'draw 1st 2 deep bars----------------------------------------------- + For l = 1 To barThickness + Draw.Line(l + posX, 1 + posY, l + posX, bcHeight * 1.2 + posY) + Next + LinePos = LinePos + barThickness * 2 'allows for following gap + For l = 1 To barThickness + Draw.Line(LinePos + l + posX, 1 + posY, LinePos + l + posX, bcHeight * 1.2 + posY) + Next + LinePos = LinePos + barThickness + '--------------------------------------------------------------- + For j = 2 To 13 'loop through each of the 12 digits + num = Val(Mid$(bcode, j, 1)) 'find the individual number IN the first 6 + If j < 8 Then 'different for first 6 + If Val(Mid(first6, j - 1, 1)) = 1 Then 'find the bars making up that number (L,G or R) + bars = enc1[num] + Else + bars = enc2[num] + Endif + Else + bars = enc3[num] + Endif + + 'put the 2 middle deep bars---------------------------------------- + If j = 8 Then + LinePos = LinePos + barThickness + For l = 1 To barThickness + Draw.Line(linepos + l + posX, 1 + posY, linepos + l + posX, bcHeight * 1.2 + posY) + Next + LinePos = LinePos + barThickness * 2 'allows for following gap + For l = 1 To barThickness + Draw.Line(LinePos + l + posX, 1 + posY, LinePos + l + posX, bcHeight * 1.2 + posY) + Next + LinePos = LinePos + barThickness * 2 'allows for following gap + Endif + '--------------------------------------------------------------- + For k = 1 To 7 'draw bars for single digit + If Mid(bars, k, 1) = "1" Then + For l = 1 To barThickness + Draw.Line(linepos + l + posX, 1 + posY, LinePos + l + posX, bcHeight + posY) + Next + Endif + linepos = LinePos + barThickness + Next + Next + + 'draw last 2 deep bars------------------------------------------------ + For l = 1 To barThickness + Draw.Line(linepos + l + posX, 1 + posY, linepos + l + posX, bcHeight * 1.2 + posY) + Next + LinePos = LinePos + barThickness * 2 'allows for following gap + For l = 1 To barThickness + Draw.Line(LinePos + l + posX, 1 + posY, LinePos + l + posX, bcHeight * 1.2 + posY) + Next + '--------------------------------------------------------------- + 'write the barcode text + If SorP Then + Draw.Font.Size = fontSizeScreen[barThickness - 1] + Else + Draw.Font.Size = fontSizePrinter[barThickness - 1] + Endif + Draw.Text(Left(bcode, 1), posX - barThickness * 6, posY + bcHeight * 1.02) + Draw.Text(Mid(bcode, 2, 6), posX + barThickness * 9, posY + bcHeight * 1.02) + Draw.Text(Right(bcode, 6), posX + barThickness * 58, posY + bcHeight * 1.02) + + +End diff --git a/app/examples/Drawing/Barcode/barcode.png b/app/examples/Drawing/Barcode/barcode.png new file mode 100644 index 0000000000000000000000000000000000000000..a62216848a8334bb7eddc90a77d633afcbfa8ccb GIT binary patch literal 765 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 literal 0 HcmV?d00001 diff --git a/app/examples/Drawing/Chart/.lang/ca.po b/app/examples/Drawing/Chart/.lang/ca.po new file mode 100644 index 00000000..612abf34 --- /dev/null +++ b/app/examples/Drawing/Chart/.lang/ca.po @@ -0,0 +1,85 @@ +# Catalan translation of Chart +# Copyright (C) 2000-2010 Benoît Minisini. +# This file is distributed under the same license as the Chart package. +# Jordi Sayol , 2007-2010. +# +# +msgid "" +msgstr "" +"Project-Id-Version: Chart\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2010-12-16 23:34+0100\n" +"Last-Translator: Jordi Sayol \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: FormChart.class:129 +msgid "Example to make a Bar Chart" +msgstr "Exemple de fer un gràfic de barres" + +#: FormChart.class:146 FormData.class:172 +msgid "&Close" +msgstr "&Tanca" + +#: FormChart.class:151 +msgid "&About" +msgstr "&Quant a" + +#: FormChart.class:158 +msgid "(%)" +msgstr "-" + +#: FormData.class:62 +msgid "Chart example" +msgstr "Exemple de gràfic" + +#: FormData.class:67 +msgid "Data 1" +msgstr "Dada 1" + +#: FormData.class:72 +msgid "Data 2" +msgstr "Dada 2" + +#: FormData.class:77 +msgid "Data 3" +msgstr "Dada 3" + +#: FormData.class:82 +msgid "Data 4" +msgstr "Dada 4" + +#: FormData.class:87 +msgid "Data 5" +msgstr "Dada 5" + +#: FormData.class:92 +msgid "Data 6" +msgstr "Dada 6" + +#: FormData.class:97 +msgid "Data 7" +msgstr "Dada 7" + +#: FormData.class:102 +msgid "Data 8" +msgstr "Dada 8" + +#: FormData.class:107 +msgid "Data 9" +msgstr "Dada 9" + +#: FormData.class:112 +msgid "Data 10" +msgstr "Dada 10" + +#: FormData.class:167 +msgid "&Draw it" +msgstr "&Dibuixa'l" + +#~ msgid "Bar Chart" +#~ msgstr "Gràfic de barres" diff --git a/app/examples/Drawing/Chart/.lang/cs.po b/app/examples/Drawing/Chart/.lang/cs.po new file mode 100644 index 00000000..b785f3f3 --- /dev/null +++ b/app/examples/Drawing/Chart/.lang/cs.po @@ -0,0 +1,84 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Bar Chart" +msgstr "Sloupcový graf" + +#: FormChart.form:13 +msgid "Example to make a Bar Chart" +msgstr "Příklad na vytvoření sloupcového grafu" + +#: FormChart.form:30 FormData.form:130 +msgid "&Close" +msgstr "&Zavřít" + +#: FormChart.form:35 +msgid "&About" +msgstr "&O..." + +#: FormChart.form:42 +msgid "(%)" +msgstr "-" + +#: FormData.form:30 +msgid "Chart example" +msgstr "Příklad grafu" + +#: FormData.form:35 +msgid "Data 1" +msgstr "-" + +#: FormData.form:40 +msgid "Data 2" +msgstr "-" + +#: FormData.form:45 +msgid "Data 3" +msgstr "-" + +#: FormData.form:50 +msgid "Data 4" +msgstr "-" + +#: FormData.form:55 +msgid "Data 5" +msgstr "-" + +#: FormData.form:60 +msgid "Data 6" +msgstr "-" + +#: FormData.form:65 +msgid "Data 7" +msgstr "-" + +#: FormData.form:70 +msgid "Data 8" +msgstr "-" + +#: FormData.form:75 +msgid "Data 9" +msgstr "Data 9" + +#: FormData.form:80 +msgid "Data 10" +msgstr "-" + +#: FormData.form:125 +msgid "&Draw it" +msgstr "&Kresli" + +#: FormData.form:135 +msgid "&Random" +msgstr "&Náhodně" diff --git a/app/examples/Drawing/Chart/.lang/de.po b/app/examples/Drawing/Chart/.lang/de.po new file mode 100644 index 00000000..f6a4cdbc --- /dev/null +++ b/app/examples/Drawing/Chart/.lang/de.po @@ -0,0 +1,81 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Bar Chart" +msgstr "Balkendiagramm" + +#: FormChart.form:13 +msgid "Example to make a Bar Chart" +msgstr "Beispiel für ein Balkendiagramm" + +#: FormChart.form:30 FormData.form:139 +msgid "&Close" +msgstr "&Schließen" + +#: FormChart.form:35 +msgid "&About" +msgstr "&Über" + +#: FormChart.form:42 +msgid "(%)" +msgstr "-" + +#: FormData.form:29 +msgid "Chart example" +msgstr "Diagramm-Beispiel" + +#: FormData.form:34 +msgid "Data 1" +msgstr "Wert 1" + +#: FormData.form:39 +msgid "Data 2" +msgstr "Wert 2" + +#: FormData.form:44 +msgid "Data 3" +msgstr "Wert 3" + +#: FormData.form:49 +msgid "Data 4" +msgstr "Wert 4" + +#: FormData.form:54 +msgid "Data 5" +msgstr "Wert 5" + +#: FormData.form:59 +msgid "Data 6" +msgstr "Wert 6" + +#: FormData.form:64 +msgid "Data 7" +msgstr "Wert 7" + +#: FormData.form:69 +msgid "Data 8" +msgstr "Wert 8" + +#: FormData.form:74 +msgid "Data 9" +msgstr "Wert 9" + +#: FormData.form:79 +msgid "Data 10" +msgstr "Wert 10" + +#: FormData.form:134 +msgid "&Draw it" +msgstr "&Zeichnen" + diff --git a/app/examples/Drawing/Chart/.lang/es.po b/app/examples/Drawing/Chart/.lang/es.po new file mode 100644 index 00000000..89edca99 --- /dev/null +++ b/app/examples/Drawing/Chart/.lang/es.po @@ -0,0 +1,78 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: FormChart.class:129 +msgid "Example to make a Bar Chart" +msgstr "Ejemplo para hacer un Gráfico de Barras" + +#: FormChart.class:146 FormData.class:172 +msgid "&Close" +msgstr "&Cerrar" + +#: FormChart.class:151 +msgid "&About" +msgstr "&Acerca de" + +#: FormChart.class:158 +msgid "(%)" +msgstr "(%)" + +#: FormData.class:62 +msgid "Chart example" +msgstr "Ejemplo de gráficos" + +#: FormData.class:67 +msgid "Data 1" +msgstr "Dato 1" + +#: FormData.class:72 +msgid "Data 2" +msgstr "Dato 2" + +#: FormData.class:77 +msgid "Data 3" +msgstr "Dato 3" + +#: FormData.class:82 +msgid "Data 4" +msgstr "Dato 4" + +#: FormData.class:87 +msgid "Data 5" +msgstr "Dato 5" + +#: FormData.class:92 +msgid "Data 6" +msgstr "Dato 6" + +#: FormData.class:97 +msgid "Data 7" +msgstr "Dato 7" + +#: FormData.class:102 +msgid "Data 8" +msgstr "Dato 8" + +#: FormData.class:107 +msgid "Data 9" +msgstr "Dato 9" + +#: FormData.class:112 +msgid "Data 10" +msgstr "Dato 10" + +#: FormData.class:167 +msgid "&Draw it" +msgstr "&Dibujarlo" + +#~ msgid "Bar Chart" +#~ msgstr "Gráfico de barras" diff --git a/app/examples/Drawing/Chart/.lang/ru.po b/app/examples/Drawing/Chart/.lang/ru.po new file mode 100644 index 00000000..041f5ac3 --- /dev/null +++ b/app/examples/Drawing/Chart/.lang/ru.po @@ -0,0 +1,114 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-28 09:00+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Drawing/Chart/.project:18 +msgid "Bar Chart" +msgstr "Гистограмма" + +#: app/examples/Drawing/Chart/.project:19 +msgid "Example to make bar chart" +msgstr "Пример создания гистограммы" + +#: app/examples/Drawing/Chart/.src/FormChart.class:104 +msgid "

Example to make bar chart

\n" +msgstr "

Пример создания гистограммы

\n" + +#: app/examples/Drawing/Chart/.src/FormChart.class:105 +msgid "This example has made by : " +msgstr "Этот пример сделан: " + +#: app/examples/Drawing/Chart/.src/FormChart.class:109 +msgid "Thank You" +msgstr "Спасибо" + +#: app/examples/Drawing/Chart/.src/FormChart.class:110 app/examples/Drawing/Chart/.src/FormChart.form:20 app/examples/Drawing/Chart/.src/FormData.form:83 +msgid "&Close" +msgstr "Закрыть" + +#: app/examples/Drawing/Chart/.src/FormChart.form:6 +msgid "Example to make a Bar Chart" +msgstr "Пример создания гистограммы" + +#: app/examples/Drawing/Chart/.src/FormChart.form:24 +msgid "&About" +msgstr "О программе" + +#: app/examples/Drawing/Chart/.src/FormChart.form:30 +msgid "(%)" +msgstr "(%)" + +#: app/examples/Drawing/Chart/.src/FormData.form:5 +msgid "Chart example" +msgstr "Пример диаграммы" + +#: app/examples/Drawing/Chart/.src/FormData.form:9 +msgid "Data 1" +msgstr "№ 1" + +#: app/examples/Drawing/Chart/.src/FormData.form:13 +msgid "Data 2" +msgstr "№ 2" + +#: app/examples/Drawing/Chart/.src/FormData.form:17 +msgid "Data 3" +msgstr "№ 3" + +#: app/examples/Drawing/Chart/.src/FormData.form:21 +msgid "Data 4" +msgstr "№ 4" + +#: app/examples/Drawing/Chart/.src/FormData.form:25 +msgid "Data 5" +msgstr "№ 5" + +#: app/examples/Drawing/Chart/.src/FormData.form:29 +msgid "Data 6" +msgstr "№ 6" + +#: app/examples/Drawing/Chart/.src/FormData.form:33 +msgid "Data 7" +msgstr "№ 7" + +#: app/examples/Drawing/Chart/.src/FormData.form:37 +msgid "Data 8" +msgstr "№ 8" + +#: app/examples/Drawing/Chart/.src/FormData.form:41 +msgid "Data 9" +msgstr "№ 9" + +#: app/examples/Drawing/Chart/.src/FormData.form:45 +msgid "Data 10" +msgstr "№ 10" + +#: app/examples/Drawing/Chart/.src/FormData.form:79 +msgid "&Draw it" +msgstr "Рисовать это" + +#: app/examples/Drawing/Chart/.src/FormData.form:87 +msgid "&Random" +msgstr "Случайно" + diff --git a/app/examples/Drawing/Chart/.project b/app/examples/Drawing/Chart/.project new file mode 100644 index 00000000..d8073a77 --- /dev/null +++ b/app/examples/Drawing/Chart/.project @@ -0,0 +1,17 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.0.0 +Title=Bar Chart +Description="Example to make bar chart" +Startup=FormData +Icon=graph.png +Version=3.6.2 +VersionFile=1 +Component=gb.image +Component=gb.gui +TabSize=2 +Translate=1 +Language=fr +Maintainer=fabien +Vendor=Princeton +Address=fabien@arcalis +License=General Public Licence diff --git a/app/examples/Drawing/Chart/.src/FormChart.class b/app/examples/Drawing/Chart/.src/FormChart.class new file mode 100644 index 00000000..a78f456f --- /dev/null +++ b/app/examples/Drawing/Chart/.src/FormChart.class @@ -0,0 +1,112 @@ +' Gambas class file + +' ====================================== +' This example is to make a bar chart +' using DrawingArea +' may be it can help you to make a chart +' if you have any question you can send to +' yudi@kecoak.or.id +' Thank You + + +Public total As Integer +Public value As Float[] + +Public Sub btnClose_Click() + + Me.Close + +End + +Public Sub _new() + + Me.Center + +End + + +Public Sub Form_Open() + + Draw_Chart + +End + +Public Sub Draw_Chart() + + Dim i As Integer + + Dim skala_1 As Integer + Dim skala_2 As Integer + + Dim distance_x As Float + Dim distance_y As Float + + Dim width_draw As Integer + Dim tot As Integer + Dim colors As Integer[] + Dim bottom As Integer + Dim sumdata As Integer + + colors = New Integer[] + colors.Resize(total + 1) + + For i = 1 To total + sumdata = sumdata + value[i] + Next + + If sumdata = 0 Then sumdata = 1 + + For i = 1 To total + value[i] = (value[i] / sumdata) * 10 + Next + + drwchart.Clear + + draw.Begin(drwchart) + + skala_1 = drwchart.ClientH / 11 + distance_y = drwchart.ClientH - skala_1 + bottom = distance_y + 8 + + For i = 0 To 100 Step 10 + draw.Foreground = color.black + draw.Text(i, 0, distance_y) + draw.Line(25, distance_y + 8, drwchart.clientw, distance_y + 8) + distance_y = distance_y - skala_1 + Next + + draw.Line(30, 0, 30, drwchart.ClientH) + + skala_2 = (drwchart.ClientW - 30) \ 10 + distance_x = skala_2 + 30 + width_draw = skala_2 / 2 + + For i = 1 To Total + draw.LineWidth = 1 + draw.Foreground = color.Black + draw.Text(i, distance_x - (width_draw / 2) - 16, drwchart.ClientH - drwChart.Font.Height, 32, drwChart.Font.Height, Align.Center) + draw.Line(distance_x - (width_draw / 2), 0, distance_x - (width_draw / 2), drwchart.ClientH - skala_1 + 8) + draw.LineWidth = width_draw + draw.Foreground = color.RGB(i * 100, i * 10, i * 50) + colors[i] = draw.Foreground + tot = skala_1 * value[i] + skala_1 - 8 + draw.Line(distance_x - (width_draw / 2), bottom, distance_x - (width_draw / 2), drwchart.ClientH - tot) + distance_x = distance_x + skala_2 + Next + + Draw.End + +End + +Public Sub btnAbout_Click() + + Dim i As String + i = ("

Example to make bar chart

\n") + i = i & ("This example has made by : ") & Chr(10) + i = i & " Yudi Astira" & Chr(10) + i = i & " yudi@kecoak.or.id" & Chr(10) + i = i & " necrose #hdteam on Dal.Net" & Chr(10) + i = i & ("Thank You") + message.Info(i, ("&Close")) + +End diff --git a/app/examples/Drawing/Chart/.src/FormChart.form b/app/examples/Drawing/Chart/.src/FormChart.form new file mode 100644 index 00000000..241f2a5d --- /dev/null +++ b/app/examples/Drawing/Chart/.src/FormChart.form @@ -0,0 +1,32 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,72,51) + Background = &HFFEFBF& + Text = ("Example to make a Bar Chart") + Resizable = False + { bg PictureBox + MoveScaled(1,1,70.1429,43.1429) + Background = &HFFFFFF& + Border = Border.Plain + } + { drwChart DrawingArea + MoveScaled(2,2,69,41) + Background = &HFFFFFF& + Cached = True + } + { btnClose Button + MoveScaled(50,45,21,5) + Text = ("&Close") + } + { btnAbout Button + MoveScaled(1,45,21,5) + Text = ("&About") + Picture = Picture["graph.png"] + } + { TextLabel1 TextLabel + MoveScaled(2,2,4,3.5714) + Background = &HFFFFFF& + Text = ("(%)") + } +} diff --git a/app/examples/Drawing/Chart/.src/FormData.class b/app/examples/Drawing/Chart/.src/FormData.class new file mode 100644 index 00000000..971cb001 --- /dev/null +++ b/app/examples/Drawing/Chart/.src/FormData.class @@ -0,0 +1,43 @@ +' Gambas class file + +Public Sub btnClose_Click() + + Me.Close + +End + +Public Sub btnDraw_Click() + Dim total As Integer + total = 10 + With FormChart + .value = New Float[] + .total = total + .value.Resize(total + 1) + Try .value[1] = Val(textbox1.Text) + Try .value[2] = Val(textbox2.Text) + Try .value[3] = Val(textbox3.Text) + Try .value[4] = Val(textbox4.Text) + Try .value[5] = Val(textbox5.Text) + Try .value[6] = Val(textbox6.Text) + Try .value[7] = Val(textbox7.Text) + Try .value[8] = Val(textbox8.Text) + Try .value[9] = Val(textbox9.Text) + Try .value[10] = Val(textbox10.Text) + .Show + End With + +End + +Public Sub btnRandom_Click() + + Dim hCtrl As Control + + For Each hCtrl In Me.Children + + If hCtrl Is TextBox Then + TextBox(hCtrl).Text = CStr(Int(Exp(Rnd(Log(2), 6)))) + Endif + + Next + +End diff --git a/app/examples/Drawing/Chart/.src/FormData.form b/app/examples/Drawing/Chart/.src/FormData.form new file mode 100644 index 00000000..3a003188 --- /dev/null +++ b/app/examples/Drawing/Chart/.src/FormData.form @@ -0,0 +1,89 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(29.7143,16.1429,50,53) + Text = ("Chart example") + Resizable = False + { TextLabel1 TextLabel + MoveScaled(3,2,6.7143,3.1429) + Text = ("Data 1") + } + { TextLabel2 TextLabel + MoveScaled(3,7,6.7143,3.1429) + Text = ("Data 2") + } + { TextLabel3 TextLabel + MoveScaled(3,12,6.7143,3.1429) + Text = ("Data 3") + } + { TextLabel4 TextLabel + MoveScaled(3,17,6.7143,3.1429) + Text = ("Data 4") + } + { TextLabel5 TextLabel + MoveScaled(3,22,6.7143,3.1429) + Text = ("Data 5") + } + { TextLabel6 TextLabel + MoveScaled(3,27,6.7143,3.1429) + Text = ("Data 6") + } + { TextLabel7 TextLabel + MoveScaled(3,32,6.7143,3.1429) + Text = ("Data 7") + } + { TextLabel8 TextLabel + MoveScaled(3,37,6.7143,3.1429) + Text = ("Data 8") + } + { TextLabel9 TextLabel + MoveScaled(3,42,6.7143,3.1429) + Text = ("Data 9") + } + { TextLabel10 TextLabel + MoveScaled(3,47,9,3) + Text = ("Data 10") + } + { TextBox1 TextBox + MoveScaled(13,2,14,4) + } + { TextBox2 TextBox + MoveScaled(13,7,14,4) + } + { TextBox3 TextBox + MoveScaled(13,12,14,4) + } + { TextBox4 TextBox + MoveScaled(13,17,14,4) + } + { TextBox5 TextBox + MoveScaled(13,22,14,4) + } + { TextBox6 TextBox + MoveScaled(13,27,14,4) + } + { TextBox7 TextBox + MoveScaled(13,32,14,4) + } + { TextBox8 TextBox + MoveScaled(13,37,14,4) + } + { TextBox9 TextBox + MoveScaled(13,42,14,4) + } + { TextBox10 TextBox + MoveScaled(13,47,14,4) + } + { btnDraw Button + MoveScaled(30,2,19,4) + Text = ("&Draw it") + } + { btnClose Button + MoveScaled(30,12,19,4) + Text = ("&Close") + } + { btnRandom Button + MoveScaled(30,7,19,4) + Text = ("&Random") + } +} diff --git a/app/examples/Drawing/Chart/graph.png b/app/examples/Drawing/Chart/graph.png new file mode 100644 index 0000000000000000000000000000000000000000..dfa033e005c085fcbae902f0900eb747abae34f4 GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv=>VS)S0MfW|9>EP;J^Ve<3B?K z1Calp;s236#?e3trjj7PUA|@^hjBG|MB2#)B4;(#u zQ-X&_LCeL-**Rd#1EGS#LKi^+PjByoN(@_AGh8z=3@&tS*^)9rSLx|fRgI_u&K)~; zEZ{0B*^(g6a4RS-j%Ul##fv4cip_~SA+TVwu9t>GBcrg!0wo>>hC9aP7QZ8UCj+f# N@O1TaS?83{1OT}0NqhhR literal 0 HcmV?d00001 diff --git a/app/examples/Drawing/Clock/.directory b/app/examples/Drawing/Clock/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/app/examples/Drawing/Clock/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/app/examples/Drawing/Clock/.icon.png b/app/examples/Drawing/Clock/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..273c0703b97d94a5a105c6a5c20f9824f26e6697 GIT binary patch literal 4367 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 JPDHLkV1i|-R1^RJ literal 0 HcmV?d00001 diff --git a/app/examples/Drawing/Clock/.icon/16.png b/app/examples/Drawing/Clock/.icon/16.png new file mode 100644 index 0000000000000000000000000000000000000000..b298e08375a4526c31c5182fa0986fc20aeb0dba GIT binary patch literal 949 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 QLjV8(07*qoM6N<$f~@Ra7ytkO literal 0 HcmV?d00001 diff --git a/app/examples/Drawing/Clock/.lang/ca.po b/app/examples/Drawing/Clock/.lang/ca.po new file mode 100644 index 00000000..aaff886d --- /dev/null +++ b/app/examples/Drawing/Clock/.lang/ca.po @@ -0,0 +1,63 @@ +# Catalan translation of Clock +# Copyright (C) 2000-2010 Benoît Minisini. +# This file is distributed under the same license as the Clock package. +# Jordi Sayol , 2007-2010. +# +# +msgid "" +msgstr "" +"Project-Id-Version: Clock\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2010-12-16 23:34+0100\n" +"Last-Translator: Jordi Sayol \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: FClock.class:224 +msgid "About" +msgstr "Quant a" + +#: .project:2 +msgid "A clock example made by Fabien Bodard." +msgstr "Un exemple de rellotge fet per en Fabien Bodard." + +#: FClock.class:212 +msgid "Always on top" +msgstr "Sempre per damunt" + +#: FClock.class:179 +msgid "central" +msgstr "central" + +#: .project:1 +msgid "Clock" +msgstr "Rellotge" + +#: FClock.class:184 +msgid "Clock 1" +msgstr "Rellotge 1" + +#: FClock.class:190 +msgid "Clock 2" +msgstr "Rellotge 2" + +#: FClock.class:196 +msgid "Clock 3" +msgstr "Rellotge 3" + +#: FClock.class:203 +msgid "Clock 4" +msgstr "Rellotge 4" + +#: FClock.class:232 +msgid "Quit" +msgstr "Surt" + +#: FClock.class:216 +msgid "Show Window" +msgstr "Mostra la finestra" + diff --git a/app/examples/Drawing/Clock/.lang/cs.po b/app/examples/Drawing/Clock/.lang/cs.po new file mode 100644 index 00000000..a881de9b --- /dev/null +++ b/app/examples/Drawing/Clock/.lang/cs.po @@ -0,0 +1,56 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Clock" +msgstr "Hodiny" + +#: .project:2 +msgid "A clock example made by Fabien Bodard." +msgstr "Příklad hodiny od Fabien Bodard." + +#: FClock.form:25 +msgid "central" +msgstr "centrální" + +#: FClock.form:30 +msgid "Clock 1" +msgstr "Hodiny 1" + +#: FClock.form:36 +msgid "Clock 2" +msgstr "Hodiny 2" + +#: FClock.form:42 +msgid "Clock 3" +msgstr "Hodiny 3" + +#: FClock.form:49 +msgid "Clock 4" +msgstr "Hodiny 4" + +#: FClock.form:57 +msgid "Always on top" +msgstr "Vždy nahoře" + +#: FClock.form:62 +msgid "Show Window" +msgstr "Ukaž okno" + +#: FClock.form:70 +msgid "About" +msgstr "O programu" + +#: FClock.form:77 +msgid "Quit" +msgstr "Ukončit" diff --git a/app/examples/Drawing/Clock/.lang/de.po b/app/examples/Drawing/Clock/.lang/de.po new file mode 100644 index 00000000..5a54a3bb --- /dev/null +++ b/app/examples/Drawing/Clock/.lang/de.po @@ -0,0 +1,57 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Clock" +msgstr "Uhr" + +#: .project:2 +msgid "A clock example made by Fabien Bodard." +msgstr "Ein Beispiel für eine Uhr von Fabien Bodard." + +#: FClock.form:25 +msgid "central" +msgstr "zentral" + +#: FClock.form:30 +msgid "Clock 1" +msgstr "Uhr 1" + +#: FClock.form:36 +msgid "Clock 2" +msgstr "Uhr 2" + +#: FClock.form:42 +msgid "Clock 3" +msgstr "Uhr 3" + +#: FClock.form:49 +msgid "Clock 4" +msgstr "Uhr 4" + +#: FClock.form:57 +msgid "Always on top" +msgstr "Immer im Vordergrund" + +#: FClock.form:62 +msgid "Show Window" +msgstr "Fenster zeigen" + +#: FClock.form:70 +msgid "About" +msgstr "Über" + +#: FClock.form:77 +msgid "Quit" +msgstr "Beenden" + diff --git a/app/examples/Drawing/Clock/.lang/es.po b/app/examples/Drawing/Clock/.lang/es.po new file mode 100644 index 00000000..30fc57cd --- /dev/null +++ b/app/examples/Drawing/Clock/.lang/es.po @@ -0,0 +1,53 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: FClock.class:195 +msgid "central" +msgstr "central" + +#: FClock.class:200 +msgid "Clock 1" +msgstr "Reloj 1" + +#: FClock.class:206 +msgid "Clock 2" +msgstr "Reloj 2" + +#: FClock.class:212 +msgid "Clock 3" +msgstr "Reloj 3" + +#: FClock.class:219 +msgid "Clock 4" +msgstr "Reloj 4" + +#: FClock.class:228 +msgid "Always on top" +msgstr "Siempre al frente" + +#: FClock.class:233 +msgid "Show Window" +msgstr "Mostrar ventana" + +#: FClock.class:242 +msgid "About" +msgstr "Acerca de" + +#: FClock.class:250 +msgid "Quit" +msgstr "Salir" + +#~ msgid "Clock" +#~ msgstr "Reloj" + +#~ msgid "A clock example made by Fabien Bodard." +#~ msgstr "Un ejemplo de reloj hecho por Fabien Bodard." diff --git a/app/examples/Drawing/Clock/.lang/ru.po b/app/examples/Drawing/Clock/.lang/ru.po new file mode 100644 index 00000000..9bc18f6e --- /dev/null +++ b/app/examples/Drawing/Clock/.lang/ru.po @@ -0,0 +1,84 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Drawing/Clock/.project:22 +msgid "Clock" +msgstr "Часы" + +#: app/examples/Drawing/Clock/.project:23 +msgid "A clock example made by Fabien Bodard." +msgstr "Пример часов, сделанный Фабьеном Бодаром." + +#: app/examples/Drawing/Clock/.src/FClock.class:137 +msgid "" +"This example was made by Fabien BODARD\n" +"and was optimized by Benoît MINISINI\n" +"\n" +"Note that the 3rd clock is Microsoft copyrighted.\n" +"You will find it on the future version of windows." +msgstr "" +"Этот пример был сделан Фабьен Бодард\n" +"и был оптимизирован Бенуа Минисини\n" +"\n" +"Обратите внимание, что третьи часы принадлежат Microsoft.\n" +"Вы найдёте их в будущей версии Windows." + +#: app/examples/Drawing/Clock/.src/FClock.form:9 +msgid "central" +msgstr "центральный" + +#: app/examples/Drawing/Clock/.src/FClock.form:13 +msgid "Clock 1" +msgstr "Часы 1" + +#: app/examples/Drawing/Clock/.src/FClock.form:18 +msgid "Clock 2" +msgstr "Часы 2" + +#: app/examples/Drawing/Clock/.src/FClock.form:23 +msgid "Clock 3" +msgstr "Часы 3" + +#: app/examples/Drawing/Clock/.src/FClock.form:29 +msgid "Clock 4" +msgstr "Часы 4" + +#: app/examples/Drawing/Clock/.src/FClock.form:35 +msgid "Always on top" +msgstr "Всегда сверху" + +#: app/examples/Drawing/Clock/.src/FClock.form:39 +msgid "Show Window" +msgstr "Показать окно" + +#: app/examples/Drawing/Clock/.src/FClock.form:45 +msgid "About" +msgstr "О программе" + +#: app/examples/Drawing/Clock/.src/FClock.form:50 +msgid "Quit" +msgstr "Выход" + diff --git a/app/examples/Drawing/Clock/.project b/app/examples/Drawing/Clock/.project new file mode 100644 index 00000000..265c5cb9 --- /dev/null +++ b/app/examples/Drawing/Clock/.project @@ -0,0 +1,21 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.8.90 +Title=Clock +Startup=FClock +Icon=img/clock_bg_big4.png +Version=3.8.90 +VersionFile=1 +Component=gb.image +Component=gb.gui +Description="A clock example made by Fabien Bodard." +Environment="GB_GUI=gb.qt5" +TabSize=2 +Translate=1 +Language=fr +Maintainer=fabien +Vendor=Princeton +Address=fabien@arcalis +License=General Public Licence +Prefix=1 +Packager=1 +Systems=mandrake diff --git a/app/examples/Drawing/Clock/.src/FClock.class b/app/examples/Drawing/Clock/.src/FClock.class new file mode 100644 index 00000000..461dcff5 --- /dev/null +++ b/app/examples/Drawing/Clock/.src/FClock.class @@ -0,0 +1,170 @@ +' Gambas class file + +Private picHour As Image +Private picMinute As Image +Private picSecond As Image +Private Clock As Image +Private Buffer As Picture +Private HE As Integer +Private WI As Integer +'PRIVATE BackPicture AS String +Private $MX As Integer +Private $MY As Integer +Private $hMenu As Menu + + +Public Sub DrawTime() + + Dim tmpImg As Image + 'Dim hPict As Picture + Dim hPict As Image + Dim I As Integer + + WI = Clock.Width + HE = Clock.Height + + ' hPict = Clock.Picture + ' Draw.Begin(hPict) + ' tmpImg = picHour.Rotate(- Hour(Now) * Pi(2 / 12)) + ' Draw.Image(tmpImg, WI / 2 - tmpImg.Width / 2, HE / 2 - tmpImg.Height / 2) + ' tmpImg = picMinute.Rotate(- Minute(Now) * Pi(2 / 60)) + ' Draw.Image(tmpImg, WI / 2 - tmpImg.Width / 2, HE / 2 - tmpImg.Height / 2) + ' tmpImg = picSecond.Rotate(- Second(Now) * Pi(2 / 60)) + ' Draw.Image(tmpImg, WI / 2 - tmpImg.Width / 2, HE / 2 - tmpImg.Height / 2) + ' Draw.End + ' + ' Me.Picture = hPict + + 'hPict = New Image(Clock.W, Clock.H, Color.Transparent) + 'hPict.Draw(Clock, 0, 0) + hPict = Clock.Copy() + + 'Draw.Begin(hPict) + 'tmpImg = picHour.Rotate(- Hour(Now) * Pi(2 / 12)) + tmpImg = picHour.Rotate(-((Hour(Now) * 60) + Minute(Now)) * Pi(1 / 360)) + hPict.PaintImage(tmpImg, WI / 2 - tmpImg.Width / 2, HE / 2 - tmpImg.Height / 2) + tmpImg = picMinute.Rotate(-Minute(Now) * Pi(2 / 60)) + hPict.PaintImage(tmpImg, WI / 2 - tmpImg.Width / 2, HE / 2 - tmpImg.Height / 2) + tmpImg = picSecond.Rotate(-Second(Now) * Pi(2 / 60)) + hPict.PaintImage(tmpImg, WI / 2 - tmpImg.Width / 2, HE / 2 - tmpImg.Height / 2) + 'Draw.End + + Me.Picture = hPict.Picture + 'Me.Mask = Not mnuShowWindow.Value + +End + +Private Sub SetClock(iClock As Integer) + + Dim hImage As Image + Dim hBuffer As Image + Dim hMenu As Menu + Dim X, Y As Integer + Dim iColor As Integer + Dim iGray As Integer + + hImage = Image.Load("img/clock_bg_big" & iClock & ".png") + + ' hBuffer = NEW Image(hImage.Width + 2, hImage.Height + 2, TRUE) + ' hBuffer.Draw(hImage, 1, 0) + ' hBuffer.Draw(hImage, 1, 2) + ' hBuffer.Draw(hImage, 0, 1) + ' hBuffer.Draw(hImage, 2, 1) + ' + ' FOR X = 0 TO hImage.Width - 1 + ' FOR Y = 0 TO hImage.Height - 1 + ' iColor = hBuffer[X, Y] + ' iGray = &H80 'Color[iColor].Value + ' iColor = Color.RGB(iGray, iGray, iGray, Color[iColor].Alpha) + ' hBuffer[X, Y] = iColor + ' NEXT + ' NEXT + ' + ' hBuffer.Draw(hImage, 1, 1) + ' hImage = hBuffer + + Clock = hImage '.Picture + DrawTime + + For Each hMenu In mnuPopup.Children + If hMenu.Tag Then + hMenu.Checked = Val(hMenu.Tag) = iClock + Endif + Next + +End + + +Public Sub Form_Open() + + picMinute = Image.Load("img/arrow_min.png") + picHour = Image.Load("img/arrow_hour.png") + picSecond = Image.Load("img/arrow_sec.png") + + SetClock(3) + Timer1.Enabled = True + +End + +Public Sub Timer1_Timer() + + DrawTime() + +End + + +Public Sub Form_Menu() + + mnuPopup.Popup + +End + +Public Sub mnuClock_Click() + + SetClock(Val(Last.Tag)) + +End + + +Public Sub mnuQuit_Click() + + Me.Close + +End + +Public Sub mnuAbout_Click() + + Message(("This example was made by Fabien BODARD\nand was optimized by Benoît MINISINI\n\nNote that the 3rd clock is Microsoft copyrighted.\nYou will find it on the future version of windows.")) + +End + +Public Sub Form_MouseDown() + + $MX = Mouse.ScreenX - Me.X + $MY = Mouse.ScreenY - Me.Y + +End +' +Public Sub Form_MouseMove() + + If Mouse.Left Then Me.Move(Mouse.ScreenX - $MX, Mouse.ScreenY - $MY) + +End + +Public Sub mnuOntop_Click() + + 'mnuOnTop.Checked = Not mnuOntop.Checked + Me.TopOnly = Not Me.TopOnly + +End + + +Public Sub mnuShowWindow_Click() + + 'mnuShowWindow.Checked = Not mnuShowWindow.Checked + 'ME.Border = If(mnuShowWindow.Checked, Window.Fixed, Window.None) + Me.Mask = Not mnuShowWindow.Value + Me.SkipTaskbar = Not mnuShowWindow.Value + Me.Border = mnuShowWindow.Value + +End diff --git a/app/examples/Drawing/Clock/.src/FClock.form b/app/examples/Drawing/Clock/.src/FClock.form new file mode 100644 index 00000000..798c6fb6 --- /dev/null +++ b/app/examples/Drawing/Clock/.src/FClock.form @@ -0,0 +1,55 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(80.1429,67,43,43) + Mask = True + Border = False + SkipTaskbar = True + { mnuPopup Menu + Text = ("central") + Visible = False + { mnuClock1 Menu mnuClock + Name = "mnuClock1" + Text = ("Clock 1") + Tag = "1" + } + { mnuClock2 Menu mnuClock + Name = "mnuClock2" + Text = ("Clock 2") + Tag = "2" + } + { mnuClock3 Menu mnuClock + Name = "mnuClock3" + Text = ("Clock 3") + Checked = True + Tag = "3" + } + { mnuClock4 Menu mnuClock + Name = "mnuClock4" + Text = ("Clock 4") + Tag = "4" + } + { mn2 Menu + } + { mnuOntop Menu + Text = ("Always on top") + Toggle = True + } + { mnuShowWindow Menu + Text = ("Show Window") + Toggle = True + } + { mnu1 Menu + } + { mnuAbout Menu + Text = ("About") + } + { mn Menu + } + { mnuQuit Menu + Text = ("Quit") + } + } + { Timer1 #Timer + } +} diff --git a/app/examples/Drawing/Clock/img/arrow_hour.png b/app/examples/Drawing/Clock/img/arrow_hour.png new file mode 100644 index 0000000000000000000000000000000000000000..ec7462df9d539033373b317298a4d4c236a140bd GIT binary patch literal 396 zcmeAS@N?(olHy`uVBq!ia0vp^CxG}E2Mdt2jb=|}U| xd-_3~>}@wGCJn6edX4(dbMqKcy^NK&VUGO{6~WgZ6D5m5@}91KF6*2UngC$Cg9-ou literal 0 HcmV?d00001 diff --git a/app/examples/Drawing/Clock/img/arrow_min.png b/app/examples/Drawing/Clock/img/arrow_min.png new file mode 100644 index 0000000000000000000000000000000000000000..af461315674bbc32c6b0b9dec173040777d67ea9 GIT binary patch literal 420 zcmeAS@N?(olHy`uVBq!ia0vp^CxG}E2Mdt2jb=|}U|`Jlba4!+xb^n#Lf=+HiMEUU zO-d})=1J@-(?kU{(h`N$b~M>KFiV}4|Fy(2y=i;prI0c#vTtUn4*_E?q zPQQNss`tNlSzj5R|9D&Um7z{p#chIwV-icJ;Gkoq^}m0%?zxHa_00$E+p6zOXx}+| zcV&d_V~%Q;$~l+kJS+U#qx?qjN$tL8+4sWFTO5+hKk@m_xig<%NxI)qK2dou?b)8H sV}jo}KH16}f8JY#2oPAnVA2Q5>KHr>1dVDrS(rhxp00i_>zopr0GpYIG5`Po literal 0 HcmV?d00001 diff --git a/app/examples/Drawing/Clock/img/arrow_sec.png b/app/examples/Drawing/Clock/img/arrow_sec.png new file mode 100644 index 0000000000000000000000000000000000000000..e5c42ad358eba98bf9d357e753223a6f0ada4260 GIT binary patch literal 1253 zcmeAS@N?(olHy`uVBq!ia0vp^e}VWn2Q!eIwkhc{0|VpH0G|+7AU9?E|4}rgL*UYz zN8-SUoL&;-7tFxK&Lb!;qo}5BU~1*y>g694!WzaA!5zgH6DN|8B$Xb5TR9bFPXT(c<0a*Adv&6W%u=cG8sOX=yWO=ggg7v~Y37(&Z}~SFdef zzp;1A#BDpK@0zt|-+}{&mK`~^=ESK@XSbfexcl=&!JBu_ zKD_+&<^8uGUw{4i{jYxSHA@BtCJRp&$B>F!Z*Sgo>SGjfdnj-*W(r%qR;S5DkNt}( z9TY`USDAPUab>Exx`teTEoK$Xe!ps6!rXV|?k*maR6Jpb^}3=JL+K1Y2ib+p0TW9Y zUTMfSSh=w;SoDJ7N+D3DiO<3HGUEyfD+W<-_63h#Fof91Hh3*y4(Kdl(9*oXUiZm! zS3`+btDeHrdCRyxGGCT3YARoN?DtG^SAz)Gmn~CEr|BuAKEJ@ab*^@!zunR zYbqZq#X4y1a1o!t)%}7gsE`xLym-R{~Y~ zsmD6J(ptdnQT`q%^m{4L%-@W$4pkA3;uGXTfkN}*b~Svl02(##3y}A(3ds8+2~_Z} zNl#&K&SGv4=H?Q{%on1u4pQ$HaeF8)2J+U-)>G)+5A>|CEzpXyDnRA8{lzCNy9YGk z<#(XaVTM?TUlz{d6VlvYFkM=H9w>C0CDviqZ!hr)&z1v)4w=L{M8yEjJG~ibUg}gm zh1%IbyY7nvu8U@~X$boFyt=akR{0B_@vFaQ7m literal 0 HcmV?d00001 diff --git a/app/examples/Drawing/Clock/img/clock_bg_big1.png b/app/examples/Drawing/Clock/img/clock_bg_big1.png new file mode 100644 index 0000000000000000000000000000000000000000..3001659b1c75dc56c6aac7aa1975eb9dac7525ba GIT binary patch literal 19642 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

QG{Eg$ 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 Y&*?+QoVXDF=Y$Pfr*zZ{)huuQAHMzFDF6Tf literal 0 HcmV?d00001 diff --git a/app/examples/Drawing/Clock/img/clock_bg_big3.png b/app/examples/Drawing/Clock/img/clock_bg_big3.png new file mode 100644 index 0000000000000000000000000000000000000000..53f378eb97ee763fffb6385fa08cf6f02b949237 GIT binary patch literal 50841 zcmW(-WmJ^g8XhE-4gu+M;2^?)bT`rx(p>`5-JQ~)bR!@g(%m7F1Jcsn(tS5~Eg1j6 zV!qjLJhct~pdf|$g5(7R0>PAiFRl#!y$9d7Xei({$0~jW0`Y@Li;Jkb&F$a2H@qJF zNcrV~W^3V8@btshWcIF7l$P>m2&;g;{t1QRCgPyzGtFmA`t76Lt(UVz^F;F+2396W zXmtL5ZAWzw<4UA>;c8eNhWUP?M{#jEMM=}r$^1YEQhsIeiK_OiR0;ujZ`KZ~c>4-b7 zupYdo)FQRqdcMw7v%rwpgZL)(=+>}#5sNn?ng~gRR5*cEZJNDIt7M8XO49hJa#5+R zwRPDa%i6Ruwa-QH9i2<>$6c1ke-(PIQ=^YE^SZ|M9*~Nf&I3fss}84}4{pwlI&Ghf zj8@CT!^8RhUEh_krTiYJLc>_P9N%#o+i_ZUr|?=r-6AVfLpLN2aKwU)v139yc%+C! z#+-E@B%@fNqmH^nsRf-djO2pnL)8YvC{DVe1s3M)BtH4djSbb+4nEG#=e=cRW$$XW z4z4BhPWCGvZz`5rrcN(p_LlUhZ{~m8ud+O>cK!bSn^ZP`0?~ERd3w)Dw>^uMbIY9~ zbr?z#g)(=*>9rKP<<3fD8aa5BS|Bp*Jj-(5M;t+p*aMBF^MN>=zV|VwwI@SuD(|kd z=8i_3uj?cZJi0yhe(Xzm_bF3LTbs{)tuKnczOIhK_qY>PKMunt;o`;kQrAT%w$Cv~ zC^qH8-{9cjBj#^1OTEN=6X5Y}>Z|JN{)i=m$77c#4xw&jw%7YM6TbY>sIZM)9?_Ud za{H`aW&whOgb+X#8$=P3bN6@02?xo4fo%H*hJhPG4TVBu2Thi_vA_eUsi`sRHaYE( zPM7O?HYgW)9pq8oZ|`UeJT8?Vyv+4|KHq-L^=P(ob+TrwtD|$5mXMI(n+MO8$2}# zb|WIi$VD$}o+F7+aUm-Ul~W$Sz(RD|d2oD3 zpGM8Hz~Yy&cq}7z0#ddNx^OzYBuyfIh`yaZKiZ|4+*4tMCxFUt%l)7J=;`-Xkwu&U zDq+E_{+Su#>RG0`x;neVg+_X2orYtgl9CeNhw&JnvvKYFzir><--!D{4yJt$)Y~uL z+FobYe@?yVPCqpsHp8#g!fZQ|%}X}bjDLe)RU%$tp(Tf;9%b27p0{YzAI8`CACkye zUO!?Oxr(n!I5|$*mzy-kO?sYoOW1eN9^b!?+te#nOoP{aB;}GRaMUaA6jt+nS6AE) zjbyv$yquhz%w9XP`Zqd-@N0OC*E+3!^VHF)c3G?F+3lpy{j|_sYMxX~o2QM

Ctj z;Z-nt62vJyGHkx?AbDG1wMix{l9f9;p*TV1oxBPjC9VLZ$aTI>U<@Z|@^&gJkTpc1 z5MPBdtYL@b+;)y2EG^U!O&8y=hm%O>k_1mL~^u10N z@@11A+)Pb3RNAl8+ONNm8&J-@5pNH@h-kk$a(L>U+s&=5$7qYxrA2dgI@F)mL`~(g zsv1qSp*OJxRAlGCZ$>iS(|z^YinCuI`r}@8`;V9$BVA`yJ(a?;BIz zmZMU*Eg#L*-6tHl%+Jlu#jn=wH8Bvpi2o5D7FP1EkB(lAr}V}!vU5zXX5P9+>n&)A z$vx-NvNA&pi|3@Iq#8>)BF&45HvBZ^Y{e-Be6#3UU=i@nUa|TN|B@cj0Q`R1tEd!=Krrm0Bx%i-oybs)jg4U# zh_zZ}r{5~PHZGHrl6)_@d{4RB?MtS+hn|Xo&phjHoqoyl>UgEyR`btgS$X+0Ke`Jq z!5BFxK0KVf-``Y|RTyJuT{!(GzH5mp;}5kG?%S@2nZJMgZf%W&T1_l<%PfA~SMf-Nx$#L&c% z3^gq+O+!zw@7J#vfByWbtga5&*f6!Sw(cA|OWsK9@hWoNlhhw43A^2fqh&SNrG6B` z5W8w)IYM=sdJ(VCl})a~6P6(RQiKZ>6^xHBqOp-jPF~*7((;9)qa!gXso2liucX+G z_p0Mrn=_~UMK9P%Fu^f{*X<^(e)|uM-yjf{wyV`%e0qhuKQ}iw{gfWtIh$pAT=kBg z!P~br*xuV>_)90`ODB&RX=%4hpo_nJ{`?t+A?DyXb(AjNi);9U_nooa?%e$RJh%7F zD=QltBWLHA-()20Y=gIXGbDdIOZC08V1O@DB$46f3-=)lptP+Me>D1t>0*>%C_suJ zjSb0WWtsAuseQ%GDja93$v_y9oRZQBK5o6+x#?^jW@9fevhqC{4!;gTLt>drN&(7Q zR&xrTEwB^Ox^Y6W$h*Ll8A<0+xt^PDyC5AJ8lt@Kp%<)jDVZKWm;oD6{Pvsv^|!&> zqxQ$bp^bk+WvYy7wOYuK=Nzvwc*9GD)pelunPH4*&p;!92Uxv1-)nF?p()pE{Zdx; z)`?dak<^c(J}uXwzkw$Met1mG#u7eYJmwjuyhsq%Q8Y?7?%I;rQg0cVz$h}4*#EIb z851LWtWc}9C;VA?Ps#HT&+9ukDrQEZ-_u$ zUfkR?(K)UD*>#;5`q=dj15pGgd)Dgd2xMht!CK-k*J%uhio&#LVUx!{P+RzbLIwTn z5R%-Jt##|Hi^|Sdr}V?9slWp5uABkODLm;x&DrDJ{rf|CuL!U3LjRE~31Tav%X+TL z0dkE!#LrL^uX>F;IX%6n%DCTdRN&IU-d?H8jc4n}^xj0i6e*^$oX6V%Kk3X!Dl`}e z2l9MfRZGi)&)rGC@AX8!>{E4x?$&!`EMkETje5NFFznC^jSE&Wm zNkh`OU(b{{jG`c%HDP=iSmnCSA)hkcQJx;@&mTfdjulb0bJH6IGSY=Gf0y^x5Tui2 zH9_a!;@KiESc@MXsKWBLw#im|q`7kDVj2|5YLgZWoQM(29^3Te(q7`y;r`fiH_&pW zrRuu$ru2)=^jeZ)PU=28V?S)%qG-9Ot?0eGYYC!E7^pCUpk0t6AuxV>0dSyJ8KKT} zFK8eB(e531VV02nYEQc-fOC(hWqQ8##opR@_hO(33!Zvs$;Q_9vE8zkqzm>nNUF_j z3W6&9%-YtwY|D^v7U8m>#@$uxI+84--cWl9d+=Ow2q?nw!ROht9%M$nIBv$j{0Pw8PqPwk;E`{A5He(m8$TWu+pTajqB-^ygLM&^) zsFehR0#YtQ(w#o(W$`&_f6K!1xX>?nQPppA?%`E5U;lF4_o|!H<*?;+M4yb5^i~KU z$`0a$biP;1M#Pda{^he)tGiPr4LC`W{e#+Gv-9N!66=CKTp2G!l1uNmiI?x6>5@c5Wz9< zY{uvQ@uwOX1Z{%k?Zs&PH%mYekgln+$Ol!&>vwzk6aEqUV)?3Wc;>pG9wRaeio({lffx=}ji&L&nl_{7fN(_xv-L&BE0*w&0b)o?69d zQnB|u&b{w7%i~7>*5;;<1=zk-Y9$h6J<*!$;Rb%(pDLy-8|>FmMzVxrKs~Q)4yPU8 zV|nS@L38$`R!YOlY1cAsBp9Db^g3huF;YwG@{k0M@+l90;ClUXr4Y{>Z@dsMbME`d z2^~Xf|n;74_wNLAFe#FdjGoR{2@cM&EV_#5ID8m)=?WZA+~%Fw`Y7GUo^F1~9y=T->fpU3 z)vWR@4Q=e3;QQbcUa&XFXX>J8rJ|S5D|`hGn~wy44-a?RlTGfOC!2^ETd|V>@~u#1yq^Pz^#xdj zamm@~CImD{#Eom*TTlB6u%RF#JvZvreV_e1tyXf}V%pRYt$Nz%!!t#a zc=@Ff2&AaKBS;hr+nU2PaHLh*zCwC7sc}4_%Vg;&x5yGr4SjqlY~8v^k5i{xPyqUv zC;>EphA)U3(bGI|c40xhWU6a@o$gC7%}Ay|^ZfvA%pGO>#pm{mu`<1O)Ty@D;SXYz zH`oaP%=)ewzj^aU=+BPR_vAzF0AVmLW%A?MKPathwCeSLd!uf5Fvr1ve+HjfSm?R9 z;Dp36CnR@MHC5y+TD<&pEit`1Pt#o1?yWi(!sw}IG%mtzTg-tBW=3=j7$yq+ zF{-rjMow38bV!7f%&mz|{q_{u@P)*`-x!qW`9~9ev~#sz4>z2S@KrT50PbP3|Ex$E zX~UYGL_=F!tPn23nHIdpjTQjWzu!#~YHVt{Y4_bXZohtux__NWdn0t$Ep#<66-{;> zH8pjv>2QxDnYJJSIu>tPB%(mMXt|e2zehz;AUJ}Er7yd-xI}h$Hsyr7Ata$nE|T^v zXk`%Q%pDyp*Cztq>u@Hw;8%Sf9T^fo5Y>QHYP6Y9so#_dNDK-}UTF5m@>1$;)*2-t zJlWU)#B4$&z26=cf5oicd;HeQ`uZXahcpUGa!#mKh6TP_qGt#&(&+LT=#p-$qUg`+ zUSkEYLZ{eQ9}-PhK=XDZV)Og0^~V@nS;?&;m}eGG6`utFkO_cP0BeX*RhTGsXac<= zGr%+|k54?fYII@Oxi#xR`^)y@KbH2Zl0?({v*9$ZoINO8N~8{kxH-XMzFBso(+-|O zCV%+PPoueuHna(Y?<4te6ocZ1&EkeO#x7{PQ*9)2t@){XYb7wep=(qL_R9@~7-C6( z%)2X%{#>jV;$I0=o$YGG8)VMNnqnB@D0bxF=>nYv=R3(`llal472|Gbyb+EF{S;&r z-Q#-zcfe>wG`gJs^z$)G=P`3MUGJaO?sWo@T0t1p5jlPD+6 za2f)oLm+Rm>0kpB1%2MdFomYL9ADhWL2`jP$a)^HSDj(qqjax0LhfGvwUJh7`Cebx ze>;x!Yn0N|bhVIxd7gqw?W;Cy`50BKp`MMQB>VH-j{xgF_j=yVaQ|`UU>?l3Yh|v^ z?jtqP__{#I~A?tAa8L_WFts<;DSG_Mh;%1GsK8P z%xkrl(Vo}`;GE=tull%F2jXbWCsXl;6i3C~(Ys(hySt1S-5mgo@Md6Tx~+y+Wbim{ zKAvi~pKG%$?4Gwx7aX-lXwM4*gOkYaRA*B5lo1Q;Rf^3bgNdJp>k04p=t!Qa*6=LDj3bn7c}F>jXH@)6-~1fI#!l` zGHj@s#aSf_I;{%clGDzhd`y1WZbw{s%ZEA$^iNFSf$cDEgPxn2o*rZ)fA<*XW_of%g8~E0!)hTK}Av&iKWI6;Vnl`t%M7k39T~s1+aJAeGjrsf6bhJ7Z3m zkrrbdU4yAAfn&$(>N4XmwSMxcipi%1rS1~^88g$HoT)YM0l zpPFQVB2<>|32_Js`L2Z1XS!XeRou4LByo&C4rbjAwx=a0Uul#~Ri_RY&?&FFU3=+i z*@bI7A^T8DA7Xli%r4MA{q62n%vPEb|E$aj^c^Neyklem<{EDqB(w5 zRd{`UeIFRsm$~h;V|J@mxB|Yf#|8DUVOBEXNAGo1zcp`y3N_`3sXt7yL)#tgkPIQ1 zByzIqXo_c^_ctF)%gd?Iyv#|uS62;RQ8017CMSU#66fmAF^T`MzNGCN&JPlK<=Dd? zVjve$L^X&><<9gRhDTb9++VxW^olzgvm3Ud;l(0O?4nyxVAwf^2{VJ}1loLPgXEAn z@lw=rzR}Rv@Ba5s-b$U3;hRiyW@h55;43w0qa4hyrH|<7=zn^8diY|<`OLiT_w*kp z%Jd$atyyGqAGf81b{~F^-u}TQ1DSu2C1>eAqnpCTu@c8K1CLqfVc$>*D#YN9#i%AbYnr_=@}| z)ed{DrC|@3K1Y`iSyC|+_kflCDFF;g4ld4|l;FNS;4EfjmN(u3#P8$dZtS(|t*p?a z+e+&=SiD#gRf1P}m{AVF^_)L!9ZgI;f;MQaftd7-v8Bf|<2BQD2ThH-yzT7Ow#3D$ zevSfZB@X$*!Ug-myG!wbL~B3RFarV#(dpW-TT+-jVx4ubxaSZXEv`lkT2Ev-YqkZ= z^DrA&x{xo$-rgQwirciVYnSu8W&R**zJG#72{@P4Oeb9DZ_)7n+4>FHTaw^22AK7P zrH=&@jC~KeEV!TFxYc~4gM*+J5 zs~AW0B-8T{moyC8qc6fBDZYL(IaB=nm>yyTvKIONvwOxzQzoP*vzTd&Yfd;d?mes7>^I%bg=(UbZ2`0|#k#1Pe z{%N=Rx@z|%Zf&8gxx9#hlUak zDX3x~8To2t@MpM#9V0me3qH0oLr69sV44cUL~NT5DMu*C>8`_=Nqjy;u%%sqrHhK8 z8(7Y|O%j;%8RjH^@o5I?Bod1EzL*i$qXi*~XXkr3#{CAi(bz$uBD61$kxcvB% zX$%Rgp30;3O!REOoTI{ac?>&Z2iJqO6@aTEh|wKig>mhL(ljz=!vzeN4j!8G4!?p| zl?VI~^z=P69;pE_Kl_?F%+gY3LuXUO0t-VgFDATG@8klQgG&pP-7H&!>6dsRaOfl( zb$s@KFmxYf>$O&4!?B2ASr0(RIOYAgEqC-OJSa04M`gb5HGN*?RBbIsy5K#ALY80@ z5UI_1BRVJ$I?e|&lBA#sQ8(ccx1j2Kjg;olAecb!FH?J0P2|MWY_T&&JD$>!toS94De)qe)x3%L z4YAk&j~=%p${r~x8c*n2Q^VF@&$!`@?473N(A1FF(@anQs!UJpvszl_i;|D7gKM#b z>ao9xgx|VT=J+H#h+VWoM3$w9(Mf}i2+PyrW)PO>|5HrDG5=>}r!XiT%*Tl)TDqVk zmai;=6U2}t3l{da(;Tj(5b6kZt0bhdtt}eh_$M2)b+5b`+IE)Da^G84kmYkw_xk4X zM*nf|(K>ZgC^nqXS{tPmO=&R+r5T)hI4X!~#j$C|HW9VnWJ5>eif?YI#gCbIgGuf+`)>;s4&pje)Vji`+}%!Jm-(2=9{yggp0L_JIG zvgg@0Xsv&r(UJ%x;fWA&jadi%K>Va!^GPnylyoA&D5Wcd1j%IobA%%kVxk1IjIgn) zKRtxIvaT)!NGD*-P$_bz#r=>bd}TQZ)2W!=NFNy)Y1=to=|%?>R$a)qWQU<_F;V=n zan$?pGLY)3Sry_hZuauISt?3^-`ZU5o*NK;Pe8k7kDGU}Aty`PK@j!_HvSDX@a)uM zJ`+-Y&Lq80U?Y1Unj<_HoWs&dk`g)px^h59k+;QE6PKWd-2FL|#h_Z*-x@a#OuTIx zrs3GFgtRisN{NUDYoUN?c1#-+YE-ILlGK8gu3+>Ahm99N(F7RR?sCyp_Oo-+?RnFf zqyV)4yTyx~XQCB{KJkutS)?IqC5yx9B~~viMX~2#5);@R?EhtG`cds~&O2scu%%!) z={A^4Ad?HR$?T4CAj%oXZJ{hvhZ;A+obc1qNE=)ZczH88`}*l=y=8TU_3nGVEs)~@;I!|sJGut2{liheYL75AAg+9x}Wu(WIv$SDofNUW$bi47Yli# zUcNj?pVfoTk}i=q?zd-RiW6lT(e(M+3!!e~nXszFYlyLt)X3H;(5MGY*zo!l&{K3i zir`S`59EFrkfJFJ0a~=1503qUje~6VUP&DpX=-_QSdYgdtVc5Ec`K3J%(M5{1#4P# zb8yy=zv*#FOY6m*rbMvD+ys;$;;9T+w3Vzu)B>c zElCI(Bw~%@jR04in{*=CC%2F|v z0Wx7ph9vU!>px8Zju6_8y4f<`6JQ&p68^hpHCafXT-rtsAE?LZ>+gU4J3f`sAzpE| z&iboNmx1H??n_{^cdoc4H9|P(YE5TiJ_tlE2}h=w~r=VN(PxE zdk3Syu&Y{*hifvlJOVStF&c1sW77>N|0odVkvog5`;|){cbhrBGfFv5T5-NC66tVr z9uBhDKK9P}rI|QGXS1Lo+WObeS{wLy36@{9DueEBfL)lJk5{*2J)5kMBwz1Sx8@wUFOJOf=K?mnB{5YX;=6b2Wno8oq^EMmj zM~e2qv@2Fm@-Qk;PO?$Ex{lG;Rq*} zm8mgyDD3$w(gKS?Khhj&*egvmld-*lTNR zKtB}6K|(t5UIcEIS=+yF6?fNV1@D$QssCST?ZtaHkAKbCjRY+`{LlXVcX1E29H^Qa z(my3Q`<2qZi(uB#>az2juDnnK3_IOI+2gvm_v6Ks8P8n64Ed7ZvVI0OA-!T|&*mnS zzakKr66#Br!WE)-Fa#Uc@bS!! z$eVU1*W`M$T+&8_KJ=R0c{!x3Nj$5?m57(Lf3f7`!f${q(Iv|!%wBy;S=VQBYcPQx z?5q$N&i%KcXC@LKL!2`DCg)KlB+b}pROe3l*-5}re%~TBpR8YzJV95Ln63-HRa3Km|zyfZ0Hb;i=lMuC7Qy0^$@~=SP2Ggf*e=6uzPiM5FXb9!W;++Sq4pA~Z;_=>9K&}nkQRTGzc!&R{+ zZ|egoH}0&#fRP&%V3i{#ewJmOf;sP;9^O<1=agh6GouB{jweUzvj!4ld&c~?{8_9VGCFa;Nz>#KSM{y@JL_@(6o2Fud@?VVm&4dO@eMP^J_hfwLX|{;9Y&5j+GT$}htj9$hPMJ`7r$SvG_W zvEhVZq?(E6bm=0##Zf%lY2f^|0i<|Mq~=IfmvCVu5J$J zGi>_20FvHm!22eGJ|pF~>gwu60Y};(O%VXV7^!~iH+EOq@CR3)E!PJ_!K_C+uJ?I+ zzo?CHG%d8^+zIG4(E$FL9Y?@i>d>o&bRY^ zX}E*TNIrbDxqEE6c-B=KL6lbv1n6jiA5>e%F?HH~bR~aG?QujZMy>&NB!Uw%VDdBW zNc#t7F|uG(11lA2*)NU+`G-DKeZKu0rI^dl_YF=-dzYI_vI%52=hmraCM8v0F`7_- zp9p@RN3~A8iRqs(PXBAfH0x$%C!!;CwW5H-;V=xtVOL$E3M~z*m)k= zysV1hPlw-#VS?9uMJ_1}fw88V#{$^EDksZy-+UG1Ki~oA^X2lB?ZvE)cN8qE!odK2 z{o{~z#bHQX$wjzuEoauemmDjOWho|?Z7{37Rks(I985!9Ga9eT)BLyG;|F8ok}OFS zG8DM#x9D`gj2^_wiuq;ehL#Ouo>k$X7iZQ>AZAoDZD5(gohcf3&f( zdX6YR(2?C)P2Ny0th+<9@fp9l(t-r=q?p{9CMw+NC=91rCZ_p#;$6^!MMeKbMtw7Z zg{8Ur!^D~CotC_qBdnMsz$!B`b|jCsHh#xgZ1?zC9~}z|UWenrcwc(X^lx2MT^qZ~ z2#xiUuMJT_aJTmUhV*Vn@yx=TuH7?}9#4y*Qx(Lo`oXNqV-PVga=^P>@)ZJgk5m~J z>C?m<)$~27WT$CTlo&5L54}F){jy;W{3Q489uvtQyBmi=rjI>`LQ>6J9uCrk(Y3W7 z*Bxliw8SNL+0NBD(~!5wKtKiJXWSp11K+tDI6FHdQq1Ic_xAl^d3F(xe;+D%ma_wl zM_+$d&U}>gv2xiE*b=tg&cy2{OG!hk=|4_Hv-bqLMeGRE!yVQ81J*QQZ?i^oR2gZq zMkT3ppiJ|A_~9qBRw(6r9nnl@&uTZ&TJG2B$oijk7-~Q}h{>jdM}j_jds&f*5U*Yn z=?O1i1Az)a^@cTI4OKSy`Gun85m6*8edGMGZ5&CZ_bj&`>vm?Ar?n@eg)?fegiHg@ zUX%J32m)YZ6e?!*0mF|@VU4509rMY}|1m*>Jhtso|KWYokgFp;l0T6&MAbf2s^}L- zgAKHr#hyKFnBjToF++05Ytc%vXqS0JY-AX4i*uA`1FYvkwk9C#-&%Dglv<#^9(c}z zz=*)g)2nzC!XoEA>jyL3Lt56neO>(V^6_Emk;#t>cQZrp+5P8vkQwa{Mklgc?fHL; zaU!rp(xi)z@Xn8jqmU3HFtTfAe<1jez%X{!if~p3IXR)Jnk0uGt}VPWuE=+ zHrlkwg?BV{WU_eZdJoH0oL8L~p>%1{Cw1}BD%xK^543}Pho^>Y1 zV9B!uGQGzR#N?DTiDtOJ*)~iLpL_`s&M}i14#OC;VFe9?m&q_{2E zKR7TfKDm&GA<*P>e(gi$XOM{5Jy})lfL}Z3@>SGY$0OqjzGt-^<14f$_^4+5z4SJDr>V;L^2wU&sVz|l6#z0Iq)TUJWC9-SgnQ+4&mtLq zry7hi_7Fpy0!54$gL05Uo>5JKMQ1oq5LQEA6t0&hBS(|j**ms zaEL82kRO>Ym^j2A2x1^t2M~7KF0g~}^&fAh^{XKnNs-%6As}B327-sO0Tauiu#$2t zma_)%Zw;)vJY4Y|<>aJujFP(zy{TXuo(+ z2zn9QdYrmSruj0&*`+(Cz!g+B`BKot2}Dk^ce)%Hah&A_u^DI%kPrvN-ATNh<}!P* zVId5K*&vV_WmbYP#Fk@$@uq}p#gm$lkdSU%#ewMK%UKXs1gRUHX>WLrSg0C>_t|(- zPwrzp&V3*VZwLTWIN2djc6`;zX4BS|tX;So;h#hZKC~`t8izi*$5a;|>Qo^AMCpw%9l8ac|ah z(ok@aBZ-?3j%^CGMySS|o1()9?fLJ2!!>mE0RrPY;*P#OY$f8EewjdmYqs8^th3W1 zTUmu2;jP}SVw5DcbQ}ISIf3!%Wa&BN`(VsX#$r9C3JDD_Qe|2_;GS^ zojiT6`?EiDI}E?BOtM*<{N!1$b_cl>*e`9OV+c@NRaEeCUyOb|o|XF}0Zo#~QT-aL zyvPn1ixbGYz$9(elDT)wng!lQuJx4%7lSkH**#SVDnir5 zd!k>mJ1w}K0nS0xL@(`IaL5diS~+PuCCS!w#CO3J0Ds45u%p*c-BWnbaC%kA`bB=u ziZ?Gx=6nG0@Fid;J~o3a;n(`YK~m0o)L9-#%aQkyCqvTEz5LSU>;0G84vKJg5Kpzg z*w^Gg{rwIQqR7<^grVw{rrgM{dnUQ5W@I52RB1y-9v*lqDk>nH2ON(!Ui|^-1s`Yv z0#$V?1+Np@&!0ahyz|oRnOs@?3S6m+qC%#An|M zho4lj;+xcun`f&sf+?f`vTH0pz%>*a`_Y2<`UaKK>zERtBwuN1SP#~l7cvv&ySIYO z`fZW$LPcXoM-|CnC8idnzjlNYW3Lzp(UbYuBS4V-Wj)UI;AwFBvx%|X3{4Z&DyDZ| zLO&h1V6m$xA`d&wFH2NNz0z`MOfUTbx2ZQ}7ObQeuaz3QfhA=oIy_$SbcbF4!4v2( z=^@$3DinoMV;lbsSFP8lp+fWXnilQaOC(T&+PYA@h&ql(y@h9)-nPxFUWj%9pVn0-eL(6T3Wf0VBFMtmvXpiLU0PWbPI>vQp*Z>FRSi7%2_e8lgRB>M;E?oki;?D~5$kYkAE8houaq3~%dS^XTgTYc{-={1GTMh?5G5D_EyUfLD&?=EhxAt_ao}(k2`?t=P8WVQ@OU_ADQ1~Z z;rGiXR7q5|3QNLJg(_*d`%;216WnJAwk4gQdf~>l#!4mHg~Px9B`9y~$G;TxthMB5<3d-9+I_z{!98=H~J~MEP$pxiW{?e+8vSJQZZj7u7 zw>NRn6y9?J_ES$Uzw#fBDOYR0y3t zTc1Z*+txKJF{4~B%YX0ii-PHth*8|%G2n)Uz5Px^grfU3({HctwHvCA7&LDPZ|3W8 zkzPeNyL=Ira?@MknG6OB{j1AiS}+{xeXmxe+Nuk~y#iTPXV>@8b2t>q9K31cUh768)^=^R^|Pbz8+mbo%h97pC#nBC5SBT^v7l%sEq) z@|V4OdUlWV#j7#(yiy?5WT>tJ{=i*xa?QmAjjx5F5A^AdI|~C<^Y%ez$3(hoov-q zNlrc#3N1S(L)^D7Be)&h5PmxT958!Vse?M}g{3*|m-8+;1ZBEvnYS+N)(oT06v2Z_ z0$+q>jdizmIgZ=u8|H)EzxH=Q{>%Fq82*%!lHadr_B4|P1TH9O84H#skF?GV3I1eW z#eSs3#R)6DsnI-!#gbc+?DY+YQUm`2u>+|mMR1oNLCdNpoqj7)Eb861wbm%du4`YD zah`a=88iH^{-`%`?_J@%P*Vk~DpY|Cp9kW6{rju13IP_b4bQy2gjZ`{+|ZU`GB4wl z^(4v1?E(}E?lEVg^oXykWMn=w{#*4Q%4`iS9l&iEO*YYU{W#rve-N=W@@)1PO=`c} zP~4}FI(#z@!l9IpLO*BsZwHC#Mc&HLEdmMdDHo8xL26#hyG$Kup;gI5T6gfv!!i{M zL~!I3q9g2j0tQTsCD8cfKUG?h+CUNE)dqZ6)s19K^ODVQgm)+r)7{Qm7%e{Bcg~;g z57t|h=BbQ{KE?i5Z?q+eB1q$5$+&_)j){VLPN`m>HJ6mCl3_rZ5Zy7kjP z3RTRc+_M4b)I5tjaR6F9yVg!~9>kXp3$|US|BY6)bY)Wree|$n|{_- zh>;;yY<&3*1KoW+t~w9Tf}*az1g%9lXiw7qTx6RTLo|pVC>n;J9ntfZpX1}>SFPt; z#wrqr01SfGeeA2Jp>egIpeWebR+vOt>rH!e*|H_@s18kN3_W9>=!U#Mc>tN@2D_DK zAmNLHq{^jZunUI2oRZZ%Ar#sNtna9z6bleZA+8&nww}hFGW;sn2yX1CSLpSEn-S?u z<*=JGBB7@8Cel@PqIg#ye;%EE~cefhxw88rCgj7 z+!~nt3yqFX`EqcBuMmIWYfp-tOAhL%50Vv|a7* zjsW*0u+?!dF`pN{|%kV?qFAftJbS-PQKk2_38j(SJ zof;BrH$6VQ=~to@?*p?3^7|`mYmvKQbj9p~iUISkyyT)7e;vUcEg}lvyOU3@{~q9T zZ8-Oye@`<p}r)2{dH zM5){WhwP3x5LP?J0=YJ!5@hIfNKJG5ieKv(P89uJr{) z4>IEPY1&w(7AW*#@mMG!X&1sfr%KfAPgW&%Dy%rulz#1!Sq+81KwW>jQCC#-Tux3- z_#K*+ac4A!s~j{9sb!$al2}r8wog&~5cBliQS_K3*XBuFxcjI3=s!2tRYjB|G|$8? z^)1s8n*IpAu>F+FK|Q}p>c2}PPy1m-ioT(8mx3&6JHc9m-*?o#McXZKWQUL_f6SP9 zL_)37rcIWIEH|KBs(##G}dN9LK0lS!aAst{faBJ zD&DW#Ob7MVw1m4AhNI&<;;dAH@`h4OdDP!OE|Lw2$2vN?ar}vdKgIGaaD=tH4*Gvx0Muy?3x`aft+N8D6ADW}Mzvj-*xKO2*LzRr= zabC&G(k3Jxrx(ks{lmF>_Ri8|9q-p zB6xx9{rU5oQxL@8Z_*km4}VbiJy+M~XMT|w^%O+(jvET&(xTjliK%H^Rq@*rR zelMFbIM8HdY-}nwD)*EDoNamUmLp;MgMmBrra>SVoH!!)(xa7fuq}b+)~2ry|32Sg9d|C<@%BDZ&LDMR*?K6t z)1~>n;6N4r<&o2z5^@G7``h9+(yO?j-9fLLXk+wm^|1-k1_%RD$dFg~OJI)NHafXJQwg8JpD365weN3Su4iZS;ckk{NLssmt>~Nz~N4HGFw~ea&26z6GQ&i05 zR!ije;J|LvQXO~J{Vg}#1Dn|`fHQu zX{Z_UW8_ydli-iTQV7V{+kw#oLN<)Qqz?PPW30Z1tbi~REJ?;`7an$;*Jx9Dve$d}19%(T1^C+pU!UJ=1^y%j9^t9<9qgG+AN7YOB zv>`h>Lk#k^t$u?Tnxg!-Zzdbc;R&B?H5y7itc09yI@=HQ|6Xh7z*VA!UUrBPHpZT6 z%$Bj!8VMoJQdM**Xw3=ykEF8zin4p#_|hmH0@7X5(%rB$5+V|k0!nuyAl)t9DJi+M zw7eiGNK1Fa(tL;iH?uP`%sRlc&vVXw?)$oa*Uj~sd-){J8+Aq4R2s*Da=eJDU2w2E z-a8kO74jNej1H>YH)XlH6}0EU49RDQ@|(Amf;d1#2bwFK&U~fWED)Y8V9kMjbaXu7 zRL>NwrL(i&UpI#U(ZMa#5G2?Rv+h{6s;Vl#P6q|&UGEFQUmHB&W$<=A?{_i}a}rS8 z{orCNH(^4j4EXOe7)As$5Islv_95;pS0PwA#r&{|%Z>Kgd8@eX7Y2c>_9f$X`GcnA z_JpndqH7c8HrjY^b)>|pYEvGoB?UfF{C`Y_ZLQWK@w*e7&f0wRo1L-Q$$x0>t495C zk*%6CKKvK)riZVaq^EaX(DLI)(775f0!Yp-ptm|8EQ-SAiuEuPf%c0q)OOBSnF477JFXx}jnRMMJ5)grYxQ_Zl4u&5mCT ztrg5NxXnGP>EpKS>G3v2ZDMT~pUcDcob;3vu`lOtMi$k2@1(XEbF|DBFSc&|1U7@T z4i#|1x`YEG(eP#&Wh?b%T3MpzLs+B-=WXMIgXBmE1I)azQH}QAWgI?)!@A zLoq;*@E3C3oth|hZlKHeU%p*}AF&U6QG}mDKiS}h&DntoSd9zXr@cM&KwK@Y#I&^Z z-YeN>W?E)7uZileF_kuG+2$k06o}Y*0*|h_c(o9T6Ut>~^q8Zd`8-fr6(fzl6gDE0n*CB7YQ?V)ZaFZ- zLNHVL(?hotg1G>MhroTl*#i^`*P2_O%<~_c9xs;1VIh#2hp#1IcM+FBWfQZnj zekNx5`Fm80%o!Ns$}pA_8-oRNWMkdDj69P&WN)S#jE1jSM9_1=h#|);gGB=e_dq;$RQQen8SmT@JGxFPwtiX1TfUIS9Rk$pK!y74mwW3QIpF`@zauX$VFJ5D{0MCDh11}M zGq+(DKh}&Z0Fj(*aQeSozUvoo1iLEGkvs$Q*D+pI>g#;3wFWQ4KRsHm*N2@2&ObF> z9{NUIMgh6?+h^O{`lw0%iY~(ysH*Z|PQsW4kKzv|-G^mYdA zsD_icSK?L1t-wykkq2wX8s^nxB?9lacy2lYADWda3UiYt6hS-su)fSCZS4K;yp`sm z9baE!Eo-4ZpS5$Mt9&*<`+QRkGoaO0gvQNA+Wn|6K*JAxzNW^oY~^|@yT>e6JmNKH zTfl)5O2<~-qD^=GXE1>IU}|cR(n0G1JGvdCQ(Lra82{|10~tjEj&Ntg^-YI7`4W+oey1&KYIX7u^~TO!NXWL0|{Z>(s>`j8SwWehqdcXIVBX%k0G zP5$8)Z&}6{%{hGqMLmLxCV9dXvR9fNGQq$IgQhTS(Jsh226WP%#C8B=0xpJ{d?EYj zhSN%>@_6XY+>eVp$oHdyb3WFRk0NohZj+aDIsNsN$7<=J7EE6EYW?+E+8>VW7pLaU zd57g#t%2dA;nmxdS+m$DUse|=BUL;=#}({=U_?z;+w7qj?;?wCS1}#2;1XYoo%`1c zAYUTgf1&6u@72?5io^sB4MAJ}=p+Y4Eryun8db;oAAB+8}9QSZEA+civYNg#IDe;D!_E;*I5JnykdFMzGe+HkQ73+aJVp z7_}&;1#}Uch9_{yli7K{#Tg=d0-121dbZ-DSo;it91T#oFMYLXc-{kC&aHqK#N$AfvC*gdR1SmJaxc1FQ6|XxzE^ zJ0hQDV*}9Tv1d}tY!=`C8-jl?vUC#T|Bjh(N%jUM{6+6K-{pZP1VTgl0wEaMR~$AI zOim)&eiXsxd5IQcEB9v+H|kS@BugzSJ3Z*;>azX=%B!EiE)9nKDJd!IF@M1o=xAZN zC;=9?ogM3!ot%so^?ehmlZPia?b$uoHG{4H%wA5pnP#cCx@l+-j5XL*ux66x@>v<6 zRj$S2*Aj;q;=Ir?69!{n(9Lkn6!pXxUE$emU$k2TW~zRi`!Sq(Oe}FkZ=Y`u210fE}Nt6ZYdu%7}9S= zDg4f$jHSMzZj&X+5a7G+%k@B^bkKamj&AZETlcN*$#k_3*4FQ=P_tGm-VAi1fpN2e z<3Cha2yNFQK#V}hSK?Kqo%t+!94_Xdw=yPs(8DEJpd(W-9iTp;$s}8`5%h{B5YizR3(+!vo?_@l)*JPz5CAmktDGL1`_Umy>K^IzTSkpoe@hdQn=`E8OFqT zUAF;8^MAkAP2VD6Glxl5x+)-`6=1u3zl4wpS%UWj@)Egu@ zbFi2AERab$PpH}@h&C;I!0}xYe{X>&)4USq)*21S29`gb8O{Jz^KnX38wz~M+g>Fd z+97i~GU)+bJ-M&KVoe>+GvF9_ZjJ9(G>Mm+4c0Kw<2MDS`l?SoaHKMhQei)i)K@|= zXJ(KG=gyC0isxUY|1CKrzZ8*-74crNhh!qg=OXDj z$++~1FBPbiz|ZD<63B05xv#DRwP;%#=8UW3-Ib%KxW&ttMF%Kkoy4?@IGJ~2D599S z0+6gfM@`zV+IetTrM2j&d`(qIW#3u$>-`rhmUgV*Q=0YP@3_YHcJ`n)as}DYCD$24 z=49En!6((CQfiidHFpcg&CAzv$k~Dt8N*;>pncw7_Qjd(%c2w*v9&HDZ_$QtMw1CR ztPkS-_xrcfbkM%uxftSE8yQkqN43Y}7aX4tPF`L&G?ES$4QBWw00jV^deLQ>cB4=# zWI;gI0h)?JJ#{}9KA6(<5uo^e7gx?en?BD^Rj_KKMmOIaGgFBDw>@6ayp`?k09LQw z)33_fvy$UCE31n*KYuTKkE~cV_=SH@gwJ9)7Pib!Q74HbA#F)k`~~*96&f@gnU_N) zmw%Oy*-j|Re#f0J6-sQa2>nS@{I=mK4xS7kodFFdfaU*x7OEN>cKA*>PV1jJrC%KksC%yDQ?^8Ondq=c;akCg18S1w; zRaQc3{rgYqWU5k;dt9k%EAh?(eG1U3LjxdRZ%0N(Xfj6RlWn53V<3`aU8Q#kW6sNk;_6Sw(SSphm%rEdfIs)(ZDKK9C@LdjF69lE+N+wXFDkfz~PP+Cz0(Y}%S-_nf@sbF*#N!!NT4q+3cO0T#f=G+){DjT`iA<$Y5MTrP4Nw4J5@A`Hstl>1 zc8>UkOhzA=Mgd?|(B90~Pnwl-RUK2=h6co4s8-{+w01$28OPa6kXvmSr%VR_- zd~*{5U8IP<1oQG>hFl_B!T}tL^vBAQY~e+^)sm{{&-}MdgJ{q{QaVw&^uFi$V!wmd z1WBl<-mWfQ=t;)F=qer_08kC+$OykmOLdVIkh&J0CEn!Pp`O?9qE1IZp~#_}5#0j{ zLiXBw$95lby=}{HSr2~Xun%3_ioN|WY-!C z08|dj@i(!PaNY{nyS6I~bq+}7j6)VoBd!gnOp9$vD#6=Elw?pdw07`|_%5DyGz17l ze~z7Jf12!1MBd;U?eO|rbj8S za;Gm&pvX@gMc^9W#w3HHN`eN9^Z6A$#ei z7B2OOs3Sb_BQHP?5n=i4pCu-62bz8Qq-;5<^OBx>-KPVHD2AF4t`^tt3h~>m(lz!0Y;z%{@fidaFz`kM>#} z`4oX_=f1RFl0VE(HJY1*-kRaZ_U4)Af1{)M<5o172$YByDipxVB6<#ph!xY)mAZ*~ z#5&LOJbyg-k{>?I&3ef{ zy7}sajX2+PEqZ}W8z1Eqe5DS-jpTEon2v$9Wq8Q-(lbmqfqNX8bLgOwDIONV&TW>u ze+3*$w~!_ff-@5}iOwX+JgIu&udrkE#RRS-t~D{rRZbz7tTx>--H@62`l7X*sATcI zdLEi-AVi~DK=y{MnC2J}A@EELLenK}{=*ZfBD)(8NLFL@lXCxvI;{^10I8v)(S4;t z2`Axmdj>rH=w*f(lJMnS)BN7YLajJ-btx`r6XMtPggHrCC7!eoV~DC5+x2U$?S3S1 z#rcNYo$vy3GTuf%xZ+s^rp>+JO3hZ}UXLcOB0X*FL|Bj0s0HIV zXXK$RQbv@EGoHdl@3Gdmos+YPzw=_Cs%L8T^2tumF4Bk00hyBCx9qTUeO6~)_kZ9T zdsXqbu^vaT!)3yT7Ffe3)SMdWTf`XMS`h0flZ@rGYA`C)j(-}4^Ff`XDeJ0Rp~X)- z^}U2<<1!-o24&mt2J1-ASus?KBe-|E9>v;&NWI@MmJ)$5?;HNhLM%zTuM)zXEN=!d zgM7=E$2_eU_@gx@|MXJ3+jbtYl9U*066rkG#Tqm3dT(fmW~P#2QvG?ys=;>_x3ONn zVEnb^bS|;Z_;tq6b(rIg@zq!3G=9}H*WRING)?EfWkDRN!@#`7qaV}jC4CbApoaT? zl6OO9%uXKHh)>slHh&*Q|KfuYHEMYsoult4L^tN2KCd2z=+n=pmZR)qQ zS_aQcSYYm_^L*z7eCauFC2^TKCL#BqgT$Tk?dqp`o!4)}v$nhHzL&DKlJ(S;p0JtY z&_zlZf?Cj`4ROn0vyvK9*@;aGx2w^1-Kk~fzE}OOw_cc-dzY0ca=Ch!c$(mfG&Rti_*?uBR0Fl-(k)rTbPIcWzT&D?A(ZTX6#oEu(5!ZZ9EQrd+>d1Gx3 zLkkJ>tw{lPr}sLe7?`61-jvas9CRE#`7tVWUlkLTp~_D30+z-<*de^)H*P^A*aF1L z84P``PFpL8d`DXxCWT@aYSCd8jCh5HQQRR)MS-9g0qiTnNI4;d^?9ZwqHtz3+iz4Z zJ_5ecUI(S@7aep4lSg`_Y+h+Dg-!|WpNrEO4HEoFev%v$ntmqFbRTy|%*lS^lyR`I zGGlL-*jeQ0rsG3Nzgtm`ZcA9s{(bTDP#OU&G{XMm9`{>mopZ&KG$o=h$L%p1av=Y0F;FADLcdE?K}<97X{SkP=d8-XF{=Mi zxJRInwCrWbfB$EZ`QDlGv8v1?D5VaQLnmR!>|}Ik+8p7Z?Q4>vCGEl!-h}Ta~q`#`AXd z-&U76=iiDSFTpzm6wDGcJ2aTvpst$qmB&-@q#tC4c(i*mc6oB617q--a?;Y`_+V36 zuUmdx{wO`t{q9#*y*y;P^P&OG8{1$>io^!Jc^re3`q7gUQ)6ZB-O>H6?_2i&T6Huh z$WSJ+Gs#<|y3aOr{8oB+DyKYO^3RB9qFvTKE8QyZ-G)_ZyXw48VTH!e3_FqoU72TytG|#Jvoo(v_O(4PsbcsY86i`}de$I6b2} zll}y6b;q5|&)x*tmkuR4;x#ep(~MSo_0AnMM*S`E9+>Lg79Mb1qK+L02gJ<_Xe6Dh zq=1g|tma>HlC*vmrIX6XsxNjhQ2b$JU0WTLV?4g!9^081b*6 zcf2zq*3k36%#;C(BQGS=a_Up+{o}d?g;HG(?F5}VkAkZ9;4#|o!$@TkP+fMnr0F?q z=iS&Kp-Otr90u+-$L~qenNMdrv-?>#Fa{irO7w}#c3>Rb7v(WVq_3clqPD2J!Zg9_yCVhPrA6moVXa4l z4@m1jV48X z;k9d=OfR^FeB5%zjEqL<;l{*a4!!<)aDkub{G=3I-}kzAa#)0 z8Vk^=J36C6v_na;>Se|6{dX3(`D?ni8w;OG#SvjjB5mS8B8Q}VCw);Rf^CxjD z*dTcQ#sppB7kj62I+~baYJ6BQYmj!Srt6K#k?HJ-Ux>O6BCVObJ{9jM{XHIC(I;p` zj2tdw_WPk(XDVDg-!g63TlPO&x8l59$JD{L&zk`jI^;mO^v@^e6lHw-Y9crtGy9f7 z@4HZPQWC`9p)-fM+RUaV54gYj@C9)`kdR`^AZ;P|bRtnBo3$w@sAjC2aI#$Idw2er zMH};qDWWJjGT9!++3HrLx*&}wgxx~33zlAEmU$o}J=?<6cP9utZ5eo$s3>hsgVuaJ zV}>T*uDNB%VFme8PsioJ6%6rserQ@9?HtoMBZVHL_S{EQRZL0RV^YWq*PChR;2u(KV^TvJUq9AB7RlE6zFqoik zu3YeuR(~@y(Zzuicjvs=dMT^F(mFJbyK@{dFDv9cnRnQ_4jB-ag~9X@j6i}^7$@E9 z+#=KV+>O%3+m}l_+P6D~{NBVcKIoq7tRCZiDU;b&&TPwINpa@6!5V3)O)PnfOBqM}{-4e{;}l2~2cA?70y)1t6U-Z!AnE;q z61`eQHI;yC@&-!>S2+PJn% zwLEl#VBN@l;h7weBN7m{Z96ZnHf>^2XfRvpt4f^6D~V3yikKKcntTNi^HWpW`*Z8` z2mCH>aYeo*GuU;xU~DsMOV;L*449w4s-3{Mvj%$Ty z_viKxjAhD?R}Op$+jcdSkQd3>jVz%EA;n^ap1WiTBjlOp&A1w-6zA`WJRGy~7T{ZS zeo|ogrD^C^&^+nJ)8V_ma0d2FZREqmpdfdXN48rS58uI|dl83uiTH?^ZLrT@90 z>@B<%e`nh|iy+(IhgZmpuazVOowI`|8tSqO@hOHb@3hYCF+#(1lVvIv3=eVy`E&yF zk6oqzT}HSeTz(H*{(d3O*_uBx#$*yaa@LpXhc%Qf|C)?P(Cz>#M=x74 zfXjyz;V{%+(H||ub`az*U}(b0mUH>_P8DZ_ypO5{TPF^O3cAw6G**Qr=;H^TWh-fQ)I|k1pS8j}<4R@(nLchVS zFYVh756f;Aw-{t_WyI1hx!Eh&<2mwPzO{^!&Z{Zat<@a4OCtD<(~7KGBVIQ2tQO}JOA=DeB!eh97s;Xc7kXn>OR)JOa){NTk^cJ5}5)i?cIWz2qRk1Z>OUcKsy zzQtB@%zgB-XF(7Ih`gQ~1l>zae&~eJ&<)zW=hvB&)z;(Iy7-p$g{gP-NjwRol#}XY z(jWii#)Jfx_E@XeX##bB_sLz=t~Z5%P*v@HzzixRR&8Im~KXKk?hT=>2rIL~`PXnsdI!wvl;-sQ9DM z%|F(elrnr(#Y^Mv%Jt1NCOlDW_rs6VAL*Bn3>UNI+L1dF!eE|xyUkh zMmGEZq?fH!KeuSxJ7oOR;EIZlh&_rVH$@e4wwO~pyL7@;f@UN{q;G`TPA_G#u)L^$G@cLwd5jI1rIZH zg?P5eMT6rA>WzZpVP7iDmdfZSWzsTB@ZI5m2QRBdi)^f;My5y4PkHwq{JiwtCbgT$ z^WN)B3ztfcSCchvgf}hj0m^c3ekEylMny4vy(9rTeg2muOFDh0k364pX_i+-QT`p1_GrAz3k~el#p6JA6$+WO)){%+5zdWTG}#v@;M7T(0p~qD$Olcr5|E; z+c5Ezg%?)Dw4d8q#p7ORX4RNaU^IZ_hSmOPGN9!G3Up9Hm7yj-eQF(k=W@=t93mU* zy~C>df8XsJZ%AKb?w;-I;;6$GC+4WR{Ym~+M1P<3{+A-++Imqgc_MgONcEUoF6r@|O# zoT~rsgYFrlKcHws}JpkGB4)*p?<=GDPMW2tz z_IY4CYv;IfjI*~_N^?mb+|#?o_wnoS>?lOAKv5^Cx!r3~*+iC1zTSHENDV95+cqkE zmk;=WGBFBSch>I(+gUfY;;?CtqhU1kEn?Jrn=df?^>lsFFM8Ljr0@d(+n)dhA%Vd1 zT}nOM=Gk=`vgBViRKpy%J8HIDZ<^Eled9K5STWopwsG)kFsePLfV$;NiRUNzJ&BHY zWqY5h4g5;r>KQ%eZ&Js%Jp9u^g2@IcAA)L}!w#cPJTqAg;gODx$TtM#e+ce@ikYya`I9LI`W_- z2kKn|#&bHK&U9MkNT)7_PsQWz*@N$M3=YVx7r0p{am1Mp7|J4T93FiXAKCb0miYfe zZ%RcGxPtrjcWG`Z8#=VA>T$PWVZ=svZduj;`r(W$6-IrWyJwR6iT0-keHXU~WmA8l zNz6?V3_E5G-He}rlMd4=M(}5n7tU@v?Xd64HTRA7q_tL=psQJ)%9IptGb*I@sQCq< z(W(7~JK{ry_?T`5Ll7ds-wURGx!ZOT#+OhLkqEzCr#KeL_8EIWQmN2BV07cpl2I;S zc+YQT%ft|D-ZiLpzkPr7djIBr*lLz%HN!^h?fS_Xd2|tiW{eY#t@n4*g7jWv zLA*%EE5s#UP?qkR+lYDfrxCJPQ8(HS>!0)1(l3>sz?0B&7D$lSq25yWG10pfN0jr| z4I&q3ID0u&-Ynr3aogGaQB^aNS7$wOGBbSi-LgaC_9a*!t}-2l;u+}XDlzzN3Q;Sp zm%}Tx8uX>h-lVX+DcidcPOB=aa%`yPeI{z%qR!u+W(OIYFe2PREf-Xm7sOXrWGl&t zCzIXRMQFD8_Y*iNye?S5gvsorvoOeEbi)!THNdFz7^H#_U7I=@cX0<9of|nK-cCPO z+K9XxHbo%A?d?!cyQ6`VIrURk$L3VvCtmG4-bn=j4FurzvgGh&M)08 zC+BT5d_La~{yv4DcJKFa+`i;I`11BtW#|@4VQ|Dwqq-Gc_XR|g{R6J>ffnbj!Wm^% zsKNy2M%$;R`MQX+@d5?B(Xpr@K0o0ODG5Y$wB;MWL-Lr;BF)G^_5vp0LKhboKMjF_O8JY^ahWMP%6XhVu<<^9 z8}Lpq+Aj+HtQB80TUqrjQeoXtP$Eg>Y`l-*av;3YGtP-{;Qsa0dh+AovWh zM&H}f2dmSRrTvjG*#;^CZgFuS@f$yFpYmpMy)>8GS^rV^UF0{H>W|7juMlp=*PrA3 zYbSTW+2f0MT*DSLv;^WeF;Yg$w6itlYVIU-Hz>071@QbpXY*ONZG(R8`aQ4Ya2?QS zqe!!`bd zFq9z-n4QDzZ$Ga+QWv>mZju^!pVdgMB!l)*a_~iJcGZ{Aprh&xMoJKH;RuA&!*vJc zu33MG$CIqnK_eTyj$bHu?n1S`ap6c?pJTiz{`Oq~N{01!8MDWVEc1*pfCo49x-5+0 zCJx8&;&+9GBUGIxYq5^)zmbt4m1djpio*F=*;f(0pBmqbajsF{ucHmsx_d8HQhR*x zhr%}&!bFg^H|k`n7!)g!e=s1Jsr=}|sm4Z!qh9jCgpf9pUFkqX0>7>!wK7 z<4WqPqsDPBhKknoD+WT8E7V5IA1sf$LZa`Mb*hOMaWpU;?h`-AzLA{i=_kk)+GT2q z$@iYY>YsI+V2?XTnZVM?YuzpyRd}nd4)BA4|k3 z_8GIfez75FDK2b#`hrYZf-iWcg2Vd7ytJ=oW2U*C$W1U3enu%sT}xkiPNxQ=0&g0h zYedLR*u>B6obHAM=>OF{V0*Sr1CJ5*+|4h^3O_8N%@4l9_wN=%=KYy3s3>vAY|AMa zsCnyeLHE~?Y#OGn68>kaR8^I*pu=59Sa(N$WS1Z$Z_qpRTn|l>{u#sXms$yy0Ho3bgb3`0-+WMq+Uv;sHu4}9mgrZc6| z!aAv&k#F>wB=gMm0__GjB8>Z++-u7fW$Yx%K-pBFPyut$PLUXbAFLDfjMGS7T|rYV z_U>8Po9+^$e~&H?^0!LD`c4IUxI*-g5`D+qX%+cylhR)hhgs3$S$ykvF@O0T*+87V zEZXVOHORR`8Z9wIbXroO?8mA`-&O83bjb1t5ZQpVL%>}FiZ<}|6Me09F~;OThnZHa z&2n3&#lF+bI?+GQ?@E(+eEa@5Z-yMX8&0=vPkdMf21`}D>*n68GW2}Y4kfGa2Q8;< z8bCTCXckAwSvTn8|K?HB5}=)a;18R09({{xIAcE{b(0#_Zd8qtYGAGnQWXI`Z-N#F zeMT0Pe{uTHYw}jU0GSO?PsoH~LvaIbaPz_oyAk6nBA#J`zIK~!XtgCYOpTJ-nh+zrq9OU{z=nh_ zG`BFn(JpU`wpT?iuLs3!Eng-OXRyxIlDp=Tj>fO!Kvp2>pTQiL0&DG-=gH?c28GOM z5XuNrNFlcKX!ke9fq(LcQm207SI< z%pHLplrVa%2#|d67y>dns+cBC5fGzic3jpEWf)wi!)RWxCrt^t7y{0rOp8GXsQWG4 z<-c8N#$05i1$~BM$KCDM!e@V!8+Zsfr~LV;;qsp+x;U?+e3Da!T*s2H+K1YTm!v$8 zw%6r@Z3OL}QlYtDT#Gye|I`%jdLSvXHe^=4W(Oj0^N+^3& z5D}^D-wL~l=QM}dn>Y8E;zQ2st(){}3C#2Uq9)8;^#9NgCsJj|z8)tAe}~n7qqSpd z*=6=k6jo{2K~VguGueMZ<~>1_a(-KJ^i32oeq<%$@&VrI|8C|Yq&!w*AWKa_6c;vh zHANx+b+tTEN`O9`8vHIkaMlH`7R`MNVoDdoxfZnHG6k~7<6C#v0}}(|_NwJ8voBPT zE)sbL6H2EVF39ASZTF6GL`ox(RTe?XQPViKcjx-A&CFruHhS4C{fP?&H-Y5bA*}3P zf>P8W&_uW@khm$ZVBcMrPS{2m)OZWi1i+4fG~_sB6b&sy*LrWfbFQ7eeT5_uG5)X* z#x`#!A8c968a@9plnn7h`E>eeP}cZo?=B3a$6kV`}JpE06@>??fx+_KlF z__n0hXWwCK6TAJn~Z z(N-z{txD0tp4Y0j#yE4lUQ8%5RvrH&S5$?jdRVj8+HzU6d3n3MTGg=rx(wru?XGD; zW_aXtL7GYL!}vJ~f_Hgx;+O9U?%gZWf9;sr2{HKUyjdmxqs^Ty$Qwub?ptqPX*mLo z!LzxFx%sJ21@H%22npoFyFVBy7I`2t(J`z5w(*Pu~DjF<IdR@MIQdUZB1-h_P)7iS4O#Gq+rn~_ zjg}!uIW73kU9JI;#bENH&mJ$4PlYXKk!#~Xns+xiFW<>v7y!~qv$w?1WS#U2#y#Yt zJxek?pOV-r)BL!FgrF3?6IKj+zDz+@icP=Gc?P%O{S23@A60janto~U{+jg`H-Q_= zW*XhezqDzk8g*Ac4v&{z%R8b8>}sE${IS(&?B_G>oAMtqcPUaF=-l-l zc)-y0(qm6gSTz^ZblT<_JUpZ_PMP^l{ebTfdC zNA0xn)g(;65;gbLp9&Hm2#;$Dsf0n9b{B~Ze@5~>R`$%iz_UJwtW(IqFQG1k(R_34 zU-DevixA3C#nj2_-;Y=ohj!n6&n@uQ0L9tj`NreCm|>fbXa6eRaYio7-ggM z5C$a9XA$EhVJ$Zu{t14GvcE}0^7d|8&5~aSL89f6Ky;y#1_)AZH>yOJe(=yK(Rl3& zjAP({RD?cZ5~BKX!;8`bk!x?G%V1 z!IWOjii7K--plGg+yG1`u$2I{(XWi(BO@lBwmR!|lde`OiG8ezCzpkLaWC+?6pHgeE1_msfnCP$m1` zu?yp{eP3R#>|6Bm_~}6c!5~1}&GQUPZnx}E_Ic`PjO_7d%vGFNAWw%74l=z&TGZ6nn=nCwFiXdkxO!$I8L_l~j zzV7AmQb)(4zC=g@(eTodS3@>M_&yj!rSzi2iDViCKcC}B`4zL$lwSN~#hJDdllN81 z_n&E9(gE%x^>S*`U#{+J{a7tzFGIe79u-M?h*|}T%w#SCx+qSI3Tl*d&Gx_PUNSQD;kgl1o7F352E(mVj`2d#<;ji&Q5{@Cp~?(lBry#sGHbysXI9uNUc?W z=%%`pstnyO_#!4P68!5gSu`rhqY{lZKmm!Qls{CIiFy?eJ<0`DgYDCc7s?V^I<(=& zQ5p)fV(#bpDJ?Z}E&ZQ+CBqrID}&e#&`A67oh9jqO;8S0aI z#V*YBCWogCO3v6c(9dCS%hygY0y|dj9_;)qu}~5yV_L17O6848COu^--bR5z(IYIq zI|cQre+h0j&ukMC;2Z^hq3CehdYQ7_FEE5s4rEtit#EOyKeN>beK?&n4+>z9>P4V` zW*l*_NI*YwHj8sFOlUsprKWv@KrqO2ye;|#rfWwr$sTO3@6N(WrgKSk?seEN zZB)b<26ChGr}15npd~mxalP&=6Iv2U>?MCc`x#PrPc$9BfQ8?zf@o&lw{H<#`W^ry z2gqCdaJ}o1icqk}g5Cs3f_!TLjNOBsiq-{8fL!o6zpCOzQy`XlJU~ATC-5^6Kr7Uh zSa})zJdRu}C;-uA2Bq&};C6o%l{XNZ1(KioHfhm_tlL=!Rep#AFp=y2e*e$1fG8zi z=!zDR(TiRuL)I+;7i4+cH0Z0FyeyA@Tc!=x+K&7fcKLIA|J!+c;TUJ0m-j&14yg1* zuL)Ju)IbagNXJm9HpJw~7`a3~tuO$UD2OixdYEs7ao-=HR`yQZ@Y{|Vx3POF*}YH7 zxh*&^kg2xt{)i+E$TtU_K3<9SE$_CN(&bt~YJzYETNVYdrqe1TE@IXc;pAhHE$Z3T z{Xak~@=&++Yj92hFK&G#>H~AIW-&d%3-w-F(Fy6zH$ML2iki_(qs03BzrQ7jCt;C}I);M5Kd?M)N>8OLHLyDRmKtwr_pkev4)lbpMxgFj+T!@TV` z(V$+>=~cBAvN!%g)RI8|vnB{u7JPaIdC`lG%t+H3aOR%2xu{Ms+xwdUZa=E}NQfab zSZ_#ybI>%L3v^bVIyROSWTG-v$TmY!RJ|8(b#(zgn(~$Z_ubdk+vm4qt4lBnkbv&h za1%dRIbi13Q8lcA6p7p2)LB?R!@qz3hEnVorCe1rFjhu>`^W-;$ZJDorL@7!cmRKD zjL*jI`E-Q(%p2YJ`KjQX1*XaGjHOj=Kc+ur(33{@KPtwwhi)%FTsHZSb77X163_rl z8&IWId~z|P&AGq4bW^DoaQVVZTPy3!jBo$H#PzR0T-}~4&r;^vl|Ycif9>t*i1zn! zxWUok>I1qoON|0=)%F8*0rg+>*4D^$#m$Yv(4&uZ$qisHrxM*cLvB??oD1vGN{5+` zt1QD!<{JqYp*F>5Q1%k%xdXSgCcnL=jx_R&c>WdB+AHD){R8_7le%K-)u()c$A?=6 z$C%WC4;e%phRtE&wT@TWI6xmaY+l<~OC#s*#Z2mvrx9jBLDLXGnZ_6}r$#(dx^)>j zUDAnm=|9FiW^(e-lkFHr%EM+Huz5S?+IJL-z)f#(PUH|^jT!aTDN!-Ta~botXW|9s zH>!TPn^?#lrTnUpqwnfvv30%%v*J$_YPv0LXlfdenYQFVc4pWN*a1S=<_x1OO&@0Y2as%|r{e=sMAx3Y7 z!x$2yA%VH4iy?7}MW3YbeSm<7mlR#2y?`C>ce!V7vU>sozy8HVes8(rU*8{+=RO1{ zn&Mho;_Nj+2rTYB^IIUr?J?}Y+*EYl-kt0?0*LA9}sV%z-oY{vH$dK?H zKwF^!(~STWi$!fOW&5)lC(KEw}~7 zRAa6bAdffVLdp&$d3&cjv8aM&4{c+z04vDI&t3DPy7(lugJFur!7|%+It^1=sf%qU0y#(HO${1qu!O{{HaEwqO(CzhDm44J= zvRC=OJZ}Z2+mv55$-#AuKcC8VlFuECmaRrJgtZIkF=-R}_bZ%rER5P#A1UyuB_gZf z&P%aWg?CRBON}j<)-o5I0)p@9DG%5allr0hxx5#kc=VsM|LhxXG;{HL)2T)8-eXh< z?5z$Pzg{>xu4@?p>2$?(LN|ohqiz)*5ozd{C3rhKo5t&aEJc0r%=(*KsN?41{^qUf zXHL$1%AIgiSxWy=X8q8C7e173a^7BcFD&n!vU5z;d_h6)|f*F)kSR zXTVAFgcXYSh~kFU>{@npd4**&M!NXUpFsX3&)jbEsDPEJnL5oc+w*bkI|dj7Y>qbNl2)BW9@ zC^&0@O<=psB*4VY>3NDtSFAK*8D1)rCde5bOlYsKDea9PaP`#mc6t(4rR+m`wsMv%~$(g`ODn z&5z*?9)RL(o3`Q=7urt7q`ztExTy5;@wvkpVl72oS!nYl05>kaIq1HFGhq0}#s&$T zzBUNc9f~1}vICUIfavzuxQ+)~4vV{A1GvFKWZA!X1a4Q4;bH2nuT=rJp3rBBSw{&u+@p1cL2t88% zb474xb%Wr}lM#DA5J8hMQE}XbgwqQGBDSM~=A=0PYsa5FP!oh!M+h&an(ljN8UI>S z%v(w2H10RPpEmvn678Qd&cTm7dCKPncv>{b;QpA+!t*WiYadFGDCuO$_l*r=J)B@5 z9-*_jNV+BNHbN2J?-$NS9U-T_%wZAL>-$pw&EVMD738!{l3R_U-xw>IlVBBDK0KX4g8>b9R_uW+NL;saIn5QM|OiXq#w+HdcN*4;kIN8 zX%ul}?QJ;sRje9w6xUlTagOu1KpM;?OaZH=Ti}2IPNq-P<`pig9f9b!xnzE|W*+1* z`Hhgx4*@lLGe~YUJ>jkB7DHJN!@gu}XQv_}yJZdT5$ZL9l)Sh5+7n?YPI&Qts{Wbp zJ@FSZO+uanzTGjZCH)3vs|Zd43J@5YE?_YZrPvFBR)18sCRsuU`C=Au1z@S4s&gRMTc!0m0D%d)bvm61GkA6OcX0T}a1*N4jN0|Rn`oO{A!*2;Ew6hDWX zy#Msa1N=}Jlc5)vf=|R^v8%ceKot(>@p?`t!!h^X{mipp`I=4VbI2?6nQbp6wjyYG zf$R@oq&5b;viH{q+p8U6F{RT3%s^h=emt0(Vn-mLaZ|*3zGHt-IzB%$hz3%TBD|Q5 zMt%a+x@f}^p>s>I`K29PwHpCcc^Q*tlrv`M&2tp~iBFZO&1vl1V2h(`H0Zc?%t=Hj zM6q8L2Y0yMz_~^6A!bv294L|n8;=6m{1Ht}yuKwrN zeMvZWR4MFiFEmC`R$L(MikixHk>CGF04SPW)%3LVW&ZU+x3X__g1vgoOFVV;Q zHa6wK#`;ve#_PzKeU^|RwQR44liTo&zchtBL>#07i0aZA( z32?gP$Pn`Nqg}B7t`>$4h(%=}*0cQ}D0SYB zf577D940c!zD1W3aLr>YJ7)XO4!Gd+p#`jgpwtEy=T@ zhGNdul@x-&MaSUv#UOFjwBAgDe7!bjK-#AuJDpgRoGbJf2qt-SaJOaWxuCoY*W~1- z3ZcS~NnKJ1iJeQ^&!4ehg1upbc@c8J{rTN+kwtJ~gO*QVGK;3B%vi$vn~E8q$%bLo z$;H7$r`USpq|j$Yn^_WZOoy6OH+${t8t)vtZ{Tg(`DEeD@S>#ou*T*3^7wXYfA;9+ zqCuJ8Ef3T9TOU{{X-md{QiUtwHtOi)q$Wc{>IJszp!b*etC*q-grVd?730T`AKl*f zj)u1sF-``rPo?iR?x!Og%0@S5)vr8csDy#p00+{lH3n|rT52Ck<1%i+l`fnQcdioC z$XQAJdkTAu@Jk4XAh5{8#|NT=XrQKb@5@`BOl}%AEQNxwtMJW239;&hZNnM5qb0QE z-n(MStv+p1?b*oCe&Vc{5z&h8&!ttj)_#FUYoUHyM+YYCs-Tv3W_{Pwzr&(CDEqMb z#s7|UFkaKW0lH6ab0R5(sNw-q9*8Qj?4s;7QQ;Y=4`dQpIsF3z;LMYnd9{9hks0j3 z@r>bdety#6y0mWD#KK2~CR1Q@tg|$;HKGzJaq#6tFe-F{tH%zQ>hODDz-Y5Tzt~1O z$Y02lj?mg#v6H5|28Mo`x>3DYV4lEw8#BbN zid$BgmENG(0Obt}RY7^Eu)=Lpm7UuX^yhJVMM%GidImlyJ&K-heNv-=n~_HMiSgvW zjFc|mhoCgyLHd$l?rkV!b+)B~8<@Z9ybeNE@3M8!3snUWpNbj$m8!B>FpqO=eukm6 zT%j|D&#t?wfZ6{keDKxI!cE`qZ0#9D%JYL+|K`l=PtQ0aaaGemzHCKNcdu03sX6+XSDvOCP%vBYpnX`!335 z?OIHDKI`Oq&C~)lk2N;Eyhux{E3)wzupbmtMJ8Dr7JuDpO^Bb$5_Yo1X?}l>SEn;d zg7(&PPaoH6nuYr4GH;f^=`eeHBC%BLv%puI{V^eWnrEc>aRn)QxEZ1px}to<{#||4 z7|)EqP<5#j4$hUG=40|J^b{dyUFo8zbwuSUA?{p>%`FuO!&Y^W-AI3&Ga{?ZiidZrUBx=%kw*m#8N8ovtp<;>Q zO|GR9+z*uD@HtsPx)E=1pLO`Ad*Av#RFJ2?2Cx1O?)=w>QP1j!01`>FLRQIY(@NS3 zD59hE1Yhxo*#5U0KmqhVy*zF9zkMv zU(`vsk*J_5p68j;{~XHq8>XYA|43*?VOD5OijUY0u)tyBD+?bGkHeUuczXoQsml?k z?k4-};BJX|*B_p93(VzRo~G2sC!iE%`OJ}?033GsJu%9f*3G~Ug`vvs77djLZljBr z9}RW)%L%9UU!EuFM08>2#n=pF&X8GD8b7Vr?V?ZNCuTpB4pB+jIC5KGt*5E^uFWO+ z5jW;Tl)I?h07+({ z)pca0aZeo|QUA|2frlFikIz|#C9os%F!oJ*6@7V4INjX`#}A+Z!e_8}%-NE~Q!(joiiYml=`j zrLb{5z4ChBf_stuyDSHH0Mr0r>-c|m-%v7=eG@4xEVo$!YdVNw0=LtV=OCO1vkFLb zZW+)j?k>mNgU( zZMY~mOi1vY*7lmChLq7pSl<}FX1qGO>zzlTW8liXY9GAUNm*W5iP`mE$G|&W zO?R2CQhgpvCnuuPl^<8&5dddNhc7vy*9zuZ^>bbK2OqrF%hx=V2~p1@gQEz>QAhjN ztC<(?q!-5I6&%%CB1jRvtIttvv@+9jdh*ooSR^i`zRc|?1Qv_D(Gm4Cp1F~LT%$g& z`&bZW{LZ4)N?TatCS;!P3*?c!waKa@>1qE(B1D#b0Ro5qSDX8Tl{Vos0u*)tqS(;a zT5rC|K5zj!QxMDkiK>;nw-4vG)y)dwCo`wFoJT$Sl$<*EH)%b{o3w~^e;bsFVTu*L z;UZf7S}uzu<|g)Xq$CKU@le3yur|~g^DFxE>b>bNxIX?1#D(4yX)W}HU z&wgcEf+=FB`G!;X^F4=ixdZ8=XVOPpGu6_?NxA5uxbDjxH=?+(LuZ!3e_jX*TF!r) zTyD>p@i_DYcM+E2wRWPa_+NCQGT1eEldH@zukmz_2f9Bkn8hKu2KTLextYxLKYTev zuvQv=Kv1FNios7hCdk)&6M{W#v#FIHoJLt^Y?VWkCrs#b7DM5W)5};JkRNQnT zh>VZEqr-a%6$W$wJ>N}Nz;r?m2uFF-g_$UguEP9`Ht^@PdRSN5Ucs};44$<=ny1TN z%+yqtqsGcXU7mB9XiOOB18grz>pFz}1kK3M9CEGaP2(JUUFa!e zF%Io+;fnF}g(7_`ev8P`jo~q3KFeiIv)y?hq(>a(@Y)M$5wpBDOJsLp>x+LDWW;hv zweoaPrl&=aR)&99%70E~B(_0y%mr>XJWd4D4a0ut7c$bkYIaMXA{*B_~^lag3$hop{<2auB%(4rre4lghguYWU_n6xLDSQAY&~i~!&$ z;#rl`$$|3(Q2@&5v-;-Uu)8KRgD)1mv#;MtpT4t4`VRVkN1g}EzY)(4u!H~(Kq2^= zx|kY$rm6#kHpPs@K=>A6OF;WgFy4}7+Bu>n5k2Br}sb7AD?fY zt{Ch!PB~=jk_vFF4&sD5Zh{3(=jLcWyocPFxCZ_E_wNIaBYlkesKMVC2AhzmV0%8h z-t-R@Y@HFJ*$nx3Y54f~_aucstcZE<&_VwP>aNdhD+$_VIMfQLIn!Rv-saX%_FzfG z#3mJpx@ajWZ24D$T#u(c3|G}j!{0L_A!V|&pf}OG^RwgCt0CTTwY}Z$_KeP6<)VtAs?D(=qC!Ef7!kYdZS}o`zY*MhH zBFr*}D!SS+N1wa5$w8Uw;k1qy9TQ*l=#Khn$GdU=I(FNi>hdOUrp<;oaYRV1XroWg z-z&9B{)j~Im+NR#?Sxbt$!E|^=Ezk=QImWRC;M9DOJ~#nmO)BVh;5{icJ50p;LUK< zp*uwZQ})jG_V^1YT_P^Oe^UEoaA0(EcFqF*T~OoP9CF%m(9);*{+FbZh=3jUO#h2H zWYBT(^!CxE3}xG+;xRBD2m?_ez|6Vg27mrsgu)5t=A9iKq04v{{0}kcOz+s~3L0G- zieUJulAo77-^@yyl~Gd7xpbp!Ca$~Y+%@EPP7o_Qe`5aX*0AJ5i6LvQ?x&9pd2kx> zHnKf)X<}{DN#=o{4#QI_qu~vD+-Tv89?=0g4y>T zF%w%n5oTv+f7`c~JD`=-U>8ETJ$Z1q5Vv%ziv^j;BFV<79avgc*(fN>gGNjuwt}s+ zg7$XZ=5FhS-rjq75TKK$jwBt@sQvA0<`6h6pth6vKO>ol*wlon44`uX*@pxZ6mk_aF0{@#UD6WR2RsM*GT(UkB1Qf&3r=$wYuo zou_;kFJ!ir%cvF6+FRx$6HDj7FOq`CV7q%}-T{trD8=tw!O8 zmuzZoo{Xgjv)ZELh_m&yXJ52C%5N*f3>F0Vl>|`=vGCxRz;sX->;DIOZK#(~*gg7O zhT#jW2ME%<@xEBqx>`Mb9VCKtR~hZ(?+a=Fwfvwz`G!Sfe`fyYqW1o-6`a{LcRFzo z6>LV)I9SkrO=;#MYxy5n(?=4GjJqzw?=@8vr)^WP@A_qtM>Ln0zw~S5{yF8_Rm}Ed(@BT-U~+?7GrHw81*-fDKwAneZ?(kZ%3rre)W`%B`;J;OK35D z7*(flQNevrlkh)g%C9s%ut^byf{;+AE)#GRl{4g7q)pYCtKOrn_bgjHj!WOsum`zN zO|yJk8mJw2PgderK!Voojm|wPjZrAQaoYK>h9T1p3^tJ?m)V&85GSM3m!lm2JGyQA z4I&9xf}m*T;P45;w?4Opo11PEIrkrLa6;wpLZ#5Y3y2o?6KQ(B%W3?1J{*IgFm*>w z?deQ**CTM&5!fx{Mss8h9W!#o4SCC7G{!xUE)fAP#wl^ZjcR_|~imL`>nPL9wk{`0Lq3R+B0> zU`_3R|MIYRb65^mH#PCGjRGz;@eAB=K{Dwj3Jr!ekFEhdjV^etfT=HBWHFv)nfnyZ zcd9ELARtc$EZq%S#0gsDMVKk7Vnq7GN<8qH!OhNiCk+(7V5|=%-_uwN2Zx6{^Uqh~ zIbgimL_U+|^D*lSV{i|3@z{OVp4;KEDrW`?r4b3zvH z)ue1V=U3;L_{6s23dvrOdP{+lXw%hU*~)6~JJjR`Mg?iO#AUDSRK(Tsf2p;75u+@e zxnV9XCdPHSk><`sVDXV%uxrQ`-@why5NJ=bB#t<*D_!;XU%%LiS%JP*8T4hR*1q%DBV}N0AJkdBe$a z%vVR+S`#8v(y}}TxkBje%>womA8X6>*APe2H<^|7B|FauHxztDAU4~L+&A8-Xb$WA zY0LVKrdGcu8b=VtD!*{LzrNPDnzn*kIkGp~r-3Fm$FR6no6O^L)oUUtUomHHX1T)D z2#ZKm@d9urkl2&}dxkGRe_^^1X2Lh2hrrs%zW&uCVu^cD|8O9sj~Q0|s}Q*5Ch@}9 zBfZd^ftQ&M4>_7l-4<$S50?sL_};6r^@>7=^uG}iXtM%F58yeOyO!;j7cX9zn}Ec7 zRI*=?xvnM@7NiR_IA2Y?mte%>ots?BEf!5O@$uWDatHdQO-J(Sn@*Mu8{H1&Uw>m4)WCF%((3+ zgqPNXGx-fq&CZI%f;U6+0&;PpteNkZ8k=fc67Q3*o?GK!-zV?QQIk z$bVKiL;8d+bh$I5J?sB$v});mMAW|MbHk8ey$aGDN(u;I2)wXYHvPlv5$zTxV9J(K zx+QV6Gba&{x6pmd8=?zHZj04AFEp(nf->cPYjcKzA4^ez!p|&iPKJ2-B8Ylj*y@3YWU`0G7ml6%Q)rjr_vwt6dui%I{LYROa~(R5(WLE)7Au*Jz5UH} zW@Gy_%l?>e0WG0aOs#VCmms~_(+Z~!PFBm3UfG-hN$c(||MciK zE+&R$1TprjS0u1?NHB3K&DES!-3xz1k~0o*wJcbp0vv>|WH2<>;W2s=)*9&Bz<-r7KbcytaFh>v)p z2M9~hjGguK*55xyyrsjLo15F%-j>t?V^UNJgJ(@Qu!4%5=g8*xrKP2{vv^w;ay({+ zcs=K93HTcI8^a@+RV5!sFY-_7*Y+M{( z5Kaiii}enkpaoiygPfck`Nd@}?oY$R<&Ox`)6`nQerH135d+Q#?!(Cq!uNL#G7R(BAr{shP z>GMWde#hX4{Ay4ZcU;-~?o$@G(z34fMsP_8gi+{-V(ghH=*z_l%}DUVpqCvQ9b+S+ zRilmWWPy$;K`l=K|D$m|$}{|lb7NRS0;$fI+m1?#IzzxGhM#=zzmt1qWgBvjTE}NM z(H7T|&4aeViGC}QbyL%HLh(t-BOcHkHhZ|a+KxW5DF}@cz@-mIS!XN0x(ITcv5QG{ zPrASOBusy(={rnhqltuS>SVW_*!AqdcKG>ho#&lur@81yJnY7jcer*+D_hDiW8(kN z(M2hBvfC+_cFBLgU^k7_Tan_pQEkyuc0v;0ZSe?uAU1w#K9~m~!)2IUB-VaZ%%&X*Nl1Xk)Z6~&oeJ8C zl)`}ejE+LN*lVTB^9YVQIUe50=d3OCHfo|U1<%aP4!R!MoBo^x4n^J?%=CdY?^sV?X(Ho(zILPz zd3Kv3zHNQq;<*D@-5L!2*nE0Hy5Rd(YeEsNbl}S7oUG`@gU124D4X%*cGU(f`;J0c;ZdTPJ|=d@8b2e~D!?P-jGr1)(0G+DN4w zTrBy1$~(QdCm8)fP1!Bg4mL%2w0)L0(wzD{M}Ybm)&R8?6@V45m|Q^{yZRx=QvQvX z{Dya8O}VTY28eRn=*tN=QwqJ7))-BW?B8!c*9sD9l9arw`f7orwVXgS5u=k)j+3H$ z_9r=9MOgh|QYC}%4F{zDVVlKq>*%f468?t@ZKPHb-+B&L-`c6)xM=1PGDw4}2k7+E zUKgfBkcogZ*4fj88)E&3*Hzr)Xx`j$q3M#C@4T-`q5cmfBO-3Gn@6+tw4Wfbm{u`L&9FMfeGX4d)V-W^^^8ECYr*GM+tbQ(}x?0#_ zzJVHY25&x#^y5<|jeE!&ezop?100_SdyvO52}|${vM&|mu2uh8W;Q-{p<`s_B=Peh zOHr1Pyp4!sm9KcH;=kAN0eDI51ZkY()0`u_L5E?PzV{=g94onF$5<-^GOM?N#ncG zWLjSx8yq5e@Ve%#jZ(HyX)?l1Cl75xFFb`0bVSHqQww9OT_DG@O%JH>!!_ zSldUE7L(B)@5ztxo?M`LRM$Xy&8exO6j=zk|L^pHN>YEdj zoR1S?Wahi}0f)hdX+v~iZuMz&w#89_+P zC=LeNWD?dW|KenIDv@A}L_<%`NdWH2r3yQljXL|%cRf!r)!{_fY?Y!Q>ihC`x;Dd1!2HQr-+GadUeKoVMTtt7dzWuK0Dj+7Q z%=eE5n-P8K4UO>@E}qrYOY3p88JU*#2y4Mxt~uqnBb#28Y}qak=?}xP)peOpFElh8 z$7NdR89w$u$C^tjRo5Z!Nn{nIAkWmYxqIN@y>hlyD*w~EZMeDIkrw>dVFR_-ipLP;jR(wn4RQ5i2|Fn<9D2L~o90OPbR@jEph8Y-9! z;ZZWw4h=4Hruh8{w9la9cyF)%)XjC?#IQP=1&vtK5RYDFg){&vo z=2Xzk+03t8lWQq}JPp*op*n|-j*gPoYsRsLS&oVP_=U+sALOml-R$WNch0q?%uP>~ z4C8{LXlS>fwzdcepabpur)#yw0-M7n3b2DlmqHW@ybvpv8;|YGa+Z~hK_wn`!YX)f ze|#9d%oDZ`Z&)xOK;5-y2foRfxWP<}9+t_d2C*ezN%{d3ahJjn721 z&SsqI2`wlOI?}J?x^O3*Xk38W#}89!^m9>98gVj*+dp6 zUR_-sLMCk%sseb$aKNauPgCw{?A4YC-+=rFU;0(0EK%*qA_0yK7b4;HyEbkkMlOsT14yU5E*8i-?ctZYM9z0`I-BK7(;*_;4nlfbCV)d zJ!tOlHXe-3J_Apc1`DcG-oCnzTW^btz%^SD{6=wOrDT~4hsff)Q@LadF*Qb02B>l6 zUSak*Dd7yOkiT4XQ|XnJTo&AuF|gHRT0agiS=|-P92C^p^+n9rAub(C2{)_>gAz?e z^J}CGGzU*_tbV0i(4xJ!zzGEu)TUL&ij8K{&XJsR_12GH;mA_?B4gzu)^^_WkNH+MayJ8f`)|PgkX$6jRd3zyPMk zamNe6j41g5DC1ap)Rf5;WyRB#w6q4BXR7Qcyv=-;u-r=mmukxGM>cy=<;-umy_#x? zmHpM*Aw@;m|4ex(1V9oK8a)?L9&LXa_j1;Es-f)`z@UUkDC}PUsM7b3I+;UvxYiLf zIYHD*x)wJT=Wm8Icb~iJ#w1%PYpU=vW$)?EYt^B7{5TJgda3y7>$^Vrz(n8ljK7xd zXZT{03$uy6tl&tTJZCk!B7qg2jJ+)twek)Fr9;4rt;$ot!{WT3JzoR-thLSisUO>FHp*eGUh zuDR|jmK7BZ{mvP@MH{_^OHRfy7gY#D(7#jPcqbk{OLCm)x*N2I51n%~_W_Cs55-gs z=Z#_8^uhH`{UzYWy1sgn6c&Q7^||u3&zT4Jzw?~Y*$N)!Ck(Ew>Sp6Pk-4*5Omy|O zDa(OMETp;b`m++#4Er;AtEPXfRp9n=SuU&9Ko{i$<+ID*NdbV^NYmfu=n04>_cf;X zT4gjq3#L_i=yzS|rIC4Hg}Tib&O!UBnG3)-a&6}iN~WMEBus-ZeRA@>phZ`R%BIPu zh~(z7^YiDQ!(MCEibk=(NjNdJz%2XD{uLa~jK}gvF9hgY+F zkTrN%D^KGi@NR-BG8UbO5)JLCjSVjF{8o!<=DbolwfA-~ho*Tyk^4ngg;QQm>gT^%DbT~9ydJ5NIf&ESND(BNpn^H&Kp`n9xq+Nv5+w9pl{Y4UEQJVB zU}3f@tSu~xMuoDn<|}c{baA$foNP|Z9dyZ@tE;R0z2e)~EYHu{cU z++(9^d!~jM{ksH3Oy}nN+(I_^zsbGGob)jXc-{25h#Q2fU|&$-JYs7XB<{3Dd9Y2j zcY1M{6J39ldMEf_KU^4;*UB8^z^2t5?sc=xs+=TjZ-K)C%_$gJa%h@n;Ex^>!f710 ze)5FYscw^9fc;}l18~;hFQM=y7aYVWjmPO9RtC9Ii-L(u)mOQ3F+>ORcZ1pMX#d?T zC>o_FgDQ75l7_k(~`F z!)Acg^$FZ*qA!QjS3KM9YX=CIjiIb~)Ppcu1KoS%@j}~aKlFnpe9s&l2!QvAUZ@z8 zmK!y?DF_!5sDh}B#{B{FG#ppxvu#TmCoa~j$ZpF>#T?v|R5w%B1;rsFqKG{6BfOaT zRH9wI2-alI*|2X9@*$qXDBS}1*A+Y>$}em2YuMP{vI0{53>XB6p^1qITIYsxYYGHn zuL1rIfJq6vT>*qpTwOK$-c!SM#!M%jUtXH4_jE@1V#l3zUrDW12C;eMwdyVgzaG}# zBExTMTQPc=+Q*5zi!>RRgu}*voBK#bzD9b6EwE4{7=t2f7J_KI;~ACnbV=2ESU<_7 z`b%X71Jo_~-Fk@9WrYcjFAg578yyKY&dz1IqnpyR_1;MH(!;YxlcQQMKw(@KWrASALbB&3e%G1@g4NmP;}Y70MY8q9cK#*S@KyM6+GgV%@h>V4q_L|!3IJZ ziz&-vVZUxZ`lB%5y9XaFz9!cEa#+`xc2w)_S8;iMEL~Ler&)v`Cm!1duhyYmhKHgZ zkonyYWdT^g>89`tXc)1d5e7_xUq}e6oquS2JRHiTM?B+hZM%B$l&$&(w@5>tf4qaI z_m6)@J>F3jvr4jL{OT{z=LYI2i+TLLYC399D+mUz@NI@O*QGOs(`1-J9`Shb zrS@ONz$raxEk}nwYd;C`e$g@Spcm8a+KdjAF9Y8fbzuCcVd$OuzO-zUfX+yXg^PSj+J^iCL`V z-+bCf{RgH<_U6h$K-qv#9xxhFDBI{ovr+=?x8XeHKNw zmA&6Lkl{!x%%VNjipds8FW-sL@AzikH+`0+jq=7obp|l=gK4%(BI`z(K4sR~L-F*W z&&9=C=5xWHn=pe;eKELh6+%;VSH;(ZH5wRq$A|Q zwGANjHxVNL8Yb86)dWacoM4Xv^$pI>&%;=6N)y_yFp;R|43m(V<@PpBqpy>jb-Q+8 ze@fL*&ZA3{vvtFZiZcD8f4ctG@Jy_(H0G>LZOoJCeHI$ggTZy*+O`mp(3`mRjz6FB zM?T7ZtiNJQ{4x29{AXJlSnGg5tZ*JXYU+FEUB(MQUwe8YsqBE=sQ_~zPYks%7}s{g zIS4)jEBOFsxzi7S@wX4GfK_#Ttuk5}e1l2DLOMPASE3zk?VFo3Ry$0+f>LLg4Bc2u zHhYb%vc|9&Eo7sLgDi?703pIqWE{t&%c*#pc zHG#q7MlrGUwlr%_^?N+tdaEXAcg2S*c%VE4LyYoXs7;2E>#5Aw$B?qX?eE24MrZFk z4qzH{EjF(1>c7c<&qMQu;{L~`3qF1&6Ens$b))r1Fl>Sqr$5pYo|o~2?YLy0 zB2M-&r8eOfz~*Xl(*c{qquoJ_1VPww=;VG|@FwM9u^4G&4V~>uHU$mohZJZ)LC@(+2@3W#;MK$rmUkUTnXy@hz7HpTdNzOlY~eCw~> zSI_+8$@t)ll{i?TQGTPe;va5-xdD1LEH7`pQG&^_D)0DJ41 zDLiI?KUd33*)^-7dhzIaj2;?^pw8JhkwK@{()wCH%xM#kd5oh|#q^wQ~@{(1O3 zv@_*P?q#XbAIP(Y*cFG-THUx7u#;TLJW4PN#NB@rpvM2ub;DMIia@SXpV(>nqlfXG zmcbdC`I+;8(9Rl{6&Lr8rw85g2WtHNl+Ti|-+2}F*;bYN^YEssuY^DioaS;R)kZe|?qsp1X*%YQfA2}W%-L1fP_`SZKRaCTib5}oFMF|0e z9wk_Iz0QUWcIgKfyX|kP%tVa7l}KE&O~wZuHs^!To!y;Gdo2uBD9+vy zjxXH(RKMv_hm}#6A{O`Bt%^lcgJ_r3#M}R|%`4&qrZLmFG3S@fet&Sx&`8eG?MUXU zGbc^R&DD)t_JcDABdQfDu)cmvOyFOGooxVGVWfp(#A0ekDr*hK3QLpixQMh}r^765 z1-QzmnG=42CU>fL4w}O*7jdLdib}WQx9YBNlB}^1k;_!K1`5{JekZHs>7t*!>wga2 zlrei@>F4nFeOKMtyp)idx7|SQ6x91RyQzMaxn=?c^9O@IZ`}~ z6bb^>mK%TW5VCztPrqeL^fFxKH-QX(L6-)pM>7!5r>CcbuE49ev1WX0$@rUR{xv!3 zPIvxT`zQTNaGMcvBAKzjuO<}Hq?Dthz(NX?GH7XGMCak^g|GU4O7;IDB9E%aoS(XMaURtgI3UoooNkw$-O-;J`b zI(4`XRC!DQX2IrjMyaj;K~ zZA!hTX|VRh;Z_5=(Vr!~$bs8vf9AYBJeU$x1cl~ivm!g>axCXL91&(OOiEIamuDPd zn+L}o7G)D#=s_mMV=!zF9nmV(Co|9Y&y9RV;`W~1CEr`?y^b0C zODSn*I0wm7sJ!J3Dj!~^6Uc8oTbg*MVj}6gi~6oO+g3fJ_^92B9z#hk~-L`R+lG}UDK{V6=W2zcW#w^_!5 z`uJs^ZJTp!r;P~Oztgvr#H}2-gwu8pm9f&#wfVkyZ}RDbaDAdE&eyb2|MSyg+tcB} ze>Qs>rvXhlS=t-zPx()R$rVo*XFyoxOf~2O>I|$Mfzz!OVf*)~iZ8UhebbhY#|e|H zP4D*oQ<|y174*lS+RJL*i}CuK(NuWs1lq~Oq^PZ4(wdHY*ePHc<%c_bo^p>>{`_ms$&BsY=ijR|GDtHEaD@=Az14b)&w0=}P kfMu9K=gZY5rR{5s^W^r0SmGaY2>4M|)Kn;yd;04C0HW43-2eap literal 0 HcmV?d00001 diff --git a/app/examples/Drawing/Clock/img/clock_bg_big4.png b/app/examples/Drawing/Clock/img/clock_bg_big4.png new file mode 100644 index 0000000000000000000000000000000000000000..91bdb307ec43d140ab3fcaa753d85bdf8ebe076d GIT binary patch literal 21425 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

fW?v-S#gJ_5ey@ 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 literal 0 HcmV?d00001 diff --git a/app/examples/Drawing/Fractal/.directory b/app/examples/Drawing/Fractal/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/app/examples/Drawing/Fractal/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/app/examples/Drawing/Fractal/.hidden/screenshots/2014-12-14.png b/app/examples/Drawing/Fractal/.hidden/screenshots/2014-12-14.png new file mode 100644 index 0000000000000000000000000000000000000000..be2de25ed3710725ae1ee2e61e0bbf5d24ab7a92 GIT binary patch literal 152730 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

wP{jbT0hbxc`gsE+TZ7XbB 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 JPDHLkV1hqvs7C+* literal 0 HcmV?d00001 diff --git a/app/examples/Drawing/Fractal/.lang/cs.po b/app/examples/Drawing/Fractal/.lang/cs.po new file mode 100644 index 00000000..92f007d1 --- /dev/null +++ b/app/examples/Drawing/Fractal/.lang/cs.po @@ -0,0 +1,60 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Fractal" +msgstr "-" + +#: .project:2 +msgid "Mandelbrot Fractal with Just-In-Time compilation" +msgstr "Mandelbrot Fractal s Just-In-Time kompilací" + +#: FFractal.class:95 +msgid "Press F to deactivate Just-In-Time compilation" +msgstr "Stiskněte tlačítko F pro deaktivaci Just-In-Time kompilace" + +#: FFractal.class:97 +msgid "Press F to activate Just-In-Time compilation" +msgstr "Stiskněte tlačítko F pro aktivaci Just-In-Time kompilace" + +#: FFractal.class:102 +msgid "Press R to hide rectangle optimization" +msgstr "Stisknutím klávesy R skrýt obdélník optimalizace" + +#: FFractal.class:104 +msgid "Press R to show rectangle optimization" +msgstr "Stisknutím tlačítka R se zobrazí obdélník optimalizace" + +#: FFractal.class:108 +msgid "Zoom" +msgstr "-" + +#: FFractal.class:108 +msgid "Speed" +msgstr "Rychlost" + +#: FFractal.class:108 +msgid "Fast" +msgstr "Rychle" + +#: FFractal.class:108 +msgid "Slow" +msgstr "Pomalu" + +#: FFractal.class:108 +msgid "Max" +msgstr "-" + +#: FFractal.class:108 +msgid "Tasks" +msgstr "Úkoly" + diff --git a/app/examples/Drawing/Fractal/.lang/fr.po b/app/examples/Drawing/Fractal/.lang/fr.po new file mode 100644 index 00000000..aa2462dc --- /dev/null +++ b/app/examples/Drawing/Fractal/.lang/fr.po @@ -0,0 +1,61 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Fractal" +msgstr "Fractal" + +#: .project:2 +msgid "Mandelbrot Fractal with Just-In-Time compilation" +msgstr "Fractale de Mandelbort avec compilation Just-In-Time" + +#: FFractal.class:95 +msgid "Press F to deactivate Just-In-Time compilation" +msgstr "Appuyez sur F pour désactiver la compilation \"juste à-temps\"" + +#: FFractal.class:97 +msgid "Press F to activate Just-In-Time compilation" +msgstr "Appuyez sur F pour activer la compilation \"juste à-temps\"" + +#: FFractal.class:102 +msgid "Press R to hide rectangle optimization" +msgstr "Appuyez sur R pour cacher l'optimisation par rectangles" + +#: FFractal.class:104 +msgid "Press R to show rectangle optimization" +msgstr "Appuyez sur R pour afficher l'optimisation par rectangles" + +#: FFractal.class:108 +msgid "Fast" +msgstr "Rapide" + +#: FFractal.class:108 +msgid "Max" +msgstr "Max" + +#: FFractal.class:108 +msgid "Slow" +msgstr "Lente" + +#: FFractal.class:108 +msgid "Speed" +msgstr "Vitesse" + +#: FFractal.class:108 +msgid "Tasks" +msgstr "Tâches" + +#: FFractal.class:108 +msgid "Zoom" +msgstr "Zoom" + diff --git a/app/examples/Drawing/Fractal/.lang/ru.po b/app/examples/Drawing/Fractal/.lang/ru.po new file mode 100644 index 00000000..d309da9a --- /dev/null +++ b/app/examples/Drawing/Fractal/.lang/ru.po @@ -0,0 +1,80 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Drawing/Fractal/.project:19 +msgid "Fractal" +msgstr "Фрактал" + +#: app/examples/Drawing/Fractal/.project:20 +msgid "" +"Mandelbrot Fractal with Just-In-Time compilation.\n" +"\n" +"This example allows to freely zoom into the Mandelbrot fractal in real-time. You can toggle just-in-time compilation by hitting the \"F\" key." +msgstr "" +"Фрактал Мандельброта с компиляцией точно по времени.\n" +"\n" +"Этот пример позволяет свободно увеличивать фрактал Мандельброта в реальном времени. Вы можете включить компиляцию точно по времени, нажав клавишу «F»." + +#: app/examples/Drawing/Fractal/.src/FFractal.class:104 +msgid "Press F to deactivate Just-In-Time compilation" +msgstr "Нажмите F деактивировать компиляцию точно по времени" + +#: app/examples/Drawing/Fractal/.src/FFractal.class:106 +msgid "Press F to activate Just-In-Time compilation" +msgstr "Нажмите F активировать компиляцию точно по времени" + +#: app/examples/Drawing/Fractal/.src/FFractal.class:111 +msgid "Press R to hide rectangle optimization" +msgstr "Нажмите R скрыть прямоугольную оптимизацию" + +#: app/examples/Drawing/Fractal/.src/FFractal.class:113 +msgid "Press R to show rectangle optimization" +msgstr "Нажмите R показать прямоугольную оптимизацию" + +#: app/examples/Drawing/Fractal/.src/FFractal.class:117 +msgid "Zoom" +msgstr "Масштаб" + +#: app/examples/Drawing/Fractal/.src/FFractal.class:117 +msgid "Speed" +msgstr "Скорость" + +#: app/examples/Drawing/Fractal/.src/FFractal.class:117 +msgid "Fast" +msgstr "Быстро" + +#: app/examples/Drawing/Fractal/.src/FFractal.class:117 +msgid "Slow" +msgstr "Медленно" + +#: app/examples/Drawing/Fractal/.src/FFractal.class:117 +msgid "Max" +msgstr "Макс" + +#: app/examples/Drawing/Fractal/.src/FFractal.class:117 +msgid "Tasks" +msgstr "Задачи" + diff --git a/app/examples/Drawing/Fractal/.project b/app/examples/Drawing/Fractal/.project new file mode 100644 index 00000000..4132dc62 --- /dev/null +++ b/app/examples/Drawing/Fractal/.project @@ -0,0 +1,18 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.6.90 +Title=Fractal +Startup=FFractal +Icon=icon.png +Version=1.0.0 +Component=gb.image +Component=gb.gui +Component=gb.form +Description="Mandelbrot Fractal with Just-In-Time compilation.\n\nThis example allows to freely zoom into the Mandelbrot fractal in real-time. You can toggle just-in-time compilation by hitting the \"F\" key." +Authors="Benoît Minisini" +TabSize=2 +Translate=1 +Language=en +Vendor=Example +Packager=1 +Tags=JustInTime +Screenshot=2014-12-14.png diff --git a/app/examples/Drawing/Fractal/.src/FFractal.class b/app/examples/Drawing/Fractal/.src/FFractal.class new file mode 100644 index 00000000..2e2769f2 --- /dev/null +++ b/app/examples/Drawing/Fractal/.src/FFractal.class @@ -0,0 +1,245 @@ +' Gambas class file + +Private $hRose As Image +Private $fScale As Float = 0.0078125 +Private ITER_MAX As Integer = 128 +Private $aColor As New Integer[64] +Private $XC As Float +Private $YC As Float +Private $MX As Integer +Private $MY As Integer +Private $XX As Float +Private $YY As Float +Private $bFast As Boolean +Private $bRect As Boolean + +Private NTASK As Integer = 8 +Private $aTask As New FractalTask[NTASK] +Private $aResult As New Image[NTASK] + +Public Sub FractalTask_Kill() + + Dim hTask As FractalTask = Last + Dim aResult As Integer[] + Dim hImage As Image + + 'Print hTask.Index; ": *KILL*" + Try aResult = hTask.Value + If aResult Then + hImage = New Image(hTask.Width, hTask.Height) + hImage.Pixels = aResult + $aResult[hTask.Index] = hImage + dwgFractal.Refresh + Endif + +End + +' Public Sub FractalTask_Read(Data As String) +' +' Dim hTask As FractalTask = Last +' Print hTask.Index; ": "; Data +' +' End +' +' Public Sub FractalTask_Error(Data As String) +' +' Dim hTask As FractalTask = Last +' Print hTask.Index; "= "; Data +' +' End + +Public Sub dwgFractal_Draw() + + Dim hImage As Image + Dim X, Y, I, J As Float + Dim YT As Integer + Dim HT As Integer + Dim H As Integer + + 'hImage = New Image(Draw.Clip.W, Draw.Clip.H) + For I = 0 To Paint.W Step $hRose.W + For J = 0 To Paint.H Step $hRose.H + 'hImage.DrawImage($hRose, I, J) + Paint.DrawImage($hRose, I, J) + Next + Next + + X = $XC - (dwgFractal.W / 2) * $fScale + Y = $YC - (dwgFractal.H / 2) * $fScale + + 'If $bFast Then + + ' FastDrawFractalRect(hImage, X, Y, $fScale, 0, 0, hImage.W, hImage.H) + ' Draw.Image(hImage, Draw.Clip.X, Draw.Clip.Y) + + 'Else + + 'Draw.Image(hImage, Draw.Clip.X, Draw.Clip.Y) + HT = CInt(Paint.H) \ NTASK + For I = 0 To NTASK - 1 + If $aResult[I] Then + If I < (NTASK - 1) Then + H = HT + Else + H = Paint.H - YT + Endif + Paint.DrawImage($aResult[I], 0, YT, Paint.W, H) + Endif + 'RunTask(0, X, Y, 0, YT, hImage.W, HT) + 'Y += HT * $fScale + YT += HT + Next + 'RunTask(I, X, Y, 0, YT, hImage.W, hImage.H - HT) + 'DrawFractalRect(hImage, X, Y, $fScale, 0, 0, hImage.W, hImage.H) + 'Endif + + + Paint.Background = Color.SetAlpha(Color.White, 128) + Paint.Rectangle(4, 4, Draw.Font.Height * 26, Draw.Font.Height * 3 + 32) + Paint.Fill + + YT = 12 + + If $bFast Then + Draw.Text(("Press F to deactivate Just-In-Time compilation"), 12, YT) + Else + Draw.Text(("Press F to activate Just-In-Time compilation"), 12, YT) + Endif + + YT += Draw.Font.Height + 8 + If $bRect Then + Draw.Text(("Press R to hide rectangle optimization"), 12, YT) + Else + Draw.Text(("Press R to show rectangle optimization"), 12, YT) + Endif + + YT += Draw.Font.Height + 8 + Draw.Text(("Zoom") & ": " & CStr((Log2($fScale) + 6) * 8) & " " & ("Speed") & ": " & If($bFast, ("Fast"), ("Slow")) & " " & ("Max") & ": " & ITER_MAX & " " & ("Tasks") & ": " & NTASK, 12, YT) + +End + +Public Sub dwgFractal_MouseWheel() + + Dim fNewScale As Float + + If Mouse.Delta < 0 Then + If Log2($fScale) >= -6 Then Return + fNewScale = $fScale * Sqr(Sqr(Sqr(2))) + ITER_MAX -= 4 + Else + If Log2($fScale) < -50 Then Return + fNewScale = $fScale / Sqr(Sqr(Sqr(2))) + ITER_MAX += 4 + Endif + + $XC += $fScale * (Mouse.X - dwgFractal.W / 2) + $YC += $fScale * (Mouse.Y - dwgFractal.H / 2) + + $fScale = fNewScale + + $XC -= $fScale * (Mouse.X - dwgFractal.W / 2) + $YC -= $fScale * (Mouse.Y - dwgFractal.H / 2) + + If timRedraw.Enabled Then Return + timRedraw.Start + +End + +Public Sub Form_Open() + + Dim I As Integer + + $hRose = Image.Load("rose.jpg") + For I = 0 To $aColor.Max + $aColor[I] = Color.HSV(360 * I / $aColor.Max, 255, 255) + Next + + Me.Center + +End + +Public Sub dwgFractal_MouseDown() + + $MX = Mouse.X + $MY = Mouse.Y + $XX = $XC + $YY = $YC + +End + +Public Sub dwgFractal_MouseMove() + + $XC = $XX + ($MX - Mouse.X) * $fScale + $YC = $YY + ($MY - Mouse.Y) * $fScale + + If timRedraw.Enabled Then Return + timRedraw.Start + +End + + +Public Sub Form_KeyPress() + + If UCase(Key.Text) = "F" Then + $bFast = Not $bFast + If $bFast Then + FractalTask.FastDrawFractalRect(Null, 0, 0, 0, 0, 0, 0, 0) + Endif + Redraw(False) + Else If UCase(Key.Text) = "R" Then + $bRect = Not $bRect + Redraw(False) + Else If Key.Code = Key.Esc Then + Me.Close + Endif + +End + +Private Sub Redraw(bClear As Boolean) + + Dim I As Integer + Dim XO As Float + Dim YO As Float + Dim HT As Integer + + XO = $XC - (Me.ClientW / 2) * $fScale + YO = $YC - (Me.ClientH / 2) * $fScale + + HT = Me.ClientH \ NTASK + + For I = 0 To $aTask.Max + + If $aTask[I] Then Try $aTask[I].Stop + If bClear Then $aResult[I] = Null + + If I = $aTask.Max Then HT = Me.ClientH - HT * $aTask.Max + + $aTask[I] = New FractalTask(XO, YO, $fScale, Me.ClientW, HT, ITER_MAX, $aColor, $bFast, $bRect) As "FractalTask" + $aTask[I].Index = I + + YO += HT * $fScale + + Next + + dwgFractal.Refresh + +End + +Public Sub Form_Resize() + + Redraw(False) '(True) + +End + +Public Sub timRedraw_Timer() + + Dim I As Integer + + For I = 0 To $aTask.Max + If $aTask[I].Running Then Return + Next + + Redraw(False) + timRedraw.Stop + +End diff --git a/app/examples/Drawing/Fractal/.src/FFractal.form b/app/examples/Drawing/Fractal/.src/FFractal.form new file mode 100644 index 00000000..9c92b104 --- /dev/null +++ b/app/examples/Drawing/Fractal/.src/FFractal.form @@ -0,0 +1,18 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,83,64) + Arrangement = Arrange.Fill + { dwgFractal DrawingArea + MoveScaled(6,6,24,24) + Font = Font["+2"] + Background = &HFFFFFF& + Foreground = &H000000& + Focus = True + NoBackground = True + } + { timRedraw #Timer + #MoveScaled(58,26) + Delay = 100 + } +} diff --git a/app/examples/Drawing/Fractal/.src/FractalTask.class b/app/examples/Drawing/Fractal/.src/FractalTask.class new file mode 100644 index 00000000..debfe3a3 --- /dev/null +++ b/app/examples/Drawing/Fractal/.src/FractalTask.class @@ -0,0 +1,324 @@ +' Gambas class file + +Inherits Task + +Public Width As Integer +Public Height As Integer +Public Index As Integer + +Private $XO As Float +Private $YO As Float +Private $SF As Float +Private $bFast As Boolean +Private $iIterMax As Integer +Private $bRect As Boolean +Private $aColor As Integer[] + +Static Private ITER_MAX As Integer +Static Private DRAW_RECT As Boolean +Static Private COLORS As Integer[] + +Public Sub _new(XO As Float, YO As Float, SF As Float, W As Integer, H As Integer, iIterMax As Integer, aColor As Integer[], bFast As Boolean, bRect As Boolean) + + $XO = XO + $YO = YO + $SF = SF + Width = W + Height = H + $aColor = aColor + $bFast = bFast + $bRect = bRect + $iIterMax = iIterMax + +End + +Public Sub Main() As Variant + + Dim hImage As New Image(Width, Height, Color.Transparent) + + ITER_MAX = $iIterMax + DRAW_RECT = $bRect + COLORS = $aColor + + If $bFast Then + FastDrawFractalRect(hImage, $XO, $YO, $SF, 0, 0, Width, Height) + Else + DrawFractalRect(hImage, $XO, $YO, $SF, 0, 0, Width, Height) + Endif + Return hImage.Pixels + +End + +Static Private Sub DrawFractalRect(hImage As Image, XO As Float, YO As Float, SF As Float, X As Integer, Y As Integer, W As Integer, H As Integer) + + Dim I, J, K, C, CC As Integer + Dim XF, YF, XF0, YF0, XF1, YF1 As Float + Dim ZX, ZY, T As Float + Dim bSame As Boolean + Dim bRect As Boolean = DRAW_RECT + + XF0 = XO + X * SF + YF0 = YO + Y * SF + + If W <= 4 And If H <= 4 Then Goto CALC_ALL + + XF1 = XF0 + (W - 1) * SF + YF1 = YF0 + (H - 1) * SF + + If Sgn(XF0) + Sgn(XF1) Or If Sgn(YF0) + Sgn(YF1) Then + + C = 0 + + XF = XF0 + YF = YF0 + I = X + J = Y + GoSub CALC_POINT + CC = C + bSame = True + + XF += SF + For I = X To X + W - 1 + YF = YF0 + J = Y + GoSub CALC_POINT + YF = YF1 + J = Y + H - 1 + GoSub CALC_POINT + XF += SF + Next + + YF = YF0 + SF + For J = Y + 1 To Y + H - 2 + XF = XF0 + I = X + GoSub CALC_POINT + XF = XF1 + I = X + W - 1 + GoSub CALC_POINT + YF += SF + Next + + If bSame Then + If CC Then hImage.FillRect(X + 1, Y + 1, W - 2, H - 2, CC) + If bRect Then + hImage.PaintRect(X + 1, Y + 1, W - 2, H - 2, &HC0FFFFFF&) + Endif + Return + Endif + + Inc X + Inc Y + W -= 2 + H -= 2 + + Endif + + If W >= H Then + DrawFractalRect(hImage, XO, YO, SF, X, Y, W \ 2, H) + DrawFractalRect(hImage, XO, YO, SF, X + (W \ 2), Y, W - (W \ 2), H) + Else + DrawFractalRect(hImage, XO, YO, SF, X, Y, W, H \ 2) + DrawFractalRect(hImage, XO, YO, SF, X, Y + (H \ 2), W, H - (H \ 2)) + Endif + + Return + +CALC_ALL: + + XF = XF0 + For I = X To X + W - 1 + YF = YF0 + For J = Y To Y + H - 1 + + ZX = 0 + ZY = 0 + + For K = 0 To ITER_MAX - 1 + + T = ZX * ZX - ZY * ZY + XF + ZY = 2 * ZX * ZY + YF + + If ((T * T) + (ZY * ZY)) > 4 Then Break + + ZX = T + + Next + + If K < ITER_MAX Then hImage[I, J] = COLORS[K And 63] + + YF += SF + Next + XF += SF + Next + Return + +CALC_POINT: + + ZX = 0 + ZY = 0 + + For K = 0 To ITER_MAX - 1 + + T = ZX * ZX - ZY * ZY + XF + ZY = 2 * ZX * ZY + YF + + If ((T * T) + (ZY * ZY)) > 4 Then Break + + ZX = T + + Next + + If K < ITER_MAX Then + K = K And 63 + C = COLORS[K] + If C <> CC Then bSame = False + hImage[I, J] = C + Else + C = 0 + If C <> CC Then bSame = False + Endif + + Return + +End + +Fast Static Public Sub FastDrawFractalRect(hImage As Image, XO As Float, YO As Float, SF As Float, X As Integer, Y As Integer, W As Integer, H As Integer) + + Dim I, J, K, C, CC As Integer + Dim XF, YF, XF0, YF0, XF1, YF1 As Float + Dim ZX, ZY, T As Float + Dim bSame As Boolean + Dim bRect As Boolean = DRAW_RECT + + If Not hImage Then Return + + XF0 = XO + X * SF + YF0 = YO + Y * SF + + If W <= 4 And If H <= 4 Then Goto CALC_ALL + + XF1 = XF0 + (W - 1) * SF + YF1 = YF0 + (H - 1) * SF + + If Sgn(XF0) + Sgn(XF1) Or If Sgn(YF0) + Sgn(YF1) Then + + C = 0 + + XF = XF0 + YF = YF0 + I = X + J = Y + GoSub CALC_POINT + CC = C + bSame = True + + 'XF += SF + For I = X To X + W - 1 + YF = YF0 + J = Y + GoSub CALC_POINT + YF = YF1 + J = Y + H - 1 + GoSub CALC_POINT + XF += SF + Next + + YF = YF0 + SF + For J = Y + 1 To Y + H - 2 + XF = XF0 + I = X + GoSub CALC_POINT + XF = XF1 + I = X + W - 1 + GoSub CALC_POINT + YF += SF + Next + + If bSame Then + If CC Then hImage.FillRect(X + 1, Y + 1, W - 2, H - 2, CC) + If bRect Then + hImage.PaintRect(X + 1, Y + 1, W - 2, H - 2, &HC0FFFFFF&) + Endif + Return + Endif + + Inc X + Inc Y + W -= 2 + H -= 2 + + Endif + + If W >= H Then + FastDrawFractalRect(hImage, XO, YO, SF, X, Y, W \ 2, H) + FastDrawFractalRect(hImage, XO, YO, SF, X + (W \ 2), Y, W - (W \ 2), H) + Else + FastDrawFractalRect(hImage, XO, YO, SF, X, Y, W, H \ 2) + FastDrawFractalRect(hImage, XO, YO, SF, X, Y + (H \ 2), W, H - (H \ 2)) + Endif + + ' FastDrawFractalRect(hImage, XO, YO, SF, X, Y, W \ 2, H \ 2) + ' FastDrawFractalRect(hImage, XO, YO, SF, X + (W \ 2), Y, W - (W \ 2), H \ 2) + ' FastDrawFractalRect(hImage, XO, YO, SF, X, Y + (H \ 2), W \ 2, H - (H \ 2)) + ' FastDrawFractalRect(hImage, XO, YO, SF, X + (W \ 2), Y + (H \ 2), W - (W \ 2), H - (H \ 2)) + Return + +CALC_ALL: + + XF = XF0 + For I = X To X + W - 1 + YF = YF0 + For J = Y To Y + H - 1 + + ZX = 0 + ZY = 0 + + For K = 0 To ITER_MAX - 1 + + T = ZX * ZX - ZY * ZY + XF + ZY = 2 * ZX * ZY + YF + + If ((T * T) + (ZY * ZY)) > 4 Then Break + + ZX = T + + Next + + If K < ITER_MAX Then hImage[I, J] = COLORS[K And 63] + + YF += SF + Next + XF += SF + Next + Return + +CALC_POINT: + + ZX = 0 + ZY = 0 + + For K = 0 To ITER_MAX - 1 + + T = ZX * ZX - ZY * ZY + XF + ZY = 2 * ZX * ZY + YF + + If ((T * T) + (ZY * ZY)) > 4 Then Break + + ZX = T + + Next + + If K < ITER_MAX Then + K = K And 63 + C = COLORS[K] + If C <> CC Then bSame = False + hImage[I, J] = C + Else + C = 0 + If C <> CC Then bSame = False + Endif + + Return + +End diff --git a/app/examples/Drawing/Fractal/icon.png b/app/examples/Drawing/Fractal/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..03e7cbbfd0279c192012d0b74085e4db69e21eea GIT binary patch literal 4737 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 P00000NkvXXu0mjfyoc68 literal 0 HcmV?d00001 diff --git a/app/examples/Drawing/Fractal/rose.jpg b/app/examples/Drawing/Fractal/rose.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8913cdf64fa15bc387b556aeedc69d3de576eec8 GIT binary patch literal 26938 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 VW=mx72`jhVa^=bx)Kl9(|JejX?3(}p literal 0 HcmV?d00001 diff --git a/app/examples/Drawing/GSLSpline/.directory b/app/examples/Drawing/GSLSpline/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/app/examples/Drawing/GSLSpline/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/app/examples/Drawing/GSLSpline/.icon.png b/app/examples/Drawing/GSLSpline/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..884121225d557ea52e34561a8e0f9ef4a73db60d GIT binary patch literal 4045 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 literal 0 HcmV?d00001 diff --git a/app/examples/Drawing/GSLSpline/.lang/ru.po b/app/examples/Drawing/GSLSpline/.lang/ru.po new file mode 100644 index 00000000..bc8666a9 --- /dev/null +++ b/app/examples/Drawing/GSLSpline/.lang/ru.po @@ -0,0 +1,54 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Drawing/GSLSpline/.project:16 +msgid "Gnu Scientific Library demo" +msgstr "Демонстрация научной библиотеки Gnu" + +#: app/examples/Drawing/GSLSpline/.src/FMain.class:122 +msgid "

Gnu Scientific Library example

Made by Juergen Zdero (juergen@zdero.eu) and Benoît Minisini (gambas@users.sourceforge.net)" +msgstr "

Пример научной библиотеки Gnu

Сделан Юрген Здеро (juergen@zdero.eu) и Бенуа Минисини (gambas@users.sourceforge.net)" + +#: app/examples/Drawing/GSLSpline/.src/FMain.form:5 +msgid "Gnu Scientific Library Example" +msgstr "Пример научной библиотеки Gnu" + +#: app/examples/Drawing/GSLSpline/.src/FMain.form:21 +msgid "Cubic &spline" +msgstr "Куб. сплайн" + +#: app/examples/Drawing/GSLSpline/.src/FMain.form:26 +msgid "&Clear" +msgstr "Очистить" + +#: app/examples/Drawing/GSLSpline/.src/FMain.form:35 +msgid "About..." +msgstr "О программе..." + +#: app/examples/Drawing/GSLSpline/.src/FMain.form:40 +msgid "Close" +msgstr "Закрыть" + diff --git a/app/examples/Drawing/GSLSpline/.project b/app/examples/Drawing/GSLSpline/.project new file mode 100644 index 00000000..53d83a13 --- /dev/null +++ b/app/examples/Drawing/GSLSpline/.project @@ -0,0 +1,15 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.4.90 +Title=Gnu Scientific Library demo +Startup=FMain +Icon=spline.png +Version=3.6.2 +VersionFile=1 +Component=gb.image +Component=gb.gui +Component=gb.form +Authors="Juergen Zdero\nBenoît Minisini" +TabSize=3 +SourcePath=/home/op/SDB/Programming/gambas/gambas3_projects/GSL/demo +Packager=1 +Translate=1 diff --git a/app/examples/Drawing/GSLSpline/.src/FMain.class b/app/examples/Drawing/GSLSpline/.src/FMain.class new file mode 100644 index 00000000..c81e131c --- /dev/null +++ b/app/examples/Drawing/GSLSpline/.src/FMain.class @@ -0,0 +1,130 @@ +' Gambas class file + +Library "libgsl:0" + +Private Extern gsl_spline_alloc(pInterpType As Pointer, iSize As Integer) As Pointer +Private Extern gsl_spline_init(pSpline As Pointer, ax As Pointer, ay As Pointer, iSize As Integer) As Integer +Private Extern gsl_spline_eval(pSpline As Pointer, x As Float, pAcc As Pointer) As Float +Private Extern gsl_interp_accel_alloc() As Pointer +Private Extern gsl_spline_free(pSpline As Pointer) +Private Extern gsl_interp_accel_free(pAcc As Pointer) + +Public pointsArr_x As New Float[] +Public pointsArr_y As New Float[] +Public splineArr_x As New Integer[] +Public splineArr_y As New Integer[] + +Public Sub btnCubicSpline_Click() + + Dim xi As Integer + Dim acc As Pointer + Dim spline As Pointer + Dim gsl_interp_cspline As Pointer + + If pointsArr_x.Length < 3 Then Return + + gsl_interp_cspline = Pointer@(System.GetExternSymbol("libgsl:0", "gsl_interp_cspline")) + acc = gsl_interp_accel_alloc() + spline = gsl_spline_alloc(gsl_interp_cspline, pointsArr_x.Count) + gsl_spline_init(spline, pointsArr_x.Data, pointsArr_y.Data, pointsArr_x.Count) + + xi = pointsArr_x[0] + While xi < pointsArr_x[pointsArr_x.Max] + splineArr_x.Add(xi) + splineArr_y.Add(gsl_spline_eval(spline, xi, acc)) + xi += 1 + Wend + dwgGraph.Refresh + + gsl_spline_free(spline) + gsl_interp_accel_free(acc) + +End + +Public Sub dwgGraph_MouseDown() + + splineArr_x.Clear + splineArr_y.Clear + If (pointsArr_x.Length = 0) Or If (Mouse.X > pointsArr_x[pointsArr_x.Max]) Then + pointsArr_x.Add(Mouse.X) + pointsArr_y.Add(Mouse.Y) + Else + dwgGraph.Background = &HFF8080 + Endif + dwgGraph.Refresh + +End + +Public Sub dwgGraph_MouseUp() + + If dwgGraph.Background <> Color.White Then dwgGraph.Background = Color.White + +End + +Public Sub dwgGraph_Draw() + + Dim i As Integer + + 'lines + paint.Brush = paint.Color(Color.DarkGray) + Paint.LineWidth = 0.5 + paint.Font.Size = 10 + For i = 0 To pointsArr_x.Max + If i = 0 Then + Paint.MoveTo(pointsArr_x[i], pointsArr_y[i]) + Else + Paint.LineTo(pointsArr_x[i], pointsArr_y[i]) + Endif + Next + paint.Stroke + + 'numbers + For i = 0 To pointsArr_x.Max + paint.Text(i + 1, pointsArr_x[i], pointsArr_y[i] - 8) + Next + paint.Fill + + 'points + paint.Brush = paint.Color(Color.red) + For i = 0 To pointsArr_x.Max + Paint.Arc(pointsArr_x[i], pointsArr_y[i], 3) + Paint.Fill + Next + + 'spline + If splineArr_x.Count Then + paint.Brush = paint.Color(Color.DarkMagenta) + Paint.LineWidth = 1.0 + For i = 0 To splineArr_x.Max + If i = 0 Then + Paint.MoveTo(splineArr_x[i], splineArr_y[i]) + Else + Paint.LineTo(splineArr_x[i], splineArr_y[i]) + Endif + Next + paint.Stroke + Endif + +End + +Public Sub btnClear_Click() + + pointsArr_x.Clear + pointsArr_y.Clear + splineArr_x.Clear + splineArr_y.Clear + dwgGraph.Refresh + +End + +Public Sub btnAbout_Click() + + Message.Info(("

Gnu Scientific Library example

Made by Juergen Zdero (juergen@zdero.eu) and Benoît Minisini (gambas@users.sourceforge.net)")) + +End + +Public Sub btnClose_Click() + + Me.Close + +End diff --git a/app/examples/Drawing/GSLSpline/.src/FMain.form b/app/examples/Drawing/GSLSpline/.src/FMain.form new file mode 100644 index 00000000..50296ecb --- /dev/null +++ b/app/examples/Drawing/GSLSpline/.src/FMain.form @@ -0,0 +1,45 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,93,60) + Text = ("Gnu Scientific Library Example") + Icon = Picture["spline.png"] + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + { dwgGraph DrawingArea + MoveScaled(2,2,61,36) + Background = &HFFFFFF& + Expand = True + Border = Border.Sunken + } + { HBox1 HBox + MoveScaled(2,41,87,6) + Spacing = True + { btnCubicSpline Button + MoveScaled(0,0,21,6) + Text = ("Cubic &spline") + Picture = Picture["icon:/medium/pen"] + } + { btnClear Button + MoveScaled(22,0,21,6) + Text = ("&Clear") + Picture = Picture["icon:/medium/erase"] + } + { Panel1 Panel + MoveScaled(44,1,1,5) + Expand = True + } + { btnAbout Button + MoveScaled(44,0,21,6) + Text = ("About...") + Picture = Picture["icon:/medium/info"] + } + { btnClose Button + MoveScaled(66,0,21,6) + Text = ("Close") + Picture = Picture["icon:/medium/close"] + Cancel = True + } + } +} diff --git a/app/examples/Drawing/GSLSpline/spline.png b/app/examples/Drawing/GSLSpline/spline.png new file mode 100644 index 0000000000000000000000000000000000000000..0f2bf708db45123cb5529b36d97bd931528fadd7 GIT binary patch literal 1632 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, 2007-2010. +# +# +msgid "" +msgstr "" +"Project-Id-Version: Gravity\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2010-12-16 23:34+0100\n" +"Last-Translator: Jordi Sayol \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: FMain.class:248 +msgid "0" +msgstr "-" + +#: FAbout.class:24 +msgid "About gbGravity" +msgstr "Quant a gbGravity" + +#: FMain.class:302 +msgid "About gbGravity..." +msgstr "Quant al gbGravity..." + +#: FMain.class:167 +msgid "Add a Ball" +msgstr "Afegeix un bola" + +#: FMain.class:192 +msgid "Add more Balls" +msgstr "Afegeix més boles" + +#: FMain.class:289 +msgid "Ball out of Range" +msgstr "Bola fora de rang" + +#: FAbout.class:51 +msgid "by Iman Karim" +msgstr "per Iman Karim" + +#: FMain.class:216 +msgid "Choose Point:" +msgstr "Punt triat:" + +#: FMain.class:313 +msgid "Clear each Frame" +msgstr "Neteja cada marc" + +#: FMain.class:204 +msgid "Click and hold on Gamefield and move your Mouse!" +msgstr "Fes un clic mantingut dins del camp de joc i mou el teu ratolí!" + +#: FMain.class:221 +msgid "ComboBox1" +msgstr "ComboBox1" + +#: FMain.class:265 +msgid "Current Ball aX:" +msgstr "Bola actual aX:" + +#: FMain.class:276 +msgid "Current Ball aY:" +msgstr "Bola actual aY:" + +#: FMain.class:243 +msgid "Current Ball X:" +msgstr "Bola actual X:" + +#: FMain.class:254 +msgid "Current Ball Y:" +msgstr "Bola actual Y:" + +#: FMain.class:179 +msgid "Floor Slide 0.9" +msgstr "Terra relliscós 0.9" + +#: FMain.class:228 +msgid "Focus Point" +msgstr "Punt amb el focus" + +#: FAbout.class:36 +msgid "gbGravity" +msgstr "gbGravity" + +#: FMain.class:155 +msgid "gbGravity - Iman Karim" +msgstr "gbGravity - Iman Karim" + +#: FMain.class:307 +msgid "Gravity" +msgstr "Gravetat" + +#: FMain.class:161 +msgid "Gravity 0.9" +msgstr "Gravity 0.9" + +#: FAbout.class:41 +msgid "Gravity like Simulator" +msgstr "Simulador de gravetat" + +#: .project:1 +msgid "Gravity Simulator" +msgstr "Simulador de gravetat" + +#: FAbout.class:56 +msgid "Ok - kool!" +msgstr "D'acord - Guai!" + +#: FMain.class:212 +msgid "Point Setup" +msgstr "Configuració del punt" + +#: FMain.class:234 +msgid "Randomize Kick" +msgstr "Sortida aleatoria" + +#: FMain.class:319 +msgid "Sky" +msgstr "Cel" + +#: FAbout.class:62 +msgid "Thanks to the Gambas team!" +msgstr "Gràcies a l'equip del Gambas!" + +#: FAbout.class:46 +msgid "Written in Gambas 1.9.46" +msgstr "Escrit amb Gambas 1.9.46" + diff --git a/app/examples/Drawing/Gravity/.lang/cs.po b/app/examples/Drawing/Gravity/.lang/cs.po new file mode 100644 index 00000000..a55f0a13 --- /dev/null +++ b/app/examples/Drawing/Gravity/.lang/cs.po @@ -0,0 +1,128 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Gravity Simulator" +msgstr "Gravitace sinulítoru" + +#: FAbout.form:14 +msgid "About gbGravity" +msgstr "O gbGravity" + +#: FAbout.form:26 +msgid "gbGravity" +msgstr "-" + +#: FAbout.form:31 +msgid "Gravity like Simulator" +msgstr "Gravitace jako simulátor" + +#: FAbout.form:36 +msgid "Written in Gambas 1.9.46" +msgstr "Napsáno v Gambasu 1.9.46" + +#: FAbout.form:41 +msgid "by Iman Karim" +msgstr "od Iman Karim" + +#: FAbout.form:46 +msgid "Ok - kool!" +msgstr "Ok - skvělé!" + +#: FAbout.form:52 +msgid "Thanks to the Gambas team!" +msgstr "Díky týmu Gambas!" + +#: FMain.form:35 +msgid "gbGravity - Iman Karim" +msgstr "-" + +#: FMain.form:41 +msgid "Gravity 0.9" +msgstr "Gravitace 0.9" + +#: FMain.form:47 +msgid "Add a Ball" +msgstr "Přidej míč" + +#: FMain.form:59 +msgid "Floor Slide 0.9" +msgstr "Zaokrouhlený snímek 0.9" + +#: FMain.form:72 +msgid "Add more Balls" +msgstr "Přidej více míčů" + +#: FMain.form:84 +msgid "Click and hold on Gamefield and move your Mouse!" +msgstr "Klikněte a podržte na hracím poli a přesuňte myš!" + +#: FMain.form:92 +msgid "Point Setup" +msgstr "Nastavení bodu" + +#: FMain.form:96 +msgid "Choose Point:" +msgstr "Vyber bod:" + +#: FMain.form:103 +msgid "ComboBox1" +msgstr "-" + +#: FMain.form:108 +msgid "Focus Point" +msgstr "Zaměřený bod" + +#: FMain.form:114 +msgid "Randomize Kick" +msgstr "Náhodný kop" + +#: FMain.form:123 +msgid "Current Ball X:" +msgstr "Aktuální míč X:" + +#: FMain.form:128 +msgid "0" +msgstr "-" + +#: FMain.form:134 +msgid "Current Ball Y:" +msgstr "Aktuální míč Y:" + +#: FMain.form:145 +msgid "Current Ball aX:" +msgstr "Aktuální míč aX:" + +#: FMain.form:156 +msgid "Current Ball aY:" +msgstr "Aktuální míč aY:" + +#: FMain.form:169 +msgid "Ball out of Range" +msgstr "Míč mimo rozsah" + +#: FMain.form:182 +msgid "About gbGravity..." +msgstr "O gbGravity..." + +#: FMain.form:187 +msgid "Gravity" +msgstr "Gravitace" + +#: FMain.form:193 +msgid "Clear each Frame" +msgstr "Čistý každý snímek" + +#: FMain.form:199 +msgid "Sky" +msgstr "Obloha" diff --git a/app/examples/Drawing/Gravity/.lang/de.po b/app/examples/Drawing/Gravity/.lang/de.po new file mode 100644 index 00000000..39c38c14 --- /dev/null +++ b/app/examples/Drawing/Gravity/.lang/de.po @@ -0,0 +1,129 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Gravity Simulator" +msgstr "Schwerkraftsimulator" + +#: FAbout.form:14 +msgid "About gbGravity" +msgstr "Über gbGravity" + +#: FAbout.form:26 +msgid "gbGravity" +msgstr "gbSchwerkraft" + +#: FAbout.form:31 +msgid "Gravity like Simulator" +msgstr "Schwerkraftsimulator" + +#: FAbout.form:36 +msgid "Written in Gambas 1.9.46" +msgstr "Geschrieben in Gambas 1.9.46" + +#: FAbout.form:41 +msgid "by Iman Karim" +msgstr "von Iman Karim" + +#: FAbout.form:46 +msgid "Ok - kool!" +msgstr "-" + +#: FAbout.form:52 +msgid "Thanks to the Gambas team!" +msgstr "Danke an das Gambas Team!" + +#: FMain.form:35 +msgid "gbGravity - Iman Karim" +msgstr "gbSchwerkraft - Iman Karim" + +#: FMain.form:41 +msgid "Gravity 0.9" +msgstr "Schwerkraft 0.9" + +#: FMain.form:47 +msgid "Add a Ball" +msgstr "Ball hinzufügen" + +#: FMain.form:59 +msgid "Floor Slide 0.9" +msgstr "Bodenreibung 0.9" + +#: FMain.form:72 +msgid "Add more Balls" +msgstr "Mehrere hinzufügen" + +#: FMain.form:84 +msgid "Click and hold on Gamefield and move your Mouse!" +msgstr "Aufs Spielfeld klicken und die Maus bewegen!" + +#: FMain.form:92 +msgid "Point Setup" +msgstr "Punkt Auswahl" + +#: FMain.form:96 +msgid "Choose Point:" +msgstr "Punkt wählen:" + +#: FMain.form:103 +msgid "ComboBox1" +msgstr "-" + +#: FMain.form:108 +msgid "Focus Point" +msgstr "Brennpunkt" + +#: FMain.form:114 +msgid "Randomize Kick" +msgstr "Zufälliger Abstoß" + +#: FMain.form:123 +msgid "Current Ball X:" +msgstr "Dieser Ball X:" + +#: FMain.form:128 +msgid "0" +msgstr "-" + +#: FMain.form:134 +msgid "Current Ball Y:" +msgstr "Dieser Ball Y:" + +#: FMain.form:145 +msgid "Current Ball aX:" +msgstr "Dieser Ball aX:" + +#: FMain.form:156 +msgid "Current Ball aY:" +msgstr "Dieser Ball aY:" + +#: FMain.form:169 +msgid "Ball out of Range" +msgstr "Ball außerhalb des Feldes" + +#: FMain.form:182 +msgid "About gbGravity..." +msgstr "Über gbGravity..." + +#: FMain.form:187 +msgid "Gravity" +msgstr "Schwerkraft" + +#: FMain.form:193 +msgid "Clear each Frame" +msgstr "Alle Frames löschen" + +#: FMain.form:199 +msgid "Sky" +msgstr "Himmel" + diff --git a/app/examples/Drawing/Gravity/.lang/es.po b/app/examples/Drawing/Gravity/.lang/es.po new file mode 100644 index 00000000..eb75a96f --- /dev/null +++ b/app/examples/Drawing/Gravity/.lang/es.po @@ -0,0 +1,126 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: FAbout.class:26 +msgid "About gbGravity" +msgstr "Acerca de gbGravity" + +#: FAbout.class:38 +msgid "gbGravity" +msgstr "gbGravity" + +#: FAbout.class:43 +msgid "Gravity like Simulator" +msgstr "Gravity como simulador" + +#: FAbout.class:48 +msgid "Written in Gambas 1.9.46" +msgstr "Escrito en Gambas 1.9.46" + +#: FAbout.class:53 +msgid "by Iman Karim" +msgstr "por Iman Karim" + +#: FAbout.class:58 +msgid "Ok - kool!" +msgstr "Ok - ¡Genial!" + +#: FAbout.class:64 +msgid "Thanks to the Gambas team!" +msgstr "¡Gracias al grupo de Gambas!" + +#: FMain.class:270 +msgid "gbGravity - Iman Karim" +msgstr "gbGravity - Iman Karim" + +#: FMain.class:276 +msgid "Gravity 0.9" +msgstr "Gravedad 0.9" + +#: FMain.class:282 +msgid "Add a Ball" +msgstr "Agregar una bola" + +#: FMain.class:294 +msgid "Floor Slide 0.9" +msgstr "Porción del piso 0.9" + +#: FMain.class:307 +msgid "Add more Balls" +msgstr "Agregar más bolas" + +#: FMain.class:319 +msgid "Click and hold on Gamefield and move your Mouse!" +msgstr "¡Click y sostenga sobre el campo de juego y mueva su ratón!" + +#: FMain.class:327 +msgid "Point Setup" +msgstr "Punto de configuración" + +#: FMain.class:331 +msgid "Choose Point:" +msgstr "Seleccionar punto:" + +#: FMain.class:336 +msgid "ComboBox1" +msgstr "ComboBox1" + +#: FMain.class:343 +msgid "Focus Point" +msgstr "Punto de enfoque" + +#: FMain.class:349 +msgid "Randomize Kick" +msgstr "Golpe aleatorio" + +#: FMain.class:358 +msgid "Current Ball X:" +msgstr "Bola activa X:" + +#: FMain.class:363 +msgid "0" +msgstr "0" + +#: FMain.class:369 +msgid "Current Ball Y:" +msgstr "Bola activa Y:" + +#: FMain.class:380 +msgid "Current Ball aX:" +msgstr "Bola activa aX" + +#: FMain.class:391 +msgid "Current Ball aY:" +msgstr "Bola activa aY" + +#: FMain.class:404 +msgid "Ball out of Range" +msgstr "Bola fuera de rango" + +#: FMain.class:417 +msgid "About gbGravity..." +msgstr "Acerca de gbGravity..." + +#: FMain.class:422 +msgid "Gravity" +msgstr "Gravedad" + +#: FMain.class:428 +msgid "Clear each Frame" +msgstr "Limpiar cada cuadro" + +#: FMain.class:434 +msgid "Sky" +msgstr "Cielo" + +#~ msgid "Gravity Simulator" +#~ msgstr "Simulador de gravedad" diff --git a/app/examples/Drawing/Gravity/.lang/ru.po b/app/examples/Drawing/Gravity/.lang/ru.po new file mode 100644 index 00000000..7ba57083 --- /dev/null +++ b/app/examples/Drawing/Gravity/.lang/ru.po @@ -0,0 +1,162 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-28 09:00+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Drawing/Gravity/.project:20 +msgid "Gravity Simulator" +msgstr "Симулятор гравитации" + +#: app/examples/Drawing/Gravity/.project:21 app/examples/Drawing/Gravity/.src/FAbout.form:19 +msgid "Gravity like Simulator" +msgstr "Симулятор гравитации" + +#: app/examples/Drawing/Gravity/.src/FAbout.form:5 +msgid "About gbGravity" +msgstr "О гравитоне" + +#: app/examples/Drawing/Gravity/.src/FAbout.form:15 +msgid "gbGravity" +msgstr "Гравитон" + +#: app/examples/Drawing/Gravity/.src/FAbout.form:23 +msgid "Written in Gambas 1.9.46" +msgstr "Написано в Gambas 1.9.46" + +#: app/examples/Drawing/Gravity/.src/FAbout.form:27 +msgid "by Iman Karim" +msgstr "от Иман Карим" + +#: app/examples/Drawing/Gravity/.src/FAbout.form:31 +msgid "Ok - kool!" +msgstr "ОК!" + +#: app/examples/Drawing/Gravity/.src/FAbout.form:36 +msgid "Thanks to the Gambas team!" +msgstr "Спасибо команде Gambas!" + +#: app/examples/Drawing/Gravity/.src/FMain.class:100 app/examples/Drawing/Gravity/.src/FMain.class:122 app/examples/Drawing/Gravity/.src/FMain.class:186 +msgid "ALL" +msgstr "ВСЕ" + +#: app/examples/Drawing/Gravity/.src/FMain.class:152 app/examples/Drawing/Gravity/.src/FMain.class:169 +msgid "Gravity:" +msgstr "Гравитация:" + +#: app/examples/Drawing/Gravity/.src/FMain.class:161 +msgid "Gravity: off" +msgstr "Гравитация: выкл" + +#: app/examples/Drawing/Gravity/.src/FMain.class:162 +msgid "Floor Slide: off" +msgstr "Слайд: выкл" + +#: app/examples/Drawing/Gravity/.src/FMain.class:170 app/examples/Drawing/Gravity/.src/FMain.class:205 +msgid "Floor Slide:" +msgstr "Слайд:" + +#: app/examples/Drawing/Gravity/.src/FMain.form:5 +msgid "gbGravity - Iman Karim" +msgstr "Гравитон - Иман Карим" + +#: app/examples/Drawing/Gravity/.src/FMain.form:10 +msgid "Gravity 0.9" +msgstr "Гравитация 0.9" + +#: app/examples/Drawing/Gravity/.src/FMain.form:15 +msgid "Add a Ball" +msgstr "Добавить мяч" + +#: app/examples/Drawing/Gravity/.src/FMain.form:25 +msgid "Floor Slide 0.9" +msgstr "Слайд 0.9" + +#: app/examples/Drawing/Gravity/.src/FMain.form:36 +msgid "Add more Balls" +msgstr "Добавить ещё мячей" + +#: app/examples/Drawing/Gravity/.src/FMain.form:46 +msgid "Click and hold on Gamefield and move your Mouse!" +msgstr "Нажать и удерживать игровое поле и двигать мышью!" + +#: app/examples/Drawing/Gravity/.src/FMain.form:53 +msgid "Point Setup" +msgstr "Настройка точки" + +#: app/examples/Drawing/Gravity/.src/FMain.form:56 +msgid "Choose Point:" +msgstr "Выбрать точку:" + +#: app/examples/Drawing/Gravity/.src/FMain.form:61 +msgid "ComboBox1" +msgstr "Комбинированный_список_1" + +#: app/examples/Drawing/Gravity/.src/FMain.form:65 +msgid "Focus Point" +msgstr "Точка фокусировки" + +#: app/examples/Drawing/Gravity/.src/FMain.form:70 +msgid "Randomize Kick" +msgstr "Случайный удар" + +#: app/examples/Drawing/Gravity/.src/FMain.form:77 +msgid "Current Ball X:" +msgstr "Текущий мяч X:" + +#: app/examples/Drawing/Gravity/.src/FMain.form:81 app/examples/Drawing/Gravity/.src/FMain.form:90 app/examples/Drawing/Gravity/.src/FMain.form:99 app/examples/Drawing/Gravity/.src/FMain.form:108 +msgid "0" +msgstr "0" + +#: app/examples/Drawing/Gravity/.src/FMain.form:86 +msgid "Current Ball Y:" +msgstr "Текущий мяч Y:" + +#: app/examples/Drawing/Gravity/.src/FMain.form:95 +msgid "Current Ball aX:" +msgstr "Текущий мяч aX:" + +#: app/examples/Drawing/Gravity/.src/FMain.form:104 +msgid "Current Ball aY:" +msgstr "Текущий мяч aY:" + +#: app/examples/Drawing/Gravity/.src/FMain.form:115 +msgid "Ball out of Range" +msgstr "Мяч вне диапазона" + +#: app/examples/Drawing/Gravity/.src/FMain.form:127 +msgid "About gbGravity..." +msgstr "О гравитоне..." + +#: app/examples/Drawing/Gravity/.src/FMain.form:131 +msgid "Gravity" +msgstr "Гравитация" + +#: app/examples/Drawing/Gravity/.src/FMain.form:136 +msgid "Clear each Frame" +msgstr "Очищ. каждый кадр" + +#: app/examples/Drawing/Gravity/.src/FMain.form:141 +msgid "Sky" +msgstr "Небо" + diff --git a/app/examples/Drawing/Gravity/.project b/app/examples/Drawing/Gravity/.project new file mode 100644 index 00000000..3580a1e9 --- /dev/null +++ b/app/examples/Drawing/Gravity/.project @@ -0,0 +1,18 @@ +# Gambas Project File 3.0 +Title=Gravity Simulator +Startup=FMain +Icon=gravity.png +Version=3.13.90 +VersionFile=1 +Component=gb.image +Component=gb.gui +Description="Gravity like Simulator" +Environment="GB_GUI=gb.qt5" +TabSize=2 +Translate=1 +Language=fr +Maintainer=benoit +Vendor=Princeton +Address=benoit@localhost +License=General Public Licence +Packager=1 diff --git a/app/examples/Drawing/Gravity/.src/FAbout.class b/app/examples/Drawing/Gravity/.src/FAbout.class new file mode 100644 index 00000000..1d524d09 --- /dev/null +++ b/app/examples/Drawing/Gravity/.src/FAbout.class @@ -0,0 +1,8 @@ +' Gambas class file + + +Public Sub Button1_Click() + + FAbout.Hide + +End diff --git a/app/examples/Drawing/Gravity/.src/FAbout.form b/app/examples/Drawing/Gravity/.src/FAbout.form new file mode 100644 index 00000000..86cdcc9a --- /dev/null +++ b/app/examples/Drawing/Gravity/.src/FAbout.form @@ -0,0 +1,42 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,54,21) + Text = ("About gbGravity") + Resizable = False + { PictureBox1 PictureBox + MoveScaled(1,1,9,9) + Picture = Picture["gravity.png"] + Stretch = True + } + { Label1 Label + MoveScaled(11,1,17,4) + Font = Font["+2"] + Text = ("gbGravity") + } + { Label2 Label + MoveScaled(25,1,28,4) + Text = ("Gravity like Simulator") + Alignment = Align.Right + } + { Label3 Label + MoveScaled(21,5,32,4) + Text = ("Written in Gambas 1.9.46") + Alignment = Align.Right + } + { Label4 Label + MoveScaled(31,9,22,3) + Text = ("by Iman Karim") + Alignment = Align.Right + } + { Button1 Button + MoveScaled(1,13,52,4) + Text = ("Ok - kool!") + } + { Label5 Label + MoveScaled(1,17,52,3) + Font = Font["-1"] + Text = ("Thanks to the Gambas team!") + Alignment = Align.Center + } +} diff --git a/app/examples/Drawing/Gravity/.src/FMain.class b/app/examples/Drawing/Gravity/.src/FMain.class new file mode 100644 index 00000000..3fd7b8c1 --- /dev/null +++ b/app/examples/Drawing/Gravity/.src/FMain.class @@ -0,0 +1,232 @@ +' Gambas class file + +' Written by Iman Karim +' http://home.inf.fh-rhein-sieg.de/~ikarim2s/ +' 14.11.2006 + +Private Objects As New Collection +Private world_Gravity As Float = 0.9 +Private world_Bounce As Float = 0.7 +Private world_SlideFloor As Float = 0.9 +Private isDrawing As Boolean + +Private Sub AddBall(Optional x As Integer = -1, Optional y As Integer = -1) + Dim cBall As New CBall + If x = -1 Then + cBall.x = Rnd(1, 100) + cBall.y = Rnd(1, 100) + Else + cBall.x = x + cBall.y = y + End If + cBall.ax = Rnd(-100, 100) + cBall.col = Rnd(1, 90000000) + objects.Add(cBall, Str(objects.Count + 1)) + cB.Add(Str(objects.Count)) +End + + +Private Sub DoGravity() + Dim myBall As CBall + For Each myBall In Objects + If togGrav.value Then myBall.ay = myBall.ay + world_Gravity '// Make Gravity + myBall.x = myBall.x + myBall.ax '// Move Ball + myBall.y = myBall.y + myBall.ay + If myBall.x >= dW.width - 5 Or myBall.x <= 0 Then '// Ball collidated on wall (left/right) + myBall.ax = (myBall.ax * world_Bounce) * -1 '// Reverse Ball direction and include world_Bounce + End If + If myBall.y > dW.Height - 10 Or myBall.y < 10 Then '// Ball collidated on Floor or Sky + If myball.y < 10 And togSky.value = False Then myball.ay = (myball.ay * world_Bounce) * -1 '// If Sky is disabled no not bounce + If myball.y > 10 Then myball.ay = (myball.ay * world_Bounce) * -1 '// On floor make bounce for sure + End If + If (((dW.Height - 10) - myBall.y) <= 1) And (Abs(myBall.ay) <= 2) And togGrav.Value Then '// If ball is n floor and to slow to jump up again stop the ball (y) + myball.y = (dW.Height - 10) + myball.ay = 0 + End If + + If myball.ay = 0 And myball.y = (dW.Height - 10) Then '// If ball is already on floor decrease the roll speed depending on world_SlideFloor factor. + If myball.ax < 0.1 Then + myball.ax = Abs(myball.ax) * world_SlideFloor * -1 + Else If myball.ax > 0.1 Then + myball.ax = Abs(myball.ax) * world_SlideFloor + Else + myball.ax = 0 '// If ball is moving to slow stop it + End If + End If + + If myball.y > dW.Height - 10 Then '// Make sure befor painting that the ball is inside your viewport. (floor) + myball.y = dW.Height - 10 + Else If myball.y <= 10 And togSky.Value = False Then + myball.y = 12 + End If + If myball.x > dW.width - 5 Then '// Make sure befor painting that the ball is inside your viewport. (left\right wall) + myball.x = dW.Width - 5 + Else If myball.x < 0 Then + myball.x = 0 + End If + Next +End + +Private Sub DrawWorld() + Dim myBall As CBall + Dim index As Integer + If isDrawing = False Then + isDrawing = True + Try Draw.begin(dW) + 'Draw.Rect(3, 12, dW.Width - 6, dW.Height - 17) + Draw.FillStyle = 1 + Draw.FillColor = Color.White + For Each myBall In Objects + index = index + 1 + Draw.Foreground = myBall.col + Draw.Ellipse(myBall.x, myBall.y, 5, 5) + If Str(index) = cB.Text Then + Draw.FillStyle = 0 + Draw.Foreground = Color.Red + If togFocus.value Then Draw.Ellipse(myBall.x - 3, myBall.y - 3, 11, 11) + lblX.Caption = Str(Round(myBall.x)) + lblY.Caption = Str(Round(myBall.y)) + If myball.y <= 0 Then + lblOutOfRange.Visible = True + Else + lblOutOfRange.Visible = False + End If + lblaX.Caption = Str(Round(myBall.ax)) + lblaY.Caption = Str(Round(myBall.ay)) + Draw.FillStyle = 1 + End If + Next + Draw.End + If cB.Text = ("ALL") Then + lblX.Caption = "%null%" + lblY.Caption = "%null%" + lblaX.Caption = "%null%" + lblaY.Caption = "%null%" + lblOutOfRange.Visible = False + End If + isDrawing = False + End If +End + +Private Sub Render() + + DoGravity + If togClear.Value Then dW.Clear() + Wait 0.001 + DrawWorld + +End + + +Public Sub Form_Open() + cb.Add(("ALL")) +End + +Public Sub Button1_Click() + AddBall +End + +Public Sub Timer1_Timer() + + Render + +End + +Public Sub Form_Resize() + Timer1.Enabled = False + + 'DO + ' WAIT 1 + 'LOOP WHILE modGravity.isDrawing + + dw.Width = Me.Width - dw.Left - 10 + dw.Height = Me.Height - dw.top - 10 + Timer1.Enabled = True + + +End + + +Public Sub Slider1_Change() + + lblGrav.Caption = ("Gravity:") & " " & Str(Slider1.Value / 100) + world_Gravity = Slider1.Value / 100 + +End + + +Public Sub togGrav_Click() + + If Not togGrav.Value Then + lblGrav.Caption = ("Gravity: off") + lblSlide.Caption = ("Floor Slide: off") + Slider1.Enabled = False + Slider2.Enabled = False + world_SlideFloor = 1 + Else + Slider1.Enabled = True + Slider2.Enabled = True + lblGrav.Caption = ("Gravity:") & " " & Str(Slider1.Value / 100) + lblSlide.Caption = ("Floor Slide:") & " " & Str(Slider2.Value / 100) + world_SlideFloor = Slider2.Value / 100 + End If + +End + +Public Sub cmdRandomize_Click() + Dim myBall As CBall + Dim index As Integer + cmdRandomize.Enabled = False + Draw.begin(dW) + Draw.FillStyle = 1 + For Each myBall In Objects + index = index + 1 + Draw.Foreground = myBall.col + Draw.Ellipse(myBall.x, myBall.y, 5, 5) + If Str(index) = cB.Text Or cB.Text = ("ALL") Then + myBall.ax = Rnd(1, 100) + myBall.ay = Rnd(1, 100) + End If + Next + Draw.End + cmdRandomize.Enabled = True +End + + + +Public Sub dW_MouseMove() + If togAddMore.Value Then + AddBall(Mouse.x, Mouse.Y) + End If +End + +Public Sub Slider2_Change() + + lblSlide.Caption = ("Floor Slide:") & " " & Str(Slider2.Value / 100) + world_SlideFloor = Slider2.Value / 100 + +End + + +Public Sub togAddMore_Click() + + If togAddMore.Value Then + lbladdmore.visible = True + Else + lblAddMore.visible = False + End If + +End + +Public Sub dW_MouseUp() + + togAddMore.Value = False + lblAddMore.visible = False + +End + +Public Sub lblAbout_MouseDown() + + FAbout.ShowModal + +End diff --git a/app/examples/Drawing/Gravity/.src/FMain.form b/app/examples/Drawing/Gravity/.src/FMain.form new file mode 100644 index 00000000..97c2845c --- /dev/null +++ b/app/examples/Drawing/Gravity/.src/FMain.form @@ -0,0 +1,143 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,121,73) + Text = ("gbGravity - Iman Karim") + Icon = Picture["gravity.png"] + Resizable = False + { lblGrav TextLabel + MoveScaled(61,1,21,3) + Text = ("Gravity 0.9") + Alignment = Align.Left + } + { Button1 Button + MoveScaled(1,1,25,6) + Text = ("Add a Ball") + } + { Slider1 Slider + MoveScaled(42,1,18,3) + MinValue = 1 + Step = 10 + Value = 90 + } + { lblSlide TextLabel + MoveScaled(61,4,21,3) + Text = ("Floor Slide 0.9") + Alignment = Align.Left + } + { Slider2 Slider + MoveScaled(42,4,18,3) + MinValue = 50 + Step = 10 + Value = 90 + } + { togAddMore ToggleButton + MoveScaled(1,8,25,6) + Text = ("Add more Balls") + } + { dW DrawingArea + MoveScaled(27,8,93,64) + Border = Border.Plain + Cached = True + { lblAddMore TextLabel + MoveScaled(1,1,24,10) + Visible = False + Background = &HFFFFDF& + Text = ("Click and hold on Gamefield and move your Mouse!") + Alignment = Align.Center + Border = Border.Plain + } + } + { Frame1 Frame + MoveScaled(1,15,25,53) + Text = ("Point Setup") + { TextLabel1 TextLabel + MoveScaled(1,3,23,4) + Text = ("Choose Point:") + } + { cB ComboBox + MoveScaled(1,7,23,4) + ReadOnly = True + Text = ("ComboBox1") + } + { togFocus ToggleButton + MoveScaled(1,12,23,4) + Text = ("Focus Point") + Value = True + } + { cmdRandomize Button + MoveScaled(1,17,23,5) + Text = ("Randomize Kick") + } + { Separator1 Separator + MoveScaled(1,22,23,2) + } + { Label1 Label + MoveScaled(2,24,21,3) + Text = ("Current Ball X:") + } + { lblX Label + MoveScaled(1,27,14,3) + Text = ("0") + Alignment = Align.Center + } + { Label2 Label + MoveScaled(2,30,21,3) + Text = ("Current Ball Y:") + } + { lblY Label + MoveScaled(1,33,14,3) + Text = ("0") + Alignment = Align.Center + } + { Label6 Label + MoveScaled(2,36,21,3) + Text = ("Current Ball aX:") + } + { lblAX Label + MoveScaled(1,39,14,3) + Text = ("0") + Alignment = Align.Center + } + { Label4 Label + MoveScaled(2,42,21,3) + Text = ("Current Ball aY:") + } + { lblAY Label + MoveScaled(1,45,14,3) + Text = ("0") + Alignment = Align.Center + } + { lblOutOfRange Label + MoveScaled(1,48,23,4) + Visible = False + Foreground = &HFF0000& + Text = ("Ball out of Range") + } + } + { Timer1 #Timer + #MoveScaled(54,20) + Enabled = True + Delay = 50 + } + { lblAbout Label + MoveScaled(1,68,25,4) + Font = Font["Underline"] + Mouse = Mouse.Pointing + Text = ("About gbGravity...") + } + { togGrav ToggleButton + MoveScaled(27,1,14,6) + Text = ("Gravity") + Value = True + } + { togClear ToggleButton + MoveScaled(82,1,22,6) + Text = ("Clear each Frame") + Value = True + } + { togSky ToggleButton + MoveScaled(105,1,15,6) + Text = ("Sky") + } +} diff --git a/app/examples/Drawing/Gravity/.src/cBall.class b/app/examples/Drawing/Gravity/.src/cBall.class new file mode 100644 index 00000000..27e0ae75 --- /dev/null +++ b/app/examples/Drawing/Gravity/.src/cBall.class @@ -0,0 +1,9 @@ +' Gambas class file + +' This Class represents a single ball. +Public x As Float +Public y As Float +Public col As Integer +'PUBLIC weight AS Float 'Weight not implemented ;) +Public ax As Float +Public ay As Float diff --git a/app/examples/Drawing/Gravity/gravity.png b/app/examples/Drawing/Gravity/gravity.png new file mode 100644 index 0000000000000000000000000000000000000000..e4e425e74166b10fb70f988c22f6b679a4b3afc1 GIT binary patch literal 7084 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 literal 0 HcmV?d00001 diff --git a/app/examples/Drawing/OnScreenDisplay/.lang/ca.po b/app/examples/Drawing/OnScreenDisplay/.lang/ca.po new file mode 100644 index 00000000..e01b52ce --- /dev/null +++ b/app/examples/Drawing/OnScreenDisplay/.lang/ca.po @@ -0,0 +1,27 @@ +# Catalan translation of OnScreenDisplay +# Copyright (C) 2000-2010 Benoît Minisini. +# This file is distributed under the same license as the OnScreenDisplay package. +# Jordi Sayol , 2007-2010. +# +# +msgid "" +msgstr "" +"Project-Id-Version: OnScreenDisplay\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2010-12-16 23:35+0100\n" +"Last-Translator: Jordi Sayol \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: .project:1 +msgid "Masked window example" +msgstr "Exemple de finestra enmascarada" + +#: FOnScreenDisplay.form:8 +msgid "What time is it ?" +msgstr "Quina hora és?" diff --git a/app/examples/Drawing/OnScreenDisplay/.lang/cs.po b/app/examples/Drawing/OnScreenDisplay/.lang/cs.po new file mode 100644 index 00000000..8112a521 --- /dev/null +++ b/app/examples/Drawing/OnScreenDisplay/.lang/cs.po @@ -0,0 +1,20 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Masked window example" +msgstr "Příklad maskovaného okna" + +#: FOnScreenDisplay.form:8 +msgid "What time is it ?" +msgstr "Kolik je hodin ?" diff --git a/app/examples/Drawing/OnScreenDisplay/.lang/de.po b/app/examples/Drawing/OnScreenDisplay/.lang/de.po new file mode 100644 index 00000000..c5dd7a6b --- /dev/null +++ b/app/examples/Drawing/OnScreenDisplay/.lang/de.po @@ -0,0 +1,21 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Masked window example" +msgstr "Beispiel für ein transparentes Fenster" + +#: FOnScreenDisplay.form:8 +msgid "What time is it ?" +msgstr "Wieviel Uhr ist es?" + diff --git a/app/examples/Drawing/OnScreenDisplay/.lang/es.po b/app/examples/Drawing/OnScreenDisplay/.lang/es.po new file mode 100644 index 00000000..79e8bc33 --- /dev/null +++ b/app/examples/Drawing/OnScreenDisplay/.lang/es.po @@ -0,0 +1,15 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: FOnScreenDisplay.class:79 +msgid "What time is it ?" +msgstr "¿Qué hora es?" diff --git a/app/examples/Drawing/OnScreenDisplay/.lang/ru.po b/app/examples/Drawing/OnScreenDisplay/.lang/ru.po new file mode 100644 index 00000000..eba336a9 --- /dev/null +++ b/app/examples/Drawing/OnScreenDisplay/.lang/ru.po @@ -0,0 +1,34 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Drawing/OnScreenDisplay/.project:19 +msgid "Masked window example" +msgstr "Пример маскированного окна" + +#: app/examples/Drawing/OnScreenDisplay/.src/FOnScreenDisplay.form:5 +msgid "What time is it ?" +msgstr "Сколько времени?" + diff --git a/app/examples/Drawing/OnScreenDisplay/.project b/app/examples/Drawing/OnScreenDisplay/.project new file mode 100644 index 00000000..fb949611 --- /dev/null +++ b/app/examples/Drawing/OnScreenDisplay/.project @@ -0,0 +1,17 @@ +# Gambas Project File 3.0 +Title=Masked window example +Startup=FOnScreenDisplay +Icon=icon.png +Version=3.13.90 +VersionFile=1 +Component=gb.image +Component=gb.gui +Environment="GB_GUI=gb.qt5" +TabSize=2 +Translate=1 +Language=fr +Maintainer=fabien +Vendor=Princeton +Address=fabien@arcalis +License=General Public Licence +Packager=1 diff --git a/app/examples/Drawing/OnScreenDisplay/.src/FOnScreenDisplay.class b/app/examples/Drawing/OnScreenDisplay/.src/FOnScreenDisplay.class new file mode 100644 index 00000000..c42367af --- /dev/null +++ b/app/examples/Drawing/OnScreenDisplay/.src/FOnScreenDisplay.class @@ -0,0 +1,67 @@ +' Gambas class file + +Private $sLast As String +Private $MX As Integer +Private $MY As Integer + +Public Sub Form_Open() + + Me.Font = Font["64"] + Me.Resize(Me.Font.TextWidth("00:00:00") + 64, Me.Font.Height + 16) + Redraw +End + +Public Sub Timer1_Timer() + + Redraw + +End + +Private Sub Redraw() + + Dim hImage As Image + Dim sText As String + Dim iInd As Integer + + sText = Str(Time) + If sText = $sLast Then Return + + hImage = New Image(Me.Width, Me.Height, Color.Transparent) + + Paint.Begin(hImage) + Paint.Font = Font["64"] + Paint.LineWidth = 4 + + For iInd = 8 To 0 Step -1 + Paint.Brush = Paint.Color(Color.RGB(&h43 - iInd * &h43 / 8, &hC7 - iInd * &hC7 / 8, &hFF - iInd * &HFF / 8)) + Paint.DrawText(sText, iInd, iInd - 8, hImage.W, hImage.H, Align.Center) + Paint.Rectangle(iInd + 4, iInd + 4, hImage.Width - 14, hImage.Height - 14) + Paint.Stroke + Next + + Paint.End + + Me.Picture = hImage.Picture +' Me.Mask = True + $sLast = sText + +End + +Public Sub Form_KeyPress() + + If Key.Code = Key["Esc"] Then Me.Close + +End + +Public Sub Form_MouseDown() + + $MX = Mouse.ScreenX - Me.X + $MY = Mouse.ScreenY - Me.Y + +End + +Public Sub Form_MouseMove() + + Me.Move(Mouse.ScreenX - $MX, Mouse.ScreenY - $MY) + +End diff --git a/app/examples/Drawing/OnScreenDisplay/.src/FOnScreenDisplay.form b/app/examples/Drawing/OnScreenDisplay/.src/FOnScreenDisplay.form new file mode 100644 index 00000000..4c71a2e5 --- /dev/null +++ b/app/examples/Drawing/OnScreenDisplay/.src/FOnScreenDisplay.form @@ -0,0 +1,12 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(27,61,49,13) + Text = ("What time is it ?") + Mask = True + Border = False + { Timer1 #Timer + Enabled = True + Delay = 250 + } +} diff --git a/app/examples/Drawing/OnScreenDisplay/icon.png b/app/examples/Drawing/OnScreenDisplay/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..26cc8686565b8f4a62a9948c453962381e83725d GIT binary patch literal 1300 zcmV+v1?&2WP) zO-xi*7>1v7e}+LF6=4J<)P@=)DJeVB6q+=(EE-Kp6Y5S&BxzlMwe7;1F2scfY!fxu zw5E+wNmES<8^S_aAzd{ZQ)$xRPZg`kARsdg^LOt(Ul#*|KWKp#-Sl1EbM8IgdB5-d z&U+91j~5K}b4QoFTvCQImy>cF5P9MwEucLoyvQd3Trwvo|9s9Z0y-# z1YCKjo(q7Nasfyrk|<>$B4qhYjG4?(3d1lK9C)F~UbX^d7$BfMVd-~#3S_#9&z*o$ z3eg(T8pBj`6HrRAd-rbo`ufCTjafdLVb%y{R{ogyOA(9j@& zY~K8Vw6y&qAAS0R)PLM8b5>y6wrv3P_4NU8_3BkdMn>4aeLDcLSPX!!t}be7YS^=9 z&#bnOIcaBS=OZy^^w-*ZdJp91=K~OlL^5;XaF~LE0swaG*g;1}2i4WpoIih_{{DU{ zDk|pGe0+QyfZW_%04&=^3y5e;)0mq;C=>!95C~-E0)YU-!@~gN<>gUVS4VMiF(*%+ zq_nh@wzjr839Mba7J$LQ!Rh{*-O@Ck(uD2p?Eq9&RRK^^QbIvN0jE!&2H@DSV+4ai zhK7b{YH9)?nM}?}ptiOafaAxHKk-gPW}Q$e$@tr;Q>Vzu$zku_y;N3KQdL#Op+kpg zZf*vkyStmSXV22x+e=wl8RyQOqp`7(O`A4l#jYjfh5T zjj0ss#FlaYN@bwYXh&n@gX;^T_M{JzgQBrl6hyO zltL}wc4QeIu_TZhMMSVI1IuwWjw^VcM#LlK%?AH3APAPSFqFyUR1`Jc=%PJP3hUnR zB$3DjQ_%-$olFzIe+B;R0Jbj+!!Q@Ou?Vi4M0=VW53ZA%2=Patf~4}Oj)#avCm^^Q z%ZXj%=JiM2&!6QdxUQ6dnY)<#Cjg#yh)mpP^xhy>e!EC^u8o-o&SZ?+$v8QMtI1jA z$9gFrf~$&fT#cG3y;9s9njkb3#&wbl_Xh=@>o64^XVo%`%JK~q6t5vX79~4Bz+}{B zy{#oPPLbrbXt^7W4pIAJJ@h@7z(@+>(#y3a4d_D%V82k+oBq+c}ribtV0000< KMNUMnLSTaPhgkvu literal 0 HcmV?d00001 diff --git a/app/examples/Drawing/Painting/.directory b/app/examples/Drawing/Painting/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/app/examples/Drawing/Painting/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/app/examples/Drawing/Painting/.hidden/screenshots/2014-12-14.png b/app/examples/Drawing/Painting/.hidden/screenshots/2014-12-14.png new file mode 100644 index 0000000000000000000000000000000000000000..2ec5e978ff0e8c1516da613a362ec3b1c34db905 GIT binary patch literal 90069 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
ae7M*iV{BlxjlJvJnWUl8vf!=OcF|d* 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 Fe*nDbN8SJc literal 0 HcmV?d00001 diff --git a/app/examples/Drawing/Tablet/.icon.png b/app/examples/Drawing/Tablet/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d18cb788766d05515525542556383861ffcb9801 GIT binary patch literal 3536 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 KMNUMnLSTZgF~HFP literal 0 HcmV?d00001 diff --git a/app/examples/Drawing/Tablet/.lang/ru.po b/app/examples/Drawing/Tablet/.lang/ru.po new file mode 100644 index 00000000..6879e276 --- /dev/null +++ b/app/examples/Drawing/Tablet/.lang/ru.po @@ -0,0 +1,112 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Drawing/Tablet/.project:17 +msgid "Tablet" +msgstr "Планшет" + +#: app/examples/Drawing/Tablet/.project:18 +msgid "" +"Tablet event example.\n" +"\n" +"This example shows how to get extended event information about tablet pens. It draws colored lines whose width depends on the pen pressure." +msgstr "" +"Пример события планшета.\n" +"\n" +"В этом примере показано, как получить расширенную информацию о событиях для планшетов. Он рисует цветные линии, ширина которых зависит от давления пера." + +#: app/examples/Drawing/Tablet/.src/FMain.class:79 +msgid "Cursor" +msgstr "Курсор" + +#: app/examples/Drawing/Tablet/.src/FMain.class:81 +msgid "Eraser" +msgstr "Ластик" + +#: app/examples/Drawing/Tablet/.src/FMain.class:83 +msgid "Mouse" +msgstr "Мышь" + +#: app/examples/Drawing/Tablet/.src/FMain.class:85 +msgid "Pen" +msgstr "Перо" + +#: app/examples/Drawing/Tablet/.src/FMain.form:30 +msgid "red" +msgstr "красный" + +#: app/examples/Drawing/Tablet/.src/FMain.form:36 +msgid "Type" +msgstr "Тип" + +#: app/examples/Drawing/Tablet/.src/FMain.form:46 +msgid "X" +msgstr "X" + +#: app/examples/Drawing/Tablet/.src/FMain.form:56 +msgid "Y" +msgstr "Y" + +#: app/examples/Drawing/Tablet/.src/FMain.form:66 +msgid "XTilt" +msgstr "XTilt" + +#: app/examples/Drawing/Tablet/.src/FMain.form:76 +msgid "YTilt" +msgstr "YTilt" + +#: app/examples/Drawing/Tablet/.src/FMain.form:86 +msgid "Pressure" +msgstr "Давление" + +#: app/examples/Drawing/Tablet/.src/FMain.form:96 +msgid "Rotation" +msgstr "Поворот" + +#: app/examples/Drawing/Tablet/.src/FMain.form:120 +msgid "Clear" +msgstr "Очистить" + +#: app/examples/Drawing/Tablet/.src/FMain.form:130 +msgid "black" +msgstr "чёрный" + +#: app/examples/Drawing/Tablet/.src/FMain.form:138 +msgid "brown" +msgstr "коричневый" + +#: app/examples/Drawing/Tablet/.src/FMain.form:145 +msgid "yellow" +msgstr "жёлтый" + +#: app/examples/Drawing/Tablet/.src/FMain.form:152 +msgid "blue" +msgstr "синий" + +#: app/examples/Drawing/Tablet/.src/FMain.form:159 +msgid "green" +msgstr "зелёный" + diff --git a/app/examples/Drawing/Tablet/.project b/app/examples/Drawing/Tablet/.project new file mode 100644 index 00000000..acf53d4e --- /dev/null +++ b/app/examples/Drawing/Tablet/.project @@ -0,0 +1,16 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.6.90 +Title=Tablet +Startup=FMain +Icon=Icon.png +Version=1.0.0 +Component=gb.image +Component=gb.gui +Component=gb.form +Description="Tablet event example.\n\nThis example shows how to get extended event information about tablet pens. It draws colored lines whose width depends on the pen pressure." +Authors="Benoît Minisini, from an idea of Ricardo Díaz Martín" +TabSize=2 +Vendor=Example +Packager=1 +Screenshot=2014-12-14.png +Translate=1 diff --git a/app/examples/Drawing/Tablet/.src/FMain.class b/app/examples/Drawing/Tablet/.src/FMain.class new file mode 100644 index 00000000..c8124add --- /dev/null +++ b/app/examples/Drawing/Tablet/.src/FMain.class @@ -0,0 +1,178 @@ +' Gambas class file + +Private Const MAX_LINE_WIDTH As Float = 20 + +Private $hBuffer As Picture +Private $X As Float +Private $Y As Float +Private $aCoord As Float[] +Private $iColor As Integer +Private $hBound As Rect +Private $fPressure As Float + +Public Sub _new() + + Dim sLabel As String + Dim Y As Integer + + $hBuffer = New Picture(1024, 768) + $hBuffer.Fill(Color.White) + dwgDraw.ResizeContents($hBuffer.Width, $hBuffer.Height) + +End + +Public Sub Form_Open() + +End + +Private Sub PaintStroke(hDest As Picture) + + Dim I As Integer + Dim hTemp As Image + + If Not $aCoord Then Return + If $aCoord.Count < 6 Then Return + + hTemp = New Image($hBound.W, $hBound.H, Color.Transparent) + + Paint.Begin(hTemp) + Paint.LineCap = Paint.LineCapRound + Paint.Brush = Paint.Color($iColor) + Paint.Translate(-$hBound.X, -$hBound.Y) + + For I = 0 To $aCoord.Max - 3 Step 3 + + Paint.MoveTo($aCoord[I], $aCoord[I + 1]) + Paint.LineTo($aCoord[I + 3], $aCoord[I + 4]) + Paint.LineWidth = Max(0.5, $aCoord[I + 2] * MAX_LINE_WIDTH) + Paint.Stroke + + Next + + Paint.End + + 'hTemp.Opacity(0.5) + Paint.Begin(hDest) + Paint.DrawImage(hTemp, $hBound.X, $hBound.Y,,, 0.5) + Paint.End + +End + + +Public Sub dwgDraw_Draw() + + Dim hDraw As Picture + + hDraw = $hBuffer.Copy() + PaintStroke(hDraw) + + Draw.Picture(hDraw, -dwgDraw.ScrollX, -dwgDraw.ScrollY) + +End + +Private Sub UpdateInfo(Optional bUp As Boolean) + + Dim iColUp, iColDown As Integer + + Select Case Pointer.Type + Case Pointer.Cursor + lblType.Text = ("Cursor") + Case Pointer.Eraser + lblType.Text = ("Eraser") + Case Pointer.Mouse + lblType.Text = ("Mouse") + Case Pointer.Pen + lblType.Text = ("Pen") + End Select + + lblX.Text = Format($X, "0.000") + lblY.Text = Format($Y, "0.000") + lblXTilt.Text = Pointer.XTilt + lblYTilt.Text = Pointer.YTilt + lblPressure.Text = Pointer.Pressure + lblRotation.Text = Pointer.Rotation + + iColUp = Color.Default + iColDown = Color.LightForeground + + If bUp Then + If Mouse.Left Then panButton1.Background = iColUp + If Mouse.Middle Then panButton2.Background = iColUp + If Mouse.Right Then panButton3.Background = iColUp + Else + panButton1.Background = If(Mouse.Left, iColDown, iColUp) + panButton2.Background = If(Mouse.Middle, iColDown, iColUp) + panButton3.Background = If(Mouse.Right, iColDown, iColUp) + Endif + +End + + +Public Sub dwgDraw_MouseDown() + + $X = dwgDraw.ScrollX + Pointer.X + $Y = dwgDraw.ScrollY + Pointer.Y + $fPressure = 0.1 + + UpdateInfo + timScroll.Start + + If Not Mouse.Left Then Return + + $hBound = New Rect($X - MAX_LINE_WIDTH, $Y - MAX_LINE_WIDTH, MAX_LINE_WIDTH * 2, MAX_LINE_WIDTH * 2) + + $aCoord = [$X, $Y, If(Pointer.Type = Pointer.Mouse, $fPressure, Pointer.Pressure)] + +End + +Public Sub dwgDraw_MouseMove() + + $X = dwgDraw.ScrollX + Pointer.X + $Y = dwgDraw.ScrollY + Pointer.Y + + UpdateInfo + + If Not Mouse.Left Then Return + + $fPressure = Min($fPressure + 0.01, 1) + + $aCoord.Add($X) + $aCoord.Add($Y) + $aCoord.Add(If(Pointer.Type = Pointer.Mouse, $fPressure, Pointer.Pressure)) + + $hBound = $hBound.Union(Rect($X - MAX_LINE_WIDTH, $Y - MAX_LINE_WIDTH, MAX_LINE_WIDTH * 2, MAX_LINE_WIDTH * 2)) + + 'Debug $X;; $Y + + dwgDraw.View.Refresh($hBound.X - dwgDraw.ScrollX, $hBound.Y - dwgDraw.ScrollY, $hBound.W, $hBound.H) + +End + +Public Sub dwgDraw_MouseUp() + + UpdateInfo(True) + timScroll.Stop + + PaintStroke($hBuffer) + $aCoord.Clear + +End + +Public Sub timScroll_Timer() + + dwgDraw.EnsureVisible($X - 16, $Y - 16, 32, 32) + +End + +Public Sub btnClear_Click() + + $hBuffer.Fill(Color.White) + dwgDraw.View.Refresh + +End + +Public Sub btnColor_Click() + + $iColor = Last.Background + +End diff --git a/app/examples/Drawing/Tablet/.src/FMain.form b/app/examples/Drawing/Tablet/.src/FMain.form new file mode 100644 index 00000000..faeeeba0 --- /dev/null +++ b/app/examples/Drawing/Tablet/.src/FMain.form @@ -0,0 +1,174 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,105,83) + Icon = Picture["Icon.png"] + Arrangement = Arrange.Horizontal + { dwgDraw ScrollArea + MoveScaled(1,1,52,47) + Expand = True + Border = False + NoBackground = True + Tablet = True + } + { Separator1 Separator + MoveScaled(54,27,0,12) + Visible = False + } + { Panel2 Panel + MoveScaled(55,3,49,79) + Arrangement = Arrange.Vertical + Margin = True + { panInfo Panel + MoveScaled(0,0,49,79) + Margin = True + Border = Border.Plain + { ToggleButton4 ToggleButton btnColor + Name = "ToggleButton4" + MoveScaled(1,43,14,14.2857) + Background = &HFF0000& + Foreground = Color.DarkGray + Text = ("red") + Radio = True + } + { Label1 Label + MoveScaled(1,1,10,3) + Foreground = &H7F7F7F& + Text = ("Type") + Alignment = Align.Right + } + { lblType Label + MoveScaled(13,1,14,3) + Expand = True + } + { Label2 Label + MoveScaled(1,4,10,3) + Foreground = &H7F7F7F& + Text = ("X") + Alignment = Align.Right + } + { lblX Label + MoveScaled(13,4,14,3) + Expand = True + } + { Label3 Label + MoveScaled(1,7,10,3) + Foreground = &H7F7F7F& + Text = ("Y") + Alignment = Align.Right + } + { lblY Label + MoveScaled(13,7,14,3) + Expand = True + } + { Label4 Label + MoveScaled(1,10,10,3) + Foreground = &H7F7F7F& + Text = ("XTilt") + Alignment = Align.Right + } + { lblXTilt Label + MoveScaled(13,10,14,3) + Expand = True + } + { Label5 Label + MoveScaled(1,13,10,3) + Foreground = &H7F7F7F& + Text = ("YTilt") + Alignment = Align.Right + } + { lblYTilt Label + MoveScaled(13,13,14,3) + Expand = True + } + { Label6 Label + MoveScaled(1,16,10,3) + Foreground = &H7F7F7F& + Text = ("Pressure") + Alignment = Align.Right + } + { lblPressure Label + MoveScaled(13,16,14,3) + Expand = True + } + { Label7 Label + MoveScaled(1,19,10,3) + Foreground = &H7F7F7F& + Text = ("Rotation") + Alignment = Align.Right + } + { lblRotation Label + MoveScaled(13,19,14,3) + Expand = True + } + { Panel1 Panel + MoveScaled(18,25,10,5) + { panButton3 Panel + MoveScaled(8,0,2,5) + Border = Border.Plain + } + { panButton1 Panel + MoveScaled(0,0,2,5) + Border = Border.Plain + } + { panButton2 Panel + MoveScaled(4,0,2,5) + Border = Border.Plain + } + } + { btnClear Button + MoveScaled(14,34,18,7) + Text = ("Clear") + Picture = Picture["icon:/large/delete"] + } + { Separator2 Separator + MoveScaled(0,32,47,1) + } + { ToggleButton1 ToggleButton btnColor + Name = "ToggleButton1" + MoveScaled(31,59,14.2857,14.2857) + Background = &H000000& + Foreground = Color.DarkGray + Text = ("black") + Radio = True + Value = True + } + { ToggleButton2 ToggleButton btnColor + Name = "ToggleButton2" + MoveScaled(1,59,14.2857,14.2857) + Background = &HFF7F00& + Foreground = Color.DarkGray + Text = ("brown") + Radio = True + } + { ToggleButton3 ToggleButton btnColor + Name = "ToggleButton3" + MoveScaled(16,59,14.2857,14.2857) + Background = &HFFFF00& + Foreground = Color.DarkGray + Text = ("yellow") + Radio = True + } + { ToggleButton5 ToggleButton btnColor + Name = "ToggleButton5" + MoveScaled(31,43,14.2857,14.2857) + Background = Color.Cyan + Foreground = Color.DarkGray + Text = ("blue") + Radio = True + } + { ToggleButton6 ToggleButton btnColor + Name = "ToggleButton6" + MoveScaled(16,43,14.2857,14.2857) + Background = &H7FFF00& + Foreground = Color.DarkGray + Text = ("green") + Radio = True + } + } + } + { timScroll #Timer + #MoveScaled(30,54) + Delay = 50 + } +} diff --git a/app/examples/Drawing/Tablet/Icon.png b/app/examples/Drawing/Tablet/Icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a526512bb5a2c1d369e4aefc5d39b60c5914ee9f GIT binary patch literal 3753 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 V*+a}sDck@6002ovPDHLkV1oU`2~Yq4 literal 0 HcmV?d00001 diff --git a/app/examples/Games/BeastScroll/.directory b/app/examples/Games/BeastScroll/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/app/examples/Games/BeastScroll/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/app/examples/Games/BeastScroll/.icon.png b/app/examples/Games/BeastScroll/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7de9e813eee880887318fe133be91adb7c569805 GIT binary patch literal 3371 zcmV+`4b<|9P)ux*&lN5<=o;j0_m+6dOCl#@M)?Cceap+q9jI+w_l2#_e?4 zWL(D6X`5-BcG6^W8DCY3S@bH2;&KF_}I?z``PFpX(UV;a+##{XN0i(UNYOFfSnA-|!OE&C*uSV$#Y z8X_X|)y)qSH%>LFNel4TTl&t_&HZHLM_?@MK1nR(`0Jni-NFy1n%F0Wyx2u0O_^^j zms6~@tf;WL30H0Z=F8nHr<&NL1TYpn-(Gex#V5S$Ile<9HoC2$jQbXEi@ubmin0yD=`39Xb&U0?xrau(pZDLT$I9dGwh`L5<5@b6*W+98>Q<2(oq@@? zg!5;TI?=$PJ*O!wU%~Ee-=^v85$4r>4tWh%95EpQ<|>iYT8QM;SogPn>mmN^D;xRZ z51wWFfBZXt`||(dR@9)fA{06>AUt;Meg)mS4`)sZk-QLENz@d^99oE^R$3+1ggL-o zrU4}4XZhFfZ{{0irM&oikFx#wpHN;^%h#UXN=H0FqM(TIvO6feIXpZR5_R+-0j;lT z&?P2Lf<`5^lr}jb4&rh)!hWI~j{J-rzyEc%FJI2WSd45Txp8p~H{SgP>U%wu^)YS= zi~%7?pKWDcP7$GS_B9n?qP0nBlhTnYDWzas5tlC3_vq_srLC)plLy{lQGP2`x8F_< z5Gg96wX=&Szw;ECtZXu#k4X+-+!SJX0`lDyw&f(V@@J#9^RaDR^)i8{BUMrhVdF|5 zEawvd_7bDgcC4PblObW!9Bx0urUiwV!r46E(8^;6+Iiubr)hZg=ZNx!Jh$gGO|cYG zFiPH9i`&t{;@OKSo?U(IhJIwk$9TX{w`^QHN_Poqg&ZTm#d0CL8sDTm8YdPgU@&VY z1wyj4s)T(#DU5~hJ-3C2?zxMsTfaoZ(H7eFwU9QT!`b+Q{RpK=cb=v+7eqvg-~L|7cB^D$M^2FH-F0K?_AD*A5rureT;Ak35&##%y<~jLsj3z zcmL+kab{H@s+JL)H4l?Y;_mt%q6?NIutYoC_{@gKF4&e{GXazkVt9CsK}h9yYb!*j zl1M3s=00H&V_o3=H@5KL+A8*@g7jF2!IlH$ELp=~ypI9bBR`yjRuUlur8nQnGyl06 zw_z(yLNha{_`5X^bH;Tk>2Bwad;fGwh>t)Eggu|@lb#Ws+KYrbvodKhW{DWx3!OUF z$lN)a_fE93pA=3c2QS`(KM=!nveKvE!CJiDv&di&AtW-KO>oXU2I}8M2Ev4wtt4^u05TZB z?~kEoRq%S=ouhS0bv_i7Sdof^I`!stBK7UpQ|^d=7;A-+;JIm{*_H*%*YVPhow%_s zq|y}p)<*go-XwR?D&Ft0%;{*s$z;>_!48VoKfvzQcd_!VEtI=Sjv%>j)kccTYp;0J zf({tz69@+}?JYRj5u9)s;~SJC2si?p6Cqeyfp#pqr~uz}apM`Z^2YhSk`^(%AMnB5 zyiTMvfTKiG2tokTf-!=0IzcGYjWLz<?*H*N8W~ zMb5bb{KzWy|M2fAF=<>Y={ABaEhw!SMBaDLc>%=ef`k+z3B%_CO4uYygoZ2tAq@yT zI$BTC9mpa%;1I2;!;AM4Kl&locodbD6B+2E-wDv$50QXkZpcL|$emfr4J$u8DdHnA zM|M*>qlmm8JxX)Z644I1U;Pou#$T{~>oeqK{g}HRejJ+iQdCkxWq%tlb(~}24J&bP zeT38)3lM5dFzDMc0%(~UQO5WPBL&I{5G^Xh$;n}0&o0t#0wDy!S@S4K_9C^WGh^^i z?8VGqPHsgFHWDP{4KPc296qp<#Y=CQv;YgrN@)%kuuGLwXJW*HIq>ca45nQEXw7Q& zWdx>SD-~4>=uNxmhyQ_g-x6nK#?4MN`kTw&CTK9!8pgB`4?1934LeU!E@0PZd-LHzdCi8r5f79 zxp;Oc)Kp^VOOcjyNoJIm(|B|*o={X&EAL&cHrlk-glc1C&MxWJ^loUg|B`H8nD03=n*|4OJKqf?4?hIsB2$ONi z?P}(?LyCJodp~tKQPKx?V~s%!=lz9paQE-zhFN8-3P7-<4UthCKDY;WFn&Qhms@mh z{$)KcOdSIn`J!!9}a+PYseMCATbCMCrVRG#}fK((0P#1243IF@ca4 zB*pOAh;LCJw^^%Lu!P+DcSse^#zylwCM1WRdx}RlK1l77n<$$zkNU><*zwLb!t<68 zEGQu!&Et@@oH%ugnxp$zx8cESN_-T;NUPM$nO{oY-i?(W1jhSGvU%GYi{Ox5wT z5K;_hz(?i)0r2W!`}O_|j{~IAnS9UK;1xIW8w@Q)IxFb(0z@7DabvA`N&{Ho4<sSDkFqw3J?};z3Ex#4$9u)xC0Mr0sAOK9w5$>-K zK9FJPL#ZRcFGd7_q0dOmfNEeCkOzdgbWrtagJEd%(+9Kz$AL3IdPD%h(1?eI#Rv?O zzh1tTvBM&`!zBrLfSpM2dLjHt1ewM(rZJ6a{2zn)MP$*SoEQKA002ovPDHLkV1kjc Bc>DkW literal 0 HcmV?d00001 diff --git a/app/examples/Games/BeastScroll/.lang/ru.po b/app/examples/Games/BeastScroll/.lang/ru.po new file mode 100644 index 00000000..75375e68 --- /dev/null +++ b/app/examples/Games/BeastScroll/.lang/ru.po @@ -0,0 +1,56 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 04:17+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Games/BeastScroll/.project:20 +msgid "BeastScroll" +msgstr "Свиток зверя" + +#: app/examples/Games/BeastScroll/.project:21 +msgid "" +"Parallax scrolling demo.\n" +"\n" +"This example shows a parallax scrolling with a music playing in the background. It is based on the SDL2 components." +msgstr "" +"Параллакс-скроллинг демо.\n" +"\n" +"В этом примере показана прокрутка параллакса с фоновой музыкой. Он основан на компонентах SDL2." + +#: app/examples/Games/BeastScroll/.src/MMain.module:190 +msgid "FPS" +msgstr "кадр/с" + +#: app/examples/Games/BeastScroll/.src/MMain.module:192 +msgid "Toggle fullscreen" +msgstr "Переключить полный экран" + +#: app/examples/Games/BeastScroll/.src/MMain.module:193 +msgid "Take screenshot to ~/BeastScroll.png" +msgstr "Сделать скриншот в ~/BeastScroll.png" + +#: app/examples/Games/BeastScroll/.src/MMain.module:194 +msgid "Quit" +msgstr "Выход" + diff --git a/app/examples/Games/BeastScroll/.project b/app/examples/Games/BeastScroll/.project new file mode 100644 index 00000000..5006ab9f --- /dev/null +++ b/app/examples/Games/BeastScroll/.project @@ -0,0 +1,18 @@ +# Gambas Project File 3.0 +Title=BeastScroll +Startup=MMain +Icon=logo.png +Version=1.1.0 +Component=gb.image +Component=gb.sdl2 +Component=gb.sdl2.audio +Description="Parallax scrolling demo.\n\nThis example shows a parallax scrolling with a music playing in the background. It is based on the SDL2 components." +TabSize=2 +Translate=1 +Language=fr +Maintainer=benoit +Vendor=Example +Address=benoit@localhost +Url=www.endoftheinternet.com +License=General Public Licence +GambasVersion=3.7 diff --git a/app/examples/Games/BeastScroll/.src/MMain.module b/app/examples/Games/BeastScroll/.src/MMain.module new file mode 100644 index 00000000..831f1f99 --- /dev/null +++ b/app/examples/Games/BeastScroll/.src/MMain.module @@ -0,0 +1,215 @@ +' Gambas module file + +'Public Screen As New Window As "Screen" +Public ciel As Image +Public montagnes As Image +Public barriere As Image +Public sol1 As Image +Public sol2 As Image +Public sol3 As Image +Public nuage1 As Image +Public nuage2 As Image +Public nuage3 As Image +Public nuage4 As Image +Public arbre As Image +Public fireworks As Image +Public scrolltext As Image + +Public scroll As Integer +Public scrollb As Integer +Public scroll1 As Integer +Public scroll2 As Integer +Public scroll3 As Integer +Public scroll4 As Integer +Public scroll5 As Integer +Public scroll5b As Integer +Public scroll6 As Integer +Public speed As Integer + +Private $hWindow As Window +Private $nFrame As Integer + +Public Sub Main() + + $hWindow = New Window As "Window" + + With $hWindow + .Resize(640, 480) + .Framerate = 100 + .Resizable = False + .Show() + End With + + Music.Load("b-title.mod") + + ciel = image.Load("bgd1_ciel.png") + nuage1 = image.Load("sprite_nuages1.png") + montagnes = image.Load("bgd2_montagnes.png") + sol1 = image.Load("bgd3_sol1.png") + sol2 = image.Load("bgd4_sol2.png") + sol3 = image.Load("bgd5_sol3.png") + nuage1 = image.Load("sprite_nuages1.png") + nuage2 = image.Load("sprite_nuages2.png") + nuage3 = image.Load("sprite_nuages3.png") + nuage4 = image.Load("sprite_nuages4.png") + barriere = image.Load("sprite_barriere.png") + arbre = image.Load("sprite_arbre.png") + fireworks = image.Load("fireworks.png") + scrolltext = image.Load("scrolltext.png") + + speed = 2 + scroll = 0 + scrollb = 0 + scroll1 = 0 + scroll2 = 0 + scroll3 = 0 + scroll4 = 0 + scroll5 = Rnd(0, 640) + scroll5b = Rnd(0, 640) + scroll6 = 0 + + Music.Play(-1, 1) + +End + +Private Sub DrawText(sText As String, X As Integer, Y As Integer) As Integer + + Dim I As Integer + Dim J As Integer + + Draw.Background = Color.Black + For I = -1 To 1 + For J = -1 To 1 + Draw.Text(sText, X + I, Y + J) + Next + Next + Draw.Background = Color.White + Draw.Text(sText, X, Y) + + Return Y + Draw.Font.TextHeight(" ") + 4 + +End + +Public Sub Window_Draw() + + 'Dim hImage As Image + + '$hWindow.Clear + + '$hWindow.Clear + 'Goto PRINT_TEXT + + Dim Y As Integer + + scroll = scroll + speed + Dec (scroll1) + scroll2 = scroll2 - 2 + scroll3 = scroll3 - 3 + scroll4 = scroll4 - 4 + scroll5 = scroll5 - 5 + scroll5b = scroll5b - 2 + scroll6 = scroll6 - 5 + + If (scroll = 320) Then speed = -2 + If (scroll = -960) Then speed = 2 + scrollb = scroll + If (scrollb < -640) Then scrollb = -640 + If (scrollb > 0) Then scrollb = 0 + If (scroll1 = -640) Then scroll1 = 0 + If (scroll2 = -640) Then scroll2 = 0 + If (scroll3 < -640) Then scroll3 = scroll3 + 640 + If (scroll4 < -640) Then scroll4 = scroll4 + 640 + If (scroll5 < -640) Then scroll5 = scroll5 + 1280 + If (scroll5b < -640) Then scroll5b = scroll5b + 1280 + If (scroll6 < -640) Then scroll6 = scroll6 + 640 + + #If False + + hImage = New Image($hWindow.Width, $hWindow.Height) + + hImage.DrawImage(ciel, 0, 0) + hImage.DrawImage(montagnes, scroll1, 200) + hImage.DrawImage(montagnes, scroll1 + 640, 200) + hImage.DrawImage(sol1, scroll2, 420) + hImage.DrawImage(sol1, scroll2 + 640, 420) + hImage.DrawImage(sol2, scroll3, 430) + hImage.DrawImage(sol2, scroll3 + 640, 430) + hImage.DrawImage(sol3, scroll4, 450) + hImage.DrawImage(sol3, scroll4 + 640, 450) + + hImage.PaintImage(nuage1, scroll6, 0) + hImage.PaintImage(nuage1, scroll6 + 640, 0) + hImage.PaintImage(nuage2, scroll4, 82) + hImage.PaintImage(nuage2, scroll4 + 640, 82) + hImage.PaintImage(nuage3, scroll3, 120) + hImage.PaintImage(nuage3, scroll3 + 640, 120) + hImage.PaintImage(nuage4, scroll2, 138) + hImage.PaintImage(nuage4, scroll2 + 640, 138) + hImage.PaintImage(barriere, scroll5, 440) + hImage.PaintImage(arbre, scroll5b, 140) + hImage.PaintImage(fireworks, scrollb, 0) + hImage.PaintImage(scrolltext, scrollb + 640, 0) + + Draw.Image(hImage, 0, 0) + + #Else + + Draw.Image(ciel, 0, 0) + Draw.Image(montagnes, scroll1, 200) + Draw.Image(montagnes, scroll1 + 640, 200) + Draw.Image(sol1, scroll2, 420) + Draw.Image(sol1, scroll2 + 640, 420) + Draw.Image(sol2, scroll3, 430) + Draw.Image(sol2, scroll3 + 640, 430) + Draw.Image(sol3, scroll4, 450) + Draw.Image(sol3, scroll4 + 640, 450) + Draw.Image(nuage1, scroll6, 0) + Draw.Image(nuage1, scroll6 + 640, 0) + Draw.Image(nuage2, scroll4, 82) + Draw.Image(nuage2, scroll4 + 640, 82) + Draw.Image(nuage3, scroll3, 120) + Draw.Image(nuage3, scroll3 + 640, 120) + Draw.Image(nuage4, scroll2, 138) + Draw.Image(nuage4, scroll2 + 640, 138) + Draw.Image(barriere, scroll5, 440) + Draw.Image(arbre, scroll5b, 140) + Draw.Image(fireworks, scrollb, 0) + Draw.Image(scrolltext, scrollb + 640, 0) + + #Endif + +PRINT_TEXT: + + Inc $nFrame + 'If $nFrame = 1000 Then $hWindow.Close + + 'Print $hWindow.Framerate; " FPS\r"; + + Y = 10 + Draw.Font.Size = Font.DefaultHeight * 2 + Y = DrawText($hWindow.Framerate & " " & ("FPS"), 10, Y) + Draw.Font.Size = Font.DefaultHeight + Y = DrawText("[F1] " & ("Toggle fullscreen"), 10, Y) + Y = DrawText("[F5] " & ("Take screenshot to ~/BeastScroll.png"), 10, Y) + Y = DrawText("[ESC] " & ("Quit"), 10, Y) + +End + +Public Sub Window_Close() + + Music.Stop() + +End + +Public Sub Window_KeyPress() + + Select Case Key.Code + Case Key.F1 + $hWindow.FullScreen = Not $hWindow.FullScreen + Case Key.Esc + $hWindow.Close + Case Key.F5 + $hWindow.Screenshot().Save("~/BeastScroll.png") + End Select + +End diff --git a/app/examples/Games/BeastScroll/b-title.mod b/app/examples/Games/BeastScroll/b-title.mod new file mode 100644 index 0000000000000000000000000000000000000000..8eee2218f08f32104332087ef5f84dfd06a1f84c GIT binary patch literal 56838 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 I(C}yfU+STyG5`Po literal 0 HcmV?d00001 diff --git a/app/examples/Games/BeastScroll/bgd1_ciel.png b/app/examples/Games/BeastScroll/bgd1_ciel.png new file mode 100644 index 0000000000000000000000000000000000000000..f0a38160c3808fbbf328c2e6b84f31b3df599800 GIT binary patch literal 6797 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 literal 0 HcmV?d00001 diff --git a/app/examples/Games/BeastScroll/bgd2_montagnes.png b/app/examples/Games/BeastScroll/bgd2_montagnes.png new file mode 100644 index 0000000000000000000000000000000000000000..37ca6393ded1fa08b5503ff78879b22c9e87bf1a GIT binary patch literal 177395 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 literal 0 HcmV?d00001 diff --git a/app/examples/Games/BeastScroll/fireworks.png b/app/examples/Games/BeastScroll/fireworks.png new file mode 100644 index 0000000000000000000000000000000000000000..93fe0b6b202f7d5a730ffcdf1ac34a738f8236cb GIT binary patch literal 46710 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 literal 0 HcmV?d00001 diff --git a/app/examples/Games/BeastScroll/logo.png b/app/examples/Games/BeastScroll/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ef6427938a7b4bd52f271e6ba61d4484042b270f GIT binary patch literal 4768 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 BB@_Sv literal 0 HcmV?d00001 diff --git a/app/examples/Games/BeastScroll/sprite_arbre.png b/app/examples/Games/BeastScroll/sprite_arbre.png new file mode 100644 index 0000000000000000000000000000000000000000..a117f15c8611aa3428d53f567caf9baeb5717b5d GIT binary patch literal 73213 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

FXBSb%O6J8er)Jx8umU5c`T-6g0FapxGD8 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 b*5UsHy$eSe!oUrs00000NkvXXu0mjfG4u@( literal 0 HcmV?d00001 diff --git a/app/examples/Games/BeastScroll/sprite_barriere.png b/app/examples/Games/BeastScroll/sprite_barriere.png new file mode 100644 index 0000000000000000000000000000000000000000..61a159e7be6c4d5da399810301428d089b6488dd GIT binary patch literal 6455 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 literal 0 HcmV?d00001 diff --git a/app/examples/Games/BeastScroll/sprite_nuages1.png b/app/examples/Games/BeastScroll/sprite_nuages1.png new file mode 100644 index 0000000000000000000000000000000000000000..5e27ccc73ec3c95ea26267177b11915769c15a22 GIT binary patch literal 14285 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 literal 0 HcmV?d00001 diff --git a/app/examples/Games/BeastScroll/sprite_nuages3.png b/app/examples/Games/BeastScroll/sprite_nuages3.png new file mode 100644 index 0000000000000000000000000000000000000000..65375fe4246537dbd4b0481c14baf77fd073c704 GIT binary patch literal 2389 zcmV-b399yqP)Ta^wY9azl$52ty~f7I&ZV5Ky|uNJoScM&jJ3VS&c@cx#?G~^t*xb{jFgnU zz0RDJl%KjrLDcKrMMn*>Rj*N;d*J>;|fL&s6o9vVp z@@i&wH}n7h(ta}Jak@PzuQZvnz0NV%0qH)!`(4xN>?9=U(%ruK_YxBJ*h}lMv+g{4 zExP~XH^JhAuGnW0lP_)7PY@aWeeINQ1|fNACGJFo^nkhuC1{dRfp;%$*t3dOY5X=b zFj76o^5UI7I!bl=EV}2Zh?D2jeH&4^5;kO3>jN#QIdz6bJyuZuJl=a90y~c_iw4Zb z!J&M2FH#I?Fbc*&$&a2v_dK8$F&YFFWzVtx7Gf!_nPHRefJZ0$+4<=0k%D-mD?@pije;_xsX9<6S+C=U zg^v*uusiTEs$a;JtxDSPEMbhZIGFHakCiMpU_*L3>rDb=G)tz@H0sT=og*W)wS}u< zR7O+j*TPm*GmfE)?#)h;0A{ieQ8b9A-QMmPsO`u5cXn9YVptV8oU583wk8O|k{_l7 zDK)2UjHV@HK1PGypf~NFxfgS%M2uq=SB9C&@MLE@RY#dD1CNZmvq6>^6PF*7B#OHK zoRvFfwbIU5vL>eAYrTplqMSR3g)13gx%s?P zyHiyvb#JEwD0M!>)+Ka~lkSEwAVe~5(#BTcB)!Zy}wrPg*55l6FbIVnS+ z6d{*U{;e=QLmYH6@~n-ggsFE^`ds zmp%a*LYBRsnM3(&GpEvoH#+w|B~l8J1OJ*i^I=BAqZ?+RO#S@ga?(+#Rw-Np9Ee!l z`m6#zc!tC<4byF&l&RXJQWVB{{F{RrILFw$#X`9NW!R7R(-4g(p5|s)qu*RJF1T=F~ zEie?$DPvZ1N%V5oU7E1PWrL+hhETH>EeNTnOAI)ax`$tf*#WtkDD zWZ_)Q{Frar8gYw{&QM%{sBw5>>u?CIsj&}$4d$nO1rvc_7?C^S%UfgSraL^+5V zlr-h&2V;Y5d76?)VN{l76YA78SQ~mTdb!7~xDvjzJEV`bz^tt2qqC6%rRqae|JsM( zvbuzmzz3^kwY09~h1MUK5^Yi2W;_~wt@CeIu)&DO#g=ok9S39UlUms^FOYsTIP1~A zvZl!Ur?_9R65JMjvGN*uJ7YG7o#+Jq8q?~SpY?_tSa@%#kAal^mIgi8PjIIX`}@x6 zKK`ZrN8k|*D4WC7I^e30T~3u_W$1w2#(96@Z%M;dj6_@E21T8nobW5~#4WRHBhQZb zeMhn$|KhMhGXVnn1iV?HzOYNEl0p4Y_GkqOWwC=IGN+ z!%s?%u2{c2(pOjYyC1BmQtxdv3@^Gp=ZiGQS?Cl;euSE;EsnZ&-$B5K8EXqE=oKKK zPSv|&JVGWGUmI!xir7#2R8~5s7Fe}N7pVXY0<-eiowiZdQ0~Z5+noLJ z7z4UK1l5-9RuCy_0i(G|dR`ei!WfPJ=Kd@8Aw_g-JM*4}+# zcaeVHL>Kl@OY~#ip*dnia*MIex0E(a|2q3O|If#Lf5XZ>)(tCo^b~$ADjL#C`IxRW zxLGCO?HvXZSLH-3eIGT$9d^rGN6CEE_-<}H-)|Rch#Jc`#t7u0@F(Avd^Gm-$#?fq z>fY5Vt$(mZu3NLDc5SP={nk#~e6_FOaplvxul)bl_hW>@uIW|1IgUS$%KH7?9ZyaQ z1n?BZUgua+roONq=mrwy7Ox%#QICGuTA;h-8*crr;_VsC5HGif`H9=3sHaHE<6&RP z=bqH$1|)0s33X6Af0nGRgCk|D`vLrk`R38&RefCDyT7A^=dV73YbvqIzu(pfj1~;} z>rOYHJ!A`_`%8XF=X*?Ov!c9N7r@O+TkuQ%Uq!C4_(}OMkZ#RH#g$%`00000NkvXX Hu0mjfl0vVg literal 0 HcmV?d00001 diff --git a/app/examples/Games/BeastScroll/sprite_nuages4.png b/app/examples/Games/BeastScroll/sprite_nuages4.png new file mode 100644 index 0000000000000000000000000000000000000000..db1a428ade08f138f8e9c82ce27e5d52277c4bfd GIT binary patch literal 1036 zcmV+n1oQieP)`B0001KP)t-s0001M zYio0JbBv6PoQ#~Dl$@NLoTZ$lrJS6Ul$4BwjHQ&EoRpM|jFg<5rId`6l#HB|l$?x& zl$?~Ml#Gmwl$4Z&jHRWmrJSvtjFhFNrF(mXdxU$0dxU#?dxV69YjbOadwXkhbD~n! z!~g&Q0d!JMQvg8b*k%9#15rstK~z}7?O1_U+b|3aQSH>Cvg#x)+e%y5|9|98Zh3Tj zKX4Ac&(?!`51%{hK#uAm|6`<36)bn83aHI zg6ieoloZ%l(bMssoR33NkQBd5^BHqKJLL2Af&Y;O2tF#XJ1W@u-5ys!0fP}X5r=CC ze)r>en$_Zs#0gL<(gY{SRFQ+c$fRRrs9B}yGV10m~eKi_8%x*7#z-EKRK+786(Ho(<~a{I_P$m z)4G`RK`@HhG1T9wtj^WYX*{CB{Yh&%Tf0J=+s*BEx7o8U5;W%-#KfEZ;|~)uil2-(a$xD{b#Nf2w*KgOxJZJPA{_%s9Z1?#_gRj6UR$Wj z>(RbC(abMtiP;lMSd_(#-8u(nFUA}z#wnAlSY#!g2lfl?0W6~mp969L0000WxCpSI-}3v*iPG- z*6A~&efmd*>S(b-ThwY>WK(Kbgcz0}OGwB{_KoB&@4fFi^9M;t!csP|@O_^1Jon!B zJ?DMD-}C$Z&hIQ&aFroz`6i6kpbbvvQ93q1a!KvU51Y`1Ap4%p03^qID9TGj#${Y` zo7RU->U@xU-)6KHC?R-gNeJ}jXb8n*!7!9|5B!kC4I|kSC@?05=NsTAjZxP8~Otg6?S<5$KTth~(hfqin&7KEW zs{o@Od|9)3}f>XdF>#)brfPT*ii}BPYkfWt(ffPZ=#gqOUv^4%Cb>> z;Ya&f-%xR0&-$AZpx_^NV6=-dke%Y?J9p=^WOjf}$Kb^+5Q?0-Hxku!Iuc(XhXvEp zdE&uBj<-db|D8irR`r1NUR?qdKD-@cASvF%KQ0={-!IChtQCH^4cdDl=AOE@vA&JU zgH?=75j_9hDHP|%^SxDdtbL~!l$UtnBdUBCFTi7K+8;4OJZ34AbDr-X4my;^Dfi1y z-kni)A;iZ%vIB%f3i$M#48DFxE}cg4i+xbrb<*7X(b*B?(7t2DLOp!@lX=|xv21?& z`yikCK@AZ%2FeFQptP5$jJtRNj1Z5_7Zhdlj`n!LvLh(QC z#uzZhFmF-{|NO~Zl2g2_uYrTD5Y>a!4aInWe?1M=jV%A@2)?y!93@9B7C!|&tu8U+ z1vChOFao7L7$dQ>Zy|bo!-Wf=q|R|Q7mS&sNZxf!ym>AW#(#AuNE@SJVxFIWzAJ~R z1@UZcfcN%;GpNU17mgfiq2gd2Q}X;g^Vn33<>SjQLU}!C4GD1`5DJV7C@d|(6$k?= zWy-|~pbf-abKwdA)ACI6do|+C@2zRO^@qbmnE2>kj5Y)kY`(oTo7-ll@LnsdIsn1g zNkaW-s5`-)vO4_I#hHHm zm$j{CLe|9z&@W&`i{N6c=!1aPIF8FJPu&~%^zdtEw*Y3`P}gyD>d!I=fX;9jBy{H@_^A?7gMbwD4*JZ#nqJp>w<^@LyV@C&57?gR)~>Olt_b=pHH5Gb7uN9A0y%5}FcQ^4OGz10QpTU_#%l#?_;)EomQpIHlp1#7 z!+zBd2*WH}DIK)rNedWqL5j;a0%$iz_0er~Rlm=)TOUTdF{JvC)?wsO1*DWA%a$r^ z4YL4onFP?!1 zJJ%q_Pa=9`KV34Fo{S{od3NPMa8o)@9st_ffMY;ii=0eD=EfMo|aHSODP#1ZULA}8wX=fn8wa(?EHK%2K(kE zbTw3PLz>O8(H}txMaAwnD7fxc;*&>QIsRg(07|)GODY*s!-9jkNCEb4Tt#EWZd?Pg z8M8@FOhHE-{AmHgM@xBsR}C5Yv)J+KPpN7>#F!Z$N6IUgbckUtAe9VRN{Y~M4=@)I z0@nTKXZXtJZ{xmStm4hz{F)#9b~DcCVpLo_88-BY7~6Nef>pm4J1>j)R3Da-S9Hi7 zp5Q4dLYAduNU5P$^aX~1V0SAo{QLC@3kR=77OX&qS*aC-s$Hu?=CT~uk&V;Tm5`<*hq++Hm zS}42F zOR12hr0G^t2skzPpDhM79NA5`9VMtE96Vmf(s3E+j9i{Ct>=;QoAkWaRJhWWJ+Ncd)vZj1JC?wEuXpl6U5ECpVGs%H0-SXA1&_vK2xLMoyY@-U1kdP?l`AY-L)Ml!HeIp@#*F^;=%z?nTpi z?U14)wI~z}&@; zATPo38xL;dm8ZW!OT%H5>R-e%NZVq}m}%Vgy%+E#q@6{8Q>Z(ozcg z7XgJH^nN=xt>vDZ3)vI)(q?RWYs*QRd?UTx9rQRc()>wSN+N_{RK{u3*?lL zTN8n_c#5VLlbw=CZzO`NHI3~j$WBcnDc+{E@)&Rb>M`a&^!?M?kx~p;y3j^My`o6~ zJhd_0a7qAUMPqJ8%!$z6a)5Eu3s|$UgxankaexV=GUOekc@O|zIZt`OVjr@OX_ z{LukY6Ft1Tbw4j}*hL^Yodanq#fH*%|ZwlKx@M{7sidW04ym&LJD7> z1>g!nBof3IZ9(e-+LCh-?FWdo)D!LSkXSsE6GzKQ3}mvYqM4-dA*{qyx(>dF?emj3 zYBJu`Oulg4&Dh@aJE(9jXdrh)BKg??lG6gTMs0#^jr6v(&>HHZuBn6C#&)KR%3|A* zIzpi^9ZfZ)=M)cf0Wn|#5<<|oFQ6nLA@TM3hL92jF&gVDY4OAn>aj^IoYROKUL3?!#5=c&`-YjYnvk zcz+zZqqC{1X`-NL5|$K5yM<}R86fp(NtTp|{`hW&2%to`Um2khN(z+iA#p?wc2W{O zyS5W?f(Rk-W{)8&)Q+?)nxY!_=pOXg=_HRX#>9K^#d^qAF%FiOFlox13!r&s>??VV z$?1O5{9ekcT3PY*OBChj@{I>R$yXm-%;7`T)VD`@_={gAkde;+JoOXOO&fN_I@GLB z47Gs1WC*|r!h-}L*gxqI0c7{k9nNQi_J;a1!birh#y10dp zY4es+zWJAkmZRK#_cG>w>@F%w|3qF!GH4ei6c5~gJINkM3>1eJ&sDt zLfSU{Z73-yt7~Q2`02c|ZZ+3O+o>+w#nMmQPf~jJ1&iQI%A}+50GVm2C{F@WJB>eX zDPiY3yYWj+PGL54ub%*>mCnu{68zaD+uqZrzx{K7K7^rfjmYYo5h{5yQ1pLJOip2P z_86Xj?j@`}>q!j+&_eL)hPAj!>ByP4GIQY~=xo9mfiY%aLDgd^_SCgvPrQlV)_T77 z=r<^<+(~uiKKk1~-%@nL9R$NsHf`R(-mR-i^GU|fm_@zO*cquzoKT1-A%N2zMMO1C zHI?kGtUIk8Da-&jOAN9AONpQ!umB+j&znaTO=PhpDXFh!tQF)hN2*A_aWUHCr?Rpd z;Y*;arUGwo5Aj9UfiZnT2y7)$xRf1h;=t-ZGde4aV9PP0S~Fq%wDY!r!pXDQk(Nul zBlz>CtxTIbnb~u1=8i@4N%BB@<8c~mD#;j~gJmc3;!D4zXxZ0JoBt~*ME~lS?27@i zF9w89sRU|R$txJo;>k1cM1ABWry%2e=%_<-b2T6JDQ>@I88ea+iInfaXpQJw_ZP~> z*>Or$z}wh>h$;>q*oD*EecE%*R?;)Fd0@p_l*dP2@g%UlY}l}o*MIXe+c$3D zL`ORX(`FEfNLH;}&92@eZdvy5Y3)dH%DOFi(gg&-@5}X1wc%a>C+5aGQJr+Q-Z=Vx zDZi_&#ha0f=x(Jr7UJUz?*icPf!(}wXdlfg4qsjoNQr50Bq`iWzTd}$`~pUfnLzcC z{bc5hCeEL5L9w8{rGcM+cPV*EHVbD@BQqzLtUv;B+M%(cf-OfonXv3%2^3B}V|}l! zx@}AL0!YE?Ws~H$1i&BO*WZu9LjaMeo8(0GS$Bt{QHN(&|AO$OIbbwONMd{5;(^=l zAw4sP6J71>F5AY&vYq(HOvam@g|KauF?f19DR#Q~*y4LGi1=_+l)p=7O9LJykisAZ zxCnBKuO~Hd_8{xAWslcZCjcy1dHV$USl=i>Q0M`Fk>VWN!yb>9I~OixXUx)=I}!LIg>qcJecO|eR_L1k!&29t002susMFJa^!|_L%>!Bn1OOHT#eg61aQcCY zs~s*71$u!)z@PdB0Pq4iKoO7)qyj#!vcJ`x1Dccb{|?|dPyy5dkwJ4nR3B+CCoMp7 zmeb@{AxxhLPG1QDG0w0LeytEbA3-i3;k^6S<4sB9y0Iy|{Ix<_x*VSPO$~o8Z6jE> zi`KWFB-Y#Xfw8&$!Jly8NH>-z0n6jZ<4a-u7??kQCYBOpr24pX?x-`?y)37dLUknw zwSe*(iyyD6XKhIh8XeSw|1|cBMW1W>e zTt<`6T(Sy()@Y=q2-TO;xZ!bh9{=LvbJn|T z=hd3t`1}R@EL)5&Z<5{J;F^u6HDQo0fTuY)O+!0sF?OUUL0&~UXfiEbEIn-}O>Ias zVJ$syBu#KAHc!XK%uYLEGCyfDhqE;|XfjlUH%WFOAU8rkQ+a5MJ3enVScgkAVlpsA zIW|i%h_o}9!!3TNFLR^UylioEXKQaPfT$*CjWB+zGnc|Cb(}ex#6x+IGkcpP zVu&VPg))}GGnTsjzQEV}hyDWdFDq)QfMOqI(R1q^v z6C6nsRd5?wb})RYGLO3+Ibs_%TM;=>6f8&-MP?FYb}D;d{9zwXeLwxn0Rg!B88`S^JayxnE93940Un_Kmc@&2 z6$5eA6d)+Mrav+O008w#L_t&-(_>&}VP#|I;N;@w;bi~=K7Ikg$f#%`VG&V?fS9;M zOjJ~CTzrBgkS8V0Ad{Gs9F>xqmYyLC6p)i=P*BXw%FfBni;7ZGW>8U8V_;CvFDNW3 zE-8&F)6mo^*JfbQiK?iqs;;T6i>lYv(>GvXFpNrRXl!b3X>DsaVl*~kU@(o0>FDh0 z?&AP8O9iPQif9qBHi`x+g3qq%q7<#zT5$QG zxO6QjvZ%HQA|Sd5pp6hiKp{a0lgN#^~$_x8ioRD=@h|KmM-pZz=g?6c3g zM3N-jNZU8><38T<#iTyhK#_OQM=cqq&Iu*AR;=6fq6+}Z%F5)mwY4)cGc(Wa-MiO` z|5If0#JjUX;gD_d!wafjd}*a{|9wkLJ3iUm!}A=LFI;12YVTg}PSV}WWREmR90zo} zLfpl+hE#d{WmYFJ-L976l9EX)>+0&hjm2V{04SC&UAnWhv{bkm07hZ3uL&fZ*7vlW zZ@lfc$xYj~?tIN^wp6|L!h2)R)wjLsEy#bApFKlGEoM-o0d%B|i>2x|S!f&9E*^HUrI40Dy!U_%YGzx5e%}p<@DFw{9IA4hPN3%2LdkGe;ha z#qPh^EnuZ+I7BD|zMv%Y+k-pS2E$^Z(~>a>IwL2WRtykwl|$6k4JuPWVH*j-KLF3* zAU@c#1+!+&!lq4|(bm=myWMWRSpdqqyN|{_1MtQPML;|j*i|N1%2wtmy+hqeIy3}SdD^j>uafp zdR#u#Ib*5&@IgQlK~&1?It#%dxMY2zf;kzE^@Ne$*oZIBoQL`0=dkCq15z*;Ja8j` zQ?+$DSFUtE3Sb4z$gmzDr>o0FpI4OPaquZdcupPzgzFTsB!Mt2Kq&ygq~gI%n2nuo zC47zrkf)DCQ#>g$Ca1XZMgSboCo5D+8vro%4YkoDhbk%t8_wznJG=AL<0sHyYZK5n z0NL2wt7K?=}=~J zjT)pV_-g{lEEy2e?JKry*{=QR*n;^>GETQ#{*ak=*L0#Y%-;IJ#}4|#VC}K9W=&Cv zB4y@W41V_wQsys2=<)@0ezXal+qak#+*07-&XBZo4K;#CZC+eq}Xs#VXu@T%HsPThXd z=~@v;Hb23Q%t;o4ekst}grwr>2~O`4`NIK>E?h`6-c85f8}ZH^7jK-Mo2yne0!TSzA^`l{L@N1g;gtgb$>cA)uWZ$_5o-5~(CYoJf)c7Yo= z`oGad31V{_n1LYTp)jOy1Om%~D7;`p3eeLofXE;f+8~-k==$nYSm!Q=%xVJwXbXyg zE6sZjeYKNDKMDzeZu)R5%KttVZ7}UWabQLbMnDXDg;;xqEtXi zH$rq+A*usFy%S{L84!_zOdOBS@*RkK6Ez_-TMQECv*ff@l^Kt-JaHh(v&K+32nK9Fiy` zwjv`tx3%?B_OJk}{<6G7q2P}T?Hvg2_zaQCc(8wWK<$!_%qHz#i5`v;1;mhp+0M2Gt_yuwHumGdRjT9|B-ek?jh;s1)C?C2H zj42fWz>Y|Vj;12Tqe3e5(7FjgDA*VQ>vV$#LO>`65>NC4CdZC}@2dex0&hw~NRc$J zrsg!gApii3$hKB0TF&p6qS2uXCt*dQm@^Z6{#ZzPb_BEnBuRp{uo(QP9LP0#(3k{m zT_0riT_A#laNG|e-~*u)k~yQ`Pir@rhXvU9(JS#(65lA*H-&*j|CeG>1ey|eg0HO+ zuA}7;^lEUuerO$2L1Z$pX=YGP4$b_#p-;B@|iWDq3#DpjmM2Yl;WzgSw z4;ZBi03ZhZV3YL#OCiN#iJHk8f#loo1m6=xf8`+rn$AJeo2Ebe^dGok0RZ6H)urb~ zh~ZN0*OdqOit1KFK+$D1<;L~)LU4LR;#vkE#bXe?UT_8zM2HYW;lu=lfXx~K-J(T^ zbUEQWb_CEF?Dh4{wx7mguLm%3TE4XVoA(a`I4r~kyubb*mc6?Uuj%UZKPhzffXT1` z0HRmg!KgG427};aDli)Le}ty zRrH)G8vI-6(=SA^rx#K*3Qt8jl4i_Cpymwp56%NsDz5QYjUERL)`D~!X|z>W0G>c>J+;@#+W`nMiCdh(6IK&XtJ zT*MHLg%plJ?sC0TJazo`=5uG3U);0bYOxx+izes2^@|5fJdZ#A{Mov?hAaSGL!~m@ z-|>yK?1A5FS}t_08cegSAVv9FslQ*;AFiDHb;I^U*RvltX8JNg6hn>8M?d=68Thd_ z?|$94VeQtJ4ujyBb!x58 z_I=RWr%%y3PzMlXmZ8jqFa#13LPE%#+?$)++<7|Z?Dt0sGztjlTc6MU!{(mUmq<7;lb`@2EEKOik%{)*Jp)bt;OkcAw_ zt#dk^f3(}}oT{q)uYdjPL95kzWh3}yfZJ}l-@1R_!MoG#X^q!jSH10-|NK=90B-#L z-FXBU{ABh2djC1{w7YhNZ5Fux1^+`{AI(24Ncz!fU}tF^W41Q zjYwRc;di?`B9X|ciYb%WfB*T7U+MMw_`JE*ZOdPHH~Hmf-YV(u8+>xWWWAAJIFA#H zi$IesAX*93paYkd0wF&aQH~gU4j-5r)@!dHP`Jf3=AH3}7oXMKaKjC7I2_`tRjbNM zN=oKCozBYU=4N|QQPIavr}L@-_<@1JGShW8b80-A+f}penJ+f)JU(SgS!;ivyF4?~ z-t_ZZpDFJ=(|6y{a9|vqj;Z3@S%gbVxrj9m5!sJecB)~`{VeQ(r zc;t~s5DW&9laqsu8#m(3H{ZnExpPIA%Qf|zOd(#DW+MHZw2=!t;nphOE}p?XNIXlGSTTO6RL8c-7~J zI4=K^&MTn+V!d53mR5jp8~}ib5_;W($j{G*&1QquYDITfH#$3dK?nh*6k4s8ej|YL ziqbW5XKO-x#>$SY1U30~lkV$w`+q6gt@e?bsslM$`H58m(w? zd9h^4671Z$6N!Y3Q{E^n&N4jz-0yMh*fB(-(IZ#l@V)muoV#$rZOhI9OrBio;}cOi z*3$(kYYeh}{0pQmSq8yk0RXUA97Ll5{yC}_lSs#D7z)OZjuI~-n4F6@-g+DD?d|x} ztFJ*VoCagn0_@*^99y<*8J;z3R?U?F)YjBZX>4fz-8q2%K6jM!dG<%!TU7JpDo{ZL z0B}YN!fnk^V=)k(`&z?tzz^O!I!YV?bj8!LuBi`qJop$kwYXp`odH8>1y=1o3ZE~$ zZu#=%zAFJpvRS--e=uq9-dY_1&<7v7Cz>}V^HExVU}vCaryT9+1XL9|XFg*6y$CiP zgBpnfmnb=ys)7&#!i(pgrRYRt7$s1>8OaNO2<_b4k-Xq8K%)bdB$%epW2$QA+S)oU zdky^M)fId&7%l^)BBdl504M;g-}wIFlER!v^qox~__ur(^4HaZ>h!Qw&O)%|1Y*6N zV3Fu0hF=DF0fe6SWsWlm8AfU3kJbp$Q3RqjjQl4A`tha2D;O3&^x)IuFUR?4Buchy z`A3B-7`>ab*b*9z#(NF`09LPAacI)SaZj5Ey`OrwZNSiujgYd&z)(H~K~E>--oDEY zv&d1*cG{p^B5G99LR&W7+}_@G@AJ?7>1(5K;|+IDtUJ;2EGaA-%M?ZP=p)b09t8jZ z?|<-GN2)P1Y@2Z{qTL-B+_nLRqEhgAxo~a%6oI;0$iV=Zs*biU@L=&cm^xAmChG(^ zOcDfo@og7`z*ssNo&;9j#5f%+pzU2+qAwfo@tVlCv)-iIc|4kaH1ac=vkifUBT%CeNcJqqp#b9jJ<#UlL*yuUN-)l*#|8kGs+Y}`)x>kG z=H8VnSMON6c60qhzq~K>-rqjuJ3G3ITHCvy?Tg5ZtV`~sx`J^~LO}!?j=(al8pcUe zx&Duj&Kw1>?eo3bKwK6z{K#X$VuPuy65f3~;N80of-Mf<%0Bro8s#6ED2y^9Lrl z{LyD4rj&g1)C$PM9{BfeXGCWpYAgyON#M;^1Y(J#Q2^UF?6VNc>2P-L5(4v-888%= zA=cZ4XlEND-5m%v)PWKTAu}6-Ed_!l3HpL!_zvztthXC3orG?G6l0Tgn3Qh9uFj!L zP9@Wn8R%`SH+3n(BVo69UI_eHRxr`3<#-m^wW*s8drtB^7mPxfr7)HZMFCS)P(s-# z0A3JGjH#p71tH*cdg$_spvx-)lVybW9l+3*&k=|>LODDHFn}{9fp{Vq`eGwM7h=s( z33p6LM==+|Kis{5*#@f7To6EG&xR(;0exXH4SEMF1WOVWPrr)BLpz-|^E>lz`N4Jo z-qou%JlZiBe3;1zO{}{eMxCZ-l(T6WHZ#}i5}{sV)>49m*9}>Tfj|N^o4^zm+_*f@ zfp$cXpTR(Q72eyw11GX92*%@ZopFJ)rodQQ0j+Z^Kt}JHgi@GFC&PE-08A4r5k1|g z8V9?#IGmZk`Ta{z9V#syuL8h{#^zT&wGGn;x2~HDS9dHkC29RA0LB0{5*bNMxbSGP zSPZ_-lTas(1=UKRdL87NBOqy3s6sPnSVW?^4+BG9Y>}KGdI>Dm0OsySc>NhzCRf2+ zISYi2E>Cm?p5RvYeFl~LzR^? z_KgDQZtojT3=YSISRBNlzaW6z??SAn6C`2=Cnf(1fQdi%hv1SA>&ry2ks1=_=4 zQ&R!E7R;Uo#qEJ-|28P$5R$&LU{vPjw0aoEmBQ3{;@!f${NLSi=hFUbud5z46@GH> z?ac2F?Af*Jz!`@lbNIOz9t(~FkP~u%g(I>uFbHb1e${(Lfn3)JOL{)SToj5;52dXW z#A=4x+76nT4#iauAO;$<04;71PYA3k7sQbSE;|FNL5HDzyTNJouvAq8IKN>SCr*K{ zwLUL9J0o!2mz+N8czXV&bEv}>F$L(33 zWW%T;QL<+N$@ZDGwRQQpOc@0*b8dxKYcaK}o!wAe1Luu126fnv*q(!srdNQPOb`Y` zfXV<#1QA8hf?TM+0H`w?D#wA$m<%d-Jq={PVF0?U?wWCO@h2x#aT={P+VYIX_+x2_v0LC!Ab zoB|{S?ZTBGerC8T0IS8Yf#$bR0D3C@`fND}y>JVz6ChnP6XN7jP_uFLi%Aw3uek=6vT4vN5-bbm!(3brK{7z~ z3;`MqL|Fr2FbWU~v85k0ngEH*K;rxnEU~8{GSmy%d%oNd9l2yUCSSXEZ>?~}005Ab zY~HFL7}zAAZU+%~fL=h2QV0_YAdGcFEExx(vJ4T`k0=R)W@mtP^}#%U0kq|1ARGtD zlnkN(LXQvnEhiwhx&TETIfBVZL9qG!j-*M?M3{9HrGRy6C+MZS}<#>v$Lan>{S5(z_r)U+^!oKSfezxuu&iMj3IFJ zAOc4ZLWzWt7#cv|=8rIZst$B=3DlM|peH+#_HRqU8_gqIV_Y8Dtr!8dn4zhj4%5%? zfzj@S{);AX;1G@a5by5+z(y8$PQKtC@_pw-Lo>N5fZOj|qU4N8dy}iHA5sIsbI;Xy z9NvA~(ZA_qxIg<4uDTsam^GlODIj$xVKAg3^R5RVIdeyN!9ZjMR3m|^ICn%tv|4Dt zzYvC^VrUO^fVZWC|#s{#Ok$yLQQ=5X+1rRIpj!jZEf z00bViFc*Q&W+-|QlyJ~-2BdxOR;1nhLx`#AI9nnxSpk(*a0UZF=%_s(ltMFq4h%W@ zFnAaur%od7?t}km4LF?v%w#DzaiV$5rF`Ts)%f7kKZ-WiwJwjHYAp%K@(h|Y2GDDv zPaT6mTO)|U1e##b8IoaJavM0K@hdi1C;&n^a7Hu0QK*T;sCL5hkmk+?*(D-zZ~(!k zdiW0Sg_xWQE zl7y5w3t`ZwgVX80>b#;r9vpyZO9K%#00opt_$zuu(m+!^9p-E2Bi7#yL}LgX+6S7F zE-0KZdvI{*qU+#m0TwTtr{43cTXq%ZXFZW5NAJ}1_1~=N?Z35TjN`>rRX8JrRIqRa zEc(@hFU99Y!sCXvs2FM}48`pQNvId>hiF7-%gVsy1UO!R($Wm3D2VZz$`x<_U4JqE z$d%qw0>H`o(`56SU6%So%~Ot@>|Wtlm|dJX6`IQO^M|{PA+To~e7m+H?I#Z+bf6y5 z<~AhVvKV5P{i3!#Th_w2e7zw+Be|?w5k2gXMh2h(}9@Joh zY4$wG?m-Ayc4)_6`jP|yB!?4HW;S9h8g`gf-W(`}Isc z75i{?-1pH+MB7dwY0*+py#YdcD$Li-K3|eB26fm6rQZ!T92xadLpUDhiIspr;<>rm zYdG(K+ZT>aT=DkbFIX3SD*ynnV%dN14E}UY2d`xcE@6sabYIWECxauDK%H0BsCm?lqx1_PeQ-=Bz?`U`JYsdCo zYINgvMz-&YTF!KA8<&;;`Va10>a$slpEEgOYH4Z9xlq6SWqEf6^6xhCnvf}y2URzgJ(>SZ^bX#`7Jxr__wpdX~ zUd^pPS=p zdSTK85J`mE?`8r=PXWLaFaFE}VD-i9RZN-Gb?kWKp=dOgccJ#H$^(}xvMl3gH$83Z z>l?hu6N)|Q%isO$;z^C%E(B+;1$vT0sg5o@mVx< QLjV8(07*qoM6N<$f~@Ra7ytkO literal 0 HcmV?d00001 diff --git a/app/examples/Games/Concent/.lang/ca.po b/app/examples/Games/Concent/.lang/ca.po new file mode 100644 index 00000000..807ad63d --- /dev/null +++ b/app/examples/Games/Concent/.lang/ca.po @@ -0,0 +1,217 @@ +# Catalan translation of Concent +# Copyright (C) 2000-2010 Benoît Minisini. +# This file is distributed under the same license as the Concent package. +# Jordi Sayol , 2007-2010. +# +# +msgid "" +msgstr "" +"Project-Id-Version: Concent\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2011-03-20 17:26+0100\n" +"Last-Translator: Jordi Sayol \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: .project:1 +msgid "Concéntrese Geográfico" +msgstr "Concentri's Geogràfic" + +#: .project:2 +msgid "Esta versión incorpora soporte para el idioma inglés y español (nativo), disfrute este juego!, se han incorporado las correcciones sugeridas por el director del proyecto Gambas, el proyecto ha sido traducido al inglés usando la herramienta integrada de Gambas Ide" +msgstr "Esta versión incorpora soporte para el idioma inglés y español (nativo), disfrute este juego!, se han incorporado las correcciones sugeridas por el director del proyecto Gambas, el proyecto ha sido traducido al inglés usando la herramienta integrada de Gambas IdeAquesta versió incorpora suport per a l'idioma anglès i castellà (nadiu), gaudiu del joc! s'han incorporat les correccions suggerides pel director del projecte Gambas, el projecte s'ha traduït a l'anglès tot fent servir l'eina integrada a l'ide del Gambas" + +#: fotos.class:303 +msgid "" +"Estimados amigos, este formulario cumple la única función de\n" +" cargar en 40 botones, las imágenes de las caritas que servirán \n" +"para el juego, es posible que exista una mejor manera de \n" +"hacer esto, por eso... escucho sugerencias, posteriormente \n" +"en el código se crea un array de objetos a fin de referencialos \n" +"como botoncito[i].Picture y copiar este atributo en particular al \n" +"tablero de juego. Att: Jairo Alonso Badillo\n" +" jbadbe@gmail.com" +msgstr "" +"Benvolgut amic, aquest formulari té com a única funció \n" +"carregar en 40 botons les imatges de les cares que serviran \n" +"en el joc. És possible que hi hagi una manera millor de fer això, \n" +"per tant... escolto suggeriments. Posteriorment en el codi es \n" +"crea una matriu d'objectes per tal de referenciar-los com a \n" +"botoncito[i].Picture i copiar aquest atribut en particular al \n" +"tauler de joc. A: Jairo Alonso Badillo\n" +" jbadbe@gmail.com" + +#: frmAcerca.class:30 +msgid "" +"Concéntrese Geográfico v 0.3\n" +"\n" +"Programado para Gambas por:\n" +"Jairo Alonso Badillo Bedoya - jbadbe@gmail.com\n" +"Publicado bajo los términos de la licencia GPL\n" +"Viva Colombia!!!!!\n" +"Visite http://www.linuxeam.tk -Una comunidad Linux" +msgstr "" +"Concentris Geogràfic v 0.3\n" +"\n" +"Programat per a Gambas per:\n" +"Jairo Alonso Badillo Bedoya - jbadbe@gmail.com\n" +"Publicat sota els termes de la llicència GPL\n" +"Visca Colòmbia!!!!!\n" +"Visiteu http://www.linuxeam.tk -Una comunitat Linux" + +#: frmAcerca.class:36 +#: frmInstrucciones.class:43 +msgid "&Aceptar" +msgstr "&Accepta" + +#: frmInstrucciones.class:30 +msgid "COMO JUGAR CONCÉNTRESE?" +msgstr "COM JUGAR A CONCENTRIS?" + +#: frmInstrucciones.class:36 +msgid "" +"Se trata de un Juego Bastante sencillo: \n" +"\n" +"1.) El objetivo del juego es probar tu retentiva y nivel de concentración, para lo cual\n" +" debes encontrar los pares de rostros que hay ocultos en el tablero de\n" +" concéntrese. \n" +" \n" +"2.) El juego tiene tres niveles (Principiante, Medio, Experto), que te permite\n" +" escoger entre tres tamaños del tablero para añadir emoción y dificultad al juego,\n" +" para Acceder a estas opciones debes ingresar por el menu Configuración - Nivel,\n" +" y seleccionar uno de los tres preestablecidos. \n" +" \n" +"3). Así mismo, tienes la posibilidad de incrementar tus conocimientos al jugar en\n" +" Modo Pregunta, lo que incrementa tu nivel educativo, esto se logra mediante un\n" +" cuestionario emergente que deberás responder con cada acierto en el tablero, si\n" +" contestas correctamente tendrás un puntaje más alto y podrás competir con tus\n" +" amigos. (Esta función se encuentra en construcción debido a la migracion de\n" +" Visual Basic hacia Gambas, y experimentar el poder de Linux, viva el\n" +" OpenSource!!! \n" +" \n" +"4.) El juego también te permite activar o desactivar los sonidos de ambientación,\n" +" para lo cual debes cambiar el estado del menú Configuración - Sonido. \n" +" \n" +"5.) Recuerda: Para redistribuir el Tablero Pulsa F2 , para comenzar a jugar pulsa\n" +" F4, los rostros serán cargados aleatoriamente, por lo que no debes intentar\n" +" aprenderte el tablero de memoria...!, Esto sí que va a ser un verdadero reto!. \n" +" \n" +"6.) Estoy actualmente diseñando los modulos de aprendizaje que podrás conseguir\n" +" muy pronto; para comentarios y / o sugerencias escribe a: jbadbe@gmail.com.\n" +msgstr "" +"Es tracta d'un joc bastant senzill: \n" +"\n" +"\n" +"1.) L'objectiu del joc és posar a prova la teva retentiva i nivell de concentració,\n" +" així que has de trobar les parelles de rostres que hi ha amagats al tauler del\n" +" concentris. \n" +"\n" +"2.) El jo te tres nivells (Principiant, Mig, Expert), que et permet escollir\n" +" entre tres mides de tauler per posar més emoció i dificultat al joc.\n" +" Per accedir a aquestes opcions has d'entrar al menú Configuració - Nivell,\n" +" i seleccionar-ne un dels tres preestablerts. \n" +"\n" +" \n" +"3). Així mateix, tens la possibilitat d'incrementar els teus coneixements al jugar\n" +" en Mode Pregunta, cosa que incrementa el teu nivell educatiu, això s'aconsegueix\n" +" per mitjà d'un qüestionari emergent que hauràs de respondre amb un encert\n" +" en el tauler, si respons correctament tindràs una puntuació més alta i podràs\n" +" competir amb els teus amics. (Aquesta funció es troba en construcció degut\n" +" a la migració de Visual Basic a Gambas, i experimentar el poder de Linux.\n" +" Visca el Codi Obert!!! \n" +" \n" +"4.) El joc també et permet activar o desactivar els sons d'ambient, i que per\n" +" fer-ho has de canviar l'estat del menú Configuració -So. \n" +" \n" +"5.) Recordeu: Per a tornar a distribuir el tauler premeu F2, per començar a jugar\n" +" premeu F4, els rostres es carregaran aleatòriament, per tant no heu de provar\n" +" d'aprendre-vos el tauler de memòria...! Això sí que serà un autèntic repte! \n" +" \n" +"6.) Actualment estic dissenyant els mòduls d'aprenentatge que podreu aconseguir\n" +" molt aviat; per a comentaris i / o suggeriments escriviu a: jbadbe@gmail.com.\n" + +#: principal.class:166 +msgid "Jugada Errada" +msgstr "Jugada Errada" + +#: principal.class:202 +msgid "Felicitaciones, has cumplido la mision" +msgstr "Felicitats, has acomplert la missió" + +#: principal.class:247 +msgid "PULSE F2 PARA REPARTIR DE NUEVO" +msgstr "PREMEU F2 PER A TORNAR A REPARTIR" + +#: principal.class:384 +msgid "PULSE F4 PARA COMENZAR LA MISION" +msgstr "PREMEU F4 PER A COMENÇAR LA MISSIÓ" + +#: principal.class:439 +msgid "Enjoy Open Source!" +msgstr "Gaudiu del Codi Obert!" + +#: principal.class:444 +msgid "&Configuración" +msgstr "&Configuració" + +#: principal.class:447 +msgid "&Nuevo Juego" +msgstr "&Joc nou" + +#: principal.class:452 +msgid "&Mejores Puntajes" +msgstr "&Millors puntuacions" + +#: principal.class:458 +msgid "Nivel" +msgstr "Nivell" + +#: principal.class:462 +msgid "&Principiante" +msgstr "&Principiant" + +#: principal.class:470 +msgid "M&edio" +msgstr "M&ig" + +#: principal.class:477 +msgid "E&xperto" +msgstr "E&xpert" + +#: principal.class:484 +msgid "&Sonido" +msgstr "&So" + +#: principal.class:494 +msgid "&Salir" +msgstr "S&urt" + +#: principal.class:499 +msgid "&Ayuda" +msgstr "&Ajuda" + +#: principal.class:502 +msgid "A&cerca de" +msgstr "&Quant a" + +#: principal.class:506 +msgid "&Instrucciones" +msgstr "&Instruccions" + +#: principal.class:645 +msgid "Jugadas: " +msgstr "Jugades:" + +#: principal.class:653 +msgid "Tiempo: " +msgstr "Temps:" + +#: principal.class:677 +msgid "0" +msgstr "-" + diff --git a/app/examples/Games/Concent/.lang/cs.po b/app/examples/Games/Concent/.lang/cs.po new file mode 100644 index 00000000..ba617c89 --- /dev/null +++ b/app/examples/Games/Concent/.lang/cs.po @@ -0,0 +1,224 @@ +# #-#-#-#-# fotos.pot (PACKAGE VERSION) #-#-#-#-# +# /home/jbadbe/concent/fotos.class +# Generated by Gambas compiler +# FIRST AUTHOR , YEAR. +# +# #-#-#-#-# frmAcerca.pot (PACKAGE VERSION) #-#-#-#-# +# /home/jbadbe/concent/frmAcerca.class +# Generated by Gambas compiler +# FIRST AUTHOR , YEAR. +# +# #-#-#-#-# frmInstrucciones.pot (PACKAGE VERSION) #-#-#-#-# +# /home/jbadbe/concent/frmInstrucciones.class +# Generated by Gambas compiler +# FIRST AUTHOR , YEAR. +# +# #-#-#-#-# funciones.pot (PACKAGE VERSION) #-#-#-#-# +# /home/jbadbe/concent/funciones.module +# Generated by Gambas compiler +# FIRST AUTHOR , YEAR. +# +# #-#-#-#-# principal.pot (PACKAGE VERSION) #-#-#-#-# +# /home/jbadbe/concent/principal.class +# Generated by Gambas compiler +# FIRST AUTHOR , YEAR. +# +# #-#-#-#-# #project.pot (PACKAGE VERSION) #-#-#-#-# +# /home/jbadbe/concent_gb/.project +# Generated by Gambas compiler +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2011-04-19 15:59+0100\n" +"Last-Translator: geniv \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Concéntrese Geográfico" +msgstr "Geografické zaměření" + +#: .project:2 +msgid "Esta versión incorpora soporte para el idioma inglés y español (nativo), disfrute este juego!, se han incorporado las correcciones sugeridas por el director del proyecto Gambas, el proyecto ha sido traducido al inglés usando la herramienta integrada de Gambas Ide" +msgstr "Tis verze obsahuje anglickou a španělskou verzi, užíjte si tuto hru, byly dokončeny opravy a navržené provedené Gambas vývojové skupiny (Benoit Missini)." + +#: fotos.form:292 +msgid "" +"Estimados amigos, este formulario cumple la única función de\n" +" cargar en 40 botones, las imágenes de las caritas que servirán \n" +"para el juego, es posible que exista una mejor manera de \n" +"hacer esto, por eso... escucho sugerencias, posteriormente \n" +"en el código se crea un array de objetos a fin de referencialos \n" +"como botoncito[i].Picture y copiar este atributo en particular al \n" +"tablero de juego. Att: Jairo Alonso Badillo\n" +" jbadbe@gmail.com" +msgstr "" +"Tento formulář splňuje s jedinečnou funkcí \n" +" zatížení 40 tlačítek s obrázky pro hru \n" +", může být řešena jinou metodou, ale nevím jakou." + +#: frmAcerca.form:14 +msgid "" +"Concéntrese Geográfico v 0.3\n" +"\n" +"Programado para Gambas por:\n" +"Jairo Alonso Badillo Bedoya - jbadbe@gmail.com\n" +"Publicado bajo los términos de la licencia GPL\n" +"Viva Colombia!!!!!\n" +"Visite http://www.linuxeam.tk -Una comunidad Linux" +msgstr "" +"Geografické zaměření v 0.3\n" +"\n" +"Napsáno pro Grambas od:\n" +"Jairo Alonso Badillo Bedoya-jbadbe@gmail.com\n" +"Publikováno pod licencí GPL\n" +"Žiji v Kolumbii!!!!!!\n" +"Prosím navštivte http://www.linuxeam.tk - Linuxovou komunitu" + +#: frmAcerca.form:20 frmInstrucciones.form:28 +msgid "&Aceptar" +msgstr "&OK" + +#: frmInstrucciones.form:15 +msgid "COMO JUGAR CONCÉNTRESE?" +msgstr "Jak hrát tuto hru?" + +#: frmInstrucciones.form:21 +msgid "" +"Se trata de un Juego Bastante sencillo: \n" +"\n" +"1.) El objetivo del juego es probar tu retentiva y nivel de concentración, para lo cual\n" +" debes encontrar los pares de rostros que hay ocultos en el tablero de\n" +" concéntrese. \n" +" \n" +"2.) El juego tiene tres niveles (Principiante, Medio, Experto), que te permite\n" +" escoger entre tres tamaños del tablero para añadir emoción y dificultad al juego,\n" +" para Acceder a estas opciones debes ingresar por el menu Configuración - Nivel,\n" +" y seleccionar uno de los tres preestablecidos. \n" +" \n" +"3). Así mismo, tienes la posibilidad de incrementar tus conocimientos al jugar en\n" +" Modo Pregunta, lo que incrementa tu nivel educativo, esto se logra mediante un\n" +" cuestionario emergente que deberás responder con cada acierto en el tablero, si\n" +" contestas correctamente tendrás un puntaje más alto y podrás competir con tus\n" +" amigos. (Esta función se encuentra en construcción debido a la migracion de\n" +" Visual Basic hacia Gambas, y experimentar el poder de Linux, viva el\n" +" OpenSource!!! \n" +" \n" +"4.) El juego también te permite activar o desactivar los sonidos de ambientación,\n" +" para lo cual debes cambiar el estado del menú Configuración - Sonido. \n" +" \n" +"5.) Recuerda: Para redistribuir el Tablero Pulsa F2 , para comenzar a jugar pulsa\n" +" F4, los rostros serán cargados aleatoriamente, por lo que no debes intentar\n" +" aprenderte el tablero de memoria...!, Esto sí que va a ser un verdadero reto!. \n" +" \n" +"6.) Estoy actualmente diseñando los modulos de aprendizaje que podrás conseguir\n" +" muy pronto; para comentarios y / o sugerencias escribe a: jbadbe@gmail.com.\n" +msgstr "" +"Tato hra je velmi jednoduchá: \n" +"\n" +"\n" +"1.) Cílem hry je najít tváře pod každým tlačítkem, tváře mají duplikáty, \n" +" v pohybu máte najít dvě stejné tváře. \n" +"\n" +"2.) Můžete si vybrat obtížnost úroveňě v konfiguračním menu, v každé úrovni hrací desky\n" +"více tlačítek, užíjte si tuto hru!\n" +"\n" +"3). Vlastně jsem rozvoje zeptat modul, tento modul umožní spravovat řadu věci\n" +" ve hře, přírustek vaších bodů. \n" +"\n" +" 4.) můžete aktivovat nebo deaktivovat zvuky v konfiguračním menu \n" +" (Konfigurace - zvuky). \n" +"\n" +" 5) Pamatujte:. pro start mise stiskněte klávesu F4, chcete-li distribuovat desku stiskněte klávesu F2 \n" +"v každém okamžiku, bude hra obnovovat. tváře jsou zatížení náhodným režimem, je \n" +"nemožné zapamatovat si hrací desku ...!!!! \n" +"\n" +" 6.) Pro připomínky se dotazy, se mě prosím napište mi na jbadbe@gmail.com, prosím omluvte \n" +" mou angličtinu, jsem Kolumbijec a já nemluvím anglicky. \n" +"\n" + +#: principal.class:166 +msgid "Jugada Errada" +msgstr "Špatný tah!" + +#: principal.class:202 +msgid "Felicitaciones, has cumplido la mision" +msgstr "Gratulujeme, mise byla splněna." + +#: principal.class:247 +msgid "PULSE F2 PARA REPARTIR DE NUEVO" +msgstr "Stiskněte F2 začnete hru znovu" + +#: principal.form:45 +msgid "Enjoy Open Source!" +msgstr "Užijte si Open Source" + +#: principal.form:50 +msgid "&Configuración" +msgstr "&Konfigurace" + +#: principal.form:53 +msgid "&Nuevo Juego" +msgstr "&Nová hra" + +#: principal.form:58 +msgid "&Mejores Puntajes" +msgstr "&Nejlepší skóre" + +#: principal.form:64 +msgid "Nivel" +msgstr "Úroveň" + +#: principal.form:68 +msgid "&Principiante" +msgstr "&Začítečník" + +#: principal.form:76 +msgid "M&edio" +msgstr "&Střední" + +#: principal.form:83 +msgid "E&xperto" +msgstr "E&xpert" + +#: principal.form:90 +msgid "&Sonido" +msgstr "&Zvuk" + +#: principal.form:100 +msgid "&Salir" +msgstr "&Ukončit" + +#: principal.form:105 +msgid "&Ayuda" +msgstr "&Nápověda" + +#: principal.form:108 +msgid "A&cerca de" +msgstr "&O této Hře" + +#: principal.form:112 +msgid "&Instrucciones" +msgstr "&Pokyny" + +#: principal.form:251 +msgid "Jugadas: " +msgstr "Pohyby" + +#: principal.form:259 +msgid "Tiempo: " +msgstr "Čas:" + +#: principal.form:268 +msgid "PULSE F4 PARA COMENZAR LA MISION" +msgstr "Stiskněte F4 pro start mise" + +#: principal.form:283 +msgid "0" +msgstr "0" diff --git a/app/examples/Games/Concent/.lang/de.po b/app/examples/Games/Concent/.lang/de.po new file mode 100644 index 00000000..62bf2ce3 --- /dev/null +++ b/app/examples/Games/Concent/.lang/de.po @@ -0,0 +1,168 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Concéntrese Geográfico" +msgstr "Memory" + +#: .project:2 +msgid "Esta versión incorpora soporte para el idioma inglés y español (nativo), disfrute este juego!, se han incorporado las correcciones sugeridas por el director del proyecto Gambas, el proyecto ha sido traducido al inglés usando la herramienta integrada de Gambas Ide" +msgstr "-" + +#: fotos.form:292 +msgid "" +"Estimados amigos, este formulario cumple la única función de\n" +" cargar en 40 botones, las imágenes de las caritas que servirán \n" +"para el juego, es posible que exista una mejor manera de \n" +"hacer esto, por eso... escucho sugerencias, posteriormente \n" +"en el código se crea un array de objetos a fin de referencialos \n" +"como botoncito[i].Picture y copiar este atributo en particular al \n" +"tablero de juego. Att: Jairo Alonso Badillo\n" +" jbadbe@gmail.com" +msgstr "-" + +#: frmAcerca.form:14 +msgid "" +"Concéntrese Geográfico v 0.3\n" +"\n" +"Programado para Gambas por:\n" +"Jairo Alonso Badillo Bedoya - jbadbe@gmail.com\n" +"Publicado bajo los términos de la licencia GPL\n" +"Viva Colombia!!!!!\n" +"Visite http://www.linuxeam.tk -Una comunidad Linux" +msgstr "" +"Memory v 0.3\n" +"\n" +"Für Gambas programmiert von:\n" +"Jairo Alonso Badillo Bedoya - jbadbe@gmail.com\n" +"Veröffentlicht unter der GPL-Lizenz" + +#: frmAcerca.form:20 frmInstrucciones.form:28 +msgid "&Aceptar" +msgstr "&Ok" + +#: frmInstrucciones.form:15 +msgid "COMO JUGAR CONCÉNTRESE?" +msgstr "WIE SPIELT MAN MEMORY?" + +#: frmInstrucciones.form:21 +msgid "" +"Se trata de un Juego Bastante sencillo: \n" +"\n" +"1.) El objetivo del juego es probar tu retentiva y nivel de concentración, para lo cual\n" +" debes encontrar los pares de rostros que hay ocultos en el tablero de\n" +" concéntrese. \n" +" \n" +"2.) El juego tiene tres niveles (Principiante, Medio, Experto), que te permite\n" +" escoger entre tres tamaños del tablero para añadir emoción y dificultad al juego,\n" +" para Acceder a estas opciones debes ingresar por el menu Configuración - Nivel,\n" +" y seleccionar uno de los tres preestablecidos. \n" +" \n" +"3). Así mismo, tienes la posibilidad de incrementar tus conocimientos al jugar en\n" +" Modo Pregunta, lo que incrementa tu nivel educativo, esto se logra mediante un\n" +" cuestionario emergente que deberás responder con cada acierto en el tablero, si\n" +" contestas correctamente tendrás un puntaje más alto y podrás competir con tus\n" +" amigos. (Esta función se encuentra en construcción debido a la migracion de\n" +" Visual Basic hacia Gambas, y experimentar el poder de Linux, viva el\n" +" OpenSource!!! \n" +" \n" +"4.) El juego también te permite activar o desactivar los sonidos de ambientación,\n" +" para lo cual debes cambiar el estado del menú Configuración - Sonido. \n" +" \n" +"5.) Recuerda: Para redistribuir el Tablero Pulsa F2 , para comenzar a jugar pulsa\n" +" F4, los rostros serán cargados aleatoriamente, por lo que no debes intentar\n" +" aprenderte el tablero de memoria...!, Esto sí que va a ser un verdadero reto!. \n" +" \n" +"6.) Estoy actualmente diseñando los modulos de aprendizaje que podrás conseguir\n" +" muy pronto; para comentarios y / o sugerencias escribe a: jbadbe@gmail.com.\n" +msgstr "" + +#: principal.class:166 +msgid "Jugada Errada" +msgstr "Falscher Zug" + +#: principal.class:202 +msgid "Felicitaciones, has cumplido la mision" +msgstr "Glückwunsch, du hast die Mission vollendet." + +#: principal.class:247 +msgid "PULSE F2 PARA REPARTIR DE NUEVO" +msgstr "F2 FÜR NEUSTART" + +#: principal.form:45 +msgid "Enjoy Open Source!" +msgstr "Genieße Open Source!" + +#: principal.form:50 +msgid "&Configuración" +msgstr "&Einstellungen" + +#: principal.form:53 +msgid "&Nuevo Juego" +msgstr "&Neues Spiel" + +#: principal.form:58 +msgid "&Mejores Puntajes" +msgstr "&Beste Ergebnisse" + +#: principal.form:64 +msgid "Nivel" +msgstr "Niveau" + +#: principal.form:68 +msgid "&Principiante" +msgstr "&Anfänger" + +#: principal.form:76 +msgid "M&edio" +msgstr "&Mittel" + +#: principal.form:83 +msgid "E&xperto" +msgstr "E&xperte" + +#: principal.form:90 +msgid "&Sonido" +msgstr "&Sound" + +#: principal.form:100 +msgid "&Salir" +msgstr "&Beenden" + +#: principal.form:105 +msgid "&Ayuda" +msgstr "&Hilfe" + +#: principal.form:108 +msgid "A&cerca de" +msgstr "&Über..." + +#: principal.form:112 +msgid "&Instrucciones" +msgstr "&Anweisungen" + +#: principal.form:251 +msgid "Jugadas: " +msgstr "Züge:" + +#: principal.form:259 +msgid "Tiempo: " +msgstr "Zeit:" + +#: principal.form:268 +msgid "PULSE F4 PARA COMENZAR LA MISION" +msgstr "F4 ZUM START DER MISSION" + +#: principal.form:283 +msgid "0" +msgstr "-" diff --git a/app/examples/Games/Concent/.lang/en.po b/app/examples/Games/Concent/.lang/en.po new file mode 100644 index 00000000..a68ad871 --- /dev/null +++ b/app/examples/Games/Concent/.lang/en.po @@ -0,0 +1,226 @@ +# #-#-#-#-# fotos.pot (PACKAGE VERSION) #-#-#-#-# +# /home/jbadbe/concent/fotos.class +# Generated by Gambas compiler +# FIRST AUTHOR , YEAR. +# +# #-#-#-#-# frmAcerca.pot (PACKAGE VERSION) #-#-#-#-# +# /home/jbadbe/concent/frmAcerca.class +# Generated by Gambas compiler +# FIRST AUTHOR , YEAR. +# +# #-#-#-#-# frmInstrucciones.pot (PACKAGE VERSION) #-#-#-#-# +# /home/jbadbe/concent/frmInstrucciones.class +# Generated by Gambas compiler +# FIRST AUTHOR , YEAR. +# +# #-#-#-#-# funciones.pot (PACKAGE VERSION) #-#-#-#-# +# /home/jbadbe/concent/funciones.module +# Generated by Gambas compiler +# FIRST AUTHOR , YEAR. +# +# #-#-#-#-# principal.pot (PACKAGE VERSION) #-#-#-#-# +# /home/jbadbe/concent/principal.class +# Generated by Gambas compiler +# FIRST AUTHOR , YEAR. +# +# #-#-#-#-# #project.pot (PACKAGE VERSION) #-#-#-#-# +# /home/jbadbe/concent_gb/.project +# Generated by Gambas compiler +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Concéntrese Geográfico" +msgstr "Geografic Concent" + +#: .project:2 +msgid "Esta versión incorpora soporte para el idioma inglés y español (nativo), disfrute este juego!, se han incorporado las correcciones sugeridas por el director del proyecto Gambas, el proyecto ha sido traducido al inglés usando la herramienta integrada de Gambas Ide" +msgstr "Ths version incorporate the english and spanish support, enjoy this game, the corrections and sugerences made by gambas development group (Benoit Missini) are finished." + +#: fotos.form:292 +msgid "" +"Estimados amigos, este formulario cumple la única función de\n" +" cargar en 40 botones, las imágenes de las caritas que servirán \n" +"para el juego, es posible que exista una mejor manera de \n" +"hacer esto, por eso... escucho sugerencias, posteriormente \n" +"en el código se crea un array de objetos a fin de referencialos \n" +"como botoncito[i].Picture y copiar este atributo en particular al \n" +"tablero de juego. Att: Jairo Alonso Badillo\n" +" jbadbe@gmail.com" +msgstr "" +"This form cumplies with the unique function of \n" +" load 40 buttons with images for the game\n" +", may it would can be resolved with other method, but I know not it." + +#: frmAcerca.form:14 +msgid "" +"Concéntrese Geográfico v 0.3\n" +"\n" +"Programado para Gambas por:\n" +"Jairo Alonso Badillo Bedoya - jbadbe@gmail.com\n" +"Publicado bajo los términos de la licencia GPL\n" +"Viva Colombia!!!!!\n" +"Visite http://www.linuxeam.tk -Una comunidad Linux" +msgstr "" +"Geografic Concent v 0.3\n" +"\n" +"Writed for Gambas by:\n" +"Jairo Alonso Badillo Bedoya-jbadbe@gmail.com\n" +"Published under GPL terms license\n" +"Live Colombia!!!!!!\n" +"Please visit http://www.linuxeam.tk - A Linux comunity" + +#: frmAcerca.form:20 frmInstrucciones.form:28 +msgid "&Aceptar" +msgstr "&Ok" + +#: frmInstrucciones.form:15 +msgid "COMO JUGAR CONCÉNTRESE?" +msgstr "HOW TO PLAY THIS GAME?" + +#: frmInstrucciones.form:21 +#, fuzzy +msgid "" +"Se trata de un Juego Bastante sencillo: \n" +"\n" +"1.) El objetivo del juego es probar tu retentiva y nivel de concentración, para lo cual\n" +" debes encontrar los pares de rostros que hay ocultos en el tablero de\n" +" concéntrese. \n" +" \n" +"2.) El juego tiene tres niveles (Principiante, Medio, Experto), que te permite\n" +" escoger entre tres tamaños del tablero para añadir emoción y dificultad al juego,\n" +" para Acceder a estas opciones debes ingresar por el menu Configuración - Nivel,\n" +" y seleccionar uno de los tres preestablecidos. \n" +" \n" +"3). Así mismo, tienes la posibilidad de incrementar tus conocimientos al jugar en\n" +" Modo Pregunta, lo que incrementa tu nivel educativo, esto se logra mediante un\n" +" cuestionario emergente que deberás responder con cada acierto en el tablero, si\n" +" contestas correctamente tendrás un puntaje más alto y podrás competir con tus\n" +" amigos. (Esta función se encuentra en construcción debido a la migracion de\n" +" Visual Basic hacia Gambas, y experimentar el poder de Linux, viva el\n" +" OpenSource!!! \n" +" \n" +"4.) El juego también te permite activar o desactivar los sonidos de ambientación,\n" +" para lo cual debes cambiar el estado del menú Configuración - Sonido. \n" +" \n" +"5.) Recuerda: Para redistribuir el Tablero Pulsa F2 , para comenzar a jugar pulsa\n" +" F4, los rostros serán cargados aleatoriamente, por lo que no debes intentar\n" +" aprenderte el tablero de memoria...!, Esto sí que va a ser un verdadero reto!. \n" +" \n" +"6.) Estoy actualmente diseñando los modulos de aprendizaje que podrás conseguir\n" +" muy pronto; para comentarios y / o sugerencias escribe a: jbadbe@gmail.com.\n" +msgstr "" +"This Game is very easy:\n" +"\n" +"\n" +"1.) The Game Objetive is find the faces under each button, the faces have duplicates,\n" +" in a movement you have find two equal faces.\n" +"\n" +" 2.) You can choose the dificult level in the config menu, in each level the board have\n" +" more buttons, enjoy this game!\n" +"\n" +" 3). Actually I am development the ask module, this module permit answer many asks\n" +" in the game for increment your points.\n" +"\n" +" 4.) You can activate or desactivate the sounds in the configuration menu\n" +" (Configuration - Sound).\n" +"\n" +" 5.) Remember: for init a mision press F4, if you want redistribute the board press F2\n" +" in any moment, the game will go to reset. The faces are load in rand mode, Is \n" +" imposible remember the board...!!!!\n" +"\n" +" 6.) For comments and ask, plese write me to jbadbe@gmail.com, please excuseme \n" +" for my English, I am Colombiano and I dont speak english.\n" +"\n" + +#: principal.class:166 +msgid "Jugada Errada" +msgstr "Bad move!" + +#: principal.class:202 +msgid "Felicitaciones, has cumplido la mision" +msgstr "Congratulations, the mission has been accomplished." + +#: principal.class:247 +msgid "PULSE F2 PARA REPARTIR DE NUEVO" +msgstr "PRESS F2 TO PLAY AGAIN" + +#: principal.form:45 +msgid "Enjoy Open Source!" +msgstr "Enjoy Open Source" + +#: principal.form:50 +msgid "&Configuración" +msgstr "&Configuration" + +#: principal.form:53 +msgid "&Nuevo Juego" +msgstr "&New Game" + +#: principal.form:58 +msgid "&Mejores Puntajes" +msgstr "&Best Scores" + +#: principal.form:64 +msgid "Nivel" +msgstr "Level" + +#: principal.form:68 +msgid "&Principiante" +msgstr "&Beginner" + +#: principal.form:76 +msgid "M&edio" +msgstr "M&edium" + +#: principal.form:83 +msgid "E&xperto" +msgstr "E&xpert" + +#: principal.form:90 +msgid "&Sonido" +msgstr "&Sound" + +#: principal.form:100 +msgid "&Salir" +msgstr "&Exit" + +#: principal.form:105 +msgid "&Ayuda" +msgstr "&Help" + +#: principal.form:108 +msgid "A&cerca de" +msgstr "&About this Game" + +#: principal.form:112 +msgid "&Instrucciones" +msgstr "&Instructions" + +#: principal.form:251 +msgid "Jugadas: " +msgstr "Movements" + +#: principal.form:259 +msgid "Tiempo: " +msgstr "Time:" + +#: principal.form:268 +msgid "PULSE F4 PARA COMENZAR LA MISION" +msgstr "PRESS F4 TO START THE MISSION" + +#: principal.form:283 +msgid "0" +msgstr "0" diff --git a/app/examples/Games/Concent/.lang/es.po b/app/examples/Games/Concent/.lang/es.po new file mode 100644 index 00000000..f6c79229 --- /dev/null +++ b/app/examples/Games/Concent/.lang/es.po @@ -0,0 +1,120 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: principal.class:694 +msgid "0" +msgstr "0" + +#: frmAcerca.class:37 frmInstrucciones.class:40 +msgid "&Aceptar" +msgstr "&Aceptar" + +#: principal.class:503 +msgid "A&cerca de" +msgstr "A&cerca de" + +#: principal.class:500 +msgid "&Ayuda" +msgstr "&Ayuda" + +#: frmInstrucciones.class:30 +msgid "COMO JUGAR CONCÉNTRESE?" +msgstr "¿CÓMO JUGAR CONCÉNTRESE?" + +#: .project:1 +msgid "Concéntrese Geográfico" +msgstr "Concéntrese Geográfico" + +#: frmAcerca.class:31 +msgid "Concéntrese Geográfico v 0.3\n\nProgramado para Gambas por:\nJairo Alonso Badillo Bedoya - jbadbe@gmail.com\nPublicado bajo los términos de la licencia GPL\nViva Colombia!!!!!\nVisite http://www.linuxeam.tk -Una comunidad Linux" +msgstr "Concéntrese Geográfico v 0.3\n\nProgramado para Gambas por:\nJairo Alonso Badillo Bedoya - jbadbe@gmail.com\nPublicado bajo los términos de la licencia GPL\nViva Colombia!!!!!\nVisite http://www.linuxeam.tk -Una comunidad Linux" + +#: principal.class:444 +msgid "&Configuración" +msgstr "&Configuración" + +#: principal.class:439 +msgid "Enjoy Open Source!" +msgstr "¡Disfrute del Código Abierto!" + +#: .project:2 +msgid "Esta versión incorpora soporte para el idioma inglés y español (nativo), disfrute este juego!, se han incorporado las correcciones sugeridas por el director del proyecto Gambas, el proyecto ha sido traducido al inglés usando la herramienta integrada de Gambas Ide" +msgstr "Esta versión incorpora soporte para el idioma inglés y español (nativo), disfrute este juego!, se han incorporado las correcciones sugeridas por el director del proyecto Gambas, el proyecto ha sido traducido al inglés usando la herramienta integrada de Gam" + +#: fotos.class:304 +msgid "Estimados amigos, este formulario cumple la única función de\n cargar en 40 botones, las imágenes de las caritas que servirán \npara el juego, es posible que exista una mejor manera de \nhacer esto, por eso... escucho sugerencias, posteriormente \nen el código se crea un array de objetos a fin de referencialos \ncomo botoncito[i].Picture y copiar este atributo en particular al \ntablero de juego. Att: Jairo Alonso Badillo\n jbadbe@gmail.com" +msgstr "Estimados amigos, este formulario cumple la única función de\n cargar en 40 botones, las imágenes de las caritas que servirán \npara el juego, es posible que exista una mejor manera de \nhacer esto, por eso... escucho sugerencias, posteriormente \nen el código se crea un array de objetos a fin de referencialos \ncomo botoncito[i].Picture y copiar este atributo en particular al \ntablero de juego. Att: Jairo Alonso Badillo\n jbadbe@gmail.com" + +#: principal.class:477 +msgid "E&xperto" +msgstr "E&xperto" + +#: principal.class:202 +msgid "Felicitaciones, has cumplido la mision" +msgstr "Felicitaciones, has cumplido la mision" + +#: principal.class:507 +msgid "&Instrucciones" +msgstr "&Instrucciones" + +#: principal.class:166 +msgid "Jugada Errada" +msgstr "Jugada Errada" + +#: principal.class:663 +msgid "Jugadas: " +msgstr "Jugadas: " + +#: principal.class:470 +msgid "M&edio" +msgstr "M&edio" + +#: principal.class:452 +msgid "&Mejores Puntajes" +msgstr "&Mejores Puntajes" + +#: principal.class:458 +msgid "Nivel" +msgstr "Nivel" + +#: principal.class:447 +msgid "&Nuevo Juego" +msgstr "&Nuevo Juego" + +#: principal.class:462 +msgid "&Principiante" +msgstr "&Principiante" + +#: principal.class:247 +msgid "PULSE F2 PARA REPARTIR DE NUEVO" +msgstr "PULSE F2 PARA REPARTIR DE NUEVO" + +#: principal.class:384 +msgid "PULSE F4 PARA COMENZAR LA MISION" +msgstr "PULSE F4 PARA COMENZAR LA MISION" + +#: principal.class:495 +msgid "&Salir" +msgstr "&Salir" + +#: frmInstrucciones.class:35 +msgid "Se trata de un Juego Bastante sencillo: \n\n\n1.) El objetivo del juego es probar tu retentiva y nivel de concentración, para lo cual\n debes encontrar los pares de rostros que hay ocultos en el tablero de\n concéntrese. \n \n2.) El juego tiene tres niveles (Principiante, Medio, Experto), que te permite\n escoger entre tres tamaños del tablero para añadir emoción y dificultad al juego,\n para Acceder a estas opciones debes ingresar por el menu Configuración - Nivel,\n y seleccionar uno de los tres preestablecidos. \n\n \n3). Así mismo, tienes la posibilidad de incrementar tus conocimientos al jugar en\n Modo Pregunta, lo que incrementa tu nivel educativo, esto se logra mediante un\n cuestionario emergente que deberás responder con cada acierto en el tablero, si\n contestas correctamente tendrás un puntaje más alto y podrás competir con tus\n amigos. (Esta función se encuentra en construcción debido a la migracion de\n Visual Basic hacia Gambas, y experimentar el poder de Linux, viva el\n OpenSource!!! \n \n4.) El juego también te permite activar o desactivar los sonidos de ambientación,\n para lo cual debes cambiar el estado del menú Configuración - Sonido. \n \n5.) Recuerda: Para redistribuir el Tablero Pulsa F2 , para comenzar a jugar pulsa\n F4, los rostros serán cargados aleatoriamente, por lo que no debes intentar\n aprenderte el tablero de memoria...!, Esto sí que va a ser un verdadero reto!. \n \n6.) Estoy actualmente diseñando los modulos de aprendizaje que podrás conseguir\n muy pronto; para comentarios y / o sugerencias escribe a: jbadbe@gmail.com.\n" +msgstr "Se trata de un Juego Bastante sencillo: \n\n\n1.) El objetivo del juego es probar tu retentiva y nivel de concentración, para lo cual\n debes encontrar los pares de rostros que hay ocultos en el tablero de\n concéntrese. \n \n2.) El juego tiene tres niveles (Principiante, Medio, Experto), que te permite\n escoger entre tres tamaños del tablero para añadir emoción y dificultad al juego,\n para Acceder a estas opciones debes ingresar por el menu Configuración - Nivel,\n y seleccionar uno de los tres preestablecidos. \n\n \n3). Así mismo, tienes la posibilidad de incrementar tus conocimientos al jugar en\n Modo Pregunta, lo que incrementa tu nivel educativo, esto se logra mediante un\n cuestionario emergente que deberás responder con cada acierto en el tablero, si\n contestas correctamente tendrás un puntaje más alto y podrás competir con tus\n amigos. (Esta función se encuentra en construcción debido a la migracion de\n Visual Basic hacia Gambas, y experimentar el poder de Linux, viva el\n OpenSource!!! \n \n4.) El juego también te permite activar o desactivar los sonidos de ambientación,\n para lo cual debes cambiar el estado del menú Configuración - Sonido. \n \n5.) Recuerda: Para redistribuir el Tablero Pulsa F2 , para comenzar a jugar pulsa\n F4, los rostros serán cargados aleatoriamente, por lo que no debes intentar\n aprenderte el tablero de memoria...!, Esto sí que va a ser un verdadero reto!. \n \n6.) Estoy actualmente diseñando los modulos de aprendizaje que podrás conseguir\n muy pronto; para comentarios y / o sugerencias escribe a: jbadbe@gmail.com.\n" + +#: principal.class:484 +msgid "&Sonido" +msgstr "&Sonido" + +#: principal.class:671 +msgid "Tiempo: " +msgstr "Tiempo: " + diff --git a/app/examples/Games/Concent/.lang/fr.po b/app/examples/Games/Concent/.lang/fr.po new file mode 100644 index 00000000..6dbc7e7f --- /dev/null +++ b/app/examples/Games/Concent/.lang/fr.po @@ -0,0 +1,164 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: fotos.class:303 +msgid "" +"Estimados amigos, este formulario cumple la única función de\n" +" cargar en 40 botones, las imágenes de las caritas que servirán \n" +"para el juego, es posible que exista una mejor manera de \n" +"hacer esto, por eso... escucho sugerencias, posteriormente \n" +"en el código se crea un array de objetos a fin de referencialos \n" +"como botoncito[i].Picture y copiar este atributo en particular al \n" +"tablero de juego. Att: Jairo Alonso Badillo\n" +" jbadbe@gmail.com" +msgstr "" + +#: frmAcerca.class:30 +msgid "" +"Concéntrese Geográfico v 0.3\n" +"\n" +"Programado para Gambas por:\n" +"Jairo Alonso Badillo Bedoya - jbadbe@gmail.com\n" +"Publicado bajo los términos de la licencia GPL\n" +"Viva Colombia!!!!!\n" +"Visite http://www.linuxeam.tk -Una comunidad Linux" +msgstr "" +"Geografic Concent v 0.3\n" +"\n" +"Ecrit pour Gambas par:\n" +"Jairo Alonso Badillo Bedoya-jbadbe@gmail.com\n" +"Publié sous license GNU\n" +"Vive la Colombie!!!!!!\n" +"Veuillez visiter http://www.linuxeam.tk - Une communauté Linux" + +#: frmAcerca.class:36 frmInstrucciones.class:43 +msgid "&Aceptar" +msgstr "&OK" + +#: frmInstrucciones.class:30 +msgid "COMO JUGAR CONCÉNTRESE?" +msgstr "COMMENT JOUER A CE JEU ?" + +#: frmInstrucciones.class:36 +msgid "" +"Se trata de un Juego Bastante sencillo: \n" +"\n" +"1.) El objetivo del juego es probar tu retentiva y nivel de concentración, para lo cual\n" +" debes encontrar los pares de rostros que hay ocultos en el tablero de\n" +" concéntrese. \n" +" \n" +"2.) El juego tiene tres niveles (Principiante, Medio, Experto), que te permite\n" +" escoger entre tres tamaños del tablero para añadir emoción y dificultad al juego,\n" +" para Acceder a estas opciones debes ingresar por el menu Configuración - Nivel,\n" +" y seleccionar uno de los tres preestablecidos. \n" +" \n" +"3). Así mismo, tienes la posibilidad de incrementar tus conocimientos al jugar en\n" +" Modo Pregunta, lo que incrementa tu nivel educativo, esto se logra mediante un\n" +" cuestionario emergente que deberás responder con cada acierto en el tablero, si\n" +" contestas correctamente tendrás un puntaje más alto y podrás competir con tus\n" +" amigos. (Esta función se encuentra en construcción debido a la migracion de\n" +" Visual Basic hacia Gambas, y experimentar el poder de Linux, viva el\n" +" OpenSource!!! \n" +" \n" +"4.) El juego también te permite activar o desactivar los sonidos de ambientación,\n" +" para lo cual debes cambiar el estado del menú Configuración - Sonido. \n" +" \n" +"5.) Recuerda: Para redistribuir el Tablero Pulsa F2 , para comenzar a jugar pulsa\n" +" F4, los rostros serán cargados aleatoriamente, por lo que no debes intentar\n" +" aprenderte el tablero de memoria...!, Esto sí que va a ser un verdadero reto!. \n" +" \n" +"6.) Estoy actualmente diseñando los modulos de aprendizaje que podrás conseguir\n" +" muy pronto; para comentarios y / o sugerencias escribe a: jbadbe@gmail.com.\n" +msgstr "" + +#: principal.class:166 +msgid "Jugada Errada" +msgstr "Mouvement incorrect !" + +#: principal.class:202 +msgid "Felicitaciones, has cumplido la mision" +msgstr "Félicitations, vous avez rempli la mission." + +#: principal.class:247 +msgid "PULSE F2 PARA REPARTIR DE NUEVO" +msgstr "APPUYEZ SUR F2 POUR RECOMMENCER" + +#: principal.class:384 +msgid "PULSE F4 PARA COMENZAR LA MISION" +msgstr "APPUYEZ SUR F4 POUR COMMENCER" + +#: principal.class:439 +msgid "Enjoy Open Source!" +msgstr "Profitez des logiciels libres !" + +#: principal.class:444 +msgid "&Configuración" +msgstr "&Configuration" + +#: principal.class:447 +msgid "&Nuevo Juego" +msgstr "&Nouveau jeu" + +#: principal.class:452 +msgid "&Mejores Puntajes" +msgstr "Meilleurs &scores" + +#: principal.class:458 +msgid "Nivel" +msgstr "Niveau" + +#: principal.class:462 +msgid "&Principiante" +msgstr "&Débutant" + +#: principal.class:470 +msgid "M&edio" +msgstr "&Moyen" + +#: principal.class:477 +msgid "E&xperto" +msgstr "E&xpert" + +#: principal.class:484 +msgid "&Sonido" +msgstr "&Son" + +#: principal.class:494 +msgid "&Salir" +msgstr "&Quitter" + +#: principal.class:499 +msgid "&Ayuda" +msgstr "&Aide" + +#: principal.class:502 +msgid "A&cerca de" +msgstr "A propos de..." + +#: principal.class:506 +msgid "&Instrucciones" +msgstr "&Instructions (non traduites)" + +#: principal.class:645 +msgid "Jugadas: " +msgstr "Mouvements :" + +#: principal.class:653 +msgid "Tiempo: " +msgstr "Temps :" + +#: principal.class:677 +msgid "0" +msgstr "" + +#~ msgid "Concéntrese Geográfico" +#~ msgstr "Concentré Géographique" diff --git a/app/examples/Games/Concent/.lang/ru.po b/app/examples/Games/Concent/.lang/ru.po new file mode 100644 index 00000000..38c1b3cb --- /dev/null +++ b/app/examples/Games/Concent/.lang/ru.po @@ -0,0 +1,222 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Games/Concent/.project:23 +msgid "Concéntrese Geográfico" +msgstr "Концентрация" + +#: app/examples/Games/Concent/.project:24 +msgid "Esta versión incorpora soporte para el idioma inglés y español (nativo), disfrute este juego!, se han incorporado las correcciones sugeridas por el director del proyecto Gambas, el proyecto ha sido traducido al inglés usando la herramienta integrada de Gambas Ide" +msgstr "Эта версия включает в себя поддержку английского и испанского языка (родного), наслаждайтесь этой игрой! Исправления, предложенные руководителем проекта Gambas, включены, проект переведён на английский язык с использованием интегрированного инструмента Gambas Ide" + +#: app/examples/Games/Concent/.src/fotos.form:208 +msgid "" +"Estimados amigos, este formulario cumple la única función de\n" +" cargar en 40 botones, las imágenes de las caritas que servirán \n" +"para el juego, es posible que exista una mejor manera de \n" +"hacer esto, por eso... escucho sugerencias, posteriormente \n" +"en el código se crea un array de objetos a fin de referencialos \n" +"como botoncito[i].Picture y copiar este atributo en particular al \n" +"tablero de juego. Att: Jairo Alonso Badillo\n" +" jbadbe@gmail.com" +msgstr "" +"Дорогие друзья, эта форма выполняет единственную\n" +"функцию для загрузки из 40 кнопок - изображений\n" +"персонажей, которые будут служить для игры, возможно,\n" +"что есть лучший способ сделать это, поэтому... я слушаю\n" +"предложения, позже в коде создайте массив объектов\n" +"для ссылок, таких как кнопка[i]. Изобразите и скопируйте\n" +"этот конкретный атрибут на игровую доску. Акт: Хайро\n" +"Алонсо Бадильо jbadbe@gmail.com" + +#: app/examples/Games/Concent/.src/frmAcerca.form:8 +msgid "" +"Concéntrese Geográfico v 0.3\n" +"\n" +"Programado para Gambas por:\n" +"Jairo Alonso Badillo Bedoya - jbadbe@gmail.com\n" +"Publicado bajo los términos de la licencia GPL\n" +"Viva Colombia!!!!!\n" +"Visite http://www.linuxeam.tk -Una comunidad Linux" +msgstr "" +"Концентрация версии 0.3\n" +"\n" +"Запрограммировано для Gambas:\n" +"Хайро Алонсо Бадильо Бедоя - jbadbe@gmail.com\n" +"Опубликовано в соответствии с условиями лицензии GPL\n" +"Да здравствует Колумбия!!!!!\n" +"Посетите http://www.linuxeam.tk - сообщество Linux" + +#: app/examples/Games/Concent/.src/frmAcerca.form:13 app/examples/Games/Concent/.src/frmInstrucciones.form:20 +msgid "&Aceptar" +msgstr "Принять" + +#: app/examples/Games/Concent/.src/frmInstrucciones.form:9 +msgid "COMO JUGAR CONCÉNTRESE?" +msgstr "Как играть в концентрацию?" + +#: app/examples/Games/Concent/.src/frmInstrucciones.form:14 +msgid "" +"Se trata de un Juego Bastante sencillo: \n" +"\n" +"1.) El objetivo del juego es probar tu retentiva y nivel de concentración, para lo cual\n" +" debes encontrar los pares de rostros que hay ocultos en el tablero de\n" +" concéntrese. \n" +" \n" +"2.) El juego tiene tres niveles (Principiante, Medio, Experto), que te permite\n" +" escoger entre tres tamaños del tablero para añadir emoción y dificultad al juego,\n" +" para Acceder a estas opciones debes ingresar por el menu Configuración - Nivel,\n" +" y seleccionar uno de los tres preestablecidos. \n" +" \n" +"3). Así mismo, tienes la posibilidad de incrementar tus conocimientos al jugar en\n" +" Modo Pregunta, lo que incrementa tu nivel educativo, esto se logra mediante un\n" +" cuestionario emergente que deberás responder con cada acierto en el tablero, si\n" +" contestas correctamente tendrás un puntaje más alto y podrás competir con tus\n" +" amigos. (Esta función se encuentra en construcción debido a la migracion de\n" +" Visual Basic hacia Gambas, y experimentar el poder de Linux, viva el\n" +" OpenSource!!! \n" +" \n" +"4.) El juego también te permite activar o desactivar los sonidos de ambientación,\n" +" para lo cual debes cambiar el estado del menú Configuración - Sonido. \n" +" \n" +"5.) Recuerda: Para redistribuir el Tablero Pulsa F2 , para comenzar a jugar pulsa\n" +" F4, los rostros serán cargados aleatoriamente, por lo que no debes intentar\n" +" aprenderte el tablero de memoria...!, Esto sí que va a ser un verdadero reto!. \n" +" \n" +"6.) Estoy actualmente diseñando los modulos de aprendizaje que podrás conseguir\n" +" muy pronto; para comentarios y / o sugerencias escribe a: jbadbe@gmail.com.\n" +msgstr "" +"Это довольно простая игра:\n" +"\n" +"1.) Цель игры - проверить вашу внимательность и уровень концентрации,\n" +"для чего вы должны найти пары лиц, которые спрятаны в поле\n" +"концентрации.\n" +" \n" +"2.) В игре есть три уровня (новичок, среднячок, эксперт), которые\n" +"позволяют вам выбирать между тремя размерами доски; чтобы\n" +"добавить эмоции и сложность в игру, чтобы получить доступ к этим\n" +"параметрам, вы должны войти через меню Конфигурация -> Уровень\n" +"и выбрать одну из трёх предустановок. \n" +" \n" +"3). Кроме того, у вас есть возможность повысить свои знания при игре в\n" +"режиме вопросов, которая повышает ваш образовательный уровень; это\n" +"достигается с помощью новой анкеты, на которую вы должны отвечать при\n" +"каждом успехе на доске; если вы ответите правильно, у вас будет более\n" +"высокий балл, и вы сможете соревноваться с друзьями. (Эта функция находится\n" +"в стадии разработки в связи с миграцией Visual Basic на Gambas, и для того,\n" +"чтобы испытать всю мощь Linux, используйте открытый исходный код!!!\n" +" \n" +"4.) Игра также позволяет активировать или деактивировать окружающие\n" +"звуки, для чего необходимо изменить статус в меню Конфигурация -> Звук.\n" +" \n" +"5.) Помните: чтобы перераспределить доску - нажмите F2; чтобы начать играть -\n" +"нажмите F4; лица будут загружены случайным образом, поэтому вы не должны\n" +"пытаться изучить плату памяти...! Это будет настоящим испытанием!\n" +" \n" +"6.) В настоящее время я разрабатываю учебные модули, которые вы можете\n" +"получить очень скоро; для комментариев и/или предложений пишите на:\n" +"jbadbe@gmail.com.\n" + +#: app/examples/Games/Concent/.src/principal.class:166 +msgid "Jugada Errada" +msgstr "Плохой ход" + +#: app/examples/Games/Concent/.src/principal.class:202 +msgid "Felicitaciones, has cumplido la mision" +msgstr "Поздравляю, вы выполнили миссию" + +#: app/examples/Games/Concent/.src/principal.class:247 +msgid "PULSE F2 PARA REPARTIR DE NUEVO" +msgstr "Нажмите F2, чтобы начать заново" + +#: app/examples/Games/Concent/.src/principal.class:384 app/examples/Games/Concent/.src/principal.form:196 +msgid "PULSE F4 PARA COMENZAR LA MISION" +msgstr "Нажмите F4, чтобы начать миссию" + +#: app/examples/Games/Concent/.src/principal.form:6 +msgid "Enjoy Open Source!" +msgstr "Наслаждайтесь открытым исходным кодом!" + +#: app/examples/Games/Concent/.src/principal.form:10 +msgid "&Configuración" +msgstr "Конфигурация" + +#: app/examples/Games/Concent/.src/principal.form:12 +msgid "&Nuevo Juego" +msgstr "Новая игра" + +#: app/examples/Games/Concent/.src/principal.form:16 +msgid "&Mejores Puntajes" +msgstr "Лучшие результаты" + +#: app/examples/Games/Concent/.src/principal.form:21 +msgid "Nivel" +msgstr "Уровень" + +#: app/examples/Games/Concent/.src/principal.form:24 +msgid "&Principiante" +msgstr "Новичок" + +#: app/examples/Games/Concent/.src/principal.form:31 +msgid "M&edio" +msgstr "Среднячок" + +#: app/examples/Games/Concent/.src/principal.form:37 +msgid "E&xperto" +msgstr "Эксперт" + +#: app/examples/Games/Concent/.src/principal.form:43 +msgid "&Sonido" +msgstr "Звук" + +#: app/examples/Games/Concent/.src/principal.form:51 +msgid "&Salir" +msgstr "Выход" + +#: app/examples/Games/Concent/.src/principal.form:55 +msgid "&Ayuda" +msgstr "Помощь" + +#: app/examples/Games/Concent/.src/principal.form:57 +msgid "A&cerca de" +msgstr "О программе" + +#: app/examples/Games/Concent/.src/principal.form:60 +msgid "&Instrucciones" +msgstr "Инструкции" + +#: app/examples/Games/Concent/.src/principal.form:181 +msgid "Jugadas: " +msgstr "Ходы: " + +#: app/examples/Games/Concent/.src/principal.form:188 +msgid "Tiempo: " +msgstr "Время: " + +#: app/examples/Games/Concent/.src/principal.form:210 app/examples/Games/Concent/.src/principal.form:217 +msgid "0" +msgstr "0" + diff --git a/app/examples/Games/Concent/.project b/app/examples/Games/Concent/.project new file mode 100644 index 00000000..3b78d34e --- /dev/null +++ b/app/examples/Games/Concent/.project @@ -0,0 +1,22 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.6.90 +Title=Concéntrese Geográfico +Startup=principal +Icon=imagenes/logo.png +Version=3.6.90 +VersionFile=1 +Component=gb.image +Component=gb.gui +Component=gb.db +Component=gb.sdl.sound +Description="Esta versión incorpora soporte para el idioma inglés y español (nativo), disfrute este juego!, se han incorporado las correcciones sugeridas por el director del proyecto Gambas, el proyecto ha sido traducido al inglés usando la herramienta integrada de Gambas Ide" +Authors="Jairo Alonso Badillo Bedoya" +TabSize=2 +Translate=1 +Language=fr +Maintainer=benoit +Vendor=Princeton +Address=benoit@localhost +License=General Public Licence +Packager=1 +Systems=redhat diff --git a/app/examples/Games/Concent/.src/fotos.class b/app/examples/Games/Concent/.src/fotos.class new file mode 100644 index 00000000..5c4d1122 --- /dev/null +++ b/app/examples/Games/Concent/.src/fotos.class @@ -0,0 +1,7 @@ +' Gambas class file + + + +PUBLIC SUB Form_Open() + +END diff --git a/app/examples/Games/Concent/.src/fotos.form b/app/examples/Games/Concent/.src/fotos.form new file mode 100644 index 00000000..0e79fe06 --- /dev/null +++ b/app/examples/Games/Concent/.src/fotos.form @@ -0,0 +1,210 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(54.3333,9.6667,56.6667,57) + Text = ("") + Resizable = False + { Button1 Button + MoveScaled(1,22.8333,6.3333,6.3333) + Text = ("") + Picture = Picture["imagenes/an1.gif"] + } + { Button2 Button + MoveScaled(8,22.8333,6.3333,6.3333) + Text = ("") + Picture = Picture["imagenes/an11.gif"] + } + { Button3 Button + MoveScaled(14.8333,22.8333,6.3333,6.3333) + Text = ("") + Picture = Picture["imagenes/an12.gif"] + } + { Button4 Button + MoveScaled(21.6667,22.8333,6.3333,6.3333) + Text = ("") + Picture = Picture["imagenes/an13.gif"] + } + { Button5 Button + MoveScaled(28.5,22.8333,6.3333,6.3333) + Text = ("") + Picture = Picture["imagenes/an14.gif"] + } + { Button6 Button + MoveScaled(35.3333,22.8333,6.3333,6.3333) + Text = ("") + Picture = Picture["imagenes/an15.gif"] + } + { Button7 Button + MoveScaled(42.1667,22.8333,6.3333,6.3333) + Text = ("") + Picture = Picture["imagenes/an16.gif"] + } + { Button8 Button + MoveScaled(49,22.8333,6.3333,6.3333) + Text = ("") + Picture = Picture["imagenes/an17.gif"] + } + { Button9 Button + MoveScaled(28.5,29.6667,6.3333,6.3333) + Text = ("") + Picture = Picture["imagenes/an21.gif"] + } + { Button10 Button + MoveScaled(21.6667,29.6667,6.3333,6.3333) + Text = ("") + Picture = Picture["imagenes/an20.gif"] + } + { Button11 Button + MoveScaled(14.8333,29.6667,6.3333,6.3333) + Text = ("") + Picture = Picture["imagenes/an2.gif"] + } + { Button12 Button + MoveScaled(8,29.6667,6.3333,6.3333) + Text = ("") + Picture = Picture["imagenes/an19.gif"] + } + { Button13 Button + MoveScaled(1,29.6667,6.3333,6.3333) + Text = ("") + Picture = Picture["imagenes/an18.gif"] + } + { Button14 Button + MoveScaled(35.3333,29.6667,6.3333,6.3333) + Text = ("") + Picture = Picture["imagenes/an22.gif"] + } + { Button15 Button + MoveScaled(42.1667,29.6667,6.3333,6.3333) + Text = ("") + Picture = Picture["imagenes/an23.gif"] + } + { Button16 Button + MoveScaled(49,29.6667,6.3333,6.3333) + Text = ("") + Picture = Picture["imagenes/an24.gif"] + } + { Button17 Button + MoveScaled(28.5,36.5,6.3333,6.3333) + Text = ("") + Picture = Picture["imagenes/an29.gif"] + } + { Button18 Button + MoveScaled(21.6667,36.5,6.3333,6.3333) + Text = ("") + Picture = Picture["imagenes/an28.gif"] + } + { Button19 Button + MoveScaled(14.8333,36.5,6.3333,6.3333) + Text = ("") + Picture = Picture["imagenes/an27.gif"] + } + { Button20 Button + MoveScaled(8,36.5,6.3333,6.3333) + Text = ("") + Picture = Picture["imagenes/an26.gif"] + } + { Button21 Button + MoveScaled(1,36.5,6.3333,6.3333) + Text = ("") + Picture = Picture["imagenes/an25.gif"] + } + { Button22 Button + MoveScaled(35.3333,36.5,6.3333,6.3333) + Text = ("") + Picture = Picture["imagenes/an3.gif"] + } + { Button23 Button + MoveScaled(42.1667,36.5,6.3333,6.3333) + Text = ("") + Picture = Picture["imagenes/an30.gif"] + } + { Button24 Button + MoveScaled(49,36.5,6.3333,6.3333) + Text = ("") + Picture = Picture["imagenes/an31.gif"] + } + { Button25 Button + MoveScaled(28.5,43.3333,6.3333,6.3333) + Text = ("") + Picture = Picture["imagenes/an36.gif"] + } + { Button26 Button + MoveScaled(21.6667,43.3333,6.3333,6.3333) + Text = ("") + Picture = Picture["imagenes/an35.gif"] + } + { Button27 Button + MoveScaled(14.8333,43.3333,6.3333,6.3333) + Text = ("") + Picture = Picture["imagenes/an34.gif"] + } + { Button28 Button + MoveScaled(8,43.3333,6.3333,6.3333) + Text = ("") + Picture = Picture["imagenes/an33.gif"] + } + { Button29 Button + MoveScaled(1,43.3333,6.3333,6.3333) + Text = ("") + Picture = Picture["imagenes/an32.gif"] + } + { Button30 Button + MoveScaled(35.3333,43.3333,6.3333,6.3333) + Text = ("") + Picture = Picture["imagenes/an37.gif"] + } + { Button31 Button + MoveScaled(42.1667,43.3333,6.3333,6.3333) + Text = ("") + Picture = Picture["imagenes/an38.gif"] + } + { Button32 Button + MoveScaled(49,43.3333,6.3333,6.3333) + Text = ("") + Picture = Picture["imagenes/an39.gif"] + } + { Button33 Button + MoveScaled(28.5,50.1667,6.3333,6.3333) + Text = ("") + Picture = Picture["imagenes/an7.gif"] + } + { Button34 Button + MoveScaled(21.6667,50.1667,6.3333,6.3333) + Text = ("") + Picture = Picture["imagenes/an6.gif"] + } + { Button35 Button + MoveScaled(14.8333,50.1667,6.3333,6.3333) + Text = ("") + Picture = Picture["imagenes/an5.gif"] + } + { Button36 Button + MoveScaled(8,50.1667,6.3333,6.3333) + Text = ("") + Picture = Picture["imagenes/an40.gif"] + } + { Button37 Button + MoveScaled(1,50.1667,6.3333,6.3333) + Text = ("") + Picture = Picture["imagenes/an4.gif"] + } + { Button38 Button + MoveScaled(35.3333,50.1667,6.3333,6.3333) + Text = ("") + Picture = Picture["imagenes/an8.gif"] + } + { Button39 Button + MoveScaled(42.1667,50.1667,6.3333,6.3333) + Text = ("") + Picture = Picture["imagenes/an9.gif"] + } + { Button40 Button + MoveScaled(49,50.1667,6.3333,6.3333) + Text = ("") + } + { Label1 Label + MoveScaled(1,1,53.6667,20.5) + Text = ("Estimados amigos, este formulario cumple la \xC3\xBAnica funci\xC3\xB3n de\n cargar en 40 botones, las im\xC3\xA1genes de las caritas que servir\xC3\xA1n \npara el juego, es posible que exista una mejor manera de \nhacer esto, por eso... escucho sugerencias, posteriormente \nen el c\xC3\xB3digo se crea un array de objetos a fin de referencialos \ncomo botoncito[i].Picture y copiar este atributo en particular al \ntablero de juego. Att: Jairo Alonso Badillo\n jbadbe@gmail.com") + } +} diff --git a/app/examples/Games/Concent/.src/frmAcerca.class b/app/examples/Games/Concent/.src/frmAcerca.class new file mode 100644 index 00000000..191c36df --- /dev/null +++ b/app/examples/Games/Concent/.src/frmAcerca.class @@ -0,0 +1,12 @@ +' Gambas class file + +PUBLIC SUB Button1_Click() + + ME.Close + +END + +PUBLIC SUB Form_Open() + + +END diff --git a/app/examples/Games/Concent/.src/frmAcerca.form b/app/examples/Games/Concent/.src/frmAcerca.form new file mode 100644 index 00000000..bb87ee31 --- /dev/null +++ b/app/examples/Games/Concent/.src/frmAcerca.form @@ -0,0 +1,20 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(59.5714,26.7143,67,31) + Resizable = False + { Label1 Label + MoveScaled(1,1,65,24) + Text = ("Concéntrese Geográfico v 0.3\n\nProgramado para Gambas por:\nJairo Alonso Badillo Bedoya - jbadbe@gmail.com\nPublicado bajo los términos de la licencia GPL\nViva Colombia!!!!!\nVisite http://www.linuxeam.tk -Una comunidad Linux") + Alignment = Align.Center + } + { Button1 Button + MoveScaled(24,26,19,4) + Text = ("&Aceptar") + } + { PictureBox1 PictureBox + MoveScaled(8,4,6.7143,4) + Expand = True + Picture = Picture["imagenes/colombia.gif"] + } +} diff --git a/app/examples/Games/Concent/.src/frmInstrucciones.class b/app/examples/Games/Concent/.src/frmInstrucciones.class new file mode 100644 index 00000000..e0dfd43d --- /dev/null +++ b/app/examples/Games/Concent/.src/frmInstrucciones.class @@ -0,0 +1,11 @@ +' Gambas class file + +Public Sub Form_Open() + +End + +Public Sub Button1_Click() + + Me.Close + +End diff --git a/app/examples/Games/Concent/.src/frmInstrucciones.form b/app/examples/Games/Concent/.src/frmInstrucciones.form new file mode 100644 index 00000000..00f5cfc3 --- /dev/null +++ b/app/examples/Games/Concent/.src/frmInstrucciones.form @@ -0,0 +1,22 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(63.8571,1.7143,86,90) + Resizable = False + { Label1 Label + MoveScaled(1,1,83,4) + Font = Font["Bold,+2"] + Text = ("COMO JUGAR CONCÉNTRESE?") + } + { Label2 Label + MoveScaled(1,6,84,78) + Padding = 8 + Text = ("Se trata de un Juego Bastante sencillo: \n\n1.) El objetivo del juego es probar tu retentiva y nivel de concentración, para lo cual\n debes encontrar los pares de rostros que hay ocultos en el tablero de\n concéntrese. \n \n2.) El juego tiene tres niveles (Principiante, Medio, Experto), que te permite\n escoger entre tres tamaños del tablero para añadir emoción y dificultad al juego,\n para Acceder a estas opciones debes ingresar por el menu Configuración - Nivel,\n y seleccionar uno de los tres preestablecidos. \n \n3). Así mismo, tienes la posibilidad de incrementar tus conocimientos al jugar en\n Modo Pregunta, lo que incrementa tu nivel educativo, esto se logra mediante un\n cuestionario emergente que deberás responder con cada acierto en el tablero, si\n contestas correctamente tendrás un puntaje más alto y podrás competir con tus\n amigos. (Esta función se encuentra en construcción debido a la migracion de\n Visual Basic hacia Gambas, y experimentar el poder de Linux, viva el\n OpenSource!!! \n \n4.) El juego también te permite activar o desactivar los sonidos de ambientación,\n para lo cual debes cambiar el estado del menú Configuración - Sonido. \n \n5.) Recuerda: Para redistribuir el Tablero Pulsa F2 , para comenzar a jugar pulsa\n F4, los rostros serán cargados aleatoriamente, por lo que no debes intentar\n aprenderte el tablero de memoria...!, Esto sí que va a ser un verdadero reto!. \n \n6.) Estoy actualmente diseñando los modulos de aprendizaje que podrás conseguir\n muy pronto; para comentarios y / o sugerencias escribe a: jbadbe@gmail.com.\n") + Alignment = Align.TopNormal + Border = Border.Plain + } + { Button1 Button + MoveScaled(34,85,18,4) + Text = ("&Aceptar") + } +} diff --git a/app/examples/Games/Concent/.src/funciones.module b/app/examples/Games/Concent/.src/funciones.module new file mode 100644 index 00000000..6cbc1714 --- /dev/null +++ b/app/examples/Games/Concent/.src/funciones.module @@ -0,0 +1,162 @@ +' Gambas module file + +'Arreglos para guardar info de las imagenes a cargar y el estado de los botones +'................................................................................ +'Arrays for save images information to load. +Private botones_numero_foticos As New Integer[64] 'Almacena el numero de foto (indice) que llevara cada botoncito al descubrirse + 'Almacenate the image number (index). +Private boton_lleno As New Boolean[64] 'para especificar si un boton ya recibio asignacion de fotico + 'Specify if a button have a image asigned + +'Variables de juego +Public jugadas As Integer 'contador del numero de jugadas durante una partida (counter for number of movements) +Public tiempo As Integer 'contador del numero de segundos durante una partida (counter for game time) +Public aciertos As Integer 'Contar el numero de aciertos del jugador, es decir, cada vez que el jugador logra en una misma + 'jugada encontrar dos botones con el mismo dibujito + '.............................................................................................. + 'Count the acerts for player. +Public num_movimiento_actual As Integer 'Siempre tendra valor de 0, o 1. se usa para saber si el jugador ya destapo un boton el turno actual + 'es decir, una jugada consta de dos movimientos + '.................................................................................. + 'Controle the set of button moved in a movement + +Public Sub distrib(tam_tablero As Integer, tam_botones As Integer) + Dim i As Integer + Dim j As Integer + Dim izq As Integer + Dim arr As Integer + Dim pos As Integer + + izq = (principal.Width - tam_botones * tam_tablero) / 2 + arr = (principal.Height - tam_botones * tam_tablero) / 2 + + pos = 0 + + For I = 0 To tam_tablero - 1 + For J = 0 To tam_tablero - 1 + principal.botones[pos].visible = True + principal.botones[pos].width = tam_botones + principal.botones[pos].height = tam_botones + principal.botones[pos].x = izq + principal.botones[pos].y = arr + principal.botones[pos].picture = principal.initialPicture 'cada vez que se distribuye el tablero, se tapas los botone + 'con el dibujito del signo de interrogacion + '........................................................ + 'Restore the buttons to initial state, when the game is + 'restarted + 'principal.botones[pos].enabled=TRUE + izq = izq + tam_botones + pos = pos + 1 + Next + arr = arr + tam_botones + izq = (principal.Width - tam_botones * tam_tablero) / 2 + + Next + + 'Se ocultan los botones que no sean necesarios de acuerdo al nivel + 'de juego, esto pasa cuando se ha jugado en un nivel superior y + 'luego se vuelve hacia un nivel inferior + '.................................................................. + 'The not necesary button are oculted + For I = tam_tablero * tam_tablero To 63 + principal.botones[pos].visible = False + pos = pos + 1 + Next + + 'se asigna false al array boton_lleno para iniciar una nueva asignacion de foticos + '.................................................................................. + 'The state for each button is restored, it is for permit movement with each button + For I = 0 To 63 + boton_lleno[I] = False + Next + + 'Se cargan las imagenes en cada botoncito + '......................................... + 'Load image for each button + repartir(tam_tablero * tam_tablero) + +End + + +'Este procedimiento busca en el directorio imagenes para capturar los +'nombres de los dibujitos que se van a mostrar en los botones, esta +'funcionalidad permite que el usuario incluya luego sus propias imagenes +'PUBLIC SUB cargar_imagenes(Directory AS String) + + 'DIM File AS String + 'DIM indice AS Integer + 'indice=0 + + 'FOR EACH File IN Dir(Directory, "an*.gif") + 'imagenes[indice]=File + 'indice=indice+1 + 'NEXT + +'END + +Public Sub repartir(tam_tablero As Integer) + Dim i As Integer + Dim j As Integer + Dim aleatorio As Integer + Dim aleatorio1 As Integer + Dim listo As Boolean 'Bandera para informar cuando se encuentre un boton libre para asignacion + 'Variable for controlate the flow in nex loop + + 'Ciclar la mitad de la dimension para ubicar las imagenes en cada boton, se cicla la mitad ya que cada imagen + 'escogida en un ciclo se asigna a una pareja de botoncitos, la imagen escogida se representa como un numero + 'entero, que es utilizado luego como indice del array botones_foticos[] para copiar la propiedad picture, este + 'numero se guarda en el arreglo botones_numero_foticos[64]. + '.............................................................................................................. + 'This For loop permit locate the images in each button + For i = 0 To Int(tam_tablero - 1) / 2 + aleatorio = Int(Rnd() * 40) 'se obtiene un numero entre (0, 39) que es el rango de indices del array botones_foticos + 'Obtain a random number in 0-39 range (there is 40 images for use) + 'IF aleatorio = 40 THEN message ("salio un numero malo") + 'en cada ciclo se ubica dos veces la misma fotico en dos cuadros aleatorios + '.......................................................................... + 'For each loop a image is locate at two times + For j = 0 To 1 + listo = False + While listo = False 'se anida este ciclo para forzar la busqueda de dos cuadritos que no hayan sido asignados + 'This loop is nested for force the search + aleatorio1 = Int(Rnd() * tam_tablero) 'se busca un indice en el rango (0, tam_tablero) + 'An index in 0,tam_table range is searched + If (boton_lleno[aleatorio1]) = False Then 'se verifica que el boton no tenga fotico asignada + 'Verify the button for stablish it is free + botones_numero_foticos[aleatorio1] = aleatorio + boton_lleno[aleatorio1] = True + listo = True + 'ACTIVAR LA LINEA SIGUIENTE PARA DEPURACION, ENTONCES SE PODRA VER LA IMAGEN OCULTA DE LOS BOTONES + 'principal.botones[aleatorio1].picture=principal.botones_foticos[aleatorio].picture + End If + Wend + + Next + + Next + + 'Se inicializan las variables de juego + '.................................... + 'Initialize game variables + jugadas = 0 + tiempo = 0 + aciertos = 0 + num_movimiento_actual = 0 + +End + +'Se hace necesario este metodo para notificar al formulario principal sobre cual imagen debe colocar en un botoncito +'al ser descubierto, esto debido a que el arreglo botones_numero_foticos[] es pridado en este modulo +Public Function devolver_indice_defotico(tag As Integer) As Integer + Return botones_numero_foticos[tag] +End + +'Devuelve un valor booleano indicando si los dos movimientos de una jugada son validos +Public Function comparar_botones_jugados(btjugado1 As Integer, btjugado2 As Integer) As Boolean + Return botones_numero_foticos[btjugado1] = botones_numero_foticos[btjugado2] +End + + + + + diff --git a/app/examples/Games/Concent/.src/principal.class b/app/examples/Games/Concent/.src/principal.class new file mode 100644 index 00000000..964c0d85 --- /dev/null +++ b/app/examples/Games/Concent/.src/principal.class @@ -0,0 +1,390 @@ +' Gambas class file + +' Gambas class +Public boton As Button 'object variable for charge buttons on ejecution time +Public sonido As Sound 'objeto que permite lanzar los sonidos(Play the Sounds) +Public aplauso As Sound 'Sonido de aplauso cuando se acierta en un par de caritas (Applause Sound at each movement) +Public botones As Object[] 'Arreglo de botones del tablero de juego (Buttons array for game board) +Public botones_foticos As Object[] 'Arreglo de botones con las figuritas (Buttons array with images loaded) + 'en el form fotos +'variables del juego +Public tam_tablero As Integer 'para conocer en todo momento cual es el tamaño del tablero (filas y columnas) + 'It is for know in all moment the boad size(row and columns) + +Public habilitar As Boolean 'para establecer si el jugador puede empezar a descubrir los botoncitos + 'Stablish if player can move + + +Private anterior_boton_jugado As Integer 'se utiliza para recordar el numero del ultimo boton pulsado, a fin de poder + 'restaurarlo, en el caso del primer movimiento de una jugada, cuando no hay coincidencia + 'de las imagenes destapadas (remember last pushed button) + +'Las siguientes dos variables fueron necesarias a fin de preservar la informacion contenida en la variable anterior_boton_jugado +'y en LAST.tag durante la ejecucion del evento click sobre los botones, esto debido a que la ejecucion de codigo no se +'interrumpe con la activacion del timer, de esta forma se permite un retardo en la visualizacion de pares de botones descubiertos +'para que el jugador pueda reconocer la figura oculta en caso de que ambos dibujos no coincidan +'............................................................................................... +'Next variables would be needed for save information in variable anterior_boton_jugado and LAST.tag (for grupo_botones group) +'for click event, it is for permit a delay in each movement, so the player can visualize every faces. + +Private boton_actual_paratimer As Integer +Private boton_ultimo_paratimer As Integer + +'FUNCIONALIDAD AÑADIDA DE ACCESO A BASE DE DATOS PARA ALMACENAR LOS DATOS DEL +'JUEGO, MEJORES PUNTAJES POR CATEGORIA +'PRIVATE myarchivo AS File +'PRIVATE mylinea AS String + +'Variable para almacenar el idioma en uso +'........................................ +'Capture and almacenate the language in use +Public language As String + +Public initialPicture As Picture + +Public Sub _new() + +Dim i As Integer + +Randomize + +sonido = New Sound("Wallhit.wav") 'Instancia del objeto sonido - Sound object instance +aplauso = New Sound("applause.wav") + +initialPicture = Picture["imagenes/inter.jpg"] + + 'IF NOT Access(system.Home &/"myarchivo.ini") THEN + ' message ("no existe") + ' OPEN system.Home &/"myarchivo.ini" FOR CREATE AS myarchivo + ' 'WHILE NOT Eof(myarchivo) + ' 'LINE INPUT #myarchivo, mylinea + ' 'message (mylinea) + ' 'WEND + ' myarchivo.Save("hola") + ' + ' CLOSE myarchivo + 'END IF + + + 'Se crea el array de objetos botones, esto con el fin de facilitar la manipulacion + 'de eventos comunes a un grupo de botones. + '.................................................................................. + 'Create the buttons to be used for next game + botones = New Object[] 'Array of buttons + + For i = 1 To 64 + boton = New Button(Me) As "grupobotones" + boton.tag = i - 1 + 'The button object array is created, it is for manipulate the common events to group buttons + botones.Add(boton) ' + Next + + 'Se crea este arreglo para tomar referencia de las foticos de los botones + 'en el form fotos + '.......................................................................... + 'This array contain a reference for images to visualice in the game + botones_foticos = New Object[] + For i = 1 To 40 + boton = New Button(Me) + boton.Visible = False + boton.Picture = Picture["imagenes/an" & CStr(i) & ".gif"] + botones_foticos.Add(boton) + Next + ' botones_foticos.Add(fotos.Button1) + ' botones_foticos.Add(fotos.Button2) + ' botones_foticos.Add(fotos.Button3) + ' botones_foticos.Add(fotos.Button4) + ' botones_foticos.Add(fotos.Button5) + ' botones_foticos.Add(fotos.Button6) + ' botones_foticos.Add(fotos.Button7) + ' botones_foticos.Add(fotos.Button8) + ' botones_foticos.Add(fotos.Button9) + ' botones_foticos.Add(fotos.Button10) + ' botones_foticos.Add(fotos.Button11) + ' botones_foticos.Add(fotos.Button12) + ' botones_foticos.Add(fotos.Button13) + ' botones_foticos.Add(fotos.Button14) + ' botones_foticos.Add(fotos.Button15) + ' botones_foticos.Add(fotos.Button16) + ' botones_foticos.Add(fotos.Button17) + ' botones_foticos.Add(fotos.Button18) + ' botones_foticos.Add(fotos.Button19) + ' botones_foticos.Add(fotos.Button20) + ' botones_foticos.Add(fotos.Button21) + ' botones_foticos.Add(fotos.Button22) + ' botones_foticos.Add(fotos.Button23) + ' botones_foticos.Add(fotos.Button24) + ' botones_foticos.Add(fotos.Button25) + ' botones_foticos.Add(fotos.Button26) + ' botones_foticos.Add(fotos.Button27) + ' botones_foticos.Add(fotos.Button28) + ' botones_foticos.Add(fotos.Button29) + ' botones_foticos.Add(fotos.Button30) + ' botones_foticos.Add(fotos.Button31) + ' botones_foticos.Add(fotos.Button32) + ' botones_foticos.Add(fotos.Button33) + ' botones_foticos.Add(fotos.Button34) + ' botones_foticos.Add(fotos.Button35) + ' botones_foticos.Add(fotos.Button36) + ' botones_foticos.Add(fotos.Button37) + ' botones_foticos.Add(fotos.Button38) + ' botones_foticos.Add(fotos.Button39) + ' botones_foticos.Add(fotos.Button40) +'Pensaba permitir al usuario normal el cambio de las imagenes de los +'botoncitos pero, parece mejor que el usuario que quiera modificar estos +'dibujos, lo haga en el proyecto fuente +'....................................................................... +'Maybe is possible permit to user manipulate the images, but for now it is +'done only by code +tam_tablero = 4 +funciones.distrib(tam_tablero, 45) + +End + +Public Sub grupobotones_Click() + + Dim jugada_valida As Boolean + Dim continuar As Boolean + + 'message(LAST.tag) + + continuar = True + 'Se verifica si el tablero acepta jugadas, es decir si el juego esta en curso + '............................................................................ + 'Verify if board is active for game + If habilitar = True Then + 'Antes que nada se comprueba que el boton pulsado no se haya jugado antes + 'utilizo el atributo btnInicial.picture porque resulta sencillo comparar de esta forma si el cuadrito ya no tiene + 'el dibujo del signo de interrogacion + '............................................................................ + 'Comprobe is current pushed button haven't been discovered. + If (Last.picture <> initialPicture) Then + 'Ojo, si el boton pulsado ya habia sido descubierto durante el primer movimiento de esta jugada + '............................................................................................... + 'Inhabilite the movement for a button when it have been discovered. + continuar = False + message(("Jugada Errada")) + End If + + If continuar Then + sonar(1) + + Last.picture = botones_foticos[funciones.devolver_indice_defotico(Last.tag)].picture + If funciones.num_movimiento_actual = 1 Then 'Se esta haciendo el segundo movimiento de una jugada + + 'Se debe comparar la imagen, para saber si hubo coincidencia + '............................................................ + 'Compare the imagen for stablish if movement is correct + jugada_valida = funciones.comparar_botones_jugados(anterior_boton_jugado, Last.tag) + + 'Se aumenta el contador de jugadas (cada jugada corresponde a 2 movimientos), se actualiza el label + '.................................................................................................. + 'Increase the play counter (each turne have two movements), label is refresh + funciones.jugadas = funciones.jugadas + 1 + lblJugadas.Caption = funciones.jugadas + + If jugada_valida Then + sonar(2) + 'depuracion + 'ME.botones[LAST.tag].enabled=FALSE + 'ME.botones[anterior_boton_jugado].enabled=FALSE + + funciones.aciertos = funciones.aciertos + 1 'El jugador tuvo un acierto mas (player have acerted) + 'se verifica si el numero de aciertos indica el fin del juego, en todo caso el numero de aciertos para + 'finalizar el juego debe ser igual a pow(tam_tablero,2)/2, por ejemplo si el jugador escogio el nivel + 'experto, el tamaño del tablero sera de 8*8, entonces los aciertos necesarios para finalizar el juego son: + '64/2=32 + '................................................................................................... + 'Verify numbers of acerts, for stablish the game end, for end the game acerts maybe be equal to + 'pow(tam_tablero,2)/2 + If funciones.aciertos = tam_tablero * tam_tablero / 2 Then + timer2.Enabled = False 'se termina el conteo de tiempo + message.Info(("Felicitaciones, has cumplido la mision")) + End If + Else + habilitar = False + boton_actual_paratimer = Last.tag + boton_ultimo_paratimer = anterior_boton_jugado + timer1.enabled = True + End If + End If + funciones.num_movimiento_actual = funciones.num_movimiento_actual + 1 'Se ha hecho un movimiento + 'message(ultimo_boton_jugado) + anterior_boton_jugado = Last.tag + If funciones.num_movimiento_actual = 2 Then + funciones.num_movimiento_actual = 0 'Si se hizo el segundo movimiento, se reinicia el turno + End If + End If + End If + +End + + +Public Sub mnuConfiguracionSalir_Click() + Me.Close +End + + +Public Sub mnuConfiguracionNuevoJuego_Click() + Dim tam_botones As Integer 'para seleccionar el tamaño adecuado del boton de acuerdo al nivel de juego escogido + 'Choose the board size + + If tam_tablero = 8 Then + tam_botones = 40 + Else + tam_botones = 45 + End If + funciones.distrib(tam_tablero, tam_botones) + +End + + +Public Sub grupobotones_KeyPress() + + If key.code = key.f4 Then + habilitar = True + timer2.Enabled = True + label5.caption = ("PULSE F2 PARA REPARTIR DE NUEVO") + End If + + + +End + +Public Sub Timer1_Timer() + + + timer1.Enabled = False + botones[boton_ultimo_paratimer].picture = initialPicture + botones[boton_actual_paratimer].picture = initialPicture + 'ME.Label5.Caption="anterior: " & anterior_boton_jugado & " ultimo: " & ultimo_boton_jugado + 'message("hola") + habilitar = True + +End + +'Habilita o deshabilita el menu sonido, esto permite posteriormente en el procedimiento sonar, escoger si se emiten o no +'los sonidos +'................................................................................................ +'Activate or desactivate the sound in menu Configuration. +Public Sub mnuConfiguracionSonido_Click() + mnuConfiguracionSonido.Checked = Not mnuConfiguracionSonido.Checked +End + +'Para emitir los sonidos, si el menu Sonido no esta checkeado, se omite el sonidito +'.................................................................................. +'Play sound only if Sound configuration menu is checked +Public Sub sonar(evento As Integer) + + If mnuConfiguracionSonido.Checked Then + If evento = 1 Then + sonido.Play() + End If + + If evento = 2 Then + aplauso.Play() + End If + End If + +End + + +Public Sub Timer2_Timer() + 'Este timer sirve para llevar la cuenta del tiempo de juego + '.......................................................... + 'This timer count the game time + funciones.tiempo = funciones.tiempo + 1 + lblTiempo.Caption = funciones.tiempo +End + +Public Sub nivel_Click() + + Last.checked = Not Last.checked + If Last.tag = "p" Then + 'message ("Has escogido el nivel Principiante") + mnuConfigNivelExp.Checked = False + mnuConfigNivelMedio.Checked = False + tam_tablero = 4 + funciones.distrib(tam_tablero, 45) + End If + + If Last.tag = "m" Then + mnuConfigNivelExp.Checked = False + mnuConfigNivelPrinci.Checked = False + 'message ("Has escogido el nivel Medio") + tam_tablero = 6 + funciones.distrib(tam_tablero, 45) + End If + + If Last.tag = "e" Then + mnuConfigNivelPrinci.Checked = False + mnuConfigNivelMedio.Checked = False + 'message ("Has escogido el nivel Experto, suerte jugadorazo!") + tam_tablero = 8 + funciones.distrib(tam_tablero, 40) + End If + + + +End + +Public Sub mnuAyudaAcerca_Click() + frmAcerca.ShowModal + +End + +Public Sub mnuAyudaInstr_Click() + + frmInstrucciones.ShowModal + +End + + + +' PUBLIC SUB mnuConfigIdiomaEspanol_Click() +' 'Cambiar el idioma +' '.................. +' 'Set the language +' language = "espanol" +' mnuConfigIdiomaEnglish.Checked = FALSE +' mnuConfigIdiomaEspanol.Checked = NOT mnuConfigIdiomaEspanol.Checked +' 'File.Save("language.txt","espanol") +' +' set_enviroment_language +' +' END +' +' PUBLIC SUB mnuConfigIdiomaEnglish_Click() +' 'Cambiar el idioma +' '.................. +' 'Set the language +' language = "english" +' mnuConfigIdiomaEspanol.Checked = FALSE +' mnuConfigIdiomaEnglish.Checked = NOT mnuConfigIdiomaEnglish.Checked +' 'File.Save("language.txt","espanol") +' set_enviroment_language +' +' END + +Public Sub Initialize() + + 'El timer del contador de segundos ha de estar en ceros + '...................................................... + 'Restore the time game timer + Timer2.Enabled = False + + 'Se inicializan los labels de conteo del juego + '............................................. + 'Initialize labels + lblJugadas.Caption = 0 + lblTiempo.Caption = 0 + 'Se actualiza el mensaje en la barra de estado + '.............................................. + 'Change message in status bar + Label5.caption = ("PULSE F4 PARA COMENZAR LA MISION") + + habilitar = False 'El jugador no puede descubrir las fichas hasta que pulse F4 + '......................................................... + 'Enable game only when player press F4 + +End diff --git a/app/examples/Games/Concent/.src/principal.form b/app/examples/Games/Concent/.src/principal.form new file mode 100644 index 00000000..5156d342 --- /dev/null +++ b/app/examples/Games/Concent/.src/principal.form @@ -0,0 +1,220 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(58.7143,5,49,70) + Mouse = Mouse.Pointing + Text = ("Enjoy Open Source!") + Picture = Picture["imagenes/tierra3.jpg"] + Resizable = False + { mnuConfiguracion Menu + Text = ("&Configuración") + { mnuConfiguracionNuevoJuego Menu + Text = ("&Nuevo Juego") + Shortcut = "F2" + } + { mnuConfiguracionMejorPuntaje Menu + Text = ("&Mejores Puntajes") + Enabled = False + Shortcut = "F3" + } + { mnuConfiguracionNivel Menu + Text = ("Nivel") + { mnuConfigNivelPrinci Menu nivel + Name = "mnuConfigNivelPrinci" + Text = ("&Principiante") + Checked = True + Tag = "p" + Shortcut = "Ctrl+Alt+P" + } + { mnuConfigNivelMedio Menu nivel + Name = "mnuConfigNivelMedio" + Text = ("M&edio") + Tag = "m" + Shortcut = "Ctrl+Alt+M" + } + { mnuConfigNivelExp Menu nivel + Name = "mnuConfigNivelExp" + Text = ("E&xperto") + Tag = "e" + Shortcut = "Ctrl+Alt+X" + } + } + { mnuConfiguracionSonido Menu + Text = ("&Sonido") + Checked = True + Shortcut = "Ctrl+Alt+R" + } + { mnuSep Menu + Tag = "-" + } + { mnuConfiguracionSalir Menu + Text = ("&Salir") + } + } + { mnuAyuda Menu + Text = ("&Ayuda") + { mnuAyudaAcerca Menu + Text = ("A&cerca de") + } + { mnuAyudaInstr Menu + Text = ("&Instrucciones") + } + } + { Menu1 Menu + } + { Button49 Button grupobotones + Name = "Button49" + MoveScaled(2,67.1429,6.1429,6.1429) + Visible = False + Tag = "48" + Picture = Picture["imagenes/inter.jpg"] + } + { Button50 Button grupobotones + Name = "Button50" + MoveScaled(9,67.1429,6.1429,6.1429) + Visible = False + Tag = "49" + Picture = Picture["imagenes/inter.jpg"] + } + { Button51 Button grupobotones + Name = "Button51" + MoveScaled(16,67.1429,6.1429,6.1429) + Visible = False + Tag = "50" + Picture = Picture["imagenes/inter.jpg"] + } + { Button52 Button grupobotones + Name = "Button52" + MoveScaled(22.7143,67.1429,6.1429,6.1429) + Visible = False + Tag = "51" + Picture = Picture["imagenes/inter.jpg"] + } + { Button53 Button grupobotones + Name = "Button53" + MoveScaled(29.7143,67.1429,6.1429,6.1429) + Visible = False + Tag = "52" + Picture = Picture["imagenes/inter.jpg"] + } + { Button54 Button grupobotones + Name = "Button54" + MoveScaled(36.1429,67.1429,6.1429,6.1429) + Visible = False + Tag = "53" + Picture = Picture["imagenes/inter.jpg"] + } + { Button55 Button grupobotones + Name = "Button55" + MoveScaled(2,74,6.1429,6.1429) + Visible = False + Tag = "54" + Picture = Picture["imagenes/inter.jpg"] + } + { Button56 Button grupobotones + Name = "Button56" + MoveScaled(9,74,6.1429,6.1429) + Visible = False + Tag = "55" + Picture = Picture["imagenes/inter.jpg"] + } + { Button57 Button grupobotones + Name = "Button57" + MoveScaled(16,74,6.1429,6.1429) + Visible = False + Tag = "56" + Picture = Picture["imagenes/inter.jpg"] + } + { Button58 Button grupobotones + Name = "Button58" + MoveScaled(22.7143,74,6.1429,6.1429) + Visible = False + Tag = "57" + Picture = Picture["imagenes/inter.jpg"] + } + { Button59 Button grupobotones + Name = "Button59" + MoveScaled(29.7143,74,6.1429,6.1429) + Visible = False + Tag = "58" + Picture = Picture["imagenes/inter.jpg"] + } + { Button60 Button grupobotones + Name = "Button60" + MoveScaled(36.1429,74,6.1429,6.1429) + Visible = False + Tag = "59" + Picture = Picture["imagenes/inter.jpg"] + } + { Button61 Button grupobotones + Name = "Button61" + MoveScaled(2,81,6.1429,6.1429) + Visible = False + Tag = "60" + Picture = Picture["imagenes/inter.jpg"] + } + { Button62 Button grupobotones + Name = "Button62" + MoveScaled(9,81,6.1429,6.1429) + Visible = False + Tag = "61" + Picture = Picture["imagenes/inter.jpg"] + } + { Button63 Button grupobotones + Name = "Button63" + MoveScaled(16,81,6.1429,6.1429) + Visible = False + Tag = "62" + Picture = Picture["imagenes/inter.jpg"] + } + { Button64 Button grupobotones + Name = "Button64" + MoveScaled(22.7143,81,6.1429,6.1429) + Visible = False + Tag = "63" + Picture = Picture["imagenes/inter.jpg"] + } + { Label1 Label + MoveScaled(1,1,12.1429,3.1429) + Background = &H000000& + Foreground = &HFFFFFF& + Text = ("Jugadas: ") + Alignment = Align.Left + } + { Label2 Label + MoveScaled(1,4.1429,12.1429,3.1429) + Background = &H000000& + Foreground = &HFFFFFF& + Text = ("Tiempo: ") + } + { Label5 Label + MoveScaled(0,61,49,5) + Font = Font["10"] + Background = &H000000& + Foreground = &HFFFFFF& + Padding = 8 + Text = ("PULSE F4 PARA COMENZAR LA MISION") + Alignment = Align.Left + } + { Timer1 #Timer + #MoveScaled(9,19) + Delay = 500 + } + { Timer2 #Timer + #MoveScaled(24,18) + } + { lblTiempo Label + MoveScaled(12.1429,4.1429,4.1429,3.1429) + Background = &H000000& + Foreground = &HFFFFFF& + Text = ("0") + Alignment = Align.Right + } + { lblJugadas Label + MoveScaled(12.1429,1,4.1429,3.1429) + Background = &H000000& + Foreground = &HFFFFFF& + Text = ("0") + Alignment = Align.Right + } +} diff --git a/app/examples/Games/Concent/Blockhit.wav b/app/examples/Games/Concent/Blockhit.wav new file mode 100644 index 0000000000000000000000000000000000000000..e4b4834a8ffae709a298b1c951a845f2e1a9bfca GIT binary patch literal 1148 zcmW-hNsDDQ9K~OQ3l}c*8`Q#`(5O3?qFqoT3U;IG(xS2Lx*03Oox)A-kQ*}I_lmOn z+nO>V$$xS9<#00mc5{9G@X6`)$M?U#dfPl)eSSKfUex}@SEv8Si_@p4x3_;iOHQBF z>F)O7_IcG9J$+1v@#+X{_!y$S=drH zLrv&r6XCua&|;1`20=+!xl(DAKtQwxi+f`X>}_x{N!a>9N$FQY5d=Cbyr{)Mtq&a) z3|z!93Ge;=y$)mx_v3;r>M`j{vZ#>OySG|{Cy|yI=B_BWxq0>X4U}=FiCrXh zS@0tJloDQhw`f|HWRGKr1ID-vlyc7lqapKjmijP^isQ(B-Pb@DJEJ~AuVRD%LXSP| zgr!Hp!309*lA{bFCPo4QR>LVo42Ks;yGp&8|zupeT8CX#?%y-A@a-)s<~ z#3oF0SG^`)T0$ASoJA=a?9UKA)j%g)e zNL8+L#tBs!i-Pg9H;2rm1Ty8yN7SnH%tqdc#zEltglt9-w>j0Y5T 0.0-3 +- Correccion de bugs, se añade temporizador + +* Wed Jun 29 2005 Jairo Alonso Badillo Bedoya 0.0-3 +-Versión Inicial + diff --git a/app/examples/Games/Concent/Missed.wav b/app/examples/Games/Concent/Missed.wav new file mode 100644 index 0000000000000000000000000000000000000000..9235541ecdd572be9434e15367a828e66f7f3c7c GIT binary patch literal 15612 zcmch8X>eTEm7b=OAE{KO${Bm&Rkq|s`$)DWQ;TJ3EK`;xQQ}U51OXDel|{ zpZaY1rHcn1|KJ1hOW*2S_T?K#AAk1Pqi?+BU31O--@WqV-#z*2xihc*{>k1Omabj$ zH@C$vK5^uk4=!%I>h5)Seflc#($j~&|BIhB@A&G9W!HRq_1Tw>9(wWJlgqyHK+m1m ztUvYgiP;NpUmUvP=7;Y5>@Ds~&m4Z@owuB;uUoeC3)hZ5e(~s;*WNpE?-lnveB<9d zF#DrZhc5o=h2byXvFh$m-5_3gdhXntZ%^KO!-|Km`E>u2FCIMnz5w+(Leoh`s=r>S$6ry zA3poW`6u50Z*LA>d*8;pK5_l{ThE_)<-h#X{%_pYv;4}>k6if4qZfYt&p#cy>HhWK z{N&eb&tE$C%J2Vi?zSas)?NFl9p`@Z*o6=N_}a+dE?xbtPcHFK{otve{r2xqfA{)( zR($o!9n+7W|Ka<;c{8~6YfJC_;*Hh4r_cT5gI_-JH{rb00 zZTj4G_ucuio3umEzVyyN{NZKw#xH*JTc7!2cF%J!zy87RUk`4$^3Hp%ydv9v{N=ZP z_4jYit-AX9JFdTceQ@l@Z~XlIx6W<5?yB3q@r9+%{uf_+`~7!*=zZs^Yi_^#MzQt8 zYj3~z-YW;zUGtf1Z}{SdvAG|<^7i{bJs;fvxli15)7SatsTW>;{nZ~FDc<*)&);_2 zO5Ztg@r6szKCySllFuwz_RWn|_taxgJbC_HxaFQ}zq5R4)(>W99=&k>RHSXV>YFQ8 z6(=*3)$-Ao`g9(m%2FI_xi-GASzWjFub5TEQm z{lk}Dy>!;P@7v41cgyWt`1<6jOFw@7`LpKt?!JHNbvN~7yvavi`svSJeKvgX+shyL z>J4j$t?^SY{N#<-UKn3~*Yf2zf9c+x`uO3C_`!=a{dYgKdg(QHZYebnU;Ob~Z@)6P z{oBhP`n#+Dc3q~r>-_8Qy!Xb1dhhaO-?`&U-*{kT?9|2Ae*L>Qj}|ve5?(|GVc~ znaw*^FS+vbcWtr`KmE$vzj^;DcQ7Mwyy34ezh|?y@BEK{@!roK_4AqR{a1hT@~>^I zpFMx!jo-a-Y?!eILsZ}EqN!OJ=f~%N%qCP4{q4JhX4M-vON35srGPxeP45U-KNbC zZ96)b%S}IdcE8qV&a`rCdix(*z2~@Enmm8@aC7Ijc-re--M{`J`)r(7k3M#CpS;1H zO}0MRyXk?xLkDIG33`+{o-K4n8W9R09-WA&?Cq;Gli9@rqjY6gAkF4$6*}qPjiPdP| z;kiTm?TlS5@5q!k+`V%0Y>*F6oSvN?6Gojt-Zrph?P~7eY(<+sG`080_|T3pDXs4x z>R-G+=-)8# zlOk6&@Y5~p9_kPGM|^ee%!#9in`O?{hkJY1+;{(Idn%~zK6(21kr}@rRr$@UdU|`- zXPWz4erxW;$)o$d0$1hxHuP^;wLV{;9PIFud+yxH z*}W~bq$tC^J)8PA?a(HsoAKD}=`(XdF|WxZJBPNee0adxHD1*xPo13EvnLWnLmuwk z*t>r9R&QpPW$!<8Vs>V)n<-TIott{rtl1(a?OJWu!4oGBPe)==t&D73)7!g#v$|)d z=`|0WI6Ak-FN~^MW@FEmf&NUeD|X`j2WIx~-|dTKi7$>0_OD(w6iz3yI&tF6@!1Jq zcU*aR)A}`Q)($Amx)sbka_-E@{T?Szh|dCQP-7t_5gl9 zVRB|@WcpFAYq#1hPcn8NIXrt{u3ZtTRbgn$rVTxtMyrXd+mnY6&&(a1s1yxf-PY5K z8X0jLo*7Kd%*`G;FlLCBD-ZVf^{!tx=+rIQojE+a_t4Qvl?(mywt?-NR;}D=)hyMX zm^pCxsGAKyPjdx_RJnUa^l#O zqq{agv~~0Phwfj`g;hb{jlw#8{!Cj@suH4F{qX(EwpPazCpmcf=;4!RW?f!03IqL{ zd!h5NKUuE^GpCQv9yv2t%?c(rv}0S(@`rjd&Ujp@&YV4Y@Yv}YE2r4p)(t)D)~wzz z>hFq;@YuOSyP&I=DO$>4-{vhF*Ype-jlc@`9i7{E;N+2pRMy0ity{MAu3p*4H^zK# z>=5KTc63t9@H)4>7nQlLXV{&rJMn>&b5r||9fKaM=O>5_N_YxHuh!giLt8Hnw^=N+P}Z43}tjZKd@yaGq^2dO|}iYxqm82cF&Bd zBL&whZ{1laY}>GAI(+W!obclKeBa)*xXgEI1^K?q%}3}6tZ@$ zGBPU5nXNndsHNoe_Cy$r&rBtjTurQEj^}r7?91syL9gGenFiX+>% z4HZmJx0i!ZQfpHajn>rOU5UY)HGOob$c=2-mc_gf z&16@rF}7#_o`za7YwGZhd}(B0+lUhTf;B$fjGEK?CnBBG{R&X!?6z%#e66O~<9q5s zYwx~^#K?11y*QdLWQIpFTsUTFeyf!<#&)&qPMHr}ZZIbb!vj0YUQ6Tsv36A7wP&L4 zibXq+v$;|sn=9n_FcvHEu2vAX_e|E!vRX5}z=%Cj~}+q$qL2 zJ2Pdo8Sz?uJaMDRJ?+pGl)xm%O$nhr4!1PJQp*wkPNHNXcX?S{^0DOF^vYQ4)o%$+3D8 zsbwcrN@b}$I-1XAxG0v?pw+6?T9dn4p;V|wT0X-|#i60mypnijtu~efNqb^^tR|P7 zKq;0aE;BSdnv-h*G#;z_$*!sKdZ-H?0x4AF?9Sm_fpa2Rt+iq=nV1@HB-OI)n?j+? z6>{0^$f(|SIWrlLgJfcNyB^4#%N^P*hNdPV#NB$kT7jrM%!pvKGXV7bT4Z$y2zhr}3O3monLWwrDjh-ijMR5H}i0 zBi0I9Xi0oU74o@4CM$=2Q4Zq3iQ8k%X2X{xuc}pKE}Q2#l#E$73wmuVcKyagyAj!F zKwB#DGGE9R%f+&um_oHy_r17PuO*4i;ny-R$$Y6)%4Nz{qL!?v9(ZA+-D<`rXT(*R zlN6ztD;5hS6~$~sjnJ>Pnn}G8$d$m6%2I_dJVRs}(^IC81Qv z7fNyv@Uj<2wp$;oN43}%^}y9+MdpiTfiGl=w$I}*iaoDZZ!}s>ucFt&N?A}8z6b)j zd?nC0!;eEZsJEJ}u~?U!*pYcz=5qNW>P2wvlHwnF`-bFA%Gv?x?LQB{hWTmhGE z(XVoqY8(eqa~xA>%tz&+$~j5MqsMb2xk_XdwWt~Uwf1O~dGvu0 zR^g%%yU`emwcUrr!}6;wpuSIQ+xDr5^hm&=SQi7i@QQVZ+NCUV)V8JvyTljo#Tt|*i< zqo{GGgjf^QN~_UmH)Bs$16wQ$6+Vyt%V+ZiEz-(1s?9|<N zpUderRj{K*EsPt@X1i5Ss)7+&d_kxPkc=zlMssGY@iv+%sKZLV)v8x{EvgDd9(7gZ zxqL30!vuzv7+YG6dZXDuY0AE*aAip>etfRDBHC1v$tyEUz!YIw8>}VF}sfO?yafEC((xE3fkx?p2*i=M^WplZb z9%@vdQPgZB>l4VBCEGsDO`(`CBBw=al)x4As8J7N5zn?n*r6_YQFCnlN+$q*Z&>1&uhhz`v2 znC$to5t$Xgj33RO&cwNNPYxaFA8EgkF?=b=gYio$3BkqdK|{BB#L8ftyP7xfwLKg zO8Jr?32-fnidVNQK6)Enj{3x51E3(|=7>uU53BHsry#0+Y-(Y>9{Jc9h1gd^FG#k* zK@YK5D2oEmal9z0e$CK>1Oqi`)L;=NaT+O}QOfhOfH{VJJP+4u5E~lRdl)B(q!uD* zOAu{KD51ql$OsS55V2x~)ryOf_akJ6LctYA<_+A*&>DzZ6v?$Di;5o`YJhI^l6De? zh&v2zQLrq&$cvc7g2=%pFG;dhb5#fQ!dfGVunWE&T~ewT6tGq-2_h)sL>470_7yY6 zDHJyAK@i2YFz{?ev~0{}Q79Hf1$s+3n|VDB6}?uEgRq{!VCaW&SXBhQii;SwmLR$W zrlKs$ZfvO@=moWU6h^c{&k$rsFJssvesBO!a&Ja(pCF>Jk@!K3$sY!;%ByyTgHaww z9pn@xN#JECab+t(hTtDop?wIZf>FghMpdBqNOtUHb*VUD=|vP2WC#Mknl=O{3T4_Z zNTMLg5-Q27*oZ%fD6%NP(=%m>dI#3H5--6ft}c>PsYZ_K#I-1hk{b5m0Rk1#uq05V z$jP}N%Cd-Ccc^J01n^NF0a=BtmLyrUSCV*GdVQ z1zAMhtZ`L(ta#kkxl4GDIxt*SqJ@3m^`aW8g%zTQ zXe*Kd`=|kW-%6921eGhQZhKYJAxVM=vk}~Bd5(ds=-`i8g1Lk3WFEOvEzdVi%BYX` zZ>gA+S~$?`3RMi9c0?+zGDWj|09Y}i-bqhv4^YF3sM`vrInGjz2#sx9+m-VbqRan z18s?kj-}FHnUM?2^jP_$poo%FrDbUnWsiy*GXw}#sX!+Uf3RlaqFY?o4`@F*vF&OV z>CkLdKvknB@WP@XCz??WTm$iY4$6=ibr7~$k#(!W$^tV2OQ~qOhDdY}Lkdw9h}vUO zSF7+*wJl9iO^wD6ichU5EPbkG=&EL-u5=e(9LFOsY(Krgje*?51ICbwI4bjQOwTn; zCM>1}1J6G`GC447vd+)Q16_9E!)6F$y7*O_QL$Izv~0z z+IZ4N7fDRrK!vJpsujyp$PW~wEOwWsnXaQ7NQpz0*Z~ng3%aS6j$UQtC?M!Yjx^n{ z;Hb)yg4*gbLw;;aM{IFgJRq`2A-4{hsnkQVmKtq29ma>+5trl@x?@qnJ6@X z@Io%|V2xqx6{D&%S7?P4m|`d_6G*rMON-=o=t)qZOnf@WT%}r&EXk4twHy;DxPoya*a1>!8LCl*jJl3wpji!PKal zs*afocSsr`un2@Fvj|O4QpA!S7K|v=MP{H2`6HGnFaX#<2OPgbWl<%<5y5B@GPV^G z8KPLIDyk0h#ayxSvVgP671c4qOBWeIcs9bLDxm^n+LJ%#6!Ec?Q-B?kG=AU^1X#)m z({NH3lw5n zFN`U3$CRNEsm!{Prm0{tQYtVRNIKGVfhxsF+L)H1nQ+Lc5-{}#6uwQ9&qT#$OuhL7 z0EJ|k=!Xt6%?6Prf0&+>Mp6ew3Ox}dJ2_bCz#XL@Rl_=oDU%|Z>n;*xNz+A0BHKYC zCRQ}Su`>Z0!KbEGE!^{HsKY1SO*YfO78s!Es)+{*FI8y1e9{={+)FuAF@r7=&z!>Ne5@2GQray%a+`s#FvW50u)|p=Gz2hTvH$m z72_MnANb;p&xfHXqZEp=VNgPMk(dU!DbUfxptyMuV>l(ZC?v~3Ezr=Xnqw=4;uSx^ zOvdGih5@-Gh4CaPt}Lcy8aU4uVHvXP*~U3);lzf-xEm5a^-Il$UNepE;9?`BqjAc> z!A;3xSA+`PD}iTl(g~E|mr!pqJ6=fvoIV!j5DK4hPE}@ca-i#OV%)3 z?CzCKNt4vk8CPAz`w`EJkcik+>GH9_y6c!&cWE!q6GNw@$#beT%W+DZ5==1zY#>t$ zmlif82;BkWs8?{qq9jvgq%D|Ea1sn?8g7g9rctrr9YJ^Qsh!fAugflR24@Ar1W&Q_ zIxiWWP|Ppfv+k$EW8OC%J8Uszw0-Gi*-$7Qbn2PF^Py9TvMVOF1w&J@u!e-@Y04I(2}^GcSW7x|Nx~Z= zqE1EDX=wbDWo!Yxcu3EaN4220@Ua1*yM38XY9<@XWquwo=Jc`%jq!(C>vRZ>1lDEU za-qOY48VnH(v_T54r@-srg~w}6y2?JfZ-kEgy76K6D_qsjZXIkl_d?j!7+QohNP#F zGc<~gIiF`euQ^QGC{|mQXqvIN#B4IKQlD2norKK!ya{{**HkfZPBWjq+5L#@piY%e zo|OvbD~b%=bfkZmg=_PyTgH)FLKWE&4zg=atfVVWg%${ z*m0i9PH$XLF}TangrUTdb4q##-EGru+zWjM=iQ2-fu5FY7fl}skZvD^FRB^2G-bg8U*w$f-PNs2oeraqI$x|C$&SN_9ll*S0`I~UFYmf`iO8Jikz~> zPQyjq7e)U62)%oX(~SoqceyXB_CF&##gS&s($z)NIn8)_BGRd}s9qQK8dISIXGa5l zvccLUtyaS08bId~%liDel7_wDoX&FkyocTqA=z{;QqG|qp;LJ0#szm>(dN0cs{p}~ zb->t}jJ{31|0$eV=)4eneE8Avp2A5z9V}wo{n_VF1<*l?mIUM=6?Q#!J)lsn(3Wl zv3trqWe)f>_-+85a%EQV8$_?+^SCa3)E)UxPly!WnX?`IN8m(Xr_b^}RJR@Yf_n&+ z(k6H}@x<#-!Y2iB$zbf~{nJJOQyX14T}>H(J>{QDPvUiw-wB_^4`_!$%7b1zc$Pkt z{sJBbI&EjB`q9uyui%S}Ft}}*OaS)Ij(pRT4Xm_n8J^|_t@#ibhYlVFG}C0|%fO2a zQ2gu`pKeVJEHGd{g>4ux@YyZuKlPpxm{*W0s6znQg)qAQ5dtJg8L-Y_64KaXgNGQf z{#|5)@$U!-GbsbAVJHvrsQp+8bV`uLFwcSfrUqF15FT$Q@g|Ek5i>vvQU}b(z$kPH zkb!O_?0fv8LxDi^7Cu6O$?zc?%m}kU9MU{M#*PJoV|4~-M}`F{8E!#?)B=J?69Hfv z1T#Pf08W5T6lpP}e$#|>q5ubyL8Z?_71A~it+aUqP<7jYm9BqbiC1AD)eq84%Z^FlByj08o&l=v_U76h5WBFp56ksuvt zEm%lr3uSb%iB5YhXu*_7O%Rrn$`+!aiue$Vg|c8()#U*bETf%#EH<%_Q6j;Jq~z0C zmww+VOuWxQ5>o~#i!>dJNPHv|uwX=(8OkYS#fByHZd}yNeumCJogG{)OKl^XxE>gxjRiAgk(q#|#A7j$c@tC^ zU3m8^0lSNShAm(WmuWmK5c-zowHwQyvD3B3EHE4C|LGQ%s6o4nEYO05kFJjQg&(Io b|MKg?&cFQKUq=7QZ~lUjKiT*H_XqzMIE7Em literal 0 HcmV?d00001 diff --git a/app/examples/Games/Concent/Newlevel.wav b/app/examples/Games/Concent/Newlevel.wav new file mode 100644 index 0000000000000000000000000000000000000000..7db791b441d037648f96cdb810c4a480846f0b78 GIT binary patch literal 19842 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 literal 0 HcmV?d00001 diff --git a/app/examples/Games/Concent/Paddle.wav b/app/examples/Games/Concent/Paddle.wav new file mode 100644 index 0000000000000000000000000000000000000000..38ade2780d4d1626c6a8ac84f92ff1066752393e GIT binary patch literal 1754 zcmeH{OK;;;6vsUh8nJ|Lz@8;5SRk=r1Y%}`Ak(3h+GNtCNz=ry_}ab?-|K5Tb{yN8 zH1(tpI&?ZP0#Oz)AhAXQ)-2fb8CbAk!Lc(uBqa7AY}xnkbC0j=bN;{k_M10u{BT`S zZok%ey>no`@SLJ3*Wi5qMWw#3DbFgM=3Vm{h+jZnyJgNGO3pcDJirXo zU`hq{JsA*Y+k8I65zk}B5E@(d5acif!y}h;BXl&fM-Rx@eUZ{0v{;oh zs`d5_k(Fg3t%H4yCW~beI_l6M@%*p|v9208%;s50Ox?u6G@Ay*GAtsKG?v5~BjQiu zNDyS%#E&MSppNZO5k!HYuH#Z611T8Bgb67nX9N`Yr4M~0)Z@MnicwGk6laWq5(0V) zs*;?q6?C|2cvZyTRW0k-I{Ft`C;fl>Z&sl42H3>+J<3ENJ+Ks5fq}z>=Ya=(>bleu z;5wH;9*5K@4t;n8I|dQF;Mxcw+aY2y%kwOqCX)dC=%TSXwjk~}7&{0#goo34d3Juf zOgu}|Z5~F|+OTMKz{1oWYpQM-x~8g{K6Y4`A3yr+tFNDYSfEzp&K^5FKg)6Vy^W?8 zEKkeC?loHnG+Ui40uy$OHKA1P^>uG{bd(8eIM8rZEbkz9>@Z8i43}9_fb7<19;rYZ{1!=`8WFWg^%V(?k*kw8}V{NLp=wP!#x` zn$|D^ZfjbDu;v#3!7Z+7h3b-uTi@rb=2if#9<8~pX#JDhT2nh7p^LJTQ9I(Wb|lL#D;*L>9F&zTDJxl4 zl!9SHWW^GRtSE}D37 zPH=ViwQKE7Z?A{D_5HJ(=##LIzg-^fR65c1Nt@RP7Z;x!Tkh;~(b}#aF3$(`@@{xO zYq70vwCvXnYq*?x<#Ky|+OKJ%e>(9@V{Z}#qQnnRAlUpkS_Fc!?tJVSv~e^KMA7U_ zAy8|BSs+xsH4Z(4RC?2(MoP_5*fR3l2NMX?re9UFsiZ8+$z(E>N~P23jSYmd*<20- z`9h&URG?U-l$J`HfTn4>t{aA70%hO>Pywn{xByJ$|7IQb|Le)W?f(nt;{C^-{Y5+= z6UMayzKnBjIgVu#qM1ZdsO|d>r-V>YP57-5YuZuh2PTL{PH%B$B1BLym$G9fG{u5iudjL0$~SWz%R3bDgQ&*spO LGiK72{!gdhd3 literal 0 HcmV?d00001 diff --git a/app/examples/Games/Concent/Wallhit.wav b/app/examples/Games/Concent/Wallhit.wav new file mode 100644 index 0000000000000000000000000000000000000000..858bbc32ed3fac0689ee3194ba35e0ff83bd2234 GIT binary patch literal 768 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 literal 0 HcmV?d00001 diff --git a/app/examples/Games/Concent/imagenes/an1.gif b/app/examples/Games/Concent/imagenes/an1.gif new file mode 100644 index 0000000000000000000000000000000000000000..0fca6237a252997af37a9d221464b304afed168a GIT binary patch literal 1601 zcmd7P=~EL27zXeSSs=j$vSBkQEHor*6bzU^RKTbqEcfDIMJ*T=BwTIOfYD;hv>_}J zNSuj?q7n#ERH^~NiFi>A7#O6eQPFzD84t8*vBsm0wG@l}EBgEJ%roz&cjie-NsNxk z4F|%3K?0aYqXHoG9|RGBAc8>1XDEbD2SR`#grPVDV$%l{L#8_dicp9^AQ1-PD1`C( zDhTBBF%ciZ`A8;)5`2Wq8EM-f~sl8MBbV!lEomW%mvu}qGORAMnfWLhyyfvZRY zSI7t>L6plfNkyhgrK(qutqNJaN?xzhlO$;@Z#C-6TlIP?skhXVV=Bvt-e|E{tX6A} zwROT`9kW{OcKfK^GSOq5w2n@5I-QfFW78(boD&lhpZ>=}rdaW%`MIimIs4mURS`S0 zD4(5_lAZzZKTq>{B*1e@O{W3?Rl8FQ)#`K%FE2V>zo))7lmOh}Mt67WL8Afms6J9n zQupc_8ewfydwa8~%a6msc;_#0JlghJI$GdB3}c<@>|%}h4O}>n`H=MuOe^d+ct6mu zv*{8%@?_-P1c_f&=WG9OYQ&tbuM*Zn#D;&pZzG2|~&fS$s)kGlk zOt!dNL;GRf{Mmr=;c+uOCzEvDq4cHu18(HLZ?+Xzc(tWNXYDzR2s$7=JO1$TP#sqo z>>Ml682Yy#-W6&D!hcorYQGBHs$?h9c;naa2S<_#)p2Hj9@K6)(ek#0u;%Z_b6tzFpAU#iPP4S=>u?tFtHrL~%AX0sa zk=&UD!V(B3&5EX3E5U7EN_s@ltU9A9Mx~`f+;MFBhpX zrq{-yQv%U1l{4m!Ip#Iqe*Y2ZJhs^tOxdSi;{?p!Hbpx=Cg}I>)ug`cxZM#5gd8l2 zAC4Wk;@3x=ZO@oz{+OtBfKQ+t;m;jYRq%arXyj2;o4`0cBEq>u z_2v%Ry}KP%OBeUkV)WUY;8pNpb=ocUnSDD;spp_kO5Cmb7M z7$w_h_$yo#xZv$~VM0Ze0qCLaS>WyNXIQsz7%x}${bq_<9)7ZTixOC`DZ4Bzqk^_W zw7i1hGII^fVRM_IaA>X-?@^;6M-w7)c}>v_X(5hXkk__8NDAlTc{b*qhj*MqIah6BmQ}piaOqa0ZKq} zFOg0uJE?q>hr;99$mVoKQemz0Z(fOos+nK$<;uJEh-Z5*|FubjV7j5$n+KlncVw|$ zrZDRWy<01-6zwo(OYUTvIu1+Qn!Bh&c_+RXA B*j)es literal 0 HcmV?d00001 diff --git a/app/examples/Games/Concent/imagenes/an10.gif b/app/examples/Games/Concent/imagenes/an10.gif new file mode 100644 index 0000000000000000000000000000000000000000..e541a123423dd4dbe95ecef4b01f4991f1730fb1 GIT binary patch literal 2209 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 mzp0#)CB0GiNOO#ZpGIi%9fDRqH(1YJ7 zYj3U*(i$)-MYLEi5^HMNN@uE8v+f3>LyHdDY;`TVh@2ffWu2a}+4V5CxW8hr^E|I} zp6B`TeI9E?neioOHpm7yt3U!F3=s5x;J5)na2&;-qej&U;iyJ!K@p7_MKv0=T7xG> z95E!08V#=3*b;ZWUZXc8q)te0Fz79b))X3SiFIKDgQd_=V=>rlHQQ{Knr$@=4NXlg z+ge&$n%WXHcsz;nwE3RX=WFZk?)LTd4R(9_5)QNl0)f84(BR-;C=?2Z0^x9YEF1_& zpA(A?j*X2?k9EglvDsK?HWr?ooSdGXo}UiS&d$!yPR`BE&CgB$=l`4Zg~jIAwmVz4 zHxT=GwloqojoS%p#X39CKab{lNIjnyW7&^{Gk5;^G3GAW04~D@yeR6_hbItLUA) zOnH)!vJ_KSDlBX~-`Iiait@FYnFNM_TUB|M(yFTbi`oLUT1#3Px;)-F>J?>r^|xNF z_s|NXtuf9*7Lh8a92kcJ9U{D9&%fhtGt9$vZ_l}&rc=i=WJ;5Y>~EJywHpd;3ONnV zifn}kTmz51DMX3()GJel6+v?hbSh( z7fg~D?~v8vFSCzDbXie zignGuFMQT1smY85M+B{QK*%*2Zy{K?T z&_3K*-BiWJH;Mq>+Ni)5Y=pZ}JLaGuaBsg(@l-W54Hv5)GJG}5jw}Av63B`oV?&J! zfzBR*`cJuFgpc@bMj31el6)OG0`kaOhCj9MM2Ihk9b8#4gi!$VY$}oF3;%j)6Uw

lR-^*L9GJzu3aV?4*s z6g$ONOGrwv^$nLomh3yo!J68U%`!n~=-y+wFMe5+E_DopUh4h{fP-i5zvKq2U9F^z z<=`?uYeKd2CXa|`+-ni#F#5J&Mk4|0_kR6e{;s^>eprmD%)^R>gU9c|O+54;X7Q2F z3f%Ht$oKwaVXQ`~~S0R{xWFgv~NBxv{KrUPBI)ctyL{|7t&(uk`eEjF+{ZmL# z2;9s1I6lnAkcIu84mE)sSq<@(04(?2s$O#SjQH=D`=16JIq+x%F>w$VAfQ#{B~rxC zL%L}S1M8}B!lUHA+t>2=E?UPi=XdS`E3pXhyBHDX0LRM9lzWU9UuR8QUp+)CO6)vz zz7%?61qa1~z`G8N7Dv7WUQ%eR{&idq&V_r+IbnrNV==>wxgSILYT#Gym!vqahp z!Og3?u$;^}&`GYQ?7v!=;$7277GbbSF!d1bB%HRQ6b@^}%^9wE=SzT-w6Q8F7euh{ zf$X@wD_IY1Ngm}^yiCxmKH!9|Bfop(ag>dVoc#4EC$IvN9x#2|WS)quoT~5rGhsHs zx_6YVCA^HeDEN31lD3fuKUxpcy%5iZT|mY#=&s{W@?9(>nJWk9B0l8~9=%jY?NfON z_}fTN`&#z&8k%#r*cpjF4xjiTDrJUFik^r7E2_K3mLr+HNx(!7V}N893nQK^)w?3u zO%d*KAT!>c+e$W|>;rsaltUPAr;^^;2S{EjwfN{jl;#0Pm?+Piu1IX?|+PT5e!(L^puR?rugTuXik`{`e=!9ab1THmJN2>R|}c-&Xo6xVl^u^9-?c<<;Uc)aps29Z0be^rdkbD%(f9woFv+nb>eh z<|hyVNBvr6fA?^>lmDqnC^Y^6meghp&8+*V^;Df33v^LQD)%prkK;l-T__16vfG>B dv@szM$cAVE>UiJ8HEHeM;-YqjX9D2m{{nb(fu{ff literal 0 HcmV?d00001 diff --git a/app/examples/Games/Concent/imagenes/an14.gif b/app/examples/Games/Concent/imagenes/an14.gif new file mode 100644 index 0000000000000000000000000000000000000000..8c218ce0c877fdc92c0574884da7efefa5321dc0 GIT binary patch literal 1924 zcmd7P{ZkWn0>|<1?j~UqHn4%<#Sm~I3*jMjLWnIw+HN2`C_#e+20VHVB?{VjrCwUG zlXf-_MX0F+43DP0pc#>aR&1FT$BcwPJ**i@<-yvaSFqHogLl+&N~az@yuadJKfLGj z`=?-Me&&wqG>`_a7J*F+2FAethrbDX8ome+k`8w} zkBzW#-YG)ZCv2BU2sVoLicbk$uFme$9bM9%D8kzkHGE}&JQpRFN(2nHcsTl#&r-g; z+UdJA*53KWD33>`ON7zFl=NZZ%GG{J+NF~t_b-I9g$Q6<5tjG|Jh0m{pj9m<7l^?t zZ%s4{*$kKg1X_XzxL3EV3wbtsqcuA6P({)}TW&K_K3S1`wy~%)HOGW2+SKq~ah1D? z8n|IaB^3_A{kkOpiOc6lde8RHoO|xjB+j@!(Zt}U+_P)hIc2@MsdQ;MMZMRdIePx3 z%Uk}|+`Lhi`pqvt-TvCDOL4r9hsKvOLG7z|^_M#e!ebAe{*s>4->|ScDkjz|%U*kz zDX_Kyef5vrKsNSRQ2bT_m)TorA*QFk$gjDtXq#4)^v_IK^G?Nnlq;pt+&Elz@YTHx zB3KSRk%wbqNLnu;h$wTI>$n+r2?sF|s4cRtBqy zDn!rIe#XPd-SrvY1KJT`xu@0WEgypscVp?+HM#q6U3{>pgQ%74f2B6~JV1pdswH+DLI|DuLrwxUO{)P)Sc^n%8Nw-ou{r%;^Ozrm zd4Kk(xamDN(L@e<14daJlYV4W>~-dxVBTCr!o81%#t%0_=|V<^cUr)hnVSC&Jd>yY zxlZ1+YWWNL7@zxl*1z(FIE6qet{9_=u5@?9w0``bGGTaOJZ1_nZhll5o>&tze2o{> z+5qaLTVPT^zZ@!;`MvYUiw_?uJO?_X_T&z`bLkC|vI-MQF_k|z% z>cOMg=NCSJA$UE$@N1q9d>WKb$E?+*DNbzXm3*gtc!yfmzRut!bEzD#So>?`*^G~K zLyy1xXTgH8r5tfbBs~5D)FQwi01WlCeYK~Lvd^gTF@%@3EEE1f%~Ajwy%umI-n;w!-+@$Zv?|}E3E9S zuCc*qYv^0SJrJh%1H#ktpx&Rbg)9jtbO^CR)nr#J-F@cH3m1bd23JeN&JxGy`I_XJ z@o(|Y*{!ej(nw_L?zS^G5=HvY=Eoc%DTbvm<&al(5oJzY^mFom3P2T8 z+r(Y3NTyK0a_KXXkui?NX%#jM97x;OimGYr)H1=$#bF%Gt#;nhgJi)-xqNMwu7fanplWGD6P>qZ+R;+l8q&3aqe5gKBleUQL!*=Xlful1rV1$27XP-4q1gxNh68D0Jo(t6#fJo8T1^aO+9A1{sIoUBB0ereLnV}k(ZUGGGgkR;_^ m+RJWbKJu_^2eeodFLeIncFMP~`EXG~d$b)0pi2}0+5ZJ}(=-SG literal 0 HcmV?d00001 diff --git a/app/examples/Games/Concent/imagenes/an15.gif b/app/examples/Games/Concent/imagenes/an15.gif new file mode 100644 index 0000000000000000000000000000000000000000..ea0ecb950e1b7678aeac55f015375022035b5876 GIT binary patch literal 1132 zcmbu)k5f{2008hW4}33%DB_Pe1AT%px1I|PD>m8ypZH^#9LLSvbceroTAF4of1sX- zg?5Bb&&-q(71K&x8K%3KV`5?3!Qd5BI zH0he0oC2LrS5R5mqBFPXtaWvD)=InCY_^*1R;zVjV8G#U%nZ1lPUnon?VNng?RGCL zEON{kok|L9Art5daV?GBva!WpYES>O(HV00SXXP`BOm@1w$639PS;&ebQ~gW09BqAr zmSg7V8;J_sH`vTdi6gb+qYDm5geLU< z-N4;2RtCTXk&K@5X%c4M+c_)o2bGe3NLouC1S|%m_L}yVmu)S;Anr&ISMeJ~wP=&j z5Pzs__IV!yj{GVHTE;PTSO%R72$IJ+%oDOBRxH`wl=o_!vy&6q9m{1|jHY-94GZ9;-z=uNSUl>_ z!8uj8Nsl^tNt-VRCm*&z39G`D@9`?k165ioX zn@<~+j~9($5eE%XQ?98=DYHPA>ctXjUFD4hDp{1hE8(12v3UTHnJQ@ryubAe$jg3a z*i_;1^#86_Xp5)e3FW$hDyUR}d`CX|l;2Fim=C{7mW6yQ9%GVyODVd&f&6+Oxq((d4b=TYB4yOjdm%PF*{6pJ2+_2a zFTKxtL+5VWFNMbS;8+7=o_ZvFC{|NPNjE`3SG23Xd2Hy}(CvsU zs8CJ9HxxYoyn&BHI7QE+#_X4+zJ1`B2mqgodl;=qS)$h`B* zv@V~LjR_);GU@RkS{}$sQmSdsb#%_|5s0AUjB0Xb=rOZ0^9t|MJbs|G|DxA@e)#)stOCX>fJY$YKPYN}AQVLq3`H>%Au$p|P!e;XkOf05B;v*plZmvLP=^V1 zlbFkdx=f^-LS2-}O__WalA%!M(RWz<6y`Ikd)Ym9A8ICiGY5Oy&YU``2tFUNqm6xz$)!&^T9LctNTs^U6 zVo zZtx4z>5MgI=!09&8U3=Po!+LxowS*9{?xA0EoG{;vj<9nap(jx1~ zB1rn7YG+L|Lw{_MgOi%VKT+wEQq(cCu(DseC$u*l8&%FzqhjmLGQCQvo%H`S> z{`~LYru*$_YYS&Y`|3!T&>Q%T_aq|=50ZRt{f#8l^cNnQ&#{%jbsly3ZEbMBj;8Uq z_RB#Uz8c#-CmL7QavLTeVbV57U zo#{&qgp?s5Sbn^5_(nR^T9g}niv7WUf{WGDz=UTWd;!xlrvuq=!ASb&u02O9bH)#c z+bDwpRM>9O?+y^*`M|;2<(oTuO3?tg#9}c{h9-upZx8;NRSl*-;qBfIq)_M8ht>wR z3=Xy~iV~=|K2MR)W}JUsM)Y(cDTyoe>3yDsa4^jt6U%CizmPkX>K)OWg=**Yoz#|( zze3*o{SQ?DUNB{QZM<&h8=GAA<4FXa`YdbrV z|J%OB4ry8jdTAt`Xzl~oTsQa*m&X^nUW9k%m4Q#@eL7>8+AO9j`ug+%7*JrN*N_#0 zp5AQ?hXZ>FMr_%;{A{=xPz(p- SO{X68hQp=Ter%P2K=Hqmc2fob literal 0 HcmV?d00001 diff --git a/app/examples/Games/Concent/imagenes/an17.gif b/app/examples/Games/Concent/imagenes/an17.gif new file mode 100644 index 0000000000000000000000000000000000000000..01402272d4d8c94fc23196110d81c152284435c2 GIT binary patch literal 1845 zcmb`H{Zo^N0mq*wdGbPDA3_L8dD#=mDC{0FcoBg{?+GM8Fl7;9DUxoXhRHNC&SlDV zx%0^j5G3?KQc5LOEDuaw+JWX&%F`|hX`o%UVw>wZm+cVKH%(it?z-8GF79vG=ZDXI z@4i2N@4gM%`l{;A?Z9>*+6`oYIR8VKf%8Pd0!~3jLXNCJmWc&2p)4brLdKDys0>wP zq(Frzs!*UxH7Zn~>P*sQ8f6BBTB*<}QMJ-wP@-lfYEUc8YK2v))aeXHo!X)+FdNhc zqrqa-*^CCOS!XjVy=Jw=YIIo)R;$%w%V73e%|4sX}g`FuXoYm0a-q}N3dM9gQ6_&g+G^Z5fY!shq;V}vIV2#^6H;ddnh9+D(u zBoPb5<(g`w|Or{g@bdpRb z6RA`xok~1<^yr8G6Vk2Ry5n7))-E%0@|V_b#L(S^G-#jI1L%`!o{R)Aws4Na>FOUC zbPr`^4Gr@7Ts|zKOD05UA!J9MeWdOYFTy?B{^!JmHlUun(PvM?H?pun;;ki~hqaD`X>euiu_>Hv82iy);eEZJZIGRtb08?IXsV+E zIVWgUFou2pVd;yhP5a{&-rP?QZ}u*1I2mw(yz$kd3*|VIbNni6{?B&jhiI!ikDp&d z=Y3JFheGfEr~f+LO`shXE^3ozIIvfW&Lq2jj8iUah%-{BNqquvg^ zPLl=cJIFN(gJp^b@fjEgD3B+TRRcouAi%eFvv z3x!>;4~?azTL{28sQ6MN0m!-_cQ=lY0ecD_M1;m>unVeXE*yj&(r_I5O8Z^&L_KY2vuYEf4!bB)YRg?k_VLsx;f$o7|(MvP)UzPyKn%N~BSwwS;ndQp*Y@Mn{?;yH*wz4|b{je;b!@d5vRD7)PfqKVC09u-~8`Tcrm^qnR+ zMU$<{UAfQcLTXm6LE6u3!Y;_g%}B)`nmY^&@8z02ss%~MI#LUqgJ6^{AU2nC4yr3O zg3{H`p5l*&??G^RLJ#G(-?GspnG=eNcc&9WzY5hOPJZhs`G}n}v@Zw7pw2p7Wfgc| z^nyCp{};3Ef|E&p`{MbPY+`;H-tYBA_&IN`yv~riryXqNs-}PGVZE1pUk zo

O%wjdNsOgb#gJp2OE2Ga?Ak!+>z7|7i%xvYEg${{^?O1q=WH literal 0 HcmV?d00001 diff --git a/app/examples/Games/Concent/imagenes/an18.gif b/app/examples/Games/Concent/imagenes/an18.gif new file mode 100644 index 0000000000000000000000000000000000000000..f148f8c3e7615a277b76d1942b8fd2420e676c37 GIT binary patch literal 1571 zcmci9`&W{80LSq!@D!vE`lLXYVUj(S7iw7#MT+fFK+!|S5>Mt#v1nRRVX>@@Iw-hu zYGM+{Obd;!l3G!A9}t=?Gdst5DLhuvZCS_Cj>pY(x<6vCAKpKFe*MJ6MsruDF9M4| zQ!hOuc(jE%8*0yYg} z3#2G>Vq)_qU?@*5<E# zwpm?avAWDWi^bxy3anPE%PPM;!8yt8RJF9U3^@zkEe2=1YqVX^-rhdiZg#m`qi(g^ z?H+aC?(gp(8X6k^-_0GP^LK4dS8bNFvbU%*S<=kSteDu<62P9kX7VIJ9@BtatuF7^ zgNO1x3JQx37wh$29$pCIRa#PhytvG0q*qlLk5!y0I*L@EI(dPPoHdl4F0s?6}u>^6mp)thKk51C?B?dEIfrNCGG~B8-cD z{@BW`YtR3p>|s(P1eR61?i|?&^g#*n&|4EpIfeWHSZtzALf7n|Eh?q``cH`gNp;O9 ziV_EV^K%zqr|c{oBTbD8_=q%c^1%$*8e_zi_qiZG%U4;YZ8}Jp2JfwSe!X(*%cgH& zme2g$|-p2zOolIA#IMLgHJMD>dW=? zu9x)EqktrD=a#F{OzO^K9I%00oh_pYU!@f8q=(Erv)9$h1E#oI}$?lz9fA*}>K0 zU|KEvodfdZ%m6@wd2KdmMeq|RLd0y5mm^gPNoF9*Is%qUN*a9@Fam=123urS&*+-@ zH5RI=UPoi9HObz$D6+gg?}JJN)2Vdx>Gi=p5uYkA?J-u{H|nJa;=d?E>loe+8#%4i z6!j#gVA12QbCrH;$ll06PC{6UpACtjIPji5ecOlnx^C7tbZ_U(3;ZKKC?^j~-A1|A zSNz6r#GSFiH$H_&VSyfH4*A-X?E9%Ich|>9!wJuaaP41>BWF+d+xYRfJ{XRBwZ`7P zwPV=B79Ri0htlEI-rNWObaDqT9lYxpYPLI|!Bua|v+>acXB~5>|t5b^u5dJR%;lrZ< literal 0 HcmV?d00001 diff --git a/app/examples/Games/Concent/imagenes/an19.gif b/app/examples/Games/Concent/imagenes/an19.gif new file mode 100644 index 0000000000000000000000000000000000000000..21adb25555637be4b1bc32575b7bd858c8e7b07a GIT binary patch literal 1849 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 fqZ<#Bj!b*KMTzW?4e8=bi<&zp%qh1;pQ&PYg literal 0 HcmV?d00001 diff --git a/app/examples/Games/Concent/imagenes/an21.gif b/app/examples/Games/Concent/imagenes/an21.gif new file mode 100644 index 0000000000000000000000000000000000000000..f970b811c335423f4cedea60570950a118df354a GIT binary patch literal 1720 zcmd7Pi(k?Q0swFjyBIWN=MM0t<6Z;{* z!(y=%ES5^aFo>v7DjLfOpfCbLX=FYPN8_+!!*St}thdS(_u_0w#zk^bYk&BYaqm40)14)79iB#3T;G<&y18H&P`zYmdzD^cgq)a%L zg?34OjagB~%+#)|H=9d*drI)u5ByI2IjOrezEP8T;R90pp)yx(Bv@N8QL)ugpW0tt zIadcCKU~*iR8ATsQ%$J8rqUar@COUpW2a1l?Q7t!H9Mv6jB(1TU3SLayjVVQ>G)Uu z?aPA+uLr0IjaItPK|ae0wjxBwvJ2%B3uJYKV`9cbgAe00)y z5hO>VUE~pur(HFFnzO%U#BMn`T*lwLcE6;Q6jQV8&Vcb6{C1GTnr`8bCgW{L|AHP}su@BeoIj2roJ~4f?9=h!; zyMJ3N`a-_98el~!@+H{WKOs-mWpG#XDZi2yfr8-GM7t6;>lULMX?_OWdfr30AtPC} zWM<2t-lVv}`jnkkHz-ClT4{FgUCBw~dfb^+mpOy4li&h-(%Y1M%FR0uFs2;Gd{Zcp zv1G{v7U6^t>R)o|Z}Cs)(4NwV2kQ3i`>hb%8=w*wHkEpt$%3gDO3m#rHpZ=)z$-YI zwR;wh3gb`Q#xW1ANHBqOw0A!g?5H_YmrCh#ky07ZRMltCvyazv2f_BTxCK$3tJn+e zv`HyW1M#<^F*0+`12S4z;j@O?PV($HIW76og703Ucnsfm8U*%U`qt>v_qjH^B`ond zC?O@nV+za}$sd1%VNTh^=C>7fQhK67)8rPBWKG{4UX@}eK$|hMq&BI{o3Z&e~TVf^Nt>ZlJH~K zIyJ}%qQvJqogd@v7ovwcQJ!=d#$k>OATvL$VG?#aL?Q@;5-);oC*)2knRbWQ43R+- z&B7V9!_~M`YNqeYXHVaOCb~cgJ_g=k!B7@j3F_O+JSQV%AXR)urw`A z2amWEpl-g;b27x7qU{wTcGX6-`n? zPO#cK_T9oA%nXuFiqS$6s$8knUYLXhcSSdjOn-K*>UvOc198bc`g4tdrq__Ov(L|u zenVWb#-C)LvWT0^^UzI=G%ev}6@d;s&Y0oFcd&sGgJ~~YboQ_7&4eOsh{6(h_u1mt zU(SC&HnLi2q;0%9U%736nmQfaeek~o?fT+~kJSGY#|=jY0rSrvGj|&Nhw~9vTIXSV zSZ5F@pgWbB44@v?_S68go$Fq<%R_Zfewoljx#Au%(PpOgq_4K S_!@LH9Qp3Uh9oQ;BKRMkt_>#u literal 0 HcmV?d00001 diff --git a/app/examples/Games/Concent/imagenes/an22.gif b/app/examples/Games/Concent/imagenes/an22.gif new file mode 100644 index 0000000000000000000000000000000000000000..6022f7746e72ce377d484360990e67595737aa03 GIT binary patch literal 1332 zcmdVX3r`bw008j+wb$3}T01PZb|6=&ObXR%i$bi@*O7 zTCgYrN{LcYON)$6P;8jn9O&^_Ej|)O*qky04h+7Q649t}F#Q<&eTAPPRUaFds{~5m zO91boD9Q=qi%?V~5=lfzxP*twL*5g~L&CA3Sd1SN$&ZYVSgW3=)yUJdB0a9$sz=tR zsj>~BxtqeWH)?lgMdxKD**;U2=gAB6i9M!_-6chiuNE9DG*p|78uXo_ORSk{K`gkkz01{m5 zK7ogaENIZF&NxomnQo7`0|yPCv^Q$wd+K8jKs92~ywgCoYF#5AYLIa2*UAwJ5-wcP zBd(lZ!>)pvFm>Fq`k<8+c9mj_pFd_Vb5erEiZ^c~#RvqZ1$@;Qpn9!r(L2A9$ym2f zD08+ECS9*pqD}yvokO+upyWLP7c`^?;+P*aTvFdEd837mnw$t3C1E=Jau4HYvyL|c z7vFSQPBs`(G9c@3Hn4#H<$x=xI)Swp&qR934YfV{o1$&u$p?cJ8Z-xtQy)oZHN}#l zSK}^Q&6U>;^t3GVX0wff5@WRRa4jcljPFiNMm}aCNyo`48Sv=-lp31`D=wqLR>X}Z zZbd_q)wA<8bqT&-o!Uf4hIAXc2wwzph}<)~xQ8Np;l_>kTNYB%xKij&yB&=xoEajg zpSDU@c(1lu?r)B9_fxjeu#5lTPk+?>n}XXZ&)B)FESej?_Pdd}2ftLzdDs^mff8ct zl6}D|(~9FK0^BV^6F4nkw|sgJ6U1&}WcQR45L0AySvZQoZVS?pN%~dG%rl8-4M70A z!ryt zRBqf8R6XfjdRGiH+K&YKPuiCvG*iq~qujrzgG>>jpm=;<#Tn~k3_;b2{GixQ5_%mM zz$2sJuczQjDYl*`@n51l2LwCFWsOscl+Tg&myt|Vmm_Qv$2xd;7dim` zsE&yhUf*`9BYh5+Wba+ra_dO*wR2|ytTBP*-`0Z?#`Z4Q zGTH-d5ACI5>pQrpi=E^HOC)I&PCy}a8|LkLYtQJ$k23hmv0JzMF2WI{80000C3=9+$6dW8JBqSs$EG9HGG(0>!KutkINl#Q% zR9swKWMpJ_acz8iae;+=jEsz*n3tofr>v~3w6v_m#Kg_b+0@k3+}zyc_CX>@2HRA^-&M@dak04x9i001ojEdT%o{vaTZ zq*zQ9H8F)@6oI%%m6f8|#_fDxmWIe8Fi0>O5DBHi5EOVD9cQD_^sbzrDBw^K8CTuph1R?@|0|Fug6Bij24tzT#0|gAl2MP=d2!OfK(gOhq4Gj+w5D^m+4h@drJR<@a zNFd?>1q&Gx(u#0EfCDHL=0%WzFhi9n8fs0LkO816Uj!!P*?~bqg9UW{HdKf};lju( zBLf0JP(h8i1`I5$xlmz{nx9jg84!s@B?AHvdr+wY6ex)XIY9WvdsuJ~ zVO17fKL(sc04l%<$93-!oixH1F_2}J;>B9P(gKDYS1uel-~g0ZfDp}Thy2DEF4;DEt`1?mozld#+-wB+xRAOJ^E=+#381~~rEA1uz0KtKeuB-RuJ z0z3dd^REX9PH*Km-;@xE>{a?X!+&kjaS8ENpor-~q^K^1uQKP@@e2#UZdj z0~BEflm-(}P(lH$rE!x23-rc-0}t54VOSYBk^yc8%#acz_dsZolRsU+Pm@0wv%qEs z0=2;k3jCHUf|yd*GC1UXponJx>mm5~Gs6tG_oQXE+v1TI}g z1qLheNM<>6Fb5eN1}N|V3Km>ogFX>F&_Dv>F(ad<7%(2Gj55m%@CO01CQ076)-W(? jTt|LO9tkxrvj|q!qATqH@RBKQpcAmw?!EYq5CQ-@J33%z literal 0 HcmV?d00001 diff --git a/app/examples/Games/Concent/imagenes/an24.gif b/app/examples/Games/Concent/imagenes/an24.gif new file mode 100644 index 0000000000000000000000000000000000000000..7cbc5d78008b457bdedddf51b749931eeecea156 GIT binary patch literal 1627 zcmd7PjXTo`0KoB|ZEP5O@w3hB-8!*xGgE7_Hk)msYaE5dh|pa{s8f2{_=$PYdeNyH zt(r~`WxJ@Ox2+eqO5KulSGtFEh3ZaEDp%sV|KdJ>!S{K-%H;~-lB^IQ1n64)1&dN@~I4%wyz&%`v2g;MG})bR#!sb0WAoUZ{(u9}m-2uX2Z0g+NJh zt*iVmigxbJ^Etk9)A^K;+p$RpiU}tRqD~d#e)x9N@g3a0LceQ8<<@%oFO@P!1IpS^ zaNQtwws_fEmJS=imxd*dquQrOBS!ahKR)9*+!=nqYyEV$*ZdjMt8+=i7oh1u#Qae3 z%YNgtyXKdJ=J{t$v(x?a|5wa8U)h%2tdiUu#|X{_7x^R~wA63Yl2i4U%83Ns_?Nv8Fd8OdH(J$_aI%m%^`)&(@QnBmmO zF>FxKHaMl}+v@|SU30!(_XJ4@5o{WKtG&L5-tNIy@v^IL=3-c;$Q*Xnz{bF|{tsd6 zvTA)qrTQjAO_gT_deKv}+K}AqiB^+t*f$)C$eR;Dq?1d=CNCrPC|`7s4zia_kP4%& zWIg7WQ@Tz9Z{f)LT|qgNCD~@eLxiVzM3aDR79m=V!KLkATC3L-=K=9Y*SWfOxhdG> zXf<^N232$|xSd7sBIuJ|h^8xjt6XaEud!wR2lhSQwBwDBotbbJOs}{6JY|yo!5W@F z!Qs7dcwW7`^Y1Zrg%jJN7nc7-%P5DGt+l3QFF(S%kS0N^4#`n(mBRHkti;q;*kec5 z5LKVEe(aZ^u%dqo5w17H~hXw(#v*FOiSF%yD znPi0_se>ib0RC>(I##S?Zafp3WA46LMN65vYJji_If)%;g9;lP-L?|Kv?bqMP@JrE zc*MZoX%9lPSh@S!eKjdtPox)D9#XV10yG^XLn8#(OQu+TP%O7RLsjHvOpat?g`Uzf)38E@aqIWVyuN zshDfhIJ>F*BKnoSUSF5%4WS7s?TZr(p}B*2s3;((^?r@HWiM7^{Ro6Tz*K$G^1U$~ zMo0Dg2v%)gY!tv}h8G&51BmhMYXK_RD%<$Yvu;G>B#13#(elk4cxZR3G$XR`eX3R7 z*<pA2}kTZ7Z_e;>6D6k9iVJ8k`(;X;JZL+w;$tXmlG+-dZxW+Dp1(Aa*fditnN zd@7VzDK&{cR3fMr&3iaf_`yCFez~MU>~!pNtPYMmj7s($441+hp4i^S;XVv?i=P@f zAbR7$E#Ix6woPsi;K*x4%b0IX1J5yL(CQw?Et+|K{V&t)hW>E1i+8)P#hVp@OUnF| zv%lw(d{O1(ouw{yexnZ>2Rba#*r8jm#!Wq)&o50vZND}SM-vc2&3f4j`WwQyjyYTJ zn{|jT<*Gx@Cv$@Gi?nd@2(aOT8y%Bx-^J5b_>Ie4gqCK{)1~`6)7xQO%L9Pm?D?pQ zC*R}QF=>T{JEK|`{FHk#Nz##s22u$q$@w}p;P7*C18h3)G@CB4r#c9d*zol>K!tz- Gk^cgv$mc=; literal 0 HcmV?d00001 diff --git a/app/examples/Games/Concent/imagenes/an25.gif b/app/examples/Games/Concent/imagenes/an25.gif new file mode 100644 index 0000000000000000000000000000000000000000..842fde89b07f902e2419fbb3ec524ce2284a3bb1 GIT binary patch literal 1694 zcmdVX3s+Ki008j+y@0^=f+*;8Fb^r2&c|?Kq0t6WK1z@HTF%H}LZW7&Vfbhb@R?}c zrKPPhE3<4`=vk$y4K*yCZnO;3Xmib6ZKm$bd2(yE_A&PR3cv8kFn&m?Kkx^GBJc)^ zqC_VO14S7OhARVMFj$_hWR$~tgTY~WvYi-yoHy9MUOs+aLEhdho*zfRdqcqEga-Qv z1cES;zc5-Pj*Qt7#Z8G3BqSv4jpECto1{|duH>YWgspP9JX0abSH@~`vJa|btJDbx zigK``ox0KkSlOwl|r$@pGMHy^7_hF zluAEK#zPQ*V65Wutx{t-;&_ct2E$Na-{&S%#Xt$_=t#v6cbiZ;b_` zWyfDA9456Fl@CvuYh0PC-R8X(zijB}V|%WwuZ-fJJJZwB*N=m7>JzgJ=$w~k4N++c zIrp68% zD(7;ArDD&HkM+d7H07O~;*#Z4Q<1!j+3Q0c+`k{XBMVFuUm*r6C7;=*^u(^W{Zu-8 z{zL9DB3Z)K@4gm!W1vXz3=`|J+lBW6g0MRSf zI5VnQ1$->BfwFa{6*2Zt3xp<|{NDH!)&DP<+z>Lh0+Q`%J#=xN4*>mkxf3;Kh)f3C zZTq7QNgSH+<-$2ikR@C%S^ZEYMppp|d@KNK9JR|XSTMmeZJU|YO-oY)4ylzxII3c1 zU2;(nMgYiGb6(;;U-qTG_`+Yue>oF|RN^QBt=OtPf%O_3cweg$A%|ZqjRF3jtL4;C z#)%9=@qU+LvJWFY1zEcwyo@j_UR*SmdrvFqK9d}ZF*r{h^S--Efy z=|OiJjcEP^(*zF{N}TuJTZs;LS1L11AC;|F+XBJK)n4LK&Th$futO4dKmO9UOIC7- zze#Ur-M`$PW*9v-LSS3f+RuDzWE&H=U3dWL-C3BPu!gTGraI_tEUBMKAcWtZg*~G2 z64m|jIK}fFx#Uh2w0|ayQh%OAmFP6wUU57mdR#L_vR6uV`$Bq%rm^k@)%WpJ%3b(v}?@4!*&@qlq+O(D&po|ia?Is#U)(!rD z2mwWC8kvQXFl_)u`*Qh6dR(Le{q%KPCV{MU|5!-w+_whcD;oZevDB?-7afe4mY|AE zdG*O$Xpsy8NyuV6xGTI`1Xwa`1h6eDx*1!V5lA_-`K+wiL@sQtd$jpQEuf}7=XBq`sOBK>gs%vE;K%nxZD=39IAZT1oKYGGH@}! zYf~H4OlCwlQHFYseT3Iqlb%+^v9>1sbrinDxTp^_`pe+c&#Q8XP93gWT!!w3WqQ)U`hNijv?K}u literal 0 HcmV?d00001 diff --git a/app/examples/Games/Concent/imagenes/an26.gif b/app/examples/Games/Concent/imagenes/an26.gif new file mode 100644 index 0000000000000000000000000000000000000000..ef51d69e820ccb5859317741e29bcbd1e8b8a49b GIT binary patch literal 1931 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 literal 0 HcmV?d00001 diff --git a/app/examples/Games/Concent/imagenes/an28.gif b/app/examples/Games/Concent/imagenes/an28.gif new file mode 100644 index 0000000000000000000000000000000000000000..10f6ee31942468b08b661b06904c5663a350cbaf GIT binary patch literal 1944 zcmV;J2WR+4Nk%w1VJ!eH0LFd*0000HAT}c)5;!0Y4lYwQDGezsCL}OM4={i|GY>R0 zG(0pUIyEUcHbz-A2qZjwJUl!YMruqv6h=WUA4Zm6MhZYpK|@JTN=z_>F(h6`9U@Yg zJW7QlTAg81A6`#9R!eSgQWR8FR3c=XL0X?|Tr6ZEQo{DgcjH<_jL&%N@ke7a>lyt?AK25Cfgr2b9j|rccm(ZRKz@9v^ zoNfG!1l*hy?3@&_riApI1c|W7qpGLmp*5_ml>eXy-LnhauQST7Z?v?m)wE{xwGHI7 zME|oG%)E^4w^Yf-q4d-Q|JEwz(WKPW)a=xx_C zX>@2HRA^-&M@dak04x9i001ojEdT%q{(t~9gM>PUN{ESFX=!+lkC1(mla!Txf?Z-_ zYjd5Dk9VPQqok##r*mUkV{?L>p?9NWN=HFKI<~n%wYt5&y+Bs3vAIA%D=Hiy92^_Y z&Mqz;F3%esBhlG5+uSY$K>#{ycN`QH59kQ!>+BEB)z;Gw5Ft23M@=r!6Ce&A7Z7|Paq&RQs2w&Q$c)p*Cb|d>79>a@K|+NPF($ORL%`94 z4`0^&7{MXVoiRyi0O)cDOvecR2LvRja0Qm#P&n-LMfn6wJBf<%oaQ<&t)!EahLCvzs} zkS1ar6&IoLOkt-ugwGutC=e(>H3SM2A+CmC(F2#0CLO#X}r>c)?F{A3Zb83$rz0)*WBqfPx1VK;aWL8RB6C1++zA zfCN{NXv7O05cI$WA7K8Vfd?hPfY1mm+Tda-ci@qP3mm8=+7cZ+fF2QZgbfP$z_MAm^b5lnDL6CKPp0uXDgp=c;yJczTDd%u3<(OR}eu)IGFBMtPgYGL0du(oDc^OKy(m640q&8VF=@h znL`Uskl}0_TK-79h8Xy&VFQ+=$}z(TBc!{*4`f_{0|q|aK?MXAu5J26K2IBg`+u) zU{oD$k15Rs5`g)}ZqX!lgA%UP!FLXR9}&mgb1w1X6*GqVQ)?iIu;j0IO!2XGNdbX5 z4Pw->a|C3NI0UWy43WfEqQqfFJvG~F{u{?v`PbIcuKC6n+;K(@d~;I~Hyb#y1|D0uol^Mv@FVB=K$QPH^y_0^;#L3z zC+uKn9r(dG*td=RRSs+V*hUBXCkWB#LmxSq!ER1~1G0^R4YTQh3>N6V@HOy+5)^{} zPUpT2hyYA^*wqs5@Pv=Sz$^^xfC)x&!4gW4g0%YyKiD@cDbVkJ9f$)M*vEl!T;~BE zK-v|qfD|9vV1g^$-^Pygxx_VrFKvK>1|NXK=&^xuJD`{quc*Qb;-Ll6c)`z3a0fKx zU;|R{K@8?#$07Lb4o=`)8{)8p5j0^AC1l_TexMff!7&>Fi-Q-~_XIh>;S4DmLIl?7 zcAX)dfeR0i!X7l}z6@fqf^~QlB+Jr<*(6~LTZq(3F0clPflwtQD8U@K0KLs=a0E_h zWbNQ+n+J@b2xK5a6L!YL5)k1ISO^vyj&Ov!z=4_A9KjL%R|jIcAY>FsNfe~O10VPR z2Rz_G7e1GSA*7KNb%><~v8k+WqLKt4%cnE2mjo_^;h%1>!x>xkOM|H`iMDTjCP&y1V=|2(s-HlVw#8-#xjrrLKK1qIzR*s eQjmg~(v+qw%|I8rpaetcU=Tk2=}%o62mm|KqCRE- literal 0 HcmV?d00001 diff --git a/app/examples/Games/Concent/imagenes/an29.gif b/app/examples/Games/Concent/imagenes/an29.gif new file mode 100644 index 0000000000000000000000000000000000000000..c5a845030f248fd8fe3401bd0cff86f4f0b72ce8 GIT binary patch literal 1414 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 literal 0 HcmV?d00001 diff --git a/app/examples/Games/Concent/imagenes/an31.gif b/app/examples/Games/Concent/imagenes/an31.gif new file mode 100644 index 0000000000000000000000000000000000000000..aec9e5268040b0c50ecd816fdebe7d0755a1a6c0 GIT binary patch literal 1910 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 J4h(?o{{dXF4H*0{1F0r%1 z(~KObTUw~(Bi*u15Xne8&Bs^HOv<|MJG)OE&E3uE-TsFC{)Jy^I*XE!9|MR1xMhI< z`*07kh=|N4!*b$wo*-j#S%G>ojFEm=&cqH9AqHCbvBOC`9#77uXg_#MCX5ydQ-nfc zB|o5rg(^HM(DP&TybO^@R3;)8i#bzN_*Z=VDGB#N5$d)e##R)fR(@>y1XEv}+Ad8t zs(2lrAj>{ezRvn%?PmpU1x{O0W~s=SE`zKWhuHK&qtV!OPI0%KF?t?WTYvWEd16#zZdk0$Yxvegj%Qp>~@w6}8 zw~miL-kObC9y8BPeLp=ty*%BzG(9*!KfgRbwzRag^|Ilo7w&&AKilw)ZLR#%=kslB z__ltB9h+f{lj3}pSVT}uRT2VEA||A!XL111zt#Mf1b}X8igo4s3PWX872u0n)NaXB|78JJWeNV*hNde zJDQX7#TBRk98K$(nQbBqYJ=aE$F4OMaM*!yq*U~dg<=Oc&%YaJQwpd zHR{stOZyUA{%f8)u4}j<_MDxpGZkLmy(uW3JlL>;t>Q55uaGQ;%(>2tr+idm_Yb7g z1X%q3<1XP-n`S02<-h>*T-e@|qCI0{RmtL{wlemIHFrVS^F~)vzbZ2hwdWRMj=hGJ zh-Z%CUMt*P-58uiM}Fqb=)BtZFRk0#(sUABqTb|3C6pqnYn<0RZNTH4Z29z!esVGdr$mwAKo88s*z5=3B>5+aqV|OK7t7$Lg$B+EsGNN*)B= zbXu*`V!z>!!yyTO$kMG&KF@)ju>!}H{i^^vL`J&6D!IAR8;EhW`Om3~kfjBm_V?L` z!lk}`)2CeRt8ul+w>jbm!w5&pgFNgBZ7xa@E8&GCN=xc~~%UC0uNN z=!bnbDm&lur*G|4*tbddhJhLFN~WA+CuE{MqfRiY#ID3&V?0r4{O`QYWdy!00bC=C z*%m#y&e;QF2}ToQSrNHq-U=LJkm7ltV%t+=OK#>`_Xi1-b%DgeML)iUOEQR{ ztbAI?Hv}&j`QD-ed?)H>#c;6SDPM433ZRva(} zg_eRol!9bN9O@mU0cF&5mxHi(nGWt)ls&)F_eeGM>sqk*duq?M%G!1#JdMLu1F`JMlRzf%*I1xTzM>6|#L>>U9JOr65bpTtB zwlw%+E6o9uDF})9bU6Y5&tN~HhV(xF&VgXS7k>dB@zuEzFW*hN!UU%pZ#qNBsa_o@ zfc@hyDTUKH{cxmtoep{y|9bcb>HH#NHs6vRE~ILMd@s~zq>UiY8&HT{<43(cclz8< zz%+~IM7RnVh(`2%r_pLgGr-VjfZ_964eBm}UN95vM>6KaLu)~em%U(28$G;@ zQyy-i6&;G?-#<}F!$lws_(z(@gYU#Q|HlGft8Vtc@Uu4R=;XOwDgYQkKv!I~g2E=K zaK1u^k^qc(G7V&Q)EyVUSQ8AR!AOMEgL6th`hfEc%lb}il{e@tycIi2N@HQy5C9ki GkoZ4oMhkxc literal 0 HcmV?d00001 diff --git a/app/examples/Games/Concent/imagenes/an37.gif b/app/examples/Games/Concent/imagenes/an37.gif new file mode 100644 index 0000000000000000000000000000000000000000..32bc6a9d1d3f8ac97e3d1b7dba6ca06a157673b5 GIT binary patch literal 2003 zcmbuXS$i>ePW!_f**$9TU69`lNeoAAQ=v?BB4@zwmvY?}p6u z#J6nGAR64<1Ktpe#Y-?AAr=z^p(KO^q0&h41PLCd6sS}x8M%hgsKQ8jl2SxOY2HXA zC1m7^+)#1CD#@y-74cfFN*|RHAGmpyOp~mCBU!IWN?5f^BU@owlboEKolI;?Se|Z- zeqSH7JzeP3<5Z3@H8VFWTjz|^6m3}26SL@|Mq|rgR+O7umQPqLmQrh!)oMLlAaE8$ zJ1rZFi;L@uHG6iNE&FpmEeJiaYtf&#L|5RNwhNWAy4wBcYNJ|f z-?i7*arGOAt1Bwo4-6e$*3!~4aSU&5KQwe~_Xj-(x?Js(os!SnPoL{QKQJ(G@#4VC zOOk~@D!;pInYrrpdcFVnOZTYdiweFC$lr&nVFf{+1Z7st{?w( z^TqQgFJHb~_`j*=6{!_FZB;vq$?DxzC8VWfC%GXr#|)x=N%Ko2z@KLTfG|BWXQzF!Np#F4t?79E&z<3Mg^E{|OOq zyt()t5CW%qj8j-9kd0;$@Y3u*kvtY+3eM+;#24FUgs8g2q|;6STx#&8LDK2jQ_2X5 zCD8ffQ#gwnx@uk(GbK5b@aco)W zi!Wy%AO2@@{g$sQAO-(OowMtTds zxnm=D7kY8wc1v#^T9@r93qJc|4or&kH;9;XSs{uK@c zquryw!{SEnT5(`@D{>NXN}vXyAy`L*WuP1N5RVV|MeyX+`{UrCh#l&ZL%ph0|g923N7w)Bkb+L zwBT*Gb#~lglG=G8H9jyB^6Xou!XjM+hMG&bPWb*Nze{d&+Un&2tv*lf(&@oeNrG9# z;DuXkXdEJCPLuqOa;JPHPP6>~%)^{1*k&@Ob42B>_tvsCIyB_R{?M-FNQZCq0#x-* z+_hqB_RUivy*|$kINN8JY1)Ryj*BTjgRQ(>J}NjiGzp6gp;TFL))pfcqCmhVuOHr3-@gk_6*=w7scNqz1ElWq~=uoX*moMTpum(jy@=9?ebi zVZ37iNG81FoWY)Q;;+9A@aGd8EisNXf3N}1T)WQTP-f6_L`mTfhT)OA(#>avJAVKi zM3{|y(XBwBT%JJaC??kL(~wdicGIZJ=iVs4$EEbO)-Rj1%hzZx9Aqeg`#vz6xKv&# zDT^tGkYXQ83>-g_)^W;uq{oTjlS{f%-I9~Oc%J!tHF5-MwK5Lj1mM?L?Z=f!3J`yb z878*AQ2D>WUc}a5J{wv`pESNYi*bE`UzBhj&5Hz|dD_2o%|8W54X43tJY!eLaf!5> zy;Nb8CEk~yv>UBe1&e-~{3?tDq zZ9EGLE_@6?tiO2riW`An`H<~DXQNTT9y|be>*UrZy|2^gB^74~lVTI6EnP)H8@RcI z{POYW)2R)md)|v{S>3+rH5ud8I_RLU(BIs4^A(fgr8_yMK1PD?nhd_J7=B{c!*Q literal 0 HcmV?d00001 diff --git a/app/examples/Games/Concent/imagenes/an38.gif b/app/examples/Games/Concent/imagenes/an38.gif new file mode 100644 index 0000000000000000000000000000000000000000..9aa66afb3da19501fe0fea21c813687549754270 GIT binary patch literal 1782 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 literal 0 HcmV?d00001 diff --git a/app/examples/Games/Concent/imagenes/an4.gif b/app/examples/Games/Concent/imagenes/an4.gif new file mode 100644 index 0000000000000000000000000000000000000000..2deb615b9247c2b6f95904d5a04ce0c1ac9f1f72 GIT binary patch literal 1227 zcmb8q|5K880KoCj^92w@MkQ7V^HCoV^`V@53NvQNP$|D*(M0ENpkVl=Wku!+3Lf!W zXN@lMX1S)#?Od0QPS$xhuM_56xmM(ta=X@98MCf7YhLF%&&}Fju-7l|pWj)VGgCGg zq(BP3Tnm<v$J7XBXrTM*911#BD_2yg+8hZ8tX5I8{!NP-|pl8}>xYAN_q~bvvC-YwIg+x4X6Dwe#L314BdCu3Z}%zq4d| zdU|ed?w|iJdXe|;9+SahGGhBHEM`n=Hep$tb2Wf?wf1Tf&=&`f)~E^oCs%O&)#}vG zbD{eC7>Xj4(!iC=0-n0~00&SixGJgR^whJz60RSB9FF4MJBA;Yye>~F+y%x1&7&H;5BPZ`~YC_g)x$NJc8DCCeKt^$sWIw)w_pX#IqgoOX?mR|yM#nC`BQE4@sK6EJ2uC#ZbIG%9t~MHaYiH3^Y`ntZJeZi*EOAvOYqqw*o>A4vb{zKicU%vo2ZzIj^G~+Bz}9iK@vii( zDF8d^Hj%gXY3e0&e$<$^4+g96G1QwZW{tw%#3R~9=3EBSw&i9}nPZyK1fZVg4Z+YIV_yJ^;E6B*56faXkAAa(1y07{d%GWIss*!`?1BB?!2 z+x7d|!$B?v7oCyrrI(B+*ppDDP?RlpRx1CGXHyss36%P(Ml zLv_V0#1LBa-N^>?=q(Uh)9wg~w`v@Scpnx~EwIi)D+@p-z!6vZ1Q>X#Q`TZu4V9Lt zQ+K;09Z64w4<}ya0e`qh!C3kDfwV8;Qc^;#L;@z){7Q9>X5sh;brhXL1VFEPT~*hG z$@C-#J?-48>=i4fV_|e=%S#9I9`(JFHBsU6MLN0moG6yN7^-Z2b`gcb%=)#Vy%#|d zjYobA;1Db}BoUc!9L;?D=HF`=FODQd%R2PC2RBx-Q|;)U=d!Vbyt9~}RaV}YzD|R8 zrqd$d&w6B|kA#27l6tt;;hyq6iUibJb|TSNeSpjw`3V25{p%QRF1)5(kqL7!QQM)o p8UD=+vmFcj#32^xq)eFO8G<<8px-Z2%Wib0e$i^*8Hqw*jnS- literal 0 HcmV?d00001 diff --git a/app/examples/Games/Concent/imagenes/an40.gif b/app/examples/Games/Concent/imagenes/an40.gif new file mode 100644 index 0000000000000000000000000000000000000000..b4ae4a6eedb8fc378965d2bb9b7b40ccfb2184a1 GIT binary patch literal 2582 zcmeH`=~q*C0)~J0-YhpHgd|*&Kmy!ISVYjsVuMD{4Qs%t$fD=~Cdd*f4M9OrDRapJ zxHeJ?u~Gq{6kDoLnYt9`+|-C@(b7UIwoE5F*s2FLb?7qf437OL=F>c%-Vg7m=bR@k zJyn^Yj|S1;2OD?^hr0>4FAS5)c_>qu81IdSh*=!D^d)?J6(*O4 z;DXg+wi5TomxXbcXK#{l;+J|ajS7p6h>$B%*T(u}FXhL@#i`=ttK*lJ$@$yjP`Ro> zrBaDgE3_)CAbv@zI@%Z~3{Gv|k?LiQLx~OQr1VW0T7`9`yf7_rNtQ#EVXI0JkIHHN z%YF4(!Odz>;U-m87M7EfQ>9g|Pe0$35v<9B9Nd`%@D3eP+tb2+<8L~x!$1Z)cm6-iOuj1i&Nl~ zjm-qDSbBGJQh-pvQ&KTawg5qNDQ3Va4S?i1HAmgf>J)l2jfJv!C`er5cLXsW zo%8VS-){8{&5z(WdrM+A8fV?)c?cY!zjmK*EW0Cnk1u}LuB`n%Zo?1uyk++37Gqc z>Ofq(b)s(J;n%yve<{6P+KdV#zDz7SmuIEv?yoxZ&!|`6%7>rz*X{WB%-!Pe8d7Qy z1Z-UVCG`B;PEMHC7{~24UzW~EJTVdaomUxt8|P+^h0uF9gcUxz^KGMO^yhCH?*86D@mHudSh+ank5_1^v4hN-;Q&s${Df7w!!g_(aN({}XOv{6oj%Z&%U1&_kD}U2 zXRAvNG-kf?AkZ}TaoStb$6ufH4v(lM#Mw{#zpX0S^4>dJ4>*Tgf(mp^Hs6E+ULr~Z z3bg#&EojP)BC@;n&vv{CWbb-`fAchQeE&L^$sp}KvGniVm zmNsPJuQ5?hj;rFmB>altOJ;C6<^as-^D-B0{sy0b|1vzmPcKmDDIdj5cZy$nj{YhX zIipME$9}G&15v|IZ~OWxplfv6_^`UQQbA-b0-?_7q7B^a*;z);u@PkZVV-NlvP*-2$YghPWB3oo$}6eP$d7-j|0~&SI!K#1n<#$Qci;?GT|$821s$7JAM_YOfGTo_qN(*6Hj<@v59a<19Z)c>rS z@Y^+T&l%7tmO+(gj>)J>K}`+RcdSC@WK<0CQ@P9;($VOSg$JBIdjSP4f761-$ zW)@uE^5SoYkj3;#Eo%oL6>|m#OH4A30843s4$*(6W_h{D;!r0eZ?tIOa+Y}@&rQ#L z`PCYdiBSrMBAjjCUu|QVbTHF?-HR>M9dCpgZeT2dsO?v*7qawVi2B6h^k$WKj@TJ40e0 zO!nPTw6S6z!kA+ffOWT7J#zB%<~Bq^0s6Cj`OADf0PO_aOb6kY;kK^D4Cpd9K<1|` zK@(+g7xt!N^CZldI+-zKFYLoJvv8cQ@u+!oLbD=sihFMHhWS;DX9+(Hykb$HECU%T zQ#o^!+njjG#8@8T1~i8g$?DGZp9k$y9{m3IJiy@SQOFS?njNASo2Ss+A&WYJpvheX zBj(``nrt3eqH=ndO;WVt?5omoHCyUU(4r>Ap)ShXI76ORgxl7-^(WW0s_D<$AU>|| z)6^oOk0&>T)t_Ir4^;R)*kkcm;9emglBYAttThvQSlp`i^2!|e@FKy`)Wd>g9gV!% ze~_a?@R1>A>?ot-qoqllfX5`;N}+j*tJ38Jd?|4S$JY}wZOprd7SG3XrYyL_w7Q)Y z-woND5|5dhx^iV4-NlC_n#Ds928(tAA$c=yE9`GTiZ5F51&S7K_@IEXgk%;xN)OlFL(XIYQ*Y2f6P?bfdlw|w&N!3zuTZeeY8TzxcI!<6*l^e1mY44#12QQ^)fl}(zB1XDe) zW*fgSx26p?uTetmZN4kbpV-3^l5zTcu3`T%(t3$YXz%{U$Hzd?1#2E#A5$$#jVij( hSDq9(KyVr;q~mlp=Xd|iqxHwn2K_D`N4!w5=D+CWtbYIi literal 0 HcmV?d00001 diff --git a/app/examples/Games/Concent/imagenes/an5.gif b/app/examples/Games/Concent/imagenes/an5.gif new file mode 100644 index 0000000000000000000000000000000000000000..19e3dde6d1ab4f2edd8faa9981123d2e3a01773d GIT binary patch literal 1628 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 W3cWp-(!r9{`m&`5FpvNO(*FXC;qg@f literal 0 HcmV?d00001 diff --git a/app/examples/Games/Concent/imagenes/an9.gif b/app/examples/Games/Concent/imagenes/an9.gif new file mode 100644 index 0000000000000000000000000000000000000000..89b2b7b390d5abd8c9026cb2bda5d50c9e77008b GIT binary patch literal 2486 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 A#Q*>R literal 0 HcmV?d00001 diff --git a/app/examples/Games/Concent/imagenes/colombia.gif b/app/examples/Games/Concent/imagenes/colombia.gif new file mode 100644 index 0000000000000000000000000000000000000000..60c8c145103debd0f90600660178e3ac373d962d GIT binary patch literal 145 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 Mhx%D#LlVsXe|2a0c>n+a literal 0 HcmV?d00001 diff --git a/app/examples/Games/Concent/imagenes/logo.png b/app/examples/Games/Concent/imagenes/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..27a8611ce32d3d795ebfe834f506adbad7c8c71c GIT binary patch literal 1591 zcmV-72FUq|P)NPN5d`x^~JY+m9R6Hz9JS;>k6m)cSY;;@{92A6vguKMW+}zys^z`iP z?1Y45YNsyyVQ3 zlw?F~OdR~=-0ak}#FT9O?A+AEto-D>q@<+G#N2c|JnX!*%(T?})TI2>v{YPF%*@Ob zP}2PX0004WQchC32z1d<*{0UbC%mF18PMNzEH zNUSkk(xzs?Km%%0+G+d$f5E&YCYp4aPjk)VWj^3@pLabZllebHQCVsw_hfZ-HJ8h+ z{+oLxyGAdISzL85!YjfQq8|%OJudh5f9hlXW`Wf+b9h6&P=*LPC=7+3)^erRn zYv>UHPxDN6Bb&|MIM5?vb%TBk{87klY&<@>$Z~vX9)o#MM!EcS<2z^M8fcs(F9;=8fk#CBk~p1thFRb zYTKr=DG{*4r)e9InNF=Ng($G>YApiypXlMzj}garNWRGE-V3s0^_>801Zmj;lSsCIN?@2&*KtZE-!Vd zz~o(uq8!(C;72&q^E#d=&PQ(0d5jr)sY~T@89i~`V$pT>9nAA3B=-9+y&?eFTgVs; zjKV#TXBZ}*r;76f=bMOLzC;JZ!&k3C$ao{^_>L$eyuZKi@B{Sr=;-M1H7uXeXb6C# zckhpfpw~36*L4Zs)jV*ZGRs2ryZ4|EG`$IXAuHYjC{S;T!bn870CI#ALGV2K4iI#G zdqkQVLT^vcj)xy!9n$okVT?}h04$_^u>eSQM04Oj_x&9Uq5G?`=TM{G63}zflpt&P z!)UrR8earqFP%ocUWaWNk&l;`;(QW_f(l@y(0I(UT1PeOqX-mFVqa-YNEn839K`C$ zAfLG_0t3Jcn%S+{nl>8iqwzF~f>{)k-7p>p(Nz=#vrg}R*2r-zo>i|ueHyl__1P$q z&Zkj8cEXU5cou&Su7YS9n+bEjOi+PSZ5tVOsH9JYFlaG@LTsuO-IP~Lb;OmQ&GRSZ+)>PFz>(k+`MZtFrG#!|IKn}n6DffeU;|ZMl3%DY^fU~jF`1YNei$Gv+~WHOee=19 zG4546nx3w;A3*xs`t!v5!Jqcl;rh^|_Nm>qCCP?M5x|l+Wm8MspZI}57_(;AK0iA< zp3M%wU&Jw#EvsBo$oyP+cmd+{oov=1#0;XyI@qbqFI8sff#F*4KZxt>fncjHU6lE) p;HAc(QmI%h8t`=skGuKb>mNB=@4jy!9+dz9002ovPDHLkV1kqJ{~Q1S literal 0 HcmV?d00001 diff --git a/app/examples/Games/Concent/imagenes/ok.gif b/app/examples/Games/Concent/imagenes/ok.gif new file mode 100644 index 0000000000000000000000000000000000000000..e3529cad3c9b6fa67f348da6830e742b375bcc2f GIT binary patch literal 1355 zcmW+#e{9o56u))_3u$%GvK8F08&%3SlC3Ob3>J$UGUgy93{nY%!N`QTkP7`{B#qAT z1vXe_jm1o}j3yNFHGCx(ILU=v%;9c$;1RyS7yU|*3^Q>8CK7*5!w(b!HGkxgpYOh!V^&Hy}a{ zOiW4yBP=T*3WvgCL~v|^O^qidW;*AB5Q9^~Xxi2=6PyUb7^9G_I8j-ZlY|N)hRh+t zB;~pxNKR!r<&r>8Dk$YtFlus!p)RL%L4ktgR7xVT0A|ECB%_uf7Gs=K#h{KEh8o2G z7js6j%rPbaOc7y7OqoeJ+c+aG^jJIDpNiV32Py5F(%@ zm+;JiFgTC_)j*sPrAsEUnT7d*Jjs*}3IKx($xPkONG@~>n+%v@i<*|xGx z^Om$Fx5rG&RMt3ofJ^>yO`DC}r~hM$)QH|d`SyS zJ>I>)W9Fv?s|;;k-n45AHus0?&$a%1L$A@k+hgJ=?DxXPqy7@s)^oA0`L`19+{!NOeBr0gJ3a2ASP*%ijB#&4y#J$tm-OnYmYVkQ zN@w0&#`k$<*G3)Azl5);V9f9MApZxm=TPBDYTJdSQ!-=Su1KpHbx#Y$_IW3lE%Gio z!rvJU6Sem8jIaGySD+VLV(+^`$!PTO-=3=@HMb|zFBJ9Yk>*)Pp>4 Rcd07A;J*K$*x^7+{{v}U)Eoc+ literal 0 HcmV?d00001 diff --git a/app/examples/Games/Concent/imagenes/tierra.gif b/app/examples/Games/Concent/imagenes/tierra.gif new file mode 100644 index 0000000000000000000000000000000000000000..97532a23d4a9b28de6114076ad7b42b2731dfa7b GIT binary patch literal 32485 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 literal 0 HcmV?d00001 diff --git a/app/examples/Games/Concent/move.wav b/app/examples/Games/Concent/move.wav new file mode 100644 index 0000000000000000000000000000000000000000..d6d5436d3e7ca871ab44631250cb682ec572daa4 GIT binary patch literal 13318 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 literal 0 HcmV?d00001 diff --git a/app/examples/Games/DeepSpace/.lang/ca.po b/app/examples/Games/DeepSpace/.lang/ca.po new file mode 100644 index 00000000..2f860fbc --- /dev/null +++ b/app/examples/Games/DeepSpace/.lang/ca.po @@ -0,0 +1,51 @@ +# Catalan translation of DeepSpace +# Copyright (C) 2000-2010 Benoît Minisini. +# This file is distributed under the same license as the DeepSpace package. +# Jordi Sayol , 2007-2010. +# +# +msgid "" +msgstr "" +"Project-Id-Version: DeepSpace\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2010-12-16 23:37+0100\n" +"Last-Translator: Jordi Sayol \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: FMain.class:109 +msgid "&About DeepSpace ..." +msgstr "&Quant al DeepSpace ..." + +#: FAbout.class:31 +msgid "About DeepSpace" +msgstr "Quant al DeepSpace" + +#: .project:1 +msgid "DeepSpace" +msgstr "-" + +#: FMain.class:102 +msgid "&DeepSpace" +msgstr "-" + +#: FMain.class:97 +msgid "DeepSpace Vector Engine" +msgstr "Motor vectorial del DeepSpace" + +#: FMain.class:117 +msgid "&Exit" +msgstr "&Surt" + +#: FAbout.class:41 +msgid "&OK" +msgstr "&D'acord" + +#: FMain.class:105 +msgid "&Show object labels" +msgstr "&Mostra les etiquetes dels objectes" + diff --git a/app/examples/Games/DeepSpace/.lang/cs.po b/app/examples/Games/DeepSpace/.lang/cs.po new file mode 100644 index 00000000..01c0830e --- /dev/null +++ b/app/examples/Games/DeepSpace/.lang/cs.po @@ -0,0 +1,44 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "DeepSpace" +msgstr "-" + +#: FAbout.form:10 +msgid "About DeepSpace" +msgstr "O DeepSpace" + +#: FAbout.form:20 +msgid "&OK" +msgstr "-" + +#: FMain.form:14 +msgid "DeepSpace Vector Engine" +msgstr "DeepSpace vektor motorů" + +#: FMain.form:19 +msgid "&DeepSpace" +msgstr "-" + +#: FMain.form:22 +msgid "&Show object labels" +msgstr "&Zobrazit Å¡títky objektu" + +#: FMain.form:26 +msgid "&About DeepSpace ..." +msgstr "&O DeepSpace ..." + +#: FMain.form:33 +msgid "&Exit" +msgstr "&Ukončit" diff --git a/app/examples/Games/DeepSpace/.lang/de.po b/app/examples/Games/DeepSpace/.lang/de.po new file mode 100644 index 00000000..e45c2dd3 --- /dev/null +++ b/app/examples/Games/DeepSpace/.lang/de.po @@ -0,0 +1,44 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "DeepSpace" +msgstr "-" + +#: FAbout.form:10 +msgid "About DeepSpace" +msgstr "Über DeepSpace" + +#: FAbout.form:20 +msgid "&OK" +msgstr "-" + +#: FMain.form:14 +msgid "DeepSpace Vector Engine" +msgstr "-" + +#: FMain.form:19 +msgid "&DeepSpace" +msgstr "-" + +#: FMain.form:22 +msgid "&Show object labels" +msgstr "&Zeige Objektbeschriftungen" + +#: FMain.form:26 +msgid "&About DeepSpace ..." +msgstr "&Über DeepSpace ..." + +#: FMain.form:33 +msgid "&Exit" +msgstr "&Beenden" diff --git a/app/examples/Games/DeepSpace/.lang/es.po b/app/examples/Games/DeepSpace/.lang/es.po new file mode 100644 index 00000000..044514f2 --- /dev/null +++ b/app/examples/Games/DeepSpace/.lang/es.po @@ -0,0 +1,44 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: FMain.class:111 +msgid "&About DeepSpace ..." +msgstr "&Acerca de DeepSpace ..." + +#: FAbout.class:33 +msgid "About DeepSpace" +msgstr "Acerca de DeepSpace ..." + +#: .project:1 +msgid "DeepSpace" +msgstr "DeepSpace" + +#: FMain.class:104 +msgid "&DeepSpace" +msgstr "&DeepSpace" + +#: FMain.class:99 +msgid "DeepSpace Vector Engine" +msgstr "DeepSpace Vector Engine" + +#: FMain.class:119 +msgid "&Exit" +msgstr "&Salir" + +#: FAbout.class:43 +msgid "&OK" +msgstr "&OK" + +#: FMain.class:107 +msgid "&Show object labels" +msgstr "&Mostrar etiquetas de los objetos" + diff --git a/app/examples/Games/DeepSpace/.lang/ru.po b/app/examples/Games/DeepSpace/.lang/ru.po new file mode 100644 index 00000000..92c9997e --- /dev/null +++ b/app/examples/Games/DeepSpace/.lang/ru.po @@ -0,0 +1,78 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-28 09:00+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Games/DeepSpace/.project:18 +msgid "DeepSpace" +msgstr "Дальний космос" + +#: app/examples/Games/DeepSpace/.project:19 app/examples/Games/DeepSpace/.src/FMain.form:5 +msgid "DeepSpace Vector Engine" +msgstr "Векторный двигатель дальнего космоса" + +#: app/examples/Games/DeepSpace/.src/FAbout.class:16 +msgid "DeepSpace  " +msgstr "Дальний космос  " + +#: app/examples/Games/DeepSpace/.src/FAbout.class:16 +msgid "
A vector engine written in Gambas.

Contact subjugator@gmail.com with questions.
Copyright (C) 2004, Michael Isaac. All rights reserved." +msgstr "

Векторный движок, написанный на Gambas.

Напишите на subjugator@gmail.com вопросы.
Copyright (C) 2004, Майкл Исаак. Все права защищены." + +#: app/examples/Games/DeepSpace/.src/FAbout.form:5 +msgid "About DeepSpace" +msgstr "О дальнем космосе" + +#: app/examples/Games/DeepSpace/.src/FAbout.form:13 +msgid "&OK" +msgstr "ОК" + +#: app/examples/Games/DeepSpace/.src/FMain.form:9 +msgid "&DeepSpace" +msgstr "Дальний космос" + +#: app/examples/Games/DeepSpace/.src/FMain.form:11 +msgid "&Show object labels" +msgstr "Показать метки объекта" + +#: app/examples/Games/DeepSpace/.src/FMain.form:14 +msgid "&About DeepSpace ..." +msgstr "О дальнем космосе..." + +#: app/examples/Games/DeepSpace/.src/FMain.form:19 +msgid "&Exit" +msgstr "Выход" + +#: app/examples/Games/DeepSpace/.src/MMain.module:328 +msgid "Object Count:" +msgstr "Кол-во объектов:" + +#: app/examples/Games/DeepSpace/.src/MMain.module:329 +msgid "Bullet Count:" +msgstr "Кол-во пуль:" + +#: app/examples/Games/DeepSpace/.src/MMain.module:330 +msgid "FPS" +msgstr "кадр/с" + diff --git a/app/examples/Games/DeepSpace/.project b/app/examples/Games/DeepSpace/.project new file mode 100644 index 00000000..cd39d095 --- /dev/null +++ b/app/examples/Games/DeepSpace/.project @@ -0,0 +1,17 @@ +# Gambas Project File 3.0 +Title=DeepSpace +Description="DeepSpace Vector Engine" +Startup=MMain +Icon=images/deepspace.png +Version=3.11.90 +VersionFile=1 +Component=gb.image +Component=gb.gui +TabSize=4 +Translate=1 +Language=fr +Maintainer=benoit +Vendor=Princeton +Address=benoit@localhost +License=General Public Licence +Packager=1 diff --git a/app/examples/Games/DeepSpace/.src/CBullet.class b/app/examples/Games/DeepSpace/.src/CBullet.class new file mode 100644 index 00000000..bdf6bdda --- /dev/null +++ b/app/examples/Games/DeepSpace/.src/CBullet.class @@ -0,0 +1,11 @@ +' Gambas class file +' +' Copyright (C) 2004, Michael Isaac. All rights reserved. +' + +Public X As Float 'Center X +Public Y As Float 'Center Y +Public Direction As Float +Public Owner As String 'The array space of the owning object +Public Damage As Integer +'PUBLIC Destroy AS Boolean diff --git a/app/examples/Games/DeepSpace/.src/CObject.class b/app/examples/Games/DeepSpace/.src/CObject.class new file mode 100644 index 00000000..21f7f12a --- /dev/null +++ b/app/examples/Games/DeepSpace/.src/CObject.class @@ -0,0 +1,87 @@ +' Gambas class file + +' +' Copyright (C) 2004, Michael Isaac. All rights reserved. +' + +Public ID As String + +Public X As Float 'Center X +Public Y As Float 'Center Y + +Public MX As Float 'Motion X +Public MY As Float 'Motion Y + +Public Size As Float + +Public Points As Integer[] +Public Distance As Float[] +Public Degree As Float[] + +Public Direction As Float +Public Agility As Float +Public Acceleration As Float +Public Torque As Float + +Public Hull As Integer +Public Shield As Integer + +Public ShieldOn As Boolean + +Public Thrust As Boolean +Public Attack As Boolean +Public TurnRight As Boolean +Public TurnLeft As Boolean + +Public Sub _new() + Points = New Integer[] + Distance = New Float[] + Degree = New Float[] +End + +Public Sub Load2DObject(sFilename As String, sID As String, X As Integer, Y As Integer) + 'DIM F AS File + Dim I As Integer + Dim sData As String + + Dim aLine As New String[] + + sData = File.Load(Application.Path &/ "object.data/" &/ sFilename) + 'OPEN Application.Path &/ "object.data/" &/ sFilename FOR READ AS #F + 'READ #F, sData, Lof(F) + + 'Split this into an array and remove the CR character + aLine = Split(Replace(sData, Chr$(13), Null), "\n") + + With Me + .X = X + .Y = Y + .ID = sID + + If sID Like "Object*" Then + .Torque = -1 + '.Attack = TRUE + .MX = Rnd(-4, +5) + .MY = Rnd(-4, +5) + End If + + .Agility = 5 + .Acceleration = 0.75 + .Hull = 100 + + .Direction = Rad(180) + + For I = 0 To aLine.Count - 1 + If (Not (Left$(aLine[I], 1) = "'")) And (Not (aLine[I] = "")) Then + .Degree.Add(CFloat(Split(aLine[I], ",")[1])) + .Distance.Add(CFloat(Split(aLine[I], ",")[0])) + + If .Distance[.Distance.Count - 1] > .Size Then + .Size = .Distance[.Distance.Count - 1] + End If + End If + Next + End With + + 'CLOSE #F +End diff --git a/app/examples/Games/DeepSpace/.src/FAbout.class b/app/examples/Games/DeepSpace/.src/FAbout.class new file mode 100644 index 00000000..f59117a0 --- /dev/null +++ b/app/examples/Games/DeepSpace/.src/FAbout.class @@ -0,0 +1,19 @@ +' Gambas class file + +' +' Copyright (C) 2004, Michael Isaac. All rights reserved. +' + +Public Sub cmdOK_Click() + Me.Close() +End + +Public Sub Form_Open() + + Me.Center + + lblInfo.Text = + ("DeepSpace  ") & Application.Version & ("
" + "A vector engine written in Gambas.

Contact subjugator@gmail.com with questions.
" + "Copyright (C) 2004, Michael Isaac. All rights reserved.") +End diff --git a/app/examples/Games/DeepSpace/.src/FAbout.form b/app/examples/Games/DeepSpace/.src/FAbout.form new file mode 100644 index 00000000..5d9934a7 --- /dev/null +++ b/app/examples/Games/DeepSpace/.src/FAbout.form @@ -0,0 +1,19 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(51.6667,32.1667,54,26) + Text = ("About DeepSpace") + Resizable = False + { lblInfo TextLabel + MoveScaled(1,1,35,19) + Text = ("") + } + { cmdOK Button + MoveScaled(19,21,13,4) + Text = ("&OK") + } + { pbIcon PictureBox + MoveScaled(36,1,17,16) + Picture = Picture["images/deepspace.png"] + } +} diff --git a/app/examples/Games/DeepSpace/.src/FMain.class b/app/examples/Games/DeepSpace/.src/FMain.class new file mode 100644 index 00000000..f685e24a --- /dev/null +++ b/app/examples/Games/DeepSpace/.src/FMain.class @@ -0,0 +1,81 @@ +' Gambas class file + +' +' Copyright (C) 2004, Michael Isaac. All rights reserved. +' + +Private Attacking As Boolean + +Public Sub _new() + mMain.Canvas = daCanvas +End + +Public Sub tmrMainLoop_Timer() + mMain.MainLoop() +End + +Public Sub Form_KeyPress() + + Select Case Key.Code + Case Key.Left + MMain.Obj[0].TurnLeft = True + Case Key.Right + MMain.Obj[0].TurnRight = True + Case Key.Up + MMain.Obj[0].Thrust = True + Case Key["F"] + MMain.Obj[0].Attack = True + Case Key["D"] + MMain.Obj[0].MX = 0 + MMain.Obj[0].MY = 0 + End Select +End + +Public Sub Form_KeyRelease() + + Select Case Key.Code + Case Key.Left + MMain.Obj[0].TurnLeft = False + Case Key.Right + MMain.Obj[0].TurnRight = False + Case Key.Up + MMain.Obj[0].Thrust = False + Case Key["F"] + MMain.Obj[0].Attack = False + End Select +End + +Public Sub Form_Close() + mMain.Exit() +End + +Public Sub Form_Resize() + mMain.SCREEN_WIDTH = Me.ClientW + mMain.SCREEN_HEIGHT = Me.ClientH + + daCanvas.H = Me.ClientH + daCanvas.W = Me.ClientW +End + +Public Sub daCanvas_KeyPress() + Form_KeyPress() +End + +Public Sub daCanvas_KeyRelease() + Form_KeyRelease() +End + +Public Sub mnuMainExit_Click() + Me.Delete +End + +Public Sub mnuMainAbout_Click() + FAbout.Show() +End + +Public Sub mnuShowText_Click() + + mnuShowText.Checked = Not mnuShowText.Checked + MMain.ShowObjectLabel = mnuShowText.Checked + +End diff --git a/app/examples/Games/DeepSpace/.src/FMain.form b/app/examples/Games/DeepSpace/.src/FMain.form new file mode 100644 index 00000000..761e7034 --- /dev/null +++ b/app/examples/Games/DeepSpace/.src/FMain.form @@ -0,0 +1,35 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(19,0,75.2857,70.7143) + Text = ("DeepSpace Vector Engine") + Icon = Picture["images/deepspace.png"] + Resizable = False + { mnuMain Menu + Text = ("&DeepSpace") + { mnuShowText Menu + Text = ("&Show object labels") + } + { mnuMainAbout Menu + Text = ("&About DeepSpace ...") + } + { mnuMainSep1 Menu + } + { mnuMainExit Menu + Text = ("&Exit") + Shortcut = "Ctrl+Q" + } + } + { daCanvas DrawingArea + MoveScaled(0,0,54,50) + Font = Font["Monospace"] + Background = &H000000& + Cached = True + Focus = True + } + { tmrMainLoop #Timer + #MoveScaled(65,43) + Enabled = True + Delay = 20 + } +} diff --git a/app/examples/Games/DeepSpace/.src/MMain.module b/app/examples/Games/DeepSpace/.src/MMain.module new file mode 100644 index 00000000..90f5f504 --- /dev/null +++ b/app/examples/Games/DeepSpace/.src/MMain.module @@ -0,0 +1,348 @@ +' Gambas module file + +' +' Copyright (C) 2004, Michael Isaac. All rights reserved. +' + +Public Obj As Object[] +Public Bullet As Object[] + +Public Canvas As DrawingArea + +Public BULLET_SIZE As Float +Public BULLET_SPEED As Float + +Public KEY_LEFT As Boolean +Public KEY_RIGHT As Boolean +Public KEY_UP As Boolean +Public KEY_DOWN As Boolean + +Public KEY_FIRE As Boolean +Public KEY_FIRESTATE As Boolean + +Public SCREEN_WIDTH As Integer +Public SCREEN_HEIGHT As Integer + +Public BOT_SPACE As Integer 'Which Obj[] is the bot + +Public FPS_TIME As Float +Public FPS_COUNTER As Integer +Public FPS_COUNT As Integer + +Public ShowObjectLabel As Boolean + +Public Sub Main() + + System.Profile = False + MMath.InitializeSineTable() + ShowObjectLabel = False + + Obj = New Object[] + Bullet = New Object[] + + FPS_TIME = Timer + + BULLET_SIZE = 7 + BULLET_SPEED = 15 + + SCREEN_WIDTH = FMain.ClientW + SCREEN_HEIGHT = FMain.ClientH + + LoadObjectList() + + FMain.Show() +End + +Public Sub Exit() + Obj = Null + Bullet = Null + Canvas = Null +End + +Sub LoadObjectList() + Dim I As Integer + Dim J As Integer + Dim sData As String + Dim tmpO As CObject + + 'DIM F AS File + + Dim V As New String[] + Dim aLine As New String[] + + sData = File.Load(Application.Path &/ "object.data/main.lst") + + 'OPEN Application.Path &/ "object.data/main.lst" FOR READ AS #F + 'READ #F, sData, Lof(F) + + 'Split this into an array and remove the CR character + aLine = Split(Replace(sData, Chr$(13), Null), "\n") + + For I = 0 To aLine.Count - 1 + If (Not (Left$(aLine[I], 1) = "'")) And (Not (aLine[I] = "")) Then + V = Split(aLine[I], ",") + If V.Count = 4 Then + For j = 1 To If(v[1] = "Object1", 100, 1) + tmpO = New CObject + tmpO.Load2DObject(V[0], V[1], CInt(V[2]), CInt(V[3])) + Obj.Add(tmpO) + Next + End If + End If + Next + + 'CLOSE #F +End + +Sub ApplyPhysics() + Dim I As Integer + Dim U As Integer + Dim Ob As CObject + + If Obj = Null Then Return + + For Each Ob In Obj + With Ob + .Direction = .Direction + Rad(.Torque) + + If .TurnLeft = True Then .Direction = .Direction + Rad(.Agility) + If .TurnRight = True Then .Direction = .Direction - Rad(.Agility) + + If .Direction > Rad(360) Then .Direction = Rad(0) + If .Direction < Rad(0) Then .Direction = Rad(360) + + If .Thrust = True Then + .MX = .MX + ((Sin(.Direction)) * .Acceleration) + .MY = .MY + ((Cos(.Direction)) * .Acceleration) + End If + + If (.MX <> 0) Or (.MY <> 0) Then + .X = .X + (.MX / 20) + .Y = .Y + (.MY / 20) + End If + + If .Attack Then + AddBullet(CInt(.X), CInt(.Y), .Direction, .ID, 10) + End If + End With + Next +End + +Function IsObjectCollision(O1 As CObject, O2 As CObject) As Boolean + If GetDistance(O1.X, O1.Y, O2.X, O2.Y) <= O2.Size Then + Return True + End If +End Function + +Function IsBulletCollision(O As CObject, B As CBullet) As Boolean + If GetDistance(O.X, O.Y, B.X, B.Y) <= O.Size Then + Return True + End If +End Function + +Sub CollisionHandler() + + Dim I As Integer + Dim J As Integer + Dim hBullet As CBullet + Dim hObj As CObject + + If Obj = Null Then Return + If Bullet = Null Then Return + + For I = 0 To Obj.Count - 1 + For J = 0 To Bullet.Count - 1 + + If J > Bullet.Count - 1 Then Break + If I > Obj.Count - 1 Then Break + + hObj = Obj[I] + hBullet = Bullet[J] + + If Not (hBullet.Owner = hObj.ID) Then + If IsBulletCollision(hObj, hBullet) Then + + hObj.Hull = hObj.Hull - hBullet.Damage + Bullet.Remove(J) + + If hObj.Hull <= 0 Then + If I = 0 Then + 'Message("Player was just killed.") + Else + Obj.Remove(I) + End If + End If + End If + End If + Next + Next + +' FOR J = 0 TO (Obj.Count - 1) +' FOR I = 0 TO (Obj.Count - 1) +' IF I <> J THEN +' IF IsObjectCollision(Obj[J], Obj[I]) THEN +' 'This is where Objects collide, and we need +' 'calculate forces here. +' END IF +' END IF +' NEXT +' NEXT +End + +Public Sub AddBullet(CX As Integer, CY As Integer, D As Float, OwnMe As String, Dmg As Integer) + Dim B As New CBullet + + With B + .X = CX + .Y = CY + .Direction = D + .Owner = OwnMe + .Damage = Dmg + End With + + Bullet.Add(B) +End + +Sub MoveBullets() + Dim I As Integer + + If Bullet = Null Then Return + + For I = 0 To Bullet.Count - 1 + If I > Bullet.Count - 1 Then Break + + With Bullet[I] + .X = .X + ((Sin(.Direction)) * BULLET_SPEED) + .Y = .Y + ((Cos(.Direction)) * BULLET_SPEED) + End With + + If ((Bullet[I].X > SCREEN_WIDTH) Or (Bullet[I].X < 0)) Or ((Bullet[I].Y > SCREEN_HEIGHT) Or (Bullet[I].Y < 0)) Then + Bullet.Remove(I) + End If + Next +End + +Sub RenderBullets() + Dim B As CBullet + + Draw.Foreground = Color.Cyan + Draw.FillColor = Color.Blue + Draw.FillStyle = 1 + + Randomize + + For Each B In Bullet + Draw.Ellipse(B.X, B.Y, BULLET_SIZE, BULLET_SIZE) + Next +End + +Public Sub RenderObjects() + Dim I, J As Integer + Dim Ob As CObject + Dim Size As Integer + Dim aPoint As Integer[] + Dim A, D As Float + Dim Tag As String + + Draw.Foreground = Color.Cyan + For Each Ob In Obj + With Ob + Size = .Degree.Count + + aPoint = .Points + + aPoint.Resize(Size * 2) + + J = 0 + For I = 0 To Size - 1 + A = .Direction + Rad(.Degree[I]) + D = .Distance[I] + aPoint[J] = .X + (Sin(A) * D) + Inc J + aPoint[J] = .Y + (Cos(A) * D) + Inc J + Next + + Draw.Polygon(aPoint) + End With + Next + + If ShowObjectLabel Then + Draw.Foreground = Color.Green + For Each Ob In Obj + With Ob + Tag = .ID & " " & .Hull & "%" + Draw.Text(Tag, .X - (Draw.TextWidth(Tag) / 2), .Y - (35)) + End With + Next + Endif +End + +Sub CheckObjectWarp() + Dim Ob As CObject + + For Each Ob In Obj + With Ob + If .Y > SCREEN_HEIGHT Then .Y = 0 + If .Y < 0 Then .Y = SCREEN_HEIGHT + + If .X > SCREEN_WIDTH Then .X = 0 + If .X < 0 Then .X = SCREEN_WIDTH + End With + Next +End + +Public Sub MainLoop() + + Dim eTime As Float + + ApplyPhysics() + CollisionHandler() + + MoveBullets() + + If Canvas = Null Then Return + + CheckObjectWarp() + + 'Canvas.Clear() + + Draw.Begin(Canvas) + Draw.FillRect(0, 0, Draw.W, Draw.H, Draw.Background) + + eTime = Timer + If (eTime - FPS_TIME) > 1 Then + FPS_TIME = eTime + FPS_COUNT = FPS_COUNTER + FPS_COUNTER = 0 + Else + Inc FPS_COUNTER + Endif + + RenderObjects() + RenderBullets() + + Draw.Foreground = Color.Red + + Draw.Font.Bold = True + Draw.Text(("Object Count:") & " " & Obj.Count, 1, 0) + Draw.Text(("Bullet Count:") & " " & Bullet.Count, 1, Draw.Font.Height * 1) + Draw.Text(("FPS") & " : " & FPS_COUNT, 1, Draw.Font.Height * 2) + + Draw.End() +End + +Function GetDistance(X1 As Float, Y1 As Float, X2 As Float, Y2 As Float) As Float + 'DIM A AS Integer + 'DIM B AS Integer + + 'A = (X1 - X2) + 'B = (Y1 - Y2) + + 'I'm not sure about gambas, but in VB the ^ operator + 'makes calculations we dont really need. This might speed up + 'the process. And we need as much speed as we can get. + + 'RETURN Sqr((A * A) + (B * B)) + Return Hyp(X1 - X2, Y1 - Y2) +End diff --git a/app/examples/Games/DeepSpace/.src/MMath.module b/app/examples/Games/DeepSpace/.src/MMath.module new file mode 100644 index 00000000..32348369 --- /dev/null +++ b/app/examples/Games/DeepSpace/.src/MMath.module @@ -0,0 +1,64 @@ +' Gambas module file + +' +' Copyright (C) 2004, Michael Isaac. All rights reserved. +' + +'PUBLIC CONST Radian AS Float = 0.01745329252 + +Public SineArray As New Float[] +Public CoSineArray As New Float[] + +Public Sub InitializeSineTable() + Dim I As Integer + + 'We create the cosine/sine array so we dont have to call + 'a function which had to calculate a value everytime we call it. + 'These calls are made once here, and then from now we can just + 'point at the value we want. Should be much faster this way. + + For I = 0 To 359 + SineArray.Add(Sin(I * (Pi / 180))) + CoSineArray.Add(Cos(I * (Pi / 180))) + Next +End + + +Function GetDistance(X1 As Float, Y1 As Float, X2 As Float, Y2 As Float) As Float + 'RETURN Sqr((X1 - X2) ^ 2 + (Y1 - Y2) ^ 2) + Return Hyp(X1 - X2, Y1 - Y2) +End + + +' FUNCTION CosE(A AS Float) AS Float +' DIM Angle AS Integer +' +' 'Convert our radian angle to a degree value +' Angle = CInt(A * 180 / Pi) +' +' 'Ensure we're between 0 and 359 +' DO WHILE ((Angle < 0) OR (Angle > 359)) +' IF Angle > 359 THEN Angle = Angle - 360 +' IF Angle < 0 THEN Angle = Angle + 360 +' LOOP +' +' 'Return the value +' RETURN CoSineArray[Angle] +' END +' +' +' FUNCTION SinE(A AS Float) AS Float +' DIM Angle AS Integer +' +' 'Convert our radian angle to a degree value +' Angle = CInt(A * (180 / Pi)) +' +' 'Ensure we're between 0 and 359 +' DO WHILE ((Angle < 0) OR (Angle > 359)) +' IF (Angle > 359) THEN Angle = Angle - 360 +' IF (Angle < 0) THEN Angle = Angle + 360 +' LOOP +' +' 'Return the value +' RETURN SineArray[Angle] +' END diff --git a/app/examples/Games/DeepSpace/doc/.html_files/eg3.gif b/app/examples/Games/DeepSpace/doc/.html_files/eg3.gif new file mode 100644 index 0000000000000000000000000000000000000000..afdb4e80a294d9f3ec99e8995581727e23f8f5a9 GIT binary patch literal 2782 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 + + + Polar Coordinates + + + +
+ + + + + + +
+
Polar +Coordinates
+ converting +(r, d) to (x, y)
+
+
+
+ + + + + + +

+
+
Here's a +point shown using polar +coordinates.
+ It would be labeled (r, d) + or (4, 300°) for this point.
+

+
+
+
+
+
+
+
+ + + + + + + +
+
+
The +point (x, y) +can be located by finding the horizontal and vertical components +of r.  We can do that by +substituting the radius and the degree + (r, d) into the +following formulas.
+
+
+
+
+
x += r * cos(d)
+ y = r * +sin(d)
+
+
+
So we end up with;
+
+
+
+
x += 4 * cos(300) =     2
+y = 4 * sin(300) = -3.46
+
+
+
As we can +see, the +point (4, 300°) +in +polar coordinates is equivalent to a point with the rectangular +coordinates (2, -3.46)
+
+

+
+

+x = r * cos(d)

+ y = r * +sin(d)
+
+
+
+
+
+ + + + + + +
Content by Michael Isaac, 2004
+
Original Graphics, & +Design by Bill Willis 2001
+
+
+
+
+
+
+ + diff --git a/app/examples/Games/DeepSpace/doc/howto.txt b/app/examples/Games/DeepSpace/doc/howto.txt new file mode 100644 index 00000000..7b77c1ba --- /dev/null +++ b/app/examples/Games/DeepSpace/doc/howto.txt @@ -0,0 +1,16 @@ + + +HOWTO make objects float around the screen + + set the Torque property of a CObject which will determine its + spin. and then set its motion path, which is defined by its + MX and MY properties. + +HOWTO make objects fire + + this is useful only if you plan to write bot ai. + you can use the Attack property to tell an object to release a + bullet. One bullet will be released every cycle of the mainloop + so make sure you set Attack to false or you will get auto fire + like the ship has. + diff --git a/app/examples/Games/DeepSpace/doc/todo.txt b/app/examples/Games/DeepSpace/doc/todo.txt new file mode 100644 index 00000000..b10d6d4e --- /dev/null +++ b/app/examples/Games/DeepSpace/doc/todo.txt @@ -0,0 +1,17 @@ + +Things that need to be finished or started. + + - object collision. i removed the old object collision cause it + sucked. new collision code needs to be written which includes + elastic collisions so asteroids that bump eachother or the ship + will around + + - some kind of asteroids style game as an example of what + this little engine is for + + - write bot ai, so there is an opponent for everyone to fight + + - single bullet fire mode, not full on automatic + - network play mode, where players can fight head to head + - more stuff i havent thought of + diff --git a/app/examples/Games/DeepSpace/images/deepspace.png b/app/examples/Games/DeepSpace/images/deepspace.png new file mode 100644 index 0000000000000000000000000000000000000000..cb4454f5e59f283251010558593f3a4d2750973a GIT binary patch literal 14195 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 literal 0 HcmV?d00001 diff --git a/app/examples/Games/DeepSpace/object.data/kite.2do b/app/examples/Games/DeepSpace/object.data/kite.2do new file mode 100644 index 00000000..02cee166 --- /dev/null +++ b/app/examples/Games/DeepSpace/object.data/kite.2do @@ -0,0 +1,8 @@ +' Generated with the DeepSpace Polygon Factory. + +11,5 +12,85 +20,177 +20,183 +12,275 +11,355 diff --git a/app/examples/Games/DeepSpace/object.data/main.lst b/app/examples/Games/DeepSpace/object.data/main.lst new file mode 100644 index 00000000..110a7135 --- /dev/null +++ b/app/examples/Games/DeepSpace/object.data/main.lst @@ -0,0 +1,12 @@ +' +' Object List File. +' +' This file is used to tell the game which files to load on start up. +' The first object is the player object. +' +' data_file.2do,ID,X,Y +' + +ship.2do,Subjugator,320,240 +triangle.2do,Object1,200,100 +triangle.2do,Object2,300,100 diff --git a/app/examples/Games/DeepSpace/object.data/ship.2do b/app/examples/Games/DeepSpace/object.data/ship.2do new file mode 100644 index 00000000..8615f9e8 --- /dev/null +++ b/app/examples/Games/DeepSpace/object.data/ship.2do @@ -0,0 +1,13 @@ +' +' All ordered pairs are Polar Coordinates (Radius, Degree) +' See doc/coordinates.html for more information +' + +8,000 +8,120 +20,040 +15,140 +20,180 +15,220 +20,320 +8,240 diff --git a/app/examples/Games/DeepSpace/object.data/triangle.2do b/app/examples/Games/DeepSpace/object.data/triangle.2do new file mode 100644 index 00000000..85c2fc8d --- /dev/null +++ b/app/examples/Games/DeepSpace/object.data/triangle.2do @@ -0,0 +1,8 @@ +' +' All ordered pairs are Polar Coordinates (Radius, Degree) +' See doc/coordinates.html for more information +' + +30,000 +30,120 +30,240 diff --git a/app/examples/Games/DeepSpace/object.data/x-wing.2do b/app/examples/Games/DeepSpace/object.data/x-wing.2do new file mode 100644 index 00000000..f777e8d2 --- /dev/null +++ b/app/examples/Games/DeepSpace/object.data/x-wing.2do @@ -0,0 +1,38 @@ +' +' All ordered pairs are Polar Coordinates (Radius, Degree) +' See doc/coordinates.html for more information +' + +18,3 +16,10 +16,7 +6,38 +5,53 +15,82 +16,79 +18,60 +19,59 +22,50 +19,59 +20,63 +18,96 +17,100 +16,97 +6,116 +6,141 +6,218 +6,243 +16,262 +17,259 +18,263 +20,296 +19,300 +22,309 +19,300 +18,299 +16,280 +15,277 +5,306 +16,349 +16,352 +18,356 diff --git a/app/examples/Games/GNUBoxWorld/.directory b/app/examples/Games/GNUBoxWorld/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/app/examples/Games/GNUBoxWorld/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/app/examples/Games/GNUBoxWorld/.hidden/screenshots/2014-12-14.png b/app/examples/Games/GNUBoxWorld/.hidden/screenshots/2014-12-14.png new file mode 100644 index 0000000000000000000000000000000000000000..c5b1b7648619c004bc0b3a08fc1f2fdf2e08382f GIT binary patch literal 185109 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�- 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%0Db{Pw*B*R@gJ zvK(6)q1c-wu04(%+`+0fH(#;<(O8U%%1S2ufYLo5;Z-gqUSCUMEJ<@q16_fl#C3_+ z*Wox*lpfg4WMvgq)zwU-QghmST4d(470H|yK-shu_R1>n0b!-FC3P&kZaJ-EFrLXG zN-^}>b2Mz)Le#gER5#M$q$sLuBy3Bv-(5#oV_>kP9M9%UO)dG8BE6>^7Bn=o=h$96(X_O#M(K-de2gcP zc!20F=PGE~m`S!L$z zhh~LduD{pMak5!>I-oeJLcfzS5tQD-aGyTM{(d_LTCA9LhOpW&Q zhu{8V_H=wmcgKDT^PkV?>Fi|h&Yf6mu~@1q7tq_+OI2lzj5EdLP_ZBe zHoxcCw|h5T?d@~s608(>n%N#;jHH8U>jhe5cK3AA(v@s8iXHvkTxZg}d%TmX&D#jV zC3JLjBgJKm_naUyHA(5xbztqZ5JE^RG(LN}hB)-xf6`K4PkN+_To7>miuLE^0gGB& zi8nUVJ(!~U`6u9kZ&F%Xj3AWk`v?Nd)cP9`@&>5h{tQ!}`4!qWZ6Yx`I;Z1gRK5_( zdjqF)fKg<;>E%NSXKYlOT34{GqKduychOkBfK*X2LC&RexSMq=){?vZ%Ou(luuHA&qxrEBANYynnJTk})%T{sMwg>pq#?8d~j^Okj2c@xCA}eoX!i3RE zar3g3e0l2^xM}@nw9%aHcjk|}c%18&EhCpYNmEl5$U0-9$}>SSe(OJ6O2D zFxI)BriOC7^cYK)Eu+4%an4)?56GANYE}pcj!eHB@h$q}Hft@*R#U#~T{1NbvC&G7 zi{kLpkMoVYA7I7mjWjkbX4jtgc=O#?C|SIkNL4+lXa$F@rM;_*<;V8%tJ@wp? znj)D@;<`B!BO`d8M>3Hh<2X#DQu#tClVNOh6fc(}F*-`lbvczxGBq(Vx8o#MnQ5Nd z&dLEwt90Q=ki}Q>F|UWi;Rs*cdM{7D_!Oa)H{qpDQ4@}k%ejaMu?1D!dduBxYP*?^ zj>GKQ`#wD*L%2aeLsbpUTecw=@cQ}shkpb>;n-@SiC#b3DD$qJv(YZ1WV!=h$N>WI z>Jj^`i5%Ys$YgVsUSK0!g)mC8MUl`LKs3bP+`U2`Hvm@rDaX@T8;Fzjbzm)5-3b{1 zC87hRL_};^*iON82#hCAwR_=MIGy!X#>r0CPFJAL~CZ1py#` zjIfkEH|&t8m{4g01=r7*_|k(;{X5v07*qoM6N<$f-zMzSO5S3 literal 0 HcmV?d00001 diff --git a/app/examples/Games/GNUBoxWorld/.lang/ca.po b/app/examples/Games/GNUBoxWorld/.lang/ca.po new file mode 100644 index 00000000..a4a49c22 --- /dev/null +++ b/app/examples/Games/GNUBoxWorld/.lang/ca.po @@ -0,0 +1,112 @@ +# Catalan translation of GNUBoxWorld +# Copyright (C) 2000-2010 Benoît Minisini. +# This file is distributed under the same license as the GNUBoxWorld package. +# Jordi Sayol , 2007-2010. +# +# +msgid "" +msgstr "" +"Project-Id-Version: GNUBoxWorld\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2011-03-20 18:06+0100\n" +"Last-Translator: Jordi Sayol \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: FMain.form:44 +msgid "About" +msgstr "Quant a" + +#: FrmAbout.form:13 +msgid "About..." +msgstr "Quant a..." + +#: FMain.class:254 +msgid "Are you sure?" +msgstr "N'esteu segur?" + +#: FrmAbout.form:20 +msgid "Author" +msgstr "Autor" + +#: FrmAbout.form:24 +msgid "Author: Pablo Mileti.

You can submit your questions, suggestions, bugs, etc, to the following E-Mail address:\n
pablomileti@gmail.com" +msgstr "Autor: Pablo Mileti.

Podeu enviar les vostres preguntes, suggeriments, errors, etc. a aquesta adreça de correu electrònic:\n pablomileti@gmail.com" + +#: FrmAbout.form:42 +msgid "Aim
\nThe shrimp has to push the movable boxes to the marked positions.

\nMove
\nTo move around the game board, use the arrow keys: up, down, left and right.

\nClear
\nTo restart the level, press the spacebar key." +msgstr "Objectiu
\nLa gambeta ha d'empènyer les caixes mòbils a les posicions marcades.

\nMoviment
\nPer moure-us per tot el tauler de joc, feu servir les tecles de fletxa: amunt, avall, esquerra i dreta.

\nNeteja
\nPer a reiniciar el nivell, premeu la tecla d'espai." + +#: FMain.form:21 +msgid "Clear" +msgstr "Neteja" + +#: FrmAbout.form:50 +msgid "&Close" +msgstr "&Tanca" + +#: FMain.form:18 +msgid "Game" +msgstr "Joc" + +#: .project:1 +msgid "GNUBoxWorld" +msgstr "GNUBoxWorld" + +#: FMain.class:81 +msgid "GNUBoxWorld - Congratulation! You're very clever!" +msgstr "GNUBoxWorld - Felicitats! Ets molt inteŀligent!" + +#: FMain.class:222 +msgid "GNUBoxWorld - Level " +msgstr "GNUBoxWorld - Nivell" + +#: FMain.class:83 +msgid "Good Luck!" +msgstr "Bona sort!" + +#: FMain.form:36 +msgid "Help" +msgstr "Ajuda" + +#: FMain.form:39 FrmAbout.form:38 +msgid "How to play?" +msgstr "Com jugar?" + +#: FMain.form:32 +msgid "Level" +msgstr "Nivell" + +#: FrmAbout.form:28 +msgid "License" +msgstr "Llicència" + +#: FrmAbout.form:32 +msgid "\n Copyright (C) 2010. Author: Pablo Mileti \n\nThis 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.\n\nThis 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.\n\nYou should have received a copy of the GNU General Public License along with this program. If not, see ." +msgstr "\n Copyright (C) 2010. Autor: Pablo Mileti \n\nAquest programa és programari lliure; el podeu distribuir i/o modificar sota els termes de la llicència GNU General Public License tal i com està publicada per la Free Software Foundation; ja sigui la versió 3 de la llicència, o bé (si ho preferiu) qualsevol versió posterior.\n\nAquest programa es distribueix amb la voluntat que pugui ser útil però SENSE CAP GARANTIA; ni tant sols les garanties implícites MERCANTILS o ESPECÍFIQUES PER UN PROPÒSIT DETERMINAT. Si voleu més informació, vegeu la llicència GNU General Public Licence.\n\nHauríeu d'haver rebut una còpia de la GNU General Public Licence juntament amb aquest programa. Si no fos així, mireu ." + +#: FMain.class:83 +msgid "Next level" +msgstr "Nivell següent" + +#: FMain.class:254 +msgid "No" +msgstr "-" + +#: FMain.form:26 +msgid "Quit" +msgstr "Surt" + +#: .project:2 +msgid "This is another version of the popular game Box World. Contains 16 levels, all are possible to resolve. Level designs are taken from Box It game for mobile phones." +msgstr "Aquesta és una altra versió del popular joc Box Wolrd. Conté 16 nivells, i tots es poden resoldre. El dissenys dels nivells s'han agafat del joc Box per a telèfons mòbils." + +#: FMain.class:254 +msgid "Yes" +msgstr "Sí" + diff --git a/app/examples/Games/GNUBoxWorld/.lang/cs.po b/app/examples/Games/GNUBoxWorld/.lang/cs.po new file mode 100644 index 00000000..a890bbf8 --- /dev/null +++ b/app/examples/Games/GNUBoxWorld/.lang/cs.po @@ -0,0 +1,116 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "GNUBoxWorld" +msgstr "-" + +#: .project:2 +msgid "This is another version of the popular game Box World. Contains 16 levels, all are possible to resolve. Level designs are taken from Box It game for mobile phones." +msgstr "To je další verze populární hry Box World. Obsahuje 16 úrovní, všechny je možné vyřešit. Vzory úrovňí jsou převzaty z Box hry pro mobilní telefony." + +#: FMain.class:81 +msgid "GNUBoxWorld - Congratulation! You're very clever!" +msgstr "GNUBoxWorld - Gratulujeme! Jsi velmi chytrý!" + +#: FMain.class:83 +msgid "Good Luck!" +msgstr "Hodně štěstí!" + +#: FMain.class:83 +msgid "Next level" +msgstr "Další level" + +#: FMain.class:222 +msgid "GNUBoxWorld - Level " +msgstr "GNUBoxWorld - úroveň " + +#: FMain.class:254 +msgid "Are you sure?" +msgstr "Jste si jisti?" + +#: FMain.class:254 +msgid "No" +msgstr "Ne" + +#: FMain.class:254 +msgid "Yes" +msgstr "Ano" + +#: FMain.form:18 +msgid "Game" +msgstr "Hra" + +#: FMain.form:21 +msgid "Clear" +msgstr "Vyčistit" + +#: FMain.form:26 +msgid "Quit" +msgstr "Ukončit" + +#: FMain.form:32 +msgid "Level" +msgstr "Úroveň" + +#: FMain.form:36 +msgid "Help" +msgstr "Nápověda" + +#: FMain.form:39 FrmAbout.form:38 +msgid "How to play?" +msgstr "Jak hrát?" + +#: FMain.form:44 +msgid "About" +msgstr "O" + +#: FrmAbout.form:13 +msgid "About..." +msgstr "O..." + +#: FrmAbout.form:20 +msgid "Author" +msgstr "Autor" + +#: FrmAbout.form:24 +msgid "" +"Author: Pablo Mileti.

You can submit your questions, suggestions, bugs, etc, to the following E-Mail address:\n" +" pablomileti@gmail.com" +msgstr "" +"Autor: Pablo Mileti.

Můžete odeslat Vaše dotazy, připomínky, chyby, atd., nanásledující e-mail:\n" +" pablomileti@gmail.com" + +#: FrmAbout.form:28 +msgid "License" +msgstr "Licence" + +#: FrmAbout.form:42 +msgid "" +"Aim
\n" +"The shrimp has to push the movable boxes to the marked positions.

\n" +"Move
\n" +"To move around the game board, use the arrow keys: up, down, left and right.

\n" +"Clear
\n" +"To restart the level, press the spacebar key." +msgstr "" +"Aim
\n" +"krevety musí tlačit pohyblivé boxy označených místech.

\n" +"Pohyb
\n" +"Pro pohyb na hrací ploše, pomocí kláves se šipkami: nahoru,dolů, doleva a doprava.

\n" +"Vymazat
\n" +"Chcete-li restartovat úroveň, stiskněte klávesu mezerník." + +#: FrmAbout.form:50 +msgid "&Close" +msgstr "&Zavřít" diff --git a/app/examples/Games/GNUBoxWorld/.lang/de.po b/app/examples/Games/GNUBoxWorld/.lang/de.po new file mode 100644 index 00000000..b28ef375 --- /dev/null +++ b/app/examples/Games/GNUBoxWorld/.lang/de.po @@ -0,0 +1,105 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "GNUBoxWorld" +msgstr "-" + +#: .project:2 +msgid "This is another version of the popular game Box World. Contains 16 levels, all are possible to resolve. Level designs are taken from Box It game for mobile phones." +msgstr "Dies ist noch eine Version des populären Spiels Box World. Enthält 16 Levels, alle lösbar. Die Level-Designs stammen von dem Spiel \"Box It\" für Handys." + +#: FMain.class:81 +msgid "GNUBoxWorld - Congratulation! You're very clever!" +msgstr "GNUBoxWorld - Gratulation! Du bist verdammt schlau!" + +#: FMain.class:83 +msgid "Good Luck!" +msgstr "Viel Glück!" + +#: FMain.class:83 +msgid "Next level" +msgstr "Nächstes Level" + +#: FMain.class:222 +msgid "GNUBoxWorld - Level " +msgstr "-" + +#: FMain.class:254 +msgid "Are you sure?" +msgstr "Bist du sicher?" + +#: FMain.class:254 +msgid "No" +msgstr "Nein" + +#: FMain.class:254 +msgid "Yes" +msgstr "Ja" + +#: FMain.form:18 +msgid "Game" +msgstr "Spiel" + +#: FMain.form:21 +msgid "Clear" +msgstr "Neustart" + +#: FMain.form:26 +msgid "Quit" +msgstr "Beenden" + +#: FMain.form:32 +msgid "Level" +msgstr "-" + +#: FMain.form:36 +msgid "Help" +msgstr "Hilfe" + +#: FMain.form:39 FrmAbout.form:38 +msgid "How to play?" +msgstr "Spielanleitung" + +#: FMain.form:44 +msgid "About" +msgstr "Über" + +#: FrmAbout.form:13 +msgid "About..." +msgstr "Über..." + +#: FrmAbout.form:20 +msgid "Author" +msgstr "Autor" + +#: FrmAbout.form:24 +msgid "Author: Pablo Mileti.

You can submit your questions, suggestions, bugs, etc, to the following E-Mail address:\n pablomileti@gmail.com" +msgstr "Autor: Pablo Mileti.

Du kannst Fragen, Vorschläge, Bugs, etc, an diese E-Mail-Adresse senden:\n pablomileti@gmail.com" + +#: FrmAbout.form:28 +msgid "License" +msgstr "Lizenz" + +#: FrmAbout.form:32 +msgid "\n Copyright (C) 2010. Author: Pablo Mileti \n\nThis 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.\n\nThis 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.\n\nYou should have received a copy of the GNU General Public License along with this program. If not, see ." +msgstr "\n Copyright (C) 2010. Autor: Pablo Mileti \n\nThis 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.\n\nThis 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.\n\nYou should have received a copy of the GNU General Public License along with this program. If not, see ." + +#: FrmAbout.form:42 +msgid "Aim
\nThe shrimp has to push the movable boxes to the marked positions.

\nMove
\nTo move around the game board, use the arrow keys: up, down, left and right.

\nClear
\nTo restart the level, press the spacebar key." +msgstr "Ziel
Der Shrimp muss die beweglichen Boxen auf die markierten Felder schieben.

\nBewegen
\nMit den Pfeiltasten Hoch, Runter, Links und Rechts bewegt man den Shrimp auf dem Spielfeld.

\nNeustart
\nUm das Level neu zu starten, Leertaste drücken." + +#: FrmAbout.form:50 +msgid "&Close" +msgstr "&Schließen" + diff --git a/app/examples/Games/GNUBoxWorld/.lang/es_AR.po b/app/examples/Games/GNUBoxWorld/.lang/es_AR.po new file mode 100644 index 00000000..1bbb7e86 --- /dev/null +++ b/app/examples/Games/GNUBoxWorld/.lang/es_AR.po @@ -0,0 +1,101 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "GNUBoxWorld" +msgstr "-" + +#: .project:2 +msgid "This is another version of the popular game Box World. Contains 16 levels, all are possible to resolve. Level designs are taken from Box It game for mobile phones." +msgstr "Esta es otra versión del popular juego Box World. Contiene 16 niveles, todos son posibles de resolver. El diseño de los niveles fue tomado del juego Box It para teléfonos celulares." + +#: FMain.class:59 +msgid "GNUBoxWorld - Congratulation! You're very clever!" +msgstr "GNUBoxWorld - Felicitaciones! Eres muy listo!" + +#: FMain.class:61 +msgid "Good Luck!" +msgstr "Suerte!" + +#: FMain.class:61 +msgid "Next level" +msgstr "Próximo nivel " + +#: FMain.class:197 +msgid "GNUBoxWorld - Level " +msgstr "GNUBoxWorld - Nivel " + +#: FMain.class:224 +msgid "Are you sure?" +msgstr "Desea salir?" + +#: FMain.class:224 +msgid "Yes" +msgstr "Si" + +#: FMain.class:258 +msgid "Game" +msgstr "Juego" + +#: FMain.class:261 +msgid "Clear" +msgstr "Limpiar" + +#: FMain.class:266 +msgid "Quit" +msgstr "Salir" + +#: FMain.class:272 +msgid "Help" +msgstr "Ayuda" + +#: FMain.class:275 FrmAbout.class:61 +msgid "How to play?" +msgstr "Cómo jugar?" + +#: FMain.class:280 +msgid "About" +msgstr "Acerca de..." + +#: FrmAbout.class:36 +msgid "About..." +msgstr "Acerca de..." + +#: FrmAbout.class:43 +msgid "Author" +msgstr "Autor" + +#: FrmAbout.class:47 +msgid "" +"Author: Pablo Mileti.

You can submit your questions, suggestions, bugs, etc, to the following E-Mail address:\n" +" pablomileti@gmail.com" +msgstr "Autor: Pablo Mileti.

Pueden enviar sus dudas, sugerencias, bugs, etc, a la siguiente dirección de correo electrónico: pablomileti@gmail.com" + +#: FrmAbout.class:51 +msgid "License" +msgstr "Licencia" + +#: FrmAbout.class:65 +msgid "" +"Move
\n" +"To move around the game board, use the arrow keys: up, down, left and right.

\n" +"Clear
\n" +"To restart the level, press the spacebar key." +msgstr "" +"Movimientos
\n" +"Para moverse por el tablero de juego utilice las teclas de dirección arriba, abajo, izquierda y derecha.

\n" +"Limpiar
\n" +"Para reiniciar un nivel presione la barra espaciadora." + +#: FrmAbout.class:73 +msgid "&Close" +msgstr "&Cerrar" diff --git a/app/examples/Games/GNUBoxWorld/.lang/ru.po b/app/examples/Games/GNUBoxWorld/.lang/ru.po new file mode 100644 index 00000000..e8fe2ec9 --- /dev/null +++ b/app/examples/Games/GNUBoxWorld/.lang/ru.po @@ -0,0 +1,160 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Games/GNUBoxWorld/.project:20 +msgid "GNUBoxWorld" +msgstr "Мир GNU-блоков" + +#: app/examples/Games/GNUBoxWorld/.project:21 +msgid "" +"This is another version of the popular game Box World.\n" +"\n" +"It contains 16 levels, all are possible to resolve. Level designs are taken from the Box It game for mobile phones." +msgstr "" +"Это ещё одна версия популярной игры Мира блоков.\n" +"\n" +"Она содержит 16 уровней, все можно решить. Дизайн уровней взят из игры «Box It/Заблокуй» для мобильных телефонов." + +#: app/examples/Games/GNUBoxWorld/.src/FMain.class:42 +msgid "Level &1" +msgstr "Уровень &1" + +#: app/examples/Games/GNUBoxWorld/.src/FMain.class:81 +msgid "GNUBoxWorld - Congratulation! You're very clever!" +msgstr "Мир GNU-блоков - Поздравляем! Вы очень умные!" + +#: app/examples/Games/GNUBoxWorld/.src/FMain.class:83 +msgid "Next level" +msgstr "Следующий уровень" + +#: app/examples/Games/GNUBoxWorld/.src/FMain.class:83 +msgid "Good Luck!" +msgstr "Удачи!" + +#: app/examples/Games/GNUBoxWorld/.src/FMain.class:223 +msgid "GNUBoxWorld - Level " +msgstr "Мир GNU-блоков - Уровень " + +#: app/examples/Games/GNUBoxWorld/.src/FMain.class:255 +msgid "Are you sure?" +msgstr "Вы уверены?" + +#: app/examples/Games/GNUBoxWorld/.src/FMain.class:255 +msgid "Yes" +msgstr "Да" + +#: app/examples/Games/GNUBoxWorld/.src/FMain.class:255 +msgid "No" +msgstr "Нет" + +#: app/examples/Games/GNUBoxWorld/.src/FMain.form:8 +msgid "Game" +msgstr "Игра" + +#: app/examples/Games/GNUBoxWorld/.src/FMain.form:10 app/examples/Games/GNUBoxWorld/.src/FMain.form:35 +msgid "Clear" +msgstr "Очистить" + +#: app/examples/Games/GNUBoxWorld/.src/FMain.form:14 +msgid "Quit" +msgstr "Выход" + +#: app/examples/Games/GNUBoxWorld/.src/FMain.form:19 +msgid "Level" +msgstr "Уровень" + +#: app/examples/Games/GNUBoxWorld/.src/FMain.form:22 +msgid "Help" +msgstr "Справка" + +#: app/examples/Games/GNUBoxWorld/.src/FMain.form:24 app/examples/Games/GNUBoxWorld/.src/FrmAbout.form:28 +msgid "How to play?" +msgstr "Как играть?" + +#: app/examples/Games/GNUBoxWorld/.src/FMain.form:28 +msgid "About" +msgstr "О программе" + +#: app/examples/Games/GNUBoxWorld/.src/FrmAbout.form:5 +msgid "About..." +msgstr "О программе..." + +#: app/examples/Games/GNUBoxWorld/.src/FrmAbout.form:12 +msgid "Author" +msgstr "Автор" + +#: app/examples/Games/GNUBoxWorld/.src/FrmAbout.form:15 +msgid "" +"Author: Pablo Mileti.

You can submit your questions, suggestions, bugs, etc, to the following E-Mail address:\n" +" pablomileti@gmail.com" +msgstr "" +"Автор: Пабло Милети.

Вы можете отправить свои вопросы, предложения, ошибки и т. д. на следующий электронный адрес:\n" +"pablomileti@gmail.com" + +#: app/examples/Games/GNUBoxWorld/.src/FrmAbout.form:19 +msgid "License" +msgstr "Лицензия" + +#: app/examples/Games/GNUBoxWorld/.src/FrmAbout.form:22 +msgid "" +"\n" +" Copyright (C) 2010. Author: Pablo Mileti \n" +"\n" +"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.\n" +"\n" +"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.\n" +"\n" +"You should have received a copy of the GNU General Public License along with this program. If not, see ." +msgstr "" +"\n" +" Copyright (C) 2010. Автор: Пабло Милети\n" +"\n" +"Эта программа ― свободное программное обеспечение. Вы можете распространять или изменять его при условиях соответствия лицензии GNU General Public License опубликованной Free Software Foundation; либо версии 3 лицензии, либо (на ваше усмотрение) любой более поздней версии.\n" +"\n" +"Программа распространяется в надежде на то, что приложение будет полезно, но БЕЗ ВСЯКИХ ГАРАНТИЙ; не гарантируется даже ПРИГОДНОСТЬ или СООТВЕТСТВИЕ КАКИМ-ЛИБО ТРЕБОВАНИЯМ. Для получения дополнительной информации ознакомьтесь с лицензией GNU General Public License.\n" +"\n" +"Вы должны получить копию лицензии GNU General Public License вместе с программой. Если этого не произошло, посмотрите ." + +#: app/examples/Games/GNUBoxWorld/.src/FrmAbout.form:31 +msgid "" +"Aim
\n" +"The shrimp has to push the movable boxes to the marked positions.

\n" +"Move
\n" +"To move around the game board, use the arrow keys: up, down, left and right.

\n" +"Clear
\n" +"To restart the level, press the spacebar key." +msgstr "" +"Цель
\n" +"Креветка должна толкать подвижные блоки в отмеченные позиции.

\n" +"Перемещение
\n" +"Для перемещения по игровому полю используйте клавиши со стрелками: вверх, вниз, влево и вправо.\n" +"Очистить
\n" +"Чтобы перезапустить уровень, нажмите клавишу пробела." + +#: app/examples/Games/GNUBoxWorld/.src/FrmAbout.form:38 +msgid "&Close" +msgstr "Закрыть" + diff --git a/app/examples/Games/GNUBoxWorld/.project b/app/examples/Games/GNUBoxWorld/.project new file mode 100644 index 00000000..8fdb90f7 --- /dev/null +++ b/app/examples/Games/GNUBoxWorld/.project @@ -0,0 +1,19 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.6.90 +Title=GNUBoxWorld +Startup=FMain +Icon=icon.png +Version=1.0.0 +Component=gb.image +Component=gb.gui +Component=gb.form +Description="This is another version of the popular game Box World.\n\nIt contains 16 levels, all are possible to resolve. Level designs are taken from the Box It game for mobile phones." +Authors="Pablo Mileti from Buenos Aires, Argentina." +TabSize=2 +Translate=1 +Language=en +Vendor=Example +Packager=1 +Tags=Example,Game,LogicGame +Screenshot=.hidden/screenshots/2014-12-14.png +CreateMenu=1 diff --git a/app/examples/Games/GNUBoxWorld/.src/Cell.class b/app/examples/Games/GNUBoxWorld/.src/Cell.class new file mode 100644 index 00000000..f3f2f333 --- /dev/null +++ b/app/examples/Games/GNUBoxWorld/.src/Cell.class @@ -0,0 +1,78 @@ +' Gambas class file + +' Copyright(C)2010. Autor: Pablo Mileti + +'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.IfNot, see < http: / / www.gnu.org / licenses / > . + +Public Const gbFloor As Integer = 0 +Public Const gbMovable As Integer = 1 +Public Const gbMovableOnTarget As Integer = 2 +Public Const gbTarget As Integer = 3 +Public Const gbObstacle As Integer = 4 + +Public Busy As Boolean +Public Movable As Boolean +Public Target As Boolean +Public Pic As Picture +Public Type As Integer + +Public Sub _new(type As Integer) + Select Case type + + Case 0 + Me.Type = Me.gbFloor + Me.Busy = False + Me.Movable = False + Me.Pic = Picture["piso.png"] + Me.Target = False + + Case 1 + Me.Type = Me.gbMovable + Me.Busy = True + Me.Movable = True + Me.Pic = Picture["movible.png"] + Me.Target = False + + Case 2 + Me.Type = Me.gbMovableOnTarget + Me.Busy = True + Me.Movable = True + Me.Pic = Picture["movibleendestino.png"] + Me.Target = True + + Case 3 + Me.Type = Me.gbTarget + Me.Busy = False + Me.Movable = False + Me.Pic = Picture["destino.png"] + Me.Target = True + + Case 4 + Me.Type = Me.gbObstacle + Me.Busy = True + Me.Movable = False + Me.Pic = Picture["obstaculo.png"] + Me.Target = False + +End Select + +End + +Public Sub FixObstaculo(hLeft As Cell, hRight As Cell) + + Dim sSuffix As String + + If Me.Type <> gbObstacle Then Return + + If Not hLeft Or If hLeft.Type <> gbObstacle Then sSuffix &= "l" + If Not hRight Or If hRight.Type <> gbObstacle Then sSuffix &= "r" + + If Not sSuffix Then Return + + Pic = Picture["obstaculo-" & sSuffix & ".png"] + +End diff --git a/app/examples/Games/GNUBoxWorld/.src/FMain.class b/app/examples/Games/GNUBoxWorld/.src/FMain.class new file mode 100644 index 00000000..da712599 --- /dev/null +++ b/app/examples/Games/GNUBoxWorld/.src/FMain.class @@ -0,0 +1,274 @@ +' Gambas class file + +' +' GNUBoxWorld +' This is another version of the popular game Box World. Contains 16 levels, all are possible to resolve. +' Level designs are taken From Box It game For mobile phones. +' +' Copyright (C) Pablo Mileti from Buenos Aires, Argentina. +' +' 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 http://www.gnu.org/licenses +' + +Public Game As GameBoard +Public level As Integer +Public PicturesBoxes As New PictureBox[10, 11] +Public PictureBoxPlayer As PictureBox +Public PictureBoxMover As PictureBox +Public DesX As Integer +Public DesY As Integer +Public XPosMove As Integer +Public YPosMove As Integer +Public IgnoreKeys As Boolean + +Public Sub Form_Open() + + Dim iInd As Integer + Dim hMenu As Menu + + For iInd = 1 To GameBoard.NUM_LEVELS + hMenu = New Menu(mnuLevel) As "mnuLevel" + hMenu.Text = Subst(("Level &1"), iInd) + hMenu.Tag = iInd + Next + + level = 1 + ignorekeys = False + newGame + Me.h = 64 * 10 + Me.w = 64 * 11 + btnClear.X = (Me.W / 2) - (btnClear.W / 2) + Me.Window.Center +End + +Public Sub btnClear_KeyPress() + If Key.code <> Key.up And Key.code <> Key.down And Key.code <> Key.left And Key.code <> Key.Right Then Return + Select Case Key.code + Case Key.Right + PictureBoxPlayer.Picture = picture["derecha.png"] + Case Key.Left + PictureBoxPlayer.Picture = picture["izquierda.png"] + Case Key.Up + PictureBoxPlayer.Picture = picture["arriba.png"] + Case Key.Down + PictureBoxPlayer.Picture = picture["abajo.png"] + End Select + If Game.ValidateMover(Key.code) And Not IgnoreKeys Then + Move(Key.code, Game.GetCell(Key.code, 1).Movable) + End If + If Game.isDone() Then + Inc level + If level > GameBoard.NUM_LEVELS Then + btnClear.Visible = False + MnuClear.Enabled = False + PictureBoxPlayer.X = 64 + PictureBoxPlayer.Y = 64 + PictureBoxPlayer.W = 560 + PictureBoxPlayer.H = 482 + PictureBoxPlayer.Picture = Picture["ganador.png"] + PictureBoxPlayer.SetFocus + Me.Title = ("GNUBoxWorld - Congratulation! You're very clever!") + Else + Message.Info(("Next level") & gb.NewLine & ("Good Luck!")) + newGame + End If + End If +End + +Public Sub btnClear_Click() + newGame() +End + +Private Sub Move(direction As Integer, desplace As Boolean) + Dim i As Integer + Select Case direction + Case Key.Right + DesX = 1 + DesY = 0 + PictureBoxPlayer.Picture = picture["derecha.png"] + Case Key.Left + DesX = -1 + DesY = 0 + PictureBoxPlayer.Picture = picture["izquierda.png"] + Case Key.Up + DesX = 0 + DesY = -1 + PictureBoxPlayer.Picture = picture["arriba.png"] + Case Key.Down + DesX = 0 + DesY = 1 + PictureBoxPlayer.Picture = picture["abajo.png"] + End Select + If desplace Then + PictureBoxMover.Picture = WhoMove(direction) + PictureBoxMover.X = XPosMove + PictureBoxMover.Y = YPosMove + PictureBoxMover.Raise + 'here will walk on + If Game.cells[Game.RowPlayer + DesY, Game.ColPlayer + DesX].Type = Cell.gbMovable Then + PicturesBoxes[Game.RowPlayer + DesY, Game.ColPlayer + DesX].picture = Picture["piso.png"] + End If + If Game.cells[Game.RowPlayer + DesY, Game.ColPlayer + DesX].Type = Cell.gbMovableOnTarget Then + PicturesBoxes[Game.RowPlayer + DesY, Game.ColPlayer + DesX].picture = Picture["destino.png"] + End If + End If + IgnoreKeys = True + For i = 1 To 64 + PictureBoxPlayer.Move(PictureBoxPlayer.x + Desx, PictureBoxPlayer.y + DesY) + If desplace Then PictureBoxmover.Move(PictureBoxmover.x + Desx, PictureBoxmover.y + DesY) + Wait 0.003 + Next + IgnoreKeys = False + 'here i was + 'cambio el contenido de la celda donde deje de estar + If Game.cells[Game.RowPlayer, Game.ColPlayer].Target Then + Game.cells[Game.RowPlayer, Game.ColPlayer] = New Cell(Cell.gbTarget) + Else + Game.cells[Game.RowPlayer, Game.ColPlayer] = New Cell(Cell.gbFloor) + End If + Game.RowPlayer = Game.RowPlayer + DesY + Game.ColPlayer = Game.ColPlayer + DesX + 'here i go + 'donde termino parado + If Not Game.cells[Game.RowPlayer, Game.ColPlayer].Target Then + Game.cells[Game.RowPlayer, Game.ColPlayer] = New Cell(Cell.gbFloor) + Else + Game.cells[Game.RowPlayer, Game.ColPlayer] = New Cell(Cell.gbTarget) + End If + If desplace Then 'here move obstacle + If Game.cells[Game.RowPlayer + desy, Game.ColPlayer + desX].Target Then 'go on target + Game.cells[Game.RowPlayer + desy, Game.ColPlayer + desX] = New Cell(Cell.gbMovableOnTarget) + Else 'go on floor + Game.cells[Game.RowPlayer + desy, Game.ColPlayer + desX] = New Cell(Cell.gbMovable) + End If + End If + ShowGameBoard + PictureBoxmover.Lower +End + +Private Function WhoMove(direction As Integer) As Picture + Dim row As Integer + Dim col As Integer + Select Case direction + Case Key.Up + row = Game.RowPlayer - 1 + col = Game.ColPlayer + Case Key.Down + row = Game.RowPlayer + 1 + col = Game.ColPlayer + Case Key.left + row = Game.RowPlayer + col = Game.ColPlayer - 1 + Case Key.right + row = Game.RowPlayer + col = Game.ColPlayer + 1 + End Select + XPosMove = PicturesBoxes[row, col].X + YPosMove = PicturesBoxes[row, col].Y + Return PicturesBoxes[row, col].Picture.Copy() +End + +Public Sub ShowGameBoard() + + Dim row As Integer + Dim col As Integer + For row = 0 To 9 + For col = 0 To 10 + PicturesBoxes[row, col].Picture = Game.Cells[row, col].Pic + Next + Next + +End + +Public Sub MakePictureBoxes() + Dim row As Integer + Dim col As Integer + For row = 0 To 9 + For col = 0 To 10 + PicturesBoxes[row, col] = New PictureBox(Me) + PicturesBoxes[row, col].h = 64 + PicturesBoxes[row, col].w = 64 + PicturesBoxes[row, col].Stretch = True + PicturesBoxes[row, col].top = (row * 64) + PicturesBoxes[row, col].left = (col * 64) + PicturesBoxes[row, col].Lower + Next + Next + PictureBoxPlayer = New PictureBox(Me) + PictureBoxMover = New PictureBox(Me) + PictureBoxmover.w = 64 + PictureBoxmover.h = 64 + PictureBoxPlayer.Picture = picture["derecha.png"] + PictureBoxPlayer.h = 64 + PictureBoxPlayer.w = 64 + PictureBoxPlayer.left = PicturesBoxes[Game.RowPlayer, Game.ColPlayer].left + PictureBoxPlayer.top = PicturesBoxes[Game.RowPlayer, Game.ColPlayer].top +End + +Private Sub newGame() + + Dim hMenu As Menu + + Me.Title = ("GNUBoxWorld - Level ") & level + Game = New GameBoard(level) + destroyPicturesBoxes + MakePictureBoxes + PictureBoxPlayer.left = PicturesBoxes[Game.RowPlayer, Game.ColPlayer].left + PictureBoxPlayer.top = PicturesBoxes[Game.RowPlayer, Game.ColPlayer].top + ShowGameBoard + + For Each hMenu In mnuLevel.Children + hMenu.Checked = hMenu.Tag = level + Next + +End + +Public Sub destroyPicturesBoxes() + Dim control As Object + For Each control In Me.Children + If Object.Type(control) = "PictureBox" Then + control.delete + End If + Next +End + +Public Sub MnuAbout_Click() + FrmAbout.Show +End + +Public Sub MnuQuit_Click() + Me.close +End + +Public Sub Form_Close() + If Message.Question(("Are you sure?"), ("Yes"), ("No")) = 2 Then + Stop Event + End If +End + +Public Sub MnuClear_Click() + newGame() +End + +Public Sub MnuHelpPlay_Click() + FrmAbout.TabStrip1.index = 2 + FrmAbout.Show +End + +Public Sub mnuLevel_Click() + + level = Last.Tag + newGame + +End diff --git a/app/examples/Games/GNUBoxWorld/.src/FMain.form b/app/examples/Games/GNUBoxWorld/.src/FMain.form new file mode 100644 index 00000000..116ef9a4 --- /dev/null +++ b/app/examples/Games/GNUBoxWorld/.src/FMain.form @@ -0,0 +1,37 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,99,83) + Icon = Picture["icon.png"] + Resizable = False + { MnuGame Menu + Text = ("Game") + { MnuClear Menu + Text = ("Clear") + Picture = Picture["icon:/32/clear"] + } + { MnuQuit Menu + Text = ("Quit") + Picture = Picture["icon:/32/quit"] + } + } + { mnuLevel Menu + Text = ("Level") + } + { MnuHelp Menu + Text = ("Help") + { MnuHelpPlay Menu + Text = ("How to play?") + Picture = Picture["icon:/32/help"] + } + { MnuAbout Menu + Text = ("About") + Picture = Picture["icon:/32/info"] + } + } + { btnClear Button + MoveScaled(15,2,16,6) + Font = Font["Bold,+4"] + Text = ("Clear") + } +} diff --git a/app/examples/Games/GNUBoxWorld/.src/FrmAbout.class b/app/examples/Games/GNUBoxWorld/.src/FrmAbout.class new file mode 100644 index 00000000..33a4a0fb --- /dev/null +++ b/app/examples/Games/GNUBoxWorld/.src/FrmAbout.class @@ -0,0 +1,19 @@ +' Gambas class file + +' Copyright(C)2010. Autor: Pablo Mileti + +'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.IfNot, see < http: / / www.gnu.org / licenses / > . + + +Public Sub Form_Open() + Me.Window.Center + TextArea1.Pos = 0 +End + +Public Sub Button1_Click() + Me.Close +End diff --git a/app/examples/Games/GNUBoxWorld/.src/FrmAbout.form b/app/examples/Games/GNUBoxWorld/.src/FrmAbout.form new file mode 100644 index 00000000..165e8850 --- /dev/null +++ b/app/examples/Games/GNUBoxWorld/.src/FrmAbout.form @@ -0,0 +1,45 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,79,39) + Text = ("About...") + Resizable = False + { !TabStrip1 TabStrip + MoveScaled(2,2,50,35) + #Public = True + Count = 3 + Index = 0 + Text = ("Author") + { TextLabel1 TextLabel + MoveScaled(2,2,45,21) + Text = ("Author: Pablo Mileti.

You can submit your questions, suggestions, bugs, etc, to the following E-Mail address:\n pablomileti@gmail.com") + Alignment = Align.Justify + } + Index = 1 + Text = ("License") + { TextArea1 TextArea + MoveScaled(1,1,46,25) + Text = ("\n Copyright (C) 2010. Author: Pablo Mileti \n\nThis 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.\n\nThis 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.\n\nYou should have received a copy of the GNU General Public License along with this program. If not, see .") + ReadOnly = True + Wrap = True + ScrollBar = Scroll.Vertical + } + Index = 2 + Text = ("How to play?") + { TextLabel2 TextLabel + MoveScaled(2,1,45,27) + Text = ("Aim
\nThe shrimp has to push the movable boxes to the marked positions.

\nMove
\nTo move around the game board, use the arrow keys: up, down, left and right.

\nClear
\nTo restart the level, press the spacebar key.") + Alignment = Align.Justify + } + Index = 0 + } + { Button1 Button + MoveScaled(59,30,14,6) + Text = ("&Close") + } + { PictureBox1 PictureBox + MoveScaled(54,5,22.7143,22.7143) + Picture = Picture["logo.png"] + Stretch = True + } +} diff --git a/app/examples/Games/GNUBoxWorld/.src/GameBoard.class b/app/examples/Games/GNUBoxWorld/.src/GameBoard.class new file mode 100644 index 00000000..09212783 --- /dev/null +++ b/app/examples/Games/GNUBoxWorld/.src/GameBoard.class @@ -0,0 +1,595 @@ +' Gambas class file + +' Copyright(C)2010. Autor: Pablo Mileti + +'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.IfNot, see < http: / / www.gnu.org / licenses / > . + +Public Const NUM_LEVELS As Integer = 16 + +Public RowPlayer As Integer +Public ColPlayer As Integer +Public Cells As New Cell[10, 11] + +'See below constructor + +'This Function return true if player can move or false if exist obstacle +Public Function ValidateMover(Direction As Integer) As Boolean + Select Case Me.GetCell(Direction, 1).Type + Case Cell.gbMovableOnTarget + If Me.GetCell(Direction, 2).Busy Then + Return False + Else + Return True + End If + Case Cell.gbMovable + If Me.GetCell(Direction, 2).Busy Then + Return False + Else + Return True + End If + Case Cell.gbFloor + Return True + Case Cell.gbObstacle + Return False + Case Cell.gbTarget + Return True + End Select +End + +'This function return an object Cell if distance = 1 then Cell by side, distance = 2 Cell away 2 cells +Public Function GetCell(Where As Integer, distance As Integer) As Cell +Select Case Where + Case Key.up + Return Cells[Me.rowplayer - distance, Me.colplayer] + Case Key.down + Return Cells[Me.rowplayer + distance, Me.colplayer] + Case Key.left + Return Cells[Me.rowplayer, Me.colplayer - distance] + Case Key.right + Return Cells[Me.rowplayer, Me.colplayer + distance] +End Select +End + +'This function return true if all target are busy (Winner!) +Public Function isDone() As Boolean + Dim obj As Object + For Each obj In Me.cells + If obj.type = Cell.gbTarget Then Return False + Next + Return True +End + + +Public Sub _new(level As Integer) + Dim row As Integer + Dim col As Integer + 'All cells type Floor + For row = 0 To 9 + For col = 0 To 10 + Me.Cells[row, col] = New Cell(Cell.gbFloor) + Next + Next + 'Construct levels + Select Case level + 'LEVEL 1 + Case 1 + For col = 2 To 8 + Me.Cells[1, col] = New Cell(Cell.gbObstacle) + Next + For row = 2 To 5 + Me.Cells[row, 2] = New Cell(Cell.gbObstacle) + Next + For col = 2 To 8 + Me.Cells[5, col] = New Cell(Cell.gbObstacle) + Next + For row = 2 To 5 + Me.Cells[row, 8] = New Cell(Cell.gbObstacle) + Next + Me.Cells[2, 3] = New Cell(Cell.gbTarget) + Me.Cells[2, 7] = New Cell(Cell.gbTarget) + Me.Cells[4, 3] = New Cell(Cell.gbTarget) + Me.Cells[4, 7] = New Cell(Cell.gbTarget) + Me.Cells[2, 5] = New Cell(Cell.gbMovable) + Me.Cells[3, 4] = New Cell(Cell.gbMovable) + Me.Cells[3, 6] = New Cell(Cell.gbMovable) + Me.Cells[4, 5] = New Cell(Cell.gbMovable) + RowPlayer = 3 + ColPlayer = 5 + 'LEVEL 2 + Case 2 + For col = 1 To 8 + Me.Cells[1, col] = New Cell(Cell.gbObstacle) + Next + For row = 2 To 5 + Me.Cells[row, 1] = New Cell(Cell.gbObstacle) + Next + For col = 1 To 8 + Me.Cells[5, col] = New Cell(Cell.gbObstacle) + Next + For row = 2 To 5 + Me.Cells[row, 8] = New Cell(Cell.gbObstacle) + Next + Me.Cells[2, 4] = New Cell(Cell.gbTarget) + Me.Cells[2, 5] = New Cell(Cell.gbTarget) + Me.Cells[4, 4] = New Cell(Cell.gbTarget) + Me.Cells[4, 5] = New Cell(Cell.gbTarget) + Me.Cells[2, 6] = New Cell(Cell.gbMovable) + Me.Cells[3, 6] = New Cell(Cell.gbMovable) + Me.Cells[3, 3] = New Cell(Cell.gbMovable) + Me.Cells[4, 3] = New Cell(Cell.gbMovable) + RowPlayer = 3 + ColPlayer = 5 + 'LEVEL 3 + Case 3 + For col = 1 To 8 + Me.Cells[1, col] = New Cell(Cell.gbObstacle) + Next + For row = 2 To 7 + Me.Cells[row, 1] = New Cell(Cell.gbObstacle) + Next + For col = 1 To 8 + Me.Cells[7, col] = New Cell(Cell.gbObstacle) + Next + For row = 2 To 7 + Me.Cells[row, 8] = New Cell(Cell.gbObstacle) + Next + Me.Cells[2, 2] = New Cell(Cell.gbObstacle) + Me.Cells[3, 2] = New Cell(Cell.gbObstacle) + Me.Cells[6, 2] = New Cell(Cell.gbObstacle) + Me.Cells[3, 4] = New Cell(Cell.gbTarget) + Me.Cells[3, 6] = New Cell(Cell.gbTarget) + Me.Cells[5, 4] = New Cell(Cell.gbTarget) + Me.Cells[5, 6] = New Cell(Cell.gbTarget) + Me.Cells[3, 5] = New Cell(Cell.gbMovable) + Me.Cells[4, 4] = New Cell(Cell.gbMovable) + Me.Cells[4, 6] = New Cell(Cell.gbMovable) + Me.Cells[5, 5] = New Cell(Cell.gbMovable) + RowPlayer = 5 + ColPlayer = 2 + 'LEVEL 4 + Case 4 + For col = 1 To 8 + Me.Cells[1, col] = New Cell(Cell.gbObstacle) + Next + For row = 2 To 8 + Me.Cells[row, 1] = New Cell(Cell.gbObstacle) + Next + For col = 1 To 8 + Me.Cells[8, col] = New Cell(Cell.gbObstacle) + Next + For row = 2 To 8 + Me.Cells[row, 8] = New Cell(Cell.gbObstacle) + Next + Me.Cells[2, 2] = New Cell(Cell.gbObstacle) + Me.Cells[3, 4] = New Cell(Cell.gbObstacle) + Me.Cells[4, 3] = New Cell(Cell.gbObstacle) + Me.Cells[4, 6] = New Cell(Cell.gbObstacle) + Me.Cells[5, 6] = New Cell(Cell.gbObstacle) + Me.Cells[6, 3] = New Cell(Cell.gbObstacle) + Me.Cells[7, 5] = New Cell(Cell.gbObstacle) + Me.Cells[7, 6] = New Cell(Cell.gbObstacle) + Me.Cells[7, 7] = New Cell(Cell.gbObstacle) + Me.Cells[5, 3] = New Cell(Cell.gbMovable) + Me.Cells[5, 5] = New Cell(Cell.gbMovable) + Me.Cells[6, 2] = New Cell(Cell.gbTarget) + Me.Cells[7, 2] = New Cell(Cell.gbTarget) + RowPlayer = 7 + ColPlayer = 4 + 'LEVEL 5 + Case 5 + For col = 1 To 8 + Me.Cells[1, col] = New Cell(Cell.gbObstacle) + Next + For row = 2 To 6 + Me.Cells[row, 1] = New Cell(Cell.gbObstacle) + Next + For col = 1 To 8 + Me.Cells[6, col] = New Cell(Cell.gbObstacle) + Next + For row = 2 To 6 + Me.Cells[row, 8] = New Cell(Cell.gbObstacle) + Next + Me.Cells[2, 3] = New Cell(Cell.gbMovable) + Me.Cells[3, 4] = New Cell(Cell.gbMovable) + Me.Cells[4, 3] = New Cell(Cell.gbMovable) + Me.Cells[5, 4] = New Cell(Cell.gbMovable) + Me.Cells[2, 4] = New Cell(Cell.gbTarget) + Me.Cells[3, 3] = New Cell(Cell.gbTarget) + Me.Cells[4, 4] = New Cell(Cell.gbTarget) + Me.Cells[5, 3] = New Cell(Cell.gbTarget) + For row = 2 To 5 + Me.Cells[row, 6] = New Cell(Cell.gbMovable) + Next + For row = 2 To 5 + Me.Cells[row, 7] = New Cell(Cell.gbTarget) + Next + RowPlayer = 3 + ColPlayer = 2 + 'LEVEL 6 + Case 6 + For col = 1 To 9 + Me.Cells[1, col] = New Cell(Cell.gbObstacle) + Next + For row = 2 To 7 + Me.Cells[row, 1] = New Cell(Cell.gbObstacle) + Next + For col = 1 To 9 + Me.Cells[7, col] = New Cell(Cell.gbObstacle) + Next + For row = 2 To 7 + Me.Cells[row, 9] = New Cell(Cell.gbObstacle) + Next + Me.Cells[3, 5] = New Cell(Cell.gbObstacle) + Me.Cells[2, 5] = New Cell(Cell.gbMovableOnTarget) + Me.Cells[3, 3] = New Cell(Cell.gbMovable) + Me.Cells[3, 7] = New Cell(Cell.gbMovable) + Me.Cells[4, 4] = New Cell(Cell.gbMovable) + Me.Cells[4, 6] = New Cell(Cell.gbMovable) + Me.Cells[5, 5] = New Cell(Cell.gbMovable) + Me.Cells[3, 4] = New Cell(Cell.gbTarget) + Me.Cells[3, 6] = New Cell(Cell.gbTarget) + Me.Cells[4, 5] = New Cell(Cell.gbTarget) + Me.Cells[5, 4] = New Cell(Cell.gbTarget) + Me.Cells[5, 6] = New Cell(Cell.gbTarget) + Me.Cells[5, 2] = New Cell(Cell.gbObstacle) + Me.Cells[5, 3] = New Cell(Cell.gbObstacle) + Me.Cells[5, 7] = New Cell(Cell.gbObstacle) + Me.Cells[5, 8] = New Cell(Cell.gbObstacle) + Me.Cells[6, 2] = New Cell(Cell.gbObstacle) + Me.Cells[6, 3] = New Cell(Cell.gbObstacle) + Me.Cells[6, 4] = New Cell(Cell.gbObstacle) + Me.Cells[6, 6] = New Cell(Cell.gbObstacle) + Me.Cells[6, 7] = New Cell(Cell.gbObstacle) + Me.Cells[6, 8] = New Cell(Cell.gbObstacle) + RowPlayer = 6 + ColPlayer = 5 + + 'LEVEL 7 + Case 7 + For col = 2 To 8 + Me.Cells[1, col] = New Cell(Cell.gbObstacle) + Next + For row = 2 To 7 + Me.Cells[row, 2] = New Cell(Cell.gbObstacle) + Next + For col = 2 To 8 + Me.Cells[7, col] = New Cell(Cell.gbObstacle) + Next + For row = 2 To 7 + Me.Cells[row, 8] = New Cell(Cell.gbObstacle) + Next + Me.Cells[2, 3] = New Cell(Cell.gbObstacle) + Me.Cells[2, 4] = New Cell(Cell.gbObstacle) + Me.Cells[5, 3] = New Cell(Cell.gbObstacle) + Me.Cells[5, 4] = New Cell(Cell.gbObstacle) + Me.Cells[6, 3] = New Cell(Cell.gbObstacle) + Me.Cells[6, 4] = New Cell(Cell.gbObstacle) + Me.Cells[3, 6] = New Cell(Cell.gbMovable) + Me.Cells[4, 5] = New Cell(Cell.gbMovable) + Me.Cells[4, 7] = New Cell(Cell.gbMovable) + Me.Cells[5, 6] = New Cell(Cell.gbMovable) + Me.Cells[3, 5] = New Cell(Cell.gbTarget) + Me.Cells[3, 7] = New Cell(Cell.gbTarget) + Me.Cells[5, 5] = New Cell(Cell.gbTarget) + Me.Cells[5, 7] = New Cell(Cell.gbTarget) + RowPlayer = 3 + ColPlayer = 3 + + 'LEVEL 8 + Case 8 + For col = 1 To 9 + Me.Cells[1, col] = New Cell(Cell.gbObstacle) + Next + For row = 2 To 7 + Me.Cells[row, 1] = New Cell(Cell.gbObstacle) + Next + For col = 1 To 9 + Me.Cells[7, col] = New Cell(Cell.gbObstacle) + Next + For row = 2 To 7 + Me.Cells[row, 9] = New Cell(Cell.gbObstacle) + Next + Me.Cells[2, 8] = New Cell(Cell.gbObstacle) + Me.Cells[3, 8] = New Cell(Cell.gbObstacle) + Me.Cells[4, 2] = New Cell(Cell.gbObstacle) + Me.Cells[4, 3] = New Cell(Cell.gbObstacle) + Me.Cells[4, 6] = New Cell(Cell.gbObstacle) + Me.Cells[4, 3] = New Cell(Cell.gbObstacle) + Me.Cells[4, 6] = New Cell(Cell.gbObstacle) + Me.Cells[5, 2] = New Cell(Cell.gbObstacle) + Me.Cells[5, 3] = New Cell(Cell.gbObstacle) + Me.Cells[5, 4] = New Cell(Cell.gbObstacle) + Me.Cells[6, 2] = New Cell(Cell.gbObstacle) + Me.Cells[6, 3] = New Cell(Cell.gbObstacle) + Me.Cells[6, 4] = New Cell(Cell.gbObstacle) + Me.Cells[3, 4] = New Cell(Cell.gbTarget) + Me.Cells[3, 5] = New Cell(Cell.gbTarget) + Me.Cells[4, 4] = New Cell(Cell.gbTarget) + Me.Cells[4, 5] = New Cell(Cell.gbTarget) + Me.Cells[3, 3] = New Cell(Cell.gbMovable) + Me.Cells[5, 5] = New Cell(Cell.gbMovable) + Me.Cells[5, 6] = New Cell(Cell.gbMovable) + Me.Cells[5, 7] = New Cell(Cell.gbMovable) + RowPlayer = 2 + ColPlayer = 6 + + 'LEVEL 9 + Case 9 + For col = 1 To 8 + Me.Cells[1, col] = New Cell(Cell.gbObstacle) + Next + For row = 2 To 8 + Me.Cells[row, 1] = New Cell(Cell.gbObstacle) + Next + For col = 1 To 8 + Me.Cells[8, col] = New Cell(Cell.gbObstacle) + Next + For row = 2 To 8 + Me.Cells[row, 8] = New Cell(Cell.gbObstacle) + Next + For row = 4 To 8 + Me.Cells[row, 2] = New Cell(Cell.gbObstacle) + Me.Cells[row, 7] = New Cell(Cell.gbObstacle) + Next + For row = 6 To 8 + Me.Cells[row, 3] = New Cell(Cell.gbObstacle) + Me.Cells[row, 6] = New Cell(Cell.gbObstacle) + Me.Cells[row, 7] = New Cell(Cell.gbObstacle) + Next + Me.Cells[3, 5] = New Cell(Cell.gbObstacle) + Me.Cells[5, 3] = New Cell(Cell.gbTarget) + Me.Cells[6, 4] = New Cell(Cell.gbTarget) + Me.Cells[7, 4] = New Cell(Cell.gbTarget) + Me.Cells[7, 5] = New Cell(Cell.gbTarget) + Me.Cells[3, 3] = New Cell(Cell.gbMovable) + Me.Cells[3, 4] = New Cell(Cell.gbMovable) + Me.Cells[4, 5] = New Cell(Cell.gbMovable) + Me.Cells[5, 4] = New Cell(Cell.gbMovable) + RowPlayer = 2 + ColPlayer = 5 + + 'LEVEL 10 + Case 10 + For col = 1 To 8 + Me.Cells[1, col] = New Cell(Cell.gbObstacle) + Next + For row = 2 To 8 + Me.Cells[row, 1] = New Cell(Cell.gbObstacle) + Next + For col = 1 To 8 + Me.Cells[8, col] = New Cell(Cell.gbObstacle) + Next + For row = 2 To 8 + Me.Cells[row, 8] = New Cell(Cell.gbObstacle) + Next + For row = 2 To 4 + Me.Cells[row, 2] = New Cell(Cell.gbObstacle) + Me.Cells[row, 7] = New Cell(Cell.gbObstacle) + Next + Me.Cells[4, 3] = New Cell(Cell.gbObstacle) + Me.Cells[6, 3] = New Cell(Cell.gbObstacle) + Me.Cells[6, 5] = New Cell(Cell.gbObstacle) + Me.Cells[6, 6] = New Cell(Cell.gbObstacle) + Me.Cells[2, 3] = New Cell(Cell.gbTarget) + Me.Cells[2, 5] = New Cell(Cell.gbTarget) + Me.Cells[2, 6] = New Cell(Cell.gbTarget) + Me.Cells[3, 3] = New Cell(Cell.gbTarget) + Me.Cells[3, 6] = New Cell(Cell.gbTarget) + Me.Cells[3, 5] = New Cell(Cell.gbMovable) + Me.Cells[4, 6] = New Cell(Cell.gbMovable) + Me.Cells[5, 3] = New Cell(Cell.gbMovable) + Me.Cells[5, 6] = New Cell(Cell.gbMovable) + Me.Cells[6, 4] = New Cell(Cell.gbMovable) + RowPlayer = 7 + ColPlayer = 5 + + 'LEVEL 11 + Case 11 + For col = 2 To 8 + Me.Cells[1, col] = New Cell(Cell.gbObstacle) + Next + For row = 2 To 7 + Me.Cells[row, 2] = New Cell(Cell.gbObstacle) + Next + For col = 2 To 8 + Me.Cells[7, col] = New Cell(Cell.gbObstacle) + Next + For row = 2 To 7 + Me.Cells[row, 8] = New Cell(Cell.gbObstacle) + Next + Me.Cells[2, 3] = New Cell(Cell.gbObstacle) + Me.Cells[6, 3] = New Cell(Cell.gbObstacle) + Me.Cells[6, 7] = New Cell(Cell.gbObstacle) + Me.Cells[2, 5] = New Cell(Cell.gbTarget) + Me.Cells[4, 3] = New Cell(Cell.gbTarget) + Me.Cells[4, 7] = New Cell(Cell.gbTarget) + Me.Cells[6, 5] = New Cell(Cell.gbTarget) + Me.Cells[3, 4] = New Cell(Cell.gbMovable) + Me.Cells[3, 6] = New Cell(Cell.gbMovable) + Me.Cells[5, 4] = New Cell(Cell.gbMovable) + Me.Cells[5, 6] = New Cell(Cell.gbMovable) + Me.Cells[4, 5] = New Cell(Cell.gbMovableOnTarget) + RowPlayer = 2 + ColPlayer = 7 + + 'LEVEL 12 + Case 12 + For col = 1 To 8 + Me.Cells[1, col] = New Cell(Cell.gbObstacle) + Next + For row = 2 To 7 + Me.Cells[row, 1] = New Cell(Cell.gbObstacle) + Next + For col = 1 To 8 + Me.Cells[7, col] = New Cell(Cell.gbObstacle) + Next + For row = 2 To 7 + Me.Cells[row, 8] = New Cell(Cell.gbObstacle) + Next + Me.Cells[2, 2] = New Cell(Cell.gbObstacle) + Me.Cells[2, 3] = New Cell(Cell.gbObstacle) + Me.Cells[3, 2] = New Cell(Cell.gbObstacle) + Me.Cells[3, 3] = New Cell(Cell.gbObstacle) + Me.Cells[6, 2] = New Cell(Cell.gbObstacle) + Me.Cells[6, 3] = New Cell(Cell.gbObstacle) + Me.Cells[6, 4] = New Cell(Cell.gbObstacle) + Me.Cells[5, 7] = New Cell(Cell.gbObstacle) + Me.Cells[6, 7] = New Cell(Cell.gbObstacle) + Me.Cells[4, 5] = New Cell(Cell.gbTarget) + Me.Cells[4, 6] = New Cell(Cell.gbTarget) + Me.Cells[5, 4] = New Cell(Cell.gbTarget) + Me.Cells[5, 5] = New Cell(Cell.gbTarget) + Me.Cells[5, 6] = New Cell(Cell.gbTarget) + Me.Cells[5, 3] = New Cell(Cell.gbMovable) + Me.Cells[4, 4] = New Cell(Cell.gbMovable) + Me.Cells[3, 4] = New Cell(Cell.gbMovable) + Me.Cells[3, 5] = New Cell(Cell.gbMovable) + Me.Cells[3, 6] = New Cell(Cell.gbMovable) + RowPlayer = 5 + ColPlayer = 2 + +'LEVEL 13 + Case 13 + For col = 1 To 8 + Me.Cells[1, col] = New Cell(Cell.gbObstacle) + Next + For row = 2 To 7 + Me.Cells[row, 1] = New Cell(Cell.gbObstacle) + Next + For col = 1 To 8 + Me.Cells[7, col] = New Cell(Cell.gbObstacle) + Next + For row = 2 To 7 + Me.Cells[row, 8] = New Cell(Cell.gbObstacle) + Next + Me.Cells[2, 4] = New Cell(Cell.gbObstacle) + Me.Cells[4, 7] = New Cell(Cell.gbObstacle) + Me.Cells[6, 4] = New Cell(Cell.gbObstacle) + Me.Cells[3, 4] = New Cell(Cell.gbTarget) + Me.Cells[3, 5] = New Cell(Cell.gbTarget) + Me.Cells[4, 4] = New Cell(Cell.gbTarget) + Me.Cells[5, 4] = New Cell(Cell.gbTarget) + Me.Cells[5, 5] = New Cell(Cell.gbTarget) + Me.Cells[3, 3] = New Cell(Cell.gbMovable) + Me.Cells[3, 6] = New Cell(Cell.gbMovable) + Me.Cells[4, 3] = New Cell(Cell.gbMovable) + Me.Cells[5, 3] = New Cell(Cell.gbMovable) + Me.Cells[5, 6] = New Cell(Cell.gbMovable) + Me.Cells[4, 5] = New Cell(Cell.gbMovableOnTarget) + RowPlayer = 4 + ColPlayer = 2 + +'LEVEL 14 + Case 14 + For col = 1 To 8 + Me.Cells[1, col] = New Cell(Cell.gbObstacle) + Next + For row = 2 To 7 + Me.Cells[row, 1] = New Cell(Cell.gbObstacle) + Next + For col = 1 To 8 + Me.Cells[7, col] = New Cell(Cell.gbObstacle) + Next + For row = 2 To 7 + Me.Cells[row, 8] = New Cell(Cell.gbObstacle) + Next + Me.Cells[2, 2] = New Cell(Cell.gbObstacle) + Me.Cells[3, 2] = New Cell(Cell.gbObstacle) + Me.Cells[2, 6] = New Cell(Cell.gbObstacle) + Me.Cells[2, 7] = New Cell(Cell.gbObstacle) + Me.Cells[3, 4] = New Cell(Cell.gbObstacle) + Me.Cells[4, 6] = New Cell(Cell.gbObstacle) + Me.Cells[5, 3] = New Cell(Cell.gbObstacle) + Me.Cells[3, 7] = New Cell(Cell.gbTarget) + Me.Cells[4, 7] = New Cell(Cell.gbTarget) + Me.Cells[5, 7] = New Cell(Cell.gbTarget) + Me.Cells[6, 7] = New Cell(Cell.gbTarget) + Me.Cells[3, 3] = New Cell(Cell.gbMovable) + Me.Cells[4, 4] = New Cell(Cell.gbMovable) + Me.Cells[4, 5] = New Cell(Cell.gbMovable) + Me.Cells[5, 4] = New Cell(Cell.gbMovable) + RowPlayer = 3 + ColPlayer = 5 + +'LEVEL 15 + Case 15 + For col = 2 To 8 + Me.Cells[1, col] = New Cell(Cell.gbObstacle) + Next + For row = 2 To 7 + Me.Cells[row, 2] = New Cell(Cell.gbObstacle) + Next + For col = 2 To 8 + Me.Cells[7, col] = New Cell(Cell.gbObstacle) + Next + For row = 2 To 7 + Me.Cells[row, 8] = New Cell(Cell.gbObstacle) + Next + Me.Cells[3, 4] = New Cell(Cell.gbMovable) + Me.Cells[3, 5] = New Cell(Cell.gbMovable) + Me.Cells[3, 6] = New Cell(Cell.gbMovable) + Me.Cells[4, 4] = New Cell(Cell.gbMovable) + Me.Cells[4, 6] = New Cell(Cell.gbMovable) + Me.Cells[5, 4] = New Cell(Cell.gbMovable) + Me.Cells[5, 5] = New Cell(Cell.gbMovable) + Me.Cells[5, 6] = New Cell(Cell.gbMovable) + Me.Cells[2, 3] = New Cell(Cell.gbTarget) + Me.Cells[2, 5] = New Cell(Cell.gbTarget) + Me.Cells[2, 7] = New Cell(Cell.gbTarget) + Me.Cells[4, 3] = New Cell(Cell.gbTarget) + Me.Cells[4, 7] = New Cell(Cell.gbTarget) + Me.Cells[6, 3] = New Cell(Cell.gbTarget) + Me.Cells[6, 5] = New Cell(Cell.gbTarget) + Me.Cells[6, 7] = New Cell(Cell.gbTarget) + RowPlayer = 4 + ColPlayer = 5 + +'LEVEL 16 + Case 16 + For col = 1 To 8 + Me.Cells[1, col] = New Cell(Cell.gbObstacle) + Next + For row = 2 To 7 + Me.Cells[row, 1] = New Cell(Cell.gbObstacle) + Next + For col = 1 To 8 + Me.Cells[7, col] = New Cell(Cell.gbObstacle) + Next + For row = 2 To 7 + Me.Cells[row, 8] = New Cell(Cell.gbObstacle) + Next + Me.Cells[2, 2] = New Cell(Cell.gbObstacle) + Me.Cells[2, 7] = New Cell(Cell.gbObstacle) + Me.Cells[6, 2] = New Cell(Cell.gbObstacle) + Me.Cells[6, 3] = New Cell(Cell.gbObstacle) + Me.Cells[2, 7] = New Cell(Cell.gbObstacle) + Me.Cells[6, 6] = New Cell(Cell.gbObstacle) + Me.Cells[6, 7] = New Cell(Cell.gbObstacle) + For col = 2 To 7 + Me.Cells[4, col] = New Cell(Cell.gbTarget) + Next + Me.Cells[3, 3] = New Cell(Cell.gbMovable) + Me.Cells[3, 5] = New Cell(Cell.gbMovable) + Me.Cells[3, 6] = New Cell(Cell.gbMovable) + Me.Cells[5, 3] = New Cell(Cell.gbMovable) + Me.Cells[5, 4] = New Cell(Cell.gbMovable) + Me.Cells[5, 6] = New Cell(Cell.gbMovable) + RowPlayer = 6 + ColPlayer = 5 + + + End Select + + For row = 0 To 9 + Cells[row, 0].FixObstaculo(Null, Cells[row, 1]) + For col = 1 To 9 + Cells[row, col].FixObstaculo(Cells[row, col - 1], Cells[row, col + 1]) + Next + Cells[row, 10].FixObstaculo(Cells[row, 9], Null) + Next + +End diff --git a/app/examples/Games/GNUBoxWorld/License b/app/examples/Games/GNUBoxWorld/License new file mode 100644 index 00000000..b17f91b9 --- /dev/null +++ b/app/examples/Games/GNUBoxWorld/License @@ -0,0 +1,189 @@ +GNU GENERAL PUBLIC LICENSE + +Version 3, 29 June 2007 + +Copyright © 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 \ No newline at end of file diff --git a/app/examples/Games/GNUBoxWorld/abajo.png b/app/examples/Games/GNUBoxWorld/abajo.png new file mode 100644 index 0000000000000000000000000000000000000000..7e716fbc7cee2fed0a7d82c7be5173276d44e352 GIT binary patch literal 5205 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 P00000NkvXXu0mjf8lo=L literal 0 HcmV?d00001 diff --git a/app/examples/Games/GNUBoxWorld/arriba.png b/app/examples/Games/GNUBoxWorld/arriba.png new file mode 100644 index 0000000000000000000000000000000000000000..86e88f3f8767a36487fedd117e7556f1ffbeae16 GIT binary patch literal 5291 zcmV;c6jbYpP)fdtB8otaJE9?)#KdtX6O)XYnP|qzOeV>3GKrZn zF^QUEqQ*EFVl+{sF=CXkuL1&1(*h0MG&H?0)wNf>_wM}h3M7UGl-8L!;d@S>uJ_)( z^}F}`e)}!>-$89~>SYi5>o0B+Hhayxp4H_~o&WFSzxufJ)lUDX6F2Rlk{=42z4*gg zpc4oI(}7O{3xJOU3jzCiez#V303!ntLMm-vl~=BR~_N=SaB`r~w>6`+F5wIDg5_p3(J>MECD7 z`!>Itm3lS?Gy`0A%N_F;-+ISS+A^A}Wz`E|d$6!G)!FJVn0wvl{I%0UL;JQKGZL{4 zBT0bmH1}j~vwH42ll#9v_qQJK1OJ>OsS!w=i!fo+W=Yd{%vU!9XShnS=Z7yp@{9kx zS7tMSHmW6NzC7BnyN<__xWbi4J=0h)_nON5S&J);WDJ`>-_Sb8$_`?du2BBb-)YRF?Za4d$xY!Bs8ZRcg0u+w!QJ` z$lfiNC^k*c4)&nOB2$1u;Np=Yz;+&Uj|0yF#W^Cb27W)>V0Y#CU|{l`FRL!E2h&7# zdvO$&*7<5@c%yG`_uws433{=#VmvSkn1K}m zLcm-sA5aEFPMITtES9sZ12mxf-GcIGU-emk-OL4!f|A@UiK5!jf`u~K)izZ|`^%=^ z`OQGd=&`D+xEvWQ5(RUvUhJ+ITWm!8#Zc3Bde^_S9M}gKz~_L?K_2_VxK1psIR>-=WCy#Yvto3CBV2KX>h^&UCrOZ|2|&89Q=|`X z6#D2&_H?DuO%uf$CxlSQ4)zi|xLa2}erd#qPAV1f3EOc;1|G*UlVzto z>jT~dzKCTi0Hlr{md=9mxUgyR#HLS$t9k;7(KA`q9w#fYHV;TCkw2Rw(BClmwN+`gH@X7d1+2D}@o7`?}jF}QmJ zn$vl5jH1~wQwaukt`*s#{ahEITEUKi}B?au^lT!&IfRo zjw-PE^AV~Iak@1Mh5Q){G2>BsH@%9zppu-d}!Ti3wf2IWzso3yVji>qL z<O3VHGL=?j7D z&LBSpyaX)8$`w`uUjt@-SOkEjhW7$@V$}zY+33JTJsw4IdW7oopg7$qPWQ4=U z09K*&cfdaaA$P^tugGi$BN?OPm*1mx`FAnmQG}vmN{N)Pp>2>|S=hd35A$cw=Gtqo z<(Df~fTGY=Q9-%G!Od4*nH54*dOV)toVSV9xVbHN{UhLCfWHF113U&iiq-G|&aWCg z8(M*{0Jp?j_8m<29?zJ`gtnwAEC%cz*6&j~i!@yBfUVP=8 z%Fe@u-+J}uj4SZbWti+woA?S#7|ci%Bz?&Y(`w6c4-WEnb2F;jjrru0+;H7>{GDma zUE8_hCwk<3mnAC6HcH5*oKwC{zLA0>j$X;V41=o@U5YiMqTp;sn0^+ zp50tplcGJ7p(Qp*^_-8QYIZyh2cNifAzxm&kiXfwl^uZq^J;5(2;>t_uQ0y<&_fPj z=qxfja|E1DOAM^yX&zQB@qudqz+Pa2kxJg^tD7!wY27YLvl(V4BGmcq3`Y8B=su2K zHH~;rA9<>vzSzt4CV*&M`^SHM6l z&Va5mI?pMW%&8Sm{`g0gfLn38lV&O*&mix6oH<;c#QV{J_gruQHnM3odd0^t>7Bd8 zr*C|fuw5aL&?$`$uq~8NpQ+Q;dI%B``jR@G8A00Nqc@plT3Jv`3J2J>c~h)$=bOKf zdNzF)c>%1{I0hU#^TN&mdqGKMrnh6Ft9IsMS5bM?G|W+heSMl!kFQVl_Ycs2WDk~# zpA9Jc2PtgbN2SxvUPC84>lO-%%2AwdRF?-c83zHy9y^y+ zg^1pmE#ImsY;9oqg**cP?sBw)6|*rJmjEt{7|cO}z}oG)N5flWp6N zf6`opG{7)GQ4ms+F(e_k#(#Wt3Vm&dxaZlmB%_g)Z9o0jn>e>t{8dgLH`te~%WJm}dP#qRPYTANm$0|CugmFf#vr(9#PD#bLpp2nF>AQEqB+yVT} z;I4IM*^)cgsy1zYcNU&&?4a1=;N=6|WLw)9%F3(5i*BjRj+$bxcV#sx)VxWx<1;OX z52?}KuEB^S?^wh7*VBGQ->DTeC^pS1kW2&JG_k7+st|m0VI313 zDK>1`O-uDWgfC1muSll$zqtUb575Bb@ms8@@C~daXb$iIR-Is+(V+=N)ud@;g~R2y zc>>R5`#T$JKL7161!pYO0MWf^B_Ii3wuDhig1lgWkBkX%s6S3dXc&5yx_mbSX@f*> z2YchHT(kTUG2}0$uxbpRnu{2CYb}m&HTFP=XgW)E(8bu0hnpr>Qjq9kOY;^)sx7&3A$J;Ru-KF0Z-A=FcxO)5-6} z4mBLY>iEvB`NI7_6%N;gOiw$C%S+z$D-eo6F%6^;m}X9W4HH!e>37&fEUR<<_#&Jx zkGwcfh<|+aS44Faw>Locz;@}sbcwiW?o@=HVNrDer>fGrzmb)1tfC=MN3UrokRL*t zCO(HoshZ|@Ke}({(DqeVaQa5>ncxAQ!14+IH5>u9315F|r#%#&gelYAYoAxmRO;@| zmH)jFIO-@U`$qo7A6Z)Q@h^pqWCEm#^0$Rqy!N4I-LM(bCq2qiigzcQ#Nm=cDMZ05&6oJkd!O3iHR7^4jvB>}z`R z{&~E=ws;;^gt%=uCm4vg?7PA{X3{ukxWeYHtW_|KtDL3P%Ze6#d~vF)?O0&aoQ3xM z@W~$MnQZAqm)EW;9O#YGXKEyEZqc)2wU{t}u@Ra!U)|8!O|!F`Yjw7m8VQ|iWv;G$26<42A>pFX;O&-)+%a<#&+{eVcr=4}!dM)qzY z*1QKjI*72@kl8f$P_d%Ay-4Gn`i_4FQ_m79R@FL{T*m3V&K{o+E^iCPKJ-4tGb69C*8TFrpu8Z{KJZR*jDC+p4N| z2Sa-|Gw|jrGW}hoj<;ZD(gdf@#}%%^S5d>fQjZuIin3{6^HH;9&#%vegtONIiMIWR zg`%vFzP;V)3|AIp2fF>L(~Y88ohe0C|Kz;yY@1izeqpp9z#D1L`memb*dFOny~%;M zf}Q)CW8UI%!Hedrfr*#kubYXlZU){llW-Q5qdHt5AdxYcRP4uP*VwRT)#hw#a@T0J4KU$Fh;WEwSdk&t@WhQ}oz?ZY1ORs@*AtY7;_LB|;Svi8zgB2vq~qKy|u^ z9o{SYcCJYq74@!UDz!1ub*#2%!Oc@V;fhKAypXMZ+aFQwPPF_Y%w!CyXDouH6=yP1 zVOCk540v7Q^%tJqlxaWo8thl8k%H2SA4WQl|Gwj?`?gY4Ju~Jl zj5|`%hg7@M<(oKrcF&sU3C+2h>_89x`dOIS42tGJ>KV+g7HsWtR&L!vbk|mub36bU z2?DIWrIJaYDY9q7eSj_1)iyfad%RBb=YPaAs$Mrz@!3LijCK^3hFry!#9EsOUo?;D z6YJzZ-?miV^vO?mwf}bcjwjY^>Uz4+yYWzKn^B^s4(2&hwx;&BN~NZrq6If0><%Ig zn=n#wqWj-M3x=?TN=bAbrS9gt#UC4*p?Z8D2ezKi{@+(^e>MdD6K0ioYbL#(chO~K z?$Hww0(v7+Zm2J(#HMF{{^K7uUv}xdqFrWwL4Qwos-k)nT53p5XAQ0OKoh>2$=HJ- zj8qcM7a-l!fns-{`tlg3CAs(d+5G60Ey-Vf``-D{-RriW&tgA_mRKs?)81BKVGn$^VWwHu!3-L>J-^IrH!>|SxW99n*OTmH1m7b>c{ zAT!Y8(}IPXG;~E8`tF{!FJyeJ=C~m#`v#1vP{?=w})me zrhn@n@Qu3&#qK~TDv{mmv3YzrLL~^*#?)djH`G_~gP%Mu);xUwvzX~k=ezb1X^NWZ zWXc{2|Gegl|M{&{*AX={(ES-b9(AU=kD_@4UD@bBDAV6%Q#6gp-Yq1KHVdRl)ou4) z9+*7O-Mi^k+!bTdV}nT3IJsff<)LTe@91qgK)F*=qmJd_<-5e{Z9CVI9eQ9S);?lB zAR8U1RBX1JJ=L{n!9vv$DiQAT8a!2XZf{ks;w-5q(cU6r2X|3=!)Hl#w&5tQ(Cm4I z(u@uY@7O8CTbs!Ab)r>GK&BHU9bRfDPGa8N*?e(k6>knHytHcVTdmLi_%5t7hx5jW zwZ&yBz5=1#WE$pDMd$({z%(%uQ3XJ#DmJelo7abt$zTtJaFy4fOCel#8?CQDM{xQT z`1ZVpZ1^KrE?q{oU8mURqOQQr6YF|8(4W}ewEX)IVjXjh2u3mr*dlv26uL`CP1Aw} zUSYF-sUlPrMRQ6c6&E&_hsd5y?LwMl8^m;BHpy^n`y;f6Rw|D9GWthNb_FGD$22y*AZ_& z#GVbS5)LD!nX#dtMLXM?<&nk_vH1^_004VIXmIkk2#z8hZyGb xUnKtG3Alg@xPS||fD5>Q3%Gy_xPT7_{{!VIMx;$nI%)s_002ovPDHLkV1n-RV*LOB literal 0 HcmV?d00001 diff --git a/app/examples/Games/GNUBoxWorld/derecha.png b/app/examples/Games/GNUBoxWorld/derecha.png new file mode 100644 index 0000000000000000000000000000000000000000..4f37b4423076d694ffe46f4ca69bde88565c9e5d GIT binary patch literal 4347 zcmVS+9@M*aTb);lQtf&j4pFAtkl{PXg`(5&-QAxi-K{ zz+&JJbxg!1ooqMtW7*|{oq9lrUK=m9+gi4lKty93`%_>C?gIV{EC){V!?KZp2RHys z2U^w_v_!Ysl{9(2?DVg%^yF8UOJG>-qqLN_H%Q>|s|~1ebDF0<%Rz^j~upa`hD%;o=*TZtIFDNEPKQQJ+V_+znpIzo} z{uCg?-nN@NAh|n{gMVvlsa60KTuu0w_JClZJrG|z;AcNUCIuJ{{0~t1{~gfYHg&Zv zAw?QPqJ&U2aem<&j|O+U=hgV%OjmW66PpHFUIxIy%LGj(1*cR0B|YFUun8CsOaWE{ zUf?xqBXm79t?lzZU;`#xkMY1m;kOS?Fa|{kDJ8nwCF4f_WvMYRv_uM~3X?)r1yWwtInb;TtE(K|zJ8~xF#8oC5k+0B7)@*9o}N6g^7O%h zC<;LS&9n<#6+(z{X0v(k$4iz3ODQQWEk#O6dU`r#3#N+dbH|YN2#`_|W-I@$(bwg&+>- z3G|Z^grHS&3c)YT!|SX@s2c8?Dq5V}#NNyz!tQ&Ts&mJrUtE$v_o92;K9am1E-ac+ zT(o_C$j!b4a_7&V-(-`YACq%(IMcp8&Y~hpD=U$Hejp_qR(?v`hks3QOguJX_f`@sxOpMBHd0(_J575IB(`nOMqgsOq@A)@$|Te5DC5n zqk8*x0168W0dTtAXa)lskkCAa?N#+>`RWjgf~&MZmhRcI1-Jk=S1Ozg{Muv>TAsf1 z;Pm_N8X&jkI0QflpoN40ux{Nt3Non?$nkV3t@{Y~;D@T!u7>WWj5%kvn=c0A5{Z#7i$> z0E(&{>@9F$(5`KYloIK2<1Q~Icm0C*fHRk#HP$ZBJt+0A_gdaNyj^s=+vLTf5`m(k ze6@t7v)<-xK?%QIcNnv#(%L3iG^{6Q@O@xRTe5`K4-7)))^Iwrgk9NXWR^LuvFfSY zA{{yBWcKGDmXz+<8dCqcdV>u&SYr}a1m8Yn#<-VX3ln|;;$(iA5JDh~X8Nf4q;%}W zdwb4PQ0?2Y3fu~NGO~HBWhgF9Lr+X%<>u2E-Cn-AP{M^W$2HfzloBBnoO$PE*@16F z!ItI8_zEs{xRFaBCA|M*-}M_m-D21|ruy2e z&m3Z#+eN3m8u~_AI9sF8EWpgX{aKhbrB1${)gTl=A`}Hj-UV58{)EU{H7AXFu73$P zDhNIp{q&T5BPYIM9+4En#xsS&DKA&tRZ)V~>PMNwja%32+Wiw!a2Dl|w`w+9j-Dgm zqp~Nj3bR&E_1dIJF^H&#(whHn=JLr; zJtBiGs(9&(gJ=R2gAv_XQ`bo|nyIL9U^i(f^;}wd+=TTWM8Se-L~or+?{ijG+9E5U1gs=hJeofsmVD<)tN)$?1!%`LP{Gj8fcBL zUNH|}$!!y`ry)H+3A%IWjzI%%mrDLQ@u!0o7*wCz26w)b%w_M=G9T-YWq!;yPl7HnH7^1uA# z7_b+Zjjz^tRWz6fm?E1m{rx{aYX4H&o#OsyULYW;D|JN+uLoCYA*#`gYPBJRKSPtoK*h3|d@y?!&#pU4&B;Azwm>Y= zE$ie;_ie+{A{npEj^p?qvX{)nRg@!v{j~;ftDXJQAJer#2#6XyR(>_-b-DFik@)A% z^C$uo)xg<#(}+%c2F>Q1T`47sX5hk-nFM#~k1e4iuHsz0g;`u&`;qK2@DXwJ&_UTW z?HM6Gt~zzI*SwD*Fr2*fMMs_anal7MVE0~+t_=|cJGY4p!k}s5+lwW2iHh!Z(_+-i z*E@2~J_NXauCfh5K%&bpnAIOIxN)k0QZJYCgv@K{^d7Eu&@`?Sa@n~4UpoH$ z;lCmh`&q_2?82=-RmcD(s~jKk%!R#esWj81zd zwpB$&fwOgwNXA5T@DnZ8NawB{M&TK-nJ`_oD7k^U`~eCcW7#pyB|NFvv%&A=RbNi zyejjw$nzRHSX(5^t9|AwLZC}{W!ouCW|Mq#<>tGUi013BSJ?*11RYstiZlIV9v#@F z9buut94f3qF_>_b7Ert+o#GuEKtlG4S>d_I_ummadTMfFtCs!FeYf##zu3gv%FD}I z+Y>tr>2+Uo3{4Rn%q?Kx4N9*E&~YeI)JQIb8r>szUR!lFfX9XU4Q5tVfF4_xBM+*NQ7Op+6Vf#?kJ_l z{a<60stCT%EEVIr$Fs}Ux^vOi6@@?+P|?@~;404F6xM6dv(fzq$>~oI7GHWJu|~(E zT5M$e`(O(1XMlJ9_hft_xj5^XaW4`!F#SyNiv(^FLzWpAD+RI~L*$I%qQfxHSj z$2XJtSns!|^m#t&Z%@NjS2~t&6k?)e6snOV)k5QkUTg02lNG6Z32fJmbMvMVn9}!0y#PQlnkd`<6#?zKgVd$LU=VrbHS*icGSMcrHw72Z z4s&FknR&wrsKqf?aqb)5%90p8EVhH9s+1qwfnu^?Y1)#a?d!zJzm1)mv-ZRJxf>Q9 zsXTR{ye9ihh%qSKTCi;u_O_`~F&M?AZ;SsRSxU-}?4)4pip|pFj#Et*ap3v;w?_{d z*X;C+XHV7$V`!6Kjj(60`OppW>q~Ntc08`x0++R${z;l@@e}AeLe*r>7YoQ*KC2a% zm#+;#Z+qL+#j(R*3^xRZiK}{p5M-{HU6!|D;Zyi(0gnLhnId9#IP)%~0xd&({%VWv zajC^S((4XK8uNa@gY9RmUa8rFez@ME8DwtyVv+gDJ6(ZYSM*oS5iwhvJ@#BLYjnKS z{DUsL86u@bC@SuXVlw9ZX?NwR19t-DR~fel@Lk?6oUy{i*`-Skdc`me78$4;bMIy8vBOG?-Kv`@4x%SCUV8vmhSRmkuiJXj>?Q9_wb*ktw2*~ zlMh4tr9Bjo)I|za6ROo8)$E62Gy{^_3k1?rQ6esW@=k8?&h#F@*(()jYyz;xBpi$z zIi;O3C`>3Oi|>@jr#+f2P#%7Hn5a5)FabDq74hcA(5UHwDSaLfO6iSiu}SImd4*!K zpqR{cq#S%<&}LUj{*_nu8lM2b;1{2Ky4j<@k5Nq)G^@YVy@-s{JZ22d?3!67DREyu=0z3BIZ)??IH86^w pKRGwU*W4T7JGo6%%dMpeWv)ps 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 literal 0 HcmV?d00001 diff --git a/app/examples/Games/GNUBoxWorld/ganador.png b/app/examples/Games/GNUBoxWorld/ganador.png new file mode 100644 index 0000000000000000000000000000000000000000..f6672bf77dc04adbc3cac19d7bfceca31f837ca7 GIT binary patch literal 255686 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

7=SStZ1=X?AZb9iC858}c}1<{7*u#UE&kVJ@C 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�Ai9aA*8b$jtFEnA_e-HG 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 z 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�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

P~ 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 literal 0 HcmV?d00001 diff --git a/app/examples/Games/GNUBoxWorld/icon.png b/app/examples/Games/GNUBoxWorld/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d1737db0f210850e690a3280d53d731ac058d6c6 GIT binary patch literal 5889 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 Xbp(Gj=?hmn00000NkvXXu0mjf2*@sw literal 0 HcmV?d00001 diff --git a/app/examples/Games/GNUBoxWorld/izquierda.png b/app/examples/Games/GNUBoxWorld/izquierda.png new file mode 100644 index 0000000000000000000000000000000000000000..4424149335a9c5e67a7b5b1dcd352f916fd5aa60 GIT binary patch literal 4350 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 literal 0 HcmV?d00001 diff --git a/app/examples/Games/GNUBoxWorld/logo.png b/app/examples/Games/GNUBoxWorld/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..1124d398c176adb4b36132f69d04bf00fb5d66a0 GIT binary patch literal 108170 zcmY&%mjVtrAe}=>4BY}EA_9^_r+{?lyyuSp z?el)%3qR(}b@smY+H0-7iPun9#Koq-MnXcuReC9>g@lCM^Vbg+2Jjm}rWS7`q%b5U zIcc3Y^S|#6t6bs!+p+h9Io21I%cFDKIq=i^)-D(+946bn4lh1KP!U{-3>PbBqoS97Tb>!oVKOex#7VV!`nmb>3Z&>trECfKA!(hRQPE|R;J)i9N6uWg&r za21JzRegW9Y0K2O9i6XT0qvTZc|Y-0ti1Nd6jsmHqWwXm&~=)cQ{sUpG_`wZd0kTI zj*u8^t3RN_^SGKCJ4yprj|okNO=qg^1R_HR5z>0k5T*BW>P^YlZngBvOXIf3$utS| z8@tA`9GZ(e`J8a&IU!93XpNx3SC)MC=c8%=KKJmLmOjL=LEhNNR#tQYRDJA_W4b=5 z-0t~hz**)8VN%SO+ILh@KNuf}+%-^%*UDY;6z=51tW_#xSmo2~&aMLQ{yri?_;{pE zim4}!lukKisY1%Ju5rI^qP4=wv8c!S2O ztHfORo<{j)1gBDC$ieaDKMzEFTFrEjLke$XTr3p)?l1K==C;u2pjKz3DjU{hF(4gD zNq4D41Z5H-$%o~Zf)3yW%~Q}w=Lk+UNHN}g8Z(9|mXj6?Rx5g5GIfnz z;`tlZuBu7je#O*EN7(sjG^M?B(X|sJe{m5^B6t#^fjcTjsLWv4NKF?epjNqOBpdM0 z3w95MzP_^UwAC$?(JV*<`}}BBrXk3{{J?sK*d^I1A3&ZJBb49n?B8PFm%02PmUj#B zJbI?q5Sgp_zcEsoaxol1?S}+DmXnWilT~r6J^0OOyr%J_shzJA4r_;7n!Yjy>yyrI z{&u~MzVOhG_%#hhvr(FU4Re4U{P_31Bp%j3^Ni>vs`t{B2Mchj5o-7)lxlAVdxf=e zpmfA|`0SlYUV7ipd`0o2&?gj8)5euP*VkE`{O{vMpLvYYp%X?m?7{BW4KF}bdv6vM zJ4?CNa<^a0+_yMO)-2sF&2(pqE)zEXI9n7z{0TzRm925nuNGt0YCU8Fuv~MaKNne- zw>hZc=-WsW_(j#+&)MEH)HA_4>OC{>p1AVQ4FA zRdpyu3eQ0$VM$Lt7q0wNBeYZ~2p98EA3kPu_-&6VZtIs$#RY-RuR{mSN|M>Z=wc{` z%CmV7v2)w;jOA(F_5bgxF{SGz~4ZaaSK+K2N4Qz$6y^tGL{V*|n0NMyu(KRM|z$yF?fh)6Inlz0vYJ3_Tw@Vy zb1~ZLTmhvgth-nk=Xs@5(8RKLL4OjMaaCfb&PDi>xo$0AeX64I&dRvn^OTj`f4|=mJBXDJ0-we^m)lS|AH_8^Us}TJst_zoAZLp zey?>;(7iO8@=*DzUM0MH^7H_)jT0uT&X@as!5CJk0^o&F* zU0l;gdg>AWq(BMG!YS4A(DGh1WovHN{7(`HyV0f$b}|$*ZuCf;yeIT5G^QFfZvFC= z`(COzH4?ureC!Y{q*&kw8=P;L@-xNyA?XO&sh)_!=?ru0{OBRBD|!CE*mj~fFseIj zs_Uc1+9vh`;?U-hPxRz13>Uh#qV};VS|eGdF~Fp{BQSoV0vaT&)=*!Ru@on}q8!*< zWiAl)YohE=3B;QF3R~;8{=nAoqbPJ$+2g84DsTrw`=0~FEwkcFIKMD_VdkyvGpnF; zF4;L=O&j}z{dXI}S+3(1(yvCnrZE9mJwG%3_samBr;%A^G})5b*TOW^hz^wL3*7>^fIK+v5-G=4 zkmw>R5A~j^{7D~v_jrc9vE4pjd8HxxqD;1N!UTW$JBCKe*ifG}U#r#~EHSIkA1TC| z&#=)ir7^~5dGRHlh z4}N^XIteS&d>m3hq?jB@a+J1_P`m=8gTwS6r0jS987TX427III+00oTTtW_Y%01*= zEA3TAEfrl#tBeTwMQ6>Qxx4;S%#h9q1QmO{>v`zlkGKWkBv_>$x{Em6zlHj??B<7``z1GY!+wIV{K`$e5s@B9g(%!n<)ZR} z)E><-^8po{ii^kOJO9&QpU<~7u{w!nx_#B47B8$(dxV>F;Z}surLgpQyU5*wADZ~m z@lp=Gyh?v+TC#Beo2-|RK-K3+=CTa#>OXH)enjcYWcz6oA&;qeU$R-nM7EDK?y)Q9 z49Ry0$EwzKn0ewFeYxMg=j(XI$oe)T6UrSCtcXxnq5VW?9do}-0=^A z+iXDc)-_^HIt0fYd)Ye+0xF@8V_j}j7z?2=C`JqPa(6joFjCG$c%r7$%<3QIA0 zoh>OJ&!(le{|U0Wkk2%H1cGAJFXv-k;5qvhyG$sSvcudFa;Busj9|f;SH=a+ z{B({U{=$;GIdQ;L;qDJ;P|0onpYX6AQ*xc^L#8Smf>@%ag$kN<9*yUO!*pp;T%6n= zPrB-~#=dN%>eMz^yt-*C-@vD*n3MhCTC1*&_VajcxBtid!%*tlkgNHE=-n6Q4F@q;g>5GBToirv6@{&V2Co-sG!1d5 zw(0`<|CFl9mF*;NiRgk!x$G~B7rHx|?@=_Fv|OBODy$dKYqdXZ^$E7fO7M_;a*`>( z*qoMnDTXFNm*k|Pu!BY{_(3iaF(yt;;$4?Ho18%VIIIdH2 zX7ndK8CSTYQ{7RTV%SUgt!R}FI6k{v?w#j45$*1e9bli=R>J2OUOEa+&FuO)cM~9= z$LPl!p;X`rRdT(i{;6sy5`|QF?}}Q%e!#tEmu`#{lkz=>T8vMn zoev0P9JS(hyJi{m||)!Zp}Udc=>-qEqYfkqDhSTid`cvu*K1* zoA3S!*CzqP0#@w(>LiB!~;ty&~E;)TsstyP9Yqb%_B zq2TPtLvs?E#!hi1>Ubo>0=7OIUOCukU+7QO0f&lU_vx0|&Movm$CH-xqpXBPkT`;; zN;0YReg>H}$`n zx@Zhl9b<1M2koFnG$P%5Xt=@flmAVD8f)WVyhi-sXB|wF=AzY0K?X8FzWi`Q`7dK9Z|Ut=X%VYO3{(=Wq&s?Y*ZF@Pyhb>rDKTu+NX4t!q@r4MD9)XxPj|m~c;3V_u1)%T&2? z0s(ICpW1P`+6;#4lr&|R`U@gzg)1TiR4O7@GQuhqrs3m|XU{(qRTGs=1B#K^^EH;< zPNa`Vo0-AS`UJgHhwEU}>Zf%Yx|n{jFMr-u=q@erMY345)8ichJbAtBHthQt2g>qt zr7+P#HQAlf$nox4f) z)Dt;GI5L9GgtQ?(~oHtT+?SnU%1*Ivp$=McRk)ZNEW z37ozFPxA+h&3QcJ{ao8Bn^0~&Y)X@g{nllyGunI@(RKKdTiOVTTB`yU`zIFhPmOStbL;*s)_dJ z+tu#~rEQfag>-pp9)9K^JOZ!V_P3np5kz^1Zm-+rt{uO&1*$Ewn$gLriPt`A*y@W7!@2$mqUOUc{Gm#Au{lB=D!HG)^{XUX3tuO2sXdC2~e3V+y!98%3Y8P(>vt{`1<1J4=MGkZDX-!78QPHJd zDL@++Dtqv{+RcUu9;@s|zUr)&$q-$Jnv4sy`Rk`6H4+G7=F9Kn%(1ms zn^e|3BAEfTIN?sE**nPX!OD7#WL+82rgSuX-{?ZhnezTzb%qebU>@2UW##nZkrsJl z73VnU;xxw(#~&SkbCjSL+?%Guf+Nk7qP>cum3bv&~YaF zk2W1NLrCNK<9Qu&%w*_cMI^?OYs-(_8Y~UuT9LNztMZe-z`{One^OA*Gi<)nz3<+- z)1_)RnyG|piK11=Uj6UmRM37_Fidc|V#{(QL6HlwR;-)75hxVNuw3IT>P$-;sOAB7s$r5N)h`RzR(y#7l) z&X5ml0u}1;$jJ6Lb@g{zR&b%c(FAc04+;DXt9H1RlG4hpMb9bOnE&A-4_}`7dg}`< z$la!SaORH7ATQ`?N%H<|$D4pSfPW^i!&9hL-f;vKWZuh#Ti1I`oXhROZG4F*e3 z)#4o?8}i@1_=e8!w3NSUC5ZQD2sx%bjiMWQW-_Bl-_q8`2*Rl=9(^&t+WG>#Z$W`! z2)4{(_6M&AaJS#*o;G0O#1er=&|zGLwKF;2)P==D<6K3eR`DhUKDopWzxnFaNtbew zRmzwkwv63rmtFk)CFxzJzR6nTO;l#)mvN9(4mK?w{T54W_ z_W$m>h<9s7HfVfc^%zJw5`~QEm6gRwW2i=7)P%HLlNd>8g+{`!X?XWDv!UpcZg{)XH$gs_oHX0>J-SPnz2CC4Wpd$@~S~li3 z{+IVwv7o=JdQZ|Ugo~rCx3K6?g4OR(jIHSj2S;WePN#)iW>C%X z8Y@X>;y{5SlvhRF;^mcH;7`@G6HrvOBebG4zgYQ4+8XBMD1{GwzYJcZ(B&JbB#Mr%6}B zSe>J%*8gGV0sRl+^b(kcJjtt;2L(}{Eil1-iFAU)I6s2-baxNq9G0_D1R1KFZ4v@n9zut|apym>qNLvX)P-#;qfI1lnCBYlY}UX;MU#%=;4{qXM5P{%_yt$4tCwjd^n z?s~DUzKPl7wQ{m`HY8Vf{S5a_(G*$c=kiC>LJBX{%3Pe%q!)h};hQMY^tmioGvW4g zo=+AYM4^84P~n|h;5ff;X z4H2;Ix+r&wbpza$FKXlFhNNbFMVK4xT7<^A{rKc*|0gQ5jyDPr1p{#O`kR&%l{BW$ znxBo`JJ3;tvIUW}j94v%L0;`G%p+RL=H#ejr~jeA89ekWUoB#*w&VCJn`_3cxgKn* ziy1BG=gJ{)w(oqJ(#7;1m)B6xh(d4%{C*>!*5fONMxYuh-Kc^nZ?C8{UX*F1nOlaZ02Gw8}A&v=wK>;=K znIRvOi(4+umLX3n?(aNU5y;KWGg&dw)?&YfjAPdMq9OS2D3Q z5Q$6DC0uS8_BshF8VSkgT0_!UUP)SZFRxuo|IIKZweAvGBsa2V5MQwdWsEkZ%NrTN zww8uM6ZL25uPE?w3l5Sc=8rvfOlffzL9i2o0_!ZJJagZ#9FMC~o@GDhP?L7HtfX#- zH8nP|BO9i@vt@HkduvPXn3iVyD0DmYqV`ElAaJ=OEyDI&R9UR2v$_1i`e3t1@@5ud zc$y$f2;nk5QnVwa*ijX{X#kESsGF<+#uPodUCiAKh~Gww zTBYe{9p=Rv{OwD*CScWSU;#-xJ$+0Cx1&8cHu-Bp1Wa<+9zu^oZ!d+n&X@02lAm|Y zxp9r^kr{hBj~WO};J=3AX1bo&3bKHczqd>u?;bi*bq5TV!xl@&!82L2PGilN z-)er+`3x6GoPgb^K$B*2e zX%@~MwQEpNR?6KDvuIwV=gMC6l}%F+Z+jz`Qz~~W5kp^~u_6DJ4(sg%GY|HJz`(hQ z4HFlWW8d{0s>zVNa{9Slg%+(w1Xm%p7+wEiLs9pYb&CIerYp#8s@`7H_Hj*! zvdYqGb?t3=p#Rb0rGV_*_l8T;ThH^Q%dQ6rwaE$p#so8@_Zu4baJL!YxDAuuQG@{8 z!P>dn7i)A(u~0`~!wng#wm6uwgX=`#N@H;I<0v+)%Rp{!nst8~Eu$(SO5gSqx`hn# zQcHfCS4xvn9{Lb{W39B}M~*ow!Ze=51v=`QSTv^M7QCQOCS0G2qb;)-9g{4xT59wk zQW*61jAMF1D#|rA+~l~59j6z8FX2|r@cQK%5RRfS%%U4^2}xV^P~`;yH&ZFCe(@j1 zX+047doR=x9cp;?T2;w*WXe@#X|v_>Zn7jo0sjuNjW_b{W4A(?_~OY>N7;+}`x`$^ z!<+J5cg+pf5@n*}DLo$at>P01aZpV z)Tn?C>NqLs(HtR25sd1}2qtWkng7x{Y<|xGq}9Dj%9$f4CANFKI)4GrPvUeGmDjFp z6|(uAy6+d_AVM&?J*q7banuRx@~SizkYm-+G#lAlE)o23O%@U@&D(d0ii3)ST>3Ui zf#^isp7!7qXEvjfa)Y&Yy%87dm!pNS4%U}xXd}LHMFdG{J-OQr@clQ}C*<~J+p{Su zU}jLMO_LGffnSn>b&zC_08T<-QidBG4`%EAth*8HYUxxDGtr&#+V5J^553G|7}avCtrZawkp*F_zW9ufB0jWkBQzku)O_l^m1vy7 zF8tx6)$mD}D0csZ{ZQIfm$`hn$D4<{M=`u_u72TS6W`vG&K!T>sg1j!kL*PnI-YgW zyLt$la>9eM$}*D^%7RqOp84M5?oC0YdC`brOyntpIUjSavY1b=al!jo^Y~5F-ZiIw^Oc(vX#d0V(o?SC{r#Nb*MsL%D!#YWTFMc0bVr!QhH_L) zNebF7##Ul9{$>_%Ay29zuV`0z36JVOO-=cZHh3=;K=N);)GBJq^Mp+as`m4iOjwDa zvUf}s$}lXaqn?vrt$5sPU-YRI>H;fQ5>645!OZdaZ-R2%ws}G*a!}p<=xM;?ob+vf zpH~G55sKzFO@mYc0IV4C@Zu_^W!#+X*d(}$6+8A>@Y)DTlxX;qa}Y#lkODa~1V0&~ z$EOho7{D{~caoW(gN{NbAvRvM$70ECw!g+uU*AixY@R2Y%Si35T_aT#%c;(Q#w zViz*7zXmfxI{ClLKk}?+-4romkWc;HUC0b^x#Mb#DQD;wo9tEu`GrJ%cqgQ)PHCB+ zLOr8^5IXaE&0R}9=*x(yrf3Rjb247&khs&4NAGH2;vTi64c-BiOuBxpnUx`PF6GcZQQr4#a~9S2--(sO3k0(?!zY;PkEFpIIvneTcwRi4I$~pj|{;KT-m}&FVnOr zMkccGCGU_!2w`Y7Mm4PIxjl=`iYG+{RQSWKp6 zF@5PkpSi9vM$(O{;0iy9=#6X!*!i%{*SR@z@P1(eRoJ3$;&!{Z{|Ot+cGdqy?zU!m zMD`wKR2Us-MU)1-&&$PsHJwM-b--Wj$+OG8HDqsk4~Sws5h$t6Hq}}nPYkD zv)p~G_*tjo3`*MdjQze;C!7qU+6w)AEG*Ad9f_FulrreJ5(n-`EwROCWFfW=CHr=X zS|X0%`o$W)Wd5YdfdSNu)!gela1X6T7PB<(%FXV{c1)=Fhq^`AmQJpcAH4IHaNBRa z);-IYq05N8<_E+T&qEd!D{w5F<^NMtXR zlI)uE+&}a?bMi=bOu<0HGl;Y6QU$C^eC8viF1i^tK>-;1E3kg>sN>7yrQ7-Evo1m< zp>gzY9)63Y(sqY$<11H|ecfm&$0!53^LsZltjJZ5Z=<6mTZv;{Lv4YooO^dsIl^Z+`p1R%qh{C(~T zWqU$s*IEz8&_m5^UQWtj^}6^f6Dt-g>7hTy^E5ro14+hMG#OYy2pyH(+-ljiy)H8` zfS?5yo*RwzIck~aE4-6Y_aA8M?V?@w7%H9^qz%_$V zitGx0OIw#5i7j@n-25n*ojcZ3Q3EjfS{N_2@=W|4t2+ z@(7InXd4BK1dZ{QL|cN;%)%r=Pt}HBi*gWI#L(9qzAGkIqRQ0V;X4v1(^mdI_C3_@ z4$Ppm7FAiP4=N2myhf7_TNjqQRhC$P^ZOFsEfg~1rEG6AvgR9ti()b~;L|zb(3{ci zaTkoZyhr%&BVKji+W+e}j6e6GuKL*w6=iW(wQOQtZF^KDQ0KBomzO?1CzK7z7!P_b z5J6p9`(x?Q07Q=Ak6Vb6tsi!<{GiwSDqE`jT(4ziH8V7lk(;3t9~0Gthb}?Z&AsO3 zM9bGn5(`6he*?F6)l!xq1m?2c3g&D||Jge2%KdR@@`CGu96LeSLe-}icQkntLFo&y zI<>^(*Mq0quij1!@-n6$H;S4gjilKae%;t*S_-|PUA_Co!ycGPl(N5$jdody|ajK#<=TL7NX)2Ax z+QkKiqq3BR2r1wY(y#1JF)1HuuhZfvR6SQ&W9&;4^4Ak(&lF4GSAHQywI5n=b^CC5 zi#VM}&;quU=eNC3TeL}L27%(LAl|dMWypiR6MSXRsBBS41zscN5CHFYef=Jx^eS&0 z9QyW7<9T?sbvp_4=e1B+C6~LIM;?uEZC-72FEsezuG5@8!B@COC2bQ6y=L7KjyJ(y z+3)aHYfY5f|6O`1n|&F+h7?uon`H#|f%(0N&Kz_9&U z7nn*EuTmPZBvxE{)UaA1R)*f3}LXw5+2l;%Lio(8_T;YleIqdh1rwQzZv8?24?~THbuI5w&hG z^YRHkCjuf#1TZ=q$HAgl_oJfJuGmAcma}Q9t8v)M&CM=ZLiZt}3n5v1k2r2d{EKVO z?=0Al{371_a(WBg*Sau8fU_x+eKaangxc7+UQ0Bjd4T{7=cG$EPOKI_Mpn-95Jlb z2b>01I9eqAVCn<*_B!pu)gz?1`;_sZ6a=L?3qP8sjxsEltZs>O_7EmqqjHG>_sf@v?IuL6i;qKib3&7NoC- zTU!qyil+8q{&}i6^aOoUSmO`R8oOg!wsXUIe;klw^_Oe8{>(A)`DRK8t91wxSCYqT5p!Z zva>5E3U@ECPXQUDbV9@u?jIPfs{PHcD~gZm1kg5E^q}O@mu#L7l88rSi1W~KP5--= zS6AQ3hL>)!`^V8#=A(vl?|oApAvl-}ZZ+nXVtAG<_QD`-)&VQek?S3i$lkXCDj{}v z^6v_;vC<{{!I8XQ8gRxQ#}&TiP4X~F1%x%^{Wd|$x~0(;_1)emq4b9cyAZM3;)5vG zg=bXBbNjIJ!XA8#mKsGWmaM+J=(WRJ;I551BSNpL5n!N$RvP4+#`Y85g_|odkWd*s z($xyffT+)MqIL;=>Kt%Z=ud6e=r&{dP{=4Xx_R0$y}rftro_mt_Bud-P&!xt3DW$& zml^Th*7C!)XJ^>C(|`vrxAhh}O(~nF z^S8{g5Ua-5$X@_wREXoJe%IjDM#jGH$Rt2{%&&?NX~WGApmi42;+u5b7|yOErjCU*=Suw*N!glS8Z{z9d(z9SyO3UsVr47tcYd&=Z)cWeCD3dXu7V`Rhz|29?>mtD?V6`V_NAT6#ZQWOp{ zYd-^4l+##?lJ_35f2QZ(pFl2vEW{Sdl9fbOg*C@Q{EP7Q{GSu6n_hqkAIOq^f%ghfq%cVy_^^6saOyL4t zR73P?)`LZSxnu+imP{p&iW}!#^yECFEFqF&Aw}Qfw}iP_2YkEj_#vKR-A@+|0f{(N z&spe^x(D9oh;gi+t2w?$vdr+rkG2Fv9BjW1z8|+12RISLL&csE8ELFIY+r;WC5BEh zK{8zOk^LCDS7u8Q0vbn-<(}#Q&(mWvh@GDvFk`7P-vBR9n~4}Q+~8kw+*lA z(lLxw36m*G7FLy62pVS!v)hATFF~4@%J9Eu%TD^<-jyuhl+7JB+c=t(5|gXHJWa~3 zDU^B3HxC1ESfn z(-;Q@n4qj6JVi;eyO9B^As>Q1IxLhz;ivId+%zu+1<+5gx%yYLc;}xeJ^^pmExOGf z=#|Snxssg_ux(xjPy4Bp7szT79Kgf_uZfrOfzlW{j$6wTPEk?mF-Q6Le*H#}EhGL4 zS8cttgXi2?`Ql}9u>&5nk2%4dTOORNPBWsSx$j&LhRk_jCs`HGc#x0z`cb|V33MJ~ zd-U*D&4T1FipIW^Uye7atLbqOjem5H47C1IHl$LvWARi*HG^vXtK8IW3{`ugn%WxP zQLmBEVDEmwf9vxYNoUF9^*>bky>$Jw-yK0-n818&%_6P2(ixBvc%81xf{Pnw70`EL z{*c!o9BQz2n?|}mjHY7b(oAUrXCCD*^cdTjLvO#QNQjslW}8TB=^FF$1WL(KheZ)57mbJLrfM*OpnM9^|&j;CoM z>y}MG-}N=R5@EjscItB9!&38;>sNe_GH&9>enm>=eSC6%*fne?FzAEIX?(J=lg=;G zNk1}x9Bpe1nB2bEg1|dEin&Zv0uvPxb6ya>|MeOh{&${`nkzN!r`7xnO|D{q*(e^` z3RGX7_rSA`q@4_gIkJz__Tb8)N3PdCn{#!Zv0&2XWxC-*Y{flI6)Vy z2bqNb(Er?<(1)GBOoYGeV1Cl_t`do}@n0zJA4%IkEx-2GC$glXaZ2DP3yy8CqU#MS>1vIWB$`&_G(~nU)zUrH4VO^xEs#w`Z|i( zHD~b-#pr7;X(=j^r$kd3kfX1SACKnDE@&y>e_oK zub4i@5&S~WGs-b*797dMR7z|xp#Wlzh}h=IjX=?caOywCq5qPQBhCS3y<;1h;sPuT zv={!HXE!5B|Bx-7d&F=vf*v3a`YA`46&z>PhsemUj~01FT%{(bvCCy9dIOdV9PV>= z38fqkv2+RZSI_)EY*%bu8KtoJ*i+`{kE48bK=NO5%N%m=QqpKfxfV+s zf*)=rp36%<=3$z;r>{Q>y0abnM_I={gdRtBuK?qdG-RO)Hi1d~bt%js0{V`v2Oo-L zJWm`VOHi%InK%^==8Xm3FRkvPa;$tKUfqzg`Ekuu>>6X_sTcIn@%yc0w<}7-?`|oo z%rxzHWGyw1dm6T1Rrc<$iXuDa0=M0AGx)}S^smyOe zdfXbSy<#_UB9YT~9w|{Z%vF7j0&A_c(b$*Shgx5;q$^d}@v5r7qSe{4XLN)BeoI_B zR#g1nb+MrW)q4fp+ePqXgErNSojHW2fgbvsA9e8edxH*;v5MkO8y@@Ka{XnC+S04VA6{e0zTHMo*<5+Ec|AY} zs$V|D>X!g8(*$SN7;kNGw_CcK497rd@zK(RW%C3kqA< zE?}gbo?;?Z&FpFQkw(yg>XvHAF=VH+1?A0FgaK=sh{g7;Nq@$|w_3#DQG3d(9Jwle z=Ll&e>{1r(Le|1BkJE}(=boZ{QGRb@OgQ3O=St?NoPYvr7t9{L@s9nwdP3)J5tD~^ zvVZk-WoCH2ndXd+pxkn&UoN3-zcbbD+eD7!)93i{q*-fH6dH?{O^WaY-Kl9UY*bB* zw_F2}C-JCCghIj^%t;pBpmHeQ}F3#=*kL`r_v5Hmh$V(fp1-vNud1arh)+ z$}3ucNeQAsj6ErEbvF4b3}xoj-}5?R(JgTscXnS$E;m&?^ozOvqrxbQ%U1|fU&L2L zTJH{dSy`F5{|#UEIfQdq0|m$O=pgXW8gw*1Bq^gjtOyW*b0lSOG?oLjkF{R zO!lU0$U*pK;U9KwzV#q^ao(*J4l`a5I?ng(xi?l{=8NAi9(1rCo(f^5R>=?Syq70? zZOvav)P9h(OVIe~ZWxaGdbnWCXXi(m30nFZyd}1Qj{4{(tuj1DwP6xP%6IS0u zAgkJID-@Au^5lUn%T02bG~kv~wlv1G1O>bOBhz@i5uqphlB)o+Og!m&q-^Bsx@js&Fv;26qW05G zV!yKnwWj_Id%b58;b9Ng+8#%UYw826Dr zautb=1}wm|x$DP6(Z?QPT92 zdJXi@y~BsZVn<+4@01To% zXzA=4yp(Vm8n_I~U~TDSV=}gk z(*t-jG=03hQQ^E55!m=6thc4ZRw9_hDf_%sDPIzC;1{e3ci!Ru*Ony_zhnQ~>q!<> z)J_j?{@UgYTJQw^2`>uFI4+`uSSij>T4;LvV?oBspW5uhr3-<3Ih<&=KP0<)sWM`D__Q&onbLLk#Wl zU6|NbAU1%F1T^(s1}C5-ZE{T_Zn}GJ6D99iV0WTaWYgzNySq%yhe7We8e-q%jyVXd zZEWO>+DYebx75Viij^?9Xc7!ONikKf>e_Btbd?Hkz=wUW38HTgGD^ ziH9!4?E^ym9Ff{}j{nyr$R_L~T8sh*@&XZZ{`BovX0sepi5>yUKA-9^hj0Ni1hkT} z>$z{vg?Kf&%ieG;lo&KGIf`8lL;KoP91s0O$9_KS9&+9coKCrS|C|KaQyI03))IlO z^LMw(XJNo}A-IomGBl#vsV8?H#aPxEe0vmuY)9dJlXnN0YuAdBnZ32?y&ue<#mSnP zhz|K4i9;chz*Zea&-9t@CAwotjGb83hwr&vr+`pGO&E7D`S_yW zLfEQdkuIta=87|E(O|ZYA5-4Z)2MnPK15*W=IK{wSFDpjLY(qGue`iNzWD{kXc4Zb%lh_i%3~p>`4UV=ol=^P}N^;Xi zl!Jo|WyTXIyq64n<9sI z^M?Z8t4i5EjMW0$fsCH2#4*6g8(fKw|NZ-u7$uWviF&Ts>}-y$=I4NuScW+0j`qI3 zD+AwU5Pa^w4-`jiBWwpH?^NVS;x32OBMPNLP8cQ{Vh!B8W4GJCxo>S4nkm_m_OC__ zze%!g|J_e5Lw*G`|B+c2{Uk+g;CrMAJiG&w_u2sA?Mdtz@_;n<7!YH^N*+{XD)TKV zir^9#7zfo1lM>;H_@<4oI%wbj?1-;nj+{7Q*e1cz2(WO#w#A0PY*U6!9u#duqBnLP zQgQT;hxiF$ezyYu2XuaoKNlPCpxn!o#S4ATsLqlcW4ImB_6lX?fy+%cBS7ahtEZxe z!$+D^1wvM@sivD@pT*i5GVb%PfFm8$1N$z z>n%~9KZQe~g%)JhWWrkeDudvW`#3@_Ii zF_o9zb^4;;Z@K@1ikm0z8AUR%c7=spTVt+U`kfh|1)7Aw-s$9UmH5K4yZ_M&%8)M` z_W85*?yj!BG-jo=I=HL<*)P6Qw${$hrz2Xv?YJ^ngX@pl7r~oODH;*N@pW9WoMTGq z#ox4HfJ6y2nPC|rgx&IwEm*zSJ_8Inw-LAQfzu%7^UAEY);Mo?Py^ec;81v`~GHI*(2 zB*O!QUsKK*qs&p*!TRRVx%)Az*LzE2(%ijtg5QICJzid1+?KK@~U zlHT?A5+nhE#KMpThV=esyxBSY*=l?^>5FdKTTGNmz;>IKGAvs#a+N?9^t<15vr>Dd z^+oH~;fbWl$!BYfPgS&3Ro48GfhJ(Y#YT)1*~>%qj|4XZCUE!<5rFNAPq^lk(>?!{ zCZ?}-k6;c%+I7;QgPFeY`$V(?j)eI4VCeeICw6+P8g%(lj$n@+M#G(u^Ovg-o|pTW z6K)?#$_|6j;jm*9+DU=dwzki_IO1cryukKZ8t=Rn1%{R~)eytjvp&i>_)YQKC-3Sd_@ZO8GiY(E%Guv~O1m<7v8t#}?;%PF4NR#vLy>#s#@ zT~S_kdCd^VS~6&G&5eFJf1}#1+b#aDjlf+SbT`i6w$=hjemO+vt-j~ViTL*8?&Egi z_diRpfi$M<0Si=#13AZUA}m20P`ZStE+ZIduyuj~VCF#d8}S=)OoZvO+7i``xcq`p zL}1s@9-RyjQO&GwoF$!}#sd3~7w#RA3|t%bv=2JzQm%Sv?%hM$lZ+`c;ygXx5)+)3 zO*zl9KZ211*5f=VpGM`gdZh_4rN|7fvz0nNe7h=fe4;>KYPlv1Y>e`O@PI}DED6mX zUS`E;D$E_Bnv8Xmg+dsU28q@ftpupnu92TVuVp=<(w@(Xp#$OhUz}+ZBzVvs1HMUa zchJq_fq#I12AGe-L%;ns=#^OzZM95C`-C!8+}5&81)D-|HVns|{C#C!F7Dnponcp1 z!V;36r_=Zs#8SVbx**EuMrm zS0XTG+dn7wBd{XROOatu7Gr4i)YdSTG73@r4S)Owh`2)vhipJtEfN3iWJKS-cq zOf-U$2eE)Huq^{EumWn=P#KE&z^nI6^QweGliCaB2nENlrZ&XTvwkRpMM29Ti+ZCe~#&GwtlDAS}$y$>F2II}Xkp@cM2ee*0$*(tUFj2mrtN4f5BCv!?z< zvG1u|_J=O9l*_3?G$#A*np6TE$Kzjox^bs`oODF(^^?t-g)F&RySX22yvH+m<>Og? zt6Tm3xjX(V=f2#|OI@@C;bae2{N+o)Xcb6)SDI{V44Bf%Zz66T81%Na<0?A!(fx#;zeqNryjW;A!6dIiwM+7Z<)?R6O0oQE zybz_UP?K&pkK|+5;0TC@=HI9+AH+3w5K@9pB<6NSiAU!2x?+6n|`% znysu7it@@UWKiqn9W-PvSsLJ7^Y-zoQp49aH~;+afHMF7KUVAD(~+5j!o~fW*EW%l zYEsd5?2a*Bdg~i(J9tWP2Wc4XuXF$ST&EUAIbx{Lq#j!}UH>V22ZByaAri_ZrvQ00oP^`G!zQ^G~07a zJ9c8g_0Zbj=II()k2wJ(YLy(CZllDmG?BF7phmubA8`41BMgHo21=PX7+PktupQpM zz719&>aP@RQPkq2O#GiAI8X55)_+=>c-NUuT4$~n7i}boB`pOqr^bNgcKfxuZT4L; z_TP@xW^W6j3|_Or6dXLmgO1BpS&oy3qBzgeXA06Ol|#1-4Mv(Z7EOJ@?mT5SMJ zB@^jgiJJRO@^*D|diuYIC$O(<;CJf@0U|;0cN=b*-Y=1ht@f} zPL?dhDW8(#8PsH4n!er*Addi+PVoH0(k?rPfh%?PNO2M}>-_{oeu#=}QU|aRTym;* z!uYgxXqLTS2v|DJl!p)t81VDjA`>|w9^N=U{war!_k*4oh4gY71aeQp8Xl~kDD?R! z(Cj}cAb9O1PJc5$8{KvHipwc~$lB1b_J+0Opy_~mS^m#Z}?WHw$X?A)6zvqf^se`VcX@B;A` zcU$xIdk39g)9mh*@W(bYfeF}%Pk+Ft^#$K9#XRPpKihl2p=Xj!MJAW97Vx84hUCED z@ur{YGgzs$(mazrb-aR8isMa5Z+_!z+&`%KP33Phn2uGNRxHG2HOOg?DsqHZaG z4DlHCV*lcm{2F0K#u#>Bm)E0anox7#nB^o^c*vWjI_Dz9q!d910Um-3$}VVTT!d9U zKTz&cF!5=L;ZHz(M(<x~|&!J?qky6)0p~Wj;WSmgegf#;}>Gf?OSMwLG?b z5C&WJn*J1CjV|VkeYRRvj0H2b3AB1bu2pB90<#AMRp{k0)C7hS3--(2s;!zWmA;W@JtH|9@RIQz%x*9rwBO?Oq&W$3 z)>j6ys1X3OZ-+eN^>$$ z!`l0|=!d1UNyA@9i;bb_|3-f07rc`yL(2H#zjmm@Vn)5amr!x0o(IIcb**)WDL^nK zGxYR;Wq<4Ha`AP+An+}0ucw_kj5;)YIRmy&z82U8n|YIAtv-`*^{{P2f3;@2a6%+B zv$BP=z#a}P=0gwq9R%PPs7NJ~6q?Gm4S#za+=5~`v6pqe}EBzr5Ur1h)48s(M2kHmHTZI0J z_TDQV(Ov&B+d$=Sa(2FWHA_8Hc_Z$Sc#T?J<-XXyvTD)=xqYTRjhS+ByDKcR^ZDlt zrQ+75x5)d?h?Utt;b|#fYVP)znB&f|EJ9!BARJ@F!Mt~+4S9GP1s$zBY1~cKbiHzx ziW=d(b1aegoVSwNo_O=bsE8j3u-yd1?jSv|$~NG`l_%+sBAwptJqghPc3P{hg<8Y0 z9LVU}Q8@pLsKTTmau2aC`H!JTem(a5&#}U|lg_6VtJQdV+qh#*&Yl%Aoi7fIL=h9{M(M@-nM<4P*G*k-3FM)Fet+`&t2%?^8jqFhD(@=FuuwoR_#;6EY=%58 z{x^q&puXwDu9z-J^Ms&|ol!s{!z~o`M@(GQsSADG^Inx17JMBeXr`0Be5ODyv)$oXSEXq=JCma!=`s*d6dS_=vX83r;o zu&CM;jNea!BD$k06@MI@|7cb-EfR+HTJza-Ej1uq>Oe?gdFKyl!Y;`406+7Yc+Wxt zzY1t$#Z|Biv2@BNCOXl&p;HSaJa zlG8}nXT#{*dlg z=-=W3tc*A$ zWBC${SQuDe>Zu`Gpc{G``uvLT-Di&pq}5jcMT` z-t57qvS+h4gswA^9lc@%M=K4RhcJx;1x`P#$u$hbkWll%PUSODr5I$Vg#`$2ZcmPZ z?|bP1uUZ)IPa^n}5-5=z;no(JU-b(O5^DpHm4-gF!a{}n0Q)$TQiUR!QMK#ixdWdc z32J$Eaq=Kez&{4lEZ}HxmH{~(V(mOj#aQv-=OEc53$q1#wwo}68ffGOnrI4`P;|wzoAwyK44G{2haq%=0~YvBaoU{qygRfN{fRlEN_7JsDT2{N+=&%S;e3^P~M zU;{%x&G|~*2da~OCxIZ|^o05a$a=IN4IttoY~FQ&ZC1_h_qh=o1~`|7VK(b=2qV?r zN05u+X@flC2qUfvNH`~MYG{G7_-A^adY0GD{~FsRZ(iK*(0Kw|Xcl2-%*}!#()9b6 zkv~6UyUh;-idD9rb`J_X4!l&Q87<*f`6z1o&LN1OpDvNoTw%T}NFn%LlZJ_&M)41} z#`+Uc`hB5t0$CjRv4V>nU6#%&?{voWf)~W3nUUrW)(jwzIMv&G? zA-&zQONB+x5nH^ed7`(SksY8ch5JStipMrR?y3`fRU&NvVnMc?Z>I;n{NpoZgY0A- zR52CJ;4QO1*M07BHsD3-Ctzu2G^mD=K)b12JC#V_HknLIb{(c`KkyKHuyOl1n{*Bw zEyF&IL33UP$VK=#jDN`Qy6WQPx~xW@3rPCjOl+|xh=_$egRua^f|ZfAfA`)VZs8Hy zB(M()fijL-0qoY*uGOzm#&Cg|RGJhdRlP(RM0fGo$UnQt4D0WA(M*?&Vqc_m2w^HmVz>E|WxnRt9-sTKV79{uN z%c*;CL0%%Oi_JOQZk7Tf&>SArvzWz$$Bka)3ocK>zwoMtzIV#7F#xeiJw2ZPeewSq zepN{AiE&D&t~TdaY}dpzcGVndT)cT|POH?Sa!NF-EJhC6aXsd#b#>9EhVAp9#B2|7 zf6ZVPQMp#zTlR10u;mpb&}8U!GLarmh?YUdPmDlT^|g%{5KO&9E%e_y!``@HXhSVQCp!UT|T@K8q zH*#?e?}x`hd#2f@fAh$Z#*{#G3LE!a+MYXKRPXJ1v=}b9p0|0oQWZ-Sy&Z(c%zmxt z{XMnf`Rvt;Ya`bZQnsV)4k19{xfHwK>B1=ZX9!1x<$X?>vf|eV^r4bk zatMYZ2w1cCkk~~0;_tl(e7Gy(pY879G3wCtJDfC+8kqe_he~4F!?0XO0r-@I0-sVaCJXR;_SBlH z7w(q_Pi1}KcM{*imWEPHzy{kTb?rRTB_-zF`-k=d4mhcMsoNZIlJndxQ!TxOF<1CB z8vb}iHM?99MZYuX;LNPX)~Za;**GxW`0+q*-jv(R*u+o==3t1x#`pd4mmGp#IW9K4 z;h6g&?bolo`^BYup&$E#Wubga`q@XztIt!n%Gq#ya&XtS~_GDi{x*L zQ5`SVS4o%8L<#?>oPVsCn8M_CQ!h&@brI}CS%?pzX{x$ z(jV$IzaHNr7mlMLnkgU{AW3emDIc}uBqXb$xO@$XkQ_4;w-e2&TMYNBPPFJ59wt+@ zdm8aPi|U&@wW)Z>*EP872R0h759Z?8;K+V*%@!GiZsCGNFx-78_7v}qY3SQ|45t~#332&sLHtoVuxCjAq)&U3mcpeLl@es* z%%aad8>e8^<7dV^dz#5pePlwXMOkDJL%aJ|@KO_1_MW0RyZnwmDC(>v@#fUx z1KvQmFjq}LN%GXr8w8(0KmK)PG3NlpUPekdH4u$_#1JUD{9-APDycXI~W?<-d>4 z4*pfjAnT8mZA;O0#&gF*j=`v^MI_h8r}+Cy1^`IZh&P9gO4hKid1XmahGC$1wseo( zx&nGm9EY@whIR2=BNT|-%A}REoaZYbH^`ft3&1r`aHE~Yuq+OL&)GpD(!ciAE7hkl zL5>3R7hEFQxx%&Afg!i)CFkHytvW4AXg8bJZSdu>IShB zV&!xl_`9FrhAjlEP_wdWhus^6+|hJi>q$Al4P~r?p6%pTdZ$PVw^{l(P)-+??S(Yn zwN)tWCftTayYrG!4IMr6EumCuytx^e4Su_HIgk1Gv7@rEmxM|;F_ofBN#ItgbhXjDR7gyHz^dnWW+Ea^ z4QjP%SvY!o(fP$(*tWrdIFb-3rWZ@Md`a#MXxBl5dwT*s-oU56vC?QkATQ>Gu&L7r zXpNkOhcCl5q7E=^jGrTzhc#E(EclQACcDY->A6$9HE&0uR?fQ#PN&b8qCy^}`J-eId1S`a5pKC)U|0vt)>D@tOz7#sz>sEwqSKeGB&_)8uD_ZB>J6QD zD?6AWX9PmmjW9#ioO z&5x??CUoq~7Sxsof?K6qpzi|29O{-BaUNl*u4OPgWrBw9`T>6(FSSR|t6{UCdn;8f z6dXh|-fZ3IR;S}1?+&_CTEB&@&i-AvM97kuRJFt(RyD1=^|8BmM{MSN6n`no3KI8; zLAM!aFr8=|xwp!OGtVbE{NHPGPNA2J^}dWO*vYMLMwdup6Fs02)Jv6}ULg^={K=#3 z6I=rI`TjJ9En%>}QCX|ruFZficN9#)orXc|A+|r14JUb`?*tVkK@QHC(mBb8T&#*O5Ujy3CJM>Ps5l+S=M03Hrm1 zj*mtDLBarPMT+gZfjYGudC3=V6DK%54r4t(&@YW=;Skjce%nrca|67>@wgG&ekZ}T zaVl3L1$yN&<@!_-WecST?8ALo?nD+!R3zfB?tl+0qL<#z4&RMBGN^TJ^H0o?SE#cH z7fdfMlGu25fG$pHRibx13Y0yT0&q{1n~vfkKh~r?Zs3ylAztgCh0m9vyCi+$K!>Z6iZ+#7 zu&wQ%PyK#B2C0VL*!Lh%?{jNcwV04-JZJQ~5~ubW(1m_og64(4IXH~+H6Ccyo#Y(TbneEJ-p!6b* zov@`nQq!7X>ULkyB(+fNu^%&X?UW%&-~2W_ozgIg*_x1;Noj4M%wo=$2V9tKynQ}_ zkV(rX!&EzwPO86Wgrd>$VYgK{+n7*n`||HoNosYSgwJ3VK zla4OKH+Enfdngt-J-2zWv0!c#nf9<^Bmx|KNUB*Dl)%4}#;=CuTkPM&44l+S1K0^` zgbErIOw9y<%k#yY*YcC0rBa0|ENj5#y~!+R2%NCujJwx7j+t3cFC#93anb);qR6=p z;XLQ62LWR{quQlCUNw-lVj+hN*2gg^`TzNC)08=ds#9vE#57#Z@&?7^_fGb+_t0kT zQesichJZdHk6Z_?GraUi3kL-nIbNewr*>(Q+g~w_azhq?t8-`jBtuqXYE8=WCXsF= zA>a-O@;u`hvA+^FbPJJeTHl4KZ90tG`KRbBom*Q6~UMXIfc z&}_}KH#Q=QlYMns^<4el!`-`K{|a}VEgoOt!S%aX`d3ULOG+3{r&4G{7?=Apoo z2R0X%7TYERkKlkeyH|jp@T6gz{W-7s?{9;#??9zzJj;kB5B}vWwHI#G_yF*`C+KJT z8VW0?>@8#XnZp7Ydl95+M!C|&I7-)!j;YIedH#DH%~JCkZc9vrHSDq1`yXwqI<;Qk zsb|B8jfJQ=bAyJ*n~a?Y%RS%F-n*|#o&U3IIrTBC$yPj=J!{9&aE?6F&`+PB2&)1V zqi?&y0=|o%#0C#?AI0cy{O{!n=|z;Rguvns4*b+2dbwmGKUDc%z;{#-a{~A^;xAvk z#dX1iWplMnra&0**Z}x#!B!^i_Y=9SX@AMCjcHc8zl<}hIXnZHWoF9sDs0d8uT>F5 z3M0hoxfmf=4im>5GXQ7mtrfNz;OVc%P68*h6 zexJJDp1*lA>vt|Gp~~H_8?Q2{N(C>tjzRi>=1!8z1Wmk;0t20!zdrn*$TKrixNx!y zooG$%outn?O%4SCFQ&|e{mcaD)A4#s7ikdFPnDY@-%E!mi0M~-@d=91W}c??icqXa(>-NV`su*63oL7fW5@JYl#>QnU%HlwK?7XU_(2O z^6ry7RbB`&yIP*)Ed=4=cd@{uS;qIWY767%H=gL8+Bn=O^A1x!@;Ln(GtG4hCCe3I z+BZVx;FQ2P8MhyR)7>XM zB0pU2M!&wz%RzA3rV^J-Vwc*HebZBMU@Y?)bU-biU}dMLWS?)gW`$_#+2~%V1SM!u zFjB|;6pYiYm?tt^h(DdHv~%`QTfpCbSzlRdp!rcE`!;rFz=wz1}80aVd6h+^LcV~}&;)-sKYGPhi-=k^JUzjlhDajtyPNwOZQ%0@&IQ#W|5t7^w;Y}Uav>}ks;zvk|3 zO90k8tegBL&Tyrs|aR9rX;o1 zwMnOlH+c)%B+*1aXDVxIU!>{WDy5tzP%7lxS0%RCGykN$A77RFa}~0_``@v|{LjtZd;&tjAqT>h+Y||VNw(N+dk-i1Yq{D~wXC-FFU%9cYyG{?Qp8_?Q~+}p{G0lyo6}H0 zn+zLJIP3IBvvR*hO{Tq(dOtWE?GYaiF#@}9rO)=+AH_kaXu9b*=IdcoA zsgNnY--qdiC_8pFpX~NG)VVq3k&PUH?QHG8+u5V?^M282^HPFb5}n~9XXtpdz{4tR zTN>yy{0}l>69^@(-f}!^$5m?8lrZ@>Y~G!r^Y3!xFP&Ju$X;+?0lO$vF;C(;?$IGR znoJ5mlNyou*oJLzEWIj7P6m7`V#9%eUg(;Sz&V>QXA~G2S@XF8lgt`AYWYbPgnoMh zno3@xm$H({j>7=mhyI}b8l4(mrJ4Cf%(V-clOPz#K=QIu)`}f*02X3ZIPoz9<6$7A z*SY~gAO6OwP1Yg`AZ~oWfGFs-TOvJL!rBvRwW0cV{SMtjztg(SzaR=PqSi9?GI+Aj zo|#qdn7(Y{XZz0Nt^rk5Cf=5j=qT6YabB5#cLzO>#jD!PIi{REZ!@X!l}fv<$-$Vh z;U`wUFq?e1@t-xr=MGA6zs<;fqdgKakETmK^-(k(X7=?dvI)vm*du{!Q~oC@f&s4t zu&K5aN;aG;pHnV`aMEzZ!-_vP&>l92<*7G~h<;>y1_L>r7k|Wm4+#Y2eP)=s<$|B*XgK4m!p>1ni#Vd%7P*@y&MED{n2=3d5ND~QDN8% zYf^@POV+Ml_nP~90pjXUd-PkgLjC2hsvKIGZCG`UpOzhjtCbIx?`t;0z%?}^BB8Wz zO+&i=@epu3kHuF*>LRV5tVa;%~uScD!s>crF)4+Q@H&R^#D< zvD5FwRqCiS#MQtkyS+7Fz#gQ9jn(b8m<+y7PYWdM(igAWdIPNy(1w9=HD}~=%#|Hr zS9KoLEjWotNHE4&6+!tR5kHy%q;;i#Lkpz*p(!ov8ki5>mdF#0_#Gsae|F>=E=a(c z*xLx}ukhcbowVmJS1eroUewilEPJM&Vm<9TKIi`nS9{)Xvd%j~;qOH}bhkHB$7g0f zS~+R|UdNOEM`ju^ulrWBbi!UFSgw52Q7x|gV?j0+CLz*$Wiwuir z+Xj|s#?bE98v$y6%}ir{y#1auToq-13Q|t-(FB~Y?8%Z0m7UOzrTSE?FZ*MSCB4b;L|LgiVf(8rcGr{|iuc!yj6^8UOJnxNM z?TB=58yEKnCrEmEGvgHAN%{2!x({z`0Ir1puONRB1>HBG(Y<*IGVvPg zTp5nASY~`W38ok;05fJ#*-ohv@a54Vz92A#_Dx1cvypXI_m#Y;-hXs(=dvrw?|tC% zXh-q1K>UR84~a7>jldJ!U2L7iCK>9_^ooC9&Nt9HhA_uIkdrvzPe1{nxo)r=!Q4$VdMp*j<<``Du+2G*3zD?liyys+6`sUICEHnjdhhfNI+}F%` zb=XVi<`WG3!SpImOA-Nao6*!na%*~z8|HihENOswef)3(4d5XO&}7}edGW1HPpj1P zuf+>3uC^^*d#bZMJr-vqhXBwwI4aC*^|?R_Q(L3f;Ag?{yM~4b;7RV3vTQQ|>3wo! zap5-eh6NDt{facWQ8qKk(zs7bIekFa_h$mt=DivBOr@av=aT}@8cu3Wd{h&LDFI8R zlm(p{ci%nd0jJ{C$(ftxClYss150D~Yo_-$kxzBgA5uU!K@(c3`!-%{zGYy0@WpOhiJ8RY^J5p8%3P z0dJN7tYJ`brKUFU)%W;-I)0#ek1t<8lFp zp8zFZ=(xQy`JMsS7ARf@3W+yk9ScC)?X($7Rgy}9PbbNw&Ue0&aItjFm$R46Kcd(x z!NK!|U>(}yBxu#O1WGa2jw3vz*naM7-X2~^sCi#-3)lr3<}2Af-r6YTb@|Plnjp5y zlYdd!z#e|rAK%jhhO|z@35Un&5+56BMc9^?=Yv{KW0jb%9t64R#%p?;FAc1BRCPQ> z!;jEOy!ZRhhSpVxQkDPmvzMQ+K{=*&DHG*=jNvU{&t25}x$}OVe!fDJ%5WP1otyf~ zs{G0{2R)#{>pLz&kEY2N*tqmK7jJvW^s6`H6o>&bl86<1atNX_uR5SL6VW|=2DnnZ z;YbkEj?e2Wz3?&yI|7J-bH)#V=Tg)DKpt=F)MB(M+D*h9$WN))qp|r^? z>8qnL?Fi`h<713r1j`J#dd4OvqecgZ=SBx^-{VJ6K4^PaGd!c_685&QoK3)gPAvFQ zEX|CkxT$`nJ7hOnsp`aaiR@3SLvTg_vA2SbFK?drH}Gfyob1VcO+w&p#>NM`5mp_6 zFK=~?eUUiR&W+w*yZ<%*3x;L0BxJ4S^{hZ{M;;S6mP#C{RD&+U>gPqZ8vxK zH+!vIn=Nthr)iq)pZ!Pu`1?~*xKyH737`gOVaUL1lFkWe$gW+tv@I<_V1Bi#wm1aIWzf7dMuN(WTRx?X`Gm;7vHlPA- zyjpd&p=eRUWT}ND^<8dE)ANc74!lC?Uq8E4N^pwgD zhh`IDm+nFIE`^ExdJiT(e0AE7PmyScg$8ta&^jR&5{6DmW_7In2VB~EFEG~)1|I)( z^ErN>MowsK+>VUWyh{prHS$GJaM6IZXch>WU}KocBCoh4I*WlPkpx5?zXmkWk9lwn z1A9w>?C8}tYKq2yPaD0G)+%qMN3@9kgoUUWJp}lKw2B)2?pC3saeC$!4GWb+$L$r$ zM1T10w=4NmppGV`FQ&R-?|l-S8#ysG4NPh#+GJl9< zX!b=@$(6@!_>uC^Ke--J&8r4BqBN%A)=!<5f@1w?EM`| z2w);snQS^tHOi>pS^_Q578?Tt$RAeO#p;Xr5l+5TV6&4ZXL9cW`n&83E&P12A#}v0 z*8yBRz{Lg4u*eW}lngp1bSGL7#(N`W*}?4zGXO9!ZdG=Tf;etrGvibyY&i`#Z%;Yu z{&)FOY?C$N^t)#$lWFN3kz(anqvV_WY9^EirwK&!pP4A_wi7h^x|c}|=>$>F-0-OP zRo~-6nRYC+A8O~zHTFt-kr`Eex2@YdqT{|R%)eLYyc;&Gq8F{w^BuTd8P!S5M_^kO zHad7u$2?m*&L%HYK@lyp_4393i0?H0>yP8Hkd)}5ksh(epIq&yYDgfQ)oqT(1~BUh zRz)`M0Y38Y`YLBQ#mDSKB`t)>4|k49*N(_Ri2c*2jn!_Dcf;l3$$vr_ued5vBGTh6 zUimaf7!SLb22k}b57+2c=N}KB5v8r(oFe1Xb@W>{Ef1w8`d=PC0koQ^)FiswUkYGc zQ)8}7Y`40KiL8tbsO_mkY0~UKk$%f@*zr1bQY)rFHEXpETp5wV@`NmL(fU*S^Gz0j z7-UhmgiNmQ9D`p_;)Hlx%D|Rn+vcG%g$sg>GV;6pI?BIt(b&qxvP44*nz3R>J19v2xY~n!fGL?adarGi2`9<(WmHEMp7}-!Gq5p+a1Vr5PI9 zpM*S)&oG~cX2-Yl-Fym~wPT@A=kT48c%?%Nks zhx28>2R{Z-{Il1ep4<=`Ns2gEW1){tuXpOLMkU?HVg$e;v)Cwg4t5BLB z)MqVj#Y+v?g=N#IC?HY@M8;}YQwClvl>E?lLFAT7If#DTgN~EOd4FR#bt=RlIv!&Q zs}R|;!>^^uIkSz2>SvZj)1!rrBhf<^1Ft1shWx|{yg2opbureH@rn#6MdSoS;fE51 zA9jOvFJdM2gfm~yi@c$wDKf=3Vt?5fTW`-ju#<~YR&74_pC0n>*rV(DnT+dLhnP~w z7rdM*j9H6s%@{@Y3fGP*&e0)}^CQ1>ee+7{Z$8qP?BcZ=$yDL64{KzP4O+Sb_977) z>SEw7%`yMh<~fXOI7@vjQ?;ZI8i%Y3*9si75hf>kOJ8vo%KH=CTcAY57;Y&{tuv!9 zS@RgEg*Ir>Z1Yx`ES*w4X(=0)qjTF72c0MAU>wxsyy$ns63mN)E_FF>=HclXz2y(I z{nW`x&uUYXY2~bfj}m+CN*e-<>Ha+eX!=Di)>Hm@PqDaCUrZ2u$`Sk$Ck_ zC-?i87&I|cD@Q0RDYrj#Ry3A+SxzI)1-A=`4ri!b!Gi*>Unr&MHh-O#^0y_dYwhM& z!{`oY8Z&U6DKb#c+eq(}0!FOnHr#|g21u$f-lyC#Laffiw>;pUpk|vVIeGP_Rf7#_ zOzPln9VZ_nlF)89>1?v!7xX3U(LG5#?HA}EP9oGYYwe$4k@+rH3W?csLhY>;g3x@&%8N$y7jztZV_~hZ$YOz19RW|xsce|->(k3b z(h#Zp-DkO-+RtaX$$X^U#6{@Zf$|+IQS#-%g%No(& z07_||*cb0WaUpZbuFdI+47IhT;4KqlIBI%>DG$&eWFBRXxdNQ(o8|6)8E{hqfEAd0 zi|!#9I{|`_>`~sC!*hT`u~|1Km_d~^Vgzgm=wvQ33PuAJnZG210Jk5{$a ztTc_H+g19i!6DY)?!$gu-1WnO=7PUNkAtm{1$y|WJE{#a%wGAEgbpeiQ>rWwi#t$# zB(ZFElC=1;LudM}OmmO|kw!eJ-mJgY2iG@ksja~c9511Wpk*(guab+$r*ok81I(k> ztA&YOiR`MKm;F3X$svjjnOr>j+r3u-~E`lEsq%s|)H zALJc>#K z=~bic#y%FDF1sf5Q!C0kliG=lL%HhT$@({2emRJiKQ52dv->SDRyIFd%6+-NFXzny zU$F(^9z0~~^7<;|=Wd8M#t#pKAaB)9V-vgdHhOHcIi6>rx4c!04rZGfjk$jn=k!9| z2VLi!`Ko5!mf+?OWE#14jnRapz(V3Dyfz-D0LEBAJ{foG0Zc-qNk09m4B&*{y#(bs zfHZ(uI6HGE883C5-|k+^lVWsb3zeM8K``$EdG75Y3UDjXz6`j@B@{V7_>W8sgB4%S z(G1mrrDCBtBd==Utc-H%h>u)KUuFbTg4U*xCm1pY0gBZj@B_U0OO`J93!-0fG`m&< z^5kJZPY^nrpZ`@Fe{>ySiq`w>R<(c;K_76Y0?RX0x%1qyt2ptGE{@Y@d74V=NE0Lc z&w?8xLCFXzdM4&#M@|GNb_*h=hxascCS8s2PR&9B980cOL( z@k}69*tUHL?BX3&N>cjJPiH!0*|*RH5RILTbP*AUZNorJt{!5`hpS|U-L<@rdx0p zgX-})vk0;v3%M0CAJzjd`m9F;(jqDg$}}$){WrAT7xA0Q9cJdQ8!7W1I&{36J@Lx# zD0dh*qAMJr_WbtbyEclHL~F%IjD|V1u`2qMa8Q>k5@D}XaEHs@$q5AFWur=KSpTkb zV~@Nuu>UR17oxOW@@V>vVL$x{$y+kt*Gx(oPaDuQ4d^9k?~|$Tleg{}AKy=}uJOb? zYh}Bdi%!{=+4=Y~jmR&Sr+x}Qxy4jlSNf3NQ748cz(DTXa>cs$hJ_#7gb7!5w&#Wn zeIi-LfioM9ujJn2Z~}+|pykQVs?G?h6Ty)!lIHh#etJD1t&uLADH^vYx_s&|jgh-g z+prz(;+o(6KDOF%%2BO{_Yt0qdY*V}$w#c@_vIXu+i3JDr%9Di&8n%Wl%&1f-Pb*S z;w*SF0k?RmLs*mi_JT(CpCh26W#t3Gc9D;;qSlfk>8`je$lpUn6ZZJB;^yYt)rk~- zRKqnLDRlIHEFiLS9QnD1(a>jfU$~w9vHJA-Wt#LcDbC#U6OD%psA(zD_vZVp9t=8J zqXsno?iwszN$)kaIq?q1o|B9uN^oLk8|zytR^+T5(QO~m`QJ&c9-F0OrrB)iFwL&W zwQpDrUdmZV5|LrzVtR;eY(6L^FQb<8exj`owT+SU{b`m9b64zBsK z5w(}6bOqOhlgJg%9)uEnvu!wi?M%J$nHGnGbJ)?i^O!svB|-0lVb!=(WAs+e)Ud4Tj7DR zYt{aQdmMqD3F9Y-zX~^VOq+g{8J||<5Zw?$BdP*v1iJmNZ(#~N)Uf0#8RI#A0 zl~RV|zB)07fO|NpT70+Xk1EKN?fX_j3~sq~PXU~$nDT-$6d553$g3Z)-e5a$!`a7a zN)Q#X&}S?9XgM%RNKe@*Rk&!s8L0~|q`%{OHp{|B8Mk$f+hj;gFMWRQTc+dKrzA_= zKeem!$daXjP>HFQCS!jeF9ru@Q{T`q5*@F_R@SHVttevv`S*pGaDoY+(fZ^56A{i} zTJ1F(57?%j^~qylNRr1-L|m4KvnMiR48+4AOgl!BW5Y$`k=5d7>x7|4Muxf6iT6OG z9XtsUv{BH$tGHt2Um8^JX2IKjVeyz=NPuK~<|)QtK&`N)0jaU}eYo~G^+%6JUwZsf zaUOr1^eYB^1M|?H;ug2U(K(Gb+t%47=+A3A-BHwLpWwzCRsj>qvq>EY*MmW~#Dr0hIsXlRR8B(l9rQ!f6xvm;tKPB7_JtD3_L?&3g$du*Sd zBXv6ou1=)GpD~qjWWwH9{Nkrl(XJ3ENySdxjxuZ-{WCAxyvO?+|HseI1JV&mRLW*bbu=MdE zXU;{60AnwJU%Z_TbE;>{;pX$q@)}TWPPXA6nNP|Rc(p|^`zz&Q<>)f;_hq8!J)QSe z&BKxyh7TXub_TCgXZ3OD^XIgOBOk>2l9j$>r_>iV)2=p>ZesA&Ph$~#^~t{8ue$cf zdFYi)5oL`{7FIHtc!cshw5_#XHc)&x(E6xN0lC)hz?nA8o%0H%yZn{ieRoHj!6PM4 z0!MrPW#=npMFo|8IS{Drv!4?^$c`6OqMqE_`#|;QCxmaKZ-4@=w!VEJ_eC44n$w(N ziH0kY95(P2%{eJI%nk5!i*`H)NmC}msa@QenVDbSpHDwafLL~RiRbFN0SqzRnBxqv zMGS9r9np0r$rFIZ3T`hhpX9dpXF6q}%gN*G(~9&u@q3emTT{hWl%)c5@+?D3JacUM zlp7AtFrs`m&&`x9jfb|1H(Hktm65%1%pkleYFB=Xq!5hrrP<@c6{lHM? zZqNmI?J%P$agw+o981YOp^J-tsmAQz9%*uBm#keQMlN?NrY`GO+?aKmE_N9D2z4t!B+?_p8#|D!waVN^|80sN<)fVX;&+DOq+(! zN~GC0%{VGmR-3-4oezM=3N#D8U8Y!O=2uPP#GIyzn&s+b+pVE8d>l5J)KX9sH0_Q0nho3CiAqLjZgEk1c5-k0 zQJf;tcm6QbmM|BGA0;vsb*d!&s&FgtwTB-;hIv0~mwR1H$fB^$j4cbZ09>4DO|NyO zR)yfB3i;;vEZF>R;dxi2S>`MA@WUz3dnzMY2AsmDs(@& zo$SR$1Z7vTB#uIYTqVM#9r{R33?rt< z1EH==0w!tQ={yi73Z@6$a-SM6M;R`yZC*C-l6j{?Y}lj~-BKHeRQ(G+zMx%=GH)HlwHX$KoYC^SY8Aq*SR*4etN<`cz;wG}P>;-ec(O;(; z2_o;-d={^EMKwsQ0OHN2uA{BrT71AqJVo*Qwl`K-RC+pYU`Ryy$3`O+;pSMVAtXW~ zMSne7BH5NZC-vCOrZ9}baU}(VwJ77*O^0v0;s5aT)j?6OeY_${BaMi3Hw&z^bobIN zNVjx{q_olDsDxQ&7Qt@r7~7d`}QxixLIQ9Ig; zD=R8EB|b#^7Yr>`f4uP)s*K=ZB5BpVkF@fq}vP?$Sm*EFPDU9XzN{=R4_dE11lECkJavGr2;i zdfKr;SI@}IGcbDVk`#ckD{7JO&rBFK4)II&{i~10wv8VQ!2%;&0KnG1aR?*|;zppn zK!SC*Xc}bJ3WB1C60QC{yjosfhQ6+Z9_Kpz+cm?1Rq%o*tV)Sw!4w15QvjJ2&)IM6 zGVDyO#Ry(;uP&`vx_gsL!{paLL!OPesg<*A452Ml=E2p=w9udC+7^w^=H}_X5E5G0 z7ULuv-hyaGVIAI|(4=O3H62RB>W0+G5fR7th4q-$LZW9mMnutriq7g?a0(SHP#>@= zh9zDX{UHC}(2$0RZ@gb{Rr>IKM+yC-Ko4OctH46xi8)7~g~3Uz$X=9rhHlyw{!WsL z%O*nAsA-3H?$BG4r%~ zEgk0J`$`K2h7D)?_<+uca%}9tZ=YdIdmvXsH#Tig_&7}8`pM0LEOF^t4-#TtB1p&1nQ12w z^~6PO^|`ydsjNsGa_Bd%H_;P*mx)<#eP1kl*g#VjmzIiG9BbQJqE03z-LfI4FwKt# zUQAJ4GwcccKU`UX$4zNOMUs4vt3%Y1A4u}Js*Y$TKhge}o@QzFT?Rd;!qpOl1GDAs zw;@Pq&lk$RHFZW*?SsgUyoJ6C;d-f(IsNxgQv7SAhaV!bKAA;Z7D_Ybf|<3=?y+0R z7VAvKOV-?E9ybe6+BzZpzh|nx zQEGUV&+%S!ee&Js0iURPczT+iRhu}9&bi57wIJ!4q|;UmtFQQ1c8yTQhR`#-13odqVij9?F+Qq_7`ym zro5T?Wh_UR_&i2dzP^~!&zC*E*$XY~;(t+dg6cMEr`_;)G&brQ84OG+t7P$qnHeZq zYIIY*cfX*kELIJi1>gXomN<-{%CI?fr#WnjYCt}YP@Z^bo$>5Di`cW;C9^3h`U3}e zor$YuHvVgEa`6r z1M5rM&21|N?^xvCG+VZdSN=5VtdneQ=pH^LbBhONu%*7PNyjv+)P*tX8xqC~y zKOvHF#n5OjSLV%EwradSyoZ37(lZ~(<5jG1w8EHbVQ<2wOyqoR(ji#W%05jJO$$AZ z9C!sG{95A6?-%NND)wG_ zKkCfuNmoh8&3(EzGo)yHHskl44WpRJ#-^`ulYDgT-K30T-kVQ1T|5pZT*0BA11xQX zPD$iku}y?u;mHtVV1O8#26yZg?n%OIg}#m33s$Isa>~yU>kL4KgBD;l=eIz#wPI}Q z8JIcsp-cItqZ#+BZw>B5BQ8^#4iqRuT^_<%Gv@p80N00RICL{nVM%Bz_dwa&qDHKt zmi`XeKR$f^d5oR7Rixz?ID9$Iaqzli@8Xh+9dn>j&49FSDQ3uAqF~9y^^8=p^73A- z8rX7TWRS6VWHj987gQ$?u0Fv-eG1+-kucFKPQi~0|fn5=WEh{$sy^ zY2EyfmVNR|i{zN&XocS&Po>ug)6vhw+MiP;kyYTM{NE9O^9J#0B=F&zMfvAjqbK}# zj}t#=fyvnAb%)%?l;Y_$PT4w6R}pUo;0E2-^--PXS0G?G{j|}?qbE7)MpTxqRKw0y z#Lf6KtIM@GO{E0u78xqp<2v&}w!D~|B7X9H_DspdzLqlZotM56fE!XA2N0rL^ zvBZj%M5GPGJ*M$nTNdRF3UQtKD5j`Sa9riY1j%tcR!kOZ^vncidyx}yy4IGFCmiwg_}tVyi=8v$B{(d_n|n$nnLa4oF-qjY~1-9LS|^O@BO1E#6IPZrEn zcf)#$JY-LuPOi&jaQjmcnHu@;(}FG0?TB~DVMQL7x*eP^e8mYzKilBW45iJ@VV4u7 zR%U1aIva6kp_5PQU$f3<5oKY63r(@N=o8F9_pa`O6xuta z@FUJ|f$ixBjwN(oS^sD@dD*=pEj%tbs<>>{cFb_2LbJlK!ws)zb_$!Ir<9Tx7M75* zBv1(XmyVL1*-kwCayXO58Acsc8+95|K{F#Fz{CVo@cL|8m6Q|Nx4OfYy2G28Pq*^_ zM_9?K0y;#I87`b`P`g=NTA}ezWfIMNQopom6%#hvUcSW5NPt}6h)3cyTYi#Wey<^F z6h&GRymx;eWoF4dhi&@3uWxi$?&rKoM~*4VbLW*bg*Ri*$Yqe)jpKdVkgmW!sW^UC)AXyyaU43+#dAQ-thl{TC(g+O6%$ce(DbgYC)AQ@OYJ3(yw z7brY|!`8D_+o)Kw$SlTTTSY{|)x)E?coBF^EDr&>whi5RYbEp6xC7`>aPHT!YH!k% zB4!WXjOTW~68#G!O0KN5D=q)ZF@*P)?u`;&k-+GvakTzAT%bUWrO4HCDO2IkvoFXl zA6-z>s-;A1bmTF58oq_6iwYVJvzEI6SWDzTSPR6p)r$t7zMJ^>b`6zjI}fY(P=_#_ zEPx%FiAYLYpL~C|ReRt6vAl5b95Y1Z>nL0$4Lc92rME~a{R7GdRW32EG$mn(dRh*5 zx%f#RD%V4Oqq=d>=A1P(j4$W`cc%(-JQHzy=dMV@+uxY0k%fd>p+Lg%s0>@KvFCZf~6VF z*k)vA+-xsU68F-KJ9}<_vb3bgWS(64f}Hi@1Kr~2x^?cH81x>r0S^!sBvbLxZ26g~ zW*V8f3&V`>$&@{D#B-ijmBz2R^>6k~jO>-#%h)2XVEY3szlziAZ!UZMomsaGg%&jXYA_WXX!LxCXTNhu1OejpQ6*xv_gkGl(8RB`F4}5r%7R z!^6WY#Wny0eJb9$Odlh`HX^g|#^cJPM(OoPEn3KD%eu&7o6%wofb9u*pJJsP)pm4< zcjhuw$0VjfK25rlOQYfAUkbIBmdmuSip@aBvqWT@7HH$}*_Ku6lq+yiM824c(@kn- zKh{T-O9VoG&qiu!R#4on7>mfB-V@i{Obfi|*;O0ljH(SmDPy$U;*ZfHUe^6;KsFtI z_%YiG85fnSp>5Vum;zjNXz_^BGXyLZAvpZYgT=pcq(AC>xZ^(J<3r@G72o@m*X@j| zzur4hR9A&u^?t;twZ@H-n?Py?h!9k44l20fZ#zf&B*lXE+3uGgk%=XX%S(So(|Lf> z927V;Zh);erA)qjxu`2D4_dpLUD62{Rq}0EjEiIlQ4KpilC@i<`zp9eUrg3RaT^YN zo|y*OWY~Yr&0ARMskc|^0l5@V_Tse@(AO}+%BpMmTv=nv9hqK!@!;^iHNg7dEGz{} zkhi4=ExRp0+;~lW??}O`tGu}6=0^qyOaxiUA1+6k1+yQ?K*ScFJSJB6x3m@H{76To zAnsiv^L`c^_xBV_*-xY1S2eIx6teFt@%@r^R2jk;8#8;AILPwVEwD_>%Dc=RY%}5i zwwbKaVP11>L$~W#rfWZ+!>Bq;!Fp?Q-UObw7 z?Fw!RRfrq%f;&uY3Ol4+r_cGV6dC+AL$T=>y1jodl;;4$cX5%ZR6=lX61?->t>tbv zBg~zePk~qZxTlH72OeLGyjM;r` z@SN>&CG!z~!sOOUPI^HspO9zsbOx%9`K27MkLyA|d&s;OPzh!25+o>xo*p&q(flu7 zVMhS@Hyo@YG<@4RK~s_`N;l_hmYzRB3PlnP`d04l*?PF&>in}4OU6w|1%YU3%1f^A zZ1Lo{Aa69}eBU}l#>(mC41`2AB1^zE9GC#SguC4B@|eD!GfcgIUp#(V=HOrA(;18G56{TK26%`Sw<*Y4rCMkOMiY%NHpPztEF~Mw_XNxJ4geY!4 ztzZvPq4}%*{yDE@$TL=NzsoSfT0un!FeZnzUYJtB6b+XDZ3qWtCqnWUC}ZUJ-DW^3 z5XmX8ZEg-bP@TfgmT4dJ;s%dB(=jttKOZ;JlDDwKLy$76B)}Ra zx)i#5makeUWnCVQ8yt0jcg+*NL0wUC0FHnJso(rW;3f0P!Qf1jGgwOM@Z_YnJ}D#6 zvGYiHp~{JU(uQKu3&uLJBf63CS}gzBMT`uYk34QCUd7uNtQJIMk8NFYKd8##-x_~X zVTFLB9AFLqJFI*tM3s*#;Dx+vqxGLXeUPHgD7L6=iBYmCJ=o`rpd6e|(LA-T6`iv% zX76yQ&DP`Kd~)qJ(lo&Y3QbmnM@We zIdX%VZe_+88Cu&0LHUFf%mSd;(zUJLXm;7XInwcvl}ze&dLMGB&785(>->3sb%u8bI% zn(jLxX)7nxYJDrgY>;GSXLkV74++DS7-`}B+lT3O=eMAJZh#v*C*aCK_-|RnQ0Pzi zk|g1#@e{^r!&I(7l8Rqqq3oZ&!@o%Ckj5LNyvEpIQ~5n}{5^fysr7^KBlu>38w8W3 z_gGynJ64a_f;;$&Z}jO{@M-U7C;3#$5$r+NltIhpiHH{5PD#eS1p=$xFMMd$|i zf2~d|ez@USJPU(hLjVKx7S>%gktOktBRH#WQ6-~-W`kVKccAX3+)asr(=Osbq{ zJaw|*&*zmDat_1q$x~inhZY(;{aJhg9?;p!i_6QV?(QI4TeWTpm@;VaOs!F1ggj)} zp9(%%R)m#Xmu4uC^_`=>)gPn3ylg}d32KNXNDB`$%RD?jG0os@DaMn=i~Pie6=K{O zVYX!5f(|f-Sb)_0`4F_@eO5|{5&-F$bQk+`njC#|4T5+uavw)&@wMp_!*RDNU)hL6 zlVIV$DtsO+^^i~_p_dnU696mjeOt6k9dRZ5KBW7Qw|ehb$Z2C6vjjY5gddSNM5FEz zvYn4k0>h`GZ$4T!z;VOGr#d9Qu$bj*H1EtwpyGHKu9MQ&jYQwLnTxS^{FOF|c<)k6 zRkrl|v+m-ef||DH^2WVmY7dAHac5Fo3>cYHQH>;jHo;)gP+W12htW{d0Dy zdIm8aECF!^h>=>6;m*5L4R{jrkja#*iE#f5Cv#$YQ9PA*J zmLZ+hd+1;!JM+de@l}IV7pOx0g{zUZjU?J?SqJ^d43syYNrm| zzh%$fjWm$EjhQ$(q0T5kutRK%RB&$rK_XKik2{Vl0U^UGA=p5x{a z1CA^U$S&BmUiYZ|frS6#ezx9B1f)!2BlkcsA=`EebW~OX8PB#d%yBuf(%P)^X@_&2 zhA${TF{ZW0&q^_i5@Pm#X{L@Q3kYf8vmrct*?xI9^qwjl7F0|M)=E=dJp5zTzUIN3 z%S(?b!Vra`V8>l4@lWug9A_BGA3=^4@d*AH>n5GuEAR}8wGdP)HUl5Lo{gaZue_=_ z9j-<65j1=LtRyb@M*=#c;b;?;o4|W@2QV-~>8;`9=+S%T*9VM$+uSyUW1eafzNaqL zIzXfT8v?qCfiKJgAeG7qB^-F?DE|NblSHPh%+B<_;9nY!-(NGs_C|IjVIGS?F0!4U z4N1$`ueyNSPV15|F~O2U_G~bZgFK1|u1hf3t#m0fYLvmVqPZ_IKie=RLiW2pp#=i+1 zqeN<(&k}dU$)>9l?syVb^tfBiS4M?^(#!CG$uvi=g$YYY??B%1pE_t ztW@%-z}+hR*m-&#{}h3^ae5Gz)q6Zp>-Avu*AjnfXcNo&k=M5=baR@!&h1!s8y%)( zS#z08%3kd}5@Kv$EfpTD>tc4}@|Kl{GJ2!%hh51G`kVq0(9Xq1DD@KnK17X>s9N2^ z?u@iSKV;8bsbJ|n_p6OX;z#=^3xhHvA%zCEg~~$jUZq4ZeUQ;ZNtJPf|5y*&^Y*zK zv1p~*EmTk0H;`bJ0LrKQ$M(E?MkTRUwL$`&Zc5*UoesbAIy89Jl?ZUVfFc@C`ntOgdt^AknkPZpa+n zORE5JYPLS^@l^pO^wuf*InTvb%qZhMbpWf)g0cp1&q)Nz5Z(n={^R7V{;>Ae)A?j3 zw|{kY9O*VQT%1r^w=r2zEw8TGogGKXK7%2|G?!oD8#!vI36#QgS1{)w7-OO8-Nt>h z!LFN!v;9k>g=^52G`LrNz))B(1u2(UUydkj>*MIeL_Jpc+H zw##_{IvLA<55|+F+^&-UEGBq+iEOCU@q7H#TvfBbCV1~iQF0AA~CcQ%hjOZJod*U?sx@+y%>4YJVRG)5ok#Su1h8t>8 zbhz1uE)m>JM3F9APg)h0-c!H)9Ax0)qKo?>Y&3HQ60&e_>}Z^*joY;5^07qp!DIcy zWoUn(62k13lIRxn<=hFx)!yqEpMAAL?}2i;nNcXnJ(7;RGbUDJ=8WCJd0}rm!5I9$ z+a+&J&UH|kJe~NI|D^WsBX#3%KY<(qUNb3iT$wg-KB(e@;JhIHhL2SxKg>%KnMsFjD`=&!1@jtD z6%M(W+un#nq&*Itiz=K4E>}N7!Qn6=8dP>?w@sRveZWM@v}cG9*{Zg=sSk*BKK+Ch zov+B#Uhq|KxNBk^iQ-sGyYXYvPmQ$YV4NHcSdtquG=}Ebf38X6!qz%t+@801;iRUe zRwaQh)KshlOgyV5+}Skv&wFNT*dvaGe^^xN%WA#3H<3w@dM5svVchL)s2mB_tx_?q zaFaycoF$YruS~GmCZCB#r`i~t>||ujtryv{K5#~9ta(VWX?r-Cw94sFsbXzP3GU8Phg-E z&4yLZmulOIJ&WoFA>4t1skRLYB>jMm1{?%$rb!0x$}vUN0fa36-}dXZssk>-HW}fJ z@a|pR0t$kcue!Fe;|s&@tP)N6t0(G}99Zg!^1mmM`Pz1n^ce9V zqGd4oxEU3Q?wX~)@bwj{UseQVEpQeoXC==-%H^7}?^;#wI-@MoXAhL^m%(Byegwv4 zJw1K#1#FZMkrayp8`3;LhxKn?z6t&i?jT^Dp;Dx8;Tf2#>c0(xDx>xa%a}yk7ae@_ zJ@rq2!TsFPjhvy4;^d)cSlBpllNC#H6_FngtM-PHUi@!)$$=F%64*|-uc{E8|GHmd zVf!}7JU11=$wwEjuSar-6bsjMtZ7YPxNVk*qpZ?Q2?#f>7kl*s;IGoua|*HGthQb( zShD}4Rh||eS-j`gY6M6lphNghkz*jPrNxkl_g@7gFY8DJ)@ui_X#TXk5gst(Cex?{ zvNcR;*zTn-Qz;r!MmhYIV7TKbPQ4%?uJAF#dnlrw!tiPQKHBJiM$@k(h7r2>AFyDQ zHR%yP2Po)_hckIZY;5A;;Zbc{eawy)U}M0264Q^oe?gpLnqN*DZ{$a^T&uUn-zO`2 z`{bYSpcAh{xGACLsKd@Ht~vp>p2nCIkbtm(yA?zzWLWZ!Y6siez>p7rLfVUy`q{}t zS48tc+!;8NZ(kP$cCMAIYk|cjwTIB$_>b|sxHrU+{)tQf@Fq9ZMRumTogaE>y%$r! z#Hr+D{&&#SAfxbW$Bprm)717hTM@F$E$y(UFx;(PZ8|=l8AxQor?E;q%{Gi;3$uy3 z!U0%}sA8hY&&F6AJ>VpOL;Bs{f?xj(+C5n^bM&5sxIsS}=te8%-fwI&-!Bp7e`>ZY zNksdY|9ZD2StbL`lB5Ma*c-)Gyg}c>+nZ>lHVr5^j*iuwcp=!)j!qFi4Idpczb6ZR z6wTMK;CiLHdnv@9B1=YpcxWH;l&E^#OIV7}t;(o1w0Q69*RRgYm8xdk*^umO!!|#1 zBR&@g$jjhj*r-=yDorcF&X>FBH30|u%!iMY-{B^OrzqaxqRa$Av()rXvAj@bk#ISEny7+^ptxo0 z{QJ6d^s3|1spMm7{2t(>6k9|LwSSQna}YPnVPfT=@ACde~7#fIF8BX%G$gMGbjDRlWrxa^UU7yNTWha z^yK^{Z1gPm%EE6;r!DG1CBn0FhrDg4{p9z`$&IUUb$9!O*NdiKenM9w8;YOcf2*Ys z5QXcWrbm$`!|x$mTUr5+3jrUm>8txXZ_;PWl^JI6oC(48gDHn7;r^ch^JOvi(r1<^ zWvf9xnJr#Nx5(G$(gK_9A(-1eCvS~gBa%}QDh?g4GKq&P>94$?q>xM{Yxc@Kv@oCc zace-rQfzn=X-fA&l-HT)@bTspl6~5ht2RH|B}-@^^=Y_5!Ajmr6dEJSc78Z?P2!<8(| zM6A+N;o?N|(X()iMW!CbjEi5j^a@f;dZXOEJ3iTjR99-BMiMl5dj|6cLyv+Rq+oQJ zf%EkAC$q_RnOTe053$p0v+TzA7VpMcjW4y79$r!2{Jpy#wW9pJ5V-O3W)5*n>1?06 z?5L=*SO0V5Yo#L)kZQvbm*d2gH-o;-ep_7QSsjtpx5L#NKQAioJ3B9j)?# z)=ZJE)CWBNZOD0^eZhS9q!MYYpeZ333bCJJ^++s0*?8!pB+994MC1rnZz>DjoW$RIR)&2OOklh^N6?FDf2*2J(5aUG-ud-#xh$;?2KR6 z+7#j-?iK5cke>)V#YwEU0DE0NF(rrbnI!j#1oXfqIY3Q8Z) zEF7=D=E(}k7aQKi?zd83KTqH@X@1(QL{f~!Arw~>;jiI#aofYm^bi*0oBNOKxb5tf z-#}9!Ws1XD`b0niIAoyUP6+*PV;mkjZuMwuB^MPD9k-krcN~Us?o@P~9=P5juJ}45 zhbua9d~HJZ#))zoIsmP|?tg;7qb^VX9Xl|h^v)0?H z&DO~qP3_^v*l9?D=w_{^t~F1kW*}R<2)9f6iDWI##T z-+zJZUI{p_6D}JVC|Q}68)!_tImp~0eOx$5Vt?|-a#t_);*{?dSVmY4U^m_ot-jbUR`qnf4#g;wtd=h~IZ zd8$9Fr5$#k%ZIh|lkZ0d#v`J4vF`>P>YEQXZ3F{b;)`GZ_r<|+^y9xTUc%ZnddG-Z zXN`Chi90$*tyk?*5TLIzgwiA7{Ut(EA1l`fclpdSl!;fIs5z#-Mv&6}X7n=^25r;_ zp(O|U>P~CL{1yFfoTryp9$-Ka&+1j`=OL>OHWOmwWXJ16Ulz(#VjvKnC|EImO2{z7 z`Snj! zkZ+(1y-clo;Z@wN5+hGaiuN})Oe3u&03I&X{ChCT5v!BOr~g`+4PRc8oN>2pAdVNg zrOMIy55NUz(CXuhN|{W{x*yZ0q}c(SIF5#5+D|n*n&6xI^)|aj5IKuPJ(*N{O2&~p zEg45VnF@#lv-)!LW%@`RO>?o|3maJ7=ptKM=G)VY=-Gi_^ck#0Rq%{WeRs3awr=rm ztW0C)QQ;ghYDMuoaZY3QwIYdeY_{l~(XpZaHe=w~1vK{z!}h8@2J`1<@j8DcL}I0KAq zMnbJ(VaFGRhixQZy$tzjwK{zajiy%7nrZ=zKZO>LDU%pREQYp8@J0d#aWjhYDU{p9 z55w2~Icp468GSuSV#x(>#rl}QUMx56^C6e%ff216*^(@MDvD?IOp{lY=AqiCbJ*(_ z(5gk-HVhA+-tH74E)G&}CS_L#>^d$D^xlbH=oBL|MgAg{bKYr>UJ6`(JfN%b1;kr1)%P|TFNDk}9^!Pa>H zNC#JxAg4LP?6D&O5m38};1RtuD=i6e`eIsttPANFULvL07d zB5?e6R{)K6I%*{n;RGVsHfo~dYwKK(z`PV6a4yL-;e{^a`lipFzeD@+ue+m8N^ZGV`uZu@m<_rVDJBs`L~pCCJamYXNt*#8eAvo zj-=}K4toUb%$D>HVlVP(mm|*Bm%vzH3eOuh4L2#vhM>U)e>D#!PXyVH)=^s5pXR&p3{mxQoF;f^!qR!6SQ#^t^e`9fKFLhLk_Rf z$BUr{*z0uNu7;XgX8aTdOe`rjJeex6H_r#E{(FC#3yNzIf?cC;hcC^w5|HX)7pYLx zo&M7sh=+X-d^m8-O_O2b=0Ed-3nN)wqviK$+O11c&!V;@j-_j23c zoLCj9Z>41B_AmG!H328eT9Y=)aiDaC<<3zF<$4D`G@{IcxlFy1i=@f+3dB zLoN-?+jfpv?L@^?N(+An>!{%;Q=Nj#TKFNyiks}>yU!NBogL%!nV1LZ2FP2ddH-?ayVS>cc+p)_r6sc6 z;WQ<7WC%$Q_uk>rx~3u701{#FhkkQmY1ni51PB>6=;+oXao!$%<HZ%yuv3GG{JSnizP8}zrUmg;HJ3Uv z7j}hz_d|t<=ChZ(7ea1ALZM2Q+YH7rgs?%9qr=L)) zEoQYgy`b-v-$m-?ssq?+_4KKzF}^n=h?{7?>%fkj6Yq{c%)ZMiQrSsNf zS~O&tL_8X#i8ANYQ2C}c>Np9k5#Uf|nPXY-tWvL-t6|S9n#Y(LXGp~9cqi6TO5x2H z80b!?i#bZS%W<)0|M?*IW_CzaWqM&5>ek%pYGs;;pXY&_H4)b(qNi7{RApul+yP(t zgb&d*0k_uI`~C#mU`Gkg_1#UB^ZV73n_%nxboGN!&f~ciLHp*i*Huq$US)Y{xsMX! zKZ%av|!3#Hx8x12W7Bq;N|$d=NqV(k=B~hBo9?c zy0&-lw0V=djjHZXDj)PPb!Fy%h`jqTx5+9dVwVy@wSP>kQ9W$poh;KnbTL-pRV7=b zZsu;0O?A4ov(@VcI{?$P|K7fbwT-Sv3nNwDhn zI^`&j1*2-i#F1ahRIGj8oSzK$nx{=6Y}G^zpK-BKv3GGedc}D9w(D+!Zp(~ zxng=^FNJ~f%!Ec&$Nk}U3>-@__CMm5{1*A=@Flhip23M5!Y`~zWH{0qQL}MrSMy$q9$9Ym38j1>Ij-xBl0CUsH|#0& zUQ=AWnc@5JSe5BLaVP2veluXV0l!&u<+~vCpn zTojYHgGAVz7K7nbtVpNHj$SVdS(31tgI!wb8M0<YN3|+dm!VUZ^f%fT(?_-~hSrOKh=wB#f$AkJ;lCCw>dLlWQwmV>tr{L9ShAL8+aG z7Kd&vzx)>7Y9jts6WkFHDl=xp-GE+bQp)C*31!6kg%U>q>D4dt&%Jc6J_9p&@6TZS z6M@?Rsuo62I^0xGGSyZp0v|M<)+b^hSP1m)uk9RItknzv-8X$&Q*+0UN?n?UFm z-ZSc)9j-Hf{Y1R^z&r2yq20;b*(Jh*L`r&n(V@9m9G^D@QdKS!|k8zs-|P!nx^sW_)iVn|U168a5v)>~q$>jAW9M(U(P57F(aO zP-{Sh>I|_t5C%FKJ!8Fmm=kUo z-dHSgvTf{9rJeoBNubIt-)nYF<*l8-N726}IRl-Gzc#Q8+%iQXxJ5bW?AI$8h2`tpIdy|=1r6o*+JDk{B|{+p{}zaNi&FPkst2&ov^ub zyIS#?n-S_aaBY(+va&uCx8=ENV`(`CCp^%{0cm(^dzOqg2{t(B(~9Mb^rguJi$mIV zt~~g!=J}?)F8Fw&p0>2V03LpyO68K)5qrTtpk~Cmryr+mN8iGYRqr@AMlGt7JQ%kE zKPgNrd4_S~>EzKdPx`o;7SRL%cH_(D_s=7c6Ld{T1Oa6{W}`D{xJl~oIGXU36m!^3 zYZLWM6nkaRsVIromq?P^LIR+)mD}Byjm(K%{I!TMTuT3m4oxAZiQ$Gl;yuDva61|BQ-Cnz&MU0&V zMX&wEzP`Kj8}Rf)b)U$rtLVPLwW%dg5noH(F=Q)a{}u2 zTrIj`%Qv?B2K?@n&!Df_u~rIUPTXo*9v*x!LLx2L zljNf#c3{iMo6ihQX6d)S7D(^%`-`+6I3*UiSAn+whQlZz)Y3K5r!ve!1+sc8GcR&| zJc0grs34WW-qK#L0Myl1wB33DFV`*ZyS#J<<_O@=t(&5Wk??si8qX0KNuRMAIg_TQ z3QaqyV9H}d%VLAhWB<$l9HGo2dDE}2pZ}WUUerv9J2Mbw{KYvLp>o8q9#nRWOF*Lf z;z1f;<6rr?>|3Q3sk!Mnt;%^I6a+m@aR=NKFVvuae?hCvlR{B<*A9-(j;}frt8c4L zHf0eP2;?s0uFdw7=RkIZ^F$PD3LBaH`_`e&s!)oKH(yt7IsT{$s^sR9k=Q<8kUzg6i?F|CqC|+IwMkm>Ay;Z9w-(Y6cYE$CEBODJjj4SJWWZ4E>dg(3m}Yh zwg73<>fiWJg<@PCeOd1-=ji>DU=n#|{s;_92M(PPczr+*nghY|{!2jlevcgyvW3%e zFxej3Q&p;NVehL{OyJZ0A39vhTc-K;sc0pDX5cd`MGH$-{AAl@&Y&$Paj4$yg8*ul z@RBQYnrgN>zjRV*0_OOsuIpFUP5u#DPG;symuD=H zDLMKi+NIgGgJu7=y8Cn(BgJ&ex*n#sw6qKqC$yndQ4)YrSb>zzWyCPj%Jd+GTW+2Q zF0`(W---TBZQF`p>&8KhPW;uX_7XT*%qoIDJNI}U)YNfNNfQ18=V4QIyN4n@nK3l= zTa)aG2IcQeNI0vk;APY)G&uqchbvY`U~R?$kaG>y#om-=_%w`5$A$NWDANs!qK10b$S|%pvtsy z?>UV9KJU2!Ua5ge3k35IEXK)JYBSnH_f{^Hx|?tQxEf&u4?j?L-?y)c&A9D55AujS zaQ%w!ptPt;4y;mqGF0gaUvc&%{X-p zs_o!b^QR*=x!SkplcG_yAY{AB02Jee7f_5GX#rCp5Sszl8-HV_Ov%f_FONp4fZPlS zIIDEpekpQ}F5S*{lmSOE1>3qYo7(Ou1 zmSJf+|9$7}k}UZ-`wffhphR?$tV;;y$ffj#f`}}pq5Uq3Gd?%P#S}DF+bohQYH@ib ze@5oa#S%~Ni2}v6 z+>l99B}dY8V|5JiD9r^w%8em7!eo*WkL#&;!73fl-Dv_GI?rY=C*}Ywm55)6F4>#- zz-!CZnU>_OlUqFAj(wq0!|&1abMgPyQ#-N_By;%!Y!jo({`CYtqKQ6lJ8-X-MEens zn0NXo8jeiSBC-w|!*Q#9&ydqv#$&4vdk7DW3hpk~wkwQphs|ySDRvRkBmYgM73q4C z%ooOFT@UNST5-7s7-qB;Zc8ovcdeTk3}q3YTxhvbqg-&zO`?Cz=PGyVGUYxp#bq$< zH75#`Fn5_OmZ+B%{q!XRdi`>EZGD>($#Wq2?1mKTIk}#(H`O*ZfqHR?PigJ#{y&c_ zEN8ef4Rq481t+$f{3*L3qKrXEvrL8HZ2?1EqrUJI5Z%NV`(-~9xV122B=nyq2N(UQ zh+ep<+l%|Zx@jhJVbW>q`hPvl`6qQX&cXWaDwR_}P_y2WEb(d>2m2*E^Ys18$w4vJ zR$0YEYISU*FS(fVlgUc3=M+4D>cv{__2e0iyg2=p3H3{R-D-zqs9#$R`#t?vI4v6a zU-O7F+c)-zqOJcdh5=To!0pdr9PsH~;LPjmY&)Zlo7@MwreEGKtIxkLX0J|`(}jw`G=q;u z&P5&_1AbS$0}#jr?L(*a4FYW>@NLt-k#Bf?_!qxvpgqoUjp`kh$ZNk7e98zF=laHO zg@t3kIz$B<)N0%-aFyD-cI^7*9}PXQ;lGUvOK#|LHL7wl8fdiNZvY7dJn2}k;`*;U zRLR27@EdunogeR?*JG0#Elj@2ZqSMaZhUpS^q)M_CM`peJm>H31Z|zJwPqPjMsyN3 zT{~zetbgfSUWSMcL-91BiBh44EpCy(k!YF@Zjo53b7!m&pMs%pYejSR1dPGro$(F^ z=a)jWnb=kDTIukV^>EonY)zqU7>*r+1cadv$(CGQg^%Ms$((m@9i5IQ0*Kmx}O-b4AY>HdGuINhu20#?VB9 zdo!1XoGQtMq~auR1{q}$mR%K@$70T*!-VxeL=tV~mT|Bud{y2SPeBVyz9bdjbiMd# zp{=d0XUn;HGZp!!L}UfLv!16B35Hbk*uLQwwjR z8SYnDsMh5li)~7yB#N}fVVWx00yyjbVcni+?IRvuOIWaQpU6W2BMdCc;PBIbbuk>= z)!({;rhn)Q2+A?wV6v+*ht{fl#aOUDXKEu6r98(ec$Hx}NqG*?ivPxZFGbA_p}^|_ zuOH34fp;%G1up7qpP+>s88%4=65}(Vx1>}(sc8Dub1Z}iI%ZrQ%kA7f_@KHnI(|uF zpfhp?6tXEjyZQ0RzrW_v9v(rOA4#q*DgMM+`4KsjCGU2&wHVi;k^dj&-ZH4l@PGGJ zK?&*ZF6r)0X=&;1?q-Q}OShDSpdcV!(j^TdjWiOAZr0kjzrFYW?DOKx>^ZY%&UwR2 zn0a`f`~JpteXbe!-YHxL96l46J#m^43}eL+{0#AWPdBy!Cl z#sX4@t>Vi_(e8p7EaI&Vw3+#UVyvtP?3^dP6V}sf%y;i}bSYuHN@sn}_ff{u8d>7! z{zm?HnP$Zna$F@-(E$wuW`Z<{7Di1yPQvD#f3YK}|Lwm45+Lle#CEa*g+=fqqCv66 z61xW8OezL+CvfPDmqnj9ME|#9Edpjq0~#5Mdfjwq^ZTJ~19_YM4o#mY!x09*9<1tD zLR&`PACCm}lhwrDv`o%_5q}tZ==h$Y4EPVlm~Cf4FvMc_~{&{;)DIF`pS1= zHQU)Q7OohQvecs-etd24M@GThMEK9k<7g>o{58X8GyQ-*#y~4;8+WPzk3W|G${dY&~IqI@;qqM7+{Y+xro|VRo)V+u^3LN@~y3gicS7#lV?4`lvcDF^0 z)=P!N_)~fpGA*j>gc%0o&>)}3TqH85}}8QA<+V0aY8Av%jkJzR|I{4t_P0*%dnwVfeIrXNS*ei3)r2z-M8xb=;4;?>p-+ zUH-SmD^H5dmM}K=!($KJ55B6)NEOW=Vch`f!8D*;6>cZv5PUCJ+2wexm8CGEW)OR^ zN^O?E#%>;P+HzrX+`)(7>88X`Fx2YgLKJgd^wJC8p z=$xXJ}Ab=6zgi{0k^+eT_{}c-#lDtwtQZM z@0%8Tz%ne&t+>+s@;4cx`3oX{22Zkjsvq2{Z^~w#v0M2b^jgsFLMhHn%1U=)srnAt)hIyTe~1%i)i&shTr4Lps~#f7)}Je(p$SZcM3YXmTp8! zqkFiOF?_Hb-Py0=tH$(EidsAXC)2hm47-zuc!$nEyX>?PxpSHSW|OM$Y+^OK%R6SJ z%MbT2nU`N|BJ&yb z%<~s12(WFAVe<4qzOLGv1@Xd|=;gSoAU`cCj?ht+ymW03Y2?r2rN3}+A${ppnQml+ z5?N2*D^NV5aIcQr0w0Ig=)Oc_3(>-@N3M)^BN-&EK zgp))ch+jN{Wm++E#IThL8NE?kNVb|U<`}2l?2?~JIugZ=9oMBNO1ia)n&R7vCHgAe z>W_rJ{Xu7#GtezzrC+H+8J^It_p-$8O21iHnHKa5iZ{Zl2sJDc`}>uC?d- z;79qY4D}Z$^;qwdAP+J?y}SdbWrN3={eD@7B4nHLp^9lC%G!3fpUhNKUFpS+2hym4 zZQ0eUm(bUvhfeLcpRARgKRer7L}<%3cE6#M$5Ua@`a4IExL>!nP-^08K|*k85C$t$ zhD`SIIysG&&Meq+lb0MUF8^{hTOuf*02E|gtY=yRF)7h@qMtNB*TEVEEQ0sMAl9_e zG>CU41^s*1#5n{riUswy>{x?9dtBo&I@W}>_ab#T9JJyqz7hzdymq`K7x(1+P1S`} z!k6-?f@ng)cW9A++>ZXrWn|7z^5(ZeTQhyTpfeHLnjRV%TGx>~0mQ`FK3V1L`ebod z0V%K9q5h*$c7*BoXvRYJ^{N4%(QDsj7ds4J(3^|3UEdbMuZ|gDJf__sAh8D?u+IJK zO!56VfxM-V=^R_vx{m0TDdauR8cZgdPStLy^IrM(6n^9Ru-CY`a}1 zLE?BI2L)L7TJjQCOL@0765|p96NdgpsDz~WAscgRqjZTao0hKI)f|B+12t=EqJpp$v!8t45-CpEC1TH z#tL_pJCH0sNXX5c-2=Vpj`i$p@9Q}rQdXURGbvL$`4GN3Ohi` z_%-fLHn`bK*(On*Ush>X$44fBCvI9~zav~wjq5{3_L?$c%VS4UbWq+g=6xo5 z*ej5T_JyfcKa4{PZ!dNyCU#!YX~=GVB=k6)hv6p#nq-ZGsa4y(|HFX#11@a)x;;Zc zqPcfZ3tHkavtnn$W}HvYC53YyLqdE0~EvVWS)O^mi$*e zJ3-p$HQC4OWsXhdkC&pyZP1oH2?#J7t@cIax^%l61Hsnne{UiC`{0BUr%!<^V?Hja zi|N^);;q%U^fL;p^|SR#!t6A`$)#M@4kjVLZKoOovqs9uit#@ z)g7xlOYV;wz2?V@5Gn8>Ox+LvQ=#6Vsqi11Eyxu>347JpF#`TBwIYqvsErL05Gn$m z?R`G^zet1ZLPrwdvYL11?(m8EO9_8^wXFbOT%V}EV-$~O$9Z9TfAmuuXxuOokBSbM zF(uBZcE?R5=g|SFpPP6FdiB;szuQO5X^>v&88Cf-@&dpJSpNsI_Vi4qMZR?FbJzA~ z2|MwTv2!MRTzI$pc*2`FqKP!2eVDnulU2o#NmSHVPT9|@?iG^8%M}y40tJ|Nrf0f- z-8sD??8lo5C=Q~V%f1gh6!(_}>syX6%nK#4erGcGV{eIp?KPN?!9)OYy5UEu$pz`I zUHYK8s?JE;kV}EHeFX}$%>x)a4eHSM`Ta`;P~N@2?uZB+H(fXEyuSx4QwD~a_plt7 zcUXfL@Mn|oxL9~nGjLZwwO;VYANKZ34)Vke64(95$lWGLKU?3f-Aa9eBzPc6^V7ng zjiXhWd^C2O|4*2X?W4wyiA=T#>pSTEyC3fDUST5071|DTC_s5_wR0aH^3LASXl=Q# zj*WG+`yU}Uw2Tzc!hAXaBDbOgiw;-Ry8bOe^INntE2^3B)@U}-lA;ZnUm!R;J*(vtf&-M z4+Lup4&KME-#73g-}Z!d!6UxTx27hUZvnWFlgRn=58iq%XWDoXbSL`$!vZwnX7}o=lA@%R4fEdw#&Mm+ z2hQdnj61g;ghik*nbn)>r}vrFn+eaqe58+|DgKH{b$1^$D(1_Ttp?=hcqMQ`dbq8Y zk1Wu;L8Q+U4)L5eKEUvHa6GhRu${#$-+e)fqa8n19vTlWis-Y$QJ@mzXrN|6j^!m* zGG`xlWJ(E+Z8wZ~0am_TUbtA`Wu}UyRp|xP#mHV@?JssDiFr+g9yy!q45GbGjcj0O z#>zY*_ptam_*wniKoNDK-~N9y8O<0pQV_2}VvJE>#ObJsT-SVw#9{6C@9~x*+U)@8 z>-qSXKIe#EBkxVsFEC$Gvqds)n*Jb{6C3(|cdkO0MTkJlQ~GoNd!uQR!Y9j8N8ePA zXpU6XEK1{d`{QTowoB4*oD$31b*NE#&TjMJP{7{(Npo&B4cSrOziwN8RIOQ$ zpZhZdzgzP-ChaQla%EsAcYF)kUXyMxx+{QDT^k98;X6~WUN5x=?)rasz329Wci9}> z))agEaWM%V#hDPBqa#3t+`Ntwc<7m!UVv+juX&AfJr+oV`S;d;+!V{&)bzYYPFl%> z)CE@b^`A2^36+AyK5^TB)3jAKkkYl8a>*;Tc~z7D@{N|L-lyHPR_zKQX=K(>*=X%J zE!6}U-vS>`VhBI&MeyGQz#A9eHL%rqlda0wr}*A^0myy-Oa$?(ZC_Nw# zFFIDfs-Xv{**OnuXAR7KT}kJw{x59r<1s->!T32Oo%NXbE&gzyX_m0k$jWu)~X8r}@qijPV>iqvdnuU&=( z{Z;K!!x^8fa?Zouog%};R=5ewMKmOAndiBQek~Xbt%~6glf1Nq7JI@)h^rVFT|!v8)uB!&Y58%+dncOjgR4C?<8o(}ohn!xi&{Q9_DR_A7TsvzbH;;C8 z?W@6?9&5PWclVh$B^YPZ9~hi7#?(ioipr2RY~DX4;BcKQSy9s}@ugQ7EVE>{csQz< z0|kvKoidvh^cgq45*J+4yra3X@Ke4x@x|K0LXT(u1(iqr7^B3ENn__Ny{K);!0Kq% z^Re$S@?vH46!eG3#X0=3m1o!_@U1?UL^DTXU#BKKy9)9NUFt@nuXfxLLjHW*-EV$+M zt$01%X*kz4i&9eRm%~-5sb7)R!JComy1G)LcQi;Em7zZc`0LjzO093Z?T5yw&SgKe zx_qi7O~o2)1Q_A?NZKq)BaEJCx~Hlg+e8Bl4|g4Q_-{Dg6PKfxQ; zeqT1v18fQ)%<`qcni`%QVCLnF5sWIc93DCU z`A5J(SDnjJQTS=2MONPPd1g0Dt<0-!#iG@7G4A;r!VUHU1-YHvIw6@CnKY>;(--HO zQT7MLtW3)OJf+-q#u7EkLmle1`iE7@S4};~*PkXKEgkXZf8UlVwsrJ*z?ofvVs?JH zQ=W*Ct{ZLc`|0?K)a8|}X5eCdwh1Kdy7P}-mgqI#!$UzwSX&N$=WY*4NfqY#iC~Wi zL~qzCXU0V1HR3~6mml(IKW5I3jb?1E+%vACYqH+Fjwp#h1Gya{C*beC~cO^Ah zoU-71l!?pRPDb@`8vOB$d3t;cb1`=AGN%6lEtaxjb(Y_{#+NTK|0}ht4M^52E6%*C z{f%r-RC;L=5%7|MlImoc864bKNc-8OOOmAMAFW_)}9iC6(OZrWlrbnj2M>qFAuPV!x46NE>&+n5ww^WQ^ugJoT;& zdHabVk8d!&sge~wOUp2HxDfuo(3C&6b&j|`PORCAUfx#kE;-^6xnu5$f1gppF`szU{5+Lt!4sDW%acSl(5A7I|M|nJYYT+XcgioG7>o zmB9(4VWzVWkUnrRLYbIfy2j4724F$zoN3^!yZAPGDgA=l+;k(txywZeGdi(|wKs`Q zk>jT0NAx&zX%??vZmRX}|Lm0#N|ed#3)euFHU~wRU`&>3Iq=*kYn6|02vV5i;UGS( zb^-R>NLwIi1=yw#>36EEx%=m)kvFk5mO`=3K1VoU9pDofk)Dow5kOwX5%ip;EaEY- zNsKx{Gx#L+%c{FT!4w+WO5vPQ@&7xb@ykZ`EeVVc?x{4#a3oP`E2`HlPc$ZZQ~M&) zSzqQ=r5TLy4l{7teV50ULeA%JGGG)nV$Rs&b)&1l2MtyWAD8tk zW|xBg4tAwZ&A9%#H@S2OIbF2;Qp3hYg5JCU5J@xsG#-(zPF^ z58DMNK!{8@rwvLHf!A9lmuv$Cb^4JK~ZMkGLNZhIgWJv1|xn_x@pOd{E2{O<3 zp}kikM8O-~No!B4)Au`NjhR)`7y5wC826aY!d^V|6fH`|;48hCv8^a^@#lZ;=h792 z+Pc<(V;I5c5#PWjS8EZD9JL0X#S#SoTXsB(r34lzU(!N5sNY0XdtS1b$bdsckcYCD zQ^=qDl5A;p6@Y262T{s)PxsFSJgeu6PN%Me$Hkso@_q{3#;HLqg^(Rfk=$ZPn!k@0v$D!Jv4+{&-b@c6ID3(*DAj!yN zjOgjx&HNg8=f0hH2Y!zsKTniRhFu>Xd4jH?5Hh)^b6$R1nK0LJ2(-)MAQcjRpc@@2 z&NH!@3A;E#3nahOkafIA1z4utR#xNfwGJo^M+ekp^=u*OR8zd^UopsZ1OPPKL-(ExO6p!ASi69sC*vm-w6&G_< zh3Yr$rU+SHfzP2$#E_M(X1$diNXW9)Dww^GZ?{ZO5|avK3NHPf9f#oehOY7j=t7T+ zkZ_I9=Uwm%OpSu7jl8xnae_5ii9|m+TP`kolIz_nJaxO~p<2f8bbT%xF{m%;ZE(M% z|A|0ItS<}(vBenx7ejC!e777f1Rt#Gigajj2MbMH&==jpnMNV`En;GrGjANWo)`|X ztdhAcEEICa)-CSl7!A-Aw>PF^N@i5YTXK_1ytMgns2%lb+uAd~CU*vom#uV$Mc}iw zDJY3ds#Omxd=kS8^}FAkGvzH~^7EY+j~GU)s%~Its`DtclydmZiBZMKqAN5)-XB*5 z;N*F}Fs{p_P7dhOUbgATFR=;h9c{N%#87!M6fgx}SXr_WCI&vpVnNU=%}}CAG6^Qo zSBD&2e}ff-kXYU?qVshZ>e}w;yfrWx;8iWFf0b)E55@#wiIJ1Q&}*IvfUBF$z?MOS z_>Z7*y600Do)wXoN_%MQ(EOH4C-fTci9Uae(ams>XI5(g3N<%5R|%W76yU(J=h;Vk zdMQ5sBp3EDn1CCuFaDgp`ZOt_27(7>7SLwuYQcah$^Xwwlb@yYa1q$hsid$n5=+A>f*Gp646OaK6O&i1C6T+4$ad>J^Djv(Y!&FaBo_fz6LUG zXqIXPTg^E-=;u1OwBua;e~pR41y+B+FEL?H*L?1UbTj8c9SWw1gna)|L9T>sY$bhe z#Y596KoTBM7b+9%ZlO$uNtB>h8YQCAC1~U zbSm%L&v@(nY^I1@syp$?FQoD%2x-v6MQT`%;)a&6XsBcAeJx~ZnlH0CsMMqZgxddZ z<$9wP-{-1va+Y_a%{<4G4T5AW@YYz>Gwkv{7;u0E_sofeW#q8(1z%41V}n^K{mpbH zSiBg0pW`d$q>90<1hy~dO(Y&bc=ER<*U=%u2&njnq>!OQNeDoY(^)VwD4kwXIPk`h zq^~6}zW+FSu|Hv9%h~5{1W=&5Uo}qKTdZY@Ok6d-YR9Ay4PJ4wr81o@EHC$QdL6@O zd$-M+HBT(XUb@yJM{GU%FT;;a*iqyBuiYw&jdkth%vz%$BmXYkX3g)g}h zwY746*@J@+vS~WgdfhL8MG$3LqHtX9F*?)2pLK>*uwX-g7zE0Rj}UmE>rQ6_KJ(mP zu15(>Py%nm$B>}AOrvm7JOlHxHy(sq{coGgsid)9_z<(-^=v>uG% zPh%hKiT>@o(px{%UwWPslAkB)NP~)k%7O#9_a%s~CehI6tEQpXUxx6@-WdLX zBGg||CMSAaVkaC8x(Pos#~%tl45H^taP^RF2{=(r;M7Y{a`+ejn}SS~-&X+Yq)2;C zWO6n<-CH-g3QLoZMqn)iiKAP4l_-6z%VW1s8tMGHw0rv}m0V`Q+UN$W%^$b42(Fj= zwtq=PpxP9~(&qmMP~8brcG31EzZ0X(b5tI=HvdG+*Q*je50{Frv* zd5ADHmmcpFFESzMy))OiMqSdS2DWxfd%ml24eswVC^>V-vQ!v&bI<{gqIT9{0`t<~ zcVn*|?+;EuF9Q@f#Ey_8CZ!62MbEfU%{n~tZ_CR6h3htd6+FMG-$5Xk2jJje&x*gK zOm%#V#LuWjxEznLe|7kpprYwX-^R!OHN3}y%P$<;`|4du@Y7#wyLIMoI&NN-%~N*U zu_lL8-%~zl9UqFOMShQ^tyZNK&PnJ9$ruc|H1)W0edMe>+G#-`1R#nq_4cTNRqICh z7W%A9M<&1!WwOHe;ASTUFs_1DC_XFrho2`mJs^=J08u$Savz?y{U2{&I}dRWs;8qO z0@H)f&N?=hyt#QV;j77MZ4!GKeWdLte7Dp}pDp*r6gQbvvxaCB2`8-3YrpO89x?S_ zcbX|#tMO9P&xP-MjTA~q^6&y?PJ^zxKo@$ z14{Ze9V6tw_PhPI^!Lwp_&RJSXvRxYbnqh5eCFVIQ;p4HoFEFCX04sm2G_R@>hLFM+){1aCCs~ZM_u~JP5w1S`h6D9H zFcCAmK{gwf6j;D5$rC;@wMD-(ZZh$fw|8U>%u_F`x+vBPP93{$m3h1F2Q|nsQ^Mys z0?`X@O6JcWCz{FUFR@U-)mt-feK5=2b$thsIpAAMS`}PAGSSd^h>{pTXE$2k_bu2p zhTb8V-1tI1z;Co_HccPbliao!@k6!+AUR`0yZ#}5V1SGDSm5x_O$#q7LfYbGjC(ok z^j%};Z{-jsU44X=k6Dq^z9R>EINFbw@fq+e$`G;HSCVNB67IiW7Mn$?gk`A>e5rPM z^R?OO=y2NN(+=~ZG?k9DNeClaig~F%MWJqU+*3cYEvYKi zrx_;D>y8$XGXFJB_gBVi^;^5&G8mE$WgrrE&a1>+?(fD~W53jf8Uc!PYHpxPU} z^aZ={N&p4>Wb#jUHwH2UD=VCwjb+BT1z7r*(|^P;DGEuMUm48e5RMT?Xuitl8C}hD z^zq2^6LN$GK8`(nP6gpqj`TN%{72LZpP{m8kid)W0ZijIcQkwIe!EG#0{ z9)F9p+}A_b(@jqs=CQ%d2LKWR*xZ=^OuueGIR@W!b}X9(egU9AC3{+_|`SAgD`WX)MYLr&TGdfH$#2po0h=hca`(4 z=is!dbE2Y7#KFQs1XcyjO9xrSA6B9uXnKRLkDHYwfdL2S8NGn~zd_KWnF z+_Mq~!!=r`$Q7tT6OxRK)=P&<%Q^~>wm?@U(zXP|b09k4TvWb9>X?AyhPqOiP?j0( zPRypB7(mfwdo%;Hr~JYtUUI6ijL{U9y_@q+6-?C7N$9SKD*FuJzM#*zIh0A_&L7hh zu=76N`PkBb@OODm%-h@KQ^euf$2Jk=m{Q%#m-28e#)-4cu4|SGMprpLHoTRg7X5moJdR+#u1772KJxMj zvprok$O?D!{;WRm6*aD1D;RZnV3#aPhV#5XW9_#y}aNJ4VP0>saOVC?p~_tv`8JO-_yDRhV4K3u%yOFkfIVah3sV%FQ(YsKt8NRb3x zM--hIY!pDs{a;Y=A;-K_`VvZ?t>1I9+FVQ86_er?I&CRI(!G0FQ6EL?M4sdI8#x+^ zzBZiAc4>}V&P&11$sMeVi22f^be(B%$sza%*@Fg2NB~u#ncE+f zo(^yti3{g76ae<{#hC0esX84oK$n^E-ZG-Cs`T3mok8AMK zLG;EAc=}v-kfQ(Y(uc@dHJf~qPPS-EuR%b%ml#Ypmd@q-L^d06#3Rymxj$`b9RNv{=LC)5ED(9n?rS2zxGF{e82UCKwJyRDEEMY>dj9sM8pP23rnc)Iq5bq4lB*p0gNIkGg`jEKLu6`!&r608 z?frxz{Qj@^Kb1y&B!adoqoTCe*bjH3cfj2uw-1llfu{tCzCY_4LN0K8wheV9dLaNC zVfU(>JlT4pkYu@E5EwLUdXcBFMVh^>=c1nMSMmwhqtKYX2|j+ntma)tm1LQr_bW@a zjMqUG1X%#F(;p#>4yq@3tt%J_0daJSlf0q!B%d?W{(pRr9=*R19UEkoqpl&GyXksV%9jW2XY!{XpK%@SS|v3;l3c)ZYVPELo|`!x zH8L5s1^DC0!8>~M57%d$n8~>H+h39_g5Gh^;@x!E+LA@R(d&N@`)%H9rt?Qn#q-o> zpGFXjW~pM2S+lGOmQqGWdFY-1GMrjD^3%p`tca)itL%Whj4Vxw*WBohKd-{WM%p@j zHo}bje67Hol))Wu#_l_^OaZKLbPx*1YFatt9sk%8(_N8NUg_lG^5;&=OQu}ImFHtT zQG)#2^WVvO)#9<%Em;}EPJhe)L~Q(jM6pLO8Wbt}2ZCgM1hjuZYdy4mX)Lf~D>L1$ z8EL;$7JfllI{Ufq1yw|aK9N_*Z=H`w`z-&@JbOg@?`KSCC?y}5ko|Y6y1)!}CVn*| zq0%lZ17zjVqTs516z>0dO^g=M?BXEMq!Kq}Ckt}RI8`(fea;Xo0;IpNJItWhO_KIcJ2v7rF~v@bLG41%V!clwSTlqoc<5Jp>XD3xVe`5_#BZx9cE(eybh9pqPRvhy7Vs&{R4pQpU&Ex7qEFuKXr;>hOnvjtEN;yPN?KJmTsaH8;l> zup&NYlS`KvEgN1$EUWR;jh8Bs20)!FQ(jOemSn*S6{=eLR#*AWvA#9BKb!gH=9Ief zD5f$aKhFyqL~O1|fJwP_Vf6}9e7p&drmYr32bdabOU+K#F81o?TaP5w z5)VcX@>`K}yVLW=O+hJSYPnqX*ys&+ZU~2W@Hh>`)}_WhWhL&Z=KLPr&MILCPVaYQ z8}MAhz01gTDCXmrSW{>6DWt(F+j74noX8undq< z1Ntf_tI<3?>NBzlT4bB7vKZ^d!XLoTDhc3y?#7v4k5nt?n2|$wb@wi=06Q0e?@=eb zXF}*vke|y4>|KlW+&T?CdGhXwqO6p5MGin`&z*yOxb8wsRG_)E43u>r@)P`|>xd;U zF8#xe^T&4;Fn$&EKl2iYf$IfOltI5}Al~K9-{imLqcO?IzMN>Cxhd!?HhzL#e!T2K z2fGctJ(u0`dsT;QMf9O~c#x*1ssdUV=mTR_97UmS-aTGw-tK83{U4lRhl{mfbF z5pL63AUT5D@a>8r!2(u1A0nZT*2jqovX6DN_I<82cqeu89XbHGn?1(@tb!-e#f-%r zKieAN$u}n|`%Y40&@LX~-#xN7T3Tjfr0x@`&T+EE4TFZPil{ZFtP&Yf3Tx7(fhb|{ zMoJP-&d-IOu^TwpbiV?)j$XBq)s8v=2#Y1>0&O2dXJMm|^yjyE{IYBID>Vp*Y+4DpFK;()JmT?|DiX|VlnHCe}w}stgTnGWCt8ecR)3EC9b%ovv#)$=jqslC9cH98QTQK131q~Jb<7VnFP`7Z zy`y@{%}Ru|EQy8oJAuiwzy}vJX-tX)`NfD71 z33xld8)edD5k)9VD@8Ksu%$KL$i@&Ak&-B;thba*YbCEoi41HKyW4u%F#d$iflels9k*9~fK!zTY)Ly#zrwaB5nuT>R3^H|LD>b@JE5F}c>LTGC3O zgmM0dBP;%reV;|YD*jO^tyU+4L#g7S=Vi94nQYleHY*+(}(KXEhNyAKUv;(Vz7{i)wG&AJum zm}0DX_mdYGHEZoQ-1&72ksz0>xMyip0A$v@IDS{m#HpGpP-A+wHx>ALSqzful;Y&gz8IZd3C6f`48Vekz*2EeIlpvdLv7E=l9iC{>4G0P9*j_ z!Pw#H?-z8}wjmSLhvvld6U)2d9S7wztHBe;LIE9=a@ba%M_hL6myTXq!iP76ewF0GVC)In) zhLz%u`1MJQ*AkCSFyEi9J4T`b((Ct5J}j&=?B*U`=#VB$VG#z@Fz(|#2EQ;s7%Vy< z(f`OzlxDJcIY*zkX_n1zPR2<*!Ssnv)nb}gZjQHy>W2?&59iit38Sogk3)m(Jbq&? zc@m`5ze>Y(4A^N^IVa&Ie;w6TYp4T6zOdxP${Rc6H`QPLx*S3XtixL-K z-p1N41j0VPb*m?b>dt-1%KAhM*@Zp^qoTB}ME)_0FH1M8Gsk-WtnLGAW)qY2_QM8O zEKPGuhy0V&Q#@)stZzm?U&TK2UANe?rXHbFMfMS|-mP76dVNl$$|oo$M4y>Lb%CuZ zHN#uSOReX%sd@w@b@)_zZED-QYss`#Upcy?;LE+j>mWEa_rOvHvlg7H+rk(-Ww>fdpO4zb#sgRi@ z(wru|r%G?)^o7oltibEKG&;0ea-_9u5ZhSvV=h-fg@K24aG;S@r56|;dN^fgczs|5 zgQsus(TgP4kpN^ar>x!o{uxk?y>t{Q7*B*28FT>?2#wFiLX;W` z3JLqB@*>RKU+^nacyf~YTh>fRvO${z=o3Yv2*E_RlU`^|@7IB%8)v zYm2m>;9Ye+BvCxj_C8*is~quC7}^(qd7V@=Z*lub3E!Upfd)wu0q}oMjr0yv2adS{ zb5vb6o{o+!BXwR*?j-nLX%GGK~T7e+IA z`sO$~^YD6Kw(rF6 zs4^q1qa*3&;W4mOHBV(2M*?B^9*w>uVbqB0p3oqKAfIg zQd6fe1MLMuVv;(SYAV%5OGk?hFR>-a?VIB(=_VTGc5BC0B;zE)KzVq#9T4i=x~1QJ zd5MpFvW(r?B{#!o(iM_e>5!L~cly;eB#H_RIV_9Av|VcEVt~{szObl?$E2XtYbJ(t z3w8yKY|77iB)2nKVAh1cYtQIXqklL4PIg9N6Rt5I>!@mdsd6nzrjH6yxN;#Rb+SE? zgon;R_U_>42u*Mj)&8O5jE2tdOj9Bs-?h*1cCbUw5w?s8*U53`*F@GX*^i+I8W{T_7f~@O(*n$#e#j_Vv)Vn?m3)YEg<^{uZYS^Lr43UBrdDVjvsC2n2(OGEx|Km zffL`SWzO{rU$9V(@{HFNsNIRu+^^atHGVWYqw4>fS4u^kVNPDxk)w@&wire=HBwyM8ZB{#yNp zcX%u%F-3czP9ACDW&Zab`rL_Js|SNW!r7)?(zFeyj&h$w@gRXhjIkx){mO#NxT-2ct zX)%>qfYf6;D~qM(O9x+yQN`)1R`Uj@i~cH}163>KtE|bmtT~*u8*lP=%Ykz3jzVqb zS=Dc52YfgTXk;08OfeOC!vb#a*fj9OCLupABwDj5zQZV6ALsXwd;bWCqU3;=`m{4m>f?|$@;}x`a z;tp_7WadFz!>Jk>2F}^K)igru!QNM`4xAK8uj})ca#=nU9x&uoT9CZb&#=%hbt_j? zN+|=Yd+L{HKtD}e%w$n-y!jhr^E8|@(a+O=_y?(lA$w<+d55vPhgYPvNW0&u(9AG4 zNSfg;-;x_2JL1c*-fWfGi6bpbB`&iEA8Th1KJ!@tZu18m1MUIp|0oR0G_b5 zY%U}r5oftK+c#wXti+VAe(A1lF|hn(bU=5_zVKcxCj)g=m5hbsK4ZGUz;(FNGZef= zsW6#&xJ(n=V3Xb3=zHs_OP(H0<&m2nYL#vP_wUtJsQ7txdX5Nm8UHL0Uv@fD^w|HE z>NM=reEe4-L;p&594?A6K@o^-N+h0KtYaV=Qt2RptazkLN*PKaDBuq+Q|Rj5zC6{) z`%w0(TA**uB_`#GP6d#fSa9wBjZ^oBFMt3z#f(y>%7FkO+olx{FR%B`ZQ(`g8P?(E z@#Z;p2no5jd}ZdGBx*!S?SdU{6K zlc2rWtlNt1qE^<7EaB?xLeO^;F+DwU4UXcBpXB{2XIas#A)+Xm{aiPy_c$G9y0!br zEdhzNg~s*HnmF+_^NtC7u-?@mV`*Y3a4DvU|9gihTmQX49KP?ouhi=|;_h2zl`7p{ zi&YBqYIHC(-jgJO3>{T zAe%?`)74e5%TLy13o#`82qcJ&olarvo49#DW>6u!8E1m)9SfwLe%!`q`Z{JODzBl< ztGc~Cx=YkLd=G`FP%9T2EP1pT8{tHl$Dl`>)$9N9m*LNC!t<9;*~=2cwvxFr^YgfO7 z6K%x5-cz!7%?`$x#ZBzKSEZ_4edAZH`HgDHKWk8re~rwr6=+~*+YB3TV;xzKuxp1R z*0CyRdD|!q9zKwRZ=xB1Kg0UBa!h_*rUXb4rC+;djMAqL zXK^YC2?=eVow3>H6jr{!3;>{1`n87}+%st$IjQFY^!hb~?|xj$f0jB4U# zqK!gdSp4=`MyLo4axi}`o5G-ib@JGLeC|P$mH#;2up4jXI2w)0%)q()yS~d8pY$V( znZC@^lSDW#lE0Xnp}Bv7yx`W7XAxR$Pd-aKWuEDj|82GCD#We$Z=r5huX*XB{}5VgO_OjL!F~#3nnjW$-~}z{2L?;1)FKc>gOdMC7oI@u~6fELz9Wrvbf^ zww`$wAyp*nm2ZCorwV=u>#nU7H|qaf5jH=92i{xVRqWhLuN_`kGwP5=Z+@UtCHABB zX>;CBZjqVhl`3=#;+4_h?crSC+asFcRIEpYG=TsZuN9`3I%UM}WE-u7tQpGkn<#&2 z69i+4&<3(HdM_^xePD?+nP8=t!(bN~`I*SbxQl*5%SJ(gE-q{TkZ5M|_hC>tp5O6@ zZ3hsKO|PaUI#@EKEGH~1E{Bc!-*|iLhbY%~?OQ1k0V$F$#56iJnC zkZzC|dO#X!M`A!2aOg&2q#NGL@80{_&+`wwzxdN~t;NlKU)Oma=jS+1-vn28_u-)- z%G9mDn+QfIbly~t)gkSfM^E11gLOFdGSkx0YUS~in2a_&xeTl1fso;7C6wCe-MHua z>FczkO1pZL?OF-X;`JZlUH`R>Q;PA}OdadX#-G(OHc3m<5{pnxno&(S+|GuC425T}JmtRZopLq$c~NLU$WxaD{E`eiViMMsEO zc4q&%!=n~8wcT?|z2I`&Hos#UWaIwqT}7%ymisVA*Vgnx+()SW=}K)fNH7E0cQ&?Q z+lk~Y%Sf~IHlGg5TEoO*QTQYtyOL)3u%9eFc!O-@5V2~~*Oa64w?q>SYBceWIC zQ^PmDH9OrONG=gW9cS?3eTnX0g+#m)XN&wX1!S{s0nP$mISp*snyZ@|2nu170sF^7 zm%=#VdeF3=B?>+{0~1U4dR>1`u4VSqdBkW9W9#{chQzXRmw!_H!qEPtG_4V=eSt!0 zX7A}YIa>fRJu(FHqFx;{Q)-Vv7qUHXPT_I^hev<#+;{Gztu~- zBHN{`swWQ84wUn@?|QwA&j{q96;6EI-u~u$e`_J7Z{rc}$7vTD@d|8uNFXC(1bOA!1Ek2mBS*5m%nmd19T+Iu7XwB*sISI~e+D9sLk z@%g6IR>$F(cu*n-Y8&dLDfQ>Z`sEJ$5ommrZu7TqpSVtgf@>mdd(tat4eb;52&tfnAT0I8gaqcA3= zZ(!A7gM)y|idSIF27!wtU~{IOgdeTv$|TB*#11>Pu550mv&AAbQ-a02cpWf;;F<6= zpazXIIhQKzQAVm#C<+|RrS+CPjAt4Kwo^#w5!j;+SmYZiD85gS&d^T zyh6!vKo+TTzzJc)D=!Gv9E?ndS1?ZuX?W5LTJus7;n4G#NZRny@IB{ZNn*E4B-+7n z`$Eqwr!nXwur!R)X^xHBAP|)lWgRkyR&#%ewy8{0;vUI;8n(E;9=Y!mS->U&9T?u# z`mFz)!Yt#lcu-VANqTAw16Hh~h2gZN-FI6Nv(~xzUSgoD{dQnGz<|3^_>wxn<&aU4 z2oQN4`r#S`G|$6mG@77&DE9Ce5iB#W$Mt`zE8s{ z_H*oeL9bfDic3m!aA9&^->bg8=X5I=ud>+|EcfTfSKAuWAM#YXMQ^C>m&3}4Ff+bY zHrNF{-@`i!^z1pI35Sx7U9&%IGth2Sm2V1u-zmvldDbvpUpTd(i-?RV}%`Pm*gW(c*; zJx0OcQcS&IfpX^Th_kvN=7hlgP~0%4QT|8P_TsDqyh9$F39V)ncQ@50Ni9CKrx z7zY3Il7-$pfn6gx5bv-Qgl2@Sem1g>HqLslK@ZyO#RLj}5>`m|igoyx?&RCDc98qc zEslKgrHe3sLClM-O1}S97<40Hsb;OmFMdOg-4;RI=Zy#fz4r&}T z5iZIZ%pg5_;7MR6)93wbE*Um(6|DGiu0Oz6TA5G_`msNBe+7}wIh<~&ypJObETQvt{j{Z~BGJebP;|^zL~#+t?oSQ=7gccG&se;fvds z6SsM{A02NS=YQyWa*GiRieqj$D82jo$b$&>Z0CidiCkv-kR<$^_7Q+u>WcX$kLj>{ z*-!Ls2aBs5Cpj#xb5^E53{|96i;9WTEB;9TwoN!DaIdFk#z`0yQr7h=Bzk5|W&$*3 z6!Lm%oQgij7uYte8)X?kJOZM(qjkBRYaBm<`(kQau%(1wT+Biwi%9-1d@>|h*jym1 zR(GB#oIb*?Mt7c%QcYA^npKrAWNf4GVaJeH6TJ%mIPZ&fY_<>y6~J*|flUx>ZKr3H zci?MTPou%$2}w(GCKbB$>DWs)LCM2t1Ud8WVNd*!gEZ(DrEM2UF7m7{h4xWxqT2`*K%wy3U zanp7Ku(>|6oZ-Qci-=Vd3YZIFD~ry;xQ`4=dmsIbOy1y;vfvX156qnEZp9=Ggl+aG z&*#FhnVs~uSND6;mt1!mdUgb>9pC2#q94J7-RS}wR!}UK`q8hr3NIq zA)nV7#g$XS68>mPwFUovI%;Z6dMi&T!;2ltEGnw)>;rmR)1-@nD<__+V}jEglV>cR zKRW|WJl4w3Tca}v#q(PvefP$%Ufgz%|C4Z7!P(V#FjjBOYQ?-*Fkxu&fw}ImDbGKy zkoscNo*9xnDHT=)~YrVqCa$U~fH><`bGE+8GyQWOM**{&f?ru*e z<_mW(ID+Wj)o-g87m52mV85?zIas$`94`vi)X#8I#>iJ{D}hCKyvk8)<|DQOkk><# zyYJ+C?zfaASg~u+fJMvTl%AGAuW-jc*U0D-(zCm%#h`)E z<=!wflwgUrxY|wK_jyf*L&mqVev#OAM@8#?!H0d@NJmtdUzdF?mZ^~V^2JG{%SPc> zu@~b*BRfbz z{leza*oM150yfwE>w>eDOVb#QdHqr4UvZHS2AA}guOKlVCxZ@hU%yUj`G5Q+5=fhI z+SiG6Rj_T%j||lOwD)Hrw*++O>;bu05Uwn&bFwofWM|LG?t z#rt032b>#lVQCA23|?4N6Yuq^+*SWX4Ky9d}>z#`Fa<*rzu$hZCP zBLA6+L4)Je_ep|!yo(sGHI*NJ2ES>m+b*5G-TZZ(jPU%Odb8>LO+3YCQLs}Q_#Vx! zT`hEL6%yHLP*~0}u}`d+>gw-4?BN$y{xx9RU;)DK;p9|}ThV-xG@!;FnY`wvnpFg} zbG$E%3DF9qRp0 zk6|{mG#GV9z&@ob3CO{O@>|wFdzZQu0aRGPhLADC7R`OZ#&EE6^LSU#mCW7EO+VG- zKIq?>%geR$Y4*a_{rP^*@wCqS#EHN0*h#eIRys{&I0<{};WLfRh}scwaktJ+_ub`<6H^DvQk0V|WK3^O+{qM4x=Awm z$~%amHH0fuH%Rh&_=)5Js)D7U&HIgA#vLJ)V2&^rlPeAB0J!9V5}=&b3kDAkC^No{ z=YJ)j+|~a`x75Df-K_cv_bXF43a$gJ)QMnn_))hc=Dh<*V>8?Q_feGQ-r~b+bRD&y zGP5d_W|_1NxV5kLMU9F|2lZ|ZfyZ-jn0uQQCw=j_yu>_~iw4XJ!PM4VB1iqzXS6fB zWw1r-&)8VD$U4hNiy0=n*BQN8MiOR?EfBaCkno9FpGTIv1)hUXbxKTD(qZsG7@^-9 zYukW|(6$s)PAdL5|Lg<9<&R(PWa9F=M;)7jz6xh(DHa2shC_K_%eRrnyP{L<$DrEc zyMA~v`V!QrpZC4{e`DqN?&qLF>TRLxx0b(5{ZRRXD|9P!cc-q`_Uq?Koa{1#GZinvSfWC zuz`A;wV4kEWy<}G9f#Q_Htog*xM1HH2$5WA#=pl1CT@+!OTLVFUkbqtfhDsWJoe8qR9G9qJwUg{Y5}(Cto?QKMq6QC)^S{f}M)?u(0(K6b zug0AID-JYe+MnbKsj~Y|joO4#5tOxUHgCiV(U0EEzEk~iQXzTz=H!+$P;cg~;~)Gw z89Y^M8z#M<6-XWtAkNr&MX&g9K5iM4#9pZS8zI_Xf zdeQAki{}=?D~H5ihZ{)woJhe|YK^M*C$Nl!KNX};`gITOvx8b=#!3AVFtKWcby54_ z=Ko#Yy7x4w+VgC0$y?gFjXGj8$}eu0z(k+2LxJi7IcneG;TbN8y^}@ifp}@}KkXM> zAo!zTn4-cP@9Aai+W+*5qYr0qo@oYo47j6J>rkf7U#i01J*lsvf7392Gopf}eo zc)-Qg-df%KA~$-6GrOBl7@oX4IFg;Pb`bG&b_pDk^ZxQV>$4*pmU<(WZa;k_=v6Jq zO!+bvrypZFzaWdK6ju5^rhp_!WRk}nGUctTtEGW*FT7c04v{0nW-E_e!PgLsnRM$0 z^DeaXB@vvj20wHlE@!cs?$z1W=xsU*r37%q<(>Nq3ao}EMoGQ*eN*da96&6S15CW& zX|Jn{a7 z8)+s2UQu`nkw7L2Q0wMFdd{AO$cCN%zgW@;+Xat@GG=Hb?B-3~t3L=iK-FLlS>udwD#l{3h(fUDA8&TJ6O zo(Ek7R=wWKrfvYSW`BtNsqf{9U~2K(SGrtjptI_J2%{(∋|_EhT@74dls>cXL(_ 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 literal 0 HcmV?d00001 diff --git a/app/examples/Games/GNUBoxWorld/movible.png b/app/examples/Games/GNUBoxWorld/movible.png new file mode 100644 index 0000000000000000000000000000000000000000..7d63ed940c23180fe9e1fed18c201cc1ca8dcebf GIT binary patch literal 3831 zcmV2x2T-}wsvee?uUS5twK76Qp@3$n%}W*$+-n2-vH)T#1MegNeL01>*^ zDCj!pHKiE54zAMKKv7)3dKvG(e;xbXD|E9d78jQ>Kbgn;`~uQsJi+-37qGsuiWA3A z;nCCQ_{(2EhUx((Y2p@VZ>UyTvnR@e1_CVx5Xoqe=uXvaK9!pUwwcJ=T9T05uQJPhD(<&BdxA|kK;=xu)K5@l4zj}ztWCE?i3xYr#j2X(slSARC28?iNP}%ak&t_3) zW2DHWHYbgZ?g#M@`#_$^JuWLTGyQbXD_A+`orBK4$4`AVsJ z0gA4h(NuyLs~cE6b{y&Mz58W3wah9c%w#e)?`spUc3mCvmH=y_wDj)IsU;G%TGRoO zy(6vi0YIMQtQZ%RX~~$P)d=}kRo+dc5Cxun`x5EV<7Zw@)XSM;K{1|;;WyZuoB|oy zF%yS~0YViKsAcM-lcZM`D>BlI*Cygb&~;rvU^aIa>d}*DNLyRG<-3@2Vl(^C$vFLp zDC^%FpiaHSbyQNt&^-lJgE#>{({&x73K1Trxx@lkTi-<5-F=0WQh|>rFb$~7aI)$! zSo4NN{Xx?E|BY=agvsRQ?z)-X&bfvj5kOS1_i7JGOQ48HM}sWM^}bx3j1w_9G$B(L zR6~?%-zZL_9oj-`JH>XzGOLUv%Q02O%@0hwF37|M#|@!SRiq*@nMb1lB|(}sMKDgu z3=;E(Iy?iF9il1~!!-whN-Y_-VWY|wrbV6r(`gsOK_XC`<7Jwj4EP%6v4n=g=Y7ij zWjvnnZ0yVsbB#3(ZCa&?CEuDPX{(O%_c&kuO#6F zvbO|^@p#;8lr;1TZJ1bvk3rE?O>g8Rn?GK&H)= z6~^k_2ybJ!D8_rfbR-e&e3cbWr!!NPk;eimu{+icKsJDRy6Ix+ai2hJxzGiV(}cY3 z49}`ce+PtOhS%gk(ZR5(b5_sWUIB8oU?S;uAr2xwU$ToeVGz5JMmX?b;_oF_Vw@&{ zs`eVyw#GGGjua{!_7ehtN<9+EF>kC?-BE?+dfuxgcPRY03{qM1X~n%Ao@O6$v!fWN zaoEzbY3mXLx>@35^pdgEN<$tuozD8h`Wv#*vQCBqA22&ngoEFcASS~_oj%6x&zPjPAnLJhR*jlxQYl$lXq*<_1_HolxuWBtHN}Nc@ z%dL_aFi5!OH#Gi7MiO$6_amIG6UVhSImt8%wvHjtdNi~Qf=B>K#G2uynWN1WL4WEV znH^SpIAalaiuk^v7e%jPBc9ueyy@#3jjll5Vj9AxgdePdIZb*_HK3_9(`aK{+S#C- zJWytN?y~Dlp_~hl5)+ghvkkHuW=~4irX^^?q@%3}K4D;geYR`kINl)<84;7(d~ai> zPU72qqVDh%rs*a8>Xuk}wQ;mHJ0@IYear<|p%yqcc3@mB&$X;64GcBs+B$}}(Cct!0;Rza(tu8V*{lt$o3l_M zLAE4Fl!8&CGEBdF-r(2%^}kZGN5YFpUnxZ-@ro)om zVFxKp%(g-y9@s#6pV%@y@@R4xW`4*}Q*vM6+rpltY(@}dlEX4Ehi~O-$B?z-oF*Mf zPy(FExRh7p8lWY?;=V0TBsTu0K@MRr*u=5q8BvUxl0|E-@fV?I55u*;U@<_{yg)BU zYPsgqFP@^M^a5s>>e(Pt5Z2Mt=f^^vL8Kl|AVUcd1EK%%>LDH{wMogoI`C&u&^?REFMNqtfjrWKe?c@i0bGWrX#hhItJA7Tx)s z>u=loWj}zuBCV^+X{(ToY{FVj@;_6)r&K#Z5ds#WZrZjUsy0toej+xvlAPjRL)hhM z>SqnL6o?17S)k(y;XPnJS`tq#`ys^WxR!k8m@tLQ9NIi-$6?@atm3XtvmqApjB&t0 zR5|s|rcX>2BmE@q+z=sw1ai~ynVi8q=iPb#ItK3a6JbC}Gv2F~n=|w$geYZX!!|`F zAf*>}^cGf8;g$zar(K`l4;W%dMHZf4wtDW!88o~+4M{LE*DNd3PATstJZoo=cv487 z=`%cAni`17*nIVCX*8lz0cLb< z&2ghw*hePEDhem@khHAaiYGzG;84CF;6Y_#uUJaJYY30VG|O|yNRSp67BKB*;1^wy zehN*i=(;J@a#Fl~)BA&;!&qU{Hucu}aUYH#2^aFbs)B|23DWW7OL+PHngvKqMAiFQ zC_Z(~q8=5R(u@THs#|rV@B?cM^iI7sn73FrsD1yucJ3_FJ1cKtb#>j629@^ETIK^u zbux`o9O2jq@>ut|0@S}p;Bs2uGpga+Q<~9S``aS%en9-iZap*-AW^QLJ9850+?f;6 zimtsal4G9!0*qhl(AJJ8Cm_I=--h-M3J~ntzcD~F4;!yJS?T$Z*Udk9Z_-hy_}SGf zNN3NU#!oN3g@;eRjjk(#PrIo%Dacm#Z;j)%`3}~b8!knCJso{oyl2XK9TrrC`ax@} z1TLLDV}FNW27}{IfVVEbj=7{r^Yin#e(ha6dHOBdD9K0B8n5)(%5Z=NQ{c!X>ApQG zo(@Zzb%Nph-iVHZ^QX{tQ>4AUJm@#-1*|ZDb+Q{Plp=0mTI@$Whj9i zmCs}6&~_6?o8d6-6vyO*@bep2aQ)h4tgWvht*x)(eJSGHPGDgk37@O_paf}<+m|T39p^|3DU~S zyV&19!1m@QKK$h^EH5wPZy(*pftl44O=wcutWv+UyC6)D%{s=1`~Ks^$O~|CV@_G~ z>S6FJpOFYYxOD?pFTaD0jdh$nbpkKGdx13TW`GEmmY1=%zK)eQ-@w`5oy5og_zaJq zJST|Pew{gdu`c!YAxBvH5K89c8I3)n{k^d*>6i%lnW~YRZ1osz8+L+AD{tbxUtGnB z%z~%| z+Q!b#E2w!Q!ngh%;9&d_&+i>2W~~4#x2^?o0Af169}+bd2o@J7ID6(aR^EOSD=QZv tP;70k26xU;9$UPMi`2?oGRxbPp&gBcDEUt%;`!eDWL!C;7HabXb`E?&ge_6Am#&tU!8Px#lrKgRJfV>}vm zT+3B?`>vi7fmyuErd=;g$Z5lF4x6vcB^HwT_(XIBA|U9h<|*D6z%Vh0 zNxjd($d!K$@1u;QKwc;6F<7Z3PY|0W+-Qxo3MX2fO$$`cvcsk2<1? z1YbT8_S&hf$!s!LD{OD=pqWi)7>)*23f7Au#>5EYk#i|KNEJg!u6NT^9?fJLE5=yy z#W2xW@rKQdAWR1Um`u?n8~MCsFKS;s-s=?npkGO56q%i_n!Kx2+9c~$JesT^Zl9i#EkiR{vwL}X=a zE6Nqq=pH7$hF#B?-Ya3wB5T`Dp*4%^Ex?qV${=PmT9pc#svwcP$d@PpsJBm$#9L5r z(O<&Dxe%grUv2N8^})J*9fkTat{nM&n_( zh!g7v2=+w$N&ST)#NF#P@jQ$Y^TO~+G4^Vi*>VJ#xKzK~0ll1;}FeY#(F;os zb*D8x<~`{hzyhlTHcC$buI~6=4fFxIyoL=L4c--I-dq# zvH`r;g^gl6WBUn?;AAMr8s%;joyoSx7NRp( zFX=m}6EZi(f!%)MHG0>s&U@awg+%0n0B>lvQ1Fu$4qz`5yBny)iO%g+p&(hYtl^75 zl@qM2)#4}=9cCd(t%XC$rDCfG+IAYO znQOzsHFXkvT#;8i10r~{7{L$F^d>cl^d9vyMFCail8q?)Ock25Pvn%WHe*)nu@^+| zsOQoQ5$T2nxGzqA%VFYEq4Am`%}8OzWN77NPXr9i6(>pXaMCRJz%p81u7|xS+WR*j zp`>vsuE#!A;a4?f60U?f&x+hpN@~tdwS*u73w{h|rwxF-bJQ26ng$X1M*EHqihT&A zSpvL!EF9`WA}dt@J&+cGv=(vGpf^PZ8DbaCPM@%Q|G+x%8paDK(O5NZAFkos}1-U{jdG%bdb%YDwdN7`hCn{(M| z9t1m{Lz*ERz_x@R$t>5{?d?Uc^m!_8_?*V!pHBvUMs4Oq zDGB4As@D1|Qb7v`^zd8OSJGbO1rIwmcKTglK-yv0_Jn7~TFa!h)qy|{8IojyGE&K2 z(oHA$MQ7^g2EfAP)QN!W*0^uZx=<_n+LNukq2e8;y#RYoQTX&JS)eAHBWz#U?7GTn zLx7xoNn>Ym*_GD2)R`Q^v&!udU{|SHM^vqwGNInrG)c0L@_Xlku=8Ti0lb!BD9KPr z5kYpUhjBoikXZ6;D6(uK7(zS(JmgQk3JiuV3NslesRMnrSU-EWs56~-jUP>ZXzK3t z*aJ1Qw^v*F8lKTpC3iTwdyNs{>(Y^>$Y}1osS)>(>ZYjFa;29h2lbeE{jM>ku}UYDkg1U7|Oq08Ms@nK#3N;WyT$%_lbz1t^s7%C4|W8*+Pio#X^o zrz{--?R16^2V!e^jpoGdtoT-Nc!!MPILV+8`}=%GkavvYN;Z;M9*k5H?0+Y4 zhm8|3Fs<+8bOG&IB2_8=fo5MM_(w~@;G`iDT5~_QZu6g@4%G)EmRr3)yh#l@?C*Aw zP+%Y566x!x{j=bhI5~ORJZ~f7ykvJOVq@5+<|XR@vS)+cZS2~71Zm<`S#7G1t5nN0 zFn+Y>^JZ>(g{xloo`Hr&kk1)JiAU-Io1^hlblc%nYo~UTATbYpI3m9h@UHYoH{IRq zwQLtuxbW7gGp-`TheZ!Z<;-KSa2qRJ(xAtNIh_4a{j5)ph4A{`{0L@>8!J+1l~$EB zvr^3hY;w9#N!?l!OO;c9S$%HRpO@3-Yp7bn!%YETIdMs1o^4wy$*3Y^`?%-` zbm47477_kk;85fV2-)t58Mz`S)D`L32bFF8W;_~#kJ$mv`-PG{xTZR-WP-#>T4?zwj_u_5llaP(v6C*%(z|NgJi{|>ZEBN&O7ZH;_RI0LV zyB~3x9TSY_z#7JMfb5XL{UFHq`@STNiFHCOxB`+Z6wbY|ist;;m1;B67l&l>8Y)`h zDSu}h2o)sVQiK>mCSLH?_NEDD%KVXR+RF`LP_`;?YwaeQbLY?E#`Vj1_WXs#j)RZ9 zlViUMf!6f?mtmoN^WJwB*RS-sp8sW;P=_={-J(im&}H0>9T{YPS8+INUVQ6K%+E8L z!C-*fx31&)^Pio}kENKd^eM$@Dt|wj*9lBkhhjVP6ECLLT?07*MFCxO- zJ2!FV?Tgsn-oomc6}%p4c z;I6%n>R-`E___d&gD9i~FGmmC6L9tNCEU4l6U&n^j*kv-cyxgAXo8Cu2WS=-7qPpy z13m_JcDHeOaEJ?UUBF*I{0nw>r}*ys2YB@ODRy>Rw9~2mic~r_io_(@0Tn65n=V*$ zX^eQulYBXe^|HrVFnXP2jtGO{5a-UG!PP65aP`VX0F2$8EgX*)am>J()i*Gm&2V^d ai2nh3sd068KCmkQ0000{OZN=sd-l$xEXv8k#1b-Uf|ZvXG@^L(D~J$!3i)}7#to3hY{eg z7$hIXc7VujY9EHlKEtE8kx)^gGFpgWMmQ!ABRQ*G#Wss19X~* zP8U!pi8x$58gr4$xy0pM^8;DF#{GnqmPMJW&{g+irJpcDx6gn~SwP|D|XBcn*Z zzS`_;tvFkoE!K*~1tO7*&&y^ql5n^Rxx7NIs8Gl&6pAZy`4t5SMVUmR{-oh&F`0=t zd^{Qq>B|le2Wa$b8ci*TA`nG&8W5UlReo6xs0U;`&?_a3tq(qsRL!eIN#cOrYK~IyJX^bFN~^PU$_CG(3zg+gO)D8 zP}Q#E5=xPRI%QY&ycgToU1L3w+IHD6)!4Da=TxVAqruIG(w}S`=Xk~Ji{34Mpzu!~lGxys6jF7$!sdM}@cD%z4OGH1qkKOAyI}6t++Gl|Z*(-HZ z%M~}zV{P`Ku1yB@fn9}G+3}fBOse|FHTg~M5h=dK#{JHdq+t@QcDRMUek1JAE=In4RqS=* z>*QzHuG2v8Na3yb0p$%(XoCKhGmGYHCUY@y-;<$nN}AT6y(;~|D9kYiOI9q__V08k z6Q`bO{&fVKJ4nf$yVdYy>TYG5WnuqH`gBjT!tCp8O7@(bA?daIYoPDmA#a>Ei_dZF zj5k5A^&%e7Ju}mUtb5u%Jf&IO>VEGbU)rfSX3mA~^GcX(JE{J7*j4Y9#%;yY{Rx=n9r7U>s^du7T~O{ngT zhjV{Z><~d0%I_X^`^=}OcjV2(xE@Yx{m|z9o{ZI#0)Zf>UtH>6*2SZ+o?Zf z=s&DY{bZQ71$nL{bNN24z*J{qZM)gMWG7LazW@#~ghTRdXX|ece{U|j{m0^xsT|Ys z%EPO+ew~-rX`B1Ku|77zQMJ52WLw2cisz0)Cy)7FOx-K%I5B<4yYmCGp~VaCo#xGF z&&;jvD(ATM+3Yf=IrVFeadcILRAv|>&bPcsR2gJ18;$*7W;Hleh1LGIcSae$eK|Ir)(df;fk% z+gCRomTes`%-G(#F3Vn&u|0k5wV|)FYRJ`=D=At;u4oUJ7K^^3{vHZXH9@&g%)S-HKEB|Q7`v8})G?AV?qzlWBj zkR`vzmZZ!9+w+36W0fEMy8k))`{MuMTy8Fpm&@bka(Q_?ZXS=96(7$cQ~cm?g;1yv2^B(- zLL@2_2(sfjLV8Rz4p%9WR7#|kQc0y$S|yQGNdcs#85y!4J@Kh@It_;pMFA$^u|y(2 zGO9r?Zv-d?C~lGi$ZPWpO2t4wKbr&WB1hwKAt@G zDnnez=Vt-iW9T$IPL+|NRw`?LD2PMQXtheE5(5o_nu7c+PJA>T?*nm^@%fGN;?x+r zn8nQFa?go`%}QkppjMDylb@f>;i$wJSsV_VOeqxbWqbh@iAbf#q{hT>j~{1K$Skry z%?syy2u3ya)q_CGC?2i|f?rQ&!8m8L+pnS%r5eG3Jwvu_RrclQlbe&-Hf+Q$nItT? z)r@Z2ydyRFxv4A0!24KeheK;r9dVKR(%-WhIvpO-a!9S2gcgl=r%1xom>f2$Wzbz6 zmj-)!*Ztn@dSm7LxGj*&T9fLDysb_Bdt?)m@IL=)t&XjUy<+a!XKsg9Pt~PU^zrLI zLv_#QM%vTM+Tbrn;OTv@p-o@DwwpiRI=waF?Zu0T8|-9@0-c10@AI` zp6Iml0_^f5_AYklI9b_>f{VL++3<4@_gjv?!=gr9hG*+E{nf*<1+s0LrDpG_of68O z^-~p^x2seC9-!H_ZRl+`_b^#5EF3ZtHg`7Dsn-&F_Bu2sk)G`K_3olI+|jeRt2lZAuczx);H%NYlB zTZ(t*C?Ty^;a}c;K!ks~zKOdKP{A7!B|zn;6Y7a~Hj%)bPpT*T7kUuTRSVR*X=b5- z!>^y3S~og-_4CyLR#KR;{Q>1`UH{HA9^fKH^DM6k^W9~g8hRyZy~zN1%{21>i{x*` zqIN#C@==(*0Y5Ev={5xe_bWdVEj4qR2{zVSSi#j$Coz2k&Z!OMA#Vc1Q<;6uG*~`Q=VlM(dm$}B&-VU9U+rC>K*f#u(;jl31GXE`c`c+SezOcP9 z)(i?wD60Q$k4#v8@BGZ$*nKv}*5w}hVcOWKizx}vb|Z^NZ`+*z*Z?s^TYIhe?4?v3 zK0|19eNuYM$qwyMJ==0|U{_zCj#oWakNXP>RU&rPpfXyUR_|c zZ?Tx{?fy7;Q!{*W!-!sCdE(npu;SLE?D5lW%}FK}i?4N~w?1FL0KV{5Jeh>I44#uE zT8$d)_WE}CfuY~`iA literal 0 HcmV?d00001 diff --git a/app/examples/Games/GNUBoxWorld/obstaculo-r.png b/app/examples/Games/GNUBoxWorld/obstaculo-r.png new file mode 100644 index 0000000000000000000000000000000000000000..fda4df00bd665740b2a2df6a6166c580bfd9047b GIT binary patch literal 1627 zcmb`Ic~H`69L6cT#@2KQNHsI8>i-sYPc@{zhIh+I!Ai?2eID!m^lMo0J0!~K26H%x{ zG&&K5rlHV@XcP^FibEoIZNsPH@u?9JsrZQ02>dQkc>HcWXd;ra*w`RsI+>DAp`=r( z05~bsbSfo{NKC?FVv$H18qME9=hNxgbUKd?nw|UNQy03c*AlmdZLC{zjsN`bIUC@2#Oi}`$Rd_rtckXj;9 zOC@TFR4tWOip3>-o&?~q355F6()vUp*UVzdRzfYp_j`m<`{lH0HhI!$r!L? z&|V5f#AKbWu5JcZ1FGgsHK^*7s&c&y@$IEqH{y*wj zkL&sF`oxY?EHind58?AmquP%iS4d@iNy3-VIBK?0iG-Vp@9I%_|H)-Lk&Jv^l>u4PdJFCx2{*C)n?7 z00Wiq?>0?NRnUthtS_lwfTNbD8-87ZE0}vk4{7+_rSR(M+o_kQu$P~uZxJB8VM?oQ zprX^9)P|<{*kS951HCU8+nu8@%9n=w_pHpt;|TRa`%_$+o1?5I&!F_ooA!*3(jnK! zxR2aP)^sawvs}xm*{>(h(*RY8Sov% z~C>B488fB+r<1z8kx+7 z;-dQl`!rs44o?I7@|Y8V7eh!2nrzR@hOW)HbpA=>{p+odkM%wjIX2~Yc8mf1OD;=0 zgO^JUkGz|$n}d5k>#rbWt!@v8_NIJ=lD}FrJcex=)IqY(kk_~D!-R)21{WXO60&*R zhUmsGjGhg-w|K`pQn16syqi^S1%E@CZ~lRF>M79)dqU3)NP6wgT{UP^=J$W#R}d3m kh5v5fFxmL89-n7|TVo#NFrM0-0Y420E<7r%8NE~d7fVJ3mH+?% literal 0 HcmV?d00001 diff --git a/app/examples/Games/GNUBoxWorld/obstaculo.png b/app/examples/Games/GNUBoxWorld/obstaculo.png new file mode 100644 index 0000000000000000000000000000000000000000..8ee35f44bf47b01b373908189a1a435b0118e8cf GIT binary patch literal 1575 zcmchY|2NZn9LLwKi|UHhJ$2osBIy#Uiw(2d&e~$q#-^Fgkg&0dEnC{KVY`}a!+hNs zvhtnHx2{sI%83dk^hITEb@C+?CrNcb{S)_`$LsZe{_s4{*X#Y$D--93G2LLf0R#e> zdLKji1MiU^WwI9N>UQA_2(+dj=Sw&m0C5X|KnM^h0RjntLIa=>0u(|;AgD+r6@jE6 zkW?gsfID9x7SkmhZktmF& z*B2Kz0F(ffG!_FC*C_MLrGQ^3;{vnDF?d`U8lx{O(`(A~Wg1;+X*dS0F9mdIjZ&$} zk`@Yu*}!xri-E^!vaO`O0dgQpV+Kq*>WqE{7akC=wP3MHD0=gT>5XGWn-Yae~QgauDML z?xZJ-Vt#S~1X{Pv8-*Z{dX)KJxRyt^rp_UIL@rK)_8r=Tl~+=mQ#pTd5DqeVL~ff! zh<&qdM(VgZ3cJ?-czEmMJ8sO@sj_MHYp^UTx#-WHnR_=OlB*v@W=C{SY`r~fp1j#3 zp;j=z{N`QE9&2K@KkInzL@C!z2EUvq9^siIV)qyYK;MZ4St*L z=g$4+T2`^os&VdYqhTp&z~LK6mNs5}t-L0#W@AlKcVA1BJ(0?f$()Cdy$BrUisp>y zNzU6>Q@$qe1Mh}yN-Q{Gn%uNHacFPtvNJVH9KHaO^{8foO`KBlIxg9|I9Ai2R-q16 zQ@iTu)tr4`GazUDf+c07fikq@iyla>i_!&AzoSMQwH0M|tlh1Q?@r0@{k!q@s!tb5 zL)=Z9{^(|JF1n-SZ1+rX+2sDd!(S1B3^@{3`fT z?X^SGgL9wWFD1R{9@}sbR`fQ$=`P#@=@u88@^Wryt~a7h`>D}@2$F5Fl3dmIS*s`e zTKB3Ab&}6L4@P9$4Poi?P;ihmZ#aIP!>#jURdH>1dTXJ`IzOI@Rrzap_j2ZgY^TlH z2ezA?ti{9VYpf(Tms|Ua4Cvg3!MZK)KQcXfNve71H|wAsi>ou5dqxM1J%eYBc@GWg zz3-eY5|=+0NYIa5b{5?zb}2DFt+Fvy%tMbkB?Y-$=T)8^WSEj~m>Q*xO!ihjTz|cR zXW_02+3Rpi`5~HORgkjt_~q9_9GIh55ccrJv+HG()OiEkZZWL7#T5n@xLr$Gnb|r$ z>Errzy|XJ19P2c#YjLQxvs3zXCiv6a9h7#3^@2^n|Gaw5owfdt8B^U-MjwMP8WQ@o zH}-dTuvrdwcVRZV@?Erty3J=r-1hyK`V%Iy9z}mGe3la;_E6*O(rrh|3j!a1t{pK2 z79a5HY#!gPJpk`)?jg;xps@mf&(%&W54dheW74Jy s_{{|Kr8W6!SInBgC_(D$|HHCM)1nL`gb$0)fdc^YKI(^RK!%F`1JGmal>h($ literal 0 HcmV?d00001 diff --git a/app/examples/Games/GNUBoxWorld/piso.png b/app/examples/Games/GNUBoxWorld/piso.png new file mode 100644 index 0000000000000000000000000000000000000000..e35e5a442aaca2d400a5e038c3235126e476f16f GIT binary patch literal 10046 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 literal 0 HcmV?d00001 diff --git a/app/examples/Games/GameOfLife/.lang/ca.po b/app/examples/Games/GameOfLife/.lang/ca.po new file mode 100644 index 00000000..ecb1d53a --- /dev/null +++ b/app/examples/Games/GameOfLife/.lang/ca.po @@ -0,0 +1,131 @@ +msgid "" +msgstr "" +"Project-Id-Version: GameOfLife\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2011-03-20 17:58+0100\n" +"Last-Translator: Jordi Sayol \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: FMain.class:265 +msgid "0 Neighbour" +msgstr "0 veïns" + +#: FMain.class:258 +msgid "1 Neighbour" +msgstr "1 veí" + +#: FMain.class:251 +msgid "2 Neighbours" +msgstr "2 veïns" + +#: FMain.class:245 +msgid "3 Neighbours" +msgstr "3 veïns" + +#: FMain.class:238 +msgid "4 Neighbours" +msgstr "4 veïns" + +#: FMain.class:231 +msgid "5 Neighbours" +msgstr "5 veïns" + +#: FMain.class:224 +msgid "6 Neighbours" +msgstr "6 veïns" + +#: FMain.class:217 +msgid "7 Neighbours" +msgstr "7 veïns" + +#: FMain.class:210 +msgid "8 Neighbours" +msgstr "8 veïns" + +#: FMain.class:291 +msgid "Alive" +msgstr "Viu" + +#: FMain.class:296 +msgid "Dead" +msgstr "Mort" + +#: FMain.class:302 +msgid "Draw cell borders" +msgstr "Dibuixa la vora de les ceŀles" + +#: FMain.class:72 +msgid "Evolution Delay: " +msgstr "Retard d'evolució:" + +#: FMain.class:199 +msgid "Evolution Delay: 500ms" +msgstr "Retard d'evolució: 500ms" + +#: .project:1 +msgid "Game of Life" +msgstr "Joc de la Vida" + +#: FMain.class:147 +msgid "GameOfLife" +msgstr "JocDeLaVida" + +#: FMain.class:317 +msgid "Horizontal symmetry" +msgstr "Simetria horitzontal" + +#: FMain.class:276 +msgid "Options" +msgstr "Opcions" + +#: FMain.class:272 +msgid "Select the Count of Neighbours where a cell will die or keep its state." +msgstr "Seleccioneu el comptatge de veïns on una cèŀlula morirà o mantindrà el seu estat." + +#: FMain.class:280 +msgid "Set here the probability that a Cell will be born or not when you spawn the first Generation." +msgstr "Ajusteu aquí la probabilitat de que una ceŀlula neixi o no quan s'engendra la primera generació." + +#: FMain.class:307 +msgid "Small generation" +msgstr "Generació petita" + +#: FMain.class:176 +msgid "Spawn First Generation" +msgstr "Engendra la primera generació" + +#: FMain.class:194 +msgid "Start Evolution" +msgstr "Inicia l'evolució" + +#: FMain.class:206 +msgid "Survival" +msgstr "Supervivència" + +#: FMain.class:136 +msgid "The Game of Life" +msgstr "El Joc de la Vida" + +#: FMain.class:312 +msgid "Vertical symmetry" +msgstr "Simetria vertical" + +#: FMain.class:164 +msgid "" +"Written in Gambas
\n" +"by Iman Karim
\n" +"and Benoît Minisini\n" +"

\n" +"Thanks to the Gambas team!" +msgstr "" +"Escrit al Gambas
\n" +"per Iman Karim
\n" +"i Benoît Minisini\n" +"

\n" +"Gràcies a l'equip del Gambas!" + diff --git a/app/examples/Games/GameOfLife/.lang/cs.po b/app/examples/Games/GameOfLife/.lang/cs.po new file mode 100644 index 00000000..9e616257 --- /dev/null +++ b/app/examples/Games/GameOfLife/.lang/cs.po @@ -0,0 +1,130 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Game of Life" +msgstr "Hra o život" + +#: FMain.class:72 +msgid "Evolution Delay: " +msgstr "Prodleva evoluce: " + +#: FMain.form:37 +msgid "The Game of Life" +msgstr "Hra života" + +#: FMain.form:48 +msgid "GameOfLife" +msgstr "Hra o život" + +#: FMain.form:65 +msgid "" +"Written in Gambas
\n" +"by Iman Karim
\n" +"and Benoît Minisini\n" +"

\n" +"Thanks to the Gambas team!" +msgstr "" +"Napsano v Gambas
\n" +"od Iman Karim
\n" +"a Benoît Minisini\n" +"

\n" +"Díky Gambas týmu!" + +#: FMain.form:78 +msgid "Spawn First Generation" +msgstr "Vyvolat první generace" + +#: FMain.form:96 +msgid "Start Evolution" +msgstr "Start evoluce" + +#: FMain.form:101 +msgid "Evolution Delay: 20ms" +msgstr "Prodleva evoluce: 20ms" + +#: FMain.form:108 +msgid "Survival" +msgstr "Přežití" + +#: FMain.form:112 +msgid "8 Neighbours" +msgstr "8 sousedů" + +#: FMain.form:119 +msgid "7 Neighbours" +msgstr "7 sousedů" + +#: FMain.form:126 +msgid "6 Neighbours" +msgstr "6 sousedů" + +#: FMain.form:133 +msgid "5 Neighbours" +msgstr "5 sousedů" + +#: FMain.form:140 +msgid "4 Neighbours" +msgstr "4 sousedé" + +#: FMain.form:147 +msgid "3 Neighbours" +msgstr "3 sousedé" + +#: FMain.form:153 +msgid "2 Neighbours" +msgstr "2 sousedé" + +#: FMain.form:160 +msgid "1 Neighbour" +msgstr "1 soused" + +#: FMain.form:167 +msgid "0 Neighbour" +msgstr "0 sousedů" + +#: FMain.form:174 +msgid "Select the Count of Neighbours where a cell will die or keep its state." +msgstr "Vyberte počet sousedů, kde buňka zemře nebo si ponechá svůj stav." + +#: FMain.form:178 +msgid "Options" +msgstr "Možnosti" + +#: FMain.form:182 +msgid "Set here the probability that a Cell will be born or not when you spawn the first Generation." +msgstr "Nastavte zde pravděpodobnost, že se buňky narodí, nebo ne, když se Vám vyvolá první generace." + +#: FMain.form:193 +msgid "Alive" +msgstr "Naživu" + +#: FMain.form:198 +msgid "Dead" +msgstr "Mrtvý" + +#: FMain.form:204 +msgid "Draw cell borders" +msgstr "Kreslení okrajů buněk" + +#: FMain.form:209 +msgid "Small generation" +msgstr "Malé generace" + +#: FMain.form:214 +msgid "Vertical symmetry" +msgstr "Vertikální symetrie" + +#: FMain.form:219 +msgid "Horizontal symmetry" +msgstr "Horizontální symetrie" diff --git a/app/examples/Games/GameOfLife/.lang/de.po b/app/examples/Games/GameOfLife/.lang/de.po new file mode 100644 index 00000000..ab364aa0 --- /dev/null +++ b/app/examples/Games/GameOfLife/.lang/de.po @@ -0,0 +1,121 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Game of Life" +msgstr "Spiel des Lebens" + +#: FMain.class:72 +msgid "Evolution Delay: " +msgstr "Evolutionsspanne: " + +#: FMain.form:37 +msgid "The Game of Life" +msgstr "Spiel des Lebens" + +#: FMain.form:48 +msgid "GameOfLife" +msgstr "-" + +#: FMain.form:65 +msgid "Written in Gambas
\nby Iman Karim
\nand Benoît Minisini\n

\nThanks to the Gambas team!" +msgstr "Geschrieben in Gambas
\nvon Iman Karim
\nund Benoît Minisini\n

\nDanke an das Gambas team!" + +#: FMain.form:78 +msgid "Spawn First Generation" +msgstr "Erste Generation erzeugen" + +#: FMain.form:96 +msgid "Start Evolution" +msgstr "Evolution starten" + +#: FMain.form:101 +msgid "Evolution Delay: 20ms" +msgstr "Evolutionsspanne: 20ms" + +#: FMain.form:108 +msgid "Survival" +msgstr "Überleben" + +#: FMain.form:112 +msgid "8 Neighbours" +msgstr "8 Nachbarn" + +#: FMain.form:119 +msgid "7 Neighbours" +msgstr "7 Nachbarn" + +#: FMain.form:126 +msgid "6 Neighbours" +msgstr "6 Nachbarn" + +#: FMain.form:133 +msgid "5 Neighbours" +msgstr "5 Nachbarn" + +#: FMain.form:140 +msgid "4 Neighbours" +msgstr "4 Nachbarn" + +#: FMain.form:147 +msgid "3 Neighbours" +msgstr "3 Nachbarn" + +#: FMain.form:153 +msgid "2 Neighbours" +msgstr "2 Nachbarn" + +#: FMain.form:160 +msgid "1 Neighbour" +msgstr "1 Nachbar" + +#: FMain.form:167 +msgid "0 Neighbour" +msgstr "0 Nachbarn" + +#: FMain.form:174 +msgid "Select the Count of Neighbours where a cell will die or keep its state." +msgstr "Wähle die Anzahl der Nachbarn, wann eine Zelle stirbt." + +#: FMain.form:178 +msgid "Options" +msgstr "Optionen" + +#: FMain.form:182 +msgid "Set here the probability that a Cell will be born or not when you spawn the first Generation." +msgstr "Wahrscheinlichkeit, dass eine Zelle geboren wird, wenn du die erste Generation erzeugst." + +#: FMain.form:193 +msgid "Alive" +msgstr "Lebend" + +#: FMain.form:198 +msgid "Dead" +msgstr "Tot" + +#: FMain.form:204 +msgid "Draw cell borders" +msgstr "Zellengrenzen zeichnen" + +#: FMain.form:209 +msgid "Small generation" +msgstr "Kleine Generation" + +#: FMain.form:214 +msgid "Vertical symmetry" +msgstr "Vertikale Symmetrie" + +#: FMain.form:219 +msgid "Horizontal symmetry" +msgstr "Horizontale Symmetrie" + diff --git a/app/examples/Games/GameOfLife/.lang/ru.po b/app/examples/Games/GameOfLife/.lang/ru.po new file mode 100644 index 00000000..d040922a --- /dev/null +++ b/app/examples/Games/GameOfLife/.lang/ru.po @@ -0,0 +1,158 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Games/GameOfLife/.project:18 +msgid "Game of Life" +msgstr "Игра жизни" + +#: app/examples/Games/GameOfLife/.project:19 +msgid "" +"The Game Of Life.\n" +"\n" +"This example runs the Game Of Life cellular automaton. It allows to define many parameters of the automaton." +msgstr "" +"Игра жизни\n" +"\n" +"Этот пример запускает клеточный автомат игры жизни. Это позволяет определить многие параметры автомата." + +#: app/examples/Games/GameOfLife/.src/FMain.class:72 +msgid "Evolution Delay: " +msgstr "Задержка эволюции: " + +#: app/examples/Games/GameOfLife/.src/FMain.class:72 +msgid "ms" +msgstr "мс" + +#: app/examples/Games/GameOfLife/.src/FMain.form:5 app/examples/Games/GameOfLife/.src/FMain.form:18 +msgid "The Game of Life" +msgstr "Игра жизни" + +#: app/examples/Games/GameOfLife/.src/FMain.form:14 +msgid "GameOfLife" +msgstr "Игра жизни" + +#: app/examples/Games/GameOfLife/.src/FMain.form:28 +msgid "" +"Written in Gambas
\n" +"by Iman Karim
\n" +"and Benoît Minisini\n" +"

\n" +"Thanks to the Gambas team!" +msgstr "" +"Написано в Gambas
\n" +"Иман Каримом
\n" +"и Бенуа Минисини\n" +"

\n" +"Спасибо команде Gambas!" + +#: app/examples/Games/GameOfLife/.src/FMain.form:39 +msgid "Spawn First Generation" +msgstr "Породить первое поколение" + +#: app/examples/Games/GameOfLife/.src/FMain.form:55 +msgid "Start Evolution" +msgstr "Начать эволюцию" + +#: app/examples/Games/GameOfLife/.src/FMain.form:59 +msgid "Evolution Delay: 20ms" +msgstr "Задержка эволюции: 20мс" + +#: app/examples/Games/GameOfLife/.src/FMain.form:65 +msgid "Survival" +msgstr "Выживание" + +#: app/examples/Games/GameOfLife/.src/FMain.form:68 +msgid "8 Neighbours" +msgstr "8 соседей" + +#: app/examples/Games/GameOfLife/.src/FMain.form:74 +msgid "7 Neighbours" +msgstr "7 соседей" + +#: app/examples/Games/GameOfLife/.src/FMain.form:80 +msgid "6 Neighbours" +msgstr "6 соседей" + +#: app/examples/Games/GameOfLife/.src/FMain.form:86 +msgid "5 Neighbours" +msgstr "5 соседей" + +#: app/examples/Games/GameOfLife/.src/FMain.form:92 +msgid "4 Neighbours" +msgstr "4 соседа" + +#: app/examples/Games/GameOfLife/.src/FMain.form:98 +msgid "3 Neighbours" +msgstr "3 соседа" + +#: app/examples/Games/GameOfLife/.src/FMain.form:103 +msgid "2 Neighbours" +msgstr "2 соседа" + +#: app/examples/Games/GameOfLife/.src/FMain.form:109 +msgid "1 Neighbour" +msgstr "1 сосед" + +#: app/examples/Games/GameOfLife/.src/FMain.form:115 +msgid "0 Neighbour" +msgstr "0 соседей" + +#: app/examples/Games/GameOfLife/.src/FMain.form:121 +msgid "Select the Count of Neighbours where a cell will die or keep its state." +msgstr "Выбрать количество соседей, где клетка умрёт или сохранит своё состояние." + +#: app/examples/Games/GameOfLife/.src/FMain.form:125 +msgid "Options" +msgstr "Опции" + +#: app/examples/Games/GameOfLife/.src/FMain.form:128 +msgid "Set here the probability that a Cell will be born or not when you spawn the first Generation." +msgstr "Установить здесь вероятность того, что клетка родится или нет, когда вы породите первое поколение." + +#: app/examples/Games/GameOfLife/.src/FMain.form:137 +msgid "Alive" +msgstr "Жив" + +#: app/examples/Games/GameOfLife/.src/FMain.form:141 +msgid "Dead" +msgstr "Мёртв" + +#: app/examples/Games/GameOfLife/.src/FMain.form:146 +msgid "Draw cell borders" +msgstr "Границы клетки" + +#: app/examples/Games/GameOfLife/.src/FMain.form:150 +msgid "Small generation" +msgstr "Малое поколение" + +#: app/examples/Games/GameOfLife/.src/FMain.form:154 +msgid "Vertical symmetry" +msgstr "Вертикал. симметрия" + +#: app/examples/Games/GameOfLife/.src/FMain.form:158 +msgid "Horizontal symmetry" +msgstr "Горизонт. симметрия" + diff --git a/app/examples/Games/GameOfLife/.project b/app/examples/Games/GameOfLife/.project new file mode 100644 index 00000000..250cecc3 --- /dev/null +++ b/app/examples/Games/GameOfLife/.project @@ -0,0 +1,17 @@ +# Gambas Project File 3.0 +Title=Game of Life +Startup=FMain +Icon=glob2-icon-48x48.png +Version=1.0.0 +Component=gb.image +Component=gb.gui +Description="The Game Of Life.\n\nThis example runs the Game Of Life cellular automaton. It allows to define many parameters of the automaton." +TabSize=2 +Translate=1 +Language=en +Maintainer=benoit +Vendor=Example +Address=benoit@localhost +License=General Public Licence +Packager=1 +Tags=Example diff --git a/app/examples/Games/GameOfLife/.src/CGameField.class b/app/examples/Games/GameOfLife/.src/CGameField.class new file mode 100644 index 00000000..3f998436 --- /dev/null +++ b/app/examples/Games/GameOfLife/.src/CGameField.class @@ -0,0 +1,236 @@ +' Gambas class file + +Fast + +'PRIVATE Game AS Boolean[] +Private Game As New Image +Private MaxX As Integer +Private MaxY As Integer +Private dW As DrawingArea +Private $iZoom As Integer + +Public Function Init(bSmall As Boolean, iLife As Integer, bSymetryH As Boolean, bSymetryV As Boolean) As Integer + + Dim i, j, n, size As Integer + + Randomize + + $iZoom = 3 + MaxX = dw.W \ $iZoom - 3 + MaxY = dw.H \ $iZoom - 3 + + 'Game = NEW Boolean[MaxX + 1, MaxY + 1] + Game = New Image(MaxX + 1, MaxY + 1) + Game.Fill(Color.White) + + If bSmall Then + + size = 12 + + For i = MaxX \ 2 - size To MaxX \ 2 + size + For j = MaxY \ 2 - size To MaxY \ 2 + size + If Rnd(1, 100) >= iLife Then Game[i, j] = Color.Red + Next + Next + + If bSymetryH Then + For i = MaxX \ 2 - size To MaxX \ 2 + size + n = size * 2 + 1 + For j = MaxY \ 2 - size To MaxY \ 2 + Game[i, j] = Game[i, j + n] + n -= 2 + Next + Next + Endif + + If bSymetryV Then + For i = MaxX \ 2 - size To MaxX \ 2 + size + n = size * 2 + 1 + For j = MaxY \ 2 - size To MaxY \ 2 + Game[j, i] = Game[j + n, i] + n -= 2 + Next + Next + Endif + + Else + + For i = 0 To MaxX + For j = 0 To MaxY + If Rnd(1, 100) >= iLife Then Game[i, j] = Color.Red + Next + Next + + Endif + + 'PRINT MaxX + 1;; "x";; MaxY + 1; " game" + +End + +Public Sub SetDrawArea(pdW As DrawingArea) + + dW = pdW + +End + +Public Sub DrawGame(bBorder As Boolean) + + Dim SquareSize As Integer + + 'IF GameRow.Count = 0 OR GameRow[1].Count = 0 THEN RETURN -1 + + SquareSize = 4 'dw.Height / GameRow.Count + + Draw.Begin(dw) + + 'Draw.FillStyle = Fill.Solid + 'Draw.LineStyle = Line.None + 'Draw.FillColor = Color.LightBackground + 'Draw.Rect(4, 4, Game.Width * $iZoom, Game.Height * $iZoom) + + If bBorder Then + Draw.LineStyle = Line.Solid + Else + 'Draw.FillRect(0, 0, dw.W, dw.H, Color.Background) + Draw.LineStyle = Line.None + Endif + + Draw.FillColor = Color.Red + Draw.Foreground = Color.LightBackground + + Draw.Zoom(Game, $iZoom, 4, 4) + + Draw.End + +End + +Private Function CountNeighboursOnBorder(x As Integer, y As Integer) As Integer + + Dim iTot As Integer + Dim i, j, ti, tj As Integer + + For i = x - 1 To x + 1 + If i < 0 Then + ti = MaxX + Else If i > MaxX Then + ti = 0 + Else + ti = i + Endif + For j = y - 1 To y + 1 + If j < 0 Then + tj = MaxY + Else If j > MaxY Then + tj = 0 + Else + tj = j + Endif + iTot += Game[ti, tj] + 'IF Game[ti, tj] = Color.Red THEN INC count + Next + Next + + iTot = iTot - Game[x, y] - Color.White * 8 + + Return iTot \ (Color.Red - Color.White) + +End + +' Private Function CountNeighbours(x As Integer, y As Integer) As Integer +' +' Dim iTot As Integer +' +' iTot = Game[x - 1, y - 1] + Game[x, y - 1] + Game[x + 1, y - 1] + +' Game[x - 1, y] + Game[x + 1, y] + +' Game[x - 1, y + 1] + Game[x, y + 1] + Game[x + 1, y + 1] +' +' iTot -= Color.White * 8 +' 'DEBUG iTot / (Color.Red - Color.Background) +' Return iTot \ (Color.Red - Color.White) +' +' End + +Public Sub SpawnNextGeneration(Live As Boolean[], Keep As Boolean[]) + + Dim x As Integer + Dim y As Integer + Dim myCount As Integer + Dim newGame As Image + Dim myCountSub As Integer = Color.White * 8 + + newgame = Game.Copy() + + For x = 1 To MaxX - 1 + For y = 1 To MaxY - 1 + + 'myCount = CountNeighbours(x, y) + + myCount = Game[x - 1, y - 1] + Game[x, y - 1] + Game[x + 1, y - 1] + + Game[x - 1, y] + Game[x + 1, y] + + Game[x - 1, y + 1] + Game[x, y + 1] + Game[x + 1, y + 1] + + myCount -= myCountSub + myCount \= (Color.Red - Color.White) + + If keep[myCount] Then Continue + If live[myCount] + newGame[x, y] = Color.Red + Else + newGame[x, y] = Color.White + Endif + Next + Next + + For x = 0 To MaxX + y = 0 + myCount = CountNeighboursOnBorder(x, y) + If Not keep[myCount] Then + If live[myCount] + newGame[x, y] = Color.Red + Else + newGame[x, y] = Color.White + Endif + Endif + y = MaxY + myCount = CountNeighboursOnBorder(x, y) + If keep[myCount] Then Continue + If live[myCount] + newGame[x, y] = Color.Red + Else + newGame[x, y] = Color.White + Endif + Next + + For y = 1 To MaxY - 1 + x = 0 + myCount = CountNeighboursOnBorder(x, y) + If Not keep[myCount] Then + If live[myCount] + newGame[x, y] = Color.Red + Else + newGame[x, y] = Color.White + Endif + Endif + x = MaxX + myCount = CountNeighboursOnBorder(x, y) + If keep[myCount] Then Continue + If live[myCount] + newGame[x, y] = Color.Red + Else + newGame[x, y] = Color.White + Endif + Next + ' IF Rnd < 0.1 THEN + ' x = Int(Rnd(0, MaxX - 30)) + ' y = Int(Rnd(0, MaxY - 30)) + ' FOR i = x TO x + 29 + ' FOR j = y TO y + 29 + ' newGame[i, j] = Rnd(1, 100) >= FMain.Slider2.Value + ' NEXT + ' NEXT + ' ENDIF + + Game = newGame + +End + diff --git a/app/examples/Games/GameOfLife/.src/FMain.class b/app/examples/Games/GameOfLife/.src/FMain.class new file mode 100644 index 00000000..50bcfc24 --- /dev/null +++ b/app/examples/Games/GameOfLife/.src/FMain.class @@ -0,0 +1,95 @@ +' Gambas class file + +Private Game As New CGameField + +Private Sub DrawGame() + + Game.DrawGame(chkBorder.Value) + +End + + +Public Sub Form_Open() + + 'System.Profile = False + 'Randomize 1972 + Button1_Click + Slider1_Change + 'togEvolution.Value = True + +End + +Public Sub Button1_Click() + + Game.SetDrawArea(dwgGame) + Game.Init(chkSmall.Value, Slider2.Value, chkSymetryH.Value, chkSymetryV.Value) + DrawGame + +End + +Public Sub Button2_Click() + + tmrEvolution_Timer + 'Game.SpawnNextGeneration + 'DrawGame + +End + +Public Sub tmrEvolution_Timer() + + Dim Live As New Boolean[9] + Dim Keep As New Boolean[9] + + If Not togEvolution.Value Then Return + + live[0] = chkZero.Value = CheckBox.False + live[1] = chkOne.Value = CheckBox.False + live[2] = chkTwo.Value = CheckBox.False + live[3] = chkThree.Value = CheckBox.False + live[4] = chkFour.Value = CheckBox.False + live[5] = chkFive.Value = CheckBox.False + live[6] = chkSix.Value = CheckBox.False + live[7] = chkSeven.Value = CheckBox.False + live[8] = chkEight.Value = CheckBox.False + + keep[0] = chkZero.Value = CheckBox.None + keep[1] = chkOne.Value = CheckBox.None + keep[2] = chkTwo.Value = CheckBox.None + keep[3] = chkThree.Value = CheckBox.None + keep[4] = chkFour.Value = CheckBox.None + keep[5] = chkFive.Value = CheckBox.None + keep[6] = chkSix.Value = CheckBox.None + keep[7] = chkSeven.Value = CheckBox.None + keep[8] = chkEight.Value = CheckBox.None + + Game.SpawnNextGeneration(Live, Keep) + DrawGame + +End + +Public Sub Slider1_Change() + + lblDelay.Caption = ("Evolution Delay: ") & Str(slider1.Value) & ("ms") + tmrEvolution.Delay = slider1.Value + +End + +Public Sub chkBorder_Click() + + If Not togEvolution.Value Then + DrawGame + Endif + +End + +Public Sub togEvolution_Click() + + tmrEvolution.Enabled = togEvolution.Value + +End + +' PUBLIC SUB dW_Draw() +' +' Game.DrawGame(chkBorder.Value) +' +' END diff --git a/app/examples/Games/GameOfLife/.src/FMain.form b/app/examples/Games/GameOfLife/.src/FMain.form new file mode 100644 index 00000000..f2cf88ac --- /dev/null +++ b/app/examples/Games/GameOfLife/.src/FMain.form @@ -0,0 +1,162 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,125,95) + Text = ("The Game of Life") + Icon = Picture["glob2-icon-48x48.png"] + Resizable = False + { Panel1 Panel + MoveScaled(1,1,29,23) + Border = Border.Plain + { Label3 Label + MoveScaled(1,1,19,4) + Font = Font["Bold,+2"] + Text = ("GameOfLife") + } + { Label7 Label + MoveScaled(1,4,19,4) + Text = ("The Game of Life") + Alignment = Align.Left + } + { PictureBox1 PictureBox + MoveScaled(20,1,8,8) + Picture = Picture["glob2-icon-48x48.png"] + } + { Label4 TextLabel + MoveScaled(1,10,26,12) + Font = Font["-1"] + Text = ("Written in Gambas
\nby Iman Karim
\nand Benoît Minisini\n

\nThanks to the Gambas team!") + } + } + { dwgGame DrawingArea + MoveScaled(31,1,93,93) + Background = &HFFFFFF& + Border = Border.Plain + Cached = True + } + { Button1 Button + MoveScaled(1,26,29,6) + Text = ("Spawn First Generation") + } + { Slider1 Slider + MoveScaled(1,44,29,4) + MinValue = 20 + MaxValue = 1000 + Step = 10 + PageStep = 50 + Value = 20 + } + { tmrEvolution #Timer + #MoveScaled(39,20) + Delay = 300 + } + { togEvolution ToggleButton + MoveScaled(1,33,29,6) + Text = ("Start Evolution") + } + { lblDelay TextLabel + MoveScaled(1,39,29,6) + Text = ("Evolution Delay: 20ms") + } + { TabStrip1 TabStrip + MoveScaled(1,49,29,45) + Count = 2 + Index = 0 + Text = ("Survival") + { chkEight CheckBox + MoveScaled(2,36,25,3) + Text = ("8 Neighbours") + Tristate = True + Value = CheckBox.True + } + { chkSeven CheckBox + MoveScaled(2,33,25,3) + Text = ("7 Neighbours") + Tristate = True + Value = CheckBox.True + } + { chkSix CheckBox + MoveScaled(2,30,25,3) + Text = ("6 Neighbours") + Tristate = True + Value = CheckBox.True + } + { chkFive CheckBox + MoveScaled(2,27,25,3) + Text = ("5 Neighbours") + Tristate = True + Value = CheckBox.True + } + { chkFour CheckBox + MoveScaled(2,24,25,3) + Text = ("4 Neighbours") + Tristate = True + Value = CheckBox.True + } + { chkThree CheckBox + MoveScaled(2,21,25,3) + Text = ("3 Neighbours") + Tristate = True + } + { chkTwo CheckBox + MoveScaled(2,18,25,3) + Text = ("2 Neighbours") + Tristate = True + Value = CheckBox.None + } + { chkOne CheckBox + MoveScaled(2,15,25,3) + Text = ("1 Neighbour") + Tristate = True + Value = CheckBox.True + } + { chkZero CheckBox + MoveScaled(2,12,25,3) + Text = ("0 Neighbour") + Tristate = True + Value = CheckBox.True + } + { TextLabel1 TextLabel + MoveScaled(1,1,25,10) + Text = ("Select the Count of Neighbours where a cell will die or keep its state.") + Alignment = Align.Top + } + Index = 1 + Text = ("Options") + { TextLabel3 TextLabel + MoveScaled(1,1,26,12) + Text = ("Set here the probability that a Cell will be born or not when you spawn the first Generation.") + Alignment = Align.Top + } + { Slider2 Slider + MoveScaled(1,14,25,4) + Value = 50 + } + { Label1 Label + MoveScaled(1,18,7,3) + Text = ("Alive") + } + { Label2 Label + MoveScaled(19,18,7,3) + Text = ("Dead") + Alignment = Align.Right + } + { chkBorder CheckBox + MoveScaled(1,36,26,4) + Text = ("Draw cell borders") + } + { chkSmall CheckBox + MoveScaled(1,24,26,4) + Text = ("Small generation") + } + { chkSymetryV CheckBox + MoveScaled(1,32,26,4) + Text = ("Vertical symmetry") + } + { chkSymetryH CheckBox + MoveScaled(1,28,26,4) + Text = ("Horizontal symmetry") + } + Index = 0 + } +} diff --git a/app/examples/Games/GameOfLife/glob2-icon-48x48.png b/app/examples/Games/GameOfLife/glob2-icon-48x48.png new file mode 100644 index 0000000000000000000000000000000000000000..5ab8fccb1727f6c93db8e5488cc8ac2d0f4ca335 GIT binary patch literal 3390 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 $aEnemies[$aEnemies.Max].Y Or If iY < $aEnemies[0].Y Then Return Null + For iInd = 0 To $aEnemies.Max + If iY = $aEnemies[iInd].Y Then Break + Next + For iInd = iInd To $aEnemies.Max + If iY <> $aEnemies[iInd].Y Then Break + ' The ship look strings have spaces around them but a 'hit' is + ' only to hit the ship, not the spaces ;-) + If iX > $aEnemies[iInd].X And If iX < $aEnemies[iInd].X + $aEnemies[iInd].Width - 1 Then Return $aEnemies[iInd] + Next + Return Null +End + +Public Sub Enemy_Destroyed() + Dim iInd, iJ As Integer + Dim iAdd As Integer + Dim hEnemy As Enemy + Dim iShift As Integer = 0 + + ' Higher level ships crumble into lower level ones >:-) + iInd = $aEnemies.FindByRef(Last) + $aEnemies.Remove(iInd) + Last.Undraw() + iAdd = Last.Type - 1 + If Not iAdd Then Goto _Out + ' Insert the new ships directly where the destroyed one was + ' shifting all successors forward which is even more diabolic + For iJ = 0 To iAdd + hEnemy = New Enemy(Last.Type - 1) As "Enemy" + hEnemy.Init($hWnd, Last.Shifted + iShift) + $aEnemies.Add(hEnemy, iInd + iJ) + iShift += hEnemy.Width + Next + For iInd = iInd + iAdd + 1 To $aEnemies.Max + $aEnemies[iInd].Move(iShift - Last.Width) + Next +_Out: + If $aEnemies.Count = 0 Then Raise Triumph +End + +Public Sub Enemy_SuperDestroyed() + $aEnemies.Remove($aEnemies.FindByRef(Last)) + Last.Undraw() + If $aEnemies.Count = 0 Then Raise Triumph +End + +Public Sub PlayerDestroyed() + Raise GameOver +End + +Public Sub Draw() + Dim hEnemy As Enemy + + For Each hEnemy In $aEnemies + hEnemy.Draw() + Next +End diff --git a/app/examples/Games/Invaders/.src/Enemy.class b/app/examples/Games/Invaders/.src/Enemy.class new file mode 100644 index 00000000..8e83aaa7 --- /dev/null +++ b/app/examples/Games/Invaders/.src/Enemy.class @@ -0,0 +1,161 @@ +' Gambas class file + +' Types in ascending difficulty +Public Enum Normal = 1, Tough, Borg, BorgQueen +' See looking strings below +Public Const AverageWidth As Integer = 5 + +Property X As Integer +Property Y As Integer +'' Shift distance from 0,0 (may *not* equal Y * Window.Width + X) +Property Read Shifted As Integer +Property Read Width As Integer +Property Read Type As Integer + +Event Destroyed +Event SuperDestroyed + +Private $iType As Integer +Private $sLook As String +Private $iWidth As Integer +Private $iColor As Integer + +Private $hWnd As Window +Private $iX As Integer +Private $iY As Integer +Private $iShifted As Integer + +Public Sub _new(Optional iType As Integer) + ' Calculate a fair share of enemies + If Not iType Then + Select Case CInt(Rnd(0, 100)) + Case 0 To 69 + iType = Normal + Case 70 To 94 + iType = Tough + Case 95 To 98 + iType = Borg + Case 99 + iType = BorgQueen + End Select + Endif + Select Case iType + Case Normal + $sLook = " -o- " + $iColor = Color.Green + Case Tough + $sLook = " ,^, " + $iColor = Color.Cyan + Case Borg + $sLook = " [%] " + $iColor = Color.Magenta + Case BorgQueen + $sLook = " " + $iColor = Color.Red + End Select + $iWidth = Len($sLook) + $iType = iType +End + +Public Sub Init(hWnd As Window, Optional iShift As Integer) + $hWnd = hWnd + $iX = 0 + $iY = 0 + $iShifted = 0 + If iShift Then Shift(iShift) +End + +Public Sub Draw() + $hWnd.Print($sLook, $iX, $iY,, Pair[$iColor, $hWnd.Background]) +End + +Public Sub Undraw() + $hWnd.Print(Space$($iWidth), $iX, $iY) +End + +Public Sub Move(Optional iShift As Integer = 1) + Undraw() + Shift(iShift) + '' FIXME: Value is arbitrary but works kind of + If CInt(Rnd(0, 2000)) = 0 Then + ' Resistance is futile + Missiles.Shoot(Missile.Borg, $iX, $iY + 1) + Endif +End + +'' Shift this ship some places in its row (probably into some other row). +'' Even very huge values are supported. +'' +'' The mathematics in this function should guarantee that no ship ever +'' covers another (accidentally) and that they always stay togehter +'' tightly. +Public Sub Shift(iShift As Integer) + Dim iCur As Integer + + $iShifted += iShift + While iShift <> 0 + ' Handle one row at max at a time + If iShift > $hWnd.Width Then + iCur = $hWnd.Width + Else + iCur = iShift + Endif + iShift -= iCur + ' All even rows go to the right, all odd lines to the left + Select Case $iY % 2 + Case 0 + $iX += iCur + If $iX + $iWidth >= $hWnd.Width Then + ' Goes to an odd row, must start at the end of the row + While $iX + $iWidth >= $hWnd.Width + $iX = ($iX + $iWidth) % $hWnd.Width + Wend + $iX = $hWnd.Width - $iX - $iWidth + Inc $iY + Endif + Case 1 + $iX -= iCur + If $iX < 0 Then + ' Goes to an even row, must start at the beginning + $iX = (- $iX) % $hWnd.Width + Inc $iY + Endif + End Select + Wend +End + +Public Sub Destroy() + Raise Destroyed +End + +Public Sub SuperDestroy() + Raise SuperDestroyed +End + +Private Function X_Read() As Integer + Return $iX +End + +Private Sub X_Write(Value As Integer) + $iX = Value +End + +Private Function Y_Read() As Integer + Return $iY +End + +Private Sub Y_Write(Value As Integer) + $iY = Value +End + +Private Function Width_Read() As Integer + Return $iWidth +End + +Private Function Type_Read() As Integer + Return $iType +End + +Private Function Shifted_Read() As Integer + Return $iShifted +End diff --git a/app/examples/Games/Invaders/.src/MMain.module b/app/examples/Games/Invaders/.src/MMain.module new file mode 100644 index 00000000..7cde3c93 --- /dev/null +++ b/app/examples/Games/Invaders/.src/MMain.module @@ -0,0 +1,139 @@ +' Gambas module file + +' TODO: Make real setup for playing +' TODO: There is an occasional flickering when shooting and the ships are already near the player and few + +Public X As Integer +Public Y As Integer +' Hardcoded corresponding to the strings in Draw() below! +Public Width As Integer = 3 +Public Height As Integer = 2 + +Private $hEnemies As Timer +Private $hMissiles As Timer + +Public Sub Main() + ' Debug aid. Watch /tmp/pipe with "tail -f" + ' Dim hPipe As Stream + ' + ' hPipe = Pipe "/tmp/pipe" For Write + ' Error To #hPipe + + Screen.Cursor = Cursor.Hidden + Screen.Echo = False + Window.Attributes = Attr.Bold + Object.Attach(Window, Me, "Window") + Window.SetFocus() + + X = (Window.Width - Width) \ 2 + Y = Window.Height - Height + + Object.Attach(Enemies, Me, "Enemies") + + Draw() + ' Populate ca. 1/3 of the screen with enemies. It will actually look more + ' because of the enemy arrangement. But that's good :-) + Enemies.Init(Window, Window.Width * Window.Height / 3 / Enemy.AverageWidth) + Missiles.Init(Window) + Window.Buffered = True + + $hEnemies = New Timer As "Enemies" + ' TODO: The Timers are made for a 80*24 terminal. + ' Make it 100 and you'll likely win, 75 really depends on the amount of Borg for me... + $hEnemies.Delay = 75 + $hMissiles = New Timer As "Missiles" + $hMissiles.Delay = 50 + + $hEnemies.Start() + $hMissiles.Start() +End + +Public Sub Window_Read() + Select Window.Read() + ' Navigate left/right + Case Key.Left + If X = 0 Then Return + Undraw() + Dec X + Draw() + Case Key.Right + If X + Width >= Window.Width Then Return + Undraw() + Inc X + Draw() + ' Navigate up/down + Case Key.Up + If Y <= 0 Then Return + Undraw() + Dec Y + Draw() + Case Key.Down + If Y >= Window.Height - Height Then Return + Undraw() + Inc Y + Draw() + ' Shoot normal missile + Case Key[" "] + Missiles.Shoot(Missile.Normal, X, Y - 1) + 'If Not $hMissiles.Enabled Then $hMissiles.Start() + ' Shoot super missile + Case Key["v"] + Missiles.Shoot(Missile.Super, X, Y - 1) + 'If Not $hMissiles.Enabled Then $hMissiles.Start + ' Of course, manipulate the timers + Case Key["+"] + $hEnemies.Delay -= 10 + $hMissiles.Delay -= 5 + Case Key["-"] + $hEnemies.Delay += 10 + $hMissiles.Delay += 5 + End Select +End + +Public Sub Enemies_Triumph() + End("TRIUMPH!", Color.Yellow) +End + +Public Sub Enemies_GameOver() + End("GAME OVER!", Color.Blue) +End + +Private Sub End(sMessage As String, iColor As Integer) + $hEnemies.Stop() + $hMissiles.Stop() + '' TODO: The message display is glitchy + Window.Buffered = False + Window.PrintCenter(sMessage,, Pair[iColor, Window.Background]) + '' TODO: What now? Note that the user can still interact at this point... +End + +Private Sub Draw() + Window.Print(" | ", X, Y) + Window.Print("^'^", X, Y + 1) +End + +Private Sub Undraw() + Window.Print(Space$(Width), X, Y) + Window.Print(Space$(Width), X, Y + 1) +End + +Public Sub Enemies_Timer() + Enemies.Move() + If Not $hMissiles.Enabled Then + Enemies.Draw() + Screen.Refresh() + Endif +End + +Public Sub Missiles_Timer() + If Missiles.Move() And Missiles.Count = 0 Then + '$hMissiles.Stop() + Return + Endif + ' Missiles draw at a higher rate so we can safely redraw everything + ' here. Note that, thanks to ncurses' buffering, only the changed + ' parts are redrawn so that there is no overhead in more frequent + ' Screen.Refresh()es here. + Enemies.Draw() + Screen.Refresh() +End diff --git a/app/examples/Games/Invaders/.src/Missile.class b/app/examples/Games/Invaders/.src/Missile.class new file mode 100644 index 00000000..d06f6af0 --- /dev/null +++ b/app/examples/Games/Invaders/.src/Missile.class @@ -0,0 +1,84 @@ +' Gambas class file + +Public Enum Normal, {Super}, Borg + +Property Read Type As Integer + +Event Destroyed + +Private $iType As Integer +Private $sLook As String +Private $iColor As Integer +Private $iDir As Integer + +Private $hWnd As Window +Private $iX As Integer +Private $iY As Integer + +Public Sub _new(iType As Integer, iX As Integer, iY As Integer) + Select Case iType + Case Normal + $sLook = "|" + $iColor = Color.Yellow + $iDir = -1 + Case {Super} + $sLook = "*" + $iColor = Color.Red + $iDir = -1 + Case Borg + $sLook = "*" + $iColor = Color.Green + $iDir = 1 + End Select + $iType = iType + $iX = iX + $iY = iY +End + +Public Sub Init(hWnd As Window) + $hWnd = hWnd +End + +Public Function Move() As Boolean + Dim hEnemy As Enemy + + Undraw() + $iY += $iDir + If $iType <> Borg Then + hEnemy = Enemies.Hit($iX, $iY) + If hEnemy Then + If $iType = Normal Then + hEnemy.Destroy() + Else + hEnemy.SuperDestroy() + Draw() + Endif + Raise Destroyed + Return True + Endif + Else + If $iY >= MMain.Y And If $iY < MMain.Y + MMain.Height And If + $iX >= MMain.X And If $iX < MMain.X + MMain.Width Then + Enemies.PlayerDestroyed() + Draw() + Endif + Endif + If $iY = -1 Or $iY = $hWnd.Height Then + Raise Destroyed + Return True + Endif + Draw() + Return False +End + +Public Sub Draw() + Window.Print($sLook, $iX, $iY,, Pair[$iColor, $hWnd.Background]) +End + +Public Sub Undraw() + Window.Print(" ", $iX, $iY) +End + +Private Function Type_Read() As Integer + Return $iType +End diff --git a/app/examples/Games/Invaders/.src/Missiles.class b/app/examples/Games/Invaders/.src/Missiles.class new file mode 100644 index 00000000..1219bfb8 --- /dev/null +++ b/app/examples/Games/Invaders/.src/Missiles.class @@ -0,0 +1,65 @@ +' Gambas class file + +Create Static + +'' Maximum number of missiles concurrently displayed +Public Const MaxMissiles As Integer = 3 + +Property Read Count As Integer + +Private $aMissiles As Missile[] +Private $hWnd As Window +Private $iCount As Integer + +Public Sub _new() + $aMissiles = New Missile[] + $iCount = 0 +End + +Public Sub Init(hWnd As Window) + $hWnd = hWnd +End + +Public Function Move() As Boolean + Dim hMissile As Missile + Dim bRes As Boolean = False + + For Each hMissile In $aMissiles + bRes = bRes Or hMissile.Move() + Next + Return bRes +End + +Public Sub Shoot(iType As Integer, iX As Integer, iY As Integer) + Dim hMissile As Missile + + Select Case iType + Case Missile.Normal + ' Consumes one missile + If $iCount >= MaxMissiles Then Return + Inc $iCount + Case Missile.Super + ' Consumes all missiles + If $iCount Then Return + $iCount = MaxMissiles + Case Missile.Borg + ' Consumes none of the (player's) missiles + End Select + hMissile = New Missile(iType, iX, iY) As "Missile" + hMissile.Init($hWnd) + $aMissiles.Add(hMissile) +End + +Public Sub Missile_Destroyed() + Last.Undraw() + $aMissiles.Remove($aMissiles.FindByRef(Last)) + If Last.Type = Missile.Normal Then + Dec $iCount + Else If Last.Type = Missile.Super Then + $iCount = 0 + Endif +End + +Private Function Count_Read() As Integer + Return $iCount +End diff --git a/app/examples/Games/Invaders/invaders.png b/app/examples/Games/Invaders/invaders.png new file mode 100644 index 0000000000000000000000000000000000000000..cfad58b988e93f734bb650be4630ac68286af67c GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H$efS0K$$&+xy2q4t+i1(2=p z>Eak7aXC3bfp-Jj1~!3&jy5Jo4o0_YS2j#-k=U`dy@`>TIho@`P$0XJqzePXvzyAh TnC9;RnaAMi>gTe~DWM4fgJd8H literal 0 HcmV?d00001 diff --git a/app/examples/Games/MineSweeper/.directory b/app/examples/Games/MineSweeper/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/app/examples/Games/MineSweeper/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/app/examples/Games/MineSweeper/.hidden/screenshots/2014-12-14.png b/app/examples/Games/MineSweeper/.hidden/screenshots/2014-12-14.png new file mode 100644 index 0000000000000000000000000000000000000000..eb9b09fa6cff0de41ae3a53448ee3113bb68fa60 GIT binary patch literal 48121 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 M07*qoM6N<$f}|9lUH||9 literal 0 HcmV?d00001 diff --git a/app/examples/Games/MineSweeper/.lang/cs.po b/app/examples/Games/MineSweeper/.lang/cs.po new file mode 100644 index 00000000..dece6115 --- /dev/null +++ b/app/examples/Games/MineSweeper/.lang/cs.po @@ -0,0 +1,52 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 FMain.form:24 +msgid "Minesweeper" +msgstr "-" + +#: FMain.form:30 +msgid "&Game" +msgstr "&Hra" + +#: FMain.form:33 +msgid "&Change Game Parameters" +msgstr "&Změna parametrů hry" + +#: FMain.form:38 +msgid "&Quit" +msgstr "&Ukončit" + +#: FSettings.form:21 +msgid "Settings" +msgstr "Nastavení" + +#: FSettings.form:37 +msgid "Width" +msgstr "Výška" + +#: FSettings.form:54 +msgid "Height" +msgstr "Víška" + +#: FSettings.form:71 +msgid "Number of mines" +msgstr "Počet min" + +#: FSettings.form:91 +msgid "OK" +msgstr "-" + +#: FSettings.form:97 +msgid "Cancel" +msgstr "Zrušit" + diff --git a/app/examples/Games/MineSweeper/.lang/ja.po b/app/examples/Games/MineSweeper/.lang/ja.po new file mode 100644 index 00000000..dabdbf68 --- /dev/null +++ b/app/examples/Games/MineSweeper/.lang/ja.po @@ -0,0 +1,53 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: FSettings.form:97 +msgid "Cancel" +msgstr "キャンセル" + +#: FMain.form:26 +msgid "&Change Game Parameters" +msgstr "パラメータを設定(&C)" + +#: FMain.form:23 +msgid "&Game" +msgstr "ゲーム(&G)" + +#: FSettings.form:54 +msgid "Height" +msgstr "縦の長さ" + +#: .project:1 FMain.form:19 +msgid "Minesweeper" +msgstr "マインスイーパ" + +#: FSettings.form:71 +msgid "Number of mines" +msgstr "地雷の数" + +#: FSettings.form:91 +msgid "OK" +msgstr "-" + +#: FMain.form:30 +msgid "&Quit" +msgstr "終了(&Q)" + +#: FSettings.form:21 +msgid "Settings" +msgstr "設定" + +#: FSettings.form:37 +msgid "Width" +msgstr "横の長さ" + diff --git a/app/examples/Games/MineSweeper/.lang/ru.po b/app/examples/Games/MineSweeper/.lang/ru.po new file mode 100644 index 00000000..b07ef7dc --- /dev/null +++ b/app/examples/Games/MineSweeper/.lang/ru.po @@ -0,0 +1,80 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Games/MineSweeper/.project:20 app/examples/Games/MineSweeper/.src/FMain.form:5 +msgid "Minesweeper" +msgstr "Сапёр" + +#: app/examples/Games/MineSweeper/.project:21 +msgid "" +"Minesweeper.\n" +"\n" +"This example is an implementation of the Minesweeper game." +msgstr "" +"Сапёр.\n" +"\n" +"Этот пример является реализацией игры Сапёр." + +#: app/examples/Games/MineSweeper/.src/FMain.form:10 +msgid "Game" +msgstr "Игра" + +#: app/examples/Games/MineSweeper/.src/FMain.form:12 +msgid "Change Game Parameters" +msgstr "Изменить параметры игры" + +#: app/examples/Games/MineSweeper/.src/FMain.form:16 +msgid "Quit" +msgstr "Выход" + +#: app/examples/Games/MineSweeper/.src/FSettings.form:5 +msgid "Settings" +msgstr "Параметры" + +#: app/examples/Games/MineSweeper/.src/FSettings.form:18 +msgid "Width" +msgstr "Ширина" + +#: app/examples/Games/MineSweeper/.src/FSettings.form:32 +msgid "Height" +msgstr "Высота" + +#: app/examples/Games/MineSweeper/.src/FSettings.form:46 +msgid "Number of mines" +msgstr "Количество мин" + +#: app/examples/Games/MineSweeper/.src/FSettings.form:62 +msgid "OK" +msgstr "ОК" + +#: app/examples/Games/MineSweeper/.src/FSettings.form:67 +msgid "Cancel" +msgstr "Отмена" + +#: app/examples/Games/MineSweeper/.src/MineSweeperGame.class:123 +msgid "Index out of bounds" +msgstr "Индекс вне границ" + diff --git a/app/examples/Games/MineSweeper/.lang/zh.po b/app/examples/Games/MineSweeper/.lang/zh.po new file mode 100644 index 00000000..183467dc --- /dev/null +++ b/app/examples/Games/MineSweeper/.lang/zh.po @@ -0,0 +1,52 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: FSettings.form:97 +msgid "Cancel" +msgstr "取消" + +#: FMain.form:26 +msgid "&Change Game Parameters" +msgstr "修改游戏参数(&C)" + +#: FMain.form:23 +msgid "&Game" +msgstr "游戏" + +#: FSettings.form:54 +msgid "Height" +msgstr "高度" + +#: FMain.form:19 .project:1 +msgid "Minesweeper" +msgstr "扫雷" + +#: FSettings.form:71 +msgid "Number of mines" +msgstr "地雷数" + +#: FSettings.form:91 +msgid "OK" +msgstr "确定" + +#: FMain.form:30 +msgid "&Quit" +msgstr "离开(&Q)" + +#: FSettings.form:21 +msgid "Settings" +msgstr "参数设置" + +#: FSettings.form:37 +msgid "Width" +msgstr "宽度" + diff --git a/app/examples/Games/MineSweeper/.lang/zh_TW.po b/app/examples/Games/MineSweeper/.lang/zh_TW.po new file mode 100644 index 00000000..681019e6 --- /dev/null +++ b/app/examples/Games/MineSweeper/.lang/zh_TW.po @@ -0,0 +1,52 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 FMain.form:19 +msgid "Minesweeper" +msgstr "踩地雷" + +#: FMain.form:23 +msgid "&Game" +msgstr "遊戲(&G)" + +#: FMain.form:26 +msgid "&Change Game Parameters" +msgstr "修改遊戲參數(&C)" + +#: FMain.form:30 +msgid "&Quit" +msgstr "離開(&Q)" + +#: FSettings.form:21 +msgid "Settings" +msgstr "設定" + +#: FSettings.form:37 +msgid "Width" +msgstr "寬度" + +#: FSettings.form:54 +msgid "Height" +msgstr "高度" + +#: FSettings.form:71 +msgid "Number of mines" +msgstr "地雷數" + +#: FSettings.form:91 +msgid "OK" +msgstr "確定" + +#: FSettings.form:97 +msgid "Cancel" +msgstr "取消" diff --git a/app/examples/Games/MineSweeper/.project b/app/examples/Games/MineSweeper/.project new file mode 100644 index 00000000..eabe3b13 --- /dev/null +++ b/app/examples/Games/MineSweeper/.project @@ -0,0 +1,19 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.6.90 +Title=Minesweeper +Startup=FMain +Icon=image/expr_win.png +Version=1.0.0 +Component=gb.image +Component=gb.gui +Component=gb.form +Description="Minesweeper.\n\nThis example is an implementation of the Minesweeper game." +Authors="Timothy Lin" +TabSize=3 +Translate=1 +Language=en +Vendor=Example +Packager=1 +Tags=Game,LogicGame +Screenshot=.hidden/screenshots/2014-12-14.png +CreateMenu=1 diff --git a/app/examples/Games/MineSweeper/.src/FMain.class b/app/examples/Games/MineSweeper/.src/FMain.class new file mode 100644 index 00000000..224b4e6a --- /dev/null +++ b/app/examples/Games/MineSweeper/.src/FMain.class @@ -0,0 +1,249 @@ +' Gambas class file + +Private img_cover As Picture = Picture.Load("image/cover.png") +Private img_cover_hovered As Picture = Picture.Load("image/coveron.png") +Private img_false As Picture = Picture.Load("image/false.png") +Private img_flag As Picture = Picture.Load("image/flag.png") +Private img_face_normal As Picture = Picture.Load("image/expr_normal.png") +Private img_face_win As Picture = Picture.Load("image/expr_win.png") +Private img_face_lose As Picture = Picture.Load("image/expr_lose.png") +Private img_face_o As Picture = Picture.Load("image/expr_o.png") +Private img_mine As Picture +Private img_num[10] As Picture + +Private dlgSettings As FSettings = New FSettings + +Private game_width As Integer = 20 +Private game_height As Integer = 15 +Private game_mines As Integer = game_width * game_height / 10 + +Private game As MineSweeperGame +Private blocks As PictureBox[] + +Private play_time As Integer = 0 + +Public Sub _new() + ' img_num[0] is none, img_num[9] is mine + ' img_num[1~8] is the number of adjacent mines + ' load number images + Dim i As Integer + Dim a As Integer[] + img_num[0] = Picture.Load("image/empty.png") + img_num[9] = Picture.Load("image/mine.png") + For i = 1 To 8 + img_num[i] = Picture.Load("image/number_" & Str(i) & ".png") + Next + img_mine = img_num[9] + + btnStatus.Resize(img_face_normal.Width + 10, img_face_normal.Height + 10) + btnStatus.Picture = img_face_normal + + Timer1.Enabled = False +End + +' ----- Window Events ----- + +Public Sub Form_Open() + ReDimGame(game_width, game_height, game_mines) + 'Me.Maximized = True +End + +' Public Sub Form_Resize() +' adjust_components() +' End + +Public Sub Block_MouseDown() + Dim index As Integer = Last.Tag + Dim x As Integer = index Mod game_width + Dim y As Integer = index / game_width + + If Mouse.Left Then + If game.Status = game.GAME_STARTED And game.GetBlockStatus(x, y) = game.BLOCK_COVERED Then + btnStatus.Picture = img_face_o + Endif + Endif +End + + +Public Sub Block_MouseUp() + Dim index As Integer = Last.Tag + Dim x As Integer = index Mod game_width + Dim y As Integer = index / game_width + 'Message("Clicked (" & x & "," & y & ")") + + If game.Status = game.GAME_STARTED Then + btnStatus.Picture = img_face_normal + Endif + + ' Skip the event if the mouse button is released outside the block it is pressed + If Mouse.X > blocks[0, 0].Width Or Mouse.y > blocks[0, 0].Height Then Return + If Mouse.X < 0 Or Mouse.y < 0 Then Return + + If Mouse.Right Then + game.ToggleFlag(x, y) + Else If Mouse.Left Then + game.OpenBlock(x, y) + Endif +End + +' highlight the block under cursor +Public Sub Block_Enter() + Dim index As Integer = Last.Tag + Dim x As Integer = index Mod game_width + Dim y As Integer = index / game_width + + If game.Status = game.GAME_WIN Or game.Status = game.GAME_LOSE Then Return + + If game.GetBlockStatus(x, y) = game.BLOCK_COVERED Then + blocks[x, y].Picture = img_cover_hovered + Endif +End + +' un-highlight the block under cursor +Public Sub Block_Leave() + Dim index As Integer = Last.Tag + Dim x As Integer = index Mod game_width + Dim y As Integer = index / game_width + + If game.Status = game.GAME_WIN Or game.Status = game.GAME_LOSE Then Return + + If game.GetBlockStatus(x, y) = game.BLOCK_COVERED Then + blocks[x, y].Picture = img_cover + Endif +End + +Public Sub btnStatus_Click() + game.Reset() +End + +Public Sub Game_OnStart() + Timer1.Enabled = True +End + +Public Sub Game_OnEnd() + Timer1.Enabled = False +End + +Public Sub Game_OnRefresh() + Dim x, y As Integer + Dim s As Integer + For x = 0 To game.Width - 1 + For y = 0 To game.Height - 1 + Select Case game.Status + Case game.GAME_READY + blocks[x, y].Picture = img_cover + btnStatus.Picture = img_face_normal + play_time = 0 ' reset the timer + Timer1.Enabled = False + refresh_timebox() + Case game.GAME_STARTED + s = game.GetBlockStatus(x, y) + If s = game.BLOCK_COVERED Then + blocks[x, y].Picture = img_cover + Else If s = game.BLOCK_FLAGGED Then + blocks[x, y].Picture = img_flag + Else + blocks[x, y].picture = img_num[game.GetBlockNumber(x, y)] + Endif + Case game.GAME_WIN, game.GAME_LOSE + If game.GetBlockStatus(x, y) = game.BLOCK_FLAGGED Then + If game.GetBlockNumber(x, y) = game.NUM_MINE Then + blocks[x, y].Picture = img_flag + Else + blocks[x, y].Picture = img_false + Endif + Else ' the block has been uncovered + blocks[x, y].Picture = img_num[game.GetBlockNumber(x, y)] + Endif + btnStatus.Picture = IIf(game.Status = game.GAME_WIN, img_face_win, img_face_lose) + End Select + Next + Next + refresh_flagbox() +End + +Public Sub Timer1_Timer() + play_time += 1 + refresh_timebox() +End + +Public Sub menuQuit_Click() + Me.Close() +End + +Public Sub menuReDim_Click() + dlgSettings.FieldWidth = game_width + dlgSettings.FieldHeight = game_height + dlgSettings.MineCount = game_mines + If dlgSettings.ShowModal() Then + game_width = dlgSettings.FieldWidth + game_height = dlgSettings.FieldHeight + game_mines = dlgSettings.MineCount + ReDimGame(game_width, game_height, game_mines) + Endif +End + + + +' ----- Private Functions ----- + + +' Generate the a width x height board and adjust control positions +Private Sub ReDimGame(width As Integer, height As Integer, mines As Integer) + Dim x, y As Integer + Dim blk As PictureBox + + blocks = New PictureBox[width, height] + + For x = 0 To width - 1 + For y = 0 To height - 1 + blk = New PictureBox(panelBoard) + With blk + .Picture = img_cover + .Resize(img_cover.Width, img_cover.Height) + .Move(x * .Width, y * .Height) + .Tag = x + y * width + Object.Attach(blk, Me, "Block") + End With + blocks[x, y] = blk + Next + Next + + game = New MineSweeperGame(width, height, mines) + Object.Attach(game, Me, "Game") + game.Reset() + + panelBoard.Resize(width * img_cover.Width, height * img_cover.Height) + 'adjust_components() +End + +' Private Sub adjust_components() +' center_control(panelBoard) +' center_control_horizontal(btnStatus) +' btnStatus.top = panelBoard.top - btnStatus.Height +' TimeBox.Left = 0 +' TimeBox.Top = panelBoard.Top - TimeBox.Height +' FlagBox.Left = Me.Width - FlagBox.Width +' FlagBox.Top = panelBoard.Top - FlagBox.Height +' End + +Private Sub refresh_timebox() + lblTime.Text = Str(play_time) +End + +Private Sub refresh_flagbox() + lblFlags.Text = Str(game.FlagCount) +End + + + +' Center the control in the main window +' Private Sub center_control(c As Control) +' c.Move((Me.Width - c.Width) / 2, (Me.Height - c.Height) / 2) +' End +' +' ' Center the control horizontally in the main window +' Private Sub center_control_horizontal(c As Control) +' c.left = (Me.Width - c.Width) / 2 +' End + diff --git a/app/examples/Games/MineSweeper/.src/FMain.form b/app/examples/Games/MineSweeper/.src/FMain.form new file mode 100644 index 00000000..7e6d2cd6 --- /dev/null +++ b/app/examples/Games/MineSweeper/.src/FMain.form @@ -0,0 +1,77 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,60,66) + Text = ("Minesweeper") + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + { menuGame Menu + Text = Shortcut(("Game"), "G") + { menuReDim Menu + Text = Shortcut(("Change Game Parameters"), "C") + Picture = Picture["icon:/32/edit"] + } + { menuQuit Menu + Text = Shortcut(("Quit"), "Q") + Picture = Picture["icon:/32/quit"] + } + } + { HBox1 HBox + MoveScaled(0,2,59,15) + Spacing = True + Margin = True + { PictureBox2 PictureBox + MoveScaled(0,0,13,13) + Picture = Picture["icon:/64/clock"] + Stretch = True + } + { lblTime Label + MoveScaled(13,2,12,7) + Font = Font["20"] + AutoResize = True + } + { Panel2 Panel + MoveScaled(25,3,1,7) + Expand = True + } + { btnStatus Button + MoveScaled(26,2,7,7) + } + { Panel3 Panel + MoveScaled(33,3,1,7) + Expand = True + } + { PictureBox1 PictureBox + MoveScaled(33,0,13,13) + Picture = Picture["image/bigflag.png"] + Stretch = True + } + { lblFlags Label + MoveScaled(44,5,15,4) + Font = Font["20"] + AutoResize = True + } + } + { Panel6 Panel + MoveScaled(25,17,10,1) + } + { Panel4 HBox + MoveScaled(1,19,58,35) + Expand = True + { Panel1 Panel + MoveScaled(4,7,1,13) + Expand = True + } + { panelBoard Panel + MoveScaled(7,6,47,25) + } + { Panel5 Panel + MoveScaled(55,7,1,20) + Expand = True + } + } + { Timer1 #Timer + #MoveScaled(2,54) + } +} diff --git a/app/examples/Games/MineSweeper/.src/FSettings.class b/app/examples/Games/MineSweeper/.src/FSettings.class new file mode 100644 index 00000000..23366286 --- /dev/null +++ b/app/examples/Games/MineSweeper/.src/FSettings.class @@ -0,0 +1,66 @@ +' Gambas class file + +Property FieldWidth As Integer +Property FieldHeight As Integer +Property MineCount As Integer + +Public Sub Run() As Boolean + + Return Not Me.ShowModal() + +End + +Public Sub btnOK_Click() + + Me.Close(True) + +End + +Public Sub btnCancel_Click() + + Me.Close + +End + +Public Sub spinWidth_Change() + UpdateMineRange() + spinMines.Value = spinWidth.Value * spinHeight.Value / 10 +End + +Public Sub spinHeight_Change() + UpdateMineRange() + spinMines.Value = spinWidth.Value * spinHeight.Value / 10 +End + +Public Sub Form_Open() + UpdateMineRange() +End + +Private Sub UpdateMineRange() + spinMines.MinValue = 1 + spinMines.MaxValue = spinWidth.Value * spinHeight.Value - 1 +End + +Private Function FieldWidth_Read() As Integer + Return spinWidth.Value +End + +Private Sub FieldWidth_Write(Value As Integer) + spinWidth.Value = Value +End + +Private Function FieldHeight_Read() As Integer + Return spinHeight.Value +End + +Private Sub FieldHeight_Write(Value As Integer) + spinHeight.Value = Value +End + +Private Function MineCount_Read() As Integer + Return spinMines.Value +End + +Private Sub MineCount_Write(Value As Integer) + spinMines.Value = Value +End diff --git a/app/examples/Games/MineSweeper/.src/FSettings.form b/app/examples/Games/MineSweeper/.src/FSettings.form new file mode 100644 index 00000000..0c4c815a --- /dev/null +++ b/app/examples/Games/MineSweeper/.src/FSettings.form @@ -0,0 +1,71 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,61,30) + Text = ("Settings") + Resizable = False + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + { VBox1 VBox + MoveScaled(1,1,54,22) + { HBox2 HBox + MoveScaled(2,1,50,6) + { lblX Label + MoveScaled(1,1,24,4) + Expand = True + AutoResize = True + Text = ("Width") + } + { spinWidth SpinBox + MoveScaled(14,1,9,4) + MinValue = 5 + MaxValue = 50 + } + } + { HBox4 HBox + MoveScaled(2,8,50,6) + { lblY Label + MoveScaled(1,1,24,4) + Expand = True + AutoResize = True + Text = ("Height") + } + { spinHeight SpinBox + MoveScaled(26,1,9,4) + MinValue = 5 + MaxValue = 25 + } + } + { HBox6 HBox + MoveScaled(2,15,50,6) + { lblMines Label + MoveScaled(0,1,14,4) + Expand = True + AutoResize = True + Text = ("Number of mines") + } + { spinMines SpinBox + MoveScaled(37,1,9,4) + } + } + } + { HBox1 HBox + MoveScaled(1,25,59,4) + Spacing = True + { Panel1 Panel + MoveScaled(4,0,4,4) + Expand = True + } + { btnOK Button + MoveScaled(24,0,16,4) + Text = ("OK") + Default = True + } + { btnCancel Button + MoveScaled(41,0,16,4) + Text = ("Cancel") + Cancel = True + } + } +} diff --git a/app/examples/Games/MineSweeper/.src/MineSweeperGame.class b/app/examples/Games/MineSweeper/.src/MineSweeperGame.class new file mode 100644 index 00000000..af0a5acf --- /dev/null +++ b/app/examples/Games/MineSweeper/.src/MineSweeperGame.class @@ -0,0 +1,194 @@ +' Gambas class file + +Property Read Width As Integer +Property Read Height As Integer +Property Read Status As Integer +Property Read FlagCount As Integer + +Event OnStart() +Event OnEnd() +Event OnRefresh() + +Public Enum BLOCK_COVERED, BLOCK_FLAGGED, BLOCK_REVEALED +Public Enum GAME_READY, GAME_STARTED, GAME_WIN, GAME_LOSE +Public Enum NUM_MINE = 9 + +Private $width As Integer +Private $height As Integer +Private $blocks As New Integer[] +Private $status As New Integer[] +Private $mine_count As Integer +Private $flag_count As Integer +Private $covered_block_count As Integer +Private $game_state As Integer + +Public Sub _new(w As Integer, h As Integer, n As Integer) + $width = w + $height = h + $mine_count = n + $covered_block_count = 0 + $blocks = New Integer[w, h] + $status = New Integer[w, h] + Reset() +End + +Public Function Reset() + Dim x, y As Integer + For x = 0 To $width - 1 + For y = 0 To $height - 1 + $status[x, y] = BLOCK_COVERED + $blocks[x, y] = 0 + Next + Next + $game_state = GAME_READY + $covered_block_count = $width * $height + $flag_count = $mine_count + Raise OnRefresh() +End + +Public Function GetBlockNumber(x As Integer, y As Integer) As Integer + Return $blocks[x, y] +End + +Public Function GetBlockStatus(x As Integer, y As Integer) As Integer + Return $status[x, y] +End + +Public Sub OpenBlock(x As Integer, y As Integer) + If $game_state = GAME_READY Then + $game_state = GAME_STARTED + GenerateRandomMines($mine_count, x, y) + Raise OnStart() + Endif + + If $game_state = GAME_STARTED And $status[x, y] = BLOCK_COVERED + If $blocks[x, y] = NUM_MINE Then ' stepped on a mine + $game_state = GAME_LOSE + Raise OnEnd() + Else + RecursiveOpen(x, y) + If AllMinesFound() Then + FlagAllMines() + $game_state = GAME_WIN + Raise OnEnd() + Endif + Endif + Endif + + Raise OnRefresh() +End + +Public Sub ToggleFlag(x As Integer, y As Integer) + If $game_state = GAME_STARTED Then + If $status[x, y] = BLOCK_COVERED Then + $status[x, y] = BLOCK_FLAGGED + $flag_count -= 1 + Else If $status[x, y] = BLOCK_FLAGGED Then + $status[x, y] = BLOCK_COVERED + $flag_count += 1 + Else + Return + Endif + Raise OnRefresh() + Endif +End + + +Private Function Width_Read() As Integer + Return $width +End + +Private Function Height_Read() As Integer + Return $height +End + +Private Function Status_Read() As Integer + Return $game_state +End + +Private Function FlagCount_Read() As Integer + Return $flag_count +End + +' Generate n mines in the field and guarantee that (nx, ny) does not contain a mine. +Private Sub GenerateRandomMines(n As Integer, nx As Integer, ny As Integer) + Dim i As Integer + Dim x, y As Integer + Dim x2, y2 As Integer + Dim count As Integer = $width * $height + Dim index As Integer + + ' check if the range is correct + ' note that the field should contain at most (w*h-1) mines, not w*h + If n >= count Then Error.Raise(("Index out of bounds")) + + ' put n mines into the first blocks, and fill in zero in the rest + For i = 0 To count - 1 + x = i Mod $width + y = i / $width + $blocks[x, y] = IIf(i < n, NUM_MINE, 0) + Next + + ' if a mine is located in (nx, ny), then move the mine to the last block + If $blocks[nx, ny] = NUM_MINE Then Swap $blocks[nx, ny], $blocks[$width - 1, $height - 1] + + ' shuffle + For i = 0 To count - 1 + x = i Mod $width + y = i / $width + x2 = Int(Rnd(0, $width)) + y2 = Int(Rnd(0, $height)) + If (x = nx And y = ny) Or (x2 = nx And y2 = ny) Then Continue ' skip (nx, ny) + Swap $blocks[x, y], $blocks[x2, y2] + Next + + ' generate the numbers + For x = 0 To $width - 1 + For y = 0 To $height - 1 + If $blocks[x, y] = NUM_MINE Then + For x2 = x - 1 To x + 1 + For y2 = y - 1 To y + 1 + Try IncrementBlockMineCount(x2, y2) + Next + Next + Endif + Next + Next +End + +Private Sub IncrementBlockMineCount(x As Integer, y As Integer) + If $blocks[x, y] <> NUM_MINE Then $blocks[x, y] += 1 +End + +Private Sub RecursiveOpen(x As Integer, y As Integer) + Dim x2, y2 As Integer + If $status[x, y] = BLOCK_COVERED Then + $status[x, y] = BLOCK_REVEALED + $covered_block_count -= 1 + If $blocks[x, y] = 0 Then + For x2 = x - 1 To x + 1 + For y2 = y - 1 To y + 1 + RecursiveOpen(x2, y2) + Next + Next + Endif + Endif +Catch + +End + +Private Function AllMinesFound() As Boolean + Return $covered_block_count = $mine_count +End + +' Automatically mark all mines as flag +Private Sub FlagAllMines() + Dim x, y As Integer + For x = 0 To $width - 1 + For y = 0 To $height - 1 + If $blocks[x, y] = NUM_MINE Then + $status[x, y] = BLOCK_FLAGGED + Endif + Next + Next +End diff --git a/app/examples/Games/MineSweeper/image/bigflag.png b/app/examples/Games/MineSweeper/image/bigflag.png new file mode 100644 index 0000000000000000000000000000000000000000..334b47127d5a9adb5d4b4e2945f86defc2cb1678 GIT binary patch literal 6066 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 literal 0 HcmV?d00001 diff --git a/app/examples/Games/MineSweeper/image/cover.png b/app/examples/Games/MineSweeper/image/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..c366339327dbbbd66eae130f249411c7bf59be01 GIT binary patch literal 331 zcmV-R0kr;!P)xN#0001lP)t-sOw033 z%k)gR^Gvw(+wlC`@%>7*^wRA7O11Mxvh>8}`$w|#M6UC*-ughQ^PklDpVat3s`5Ri z^NY&(i^}&srt&$V^L4%Vb-ngEq4G4F@?Nm@FqZO3qx3A1@;8_BH<$7(k?|*s@+XV& zBZl!Gg7F-F@f?2e7<%y-dhix@@Dz0Ln=38B0001jNklGSSqJkr$LX;^X5X;#-^^1!ovqD^Nm@Q(pV=BabE$fJs2gGBe znut;-#B;0Lh}IXx?#gtC{f+4n@54Am#&JS4#+ryV7V(imd}a`x^Dg3@M-1VW3W)Cv dE`Kug*B3jkAOVA4(5V0b002ovPDHLkV1i*{rYisd literal 0 HcmV?d00001 diff --git a/app/examples/Games/MineSweeper/image/coveron.png b/app/examples/Games/MineSweeper/image/coveron.png new file mode 100644 index 0000000000000000000000000000000000000000..95f9be6eb96d6ccc33088f3c87606d73e9a425e7 GIT binary patch literal 238 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 literal 0 HcmV?d00001 diff --git a/app/examples/Games/MineSweeper/image/false.png b/app/examples/Games/MineSweeper/image/false.png new file mode 100644 index 0000000000000000000000000000000000000000..0f649881a704583e26366d324ff53ff8c5eb0c97 GIT binary patch literal 1021 zcmVk#hqzPa`LXtvA$p!^Q3POc0A|Z8ERjSk<(EbqAU(iLH4T~)L z50bJepoBJn1tffv#D>He`x>x)@7yk?fkx?~%8{-#I#=_YbKZ9}qfJds1$=4*0fy&c zmCFzWR2&C`AfUdc1|cO<2&7^BFP88;!beBMwzr97GDyQns|DFH@ZKF{TJn%L$hqEf-1 zogp|qg1I@ka)s}79d6y?*M$Z2YL)u^eUgidB+_YW4-OE%PoV3RrKDop7-qRls8GOm zUCiTS{C8Qdg~IUgA@ujdg$rPseB=8(cU_#B8KN&`H~u+qYD+do;>0Y;3@*SJ2S`u^1GK+{oo1mjg|Ma2OgIpsS1G*cfkufMPC( zaa>4geeJXN;t7!|pC* zGLX%xQH4;SX{thti%_kq+{KF=OL@i+?>mgg<7}p%(N*-}%^S7p@K9~4t%c@hrCp%_ z^Yg0M_BQnQF4xwKBl6AeDmAQD|vV|8hCl+XKsDr@bB9 zw$C&a??+x=nkSXIN%{8~s%vYiGsjWKW?}-y$03nW1vCv@7a|d4CWB+!ACJ88e2$y3 z&!~I+7YHOAFBO}n*s6fdiw709Z=fV0q(bZLK&->66+p@_1HP2UVw{e!1&^!;> z)I@P~l+(#c;@)pOv>l?5W755kRm1P2Gmo*uNJA&k1Zk1s;Q zfX+^Wi3tK-2j53)Z^sCQ&VgTk`vaAdi?G8`t)hp+=#Hb@{I6(efZ<`ZL;_qF(b0iu rY63v}5q(4|E4eWYO^g#h4hk(GTiNwyp000000NkvXXu0mjf%y;Pi literal 0 HcmV?d00001 diff --git a/app/examples/Games/MineSweeper/image/flag.png b/app/examples/Games/MineSweeper/image/flag.png new file mode 100644 index 0000000000000000000000000000000000000000..47a05b3183b7806f597b77a6e91bb7640d12a50d GIT binary patch literal 765 zcmWlX>rYYv0L3qrW;9!wE44n=m#ntzu{E`o7Fa6gT|Sc3LNNnpR-zP^Gww7WQ>OU> zlt$O2F)&3%&>1B*n;YgFIy3BHr86OVShJejNzZnE=MVUua`NnHZ)O0KAPDcsGputf z>$_U7wJYp9|MdhxFdmYec(zO?Q!14zm1=Hs%zE`AY&MLK(=^?umDgQl!)gUh!*17T zG!2Cro$4xdbzxut8V%ao(AsLXSadpFe%zsHa|e`4$mM8i!p)mVOG9BH#>Ox@3WMRz z$cVvU;015}```iedR(~zi3CYWh>b-<15_&Lbf~Pv@#A><)ND4}o_C8Aj-b6A_4UZf zL1H2zBGA%;Yu9k#z=!d1i^Za?D^e9^LL@?XID&&wRD{QmVK$?<7+mhhsi~o%q0+3F zm(>(=w(cFHli2 zGc%)WprBB|XheQKZr^s!ujZB2gz0JY^`WK)4##)bm!IEUZnt}JaZxE1E-fwn`r&pj z%q=f3&qs?>R%C6DWQE83+4;QZOuvH!SzTUUt|+Om+Q7I=xm>QD%_;inW3C{=_w(%R z?5FLUeSNlVnJppIYPno)E`C(kU8!%b?x*PL`+g+J<#O2xF{!8GqLWXbkBWUC=D$ZE z5M*ShXJzK3y=vPh5MI8@_wwyF8oMSZMA!3j#Wxc2M5dn|9?XJ*0*UkQpMTsx>(_aD zlosEUtnnD!y{m=h>-nEjKKAl`d}^(OQffG`Ml1Z{zd^wjP6f+)CBwsE174fj%kF@( z(&9}0znWJYCEB=` tUU*7*}phM6%Dao}A=S{{hlKt``6R literal 0 HcmV?d00001 diff --git a/app/examples/Games/MineSweeper/image/mine.png b/app/examples/Games/MineSweeper/image/mine.png new file mode 100644 index 0000000000000000000000000000000000000000..b0d8b18c0221a2ac44acbbe0b5ba483030f1125d GIT binary patch literal 755 zcmVxN#00057P)t-sj*gC+ znwp)RouZpozPrjm^BQ+|R??&ce~bvBa>O#>B(M#>Tm%j)Pq|j%-Yi zZB3AGPL6C!jA=)UXhn-?MtoK(@(a_r0)w`mK(!#UJwxheFjI^79xSxi=sg%U8oXfeW z%DAS*u$;lHnA_Xiqlj&$if_KEmcOc&!L6CWt(w5Am%XTzy{VR_jB>7)f8pWb+|tQy zMIUrdDR)pScTp>MP%3s%Ds@gMa!Vy^LmO;G9>}<==;-L()y!x?8(1v^TQUerLCi@r*8n{0tF2X4ULRVOwG*9EiA39Z47MaAPR=f_ZtfnQ zUfyh5U*0ia+n l1^^27VE~|DKL)@a835KzR1(yVKIi}d002ovPDHLkV1gF%VZ#6b literal 0 HcmV?d00001 diff --git a/app/examples/Games/MineSweeper/image/number_1.png b/app/examples/Games/MineSweeper/image/number_1.png new file mode 100644 index 0000000000000000000000000000000000000000..e5bad5a5de6ac307ce01d14ff1ef6f79f4f0139e GIT binary patch literal 388 zcmV-~0ek+5P)xN#00024P)t-sj*gC+ znwp)RouZbSVLhlk5CG3>s+zKe^`Gc)eS#>SD6)ipKn%*@P|mfAKp@zc}O zo15P_IP=@v+o7T5Iy&{?;o+sF={!95=;-LGs_s5M`R?xSzP|B4Kl(5*{16cSZ*TYW z^YgN@_CZ1X_xJbw{QNqE+4BGZ0Fg;VK~xyiZPCXT!Y~j+(NF`3P(rVv_hvf(|6|C< z+BtWndD{tsR2dIr*29>Se4(ht7+R%r1*nD&V`SA(Z=e}DjIq^f#~pNIhp{Jp473=B zGQwDkaUxSBT8uN9W1+>kloi%mj2qcvr^UFJ1CCmZCpqJy#dx)D#@z8R=4lVcm-UA8 iu?OSV!}#;0KjRPRWg|ZpO3Fh30000xN#0002AP)t-sj*gC+ znwp)RouZ~gv9X!3q@}Q{Q>%Vntc19@xMHw~zP`RQtZtaOsK&;|k-euVtZ2;4%%jA! z4yjqw)6=QSxelpXf5D&I+uN_uzYnTfgT|!c;o-E^#1E=lhsmet=;*rJ%8Smd?(Xgo zt6M+0d%ob$^Yinv-pKd&_x$|)WBG8%0001EF3pd1l=x~%%v?997*^`SK zLGxN#0002JP)t-sj*gC+ znwp)RouZZRR?|69V=;-dMs_NO<{2w3io153&#sB~Ss!2paR2b83(MJM;Pz*&; z3!qUHdj)$JD0K+Fq8)ihNJcfT)19B26Nhh^h!6JU$Gz8E4n#i`1i^3f5kCp(KjRCX W&?F-bpPs`20000xN#0001=P)t-sj*gC+ znwp)RouZVvYDEIdo%F4On;cCpx%;e;4+S-=W)6?ACsp{%t z=;(3V+uQT=N#*6C;o;%&@oD$>Jp20|=jXKO=;-tFeD3b<_V$1C^Yi)ng7^3L{QUfu zzQqLq005s!L_t&-({0h)0)apjh2an_=R=~9L{3E#@BeJpY&AF2cQJeK|8^{^QOm&C zHZXQH+wRI_?A08=k%h5e8DNN!Y>eZ|WIDrKHpa!Di=_)!Rz^>(u=afTvNHx^v)u(D zLfIMjN`!-YA~_giI^x7PL86YB@k|%guDlp;bWfEGS^D6`_|$UbG8tc5fkGzZTPsn@ hWc(NyzlP?|_yIdMAPZ2QuyX(a002ovPDHLkV1gD?)1UwV literal 0 HcmV?d00001 diff --git a/app/examples/Games/MineSweeper/image/number_5.png b/app/examples/Games/MineSweeper/image/number_5.png new file mode 100644 index 0000000000000000000000000000000000000000..f7e88fa2e1b94a1a482082c6ccf4ebeb777f8a40 GIT binary patch literal 381 zcmV-@0fPRCP)xN#0001)P)t-sj*gC+ znwp)RouZ? z#)4>1zrDK5%*>jHc8hdfXG0%$Ryfns)62=mZ%!?(pp)C%+oF$t;o;$&hjXQqf#~Sy z&BeXn+}deHA@1((teS{vMIxDjYxDE-!nLSsMIx@8iud>T&&0af(aHS$`~t5m3;+NC zpGibPR2b83(Mb}5KoCSxoJvJRoNyLYR0a|B{)aOw+kgeU1)cpj5P@a2>NFsB8xVWc zH@Fc8BnCI)kYqGg+=w>G#I7JZBvYq?=#tDlZ*HcGxFEh}x#C7#lkfYRt?alF_m#s@ zPI@AqYk>rMAcnPzT=hV_spzhcheUcoe5yD}<1~?!7sO1xa(q$#=FSicqbxuFRUm#F b+JD9mxN#0002eP)t-sj*gC+ znwp)RouZ?gbwirl+uLqAmb|UU;o;$jU8b;^!P(W^=;-LQoyCAsqN|a=k!!B* z?(Tt9qCnO4+Rx+s{QO3+ z2mSy60Jlj*K~xyiZPCYa!cY)IQNVzqMHV@Ou?^Vdob&(x65S8MMx4cH=5C}ac|31< zT^M~Xj2{kvAQ=2K8)N7p3^6OCWke8-SytTaj0s5ssl*ebEoo%z7sjmQkS`RAd9!C3 zOHxLq%=c7lIvDH1&}e?O(9ps7Ex-@wFWNd7JJQ9U9)Kp}zx2@O9H6U%aVR5xN#0001-P)t-sj*gC+ znwp)RouZvq$tDvi}eXPAutZE;)}Y=#>U31!^;}6>def{Qo7-Kz}nN()3?so4zTUT(be1A+jYj| zX2a&;;o;KW;t#Rz!`kEM=;(aS>ps2h?(Xg&x9^|X?(_5WlGpJdxA6D(_x$|)Zd7m5 z0001vNklRNGk$peAJOc2R6PIy N002ovPDHLkV1gp*!rK4< literal 0 HcmV?d00001 diff --git a/app/examples/Games/MineSweeper/image/number_8.png b/app/examples/Games/MineSweeper/image/number_8.png new file mode 100644 index 0000000000000000000000000000000000000000..d4f0896f0c6a4ee0c9d4fd22e218c75c3f189479 GIT binary patch literal 454 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

Qid@c*Q=tJRs+sk=fNd$&W z!3{u@{TrZ0%+ z%)zUpCGDRhdHsYi+HasIOwtz!u=hDXptvcn17YIT7a!o$=f0<4lCDrYbQpZypM7-S zHa60-y+XJJM{ONM6VEoLn#E{q=|kn4L|81Ak+JcnHFod`frHYr$B{R>+S<-h0wI@@ zcB2G`A>)Jy1Y?=vK%nFkVylPyfBe{D0W6NOJW$66uD>d@!e!C0{Xe=XTsHek-xd`P zgJGi?@x}H6PYXx=%LjeSC;_1TJC*7&9Wu65ce!$?B?_W%q1-{&7#B?{Z9|{Z*}Ef2 zN*>sA!U#~fwhyuwM@;wD28W@5$;a>imSFou;N!8inH&)yNeU`_m)I72>LHl>On`~$ zvCWwrMTM^in5*4;K|ig2yPBJu&ofw2D^u~C491*soS|I#ByHjQcMAq> z(z&F+@GvIxyg-FzSofrF?EsAtYXz6vEosaHCx9!BPM-XN(t37yMOzV`-wF6$kf$5u z+MbSFG4b~H{^_%UvOGQqg+dp&9M;dt92O(0>4qe8t2#V#8d`(GC(0Z<#4RUY05nr zdqxOT+4NrAIbk>88Xv7vB?!9h(;WmW4c3y$tbfuo`!S4j`+j=5HC?bz_agWfrM2?# zPPk>*#K+Fg&XzeX&1)y_Vf2DktE?R;jwl0M+-O-XV?7npY><$wMohdxEmKqXxn z@6b65a`$g)(BGL zgJlGRIlMW^Lx9A&+ggak+%yr=Y6ZXJ+S>j&e*F0S#Qv#ILDGBvS3v%0u=4_@;~+!p zW%ry<;rz<_Z%TE7?f19!=kOn?`6)^NKM0M*MKV%Yf9^{Djm9<>Kytp5!)Sc=vi~TQ8Xw;LJ8&`= hP1.Y And If $iY < hP1.Y + hP1.Height Then GoSub _OnPaddle + If hP2 And If $iX = hP2.X And If $iY >= hP2.Y And If $iY < hP2.Y + hP2.Height Then GoSub _OnPaddle + ' Flip at top/bottom border? + If $iY < 0 Or $iY >= $hWindow.Height Then + GoSub _UndoMovement + $iVD = -$iVD + Move(hP1, hP2) + Endif + ' Made a point (left/right border)? + If $iX < 0 Or $iX >= $hWindow.Width Then + GoSub _UndoMovement + Return $iHD + Endif + Return 0 + +_UndoMovement: + $iX -= $iHD + $iY -= $iVD + Return + +_OnPaddle: + GoSub _UndoMovement + $iHD = -$iHD + Move(hP1, hP2) + $bHitPaddle = True + +End + +Public Sub Draw() + + If $bSimulate Then Return + $hWindow.Print("o", $iX, $iY) + +End + +Public Sub Undraw() + + If $bSimulate Then Return + $hWindow.Print(" ", $iX, $iY) + +End + +Private Sub HDir_Read() As Integer + + Return $iHD + +End + +Private Sub HDir_Write(Value As Integer) + + $iHD = Value + +End + +Private Sub VDir_Read() As Integer + + Return $iVD + +End + +Private Sub VDir_Write(Value As Integer) + + $iVD = Value + +End + +Private Function X_Read() As Integer + + Return $iX + +End + +Private Sub X_Write(Value As Integer) + + $iX = Value + +End + +Private Function Y_Read() As Integer + + Return $iY + +End + +Private Sub Y_Write(Value As Integer) + + $iY = Value + +End + +Private Sub HitPaddle_Read() As Boolean + + Return $bHitPaddle + +End diff --git a/app/examples/Games/Pong/.src/MMain.module b/app/examples/Games/Pong/.src/MMain.module new file mode 100644 index 00000000..486dcb4c --- /dev/null +++ b/app/examples/Games/Pong/.src/MMain.module @@ -0,0 +1,191 @@ +' Gambas module file + +Private $hConfig As Window +Private $hTimer As Timer +' Scores +Private $iS1 As Integer +Private $iS2 As Integer +' Players' paddles +Private $hP1 As Paddle +Private $hP2 As Paddle +' If Paddle2 shall be controlled by an NPC object +Private $bNPC As Boolean +Private $hNPC As NPC +' The ball +Private $hBall As Ball + +Public Sub Main() + + ' Make our Window raise events + Object.Attach(Window, Me, "Window") + Window.SetFocus() + + Screen.Cursor = Cursor.Hidden + Screen.Echo = False + Screen.Input = Input.CBreak + + Window.Border = Border.Ascii + Window.Caption = Subst$(("Pong v&1 - gb.ncurses Example"), Application.Version) + Window.Clear() + + $hConfig = New Window(True, 0, 0, 30, 5) + $hConfig.Border = Border.Ascii + $hConfig.Center() + + $hTimer = New Timer As "Timer" + + $iS1 = 0 + $iS2 = 0 + + $bNPC = True + GameInit() + +End + +Private Sub Configure() + + $hConfig.Show() + $hConfig.Clear() + $hConfig.PrintCenter(("What to do?\nPlay again: [P]\nChange opponent: [o]\n\nQuit [q]")) + Select Case Window.Ask(("Poq")) + Case ("o") + Configure_Opponent() + Case ("q") + Quit + End Select + $hConfig.Hide() + +End + +Private Sub Configure_Opponent() + + $hConfig.Clear() + $hConfig.PrintCenter(("Play against whom?\n[h]uman, [N]ormal, [m]aster")) + $bNPC = True + Select Case Window.Ask(("hNm")) + Case ("h") + $bNPC = False + Case ("n") + $hNPC.Mode = NPC.Normal + Case ("m") + $hNPC.Mode = NPC.Master + End Select + +End + +Private Sub GameInit() + + ' If both as 'master' NPCs we could make a screensaver out of it :-) + $hP1 = New Paddle(Window, 1) + $hP2 = New Paddle(Window, -1) + $hBall = New Ball(Window) + $hNPC = New NPC(Window, $hBall, $hP2) + GameStart() + +End + +Private Sub GameStart() + + Window.Buffered = False + Configure() + $hP1.Reset() + $hP2.Reset() + $hBall.Reset() + $hNPC.Init() + Window.Buffered = True + Redraw() + ' See SPEED. The width means actually the intra-paddle width: + $hTimer.Delay = 4000 / Sqr(2 * (Window.Width - 4) ^ 2) + $hTimer.Start() + +End + +Public Sub Timer_Timer() + + If $bNPC Then $hNPC.Move() + Select Case $hBall.Move($hP1, $hP2) + Case -1 + Inc $iS2 + Goto _NewGame + Case 1 + Inc $iS1 + Goto _NewGame + End Select + ' I suppose that this does not go down to zero + If $hBall.HitPaddle Then Dec $hTimer.Delay + Redraw() + Return + +_NewGame: + ' We want to see it + Redraw() + $hTimer.Stop() + ' FIXME: Makes stack overflow eventually + GameStart() + +End + +Public Sub Window_Read() + + Dim iKey As Integer + + iKey = Window.Read() + Window.Drain() + ' Go two steps per keystroke + ' FIXME: Can't reach some coordinate with odd Window.Height + Select Case iKey + ' Player 1 + Case Key.Up + If $hP1.Y > 0 Then $hP1.Y -= 2 + Case Key.Down + If $hP1.Y + $hP1.Height < Window.Height Then $hP1.Y += 2 + ' Human player 2 + Case Asc("j") + If Not $bNPC And $hP2.Y > 0 Then $hP2.Y -= 2 + Case Asc("k") + If Not $bNPC And $hP2.Y + $hP2.Height < Window.Height Then $hP2.Y += 2 + ' Change ball speed :-) + Case Asc("+") + If $hTimer.Delay > 10 Then $hTimer.Delay -= 10 + Case Asc("-") + $hTimer.Delay += 10 + ' Pause + Case Asc(("p")) + Pause() + ' Quit + Case Asc(("q")) + Quit + Case Else + Return + End Select + Redraw() + +End + +Private Sub Redraw() + + Dim iX As Integer = Window.Width / 4 + + ' Scores and net + Window.Print(" " & Str$($iS1) & " ", iX, 1, Attr.Reverse) + Window.Print(" " & Str$($iS2) & " ", iX * 3, 1, Attr.Reverse) + Window.DrawVLine(Window.Width / 2 + 1, 0, Window.Height, ".") + ' Players and ball may overwrite the unimportant stuff above + $hP1.Draw() + $hP2.Draw() + $hBall.Draw() + Screen.Refresh() + +End + +Private Sub Pause() + + $hTimer.Stop() + Window.PrintCenter(("PAUSE")) + Screen.Refresh() + Window.Ask(("p")) + Window.Clear() + Redraw() + $hTimer.Start() + +End diff --git a/app/examples/Games/Pong/.src/NPC.class b/app/examples/Games/Pong/.src/NPC.class new file mode 100644 index 00000000..fd651a8f --- /dev/null +++ b/app/examples/Games/Pong/.src/NPC.class @@ -0,0 +1,116 @@ +' Gambas class file + +Public Const Normal As Integer = 0 +Public Const Master As Integer = 1 + +Property Mode As Integer + +Private $hWindow As Window +' Ball is needed to calculate movements, of course >:-) +Private $hBall As Ball +Private $hPaddle As Paddle +Private $iMode As Integer + +' This is the Y coordinate we wish to reach with the middle of our paddle +Private $iY As Integer +Private $bReady As Boolean + +' Master's control data +Private $iLastDir As Integer +Private $hMyPaddle As Paddle + +Public Sub _new(hWnd As Window, hBall As Ball, hPaddle As Paddle, Optional iMode As Integer = Normal) + + $hWindow = hWnd + $hBall = hBall + $hPaddle = hPaddle + $iMode = iMode + +End + +Public Sub Init() + + $bReady = False +$iLastDir = $hBall.HDir + ' We need to insert an opponent paddle that would block everything to not + ' go into an infinite loop when trying to calculate the ball's positions + $hMyPaddle = New Paddle($hWindow, -$hPaddle.Dir) + $hMyPaddle.Reset() + $hMyPaddle.Y = 0 + $hMyPaddle.Height = $hWindow.Height + +End + +Public Sub Move() + + If $iMode = Normal Then + Move_Normal() + Else If $iMode = Master Then + Move_Master() + Endif + +End + +Private Sub Move_Normal() + + ' Make him beatable... + If CInt(Rnd(0, 2)) Then Return + ' Just follow the ball + $iY = $hBall.Y + Move_Generic() + +End + +Private Sub Move_Master() + + ' Calculate the future ball's position and move accordingly + If Not $bReady Then MasterCalc() + Move_Generic() + ' If the ball hits this paddle, we can begin calculating again + If $hBall.HDir <> $iLastDir And $iLastDir = -$hPaddle.Dir Then + $bReady = False + Endif + $iLastDir = $hBall.HDir + +End + +Private Sub Move_Generic() + + Dim iMid As Integer = $hPaddle.Y + ($hPaddle.Height / 2) + Dim iDiff As Integer = $iY - iMid + + If Abs(iDiff) <= 1 Then Return + $hPaddle.Y += 2 * Sgn(iDiff) + +End + +Private Sub MasterCalc() + + Dim hMyBall As New Ball($hWindow, True) + + ' Use the CBall class to sneakily get the position we have to sit on + ' when the ball arrives at this end + hMyBall.HDir = $hBall.HDir + hMyBall.VDir = $hBall.VDir + hMyBall.X = $hBall.X + hMyBall.Y = $hBall.Y + ' Simulate the ball flying thither and back again + While hMyBall.X <> $hPaddle.X + hMyBall.Move($hMyPaddle, Null) + Wend + $iY = hMyBall.Y + $bReady = True + +End + +Private Sub Mode_Read() As Integer + + Return $iMode + +End + +Private Sub Mode_Write(Value As Integer) + + $iMode = Value + +End diff --git a/app/examples/Games/Pong/.src/Paddle.class b/app/examples/Games/Pong/.src/Paddle.class new file mode 100644 index 00000000..09a745fb --- /dev/null +++ b/app/examples/Games/Pong/.src/Paddle.class @@ -0,0 +1,96 @@ +' Gambas class file + +Property X As Integer +Property Y As Integer +Property Height As Integer +Property Read Dir As Integer + +' Direction in which to play +Private $iDir As Integer +Private $hWindow As Window +Private $iOrigX As Integer +Private $iOrigY As Integer +Private $iX As Integer +Private $iY As Integer +Private $iHeight As Integer + +Public Sub _new(hWnd As Window, iDir As Integer) + + $hWindow = hWnd + $iHeight = hWnd.Height / 6 + 1 + $iDir = iDir + If iDir > 0 Then + $iOrigX = 1 + Else + $iOrigX = hWnd.Width - 2 + Endif + $iOrigY = (hWnd.Height - $iHeight) / 2 + If Odd($iOrigY) Then Inc $iOrigY + +End + +Public Sub Reset() + + Undraw() + $iX = $iOrigX + $iY = $iOrigY + +End + +Public Sub Draw() + + $hWindow.DrawVLine($iX, $iY, $iHeight, "|") + +End + +Public Sub Undraw() + + $hWindow.DrawVLine($iX, $iY, $iHeight, " ") + +End + +Private Sub X_Read() As Integer + + Return $iX + +End + +Private Sub X_Write(Value As Integer) + + If Value < 0 Or If Value + 1 > $hWindow.Width Then Return + Undraw() + $iX = Value + +End + +Private Sub Y_Read() As Integer + + Return $iY + +End + +Private Sub Y_Write(Value As Integer) + + If Value < 0 Or If Value + $iHeight > $hWindow.Height Then Return + Undraw() + $iY = Value + +End + +Private Function Height_Read() As Integer + + Return $iHeight + +End + +Private Sub Height_Write(Value As Integer) + + $iHeight = Value + +End + +Private Function Dir_Read() As Integer + + Return $iDir + +End diff --git a/app/examples/Games/Pong/SPEED b/app/examples/Games/Pong/SPEED new file mode 100644 index 00000000..2d7658ab --- /dev/null +++ b/app/examples/Games/Pong/SPEED @@ -0,0 +1,47 @@ +Different people have different terminal dimensions. The following shall +outline my attempt to make Pong soundly playable with every one. + +Consider this picture. Assume that it is your terminal: + +........... Legend: +, -, | = Real border (of terminal) +. '. . = Imaginary border +. ' . o = Ball +. ' . " = Real flying behaviour +. ' . ' = Equivalent imaginary flying behaviour ++----'----+ The real and imaginary border make a square w^2. +| " | \ +| " " "| | +| " " " | | Height h +|o " | / ++---------+ + \_______/ + Width w + +We clearly want that the ball gets some velocity linearly proportional to +the distance it has to fly so that the time the ball needs (and the human +player has time to react) is constant. + +As you can see, the distance from paddle 1 to paddle 2 is sqrt(2w^2) units. +The ball goes one unit per Timer event. We need a Timer.Delay that makes the +constant time elapse after sqrt(2w^2) Timer events. + +Let's arbitrarily set the time from one paddle to the other to 4s: + + Timer.Delay = 4000 / Sqr(2 * w ^ 2). + +This is the starting delay. With each hit on a paddle, it decrements. + +This was tested with ANSI's 80*24 terminal dimensions in xterm and my home +180*74 on the Linux console. Feel free to set the LINES and COLUMNS +environment variables to try different proportions. + +One may see the crux with this approach: The larger/smaller the terminal, +the faster/slower the ball. I found both scenarios equally hard: with a +large terminal, the paddle is large; with a small terminal, the paddle is +small. It compensates. + +TODO: The above is not true for terminals which are much _wider_ than high. + I found it problematic to play "LINES=10" but easy with "COLUMNS=30". + +BTW: The NPCs make one step per each ball step. You may have to resize your + terminal to be able to win against 'master' ;-) diff --git a/app/examples/Games/Pong/pong.png b/app/examples/Games/Pong/pong.png new file mode 100644 index 0000000000000000000000000000000000000000..e17e6d06a6a181530d684b20f09fbc2135c32732 GIT binary patch literal 89 zcmeAS@N?(olHy`uVBq!ia0vp^3Lwk~Bp9L@-6KI9PZ!4!j_b(@4b0qsTo^lEI4Gq! jBpE40F5+Ml;^bgpFyQ6bn!qvh4M>lttDnm{r-UW|)npR= literal 0 HcmV?d00001 diff --git a/app/examples/Games/Puzzle1To8/.directory b/app/examples/Games/Puzzle1To8/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/app/examples/Games/Puzzle1To8/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/app/examples/Games/Puzzle1To8/.icon.png b/app/examples/Games/Puzzle1To8/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8974e481fb528ee79b660581b3a16beef405f087 GIT binary patch literal 4303 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 literal 0 HcmV?d00001 diff --git a/app/examples/Games/Puzzle1To8/.lang/ca.po b/app/examples/Games/Puzzle1To8/.lang/ca.po new file mode 100644 index 00000000..698cb846 --- /dev/null +++ b/app/examples/Games/Puzzle1To8/.lang/ca.po @@ -0,0 +1,98 @@ +# Catalan translation of Puzzle1To8 +# Copyright (C) 2000-2010 Benoît Minisini. +# This file is distributed under the same license as the Puzzle1To8 package. +# Jordi Sayol , 2007-2010. +# +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Puzzle1To8 3.13.90\n" +"PO-Revision-Date: 2019-06-04 19:27 UTC\n" +"Last-Translator: benoit \n" +"Language: ca\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Puzzle 1 to 8" +msgstr "Puzzle 1 a 8" + +#: .project:2 FrmAyuda.form:19 +msgid "Place the numbers 1 to 8 in each of the boxes without repeating, so that each box does not contain a correlative number to its neighbors or adjacent boxes. See the following examples:" +msgstr "Poseu els números de l'1 al 8 a cada una de les caixes sense repetir-los, en que cada caixa no contingui números correlatius amb les caixes veïnes o adjacents. Mireu l'exemple següent:" + +#: FMain.class:69 +msgid "Are you sure?" +msgstr "N'esteu segurs?" + +# gb-ignore +#: FMain.class:69 +msgid "No" +msgstr "" + +#: FMain.class:69 +msgid "Yes" +msgstr "Sí" + +#: FMain.class:90 +msgid "Congratulations! You did it!" +msgstr "Felicitats! Ho heu fet!" + +#: FMain.form:22 +msgid "Puzzle 1 to 8 - Locate the numbers!" +msgstr "Puzle 1 a 8 - Troba els números!" + +#: FMain.form:27 +msgid "Game" +msgstr "Joc" + +#: FMain.form:30 +msgid "Clear" +msgstr "Neteja" + +#: FMain.form:35 +msgid "Quit" +msgstr "Surt" + +#: FMain.form:41 +msgid "Help" +msgstr "Ajuda" + +#: FMain.form:44 FrmAyuda.form:14 +msgid "How to play?" +msgstr "Com jugar-hi?" + +#: FMain.form:49 FrmAbout.form:12 +msgid "About" +msgstr "" + +#: FrmAbout.form:21 +msgid "Author" +msgstr "Autor" + +#: FrmAbout.form:25 +msgid "Author: Pablo Mileti.

You can submit your questions, suggestions, bugs, etc, to the following E-Mail address:\n
pablomileti@gmail.com" +msgstr "Autor: Pablo Mileti.

Podeu enviar les vostres preguntes, suggeriments, errors, etc. a aquesta adreça de correu electrònic:\n pablomileti@gmail.com" + +#: FrmAbout.form:29 +msgid "License" +msgstr "Llicència" + +#: FrmAbout.form:33 +msgid "\n Copyright (C) 2010. Author: Pablo Mileti \n\nThis 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.\n\nThis 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.\n\nYou should have received a copy of the GNU General Public License along with this program. If not, see ." +msgstr "\n Copyright (C) 2010. Autor: Pablo Mileti \n\nAquest programa és programari lliure; el podeu distribuir i/o modificar sota els termes de la llicència GNU General Public License tal i com està publicada per la Free Software Foundation; ja sigui la versió 3 de la llicència, o bé (si ho preferiu) qualsevol versió posterior.\n\nAquest programa es distribueix amb la voluntat que pugui ser útil però SENSE CAP GARANTIA; ni tant sols les garanties implícites MERCANTILS o ESPECÍFIQUES PER UN PROPÒSIT DETERMINAT. Si voleu més informació, vegeu la llicència GNU General Public Licence.\n\nHauríeu d'haver rebut una còpia de la GNU General Public Licence juntament amb aquest programa. Si no fos així, mireu ." + +#: FrmAbout.form:43 FrmAyuda.form:43 +msgid "Close" +msgstr "" + +#: FrmAyuda.form:31 +msgid "Way incorrect:

The numbers 1 and 2 are consecutive and are in adjoining boxes, so it is not allowed." +msgstr "Manera incorrecta:

Els números 1 i 2 són consecutius i estan en caixes adjacents, o sigui que no està permès." + +#: FrmAyuda.form:48 +msgid "Way correct:

There aren't correlativity between to the numbers entered with respect to their adjoining boxes, so it's allowed." +msgstr "Manera correcta:

No hi ha correlativitat entre els números respecte de les caixes adjacents, o sigui que està permès." + diff --git a/app/examples/Games/Puzzle1To8/.lang/cs.po b/app/examples/Games/Puzzle1To8/.lang/cs.po new file mode 100644 index 00000000..1e6a9407 --- /dev/null +++ b/app/examples/Games/Puzzle1To8/.lang/cs.po @@ -0,0 +1,92 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Puzzle1To8 3.13.90\n" +"PO-Revision-Date: 2019-06-04 19:28 UTC\n" +"Last-Translator: benoit \n" +"Language: cs\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Puzzle 1 to 8" +msgstr "Puzzle 1 z 8" + +#: .project:2 FrmAyuda.form:19 +msgid "Place the numbers 1 to 8 in each of the boxes without repeating, so that each box does not contain a correlative number to its neighbors or adjacent boxes. See the following examples:" +msgstr "Umístěte čísla 1 až 8 v každém z polí bez opakování, takže každý box neobsahuje souvztažnosti čísla na své sousedy nebo přilehlehlé pole. Viz následující příklady:" + +#: FMain.class:69 +msgid "Are you sure?" +msgstr "Jsi si jistý?" + +#: FMain.class:69 +msgid "No" +msgstr "Ne" + +#: FMain.class:69 +msgid "Yes" +msgstr "Ano" + +#: FMain.class:90 +msgid "Congratulations! You did it!" +msgstr "Gratuluji! Dokázal si to!" + +#: FMain.form:22 +msgid "Puzzle 1 to 8 - Locate the numbers!" +msgstr "Puzzle 1 z 8 - Umísťování čísel!" + +#: FMain.form:27 +msgid "Game" +msgstr "Hra" + +#: FMain.form:30 +msgid "Clear" +msgstr "Vyčistit" + +#: FMain.form:35 +msgid "Quit" +msgstr "Ukončit" + +#: FMain.form:41 +msgid "Help" +msgstr "Nápověda" + +#: FMain.form:44 FrmAyuda.form:14 +msgid "How to play?" +msgstr "Jak hrát?" + +#: FMain.form:49 FrmAbout.form:12 +msgid "About" +msgstr "" + +#: FrmAbout.form:21 +msgid "Author" +msgstr "Autor" + +#: FrmAbout.form:25 +msgid "Author: Pablo Mileti.

You can submit your questions, suggestions, bugs, etc, to the following E-Mail address:\n pablomileti@gmail.com" +msgstr "Autor: Pablo Mileti.

Můžete odeslat Vaše dotazy, připomínky, chyby, atd., na následující e-mailovou adresu:\n pablomileti@gmail.com" + +#: FrmAbout.form:29 +msgid "License" +msgstr "Kicence" + +# gb-ignore +#: FrmAbout.form:33 +msgid "\n Copyright (C) 2010. Author: Pablo Mileti \n\nThis 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.\n\nThis 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.\n\nYou should have received a copy of the GNU General Public License along with this program. If not, see ." +msgstr "" + +#: FrmAbout.form:43 FrmAyuda.form:43 +msgid "Close" +msgstr "" + +#: FrmAyuda.form:31 +msgid "Way incorrect:

The numbers 1 and 2 are consecutive and are in adjoining boxes, so it is not allowed." +msgstr "Špatná cesta:

Čísla 1 a 2 jsou po sobě jdoucí a jsou v přilehlých polí, tak to není dovoleno." + +#: FrmAyuda.form:48 +msgid "Way correct:

There aren't correlativity between to the numbers entered with respect to their adjoining boxes, so it's allowed." +msgstr "Správná cesta:

Není mezi korelativností na zadaná čísla s ohledem na jejich přilehlé pole, takže je to dovoleno." + diff --git a/app/examples/Games/Puzzle1To8/.lang/de.po b/app/examples/Games/Puzzle1To8/.lang/de.po new file mode 100644 index 00000000..1ec4d723 --- /dev/null +++ b/app/examples/Games/Puzzle1To8/.lang/de.po @@ -0,0 +1,112 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2019-06-04 19:27 UTC\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Puzzle 1 to 8" +msgstr "Puzzle 1 bis 8" + +#: .project:2 FrmAyuda.form:19 +msgid "Place the numbers 1 to 8 in each of the boxes without repeating, so that each box does not contain a correlative number to its neighbors or adjacent boxes. See the following examples:" +msgstr "Setze die Zahlen von 1 bis 8 ohne Wiederholung so in die Kästchen, dass kein direkt oder schräg angrenzendes Feld eine benachbarte Zahl enthält. Siehe die folgenden Beispiele:" + +#: FMain.class:69 +msgid "Are you sure?" +msgstr "Bist du sicher?" + +#: FMain.class:69 +msgid "No" +msgstr "Nein" + +#: FMain.class:69 +msgid "Yes" +msgstr "Ja" + +#: FMain.class:90 +msgid "Congratulations! You did it!" +msgstr "Glückwunsch! Du hast es geschafft!" + +#: FMain.form:22 +msgid "Puzzle 1 to 8 - Locate the numbers!" +msgstr "Puzzle 1 bis 8 - Platziere die Zahlen!" + +#: FMain.form:27 +msgid "Game" +msgstr "Spiel" + +#: FMain.form:30 +msgid "Clear" +msgstr "Löschen" + +#: FMain.form:35 +msgid "Quit" +msgstr "Beenden" + +#: FMain.form:41 +msgid "Help" +msgstr "Hilfe" + +#: FMain.form:44 FrmAyuda.form:14 +msgid "How to play?" +msgstr "Spielanleitung" + +#: FMain.form:49 FrmAbout.form:12 +msgid "About" +msgstr "Über" + +#: FrmAbout.form:21 +msgid "Author" +msgstr "Autor" + +#: FrmAbout.form:25 +msgid "" +"Author: Pablo Mileti.

You can submit your questions, suggestions, bugs, etc, to the following E-Mail address:\n" +" pablomileti@gmail.com" +msgstr "" +"Autor: Pablo Mileti.

Du kannst Fragen, Vorschläge, Bugs usw. an diese E-Mail-Adresse senden:\n" +" pablomileti@gmail.com" + +#: FrmAbout.form:29 +msgid "License" +msgstr "Lizenz" + +#: FrmAbout.form:33 +msgid "" +"\n" +" Copyright (C) 2010. Author: Pablo Mileti \n" +"\n" +"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.\n" +"\n" +"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.\n" +"\n" +"You should have received a copy of the GNU General Public License along with this program. If not, see ." +msgstr "" +"\n" +" Copyright (C) 2010. Autor: Pablo Mileti \n" +"\n" +"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.\n" +"\n" +"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.\n" +"\n" +"You should have received a copy of the GNU General Public License along with this program. If not, see ." + +#: FrmAbout.form:43 FrmAyuda.form:43 +msgid "Close" +msgstr "Schließen" + +#: FrmAyuda.form:31 +msgid "Way incorrect:

The numbers 1 and 2 are consecutive and are in adjoining boxes, so it is not allowed." +msgstr "Unkorrekt:

Die Zahlen 1 und 2 sind fortlaufend und in benachbarten Feldern, also ungültig." + +#: FrmAyuda.form:48 +msgid "Way correct:

There aren't correlativity between to the numbers entered with respect to their adjoining boxes, so it's allowed." +msgstr "Korrekt:

Keine aufeinanderfolgenden Zahlen stehen in benachbarten Feldern, das ist erlaubt." diff --git a/app/examples/Games/Puzzle1To8/.lang/es_AR.po b/app/examples/Games/Puzzle1To8/.lang/es_AR.po new file mode 100644 index 00000000..f3efd468 --- /dev/null +++ b/app/examples/Games/Puzzle1To8/.lang/es_AR.po @@ -0,0 +1,94 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Puzzle1To8 3.13.90\n" +"PO-Revision-Date: 2019-06-04 19:27 UTC\n" +"Last-Translator: benoit \n" +"Language: es_AR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +# gb-ignore +#: .project:1 +msgid "Puzzle 1 to 8" +msgstr "" + +#: .project:2 FrmAyuda.form:19 +msgid "Place the numbers 1 to 8 in each of the boxes without repeating, so that each box does not contain a correlative number to its neighbors or adjacent boxes. See the following examples:" +msgstr "Ubique los números del 1 al 8 en cada uno de los casilleros sin repetirlos, de manera tal que cada casillero no contenga un número consecutivo al de sus casilleros vecinos o limítrofes. Observe los siguientes ejemplos:" + +#: FMain.class:69 +msgid "Are you sure?" +msgstr "Desea salir?" + +# gb-ignore +#: FMain.class:69 +msgid "No" +msgstr "" + +#: FMain.class:69 +msgid "Yes" +msgstr "Si" + +#: FMain.class:90 +msgid "Congratulations! You did it!" +msgstr "Felicitaciones! Lo lograste!" + +#: FMain.form:22 +msgid "Puzzle 1 to 8 - Locate the numbers!" +msgstr "Puzzle 1 to 8 - Disperse los números!" + +#: FMain.form:27 +msgid "Game" +msgstr "Juego" + +#: FMain.form:30 +msgid "Clear" +msgstr "Limpiar" + +#: FMain.form:35 +msgid "Quit" +msgstr "Salir" + +#: FMain.form:41 +msgid "Help" +msgstr "Ayuda" + +#: FMain.form:44 FrmAyuda.form:14 +msgid "How to play?" +msgstr "Cómo jugar?" + +#: FMain.form:49 FrmAbout.form:12 +msgid "About" +msgstr "" + +#: FrmAbout.form:21 +msgid "Author" +msgstr "Autor" + +#: FrmAbout.form:25 +msgid "Author: Pablo Mileti.

You can submit your questions, suggestions, bugs, etc, to the following E-Mail address:\n pablomileti@gmail.com" +msgstr "Autor: Pablo Mileti.

Pueden enviar sus dudas, sugerencias, bugs, etc, a la siguiente dirección de correo electrónico: pablomileti@gmail.com" + +#: FrmAbout.form:29 +msgid "License" +msgstr "Licencia" + +# gb-ignore +#: FrmAbout.form:33 +msgid "\n Copyright (C) 2010. Author: Pablo Mileti \n\nThis 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.\n\nThis 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.\n\nYou should have received a copy of the GNU General Public License along with this program. If not, see ." +msgstr "" + +#: FrmAbout.form:43 FrmAyuda.form:43 +msgid "Close" +msgstr "" + +#: FrmAyuda.form:31 +msgid "Way incorrect:

The numbers 1 and 2 are consecutive and are in adjoining boxes, so it is not allowed." +msgstr "Disposición incorrecta:

Los números 1 y 2 son consecutivos y estan en casilleros lindantes, por lo tanto es una disposición no permitida." + +#: FrmAyuda.form:48 +msgid "Way correct:

There aren't correlativity between to the numbers entered with respect to their adjoining boxes, so it's allowed." +msgstr "Disposición válida:

No existe correlatividad en los números ingresados con respecto a sus casilleros lindantes, por lo tanto es una disposición permitida." + diff --git a/app/examples/Games/Puzzle1To8/.lang/fr.po b/app/examples/Games/Puzzle1To8/.lang/fr.po new file mode 100644 index 00000000..4a2db834 --- /dev/null +++ b/app/examples/Games/Puzzle1To8/.lang/fr.po @@ -0,0 +1,111 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Puzzle1To8 3.13.90\n" +"POT-Creation-Date: 2019-06-04 19:28 UTC\n" +"PO-Revision-Date: 2019-06-04 19:25 UTC\n" +"Last-Translator: benoit \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Puzzle 1 to 8" +msgstr "Puzzle 1 à 8" + +#: .project:2 FrmAyuda.form:19 +msgid "Place the numbers 1 to 8 in each of the boxes without repeating, so that each box does not contain a correlative number to its neighbors or adjacent boxes. See the following examples:" +msgstr "Placez les nombres 1 à 8 dans chacune des cases sans vous répéter, de sorte que chaque boîte ne contienne pas un nombre corrélatif à ses voisins ou à des cases adjacentes. Voir les exemples suivants :" + +#: FMain.class:69 +msgid "Are you sure?" +msgstr "Es-tu sûr ?" + +#: FMain.class:69 +msgid "No" +msgstr "Non" + +#: FMain.class:69 +msgid "Yes" +msgstr "Oui" + +#: FMain.class:90 +msgid "Congratulations! You did it!" +msgstr "Félicitations ! Vous avez réussi !" + +#: FMain.form:22 +msgid "Puzzle 1 to 8 - Locate the numbers!" +msgstr "Puzzle 1 à 8 - Trouvez les chiffres !" + +#: FMain.form:27 +msgid "Game" +msgstr "Jeu" + +#: FMain.form:30 +msgid "Clear" +msgstr "Effacer" + +#: FMain.form:35 +msgid "Quit" +msgstr "Quitter" + +#: FMain.form:41 +msgid "Help" +msgstr "Aide" + +#: FMain.form:44 FrmAyuda.form:14 +msgid "How to play?" +msgstr "Comment jouer ?" + +#: FMain.form:49 FrmAbout.form:12 +msgid "About" +msgstr "A propos" + +#: FrmAbout.form:21 +msgid "Author" +msgstr "Auteur" + +#: FrmAbout.form:25 +msgid "" +"Author: Pablo Mileti.

You can submit your questions, suggestions, bugs, etc, to the following E-Mail address:\n" +" pablomileti@gmail.com" +msgstr "" +"Auteur: Pablo Mileti.

Vous pouvez soumettre vos questions, suggestions, bogues, etc. à l’adresse E-Mail suivante :\n" +"pablomileti@gmail.com" + +#: FrmAbout.form:29 +msgid "License" +msgstr "Licence" + +#: FrmAbout.form:33 +msgid "" +"\n" +" Copyright (C) 2010. Author: Pablo Mileti \n" +"\n" +"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.\n" +"\n" +"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.\n" +"\n" +"You should have received a copy of the GNU General Public License along with this program. If not, see ." +msgstr "" +"\n" +"Copyright (C) 2010. Auteur: Pablo Mileti\n" +"\n" +"Ce programme est un logiciel libre: vous pouvez le redistribuer et/ou le modifier selon les termes de la licence publique générale GNU telle que publiée par la Free Software Foundation, soit la version 3 de la licence, soit (à votre discrétion) toute version ultérieure.\n" +"\n" +"Ce programme est distribué dans l’espoir qu’il sera utile, mais sans aucune garantie; sans même la garantie implicite de qualité marchande ou d’adéquation à un usage particulier. Pour plus de détails, consultez la licence publique générale GNU.\n" +"\n" +"Vous auriez dû recevoir une copie de la licence publique générale GNU ainsi que ce programme. Sinon, voyez ." + +#: FrmAbout.form:43 FrmAyuda.form:43 +msgid "Close" +msgstr "Fermer" + +#: FrmAyuda.form:31 +msgid "Way incorrect:

The numbers 1 and 2 are consecutive and are in adjoining boxes, so it is not allowed." +msgstr "Manière incorrecte:

Les nombres 1 et 2 sont consécutifs et sont dans des cases adjacentes, il n’est donc pas autorisé." + +#: FrmAyuda.form:48 +msgid "Way correct:

There aren't correlativity between to the numbers entered with respect to their adjoining boxes, so it's allowed." +msgstr "Façon correcte:

Il n’y a pas de corrélation entre les nombres entrés par rapport à leurs cases adjacentes, donc c’est permis." diff --git a/app/examples/Games/Puzzle1To8/.lang/ru.po b/app/examples/Games/Puzzle1To8/.lang/ru.po new file mode 100644 index 00000000..b7a01ec7 --- /dev/null +++ b/app/examples/Games/Puzzle1To8/.lang/ru.po @@ -0,0 +1,126 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-06-17 02:57+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Games/Puzzle1To8/.project:18 +msgid "Puzzle 1 to 8" +msgstr "Головоломка с 1 по 8" + +#: app/examples/Games/Puzzle1To8/.project:19 app/examples/Games/Puzzle1To8/.src/FrmAyuda.form:10 +msgid "Place the numbers 1 to 8 in each of the boxes without repeating, so that each box does not contain a correlative number to its neighbors or adjacent boxes. See the following examples:" +msgstr "Разместите числа от 1 до 8 в каждом из блоков без повторения, чтобы каждый блок не содержал номера, соответствующего его соседям или смежным блокам. Смотрите следующие примеры:" + +#: app/examples/Games/Puzzle1To8/.src/FMain.class:61 app/examples/Games/Puzzle1To8/.src/FMain.form:6 +msgid "Puzzle 1 to 8 - Locate the numbers!" +msgstr "Головоломка с 1 по 8 - разместите номера!" + +#: app/examples/Games/Puzzle1To8/.src/FMain.class:69 +msgid "Are you sure?" +msgstr "Вы уверены?" + +#: app/examples/Games/Puzzle1To8/.src/FMain.class:69 +msgid "Yes" +msgstr "Да" + +#: app/examples/Games/Puzzle1To8/.src/FMain.class:69 +msgid "No" +msgstr "Нет" + +#: app/examples/Games/Puzzle1To8/.src/FMain.class:90 +msgid "Congratulations! You did it!" +msgstr "Поздравляем! Вы сделали это!" + +#: app/examples/Games/Puzzle1To8/.src/FMain.form:10 +msgid "Game" +msgstr "Игра" + +#: app/examples/Games/Puzzle1To8/.src/FMain.form:12 +msgid "Clear" +msgstr "Очистить" + +#: app/examples/Games/Puzzle1To8/.src/FMain.form:16 +msgid "Quit" +msgstr "Выход" + +#: app/examples/Games/Puzzle1To8/.src/FMain.form:21 +msgid "Help" +msgstr "Справка" + +#: app/examples/Games/Puzzle1To8/.src/FMain.form:23 app/examples/Games/Puzzle1To8/.src/FrmAyuda.form:6 +msgid "How to play?" +msgstr "Как играть?" + +#: app/examples/Games/Puzzle1To8/.src/FMain.form:27 app/examples/Games/Puzzle1To8/.src/FrmAbout.form:5 +msgid "About" +msgstr "О программе" + +#: app/examples/Games/Puzzle1To8/.src/FrmAbout.form:13 +msgid "Author" +msgstr "Автор" + +#: app/examples/Games/Puzzle1To8/.src/FrmAbout.form:16 +msgid "" +"Author: Pablo Mileti.

You can submit your questions, suggestions, bugs, etc, to the following E-Mail address:\n" +" pablomileti@gmail.com" +msgstr "" +"Автор: Пабло Милети.

Вы можете отправить свои вопросы, предложения, ошибки и т. д. на следующий электронный адрес:\n" +"pablomileti@gmail.com" + +#: app/examples/Games/Puzzle1To8/.src/FrmAbout.form:20 +msgid "License" +msgstr "Лицензия" + +#: app/examples/Games/Puzzle1To8/.src/FrmAbout.form:23 +msgid "" +"\n" +" Copyright (C) 2010. Author: Pablo Mileti \n" +"\n" +"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.\n" +"\n" +"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.\n" +"\n" +"You should have received a copy of the GNU General Public License along with this program. If not, see ." +msgstr "" +"\n" +" Copyright (C) 2010. Автор: Пабло Милети\n" +"\n" +"Эта программа ― свободное программное обеспечение. Вы можете распространять или изменять его при условиях соответствия лицензии GNU General Public License опубликованной Free Software Foundation; либо версии 3 лицензии, либо (на ваше усмотрение) любой более поздней версии.\n" +"\n" +"Программа распространяется в надежде на то, что приложение будет полезно, но БЕЗ ВСЯКИХ ГАРАНТИЙ; не гарантируется даже ПРИГОДНОСТЬ или СООТВЕТСТВИЕ КАКИМ-ЛИБО ТРЕБОВАНИЯМ. Для получения дополнительной информации ознакомьтесь с лицензией GNU General Public License.\n" +"\n" +"Вы должны получить копию лицензии GNU General Public License вместе с программой. Если этого не произошло, посмотрите ." + +#: app/examples/Games/Puzzle1To8/.src/FrmAbout.form:32 app/examples/Games/Puzzle1To8/.src/FrmAyuda.form:30 +msgid "Close" +msgstr "Закрыть" + +#: app/examples/Games/Puzzle1To8/.src/FrmAyuda.form:20 +msgid "Way incorrect:

The numbers 1 and 2 are consecutive and are in adjoining boxes, so it is not allowed." +msgstr "Неверный путь:

числа 1 и 2 являются последовательными и находятся в соседних блоках, поэтому это не допускается." + +#: app/examples/Games/Puzzle1To8/.src/FrmAyuda.form:34 +msgid "Way correct:

There aren't correlativity between to the numbers entered with respect to their adjoining boxes, so it's allowed." +msgstr "Неверный путь:

не существует корреляции между числами относительно их соседних блоков, поэтому это разрешено." + diff --git a/app/examples/Games/Puzzle1To8/.project b/app/examples/Games/Puzzle1To8/.project new file mode 100644 index 00000000..06150596 --- /dev/null +++ b/app/examples/Games/Puzzle1To8/.project @@ -0,0 +1,17 @@ +# Gambas Project File 3.0 +Title=Puzzle 1 to 8 +Startup=FMain +Icon=logo.png +Version=3.13.90 +VersionFile=1 +Component=gb.image +Component=gb.gui +Component=gb.form +Component=gb.vb +Description="Place the numbers 1 to 8 in each of the boxes without repeating, so that each box does not contain a correlative number to its neighbors or adjacent boxes. See the following examples:" +Authors="Pablo Mileti" +Environment="GB_GUI=gb.gtk3" +TabSize=2 +Translate=1 +Language=en_US +Packager=1 diff --git a/app/examples/Games/Puzzle1To8/.src/Casillero.class b/app/examples/Games/Puzzle1To8/.src/Casillero.class new file mode 100644 index 00000000..3d3fc714 --- /dev/null +++ b/app/examples/Games/Puzzle1To8/.src/Casillero.class @@ -0,0 +1,66 @@ +' Gambas class file + +' Copyright(C)2010. Autor: Pablo Mileti + +'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.IfNot, see < http: / / www.gnu.org / licenses / > . + + +'****English documentation***** +'This class represents each box of the game (8) + +' Public Var: +' Value ---> Contains the number that was put in a box +' isEmpty ---> Return true if value is 0, else return false +' isInvalid ---> Return true if Value there are a conflict with the value of another box + +' Public Methods: +'setValue(nValue As Integer) ---> Put a value in a box +'validateWith(nBox As Casillero) ---> Return true if there are a conflict with a neighbor box + + + +'* * * * Documentación en español******* +' Esta clase corresponde a representar cada uno de los 8 casilleros del juego + +' Variables públicas: +' Value ---> Contiene el numero que se ingreso en el casillero +' isEmpty ---> True si no hay valor, False si lo tiene +' isInvalid ---> True si hay un numero que esta en conflicto con otro casillero + +' Metodos públicos: +'setValue(nValue As Integer) - - > Se encarga de almacenar el nro de un casillero +'validateWith(nBox As Casillero) ---> Devuelve true si hay conflicto con otro casillero + +Public Value As Integer +Public isEmpty As Boolean +Public isInvalid As Boolean + +Public Sub _new() + Value = 0 + isEmpty = True + isInvalid = True +End + +Public Sub setValue(nValue As Integer) + Value = nvalue + If nvalue = 0 Then + isEmpty = True + Else + isEmpty = False + End If +End + +Public Function validateWith(nBox As Casillero) As Boolean + If isEmpty Or nBox.isEmpty Then Return False + If value + 1 = nBox.Value Then Return True + If value - 1 = nBox.Value And Value > 1 Then Return True +End + + + + + diff --git a/app/examples/Games/Puzzle1To8/.src/Esquema.class b/app/examples/Games/Puzzle1To8/.src/Esquema.class new file mode 100644 index 00000000..17cc9657 --- /dev/null +++ b/app/examples/Games/Puzzle1To8/.src/Esquema.class @@ -0,0 +1,110 @@ +' Gambas class file + +' Copyright(C)2010. Autor: Pablo Mileti + +'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.IfNot, see < http: / / www.gnu.org / licenses / > . + + + +'****English documentation***** +'This class represents the gameboard, all boxes of the game. + +'Public var: +'Boxes---> Array of Casillero (box), there are 9 elements, it uses from 1 to 8. + +'Public methods: +'Set---> Put a value in a object Casillero (box). Receive 2 parameters: the position of the box in the gameboard and the value to put, return true if there are a conflict with another box. +'isRepeats---> Return true if value already exists in another box. +'isInvalid---> Compare a determinated box (parameter), with your neighbor boxes. Return true if there are conflicts. +'isWin---> If all boxes have a correct value and nothing is empty then return true - Win! + + + + +'* * * * * Documentación en español ****** +'Esta clase representa el juego en conjunto, es decir integro los 8 casilleros + +'Variables públicas: +'Boxes---> Array de Casilleros, son 9 elementos, se usan del 1 al 8. + +'Métodos públicos: +'Set---> Se encarga de darle un valor a cada Casillero. Recibe 2 parametros el nro de casillero y el valor, devuelve true si ese valor entra en conflicto con otro casillero +'isRepeats--->Devuelve true si el valor de un casillero ya esta en otro. +'isInvalid---> Compara un determinado casillero, segun su parametro, con sus casilleros vecinos. Devuelve true si hay conflicto +'isWin---> Verifica si todos los casilleros tienen un valor correcto, si todos son correctos y no hay ninguno vacio devuelve true. + +Public Boxes As New Casillero[9] + +Public Sub _new() + Dim i As Integer + For i = 1 To 8 + Boxes[i] = New Casillero + Next +End + +Public Function Set(nBox As Integer, nValue As Integer) As Boolean + Boxes[nbox].setValue(nValue) + If (isRepeats(nBox) And nValue <> 0) Or isInvalid(nBox) Then + Boxes[nBox].isInvalid = True + Return True + Else + Boxes[nBox].isInvalid = False + Return False + End If +End + +Private Function isRepeats(nBox As Integer) As Boolean + Dim i As Integer + For i = 1 To 8 + If i <> nBox Then + If Boxes[nBox].Value = Boxes[i].Value Then + Return True + End If + End If + Next + Return False +End + +Private Function isInvalid(nBox As Integer) As Boolean +Select Case nBox +Case 1 + Boxes[1].isInvalid = Boxes[1].validateWith(Boxes[2]) Or Boxes[1].validateWith(Boxes[3]) Or Boxes[1].validateWith(Boxes[4]) + Return Boxes[1].isInvalid +Case 2 + Boxes[2].isInvalid = Boxes[2].validateWith(Boxes[1]) Or Boxes[2].validateWith(Boxes[3]) Or Boxes[2].validateWith(Boxes[5]) Or Boxes[2].validateWith(Boxes[6]) + Return Boxes[2].isInvalid +Case 3 + Boxes[3].isInvalid = Boxes[3].validateWith(Boxes[1]) Or Boxes[3].validateWith(Boxes[2]) Or Boxes[3].validateWith(Boxes[4]) Or Boxes[3].validateWith(Boxes[5]) Or Boxes[3].validateWith(Boxes[6]) Or Boxes[3].validateWith(Boxes[7]) + Return Boxes[3].isInvalid +Case 4 + Boxes[4].isInvalid = Boxes[4].validateWith(Boxes[1]) Or Boxes[4].validateWith(Boxes[3]) Or Boxes[4].validateWith(Boxes[6]) Or Boxes[4].validateWith(Boxes[7]) + Return Boxes[4].isInvalid +Case 5 + Boxes[5].isInvalid = Boxes[5].validateWith(Boxes[2]) Or Boxes[5].validateWith(Boxes[3]) Or Boxes[5].validateWith(Boxes[6]) Or Boxes[5].validateWith(Boxes[8]) + Return Boxes[5].isInvalid +Case 6 + Boxes[6].isInvalid = Boxes[6].validateWith(Boxes[2]) Or Boxes[6].validateWith(Boxes[3]) Or Boxes[6].validateWith(Boxes[4]) Or Boxes[6].validateWith(Boxes[5]) Or Boxes[6].validateWith(Boxes[7]) Or Boxes[6].validateWith(Boxes[8]) + Return Boxes[6].isInvalid +Case 7 + Boxes[7].isInvalid = Boxes[7].validateWith(Boxes[3]) Or Boxes[7].validateWith(Boxes[4]) Or Boxes[7].validateWith(Boxes[6]) Or Boxes[7].validateWith(Boxes[8]) + Return Boxes[7].isInvalid +Case 8 + Boxes[8].isInvalid = Boxes[8].validateWith(Boxes[5]) Or Boxes[8].validateWith(Boxes[6]) Or Boxes[8].validateWith(Boxes[7]) + Return Boxes[8].isInvalid +End Select +End + + +Public Function isWin() As Boolean + Dim i As Integer + For i = 1 To 8 + If Boxes[i].isInvalid Or Boxes[i].isEmpty Then + Return False + End If + Next + Return True +End diff --git a/app/examples/Games/Puzzle1To8/.src/FMain.class b/app/examples/Games/Puzzle1To8/.src/FMain.class new file mode 100644 index 00000000..de579899 --- /dev/null +++ b/app/examples/Games/Puzzle1To8/.src/FMain.class @@ -0,0 +1,111 @@ +' Gambas class file + +' Copyright(C)2010. Autor: Pablo Mileti + +'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.IfNot, see < http: / / www.gnu.org / licenses / > . + + + +'****English documentation***** +'Public sub +'Winner() ---> Procedure to Finish the game and write a congratulation message! +'updateBoxes()---> Rewrite the values in each box to compare with the last value wrote. If it presents conflict, mark it with red color. + + +'* * * * * Documentación en español ****** +'Public sub +'Winner() ---> Ha ganado el juego, finalizarlo y felicitar! +'updateBoxes()---> Volver a escribir los valores en cada casillero para que se compare con el ultimo valor ingresado y se coloree si ha conflicto + + +Public Game As Esquema + +Public Sub Form_Open() + Game = New Esquema + Me.Window.Center +End + +Public Sub TXT_Change() + Dim value As Integer + If Last.text = "" Then + value = 0 + Else + value = Val(Last.text) + End If + Game.Set(Last.tag, value) + updateBoxes() + If Game.isWin() Then Winner() +End + +Public Sub TXT_KeyPress() + If Not (Key.code = Key.BackSpace Or Key.code = Key.Delete Or Key.Code = Key.F10) Then + If InStr("12345678", Key.Text) = 0 Then Stop Event + End If +End + +Public Sub MnuReiniciar_Click() + Dim control As Object + Game = New Esquema + For Each control In Me.Children + If Object.Type(control) = "TextBox" Then + control.text = "" + control.foreground = &H000000& + control.background = &HFFFFFF& + control.enabled = True + End If + Next + Me.Title = ("Puzzle 1 to 8 - Locate the numbers!") +End + +Public Sub MnuSalir_Click() + Me.Close +End + +Public Sub Form_Close() + If Message.Question(("Are you sure?"), ("Yes"), ("No")) = 2 Then + Stop Event + End If +End + +Public Sub MnuAutor_Click() + FrmAbout.Showmodal() +End + +Public Sub MnuComoJugar_Click() + FrmAyuda.Show() +End + +Public Sub Winner() + Dim control As Object + For Each control In Me.Children + If Object.Type(control) = "TextBox" Then + control.background = &FFFF9F& + control.enabled = False + End If + Next + Me.Title = ("Congratulations! You did it!") +End + +Private Sub updateBoxes() + Dim control As Object + Dim value As Integer + For Each control In Me.Children + If Object.Type(control) = "TextBox" Then + If control.text = "" Then + value = 0 + Else + value = Val(control.text) + End If + If Game.Set(control.tag, value) Then + control.foreground = &HFF0000& + Else + control.foreground = &000000& + End If + End If + Next +End + diff --git a/app/examples/Games/Puzzle1To8/.src/FMain.form b/app/examples/Games/Puzzle1To8/.src/FMain.form new file mode 100644 index 00000000..98665517 --- /dev/null +++ b/app/examples/Games/Puzzle1To8/.src/FMain.form @@ -0,0 +1,95 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,62,50) + Background = Color.LightForeground + Text = ("Puzzle 1 to 8 - Locate the numbers!") + Icon = Picture["logo.png"] + Resizable = False + { MnuJuego Menu + Text = ("Game") + { MnuReiniciar Menu + Text = ("Clear") + Picture = Picture["icon:/small/refresh"] + } + { MnuSalir Menu + Text = ("Quit") + Picture = Picture["icon:/small/quit"] + } + } + { Mnuayuda Menu + Text = ("Help") + { MnuComoJugar Menu + Text = ("How to play?") + Picture = Picture["icon:/small/help"] + } + { MnuAutor Menu + Text = ("About") & "..." + Picture = Picture["icon:/small/gambas"] + } + } + { TextBox1 TextBox TXT + Name = "TextBox1" + MoveScaled(25,5,12,9) + Font = Font["Bitstream Charter,+8"] + Tag = "1" + Alignment = Align.Center + MaxLength = 1 + } + { TextBox2 TextBox TXT + Name = "TextBox2" + MoveScaled(13,14,12,9) + Font = Font["Bitstream Charter,+8"] + Tag = "2" + Alignment = Align.Center + MaxLength = 1 + } + { TextBox3 TextBox TXT + Name = "TextBox3" + MoveScaled(25,14,12,9) + Font = Font["Bitstream Charter,+8"] + Tag = "3" + Alignment = Align.Center + MaxLength = 1 + } + { TextBox4 TextBox TXT + Name = "TextBox4" + MoveScaled(37,14,12,9) + Font = Font["Bitstream Charter,+8"] + Tag = "4" + Alignment = Align.Center + MaxLength = 1 + } + { TextBox5 TextBox TXT + Name = "TextBox5" + MoveScaled(13,23,12,9) + Font = Font["Bitstream Charter,+8"] + Tag = "5" + Alignment = Align.Center + MaxLength = 1 + } + { TextBox6 TextBox TXT + Name = "TextBox6" + MoveScaled(25,23,12,9) + Font = Font["Bitstream Charter,+8"] + Tag = "6" + Alignment = Align.Center + MaxLength = 1 + } + { TextBox7 TextBox TXT + Name = "TextBox7" + MoveScaled(37,23,12,9) + Font = Font["Bitstream Charter,+8"] + Tag = "7" + Alignment = Align.Center + MaxLength = 1 + } + { TextBox8 TextBox TXT + Name = "TextBox8" + MoveScaled(25,32,12,9) + Font = Font["Bitstream Charter,+8"] + Tag = "8" + Alignment = Align.Center + MaxLength = 1 + } +} diff --git a/app/examples/Games/Puzzle1To8/.src/FrmAbout.class b/app/examples/Games/Puzzle1To8/.src/FrmAbout.class new file mode 100644 index 00000000..217d0bdd --- /dev/null +++ b/app/examples/Games/Puzzle1To8/.src/FrmAbout.class @@ -0,0 +1,18 @@ +' Gambas class file + +' Copyright(C)2010. Autor: Pablo Mileti + +'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.IfNot, see < http: / / www.gnu.org / licenses / > . + + +Public Sub Form_Open() + Me.Window.Center +End + +Public Sub Button1_Click() + Me.Close +End diff --git a/app/examples/Games/Puzzle1To8/.src/FrmAbout.form b/app/examples/Games/Puzzle1To8/.src/FrmAbout.form new file mode 100644 index 00000000..7898c4dd --- /dev/null +++ b/app/examples/Games/Puzzle1To8/.src/FrmAbout.form @@ -0,0 +1,39 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,75,36) + Text = ("About") & "..." + Resizable = False + { TabStrip1 TabStrip + MoveScaled(1,1,52,34) + Arrangement = Arrange.Fill + Margin = True + Count = 2 + Index = 0 + Text = ("Author") + { TextLabel1 TextLabel + MoveScaled(2,2,41,21) + Text = ("Author: Pablo Mileti.

You can submit your questions, suggestions, bugs, etc, to the following E-Mail address:\n pablomileti@gmail.com") + Alignment = Align.Justify + } + Index = 1 + Text = ("License") + { TextArea1 TextArea + MoveScaled(2,3,42,22) + Text = ("\n Copyright (C) 2010. Author: Pablo Mileti \n\nThis 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.\n\nThis 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.\n\nYou should have received a copy of the GNU General Public License along with this program. If not, see .") + ReadOnly = True + Wrap = True + ScrollBar = Scroll.Vertical + } + Index = 0 + } + { Button1 Button + MoveScaled(54,31,20,4) + Text = Shortcut(("Close"), "C") + } + { PictureBox1 PictureBox + MoveScaled(54,1,20,20) + Picture = Picture["logo.png"] + Stretch = True + } +} diff --git a/app/examples/Games/Puzzle1To8/.src/FrmAyuda.class b/app/examples/Games/Puzzle1To8/.src/FrmAyuda.class new file mode 100644 index 00000000..42f43ffd --- /dev/null +++ b/app/examples/Games/Puzzle1To8/.src/FrmAyuda.class @@ -0,0 +1,18 @@ +' Gambas class file + + +' Copyright(C)2010. Autor: Pablo Mileti + +'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.IfNot, see < http: / / www.gnu.org / licenses / > . + +Public Sub Button1_Click() + Me.close +End + +Public Sub Form_Open() + Me.Window.center +End diff --git a/app/examples/Games/Puzzle1To8/.src/FrmAyuda.form b/app/examples/Games/Puzzle1To8/.src/FrmAyuda.form new file mode 100644 index 00000000..2b7d295c --- /dev/null +++ b/app/examples/Games/Puzzle1To8/.src/FrmAyuda.form @@ -0,0 +1,37 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,68,66) + Background = Color.LightForeground + Text = ("How to play?") + Resizable = False + { TextLabel1 TextLabel + MoveScaled(2,2,63,11) + Text = ("Place the numbers 1 to 8 in each of the boxes without repeating, so that each box does not contain a correlative number to its neighbors or adjacent boxes. See the following examples:") + Alignment = Align.Justify + } + { PictureBox1 PictureBox + MoveScaled(32,15,32,21) + Picture = Picture["ejemplo1.png"] + Stretch = True + } + { TextLabel3 TextLabel + MoveScaled(2,15,28,21) + Text = ("Way incorrect:

The numbers 1 and 2 are consecutive and are in adjoining boxes, so it is not allowed.") + Alignment = Align.Justify + } + { PictureBox2 PictureBox + MoveScaled(32,38,32,21) + Picture = Picture["ejemplo2.png"] + Stretch = True + } + { Button1 Button + MoveScaled(23,60,22,5) + Text = Shortcut(("Close"), "C") + } + { TextLabel2 TextLabel + MoveScaled(2,39,28,18) + Text = ("Way correct:

There aren't correlativity between to the numbers entered with respect to their adjoining boxes, so it's allowed.") + Alignment = Align.Justify + } +} diff --git a/app/examples/Games/Puzzle1To8/Licence b/app/examples/Games/Puzzle1To8/Licence new file mode 100644 index 00000000..b17f91b9 --- /dev/null +++ b/app/examples/Games/Puzzle1To8/Licence @@ -0,0 +1,189 @@ +GNU GENERAL PUBLIC LICENSE + +Version 3, 29 June 2007 + +Copyright © 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 \ No newline at end of file diff --git a/app/examples/Games/Puzzle1To8/ejemplo1.png b/app/examples/Games/Puzzle1To8/ejemplo1.png new file mode 100644 index 0000000000000000000000000000000000000000..fa41d8272840de5b877321438986b3efa602b9d2 GIT binary patch literal 5594 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 Uxya5^Ea2e44NVO2H*Y`qC#&<-5dZ)H literal 0 HcmV?d00001 diff --git a/app/examples/Games/Puzzle1To8/ejemplo2.png b/app/examples/Games/Puzzle1To8/ejemplo2.png new file mode 100644 index 0000000000000000000000000000000000000000..4fd108c2eb12eeded962c8024fb618748d72a5a3 GIT binary patch literal 5481 zcmdUzXHe5!o5q7u6dnadP^l^)(jNt-21Jw&(n4>dQiX@mi4c&gA_yo&O6UnmNB|`$ zp^1o6gwR4$Ktv!UbP|xnkc~UD&+a?(?uXrVc6L9UFZZ0e=lsvP?*ClB>yeeE(Ggw| zUH|}a#Kicz4FJGV!(O_FxY?B+0o;kz)zT5_N$oW0$MuVM>GscKGg#s~NIS)oes@<;gf}!!KtMpD=lp5i70O=JM%15oI_Ep{repify(5eBe1PkGfcREd z=@XB+fCmA9*$XGA>|?DQPT&Ik`M{F{V1C9C01!MR40y}=f2MTyI2Ca9b`%Uq^_V$cN+dBA8PC~H8JEUE{K^*{a zUO*8Lf0&aG;CZ0q03iSB|FBew`~i-ouPIuzE_kJDzAP-agj>GAX_Aofv4+wl4nSWE ziU`?WST48{h=*ImIo%bF{OPYq+Ki9o?KmJ3U{(($`joD@z6w{J+6+D-HskVQy{$4@ zG(qC%#IAs1X?;1*GEbx)=Gb(G)vOeR9M3$LeT7nGEq)o|?KU{V!4ON}QnS}EGJpm{ z25kX;iD}Be;S+sr+FZwH!Gc!>=eFzO?M5-gCp~ea?doqlf>^3ftgbiiO`9QZOy@id zzZxQ)Ud%EpCQ1oYN8?R6`HXK&e}pU#nBd!Ec0Fdc#-#Aum_V0{#W5=joP56030#%s z;Sb<3-vUerLjivACAWTqp#KQ@u5q>rCQ3cy-4tY#(b*~482mI@Gh^PjeML-3K`xha z-j>BT@`Q38=j)y|wG?K3F6$6P%=4+{jZkm8K0k+A5(Uqj8l$8VZC0o-*0ZU`!Y9z2Z%IrMI4P;W|$=l(77Pch6 zjNj7nIL?DR^0)eLnb-sdrpu${od|||WJn0hyvt!+us_ig2Ow+k&8 z{D?9yeI%`}H2$uMHCA3F=@*-WezL<;Z8Y1V738QF9=N~>geirK;_eN_HGEy&#Vx){ zN9|l9&b@_^BdK65_|1$*@}A0&qhGB{W$UH(HdVE1;~psQ_gw>3H(NHfS=B1<880lLK|8gw zVST58LZ&gLOHd||Cd$gUALjyY&Y*+(Z3`w;Zu&5xDY`3R<;txURw`|cSJQ+CMm~LH zm71kQ=13EBftY}l-SH&Zarx8KL0@aJTl(4G9ojM4mg2RDE1bYbXL~>ekby~gS1A)C z(o}RUWvpzqah)q-O~+DQOx08h^2b=_=UjiL>PhlX+l-N#!#wh0)Rp^%-{mdD<1%<1 zOl)9liV$lDvBu7kkXif=1%M#))JzknV5p zJjceV_5jN{8Ws1R1r-)%N{8dWLYa_M$H1iqP)F_B@QYPxzclw3Iu-#Mia&T+X zuNuB_ZvQHT$(ByeQP;Z3i0xM@jyOnVN|Dv=l?RPBOMPY;8cx9Qu&2N`x4i!<)@ixT zOsOTV*VvvT%?){J$mEad1m?$988W?K$ICeIdtHpMkmbYr{CATO1&_(}*=E$FSRSHw z@?hAdQ8>srTlR)()4RaPOFX2pPG)QQ{2?n=&tGYI92v%8hKano4nPpN*7dfI!?Vrdq+ zCpoWKXh!d*Y;i0Ws?ma&ikTK4`dmGHgF;q6I$SNtZ*4f3Skbld^EtdFy_Q@slviDC zNRD0z1M2L1Djy3HFq$+V5bNkSwr5*xDwOZrquY-wd3bzkcCd9Y8J@#`SC_4pGIC7+ zj{HV6q4&37HrMI%a`-DHbcA3+PR4Ns>W1cRwLJqQadVfP{5b^)+)d)rq0;ujXhyI^Lm) z5u)THE{+Q!JCiMr{CH5k+lr_`d<;}GjClH^qNj)=>T7HmJ^IH62#1C683Nm4#fXAE`m zk1yBAZG+tF&2R9#BUE`JCZMlwE`2FGoOslV#V0{z;9AnVVTX|;{2tcfI&$i#9TpIh zr1ZEin6wn{fZLPzrsF0zwWy>3D&a^AuR^gvjaruLZVmJj-Me+w3|LzLN6zzqyL?2> z#J9`9r}}Hlwb;^_=^yk$`JYY?wAN=0I#u#35yCkE2AhKTIYugR{lqAeT6S2A`~>OT z^I3KEn5>i;M)e(Uvg#<@_T~{?8ZUDbS5*L>)6cHNf74c5Y-y(ms*_BHY!2CLRVxii zet=cUj+t4`Qo>j_QmaE&MKDg=M2~>iB~TOp(7mG`jHtxM;NZGqhy5DmrWm-q42^D4 zhLwCtX?DFndN!_ztps=ufoa}EOMO}B;|ebUZa<332&@d2Emre;Y3bJ*{)(LJLhVjn z;i%+G$l=ajV2uj$y>44gXRQU&-D}shetb=g+@=VKM-xBOW^wMxw;^$RxK3z|gF@nd z-ine=>`t%bhV{TWn4&~+!;6v zxfz-p{L%a*+h^1z>B>1_Fg!(*T9uvZ#jfcnM*jBYQfQyYtLqCbC06sA7w-nPUmG0B zozentlt>)17kMZ~4{e=iY_)IZp|{?3&}NCCJmu=Wt$@wbTFAgbR(5N0h3`F=%C^BN zmA1X&NaX}qn%+($z=dCVvG3bYJ|IMjD(MfW2u&AcQK&}oJp^KXJjZ65j8z@fI11KeVa-Eq)AHQwEQO+}xiU`uAIFs;0lYSEzK%~j1d(_a_H ziCB$PTdvi!jx?G2nQ&f0(^Or@0cD}>w!eh*pA4JU@UMo_;0kiKAE%j>SaPRJ+Dc72 zx4WAAbYmct`fv?KtB+{gAvp9uK1rnrW(=iw(bi=&uvRxcW(w8YEu>mb@c2H@)XFF- zSNDz>b()u5#u3uODEw_07ghX)*XwiSFNRYMkVnF`6AiS*A*ryL#G4e@;ihk^&XEh% z%#9w%>R-ctf|7&Hn*=Ip;^5_0LS*>2%o*|t%-B?RT)-Gbp@H_6ay5N_S_(ocm?M8u zb#$I<7xis;h|g#N)nYY0Zamd3ZP!&bV>#QQs?vIKcG+Iy|9aa|Q=Cj{!o}XtC9gZ^ z5KPz)r#Sn~ZnMkGG9KE*b|@7B&f0gkmo^D`iLc%rtf#NZ&4;bMuh)7hSfZ4faY#7x zoGj(f^f#mk_Sz{mx~S3;2m9b2`}BjmI8}N=^qAtxnM$V7mx??eDE7_;vs7qW2@WuE zUqEq1x`J{hog_j%0oVY!${hOd@*VMQ zZza3L&udJnXdCsJK3>50lzzPUG5ndcTCMSFDE>m0aUD#~3s^XYr94`kKhghUnFsj3 zZ6Mq&*`O^qucfMAh_b+NAC!9WP2()Cf54h`wo|AUZ5tS<^taKxj^1PY%;RZY&vS@| zLl-1hr%#3VRHD%GLQg-+)WeYf*1dyAqcL-8N(5vN`bCK=Qfg16K7voACkgQ;|Jrwp zeTsi>j$QwmIqp~+8$n~NQwa_iY#7O6C7zd))-_DM8y&u7wry2hl+oz*zru;;l742A zQ>$njsjsnqY zBV>Vii-PlQkxKFZM-l&jFM6;~3;qY5d$qdO3xWHO)2QM`ZGDg{x$F2Xaaq#Eo#?Dm z9%G)rG0&b&|GcSAJ1N1_mBRfBHjE-=Q|aS1K93__!yeV#`}LT;%aIL5!5XAv7MpGk zC9T`|FU*kV#?lEAJ|&C)HR&fzV|*wNE9?VIg;3bc`R(U}0&Vl%eZBS#1cAVr>@&{& z4?S_2j*9S_nk$bDEA*dw*|=Rol2N8z^I(%2ACw~j&VKmv=wRilgKgOl)Izu8W}r%14C>EZwk6Z0)GPk zNAc-DJ-Bia;X7ciM>-py671$Mmsz_Y^Os*}7v%2%Ebvw6Xk2%27lr&#_|rp9AYjmH zF4(c&(L6Cjw8~dagiY*3nP(_0O4|O?ARI}bPoa2C+({0$M-Z;8V;Se5i{ Warw)WKiOF&z~qMIb?i0Ignt2a#J73? literal 0 HcmV?d00001 diff --git a/app/examples/Games/Puzzle1To8/logo.png b/app/examples/Games/Puzzle1To8/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..bd7a6ecb124c71d724093c1265d18f04e6d6abda GIT binary patch literal 41279 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

    aoPw@^hX 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 literal 0 HcmV?d00001 diff --git a/app/examples/Games/RobotFindsKitten/.directory b/app/examples/Games/RobotFindsKitten/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/app/examples/Games/RobotFindsKitten/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/app/examples/Games/RobotFindsKitten/.icon.png b/app/examples/Games/RobotFindsKitten/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..22619f882e95662d476a4c1fc66c62e6b446aed6 GIT binary patch literal 4141 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 literal 0 HcmV?d00001 diff --git a/app/examples/Games/RobotFindsKitten/.lang/ca.po b/app/examples/Games/RobotFindsKitten/.lang/ca.po new file mode 100644 index 00000000..e1325016 --- /dev/null +++ b/app/examples/Games/RobotFindsKitten/.lang/ca.po @@ -0,0 +1,40 @@ +# Catalan translation of RobotFindsKitten +# Copyright (C) 2000-2010 Benoît Minisini. +# This file is distributed under the same license as the RobotFindsKitten package. +# Jordi Sayol , 2007-2010. +# +# +msgid "" +msgstr "" +"Project-Id-Version: RobotFindsKitten\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2011-03-20 21:58+0100\n" +"Last-Translator: Jordi Sayol \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: .project:1 +msgid "gambrfk" +msgstr "-" + +#: Frfk.class:180 +msgid "You found kitten! Way to go, robot!" +msgstr "Heu trobat el gatet! Ben fet robot!" + +#: Frfk.class:203 +msgid "robotfindskitten" +msgstr "robottrobaelgatet" + +#: Frfk.class:211 +msgid "Esc" +msgstr "Esc" + +#: Frfk.class:231 +msgid "In this game, you are robot (#). Your job is to find kitten. This task is complicated by the existence of various things which are not kitten. Robot must touch items to determine if they are kitten or not. The game ends when robot finds kitten. Alternatively, you may end the game by hitting the Esc key.\n" +msgstr "En aquest joc, sou el robot (#). La vostra missió es trobar el gatet. Aquesta tasca es complica per l'existència de diverses coses que no son el gatet. El robot ha de tocar les coses per determinar si son el gatet o no. El joc acaba quan el robot troba el gatet. També podeu acabar el joc tot prement la tecla Esc.\n" + diff --git a/app/examples/Games/RobotFindsKitten/.lang/cs.po b/app/examples/Games/RobotFindsKitten/.lang/cs.po new file mode 100644 index 00000000..12cbca63 --- /dev/null +++ b/app/examples/Games/RobotFindsKitten/.lang/cs.po @@ -0,0 +1,32 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "gambrfk" +msgstr "-" + +#: Frfk.class:180 +msgid "You found kitten! Way to go, robot!" +msgstr "NaÅ¡el jsi kočku! Jdi do cesty, robot!" + +#: Frfk.form:13 +msgid "robotfindskitten" +msgstr "-" + +#: Frfk.form:21 +msgid "Esc" +msgstr "-" + +#: Frfk.form:40 +msgid "In this game, you are robot (#). Your job is to find kitten. This task is complicated by the existence of various things which are not kitten. Robot must touch items to determine if they are kitten or not. The game ends when robot finds kitten. Alternatively, you may end the game by hitting the Esc key.\n" +msgstr "V této hře, jsi robot (#). Vaším úkolem je najít kotě. Tato úloha je komplikována existencí různých věcí, které nejsou kotě. Robot se musí dotknout položek k určení, jsou-li kotě nebo ne. Hra končí, když zjistí, kotě robot. Alternativně můžete hru ukončit a stisknouttlačítko Esc.\n" diff --git a/app/examples/Games/RobotFindsKitten/.lang/de.po b/app/examples/Games/RobotFindsKitten/.lang/de.po new file mode 100644 index 00000000..2acb6415 --- /dev/null +++ b/app/examples/Games/RobotFindsKitten/.lang/de.po @@ -0,0 +1,32 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "gambrfk" +msgstr "-" + +#: Frfk.class:180 +msgid "You found kitten! Way to go, robot!" +msgstr "Du hast das Kätzchen gefunden. Gut gemacht, Roboter!" + +#: Frfk.form:13 +msgid "robotfindskitten" +msgstr "-" + +#: Frfk.form:21 +msgid "Esc" +msgstr "-" + +#: Frfk.form:40 +msgid "In this game, you are robot (#). Your job is to find kitten. This task is complicated by the existence of various things which are not kitten. Robot must touch items to determine if they are kitten or not. The game ends when robot finds kitten. Alternatively, you may end the game by hitting the Esc key.\n" +msgstr "In diesem Spiel bist du ein Roboter (#). Deine Aufgabe ist es, das Kätzchen zu finden. Das ist kompliziert, weil verschiedene Dinge existieren, die kein Kätzchen sind. Du musst die Dinge berühren, um zu bestimmen, ob sie das Kätzchen sind oder nicht. Das Spiel endet, wenn der Roboter das Kätzchen gefunden hat. Alternativ kannst du das Spiel mit der ESC-Taste beenden.\n" diff --git a/app/examples/Games/RobotFindsKitten/.lang/es.po b/app/examples/Games/RobotFindsKitten/.lang/es.po new file mode 100644 index 00000000..463341c0 --- /dev/null +++ b/app/examples/Games/RobotFindsKitten/.lang/es.po @@ -0,0 +1,28 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: Frfk.class:220 +msgid "Esc" +msgstr "Esc" + +#: .project:1 +msgid "gambrfk" +msgstr "gambrfk" + +#: Frfk.class:211 +msgid "In this game, you are robot (#). Your job is to find kitten. This task is complicated by the existence of various things which are not kitten. Robot must touch items to determine if they are kitten or not. The game ends when robotfindskitten. Alternatively, you may end the game by hitting the Esc key.\n" +msgstr "En este juego, usted es robot (#). Su trabajo es encontrar a Kitten. Esta tarea es complicada por la existencia de varias cosas que no son Kitten. Robot debe tocar las cosas para determinar si son Kitten o no. El juego finaliza cuando Robot encuentra a Kitten. Alternativamente usted puede terminar el juego presionando la tecla Esc.\n" + +#: Frfk.class:204 +msgid "robotfindskitten" +msgstr "robotfindskitten" + diff --git a/app/examples/Games/RobotFindsKitten/.lang/ru.po b/app/examples/Games/RobotFindsKitten/.lang/ru.po new file mode 100644 index 00000000..7a3bd023 --- /dev/null +++ b/app/examples/Games/RobotFindsKitten/.lang/ru.po @@ -0,0 +1,50 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-28 09:00+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Games/RobotFindsKitten/.project:19 +msgid "RobotFindsKitten" +msgstr "Робот ищет котёнка" + +#: app/examples/Games/RobotFindsKitten/.project:20 +msgid "Your job is to find kitten" +msgstr "Ваша задача найти котёнка" + +#: app/examples/Games/RobotFindsKitten/.src/Frfk.class:187 +msgid "You found kitten! Way to go, robot!" +msgstr "Вы нашли котёнка! Молодец, робот!" + +#: app/examples/Games/RobotFindsKitten/.src/Frfk.form:7 +msgid "robotfindskitten" +msgstr "Робот ищет котёнка" + +#: app/examples/Games/RobotFindsKitten/.src/Frfk.form:14 +msgid "Esc" +msgstr "Esc" + +#: app/examples/Games/RobotFindsKitten/.src/Frfk.form:30 +msgid "In this game, you are robot (#). Your job is to find kitten. This task is complicated by the existence of various things which are not kitten. Robot must touch items to determine if they are kitten or not. The game ends when robot finds kitten. Alternatively, you may end the game by hitting the Esc key.\n" +msgstr "В этой игре вы робот (#). Ваша задача найти котёнка. Эта задача усложняется наличием различных вещей, которые не являются котятами. Робот должен коснуться предметов, чтобы определить, котёнок они или нет. Игра заканчивается, когда робот находит котёнка. Кроме того, вы можете закончить игру, нажав клавишу Esc.\n" + diff --git a/app/examples/Games/RobotFindsKitten/.project b/app/examples/Games/RobotFindsKitten/.project new file mode 100644 index 00000000..0e3dd113 --- /dev/null +++ b/app/examples/Games/RobotFindsKitten/.project @@ -0,0 +1,18 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.0.0 +Title=RobotFindsKitten +Description="Your job is to find kitten" +Startup=Frfk +Icon=heart.png +Version=3.6.2 +VersionFile=1 +Component=gb.image +Component=gb.gui +TabSize=2 +Translate=1 +Language=fr +ExecPath=/home/benoit/gambas/gambas.link/share/gambas/examples/Games/RobotFindsKitten/RobotFindsKitten +Maintainer=benoit +Vendor=Princeton +Address=benoit@localhost +License=General Public Licence diff --git a/app/examples/Games/RobotFindsKitten/.src/Frfk.class b/app/examples/Games/RobotFindsKitten/.src/Frfk.class new file mode 100644 index 00000000..fb90f90e --- /dev/null +++ b/app/examples/Games/RobotFindsKitten/.src/Frfk.class @@ -0,0 +1,193 @@ +' Gambas class file + +Public NKIs As Object[] +Public Robot As Object +Public OrigHeight As Integer +Public OrigWidth As Integer +Public OrigFontSize As Integer +Public KittenIsFound As Boolean +Public NumNKIs As Integer +Public KittenIndex As Integer + +Public Sub Timer1_Timer() + + Dim middle As Float + Dim kitten As Object + + Try TextLabel1.setfocus() + If kittenisfound Then + kitten = nkis[kittenindex] + middle = CFloat(kitten.x + robot.x) / 2 + robot.x = robot.x + Round(CFloat(middle - 8 - robot.x) / 2) + kitten.x = kitten.x + Round(CFloat(middle + 8 - kitten.x) / 2) + End If +End + +Public Sub Form_KeyPress() + + Dim i As Integer + + If Key.Code = Key.Escape Then Esc_Click + If kittenisfound Then Return + + Select Case Key.Code + Case Key.Up + For i = 0 To nkis.count - 1 + If Abs(robot.y - (nkis[i].y + nkis[i].height)) < 4 And Abs(robot.x - nkis[i].x) < 4 Then + Textlabel1.text = nkis[i].tag + If nkis[i].tag = "kitten" Then FoundKitten(i) + Return + Endif + Next + If robot.y - robot.height >= Textlabel1.height Then + robot.y = robot.y - robot.height + Endif + Case Key.Down + For i = 0 To nkis.count - 1 + If Abs(robot.y + robot.height - nkis[i].y) < 4 And Abs(robot.x - nkis[i].x) < 4 Then + TextLabel1.text = nkis[i].tag + If nkis[i].tag = "kitten" Then FoundKitten(i) + Return + Endif + Next + If robot.y + robot.height + robot.height < Me.clientheight Then + robot.y = robot.y + robot.height + Endif + Case Key.Left + For i = 0 To nkis.count - 1 + If Abs(robot.x - (nkis[i].x + nkis[i].width)) < 4 And Abs(robot.y - nkis[i].y) < 4 Then + TextLabel1.text = nkis[i].tag + If nkis[i].tag = "kitten" Then FoundKitten(i) + Return + Endif + Next + If robot.x - robot.width >= 0 Then + robot.x = robot.x - robot.width + Endif + Case Key.Right + For i = 0 To nkis.count - 1 + If Abs(robot.x + robot.width - nkis[i].x) < 4 And Abs(robot.y - nkis[i].y) < 4 Then + TextLabel1.text = nkis[i].tag + If nkis[i].tag = "kitten" Then FoundKitten(i) + Return + Endif + Next + If robot.x + robot.width + robot.width < Me.clientwidth Then + robot.x = robot.x + robot.width + Endif + End Select + +End + +Public Sub Esc_Click() + + Me.close + +End + + +Public Sub Form_Open() + + Dim tmp As Label + Dim i As Integer + Dim nkistring As String + Dim nkitext As String[] + NKIs = New Object[] + nkitext = New String[] + Dim sLanguage As String + + Randomize + origheight = Me.height + origwidth = Me.width + origfontsize = 12 + sLanguage = Left$(System.Language, 2) + Try nkistring = File.load("nkis_" & sLanguage & ".txt") + If Error Then + Try nkistring = File.load("nkis.txt") + Endif + + nkitext = Split(nkistring, "\n") + KittenisFound = False + numnkis = 20 + + For i = 1 To NumNKIs + tmp = New Label(Me) + tmp.x = Int(Rnd(0, Me.width / 16)) * 16 + tmp.y = Int(Rnd(5, Me.height / 16)) * 16 + tmp.AutoResize = False + tmp.width = 16 + tmp.height = 16 + tmp.font.size = 12 + tmp.Foreground = Int(Rnd(32, 255)) * 65536 + Int(Rnd(32, 255)) * 256 + Int(Rnd(32, 255)) + tmp.alignment = Align.center + tmp.text = "#" + Do While tmp.text = "#" + tmp.text = Chr(Rnd(33, 126)) + Loop + tmp.tag = nkitext[Int(Rnd(0, nkitext.count))] + NKIs.add(tmp) + Next + nkis[nkis.count - 1].tag = "kitten" + robot = New Label(Me) + robot.x = 192 + robot.y = 192 + robot.AutoResize = False + robot.height = 16 + robot.width = 16 + robot.font.size = 12 + robot.Background = Color.white + robot.Foreground = Color.black + robot.alignment = Align.center + robot.text = "#" + + +End + +Public Sub Form_Resize() + + Dim scalex As Float + Dim scaley As Float + Dim i As Integer + + 'STOP + scalex = CFloat(Me.width) / origwidth + scaley = CFloat(Me.height) / origheight + If nkis.count < NumNKIs Then Return + For i = 0 To nkis.count - 1 + NKIs[i].x = NKIs[i].x * scalex + NKIs[i].y = NKIs[i].y * scaley + NKIs[i].width = Round(NKIs[i].width * scalex) + NKIs[i].height = Round(NKIs[i].height * scaley) + If nkis[i].y < TextLabel1.height Then nkis[i].y = Round(TextLabel1.height / nkis[i].height) * nkis[i].height + NKIs[i].font.size = Round(NKIs[i].font.size * scaley) + Next + robot.x = robot.x * scalex + robot.y = robot.y * scaley + robot.width = Round(robot.width * scalex) + robot.height = Round(robot.height * scaley) + robot.font.size = Round(robot.font.size * scaley) + origwidth = Me.width + origheight = Me.height + +End + +Sub FoundKitten(nki As Integer) + + Dim i As Integer + For i = 0 To nkis.count - 1 + If i <> nki Then + nkis[i].visible = False + nkis[i].x = Me.width + 100 + nkis[i].y = Me.height + 100 + Endif + Next + heart.visible = True + KittenIsFound = True + kittenindex = nki + TextLabel1.text = ("You found kitten! Way to go, robot!") + nkis[nki].y = heart.y + heart.height + robot.y = heart.y + heart.height + robot.x = heart.x - robot.width + nkis[nki].x = heart.x + heart.width + +End diff --git a/app/examples/Games/RobotFindsKitten/.src/Frfk.form b/app/examples/Games/RobotFindsKitten/.src/Frfk.form new file mode 100644 index 00000000..8246f54f --- /dev/null +++ b/app/examples/Games/RobotFindsKitten/.src/Frfk.form @@ -0,0 +1,32 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(25.1429,22.5714,110,79) + Background = &H000000& + Foreground = &HFFFFFF& + Text = ("robotfindskitten") + Resizable = False + { Esc Button + MoveScaled(102,1,7,5) + Visible = False + Background = &H000000& + Foreground = &HFFFFFF& + Text = ("Esc") + Border = False + Cancel = True + } + { Timer1 #Timer + Enabled = True + Delay = 200 + } + { Heart PictureBox + MoveScaled(40,20,29.1429,24) + Visible = False + Foreground = &HFFFFFF& + Picture = Picture["heart.png"] + } + { TextLabel1 TextLabel + MoveScaled(1,1,100,10) + Text = ("In this game, you are robot (#). Your job is to find kitten. This task is complicated by the existence of various things which are not kitten. Robot must touch items to determine if they are kitten or not. The game ends when robot finds kitten. Alternatively, you may end the game by hitting the Esc key.\n") + } +} diff --git a/app/examples/Games/RobotFindsKitten/COPYING b/app/examples/Games/RobotFindsKitten/COPYING new file mode 100644 index 00000000..d60c31a9 --- /dev/null +++ b/app/examples/Games/RobotFindsKitten/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) 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 +this service 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 make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. 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. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +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 +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the 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 a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE 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. + + 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 +convey 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision 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, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This 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 Library General +Public License instead of this License. diff --git a/app/examples/Games/RobotFindsKitten/heart.png b/app/examples/Games/RobotFindsKitten/heart.png new file mode 100644 index 0000000000000000000000000000000000000000..80a25fecc65eb6b55acfd0f06dbe059898e11113 GIT binary patch literal 9149 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 Hu0mjf?sI`2 literal 0 HcmV?d00001 diff --git a/app/examples/Games/RobotFindsKitten/nkis.txt b/app/examples/Games/RobotFindsKitten/nkis.txt new file mode 100644 index 00000000..743506b4 --- /dev/null +++ b/app/examples/Games/RobotFindsKitten/nkis.txt @@ -0,0 +1,622 @@ +"201 Kitten Verbs, Fully Conjugated". You look for "find". +"50 Years Among the Non-Kitten Items", by Ann Droyd. +99 bottles of beer are on a wall here. +A 100 meter long chain of jumbo paper clips. +A 256 kilobyte write-only memory chip. +A 3-inch floppy disk. +A 3-sided Monty Python record. +A 540Hz tuning fork. +A baboon with a bassoon hoots angrily at you. +A badly dented high-hat cymbal lies on its side here. +A bag of groceries taken off the shelf before the expiration date. +A ball of pocket fluff. +A ball of yarn. +A big bass drum bearing a hole and suspicious clawmarks. +A big chunk of frozen chocolate pudding. +A bitchin' homemade tesla coil. +A blank deposit slip. +A bobolink is twittering a happy tune here. +A book: Feng Shui, Zen: the art of randomly arranging items that are not kitten. +A book with "Don't Panic" in large friendly letters across the cover. +A bottle of distilled water. +A bottle of hair tonic. +A bottle of oil! Refreshing! +A bottle of smelling salts. +A bowling ball with the name "Bob" inscribed on it. +A bowl of cherries. +A box of brand-new nixie tubes. +A box of dancing mechanical pencils. They dance! They sing! +A box of fumigation pellets. +A brain cell. Oddly enough, it seems to be functioning. +A breadbox. Nope, Kitten isn't in the breadbox. +A briefcase filled with spy stuff. +A broken metronome sits here, it's needle off to one side. +A Buttertonsils bar. +A caboodle. +A canister of pressurized whipped cream, sans whipped cream. +A can of Spam Lite. +A card shark sits here, practicing his Faro shuffle. He ignores you. +A card sharp sits here, practicing his Faro shuffle. He ignores you. +A chain hanging from two posts reminds you of the Gateway Arch. +A cluster of cattails are growing here. +A coat hanger hovers in thin air. Odd. +A cockatoo shrieks at you. +A compendium of haiku about metals. +A copy of DeCSS. They're a dime a dozen these days. +A copy of the Weekly World News. Watch out for the chambered nautilus! +A coupon for one free steak-fish at your local family diner. +A crouton. +A crowd of people, and at the center, a popular misconception. +A crystal ball. It doesn't seem to know where Kitten is. +A cyclops glowers angrily at you. +A dangly thing mangled by Kitten. +A dark-emitting diode. +"Address Allocation for Private Internets" by Yakov Rekhter et al. +A demonic voice proclaims "There is no kitten, only Zuul". You flee. +A digital clock. It's stuck at 2:17 PM. +A discarded bagpipe chanter reed. +A discarded pop bottle. +A discarded refrigerator box. Nope, Kitten isn't in the box. +A discredited cosmology, relic of a bygone era. +A dodecahedron bars your way. +A dumpster full of hair. +A family of integrals are here integrating. +A flamboyant feather boa. Now you can dress up like Carol Channing! +A flyer advertising a sale at Spatula City. +A flyer reads, "Please donate hydraulic fluid" +A forgotten telephone switchboard. +A forgotten telephone switchboard operator. +A freshly-baked pumpkin pie. +A frosted pink party-cake, half eaten. +A "Get Out of Jail Free" card. +A geyser sprays water high into the air. +A glorious fan of peacock feathers. +A gravestone stands here. "Izchak Miller, ascended." +A green yo-yo. +A grin. +A haircut and a real job. Now you know where to get one! +A hairless rat. +A half-eaten cheese sandwich. +A hammock stretched between a tree and a volleyball pole. +A hedgehog. It looks like it knows something important. +A helicopter has crashed here. +A herd of wild coffee mugs slumber here. +A herd of wild coffee mugs slumbers here. +A historical marker showing the actual location of /dev/null. +A hollow voice says "Fool." +A hollow voice says "Plugh". +Ah, the skirl of the pipes and the rustle of the silicon... +Ah, the uniform of a Revolutionary-era minuteman. +Air. +Air Guitar!!! NA na NA na!! +A jar of dehydrated water. +A jar of library paste. +A jar of Vegemite is playing hopscotch here. +A ketchup bottle (nearly empty). +A kitten sink, for washing kitten (if only kitten liked water). +A kitten source (to match the kitten sink). +A knight who says "Either I am an insane knave, or you will find kitten." +A large blue eye floats in midair. +A large pile of rubber bands. +A large snake bars your way. +A largish bath towel. +A leather pouch filled with multisided dice. +Alien underwear. +A little glass tub of Carmex. ($.89) Too bad you have no lips. +A livery stable! Get your livery! +A lone, forgotten comma, sits here, sobbing. +A lotus. You make an interesting pair. +A magical... magic thing. +A marijuana brownie. +A mason jar lies here open. It's label reads: "do not open!". +A mathematician calculates the halting probability of a Turing machine. +A meerkat... not even close. +A Mentos wrapper. +A mere collection of pixels. +A milk carton, with a black and white picture of kitten on the side. +A mouse. +An 80286 machine. +An abandoned used-car lot. +An AK-47 rifle. +An AK-97 rifle. +An animate blob of acid. Being metallic, you keep well away. +An aromatherapy candle burns with healing light. +An atomic vector plotter. +An autographed copy of "Primary Colors", by Anonymous. +An automated robot-doubter. It doesn't believe in you. +An automated robot-hater. It frowns disapprovingly at you. +An automated robot-liker. It smiles at you. +An eminently forgettable zahir. +An empty Altoids tin. +An empty coaxial cable spool. +An empty Penguin Mints tin. +An empty shopping bag. Paper or plastic? +An Enfield Mk3 rifle. +A neural net -- maybe it's trying to recognize kitten. +An expired transistor. +An FN-FAL rifle. +An ice cube. +An incredibly expensive "Mad About You" collector plate. +An M16 rifle. +An M1911A1 pistol. +An M9 pistol. +An old bootable business card, unfortunately cracked down the middle. +An old pattern is here going on and on. +An old rusty revolver. +A non-descript box of crackers. +Another rabbit? That's three today! +An oven mitt with kittens on it. +An overflowing bit bucket. +An overturned bottle of ink and lots of kitten pawprints. +A number of short theatrical productions are indexed 1, 2, 3, ... n. +An unlicensed nuclear accelerator. +Any ordinary robot could see from a mile away that this wasn't kitten. +A packet of catnip. +A packet of pipe cleaners. +A pair of combat boots. +A pair of saloon-style doors swing slowly back and forth here. +A paper shopping bag. Nope, Kitten isn't in the bag. +A parrot, kipping on its back. +A patch from the Mammoth Caves. +A patch of grape jelly grows here. +A patch of mushrooms grows here. +A pile of coaxial plumbing lies here. +A pile of coconuts. +A pink plastic watering can. +A piping-hot pizza. Useless. +A pizza, melting in the sun. +A plastic model of Kitten. +A plush Chewbacca. +Apparently, it's Edmund Burke. +Approaching. One car. J. Followed by. Two car. M, M. In five. Minutes. +A puddle of chocolate sauce. +A puddle of mud, where the mudskippers play. +A punch bowl, filled with punch and lemon slices. +A radio hisses away. Kitten must have been here. +A rancid corn dog. +A Remington 870 shotgun. +A robot comedian. You feel amused. +A rusty melon-baller. +A rusty slinky. It was such a wonderful toy! +A sack of doorknobs. +A sack of hammers. +A sack of wet mice. +A salmon hatchery? Look again. It's merely a single salmon. +A Sanrio catalog. +A scrap of parchment bears the single word, "meow". +A scratching-post. +A screwdriver. +A section of glowing phosphor cells sings a song of radiation to you. +A set of keys to a 2001 Rolls Royce. Worthless. +A shameless plug for Crummy: http://www.crummy.com/ +A shameless plug for Frotz: http://www.cs.csubak.edu/@@126dgriffi/proj/frotz/ +A shameless plug for the UCLA Linux Users Group: http://linux.ucla.edu/ +Ash is mumbling "KLAATU BARATA NI" here. +A signpost saying "TO KITTEN". It points in no particular direction. +A sign reads "Don't step on the Mome Raths". +A sign reads: "Go home!" +A sign reads: "No robots allowed!" +A singing frog. Useless. +A slightly-used smellovision set. +A smoking branding iron shaped like a 24-pin connector. +A spindle, and a grindle, and a bucka-wacka-woom! +A stack of 7 inch floppies wobbles precariously. +A statue of a girl holding a goose like the one in Gottingen, Germany. +A steam-powered bunnytron. +A stegosaurus, escaped from the stegosaurusfindsrobot game. It finds you. +A sub-atomic particle languishes here all alone. +A Swiss-Army knife. All of its appendages are out. (toothpick lost) +A team of arctic explorers is camped here. +A technical university in Australia. +A tetradrachm dated "42 B.C." +A Texas Instruments of Destruction calculator. +A tiny ceramic Kitten. It's probably not the Kitten you're looking for. +A toenail? What good is a toenail? +A toilet bowl occupies this space. +A ton of feathers. +A traffic signal. It appears to have been recently vandalized. +A train of thought chugs through here. +A trash compactor, compacting away. +A travel-sized cyclotron. +A tree with some jelly nailed to it. +A tribe of cannibals lives here. They eat Malt-O-Meal for breakfast, you know. +A troll. Ewww!!! +A tube of toothpaste. Too bad you have no teeth. +A tube of white lithium grease. Perfect for your robotic joints. +A tuft of kitten fur, but no kitten. +A vase full of artificial flowers is stuck to the floor here. +A vase of roses. +A voice booms out "Onward, kitten soldiers..." +A willing, ripe tomato bemoans your inability to digest fruit. +A wireframe model of a hot dog rotates in space here. +A wondrous and intricate golden amulet. Too bad you have no neck. +A zorkmid coin. +Baling wire and chewing gum. +Bibbidy bibbidy bibbidy bibbidy bibbidy bibbidy... +Big Bird is here looking for Mr. Looper. +Billions and billions of things that aren't Kitten. +Biscuits. +"Blup, blup, blup", says the mud pot. +Bright copper kettles. +BURRRRP!!!! Flavorful and full of protein! +Butane!!! +Carbonated Water, High Fructose Corn Syrup, Color, Phosphoric Acid, Flavors, Caffeine. +Carlos Tarango stands here, doing his best impression of Pat Smear. +Catsup and Mustard all over the place! It's the Human Hamburger! +Chewing gum and baling wire. +Clang, clang, clang goes the tranny! +Clifford Stoll is here selling Klein bottles. +Conan O'Brian, sans jawbone. +Could it be... a big ugly bowling trophy? +Daily hunger conditioner from Australasia +Dancing cold water pipes. Mikey must have been here. +Darth Vader is here looking for his Teddywookie. +"Dear robot, you may have already won our 10 MILLION DOLLAR prize..." +Definitely not Kitten. +Dinsdale! +Diogenes is here demanding whisky. +Dirty socks. +"Dogbert's tech support, how may I abuse you?" +Doodles Weaver is here looking over a horse race schedule. +Ed McMahon stands here, lost in thought. Seeing you, he bellows, "YES SIR!" +Ed Witten sits here, pondering string theory. +Empty jewelboxes litter the landscape. +Faboo! +Fonzie sits here, mumbling incoherently about a shark and a pair of waterskis. +For a moment, you feel something in your hands, but it disappears! +Free Dmitry Sklyarov! +Free Jon Johansen! +Gibble, Gobble, we ACCEPT YOU ... +"Go back to Libraria!", says Pat Schroeder. +Grind 'em up, spit 'em out, they're twigs. +Heart of Darkness brand pistachio nuts. +Heeeeeeeeeeeeres Johnny! +Hello, nurse! +Hello, sailor! +Here is a book about Robert Kennedy. +Here is no kitten but only rock, rock and no kitten and the sandy road. +Here's Cal Worthington and his dog "Spot"! +Here's Pete Peterson. His batteries seem to have long gone dead. +Hey, I bet you thought this was kitten. +Hey, look, it's war. What is it good for? Absolutely nothing. Say it again. +Hey, robot, leave those lists alone. +"Hi, I'm Anson Williams, TV's 'Potsy'." +Ho hum. Another synthetic a posteriori. +"How in heck can I wash my neck if it ain't gonna rain no more?" asks Farmer Al. +Hydraulic fluid and jagged metal bits. You recoil from the scene of carnage. +I don't know what that is, but it's not kitten. +If it's not one thing, it's another. +If it's one thing, it's not another. +"I pity the fool who mistakes me for kitten!", sez Mr. T. +Is that an elephant's head or a winged sandal? +It is a cloud shaped like an ox. +It is a marzipan dreadnought that appears to have melted and stuck. +It is an ancient mariner, and he stoppeth one of three. +It is a set of wind-up chatter teeth. +It is -- I just feel something wonderful is about to happen. +It pleases you to be kind to what appears to be kitten -- but it's not! +It's 1000 secrets the government doesn't want you to know! +It's a banana! Oh, joy! +It's a big block of ice. Something seems to be frozen inside it. +It's a big smoking fish. +It's a black hole. Don't fall in! +It's a blatant plug for Ogg Vorbis, http://www.vorbis.com/ +It's a blind man. When you touch, he exclaims "It's a kitten prospecting robot!" +It's a blob of white goo. +It's a bottle of nail polish remover. +It's a bug. +It's a burrito stand flyer. "Taqueria El Ranchito". +It's a business plan for a new startup, kitten.net. +It's a cardboard box full of 8-tracks. +It's a Cat 5 cable. +It's a catalog from some company called Infocom. +It's a charcoal briquette, smoking away. +It's a clue! +It's a cookie shaped like a kitten. +It's a copy of Knuth with the chapter on kitten-search algorithms torn out. +It's a copy of the robotfindskitten EULA. +It's a copy of "The Rubaiyat of Spike Schudy". +It's a copy of "Zen and The Art of Robot Maintenance". +It's a dark, amphorous blob of matter. +It's a DVD of "Crouching Monkey, Hidden Kitten", region encoded for the moon. +It's a Dvorak keyboard. +It's a fly on the wall. Hi, fly! +It's a free beer cozy (with your paid subscription.) +It's a free Dmitry Sklyarov! +It's a free Jon Johansen! +It's a funky beat! +It's a giant slorr! +It's a gun of some sort. +It's a hologram of a crashed helicopter. +It's a "HOME ALONE 2: Lost in New York" novelty cup. +It's a hundred-dollar bill. +It's a Java applet. +It's a limbo bar! How low can you go? +It's a Linux install CD. +IT'S ALIVE! AH HA HA HA HA! +It's all a dream. +It's a lost wallet. It's owner didn't have pets, so you discard it. +It's a mighty zombie talking about some love and prosperity. +It's a moment of silence. +It's a mousetrap, baited with soap. +It's an altar to the horse god. +It's an autographed copy of "Secondary Colors," by Bob Ross. +It's an autographed copy of "Secondary Colors", by Bob Ross. +It's an automated robot-disdainer. It pretends you're not there. +It's Andrew Plotkin plotting something. +It's a NetBSD install CD. +It's an Internet chain letter about sodium laureth sulfate. +It's an inverted billiard ball! +It's an old Duke Ellington record. +It's an ordinary bust of Beethoven... but why is it painted green? +It's another robot, more advanced in design than you but strangely immobile. +It's a perpetual immobility machine. +It's a piece of cloth used to cover a stage in between performances. +It's a pool with a straw in it. +It's a portable hole. A sign reads: "Closed for the winter". +It's a Quaker Oatmeal tube, converted into a drum. +It's a recursive recursive recursive recursive recursive... +It's a revised business plan for a new startup, my.kitten.net. +It's a rim shot. Ba-da-boom! +It's a roll of industrial-strength copper wire. +It's a rotten old shoe. +It's a segmentation fault. Core dumped, by the way. +It's a Shamrock Shake(tm). At least I hope it is. +It's Asimov's Laws of Robotics. You feel a strange affinity for them. +It's a solitary vaccuum tube. +It's a solitary vacuum tube. +It's a squad of Keystone Kops. +It's a square. +It's a stupid mask, fashioned after a beagle. +It's a symbol. You see in it a model for all symbols everywhere. +It's a synthetic a priori truth! Immanuel would be so pleased! +It's a tape of '70s rock. All original hits! All original artists! +It's a tribute to fishnet stockings. +It's a U.S. president. +It's a wonderful life. +It's a zen simulation, trapped within an ASCII character. +It's Babe Flathead's favorite bat. +It's Bach's Mass in B-minor! +It's Brian Kernigan. +It's "Chicken Soup for the Kitten-seeking Soulless Robot." +It's creepy and it's kooky, mysterious and spooky. It's also somewhat ooky. +It's cute like a kitten, but isn't a kitten. +It's Death. +It's Dennis Ritchie. +It seems to be a copy of "A Tail of Two Kitties". +It's either a mirror, or another soulless kitten-seeking robot. +It's Emporer Shaddam the 4th's planet! +It's "Finding kitten", published by O'Reilly and Associates. +It's Grundle, the Green Dragon. +It's just an object. +It's Kieran Hervold. Damn dyslexia! +It's KITT, the talking car. +It's Lucy Ricardo. "Aaaah, Ricky!", she says. +It's Mary Poppins! +It's nothing but a corrupted floppy. Coaster anyone? +It's nothing but a G-thang, baby. +It's nothing in particular. +It's Princess Leia, the yodel of life. +It's Professor Feedlebom. +It's Rhindle, the Red Dragon. +It's Richard Nixon's nose! +It's Roya Naini. +It's scenery for "Waiting for Godot". +It's Sirhan-Sirhan, looking guilty. +It's some compromising photos of Babar the Elephant. +It's the amazing self-referential thing that's not kitten. +It's the ASCII Floating Head of Seth David Schoen! +It's the astounding meta-object. +It's the author of "Randomness and Mathematical Proof". +It's the Bass-Matic '76! Mmm, that's good bass! +It's the constellation Pisces. +It's the cork to someone's lunch. +It's the crusty exoskeleton of an arthropod! +It's the Donation of Constantine! +It's the embalmed corpse of Vladimir Lenin. +It's the Golden Banana of Discord! +It's the handheld robotfindskitten game, by Tiger. +It's the horizon. Now THAT'S weird. +It's the instruction manual for a previous version of this game. +It's the local draft board. +It's the missing chapter to "A Clockwork Orange". +It's the phrase "and her", written in ancient Greek. +It's the proverbial wet blanket. +It's the Tiki Room. +It's the triangle leg adjacent to an angle divided by the leg opposite it. +It's the Will Rogers Highway. Who was Will Rogers, anyway? +It's this message, nothing more. +It's TV's lovable wisecracking Crow! "Bite me!", he says. +It's Uncle Doctor Hurkamur! +It's "War and Peace" (unabridged, very small print). +It's Yorgle, the Yellow Dragon. +It's your favorite game -- robotfindscatan! +Judith Platt insults librarians. +Just a big brick wall. +Just a box of backscratchers. +Just a broken hard drive containg the archives of Nerth Pork. +Just a cage of white mice. +Just a man selling an albatross. +Just a moldy loaf of bread. +Just a monitor with the blue element burnt out. +Just an autographed copy of the Kama Sutra. +Just a pincushion. +Just some glop of some sort. +Just some old play by a Czech playwright, and you can't read Czech. +Just some stuff. +Just some swamp gas. +Just the empty husk of a locust. +Just Walter Mattheau and Jack Lemmon. +"Kibo was here" +"Kilroy was here" +Kitten is the letter 'Q'. Oh, wait, maybe not. +"Lend us a fiver 'til Thursday", pleas Andy Capp. +Leonard Richardson is here, asking people to lick him. +Long lost needle nose pliers. +Look at that, it's the Crudmobile. +Look, it's Fanny the Irishman! +Look out! Exclamation points! +Lysine, an essential amino acid. Well, maybe not for robots. +"Mail Routing and the Domain System" by Craig Partridge. +Marvin is complaining about the pain in the diodes down his left side. +"Meow meow meow meow..." How discouraging! It's only a recording. +More grist for the mill. +"Move along! Nothing to see here!" +Mr. Hooper is here, surfing. +Mr. Kamikaze and Mr. DNA are here drinking tea. +Ne'er but a potted plant. +Nipples, dimples, knuckles, NICKLES, wrinkles, pimples!! +No kitten here. +"No!" says the bit. +Not kitten, just a packet of Kool-Aid(tm). +Oh boy! Grub! Er, grubs. +ONE HUNDRED THOUSAND CARPET FIBERS!!!!! +One of the few remaining discoes. +One of those stupid "Homes of the Stars" maps. +One person shouts "What do we want?" The crowd answers "Free Dmitry!" +"On this spot in 1962, Henry Winkler was sick." +Ooh, shiny! +Paul Moyer's necktie. +Plenty of nothing. +"Plexar was here" +Preoccupation with finding kitten prevents you from investigating further. +Pumpkin pie spice. +Quidquid Latine dictum sit, kitten non est. +Rene Descarte is whistling a happy tune here. +"Robot may not injure kitten, or, through inaction, ..." +Robot should not be touching that. +Roger Avery, persona un famoso de los Estados Unidos. +Run away! Run away! +Seargent Duffy is here. +Seven 1/4" screws and a piece of plastic. +Several meters of cat5 cable. +Sigmund Freud is here asking about your mother. +Slack! +Snarf? +Some coconut crabs are milling about here. +Someone has written "ad aerarium" on the ground here. +Someone is talking to Ralph on the big white phone here. +Someone's identity disk lies here. +Some sort of electronic handheld game from the 1970s. +Something is written here in the dust. You read: "rJbotfndQkttten". +So, THAT's what an invisible barrier looks like! +Spoon!!! +Stimutacs. +"Sure hope we get some rain soon," says Farmer Joe. +Sutro Tower is visible at some distance through the fog. +Talcum powder. +Tea and/or crumpets. +Ten yards of avocado-green shag carpet. +Thar's Mobius Dick, the convoluted whale. Arrr! +That's just a charred human corpse. +That's just an old tin can. +The boom box cranks out an old Ethel Merman tune. +The Digital Millennium Copyright Act of 1998. +The dirty old tramp bemoans the loss of his harmonica. +The ghost of your dance instructor, his face a paper-white mask of evil. +The Inform Designer's Manual (4th edition) +The intermission from a 1930s silent movie. +The ionosphere seems charged with meaning. +The letters O and R. +The Monolith of Spam towers above you. +The non-kitten item bites! +The non-kitten item like this but with "false" and "true" switched is true. +The non-kitten item like this but with "true" and "false" switched is false. +The object pushes back at you. +There is an opulent throne here. +"There is no kitten!" cackles the old crone. You are shocked by her blasphemy. +There is no tea here. +There's nothing here; it's just an optical illusion. +The rothe hits! The rothe hits! +The score for a Czech composer's "Kitten-Finding Symphony in C". +These aren't ordinary beans. They're magic beans! +The spectre of Sherlock Holmes wills you onwards. +The swampy ground around you seems to stink with disease. +"The Theory and Practice of Oligarchical Collectivism" by Emmanuel Goldstein. +The United States Court of Appeals for the Federal Circuit. +The World's Biggest Motzah Ball! +The world's largest ball of pocket lint. +...thingy??? +This appears to be a rather large stack of trashy romance novels. +This appears to be a statue of Perseus. +This balogna has a first name, it's R-A-N-C-I-D. +This copy of "Steal This Book" has been stolen from a bookstore. +This corroded robot is clutching a mitten. +This grain elevator towers high above you. +This invisible box contains a pantomime horse. +This is a Lagrange point. Don't come too close now. +This is a large brown bear. Oddly enough, it's currently peeing in the woods. +This is an anagram. +This is another fine mess you've gotten us into, Stanley. +This is a porcelain kitten-counter. 0, 0, 0, 0, 0... +This is a remote control. Being a robot, you keep a wide berth. +This is a tasty-looking banana creme pie. +This is a television. On screen you see a robot strangely similar to yourself. +This isn't the item you're looking for. +This is the chapter called "A Map of the Cat?" from Feynman's autobiography. +This is the forest primeval. +This is the tenth key you've found so far. +This is the world-famous Chain of Jockstraps. +This jar of pickles expired in 1957. +This jukebox has nothing but Cliff Richards albums in it. +This kind of looks like kitten, but it's not. +This kit is the fourteenth in a series of kits named with Roman letters. +This looks like Bradley's "Appearance and Reality", but it's really not. +This map is not the territory. +This might be the fountain of youth, but you'll never know. +This non-kitten item no verb. +This nonkitten may contain peanuts. +This object here appears to be Louis Farrakhan's bow tie. +This object is like an analogy. +This particular monstrosity appears to be ENIAC. +This peg-leg is stuck in a knothole! +This place is called Antarctica. There is no kitten here. +This seems to be junk mail addressed to the finder of the Eye of Larn. +This smiling family is happy because they eat LARD. +This subwoofer was blown out in 1974. +This toaster strudel is riddled with bullet holes! +This tomography is like, hella axial, man! +This TRS-80 III is eerily silent. +This was no boating accident! +Three half-pennies and a wooden nickel. +Thunder, Thunder, Thunder, Thunder Cats!!! +Tigerbot Hesh. +"Topsoil's all gone, ma," weeps Lil' Greg. +TV says donuts are high in fat. +'Twas brillig in the slivey-toves... +Two crepes, two crepes in a box. +Vladimir Lenin's casket rests here. +Wait! This isn't the poker chip! You've been tricked! DAMN YOU, MENDEZ! +Werner's "Pocket Field Guide to Things That Are Not Kitten". +We wish you a merry kitten, and a happy New Year! +What in blazes is this? +What's that blue thing doing here? +Why are you touching this when you should be finding kitten? +YEEEEEEEEEEEHAAAAAAAA!!!!! +"Yes!" says the bit. +You can see right through this copy of Brin's "Transparent Society". +You disturb a murder of crows. +You feel strangely unfulfilled. +You find a bright shiny penny. +You find a fraud scheme in which loans are used as security for other loans. +You found Chinchilla! Too bad this isn't "Robot Finds Chinchilla". +You found kitten! No, just kidding. +You found netkit! Way to go, robot! +You found nettik, but that's backwards. +You found Parakeet. Too bad this isn't "Robot Finds Parakeet". +You found Puppy! Too bad this isn't "Robot Finds Puppy". +You found the marble in the oatmeal! +You have found some zinc, but you must not stop here, for you must find kitten. +You have new mail in /var/spool/robot +You hit the non-kitten item. The non-kitten item fails to yowl. +You really don't want to know what this is. +Your pal Floyd is here and wants to play Hucka-Bucka-Beanstalk. +Your State Farm Insurance(tm) representative! +You see a snowflake here, melting slowly. +You stumble upon Bill Gates' stand-up act. +You suddenly yearn for your distant homeland. +You've found Harvey, the Wonder Hamster! +You've found... Oh wait, that's just a cat. +You've found the fabled America Online disk graveyard! +You've found the fish! Not that it does you much good in this game. +You've found the snows of yesteryear! So that's where they all went to. diff --git a/app/examples/Games/RobotFindsKitten/nkis_ru.txt b/app/examples/Games/RobotFindsKitten/nkis_ru.txt new file mode 100644 index 00000000..6fe5f4db --- /dev/null +++ b/app/examples/Games/RobotFindsKitten/nkis_ru.txt @@ -0,0 +1,622 @@ +«201 глагол для котёнка, полностью спрягаемые». Вы ищете глагол «найти». +«50 лет среди предметов, не относящихся к котятам», Энн Дройд. +Здесь на стене 99 бутылок пива. +100-метровая цепь гигантских скрепок. +256-килобайтный чип памяти только для записи. +3-дюймовая дискета. +3-сторонняя запись Монти Пайтона. +Камертон 540 Гц. +Бабуин с фаготом сердито кричит на вас. +Здесь на боку лежит сильно помятая высокая цимбала. +Мешок с продуктами снят с полки до истечения срока годности. +Шарик из карманного пуха. +Клубок пряжи. +Большой бас-барабан с дыркой и подозрительными следами от когтей. +Большой кусок замороженного шоколадного пудинга. +Самодельная катушка Тесла. +Пустой депозитный чек. +Боболинк здесь щебечет счастливую мелодию. +Книга: Фен-шуй, Дзен: искусство случайного расположения предметов, которые не являются котятами. +Книга с надписью «Не паникуй» большими дружескими буквами на обложке. +Бутылка дистиллированной воды. +Бутылка с тоником для волос. +Бутылка масла! Освежающая! +Бутылка вонючих солей. +Шар для боулинга с надписью «Боб». +Ваза с вишнями. +Коробка с новыми трубками Никси. +Коробка с танцующими механическими карандашами. Они танцуют! Они поют! +Коробка фумигационных гранул. +Мозговая клетка. Как ни странно, она, кажется, функционирует. +Хлебница. Нет, котёнка нет в хлебнице. +Портфель со шпионскими штучками. +Сломанный метроном сидит здесь, он накренился в сторону. +Бар Маслянка. +Капуста. +Канистра взбитых сливок под давлением, без взбитых сливок. +Консервы тушёнки. +Здесь сидит карточная акула, тренирующая свои плавники. Она игнорирует вас. +Здесь сидит колдун, практикуя свою фаро-перетасовку. Он игнорирует вас. +Цепочка, висящая на двух столбах, напоминает вам арку ворот. +Заросли камышей растут здесь. +Вешалка парит в воздухе. Странно. +Какаду вопит на вас. +Сборник хайку о металлах. +Копия Мурзилки. В эти дни она стоит десять рублей. +Копия еженедельных мировых новостей. Остерегайтесь камерного наутилуса! +Купон на одну бесплатную стейк-рыбу в местном ресторане. +Сухарик. +Толпа людей, а в центре популист. +Хрустальный шар. Кажется, он не знает, где котёнок. +Циклоп сердито смотрит на вас. +Качающаяся вещь, изуродованная котёнком. +Тёмно-излучающий диод. +«Распределение адресов для домашнего Интернета» Якова Рехтера и соавторов. +Демонический голос провозглашает: «Нет котёнка, только Зуул». Вы бежите. +Цифровые часы. Они встали в 14:17. +Выброшенная волынка из певчего тростника. +Выброшенная разбитая бутылка. +Выброшенный холодильник. Нет, котёнка нет в нём. +Дискредитированная космология, пережиток ушедшей эпохи. +Додекаэдр преграждает вам путь. +Корзина, полная волос. +Семейство интегралов здесь интегрируется. +Яркая боа из перьев. Теперь вы можете одеваться как Филипп Киркоров! +Листовка, рекламирующая продажу в городе Париже. +Листовка гласит: «Пожалуйста, пожертвуйте гидравлическую жидкость» +Забытый телефонный коммутатор. +Забытый оператор телефонного коммутатора. +Свежеиспечённый тыквенный пирог. +Замороженое розовое праздничное пирожное, наполовину съеденное. +Карта «Выйти из тюрьмы свободным». +Гейзер распыляет воду высоко в воздух. +Славный поклонник перьев павлина. +Здесь стоит надгробие. «Вечная память». +Зелёный йо-йо. +Смайлик. +Машинка для стрижки волос. Теперь вы знаете, где её взять! +Безволосая крыса. +Недоеденный бутерброд с сыром. +Гамак растянулся между деревом и волейбольным шестом. +Ёжик. Похоже, он знает что-то важное. +Здесь разбился вертолёт. +Здесь дремлет стадо диких кофейных кружек. +Здесь притаилась дюжина одичавших кофейных кружек. +Исторический маркер, показывающий фактическое местоположение /dev/null. +Гулкий голос говорит: «Дурак». +Гулкий голос говорит «Паши». +Ах, юбка с волынками и шелест кремния... +Ах, мундир эпохи Революции. +Воздух. +Воображаемая гитара!!! Нету-нету-нетушки!!! +Баночка с дистиллированной водой. +Баночка с библиотечной пастой. +Баночка Вегемита играет здесь классики. +Бутылка кетчупа (почти пустая). +Раковина котёнка, для мытья котёнка (если только котёнку понравилась вода). +Туалет котёнка (рядом с раковиной котёнка). +Рыцарь, который говорит: «Или я безумный мошенник, или вы найдёте котёнка». +Большой голубой глаз плавает в воздухе. +Большая куча резинок. +Большая змея преграждает вам дорогу. +Огромное банное полотенце. +Кожаный чехол, наполненный многогранными кубиками. +Чужое нижнее бельё. +Маленькая стеклянная ванночка от бальзама для губ. Жаль, что у вас нет губ. +Костюм члена гильдии! Получи свой! +Одинокая, забытая запятая сидит здесь, рыдая. +Лотос. Вы образуете интересную пару. +Волшебная... преволшебная вещь. +Марихуана домового. +Здесь находится открытое варенье. На этикетке написано: «Не открывай!». +Математик вычисляет вероятность остановки машины Тьюринга. +Сурикат... даже не близко. +Обёртка от Ментос. +Простая коллекция пикселей. +Коробка с молоком, с чёрно-белым изображением котёнка сбоку. +Мышь. +Процессор 80286. +Заброшенная стоянка подержанных машин. +Винтовка АК-47. +Винтовка АК-97. +Живой шарик кислоты. Будучи металлическим, вы держитесь от него подальше. +Ароматерапевтическая свеча горит целительным светом. +Атомно-векторный плоттер. +Копия с автографом «Основные цвета», анонимный автор. +Автоматизированный робот-сомневающийся. Он не верит в вас. +Автоматизированный робот-ненавистник. Он неодобрительно смотрит на вас. +Автоматизированный робот-улыбашка. Он улыбается вам. +В высшей степени забытый Гоголь. +Пустая оловянная банка. +Пустая катушка коаксиального кабеля. +Пустая жестянка от мятной вкусняшки. +Пустая корзина. Бумага или пластик? +Винтовка Маузера. +Нейронная сеть - возможно, она пытается распознать котёнка. +Транзистор с истёкшим сроком годности. +Винтовка Генри. +Ледяной айсберг. +Невероятно дорогая коллекционная тарелка «Схожу по вам с ума». +Винтовка Шарпса. +Пистолет Макарова. +Пистолет Колибри. +Старая загрузочная дискета, к сожалению, сломанная посередине. +Старый шаблон здесь продолжается и продолжается. +Старый ржавый револьвер. +Неописанное поле крекеров. +Ещё один кролик? Сегодня три! +Рукавица с вышитыми на ней котятами. +Переполненное ведро с битами. +Опрокинутая бутылка чернил и множество следов котёнка. +Ряд коротких театральных постановок индексируются 1, 2, 3, ... n. +Нелицензированный ядерный ускоритель. +Любой обычный робот может видеть за милю, что это не котёнок. +Пакет из кошачьей мяты. +Очистители для труб. +Пара боевых ботинок. +Пара дверей в салонном стиле медленно качаются взад и вперёд. +Бумажная хозяйственная сумка. Нет, котёнка нет в сумке. +Попугай, бьющий по спине. +Реликвия из пещер мамонта. +Виноградное желе варится здесь. +Здесь поляна грибов. +Здесь лежит куча коаксиальных кабелей. +Куча кокосовых орехов. +Розовая пластиковая лейка. +Горячая пицца. Бесполезная. +Пицца, тающая на солнце. +Пластиковая модель котёнка. +Плюшевый чебурашка. +Видимо, это Эдмунд Берк. +Врезаюсь. Одна машина. Далее две машины. Пять. Протокол. +Лужа с шоколадным соусом. +Лужа грязи, где играют прыгуны. +Чаша для чая, наполненная чаем и дольками лимона. +Радио хрипит. Котёнок, должно быть, был здесь. +Протухший собачий корм. +Ружьё Оленебой. +Робот-комик. Вы чувствуете себя удивленными. +Переспелая дыня. +Ржавая слинки. Это была такая замечательная игрушка! +Мешок с дверными ручками. +Мешок с молотками. +Мешок мокрых мышей. +Инкубаторий с лососем? Посмотрите снова. Это просто один лосось. +Каталог компании Санрио. +Кусок пергамента с единственным словом «мяу». +Приспособление для царапания. +Отвёртка. +Секция светящихся люминофорных клеток поёт вам песню радиации. +Набор ключей для Запорожца. Безделушка. +Бесстыдный форк для Crummy: http://www.crummy.com/ +Бесстыдный форк для Frotz: http://www.cs.csubak.edu/@@126dgriffi/proj/frotz/ +Бесстыдный плагин для UCLA Linux Users Group: http://linux.ucla.edu/ +Ash здесь бормочет «KLAATU BARATA NI <кашель>». +Указатель «Котёнок». Это не указывает ни на какое конкретное направление. +Вывеска гласит: «Не наступайте на маму-крыску». +Надпись гласит: «Идите домой!» +Надпись гласит: «Роботы не допускаются!» +Поющая лягушка. Бесполезная. +Слегка использованный набор для фильма с запахом. +Дымящийся утюг в форме 24-контактного разъёма. +Шпиндель и точильный станок! +Пачка 7-дюймовых дискет шатко шатается. +Статуя девушки с гусем, как в Геттингене, Германия. +Паровой двигатель. +Стегозавр, сбежавший из игры «стегозавр ищет робота». Он нашёл вас. +Субатомная частица томится здесь одна. +Швейцарский армейский нож. Все его придатки отсутствуют. (зубочистка потеряна) +Команда арктических исследователей находится здесь. +Технический университет в Австралии. +Тетрадрахма, датированная «42 г. до н.э.» +Калькулятор. +Крошечный керамический котёнок. Вероятно, это не тот котёнок, которого вы ищете. +А ногти на ногах? Что хорошего в ногтях на ногах? +Унитаз занимает это место. +Тонна перьев. +Светофор. Похоже, что недавно был разбит вандалами. +Здесь проходит поток мыслей. +Уплотнитель мусора, уплотняющий. +Циклотрон путешествующего размера. +Дерево с желе, намазанном по нему. +Здесь живёт племя людоедов. Вы знаете, они едят кашу на завтрак. +Тролль!!! +Тюбик зубной пасты. Жаль, что у вас нет зубов. +Тюбик белой литиевой смазки. Идеально подходит для ваших роботизированных суставов. +Клок шерсти котёнка, но без котёнка. +Ваза, полная искусственных цветов, поставлена на пол. +Ваза с розами. +Раздаётся голос «Вперёд, кошачьи солдаты...» +Готовый спелый помидор оплакивает вашу неспособность переваривать фрукты. +Каркасная модель хот-дога вращается здесь в космосе. +Удивительный и замысловатый золотой амулет. Жаль, что у вас нет шеи. +Монета Зоркмида. +Уплотнительная проволока и жвачка. +Бибиди Бибиди Бибиди Бибиди Бибиди Бибиди... +Большая птица здесь ищет мистера Лупера. +Миллиарды и миллиарды вещей, которые не являются котятами. +Печенье. +«Блеф, блеф, блеф», говорит грязевой котелок. +Яркие медные чайники. +Бургер!!!! Вкусный и полный белка! +Бутан!!! +Газированная вода, кукурузный сироп с высоким содержанием фруктозы, краситель, фосфорная кислота, ароматизаторы, кофеин. +Карлос Таранго стоит здесь, производя лучшее впечатление на Пэт Смир. +Кетчуп и горчица повсюду! Это человеческий гамбургер! +Жевательная резинка и проволока. +Клэнг, клэнг, клэнг идёт поездом! +Клиффорд Столл здесь продаёт бутылки Кляйн. +Конан О'Брайан, без челюсти. +Это может быть... большой уродливый трофей для боулинга? +Ежедневный подвешивающийся кондиционер из Австралии +Танцуют трубы холодной воды. Майк, должно быть, был здесь. +Дарт Вейдер здесь ищет своего тедди-вуки. +«Дорогой робот, вы, возможно, уже выиграли приз в 10 МИЛЛИОНОВ ДОЛЛАРОВ...» +Определённо не котенок. +Динсдейл! +Диоген здесь требует виски. +Грязные носки. +«Техническая поддержка Догберта, как я могу оскорбить тебя?» +Дудлс Уивер просматривает расписание скачек. +Эд МакМэхон стоит здесь, задумавшись. Увидев вас, он ревёт: «Да, сэр!» +Эд Виттен сидит здесь, размышляя над теорией струн. +Пустые шкатулки засоряют пейзаж. +Невероятно! +Фонзи сидит здесь, бессвязно бормоча о акуле и паре водных лыж. +На мгновение вы чувствуете что-то в своих руках, но это исчезает! +Свободный Дмитрий Скляров! +Свободный Джон Йохансен! +Гибл, Гоббл, мы принимаем тебя... +«Возвращайтесь в библиотеку!» - говорит Пэт Шредер. +Измельчить их, выплюнуть, они ветки. +Фисташковые орехи. +Здеееееееесь Джонни! +Здравствуйте, медсестра! +Привет, моряк! +Вот книга о Роберте Кеннеди. +Здесь нет котёнка, а есть только камень, булыжник и песчаная дорога. +Здесь Кэл Уортингтон и его собака «Спот»! +Здесь Пит Питерсон. Его батареи, кажется, давно разряжены. +Эй, держу пари, вы думали, что это котёнок. +Эй, смотрите, это война. Для чего это? Совершенно не для чего. Скажите это снова. +Эй, робот, оставьте эти списки в покое. +«Привет, меня зовут Энсон Уильямс, телевизионная «Потси»». +Гул. Ещё один синтетический апостериорный. +«Как, чёрт возьми, я могу вымыть свою шею, если больше не будет дождя?», - спрашивает фермер Аль. +Гидравлическая жидкость и зубчатые металлические биты. Вы отпрыгиваете от сцены резни. +Я не знаю, что это, но это не котёнок. +Если это не одно, то это другое. +Если это одно, то это не другое. +«Мне жаль дурака, который принимает меня за котёнка!». +Это голова слона или крылатая сандалия? +Это облако в форме вола. +Это марципановый дредноут, который, похоже, расплавлен и застрял. +Это древний моряк, и он останавливает одного из трёх. +Это вставные зубы. +Это - я просто чувствую, - что должно произойти что-то чудесное. +Приятно быть добрым к котёнку, но это не так! +Это 1000 секретов, которые правительство не хочет, чтобы вы знали! +Это банан! О, радость! +Это большой кусок льда. Кажется, что-то застыло внутри. +Это большая курящая рыба. +Это чёрная дыра. Не падай! +Это явный штекер для Ogg Vorbis, http://www.vorbis.com/ +Это слепой человек. Когда вы касаетесь, он восклицает: «Я робот для поиска котят!» +Это капля белого липкого вещества. +Это бутылка для снятия лака. +Это баг. +Это стенд для буррито. +Это бизнес-план для нового стартапа, котёнок.нет. +Это картонная коробка, полная 8-миллиметровой ленты. +Это кабель Кошак-5. +Это каталог какой-то компании Инфоком. +Это угольный брикет, дымящий по ветру. +Это ключ! +Это печенье в форме котёнка. +Это копия Кнута с вырванной главой об алгоритмах поиска котят. +Это копия лицензионного соглашения с роботом. +Это копия «Рубайят Шипа Шуди». +Это копия «Дзен и искусство обслуживания роботов». +Это тёмная амфорическая капля материи. +Это DVD «Крадущаяся обезьяна, скрытый котенок», регион, закодированный для Луны. +Это клавиатура Дворака. +Это муха на стене. Привет, лети! +Это бесплатное пиво (с вашей платной подпиской.) +Это свободный Дмитрий Скляров! +Это свободный Джон Йохансен! +Это фанк-бит! +Это гигантский слорр! +Это какой-то пистолет. +Это голограмма разбитого вертолета. +Это кружка с новеллой «ОДИН ДОМА 2: Затерянный в Нью-Йорке». +Это сто долларов. +Это Java-апплет. +Это подвешенный бар! Как низко ты можешь пасть? +Это установочный компакт-диск Linux. +ОНО ЖИВОЕ! АХ ХА ХА ХА ХА! +Это всё мечта. +Это потерянный кошелёк. У его владельца не было домашних животных, так что вы отказываетесь от него. +Это могучий зомби, говорящий о любви и процветании. +Это минута молчания. +Это мышеловка, приманка с мылом. +Это алтарь бога лошади. +Это копия с автографом «Вторичные цвета» Боба Росса. +Это копия с автографом «Боярыня Морозова» Сурикова. +Это автоматический робот-презиратор. Он делает вид, что вас там нет. +Это Андрей Плоткин что-то замышляет. +Это установочный компакт-диск NetBSD. +Это интернет-письмо о лауретсульфате натрия. +Это перевёрнутый бильярдный шар! +Это старый альбом Дюк Эллингтона. +Это обычный бюст Бетховена... но почему он окрашен в зелёный цвет? +Это ещё один робот, более продвинутый по дизайну, чем вы, но странно неподвижный. +Это вечная машина неподвижности. +Это кусок ткани, используемый для закрытия сцены между выступлениями. +Это бассейн с соломой. +Это портативное отверстие. Вывеска гласит: «Закрыто на зиму». +Это коробка от овсяных хлопьев, превращённая в барабан. +Это рекурсивная рекурсивная рекурсивная рекурсивная рекурсия... +Это пересмотренный бизнес-план для нового стартапа - моего.котёнка.нет. +Это выстрел обода. Ба-да-бум! +Это рулон медной проволоки промышленной прочности. +Это гнилая старая обувь. +Это ошибка сегментации. Ядро сброшено, кстати. +Это сезонный молочный коктейль со вкусом зелёной мяты. По крайней мере, я на это надеюсь. +Это законы робототехники Азимова. Вы чувствуете странную близость к ним. +Это одиночная вакуумная трубка. +Это синхрофазотрон. +Это команда Кейстоун Копс. +Это квадрат. +Это глупая маска, созданная по образцу бигля. +Это символ. Вы видите в нём модель для всех символов повсюду. +Это синтетическая априорная истина! Иммануил был бы так рад! +Это лента рока 70-х. Все оригинальные хиты! Все оригинальные художники! +Это дань чулкам в сеточку. +Это президент США. +Это прекрасная жизнь. +Это симуляция дзен, заключённая в символ ASCII. +Это любимая летучая мышь детки Флэтхеда. +Это «Реквием» Баха си-минор! +Это Брайан Керниган. +Это «Куриный суп для котёнка, ищущего бездушного робота». +Это жутко и странно, таинственно и жутко. Это также несколько странно. +Это милое создание как котёнок, но не котёнок. +Это погибель. +Это Деннис Ритчи. +Кажется, это копия «Хвоста двух котят». +Это либо зеркало, либо другой бездушный робот, ищущий котёнка. +Это Эмпорер Шаддам четвёртая планета! +Это «В поисках котёнка», изданная «О'Рейли и Партнеры». +Это зелёный дракон Grundle. +Это просто объект. +Это Киран Хервольд. Чёртова дислексия! +Это КОТ, говорящая машина. +Это Люси Рикардо. «Ааааа, Рикки!», - говорит она. +Это Мэри Поппинс! +Это не что иное, как испорченная дискета. У кого-нибудь есть подставка? +Это всего лишь рэпчик, детка. +Ничего особенного. +Это принцесса Лея, йодел жизни. +Это профессор Фидлбом. +Это красный дракон Rhindle. +Это нос Ричарда Никсона! +Это Роя Найни. +Это декорация для «В ожидании Годо». +Это Сирхан-Сирхан, выглядит виноватым. +Это несколько компрометирующих фотографий слона Бабара. +Это удивительная вещь, которая не является котёнком. +Это таблица ASCII! +Это поразительный мета-объект. +Это автор «Случайности и математические доказательства». +Это Бас-Матик 76 года! Ммм, это хороший бас! +Это созвездие Рыб. +Это пробка для чьей-то бутылки. +Это хрустящий экзоскелет членистоногого! +Это пожертвование Константина! +Это забальзамированный труп Владимира Ленина. +Это золотой банан раздора! +Это портативная игра для роботов и тигров от Tiger. +Это горизонт. Теперь это странно. +Это инструкция к предыдущей версии этой игры. +Это местная доска объявлений. +Это недостающая глава к «Заводному апельсину». +Это фраза «и она», написанная на древнегреческом языке. +Это общеизвестное мокрое одеяло. +Это комната Тики. +Это треугольная нога, примыкающая к углу, разделенному на ногу напротив нее. +Это шоссе Уилла Роджерса. Кто такой Уилл Роджерс? +Это сообщение, не более того. +Это привлекательная ворона! «Угостите сыром!» - говорит она. +Это дядя доктор Хуркамур! +Это «Война и мир» (без ограничений, очень мелкий шрифт). +Это жёлтый дракон Yorgle. +Это твоя любимая игра - робот ищет кошака! +Джудит Платт оскорбляет библиотекарей. +Просто большая кирпичная стена. +Просто ящик с царапинами. +Просто сломанный жёсткий диск. +Просто клетка белых мышей. +Просто человек, продающий альбатроса. +Просто заплесневелый кусок хлеба. +Просто монитор с сгоревшим синим элементом. +Просто копия Йоги с автографом. +Просто подушечка для булавок. +Просто какая-то жижа. +Просто какая-то старая пьеса чешского драматурга, и вы не умеете читать по-чешски. +Просто кое-что. +Просто немного болотного газа. +Просто пустая шелуха саранчи. +Просто Уолтер Матто и Джек Леммон. +«Кибо был здесь» +«Килрой был здесь» +Котёнок это буква «К». Ой, подожди, может быть нет. +«Одолжите нам пятёрку до четверга», - радует Энди Кэпп. +Леонард Ричардсон здесь, просит людей поцеловать его. +Длинные утерянные плоскогубцы. +Посмотрите на это, это Моторолла. +Смотри, это чудной ирландец! +Быдьте осторожны! Восклицательные знаки! +Лизин, незаменимая аминокислота. Ну, может быть, не для роботов. +«Маршрутизация почты и доменная система» Крейга Партриджа. +Марвин жалуется на боль в диодах внизу слева. +«Мяу мяу мяу мяу...» Как обескураживает! Это только запись. +Больше зерна для мельницы. +«Двигайтесь! Здесь нечего смотреть!» +Мистер Хупер здесь, занимается серфингом. +Мистер Камикадзе и мистер ДНК здесь пьют чай. +Не то, но растение в горшке. +Соски, ямочки, костяшки, щипцы, морщины, прыщи! +Здесь нет котёнка. +«Нет!» говорит немного. +Не котёнок, просто пакет Юпи. +О, парень! Grub! Эээ, загрузчики. +СТО ТЫСЯЧ КОВРОВЫХ ВОЛОКОН!!!!! +Одна из немногих оставшихся дискотек. +Одна из тех глупых карт «Дома звёзд». +Один человек кричит «Что мы хотим?» Толпа отвечает «Свободу Дмитрию!» +«На этом месте в 1962 году Генри Винклер заболел». +О, блестяще! +Галстук Саакашвили. +Много пустоты. +«Плексар был здесь» +Озабоченность поиском котёнка мешает вам продолжить расследование. +Тыквенный пирог со специями. +Что угодно, сказанное на латыни, звучит как котёнок. +Рене Декарт насвистывает счастливую мелодию здесь. +«Робот не может причинить вред котёнку или вследствие бездействия...» +Робот не должен прикасаться к этому. +Роджер Эвери, человек, известный в Соединённых Штатах. +Убегайте! Убегайте! +Сирджент Даффи здесь. +Семь 1/4 винтов и кусок пластика. +Несколько метров кабеля кот5. +Зигмунд Фрейд здесь спрашивает о вашей матери. +Отнимите! +Снарф? +Некоторые кокосовые крабы валяются здесь. +Кто-то написал здесь «ad aerarium». +Здесь кто-то разговаривает с Ральфом по большому белому телефону. +Чей-то личный диск лежит здесь. +Какая-то электронная портативная игра 1970-х годов. +Здесь что-то написано в пыли. Вы читаете: «Робат ищит катёнка». +Так вот как выглядит невидимый барьер! +Ложка!!! +Стимутакс. +«Надеюсь, скоро будет дождь», - говорит фермер Джо. +Башня Сутро видна на некотором расстоянии сквозь туман. +Тальк. +Чай и/или сухарики. +Десять ярдов авокадо-зелёного ковра. +Тар Мобиус Дик, извилистый кит. Аррр! +Это просто мумия. +Это просто старая консервная банка. +Бумбокс заводит старую мелодию Этель Мерман. +Закон о защите авторских прав в цифровую эпоху 1998 года. +Грязный старый бродяга оплакивает потерю его гармоники. +Призрак вашего преподавателя танцев, его лицо - бумажно-белая маска зла. +Руководство дизайнера Информ (4-е издание) +Перерыв в немом фильме 1930-х годов. +Ионосфера кажется заряженной смыслом. +Буквы О и Р. +Монолит спама возвышается над вами. +Укус не котёнка! +Элемент без котёнка, подобный этому, но с «ложь» и «истина», переключенным в значение истины. +Элемент без котенка, подобный этому, но с «истина» и «ложь», переключенным в значение лжи. +Объект отталкивает вас. +Здесь есть роскошный трон. +«Там нет котёнка!» хихикает старая карга. Вы в шоке от её кощунства. +Здесь нет чая. +Здесь ничего нет; это просто оптический обман. +Хиты Роты! Хиты Роты! +Партитура для чешской композиции «Симфония ищущего котёнка до мажор». +Это не обычные бобы. Это волшебные бобы! +Призрак Шерлока Холмса побеждает вас впереди. +Болотистая земля вокруг вас, кажется, воняет болезнью. +«Теория и практика олигархического коллективизма» Эммануила Гольдштейна. +Апелляционный суд США по федеральному округу. +Самый большой в мире бал! +Самый большой в мире шар из карманных ворсинок. +...штучка??? +Похоже, это довольно большой сборник романов. +Это похоже на статую Персея. +У этой кассеты есть имя, это R-A-N-C-I-D. +Этот экземпляр «Украсть эту книгу» был украден из книжного магазина. +Этот ржавый робот сжимает варежку. +Этот элеватор возвышается над вами. +Эта невидимая шкатулка содержит лошадь пантомимы. +Это точка Лагранжа. Не подходи слишком близко. +Это большой бурый медведь. Как ни странно, в настоящее время он мочится в лесу. +Это анаграмма. +Это ещё один хороший беспорядок, в который ты нас втянул, Стэнли. +Это фарфоровый котёнок-счётчик. 0, 0, 0, 0, 0... +Это пульт дистанционного управления. Будучи роботом, вы имеете широкую койку. +Это вкусный пирог с банановым кремом. +Это телевизор. На экране вы видите робота, странно похожего на вас. +Это не тот предмет, который вы ищете. +Эта глава называется «Карта кота?» из автобиографии Фейнмана. +Это первобытный лес. +Это десятый ключ, который вы нашли. +Это всемирно известная сеть Jockstraps. +Срок хранения этой банки с маринадом истёк в 1957 году. +Этот музыкальный автомат содержит только альбомы Клиффа Ричардса. +Этот вид похож на котёнка, но это не так. +Этот набор является четырнадцатым в серии наборов, названных римскими буквами. +Это похоже на «Внешний вид и реальность» Брэдли, но на самом деле это не так. +Эта карта не является территорией. +Это может быть источником молодости, но вы никогда не узнаете. +Это кошатник, предмет без глагола. +Этот кошатник может содержать арахис. +Этот объект здесь кажется бабочкой Луи Фаррахана. +Этот объект похож на аналогию. +Это конкретное чудовище, похоже ЭНИАК. +Этот колышек застрял в норе! +Это место называется Антарктида. Здесь нет котёнка. +Похоже, это нежелательная почта, адресованная искателю Ока Ларна. +Эта улыбающаяся семья счастлива, потому что они едят сало. +Этот сабвуфер был взорван в 1974 году. +Этот тостер штрудель пронизан пулевыми отверстиями! +Это томография! +Этот TRS-80 III жутко тихий. +Это не было несчастным случаем на лодке! +Три полпенни и деревянный никель. +Гром, Гром, Гром, Гром Кошек!!! +Тигрэбот Хеш. +«Всё прошло верхний слой почвы, ма», плачет Лил Грег. +Телевизор говорит, что пончики с высоким содержанием жира. +«Алиса в Стране чудес» Кэрролла +Два блинчика, два блинчика в коробке. +Шкатулка Владимира Ленина отдыхает здесь. +Подождите! Это не покерная фишка! Вы были обмануты! +«Карманный полевой путеводитель по вещам, которые не котята» Вернера. +Желаем вам прощённого котёнка и счастливого Нового года! +Что это полыхает? +Что эта синяя штука делает здесь? +Почему вы касаетесь этого, когда вам нужно найти котёнка? +Ох!!!!! +«Да!» говорит немного. +Вы можете видеть прямо сквозь эту копию «Прозрачного общества» Брина. +Вы мешаете убийству ворон. +Вы чувствуете себя странно неудовлетворённым. +Вы нашли яркую блестящую копейку. +Вы нашли схему мошенничества, в которой кредиты используются в качестве обеспечения для других кредитов. +Вы нашли шиншиллу! Жаль, что это не «Робот ищет шиншиллу». +Вы нашли котёнка! Нет, просто прикалываюсь. +Вы нашли неткот! В путь, робот! +Вы нашли конёток, но это задом наперед. +Вы нашли попугая. Жаль, что это не «Робот ищет попугая». +Вы нашли щенка! Жаль, что это не «Робот ищет щенка». +Вы нашли мрамор в овсянке! +Вы нашли немного цинка, но вы не должны останавливаться на достигнутом, потому что вы должны найти котёнка. +У вас есть новая почта в /var/spool/робот +Вы попали в предмет не из котят. Не котёнок не может выкрикнуть. +Вы действительно не хотите знать, что это такое. +Ваш приятель Флойд здесь и хочет сыграть Хака-Бука-Бобовое дерево. +Ваш страховщик! +Вы видите снежинку, которая медленно тает. +Вы наткнулись на постоянный акт Билла Гейтса. +Вы вдруг жаждете своей далёкой родины. +Вы нашли Харви, чудо-хомяка! +Вы нашли... Ой, подождите, это просто кот. +Вы нашли легендарное дисковое кладбище! +Вы нашли рыбу! Не то, чтобы это принесло вам много пользы в этой игре. +Вы нашли снег прошлых лет! Так вот, куда они все пошли. \ No newline at end of file diff --git a/app/examples/Games/RobotFindsKitten/readme.txt b/app/examples/Games/RobotFindsKitten/readme.txt new file mode 100644 index 00000000..67d00522 --- /dev/null +++ b/app/examples/Games/RobotFindsKitten/readme.txt @@ -0,0 +1,24 @@ +gambrfk 1.00 +Copyright 2003 Rob Kudla + +In this game, you are robot (#). Your job is to find kitten. This task +is complicated by the existence of various things which are not +kitten. Robot must touch items to determine if they are kitten or +not. The game ends when robotfindskitten. Alternatively, you may end +the game by hitting the Esc key. + +Please see http://www.robotfindskitten.org for more information. + +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 2 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, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA diff --git a/app/examples/Games/Snake/.directory b/app/examples/Games/Snake/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/app/examples/Games/Snake/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/app/examples/Games/Snake/.icon.png b/app/examples/Games/Snake/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..401780e5af5caa4c9594f42894a573f8567d3c74 GIT binary patch literal 3584 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\n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: FrmMain.form:90 +msgid "&About" +msgstr "Qu&ant a..." + +#: FrmMain.form:72 +msgid "&Auto Advance Speed (Challenge ME)" +msgstr "&Increment automàtic de velocitat (Desafia'm)" + +#: FrmMain.form:64 +msgid "&Cool" +msgstr "&Moderat" + +#: FrmMain.class:318 +msgid "Do not Hit the walls, or bite yourself!\n\n" +msgstr "No colpegis les parets, ni et mosseguis a tu mateix!\n\n" + +#: FrmMain.class:317 +msgid "Eat as many apples as you can\n" +msgstr "Mengeu tantes pomes com podeu\n" + +#: FrmMain.form:34 +msgid "&Game" +msgstr "&Joc" + +#: FrmMain.form:60 +msgid "&GrandMa" +msgstr "À&via" + +#: FrmMain.form:78 +msgid "&Help" +msgstr "A&juda" + +#: FrmMain.form:81 +msgid "&How To Play" +msgstr "Com &jugar-hi" + +#: FrmMain.form:37 +msgid "&New" +msgstr "&Nou" + +#: FrmMain.class:245 +msgid "\nPress Game -> New to play again." +msgstr "\nPrem Joc -> Nou per tornar a jugar." + +#: FrmMain.form:42 +msgid "&Pause" +msgstr "&Pausa" + +#: FrmMain.form:51 +msgid "&Quit" +msgstr "&Surt" + +#: FrmMain.class:358 +msgid "Score: " +msgstr "Puntuació:" + +#: FrmMain.class:58 +msgid "Snake" +msgstr "Serp" + +#: .project:1 +msgid "Snake game" +msgstr "Joc de la serp" + +#: FrmMain.form:57 +msgid "&Speed" +msgstr "&Velocitat" + +#: FrmMain.class:359 +msgid "Speed: " +msgstr "Velocitat:" + +#: FrmMain.form:68 +msgid "&Speed Freak" +msgstr "&Velocitat fora de control" + +#: FrmMain.class:316 +msgid "The Rules are simple:\n" +msgstr "Les normes son senzilles:\n" + +#: FrmMain.class:245 +msgid "The snake's soul will always be remembered.\nGame Over!!\nYou scored: " +msgstr "Sempre recordarem l'ànima de la serp.\nJoc acabat!!\nLa teva puntuació: " + +#: FrmMain.class:319 +msgid "Use the arrow keys to move the snake" +msgstr "Utilitzeu les tecles de fletxa per moure la serp" + diff --git a/app/examples/Games/Snake/.lang/cs.po b/app/examples/Games/Snake/.lang/cs.po new file mode 100644 index 00000000..5da464fa --- /dev/null +++ b/app/examples/Games/Snake/.lang/cs.po @@ -0,0 +1,114 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Snake game" +msgstr "Hadí hra" + +#: FrmMain.class:58 +msgid "Snake" +msgstr "Had" + +#: FrmMain.class:245 +msgid "" +"\n" +"Press Game -> New to play again." +msgstr "" +"\n" +"Pro novou hru -> Zmáčkni Hra." + +#: FrmMain.class:245 +msgid "" +"The snake's soul will always be remembered.\n" +"Game Over!!\n" +"You scored: " +msgstr "" +"DuÅ¡e hada bude uložena.\n" +"Konec hry!!\n" +"Tvoje skore:" + +#: FrmMain.class:316 +msgid "The Rules are simple:\n" +msgstr "Pravidla jsou jednoduchá:\n" + +#: FrmMain.class:317 +msgid "Eat as many apples as you can\n" +msgstr "MužeÅ¡ jíst mnoho jablek\n" + +#: FrmMain.class:318 +msgid "" +"Do not Hit the walls, or bite yourself!\n" +"\n" +msgstr "" +"Nenařážejte do zdí, nebo se nekousejte!\n" +"\n" + +#: FrmMain.class:319 +msgid "Use the arrow keys to move the snake" +msgstr "Použij klávesy Å¡ipek pro pohyb hada" + +#: FrmMain.class:358 +msgid "Score: " +msgstr "Skóre:" + +#: FrmMain.class:359 +msgid "Speed: " +msgstr "Rychlost:" + +#: FrmMain.form:34 +msgid "&Game" +msgstr "&Hra" + +#: FrmMain.form:37 +msgid "&New" +msgstr "&Nová" + +#: FrmMain.form:42 +msgid "&Pause" +msgstr "&Pauza" + +#: FrmMain.form:51 +msgid "&Quit" +msgstr "&Ukončit" + +#: FrmMain.form:57 +msgid "&Speed" +msgstr "&Rychlost" + +#: FrmMain.form:60 +msgid "&GrandMa" +msgstr "&Babička" + +#: FrmMain.form:64 +msgid "&Cool" +msgstr "&Užasný" + +#: FrmMain.form:68 +msgid "&Speed Freak" +msgstr "&Šílená rychlost" + +#: FrmMain.form:72 +msgid "&Auto Advance Speed (Challenge ME)" +msgstr "&Auto zvyÅ¡ování rychlosti (moje výzva)" + +#: FrmMain.form:78 +msgid "&Help" +msgstr "&Nápověda" + +#: FrmMain.form:81 +msgid "&How To Play" +msgstr "&Jak hrát" + +#: FrmMain.form:90 +msgid "&About" +msgstr "&O aplikaci" diff --git a/app/examples/Games/Snake/.lang/de.po b/app/examples/Games/Snake/.lang/de.po new file mode 100644 index 00000000..f48ae5dc --- /dev/null +++ b/app/examples/Games/Snake/.lang/de.po @@ -0,0 +1,101 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Snake game" +msgstr "Schlangenspiel" + +#: FrmMain.class:58 +msgid "Snake" +msgstr "Schlange" + +#: FrmMain.class:245 +msgid "\nPress Game -> New to play again." +msgstr "\nWähle Spiel -> Neu, um nochmal zu spielen." + +#: FrmMain.class:245 +msgid "The snake's soul will always be remembered.\nGame Over!!\nYou scored: " +msgstr "Die Seele der Schlange bleibt unvergessen.\nSpiel ist aus!!\nDeine Punkte: " + +#: FrmMain.class:316 +msgid "The Rules are simple:\n" +msgstr "Die Regeln sind einfach:\n" + +#: FrmMain.class:317 +msgid "Eat as many apples as you can\n" +msgstr "Iss so viele Äpfel, wie du kannst\n" + +#: FrmMain.class:318 +msgid "Do not Hit the walls, or bite yourself!\n\n" +msgstr "Do not Hit the walls, or bite yourself!\n\n" + +#: FrmMain.class:319 +msgid "Use the arrow keys to move the snake" +msgstr "Die Schlange wird mit den Pfeiltasten bewegt." + +#: FrmMain.class:358 +msgid "Score: " +msgstr "Punkte:" + +#: FrmMain.class:359 +msgid "Speed: " +msgstr "Geschwindigkeit:" + +#: FrmMain.form:34 +msgid "&Game" +msgstr "&Spiel" + +#: FrmMain.form:37 +msgid "&New" +msgstr "&Neues Spiel" + +#: FrmMain.form:42 +msgid "&Pause" +msgstr "-" + +#: FrmMain.form:51 +msgid "&Quit" +msgstr "&Beenden" + +#: FrmMain.form:57 +msgid "&Speed" +msgstr "&Geschwindigkeit" + +#: FrmMain.form:60 +msgid "&GrandMa" +msgstr "&Großmutter" + +#: FrmMain.form:64 +msgid "&Cool" +msgstr "&Mäßig" + +#: FrmMain.form:68 +msgid "&Speed Freak" +msgstr "-" + +#: FrmMain.form:72 +msgid "&Auto Advance Speed (Challenge ME)" +msgstr "&Automatischer Geschwindigkeitsfortschritt" + +#: FrmMain.form:78 +msgid "&Help" +msgstr "&Hilfe" + +#: FrmMain.form:81 +msgid "&How To Play" +msgstr "&Spielanleitung" + +#: FrmMain.form:90 +msgid "&About" +msgstr "&Über" + diff --git a/app/examples/Games/Snake/.lang/ru.po b/app/examples/Games/Snake/.lang/ru.po new file mode 100644 index 00000000..f90d7505 --- /dev/null +++ b/app/examples/Games/Snake/.lang/ru.po @@ -0,0 +1,162 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Games/Snake/.project:19 +msgid "Snake game" +msgstr "Игра змея" + +#: app/examples/Games/Snake/.src/FrmMain.class:46 app/examples/Games/Snake/.src/FrmMain.class:58 +msgid "Snake" +msgstr "Змея" + +#: app/examples/Games/Snake/.src/FrmMain.class:46 +msgid "v1.0" +msgstr "- версия 1.0" + +#: app/examples/Games/Snake/.src/FrmMain.class:61 +msgid "ver 1.0 by: Ahmad Kamal" +msgstr "версия 1.0 от: Ахмад Камаль" + +#: app/examples/Games/Snake/.src/FrmMain.class:245 +msgid "" +"The snake's soul will always be remembered.\n" +"Game Over!!\n" +"You scored: " +msgstr "" +"Душа змеи навсегда останется в памяти.\n" +"Игра окончена!!\n" +"Вы набрали: " + +#: app/examples/Games/Snake/.src/FrmMain.class:245 +msgid "" +"\n" +"Press Game -> New to play again." +msgstr "" +"\n" +"Нажмите Игра -> Новый, чтобы играть снова." + +#: app/examples/Games/Snake/.src/FrmMain.class:268 app/examples/Games/Snake/.src/FrmMain.class:275 app/examples/Games/Snake/.src/FrmMain.form:18 +msgid "&Pause" +msgstr "Пауза" + +#: app/examples/Games/Snake/.src/FrmMain.class:271 app/examples/Games/Snake/.src/FrmMain.class:272 +msgid "Un&Pause" +msgstr "Возобновить" + +#: app/examples/Games/Snake/.src/FrmMain.class:290 app/examples/Games/Snake/.src/FrmMain.class:366 +msgid "GrandMa" +msgstr "Неспеша" + +#: app/examples/Games/Snake/.src/FrmMain.class:299 app/examples/Games/Snake/.src/FrmMain.class:367 +msgid "Cool" +msgstr "Спокойный" + +#: app/examples/Games/Snake/.src/FrmMain.class:308 +msgid "Speed Freak" +msgstr "Быстрый" + +#: app/examples/Games/Snake/.src/FrmMain.class:316 +msgid "The Rules are simple:\n" +msgstr "Правила просты:\n" + +#: app/examples/Games/Snake/.src/FrmMain.class:317 +msgid "Eat as many apples as you can\n" +msgstr "Ешьте как можно больше яблок\n" + +#: app/examples/Games/Snake/.src/FrmMain.class:318 +msgid "" +"Do not Hit the walls, or bite yourself!\n" +"\n" +msgstr "" +"Не попадайте по стенам и не кусайте себя!\n" +"\n" + +#: app/examples/Games/Snake/.src/FrmMain.class:319 +msgid "Use the arrow keys to move the snake" +msgstr "Использовать клавиши со стрелками для перемещения змеи" + +#: app/examples/Games/Snake/.src/FrmMain.class:358 +msgid "Score: " +msgstr "Счёт: " + +#: app/examples/Games/Snake/.src/FrmMain.class:359 +msgid "Speed: " +msgstr "Скорость: " + +#: app/examples/Games/Snake/.src/FrmMain.class:405 +msgid "" +"Snake v1.0\n" +"By: Ahmad Kamal \n" +"Written for Gambas http://gambas.sf.net" +msgstr "" +"Змея версии 1.0\n" +"От: Ахмад Камаль \n" +"Написано для Gambas http://gambas.sf.net" + +#: app/examples/Games/Snake/.src/FrmMain.form:12 +msgid "&Game" +msgstr "Игра" + +#: app/examples/Games/Snake/.src/FrmMain.form:14 +msgid "&New" +msgstr "Новый" + +#: app/examples/Games/Snake/.src/FrmMain.form:25 +msgid "&Quit" +msgstr "Выход" + +#: app/examples/Games/Snake/.src/FrmMain.form:30 +msgid "&Speed" +msgstr "Скорость" + +#: app/examples/Games/Snake/.src/FrmMain.form:32 +msgid "&GrandMa" +msgstr "Неспеша" + +#: app/examples/Games/Snake/.src/FrmMain.form:35 +msgid "&Cool" +msgstr "Спокойный" + +#: app/examples/Games/Snake/.src/FrmMain.form:38 +msgid "&Speed Freak" +msgstr "Быстрый" + +#: app/examples/Games/Snake/.src/FrmMain.form:41 +msgid "&Auto Advance Speed (Challenge ME)" +msgstr "Автоматическая скорость (Сразись со мной)" + +#: app/examples/Games/Snake/.src/FrmMain.form:46 +msgid "&Help" +msgstr "Справка" + +#: app/examples/Games/Snake/.src/FrmMain.form:48 +msgid "&How To Play" +msgstr "Как играть" + +#: app/examples/Games/Snake/.src/FrmMain.form:55 +msgid "&About" +msgstr "О программе" + diff --git a/app/examples/Games/Snake/.project b/app/examples/Games/Snake/.project new file mode 100644 index 00000000..915eafcc --- /dev/null +++ b/app/examples/Games/Snake/.project @@ -0,0 +1,18 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.6.90 +Title=Snake game +Startup=FrmMain +Icon=head.png +Version=1.0.0 +Component=gb.image +Component=gb.gui +Component=gb.sdl.sound +Environment="GB_GUI=gb.qt" +TabSize=2 +Translate=1 +Language=en +Maintainer=benoit +Vendor=Princeton +Address=benoit@localhost +License=General Public Licence +Packager=1 diff --git a/app/examples/Games/Snake/.src/FrmMain.class b/app/examples/Games/Snake/.src/FrmMain.class new file mode 100644 index 00000000..5a53af7d --- /dev/null +++ b/app/examples/Games/Snake/.src/FrmMain.class @@ -0,0 +1,430 @@ +' Gambas class file + +'***********Snake Example Game********************************* +'***********By: Ahmad Kamal ****************** +'***********Written for Gambas: gambas.sourceforge.net********* +'***********V1.0: 02-Aug-2003********************************** +'***********V1.1: 16-Apr-2004********************************** +'***********Added SDL sound support**************************** + +Public Head_Direction As String + +Public Xpos As New Integer[] 'Snake's Xpositions, Xpos[0] = head +Public Ypos As New Integer[] 'Snake's Ypositions, Ypos[0] = head +Public Tailpos As New Integer[] 'Array holding the index of the square to be moved. Xpos[ TailPos[0] ] is Xposition of the tail. TailPos keeps rotating +Public AppleXpos As New Integer[] 'Apples Xpos +Public AppleYpos As New Integer[] 'Apples Ypos + +Public Score As Integer +Public Speed As String + +Public hPictHead As Picture +Public hPictBody As Picture +Public hPictApple As Picture + +Public StartSound As Sound +Public EatSound As Sound +Public DeadSound As Sound + +Private $eLast As Float + +Public Sub Form_Open() + + Dim i As Integer + + Randomize + + StartSound = New Sound("start.wav") 'Pre-load all sounds FOR speed issues + EatSound = New Sound("eat.wav") 'Although, one SDL component could handle + DeadSound = New Sound("dead.wav") 'All of them! + + MenuGrandMa_Click() + InitSnake + UpdateScoreBoard + Play("start.wav") + + Me.Text = ("Snake") & " " & ("v1.0") + hPictHead = Picture.Load("head.png") + ' ME.Icon = hPictHead 'The same as head icon but in a standard size + + Dwg.background = Color.Black 'BM: ?????????? Doesn't work + + Draw.Begin(dwg) + Draw.Foreground = &HAA0000& 'Faded red + Draw.Font.Name = "Serif" + Draw.Font.Size = 120 'Give me real big font + For i = 1 To 10 'Trick to draw 3D text + If i = 10 Then Draw.Foreground = &HFF0000& 'This is the last layer, so make it pure red + Draw.text(("Snake"), (dwg.clientW - Draw.TextWidth("Snake")) / 2 - i, (dwg.Height + Draw.TextHeight("Snake")) / 2 - i - 50) + Next + Draw.Font.Size = 18 + Draw.Text(("ver 1.0 by: Ahmad Kamal"), (dwg.clientW - Draw.TextWidth(("ver 1.0 by: Ahmad Kamal"))) / 2, 100) + Draw.End + + hPictHead = Picture.Load("head.png") 'Load images + 'hPictHead.Mask(Color.white) + hPictBody = Picture.Load("body.png") + hPictApple = Picture.Load("apple.png") + + TimerApple_Timer() 'Init apples location array + +End + + +Public Sub Form_KeyPress() +'This function stores the snake direction taken from the keyboard in head_direction + + Dim tmp As Integer + + Select Key.Code + Case Key.Left + If (Head_Direction <> "right") Then Head_Direction = "left" 'Snake isn't supposed to go backwards! + Case Key.Right + If (Head_Direction <> "left") Then Head_Direction = "right" + Case Key.Up + If (Head_Direction <> "down") Then Head_Direction = "up" + Case Key.Down + If (Head_Direction <> "up") Then Head_Direction = "down" + End Select + +End + +Public Sub TmrEngine_Timer() +'This is the main game engine. With every tick, the game status get updated. + + Dim i As Integer + Dim hPictHeadRotated As New Picture + + 'Here we will move the snake. Instead of moving each & every square of the snake + 'We will use an optimized method. Only the head moves one step forward & the + 'Tail moves to where the head previously was. That way, all the snake seems to be moving! + +' If $eLast Then Debug TmrEngine.Delay;; Format(Timer - $eLast, "0.###") + $eLast = Timer + + Xpos[TailPos[0]] = Xpos[0] 'Tail goes to head + Ypos[TailPos[0]] = Ypos[0] + TailPos.add(TailPos.pop(), 0) 'Array is rotated => Last element is put as first element, i.e. new tail is calculated + + Select Head_Direction 'See the current head direction and start moving + Case "left" + Xpos[0] = Xpos[0] - 20 + hPictHeadRotated = hPictHead.Image.Rotate(Pi).Picture 'Snake looks to where it's going :) + Case "right" + Xpos[0] = Xpos[0] + 20 + hPictHeadRotated = hPictHead + Case "up" + Ypos[0] = Ypos[0] - 20 + hPictHeadRotated = hPictHead.Image.Rotate(Pi / 2).Picture + Case "down" + Ypos[0] = Ypos[0] + 20 + hPictHeadRotated = hPictHead.Image.Rotate(-Pi / 2).Picture + End Select + + + 'Begin drawing + Dwg.Clear 'Clear old game drawings + Draw.Begin(Dwg) + + For i = 1 To Xpos.count - 1 'Draw snake + Draw.Picture(hPictBody, Xpos[i], Ypos[i]) + Next + + For i = 0 To 2 'Draw apples + Draw.Picture(hPictApple, AppleXpos[i], AppleYpos[i]) + Next + + Draw.Picture(hPictHeadRotated, Xpos[0], Ypos[0]) 'BM: Why doesn't the head appear on top? put hPictHead, and it will !!! + + Draw.End + + If (SnakeHasEatenApple()) Then + Play("eat") + MakeSnakeLonger '4th Generation programming :) + Inc Score + End If + + UpdateSpeed 'Should snake go faster? + UpdateScoreBoard 'Write score & speed on screen + + If (SnakeHitTheWall()) Then SnakeDies 'G4 again ;) + + If (SnakeBitHimself()) Then SnakeDies 'So cool + + If (SnakeAteAllApples()) Then 'If you've eaten the 3 apples, throw some more apples + TimerApple_Timer() 'Call the timer manually + TimerApple.Enabled = False 'Timer is disabled and re-enabled to reset it's internal timer + TimerApple.Enabled = True + End If + +End + +Public Sub TimerApple_Timer() + + Dim I, J As Integer 'Throw 3 random apples all over the screen + Dim X, Y As Integer + + AppleXpos.Clear + AppleYpos.Clear + + For I = 0 To 2 + + ' Do not add an apple on the snake + Do + X = Int(Rnd(1, 30)) * 20 + Y = Int(Rnd(1, 20)) * 20 + + For J = 0 To Xpos.Max + If X = Xpos[J] And Y = Ypos[J] Then Break + Next + + If J = Xpos.Count Then Break + Loop + + AppleXpos.Add(X) + AppleYpos.Add(Y) + + Next + +End + +Public Sub MakeSnakeLonger() + + Xpos.add(Xpos[Tailpos[0]]) 'Add a new square to where the tail square is, to make the snake longer + Ypos.add(Ypos[Tailpos[0]]) + + TailPos.add(TailPos[0]) 'Remember when we said, tailpos keeps rotating. Now we have put an extra + TailPos.remove(0) 'Square, to make it move instead of the real tail, we make a back rotation (in + TailPos.add(Xpos.Length - 1, 0) 'opposite direction). First element => Last position, then index of new tail + 'gets added at location 0. Remember, TailPos[0] is the index of the tail!!! + +End + +Public Function SnakeHasEatenApple() As Boolean + + Dim RetVal As Boolean + Dim TmpAppleX As Integer + Dim TmpAppleY As Integer + Dim i As Integer + + RetVal = False + + For i = 0 To 2 + + TmpAppleX = AppleXpos[i] + TmpAppleY = AppleYpos[i] + If (Xpos[0] = (TmpAppleX) And Ypos[0] = (TmpAppleY)) Then 'Snake head on an apple? + AppleXpos[i] = -100 'Hide eaten apples + AppleYpos[i] = -100 + RetVal = True + End If + + Next + + + Return RetVal + +End + + +Public Function SnakeHitTheWall() As Boolean + + If (Xpos[0] < 0 Or Ypos[0] < 0 Or Xpos[0] >= 600 Or Ypos[0] >= 400) Then 'Duh + Return True + Else + Return False + End If + +End + +Public Sub SnakeDies() + + TmrEngine.Enabled = False + TimerApple.Enabled = False + Play("dead") + Message(("The snake's soul will always be remembered.\nGame Over!!\nYou scored: ") & score & ("\nPress Game -> New to play again.")) + +End + + +Public Sub MenuNew_Click() + + Dim i As Integer + + Head_Direction = "" 'Reset everything + Score = 0 + MenuGrandMa_Click() 'Reset speed + + InitSnake + TimerApple_Timer + + TmrEngine.Enabled = True + TimerApple.Enabled = True + +End + +Public Sub MenuPause_Click() + + If (MenuPause.Caption = ("&Pause") And (TmrEngine.Enabled = True)) Then + TmrEngine.Enabled = False + TimerApple.Enabled = False + MenuPause.Caption = ("Un&Pause") + Else If (MenuPause.Caption = ("Un&Pause") And (TmrEngine.Enabled = False)) Then + TmrEngine.Enabled = True + TimerApple.Enabled = True + MenuPause.Caption = ("&Pause") + End If + +End + +Public Sub MenuQuit_Click() + + FrmMain.Close + +End + +Public Sub MenuGrandMa_Click() + + TmrEngine.delay = 200 + TimerApple.delay = 8000 + Speed = ("GrandMa") + +End + + +Public Sub MenuCool_Click() + + TmrEngine.delay = 150 + TimerApple.delay = 5000 + Speed = ("Cool") + +End + + +Public Sub MenuSpeedFreak_Click() + + TmrEngine.delay = 100 + TimerApple.delay = 2500 + Speed = ("Speed Freak") + +End + +Public Sub MenuHowToPlay_Click() + + Dim Help As String + + Help = ("The Rules are simple:\n") + Help = Help & ("Eat as many apples as you can\n") + Help = Help & ("Do not Hit the walls, or bite yourself!\n\n") + Help = Help & ("Use the arrow keys to move the snake") + + Message(Help) + +End + + +Public Sub InitSnake() + + Dim i As Integer + + Xpos.Clear() + Ypos.Clear() + TailPos.Clear() + + For i = 0 To 3 + Xpos.add(0, i) + Ypos.add(0, i) + Next 'BM: Here i exists with value 4, shouldn't it be 3?! + + TailPos.add(3, 0) + TailPos.add(2, 1) + TailPos.add(1, 2) + +End + +Public Function SnakeAteAllApples() As Boolean + + 'IF ( AppleXpos[0] = AppleXpos[1] = AppleXpos[2] = -100) THEN 'BM: Doesn't work + If ((AppleXpos[0] = -100) And (AppleXpos[1] = -100) And (AppleXpos[2] = -100)) Then + Return True + Else + Return False + End If + +End + +Public Sub UpdateScoreBoard() + + LblScore.Text = ("Score: ") & Score + LblSpeed.Text = ("Speed: ") & Speed + +End + +Public Sub UpdateSpeed() + + If MenuAutoAdvanceSpeed.checked Then + If (Score > 19 And Speed = ("GrandMa")) Then MenuCool_Click + If (Score > 79 And Speed = ("Cool")) Then MenuSpeedFreak_Click 'Let's kill ur snake :) + End If + +End + +Public Sub MenuAutoAdvanceSpeed_Click() + + MenuAutoAdvanceSpeed.Checked = Not MenuAutoAdvanceSpeed.Checked 'Toggle menu checking + +End + +Public Function SnakeBitHimself() As Boolean + + Dim RetVal As Boolean + Dim TmpAppleX As Integer + Dim TmpAppleY As Integer + Dim i As Integer + + RetVal = False + + For i = 1 To (Xpos.Length - 1) + + TmpAppleX = Xpos[i] + TmpAppleY = Ypos[i] + If (Xpos[0] = (TmpAppleX) And Ypos[0] = (TmpAppleY) And Xpos[0] <> 0) Then 'Snake head on part of its body? + RetVal = True + End If + + Next + + Return RetVal + +End + +Public Sub MenuAbout_Click() + + Dim About As String + + About = ("Snake v1.0\nBy: Ahmad Kamal \nWritten for Gambas http://gambas.sf.net") + Message(About) + +End + +Public Sub Play(sound As String) +'I know it's slow, but I had to give it sound!!! +'Now I can safely move on to writing Quake17 ;) + +' EXEC [ "playwave", "/tmp/" & sound & ".wav" ] + Select Case sound + Case "start" + startsound.Play() + Case "eat" + eatsound.Play() + Case "dead" + deadsound.Play() + End Select +End + + +Public Sub dwg_KeyPress() + + Form_KeyPress + +End diff --git a/app/examples/Games/Snake/.src/FrmMain.form b/app/examples/Games/Snake/.src/FrmMain.form new file mode 100644 index 00000000..c506eab1 --- /dev/null +++ b/app/examples/Games/Snake/.src/FrmMain.form @@ -0,0 +1,89 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(34.3333,27.3333,105.3333,81.6667) + Font = Font["Bold"] + Background = &H000000& + Foreground = &HFF0000& + Text = ("") + Icon = Picture["head.png"] + Resizable = False + { MenuGame Menu + Text = ("&Game") + { MenuNew Menu + Text = ("&New") + Shortcut = "Ctrl+N" + } + { MenuPause Menu + Text = ("&Pause") + Shortcut = "F3" + } + { MenuSep Menu + Text = ("") + } + { MenuQuit Menu + Text = ("&Quit") + Shortcut = "Ctrl+Q" + } + } + { MenuSpeed Menu + Text = ("&Speed") + { MenuGrandMa Menu + Text = ("&GrandMa") + } + { MenuCool Menu + Text = ("&Cool") + } + { MenuSpeedFreak Menu + Text = ("&Speed Freak") + } + { MenuAutoAdvanceSpeed Menu + Text = ("&Auto Advance Speed (Challenge ME)") + Checked = True + } + } + { MenuHelp Menu + Text = ("&Help") + { MenuHowToPlay Menu + Text = ("&How To Play") + Shortcut = "F1" + } + { Menu1 Menu + Text = ("") + } + { MenuAbout Menu + Text = ("&About") + } + } + { LblScore Label + MoveScaled(3,1,49.3333,6.6667) + Font = Font["16"] + Background = &H000000& + Foreground = &HFF0000& + Text = ("") + } + { LblSpeed Label + MoveScaled(54,1,49.3333,6.6667) + Font = Font["16"] + Background = &H000000& + Foreground = &HFF0000& + Text = ("") + } + { dwg DrawingArea + MoveScaled(3,8,100,66.6667) + Font = Font["14"] + Mouse = Mouse.Blank + Cached = True + Focus = True + } + { TmrEngine #Timer + #X = 0 + #Y = 432 + Delay = 100 + } + { TimerApple #Timer + #X = 592 + #Y = 432 + Delay = 10000 + } +} diff --git a/app/examples/Games/Snake/apple.png b/app/examples/Games/Snake/apple.png new file mode 100644 index 0000000000000000000000000000000000000000..cef23a2c1546d91cc63572321f1533d24469d25f GIT binary patch literal 1141 zcmV-*1d98KP)W@%!HPTf4Ck8T+tRM`bCn!V- z6nZYRpwd5jqES?W5(Xj>N-~?y&`sUF+r8U;_&t74e_T`i!=Ur`IWIVe563hjym$N{ zjwhyWx_ehstGaVavzm18qS{=#c}+C**Gc|Qsji+xZU1?Hr5nf^uf$AIm?%V73Jg!I z*RQXBxZ&`t^0MtdwwU|AJxCX?{5SYOr&(F@qi&^0+lczWCsnB+p^p=WxS^{)Tyoaw zoiI^HgT>%V(6J)F^XxWx@goO{3pui4!j0e~Yim=5u(TzDE~{{CNILQnu}~@y3(G`z zpM_hJT)CK|@pc$TaXPQ`k?f@8!P&dkUHTxkRz^D?tbzdh-n~a3`r*W^Vp*CpS=y#w zvd%YVS}NP5Nb@3^c*m82+qU!X|4CfGqd&_-v2_BUA6%O@ZC3qvSQ1V zxy2t3$ijYqZ)=|BnIqI@#z<-xJshE}!DL$SOdQqb5rq-41k@t3C|?@!<~1((ZRf8) zRzZLTK~3V0Qv-)4i_DFI3PCF{Nyus;DMGAVB;MMH9?z0Y2wnwr1;i6+A31U4=$Cu% zzkCf`eg5*QjI~>1pcGoibzH}lR*tCDG!(5kL9=hmPL3fXcmc!$NE9F{gSe4QtIHR@ zG60XySgU5`PQKQFYSUZ#CZVW|KhO2SAo>z|K|;U@KrBcEIsj8vGDibA zpB$};!9Z_;oLp!C}(3W~jTh1xLq}sm8(z5P^yy=7G{+LQrK<^$x(~w)!AC zI~)oag+j!t;S0Q~Cl zl?$o})&(;L+6C)r_4&4?HoOLQtlFCIi^n%zgz-_V9m7fqOR0*fGAO@_i3>6cQUsHS zs00IUZS8^m-_PJ0xNXl%GXKqvqy6z%*Eu9t02u*Bs##NIP-8$AxCC~ry0Sk8m)*GO z{-Wi%v19aI2LZPC{45PU2YRoh5-Tq%Ih6xD3ThO{0i#t=^1vXtS@_#^RM(>qJ@fnG zMLTZ(BzGM6R6W+zRJTs+?HgcdGXxvK>w;i8c(Wnb4DU}(#;0%W+zlev|KZKhO;0~d zygRM_SoTKR^W6^LN_!GgIT-X3=BFtuJJ0QFfhBK!cEj910HYLlJcP&F00000NkvXX Hu0mjfGj0~# literal 0 HcmV?d00001 diff --git a/app/examples/Games/Snake/body.png b/app/examples/Games/Snake/body.png new file mode 100644 index 0000000000000000000000000000000000000000..1baff801f471c73643bd9d2194766d5d84cff58c GIT binary patch literal 1138 zcmX|93s96*6#nl2FT2Y=1QCM)gnS^5q96<^ln}T(f+;Nsp@PO(L$S2vA`LHbcquSL zMkoo&64_vyqpmumi<%ngG=*cEC=W@%p&>vKBU&Ejp8j2{nRCB;&Ufa{Irp5eQWLvg zDf5s4P{u^7;)UDQcBH(3my<>#0PeVEV}e=;(Fz;{(t$MKJ}?Maz^sfB0|7?hN61O; zKn@&nCdH@UO+G*`_ewJH~F&9|4E_5BgRkglD{QNQaX_nT7bI{jfj*pO0O4Q0Td8U z;b9cEl$PQv;2QW2UN$E4dF~Tt4NIYvLMkkxB0cFov7qA2VKn!rp<`ipeV$eiHG;N%y{2k5{}x;a1t9n@hWla{o8@F6CxY zriL`WG@7 zE*X+=0~~~vWdmh4fw5zZJInD`c+o8p-^TN1o|zeL14Tds@HLo`v5O3sflQzpr~?{- z9GeENcqa>gMPzn->}H!{v8J%Dde^+9PHRh$sBtE(&blRj{MGiu!B6RYb?FtZ2$j$lmy2 z%ATm5@mU+RN6HpOSE-k-T^PLVHNVvX*PDzdOe&8>OEzzNdq>>X#O<4tllshE_xzVh zTn~MeuFDu3dNT5Kc+>FXF9P*7oJOM`KXkJF_|J8r8J32YKL-Q0n4%q*oOnI&kDBJT z&(CgY(f)O$JEQY-UlZq=V7RJpA6%Y%N!NF7cjwc!1(TymyzHB|8h_2|@Bi|2o0Csy z{*$T7gC40l+StZDBNO!(e!ugMDR+3h_SCl2NZq{Z2N`dk?K9;)w&=F6tvEd4$KUTw z-*mlTZ14W!`TnY^s_$Bzyfas=RF@g*TO2gG=bLLoHZ1AsdeGgrroU1whI(60@965| Pf=GZEb*$=4RBFjT&knM( literal 0 HcmV?d00001 diff --git a/app/examples/Games/Snake/dead.wav b/app/examples/Games/Snake/dead.wav new file mode 100644 index 0000000000000000000000000000000000000000..f8d4292d0fb411872b8676e3ed8fd1938e03d40e GIT binary patch literal 10026 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 L|42+7neY4`JMe+U literal 0 HcmV?d00001 diff --git a/app/examples/Games/Snake/eat.wav b/app/examples/Games/Snake/eat.wav new file mode 100644 index 0000000000000000000000000000000000000000..fc8ff1e38449462023247971bd26d878c3060d6c GIT binary patch literal 1192 zcmeHG&uM5-wza#KGb~%o34a5}&PX%wy^+3e=6&B> zoyue$$N&oy^XcMO>&yZGEM{aLV0b|!vJ4D5Qa=ECf8>f4wjcqv*#AU^`#t)^E#_~n z3lR7P0~GS>c@PQ4=O7M0xFvK6-GOYuvpMj)cO|~@&5LgC=_@_5+G%vNr);%yCAR$^ zi#R(zmVDkA!4Ss!&nJ%ISxY4-H|X@5J^=fSWS55b72|nL<>TMIT$G9CsK9prQFEQg z1ET?3)f|QVdJr;q8~08F4`~4WN#ll~NW@yb=BMpY^~aA{v_4>AF#h_jq0s8}KCUbU z_m4v1de2pjwKuhqlw9cwHdWImI;w`Y4nz3Sfu4-kkM3TU_Fn0j_ohcBuFQ-{_fHVS z6=G7yC1sDj<7L#@yD~Z2Rs_K2fnrE5Ssg}p2=UrOZv;DPJ}y;!VDB9E5@~UXg2z?? z@rGhrDVeSH^B$0DL%(&w59DT_&5v=K)7N5cm4xfvN=*-2e|#H{Viw(f_}1uvy*OsI zpInOJjgNpJf^B^+u;pbD@p4!>h1_wOnA-Npnhq=^{S9MTdYG3Wdw z;z!I+rTl9Zk+psVxjurxOpUhBte$pMquA~lgQD3mAp>WTZIuNpH_{R$Cx;wC#n4ax zF7*q4ATR>^dy9j0#Y_dQ`c60ZW>XG@O()zrWfeRYkMp znPNbr2uQfi6B%4t9215T8c~2`8b3M=MKMX;nfD`L(N@hDrj$l;IC&N^%Js?FvzVB- z)5i|}e|)G8d^R;Zml0r7+067*>guFd#OB3|7tR~jc_S|B>Fj0kuOa#6@-kZ}Ef-7W af~d}B=7^}ymTrGtV3|_+i_ckX#DI5=O%5^u literal 0 HcmV?d00001 diff --git a/app/examples/Games/Snake/head.png b/app/examples/Games/Snake/head.png new file mode 100644 index 0000000000000000000000000000000000000000..c6576d3fc8568e7ca518403fbbf437409b797b78 GIT binary patch literal 1197 zcmYjR3ozAL82_FB|2}f>&DG7svU@&HjcxN-kDFaAxo7XS)6C9%=XbvIeRIBZ&hPx@OY_?1K3iZU z05IFr!_`|e>ubj>R)cr_2Au(>*=x&AH_Z}f0Sbfzp+Ggz3}GiQ1~N?uCE8RGtiJ}2 z@)*h>5x4*em2fE+a%eFU`c$8#EF!?Cd`%G%6=^qy;y<)((E29LGxd9BumfnFacX8z zbM77B=NUg2`2Iss6Hl74P#ABZ3k-nFv z(X4+44~*A-3i*NX%6Ymix@K?9Tqax&s6Wr@lvS6=pInQ5P#ANeBEY@RT1>?_2t)&^ zAi0DsW_2Fw7<3!hJ}`}4A}A!JT__y4x2JMB&CjP%QI)$4w4`N#xz2EZ<%%AQ7FW*o zwdEgSkW5G}hock-YQ^GOi7->j(Xt%_l0}$&hNtAseK~i*OCzfX#x_brtMYkEo=8M0 z9cGw8EN~LY26Kzy{KDba@P*AnahF*4jjpI)#INGBZ&d4qBK;#@|QwO?z^dfruaLf+Bs6Xs8E zt{xK|-H;lR5)|&ROvQhgQs+~*zh*`a_Fn?lo-9FKH2n-z{r?W`*DiVBoBN)&;DCFVgp{C5TU z?Dp$wY-Qv2=`IIrRS2w>c~Kl%5#8JFiXk!l5pESEus$ zz}V%o@ge8N*5qTJiS5Ow&&+o|KB>6hQ<}7B&4%>!t-<$Xe^1tzBu8zn*V}vW$lia3 rrca0aKC?By8X0kLxV!h{QX@lDElMy8>071gKY*v(HrJmvhRFW~B!a^H literal 0 HcmV?d00001 diff --git a/app/examples/Games/Snake/start.wav b/app/examples/Games/Snake/start.wav new file mode 100644 index 0000000000000000000000000000000000000000..a23faacb29c03708040e51ad597a5ac191f5c0da GIT binary patch literal 31810 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 LFFLto!{+}FrKSsa literal 0 HcmV?d00001 diff --git a/app/examples/Games/Solitaire/.directory b/app/examples/Games/Solitaire/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/app/examples/Games/Solitaire/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/app/examples/Games/Solitaire/.icon.png b/app/examples/Games/Solitaire/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..fa870190609f8e8604fbe60579cb818f75902353 GIT binary patch literal 4209 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 Hu0mjfc$N3r literal 0 HcmV?d00001 diff --git a/app/examples/Games/Solitaire/.lang/ca.po b/app/examples/Games/Solitaire/.lang/ca.po new file mode 100644 index 00000000..c9e2e690 --- /dev/null +++ b/app/examples/Games/Solitaire/.lang/ca.po @@ -0,0 +1,96 @@ +# Catalan translation of Solitaire +# Copyright (C) 2000-2010 Benoît Minisini. +# This file is distributed under the same license as the Solitaire package. +# Jordi Sayol , 2007-2010. +# +# +msgid "" +msgstr "" +"Project-Id-Version: Solitaire\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2011-03-20 22:40+0100\n" +"Last-Translator: Jordi Sayol \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: FGameArea.form:48 +msgid "&About" +msgstr "&Quant a" + +#: FBoardSelect.form:21 +msgid "Board Layout" +msgstr "Format del tauler" + +#: FBoardSelect.form:31 +msgid "Cancel" +msgstr "Canceŀla" + +#: FGameArea.form:25 +msgid "&File" +msgstr "&Fitxer" + +#: FGameArea.form:37 +msgid "&Game" +msgstr "J&oc" + +#: FGameArea.form:45 +msgid "&Help" +msgstr "&Ajuda" + +#: FGameArea.form:28 +msgid "&New Game" +msgstr "&Joc nou" + +#: FGameArea.form:57 +msgid "New Game" +msgstr "Joc nou" + +#: FBoardSelect.form:26 +msgid "OK" +msgstr "D'acord" + +#: FGameArea.form:87 +msgid "Quit" +msgstr "Surt" + +#: FGameArea.form:32 +msgid "&Quit" +msgstr "&Surt" + +#: FGameArea.form:80 +msgid "Redo" +msgstr "Refés" + +#: FGameArea.form:65 +msgid "Restart" +msgstr "torna a iniciar" + +#: FBoardSelect.form:11 +msgid "Select board" +msgstr "Seleccioneu tauler" + +#: FGameArea.form:40 +msgid "&Select Board" +msgstr "&Seleccioneu tauler" + +#: FGameArea.form:20 +msgid "Solitaire" +msgstr "Solitari" + +#: FGameArea.class:259 +msgid "Solitaire v0.3\nBy: Grahame White \nWritten for Gambas http://gambas.sf.net" +msgstr "Solitari v0.3\nPer: Grahame White \nEscrit per al Gambas http://gambas.sf.net" + +#: .project:1 +msgid "Some sort of solitaire game" +msgstr "Una mena de joc del solitari" + +#: FGameArea.form:72 +msgid "Undo" +msgstr "Desfés" + diff --git a/app/examples/Games/Solitaire/.lang/cs.po b/app/examples/Games/Solitaire/.lang/cs.po new file mode 100644 index 00000000..24468c0b --- /dev/null +++ b/app/examples/Games/Solitaire/.lang/cs.po @@ -0,0 +1,94 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Some sort of solitaire game" +msgstr "Nějaké solitaire hry" + +#: FBoardSelect.form:11 +msgid "Select board" +msgstr "Vyber hru" + +#: FBoardSelect.form:21 +msgid "Board Layout" +msgstr "Rozložení hry" + +#: FBoardSelect.form:26 +msgid "OK" +msgstr "-" + +#: FBoardSelect.form:31 +msgid "Cancel" +msgstr "ZruÅ¡it" + +#: FGameArea.class:259 +msgid "" +"Solitaire v0.3\n" +"By: Grahame White \n" +"Written for Gambas http://gambas.sf.net" +msgstr "" +"Solitaire v0.3\n" +"Od: Grahame White \n" +"Napsaný pro Gambas http://gambas.sf.net" + +#: FGameArea.form:20 +msgid "Solitaire" +msgstr "-" + +#: FGameArea.form:25 +msgid "&File" +msgstr "&Soubor" + +#: FGameArea.form:28 +msgid "&New Game" +msgstr "&Nová hra" + +#: FGameArea.form:32 +msgid "&Quit" +msgstr "&Ukončit" + +#: FGameArea.form:37 +msgid "&Game" +msgstr "&Hra" + +#: FGameArea.form:40 +msgid "&Select Board" +msgstr "&Vyber hru" + +#: FGameArea.form:45 +msgid "&Help" +msgstr "&Nápověda" + +#: FGameArea.form:48 +msgid "&About" +msgstr "&O aplikaci" + +#: FGameArea.form:57 +msgid "New Game" +msgstr "Nová hra" + +#: FGameArea.form:65 +msgid "Restart" +msgstr "-" + +#: FGameArea.form:72 +msgid "Undo" +msgstr "Vpřed" + +#: FGameArea.form:80 +msgid "Redo" +msgstr "Zpět" + +#: FGameArea.form:87 +msgid "Quit" +msgstr "Ukončit" diff --git a/app/examples/Games/Solitaire/.lang/de.po b/app/examples/Games/Solitaire/.lang/de.po new file mode 100644 index 00000000..1ccd7676 --- /dev/null +++ b/app/examples/Games/Solitaire/.lang/de.po @@ -0,0 +1,89 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Some sort of solitaire game" +msgstr "Eine Solitär-Variante" + +#: FBoardSelect.form:11 +msgid "Select board" +msgstr "Spielfeld auswählen" + +#: FBoardSelect.form:21 +msgid "Board Layout" +msgstr "Spielfeld" + +#: FBoardSelect.form:26 +msgid "OK" +msgstr "-" + +#: FBoardSelect.form:31 +msgid "Cancel" +msgstr "Abbrechen" + +#: FGameArea.class:259 +msgid "Solitaire v0.3\nBy: Grahame White \nWritten for Gambas http://gambas.sf.net" +msgstr "Solitaire v0.3\nVon: Grahame White \nGeschrieben für Gambas http://gambas.sf.net" + +#: FGameArea.form:20 +msgid "Solitaire" +msgstr "-" + +#: FGameArea.form:25 +msgid "&File" +msgstr "&Datei" + +#: FGameArea.form:28 +msgid "&New Game" +msgstr "&Neues Spiel" + +#: FGameArea.form:32 +msgid "&Quit" +msgstr "&Beenden" + +#: FGameArea.form:37 +msgid "&Game" +msgstr "&Spiel" + +#: FGameArea.form:40 +msgid "&Select Board" +msgstr "&Spielfeld auswählen" + +#: FGameArea.form:45 +msgid "&Help" +msgstr "&Hilfe" + +#: FGameArea.form:48 +msgid "&About" +msgstr "&Über" + +#: FGameArea.form:57 +msgid "New Game" +msgstr "Neues Spiel" + +#: FGameArea.form:65 +msgid "Restart" +msgstr "Neu starten" + +#: FGameArea.form:72 +msgid "Undo" +msgstr "Rückgängig" + +#: FGameArea.form:80 +msgid "Redo" +msgstr "Wiederherstellen" + +#: FGameArea.form:87 +msgid "Quit" +msgstr "Beenden" + diff --git a/app/examples/Games/Solitaire/.lang/es.po b/app/examples/Games/Solitaire/.lang/es.po new file mode 100644 index 00000000..bc88c09b --- /dev/null +++ b/app/examples/Games/Solitaire/.lang/es.po @@ -0,0 +1,79 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: FBoardSelect.class:50 +msgid "Select board" +msgstr "Seleccionar tablero" + +#: FBoardSelect.class:60 +msgid "Board Layout" +msgstr "Tablero de diseño" + +#: FBoardSelect.class:65 +msgid "OK" +msgstr "OK" + +#: FBoardSelect.class:70 +msgid "Cancel" +msgstr "Cancelar" + +#: FGameArea.class:392 +msgid "Solitaire" +msgstr "&Seleccionar tablero" + +#: FGameArea.class:397 +msgid "&File" +msgstr "&Archivo" + +#: FGameArea.class:400 +msgid "&New Game" +msgstr "&Nuevo juego" + +#: FGameArea.class:404 +msgid "&Quit" +msgstr "&Salir" + +#: FGameArea.class:409 +msgid "&Game" +msgstr "&Juego" + +#: FGameArea.class:412 +msgid "&Select Board" +msgstr "&Seleccionar tablero" + +#: FGameArea.class:417 +msgid "&Help" +msgstr "&Ayuda" + +#: FGameArea.class:420 +msgid "&About" +msgstr "&Acerca de" + +#: FGameArea.class:429 +msgid "New Game" +msgstr "Nuevo juego" + +#: FGameArea.class:437 +msgid "Restart" +msgstr "Reiniciar" + +#: FGameArea.class:444 +msgid "Undo" +msgstr "Deshacer" + +#: FGameArea.class:452 +msgid "Redo" +msgstr "Rehacer" + +#: FGameArea.class:459 +msgid "Quit" +msgstr "Salir" diff --git a/app/examples/Games/Solitaire/.lang/ru.po b/app/examples/Games/Solitaire/.lang/ru.po new file mode 100644 index 00000000..ae7b85ea --- /dev/null +++ b/app/examples/Games/Solitaire/.lang/ru.po @@ -0,0 +1,116 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-28 09:00+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Games/Solitaire/.project:19 +msgid "Some sort of solitaire game" +msgstr "Своего рода игра в пасьянс" + +#: app/examples/Games/Solitaire/.project:20 app/examples/Games/Solitaire/.src/FGameArea.form:5 +msgid "Solitaire" +msgstr "Пасьянс" + +#: app/examples/Games/Solitaire/.src/FBoardSelect.form:5 +msgid "Select board" +msgstr "Выбрать доску" + +#: app/examples/Games/Solitaire/.src/FBoardSelect.form:13 +msgid "Board Layout" +msgstr "Макет доски" + +#: app/examples/Games/Solitaire/.src/FBoardSelect.form:17 +msgid "OK" +msgstr "ОК" + +#: app/examples/Games/Solitaire/.src/FBoardSelect.form:21 +msgid "Cancel" +msgstr "Отмена" + +#: app/examples/Games/Solitaire/.src/FGameArea.class:259 +msgid "" +"Solitaire v0.3\n" +"By: Grahame White \n" +"Written for Gambas http://gambas.sf.net" +msgstr "" +"Пасьянс версии 0.3\n" +"От: Грэхем Уайт \n" +"Написан для Gambas http://gambas.sf.net" + +#: app/examples/Games/Solitaire/.src/FGameArea.form:9 +msgid "&File" +msgstr "Файл" + +#: app/examples/Games/Solitaire/.src/FGameArea.form:11 +msgid "&New Game" +msgstr "Новая игра" + +#: app/examples/Games/Solitaire/.src/FGameArea.form:14 +msgid "&Quit" +msgstr "Выход" + +#: app/examples/Games/Solitaire/.src/FGameArea.form:18 +msgid "&Game" +msgstr "Игра" + +#: app/examples/Games/Solitaire/.src/FGameArea.form:20 +msgid "&Select Board" +msgstr "Выбрать доску" + +#: app/examples/Games/Solitaire/.src/FGameArea.form:24 +msgid "&Help" +msgstr "Справка" + +#: app/examples/Games/Solitaire/.src/FGameArea.form:26 +msgid "&About" +msgstr "О программе" + +#: app/examples/Games/Solitaire/.src/FGameArea.form:33 +msgid "New Game" +msgstr "Новая игра" + +#: app/examples/Games/Solitaire/.src/FGameArea.form:40 +msgid "Restart" +msgstr "Перезапустить" + +#: app/examples/Games/Solitaire/.src/FGameArea.form:46 +msgid "Undo" +msgstr "Откатить" + +#: app/examples/Games/Solitaire/.src/FGameArea.form:53 +msgid "Redo" +msgstr "Вернуть" + +#: app/examples/Games/Solitaire/.src/FGameArea.form:59 +msgid "Quit" +msgstr "Выход" + +#: app/examples/Games/Solitaire/.src/MBoards.module:27 +msgid "Original" +msgstr "Оригинал" + +#: app/examples/Games/Solitaire/.src/MBoards.module:49 +msgid "Plus" +msgstr "Плюс" + diff --git a/app/examples/Games/Solitaire/.project b/app/examples/Games/Solitaire/.project new file mode 100644 index 00000000..f9f4bf26 --- /dev/null +++ b/app/examples/Games/Solitaire/.project @@ -0,0 +1,18 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.0.0 +Title=Some sort of solitaire game +Description="Solitaire" +Startup=FGameArea +Icon=ball.png +Version=3.6.2 +VersionFile=1 +Component=gb.image +Component=gb.gui +TabSize=2 +Translate=1 +Language=fr +ExecPath=/home/benoit/gambas/gambas.link/share/gambas/examples/Games/Solitaire/Solitaire +Maintainer=benoit +Vendor=Princeton +Address=benoit@localhost +License=General Public Licence diff --git a/app/examples/Games/Solitaire/.src/CBoardDesign.class b/app/examples/Games/Solitaire/.src/CBoardDesign.class new file mode 100644 index 00000000..3e2c55ef --- /dev/null +++ b/app/examples/Games/Solitaire/.src/CBoardDesign.class @@ -0,0 +1,9 @@ +' Gambas class file + +' each row is stored as a number between 0-1023 (inc) +' each column numbered in 2^ and the row is the sum of the active columns +' leftmost column is 512, rightmost is 1 +Public Name As String ' Board desidn name +Public Row As New Byte[] ' Board layout +Public Placed As New Byte[] ' The cells with balls on them +Public Finish As Byte ' The cell that the last ball must be on diff --git a/app/examples/Games/Solitaire/.src/CMove.class b/app/examples/Games/Solitaire/.src/CMove.class new file mode 100644 index 00000000..6698dd82 --- /dev/null +++ b/app/examples/Games/Solitaire/.src/CMove.class @@ -0,0 +1,5 @@ +' Gambas class file + +Public Source As Byte ' Start cell +Public Target As Byte ' Finish cell +Public Captured As Byte ' Ball taken diff --git a/app/examples/Games/Solitaire/.src/FBoardSelect.class b/app/examples/Games/Solitaire/.src/FBoardSelect.class new file mode 100644 index 00000000..adc3e845 --- /dev/null +++ b/app/examples/Games/Solitaire/.src/FBoardSelect.class @@ -0,0 +1,35 @@ +' Gambas class file + +Public Sub cmdCancel_Click() + + FBoardSelect.Close + +End + +Public Sub Form_Show() + + Dim i As Byte + + ' Fill in the combo box text section + cboLayout.Text = Global.boarddesign[Global.selectedlayout].Name + + ' Fill in the combo box dropdown section + For i = 0 To Global.boarddesign.Count - 1 + cboLayout.Add(Global.boarddesign[i].Name) + Next + +End + + +Public Sub cmdOK_Click() + + ' Set board layout index + Global.selectedlayout = cboLayout.Index + + ' Reset board + FGameArea.reset_board() + + ' Close this window + FBoardSelect.Close + +End diff --git a/app/examples/Games/Solitaire/.src/FBoardSelect.form b/app/examples/Games/Solitaire/.src/FBoardSelect.form new file mode 100644 index 00000000..3d2c9094 --- /dev/null +++ b/app/examples/Games/Solitaire/.src/FBoardSelect.form @@ -0,0 +1,23 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(42.6667,7.5,40,11) + Text = ("Select board") + Resizable = False + { cboLayout ComboBox + MoveScaled(16,1,23,4) + Text = (" ") + } + { lblLayout TextLabel + MoveScaled(1,1,14,4) + Text = ("Board Layout") + } + { cmdOK Button + MoveScaled(1,6,11,4) + Text = ("OK") + } + { cmdCancel Button + MoveScaled(28,6,11,4) + Text = ("Cancel") + } +} diff --git a/app/examples/Games/Solitaire/.src/FGameArea.class b/app/examples/Games/Solitaire/.src/FGameArea.class new file mode 100644 index 00000000..c2312114 --- /dev/null +++ b/app/examples/Games/Solitaire/.src/FGameArea.class @@ -0,0 +1,368 @@ +' Gambas class file + +Public board As New Object[] + +Public Sub Form_Open() + + Dim i As Byte + Dim j As Byte + + Global.POW2 = [64, 32, 16, 8, 4, 2, 1] + Global.Ball = Picture.Load("ball.png") + + board.Resize(49) + + 'FGameArea.Border = window.Resizable + FGameArea.Resize((8 * 2) + (48 * 7), (8 * 2) + (48 * 8) + panToolBar.Height) + 'FGameArea.Border = window.Fixed + Global.selectedlayout = 0 + + ' Create master geometry (7 x 7 grid) + For i = 0 To 6 + For j = 0 To 6 + Wait + board[(i * 7) + j] = New PictureBox(Me) As "GameBoard" + board[(i * 7) + j].Alignment = Align.Center + board[(i * 7) + j].Border = Border.Plain + board[(i * 7) + j].height = 48 + board[(i * 7) + j].width = 48 + board[(i * 7) + j].x = 8 + (48 * j) + board[(i * 7) + j].y = 8 + (48 * i) + panToolBar.Height + Next + Next + + ' Create board layouts + MBoards.make_boards() + MBoards.fill_boards() + + reset_board() + +End + +Private Sub set_row(row_value As Byte, row_no As Byte) + + Dim i As Byte + + ' Just to be sure + If row_value > 127 Then row_value = 127 + + For i = 0 To 6 + If row_value >= global.POW2[i] Then + board[(row_no * 7) + i].visible = True + board[(row_no * 7) + i].border = border.Raised + row_value = row_value - global.POW2[i] + board[(row_no * 7) + i].Tag = (row_no * 7) + i + Else + board[(row_no * 7) + i].visible = False + Endif + Next + +End + +Private Sub place_balls(row_value As Byte, row_no As Byte) + + Dim i As Byte + + ' Just to be sure + If row_value > 127 Then row_value = 127 + + For i = 0 To 6 + If row_value >= global.POW2[i] Then + If board[(row_no * 7) + i].visible = True Then + board[(row_no * 7) + i].picture = Global.Ball + row_value = row_value - global.POW2[i] + Global.BallCount = Global.BallCount + 1 + Endif + Else + board[(row_no * 7) + i].picture = Null + Endif + Next + +End + +Public Sub GameBoard_MouseUp() + + ' If not enough balls left then return + If Global.BallCount <= 1 Then Return + ' If a ball is not already selected then select it + If Last.Picture = global.Ball Then + global.Selected = True + If global.ClickedBall <> Null Then + board[global.ClickedBall].background = 15658726 + Endif + global.ClickedBall = CByte(Last.Tag) + Last.background = &HFF0000& + Else + If global.Selected = True Then + try_take(global.ClickedBall, CByte(Last.tag)) + Endif + Endif + +End + +Private Sub try_take(source_cell As Byte, target_cell As Byte) + + Dim current_row As Byte + Dim target_row As Byte + Dim current_col As Byte + Dim target_col As Byte + Dim i As Byte + + + If board[target_cell].visible = False Then Return + + current_row = source_cell \ 7 + target_row = target_cell \ 7 + + ' Are both cells on the same row + If current_row = target_row Then + ' (YES) Check that they are close enough and have a ball in between + ' Check to the right + If source_cell + 2 < 49 Then + If source_cell + 2 = target_cell Then + ' In range + If board[source_cell + 1].picture = global.Ball Then + ' Ah good! A move can be made + ' Record move + set_move(Global.totalballs - Global.ballcount, source_cell, target_cell, source_cell + 1) + + ' clean up move recorder to make undo/redo work correctly + For i = (Global.totalballs - Global.ballcount) + 1 To Global.totalballs - 1 + set_move(i, 0, 0, 0) + Next + + ' Move pieces + board[source_cell].picture = Null + board[source_cell].background = 15658726 + board[source_cell + 1].picture = Null + board[target_cell].picture = global.Ball + global.BallCount = global.BallCount - 1 + + ' Finally activate Undo seeing as a move has been made + tbtnUndo.Enabled = True + tbtnRedo.Enabled = False + + Return + Endif + Endif + Endif + + ' Then to the left + If source_cell - 2 >= 0 Then + If source_cell - 2 = target_cell Then + ' In range + If board[source_cell - 1].picture = global.Ball Then + ' Ah good! A move can be made + ' Record move + set_move(Global.totalballs - Global.ballcount, source_cell, target_cell, source_cell - 1) + + ' clean up move recorder to make undo/redo work correctly + For i = (Global.totalballs - Global.ballcount) + 1 To Global.totalballs - 1 + set_move(i, 0, 0, 0) + Next + + ' Move pieces + board[source_cell].picture = Null + board[source_cell].background = 15658726 + board[source_cell - 1].picture = Null + board[target_cell].picture = global.Ball + global.BallCount = global.BallCount - 1 + + ' Finally activate Undo seeing as a move has been made + tbtnUndo.Enabled = True + tbtnRedo.Enabled = False + + Return + Endif + Endif + Endif + Endif + + ' Ok, so not on the same row ... how about the same column? + current_col = source_cell Mod 7 + target_col = target_cell Mod 7 + + If current_col = target_col Then + If source_cell + 14 < 49 Then + If source_cell + 14 = target_cell Then + If board[source_cell + 7].picture = global.Ball Then + ' Record move + set_move(Global.totalballs - Global.ballcount, source_cell, target_cell, source_cell + 7) + + ' clean up move recorder to make undo/redo work correctly + For i = (Global.totalballs - Global.ballcount) + 1 To Global.totalballs - 1 + set_move(i, 0, 0, 0) + Next + + ' Move pieces + board[source_cell].Picture = Null + board[source_cell].background = 15658726 + board[source_cell + 7].Picture = Null + board[target_cell].picture = global.Ball + global.BallCount = global.BallCount - 1 + + ' Finally activate Undo seeing as a move has been made + tbtnUndo.Enabled = True + tbtnRedo.Enabled = False + + Return + Endif + Endif + Endif + + If source_cell - 14 >= 0 Then + If source_cell - 14 = target_cell Then + If board[source_cell - 7].picture = global.Ball Then + ' Record move + set_move(Global.totalballs - Global.ballcount, source_cell, target_cell, source_cell - 7) + + ' clean up move recorder to make undo/redo work correctly + For i = (Global.totalballs - Global.ballcount) + 1 To Global.totalballs - 1 + set_move(i, 0, 0, 0) + Next + + ' Move pieces + board[source_cell].picture = Null + board[source_cell].background = 15658726 + board[source_cell - 7].picture = Null + board[target_cell].picture = global.Ball + global.BallCount = global.BallCount - 1 + + ' Finally activate Undo seeing as a move has been made + tbtnUndo.Enabled = True + tbtnRedo.Enabled = False + + Return + Endif + Endif + Endif + Endif + +End + +Public Sub mnuQuit_Click() + + Me.Close + +End + +Public Sub mnuNew_Click() + + reset_board() + +End + +Public Sub mnuAbout_Click() + + Dim About As String + + About = ("Solitaire v0.3\nBy: Grahame White \nWritten for Gambas http://gambas.sf.net") + Message(About) + +End + +Public Sub tbtnQuit_Click() + + Me.Close + +End + +Public Sub tbtnNewGame_Click() + + reset_board() + +End + +Public Sub reset_board() + + Dim j As Byte + + ' Clear ball count + Global.BallCount = 0 + + ' Display the board layout + For j = 0 To 6 + set_row(Global.boarddesign[Global.selectedlayout].Row[j], j) + place_balls(Global.boarddesign[Global.selectedlayout].Placed[j], j) + Next + + Global.totalballs = Global.ballcount + + ' Make sure there is enough room for all the moves (number of balls, which leaves 1 extra just in case) + Global.gamemove.Resize(Global.ballcount) + + ' Reset the move recorder + For j = 0 To Global.ballcount - 1 + Global.gamemove[j] = New CMove + set_move(j, 0, 0, 0) + Next + + ' Disable Undo/Redo buttons + tbtnUndo.Enabled = False + tbtnRedo.Enabled = False + +End + +Private Sub set_move(movenumber As Byte, source As Byte, target As Byte, capture As Byte) + + With Global.gamemove[movenumber] + .Source = Source + .Target = Target + .Captured = capture + End With + +End + +Private Sub undo_move(movenumber As Byte) + + tbtnUndo.Enabled = False + + ' Put balls in correct places + board[Global.gamemove[movenumber].target].Picture = Null + board[Global.gamemove[movenumber].captured].picture = Global.ball + board[Global.gamemove[movenumber].source].picture = Global.ball + + ' update ball counter + global.ballcount = global.ballcount + 1 + + If global.ballcount < global.totalballs Then tbtnUndo.Enabled = True + tbtnRedo.Enabled = True + +End + +Public Sub tbtnUndo_Click() + + undo_move((global.totalballs - global.ballcount) - 1) + +End + +Private Sub redo_move(movenumber As Byte) + + tbtnRedo.Enabled = False + + ' Put balls in correct places + board[Global.gamemove[movenumber].target].picture = Global.ball + board[Global.gamemove[movenumber].captured].Picture = Null + board[Global.gamemove[movenumber].source].Picture = Null + + ' Update ball counter + global.ballcount = global.ballcount - 1 + + If movenumber + 1 < global.totalballs Then + If global.gamemove[movenumber + 1].target <> global.gamemove[movenumber + 1].source Then tbtnRedo.Enabled = True + Endif + tbtnUndo.Enabled = True + +End + +Public Sub tbtnRedo_Click() + + redo_move(global.totalballs - global.ballcount) + +End + +Public Sub mnuBoardSelect_Click() + + FBoardSelect.ShowModal + +End diff --git a/app/examples/Games/Solitaire/.src/FGameArea.form b/app/examples/Games/Solitaire/.src/FGameArea.form new file mode 100644 index 00000000..0af8fb6f --- /dev/null +++ b/app/examples/Games/Solitaire/.src/FGameArea.form @@ -0,0 +1,64 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(57.5714,37.1429,50,58) + Text = ("Solitaire") + Icon = Picture["ball.png"] + Resizable = False + { mnuFile Menu + Text = ("&File") + { mnuNew Menu + Text = ("&New Game") + } + { mnuQuit Menu + Text = ("&Quit") + } + } + { mnuGame Menu + Text = ("&Game") + { mnuBoardSelect Menu + Text = ("&Select Board") + } + } + { mnuHelp Menu + Text = ("&Help") + { mnuAbout Menu + Text = ("&About") + } + } + { panToolBar Panel + MoveScaled(0,0,82.6667,4) + { tbtnNewGame ToolButton + MoveScaled(0,0,4,4) + ToolTip = ("New Game") + Text = ("") + Picture = Picture["new.png"] + } + { tbtnRestartGame ToolButton + MoveScaled(4,0,4,4) + Enabled = False + ToolTip = ("Restart") + Text = ("") + } + { tbtnUndo ToolButton + MoveScaled(4,0,4,4) + Enabled = False + ToolTip = ("Undo") + Text = ("") + Picture = Picture["undo.png"] + } + { tbtnRedo ToolButton + MoveScaled(8,0,4,4) + Enabled = False + ToolTip = ("Redo") + Text = ("") + Picture = Picture["redo.png"] + } + { tbtnQuit ToolButton + MoveScaled(12,0,4,4) + ToolTip = ("Quit") + Text = ("") + Picture = Picture["quit.png"] + } + } +} diff --git a/app/examples/Games/Solitaire/.src/Global.class b/app/examples/Games/Solitaire/.src/Global.class new file mode 100644 index 00000000..4c3d6ca2 --- /dev/null +++ b/app/examples/Games/Solitaire/.src/Global.class @@ -0,0 +1,11 @@ +' Gambas class file + +Static Public boarddesign As New Object[] ' The game grid +Static Public POW2 As Integer[] ' Array for display algo +Static Public ball As Picture ' The ball graphic +Static Public selected As Boolean ' Is a ball selected? +Static Public clickedball As Byte ' Which ball, ignored if above is false +Static Public ballcount As Byte ' The number of balls in play +Static Public totalballs As Byte ' The number of balls at the start +Static Public gamemove As New Object[] ' Stores the moves made to allow for undoing +Static Public selectedlayout As Byte ' The active board layout diff --git a/app/examples/Games/Solitaire/.src/MBoards.module b/app/examples/Games/Solitaire/.src/MBoards.module new file mode 100644 index 00000000..ec7e8ebb --- /dev/null +++ b/app/examples/Games/Solitaire/.src/MBoards.module @@ -0,0 +1,69 @@ +' Gambas module file + +Public Sub make_boards() + + Dim i As Byte + Dim j As Byte + + ' Create the board design objects + + Global.boarddesign.Resize(2) + + For i = 0 To Global.boarddesign.Count - 1 + Global.boarddesign[i] = New CBoardDesign + For j = 1 To 7 + Global.boarddesign[i].Row.Add(0) + Global.boarddesign[i].Placed.Add(0) + Next + Next + +End + +Public Sub fill_boards() + + ' Fill the board design Array + + With Global.boarddesign[0] + .Name = ("Original") + + .Row[0] = 28 + .Row[1] = 28 + .Row[2] = 127 + .Row[3] = 127 + .Row[4] = 127 + .Row[5] = 28 + .Row[6] = 28 + + .Placed[0] = 28 + .Placed[1] = 28 + .Placed[2] = 127 + .Placed[3] = 119 + .Placed[4] = 127 + .Placed[5] = 28 + .Placed[6] = 28 + + .Finish = 28 + End With + + With Global.boarddesign[1] + .Name = ("Plus") + + .Row[0] = 28 + .Row[1] = 28 + .Row[2] = 127 + .Row[3] = 127 + .Row[4] = 127 + .Row[5] = 28 + .Row[6] = 28 + + .Placed[0] = 0 + .Placed[1] = 8 + .Placed[2] = 8 + .Placed[3] = 62 + .Placed[4] = 8 + .Placed[5] = 8 + .Placed[6] = 0 + + .Finish = 28 + End With +End diff --git a/app/examples/Games/Solitaire/ball.png b/app/examples/Games/Solitaire/ball.png new file mode 100644 index 0000000000000000000000000000000000000000..5e5e042e2f7b73ca288b0cbbe68961df1796dd3c GIT binary patch literal 3327 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 VZ-apY?{=W+44$rjF6*2UngFwdJ>38R literal 0 HcmV?d00001 diff --git a/app/examples/Games/Solitaire/redo.png b/app/examples/Games/Solitaire/redo.png new file mode 100644 index 0000000000000000000000000000000000000000..72b4ce5cc8cdaa52f3740cfde3b48acbfdd4d9c9 GIT binary patch literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9oB=)|uJ`WUYi?|2U})Abigp7E zGL{7S1v5B2yO9RuXn49fhHzX@PB_3S5zfeI*2c=kBf}%Z-M}K;@gRyp4;#Cuxa@2uUG{2v!Lei3nK-7lsZF#x6qx1IvWV a%nW69%#vXnX3PibVeoYIb6Mw<&;$Sq{2`wJ literal 0 HcmV?d00001 diff --git a/app/examples/Games/StarField/.directory b/app/examples/Games/StarField/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/app/examples/Games/StarField/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/app/examples/Games/StarField/.icon.png b/app/examples/Games/StarField/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..236e2ed08cdf5d55458da6809196a99a16380280 GIT binary patch literal 3140 zcmV-K47>A*P)=h(Q=m1hIJ^E=OX-!|REu1WywAdK9Uo3)Ph^|pLCFFXJIV1Z$9!!e5Wjo@7zu1Q5~54cxln*d9#Q#%Wx)R>ao}r&Yydps6pzXTViyW%iItrP_`&371t~4oK9sSpuz% zczf5=xTPytvf>Upn-9>_ew3R(`J2-sfU*+>C@7aR+9+QuJy8I;dI7ABIQaH+$cohz zPQ1^6s$i(Pj6_nSMPGIQSAq*Hz(l_Bl+G$M@y50AfVQUn3|5vRVSsBn!`XVv(&Za* zdmB+&2(lSWB85`dPYgGSnHTD;(OTs$umE>;77zwG&VA5~S6>g#;cfXW1MMfdz0%{% z!e2p)=49i~Xjr$6RC&$y6JXN%uC>h>(c&9XlYV$*8=-@*KFPV0jYJN@4Vx%W&%zc0 zN-C?!o!ZZleP^kz-^iYqzDHBfF&1t3H0nC8I5MdK7HIK}5%I6Zy8ps=zseu}?tOgi zAD?9Bzx*?Q{rrCuEL@IGq^R~_NJ4h+c@fig5bvhBq$-jat2(!gvb8DYeB~+aD5a_Q!xkpA8_+Pj)Kedsk-RkpGC?z<@i zQZ+TSb$0RC-#tztQA#0KG>$RVQvC<=18meb6uoR2Zyhd%3?w@ExbrF|pfGFlMF z`2v8u#H_TRXe8qm$l5$dJ6gGaSv9tLKF{oL9;9Lu<=dWhY{H51#>Wecz&I3k<AtKb?elJh_>!Sqw zU!X}0RdLPV-0>T<1_5)sJJ|a9-=7xZMHoTc`C6X}t#q0&mF!Fu@-l9T7~2b-IdOmm zHyPeK)yDhe@KR-jnO>ry0YWdquH$D}xzr;W^BB$!)7Rd@_bZn0!$Z5+Ah4sXiY{lE z(|m$$4?aAt4`=U&}K%RrVy zRV^l!rhotIl&{)Ernj3f)yLVBE2U}IE7WX#fb3uf^@|M(vhR2s*cls zhQypY@;T_fxlc!__IEH9@wYq24oe*#bcrBC#?uy&dF+-{BM6 zew|JmCsVVL(uJGRCWiK67wyW(c?)pjvgZZR_+!6PpdF;k%Q$>E!-*&U0bMqi{?-l% z1B`;ZHr>nroH@!`105yhgl;6&)G~5Xq~!yjS+(^XIQ}l7XcjiCLFp?id}R8&3DYYf zy%JFh;~XEf?j`AU(B9Lef?cD*#Z2P4s_*Ql;=^bC21ubXzk&a73+ENg=e{~ z&`0xuecb<kJpB{qRF_gwwUEqkj+b89LG7o$h+4dfTbFfmps5{~ zXaL;kOBEqzH1D?d;H~-u!#%D1(ZhejzrFM_3kDi!Sh98s5(q}0f3@#Yc>!oB&jQ(g-Rr`g@E#|W_~rP`P@BUWJ6h+{GmNK zYmw2qzi5x({axHVuZ~SIh@Wdm3Yw#b_Yn+dE_lvI-9(MV03{=w$1Ff;1pWn))r*81ZkY8dLCHX|$>jOx8{Ox@!&+;Ask1eA!jN{NWL(wG~D zQ5P8K{oqs>D~o0Gk;?h`(Uk25Q~-1c@shZ<1HGA3#j65T{rHWuZ^YA;iz8QDXm3aX z&|(Yu!M;CiyR>qBr5R5h-2mv>l;Eh7~as-*d e3}!Hc8T=n6Y29`>ozrOm0000 screen.Width Then + Stars.x = 0 + Stars.y = Int(Rnd(screen.Height)) + Stars.speed = Int(Rnd(1, 4)) + Endif + Next + + ' Attention la couleur affecte aussi les images ! + Draw.ForeColor = &hFFFFFF& + + Draw.Font.Size = Font.DefaultFontSize * 2 + Draw.Text(Screen.Framerate, 10, Screen.Height - 40) + + ' on applique la rotation et on affiche le logo + Draw.Rotate(rotation) + Draw.Image(img, Screen.Width \ 2 - 64, Screen.Height \ 2 - 64) + + ' rotation de 0 a 360 :-) + rotation = (rotation + 1) Mod 360 + +End diff --git a/app/examples/Games/StarField/enterprise.png b/app/examples/Games/StarField/enterprise.png new file mode 100644 index 0000000000000000000000000000000000000000..e76709e4227732091a19a2b225498f8413006efb GIT binary patch literal 4623 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 literal 0 HcmV?d00001 diff --git a/app/examples/Image/ImageViewer/.directory b/app/examples/Image/ImageViewer/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/app/examples/Image/ImageViewer/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/app/examples/Image/ImageViewer/.icon.png b/app/examples/Image/ImageViewer/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0ca93bd80534e39fec653bd33b959a86998f0765 GIT binary patch literal 4419 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 JPDHLkV1lkhc-8;_ literal 0 HcmV?d00001 diff --git a/app/examples/Image/ImageViewer/.lang/ca.po b/app/examples/Image/ImageViewer/.lang/ca.po new file mode 100644 index 00000000..4073799a --- /dev/null +++ b/app/examples/Image/ImageViewer/.lang/ca.po @@ -0,0 +1,64 @@ +# Catalan translation of ImageViewer +# Copyright (C) 2000-2010 Benoît Minisini. +# This file is distributed under the same license as the ImageViewer package. +# Jordi Sayol , 2007-2010. +# +# +msgid "" +msgstr "" +"Project-Id-Version: ImageViewer\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2010-12-17 01:07+0100\n" +"Last-Translator: Jordi Sayol \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: FViewer.form:48 +msgid "&?" +msgstr "-" + +#: FViewer.form:51 +msgid "&About..." +msgstr "&Quant a..." + +#: FViewer.class:101 +msgid "A simple image viewer example by\nBenoit Minisini (gambas@users.sourceforge.net)" +msgstr "Un exemple senzill de visualitzador d'imatges per\n Benoit Minisini (gambas@users.souceforge.net)" + +#: FViewer.form:40 +msgid "&Draw" +msgstr "&Dibuixa" + +#: FViewer.form:23 +msgid "&File" +msgstr "&Fitxer" + +#: .project:1 +msgid "Image viewer example" +msgstr "Exemple de visor d'imatges" + +#: FViewer.form:26 +msgid "&Open..." +msgstr "&Obre..." + +#: FViewer.form:34 +msgid "&Quit" +msgstr "&Surt" + +#: FViewer.form:18 +msgid "Simple Image Viewer" +msgstr "Visor d'imatges senzill" + +#: FViewer.form:43 +msgid "&Start" +msgstr "&Inicia" + +#: FViewer.class:51 +msgid "&Stop" +msgstr "&Atura" + diff --git a/app/examples/Image/ImageViewer/.lang/cs.po b/app/examples/Image/ImageViewer/.lang/cs.po new file mode 100644 index 00000000..6b8d73b6 --- /dev/null +++ b/app/examples/Image/ImageViewer/.lang/cs.po @@ -0,0 +1,60 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Image viewer example" +msgstr "Příklad prohlížeče obrázků" + +#: FViewer.class:53 +msgid "&Stop" +msgstr "-" + +#: FViewer.class:103 +msgid "" +"A simple image viewer example by\n" +"Benoit Minisini (gambas@users.sourceforge.net)" +msgstr "" +"Jednoduchý například prohlížeče obrázků od\n" +"Benoit Minisini (gambas@users.sourceforge.net)" + +#: FViewer.form:19 +msgid "Simple Image Viewer" +msgstr "Ukázka prohlížeče obrázků" + +#: FViewer.form:24 +msgid "&File" +msgstr "&Soubor" + +#: FViewer.form:27 +msgid "&Open..." +msgstr "&Otevřít..." + +#: FViewer.form:35 +msgid "&Quit" +msgstr "&Ukončit" + +#: FViewer.form:41 +msgid "&Draw" +msgstr "&Kresli" + +#: FViewer.form:44 +msgid "&Start" +msgstr "-" + +#: FViewer.form:49 +msgid "&?" +msgstr "-" + +#: FViewer.form:52 +msgid "&About..." +msgstr "&O programu..." diff --git a/app/examples/Image/ImageViewer/.lang/de.po b/app/examples/Image/ImageViewer/.lang/de.po new file mode 100644 index 00000000..5e24c275 --- /dev/null +++ b/app/examples/Image/ImageViewer/.lang/de.po @@ -0,0 +1,57 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Image viewer example" +msgstr "Beispiel für einen Bildbetrachter" + +#: FViewer.class:53 +msgid "&Stop" +msgstr "&Stopp" + +#: FViewer.class:103 +msgid "A simple image viewer example by\nBenoit Minisini (gambas@users.sourceforge.net)" +msgstr "Ein einfaches Bildbetrachter-Beispiel von\nBenoit Minisini (gambas@users.sourceforge.net)" + +#: FViewer.form:19 +msgid "Simple Image Viewer" +msgstr "Einfacher Bildbetrachter" + +#: FViewer.form:24 +msgid "&File" +msgstr "&Datei" + +#: FViewer.form:27 +msgid "&Open..." +msgstr "&Öffnen..." + +#: FViewer.form:35 +msgid "&Quit" +msgstr "&Beenden" + +#: FViewer.form:41 +msgid "&Draw" +msgstr "&Zeichnen" + +#: FViewer.form:44 +msgid "&Start" +msgstr "-" + +#: FViewer.form:49 +msgid "&?" +msgstr "-" + +#: FViewer.form:52 +msgid "&About..." +msgstr "&Über..." + diff --git a/app/examples/Image/ImageViewer/.lang/es.po b/app/examples/Image/ImageViewer/.lang/es.po new file mode 100644 index 00000000..cce89879 --- /dev/null +++ b/app/examples/Image/ImageViewer/.lang/es.po @@ -0,0 +1,43 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: FViewer.class:147 +msgid "Simple Image Viewer" +msgstr "Visor de imágenes simple" + +#: FViewer.class:151 +msgid "&File" +msgstr "&Archivo" + +#: FViewer.class:154 +msgid "&Open..." +msgstr "&Abrir..." + +#: FViewer.class:163 +msgid "&Quit" +msgstr "&Salir" + +#: FViewer.class:169 +msgid "&Draw" +msgstr "&Dibujar" + +#: FViewer.class:172 +msgid "&Start" +msgstr "&Inicio" + +#: FViewer.class:177 +msgid "&?" +msgstr "&?" + +#: FViewer.class:180 +msgid "&About..." +msgstr "&Acerca de..." diff --git a/app/examples/Image/ImageViewer/.lang/nl.po b/app/examples/Image/ImageViewer/.lang/nl.po new file mode 100644 index 00000000..2d106e7f --- /dev/null +++ b/app/examples/Image/ImageViewer/.lang/nl.po @@ -0,0 +1,55 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: ImageViewer 3.5.90\n" +"PO-Revision-Date: 2014-09-25 21:29 UTC\n" +"Last-Translator: Willy Raets \n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Image viewer example" +msgstr "Image viewer voorbeeld" + +#: FViewer.class:53 +msgid "&Stop" +msgstr "&Stop" + +#: FViewer.class:103 +msgid "A simple image viewer example by\nBenoit Minisini (gambas@users.sourceforge.net)" +msgstr "Een eenvoudig Image Viewer voorbeeld door\nBenoît Minisini (gambas@users.sourceforge.net)" + +#: FViewer.form:19 +msgid "Simple Image Viewer" +msgstr "Eenvoudige Image Viewer" + +#: FViewer.form:24 +msgid "&File" +msgstr "&Bestand" + +#: FViewer.form:27 +msgid "&Open..." +msgstr "&Open..." + +#: FViewer.form:35 +msgid "&Quit" +msgstr "&Afsluiten" + +#: FViewer.form:41 +msgid "&Draw" +msgstr "&Teken" + +#: FViewer.form:44 +msgid "&Start" +msgstr "&Start" + +#: FViewer.form:49 +msgid "&?" +msgstr "-" + +#: FViewer.form:52 +msgid "&About..." +msgstr "&Over..." + diff --git a/app/examples/Image/ImageViewer/.lang/ru.po b/app/examples/Image/ImageViewer/.lang/ru.po new file mode 100644 index 00000000..2eaee01e --- /dev/null +++ b/app/examples/Image/ImageViewer/.lang/ru.po @@ -0,0 +1,82 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-30 09:26+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Image/ImageViewer/.project:22 +msgid "Image viewer example" +msgstr "Пример просмотрщика изображений" + +#: app/examples/Image/ImageViewer/.project:23 +msgid "A simple image viewer example" +msgstr "Простой пример просмотрщика изображений" + +#: app/examples/Image/ImageViewer/.src/FViewer.class:14 +msgid "Picture files" +msgstr "Файлы изображений" + +#: app/examples/Image/ImageViewer/.src/FViewer.class:53 +msgid "&Stop" +msgstr "Стоп" + +#: app/examples/Image/ImageViewer/.src/FViewer.class:55 app/examples/Image/ImageViewer/.src/FViewer.form:24 +msgid "&Start" +msgstr "Начать" + +#: app/examples/Image/ImageViewer/.src/FViewer.class:103 +msgid "" +"A simple image viewer example by\n" +"Benoit Minisini (gambas@users.sourceforge.net)" +msgstr "" +"Простой пример просмотрщика изображений\n" +"от Бенуа Минисини (gambas@users.sourceforge.net)" + +#: app/examples/Image/ImageViewer/.src/FViewer.form:5 +msgid "Simple Image Viewer" +msgstr "Простой просмотрщик изображений" + +#: app/examples/Image/ImageViewer/.src/FViewer.form:9 +msgid "&File" +msgstr "Файл" + +#: app/examples/Image/ImageViewer/.src/FViewer.form:11 +msgid "&Open..." +msgstr "Открыть..." + +#: app/examples/Image/ImageViewer/.src/FViewer.form:17 +msgid "&Quit" +msgstr "Выход" + +#: app/examples/Image/ImageViewer/.src/FViewer.form:22 +msgid "&Draw" +msgstr "Рисовать" + +#: app/examples/Image/ImageViewer/.src/FViewer.form:28 +msgid "&?" +msgstr "&?" + +#: app/examples/Image/ImageViewer/.src/FViewer.form:30 +msgid "&About..." +msgstr "О программе..." + diff --git a/app/examples/Image/ImageViewer/.project b/app/examples/Image/ImageViewer/.project new file mode 100644 index 00000000..96d71cdb --- /dev/null +++ b/app/examples/Image/ImageViewer/.project @@ -0,0 +1,21 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.5.90 +Title=Image viewer example +Description="A simple image viewer example" +Startup=FViewer +Icon=image.png +Version=3.6.2 +VersionFile=1 +Component=gb.image +Component=gb.gui +Component=gb.form +Component=gb.form.dialog +Environment="GB_GUI=gb.gtk" +TabSize=2 +Translate=1 +Language=fr +Maintainer=benoit +Vendor=Princeton +Address=benoit@localhost +License=General Public Licence +Packager=1 diff --git a/app/examples/Image/ImageViewer/.src/FViewer.class b/app/examples/Image/ImageViewer/.src/FViewer.class new file mode 100644 index 00000000..78362945 --- /dev/null +++ b/app/examples/Image/ImageViewer/.src/FViewer.class @@ -0,0 +1,106 @@ +' Gambas class file + +Public Sub mnuOpen_Click() + + Dim hImage As Image + + Dialog.Path = "/usr/share/wallpapers" + If Not Exist(Dialog.Path) Then + Dialog.Path = User.Home + Endif + + 'Dialog.Path = Application.Path + + Dialog.Filter = ["*.jpg;*.jpeg;*.png;*.bmp", ("Picture files")] + + If Dialog.OpenFile() Then Return + + hImage = Image.Load(Dialog.Path) + + dwgImage.Clear() + dwgImage.Resize(hImage.Width, hImage.Height) + + Draw.Begin(dwgImage) + Draw.FillRect(0, 0, hImage.Width, hImage.Height, Color.Gray) + Draw.Image(hImage, 0, 0) + Draw.End + + dwgImage.Visible = True + +Catch + + Message.Warning(Error.Text & " !") + +End + +Public Sub mnuQuit_Click() + + Me.Close + +End + +'PUBLIC SUB dwgImage_Draw() +' +' IF hPict THEN Draw.Picture(0, 0, hPict) +' +'END + +Public Sub mnuStart_Click() + + timDraw.Enabled = Not timDraw.Enabled + + If timDraw.Enabled Then + mnuStart.Text = ("&Stop") + Else + mnuStart.Text = ("&Start") + Endif + +End + +Public Sub timDraw_Timer() + + Dim iInd As Integer + Dim X1 As Float + Dim Y1 As Float + Dim X2 As Float + Dim Y2 As Float + Dim W As Float + Dim H As Float + Dim eTime As Float + + Paint.Begin(dwgImage) + + Paint.LineWidth = 1 + + For iInd = 1 To 16 + + Paint.Brush = Paint.Color(Color.RGB(Int(Rnd(256)), Int(Rnd(256)), Int(Rnd(256)), 128)) + + X1 = Rnd(dwgImage.Width) + Y1 = Rnd(dwgImage.Height) + W = Rnd(16, 32) + H = Rnd(16, 32) + + Paint.Rectangle(X1, Y1, W, H) + Paint.Fill() + + Paint.Rotate(Pi(0.125)) + + 'Paint.Brush = Paint.Color(Color.Black) + 'Paint.Stroke + + Next + + Paint.End + + 'dwgImage.Refresh + +End + + +Public Sub mnuAbout_Click() + + Message.Info(("A simple image viewer example by\nBenoit Minisini (gambas@users.sourceforge.net)")) + +End + diff --git a/app/examples/Image/ImageViewer/.src/FViewer.form b/app/examples/Image/ImageViewer/.src/FViewer.form new file mode 100644 index 00000000..91b3c7a5 --- /dev/null +++ b/app/examples/Image/ImageViewer/.src/FViewer.form @@ -0,0 +1,52 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(34.4286,25.4286,106,81) + Text = ("Simple Image Viewer") + Icon = Picture["image.png"] + Arrangement = Arrange.Vertical + { mnuFile Menu + Text = ("&File") + { mnuOpen Menu + Text = ("&Open...") + Shortcut = "Ctrl+O" + } + { Menu1 Menu + } + { mnuQuit Menu + Text = ("&Quit") + Shortcut = "Ctrl+Q" + } + } + { Menu3 Menu + Text = ("&Draw") + { mnuStart Menu + Text = ("&Start") + } + } + { Menu2 Menu + Text = ("&?") + { mnuAbout Menu + Text = ("&About...") + } + } + { Separator1 Separator + MoveScaled(42,1,33,0) + } + { svwImage ScrollView + MoveScaled(1,4,52,46) + Background = Color.LightForeground + Expand = True + Border = False + { dwgImage DrawingArea + MoveScaled(0,0,29,27) + Visible = False + Background = &H00AA7F& + Cached = True + } + } + { timDraw #Timer + #MoveScaled(51,10) + Delay = 50 + } +} diff --git a/app/examples/Image/ImageViewer/image.png b/app/examples/Image/ImageViewer/image.png new file mode 100644 index 0000000000000000000000000000000000000000..a415746af95a1a1ce9ea0520657bfd2b61dc19d9 GIT binary patch literal 8428 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ǵhm?bQk81p5xpaeDS7vuB&!c3*?TGZ*o$H{SpT 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 O0000mpL{Qv*oQPxBdD5C7? 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 Y12T8Jaaw$ZcK`qY07*qoM6N<$f>!i~0{{R3 literal 0 HcmV?d00001 diff --git a/app/examples/Image/Lighttable/.lang/ca.po b/app/examples/Image/Lighttable/.lang/ca.po new file mode 100644 index 00000000..c3c49747 --- /dev/null +++ b/app/examples/Image/Lighttable/.lang/ca.po @@ -0,0 +1,337 @@ +# Catalan translation of Lighttable +# Copyright (C) 2000-2010 Benoît Minisini. +# This file is distributed under the same license as the Lighttable package. +# Jordi Sayol , 2007-2010. +# +# +msgid "" +msgstr "" +"Project-Id-Version: Lighttable\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2011-01-01 02:59+0100\n" +"Last-Translator: Jordi Sayol \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: .project:1 +msgid "Lighttable" +msgstr "-" + +#: .project:2 +msgid "A tool to sort photographs" +msgstr "Una eina per a ordenar les fotografies" + +#: FHelp.form:11 +msgid "Help" +msgstr "Ajuda" + +#: FHelp.form:31 FInfo.form:17 +msgid "&Close" +msgstr "&Tanca" + +#: FInfo.class:10 +msgid "There are no Exif informations in this file." +msgstr "No hi ha informació Exif en aquest fitxer." + +#: FInfo.class:29 +msgid "&Less" +msgstr "&Menys" + +#: FInfo.form:11 +msgid "Picture Informations" +msgstr "Informacions de la imatge" + +#: FInfo.form:24 +msgid "&More" +msgstr "&Més" + +#: FMain.class:33 +msgid "Lighttable - " +msgstr "-" + +#: FMain.class:47 +msgid "Right-click for Main Menu" +msgstr "Menú principal amb un clic del botó dret" + +#: FMain.class:48 +msgid " pictures" +msgstr "Imatge" + +#: FMain.class:49 +msgid "sorted alphabetically" +msgstr "Ordenat alfabèticament" + +#: FMain.class:75 +msgid "Right-click on the background or on a frame for menus." +msgstr "Menú amb un clic del botó dret al fons o a un marc" + +#: FMain.class:95 +msgid "Right-click for Picture Menu" +msgstr "Menú de la imatge amb un clic del botó dret" + +#: FMain.class:174 +msgid "&Rename all files..." +msgstr "Canvia de nom tots els &fitxers..." + +#: FMain.class:269 +msgid "Loading picture..." +msgstr "Carregant imatges..." + +#: FMain.class:344 +msgid "sorted chronologically" +msgstr "Ordenat cronològicament" + +#: FMain.class:384 +msgid "The file &1 already exists in the current directory!" +msgstr "El fitxer &1 ja existeix al directori actual!" + +#: FMain.class:436 FRename.form:32 FRenameAll.form:80 +#: FRenameAllWarning.form:17 FStart.form:26 FTime.form:51 +msgid "&Cancel" +msgstr "&Canceŀla" + +#: FMain.class:436 FRename.form:26 FRenameAll.form:74 FStart.form:20 +#: FTime.form:45 +msgid "&OK" +msgstr "D'ac&ord" + +#: FMain.class:436 +msgid "The file &1 will be deleted." +msgstr "El fitxer &1 serà esborrat." + +#: FMain.class:729 +msgid "Loading of pictures is being aborted..." +msgstr "La càrrega d'imatges s'està canceŀlant..." + +#: FMain.class:780 +msgid "Files are being renamed..." +msgstr "S'està canviant el nom dels fitxers..." + +#: FMain.class:809 +msgid "&1 files renamed" +msgstr "&1 fitxers han canviat de nom" + +#: FMain.class:825 +msgid "Setting time informations in all files..." +msgstr "Establint la informació de l'hora a tots els fitxers..." + +#: FMain.form:44 +msgid "Main menu" +msgstr "Menú principal" + +#: FMain.form:48 +msgid "Sorted &alphabetically" +msgstr "Ordenat &alfabèticament" + +#: FMain.form:55 +msgid "Sorted &chronologically" +msgstr "Ordenat &cronològicament" + +#: FMain.form:61 +msgid "&Slideshow" +msgstr "Presentació de &diapositives" + +#: FMain.form:67 +msgid "Abort &Loading" +msgstr "Atura &la Càrrega" + +#: FMain.form:73 +msgid "&Time correction..." +msgstr "Correcció de &temps..." + +#: FMain.form:79 +msgid "&Open folder..." +msgstr "&Obre la carpeta..." + +#: FMain.form:85 +msgid "&Help" +msgstr "&Ajuda" + +#: FMain.form:91 +msgid "&Quit" +msgstr "&Surt" + +#: FMain.form:98 +msgid "Picture menu" +msgstr "Menú de la imatge" + +#: FMain.form:102 +msgid "(Move picture: drag frame with mouse)" +msgstr "(Mou la imatge: arrossega el marc amb el ratolí)" + +#: FMain.form:107 +msgid "&View picture (click on picture)" +msgstr "&Visualitza la imatge (clic a la imatge)" + +#: FMain.form:113 +msgid "&Full Screen View" +msgstr "&Vista de pantalla completa" + +#: FMain.form:119 +msgid "&Close view" +msgstr "&Tanca la vista" + +#: FMain.form:125 +msgid "&Next picture" +msgstr "&Propera imatge" + +#: FMain.form:131 +msgid "&Previous picture" +msgstr "Imatge &anterior" + +#: FMain.form:137 +msgid "Picture &informations" +msgstr "&Informacions de la imatge" + +#: FMain.form:143 +msgid "&Rename picture" +msgstr "Canvia de nom la &imatge" + +#: FMain.form:149 +msgid "&Delete picture" +msgstr "&Suprimeix la imatge" + +#: FRename.class:43 +msgid "Old and new filename are identical." +msgstr "El nom de fitxer antic i el nou són idèntics." + +#: FRename.form:11 +msgid "Rename" +msgstr "Canvi de nom" + +#: FRename.form:17 +msgid "New filename:" +msgstr "Nom de fitxer nou:" + +#: FRenameAll.class:11 +msgid "MyPicture.JPG" +msgstr "LaMevaImatge.JPG" + +#: FRenameAll.form:22 +msgid "Rename all pictures" +msgstr "Canvia de nom totes les imatges" + +#: FRenameAll.form:41 +msgid "1" +msgstr "-" + +#: FRenameAll.form:47 +msgid "Keep original filename as suffix" +msgstr "Manté el nom original del fitxer com a sufix" + +#: FRenameAll.form:53 +msgid "Number format" +msgstr "Format del nombre" + +#: FRenameAll.form:58 +msgid "digits" +msgstr "dígits" + +#: FRenameAll.form:63 +msgid "Prefix" +msgstr "Prefix" + +#: FRenameAll.form:68 +msgid "Start value" +msgstr "Valor inicial" + +#: FRenameAll.form:88 +msgid "This function will rename all .jp(e)g files in the directory and add serial numbers to the filenames.
    The pictures will be handled in the order they are shown right now, in rows from left to right, rows from top to bottom." +msgstr "Aquesta funció canviarà el nom de tots els fitxers del directori i afegirà un número de serie al nom dels fitxers.
    Les imatges es gestionaran en el mateix ordre en que es mostren ara, en files d'esquerra a dreta, files de dalt a baix." + +#: FRenameAll.form:94 +msgid "Options" +msgstr "Opcions" + +#: FRenameAll.form:99 +msgid "Example:" +msgstr "Exemple:" + +#: FRenameAllWarning.form:12 +msgid "File Conflicts" +msgstr "Conflictes de fitxers" + +#: FRenameAllWarning.form:24 +msgid "Continue &anyway" +msgstr "Continua de totes m&aneres" + +#: FRenameAllWarning.form:29 +msgid "The following files can't be renamed, because the target filenames already exist in the directory.
    If you continue, only the files without conflicts will be renamed.
    If you cancel, you can choose new filename options." +msgstr "No es pot canviar el nom d'aquests fitxers perquè els noms de fitxer de destí ja existeixen al directori.
    Si continueu, només els fitxers sense conflicte canviaran de nom.
    Si canceŀleu, podreu triar noves opcions de nom de fitxer." + +#: FSlideshow.form:38 +msgid "Pause between pictures:" +msgstr "Pausa entre imatges:" + +#: FSlideshow.form:49 +msgid "sec" +msgstr "seg" + +#: FSlideshow.form:54 +msgid "Stop" +msgstr "Atura" + +#: FStart.class:54 +msgid "The folder &1 doesn't contain any jp(e)g files." +msgstr "La carpeta &1 no conté cap fitxer jp(e)g." + +#: FStart.form:15 +msgid "Lighttable - Select picture folder" +msgstr "Lighttable - Trieu una carpeta d'imatges " + +#: FStart.form:41 +msgid "New selection" +msgstr "Nova selecció" + +#: FStart.form:51 +msgid "Last selections" +msgstr "Últimes seleccions" + +#: FTime.class:21 +msgid "There is no time correction selected." +msgstr "No hi ha correcció de temps seleccionat." + +#: FTime.form:18 +msgid "Time correction" +msgstr "Correcció de temps" + +#: FTime.form:39 +msgid "earlier" +msgstr "previ" + +#: FTime.form:39 +msgid "later" +msgstr "posterior" + +#: FTime.form:59 +msgid "This function will correct all date/time informations in the EXIF section of all .jp(e)g files in the folder.
    A backup of the files will be made with file names like 'MyPicture.jpg_original'.
    If there are no EXIF date/time informations in a file, nothing will be done." +msgstr "Aquesta funció corregirà les informacions de data/hora dins de la secció Exif de tots els fitxers .jp(e)g de la carpeta.
    Es farà una còpia de seguretat dels fitxers amb noms de fitxers com «LaMevaImatge.jpg_original».
    Si no hi ha informacions Exif de data/hora dins el fitxer, no es farà res." + +#: FTime.form:65 +msgid "Set the original time of all pictures to" +msgstr "Estableix l'hora original de totes les imatges de" + +#: FTime.form:70 +msgid "day(s)" +msgstr "dia(es)" + +#: FTime.form:75 +msgid "hour(s)" +msgstr "Hora(es)" + +#: FTime.form:80 +msgid "minute(s)" +msgstr "minut(s)" + +#: MMain.module:12 +msgid "To run this program, exiftool must be installed." +msgstr "Per poder executar aquest programa, l'exiftool ha d'estar instaŀlat." + +#: MMain.module:18 +msgid "To run this program, convert must be installed." +msgstr "Per poder executar aquest programa, el convertidor ha d'estar instaŀlat." diff --git a/app/examples/Image/Lighttable/.lang/cs.po b/app/examples/Image/Lighttable/.lang/cs.po new file mode 100644 index 00000000..9b909c49 --- /dev/null +++ b/app/examples/Image/Lighttable/.lang/cs.po @@ -0,0 +1,330 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Lighttable" +msgstr "-" + +#: .project:2 +msgid "A tool to sort photographs" +msgstr "Nástroj na třídění fotografií" + +#: FHelp.form:11 +msgid "Help" +msgstr "Nápověda" + +#: FHelp.form:31 FInfo.form:17 +msgid "&Close" +msgstr "&Zavři" + +#: FInfo.class:10 +msgid "There are no Exif informations in this file." +msgstr "O tomto souboru nejsou Exif informace." + +#: FInfo.class:29 +msgid "&Less" +msgstr "&Méně" + +#: FInfo.form:11 +msgid "Picture Informations" +msgstr "Informace o obrázku" + +#: FInfo.form:24 +msgid "&More" +msgstr "&Více" + +#: FMain.class:32 +msgid "Lighttable - " +msgstr "-" + +#: FMain.class:46 +msgid "Right-click for Main Menu" +msgstr "Klikni pravým pro menu" + +#: FMain.class:47 +msgid " pictures" +msgstr " obrázek" + +#: FMain.class:48 +msgid "sorted alphabetically" +msgstr "seřadit abecedně" + +#: FMain.class:74 +msgid "Right-click on the background or on a frame for menus." +msgstr "Klikni pravým na pozadí a nebo rám pro menu." + +#: FMain.class:94 +msgid "Right-click for Picture Menu" +msgstr "Klikni pravým pro menu obrázku" + +#: FMain.class:173 +msgid "&Rename all files..." +msgstr "&Přejmenovat všechny soubory..." + +#: FMain.class:268 +msgid "Loading picture..." +msgstr "Načítání obrázku..." + +#: FMain.class:343 +msgid "sorted chronologically" +msgstr "seřadit chronologicky" + +#: FMain.class:383 +msgid "The file &1 already exists in the current directory!" +msgstr "Soubor &1 již existuje v aktuální složce!" + +#: FMain.class:435 FRename.form:32 FRenameAll.form:80 +#: FRenameAllWarning.form:17 FStart.form:26 FTime.form:51 +msgid "&Cancel" +msgstr "&Zrušit" + +#: FMain.class:435 FRename.form:26 FRenameAll.form:74 FStart.form:20 +#: FTime.form:45 +msgid "&OK" +msgstr "-" + +#: FMain.class:435 +msgid "The file &1 will be deleted." +msgstr "Soubor &1 bude smazán." + +#: FMain.class:727 +msgid "Loading of pictures is being aborted..." +msgstr "Načítání obrázků bylo přerušeno..." + +#: FMain.class:778 +msgid "Files are being renamed..." +msgstr "Soubor byl přejmenován..." + +#: FMain.class:807 +msgid "&1 files renamed" +msgstr "Soubor &1 přejmenován" + +#: FMain.class:823 +msgid "Setting time informations in all files..." +msgstr "Nastavení časové informace ve všech souborech..." + +#: FMain.form:44 +msgid "Main menu" +msgstr "Hlavní menu" + +#: FMain.form:48 +msgid "Sorted &alphabetically" +msgstr "Seřadit &abecedně" + +#: FMain.form:55 +msgid "Sorted &chronologically" +msgstr "Seřadit &chronologicky" + +#: FMain.form:61 +msgid "&Slideshow" +msgstr "&Promítání" + +#: FMain.form:67 +msgid "Abort &Loading" +msgstr "Přerušit &načítání" + +#: FMain.form:73 +msgid "&Time correction..." +msgstr "&Korekce času..." + +#: FMain.form:79 +msgid "&Open folder..." +msgstr "&Otevřít složku..." + +#: FMain.form:85 +msgid "&Help" +msgstr "&Nápověda" + +#: FMain.form:91 +msgid "&Quit" +msgstr "&Ukončit" + +#: FMain.form:98 +msgid "Picture menu" +msgstr "Menu obrázku" + +#: FMain.form:102 +msgid "(Move picture: drag frame with mouse)" +msgstr "(Přesun obrázku: uchop s myší rám)" + +#: FMain.form:107 +msgid "&View picture (click on picture)" +msgstr "&Zobrazení obrázku (klikni na obrázek)" + +#: FMain.form:113 +msgid "&Full Screen View" +msgstr "&Plný náhled obrázku" + +#: FMain.form:119 +msgid "&Close view" +msgstr "&Zavřít pohled" + +#: FMain.form:125 +msgid "&Next picture" +msgstr "&Další obrázek" + +#: FMain.form:131 +msgid "&Previous picture" +msgstr "&Předchozí obrázek" + +#: FMain.form:137 +msgid "Picture &informations" +msgstr "&Informace o obrázku" + +#: FMain.form:143 +msgid "&Rename picture" +msgstr "&Přejmenovat obrázek" + +#: FMain.form:149 +msgid "&Delete picture" +msgstr "&Smazat obrázek" + +#: FRename.class:43 +msgid "Old and new filename are identical." +msgstr "Starý a nový název je identický." + +#: FRename.form:11 +msgid "Rename" +msgstr "Přejmenovat" + +#: FRename.form:17 +msgid "New filename:" +msgstr "Nový název souboru:" + +#: FRenameAll.class:11 +msgid "MyPicture.JPG" +msgstr "-" + +#: FRenameAll.form:22 +msgid "Rename all pictures" +msgstr "Přejmenovat všechy obrázky" + +#: FRenameAll.form:41 +msgid "1" +msgstr "-" + +#: FRenameAll.form:47 +msgid "Keep original filename as suffix" +msgstr "Nechat originální název jako příponu" + +#: FRenameAll.form:53 +msgid "Number format" +msgstr "Číselný formát" + +#: FRenameAll.form:58 +msgid "digits" +msgstr "číslice" + +#: FRenameAll.form:63 +msgid "Prefix" +msgstr "Předpona" + +#: FRenameAll.form:68 +msgid "Start value" +msgstr "Startovní hodnota" + +#: FRenameAll.form:88 +msgid "This function will rename all .jp(e)g files in the directory and add serial numbers to the filenames.
    The pictures will be handled in the order they are shown right now, in rows from left to right, rows from top to bottom." +msgstr "Tato funkce přejmenuje všechny .jp(e)g soubory v adresáři a přidat sériová čísla do názvu souborů.
    Fotografie budou zpracovány v pořadí, v jakém jsou právě teď zobrazeny, v řádcích zleva doprava, řádky od shora dolů." + +#: FRenameAll.form:94 +msgid "Options" +msgstr "Možnosti" + +#: FRenameAll.form:99 +msgid "Example:" +msgstr "Příklad:" + +#: FRenameAllWarning.form:12 +msgid "File Conflicts" +msgstr "Konflikt souboru" + +#: FRenameAllWarning.form:24 +msgid "Continue &anyway" +msgstr "Pokračuj &stejně" + +#: FRenameAllWarning.form:29 +msgid "The following files can't be renamed, because the target filenames already exist in the directory.
    If you continue, only the files without conflicts will be renamed.
    If you cancel, you can choose new filename options." +msgstr "Následující soubory nelze přejmenovat, protože cílový souborů již v adresáři existuje.
    Budete-li pokračovat, budou přejmenovány pouze soubory bez konfliktů.
    Pokud zrušíte, můžete zvolit možnost nového jména souboru." + +#: FSlideshow.form:38 +msgid "Pause between pictures:" +msgstr "Pauza mezi obrázky:" + +#: FSlideshow.form:49 +msgid "sec" +msgstr "-" + +#: FSlideshow.form:54 +msgid "Stop" +msgstr "-" + +#: FStart.class:54 +msgid "The folder &1 doesn't contain any jp(e)g files." +msgstr "Složka &1 neobsahuje žádný soubor typu jp(e)g." + +#: FStart.form:15 +msgid "Lighttable - Select picture folder" +msgstr "Lighttable - Výběr složky obrázků" + +#: FStart.form:41 +msgid "New selection" +msgstr "Nový výběr" + +#: FStart.form:51 +msgid "Last selections" +msgstr "Poslední výběry" + +#: FTime.class:18 +msgid "There is no time correction selected." +msgstr "Není vybrán čas korekce." + +#: FTime.form:18 +msgid "Time correction" +msgstr "Korekce času" + +#: FTime.form:39 +msgid "earlier" +msgstr "dříve" + +#: FTime.form:39 +msgid "later" +msgstr "později" + +#: FTime.form:59 +msgid "This function will correct all date/time informations in the EXIF section of all .jp(e)g files in the folder.
    A backup of the files will be made with file names like 'MyPicture.jpg_original'.
    If there are no EXIF date/time informations in a file, nothing will be done." +msgstr "Tato funkce opraví všechny informace o datu/času v sekci EXIF všechny. jp(e)g soubory ve složce.
    Záloha souborů s názvy souborů bude jako 'MyPicture.jpg_original'.
    Pokud není EXIF informace o datu/času v souboru, nebude dělat nic." + +#: FTime.form:65 +msgid "Set the original time of all pictures to" +msgstr "Nastav původní čas všech obrázků na" + +#: FTime.form:70 +msgid "day(s)" +msgstr "dní" + +#: FTime.form:75 +msgid "hour(s)" +msgstr "hodin" + +#: FTime.form:80 +msgid "minute(s)" +msgstr "minut" + +#: MMain.module:12 +msgid "To run this program, exiftool must be installed." +msgstr "Aby program běžel, musí být nainstalován exiftool." + +#: MMain.module:18 +msgid "To run this program, convert must be installed." +msgstr "Aby program běžel, musí být nainstalován convert." diff --git a/app/examples/Image/Lighttable/.lang/de.po b/app/examples/Image/Lighttable/.lang/de.po new file mode 100644 index 00000000..a30ab99d --- /dev/null +++ b/app/examples/Image/Lighttable/.lang/de.po @@ -0,0 +1,330 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Lighttable" +msgstr "Leuchttisch" + +#: .project:2 +msgid "A tool to sort photographs" +msgstr "Fotos sortieren" + +#: FHelp.form:11 +msgid "Help" +msgstr "Hilfe" + +#: FHelp.form:31 FInfo.form:17 +msgid "&Close" +msgstr "&Schließen" + +#: FInfo.class:10 +msgid "There are no Exif informations in this file." +msgstr "Diese Datei entält keine Exif-Informationen." + +#: FInfo.class:29 +msgid "&Less" +msgstr "&Weniger" + +#: FInfo.form:11 +msgid "Picture Informations" +msgstr "Bildinformationen" + +#: FInfo.form:24 +msgid "&More" +msgstr "&Mehr" + +#: FMain.class:33 +msgid "Lighttable - " +msgstr "Leuchttisch - " + +#: FMain.class:47 +msgid "Right-click for Main Menu" +msgstr "Rechtsklick für das Hauptmenü" + +#: FMain.class:48 +msgid " pictures" +msgstr " Bilder" + +#: FMain.class:49 +msgid "sorted alphabetically" +msgstr "alphabetisch sortiert" + +#: FMain.class:75 +msgid "Right-click on the background or on a frame for menus." +msgstr "Menüs: auf den Hintergrund oder auf einen Rahmen rechtsklicken." + +#: FMain.class:95 +msgid "Right-click for Picture Menu" +msgstr "Rechtsklick für das Bildmenü" + +#: FMain.class:174 +msgid "&Rename all files..." +msgstr "Alle Dateien &umbenennen..." + +#: FMain.class:269 +msgid "Loading picture..." +msgstr "Bild wird geladen..." + +#: FMain.class:344 +msgid "sorted chronologically" +msgstr "chronologisch sortiert" + +#: FMain.class:384 +msgid "The file &1 already exists in the current directory!" +msgstr "Die Datei &1 existiert im aktuellen Verzeichnis bereits!" + +#: FMain.class:436 FRename.form:32 FRenameAll.form:80 +#: FRenameAllWarning.form:17 FStart.form:26 FTime.form:51 +msgid "&Cancel" +msgstr "&Abbrechen" + +#: FMain.class:436 FRename.form:26 FRenameAll.form:74 FStart.form:20 +#: FTime.form:45 +msgid "&OK" +msgstr "-" + +#: FMain.class:436 +msgid "The file &1 will be deleted." +msgstr "Die Datei &1 wird gelöscht." + +#: FMain.class:729 +msgid "Loading of pictures is being aborted..." +msgstr "Das Laden der Bilder wird abgebrochen..." + +#: FMain.class:780 +msgid "Files are being renamed..." +msgstr "Dateien werden umbenannt..." + +#: FMain.class:809 +msgid "&1 files renamed" +msgstr "&1 Dateien umbenannt" + +#: FMain.class:825 +msgid "Setting time informations in all files..." +msgstr "Die Zeitinformationen in allen Dateien werden geändert..." + +#: FMain.form:44 +msgid "Main menu" +msgstr "Hauptmenü" + +#: FMain.form:48 +msgid "Sorted &alphabetically" +msgstr "&Alphabetisch sortiert" + +#: FMain.form:55 +msgid "Sorted &chronologically" +msgstr "&Chronologisch sortiert" + +#: FMain.form:61 +msgid "&Slideshow" +msgstr "Dia&show" + +#: FMain.form:67 +msgid "Abort &Loading" +msgstr "&Laden abbrechen" + +#: FMain.form:73 +msgid "&Time correction..." +msgstr "&Zeitkorrektur..." + +#: FMain.form:79 +msgid "&Open folder..." +msgstr "&Ordner öffnen..." + +#: FMain.form:85 +msgid "&Help" +msgstr "&Hilfe" + +#: FMain.form:91 +msgid "&Quit" +msgstr "&Beenden" + +#: FMain.form:98 +msgid "Picture menu" +msgstr "Bildermenü" + +#: FMain.form:102 +msgid "(Move picture: drag frame with mouse)" +msgstr "(Bild verschieben: Rahmen mit Maus ziehen)" + +#: FMain.form:107 +msgid "&View picture (click on picture)" +msgstr "Vergrößerte &Ansicht (Bild anklicken)" + +#: FMain.form:113 +msgid "&Full Screen View" +msgstr "&Vollbildansicht" + +#: FMain.form:119 +msgid "&Close view" +msgstr "&Ansicht schließen" + +#: FMain.form:125 +msgid "&Next picture" +msgstr "&Nächstes Bild" + +#: FMain.form:131 +msgid "&Previous picture" +msgstr "Vor&heriges Bild" + +#: FMain.form:137 +msgid "Picture &informations" +msgstr "&Bildinformationen" + +#: FMain.form:143 +msgid "&Rename picture" +msgstr "Bild &umbenennen" + +#: FMain.form:149 +msgid "&Delete picture" +msgstr "Bild &löschen" + +#: FRename.class:43 +msgid "Old and new filename are identical." +msgstr "Alter und neuer Dateiname sind gleich." + +#: FRename.form:11 +msgid "Rename" +msgstr "Umbenennen" + +#: FRename.form:17 +msgid "New filename:" +msgstr "Neuer Dateiname:" + +#: FRenameAll.class:11 +msgid "MyPicture.JPG" +msgstr "MeinBild.JPG" + +#: FRenameAll.form:22 +msgid "Rename all pictures" +msgstr "Alle Bilder umbenennen" + +#: FRenameAll.form:41 +msgid "1" +msgstr "-" + +#: FRenameAll.form:47 +msgid "Keep original filename as suffix" +msgstr "originalen Dateinamen als Suffix behalten" + +#: FRenameAll.form:53 +msgid "Number format" +msgstr "Zahlenformat" + +#: FRenameAll.form:58 +msgid "digits" +msgstr "Stellen" + +#: FRenameAll.form:63 +msgid "Prefix" +msgstr "Präfix" + +#: FRenameAll.form:68 +msgid "Start value" +msgstr "Startwert" + +#: FRenameAll.form:88 +msgid "This function will rename all .jp(e)g files in the directory and add serial numbers to the filenames.
    The pictures will be handled in the order they are shown right now, in rows from left to right, rows from top to bottom." +msgstr "Diese Funktion benennt alle .jp(e)g-Dateien im Verzeichnis um und fügt Seriennummern zu den Dateinamen hinzu.
    Die Dateien werden in der Reihenfolge bearbeitet, in der sie jetzt gezeigt werden, die Reihen von oben nach unten, in der Reihe von links nach rechts." + +#: FRenameAll.form:94 +msgid "Options" +msgstr "Optionen" + +#: FRenameAll.form:99 +msgid "Example:" +msgstr "Beispiel:" + +#: FRenameAllWarning.form:12 +msgid "File Conflicts" +msgstr "Dateikonflikte" + +#: FRenameAllWarning.form:24 +msgid "Continue &anyway" +msgstr "&Trotzdem fortfahren" + +#: FRenameAllWarning.form:29 +msgid "The following files can't be renamed, because the target filenames already exist in the directory.
    If you continue, only the files without conflicts will be renamed.
    If you cancel, you can choose new filename options." +msgstr "Folgende Dateien können nicht umbenannt werden, weil die Zielnamen im Verzeichnis bereits existieren.
    Wenn Sie fortfahren, werden nur die Dateien ohne Konflikt umbenannt.
    Wenn Sie abbrechen, können Sie neue Optionen für die Dateinamen einstellen." + +#: FSlideshow.form:38 +msgid "Pause between pictures:" +msgstr "Pause zwischen Bildern:" + +#: FSlideshow.form:49 +msgid "sec" +msgstr "Sek." + +#: FSlideshow.form:54 +msgid "Stop" +msgstr "-" + +#: FStart.class:54 +msgid "The folder &1 doesn't contain any jp(e)g files." +msgstr "Das Verzeichnis &1 enthält keine jp(e)g-Dateien." + +#: FStart.form:15 +msgid "Lighttable - Select picture folder" +msgstr "Leuchttisch - Bilderverzeichnis auswählen" + +#: FStart.form:41 +msgid "New selection" +msgstr "Neue Auswahl" + +#: FStart.form:51 +msgid "Last selections" +msgstr "Zuletzt ausgewählt" + +#: FTime.class:21 +msgid "There is no time correction selected." +msgstr "Es ist keine Zeitkorrektur gesetzt." + +#: FTime.form:18 +msgid "Time correction" +msgstr "Zeitkorrektur" + +#: FTime.form:39 +msgid "earlier" +msgstr "früher" + +#: FTime.form:39 +msgid "later" +msgstr "später" + +#: FTime.form:59 +msgid "This function will correct all date/time informations in the EXIF section of all .jp(e)g files in the folder.
    A backup of the files will be made with file names like 'MyPicture.jpg_original'.
    If there are no EXIF date/time informations in a file, nothing will be done." +msgstr "Diese Funktion korrigiert alle Datums-/Zeitinformationen im EXIF-Abschnitt aller .jp(e)g-Dateien im Verzeichnis.
    Es werden Sicherungskopien mit Namen wie 'MeinBild.jpg_original' erstellt.
    Falls eine Datei keine Zeitinformationen enthält, wird nichts unternommen." + +#: FTime.form:65 +msgid "Set the original time of all pictures to" +msgstr "Die Originalzeit aller Bilder ändern auf" + +#: FTime.form:70 +msgid "day(s)" +msgstr "Tag(e)" + +#: FTime.form:75 +msgid "hour(s)" +msgstr "Stunde(n)" + +#: FTime.form:80 +msgid "minute(s)" +msgstr "Minute(n)" + +#: MMain.module:12 +msgid "To run this program, exiftool must be installed." +msgstr "Für dieses Programm muss exiftool installiert sein." + +#: MMain.module:18 +msgid "To run this program, convert must be installed." +msgstr "Für dieses Programm muss convert installiert sein." diff --git a/app/examples/Image/Lighttable/.lang/en.po b/app/examples/Image/Lighttable/.lang/en.po new file mode 100644 index 00000000..9ebff4fb --- /dev/null +++ b/app/examples/Image/Lighttable/.lang/en.po @@ -0,0 +1,264 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 FMain.class:40 +msgid "Lighttable" +msgstr "" + +#: FHelp.class:30 +msgid "Help" +msgstr "" + +#: FHelp.class:38 +msgid "&Close" +msgstr "" + +#: FMain.class:67 +msgid "Choose picture folder" +msgstr "" + +#: FMain.class:76 +msgid "The folder &1 doesn't contain any jp(e)g files." +msgstr "" + +#: FMain.class:80 +#, fuzzy +msgid "Lighttable - " +msgstr "Lighttable - " + +#: FMain.class:81 +msgid " pictures" +msgstr "" + +#: FMain.class:82 +msgid "sorted alphabetically" +msgstr "" + +#: FMain.class:100 +msgid "To see the menus, right-click on the background or on a frame." +msgstr "" + +#: FMain.class:189 +msgid "&Rename all..." +msgstr "" + +#: FMain.class:332 +msgid "sorted chronologically" +msgstr "" + +#: FMain.class:389 +msgid "This filename already exists in the current directory !" +msgstr "" + +#: FMain.class:421 FRename.class:71 FRenameAll.class:69 +msgid "&Cancel" +msgstr "" + +#: FMain.class:421 FRename.class:65 FRenameAll.class:76 +#, fuzzy +msgid "&OK" +msgstr "-" + +#: FMain.class:421 +msgid "The file &1 will be deleted." +msgstr "" + +#: FMain.class:787 +msgid "Main menu" +msgstr "" + +#: FMain.class:792 +msgid "Sorted &alphabetically" +msgstr "" + +#: FMain.class:799 +msgid "Sorted &chronologically" +msgstr "" + +#: FMain.class:805 +msgid "Abort &Loading" +msgstr "" + +#: FMain.class:810 +msgid "&Help" +msgstr "" + +#: FMain.class:816 +msgid "&Quit" +msgstr "" + +#: FMain.class:823 +msgid "Frames menu" +msgstr "" + +#: FMain.class:827 +msgid "(Move picture: drag frame with mouse)" +msgstr "" + +#: FMain.class:832 +msgid "&View picture (click on picture)" +msgstr "" + +#: FMain.class:838 +msgid "&Full Screen View" +msgstr "" + +#: FMain.class:844 +msgid "&Close view" +msgstr "" + +#: FMain.class:850 +msgid "&Next picture" +msgstr "" + +#: FMain.class:856 +msgid "&Previous picture" +msgstr "" + +#: FMain.class:862 +#, fuzzy +msgid "Picture &informations" +msgstr "Picture informations" + +#: FMain.class:868 +msgid "&Rename picture" +msgstr "" + +#: FMain.class:874 +msgid "&Delete picture" +msgstr "" + +#: FRename.class:43 +msgid "Rename" +msgstr "" + +#: FRename.class:50 +msgid "New filename:" +msgstr "" + +#: FRename.class:56 +msgid "lblHidden" +msgstr "" + +#: FRenameAll.class:65 +msgid "Rename all pictures" +msgstr "" + +#: FRenameAll.class:83 +msgid "This function will number serially all the pictures.
    The pictures will be handled in the order they are
    shown right now, in rows from left to right,
    rows from top to bottom." +msgstr "" + +#: FRenameAll.class:94 +msgid "&Add number, keep the filename" +msgstr "" + +#: FRenameAll.class:100 +msgid "&Replace filename with number" +msgstr "" + +#: FRenameAll.class:111 +msgid "Number format:" +msgstr "" + +#: FRenameAll.class:116 +msgid "digits" +msgstr "" + +#: FRenameAll.class:123 +msgid "Options" +msgstr "" + +#: FRenameAll.class:129 +msgid "TextBox1" +msgstr "" + +#: FRenameAll.class:136 +msgid "Example:" +msgstr "" + +#~ msgid "sortiert nach Dateinamen" +#~ msgstr "Sorted by file names" + +#~ msgid "sortiert nach Aufnahmedatum und -zeit" +#~ msgstr "Sorted by picture date/time" + +#~ msgid "abbrechen" +#~ msgstr "Cancel" + +#~ msgid "Ansicht schließen" +#~ msgstr "Close current view" + +#~ msgid "beenden" +#~ msgstr "Quit" + +#~ msgid " Bilder" +#~ msgstr " pictures" + +#~ msgid "Bilderverzeichnis auswählen" +#~ msgstr "Choose picture folder" + +#~ msgid "Bild löschen" +#~ msgstr "Delete picture" + +#~ msgid "Bild umbenennen" +#~ msgstr "Rename picture" + +#~ msgid "(Bild verschieben: Rahmen mit der Maus ziehen)" +#~ msgstr "(Move picture: drag frame with mouse)" + +#~ msgid "Das Verzeichnis &1 enthält keine jp(e)g-Dateien." +#~ msgstr "The folder &1 doesn't contain .jp(e)g files." + +#~ msgid "Die Datei &1 wird gelöscht." +#~ msgstr "The file &1 will be deleted." + +#~ msgid "Dieser Dateiname existiert im aktuellen Verzeichnis schon!" +#~ msgstr "This filename already exists in the current directory!" + +#~ msgid "Für die Menüs mit der rechten Maustaste überall klicken!" +#~ msgstr "Just right-click everywhere to get the menus!" + +#~ msgid "Größeres Bild (Bild anklicken)" +#~ msgstr "View picture (click picture)" + +#~ msgid "Hauptmenü" +#~ msgstr "-" + +#~ msgid "Hilfe" +#~ msgstr "Help" + +#~ msgid "Label1" +#~ msgstr "-" + +#~ msgid "Leuchttisch" +#~ msgstr "Lighttable" + +#~ msgid "Nächstes Bild" +#~ msgstr "Next picture" + +#~ msgid "neuer Dateiname:" +#~ msgstr "New filename:" + +#~ msgid "Rahmenmenü" +#~ msgstr "-" + +#~ msgid "schließen" +#~ msgstr "Close" + +#~ msgid "sortiert nach Aufnahmedatum/-zeit" +#~ msgstr "Sorted by picture date/time" + +#~ msgid "Vollbildansicht" +#~ msgstr "Full Screen View" + +#~ msgid "Vorheriges Bild" +#~ msgstr "Previous picture" diff --git a/app/examples/Image/Lighttable/.lang/nl.po b/app/examples/Image/Lighttable/.lang/nl.po new file mode 100644 index 00000000..3c79a5c3 --- /dev/null +++ b/app/examples/Image/Lighttable/.lang/nl.po @@ -0,0 +1,327 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Lighttable 3.5.90\n" +"PO-Revision-Date: 2014-09-25 21:48 UTC\n" +"Last-Translator: Willy Raets \n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Lighttable" +msgstr "Lichttabel" + +#: .project:2 +msgid "A tool to sort photographs" +msgstr "Gereedschap om foto's mee te sorteren" + +#: FHelp.form:11 +msgid "Help" +msgstr "Help" + +#: FHelp.form:31 FInfo.form:17 +msgid "&Close" +msgstr "&Sluiten" + +#: FInfo.class:10 +msgid "There are no Exif informations in this file." +msgstr "Er is geen Exif informatie in dit bestand." + +#: FInfo.class:29 +msgid "&Less" +msgstr "&Minder" + +#: FInfo.form:11 +msgid "Picture Informations" +msgstr "Afbeeldingsinformatie" + +#: FInfo.form:24 +msgid "&More" +msgstr "&Meer" + +#: FMain.class:32 +msgid "Lighttable - " +msgstr "Lichttabel - " + +#: FMain.class:46 +msgid "Right-click for Main Menu" +msgstr "Rechts klikken voor Hoofdmenu" + +#: FMain.class:47 +msgid " pictures" +msgstr " afbeeldingen" + +#: FMain.class:48 +msgid "sorted alphabetically" +msgstr "alfabetisch gesorteerd" + +#: FMain.class:74 +msgid "Right-click on the background or on a frame for menus." +msgstr "Rechts klikken op achtergrond of frame voor menus." + +#: FMain.class:94 +msgid "Right-click for Picture Menu" +msgstr "Rechts klikken voor Afbeeldingsmenu" + +#: FMain.class:173 +msgid "&Rename all files..." +msgstr "&Hernoem alle bestanden..." + +#: FMain.class:268 +msgid "Loading picture..." +msgstr "Afbeelding laden..." + +#: FMain.class:343 +msgid "sorted chronologically" +msgstr "chronologisch gesorteerd" + +#: FMain.class:383 +msgid "The file &1 already exists in the current directory!" +msgstr "Het bestand &1 bestaat reeds in de huidige map!" + +#: FRenameAllWarning.form:17 FStart.form:26 FTime.form:51 +msgid "&Cancel" +msgstr "&Annuleer" + +#: FTime.form:45 +msgid "&OK" +msgstr "&OK" + +#: FMain.class:435 +msgid "The file &1 will be deleted." +msgstr "Het bestand &1 wordt verwijdert." + +#: FMain.class:727 +msgid "Loading of pictures is being aborted..." +msgstr "Laden van afbeeldingen wordt afgebroken..." + +#: FMain.class:778 +msgid "Files are being renamed..." +msgstr "Bestanden worden hernoemt..." + +#: FMain.class:807 +msgid "&1 files renamed" +msgstr "&1 bestanden hernoemt" + +#: FMain.class:823 +msgid "Setting time informations in all files..." +msgstr "Instellen van de tijd informatie in alle bestanden ..." + +#: FMain.form:44 +msgid "Main menu" +msgstr "Hoofdmenu" + +#: FMain.form:48 +msgid "Sorted &alphabetically" +msgstr "&Alfabetisch gesorteerd" + +#: FMain.form:55 +msgid "Sorted &chronologically" +msgstr "&Chronologisch gesorteerd" + +#: FMain.form:61 +msgid "&Slideshow" +msgstr "&Diavoorstelling" + +#: FMain.form:67 +msgid "Abort &Loading" +msgstr "Laden &Afbreken" + +#: FMain.form:73 +msgid "&Time correction..." +msgstr "&Tijd correctie..." + +#: FMain.form:79 +msgid "&Open folder..." +msgstr "&Open map..." + +#: FMain.form:85 +msgid "&Help" +msgstr "&Help" + +#: FMain.form:91 +msgid "&Quit" +msgstr "&Afsluiten" + +#: FMain.form:98 +msgid "Picture menu" +msgstr "Afbeeldingsmenu" + +#: FMain.form:102 +msgid "(Move picture: drag frame with mouse)" +msgstr "(Verplaats afbeelding: sleep frame met muis)" + +#: FMain.form:107 +msgid "&View picture (click on picture)" +msgstr "&Afbeelding weergeven (klik op afbeelding)" + +#: FMain.form:113 +msgid "&Full Screen View" +msgstr "&Volledig scherm weergave" + +#: FMain.form:119 +msgid "&Close view" +msgstr "&Sluit weergave" + +#: FMain.form:125 +msgid "&Next picture" +msgstr "&Volgende afbeelding" + +#: FMain.form:131 +msgid "&Previous picture" +msgstr "&Vorige afbeelding" + +#: FMain.form:137 +msgid "Picture &informations" +msgstr "Afbeeldings&informatie" + +#: FMain.form:143 +msgid "&Rename picture" +msgstr "&Hernoem afbeelding" + +#: FMain.form:149 +msgid "&Delete picture" +msgstr "&Verwijder afbeelding" + +#: FRename.class:43 +msgid "Old and new filename are identical." +msgstr "Oude en nieuwe bestandnaam zijn identiek." + +#: FRename.form:11 +msgid "Rename" +msgstr "Hernoem" + +#: FRename.form:17 +msgid "New filename:" +msgstr "Nieuwe bestandsnaam:" + +#: FRenameAll.class:11 +msgid "MyPicture.JPG" +msgstr "MijnAfbeelding.JPG" + +#: FRenameAll.form:22 +msgid "Rename all pictures" +msgstr "Hernoem alle afbeeldingen" + +#: FRenameAll.form:41 +msgid "1" +msgstr "-" + +#: FRenameAll.form:47 +msgid "Keep original filename as suffix" +msgstr "Bewaar originele bestandnaam as achtervoegsel" + +#: FRenameAll.form:53 +msgid "Number format" +msgstr "Nummerformaat" + +#: FRenameAll.form:58 +msgid "digits" +msgstr "cijfers" + +#: FRenameAll.form:63 +msgid "Prefix" +msgstr "Prefix" + +#: FRenameAll.form:68 +msgid "Start value" +msgstr "Aanvangswaarde" + +#: FRenameAll.form:88 +msgid "This function will rename all .jp(e)g files in the directory and add serial numbers to the filenames.
    The pictures will be handled in the order they are shown right now, in rows from left to right, rows from top to bottom." +msgstr "Deze functie hernoemt alle .jp(e)g bestanden in de map en voegt serieële nummers toe aan de bestandnamen.
    De afbeeldingen worden behandelt in de volgorde waarop nu weergegeven, in rijen van links naar rechts, rijen van boven naar beneden." + +#: FRenameAll.form:94 +msgid "Options" +msgstr "Opties" + +#: FRenameAll.form:99 +msgid "Example:" +msgstr "Voorbeeld:" + +#: FRenameAllWarning.form:12 +msgid "File Conflicts" +msgstr "Bestandsconflicten" + +#: FRenameAllWarning.form:24 +msgid "Continue &anyway" +msgstr "Tock &doorgaan" + +#: FRenameAllWarning.form:29 +msgid "The following files can't be renamed, because the target filenames already exist in the directory.
    If you continue, only the files without conflicts will be renamed.
    If you cancel, you can choose new filename options." +msgstr "De volgende bestanden kunnen niet hernoemt worden, omdat de doel bestandnamen reeds bestaan in de map.
    Indien je verder gaat worden enkel de bestand zonden conflicten hernoemt.
    Indien je annuleert, kun je nieuwe bestandnamen kiezen." + +#: FSlideshow.form:38 +msgid "Pause between pictures:" +msgstr "Pause tussen afbeeldingen:" + +#: FSlideshow.form:49 +msgid "sec" +msgstr "sec" + +#: FSlideshow.form:54 +msgid "Stop" +msgstr "Stop" + +#: FStart.class:54 +msgid "The folder &1 doesn't contain any jp(e)g files." +msgstr "De map &1 bevat geen jp(e)g bestanden." + +#: FStart.form:15 +msgid "Lighttable - Select picture folder" +msgstr "Lichttabel - Selecteer afbeeldingsmap" + +#: FStart.form:41 +msgid "New selection" +msgstr "Nieuwe selectie" + +#: FStart.form:51 +msgid "Last selections" +msgstr "Laatste selecties" + +#: FTime.class:18 +msgid "There is no time correction selected." +msgstr "Er is geen tijdscorrectie geselecteerd." + +#: FTime.form:18 +msgid "Time correction" +msgstr "Tijdscorrectie" + +#: FTime.form:39 +msgid "earlier" +msgstr "eerder" + +#: FTime.form:39 +msgid "later" +msgstr "-" + +#: FTime.form:59 +msgid "This function will correct all date/time informations in the EXIF section of all .jp(e)g files in the folder.
    A backup of the files will be made with file names like 'MyPicture.jpg_original'.
    If there are no EXIF date/time informations in a file, nothing will be done." +msgstr "Deze functie zal alle datum/tijd informatie in de EXIF sectie van alle .jp(e)g bestanden in de map corrigeren.
    Een backup van de bestanden zal worden gemaakt met bestandnamen zoals 'MijnAfbeelding.jpg_original'.
    Indien er geen EXIF datum/tijd informatie beschikbaar is in het bestand, wordt er niets gedaan." + +#: FTime.form:65 +msgid "Set the original time of all pictures to" +msgstr "Stel de oorspronkelijke tijd van alle afbeeldingen in" + +#: FTime.form:70 +msgid "day(s)" +msgstr "dag(en)" + +#: FTime.form:75 +msgid "hour(s)" +msgstr "U(u)r(en)" + +#: FTime.form:80 +msgid "minute(s)" +msgstr "minu(u)t(en)" + +#: MMain.module:12 +msgid "To run this program, exiftool must be installed." +msgstr "Op dit programma uit te voeren dient exiftool geïnstalleert te zijn." + +#: MMain.module:18 +msgid "To run this program, convert must be installed." +msgstr "Op dit programma uit te voeren dient convert geïnstalleert te zijn." + diff --git a/app/examples/Image/Lighttable/.lang/ru.po b/app/examples/Image/Lighttable/.lang/ru.po new file mode 100644 index 00000000..3acac0d5 --- /dev/null +++ b/app/examples/Image/Lighttable/.lang/ru.po @@ -0,0 +1,350 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Image/Lighttable/.project:28 +msgid "Lighttable" +msgstr "Световой планшет" + +#: app/examples/Image/Lighttable/.project:29 +msgid "A tool to sort photographs" +msgstr "Инструмент для сортировки фотографий" + +#: app/examples/Image/Lighttable/FStart.form:5 +msgid "Lighttable - Choose picture folder" +msgstr "Световой планшет - Выбрать директорию с изображениями" + +#: app/examples/Image/Lighttable/FStart.form:8 app/examples/Image/Lighttable/.src/FMain.class:435 app/examples/Image/Lighttable/.src/FRename.form:17 app/examples/Image/Lighttable/.src/FRenameAll.form:47 app/examples/Image/Lighttable/.src/FStart.form:9 app/examples/Image/Lighttable/.src/FTime.form:27 +msgid "&OK" +msgstr "ОК" + +#: app/examples/Image/Lighttable/FStart.form:13 app/examples/Image/Lighttable/.src/FMain.class:435 app/examples/Image/Lighttable/.src/FRename.form:22 app/examples/Image/Lighttable/.src/FRenameAll.form:52 app/examples/Image/Lighttable/.src/FRenameAllWarning.form:9 app/examples/Image/Lighttable/.src/FStart.form:14 app/examples/Image/Lighttable/.src/FTime.form:32 +msgid "&Cancel" +msgstr "Отмена" + +#: app/examples/Image/Lighttable/FStart.form:25 app/examples/Image/Lighttable/.src/FStart.form:26 +msgid "New selection" +msgstr "Новое выделение" + +#: app/examples/Image/Lighttable/FStart.form:33 app/examples/Image/Lighttable/.src/FStart.form:34 +msgid "Last selections" +msgstr "Последние" + +#: app/examples/Image/Lighttable/.src/FHelp.class:11 app/examples/Image/Lighttable/.src/FHelp.class:16 +msgid "help" +msgstr "справка" + +#: app/examples/Image/Lighttable/.src/FHelp.form:5 +msgid "Help" +msgstr "Справка" + +#: app/examples/Image/Lighttable/.src/FHelp.form:21 app/examples/Image/Lighttable/.src/FInfo.form:10 +msgid "&Close" +msgstr "Закрыть" + +#: app/examples/Image/Lighttable/.src/FInfo.class:10 +msgid "There are no Exif informations in this file." +msgstr "В этом файле нет информации Exif." + +#: app/examples/Image/Lighttable/.src/FInfo.class:25 app/examples/Image/Lighttable/.src/FInfo.class:34 app/examples/Image/Lighttable/.src/FInfo.form:16 +msgid "&More" +msgstr "Ещё" + +#: app/examples/Image/Lighttable/.src/FInfo.class:29 +msgid "&Less" +msgstr "Меньше" + +#: app/examples/Image/Lighttable/.src/FInfo.form:5 +msgid "Picture Informations" +msgstr "Информация об изображениях" + +#: app/examples/Image/Lighttable/.src/FMain.class:32 +msgid "Lighttable - " +msgstr "Световой планшет - " + +#: app/examples/Image/Lighttable/.src/FMain.class:46 +msgid "Right-click for Main Menu" +msgstr "Правый клик для главного меню" + +#: app/examples/Image/Lighttable/.src/FMain.class:47 app/examples/Image/Lighttable/.src/FMain.class:159 app/examples/Image/Lighttable/.src/FMain.class:449 +msgid " pictures" +msgstr " изображения" + +#: app/examples/Image/Lighttable/.src/FMain.class:48 app/examples/Image/Lighttable/.src/FMain.class:315 +msgid "sorted alphabetically" +msgstr "отсортировано по алфавиту" + +#: app/examples/Image/Lighttable/.src/FMain.class:74 +msgid "Right-click on the background or on a frame for menus." +msgstr "Щёлкнуть правой кнопкой мыши на фоне или на кадре для меню." + +#: app/examples/Image/Lighttable/.src/FMain.class:94 +msgid "Right-click for Picture Menu" +msgstr "Правый клик для меню изображения" + +#: app/examples/Image/Lighttable/.src/FMain.class:173 +msgid "&Rename all files..." +msgstr "Переименовать все файлы..." + +#: app/examples/Image/Lighttable/.src/FMain.class:268 +msgid "Loading picture..." +msgstr "Загрузка изображения..." + +#: app/examples/Image/Lighttable/.src/FMain.class:343 +msgid "sorted chronologically" +msgstr "отсортировано в хронологическом порядке" + +#: app/examples/Image/Lighttable/.src/FMain.class:383 +msgid "The file &1 already exists in the current directory!" +msgstr "Файл &1 уже существует в текущей директории!" + +#: app/examples/Image/Lighttable/.src/FMain.class:435 +msgid "The file &1 will be deleted." +msgstr "Файл &1 будет удалён." + +#: app/examples/Image/Lighttable/.src/FMain.class:727 +msgid "Loading of pictures is being aborted..." +msgstr "Загрузка изображений прерывается ..." + +#: app/examples/Image/Lighttable/.src/FMain.class:778 +msgid "Files are being renamed..." +msgstr "Файлы переименовываются..." + +#: app/examples/Image/Lighttable/.src/FMain.class:807 +msgid "&1 files renamed" +msgstr "&1 файлов переименовано" + +#: app/examples/Image/Lighttable/.src/FMain.class:823 +msgid "Setting time informations in all files..." +msgstr "Установка информации о времени во все файлы..." + +#: app/examples/Image/Lighttable/.src/FMain.form:9 +msgid "Main menu" +msgstr "Главное меню" + +#: app/examples/Image/Lighttable/.src/FMain.form:12 +msgid "Sorted &alphabetically" +msgstr "Отсортировано по алфавиту" + +#: app/examples/Image/Lighttable/.src/FMain.form:18 +msgid "Sorted &chronologically" +msgstr "Отсортировано в хронологическом порядке" + +#: app/examples/Image/Lighttable/.src/FMain.form:23 +msgid "&Slideshow" +msgstr "Слайд-шоу" + +#: app/examples/Image/Lighttable/.src/FMain.form:28 +msgid "Abort &Loading" +msgstr "Прервать загрузку" + +#: app/examples/Image/Lighttable/.src/FMain.form:33 +msgid "&Time correction..." +msgstr "Коррекция времени..." + +#: app/examples/Image/Lighttable/.src/FMain.form:38 +msgid "&Open folder..." +msgstr "Открыть директорию..." + +#: app/examples/Image/Lighttable/.src/FMain.form:43 +msgid "&Help" +msgstr "Справка" + +#: app/examples/Image/Lighttable/.src/FMain.form:48 +msgid "&Quit" +msgstr "Выход" + +#: app/examples/Image/Lighttable/.src/FMain.form:54 +msgid "Picture menu" +msgstr "Меню изображения" + +#: app/examples/Image/Lighttable/.src/FMain.form:57 +msgid "(Move picture: drag frame with mouse)" +msgstr "(Переместить картинку: перетащить кадр мышью)" + +#: app/examples/Image/Lighttable/.src/FMain.form:61 +msgid "&View picture (click on picture)" +msgstr "Просмотр изображения (нажать на изображение)" + +#: app/examples/Image/Lighttable/.src/FMain.form:66 +msgid "&Full Screen View" +msgstr "Полный экран" + +#: app/examples/Image/Lighttable/.src/FMain.form:71 +msgid "&Close view" +msgstr "Закрыть вид" + +#: app/examples/Image/Lighttable/.src/FMain.form:76 +msgid "&Next picture" +msgstr "Следующее изображение" + +#: app/examples/Image/Lighttable/.src/FMain.form:81 +msgid "&Previous picture" +msgstr "Предыдущее изображение" + +#: app/examples/Image/Lighttable/.src/FMain.form:86 +msgid "Picture &informations" +msgstr "Информация об изображениях" + +#: app/examples/Image/Lighttable/.src/FMain.form:91 +msgid "&Rename picture" +msgstr "Переименовать изображение" + +#: app/examples/Image/Lighttable/.src/FMain.form:96 +msgid "&Delete picture" +msgstr "Удалить изображение" + +#: app/examples/Image/Lighttable/.src/FRename.class:43 +msgid "Old and new filename are identical." +msgstr "Старое и новое имена файла идентичны." + +#: app/examples/Image/Lighttable/.src/FRename.form:5 +msgid "Rename" +msgstr "Переименовать" + +#: app/examples/Image/Lighttable/.src/FRename.form:10 +msgid "New filename:" +msgstr "Новое имя файла:" + +#: app/examples/Image/Lighttable/.src/FRenameAll.class:11 +msgid "MyPicture.JPG" +msgstr "MyPicture.JPG" + +#: app/examples/Image/Lighttable/.src/FRenameAll.form:5 +msgid "Rename all pictures" +msgstr "Переименовать все изображения" + +#: app/examples/Image/Lighttable/.src/FRenameAll.form:20 +msgid "1" +msgstr "1" + +#: app/examples/Image/Lighttable/.src/FRenameAll.form:25 +msgid "Keep original filename as suffix" +msgstr "Сохранить оригинальное имя файла как суффикс" + +#: app/examples/Image/Lighttable/.src/FRenameAll.form:30 +msgid "Number format" +msgstr "Числовой формат" + +#: app/examples/Image/Lighttable/.src/FRenameAll.form:34 +msgid "digits" +msgstr "цифры" + +#: app/examples/Image/Lighttable/.src/FRenameAll.form:38 +msgid "Prefix" +msgstr "Префикс" + +#: app/examples/Image/Lighttable/.src/FRenameAll.form:42 +msgid "Start value" +msgstr "Начальное значение" + +#: app/examples/Image/Lighttable/.src/FRenameAll.form:59 +msgid "This function will rename all .jp(e)g files in the directory and add serial numbers to the filenames.
    The pictures will be handled in the order they are shown right now, in rows from left to right, rows from top to bottom." +msgstr "Эта функция переименует все файлы .jp(e)g в директории и добавит серийные номера в имена файлов.
    Изображения будут обрабатываться в том порядке, в котором они отображаются прямо сейчас, в строках слева направо, рядами сверху вниз." + +#: app/examples/Image/Lighttable/.src/FRenameAll.form:64 +msgid "Options" +msgstr "Опции" + +#: app/examples/Image/Lighttable/.src/FRenameAll.form:68 +msgid "Example:" +msgstr "Пример:" + +#: app/examples/Image/Lighttable/.src/FRenameAllWarning.form:5 +msgid "File Conflicts" +msgstr "Конфликты файлов" + +#: app/examples/Image/Lighttable/.src/FRenameAllWarning.form:15 +msgid "Continue &anyway" +msgstr "Всё равно продолжить" + +#: app/examples/Image/Lighttable/.src/FRenameAllWarning.form:19 +msgid "The following files can't be renamed, because the target filenames already exist in the directory.
    If you continue, only the files without conflicts will be renamed.
    If you cancel, you can choose new filename options." +msgstr "Следующие файлы не могут быть переименованы, поскольку целевые имена файлов уже существуют в директории.
    Если вы продолжите, только файлы без конфликтов будут переименованы.
    При отмене вы можете выбрать новые параметры имени файла." + +#: app/examples/Image/Lighttable/.src/FSlideshow.form:24 +msgid "Pause between pictures:" +msgstr "Пауза между изобр-ми:" + +#: app/examples/Image/Lighttable/.src/FSlideshow.form:33 +msgid "sec" +msgstr "сек" + +#: app/examples/Image/Lighttable/.src/FSlideshow.form:37 +msgid "Stop" +msgstr "Стоп" + +#: app/examples/Image/Lighttable/.src/FStart.class:54 +msgid "The folder &1 doesn't contain any jp(e)g files." +msgstr "Директория &1 не содержит файлов jp(e)g." + +#: app/examples/Image/Lighttable/.src/FStart.form:5 +msgid "Lighttable - Select picture folder" +msgstr "Световой планшет - Выбрать директорию с изображениями" + +#: app/examples/Image/Lighttable/.src/FTime.class:18 +msgid "There is no time correction selected." +msgstr "Коррекция времени не выбрана." + +#: app/examples/Image/Lighttable/.src/FTime.form:5 +msgid "Time correction" +msgstr "Коррекция времени" + +#: app/examples/Image/Lighttable/.src/FTime.form:22 +msgid "earlier" +msgstr "ранее" + +#: app/examples/Image/Lighttable/.src/FTime.form:22 app/examples/Image/Lighttable/.src/FTime.form:23 +msgid "later" +msgstr "познее" + +#: app/examples/Image/Lighttable/.src/FTime.form:39 +msgid "This function will correct all date/time informations in the EXIF section of all .jp(e)g files in the folder.
    A backup of the files will be made with file names like 'MyPicture.jpg_original'.
    If there are no EXIF date/time informations in a file, nothing will be done." +msgstr "Эта функция исправит всю информацию о дате/времени в разделе EXIF всех файлов .jp(e)g в директории.
    Резервное копирование файлов будет сделано с именами файлов, такими как «MyPicture.jpg_original».
    Если в файле нет информации о дате/времени EXIF, то ничего не будет сделано." + +#: app/examples/Image/Lighttable/.src/FTime.form:44 +msgid "Set the original time of all pictures to" +msgstr "Установить оригинальное время всех изображений на" + +#: app/examples/Image/Lighttable/.src/FTime.form:48 +msgid "day(s)" +msgstr "дней" + +#: app/examples/Image/Lighttable/.src/FTime.form:52 +msgid "hour(s)" +msgstr "часов" + +#: app/examples/Image/Lighttable/.src/FTime.form:56 +msgid "minute(s)" +msgstr "минут" + +#: app/examples/Image/Lighttable/.src/MMain.module:12 +msgid "To run this program, exiftool must be installed." +msgstr "Для запуска этой программы необходимо установить exiftool." + +#: app/examples/Image/Lighttable/.src/MMain.module:18 +msgid "To run this program, convert must be installed." +msgstr "Для запуска этой программы необходимо установить convert." + diff --git a/app/examples/Image/Lighttable/.project b/app/examples/Image/Lighttable/.project new file mode 100644 index 00000000..c5bf14f3 --- /dev/null +++ b/app/examples/Image/Lighttable/.project @@ -0,0 +1,25 @@ +# Gambas Project File 3.0 +Title=Lighttable +Startup=MMain +Icon=lighttable.png +Version=3.6.2 +Component=gb.image +Component=gb.gui.qt +Component=gb.form +Component=gb.form.dialog +Component=gb.settings +Component=gb.gui.qt.webkit +Description="A tool to sort photographs" +Authors="Matti, with tips and some changes from Benoît" +TabSize=2 +Translate=1 +Language=en +SourcePath=/home/mathias/Basic +Maintainer=mathias +Address=mathias@mattitux +License=General Public Licence +Packager=1 +Systems=suse +Menus=suse:"Graphics/Photograph" +Categories=suse:"Graphics" +Groups=suse:"Productivity/Graphics/Viewers" diff --git a/app/examples/Image/Lighttable/.src/FHelp.class b/app/examples/Image/Lighttable/.src/FHelp.class new file mode 100644 index 00000000..38257efb --- /dev/null +++ b/app/examples/Image/Lighttable/.src/FHelp.class @@ -0,0 +1,28 @@ +' Gambas class file + +Public Sub _new() + + Dim sLanguage As String + Dim sPath As String + Dim sDest As String + + sLanguage = Left$(System.Language, 2) + sPath = "Help_" & sLanguage & ".html" + sDest = File.SetExt(Temp$("help"), "html") + Try Copy sPath To sDest + + If Error Then + sPath = "Help_en.html" + sDest = File.SetExt(Temp$("help"), "html") + Try Copy sPath To sDest + Endif + + WebViewHelp.Url = "file://" & sDest + +End + +Public Sub btnClose_Click() + + Me.Close + +End diff --git a/app/examples/Image/Lighttable/.src/FHelp.form b/app/examples/Image/Lighttable/.src/FHelp.form new file mode 100644 index 00000000..588decc0 --- /dev/null +++ b/app/examples/Image/Lighttable/.src/FHelp.form @@ -0,0 +1,26 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,84,73) + Text = ("Help") + Arrangement = Arrange.Vertical + { WebViewHelp WebView + MoveScaled(2,1,80,64) + Expand = True + } + { Panel1 HBox + MoveScaled(2,66,80,6) + Background = Color.TextBackground + Margin = True + { Panel2 Panel + MoveScaled(0,1,16,2) + Expand = True + } + { btnClose Button + MoveScaled(64,1,15,4) + Text = ("&Close") + Default = True + Cancel = True + } + } +} diff --git a/app/examples/Image/Lighttable/.src/FInfo.class b/app/examples/Image/Lighttable/.src/FInfo.class new file mode 100644 index 00000000..7d6c1424 --- /dev/null +++ b/app/examples/Image/Lighttable/.src/FInfo.class @@ -0,0 +1,37 @@ +' Gambas class file + +sCommon As String = "" +sDetail As String = "" + +Public Sub Form_Open() + + sCommon = FMain.GetExifInfoCommon(Me.Tag) + If sCommon = "" Then + Message.Info(("There are no Exif informations in this file.")) + Me.Close + Endif + txlExif.Text = sCommon + +End + +Public Sub btnClose_Click() + + Me.Close + +End + +Public Sub btnDetails_Click() + + If btnDetails.Text = ("&More") Then + If sDetail = "" Then sDetail = FMain.GetExifInfoAll(Me.Tag) + txlExif.Text = sDetail + txlExif.Adjust + btnDetails.Text = ("&Less") + Else + txlExif.Text = sCommon + txlExif.Width = 567 + txlExif.Height = 259 + btnDetails.Text = ("&More") + Endif + +End diff --git a/app/examples/Image/Lighttable/.src/FInfo.form b/app/examples/Image/Lighttable/.src/FInfo.form new file mode 100644 index 00000000..8cda99a1 --- /dev/null +++ b/app/examples/Image/Lighttable/.src/FInfo.form @@ -0,0 +1,25 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,84,50) + Text = ("Picture Informations") + Resizable = False + Utility = True + { btnClose Button + MoveScaled(66,44,15,4) + Text = ("&Close") + Default = True + Cancel = True + } + { btnDetails Button + MoveScaled(50,44,15,4) + Text = ("&More") + } + { ScrollView1 ScrollView + MoveScaled(1,2,82,41) + { txlExif TextLabel + MoveScaled(0,0,81,37) + Background = &HFFFCCC& + } + } +} diff --git a/app/examples/Image/Lighttable/.src/FMain.class b/app/examples/Image/Lighttable/.src/FMain.class new file mode 100644 index 00000000..a832e8c2 --- /dev/null +++ b/app/examples/Image/Lighttable/.src/FMain.class @@ -0,0 +1,903 @@ +' Gambas class file + +Private aFiles As String[] +Private aPFiles As New String[] +Private aThumbs As New String[] +Private aTime As New String[] +Private aSort As New String[] +Private aFrame As New Object[] +Private aPicture As New Object[] +Private aOri As New String[] +Private alblFile As New Object[] +Private alblTime As New Object[] +Private bStop As Boolean = False +Private hCurClose As Cursor +Private hCurHand As Cursor +Private hCurZoom As Cursor +Private iDelay As Integer +Private iPicCount As Integer +Private iPicRow As Integer +Private iRow As Integer +Private iOffset As Integer +Private iMark As Integer +Private iNr As Integer +Private sPath As String + +Public Sub Form_Open() + + sPath = Me.Tag + aFiles = MMain.GetFiles() + iPicCount = aFiles.Count + + Me.Caption = ("Lighttable - ") & sPath + Me.Move(Desktop.X, Desktop.Y, Desktop.Width, Desktop.Height) + + mnuSortA.Enabled = False + mnuSortT.Enabled = False + mnuDelete.Enabled = False + mnuTimecorr.Enabled = False + mnuSlide.Enabled = False + mnuOpen.Enabled = False + hCurClose = New Cursor(Picture.Load("close.png")) + hCurHand = New Cursor(Picture.Load("hand1.png")) + hCurZoom = New Cursor(Picture.Load("zoom-in.png")) + PicBox.Mouse = -2 + PicBox.Cursor = hCurZoom + Me.Tooltip = ("Right-click for Main Menu") + lblCount.Text = iPicCount & (" pictures") + lblSort.Text = ("sorted alphabetically") + aPFiles.Resize(iPicCount) + aThumbs.Resize(iPicCount) + aOri.Resize(iPicCount) + aTime.Resize(iPicCount) + aFrame.Resize(iPicCount + 1) + alblFile.Resize(iPicCount) + alblTime.Resize(iPicCount) + aPicture.Resize(iPicCount) + + Timer1.Trigger ' Finish this sub, so the user can do something + +End + +Public Sub Timer1_Timer() ' Load the pictures in the background + + Dim PicInfo As String + Dim i As Integer + Dim hImg As Image + + If iPicRow = 0 Then +' Print Me.Width + iPicRow = Int((Me.Width) / 200) + iOffset = (Me.Width + 30 - iPicRow * 200) / 2 + Endif + + lblStatus.Text = ("Right-click on the background or on a frame for menus.") + For i = 0 To iPicCount - 1 + aPFiles[i] = sPath & "/" & aFiles[i] + aThumbs[i] = Thumb(aFiles[i]) + Shell "exiftool -b -orientation -createdate '" & aPFiles[i] & "'" To PicInfo ' Get orientation and create time of the picture + aOri[i] = Left$(PicInfo, 1) + aTime[i] = Right$(PicInfo, 19) + + aFrame[i] = New Panel(ScrollView1) As "Framegroup" ' Make frame + With aFrame[i] + .Width = 140 + .Height = 175 + .Border = 3 + .Background = &CFCFCF& + .Tag = i + .Mouse = -2 + .Cursor = hCurHand + iRow = Int((i) / iPicRow) + .X = (i - (iPicRow * iRow)) * 200 + iOffset + .Y = iRow * 210 + 30 + .Tooltip = ("Right-click for Picture Menu") + End With + + alblFile[i] = New Label(aFrame[i]) As "Framegroup" ' Label filename + With alblFile[i] + .Width = 130 + .Height = 16 + .X = 5 + .Y = 140 + .Font.Grade = -1 + .Alignment = 3 + .Tag = i + .Text = aFiles[i] + If Len(.Text) > 22 Then + .Alignment = 1 + .ToolTip = .Text + Endif + End With + + alblTime[i] = New Label(aFrame[i]) As "Framegroup" ' Label Timestamp + With alblTime[i] + .Width = 130 + .Height = 16 + .X = 5 + .Y = 155 + .Font.Grade = -1 + .Alignment = 3 + .Tag = i + .Text = aTime[i] + End With + If i = 0 Then + iNr = 0 + Mark_Frame(iNr) + Endif + + aPicture[i] = New PictureBox(aFrame[i]) As "Thumbnail" ' Thumbnail + With aPicture[i] + .Mouse = -2 + .Cursor = hCurZoom + .Tag = i + .Alignment = 3 + .X = 5 + .Y = 5 + .Width = 128 + .Height = 128 + + Try hImg = Image.Load(aThumbs[i]) ' Image, because it might have to be rotated + If Error Then ' If thumbnail doesn't exist, it has to be created + Shell "convert -define jpeg:size=150x150 '" & aPFiles[i] & "' -auto-orient -thumbnail 128x128 '" & aThumbs[i] & "'" Wait + hImg = Image.Load(aThumbs[i]) + Endif + + If aOri[i] > "1" And hImg.Width > hImg.Height Then ' If a system's thumbnail isn't rotated correctly + If aOri[i] = 6 Then + hImg = hImg.Rotate(Rad(-90)) + Else If aOri[i] = 8 Then + hImg = hImg.Rotate(Rad(90)) + Endif + Endif + .Picture = hImg.Picture + End With + + ProgressBar1.Value = (i + 1) / iPicCount + If bStop = True Then 'if loading is stopped + iPicCount = i + 1 + lblCount.Text = iPicCount & (" pictures") + Break + Endif + Wait 0.01 + Next + + iRow = Int(iPicCount / iPicRow) + 1 + panEmpty.Y = iRow * 210 ' Insert an empty panel to get some space at the bottom + ProgressBar1.Visible = False + lblStatus.Text = "" + mnuSortA.Enabled = False + mnuSortT.Enabled = True + mnuDelete.Enabled = True + mnuTimecorr.Enabled = True + mnu_StopLoad_RenameAll.Caption = ("&Rename all files...") + mnu_StopLoad_RenameAll.Picture = Stock["16/save-as"] + mnu_StopLoad_RenameAll.Shortcut = "Ctrl+N" + mnuSlide.Enabled = True + mnuOpen.Enabled = True + bStop = True + Me.Tag = "alpha" + Me.Tooltip = "" + For i = 0 To iPicCount - 1 + aFrame[i].Tooltip = "" + Next + +End + +Public Sub Framegroup_MouseDown() ' a frame is clicked + + iNr = Last.Tag + Mark_Frame(iNr) + If PicBox.Visible = True And PicBox.Tag <> aFiles[iNr] Then + If PicBox.Cursor = hCurClose Then + mnuFullscreen_Click + Else + mnuView_Click + Endif + Endif + +End + +Public Sub Framegroup_MouseMove() ' Move a frame + + iNr = Last.Tag + PicBox.Visible = False + FInfo.Close + aFrame[iNr].X += Mouse.X - Mouse.StartX + aFrame[iNr].Y += Mouse.Y - Mouse.StartY + If aFrame[iNr].Y < ScrollView1.ScrollY Then + ScrollView1.Scroll(ScrollView1.ScrollX, ScrollView1.ScrollY - 10) + Endif + If aFrame[iNr].Y > Me.Height + ScrollView1.ScrollY - 175 Then + ScrollView1.Scroll(ScrollView1.ScrollX, ScrollView1.ScrollY + 10) + Endif + Mark_Frame(iNr) + +End + +Public Sub Framegroup_Menu() ' Context menu of the frames + + iNr = Last.Tag + FInfo.Close + mnuDrag.Enabled = True + mnuView.Enabled = True + mnuESC.Enabled = False + mnuFramegroup.Popup + +End + +Public Sub Thumbnail_MouseDown() ' a thumbnail is clicked + + iNr = Last.Tag + FInfo.Close + Framegroup_MouseDown + If Mouse.Left Then ' view picture + If PicBox.Visible = False Then mnuView_Click + Else ' Show menu + mnuFramegroup.Popup + Endif + +End + +Public Sub mnuView_Click() ' Show picture + + Dim iFormat As Single + + Load_Picture + iFormat = aPicture[iNr].Picture.Width / aPicture[iNr].Picture.Height + If iFormat > 1 Then ' Landscape + PicBox.Width = 800 + PicBox.Height = 800 / iFormat + Else ' Portrait + PicBox.Height = 800 + PicBox.Width = 800 * iFormat + Endif + PicBox.X = (Me.Width - PicBox.Width) / 2 ' center picture + PicBox.Y = (Me.Height - PicBox.Height) / 2 + mnuView.Enabled = False + mnuESC.Enabled = True + PicBox.Visible = True + PicBox.SetFocus + +End + +Public Sub Load_Picture() + + Dim hImg As Image + + lblStatus.Text = ("Loading picture...") + Wait + hImg = Image.Load(aPFiles[iNr]) ' Image, because it might have to be rotated + If aOri[iNr] = 6 Then + hImg = hImg.Rotate(Rad(-90)) + Else If aOri[iNr] = 8 Then + hImg = hImg.Rotate(Rad(90)) + Endif + PicBox.Picture = hImg.Picture + PicBox.Tag = aFiles[iNr] + lblStatus.Text = "" + Wait + +End + +Public Sub Form_Menu() ' Main context menu + + PicBox.Visible = False + FInfo.Close + mnuMain.Popup + +End + +Public Sub mnuSortA_Click() ' Sort pictures alphabetically by file names + + Dim i, pos As Integer + Dim n As String + + PicBox.Visible = False + FInfo.Close + aSort.Resize(iPicCount) + For i = 0 To iPicCount - 1 + aSort[i] = aFiles[i] & "/" & i ' Workaround. A 2-dim array would be correct, but I can't sort it... + Next + aSort.Sort(1) + + For i = 0 To iPicCount - 1 + pos = InStr(aSort[i], "/") + n = Right$(aSort[i], Len(aSort[i]) - pos) + iRow = Int((i) / iPicRow) + aFrame[n].X = (i - (iPicRow * iRow)) * 200 + iOffset + aFrame[n].Y = iRow * 210 + 30 + Next + mnuSortT.Checked = False + mnuSortT.Enabled = True + mnuSortA.Checked = True + mnuSortA.Enabled = False + lblSort.Text = ("sorted alphabetically") + Me.Tag = "alpha" + Show_marked_frame + +End + +Public Sub mnuSortT_Click() ' Sort pictures chronologically by timestamp + + Dim i, pos As Integer + Dim n As String + + aSort.Resize(iPicCount) + For i = 0 To iPicCount - 1 + aSort[i] = aTime[i] & "/" & i ' Workaround. A 2-dim array would be correct, but I can't sort it... + Next + aSort.Sort() + + For i = 0 To iPicCount - 1 + pos = InStr(aSort[i], "/") + n = Right$(aSort[i], Len(aSort[i]) - pos) + iRow = Int((i) / iPicRow) + aFrame[n].X = (i - (iPicRow * iRow)) * 200 + iOffset + aFrame[n].Y = iRow * 210 + 30 + Next + mnuSortA.Checked = False + mnuSortA.Enabled = True + mnuSortT.Checked = True + mnuSortT.Enabled = False + lblSort.Text = ("sorted chronologically") + Me.Tag = "chron" + Show_marked_frame + +End + +Public Sub Show_marked_frame() + + If iMark > -1 Then ' Only if a picture is selected + If ScrollView1.ScrollY > (aFrame[iMark].Y - 30) Then ' If necessary, scroll up + ScrollView1.Scroll(0, (aFrame[iMark].Y - 30)) + Return + Endif + If ScrollView1.ScrollY + Me.Height < aFrame[iMark].Y + 210 Then ' If necessary, scroll down + ScrollView1.Scroll(0, aFrame[iMark].Y + 230 - Me.Height) + Endif + Endif + +End + +Public Sub mnuRename_Click() ' Show the form FRename (the renaming itself is done in the function FileRename) + + If iMark = -1 Then Return ' Only if a picture is selected + PicBox.Visible = False + FInfo.Close + mnuESC.Enabled = False + mnuView.Enabled = True + mnuFullscreen.Enabled = True + PicBox.Cursor = hCurZoom + FRename.Tag = aFiles[iNr] + FRename.ShowModal + +End + +Public Function TestRenameOne(sOldname As String, sNewname As String) As Boolean + + Dim n As Integer + + For n = 0 To iPicCount - 1 ' Check if new name already exists + If aFiles[n] = sNewname Then + Message.Error(Subst(("The file &1 already exists in the current directory!"), sNewname)) + Return False ' Give error back to FRename + Endif + Next + Return True + +End + +Public Function FileRename(sOldname As String, sNewname As String) As Boolean ' Rename a file + + Dim sThumbname As String + + Try Move sPath & "/" & sOldname To sPath & "/" & sNewname ' Rename file + If Error Then Return False + aFiles[iNr] = sNewname ' Rename all entries in arrays and labels + alblFile[iNr].Text = sNewname + alblFile[iNr].ToolTip = "" + alblFile[iNr].Alignment = 3 + If Len(sNewname) > 20 Then + alblFile[iNr].Alignment = 1 + alblFile[iNr].ToolTip = sNewname + Endif + Wait + aPFiles[iNr] = sPath & "/" & sNewname + sThumbname = Thumb(aFiles[iNr]) ' Rename thumbnail + Try Move aThumbs[iNr] To sThumbname + If Error Then + Kill sThumbname + Wait + Move aThumbs[iNr] To sThumbname + Endif + aThumbs[iNr] = sThumbname + Return True ' give ok back + +End + +Public Sub mnuDelete_Click() ' Delete a picture + + Dim i, x, y As Integer + Dim sPicState As String + + If iMark = -1 Then Return ' Only if a picture is selected + FInfo.Close + If PicBox.Visible = True Then ' Remember the state of PictureBox + If PicBox.Cursor = hCurZoom Then + sPicState = "on" + Else + sPicState = "full" + Endif + Else + sPicState = "off" + Endif + If Message.Warning(Subst(("The file &1 will be deleted."), aFiles[iNr]), ("&OK"), ("&Cancel")) = 2 Then Return ' If user aborts, cancel + + Try Shell "kioclient move '" & aPFiles[iNr] & "' trash:/" ' Move file to trash - kioclient preferred, because it writes the restore infos + If Error Then ' Otherwise move directly to trash + Move aPFiles[iNr] To "trash:/" + Endif + Try Shell "kioclient move '" & aThumbs[iNr] & "' trash:/" ' Move Thumbnail to trash + If Error Then + Move aThumbs[iNr] To "trash:/" + Endif + + x = aFrame[iNr].X ' Remember position of deleted frame + y = aFrame[iNr].Y + iPicCount = iPicCount - 1 + lblCount.Text = iPicCount & (" pictures") + + aFrame[iNr].Delete ' Remove picture + aFiles.Remove(iNr) ' Delete all array-elements, arrays are 1 smaller + aPFiles.Remove(iNr) + aThumbs.Remove(iNr) + aTime.Remove(iNr) + aFrame.Remove(iNr) + aPicture.Remove(iNr) + alblFile.Remove(iNr) + alblTime.Remove(iNr) + aOri.Remove(iNr) + + For i = iNr To iPicCount - 1 ' Set the tags of all next frames in the arrays -1 + aFrame[i].Tag = i + aPicture[i].Tag = i + alblFile[i].Tag = i + alblTime[i].Tag = i + Next + + If FindNextFrame(x, y) = False Then + iMark = -1 + PicBox.Visible = False + mnuFullscreen.Enabled = True + Return + Endif + mnuView.Enabled = True + mnuFullscreen.Enabled = True + Mark_Frame(iNr) + Show_marked_frame + Select Case sPicState ' Show PictureBox again with next picture + Case "on" + mnuView_Click + Case "full" + mnuFullscreen_Click + End Select +End + +Public Sub mnuInfo_Click() ' Show picture infos + + Dim posx, posy As Integer + + If iMark = -1 Then Return + posx = aFrame[iNr].X + posy = aFrame[iNr].Y - ScrollView1.ScrollY + If posx < Me.Width - 740 Then ' Calculate position for FInfo + FInfo.X = posx + 145 + Else + FInfo.X = posx - 595 + Endif + If posy < Me.Height - 350 Then + FInfo.Y = posy + 24 + Else + FInfo.Y = posy - 180 + Endif + FInfo.Tag = iNr + FInfo.Show + +End + +Public Sub GetExifInfoCommon(iNumber As Integer) As String + + Dim sExif As String + + Shell "exiftool -common -h '" & aPFiles[iNumber] & "'" To sExif + Return sExif + +End + +Public Sub GetExifInfoAll(iNumber As Integer) As String + + Dim sExif As String + + Shell "exiftool -a -h '" & aPFiles[iNumber] & "'" To sExif + Return sExif + +End + +Public Sub mnuHelp_Click() ' Show help + + FHelp.X = (Me.Width - FHelp.Width) / 2 + FHelp.Show + +End + +Public Sub PicBox_MouseDown() ' Click on PictureBox + + If Mouse.Left = True Then + If PicBox.Cursor = hCurZoom Then ' if smaller picture + mnuFullscreen_Click + Else ' if full screen + BackToSmallView + Endif + Else ' right-klick + mnuDrag.Enabled = False + mnuFramegroup.Popup + Endif + +End + +Public Sub mnuFullscreen_Click() ' Full screen view (we ignore that a picture might be smaller) + + Dim iFormat As Single + + If PicBox.Visible = False Or PicBox.Tag <> aFiles[iNr] Then + Load_Picture + Endif + iFormat = aPicture[iNr].Picture.Width / aPicture[iNr].Picture.Height + PicBox.Y = 0 + PicBox.Height = Me.Height + PicBox.Width = Me.Height * iFormat + If PicBox.Width > Me.Width Then ' If picture format is 16:9 or wider + PicBox.Width = Me.Width + PicBox.Height = Me.Width / iFormat + Endif + PicBox.X = (Me.Width - PicBox.Width) / 2 + PicBox.Visible = True + mnuFullscreen.Enabled = False + mnuView.Enabled = False + mnuESC.Enabled = True + PicBox.Cursor = hCurClose + PicBox.SetFocus + +End + +Public Sub BackToSmallView() ' Close FullScreen view + + Dim w, h As Integer + + w = PicBox.Width + h = PicBox.Height + If w / h > 1 Then + PicBox.Width = 800 + PicBox.Height = 800 / w * h + Else + PicBox.Width = 800 * w / h + PicBox.Height = 800 + Endif + PicBox.X = (Me.Width - PicBox.Width) / 2 ' centered + PicBox.y = (Me.Height - PicBox.Height) / 2 + PicBox.Cursor = hCurZoom + mnuView.Enabled = False + mnuFullscreen.Enabled = True + mnuESC.Enabled = True + +End + +Public Sub mnuESC_Click() ' ESC is pressed + + If PicBox.Visible = True Then + If PicBox.Cursor = hCurClose Then ' we have full screen + BackToSmallView + Else ' Close small view + PicBox.Visible = False + mnuView.Enabled = True + mnuFullscreen.Enabled = True + mnuESC.Enabled = False + aFrame[iNr].SetFocus + Endif + Endif + +End + +Public Sub mnuNext_Click() ' Move to next picture + + If iMark = -1 Then Return ' Only if a picture is selected + If FindNextFrame(aFrame[iNr].X, aFrame[iNr].Y) = False Then Return ' if no next picture is found, exit + Mark_Frame(iNr) + Show_marked_frame + If PicBox.Visible = True Then + If PicBox.Cursor = hCurClose Then ' if fullscreen + mnuFullscreen_Click + Else + mnuView_Click + Endif + Endif + +End + +Public Function FindNextFrame(x As Integer, y As Integer) As Boolean + + Dim i As Integer + + Do + x = x + 70 + If x > (ScrollView1.ScrollWidth - 150) Then ' if we are at the end of a line, go to next line + x = 0 + y = y + 210 + Endif + If y > panEmpty.Y + 200 Then Break ' if we are in last line, end + For i = 0 To iPicCount - 1 + If aFrame[i].X > x And aFrame[i].X < x + 140 And aFrame[i].Y > y - 100 And aFrame[i].Y < y + 100 Then + iNr = i + Return True ' found + Endif + Next + Loop + Return False 'none found + +End + +Public Sub mnuPrevious_Click() ' Move to previous picture + + Dim x, y, i As Integer + + If iMark = -1 Then Return ' Only if a picture is selected + x = aFrame[iNr].X + y = aFrame[iNr].Y + Do + x = x - 70 + If x < 70 Then ' if we are at the beginning of a line, go to end of previous line + x = Me.Width + y = y - 210 + Endif + If y < 0 Then Break ' if we are at top, end + For i = 0 To iPicCount - 1 + If aFrame[i].X < x And aFrame[i].X > x - 140 And aFrame[i].Y > y - 100 And aFrame[i].Y < y + 100 Then + iNr = i + Mark_Frame(iNr) + Show_marked_frame + If PicBox.Visible = True Then + If PicBox.Cursor = hCurClose Then 'fullscreen + mnuFullscreen_Click + Else + mnuView_Click + Endif + Endif + Goto found + Endif + Next + Loop + found: + +End + +Public Sub Mark_Frame(iNumber As Integer) 'Mark selected frame + + If iMark > -1 Then + aFrame[iMark].Background = &CFCFCF& + alblFile[iMark].Foreground = &000000& + alblTime[iMark].Foreground = &000000& + Endif + aFrame[iNumber].Background = &0000FF& + alblFile[iNumber].Foreground = &FFFFFF& + alblTime[iNumber].Foreground = &FFFFFF& + aFrame[iNumber].Raise + iMark = iNumber + If FInfo.Visible = True Then + FInfo.Close + mnuInfo_Click + Endif + +End + +Public Function Thumb(sFilename As String) As String ' Get the file name for thumbnail using md5sum + + Dim sThumb As String + Dim i As Integer + + sFilename = sPath & "/" & sFilename + sFilename = Replace$(sFilename, " ", "%20") ' we have to replace spaces and special characters + For i = 123 To 255 + sFilename = Replace$(sFilename, Chr(i), "%" & Hex$(i)) + Next + sFilename = "file://" & sFilename + Shell "echo -n '" & sFilename & "' | md5sum" To sThumb + sThumb = Left$(sThumb, 32) + sThumb = User.Home & "/.thumbnails/normal/" & sThumb & ".png" + Return sThumb + +End + +Public Sub mnu_StopLoad_RenameAll_Click() 'Abort Loading or Rename all + + PicBox.Visible = False + FInfo.Close + + If bStop = False Then ' abort + lblStatus.Text = ("Loading of pictures is being aborted...") + Wait + bStop = True + Return + Endif + FRenameAll.ShowModal ' rename + +End + +Public Function TestRenameAll(sPref As String, sFmt As String, iStart As Integer, bKeep As Boolean) As String ' Check if target filenames already exist + + Dim x, y, i, n As Integer + Dim sResult As String = "" + Dim aOldname As New String[iPicCount] + Dim aNewname As New String[iPicCount] + + x = -60 + y = 100 + i = iStart + n = 0 + Do While FindNextFrame(x, y) + aOldname[n] = aFiles[iNr] + aNewname[n] = sPref & Format(i, sFmt) + If bKeep = True Then ' keep old filename + aNewname[n] = aNewname[n] & "_" & aOldname[n] + Else ' just number + aNewname[n] = aNewname[n] & ".jpg" + Endif + x = aFrame[iNr].X + y = aFrame[iNr].Y + n = n + 1 + i = i + 1 + Loop + Mark_Frame(iNr) + Show_marked_frame + For i = 0 To iPicCount - 1 ' Check if there would be a conflict with existing filenames + For n = i + 1 To iPicCount - 1 + If aNewname[i] = aOldname[n] Then + sResult = sResult & aOldname[i] & " --> " & aOldname[n] & "\n" + Endif + Next + Next + Return sResult + +End + +Public Function RenameAll(sPref As String, sFmt As String, iStart As Integer, bKeep As Boolean) As Boolean ' Rename all files + + Dim x, y, n, i As Integer + Dim oldname, newname As String + + lblStatus.Text = ("Files are being renamed...") + Wait + x = -60 + y = 100 + n = 0 + i = iStart + + Do While FindNextFrame(x, y) + oldname = aFiles[iNr] + newname = sPref & Format(i, sFmt) + If bKeep = True Then ' keep old filename + newname = newname & "_" & oldname + Else ' just number + newname = newname & ".jpg" + Endif + If FileRename(oldname, newname) = False Then + n = n - 1 + Endif + x = aFrame[iNr].X + y = aFrame[iNr].Y + n = n + 1 + i = i + 1 + Wait + Loop + + Mark_Frame(iNr) + Show_marked_frame + lblStatus.Text = "" + Dec Application.Busy + Message.Info(Subst(("&1 files renamed"), n)) + +End + +Public Sub mnuTimecorr_Click() ' Time correction + + FTime.Tag = sPath + FTime.ShowModal + +End + +Public Sub TimeCorrection(idays As Integer, ihours As Integer, iminutes As Integer, PlusMinus As String) + + Dim i As Integer + Dim Hrs As Single + + lblStatus.Text = ("Setting time informations in all files...") + Wait + If PlusMinus = "0" Then + PlusMinus = "-" + Else + PlusMinus = "+" + Endif + Hrs = idays * 24 + ihours + iminutes / 60 + + Shell "exiftool -alldates" & PlusMinus & "=" & Hrs & " '" & sPath & "'" Wait + For i = 0 To iPicCount - 1 + Shell "exiftool -b -createdate '" & aPFiles[i] & "'" To alblTime[i].Text + Next + lblStatus.Text = "" + +End + +Public Sub mnuSlide_Click() ' Slide Show + + Dim i, iLast As Integer + + iLast = iNr + FSlideshow.Show + + Do + FSlideshow.PictureLoad(aPFiles[iNr], aOri[iNr]) + FSlideshow.Title = aFiles[iNr] + i = 1 + Do + If i > iDelay Then Break + If FSlideshow.Visible = False Or FSlideshow.Minimized = True Then Break + Wait 1 + Inc i + Loop + + If FSlideshow.Visible = False Or FSlideshow.Minimized = True Then Break + mnuNext_Click + If iNr = iLast Then Break + iLast = iNr + Loop + + FSlideshow.Close + Settings["SlideShow/Delay"] = iDelay + +End + +Public Function GetDelay(iSec As Integer) As Boolean + + iDelay = iSec + +End + +Public Sub mnuOpen_Click() ' Open another folder + + MMain.Main + Me.Close + +End + +Public Sub mnuQuit_Click() ' Quit + + Me.Close + +End + +Public Sub Form_Close() + + If bStop = False Then ' if loading of pictures is still in progress + bStop = True + Stop Event + Wait + Timer2.Enabled = True + Endif + +End + +Public Sub Timer2_Timer() + + Me.Close + +End diff --git a/app/examples/Image/Lighttable/.src/FMain.form b/app/examples/Image/Lighttable/.src/FMain.form new file mode 100644 index 00000000..41224a39 --- /dev/null +++ b/app/examples/Image/Lighttable/.src/FMain.form @@ -0,0 +1,162 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,116,65) + Background = Color.Background + Icon = Picture["LTicon.png"] + Arrangement = Arrange.Vertical + { mnuMain Menu + Text = ("Main menu") + Visible = False + { mnuSortA Menu + Text = ("Sorted &alphabetically") + Picture = Picture["icon:/16/sort-ascent"] + Checked = True + Shortcut = "Ctrl+A" + } + { mnuSortT Menu + Text = ("Sorted &chronologically") + Picture = Picture["icon:/16/clock"] + Shortcut = "Ctrl+C" + } + { mnuSlide Menu + Text = ("&Slideshow") + Picture = Picture["icon:/16/video"] + Shortcut = "Ctrl+S" + } + { mnu_StopLoad_RenameAll Menu + Text = ("Abort &Loading") + Picture = Picture["icon:/16/cancel"] + Shortcut = "End" + } + { mnuTimecorr Menu + Text = ("&Time correction...") + Picture = Picture["icon:/16/camera"] + Shortcut = "Ctrl+T" + } + { mnuOpen Menu + Text = ("&Open folder...") + Picture = Picture["icon:/16/open"] + Shortcut = "Ctrl+O" + } + { mnuHelp Menu + Text = ("&Help") + Picture = Picture["help-contents.png"] + Shortcut = "F1" + } + { mnuQuit Menu + Text = ("&Quit") + Picture = Picture["icon:/16/quit"] + Shortcut = "Ctrl+End" + } + } + { mnuFramegroup Menu + Text = ("Picture menu") + Visible = False + { mnuDrag Menu + Text = ("(Move picture: drag frame with mouse)") + Picture = Picture["move.png"] + } + { mnuView Menu + Text = ("&View picture (click on picture)") + Picture = Picture["icon:/16/zoom-in"] + Shortcut = "Enter" + } + { mnuFullscreen Menu + Text = ("&Full Screen View") + Picture = Picture["icon:/16/fullscreen"] + Shortcut = "Alt+Enter" + } + { mnuESC Menu + Text = ("&Close view") + Picture = Picture["icon:/16/close"] + Shortcut = "Esc" + } + { mnuNext Menu + Text = ("&Next picture") + Picture = Picture["icon:/16/next"] + Shortcut = "Right" + } + { mnuPrevious Menu + Text = ("&Previous picture") + Picture = Picture["icon:/16/previous"] + Shortcut = "Left" + } + { mnuInfo Menu + Text = ("Picture &informations") + Picture = Picture["icon:/16/info"] + Shortcut = "I" + } + { mnuRename Menu + Text = ("&Rename picture") + Picture = Picture["icon:/16/save-as"] + Shortcut = "N" + } + { mnuDelete Menu + Text = ("&Delete picture") + Picture = Picture["icon:/16/delete"] + Shortcut = "Del" + } + } + { ScrollView1 ScrollView + MoveScaled(27,13,41,32) + Background = Color.TextBackground + Expand = True + Border = False + { panEmpty Panel + MoveScaled(4,10,16,16) + } + } + { Timer1 #Timer + #MoveScaled(105,22) + Delay = 10 + } + { Timer2 #Timer + #MoveScaled(105,30) + Delay = 100 + } + { Separator1 Separator + MoveScaled(27,56,14,0) + } + { StatusBar Panel + MoveScaled(2,60,99,4) + Arrangement = Arrange.Horizontal + { lblCount Label + MoveScaled(1,0.5714,13,3) + Font = Font["-1"] + Alignment = Align.Center + Border = Border.Sunken + } + { lblSort Label + MoveScaled(15,0.5714,29,3) + Font = Font["-1"] + Alignment = Align.Center + Border = Border.Sunken + } + { Panel1 Panel + MoveScaled(45,0,1,4) + } + { lblStatus Label + MoveScaled(47,0,27,4) + Font = Font["-1"] + Expand = True + Alignment = Align.Center + } + { Panel2 Panel + MoveScaled(75,0,22,4) + Arrangement = Arrange.Fill + Margin = True + Padding = 4 + { ProgressBar1 ProgressBar + MoveScaled(0,0,20,3) + } + } + } + { PicBox PictureBox + MoveScaled(7,37,9,9) + Visible = False + Ignore = True + Stretch = True + Border = Border.Etched + } +} diff --git a/app/examples/Image/Lighttable/.src/FRename.class b/app/examples/Image/Lighttable/.src/FRename.class new file mode 100644 index 00000000..05d57c47 --- /dev/null +++ b/app/examples/Image/Lighttable/.src/FRename.class @@ -0,0 +1,58 @@ +' Gambas class file + +Private sOldName As String + +Public Sub Form_Open() + + txtRename.Text = Me.Tag + sOldName = Me.Tag + MarkFilename + +End + +Public Sub MarkFilename() + + Dim lentext, posp As Integer + Dim right3 As String + + right3 = Right$(txtRename.Text, 3) + lentext = Len(txtRename.Text) + If right3 = "jpg" Or right3 = "JPG" Then + posp = lentext - 4 + Else + posp = lentext - 5 + Endif + Me.SetFocus + txtRename.SetFocus + txtRename.Select(0, posp) + +End + +Public Sub btnCancel_Click() + + Me.Close + +End + +Public Sub btnOK_Click() + + Dim sNewName As String + + sNewName = txtRename.Text + If sOldName = sNewName Then + Message.Error(("Old and new filename are identical.")) + MarkFilename + Return + Endif + If FMain.TestRenameOne(sOldName, sNewName) = False Then ' if name already exists, cancel + txtRename.Text = sOldName + MarkFilename + Return + Endif + FMain.FileRename(sOldName, sNewName) + If FMain.Tag = "alpha" Then ' if sorted alphabetically, sort anew + FMain.mnuSortA_Click + Endif + Me.Close + +End diff --git a/app/examples/Image/Lighttable/.src/FRename.form b/app/examples/Image/Lighttable/.src/FRename.form new file mode 100644 index 00000000..58fa4574 --- /dev/null +++ b/app/examples/Image/Lighttable/.src/FRename.form @@ -0,0 +1,25 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,51,15) + Text = ("Rename") + Resizable = False + SkipTaskbar = True + { lblRename Label + MoveScaled(2,1,23,3) + Text = ("New filename:") + } + { txtRename TextBox + MoveScaled(1,4,48,4) + } + { btnOK Button + MoveScaled(34,10,15,4) + Text = ("&OK") + Default = True + } + { btnCancel Button + MoveScaled(18,10,15,4) + Text = ("&Cancel") + Cancel = True + } +} diff --git a/app/examples/Image/Lighttable/.src/FRenameAll.class b/app/examples/Image/Lighttable/.src/FRenameAll.class new file mode 100644 index 00000000..b6a78ecf --- /dev/null +++ b/app/examples/Image/Lighttable/.src/FRenameAll.class @@ -0,0 +1,101 @@ +' Gambas class file + +Private sExpl As String +Private sDigits As String = "000" +Private sOldStart As String = "1" +Private iStartVal As Integer = 1 + +Public Sub Form_Open() + + FMain.Enabled = False + sExpl = ("MyPicture.JPG") + SpinBox1.Value = 3 + RenewExample + +End + +Public Sub txtPre_Change() + + RenewExample + +End + +Public Sub SpinBox1_Change() + + If SpinBox1.Value < Len(txtStart.Text) Then + SpinBox1.Value = Len(txtStart.Text) + Return + Endif + sDigits = String$(SpinBox1.Value, "0") + RenewExample + +End + +Public Sub CheckFile_Click() + + RenewExample + +End + +Public Sub txtStart_Change() + + Dim sNewStart As String + Dim iLenStart As Integer + + sNewStart = txtStart.Text + If Not IsDigit(sNewStart) Then + txtStart.Text = sOldStart + Return + Endif + + iLenStart = Len(sNewStart) + iStartVal = Val(sNewStart) + If iLenStart > SpinBox1.Value Then SpinBox1.Value = iLenStart + sOldStart = sNewStart + RenewExample + +End + +Public Sub RenewExample() + + lblExample.Text = txtPre.Text & Format$(iStartVal, sDigits) + If CheckFile.Value = True Then + lblExample.Text = lblExample.Text & "_" & sExpl + Else + lblExample.Text = lblExample.Text & ".jpg" + Endif + +End + +Public Sub btnCancel_Click() + + Me.Close + +End + +Public Sub btnOK_Click() + + Dim sProblems As String + Dim iContinue As Integer + + sProblems = FMain.TestRenameAll(txtPre.Text, sDigits, iStartVal, CheckFile.Value) + If sProblems <> "" Then + FRenameAllWarning.Tag = sProblems + iContinue = FRenameAllWarning.ShowModal() + Else + iContinue = 1 + Endif + + If iContinue = 0 Then Return + + Inc Application.Busy + FMain.RenameAll(txtPre.Text, sDigits, iStartVal, CheckFile.Value) + Me.Close + +End + +Public Sub form_Close() + + FMain.Enabled = True + +End diff --git a/app/examples/Image/Lighttable/.src/FRenameAll.form b/app/examples/Image/Lighttable/.src/FRenameAll.form new file mode 100644 index 00000000..aee280c1 --- /dev/null +++ b/app/examples/Image/Lighttable/.src/FRenameAll.form @@ -0,0 +1,77 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,64,59) + Text = ("Rename all pictures") + Resizable = False + { Panel1 Panel + MoveScaled(2,21,60,22) + Border = Border.Sunken + { txtPre TextBox + MoveScaled(24,2,35,4) + } + { SpinBox1 SpinBox + MoveScaled(24,7,6,4) + MinValue = 1 + MaxValue = 5 + } + { txtStart TextBox + MoveScaled(24,12,10,4) + Text = ("1") + MaxLength = 5 + } + { CheckFile CheckBox + MoveScaled(2,17,55,3) + Text = ("Keep original filename as suffix") + Value = CheckBox.True + } + { Label2 Label + MoveScaled(2,7,22,4) + Text = ("Number format") + } + { Label3 Label + MoveScaled(31,7,13,4) + Text = ("digits") + } + { Label5 Label + MoveScaled(2,2,22,4) + Text = ("Prefix") + } + { Label6 Label + MoveScaled(2,12,22,4) + Text = ("Start value") + } + } + { btnOK Button + MoveScaled(46,53,16,4) + Text = ("&OK") + Default = True + } + { btnCancel Button + MoveScaled(28,53,16,4) + Text = ("&Cancel") + Cancel = True + } + { TextLabel1 TextLabel + MoveScaled(2,2,60,14) + Background = &HFFFCCC& + Padding = 7 + Text = ("This function will rename all .jp(e)g files in the directory and add serial numbers to the filenames.
    The pictures will be handled in the order they are shown right now, in rows from left to right, rows from top to bottom.") + Border = Border.Etched + } + { Label1 Label + MoveScaled(2,18,19,3) + Text = ("Options") + } + { Label4 Label + MoveScaled(2,46,11,4) + Text = ("Example:") + } + { lblExample Label + MoveScaled(13,46,49,4) + Font = Font["Bold"] + Background = Color.TextBackground + Alignment = Align.Center + Border = Border.Etched + } +} diff --git a/app/examples/Image/Lighttable/.src/FRenameAllWarning.class b/app/examples/Image/Lighttable/.src/FRenameAllWarning.class new file mode 100644 index 00000000..8c4626e7 --- /dev/null +++ b/app/examples/Image/Lighttable/.src/FRenameAllWarning.class @@ -0,0 +1,19 @@ +' Gambas class file + +Public Sub Form_Open() + + txaList.Text = Me.Tag + +End + +Public Sub btnCancel_Click() + + Me.Close(0) + +End + +Public Sub btnContinue_Click() + + Me.Close(1) + +End diff --git a/app/examples/Image/Lighttable/.src/FRenameAllWarning.form b/app/examples/Image/Lighttable/.src/FRenameAllWarning.form new file mode 100644 index 00000000..e5ae683a --- /dev/null +++ b/app/examples/Image/Lighttable/.src/FRenameAllWarning.form @@ -0,0 +1,29 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,68,54) + Text = ("File Conflicts") + Resizable = False + { btnCancel Button + MoveScaled(51,48,15,4) + Text = ("&Cancel") + Default = True + Cancel = True + } + { btnContinue Button + MoveScaled(28,48,21,4) + Text = ("Continue &anyway") + } + { TextLabel1 TextLabel + MoveScaled(11,2,54,14) + Text = ("The following files can't be renamed, because the target filenames already exist in the directory.
    If you continue, only the files without conflicts will be renamed.
    If you cancel, you can choose new filename options.") + } + { txaList TextArea + MoveScaled(2,18,64,28) + ReadOnly = True + } + { PictureBox1 PictureBox + MoveScaled(2,3,7,7) + Picture = Picture["icon:/48/warning"] + } +} diff --git a/app/examples/Image/Lighttable/.src/FSlideshow.class b/app/examples/Image/Lighttable/.src/FSlideshow.class new file mode 100644 index 00000000..73752d11 --- /dev/null +++ b/app/examples/Image/Lighttable/.src/FSlideshow.class @@ -0,0 +1,56 @@ +' Gambas class file + +Public Sub Form_Open() + + Dim sDelay As String + + Me.Width = Desktop.Width + Me.Height = Desktop.Height + panControl.Y = Me.Height - 55 + panControl.Width = Me.Width + sDelay = Settings["SlideShow/Delay"] + If sDelay = "" Then sDelay = "5" + spinDelay.Value = sDelay + FMain.GetDelay(sDelay) + btnStop.SetFocus + +End + +Public Function PictureLoad(sPath As String, iOri As String) As Boolean + + Dim hPic As Image + Dim iFormat As Single + + hPic = Image.Load(sPath) + If iOri = 6 Then + hPic = hPic.Rotate(Rad(-90)) + Else If iOri = 8 Then + hPic = hPic.Rotate(Rad(90)) + Endif + PicBox1.Picture = hPic.Picture + Wait + + iFormat = PicBox1.Picture.Width / PicBox1.Picture.Height + PicBox1.Y = 0 + PicBox1.Height = Me.Height - 35 + PicBox1.Width = Me.Height * iFormat + If PicBox1.Width > Me.Width Then + PicBox1.Width = Me.Width + PicBox1.Height = Me.Width / iFormat + Endif + PicBox1.X = (Me.Width - PicBox1.Width) / 2 + PicBox1.Visible = True + +End + +Public Sub spinDelay_Change() + + FMain.GetDelay(spinDelay.Value) + +End + +Public Sub btnStop_Click() + + Me.Close + +End diff --git a/app/examples/Image/Lighttable/.src/FSlideshow.form b/app/examples/Image/Lighttable/.src/FSlideshow.form new file mode 100644 index 00000000..337e6046 --- /dev/null +++ b/app/examples/Image/Lighttable/.src/FSlideshow.form @@ -0,0 +1,46 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,81,37) + Background = Color.Background + Resizable = False + SkipTaskbar = True + { PicBox1 PictureBox + MoveScaled(22,12,10,9) + Visible = False + Stretch = True + } + { panControl Panel + MoveScaled(0,31,79,4) + Background = Color.Background + Arrangement = Arrange.Horizontal + Border = Border.Raised + { Panel1 Panel + MoveScaled(0,1,7,2) + Expand = True + } + { Label1 Label + MoveScaled(8,0,25,4) + Text = ("Pause between pictures:") + Alignment = Align.Right + } + { spinDelay SpinBox + MoveScaled(34,0,7,4) + MaxValue = 60 + } + { Label2 Label + MoveScaled(42,0,10,4) + Text = ("sec") + } + { btnStop Button + MoveScaled(59,0,15,4) + Text = ("Stop") + Picture = Picture["icon:/16/stop"] + Default = True + Cancel = True + } + { Panel2 Panel + MoveScaled(75,0,4,3) + } + } +} diff --git a/app/examples/Image/Lighttable/.src/FStart.class b/app/examples/Image/Lighttable/.src/FStart.class new file mode 100644 index 00000000..c93266a5 --- /dev/null +++ b/app/examples/Image/Lighttable/.src/FStart.class @@ -0,0 +1,135 @@ +' Gambas class file + +Private iNr As Integer +Private aRecentDirs As New String[] +Private atxLabel As New TextLabel[] + +Public Sub Form_Open() + + Dim i, j, pos, lastpos As Integer + Dim sShort, sPath As String + + aRecentDirs.Resize(10) + atxLabel.Resize(10) + + i = 0 + For j = 0 To 9 + aRecentDirs[i] = Settings["Recent/" & j] + If aRecentDirs[i] = "" Then Break + If Not Exist(aRecentDirs[i]) Then + i -= 1 + Goto directory_does_not_exist + Endif + pos = -1 + Do While pos <> 0 + lastpos = pos + pos = InStr(aRecentDirs[i], "/", pos + 1) + Loop + sShort = Right$(aRecentDirs[i], Len(aRecentDirs[i]) - lastpos) + sPath = Left$(aRecentDirs[i], Len(aRecentDirs[i]) - Len(sShort)) + + atxLabel[i] = New TextLabel(svwLast) As "lblRecent" + With atxLabel[i] + .Border = Border.Raised + .Font.Grade = -1 + .Padding = 1 + .Tag = i + .Text = "" & sShort & "
    " & sPath + .AutoResize = True + End With + directory_does_not_exist: + i += 1 + Next + Me.Center + +End + +Public Sub btnOK_Click() + + Dim i, j As Integer + Dim sDir As String + + sDir = DirChooser1.SelectedPath + If MMain.ReadDir(sDir) = False Then + Message.Error(Subst(("The folder &1 doesn't contain any jp(e)g files."), sDir)) + Return + Endif + + For i = 0 To 8 ' write recent selections into settings + If aRecentDirs[i] = sDir Then + For j = i To 8 + aRecentDirs[j] = aRecentDirs[j + 1] + Next + Break + Endif + Next + For i = 9 To 1 Step -1 + aRecentDirs[i] = aRecentDirs[i - 1] + Next + aRecentDirs[0] = sDir + For i = 0 To 9 + Settings["Recent/" & i] = aRecentDirs[i] + Next + + MMain.GoAhead(True) + +End + +Public Sub btnCancel_Click() + + MMain.GoAhead(False) + +End + +Public Sub lblRecent_Enter() + + iNr = Last.Tag + If atxLabel[iNr].Background = -1 Then + atxLabel[iNr].Background = Color.LightBackground + Endif + +End + +Public Sub lblRecent_Leave() + + If atxLabel[iNr].Background = Color.LightBackground Then + atxLabel[iNr].Background = -1 + Endif +End + +Public Sub lblRecent_MouseDown() + + DirChooser1.SelectedPath = aRecentDirs[iNr] + +End + +Public Sub lblRecent_DblClick() + + lblRecent_MouseDown + btnOK_Click + +End + +Public Sub DirChooser1_Change() + + Dim i As Integer + + For i = 0 To 9 + If Not Exist(aRecentDirs[i]) Then Break + If aRecentDirs[i] = "" Then Break + If aRecentDirs[i] = DirChooser1.SelectedPath Then + atxLabel[i].Background = Color.SelectedBackground + atxLabel[i].Foreground = Color.SelectedForeground + Else + atxLabel[i].Background = -1 + atxLabel[i].Foreground = -1 + Endif + Next + +End + +Public Sub DirChooser1_Activate() + + btnOK_Click + +End diff --git a/app/examples/Image/Lighttable/.src/FStart.form b/app/examples/Image/Lighttable/.src/FStart.form new file mode 100644 index 00000000..357c0d8b --- /dev/null +++ b/app/examples/Image/Lighttable/.src/FStart.form @@ -0,0 +1,42 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,101,65) + Text = ("Lighttable - Select picture folder") + Resizable = False + { btnOK Button + MoveScaled(69,60,15,4) + Text = ("&OK") + Default = True + } + { btnCancel Button + MoveScaled(85,60,15,4) + Text = ("&Cancel") + Cancel = True + } + { DirChooser1 DirChooser + MoveScaled(2,6,51,51) + } + { Separator1 Separator + MoveScaled(0,58,102,1) + } + { Label1 Label + MoveScaled(2,2,27,3) + Font = Font["Bold,+1"] + Text = ("New selection") + } + { Separator2 Separator + MoveScaled(54,0,2,58) + } + { Label2 Label + MoveScaled(58,2,23,3) + Font = Font["Bold,+1"] + Text = ("Last selections") + } + { svwLast ScrollView + MoveScaled(58,7,41,49) + Arrangement = Arrange.Vertical + Border = False + ScrollBar = Scroll.Vertical + } +} diff --git a/app/examples/Image/Lighttable/.src/FTime.class b/app/examples/Image/Lighttable/.src/FTime.class new file mode 100644 index 00000000..d807f8f8 --- /dev/null +++ b/app/examples/Image/Lighttable/.src/FTime.class @@ -0,0 +1,27 @@ +' Gambas class file + +Public Sub Form_Open() + + Me.Center + +End + +Public Sub btnCancel_Click() + + Me.Close + +End + +Public Sub btnOK_Click() + + If SpinDay.Value + SpinHrs.Value + SpinMins.Value = 0 Then + Message.Info(("There is no time correction selected.")) + Return + Endif + + Inc Application.Busy + FMain.TimeCorrection(SpinDay.Value, SpinHrs.Value, SpinMins.Value, cmbPlusMinus.Index) + Dec Application.Busy + Me.Close + +End diff --git a/app/examples/Image/Lighttable/.src/FTime.form b/app/examples/Image/Lighttable/.src/FTime.form new file mode 100644 index 00000000..90070ebc --- /dev/null +++ b/app/examples/Image/Lighttable/.src/FTime.form @@ -0,0 +1,58 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,71,40) + Text = ("Time correction") + Resizable = False + { SpinDay SpinBox + MoveScaled(2,25,8,4) + MaxValue = 365 + } + { SpinHrs SpinBox + MoveScaled(19,25,7,4) + MaxValue = 23 + } + { SpinMins SpinBox + MoveScaled(36,25,7,4) + MaxValue = 59 + } + { cmbPlusMinus ComboBox + MoveScaled(54,25,15,4) + ReadOnly = True + List = [("earlier"), ("later")] + Text = ("later") + } + { btnOK Button + MoveScaled(54,34,15,4) + Text = ("&OK") + Default = True + } + { btnCancel Button + MoveScaled(37,34,15,4) + Text = ("&Cancel") + Cancel = True + } + { TextLabel1 TextLabel + MoveScaled(2,3,67,16) + Background = &HFFFCCC& + Padding = 7 + Text = ("This function will correct all date/time informations in the EXIF section of all .jp(e)g files in the folder.
    A backup of the files will be made with file names like 'MyPicture.jpg_original'.
    If there are no EXIF date/time informations in a file, nothing will be done.") + Border = Border.Etched + } + { Label1 Label + MoveScaled(2,21,60,4) + Text = ("Set the original time of all pictures to") + } + { Label2 Label + MoveScaled(10,25,9,4) + Text = ("day(s)") + } + { Label3 Label + MoveScaled(26,25,10,4) + Text = ("hour(s)") + } + { Label4 Label + MoveScaled(43,25,11,4) + Text = ("minute(s)") + } +} diff --git a/app/examples/Image/Lighttable/.src/MMain.module b/app/examples/Image/Lighttable/.src/MMain.module new file mode 100644 index 00000000..22771979 --- /dev/null +++ b/app/examples/Image/Lighttable/.src/MMain.module @@ -0,0 +1,53 @@ +' Gambas module file + +Private sPath As String +Private aFiles As String[] + +Public Sub Main() + + Dim sTest As String + + Try Shell "exiftool -ver" To sTest + If Error Or sTest = "" Then + Message.Error(("To run this program, exiftool must be installed.")) + Return + Endif + + Try Shell "convert -version" To sTest + If Error Or sTest = "" Then + Message.Error(("To run this program, convert must be installed.")) + Return + Endif + + FStart.Show + +End + +Public Sub ReadDir(sDir As String) As Boolean + + Dim iCount As Integer + + aFiles = Dir(sDir, "*.{jpg,jpeg}").Sort(1) ' Sorted by file names, 1 = case insensitive + iCount = aFiles.Count + If iCount > 0 Then + sPath = sDir + Return True + Endif + +End + +Public Sub GoAhead(bOk As Boolean) + + FStart.Close + If bOk = False Then Return + FMain.Tag = sPath + FMain.Show + +End + +Public Function GetFiles() As String[] + + Return aFiles + aFiles.Delete + +End diff --git a/app/examples/Image/Lighttable/CHANGELOG b/app/examples/Image/Lighttable/CHANGELOG new file mode 100644 index 00000000..5cb10caf --- /dev/null +++ b/app/examples/Image/Lighttable/CHANGELOG @@ -0,0 +1,3 @@ +* Sun Feb 28 2010 mathias 0.1 +- Initial release + diff --git a/app/examples/Image/Lighttable/FStart.class b/app/examples/Image/Lighttable/FStart.class new file mode 100644 index 00000000..c3a9c61f --- /dev/null +++ b/app/examples/Image/Lighttable/FStart.class @@ -0,0 +1,92 @@ +' Gambas class file + +aRecentDirs As New String[] +iNr As Integer +iLast As Integer +atxLabel As New Object[] + + +Public Sub Form_Open() + Dim i, pos, lastpos As Integer + Dim sShort, sPath As String + + aRecentDirs.Resize(10) + atxLabel.Resize(10) + + For i = 0 To 9 + aRecentDirs[i] = Settings["Recent/" & i] + If aRecentDirs[i] = "" Then Break + pos = -1 + Do While pos <> 0 + lastpos = pos + pos = InStr(aRecentDirs[i], "/", pos + 1) + Loop + sShort = Right$(aRecentDirs[i], Len(aRecentDirs[i]) - lastpos) + sPath = Left$(aRecentDirs[i], Len(aRecentDirs[i]) - Len(sShort)) + + atxLabel[i] = New TextLabel(Me) As "lblRecent" + With atxLabel[i] + .X = 406 + .Y = 49 + (i * 35) + .Width = 287 + .Height = 35 + .Border = 4 + .Font.Grade = -1 + .Padding = 1 + .Tag = i + .Text = "" & sShort & "
    " & sPath + End With + Next + Me.Center +End + + +Public Sub btnOK_Click() + Dim i, j As Integer + + For i = 0 To 8 + If aRecentDirs[i] = DirChooser1.SelectedPath Then + For j = i To 8 + aRecentDirs[j] = aRecentDirs[j + 1] + Next + Break + Endif + Next + For i = 9 To 1 Step -1 + aRecentDirs[i] = aRecentDirs[i - 1] + Next + aRecentDirs[0] = DirChooser1.SelectedPath + For i = 0 To 9 + Settings["Recent/" & i] = aRecentDirs[i] + Next + Message.Info(aRecentDirs[0] & " wird geöffnet.") + Me.Close +End + +Public Sub btnCancel_Click() + Me.Close +End + +Public Sub lblRecent_Enter() + iNr = Last.Tag + If atxLabel[iNr].Background = -1 Then + atxLabel[iNr].Background = Color.LightBackground + Endif +End + +Public Sub lblRecent_Leave() + If atxLabel[iNr].Background = Color.LightBackground Then + atxLabel[iNr].Background = -1 + Endif +End + +Public Sub lblRecent_MouseDown() + atxLabel[iLast].Background = -1 + atxLabel[iLast].Foreground = -1 + atxLabel[iNr].Background = Color.SelectedBackground + atxLabel[iNr].Foreground = Color.SelectedForeground + iLast = iNr + DirChooser1.SelectedPath = aRecentDirs[iNr] +End + + diff --git a/app/examples/Image/Lighttable/FStart.form b/app/examples/Image/Lighttable/FStart.form new file mode 100644 index 00000000..b1309cd7 --- /dev/null +++ b/app/examples/Image/Lighttable/FStart.form @@ -0,0 +1,35 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,101,66) + Text = ("Lighttable - Choose picture folder") + { btnOK Button + MoveScaled(84,60,15,4) + Text = ("&OK") + Default = True + } + { btnCancel Button + MoveScaled(67,60,15,4) + Text = ("&Cancel") + Cancel = True + } + { DirChooser1 DirChooser + MoveScaled(2,6,51,51) + } + { Separator1 Separator + MoveScaled(2,58,97,1) + } + { Label1 Label + MoveScaled(3,2,27,3) + Font = Font["Bold,+1"] + Text = ("New selection") + } + { Separator2 Separator + MoveScaled(54,0,2,58) + } + { Label2 Label + MoveScaled(58,2,23,3) + Font = Font["Bold,+1"] + Text = ("Last selections") + } +} diff --git a/app/examples/Image/Lighttable/Help_ca.html b/app/examples/Image/Lighttable/Help_ca.html new file mode 100644 index 00000000..8bf512d5 --- /dev/null +++ b/app/examples/Image/Lighttable/Help_ca.html @@ -0,0 +1,60 @@ + + + + + + + + + + + +AjudaCàrrega de les imatges
    Les imatges es carregen en segon pla.
    Mentre es van carregant, ja podeu treballar amb les imatges que es mostren.
    Excepció: algunes de les funcions, con ordenar cronològicament, no estan disponibles fins que s'han carregat totes les imatges.
    +La càrrega es pot cancel·lar via el menú del programa (Fi).
     
    +Ús
    Totes les funcions es poden cridar des dels menús de context:
    Clic amb el botó secundari al fons del lighttable: Menú de programa
    Clic amb el botó secundari en un marc o a sobre d'una imatge: Menú de la imatge

    +Dreceres de teclat
    Hi ha dreceres per a totes les tasques, tal com es mostra als menús de context:
    +Ctrl+A Ordena les imatges alfabèticament
    +Ctrl+C Ordena les imatges cronològicament
    +Ctrl+S Projecció amb diapositives, començant per la imatge marcada
    +Ctrl+N Reanomena totes les imatges
    +Ctrl+T Correcció de l'hora
    + +F1 Ajuda
    + +Ctrl+End Surt del programa
    Arrossega un marc amb el ratolí: podeu moure el marc a qualsevol posició dins del lighttable
    Enter o fer clic sobre una imatge: Amplia la imatge
    +Alt+Enter o fer clic sobre una imatge ampliada: Vista a pantalla completa
    +Dreta Mou a la imatge següent
    + + +Esquerra Mou a la imatge anterior
    I Informacions de la imatge
    + +N Reanomena la imatge
    +Del Suprimeix la imatge
    + +ESC ho cancel·la i ho tanca tot
    +
    Visualitza i compara imatges
    +Quan estigui oberta la vista ampliada o la pantalla completa, mou-te amb les tecles per les fotografies (els fitxers grans triguen un moment a carregar-se).
    + +O salta a una altra imatge: Feu clic en una altra imatge de «sota». També podeu desplaçar-vos per la «taula».
    +
    +Ordena les imatges
    Si teniu imatges de més d'una càmera, és útil primer ordenar-les cronològicament (Menú de programa). Aquesta funció llegeix la Exif-metadata de les fotografies.
    Per ordenar-les manualment, només heu de moure els marcs al voltant de la taula. Llavors el podeu reanomenar manualment com per exemple «005 la meva millor imatge».

    +Reanomena totes les imatges (Ctrl+N)
    +Una bona alternativa a reanomenar-les manualment. Si he mogut totes les fotografies als llocs desitjats, els fitxers poden ser numerats i reanomenats en aquest ordre exactament. Podeu triar entre afegir o esborrar els noms de fitxer antics.
    +
    +Correcció de l'hora (Ctrl+T)
    +Quan etiqueteu geogràficament les fotografies o quan compareu fotos de dues càmeres, observeu que una càmera té una hora incorrecte? Cap problema. Amb aquesta funció podeu corregir la Exif-metadata de la data i la hora de totes les fotografies a dins la carpeta.

    +Nota: Manipulació de imatges i miniatures
    +Quan s'editen les fotografies amb un programa d'edició d'imatges (p.e. GIMP), les imatges en miniatura de les fotos no es modifiquen. O sigui que el Lighttable seguirà mostrant les miniatures de les imatges abans dels canvis. +Solució:
    +a) aneu a previsualitza al Gwenview, Dolphin, Konqueror o qualsevol programa similar, així les miniatures queden actualitzades,
    +b) elimina totes les miniatures (de la carpeta /home/usurai/.thumbnails/normal), així les miniatures es crearan posteriorment.
    +
    +
    + diff --git a/app/examples/Image/Lighttable/Help_de.html b/app/examples/Image/Lighttable/Help_de.html new file mode 100644 index 00000000..5c7ef22d --- /dev/null +++ b/app/examples/Image/Lighttable/Help_de.html @@ -0,0 +1,74 @@ + + + + + + + + + + + + + HilfeLaden der Bilder
    Das Laden der Bilder läuft im Hintergrund.
    +Währenddessen kann man schon mit den bereits angezeigten Bildern arbeiten.
    Allerdings sind einige Funktionen wie chronologisches Sortieren erst verfügbar, wenn alle Bilder geladen sind.
    +Das Laden der Bilder lässt sich im Programm-Menü abbrechen (Ende).
     
    Bedienung
    Alle Funktionen lassen sich über Kontextmenüs aufrufen:
    Rechtsklick auf den Hintergrund des Leuchttischs: Programm-Menü
    +Rechtsklick auf einen Rahmen oder ein Bild: Bild-Menü

    +Kurzbefehle
    Für alle Funktionen gibt es Kurzbefehle, wie in den Kontextmenüs angegeben:
    +Strg+A Bilder alphabetisch sortieren
    + +Strg+C Bilder chronologisch sortieren
    +Strg+S Diashow ab dem markierten Bild
    + +Strg+N Alle Bilder umbenennen
    +Strg+T Zeitkorrektur
    + +F1: Hilfe
    + +Strg+Ende Programm beenden
    Ziehen eines Rahmens mit der Maus: Bild lässt sich beliebig verschieben
    +Enter oder Mausklick auf ein Bild: vergrößerte Ansicht
    +Alt+Enter oder auf das Großbild klicken: Vollbildansicht
    Rechts gehe zum nächsten Bild
    +Links    gehe zum vorherigen Bild
    I Bildinformationen
    +N Bild umbenennen
    +Entf: Bild löschen
    + +ESC schließt alle Ansichten und bricht alle Vorgänge ab

    +Bilder ansehen und vergleichen
    +Bei geöffneter Großbild- oder Vollbildansicht einfach mit den Tasten die Bilder durchgehen (bei großen Bilddateien dauert das Laden etwas).
    +Oder zu einem anderen Bild springen: "unten" ein anderes Bild anklicken. Man kann den "Tisch" auch scrollen.

    +Bilder sortieren
    Hat +man Bilder von mehreren Kameras im Verzeichnis, ist es nützlich, die +Bilder zunächst einmal chronologisch zu sortieren (Programm-Menü). Diese Funktion wertet die Exif-Metadaten der Fotos aus.
    Manuell lassen sich die Bilder zum Sortieren beliebig +auf dem Tisch herumschieben. Dann kann man sie einzeln umbenennen, zB +"005 mein liebstes Foto".

    +Alle Bilder umbenennen (Strg+N)
    +Eine gute Alternative zum manuellen Umbenennen. Hat man alle Fotos in +die gewünschte Reihenfolge verschoben, lassen sich die Dateien in genau +dieser Reihenfolge mit Nummern versehen und umbenennen. Die alten +Dateinamen werden hierbei nach Wunsch entweder angehängt oder +überschrieben.
    +
    +Zeitkorrektur (Strg+T)
    +Beim Geokodieren von Fotos oder beim Vergleich von Fotos zweier Kameras +stellt sich heraus, dass die Zeit bei einer Kamera falsch eingestellt +war? Kein Problem. Mit dieser Funktion lassen sich die Exif-Metadaten +zu Datum und Zeit von allen Bildern im Verzeichnis korrigieren.
    +
    +Anmerkung: Bildbearbeitung und Vorschaubilder
    +Wenn man Fotos mit einem Bildbearbeitungsprogramm (z.B. GIMP) +bearbeitet, werden die zugehörigen Vorschaubilder nicht aktualisiert. +Leuchttisch zeigt daher weiterhin die alten Miniaturansichten an. +Abhilfe:
    +a) in Gwenview, Dolphin, Konqueror o.ä. die Vorschauansicht wählen und die Thumbnails aktualisieren lassen,
    +b) die Thumbnails (im Verzeichnis /home/user/.thumbnails/normal) löschen, so dass sie danach neu erstellt werden.
    +
    +
    + \ No newline at end of file diff --git a/app/examples/Image/Lighttable/Help_en.html b/app/examples/Image/Lighttable/Help_en.html new file mode 100644 index 00000000..4148cf8b --- /dev/null +++ b/app/examples/Image/Lighttable/Help_en.html @@ -0,0 +1,71 @@ + + + + + + + + + + + +HelpLoading the pictures
    The pictures are loaded in the background.
    While loading goes on, +you can already work with the pictures that are displayed.
    Exception: some of the functions like sorting chronologically are not available before all pictures are loaded.
    +The loading can be aborted via the program menu (End).
     
    +Usage
    All functions can be called by context menus:
    Right-click on the background of the lighttable: Program menu
    Right-click on a frame or on a picture: Picture menu

    +Shortcuts
    For all tasks there are shortcuts as shown in the context menus:
    +Ctrl+A Sort pictures alphabetically
    +Ctrl+C Sort pictures chronologically
    +Ctrl+S Sildeshow, beginning with the marked picture
    +Ctrl+N Rename all pictures
    +Ctrl+T Time correction
    + +F1 Help
    + +Ctrl+End Quit program
    Drag a frame with the mouse: you can move the frame to any position on the lighttable
    Enter or click on a picture: Enlarge picture
    +Alt+Enter or click on an enlarged picture: Fullscreen view
    +Right Move to next picture
    + + +Left   Move to previous picture
    I Picture informations
    + +N Rename picture
    +Del Delete picture
    + +ESC will close and cancel everything
    +
    View and compare pictures
    +When view or fullscreen view is open, just move with the keys through the photos (big files take a moment to load).
    + +Or jump to another picture: click "down" on another picture. You can also scroll the "table".
    +
    +Sort pictures
    If +you have pictures of more than one camera, it is useful to first sort +them chronologically (Program menu). This function reads the Exif-metadata of the photographs.
    To sort manually, just  move the frames around on the table. Then you can rename them manually like "005 my best picture".

    +Rename all pictures (Ctrl+N)
    +A good alternative to renaming manually. If you have moved all +photographs to the desired places, the files can be numbered and renamed +exactly in this order. As you like, the old filenames are either +attatched or overwritten.
    +
    +Time correction (Ctrl+T)
    +When geotagging your photographs or when comparing photos of two +cameras, you notice that a camera had a wrong time? +No problem. With this function you can correct the Exif-metadata of +date and time of all the photographs in the folder.

    +Note: Image manipulation and thumbnails
    +When editing photographs with an image manipulation program (i.e. +GIMP), the thumbnail pictures of the photos are not changed. So, +Lighttable will still show the old miniature pictures before the +changes. Solution:
    +a) go to preview in Gwenview, Dolphin, Konqueror or any similar program, so the thumbnails are updated,
    +b) delete all the thumbnails (in the folder /home/user/.thumbnails/normal), so they will be newly created afterwards.
    +
    +
    + \ No newline at end of file diff --git a/app/examples/Image/Lighttable/Help_ru.html b/app/examples/Image/Lighttable/Help_ru.html new file mode 100644 index 00000000..d119cea7 --- /dev/null +++ b/app/examples/Image/Lighttable/Help_ru.html @@ -0,0 +1,29 @@ + + + + +Справка + + + + +Загрузка изображений
    Изображения загружаются в фоновом режиме.
    Пока идёт загрузка, +вы уже можете работать с изображениями, которые отображаются.
    Исключение: некоторые функции, такие как сортировка в хронологическом порядке, недоступны до загрузки всех изображений.
    +Загрузка может быть прервана через меню программы (Конец).

    Использование
    Все функции могут быть вызваны через контекстные меню:
    Щелчок правой кнопкой мыши на фоне программы: Меню программы
    Щелчок правой кнопкой мыши на кадре или на изображении: Меню изображения

    Горячие клавиши
    Для всех задач есть горячие клавиши, как показано в контекстных меню:
    Ctrl+A Сортировка изображений по алфавиту
    Ctrl+C Сортировка изображений хронологически
    Ctrl+S Слайд-шоу, начиная с отмеченного изображения
    Ctrl+N Переименовать все изображения
    Ctrl+T Коррекция времени
    F1 Справка
    Ctrl+End Выйти из программы
    Перетащить кадр мышью: вы можете переместить кадр в любую позицию светового планшета
    Enter или щелчок на изображении: увеличить изображение
    Alt+Enter или щелчок на увеличенном изображении: Полный экран
    Вправо Перейти к следующему изображению
    Влево Перейти к предыдущему изображению
    I Информация об изображении
    N Переименовать изображение
    Del Удалить изображение
    ESC Закрыть и отменить всё

    Просмотр и сравнение изображения
    +Когда открыт просмотр или полноэкранный режим, просто перемещайтесь с помощью клавиш через фотографии (для загрузки больших файлов требуется время).
    + +Или перейдите к другому изображению: нажмите «вниз» на другом изображении. Вы также можете прокрутить «стол».

    Сортировка изображений
    Если у вас есть изображения с более чем с одной камеры, полезно сначала отсортировать их в хронологическом порядке (меню программы). Эта функция читает Exif-метаданные фотографий.
    Чтобы отсортировать вручную, просто переместите кадры на столе. Затем вы можете переименовать их вручную как «005 моя лучшая фотография».

    Переименовать все изображения (Ctrl+N)
    +Хорошая альтернатива переименованию вручную. Если вы переместили все фотографии в нужные места, файлы могут быть пронумерованы и переименованы именно в этом порядке. Как вам нравится, старые имена файлов либо привязаны, либо перезаписаны.

    Коррекция времени (Ctrl+T)
    +При геотегировании ваших фотографий или при сравнении фотографий с двух камер вы замечаете, что у камеры было неправильное время? Нет проблем. С помощью этой функции вы можете исправить Exif-метаданные даты и времени всех фотографий в папке.

    Примечание: манипуляции с изображениями и миниатюры
    +При редактировании фотографий с помощью программы для работы с изображениями (например, GIMP) уменьшенные изображения фотографий не изменяются. Итак, программа покажет старые изображения миниатюр до изменений. Решение:
    +a) перейдите к предварительному просмотру в Gwenview, Dolphin, Konqueror или любой другой подобной программе, чтобы миниатюры обновлялись,
    +b) удалите все миниатюры (в папке /home/user/.thumbnails/normal), чтобы впоследствии они были созданы заново.


    + + diff --git a/app/examples/Image/Lighttable/LTicon.png b/app/examples/Image/Lighttable/LTicon.png new file mode 100644 index 0000000000000000000000000000000000000000..3faf640ba74b45e8899eee605064ef163a5ee6f8 GIT binary patch literal 296 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvtpJ}8R|bav_V)Jw|NjRHI3NGN zfB$|4AP2~+X8;oa8-N(d1cLf^h88A3dZ(w0V~EE2xX{p0 zAU7%|B0ec5Au$e!`X+YAC&k4l#56S5#U;chB*k|2w)IcyO-zadvfDaaTG|`q6Jr`0 z8WIwtdna`EPwI(JiUo>v_Ox|$wZ_HA#3jb|P3W37bIQ~ile&64fJOmDrq7-_b>^fv z5Ibhll>Uj6`+zEeMopPEamv&QO|5k?anV4PO)a%uJ#Fy`QLzcpZJo^xP1P}p(LiU^ zHdM8DHpeDJ#l%Oqv^CZ>Rs(GWip0f7H@7v!#zzC)21Id*(GCs{KoTepmdLvBSsq9X)yQ@bUfo5AWW4aObYQTX*i+vSs`Fja$})zd6kT z3=Y4NAirRSu9wT08TY=P@aprrRi9tY`V6E#eV)y<_VefU>pp#1x8cj@&tEoe{`zI> z$}eA6fBN?A)9U4)zU($#)Mhy_1_4m#}+JZB6G# aErzuT!ofv?v$%oIWbkzLb6Mw<&;$SrEfq2V literal 0 HcmV?d00001 diff --git a/app/examples/Image/Lighttable/hand1.png b/app/examples/Image/Lighttable/hand1.png new file mode 100644 index 0000000000000000000000000000000000000000..ab56c037b5d150241f983b5b94a24abef1f33c57 GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#=`Bp4pvH+~MJm`Z~Df*FpnOj)%T$jkI}aSV~T z+&b|z?*Ri2XWuC+Z^W;8Di`#TGvsMYoKA9+#ImT1tK9ZC3o%6;b@%K@6;?g{dslm) zd(98FE9_TQS{M`@j=%POAlB#mOqYFM!A_MsPi?o)c&zsRRgZJsz7NiC(^tIvRDC*z Xe~-9$n@f1N8OSM~u6{1-oD!M<4sk;u literal 0 HcmV?d00001 diff --git a/app/examples/Image/Lighttable/help-contents.png b/app/examples/Image/Lighttable/help-contents.png new file mode 100644 index 0000000000000000000000000000000000000000..917ef83e7f1ca4ff020a5bd33b979e698cc1b0e7 GIT binary patch literal 742 zcmV0u zcgvZ(<>v1BHhIhr8!IM8Zk4&_|NsAlt>HR-&^dh2Nru$^{{MTZ-whfnDoAijh}Nmb z>{pN3PKwt+fz*t%<^KQwU6k7m8YwMHaz=*PO^Vr5j@#?<`;oWkNQc=E8YwYPbx@Aq zuFCMI#_v&&;1L`vI8=LFm*;4n>B!voUzz7#m*-uV=M^C^NM(#?pzepX@|(f*X`%0F zq3&m(?HVLBQEilQr}d1u_kXbVbg1-lr}c5C^d2ZUQ*4uZuKS0!`+l+ed$0O?uKOV@ zJ4eBfp@I=fwKAD>;A&p{4+X27$Pn(OL9<&*Gh)d zUAoL~Ve&)?raATTJ{KZFM? z5E>Q^1QC(p;ZeL`f#{gn*x0!Egv8h+KCnP?N@{9qT6#uiRw_SOAUh{FH#aXox1g{{ z04z{kQd(MCR$f|KQ7H%(sH(21sjaK8scC2s0t+-YH8;1kwlxERFi=3Gy`!@W3c5uZ Y0CxpDmCMY#o&W#<07*qoM6N<$g1#V7)&Kwi literal 0 HcmV?d00001 diff --git a/app/examples/Image/Lighttable/lighttable.png b/app/examples/Image/Lighttable/lighttable.png new file mode 100644 index 0000000000000000000000000000000000000000..4497010b76ecf7b2e5e8fe76bdbf3efe37aaa9b1 GIT binary patch literal 6536 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 literal 0 HcmV?d00001 diff --git a/app/examples/Image/Lighttable/zoom-in.png b/app/examples/Image/Lighttable/zoom-in.png new file mode 100644 index 0000000000000000000000000000000000000000..660d752a49824dd934984b4579b91b727b68d0f9 GIT binary patch literal 710 zcmV;%0y+JOP)C@hm6V8zg@}uZhl_`XjEjehh=+`ehm4Dei-)ng z!Lqx-h>M4cjEZq{Zyurl1!o`Vekr zi;annk&SS2ZdX}VSzA|CS5sMAS5;S2R#;S4SX9l{-Q?%#&)DG8-Q}de+?l!Bnz`Df zzunK;<+RD)oxR<)&E{N$xLbs{u*&3`y4{$$+`Q4~Ux&H>|NmNqx2wkDk+j;KyV|zR z=3RxjUWT|?g11+Jwx7M;p1azPvesFHw@`hwhOE?yuGCI@vr2ff&)D9l!QFkl(yQIx7$*FwNrkzm$=*7;^^1i;>y_Oq`=>%!r-UF;n?2e+TY{h z=IY1S=)KbBzS8E%*y!Ko>f7Mtm6(>?;Nt1)>$$wPy}!JAdw7S6gtxf1c6f83qMvpi zRo4Ij04{V=PE!C6gU0hn?E6CX4(fly^25e|`}>3H8}=BIg`#6(;~X91?Gh4&ML^by zCMBn&dU>U#Ca1HAfgL8Ek(rg9lbe@cAR#FQ7Lk@IEGjCLm6IOhX;xHfAqy}lYU}6%01S317%7GyO8@`>07*qoM6N<$f`^TGzyJUM literal 0 HcmV?d00001 diff --git a/app/examples/Image/PhotoTouch/.directory b/app/examples/Image/PhotoTouch/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/app/examples/Image/PhotoTouch/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/app/examples/Image/PhotoTouch/.hidden/screenshots/phototouch.jpg b/app/examples/Image/PhotoTouch/.hidden/screenshots/phototouch.jpg new file mode 100644 index 0000000000000000000000000000000000000000..477d6bafb546b62f41548761b9e297c9e4412666 GIT binary patch literal 150309 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%0AWaO?PkFjX*LXB1j2(n$c-E@-_^!N1m;n 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 O0000\n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Simple Photo Editor" +msgstr "Editeur de photographie simplifié" + +#: .project:2 +msgid "This is a simple photo editor I made for my father. It is too complex for him, but it is still a good Gambas example!" +msgstr "" + +#: FBrightness.form:40 FMain.class:200 +msgid "Balance" +msgstr "Balance" + +#: FMain.class:107 +msgid "No image in directory" +msgstr "Aucune image dans ce répertoire" + +#: FMain.class:109 +msgid "Unable to load image" +msgstr "Impossible de charger l'image" + +#: FMain.class:200 +msgid "Automatic correction" +msgstr "Correction automatique" + +#: FMain.class:200 +msgid "Blur" +msgstr "Flou" + +#: FMain.class:200 +msgid "Browse photos" +msgstr "Parcourir les photos" + +#: FMain.class:200 +msgid "Crop image" +msgstr "Découper l'image" + +#: FMain.class:200 +msgid "Fit to window" +msgstr "Zoom à la taille de l'écran" + +#: FMain.class:200 +msgid "Flip horizontally" +msgstr "Retourner horizontalement" + +#: FMain.class:200 +msgid "Flip vertically" +msgstr "Retourner verticalement" + +#: FMain.class:200 +msgid "Invert" +msgstr "Inverser" + +#: FMain.class:200 +msgid "Normalize" +msgstr "Normaliser" + +#: FMain.class:200 +msgid "Oil painting effect" +msgstr "Effet de peinture à l'huile" + +#: FMain.class:200 +msgid "Quit" +msgstr "Quitter" + +#: FMain.class:200 +msgid "Remove speckles" +msgstr "Enlever les tâches" + +#: FMain.class:200 FResize.form:42 +msgid "Resize" +msgstr "Redimensionner" + +#: FMain.class:200 +msgid "Rotate left" +msgstr "Rotation vers la gauche" + +#: FMain.class:200 +msgid "Rotate right" +msgstr "Rotation vers la droite" + +#: FMain.class:200 +msgid "Save" +msgstr "Enregistrer" + +#: FMain.class:200 +msgid "Save all" +msgstr "Tout enregistrer" + +#: FMain.class:200 +msgid "Select photo directory" +msgstr "Choisir le répertoire des photographies" + +#: FMain.class:200 +msgid "Sharpen" +msgstr "Netteté" + +#: FMain.class:200 +msgid "Show photo" +msgstr "Afficher la photographie" + +#: FMain.class:200 +msgid "Undo all changes" +msgstr "Annuler tous les changements" + +#: FMain.class:200 +msgid "Zoom 100%" +msgstr "Zoom 100%" + +#: FMain.class:200 +msgid "Zoom in" +msgstr "Zoom avant" + +#: FMain.class:200 +msgid "Zoom out" +msgstr "Zoom arrière" + +#: FMain.class:222 +msgid "*" +msgstr "*" + +#: FMain.class:222 +msgid "/" +msgstr "/" + +#: FMain.class:222 +msgid "B" +msgstr "F" + +#: FMain.class:222 +msgid "D" +msgstr "T" + +#: FMain.class:222 +msgid "E" +msgstr "E" + +#: FMain.class:222 +msgid "H" +msgstr "H" + +#: FMain.class:222 +msgid "I" +msgstr "I" + +#: FMain.class:222 +msgid "M" +msgstr "M" + +#: FMain.class:222 +msgid "N" +msgstr "N" + +#: FMain.class:222 +msgid "O" +msgstr "P" + +#: FMain.class:222 +msgid "R" +msgstr "R" + +#: FMain.class:222 +msgid "S" +msgstr "S" + +#: FMain.class:222 +msgid "V" +msgstr "V" + +#: FScissors.form:24 +msgid "Cut" +msgstr "Découper" diff --git a/app/examples/Image/PhotoTouch/.lang/nl.po b/app/examples/Image/PhotoTouch/.lang/nl.po new file mode 100644 index 00000000..0676709e --- /dev/null +++ b/app/examples/Image/PhotoTouch/.lang/nl.po @@ -0,0 +1,183 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PhotoTouch 3.5.90\n" +"POT-Creation-Date: 2014-09-27 00:14 UTC\n" +"PO-Revision-Date: 2014-09-25 21:54 UTC\n" +"Last-Translator: Willy Raets \n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Simple Photo Editor" +msgstr "Eenvoudige Foto Editor" + +#: .project:2 +msgid "This is a simple photo editor I made for my father. It is too complex for him, but it is still a good Gambas example!" +msgstr "Dit is een eenvoudige foto editor die ik voor mijn vader maakte. Het is te complex voor hem, maar nog steeds een goed Gambas voorbeeld!" + +#: FBrightness.form:40 FMain.class:200 +msgid "Balance" +msgstr "Balans" + +#: FMain.class:107 +msgid "No image in directory" +msgstr "Geen afbeeldingsmap" + +#: FMain.class:109 +msgid "Unable to load image" +msgstr "Onmogelijk om afbeelding te laden" + +#: FMain.class:200 +msgid "Automatic correction" +msgstr "Automatische correctie" + +#: FMain.class:200 +msgid "Blur" +msgstr "Vervagen" + +#: FMain.class:200 +msgid "Browse photos" +msgstr "Browse foto's" + +#: FMain.class:200 +msgid "Crop image" +msgstr "Afbeelding snijden" + +#: FMain.class:200 +msgid "Fit to window" +msgstr "Aanpassen aan venster" + +#: FMain.class:200 +msgid "Flip horizontally" +msgstr "Horizontaal spiegelen" + +#: FMain.class:200 +msgid "Flip vertically" +msgstr "Verticaal spiegelen" + +#: FMain.class:200 +msgid "Invert" +msgstr "Omkeren" + +#: FMain.class:200 +msgid "Normalize" +msgstr "Normaliseren" + +#: FMain.class:200 +msgid "Oil painting effect" +msgstr "Olieverf effect" + +#: FMain.class:200 +msgid "Quit" +msgstr "Afsluiten" + +#: FMain.class:200 +msgid "Remove speckles" +msgstr "Verwijder spikkels" + +#: FMain.class:200 FResize.form:42 +msgid "Resize" +msgstr "Formaat wijzigen" + +#: FMain.class:200 +msgid "Rotate left" +msgstr "Links roteren" + +#: FMain.class:200 +msgid "Rotate right" +msgstr "Rechts roteren" + +#: FMain.class:200 +msgid "Save" +msgstr "Opslaan" + +#: FMain.class:200 +msgid "Save all" +msgstr "Alles opslaan" + +#: FMain.class:200 +msgid "Select photo directory" +msgstr "Selecteer foto map" + +#: FMain.class:200 +msgid "Sharpen" +msgstr "Verscherpen" + +#: FMain.class:200 +msgid "Show photo" +msgstr "Foto weergeven" + +#: FMain.class:200 +msgid "Undo all changes" +msgstr "Alle wijzigingen ongedaan maken" + +#: FMain.class:200 +msgid "Zoom 100%" +msgstr "Zoom 100%" + +#: FMain.class:200 +msgid "Zoom in" +msgstr "Zoom in" + +#: FMain.class:200 +msgid "Zoom out" +msgstr "Zoom uit" + +#: FMain.class:222 +msgid "*" +msgstr "-" + +#: FMain.class:222 +msgid "/" +msgstr "-" + +#: FMain.class:222 +msgid "B" +msgstr "-" + +#: FMain.class:222 +msgid "D" +msgstr "-" + +#: FMain.class:222 +msgid "E" +msgstr "-" + +#: FMain.class:222 +msgid "H" +msgstr "-" + +#: FMain.class:222 +msgid "I" +msgstr "-" + +#: FMain.class:222 +msgid "M" +msgstr "-" + +#: FMain.class:222 +msgid "N" +msgstr "-" + +#: FMain.class:222 +msgid "O" +msgstr "-" + +#: FMain.class:222 +msgid "R" +msgstr "-" + +#: FMain.class:222 +msgid "S" +msgstr "-" + +#: FMain.class:222 +msgid "V" +msgstr "-" + +#: FScissors.form:24 +msgid "Cut" +msgstr "Knippen" diff --git a/app/examples/Image/PhotoTouch/.lang/ru.po b/app/examples/Image/PhotoTouch/.lang/ru.po new file mode 100644 index 00000000..453cec3a --- /dev/null +++ b/app/examples/Image/PhotoTouch/.lang/ru.po @@ -0,0 +1,212 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Image/PhotoTouch/.project:25 +msgid "Simple Photo Editor" +msgstr "Простой редактор фотографий" + +#: app/examples/Image/PhotoTouch/.project:26 +msgid "" +"Photo editor example.\n" +"\n" +"This is a simple photo editor I made for my father. It has an overlay GUI with transparent buttons and state transitions. It is too complex for him, but it is still a good Gambas example!" +msgstr "" +"Пример редактора фотографий.\n" +"\n" +"Это простой редактор фотографий, который я сделал для своего отца. Он имеет оверлейный графический интерфейс с прозрачными кнопками и переходами между состояниями. Это слишком сложно для него, но это всё ещё хороший пример Gambas!" + +#: app/examples/Image/PhotoTouch/.src/FBrightness.form:29 app/examples/Image/PhotoTouch/.src/FMain.class:195 +msgid "Balance" +msgstr "Баланс" + +#: app/examples/Image/PhotoTouch/.src/FMain.class:107 app/examples/Image/PhotoTouch/.src/FMain.class:1050 +msgid "No image in directory" +msgstr "Нет изображения в директории" + +#: app/examples/Image/PhotoTouch/.src/FMain.class:109 +msgid "Unable to load image" +msgstr "Невозможно загрузить изображение" + +#: app/examples/Image/PhotoTouch/.src/FMain.class:176 +msgid "Browse photos" +msgstr "Просмотр фотографий" + +#: app/examples/Image/PhotoTouch/.src/FMain.class:177 +msgid "Show photo" +msgstr "Показать фотографию" + +#: app/examples/Image/PhotoTouch/.src/FMain.class:178 app/examples/Image/PhotoTouch/.src/FMain.class:450 +msgid "Select photo directory" +msgstr "Выбрать директорию фотографий" + +#: app/examples/Image/PhotoTouch/.src/FMain.class:179 +msgid "Zoom in" +msgstr "Увеличить" + +#: app/examples/Image/PhotoTouch/.src/FMain.class:180 +msgid "Zoom out" +msgstr "Уменьшить" + +#: app/examples/Image/PhotoTouch/.src/FMain.class:181 +msgid "Zoom 100%" +msgstr "Масштаб 100%" + +#: app/examples/Image/PhotoTouch/.src/FMain.class:182 +msgid "Fit to window" +msgstr "Уместить в окне" + +#: app/examples/Image/PhotoTouch/.src/FMain.class:183 +msgid "Flip horizontally" +msgstr "Отразить по горизонтали" + +#: app/examples/Image/PhotoTouch/.src/FMain.class:184 +msgid "Flip vertically" +msgstr "Отразить по вертикали" + +#: app/examples/Image/PhotoTouch/.src/FMain.class:185 +msgid "Rotate left" +msgstr "Поворот влево" + +#: app/examples/Image/PhotoTouch/.src/FMain.class:186 +msgid "Rotate right" +msgstr "Поворот вправо" + +#: app/examples/Image/PhotoTouch/.src/FMain.class:187 +msgid "Automatic correction" +msgstr "Автоматическая коррекция" + +#: app/examples/Image/PhotoTouch/.src/FMain.class:188 +msgid "Invert" +msgstr "Инвертировать" + +#: app/examples/Image/PhotoTouch/.src/FMain.class:189 +msgid "Blur" +msgstr "Размытие" + +#: app/examples/Image/PhotoTouch/.src/FMain.class:190 +msgid "Sharpen" +msgstr "Повысить резкость" + +#: app/examples/Image/PhotoTouch/.src/FMain.class:191 +msgid "Normalize" +msgstr "Нормализовать" + +#: app/examples/Image/PhotoTouch/.src/FMain.class:192 +msgid "Remove speckles" +msgstr "Удаление пятен" + +#: app/examples/Image/PhotoTouch/.src/FMain.class:193 +msgid "Oil painting effect" +msgstr "Эффект масляной живописи" + +#: app/examples/Image/PhotoTouch/.src/FMain.class:194 +msgid "Crop image" +msgstr "Обрезать изображение" + +#: app/examples/Image/PhotoTouch/.src/FMain.class:196 app/examples/Image/PhotoTouch/.src/FResize.form:31 +msgid "Resize" +msgstr "Изменение размера" + +#: app/examples/Image/PhotoTouch/.src/FMain.class:197 +msgid "Save" +msgstr "Сохранить" + +#: app/examples/Image/PhotoTouch/.src/FMain.class:198 +msgid "Save all" +msgstr "Сохранить все" + +#: app/examples/Image/PhotoTouch/.src/FMain.class:199 +msgid "Undo all changes" +msgstr "Откатить все изменения" + +#: app/examples/Image/PhotoTouch/.src/FMain.class:200 +msgid "Quit" +msgstr "Выход" + +#: app/examples/Image/PhotoTouch/.src/FMain.class:208 +msgid "H" +msgstr "H" + +#: app/examples/Image/PhotoTouch/.src/FMain.class:209 +msgid "V" +msgstr "V" + +#: app/examples/Image/PhotoTouch/.src/FMain.class:212 +msgid "M" +msgstr "M" + +#: app/examples/Image/PhotoTouch/.src/FMain.class:213 +msgid "I" +msgstr "I" + +#: app/examples/Image/PhotoTouch/.src/FMain.class:214 +msgid "B" +msgstr "B" + +#: app/examples/Image/PhotoTouch/.src/FMain.class:215 +msgid "N" +msgstr "N" + +#: app/examples/Image/PhotoTouch/.src/FMain.class:216 +msgid "E" +msgstr "E" + +#: app/examples/Image/PhotoTouch/.src/FMain.class:217 +msgid "D" +msgstr "D" + +#: app/examples/Image/PhotoTouch/.src/FMain.class:218 +msgid "O" +msgstr "O" + +#: app/examples/Image/PhotoTouch/.src/FMain.class:219 +msgid "/" +msgstr "/" + +#: app/examples/Image/PhotoTouch/.src/FMain.class:220 +msgid "R" +msgstr "R" + +#: app/examples/Image/PhotoTouch/.src/FMain.class:221 +msgid "*" +msgstr "*" + +#: app/examples/Image/PhotoTouch/.src/FMain.class:222 +msgid "S" +msgstr "S" + +#: app/examples/Image/PhotoTouch/.src/FMain.class:922 +msgid "image" +msgstr "изображение" + +#: app/examples/Image/PhotoTouch/.src/FMain.class:923 +msgid "image2" +msgstr "изображение2" + +#: app/examples/Image/PhotoTouch/.src/FScissors.form:16 +msgid "Cut" +msgstr "Вырезать" + diff --git a/app/examples/Image/PhotoTouch/.project b/app/examples/Image/PhotoTouch/.project new file mode 100644 index 00000000..aa188e8f --- /dev/null +++ b/app/examples/Image/PhotoTouch/.project @@ -0,0 +1,24 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.6.90 +Title=Simple Photo Editor +Startup=FMain +Icon=icon.png +Version=1.0.0 +Component=gb.image +Component=gb.gui +Component=gb.form +Component=gb.desktop.x11 +Component=gb.desktop +Component=gb.form.dialog +Component=gb.settings +Component=gb.image.effect +Description="Photo editor example.\n\nThis is a simple photo editor I made for my father. It has an overlay GUI with transparent buttons and state transitions. It is too complex for him, but it is still a good Gambas example!" +Authors="Benoît Minisini" +TabSize=2 +Translate=1 +Language=fr +Vendor=Example +Packager=1 +Tags=Example,2DGraphics,ImageProcessing,Graphics +Screenshot=.hidden/screenshots/phototouch.jpg +CreateMenu=1 diff --git a/app/examples/Image/PhotoTouch/.src/CAnimation.class b/app/examples/Image/PhotoTouch/.src/CAnimation.class new file mode 100644 index 00000000..6884983b --- /dev/null +++ b/app/examples/Image/PhotoTouch/.src/CAnimation.class @@ -0,0 +1,97 @@ +' Gambas class file + +Static Private All As New CAnimation[] + +Property Read Object As Object + +Private $hObject As Object +Private $sProperty As String +Private $fTarget As Float +Private $fTime As Float +Private $hTimer As Timer + +Static Public Sub Start(hObject As Control, sProperty As String, fTarget As Float, iTime As Integer) + + Dim hAnim As CAnimation + Dim aStop As New CAnimation[] + + For Each hAnim In All + If hAnim.Object = hObject Then aStop.Add(hAnim) + Next + + For Each hAnim In aStop + hAnim.Stop + Next + + hAnim = New CAnimation(hObject, sProperty, fTarget, iTime) + All.Add(hAnim) + +End + +Static Public Sub Exit() + + While All.Count + All[0].Stop + Wend + +End + + + +Public Sub _new(hObject As Control, sProperty As String, fTarget As Float, iTime As Integer) + + 'Debug hObject.Tag;; sProperty;; fTarget + + $hObject = hObject + $sProperty = sProperty + $fTarget = fTarget + $fTime = Timer + iTime / 1000 + + $hTimer = New Timer As "Timer" + $hTimer.Delay = 50 + $hTimer.Start + +End + +Public Sub Timer_Timer() + + Dim fValue As Float + Dim iSign As Integer + + fValue = Object.GetProperty($hObject, $sProperty) + + If Abs(fValue - $fTarget) < 1E-6 Then + Object.SetProperty($hObject, $sProperty, $fTarget) + {Stop} + Else + iSign = Sgn($fTarget - fValue) + fValue += ($fTarget - fValue) / (1000 * ($fTime - Timer) / $hTimer.Delay) + If Sgn($fTarget - fValue) <> iSign Then + Object.SetProperty($hObject, $sProperty, $fTarget) + {Stop} + Else + Object.SetProperty($hObject, $sProperty, fValue) + Endif + Endif + +Catch + + {Stop} + +End + +Public Sub Stop() + + $hTimer.Stop + $hTimer = Null + $hObject = Null + + All.Remove(All.Find(Me)) + +End + +Private Function Object_Read() As Object + + Return $hObject + +End diff --git a/app/examples/Image/PhotoTouch/.src/CButton.class b/app/examples/Image/PhotoTouch/.src/CButton.class new file mode 100644 index 00000000..d4313720 --- /dev/null +++ b/app/examples/Image/PhotoTouch/.src/CButton.class @@ -0,0 +1,189 @@ +' Gambas class file + +Export + +Inherits DrawingArea + +Event Click + +Property Image As Image +Property Opacity As Float +Property Highlight As Boolean +Property Shortcut As String + +Public Const MIN_OPACITY As Float = 0.3 +Public Const MAX_OPACITY As Float = 0.8 + +Private $hObs As Observer +Private $hImage As Image +Private $hDraw As Image +'Private $bInside As Boolean +'Private $hTimer As Timer +Private $fOpacity As Float = MIN_OPACITY +Private $bHighlight As Boolean +Private $hTimer As Timer +Private $sShortcut As String + +Public Sub _new() + + $hObs = New Observer(Me) As "DrawingArea" + '$hTimer = New Timer As "Timer" + '$hTimer.Delay = 50 + Me.Mouse = Mouse.Pointing + $hTimer = New Timer As "Timer" + +End + +Public Sub DrawingArea_Enter() + + 'Debug + + If Not Me.Enabled Then Return + CAnimation.Start(Me, "Opacity", MAX_OPACITY, 250) + +End + +Public Sub DrawingArea_Leave() + + 'Debug + + If Not Me.Enabled Then Return + CAnimation.Start(Me, "Opacity", MIN_OPACITY, 250) + +End + +Public Sub DrawingArea_MouseUp() + + If Not Me.Enabled Then Return + Raise Click + Stop Event + +End + +'Public Sub DrawingArea_DblClick() +' +' Raise Click +' Stop Event +' +'End + + +' Public Sub Timer_Timer() +' +' If $bInside Then +' $fOpacity = Min(MAX_OPACITY, $fOpacity + 0.1) +' If $fOpacity >= MAX_OPACITY Then +' $hTimer.Stop +' Endif +' Else +' $fOpacity = Max(MIN_OPACITY, $fOpacity - 0.1) +' If $fOpacity <= MIN_OPACITY Then +' $hTimer.Stop +' Endif +' Endif +' +' SetOpacity +' +' End + + +Public Sub DrawingArea_Draw() + + If $hDraw Then Draw.Image($hDraw, 2, 2) + + If $bHighlight Then + Paint.Begin(Me) + Paint.Brush = Paint.Color(Color.SetAlpha(Color.White, 192)) + Paint.Rectangle(0, 0, Me.W, Me.H) + Paint.Fill + Paint.End + Endif + +End + +Private Function Image_Read() As Image + + Return $hImage + +End + +Private Sub Image_Write(Value As Image) + + $hImage = Value.Stretch(Me.W - 4, Me.H - 4) + SetOpacity + +End + +Private Sub SetOpacity() + + Dim X, Y As Integer + + $hDraw = $hImage.Copy() + If $sShortcut Then + + Paint.Begin($hDraw) + + Paint.Font = Font["Bold,+3"] + + Paint.Brush = Paint.Color(Color.SetAlpha(Color.White, 64)) + 'For X = -2 To 2 + ' For Y = -2 To 2 + ' Paint.DrawText($sShortcut, $hDraw.W - 16 + X, $hDraw.H - 16 + Y, 16, 16, Align.Center) + ' Next + 'Next + Paint.Arc($hDraw.W - 12, $hDraw.H - 12, 12) + Paint.Fill + + Paint.Brush = Paint.Color(Color.SetAlpha(Color.Black, 64)) + Paint.DrawText($sShortcut, $hDraw.W - 24, $hDraw.H - 24, 24, 24, Align.Center) + + Paint.End + + Endif + + $hDraw.Opacity($fOpacity) + Me.Refresh + +End + +Private Function Opacity_Read() As Float + + Return $fOpacity + +End + +Private Sub Opacity_Write(Value As Float) + + 'Debug Value + $fOpacity = Max(0, Min(1, Value)) + SetOpacity + +End + +Private Function Highlight_Read() As Boolean + + Return $bHighlight + +End + +Private Sub Highlight_Write(Value As Boolean) + + $bHighlight = Value + Me.Refresh + +End + + +Private Function Shortcut_Read() As String + + Return $sShortcut + +End + +Private Sub Shortcut_Write(Value As String) + + $sShortcut = Value + SetOpacity + Me.Refresh + +End diff --git a/app/examples/Image/PhotoTouch/.src/FBrightness.class b/app/examples/Image/PhotoTouch/.src/FBrightness.class new file mode 100644 index 00000000..8a9bc6df --- /dev/null +++ b/app/examples/Image/PhotoTouch/.src/FBrightness.class @@ -0,0 +1,146 @@ +' Gambas class file + +Private $bNoChange As Boolean + +Private $MX As Integer +Private $MY As Integer +Private $hRect As Rect +Private $bBegin As Boolean + +Private btnUndo As CButton +Private btnApply As CButton +Private btnBrightness As CButton +Private btnContrast As CButton +Private btnGamma As CButton + +Public Sub _new() + + btnUndo = New CButton(Me) As "btnUndo" + btnUndo.Move(Me.W - 96 - Desktop.Scale * 4, Desktop.Scale * 3, 48, 48) + btnUndo.Image = Image.Load("undo.png") + + btnApply = New CButton(Me) As "btnApply" + btnApply.Move(btnUndo.X + btnUndo.W + Desktop.Scale, btnUndo.Y, 48, 48) + btnApply.Image = Image.Load("ok.png") + + btnBrightness = New CButton(Me) + btnBrightness.Enabled = False + btnBrightness.Move(Desktop.Scale * 3, Desktop.Scale * 10, 48, 48) + btnBrightness.Image = Image.Load("brightness.png") + btnBrightness.Shortcut = "B" + sldBrightness.Move(btnBrightness.X + 64, btnBrightness.Y + 4) + sldBrightness.Tag = btnBrightness + + btnContrast = New CButton(Me) + btnContrast.Enabled = False + btnContrast.Move(btnBrightness.X, btnBrightness.Y + 64, 48, 48) + btnContrast.Image = Image.Load("contrast.png") + btnContrast.Shortcut = "C" + sldContrast.Move(btnContrast.X + 64, btnContrast.Y + 4) + sldContrast.Tag = btnContrast + + btnGamma = New CButton(Me) + btnGamma.Enabled = False + btnGamma.Move(btnBrightness.X, btnContrast.Y + 64, 48, 48) + btnGamma.Image = Image.Load("gamma.png") + btnGamma.Shortcut = "G" + sldGamma.Move(btnGamma.X + 64, btnGamma.Y + 4) + sldGamma.Tag = btnGamma + +End + + +Public Sub Form_Open() + + Me.Center + +End + +Public Sub btnUndo_Click() + + $bNoChange = True + sldBrightness.Value = 50 + sldContrast.Value = 50 + sldGamma.Value = 50 + $bNoChange = False + Balance_Change + +End + +Public Sub btnApply_Click() + + If $bBegin Then FMain.Apply + +End + +Public Sub Balance_Change() + + If $bNoChange Then Return + If Not $bBegin Then + FMain.Begin + $bBegin = True + Endif + FMain.Balance(sldBrightness.Value, sldContrast.Value, sldGamma.Value) + +End + +Public Sub panBrightness_MouseDown() + + $MX = Mouse.ScreenX + $MY = Mouse.ScreenY + $hRect = Rect(Me.X, Me.Y, Me.W, Me.H) + +End + +Public Sub panBrightness_MouseMove() + + Dim X, Y As Integer + + X = Min(Max($hRect.X + Mouse.ScreenX - $MX, 0), FMain.W - $hRect.W) + Y = Min(Max($hRect.Y + Mouse.ScreenY - $MY, 0), FMain.H - $hRect.H) + Me.Move(X, Y) + +End + +Public Sub Form_KeyPress() + + If Key.Code = Key.Backspace Then + btnUndo_Click + Stop Event + Return + Endif + + If Key.Code = Key.Return Or If Key.Code = Key.Enter Then + btnApply_Click + Stop Event + Return + Endif + + Select Case UCase(Key.Text) + Case "B" + sldBrightness.SetFocus + Case "C" + sldContrast.SetFocus + Case "G" + sldGamma.SetFocus + Case Else + FMain.Form_KeyPress + Return + End Select + + Stop Event + +End + +Public Sub Balance_GotFocus() + + CAnimation.Start(Last.Tag, "Opacity", CButton.MAX_OPACITY, 250) + +End + +Public Sub Balance_LostFocus() + + CAnimation.Start(Last.Tag, "Opacity", CButton.MIN_OPACITY, 250) + +End + diff --git a/app/examples/Image/PhotoTouch/.src/FBrightness.form b/app/examples/Image/PhotoTouch/.src/FBrightness.form new file mode 100644 index 00000000..37326354 --- /dev/null +++ b/app/examples/Image/PhotoTouch/.src/FBrightness.form @@ -0,0 +1,37 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,74,40) + Background = &HFFFFFF& + Border = False + Utility = True + Stacking = Window.Above + SkipTaskbar = True + Opacity = 50 + { panBrightness Panel + MoveScaled(1,1,72,38) + Background = &H000000& + { sldBrightness Slider Balance + Name = "sldBrightness" + MoveScaled(13,13,56,3) + Value = 50 + } + { sldContrast Slider Balance + Name = "sldContrast" + MoveScaled(13,22,56,3) + Value = 50 + } + { Label1 Label + MoveScaled(2,2,52,6) + Font = Font["Bold,+5"] + Foreground = Color.TextBackground + AutoResize = True + Text = ("Balance") + } + { sldGamma Slider Balance + Name = "sldGamma" + MoveScaled(13,31,56,3) + Value = 50 + } + } +} diff --git a/app/examples/Image/PhotoTouch/.src/FMain.class b/app/examples/Image/PhotoTouch/.src/FMain.class new file mode 100644 index 00000000..f0c33a07 --- /dev/null +++ b/app/examples/Image/PhotoTouch/.src/FMain.class @@ -0,0 +1,1117 @@ +' Gambas class file + +Private CACHE_ROOT As String = "~/.cache/PhotoTouch" +Private CACHE_DIR As String + +Private $aPath As String[] +Private $sPath As String +Private $sDir As String +Private $iIndex As Integer +Private $hImage As Image +Private $hZoom As Image +Private $hTemp As Image +Private $fZoom As Float = 1 +'Private $sInfo As String +Private $sMode As String +Private $bModify As Boolean +Private $cButton As New Collection +Private $bFilm As Boolean = True +Private $bReloadFilm As Boolean +Private $cShortcut As New Collection +Private $hSave As Image +Private $hUndoStack As Image[] + +Private $MX As Integer +Private $MY As Integer + +Private btnPrev As CButton +Private btnNext As CButton +Private dwgPath As DrawingArea + +Private Sub UpdateSaveIcon() + + $cButton["save"].Visible = Exist(CACHE_DIR &/ File.Name($sPath)) Or $bModify + +End + +Private Sub UpdateFilmMode() + + Dim sTag As String + Dim hCtrl As Control + + If $bFilm Then + 'ivwImage.IconSize = 128 + svwImage.Hide + panToolbar.Hide + panBrowser.Show + panToolbarBrowser.Show + ivwImage.SetFocus + Else + svwImage.Show + panToolbar.Show + panBrowser.Hide + panToolbarBrowser.Hide + $cButton["film"].Opacity = CButton.MAX_OPACITY + svwImage.SetFocus + Endif + + btnPrev.Visible = Not $bFilm + btnNext.Visible = Not $bFilm + + If $bFilm Then + $hImage = Null + FillImageBrowser + Else + Try $iIndex = CInt(ivwImage.Key) + LoadImage + Endif + +End + +Private Sub GetImage(Optional bReset As Boolean) As Boolean + + Dim hImage As Image + + If Not bReset Then + Try $sPath = CACHE_DIR &/ $aPath[$iIndex] + If Exist($sPath) Then Try hImage = Image.Load($sPath) + Endif + + If Not hImage Then + Try $sPath = $sDir &/ $aPath[$iIndex] + If $sPath Then Try hImage = Image.Load($sPath) + Endif + + $hImage = hImage + +End + + +Private Sub LoadImage(Optional bReset As Boolean) As Boolean + + Inc Application.Busy + + Me.End + SaveImage + + GetImage(bReset) + + If $hImage Then + svwImage.ResizeContents($hImage.W, $hImage.H) + svwImage.Show + lblError.Hide + Else + svwImage.Hide + lblError.Show + If $aPath.Count = 0 Then + lblError.Text = ("No image in directory") + Else + lblError.Text = ("Unable to load image") + Endif + Endif + + $bModify = False + $hUndoStack = New Image[] + SetZoom(0) + UpdateSaveIcon + dwgInfo.Raise + dwgInfo.Refresh + Me.Refresh + + Dec Application.Busy + +End + +Private Sub CreateButtons(aButton As String[], cTooltip As Collection, hParent As Container) + + Dim sKey As String + Dim sImg As String + Dim hPanel As Panel + Dim hButton As CButton + Dim iPos As Integer + + For Each sKey In aButton + + If sKey = "<->" Then + hPanel = New Panel(hParent) + hPanel.Expand = True + hPanel.Resize(8, 48) + Else If sKey = "-" Then + hPanel = New Panel(hParent) + hPanel.Resize(8, 48) + Else + + sImg = sKey + iPos = InStr(sImg, "#") + If iPos Then sImg = Left(sImg, iPos - 1) + + hButton = New CButton(hParent) As "Button" + hButton.Resize(48, 48) + hButton.Image = Image.Load(sImg & ".png") + hButton.Tag = sKey + hButton.Tooltip = cTooltip[sImg] + hButton.Shortcut = $cShortcut[sImg] + $cButton[hButton.Tag] = hButton + Endif + Next + +End + + +Public Sub _new() + + Dim hCtrl As Control + Dim sImg As String + Dim hButton As CButton + Dim cTooltip As Collection + Dim aButton As String[] + + Application.MainWindow = Me + + Try Mkdir File.Dir(File.Dir(CACHE_ROOT)) + Try Mkdir File.Dir(CACHE_ROOT) + Try Mkdir CACHE_ROOT + + cTooltip = [ + "film": ("Browse photos"), + "photo": ("Show photo"), + "usb": ("Select photo directory"), + "zoom-in": ("Zoom in"), + "zoom-out": ("Zoom out"), + "zoom-original": ("Zoom 100%"), + "zoom-fit": ("Fit to window"), + "hflip": ("Flip horizontally"), + "vflip": ("Flip vertically"), + "rotate-left": ("Rotate left"), + "rotate-right": ("Rotate right"), + "magic": ("Automatic correction"), + "invert": ("Invert"), + "blur": ("Blur"), + "sharpen": ("Sharpen"), + "normalize": ("Normalize"), + "despeckle": ("Remove speckles"), + "oil": ("Oil painting effect"), + "scissors": ("Crop image"), + "balance": ("Balance"), + "resize": ("Resize"), + "save": ("Save"), + "save-all": ("Save all"), + "undo": ("Undo all changes"), + "quit": ("Quit")] + + $cShortcut = [ + "usb": "!", + "zoom-in": "+", + "zoom-out": "-", + "zoom-original": "1", + "zoom-fit": "0", + "hflip": ("H"), + "vflip": ("V"), + "rotate-left": "(", + "rotate-right": ")", + "magic": ("M"), + "invert": ("I"), + "blur": ("B"), + "sharpen": ("N"), + "normalize": ("E"), + "despeckle": ("D"), + "oil": ("O"), + "scissors": ("/"), + "resize": ("R"), + "balance": ("*"), + "save": ("S")] + + aButton = ["film", "-", "zoom-in", "zoom-out", "zoom-original", "zoom-fit", "-", "hflip", "vflip", "rotate-left", "rotate-right", "-", + "magic", "invert", "blur", "sharpen", "normalize", "despeckle", "oil", "-", "scissors", "resize", "balance", "<->", "save", "undo", "quit"] + CreateButtons(aButton, cTooltip, panToolbar) + + aButton = ["photo", "usb", "save-all", "-"] + CreateButtons(aButton, cTooltip, panToolbarBrowser) + + dwgPath = New DrawingArea(panToolbarBrowser) As "dwgPath" + dwgPath.Expand = True + dwgPath.Font = Font["Bold,+5"] + + aButton = ["hflip#2", "vflip#2", "rotate-left#2", "rotate-right#2", "-", "save#2", "undo#2", "quit#2"] + CreateButtons(aButton, cTooltip, panToolbarBrowser) + + btnPrev = New CButton(Me) As "Button" + btnPrev.Resize(64, 64) + btnPrev.Ignore = True + btnPrev.Tag = "previous" + btnPrev.Image = Image.Load("previous.png") + + btnNext = New CButton(Me) As "Button" + btnNext.Resize(64, 64) + btnNext.Ignore = True + btnNext.Tag = "next" + btnNext.Image = Image.Load("next.png") + + panToolbar.Raise + panToolbarBrowser.Raise + +End + + +Public Sub svwImage_Draw() + + Dim X As Integer + Dim Y As Integer + Dim XR As Integer + Dim YR As Integer + Dim SX, SX2 As Integer + Dim SY, SY2 As Integer + Dim DX As Integer + Dim DY As Integer + Dim C As Integer + Dim SW, SH As Integer + Dim hZoom As Image + Dim iZoom As Integer + + If Not $hImage Then Return + + If $fZoom > 1 Then + + iZoom = $fZoom + + Draw.LineStyle = Line.None + Draw.FillStyle = Fill.Solid + + DX = Max(0, (Me.W - $hImage.W * iZoom) / 2) + DY = Max(0, (Me.H - $hImage.H * iZoom) / 2) + + SX = (Draw.Clip.X - DX) \ iZoom + SY = (Draw.Clip.Y - DY) \ iZoom + SX2 = (Draw.Clip.X - DX + Draw.Clip.W - 1) \ iZoom + SY2 = (Draw.Clip.Y - DY + Draw.Clip.H - 1) \ iZoom + + SX = Max(0, SX) + SX2 = Min($hImage.Width - 1, SX2) + SW = SX2 - SX + 1 + + SY = Max(0, SY) + SY2 = Min($hImage.Height - 1, SY2) + SH = SY2 - SY + 1 + + 'If $fZoom > 5 Then + ' Draw.LineStyle = Line.Solid + ' Draw.Foreground = &H989898 + 'Else + ' Draw.LineStyle = Line.None + 'Endif + + Draw.Zoom($hImage, iZoom, SX * iZoom + DX, SY * iZoom + DY, SX + svwImage.ScrollX \ iZoom, SY + svwImage.ScrollY \ iZoom, SW, SH) + + Else If $fZoom = 1 Then + + If $hImage.W < Me.W Then + X = (Me.W - $hImage.W) / 2 + Else + X = - svwImage.ScrollX + Endif + + If $hImage.H < Me.H Then + Y = (Me.H - $hImage.H) / 2 + Else + Y = - svwImage.ScrollY + Endif + + Draw.Image($hImage, X, Y) + + Else + + If $hZoom.W < Me.W Then + X = (Me.W - $hZoom.W) / 2 + Else + X = - svwImage.ScrollX + Endif + + If $hZoom.H < Me.H Then + Y = (Me.H - $hZoom.H) / 2 + Else + Y = - svwImage.ScrollY + Endif + + Draw.Image($hZoom, X, Y) + + Endif + +End + +Public Sub Form_Resize() + + panToolbar.Move(0, 0, Me.W, 48 + Desktop.Scale * 2) + panToolbarBrowser.Move(0, 0, Me.W, 48 + Desktop.Scale * 2) + panMargin.H = panToolbar.H + dwgInfo.Move(8, Me.H - dwgInfo.H, Me.W, dwgInfo.H) + btnPrev.Move(8, (Me.H - btnPrev.H) / 2) + btnNext.Move(Me.W - 8 - btnNext.W, (Me.H - btnNext.H) / 2) + +End + +Public Sub Button_Click() + + Action(Last.Tag) + +End + +Private Sub UpdateZoom() + + Dim X, Y As Float + + If Not $hImage Then Return + + If $fZoom < 1 Then + $hZoom = $hImage.Stretch($hImage.W * $fZoom, $hImage.H * $fZoom) + Else + $hZoom = Null + Endif + + X = (svwImage.ScrollX + svwImage.ClientW / 2) / svwImage.ScrollW + Y = (svwImage.ScrollY + svwImage.ClientH / 2) / svwImage.ScrollH + + svwImage.ResizeContents($hImage.W * $fZoom, $hImage.H * $fZoom) + svwImage.Scroll(X * svwImage.ScrollW - svwImage.ClientW / 2, Y * svwImage.ScrollH - svwImage.ClientH / 2) + + dwgInfo.Refresh + Me.Refresh + +End + +Private Sub SetZoom(fZoom As Float) + + If Not $hImage Then Return + + If fZoom = 0 Then + $fZoom = 0 + fZoom = Min(Me.W / $hImage.W, Me.H / $hImage.H) + fZoom = Min(1, fZoom) + Endif + + fZoom = Max(1 / 32, Min(32, fZoom)) + If fZoom = $fZoom Then Return + If fZoom <> 1 Then + If ($hImage.W * fZoom) < 96 Or If ($hImage.H * fZoom) < 96 Then Return + Endif + + $fZoom = fZoom + UpdateZoom + +End + +Public Sub SetMode(sMode As String) + + If $sMode Then + $cButton[$sMode].Highlight = False + Cancel + Select Case $sMode + Case "balance" + FBrightness.Close + Case "scissors" + FScissors.Close + Case "resize" + FResize.Close + End Select + Endif + + If sMode = $sMode Then + $sMode = "" + Return + Endif + + If sMode Then + + $cButton[sMode].Highlight = True + + Select Case sMode + Case "balance" + FBrightness.Show + Case "scissors" + FScissors.Show + Case "resize" + FResize.Show + End Select + + Endif + + $sMode = sMode + +End + + +Private Sub Action(sAction As String) + + Dim iPos As Integer + + Select Case sAction + + Case "usb" + SetMode("") + Dialog.Title = ("Select photo directory") + Dialog.Path = $sDir + If Dialog.SelectDirectory() Then Return + + End Select + + Inc Application.Busy + + iPos = RInStr(sAction, "#") + If iPos Then sAction = Left(sAction, iPos - 1) + + Select Case sAction + + Case "film" + Me.End + SaveImage + $bFilm = True + UpdateFilmMode + + Case "photo" + If $aPath.Count Then + $bFilm = False + UpdateFilmMode + Endif + + Case "previous" + Dec $iIndex + If $iIndex < 0 Then $iIndex = $aPath.Max + LoadImage + + Case "next" + Inc $iIndex + If $iIndex > $aPath.Max Then $iIndex = 0 + LoadImage + + Case "zoom-in" + SetZoom(2 ^ Int(Log2($fZoom)) * 2) + + Case "zoom-out" + SetZoom(2 ^ Int(Log2($fZoom) - 0.001)) + + Case "zoom-original" + SetZoom(1) + + Case "zoom-fit" + SetZoom(0) + + Case "quit" + SetMode("") + SaveImage + Me.Close + + Case "balance", "scissors", "resize" + 'If Not $hImage Then Return + SetMode(sAction) + + Case "usb" + SetDir(Dialog.Path) + + Case "undo" + + If Not $hImage Then + + ivwImage.MoveFirst + While ivwImage.Available + If ivwImage.Item.Selected Then + $iIndex = CInt(ivwImage.Item.Key) + GetImage + RemoveImage + Endif + ivwImage.MoveNext + Wend + + FillImageBrowser(True) + $hImage = Null + + Else + + SetMode("") + If $hUndoStack.Count Then + $hImage = $hUndoStack[$hUndoStack.Max] + $hUndoStack.Remove($hUndoStack.Max) + $bModify = $hUndoStack.Count > 0 + If Not $bModify Then RemoveImage + UpdateZoom + Else + LoadImage(True) + RemoveImage + Endif + + Endif + + Case "save" + + If Not $hImage Then + + $iIndex = CInt(ivwImage.Key) + $sPath = CACHE_DIR &/ File.Name($aPath[$iIndex]) + If Exist($sPath) Then + SaveImageDefinitely + FillImageBrowser(True) + Endif + $hImage = Null + + Else + + SetMode("") + SaveImageDefinitely + + Endif + + Case "save-all" + + ivwImage.MoveFirst + While ivwImage.Available + 'If ivwImage.Item.Selected Then + $iIndex = CInt(ivwImage.Item.Key) + GetImage + SaveImageDefinitely + 'Endif + ivwImage.MoveNext + Wend + + FillImageBrowser(True) + $hImage = Null + + Case Else + + If Not $hImage Then + + ivwImage.MoveFirst + While ivwImage.Available + If ivwImage.Item.Selected Then + $iIndex = CInt(ivwImage.Item.Key) + GetImage + Select Case sAction + Case "hflip" + $hImage.Mirror(True, False) + Case "vflip" + $hImage.Mirror(False, True) + Case "rotate-left" + $hImage = $hImage.Rotate(Pi(0.5)) + Case "rotate-right" + $hImage = $hImage.Rotate(Pi(-0.5)) + End Select + $bModify = True + SaveImage + Endif + ivwImage.MoveNext + Wend + + FillImageBrowser(True) + $hImage = Null + + Else + + SetMode("") + + Select Case sAction + Case "hflip" + PushUndo() + $hImage.Mirror(True, False) + Case "vflip" + PushUndo() + $hImage.Mirror(False, True) + Case "rotate-left" + PushUndo() + $hImage = $hImage.Rotate(Pi(0.5)) + Case "rotate-right" + PushUndo() + $hImage = $hImage.Rotate(Pi(-0.5)) + Case "oil" + PushUndo() + $hImage = ImageMagick("-paint " & CStr(Max(3, Min($hImage.W, $hImage.H) \ 256))) + Case "magic" + PushUndo() + $hImage = ImageMagick("-auto-gamma -auto-level") + Case "invert" + PushUndo() + $hImage.Invert() + 'Case "equalize" + ' $hImage = ImageMagick("-equalize") + Case "despeckle" + PushUndo() + $hImage = ImageMagick("-despeckle") + Case "normalize" + PushUndo() + $hImage = ImageMagick("-normalize") + Case "blur" + PushUndo() + $hImage = ImageMagick("-blur 8") '$hImage.OilPaint() + Case "sharpen" + PushUndo() + $hImage = ImageMagick("-sharpen 8") '$hImage.OilPaint() + + End Select + + $bModify = True + UpdateSaveIcon + UpdateZoom + + Endif + + End Select + + Dec Application.Busy + +End + +Public Sub svwImage_MouseDown() + + $MX = Mouse.X + svwImage.ScrollX + $MY = Mouse.Y + svwImage.ScrollY + 'Debug $MX;; $MY + +End + +Public Sub svwImage_MouseMove() + + If Mouse.Left Then + 'Debug Mouse.X - $MX;; Mouse.Y - $MY + svwImage.Scroll($MX - Mouse.X, $MY - Mouse.Y) + Endif + +End + +Private Sub PaintOutlineText(sText As String, X As Float, Y As Float, W As Float, H As Float) + + ' Dim I, J As Integer + ' + ' Paint.Brush = Paint.Color(Color.SetAlpha(Color.White, 128)) + ' For I = -1 To 1 + ' For J = -1 To 1 + ' Paint.DrawRichText(sText, X + I + 2, Y + J + 2, 4096, H - 4, Align.Left) + ' Next + ' Next + + Paint.Brush = Paint.Color(Color.Black) + Paint.DrawRichTextShadow(sText, X + 2, Y + 2, 4096, H - 4, Align.Left, 4) + Paint.Brush = Paint.Color(Color.White) + Paint.DrawRichText(sText, X + 2, Y + 2, 4096, H - 4, Align.Left) + +End + + +Public Sub dwgInfo_Draw() + + Dim sText As String + Dim sSpace As String + + If Not $hImage Then Return + + With Stat($sPath) + sSpace = String$(6, " ") + sText = "" & Html(File.Name($sPath)) & "" & sSpace & Html(Format(.LastModified, gb.LongDate)) + sText &= sSpace & $hImage.W & " x " & $hImage.H & " (" & Format($fZoom, "0%") & ")" + End With + + PaintOutlineText(sText, 0, 0, dwgInfo.W, dwgInfo.H) + +End + +Public Sub Form_KeyPress() + + Dim sShortcut As String + + Select Case Key.Code + + Case Key.Esc + If $sMode Then + SetMode("") + Else + Action("quit") + Endif + Stop Event + Return + + Case Key.BackSpace + Action("undo") + Stop Event + Return + + End Select + + If Key.Text Then + For Each sShortcut In $cShortcut + If String.UCase(Key.Text) = sShortcut Then + If $cButton[$cShortcut.Key].Parent.Visible Then + Action($cShortcut.Key) + Stop Event + Return + Endif + Endif + Next + Endif + +End + +Public Sub Begin() + + $hTemp = $hImage.Copy() + +End + +Public Sub End() + + $hTemp = Null + UpdateZoom + SetMode("") + 'SaveImage + Me.Refresh + +End + +Public Sub Apply() + + $hTemp = $hImage + {End} + +End + +Public Sub Cancel() + + If Not $hTemp Then Return + $hImage = $hTemp.Copy() + UpdateZoom + Me.Refresh + +End + +Public Sub GetCurrentImage() As Image + + Return $hImage + +End + +Public Sub Balance(iBrightness As Integer, iContrast As Integer, iGamma As Integer) + + $hImage = $hTemp.Copy() + $hImage.Balance((iBrightness - 50) / 50, (iContrast - 50) / 50, (iGamma - 50) / 50) + $bModify = True + UpdateZoom + Me.Refresh + +End + +Public Sub Cut() + + Dim X, Y, W, H As Integer + Dim hRect As Rect + + W = FScissors.W / $fZoom + H = FScissors.H / $fZoom + X = (svwImage.ScrollX + FScissors.X) / $fZoom + Y = (svwImage.ScrollY + FScissors.Y) / $fZoom + + If $hImage.W * $fZoom <= Me.W Then X -= (Me.W / $fZoom - $hImage.W) / 2 + If $hImage.H * $fZoom <= Me.H Then Y -= (Me.H / $fZoom - $hImage.H) / 2 + + hRect = Rect(X, Y, W, H) + hRect = hRect.Intersection(Rect(0, 0, $hImage.W, $hImage.H)) + + If Not hRect Then Return + + $hImage = $hImage.Copy(hRect.X, hRect.Y, hRect.W, hRect.H) + $bModify = True + $hTemp = $hImage + Me.End + SetZoom(0) + +End + +Public Sub Stretch(W As Integer, H As Integer) + + Inc Application.Busy + $hImage = $hImage.Stretch(W, H) + $bModify = True + $hTemp = $hImage + Me.End + SetZoom(0) + Dec Application.Busy + +End + + +Public Sub Form_Activate() + + If $sDir = "" Then SetDir(Settings["Directory", User.Home]) + +End + + +Private Sub SetDir(sDir As String) + + Inc Application.Busy + + 'Shell "cd " & Shell(CACHE_DIR) & "; rm -f *" Wait + + CACHE_DIR = CACHE_ROOT &/ Replace(sDir, "/", ":") + + $sDir = sDir + Settings["Directory"] = $sDir + $aPath = New String[] + Try $aPath = Dir(sDir, "*.{jpg,JPG,jpeg,JPEG,png,PNG,bmp,BMP,gig,GIF}").Sort() + $iIndex = 0 + $bReloadFilm = True + UpdateFilmMode + + Dec Application.Busy + +End + +Private Sub SaveImage() As String + + If Not $hImage Then Return + If Not $bModify Then Return + + Try Mkdir CACHE_DIR + Try Kill CACHE_DIR &/ ".thumb." & File.Name($sPath) + $bReloadFilm = True + $hImage.Save(CACHE_DIR &/ File.Name($sPath), 80) + $bModify = False + UpdateSaveIcon + Return CACHE_DIR &/ File.Name($sPath) + +Catch + + Message.Error(Error.Text) + +End + +Private Sub RemoveImage() + + Try Kill CACHE_DIR &/ File.Name($sPath) + Try Kill CACHE_DIR &/ ".thumb." & File.Name($sPath) + $bReloadFilm = True + If Dir(CACHE_DIR).Count = 0 Then Rmdir CACHE_DIR + UpdateSaveIcon + +Catch + + Message.Error(Error.Text) + +End + +Private Sub SaveImageDefinitely() + + Dim sPath As String + + SaveImage + If Exist(CACHE_DIR &/ File.Name($sPath)) Then + sPath = $sDir &/ File.Name($sPath) + Try Kill sPath & "~" + Move sPath To sPath & "~" + Copy CACHE_DIR &/ File.Name($sPath) To sPath + RemoveImage + Endif + +Catch + + Message.Error(Error.Text) + +End + + +Private Sub ImageMagick(sCommand As String) As Image + + Dim sPath, sPath2 As String + Dim hImage As Image + + Inc Application.Busy + + sPath = File.SetExt(Temp$("image"), File.Ext($sPath)) + sPath2 = File.SetExt(Temp$("image2"), File.Ext($sPath)) + + $hImage.Save(sPath, 100) + + Shell "convert " & Shell(sPath) & " " & sCommand & " " & Shell(sPath2) Wait + hImage = Image.Load(sPath2) + Kill sPath + Kill sPath2 + + Dec Application.Busy + UpdateSaveIcon + + Return hImage + +End + +Private Sub GetThumb(sPath As String) As Image + + Dim sName As String + Dim sThumb As String + Dim hImage As Image + Dim bModified As Boolean + + sName = File.Name(sPath) + + If Exist(CACHE_DIR &/ sName) Then + sPath = CACHE_DIR &/ sName + bModified = True + Endif + + sThumb = CACHE_DIR &/ ".thumb." & sName + If Exist(sThumb) Then + 'If Stat(sThumb).LastModified >= Stat(sPath).LastModified Then + hImage = Image.Load(sThumb) + 'Endif + Endif + + If Not hImage Then + hImage = Image.Load(sPath) + If hImage.W > 256 Or If hImage.H > 256 Then + If hImage.W > hImage.H Then + hImage = hImage.Stretch(256, 256 * hImage.H / hImage.W) + Else + hImage = hImage.Stretch(256 * hImage.W / hImage.H, 256) + Endif + Endif + Paint.Begin(hImage) + Paint.Rectangle(0, 0, hImage.W, hImage.H) + Paint.LineWidth = 0.5 + Paint.Brush = Paint.Color(Color.Black) + Paint.Stroke + If bModified Then + If Not $hSave Then $hSave = Image.Load("save.png").Stretch(24, 24) + Paint.DrawImage($hSave, Paint.W - 24 - 8, 8) + Endif + Paint.End + Try Kill sThumb + hImage.Save(sThumb) + Endif + + Return hImage + +End + +Private Sub GetSize(iSize As Long) As String + + Dim sSize As String + + If iSize < 1024 Then Return iSize & " b" + Return Format(iSize \ 1024, "#,##0") & " K" + +End + + +Private Sub FillImageBrowser(Optional bNoWait As Boolean) + + Dim I As Integer + Dim hImage As Image + Dim sText As String + Dim fLastTime As Float + Dim sKey As String + + If $bReloadFilm Then + + Inc Application.Busy + + fLastTime = Timer + + Try Mkdir CACHE_DIR + + sKey = ivwImage.Key + + ivwImage.Clear + ivwImage.GridSize = 280 \ Desktop.Scale + + For I = 0 To $aPath.Max + + Try hImage = GetThumb($sDir &/ $aPath[i]) + If Error Then + Error Error.Where; ": "; Error.Text + hImage = Picture["icon:/256/image"].Image + Endif + With Stat($sDir &/ $aPath[I]) + sText = "" & Html(File.Name($aPath[I])) & "
    " & Format(.LastModified, gb.LongDate) & "
    " & GetSize(.Size) + End With + ivwImage.Add(I, "", hImage.Picture).RichText = sText + If (Timer - fLastTime) > 1 Then + fLastTime = Timer + Wait + Endif + Next + + Try ivwImage.Key = sKey + + Dec Application.Busy + $bReloadFilm = False + + Endif + + If ivwImage.Count Then + ivwImage.Key = $iIndex + ivwImage[$iIndex].EnsureVisible + panBrowser.Show + '$cButton["photo"].Show + Else + '$cButton["photo"].Hide + panBrowser.Hide + lblError.Text = ("No image in directory") + lblError.Show + Endif + +End + +Public Sub ivwImage_KeyPress() + + If Key.Code = Key.Enter Or If Key.Code = Key.Return Then ivwImage_Activate + +End + + +Public Sub ivwImage_Activate() + + $bFilm = False + $iIndex = CInt(ivwImage.Key) + UpdateFilmMode + +End + +Public Sub Form_Close() + + CAnimation.Exit + +End + +Public Sub svwImage_KeyPress() + + Select Case Key.Code + + Case Key.Up + svwImage.Scroll(svwImage.ScrollX, svwImage.ScrollY - 64) + + Case Key.Down + svwImage.Scroll(svwImage.ScrollX, svwImage.ScrollY + 64) + + Case Key.Left + svwImage.Scroll(svwImage.ScrollX - 64, svwImage.ScrollY) + + Case Key.Right + svwImage.Scroll(svwImage.ScrollX + 64, svwImage.ScrollY) + + Case Key.PageUp + Action("previous") + + Case Key.PageDown + Action("next") + + Case Key.Enter, Key.Return + Action("film") + + End Select + +End + +Public Sub PushUndo() + + $hUndoStack.Add($hImage.Copy()) + +End + +Public Sub dwgPath_Draw() + + 'Debug Paint.Font.ToString() + PaintOutlineText($sDir, 0, 0, Paint.W, Paint.H) + +End diff --git a/app/examples/Image/PhotoTouch/.src/FMain.form b/app/examples/Image/PhotoTouch/.src/FMain.form new file mode 100644 index 00000000..cc67ddd8 --- /dev/null +++ b/app/examples/Image/PhotoTouch/.src/FMain.form @@ -0,0 +1,65 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,82,72) + Icon = Picture["icon.png"] + Border = False + Maximized = True + Arrangement = Arrange.Fill + { svwImage ScrollArea + MoveScaled(6,25,24,24) + Visible = False + Background = Color.Background + Mouse = Mouse.SizeAll + Border = False + ScrollBar = Scroll.None + } + { panToolbar HBox + MoveScaled(1,1,75,5) + Ignore = True + AutoResize = True + Spacing = True + Margin = True + } + { lblError Label + MoveScaled(15,52,46,9) + Visible = False + Font = Font["Bold,+5"] + Background = Color.Background + Foreground = Color.LightForeground + Alignment = Align.Center + } + { panBrowser Panel + MoveScaled(48,17,24,30) + Background = Color.Background + Arrangement = Arrange.Vertical + Margin = True + { panMargin Panel + MoveScaled(4,1,12,4) + } + { ivwImage IconView + MoveScaled(3,11,16,16) + Font = Font["+2"] + Background = Color.Background + Foreground = Color.LightForeground + Expand = True + Mode = Select.Multiple + IconLines = 3 + Border = False + } + } + { panToolbarBrowser HBox + MoveScaled(1,7,75,5) + Visible = False + Ignore = True + AutoResize = True + Spacing = True + Margin = True + } + { dwgInfo DrawingArea + MoveScaled(5,64,20,6) + Font = Font["+5"] + Foreground = Color.LightForeground + Ignore = True + } +} diff --git a/app/examples/Image/PhotoTouch/.src/FResize.class b/app/examples/Image/PhotoTouch/.src/FResize.class new file mode 100644 index 00000000..7ee42411 --- /dev/null +++ b/app/examples/Image/PhotoTouch/.src/FResize.class @@ -0,0 +1,57 @@ +' Gambas class file + +Private $aSize As Float[] = [1 / 4, 1 / 3, 1 / 2, 2 / 3, 3 / 4, 1] +Private btnApply As CButton + +Public Sub sldResize_Change() + + Dim W, H As Integer + + With FMain.GetCurrentImage() + W = .W * $aSize[sldResize.Value] + H = .H * $aSize[sldResize.Value] + End With + lblSize.Text = Format($aSize[sldResize.Value], "0%") & " - " & W & " x " & H + +End + +Public Sub _new() + + btnApply = New CButton(Me) As "btnApply" + btnApply.Move(Me.W - 48 - Desktop.Scale * 2, Desktop.Scale * 2, 48, 48) + btnApply.Image = Image.Load("ok.png") + +End + +Public Sub Form_Open() + + Me.Center + sldResize.SetFocus + sldResize_Change + +End + +Public Sub btnApply_Click() + + Dim W, H As Integer + + With FMain.GetCurrentImage() + W = .W * $aSize[sldResize.Value] + H = .H * $aSize[sldResize.Value] + End With + + FMain.Stretch(W, H) + +End + +Public Sub Form_KeyPress() + + If Key.Code = Key.Enter Or If Key.Code = Key.Return Then + btnApply_Click + Stop Event + Return + Endif + + FMain.Form_KeyPress + +End diff --git a/app/examples/Image/PhotoTouch/.src/FResize.form b/app/examples/Image/PhotoTouch/.src/FResize.form new file mode 100644 index 00000000..931fdfa3 --- /dev/null +++ b/app/examples/Image/PhotoTouch/.src/FResize.form @@ -0,0 +1,40 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,55,24) + Background = &HFFFFFF& + Border = False + Utility = True + Stacking = Window.Above + SkipTaskbar = True + Opacity = 50 + { panBrightness Panel + MoveScaled(1,1,53,22) + Background = &H000000& + { PictureBox1 PictureBox + MoveScaled(2,11,8,8) + Picture = Picture["resize.png"] + Stretch = True + Alignment = Align.Center + } + { sldResize Slider + MoveScaled(13,11,36,3) + MaxValue = 5 + PageStep = 1 + Value = 5 + } + { lblTitle Label + MoveScaled(2,2,52,6) + Font = Font["Bold,+5"] + Foreground = Color.TextBackground + AutoResize = True + Text = ("Resize") + } + { lblSize Label + MoveScaled(14,14,34,5) + Font = Font["Bold,+5"] + Foreground = Color.TextBackground + AutoResize = True + } + } +} diff --git a/app/examples/Image/PhotoTouch/.src/FScissors.class b/app/examples/Image/PhotoTouch/.src/FScissors.class new file mode 100644 index 00000000..a2a11522 --- /dev/null +++ b/app/examples/Image/PhotoTouch/.src/FScissors.class @@ -0,0 +1,260 @@ +' Gambas class file + +Private $aScissors As Panel[] + +Private Enum S_N, S_S, S_W, S_E, S_NW, S_NE, S_SW, S_SE +Private HANDLE_SIZE As Integer + +Private $aMouse As Integer[] +Private $aOpacity As Integer[] + +Private $MX As Integer +Private $MY As Integer +Private $hRect As Rect +Private $bResize As Boolean + +Private btnCut As CButton + +Public Sub Form_Resize() + + $aScissors[S_NW].Move(0, 0, HANDLE_SIZE, HANDLE_SIZE) + $aScissors[S_NE].Move(Me.W - HANDLE_SIZE, 0, HANDLE_SIZE, HANDLE_SIZE) + $aScissors[S_SW].Move(0, Me.H - HANDLE_SIZE, HANDLE_SIZE, HANDLE_SIZE) + $aScissors[S_SE].Move(Me.W - HANDLE_SIZE, Me.H - HANDLE_SIZE, HANDLE_SIZE, HANDLE_SIZE) + $aScissors[S_N].Move(HANDLE_SIZE, 0, Me.W - HANDLE_SIZE * 2, HANDLE_SIZE) + $aScissors[S_S].Move(HANDLE_SIZE, Me.H - HANDLE_SIZE, Me.W - HANDLE_SIZE * 2, HANDLE_SIZE) + $aScissors[S_W].Move(0, HANDLE_SIZE, HANDLE_SIZE, Me.H - HANDLE_SIZE * 2) + $aScissors[S_E].Move(Me.W - HANDLE_SIZE, HANDLE_SIZE, HANDLE_SIZE, Me.H - HANDLE_SIZE * 2) + + btnCut.Move(Me.W - btnCut.W - Desktop.Scale * 3, Desktop.Scale * 3) + + dwgNW.Move(HANDLE_SIZE, HANDLE_SIZE) + dwgNE.Move(Me.W - HANDLE_SIZE - dwgNE.W, dwgNW.Y) + dwgSE.Move(dwgNE.X, Me.H - HANDLE_SIZE - dwgSE.H) + dwgSW.Move(dwgNW.X, dwgSE.Y) + +End + + +Public Sub Form_Open() + + Dim I As Integer + + $aMouse = [Mouse.SizeN, Mouse.SizeS, Mouse.SizeW, Mouse.SizeE, Mouse.SizeNW, Mouse.SizeNE, Mouse.SizeSW, Mouse.SizeSE] + HANDLE_SIZE = Desktop.Scale + + $aScissors = New Panel[8] + + For I = 0 To 7 + $aScissors[I] = New Panel(Me) As "Panel" + With $aScissors[I] + .Mouse = $aMouse[I] + .Background = Color.White 'IIf(I >= S_NW, Color.RGB(192, 192, 192), Color.White) + .Tag = I + End With + Next + + btnCut = New CButton(Me) As "btnCut" + btnCut.Resize(48, 48) + btnCut.Image = Image.Load("scissors.png") + + Me.Move(FMain.ClientW \ 4, FMain.ClientH \ 4, FMain.ClientW \ 2, FMain.ClientH \ 2) + 'Form_Resize + +End + +Public Sub Panel_MouseDown() + + $MX = Mouse.ScreenX + $MY = Mouse.ScreenY + $hRect = Rect(Me.X, Me.Y, Me.W, Me.H) + +End + +Public Sub Panel_MouseMove() + + Dim X, Y As Integer + Dim iTag As Integer = Last.Tag + Dim MIN_HEIGHT As Integer = btnCut.W + Desktop.Scale * 6 + Dim MIN_WIDTH As Integer = btnCut.H + Desktop.Scale * 6 + + Select Case Last.Tag + + Case S_N + Y = $hRect.Y + Mouse.ScreenY - $MY + Y = Min($hRect.Bottom - MIN_HEIGHT, Max(0, Y)) + Me.Move(Me.X, Y, Me.W, $hRect.H + $hRect.Y - Y) + + Case S_S + Y = $hRect.H + Mouse.ScreenY - $MY + Y = Min(FMain.H - $hRect.Y, Max(MIN_HEIGHT, Y)) + Me.Move(Me.X, Me.Y, Me.W, Y) + + Case S_W + X = $hRect.X + Mouse.ScreenX - $MX + X = Min($hRect.Right - MIN_WIDTH, Max(0, X)) + Me.Move(X, Me.Y, $hRect.W + $hRect.X - X, Me.H) + + Case S_E + X = $hRect.W + Mouse.ScreenX - $MX + X = Min(FMain.W - $hRect.X, Max(MIN_WIDTH, X)) + Me.Move(Me.X, Me.Y, X, Me.H) + + Case S_NW + Y = $hRect.Y + Mouse.ScreenY - $MY + Y = Min($hRect.Bottom - MIN_HEIGHT, Max(0, Y)) + X = $hRect.X + Mouse.ScreenX - $MX + X = Min($hRect.Right - MIN_WIDTH, Max(0, X)) + Me.Move(X, Y, $hRect.W + $hRect.X - X, $hRect.H + $hRect.Y - Y) + + Case S_NE + Y = $hRect.Y + Mouse.ScreenY - $MY + Y = Min($hRect.Bottom - MIN_HEIGHT, Max(0, Y)) + X = $hRect.W + Mouse.ScreenX - $MX + X = Min(FMain.W - $hRect.X, Max(MIN_WIDTH, X)) + Me.Move(Me.X, Y, X, $hRect.H + $hRect.Y - Y) + + Case S_SW + Y = $hRect.H + Mouse.ScreenY - $MY + Y = Min(FMain.H - $hRect.Y, Max(MIN_HEIGHT, Y)) + X = $hRect.X + Mouse.ScreenX - $MX + X = Min($hRect.Right - MIN_WIDTH, Max(0, X)) + Me.Move(X, Me.Y, $hRect.W + $hRect.X - X, Y) + + Case S_SE + Y = $hRect.H + Mouse.ScreenY - $MY + Y = Min(FMain.H - $hRect.Y, Max(MIN_HEIGHT, Y)) + X = $hRect.W + Mouse.ScreenX - $MX + X = Min(FMain.W - $hRect.X, Max(MIN_WIDTH, X)) + Me.Move(Me.X, Me.Y, X, Y) + + End Select + + 'Form_Resize + +End + + +Public Sub Form_MouseDown() + + $MX = Mouse.ScreenX + $MY = Mouse.ScreenY + $hRect = Rect(Me.X, Me.Y, Me.W, Me.H) + +End + +Public Sub Form_MouseMove() + + Dim X, Y As Integer + + X = Min(Max($hRect.X + Mouse.ScreenX - $MX, 0), FMain.W - $hRect.W) + Y = Min(Max($hRect.Y + Mouse.ScreenY - $MY, 0), FMain.H - $hRect.H) + Me.Move(X, Y) + +End + +Public Sub btnCut_Click() + + FMain.Cut + +End + +Public Sub dwgCorner_Draw() + + Dim hCtrl As DrawingArea = Last + + Paint.Brush = Paint.Color(Color.SetAlpha(Color.White, 192)) + + Select Case Last.Tag + + Case "NW" + + If Not $bResize Then Paint.Brush = Paint.Color(Color.White) + + Paint.MoveTo(2, 2) + Paint.LineTo(hCtrl.W - 2, 2) + Paint.LineTo(2, hCtrl.H - 2) + + Case "NE" + + Paint.MoveTo(hCtrl.W - 2, 2) + Paint.LineTo(hCtrl.W - 2, hCtrl.H - 2) + Paint.LineTo(2, 2) + + Case "SW" + + Paint.MoveTo(2, hCtrl.H - 2) + Paint.LineTo(2, 2) + Paint.LineTo(hCtrl.W - 2, hCtrl.H - 2) + + Case "SE" + + If $bResize Then Paint.Brush = Paint.Color(Color.White) + + Paint.MoveTo(hCtrl.W - 2, hCtrl.H - 2) + Paint.LineTo(2, hCtrl.H - 2) + Paint.LineTo(hCtrl.W - 2, 2) + + End Select + + Paint.Fill + +End + +Public Sub Form_KeyPress() + + Dim MIN_HEIGHT As Integer = btnCut.W + Desktop.Scale * 6 + Dim MIN_WIDTH As Integer = btnCut.H + Desktop.Scale * 6 + Dim X, Y, W, H As Integer + + X = Me.X + Y = Me.Y + W = Me.W + H = Me.H + + Select Case Key.Code + Case Key.Up + If $bResize Then + H = Max(MIN_HEIGHT, H - 16) + Else + Y = Max(0, Y - 16) + Endif + Case Key.Down + If $bResize Then + H = Min(FMain.H - Me.Y, H + 16) + Else + Y = Min(FMain.H - Me.H, Y + 16) + Endif + Case Key.Left + If $bResize Then + W = Max(MIN_WIDTH, W - 16) + Else + X = Max(0, X - 16) + Endif + Case Key.Right + If $bResize Then + W = Min(FMain.W - Me.X, W + 16) + Else + X = Min(FMain.W - Me.W, X + 16) + Endif + Case Key.Space + $bResize = Not $bResize + dwgNW.Refresh + dwgSE.Refresh + Stop Event + Return + Case Key.Return, Key.Enter + btnCut_Click + Stop Event + Return + End Select + + If X <> Me.X Or If Y <> Me.Y Or If W <> Me.W Or If H <> Me.H Then + Me.Move(X, Y, W, H) + Stop Event + Return + Endif + + FMain.Form_KeyPress + +End diff --git a/app/examples/Image/PhotoTouch/.src/FScissors.form b/app/examples/Image/PhotoTouch/.src/FScissors.form new file mode 100644 index 00000000..cfddd6ce --- /dev/null +++ b/app/examples/Image/PhotoTouch/.src/FScissors.form @@ -0,0 +1,38 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,64,64) + Background = &H000000& + Mouse = Mouse.SizeAll + Border = False + Utility = True + Stacking = Window.Above + SkipTaskbar = True + Opacity = 50 + { Label1 Label + MoveScaled(3,3,52,6) + Font = Font["Bold,+5"] + Foreground = Color.TextBackground + Text = ("Cut") + } + { dwgNW DrawingArea dwgCorner + Name = "dwgNW" + MoveScaled(7,31,4,4) + Tag = "NW" + } + { dwgNE DrawingArea dwgCorner + Name = "dwgNE" + MoveScaled(14,31,4,4) + Tag = "NE" + } + { dwgSW DrawingArea dwgCorner + Name = "dwgSW" + MoveScaled(7,38,4,4) + Tag = "SW" + } + { dwgSE DrawingArea dwgCorner + Name = "dwgSE" + MoveScaled(14,38,4,4) + Tag = "SE" + } +} diff --git a/app/examples/Image/PhotoTouch/balance.png b/app/examples/Image/PhotoTouch/balance.png new file mode 100644 index 0000000000000000000000000000000000000000..c66bf62b495459636ab7806b76a3042558eaa662 GIT binary patch literal 1125 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 literal 0 HcmV?d00001 diff --git a/app/examples/Image/PhotoTouch/contrast.png b/app/examples/Image/PhotoTouch/contrast.png new file mode 100644 index 0000000000000000000000000000000000000000..49bda45dcbac7c6144da67e8853dfbbae71e1fa9 GIT binary patch literal 1340 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 literal 0 HcmV?d00001 diff --git a/app/examples/Image/PhotoTouch/film.png b/app/examples/Image/PhotoTouch/film.png new file mode 100644 index 0000000000000000000000000000000000000000..58ce250007f96276517d235a8080365108fdb568 GIT binary patch literal 756 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, 2007-2010. +# +# +msgid "" +msgstr "" +"Project-Id-Version: Explorer\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2010-12-17 01:09+0100\n" +"Last-Translator: Jordi Sayol \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: FExplorer.form:35 +msgid "&About..." +msgstr "&Quant a..." + +#: FExplorer.form:14 +msgid "FExplorer" +msgstr "-" + +#: FExplorer.form:19 +msgid "&File" +msgstr "&Fitxer" + +#: .project:1 +msgid "File browser example" +msgstr "Exemple de navegador de fitxers" + +#: FExplorer.class:158 +msgid "' has been renamed to '" +msgstr "' s'ha canviat el nom a '" + +#: FExplorer.class:152 +msgid "IconView example written by\nBenoît Minisini" +msgstr "Exemple de visualitzador d'icones escrit per\nBenoît Minisini" + +#: FExplorer.form:39 +msgid "&Quit" +msgstr "&Surt" + +#: FExplorer.form:26 +msgid "&Refresh" +msgstr "&Actualitza" + +#: FExplorer.form:22 +msgid "&View hidden files" +msgstr "&Mostra els fitxers ocults" + diff --git a/app/examples/Misc/Explorer/.lang/cs.po b/app/examples/Misc/Explorer/.lang/cs.po new file mode 100644 index 00000000..1d68587c --- /dev/null +++ b/app/examples/Misc/Explorer/.lang/cs.po @@ -0,0 +1,52 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "File browser example" +msgstr "Příklad prohlížeče souboru" + +#: FExplorer.class:152 +msgid "" +"IconView example written by\n" +"Benoît Minisini" +msgstr "" +"Příklad IconView od\n" +"Benoît Minisini" + +#: FExplorer.class:158 +msgid "' has been renamed to '" +msgstr "' bylo přejmenováno na '" + +#: FExplorer.form:14 +msgid "FExplorer" +msgstr "-" + +#: FExplorer.form:19 +msgid "&File" +msgstr "&Soubor" + +#: FExplorer.form:22 +msgid "&View hidden files" +msgstr "&Zobrazit skryté soubory" + +#: FExplorer.form:26 +msgid "&Refresh" +msgstr "&Obnovit" + +#: FExplorer.form:35 +msgid "&About..." +msgstr "&O aplikaci..." + +#: FExplorer.form:39 +msgid "&Quit" +msgstr "&Ukončit" diff --git a/app/examples/Misc/Explorer/.lang/de.po b/app/examples/Misc/Explorer/.lang/de.po new file mode 100644 index 00000000..ed66f8d6 --- /dev/null +++ b/app/examples/Misc/Explorer/.lang/de.po @@ -0,0 +1,49 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "File browser example" +msgstr "Beispiel für einen Dateibrowser" + +#: FExplorer.class:152 +msgid "IconView example written by\nBenoît Minisini" +msgstr "IconView Beispiel, geschrieben von\nBenoît Minisini" + +#: FExplorer.class:158 +msgid "' has been renamed to '" +msgstr "' wurde umbenannt zu '" + +#: FExplorer.form:14 +msgid "FExplorer" +msgstr "-" + +#: FExplorer.form:19 +msgid "&File" +msgstr "&Datei" + +#: FExplorer.form:22 +msgid "&View hidden files" +msgstr "&Versteckte Dateien anzeigen" + +#: FExplorer.form:26 +msgid "&Refresh" +msgstr "&Aktualisieren" + +#: FExplorer.form:35 +msgid "&About..." +msgstr "&Über..." + +#: FExplorer.form:39 +msgid "&Quit" +msgstr "&Beenden" + diff --git a/app/examples/Misc/Explorer/.lang/es.po b/app/examples/Misc/Explorer/.lang/es.po new file mode 100644 index 00000000..4d569041 --- /dev/null +++ b/app/examples/Misc/Explorer/.lang/es.po @@ -0,0 +1,35 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: FExplorer.class:190 +msgid "FExplorer" +msgstr "FExplorer" + +#: FExplorer.class:195 +msgid "&File" +msgstr "&Archivo" + +#: FExplorer.class:198 +msgid "&View hidden files" +msgstr "&Ver archivos ocultos" + +#: FExplorer.class:202 +msgid "&Refresh" +msgstr "&Refrescar" + +#: FExplorer.class:212 +msgid "&About..." +msgstr "&Acerca de..." + +#: FExplorer.class:216 +msgid "&Quit" +msgstr "&Salir" diff --git a/app/examples/Misc/Explorer/.lang/ru.po b/app/examples/Misc/Explorer/.lang/ru.po new file mode 100644 index 00000000..f4e80484 --- /dev/null +++ b/app/examples/Misc/Explorer/.lang/ru.po @@ -0,0 +1,70 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-28 09:00+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Misc/Explorer/.project:21 +msgid "File browser example" +msgstr "Пример браузера файлов" + +#: app/examples/Misc/Explorer/.project:22 +msgid "IconView example" +msgstr "Пример IconView" + +#: app/examples/Misc/Explorer/.src/FExplorer.class:153 +msgid "" +"IconView example written by\n" +"Benoît Minisini" +msgstr "" +"Пример просмотра значков, написанный\n" +"Бенуа Минисини" + +#: app/examples/Misc/Explorer/.src/FExplorer.class:159 +msgid "' has been renamed to '" +msgstr "' был переименован в '" + +#: app/examples/Misc/Explorer/.src/FExplorer.form:5 +msgid "FExplorer" +msgstr "Обзорщик" + +#: app/examples/Misc/Explorer/.src/FExplorer.form:9 +msgid "File" +msgstr "Файл" + +#: app/examples/Misc/Explorer/.src/FExplorer.form:11 +msgid "View hidden files" +msgstr "Просмотреть скрытые файлы" + +#: app/examples/Misc/Explorer/.src/FExplorer.form:14 +msgid "Refresh" +msgstr "Освежить" + +#: app/examples/Misc/Explorer/.src/FExplorer.form:21 +msgid "About" +msgstr "О программе" + +#: app/examples/Misc/Explorer/.src/FExplorer.form:24 +msgid "Quit" +msgstr "Выход" + diff --git a/app/examples/Misc/Explorer/.project b/app/examples/Misc/Explorer/.project new file mode 100644 index 00000000..a90b74d3 --- /dev/null +++ b/app/examples/Misc/Explorer/.project @@ -0,0 +1,20 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.6.0 +Title=File browser example +Description="IconView example" +Startup=FExplorer +Icon=folder.png +Version=3.6.2 +VersionFile=1 +Component=gb.image +Component=gb.gui +Component=gb.form +Environment="GB_GUI=gb.gtk" +TabSize=2 +Translate=1 +Language=fr +Maintainer=benoit +Vendor=Princeton +Address=benoit@localhost +License=General Public Licence +Packager=1 diff --git a/app/examples/Misc/Explorer/.src/FExplorer.class b/app/examples/Misc/Explorer/.src/FExplorer.class new file mode 100644 index 00000000..1ab8c315 --- /dev/null +++ b/app/examples/Misc/Explorer/.src/FExplorer.class @@ -0,0 +1,175 @@ +' Gambas class file + +Private $sPath As String +Private $bHidden As Boolean +Private $bCtrl As Boolean + +Static Public Sub Main() + + Dim hForm As Form + + hForm = New FExplorer(System.User.Home) + Application.MainWindow = hForm + hForm.Show + +End + +Public Sub _new(sPath As String) + + $sPath = sPath + RefreshExplorer + +End + +Private Sub RefreshExplorer() + + Dim sFile As String + Dim hPictDir As Picture + Dim hPictFile As Picture + Dim cDir As New String[] + Dim sName As String + + Inc Application.Busy + + Me.Title = Conv($sPath, System.Charset, Desktop.Charset) + + ivwExplorer.Clear + 'ivwExplorer.Arrangement = IconView.Row + + hPictDir = Picture["icon:/48/directory"] + hPictFile = Picture["icon:/48/file"] + + If $sPath <> "/" Then ivwExplorer.Add("D..", "..", hPictDir) + + For Each sFile In Dir($sPath) + + If Not $bHidden Then + If Stat($sPath &/ sFile).Hidden Then + Continue + Endif + Endif + + If IsDir($sPath &/ sFile) Then + cDir.Add("D" & sFile) + Else + cDir.Add("F" & sFile) + Endif + + Next + + cDir.Sort + + For Each sFile In cDir + + sName = Mid$(sFile, 2) + + If Left$(sFile) = "D" Then + ivwExplorer.Add(sFile, sName, hPictDir) + Else + ivwExplorer.Add(sFile, sName, hPictFile) + Endif + + 'ivwExplorer.Item.Editable = TRUE + + Next + + 'ivwExplorer.Sorted = FALSE + 'ivwExplorer.Ascending = TRUE + 'ivwExplorer.Sorted = TRUE + +Finally + + Dec Application.busy + +Catch + + Message.Error(Error.Text) + +End + + +Public Sub mnuQuit_Click() + + Me.Close + +End + +Public Sub mnuViewRefresh_Click() + + RefreshExplorer + +End + +Public Sub ivwExplorer_Activate() + + Dim sNewPath As String + Dim hForm As Form + + Debug Last.Current.Key + + If Last.Current.Key = "D.." Then + If $sPath = "/" Then Return + sNewPath = File.Dir($sPath) + Else + sNewPath = $sPath &/ Mid$(Last.Current.Key, 2) + Endif + + If IsDir(sNewPath) Then + + If $bCtrl Then + $bCtrl = False + hForm = New FExplorer(sNewPath) + hForm.Move(Me.X + 16, Me.Y + 16, Me.W, Me.H) + hForm.Show + Else + $sPath = sNewPath + RefreshExplorer + Endif + + Endif + +End + + +Private Sub ToggleViewHidden() + + $bHidden = Not mnuViewHidden.Checked + + mnuViewHidden.Checked = $bHidden + + RefreshExplorer + +End + + +Public Sub mnuViewHidden_Click() + + ToggleViewHidden + +End + +Public Sub mnuAbout_Click() + + Message(("IconView example written by\nBenoît Minisini")) + +End + +Public Sub ivwExplorer_Rename() + + Message("'" & Mid$(Last.Item.Key, 2) & ("' has been renamed to '") & Last.Item.Text & "'") + +End + +Public Sub ivwExplorer_KeyPress() + + If Key.Control Then $bCtrl = True + +End + +Public Sub ivwExplorer_KeyRelease() + + If Key.Control Then $bCtrl = False + +End + + diff --git a/app/examples/Misc/Explorer/.src/FExplorer.form b/app/examples/Misc/Explorer/.src/FExplorer.form new file mode 100644 index 00000000..8d50e1c4 --- /dev/null +++ b/app/examples/Misc/Explorer/.src/FExplorer.form @@ -0,0 +1,38 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(27.7143,27.7143,61.5714,46.7143) + Text = ("FExplorer") + Icon = Picture["icon:/16/directory"] + Arrangement = Arrange.Vertical + { mnuFile Menu + Text = Shortcut(("File"), "F") + { mnuViewHidden Menu + Text = Shortcut(("View hidden files"), "V") + } + { mnuViewRefresh Menu + Text = Shortcut(("Refresh"), "R") + Picture = Picture["icon:/16/refresh"] + Shortcut = "F5" + } + { Menu1 Menu + } + { mnuAbout Menu + Text = Shortcut(("About"), "A") & "..." + } + { mnuQuit Menu + Text = Shortcut(("Quit"), "Q") + Picture = Picture["icon:/16/quit"] + } + } + { Separator1 Separator + MoveScaled(27,4,19,0) + } + { ivwExplorer IconView + MoveScaled(2,9,44,30) + Expand = True + Mode = Select.Multiple + Editable = True + Border = False + } +} diff --git a/app/examples/Misc/Explorer/folder.png b/app/examples/Misc/Explorer/folder.png new file mode 100644 index 0000000000000000000000000000000000000000..0e6b21c1ef6a6b34c0f1f598a1d6e1a2ef23a552 GIT binary patch literal 2450 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 iB|H1v|6G09>;D1E^Mnj!=ooqc0000, 2007-2010. +# +# +msgid "" +msgstr "" +"Project-Id-Version: Notepad\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2010-12-17 01:09+0100\n" +"Last-Translator: Jordi Sayol \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: FNotepad.form:122 +msgid "&?" +msgstr "-" + +#: FNotepad.form:125 +msgid "&About..." +msgstr "&Quant a..." + +#: FAbout.form:10 +msgid "About..." +msgstr "Quant a..." + +#: .project:1 +msgid "A little text editor" +msgstr "Un petit editor de text" + +#: FNotepad.class:118 +msgid "All files" +msgstr "Tots els fitxers" + +#: FNotepad.class:66 +msgid "Cancel" +msgstr "Canceŀla" + +#: FNotepad.class:118 +msgid "C/C++ files" +msgstr "Fitxers C/C++" + +#: FNotepad.form:111 +msgid "Choose &Font..." +msgstr "&Tria el tipus de lletra..." + +#: FNotepad.form:42 +msgid "Close" +msgstr "&Tanca" + +#: FNotepad.form:75 +msgid "&Copy" +msgstr "&Copia" + +#: FNotepad.form:81 +msgid "C&ut" +msgstr "&Retalla" + +#: FNotepad.class:118 +msgid "Desktop files" +msgstr "Fitxers d'escriptori" + +#: FNotepad.form:72 +msgid "&Edit" +msgstr "&Edita" + +#: FNotepad.form:33 +msgid "&File" +msgstr "&Fitxer" + +#: FNotepad.form:28 +msgid "Little notepad" +msgstr "Petit bloc de notes" + +#: FNotepad.class:30 +msgid "(New document)" +msgstr "(Document nou)" + +#: FNotepad.class:66 +msgid "\n\nFile has been modified. Do you want to save it ?" +msgstr "\n\nS'ha modificat el fitxer. El voleu desar?" + +#: FNotepad.class:66 +msgid "No" +msgstr "-" + +#: FNotepad.class:97 +msgid "\nUnable to load file.\n" +msgstr "\nNo es pot carregar el fitxer.\n" + +#: FAbout.form:21 +msgid "OK" +msgstr "D'acord" + +#: FNotepad.form:36 +msgid "&Open..." +msgstr "&Obre..." + +#: FNotepad.form:87 +msgid "&Paste" +msgstr "&Enganxa" + +#: FNotepad.form:65 +msgid "&Quit" +msgstr "&Surt" + +#: FNotepad.form:102 +msgid "&Redo" +msgstr "Re&fés" + +#: FNotepad.form:51 +msgid "&Save" +msgstr "&Desa" + +#: FNotepad.form:57 +msgid "S&ave As..." +msgstr "D&esa com..." + +#: FNotepad.class:118 +msgid "Text files" +msgstr "Fitxers de text" + +#: FAbout.form:28 +msgid "This is a little notepad sample program." +msgstr "Aquest és un petit programa exemple de bloc de notes." + +#: FNotepad.form:133 +msgid "txtNotepad" +msgstr "-" + +#: FNotepad.form:96 +msgid "&Undo" +msgstr "&Desfés" + +#: FNotepad.form:115 +msgid "&Wrap text" +msgstr "&Ajusta el text" + +#: FNotepad.class:66 +msgid "Yes" +msgstr "Sí" + diff --git a/app/examples/Misc/Notepad/.lang/cs.po b/app/examples/Misc/Notepad/.lang/cs.po new file mode 100644 index 00000000..2cb92fb1 --- /dev/null +++ b/app/examples/Misc/Notepad/.lang/cs.po @@ -0,0 +1,150 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "A little text editor" +msgstr "Malý textový editor" + +#: FAbout.form:10 +msgid "About..." +msgstr "O aplikaci..." + +#: FAbout.form:21 +msgid "OK" +msgstr "-" + +#: FAbout.form:28 +msgid "This is a little notepad sample program." +msgstr "Toto je ukázka malého poznámkového bloku." + +#: FNotepad.class:30 +msgid "(New document)" +msgstr "(Nový dokument)" + +#: FNotepad.class:66 +msgid "" +"\n" +"\n" +"File has been modified. Do you want to save it ?" +msgstr "" +"\n" +"\n" +"Soubor byl změněn. Chcete jej uložit ?" + +#: FNotepad.class:66 +msgid "Cancel" +msgstr "Zrušit" + +#: FNotepad.class:66 +msgid "No" +msgstr "Ne" + +#: FNotepad.class:66 +msgid "Yes" +msgstr "Ano" + +#: FNotepad.class:97 +msgid "" +"\n" +"Unable to load file.\n" +msgstr "" +"\n" +"Nelze načíst soubor.\n" + +#: FNotepad.class:118 +msgid "All files" +msgstr "Všechny soubory" + +#: FNotepad.class:118 +msgid "C/C++ files" +msgstr "C/C++ soubory" + +#: FNotepad.class:118 +msgid "Desktop files" +msgstr "Desktop soubory" + +#: FNotepad.class:118 +msgid "Text files" +msgstr "Textové soubory" + +#: FNotepad.form:28 +msgid "Little notepad" +msgstr "Malý poznámkový blok" + +#: FNotepad.form:33 +msgid "&File" +msgstr "&Soubor" + +#: FNotepad.form:36 +msgid "&Open..." +msgstr "&Otevřít..." + +#: FNotepad.form:42 +msgid "Close" +msgstr "Zavřít" + +#: FNotepad.form:51 +msgid "&Save" +msgstr "&Uložit" + +#: FNotepad.form:57 +msgid "S&ave As..." +msgstr "Uložit &jako..." + +#: FNotepad.form:65 +msgid "&Quit" +msgstr "&Zavřít" + +#: FNotepad.form:72 +msgid "&Edit" +msgstr "&Upravit" + +#: FNotepad.form:75 +msgid "&Copy" +msgstr "&Kopírovat" + +#: FNotepad.form:81 +msgid "C&ut" +msgstr "&Vyjmout" + +#: FNotepad.form:87 +msgid "&Paste" +msgstr "&Vložit" + +#: FNotepad.form:96 +msgid "&Undo" +msgstr "&Zpět" + +#: FNotepad.form:102 +msgid "&Redo" +msgstr "&Vrátit" + +#: FNotepad.form:111 +msgid "Choose &Font..." +msgstr "Vyber &Font..." + +#: FNotepad.form:115 +msgid "&Wrap text" +msgstr "&Zalamovat text" + +#: FNotepad.form:122 +msgid "&?" +msgstr "-" + +#: FNotepad.form:125 +msgid "&About..." +msgstr "&O aplikaci..." + +#: FNotepad.form:133 +msgid "txtNotepad" +msgstr "-" diff --git a/app/examples/Misc/Notepad/.lang/de.po b/app/examples/Misc/Notepad/.lang/de.po new file mode 100644 index 00000000..201f2c8c --- /dev/null +++ b/app/examples/Misc/Notepad/.lang/de.po @@ -0,0 +1,141 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "A little text editor" +msgstr "Ein kleiner Texteditor" + +#: FAbout.form:10 +msgid "About..." +msgstr "Über..." + +#: FAbout.form:21 +msgid "OK" +msgstr "-" + +#: FAbout.form:28 +msgid "This is a little notepad sample program." +msgstr "Dies ist ein kleines Notepad-Beispiel." + +#: FNotepad.class:30 +msgid "(New document)" +msgstr "(Unbenannt)" + +#: FNotepad.class:66 +msgid "\n\nFile has been modified. Do you want to save it ?" +msgstr "\n\nDatei wurde geändert. Wollen Sie sie speichern ?" + +#: FNotepad.class:66 +msgid "Cancel" +msgstr "Abbrechen" + +#: FNotepad.class:66 +msgid "No" +msgstr "Nein" + +#: FNotepad.class:66 +msgid "Yes" +msgstr "Ja" + +#: FNotepad.class:97 +msgid "\nUnable to load file.\n" +msgstr "\nDatei kann nicht geladen werden.\n" + +#: FNotepad.class:118 +msgid "All files" +msgstr "Alle Dateien" + +#: FNotepad.class:118 +msgid "C/C++ files" +msgstr "C/C++ Dateien" + +#: FNotepad.class:118 +msgid "Desktop files" +msgstr "Desktop Dateien" + +#: FNotepad.class:118 +msgid "Text files" +msgstr "Textdateien" + +#: FNotepad.form:28 +msgid "Little notepad" +msgstr "Kleines Notepad" + +#: FNotepad.form:33 +msgid "&File" +msgstr "&Datei" + +#: FNotepad.form:36 +msgid "&Open..." +msgstr "&Öffnen..." + +#: FNotepad.form:42 +msgid "Close" +msgstr "Schließen" + +#: FNotepad.form:51 +msgid "&Save" +msgstr "&Speichern" + +#: FNotepad.form:57 +msgid "S&ave As..." +msgstr "Speichern &als..." + +#: FNotepad.form:65 +msgid "&Quit" +msgstr "&Beenden" + +#: FNotepad.form:72 +msgid "&Edit" +msgstr "&Bearbeiten" + +#: FNotepad.form:75 +msgid "&Copy" +msgstr "&Kopieren" + +#: FNotepad.form:81 +msgid "C&ut" +msgstr "&Ausschneiden" + +#: FNotepad.form:87 +msgid "&Paste" +msgstr "&Einfügen" + +#: FNotepad.form:96 +msgid "&Undo" +msgstr "&Rückgängig" + +#: FNotepad.form:102 +msgid "&Redo" +msgstr "&Wiederherstellen" + +#: FNotepad.form:111 +msgid "Choose &Font..." +msgstr "&Schriftart wählen..." + +#: FNotepad.form:115 +msgid "&Wrap text" +msgstr "&Zeilenumbruch" + +#: FNotepad.form:122 +msgid "&?" +msgstr "-" + +#: FNotepad.form:125 +msgid "&About..." +msgstr "&Über..." + +#: FNotepad.form:133 +msgid "txtNotepad" +msgstr "-" + diff --git a/app/examples/Misc/Notepad/.lang/es.po b/app/examples/Misc/Notepad/.lang/es.po new file mode 100644 index 00000000..f7343279 --- /dev/null +++ b/app/examples/Misc/Notepad/.lang/es.po @@ -0,0 +1,95 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: FAbout.class:39 +msgid "About..." +msgstr "Acerca de..." + +#: FAbout.class:50 +msgid "OK" +msgstr "OK" + +#: FAbout.class:57 +msgid "This is a little notepad sample program." +msgstr "Este es un pequeño ejemplo del programa bloc de notas." + +#: FNotepad.class:256 +msgid "Little notepad" +msgstr "Pequeño bloc de notas" + +#: FNotepad.class:262 +msgid "&File" +msgstr "&Archivo" + +#: FNotepad.class:265 +msgid "&Open..." +msgstr "&Abrir" + +#: FNotepad.class:271 +msgid "Close" +msgstr "Cerrar" + +#: FNotepad.class:280 +msgid "&Save" +msgstr "&Guardar" + +#: FNotepad.class:285 +msgid "S&ave As..." +msgstr "G&uardar como..." + +#: FNotepad.class:294 +msgid "&Quit" +msgstr "&Salir" + +#: FNotepad.class:300 +msgid "&Edit" +msgstr "&Editar" + +#: FNotepad.class:303 +msgid "&Copy" +msgstr "&Copiar" + +#: FNotepad.class:308 +msgid "C&ut" +msgstr "C&ortar" + +#: FNotepad.class:313 +msgid "&Paste" +msgstr "&Pegar" + +#: FNotepad.class:322 +msgid "&Undo" +msgstr "&Deshacer" + +#: FNotepad.class:327 +msgid "&Redo" +msgstr "&Rehacer" + +#: FNotepad.class:336 +msgid "Choose &Font..." +msgstr "Seleccionar &fuente..." + +#: FNotepad.class:340 +msgid "&Wrap text" +msgstr "&Ajustar texto" + +#: FNotepad.class:346 +msgid "&?" +msgstr "&?" + +#: FNotepad.class:349 +msgid "&About..." +msgstr "&Acerca de..." + +#: FNotepad.class:357 +msgid "txtNotepad" +msgstr "txtNotepad" diff --git a/app/examples/Misc/Notepad/.lang/ru.po b/app/examples/Misc/Notepad/.lang/ru.po new file mode 100644 index 00000000..8120f4d5 --- /dev/null +++ b/app/examples/Misc/Notepad/.lang/ru.po @@ -0,0 +1,164 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-28 09:00+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Misc/Notepad/.project:21 +msgid "A little text editor" +msgstr "Небольшой текстовый редактор" + +#: app/examples/Misc/Notepad/.project:22 app/examples/Misc/Notepad/.src/FAbout.form:20 +msgid "This is a little notepad sample program." +msgstr "Это небольшой пример программы-блокнота." + +#: app/examples/Misc/Notepad/.src/FAbout.form:5 +msgid "About..." +msgstr "О программе..." + +#: app/examples/Misc/Notepad/.src/FAbout.form:14 +msgid "OK" +msgstr "ОК" + +#: app/examples/Misc/Notepad/.src/FNotepad.class:27 +msgid "(New document)" +msgstr "(Новый документ)" + +#: app/examples/Misc/Notepad/.src/FNotepad.class:63 +msgid "" +"\n" +"\n" +"File has been modified. Do you want to save it ?" +msgstr "" +"\n" +"\n" +"Файл был изменён. Вы хотите сохранить его?" + +#: app/examples/Misc/Notepad/.src/FNotepad.class:63 +msgid "Yes" +msgstr "Да" + +#: app/examples/Misc/Notepad/.src/FNotepad.class:63 +msgid "No" +msgstr "Нет" + +#: app/examples/Misc/Notepad/.src/FNotepad.class:63 +msgid "Cancel" +msgstr "Отмена" + +#: app/examples/Misc/Notepad/.src/FNotepad.class:94 +msgid "" +"\n" +"Unable to load file.\n" +msgstr "" +"\n" +"Невозможно загрузить файл.\n" + +#: app/examples/Misc/Notepad/.src/FNotepad.class:115 +msgid "All files" +msgstr "Все файлы" + +#: app/examples/Misc/Notepad/.src/FNotepad.class:115 +msgid "C/C++ files" +msgstr "Файлы C/C++" + +#: app/examples/Misc/Notepad/.src/FNotepad.class:115 +msgid "Text files" +msgstr "Текстовые файлы" + +#: app/examples/Misc/Notepad/.src/FNotepad.class:115 +msgid "Desktop files" +msgstr "Файлы Рабочего стола" + +#: app/examples/Misc/Notepad/.src/FNotepad.form:5 +msgid "Little notepad" +msgstr "Маленький блокнот" + +#: app/examples/Misc/Notepad/.src/FNotepad.form:9 +msgid "File" +msgstr "Файл" + +#: app/examples/Misc/Notepad/.src/FNotepad.form:11 +msgid "Open" +msgstr "Открыть" + +#: app/examples/Misc/Notepad/.src/FNotepad.form:16 +msgid "Close" +msgstr "Закрыть" + +#: app/examples/Misc/Notepad/.src/FNotepad.form:23 +msgid "Save" +msgstr "Сохранить" + +#: app/examples/Misc/Notepad/.src/FNotepad.form:28 +msgid "Save As" +msgstr "Сохранить как" + +#: app/examples/Misc/Notepad/.src/FNotepad.form:34 +msgid "Quit" +msgstr "Выход" + +#: app/examples/Misc/Notepad/.src/FNotepad.form:40 +msgid "Edit" +msgstr "Редактировать" + +#: app/examples/Misc/Notepad/.src/FNotepad.form:42 +msgid "Copy" +msgstr "Копировать" + +#: app/examples/Misc/Notepad/.src/FNotepad.form:47 +msgid "Cut" +msgstr "Вырезать" + +#: app/examples/Misc/Notepad/.src/FNotepad.form:52 +msgid "Paste" +msgstr "Вставить" + +#: app/examples/Misc/Notepad/.src/FNotepad.form:59 +msgid "Undo" +msgstr "Откатить" + +#: app/examples/Misc/Notepad/.src/FNotepad.form:64 +msgid "Redo" +msgstr "Вернуть" + +#: app/examples/Misc/Notepad/.src/FNotepad.form:71 +msgid "Choose Font" +msgstr "Выбор шрифта" + +#: app/examples/Misc/Notepad/.src/FNotepad.form:74 +msgid "Wrap text" +msgstr "Переносить текст" + +#: app/examples/Misc/Notepad/.src/FNotepad.form:80 +msgid "?" +msgstr "?" + +#: app/examples/Misc/Notepad/.src/FNotepad.form:82 +msgid "About" +msgstr "О программе" + +#: app/examples/Misc/Notepad/.src/FNotepad.form:89 +msgid "txtNotepad" +msgstr "Текстовый блокнот" + diff --git a/app/examples/Misc/Notepad/.project b/app/examples/Misc/Notepad/.project new file mode 100644 index 00000000..43fb11d2 --- /dev/null +++ b/app/examples/Misc/Notepad/.project @@ -0,0 +1,20 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.5.90 +Title=A little text editor +Description="This is a little notepad sample program." +Startup=FNotepad +Icon=notepad.png +Version=3.6.2 +VersionFile=1 +Component=gb.image +Component=gb.gui +Component=gb.form +Environment="GB_GUI=gb.gtk" +TabSize=2 +Translate=1 +Language=fr +Maintainer=benoit +Vendor=Princeton +Address=benoit@localhost +License=General Public Licence +Packager=1 diff --git a/app/examples/Misc/Notepad/.src/FAbout.class b/app/examples/Misc/Notepad/.src/FAbout.class new file mode 100644 index 00000000..4eb7eefb --- /dev/null +++ b/app/examples/Misc/Notepad/.src/FAbout.class @@ -0,0 +1,25 @@ +' Gambas class file + + +Static Public Sub Run() + + Dim hForm As Form + + hForm = New FAbout + hForm.ShowModal + +End + + +Public Sub _new() + + Me.Center + +End + + +Public Sub btnOK_Click() + + Me.Close + +End diff --git a/app/examples/Misc/Notepad/.src/FAbout.form b/app/examples/Misc/Notepad/.src/FAbout.form new file mode 100644 index 00000000..ccca69c6 --- /dev/null +++ b/app/examples/Misc/Notepad/.src/FAbout.form @@ -0,0 +1,22 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,29,17) + Text = ("About...") + Resizable = False + { Image1 PictureBox + MoveScaled(1,1,4,4) + Picture = Picture["notepad.png"] + Stretch = True + } + { btnOK Button + MoveScaled(7,12,15,4) + Text = ("OK") + Default = True + Cancel = True + } + { TextLabel1 TextLabel + MoveScaled(7,1,21,9) + Text = ("This is a little notepad sample program.") + } +} diff --git a/app/examples/Misc/Notepad/.src/FNotepad.class b/app/examples/Misc/Notepad/.src/FNotepad.class new file mode 100644 index 00000000..26000b5f --- /dev/null +++ b/app/examples/Misc/Notepad/.src/FNotepad.class @@ -0,0 +1,222 @@ +' Gambas class file + +Private $sPath As String +Private $bModify As Boolean + +Static Public Sub Main() + + FNotepad.Show + +End + + +Public Sub _new() + + txtNotepad.Text = "" + $bModify = False + RefreshTitle + txtNotePad.SetFocus + +End + + +Private Function GetName() As String + + If $sPath Then Return $sPath + + Return ("(New document)") + +End + + +Private Sub RefreshTitle() + + Dim sTitle As String + + If $bModify Then sTitle = "*" + sTitle = sTitle & GetName() + + Me.Title = sTitle + +End + + +Private Sub SetPath(sPath As String) + + $sPath = sPath + RefreshTitle + +End + +Private Sub SetModify(bModify As Boolean) + + If $bModify = bModify Then Return + $bModify = bModify + RefreshTitle + +End + + +Private Function CloseDoc() As Boolean + + If $bModify Then + Select Case Message.Question(GetName() & ("\n\nFile has been modified. Do you want to save it ?"), ("Yes"), ("No"), ("Cancel")) + Case 1 + Save + Case 3 + Return True + End Select + Endif + + $sPath = "" + txtNotepad.Text = "" + $bModify = False + RefreshTitle + +End + + + +Public Sub LoadFile(sPath As String) + + Dim sData As String + + If CloseDoc() Then Return + + sData = File.Load(sPath) + Try txtNotepad.Text = Conv(sData, System.Charset, Desktop.Charset) + If Error Then txtNotepad.Text = Conv(sData, "ISO_8859-1", Desktop.Charset) + $bModify = False + SetPath(sPath) + +Catch + + Message.Error(sPath & ("\nUnable to load file.\n") & Error.Text) + +End + + +Public Sub Save(Optional bSaveAs As Boolean) + + If bSaveAs Or Not $sPath Then + If Dialog.SaveFile() Then Return + SetPath(Dialog.Path) + Endif + + File.Save($sPath, txtNotepad.Text) + +End + + +Public Sub mnuOpen_Click() + + Dim sPath As String + + Dialog.Filter = ["*", ("All files"), "*.{c;cpp;h}", ("C/C++ files"), "*.txt", ("Text files"), "*.desktop", ("Desktop files")] + + If Dialog.OpenFile() Then Return + LoadFile(Dialog.Path) + +End + + +Public Sub mnuSave_Click() + + Save + +End + + +Public Sub mnuSaveAs_Click() + + Save(True) + +End + + +Public Sub mnuQuit_Click() + + Me.Close + +End + + +Public Sub txtNotepad_Change() + + SetModify(True) + +End + + +Public Sub mnuClose_Click() + + CloseDoc + +End + + +Public Sub Form_Close() + + If CloseDoc() Then Stop Event + +End + + +Public Sub mnuAbout_Click() + + 'Inc Application.Busy + FAbout.Run + 'Dec Application.Busy + +End + + +Public Sub mnuCopy_Click() + + txtNotepad.Copy + +End + + +Public Sub mnuPaste_Click() + + txtNotepad.Paste + +End + + +Public Sub mnuCut_Click() + + txtNotepad.Cut + +End + + +Public Sub mnuUndo_Click() + + txtNotepad.Undo + +End + + +Public Sub mnuRedo_Click() + + txtNotepad.Redo + +End + + +Public Sub mnuFont_Click() + + Dialog.Font = txtNotepad.Font + If Dialog.SelectFont() Then Return + txtNotepad.Font = Dialog.Font + +End + +Public Sub mnuWrap_Click() + + mnuWrap.Checked = Not mnuWrap.Checked + txtNotePad.Wrap = mnuWrap.Checked + +End diff --git a/app/examples/Misc/Notepad/.src/FNotepad.form b/app/examples/Misc/Notepad/.src/FNotepad.form new file mode 100644 index 00000000..ac8112d0 --- /dev/null +++ b/app/examples/Misc/Notepad/.src/FNotepad.form @@ -0,0 +1,93 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(12.5714,12.5714,50,50) + Text = ("Little notepad") + Icon = Picture["notepad.png"] + Arrangement = Arrange.Fill + { mnuFile Menu + Text = Shortcut(("File"), "F") + { mnuOpen Menu + Text = Shortcut(("Open"), "O") & "..." + Picture = Picture["icon:/16/new"] + Shortcut = "Ctrl+O" + } + { mnuClose Menu + Text = ("Close") + Picture = Picture["icon:/16/close"] + Shortcut = "Ctrl+W" + } + { Menu1 Menu + } + { mnuSave Menu + Text = Shortcut(("Save"), "S") + Picture = Picture["icon:/16/save"] + Shortcut = "Ctrl+S" + } + { mnuSaveAs Menu + Text = Shortcut(("Save As"), "a") & "..." + Shortcut = "Ctrl+Shift+S" + } + { Menu2 Menu + } + { mnuQuit Menu + Text = Shortcut(("Quit"), "Q") + Picture = Picture["icon:/16/quit"] + Shortcut = "Ctrl+Q" + } + } + { mnuEdit Menu + Text = Shortcut(("Edit"), "E") + { mnuCopy Menu + Text = Shortcut(("Copy"), "C") + Picture = Picture["icon:/16/copy"] + Shortcut = "Ctrl+C" + } + { mnuCut Menu + Text = Shortcut(("Cut"), "u") + Picture = Picture["icon:/16/cut"] + Shortcut = "Ctrl+X" + } + { mnuPaste Menu + Text = Shortcut(("Paste"), "P") + Picture = Picture["icon:/16/paste"] + Shortcut = "Ctrl+V" + } + { Menu3 Menu + } + { mnuUndo Menu + Text = Shortcut(("Undo"), "U") + Picture = Picture["icon:/16/undo"] + Shortcut = "Ctrl+Z" + } + { mnuRedo Menu + Text = Shortcut(("Redo"), "R") + Picture = Picture["icon:/16/redo"] + Shortcut = "Ctrl+Y" + } + { Menu4 Menu + } + { mnuFont Menu + Text = Shortcut(("Choose Font"), "F") & "..." + } + { mnuWrap Menu + Text = Shortcut(("Wrap text"), "W") + Picture = Picture["icon:/16/text-fill"] + Checked = True + } + } + { mnuHelp Menu + Text = Shortcut(("?"), "?") + { mnuAbout Menu + Text = Shortcut(("About"), "A") & "..." + } + } + { txtNotepad TextArea + MoveScaled(1,1,35,26) + Font = Font["Liberation Mono,9"] + Expand = True + Text = ("txtNotepad") + Wrap = True + Border = False + } +} diff --git a/app/examples/Misc/Notepad/notepad.png b/app/examples/Misc/Notepad/notepad.png new file mode 100644 index 0000000000000000000000000000000000000000..3be5a715d315f1ae71f5aa52871fef3547f1e4de GIT binary patch literal 4015 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 literal 0 HcmV?d00001 diff --git a/app/examples/Misc/PDFViewer/.directory b/app/examples/Misc/PDFViewer/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/app/examples/Misc/PDFViewer/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/app/examples/Misc/PDFViewer/.icon.png b/app/examples/Misc/PDFViewer/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ea9495756338ebad0b64dc3c63afb034bfde3afd GIT binary patch literal 4253 zcmV;O5Mu9%P)4)s8q;q z!fw?rn@}krun-7#IFf=Sc8pCzjBRWo+xWI*oz^W`*Swkc=5_BMIxLN4W7)=Ff2+D` zW?px{{(ax~_xpAC>k(XF$X)p+Mr+Up=U4?D8}B=-{^Un(&}fi%=SBe1lKo663?q}W z&$>_Rqc-YvQ1H2pXf04eaPQ6eJg~Busz#ed-|51aQ;OTX4S<|m{{+H9doGdv&k;HF z+Y6h3qA&gpZNO+)c11R;K3|My1$d?$iZhZ)3t7a9mf|*VBX{KnjAzJB^JCizH}6`w zPze}+_gfgDFdF7e472L4VkQ@b`Qv_gs{-P2*jfn-rf0FPt%SUl>rqPajoXU&)@|eY z%A@bI?&#suy4S~wfQkRS6{9_jfxPqpKe)Y!n@h8JvkIQy1a|Cr-I%L6=178B`7D}~ z$wPNfqM^;@x*r^%@<+|@< zD-k~PlNw@P98?g5K)cKxf)R;e>wCz=5{i#Tp_U&yTeHabX3q$9fv^0Bs=dnb9)<%qcW!@70L)KVH+e_@@aZO#j|4j5cJY`1t-Uc`Tcs&U>x!^j?U> z`wSYu(YkJSme&!I9*=%;0#{7S;PH*{TG{Y={$K!%Kwx2v!ScXp1KNiOWPRXx#YjK? z+uBxhN$!~uFhJnp7QvaQ=)-{4IF83_kKL7ZN8+`UD?pz)0RR)T&aVAAhW}ubyk(>d zBNO2D`QOC^VHj~@Ffsucyt7om#|4$gamzL)Psee1ohgnIX8iTmZoJOvmwW z#_fv4*NXr6V}0kWqGUDH<+UOCqaN&s0V(Jm@|oQ=y`J^%5xZwcwKHr!;8WtFB*67d z*U;};d&Y7-5eZsqn88AfuHy>@GGPNS=IV&0q_mZk$)~D#u|Oq$m(sSBQW2$8!iA4| zs2>s%l&zGGSh7z6!!Ag1?lOS(;#60>Lud6q<}Cgy+KVIAN3;(khch6hv@M@hQ7b_K z;v5m6wa2#2&tRrZWAe0xG*y?=dUQXtuloE)W4{?rfKTeEr7USHnLxlfm;-3-v1{8J z#IzZ>hu)`CX3&$JN>WgvggWc~&jcnRx+}}GEla3~I>G7Bei~eVq>Sz{DTug(sjZ@> zNHeA6GR(U>kV@c0y0DUxk@9?!G2Bi|sEDPMj3z1ob9Q+!?nG%kR*kQy2#mpZ&CPTk zJ7sClq%8Oc3Nn0fZ2Xlr5?Aq`&jfZ#O8Hmp- zB`uteb{#@vvWQlcv2S|~*+rMJ^$)+`Nb3QL=iP*q=Wo&>5?nwkX&wgd+^?Qy{qKIuPkz4@oDVb~^^oTfHw!Vf{zYAYsF3A}|EG5rt%1xZ$ zDJg8rQqopx_!T|M5D@8V<+=ZThzIk>@xt9-V*RtvP&8>8-+A&?8oMGyGII!BdIQ;) zhx$h%Q3vg^GZOXol;;+ODS7Q!LTAuUW^x~qphB!%}1!*^Cr{B z)H7+(B2t0moE++#nt9|uAHz*b!Hs)py9ez=2mQ};qL|uB^2QWkS-w-=>ztPaJ1wPb zOG(qEq!4gC`JXHX96hvyE}u(8$JpOc$1PK{(b)w&TUO6~dm8w^r=Fzj^*0bjm++hI zH5}=TBE|9GV~oLRtYt>Q48|5rIe(9SWCaK%O_!xC*(?P@44M6y5n{lW@=X+lyXf?1 z(wme;rjX2)swJku3Z>xnb|aKUtf_`^(KsdZ z7NSNG{Eaa<(caUK&O+c%NZ`+$|x$~My?2HCzGd_B2_mDbsA-!E4^f+2FO08(g-F&JZL+_Z^tH{HasEn6ThjhGMw z{Qf?2`s)~DkV2mj^ps?f0Bw*mZZ%005KT%VloBWh}U2S+hoy2`fY(7{+$n7TR_u)A<%|~nbuZ+petg7KNRh6_fbkJ-p##SF<@rwHx z=y%jbfRqv`B|a%>T)UPr3l`w*+J!NOXe@@ZETmF{_4?W*7BOh2k_ZzJP1dTLe9^}? zM4bUu8e@c(5O-pPQw&q*UeB5hn{hguk;)?T6U*o*+eF&*Qns}j3L9(jxhZtKyMeKb z?_lc{pJc&XYbkPU4j{R;bQxodrk&A~A5?$@Ath1>a+fTj^5KVRdg2L!`T3-zq!6)f zT-QZPiITFfu4DuSn8COpz*%*JFKPi;QrJR@V83tR2|+9tA?UWC^+ejz3J~pkiM7<@ zcK8XG%%{6z58 zOMa;^p|KQ9E@5IjbVg$cDQQ~w0^=^bhOlP{W#v<8cabzUpP1uN7jsZj(4Cr0cBqwx z$};jN%{zMq2pF2b5CX5F0xLfs*YilZ=N>}Km(z6by>z_%GAa;2{_v&59WYd1co2oy3J=!o-}+8DG+LYIbj?y`z~U zx)Zy$0W~HU>GLtrhmwNwx>n{)o6BpjzQ6*vo$B)K-15mUkeZn{Y61qvWBQ*yfLmEf zjR#)SD-~qz3XJfR+jm3x=fwKH3EPn^q0R4zU{~nRmzamt9fkO;@4yUCvGq0Fu zpLr2$=Q=X7vd}{Chrh1HOU*>iU(Ea)mcX$lj1d@P1~*jwmSSgJE57NUptrT2`@i?E zlvi$}x^g!I{hw};vfucAH?UuMh2C}RV9_EnUVM?zym`2egX_BVMk2hmznf5U%8C65 zGiaM7hA6;NBBBQsAjHsh^Y|&#S!zi(*H<&yitzTKBV;aIiuQ-7tgJ=^Q|PQYOrW=i zflo;k9_3X{?0w-cOvue8(o%)1HJ41AbJ_}!$0b1TFMo;s&O7+;zn`>a z%ki{F)V49k5DJBO>p(Zrl;RUoV81fOKwy;pF`!QYlIU@kKqZvIiPKm*a~^&-NPb#6 zGAW359nzYsxjLv=e&cP-OAQm-vlXK?qJQ6CC?C%Io0*-LPpKaQjYko#V*lRlIK5pb z+~-sU!0G6K>}-5jT}ASeC4fPD9&y*jj>cHOyB#N`7)y!~`;g+ex-B^*3rHpHfhgli z#7O&e>6tlPd)-nB_LcE+Z7u%n0=k5uxut=dZuk^Tox#MtJNU5lf2AthH%ozA%8OQ=5dKFU(3y&tIh*BVxOI;ymkcs!0jDXC9sQsTrl@79AGDny;) z#pW;t2yxs6d=h)$c%Ia#Q!UmeOr1&Ej<<~cijsr7xPIxKr!9YgP&k#RHn(Fu4+h@cH?$63xBMZ3 z;Z!~-&j@J-laa-+EI>r)LFS}51&e-vfLm|4g{OZ1G`{JV6Yn}kwm*RDItU?1P0!@I zYnO4^+$*W9+{cccTc~Mi!qJ*>nb{Owvy@ZyKjOfJAe@#tsx~L1U~nodO$7S$)*A=) zce@?&Jpelv9~1ZV=^eGcz+fpE3kIxqfUw{E{N}0hF$+K&-D|rFV~mJIJ*AE2qB|iY zKnkObkU|Jyl6|@t`dy&2y`v)TOZP`&aT$#|sxRkWd<+O7l!pm~0+#M1nU{!qtV>0xg3C084=qAO!f~1B2>?1`lw7Uf=-m z=K%r$0zf`61;_(3fFKvx-|9{QO<&sU02+Y9KphYpvIa!;8y%oe0g{uPCcgk-`blv5 ziw(pX;XU}pV({q@a_$T+{M0`Kbayl>FKZ%x3hlhSw!(YnUh}3PT^>2?5?``_f ztXY2d&)IvZ3(KE^kw2mwic>!ilRIh6d^o1Z3> zI{|4a?D{eq|GEkt>;BM4<^!`S@stor)WQ?@&2=hd3t`0{x( zb|mCvr4X=UcwUq>Pu, 2007-2010. +# +# +msgid "" +msgstr "" +"Project-Id-Version: PDFViewer\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2011-03-20 21:38+0100\n" +"Last-Translator: Jordi Sayol \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: .project:1 +msgid "PdfViewer" +msgstr "VisualitzadorPdf" + +#: .project:2 +msgid "A simple PDF Viewer, used as example of gb.pdf capabilities" +msgstr "Un visualitzador simple de PDF, com a exemple de les capacitats de gb.pdf" + +#: FMain.class:40 +msgid "Pdf documents" +msgstr "Documents pdf" + +#: FMain.class:114 +msgid "From" +msgstr "Des de" + +#: FMain.class:253 +msgid "Simple PDF document viewer" +msgstr "Visualitzador simple de documents PDF" + +#: FMain.class:261 +msgid "Open file..." +msgstr "Obre fitxer..." + +#: FMain.class:268 +msgid "About..." +msgstr "Quant a..." + +#: FMain.class:276 +msgid "Rotate" +msgstr "Rota" + +#: FMain.class:284 +msgid "Zoom out" +msgstr "Allunya" + +#: FMain.class:292 +msgid "Zoom in" +msgstr "Apropa" + +#: FMain.class:300 +msgid "Find text" +msgstr "Cerca el següent" + +#: FMain.class:319 +msgid "Previous page" +msgstr "Pàgina anterior" + +#: FMain.class:327 +msgid "Next page" +msgstr "Pàgina següent" + +#: Fabout.class:61 +msgid "OK" +msgstr "D'acord" + +#: Fabout.class:68 +msgid "Simple PDF document viewer.

    Gambas example by Daniel Campos Fernández " +msgstr "Visualitzador simple de documents PDF.

    Exemple del Gambas per Daniel Campos Fernández " + diff --git a/app/examples/Misc/PDFViewer/.lang/cs.po b/app/examples/Misc/PDFViewer/.lang/cs.po new file mode 100644 index 00000000..6e4fb0fb --- /dev/null +++ b/app/examples/Misc/PDFViewer/.lang/cs.po @@ -0,0 +1,80 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "PdfViewer" +msgstr "-" + +#: .project:2 +msgid "A simple PDF Viewer, used as example of gb.pdf capabilities" +msgstr "Ukázka PDF prohlížeče, příklad užití schopnosti gb.pdf" + +#: FMain.class:52 +msgid "Pdf documents" +msgstr "PDF dokument" + +#: FMain.form:30 +msgid "Simple PDF document viewer" +msgstr "Ukázka prohížeče PDF dokumentů" + +#: FMain.form:38 +msgid "Open file..." +msgstr "Otevřít soubor..." + +#: FMain.form:44 +msgid "About..." +msgstr "O aplikaci..." + +#: FMain.form:51 +msgid "Rotate" +msgstr "Rotace" + +#: FMain.form:58 +msgid "Zoom out" +msgstr "Oddálit" + +#: FMain.form:65 +msgid "Zoom in" +msgstr "Přiblížit" + +#: FMain.form:76 +msgid "Find text" +msgstr "Najdi text" + +#: FMain.form:90 +msgid "Previous page" +msgstr "Předchozí stránka" + +#: FMain.form:99 +msgid "Next Found" +msgstr "Další nalezeno" + +#: FMain.form:119 +msgid "Page" +msgstr "Stránka" + +#: FMain.form:130 +msgid "Go to this page" +msgstr "Jdi na tuto stránku" + +#: FMain.form:143 +msgid "Next page" +msgstr "Další stránka" + +#: Fabout.form:20 +msgid "

    Simple PDF document viewer

    Gambas example by Daniel Campos Fernández and Bernd Brinkmann" +msgstr "

    Jednotuchý prohlížeč PDF dokumentů

    Gambas příklad od Daniel Campos Fernández a Bernd Brinkmann" + +#: Fabout.form:34 +msgid "OK" +msgstr "-" diff --git a/app/examples/Misc/PDFViewer/.lang/de.po b/app/examples/Misc/PDFViewer/.lang/de.po new file mode 100644 index 00000000..cc0d9373 --- /dev/null +++ b/app/examples/Misc/PDFViewer/.lang/de.po @@ -0,0 +1,80 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "PdfViewer" +msgstr "PDF-Betrachter" + +#: .project:2 +msgid "A simple PDF Viewer, used as example of gb.pdf capabilities" +msgstr "Ein einfacher PDF-Betrachter, Beispiel für die Fähigkeiten von gb.pdf" + +#: FMain.class:52 +msgid "Pdf documents" +msgstr "pdf-Dateien" + +#: FMain.form:30 +msgid "Simple PDF document viewer" +msgstr "Einfacher Betrachter für PDF-Dokumente" + +#: FMain.form:38 +msgid "Open file..." +msgstr "Datei öffnen..." + +#: FMain.form:44 +msgid "About..." +msgstr "&Über..." + +#: FMain.form:51 +msgid "Rotate" +msgstr "Drehen" + +#: FMain.form:58 +msgid "Zoom out" +msgstr "Verkleinern" + +#: FMain.form:65 +msgid "Zoom in" +msgstr "Vergrößern" + +#: FMain.form:76 +msgid "Find text" +msgstr "Text finden" + +#: FMain.form:90 +msgid "Previous page" +msgstr "Vorherige Seite" + +#: FMain.form:99 +msgid "Next Found" +msgstr "Nächste Fundstelle" + +#: FMain.form:119 +msgid "Page" +msgstr "Seite" + +#: FMain.form:130 +msgid "Go to this page" +msgstr "Gehe zu Seite" + +#: FMain.form:143 +msgid "Next page" +msgstr "Nächste Seite" + +#: Fabout.form:20 +msgid "

    Simple PDF document viewer

    Gambas example by Daniel Campos Fernández and Bernd Brinkmann" +msgstr "

    Einfacher PDF-Betrachter

    Gambas-Beispiel von Daniel Campos Fernández und Bernd Brinkmann" + +#: Fabout.form:34 +msgid "OK" +msgstr "-" diff --git a/app/examples/Misc/PDFViewer/.lang/es.po b/app/examples/Misc/PDFViewer/.lang/es.po new file mode 100644 index 00000000..73d95061 --- /dev/null +++ b/app/examples/Misc/PDFViewer/.lang/es.po @@ -0,0 +1,64 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:2 +msgid "A simple PDF Viewer, used as example of gb.pdf capabilities" +msgstr "Un simple Visor PDF, usado como ejemplo de las capacidades de gb.pdf" + +#: FMain.class:276 +msgid "Find text" +msgstr "Buscar texto" + +#: FMain.class:110 +msgid "From" +msgstr "de" + +#: FMain.class:321 +msgid "Next page" +msgstr "Página siguiente" + +#: Fabout.class:61 +msgid "OK" +msgstr "Aceptar" + +#: FMain.class:255 +msgid "Open file..." +msgstr "Abrir archivo..." + +#: .project:1 +msgid "PdfViewer" +msgstr "Visor Pdf" + +#: FMain.class:313 +msgid "Previous page" +msgstr "Página anterior" + +#: FMain.class:283 +msgid "Rotate" +msgstr "Rotar" + +#: FMain.class:245 +msgid "Simple PDF document viewer" +msgstr "Visor simple de documentos PDF" + +#: Fabout.class:68 +msgid "Simple PDF document viewer.

    Gambas example by Daniel Campos Fernández " +msgstr "Visor simple de documentos PDF.

    Ejemplo para Gambas por Daniel Campos Fernández." + +#: FMain.class:299 +msgid "Zoom in" +msgstr "Aumentar" + +#: FMain.class:291 +msgid "Zoom out" +msgstr "Disminuir" + diff --git a/app/examples/Misc/PDFViewer/.lang/ru.po b/app/examples/Misc/PDFViewer/.lang/ru.po new file mode 100644 index 00000000..ed649400 --- /dev/null +++ b/app/examples/Misc/PDFViewer/.lang/ru.po @@ -0,0 +1,112 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Misc/PDFViewer/.project:23 +msgid "PdfViewer" +msgstr "Просмотрщик PDF" + +#: app/examples/Misc/PDFViewer/.project:24 +msgid "A simple PDF Viewer, used as example of gb.pdf capabilities" +msgstr "Простой просмотрщик PDF, используемый как пример возможностей gb.pdf" + +#: app/examples/Misc/PDFViewer/.src/FMain.class:47 +msgid "Pdf documents" +msgstr "Документы PDF" + +#: app/examples/Misc/PDFViewer/.src/FMain.class:131 +msgid "Can't set zoom to " +msgstr "Невозможно установить масштаб на " + +#: app/examples/Misc/PDFViewer/.src/FMain.class:131 app/examples/Misc/PDFViewer/.src/Fabout.form:23 +msgid "OK" +msgstr "ОК" + +#: app/examples/Misc/PDFViewer/.src/FMain.class:134 +msgid "of" +msgstr "из" + +#: app/examples/Misc/PDFViewer/.src/FMain.class:159 app/examples/Misc/PDFViewer/.src/FMain.class:384 app/examples/Misc/PDFViewer/.src/FMain.class:433 +msgid "" +"An error occurred while trying to view the document.\n" +"\n" +"If this persists please report this problem." +msgstr "" +"Произошла ошибка при попытке просмотра документа.\n" +"\n" +"Если это повторяется, то сообщите об этой проблеме." + +#: app/examples/Misc/PDFViewer/.src/FMain.form:5 +msgid "Simple PDF document viewer" +msgstr "Простой просмотрщик PDF документов" + +#: app/examples/Misc/PDFViewer/.src/FMain.form:11 +msgid "Open file..." +msgstr "Открыть файл..." + +#: app/examples/Misc/PDFViewer/.src/FMain.form:16 +msgid "About..." +msgstr "О программе..." + +#: app/examples/Misc/PDFViewer/.src/FMain.form:22 +msgid "Rotate" +msgstr "Вращение" + +#: app/examples/Misc/PDFViewer/.src/FMain.form:28 +msgid "Zoom out" +msgstr "Уменьшить" + +#: app/examples/Misc/PDFViewer/.src/FMain.form:34 +msgid "Zoom in" +msgstr "Увеличить" + +#: app/examples/Misc/PDFViewer/.src/FMain.form:43 +msgid "Find text" +msgstr "Найти текст" + +#: app/examples/Misc/PDFViewer/.src/FMain.form:55 app/examples/Misc/PDFViewer/.src/FMain.form:74 +msgid "Previous page" +msgstr "Предыдущая страница" + +#: app/examples/Misc/PDFViewer/.src/FMain.form:63 +msgid "Next Found" +msgstr "Следующий найденный" + +#: app/examples/Misc/PDFViewer/.src/FMain.form:80 +msgid "Page" +msgstr "Страница" + +#: app/examples/Misc/PDFViewer/.src/FMain.form:89 +msgid "Go to this page" +msgstr "Перейти на эту страницу" + +#: app/examples/Misc/PDFViewer/.src/FMain.form:100 +msgid "Next page" +msgstr "Следующая страница" + +#: app/examples/Misc/PDFViewer/.src/Fabout.form:12 +msgid "

    Simple PDF document viewer

    Gambas example by Daniel Campos Fernández and Bernd Brinkmann" +msgstr "

    Простой просмотрщик PDF документов

    Пример Gambas Даниэля Кампоса Фернандеса и Бернда Бринкмана" + diff --git a/app/examples/Misc/PDFViewer/.project b/app/examples/Misc/PDFViewer/.project new file mode 100644 index 00000000..6f8d363c --- /dev/null +++ b/app/examples/Misc/PDFViewer/.project @@ -0,0 +1,21 @@ +# Gambas Project File 3.0 +Title=PdfViewer +Startup=FMain +Icon=pdf.png +Version=3.13.90 +VersionFile=1 +Component=gb.image +Component=gb.gui +Component=gb.form +Component=gb.pdf +Description="A simple PDF Viewer, used as example of gb.pdf capabilities" +Authors="Daniel Campos Fernández " +Environment="GB_GUI=gb.qt5" +TabSize=2 +Translate=1 +Language=en +Maintainer=benoit +Vendor=Princeton +Address=benoit@localhost +License=General Public Licence +Packager=1 diff --git a/app/examples/Misc/PDFViewer/.src/FMain.class b/app/examples/Misc/PDFViewer/.src/FMain.class new file mode 100644 index 00000000..3cd2794b --- /dev/null +++ b/app/examples/Misc/PDFViewer/.src/FMain.class @@ -0,0 +1,472 @@ +' Gambas class file + +'*************************************************************************** +' +' FMain.class +' +' PdfViewer gb.pdf component example +' +' (C) 2007 Daniel Campos Fernández +' 2012 Bernd Brinkmann (modifications on the search and zoom function) +' +' 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 1, or (at your option) +' any later version. +' +' 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 1, 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, write to the Free Software +' Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +' +'*************************************************************************** + +Public hPdf As New PdfDocument +Public cIndex As Integer +Public CurrentPage As Integer +Public CurrentZoom As Float = 1.0 +Private bExit As Boolean +Private currentSearchResult As Short = 0 'Contains the information which of the search results on this page is marked +Private NumberOfSearchResults As Integer +Private currentSearchResultSynonyms As Short = 0 +Private ScrollXPositionBeforeZoom As Float +Private ScrollYPositionBeforeZoom As Float + + +Public Sub BtOpen_Click() + + Dialog.Filter = ["*.pdf", ("Pdf documents")] + If Dialog.OpenFile(False) Then Return + + hPdf.Close() + Try hPdf.Open(Dialog.Path) + If Error Then + Message.Error(Error.Text) + Return + End If + + CurrentZoom = 1 + CurrentPage = 1 + RenderPage() + BtPrev.Enabled = False + If hPdf.Count > 1 Then + BtNext.Enabled = True + Else + BtNext.Enabled = False + End If + txtGotoPage.Enabled = True + btZoomIn.Enabled = True + btZoomOut.Enabled = True + btRotate.Enabled = True + pBox.Visible = True + txtFind.Enabled = True + + tvIndex.Clear() + If hPdf.HasIndex Then + tvIndex.Visible = True + AddIndex(0, "") + splIndex.Layout = [1, 3] + Else + tvIndex.Visible = False + End If + +End + +Public Function AddIndex(nItem As Integer, pItem As String) As Integer + + Dim pR As String + Dim iPage As Integer + + Do + iPage = 1 + Try iPage = hPdf.Index.Data.Page + If Error Then Print Error.Text + pR = nItem & "-" & iPage + tvIndex.Add(nItem & "-" & iPage, hPdf.Index.Title, Null, pItem) + Inc nItem + If hPdf.Index.HasChildren Then + hPdf.Index.MoveChild() + nItem = AddIndex(nItem + 1, pR) + hPdf.Index.MoveParent() + End If + Loop Until hPdf.Index.MoveNext() + + Return nItem + +End + +Public Sub tvIndex_Click() + + CurrentPage = Mid(tvIndex.Current.Key, InStr(tvIndex.Current.Key, "-") + 1) + BtPrev.Enabled = True + BtNext.Enabled = True + If CurrentPage = 1 Then BtPrev.Enabled = False + If CurrentPage = hPdf.Count Then BtNext.Enabled = False + RenderPage() + +End + +Public Sub RenderPage(Optional FoundText As String, Optional Casesensetivity As Boolean) + '--------------------------------------------------------------------------- + 'This function is called everytime something changed for example a new search result has to be displayed or the page + 'has canged the parameters FoundText and Casesensetivity are only of interrest if the funktion is called from a search frunction + '-------------------------------------------------------------------------- + Dim hPic As Picture + + ScrollXPositionBeforeZoom = ViewPort.ScrollX / ViewPort.ScrollWidth + ScrollYPositionBeforeZoom = ViewPort.ScrollY / ViewPort.ScrollHeight + + If CurrentZoom > 0.0 Then + hPdf.Zoom = CurrentZoom + Else + Message.Error(("Can't set zoom to ") & CurrentZoom, ("OK")) + Endif + + lblInfo.Text = " " & ("of") & " " & hPdf.Count + If txtGotoPage.text <> CurrentPage Then txtGotoPage.text = CurrentPage 'if the parameter currentPage is different from the current page the current page gets changed + If currentSearchResult = 0 Then 'if a search result is highlighted the focus will not be changed to the top + ViewPort.Scroll(0, 0) + Endif + + hPic = hPdf[CurrentPage].Image.Picture + + 'the search result gets highlighted here and the focus is set to the right position again if something has changed for example the zoomfactor + If currentSearchResult > 0 And FoundText <> "" Then ' resets the mark on the current search result + hPdf[CurrentPage].Find(FoundText, Casesensetivity) + Paint.Begin(hPic) + Paint.Brush = Paint.Color(Color.RGB(0, 0, 255, 192)) + Paint.Rectangle(hPdf[CurrentPage].Result[currentSearchResult - 1].Left, hPdf[CurrentPage].Result[currentSearchResult - 1].Top, hPdf[CurrentPage].Result[currentSearchResult - 1].Width, hPdf[CurrentPage].Result[currentSearchResult - 1].Height) + ViewPort.ScrollY = ViewPort.ScrollHeight * (hPdf[CurrentPage].Result[currentSearchResult - 1].Top / Paint.Height) + Paint.Fill + Paint.End + PBox.Picture = hPic + Endif + + PBox.Picture = hPic + PBox.Resize(hPdf[CurrentPage].Width, hPdf[CurrentPage].Height) + Form_Resize() + +Catch + Message.Info(("An error occurred while trying to view the document.\n\nIf this persists please report this problem.")) + +End + + +Public Sub Form_Resize() + + If CurrentPage = 0 Then Return + ViewPort.ScrollX = ScrollXPositionBeforeZoom * ViewPort.ScrollWidth + ViewPort.Scrolly = ScrollYPositionBeforeZoom * ViewPort.ScrollHeight + +End + + +Public Sub splIndex_Resize() + + Form_Resize() + +End + +Public Sub BtNext_Click() + + Inc CurrentPage + currentSearchResult = 0 + currentSearchResultSynonyms = 0 + If CurrentPage = hPdf.Count Then + BtNext.Enabled = False + End If + BtPrev.Enabled = True + BtPrev.SetFocus + txtGotoPage.text = CurrentPage 'this automatically calls the function txtGotoPage_Change and changes the page to the new "currentPage" + +End + +Public Sub BtPrev_Click() + + Dec CurrentPage + currentSearchResult = 0 + currentSearchResultSynonyms = 0 + If CurrentPage = 1 Then + BtPrev.Enabled = False + End If + BtNext.Enabled = True + BtNext.SetFocus + txtGotoPage.text = CurrentPage 'this automatically calls the function txtGotoPage_Change and changes the page to the new "currentPage" + +End +Public Sub btZoomIn_Click() + + If CurrentZoom < 3 Then CurrentZoom += 0.1 + If CurrentZoom = 3 Then btZoomIn.Enabled = False + btZoomOut.Enabled = True + RenderPage() + +End + +Public Sub btZoomOut_Click() + + If CurrentZoom > 0.5 Then CurrentZoom -= 0.1 + If CurrentZoom = 0.5 Then btZoomOut.Enabled = False + btZoomIn.Enabled = True + RenderPage() + +End + +Public Sub Form_Close() + + hPdf.Close() + +End + +Public Sub Button1_Click() + + Fabout.ShowDialog() + +End + +Public Sub btRotate_Click() + + Select Case hPdf.Orientation + Case PdfDocument.Normal + hPdf.Orientation = PdfDocument.Sideways + Case PdfDocument.Sideways + hPdf.Orientation = PdfDocument.Inverted + Case PdfDocument.Inverted + hPdf.Orientation = PdfDocument.SidewaysInverted + Case PdfDocument.SidewaysInverted + hPdf.Orientation = PdfDocument.Normal + End Select + + RenderPage() + +End + +Public Sub txtGotoPage_Change() + + '--------------------------------------------------------------------------- + 'This function changes the page to the page number written in the textbox "txtGotoPage" + 'the text in this textbox can be changed by the user for example by klicking on the next button or other funktions such as + 'a search funktion + '-------------------------------------------------------------------------- + ' + If Bexit Or Last.text = "" Then Return + 'the last search results get removed by the next four lines + BtSearchNext.Enabled = False + BtSearchPrev.Enabled = False + currentSearchResult = 0 + If Val(Last.text) > hPdf.Count Or Val(Last.text) = hPdf.Count Then 'hPdf.count contains the length of the pdf document + bExit = True + txtGotoPage.text = hPdf.Count + BtNext.Enabled = False 'because the last page is now displayed the next page button gets disabled + BtPrev.Enabled = True + bExit = False + Else + BtNext.Enabled = True + If Val(Last.text) = 1 Or Val(Last.text) < 1 Then + bExit = True + txtGotoPage.text = 1 + bExit = False + BtPrev.Enabled = False + Else + BtPrev.Enabled = True + End If + End If + currentPage = Val(Last.text) + Bexit = False + RenderPage() + +End + +Public Sub txtGotoPage_KeyPress() + + ' If modUtil.AllowKeys(const.AllowKeys_NumbersOnly, Key.code) = False Then + ' Stop Event + ' Return + ' End If + +End + +Public Sub txtFind_Activate() + + '--------------------------------------------------------------------------- + 'This function is called if the user wants fo find the string inside the textbox "TxtFind" by hitting the enter key + '-------------------------------------------------------------------------- + + If Bexit Then Return + If txtFind.Text <> "" Then + If currentSearchResult > 0 Then + If currentSearchResult = NumberOfSearchResults Then + If currentpage = hPdf.Count Then + CurrentPage = 1 + Else + CurrentPage = CurrentPage + 1 + Endif + FindNext() + Else + currentSearchResult = currentSearchResult + 1 + RenderPage(txtFind.Text) + Endif + Else + FindNext() + Endif + End If + +End + +Public Sub txtFind_Click() + + txtFind_Activate + +End + + +Private Sub FindNext() + '--------------------------------------------------------------------------- + ' This function finds the next string in the pdf matching the search string located after the current search result + '--------------------------------------------------------------------------- + Dim hPic As Picture + Dim currentSearchPage As Short = CurrentPage ' contains the information on which page the search funktion searched the last time + Dim LastPageToSearch As Short ' contains the information which page is the last page for the find function + + If CurrentPage = 1 Then + LastPageToSearch = 1 + Else + LastPageToSearch = CurrentPage + + Endif + currentSearchResultSynonyms = 0 + currentSearchResult = 0 + BtSearchNext.Enabled = False + BtSearchPrev.Enabled = False + Repeat + hPic = hPdf[currentSearchPage].Image.Picture + hPdf[currentSearchPage].Find(txtFind.Text, False) + + If hPdf[currentSearchPage].Result.Count > 0 Then + CurrentPage = currentsearchPage + currentSearchResult = 1 + Else + If currentSearchPage = hPdf.Count Then + currentSearchPage = 1 + Else + currentSearchPage = currentSearchPage + 1 + Endif + Endif + Until currentSearchResult <> 0 Or currentSearchPage = LastPageToSearch + If hPdf[currentSearchPage].Result.Count > 0 Then + CurrentPage = currentSearchPage + + txtGotoPage.text = CurrentPage + currentSearchResult = 1 + NumberOfSearchResults = hPdf[currentSearchPage].Result.Count + BtSearchNext.Enabled = True + BtSearchPrev.Enabled = True + + + RenderPage(txtFind.Text) + + Else + txtFind.Background = Color.Lighter(16711680) '16711680 = Red + RenderPage() + + Endif + +Catch + Message.Info(("An error occurred while trying to view the document.\n\nIf this persists please report this problem.") & "\n\n" & Error.Where & ": " & Error.Text) + +End + +Private Sub FindPrevious() + '--------------------------------------------------------------------------- + ' This function finds the next string in the pdf matching the search string located before the current search result + '--------------------------------------------------------------------------- + Dim hPic As Picture + Dim currentSearchPage As Short = CurrentPage ' contains the information on which page the search funktion searched the last time + Dim LastPageToSearch As Short ' contains the information which page is the last page for the find function + + If CurrentPage = hPdf.Count Then + LastPageToSearch = 0 + Else + LastPageToSearch = CurrentPage + Endif + currentSearchResultSynonyms = 0 + currentSearchResult = 0 + BtSearchNext.Enabled = False + BtSearchPrev.Enabled = False + + Repeat + hPic = hPdf[currentSearchPage].Image.Picture + hPdf[currentSearchPage].Find(txtFind.Text, False) + If hPdf[currentSearchPage].Result.Count > 0 Then + CurrentPage = currentsearchPage + currentSearchResult = 1 + Else + If currentSearchPage = 1 Then + currentSearchPage = hPdf.Count + Else + currentSearchPage = currentSearchPage - 1 + Endif + Endif + Until currentSearchResult <> 0 Or currentSearchPage = LastPageToSearch + + If hPdf[currentSearchPage].Result.Count > 0 Then + CurrentPage = currentSearchPage + + txtGotoPage.text = CurrentPage + currentSearchResult = hPdf[currentSearchPage].Result.Count + NumberOfSearchResults = hPdf[currentSearchPage].Result.Count + BtSearchNext.Enabled = True + BtSearchPrev.Enabled = True + RenderPage(txtFind.Text) + Endif + +Catch + Message.Info(("An error occurred while trying to view the document.\n\nIf this persists please report this problem.")) + +End + +Public Sub BtSearchNext_Click() + '--------------------------------------------------------------------------- + 'This funktion is highlighting the next seach string located after the current search string + '--------------------------------------------------------------------------- + If currentSearchResult = NumberOfSearchResults Then + If currentpage = hPdf.Count Then + CurrentPage = 1 + Else + CurrentPage = CurrentPage + 1 + Endif + FindNext() + Else + currentSearchResult = currentSearchResult + 1 + RenderPage(txtFind.Text) + Endif + +End + +Public Sub BtSearchPrev_Click() + '--------------------------------------------------------------------------- + 'This funktion is highlighting the next seach string located before the current search string + '--------------------------------------------------------------------------- + If currentSearchResult > 0 Then + If currentpage = 1 Then + currentpage = hPdf.Count + Else + CurrentPage = CurrentPage - 1 + Endif + FindPrevious() + Else + currentSearchResult = currentSearchResult - 1 + RenderPage(txtFind.Text) + Endif + +End + diff --git a/app/examples/Misc/PDFViewer/.src/FMain.form b/app/examples/Misc/PDFViewer/.src/FMain.form new file mode 100644 index 00000000..fb055f2c --- /dev/null +++ b/app/examples/Misc/PDFViewer/.src/FMain.form @@ -0,0 +1,126 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,106,99) + Text = ("Simple PDF document viewer") + Arrangement = Arrange.Vertical + { HBox1 HBox + MoveScaled(1,2,95,4) + { BtOpen ToolButton + MoveScaled(0,0,4,4) + ToolTip = ("Open file...") + Picture = Picture["icon:/small/open"] + } + { Button1 ToolButton + MoveScaled(4,0,4,4) + ToolTip = ("About...") + Picture = Picture["icon:/small/question"] + } + { btRotate ToolButton + MoveScaled(8,0,4,4) + Enabled = False + ToolTip = ("Rotate") + Picture = Picture["icon:/small/rotate-right"] + } + { btZoomOut ToolButton + MoveScaled(12,0,4,4) + Enabled = False + ToolTip = ("Zoom out") + Picture = Picture["icon:/small/zoom-out"] + } + { btZoomIn ToolButton + MoveScaled(16,0,4,4) + Enabled = False + ToolTip = ("Zoom in") + Picture = Picture["icon:/small/zoom-in"] + } + { Separator3 Separator + MoveScaled(22,0,0,4) + } + { txtFind ButtonBox + MoveScaled(24,0,15,4) + Enabled = False + ToolTip = ("Find text") + Expand = True + Picture = Picture["icon:/small/find"] + Border = False + } + { Panel1 Panel + MoveScaled(40,0,8,4) + Visible = False + Background = Color.TextBackground + { BtSearchPrev Button + MoveScaled(0,0,4,4) + Enabled = False + ToolTip = ("Previous page") + Picture = Picture["icon:/small/left"] + Border = False + } + { BtSearchNext Button + MoveScaled(4,0,4,4) + Enabled = False + Background = Color.TextBackground + ToolTip = ("Next Found") + Picture = Picture["icon:/small/right"] + Border = False + } + } + { Separator1 Separator + MoveScaled(51,0,0,4) + } + { BtPrev ToolButton + MoveScaled(54,0,4,4) + Enabled = False + ToolTip = ("Previous page") + Picture = Picture["icon:/small/left"] + } + { Page Label + MoveScaled(59,0,4,4) + AutoResize = True + Text = ("Page") + Alignment = Align.Right + } + { Panel2 Panel + MoveScaled(64,0,1,4) + } + { txtGotoPage TextBox + MoveScaled(66,0,9,4) + Enabled = False + ToolTip = ("Go to this page") + Alignment = Align.Center + Border = False + } + { lblInfo Label + MoveScaled(75,0,7,4) + AutoResize = True + } + { BtNext ToolButton + MoveScaled(84,0,4,4) + Enabled = False + ToolTip = ("Next page") + Picture = Picture["icon:/small/right"] + } + } + { Separator2 Separator + MoveScaled(36,8,27,0) + } + { splIndex HSplit + MoveScaled(9,11,81,60) + Expand = True + { tvIndex TreeView + MoveScaled(0,0,19,25) + Visible = False + Border = False + } + { ViewPort ScrollView + MoveScaled(36,5,30,32) + Background = Color.TextBackground + Expand = True + Border = False + { PBox PictureBox + MoveScaled(3,3,24,21) + Visible = False + } + } + } +} diff --git a/app/examples/Misc/PDFViewer/.src/Fabout.class b/app/examples/Misc/PDFViewer/.src/Fabout.class new file mode 100644 index 00000000..10033197 --- /dev/null +++ b/app/examples/Misc/PDFViewer/.src/Fabout.class @@ -0,0 +1,43 @@ +' Gambas class file + +'*************************************************************************** +' +' FAbout.class +' +' PdfViewer gb.pdf component example +' +' (C) 2007 Daniel Campos Fernández +' +' +' 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 1, or (at your option) +' any later version. +' +' 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 1, 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, write to the Free Software +' Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +' +'*************************************************************************** + +Public Sub btOK_Click() + + Me.Close() + +End + +Public Sub Form_Open() + + + +End diff --git a/app/examples/Misc/PDFViewer/.src/Fabout.form b/app/examples/Misc/PDFViewer/.src/Fabout.form new file mode 100644 index 00000000..1b8565a2 --- /dev/null +++ b/app/examples/Misc/PDFViewer/.src/Fabout.form @@ -0,0 +1,32 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,48,22) + Resizable = False + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + { TextLabel1 TextLabel + MoveScaled(2,2,45,13) + Expand = True + Text = ("

    Simple PDF document viewer

    Gambas example by Daniel Campos Fernández and Bernd Brinkmann") + Alignment = Align.Center + } + { Panel1 HBox + MoveScaled(13,16,32,4) + { Panel2 Panel + MoveScaled(4,0,2,4) + Expand = True + } + { btOK Button + MoveScaled(10,0,15,4) + Text = ("OK") + Default = True + Cancel = True + } + { Panel3 Panel + MoveScaled(26,0,2,4) + Expand = True + } + } +} diff --git a/app/examples/Misc/PDFViewer/pdf.png b/app/examples/Misc/PDFViewer/pdf.png new file mode 100644 index 0000000000000000000000000000000000000000..651ded047317f9ff354a60a1ef9fd656a2720939 GIT binary patch literal 4588 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 literal 0 HcmV?d00001 diff --git a/app/examples/Misc/SystemTray/.lang/ru.po b/app/examples/Misc/SystemTray/.lang/ru.po new file mode 100644 index 00000000..2bc02a53 --- /dev/null +++ b/app/examples/Misc/SystemTray/.lang/ru.po @@ -0,0 +1,44 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Misc/SystemTray/.project:16 +msgid "SystemTray" +msgstr "Системный трей" + +#: app/examples/Misc/SystemTray/.project:17 +msgid "" +"X11 System tray example.\n" +"\n" +"This example shows how to create a system tray with the gb.desktop.x11 component." +msgstr "" +"Пример системного трея X11.\n" +"\n" +"В этом примере показано, как создать системный трей с компонентом gb.desktop.x11." + +#: app/examples/Misc/SystemTray/.src/FMain.form:5 +msgid "System tray" +msgstr "Системный лоток" + diff --git a/app/examples/Misc/SystemTray/.project b/app/examples/Misc/SystemTray/.project new file mode 100644 index 00000000..18bcc621 --- /dev/null +++ b/app/examples/Misc/SystemTray/.project @@ -0,0 +1,15 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.6.90 +Title=SystemTray +Startup=FMain +Icon=icon.png +Version=1.0.0 +Component=gb.image +Component=gb.gui +Component=gb.form +Component=gb.desktop.x11 +Description="X11 System tray example.\n\nThis example shows how to create a system tray with the gb.desktop.x11 component." +TabSize=2 +Vendor=Example +Packager=1 +Translate=1 diff --git a/app/examples/Misc/SystemTray/.src/FMain.class b/app/examples/Misc/SystemTray/.src/FMain.class new file mode 100644 index 00000000..87e76fb6 --- /dev/null +++ b/app/examples/Misc/SystemTray/.src/FMain.class @@ -0,0 +1,64 @@ +' Gambas class file + +'Private $hImage As Image + +Public Sub _new() + + 'Me.Background = &H007FFF 'Color.SetAlpha(&H007FFF, 192) + +End + +Public Sub Form_Open() + + X11Systray.Show(dwgSystemTray.Handle) + +End + +Static Public Sub X11Systray_Arrange() + + FMain.ArrangeTray + +End + +Public Sub ArrangeTray() + + Dim I As Integer + Dim X, Y, H As Integer + + Debug + X = 2 + Y = 2 + For I = 0 To X11Systray.Count - 1 + With X11Systray[I] + Debug I;; .IconW;; .IconH + If (X + .IconW) >= (Me.ClientW - 2) Then + X = 2 + Y += H + 2 + H = 0 + Endif + .Move(X, Y, .IconW, .IconH) + H = Max(H, .IconH) + X += .IconW + 2 + End With + Next + +End + +' Public Sub DrawingArea1_Draw() +' +' Paint.DrawImage($hImage, 0, 0) +' +' End + +Public Sub Form_Resize() + + ' Dim DH As Integer + ' + ' Paint.Begin(draSystemTray) + ' DH = 1 + draSystemTray.H / $hImage.H + ' Paint.DrawImage($hImage, 0, - DH, draSystemTray.W, draSystemTray.H + DH * 2) + ' Paint.End + ArrangeTray + +End + diff --git a/app/examples/Misc/SystemTray/.src/FMain.form b/app/examples/Misc/SystemTray/.src/FMain.form new file mode 100644 index 00000000..160008fc --- /dev/null +++ b/app/examples/Misc/SystemTray/.src/FMain.form @@ -0,0 +1,14 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,48,27) + Text = ("System tray") + Arrangement = Arrange.Fill + Margin = True + { dwgSystemTray DrawingArea + MoveScaled(8,2,24,24) + Background = &HFFFF00& + Border = Border.Plain + Cached = True + } +} diff --git a/app/examples/Misc/SystemTray/bg.png b/app/examples/Misc/SystemTray/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..7aa2ddb11f4b1cbde5ba7af09c5fb5b1379f47ae GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^3JeU43>+*#R>g`ve}Pn%r;B4q#jUsJ4stRm@US?F za&J$zp0H<)g21O4zwaA;o;UHzCz2f|g6G~Y?TNylE L{an^LB{Ts5O#vu< literal 0 HcmV?d00001 diff --git a/app/examples/Misc/SystemTray/icon.png b/app/examples/Misc/SystemTray/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7b22ad890590a54e372bb70ab931baf3249b907b GIT binary patch literal 4363 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, YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Misc/WatchGambasDirectory/.project:15 +msgid "WatchGambasDirectory" +msgstr "Наблюдать за директорией Gambas" + +#: app/examples/Misc/WatchGambasDirectory/.project:16 +msgid "" +"Watch the Gambas temporary directory, /tmp/gambas.UID, to detect starting and ending Gambas processes.\n" +"\n" +"This project shows basic usage of gb.inotify's Watch class without going very far in demonstrating its capabilities/available events." +msgstr "" +"Смотреть временный каталог Gambas, /tmp/gambas.UID, чтобы определить начало и конец процессов Gambas.\n" +"\n" +"Этот проект демонстрирует базовое использование класса Watch из gb.inotify, но не слишком далеко демонстрирует его возможности/доступные события." + +#: app/examples/Misc/WatchGambasDirectory/.src/MMain.module:10 +msgid "I'm watching... You may now start Gambas projects." +msgstr "Я наблюдаю... Теперь вы можете запустить проекты Gambas." + +#: app/examples/Misc/WatchGambasDirectory/.src/MMain.module:11 +msgid "Return toggles Pause/Resume. Enter \"quit\" to quit." +msgstr "Клавиша Enter переключает Пауза/Возобновление. Введите «выйти» для выхода." + +#: app/examples/Misc/WatchGambasDirectory/.src/MMain.module:18 +msgid "quit" +msgstr "выйти" + +#: app/examples/Misc/WatchGambasDirectory/.src/MMain.module:20 +msgid "Currently" +msgstr "В данный момент" + +#: app/examples/Misc/WatchGambasDirectory/.src/MMain.module:20 +msgid "inactive" +msgstr "неактивен" + +#: app/examples/Misc/WatchGambasDirectory/.src/MMain.module:20 +msgid "active" +msgstr "активен" + +#: app/examples/Misc/WatchGambasDirectory/.src/MMain.module:25 +msgid "New Gambas process:" +msgstr "Новый процесс Gambas:" + +#: app/examples/Misc/WatchGambasDirectory/.src/MMain.module:34 app/examples/Misc/WatchGambasDirectory/.src/MMain.module:51 +msgid "(unknown)" +msgstr "(неизвестный)" + +#: app/examples/Misc/WatchGambasDirectory/.src/MMain.module:52 +msgid "terminated (normally)" +msgstr "прервано (нормально)" + diff --git a/app/examples/Misc/WatchGambasDirectory/.project b/app/examples/Misc/WatchGambasDirectory/.project new file mode 100644 index 00000000..67b64484 --- /dev/null +++ b/app/examples/Misc/WatchGambasDirectory/.project @@ -0,0 +1,14 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.5.90 +Title=WatchGambasDirectory +Startup=MMain +Icon=watch.svg +Version=3.6.2 +VersionFile=1 +Component=gb.inotify +Description="Watch the Gambas temporary directory, /tmp/gambas.UID, to detect starting and ending Gambas processes.\n\nThis project shows basic usage of gb.inotify's Watch class without going very far in demonstrating its capabilities/available events." +Authors="(C) 2014 Tobias Boege , GPLv2+." +TabSize=2 +SourcePath=/tmp +Packager=1 +Translate=1 diff --git a/app/examples/Misc/WatchGambasDirectory/.src/MMain.module b/app/examples/Misc/WatchGambasDirectory/.src/MMain.module new file mode 100644 index 00000000..074904a8 --- /dev/null +++ b/app/examples/Misc/WatchGambasDirectory/.src/MMain.module @@ -0,0 +1,54 @@ +' Gambas module file + +Private $hWatch As Watch + +Public Sub Main() + ' The watched events are determined automatically by the event handlers defined + $hWatch = New Watch("/tmp/gambas." & Str$(User.Id), True) As "GambasDirectory" + $hWatch.Tag = New Collection ' Save descendants here + + Print ("I'm watching... You may now start Gambas projects.") + Print ("Return toggles Pause/Resume. Enter \"quit\" to quit.") +End + +Public Sub Application_Read() + Dim sBuf As String + + Line Input sBuf + If sBuf = ("quit") Then Quit + $hWatch.IsPaused = Not $hWatch.IsPaused + Print ("Currently");; IIf($hWatch.IsPaused, ("inactive"), ("active")) +End + +Public Sub GambasDirectory_Create() + If Not Watch.IsDir Then Return ' Skip files + Print ("New Gambas process:");; + ' Watch.Name is the PID of the new Gambas process. Try to get its name + ' from the /proc filesystem. + With Split(File.Load("/proc" &/ Watch.Name &/ "cmdline"), "/") + Last.Tag[Watch.Name] = Left$(.[.Max], -1) + Print Last.Tag[Watch.Name] + End With + + Catch + Print ("(unknown)") + ' Opening the /proc file may fail because the directory may have been + ' deleted already (if the process was relatively short-lived and this + ' event took longer than that to get from the kernel to us). +End + +Public Sub GambasDirectory_Delete() + Dim sName As String + + If Not Watch.IsDir Then Return + sName = Last.Tag[Watch.Name] + ' Sadly, we can only provide a name for dying processes that we watched + ' being created -- the /proc file is already gone at this point. + ' + ' Note that if the interpreter crashes (the process ends abnormally), + ' directories won't be removed so we won't notice that the process is + ' gone. + If Not sName Then sName = ("(unknown)") + Print sName;; ("terminated (normally)") + Last.Tag.Remove(Watch.Name) +End diff --git a/app/examples/Misc/WatchGambasDirectory/watch.svg b/app/examples/Misc/WatchGambasDirectory/watch.svg new file mode 100644 index 00000000..758d0b7a --- /dev/null +++ b/app/examples/Misc/WatchGambasDirectory/watch.svg @@ -0,0 +1,1257 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/examples/Multimedia/CDPlayer/.directory b/app/examples/Multimedia/CDPlayer/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/app/examples/Multimedia/CDPlayer/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/app/examples/Multimedia/CDPlayer/.icon.png b/app/examples/Multimedia/CDPlayer/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..66db8113c4362dc5ddc299203d0108488652af6a GIT binary patch literal 4311 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 FV1i$pHsk;R literal 0 HcmV?d00001 diff --git a/app/examples/Multimedia/CDPlayer/.lang/ca.po b/app/examples/Multimedia/CDPlayer/.lang/ca.po new file mode 100644 index 00000000..201e1f47 --- /dev/null +++ b/app/examples/Multimedia/CDPlayer/.lang/ca.po @@ -0,0 +1,60 @@ +# Catalan translation of CDPlayer +# Copyright (C) 2000-2010 Benoît Minisini. +# This file is distributed under the same license as the CDPlayer package. +# Jordi Sayol , 2007-2010. +# +# +msgid "" +msgstr "" +"Project-Id-Version: CDPlayer\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2011-04-07 05:18+0100\n" +"Last-Translator: Jordi Sayol \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: .project:2 +msgid "A Tiny CDplayer" +msgstr "Un petit reproductor de CD" + +#: .project:1 Fcdplayer.form:16 +msgid "CDplayer" +msgstr "Reproductor de CD" + +#: Fcdplayer.form:33 +msgid "&Eject" +msgstr "&Expulsa" + +#: Fcdplayer.class:22 +msgid "I Could not load cd-rom drive" +msgstr "No es pot carregar el cd-rom" + +#: Fcdplayer.form:28 +msgid "&Play" +msgstr "&Reprodueix" + +#: Fcdplayer.form:48 +msgid "Play &Track" +msgstr "Reprodueix la &pista" + +#: Fcdplayer.form:43 +msgid "&Stop" +msgstr "&Atura" + +#: Fcdplayer.form:22 +msgid "Track" +msgstr "Pista" + +#: Fcdplayer.form:57 +msgid "Volume" +msgstr "Volum" + +#: Fcdplayer.class:26 +msgid "Your PC does not have cd-rom drive" +msgstr "El vostre PC no té unitat de cd-rom." + diff --git a/app/examples/Multimedia/CDPlayer/.lang/cs.po b/app/examples/Multimedia/CDPlayer/.lang/cs.po new file mode 100644 index 00000000..b94759f5 --- /dev/null +++ b/app/examples/Multimedia/CDPlayer/.lang/cs.po @@ -0,0 +1,52 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 Fcdplayer.form:16 +msgid "CDplayer" +msgstr "-" + +#: .project:2 +msgid "A Tiny CDplayer" +msgstr "Lehký CDpřehlávač" + +#: Fcdplayer.class:22 +msgid "I Could not load cd-rom drive" +msgstr "Nemohu načíst CD-ROM" + +#: Fcdplayer.class:26 +msgid "Your PC does not have cd-rom drive" +msgstr "Váš počítač nemá cd-rom mechaniku" + +#: Fcdplayer.form:22 +msgid "Track" +msgstr "Stopa" + +#: Fcdplayer.form:28 +msgid "&Play" +msgstr "-" + +#: Fcdplayer.form:33 +msgid "&Eject" +msgstr "&Vysunout" + +#: Fcdplayer.form:43 +msgid "&Stop" +msgstr "-" + +#: Fcdplayer.form:48 +msgid "Play &Track" +msgstr "&Přehrát stopu" + +#: Fcdplayer.form:57 +msgid "Volume" +msgstr "Hlasitost" diff --git a/app/examples/Multimedia/CDPlayer/.lang/es.po b/app/examples/Multimedia/CDPlayer/.lang/es.po new file mode 100644 index 00000000..bfb15eaa --- /dev/null +++ b/app/examples/Multimedia/CDPlayer/.lang/es.po @@ -0,0 +1,44 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:2 +msgid "A Tiny CDplayer" +msgstr "Un pequeño CDPlayer" + +#: Fcdplayer.class:151 .project:1 +msgid "CDplayer" +msgstr "CDplayer" + +#: Fcdplayer.class:169 +msgid "&Eject" +msgstr "&Expulsar" + +#: Fcdplayer.class:164 +msgid "&Play" +msgstr "&Tocar" + +#: Fcdplayer.class:186 +msgid "Play &Track" +msgstr "Tocar &Canción" + +#: Fcdplayer.class:181 +msgid "&Stop" +msgstr "&Parar" + +#: Fcdplayer.class:157 +msgid "Track" +msgstr "Canción" + +#: Fcdplayer.class:196 +msgid "Volume" +msgstr "Volumen" + diff --git a/app/examples/Multimedia/CDPlayer/.lang/ru.po b/app/examples/Multimedia/CDPlayer/.lang/ru.po new file mode 100644 index 00000000..639e0b82 --- /dev/null +++ b/app/examples/Multimedia/CDPlayer/.lang/ru.po @@ -0,0 +1,90 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Multimedia/CDPlayer/.project:20 app/examples/Multimedia/CDPlayer/.src/Fcdplayer.form:5 +msgid "CDplayer" +msgstr "CD-плеер" + +#: app/examples/Multimedia/CDPlayer/.project:21 +msgid "A Tiny CDplayer" +msgstr "Крошечный CD-плеер" + +#: app/examples/Multimedia/CDPlayer/.src/Fcdplayer.class:22 +msgid "I Could not load cd-rom drive" +msgstr "Не удалось загрузить CD-ROM привод" + +#: app/examples/Multimedia/CDPlayer/.src/Fcdplayer.class:26 +msgid "Your PC does not have cd-rom drive" +msgstr "Ваш компьютер не имеет привода CD-ROM" + +#: app/examples/Multimedia/CDPlayer/.src/Fcdplayer.class:35 app/examples/Multimedia/CDPlayer/.src/Fcdplayer.class:109 app/examples/Multimedia/CDPlayer/.src/Fcdplayer.class:136 app/examples/Multimedia/CDPlayer/.src/Fcdplayer.form:15 +msgid "&Play" +msgstr "Игра" + +#: app/examples/Multimedia/CDPlayer/.src/Fcdplayer.class:58 +msgid "No CD in Drive" +msgstr "В приводе нет CD" + +#: app/examples/Multimedia/CDPlayer/.src/Fcdplayer.class:64 +msgid "Tracks" +msgstr "Треки" + +#: app/examples/Multimedia/CDPlayer/.src/Fcdplayer.class:65 +msgid "Total Length :" +msgstr "Общая длина:" + +#: app/examples/Multimedia/CDPlayer/.src/Fcdplayer.class:72 +msgid "Playing Track" +msgstr "Играющий трек" + +#: app/examples/Multimedia/CDPlayer/.src/Fcdplayer.class:81 app/examples/Multimedia/CDPlayer/.src/Fcdplayer.form:10 +msgid "Track" +msgstr "Трек" + +#: app/examples/Multimedia/CDPlayer/.src/Fcdplayer.class:115 app/examples/Multimedia/CDPlayer/.src/Fcdplayer.class:127 +msgid "&Pause" +msgstr "Пауза" + +#: app/examples/Multimedia/CDPlayer/.src/Fcdplayer.class:121 +msgid "&Resume" +msgstr "Возобновить" + +#: app/examples/Multimedia/CDPlayer/.src/Fcdplayer.form:19 +msgid "&Eject" +msgstr "Извлечь" + +#: app/examples/Multimedia/CDPlayer/.src/Fcdplayer.form:27 +msgid "&Stop" +msgstr "Стоп" + +#: app/examples/Multimedia/CDPlayer/.src/Fcdplayer.form:31 +msgid "Play &Track" +msgstr "Воспроизвести трек" + +#: app/examples/Multimedia/CDPlayer/.src/Fcdplayer.form:39 +msgid "Volume" +msgstr "Громкость" + diff --git a/app/examples/Multimedia/CDPlayer/.project b/app/examples/Multimedia/CDPlayer/.project new file mode 100644 index 00000000..09f960c3 --- /dev/null +++ b/app/examples/Multimedia/CDPlayer/.project @@ -0,0 +1,19 @@ +# Gambas Project File 3.0 +Title=CDplayer +Startup=Fcdplayer +Icon=cdrom.png +Version=3.13.90 +VersionFile=1 +Component=gb.image +Component=gb.qt5 +Component=gb.qt5.ext +Component=gb.sdl.sound +Description="A Tiny CDplayer" +TabSize=2 +Translate=1 +Language=fr +Maintainer=benoit +Vendor=Princeton +Address=benoit@localhost +License=General Public Licence +Packager=1 diff --git a/app/examples/Multimedia/CDPlayer/.src/Fcdplayer.class b/app/examples/Multimedia/CDPlayer/.src/Fcdplayer.class new file mode 100644 index 00000000..33d6508d --- /dev/null +++ b/app/examples/Multimedia/CDPlayer/.src/Fcdplayer.class @@ -0,0 +1,139 @@ +' Gambas class file + +' Simple CDplayer +' Carlier Laurent - (c) 2005 +' Under GNU GPL V2 or Later +' +' Done for Testing the sdl component +' CDROM part + +Static mycd As CDRom +Static HaveCD As Boolean + +Public Sub Form_open() + If CDRoms.Count > 0 Then + Try mycd = New CDRom + If Not IsNull(mycd) Then + Volume.Value = Abs(mycd.Volume - Volume.MaxValue) + TrackPos.Value = 0 + Me.Center + Timer1.Enabled = True + Else + Message.Warning(("I Could not load cd-rom drive")) + Me.Close + Endif + Else + Message.Warning(("Your PC does not have cd-rom drive")) + Me.Close + Endif + +End + +Public Sub SButton_Click() + + mycd.Stop() + PButton.Text = ("&Play") + TrackPos.Value = 0 + +End + +Public Sub PTButton_Click() + + If Not HaveCD Then + Return + Endif + + mycd.Tracks[TrackInfo.Index + 1].Play() + +End + +Public Sub Timer1_Timer() + + Dim trckloop As Integer + Dim string1 As String + Dim string2 As String + + If Not mycd.Ready Then + TrackInfo.Clear() + TextBox1.Text = ("No CD in Drive") + HaveCD = False + Return + Endif + + If mycd.Stopped Then + string1 = mycd.Tracks.Count & " " & ("Tracks") + string2 = ("Total Length :") & " " & ToTime(mycd.Length) + TextBox1.Text = string1 & Space$(41 - (Len(string1) + Len(string2))) & string2 + TrackPos.Value = 0 + Endif + + If mycd.Playing Or mycd.Paused Then + TrackPos.Value = (mycd.Tracks[mycd.Tracks.Current].Position) / mycd.Tracks[mycd.Tracks.Current].length + TextBox1.Text = ("Playing Track") & " " & mycd.Tracks.Current + Endif + + If HaveCD Then + Return + Endif + + TrackInfo.Clear() + For trckloop = 1 To mycd.Tracks.Count + string1 = ("Track") & " " & trckloop + string2 = "<" & ToTime(mycd.Tracks[trckloop].Length) & ">" + TrackInfo.Add(string1 & Space$(49 - (Len(string1) + Len(string2))) & string2) + Next + + Volume.Value = Abs(mycd.Volume - 255) + HaveCD = True + +End + +Public Function ToTime(length As Integer) As String + + Dim myString As String + + mystring = Format$(length \ 60, "00") & ":" & Format$((length Mod 60), "00") + Return myString + +End + +Public Sub Volume_Change() + + mycd.Volume = Abs(Volume.Value - Volume.MaxValue) + +End + +Public Sub PButton_Click() + + If Not HaveCD Then + PButton.Text = ("&Play") + Return + Endif + + If mycd.Stopped Then + mycd.Play() + PButton.Text = ("&Pause") + Return + Endif + + If mycd.Playing Then + mycd.Pause() + PButton.Text = ("&Resume") + Return + Endif + + If mycd.Paused Then + mycd.Resume() + PButton.Text = ("&Pause") + Endif + +End + +Public Sub EButton_Click() + + Try mycd.Eject + HaveCD = False + PButton.Text = ("&Play") + TrackPos.Value = 0 + +End diff --git a/app/examples/Multimedia/CDPlayer/.src/Fcdplayer.form b/app/examples/Multimedia/CDPlayer/.src/Fcdplayer.form new file mode 100644 index 00000000..e52dc819 --- /dev/null +++ b/app/examples/Multimedia/CDPlayer/.src/Fcdplayer.form @@ -0,0 +1,47 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(69.7143,114.7143,50,26) + Text = ("CDplayer") + Icon = Picture["cd.png"] + Resizable = False + { TrackInfo ComboBox + MoveScaled(1,1,48,4) + ToolTip = ("Track") + ReadOnly = True + } + { PButton Button + MoveScaled(1,11,21,4) + Text = ("&Play") + } + { EButton Button + MoveScaled(1,16,21,4) + Text = ("&Eject") + } + { TextBox1 TextBox + MoveScaled(1,6,43,4) + ReadOnly = True + } + { SButton Button + MoveScaled(23,11,21,4) + Text = ("&Stop") + } + { PTButton Button + MoveScaled(23,16,21,4) + Text = ("Play &Track") + } + { Timer1 #Timer + #MoveScaled(36,1) + } + { Volume Slider + MoveScaled(46,6,3,17) + Mouse = Mouse.SizeS + ToolTip = ("Volume") + MaxValue = 255 + PageStep = 30 + Mark = True + } + { TrackPos ProgressBar + MoveScaled(1,21,43,4) + } +} diff --git a/app/examples/Multimedia/CDPlayer/cdrom.png b/app/examples/Multimedia/CDPlayer/cdrom.png new file mode 100644 index 0000000000000000000000000000000000000000..fa1dbc8b79bbe3c7bfd5cba80cca665c66f7266f GIT binary patch literal 3987 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 literal 0 HcmV?d00001 diff --git a/app/examples/Multimedia/MediaPlayer/.directory b/app/examples/Multimedia/MediaPlayer/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/app/examples/Multimedia/MediaPlayer/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/app/examples/Multimedia/MediaPlayer/.hidden/screenshots/MediaPlayer.jpg b/app/examples/Multimedia/MediaPlayer/.hidden/screenshots/MediaPlayer.jpg new file mode 100644 index 0000000000000000000000000000000000000000..65929eb055a6e80d4aa6e5a7a5cdf909b56cfc1a GIT binary patch literal 144138 zcmeEu2T)Vp_U}odcL*9VKqvwUMM^-bgc1lHLN6*Ef+9_%h|&=Q(m{xbp@d#U0l^AN zM>;5?C<210sE7p-;T`n*?)~ol&zt{!ciww5@6E+I!*I?%d#|=xL#NluvQtH}jN?P*DIHlc5AS^5_>}>2v4i2P}C`wf6fB9#p1K?qX z?_r9CLBs$k4+O>o+35mA006=OQoBp=A3qQ%49>vF#LU9V1`cT92A~ia3<`%aFu>v9 z=riDR0M5g}E2^l=$Y<@&Bo>TNipwft7T0U)AuK>>V7PoISm~eSH1M{-GzsPK8HAMkORBC7(+z}`T{kHLabC)j&0Q=3>-#GgxzIZ^spl~=0&a}%H1R4%rFdjIAs3Ie;t~HZ;FrS!G z95X^MtE8!uMO>Nmk>4X^jCGF$?&bcqUDkea_OCG(|8H^jH^%PKovR&9%V~IIHlgghrsgyZ@M<-U4%i0Eyx%hsJJ>yA`rYb5N%M5dAJ^4+NAJH~hh zg!TU)7ytbuM|J>@jmOqgvjxr s7Cpu(={4bpR)!Rc!_wK(@%P5jZ8qy9XRJqk&g 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

    F;%X(yiUoBjvLC;R35KMLJn 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 literal 0 HcmV?d00001 diff --git a/app/examples/Multimedia/MediaPlayer/.lang/fr.po b/app/examples/Multimedia/MediaPlayer/.lang/fr.po new file mode 100644 index 00000000..d930dc66 --- /dev/null +++ b/app/examples/Multimedia/MediaPlayer/.lang/fr.po @@ -0,0 +1,64 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Media player based on GStreamer" +msgstr "" + +#: .project:2 +msgid "This example is a demonstration of how to use GStreamer with Gambas to play any sound or video file." +msgstr "" + +#: FControl.form:39 +msgid "MediaPlayer, a media player example based on GStreamer made by Benoît Minisini" +msgstr "MediaPlayer, un exemple de lecteur multimedia basé sur GStreamer programmé par Benoît Minisini" + +#: FMain.class:176 +msgid "Select a media file" +msgstr "Choisissez un fichier son ou vidéo" + +#: FMain.class:197 FTags.form:109 +msgid "Video device" +msgstr "Périphérique video" + +#: FMain.class:223 +msgid "Select a subtitle file" +msgstr "Choisissez un fichier de sous-titres" + +#: FTags.class:12 +msgid "Hue" +msgstr "Teinte" + +#: FTags.class:14 +msgid "Saturation" +msgstr "Saturation" + +#: FTags.class:16 +msgid "Contrast" +msgstr "Contraste" + +#: FTags.class:18 +msgid "Brightness" +msgstr "Luminosité" + +#: FTags.class:109 +msgid "No video device" +msgstr "Aucun périphérique video" + +#: FTags.form:45 +msgid "Information" +msgstr "Information" + +#: FTags.form:78 +msgid "Balance" +msgstr "Balance" diff --git a/app/examples/Multimedia/MediaPlayer/.lang/ru.po b/app/examples/Multimedia/MediaPlayer/.lang/ru.po new file mode 100644 index 00000000..347b2881 --- /dev/null +++ b/app/examples/Multimedia/MediaPlayer/.lang/ru.po @@ -0,0 +1,92 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Multimedia/MediaPlayer/.project:56 +msgid "Media player based on GStreamer" +msgstr "Медиапроигрыватель на основе GStreamer" + +#: app/examples/Multimedia/MediaPlayer/.project:57 +msgid "" +"Media player example.\n" +"\n" +"This example is a demonstration of how to use GStreamer with Gambas to play any sound or video file." +msgstr "" +"Пример медиаплеера.\n" +"\n" +"Этот пример демонстрирует, как использовать GStreamer с Gambas для воспроизведения любого звукового или видеофайла." + +#: app/examples/Multimedia/MediaPlayer/.src/FControl.form:26 +msgid "MediaPlayer, a media player example based on GStreamer made by Benoît Minisini" +msgstr "Медиапроигрыватель от Бенуа Минисини, пример медиаплеера на основе GStreamer" + +#: app/examples/Multimedia/MediaPlayer/.src/FMain.class:206 +msgid "Select a media file" +msgstr "Выбрать медиа файл" + +#: app/examples/Multimedia/MediaPlayer/.src/FMain.class:227 app/examples/Multimedia/MediaPlayer/.src/FTags.form:80 +msgid "Video device" +msgstr "Видеоустройство" + +#: app/examples/Multimedia/MediaPlayer/.src/FMain.class:253 +msgid "Select a subtitle file" +msgstr "Выбрать файл субтитров" + +#: app/examples/Multimedia/MediaPlayer/.src/FTags.class:12 +msgid "Hue" +msgstr "Тон" + +#: app/examples/Multimedia/MediaPlayer/.src/FTags.class:14 +msgid "Saturation" +msgstr "Насыщенность" + +#: app/examples/Multimedia/MediaPlayer/.src/FTags.class:16 +msgid "Contrast" +msgstr "Контраст" + +#: app/examples/Multimedia/MediaPlayer/.src/FTags.class:18 +msgid "Brightness" +msgstr "Яркость" + +#: app/examples/Multimedia/MediaPlayer/.src/FTags.class:109 +msgid "No video device" +msgstr "Нет видеоустройства" + +#: app/examples/Multimedia/MediaPlayer/.src/FTags.form:26 +msgid "Information" +msgstr "Информация" + +#: app/examples/Multimedia/MediaPlayer/.src/FTags.form:54 +msgid "Balance" +msgstr "Баланс" + +#: app/examples/Multimedia/MediaPlayer/.src/MTest.module:30 +msgid "I will take a screenshot in 5 seconds..." +msgstr "Я сделаю скриншот через 5 секунд..." + +#: app/examples/Multimedia/MediaPlayer/.src/MTest.module:40 +msgid "Screenshot saved to '~/screenshot.png'!" +msgstr "Скриншот сохранён в ~/screenshot.png!" + diff --git a/app/examples/Multimedia/MediaPlayer/.project b/app/examples/Multimedia/MediaPlayer/.project new file mode 100644 index 00000000..1d2c495a --- /dev/null +++ b/app/examples/Multimedia/MediaPlayer/.project @@ -0,0 +1,55 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.8.90 +Title=Media player based on GStreamer +Startup=FMain +Icon=icon.png +Version=1.0.0 +Component=gb.image +Component=gb.gui +Component=gb.form +Component=gb.desktop.x11 +Component=gb.desktop +Component=gb.form.dialog +Component=gb.settings +Component=gb.media +Description="Media player example.\n\nThis example is a demonstration of how to use GStreamer with Gambas to play any sound or video file." +Environment="GB_GUI=gb.qt5" +TabSize=2 +Translate=1 +Language=en +Maintainer=benoit +Vendor=Example +Address=benoit@black-tower +Url=www.endoftheinternet.com +License=General Public License +PackageName=mediaplayer-3.5.0 +PackageVersion=2 +CreateEachDirectory=1 +Packager=1 +Systems=slackware +Menus=archlinux:"Applications/Video" +Categories=archlinux:"Video" +Groups=archlinux:"video" +Menus=debian:"Applications/Video" +Categories=debian:"Video" +Groups=debian:"video" +Menus=fedora:"Audio Video/Video/Player" +Categories=fedora:"AudioVideo;Player;Video" +Groups=fedora:"Applications/Multimedia" +Menus=mageia:"Multimedia/Video" +Categories=mageia:"AudioVideo;Video" +Groups=mageia:"Video" +Menus=mandriva:"Multimedia/Video" +Categories=mandriva:"AudioVideo;Video" +Groups=mandriva:"Video" +Menus=slackware:"Audio Video/Video/Player" +Categories=slackware:"AudioVideo;Player;Video" +Groups=slackware:"Applications/Multimedia" +Menus=suse:"Audio Video/Video/Player" +Categories=suse:"AudioVideo;Player;Video" +Groups=suse:"Productivity/Multimedia/Video/Players" +Menus=ubuntu:"Applications/Video" +Categories=ubuntu:"Video" +Groups=ubuntu:"video" +Tags=Audio,AudioVideo,Video,Multimedia +CreateMenu=1 diff --git a/app/examples/Multimedia/MediaPlayer/.src/CAnimation.class b/app/examples/Multimedia/MediaPlayer/.src/CAnimation.class new file mode 100644 index 00000000..a756ab55 --- /dev/null +++ b/app/examples/Multimedia/MediaPlayer/.src/CAnimation.class @@ -0,0 +1,101 @@ +' Gambas class file + +Static Private All As New CAnimation[] + +Event Stop + +Property Read Object As Object + +Private $hObject As Object +Private $sProperty As String +Private $fTarget As Float +Private $fTime As Float +Private $hTimer As Timer + +Static Public Sub Start(hObject As Control, sProperty As String, fTarget As Float, iTime As Integer, Optional hParent As Object) + + Dim hAnim As CAnimation + Dim aStop As New CAnimation[] + + For Each hAnim In All + If hAnim.Object = hObject Then aStop.Add(hAnim) + Next + + For Each hAnim In aStop + hAnim.Stop + Next + + hAnim = New CAnimation(hObject, sProperty, fTarget, iTime) + All.Add(hAnim) + + If hParent Then Object.Attach(hAnim, hParent, "Animation") + +End + +Static Public Sub Exit() + + While All.Count + All[0].Stop + Wend + +End + + + +Public Sub _new(hObject As Control, sProperty As String, fTarget As Float, iTime As Integer) + + 'Debug hObject.Tag;; sProperty;; fTarget + + $hObject = hObject + $sProperty = sProperty + $fTarget = fTarget + $fTime = Timer + iTime / 1000 + + $hTimer = New Timer As "Timer" + $hTimer.Delay = 50 + $hTimer.Start + +End + +Public Sub Timer_Timer() + + Dim fValue As Float + Dim iSign As Integer + Dim fDiff As Float + + fValue = Object.GetProperty($hObject, $sProperty) + + iSign = Sgn($fTarget - fValue) + fDiff = $fTime - Timer + fValue += ($fTarget - fValue) / (1000 * fDiff / $hTimer.Delay) + + If fDiff <= 0 Or If iSign = 0 Or If iSign > 0 And fValue >= $fTarget Or If iSign < 0 And fValue <= $fTarget Then + Object.SetProperty($hObject, $sProperty, $fTarget) + {Stop} + Else + Object.SetProperty($hObject, $sProperty, fValue) + Endif + +Catch + + {Stop} + +End + +Public Sub Stop() + + $hTimer.Stop + $hTimer = Null + $hObject = Null + + All.Remove(All.Find(Me)) + + Raise Stop + +End + +Private Function Object_Read() As Object + + Return $hObject + +End diff --git a/app/examples/Multimedia/MediaPlayer/.src/CButton.class b/app/examples/Multimedia/MediaPlayer/.src/CButton.class new file mode 100644 index 00000000..37c68705 --- /dev/null +++ b/app/examples/Multimedia/MediaPlayer/.src/CButton.class @@ -0,0 +1,215 @@ +' Gambas class file + +Export + +Inherits DrawingArea + +Event Click + +Property Image As Image +Property Opacity As Float +Property Highlight As Boolean +Property Shortcut As String +Property Text As String +Property Font As Font + +Public Const MIN_OPACITY As Float = 0.2 +Public Const MAX_OPACITY As Float = 0.8 + +Private $hObs As Observer +Private $hImage As Image +Private $hDraw As Image +'Private $bInside As Boolean +'Private $hTimer As Timer +Private $fOpacity As Float = MIN_OPACITY +Private $bHighlight As Boolean +'Private $hTimer As Timer +Private $sShortcut As String +Private $sText As String +Private $hFont As Font + +Public Sub _new() + + $hObs = New Observer(Me) As "DrawingArea" + '$hTimer = New Timer As "Timer" + '$hTimer.Delay = 50 + Me.Mouse = Mouse.Pointing + '$hTimer = New Timer As "Timer" + +End + +Public Sub DrawingArea_Enter() + + If Not Me.Enabled Then Return + CAnimation.Start(Me, "Opacity", MAX_OPACITY, 250) + +End + +Public Sub DrawingArea_Leave() + + If Not Me.Enabled Then Return + CAnimation.Start(Me, "Opacity", MIN_OPACITY, 250) + +End + +Public Sub DrawingArea_MouseUp() + + If Not Me.Enabled Then Return + Raise Click + Stop Event + +End + +Public Sub DrawingArea_Draw() + + If $hDraw Then + Draw.Image($hDraw, 2, 2) + Endif + + If $bHighlight Then + Paint.Begin(Me) + Paint.Brush = Paint.Color(Color.SetAlpha(Color.White, 192)) + Paint.Rectangle(0, 0, Me.W, Me.H) + Paint.Fill + Paint.End + Endif + +End + +Private Function Image_Read() As Image + + Return $hImage + +End + +Private Sub Image_Write(Value As Image) + + $hImage = Value '.Stretch(Me.W - 4, Me.H - 4) + SetOpacity + +End + +Private Sub SetOpacity() + + Dim W, H As Integer + Dim hFont As Font + + If Not $hImage Then Return + + $hDraw = $hImage.Stretch(Me.W - 4, Me.H - 4) + Paint.Begin($hDraw) + + If $sShortcut Then + + Paint.Font = Font["Bold,+2"] + + Paint.Brush = Paint.Color(Color.SetAlpha(Color.White, 64)) + 'For X = -2 To 2 + ' For Y = -2 To 2 + ' Paint.DrawText($sShortcut, $hDraw.W - 16 + X, $hDraw.H - 16 + Y, 16, 16, Align.Center) + ' Next + 'Next + Paint.Arc($hDraw.W - 12, $hDraw.H - 12, 12) + Paint.Fill + + Paint.Brush = Paint.Color(Color.SetAlpha(Color.Black, 64)) + Paint.DrawText($sShortcut, $hDraw.W - 24, $hDraw.H - 24, 24, 24, Align.Center) + + Endif + + If $sText Then + Paint.Brush = Paint.Color(Color.SetAlpha(Color.White, 64)) + If $hFont Then + hFont = $hFont + Else + hFont = Font["Bold,+1"] + Endif + Paint.Font = hFont + W = hFont.TextWidth($sText) + 4 + H = hFont.TextHeight($sText) + 2 + Paint.Rectangle(($hDraw.W - W) / 2, $hDraw.H - H, W, H) + Paint.Fill + Paint.Brush = Paint.Color(Color.SetAlpha(Color.Black, 64)) + Paint.DrawText($sText, ($hDraw.W - W) / 2, $hDraw.H - H, W, H, Align.Center) + Endif + + Paint.End + + $hDraw.Opacity($fOpacity) + Me.Refresh + +End + +Private Function Opacity_Read() As Float + + Return $fOpacity + +End + +Private Sub Opacity_Write(Value As Float) + + $fOpacity = Max(0, Min(1, Value)) + SetOpacity + +End + +Private Function Highlight_Read() As Boolean + + Return $bHighlight + +End + +Private Sub Highlight_Write(Value As Boolean) + + $bHighlight = Value + Me.Refresh + +End + + +Private Function Shortcut_Read() As String + + Return $sShortcut + +End + +Private Sub Shortcut_Write(Value As String) + + $sShortcut = Value + SetOpacity + Me.Refresh + +End + +Private Function Text_Read() As String + + Return $sText + +End + +Private Sub Text_Write(Value As String) + + $sText = Value + SetOpacity + Me.Refresh + +End + +Private Function Font_Read() As Font + + Return $hFont + +End + +Private Sub Font_Write(Value As Font) + + $hFont = Value.Copy() + +End + +Public Sub DrawingArea_Arrange() + + SetOpacity + +End + diff --git a/app/examples/Multimedia/MediaPlayer/.src/FControl.class b/app/examples/Multimedia/MediaPlayer/.src/FControl.class new file mode 100644 index 00000000..2e0f4c0f --- /dev/null +++ b/app/examples/Multimedia/MediaPlayer/.src/FControl.class @@ -0,0 +1,133 @@ +' Gambas class file + +Private sldTime As DrawingArea +Private lblTime As DrawingArea + +Private $sInfo As String +Private $iMinOpacity As Integer = 70 +Private $sTitle As String + +Public Sub SetMinOpacity(iOpacity As Integer) + + $iMinOpacity = iOpacity + If Me.Opacity < $iMinOpacity Then + CAnimation.Start(Me, "Opacity", $iMinOpacity, 250) + Endif + +End + + +Public Sub _new() + + panToolbar.H = 48 + Desktop.Scale * 2 + + FMain.CreateButtons(["eject", "video", "config", "play", "pause", "stop", "screenshot", "fullscreen", "subtitle", "visualisation", "-"], panToolbar) + + sldTime = New DrawingArea(panToolbar) As "sldTime" + sldTime.Resize(8, 8) + sldTime.Expand = True + sldTime.Tracking = True + sldTime.Mouse = Mouse.Pointing + + lblTime = New DrawingArea(panToolbar) As "lblTime" + lblTime.Resize(8, 8) + lblTime.Font = Font["Bold,+5"] + lblTime.W = lblTime.Font.TextWidth("99:99:99 / 99:99:99") + 16 + + FMain.CreateButtons(["-", "volume", "quit"], panToolbar) + + Me.H = 48 + Desktop.Scale * 6 + lblTitle.Font.Height + Me.Arrangement = Arrange.Vertical + panToolbar.Arrangement = Arrange.Horizontal + + FMain.GetButton("visualisation").Font = Font["-2"] + +End + +Public Sub lblTime_Draw() + + Paint.Brush = Paint.Color(Color.SetAlpha(Color.White, 128)) + Paint.Font = lblTime.Font + Paint.DrawText($sInfo, 0, 0, Paint.W, Paint.H, Align.Center) + +End + +Public Sub sldTime_Draw() + + Dim fLength As Float = FMain.GetLength() + If fLength = 0 Then Return + + Paint.Brush = Paint.Color(Color.SetAlpha(Color.White, 192)) + Paint.Rectangle(0, (Paint.H - 16) / 2, Paint.W, 16) + Paint.Fill + Paint.Brush = Paint.Color(Color.SetAlpha(Color.White, 128)) + Paint.Rectangle(0, (Paint.H - 16) / 2, Paint.W * FMain.GetPos() / fLength, 16) + Paint.Fill + +End + +Public Sub sldTime_MouseDown() + + If Mouse.Left Then FMain.SetPos(Mouse.X / sldTime.W) + +End + +Public Sub sldTime_MouseMove() + + If Mouse.Left Then FMain.SetPos(Mouse.X / sldTime.W) + +End + +Public Sub SetInfo(sInfo As String) + + $sInfo = sInfo + lblTime.Refresh + sldTime.Refresh + +End + +Public Sub Form_KeyPress() + + FMain.Form_KeyPress + +End + +Public Sub SetTitle(sTitle As String) + + $sTitle = sTitle + lblTitle.Text = sTitle + lblTitle.Foreground = &HBFBFBF& + +End + +Public Sub SetError(sError As String) + + If lblTitle.Foreground = Color.Red Then + sError = Trim(lblTitle.Text & " " & sError) + Endif + + lblTitle.Text = sError + lblTitle.Foreground = Color.Red + timError.Start + +End + +Public Sub timError_Timer() + + SetTitle($sTitle) + timError.Stop + +End + + +' Public Sub Form_Move() +' +' Debug Me.X;; Me.Y;; Me.W;; Me.H;; "->";; Me.Y + Me.H +' +' End +' +' Public Sub Form_Resize() +' +' Debug Me.X;; Me.Y;; Me.W;; Me.H;; "->";; Me.Y + Me.H +' +' End diff --git a/app/examples/Multimedia/MediaPlayer/.src/FControl.form b/app/examples/Multimedia/MediaPlayer/.src/FControl.form new file mode 100644 index 00000000..b32b80ee --- /dev/null +++ b/app/examples/Multimedia/MediaPlayer/.src/FControl.form @@ -0,0 +1,37 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,64,23) + Background = &H000000& + Resizable = False + Border = False + Utility = True + Opacity = 70 + Spacing = True + { Panel3 Panel + MoveScaled(25,0,12,1) + Background = &H3F3F3F& + } + { Panel1 HBox + MoveScaled(1,3,61,6) + AutoResize = True + { Panel2 Panel + MoveScaled(2,0,2,4) + } + { lblTitle Label + MoveScaled(13,1,43,2) + Font = Font["Bold,+5"] + Foreground = &HBFBFBF& + Expand = True + Text = ("MediaPlayer, a media player example based on GStreamer made by Benoît Minisini") + } + } + { panToolbar Panel + MoveScaled(1,10,57,9) + Margin = True + } + { timError #Timer + #MoveScaled(54,13) + Delay = 5000 + } +} diff --git a/app/examples/Multimedia/MediaPlayer/.src/FMain.class b/app/examples/Multimedia/MediaPlayer/.src/FMain.class new file mode 100644 index 00000000..581ca152 --- /dev/null +++ b/app/examples/Multimedia/MediaPlayer/.src/FMain.class @@ -0,0 +1,616 @@ +' Gambas class file + +'Property TagsX As Integer + +Private $hPlayer As MediaPlayer +Private $hImage As MediaControl +Private $hFilter As MediaFilter +Private $hOutput As MediaContainer +Private $aVisualisation As MediaControl[] + +Private $fPos As Float +Private $fLength As Float +Private $iVisualisation As Integer +Private $fVolume As Float +Private $bSuspend As Boolean +Private $bShowTags As Boolean +'Private $iTagsX As Integer + +Public Sub _new() + + Application.MainWindow = Me + '$iTagsX = - FTags.W + +End + +Private Sub AddVisualisation(sType As String, sTitle As String) + + Dim hVisualisation As MediaControl + + If sType Then + hVisualisation = New MediaControl($hPlayer, sType) + hVisualisation.Tag = sTitle + Endif + + $aVisualisation.Add(hVisualisation) + +Catch + + Error sType; ": "; Error.Text + +End + +Private Sub MakeMediaPlayer() + + $hPlayer = New MediaPlayer As "MediaPlayer" + + '$hOutput = New MediaContainer($hPlayer) + '$hOutput.Name = "MyOutput" + + $hFilter = New MediaFilter($hPlayer) + $hImage = New MediaControl($hPlayer, "ximagesink") + '$hFilter.LinkTo($hImage) + + '$hOutput.AddInput($hImage) + + $hPlayer.Video.Output = $hImage + + $aVisualisation = New MediaControl[] + AddVisualisation("", "") + AddVisualisation("goom", "Goom") + AddVisualisation("goom2k1", "Goom2") + AddVisualisation("libvisual_bumpscope", "Bump") + AddVisualisation("libvisual_corona", "Corona") + AddVisualisation("libvisual_infinite", "Infinite") + AddVisualisation("libvisual_jakdaw", "Jakdaw") + AddVisualisation("libvisual_jess", "Jess") + AddVisualisation("monoscope", "Mono") + AddVisualisation("libvisual_oinksie", "Oinksie") + AddVisualisation("libvisual_lv_analyzer", "Analyzer") + AddVisualisation("libvisual_lv_scope", "Scope") + AddVisualisation("spacescope", "Space") + AddVisualisation("spectrascope", "Spectra") + AddVisualisation("synaescope", "Synae") + AddVisualisation("wavescope", "Wave") + + $iVisualisation = 0 + UpdateVisualisation + +End + +Public Sub GetButton(sKey As String) As CButton + + Return FControl.Controls["#" & sKey] + +End + + +Public Sub CreateButtons(aButton As String[], hParent As Container) + + Dim sKey As String + Dim sImg As String + Dim hPanel As Panel + Dim hButton As CButton + Dim iPos As Integer + + For Each sKey In aButton + + If sKey = "<->" Then + hPanel = New Panel(hParent) + hPanel.Expand = True + hPanel.Resize(8, 48) + Else If sKey = "-" Then + hPanel = New Panel(hParent) + hPanel.Resize(8, 48) + Else + + sImg = sKey + iPos = InStr(sImg, "#") + If iPos Then sImg = Left(sImg, iPos - 1) + + hButton = New CButton(hParent) As "Button" + hButton.Resize(48, 48) + hButton.Image = Image.Load(sImg & ".png") + hButton.Tag = sKey + hButton.Name = "#" & sKey + 'If cTooltip Then hButton.Tooltip = cTooltip[sImg] + 'If $cShortcut Then hButton.Shortcut = $cShortcut[sImg] + '$cButton[hButton.Tag] = hButton + Endif + Next + +End + + +Public Sub Form_Open() + + MakeMediaPlayer + + FControl.Show + FControl.Raise + + RefreshVolume + +End + +Public Sub Form_KeyPress() + + If Key.Code = Key.Escape Then Action("quit") + +End + +Private Sub GetDevice(sName As String) As String + + Try Return Scan(sName, "* (*)")[1] + +End + +' Private Sub FindChildFromType(hCont As MediaContainer, sType As String) As MediaControl +' +' Dim hCtrl As MediaControl +' +' For I = 0 To hCont.Children.Count - 1 +' hCtrl = hCont.Children[I] +' If hCtrl.Type = sType Then Return hCtrl +' Next +' +' End + +Private Sub Dump(hCont As MediaContainer, Optional iIndent As Integer) + + Dim I As Integer + Dim hCtrl As MediaControl + Dim sOutput As String + + If iIndent = 0 Then + Print "Source: "; $hPlayer.Input.Name + Print "[-------------------------------------------" + Endif + For I = 0 To hCont.Children.Count - 1 + hCtrl = hCont.Children[I] + Print Space$(iIndent * 2); hCtrl;; hCtrl.Name;; "["; hCtrl.Type; "]";; "=>";; hCtrl.Parent.Name + + For Each sOutput In hCtrl.Inputs + With hCtrl.GetLink(sOutput) + If Not .Peer Then Continue + Print Space$(iIndent * 2); "| "; sOutput; " <--- "; .Peer.Name; "."; .Output + End With + Next + + For Each sOutput In hCtrl.Outputs + With hCtrl.GetLink(sOutput) + If Not .Peer Then Continue + Print Space$(iIndent * 2); "| "; sOutput; " ---> "; .Peer.Name; "."; .Input + End With + Next + + If hCtrl Is MediaContainer Then + Dump(hCtrl, iIndent + 1) + Endif + Next + If iIndent = 0 Then Print "-------------------------------------------]" + +End + +Private Sub Action(sAction As String) + + Dim fPos As Float + Dim iState As Integer + Dim sName As String + Dim iName As Integer + Dim sVideo As String + + Select sAction + + Case "eject" + Dialog.Title = ("Select a media file") + If Not Dialog.OpenFile() Then + FControl.SetTitle(File.Name(Dialog.Path)) + Action("stop") + $hPlayer.URL = Media.URL(Dialog.Path) + $hPlayer.Subtitles.Enabled = False + If Exist(File.SetExt(Dialog.Path, "srt")) Then + $hPlayer.Subtitles.URL = Media.URL(File.SetExt(Dialog.Path, "srt")) + $hPlayer.Subtitles.Enabled = True + Endif + UpdateSubtitle + FTags.Clear($hPlayer) + + Action("play") + + Endif + + Case "video" + + sVideo = FTags.GetVideoDevice() + If sVideo Then + FControl.SetTitle(("Video device") & " " & sVideo) + Action("stop") + $hPlayer.Subtitles.Enabled = False + $hPlayer.URL = "v4l2://" & GetDevice(sVideo) + UpdateSubtitle + FTags.Clear($hPlayer) + Action("play") + Endif + + Case "info", "config" + If $bShowTags Then + CAnimation.Start(FTags, "Opacity", 0, 250, Me) + 'CAnimation.Start(Me, "TagsX", - FTags.W, 250) + Else + FTags.X = - FTags.W + FTags.Show + CAnimation.Start(FTags, "Opacity", 70, 250) + 'CAnimation.Start(Me, "TagsX", 0, 250) + Endif + $bShowTags = Not $bShowTags + + Case "subtitle" + 'If $hPlayer.State = Media.Playing Or If $hPlayer.State = Media.Paused Then + ' $hPlayer.Subtitles.Enabled = Not $hPlayer.Subtitles.Enabled + ' UpdateSubtitle + 'Else + Dialog.Title = ("Select a subtitle file") + If Not Dialog.OpenFile() Then + $hPlayer.Subtitles.URL = Media.URL(Dialog.Path) + $hPlayer.Subtitles.Enabled = True + UpdateSubtitle + Endif + 'Endif + + Case "play" + SuspendScreenSaver + $hImage.SetWindow(dwgVideo) ', panLeft.X + panLeft.W + 8, panLeft.Y + 8, Me.W - panLeft.X - panLeft.W - 16, Me.H - panLeft.Y - 16) + EnableVideoFilter + Sleep 0.1 + Try $hPlayer.Play + If Not Error Then + dwgVideo.Mouse = Mouse.Blank + timTime.Start + Dump($hPlayer) + Else + ResumeScreenSaver + Try $hPlayer.Stop + $fLength = 0 + Endif + + Case "stop" + ResumeScreenSaver + Try $hPlayer.Stop + $fLength = 0 + timTime.Stop + dwgVideo.Mouse = Mouse.Default + + Case "pause" + ResumeScreenSaver + $hPlayer.Pause + dwgVideo.Mouse = Mouse.Default + timTime.Stop + + Case "fullscreen" + Me.FullScreen = Not Me.FullScreen + Me.Maximized = Not Me.FullScreen + Form_Resize + + Case "volume" + $hPlayer.Audio.Mute = Not $hPlayer.Audio.Mute + RefreshVolume + + 'Case "balance" + 'FBalance.Visible = Not FBalance.Visible + + Case "visualisation" + + iState = $hPlayer.State + If iState <> Media.Null And If iState <> Media.Ready Then + fPos = $hPlayer.Position + $hPlayer.Stop + $hPlayer.Close + timTime.Stop + 'FadeOut + Endif + + Inc $iVisualisation + If $iVisualisation >= $aVisualisation.Count Then $iVisualisation = 0 + UpdateVisualisation + + If iState <> Media.Null And If iState <> Media.Ready Then + $hPlayer.Pause + $hPlayer.Position = fPos + $hPlayer.State = iState + If iState = Media.Playing Then timTime.Start + 'FadeIn + Endif + + Case "quit" + Me.Close + + Case "screenshot" + + Do + Inc iName + sName = "~/MediaPlayerScreenshot" + If iName > 1 Then sName &= "-" & CStr(iName) + sName &= ".jpg" + If Not Exist(sName) Then Break + Loop + Try $hPlayer.Video.Image.Save(sName) + If Error Then FControl.SetError(Error.Text) + + Case "seek-forward" + FControl.Y = Screen.H - FControl.H + + Case "seek-backward" + FControl.Y = 600 + + End Select + +End + +Public Sub Button_Click() + + Action(Last.Tag) + +End + +' Public Sub Form_Arrange() +' +' panToolbar.Move(0, Me.H - panToolbar.H, Me.W, panToolbar.H) +' +' End + +Public Sub timTime_Timer() + + $fPos = $hPlayer.Position + If $fLength = 0 Then $fLength = $hPlayer.Duration + FControl.SetInfo(Format(CDate(($fPos + 0.5) / 86400), "hh:nn:ss") & " / " & Format(CDate($fLength / 86400), "hh:nn:ss")) + +End + +Public Sub GetLength() As Float + + Return $fLength + +End + +Public Sub GetPos() As Float + + Return $fPos + +End + +Public Sub SetPos(fPos As Float) + + If $hPlayer.State = Media.Paused Or If $hPlayer.State = Media.Playing Then + If $fLength Then + $fPos = fPos * $fLength + '$hPlayer.Pause + 'FadeOut + $hPlayer.Position = $fPos + '$hPlayer.Play + 'FadeIn + Endif + Endif + +End + +Public Sub Form_Resize() + + 'Debug Me.X;; Me.Y;; Me.W;; Me.H;; FControl.H;; Me.Y + Me.H - FControl.H + 'Debug "FControl.Move:";; Me.X;; Me.Y + Me.H - FControl.H;; Me.W;; FControl.H + FControl.Move(dwgVideo.ScreenX, dwgVideo.ScreenY + dwgVideo.H - FControl.H, dwgVideo.W, FControl.H) + FTags.Move(dwgVideo.ScreenX, dwgVideo.ScreenY, FTags.W, dwgVideo.H - FControl.H) + +End + +Public Sub Form_Close() + + ResumeScreenSaver + CAnimation.Exit + +End + +Public Sub Button_MouseWheel() + + $hPlayer.Audio.Mute = False + + If Mouse.Delta > 0 Then + $hPlayer.Audio.Volume = Min(1, (Sqr($hPlayer.Audio.Volume) + 0.05) ^ 2) + Else + $hPlayer.Audio.Volume = Max(0, (Sqr($hPlayer.Audio.Volume) - 0.05) ^ 2) + Endif + + RefreshVolume + +End + +Private Sub RefreshVolume() + + Dim sImage As String + Dim fVolume As Float + + With GetButton("volume") + + If $hPlayer.Audio.Mute Then + sImage = "mute" + .Text = "" + Else + fVolume = Sqr($hPlayer.Audio.Volume) + .Text = Format(fVolume, "0%") + sImage = "volume-" & Min(3, CInt(fVolume * 4)) + Endif + + .Image = Image.Load(sImage & ".png") + + End With + +End + +Private Sub UpdateSubtitle() + + GetButton("subtitle").Text = If($hPlayer.Subtitles.Enabled, "ON", "") + +End + +Private Sub UpdateVisualisation() + + Dim hVis As MediaControl = $aVisualisation[$iVisualisation] + + $hPlayer.Video.Visualisation = hVis + If hVis Then + GetButton("visualisation").Text = hVis.Tag + $hImage.SetWindow(dwgVideo) + $hPlayer.Position = $hPlayer.Position + Else + GetButton("visualisation").Text = "" + $hImage.SetWindow(Null) + Endif + +End + +Public Sub dwgVideo_Draw() + + If $hPlayer.State = Media.Null Then + Draw.Font = Font["+16"] + Draw.Foreground = Color.Gray + Draw.RichText("Gambas Almost Means Basic!", 0, 0, dwgVideo.Width, dwgVideo.Height, Align.Center) + Endif + +End + +Public Sub MediaPlayer_End() + + Action("stop") + +End + +Public Sub MediaPlayer_Message((Source) As MediaControl, Type As Integer, Message As String) + + Select Case Type + Case Media.Info + Print "(i)"; + Case Media.Warning + Print "/!\\"; + Case Media.Error + Print "[*]"; + End Select + Print " "; Message + + If Type = Media.Error Then + FControl.SetError(Message) + Action("stop") + Endif + +End + + +Public Sub MediaPlayer_Tag(TagList As MediaTagList) + + Dim sTag As String + Dim vTag As Variant + Dim I As Integer + + For Each sTag In TagList.Tags + vTag = TagList[sTag] + If TypeOf(vTag) = gb.Object And If vTag Is Array Then + For I = 0 To vTag.Max + FTags.AddTag(sTag & "[" & CStr(I) & "]", Str(vTag[I])) + Next + Else + FTags.AddTag(sTag, Str(vTag)) + Endif + Next + +End + + +Private Sub FadeOut() + + $fVolume = $hPlayer.Audio.Volume + + Do + Debug $hPlayer.Audio.Volume + $hPlayer.Audio.Volume = Max(0, $hPlayer.Audio.Volume - 0.05) + If $hPlayer.Audio.Volume = 0 Then Break + Sleep 0.01 + Loop + +End + +Private Sub FadeIn() + + Do + Debug $hPlayer.Audio.Volume + $hPlayer.Audio.Volume = Min($fVolume, $hPlayer.Audio.Volume + 0.05) + If $hPlayer.Audio.Volume >= $fVolume Then Break + Sleep 0.01 + Loop + +End + +Private Sub SuspendScreenSaver() + + If $bSuspend Then Return + Desktop.ScreenSaver.Suspend(Me) + +End + +Private Sub ResumeScreenSaver() + + If Not $bSuspend Then Return + Desktop.ScreenSaver.Resume(Me) + +End + +Public Sub Form_Enter() + + If $hPlayer.State = Media.Playing Then + CAnimation.Start(FControl, "Opacity", 0, 400) + CAnimation.Start(FTags, "Opacity", 0, 400) + Endif + +End + +Public Sub Form_Leave() + + If $hPlayer.State = Media.Playing Then + CAnimation.Start(FControl, "Opacity", 70, 250) + If $bShowTags Then CAnimation.Start(FTags, "Opacity", 70, 250) + Endif + +End + +Public Sub Animation_Stop() + + FTags.Hide + +End + +' Private Function TagsX_Read() As Integer +' +' Return $iTagsX +' +' End +' +' Private Sub TagsX_Write(Value As Integer) +' +' $iTagsX = Value +' FTags.X = Me.X + $iTagsX +' +' End + +Public Sub SetBalance(iIndex As Integer, iValue As Integer) + + $hPlayer.Balance[iIndex].Value = iValue + +End + +Private Sub EnableVideoFilter() + + 'If $hPlayer.URL Begins "v4l2://" Then + ' $hFilter.Filter = "video/x-raw,width=640,height=480,framerate=30/1" + 'Else + ' $hFilter.Filter = "video/x-raw" + 'Endif + +End diff --git a/app/examples/Multimedia/MediaPlayer/.src/FMain.form b/app/examples/Multimedia/MediaPlayer/.src/FMain.form new file mode 100644 index 00000000..673e70e3 --- /dev/null +++ b/app/examples/Multimedia/MediaPlayer/.src/FMain.form @@ -0,0 +1,18 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,110,85) + Icon = Picture["icon.png"] + Border = False + FullScreen = True + Arrangement = Arrange.Vertical + { dwgVideo DrawingArea + MoveScaled(12,27,24,24) + Background = &H000000& + Expand = True + } + { timTime #Timer + #MoveScaled(85,47) + Delay = 200 + } +} diff --git a/app/examples/Multimedia/MediaPlayer/.src/FTags.class b/app/examples/Multimedia/MediaPlayer/.src/FTags.class new file mode 100644 index 00000000..130275cc --- /dev/null +++ b/app/examples/Multimedia/MediaPlayer/.src/FTags.class @@ -0,0 +1,147 @@ +' Gambas class file + +Private $cTags As New Collection +Private $aTags As New String[] + +Private btnResetBalance As CButton + +Private Sub GetBalanceName(sName As String) As String + + Select Case LCase(sName) + Case "hue" + Return ("Hue") + Case "saturation" + Return ("Saturation") + Case "contrast" + Return ("Contrast") + Case "brightness" + Return ("Brightness") + Case Else + Return sName + End Select + +End + +Public Sub Clear(hPlayer As MediaPlayer) + + Dim I As Integer + Dim hLabel As Label + Dim hSlider As Slider + Dim H As Integer + + $cTags.Clear + $aTags.Clear + gvwTags.Rows.Count = 0 + + panBalance.Children.Clear + + For I = 0 To hPlayer.Balance.Count - 1 + + With hPlayer.Balance[I] + + hLabel = New Label(panBalance) + hLabel.Text = GetBalanceName(.Name) + hLabel.Foreground = lblBalance.Foreground + hLabel.ResizeScaled(16, 4) + + hSlider = New Slider(panBalance) As "sldBalance" + hSlider.ResizeScaled(4, 4) + hSlider.Expand = True + hSlider.MinValue = .Min + hSlider.MaxValue = .Max + hSlider.Value = .Value + hSlider.Tag = I + + H += Desktop.Scale * 5 + + End With + + Next + + panBalance.Parent.H = H + lblBalance.H + Desktop.Scale * 4 + panBalance.Parent.Show + +End + +Public Sub AddTag(sTag As String, sValue As String) + + $cTags[sTag] = sValue + + If Not $aTags.Exist(sTag) Then + $aTags.Add(sTag) + $aTags.Sort + gvwTags.Rows.Count = $aTags.Count + gvwTags.Columns[0].Width = -1 + Endif + + gvwTags.Refresh + +End + + +Public Sub gvwTags_Data(Row As Integer, Column As Integer) + + If Column = 0 Then + gvwTags.Data.Text = $aTags[Row] + Else + gvwTags.Data.Text = $cTags[$aTags[Row]] + gvwTags.Data.WordWrap = True + Endif + +End + +Public Sub _new() + + Dim sFile As String + + gvwTags.Columns.Count = 2 + + btnResetBalance = New CButton(panLabel) As "btnResetBalance" + btnResetBalance.Resize(panLabel.H, panLabel.H) + btnResetBalance.Image = Image.Load("undo.png") + + cmbVideoDevice.Clear + If Exist("/sys/class/video4linux") Then + For Each sFile In Dir("/sys/class/video4linux") + cmbVideoDevice.Add(Trim(File.Load("/sys/class/video4linux" &/ sFile &/ "name")) & " (/dev/" & sFile & ")") + Next + Else + cmbVideoDevice.Add(("No video device")) + cmbVideoDevice.Enabled = False + Endif + +End + +Public Sub Form_Resize() + + panTags.Move(0, 0, Me.W - Desktop.Scale, Me.H) + +End + +Public Sub sldBalance_Change() + + FMain.SetBalance(Last.Tag, Last.Value) + +End + + +Public Sub btnResetBalance_Click() + + Dim hCtrl As Control + Dim hSlider As Slider + + For Each hCtrl In panBalance.Children + If hCtrl Is Slider Then + hSlider = hCtrl + CAnimation.Start(hSlider, "Value", 0, 250) + Endif + Next + +End + +Public Sub GetVideoDevice() As String + + If cmbVideoDevice.Enabled Then Return cmbVideoDevice.Text + +End + diff --git a/app/examples/Multimedia/MediaPlayer/.src/FTags.form b/app/examples/Multimedia/MediaPlayer/.src/FTags.form new file mode 100644 index 00000000..4c47b166 --- /dev/null +++ b/app/examples/Multimedia/MediaPlayer/.src/FTags.form @@ -0,0 +1,91 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,82,82) + Background = &H3F3F3F& + Resizable = False + Border = False + Utility = True + SkipTaskbar = True + Opacity = 0 + Spacing = True + Margin = True + { panTags Panel + MoveScaled(2,3,75,78) + Background = &H000000& + Arrangement = Arrange.Vertical + { Panel2 VBox + MoveScaled(1,1,59,29) + Expand = True + Spacing = True + Margin = True + { Label1 Label + MoveScaled(0,0,47,5) + Font = Font["Bold,+5"] + Foreground = &HBFBFBF& + Text = ("Information") + } + { gvwTags GridView + MoveScaled(2,7,56,21) + Font = Font["+2"] + Background = &H000000& + Foreground = &HBFBFBF& + NoTabFocus = True + Expand = True + Border = False + Grid = False + } + } + { Panel1 Panel + MoveScaled(2,31,18,1) + Background = &H3F3F3F& + } + { VBox1 VBox + MoveScaled(3,33,59,7) + Spacing = True + Margin = True + { panLabel HBox + MoveScaled(0,0,57,5) + { lblBalance Label + MoveScaled(1,0,47,5) + Font = Font["Bold,+5"] + Foreground = &HBFBFBF& + Expand = True + Text = ("Balance") + } + } + { panBalance HPanel + MoveScaled(0,5,57,4) + Font = Font["+2"] + Expand = True + Spacing = True + Indent = True + } + } + { panVideo VBox + MoveScaled(3,59,68,8) + { Panel3 Panel + MoveScaled(0,0,18,1) + Background = &H3F3F3F& + } + { VBox3 HBox + MoveScaled(1,1,66,7) + Spacing = True + Margin = True + { lblBalance2 Label + MoveScaled(0,0,24,5) + Font = Font["Bold,+5"] + Foreground = &HBFBFBF& + AutoResize = True + Text = ("Video device") + } + { cmbVideoDevice ComboBox + MoveScaled(35,0,24,5) + Font = Font["+2"] + Expand = True + ReadOnly = True + } + } + } + } +} diff --git a/app/examples/Multimedia/MediaPlayer/.src/MTest.module b/app/examples/Multimedia/MediaPlayer/.src/MTest.module new file mode 100644 index 00000000..3cf3c627 --- /dev/null +++ b/app/examples/Multimedia/MediaPlayer/.src/MTest.module @@ -0,0 +1,67 @@ +' Gambas module file + +Private $hPlayer As MediaPipeline +Private $bStop As Boolean + +Public Sub Main() + + Dim hSrc As MediaControl + Dim hFilter As MediaFilter + Dim hSink As MediaControl + Dim I As Integer + + $hPlayer = New MediaPipeline As "MediaPlayer" + + hSrc = New MediaControl($hPlayer, "v4l2src") + 'hSrc["norm"] = "SECAM" + Print hSrc["norm"] + + hFilter = New MediaFilter($hPlayer) + + hSink = New MediaControl($hPlayer, "xvimagesink") + + hSrc.LinkTo(hFilter) + hFilter.LinkTo(hSink) + + hFilter.Filter = "video/x-raw,width=640,height=480,framerate=30/1" + + $hPlayer.Play + + Print ("I will take a screenshot in 5 seconds...") + Repeat + Wait 1 + Inc I + If I <= 5 Then + Print "..."; I; + Flush + If I = 5 Then + Print + hSink.GetLastImage().Save("~/screenshot.png") + Print ("Screenshot saved to '~/screenshot.png'!") + Endif + Endif + Until $bStop + +End + +Public Sub MediaPlayer_Message((Source) As MediaControl, Type As Integer, Message As String) + + Select Case Type + Case Media.Info + Print "(i)"; + Case Media.Warning + Print "/!\\"; + Case Media.Error + Print "[*]"; + $bStop = True + End Select + Print " "; Message + +End + +Public Sub MediaPlayer_State() + + Debug Last.State + +End + diff --git a/app/examples/Multimedia/MediaPlayer/brightness.png b/app/examples/Multimedia/MediaPlayer/brightness.png new file mode 100644 index 0000000000000000000000000000000000000000..f3621e244a2516609358815cefb1aed6d0f8d7af GIT binary patch literal 1534 zcmVTp$#z;vE7PZjKt1i`lc|6Y z^R9+B&T>|8LJ%0?6Azz2oxm$22$suzP#>?ofDKG43Xz8ZZle|F1NZd&5V{eXOt)br z#sMUv1xqxA2yz0$x^@uxSb>?Cz$N?~xbL-%i7ex7sZ|kv$08;I0N)ka+lkm$Ecd}X z0Kg<}WdkEpejh(zf*1G%{%ASDx_Oujc~SfAWr|K9$bW=hJM&o1>y|doc%Z=j^dv`g zco3}gR*5WigHL9!7dxZOHW0|>s5b(AOg18_U9uT-wB${+;I0kPAJA|3@5gBy%~7=A zmiW!a^BxD_7PANjS;((>$JCHDhW3NtDw9r>UvV>o1ZT*Rd!I9bk2Sqk$#@n^_;)P7 zhn0NN1P_9kW_Y25OAIa+@N$zwe zP#`q7xynWKJeu#ZL}Y*JBg%@HocNgC3kkvxDwyA{oJ-a27Ud zRPQOSrhPfAW0z^lb+VT8E%oPeOsJiLo5=n3p2^q@);M_l2&qkg(t}Y78txjl7k-L0WJ`Gj4IvG z8V-AcC&?kM*6ZyN*%J)AgNL|}mqeXyF*7rH*)u#zcJR?y&BYv-v-k25d+<4|Gpyje zriY!Aalw;hz1|0n#)1fInQaEoVvRZEm&Hshw1tAD71ZflJwHW#a#Z;yOK&T882lE|Eru={#m$ zjI`arJVxV&AJTV}MdrdND=n^bIGdkxNY=ZdpA9PFCU8g}fHNwyI*a94C!uUeUXK|G zS&xyeTwtc%h9m?xVV;PU)p|Q}%`??j`lQ2~v?rcmt|#x6FMU=^j`XbOP3bdIt*7Lo zGB5B+;&$V_62lkpf-8J8bCgia=t9|_dJk;iD5bSa4`8^)4gM1%+Jy6F`06M zil;1COhdnRI6Z|o9EfU%Q=lK0(d2kIZ4k%PA!Lh7Kdbf^2(pDXt9kt2OLA8!$8+_L zXqlE6#cxW{MjXeRrnOQv_W}-JgOd9zq((1uG~j+kbDQ4jzAlZ8DRAo#FH({&w-b(siE-C|KsCD9}C6e%#p3lr4!GbY_U$gn=kIKXth{TcEq(atarsi&=&oc4BKp2$+eKt$NULi2U~ z4xNC-b$ueYu+gx)xW)Ze@OBRtDJa4s=Ld`HSd0+>>FB^bO(BB$fvB!6KUnzA0f6Z& k;W-X*n7?y7Q~lcc52WTH)a{vGU07*qoM6N<$f-MH;`Tzg` literal 0 HcmV?d00001 diff --git a/app/examples/Multimedia/MediaPlayer/config.png b/app/examples/Multimedia/MediaPlayer/config.png new file mode 100644 index 0000000000000000000000000000000000000000..b4248ceb8dc1bb60b208bca3d79c15d328de2f9b GIT binary patch literal 831 zcmV-F1Hk-=P)8RH)C42qCIXM6?OYh;&gwL9~iCZKQ=1VpOTl_p+N~^ zq^n@Ae$Gv56Yk~&J7Gm`GRK+K=$#D91nuN6s9<$ z^@9eog^!f@>>eP*VJ(~n+_t(OqKO_RJ@A)9IhWXFDuUEdi{#6Uu`u(}C;`F4D?=X2 zyqO6R$wh9O<2p~B8&`uh8E+u%hTJddz7Pn=kV&9Tr_@-IX6Ag!y(rD*phPFnkiYxl z9w20j1v;6AJnI{Qh$&|2sm)vB%h#gxcxUzs1iZxtfi(9YS@mB=Ae{>GNe7^q?J?~X zKLMCyoX<&qbFL6L#B+ivYZO7~DkC;8qGxXunGyBw~0L!eaIa=$kO z)YHh$a@9Y>4FcAOT_Sn5}>hq6Y%hJY?_l|tGfx(ftslJE*A zl|p}t%RIBuA7y7u8sUA)r`QlUuDtpuYzf@rLQHz0P@dT&VP?un2C|eb9TD&s8wA!O zfxpU=)h!(n=uw{B?G1sa3@c3?HeR zE+QmZQg5cCr`%N^A0Rs7H? z;bRu%qrZut+8w_oNB7IPk(;=Q;0g~B4><>;C(l6e4cU5#YqGj5<`%xiL2E(G=ZCfY z$u8kFFZ#!2%YG)aoZ7`vhgb6tMUwq?$o5?HwY;WVony?_O&Pm+!!arS2>@d}CxPRv zcB40VR=4?)6}B!m^LM(NzYj9WOA^%QvO2O=*H5xufDOLxwzvcm0Isu7%bia83XW;l zZWX{HzDqCjKP?}Xun{Kh0y=fw2?0`kj|@owcv1rQN%}Iq?oYBxKn^gU1rbmsf34$; zYXL9n@)rbPTaK}xFHnGuh-}vaQf66Ntoh41lH;ul7Z8^|xM0%XEe1w3?#}D}-~t?j zx^Y3kVKYC+)mFnA&PF2OPPwb?S`aW`=D!dP-}FTvTmaas!RG<6QV;2KR-;?8w?m-` zXxHF5Rw%USePN&VSw4s|AA5(wtXC%$S`?bi+$gRH0nyn2#&xDyp;1@RDsPEU05PC5 zjSBTs|-H8`#2391>P2SS#|hRazM-Jusz{2?gs2`KMJH z&Z#oDX(p5^@#Xz5rnDUWcg#dgn$XEE|@3qQ5)1OA@ zcArkpqhA@L+6UXLnpvEROu$y1yl9NWz9p-+whg!OdL$c?8o8zI0u+EAQ;@<_mbgD~ zG?Mpkm2okXS)Ux!;!GUp)zCcsjhX57v?T`dKAz>p-I7UYXD5kkq z01fW(h|&9{Z(v5kc4mDZ_7KgWBSdrm5<@gA?Xj{x*8sLXNcCmjAeDasF@7Z>?m;R5 z;AXi@4RDpCqr$>;tM%cNB-L#wo#-ojGvKNytIm=7IkRAO81UV zgz}-~S7jVS?3U8MgfZ0000N7)M%hhqo_GlL0e)ANlyV0EG38pJs1lTJs63Ig1vbVFV%w- z^&mZYFzKbGRG})gJ@^MyB;X;@h^dmKYyN07*^h_K?tI^-K>3*)_3qiv@&U0NYGv={0X~to73WjXg20108Zo&k8sAU zag3&E@j^5)W?MK-Bp-Z~i)L+cw#Y0n0PNe@c&8>N>HU@Iu76VO!|oliBd=d1{vUmC~H? zLX`5GZQ&{FXToo?)9odS^TG>J%q82xAe*Mcr=;6+6y=QTb&mc7?9Vk{UPI}!(O)) z(_&9XPBl(j8cQtW4F5WZ5Ah?_p||(+vd)N@uLd<}sg^mSJ<)*v&{c0dT?Z7=5kdz5 z^mFK){Sr&K8VcOk?<_X)#as&&5AY}Rq^Ws8M^qpB=-Z-0Q-hG09&4e0e@r(Ncf>5y zmnsdyxK?<>lGqWnODBt*CgT{LW;Zk^yI`YlX+S%j=0Yj1of-_njY$I)e*9M`>w&+6 zpfYKo$d6w-$4k;^@GWK%(?gv6R1tg}OB#6O$6siz zbNo6P=Mz1WB)&G+3N3k@3C(tuvCDqpQlHF*5#3j9ZvQ7Q-BX>Hh)7;S?dJY4B%y;| zB8YwneMNLU)zCg(h6W#{HC>ym;wOfj!-qJ_%7B_O_b^X2s#3OR+nH)akJRl=gg)N> a*Ln*hs%v809a`i70000_}6?;+-5iRkg zL`nhyp;SD0@Zza>G1>+jYoCYBFL!scGrP&AYQBN6%gny-H}l?nGqVE&hShl^7Fi}Z zOsr3Abv{wyg(aS?a!8gW3cQsAUi4$~Arg8Kk!6WDc}H3bu5&E1#Ghi$Enqq_`ajrO zMJPWQwXe#2?i1@llFiF?E8%FAU(E#Ngg$+8?JB6dQ!pUxP&LeQg)Q##5`fcOW!xZa zl?9eP;&g#C1sftF@=*|Ezf_H9+E>}@ier?5SjTsgG2@{fC*_Lc1+5wg=FFp7y_5ph z0ayz}Z4yUWggG(@`OpIV;wS|aD1;{0i8F8?Pzso(z# z5Fgy;D3IZy=?M7EUtQP{)KhZ%*1$jG19N1tcx^7AS3Xdp)U|#4*1#0^xYJ%j1x8>W zcuE||a3Z9Dz&>Cv-0hWPu(|LZ=#dW;d2dX=LQ$)qG6i*FfW2~BC&h%is|PlzP-{F3 zfqdWw7Z4sb?$&r?JO(!We4vHlzQBnovTX5~a!3NdIGR3?;GE&cWT{bpetx19(CGtl zO2&q?LXw&zju*6QU^0Loo@7$1pHe`*<2#`h%8A{sI9|~7f#C3qqZBaDd}wl=I71)k z`+C4Hj@Ei040_@N{e+eegu&1U{$3wQa~>g2B_u(LX-3HN%2dEJ_5hbdze0b&abTwL z*W`vW1@;3bix6-0#0P>+#tp4rN&%Yy`~;xPH)Hy0V^>`F5u>buTcm;K0IZTGXSgwW z!WRH;GJ~b_rs==k7Yypire?*R0^V^Z!XI9-&e|946f8tY@5Ls&q#W77Wl?r|h#Jh% mt=Hl8zCI59YL~<7!QeODA$j&oiky%D0000c^-+qOMoWW66vOH$nce$T9 z0mpJBVV$NaPlDwbJpyOFj}L5V82LFr=yH=%_cYkU?;uJ9&@BsK0W3hK_0+dqZQE{% z>GS}-^t27I8G2%T3XB8zQ*eVp`siwE>F*rC1)ec(asL@8KP|u=W)uJ{r3X-}_xwCj|JG@MRaO%+3@yT&W&vEL z{BTF}6x`!h=vgH5lE|ZO0rAlO?6t%w}6*-V>)I}1KlbUvbiRhaw1j%bgD2WpffaIho kYf@KkU6pw$#NXxp1%f`{@Ox$XPXGV_07*qoM6N<$f|Xbe#sB~S literal 0 HcmV?d00001 diff --git a/app/examples/Multimedia/MediaPlayer/gamma.png b/app/examples/Multimedia/MediaPlayer/gamma.png new file mode 100644 index 0000000000000000000000000000000000000000..3a2cefd4a4fea964560dca5c37b1f9b28fd591aa GIT binary patch literal 693 zcmV;m0!safP)6INX4#5Pc|g6Y5|)oj-7<5~jb6I(h|<>W5lU&;0~m@? z=jP)QKP;twp{BXu4K~ME<;Ej{*aHlCVItwhGe)uOvS9n1&&3=V1f`bNa?b)lBlk

    }2e9Ov(6AVbpkamGdlF7kjJedK(sov;DWN-NMqmoe8#CrJSE zJmoQuYy!+{n-OQYVvHJr%N%0{_~83`W#0uUBi^~>Y!|%%ytW7MI~Z5Z90amV1_4l7 z=STpr!UI^(o-zQ+EJsZyqMFGKsqLeH0O0pt~=W6?V^io++c#ZrFUMSnhp+|HPGUK`mOXQ z{Ahp%2egR+)`VdHl?G=x2F@sLOa*SAr`;JYj#RI~KzpVyw0#kf934=frmS0k*Ijj} bScg9WsNVZDMo|oq00000NkvXXu0mjfq5LxQ literal 0 HcmV?d00001 diff --git a/app/examples/Multimedia/MediaPlayer/icon.png b/app/examples/Multimedia/MediaPlayer/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d321ebccd32db289220ce9d45efcac9476a02086 GIT binary patch literal 2509 zcmV;;2{QJHP)nv46CsojO{#Y2B(b z&UE@m?X-51GHMo!6|$)Rx$ow|>cR#kE&EwW7{g zYnDTWS#8|R9HwaslRlp36a%c_yP(Hv_~;T6s0>f36Ls2hvC1wAIdfIHoI;eaQOW{L zdNEPF%3%Q7(I~S!YcC0bZ?0Rnx6~%6Zypr=4HW@B8lb{`WAz z9PQj1o|`;@fY6F7tt$OCswmXKB*BC1VGw{4YW<&dvEQ$Euue3uLc{r*1pJI%W0h&D z*tt>`QbM6Voh2mb$Hd_X@A>{WA^rNlP+m>LU^#Yl>4F2FO^|?_(b^3sR?GYXdo|1D ze1^pVIYEK87`rW@B_}#66`VPWWQbiS&tiT3TQO*!tJDWPS+Nie{DLKnrtS=Dt z%#Z>Llb`V}JpfGQTRyzS4*%EHTn&IEL_go542=Q4F12&IU7L2w@tLWGbg_Hlw%E?8g6hzNIBAJM3q4;&8&l#2izZNkC9;(fNT5r_Hw5sMg5 zNev26DBhredCcWXD!2>j3w<>0y%LIDfW$xn8$qsiC87XOUhJ-Rmd3Vactvg6>r=YbL89=JP==dzX$ zt5#KAg}Z_}%-{+%kAH|0Sb&L+q=X9cym57Nj1b@;fEy_A>@oS%Th$g`N+AGx%~o+6 zD=`@%pRas-gtZLNz|E9;7Dc@WBYhn!J*=bDYf*G^jM0>lZ1wylHGEi|mII*l z2o?&HsnoO0w=c%vB0ap#8GmWp&9feipp0f3eeXSNLqj0YxRIy0=(pst1%ZY{7oLDH zRskHx8{dThJp6}dG}dF2=iA<*8NB@go~6KV+084ST~W@{fqovR!?O#aeB6Kn!U4f7 z4$zk&b-zS%3vc+>Pw{v1Jw;~mAkX?OzoMQp+}-0I{>?j{{VRULb_AdyGAf`P;4x;i zpBDeqP7giwAbFTaxypAw%kMnB6pDLT?zar_guizvUhp#qcJUV!3N3&e%mK$iFppoe z)9c(VFHqvwU*u^N5JIPeE~;@eTks-J2B!C6YP_+Q@e057?JeBFYzR#MAc5XCrHSdl zJs3jgXuSjv~HvaHu|01 z?pjp9$MqPs2ue6Y*Pb&gGlT%_9_5tdkO&Y+?tHS}!CsOrT59v>po}n^n86hoe8r3`BQIdigl9!s4yZts7H}`K(1BZ6#30vkidV6S zPzb~WyJIqdPLynA0tDPY0UYHKB)7APBMei)R2K0ZFpnPqiwN@xtrUMjQDEN;AMK4C4M4u7CssS(QjrU@QfrUMj^< zR8WM)Heh;EH+g9tE1-a3&(AG`9sz|&O7e^Z#zZ>n+s@F)=UGKghM&R~%6T|LXfjX3 zY@0S?X{dOd?J3dw26rSaR%1X#+(;1%c>;IG4KqI}qf(dRGzDz;+?r%FldcpCd5TWn zqKZwNq!EoDQp8b?(?~Z^$kRxQ*~|58;N`&b?&QjW+|vo54?!`C2bjw;Hgk$Drn8Dp z1j7sw#RMvNh&Oq19Qm^<;FkF*H+{jfpC+zh4?9?b&0Z3G04S<}A)@qg7)c9ZmH-L- zBVd{a8MkBCrI&D40`8-_eJI+~G)n-jfv2X5SimD^4vcj){-Yk1v95qODd8VjDQ%gz z_>Akos8gnQ8ERaMTW`oXJx9M)t`JQ85SDvQNVa6wAV|P)LI~yW1+#MkC+K0kU}XI- z2{YoR!zckkm^>98O%eqd}IezstYLqk%4h5$^L zK!^}|M3mtwF!A$lb}HFv02*Nw4mOrcK%%3gD~V8q150OW2dRmaS`&d=Ohh1DJ1;Qm@yPv)fX6^jsrU~mm+0r%m zhfzcv;e{aLeZqR7%tt5i6z5VEVI#0H6TQTV6C*~9_^1ML1mIv! z7A7Mkh!ZCsTyHhPga~0Ek%+*1w@XzVFY`^0!U&`;_!=Q}BpTu}D4?)$--=i+IKck^ X_fr*v`{lr800000NkvXXu0mjfMIWNp literal 0 HcmV?d00001 diff --git a/app/examples/Multimedia/MediaPlayer/info.png b/app/examples/Multimedia/MediaPlayer/info.png new file mode 100644 index 0000000000000000000000000000000000000000..71e6db8e1c73b506b1e80f25d59cbc7aa9b280e5 GIT binary patch literal 2413 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 literal 0 HcmV?d00001 diff --git a/app/examples/Multimedia/MediaPlayer/pause.png b/app/examples/Multimedia/MediaPlayer/pause.png new file mode 100644 index 0000000000000000000000000000000000000000..db2961a31799fb220a5fe10112df2924cff448ba GIT binary patch literal 393 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7`%AFa~(KIEG~0dppzDkI7M>b#=PB z*B%Du&JDrB{*D$co!qf61Hb6Fm3Thk%Sd1q`pV+={ru66tDh&A1p5>`tlqq6()VAl zU!?`>e!Bm(i&e%e`clK|*tolEZ(mgL_?O|O2WNK28m=?{VHNlMgUa#1=oS9<{9>z} zci#N;N$L8|_-F2`t2eK&$i8@>;O&g)Hxad>wvJ8QI*Xj2S^TfvVe-=`)c)=})^qQ@ f@7>uVC;yfA=*xeb;RGS;GoR*@VW0wkGo@N|O@8l(Z-pawBg1x!YW;)ovsy7b6lSi6taU zv3u$&OwrxN^^{ayZ9n5ky*XexdNPJ?E1zg7xDFEuMrMK59ly?Dcbqu zMKnhnUuu%Nn2M0#FhiQq#)RkqOHEE4^84D#cTKp>l&ApPOiJM&fUt^>n$XGgXaL(y zhN!E87n<;j1x^9NY@TYu2bMbp2$Q+42`M%>1qel))`TJUIt2(Zn!KA+vr~W|9A!i! zS}1S|5Vm-ChAT{R3J})tSrZ=QWM}XX5Ejv^3Ej+b3J_-TL=)by#3?{1Awg6!_gPPDr+$lh)r(Y9pS+p%-075Nq zHQ{F9<}DmxjJBo4F+iBXqtSptDzate>i^4ANm(s7%rY+f9RoyC(jeVtS?e4il9qF3 zF+UFgkzpS>5dspj%PhLHeJV0Qx!jd1vwR%r%i$lxdAuC`7^a!&^bS-@hg6P!;bg4O z;T>4d*L-fpI~maN=P3?+3+(|--j3invB2@RfC5@|_%H`7e?&HbiCot4gEU&k+W<-gu)4HX{@u+lp>y3e$b@j(C${Lt~&Cx2R1eOO&%GR(L>qt&=z(Q5bvl$b}nlQPCUu&`@2d=v6}WFx`~vR9Z^BLE@4 n$9Ci3;L_F6?RY-Cc2mCqDrG93~DH&)Bw&~?s175mg;NO7LbqSnDmQTX_ra`x{_3dbQlJ=B`q5@ z2*@mX5evL6jROf-f;A9+6t|gfm)khSBLh>Qlp1Q>N;g&3{Xr}sdu^gU@`YG}u`4C7 zTpOGjWC&!KJhrvA8w9tn)h>ZPnGiYzQqCQKmz450#Gu6_NKitO@gylBL4qWs+02m~ zLvf#3b|Gc`;t~k%1C#CBT@QXL^GT8*K`9BwQ^MGg*MFLmz)hFHq)c0ofKz|tHMBDU zQ_`(K9hR$;Ie4|?BoMd!PvCta(5GlS%TlU28j(Peo?0D0_!lqmGj#y`%2U3H-vXU1 z;>CcLX0P;pBnxQIfd`~W`|6pks$2IJ(Fnj5*86HJywYcp2>9lJjHRAhyIjss3gyF; zvCS!O;4v-qvVwh)2zbY_ER?QrH>T1#QY|?Ws?(D5KyGnWn= zU>QEs>~@(|^v6L!Urw;2umoT)2MbF8n)s)%1hm&~JOsXCPh|KA1X3I@0G~I31svyt zI0%f>>NJg$j5GqD*$JILu_orxqfq;jhdz?627gyv0=HNIP|QN5+Gwxz5$Bj`3_ddi zyZKX(?~hc4Jo`He0qZF#onXj8mV`XHm*>9dxn$OL`Gk6Es0QfbtkeFvPkASe%9o_s z$$onCA`py_EVF&43!WR5amm(%#O;2QIhrw&L0q!jQp=%0I18YUUCgtCDtU_LpHU^> zDK?(pY2aD}aM0cfTe6Owe!it5GQ740g7T0C+9HDw!2*5}nwe_|J`W3Y(8vWt;CWc! z5amYUhh%{+*3oJdT+0F-&ixEkF~DmOSVuQ6X`q(BVt~&c0w);sq1SMpsTAuSl{v+8 zVtg(~kU*z>o6QI>TKvS=*Lnwer>`+^7!|qMlKsZR^&8xys8^Cc^sIzMvm4akWHe#1 zQeG<)7TGDA67JwIY~z&jXMN~nznH~tC0EJ@WRax*yQGymZMR(hjRia{Uk8vv6PIPu zY8<{@Dzb30=Ya3wY^s@VD4hL>i>lPE6h3)v6*_(Y4s_;d&yA|7)&Kwi07*qoM6N<$ Eg7$gZqW}N^ literal 0 HcmV?d00001 diff --git a/app/examples/Multimedia/MediaPlayer/screenshot.png b/app/examples/Multimedia/MediaPlayer/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..8ef46d2a63a7ab20664728c05e9d81c4e38ce9d1 GIT binary patch literal 1090 zcmV-I1ikx-P)7+`B+r&Zf+WF!&tv`aT)7oSfv&f9{mvY2bP8tyC zaS7PGD;=KUK65K%WOFjzM)OV1U8uD$7y-m znSP4&huaUyWMcwla?6CmHJLhm40kdud}sGEV6gwgxM7s6RIm$>Ihy$2D2Ds~sR`j2|1NANz+CQqQ%tylnD;cccfkx5J; z%P-nkifzUOkU=LOvjKTKL+)z%zF$hU@wBvgPQ;P`Z_Bh(U=)E>TJzY&8g6Oh_h_PB zyRs(PEqGOtbFAlX0h?y+k=+n*taSoLb)ZI(J3Tw@V1UmQt&+!+i@;+{P_(1Ic1JX= z%GWM(9jMT>tG;&nh<~FQIRb;4R_1G07I4>?2>eY>(dPTw)o9vZ$q~qLQPCQBw4jwu zqoVywUvdQCOGPf{oq{&6Ge^-n1A2oP1omrM3$Kl`Sj;X>|02MfUW%_cMR8+5@wDWW zR%r9`u}mKsEtjpHQr#yL0-G8ahCQLs!ZAg+c!Mlw=q1OKEaDN5eQRKIroEj@pTng& zq>=i_^mR)PODfRQ^U)th02?@j34UUgc5H)lAOe9LYxyR0`W{{>*rX&t0IpNd_Q2JB z&I?-2NSFZJV-q!eU2yCii)r-q3E>1{ycu;Q|Alxk*TbD4{Dae!{a`@IAry%#w6 zjW*gM*!vTRxCO~T?+0QZJ^l0sf~C?Bk) zLOw0(^gm1O@XX4Ql&7fWxtM>?m}7`@oaIOB&O_Svag4)@`;buGAuSC!LI3~&07*qo IM6N<$g4h!bDF6Tf literal 0 HcmV?d00001 diff --git a/app/examples/Multimedia/MediaPlayer/seek-backward.png b/app/examples/Multimedia/MediaPlayer/seek-backward.png new file mode 100644 index 0000000000000000000000000000000000000000..d108a3f171ac516949c28353ec4d4ec35ff0d624 GIT binary patch literal 1316 zcmV+<1>5?GP)MNv`T$5s zga<&&)j%i~LyCZi8iJ_-f`+0Xh+qJVEzsWwI&;=OGiQ2crbFX8FK4gypY{KwG;u`XbfXuW#uk(ejkqz(~+Cx0%){+JcPeyysq(4t-A@u_>==Y@8nD+t4h%=Qh(a zgG5zcU~_o-!TQyvJgtFFQf%<3Ei`G454pt)ZVgL6Mt|9)C)L-N)Dd9pA5Bj{x&rb- z(3eq7cdxvc(fl4t_$8iUS6cln8T|s?vA^llcz0^822Sa*q{y_IKr7s&OBG3)G*Q4e z>JfkpEkJqtz@}_gWkAYA0W~TLM1~ZgLhZ0A8_cM`_w?1000C>2pF(OV0qW@vrfZtu zOEW=Nv^A-K;ARRfK>bx`>FYJrmt?*gr6dAwYko@dPy#eu7cBh=J>n#YYEA5WpMVCH zw@U99khp-DOchksd#%Dn9 z|MkA5#wWhsJkgzzohEoVMCGUK1Ip9t)T6%Aof3Tl!aqs-fC^a898b<|-rzGMuLB>m zAlnK~YEb|cv7P5U=M84E-++2k#n_zCLljg%m8HK-8Q&SmPzSQX@_PbC#$M}~g}1-# z!!}BCP7hHYkG*a(^iQ*szW0G1^1R9Tu5ssQw{K5NKwa#09))rDF`nY!eG>3P?Da{$ zrdK?0g(+;fF9KF_D^?iA5eCIWjm+n5r(tp;Aaa23Mwswwrtx=!HRWJI;!2q7a(tnV&ZpyaIZ(jh3};!b zqk8DDZEN>D2%!qyO1d>`*3#^^W&rA}FRg@sHOrT#M1KTqPS*zl9hNFb6P3sh~25JV7pfCe!(rZE98G2!wC7$2w-4Lle{ z)EJ5aq83CbkP;E3ja9s+3JM98a2H6$Vhi-|L+RO>?QYM#t>3Zs7>OQ0X)WH&YhV7)2gu_?0T>SQ1E-qqS<0Ykz1)fHG4r>Xe~u(sE@b z8a_{ds-taJ{|?FwZT3+%D3nO}Avz|1`$@NXv=sr$fAm=V0PiT+PHK#yEbc_vs)g}| zAEsuvmt)$aYj(%yH9oA}=N4a5l`eQ8mc;|`jNATIAv8?e>~5P?0-%0w(f7(0%F-fT zwYBTiD^`G&?o8tPm7%rX;avf21&KsuvLpbY ze%cci076UDYD-^NTEYM*LuCHX(R`?xnVRH}Ev0N&ws%Qxw)3O(8fb-Ho7pc&UQgAE`_Z!5!64%Lq~!U>H|0szX_SziFDO8qV6 z0DWa6G-{GJdW1yeXSEd4;9K(u-!Q`PFHp?Krl2pMYj(mTfY1=%5opW6MV2yMZ+bJs z!Xy9?2q0b23m(N{Z)R9!Wrkz}v`xrNOY@ZXxw=l7anFHhtc+>~8~z7OBi5xTq3zVBu z07z#AAL2fVPElySwq){LiU9!TP|dAj?-H}9cPsDj0ssi{En~x86YJfoySoGc9BZ;& zbAP6F3BX?Nqb}@aG0&~4?*f4Ln8dlTH<&NE*R4F5k=o!_na>)-zl$pJT=z2NDFwL5 zY<3#{7``yp1Mrq}GKII`H^y1vC$rZMzndi~%!JhxSc$iUE!<=ZHZaX;Ng2RuCUf5K zmr{YXZLpG(wq3Xs%z-N`uqIv_Z}7Y+XyqkmRl5@>z;F%))STrB_8I<-tY@apSL#%l zcyU+(2Lfv930dL$vE2^e$P_btTmX-kmW@N?MDL#E&~4?ER%o0tL0sKkF; zw49mNYu5<&Gs+YkCggnQ(=e8o(iOhnhEkK}c$DM4`$k`DV8DNh79d0K27H{JH1^Ee zu37rm4!=!(0tYoZfGky7J-Ri^mFLku>)ktCqx4Sh>i=Ma;tth!`1J5sX6k+KXHsdz zc^wI0v`+YZ`}p6ct+uF1(<4QXmw83m+oLO*=X-;i|0Mq%1-jVtMAcr0H zs&8P5Qy;lqr_*B*pV{Ge1}Vo-XNUiR{Aj`hJz=xDyuID=aF@NjCo?UY2O8@ZxT&Ya zJnxXC4Z0zQ@SvyNwl53$99T4}7(jj8C0?Te@;$J4O-@YVd%%$mXtjdvuyPG$K_|)< t&5bL34>-2#_Jd34zN6cob9mid_8-{Kpq!0U!pr~w002ovPDHLkV1m#jT%G^` literal 0 HcmV?d00001 diff --git a/app/examples/Multimedia/MediaPlayer/skip-backward.png b/app/examples/Multimedia/MediaPlayer/skip-backward.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d4f073317572bb781964bee8066acd6506692a GIT binary patch literal 1093 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 DM)e0F literal 0 HcmV?d00001 diff --git a/app/examples/Multimedia/MediaPlayer/stop.png b/app/examples/Multimedia/MediaPlayer/stop.png new file mode 100644 index 0000000000000000000000000000000000000000..9ac59d99b338bb0ee4ee9317190fd38c7ee453b0 GIT binary patch literal 495 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7`%AFmCg7aSX}0_jcxaFQ!0=qvuz2 zFHpI>vE$xCd+G46Os=^~N*U`LyYDTT>gX>pRZL>b%8o2i*WA~PPR^GPbcr3zG`)9m zby{J*V{N+G^VvJ^eBNzbZg!v5<$tW->e+9O$}F4M(7mFuhwIdi1B{=}Ws5JCOzCpH z70~F(X4ftMXyw!b|KmO7UHu==W!ZS%GrFc{ccl3BN0rKB6TH4gE-_r$B~`S;<>Udm z9_7Z$FDs>kJ(L!&w?E^~y7Qz&;)kN0&+FM$zrA8O{jcJ9h7AYXj>qm1ml$82*Y1(% zXFtdoCVF7n^ws}P8=lX3eDc8b>!Ge;qKmB#Y)H>rbHx0t%_8P2+cU39IYi#v!1uvh zh=EZ68wy}JKhN;u{5;+8o3r==KAhQM+Q6CmzO*6xypGbfr!DcZ|C_X4WpXLJpUH7e zH>a1u?85p}d(0MW44u6=dyA*!^Ss$%Yu_JfSsf7^${QK;aP7j`e`WVBUcNJucgb9z z?u9&`Ubx@-+Rn3WVd@umJ{_yS&t;x;Uj3oG>xB;6&O_|l4_%jinSTG>jXW{qWBqTx h%@t?f-1%>g9Yfofu;uq+4n7A(q^GN&%Q~loCID#<-xdG> literal 0 HcmV?d00001 diff --git a/app/examples/Multimedia/MediaPlayer/subtitle.png b/app/examples/Multimedia/MediaPlayer/subtitle.png new file mode 100644 index 0000000000000000000000000000000000000000..a124f785039b1c809ace5af38ab01c77ad675730 GIT binary patch literal 1174 zcmV;H1Zn$;P)(X@-G^x zmP&0K75sl{!L-Fj`~ztrM2&)4(Ik8Nu-^IZPG;}lZl1gY%iY=Ue&3mM?%X|d2YB6E z4K<;B1>nL6a|(DD)Q%9`R+9t5unfIBoS z_$CP!;BD1C;tgLL(SrG54D3^v@RE(*3^Z~`IQS-{d^HD>71g^uShRuca7<1ktEv<5i#!xfXi96GA1FlrL!9}09~qmX16?!%9jOM<|OMb_*9-2 z%y+=Y+GnYzWr*;Jn*fOk`O`STYF{lh&pF;0_m|O}jAB4HAzenGi!crVFb<21aaxuP zb23_j4G9z+b`ZcWLYF>|Ho)BUX=^hfy$Q3|ERmWyxyRTHV6nt*H70G+Ojn*w#@KE8 zYLL<^jpsAf8A7*30P$H7J~GB0!*E6gHCDg=8uVjgq2GgL#-#0N)4tunAI9h&nJ0s2 zie8oyV5Km%G5Ak7>)51=u%h$~DBFaTI-JZ2>-a>)bXBxG2p$yxPgpBe^+~t}iE9Zr zA*Gs@u^wx(8AwdX16Eg@foeW5n-g~v5_)8t6Oo`3RT*@RjR;lf9L+$o6Y>w^F<~I) zzrsO!=Y&&bW!*a_K5MzCz^QtU+(O&5Fi5)1>B3wgr#`&9= zXNAxw3wUodTLhRT+ycI()$io!*LbqN%U2?1a*c6Q5GWKL979}@yby3tOx zTMiR3ZBAkU^F>no1e}|xf1$Nvj&;0Np&9QN03-s~Oh}665p2U|e1ToayNgg{PSycn z4F?q`_MMO-0nVsAJg-jOHa`7QDoKx(ybfqj zmnVvT`d)Qf9YoM7O$To&Fuz!y@#^$f2Sc1x#K0tR6BjH}j_0r1(gFU!kajkGRXiJ% z=Op-H(7+|504xd0vk(AJdk@Qe85Qty>!-rNoY+yPb}IXgU>SKlUQ8NaNQUHzWH8#$ oijtek0EThf{z|q|d0wCPKeKj|gU!d-<^TWy07*qoM6N<$f>iq#YXATM literal 0 HcmV?d00001 diff --git a/app/examples/Multimedia/MediaPlayer/undo.png b/app/examples/Multimedia/MediaPlayer/undo.png new file mode 100644 index 0000000000000000000000000000000000000000..76e6a8a29d19659b27cebc4115f558933b07e768 GIT binary patch literal 1091 zcmV-J1ibr+P)*R=Z;HR=trhbqc zt5T0IX0uG(%M3mh%_FJC&)^T)%Ke;48kN9A%DsEG7mmbK$rdGA@)rUznH(pIKR16f!7c~ zlJ7V-JbsxIzgUUa6hL-xkBZ{E30aDZ$g*1suz)wB zIzTDF`hrbJBvIL@HZ0+%LV(A(Sq@sQM$f}eF>phGPN#$>78w(;R!UC-U6m>?luLo2 zo7GB<1eE}vl+3CmaLV4I*|>})xa}i$f8xNlqXo@)iAvO)*t5EO!JCxUGgsRK0WsIA z#9GAdR+!K<7zeed85s1f7%F55`k`sI83BM5!*=n8$i`(&FAOmy0I({tRY=hFg8u!d z#(UQ(AuvF9ce;}k;FX}e5N^v7)wWOql3fV5N#E&BAq8l9A+hx8wHO#hfY%E_ap9Bl z>3C879NK;VX6A{GnS4gC9aBca`=UegS8Q$xPZju&?61J*$e*culNR8X;I&sAt(^Y~ zxl>^T0l^ZgIMnB*RV6w#GBc6@KM9WmK4wSD-~8tz;sJoA{4T@aa~(4Rl94L8^Fjjx z01guOC^hUGm z!K+BDW*pDqPWCN~#VF^a&zNi(Nf^5X6b45GkF~Pc82q1v<00_xnQs^mFpDQO@i(ZS zr-c-;fiD8lovdZ4-_bL2B55HH`Iv+p&!3v{0ynL9DVnK!SohAGL5TOg#hi2RyXX7vIrm=XJ_r$Fnc?Jb zR-8EX)GXDX!3-n3;lA^+sG1a4pKS0;Nv$g$eL{0q^l1!hV{zyY>30G2k~E~s;Pe$5 zEs$Q4t`x$Vwa9dmg&^}h=Npe1MtKDm+F zjpz|tp)pUuIeX4Xmbcn9hK&QvGUPdxK?QtvjRO`T<~*}3sDNJAILrl1&zAY6qS-?A z>NVYQUwy0Ksn?v+4OM5NIciatCUS;Os7uYc~iU>-I+7t6Ywav`?5y<8RE2`ey{BTJn0kgz;39QsTe>MR7TRjd}c}gbG^*??4NuC zDr~pF8XD+^D6p9=ZtEZkUNCDF=_mj(_LF48qQ1LaTh!9&nbmFqj=Ncz)+XZV!Z literal 0 HcmV?d00001 diff --git a/app/examples/Multimedia/MediaPlayer/visualisation.png b/app/examples/Multimedia/MediaPlayer/visualisation.png new file mode 100644 index 0000000000000000000000000000000000000000..a97ee5fa15543f2d885e2c359697c9314f4cf9c0 GIT binary patch literal 1093 zcmV-L1iJf)P)`VYx+lh!jRHokw%f{THdSuG>IkPTWH|JHe7DJ=jSu!6DA@XFwiHSiuG&E-^|J+2wXi zyUZ5?{*}r(btJrnbR^5YGBrmb*i75AdT~ zyf4pP3kQ`Z5vpBfKA@jA1{~{_TVdsyniumukN6yQoJ#r)ylrZ{%6Ior#wsIk6fnbg z_W*_I3kVYd2pFYX9cEz*xWE$1DP##C^RW?x_h?b8!5 zz=%i9RhILG#;m7&bl*Y3%5nal=>DaH13Ji_fH{UOrF;st&v+!-Io&4>TGFF z+5C4&bb11IraZh}Mny#AuoP%~fxKrte_WGw*$X%+wn2Zrh%}0&aS{1yl0(p5nURfv zUu3q&zII|v^Q2QIM~Bv3ssPVfaGe{YKFoJiPBD`n=TnL@nTBI*;0MRD zIKoHdDYY&tXd^oHT&9L+G7+$yPZX=3I@Yky&~7bll&0Z+JPadDW1vbKVo%>0_aa*- z^!;-(DCr}X{unr~{I8X9*hy0Zo3wUuZloE#H;e+@b$=$un5`snKTj#`x~bESGrkFM z9Uh`wWAZu5V~X9%Mr}y?EZ}wOQn&~ovp})mXGc&1R?}$Y7xI~QZfxLNe+1|!w}pH_ zp2tH=IZD1`348nz@Vi16af}Bhd90QeWnTZ`kAM<|-aqByx{-RPym}e}lq?rJr6@0@ z@#qfnY2qd?v&EkbxLA^=_U$AX;b5AlY4dr}DBv4@okmP%#QEAI3?CDYI$u;y)yu__09n7>YV^YsYf>bfzdrsuK^_T zKn_3-GfJ5O@`fw+bI5NzWgPp~C(3^>Vk|H&=VeV|NznSB2ZDpXa`O)$Cq))i8|@Np zz1bt4!FGK-$L-xxZ*qKCGQ`?K?CRCI+%X?QjuYL+G#@ON{o+9!>%Ao&0~O9$F8IhK zaFf#-L){ufv3?CD2-^igo|^H}+0G&>@>%KK;dUG?8vr!8!n4p=m8+etdxIxRf5xB0 z1XE~{CgaR$JvDAvCNWhH_<5|su!2xyL@8YQQB$S@kjw+>DwwCBAap0fcRoOYInF5e z=XyJu=qx2_l&N=`O)7verZ~Sqjgo$sAI8@bt%9vUDqc{$02ytL3oL|^aq2->qNX6U zXhm61%0XyCh*IzE4nP~BPwVNks83-E%zMF?z^ZTZ)pCED9@u87GN#NuK#NK!J4!kp z2uoF4c)kzJ2&u<_u0F41M-xKo0M$U+nMcizVFUqbb@RwbqD1stNkmg*m4|oJj-Hyb zRP|KUD?n2@7pO(GS{2M{<#s=xw0a=Ly+GY^=DEDxDr*z5$&@(;(yIsZOb60ViRZ>c zN6JCiEy-pS>wPc0*e=P&mHr&fZsc6BKKL82V*$L0EK19~>lCFY)oxjib0(UI6NHJX z+6-^w*mj2r%SdlA?13DWAMs9xW-qiNJpe@74;gQb3O{@ELWF&hKJvGrvvOb7lX=1B zfuPt<&VLmdl9ea~6`-eZNQ&S9AR0kj07M};0suL#zsQ+z4Pf(vBE!23U`B8X5T1xz zt^vXbid=L8U`1#;`eXy)SP&7BN6yrDys)aNUzS0q03ZW0(|N;ImuZRhveP8JeY!os iF<`~}?%4W&O8x+gPGi>9g%{rd0000X-no;UfSzp5ea!sdIp;F>&II`1%?Wcc zBS^wQ)+x4toNc_oEJ<>XBU~jdALkU^HpTUl@|}FkY8#V`{uOI&iSgD&U$TQX_lpFL z9uKigx9_8%8=J(VpJ0@E-5d~>zr!dY2T;BAO7da=^`jR9@Rk<=@RJ9B>w$C&V##ByfECqU8FV|J%rl^#Bm*8X`u_^`684%g zQ~iM3v7vRrctJ+=xtP{^*N{RAqwcOjwi{lomvP#%1P_!y<}SmaX$CZkRrC%XDgQja z=z-&m1}uTCrIfdT%es3rx&vmw){a0QhsTlE1BU`;z;+RCfG&3qPxZiFp$q`WutxdM zb@vW2fYsQi{8`;?^r8~F1kN&TkqrFA3*~Rs-CspA006hJsQd%E`@K*G<}s}NIC}KJ zv=G2uRJQK-)<9gs-bRVFv7=Ag@+gHEUZdfFFl}RRf z$-Nim%(r7@ebxYV?6heHn{y(1iR-3QV<@7$Z}0bv=UQE0Y{)B!p*}@-T5L^H!0!k}{!(6mSZ~^pN0s!328=SL4Xb6BWT#^|-gr);5 zhadppkKnStrUCdN2mt`xS@|JnNE*N^3xWXk5kvuM3vo^wpccVpJ>l;j2B9eQmkm(6 z7D$rgV)ErIWGm!n*eMDCu!Hx?U)b`TWWx47;r_Z^hwT6|&Nt!c|0(+mJY6I=+3$pf P00000NkvXXu0mjfY;kTe literal 0 HcmV?d00001 diff --git a/app/examples/Multimedia/MediaPlayer/volume-2.png b/app/examples/Multimedia/MediaPlayer/volume-2.png new file mode 100644 index 0000000000000000000000000000000000000000..3fd2482db747bd838eaf51d23c7b59c19dc35d64 GIT binary patch literal 1052 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 literal 0 HcmV?d00001 diff --git a/app/examples/Multimedia/MoviePlayer/.directory b/app/examples/Multimedia/MoviePlayer/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/app/examples/Multimedia/MoviePlayer/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/app/examples/Multimedia/MoviePlayer/.icon.png b/app/examples/Multimedia/MoviePlayer/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c308b41be2fb91db340ecbfb89035b67961777d4 GIT binary patch literal 4342 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 z, 2007-2010. +# +# +msgid "" +msgstr "" +"Project-Id-Version: MoviePlayer\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2010-12-17 01:12+0100\n" +"Last-Translator: Jordi Sayol \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: FMoviePlayer.form:20 +msgid "

    Gambas Movie Player

    \n\n

    This example is based on the MPlayer movie player and was made by Benoît Minisini

    " +msgstr "

    Reproductor de peŀlícules del Gambas

    \n\n

    Aquest exemple està basat en el reproductor de peŀlícules MPlayer i ha estat fer per en Benoît Minisini

    " + +#: FMoviePlayer.form:15 +msgid "Movie player" +msgstr "Reproductor de peŀlícules" + +#: .project:1 +msgid "Movie player example" +msgstr "Exemple de reproductor de peŀlícules" + diff --git a/app/examples/Multimedia/MoviePlayer/.lang/cs.po b/app/examples/Multimedia/MoviePlayer/.lang/cs.po new file mode 100644 index 00000000..f7cb6247 --- /dev/null +++ b/app/examples/Multimedia/MoviePlayer/.lang/cs.po @@ -0,0 +1,30 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Movie player example" +msgstr "Příklad přehravače videa" + +#: FMoviePlayer.form:15 +msgid "Movie player" +msgstr "Přehravač videa" + +#: FMoviePlayer.form:20 +msgid "" +"

    Gambas Movie Player

    \n" +"\n" +"

    This example is based on the MPlayer movie player and was made by Benoît Minisini

    " +msgstr "" +"

    Gambas přehravač filmů

    \n" +"\n" +"

    Tento příklad je založený na přehravači filmů MPlayer a byl vyvtořen Benoît Minisini

    " diff --git a/app/examples/Multimedia/MoviePlayer/.lang/es.po b/app/examples/Multimedia/MoviePlayer/.lang/es.po new file mode 100644 index 00000000..a156ddfc --- /dev/null +++ b/app/examples/Multimedia/MoviePlayer/.lang/es.po @@ -0,0 +1,27 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: FMoviePlayer.class:172 +msgid "Movie player" +msgstr "Movie player" + +#: FMoviePlayer.class:177 +msgid "" +"

    Gambas Movie Player

    \n" +"\n" +"

    This example is based on the MPlayer movie player and was made by Benoît " +"Minisini

    " +msgstr "" +"

    Gambas Movie Player

    \n" +"\n" +"

    Este ejemplo está basado en el MPlayer movie player y fue echo por Benoît " +"Minisini

    " diff --git a/app/examples/Multimedia/MoviePlayer/.lang/ru.po b/app/examples/Multimedia/MoviePlayer/.lang/ru.po new file mode 100644 index 00000000..8b455b77 --- /dev/null +++ b/app/examples/Multimedia/MoviePlayer/.lang/ru.po @@ -0,0 +1,52 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-28 09:00+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Multimedia/MoviePlayer/.project:20 +msgid "Movie player example" +msgstr "Пример киноплеера" + +#: app/examples/Multimedia/MoviePlayer/.project:21 +msgid "Movie player based on the MPlayer" +msgstr "Киноплеер, основанный на MPlayer" + +#: app/examples/Multimedia/MoviePlayer/.src/FMoviePlayer.class:54 +msgid "pause\n" +msgstr "пауза\n" + +#: app/examples/Multimedia/MoviePlayer/.src/FMoviePlayer.form:5 +msgid "Movie player" +msgstr "Киноплеер" + +#: app/examples/Multimedia/MoviePlayer/.src/FMoviePlayer.form:9 +msgid "" +"

    Gambas Movie Player

    \n" +"\n" +"

    This example is based on the MPlayer movie player and was made by Benoît Minisini

    " +msgstr "" +"

    Киноплеер Gambas

    \n" +"\n" +"

    Этот пример основан на киноплеере MPlayer и сделан Бенуа Минисини

    " + diff --git a/app/examples/Multimedia/MoviePlayer/.project b/app/examples/Multimedia/MoviePlayer/.project new file mode 100644 index 00000000..a2884b0f --- /dev/null +++ b/app/examples/Multimedia/MoviePlayer/.project @@ -0,0 +1,19 @@ +# Gambas Project File 3.0 +Title=Movie player example +Description="Movie player based on the MPlayer" +Startup=FMoviePlayer +Icon=video.png +Version=3.11.90 +VersionFile=1 +Component=gb.image +Component=gb.gui +Component=gb.form +Environment="GB_GUI=gb.gtk3" +TabSize=2 +Translate=1 +Language=fr +Maintainer=benoit +Vendor=Princeton +Address=benoit@localhost +License=General Public Licence +Packager=1 diff --git a/app/examples/Multimedia/MoviePlayer/.src/FMoviePlayer.class b/app/examples/Multimedia/MoviePlayer/.src/FMoviePlayer.class new file mode 100644 index 00000000..582bce0d --- /dev/null +++ b/app/examples/Multimedia/MoviePlayer/.src/FMoviePlayer.class @@ -0,0 +1,136 @@ +' Gambas class file + +Private $hProcess As Process +Private $bQuit As Boolean +Private $sPath As String +Private $bShow As Boolean + +Public Sub Form_Resize() + + embPlayer.Move(8, 8, Me.ClientW - 16, Me.ClientH - panButton.H - 8) + panButton.Move(0, Me.CLientH - panButton.H, Me.CLientW) + txtAbout.Move(16, 16, embPlayer.W - 16, embPlayer.H - 16) + +End + +Public Sub btnPlay_Click() + + If $hProcess Then + Print #$hProcess, " "; + btnPlay.Enabled = False + btnPause.Enabled = True + 'PRINT "CONTINUE" + Return + Endif + + txtAbout.Visible = False + + With embPlayer + Form_Resize + .Show + .Enabled = False + ' '.Mouse = Mouse.Default + ' Form_Resize + ' '.Enabled = FALSE + End With + + $bShow = True + + $hProcess = Exec ["mplayer", "-wid", CStr(embPlayer.Handle), Conv$($sPath, Desktop.Charset, System.Charset)] For Input Output As "Process" + + btnStop.Enabled = True + btnPlay.Enabled = False + btnPause.Enabled = True + + 'embPlayer.Hide + 'timShow.Enabled = True + +End + +Public Sub btnPause_Click() + + If Not $hProcess Then Return + Print #$hProcess, " "; + '$hProcess.Send(" ") '("pause\n") + btnPlay.Enabled = True + btnPause.Enabled = False + 'PRINT "PAUSE" + +End + +Public Sub btnStop_Click() + + If Not $hProcess Then Return + If $bQuit Then + $hProcess.Kill + Else + Print #$hProcess, "q"; + $bQuit = True + Endif + +End + +Public Sub Process_Read() + + Dim sData As String + + sData = Read #Last, -255 + Print sData; + +End + + +Public Sub Process_Kill() + + $hProcess = Null + timShow.Enabled = False + $bQuit = False + $bShow = False + btnPause.Enabled = False + btnPlay.Enabled = True + btnStop.Enabled = False + embPlayer.Hide + txtAbout.Show + 'PRINT "STOP" + +End + + +Private Sub StopMovie() + + If Not $hProcess Then Return + + $hProcess.Kill + 'While $hProcess + ' Wait + 'Wend + +End + +Public Sub Form_Close() + + StopMovie + +End + + +Public Sub btnOpen_Click() + + Dialog.Path = $sPath + If Dialog.OpenFile() Then Return + $sPath = Dialog.Path + + StopMovie + btnPlay.Enabled = True + btnPlay_Click + +End + +Public Sub timShow_Timer() + + embPlayer.Resize(1, 1) + embPlayer.Show + Form_Resize + timShow.Enabled = False + +End diff --git a/app/examples/Multimedia/MoviePlayer/.src/FMoviePlayer.form b/app/examples/Multimedia/MoviePlayer/.src/FMoviePlayer.form new file mode 100644 index 00000000..40f5631d --- /dev/null +++ b/app/examples/Multimedia/MoviePlayer/.src/FMoviePlayer.form @@ -0,0 +1,42 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(33.1429,15,51,45) + Text = ("Movie player") + Icon = Picture["video.png"] + { txtAbout TextLabel + MoveScaled(2,1,46,20) + Text = ("

    Gambas Movie Player

    \n\n

    This example is based on the MPlayer movie player and was made by Benoît Minisini

    ") + } + { panButton Panel + MoveScaled(2,35,46,6) + { btnPlay Button + MoveScaled(1,1,4,4) + Enabled = False + Picture = Picture["icon:/small/play"] + } + { btnPause Button + MoveScaled(6,1,4,4) + Enabled = False + Picture = Picture["icon:/small/pause"] + } + { btnStop Button + MoveScaled(11,1,4,4) + Enabled = False + Picture = Picture["icon:/small/stop"] + } + { btnOpen Button + MoveScaled(16,1,4,4) + Picture = Picture["icon:/small/open"] + } + } + { timShow #Timer + #MoveScaled(32,17) + Delay = 500 + } + { embPlayer Embedder + MoveScaled(7,20,23,13) + Visible = False + Background = &H000000& + } +} diff --git a/app/examples/Multimedia/MoviePlayer/video.png b/app/examples/Multimedia/MoviePlayer/video.png new file mode 100644 index 0000000000000000000000000000000000000000..687755442f5c765a8a93804555ac3c833994c690 GIT binary patch literal 5244 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 literal 0 HcmV?d00001 diff --git a/app/examples/Multimedia/MusicPlayer/.icon/32.png b/app/examples/Multimedia/MusicPlayer/.icon/32.png new file mode 100644 index 0000000000000000000000000000000000000000..66d2fcb0726bcd0d1237048f1dcd26019d10980c GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv(Ey(iS0D`n|Nn#V|NjRL9B620 z*t+I*1W=H%B*-tA!Qt7BG$3cCr;B5V#`)Nb2YH(fcvvq~F#C9(*OdzsawOGXgZ_rKn`cYgw~BxF|uuv(h4uNCbF(5D4!7I z#S$vQe%{%akN-yKVX?MVr&lz;l{djBF0xe)K3GxeOXgJ_-;6Ov4MUMy2$^uUp z#}JR>Q>R`mYgXWCn|(`nL(}Z79@}5O`ECESiN*W8rcm*Y4@&cEo;-i?FhKV})%oE6 zh3XAExEVsc6ghTFH%z|A%#ieAI^z<#-BaBpKP>zjxpMP0^#h9=PQ>d=i=0iLDwyhi zK-%H(`9A@S_cj-Ho|`-CLc~QwiHrq*w>JM2 z3twmChca#`*FI3`xFf7}PifpU~>F| zc&!Y3xQyUE8&%O?b+vpVhr7J=*4KT0<(@DnCMGFiMuu;F-!z_xu6uH3D;YjpoZ~St z=5FZB;&7, 2007-2010. +# +# +msgid "" +msgstr "" +"Project-Id-Version: MusicPlayer\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2010-12-17 01:12+0100\n" +"Last-Translator: Jordi Sayol \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: FSoundPlayer.form:26 +msgid "Choose a music file..." +msgstr "Trieu un fitxer de música..." + +#: .project:1 FSoundPlayer.form:18 +msgid "Gambas Music Player" +msgstr "Reproductor de música del Gambas" + +#: FSoundPlayer.form:59 +msgid "Open..." +msgstr "Obre..." + diff --git a/app/examples/Multimedia/MusicPlayer/.lang/cs.po b/app/examples/Multimedia/MusicPlayer/.lang/cs.po new file mode 100644 index 00000000..c11a030f --- /dev/null +++ b/app/examples/Multimedia/MusicPlayer/.lang/cs.po @@ -0,0 +1,24 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 FSoundPlayer.form:18 +msgid "Gambas Music Player" +msgstr "Hudební přehrávač Gambas" + +#: FSoundPlayer.form:26 +msgid "Choose a music file..." +msgstr "Vyber hudební soubor..." + +#: FSoundPlayer.form:59 +msgid "Open..." +msgstr "Otevřít..." diff --git a/app/examples/Multimedia/MusicPlayer/.lang/es.po b/app/examples/Multimedia/MusicPlayer/.lang/es.po new file mode 100644 index 00000000..5186acbb --- /dev/null +++ b/app/examples/Multimedia/MusicPlayer/.lang/es.po @@ -0,0 +1,24 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 FSoundPlayer.form:18 +msgid "Gambas Music Player" +msgstr "Gambas Music Player" + +#: FSoundPlayer.form:26 +msgid "Choose a music file..." +msgstr "Seleccione un archivo de música..." + +#: FSoundPlayer.form:59 +msgid "Open..." +msgstr "" diff --git a/app/examples/Multimedia/MusicPlayer/.lang/fr.po b/app/examples/Multimedia/MusicPlayer/.lang/fr.po new file mode 100644 index 00000000..bedef664 --- /dev/null +++ b/app/examples/Multimedia/MusicPlayer/.lang/fr.po @@ -0,0 +1,35 @@ +# #-#-#-#-# FSoundPlayer.pot (PACKAGE VERSION) #-#-#-#-# +# /home/benoit/gambas/2.0/src/examples/examples/Sound/MusicPlayer/FSoundPlayer.class +# Generated by Gambas compiler +# FIRST AUTHOR , YEAR. +# +# #-#-#-#-# #project.pot (PACKAGE VERSION) #-#-#-#-# +# /home/benoit/gambas/2.0/link/share/gambas2/examples/Sound/MusicPlayer/.project +# Generated by Gambas compiler +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: FSoundPlayer.form:26 +msgid "Choose a music file..." +msgstr "Choisissez un fichier de musique..." + +#: .project:1 FSoundPlayer.form:18 +msgid "Gambas Music Player" +msgstr "Lecteur de musique Gambas" + +#: FSoundPlayer.form:59 +msgid "Open..." +msgstr "Ouvrir..." + diff --git a/app/examples/Multimedia/MusicPlayer/.lang/ru.po b/app/examples/Multimedia/MusicPlayer/.lang/ru.po new file mode 100644 index 00000000..5dc72170 --- /dev/null +++ b/app/examples/Multimedia/MusicPlayer/.lang/ru.po @@ -0,0 +1,38 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Multimedia/MusicPlayer/.project:26 app/examples/Multimedia/MusicPlayer/.src/FSoundPlayer.form:5 +msgid "Gambas Music Player" +msgstr "Музыкальный проигрыватель Gambas" + +#: app/examples/Multimedia/MusicPlayer/.src/FSoundPlayer.form:12 +msgid "Choose a music file..." +msgstr "Выбрать музыкальный файл..." + +#: app/examples/Multimedia/MusicPlayer/.src/FSoundPlayer.form:40 +msgid "Open..." +msgstr "Открыть..." + diff --git a/app/examples/Multimedia/MusicPlayer/.project b/app/examples/Multimedia/MusicPlayer/.project new file mode 100644 index 00000000..430d9819 --- /dev/null +++ b/app/examples/Multimedia/MusicPlayer/.project @@ -0,0 +1,25 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.0.90 +Title=Gambas Music Player +Startup=FSoundPlayer +Icon=sound.png +Version=3.6.2 +VersionFile=1 +Component=gb.image +Component=gb.gui +Component=gb.form +Component=gb.sdl.sound +TabSize=2 +Translate=1 +Language=fr +ExecPath=/home/benoit/gambas/gambas.link/share/gambas/examples/Sound/MusicPlayer/MusicPlayer +Maintainer=fabien +Vendor=Princeton +Address=fabien@arcalis +License=General Public Licence +Systems=mandrake +Menus=Multimedia/Sound +Categories= +Groups=Sound +ExtraDependencies= +ExtraFiles= diff --git a/app/examples/Multimedia/MusicPlayer/.src/FSoundPlayer.class b/app/examples/Multimedia/MusicPlayer/.src/FSoundPlayer.class new file mode 100644 index 00000000..642a6be4 --- /dev/null +++ b/app/examples/Multimedia/MusicPlayer/.src/FSoundPlayer.class @@ -0,0 +1,145 @@ +' Gambas class file + +Static Private $bDoNotMove As Boolean +Private $iLength As Integer + +Private Sub GetMusicLength(sPath As String) As Integer + + Dim sOutput As String + Dim aScan As String[] + + Select Case LCase(File.Ext(sPath)) + + Case "mp3" 'mp3info -p "%S\n" + Exec ["mp3info", "-p", "%S", sPath] To sOutput + Return CInt(sOutput) + + Case "ogg", "flac" + Exec ["ogginfo", sPath] To sOutput + For Each sOutput In Split(sOutput, "\n") + sOutput = Trim(sOutput) + aScan = Scan(sOutput, "*: *m:*s") + If aScan.Count = 3 Then + Return CInt(CInt(aScan[1]) * 60 + CFloat(Replace(aScan[2], ",", ".")) + 0.5) + Endif + Next + + End Select + +Catch + +End + +Public Sub btnOpen_Click() + + If Dialog.OpenFile() Then Return + + lblTitle.Text = File.Name(Dialog.Path) + ' Approximation... + $iLength = GetMusicLength(Dialog.Path) + If $iLength = 0 Then $iLength = 600 + sldPos.MaxValue = $iLength + + Music.Load(Dialog.Path) + btnPlay_Click + +Catch + + Message.Error(Error.Text) + +End + +Public Sub btnPlay_Click() + + timMusic.Enabled = True + Music.Play + +End + +Public Sub btnPause_Click() + + Music.Pause + +End + +Public Sub btnStop_Click() + + Music.Stop + timMusic.Enabled = False + lblPos.Text = "" + sldPos.Value = 0 + +End + +Private Sub FormatTime(iPos As Integer) As String + + Dim iInd As Integer + Dim iVal As Integer + Dim sPos As String + + For iInd = 0 To 2 + + iVal = iPos Mod 60 + iPos = iPos \ 60 + If iInd Then + sPos = Format(iVal, "00") & ":" & sPos + Else + sPos = Format(iVal, "00") + Endif + + Next + + Return sPos + +End + + +Public Sub timMusic_Timer() + + Dim iPos As Integer + Dim sPos As String + + iPos = Music.Pos + + If Not $bDoNotMove Then + Object.Lock(sldPos) + If iPos > sldPos.MaxValue Then + sldPos.MaxValue = sldPos.MaxValue * 2 + Endif + sldPos.Value = iPos + Object.Unlock(sldPos) + Endif + + lblPos.Text = FormatTime(iPos) & " / " & FormatTime($iLength) + +End + +Public Sub sldPos_Change() + + Music.Pos = sldPos.Value + +End + +Public Sub sldPos_MouseDown() + + $bDoNotMove = True + +End + +Public Sub sldPos_MouseUp() + + $bDoNotMove = False + +End + +Public Sub sldVolume_Change() + + Music.Volume = sldVolume.Value / sldVolume.MaxValue + +End + +Public Sub Form_Open() + + Dialog.Path = User.Home + +End diff --git a/app/examples/Multimedia/MusicPlayer/.src/FSoundPlayer.form b/app/examples/Multimedia/MusicPlayer/.src/FSoundPlayer.form new file mode 100644 index 00000000..e8d6be34 --- /dev/null +++ b/app/examples/Multimedia/MusicPlayer/.src/FSoundPlayer.form @@ -0,0 +1,62 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(41.5714,35.1429,66,16) + Text = ("Gambas Music Player") + Icon = Picture["sound.png"] + Resizable = False + { lblTitle TextLabel + MoveScaled(1,1,59,5) + Font = Font["+2"] + Padding = 4 + Text = ("Choose a music file...") + Alignment = Align.Normal + Border = Border.Plain + } + { sldPos Slider + MoveScaled(1,7,59,4) + MaxValue = 3600 + Step = 2 + } + { timMusic #Timer + #MoveScaled(33,0) + } + { sldVolume Slider + MoveScaled(61,1,4,10) + MaxValue = 128 + PageStep = 8 + Value = 128 + } + { PictureBox1 PictureBox + MoveScaled(61,11,4,4) + Picture = Picture["icon:/small/volume"] + Alignment = Align.Center + } + { HBox1 HBox + MoveScaled(1,11,59,4) + { btnOpen ToolButton + MoveScaled(0,0,12,4) + AutoResize = True + Text = ("Open...") + Picture = Picture["icon:/16/open"] + } + { btnPlay ToolButton + MoveScaled(13,0,4,4) + Picture = Picture["icon:/16/play"] + } + { btnPause ToolButton + MoveScaled(17,0,4,4) + Picture = Picture["icon:/16/pause"] + } + { btnStop ToolButton + MoveScaled(21,0,4,4) + Picture = Picture["icon:/16/stop"] + } + { lblPos Label + MoveScaled(27,0,27,4) + Font = Font["14,Bold"] + Expand = True + Alignment = Align.Right + } + } +} diff --git a/app/examples/Multimedia/MusicPlayer/sound.png b/app/examples/Multimedia/MusicPlayer/sound.png new file mode 100644 index 0000000000000000000000000000000000000000..034a6cfa1adec8a9d80cec81c4f9f7e2ba7f29e7 GIT binary patch literal 3551 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, 2007-2010. +# +# +msgid "" +msgstr "" +"Project-Id-Version: MyWebCam\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2010-12-17 01:12+0100\n" +"Last-Translator: Jordi Sayol \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: .project:1 +msgid "Webcam example" +msgstr "Exemple de càmera web" + +#: Form1.class:40 +msgid "Unable to open video device" +msgstr "No es pot obrir el dispositiu de vídeo" + +#: Form1.class:45 +msgid "Stop" +msgstr "Atura" + +#: Form1.form:59 +msgid "Bright" +msgstr "Lluminositat" + +#: Form1.form:70 +msgid "Contrast" +msgstr "Contrast" + +#: Form1.form:87 +msgid "Whiteness" +msgstr "Blancor" + +#: Form1.form:92 +msgid "Hue" +msgstr "Matís" + +#: Form1.form:103 +msgid "Color" +msgstr "Color" + +#: Form1.form:115 +msgid "160x120" +msgstr "-" + +#: Form1.form:121 +msgid "320x240" +msgstr "-" + +#: Form1.form:128 +msgid "176x144" +msgstr "-" + +#: Form1.form:134 +msgid "352x288" +msgstr "-" + +#: Form1.form:140 +msgid "128x96" +msgstr "-" + +#: Form1.form:146 +msgid "640x480" +msgstr "-" + +#: Form1.form:156 +msgid "Tuner frequency:" +msgstr "Freqüència de sintonització:" + +#: Form1.form:162 +msgid "+" +msgstr "-" + +#: Form1.form:168 +msgid "-" +msgstr "-" + +#: Form1.form:174 +msgid "Device Information" +msgstr "Informació del dispositiu" + +#: Form1.form:180 +msgid "Take a shot" +msgstr "Fes una captura" + +#: Form1.form:190 +msgid "Device:" +msgstr "Dispositiu:" + +#: Form1.form:196 +msgid "/dev/video" +msgstr "-" + +#: Form1.form:201 +msgid "Capture" +msgstr "Captura" diff --git a/app/examples/Multimedia/MyWebCam/.lang/cs.po b/app/examples/Multimedia/MyWebCam/.lang/cs.po new file mode 100644 index 00000000..72aa7ce7 --- /dev/null +++ b/app/examples/Multimedia/MyWebCam/.lang/cs.po @@ -0,0 +1,112 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Webcam example" +msgstr "Příklad webkamery" + +#: Form1.class:36 +msgid "Unable to open video device" +msgstr "Nelze otevřít zařízení videa" + +#: Form1.class:41 +msgid "Stop" +msgstr "-" + +#: Form1.form:54 +msgid "Bright" +msgstr "Světlost" + +#: Form1.form:65 +msgid "Contrast" +msgstr "Kontrast" + +#: Form1.form:82 +msgid "Whiteness" +msgstr "Bělost" + +#: Form1.form:87 +msgid "Hue" +msgstr "Odstín" + +#: Form1.form:98 +msgid "Color" +msgstr "Barva" + +#: Form1.form:110 +msgid "1024x768" +msgstr "-" + +#: Form1.form:110 +msgid "128x96" +msgstr "-" + +#: Form1.form:110 +msgid "160x120" +msgstr "-" + +#: Form1.form:110 +msgid "176x144" +msgstr "-" + +#: Form1.form:110 +msgid "320x240" +msgstr "-" + +#: Form1.form:110 +msgid "352x288" +msgstr "-" + +#: Form1.form:110 +msgid "640x480" +msgstr "-" + +#: Form1.form:111 +msgid "ComboBox1" +msgstr "-" + +#: Form1.form:116 +msgid "Size" +msgstr "Velikost" + +#: Form1.form:126 +msgid "Tuner frequency:" +msgstr "Ladit frekvenci:" + +#: Form1.form:132 +msgid "+" +msgstr "-" + +#: Form1.form:138 +msgid "-" +msgstr "-" + +#: Form1.form:144 +msgid "Device Information" +msgstr "Informace zažízení" + +#: Form1.form:150 +msgid "Take a shot" +msgstr "Udělej snímek" + +#: Form1.form:160 +msgid "Device:" +msgstr "Zařízení:" + +#: Form1.form:166 +msgid "/dev/video" +msgstr "-" + +#: Form1.form:171 +msgid "Capture" +msgstr "Získat" diff --git a/app/examples/Multimedia/MyWebCam/.lang/es.po b/app/examples/Multimedia/MyWebCam/.lang/es.po new file mode 100644 index 00000000..46ab59c7 --- /dev/null +++ b/app/examples/Multimedia/MyWebCam/.lang/es.po @@ -0,0 +1,95 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: Form1.class:14 +msgid "Capture" +msgstr "Captura" + +#: Form1.class:39 +msgid "Unable to open video device" +msgstr "Imposible abrir el dispositivo de video" + +#: Form1.class:44 +msgid "Stop" +msgstr "Detener" + +#: Form1.class:292 +msgid "Bright" +msgstr "Brillante" + +#: Form1.class:303 +msgid "Contrast" +msgstr "Contraste" + +#: Form1.class:320 +msgid "Whiteness" +msgstr "Claridad" + +#: Form1.class:325 +msgid "Hue" +msgstr "Tono" + +#: Form1.class:336 +msgid "Color" +msgstr "Color" + +#: Form1.class:348 +msgid "160x120" +msgstr "160x120" + +#: Form1.class:354 +msgid "320x240" +msgstr "320x240" + +#: Form1.class:361 +msgid "176x144" +msgstr "176x144" + +#: Form1.class:367 +msgid "352x288" +msgstr "352x288" + +#: Form1.class:373 +msgid "128x96" +msgstr "128x96" + +#: Form1.class:379 +msgid "640x480" +msgstr "640x480" + +#: Form1.class:389 +msgid "Tuner frequency:" +msgstr "Afinador de frecuencia:" + +#: Form1.class:395 +msgid "+" +msgstr "+" + +#: Form1.class:401 +msgid "-" +msgstr "-" + +#: Form1.class:407 +msgid "Device Information" +msgstr "Información del dispositivo" + +#: Form1.class:413 +msgid "Take a shot" +msgstr "Tomar una foto" + +#: Form1.class:423 +msgid "Device:" +msgstr "Dispositivo:" + +#: Form1.class:429 +msgid "/dev/video" +msgstr "/dev/video" diff --git a/app/examples/Multimedia/MyWebCam/.lang/ru.po b/app/examples/Multimedia/MyWebCam/.lang/ru.po new file mode 100644 index 00000000..b7467f9e --- /dev/null +++ b/app/examples/Multimedia/MyWebCam/.lang/ru.po @@ -0,0 +1,158 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-30 09:26+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Multimedia/MyWebCam/.project:20 +msgid "Webcam example" +msgstr "Пример веб-камеры" + +#: app/examples/Multimedia/MyWebCam/.src/Form1.class:29 app/examples/Multimedia/MyWebCam/.src/Form1.form:118 +msgid "Capture" +msgstr "Захватить" + +#: app/examples/Multimedia/MyWebCam/.src/Form1.class:36 +msgid "Unable to open video device" +msgstr "Невозможно открыть видеоустройство" + +#: app/examples/Multimedia/MyWebCam/.src/Form1.class:41 +msgid "Stop" +msgstr "Стоп" + +#: app/examples/Multimedia/MyWebCam/.src/Form1.class:62 app/examples/Multimedia/MyWebCam/.src/Form1.class:166 app/examples/Multimedia/MyWebCam/.src/Form1.class:175 app/examples/Multimedia/MyWebCam/.src/Form1.form:81 +msgid "Tuner frequency:" +msgstr "Частота тюнера:" + +#: app/examples/Multimedia/MyWebCam/.src/Form1.class:142 +msgid "fps" +msgstr "кадр/с" + +#: app/examples/Multimedia/MyWebCam/.src/Form1.class:183 +msgid "Device Bus:" +msgstr "Шина устройства:" + +#: app/examples/Multimedia/MyWebCam/.src/Form1.class:184 +msgid "Device Driver:" +msgstr "Драйвер устройства:" + +#: app/examples/Multimedia/MyWebCam/.src/Form1.class:184 +msgid "Version:" +msgstr "Версия:" + +#: app/examples/Multimedia/MyWebCam/.src/Form1.class:185 +msgid "Device Name:" +msgstr "Имя устройства:" + +#: app/examples/Multimedia/MyWebCam/.src/Form1.class:186 +msgid "Max. Resolution:" +msgstr "Макс. разрешение:" + +#: app/examples/Multimedia/MyWebCam/.src/Form1.class:187 +msgid "Min. Resolution:" +msgstr "Мин. разрешение:" + +#: app/examples/Multimedia/MyWebCam/.src/Form1.class:196 +msgid "Image saved as " +msgstr "Изображение сохранено как " + +#: app/examples/Multimedia/MyWebCam/.src/Form1.form:22 +msgid "Bright" +msgstr "Яркость" + +#: app/examples/Multimedia/MyWebCam/.src/Form1.form:31 +msgid "Contrast" +msgstr "Контраст" + +#: app/examples/Multimedia/MyWebCam/.src/Form1.form:45 +msgid "Whiteness" +msgstr "Белизна" + +#: app/examples/Multimedia/MyWebCam/.src/Form1.form:49 +msgid "Hue" +msgstr "Тон" + +#: app/examples/Multimedia/MyWebCam/.src/Form1.form:58 +msgid "Color" +msgstr "Цвет" + +#: app/examples/Multimedia/MyWebCam/.src/Form1.form:68 +msgid "128x96" +msgstr "128x96" + +#: app/examples/Multimedia/MyWebCam/.src/Form1.form:68 +msgid "160x120" +msgstr "160x120" + +#: app/examples/Multimedia/MyWebCam/.src/Form1.form:68 +msgid "176x144" +msgstr "176x144" + +#: app/examples/Multimedia/MyWebCam/.src/Form1.form:68 +msgid "320x240" +msgstr "320x240" + +#: app/examples/Multimedia/MyWebCam/.src/Form1.form:68 +msgid "352x288" +msgstr "352x288" + +#: app/examples/Multimedia/MyWebCam/.src/Form1.form:68 +msgid "640x480" +msgstr "640x480" + +#: app/examples/Multimedia/MyWebCam/.src/Form1.form:68 +msgid "1024x768" +msgstr "1024x768" + +#: app/examples/Multimedia/MyWebCam/.src/Form1.form:69 +msgid "ComboBox1" +msgstr "Комбинированный_список_1" + +#: app/examples/Multimedia/MyWebCam/.src/Form1.form:73 +msgid "Size" +msgstr "Размер" + +#: app/examples/Multimedia/MyWebCam/.src/Form1.form:86 +msgid "+" +msgstr "+" + +#: app/examples/Multimedia/MyWebCam/.src/Form1.form:91 +msgid "-" +msgstr "-" + +#: app/examples/Multimedia/MyWebCam/.src/Form1.form:96 +msgid "Device Information" +msgstr "Информация об устройстве" + +#: app/examples/Multimedia/MyWebCam/.src/Form1.form:101 +msgid "Take a shot" +msgstr "Сделать снимок" + +#: app/examples/Multimedia/MyWebCam/.src/Form1.form:109 +msgid "Device:" +msgstr "Устройство:" + +#: app/examples/Multimedia/MyWebCam/.src/Form1.form:114 +msgid "/dev/video0" +msgstr "/dev/video0" + diff --git a/app/examples/Multimedia/MyWebCam/.project b/app/examples/Multimedia/MyWebCam/.project new file mode 100644 index 00000000..831cb11a --- /dev/null +++ b/app/examples/Multimedia/MyWebCam/.project @@ -0,0 +1,19 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.5.90 +Title=Webcam example +Startup=Form1 +Icon=camera.png +Version=3.6.2 +VersionFile=1 +Component=gb.image +Component=gb.gui +Component=gb.v4l +TabSize=2 +Translate=1 +Language=fr +ExecPath=/home/dcampos/MyWebCam/MyWebCam +Maintainer=benoit +Vendor=Princeton +Address=benoit@localhost +License=General Public Licence +Packager=1 diff --git a/app/examples/Multimedia/MyWebCam/.src/Form1.class b/app/examples/Multimedia/MyWebCam/.src/Form1.class new file mode 100644 index 00000000..0948ec26 --- /dev/null +++ b/app/examples/Multimedia/MyWebCam/.src/Form1.class @@ -0,0 +1,203 @@ +' Gambas class file + +Private hWebcam As VideoDevice +Private OnSet As Boolean +Private Fps As Date +Private nFps As Integer + +Public Sub Button1_Click() + + + Dim num As Integer + Dim Buf As String + Dim sSize As String + + If hWebCam Then + Bright.Enabled = False + Contrast.Enabled = False + Hue.Enabled = False + Whiteness.Enabled = False + Colour.Enabled = False + cmbSize.Enabled = False + FreqUp.Enabled = False + FreqDown.Enabled = False + TxtDevice.Enabled = True + BtnTakeShot.Enabled = False + Button2.Enabled = False + hWebCam = Null + Tmr.Enabled = False + Button1.Caption = ("Capture") + Return + End If + + + Try hWebCam = New VideoDevice(TxtDevice.Text) + If Error Then + Message.Error(("Unable to open video device")) + Return + End If + hWebCam.Source = hWebCam.TV + hWebCam.PAL + + Button1.Caption = ("Stop") + BtnTakeShot.Enabled = True + Button2.Enabled = True + Bright.Enabled = True + Contrast.Enabled = True + Hue.Enabled = True + Whiteness.Enabled = True + Colour.Enabled = True + cmbSize.Enabled = True + sSize = CStr(hWebCam.Width) & "x" & CStr(hWebCam.Height) + If cmbSize.Find(sSize) < 0 Then cmbSize.Add(sSize) + Try cmbSize.Text = sSize + FreqUp.Enabled = True + FreqDown.Enabled = True + TxtDevice.Enabled = False + OnSet = True + Bright.Value = hWebcam.Bright + Contrast.Value = hWebcam.Contrast + Hue.Value = hWebCam.Hue + Whiteness.Value = hWebCam.Whiteness + Colour.Value = hWebCam.Color + LblFreq.Text = ("Tuner frequency:") & " " & hWebCam.Tuner.Frequency + + Wait 0.001 + OnSet = False + Tmr.Delay = 10 + Tmr.Enabled = True + Me.Caption = hWebCam.Name + Fps = Now() + nFps = 0 + + +End + + + + + +Public Sub Bright_Change() + + If OnSet Then Return + hWebCam.Bright = Bright.Value + +End + +Public Sub Contrast_Change() + + If OnSet Then Return + hWebCam.Contrast = Contrast.Value + +End + +Public Sub Whiteness_Change() + + If OnSet Then Return + hWebCam.Whiteness = Whiteness.Value + +End + +Public Sub Colour_Change() + + If OnSet Then Return + hWebcam.Color = Colour.Value + +End + +Public Sub Hue_Change() + + If OnSet Then Return + hWebCam.Hue = Hue.Value + +End + +Public Sub cmbSize_Click() + + Dim aSize As String[] + + aSize = Split(cmbSize.Text, "*x*") + hWebcam.Resize(CInt(aSize[0]), CInt(aSize[1])) + +End + + +Public Sub Tmr_Timer() + + Dim T1 As Date + Dim sBuf As String + Dim hPict As Picture + + Tmr.Enabled = False + + 'Try PictureBox1.Picture = hWebCam.Picture + Draw.Begin(dwgVideo) + hPict = hWebCam.Image.Picture + Draw.Picture(hPict, (dwgVideo.W - hPict.W) \ 2, (dwgVideo.H - hPict.H) \ 2) + Draw.End + + If Not Error Then + nFps = nFps + 1 + T1 = Now() - Fps + If Second(T1) >= 1 Then + Me.Caption = hWebCam.Name & " (" & nFps & " " & ("fps") & ")" + Fps = Now() + nFps = 0 + End If + End If + Tmr.Enabled = True + +End + + +Public Sub Form_Close() + + Tmr.Enabled = False + hWebCam = Null + +End + + + + + +Public Sub FreqUP_Click() + + hWebCam.Tuner.Frequency = hWebCam.Tuner.Frequency + 5 + LblFreq.Text = ("Tuner frequency:") & " " & hWebCam.Tuner.Frequency + +End + + + +Public Sub FreqDown_Click() + + hWebCam.Tuner.Frequency = hWebCam.Tuner.Frequency - 5 + LblFreq.Text = ("Tuner frequency:") & " " & hWebCam.Tuner.Frequency + +End + +Public Sub Button2_Click() + + Dim sCad As String + + sCad = ("Device Bus:") & " " & hWebCam.Bus & "\n" + sCad = sCad & ("Device Driver:") & " " & hWebCam.Driver & " " & ("Version:") & " " & hWebCam.Version & "\n" + sCad = sCad & ("Device Name:") & " " & hWebCam.Name & "\n" + sCad = sCad & ("Max. Resolution:") & " " & hWebCam.MaxWidth & "x" & hWebCam.MaxHeight & "\n" + sCad = sCad & ("Min. Resolution:") & " " & hWebCam.MinWidth & "x" & hWebCam.MinHeight & "\n" + + Message.Info(sCad) + +End + +Public Sub BtnTakeShot_Click() + + Try hWebCam.Save(User.Home & "/webcam_shot.png") + If Not Error Then Message.Info(("Image saved as ") & User.Home & "/webcam_shot.png") +End + +Public Sub Panel2_MouseDown() + + + +End diff --git a/app/examples/Multimedia/MyWebCam/.src/Form1.form b/app/examples/Multimedia/MyWebCam/.src/Form1.form new file mode 100644 index 00000000..7b6cc9df --- /dev/null +++ b/app/examples/Multimedia/MyWebCam/.src/Form1.form @@ -0,0 +1,122 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(38,2.4286,76,90) + Resizable = False + { dwgVideo DrawingArea + MoveScaled(0,0,75,51) + Background = &H000000& + Cached = True + } + { Tmr #Timer + #MoveScaled(1.1429,20.5714) + Delay = 10 + } + { Panel2 Panel + MoveScaled(0,52,75,37) + { Panel7 Panel + MoveScaled(1,0,74,15) + Border = Border.Raised + { Label1 Label + MoveScaled(2,1,10,3) + Text = ("Bright") + } + { Bright Slider + MoveScaled(13,1,25,3) + Enabled = False + MaxValue = 65535 + } + { Label2 Label + MoveScaled(2,5,9,3) + Text = ("Contrast") + } + { Contrast Slider + MoveScaled(13,5,25,3) + Enabled = False + MaxValue = 65535 + } + { Whiteness Slider + MoveScaled(13,9,25,3) + Enabled = False + MaxValue = 65535 + } + { Label3 Label + MoveScaled(2,9,11,3) + Text = ("Whiteness") + } + { Label5 Label + MoveScaled(38,1,9,4) + Text = ("Hue") + } + { Hue Slider + MoveScaled(47,1,25,3) + Enabled = False + MaxValue = 65535 + } + { Label4 Label + MoveScaled(38,5,8,4) + Text = ("Color") + } + { Colour Slider + MoveScaled(47,5,25,3) + Enabled = False + MaxValue = 65535 + } + { cmbSize ComboBox + MoveScaled(47,9,25,4) + ReadOnly = True + List = [("128x96"), ("160x120"), ("176x144"), ("320x240"), ("352x288"), ("640x480"), ("1024x768")] + Text = ("ComboBox1") + } + { Label7 Label + MoveScaled(38,9,8,4) + Text = ("Size") + } + } + { Panel3 Panel + MoveScaled(1,16,74,13) + Border = Border.Raised + { LblFreq Label + MoveScaled(1.1429,1.1429,36,4) + Text = ("Tuner frequency:") + } + { FreqUP Button + MoveScaled(1.1429,5.1429,6.4286,5.1429) + Enabled = False + Text = ("+") + } + { FreqDown Button + MoveScaled(9.1429,5.1429,6.4286,5.1429) + Enabled = False + Text = ("-") + } + { Button2 Button + MoveScaled(44,7,29.1429,5.1429) + Enabled = False + Text = ("Device Information") + } + { BtnTakeShot Button + MoveScaled(44,1,29.1429,5.1429) + Enabled = False + Text = ("Take a shot") + } + } + { Panel1 Panel + MoveScaled(1,30,74,7) + Border = Border.Raised + { Label6 Label + MoveScaled(1.1429,1.1429,12,4) + Text = ("Device:") + } + { TxtDevice TextBox + MoveScaled(14,1,29,5) + Expand = True + Text = ("/dev/video0") + } + { Button1 Button + MoveScaled(44,1,29,5) + Text = ("Capture") + } + } + } +} diff --git a/app/examples/Multimedia/MyWebCam/camera.png b/app/examples/Multimedia/MyWebCam/camera.png new file mode 100644 index 0000000000000000000000000000000000000000..84b228200af8f4e1cc179f2cb6d2ae75e404cf5c GIT binary patch literal 5363 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 literal 0 HcmV?d00001 diff --git a/app/examples/Multimedia/WaveGenerator/.directory b/app/examples/Multimedia/WaveGenerator/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/app/examples/Multimedia/WaveGenerator/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/app/examples/Multimedia/WaveGenerator/.icon.png b/app/examples/Multimedia/WaveGenerator/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a778a55df6f9b359f982fb7cfa071d0720a555bc GIT binary patch literal 4098 zcmV+d5dH6oP)snbDhh-TQ|QOTremC2Z_(RaecM z?$^`b@B96J{p)@`g7Xa78(+g{4ccJ$*3z?W)3o}N=bF&zAm`R?03`X{l;kHM<1(h* zr**DLoeE}sW*b@yln{L3x;*aQSVY6IFsr{A#Fcpo(e|AHWZv`_5Ej~r5<2uWp_<>E z-vSie@dny}(Qy5x8Qk~TA{@)ZlT}cZ;wQ;xF;uXgX!}mGH@=E-3>iso!eK=;=PEc~ z1t`4hb&OCL4ahD%lS3dyKbAAah=Sy#63?%y9e0g0i|FkZLs!n+5E$AMEm~*`Cu|OAf zhw8~q7CiO6#gxwS^Ml7**z)&5P#*lkOH_H!T!4EwcW*L6+-oV5cZ%bWglsC~l=IaG zZ^@`S9pZC0?EoQ>0zQ3t2H*U|EP9RNmwTbPZ`j;N(c2TEdT#@<@BrWWR6e&~lfzH{ z7~SQv z#(*(~s}?5n{ZGvzDcQrzO>n3aqI#UV;TQ+^1!!$N#>S6ka`%RLl-F9Ue;5Wj9b(1< zXb=Kn1WLOxM&io3mgvz}PG0~eb)KU+ZLBOLX;*{TI+X}zU*8GRh0(Ae-^ceqna7f1 zKYwe5clUuk?uk1N)KqtH<(s5;o5a>1Z0=h7&?FHS+_MLx4e9YNzH?&^*RM?G-A;J?0EA-0 zghtWY($DUy7JSm-M|aHT(y|mD*#^&7PHgA)dcX(-7RDGX2aGnLT?kM5`;J$f=*xfI z(rM;rpP2xo0v_oQoQV~E5YQUic6k2b+tWWix$fi^pwC+SO5&pG%eu6hLeS~_X=?T{c7IuMPflJ=hNdQZP8~Gkco`9qXO?@IXbQJs}@(DRDsx5Oqv& z{I%AOv7(L$c`Y@8un?!$@%aKdX#;R5sza8NGOVQZPu1{3ftq|RW!O?mg_Kg0D$ey# zKOju9Y^8L_lEW4-p+bt8n*p>Fqp|ia`Wg?iZ0(oOP7JBe(LRivsDP9*Y`LV0Sd%P3 z%#Z+DJM1if5>ryf+_KAPYpkNP^$<(0`0TmiZzc-hk~(53ONN!4B)|;h09rfj*|`}} zwvcGeKKf(|0~v|Lc@;{iY4?97Fq5LYvYfDG2^CWBar)_}!GZcp`cvZ(F&op|KvRLH zr1T=pI~7PJutPztI6qRJO))0&w1f&-O3BD%3&2co9*o%$j`cR;DkuPBa9w#FeXU1W zmFl8l_N6GHI8yN<#Y@-XPs%)d{KZ58lyV}LR5Gk41qXA60_=J9agH6Sz%dY8aS2HY z$>^w!FEyP=Z6ybHHIY$p5j$S^DfOMz6s`CeQl7n}Lrii3sbttvQiLaafH{K@@Z67Y z<7=P4p3nU9akl>MH~jGT+puSsqT>8yxL`oUczeh5Sb;sb^0V=$c(If`t5fde1W!p3 zwk##XN=>ZMrx^l5!A_q3#RJ@%m&-GE-O1Lco}^$-8Q*;LIgSNGgwitcEnP##D&NRR zB+s>pJlss{o@RzLSiX3i!G46Y7;0-GHxi?C#bu~- zu;LsqfH4SV$#%=7Oox(k{0t%Vq+s##_TO^Ly5;<-TG11B(89(m3=&N^8bilosFIcZ z{QmFY%9)LrvlLHG5jqmae)}&Z%v+AYkkHo373()4r|I~{Xd>;^1ZpY>_H-g#ehQba zAvLG?eFQje>Bb;j=nhM2t4&&3O2OzRpwQ#SxAV0v+AnW!g`%aep~m|K}c> zkL*QAg|gg4he80X_}HCXzv(BqJie1zz?cBqAZ5&Ivy4ZyDS;TBB8)+dKA?u0Dhl&0 z-l`3-j|eV*BC%i>&OjeAR~+Sso0wnX!s~W17#gIzwV9u#%;gvR%UK~{OJX|h#v-e+ zhPAieGi~zChu-1o`)_8|4PW9@-+PMmytx2G?J!3wx3T@VKjwE2-NBvz_WKjwFQpi> zbfJxidPJK5c=**w>u~{$6^%I=F?)#ajswhFUd-lK%W3Wl5tp8e} z!OaC8c0}T-FMoy1H5&=_2a&IDp}-DPjpU|JY$B_mY}(`jUi#HNEV|~i%qm%a!g^yg z&;R^etiR)KJShe5sdrhbT?pX-Xl?lRnz&p6@L$`8YK0WuQ333zlhGgSMt8kK-bJhU zRb><5`U4;p(sJWU$zZVI5b^0*SfO4LBRw>PK_#Z)^7=>$_K}^E#l=gn#N|1)g9`75 zWG6ts6OZFgdf&F`x`}R+fu3|o!tGKWLWmfE(I))$Ydmu-03`_vi5EbRxPTzWu|ORi z?l{5&E)q&t5DRt_Jp3+3$H>epz(3GKzspT`Klt5>La&XbASpeUB^O^iBg6qrG)$oK z|M0E+!YQTB9qnC2g4Ouvt)1|_l!(#zZXgUJFGiFSkx}Om8lj{>x!fdV=HW_AWMJ3Z z4A~)s5O{Km$PRZSEsM6O#;M(np1Yi+*`*l22XAbE92Mix{&E&BzI;XmNK(Cs(rYobdPujL_-&@Qr$i}S%ZWY5eW3M| zU+g{#T`j!!^nq=*;o>;zGNMLYdFMW3y%7dh?(J3Qwf7HhUVTd$+-no9o|h$C}tNg zLaH<0_}KBvvy>EOVGj*qS%Rs$l2Q_A4dCnUp}$>IxODaLIyEf7hz}fh0jWe}bj#Ej zGd5K$S$qj^5@X}#3;A=vre;?;uDAs>?JcLfr=5D;N4WVYDm5GFaxvP6l7gz1PL`D| z=lSQJ;o@jFja9q2@#CK(F)in`1!z374-xGr8nsc%n)1DcREpM?0DixpV6T_i%f<;H z#rPHBaTl;gR)k6p2a3_p2}#K;$|>ThCx45z`(;wn)6qik!Yf;F64Q_?*RpcWI_Pb~ z7=bZnY(v#;DR#GX;#%+#20H_MoGII4G)+xS zy!6svi8^LNofKw_n)!lA06jRVj8mD$-MO;>L(S%vdiweGeFZIu*aboWa#F$P3N^I)xc&q5`?xQz8FY3$xxL0(ca z!8k8EYLnXD$kMVUM6caISM5Ib?B9W>>>`Ba0_`A_3wvKVOA1OzbVJ{BwpiR`Q4DW;_|Q5W!ALV_`nF=92&%K2X8mtM}5b;_&8|fRvc- zVb(mDOB#CT@ILV33Z;F5$#kLO8^ znrg8&d)^|FD&8cLF$D5 z#!%bPK!4qq*Qt z$Ow?aC?lj0LKweG55kBG^mX^t#$3tn&`?Z9BDNZyZ!bIrgb>QXczhm9_jUKyj_85_ z(x3iY^BeB?)H#kBJuG$M2>_skiP{6*wV(TF{#8K7m;k_fpcL={Zr*#K;(Uh#M1et| z8hB|`000k=2b2IgKnmdHJo{VS6wnM$dp*EW;0VwH42@d@qDDx27`6b(NlufWhcF`| z*drwj#5low@C$|TsR%N2g!4c1GM?mAmd;J)*>B9DqtE7n-!<{q$}U1JyXbu5L1Ke# z9~he(?)nJ_YJynqcr3RMw>O!xBDnhMl~_uUk>cg1D+*6|?~I&Q3b&La)N1xOS^WER z0k)KP(%sQUcg3Rw_dolA5g$e2tb7{U+Ogcpc;YkB(OxoA3_?Jh+d3(Em_d`zy6$m& z*|U+BA{?mX*emy;hx$Ko@}s!?_RVOOgxl?fNDYgNZL;zTx$mFXPkG;romXpn@$+Ym z?1_+>9*@Tw!f_&Oe(Vcu{Pi}{)2ILE>I)wK4}~r|wvXqTRR91007*qoM6N<$g5e(L A-T(jq literal 0 HcmV?d00001 diff --git a/app/examples/Multimedia/WaveGenerator/.lang/ru.po b/app/examples/Multimedia/WaveGenerator/.lang/ru.po new file mode 100644 index 00000000..18102b25 --- /dev/null +++ b/app/examples/Multimedia/WaveGenerator/.lang/ru.po @@ -0,0 +1,106 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Multimedia/WaveGenerator/.project:15 +msgid "WaveGenerator" +msgstr "Генератор волн" + +#: app/examples/Multimedia/WaveGenerator/.src/FMain.class:69 +msgid "Hz" +msgstr "Гц" + +#: app/examples/Multimedia/WaveGenerator/.src/FMain.form:5 +msgid "Wave generator" +msgstr "Генератор волн" + +#: app/examples/Multimedia/WaveGenerator/.src/FMain.form:14 +msgid "Frequency" +msgstr "Частота" + +#: app/examples/Multimedia/WaveGenerator/.src/FMain.form:26 +msgid "Volume" +msgstr "Громкость" + +#: app/examples/Multimedia/WaveGenerator/.src/FMain.form:45 +msgid "Sine" +msgstr "Синусусоида" + +#: app/examples/Multimedia/WaveGenerator/.src/FMain.form:45 +msgid "Square" +msgstr "Квадрат" + +#: app/examples/Multimedia/WaveGenerator/.src/FMain.form:45 +msgid "Saw" +msgstr "Пила" + +#: app/examples/Multimedia/WaveGenerator/.src/FMain.form:45 +msgid "Triangle" +msgstr "Треугольник" + +#: app/examples/Multimedia/WaveGenerator/.src/FMain.form:45 +msgid "Silence" +msgstr "Тишина" + +#: app/examples/Multimedia/WaveGenerator/.src/FMain.form:45 +msgid "White uniform noise" +msgstr "Белый однообразный шум" + +#: app/examples/Multimedia/WaveGenerator/.src/FMain.form:45 +msgid "Pink noise" +msgstr "Розовый шум" + +#: app/examples/Multimedia/WaveGenerator/.src/FMain.form:45 +msgid "Sine table" +msgstr "Таблица синусов" + +#: app/examples/Multimedia/WaveGenerator/.src/FMain.form:45 +msgid "Periodic ticks" +msgstr "Периодические тики" + +#: app/examples/Multimedia/WaveGenerator/.src/FMain.form:45 +msgid "White gaussian noise" +msgstr "Белый гауссов шум" + +#: app/examples/Multimedia/WaveGenerator/.src/FMain.form:45 +msgid "Red brownian noise" +msgstr "Красный броуновский шум" + +#: app/examples/Multimedia/WaveGenerator/.src/FMain.form:45 +msgid "Blue noise" +msgstr "Синий шум" + +#: app/examples/Multimedia/WaveGenerator/.src/FMain.form:45 +msgid "Violet noise" +msgstr "Фиолетовый шум" + +#: app/examples/Multimedia/WaveGenerator/.src/FMain.form:53 +msgid "440 Hz" +msgstr "440 Гц" + +#: app/examples/Multimedia/WaveGenerator/.src/FMain.form:58 +msgid "Play / Stop" +msgstr "Играть / Остановить" + diff --git a/app/examples/Multimedia/WaveGenerator/.project b/app/examples/Multimedia/WaveGenerator/.project new file mode 100644 index 00000000..6818e88c --- /dev/null +++ b/app/examples/Multimedia/WaveGenerator/.project @@ -0,0 +1,14 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.8.90 +Title=WaveGenerator +Startup=FMain +Icon=audio-headphones.png +Version=3.8.90 +VersionFile=1 +Component=gb.image +Component=gb.gui +Component=gb.form +Component=gb.media +TabSize=2 +Packager=1 +Translate=1 diff --git a/app/examples/Multimedia/WaveGenerator/.src/FMain.class b/app/examples/Multimedia/WaveGenerator/.src/FMain.class new file mode 100644 index 00000000..0336f048 --- /dev/null +++ b/app/examples/Multimedia/WaveGenerator/.src/FMain.class @@ -0,0 +1,102 @@ +' Gambas class file + +Private $bPlay As Boolean +Private $hAudio As MediaControl +Private $hConv As MediaControl +Private $hPlayer As MediaPipeline +Private $hOutput As MediaControl +Private $hFilter As MediaControl +Private $hEncoder As MediaControl + +Public Sub Form_Open() + + ' audiotestsrc is-live=1 ! + ' audio / x - raw, channels = 2, rate = 48000!flacenc!filesink + ' location = generated.flac + + $hPlayer = New MediaPipeline As "Pipeline" + + $hAudio = New MediaControl($hPlayer, "audiotestsrc") + $hAudio["is-live"] = True + + $hFilter = New MediaControl($hPlayer, "audio/x-raw,channels=2,rate=48000") + 'Print $hFilter["caps"] + + '$hEncoder = New MediaControl($hPlayer, "flacenc") + + + $hConv = New MediaControl($hPlayer, "audioconvert") + $hOutput = New MediaControl($hPlayer, "autoaudiosink") + ' + + '$hOutput = New MediaControl($hPlayer, "filesink") + '$hOutput["location"] = User.Home &/ "output.flac" + + '$hAudio.LinkTo($hConv) + '$hConv.LinkTo($hOutput) + + Media.Link($hAudio, $hFilter, $hConv, $hOutput) + + SetFreq(440) + +End + +Public Sub Form_Close() + + $hPlayer.Stop + +End + + +Public Sub btnPlay_Click() + + $bPlay = Not $bPlay + + If $bPlay Then + $hPlayer.Play + Else + $hPlayer.Pause + Endif + +End + +Private Sub SetFreq(fFreq As Float) + + $hAudio["freq"] = fFreq + Object.Lock(sldFrequency) + sldFrequency.Value = (Log(fFreq) - Log(20)) / (Log(20000) - Log(20)) * 1000 + Object.Unlock(sldFrequency) + lblFrequency.Text = Format(fFreq, "0.000") & " " & ("Hz") + +End + +Public Sub sldFrequency_Change() + + SetFreq(Exp(Log(20) + (Log(20000) - Log(20)) * sldFrequency.Value / 1000)) + +End + +Public Sub sldVolume_Change() + + $hAudio["volume"] = sldVolume.Value / 1000 + +End + +Public Sub cmbType_Click() + + $hAudio["wave"] = cmbType.Index + +End + +Public Sub Pipeline_State() + + Debug Last.State + +End + + +Public Sub Pipeline_End() + + Debug + +End diff --git a/app/examples/Multimedia/WaveGenerator/.src/FMain.form b/app/examples/Multimedia/WaveGenerator/.src/FMain.form new file mode 100644 index 00000000..ba04af4a --- /dev/null +++ b/app/examples/Multimedia/WaveGenerator/.src/FMain.form @@ -0,0 +1,61 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,72,20) + Text = ("Wave generator") + Icon = Picture["audio-headphones.png"] + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + { Panel1 HBox + MoveScaled(2,2,68,4) + { Label1 Label + MoveScaled(0,0,11,4) + Text = ("Frequency") + } + { sldFrequency Slider + MoveScaled(14,0,53,4) + Expand = True + MaxValue = 1000 + } + } + { Panel2 HBox + MoveScaled(2,7,68,4) + { Label2 Label + MoveScaled(0,0,11,4) + Text = ("Volume") + } + { sldVolume Slider + MoveScaled(14,0,53,4) + Expand = True + MaxValue = 1000 + Value = 800 + } + } + { Panel5 Panel + MoveScaled(31,12,13,1) + Expand = True + } + { Panel3 HBox + MoveScaled(2,14,68,4) + Spacing = True + { cmbType ComboBox + MoveScaled(0,0,27,4) + ReadOnly = True + List = [("Sine"), ("Square"), ("Saw"), ("Triangle"), ("Silence"), ("White uniform noise"), ("Pink noise"), ("Sine table"), ("Periodic ticks"), ("White gaussian noise"), ("Red brownian noise"), ("Blue noise"), ("Violet noise")] + } + { Panel4 Panel + MoveScaled(28,0,3,4) + Expand = True + } + { lblFrequency Label + MoveScaled(27,0,13,4) + Text = ("440 Hz") + Alignment = Align.Right + } + { btnPlay Button + MoveScaled(41,0,27,4) + Text = ("Play / Stop") + } + } +} diff --git a/app/examples/Multimedia/WaveGenerator/audio-headphones.png b/app/examples/Multimedia/WaveGenerator/audio-headphones.png new file mode 100644 index 0000000000000000000000000000000000000000..7d16771fa0e36a2a2e8b5b5957bf207f8d438d18 GIT binary patch literal 2578 zcmV+t3hniYP)mQn? z`C&-c_ejUN_?-fCl**V>)&V7R<{+4x>(e-|>FnxSe7>cHG=Q;K_9<{g6tky*a|Ema za4MBBzNzlYcDogNt2JnqulA#L+gBPu4A}5ZgHA~YFyJW$Jj=SP1lG?k#hM`A4Y99w z06Ks$00|%$z<2yXIBjx-T@s`(mlV3Pe$tUPK4TvTl z5~)1w2Gd_$y~zgvOdih4mTJXL4L%06BoyO=Z{6|I68}j6iUAh@WT*3vDgnkh0BXsS z;(uSsJlB;vdT8CcU30Fx{+^2$FCGd6gM|Qix|5G-`;_1CGgvhwY8XFHJ2oH=v2v9XaB78Tz7@WX3UYTNbRf%nX+swzF*Ne&_R z*|TS5Rn@!0+E*CvX;a&^>$TmvGF{&LGd7B4QQvLF3$z>SkZ z7r}~(ij7%WS%3Ka^Uu-H&@ic~si`B~$z6%&%$YNF-n@Bj1qB7rb^ZRAUV3Th>z9=) zR{{Wb?%a8}y1JS+Y}jxTfYXOGq&l_!pWc0GW4 z0FR|R*_gHgSXf?O-h9ig^Sy0tZJS+M*2Uc1+|b&!Yw5Y?o_qW5Wy{J8)B4n3;vf9Z zweidu`s~zh~&5zea z_w0R(w!iW+H8(d?X=&+<($Z1@KvQF5!>NW-lsGZzSwJe)DukE-05vr=SigS#rxPbm zM3yVd0n=bvrb-xoN4m2IaA)kBMIsT$>+!;I9GRV+jn%7HAFZjW0RW7jFky^kT77Qb zk^*pSCul^Cd;nTeQPCd@3JNB%*q$yC!4~!y^laKStS5;TlTt!T z2_d*9rNe}BE5hM0EX#rr0#U<&<2aB~QZnb60KkYwi3<+Sc~9XYkq9{FV2nZ6bpYtuDY*UuYi}b>)6mh;0V0BBSqKCI;M^i9CD8Z!A+rD&2Drr`I490IEXzV95`mO5o(lme zj*q`=5xj8WLQz{=8zUm*<>i5h5Q#)!Sr(b53DpfCE1C0506;`8(=@veS<52MISYrw z@&6$d3NZjn;^Qyt0HxHdU@!8}>QX&SU=hU5S5!9C7TMA9nuz71aqR}V}!+>R3&~+U`*gys!0svT7C=5k}Xfz7W zIa-=qux!&+6}XyRo_aNw_o@q>_CmChLGcG>HhDbLhGb!!U+)o)G{H6Q*IH zv$GRI2vGNnR+l9|5P+us0E7@dYXO1!kIy&&rfI-5<7-wgfCQZz48T9pd!y3>z%UG0 zrUkm3K*j;EZJW5o$uNv$00_Xp1_SUB5?1**0M0ptBZ!oWy{MJ30F>i6j0+ASL^1#j z-9;V{z@PfyiUANpKspk!J40sx=a~S&5yI{+SaJXW@Y-Mi0N~z40C8i|k?~96jP8K$ zn;^TVbNc~!F!7Ip0K6B2AY&asoO3wRfszX7eyuH20Z7NTVaKX3grEcf4+Gde8~||$ zS)B97ZQEu-2uP{mNT)x5On6${69Z#R*|q~=+a!d5ZQIN+jAzk(?C!0DrOZ-F!ke9)jow#)pB~D_2*iM$N>u7ClE%f{S-^_YRNeKX8 z=Bycum)==&(B~Ul0bn~a>q+r60NZ^&-%|?;Z#k4ZA-5O+mMvSBIuAv+rQ=PwtJ9*Q o@5E~iqZ-wyMm4HYjVg`$FEg;6C=gT&f&c&j07*qoM6N<$f>E&KaR2}S literal 0 HcmV?d00001 diff --git a/app/examples/Multimedia/WebCam/.directory b/app/examples/Multimedia/WebCam/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/app/examples/Multimedia/WebCam/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/app/examples/Multimedia/WebCam/.icon.png b/app/examples/Multimedia/WebCam/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..97c27e7ffd7533ed15bbc52401313fe66e6169e2 GIT binary patch literal 4272 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 SuD5Cc0000, YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-31 05:33+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Multimedia/WebCam/.project:17 +msgid "V4L2 Compatible Webcam" +msgstr "V4L2-совместимая веб-камера" + +#: app/examples/Multimedia/WebCam/.project:18 app/examples/Multimedia/WebCam/.src/FMain.form:46 +msgid "Encryptec WebCam Viewer" +msgstr "Просмотрщик веб-камеры Encryptec" + +#: app/examples/Multimedia/WebCam/.src/FDevice.form:28 +msgid "devName" +msgstr "Имя_устройства" + +#: app/examples/Multimedia/WebCam/.src/FDevice.form:36 +msgid "currentTime" +msgstr "текущее время" + +#: app/examples/Multimedia/WebCam/.src/FDevice.form:56 +msgid "Picture Size" +msgstr "Разрешение" + +#: app/examples/Multimedia/WebCam/.src/FDevice.form:61 +msgid "160 x 120" +msgstr "160 x 120" + +#: app/examples/Multimedia/WebCam/.src/FDevice.form:61 app/examples/Multimedia/WebCam/.src/FDevice.form:62 +msgid "320 x 240" +msgstr "320 x 240" + +#: app/examples/Multimedia/WebCam/.src/FDevice.form:61 +msgid "640 x 480" +msgstr "640 x 480" + +#: app/examples/Multimedia/WebCam/.src/FDevice.form:69 +msgid "Brightness" +msgstr "Яркость" + +#: app/examples/Multimedia/WebCam/.src/FDevice.form:76 +msgid "Contrast" +msgstr "Контраст" + +#: app/examples/Multimedia/WebCam/.src/FDevice.form:83 +msgid "Colour" +msgstr "Цвет" + +#: app/examples/Multimedia/WebCam/.src/FDevice.form:90 +msgid "Hue" +msgstr "Тон" + +#: app/examples/Multimedia/WebCam/.src/FDevice.form:97 +msgid "Whiteness" +msgstr "Белизна" + +#: app/examples/Multimedia/WebCam/.src/FDevice.form:101 +msgid "&Hide" +msgstr "Скрыть" + +#: app/examples/Multimedia/WebCam/.src/FDevice.form:106 +msgid "&Close" +msgstr "Закрыть" + +#: app/examples/Multimedia/WebCam/.src/FDevice.form:111 +msgid "Refresh Rate" +msgstr "Част. обновл." + +#: app/examples/Multimedia/WebCam/.src/FDevice.form:121 +msgid "&Pause" +msgstr "Пауза" + +#: app/examples/Multimedia/WebCam/.src/FDevice.form:127 +msgid "&Play" +msgstr "Игра" + +#: app/examples/Multimedia/WebCam/.src/FDevice.form:132 +msgid "&Snap" +msgstr "Скрин" + +#: app/examples/Multimedia/WebCam/.src/FDevice.form:139 +msgid "0.00 fps" +msgstr "0.00 кадр/с" + +#: app/examples/Multimedia/WebCam/.src/FDevice.form:143 +msgid "&Reset" +msgstr "Сброс" + +#: app/examples/Multimedia/WebCam/.src/FMain.class:26 +msgid "Searching:" +msgstr "Поиск:" + +#: app/examples/Multimedia/WebCam/.src/FMain.class:46 +msgid "Found" +msgstr "Найдено" + +#: app/examples/Multimedia/WebCam/.src/FMain.class:46 +msgid "devices" +msgstr "устройств" + +#: app/examples/Multimedia/WebCam/.src/FMain.class:112 +msgid "Settings Saved!" +msgstr "Настройки сохранены!" + +#: app/examples/Multimedia/WebCam/.src/FMain.form:14 +msgid "WebCam Options" +msgstr "Параметры веб-камеры" + +#: app/examples/Multimedia/WebCam/.src/FMain.form:19 +msgid "&Scan for Devices" +msgstr "Сканирование устройств" + +#: app/examples/Multimedia/WebCam/.src/FMain.form:24 +msgid "Save Settings" +msgstr "Сохранить настройки" + +#: app/examples/Multimedia/WebCam/.src/FMain.form:29 +msgid "&Quit" +msgstr "Выход" + +#: app/examples/Multimedia/WebCam/.src/FMain.form:51 +msgid "(c) Encryptec Limited 2009" +msgstr "(c) Encryptec Limited 2009" + +#: app/examples/Multimedia/WebCam/.src/FMain.form:58 +msgid "Scanning for Devices " +msgstr "Сканирование устройств " + +#: app/examples/Multimedia/WebCam/.src/FDevice.class:14 app/examples/Multimedia/WebCam/.src/FDevice.class:106 app/examples/Multimedia/WebCam/.src/FDevice.class:118 +msgid "Camera_&1" +msgstr "Камера_&1" + +#: app/examples/Multimedia/WebCam/.src/FDevice.class:154 +msgid "fps" +msgstr "кадр/с" + +#: app/examples/Multimedia/WebCam/.src/FDevice.class:162 +msgid "Can't recover picture from Camera!" +msgstr "Не удаётся восстановить изображение с камеры!" + +#: app/examples/Multimedia/WebCam/.src/FDevice.class:248 +msgid "** Paused **" +msgstr "** Приостановлено **" + +#: app/examples/Multimedia/WebCam/.src/FDevice.class:264 +msgid "Saved as" +msgstr "Сохранено как" + +#: app/examples/Multimedia/WebCam/.src/FDevice.class:264 +msgid "Snapshot was not saved" +msgstr "Скриншот не был сохранён" + diff --git a/app/examples/Multimedia/WebCam/.project b/app/examples/Multimedia/WebCam/.project new file mode 100644 index 00000000..a08bddfa --- /dev/null +++ b/app/examples/Multimedia/WebCam/.project @@ -0,0 +1,17 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.8.90 +Title=V4L2 Compatible Webcam +Description="Encryptec WebCam Viewer" +Startup=FMain +Icon=camera.png +Version=3.8.90 +VersionFile=1 +Component=gb.image +Component=gb.gui +Component=gb.form +Component=gb.settings +Component=gb.v4l +Environment="GB_GUI=gb.gtk" +TabSize=2 +Packager=1 +Translate=1 diff --git a/app/examples/Multimedia/WebCam/.src/FDevice.class b/app/examples/Multimedia/WebCam/.src/FDevice.class new file mode 100644 index 00000000..4b56a94f --- /dev/null +++ b/app/examples/Multimedia/WebCam/.src/FDevice.class @@ -0,0 +1,304 @@ +' Gambas class file + +' +' This form / class is created for each webcam found on the system. +' +Private $device As VideoDevice +Private $date_format As String +Private $index As Integer +Private $fps As Integer +Private $fps_now As Date + +Public Sub Save() + + Dim key As String = Subst(("Camera_&1"), $index) + + Settings[key & "/top"] = Me.Top + Settings[key & "/left"] = Me.Left + Settings[key & "/refrate"] = refrate.Value + Settings[key & "/size"] = picture_size.Index + 1 + Settings[key & "/brightness"] = slider_bright.Value + Settings[key & "/contrast"] = slider_contrast.Value + Settings[key & "/color"] = slider_colour.Value + Settings[key & "/hue"] = slider_hue.Value + Settings[key & "/whiteness"] = slider_whiteness.Value + +End + +Public Sub _new(dev As VideoDevice, i As Integer) + + $index = i + $device = dev + $date_format = "ddd, d mmm hh:nn:ss" + $fps_now = Now() + $fps = 0 + + slider_bright.MinValue = $device.BrightMin + slider_bright.MaxValue = $device.BrightMax + slider_contrast.MinValue = $device.ContrastMin + slider_contrast.MaxValue = $device.ContrastMax + slider_colour.MinValue = $device.ColorMin + slider_colour.MaxValue = $device.ColorMax + slider_hue.MinValue = $device.HueMin + slider_hue.MaxValue = $device.HueMax + slider_whiteness.MinValue = $device.WhitenessMin + slider_whiteness.MaxValue = $device.WhitenessMax + +End + +Public Sub ResizeDevice() + + Dim $spacing As Integer + + $spacing = 2 + + pic.Width = $device.Width + pic.Height = $device.Height + + If pic.Width < 220 Then pic.Width = 220 + If pic.Height < 140 Then pic.Height = 140 + + title.Left = $spacing + title.top = $spacing + title.Width = pic.Width + + devName.Width = pic.Width - buttonSettings.Width - buttonSettings.Left - $spacing * 6 + currentTime.Width = devName.Width + + container.top = $spacing * 2 + container.left = $spacing * 2 + container.width = pic.Width + 4 + container.Height = pic.Height + $spacing * 3 + title.Height + + pic.Left = 2 + pic.Top = title.top + title.Height + $spacing + + devName.Text = $device.Card + currentTime.Text = Format(Now(), $date_format) + + outer.Left = 0 + outer.Top = 0 + outer.Width = container.Width + $spacing * 4 + outer.Height = container.Height + $spacing * 4 + + If tools.Visible Then + outer.Height = outer.Height + tools.Height + 2 + tools.Width = container.Width + tools.Left = $spacing * 2 + tools.Top = $spacing * 4 + pic.Top + pic.Height + picture_size.Width = tools.Width - picture_size.Left - $spacing * 4 + slider_bright.Width = tools.Width - slider_bright.Left - $spacing * 6 + slider_contrast.Width = tools.Width - slider_contrast.Left - $spacing * 6 + slider_colour.Width = tools.Width - slider_colour.Left - $spacing * 6 + slider_hue.Width = tools.Width - slider_hue.Left - $spacing * 6 + slider_whiteness.Width = tools.Width - slider_whiteness.left - $spacing * 6 + refrate.Width = tools.Width - refrate.Left - $spacing * 6 + + Endif + + Me.Width = outer.Width + Me.Height = outer.Height + +End + +Public Sub Form_Show() + + Dim key As String = Subst(("Camera_&1"), $index) + + Me.Left = Settings[key & "/left", $index * 100] + Me.Top = settings[key & "/top", 0] + + Refresh.Delay = refrate.Value + Refresh.Start + +End + +Public Sub Form_Open() + + Dim key As String = Subst(("Camera_&1"), $index) + + Me.Left = Settings[key & "/left", $index * 100] + Me.Top = settings[key & "/top", 0] + + picture_size.Index = Settings[key & "/size", 1] - 1 + picture_size_Click() + ResizeDevice() + Wait 0.1 + + slider_bright.Value = Settings[key & "/brightness", $device.Bright] + slider_contrast.Value = Settings[key & "/contrast", $device.Contrast] + slider_colour.Value = Settings[key & "/color", $device.Color] + slider_hue.Value = Settings[key & "/hue", $device.Hue] + slider_whiteness.Value = Settings[key & "/whiteness", $device.Whiteness] + refrate.Value = Settings[key & "/refrate", 100] + + $device.Bright = slider_bright.Value + $device.Contrast = slider_contrast.Value + $device.Color = slider_colour.Value + $device.Hue = slider_hue.Value + $device.Whiteness = slider_whiteness.Value + +End + +Public Sub Refresh_Timer() + + Dim when As Date + Dim at As Date + + at = Now() + Refresh.Stop + + $fps += 1 + when = at - $fps_now + If Second(when) >= 3 Then + frame_rate.Text = Format($fps / 3, "#.00 " & ("fps")) + $fps = 0 + $fps_now = at + Endif + + currentTime.Text = Format(at, $date_format) + Try pic.Picture = $device.Image.Picture + If Error Then + Message(("Can't recover picture from Camera!")) + Else + Wait + Try Refresh.Delay = refrate.Value + Try Refresh.Start + Endif + +End + +Public Sub picture_size_Click() + + Select picture_size.Index + Case 0 + $device.Resize(160, 120) + Case 1 + $device.Resize(320, 240) + Case 2 + $device.Resize(640, 480) + + End Select + ResizeDevice() + +End + +Public Sub slider_bright_Change() + + $device.Bright = slider_bright.Value + +End + +Public Sub slider_contrast_Change() + + $device.Contrast = slider_contrast.Value + +End + +Public Sub slider_colour_Change() + + $device.Color = slider_colour.Value + +End + +Public Sub hue_Change() + + $device.Hue = slider_hue.Value + +End + +Public Sub whiteness_Change() + + $device.Whiteness = slider_whiteness.Value + +End + +Public Sub refrate_Change() + + Refresh.Stop + Refresh.Delay = refrate.Value + Refresh.Start + +End + +Public Sub button_hide_Click() + + tools.Hide() + ResizeDevice() + +End + +Public Sub button_close_Click() + + button_hide_Click() + Refresh.Stop + Wait 0.2 + Refresh.Stop + Me.Hide + +End + +Public Sub button_pause_Click() + + button_pause.Hide + button_play.Show + Refresh.Stop + Wait + Refresh.Stop + frame_rate.Text = ("** Paused **") + +End + +Public Sub button_play_Click() + + button_pause.Show + button_play.Hide + Refresh.Start + +End + +Public Sub button_snap_Click() + + If Dialog.SaveFile() Then Return + Try $device.Save(Dialog.Path) + If Not Error Then Message(("Saved as") & " (" & Dialog.Path & ")") Else Message(("Snapshot was not saved")) + +End + +Public Sub buttonSettings_Click() + + If tools.Visible Then + tools.Hide + Else + tools.Show + Endif + ResizeDevice() + + Select $device.Width + Case 160 + picture_size.Index = 0 + Case 320 + picture_size.Index = 1 + Case 640 + picture_size.Index = 2 + End Select + +End + +Public Sub button_reset_Click() + + slider_colour.Value = $device.ColorDefault + slider_bright.Value = $device.BrightDefault + slider_contrast.Value = $device.ContrastDefault + slider_whiteness.Value = $device.WhitenessDefault + slider_hue.Value = $device.HueDefault + +End + +Public Sub Form_Close() + + Refresh.Stop + $device.Close + $device = Null + +End diff --git a/app/examples/Multimedia/WebCam/.src/FDevice.form b/app/examples/Multimedia/WebCam/.src/FDevice.form new file mode 100644 index 00000000..cfb588ec --- /dev/null +++ b/app/examples/Multimedia/WebCam/.src/FDevice.form @@ -0,0 +1,149 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,71,104) + Font = Font["Bitstream Vera Sans"] + Icon = Picture["camera.png"] + Border = False + { outer Panel + MoveScaled(3.4286,1.7143,64,95.1429) + Background = &HBFFFFF& + Foreground = &H000000& + Border = Border.Sunken + { container Panel + MoveScaled(5.1429,2.5714,53.7143,34.2857) + Background = Color.Background + Border = Border.Sunken + { pic PictureBox + MoveScaled(6,10.2857,26.5714,20.5714) + Alignment = Align.Center + } + { title Panel + MoveScaled(1.7143,0.8571,34.2857,4.5714) + Background = Color.ButtonForeground + { devName Label + MoveScaled(6,0,26.5714,2.5714) + Font = Font["Bitstream Vera Sans Mono,-1"] + Foreground = Color.TextBackground + Text = ("devName") + Alignment = Align.Left + } + { currentTime Label + MoveScaled(6,2,24.8571,2) + Font = Font["Bitstream Vera Sans Mono,-2"] + Background = Color.Foreground + Foreground = Color.TextBackground + Text = ("currentTime") + Alignment = Align.Left + } + { buttonSettings Button + MoveScaled(0.5714,0.5714,4.2857,3.4286) + Picture = Picture["settings.png"] + } + } + } + { Refresh #Timer + #MoveScaled(32,25) + } + { tools Panel + MoveScaled(3,40,53.7143,38.5714) + Visible = False + Font = Font["-1"] + Background = Color.Background + Border = Border.Sunken + { Label1 Label + MoveScaled(2,2,13,3) + Text = ("Picture Size") + } + { picture_size ComboBox + MoveScaled(16,1,17,4) + ReadOnly = True + List = [("160 x 120"), ("320 x 240"), ("640 x 480")] + Text = ("320 x 240") + } + { slider_bright Slider + MoveScaled(16,5,16,3.5714) + } + { Label2 Label + MoveScaled(2,5,13,3) + Text = ("Brightness") + } + { slider_contrast Slider + MoveScaled(16,8,16,3.5714) + } + { Label3 Label + MoveScaled(2,8,13,3) + Text = ("Contrast") + } + { slider_colour Slider + MoveScaled(16,11,16,3.5714) + } + { Label4 Label + MoveScaled(2,11,13,3) + Text = ("Colour") + } + { slider_hue Slider + MoveScaled(16,14,16,3.5714) + } + { Label5 Label + MoveScaled(2,14,13,3) + Text = ("Hue") + } + { slider_whiteness Slider + MoveScaled(16,17,16,3.5714) + } + { Label6 Label + MoveScaled(2,17,13,3) + Text = ("Whiteness") + } + { button_hide Button + MoveScaled(0,27,10,4) + Text = ("&Hide") + Picture = Picture["icon:/16/apply"] + } + { button_close Button + MoveScaled(0,32,10,4) + Text = ("&Close") + Picture = Picture["icon:/16/close"] + } + { Label7 Label + MoveScaled(2,20,13,3) + Text = ("Refresh Rate") + } + { refrate Slider + MoveScaled(16,20,16,3.5714) + MinValue = 20 + MaxValue = 1999 + Value = 200 + } + { button_pause Button + MoveScaled(11,27,10,4) + Text = ("&Pause") + Picture = Picture["icon:/16/pause"] + } + { button_play Button + MoveScaled(11,27,10,4) + Visible = False + Text = ("&Play") + Picture = Picture["icon:/16/play"] + } + { button_snap Button + MoveScaled(11,32,10,4) + Text = ("&Snap") + Picture = Picture["icon:/16/camera"] + } + { frame_rate Label + MoveScaled(2,23,30,3) + Font = Font["-1"] + Foreground = Color.SelectedBackground + Text = ("0.00 fps") + } + { button_reset Button + MoveScaled(22,27,10,4) + Text = ("&Reset") + Picture = Picture["icon:/16/apply"] + Default = True + } + } + } +} diff --git a/app/examples/Multimedia/WebCam/.src/FMain.class b/app/examples/Multimedia/WebCam/.src/FMain.class new file mode 100644 index 00000000..746731f5 --- /dev/null +++ b/app/examples/Multimedia/WebCam/.src/FMain.class @@ -0,0 +1,126 @@ +' Gambas class file + +' +' WebCam +' Demo program to show off the Gambas V4L module +' (c) Gareth Bult, Encryptec Ltd 2009 +' +' License: as-is +' +Private $windows As Form[] + +Public Sub ScanDevices() + + Dim i As Integer + Dim dev As VideoDevice + Dim myWin As Form + Dim count As Integer + Dim item As Menu + Dim status As String + Dim sDevice As String + + $windows = New Form[] + count = 0 + Me.Show + + status = ("Searching:") & " " + For i = 0 To 20 + sDevice = "/dev/video" & Str(i) + Print sDevice + Try dev = New VideoDevice(sDevice) + If Not Error Then + status &= "!" + myWin = New FDevice(dev, count) + $windows.Add(myWin) + item = New Menu(tooltray_popup) As "Camera" + item.Text = dev.Card + item.Picture = Picture["icon:/16/camera"] + item.Tag = i + count += 1 + Else + status &= "." + Endif + Wait 0.1 + text_status.Text = status + Next + text_status.Text = ("Found") & " (" & Str($windows.Count) & ") " & ("devices") + Wait 2 + Me.Hide + + For Each myWin In $windows + myWin.Show + Next + +End + +Public Sub menu_scan_Click() + + Dim item As Menu + Dim items As Menu[] + + While $windows.Count > 0 + $windows.Pop().Close + Wend + $windows.Clear + + items = New Menu[] + For Each item In tooltray_popup.Children + If item.Tag <> "X" + items.Add(item) + Endif + Next + + For Each item In items + item.Delete + Next + + ScanDevices() + +End + +Public Sub Camera_Click() + + $windows[Last.Tag].Show + $windows[Last.Tag].SetFocus + +End + +Public Sub tooltray_Menu() + + tooltray_popup.Popup + +End + +Public Sub menu_quit_Click() + + While $windows.Count > 0 + $windows.Pop().Close + Wend + Me.Close + 'tooltray.Hide + +End + +Public Sub menu_save_Click() + + Dim mywin As FDevice + + For Each myWin In $windows + myWin.Save() + Next + Settings.Save + Message(("Settings Saved!")) + +End + +Public Sub Form_Open() + + Me.Center + +End + +Public Sub Form_Activate() + + If Not $windows Then ScanDevices + +End diff --git a/app/examples/Multimedia/WebCam/.src/FMain.form b/app/examples/Multimedia/WebCam/.src/FMain.form new file mode 100644 index 00000000..8d689ecf --- /dev/null +++ b/app/examples/Multimedia/WebCam/.src/FMain.form @@ -0,0 +1,62 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,42,18) + Background = Color.SelectedBackground + Icon = Picture["camera.png"] + Border = False + Arrangement = Arrange.Fill + Margin = True + Padding = 4 + { tooltray_popup Menu + Tag = "X" + { Menu3 Menu + Text = ("WebCam Options") + Enabled = False + Tag = "X" + } + { menu_scan Menu + Text = ("&Scan for Devices") + Picture = Picture["icon:/16/find"] + Tag = "X" + } + { menu_save Menu + Text = ("Save Settings") + Picture = Picture["icon:/16/floppy"] + Tag = "X" + } + { menu_quit Menu + Text = ("&Quit") + Picture = Picture["icon:/16/quit"] + Tag = "X" + } + { Menu1 Menu + Tag = "X" + } + } + { Panel1 Panel + MoveScaled(0.7143,0,40.4286,17) + Background = Color.LightBackground + Arrangement = Arrange.Vertical + Margin = True + Border = Border.Sunken + { TextLabel1 TextLabel + MoveScaled(2,1,36,9) + Font = Font["Impact,+4"] + Text = ("Encryptec WebCam Viewer") + } + { TextLabel2 TextLabel + MoveScaled(2,10,36,3) + Foreground = Color.SelectedBackground + Text = ("(c) Encryptec Limited 2009") + Alignment = Align.Center + } + { text_status TextLabel + MoveScaled(2,12,36,4) + Font = Font["-1"] + Foreground = &H600080& + Text = ("Scanning for Devices ") & "..." + Alignment = Align.Left + } + } +} diff --git a/app/examples/Multimedia/WebCam/camera.png b/app/examples/Multimedia/WebCam/camera.png new file mode 100644 index 0000000000000000000000000000000000000000..c8c343ec895f7bde3361df4cf2f8ebf819fc92e8 GIT binary patch literal 1027 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 Z@qcqIe_a>Ugr5Ka002ovPDHLkV1hp@x1#_6 literal 0 HcmV?d00001 diff --git a/app/examples/Networking/ClientSocket/.lang/ca.po b/app/examples/Networking/ClientSocket/.lang/ca.po new file mode 100644 index 00000000..a58fa3ed --- /dev/null +++ b/app/examples/Networking/ClientSocket/.lang/ca.po @@ -0,0 +1,127 @@ +# Catalan translation of ClientSocket +# Copyright (C) 2000-2010 Benoît Minisini. +# This file is distributed under the same license as the ClientSocket package. +# Jordi Sayol , 2007-2010. +# +# +msgid "" +msgstr "" +"Project-Id-Version: ClientSocket\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2011-03-20 17:12+0100\n" +"Last-Translator: Jordi Sayol \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: .project:1 +msgid "Client Socket Example" +msgstr "Exemple de Sòcol Client" + +#: FrmMain.class:26 +msgid "Connected to path " +msgstr "S'ha connectat al camí" + +#: FrmMain.class:28 +msgid "Connected to remote host " +msgstr "S'ha connectat a l'ordinador remot" + +#: FrmMain.class:29 +msgid " - Using local address : " +msgstr "- Fent servir l'adreça local:" + +#: FrmMain.class:42 +msgid "Connection Closed by foreign host." +msgstr "Connexió tancada per un ordinador aliè" + +#: FrmMain.class:54 +msgid "Host Found. Connecting..." +msgstr "Orinador trobat. Connectant..." + +#: FrmMain.class:84 +msgid "The system does not allow to create a socket" +msgstr "El sistema no permet crear un sòcol" + +#: FrmMain.class:86 +msgid "Host not Found" +msgstr "No s'ha trobat l'ordinador" + +#: FrmMain.class:88 +msgid "Unable to Connect. Connection Refused" +msgstr "No s'ha pogut connectar. Connexió rebutjada" + +#: FrmMain.class:90 +msgid "Error Reading Data" +msgstr "S'ha produït un error en llegir les dades" + +#: FrmMain.class:92 +msgid "Error Writing Data" +msgstr "S'ha produït un error en escriure les dades" + +#: FrmMain.class:158 +msgid "Looking up host name..." +msgstr "cercant el nom d'ordinador..." + +#: FrmMain.class:176 +msgid "Timeout trying to stablish connection" +msgstr "Temps d'espera probant d'establir la connexió" + +#: FrmMain.class:189 +msgid "Connection closed by user" +msgstr "Connexió tancada per l'usuari" + +#: FrmMain.form:23 +msgid "Client socket example " +msgstr "Exemple de sòcol client" + +#: FrmMain.form:29 +msgid "Connect" +msgstr "Connecta" + +#: FrmMain.form:40 +msgid "Close" +msgstr "Tanca" + +#: FrmMain.form:45 +msgid "localhost" +msgstr "-" + +#: FrmMain.form:50 +msgid "Host :" +msgstr "Servidor:" + +#: FrmMain.form:55 +msgid "Port :" +msgstr "Port :" + +#: FrmMain.form:60 +msgid "32340" +msgstr "-" + +#: FrmMain.form:71 +msgid "Send Data" +msgstr "Envia dades" + +#: FrmMain.form:76 +msgid "Write here data to send, then press \"Send Data\"" +msgstr "Escriviu aquí les dades per enviar, després premeu \"Envia dades\"" + +#: FrmMain.form:81 +msgid "Select protocol :" +msgstr "Seleccioneu el protocol:" + +#: FrmMain.form:87 +msgid "TCP" +msgstr "-" + +#: FrmMain.form:87 +msgid "UNIX" +msgstr "-" + +#: FrmMain.form:102 +msgid "Data Received :" +msgstr "Dades rebudes :" diff --git a/app/examples/Networking/ClientSocket/.lang/cs.po b/app/examples/Networking/ClientSocket/.lang/cs.po new file mode 100644 index 00000000..40be43ef --- /dev/null +++ b/app/examples/Networking/ClientSocket/.lang/cs.po @@ -0,0 +1,120 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Client Socket Example" +msgstr "Příklad Soket Klienta" + +#: FrmMain.class:26 +msgid "Connected to path " +msgstr "Připojeno na cestu " + +#: FrmMain.class:28 +msgid "Connected to remote host " +msgstr "Připojen ke vzdálenému hostiteli " + +#: FrmMain.class:29 +msgid " - Using local address : " +msgstr " - Použita lokální adresa : " + +#: FrmMain.class:42 +msgid "Connection Closed by foreign host." +msgstr "Připojení ukončeno cizím hostem." + +#: FrmMain.class:54 +msgid "Host Found. Connecting..." +msgstr "Host nalezen. Připojování..." + +#: FrmMain.class:84 +msgid "The system does not allow to create a socket" +msgstr "Tento systém neumožňuje vytvořit socket" + +#: FrmMain.class:86 +msgid "Host not Found" +msgstr "Host nenalezen" + +#: FrmMain.class:88 +msgid "Unable to Connect. Connection Refused" +msgstr "Nelze se připojit. Spojení odmítnuto" + +#: FrmMain.class:90 +msgid "Error Reading Data" +msgstr "Chyba čtení dat" + +#: FrmMain.class:92 +msgid "Error Writing Data" +msgstr "Chyba zápisu dat" + +#: FrmMain.class:158 +msgid "Looking up host name..." +msgstr "Vyhledávám hostitele..." + +#: FrmMain.class:176 +msgid "Timeout trying to stablish connection" +msgstr "Timeout snažím založit připojení" + +#: FrmMain.class:189 +msgid "Connection closed by user" +msgstr "Připojení ukončeno uživatelem" + +#: FrmMain.form:23 +msgid "Client socket example " +msgstr "Příklad coket klienta" + +#: FrmMain.form:29 +msgid "Connect" +msgstr "Připojit" + +#: FrmMain.form:40 +msgid "Close" +msgstr "Zavřít" + +#: FrmMain.form:45 +msgid "localhost" +msgstr "-" + +#: FrmMain.form:50 +msgid "Host :" +msgstr "-" + +#: FrmMain.form:55 +msgid "Port :" +msgstr "-" + +#: FrmMain.form:60 +msgid "32340" +msgstr "-" + +#: FrmMain.form:71 +msgid "Send Data" +msgstr "Pošli data" + +#: FrmMain.form:76 +msgid "Write here data to send, then press \"Send Data\"" +msgstr "Zde zapiš data, pošli zmáčknutím \"Poslat data\"" + +#: FrmMain.form:81 +msgid "Select protocol :" +msgstr "Vyber protokol :" + +#: FrmMain.form:87 +msgid "TCP" +msgstr "-" + +#: FrmMain.form:87 +msgid "UNIX" +msgstr "-" + +#: FrmMain.form:102 +msgid "Data Received :" +msgstr "Příjmané data :" diff --git a/app/examples/Networking/ClientSocket/.lang/de.po b/app/examples/Networking/ClientSocket/.lang/de.po new file mode 100644 index 00000000..2e085c9d --- /dev/null +++ b/app/examples/Networking/ClientSocket/.lang/de.po @@ -0,0 +1,120 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Client Socket Example" +msgstr "Client-Socket-Beispiel" + +#: FrmMain.class:26 +msgid "Connected to path " +msgstr "Zu einem Pfad verbinden" + +#: FrmMain.class:28 +msgid "Connected to remote host " +msgstr "Zu einem Remote Host verbinden" + +#: FrmMain.class:29 +msgid " - Using local address : " +msgstr "Lokale Adresse verwenden:" + +#: FrmMain.class:42 +msgid "Connection Closed by foreign host." +msgstr "Verbindung vom Host getrennt" + +#: FrmMain.class:54 +msgid "Host Found. Connecting..." +msgstr "Host gefunden. Verbinde..." + +#: FrmMain.class:84 +msgid "The system does not allow to create a socket" +msgstr "Das System verhindert, einen Socket zu erstellen" + +#: FrmMain.class:86 +msgid "Host not Found" +msgstr "Host nicht gefunden" + +#: FrmMain.class:88 +msgid "Unable to Connect. Connection Refused" +msgstr "Kann nicht verbinden: Verbindung abgelehnt" + +#: FrmMain.class:90 +msgid "Error Reading Data" +msgstr "Fehler beim Lesen der Daten" + +#: FrmMain.class:92 +msgid "Error Writing Data" +msgstr "Fehler beim Schreiben der Daten" + +#: FrmMain.class:158 +msgid "Looking up host name..." +msgstr "Schlage Hostname nach..." + +#: FrmMain.class:176 +msgid "Timeout trying to stablish connection" +msgstr "Timeout bei der Verbindungsherstellung" + +#: FrmMain.class:189 +msgid "Connection closed by user" +msgstr "Verbindung vom Benutzer getrennt" + +#: FrmMain.form:23 +msgid "Client socket example " +msgstr "Client-Socket-Beispiel" + +#: FrmMain.form:29 +msgid "Connect" +msgstr "Verbinden" + +#: FrmMain.form:40 +msgid "Close" +msgstr "Schließen" + +#: FrmMain.form:45 +msgid "localhost" +msgstr "-" + +#: FrmMain.form:50 +msgid "Host :" +msgstr "-" + +#: FrmMain.form:55 +msgid "Port :" +msgstr "-" + +#: FrmMain.form:60 +msgid "32340" +msgstr "-" + +#: FrmMain.form:71 +msgid "Send Data" +msgstr "Daten senden" + +#: FrmMain.form:76 +msgid "Write here data to send, then press \"Send Data\"" +msgstr "Zu sendende Daten eingeben" + +#: FrmMain.form:81 +msgid "Select protocol :" +msgstr "Protokoll wählen:" + +#: FrmMain.form:87 +msgid "TCP" +msgstr "-" + +#: FrmMain.form:87 +msgid "UNIX" +msgstr "-" + +#: FrmMain.form:102 +msgid "Data Received :" +msgstr "Daten empfangen:" diff --git a/app/examples/Networking/ClientSocket/.lang/es.po b/app/examples/Networking/ClientSocket/.lang/es.po new file mode 100644 index 00000000..4ecb347f --- /dev/null +++ b/app/examples/Networking/ClientSocket/.lang/es.po @@ -0,0 +1,63 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: FrmMain.class:245 +msgid "Client socket example " +msgstr "Ejemplo de Cliente de puerto" + +#: FrmMain.class:250 +msgid "Connect" +msgstr "Conectar" + +#: FrmMain.class:266 +msgid "Close" +msgstr "Cerrar" + +#: FrmMain.class:271 +msgid "localhost" +msgstr "localhost" + +#: FrmMain.class:276 +msgid "Host :" +msgstr "Servidor :" + +#: FrmMain.class:281 +msgid "Port :" +msgstr "Puerto :" + +#: FrmMain.class:286 +msgid "7" +msgstr "7" + +#: FrmMain.class:291 +msgid "Data Received :" +msgstr "Datos recibidos :" + +#: FrmMain.class:303 +msgid "Send Data" +msgstr "Enviar datos" + +#: FrmMain.class:308 +msgid "Write here data to send, then press \"Send Data\"" +msgstr "Escriba aquí los datos a enviar, luego presione \"Enviar datos\"" + +#: FrmMain.class:313 +msgid "Select protocol :" +msgstr "Seleccione un protocolo :" + +#: FrmMain.class:320 +msgid "TCP" +msgstr "TCP" + +#: FrmMain.class:320 +msgid "UNIX" +msgstr "UNIX" diff --git a/app/examples/Networking/ClientSocket/.lang/nl.po b/app/examples/Networking/ClientSocket/.lang/nl.po new file mode 100644 index 00000000..7286efe2 --- /dev/null +++ b/app/examples/Networking/ClientSocket/.lang/nl.po @@ -0,0 +1,120 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2014-09-22 00:27+0100\n" +"Last-Translator: Willy Raets \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Client Socket Example" +msgstr "Client Socket Voorbeeld" + +#: FrmMain.form:23 +msgid "Client socket example " +msgstr "Client socket voorbeeld " + +#: FrmMain.form:29 +msgid "Connect" +msgstr "Verbind" + +#: FrmMain.form:40 +msgid "Close" +msgstr "Sluiten" + +#: FrmMain.form:45 +msgid "localhost" +msgstr "-" + +#: FrmMain.form:50 +msgid "Host :" +msgstr "-" + +#: FrmMain.form:55 +msgid "Port :" +msgstr "Poort :" + +#: FrmMain.form:60 +msgid "32340" +msgstr "-" + +#: FrmMain.form:71 +msgid "Send Data" +msgstr "Verzend Data" + +#: FrmMain.form:76 +msgid "Write here data to send, then press \"Send Data\"" +msgstr "Noteer hier data om te verzenden, druk vervolgens \"Verzend Data\"" + +#: FrmMain.form:81 +msgid "Select protocol :" +msgstr "Selecteer protocol :" + +#: FrmMain.form:87 +msgid "TCP" +msgstr "-" + +#: FrmMain.form:87 +msgid "UNIX" +msgstr "-" + +#: FrmMain.form:102 +msgid "Data Received :" +msgstr "Data ontvangen :" + +#: FrmMain.class:26 +msgid "Connected to path " +msgstr "Verbonden met pad" + +#: FrmMain.class:28 +msgid "Connected to remote host " +msgstr "Verbonen met afgelegen host" + +#: FrmMain.class:29 +msgid " - Using local address : " +msgstr " - Using lokaal adres : " + +#: FrmMain.class:42 +msgid "Connection Closed by foreign host." +msgstr "Connectie gesloten door vreemde host." + +#: FrmMain.class:54 +msgid "Host Found. Connecting..." +msgstr "Host gevonden. Verbinding maken..." + +#: FrmMain.class:84 +msgid "The system does not allow to create a socket" +msgstr "Het systeem staat niet toe een socket te creëren" + +#: FrmMain.class:86 +msgid "Host not Found" +msgstr "Host niet gevonden" + +#: FrmMain.class:88 +msgid "Unable to Connect. Connection Refused" +msgstr "Onmogelijk om te verbinden. Verbinding geweigert" + +#: FrmMain.class:90 +msgid "Error Reading Data" +msgstr "Fout bij het lezen van data" + +#: FrmMain.class:92 +msgid "Error Writing Data" +msgstr "Fout bij schrijven van data" + +#: FrmMain.class:158 +msgid "Looking up host name..." +msgstr "Host naam opzoeken..." + +#: FrmMain.class:176 +msgid "Timeout trying to stablish connection" +msgstr "Timeout tijdens het trachten een connectie te maken" + +#: FrmMain.class:189 +msgid "Connection closed by user" +msgstr "Connectie gesloten door gebruiker" + diff --git a/app/examples/Networking/ClientSocket/.lang/ru.po b/app/examples/Networking/ClientSocket/.lang/ru.po new file mode 100644 index 00000000..317b58c7 --- /dev/null +++ b/app/examples/Networking/ClientSocket/.lang/ru.po @@ -0,0 +1,148 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Networking/ClientSocket/.project:21 +msgid "Client Socket Example" +msgstr "Пример сокета клиента" + +#: app/examples/Networking/ClientSocket/.project:22 +msgid "" +"Client socket example.\n" +"\n" +"This example shows how to use a socket to connect to a server. You should use the \"ServerSocket\" example as a testing peer." +msgstr "" +"Пример сокета клиента.\n" +"\n" +"В этом примере показано, как использовать сокет для подключения к серверу. Вы должны использовать пример «Сокет сервера» в качестве тестового партнёра." + +#: app/examples/Networking/ClientSocket/.src/FrmMain.class:26 +msgid "Connected to path " +msgstr "Подключено к пути " + +#: app/examples/Networking/ClientSocket/.src/FrmMain.class:28 +msgid "Connected to remote host " +msgstr "Подключен к удалённому хосту " + +#: app/examples/Networking/ClientSocket/.src/FrmMain.class:29 +msgid " - Using local address : " +msgstr " - Используя локальный адрес: " + +#: app/examples/Networking/ClientSocket/.src/FrmMain.class:42 +msgid "Connection Closed by foreign host." +msgstr "Соединение закрыто сторонним хостом." + +#: app/examples/Networking/ClientSocket/.src/FrmMain.class:54 +msgid "Host Found. Connecting..." +msgstr "Хост найден. Соединение..." + +#: app/examples/Networking/ClientSocket/.src/FrmMain.class:84 +msgid "The system does not allow to create a socket" +msgstr "Система не позволяет создать сокет" + +#: app/examples/Networking/ClientSocket/.src/FrmMain.class:86 +msgid "Host not Found" +msgstr "Хост не найден" + +#: app/examples/Networking/ClientSocket/.src/FrmMain.class:88 +msgid "Unable to Connect. Connection Refused" +msgstr "Невозможно подключиться. В соединении отказано" + +#: app/examples/Networking/ClientSocket/.src/FrmMain.class:90 +msgid "Error Reading Data" +msgstr "Ошибка чтения данных" + +#: app/examples/Networking/ClientSocket/.src/FrmMain.class:92 +msgid "Error Writing Data" +msgstr "Ошибка записи данных" + +#: app/examples/Networking/ClientSocket/.src/FrmMain.class:158 +msgid "Looking up host name..." +msgstr "Поиск имени хоста..." + +#: app/examples/Networking/ClientSocket/.src/FrmMain.class:176 +msgid "Timeout trying to stablish connection" +msgstr "Тайм-аут при попытке укрепить соединение" + +#: app/examples/Networking/ClientSocket/.src/FrmMain.class:189 +msgid "Connection closed by user" +msgstr "Соединение закрыто пользователем" + +#: app/examples/Networking/ClientSocket/.src/FrmMain.class:224 app/examples/Networking/ClientSocket/.src/FrmMain.form:27 +msgid "Host :" +msgstr "Хост:" + +#: app/examples/Networking/ClientSocket/.src/FrmMain.class:228 +msgid "Path :" +msgstr "Путь:" + +#: app/examples/Networking/ClientSocket/.src/FrmMain.form:5 +msgid "Client socket example " +msgstr "Пример сокета клиента " + +#: app/examples/Networking/ClientSocket/.src/FrmMain.form:10 +msgid "Connect" +msgstr "Соединить" + +#: app/examples/Networking/ClientSocket/.src/FrmMain.form:19 +msgid "Close" +msgstr "Закрыть" + +#: app/examples/Networking/ClientSocket/.src/FrmMain.form:23 +msgid "localhost" +msgstr "localhost" + +#: app/examples/Networking/ClientSocket/.src/FrmMain.form:31 +msgid "Port :" +msgstr "Порт:" + +#: app/examples/Networking/ClientSocket/.src/FrmMain.form:35 +msgid "32340" +msgstr "32340" + +#: app/examples/Networking/ClientSocket/.src/FrmMain.form:44 +msgid "Send Data" +msgstr "Отправить данные" + +#: app/examples/Networking/ClientSocket/.src/FrmMain.form:48 +msgid "Write here data to send, then press \"Send Data\"" +msgstr "Напишите здесь данные для отправки, затем нажмите «Отправить данные»" + +#: app/examples/Networking/ClientSocket/.src/FrmMain.form:52 +msgid "Select protocol :" +msgstr "Протокол:" + +#: app/examples/Networking/ClientSocket/.src/FrmMain.form:57 +msgid "TCP" +msgstr "TCP" + +#: app/examples/Networking/ClientSocket/.src/FrmMain.form:57 +msgid "UNIX" +msgstr "UNIX" + +#: app/examples/Networking/ClientSocket/.src/FrmMain.form:70 +msgid "Data Received :" +msgstr "Данные получены:" + diff --git a/app/examples/Networking/ClientSocket/.project b/app/examples/Networking/ClientSocket/.project new file mode 100644 index 00000000..dbf9a2f1 --- /dev/null +++ b/app/examples/Networking/ClientSocket/.project @@ -0,0 +1,20 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.6.90 +Title=Client Socket Example +Startup=FrmMain +Icon=socket.png +Version=1.0.0 +Component=gb.image +Component=gb.gui +Component=gb.net +Description="Client socket example.\n\nThis example shows how to use a socket to connect to a server. You should use the \"ServerSocket\" example as a testing peer." +Authors="Daniel Campos Fernández\nBenoît Minisini" +TabSize=2 +Translate=1 +Language=fr +Maintainer=benoit +Vendor=Example +Address=benoit@desnouettes +License=General Public Licence +Packager=1 +Tags=Network diff --git a/app/examples/Networking/ClientSocket/.src/FrmMain.class b/app/examples/Networking/ClientSocket/.src/FrmMain.class new file mode 100644 index 00000000..d8cd1f3f --- /dev/null +++ b/app/examples/Networking/ClientSocket/.src/FrmMain.class @@ -0,0 +1,231 @@ +' Gambas class file + +'******************************************** +' THIS EXAMPLE SHOWS HOW TO USE THE 'Socket' +' CLASS FROM 'gb.net' COMPONENT +' +' (C) 2003-2004 Daniel Campos Fernández +' (danielcampos@netcourrier.com) +'******************************************** +Private CurProtocol As Integer + +Public Sub Form_Open() + + CurProtocol = 0 + +End + +Public Sub MySocket_Ready() + '*********************************** + ' When connection proccess has finished + ' successfully, "Connected" event will raise + '*********************************** + + timTimeout.Enabled = False + If CurProtocol = 1 Then + lblMessage.Text = ("Connected to path ") & MySocket.Path + Else + lblMessage.Text = ("Connected to remote host ") & MySocket.Path + lblMessage.Text = lblMessage.Text & (" - Using local address : ") & MySocket.LocalHost & ":" & MySocket.LocalPort + End If + Me.Enabled = True + Set_Interface(True) + +End + +Public Sub MySocket_Closed() + '******************************************** + ' this event will raise when foreing host + ' closes the socket by any reason + '******************************************** + + lblMessage.Caption = ("Connection Closed by foreign host.") + Me.Enabled = True + Set_Interface(False) + +End + +Public Sub MySocket_Found() + '******************************************** + ' this event will raise when foreing host + ' name has been translated to IP + '******************************************** + + lblMessage.Caption = ("Host Found. Connecting...") + +End + +Public Sub MySocket_Read() + '**************************************** + ' When some data arrives from the remote + ' part of the socket, "DataAvailable" event + ' is raised + '**************************************** + + Dim S As String + + If MySocket.Status = Net.Connected Then + Read #MySocket, S, Lof(MySocket) + txtReceive.Pos = txtReceive.Length + txtReceive.Insert(S) + End If + +End + +Public Sub MySocket_Error() + '********************************** + ' this is the function to + ' handle Errors when trying + ' to read or write to the socket + '********************************** + + Select Case MySocket.Status + Case Net.CannotCreateSocket + lblMessage.Text = ("The system does not allow to create a socket") + Case Net.HostNotFound + lblMessage.Text = ("Host not Found") + Case Net.ConnectionRefused + lblMessage.Text = ("Unable to Connect. Connection Refused") + Case Net.CannotRead + lblMessage.Text = ("Error Reading Data") + Case Net.CannotWrite + lblMessage.Text = ("Error Writing Data") + End Select + Set_Interface(False) + +End + +Private Sub Set_Interface(bState As Boolean) + '**************************************** + ' An auxiliar method to enable/disable + ' controls in the formulary , when + ' connection is stablished or closed + '**************************************** + + btnConnect.Enabled = Not bState + txtHost.Enabled = Not bState + txtPort.Enabled = Not bState + cmbProtocol.Enabled = Not bState + Label5.Enabled = Not bState + btnClose.Enabled = bState + timTimeout.Enabled = bState + 'TextArea1.Enabled=bState + btnSend.Enabled = bState + txtSend.Enabled = bState + + If bState Then + txtReceive.Text = "" + txtReceive.SetFocus + Endif + +End + +Public Sub btnConnect_Click() + + '****************************************** + ' To connect to remote host we call to + ' connectsocket method, passing Host Name + ' and port as arguments + '****************************************** + Dim RetVal As Integer + + btnConnect.Enabled = False + Select Case CurProtocol + Case 0 + ' Stablishing a TCP connection. + ' Here we use Host and + ' Port properties, we could also + ' do directly MySock.Connect(TextBox1.Text,VAL(TextBox2.Text)) + MySocket.Host = txtHost.Text + MySocket.Port = Val(txtPort.Text) + MySocket.Connect() + Case 1 + ' Stablishing a Local connection. + ' Here we use Path and + ' Port properties, we could also + ' do directly MySock.Connect(TextBox1.Text,0) + MySocket.Path = txtHost.Text + MySocket.Port = Net.Local + MySocket.Connect() + End Select + If MySocket.Status > Net.Inactive Then + If CurProtocol = 0 Then + '************************** + ' TCP : connection in progress... + '************************** + btnClose.Enabled = True + 'ME.Enabled=FALSE + lblMessage.Text = ("Looking up host name...") + timTimeout.Delay = 10000 ' we'll wait a maximun time of 10 seconds + timTimeout.Enabled = True + End If + End If + +End + +Public Sub timTimeout_Timer() + + '*************************** + ' timeout trying to connect + '*************************** + Me.Enabled = True + timTimeout.Enabled = False + If MySocket.Status <> Net.Connected Then + Close MySocket + Set_Interface(False) + lblMessage.Text = ("Timeout trying to stablish connection") + End If + +End + +Public Sub btnClose_Click() + + '********************************** + ' Here we close the connection + ' to remote host + '********************************** + Close MySocket + Set_Interface(False) + lblMessage.Text = ("Connection closed by user") + +End + +Public Sub btnSend_Click() + '**************************************************** + ' Here we send data to the remote part of the socket. + ' We have to be sure that connection is active + '**************************************************** + + If MySocket.Status = Net.Connected Then + Write #MySocket, txtSend.Text, Len(txtSend.Text) + txtSend.Text = "" + End If + +End + +Public Sub Form_Close() + + '********************* + ' Close possible Stablished connections + '********************* + If MySocket.Status > 0 Then Close #MySocket + +End + +Public Sub cmbProtocol_Click() + '************************************************** + ' Here we select protocol to use : TCP,UDP or UNIX + '************************************************** + + CurProtocol = cmbProtocol.Index + If CurProtocol = 0 Then + Label2.Visible = True + txtPort.Visible = True + Label1.Text = ("Host :") + Else + Label2.Visible = False + txtPort.Visible = False + Label1.Text = ("Path :") + End If + +End diff --git a/app/examples/Networking/ClientSocket/.src/FrmMain.form b/app/examples/Networking/ClientSocket/.src/FrmMain.form new file mode 100644 index 00000000..4c049648 --- /dev/null +++ b/app/examples/Networking/ClientSocket/.src/FrmMain.form @@ -0,0 +1,75 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(34,23.4286,83,60) + Text = ("Client socket example ") + Icon = Picture["socket.png"] + Resizable = False + { btnConnect Button + MoveScaled(64,7,17,4) + Text = ("Connect") + } + { txtReceive TextArea + MoveScaled(1,44,81,15) + ReadOnly = True + } + { btnClose Button + MoveScaled(64,12,17,4) + Enabled = False + Text = ("Close") + } + { txtHost TextBox + MoveScaled(14,7,49,4) + Text = ("localhost") + } + { Label1 Label + MoveScaled(1,7,12,4) + Text = ("Host :") + } + { Label2 Label + MoveScaled(1,12,12,4) + Text = ("Port :") + } + { txtPort TextBox + MoveScaled(14,12,49,4) + Text = ("32340") + } + { txtSend TextArea + MoveScaled(1,27,81,6) + Enabled = False + } + { btnSend Button + MoveScaled(13,34,23,4) + Enabled = False + Text = ("Send Data") + } + { Label4 Label + MoveScaled(1,24,81,3) + Text = ("Write here data to send, then press \"Send Data\"") + } + { Label5 Label + MoveScaled(1,1,17,4) + Text = ("Select protocol :") + } + { cmbProtocol ComboBox + MoveScaled(19,1,63,4) + ReadOnly = True + List = [("TCP"), ("UNIX")] + } + { lblMessage TextLabel + MoveScaled(1,17,81,6) + Font = Font["Bold"] + Alignment = Align.Center + Border = Border.Sunken + } + { timTimeout #Timer + #MoveScaled(26,47) + } + { Label3 Label + MoveScaled(1,40,81,4) + Text = ("Data Received :") + } + { MySocket #Socket + #MoveScaled(38,35) + } +} diff --git a/app/examples/Networking/ClientSocket/socket.png b/app/examples/Networking/ClientSocket/socket.png new file mode 100644 index 0000000000000000000000000000000000000000..bf16a70ad3137ebc3e6c1a9e01f81d4f07d97ffe GIT binary patch literal 2200 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 wc(nk, 2007-2010. +# +# +msgid "" +msgstr "" +"Project-Id-Version: DnsClient\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2010-12-17 01:09+0100\n" +"Last-Translator: Jordi Sayol \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: FMain.form:164 +msgid "Asynchronous" +msgstr "Assincrònic" + +#: FMain.form:95 +msgid "Cancel" +msgstr "Canceŀla" + +#: FMain.class:251 +msgid "Cancelled" +msgstr "Canceŀlat" + +#: FMain.form:159 +msgid "<< Copy" +msgstr "<< Copia" + +#: FMain.form:29 +msgid "DnsClient Example" +msgstr "Exemple de client Dns" + +#: .project:1 +msgid "DNS client example" +msgstr "Exemple de client DNS" + +#: FMain.class:217 +msgid "Finished" +msgstr "Acabat" + +#: FMain.form:44 +msgid "gambas.sourceforge.net" +msgstr "-" + +#: FMain.form:34 +msgid "Go!" +msgstr "Endavant!" + +#: FMain.form:154 +msgid "Host Name to IP" +msgstr "Nom de domini a IP" + +#: FMain.form:154 +msgid "IP to Host Name" +msgstr "IP a nom de domini" + +#: FMain.class:14 +msgid "Not Found" +msgstr "No s'ha trobat" + +#: FMain.class:295 +msgid "Write here 7 host names then press GO!" +msgstr "Escriu 7 noms d'ordinador i pitja Endavant!" + +#: FMain.class:297 +msgid "Write here 7 IP addresses then press GO!" +msgstr "Escriu 7 adreces ip i pitja Endavant!" + +#: FMain.form:110 +msgid "www.debian.org" +msgstr "-" + +#: FMain.form:54 +msgid "www.freshmeat.net" +msgstr "-" + +#: FMain.form:49 +msgid "www.kudla.org" +msgstr "-" + +#: FMain.form:115 +msgid "www.mageia.org" +msgstr "-" + +#: FMain.form:105 +msgid "www.rpmfind.net" +msgstr "-" + +#: FMain.form:100 +msgid "www.slashdot.org" +msgstr "-" + diff --git a/app/examples/Networking/DnsClient/.lang/cs.po b/app/examples/Networking/DnsClient/.lang/cs.po new file mode 100644 index 00000000..0bd1585c --- /dev/null +++ b/app/examples/Networking/DnsClient/.lang/cs.po @@ -0,0 +1,92 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "DNS client example" +msgstr "Příklad DNS klienta" + +#: FMain.class:14 +msgid "Not Found" +msgstr "Nenalezeno" + +#: FMain.class:217 +msgid "Finished" +msgstr "Dokončeno" + +#: FMain.class:251 +msgid "Cancelled" +msgstr "Zrušené" + +#: FMain.class:295 +msgid "Write here 7 host names then press GO!" +msgstr "Napiš zde 7 host jmen a pak zmačkni GO!" + +#: FMain.class:297 +msgid "Write here 7 IP addresses then press GO!" +msgstr "Napiš zde 7 IP adres a pak zmačni GO!" + +#: FMain.form:29 +msgid "DnsClient Example" +msgstr "Příklad DnsKlienta" + +#: FMain.form:34 +msgid "Go!" +msgstr "Go!" + +#: FMain.form:44 +msgid "gambas.sourceforge.net" +msgstr "-" + +#: FMain.form:49 +msgid "www.kudla.org" +msgstr "-" + +#: FMain.form:54 +msgid "www.freshmeat.net" +msgstr "-" + +#: FMain.form:95 +msgid "Cancel" +msgstr "Zrušit" + +#: FMain.form:100 +msgid "www.slashdot.org" +msgstr "-" + +#: FMain.form:105 +msgid "www.rpmfind.net" +msgstr "-" + +#: FMain.form:110 +msgid "www.debian.org" +msgstr "-" + +#: FMain.form:115 +msgid "www.mageia.org" +msgstr "-" + +#: FMain.form:154 +msgid "Host Name to IP" +msgstr "Host name z IP" + +#: FMain.form:154 +msgid "IP to Host Name" +msgstr "IP z Host name" + +#: FMain.form:159 +msgid "<< Copy" +msgstr "<< Koírovat" + +#: FMain.form:164 +msgid "Asynchronous" +msgstr "Asynchronně" diff --git a/app/examples/Networking/DnsClient/.lang/de.po b/app/examples/Networking/DnsClient/.lang/de.po new file mode 100644 index 00000000..79726ee6 --- /dev/null +++ b/app/examples/Networking/DnsClient/.lang/de.po @@ -0,0 +1,93 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "DNS client example" +msgstr "Beispiel für einen DNS-Client" + +#: FMain.class:14 +msgid "Not Found" +msgstr "Nicht gefunden" + +#: FMain.class:217 +msgid "Finished" +msgstr "Fertig" + +#: FMain.class:251 +msgid "Cancelled" +msgstr "Abgebrochen" + +#: FMain.class:295 +msgid "Write here 7 host names then press GO!" +msgstr "Gib 7 Hostnamen ein und klicke auf Los!" + +#: FMain.class:297 +msgid "Write here 7 IP addresses then press GO!" +msgstr "Gib 7 IP-Adressen ein und klicke auf Los!" + +#: FMain.form:29 +msgid "DnsClient Example" +msgstr "Beispiel für einen DNS-Client" + +#: FMain.form:34 +msgid "Go!" +msgstr "Los!" + +#: FMain.form:44 +msgid "gambas.sourceforge.net" +msgstr "-" + +#: FMain.form:49 +msgid "www.kudla.org" +msgstr "-" + +#: FMain.form:54 +msgid "www.freshmeat.net" +msgstr "-" + +#: FMain.form:95 +msgid "Cancel" +msgstr "Abbrechen" + +#: FMain.form:100 +msgid "www.slashdot.org" +msgstr "-" + +#: FMain.form:105 +msgid "www.rpmfind.net" +msgstr "-" + +#: FMain.form:110 +msgid "www.debian.org" +msgstr "-" + +#: FMain.form:115 +msgid "www.mageia.org" +msgstr "-" + +#: FMain.form:154 +msgid "Host Name to IP" +msgstr "Host Name nach IP-Adresse" + +#: FMain.form:154 +msgid "IP to Host Name" +msgstr "IP-Adresse nach Host Name" + +#: FMain.form:159 +msgid "<< Copy" +msgstr "<< Kopieren" + +#: FMain.form:164 +msgid "Asynchronous" +msgstr "Asynchron" + diff --git a/app/examples/Networking/DnsClient/.lang/es.po b/app/examples/Networking/DnsClient/.lang/es.po new file mode 100644 index 00000000..2df0d745 --- /dev/null +++ b/app/examples/Networking/DnsClient/.lang/es.po @@ -0,0 +1,67 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: FMain.class:356 +msgid "DnsClient Example" +msgstr "Ejemplo de Cliente DNS" + +#: FMain.class:361 +msgid "Go!" +msgstr "¡Ir!" + +#: FMain.class:371 +msgid "gambas.sourceforge.net" +msgstr "gambas.sourceforge.net" + +#: FMain.class:376 +msgid "www.kudla.org" +msgstr "www.kudla.org" + +#: FMain.class:381 +msgid "www.freshmeat.net" +msgstr "www.freshmeat.net" + +#: FMain.class:422 +msgid "Cancel" +msgstr "Cancelar" + +#: FMain.class:427 +msgid "www.slashdot.org" +msgstr "www.slashdot.org" + +#: FMain.class:432 +msgid "www.rpmfind.net" +msgstr "www.rpmfind.net" + +#: FMain.class:437 +msgid "www.debian.org" +msgstr "www.debian.org" + +#: FMain.class:442 +msgid "www.mageia.org" +msgstr "www.mageia.org" + +#: FMain.class:481 +msgid "Host Name to IP" +msgstr "Nombre de servidor a IP" + +#: FMain.class:481 +msgid "IP to Host Name" +msgstr "IP a nombre de servidor" + +#: FMain.class:486 +msgid "<< Copy" +msgstr "<< Copiar" + +#: FMain.class:491 +msgid "Asynchronous" +msgstr "Asincrónimo" diff --git a/app/examples/Networking/DnsClient/.lang/nl.po b/app/examples/Networking/DnsClient/.lang/nl.po new file mode 100644 index 00000000..70de5745 --- /dev/null +++ b/app/examples/Networking/DnsClient/.lang/nl.po @@ -0,0 +1,92 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2014-09-22 00:24+0100\n" +"Last-Translator: Willy Raets \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "DNS client example" +msgstr "DNS cliënt voorbeeld" + +#: FMain.class:14 +msgid "Not Found" +msgstr "Niet gevonden" + +#: FMain.form:29 +msgid "DnsClient Example" +msgstr "DnsCliënt Voorbeeld" + +#: FMain.form:34 +msgid "Go!" +msgstr "-" + +#: FMain.form:44 +msgid "gambas.sourceforge.net" +msgstr "-" + +#: FMain.form:49 +msgid "www.kudla.org" +msgstr "-" + +#: FMain.form:54 +msgid "www.freshmeat.net" +msgstr "-" + +#: FMain.form:95 +msgid "Cancel" +msgstr "Annuleer" + +#: FMain.form:100 +msgid "www.slashdot.org" +msgstr "-" + +#: FMain.form:105 +msgid "www.rpmfind.net" +msgstr "-" + +#: FMain.form:110 +msgid "www.debian.org" +msgstr "-" + +#: FMain.form:115 +msgid "www.mageia.org" +msgstr "-" + +#: FMain.form:154 +msgid "Host Name to IP" +msgstr "Host naam naar IP" + +#: FMain.form:154 +msgid "IP to Host Name" +msgstr "IP naar Host naam" + +#: FMain.form:159 +msgid "<< Copy" +msgstr "<< Kopiëer" + +#: FMain.form:164 +msgid "Asynchronous" +msgstr "Asynchrone" + +#: FMain.class:217 +msgid "Finished" +msgstr "Beëindigt" + +#: FMain.class:251 +msgid "Cancelled" +msgstr "Geannuleerd" + +#: FMain.class:279 +msgid "Write here 7 host names then press GO!" +msgstr "Noteer hier 7 host namen en druk GO!" + +#: FMain.class:281 +msgid "Write here 7 IP addresses then press GO!" +msgstr "Noteer hier 7 IP adressen en druk GO!" + diff --git a/app/examples/Networking/DnsClient/.lang/ru.po b/app/examples/Networking/DnsClient/.lang/ru.po new file mode 100644 index 00000000..76f7246a --- /dev/null +++ b/app/examples/Networking/DnsClient/.lang/ru.po @@ -0,0 +1,98 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-06-04 19:30 UTC\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: .project:1 +msgid "DNS client example" +msgstr "Пример DNS-клиента" + +#: FMain.class:14 +msgid "Not Found" +msgstr "Не найдено" + +#: FMain.class:217 +msgid "Finished" +msgstr "Готово" + +#: FMain.class:251 +msgid "Cancelled" +msgstr "Отменено" + +#: FMain.class:279 +msgid "Write here 7 host names then press GO!" +msgstr "Напишите здесь 7 имён хостов и нажмите 'Вперёд'!" + +#: FMain.class:281 +msgid "Write here 7 IP addresses then press GO!" +msgstr "Напишите здесь 7 IP-адресов и нажмите 'Вперёд'!" + +#: FMain.form:29 +msgid "DnsClient Example" +msgstr "Пример DNS-клиента" + +#: FMain.form:34 +msgid "Go!" +msgstr "Вперёд!" + +#: FMain.form:90 +msgid "Cancel" +msgstr "Отмена" + +#: FMain.form:144 +msgid "Host Name to IP" +msgstr "Имя хоста по IP" + +#: FMain.form:144 +msgid "IP to Host Name" +msgstr "IP к имени хоста" + +#: FMain.form:150 +msgid "<< Copy" +msgstr "<< Копировать" + +#: FMain.form:155 +msgid "Asynchronous" +msgstr "Асинхронный" + +#~ msgid "www.mageia.org" +#~ msgstr "www.mageia.org" + +#~ msgid "www.debian.org" +#~ msgstr "www.debian.org" + +#~ msgid "www.rpmfind.net" +#~ msgstr "www.rpmfind.net" + +#~ msgid "www.slashdot.org" +#~ msgstr "www.slashdot.org" + +#~ msgid "www.freshmeat.net" +#~ msgstr "www.freshmeat.net" + +#~ msgid "www.kudla.org" +#~ msgstr "www.kudla.org" + +#~ msgid "gambas.sourceforge.net" +#~ msgstr "gambas.sourceforge.net" diff --git a/app/examples/Networking/DnsClient/.project b/app/examples/Networking/DnsClient/.project new file mode 100644 index 00000000..731be02f --- /dev/null +++ b/app/examples/Networking/DnsClient/.project @@ -0,0 +1,18 @@ +# Gambas Project File 3.0 +Title=DNS client example +Startup=FMain +Icon=dnsclient.png +Version=3.13.90 +VersionFile=1 +Component=gb.image +Component=gb.gui +Component=gb.net +Environment="GB_GUI=gb.gtk" +TabSize=2 +Translate=1 +Language=fr +Maintainer=benoit +Vendor=Princeton +Address=benoit@desnouettes +License=General Public Licence +Packager=1 diff --git a/app/examples/Networking/DnsClient/.src/FMain.class b/app/examples/Networking/DnsClient/.src/FMain.class new file mode 100644 index 00000000..146aa10a --- /dev/null +++ b/app/examples/Networking/DnsClient/.src/FMain.class @@ -0,0 +1,308 @@ +' Gambas class file +'*********************************** +' We define 7 dns objects +'*********************************** +Private A As DnsClient +Private B As DnsClient +Private C As DnsClient +Private D As DnsClient +Private E As DnsClient +Private F As DnsClient +Private G As DnsClient + +Private Working As Integer +Private sNoResult As String = ("Not Found") + +Public Sub Button1_Click() + Label2.Text = "" + Label3.Text = "" + Label4.Text = "" + Label6.Text = "" + Label7.Text = "" + Label8.Text = "" + Label9.Text = "" + Working = 7 + Button1.Enabled = False + Button1.Enabled = False + ComboBox1.Enabled = False + Button3.Enabled = False + CheckBox1.Enabled = False + Label5.Text = "|" + Timer1.Delay = 200 + Timer1.Enabled = True + Select Case ComboBox1.Index + Case 0 + A.HostName = TextBox1.Text + B.HostName = TextBox2.Text + C.HostName = TextBox3.Text + D.HostName = TextBox4.Text + E.HostName = TextBox5.Text + F.HostName = TextBox6.Text + G.HostName = TextBox7.Text + A.GetHostIP() + B.GetHostIP() + C.GetHostIP() + D.GetHostIP() + E.GetHostIP() + F.GetHostIP() + G.GetHostIP() + Case 1 + A.HostIP = TextBox1.Text + B.HostIP = TextBox2.Text + C.HostIP = TextBox3.Text + D.HostIP = TextBox4.Text + E.HostIP = TextBox5.Text + F.HostIP = TextBox6.Text + G.HostIP = TextBox7.Text + A.GetHostName() + B.GetHostName() + C.GetHostName() + D.GetHostName() + E.GetHostName() + F.GetHostName() + G.GetHostName() + End Select + +End + +Public Sub A_Finished() + + Select Case ComboBox1.index + Case 0 + If A.HostIP = "" Then + Label2.Text = sNoResult + Else + Label2.Text = A.HostIP + End If + Case 1 + If A.HostName = "" Then + Label2.Text = sNoResult + Else + Label2.Text = A.HostName + End If + End Select + Working = working - 1 + +End + +Public Sub B_Finished() + + Select Case ComboBox1.index + Case 0 + If B.HostIP = "" Then + Label3.Text = sNoResult + Else + Label3.Text = B.HostIP + End If + Case 1 + If B.HostName = "" Then + Label3.Text = sNoResult + Else + Label3.Text = B.HostName + End If + End Select + Working = working - 1 + +End + +Public Sub C_Finished() + + Select Case ComboBox1.index + Case 0 + If C.HostIP = "" Then + Label4.Text = sNoResult + Else + Label4.Text = C.HostIP + End If + Case 1 + If C.HostName = "" Then + Label4.Text = sNoResult + Else + Label4.Text = C.HostName + End If + End Select + Working = working - 1 + +End + +Public Sub D_Finished() + + Select Case ComboBox1.index + Case 0 + If D.HostIP = "" Then + Label6.Text = sNoResult + Else + Label6.Text = D.HostIP + End If + Case 1 + If D.HostName = "" Then + Label6.Text = sNoResult + Else + Label6.Text = D.HostName + End If + End Select + Working = working - 1 + +End + +Public Sub E_Finished() + + Select Case ComboBox1.index + Case 0 + If E.HostIP = "" Then + Label7.Text = sNoResult + Else + Label7.Text = E.HostIP + End If + Case 1 + If E.HostName = "" Then + Label7.Text = sNoResult + Else + Label7.Text = E.HostName + End If + End Select + Working = working - 1 + +End + +Public Sub F_Finished() + + Select Case ComboBox1.index + Case 0 + If F.HostIP = "" Then + Label8.Text = sNoResult + Else + Label8.Text = F.HostIP + End If + Case 1 + If F.HostName = "" Then + Label8.Text = sNoResult + Else + Label8.Text = F.HostName + End If + End Select + Working = working - 1 + +End + +Public Sub G_Finished() + + Select Case ComboBox1.index + Case 0 + If G.HostIP = "" Then + Label9.Text = sNoResult + Else + Label9.Text = G.HostIP + End If + Case 1 + If G.HostName = "" Then + Label9.Text = sNoResult + Else + Label9.Text = G.HostName + End If + End Select + Working = working - 1 + +End + + + + + + +Public Sub Timer1_Timer() + + Timer1.Enabled = False + If Working = 0 Then + Label5.Text = ("Finished") + Button1.Enabled = True + Button3.Enabled = True + ComboBox1.Enabled = True + CheckBox1.Enabled = True + Else + Select Case Label5.Text + Case "|" + Label5.Text = "/" + Case "/" + Label5.Text = "-" + Case "-" + Label5.Text = "\\" + Case "\\" + Label5.Text = "|" + End Select + Timer1.Delay = 200 + Timer1.Enabled = True + + End If + +End + +Public Sub Button2_Click() + + If Timer1.Enabled = True Then + Timer1.Enabled = False + A.Stop() + B.Stop() + C.Stop() + D.Stop() + E.Stop() + F.Stop() + G.Stop() + Label5.Text = ("Cancelled") + Working = 0 + Button1.Enabled = True + ComboBox1.Enabled = True + Button3.Enabled = True + CheckBox1.Enabled = True + End If + +End + +Public Sub Form_Open() + + A = New DnsClient As "A" + B = New DnsClient As "B" + C = New DnsClient As "C" + D = New DnsClient As "D" + E = New DnsClient As "E" + F = New DnsClient As "F" + G = New DnsClient As "G" + CheckBox1_Click + ComboBox1_Click + Working = 0 +End + +Public Sub ComboBox1_Click() + + Select Case ComboBox1.Index + Case 0 + Label1.Text = ("Write here 7 host names then press GO!") + Case 1 + Label1.Text = ("Write here 7 IP addresses then press GO!") + End Select +End + +Public Sub Button3_Click() + + TextBox1.Text = Label2.Text + TextBox2.Text = Label3.Text + TextBox3.Text = Label4.Text + TextBox4.Text = Label6.Text + TextBox5.Text = Label7.Text + TextBox6.Text = Label8.Text + TextBox7.Text = Label9.Text + + +End + +Public Sub CheckBox1_Click() + + A.ASync = CheckBox1.Value + B.ASync = CheckBox1.Value + C.ASync = CheckBox1.Value + D.ASync = CheckBox1.Value + E.ASync = CheckBox1.Value + F.ASync = CheckBox1.Value + G.ASync = CheckBox1.Value + +End diff --git a/app/examples/Networking/DnsClient/.src/FMain.form b/app/examples/Networking/DnsClient/.src/FMain.form new file mode 100644 index 00000000..8e0f157a --- /dev/null +++ b/app/examples/Networking/DnsClient/.src/FMain.form @@ -0,0 +1,119 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(26,20,63,51) + Text = ("DnsClient Example") + Resizable = False + { Button1 Button + MoveScaled(1,45,16,4) + Text = ("Go!") + } + { Label1 Label + MoveScaled(1,6,61,4) + } + { TextBox1 TextBox + MoveScaled(1,11,28,4) + #Translate = False + Text = "gambas.sourceforge.net" + } + { TextBox2 TextBox + MoveScaled(1,15,28,4) + #Translate = False + Text = "www.kudla.org" + } + { TextBox3 TextBox + MoveScaled(1,19,28,4) + #Translate = False + Text = "www.freshmeat.net" + } + { Label2 Label + MoveScaled(30,11,32,4) + Font = Font["Bold"] + Background = &H5500FF& + Foreground = &HFFFF00& + } + { Label3 Label + MoveScaled(30,15,32,4) + Font = Font["Bold"] + Background = &H5500FF& + Foreground = &HFFFF00& + } + { Label4 Label + MoveScaled(30,19,32,4) + Font = Font["Bold"] + Background = &H5500FF& + Foreground = &HFFFF00& + } + { Timer1 #Timer + #MoveScaled(25.625,37.625) + } + { Label5 Label + MoveScaled(18,45,27,4) + Font = Font["12,Bold"] + Background = &HAA0000& + Foreground = &HFFFFFF& + Alignment = Align.Center + } + { Button2 Button + MoveScaled(46,45,16,4) + Text = ("Cancel") + } + { TextBox4 TextBox + MoveScaled(1,23,28,4) + #Translate = False + Text = "www.slashdot.org" + } + { TextBox5 TextBox + MoveScaled(1,27,28,4) + #Translate = False + Text = "www.rpmfind.net" + } + { TextBox6 TextBox + MoveScaled(1,31,28,4) + #Translate = False + Text = "www.debian.org" + } + { TextBox7 TextBox + MoveScaled(1,35,28,4) + #Translate = False + Text = "www.mageia.org" + } + { Label6 Label + MoveScaled(30,23,32,4) + Font = Font["Bold"] + Background = &H5500FF& + Foreground = &HFFFF00& + } + { Label7 Label + MoveScaled(30,27,32,4) + Font = Font["Bold"] + Background = &H5500FF& + Foreground = &HFFFF00& + } + { Label8 Label + MoveScaled(30,31,32,4) + Font = Font["Bold"] + Background = &H5500FF& + Foreground = &HFFFF00& + } + { Label9 Label + MoveScaled(30,35,32,4) + Font = Font["Bold"] + Background = &H5500FF& + Foreground = &HFFFF00& + } + { ComboBox1 ComboBox + MoveScaled(1,1,37,4) + ReadOnly = True + List = [("Host Name to IP"), ("IP to Host Name")] + Text = (" ") + } + { Button3 Button + MoveScaled(18,40,23,4) + Text = ("<< Copy") + } + { CheckBox1 CheckBox + MoveScaled(41,1,21,4) + Text = ("Asynchronous") + } +} diff --git a/app/examples/Networking/DnsClient/dnsclient.png b/app/examples/Networking/DnsClient/dnsclient.png new file mode 100644 index 0000000000000000000000000000000000000000..5c2ca2807566beed571e49547ce8f3e792b3848b GIT binary patch literal 1808 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, 2007-2010. +# +# +msgid "" +msgstr "" +"Project-Id-Version: HTTPGet\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2010-12-17 01:10+0100\n" +"Last-Translator: Jordi Sayol \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: FConfig.form:46 +msgid "127.0.0.1:3128" +msgstr "-" + +#: FConfig.form:87 +msgid "Authentication" +msgstr "Autenticació" + +#: F.form:82 +msgid "Basic" +msgstr "Bàsic" + +#: F.class:243 +msgid "Cancelled by user" +msgstr "Canceŀlat per l'usuari" + +#: FConfig.form:65 +msgid "Close" +msgstr "Tanca" + +#: F.form:91 +msgid "&Configuration..." +msgstr "&Configuració..." + +#: F.class:142 +msgid "Connected, waiting for reply..." +msgstr "Connectat, s'està esperant resposta..." + +#: F.class:101 +msgid "Connecting..." +msgstr "S'està connectant..." + +#: FConfig.form:60 +msgid "Cookies file (if you leave it blank HttpClient will not manage cookies)" +msgstr "Fitxer de galetes (si el deixeu en blanc, l'HttpClient no gestionarà les galetes)" + +#: F.form:82 +msgid "DIGEST" +msgstr "-" + +#: F.class:188 +msgid "Error " +msgstr "-" + +#: F.form:24 +msgid "GET!" +msgstr "OBTÉ!" + +#: F.form:82 +msgid "GSS" +msgstr "-" + +#: .project:1 +msgid "HTTP client GET example" +msgstr "Exemple GET de client HTTP" + +#: F.form:43 +msgid "http://gambasdoc.org/help" +msgstr "-" + +#: F.form:82 FConfig.form:25 +msgid "NTLM" +msgstr "-" + +#: F.class:203 +msgid "OK" +msgstr "D'acord" + +#: F.form:62 +msgid "Page needs authorization" +msgstr "La pàgina necessita autorització" + +#: F.form:74 FConfig.form:73 +msgid "Password" +msgstr "Contrasenya" + +#: FConfig.form:25 +msgid "Plain" +msgstr "Pla" + +#: F.class:157 +msgid "Receiving data..." +msgstr "S'està rebent dades..." + +#: F.form:57 +msgid "Stop" +msgstr "Atura" + +#: FConfig.form:55 +msgid "Update cookies file" +msgstr "Actualitza el fitxer de galetes" + +#: F.form:38 +msgid "URL :" +msgstr "-" + +#: FConfig.form:41 +msgid "Use Proxy" +msgstr "Usa servidor intermediari" + +#: F.form:68 FConfig.form:80 +msgid "User" +msgstr "Usuari" + diff --git a/app/examples/Networking/HTTPGet/.lang/cs.po b/app/examples/Networking/HTTPGet/.lang/cs.po new file mode 100644 index 00000000..c21950c1 --- /dev/null +++ b/app/examples/Networking/HTTPGet/.lang/cs.po @@ -0,0 +1,121 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "HTTP client GET example" +msgstr "Příklad GET klienta" + +#: F.class:101 +msgid "Connecting..." +msgstr "Připojování..." + +#: F.class:142 +msgid "Connected, waiting for reply..." +msgstr "Připojeno, čekám na odpověď..." + +#: F.class:158 +msgid "Receiving data..." +msgstr "Přijímám data..." + +#: F.class:162 +msgid "&1 bytes" +msgstr "-" + +#: F.class:195 +msgid "Error " +msgstr "Chyba" + +#: F.class:210 +msgid "OK" +msgstr "-" + +#: F.class:250 +msgid "Cancelled by user" +msgstr "Zrušeno uživatelem" + +#: F.form:24 +msgid "GET!" +msgstr "-" + +#: F.form:38 +msgid "URL :" +msgstr "-" + +#: F.form:43 +msgid "http://gambasdoc.org/help" +msgstr "-" + +#: F.form:48 +msgid "Stop" +msgstr "-" + +#: F.form:53 +msgid "Page needs authorization" +msgstr "Autorizace na stránce" + +#: F.form:59 FConfig.form:80 +msgid "User" +msgstr "Uživatel" + +#: F.form:65 FConfig.form:73 +msgid "Password" +msgstr "Heslo" + +#: F.form:73 +msgid "Basic" +msgstr "-" + +#: F.form:73 +msgid "DIGEST" +msgstr "-" + +#: F.form:73 +msgid "GSS" +msgstr "-" + +#: F.form:73 FConfig.form:25 +msgid "NTLM" +msgstr "-" + +#: F.form:82 +msgid "&Configuration..." +msgstr "&Konfigurace..." + +#: FConfig.form:25 +msgid "Plain" +msgstr "-" + +#: FConfig.form:41 +msgid "Use Proxy" +msgstr "Užít proxy" + +#: FConfig.form:46 +msgid "127.0.0.1:3128" +msgstr "-" + +#: FConfig.form:55 +msgid "Update cookies file" +msgstr "Aktualizuj soubor cookie" + +#: FConfig.form:60 +msgid "Cookies file (if you leave it blank HttpClient will not manage cookies)" +msgstr "Soubor cookie (když nezaškrknete tak HttpClient nezpracuje cookie)" + +#: FConfig.form:65 +msgid "Close" +msgstr "Zavřít" + +#: FConfig.form:87 +msgid "Authentication" +msgstr "Autorizace" + diff --git a/app/examples/Networking/HTTPGet/.lang/de.po b/app/examples/Networking/HTTPGet/.lang/de.po new file mode 100644 index 00000000..baf3c9c0 --- /dev/null +++ b/app/examples/Networking/HTTPGet/.lang/de.po @@ -0,0 +1,117 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "HTTP client GET example" +msgstr "Beispiel für HTTP-Client GET" + +#: F.class:101 +msgid "Connecting..." +msgstr "Verbinden" + +#: F.class:142 +msgid "Connected, waiting for reply..." +msgstr "Verbunden, warte auf Antwort..." + +#: F.class:157 +msgid "Receiving data..." +msgstr "Empfange Daten..." + +#: F.class:188 +msgid "Error " +msgstr "Fehler" + +#: F.class:203 +msgid "OK" +msgstr "-" + +#: F.class:243 +msgid "Cancelled by user" +msgstr "Durch Benutzer abgebrochen" + +#: F.form:24 +msgid "GET!" +msgstr "-" + +#: F.form:38 +msgid "URL :" +msgstr "-" + +#: F.form:43 +msgid "http://gambasdoc.org/help" +msgstr "-" + +#: F.form:57 +msgid "Stop" +msgstr "-" + +#: F.form:62 +msgid "Page needs authorization" +msgstr "Seite verlangt Authentifizierung" + +#: F.form:68 FConfig.form:80 +msgid "User" +msgstr "Benutzer" + +#: F.form:74 FConfig.form:73 +msgid "Password" +msgstr "Passwort" + +#: F.form:82 +msgid "Basic" +msgstr "Einfach" + +#: F.form:82 +msgid "DIGEST" +msgstr "-" + +#: F.form:82 +msgid "GSS" +msgstr "-" + +#: F.form:82 FConfig.form:25 +msgid "NTLM" +msgstr "-" + +#: F.form:91 +msgid "&Configuration..." +msgstr "&Konfiguration..." + +#: FConfig.form:25 +msgid "Plain" +msgstr "Einfach" + +#: FConfig.form:41 +msgid "Use Proxy" +msgstr "Proxy verwenden" + +#: FConfig.form:46 +msgid "127.0.0.1:3128" +msgstr "-" + +#: FConfig.form:55 +msgid "Update cookies file" +msgstr "Cookie-Datei neu laden" + +#: FConfig.form:60 +msgid "Cookies file (if you leave it blank HttpClient will not manage cookies)" +msgstr "Cookie-Datei (wenn leer, verwaltet der HTTP-Client keine Cookies)" + +#: FConfig.form:65 +msgid "Close" +msgstr "Schließen" + +#: FConfig.form:87 +msgid "Authentication" +msgstr "Authentifizierung" + diff --git a/app/examples/Networking/HTTPGet/.lang/en_GB.po b/app/examples/Networking/HTTPGet/.lang/en_GB.po new file mode 100644 index 00000000..e1dc855c --- /dev/null +++ b/app/examples/Networking/HTTPGet/.lang/en_GB.po @@ -0,0 +1,120 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "HTTP client GET example" +msgstr "-" + +#: F.class:101 +msgid "Connecting..." +msgstr "-" + +#: F.class:142 +msgid "Connected, waiting for reply..." +msgstr "-" + +#: F.class:158 +msgid "Receiving data..." +msgstr "-" + +#: F.class:162 +msgid "&1 bytes" +msgstr "-" + +#: F.class:195 +msgid "Error " +msgstr "-" + +#: F.class:210 +msgid "OK" +msgstr "-" + +#: F.class:250 +msgid "Cancelled by user" +msgstr "-" + +#: F.form:24 +msgid "GET!" +msgstr "-" + +#: F.form:38 +msgid "URL :" +msgstr "-" + +#: F.form:43 +msgid "http://gambasdoc.org/help" +msgstr "-" + +#: F.form:48 +msgid "Stop" +msgstr "-" + +#: F.form:53 +msgid "Page needs authorization" +msgstr "-" + +#: F.form:59 FConfig.form:80 +msgid "User" +msgstr "-" + +#: F.form:65 FConfig.form:73 +msgid "Password" +msgstr "-" + +#: F.form:73 +msgid "Basic" +msgstr "-" + +#: F.form:73 +msgid "DIGEST" +msgstr "-" + +#: F.form:73 +msgid "GSS" +msgstr "-" + +#: F.form:73 FConfig.form:25 +msgid "NTLM" +msgstr "-" + +#: F.form:82 +msgid "&Configuration..." +msgstr "-" + +#: FConfig.form:25 +msgid "Plain" +msgstr "-" + +#: FConfig.form:41 +msgid "Use Proxy" +msgstr "-" + +#: FConfig.form:46 +msgid "127.0.0.1:3128" +msgstr "-" + +#: FConfig.form:55 +msgid "Update cookies file" +msgstr "-" + +#: FConfig.form:60 +msgid "Cookies file (if you leave it blank HttpClient will not manage cookies)" +msgstr "-" + +#: FConfig.form:65 +msgid "Close" +msgstr "-" + +#: FConfig.form:87 +msgid "Authentication" +msgstr "-" diff --git a/app/examples/Networking/HTTPGet/.lang/es.po b/app/examples/Networking/HTTPGet/.lang/es.po new file mode 100644 index 00000000..3f8781f1 --- /dev/null +++ b/app/examples/Networking/HTTPGet/.lang/es.po @@ -0,0 +1,91 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: FConfig.class:106 +msgid "Plain" +msgstr "Plano" + +#: FConfig.class:106 F.class:382 +msgid "NTLM" +msgstr "NTLM" + +#: FConfig.class:112 +msgid "Authentication" +msgstr "Autenticación" + +#: FConfig.class:118 F.class:367 +msgid "User" +msgstr "Usuario" + +#: FConfig.class:124 F.class:373 +msgid "Password" +msgstr "Contraseña" + +#: FConfig.class:142 +msgid "Use Proxy" +msgstr "Usar Proxy" + +#: FConfig.class:147 +msgid "127.0.0.1:3128" +msgstr "127.0.0.1:3128" + +#: FConfig.class:152 +msgid "TextBox1" +msgstr "TextBox1" + +#: FConfig.class:157 +msgid "Update cookies file" +msgstr "Actualizar achivos cookies" + +#: FConfig.class:162 +msgid "Cookies file (if you leave it blank HttpClient will not manage cookies)" +msgstr "Archivos Cookies (si lo deja en blanco HttpClient no manejará cookies)" + +#: FConfig.class:167 +msgid "Close" +msgstr "Cerrar" + +#: F.class:322 +msgid "GET!" +msgstr "¡Obtener!" + +#: F.class:337 +msgid "URL :" +msgstr "URL :" + +#: F.class:342 +msgid "http://gambasdoc.org/help" +msgstr "http://gambasdoc.org/help" + +#: F.class:356 +msgid "Stop" +msgstr "Detener" + +#: F.class:361 +msgid "Page needs authorization" +msgstr "Página necesita autorización" + +#: F.class:382 +msgid "Basic" +msgstr "Básico" + +#: F.class:382 +msgid "DIGEST" +msgstr "DIGEST" + +#: F.class:382 +msgid "GSS" +msgstr "GSS" + +#: F.class:390 +msgid "&Configuration..." +msgstr "&Configuración..." diff --git a/app/examples/Networking/HTTPGet/.lang/nl.po b/app/examples/Networking/HTTPGet/.lang/nl.po new file mode 100644 index 00000000..5290baf2 --- /dev/null +++ b/app/examples/Networking/HTTPGet/.lang/nl.po @@ -0,0 +1,120 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2014-09-22 13:13+0100\n" +"Last-Translator: Willy Raets \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "HTTP client GET example" +msgstr "HTTP client GET voorbeeld" + +#: F.form:24 +msgid "GET!" +msgstr "-" + +#: F.form:38 +msgid "URL :" +msgstr "-" + +#: F.form:43 +msgid "http://gambasdoc.org/help" +msgstr "-" + +#: F.form:48 +msgid "Stop" +msgstr "-" + +#: F.form:53 +msgid "Page needs authorization" +msgstr "Pagina vereist authorisatie" + +#: F.form:59 FConfig.form:80 +msgid "User" +msgstr "Gebruiker" + +#: F.form:65 FConfig.form:73 +msgid "Password" +msgstr "Wachtwoord" + +#: F.form:73 +msgid "Basic" +msgstr "-" + +#: F.form:73 FConfig.form:25 +msgid "NTLM" +msgstr "-" + +#: F.form:73 +msgid "DIGEST" +msgstr "-" + +#: F.form:73 +msgid "GSS" +msgstr "-" + +#: F.form:82 +msgid "&Configuration..." +msgstr "&Configuratie..." + +#: F.class:101 +msgid "Connecting..." +msgstr "Verbinding maken..." + +#: F.class:142 +msgid "Connected, waiting for reply..." +msgstr "Verbonden, wacht op antwoord..." + +#: F.class:158 +msgid "Receiving data..." +msgstr "Ontvang data..." + +#: F.class:162 +msgid "&1 bytes" +msgstr "-" + +#: F.class:195 +msgid "Error " +msgstr "Fout" + +#: F.class:210 +msgid "OK" +msgstr "-" + +#: F.class:250 +msgid "Cancelled by user" +msgstr "Geannuleerd door gebruiker" + +#: FConfig.form:25 +msgid "Plain" +msgstr "Plat" + +#: FConfig.form:41 +msgid "Use Proxy" +msgstr "Gebruik Proxy" + +#: FConfig.form:46 +msgid "127.0.0.1:3128" +msgstr "-" + +#: FConfig.form:55 +msgid "Update cookies file" +msgstr "Update cookies bestand" + +#: FConfig.form:60 +msgid "Cookies file (if you leave it blank HttpClient will not manage cookies)" +msgstr "Cookies bestand (indien leeg zal HTTP cliënt geen cookies beheren)" + +#: FConfig.form:65 +msgid "Close" +msgstr "Sluiten" + +#: FConfig.form:87 +msgid "Authentication" +msgstr "Autenticatie" + diff --git a/app/examples/Networking/HTTPGet/.lang/ru.po b/app/examples/Networking/HTTPGet/.lang/ru.po new file mode 100644 index 00000000..042fa962 --- /dev/null +++ b/app/examples/Networking/HTTPGet/.lang/ru.po @@ -0,0 +1,144 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-30 09:26+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Networking/HTTPGet/.project:23 +msgid "HTTP client GET example" +msgstr "Пример GET клиента HTTP" + +#: app/examples/Networking/HTTPGet/.project:24 +msgid "" +"HttpClient GET request example.\n" +"\n" +"This example how to send a GET HTTP request to a server and get the response. You can configure an HTTP proxy if needed." +msgstr "" +"Пример GET-запроса HTTP-клиента.\n" +"\n" +"В этом примере показано, как отправить GET HTTP запрос на сервер и получить ответ. При необходимости вы можете настроить HTTP-прокси." + +#: app/examples/Networking/HTTPGet/.src/FConfig.form:10 +msgid "Plain" +msgstr "Обычный" + +#: app/examples/Networking/HTTPGet/.src/FConfig.form:10 app/examples/Networking/HTTPGet/.src/FHttpGet.form:48 +msgid "NTLM" +msgstr "NTLM" + +#: app/examples/Networking/HTTPGet/.src/FConfig.form:23 +msgid "Use Proxy" +msgstr "Использовать прокси" + +#: app/examples/Networking/HTTPGet/.src/FConfig.form:27 +msgid "127.0.0.1:3128" +msgstr "127.0.0.1:3128" + +#: app/examples/Networking/HTTPGet/.src/FConfig.form:34 +msgid "Update cookies file" +msgstr "Обновить куки-файл" + +#: app/examples/Networking/HTTPGet/.src/FConfig.form:38 +msgid "Cookies file (if you leave it blank HttpClient will not manage cookies)" +msgstr "Куки-файл (если вы оставите его пустым, клиент Http не будет управлять куки-файлами)" + +#: app/examples/Networking/HTTPGet/.src/FConfig.form:42 +msgid "Close" +msgstr "Закрыть" + +#: app/examples/Networking/HTTPGet/.src/FConfig.form:49 app/examples/Networking/HTTPGet/.src/FHttpGet.form:41 +msgid "Password" +msgstr "Пароль" + +#: app/examples/Networking/HTTPGet/.src/FConfig.form:55 app/examples/Networking/HTTPGet/.src/FHttpGet.form:36 +msgid "User" +msgstr "Пользователь" + +#: app/examples/Networking/HTTPGet/.src/FConfig.form:61 +msgid "Authentication" +msgstr "Аутентификация" + +#: app/examples/Networking/HTTPGet/.src/FHttpGet.class:97 +msgid "Connecting..." +msgstr "Соединение..." + +#: app/examples/Networking/HTTPGet/.src/FHttpGet.class:138 +msgid "Connected, waiting for reply..." +msgstr "Подключено, в ожидании ответа..." + +#: app/examples/Networking/HTTPGet/.src/FHttpGet.class:155 +msgid "Receiving data..." +msgstr "Получение данных..." + +#: app/examples/Networking/HTTPGet/.src/FHttpGet.class:159 +msgid "&1 bytes" +msgstr "&1 байт" + +#: app/examples/Networking/HTTPGet/.src/FHttpGet.class:191 +msgid "Error " +msgstr "Ошибка " + +#: app/examples/Networking/HTTPGet/.src/FHttpGet.class:205 +msgid "OK" +msgstr "ОК" + +#: app/examples/Networking/HTTPGet/.src/FHttpGet.class:246 +msgid "Cancelled by user" +msgstr "Отменено пользователем" + +#: app/examples/Networking/HTTPGet/.src/FHttpGet.form:8 +msgid "GET!" +msgstr "GET!" + +#: app/examples/Networking/HTTPGet/.src/FHttpGet.form:19 +msgid "URL :" +msgstr "URL :" + +#: app/examples/Networking/HTTPGet/.src/FHttpGet.form:23 +msgid "http://gambaswiki.org/wiki" +msgstr "http://gambaswiki.org/wiki" + +#: app/examples/Networking/HTTPGet/.src/FHttpGet.form:27 +msgid "Stop" +msgstr "Стоп" + +#: app/examples/Networking/HTTPGet/.src/FHttpGet.form:31 +msgid "Page needs authorization" +msgstr "Страница требует авторизации" + +#: app/examples/Networking/HTTPGet/.src/FHttpGet.form:48 +msgid "Basic" +msgstr "Основы" + +#: app/examples/Networking/HTTPGet/.src/FHttpGet.form:48 +msgid "DIGEST" +msgstr "DIGEST" + +#: app/examples/Networking/HTTPGet/.src/FHttpGet.form:48 +msgid "GSS" +msgstr "GSS" + +#: app/examples/Networking/HTTPGet/.src/FHttpGet.form:56 +msgid "&Configuration..." +msgstr "Конфигурация..." + diff --git a/app/examples/Networking/HTTPGet/.project b/app/examples/Networking/HTTPGet/.project new file mode 100644 index 00000000..70c4d5d9 --- /dev/null +++ b/app/examples/Networking/HTTPGet/.project @@ -0,0 +1,22 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.6.90 +Title=HTTP client GET example +Startup=FHttpGet +Icon=httpclient.png +Version=1.0.0 +Component=gb.image +Component=gb.qt5 +Component=gb.net +Component=gb.net.curl +Component=gb.qt5.ext +Description="HttpClient GET request example.\n\nThis example how to send a GET HTTP request to a server and get the response. You can configure an HTTP proxy if needed." +TabSize=2 +Translate=1 +Language=fr +ControlPublic=1 +Maintainer=benoit +Vendor=Example +Address=benoit@desnouettes +License=General Public Licence +Packager=1 +Tags=Network diff --git a/app/examples/Networking/HTTPGet/.src/ClsParams.class b/app/examples/Networking/HTTPGet/.src/ClsParams.class new file mode 100644 index 00000000..ceea7236 --- /dev/null +++ b/app/examples/Networking/HTTPGet/.src/ClsParams.class @@ -0,0 +1,8 @@ +' Gambas class file +Static Public UseProxy As Boolean +Static Public ProxyHost As String +Static Public ProxyUser As String +Static Public ProxyPwd As String +Static Public ProxyAuth As Integer +Static Public CookiesFile As String +Static Public UpdateCookies As Boolean diff --git a/app/examples/Networking/HTTPGet/.src/FConfig.class b/app/examples/Networking/HTTPGet/.src/FConfig.class new file mode 100644 index 00000000..6a740382 --- /dev/null +++ b/app/examples/Networking/HTTPGet/.src/FConfig.class @@ -0,0 +1,75 @@ +' Gambas class file + +Public Sub ChkProxy_Click() + + + If ChkProxy.Value = True Then + TxtProxy.Enabled = True + LblAuth.Enabled = True + LblProxyUser.Enabled = True + TxtProxyUser.Enabled = True + LblProxyPassword.Enabled = True + TxtProxyPassword.Enabled = True + CmbProxyAuth.Enabled = True + Else + TxtProxy.Enabled = False + LblAuth.Enabled = False + LblProxyUser.Enabled = False + TxtProxyUser.Enabled = False + LblProxyPassword.Enabled = False + TxtProxyPassword.Enabled = False + CmbProxyAuth.Enabled = False + End If + +End + + +Public Sub Form_Open() + + + TxtCookies.Text = ClsParams.CookiesFile + ChkUpdate.Value = ClsParams.UpdateCookies + + ChkProxy.Value = ClsParams.UseProxy + TxtProxy.Text = ClsParams.ProxyHost + TxtProxyUser.Text = ClsParams.ProxyUser + TxtProxyPassword.Text = ClsParams.ProxyPwd + + + Select Case ClsParams.ProxyAuth + Case Net.AuthBasic + CmbProxyAuth.Index = 0 + Case Net.AuthNTLM + CmbProxyAuth.Index = 1 + End Select + + +End + +Public Sub Form_Close() + + ClsParams.CookiesFile = TxtCookies.Text + ClsParams.UpdateCookies = ChkUpdate.Value + + ClsParams.UseProxy = ChkProxy.Value + ClsParams.ProxyHost = TxtProxy.Text + ClsParams.ProxyUser = TxtProxyUser.Text + ClsParams.ProxyPwd = TxtProxyPassword.Text + + If ClsParams.ProxyUser = "" And ClsParams.ProxyPwd = "" Then + ClsParams.ProxyAuth = Net.AuthNone + Else + Select Case CmbProxyAuth.Index + Case 0 + ClsParams.ProxyAuth = Net.AuthBasic + Case 1 + ClsParams.ProxyAuth = Net.AuthNTLM + End Select + End If +End + +Public Sub Button1_Click() + + Me.Close + +End diff --git a/app/examples/Networking/HTTPGet/.src/FConfig.form b/app/examples/Networking/HTTPGet/.src/FConfig.form new file mode 100644 index 00000000..13518228 --- /dev/null +++ b/app/examples/Networking/HTTPGet/.src/FConfig.form @@ -0,0 +1,64 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(34.5714,30.7143,49,45) + Resizable = False + { CmbProxyAuth ComboBox + MoveScaled(27,6,21,4) + Enabled = False + ReadOnly = True + List = [("Plain"), ("NTLM")] + } + { TxtProxyPassword TextBox + MoveScaled(27,16,21,4) + Enabled = False + Password = True + } + { TxtProxyUser TextBox + MoveScaled(27,11,21,4) + Enabled = False + } + { ChkProxy CheckBox + MoveScaled(1,1,26,4) + Text = ("Use Proxy") + } + { TxtProxy TextBox + MoveScaled(27,1,21,4) + Text = ("127.0.0.1:3128") + } + { TxtCookies TextBox + MoveScaled(1,29,47,4) + } + { ChkUpdate CheckBox + MoveScaled(1,34,47,4) + Text = ("Update cookies file") + } + { TextLabel1 TextLabel + MoveScaled(1,22,47,7) + Text = ("Cookies file (if you leave it blank HttpClient will not manage cookies)") + } + { Button1 Button + MoveScaled(16,40,16,4) + Text = ("Close") + Default = True + Cancel = True + } + { LblProxyPassword Label + MoveScaled(1,16,26,4) + Enabled = False + Text = ("Password") + Transparent = True + } + { LblProxyUser Label + MoveScaled(1,11,26,4) + Enabled = False + Text = ("User") + Transparent = True + } + { LblAuth Label + MoveScaled(1,6,26,4) + Enabled = False + Text = ("Authentication") + Transparent = True + } +} diff --git a/app/examples/Networking/HTTPGet/.src/FHttpGet.class b/app/examples/Networking/HTTPGet/.src/FHttpGet.class new file mode 100644 index 00000000..f3b0584b --- /dev/null +++ b/app/examples/Networking/HTTPGet/.src/FHttpGet.class @@ -0,0 +1,285 @@ +' Gambas class file + +'/////////////////////////////////////// +' Here we define a HttpClient object +'/////////////////////////////////////// +'PRIVATE MyHTTP AS HttpClient +'/////////////////////////////// +' This is a buffer I use when +' a link is clicked (ugly hack:) +'/////////////////////////////// +Private CurHost As String + +Public Sub Form_Open() + + '/////////////////////////////////// + ' We set Default configuration values + '/////////////////////////////////// + ClsParams.ProxyHost = "127.0.0.1:3128" + ClsParams.ProxyUser = "" + ClsParams.ProxyPwd = "" + ClsParams.ProxyAuth = Net.AuthNone + ClsParams.CookiesFile = User.Home & "/gbcookies.txt" + '//////////////////////////////////// + ' Now we create the HttpClient object + '//////////////////////////////////// + 'MyHTTP=NEW HttpClient AS "MyHTTP" + +End + +Public Sub Button1_Click() + '///////////////////////////////////////////////// + ' When we press 'Get' button we start 'getting' + ' proccess + '///////////////////////////////////////////////// + + '///////////////////////////////////////////// + ' If user has configured a proxy, we set + ' that values in HttpClient object + '///////////////////////////////////////////// + If ClsParams.UseProxy And ClsParams.ProxyHost <> "" Then + '////////////////////////////////// + ' Host address and port + '////////////////////////////////// + MyHTTP.Proxy.Host = ClsParams.ProxyHost + MyHTTP.Proxy.Type = Net.ProxyHTTP + '////////////////////////////////// + ' If Proxy needs authentication, + ' we set it + '////////////////////////////////// + If ClsParams.ProxyUser <> "" Or ClsParams.ProxyPwd <> "" Then + MyHTTP.Proxy.User = ClsParams.ProxyUser + MyHTTP.Proxy.Password = ClsParams.ProxyPwd + MyHTTP.Proxy.Auth = ClsParams.ProxyAuth + Else + '/////////////////////////////////// + ' No authentication needed + '/////////////////////////////////// + MyHTTP.Proxy.Auth = Net.AuthNone + End If + Else + '////////////////////////////////////// + ' No proxy selected (direct connection) + '////////////////////////////////////// + MyHTTP.Proxy.Host = "" + ' todo authnone + End If + + '///////////////////////////////////////////////// + ' User and Password settings to access to that + ' document (this is a HTTP server authorization, + ' not a Proxy authorization) + '///////////////////////////////////////////////// + ' 1º User and password + If ChkPassword.Value Then + MyHTTP.User = TxtUser.Text + MyHTTP.Password = TxtPassword.Text + ' 2º Authorization type + Select Case CmbAuth.Index + Case 0 + MyHTTP.Auth = Net.AuthBasic + Case 1 + MyHTTP.Auth = Net.AuthNTLM + Case 2 + MyHTTP.Auth = Net.AuthDigest + Case 3 + MyHTTP.Auth = Net.AuthGSSNEGOTIATE + End Select + Else + MyHTTP.User = "" + MyHTTP.Auth = Net.AuthNone + End If + + '////////////////////////////////// + ' A bit of feedback for user... + '////////////////////////////////// + TextArea1.Text = "" + txtInfo.Text = ("Connecting...") + Navigator.Text = "" + + '//////////////////////////////////// + ' URL to Get + '//////////////////////////////////// + MyHTTP.Url = TxtHost.Text + + '//////////////////////////////////// + ' a little buffer for me + '//////////////////////////////////// + CurHost = Mid(MyHTTP.Url, 8) + + '//////////////////////////////////// + ' Cookies + '//////////////////////////////////// + MyHTTP.CookiesFile = ClsParams.CookiesFile + MyHTTP.UpdateCookies = ClsParams.UpdateCookies + + '//////////////////////////////////// + ' Let's get it! + '//////////////////////////////////// + Print MyHTTP.Proxy.Auth + MyHTTP.Get() + + '/////////////////////////////////////////// + ' If we'd want to download remote document + ' to a file, instead of receving it in + ' memory, we could do that: + ' MyHTTP.Get( "FilePath" ) + '/////////////////////////////////////////// + +End + +Public Sub MyHTTP_Connect() + + '/////////////////////////////////////////////// + ' This event from HttpClient raises when + ' we connect successfully with remote server + ' and allows us to give more feed-back to user + '/////////////////////////////////////////////// + txtInfo.Text = ("Connected, waiting for reply...") + +End + +Public Sub MyHTTP_Read() + '/////////////////////////////////////////// + ' This event raises when a new piece of data + ' arrives to us from server, so we read that + ' part of the document + '/////////////////////////////////////////// + + Dim sBuf As String + Dim sText As String + + '///////////////////////////////// + ' more feedback... + '///////////////////////////////// + sText = ("Receiving data...") & " " + If MyHttp.TotalDownloaded Then + sText &= Format(MyHttp.Downloaded / MyHttp.TotalDownloaded, "0 %") + Else + sText &= Subst(("&1 bytes"), MyHttp.Downloaded) + Endif + txtInfo.Text = sText + + '///////////////////////////////// + ' Header of HTTP document received + ' from server + '///////////////////////////////// + If TextArea1.Text = "" Then + TextArea1.Text = MyHTTP.Headers.Join("\n") + End If + + '///////////////////////////////// + ' If really there's data to read, + ' we read it and place it in our + ' "navigator" screen + '////////////////////////////////// + If Lof(MyHTTP) Then + Read #MyHTTP, sBuf, Lof(MyHTTP) + Navigator.Text = Navigator.Text & sBuf + End If + +End + +Public Sub MyHTTP_Error() + + '//////////////////////////// + ' If something fails, this + ' event raises and connection + ' is stopped + '//////////////////////////// + CurHost = "" + txtInfo.Text = ("Error ") & MyHTTP.Status + +End + +Public Sub MyHTTP_Finished() + + '///////////////////////////////////// + ' When all document has been received, + ' this event raises + '///////////////////////////////////// + Dim sBuf As String + '////////////////////////////// + ' feeback... + '////////////////////////////// + txtInfo.Text = ("OK") + If TextArea1.Text = "" Then + TextArea1.Text = MyHTTP.Headers.Join("\n") + End If + + '/////////////////////////////////// + ' we extract all possible data + ' buffered in HttpClient + '/////////////////////////////////// + If Lof(MyHTTP) Then + Read #MyHTTP, sBuf, Lof(MyHTTP) + Navigator.Text = Navigator.Text & sBuf + End If + +End + +Public Sub mnuOptions_Click() + '//////////////////////////////////// + ' If user wants to modify parameters + '//////////////////////////////////// + + FConfig.ShowModal + +End + +Public Sub Form_Close() + + '////////////////////////////////////// + ' When program finishes, we must ensure + ' that we close HttpClient object + '/////////////////////////////////////// + MyHTTP.Stop() + +End + +Public Sub BtnStop_Click() + + '/////////////////////////////////////// + ' If user wants to close the + ' connection... + '/////////////////////////////////////// + If MyHttp.Status > 0 Then txtInfo.Text = ("Cancelled by user") + MyHTTP.Stop() + +End + +Public Function Correct_Url(sCad As String) As String + + If InStr(sCad, "://") Then Return sCad + + If Left(sCad, 1) = "/" Then + If InStr(CurHost, "/") Then CurHost = Left(CurHost, InStr(CurHost, "/") - 1) + Return CurHost & sCad + Else + If Right(CurHost, 1) = "/" Then Return CurHost & sCad + Return CurHost & "/" & sCad + End If + +End + +Public Sub Navigator_Link(Path As String) + + If MyHTTP.Status > 0 Then MyHTTP.Stop() + TxtHost.Text = Correct_Url(Path) + Button1_Click() + +End + +Public Sub ChkPassword_Click() + + If ChkPassword.Value Then + TxtUser.Enabled = True + TxtPassword.Enabled = True + CmbAuth.Enabled = True + Else + TxtUser.Enabled = False + TxtPassword.Enabled = False + CmbAuth.Enabled = False + End If + +End diff --git a/app/examples/Networking/HTTPGet/.src/FHttpGet.form b/app/examples/Networking/HTTPGet/.src/FHttpGet.form new file mode 100644 index 00000000..cc2861fe --- /dev/null +++ b/app/examples/Networking/HTTPGet/.src/FHttpGet.form @@ -0,0 +1,65 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(30,14,104,73) + Resizable = False + { Button1 Button + MoveScaled(1,6,14,4) + Text = ("GET!") + } + { TextArea1 TextArea + MoveScaled(1,11,63,14) + } + { Navigator TextEdit + MoveScaled(1,26,102,46) + ReadOnly = True + } + { Label1 Label + MoveScaled(1,1,7,4) + Text = ("URL :") + } + { TxtHost TextBox + MoveScaled(8,1,56,4) + Text = ("http://gambaswiki.org/wiki") + } + { BtnStop Button + MoveScaled(16,6,14,4) + Text = ("Stop") + } + { ChkPassword CheckBox + MoveScaled(66,6,37,4) + Text = ("Page needs authorization") + } + { TxtUser TextBox + MoveScaled(66,16,37,4) + Enabled = False + Text = ("User") + } + { TxtPassword TextBox + MoveScaled(66,21,37,4) + Enabled = False + Text = ("Password") + Password = True + } + { CmbAuth ComboBox + MoveScaled(66,11,37,4) + Enabled = False + ReadOnly = True + List = [("Basic"), ("NTLM"), ("DIGEST"), ("GSS")] + Text = (" ") + } + { MyHttp #HttpClient + #MoveScaled(27,36) + } + { mnuOptions Button + MoveScaled(66,1,37,4) + Text = ("&Configuration...") + } + { txtInfo Label + MoveScaled(32,6,32,4) + Font = Font["Bold"] + Background = Color.SelectedBackground + Foreground = &HFFFF00& + Padding = 8 + } +} diff --git a/app/examples/Networking/HTTPGet/httpclient.png b/app/examples/Networking/HTTPGet/httpclient.png new file mode 100644 index 0000000000000000000000000000000000000000..613d858f2cbcc49382048288ca7a5b04e9db60be GIT binary patch literal 1768 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, 2007-2010. +# +# +msgid "" +msgstr "" +"Project-Id-Version: HTTPPost\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2010-12-17 01:10+0100\n" +"Last-Translator: Jordi Sayol \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: F.form:114 +msgid "127.0.0.1:3128" +msgstr "-" + +#: F.form:63 +msgid "5" +msgstr "-" + +#: F.class:72 +msgid "Connecting..." +msgstr "S'està connectant..." + +#: F.class:7 +msgid "Error " +msgstr "-" + +#: F.form:73 +msgid "Finally press the Post button >>>" +msgstr "Finalment premeu el botó Envia >>>" + +#: .project:1 +msgid "HTTP client POST example" +msgstr "Exemple POST de client HTTP" + +#: F.form:48 +msgid "HTTP Data" +msgstr "Dades HTTP" + +#: F.form:42 +msgid "HTTP Headers" +msgstr "Capçaleres HTTP" + +#: F.form:23 +msgid "Internet Calculator" +msgstr "Calculadora d'Internet" + +#: F.form:28 +msgid "Post" +msgstr "Envia" + +#: F.form:108 +msgid "Use Proxy" +msgstr "Usa servidor intermediari" + +#: F.form:81 +msgid "Using the power of internet to have a minimal calculator machine!" +msgstr "Usant el poder d'Internet per tenir una mínima màquina de calcular!" + +#: F.class:22 +msgid "Waiting for reply..." +msgstr "S'està esperant resposta..." + +#: F.form:58 +msgid "Write Here Another Number :" +msgstr "Escriviu aquí un altre nombre:" + +#: F.form:53 +msgid "Write Here a Number :" +msgstr "Escriviu aquí un nombre:" + diff --git a/app/examples/Networking/HTTPPost/.lang/cs.po b/app/examples/Networking/HTTPPost/.lang/cs.po new file mode 100644 index 00000000..03288a56 --- /dev/null +++ b/app/examples/Networking/HTTPPost/.lang/cs.po @@ -0,0 +1,72 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "HTTP client POST example" +msgstr "Příklad HTTP POST klienta" + +#: F.class:7 +msgid "Error " +msgstr "Chyba" + +#: F.class:22 +msgid "Waiting for reply..." +msgstr "Čekání na odpověď..." + +#: F.class:72 +msgid "Connecting..." +msgstr "Připojování..." + +#: F.form:23 +msgid "Internet Calculator" +msgstr "Internetová kalkulačka" + +#: F.form:28 +msgid "Post" +msgstr "-" + +#: F.form:42 +msgid "HTTP Headers" +msgstr "HTTP Hlavička" + +#: F.form:48 +msgid "HTTP Data" +msgstr "-" + +#: F.form:53 +msgid "Write Here a Number :" +msgstr "Zapiš zde číslo :" + +#: F.form:58 +msgid "Write Here Another Number :" +msgstr "Zapiš zde ještě číslo :" + +#: F.form:63 +msgid "5" +msgstr "-" + +#: F.form:73 +msgid "Finally press the Post button >>>" +msgstr "Nakonec zmáčkni tlačítko Post >>>" + +#: F.form:81 +msgid "Using the power of internet to have a minimal calculator machine!" +msgstr "Použití síly internetu na minimální kalkulačku!" + +#: F.form:108 +msgid "Use Proxy" +msgstr "Použít proxy" + +#: F.form:114 +msgid "127.0.0.1:3128" +msgstr "-" diff --git a/app/examples/Networking/HTTPPost/.lang/de.po b/app/examples/Networking/HTTPPost/.lang/de.po new file mode 100644 index 00000000..ec7afa61 --- /dev/null +++ b/app/examples/Networking/HTTPPost/.lang/de.po @@ -0,0 +1,73 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "HTTP client POST example" +msgstr "Beispiel fürHTTP-Client POST" + +#: F.class:7 +msgid "Error " +msgstr "Fehler" + +#: F.class:22 +msgid "Waiting for reply..." +msgstr "Warte auf Antwort..." + +#: F.class:72 +msgid "Connecting..." +msgstr "Verbinden..." + +#: F.form:23 +msgid "Internet Calculator" +msgstr "Internet-Rechner" + +#: F.form:28 +msgid "Post" +msgstr "Übermitteln" + +#: F.form:42 +msgid "HTTP Headers" +msgstr "-" + +#: F.form:48 +msgid "HTTP Data" +msgstr "HTTP Daten" + +#: F.form:53 +msgid "Write Here a Number :" +msgstr "Eine Zahl eingeben" + +#: F.form:58 +msgid "Write Here Another Number :" +msgstr "Noch eine Zahl eingeben" + +#: F.form:63 +msgid "5" +msgstr "-" + +#: F.form:73 +msgid "Finally press the Post button >>>" +msgstr "Dann auf Übermitteln klicken >>>" + +#: F.form:81 +msgid "Using the power of internet to have a minimal calculator machine!" +msgstr "Die Macht des Internets für einen kleinen Taschenrechner nutzen!" + +#: F.form:108 +msgid "Use Proxy" +msgstr "Proxy benutzen" + +#: F.form:114 +msgid "127.0.0.1:3128" +msgstr "-" + diff --git a/app/examples/Networking/HTTPPost/.lang/es.po b/app/examples/Networking/HTTPPost/.lang/es.po new file mode 100644 index 00000000..0901fdfa --- /dev/null +++ b/app/examples/Networking/HTTPPost/.lang/es.po @@ -0,0 +1,56 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: F.class:132 +msgid "Internet Calculator" +msgstr "Calculador de Internet" + +#: F.class:137 +msgid "Post" +msgstr "Post" + +#: F.class:152 +msgid "HTTP Header :" +msgstr "HTTP Encabezado :" + +#: F.class:157 +msgid "HTTP Data :" +msgstr "HTTP Datos :" + +#: F.class:162 +msgid "Write Here a Number :" +msgstr "Escriba aquí un número :" + +#: F.class:167 +msgid "Write Here Another Number :" +msgstr "Escriba aquí otro número :" + +#: F.class:172 +msgid "5" +msgstr "5" + +#: F.class:182 +msgid "Finally Press Post button ->" +msgstr "Finalmente presione el botón Post" + +#: F.class:190 +msgid "Using the power of internet to have a minimal calculator machine!" +msgstr "" +"¡Usando el poder de Internet para tener una mínima máquina calculadora!" + +#: F.class:224 +msgid "Use Proxy" +msgstr "Usar Proxy" + +#: F.class:230 +msgid "127.0.0.1:3128" +msgstr "127.0.0.1:3128" diff --git a/app/examples/Networking/HTTPPost/.lang/nl.po b/app/examples/Networking/HTTPPost/.lang/nl.po new file mode 100644 index 00000000..bbb2ca66 --- /dev/null +++ b/app/examples/Networking/HTTPPost/.lang/nl.po @@ -0,0 +1,72 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"PO-Revision-Date: 2014-09-22 00:19+0100\n" +"Last-Translator: Willy Raets \n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "HTTP client POST example" +msgstr "HTTP cliënt POST voorbeeld" + +#: F.form:23 +msgid "Internet Calculator" +msgstr "-" + +#: F.form:28 +msgid "Post" +msgstr "-" + +#: F.form:42 +msgid "HTTP Headers" +msgstr "-" + +#: F.form:48 +msgid "HTTP Data" +msgstr "-" + +#: F.form:53 +msgid "Write Here a Number :" +msgstr "Schrijf hier een nummer:" + +#: F.form:58 +msgid "Write Here Another Number :" +msgstr "Schrijf hier een ander nummer:" + +#: F.form:63 +msgid "5" +msgstr "-" + +#: F.form:73 +msgid "Finally press the Post button >>>" +msgstr "Uiteindelijk druk the Post knop >>>" + +#: F.form:81 +msgid "Using the power of internet to have a minimal calculator machine!" +msgstr "Gebruik de kracht van het internet om een minimale calculator machine te hebben!" + +#: F.form:108 +msgid "Use Proxy" +msgstr "Gebruik Proxy" + +#: F.form:114 +msgid "127.0.0.1:3128" +msgstr "-" + +#: F.class:7 +msgid "Error " +msgstr "Fout" + +#: F.class:22 +msgid "Waiting for reply..." +msgstr "Wachten op antwoord..." + +#: F.class:72 +msgid "Connecting..." +msgstr "Verbinding maken..." + diff --git a/app/examples/Networking/HTTPPost/.lang/ru.po b/app/examples/Networking/HTTPPost/.lang/ru.po new file mode 100644 index 00000000..bfc033a1 --- /dev/null +++ b/app/examples/Networking/HTTPPost/.lang/ru.po @@ -0,0 +1,104 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Networking/HTTPPost/.project:21 +msgid "HTTP client POST example" +msgstr "Пример POST HTTP-клиента" + +#: app/examples/Networking/HTTPPost/.project:22 +msgid "" +"HttpClient POST request example.\n" +"\n" +"This example how to send a POST HTTP request to a server and get the response. You can configure an HTTP proxy if needed." +msgstr "" +"Пример POST-запроса клиента HTTP.\n" +"\n" +"В этом примере показано, как отправить запрос POST HTTP на сервер и получить ответ. При необходимости вы можете настроить HTTP-прокси." + +#: app/examples/Networking/HTTPPost/.src/FHttpPost.class:7 +msgid "Error " +msgstr "Ошибка " + +#: app/examples/Networking/HTTPPost/.src/FHttpPost.class:22 +msgid "Waiting for reply..." +msgstr "Ожидание ответа..." + +#: app/examples/Networking/HTTPPost/.src/FHttpPost.class:33 +msgid "OK" +msgstr "ОК" + +#: app/examples/Networking/HTTPPost/.src/FHttpPost.class:59 app/examples/Networking/HTTPPost/.src/FHttpPost.class:62 +msgid "Error" +msgstr "Ошибка" + +#: app/examples/Networking/HTTPPost/.src/FHttpPost.class:72 +msgid "Connecting..." +msgstr "Соединение..." + +#: app/examples/Networking/HTTPPost/.src/FHttpPost.form:5 +msgid "Internet Calculator" +msgstr "Интернет-калькулятор" + +#: app/examples/Networking/HTTPPost/.src/FHttpPost.form:9 +msgid "Post" +msgstr "Отправить" + +#: app/examples/Networking/HTTPPost/.src/FHttpPost.form:20 +msgid "HTTP Headers" +msgstr "Заголовки HTTP" + +#: app/examples/Networking/HTTPPost/.src/FHttpPost.form:25 +msgid "HTTP Data" +msgstr "Данные HTTP" + +#: app/examples/Networking/HTTPPost/.src/FHttpPost.form:29 +msgid "Write Here a Number :" +msgstr "Написать здесь число:" + +#: app/examples/Networking/HTTPPost/.src/FHttpPost.form:33 +msgid "Write Here Another Number :" +msgstr "Написать здесь другое число:" + +#: app/examples/Networking/HTTPPost/.src/FHttpPost.form:37 app/examples/Networking/HTTPPost/.src/FHttpPost.form:41 +msgid "5" +msgstr "5" + +#: app/examples/Networking/HTTPPost/.src/FHttpPost.form:45 +msgid "Finally press the Post button >>>" +msgstr "В заключение нажать кнопку >>>" + +#: app/examples/Networking/HTTPPost/.src/FHttpPost.form:52 +msgid "Using the power of internet to have a minimal calculator machine!" +msgstr "Использование возможностей Интернета, чтобы иметь минимальный калькулятор!" + +#: app/examples/Networking/HTTPPost/.src/FHttpPost.form:78 +msgid "Use Proxy" +msgstr "Использовать прокси" + +#: app/examples/Networking/HTTPPost/.src/FHttpPost.form:83 +msgid "127.0.0.1:3128" +msgstr "127.0.0.1:3128" + diff --git a/app/examples/Networking/HTTPPost/.project b/app/examples/Networking/HTTPPost/.project new file mode 100644 index 00000000..149b45db --- /dev/null +++ b/app/examples/Networking/HTTPPost/.project @@ -0,0 +1,20 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.6.90 +Title=HTTP client POST example +Startup=FHttpPost +Icon=httpclient.png +Version=1.0.0 +Component=gb.image +Component=gb.gui +Component=gb.net +Component=gb.net.curl +Description="HttpClient POST request example.\n\nThis example how to send a POST HTTP request to a server and get the response. You can configure an HTTP proxy if needed." +TabSize=2 +Translate=1 +Language=fr +Maintainer=benoit +Vendor=Example +Address=benoit@desnouettes +License=General Public Licence +Packager=1 +Tags=Network diff --git a/app/examples/Networking/HTTPPost/.src/FHttpPost.class b/app/examples/Networking/HTTPPost/.src/FHttpPost.class new file mode 100644 index 00000000..fc233522 --- /dev/null +++ b/app/examples/Networking/HTTPPost/.src/FHttpPost.class @@ -0,0 +1,105 @@ +' Gambas class file + +Public P As HttpClient + +Public Sub P_Error() + + LblInfo.Text = ("Error ") & P.Status + +End + + +Public Sub Form_Open() + + TextArea1.Text = "" + P = New HttpClient As "P" + +End + + +Public Sub P_Connect() + + LblInfo.Text = ("Waiting for reply...") + +End + + + +Public Sub P_Finished() + + Dim sBuf As String + Dim MyLoop As Integer + + LblInfo.Text = ("OK") + + TextArea2.Insert(P.Headers.Join("\n") & "\n") + + If Lof(P) Then + sBuf = Read #P, Lof(P) + TextArea1.Text = sBuf + Endif + + If (InStr(sBuf, "")) Then + sBuf = Mid(sBuf, InStr(sBuf, "") + 12) + MyLoop = 1 + Label6.Text = TextBox1.Text & " + " & TextBox2.Text & " = " + Do While Mid(sBuf, MyLoop, 1) <> "<" + Label6.Text = Label6.Text & Mid(sBuf, MyLoop, 1) + MyLoop = MyLoop + 1 + Loop + If (InStr(sBuf, "")) Then + sBuf = Mid(sBuf, InStr(sBuf, "") + 12) + MyLoop = 1 + Label7.Text = TextBox1.Text & " - " & TextBox2.Text & " = " + Do While Mid(sBuf, MyLoop, 1) <> "<" + Label7.Text = Label7.Text & Mid(sBuf, MyLoop, 1) + MyLoop = MyLoop + 1 + Loop + Else + Message.Error(("Error")) + End If + Else + Message.Error(("Error")) + End If + + +End + + +Public Sub Button1_Click() + + Dim sCad As String + LblInfo.Text = ("Connecting...") + TextBox1.Text = Val(Trim(TextBox1.Text)) + TextBox2.Text = Val(Trim(TextBox2.Text)) + Wait + TextArea1.Text = "" + sCad = "" & Chr(13) & Chr(10) + sCad = sCad & "" '& Chr(13) & Chr(10) + sCad = sCad & "sample.sumAndDifference" '& Chr(13) & Chr(10) + sCad = sCad & "" + sCad = sCad & "" + sCad = sCad & "" & TextBox1.Text & "" + sCad = sCad & "" + sCad = sCad & "" + sCad = sCad & "" & TextBox2.Text & "" + sCad = sCad & "" + sCad = sCad & "" + sCad = sCad & "" + If ChkProxy.Value Then + P.Proxy.Host = TxtProxy.Text + Else + P.Proxy.Host = "" + End If + P.URL = "dansoft.krasnokamensk.ru/xmlrpc-c-api/sample.php" + + P.Post("text/xml", sCad) + +End + + +Public Sub ChkProxy_Click() + + TxtProxy.Enabled = ChkProxy.Value + +End diff --git a/app/examples/Networking/HTTPPost/.src/FHttpPost.form b/app/examples/Networking/HTTPPost/.src/FHttpPost.form new file mode 100644 index 00000000..69bf3555 --- /dev/null +++ b/app/examples/Networking/HTTPPost/.src/FHttpPost.form @@ -0,0 +1,85 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(38.1429,12.7143,95,85) + Text = ("Internet Calculator") + Resizable = False + { Button1 Button + MoveScaled(42,18,14.7143,4) + Text = ("Post") + } + { TextArea1 TextArea + MoveScaled(1,56,93,28) + } + { TextArea2 TextArea + MoveScaled(1,35,93,16) + } + { Label1 Label + MoveScaled(1,31,89.1429,4) + Font = Font["Bold"] + Text = ("HTTP Headers") + } + { Label2 Label + MoveScaled(1,52,90.7143,4) + Font = Font["Bold"] + Text = ("HTTP Data") + } + { Label3 Label + MoveScaled(4,8,38,4) + Text = ("Write Here a Number :") + } + { Label4 Label + MoveScaled(4,13,38,4) + Text = ("Write Here Another Number :") + } + { TextBox1 TextBox + MoveScaled(42,8,14.7143,4) + Text = ("5") + } + { TextBox2 TextBox + MoveScaled(42,13,14.7143,4) + Text = ("5") + } + { Label5 Label + MoveScaled(4,18,38,4) + Text = ("Finally press the Post button >>>") + } + { TextLabel1 TextLabel + MoveScaled(0,0,96,6) + Font = Font["Bold"] + Background = &H101A9E& + Foreground = &HF7F02A& + Text = ("Using the power of internet to have a minimal calculator machine!") + Alignment = Align.Center + } + { Label6 Label + MoveScaled(60,8,34,5) + Font = Font["12,Bold"] + Background = &H092773& + Foreground = &HFFFFFF& + Padding = 4 + } + { Label7 Label + MoveScaled(60,14,34,5) + Font = Font["12,Bold"] + Background = &H092773& + Foreground = &HFFFFFF& + Padding = 4 + } + { LblInfo Label + MoveScaled(60,20,34,4) + Font = Font["Bold"] + Background = &H003DB6& + Foreground = &HFFFF00& + Padding = 4 + } + { ChkProxy CheckBox + MoveScaled(1,26,36,4) + Text = ("Use Proxy") + } + { TxtProxy TextBox + MoveScaled(28,26,67,4) + Enabled = False + Text = ("127.0.0.1:3128") + } +} diff --git a/app/examples/Networking/HTTPPost/httpclient.png b/app/examples/Networking/HTTPPost/httpclient.png new file mode 100644 index 0000000000000000000000000000000000000000..613d858f2cbcc49382048288ca7a5b04e9db60be GIT binary patch literal 1768 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, YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Networking/POPMailbox/.project:20 +msgid "POP-Mailbox" +msgstr "Почтовый ящик POP" + +#: app/examples/Networking/POPMailbox/.project:21 +msgid "Simple mail reader based on the POP3 component." +msgstr "Простая читалка почты на основе компонента POP3." + +#: app/examples/Networking/POPMailbox/.src/FMain.class:49 +msgid "Login failed!" +msgstr "Ошибка логина!" + +#: app/examples/Networking/POPMailbox/.src/FMain.form:5 +msgid "POP3 Mailbox Example" +msgstr "Пример почтового ящика POP3" + +#: app/examples/Networking/POPMailbox/.src/FMain.form:31 +msgid "Connect" +msgstr "Соединить" + +#: app/examples/Networking/POPMailbox/.src/FMain.form:39 +msgid "Disconnect" +msgstr "Отсоединить" + +#: app/examples/Networking/POPMailbox/.src/FMain.form:47 app/examples/Networking/POPMailbox/.src/FSettings.form:5 +msgid "Settings" +msgstr "Параметры" + +#: app/examples/Networking/POPMailbox/.src/FSettings.class:28 +msgid "Missing username" +msgstr "Отсутствует имя пользователя" + +#: app/examples/Networking/POPMailbox/.src/FSettings.class:33 +msgid "Missing password" +msgstr "Отсутствует пароль" + +#: app/examples/Networking/POPMailbox/.src/FSettings.class:38 +msgid "Missing server" +msgstr "Отсутствует сервер" + +#: app/examples/Networking/POPMailbox/.src/FSettings.form:13 +msgid "Login Details" +msgstr "Данные для логина" + +#: app/examples/Networking/POPMailbox/.src/FSettings.form:17 +msgid "Username" +msgstr "Имя пользователя" + +#: app/examples/Networking/POPMailbox/.src/FSettings.form:26 +msgid "Password" +msgstr "Пароль" + +#: app/examples/Networking/POPMailbox/.src/FSettings.form:36 +msgid "Server Details" +msgstr "Детали сервера" + +#: app/examples/Networking/POPMailbox/.src/FSettings.form:40 +msgid "Server" +msgstr "Сервер" + +#: app/examples/Networking/POPMailbox/.src/FSettings.form:49 +msgid "Port" +msgstr "Порт" + +#: app/examples/Networking/POPMailbox/.src/FSettings.form:59 +msgid "Use SSL" +msgstr "Использовать SSL" + +#: app/examples/Networking/POPMailbox/.src/FSettings.form:64 +msgid "Save" +msgstr "Сохранить" + diff --git a/app/examples/Networking/POPMailbox/.project b/app/examples/Networking/POPMailbox/.project new file mode 100644 index 00000000..15fc0f24 --- /dev/null +++ b/app/examples/Networking/POPMailbox/.project @@ -0,0 +1,19 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.6.90 +Title=POP-Mailbox +Startup=FMain +Icon=pop3client.png +Version=3.6.2 +VersionFile=1 +Component=gb.image +Component=gb.gui +Component=gb.form +Component=gb.settings +Component=gb.net +Component=gb.mime +Component=gb.net.pop3 +Description="Simple mail reader based on the POP3 component." +Authors="sebikul " +TabSize=2 +Packager=1 +Translate=1 diff --git a/app/examples/Networking/POPMailbox/.src/FMain.class b/app/examples/Networking/POPMailbox/.src/FMain.class new file mode 100644 index 00000000..3838a456 --- /dev/null +++ b/app/examples/Networking/POPMailbox/.src/FMain.class @@ -0,0 +1,106 @@ +' Gambas class file + + + +Public Sub Form_Open() + + Settings.Read(FMain) + + FSettings.ShowModal() + + MailClient.Debug = True + + 'Connect() + + If Not MailClient.User Then Me.Close + +End + +Public Sub btnSettings_Click() + + If MailClient.Status <> Net.Connected Then + FSettings.ShowModal() + Endif + +End + +Public Sub btnConnect_Click() + + Connect() + +End + +Private Sub Connect() + + 'Wait 0.5 + + Inc Application.Busy + + If MailClient.Host Then + btnSettings.Enabled = False + MailClient.Open() + Endif + + If MailClient.Status = Net.Connected Then + LoadInbox() + btnDisconnect.Enabled = True + Else + btnSettings.Enabled = True + Message.Warning(("Login failed!")) + Endif + + Dec Application.Busy + +End + +Private Sub LoadInbox() + + Dim oMail As _Pop3Client_Message + + If MailClient.Status <> Net.Connected Then Return + + For Each oMail In MailClient + + If oMail.Index = 3 Then Return + + lvInbox.Add(oMail.Index, Subst("&1 &2", oMail.Message.Sender, oMail.Message.Subject)) + + Wait + + Next + +End + +Public Sub btnDisconnect_Click() + + If MailClient.Status <> Net.Connected Then Return + + lvInbox.Clear() + + MailClient.Close() + + btnDisconnect.Enabled = False + + btnSettings.Enabled = True + +End + +Public Sub lvInbox_Select() + + ''Please note that this is not an example of the gb.mime component!!! + txtContent.Text = MailClient[lvInbox.Key].Message.Body[0].ToString() + + ''THIS SHOULD WORK!!! + 'txtContent.Text = Mime.Decode(MailClient[lvInbox.Key].Message.Body[0].ToString(), MailClient[lvInbox.Key].Message.Body[0].ContentEncoding) + +End + +Public Sub Form_Close() + + If btnDisconnect.Enabled Then + MailClient.Close() + Endif + + Settings.Write(FMain) + +End diff --git a/app/examples/Networking/POPMailbox/.src/FMain.form b/app/examples/Networking/POPMailbox/.src/FMain.form new file mode 100644 index 00000000..2c8f7391 --- /dev/null +++ b/app/examples/Networking/POPMailbox/.src/FMain.form @@ -0,0 +1,50 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,77,38) + Text = ("POP3 Mailbox Example") + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + Padding = 10 + { !MailClient #Pop3Client + #MoveScaled(23,1) + #Public = True + } + { HSplit1 HSplit + MoveScaled(1,9,69,19) + Expand = True + { lvInbox ListView + MoveScaled(2,3,29,14) + } + { txtContent TextArea + MoveScaled(33,1,31,16) + ReadOnly = True + Wrap = True + ScrollBar = Scroll.Vertical + } + } + { HBox1 HBox + MoveScaled(3,30,67,4) + { btnConnect Button + MoveScaled(0,0,16,4) + Text = ("Connect") + } + { Panel2 Panel + MoveScaled(16,0,7,4) + } + { btnDisconnect Button + MoveScaled(23,0,16,4) + Enabled = False + Text = ("Disconnect") + } + { Panel1 Panel + MoveScaled(39,0,7,4) + Expand = True + } + { btnSettings Button + MoveScaled(46,0,16,4) + Text = ("Settings") + } + } +} diff --git a/app/examples/Networking/POPMailbox/.src/FSettings.class b/app/examples/Networking/POPMailbox/.src/FSettings.class new file mode 100644 index 00000000..ed66a025 --- /dev/null +++ b/app/examples/Networking/POPMailbox/.src/FSettings.class @@ -0,0 +1,68 @@ +' Gambas class file + +Public Sub Form_Close() + + Settings.Write(FSettings) + +End + +Public Sub Form_Open() + + Settings.Read(FSettings) + + txtUsername.Text = Settings["LastUser", FMain.MailClient.User] + + txtPassword.Text = FMain.MailClient.Password + + txtServer.Text = Settings["LastServer", FMain.MailClient.Host] + + vbPort.Value = IIf(FMain.MailClient.Port, FMain.MailClient.Port, vbPort.Value) + +End + +Public Sub btnSave_Click() + + Balloon.Delay = 3000 + + If Not txtUsername.Text Then + Balloon.Error(("Missing username"), txtUsername) + Return + Endif + + If Not txtPassword.Text Then + Balloon.Error(("Missing password"), txtPassword) + Return + Endif + + If Not txtServer.Text Then + Balloon.Error(("Missing server"), txtServer) + Return + Endif + + FMain.MailClient.User = txtUsername.Text + Settings["LastUser"] = FMain.MailClient.User + + FMain.MailClient.Password = txtPassword.Text + + FMain.MailClient.Host = txtServer.Text + Settings["LastServer"] = FMain.MailClient.Host + + FMain.MailClient.Port = vbPort.Value + + Me.Close + +End + +Public Sub chbSSL_Click() + + Select Case chbSSL.Value + + Case -1 + If vbPort.Value = 110 Then vbPort.Value = 995 + + Case 0 + If vbPort.Value = 995 Then vbPort.Value = 110 + + End Select + +End diff --git a/app/examples/Networking/POPMailbox/.src/FSettings.form b/app/examples/Networking/POPMailbox/.src/FSettings.form new file mode 100644 index 00000000..62814211 --- /dev/null +++ b/app/examples/Networking/POPMailbox/.src/FSettings.form @@ -0,0 +1,66 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,48,53) + Text = ("Settings") + Resizable = False + Arrangement = Arrange.Vertical + AutoResize = True + Spacing = True + Margin = True + { Frame1 Frame + MoveScaled(1,2,46,18) + Text = ("Login Details") + { Label1 Label + MoveScaled(1,5,16,4) + AutoResize = True + Text = ("Username") + } + { txtUsername TextBox + MoveScaled(21,5,24,4) + Expand = True + } + { Label2 Label + MoveScaled(1,11,16,4) + AutoResize = True + Text = ("Password") + } + { txtPassword TextBox + MoveScaled(21,11,24,4) + Expand = True + Password = True + } + } + { Frame2 Frame + MoveScaled(1,26,46,21) + Text = ("Server Details") + { Label3 Label + MoveScaled(1,5,17,4) + AutoResize = True + Text = ("Server") + } + { txtServer TextBox + MoveScaled(21,5,24,4) + Expand = True + } + { Label4 Label + MoveScaled(1,11,32,4) + AutoResize = True + Text = ("Port") + } + { vbPort SpinBox + MoveScaled(36,11,9,4) + MaxValue = 999999 + Value = 110 + } + { chbSSL CheckBox + MoveScaled(1,16,42,4) + AutoResize = True + Text = ("Use SSL") + } + } + { btnSave Button + MoveScaled(31,48,16,4) + Text = ("Save") + } +} diff --git a/app/examples/Networking/POPMailbox/pop3client.png b/app/examples/Networking/POPMailbox/pop3client.png new file mode 100644 index 0000000000000000000000000000000000000000..3ac6e3cd827550e3f24ac0cfd9e9c3e8f1ff1707 GIT binary patch literal 957 zcmV;u148_XP)Z0B9%xbu9o!8~^|R$;!_5_V)Vv z`uX|!_4W0~$;{^I?X|bO+uPgz{{8p&_x}F=+S=Q+x4Y`?@!a3z!^X(E|<=^7v)7ILks;%VZ<@@{l@$vEU^78!r{Nv>0?Curta_W?d|RE?(XjH@1mrp@ACEI=IP|- z>et!aqot?D$H?jF>FVn0#>U6-^Y-QE>gDI_y1c%kqonxw`2GF;>+9>HqNMZn_~+^D z=jrR{>g?p^=&rA@goK6J+1c3G*sia!_4fMd>h0<4?%?6%y1TvS=;*Djt*or9tE;Q$ z=jh<#g?|6?C#Lg)XdGz=;-L=VJkiRI^yi;0hljDU!RffXbqfRoc}dAyA}U zQ(IA9R$5vDR!~>p(Ad-*+*0iT2h}aX%}tFB^>ttct!?ccol*{tD8NCgv!lJO6{w&K zClK!L=>;k1!v*@4TPEOD093)x4psn4I(=XYmEG6R!3j|S62U?ORWRUC&<7*?k*t6! zfEeBfAwep-kah4w*$5N3uq%MOfr|m5pbu^l!WUeO_``vVfdOwwa)YyGKTf~{&Ahx^ f*a08md=CZy+L9lmVaOD500000NkvXXu0mjfUIQU6 literal 0 HcmV?d00001 diff --git a/app/examples/Networking/SerialPort/.directory b/app/examples/Networking/SerialPort/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/app/examples/Networking/SerialPort/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/app/examples/Networking/SerialPort/.icon.png b/app/examples/Networking/SerialPort/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7cda40d9199bbf380bda87817e786e26a2413869 GIT binary patch literal 4320 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 O0000, YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-28 09:00+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Networking/SerialPort/.project:18 +msgid "Serial Port example" +msgstr "Пример последовательного порта" + +#: app/examples/Networking/SerialPort/.project:19 app/examples/Networking/SerialPort/.src/FMain.form:5 +msgid "RS232 Serial port example" +msgstr "Пример последовательного порта RS232" + +#: app/examples/Networking/SerialPort/.src/FAbout.class:6 app/examples/Networking/SerialPort/.src/FMain.form:17 +msgid "About" +msgstr "О программе" + +#: app/examples/Networking/SerialPort/.src/FAbout.class:8 +msgid "Version" +msgstr "Версия" + +#: app/examples/Networking/SerialPort/.src/FAbout.form:10 +msgid "Label1" +msgstr "Метка1" + +#: app/examples/Networking/SerialPort/.src/FAbout.form:15 +msgid "Provided under GPL License" +msgstr "Предоставлено по лицензии GPL" + +#: app/examples/Networking/SerialPort/.src/FAbout.form:20 +msgid "by" +msgstr "от" + +#: app/examples/Networking/SerialPort/.src/FAbout.form:25 +msgid "Claus Dietrich" +msgstr "Клаус Дитрих" + +#: app/examples/Networking/SerialPort/.src/FAbout.form:30 +msgid "Close" +msgstr "Закрыть" + +#: app/examples/Networking/SerialPort/.src/FMain.class:47 +msgid "Unable to open" +msgstr "Невозможно открыть" + +#: app/examples/Networking/SerialPort/.src/FMain.class:48 app/examples/Networking/SerialPort/.src/FMain.class:127 +msgid "Apply" +msgstr "Применить" + +#: app/examples/Networking/SerialPort/.src/FMain.class:111 +msgid "Please open serial port first." +msgstr "Пожалуйста, сначала откройте последовательный порт." + +#: app/examples/Networking/SerialPort/.src/FMain.class:126 app/examples/Networking/SerialPort/.src/FMain.class:150 app/examples/Networking/SerialPort/.src/FMain.form:152 +msgid "Change" +msgstr "Изменить" + +#: app/examples/Networking/SerialPort/.src/FMain.class:146 +msgid "Error while opening" +msgstr "Ошибка при открытии" + +#: app/examples/Networking/SerialPort/.src/FMain.form:9 +msgid "File" +msgstr "Файл" + +#: app/examples/Networking/SerialPort/.src/FMain.form:11 +msgid "Exit" +msgstr "Выход" + +#: app/examples/Networking/SerialPort/.src/FMain.form:15 +msgid "Help" +msgstr "Справка" + +#: app/examples/Networking/SerialPort/.src/FMain.form:25 +msgid "TextArea1" +msgstr "Текстовая_область_1" + +#: app/examples/Networking/SerialPort/.src/FMain.form:39 +msgid "TextArea2" +msgstr "Текстовая_область_2" + +#: app/examples/Networking/SerialPort/.src/FMain.form:53 +msgid "Send" +msgstr "Послать" + +#: app/examples/Networking/SerialPort/.src/FMain.form:68 +msgid "Parity" +msgstr "Паритет" + +#: app/examples/Networking/SerialPort/.src/FMain.form:72 +msgid "Stopbits" +msgstr "Стоп-биты" + +#: app/examples/Networking/SerialPort/.src/FMain.form:76 +msgid "Bits" +msgstr "Бит" + +#: app/examples/Networking/SerialPort/.src/FMain.form:80 +msgid "Baud" +msgstr "Бод" + +#: app/examples/Networking/SerialPort/.src/FMain.form:84 +msgid "Device" +msgstr "Устройство" + +#: app/examples/Networking/SerialPort/.src/FMain.form:94 +msgid "50" +msgstr "50" + +#: app/examples/Networking/SerialPort/.src/FMain.form:94 +msgid "75" +msgstr "75" + +#: app/examples/Networking/SerialPort/.src/FMain.form:94 +msgid "100" +msgstr "100" + +#: app/examples/Networking/SerialPort/.src/FMain.form:94 +msgid "150" +msgstr "150" + +#: app/examples/Networking/SerialPort/.src/FMain.form:94 +msgid "200" +msgstr "200" + +#: app/examples/Networking/SerialPort/.src/FMain.form:94 +msgid "300" +msgstr "300" + +#: app/examples/Networking/SerialPort/.src/FMain.form:94 +msgid "600" +msgstr "600" + +#: app/examples/Networking/SerialPort/.src/FMain.form:94 +msgid "1200" +msgstr "1200" + +#: app/examples/Networking/SerialPort/.src/FMain.form:94 +msgid "2400" +msgstr "2400" + +#: app/examples/Networking/SerialPort/.src/FMain.form:94 +msgid "4800" +msgstr "4800" + +#: app/examples/Networking/SerialPort/.src/FMain.form:94 app/examples/Networking/SerialPort/.src/FMain.form:95 +msgid "9600" +msgstr "9600" + +#: app/examples/Networking/SerialPort/.src/FMain.form:94 +msgid "19200" +msgstr "19200" + +#: app/examples/Networking/SerialPort/.src/FMain.form:94 +msgid "38400" +msgstr "38400" + +#: app/examples/Networking/SerialPort/.src/FMain.form:101 +msgid "5" +msgstr "5" + +#: app/examples/Networking/SerialPort/.src/FMain.form:101 +msgid "6" +msgstr "6" + +#: app/examples/Networking/SerialPort/.src/FMain.form:101 +msgid "7" +msgstr "7" + +#: app/examples/Networking/SerialPort/.src/FMain.form:101 app/examples/Networking/SerialPort/.src/FMain.form:102 +msgid "8" +msgstr "8" + +#: app/examples/Networking/SerialPort/.src/FMain.form:108 app/examples/Networking/SerialPort/.src/FMain.form:109 +msgid "1" +msgstr "1" + +#: app/examples/Networking/SerialPort/.src/FMain.form:108 +msgid "2" +msgstr "2" + +#: app/examples/Networking/SerialPort/.src/FMain.form:115 +msgid "None" +msgstr "Нет" + +#: app/examples/Networking/SerialPort/.src/FMain.form:115 +msgid "Even" +msgstr "Чётный" + +#: app/examples/Networking/SerialPort/.src/FMain.form:115 +msgid "Odd" +msgstr "Нечётный" + +#: app/examples/Networking/SerialPort/.src/FMain.form:116 +msgid "N" +msgstr "N" + +#: app/examples/Networking/SerialPort/.src/FMain.form:122 +msgid "NONE" +msgstr "НЕТ" + +#: app/examples/Networking/SerialPort/.src/FMain.form:122 +msgid "CRTSCTS" +msgstr "CRTSCTS" + +#: app/examples/Networking/SerialPort/.src/FMain.form:122 +msgid "XON/XOFF" +msgstr "XON/XOFF" + +#: app/examples/Networking/SerialPort/.src/FMain.form:122 +msgid "CRTSCTS + XON/XOFF" +msgstr "CRTSCTS + XON/XOFF" + +#: app/examples/Networking/SerialPort/.src/FMain.form:127 +msgid "DCD" +msgstr "DCD" + +#: app/examples/Networking/SerialPort/.src/FMain.form:132 +msgid "DSR" +msgstr "DSR" + +#: app/examples/Networking/SerialPort/.src/FMain.form:137 +msgid "CTS" +msgstr "CTS" + +#: app/examples/Networking/SerialPort/.src/FMain.form:142 +msgid "DTR" +msgstr "DTR" + +#: app/examples/Networking/SerialPort/.src/FMain.form:147 +msgid "RTS" +msgstr "RTS" + +#: app/examples/Networking/SerialPort/.src/FMain.form:157 +msgid "RNG" +msgstr "RNG" + +#: app/examples/Networking/SerialPort/.src/FMain.form:161 +msgid "Handshake" +msgstr "Рукопожатие" + +#: app/examples/Networking/SerialPort/.src/FMain.form:174 +msgid "Message" +msgstr "Сообщение" + diff --git a/app/examples/Networking/SerialPort/.project b/app/examples/Networking/SerialPort/.project new file mode 100644 index 00000000..bb5450c6 --- /dev/null +++ b/app/examples/Networking/SerialPort/.project @@ -0,0 +1,17 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.5.90 +Title=Serial Port example +Description="RS232 Serial port example" +Startup=FMain +Icon=serialport.png +Version=3.6.2 +VersionFile=1 +Component=gb.image +Component=gb.gui +Component=gb.form +Component=gb.settings +Component=gb.net +Authors="Claus Dietrich\nBenoît Minisini" +TabSize=2 +Packager=1 +Translate=1 diff --git a/app/examples/Networking/SerialPort/.src/FAbout.class b/app/examples/Networking/SerialPort/.src/FAbout.class new file mode 100644 index 00000000..3e40f230 --- /dev/null +++ b/app/examples/Networking/SerialPort/.src/FAbout.class @@ -0,0 +1,16 @@ +' Gambas class file + + +Public Sub Form_Open() + + FAbout.text = ("About") + Label1.width = FAbout.width + Label1.text = Application.name & " " & ("Version") & " " & Application.Version + +End + +Public Sub Button1_Click() + + Me.close + +End diff --git a/app/examples/Networking/SerialPort/.src/FAbout.form b/app/examples/Networking/SerialPort/.src/FAbout.form new file mode 100644 index 00000000..b4656819 --- /dev/null +++ b/app/examples/Networking/SerialPort/.src/FAbout.form @@ -0,0 +1,32 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,43,30) + Resizable = False + Utility = True + SkipTaskbar = True + { Label1 Label + MoveScaled(1,3,42,4) + Text = ("Label1") + Alignment = Align.Center + } + { Label2 Label + MoveScaled(1,8,42,4) + Text = ("Provided under GPL License") + Alignment = Align.Center + } + { Label3 Label + MoveScaled(1,12,42,4) + Text = ("by") + Alignment = Align.Center + } + { Label4 Label + MoveScaled(1,16,42,4) + Text = ("Claus Dietrich") + Alignment = Align.Center + } + { Button1 Button + MoveScaled(26,24,15,4) + Text = ("Close") + } +} diff --git a/app/examples/Networking/SerialPort/.src/FMain.class b/app/examples/Networking/SerialPort/.src/FMain.class new file mode 100644 index 00000000..ab3de3b9 --- /dev/null +++ b/app/examples/Networking/SerialPort/.src/FMain.class @@ -0,0 +1,246 @@ +' Gambas class file + +Public Sub _new() + +End + +Public Sub Form_Open() + 'This is a tested and fully operational example for how to use GAMBAS for serial (RS232) communications. + 'The sourcecode is provided under GNU Public Licence. So feel free to use it for non-commercial or commercial purposes. + 'The code is based on the example provided with Gambas 3.5.1 and the application published in the Gambas book available at: + 'http://www.gambas-buch.de/dw/doku.php?id=k19: k19.1: k19.1.2: start + + 'Features: + ' -Enumerates serial ports including USB types + ' -Change of comms parameters + ' -Storage and retrieval of comms parameters + ' -Display of incoming data + ' -Transmission of data + ' -Display of handshake line status + ' -Restoring of last window position as program start + ' + 'Have Fun + 'Claus Dietrich/ 23.12.2013 + ' + '############################################################################################################## + 'Example of RS232 properties for reference only: + 'SerialPort1.PortName = "/dev/ttyS0" + 'SerialPort1.Speed = "19200" + 'SerialPort1.Parity = 0 + 'SerialPort1.DataBits = "8" + 'SerialPort1.StopBits = "1" + 'SerialPort1.FlowControl = 0 + '############################################################################################################## + + 'Enumerate all available RS232 Interfaces and Display them in the Combo + Module_RS232.EnumerateSerialInterfaces + + 'Set the Default-Path for Storage of Program Parameters + Module_Config.InitDefaultPath + + 'Load Port-Configuration from the config file and set the combos accordingly + Module_Config.RestoreSerialSettings(FMain.SerialPort1, 0) + + 'Open the serial port + Try SerialPort1.Open() + If Error Then + FMain.Message(("Unable to open") & " " & SerialPort1.PortName & ": " & Error.Text) + FMain.ButtonChange.text = ("Apply") + FMain.ComboPortDeviceName.text = "" + Else + FMain.ComboPortDeviceName.enabled = False + FMain.ComboSpeed.enabled = False + Fmain.ComboDataBits.enabled = False + Fmain.ComboStopBits.enabled = False + FMain.ComboParity.enabled = False + FMain.ComboHandShake.enabled = False + 'Display Status of RS232 handshake lines + Module_RS232.CheckRS232Status() + Endif + + 'Empty the TextArea controls + TextArea1.text = "" + TextArea2.text = "" + TextArea2.SetFocus + + 'Restore the last position of the main window + Module_Config.RestoreFormPosition(FMain) + +End + +Public Sub SerialPort1_Read() + 'This routine reads the RS232 port + + Dim Rx As String + 'Sleep 0.025 + + 'Read it + Read #SerialPort1, Rx, Lof(SerialPort1) + 'Display it + Module_RS232.DisplaySerialInput(Rx) + +End + +Public Sub Form_Close() + 'This routine is the central exit point of the appplication + + Dim cwin As Window + + 'Close all open windows + For Each cwin In Windows + cwin.Close + Next + + 'Store last position of the FMain Window + Module_Config.StoreFormPosition(FMain) + + 'If open, close the serial port + If SerialPort1.Status = Net.active Then + SerialPort1.Close() + End If + +End + +Public Sub TextArea1_KeyPress() + +End + +Public Sub btnSend_Click() + + If SerialPort1.status = Net.Inactive Then + FMain.Message(("Please open serial port first.")) + Else + 'FMain.CheckRTS.Value = True + 'Wait 0.01 + Write #SerialPort1, TextArea2.text, Len(TextArea2.text) + 'Wait 0.5 + 'FMain.CheckRTS.Value = False + Endif + +End + +Public Sub ButtonChange_Click() + + With Fmain + + If FMain.ButtonChange.text = ("Change") Then + .ButtonChange.text = ("Apply") + .SerialPort1.close + .ComboPortDeviceName.enabled = True + .ComboSpeed.enabled = True + .ComboDataBits.enabled = True + .ComboStopBits.enabled = True + .ComboParity.enabled = True + .ComboHandShake.enabled = True + Else + 'Transfer combo settings to port + .SerialPort1.PortName = FMain.ComboPortDeviceName.text + .SerialPort1.Speed = FMain.ComboSpeed.text + .SerialPort1.Parity = FMain.ComboParity.index + .SerialPort1.DataBits = Fmain.ComboDataBits.Text + .SerialPort1.StopBits = Fmain.ComboStopBits.Text + .SerialPort1.FlowControl = Fmain.ComboHandShake.Index + 'Open serial port with new settings + Try FMain.SerialPort1.Open() + If Error Then + FMain.Message(("Error while opening") & " " & FMain.SerialPort1.PortName & ": " & Error.Text) + Else + 'Store new Settings + Module_Config.StoreSerialSettings(FMain.SerialPort1, 0) + FMain.ButtonChange.text = ("Change") + 'Disabling all RS232 Combos + .ComboPortDeviceName.enabled = False + .ComboSpeed.enabled = False + .ComboDataBits.enabled = False + .ComboStopBits.enabled = False + .ComboParity.enabled = False + .ComboHandShake.enabled = False + 'Update Status of RS232 Handshake Lines + Module_RS232.CheckRS232Status() + Endif + Endif + + End With + +End + +Public Sub CheckDTR_Click() + 'For setting DTR manually + + If FMain.SerialPort1.status = Net.Active + FMain.SerialPort1.DTR = CheckDTR.Value + Module_RS232.CheckRS232Status + Endif + +End + +Public Sub CheckRTS_Click() + 'For setting RTS manually + + If FMain.SerialPort1.Status = Net.Active + FMain.SerialPort1.RTS = CheckRTS.Value + Module_RS232.CheckRS232Status + Endif + +End + +'The following routines cause following warnings: +'"gbx3: warning: 3 allocation(s) non freed." +'I couldn't find any solution yet. +Public Sub SerialPort1_RTSChange(CurrentValue As Boolean) + + FMain.CheckRTS.Value = CurrentValue + +End + +Public Sub SerialPort1_DSRChange(CurrentValue As Boolean) + + FMain.CheckDSR.Value = CurrentValue + +End + +Public Sub SerialPort1_CTSChange(CurrentValue As Boolean) + + FMain.ChecCTS.Value = CurrentValue + +End + +Public Sub SerialPort1_DCDChange(CurrentValue As Boolean) + + FMain.CheckDCD.Value = CurrentValue + +End + +Public Sub SerialPort1_DTRChange(CurrentValue As Boolean) + + FMain.CheckDTR.Value = CurrentValue + +End + +Public Sub SerialPort1_RNGChange(CurrentValue As Boolean) + + FMain.CheckRNG.Value = CurrentValue + +End + +Public Sub MenuExit_Click() + 'Close application by closing FMain. The close-event of Fmain is doing the rest. + + Me.close + +End + +Public Sub MenuAbout_Click() + + 'Center FAbout over FMain + FAbout.Move(FMain.left + FMain.width / 2 - FAbout.width / 2, Fmain.Top + FMain.height / 2 - FAbout.height / 2) + 'Show it + FAbout.show + +End + +Public Sub Message(sMsg As String) + + txtMessage.Text = sMsg + +End diff --git a/app/examples/Networking/SerialPort/.src/FMain.form b/app/examples/Networking/SerialPort/.src/FMain.form new file mode 100644 index 00000000..49b1b5a3 --- /dev/null +++ b/app/examples/Networking/SerialPort/.src/FMain.form @@ -0,0 +1,189 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,102,80) + Text = ("RS232 Serial port example") + Icon = Picture["serialport.png"] + Arrangement = Arrange.Vertical + { MenuFile Menu + Text = ("File") + { MenuExit Menu + Text = ("Exit") + } + } + { MenuHelp Menu + Text = ("Help") + { MenuAbout Menu + Text = ("About") + } + } + { !TextArea1 TextArea + MoveScaled(1,1,98,30) + #Public = True + Font = Font["Monospace,+2"] + Expand = True + Text = ("TextArea1") + Alignment = Align.Left + ReadOnly = True + Border = False + } + { Separator1 Separator + MoveScaled(42,32,16,0) + } + { panSend HBox + MoveScaled(2,34,98,12) + { TextArea2 TextArea + MoveScaled(0,0,77,12) + Font = Font["Monospace,+2"] + Expand = True + Text = ("TextArea2") + Alignment = Align.Left + Border = False + } + { Panel1 VBox + MoveScaled(78,1,17,10) + Background = Color.TextBackground + Margin = True + { Panel4 Panel + MoveScaled(5,1,6,2) + Expand = True + } + { btnSend Button + MoveScaled(0,4,15,5) + Text = ("Send") + Picture = Picture["icon:/medium/redo"] + } + } + } + { Separator2 Separator + MoveScaled(16,48,16,0) + } + { Panel3 HBox + MoveScaled(3,50,98,26) + Spacing = True + { Panel2 Panel + MoveScaled(0,0,56,26) + { Label5 Label + MoveScaled(1,17,20,4) + Text = ("Parity") + } + { Label4 Label + MoveScaled(1,13,20,4) + Text = ("Stopbits") + } + { Label3 Label + MoveScaled(1,9,20,4) + Text = ("Bits") + } + { Label2 Label + MoveScaled(1,5,20,4) + Text = ("Baud") + } + { Label1 Label + MoveScaled(1,1,20,4) + Text = ("Device") + } + { !ComboPortDeviceName ComboBox + MoveScaled(21,1,17,4) + #Public = True + } + { !ComboSpeed ComboBox + MoveScaled(21,5,17,4) + #Public = True + ReadOnly = True + List = [("50"), ("75"), ("100"), ("150"), ("200"), ("300"), ("600"), ("1200"), ("2400"), ("4800"), ("9600"), ("19200"), ("38400")] + Text = ("9600") + } + { !ComboDataBits ComboBox + MoveScaled(21,9,17,4) + #Public = True + ReadOnly = True + List = [("5"), ("6"), ("7"), ("8")] + Text = ("8") + } + { !ComboStopBits ComboBox + MoveScaled(21,13,17,4) + #Public = True + ReadOnly = True + List = [("1"), ("2")] + Text = ("1") + } + { !ComboParity ComboBox + MoveScaled(21,17,17,4) + #Public = True + ReadOnly = True + List = [("None"), ("Even"), ("Odd")] + Text = ("N") + } + { !ComboHandShake ComboBox + MoveScaled(21,21,17,4) + #Public = True + ReadOnly = True + List = [("NONE"), ("CRTSCTS"), ("XON/XOFF"), ("CRTSCTS + XON/XOFF")] + } + { !CheckDCD CheckBox + MoveScaled(40,14,9,3) + #Public = True + Text = ("DCD") + } + { !CheckDSR CheckBox + MoveScaled(40,11,9,3) + #Public = True + Text = ("DSR") + } + { !CheckCTS CheckBox + MoveScaled(40,8,9,3) + #Public = True + Text = ("CTS") + } + { !CheckDTR CheckBox + MoveScaled(40,5,9,3) + #Public = True + Text = ("DTR") + } + { !CheckRTS CheckBox + MoveScaled(40,2,9,3) + #Public = True + Text = ("RTS") + } + { !ButtonChange Button + MoveScaled(40,21,15,4) + #Public = True + Text = ("Change") + } + { !CheckRNG CheckBox + MoveScaled(40,17,9,3) + #Public = True + Text = ("RNG") + } + { Label6 Label + MoveScaled(1,21,20,4) + Text = ("Handshake") + } + } + { Separator3 Separator + MoveScaled(58,7,0,14) + } + { Panel5 VBox + MoveScaled(60,1,36,24) + Expand = True + Margin = True + { Label7 Label + MoveScaled(2,1,16,3) + Font = Font["Bold"] + Text = ("Message") + } + { txtMessage TextLabel + MoveScaled(0,10,35,13) + Expand = True + } + } + } + { !SerialPort1 #SerialPort + #MoveScaled(75,4) + #Public = True + Parity = SerialPort.Even + Speed = 75 + DataBits = SerialPort.Bits5 + } +} diff --git a/app/examples/Networking/SerialPort/.src/Module_Config.module b/app/examples/Networking/SerialPort/.src/Module_Config.module new file mode 100644 index 00000000..fa21f22d --- /dev/null +++ b/app/examples/Networking/SerialPort/.src/Module_Config.module @@ -0,0 +1,92 @@ +' Gambas module file + +Public AppSettings As Settings + +Public Sub InitDefaultPath() + + AppSettings = New Settings + +End + +Public Sub StoreSerialSettings(Port As SerialPort, PIndex As Integer) + 'Parameters are for example stored in home/.config/Gambas3/RS232.conf + + Dim Headline As String + + HeadLine = "SerialPort " & Format(PIndex, "0") + + 'Store all parameters + With Port + AppSettings[HeadLine & "/Portname"] = .PortName + AppSettings[HeadLine & "/Speed"] = .Speed + AppSettings[HeadLine & "/DataBits"] = .DataBits + AppSettings[HeadLine & "/Stopbits"] = .StopBits + AppSettings[HeadLine & "/Parity"] = .Parity + AppSettings[HeadLine & "/FlowControl"] = .FlowControl + End With + +End + +Public Sub RestoreSerialSettings(Port As SerialPort, Pindex As Integer) + 'Parameters are for example stored in home/.config/Gambas3/RS232.conf + + Dim i As Integer + Dim HeadLine As String + + 'Set parameter headline + HeadLine = "SerialPort " & Format(PIndex, "0") + + 'Retrieve all RS232 settings from config file + With Port + .PortName = AppSettings[HeadLine & "/Portname", "/dev/ttyS0"] + .Speed = AppSettings[HeadLine & "/Speed", "9600"] + .DataBits = AppSettings[HeadLine & "/DataBits", "8"] + .StopBits = AppSettings[HeadLine & "/StopBits", "1"] + .Parity = AppSettings[HeadLine & "/Parity", 0] + .FlowControl = AppSettings[HeadLine & "/FlowControl", 0] + End With + + 'Set the RS232 combos accordingly: + + 'Finding Serial Device in Combo for Displaying + i = FMain.ComboPortDeviceName.Find(FMain.SerialPort1.PortName) + FMain.ComboPortDeviceName.index = i + + 'Finding Speed in Combo for Displaying + i = FMain.ComboSpeed.find(FMain.SerialPort1.Speed) + FMain.ComboSpeed.Index = i + + 'Finding DataBits in Combo for Displaying + i = Fmain.ComboDataBits.find(FMain.Serialport1.DataBits) + Fmain.ComboDataBits.Index = i + + 'Finding StopBits in Combo for Displaying + i = Fmain.ComboStopBits.find(FMain.Serialport1.StopBits) + Fmain.ComboStopBits.Index = i + + 'Displaying Parity in Combo (0=NON, 1=EVEN, 2=ODD) + FMain.ComboParity.index = FMain.SerialPort1.Parity + + 'Displaying Flow-Control in Combo + FMain.ComboHandShake.index = FMain.SerialPort1.FlowControl + +End + +Public Sub StoreFormPosition(F As Form) + + With F + AppSettings[.name & "/left"] = .left + AppSettings[.name & "/top"] = .top + End With + +End + +Public Sub RestoreFormPosition(F As Form) + + With F + .left = AppSettings[.name & "/left", 0] + .top = AppSettings[.name & "/top", 0] + End With + +End + diff --git a/app/examples/Networking/SerialPort/.src/Module_RS232.module b/app/examples/Networking/SerialPort/.src/Module_RS232.module new file mode 100644 index 00000000..dcac6bda --- /dev/null +++ b/app/examples/Networking/SerialPort/.src/Module_RS232.module @@ -0,0 +1,93 @@ +' Gambas module file + +Public Sub EnumerateSerialInterfaces() + + Dim i As Integer + + With FMain + + 'Set operational parameters (used for testing only) + .SerialPort1.Speed = "19200" + .SerialPort1.Parity = 0 + .SerialPort1.DataBits = "8" + .SerialPort1.StopBits = "1" + .SerialPort1.FlowControl = 0 + + 'Clear Device Combo + FMain.ComboPortDeviceName.Clear() + + 'Standard USB Ports + For i = 0 To 8 + .SerialPort1.PortName = "/dev/ttyS" & Format(i, "0") + Try .SerialPort1.Open + If Not Error + .ComboPortDeviceName.Add(.SerialPort1.PortName) + .SerialPort1.close + Endif + Next + + 'USB based ports + For i = 0 To 8 + .SerialPort1.PortName = "/dev/ttyUSB" & Format(i, "0") + Try .SerialPort1.Open + If Not Error + .ComboPortDeviceName.Add(.SerialPort1.PortName) + .SerialPort1.close + Endif + Next + + End With + +End + +Public Sub DisplaySerialInput(RX As String) + 'This Routine displays serial data + + Dim R As String + Dim i As Integer + + With FMain + + 'Set cursor to the end of the text + .TextArea1.Pos = .TextArea1.Length + + 'CR is ommited because the TextArea control displays it as CR+LF + For i = 1 To Len(RX) + R = Mid$(RX, i, 1) + If R <> Chr$(13) Then + 'Amend character + .TextArea1.insert(R) + Endif + Next + + ' 'Use the following alternatively to the above. It displays ASCII-values in [] if it is a control character (ASCII-value < 32) + ' For i = 1 To Len(RX) + ' R = Mid$(RX, i, 1) + ' If Asc(R) > 31 Then + ' .TextArea1.insert(R) + ' Else + ' If R <> Chr$(13) 'Ommit CR because the TextArea control display it as CR+LF + ' .TextArea1.insert("[" & Format(Asc(R), "0") & "]" & R) + ' Else + ' .TextArea1.insert("[" & Format(Asc(R), "0") & "]") + ' Endif + ' Endif + ' Next + + End With + +End + +Public Sub CheckRS232Status() + 'This dipslays the status of the RS232 handshake lines + + With FMain.SerialPort1 + FMain.CheckDSR.Value = .DSR + FMain.CheckDTR.Value = .DTR + FMain.CheckCTS.Value = .CTS + FMain.CheckRTS.Value = .RTS + FMain.CheckDCD.Value = .DCD + FMain.CheckRNG.Value = .RNG + End With + +End diff --git a/app/examples/Networking/SerialPort/serialport.png b/app/examples/Networking/SerialPort/serialport.png new file mode 100644 index 0000000000000000000000000000000000000000..e1d380b9de706bf37bfce82f0019b9b266f556c9 GIT binary patch literal 2498 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 c8O-2+0W=z, 2007-2010. +# +# +msgid "" +msgstr "" +"Project-Id-Version: ServerSocket\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2011-03-20 22:37+0100\n" +"Last-Translator: Jordi Sayol \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: .project:1 +msgid "Server socket example" +msgstr "Exemple de sòcol de servidor" + +#: FrmMain.class:200 +msgid "Server Socket Example" +msgstr "Exemple de servidor de sòcol" + +#: FrmMain.class:206 +msgid "Listen" +msgstr "Escolta" + +#: FrmMain.class:211 +msgid "32340" +msgstr "-" + +#: FrmMain.class:221 +msgid "Close" +msgstr "Tanca" + +#: FrmMain.class:226 +msgid "Port" +msgstr "-" + +#: FrmMain.class:231 +msgid "Pause" +msgstr "Pausa" + +#: FrmMain.class:236 +msgid "Max. number of clients" +msgstr "Nombre màxim de clients" + +#: FrmMain.class:243 +msgid "1" +msgstr "-" + +#: FrmMain.class:243 +msgid "10" +msgstr "-" + +#: FrmMain.class:243 +msgid "2" +msgstr "-" + +#: FrmMain.class:243 +msgid "3" +msgstr "-" + +#: FrmMain.class:243 +msgid "4" +msgstr "-" + +#: FrmMain.class:243 +msgid "5" +msgstr "-" + +#: FrmMain.class:243 +msgid "6" +msgstr "-" + +#: FrmMain.class:243 +msgid "7" +msgstr "-" + +#: FrmMain.class:243 +msgid "8" +msgstr "-" + +#: FrmMain.class:243 +msgid "9" +msgstr "-" + +#: FrmMain.class:243 +msgid "No limit" +msgstr "Sense límit" + +#: FrmMain.class:248 +msgid "Type" +msgstr "Tipus" + +#: FrmMain.class:254 +msgid "TCP" +msgstr "-" + +#: FrmMain.class:254 +msgid "UNIX" +msgstr "-" + +#: FrmMain.class:259 +msgid "Path" +msgstr "Camí" + diff --git a/app/examples/Networking/ServerSocket/.lang/cs.po b/app/examples/Networking/ServerSocket/.lang/cs.po new file mode 100644 index 00000000..3eb2bf05 --- /dev/null +++ b/app/examples/Networking/ServerSocket/.lang/cs.po @@ -0,0 +1,104 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Server socket example" +msgstr "Příklad servrového soketu" + +#: FrmMain.form:20 +msgid "Server Socket Example" +msgstr "Příkald Servrového soketu" + +#: FrmMain.form:26 +msgid "Listen" +msgstr "Naslouchat" + +#: FrmMain.form:31 +msgid "32340" +msgstr "-" + +#: FrmMain.form:41 +msgid "Close" +msgstr "Zavřír" + +#: FrmMain.form:46 +msgid "Port" +msgstr "-" + +#: FrmMain.form:51 +msgid "Pause" +msgstr "Pauza" + +#: FrmMain.form:56 +msgid "Max. number of clients" +msgstr "Max. počet klientů" + +#: FrmMain.form:63 +msgid "1" +msgstr "-" + +#: FrmMain.form:63 +msgid "10" +msgstr "-" + +#: FrmMain.form:63 +msgid "2" +msgstr "-" + +#: FrmMain.form:63 +msgid "3" +msgstr "-" + +#: FrmMain.form:63 +msgid "4" +msgstr "-" + +#: FrmMain.form:63 +msgid "5" +msgstr "-" + +#: FrmMain.form:63 +msgid "6" +msgstr "-" + +#: FrmMain.form:63 +msgid "7" +msgstr "-" + +#: FrmMain.form:63 +msgid "8" +msgstr "-" + +#: FrmMain.form:63 +msgid "9" +msgstr "-" + +#: FrmMain.form:63 +msgid "No limit" +msgstr "Bez limitu" + +#: FrmMain.form:68 +msgid "Type" +msgstr "Typ" + +#: FrmMain.form:74 +msgid "TCP" +msgstr "-" + +#: FrmMain.form:74 +msgid "UNIX" +msgstr "-" + +#: FrmMain.form:79 +msgid "Path" +msgstr "Cesta" diff --git a/app/examples/Networking/ServerSocket/.lang/es.po b/app/examples/Networking/ServerSocket/.lang/es.po new file mode 100644 index 00000000..9cf52137 --- /dev/null +++ b/app/examples/Networking/ServerSocket/.lang/es.po @@ -0,0 +1,99 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: FrmMain.class:161 +msgid "Server Socket Example" +msgstr "Ejemplo de Servidor Socket" + +#: FrmMain.class:166 +msgid "Listen" +msgstr "Escuchar" + +#: FrmMain.class:171 +msgid "32340" +msgstr "32340" + +#: FrmMain.class:181 +msgid "Close" +msgstr "Cerrar" + +#: FrmMain.class:186 +msgid "Port :" +msgstr "Puerto :" + +#: FrmMain.class:191 +msgid "Wait" +msgstr "Esperar" + +#: FrmMain.class:196 +msgid "Maximum number of clients:" +msgstr "Número máximo de clientes:" + +#: FrmMain.class:202 +msgid "(no Limit)" +msgstr "(sin límite)" + +#: FrmMain.class:202 +msgid "1" +msgstr "1" + +#: FrmMain.class:202 +msgid "2" +msgstr "2" + +#: FrmMain.class:202 +msgid "3" +msgstr "3" + +#: FrmMain.class:202 +msgid "4" +msgstr "4" + +#: FrmMain.class:202 +msgid "5" +msgstr "5" + +#: FrmMain.class:202 +msgid "6" +msgstr "6" + +#: FrmMain.class:202 +msgid "7" +msgstr "7" + +#: FrmMain.class:202 +msgid "8" +msgstr "8" + +#: FrmMain.class:202 +msgid "9" +msgstr "9" + +#: FrmMain.class:202 +msgid "10" +msgstr "10" + +#: FrmMain.class:207 +msgid "Type :" +msgstr "Tipo :" + +#: FrmMain.class:214 +msgid "TCP" +msgstr "TCP" + +#: FrmMain.class:214 +msgid "UNIX" +msgstr "UNIX" + +#: FrmMain.class:219 +msgid "Path :" +msgstr "Ruta :" diff --git a/app/examples/Networking/ServerSocket/.lang/nl.po b/app/examples/Networking/ServerSocket/.lang/nl.po new file mode 100644 index 00000000..dbe1f7b7 --- /dev/null +++ b/app/examples/Networking/ServerSocket/.lang/nl.po @@ -0,0 +1,104 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2014-09-21 23:59+0100\n" +"Last-Translator: Willy Raets \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Server socket example" +msgstr "Server socket voorbeeld" + +#: FrmMain.form:20 +msgid "Server Socket Example" +msgstr "Server Socket voorbeeld" + +#: FrmMain.form:26 +msgid "Listen" +msgstr "Luister" + +#: FrmMain.form:31 +msgid "32340" +msgstr "-" + +#: FrmMain.form:41 +msgid "Close" +msgstr "Sluiten" + +#: FrmMain.form:46 +msgid "Port" +msgstr "Poort" + +#: FrmMain.form:51 +msgid "Pause" +msgstr "-" + +#: FrmMain.form:56 +msgid "Max. number of clients" +msgstr "Max. aantal cliënten" + +#: FrmMain.form:63 +msgid "No limit" +msgstr "Geen limiet" + +#: FrmMain.form:63 +msgid "1" +msgstr "-" + +#: FrmMain.form:63 +msgid "2" +msgstr "-" + +#: FrmMain.form:63 +msgid "3" +msgstr "-" + +#: FrmMain.form:63 +msgid "4" +msgstr "-" + +#: FrmMain.form:63 +msgid "5" +msgstr "-" + +#: FrmMain.form:63 +msgid "6" +msgstr "-" + +#: FrmMain.form:63 +msgid "7" +msgstr "-" + +#: FrmMain.form:63 +msgid "8" +msgstr "-" + +#: FrmMain.form:63 +msgid "9" +msgstr "-" + +#: FrmMain.form:63 +msgid "10" +msgstr "-" + +#: FrmMain.form:68 +msgid "Type" +msgstr "-" + +#: FrmMain.form:74 +msgid "TCP" +msgstr "-" + +#: FrmMain.form:74 +msgid "UNIX" +msgstr "-" + +#: FrmMain.form:79 +msgid "Path" +msgstr "Pad" + diff --git a/app/examples/Networking/ServerSocket/.lang/ru.po b/app/examples/Networking/ServerSocket/.lang/ru.po new file mode 100644 index 00000000..7aa6de13 --- /dev/null +++ b/app/examples/Networking/ServerSocket/.lang/ru.po @@ -0,0 +1,172 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Networking/ServerSocket/.project:22 +msgid "Server socket example" +msgstr "Пример сокета сервера" + +#: app/examples/Networking/ServerSocket/.project:23 +msgid "" +"Server socket example.\n" +"\n" +"This example shows how to implement a TCP server accepting and managing multiple connections in the same process. You can use the 'ClientSocket' example as a testing peer." +msgstr "" +"Пример сокета сервера\n" +"\n" +"В этом примере показано, как реализовать сервер TCP, принимающий и управляющий несколькими подключениями в одном процессе. Вы можете использовать пример «Сокет клиента» в качестве тестового партнёра." + +#: app/examples/Networking/ServerSocket/.src/FrmMain.class:34 +msgid "Unable to bind socket" +msgstr "Невозможно привязать сокет" + +#: app/examples/Networking/ServerSocket/.src/FrmMain.class:47 +msgid "Connection request from :" +msgstr "Запрос на соединение от:" + +#: app/examples/Networking/ServerSocket/.src/FrmMain.class:49 +msgid "Connection request accepted" +msgstr "Запрос на соединение принят" + +#: app/examples/Networking/ServerSocket/.src/FrmMain.class:58 +msgid "Connection from" +msgstr "Соединение от" + +#: app/examples/Networking/ServerSocket/.src/FrmMain.class:58 +msgid "accepted" +msgstr "принято" + +#: app/examples/Networking/ServerSocket/.src/FrmMain.class:58 +msgid "local port" +msgstr "локальный порт" + +#: app/examples/Networking/ServerSocket/.src/FrmMain.class:106 +msgid "Socket #" +msgstr "Сокет #" + +#: app/examples/Networking/ServerSocket/.src/FrmMain.class:117 +msgid "-- Client working --\n" +msgstr "-- Клиент работает --\n" + +#: app/examples/Networking/ServerSocket/.src/FrmMain.class:123 +msgid "Client #" +msgstr "Клиент #" + +#: app/examples/Networking/ServerSocket/.src/FrmMain.class:123 +msgid "Closed" +msgstr "Закрыт" + +#: app/examples/Networking/ServerSocket/.src/FrmMain.class:131 app/examples/Networking/ServerSocket/.src/FrmMain.form:53 +msgid "Path" +msgstr "Путь" + +#: app/examples/Networking/ServerSocket/.src/FrmMain.class:157 app/examples/Networking/ServerSocket/.src/FrmMain.form:30 +msgid "Pause" +msgstr "Пауза" + +#: app/examples/Networking/ServerSocket/.src/FrmMain.class:160 +msgid "Resume" +msgstr "Возобновить" + +#: app/examples/Networking/ServerSocket/.src/FrmMain.form:5 +msgid "Server Socket Example" +msgstr "Пример сокета сервера" + +#: app/examples/Networking/ServerSocket/.src/FrmMain.form:10 +msgid "Listen" +msgstr "Слушать" + +#: app/examples/Networking/ServerSocket/.src/FrmMain.form:14 +msgid "32340" +msgstr "32340" + +#: app/examples/Networking/ServerSocket/.src/FrmMain.form:22 +msgid "Close" +msgstr "Закрыть" + +#: app/examples/Networking/ServerSocket/.src/FrmMain.form:26 +msgid "Port" +msgstr "Порт" + +#: app/examples/Networking/ServerSocket/.src/FrmMain.form:34 +msgid "Max. number of clients" +msgstr "Макс. количество клиентов" + +#: app/examples/Networking/ServerSocket/.src/FrmMain.form:40 +msgid "No limit" +msgstr "Неограниченно" + +#: app/examples/Networking/ServerSocket/.src/FrmMain.form:40 +msgid "1" +msgstr "1" + +#: app/examples/Networking/ServerSocket/.src/FrmMain.form:40 +msgid "2" +msgstr "2" + +#: app/examples/Networking/ServerSocket/.src/FrmMain.form:40 +msgid "3" +msgstr "3" + +#: app/examples/Networking/ServerSocket/.src/FrmMain.form:40 +msgid "4" +msgstr "4" + +#: app/examples/Networking/ServerSocket/.src/FrmMain.form:40 +msgid "5" +msgstr "5" + +#: app/examples/Networking/ServerSocket/.src/FrmMain.form:40 +msgid "6" +msgstr "6" + +#: app/examples/Networking/ServerSocket/.src/FrmMain.form:40 +msgid "7" +msgstr "7" + +#: app/examples/Networking/ServerSocket/.src/FrmMain.form:40 +msgid "8" +msgstr "8" + +#: app/examples/Networking/ServerSocket/.src/FrmMain.form:40 +msgid "9" +msgstr "9" + +#: app/examples/Networking/ServerSocket/.src/FrmMain.form:40 +msgid "10" +msgstr "10" + +#: app/examples/Networking/ServerSocket/.src/FrmMain.form:44 +msgid "Type" +msgstr "Тип" + +#: app/examples/Networking/ServerSocket/.src/FrmMain.form:49 +msgid "TCP" +msgstr "TCP" + +#: app/examples/Networking/ServerSocket/.src/FrmMain.form:49 +msgid "UNIX" +msgstr "UNIX" + diff --git a/app/examples/Networking/ServerSocket/.project b/app/examples/Networking/ServerSocket/.project new file mode 100644 index 00000000..a456eefd --- /dev/null +++ b/app/examples/Networking/ServerSocket/.project @@ -0,0 +1,21 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.6.90 +Title=Server socket example +Startup=FrmMain +Icon=serversocket.png +Version=1.0.0 +Component=gb.image +Component=gb.gui +Component=gb.net +Component=gb.net.curl +Description="Server socket example.\n\nThis example shows how to implement a TCP server accepting and managing multiple connections in the same process. You can use the 'ClientSocket' example as a testing peer." +Environment="GB_GUI=gb.qt5" +TabSize=2 +Translate=1 +Language=fr +Maintainer=benoit +Vendor=Example +Address=benoit@desnouettes +License=General Public Licence +Packager=1 +Tags=Network diff --git a/app/examples/Networking/ServerSocket/.src/FrmMain.class b/app/examples/Networking/ServerSocket/.src/FrmMain.class new file mode 100644 index 00000000..285366b7 --- /dev/null +++ b/app/examples/Networking/ServerSocket/.src/FrmMain.class @@ -0,0 +1,176 @@ +' Gambas class file + +Private Waiting As Boolean +Private $iId As Integer + +Public Sub btnListen_Click() + + If cmbType.Index = 0 Then + 'TCP + MyServerSocket.Type = Net.Internet + ' The port to listen to + MyServerSocket.Port = Val(txtPort.Text) + ' we start listening + MyServerSocket.Listen(cmbMaxClient.Index) + Else + ' UNIX + MyServerSocket.Type = Net.Local ' You could also use Net.Unix + MyServerSocket.Path = txtPath.Text + MyServerSocket.Listen(cmbMaxClient.Index) + End If + If MyServerSocket.Status = Net.Active Then + ' listening + btnListen.Enabled = False + btnClose.Enabled = True + cmbMaxClient.Enabled = False + cmbType.Enabled = False + txtPath.Enabled = False + End If + +End + +Public Sub MyServerSocket_Error() + + Message.Error(("Unable to bind socket")) + +End + +Public Sub MyServerSocket_Connection(sHost As String) + '******************************* + ' A client has arrived! + ' let's accept it + + Dim Obj As Socket + + If MyServerSocket.Status <= Net.Inactive Then Return + If cmbType.Index = 0 Then + txtLog.Text = txtLog.Text & ("Connection request from :") & " " & sHost & Chr(13) & Chr(10) + Else + txtLog.Text = txtLog.Text & ("Connection request accepted") & Chr(13) & Chr(10) + End If + + Obj = MyServerSocket.Accept() + Obj.Blocking = False + Inc $iId + Obj.Tag = [$iId, 0, ""] + + If Obj.Status = Net.Connected And cmbType.Index = 0 Then + txtLog.Text = txtLog.Text & ("Connection from") & " " & Obj.RemoteHost & ":" & Obj.RemotePort & " " & ("accepted") & " (" & ("local port") & " " & Obj.LocalPort & ")" & Chr(13) & Chr(10) + End If + +End + +Public Sub Socket_Write() + + Dim hSocket As Socket = Last + Dim iInd As Integer + + 'Debug hSocket;; hSocket.Tag + iInd = hSocket.Tag[1] + If iInd < 0 Then Return + + Do + Inc iInd + If iInd > 10 Then + hSocket.Tag[1] = -1 + Return + Endif + + 'Debug iInd + Try Print #hSocket, iInd & ":" & hSocket.Tag[2] & Space$(512) & "\n"; + If Error Then + Debug Error.Text + Break + Endif + Loop + + hSocket.Tag[1] = iInd + +Catch + +End + +Public Sub Socket_Read() + + Dim sBuf As String + Dim iInd As Integer + + '****************************** + ' When some data arrives to + ' our server, we respond with + ' an echo + '***************************** + + If Last.Status <> Net.Connected Then Return + Read #Last, sBuf, Lof(Last) + txtLog.Text &= ("Socket #") & Last.Tag[0] & " --> " & sBuf & "\n" + + Last.Tag[1] = 0 + Last.Tag[2] = sBuf + + Socket_Write + +End + +Public Sub Socket_Ready() + + txtLog.Text &= ("-- Client working --\n") + +End + +Public Sub Socket_Closed() + + txtLog.Text &= ("Client #") & Last.Tag[0] & " " & ("Closed") & "\n" + +End + +Public Sub Form_Open() + + txtPath.Text = Application.Path & "/" & "gambas" + txtPath.Enabled = False + TextLabel3.Text = ("Path") + +End + +Public Sub btnClose_Click() + + MyServerSocket.Close() + btnClose.Enabled = False + btnListen.Enabled = True + cmbMaxClient.Enabled = True + cmbType.Enabled = True + cmbType_Click() + +End + +Public Sub Form_Close() + + ' We have to be sure of closing the server before exiting + MyServerSocket.Close() + +End + +Public Sub btnPause_Click() + + If Waiting Then + MyServerSocket.Resume() + btnPause.Text = ("Pause") + Else + MyServerSocket.Pause() + btnPause.Text = ("Resume") + End If + Waiting = Not Waiting + +End + +Public Sub cmbType_Click() + + If cmbType.Index = 0 Then + txtPort.Enabled = True + txtPath.Enabled = False + Else + txtPort.Enabled = False + txtPath.Enabled = True + End If + +End diff --git a/app/examples/Networking/ServerSocket/.src/FrmMain.form b/app/examples/Networking/ServerSocket/.src/FrmMain.form new file mode 100644 index 00000000..c560ad75 --- /dev/null +++ b/app/examples/Networking/ServerSocket/.src/FrmMain.form @@ -0,0 +1,61 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(36,28,79,51) + Text = ("Server Socket Example") + Icon = Picture["serversocket.png"] + Resizable = False + { btnListen Button + MoveScaled(60,1,18,4) + Text = ("Listen") + } + { txtPort TextBox + MoveScaled(16,6,43,4) + Text = ("32340") + } + { txtLog TextArea + MoveScaled(1,22,77,28) + } + { btnClose Button + MoveScaled(60,6,18,4) + Enabled = False + Text = ("Close") + } + { TextLabel1 TextLabel + MoveScaled(1,6,14,4) + Text = ("Port") + } + { btnPause Button + MoveScaled(1,17,16,4) + Text = ("Pause") + } + { Label1 Label + MoveScaled(18,17,38,4) + Text = ("Max. number of clients") + Alignment = Align.Right + } + { cmbMaxClient ComboBox + MoveScaled(57,17,21,4) + ReadOnly = True + List = [("No limit"), ("1"), ("2"), ("3"), ("4"), ("5"), ("6"), ("7"), ("8"), ("9"), ("10")] + } + { TextLabel2 TextLabel + MoveScaled(1,1,14,4) + Text = ("Type") + } + { cmbType ComboBox + MoveScaled(16,1,43,4) + ReadOnly = True + List = [("TCP"), ("UNIX")] + } + { TextLabel3 TextLabel + MoveScaled(1,11,14,4) + Text = ("Path") + } + { txtPath TextBox + MoveScaled(16,11,62,4) + } + { MyServerSocket #ServerSocket + #MoveScaled(8,3) + } +} diff --git a/app/examples/Networking/ServerSocket/serversocket.png b/app/examples/Networking/ServerSocket/serversocket.png new file mode 100644 index 0000000000000000000000000000000000000000..9049f7acf57321531fc3f227f17e209bcabc3054 GIT binary patch literal 2122 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 literal 0 HcmV?d00001 diff --git a/app/examples/Networking/UDPServerClient/.lang/ca.po b/app/examples/Networking/UDPServerClient/.lang/ca.po new file mode 100644 index 00000000..9decadc0 --- /dev/null +++ b/app/examples/Networking/UDPServerClient/.lang/ca.po @@ -0,0 +1,104 @@ +# Catalan translation of UDPServerClient +# Copyright (C) 2000-2010 Benoît Minisini. +# This file is distributed under the same license as the UDPServerClient package. +# Jordi Sayol , 2007-2010. +# +# +msgid "" +msgstr "" +"Project-Id-Version: UDPServerClient\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2010-12-17 01:10+0100\n" +"Last-Translator: Jordi Sayol \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: FrmClient.form:54 +msgid "127.0.0.1" +msgstr "-" + +#: FrmClient.form:59 FrmServer.form:42 +msgid "32340" +msgstr "-" + +#: FrmClient.form:18 +msgid "Client" +msgstr "Client" + +#: FrmClient.form:30 +msgid "Client Side" +msgstr "Costat del client" + +#: FrmClient.class:60 FrmServer.class:73 +msgid "Data --> " +msgstr "Dades -->" + +#: FrmClient.class:50 FrmServer.class:59 +msgid "Error Receiving Data" +msgstr "Error rebent dades" + +#: FrmClient.class:48 FrmServer.class:57 +msgid "Error Sending Data" +msgstr "Error enviant dades" + +#: FrmClient.form:39 +msgid "Host IP" +msgstr "IP del servidor" + +#: FrmServer.form:19 +msgid "New UDP Client window" +msgstr "Nova finestra de client UDP" + +#: FrmClient.form:48 +msgid "Port" +msgstr "Port" + +#: FrmServer.form:30 +msgid "Port :" +msgstr "Port:" + +#: FrmClient.class:59 FrmServer.class:72 +msgid "Received data from : " +msgstr "Dades rebudes des de:" + +#: FrmClient.form:76 +msgid "Send Data" +msgstr "Envia dades" + +#: FrmClient.form:64 FrmServer.form:47 +msgid "Start !" +msgstr "Endavant!" + +#: FrmClient.class:15 FrmServer.class:24 +msgid "Stop" +msgstr "Atura" + +#: FrmServer.form:24 +msgid "Super String Reverse Server" +msgstr "Super servidor de cadenes inverses" + +#: FrmClient.class:46 FrmServer.class:55 +msgid "System does not allow to create a socket" +msgstr "El sistema no permet crear un sòcol" + +#: .project:1 +msgid "UDP sockets example" +msgstr "Exemple de sòcols UDP" + +#: FrmServer.form:14 +msgid "UDP Test" +msgstr "Prova l'UDP" + +#: FrmClient.class:44 FrmServer.class:53 +msgid "Unable to Bind to that port" +msgstr "No es pot vincular amb aquell port" + +#: FrmClient.form:91 +msgid "Write Here data to send then press \"Send Data\"" +msgstr "Escriviu aquí dades per enviar i després premeu \"Envia dades\"" + diff --git a/app/examples/Networking/UDPServerClient/.lang/cs.po b/app/examples/Networking/UDPServerClient/.lang/cs.po new file mode 100644 index 00000000..82d4237b --- /dev/null +++ b/app/examples/Networking/UDPServerClient/.lang/cs.po @@ -0,0 +1,96 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "UDP sockets example" +msgstr "Příklad UDP spojení" + +#: FrmClient.class:15 FrmServer.class:24 +msgid "Stop" +msgstr "-" + +#: FrmClient.class:44 FrmServer.class:53 +msgid "Unable to Bind to that port" +msgstr "Nelze se spojit s portem" + +#: FrmClient.class:46 FrmServer.class:55 +msgid "System does not allow to create a socket" +msgstr "Systém nemá přístup k vytváření soketu" + +#: FrmClient.class:48 FrmServer.class:57 +msgid "Error Sending Data" +msgstr "Chyba posílaných dat" + +#: FrmClient.class:50 FrmServer.class:59 +msgid "Error Receiving Data" +msgstr "Chyba příjmaných dat" + +#: FrmClient.class:59 FrmServer.class:72 +msgid "Received data from : " +msgstr "Příjmané data od :" + +#: FrmClient.class:60 FrmServer.class:73 +msgid "Data --> " +msgstr "-" + +#: FrmClient.form:18 +msgid "Client" +msgstr "Klient" + +#: FrmClient.form:30 +msgid "Client Side" +msgstr "Klientská strana" + +#: FrmClient.form:39 +msgid "Host IP" +msgstr "-" + +#: FrmClient.form:48 +msgid "Port" +msgstr "-" + +#: FrmClient.form:54 +msgid "127.0.0.1" +msgstr "-" + +#: FrmClient.form:59 FrmServer.form:42 +msgid "32340" +msgstr "-" + +#: FrmClient.form:64 FrmServer.form:47 +msgid "Start !" +msgstr "-" + +#: FrmClient.form:76 +msgid "Send Data" +msgstr "Poslat data" + +#: FrmClient.form:91 +msgid "Write Here data to send then press \"Send Data\"" +msgstr "Zapište zde data na poslání a zmáčkněte \"Poslat data\"" + +#: FrmServer.form:14 +msgid "UDP Test" +msgstr "-" + +#: FrmServer.form:19 +msgid "New UDP Client window" +msgstr "Nové okno UDP klienta" + +#: FrmServer.form:24 +msgid "Super String Reverse Server" +msgstr "Super server na obrácení řetězeců" + +#: FrmServer.form:30 +msgid "Port :" +msgstr "-" diff --git a/app/examples/Networking/UDPServerClient/.lang/es.po b/app/examples/Networking/UDPServerClient/.lang/es.po new file mode 100644 index 00000000..71c1f02b --- /dev/null +++ b/app/examples/Networking/UDPServerClient/.lang/es.po @@ -0,0 +1,101 @@ +# #-#-#-#-# FrmClient.pot (PACKAGE VERSION) #-#-#-#-# +# /home/daniel/GAMBAS/gambas-0.93pre1/examples/Networking/UDPServerClient/FrmClient.class +# Generated by Gambas compiler +# FIRST AUTHOR , YEAR. +# +# #-#-#-#-# FrmServer.pot (PACKAGE VERSION) #-#-#-#-# +# /home/daniel/GAMBAS/gambas-0.93pre1/examples/Networking/UDPServerClient/FrmServer.class +# Generated by Gambas compiler +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: FrmClient.class:14 FrmServer.class:22 +msgid "Stop" +msgstr "Parar" + +#: FrmClient.class:20 FrmServer.class:27 +msgid "Start !" +msgstr "¡ Iniciar !" + +#: FrmClient.class:42 FrmServer.class:51 +msgid "Unable to Bind to that port" +msgstr "Imposible abrir el puerto" + +#: FrmClient.class:44 FrmServer.class:53 +msgid "System does not allow to create a socket" +msgstr "El sistema no permite crear un nuevo socket" + +#: FrmClient.class:46 FrmServer.class:55 +msgid "Error Sending Data" +msgstr "Error enviando datos" + +#: FrmClient.class:48 FrmServer.class:57 +msgid "Error Receiving Data" +msgstr "Error recibiendo datos" + +#: FrmClient.class:57 FrmServer.class:70 +msgid "Received data from : " +msgstr "Datos recibidos desde:" + +#: FrmClient.class:58 FrmServer.class:71 +msgid "Data --> " +msgstr "Datos -->" + +#: FrmClient.class:93 +msgid "Client" +msgstr "Cliente" + +#: FrmClient.class:105 +msgid "Client Side" +msgstr "Lado cliente" + +#: FrmClient.class:114 +msgid "Host IP" +msgstr "IP del Host" + +#: FrmClient.class:123 +msgid "Port" +msgstr "Puerto" + +#: FrmClient.class:129 +msgid "127.0.0.1" +msgstr "127.0.0.1" + +#: FrmClient.class:134 FrmServer.class:129 +msgid "32340" +msgstr "32340" + +#: FrmClient.class:151 +msgid "Send Data" +msgstr "Enviar datos" + +#: FrmClient.class:165 +msgid "Write Here data to send then press \"Send Data\"" +msgstr "Escriba aquí los datos a enviar y pulse \"Enviar datos\"" + +#: FrmServer.class:101 +msgid "UDP Test" +msgstr "Test UDP" + +#: FrmServer.class:106 +msgid "New UDP Client window" +msgstr "Nueva ventana de cliente UDP" + +#: FrmServer.class:111 +msgid "Super String Reverse Server" +msgstr "Superservidor de Inversión de Cadenas" + +#: FrmServer.class:117 +msgid "Port :" +msgstr "Puerto:" diff --git a/app/examples/Networking/UDPServerClient/.lang/nl.po b/app/examples/Networking/UDPServerClient/.lang/nl.po new file mode 100644 index 00000000..34cb63bc --- /dev/null +++ b/app/examples/Networking/UDPServerClient/.lang/nl.po @@ -0,0 +1,96 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2014-09-21 23:57+0100\n" +"Last-Translator: Willy Raets \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "UDP sockets example" +msgstr "UDP sockets voorbeeld" + +#: FrmClient.form:18 +msgid "Client" +msgstr "Cliënt" + +#: FrmClient.form:30 +msgid "Client Side" +msgstr "Cliënt zijde" + +#: FrmClient.form:39 +msgid "Host IP" +msgstr "Gast IP" + +#: FrmClient.form:48 +msgid "Port" +msgstr "Poort" + +#: FrmClient.form:54 +msgid "127.0.0.1" +msgstr "-" + +#: FrmClient.form:59 FrmServer.form:42 +msgid "32340" +msgstr "-" + +#: FrmClient.form:64 FrmServer.form:47 +msgid "Start !" +msgstr "-" + +#: FrmClient.form:76 +msgid "Send Data" +msgstr "Verzend Data" + +#: FrmClient.form:91 +msgid "Write Here data to send then press \"Send Data\"" +msgstr "Schrijf hier de data om te verzenden \"Verzend Data\"" + +#: FrmClient.class:15 FrmServer.class:24 +msgid "Stop" +msgstr "-" + +#: FrmClient.class:44 FrmServer.class:53 +msgid "Unable to Bind to that port" +msgstr "Kan niet binden met die poort" + +#: FrmClient.class:46 FrmServer.class:55 +msgid "System does not allow to create a socket" +msgstr "Systeem staat niet toe een socket te creëren" + +#: FrmClient.class:48 FrmServer.class:57 +msgid "Error Sending Data" +msgstr "Fout bij data verzending" + +#: FrmClient.class:50 FrmServer.class:59 +msgid "Error Receiving Data" +msgstr "Fout bij data ontvangst" + +#: FrmClient.class:59 FrmServer.class:72 +msgid "Received data from : " +msgstr "Data ontvangen van:" + +#: FrmClient.class:60 FrmServer.class:73 +msgid "Data --> " +msgstr "-" + +#: FrmServer.form:14 +msgid "UDP Test" +msgstr "-" + +#: FrmServer.form:19 +msgid "New UDP Client window" +msgstr "Nieuw UDP cliënt venster" + +#: FrmServer.form:24 +msgid "Super String Reverse Server" +msgstr "-" + +#: FrmServer.form:30 +msgid "Port :" +msgstr "Poort:" + diff --git a/app/examples/Networking/UDPServerClient/.lang/ru.po b/app/examples/Networking/UDPServerClient/.lang/ru.po new file mode 100644 index 00000000..e59d53f4 --- /dev/null +++ b/app/examples/Networking/UDPServerClient/.lang/ru.po @@ -0,0 +1,110 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Networking/UDPServerClient/.project:18 +msgid "UDP sockets example" +msgstr "Пример сокетов UDP" + +#: app/examples/Networking/UDPServerClient/.src/FrmClient.class:15 app/examples/Networking/UDPServerClient/.src/FrmServer.class:24 +msgid "Stop" +msgstr "Стоп" + +#: app/examples/Networking/UDPServerClient/.src/FrmClient.class:21 app/examples/Networking/UDPServerClient/.src/FrmClient.class:39 app/examples/Networking/UDPServerClient/.src/FrmClient.form:44 app/examples/Networking/UDPServerClient/.src/FrmServer.class:29 app/examples/Networking/UDPServerClient/.src/FrmServer.class:49 app/examples/Networking/UDPServerClient/.src/FrmServer.form:32 +msgid "Start !" +msgstr "Начать!" + +#: app/examples/Networking/UDPServerClient/.src/FrmClient.class:44 app/examples/Networking/UDPServerClient/.src/FrmServer.class:53 +msgid "Unable to Bind to that port" +msgstr "Невозможно привязать к этому порту" + +#: app/examples/Networking/UDPServerClient/.src/FrmClient.class:46 app/examples/Networking/UDPServerClient/.src/FrmServer.class:55 +msgid "System does not allow to create a socket" +msgstr "Система не позволяет создать сокет" + +#: app/examples/Networking/UDPServerClient/.src/FrmClient.class:48 app/examples/Networking/UDPServerClient/.src/FrmServer.class:57 +msgid "Error Sending Data" +msgstr "Ошибка при отправке данных" + +#: app/examples/Networking/UDPServerClient/.src/FrmClient.class:50 app/examples/Networking/UDPServerClient/.src/FrmServer.class:59 +msgid "Error Receiving Data" +msgstr "Ошибка при получении данных" + +#: app/examples/Networking/UDPServerClient/.src/FrmClient.class:59 app/examples/Networking/UDPServerClient/.src/FrmServer.class:72 +msgid "Received data from : " +msgstr "Полученные данные из: " + +#: app/examples/Networking/UDPServerClient/.src/FrmClient.class:60 app/examples/Networking/UDPServerClient/.src/FrmServer.class:73 +msgid "Data --> " +msgstr "Данные --> " + +#: app/examples/Networking/UDPServerClient/.src/FrmClient.form:5 +msgid "Client" +msgstr "Клиент" + +#: app/examples/Networking/UDPServerClient/.src/FrmClient.form:15 +msgid "Client Side" +msgstr "Сторона клиента" + +#: app/examples/Networking/UDPServerClient/.src/FrmClient.form:23 +msgid "Host IP" +msgstr "IP хоста" + +#: app/examples/Networking/UDPServerClient/.src/FrmClient.form:31 +msgid "Port" +msgstr "Порт" + +#: app/examples/Networking/UDPServerClient/.src/FrmClient.form:36 +msgid "127.0.0.1" +msgstr "127.0.0.1" + +#: app/examples/Networking/UDPServerClient/.src/FrmClient.form:40 app/examples/Networking/UDPServerClient/.src/FrmServer.form:28 +msgid "32340" +msgstr "32340" + +#: app/examples/Networking/UDPServerClient/.src/FrmClient.form:53 +msgid "Send Data" +msgstr "Отправить данные" + +#: app/examples/Networking/UDPServerClient/.src/FrmClient.form:65 +msgid "Write Here data to send then press \"Send Data\"" +msgstr "Напишите здесь данные для отправки, затем нажмите «Отправить данные»" + +#: app/examples/Networking/UDPServerClient/.src/FrmServer.form:5 +msgid "UDP Test" +msgstr "Тест UDP" + +#: app/examples/Networking/UDPServerClient/.src/FrmServer.form:9 +msgid "New UDP Client window" +msgstr "Новое окно UDP-клиента" + +#: app/examples/Networking/UDPServerClient/.src/FrmServer.form:13 +msgid "Super String Reverse Server" +msgstr "Суперстроковый обрат. сервер" + +#: app/examples/Networking/UDPServerClient/.src/FrmServer.form:18 +msgid "Port :" +msgstr "Порт:" + diff --git a/app/examples/Networking/UDPServerClient/.project b/app/examples/Networking/UDPServerClient/.project new file mode 100644 index 00000000..24f98966 --- /dev/null +++ b/app/examples/Networking/UDPServerClient/.project @@ -0,0 +1,17 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.0.0 +Title=UDP sockets example +Startup=FrmServer +Icon=udpsocket.png +Version=3.6.2 +VersionFile=1 +Component=gb.image +Component=gb.gui +Component=gb.net +TabSize=2 +Translate=1 +Language=fr +Maintainer=benoit +Vendor=Princeton +Address=benoit@desnouettes +License=General Public Licence diff --git a/app/examples/Networking/UDPServerClient/.src/FrmClient.class b/app/examples/Networking/UDPServerClient/.src/FrmClient.class new file mode 100644 index 00000000..dd1ba40e --- /dev/null +++ b/app/examples/Networking/UDPServerClient/.src/FrmClient.class @@ -0,0 +1,73 @@ +' Gambas class file +Public UDPClient As UdpSocket +Public Sub Form_Open() + UDPClient = New UdpSocket As "UDPClient" +End +'/////////////////////////////////////////////////// +' Client stuff +'/////////////////////////////////////////////////// +Public Sub Button2_Click() + + If UDPClient.Status <= Net.Inactive Then + 'UDPClient.Path = "/tmp/gambas-udp-client" + UDPClient.Bind + If UDPClient.Status = Net.Active Then + Button2.Text = ("Stop") + TxtData.Enabled = True + Button3.Enabled = True + End If + Else + Close #UDPClient + Button2.Text = ("Start !") + TxtData.Enabled = False + Button3.Enabled = False + End If + + +End + +Public Sub Button3_Click() + + UDPCLient.TargetPort = TxtPort.Text + UDPCLient.TargetHost = TxtIP.Text + 'UDPClient.TargetPath = "/tmp/gambas-udp-socket" + Write #UDPCLient, TxtData.Text, Len(TxtData.Text) +End + +Public Sub UDPClient_Error() + + Button2.Text = ("Start !") + TxtData.Enabled = False + Button3.Enabled = False + Select Case UDPClient.Status + Case Net.CannotBindSocket + Message.Error(("Unable to Bind to that port")) + Case Net.CannotCreateSocket + Message.Error(("System does not allow to create a socket")) + Case Net.CannotRead + Message.Error(("Error Sending Data")) + Case Net.CannotWrite + Message.Error(("Error Receiving Data")) + End Select + +End + +Public Sub UDPClient_Read() + + Dim sCad As String + Read #UDPClient, sCad, Lof(UDPClient) + TxtRecClient.Text = TxtRecClient.Text & ("Received data from : ") & UDPClient.SourceHost & ":" & UdpClient.SourcePort & Chr(13) & Chr(10) + TxtRecClient.Text = TxtRecClient.Text & ("Data --> ") & sCad & Chr(13) & Chr(10) + +End + + +Public Sub Form_Close() + + If UDPClient.Status > 0 Then Close #UDPClient + + +End + + + diff --git a/app/examples/Networking/UDPServerClient/.src/FrmClient.form b/app/examples/Networking/UDPServerClient/.src/FrmClient.form new file mode 100644 index 00000000..657d7201 --- /dev/null +++ b/app/examples/Networking/UDPServerClient/.src/FrmClient.form @@ -0,0 +1,68 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(10.1429,48.5714,93,43) + Text = ("Client") + Resizable = False + { Panel2 Panel + MoveScaled(0,0,93,43) + Background = &H4F87E7& + { Label3 Label + MoveScaled(0,1,29,4) + Font = Font["Bold"] + Background = &H4F87E7& + Foreground = &HFFFF7F& + Text = ("Client Side") + Alignment = Align.Center + } + { Label4 Label + MoveScaled(1,5,12,4) + Font = Font["Bold"] + Background = &H4F87E7& + Foreground = &HFFFF7F& + Text = ("Host IP") + Alignment = Align.Center + } + { Label5 Label + MoveScaled(1,9,12,4) + Font = Font["Bold"] + Background = &H4F87E7& + Foreground = &HFFFF7F& + Text = ("Port") + Alignment = Align.Center + } + { TxtIP TextBox + MoveScaled(14,5,14,4) + Text = ("127.0.0.1") + } + { TxtPort TextBox + MoveScaled(14,10,8,4) + Text = ("32340") + } + { Button2 Button + MoveScaled(35,5,11,4) + Text = ("Start !") + } + { TxtData TextBox + MoveScaled(2,19,60,4) + Enabled = False + } + { Button3 Button + MoveScaled(63,19,29,4) + Enabled = False + Text = ("Send Data") + Default = True + } + { TxtRecClient TextArea + MoveScaled(2,24,90,17) + ReadOnly = True + } + { Label1 Label + MoveScaled(2,15,90,3) + Font = Font["Bold"] + Background = &H4F87E7& + Foreground = &HFFFF00& + Text = ("Write Here data to send then press \"Send Data\"") + } + } +} diff --git a/app/examples/Networking/UDPServerClient/.src/FrmServer.class b/app/examples/Networking/UDPServerClient/.src/FrmServer.class new file mode 100644 index 00000000..06a96c0e --- /dev/null +++ b/app/examples/Networking/UDPServerClient/.src/FrmServer.class @@ -0,0 +1,86 @@ +' Gambas class file + +'PRIVATE UDPServer AS UdpSocket +Public Sub Button1_Click() + + Dim MyFrm As FrmClient + MyFrm = New FrmClient + MyFrm.Visible = True + + + +End + +'////////////////////////////////////////////////// +' Server Stuff +'////////////////////////////////////////////////// +Public Sub Button2_Click() + + If UDPServer.Status <= Net.Inactive Then + UDPServer.Port = CInt(TextBox1.Text) + 'UDPServer.Path = "/tmp/gambas-udp-server" + UDPServer.Bind + If UDPServer.Status = Net.Active Then + Button2.Text = ("Stop") + TextBox1.Enabled = False + End If + Else + Close #UDPServer + Button2.Text = ("Start !") + TextBox1.Enabled = True + End If + +End + +'PUBLIC SUB Form_Open() +' +' UDPServer = NEW UdpSocket AS "UDPServer" +' +'END + +Public Sub Form_Close() + + If UDPServer.Status > 0 Then Close #UDPServer + +End + +Public Sub UDPServer_Error() + + Button2.Text = ("Start !") + TextBox1.Enabled = True + Select Case UDPServer.Status + Case Net.CannotBindSocket + Message.Error(("Unable to Bind to that port")) + Case Net.CannotCreateSocket + Message.Error(("System does not allow to create a socket")) + Case Net.CannotRead + Message.Error(("Error Sending Data")) + Case Net.CannotWrite + Message.Error(("Error Receiving Data")) + End Select + +End + +Public Sub UDPServer_Read() + + Dim sCadRet As String + Dim sCad As String + Dim MyLoop As Integer + + sCadRet = "" + Read #UDPServer, sCad, Lof(UDPserver) + TextArea1.Text = TextArea1.Text & ("Received data from : ") & UDPServer.SourceHost & ":" & UDPServer.SourcePort & Chr(13) & Chr(10) + TextArea1.Text = TextArea1.Text & ("Data --> ") & sCad & Chr(13) & Chr(10) + If Len(sCad) > 0 Then + For myloop = String.Len(sCad) To 1 Step -1 + sCadRet = sCadRet & String.Mid(sCad, myloop, 1) + Next + UDPServer.TargetHost = UDPServer.SourceHost + UDPServer.TargetPort = UDPServer.SourcePort + 'UDPServer.TargetPath = UDPServer.SourcePath + Write #UDPServer, sCadRet, Len(sCadRet) + End If + +End + + diff --git a/app/examples/Networking/UDPServerClient/.src/FrmServer.form b/app/examples/Networking/UDPServerClient/.src/FrmServer.form new file mode 100644 index 00000000..3c4a97dc --- /dev/null +++ b/app/examples/Networking/UDPServerClient/.src/FrmServer.form @@ -0,0 +1,38 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(9,10.5,37,41) + Text = ("UDP Test") + Resizable = False + { Button1 Button + MoveScaled(4,1,30,4) + Text = ("New UDP Client window") + } + { Label1 Label + MoveScaled(2,7,33,4) + Text = ("Super String Reverse Server") + Alignment = Align.Center + } + { Label2 Label + MoveScaled(1,12,10,4) + Text = ("Port :") + Alignment = Align.Center + } + { TextArea1 TextArea + MoveScaled(1,17,35,23) + Text = ("") + ReadOnly = True + } + { TextBox1 TextBox + MoveScaled(12,12,10,4) + Text = ("32340") + } + { Button2 Button + MoveScaled(23,12,13,4) + Text = ("Start !") + } + { UDPServer #UdpSocket + #X = 132 + #Y = 174 + } +} diff --git a/app/examples/Networking/UDPServerClient/udpsocket.png b/app/examples/Networking/UDPServerClient/udpsocket.png new file mode 100644 index 0000000000000000000000000000000000000000..d53f902f8dab20080e181ae74c0bb13501ba6203 GIT binary patch literal 2161 zcmV-%2#)uOP)}EH0W7bP50d0vU8YQ4D7^EVhl+ubt2(=ViCAE}7 zg|ww!h?G(i+mcvpB-NOt2Gk}}@Eea@UYr+=)qBD6F^UU>QV z{`h!*JkRreoCDWTM~@!u86O`%G&wnW?D+BHv1>W|-%9@c<`4+o5b%QvP=Hzv3J-vN z|F8ASeQ{WH?8{_f4owKQ@eK!QcjD|o{aMo%=+N|}}%@00UOe7M) zY&I**%*>>wr>CDV4C90A2GHSh4Rqaq{|~*#ejDb&jo|ZuEK{^KAsyYJ^>5#;<@0%_ zE?j6_dhflTXW*6n`}f<24av?hX1MYWbpNX`$|6yQY z;Crg7x|f%iE4f^5t|E04xwmJ6hTq21&xaAr@pev(n1CX+9v)9GI~1>k{gT0XCmFMt#Q6Ewd>zxhv+6KVQIgZ_k$ zs`+sQiBzK#?V)>-TrTnI^t3rKF>xrfwDhCL9(!!LDFC-9Ch+?p9D?{}NM1y^#ZRZp zqBD>MSpreV7DST8AoAc2WKWQ*$t3AFUeBjqKk?%C$3AFkIDqI@Sc%4h3DA%NL?50;=YIdO%#^QVZ6o$z%p%x-;NKx`U7)m^Q$N8s;o!O7QQXe(SU zLB#?|21x-)X4!OOS`O)%t7N9e=+c*I83?KIP|MvNEkRGS0J5#A4OW+7brmE5u6zvL zF?fF-w)H@p3uKwTV3|wFF$6QmXtYQq7{T4Jh1Cz2dhND=##*k>6o4tqSxUwA;hF-o zDbQ5t-T?2UVRH?Jy6A3`2nP*BQ9@B#5Cj2g7DCX6xMuL@7QfgYj|E&Fy;qUtyWAc< zp}W*}pG)&QRnso78Af3(H)E_BCyK?=`**GyMF82b8y|-(a~rbsspm3e7S@4!<8W>c z77Tp{AzQ?mHLzrPY9*I<58r;vL#pitW7YYq0fTLS^Xtc!(AEnlgc znR2NzRky6aRZEprW_s4>>5R0>mX#1<0SM?g4U2l+#V-hRBCmSIhm~8Lcc3Zhg?DEZ-Lj&gTEE>1ntN+6sx3*8kL@%L^^v&E?%Ow@)j-?Xe@!>N6qgyOWEwZO#uuK4?o`9 z+xu`h9G1)F^3wUY-~NsI+gH9}+#cI#4@ZR+J%$tCP9pIoT&hBLE{|x{z^;SWhI)-c zEOxn`&7Ny21HoXhI}{4JOw%k+PEJ03F_U>_E|Y&^@pN)><#H8yU?=h6EriY0}qTs)0Wtbt`gp#&c-QRyqqO`bdVyZfLnG#kP%WI_xC0$-2E(J29 zi{0JbL667dT)cSkFEims%lM5O`V*WnE3AA%s44&=d{1LNPruNy$6Qu%8pleyb8&HVWI n_>cGO*)t390N8->zs~*(t`eRES13jV00000NkvXXu0mjfthg;C literal 0 HcmV?d00001 diff --git a/app/examples/Networking/WebBrowser/.directory b/app/examples/Networking/WebBrowser/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/app/examples/Networking/WebBrowser/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/app/examples/Networking/WebBrowser/.icon.png b/app/examples/Networking/WebBrowser/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..891cc0287affd5cb5a64dc2bb2120470c7e9f51e GIT binary patch literal 3585 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, 2007-2010. +# +# +msgid "" +msgstr "" +"Project-Id-Version: WebBrowser\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2011-03-20 23:31+0100\n" +"Last-Translator: Jordi Sayol \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: FBrowser.form:100 +msgid "0" +msgstr "-" + +#: FBrowser.form:95 +msgid "-1" +msgstr "-" + +#: FBrowser.form:105 +msgid "+1" +msgstr "-" + +#: FBrowser.form:90 +msgid "-2" +msgstr "-" + +#: FBrowser.form:110 +msgid "+2" +msgstr "-" + +#: FBrowser.form:115 +msgid "+3" +msgstr "-" + +#: FBrowser.form:120 +msgid "+4" +msgstr "-" + +#: FBrowser.form:262 FEditable.form:18 +msgid "Bold" +msgstr "Negreta" + +#: FAuth.form:78 FOption.form:68 +msgid "Cancel" +msgstr "Canceŀla" + +#: FBrowser.form:439 +msgid "Case sensitive" +msgstr "Sensible a caixa" + +#: FBrowser.form:306 +msgid "Centered" +msgstr "Centrat" + +#: FBrowser.form:218 +msgid "Copy" +msgstr "Copia" + +#: FBrowser.form:226 +msgid "Cut" +msgstr "Retalla" + +#: FDownloadList.form:9 +msgid "Download manager" +msgstr "Gestor de baixades" + +#: FBrowser.form:384 +msgid "Font family" +msgstr "Família de la font" + +#: FBrowser.form:394 +msgid "Font size" +msgstr "Mida de la font" + +#: FBrowser.form:74 +msgid "Gambas WebKit" +msgstr "-" + +#: FBrowser.form:446 +msgid "Highlight" +msgstr "Ressaltat" + +#: FOption.form:33 +msgid "Host" +msgstr "Amfitrió" + +#: FOption.form:81 +msgid "HTTP proxy" +msgstr "Servidor intermediari HTTP" + +#: FBrowser.form:334 +msgid "Indent" +msgstr "Sagnat" + +#: FBrowser.form:270 +msgid "Italic" +msgstr "Cursiva" + +#: FBrowser.form:322 +msgid "Justified" +msgstr "Justificat" + +#: FBrowser.form:298 +msgid "Left aligned" +msgstr "Alineat a l'esquerra" + +#: .project:1 +msgid "Light browser based on WebKit component" +msgstr "Navegador lleuger basat en el component WebKit" + +#: FOption.form:81 +msgid "No proxy" +msgstr "Sense servidor intermediari" + +#: FAuth.form:72 FOption.form:62 +msgid "OK" +msgstr "D'acord" + +#: FBrowser.form:354 +msgid "Ordered list" +msgstr "Llista ordenada" + +#: FAuth.form:50 FOption.form:48 +msgid "Password" +msgstr "Contrasenya" + +#: FBrowser.form:234 +msgid "Paste" +msgstr "Enganxa" + +#: FAuth.form:17 +msgid "Please authenticate" +msgstr "Si us plau, autentiqueu" + +#: FOption.form:38 +msgid "Port" +msgstr "-" + +#: FOption.form:21 +msgid "Proxy configuration" +msgstr "Configuració del servidor intermediari" + +#: FBrowser.form:250 +msgid "Redo" +msgstr "Refés" + +#: FBrowser.form:159 +msgid "Refresh" +msgstr "Refresca" + +#: FBrowser.form:314 +msgid "Right aligned" +msgstr "Alineat a la dreta" + +#: FOption.form:81 +msgid "SOCKS5 proxy" +msgstr "Servidor intermediari SOCKS5" + +#: FDownload.form:18 +msgid "Starting download..." +msgstr "Iniciant la descàrrega..." + +#: FBrowser.form:286 +msgid "Strikethrough" +msgstr "Ratllat" + +#: FBrowser.form:378 +msgid "Text background" +msgstr "Fons del text" + +#: FBrowser.form:372 +msgid "Text color" +msgstr "Color del text" + +#: FBrowser.form:165 +msgid "Toggle edit mode" +msgstr "Commuta el mode d'edició" + +#: FOption.form:28 +msgid "Type" +msgstr "Tipus" + +#: FBrowser.form:278 +msgid "Underline" +msgstr "Subratllat" + +#: FBrowser.form:242 +msgid "Undo" +msgstr "Desfés" + +#: FBrowser.form:342 +msgid "Unindent" +msgstr "Desfés sagnat" + +#: FBrowser.form:362 +msgid "Unordered list" +msgstr "Llista desordenada" + +#: FAuth.form:39 FOption.form:43 +msgid "User" +msgstr "Usuari" + diff --git a/app/examples/Networking/WebBrowser/.lang/cs.po b/app/examples/Networking/WebBrowser/.lang/cs.po new file mode 100644 index 00000000..d5ee66a8 --- /dev/null +++ b/app/examples/Networking/WebBrowser/.lang/cs.po @@ -0,0 +1,204 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Light browser based on WebKit component" +msgstr "Lehký prohlížeč založený na komponentě WebKit" + +#: FAuth.form:17 +msgid "Please authenticate" +msgstr "Prosím autorizujte se" + +#: FAuth.form:39 FOption.form:43 +msgid "User" +msgstr "Uživatel" + +#: FAuth.form:50 FOption.form:48 +msgid "Password" +msgstr "Heslo" + +#: FAuth.form:72 FOption.form:62 +msgid "OK" +msgstr "-" + +#: FAuth.form:78 FOption.form:68 +msgid "Cancel" +msgstr "Zrušit" + +#: FBrowser.form:74 +msgid "Gambas WebKit" +msgstr "-" + +#: FBrowser.form:90 +msgid "-2" +msgstr "-" + +#: FBrowser.form:95 +msgid "-1" +msgstr "-" + +#: FBrowser.form:100 +msgid "0" +msgstr "-" + +#: FBrowser.form:105 +msgid "+1" +msgstr "-" + +#: FBrowser.form:110 +msgid "+2" +msgstr "-" + +#: FBrowser.form:115 +msgid "+3" +msgstr "-" + +#: FBrowser.form:120 +msgid "+4" +msgstr "-" + +#: FBrowser.form:144 +msgid "Refresh" +msgstr "Obnovit" + +#: FBrowser.form:165 +msgid "Toggle edit mode" +msgstr "Přepnout režim úprav" + +#: FBrowser.form:218 +msgid "Copy" +msgstr "Kopírovat" + +#: FBrowser.form:226 +msgid "Cut" +msgstr "Výjmout" + +#: FBrowser.form:234 +msgid "Paste" +msgstr "Vložit" + +#: FBrowser.form:242 +msgid "Undo" +msgstr "Dopředu" + +#: FBrowser.form:250 +msgid "Redo" +msgstr "Zpět" + +#: FBrowser.form:262 FEditable.form:18 +msgid "Bold" +msgstr "Tučné" + +#: FBrowser.form:270 +msgid "Italic" +msgstr "Kurzíva" + +#: FBrowser.form:278 +msgid "Underline" +msgstr "Podtržené" + +#: FBrowser.form:286 +msgid "Strikethrough" +msgstr "Přeškrtnutí" + +#: FBrowser.form:298 +msgid "Left aligned" +msgstr "Zarovnat vlevo" + +#: FBrowser.form:306 +msgid "Centered" +msgstr "Vycentrovat" + +#: FBrowser.form:314 +msgid "Right aligned" +msgstr "Zarovant vpravo" + +#: FBrowser.form:322 +msgid "Justified" +msgstr "Zarovnáná do bloku" + +#: FBrowser.form:334 +msgid "Indent" +msgstr "Odrážka" + +#: FBrowser.form:342 +msgid "Unindent" +msgstr "Neodrážkovat" + +#: FBrowser.form:354 +msgid "Ordered list" +msgstr "Číslovaný seznam" + +#: FBrowser.form:362 +msgid "Unordered list" +msgstr "Nečíslovaný seznam" + +#: FBrowser.form:372 +msgid "Text color" +msgstr "Barva textu" + +#: FBrowser.form:378 +msgid "Text background" +msgstr "Pozadí textu" + +#: FBrowser.form:384 +msgid "Font family" +msgstr "Rodina fontů" + +#: FBrowser.form:394 +msgid "Font size" +msgstr "Velikost fontu" + +#: FBrowser.form:439 +msgid "Case sensitive" +msgstr "Rozlišovat velikost" + +#: FBrowser.form:446 +msgid "Highlight" +msgstr "Zvýraznění" + +#: FDownload.form:18 +msgid "Starting download..." +msgstr "Zahájení stahování..." + +#: FDownloadList.form:9 +msgid "Download manager" +msgstr "Manažer stahování" + +#: FOption.form:21 +msgid "Proxy configuration" +msgstr "Konfigurace proxy" + +#: FOption.form:28 +msgid "Type" +msgstr "Typ" + +#: FOption.form:33 +msgid "Host" +msgstr "-" + +#: FOption.form:38 +msgid "Port" +msgstr "-" + +#: FOption.form:81 +msgid "HTTP proxy" +msgstr "-" + +#: FOption.form:81 +msgid "No proxy" +msgstr "Žádné proxy" + +#: FOption.form:81 +msgid "SOCKS5 proxy" +msgstr "-" diff --git a/app/examples/Networking/WebBrowser/.lang/de.po b/app/examples/Networking/WebBrowser/.lang/de.po new file mode 100644 index 00000000..e3b6b13c --- /dev/null +++ b/app/examples/Networking/WebBrowser/.lang/de.po @@ -0,0 +1,205 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Light browser based on WebKit component" +msgstr "Ein schlanker Browser, basierend auf der WebKit-Komponente" + +#: FAuth.form:17 +msgid "Please authenticate" +msgstr "Anmeldung" + +#: FAuth.form:39 FOption.form:43 +msgid "User" +msgstr "Benutzer" + +#: FAuth.form:50 FOption.form:48 +msgid "Password" +msgstr "Passwort" + +#: FAuth.form:72 FOption.form:62 +msgid "OK" +msgstr "-" + +#: FAuth.form:78 FOption.form:68 +msgid "Cancel" +msgstr "Abbrechen" + +#: FBrowser.form:74 +msgid "Gambas WebKit" +msgstr "-" + +#: FBrowser.form:90 +msgid "-2" +msgstr "-" + +#: FBrowser.form:95 +msgid "-1" +msgstr "-" + +#: FBrowser.form:100 +msgid "0" +msgstr "-" + +#: FBrowser.form:105 +msgid "+1" +msgstr "-" + +#: FBrowser.form:110 +msgid "+2" +msgstr "-" + +#: FBrowser.form:115 +msgid "+3" +msgstr "-" + +#: FBrowser.form:120 +msgid "+4" +msgstr "-" + +#: FBrowser.form:144 +msgid "Refresh" +msgstr "Neu laden" + +#: FBrowser.form:165 +msgid "Toggle edit mode" +msgstr "Editiermodus umschalten" + +#: FBrowser.form:218 +msgid "Copy" +msgstr "Kopieren" + +#: FBrowser.form:226 +msgid "Cut" +msgstr "Ausschneiden" + +#: FBrowser.form:234 +msgid "Paste" +msgstr "Einfügen" + +#: FBrowser.form:242 +msgid "Undo" +msgstr "Rückgängig" + +#: FBrowser.form:250 +msgid "Redo" +msgstr "Wiederholen" + +#: FBrowser.form:262 FEditable.form:18 +msgid "Bold" +msgstr "Fett" + +#: FBrowser.form:270 +msgid "Italic" +msgstr "Kursiv" + +#: FBrowser.form:278 +msgid "Underline" +msgstr "Unterstrichen" + +#: FBrowser.form:286 +msgid "Strikethrough" +msgstr "Durchgestrichen" + +#: FBrowser.form:298 +msgid "Left aligned" +msgstr "Linksbündig" + +#: FBrowser.form:306 +msgid "Centered" +msgstr "Zentriert" + +#: FBrowser.form:314 +msgid "Right aligned" +msgstr "Rechtsbündig" + +#: FBrowser.form:322 +msgid "Justified" +msgstr "Blocksatz" + +#: FBrowser.form:334 +msgid "Indent" +msgstr "Einrücken" + +#: FBrowser.form:342 +msgid "Unindent" +msgstr "Ausrücken" + +#: FBrowser.form:354 +msgid "Ordered list" +msgstr "Geordnete Liste" + +#: FBrowser.form:362 +msgid "Unordered list" +msgstr "Ungeordnete Liste" + +#: FBrowser.form:372 +msgid "Text color" +msgstr "Textfarbe" + +#: FBrowser.form:378 +msgid "Text background" +msgstr "Texthintergrund" + +#: FBrowser.form:384 +msgid "Font family" +msgstr "Schriftarten" + +#: FBrowser.form:394 +msgid "Font size" +msgstr "Schriftgröße" + +#: FBrowser.form:439 +msgid "Case sensitive" +msgstr "Groß-/Kleinschreibung beachten" + +#: FBrowser.form:446 +msgid "Highlight" +msgstr "Hervorheben" + +#: FDownload.form:18 +msgid "Starting download..." +msgstr "Download wird gestartet..." + +#: FDownloadList.form:9 +msgid "Download manager" +msgstr "Download-Manager" + +#: FOption.form:21 +msgid "Proxy configuration" +msgstr "Proxy-Konfiguration" + +#: FOption.form:28 +msgid "Type" +msgstr "Typ" + +#: FOption.form:33 +msgid "Host" +msgstr "-" + +#: FOption.form:38 +msgid "Port" +msgstr "-" + +#: FOption.form:81 +msgid "HTTP proxy" +msgstr "HTTP-Proxy" + +#: FOption.form:81 +msgid "No proxy" +msgstr "Kein Proxy" + +#: FOption.form:81 +msgid "SOCKS5 proxy" +msgstr "SOCKS5-Proxy" + diff --git a/app/examples/Networking/WebBrowser/.lang/es.po b/app/examples/Networking/WebBrowser/.lang/es.po new file mode 100644 index 00000000..e077297d --- /dev/null +++ b/app/examples/Networking/WebBrowser/.lang/es.po @@ -0,0 +1,62 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Light browser based on WebKit component" +msgstr "" + +#: FAuth.class:59 +msgid "Please authenticate" +msgstr "" + +#: FAuth.class:81 +msgid "User" +msgstr "" + +#: FAuth.class:92 +msgid "Password" +msgstr "" + +#: FAuth.class:114 +msgid "OK" +msgstr "" + +#: FAuth.class:120 +msgid "Cancel" +msgstr "" + +#: FBrowser.class:473 +msgid "Gambas WebKit" +msgstr "" + +#: FBrowser.class:587 +msgid "Case sensitive" +msgstr "" + +#: FBrowser.class:594 +msgid "Highlight" +msgstr "" + +#: FDownload.class:72 +msgid "Starting download..." +msgstr "" + +#: FDownloadList.class:33 +msgid "Download manager" +msgstr "" + +#~ msgid "Browsing the web with Gambas!" +#~ msgstr "¡Buscando en la red con Gambas!" + +#~ msgid "Print selection" +#~ msgstr "Imprimir selección" diff --git a/app/examples/Networking/WebBrowser/.lang/nl.po b/app/examples/Networking/WebBrowser/.lang/nl.po new file mode 100644 index 00000000..b78bd485 --- /dev/null +++ b/app/examples/Networking/WebBrowser/.lang/nl.po @@ -0,0 +1,204 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2014-09-21 23:52+0100\n" +"Last-Translator: Willy Raets \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Light browser based on WebKit component" +msgstr "Lichte browser gebaseerd op het Webkit component" + +#: FAuth.form:17 +msgid "Please authenticate" +msgstr "Gelieve te authenticeren" + +#: FAuth.form:39 FOption.form:43 +msgid "User" +msgstr "Gebruiker" + +#: FAuth.form:50 FOption.form:48 +msgid "Password" +msgstr "Wachtwoord" + +#: FAuth.form:72 FOption.form:62 +msgid "OK" +msgstr "-" + +#: FAuth.form:78 FOption.form:68 +msgid "Cancel" +msgstr "Annuleer" + +#: FBrowser.form:74 +msgid "Gambas WebKit" +msgstr "-" + +#: FBrowser.form:90 +msgid "-2" +msgstr "-" + +#: FBrowser.form:95 +msgid "-1" +msgstr "-" + +#: FBrowser.form:100 +msgid "0" +msgstr "-" + +#: FBrowser.form:105 +msgid "+1" +msgstr "-" + +#: FBrowser.form:110 +msgid "+2" +msgstr "-" + +#: FBrowser.form:115 +msgid "+3" +msgstr "-" + +#: FBrowser.form:120 +msgid "+4" +msgstr "-" + +#: FBrowser.form:144 +msgid "Refresh" +msgstr "Ververs" + +#: FBrowser.form:165 +msgid "Toggle edit mode" +msgstr "Wissel bewerken modus" + +#: FBrowser.form:218 +msgid "Copy" +msgstr "Kopiëer" + +#: FBrowser.form:226 +msgid "Cut" +msgstr "Knippen" + +#: FBrowser.form:234 +msgid "Paste" +msgstr "Plakken" + +#: FBrowser.form:242 +msgid "Undo" +msgstr "Ongedaan maken" + +#: FBrowser.form:250 +msgid "Redo" +msgstr "Opnieuw" + +#: FBrowser.form:262 FEditable.form:18 +msgid "Bold" +msgstr "Vet" + +#: FBrowser.form:270 +msgid "Italic" +msgstr "Schuin" + +#: FBrowser.form:278 +msgid "Underline" +msgstr "Onderlijn" + +#: FBrowser.form:286 +msgid "Strikethrough" +msgstr "Doorstreept" + +#: FBrowser.form:298 +msgid "Left aligned" +msgstr "Links uitgelijnd" + +#: FBrowser.form:306 +msgid "Centered" +msgstr "Gecentreerd" + +#: FBrowser.form:314 +msgid "Right aligned" +msgstr "Rechts uitgelijnd" + +#: FBrowser.form:322 +msgid "Justified" +msgstr "Aangepast" + +#: FBrowser.form:334 +msgid "Indent" +msgstr "Inspringen" + +#: FBrowser.form:342 +msgid "Unindent" +msgstr "Ongedaan maken inspringen" + +#: FBrowser.form:354 +msgid "Ordered list" +msgstr "Geordende lijst" + +#: FBrowser.form:362 +msgid "Unordered list" +msgstr "Ongeordende lijst" + +#: FBrowser.form:372 +msgid "Text color" +msgstr "Tekst kleur" + +#: FBrowser.form:378 +msgid "Text background" +msgstr "Tekst achtergrond" + +#: FBrowser.form:384 +msgid "Font family" +msgstr "Lettertype familie" + +#: FBrowser.form:394 +msgid "Font size" +msgstr "Lettertype grootte" + +#: FBrowser.form:439 +msgid "Case sensitive" +msgstr "Case gevoelig" + +#: FBrowser.form:446 +msgid "Highlight" +msgstr "Uitlichten" + +#: FDownload.form:18 +msgid "Starting download..." +msgstr "Start download..." + +#: FDownloadList.form:9 +msgid "Download manager" +msgstr "Donload beheerder" + +#: FOption.form:21 +msgid "Proxy configuration" +msgstr "Proxy configuratie" + +#: FOption.form:28 +msgid "Type" +msgstr "Type" + +#: FOption.form:33 +msgid "Host" +msgstr "Gast" + +#: FOption.form:38 +msgid "Port" +msgstr "Poort" + +#: FOption.form:81 +msgid "No proxy" +msgstr "Geen proxy" + +#: FOption.form:81 +msgid "HTTP proxy" +msgstr "-" + +#: FOption.form:81 +msgid "SOCKS5 proxy" +msgstr "-" + diff --git a/app/examples/Networking/WebBrowser/.lang/ru.po b/app/examples/Networking/WebBrowser/.lang/ru.po new file mode 100644 index 00000000..d07bf8c6 --- /dev/null +++ b/app/examples/Networking/WebBrowser/.lang/ru.po @@ -0,0 +1,258 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Networking/WebBrowser/.project:27 +msgid "Light browser based on WebKit component" +msgstr "Лёгкий браузер на основе компонента WebKit" + +#: app/examples/Networking/WebBrowser/.project:28 +msgid "Light browser based on the QT4 or QT5 Webkit component" +msgstr "Лёгкий браузер на основе компонента QT4 или QT5 Webkit" + +#: app/examples/Networking/WebBrowser/.src/FAuth.form:5 +msgid "Please authenticate" +msgstr "Пожалуйста, аутентифицируйтесь" + +#: app/examples/Networking/WebBrowser/.src/FAuth.form:23 app/examples/Networking/WebBrowser/.src/FOption.form:23 +msgid "User" +msgstr "Пользователь" + +#: app/examples/Networking/WebBrowser/.src/FAuth.form:31 app/examples/Networking/WebBrowser/.src/FOption.form:27 +msgid "Password" +msgstr "Пароль" + +#: app/examples/Networking/WebBrowser/.src/FAuth.form:48 app/examples/Networking/WebBrowser/.src/FOption.form:38 +msgid "OK" +msgstr "ОК" + +#: app/examples/Networking/WebBrowser/.src/FAuth.form:53 app/examples/Networking/WebBrowser/.src/FOption.form:43 +msgid "Cancel" +msgstr "Отмена" + +#: app/examples/Networking/WebBrowser/.src/FBrowser.class:72 +msgid "Loading..." +msgstr "Идёт загрузка..." + +#: app/examples/Networking/WebBrowser/.src/FBrowser.class:95 +msgid "Unable to load:" +msgstr "Невозможно загрузить:" + +#: app/examples/Networking/WebBrowser/.src/FBrowser.class:96 +msgid "

    Unable to find the following URL:

    " +msgstr "

    Невозможно найти следующий URL:

    " + +#: app/examples/Networking/WebBrowser/.src/FBrowser.class:556 +msgid "Select a color" +msgstr "Выбрать цвет" + +#: app/examples/Networking/WebBrowser/.src/FBrowser.class:577 +msgid "Select an image" +msgstr "Выбрать изображение" + +#: app/examples/Networking/WebBrowser/.src/FBrowser.form:5 +msgid "Gambas WebKit" +msgstr "Веб-комплект Gambas WebKit" + +#: app/examples/Networking/WebBrowser/.src/FBrowser.form:16 +msgid "-2" +msgstr "-2" + +#: app/examples/Networking/WebBrowser/.src/FBrowser.form:20 +msgid "-1" +msgstr "-1" + +#: app/examples/Networking/WebBrowser/.src/FBrowser.form:24 +msgid "0" +msgstr "0" + +#: app/examples/Networking/WebBrowser/.src/FBrowser.form:28 app/examples/Networking/WebBrowser/.src/FBrowser.form:281 +msgid "+1" +msgstr "+1" + +#: app/examples/Networking/WebBrowser/.src/FBrowser.form:32 +msgid "+2" +msgstr "+2" + +#: app/examples/Networking/WebBrowser/.src/FBrowser.form:36 +msgid "+3" +msgstr "+3" + +#: app/examples/Networking/WebBrowser/.src/FBrowser.form:40 +msgid "+4" +msgstr "+4" + +#: app/examples/Networking/WebBrowser/.src/FBrowser.form:75 +msgid "Refresh" +msgstr "Освежить" + +#: app/examples/Networking/WebBrowser/.src/FBrowser.form:89 +msgid "Toggle edit mode" +msgstr "Переключить в режим редактирования" + +#: app/examples/Networking/WebBrowser/.src/FBrowser.form:129 +msgid "Copy" +msgstr "Копировать" + +#: app/examples/Networking/WebBrowser/.src/FBrowser.form:136 +msgid "Cut" +msgstr "Вырезать" + +#: app/examples/Networking/WebBrowser/.src/FBrowser.form:143 +msgid "Paste" +msgstr "Вставить" + +#: app/examples/Networking/WebBrowser/.src/FBrowser.form:150 +msgid "Undo" +msgstr "Откатить" + +#: app/examples/Networking/WebBrowser/.src/FBrowser.form:157 +msgid "Redo" +msgstr "Вернуть" + +#: app/examples/Networking/WebBrowser/.src/FBrowser.form:167 app/examples/Networking/WebBrowser/.src/FEditable.form:11 +msgid "Bold" +msgstr "Полужирный" + +#: app/examples/Networking/WebBrowser/.src/FBrowser.form:174 +msgid "Italic" +msgstr "Курсив" + +#: app/examples/Networking/WebBrowser/.src/FBrowser.form:181 +msgid "Underline" +msgstr "Подчёркнутый" + +#: app/examples/Networking/WebBrowser/.src/FBrowser.form:188 +msgid "Strikethrough" +msgstr "Зачёркнутый" + +#: app/examples/Networking/WebBrowser/.src/FBrowser.form:198 +msgid "Left aligned" +msgstr "По левому краю" + +#: app/examples/Networking/WebBrowser/.src/FBrowser.form:205 +msgid "Centered" +msgstr "По центру" + +#: app/examples/Networking/WebBrowser/.src/FBrowser.form:212 +msgid "Right aligned" +msgstr "По правому краю" + +#: app/examples/Networking/WebBrowser/.src/FBrowser.form:219 +msgid "Justified" +msgstr "По ширине" + +#: app/examples/Networking/WebBrowser/.src/FBrowser.form:229 +msgid "Indent" +msgstr "Отступ" + +#: app/examples/Networking/WebBrowser/.src/FBrowser.form:236 +msgid "Unindent" +msgstr "Отменить отступ" + +#: app/examples/Networking/WebBrowser/.src/FBrowser.form:246 +msgid "Ordered list" +msgstr "Упорядоченный список" + +#: app/examples/Networking/WebBrowser/.src/FBrowser.form:253 +msgid "Unordered list" +msgstr "Неупорядоченный список" + +#: app/examples/Networking/WebBrowser/.src/FBrowser.form:261 +msgid "Text color" +msgstr "Цвет текста" + +#: app/examples/Networking/WebBrowser/.src/FBrowser.form:266 +msgid "Text background" +msgstr "Фон текста" + +#: app/examples/Networking/WebBrowser/.src/FBrowser.form:271 +msgid "Font family" +msgstr "Гарнитура шрифта" + +#: app/examples/Networking/WebBrowser/.src/FBrowser.form:280 +msgid "Font size" +msgstr "Размер шрифта" + +#: app/examples/Networking/WebBrowser/.src/FBrowser.form:322 +msgid "Case sensitive" +msgstr "С учётом регистра" + +#: app/examples/Networking/WebBrowser/.src/FBrowser.form:328 +msgid "Highlight" +msgstr "Подсветка" + +#: app/examples/Networking/WebBrowser/.src/FDownload.class:24 +msgid "Cancelled" +msgstr "Отменено" + +#: app/examples/Networking/WebBrowser/.src/FDownload.class:26 +msgid "Finished" +msgstr "Готово" + +#: app/examples/Networking/WebBrowser/.src/FDownload.class:28 +msgid "Error:" +msgstr "Ошибка:" + +#: app/examples/Networking/WebBrowser/.src/FDownload.class:30 +msgid "Downloading..." +msgstr "Скачивание..." + +#: app/examples/Networking/WebBrowser/.src/FDownload.form:16 +msgid "Starting download" +msgstr "Начинается загрузка" + +#: app/examples/Networking/WebBrowser/.src/FDownloadList.form:5 +msgid "Download manager" +msgstr "Менеджер загрузок" + +#: app/examples/Networking/WebBrowser/.src/FOption.form:5 +msgid "Proxy configuration" +msgstr "Конфигурация прокси" + +#: app/examples/Networking/WebBrowser/.src/FOption.form:11 +msgid "Type" +msgstr "Тип" + +#: app/examples/Networking/WebBrowser/.src/FOption.form:15 +msgid "Host" +msgstr "Хост" + +#: app/examples/Networking/WebBrowser/.src/FOption.form:19 +msgid "Port" +msgstr "Порт" + +#: app/examples/Networking/WebBrowser/.src/FOption.form:54 +msgid "No proxy" +msgstr "Без прокси" + +#: app/examples/Networking/WebBrowser/.src/FOption.form:54 +msgid "HTTP proxy" +msgstr "HTTP-прокси" + +#: app/examples/Networking/WebBrowser/.src/FOption.form:54 +msgid "SOCKS5 proxy" +msgstr "SOCKS5-прокси" + diff --git a/app/examples/Networking/WebBrowser/.project b/app/examples/Networking/WebBrowser/.project new file mode 100644 index 00000000..e1b37c20 --- /dev/null +++ b/app/examples/Networking/WebBrowser/.project @@ -0,0 +1,26 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.7.90 +Title=Light browser based on WebKit component +Startup=FBrowser +Icon=icon.png +Version=1.0.3 +Component=gb.image +Component=gb.gui.qt +Component=gb.form +Component=gb.desktop.x11 +Component=gb.desktop +Component=gb.form.dialog +Component=gb.gui.qt.webkit +Description="Light browser based on the QT4 or QT5 Webkit component" +TabSize=2 +Translate=1 +Language=fr +Maintainer=benoit +Vendor=Example +Address=benoit@desnouettes +License=General Public Licence +Packager=1 +Systems=mandriva +Menus=mandriva:"More Applications/Development/Other" +Groups=mandriva:"Development/Other" +Tags=Network,Web,WebBrowser,Example diff --git a/app/examples/Networking/WebBrowser/.src/FAuth.class b/app/examples/Networking/WebBrowser/.src/FAuth.class new file mode 100644 index 00000000..01e7ed69 --- /dev/null +++ b/app/examples/Networking/WebBrowser/.src/FAuth.class @@ -0,0 +1,38 @@ +' Gambas class file + +Static Public User As String +Static Public Password As String + +'Private $sUrl As String +'Private $sRealm As String + +Public Sub Run(sUrl As String, sRealm As String) As Boolean + + lblRealm.Text = sRealm + Me.Title = sUrl + '$sUrl = sUrl + '$sRealm = sRealm + Return Not Me.ShowModal() + +End + +Public Sub btnOK_Click() + + User = txtUser.Text + Password = txtPassword.Text + Me.Close(True) + +End + +Public Sub btnCancel_Click() + + Me.Close + +End + + +Public Sub Form_Open() + + txtUser.SetFocus + +End diff --git a/app/examples/Networking/WebBrowser/.src/FAuth.form b/app/examples/Networking/WebBrowser/.src/FAuth.form new file mode 100644 index 00000000..6b0c115b --- /dev/null +++ b/app/examples/Networking/WebBrowser/.src/FAuth.form @@ -0,0 +1,57 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,54,26) + Text = ("Please authenticate") + Icon = Picture["icon:/small/unlock"] + Resizable = False + Arrangement = Arrange.Vertical + AutoResize = True + Spacing = True + Margin = True + { HPanel1 HPanel + MoveScaled(1,1,52,18) + AutoResize = True + Spacing = True + { lblRealm TextLabel + MoveScaled(2,1,48,4) + Expand = True + AutoResize = True + } + { Label1 Label + MoveScaled(2,6,17,3) + Text = ("User") + } + { txtUser TextBox + MoveScaled(19,6,32,4) + Expand = True + } + { Label2 Label + MoveScaled(2,11,17,3) + Text = ("Password") + } + { txtPassword TextBox + MoveScaled(19,11,32,4) + Expand = True + Password = True + } + } + { HBox1 HBox + MoveScaled(1,20,52,4) + Spacing = True + { Panel1 Panel + MoveScaled(4,0,4,4) + Expand = True + } + { btnOK Button + MoveScaled(17,0,16,4) + Text = ("OK") + Default = True + } + { btnCancel Button + MoveScaled(34,0,16,4) + Text = ("Cancel") + Cancel = True + } + } +} diff --git a/app/examples/Networking/WebBrowser/.src/FBrowser.class b/app/examples/Networking/WebBrowser/.src/FBrowser.class new file mode 100644 index 00000000..e81b90f4 --- /dev/null +++ b/app/examples/Networking/WebBrowser/.src/FBrowser.class @@ -0,0 +1,584 @@ +' Gambas class file + +'Static Private $aZoom As Float[] + +'Private $sStatus As String +'Private $iZoom As Integer +'Private $iHidden As Integer +Private $sLastLink As String + +' Static Public Sub _init() +' +' Dim iInd As Integer +' +' $aZoom = New Float[17] +' +' For iInd = 0 To $aZoom.Max +' $aZoom[iInd] = 2 ^ (- (iInd - $aZoom.Max / 2) / 4) +' Next +' +' End + +Public Sub Form_Open() + + WebSettings.IconDatabase.Path = File.Dir(File.Dir(Temp$())) + WebSettings.Fonts.FixedFont = "Monospace" + WebSettings[WebSettings.PluginsEnabled] = True + WebSettings[WebSettings.JavascriptEnabled] = True + WebSettings[WebSettings.JavaEnabled] = True + WebSettings.Fonts.DefaultFontSize = 12 + WebSettings.Fonts.DefaultFixedFontSize = 12 + + CreateView() + btnZoomNormal_Click + txtURL.SetFocus + tabBrowser_Click + + txtURL.Text = "http://gambas.sourceforge.net" + txtURL_Activate + +End + +Private Sub GetView() As WebView + + Try Return tabBrowser[tabBrowser.Index].Children[0] + +End + +Private Sub IsLastCurrentView() As Boolean + + Dim hView As WebView = GetView() + Return hView = Last + +End + +Public Sub WebView_Link(Url As String) + + If Not IsLastCurrentView() Then Return + $sLastLink = Url + lblStatus.Text = Url + +End + +Public Sub WebView_Status() + + If Not IsLastCurrentView() Then Return + lblStatus.Text = GetView().Status + +End + +Public Sub WebView_Progress() + + GetView().Status = ("Loading...") + If Not IsLastCurrentView() Then Return + + lblStatus.Text = GetView().Status + pgbLoad.Value = GetView().Progress + panLoad.Show + +End + +Public Sub WebView_Error() + + Dim hView As WebView = GetView() + Dim sUrl As String + + sUrl = $sLastLink + If Not sUrl Then sUrl = txtURL.Text + + ' If Not (sUrl Begins "www.") Then + ' txtURL.Text = "www." & sUrl + ' btnGo.Value = True + ' Return + ' Endif + + hView.Status = ("Unable to load:") & " " & sUrl + hView.HTML = ("

    Unable to find the following URL:

    ") & sUrl + If Not IsLastCurrentView() Then Return + + lblStatus.Text = GetView().Status + pgbLoad.Hide + +End + +Public Sub WebView_Load() + + 'Dim iInd As Integer + Dim hView As WebView = GetView() + Dim hIcon As Picture + + hView.Status = "" + hIcon = hView.Icon 'WebSettings.IconDatabase[hView.Url] + tabBrowser[hView.Tag].Picture = hIcon + + If Not IsLastCurrentView() Then Return + + lblStatus.Text = "" + txtURL.Text = hView.Url + pgbLoad.Hide + + UpdateIcon + + ' Debug GetView().Frame + ' For iInd = 0 To GetView().Frame.Children.Count - 1 + ' Debug "["; iInd; "] "; GetView().Frame.Children[iInd] + ' Next + +End + +Public Sub btnGo_Click() + + Dim sText As String = txtURL.Text + + If InStr(sText, "://") = 0 Then sText = "http://" & sText + + $sLastLink = sText + GetView().Url = sText + +End + +Public Sub txtURL_Activate() + + btnGo.Value = True + +End + +Public Sub btnBack_Click() + + GetView().Back + +End + +Public Sub btnForward_Click() + + GetView().Forward + +End + +Public Sub btnStop_Click() + + GetView().Stop + +End + +Public Sub btnReload_Click() + + Dim hView As WebView = GetView() + + hView.Reload + +End + +Public Sub btnZoomIn_Click() + + GetView().Zoom = Round(GetView().Zoom * 1.25, -2) + +End + +Public Sub btnZoomOut_Click() + + GetView().Zoom = Round(GetView().Zoom / 1.25, -2) + +End + +Public Sub btnZoomNormal_Click() + + GetView().Zoom = 1 + +End + +Public Sub WebView_Title() + + Dim hView As WebView = Last + tabBrowser[hView.Tag].Text = hView.Title + If Not IsLastCurrentView() Then Return + Me.Title = hView.Title & " - Gambas WebKit" + +End + +Public Sub WebView_Icon() + + Dim hView As WebView = Last + 'hView.Icon.Save("~/icon.png") + tabBrowser[hView.Tag].Picture = hView.Icon + UpdateIcon + +End + +Public Sub btnClear_Click() + + txtURL.Clear + txtURL.SetFocus + +End + +Public Sub WebView_NewWindow((Modal) As Boolean) + + CreateView() + + Last.NewView = GetView() + +End + +Private Sub CreateView() + + Dim iLast As Integer = tabBrowser.Count - 1 + Dim hView As WebView + + Object.Lock(tabBrowser) + Inc tabBrowser.Count + Object.Lock(tabBrowser) + tabBrowser[iLast + 1].Picture = tabBrowser[iLast].Picture + tabBrowser[iLast + 1].Text = tabBrowser[iLast].Text + tabBrowser[iLast].Text = "" + tabBrowser[iLast].Picture = Null + tabBrowser[iLast].Closable = True + Object.Lock(tabBrowser) + tabBrowser.Index = iLast + hView = New WebView(tabBrowser) As "WebView" + hView.Tag = tabBrowser.Index + hView.Editable = btnEdit.Value + hView.Resize(1, 1) + 'hView.Show + 'Print WebSettings.Fonts.FixedFont + Object.Unlock(tabBrowser) + Object.Unlock(tabBrowser) + Object.Unlock(tabBrowser) + tabBrowser_Click + txtURL.SetFocus + +End + + +Public Sub tabBrowser_Click() + + Dim iLast As Integer = tabBrowser.Count - 1 + Dim hView As WebView + + If tabBrowser.Index = iLast Then + CreateView() + Else + hView = GetView() + If hView.Title Then + Me.Title = hView.Title & " - Gambas WebKit" + Else + Me.Title = "Gambas WebKit" + Endif + tabBrowser.Text = hView.Title + UpdateIcon + tabBrowser.Picture = hView.Icon + txtURL.Text = hView.Url + lblStatus.Text = hView.Status + pgbLoad.Value = hView.Progress + If hView.Progress > 0 And If hView.Progress < 1 Then + panLoad.Show + Else + panLoad.Hide + Endif + Endif + +End + +Public Sub btnDownloadList_Click() + + FDownloadList.Show + +End + +Public Sub WebView_Auth() + + Dim hView As WebView = Last + + If Not FAuth.Run(hView.Auth.Url, hView.Auth.Realm) Then + + hView.Auth.User = FAuth.User + hView.Auth.Password = FAuth.Password + 'Debug hView.Auth.Url;; hView.Auth.User;; hView.Auth.Password + + Endif + +End + +Public Sub WebView_Click(Frame As WebFrame) + + Dim sName As String = Frame.Name + If sName Then sName &= ": " + Debug sName; Frame.Url + +End + +Public Sub WebView_NewFrame(Frame As WebFrame) + + Debug Frame.Name + +End + +Public Sub WebView_Download(Download As WebDownload) + + Dialog.Path = System.User.Home &/ File.Name(Download.Url) + If Not Dialog.SaveFile() Then + Download.Path = Dialog.Path + FDownloadList.AddDownload(Download) + FDownloadList.Show + Endif + +End + +Public Sub WebView_MouseDown() + + Dim hView As WebView = Last + Dim hTest As WebHitTest = hView.HitTest(Mouse.X, Mouse.Y) + Dim sMsg As String + + If hTest.Document Then sMsg &= "DOCUMENT " + If hTest.Link Then sMsg &= "LINK " + If hTest.Image Then sMsg &= "IMAGE " + If hTest.Selected Then sMsg &= "SELECTED " + If hTest.Editable Then sMsg &= "EDITABLE " + Debug sMsg; hTest.Url + +End + +Public Sub tabBrowser_Close(Index As Integer) + + Dim hView As WebView + + Try hView = tabBrowser[Index].Children[0] + If Not hView Then Return + + hView.Delete + + Object.Lock(tabBrowser) + tabBrowser[Index].Delete + Object.UnLock(tabBrowser) + If Index = tabBrowser.Index Then + If tabBrowser.Index = (tabBrowser.Count - 1) And If tabBrowser.Index > 0 Then + tabBrowser.Index = tabBrowser.Index - 1 + Else + tabBrowser_Click + Endif + Endif + +End + +Public Sub btnFind_Click() + + Dim hView As WebView = GetView() + + panFind.Visible = btnFind.Value + If btnFind.Value Then + DoFind + txtFind.SetFocus + Else + hView.FindText("") + Endif + +End + +Private Sub DoFind(Optional bBackward As Boolean) + + Dim hView As WebView = GetView() + Dim sText As String + + sText = Trim(txtFind.Text) + + If sText And If hView.FindText(sText, bBackward, chkCaseSensitive.Value, True) Then ', chkHighlight.Value) Then + panFind.Background = &HFFDFDF + Else + panFind.Background = Color.Default + If Not sText Then hView.FindText("") + Endif + +End + + +Public Sub txtFind_Change() + + DoFind + +End + +Public Sub Form_KeyPress() + + If Key.Control And If Key.Code = Key["F"] Then + btnFind.Value = True + Else If Key.Code = Key.Escape Then + btnFind.Value = False + Else If Key.Code = Key.F3 Then + DoFind(Key.Shift) + Endif + +End + +Public Sub chkCaseSensitive_Click() + + DoFind + +End + +Public Sub chkHighlight_Click() + + Dim hView As WebView + + If Not chkHighlight.Value Then + hView = GetView() + hView.FindText("",,,, True) + Else + DoFind + Endif + +End + +Public Sub btnNext_Click() + + DoFind + +End + +Public Sub btnPrevious_Click() + + DoFind(True) + +End + +Public Sub btnClearFind_Click() + + txtFind.Text = "" + +End + +Public Sub txtFind_Activate() + + DoFind + +End + +Private Sub UpdateIcon() + + Dim hView As WebView = GetView() + Dim hIcon As Picture + + hIcon = hView.Icon 'WebSettings.IconDatabase[hView.Url] + + If hIcon Then + Me.Icon = hIcon + Else + Me.Icon = Picture["icon:/16/internet"] + Endif + +End + +Public Sub btnConfig_Click() + + With WebSettings.Proxy + + FOption.Type = .Type + FOption.Host = .Host + FOption.Port = .Port + FOption.User = .User + FOption.Password = .Password + + If FOption.Run() Then Return + + .Type = FOption.Type + .Host = FOption.Host + .Port = FOption.Port + .User = FOption.User + .Password = FOption.Password + + End With + +End + +Public Sub btnEdit_Click() + + Dim hWebView As WebView + + For Each hWebView In tabBrowser.Children + hWebView.Editable = btnEdit.Value + Next + + WebSettings[WebSettings.JavascriptCanAccessClipboard] = btnEdit.Value + panEdit.Visible = btnEdit.Value + +End + +Public Sub btnAction_Click() + + Dim hWebView As WebView = GetView() + + Debug "Action " & Last.Tag & ": "; hWebView.Eval(Subst("document.execCommand('&1', false, false)", Last.Tag)) + +End + +Public Sub btnColor_Click() + + Dim hWebView As WebView = GetView() + + If Dialog.SelectColor() Then Return + hWebView.Eval(Subst("document.execCommand('forecolor', false, '&1')", "#" & Hex$(Dialog.Color, 6))) + +End + +Public Sub mnuFont_Show() + + Dim sFont As String + Dim hMenu As Menu + + If mnuFont.Children.Count > 1 Then Return + + mnuFont.Children.Clear + + For Each sFont In Fonts + + hMenu = New Menu(mnuFont) As "mnuSelectFont" + hMenu.Text = sFont + + Next + +End + + +Public Sub mnuSelectFont_Click() + + Dim hWebView As WebView = GetView() + Dim sFont As String = Last.Text + + hWebView.Eval(Subst("document.execCommand('fontname', false, '&1')", sFont)) + +End + + +Public Sub btnBackground_Click() + + Dim hWebView As WebView = GetView() + + Dialog.Title = ("Select a color") + If Dialog.SelectColor() Then Return + hWebView.Eval(Subst("document.execCommand('backcolor', false, '&1')", "#" & Hex$(Dialog.Color, 6))) + +End + +Public Sub mnuSelectSize_Click() + + Dim hWebView As WebView = GetView() + Dim sSize As String = Last.Text + + hWebView.Eval(Subst("document.execCommand('fontsize', false, '&1')", sSize)) + +End + + + +Public Sub btnInsertImage_Click() + + Dim hWebView As WebView = GetView() + + Dialog.Title = ("Select an image") + Dialog.Filter = ["*.jpg;*.jpeg;*.png;*.gif;*.xpm;*.bmp", "Image files"] + If Dialog.OpenFile() Then Return + + Print Dialog.Path + hWebView.Eval(Subst("document.execCommand('insertImage', false, '&1')", "file://" & Replace(Dialog.Path, "'", "\\'"))) + +End diff --git a/app/examples/Networking/WebBrowser/.src/FBrowser.form b/app/examples/Networking/WebBrowser/.src/FBrowser.form new file mode 100644 index 00000000..4fd51e3b --- /dev/null +++ b/app/examples/Networking/WebBrowser/.src/FBrowser.form @@ -0,0 +1,352 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,169,98) + Text = ("Gambas WebKit") + Icon = Picture["icon:/small/gambas"] + Arrangement = Arrange.Vertical + { mnuFont Menu + { mnuSelectFont Menu mnuSelectFont + Name = "mnuSelectFont" + } + } + { mnuSize Menu + { mnuSizeM2 Menu mnuSelectSize + Name = "mnuSizeM2" + Text = ("-2") + } + { mnuSizeM1 Menu mnuSelectSize + Name = "mnuSizeM1" + Text = ("-1") + } + { mnuSize0 Menu mnuSelectSize + Name = "mnuSize0" + Text = ("0") + } + { mnuSizeP1 Menu mnuSelectSize + Name = "mnuSizeP1" + Text = ("+1") + } + { mnuSizeP2 Menu mnuSelectSize + Name = "mnuSizeP2" + Text = ("+2") + } + { mnuSizeP3 Menu mnuSelectSize + Name = "mnuSizeP3" + Text = ("+3") + } + { mnuSizeP4 Menu mnuSelectSize + Name = "mnuSizeP4" + Text = ("+4") + } + } + { HBox2 HBox + MoveScaled(1,1,99,4) + { btnBack ToolButton + MoveScaled(0,0,4,4) + Picture = Picture["icon:/small/left"] + } + { btnForward ToolButton + MoveScaled(4,0,4,4) + Picture = Picture["icon:/small/right"] + } + { Separator9 Separator + MoveScaled(9,0,0,4) + } + { Panel2 HBox + MoveScaled(12,0,44,4) + Background = Color.TextBackground + Expand = True + { txtURL TextBox + MoveScaled(0,0,28,4) + Expand = True + Border = False + } + { btnClear ToolButton + MoveScaled(28,0,4,4) + Picture = Picture["icon:/small/clear"] + } + { btnStop ToolButton + MoveScaled(33,0,4,4) + Picture = Picture["icon:/small/delete"] + } + { btnReload ToolButton + MoveScaled(38,0,4,4) + ToolTip = ("Refresh") + Picture = Picture["icon:/small/refresh"] + } + } + { btnGo ToolButton + MoveScaled(57,0,4,4) + Visible = False + Picture = Picture["icon:/small/apply"] + } + { Separator1 Separator + MoveScaled(62,0,0,4) + } + { btnEdit ToolButton + MoveScaled(64,0,4,4) + ToolTip = ("Toggle edit mode") + Picture = Picture["icon:/small/edit"] + Toggle = True + } + { btnZoomIn ToolButton + MoveScaled(69,0,4,4) + Picture = Picture["icon:/small/zoom-in"] + } + { btnZoomOut ToolButton + MoveScaled(73,0,4,4) + Picture = Picture["icon:/small/zoom-out"] + } + { btnZoomNormal ToolButton + MoveScaled(77,0,4,4) + Picture = Picture["icon:/small/zoom-normal"] + } + { Separator2 Separator + MoveScaled(81,0,0,4) + } + { btnFind ToolButton + MoveScaled(83,0,4,4) + Picture = Picture["icon:/small/find"] + Toggle = True + } + { btnDownloadList ToolButton + MoveScaled(87,0,4,4) + Picture = Picture["icon:/small/archive"] + } + { btnConfig ToolButton + MoveScaled(91,0,4,4) + Picture = Picture["icon:/small/options"] + } + } + { panEdit HBox + MoveScaled(1,6,97,4) + Visible = False + { btnCopy ToolButton btnAction + Name = "btnCopy" + MoveScaled(0,0,4,4) + Tag = "Copy" + ToolTip = ("Copy") + Picture = Picture["icon:/small/copy"] + } + { btnCut ToolButton btnAction + Name = "btnCut" + MoveScaled(4,0,4,4) + Tag = "Cut" + ToolTip = ("Cut") + Picture = Picture["icon:/small/cut"] + } + { btnPaste ToolButton btnAction + Name = "btnPaste" + MoveScaled(8,0,4,4) + Tag = "Paste" + ToolTip = ("Paste") + Picture = Picture["icon:/small/paste"] + } + { btnUndo ToolButton btnAction + Name = "btnUndo" + MoveScaled(12,0,4,4) + Tag = "Undo" + ToolTip = ("Undo") + Picture = Picture["icon:/small/undo"] + } + { btnRedo ToolButton btnAction + Name = "btnRedo" + MoveScaled(16,0,4,4) + Tag = "Redo" + ToolTip = ("Redo") + Picture = Picture["icon:/small/redo"] + } + { Separator7 Separator + MoveScaled(20,0,1,4) + } + { btnBold ToolButton btnAction + Name = "btnBold" + MoveScaled(21,0,4,4) + Tag = "bold" + ToolTip = ("Bold") + Picture = Picture["icon:/small/text-bold"] + } + { btnItalic ToolButton btnAction + Name = "btnItalic" + MoveScaled(25,0,4,4) + Tag = "italic" + ToolTip = ("Italic") + Picture = Picture["icon:/small/text-italic"] + } + { btnUnderline ToolButton btnAction + Name = "btnUnderline" + MoveScaled(29,0,4,4) + Tag = "underline" + ToolTip = ("Underline") + Picture = Picture["icon:/small/text-underline"] + } + { btnStrike ToolButton btnAction + Name = "btnStrike" + MoveScaled(33,0,4,4) + Tag = "strikethrough" + ToolTip = ("Strikethrough") + Picture = Picture["icon:/small/text-strike"] + } + { Separator3 Separator + MoveScaled(37,0,1,4) + } + { btnLeft ToolButton btnAction + Name = "btnLeft" + MoveScaled(39,0,4,4) + Tag = "justifyleft" + ToolTip = ("Left aligned") + Picture = Picture["icon:/small/text-left"] + } + { btnCenter ToolButton btnAction + Name = "btnCenter" + MoveScaled(43,0,4,4) + Tag = "justifycenter" + ToolTip = ("Centered") + Picture = Picture["icon:/small/text-center"] + } + { btnRight ToolButton btnAction + Name = "btnRight" + MoveScaled(47,0,4,4) + Tag = "justifyright" + ToolTip = ("Right aligned") + Picture = Picture["icon:/small/text-right"] + } + { btnFill ToolButton btnAction + Name = "btnFill" + MoveScaled(51,0,4,4) + Tag = "justifyfull" + ToolTip = ("Justified") + Picture = Picture["icon:/small/text-fill"] + } + { Separator5 Separator + MoveScaled(55,0,1,4) + } + { btnIndent ToolButton btnAction + Name = "btnIndent" + MoveScaled(56,0,4,4) + Tag = "indent" + ToolTip = ("Indent") + Picture = Picture["icon:/small/indent"] + } + { btnUnindent ToolButton btnAction + Name = "btnUnindent" + MoveScaled(60,0,4,4) + Tag = "outdent" + ToolTip = ("Unindent") + Picture = Picture["icon:/small/unindent"] + } + { Separator6 Separator + MoveScaled(64,0,1,4) + } + { btnOrdered ToolButton btnAction + Name = "btnOrdered" + MoveScaled(65,0,4,4) + Tag = "insertOrderedList" + ToolTip = ("Ordered list") + Picture = Picture["list-ordered.png"] + } + { btnUnordered ToolButton btnAction + Name = "btnUnordered" + MoveScaled(69,0,4,4) + Tag = "insertUnorderedList" + ToolTip = ("Unordered list") + Picture = Picture["list-unordered.png"] + } + { Separator4 Separator + MoveScaled(73,0,1,4) + } + { btnColor ToolButton + MoveScaled(74,0,4,4) + ToolTip = ("Text color") + Picture = Picture["icon:/small/color"] + } + { btnBackground ToolButton + MoveScaled(78,0,4,4) + ToolTip = ("Text background") + Picture = Picture["icon:/small/fill"] + } + { btnFont MenuButton + MoveScaled(82,0,6,4) + ToolTip = ("Font family") + Picture = Picture["icon:/small/font"] + Border = False + Menu = "mnuFont" + MenuOnly = True + } + { btnFont2 MenuButton + MoveScaled(88,0,6,4) + Font = Font["Bold,-1"] + ToolTip = ("Font size") + Text = ("+1") + Border = False + Menu = "mnuSize" + MenuOnly = True + } + } + { Separator8 Separator + MoveScaled(8,12,17,0) + } + { tabBrowser TabPanel + MoveScaled(1,14,76,40) + Expand = True + Arrangement = Arrange.Fill + Border = False + Index = 0 + Text = ("") + Picture = Picture["icon:/small/add"] + Index = 0 + } + { panFind HBox + MoveScaled(1,54,101,4) + Visible = False + { btnClearFind ToolButton + MoveScaled(4,0,4,4) + Picture = Picture["icon:/small/clear"] + } + { txtFind TextBox + MoveScaled(8,0,32,4) + Expand = True + } + { btnNext ToolButton + MoveScaled(41,0,4,4) + Picture = Picture["icon:/small/down"] + } + { btnPrevious ToolButton + MoveScaled(45,0,4,4) + Picture = Picture["icon:/small/up"] + } + { chkCaseSensitive CheckBox + MoveScaled(54,0,17,4) + AutoResize = True + Text = ("Case sensitive") + } + { chkHighlight CheckBox + MoveScaled(70,0,20,4) + Visible = False + AutoResize = True + Text = ("Highlight") + } + { Panel1 Panel + MoveScaled(91,1,1,2) + } + } + { HBox1 HBox + MoveScaled(1,61,66,2) + { lblStatus Label + MoveScaled(5,0,21,2) + Font = Font["-2"] + Expand = True + } + { panLoad Panel + MoveScaled(46,0,19,2) + Visible = False + Arrangement = Arrange.Fill + Padding = 4 + { pgbLoad ProgressBar + MoveScaled(1,0,17,2) + Label = False + } + } + } +} diff --git a/app/examples/Networking/WebBrowser/.src/FDownload.class b/app/examples/Networking/WebBrowser/.src/FDownload.class new file mode 100644 index 00000000..ce500c5e --- /dev/null +++ b/app/examples/Networking/WebBrowser/.src/FDownload.class @@ -0,0 +1,50 @@ +' Gambas class file + +Private $hDownload As WebDownload + +Public Sub Init(hDownload As WebDownload) + + $hDownload = hDownload + Redraw + +End + + +Public Sub Redraw() + + Dim sTitle As String + Dim sStatus As String + + If Not $hDownload Then Return + + With $hDownload + + sTitle = .Url + If .Status = .Cancelled Then + sStatus = ("Cancelled") + Else If .Status = .Finished Then + sStatus = ("Finished") + Else If .Status = .Error Then + sStatus = ("Error:") & " " & .ErrorText + Else + sStatus = ("Downloading...") + Endif + lblTitle.Text = sTitle + lblStatus.Text = sStatus + + pgbDownload.Value = .Progress + + End With + +End + +Public Sub btnAbort_Click() + + If $hDownload.Status = WebDownload.Downloading Then + $hDownload.Cancel + Else + $hDownload.Delete + Me.Delete + Endif + +End diff --git a/app/examples/Networking/WebBrowser/.src/FDownload.form b/app/examples/Networking/WebBrowser/.src/FDownload.form new file mode 100644 index 00000000..b14e5303 --- /dev/null +++ b/app/examples/Networking/WebBrowser/.src/FDownload.form @@ -0,0 +1,34 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,69,13) + Arrangement = Arrange.Fill + Margin = True + { Panel1 Panel + MoveScaled(1,1,67,11) + Background = Color.Background + Arrangement = Arrange.Vertical + Margin = True + Border = Border.Plain + { lblTitle Label + MoveScaled(1,1,65,3) + Expand = True + Text = ("Starting download") & "..." + } + { lblStatus Label + MoveScaled(1,4,11,2) + Font = Font["Italic,-2"] + } + { HBox2 HBox + MoveScaled(1,6,65,4) + { pgbDownload ProgressBar + MoveScaled(0,0,56,4) + Expand = True + } + { btnAbort ToolButton + MoveScaled(61,0,4,4) + Picture = Picture["icon:/small/close"] + } + } + } +} diff --git a/app/examples/Networking/WebBrowser/.src/FDownloadList.class b/app/examples/Networking/WebBrowser/.src/FDownloadList.class new file mode 100644 index 00000000..eed15dfe --- /dev/null +++ b/app/examples/Networking/WebBrowser/.src/FDownloadList.class @@ -0,0 +1,20 @@ +' Gambas class file + +Public Sub AddDownload(hDownload As WebDownload) + + Dim hForm As FDownload + + hForm = New FDownload(svwDownload) + hForm.Init(hDownload) + +End + +Public Sub timRefresh_Timer() + + Dim hForm As FDownload + + For Each hForm In svwDownload.Children + hForm.Redraw + Next + +End diff --git a/app/examples/Networking/WebBrowser/.src/FDownloadList.form b/app/examples/Networking/WebBrowser/.src/FDownloadList.form new file mode 100644 index 00000000..baaaf84c --- /dev/null +++ b/app/examples/Networking/WebBrowser/.src/FDownloadList.form @@ -0,0 +1,20 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,68,39) + Text = ("Download manager") + Icon = Picture["icon:/small/archive"] + Persistent = True + Arrangement = Arrange.Fill + { svwDownload ScrollView + MoveScaled(1,1,66,36) + Background = Color.SelectedForeground + Arrangement = Arrange.Vertical + Border = False + ScrollBar = Scroll.Vertical + { timRefresh #Timer + #MoveScaled(52,15) + Enabled = True + } + } +} diff --git a/app/examples/Networking/WebBrowser/.src/FEditable.class b/app/examples/Networking/WebBrowser/.src/FEditable.class new file mode 100644 index 00000000..98308606 --- /dev/null +++ b/app/examples/Networking/WebBrowser/.src/FEditable.class @@ -0,0 +1,15 @@ +' Gambas class file + + +Public Sub Form_Open() + + WebView1.Url = "http://gambasdoc.org/" + +End + +Public Sub Button1_Click() + + Print WebView1.Frame.EvalJavaScript("1+2") + Print WebView1.Frame.EvalJavaScript("document.execCommand('bold', false, false)") + +End diff --git a/app/examples/Networking/WebBrowser/.src/FEditable.form b/app/examples/Networking/WebBrowser/.src/FEditable.form new file mode 100644 index 00000000..7d7ec8f7 --- /dev/null +++ b/app/examples/Networking/WebBrowser/.src/FEditable.form @@ -0,0 +1,19 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,68,64) + Arrangement = Arrange.Vertical + Margin = True + { HBox1 HBox + MoveScaled(2,1,63,4) + { Button1 Button + MoveScaled(0,0,28,4) + Text = ("Bold") + } + } + { WebView1 WebView + MoveScaled(4,7,54,40) + Expand = True + Editable = True + } +} diff --git a/app/examples/Networking/WebBrowser/.src/FOption.class b/app/examples/Networking/WebBrowser/.src/FOption.class new file mode 100644 index 00000000..d6a6cc34 --- /dev/null +++ b/app/examples/Networking/WebBrowser/.src/FOption.class @@ -0,0 +1,67 @@ +' Gambas class file + +Static Public Type As Integer +Static Public Host As String +Static Public Port As Integer +Static Public User As String +Static Public Password As String + +Public Sub Run() As Boolean + + Return Not Me.ShowModal() + +End + +Public Sub btnOK_Click() + + Select Case cmbType.Index + Case 0 + Type = WebSettings.NoProxy + Case 1 + Type = WebSettings.HttpProxy + Case 2 + Type = WebSettings.Socks5Proxy + End Select + + Host = Trim(txtHost.Text) + Port = txtPort.Value + User = Trim(txtUser.Text) + Password = txtPassword.Text + + Me.Close(True) + +End + +Public Sub btnCancel_Click() + + Me.Close + +End + + +Public Sub cmbType_Click() + + txtHost.Enabled = cmbType.Index > 0 + txtPassword.Enabled = cmbType.Index > 0 + txtPort.Enabled = cmbType.Index > 0 + txtUser.Enabled = cmbType.Index > 0 + +End + +Public Sub Form_Open() + + Select Type + Case WebSettings.NoProxy + cmbType.Index = 0 + Case WebSettings.HttpProxy + cmbType.Index = 1 + Case WebSettings.Socks5Proxy + cmbType.Index = 2 + End Select + + txtHost.Text = Host + txtPort.Value = Port + txtUser.Text = User + txtPassword.Text = Password + +End diff --git a/app/examples/Networking/WebBrowser/.src/FOption.form b/app/examples/Networking/WebBrowser/.src/FOption.form new file mode 100644 index 00000000..1faee652 --- /dev/null +++ b/app/examples/Networking/WebBrowser/.src/FOption.form @@ -0,0 +1,69 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,61,35) + Text = ("Proxy configuration") + Resizable = False + Spacing = True + Margin = True + { Label1 Label + MoveScaled(1,1,15,4) + Text = ("Type") + } + { Label2 Label + MoveScaled(1,6,15,4) + Text = ("Host") + } + { Label3 Label + MoveScaled(1,11,15,4) + Text = ("Port") + } + { Label4 Label + MoveScaled(1,16,15,4) + Text = ("User") + } + { Label5 Label + MoveScaled(1,21,15,4) + Text = ("Password") + } + { HBox1 HBox + MoveScaled(1,30,59,4) + Spacing = True + { Panel1 Panel + MoveScaled(4,0,4,4) + Expand = True + } + { btnOK Button + MoveScaled(11,0,16,4) + Text = ("OK") + Default = True + } + { btnCancel Button + MoveScaled(28,0,16,4) + Text = ("Cancel") + Cancel = True + } + } + { txtHost TextBox + MoveScaled(17,6,43,4) + Enabled = False + } + { cmbType ComboBox + MoveScaled(17,1,43,4) + ReadOnly = True + List = [("No proxy"), ("HTTP proxy"), ("SOCKS5 proxy")] + } + { txtPort SpinBox + MoveScaled(17,11,12,4) + Enabled = False + } + { txtUser TextBox + MoveScaled(17,16,43,4) + Enabled = False + } + { txtPassword TextBox + MoveScaled(17,21,43,4) + Enabled = False + Password = True + } +} diff --git a/app/examples/Networking/WebBrowser/icon.png b/app/examples/Networking/WebBrowser/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..268485b35ff1ec22b2fde11239acf698bd053acb GIT binary patch literal 2932 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 SXLkZ!#^CAd=d#Wzp$Pz4)fQ0z literal 0 HcmV?d00001 diff --git a/app/examples/Networking/WebBrowser/list-unordered.png b/app/examples/Networking/WebBrowser/list-unordered.png new file mode 100644 index 0000000000000000000000000000000000000000..5e6ec74c95807328dc700cfdf4dcdb5f177af8fb GIT binary patch literal 237 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 literal 0 HcmV?d00001 diff --git a/app/examples/OpenGL/3DWebCam/.lang/ru.po b/app/examples/OpenGL/3DWebCam/.lang/ru.po new file mode 100644 index 00000000..b15ed83d --- /dev/null +++ b/app/examples/OpenGL/3DWebCam/.lang/ru.po @@ -0,0 +1,46 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/OpenGL/3DWebCam/.project:20 +msgid "3DWebCam" +msgstr "3D-веб-камера" + +#: app/examples/OpenGL/3DWebCam/.src/Mmain.module:30 +msgid "Unable to open video device" +msgstr "Невозможно открыть видеоустройство" + +#: app/examples/OpenGL/3DWebCam/.src/Mmain.module:231 +msgid "frames in" +msgstr "кадров за" + +#: app/examples/OpenGL/3DWebCam/.src/Mmain.module:231 +msgid "seconds =" +msgstr "секунд =" + +#: app/examples/OpenGL/3DWebCam/.src/Mmain.module:231 +msgid "FPS" +msgstr "кадр/с" + diff --git a/app/examples/OpenGL/3DWebCam/.project b/app/examples/OpenGL/3DWebCam/.project new file mode 100644 index 00000000..4f8290ea --- /dev/null +++ b/app/examples/OpenGL/3DWebCam/.project @@ -0,0 +1,19 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.0.0 +Title=3DWebCam +Startup=Mmain +Icon=webcam.png +Version=3.6.2 +VersionFile=1 +Component=gb.image +Component=gb.image.io +Component=gb.sdl +Component=gb.opengl +Component=gb.opengl.glu +Component=gb.v4l +TabSize=2 +Maintainer=Benoît Minisini +Vendor=ASAP +Address=bminisini@asap-info.com +License=General Public Licence +Translate=1 diff --git a/app/examples/OpenGL/3DWebCam/.src/Mmain.module b/app/examples/OpenGL/3DWebCam/.src/Mmain.module new file mode 100644 index 00000000..909efb64 --- /dev/null +++ b/app/examples/OpenGL/3DWebCam/.src/Mmain.module @@ -0,0 +1,256 @@ +' Gambas module file + +Private hWebCam As VideoDevice +Private Const ScrWidth As Integer = 640 +Private Const ScrHeight As Integer = 480 + +' Needed for frame count +Private Frames As Integer +Private CTime As Float + +' Rotations +Private xrot As Float +Private yrot As Float +Private zrot As Float + +' texture +Private textures As New Integer[] +Private Screen As New Window(True) As "Screen" + +Private logo As Image +Private tmpLogo As Image +Private hTimer As New Timer As "Timer1" +Private count As Integer +Private UpdateLogo As Boolean + +Public Sub Main() + + Try hWebCam = New VideoDevice("/dev/video0") + If Error Then + Print ("Unable to open video device") + Return + + End If + hWebCam.Hue = 10 + hWebCam.Color = 10 + hWebcam.Resize(320, 240) + + logo = hWebCam.Image + logo.Resize(256, 256) + + screen.Width = ScrWidth + screen.Height = ScrHeight + Screen.show() + Screen.Resizable = True + InitGL() + textures = Gl.GenTextures(1) + LoadTextures() + Screen_resize() + CTime = Timer() + hTimer.Delay = 200 + hTimer.Enabled = True + +End + +Public Sub LoadTextures() + + Gl.BindTexture(gl.TEXTURE_2D, textures[0]) + Gl.TexImage2D(logo) + Gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR) + Gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR) + +End + +Public Sub InitGL() + + ' Enable smooth shading + Gl.ShadeModel(gl.SMOOTH) + ' Set the background black + Gl.ClearColor(0.0, 0.0, 0.0, 0.5) + ' Depth buffer setup + Gl.ClearDepth(1.0) + ' Enables Depth Testing + Gl.Enable(gl.DEPTH_TEST) + ' Enable texturing + Gl.Enable(gl.TEXTURE_2D) + ' The Type OF Depth Test TO DO + Gl.DepthFunc(gl.LESS) + ' Really Nice Perspective Calculations + Gl.Hint(gl.PERSPECTIVE_CORRECTION_HINT, gl.NICEST) + +End + +Public Sub Screen_close() + + ' Delete textures if needed + If (textures.count > 0) Then Gl.DeleteTextures(textures) + +End + +Public Sub Screen_resize() + + ' Width/Height Ratio + Dim ratio As Float + Dim Height As Integer + + Height = Screen.Height + ' Protect against a divide by zero + If Height = 0 Then Height = 1 + + ratio = Screen.Width / Height + + ' Setup our viewport + Gl.Viewport(0, 0, Screen.Width, Screen.Height) + ' change to the projection matrix AND set our viewing volume. + Gl.MatrixMode(gl.PROJECTION) + Gl.LoadIdentity() + + ' Set our perspective + Glu.Perspective(45.0, ratio, 0.1, 100.0) + + ' Make sure we're changing the model view and not the projection + Gl.MatrixMode(gl.MODELVIEW) + GL.LoadIdentity() + +End + +Public Sub Screen_Draw() + + Dim calc As Float + Inc count + If UpdateLogo Then + 'count = 0 + 'logo = tmpLogo + logo.Resize(256, 256) + LoadTextures() + UpdateLogo = False + Endif + + Gl.Clear(gl.COLOR_BUFFER_BIT Or gl.DEPTH_BUFFER_BIT) + + Gl.LoadIdentity() + Gl.Translatef(0.0, 0.0, -5.0) + + Gl.Rotatef(xrot, 1.0, 0.0, 0.0) ' Rotate On The X Axis + Gl.Rotatef(yrot, 0.0, 1.0, 0.0) ' Rotate On The Y Axis + Gl.Rotatef(zrot, 0.0, 0.0, 1.0) ' Rotate On The Z Axis + + ' Select our texture + Gl.BindTexture(gl.TEXTURE_2D, textures[0]) + + Gl.Begin(gl.QUADS) + ' front face + ' Bottom Left OF The Texture AND Quad + Gl.TexCoord2f(0.0, 1.0) + Gl.Vertex3f(-1.0, -1.0, 1.0) + ' Bottom Right OF The Texture AND Quad + Gl.TexCoord2f(1.0, 1.0) + Gl.Vertex3f(1.0, -1.0, 1.0) + ' Top Right OF The Texture AND Quad + Gl.TexCoord2f(1.0, 0.0) + Gl.Vertex3f(1.0, 1.0, 1.0) + ' Top Left OF The Texture AND Quad + Gl.TexCoord2f(0.0, 0.0) + Gl.Vertex3f(-1.0, 1.0, 1.0) + + ' Back face + ' Bottom Right OF The Texture AND Quad + Gl.TexCoord2f(0.0, 0.0) + Gl.Vertex3f(-1.0, -1.0, -1.0) + ' Top Right OF The Texture AND Quad + Gl.TexCoord2f(0.0, 1.0) + Gl.Vertex3f(-1.0, 1.0, -1.0) + ' Top Left OF The Texture AND Quad + Gl.TexCoord2f(1.0, 1.0) + Gl.Vertex3f(1.0, 1.0, -1.0) + ' Bottom Left OF The Texture AND Quad + Gl.TexCoord2f(1.0, 0.0) + Gl.Vertex3f(1.0, -1.0, -1.0) + + ' Top face + ' Top Left OF The Texture AND Quad + Gl.TexCoord2f(1.0, 1.0) + Gl.Vertex3f(-1.0, 1.0, -1.0) + ' Bottom Left OF The Texture AND Quad + Gl.TexCoord2f(1.0, 0.0) + Gl.Vertex3f(-1.0, 1.0, 1.0) + ' Bottom Right OF The Texture AND Quad + Gl.TexCoord2f(0.0, 0.0) + Gl.Vertex3f(1.0, 1.0, 1.0) + ' Top Right OF The Texture AND Quad + Gl.TexCoord2f(0.0, 1.0) + Gl.Vertex3f(1.0, 1.0, -1.0) + + ' Bottom ace + ' Top Right OF The Texture AND Quad + Gl.TexCoord2f(0.0, 1.0) + Gl.Vertex3f(-1.0, -1.0, -1.0) + ' Top Left OF The Texture AND Quad + Gl.TexCoord2f(1.0, 1.0) + Gl.Vertex3f(1.0, -1.0, -1.0) + ' Bottom Left OF The Texture AND Quad + Gl.TexCoord2f(1.0, 0.0) + Gl.Vertex3f(1.0, -1.0, 1.0) + ' Bottom Right OF The Texture AND Quad + Gl.TexCoord2f(0.0, 0.0) + Gl.Vertex3f(-1.0, -1.0, 1.0) + + ' Right face + ' Bottom Right OF The Texture AND Quad + Gl.TexCoord2f(0.0, 0.0) + Gl.Vertex3f(1.0, -1.0, -1.0) + ' Top Right OF The Texture AND Quad + Gl.TexCoord2f(0.0, 1.0) + Gl.Vertex3f(1.0, 1.0, -1.0) + ' Top Left OF The Texture AND Quad + Gl.TexCoord2f(1.0, 1.0) + Gl.Vertex3f(1.0, 1.0, 1.0) + ' Bottom Left OF The Texture AND Quad + Gl.TexCoord2f(1.0, 0.0) + Gl.Vertex3f(1.0, -1.0, 1.0) + + ' Left face + ' Bottom Left OF The Texture AND Quad + Gl.TexCoord2f(1.0, 0.0) + Gl.Vertex3f(-1.0, -1.0, -1.0) + ' Bottom Right OF The Texture AND Quad + Gl.TexCoord2f(0.0, 0.0) + Gl.Vertex3f(-1.0, -1.0, 1.0) + ' Top Right OF The Texture AND Quad + Gl.TexCoord2f(0.0, 1.0) + Gl.Vertex3f(-1.0, 1.0, 1.0) + ' Top Left OF The Texture AND Quad + Gl.TexCoord2f(1.0, 1.0) + Gl.Vertex3f(-1.0, 1.0, -1.0) + + Gl.End() + + Inc (Frames) + If (Timer() > CTime + 5) Then + calc = Timer() - CTime + Print CStr(Frames) & " " & ("frames in") & " " & Format$(calc, "#.0") & " " & ("seconds =") & " " & Format$((Frames / calc), "######.000") & " " & ("FPS") + Frames = 0 + CTime = Timer() + Endif + + xrot += 0.3 ' X Axis Rotation + yrot += 0.2 ' Y Axis Rotation + zrot += 0.4 ' Z Axis Rotation + Sleep 0.05 + +End + +Public Sub Screen_keyPress() + + If key.Code = key.F1 Then Screen.Fullscreen = Not Screen.Fullscreen + If key.Code = key.Esc Then Screen.Close() + +End + +Public Sub Timer1_Timer() + + logo = hWebCam.Image + + UpdateLogo = True + +End diff --git a/app/examples/OpenGL/3DWebCam/webcam.png b/app/examples/OpenGL/3DWebCam/webcam.png new file mode 100644 index 0000000000000000000000000000000000000000..e90b27a8e5be2e8b39ac125fbbf4b67e20ff510b GIT binary patch literal 6442 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 literal 0 HcmV?d00001 diff --git a/app/examples/OpenGL/GambasGears/.directory b/app/examples/OpenGL/GambasGears/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/app/examples/OpenGL/GambasGears/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/app/examples/OpenGL/GambasGears/.icon.png b/app/examples/OpenGL/GambasGears/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f4ee5b433917b29da800bcd02cbc5488c809c0c0 GIT binary patch literal 3450 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 literal 0 HcmV?d00001 diff --git a/app/examples/OpenGL/GambasGears/.lang/ru.po b/app/examples/OpenGL/GambasGears/.lang/ru.po new file mode 100644 index 00000000..8cd90749 --- /dev/null +++ b/app/examples/OpenGL/GambasGears/.lang/ru.po @@ -0,0 +1,38 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/OpenGL/GambasGears/.project:20 +msgid "GambasGears" +msgstr "Шестерни Gambas" + +#: app/examples/OpenGL/GambasGears/.project:21 +msgid "glxgears ported to Gambas!" +msgstr "glxgears портированы на Gambas!" + +#: app/examples/OpenGL/GambasGears/.src/Module1.module:116 +msgid "FPS" +msgstr "кадр/с" + diff --git a/app/examples/OpenGL/GambasGears/.project b/app/examples/OpenGL/GambasGears/.project new file mode 100644 index 00000000..eca46a6f --- /dev/null +++ b/app/examples/OpenGL/GambasGears/.project @@ -0,0 +1,19 @@ +# Gambas Project File 3.0 +Title=GambasGears +Startup=Module1 +Icon=gears.png +Version=3.11.90 +VersionFile=1 +Component=gb.image +Component=gb.sdl2 +Component=gb.opengl +Description="glxgears ported to Gambas!" +Authors="Fabien Bodard\nLaurent Carlier" +TabSize=2 +Language=fr +Maintainer=benoit +Vendor=Princeton +Address=benoit@localhost +License=General Public Licence +Packager=1 +Translate=1 diff --git a/app/examples/OpenGL/GambasGears/.src/Module1.module b/app/examples/OpenGL/GambasGears/.src/Module1.module new file mode 100644 index 00000000..abb49a88 --- /dev/null +++ b/app/examples/OpenGL/GambasGears/.src/Module1.module @@ -0,0 +1,256 @@ +' Gambas module file + +' GambasGears +' Released under GPL v2 or later +' aka glxgears for gambas :) +' based on gears.c by Brian Paul / Mark J. Kilgard +' +' Code : Bodard Fabien & Carlier Laurent +' + +Private screen As New Window(True) As "Screen" +Private gearlists As Integer + +Private angle As Float +Private Frames As Integer +Private fTime As Float + +Public Sub Main() + + With screen + '.Resizable = True + .Resize(480, 480) + .Show() + End With + + fTime = Timer + +End + +Public Sub Screen_Open() + + Dim red As Float[] + Dim green As Float[] + Dim blue As Float[] + Dim pos As Float[] + + red = [0.8, 0.1, 0.0, 0.2] + green = [0.0, 0.8, 0.2, 0.8] + blue = [0.1, 0.1, 0.8, 1.0] + + ' we enable lights, depth test, cull face + Gl.Lightfv(Gl.LIGHT0, Gl.POSITION, [5.0, 5.0, 10.0, 0.0]) + Gl.Enable(Gl.CULL_FACE) + Gl.Enable(Gl.LIGHTING) + Gl.Enable(Gl.LIGHT0) + Gl.Enable(Gl.DEPTH_TEST) + Gl.ClearDepth(1.0) + + ' We need 3 displaylists for the 3 gears + gearlists = Gl.GenLists(3) + + Gl.NewList(gearlists, Gl.COMPILE) + Gl.Materialfv(Gl.FRONT, Gl.AMBIENT_AND_DIFFUSE, red) + Gear(1.0, 4.0, 1.0, 20, 0.7) + Gl.EndList() + Gl.NewList(gearlists + 1, Gl.COMPILE) + Gl.Materialfv(Gl.FRONT, Gl.AMBIENT_AND_DIFFUSE, green) + Gear(0.5, 2.0, 2.0, 10, 0.7) + Gl.EndList() + Gl.NewList(gearlists + 2, Gl.COMPILE) + Gl.Materialfv(Gl.FRONT, Gl.AMBIENT_AND_DIFFUSE, blue) + Gear(1.3, 2.0, 0.5, 10, 0.7) + Gl.EndList() + Gl.Enable(Gl.NORMALIZE) + +End + +Public Sub Screen_Resize() + + Gl.Viewport(0, 0, Screen.Width, Screen.Height) + Gl.MatrixMode(Gl.PROJECTION) + Gl.LoadIdentity() + Gl.Frustum(-1.0, 1.0, -(Screen.Height / Screen.Width), (Screen.Height / Screen.Width), 5.0, 60.0) + Gl.MatrixMode(Gl.MODELVIEW) + Gl.LoadIdentity() + Gl.Translatef(0.0, 0.0, -40.0) + +End + +Public Sub Screen_Draw() + + Dim calc As Float + + angle += 0.05 + + Gl.Clear(Gl.COLOR_BUFFER_BIT Or Gl.DEPTH_BUFFER_BIT) + + Gl.PushMatrix() + + Gl.Rotatef(20, 1.0, 0.0, 0.0) + Gl.Rotatef(30, 0.0, 1.0, 0.0) + Gl.Rotatef(0, 0.0, 0.0, 1.0) + + Gl.PushMatrix() + Gl.Translatef(-3.0, -2.0, 0.0) + Gl.Rotatef(angle, 0.0, 0.0, 1.0) + Gl.CallList(gearlists) + Gl.PopMatrix() + + Gl.PushMatrix() + Gl.Translatef(3.1, -2.0, 0.0) + Gl.Rotatef((-2.0 * angle) - 9.0, 0.0, 0.0, 1.0) + Gl.CallList(gearlists + 1) + Gl.PopMatrix() + + Gl.PushMatrix() + Gl.Translatef(-3.1, 4.2, 0.0) + Gl.Rotatef((-2.0 * angle) - 25.0, 0.0, 0.0, 1.0) + Gl.CallList(gearlists + 2) + Gl.PopMatrix() + + Gl.PopMatrix() + + If (Timer > (fTime + 1)) Then + Inc fTime + Print Screen.Framerate; " " & ("FPS") + Endif + +End + +Public Sub Screen_Close() + + Gl.DeleteLists(gearLists, 3) + +End + +Public Sub Screen_KeyPress() + + If (key.code = key.F1) Then Screen.Fullscreen = Not Screen.Fullscreen + If (key.Code = key.Esc) Then Screen.Close() + +End + +Public Sub Screen_MouseMove() + + If Mouse.Button = 0 Then Return + + Gl.Rotatef(Mouse.StartY - Mouse.Y, 0, 0, 1) + Gl.Rotatef(Mouse.StartX - Mouse.X, 1, 0, 0) + +End + +Public Sub Gear(inner_radius As Float, outer_radius As Float, width As Float, teeth As Integer, tooth_depth As Float) + + Dim i As Integer + Dim r0 As Float + Dim r1 As Float + Dim r2 As Float + Dim angle As Float + Dim da As Float + Dim u As Float + Dim v As Float + Dim fLen As Float + + r0 = inner_radius + r1 = outer_radius - tooth_depth / 2.0 + r2 = outer_radius + tooth_depth / 2.0 + + da = 2.0 * Pi / teeth / 4.0 + + Gl.ShadeModel(Gl.FLAT) + Gl.Normal3f(0.0, 0.0, 1.0) + + ' Draw front face + Gl.Begin(Gl.QUAD_STRIP) + For i = 0 To teeth + angle = i * 2.0 * Pi / teeth + Gl.Vertexf(r0 * Cos(angle), r0 * Sin(angle), width * 0.5) + Gl.Vertexf(r1 * Cos(angle), r1 * Sin(angle), width * 0.5) + If i < teeth Then + Gl.Vertexf(r0 * Cos(angle), r0 * Sin(angle), width * 0.5) + Gl.Vertexf(r1 * Cos(angle + 3 * da), r1 * Sin(angle + 3 * da), width * 0.5) + Endif + Next + Gl.End() + + ' Draw front sides of teeth + Gl.Begin(Gl.QUADS) + da = 2.0 * Pi / teeth / 4.0 + For i = 0 To teeth - 1 + angle = i * 2.0 * Pi / teeth + Gl.Vertexf(r1 * Cos(angle), r1 * Sin(angle), width * 0.5) + Gl.Vertexf(r2 * Cos(angle + da), r2 * Sin(angle + da), width * 0.5) + Gl.Vertexf(r2 * Cos(angle + 2 * da), r2 * Sin(angle + 2 * da), width * 0.5) + Gl.Vertexf(r1 * Cos(angle + 3 * da), r1 * Sin(angle + 3 * da), width * 0.5) + Next + Gl.End() + + Gl.Normal3f(0.0, 0.0, -1.0) + + ' Draw back face + Gl.Begin(Gl.QUAD_STRIP) + For i = 0 To teeth + angle = i * 2.0 * Pi / teeth + Gl.Vertexf(r1 * Cos(angle), r1 * Sin(angle), -width * 0.5) + Gl.Vertexf(r0 * Cos(angle), r0 * Sin(angle), -width * 0.5) + If i < teeth Then + Gl.Vertexf(r1 * Cos(angle + 3 * da), r1 * Sin(angle + 3 * da), -width * 0.5) + Gl.Vertexf(r0 * Cos(angle), r0 * Sin(angle), -width * 0.5) + Endif + Next + Gl.End() + + ' Draw back sides of teeth + Gl.Begin(Gl.QUADS) + da = 2.0 * Pi / teeth / 4.0 + For i = 0 To teeth - 1 + angle = i * 2.0 * Pi / teeth + Gl.Vertexf(r1 * Cos(angle + 3 * da), r1 * Sin(angle + 3 * da), -width * 0.5) + Gl.Vertexf(r2 * Cos(angle + 2 * da), r2 * Sin(angle + 2 * da), -width * 0.5) + Gl.Vertexf(r2 * Cos(angle + da), r2 * Sin(angle + da), -width * 0.5) + Gl.Vertexf(r1 * Cos(angle), r1 * Sin(angle), -width * 0.5) + Next + Gl.End() + + ' Draw outward faces of teeth + Gl.Begin(Gl.QUAD_STRIP) + For i = 0 To teeth - 1 + angle = i * 2.0 * Pi / teeth + Gl.Vertexf(r1 * Cos(angle), r1 * Sin(angle), width * 0.5) + Gl.Vertexf(r1 * Cos(angle), r1 * Sin(angle), -width * 0.5) + u = r2 * Cos(angle + da) - r1 * Cos(angle) + v = r2 * Sin(angle + da) - r1 * Sin(angle) + fLen = Sqr(u * u + v * v) + u /= fLen + v /= fLen + Gl.Normal3f(v, -u, 0.0) + Gl.Vertexf(r2 * Cos(angle + da), r2 * Sin(angle + da), width * 0.5) + Gl.Vertexf(r2 * Cos(angle + da), r2 * Sin(angle + da), -width * 0.5) + Gl.Normal3f(Cos(angle), Sin(angle), 0.0) + Gl.Vertexf(r2 * Cos(angle + 2 * da), r2 * Sin(angle + 2 * da), width * 0.5) + Gl.Vertexf(r2 * Cos(angle + 2 * da), r2 * Sin(angle + 2 * da), -width * 0.5) + u = r1 * Cos(angle + 3 * da) - r2 * Cos(angle + 2 * da) + v = r1 * Sin(angle + 3 * da) - r2 * Sin(angle + 2 * da) + Gl.Normal3f(v, -u, 0.0) + Gl.Vertexf(r1 * Cos(angle + 3 * da), r1 * Sin(angle + 3 * da), width * 0.5) + Gl.Vertexf(r1 * Cos(angle + 3 * da), r1 * Sin(angle + 3 * da), -width * 0.5) + Gl.Normal3f(Cos(angle), Sin(angle), 0.0) + Next + Gl.Vertexf(r1 * Cos(0), r1 * Sin(0), width * 0.5) + Gl.Vertexf(r1 * Cos(0), r1 * Sin(0), -width * 0.5) + Gl.End() + + Gl.ShadeModel(Gl.SMOOTH) + + ' Draw inside radius cylinder + Gl.Begin(Gl.QUAD_STRIP) + For i = 0 To teeth + angle = i * 2.0 * Pi / teeth + Gl.Normal3f(-Cos(angle), -Sin(angle), 0.0) + Gl.Vertexf(r0 * Cos(angle), r0 * Sin(angle), -width * 0.5) + Gl.Vertexf(r0 * Cos(angle), r0 * Sin(angle), width * 0.5) + Next + Gl.End() + +End diff --git a/app/examples/OpenGL/GambasGears/gears.png b/app/examples/OpenGL/GambasGears/gears.png new file mode 100644 index 0000000000000000000000000000000000000000..6eed1fa86ad3f75a71131ccd7b9349be424d80c4 GIT binary patch literal 3488 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 literal 0 HcmV?d00001 diff --git a/app/examples/OpenGL/Md2Model/.directory b/app/examples/OpenGL/Md2Model/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/app/examples/OpenGL/Md2Model/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/app/examples/OpenGL/Md2Model/.icon.png b/app/examples/OpenGL/Md2Model/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..22e52cbf7cf15fa7739846c602b7c482a5da47d8 GIT binary patch literal 3521 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, YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/OpenGL/Md2Model/.project:23 +msgid "Md2Model example" +msgstr "Пример Md2Model" + +#: app/examples/OpenGL/Md2Model/.project:24 +msgid "This example shows how to use the 'gb.opengl.sge' component and OpenGL to display a lot of animated monster." +msgstr "В этом примере показано, как использовать компонент 'gb.opengl.sge' и OpenGL для отображения большого количества анимированных монстров." + +#: app/examples/OpenGL/Md2Model/.src/FMain.class:85 +msgid "objects" +msgstr "объектов" + +#: app/examples/OpenGL/Md2Model/.src/FMain.class:148 +msgid "FPS" +msgstr "кадр/с" + +#: app/examples/OpenGL/Md2Model/.src/FMain.class:153 +msgid "vertices in" +msgstr "вершин за" + +#: app/examples/OpenGL/Md2Model/.src/FMain.class:153 +msgid "seconds" +msgstr "секунд" + diff --git a/app/examples/OpenGL/Md2Model/.project b/app/examples/OpenGL/Md2Model/.project new file mode 100644 index 00000000..278d09a2 --- /dev/null +++ b/app/examples/OpenGL/Md2Model/.project @@ -0,0 +1,22 @@ +# Gambas Project File 3.0 +Title=Md2Model example +Startup=FMain +Profiling=1 +Icon=icon.png +Version=1.0.0 +Component=gb.image +Component=gb.gui +Component=gb.db +Component=gb.db.mysql +Component=gb.gui.opengl +Component=gb.opengl +Component=gb.opengl.glu +Component=gb.opengl.sge +Description="This example shows how to use the 'gb.opengl.sge' component and OpenGL to display a lot of animated monster." +Authors="Benoît Minisini" +Environment="GB_GUI=gb.qt5" +TabSize=2 +Language=fr +Vendor=Example +Packager=1 +Translate=1 diff --git a/app/examples/OpenGL/Md2Model/.src/FMain.class b/app/examples/OpenGL/Md2Model/.src/FMain.class new file mode 100644 index 00000000..e3e7bbda --- /dev/null +++ b/app/examples/OpenGL/Md2Model/.src/FMain.class @@ -0,0 +1,243 @@ +' Gambas class file + +Private $aModel As Md2Model[] +Private $aObject As Md2Object[] +Private $iFrames As Integer +Private $fTime As Single +Private $fFramerate As Float +Private $iEndWidth As Integer +Private $iEndZ As Integer + +Private $iDisk As Integer +Private $hQuadric As GluQuadric +Private $nDraw As Integer + +' Private $fRotX As Float +' Private $fRotY As Float +' Private $fStartX As Float +' Private $fStartY As Float + +Public Sub glaScreen_Open() + + Init() + Gl.ClearDepth(100.0) ' Enables clearing of the depth buffer + Glu.ClearColor(&H3398C3) ' This will clear the background color to blue + Gl.DepthFunc(Gl.LESS) ' The type of depth test to do + Gl.Enable(Gl.DEPTH_TEST) ' Enables depth testing + Gl.ShadeModel(Gl.SMOOTH) ' Enables smooth color shading + + $fTime = Timer + timAnim.Enabled = True + +End + +Public Sub glaScreen_Resize() + + Gl.Viewport(0, 0, glaScreen.Width, glaScreen.Height) + Gl.MatrixMode(Gl.PROJECTION) + Gl.LoadIdentity() 'Reset The Projection Matrix + Glu.Perspective(45.0, glaScreen.Width / glaScreen.Height, 0.1, 3000.0) 'Calculate The Aspect Ratio Of The Window + Glu.LookAt(0, 100, 120, 0, 0, -300, 0, 100, 0) + Gl.MatrixMode(Gl.MODELVIEW) + +End + +Public Sub Init() + + Dim X, D, Z As Float + Dim sModel As String + Dim hModel As Md2Model + Dim I As Integer + Dim aModel As String[] = ["bauul", "goblin", "knight", "ogro", "rat", "rhino"] + Dim hObject As Md2Object + + 'Randomize 1972 + $aModel = New Md2Model[] + $aObject = New Md2Object[] + + For Each sModel In aModel + $aModel.Add(Md2Model.Load(sModel & ".md2")) + $aModel[$aModel.Max].Texture = LoadTexture(sModel & ".jpg") + Next + + D = 100 + + X = -D + Z = -100 + + Do + + hModel = $aModel[Int(Rnd(0, aModel.Count))] + hObject = New Md2Object(hModel) + $aObject.Add(hObject) + $aObject[$aObject.Max].Move(X, -10, Z) + X += 50 + If X > D Then + D += 100 + X = -D + Z -= 100 + Inc I + If I = 10 Then Break + Endif + + Loop + + Print $aObject.Count; " " & ("objects") + + $iEndWidth = D + $iEndZ = Z + + sldFrame.MinValue = 0 + sldFrame.MaxValue = $aModel[0].Count + + $iDisk = Gl.GenLists(1) + $hQuadric = Glu.NewQuadric() + + Gl.NewList($iDisk, Gl.COMPILE) + Gl.Rotatef(90, 1, 0, 0) + Glu.Disk($hQuadric, 0, 20, 30, 1) + Gl.EndList + +End + + +Public Sub glaScreen_Draw() + + Dim fTime As Float = Timer + Dim I, N As Integer + + Gl.Clear(Gl.COLOR_BUFFER_BIT Or Gl.DEPTH_BUFFER_BIT) ' Clear The Screen And The Depth Buffer + + Gl.PushMatrix + + Gl.Disable(Gl.TEXTURE_2D) + + Glu.Color(&HD96800&) + Gl.Begin(Gl.QUADS) + Gl.Vertex3f(-100, -34.2, -100) + Gl.Vertex3f(100, -34.2, -100) + Gl.Vertex3f($iEndWidth, -34.2, $iEndZ) + Gl.Vertex3f(-$iEndWidth, -34.2, $iEndZ) + Gl.End + + Glu.Color(Color.Lighter(&HD96800&)) + For I = 0 To $aObject.Max + + Gl.PushMatrix() + Gl.Translatef($aObject[I].X, -34, $aObject[I].Z) + Gl.CallList($iDisk) + Gl.PopMatrix() + + Next + + Gl.Enable(Gl.TEXTURE_2D) + Gl.Color3f(1, 1, 1) + For I = 0 To $aObject.Max + N += $aObject[I].Draw() + Next + + ' You can use this code to get FPS printed in terminal + + Inc $iFrames + If Timer >= ($fTime + 1) Then + $fFrameRate = $iFrames / (Timer - $fTime) + $iFrames = 0 + Inc $fTime + Endif + + lblInfo.Text = Format($aObject[0].Frame, "0.00") & " / " & $aObject[0].Model.Count & " ( " & CInt($fFramerate) & " " & ("FPS") & " )" + + Gl.PopMatrix + + Inc $nDraw + Print "\r"; Format($nDraw, "#####0"); ": "; N; " " & ("vertices in") & " "; Format(Timer - fTime, "0.000000"); " " & ("seconds"); + +End + +Public Sub Form_KeyPress() + + If Key.code = Key.F1 Then + Me.FullScreen = Not Me.FullScreen + sldFrame.Visible = Not Me.FullScreen + Else If Key.Code = Key.Esc Then + Me.Close + Else If Key.code = Key.Space Then + timAnim.Enabled = Not timAnim.Enabled + Else If LCase(Key.Text) = "w" Then + Gl.PolygonMode(Gl.FRONT_AND_BACK, Gl.LINE) + Else If LCase(Key.Text) = "f" Then + Gl.PolygonMode(Gl.FRONT_AND_BACK, Gl.FILL) + Endif + +End + +Public Sub timAnim_Timer() + + ' At every timer call we increase interpolation. It makes Frame number increase every 10 calls. + ' You can control frame flow any way you want. The smaller incrementation, the smoother movement. + + Dim I As Integer + + For I = 0 To $aObject.Max + With $aObject[I] + .Frame += 0.1 + If .Frame >= .Count Then .Frame = 0 + End With + Next + + Object.Lock(sldFrame) + sldFrame.Value = CInt($aObject[0].Frame) + Object.Unlock(sldFrame) + + glaScreen.Refresh + +End + +' Just the subroutine to load textures for our models +Private Sub LoadTexture(sPath As String) As Integer + + Dim iTex As Integer + Dim hImage As Image + + iTex = Gl.GenTextures(1)[0] + hImage = Image.Load(sPath) + Gl.BindTexture(Gl.TEXTURE_2D, iTex) + Gl.TexImage2D(hImage) + Glu.Build2DMipmaps(hImage) + Gl.Texparameteri(Gl.TEXTURE_2D, Gl.TEXTURE_MIN_FILTER, Gl.LINEAR_MIPMAP_LINEAR) + Gl.Texparameteri(Gl.TEXTURE_2D, Gl.TEXTURE_MAG_FILTER, Gl.LINEAR) + Return iTex + +End + + +Public Sub sldFrame_Change() + + $aObject[0].Frame = sldFrame.Value + +End + +' Public Sub glaScreen_MouseMove() +' +' $fRotX = $fStartX + 180 * (Mouse.X - Mouse.StartX) / glaScreen.Width +' $fRotY = $fStartY + 180 * (Mouse.Y - Mouse.StartY) / glaScreen.Height +' glaScreen.Refresh +' +' End +' +' Public Sub glaScreen_MouseDown() +' +' $fStartX = $fRotX +' $fStartY = $fRotY +' +' End + +' Public Sub Form_Activate() +' +' While $nDraw < 10 +' glaScreen.Refresh +' Wait 1 +' Wend +' Me.Close +' +' End diff --git a/app/examples/OpenGL/Md2Model/.src/FMain.form b/app/examples/OpenGL/Md2Model/.src/FMain.form new file mode 100644 index 00000000..6ca8c351 --- /dev/null +++ b/app/examples/OpenGL/Md2Model/.src/FMain.form @@ -0,0 +1,31 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,160,72) + Arrangement = Arrange.Vertical + { Panel1 HBox + MoveScaled(1,2,116,4) + Spacing = True + { sldFrame Slider + MoveScaled(0,0,24,4) + Expand = True + } + { Separator1 Separator + MoveScaled(54,0,0,4) + } + { lblInfo Label + MoveScaled(64,0,18,4) + Padding = 4 + AutoResize = True + } + } + { timAnim #Timer + #MoveScaled(52,13) + Delay = 20 + } + { glaScreen GLArea + MoveScaled(4,14,16,16) + Background = &H7FBFFF& + Expand = True + } +} diff --git a/app/examples/OpenGL/Md2Model/Weapon.md2 b/app/examples/OpenGL/Md2Model/Weapon.md2 new file mode 100644 index 0000000000000000000000000000000000000000..560facea70735ad5e0232ba4fb9b71401fe6efd0 GIT binary patch literal 71708 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 z zShT`3p=^d3j`Y|W#^8`=EN;#x{NCCbUXBjf0DVs_UF)D7{ZmdwI7{JP{N!%i( zNlmLOE?6VcH#|Hf7@6oG>j+c2Vw-D?vjv#EWD)>hh60*6K32;%eI|5=|Ai)8GQ;Iv z@mz2Vu)Y10)uASdbO?w?t_66B0F@v?95uyy;U zhP@e6?50l=#ru(Owq5JYO)`FW`|0KUyTc+0x#NEP_3J8QK=(#Mz$2Su7G!bqlVY|tWm8L6NdLeVy% z#ph_$b^{TZ$Faa3wut97QlE!hBu4$Mnu+EcwnCU+6O3GF2OAr`!Ec}4NlC5pW2`7O z(qBCPPL}{f8F>paXN}v}*tDu{)ddUF=A!bjlJY(#v>}l+z6H4iNWoQaw(@w%n5{qN z4MeT{g5)imqps@zx~{C9+7c|;CNJYaR`gbVkcpQ%l`lxE$X}+##Eb(YLU|F{G8tDh zB%O2}qsHkQ!ENNTK_OXrQ?QMb|~ z-rRIh+86OpPYoqekEflnz=q2f=e3EM@0Xs@4_@+uOgmrj{GKNURblaTuU_V`4RZ&jc>@)V;950s?w4MtXd-%rwi*^fJ98AEq_ zH;YN{O_qR6dZC+5bd#5Xel@p=<9#GQH%ZIp!jhYS`9d`WJ=HARQixYb#Q54FVuSp= zV!3^;#|jsimtxV(P5KCcq+d!kPpb;rA=tQRAR*Iv)ifpswQs~tA1!ya3CAo)@8rQg-L!9Us%F25JUjb9Eo z(;Zh72Od;l91ezqtd6%a;xD(0MY1aLjj(O0l95d`yl!m?{5nl6MzWof5S`90h;#pz zP=3kY`HZl9m)M|GXnqpkt?(ckqH{#DuTBz+r(y|UA)P82rXAfCVvpGJCxq<D!>sFZZdNTz0XA<=2?ilM zNfpOA3A%4~<|sV-1$Sq^(IR)q%yEtHv3vR7QWs!Hid+7@QZaGw&urtnu0G8;O5TV} z()_B|ukcm9RO1uZ9gi;pB(*)I8M+r1!ysE65!TR#3Snlr4`2g)L7{@^t}5oxe0kP-rao-b2L<_*`0v2 z?pug5eE+;l67wR;}SZA(z}HxcrdJ5b$D+IihnJyPWkagTAM29oDCh2PKamFNzSVON{ZI=`s~{ z(gv`5NdBNU4$ypvo6qQBqKVy9hfrGGGEEMq#0M9i9@LRwe5C{~=jfM)^7YT+@NliB z^pgv@tMm#J5thjv2`LH75zI{}JND-&6Y8BpcHmxN6!lb8ag}&8i0Hivx?e5^^?%*c zw7*wO(jT_{Grm*4_ka9zPpsu;uX>!%7BB{ltMMp~a`Ll#Z9b$jb8$ZfbEyzHV*i7- zTlQ<5rB_StyZc?*_=8}*4{@Vccjn&F=8>xf$0_&G+zz_fgFEhF z#__-6@B1FoF1al!`lolWuf;5-4&sjE_Ji-;dZ~U)`{~lE@@vLt@O{W>@{>!uz>4AX zb32C9vU{?lH#b-&+!t6@BR;i#VEB-JnnET#*CqGt%5OFu$8KeBMI5KkLEkk^XuY0X zl-!@(KUY$h3+DACNIz%-B{72@5_$JIl~9xPe3mmFyw)>mLUDCNGzD?l-Wf45K{I$~ zwLz4cb7;1kZ*~!z2fhuk4ymE7G$pzrZfB>2$KVDcAooFMfrA@*XHG2HfN}Ez`W4VT z;7kXoUL6hokWmFSey5Sv`o~G{7-Ih9>G?1JyiZf+kR+NF@(`E_aESEGuyU@9n&*zz zc`EuQEyQ6rZrgoHYT1lTA6)(A%z}=DW9BteVud@u{jsx%bwHuA`Kp2q{3F^1%x~Ay zd!3ysow%AOjPGtebBt`o&3g|^Eohb9h_9XyS~ZGKUk+}(IH3^e{!+99+-0cs**ZHG zaLB!+zN|PWx2oD9xgc3)Gs#lxILR;(@r3Vr64}O8{)u!xH(&a}756P8 z5})gMMr`TpIvzM&wSE<7YK%t*x<iALRtsn$87{uvbsy;s#WJj+cXYS=jM$i(M%PFF>J#v z87MUh&HH{v;4q8u$-eK4@4O_T#XS-rs{sD@d#CXH$3I({3Y?-YB@jD- z;YbI3V4fi~yI@i|h)B3~Rn+5W_09AA>eICHt;GV-$e=s>aDhccEaZ1ZTjXL1G}_iMLDQH;}M1D zKmM645a8xw;%keg%?PnAi{w$k;Y!;?QQmm^M*(W?{ZXA#$JcXs-{Eh>lNq;6Jl*h~ zR#rWcu7G|e?1?a{t9?<^*Fxq>NB-=`T8q9 z@vmsduGR((-h39{rHXRtqp!c#PK)=c00@XXXSxE*Aj5RcLU%7U3gu`NLU8tY7D81j z%iZW-^37?-;{?!R>qC+ z^ovIB4ROYLeT+IP3&IkHn(2mQu%zJ=teY|9yR@jE2{EE z%v1YcDZ?g5muGZ_RS+pVXP(*&!^T~Y@bkBGeYW@?UfSYn(q0By-IvczrH%{DQO_zq zlzXDsWIQ2MW<5ezj~J#Ki}>X?clpEZslcx`t)669_lClN~iJ|q+JV}yD15<(ij#f)a)#%GASQRh>P9~r{Bo6<^Eovcac0y0~`(K(tIo{ zyW>#}#v*vZJ5A-FFqN#<@86}Qm-hFx{KJCa|FTbDgXN)j4?~{E60jeX2z9z0AsCD} zHknZwk@}7g$TrUBNo$nW*W&@>?0Ysg9}>sXx5=w= zg+F4%N67m$ZeLQl14qhphsNI}cINJ%e}Y<7@X4)YTPj#c?&;i&-GvV5?mB)Ed8K)x zyf63>_Dr2jJ#O;u%oDGDp$*$r;|=*G??uj?pmC|!2_Lri&%fzB#Q$zx4JNNFNj+Ox z|6`+dHQ|sr6ZG!hu+F=UG2?^RPee;IlEM7kFqv5cEhB8Ar2$c$MJe9koSAK@p_%PK zpkVa9M&W#~46k(C82@>7@9Pg33?0xG_5sD5-0*xsz$HqMuFA~I5^0PI$D(sv68NEF z4&p=s{qy%^cz}${Im{Wn7BCzURI`x-Q{qd(&EI6rR6WXjuA05Sc>ZIbz@FrU?jTEn z#|F;Gjb7vZ*W-fa@d;o-bfC<hz!@{UP%Rsqa&LZ2U8Qi53tlx#ACt18>V19stdVcz4ZDC!00Juq0GBv`p0dYo ziZpdWVIz|2;{?=1-Nk)5ZK$I~xdChWP-bgR+rlgLAVSOmyz@E-eCyqy={$=geO8(I zi|0S~3B0!-(3!YG@P2Q;4a1qbRHg_;`F_CRBHQ#qRVU|vn8 zX;1rx`aG!d(mefCWPrn)Sbl12zP?KC6HOV1@eO>Nqp|BqV+kZwU`S85sfU_2&aD$C z#bBrg*7c6zi$jBpR40VyTOUggM9KIK@Hg@}{XOn8!#eKx%y!Y5@Jafl!8_!P&Z*l5 zd?(-){>`U{=iaZ+;C?;rQ~my~Q)YE{_>axWG5qmhC+yWs)y>0`Dua!8Z33lnamIO( zFv&-Tm-M5ZtjvnVn7~NLIa3RJb4!azgg|Uj14o%xrYgZSE_Kn|;nIYdmODn>J+Sy9 zBshl#pq#j2MO$8R_p>%liNnTq#tCqM?tJQ(YyfQ?7Ai4w6rGrI<*zHlptXxQ`0x@E z3=S~TIxk#H`j!PB{lD-1ANvG$xXV4;7?a&!GL8o!?EDImeCZ*tEDLYEP(Mve;hTuq zC_fQf4kXh-19uo-w0OIAntC{QmYZ6?*@GLQt8LBSBqpl9{828Qd5YqDMjjUlIBjE( z?jHo6Pp#qRik8K;qPnD_@+P=;iW=1BdZy`i0`WdSeJ5mp8{X6YDLVoGZn$yrh4b2l z!@zODW9K&gW7Rg7L*enD7piOc-P;INs#|7>0&M1(t>?VTq^q zbxK?ON2xgO?#QL6&vK9T$w^)=D=|kSc+DPIuv_nVpy9hWM1#m#f73VVMAf4Y(+ZiC zeTJo%C$s@CAFxMuJ&ajtdy_nc-IIHcd>|j5GR?J>GnzhAy_vLwEW7!|dPVHJ=BV}; z{%QCJr5)Us&gR)&mpP#W>-z==O5Luz+z+5z!Ylqim#1mJw@s#z+d93;%bno<>@@X3 z6Xm{QbvyL+K$Yw1W}U&&;oyJw8I17N@sdQexL$CvKW`9{S;IVvwZgD2+|+iUN-(Wy z@*DwHAN_n)0_ncChu!9Z^o0DE*FjbpFaPdb^ySE0ztFy2GaEe zX!eLGhn7Z|LG9kUG$?HXOQ|W`1;{66A802zUgOXp;#uDw%Ya>eESw}oRaxbNAN-a_E8qc0TvgngNQEk>dVC{0>rk@D-I&{GBy>Kg) zTtB5le!L{L+qILpU$_)-QaHSsK=b3 z>r*y}$xs-dZEwZ76vD)rf~Xvw^iV8xxZL7eOQyVYaI%kkL_Ldl@F-y8+{994lni&Y zMifV+z{UbN3hkXa9=q^TjYhHqg<+xRx?GAq(utrrtsJPko(b9%ebKB=t0dhIyh-v2 zg#Lf=y7+%6Wjp!J#BL+r=y-^oiX$!;=fjUU-qH$nTD~r9O(=q~}=lB#l2h zXMsx=E6!SxDc?G|py#t6$i0|(&gJuS8L*HXEcpA;ZTaHocP~`cm*anCngqWHxUIDA zCu3Y5S5EspSsrA1WyUrUIBtDdEk|%$5i20^aQmkpbUf zGREX9idPo(OVbE*T&3_Zy+YKSUS7*L<_h>6j;)@+?7a3FVn8H^2!Gm_1E)5N6{qi{ zqzqA-yo`5&gnCc$(J6(;U)5I|8qJV(PG&i)b3Cz%1 z!OR&2_a*ppIA;+7SZNlATT4PrKwo5IKuhow3_3U<JKlp2P5XAn-&@g;KxhKH*=r5lCi|>UZkRptraX~l0j0g?Opo$eq39oTuw%lXj z^6Ugc0)G078>dOv`}e6#mmWiur<)+~&N_Bv z{Udfl$4hp|iohRLEzl*tG$ zbYr#LWasj{e=#iRD?-Sad`aKVgFOyP-soXVa<;W_)0-Jp&f zBJ}Q19Nc_PP~51CQ~T5;sfWt5j>5BPA26L>;8G^Falsp! z*pbDL*bA#EJO|!$NfZ|al%*0Q`S?==p`r+3>(FL^3xSTwrAkrC zPRO=nx7_4{c#g1z2Ym?@G9ZKEx87Uis-qqX6ncbO=6FrrCS<*5EwxLlESK{A zdM>ZZ8g^vXFneLq4m)?}5xYcDaZnk)CW?L-1x?FuW-8Ju0{L zJ=;*}Tn7Oh+#l`<+KMTk!R#q)phJyl$w5G8I=& z6N*^v7d~?s+$AH0zHN$vhbwuCJJs=O->QYZkHX}QM=0O>PFTFc5aoM6B*^O${;N+j zDudSl^5mr=E=W=PEUQD5CLFjVS}Fcnt;|u_LDAAFY`2+}o+>yj0VU~=la-N)FuKeoz?42g?LWwu+CuV#d;m5@U)3KLL*Wb>^h0ui0Le7?i+g|Pb(4}2Sfx55zc+>no` z?8f(O{f%U~K@2&$G=mJtSq6YoBuP+#dl)>PvmV8lm6B9;$Nu8^_cj9nqzZ`?p=GQ? z8vzI+9G^>t)5uQ9qv&&kiPv)g5*6?bDq>7lmezf1QK%j>&RgmoVVM>91DRV{S zavFPfHmlv^V^)J^GD7gvnh5w}D_e1=DPHYUxsdl^h=TD@ppgC!Hc??9L&)Vto`P;R zN~q+K5sg8MI<mA75TDcX&-94@-7UIbX>L zXMRT?$7p|p#71SXY*|QfRW>x*7erC?X@@|?gp?uKf+_mMcI66$Q1pqR=o8fxyp2V` z^OHVC=k!zbIZT!t&Lbz6)sullNCjRyTi%r@{ig?_w{%TB(6 zZZ1-!WJ>>n!QHDg=KUNO5Q}1TI?L)pN)uN6l5OU^kUI*zg0kBw6qjS{Im z?^FYo4HJOr)G(*=C=mj$E8;{Jbg&mzJ!OUTt+R_45d+Kd4Uv3&Suk!?Ljey$Bw6_wrg@;E)l>2eOYY_mpGgkmL8c#?Xh!{&~ z4&F#Y!n2CrN8=~nvUSb>mg{XGCl_>+fk-wS_|ZxdG<`M*YKr1-9JrN`RH**`-v9SL zu0%qhH2RWhK@Y`05t(T~lomd^-i6h2k6y^LnKL}#x4X14Sz1wd$*?S~WQMC0nP^ZL zy{wnl`+=b%Y9o=Yk&-X%9dH@6QuIlllLlAT@)Z~FB&Yo@lJtHFQ#PIs5YnGVCtsRQ z6LNW(sjONXB~Y?vNMk?(sm&)KG{h~@3p&r0g_IYqcx4ByxcEAhxk?9EAt8$teQr%s zYpmU&_9V3dl@p7A>DDl>@?r%9K2*Vu>=pcwDvWKE|!K$mxTIPrU#&WO%si+}YsFoBciM?uAFbwb^0*Y_|!Zani+kw?)pH9l7QWz8P(^(n(DXF14YE_ME zm|!iANYXBiU)9VXKV&co+mB(pm&M?GvdL%MK!yvFCzO@OH%k@A8&cDLXDND}_-lak zzT!rs*bK$_BvH?k^y{i^D8AdJnUV?3bJ;GpM*2I^gw)02a2#P)tcgT3#fp3g4?L=_u#Z~Z+oiq^h zlUZwI{4NR4;_!dp`{lp4y#b(AhR!0&=yK%(zqL(+6_{(@e>dp`(eI^gnsSO%;h2aEn}v{WhCzDrxy zSdRaUHi12Nu%zVaG8zP2IsF=1(qjjGJADYrVsWg&Svc*o#P<`uj;y_^7S6*t zSZ>}dQKIUcm1nlQUll@uNLrqqtr*Aew`PZC&#g# zoUqnX?xlB3I)Z;}xPT4RR9dYqLnJtKa^%l?^YZ`dqZwsa>vD(NR&%r=PC;EEc|I85 zk}cy%*R~ETF| z{>DBnj&f1GGIdU%Ice!iJ?)xCj_lH{7~i@^l`H8jjJ9r#Ar3CjF1lEL2F!H!Ig7O0b1Ka;dc$$Bg-FK5 z99xdhmHad>r_TU$!#U@UYRlM6>Os9?cQCxbAN)d~8+D*-CkbxOnc3{vD*#0%2ksCBBxxvW;nkutZ7 zyQD0S?+EDot$9J7dhvUHA(|=`?uAQyD2%z3vi9&oM)Uo|S1@eqqJ5moyqU#~#LOYu zWp5MsYA_~s%t6-eNK#*FQ}D9p+Bwi+pV2CPNy7KyvbwGGW3?N4#~2MlrkUOR z$yjxjFFtCpcY%V=-;#ukPLnJyQrd+6>o8^HMuMoti((nQS0y*4lS%{i(JfE|+iF11 zY7ovZGAwAwumB2ZKCObdKfW(pQdX}J8yn&r7>D#j#?tGUL|&*eER96+-Vt-SIKWqY z{+@Q!mAj27oAL+ogv3_=v&#!r^xvi`n8@GGpWh{8fp*La#~YTR2-6q8Y@)pdG1aY$LNUDYv<;Y5@h`2rw~xU0PXt`uq)e zyLoLgv4*4Ev(PXv`H^&8M3~~XRVdrkmxLt7X3!y5RP6o`@!}zW~^yLp|58)2Go5q?yUc$orEQ=G& zEAcnO-woB1Tes&!j%P}6eM+EkO=!-7KwFM6PLHX1wpceF4h+vuPkmb8$#gci#%!hxO!4aCnW%p=>Nq>k86Mf&$r$Jsy zz4W>=I{he~*JH^|-l*DB)a)=kPX11UkkblQ)+;nhqLc{I8ep$nEXT1hgw%4<`E*JP z-l{X=m&BV1@P#W0WhJtRpsN^!p`CqzR(<{%r_`D=MfsF`X}E*qRx5!EnqAC|PQ1@W z$X{lMbS|(-7T*c3$i5fN$Mg`x6F*cY%=);aTzq+&v-v?k=jw2+>|SA@Og<*0C^aGu zDOKuae=!{!jm@Y=Gd6Ws0T0G9MeaV1tIruuSd46hZ-)iLyK6p0_pQ9=IDPU%;i&d^ z^1~7GAC;eN!K5qF;KDsh{`nx6R85W{ZFSuJH_tzdct1rMf|H(ePArvBNK{k)*>I-< zEXI|`vJVh)uN8_7cxfPFbjT*_b$Y8XEp}dj;8YLwRni??}sI*bi@lgZDZuU;$p;0o3GOvWn7~* z&tjzyY2~2zxi2YntKE=al5m@!FJ48Ekj5s0u4fQ|KJ58Jt1s`Ydsz)tQR5@P^l>Za zm4Q5ND3QXmpr2A7Ewk~B&#_CEH^3_L`lEQcpP~d39+U{OZ#J2Vy%;}NKXIRPX}C^y zpAalnh(#2oMq`nR^{)0zrIFFmd6j6!{?;mBc_33@cp{FNKa?;X*#z4PK?Kz`e8RMD zyyMuM`=zi_M^5e?C;!pTZ2?}pD+S^hhQR=2Hi=C*jx?pw{%@Xt7V$Pp@&t2zx169e zB4Oc;MQ6jDim`rfe3o?-oQ_Q(Zz@(1H-*c8Oz#-;otd)=Or-w09XC z@O*B&hl@=5qZFQRyD0jc!(Vz?7M;F_;q!Rxq@Y#mDQdGD8mCg3And$=k@X6Wl`Jiw z@I+suE01Jl3@PTIcWICmyj4Nr8E-DY7py9r6~QKo&ZqEfzXxd5hs{g`Wz$w!M<(^x~VCEiQEHV&rLju#{^H3SpNTb{#nFp%Bg1Q=|FSs0BJO; zshlC)g@`q=7ctMF5^*O=Bm|5Z3m84%mh^sOo~vd&Ax^kK@XWN>wrBC%Wrf7Q$>zMB z!CzVVghBrMUR7kR@tHwm-N=vbwMSW(BmXlZY&2>H_R zYxMf|%FM;CjBFv%Y)mfMQX;n!^@SvTjYT20m!+~iS)|ce1_>y>9ngx&q;_&IqbUd+ zrZO#QV!wsYfwdB(hf8!J^ssJ04gygJ%+XA_n(J}e;k<8tsFzP1@nKA><@GYgI35yAh@P%*~ z{88r@?DYP74)XJ_^1r%&Ca=$t&tA!Q1=aK~f&15cKqI+S(t3Cj>C%5X{;khHi+E`n z^(-|lc$5Ypj}ES@Wt4~ z=3ynguc8$Tt<)LxuPL+T-(cblao}Wf36>Go_AnGOFffsTs9%=N(r1wkcW0D+g}YGt$qH%F+;5v^=GUO5n`AwdAG(It>+^n@GYJ;Np*UKd&x)|XK62dRJuJ$gr& z=kZMb)z!UojnhM%lMgE;?w9!*qhrGhLZk6WhN382Ahiq|p4$=$X`TyX8Q;miLYeV5 z6pzI}O00+9kMxJnwtvMw-uXb``APaeUEk8SDgRX+%7KBPmOR)7YXQ&5rjRsBk81`pj4)U1gn6 z%oI%z$(CF9WfeZ)fdm|taB*ZxRNh{tGmE3t@0bxrqp9^ssh&E7Dk_D^6X`9kuj3_Q z+8u)ewG%}hLvSLVg5j!JN;l~Bc&@PL3$t*BsX^#n%;ovDbxj1t<;^5{L=@$762)7sn`tT zzxR&u=A948wK)&s2V!gCHIY8h`8(gRb1R>?{`2&`G`Z<>`ab1dKT9hH)cdLe(rZ_P z7faBj3%RMJ*qd$t=J{t4PcNaDE2j~S;Q^G zs05eKs5|xwFmyGOFC{Wt@F|S-!a6^<$8kB=*(ABD%kvk_U=)2i4P7wo*+)v%-VMCs zkaE$}$xp=QvWJxE9XtY*$BH{T-~>IHk?L6j*BQ-d6(IyxCLXi|H>0zLf`Ha#BO!4< zBN-kJ1*KeJ*303ltP)U2J7B|=dCrNdkSX-+ecCdmR+gKx*$@xTY|+SztrD56Qvy5^ zQ|!FXb>Vrg_fjELon35!!)?McBgc70vp>%fACGX}ou!<4u5~eR!(u|cqO*|a(sN5_ zqWj{IIo*-+6{l#Kdt^q_#{VSOl#ly&r&oF9C3tu&-TN9hfB1px*U>9!^2odN!=>L0 z!W!1#%P9lUAfOxE(LF;FYse)1Q11N~&;KjpEqJbnIxEAYLnt%p(9#-)OxK!t18vFM z)m%cJ16m2NZXa&_$s58tUlY==iI>XesKWzt6}#LsmF{zvd9UQNs|Se?p`-L>F&~2j z%7$JaE>}d#z|f*j#8e3#16Rd@uxkuvPEu^8K@1#7 z96zHgK~+d2mco5uTFF1$?jxBL z6CQ?(N`-PkF}93$$fDOHnkD}G{(!7{c=vbfLp<;;l4myU zyvvVn6{X5|QKCQdZLXJ$bu$#_m*YS9n825Bo2oo^kkZIPme4Puq&=Pon85}jS*&)I zn5CYo0ESOk&p2)}vwAIv%Bn4Dizz%Z;Sle?N@sqbo0a&GQN)j2!lV2thTY?34z>N~ z){9233l!6K#s(zuDMO|0hoBfR2odSsfQAs27M)sUhwnV%!Uhcf6>>!K=uQ|-ft}9$}868>y6+&bpi0HQVGZ*^+WSNk!d8R)jUm)uppnn z;J>R)0C=m=qCKt@@ADRT;DO8bD#mI0I)C;UmR~>nA~lV^0Qt!N$AwY;&v8yynxfu5 z>(!V}kJcRD#T&i-xhRXg^N$Xi&v(5(9(CO*6734j z&t~(=r~|A~*|bCpw3CAsWg|R}(x>N(RdeR+y{-qe-DU-1O~dGl)ow3Q4S_P} z=HTq`Johf<^Op8)e>124solJ_NTl@$cOsmL}vNvXH@N5qcrv*v*|eT@yLDT zk-~=NM;y$D9J@JSV||CRnASLHVRO0*Gk`rqRUD=G>%Ki~q}&rI7uPQq$E5z+& zIa2TRS-xmad5%$B6HYQF{k)z>QzWlpI-S;~VgZQGKvjjqmPmoH8Ni23Ua9u4szTBa-lx)p;^!yxgjr1 zpxVd66X{7Z6A_2eD+)U%uW(2t8QAF5bgS_;vcEH^Y4vi`Oh0JOyZkWTLHEt8H0exo zGXIOC5jpgab*`j`>r}^`6KSi-6AD|w1z>#1F3nDQ+SS$CLENgpx9fM466vpMSgo&I zxgOtTTGbA<`{)lHt3>xqlJ$0Eu+BTI1->tYyHm*1ScTuU3F$wH9-hA+x){BDm`i_L zo0f8zkMKKeb#ObLb1{3li4n~%NjAjRVho~!0W&vZsEKayMJ?HAVTg8bMY+@51Hppc zCnA~1T+dklw4ef8;ad?ZtRYUw1V3F9PIqO;v$nFfawzTOR zYI<&Sm+NfjD=aYhpfE*y7}U5a1O|Qg0-1!`N7HGDB#)G9|Ks`B$oM%&u1f=Rg3|$T z9~u-IR2VFq6>?&le&ay)MOw1NWW-MPOR+UCGF?FAJ7BlN#kIxW(YdX~*y_!GkUnzI z#rzb9QGNZrg2EHaxAlES4nZDc$4*Yh?v8EX77EtHc0${wVoH~}b_(j%o_5S6Z9x-! zzT1z;{sfz}zY7h*zk>_v`=-mZ2VNth2bT4E2a2^W`@Hx4_GK4R$ZHh}zdLHv$aP8H zSsLk?}Tf zooCy{H1|X1*&w8&cOjBDDdg0;>c+OlTO3Y!G-8E#DmI6p>?I)<84sJ_KHY}CEWEVcX8Wo^THltO7PIJNB{6zujiiRY|!?#P5jTz zCb=IyT{v=6i5Gd1pz&h0?ZS)pHvBQMJm|DN#pQG{N&on`L?S;WUMnR9Zcrg7U;{%q znFaFFYnVyWn;ND-&F$LL_|tp3g!0_7Jd(|l0z2h&mCFDn%6=Uzz#rg-I|G2T$vGaB zzGGCR6}l!dwRjZIwPJ?S^e_LVhK5UuA59d*h_Jj?iKO5>Ze*W+1v2Z z?05cscfJ5$wp&Ht%#Sd98@QKBo~l*e+^FSTpX&N!x4Sj|ReLG?-B|X`lhr(fyu9FB z87Yn$9SUYQ!-BOn<2l4{`EavaS;Q&0**9wHVIM{Dr=}#P#-gJV@9BhHuNL%=^z(L% zi(t5#5(WsmJ2Qxf>LPE28At-{n zj;0_lw;^ffPAiGoIfe9(fBrQxp6B*;FIS9mSwQC8WD0Bt>6z zgM`B9&M_Ecv~qni+=10@opu7mYfDdgEadH$Tga8UakKNtC2Y7I&NVoKM^{cU2D77ANqXFY8k zf9Rx$eUS;)_{4;R{17cC_qS=J+6CtbY#M~=u8AV;*Ol?hYLYz(o^oyTS7 z&LmJazC_S2KQ+GcexK#iz!wZ?{B|%ThZU2eCm`0Pv93Zqf(m)^83x0-HY34 zDN2jQ1F_2??vCf?If7>zDD^Y$M3-~vO64PsR@x)G68=4_DBV4Il+zw_lIH<;oeyat zQR=)tk#P3d+x2|G+wf$xh~}t1J>lR{kmufW7xRNnU)`glc!9M1B)uqd84`iHc;7ic zlv6K^)=)BrpG~W}ve@qV7*BTf+|@K#x&y{N(KpwdM<+suy2Q~t%1h7cx~rl)`TK4s z60C)246qAXNXU*^PM{5YQ9}Eee9^JqX+ zTdNT-#Zb1BjLU^Y<>A8Zxb?U~^`G!*ev)gq3Q2vy?aX-f?#_c{iXESEmII#-j<@>F zj&G&AU5@0Yecm07Q+?_m#eaLV=ly5qZ-i zvh`!5;)Dx=gms}lew>g8*Nse!Sqk;MqKY3P>-lhT<5#l5xmtK_0=&gbPqqXQw}k=$ z5MMbKcL#vnpFx-%VI&vlX|2=}g?F7!xWN@-%lII`7-XEyM8TgQd|56mH;bnWFkDjv z_TYG6eKUzTXm^oVV3hRR^PeN*W35LT&xN8rzDV`Ch1~ba#n7T{-i6hZUmYFbGe9lS z$(Wy4r_D%l-dvNIrP(y~4j96sp#uS4A^%_7KMQ7j*iF`UQ!V(UGnZC*cv zf5;$awDoiRtC+p3OEJTOL1x2@3uUjAUzTmhZ4e%5eh*vbKMxoLNM@4?KOJ_dcN{h; zwnC;^_5*r3-dVS+y;FPTa;UbPaQJST>fM`3{HNJ2tQK)AYT4d&3!WR=Z%$j47qeW1| z!8$yQ?EGZm@DL$ZZ69%vlRXnF;=WM0r?q%>RD#23!c7V%8J9%`A5+rXx4{6xPIIQM?0 zLNXq5J9Al)+3{GR+(8ZT9UxkDPaZTmp4=tE4|L}f-k&_V^?A4*|9!a7{qsq_(aP#G zijAK3_??y#_|B^&NAle>-Ie#%JZUJrVJs?KsKAiR#M=RK-&>g8$e90nk)A_%kvaAe zcYM|WOBOiW9jA$hwdiWdmavN3_{awP`dnpobD#lPn}WDP3}kU$R=Q7c_~7w`8|-Ks z23>?P=t1U<3sNN!6td`Cb>Cj#{gw#Oe#r_LuZkreVwj2PuY&*e{8b-qa-=vkGDO>) zGIYXy?R;|rcrrsy&Er&#)pqd&fhpv6$*$l!oZP=I@GEGu+SsAd$kM*PK-KAZ#Zu4z zk%ifDG+g2Edy+)r0fKXd)XndA(#?$N9s+H@9*>0e6e!Ph^wX^S zAU)2#IweR(k2KGvJK^U><1&YKQ&flWPM$-%QoTc^Qins4POn3ysrd7iM8Wg6O#FF$ zi2M13ui^eo9@SxU9`3LJ>wDPj<#0ITWwO767EX_kHi(H2(kIAKnRo#%ATa>B=F%;1}OqwWq==iVauli__ zCd#go24iyoYWDSn_@zK^6@(n9BQ%fY7x6fm#i+gPIk7F@FSLP)q(4@&Z#z`#8`@WA zOIRO|D(d+*nVKE=gB4Cs{KWC^Jvn#2R|p1@x|m}}2QKXOcio-O?ibtg&jzBa7Fo6u zW0mJyTWD77Jw47XDkRSCq-vaT)WXk!o_hyo{Zt3eRl~KRvVz=%G`T z=Y9QK)ap{|97WpY_#&Ip2CnSh9^O<)stcCfTR&e!SO*Q_2yn2Dg6cDHz?E)XwvytI ziqJq-gxVyJ#blOG#?g{5o6xrAno%qaFjKUyph0ylIh%iV0$t^zz$ZIBz&H;^d=;)l z#9Hb9>-nobTBHfID`yC?*#{N*dcgcsyk+x4_Ep_APsK;^c&VAF!=zEMU6%vu;8@Zh zi+N&B<;J>J6?qcYhr_q^e4c=d_F)EY?{>Y&o>0#HlOn-j5|K52c<2K8jnLiYq;9cI zZ#)oNxyZ7Ki%?pwZJ=JXv2!>#&J;hB#b}(d=DpHdw<AqNRS^7eaMdgo@wCIr{GAY1!}hXqg;N+6kv5kv-G= z^+NB09y;Qn_ciX)tBD#56l&CF7TLae%9Yd8E0E%y?2L85`((-T>V(p;2iUvBLN&N~ zA-DNytVE^cBQ($rDBHA|xSXOf992>;g63J38O7ovGsTl*45)>ebLnzB05z5({~6l? zh_g2!j&T_gp%k+Jdj6`9rkKs`i+G)EcR)c9r`Vtr56#q|EdxFEw}Ryay!3PATWpiq zk=fu~6#CnRnL1vl0=IisB~NcX*qayA^Lp)6w1rY|f4^rhopFOgMCw(5YMGyAs5G1t_}#4_cN@qo=&kVdgncL1!0#N^p!_I5fr=Z^5eL zEq4uJ6&&NGU@YJ)V9jL7Wvv>aL1;laWKQD>3SK7AluRRNCi;q~_CB*v^^or~^sS`i zLmPo^76ss&yf=`0f31&8)`v*d!S=7`ulnc}znFEZoSM}80p0mqiq?xvdj9LI4nCxIWy!M)Wxp@^Ty{U6lkbPLKBPX#HuPD~ zkoR1z7kIGqT1@w7TvHHN=A#$d4AHmC2Hm%4MQ{q2@ft8T18l0VD%hOHy9A2rt8T@k z5ca_#2uOGcotCxBRfJhA%1aO{V8@ujl}}I53Y^h zUZH$W_I$mSqV%W-aGPfbw*E2%Fo!I??RpTR-Hn63f9fNdU-i)ngSSI9jj!zyC>i1b z2~2_UWQFYAcT#yT(x;rlI_iCpJ}S6pzegSFO9IWcN;*BV(6B0Nx^2F5a!=2@%c*ED z&Pe-+6ex~63*+1()!qvHKE@i`J9Xh;uoJ(O-YK>bL>}+iD_1tM(Mk)gk7Ji0){f`a z$r5MkA?oKmco)*0@_Q%uA5$H$`0B8-xybQQSxWHS4%UJ+pzM$fxSaH< zcsk#g{xs!}i!OKVF<(ypgaIXw<}6?Xfh0F4pdL~QOvDMOUzNDf|NZErdWdtdyR%Q= z?}gCA~0-os3FTH;>V|S%|fr{wv+pip$h(4g1Bc;Eb?Ix3Js-4;nhK2fyyXwI4Ae*=$kh< z5!6bYnPN5SY4?VlnL?grFoLG&vbo=Y95_iJAqw(Q9OWj+REk;)7&b`-W^c6t$(~~B z9EvT(kq=ijetZ5}FBvtxjS|84M+1{z=(Rl2RV z;kh;7ZakK}5#=7(i>!q_@%giOgAnH!0%@pvOFZUjl*wzkqw_D#X2pM=>6V);q}|w5Q(1KP({Do zS90ll8)Y>4Hud55{*6zg`(m?WZ&_xaeTn({^sVyh@T73xzyf=B+ji>2qiye#niaoK z&t_Fa@ELdnGC>J^>#-l$F~CjyS}dN6*2~q%)6m5mZ=w_T466dp$ca>qOJx9?_0tL| zc7)x6gfP&uCV*%`XcUOaCx_SHB;|Gi_@-B1>dCTixl}pi<>@AF*iYK{9yv}>~H}C zki{i)iaZ)6`Vv-4J0K@F66hW10=Umv)C=!R5-Y!R|Lgf{y<}f<6s;8B69Inph28)X zY{?OiO-m|z8|!y+bVcw*=Cy`*6S8rn2_Bs_=>1Xud2guaQ)H!89rSb5ykC^PpL1*S z-X&7gYx!ObO6&7Xk9g%%YXkfXKhCL*VV26}SCYkD^Y?s*f(=_+W+*!+`*?FQmZOTt zzsM(boy7;gA%WsHe(=XFZ;9lLY^f%-?fC_^yhXabdYkIIe8l{%WlwDR>Cu(Nq7RXu zbC2*_PbY+j+UA-2iq=!72+QO?H#2@8%O_OBaH)yGp|MIPoF#B8cc{A{O#uETqlK$U zF!^ur`DQw)FR&_(8JUqrI07SB<0*}pL{*r4fFA?R&0sVo$TI}QZdV`?W1OPdWX+Bo z!7)2Z}FJNxHsJCF{$4G&=CbX=?cV5%bTg zHL=awy({Y}N7(PUEy8ZYYvHkmY370K`P3QAH1at5HT-klkZL#%PY6b0l+2j(;g%40 zcYa#mM3(C&u7(&*JD(~O&9p&`ibr-j){KB>v;`j1NDGyPDIt9s=$YZ@t03nP5Dz$0 zBE>L8tJ8)(d?KFtGL9`w5J~SWS^_elZ@5y(h`Um{^*9Vzy=wvpNVfwkFJsmAnOcd= ze{lZm`D?v|u-*za@_Z5;81V&d7U*s&lNp{;V6>K)UiX1gXP}sgoCmqu@hyIjvvBSK z?jDq%YFS9pEquVKNDn;H!N#sbc{+yV@ZwHaAjIP=vq!RN#74hpB#?WnZ1ieZ-H?0} za#}fNAzZ%?I!gDZ=*8tyy>aAII5Y+ioLdW~{fc@6tfVH$SmIV3pcInFv@G@d%CFofDuc;WKV?1fGYGTJu` z9_XeA3U{^*v~lHPHi2E2k$12vyJsKKW1?B!6Ak#`Q=)C-qW=K1XUB>$$ERt=xzke% zfH4=CHG@E^Y8fhRhRHSy4lJo7DXeVMENSw6)OPBhK!#!@YBs?IihOx~@{;P6A#iQJ z8+Z*$Py-vP5}ouV{`LH|UP54ZqYc73A_5w|(3|+MDFs2h_>|>SO3m5a>#x?P zz(c(91V80dFHruiG=RI^DGGF@n>t7X#IedUhZoI z_vXOpIYgI6(FcTa(<5*`-`_-^G5kTO%AKj!H}?PO%Ik=29oE$5DIMqwtT2 zL7iwU4u(RY{R}`!5L+)-S8htjM5dd14(3VPcF0y!t&#z(3M?ZHYmsU}HXpa;Bh2Dhm>byBq;u$P?hbp1<~!;htNedfsj1*6d%cfTC`v>OaAFZ#EJyD!PlD#OHW<^MeT$*p`A8b`JezQ~mYd{0clkw9g|XH-RX zyAn0&TdGCKEtiDg!_bJ7)6|4&vZvdUeGxbg0 z*A)5Wi=jZ``}+XnTsPnpG4_`y5RLlIhk zcJ_)ky|U8F8$)oejgDS^IyNX-TSoR=Md^2EO;HXJ`+1A~=AxP!zsMElo+TzWl0b#8 z&ZzQ7cO@zxZ>i>IZNa0n4nsp9pQc6+kv*|%k{gM;luO=+*pF^og#Cd$PEqDM02SAW@^tyJh5jj@j}h&f}PG*0H21WYIgTzXBPE%wH`O zXrw3|x}63*Blk+TU8n#M6J2Ui?oWu>vzLB*{IwS>lIvjFET0Y zS@rI{oa4hQ+8w0~&p!16MWj(4-3e&ndQ^WxvTqx-%{|xmEUQBS>*VS@nLkJO=kt2m z`gli={nbK|_*QK&`nfCHtX3R*J75up1YF80aII+f?&~d`35FM9t)={DG#wW>bEh9*av{D0< zMC&-duYVc4_Ptf0tlLuWDd{Pn-3!Y?m*$}4x`VMlie8TJ_BW3SS{FnXzV3c`scPZ{ z<66NBrE&64-&RUK$-g1LjqIx?Q8rZ{GWXW6alI*7R(TV@rO*@o&buMw6Z+)+2=D&F z%!NNE#_*(_m!i`ZVjvXQ9L<>)8b`o+h2z#uBV}d<{Jg?UZKIlL?j*K>1YOdv3Wk`O zYofFRol_x?Qqg?(Zg|O@4?NO+X*$6vB)MjT;;Ipd7x|l3dtK**~XfWOx4ctkMLa&huocY z*S14rY#_Cf%<$@TkQzSzN{KoCfxmGSGBhN*EtI!V&`xMvNS9(p?gpqgRW~UeBmVTv{vXf(7M#QG6YzX+wby9qj|AU9{ajZlHgpx;Ave@W zqJyV*MUL)_iT5mhxN1FDz_gd>>QZM9^Xv$}>-weHRs)^PVZE1_fq%OJ7tbBy2QQIg z1Q6cm@D+2qmVX zVBt}Lag_@8cL>+Op-utjSO+?h1alCLrxqJqm`198gmEY2kCEX)$N1CXlUs{pb3CgrJM=c{pE|A;PWmoYy~WM>A3{#sl^l=8mGv?Tz*_OiS{gZmfCChH$H|T9mX-l0kEMRv zEi3CDSrfvd6GuvJI1HN@5m%?-DWA@RK)MBc#5i9wj<*2GdFileg=-P)un#*B7jg3# z3i?=eiH~ii+p#A05VeH41CBfB|0j|yQTJTOslfzEaxbH^Kaop_mCk>K=Dep$|W46m>X!B>>LMaduCL2Wu1v!R&ne zE$zLo`;xDExmX!Q>z7zH0${?Vl}UPjA|aNLLDQs%m&+Baj`9qOzvRJ`injrwy$snB z(7N$qk>;(~D~U5wiokci$I0;3>PDe0|jM!0VV?sU`-MMI2x_gWD=)| zs%BOH=W71b+=8wBX#<$*IbsK!n zw4W#H(&l9kX~$l3{m^|~4HZLe^|sJM`EXClD5V?paGqo)4BeE!iJJCcT>KnQHM&$K zvf5Fg5;~m3w*EX^=FLXj)s4(Bw{Oq;^?z3MYkzxmg#X-gcx%0Hfp@F>iSAxSy~SSU z0AxGwAYuLS2fDLm1BpM!d}#lEWKcF2sP1y|T-fn&R$4bJ z$6NzPP**Dw<8ty1QZR=w-_SDVptCfKz0$5sd z1Cm>0fwqVJsx&LJ#1ZMr|MC29!8wJP^euB~gDxii9q$urnBx_k6|o&xqci`4L>u;K zB699sr^xH0qpPmlRZQCn_gw0nJw01Pxt%}M3VVbmQd=D+1uMT@y=#;~1c6sc7Q+5t zh1eqYteIB6;;2T}Dn%CC%2h+x(3~qBF*0M@@mCjd3Gfe3UmJbMozOnb{}g}P@&5K= z-;%&;N06h^DSbn+8=jR z`~Y&=e8=&4L`5&X@S#U+nwmx`mxO~?AeV<>2IltZr-Q`=LFTrUQ_ zQf9bN$(1c}sS}{5*8u9qje%(zM>V$B%S4t%wg2(_Z^1co)5AVX5@I_KO7wKf4oq^g zNe^1lbkN-3>>-dlB_ns?uf-*(>n_GZzl?yYaKgZpkH=L?HUn+LhICjNd{=OYEeRjl*Y^WU+VR zK^mtF36PKcWy%}(8fZ66vLsftQMwBvA@=h(k^+{wY7$6QFv+u61mS!1L)Wtk6ZPZT zDB67jI$;~@>b0G9-}<12o`%BwzGSAz)fD{EjfKS5^ptm+uTO{|oc+PgL_V0S>zXj)n4I8+? zS?J-K0Jno{VPJ~e1MB>aC`DlRin&`ft+)TaT#?KM2oDRmOpIPUbuuY#1B@SihH@PJ zh!yr($!FhgHP(1P+#;Q_{QB}i`V=)P_WVM;%L4My^$C1lKUZee8zLE_@-k*UAw+x8 zqY5^gr?2TL<|*nZn?zoJanbn^e_}yHJ342m6EpKWY>p~y3_9c zRf2N+`P|*&uca{Y!QgY0O?ZXMKqXTrziU@MmAc&wNzIS(fiS%;GdB;Dk3cpS&8 z`b|Vc_*9cwGrNu5K63tQj@uv|Auz-u909XSnc`6Oe+{y?=YI>%G3#q4dA58H)&yDXozneNTy?EV*JC7reJTUDn9H92N6INO+m|9?!JwY# zx%UrD@|zTmOFz2YKOhAPd(ULDZ?>yze3&ejPG0Q0e4O7)9TD~U0?uI^c>;X|U%Zc( zS%uk4#wmASS|@mGFGF)-(*-JeKP+@_e|8iz`lQ6?@Iz8XVNb>qziVkpwEe^3|**=e%3-=4KM**gg0Ii4d>C1qko zA}XRKU|(2x?5d*pl=j6$c$amUH48!*@e62MQEi5C38B)yCicVuQ#Z|?ILxpx1SQl62F%59n5v!M!h<@ zh)Z3>p60g^R(z_ZHhlv`6Wrz~Hd6x?R#IxncNq07&P}}qf9l*f{FBq%l_cV?d?Fu1 zePkKJziVmBv8{05e2>Y-=IBPS&)*B z%y*9MIS!AI{K;ui`sl(45qRMr9CleKZslYqL%tLlc8!b%Hv6Ip-n^vYt10eS2efrK zBpH286Yc;iv2_ghyz9l}DiTIz%I_{6tZ7$|aCkWGo##2^Lt`^qLY+2Rd<9Rsc-8*z zXi(5v%9u&VSD#=5hSp^RMTBFEH)M#;CR2@^gAeUE&H03CRf( z4KF!`W&+2I)8zk|HhQf)eZRFL^gSNNzl&L4CKxnFd6_rNg_sV@C~F~uj3a&&gz ztxCloKjWJpBhf*goG^yRZbh$V|Cu=Hy?1*9{#-1=X7!Kt^cPAK_=EWM*i7}mz^`tR zOzKofBF*mSQX|R-cP1_!*uEnF&$M3XShdLFn5)M5h@I&3V{!WSpRFT=v%Y4JKlh%A z?+nhz?bQtX?AJFr@4tBj-aBp;+BtZAIX$^ZKPER-IPDQ1hi7USw|&|TBaLJ(Hl2j* zVsL6dOLENGl}xt+k2tF&cx|kjT!tsNt%n^7;^2GT-6RrZuIa%Mq-&nxZ>9gjJH>Iu zhu$dJiVmAv3<~LF{KKFl_z$<-f~(P;K)om*P#;ME`b=U~P^-nn^$_KM$NR6I7yI(b zY8_gBj;9nAuAyb#1t?Q5s}CL(vRj}r7>+3;V8-wR)!4NooU1~2#Nld%dUpXF+<6kC z_wM^kiSW~K&X2|QiaTpZw+W1M4`!}|6{HEAg%#QK!)kBLX!Y6mC)DD^JUAO68K!5b_ z(*7)7hLIi*YW+PoCA!tI8M9k34LvIFbv_+@W^lYcD7?G8d^M*sOB~;xAW<`WTgbl~ z#uGfx4A?9&vl(?EIl--uF5^;$FXo_9weZ1_knS4eJ2kmt_OJv`=iruW?$9?NuyqS# znPDu#)&iQ3#CgAj-biz>XBu?p0Chw$f$-r$m+IZ~E)8b`UaTg79jpv6T2txMxY$kn zBAi2X4G46Gx&1ya2IWXInfh1&xs_LLA{?HDGCo9wr?nZ=8VrJ@A))H%&;tcc*(F9J zSh{O-Tz4I{88TZoD}6$?c=Z{zZtw|${YA)C`yZuzs*NWw0TNzazU@r~RYPGW?yI9J ze8E^xZt#JKdMP$rW*j2qy6&L^Ylg5qm=nDYyb`?(enCZBGD&sQ?KQWg@`$pKShqU6 zP@^>MF`q2^0Knmw`Sgz%Z8>ts-OUFvaB)D7plRv9=)gq2^b@FKz zb+HJ>dFK+)NB68NyXf!-Pa1=Rvzxu^LZYEk%Ufx8No(9jKhCK%=1JJwA3rekRip!> z*IWSgH>H4;rgLl#EY^@7x@L+u~#(!P4N9Z#6DcN(7ip`D4 zDW&{UL0I%Dz#&w5i#6{NGgny)tvK{s0KMFy9W7+l2V{91eL?RySXg<{gAY3D!-RMf zM{l;8&8T}!;1VSiy6U0Z$ez;hUfA$et)(yXji)=oj^3&2iDvm}qxPADnN1 zO_ivlbc1Y;X>BxuZponp^wm9!VjmrD+}0EZ&v@)z36F(}FKy*0|6JoXcz;f%GEKrt zzyH8=`BE|v{ul=2FqZ;u7}q}4xglcCc=~V8U&qCu1jQR>4i0w<(rK8>EZagDwK2$) z8hvWD7IHpab;3edgtg>`DDT5CwoNg8S=45M>C#2nJ+j5yxwQJoMFe-3C#C%vMo_io zHC%$^sdcBNv6{9DmxX()qv87o(3k7c5z)+qXUU9Mi8wEq=)mfnnIDXBT~qB4pa3_~ zP?z*wW`%dLODgxu2#Pik9K z*SU2M&Z(4MlQ7~3ADE^`5{q6bdxEO>{U@)_Eyi<_C zc%uy59L%VSMW$3~Q>xW~Bq7#%$lzHXExF#yhOiKDV@!V{wQ)d-bWvWb-2H<@I{k?8 zK%OpVO8axTuxk5rgapZ2_fAV`4Q)9(8+UR~!*@tQU-6l$sAh_HHuZq1u=A{*u5XRq zjR*al*Hl~hE`h74DNEWf-*9PTkt95m6p*aHb5lQ0@|sx&3wv29oiOUBHG|@T0iEZX z9mw*7_XUF!M^VE3Lq61qBTLyt0E02PotDst06y7-bQisdDu|Kxl%$aT^9W(KkG2Mk zBqXo(U_B3}p;4?hC`LLY%+1n028ytJB;atXRXRt%itM>zOZIdryl@hhs@>3-<{saS z%y*7K@l9=HDx7R^X>X8dZ;y~LqT3&twm=v_^jR!$I$8w8cqQ~b9-JZGHct8N`RlkC z6r#vrX6mYx7j~Vg%)Bv}RWSycQmjF#mJ5>fG&Vp6zqzTS*mCi{kDpaj%m9|g*q25}dkqq>dT5@V>OOZLaeHl$JqLiLuo3gNGqE`;} zOI=~-NmV_c3UaT(&YKLX)m)drxzv=U^%t2S)yxuvW>G=;3OP3YWQpr$aW~m=)Bodn zpFwd~mCke36lD3){*vMG12Mv^0Y7TUf~9QIi_Ul-&ZPg*okuo~;H(!>?q#GiDIsLv z6(P*|(aPXD2`OOnlAO=#2FXfT%)J1zr(+xxVO1&UApTS`Q-_>Snq8aH3x7Elg5D!j zH5wbz9C1y^O#2uV_smA7(&;Lf*7`ZE%xhAl=Lmf+^9N>A5Q8!LDB~d(aTbDjgS`lB04(4G$9c)G!VXdsSP9bi^#C`- z3?M0uVYpjGB^9^tzxAgv#1j2^o<6){PkJb%^SsJm>|9M(sU^9FwkRMAyCI_C)gi8{ zSg#BovQ znxR-(b7N_RP~SBf6*iRUJeTyyo)0gmALxlBPH6I?UK%r%O*qpT?|EF;|7goA8;x_; z3orCi(R(8z=Bo45vKifvRV*X(+x((x*f*3vnxm;w&8feFB* z7VjBr#Res1s$Efw0f~76_k+TE zuWKk4lRcd+>SJC7(HKMHrHYHoW$(ZBr8A6r5yaE_fb3~1qSIR*Aodf`QF{)Wo=CQ+H_y+6>C;K=U75e^|#vr<2Qh!6J_KQfV&PGxxd}p$*K%sad5!kV+^wBiF~&yDxYO3845 zSu+vPwkrkD+(Uh@HD-uDlzG4N`RlkCpz|kYC~A1;zG!tlxlGxQBO6) zpfKWfHN{epuCJ?EUCc`)wK0?+U0hrtfB)2?um95aN^1 zl_h&hG8FxvCj(!|S4{?mb#gxE$@zQ>zM#IZC!9F0$%i7EF=fATr8C}zFp0dk<&lkw zbJYtg^j6WCkQTDbg$vm9)CoiuHb|DcV(<9|yP8^&^J!io>>%7JovBt4 zolUjtK+dN-8|XbcRi(Be%?8_mB!ID@oD*A_%3B-4I#VQCDIy6izWR~54;lz?HpT$L zu~oqGy_G%(yKy2`xBR!~uj68nw=$!duG`%#81s!Xiv|>{TofuLOPg9Ph3sjl7aBam z3@A2$w0se!HMkd1w8q{^a)kvA3il5qX!WB9f_Wa>lIKqcejQ?izZgkdRjD)S5p@M3 z9k(lS*Xy~2mSTglpk|VD`rYSxf;MBy>b?cm%nu*mq*X2Cy#P+4yHZ+unGsUTEJ~;m zOPXWR5i!B|5s9skODq^>F6=_PrORNV%0y zOmR32puZ6YM71>leYZ~fhTaboPx%`E@%-nw7z9^l$uoA9NNNy*Zq zv&bjUpVm5I!4sVKblNX!!7#?vxM#@>#y)Avg*i`@i#PD(e7;8VG`iB*|Ag{t_I8jx z&F?Ap<&@GkhNR*S6qO->GH8p(moo<>vdNiJs_8`kW=mmp4dw#-%8852O zi6wg=kfCTbf=TGapHnt5*qVPk5%M7@ z&wTe-e}r+ptOI|iT8eRbLJ;+~AK5dg@bWuCs%cGg7(A*GS!$0#D!krJG1}hdahyHB zZPY`GRA2hcG(H&zJoWMeq;;Br$%?(c2h*>J^%+lod;Zh0GDMjz&%!~g087tS=Fo^` z)DMqN&o^SQs02xPx~qkU&I>535-)4Pl1*xHPjeZHeA4d~X7t=EUe2Y_$4;U6n!IW3 zzlHN?cJ-6jpU%pP#IiEl7EBuMSW^iytgNBarX!+W;+ZD%!b-?_&PdI-*p1Dsiq(`vYC+{Z<_WUgLSE3@ z@#G^+*z!PMkk_9tF$_iXglj_k7!FZFmWM938m515QA5b{MZ7TkX9PK)DZJhT%{*y! z^p;c=fkzirV&!s@SlWg4#~0O6u`fTLLxz#2KyXBW{&)a~o|?fFlA6s^RX=U}H% zkV?y1=J*87XoAG1mp!1fXak8s{8Uh(8{*2UV^kWj%m>xDr;iwl{IZp^Qiqg_7wc$r z(d(gnt-&<*UsJhM+UH>8`bb%>ucd^x4VQv@Z>#{BP*>CGHWX5?^h=W&a1n4`wo-vT z@?kT3DNF}E7QYOxVW28`PIb+tn^Q!oTZvD!UY$)SPlh=!kBy_OmR88?J(5ai!-dLu z8UeE0#DVnokbFur5H9FT1ar{KB!;57qH7!n862X?MQ$e879ah4D{5RGuVRH+zrw-S z$)1qcjeKcOYQ@?y;qq9FhoxT}Jm5j2oRioStu$~oK8SuDQ40Ej%DB3h7H(bF5*8lU z=v@y%LxI>toHh6rsS=3;Ay=9@CaxGv^c8zBwM!ip1u;=){K<+PY!qBv-;|)L~~*Fs*p69 z5g$R6dO{}* z{g^-_w+*L)%ws{8+xZvt_7eCB3nARlK{PXBFrS>y=4%{#6`Z0e6>cWcoiKf1Rh7%_ zbu7=#uQ0MFp4Vf#kuUjqtyo7wxMWPMhh;zlJOJD*>nPc(o@P~pLoh7COF%z@GpKfw z!maC@gV70%-c9iTcagzEvxn3%rD>K#OH z-+%M@Pkodn$C3xLP|K~p!cyYY8O~@GfDUW6rZE@-Nw{DXQK84G_hi?vY55gc*Tg;T zqc;mFQOZhQS1O*LpwSKa63X5cOJ)D%DX&W753*;$J-N<_a@y9Cl=!buW%!bXhU%cT zph`75P3BFopzEfe8muw+=7TwDdVnZR0q&)zDw(3c?)FAd^v-Kde$g(2n;Z>tOnHsW zoQPg}LFlJk8o7NmmCGUlWVKTV(mTxMS6aey`;Oq45JOe;dGkHjIrg7&il^3*^V#R4 zud;rR(`_P}=jIn5@HG;S&uzJZFKM_=q9Ze0G6CmN8ccu(ST)^tlxql?=wSUULN3YBL^sAYJgN) z^S(TqC&Y;Cw%_^ur#>o@WHAjgQqOGx-Sl_v2&1=$VZz$2=nbYpk}k0_VW@Z7so>E8C7d_YW(-$ zyYO{eZPnMdB8D}w>9;3QLasZ(ntm;0&s7;lU{vxlc$k{jf0>@eZB|I)&ZM@G7*UU% z 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 literal 0 HcmV?d00001 diff --git a/app/examples/OpenGL/Md2Model/Weapon.png b/app/examples/OpenGL/Md2Model/Weapon.png new file mode 100644 index 0000000000000000000000000000000000000000..e2eab7addb7e11aa441c9551dd5707a94cca1d63 GIT binary patch literal 17376 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 X&M~jdJ_R2(00000NkvXXu0mjfA%%l8 literal 0 HcmV?d00001 diff --git a/app/examples/OpenGL/Md2Model/bauul.jpg b/app/examples/OpenGL/Md2Model/bauul.jpg new file mode 100644 index 0000000000000000000000000000000000000000..403d146f618d76dffa9a6e376cd59dc3711181ea GIT binary patch literal 25801 zcma%?bx<5%@Zc8@?(S|21PSi$?hxGFEx0=@PH=Yui)(=3_634#aJR+%xT~vQ)%|xp zHC0pnre=Cx_3NJQ`OL@i$3FmuytJG&016rau=v~nA7=neNl$ZoUjP&U761SUeyT12 zXkr%5W|jbpzE2I*#~L6U01pcb3kM4i2M3P`|G6W7frtNsjDm!OjD&=Of%1O@0|gBo z104+o8yg1)8=Hifn3#n8e*_8v0Ra^Sl>h^SfCv{8m*{^6{(lcX`T&?;pgygHfx-kp zV?x1TLVXMZ8UO%jXc#D{Pdopwz`?`7LO~+{KF|Gs2LS(D4+nt906;^*z(B*od_D^d z0u0>eT)+S@VJWfT*x|+0sIX04aY8^v90-m5;?%ga+v;X+oT0@uS1I5D3H&eD=6D+J zONI?)b1%%)7=4k~u=?4v*2&VReNNnDoOKIj8uzj>~1%E%|2W^H{YB{#=KwnaEp_SK50v@vik(LYs2AR3dAaL4b zv5f9njM6N1;+zs6$RrA@k$h6!8>UcI%6icnY{#}_`QMMQJPwO^Ab?f~QS1kKR$Vpw zvRg)+@XOsU92;i80?pZa2%T7U;oq{v7K3`zVivBH*G!Q&DJ{~!sV!}&pq$smmMf8F zQeR`1H^`V(j$X~e1gQ6~Xm_u$L|pZ^j5lOV=YiW^wR;S_sDz|D$t0;c-u)beWO1q4 zEDXOezmdi=+>_Io_}HLWl^+-wVrUf-l^tYSiDq-kBObrU53)k6&1#3wa6GP#?={l< z()gA~VRcUhdbLGwJz~E)1~~gUq;M&Oj6#^xZ`7#VusMR-sGI8U_#1!k8nnpmbX$El z1X4IuB2nq_kqwNf4GSD{Pm58~L|--@YFm02)X^GKncmpK7Y(H>r@vp|`t{(Zq@0r+X2QfUu-co)3U3ha}pfNk(H&t!MF{ zucXNpk>;J)puT@HP#|~0T-!G5q%G;E~WWH04lvP@_v1(w9nhrAFGz7#GxY3y@f~AY3 zgON9WsTmH&Kp9h2NjEZjOa7(YK#m9~EKogOyoJFymDmHGh3y}dE7n>nfvM8j4)@F0 z3BXf%#nwlayN#P&&9KYl;9Ci>QB!?o5p-OCn8KI-$nN*WdHmR*_?0Fro# zBsb3}AQv}TBcv{3Dn7g{{>!R{(5b*d;+T9^cOOOYl>3wa18}4_@?Cc6UKLV{8MVN< z%fQ+A0Z13}O7ij_Vh zmxp^RBp22U`L7)@RLPld6b}tjt7>0!I@*s~t{dCoPYN#+A$>#cD?_3)VgFApAl6j9$o+Hb#yv$ z?qm|DFi3WmU_Oij>3nBKmJf7IQCl8a`zW4h?h}HXARSKjQ~0RLoVnk60Xc2YH;>1m z&gyM-hl1lTDsCZf-W;pXBPzGC!XnF9dfUH}?<8MH(<~rJe!{GO@23d3NG_WLf;RZJ zCzOq^KLG2P%8(t`>yA?PoWaq;B#z>F6a%@aog9efm*p=j$xbpb-gC9owjhVVMUfT7 zfghz{hDDYI?DJ`Q!gA1_>ieIw-+7&@VIb3^y#C=Bn*2DSOZJTO4x1Na!)Vl;N+x?YLOe&z;@Q!2=q3%2(9ndSFHOj7t0?oC+)eBTd6VR->19I(6fqn zHg2@}WhoRVh^$0~I9`hRYe*aa`{&xxer;um=yMi|LP2hbT8Z@V0Z`IlCYYv=ULfj@ zo;SaM=UBUa)9MBds5}?MH+;RPH8ucQa-=z>%f2=a(Og7W6uqlDY6>l_hmixX3qcE)$@bAR72;-sW9<|N;Z5IeB$}=aiWb$qI9NhMy`RU%Rz`YGAJv7u^2R|xgiO?9z%o2eilO&V7nHP zcww?j;-TeC_3oQV+NpeKwk7Atkrilc+=%`=KO5>SGbB7zuqTR7{^t$ndmT@cut5q} zur4|IK~ameq9J-UTYLeb?0dl^RlvkJon!-;7;ISZ5|Bn>;|j;O$HA984m)8>Kk~!R zT%Fa==L6uV+aDr^*Aa8}>)y%j#|nnLcoVzJmJkD<=Mf>#PTitt^~MHUM@l@xHB0X^ z9mOonIKG8*!ek;V$>pgd)RCj9{0jch`SL!d1(-b!4F;SaEHil}(>e7(@ULbSDVdZn z-GM;Udg+X77!Ao^7mW7HqOc=L6Es=N$tCBj6Yl$_^73_Z2Ds}eW~8uRn!FdXHuTNi zA&IyBb4mS{&e@Oea&hoF{fDbA0Y?{JG66zHdCq&baxaBY27oL>`Ba#$$J!N+k_+xs ze8znm#i|SH`f3;`dxsV01dnT43|_l2KmSrbf@Q*a|4eJs1A-gg^;-XE;sqKIF=$6< z=%m!BoG>MrN;HDoWXaY?mNBT*l{)&_9A3elN*j5sZlHd?p)L1&;F=CG?by1j<8NH^ zSl+vXmv{1`DA&9qVBKAAjZ9KvkJXrCtkFBoiBd?-e{9mh9zDF&7tL);on2Gj=+4)l z(=0P6vb0|vY!#3BgDDV7~INQ1B ze_9zGJWKYJJt`a%)N7Im?8XXDek@G!cccyuLb69v!M@WoGGpQW0F2x)csmfgx5x8G z(!WbckG-$R``oVEh1Z5@|3A7Ec(AtPQ&{i-WD*8{}xmCm7ns zE6!`{*#yMyzQZdcqbNnDOr7syO;M$~C`HuJ80j{6_Ao(N^E2g6!QsJuUprSF9>AN(B0wl>1R9K*LVw&pkdpTQ4MCtc`F`m9fINst24h&9OV z9r-|GTWylo5o?_O4~z)Q%cPXCF)a8{Uxgv6{O}X)=x-R#AxgV zbq0pL;ReDaO-+yf1WK_{4Rxe>G7%V+zfc1ZFG`TArY&T^j(^S_*pAf?50!Onnc!OB z-@e?GTBcrNBD>XMm?^d?xQt^OklUShE&46ry`^m<)6qy06u+W7KsbTEGs&QdfQo;J zg2HP&}?=oqLBvn0?qe$V%CrW59mINu# z!Yp4~9jVIqUJL|~Iq3wgtiwncIg+;N`xfj+O%z4K#>~JkCb;;eAdMQ^{h#w70%cNpEFy{kS`^B9)gH!AKOg6Od(g}1`#4|gn z6VQ3mVP`87ea*+Dg`lHX#?fc~pG=zP5TVZCUn{o9V=+^g&tXGQ|I^q5J zw2gz}-Fy9#og|7Om2pMFl*$wyF_M9Cw&tgx$O1ENy`Q9u-TY(Z9;O#}&X$ZpEE`OY z&e27hJ6FdVsn#P0ka(#QA8;uh7+IB}L;{HW0oOujKLc2^)Ks@_;Fc z0Q5R~p@PvZ^MyVhhFP4{iQl-cO4iV!u}3>OI2`HlZDVLCiK7`PmqDBMifnXO7iWGs zYwF8H5XxWty(I>XoEV>;0cCAqr4!1j85ol-JH!(rn_y-^mrp=#emKR4_JpFDI=3zN zb{jF+?i8nFFA^lH~Z>DD)ct&2vnX$17o^DBVAx^(DXR%RhvKpkeW-1Vr|Y>y$~h&zi$p;$6QhIGmCyQD)lfLYv32#G-kZICOOP$z~@Z zJ}#ZwqFdX*ZxkyIQ!AO&L#nn>q8*LO(CfV}C;nR2bo zz2tAtik)jkO9?QeFR`cZ6G^w z!<8v8a?7<29iI?s;xjAkbuZ=RDm6NRUdJ_d+%oZ#Bfao7&0P<^P(Lh2fP9jh*d4Yl zEOOg>g};}elVp=g)9$s2{Zq2mGe6NOF0SJZm!X1-56|DQrqPn zr0)4c=D*@1l^EPCGrOc_k14-9PJ!iD4(3bY{pAX={L?p`?Ru6Xv^Lh;8w4(QC8w~Q z;lO=K_S|KMu+JhQb5<|=wnVg)qn6XM+QmmzBaaPb!$@!xDR#?jbQP@~z8uFcA8$~D z5Qj?P8|4k#sOhOkRq`01_14_sW{ej9Uepmt#ETkvz4%U!WsjFDy=z&}1jX#}32R-o z^ObX$XXCG;R;d@ptv|6AFu@gy64JAqIfB2^dsyd0@>)efvv&w0D7WF{(e|gTjt0kI zK$(Yvcv(-wm?^@;g&`sni(3);+mLxti9#f&eU{jg3G0!`hwyCKpmdsQoL6Mzz||hr z$77gT7SGW2Ok(DOYF8O@wvjYd!mIfX7xuyx@R3ca<>GXk(5e&R%@TQ5oaAWF~hOY+li zJvoBHB1lY{RsTbVhrp|l_eSh)532{(bobp$LKUVkPear#Tmr{)_T*2K!alE4>omPAbst{Bf)HAVI zly^mc5~A*cApz;3`P2l{2~VVCt;(z8x{uf)m_)*;6398M@R&?KD{L@-hPz@p`cpe7yyBe|b8a z-qsGKIcVbb>C$nNR%LtidAFNqC{<{}E&v6^jR^izI4YfAR`mbD5Uu+dm#OPIH!{sm z0Qg|;nc6ot(ozXsOmu1Nf3?Tvgl_e%-by5tm#Gu#9|2x*lCsD5IQH_UD;?PYWM1`d!gPY&5iyZMWp#sI3vn? z0}tU@0yHW6r3i(mb}0LX*|AAh{^Y(3Az@s!!I9#BB#5Nb z(FN>dhhkJOb^%AhSXh2oQ0;|UhO!IaJi#%4i~rL3kNHGNZ5{@_$>H;RiiGJ%Qz+tM z)AWm_lK3kQYrKxC)>c;3uVfs3gS6lYUyZuiO;p?S2&BR$;o*1E&MM@zbSAcV#d|YQ zX-~6KcNUG^|6&nlDt)BliBW02hJ$|#&{wM&4;JVug$VjrV3uIM%qbhuJZ7WAo@h%7 z7ut(+V4>mXgFD0(y`=@H@N+t@#C373+#yIdgqGDQ&ch#oH;m`gR=*tocyhvVi1~q} z0WY#Ri}R*IbHi%_Iv!s8?2`6S7Wy=viD(812i1^2zFQ)k6Y2w>bdfiiF|SyghqW7D z)i;4HQSTyIip&DLRxdNq=Wftz#;TAqpHPCjKxqz_%ENsXn)4o{F$O3uVOTZ$Xp2_K z{Rv0;&g1pa*Ra~3Bj?TGLC1M4&fuswk(Sw{sfRXc@tj@`d^2# zN2&#J*t-6v4zA5L?Lf=Gs7wqIGXY74CU0P0OlzBjQ)m<~^mlfpIZTuC!BI@fGa+@O zf!#S4XQJ8xS~rvLSi9_x7yNqGiUCh3@2kHK_))oEzZGsUDkw)U-wrp8^^6Oybm)~~ zDiTs@^vaf;;4LjKP+^d2Dtlo~#+h1(cK@(eoH$lD7ptz{5=p4UgSP1BF)SGY$v^2` zDVuvk^$b#w-(Z&sAx&yqoX2O~Nr8D^wg2T%RA&=pg^UetB&F1)dK9YO(uNxOX&JI8DiAAzuTCe-!IyY?+wH_54J|c-F#pBqgVTK6zHsij z3z~3D5E9Hir+Sr-lpW`P%}=VG39n8Yxn< z9=4$4O4B-1wg!b!ucixuC)^Am%cn&}dWN!!;wzF(ekC04yf@~lj7Wz!Y*}sky6R%H zUmasMko;-m|BMYPNZ<@;$MqTFvN)#`=e($>hMJ6IT@+6Ir&z^djl{j7`SltP`WMn; zgH~R#vgYhzJ%^>_AbJ46AVIE?DBw;5hE6CA0>Ip`3S8!tr2FaYP4!LV%veRaE07z$ z-J)?;TemwbO$I%En79p-Y}+xTC3*(xL6u&O5%lB4!&4#k5F869=0!h;Uw2-1ls*T4 zq-~^^?Y4P3RzRIM=DXxj(?Tfoq^W%`s1INx-lHEs#xcGf=l#$1rQS0V--FCz+2Dff zH;6^ud7zKDph0?ac4C9~MQM?lb|lVcZt$BVOBjV4LNVe7xYyWiGMaU^P^#^ZzB&Gy zL3&=k;w6QbzLy}>6E-vQ3k~KC-GalwtfetFel}Ck0z#~^GvN-kp@}X`fOn6^Ff@g6 z=cS-nE6eNeY}LTL9h7_(plt_x_6*3iYh9G9#(Jz!xVjgsS9>(DV3JN*AvF$l4#h{y zmr;4{Vas*K&__LeVM3!p|9%hYKY}*u;_nmtzQb7Z+eSbcrl|%Df~3pxT}=_Y$$YKV zl+C$l*W65g2p#4G6=Ur=xIbFrN$l!WJWnfFfzGz|7!%rCR=jyBOK~G6m0Q@#{m-#` zT(g}08NBYrmM3F2KFmqWt6+3)^tAC9?PsmL4q9<;l7zOPBHOOa}&%`}Uq# zTnN?b`vT*IV69Hq;iQ(O1l6B;}XC;?t-uwvF3}KsCMQTADG96raydJAm{|s64q?8kq^dEmy%9)~9 z!->0P_HiUw7h}&p3jd=FnN>X&$!YzN3#|<-Rsv(LU5soOhz z(AI=Ti4GVPg~s9sI4~tww`YC<=Rr`!zwcjn$hs;kmaIi5Ly_XbA4&_)IlDIyP%KXK;c@unhcpGygXH|Pv-?hSFSlQBYKToH^3V1;<+4_kthc-kKv&h$84h#ND7xe(Z8u`jX8-^U z7tn_g$fE)E;OLknBEVrCqcefdM3c5qJR8kMk%n?Lk%go>>8@t`adOBaz zsyq^1AC4q&*;wRrzhWU=VH8l9S&!jdg87OmPhStZ_=O7txJz;)>u$O zYF+%UnF7H|vm`&y*&J9j&@wlw1UDxa@}(%A+NU_F1j9eCE||iLb8@g9Wr(P8>?N@K zY(^f~;`qi@zTMu#@}!L1WbhDu0C3ESlk>HC4dvk(#HTVmp&ZM4`R5?DsFvWFh{61? zC>v@mmV-ke3j0dHp0a1hbqjF46njo%xw*xfztf|n%NemWbzadrk7+bUV8e35I)au zH5?I+NEEZUE+qFxf+N{N!EsdF6Jc8$40S7BKdoGCAtypMx%8aKK3u6%Ez%l85Q9FC zv3Ip~&YX6bHSHyqq&u0YvERPhR?LMwxVj$aZD3x)MH4dn+f!Rc)6PuqO^w7bEvPs| zx{}c11E9gabWtSBnYPc(8?J`-57d6~50!9rwl6~V^BWUVk_RUE?D5id1*-Qcj8yK9 zXHD@8&t<;O-F#U!)yqCr1G*-eAR?&ctJ&E8PKr;@x}f>R9^;Xw2f1yLrQR@6z!34s z486%78MS(6?fD;zJ=12@L4X_CI9%4ddf@Y5d^wa`PY{9Zh!hX{(6;67L2l_Ld)abf z$gk?Ypm7FoeKQGW@kRqLVqG)#^4g24_5x!?i_W$E;f8xb$q_z=iOEOgrqP*_0 zP+_uSMY_GZz8&@(k(O$BtW^}|@Y#+r``yva0OQq)-!`5BK9=`O+t3_nCxZ&nYAB6m zc)XgjFqsp2W|&96tdSJ}*LnbGlI9JC*&*1V-D2ID0(%MyaK?O%uE*R!iwiK7EB0p7 zm<(`JYuor-Bvde(D3WFvY0tW^z0}w80q`W|=vA}$9ow$MBcvm@?}BUj9F18zoaKb_ z^RCwJ%n@Dc#4&mub%8*!eRwor;_++aT&yfpSeo`<%YJ_Jz^`q1W{!0UqOcC_E2DN; z>tr(rwQ`tHF3yL_1&x*?FIAb?Of;(OW@uASXqk_9rF)3$b+VJFp#$SLT+z;swd5u} zF)doSSG!qKqB% zSJF|iIyVFOIc?!h38mf8MMi2QCjamE7g8syn<_ z#t_)5j7u%Ecw#eS!tXfU{Z4Bq>a7p)TF*GH zQ?lzY2sdx`C2)m3+Lc>o=IKL4*izX4lZ?29?_hSh;K9m6jcqkXt=iRx(n~L1ewS{c z@Jq?CSR#VnX@7#ub|lTO3{+pbd2j#TuQ?jc?x|1X%TwJpZnZ1IoP;|NZ(;q(zkJ1& zuc3l{kO7NMqKy%^Kfx8`4dyBR#Dk{ZZH}bd;?&Q&vcYI*a)3X|FD&oyb#QhjX7jG1 zxnq0IG#+jmvevCjb)mpgLsRx;Z$GmNno2?H>Fx&xIU-d;K)2ehN*Lpjf-^(IgH3>& zti&rnSeoTP91VPsW_)mPz}zo4Ybi36$2g)?rVO{vqi;liA7|)9YYQk%FxW4vRd&sR zDQr?^@Rux|KW7?F8f=y;(6%m>C7@|T6~>^CFz@glwF4d-Gm4x|pAh@l(JDay+)vO4!gtlmWl>AlcRu&e_ix(HAU-oEv#>iVP79Zl+ciieWW45f zp+`IqK^#nnn5#!_B+-8MH9X!bRVh}?o?Ik?$v$|#PR;WJV8dVY2p$R(X~cZ6PUJ?> zsY*{sfH#>G?&pLVQ0h=Uw3I`kB7f6(3jP3K`)U>83&*nLz@M}Y4LsQe!(6nM}OGqfEiqp>tFB?O`bLQGaW1UmMzJ^MRcd*JDUJRy`N+;3ffd&w2aQ(qr;$eVqytdzi(Y^lBRAPERGY?lD?ZWzsN54l z1kHk}H=R31Wu2FUp?9x}6PRerLvX;*)?v(d4dt6j9rJ5p4LXzUD7vVNx029Ib19qZ7uym#$v3_W$GWbE zu3hBtDx0R0lT)nRA78h`{uDnkR&8T<)5VbI#An8uNJu3=1dfj!@Xvh!h(ob=`b*Ol z{mX12O&t3)ZDq)|$M`rBsKMgl>)Enk-F>&fl1!Z_O@kLx&(6fObG2PmZC0gn9q4b0 zt|}3E!woWP$bhJUYF^Yx1Nh7Ap&Ib6^U=`G@eok z>)~RWH@>4-2$mF16ikoHFp?3<;<(xD(F$_{{8n60^qJG_PMz^WOdjAZ z$z)KY&O#DC09uqLt^AYH3{Trw?e7Pm z%qZ?Dil5SQ=hd>PrYzBZ<;yS3wN9nc9z;AI)2rUJef`?pVW|Fvg=rB+^(WBuL?(S1 zMou!zQ}1(GasVMQ(bg{311a&1%yuR@8q1N;Z znp(dxJB_4TngnP;|MS76Bg2FnSpCbX)8nn#PhZs{U+!zmOU;&AOx~9ydb!|t#S)1i zJgtD=pH zFYylXfFbp7Fb}h*dMgIu3e8`8+XU#4mvg=BlOV}9eD1p#0UE-ry&B1HB4@P+8TlR{ zO7@!JF3}UOW4~HmezPTx^WvVUq%<=v5YpxW^+C`XgGTbv&uT13ty)N0{ts6)0` zg652WMe1B4FBF4A`?1%67p7ss&`AUu?P}X~J3+h^`{my)%Y{7pKc>(zA}c@02f&hB zgJ54#<5I#7sj{0m7NqAWP1M*2@VzGx(G+a**WbkVsGMG%YQ!gB{+e@V^zK)_N|CUK{k*=ke z^@QoSBbFE!&7RR!=)dXwdt7#?zPd}Q(pXV$vdhFqY7gA^OG83A5|BKZ}N` z%!dTn^iwU*ABm&lNP!M@Dsp0=pr=!1)t=TC+kHF8uB@%?@sxbQGR5bXJDTMvXdMX4 z!H?R>zS^%7xmM0jHv0e=?ob63p&_FF6~|55k+L3;2~VotXqVZKeq$nI{zlD^tzZ!@ zui>4N<5|^=4L+$O#?@(t%=+ewEuPYZ^wc~e+vM~~mPYf?dwT2$; z)n8gA+v82`y5EOeCCr^^`8{9a**^b}i#`F<` zu?~Ex)F&DX*w92A{5gyMr+9ffh4nX*2&BGDf)y06ohmu0bZ40}P%{jq4Cy0bfDq3u zF2%&-oF><=<^S-kku0S@TQ%^Y$+Ylg77@}fL?J>*`Itjwb{4DLU-~snYp~}!4cn2;f zG0_Tp;hBaT7+vvcRlMD(7J4<@?FA^F!E)42j`* zHvNMIm+YNNH-?%Ryxy8w<_(qj3pa zE;=pYIj?X%aMe)qOPgmABeqB}HE2TSjUUB2zDtJDmZr6pUM&b5MYJjTOlR#b3cq6N zvuS`PeUKv54q;3e<9Fx@ep>dZHXO^4TX&(-gp?BVL8*y@xawnKh%_m3{v!O zkO{SHV(fmpy~Pgv9dV#1LfMc?e{tnBYlxd+2JqVP-6mWAJ~;*I_izo;C`0C+w7HDu zcg~n>D-cY`li0ELS229MeZN4hm5W$xgCiD0W+;6BV3qdg6aF8OF$~A8vIdo#$L3pHh?o9vH3g z{5217E^`qF%}OP%(W38bu%v0~E7x*`{5+^03!{*aZ@>x_WYQu*gcZkCj898n9S44S zLPx@!WheK~tx=%BTldQT(m-aQqF+Ntf)VBR;~qK0{?WfOz057d!oJZ5f6v-ix{BEE z9RN@{FS~L2N65E*{glc&I$-XwcT*JMErkIf8(9pxi_(Oaa~m^AF|fe|)@yL%B$t-TB+@b9B8- zho{EaR`eZlY2VHqpGmp{yIt=o>)UICbMsN6nc242B|V)mwPVD!gH_ALKRai6dG${I z2YpXXhD?I9QLc4iNi&DYyU}fOZ-W|A+pKl85SFXt!)o#|bH%Tu_ZRoSDoKHkQuRjv zFxY-ApD25Wny-N@i`c--d*pN!If1wY59sOX?ykQJcMBINc0_OXMz8|CxuIKVblJWc z^2q|qda`sk6Y24Z42YO%FYmt@=w2dJJLT$54`W8}sAhp2zQTC%1ZHv@JGi?_ zE1eLtu=FleIr=_LSm`A#hLJ3gg)k4oKh_{ryV3|jE#H|D&Jz6-$1)>&NoJ}!i|bXT zcmdBvNp*c`8c=;W2EvA3hx30|Mo~jNe;$iF47u^?2P`Hr2(KgWR*ER>?EuXKCf+Ir z3B-2vm9p64)r+JoMRlS&xoMvIRaWtlSJ#i4;K~(KO#!GMA%@k{TJgf1^sMSx*O_gq zOtdDSnDcjdYvq^;m}biUZT&zgt@6>=nw_|}mOQ~G#%Ap)VUc(;8y)I_tE($t?19?9 z!#@SEcm50{Y5nB{lySH+C#WZH&>v*)e)EMT54n9$cUp71a6U+_0-H-0yB zLC;SYkJB@2wIyk=oLg*o84~ZH9f)IDDY0}$4P0&3as;un{`_R{`IcRL{o_$WJoYGU zwoSJg@IL@q>PE_mE?DFPIae!!z<)sr+;T~HY?PT5FDKj>B7Kg#defO& z>`+_;1HK-u>fkLmT}>7Jtjiq5gV+=Bvf{!@9QtyF@wY-Hkn!igJAU;EpY<{Oc7eKs z3!s1W-SB{kn*T%KkAl{`5&~(kK&`{%!zipHR+4-7)lUYRB-Qa*VxPFMpx)auoNLcI zPFis8 zW^bW?g2SdhobP{RWRGte@wp^u_hcDp#$si!!c&Y;zDD6YlBM-J7&}%Rac4ZMfn>Nv znw!kidpg%s_A%+K!lEhEtzuU3uTmJaWu3>mAAlOw9rLl#?dyJD!Duv*&aLzK&=3ok zlGi%*YJ86AF<;24&gMq$mCvZJaM~O-cL$2_b*%7C zt>yaW;f5JDS_76bn=5u~p_28S70|$5C!aW>OELYojA-uSF-v0#K%G2tAMOFCD84M( z(Svgh4>Z68?V;t}{KeKV>{36FH%RtP105z0s7MI_V@ZZhV%n=`_TTBZFJcfnj^E>P z8@<-bwMO8x7sT|Y<65;w=+FYK~OD!;=k@921RKwt)_WaS#QJz8?868+8=c*fAJ%9iaMNrQqo^TGG0~d zWpX2YUIi`fxqy1Xrxo%-9^Ekv+MBb{q%$NB6H^%uqy2>VP;!fl-x)gx&1R39z$oPq z;xfXW6h?hMsZtHAr##y$F|_X69WjcF#Os@h)RFRkDh&aR5Y;bbwE(P^#xu@e?~Gl< z`H{Z6X|@beYc77!1VsPkp%6Mr&|rNzOK|-UCcsI5QzAZ6j6i)YKH=mQEu-x07<+-8 z5LLmUgNJYW(4CN(TaSF=dn47m7VP?Jn_c<0NaUeCi}7Q@HiP@N&ws+c{$32a`Wc^e zo@Pw?_V}hF7dkBGzhW5nxX5nQDv(yN{up+Q840G=eNC9M+5Jx|X3zHixh#wJzD$p$ zy)GJITN%iaouVwvOW~EL@C=?7o(LXtwx6#Dz&52aj*g|M76lBmm|lOI$exawXxYIu ztrTXt;9dGtW^IwlJm>S+Ovt4|$@gdb=%sUx;)iyX@c!gW8TUZ<^tjQt`n}n7J?YK))FyfmX-UL<-`q*}PAcJJaK@Nn=)3TW=qJ92Q4K!S z`x!_p$_tw68rfu!c`fe9WGUKnTbm^st`=Mfvc;Xqb9__b7tWvh0L(=_XjW>1!DZuF zQ!H&c=<*Rnwlg}cQa-FKw1ZQ7Bx^@$9APslpQY}U!j?HE`GG#K?s^F`+RS&Ic2{X- z1VRe?js^>a{^8xnb!|MsRdwXW4Kmjlg^`3on&#hx*2GZ$Q2<1%M*ucEgnzbZ)M zMwHcNMvZBy@jd_-RPXp))TUXkD+HR%>p>Xug1?+b^47bTu>%BsQa+QDTYqE*^g@ZY z3{lBRgY&?X8xU~46L6qJytpP)Hh)bYmtFqXBn^aL)6hVJ@-u@Fa z`Cs;J#AD*O`R=g?`r{$+T|8hG)U z%op(}D7KWDcxsfRC};Qs)1tpe?r#CU7Hn6}o=B79c z?-+oAT1D|5dW6@st@X{uY?`j^=|t22`jqKt0ijkyx1jBb{#4&_ zorOz)F8-Tfxs|z1qTnh=@rYH&_SMBO4BnDUVR12Yebo5+5-R=K2r4Mf;b}1+JQwCk z4#j%HmQ1l=f5$qTZv6m64m8K!h?Z`uU^cp2L_{P!KwUXXiSK9WW&skhbd5do;XCBx z8`01qe{>ksCa62^xG&S)_DS9LMuud@l-9C&mtC7feLnyN&Bn7tjBT6qb;DGBmMeB< z!(*!EfJ+t~y}f`**~eNf-G~1`s3G&ga0#!!ylRO?sHu9sm$fGqBPW5dOb)qRYxd0C zpxyS4G;SPUs#4Gyo`={7;WJCq^Di?9U0wOU;IGDWSnv|9m&O8xhj0WLk`=v=VzP`# zI-Me}2>m^TJ^<6^`_cOko4jeGj%KYWGTFUpLkp9;{mqs+ah|RdO_`bsO=gNflK9;A zwl9}dB{nckIY}?IHiXVp0DXewZD{3jlH7EE5_lUe4o=R=lifmvi&dG#pISv&klWap zJnHAtSaX@ooP>$(^7#xx>z0HVl-{J_c|{?CCISVhL*pP)2(P%pjh`FMG<^Sf1^iXQC!KH!aHh=hV> zLKskF#^IYlyG=-Q#Q{?Mr zpD#Goz=u=h_r^47HTd&zemydXW`zsGLM2QjI0q&0Go1F@yjZ8&J8P%g!+;@53 )d@x@=n>pwd* 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

    " Then + If Not Trim(aLine[iLine - 1]) And If iLine < aLine.Max And If GetIndent(aLine[iLine + 1]) >= hMarkupList.iIndent Then + bJustList = False + Endif + aResult.Remove(aResult.Max) + Else + GoSub CLOSE_PARA + aResult.Add(Space$(iCurrentIndent) & "
      ") + Endif + iCurrentIndent = hMarkupList.iIndent + aResult.Add(Space$(iCurrentIndent) & "
    • ") + sLine = Mid$(sLine, 3) + Endif + + Endif + + ' Blockquote again! + + I = iBlockQuote + Do + If Left(sLine) <> ">" Then Break + sCar = Mid$(sLine, 2, 1) + If sCar <> " " And If sCar <> gb.Tab Then Break + Inc I + sLine = LTrim(Mid$(sLine, 3)) + Loop + + If I > iBlockQuote Then + While I > iBlockQuote + aResult.Add("
      ") + Inc iBlockQuote + Wend + Else If I < iBlockQuote Then + While I < iBlockQuote + aResult.Add("
      ") + Dec iBlockQuote + Wend + Endif + + If sLine Begins "==" And If sLine = String$(Len(sLine), "=") Then + sLine = aResult[aResult.Max] + If sLine Not Begins "" Then + sLine = Mid$(sLine, 4) + bInsidePar = False + Endif + GoSub CLOSE_PARA + aResult[aResult.Max] = "

      " & sLine & "

      " + Endif + Continue + Endif + + If sLine Begins "--" And If sLine = String$(Len(sLine), "-") Then + sLine = Trim(aResult[aResult.Max]) + If sLine Then + If sLine Not Begins "" Then + sLine = Mid$(sLine, 4) + bInsidePar = False + Endif + GoSub CLOSE_PARA + aResult[aResult.Max] = "

      " & sLine & "

      " + Endif + Continue + Endif + Endif + + ' Code + + If sLine Begins " " Or If sLine Begins gb.Tab Then + + If Left(sLine) = gb.Tab Then + sLine = Mid$(sLine, 2) + Else + sLine = Mid$(sLine, 5) + Endif + sLine = Html$(sLine) + If Not bCode Then + bCode = True + sLine = "
      " & sLine
      +      Endif
      +      aResult.Add(sLine)
      +      Continue
      +      
      +    Endif
      +    
      +    GoSub CLOSE_CODE
      +  
      +    ' Title
      +    
      +    If Left(sLine) = "#" Then
      +      I = InStr(sLine, " ")
      +      If I <= 7 Then
      +        Dec I
      +        If Left(sLine, I) = String$(I, "#") Then
      +          sLine = Mid$(sLine, I + 2)
      +          While sLine Ends "#"
      +            sLine = Left(sLine, -1)
      +          Wend
      +          sLine = RTrim(sLine)
      +          If Left(sLine) = "[" And If Right(sLine) = "]" Then
      +            sLine = ConvertLine(Mid$(sLine, 2, -1))
      +            $aIndex.Add(String$(I - 1, "  ") & "- [" & sLine & "] (#t" & CStr($aIndex.Count + 1) & ")")
      +            sLine = "" & "" & sLine & ""
      +          Else
      +            sLine = "" & ConvertLine(sLine) & ""
      +          Endif
      +          GoSub CLOSE_PARA
      +          aResult.Add(sLine)
      +          Continue
      +        Endif
      +      Endif
      +    Endif
      +      
      +    If Trim(sLine) Then
      +      If Not bInsidePar And If LTrim(sLine) Not Begins "" & LTrim(sLine)
      +      bInsidePar = True
      +      bAddPar = False
      +    Endif
      +    
      +    aResult.Add(sLine)
      +    
      +  Next
      +  
      +  GoSub CLOSE_CODE
      +  GoSub CLOSE_BLOCKQUOTE
      +  iIndent = 0
      +  GoSub CLOSE_LIST
      +  'If $aMarkup.Count Then Error.Raise("Missing markup: " & $aMarkup[$aMarkup.Max])
      +  
      +  If $aIndex.Count Then
      +    iPos = aResult.Find("@{index}")
      +    If iPos >= 0 Then 
      +      iIndent = GetIndent($aIndex[0])
      +      For I = 1 To $aIndex.Max
      +        iIndent = Min(iIndent, GetIndent($aIndex[I]))
      +      Next
      +      If iIndent Then
      +        For I = 0 To $aIndex.Max
      +          $aIndex[I] = Mid$($aIndex[I], iIndent + 1)
      +        Next
      +      Endif
      +      aResult[iPos] = ConvertMarkup($aIndex)
      +    Endif
      +  Endif
      +  
      +  Return aResult.Join("\n")
      +  
      +CLOSE_CODE:
      +
      +  If bCode Then
      +    aResult.Add("
      ") + bCode = False + Endif + Return + +CLOSE_BLOCKQUOTE: + + While iBlockQuote + aResult.Add("") + Dec iBlockQuote + Wend + Return + +CLOSE_LIST: + + While iIndent < iCurrentIndent + GoSub CLOSE_PARA + GoSub CLOSE_CODE + aResult.Add(Space$(iCurrentIndent) & "
    • ") + bJustList = False + aResult.Add(Space$(aList[aList.Max].iIndent) & "") + aList.Remove(aList.Max) + If aList.Count Then + iCurrentIndent = aList[aList.Max].iIndent + Else + iCurrentIndent = 0 + Endif + Wend + Return + +CLOSE_PARA: + + If bInsidePar Then + aResult[aResult.Max] &= "

      " + 'aResult.Add("") + bInsidePar = False + Else If iLine > 0 And If aResult[aResult.Max] Then + 'aResult.Add("") + Endif + Return + +'Catch + +' Error.Raise("Line " & CStr(iLine + 1) & ": " & Error.Text) + +End + + +Private Sub ConvertLine(sLine As String) As String + + Dim sResult As String + Dim I As Integer + Dim sCar As String + Dim I1, I2 As Integer + Dim sPattern As String + Dim bCode, bCodeExit As Boolean + Dim bEmph As Boolean + Dim bStrong As Boolean + Dim sText, sTitle, sLink As String + +MAIN_LOOP: + + If I >= Len(sLine) Then + If bEmph Then + sResult &= "" + Else If bStrong Then + sResult &= "" + Endif + Return sResult + Endif + + GoSub NEXT_CAR + + If sCar = "\\" Then + If I = Len(sLine) Then + sResult &= "
      " + Else + GoSub NEXT_CAR + sResult &= sCar + Endif + Goto MAIN_LOOP + Endif + + If sCar = "<" Then Goto ENTER_MARKUP + + If $aMarkup.Count = 0 Then + + If sCar = "&" Then Goto ENTER_AMPERSAND + + If sCar = "`" Then Goto ENTER_CODE + + If sCar = "[" Then Goto ENTER_LINK + + Endif + + If sCar = "*" Then Goto ENTER_STAR + + If sCar = ">" Then + sCar = ">" + Endif + + sResult &= sCar + + Goto MAIN_LOOP + +NEXT_CAR: + + Inc I + If I > Len(sLine) Then Error.Raise("Unexpected end of line") + sCar = Mid$(sLine, I, 1) + Return + +LOOK_CAR: + + sCar = Mid$(sLine, I + 1, 1) + Return + +ENTER_MARKUP: + + I1 = I + GoSub NEXT_CAR + + If sCar <> "/" And If Not IsLetter(sCar) Then + sResult &= "<" + Dec I + Goto MAIN_LOOP + Endif + + Repeat + GoSub NEXT_CAR + Until sCar = ">" + sPattern = Mid$(sLine, I1 + 1, I - I1 - 1) + + 'sPattern = LCase(sPattern) + + If Left(sPattern) = "/" Then + If $aMarkup.Count = 0 Or If LCase($aMarkup[$aMarkup.Max]) <> LCase(Mid$(sPattern, 2)) Then + Error.Raise("Mismatched markup: " & sPattern) + Endif + sResult &= "<" & sPattern & ">" + $aMarkup.Remove($aMarkup.Max) + Else + sResult &= "<" & sPattern & ">" + I1 = InStr(sPattern, " ") + If I1 Then sPattern = Left(sPattern, I1 - 1) + $aMarkup.Add(sPattern) + Endif + Goto MAIN_LOOP + +ENTER_AMPERSAND: + + For I1 = I To I + 6 + sCar = Mid$(sLine, I1, 1) + If sCar = ";" Then + sResult &= Mid$(sLine, I, I1 - I + 1) + I = I1 + Goto MAIN_LOOP + Else If sCar = "\n" Then + Break + Endif + Next + sResult &= "&" + Goto MAIN_LOOP + +ENTER_CODE: + + sResult &= "" + I1 = 1 + bCode = False + bCodeExit = False + Do + GoSub NEXT_CAR + If sCar = "`" Then + If Not bCode Then + Inc I1 + Continue + Else + If Mid$(sLine, I, I1) = String$(I1, "`") Then + sResult &= "" + I += I1 - 1 + Break + Endif + Endif + Endif + sResult &= Html(sCar) + bCode = True + Loop + Goto MAIN_LOOP + +ENTER_STAR: + + GoSub LOOK_CAR + If sCar = "*" Then + Inc I + Goto ENTER_STRONG + Endif + + If bEmph Then + sResult &= "" + bEmph = False + Else If Not bStrong Then + sResult &= "" + bEmph = True + Else + sResult &= "*" + Endif + Goto MAIN_LOOP + +ENTER_STRONG: + + If bStrong Then + sResult &= "" + bStrong = False + Else If Not bEmph Then + sResult &= "" + bStrong = True + Else + sResult &= "**" + Endif + Goto MAIN_LOOP + +ENTER_LINK: + + I1 = InStr(sLine, "]", I + 1) + If I1 = 0 Then + I = Len(sLine) + Goto MAIN_LOOP + Else If I1 = (I + 1) Then + sResult &= "[]" + Inc I + Goto MAIN_LOOP + Endif + + sText = Mid$(sLine, I + 1, I1 - I - 1) + I = I1 + I2 = I + Do + GoSub LOOK_CAR + If Not sCar Then Break + Inc I + If Asc(sCar) > 32 Then Break + Loop + If sCar = "(" Then + I1 = InStr(sLine, ")", I + 1) + If I1 > 0 Then + sLink = Mid$(sLine, I + 1, I1 - I - 1) + I = I1 + Endif + Else If sCar = "[" Then + I1 = InStr(sLine, "]", I + 1) + If I1 > 0 Then + sLink = $cLink[Mid$(sLine, I + 1, I1 - I - 1)] + I = I1 + Endif + Else + I = I2 + Endif + + If sLink Then + I1 = InStr(sLink, Chr$(34)) + If I1 And If Right(sLink) = Chr$(34) Then + sTitle = Mid$(sLink, I1 + 1, -1) + sLink = Trim(Left$(sLink, I1 - 1)) + Else + sTitle = "" + sLink = Trim$(sLink) + Endif + sResult &= "" + Endif + + Goto MAIN_LOOP + +End diff --git a/app/src/gambas3/.src/Help/Wiki/URL.class b/app/src/gambas3/.src/Help/Wiki/URL.class new file mode 100644 index 00000000..aef676ea --- /dev/null +++ b/app/src/gambas3/.src/Help/Wiki/URL.class @@ -0,0 +1,103 @@ +' Gambas class file + +Static Public Sub Encode(Path As String) As String + + Dim iInd As Integer + Dim sRes As String + Dim sCar As String + + For iInd = 1 To Len(Path) + sCar = Mid$(Path, iInd, 1) + If sCar = " " Then + sCar = "+" + Else If IsLetter(sCar) Or If IsDigit(sCar) Or If InStr("-._~,$!/[]", sCar) Then + Else + sCar = "%" & Hex$(Asc(sCar), 2) + Endif + sRes &= sCar + Next + + Return sRes + +End + +Static Public Sub Decode(Path As String) As String + + Dim iInd As Integer + Dim sRes As String + Dim sCar As String + + For iInd = 1 To Len(Path) + sCar = Mid$(Path, iInd, 1) + If sCar = "%" Then + sCar = Chr$(Val("&H" & Mid$(Path, iInd + 1, 2))) + iInd += 2 + Else If sCar = "+" Then + sCar = " " + Endif + sRes &= sCar + Next + + Return sRes + +End + +Static Private Sub HandleQuery(URL As String, bClear As Boolean, Field As String, Value As String) As String + + Dim I, iPos As Integer + Dim sElt As String + Dim aQuery As String[] + + iPos = InStr(URL, "?") + If iPos = 0 Then + If bClear Then + Return URL + Else + Return URL & "?" & Encode(Field) & "=" & Encode(Value) + Endif + Endif + + aQuery = Split(Mid$(URL, iPos + 1), "&") + URL = Left$(URL, iPos - 1) + + Field = Encode(Field) + Value = Encode(Value) + + For I = 0 To aQuery.Max + sElt = aQuery[I] + If sElt = Field Or If sElt Begins Field & "=" Then + aQuery.Remove(I) + Break + Endif + Next + + If Not bClear Then + If Value Then + aQuery.Add(Field & "=" & Value) + Else + aQuery.Add(Field) + Endif + Endif + + If aQuery.Count Then + Return URL & "?" & aQuery.Join("&") + Else + Return URL + Endif + +End + + +Static Public Sub SetQuery(URL As String, Field As String, Optional Value As String) As String + + Return HandleQuery(URL, False, Field, Value) + +End + +Static Public Sub UnsetQuery(URL As String, Field As String) As String + + Return HandleQuery(URL, True, Field, "") + +End + + diff --git a/app/src/gambas3/.src/Help/Wiki/Wiki.module b/app/src/gambas3/.src/Help/Wiki/Wiki.module new file mode 100644 index 00000000..f82c1029 --- /dev/null +++ b/app/src/gambas3/.src/Help/Wiki/Wiki.module @@ -0,0 +1,919 @@ +' Gambas module file + +Public Const DEFAULT_LANG As String = "en" + +Public Languages As String[] = [DEFAULT_LANG, "fr", "de", "es", "it", "nl", "pl", "pt", "pt_BR", "mk", "sq", "ca", + "hu", "cs", "tr", "ar", "fa", "id", "vi", "ko", "ja", "ru", "zh", "zh_TW", "eo"] + +Public SystemLanguages As String[] = ["C", "fr_FR.UTF-8", "de_DE.UTF-8", "es_ES.UTF-8", "it_IT.UTF-8", "nl_NL.UTF-8", "pl_PL.UTF-8", "pt_PT.UTF-8", "pt_BR.UTF-8", "mk_MK.UTF-8", "sq_AL.UTF-8", "ca_ES.UTF-8", + "hu_HU.UTF-8", "cs_CZ.UTF-8", "tr_TR.UTF-8", "ar_AE.UTF-8", "fa_IR.UTF-8", "id_ID.UTF-8", "vi_VN.UTF-8", "ko_KR.UTF-8", "ja_JP.UTF-8", "ru_RU.UTF-8", "zh_CN.UTF-8", "zh_TW.UTF-8", "eo.UTF-8"] + + +Public WikiRoot As String = "wiki://" +Public Root As String +Public InfoDir As String +Public Lang As String +Public Path As String +Public Exist As Boolean +Public Edit As Boolean +Public (Image) As Boolean +Public LinkSuffix As String +Public History As Integer +Public UserName As String + +Public (Component) As String +Public (Class) As String +Public Symbol As String + +Public Documentation As New CDocumentation("wiki") + +Private Sub AddLinkSuffix(sReq As String) + + If LinkSuffix Then + LinkSuffix &= "&" + Else + LinkSuffix = "?" + Endif + LinkSuffix &= sReq + +End + +Public Sub SetLanguage(sLang As String) + + Dim iLang As Integer + + Lang = sLang + + If Not Lang Then Lang = DEFAULT_LANG + + iLang = Languages.Find(Lang) + If iLang >= 0 Then + System.Language = SystemLanguages[iLang] + Else + Lang = DEFAULT_LANG + Endif + + If Lang <> DEFAULT_LANG Then AddLinkSuffix("l=" & sLang) + +End + +Public Sub GetPagePath(Optional bSuffix As Boolean) As String + + Dim sPath As String + + sPath = Root &/ "data" &/ Lang &/ Path &/ "~page" + If bSuffix Then sPath &= "." & Format(Now, "yyyymmddhhnnssuu") & "." & UserName + Return sPath + +End + +Public Sub GetPagePathFrom(sPath As String, Optional sLang As String) As String + + If Not sLang Then sLang = Lang + Return Root &/ "data" &/ sLang &/ sPath &/ "~page" + +End + + +Public Sub MakeDir(sDir As String) + + Dim sPath As String + Dim sElt As String + + For Each sElt In Split(sDir, "/") + sPath &/= sElt + 'Shell "echo MKDIR: " & Shell$(sPath) & " >> /tmp/session.log" Wait + Try Mkdir "/" & sPath + Next + + 'If Not Exist(sDir) Or If Not IsDir(sDir) Then Return True + +End + +' Public Sub Main() +' +' Dim sMsg As String +' Dim aPage As String[] +' Dim sDir As String +' Dim aPath As String[] +' Dim sLang As String +' Dim hUser As CUser +' Dim sData As String +' Dim sPath As String +' +' 'CGI["SCRIPT_NAME"] = "/wiki" ' Fix web server bug +' Root = User.Home &/ "wiki/gambas" +' InfoDir = User.Home &/ "wiki/info" +' If Not Exist(InfoDir) Then InfoDir = "" +' +' ' The url path is directly converted to a relative directory path inside the "data" directory located in the root directory. +' ' The page contents is stored inside a "~page" file located in that directory. +' ' Consequently, no "~" character is allowed in the url path. +' ' Each page modification is archived in a "~page.." file, allowing changes to be undone. +' +' Path = "" 'Request.Path +' If Right(Path) = "/" Then Path = Left(Path, -1) +' +' ' Handle resource files: images, style sheet... +' +' If File.Name(Path) = "style.css" Then +' Response.ContentType = "text/css" +' Response.Begin +' Print Replace(File.Load(".public/style.css"), "<%/%>", Application.Root); +' Response.End +' Return +' Else If Path And If Exist(".public" &/ Path) Then +' Response.SendFile(".public" &/ Path) +' Return +' Endif +' +' If Path = "/~register" Then +' If Request.Exist("cancel") Then +' Response.Redirect(Application.Root) +' Return +' Else If Request.Exist("confirm") Then +' If RegisterUser() Then Return +' Endif +' Register.Render +' If Session.Id And If Session["login"] = "" Then Session.Abandon +' Return +' Endif +' +' If Path = "/~confirm" Then +' Confirm.Render +' Return +' Endif +' +' If Path = "/~stat" Then +' HttpStat.Render +' Return +' Endif +' +' ' Reject pages whose url includes a "~" character. +' +' If InStr(Path, "~") Then +' Response.Status = "404 Not Found" +' Response.Begin +' Print "

      404 Not Found

      " +' Response.End +' Return +' Endif +' +' If Request.Exist("lang") Then +' sLang = Request["lang"] +' If sLang = DEFAULT_LANG Then sLang = "" +' If sLang <> Request["l"] Then +' If sLang Then +' Redirect("l=" & sLang) +' Else +' Redirect +' Endif +' Endif +' Endif +' +' SetLanguage(Request["l"]) +' If Request.Exist("v") Then AddLinkSuffix("v") +' If Request.Exist("nh") Then AddLinkSuffix("nh") +' If Request.Exist("w") Then AddLinkSuffix("w") +' +' If Request.Exist("logout") Then +' +' Session.Abandon +' +' Else If Request.Exist("register") Then +' +' Response.Redirect(Application.Root &/ "~register") +' Return +' +' Else If Request["login"] And If Request["password"] Then +' +' Session.Abandon +' +' For Each hUser In CUser.Load() +' If hUser.Login = Request["login"] And If hUser.Password = Request["password"] And If Not hUser.Confirm Then +' Session["login"] = hUser.Login +' Break +' Endif +' Next +' +' Endif +' +' UserName = Session["login"] +' {Exist} = Wiki.ExistPage(Path) +' Image = IsImage(Path) +' Try History = CInt(Request["h"]) +' +' ' Analyze component path +' If Path Begins "/comp/gb" Then +' +' CComponent.Init +' aPath = Split(Path, "/", "", True) +' Component = aPath[1] +' If aPath.Count >= 3 Then {Class} = aPath[2] +' If aPath.Count >= 4 Then +' Symbol = aPath[3] +' If Left(Symbol) = "." Then Symbol = ":" & Mid$(Symbol, 2) +' Endif +' +' Endif +' +' If Session.Id Then +' +' If Request.Exist("save") Then +' +' If Request.Exist("page") Then +' MakeDir(File.Dir(GetPagePath())) +' LockPage +' sData = Replace(Request["page"], "\r", "") +' sPath = GetPagePath() +' If Not Exist(sPath) Or If sData <> File.Load(sPath) Then +' File.Save(sPath, sData) +' Copy sPath To GetPagePath(True) +' Wiki.Log(Wiki.Path & " (" & Wiki.Lang & ")") +' Endif +' Redirect +' Return +' Else If Request.Exist("file") And If Image Then +' sPath = GetPagePath() +' MakeDir(File.Dir(sPath)) +' LockPage +' Try Kill sPath +' Copy Request.Files["file"] To sPath +' Copy sPath To GetPagePath(True) +' Wiki.Log(Wiki.Path & " (" & Wiki.Lang & ")") +' Redirect +' Return +' Endif +' +' Else If Request.Exist("delete") Then +' +' If {Exist} Then +' sPath = GetPagePath() +' LockPage +' File.Save(sPath, "") +' Copy sPath To GetPagePath(True) +' Wiki.Log("Delete " & Wiki.Path & " (" & Wiki.Lang & ")") +' Endif +' Redirect +' Return +' +' Else If Request.Exist("undo") Then +' +' sPath = GetPagePath() +' sDir = File.Dir(sPath) +' aPage = Dir(sDir, "~page.*").Sort(gb.Descent) +' If aPage.Count >= 2 Then +' LockPage +' Try Kill sDir &/ aPage[0] +' Try Kill sPath +' Try Copy sDir &/ aPage[1] To sPath +' Wiki.Log("Undo " & Wiki.Path & " (" & Wiki.Lang & ")") +' Endif +' Redirect +' Return +' +' Else If Request.Exist("create") Or If Request.Exist("edit") Then +' +' Edit = True +' +' Else If Request.Exist("historic") Then +' +' Redirect("h=1") +' +' Else If Request.Exist("prev") Then +' +' History = Max(0, History + 1) +' Redirect("h=" & CInt(History)) +' +' Else If Request.Exist("next") Then +' +' History = Max(0, History - 1) +' If History Then +' Redirect("h=" & CInt(History)) +' Else +' Redirect +' Endif +' +' Else If Request.Exist("exit") Then +' +' Redirect() +' +' Endif +' +' Endif +' +' If Image Then +' If Not Session.Id Or If Request.Exist("v") Then +' Response.SendFile(GetPagePath(), GetContentTypeFrom(Path)) +' Return +' Endif +' Endif +' +' Wiki.Render +' CComponent.Exit +' +' Catch +' +' sMsg = Error.Where & ": " & Error.Text & "\n" & Error.Backtrace.Join("\n") +' Response.Begin +' Response.ContentType = "text/plain;charset=utf-8" +' Print "
      "; sMsg; "
      " +' Response.End +' +' End + +Public Sub SolvePath(sPath As String) As String + + Dim sData As String + + Do + + If Not Wiki.ExistPage(sPath) Then Return sPath + + sData = File.Load(Wiki.GetPagePathFrom(sPath)) + If sData Begins "-->" Then + sPath = MakeAbsolute(Trim$(Mid$(sData, 4)), sPath) + Else + Return sPath + Endif + + Loop + +End + + +Public Sub GetPageTitle(sPath As String) As String + + Dim sFile As String + Dim iPos As Integer + Dim bComp As Boolean + Dim sRealPath As String + + sPath = SolvePath(sPath) + bComp = sPath Begins "/comp/" + + If bComp Then + If sPath Like "/comp/*/*/?*" Then Return GetSymbolTitle(sPath) + If sPath Like "/comp/*/?*" Then Return GetClassTitle(sPath) + Endif + + sRealPath = Root &/ "data" &/ Lang &/ sPath &/ "~page" + If Not Exist(sRealPath) Then sRealPath = Root &/ "data" &/ DEFAULT_LANG &/ sPath &/ "~page" + If Not Exist(sRealPath) Then Return + + sFile = LTrim(File.Load(sRealPath)) + + If sFile Begins "# " Then + iPos = InStr(sFile, "\n") + If iPos = 0 Then iPos = Len(sFile) + 1 + sFile = Trim(Mid$(sFile, 3, iPos - 3)) + If Not bComp Then sFile = String.UCaseFirst(sFile) + Return sFile + Endif + +End + +Public Sub IsImage(sPath As String) As Boolean + + Dim sExt As String + + sExt = File.Ext(sPath) + Return ["png", "jpg", "jpeg", "gif"].Exist(sExt) + +End + +' Private Sub GetContentTypeFrom(sPath As String) As String +' +' Select Case Lower(File.Ext(sPath)) +' Case "css" +' Return "text/css" +' Case "jpg", "jpeg", "jpe", "thumb" +' Return "image/jpeg" +' Case "png" +' Return "image/png" +' Case "gif" +' Return "image/gif" +' Case "tiff", "tif" +' Return "image/tiff" +' Case "odt" +' Return "application/vnd.oasis.opendocument.text" +' Case "doc" +' Return "application/msword" +' Case "ods" +' Return "application/vnd.oasis.opendocument.spreadsheet" +' Case "xls" +' Return "application/msexcel" +' Case "pdf" +' Return "application/pdf" +' Case "zip" +' Return "application/zip" +' Case "html", "htm" +' Return "text/html" +' Case "txt" +' Return "text/plain" +' Case "avi" +' Return "video/x-msvideo" +' Case "mpg", "mpeg" +' Return "video/mpeg" +' Case "ps" +' Return "application/postscript" +' Case "dwg" +' Return "application/acad" +' Case "wav" +' Return "audio/x-wav" +' Case "ogg" +' Return "application/ogg" +' Case "jar" +' Return "application/x-jar" +' 'Case "xml", "kml" +' ' Return "text/plain" +' Case Else +' Return "application/octet-stream" +' End Select +' +' End + +Public Sub ExistPage(sPath As String, Optional sLang As String) As Boolean + + Dim iSize As Long + + Try iSize = Stat(GetPagePathFrom(sPath, sLang)).Size + Return iSize > 0 + +End + + +Public Function GetSymbolLink(hClass As CClassInfo, sSym As String, Optional sMyTitle As String, Optional sMyStaticTitle As String) As String + + Dim hSym As CSymbolInfo + Dim sRes As String + Dim sComp As String + Dim sPath As String + + hSym = hClass.Symbols[sSym] + If Not hSym Then Return + + ' If $cCompRedirect Then + ' sComp = hSym.Component + ' While $cCompRedirect.Exist(sComp) + ' sComp = $cCompRedirect[sComp] + ' Wend + ' Endif + If Not sComp Then sComp = hSym.Component + + If hSym.IsStatic And If sMyStaticTitle Then sMyTitle = sMyStaticTitle + + 'sPath = GetSymbolPath(hSym) + sPath = "/comp" &/ LCase(sComp &/ hSym.Class &/ Replace(hSym.Name, ":", ".")) + If sMyTitle Then + sRes &= "[" & sMyTitle & "] (" & sPath & ")" + Else + sRes &= "[" & sPath & "]" + Endif + + 'If hSym.IsStatic() Then sRes &= "**" + + Return sRes + +End + +Public Function GetClassLinkFromName(sClass As String) As String + + Dim sComp As String = Wiki.Component + + If IsNull(Documentation.Get(sComp)[sClass]) Then + sComp = Documentation.Classes[sClass].Component + Endif + + Return "
      " & Html(sClass) & "" + +Catch + + Return sClass + +End + +Public Sub GetStat() As String[] + + Dim nClass As Integer + Dim nSym As Integer + Dim sFile As String + Dim aFile As String[] + Dim iCpt As Integer + Dim sLine As String + Dim aIgnore As String[] + Dim sDir As String + + sDir = Wiki.InfoDir + + aIgnore = ["gb.gui.info", "gb.gtk.info", "gb.gtk3.info", "gb.gui.opengl.info", "gb.gtk.opengl.info", "gb.gui.base", "gb.geom"] + + For Each sFile In Dir(sDir, "*.info") + If aIgnore.Find(sFile) >= 0 Then Continue + aFile = Split(File.Load(sDir &/ sFile), "\n", "", True) + iCpt = 0 + For Each sLine In aFile + If Left(sLine) = "#" Then Inc iCpt + Next + nClass += iCpt + nSym += (aFile.Count - iCpt * 3) / 4 + Next + + Return [Subst(("There are &1 classes and &2 symbols in all Gambas components."), nClass, nSym)] + +Catch + + Return ["`" & Error.Where & ": " & Error.Text & "`"] + +End + +Public Sub GetClassTitle(Optional sPath As String) As String + + Dim hClass As CClassInfo + Dim sComponent As String + Dim sClass As String + Dim aPath As String[] + Dim hComp As CComponent + + If Not sPath Then + sComponent = Wiki.Component + sClass = Wiki.Class + Else + aPath = Split(sPath, "/", "", True) + sComponent = aPath[1] + sClass = aPath[2] + Endif + + Try hComp = Documentation.Get(sComponent) + Try hClass = hComp[sClass] + + If hClass Then + If sPath Then Return hClass.Name + Return hClass.Name & " (" & sComponent & ")" + Else + If sPath Then Return sClass + Return sClass & " (" & sComponent & ")" + Endif + +End + + +Public Sub GetSymbolTitle(Optional sPath As String) As String + + Dim hSym As CSymbolInfo + Dim sTitle As String + Dim sComponent As String + Dim sClass As String + Dim sSymbol As String + Dim aPath As String[] + + If Not sPath Then + sComponent = Wiki.Component + sClass = Wiki.Class + sSymbol = Wiki.Symbol + Else + aPath = Split(sPath, "/", "", True) + sComponent = aPath[1] + sClass = aPath[2] + sSymbol = aPath[3] + If Left(sSymbol) = "." Then sSymbol = ":" & Mid$(sSymbol, 2) + Endif + + Try hSym = Documentation.Get(sComponent)[sClass].Symbols[sSymbol] + + If sPath Then + If Not hSym Then Return sSymbol & " ?" + If InStr("e:", hSym.Kind) Then + Return Mid$(hSym.Name, 2) + Else + Return hSym.Name + Endif + Endif + + If Not hSym Then Return sClass & "." & sSymbol & " (" & sComponent & ")?" + + Select Case Wiki.Symbol + Case "_new" + sTitle = "New " & hSym.Class + Case "_put" + sTitle = hSym.Class & "[] = ..." + Case "_get" + sTitle = hSym.Class & "[]" + Case "_call" + sTitle = hSym.Class & "()" + Case "_next" + sTitle = "For Each " & hSym.Class + Default + If InStr(":e", hSym.Kind) Then + sTitle = "Event " & hSym.Class & "." & Mid$(hSym.Name, 2) + Else + sTitle = hSym.Class & "." & hSym.Name + Endif + End Select + + Return sTitle & " (" & hSym.Component & ")" + +End + +Public Sub MakeAbsolute(sPath As String, sRoot As String) As String + + sPath = Trim(sPath) + + ' Fix incorrect symbolic links + If sPath Begins "comp/gb" Then Return "/" &/ sPath + + If sPath Begins "/" Then Return sPath + + If sPath Begins "./" Then + If Not sRoot Then sRoot = "/" + Return sRoot &/ Mid$(sPath, 3) + Endif + + While sPath Begins "../" + + sRoot = File.Dir(sRoot) + sPath = Mid(sPath, 4) + + Wend + + If Not sRoot Then sRoot = "/" + Return sRoot &/ sPath + +End + +' Public Sub GetToDo() As String[] +' +' Dim hComp As CComponent +' Dim hClass As CClassInfo +' Dim hSymbol As CSymbolInfo +' Dim bPrintComponent As Boolean +' Dim bPrintClass As Boolean +' Dim sClass As String +' Dim sComp As String +' Dim sName As String +' Dim iCpt As Integer +' Dim aIgnore As String[] = ["gb.gui", "gb.gtk", "gb.gtk.opengl", "gb.gtk3", "gb.gtk3.opengl", "gb.gui.opengl", "gb.gui.base", "gb.qt5", "gb.qt5.opengl", "gb.qt5.webkit"] +' Dim aAllow As String[] = ["_new", "_put", "_get", "_call", "_next"] +' Dim sPath As String +' Dim aResult As New String[] +' +' $hDoc.Reset +' +' For Each sComp In +' +' hComp = CComponent.Get(sComp) +' hComp.Load +' bPrintComponent = True +' +' For Each sClass In hComp.ClassList +' +' If sClass = "." Then Continue +' If InStr(sClass, "*") Then Continue +' +' hClass = hComp[sClass] +' +' bPrintClass = True +' +' 'If $cCompRedirect And If $cCompRedirect.Exist(sComp) Then Continue +' If aIgnore.Find(sComp) >= 0 Then Continue +' +' For Each hSymbol In hClass.Symbols +' +' If hSymbol.Class <> hClass.Name Or If hSymbol.Component <> hClass.Component Then Continue +' +' sName = hSymbol.Name +' +' If hSymbol.Kind = "C" Then +' +' If Left(sName) = "_" Then Continue +' +' Else +' +' If LCase(sName) = "_free" Then Continue +' If LCase(sName) = "_new" Then +' If Not hClass.Creatable Or If hClass.IsVirtual() Then Continue +' Endif +' +' If InStr(sName, "_") Then +' If Left(sName) <> "_" Or If aAllow.Find(sName) < 0 Then Continue +' Endif +' +' Endif +' +' sPath = "/comp" &/ LCase(sComp &/ hSymbol.Class &/ Replace(hSymbol.Name, ":", ".")) +' If Not ExistPage(sPath) Then +' +' If bPrintComponent Then +' aResult.Add("## [" & sComp & "] (/comp" &/ sComp & ")") +' bPrintComponent = False +' Endif +' If bPrintClass Then +' aResult.Add("* **[" & hClass.Name & "] (/comp" &/ sComp &/ LCase(hClass.Name) & ")**") +' bPrintClass = False +' Endif +' aResult.Add(" * [" & sPath & "]") +' Inc iCpt +' Endif +' Next +' Next +' +' Next +' +' aResult.Insert([Subst("There are &1 symbols to document yet.", CStr(iCpt)), ""], 0) +' Return aResult +' +' End + +' Private Sub MakeLink(sLink As String, sLang As String) As String +' +' If Not sLang Then sLang = "en" +' If Not sLink Then sLink = "/" +' Return "[" & sLink & " (" & sLang & ")] (" & sLink & "?l=" & sLang & ")" +' +' End + +' Public Sub Log(sText As String, Optional sUser As String) +' +' Dim sLog As String = Wiki.Root &/ "wiki.log" +' Dim hFile As File +' +' If Exist(sLog) And If Stat(sLog).Size > 50000000 Then +' Try Kill sLog & ".old" +' Try Move sLog To sLog & ".old" +' Try Kill sLog +' Endif +' +' If Not sUser Then sUser = UserName +' sUser = Left(sUser, 24) +' sUser &= Space$(24 - Len(sUser)) +' +' Try hFile = Open sLog For Append +' If hFile Then +' For Each sText In Split(sText, "\n") +' Print #hFile, Format(Now, "mm\\/dd\\/yyyy hh\\:nn\\:ss"); " | "; sUser; " | "; sText +' Next +' Close #hFile +' Endif +' +' End + +Public Sub PrintTitle() + + If Wiki.Path Then + Print Html(Wiki.Path); + Else + Print "/"; + Endif + +End + +Public Sub PrintLink() + + Dim aPath As String[] + Dim sElt As String + Dim sPath As String + + aPath = Split(Wiki.Path, "/", "", True) + For Each sElt In aPath + sPath &= "/" & sElt + Print ""; "/"; sElt; ""; + Next + +End + +Public Sub PrintPage() + + Dim sPath As String + Dim sData As String + Dim iPos As Integer + + If Wiki.Image Then + Print ""; + Return + Endif + + sPath = Wiki.SolvePath(Wiki.Path) + + If Not Wiki.ExistPage(sPath) Then + If Wiki.Lang = Wiki.DEFAULT_LANG Then + Print "
      "; ("This page does not exist."); "
      " + Else + Print "
      "; ("This page does not exist in that language."); "
      " + Endif + If Not Wiki.ExistPage(sPath, Wiki.DEFAULT_LANG) Then Return + Wiki.Lang = Wiki.DEFAULT_LANG + Endif + + ' If Wiki.Lang <> Wiki.DEFAULT_LANG Then + ' hStat = Stat(Wiki.GetPagePathFrom(Wiki.Path)) + ' hStatDef = Stat(Wiki.GetPagePathFrom(Wiki.Path, Wiki.DEFAULT_LANG)) + ' If hStat And If hStatDef And If hStatDef.LastModified > hStat.LastModified Then + ' Print "" + ' Endif + ' Endif + + If Wiki.Component Then + If Not Documentation.Exist(Wiki.Component) Or If Not Documentation[Wiki.Component].Loaded Then Documentation.Reset + Endif + + sData = LTrim(File.Load(Wiki.GetPagePathFrom(sPath))) + If Wiki.Class Then + If sData Begins "# " Then + iPos = InStr(sData, "\n") + If iPos = 0 Then iPos = Len(sData) + sData = Mid$(sData, iPos + 1) + Endif + 'sData = "# " & Html(Wiki.GetSymbolTitle()) & "\n" & sData + If Wiki.Symbol Then + sData = "# " & Wiki.GetSymbolTitle() & "\n" & sData + Else + sData = "# " & Wiki.GetClassTitle() & "\n" & sData + Endif + Endif + + Print WikiMarkdown.ToHTML(sData) + +Catch + + Print "
      "; Html(Error.Text); " at line #"; WikiMarkdown.Line + 1; ":\n\n"; Html(WikiMarkdown.Current); "\n\nStack backtrace:\n\n"; Error.Backtrace.Join("\n"); "
      "; + +End + +Public Sub PrintParent() As String + + Print Html("wiki://" & Wiki.LinkSuffix); + +End + +Public Sub PrintLang() + + ' Dim sLang As String + ' + ' Print "" + +End + + +Public Sub AnalyzePath() + + Dim aPath As String[] + + Component = "" + Symbol = "" + {Class} = "" + + If Path Begins "/comp/gb" Then + + aPath = Split(Path, "/", "", True) + Component = aPath[1] + If aPath.Count >= 3 Then {Class} = aPath[2] + If aPath.Count >= 4 Then + Symbol = aPath[3] + If Left(Symbol) = "." Then Symbol = ":" & Mid$(Symbol, 2) + Endif + + Endif + +End + +Public Sub GetDefaultPage() As String + + Dim hSymbol As CSymbolInfo + Dim sSign As String + Dim iPos As Integer + Dim sResult As String + Dim iPos2 As Integer + + Try hSymbol = Documentation.Get(Wiki.Component)[Wiki.Class].Symbols[Wiki.Symbol] + If Not hSymbol Then Return + + If hSymbol.Help Then Return hSymbol.Help + + sResult = "\n" + sSign = hSymbol.Signature + Do + + iPos = InStr(sSign, "(", iPos + 1) + If iPos = 0 Then Break + iPos2 = InStr(sSign, ")", iPos + 1) + If iPos2 = 0 Then Break + + sResult &= "- ~" & Mid$(sSign, iPos + 1, iPos2 - iPos - 1) & "~\n" + iPos = iPos2 + + Loop + + 'If hSymbol.Help Then sResult = Trim(sResult) & "\n" & hSymbol.Help + + Return sResult + +End + diff --git a/app/src/gambas3/.src/Help/Wiki/WikiMarkdown.class b/app/src/gambas3/.src/Help/Wiki/WikiMarkdown.class new file mode 100644 index 00000000..d1728abb --- /dev/null +++ b/app/src/gambas3/.src/Help/Wiki/WikiMarkdown.class @@ -0,0 +1,260 @@ +' Gambas class file + +Inherits Markdown + +Public Sub Link(hLink As MarkdownLink) + + Dim sPath As String + Dim sLink As String = hLink.Link + Dim iPos As Integer + + If sLink Begins "/" Then + sPath = sLink + Else If sLink Begins "./" Then + sPath = Wiki.Path &/ Mid$(sLink, 3) + Else If sLink Begins "../" Then + sPath = Wiki.MakeAbsolute(sLink, Wiki.Path) + Else If Not sLink Then + + sLink = hLink.Text + iPos = InStr(sLink, ".") + If iPos Then + hLink.Text = "" + sPath = "/comp/gb" &/ Trim(Left$(sLink, iPos - 1)) &/ Trim(Mid$(sLink, iPos + 1)) + Endif + + Else + + If sLink Like "*://*" Then hLink.Blank = True + + Endif + + If Not sPath Then Return + + hLink.Query = Mid$(Wiki.LinkSuffix, 2) + + If Not hLink.Text Or If hLink.Text = hLink.Link Then + + If Wiki.IsImage(sPath) Then + hLink.Html = "" + Return + Endif + + hLink.Text = Wiki.GetPageTitle(sPath) + + Endif + + hLink.Link = Wiki.WikiRoot &/ sPath + +End + +Private Sub MakeError(sMsg As String) As String[] + + Return ["*" & Html(sMsg) & "*"] + +End + +Public Sub Command(sCommand As String) As String[] + + Dim aArg As String[] + Dim sDir As String + Dim aResult As String[] + Dim iPos As Integer + Dim sPath As String + Dim sLetter, sLast As String + Dim aDir As String[] + Dim hComp As CComponent + Dim hClass As CClassInfo + Dim hSym As CSymbolInfo + Dim sTitle As String + Dim sClass As String + Dim iStart As Integer + Dim I, J, K, N, NC As Integer + + aArg = Split(sCommand, " ", Chr$(34)) + sCommand = aArg[0] + + If sCommand = "index" Then + + If aArg.Count > 1 Then + + sDir = File.Dir(Wiki.GetPagePathFrom(aArg[1])) + aResult = New String[] + aDir = New String[] + + NC = 2 + For I = 1 To aArg.Max + If aArg[I] Begins "col=" Then + Try NC = CInt(Mid$(aArg[I], 5)) + Endif + Next + + If IsDir(sDir) Then + + For Each sDir In Dir(sDir, "*", gb.Directory) + sPath = "/" &/ aArg[1] &/ sDir + If Not Wiki.ExistPage(sPath) Then Continue + sTitle = Wiki.GetPageTitle(sPath) + If aArg.Count > 2 And If Comp(Left(sTitle, Len(aArg[2])), aArg[2], gb.Language + gb.IgnoreCase) = 0 Then sTitle = LTrim(Mid$(sTitle, Len(aArg[2]) + 1)) + + Do + sLetter = String.Left(sTitle) + If Len(sLetter) > 1 Then Break + If Not IsPunct(sLetter) Then Break + If Not sTitle Then Break + sTitle = String.Mid$(sTitle, 2) + Loop + + If Not sTitle Then sTitle = " " + + aDir.Add(sTitle & "\n[" & sPath & "]") + Next + + If aDir.Count Then + + aResult.Add("") + + aDir.Sort(gb.Natural + gb.IgnoreCase) + + iStart = 0 + For I = 0 To aDir.Max + sLetter = String.UCase(String.Left(aDir[I])) + If sLetter <> sLast Then + If I Then GoSub MAKE_INDEX_LETTER + sLast = sLetter + iStart = I + Endif + Next + GoSub MAKE_INDEX_LETTER + + aResult.Add("
      ") + + Endif + + Endif + + Return aResult + + Endif + + Else If sCommand = "since" Or If sCommand = "only" Then + + Return ["
      " & ("Since") & " " & Html(aArg[1]) & "
      "] + + Else If sCommand = "classes" And If Wiki.Component Then + + hComp = Wiki.Documentation[Wiki.Component] + If hComp Then Return hComp.WikiGetClasses() + + Return MakeError(("This component does not exist.")) + + Else If sCommand = "description" And If Wiki.Component Then + + hComp = Wiki.Documentation[Wiki.Component] + If hComp Then Return hComp.WikiGetDescription() + + Return MakeError(("This component does not exist.")) + + Else If sCommand = "symbols" Then + + If aArg.Count >= 2 And If aArg[1] Then + sClass = aArg[1] + Else + sClass = Wiki.Class + Endif + + If sClass Then + hComp = Wiki.Documentation.Get(Wiki.Component) + If hComp Then + hClass = hComp[sClass] + If hClass Then Return hClass.WikiGetSymbols() + Endif + Endif + + Return MakeError(sClass & ": " & ("This class does not exist.")) + + Else If sCommand = "syntax" And If Wiki.Symbol Then + + hComp = Wiki.Documentation.Get(Wiki.Component) + If hComp Then + hClass = hComp[Wiki.Class] + If hClass Then + hSym = hClass.Symbols[Wiki.Symbol] + If hSym Then Return hSym.WikiGetSyntax() + Endif + Endif + + Return MakeError(("This symbol does not exist.")) + + Else If sCommand = "help" And If Wiki.Symbol Then + + Return Split(Wiki.GetDefaultPage(), "\n") + + Else If sCommand = "stat" Then + + Return Wiki.GetStat() + + Else If sCommand = "todo" Or If sCommand = "changes" Then + + Return ["Unavailable in offline help."] + + Else + + Return ["**COMMAND: `" & sCommand & "`**"] + + Endif + +MAKE_INDEX_LETTER: + + aResult.Add("
      " & sLast & " 
      ") + + N = (I - iStart + NC - 1) \ NC + J = iStart + + For K = 1 To NC + + aResult.Add("") + + For J = J To J + N - 1 + If J >= I Then Break + iPos = InStr(aDir[J], "\n") + aResult.Add(Mid$(aDir[J], iPos + 1) & "\\") + Next + + aResult.Add("") + + Next + + aResult.Add("") + + Return + +End + +Public Sub Enter(sClass As String) As String[] + + If sClass = "syntax" Then Me.EnableCode(False) + +End + +Public Sub Leave(sClass As String) As String[] + + If sClass = "syntax" Then Me.EnableCode(True) + +End + +Public Sub CheckURL(sURL As String, sMarkup As String) As String + + Dim sPath As String + + If sURL Begins "/wiki/" Then + If sMarkup = "img" Then + sPath = Mid$(sURL, 7) + If sPath Ends "?v" Then sPath = Left(sPath, -2) + Return MHelp.GetOfflinePath(sPath) + Endif + Endif + + Return sURL + +End diff --git a/app/src/gambas3/.src/MMime.module b/app/src/gambas3/.src/MMime.module new file mode 100644 index 00000000..1e290d15 --- /dev/null +++ b/app/src/gambas3/.src/MMime.module @@ -0,0 +1,123 @@ +' Gambas module file + +Public Const FORM As String = "text/x-gambas-form" +Public Const CONTROL As String = "text/x-gambas-control" +Public Const FILE As String = "text/x-gambas-file" +Public Const URI As String = "text/uri-list" +Public Const DATA As String = "text/x-gambas-data" +Public Const CLASS As String = "text/x-gambas-class" +Public Const LIST As String = "text/x-gambas-list" +Public Const MENU As String = "text/x-gambas-menu" +Public Const TABLE As String = "text/x-gambas-table" + +Private $cFormat As New Collection + +Public Sub _init() + + $cFormat["text/plain"] = ("Plain text") + $cFormat["text/html"] = ("HTML text") + $cFormat[FORM] = ("Gambas form data") + $cFormat[MENU] = ("Gambas menu data") + $cFormat[FILE] = ("Gambas project file path") + $cFormat[URI] = ("URI list") + +End + +Public Sub GetName(sFormat As String) As String + + Dim sName As String = $cFormat[sFormat] + + If sName Then + Return sName + Else + Return ("Unknown format") & " (" & sFormat & ")" + Endif + +End + +Public Sub UnEscapeURI(URL As String) As String + + Dim iInd As Integer + Dim sRes As String + Dim sCar As String + + For iInd = 1 To Len(URL) + sCar = Mid$(URL, iInd, 1) + If sCar = "%" Then + sCar = Chr$(Val("&H" & Mid$(URL, iInd + 1, 2))) + iInd += 2 + Else If sCar = "+" Then + sCar = " " + Endif + sRes &= sCar + Next + + Return sRes + +End + +Public Sub GetMime(sPath As String) As String + + Select Case Lower(File.Ext(sPath)) + Case "css" + Return "text/css" + Case "jpg", "jpeg", "jpe" + Return "image/jpeg" + Case "png" + Return "image/png" + Case "svg" + Return "image/svg+xml" + Case "svgz" + Return "image/svg+xml-compressed" + Case "gif" + Return "image/gif" + Case "tiff", "tif" + Return "image/tiff" + Case "js" + Return "text/javascript" + Case "odt" + Return "application/vnd.oasis.opendocument.text" + Case "doc" + Return "application/msword" + Case "ods" + Return "application/vnd.oasis.opendocument.spreadsheet" + Case "xls" + Return "application/msexcel" + Case "pdf" + Return "application/pdf" + Case "zip" + Return "application/zip" + Case "html", "htm" + Return "text/html" + Case "txt", "", "am", "in", "sh", "m4" + Return "text/plain" + Case "avi" + Return "video/x-msvideo" + Case "mpg", "mpeg" + Return "video/mpeg" + Case "ps" + Return "application/postscript" + Case "dwg" + Return "application/acad" + Case "wav" + Return "audio/x-wav" + Case "ogg" + Return "application/ogg" + Case "jar" + Return "application/x-jar" + Case "kml" + Return "text/kml" + Case "xml" + Return "text/xml" + 'Case "sfd" + ' Return "application/vnd.font-fontforge-sfd" + 'Case "bdf" + ' Return "application/x-font-bdf" + Case Else + Try Return DesktopMime.FromFile(sPath).Type + End Select + +End + + + diff --git a/app/src/gambas3/.src/MTheme.module b/app/src/gambas3/.src/MTheme.module new file mode 100644 index 00000000..1fcd9e96 --- /dev/null +++ b/app/src/gambas3/.src/MTheme.module @@ -0,0 +1,262 @@ +' Gambas module file + +Public Const DEFAULT_THEME As String = "gambas" + +Public ColorKeys As String[] = ["Background", "Normal", "Keyword", "Constant", "Datatype", "Function", "Operator", "Symbol", "Label", "Number", "String", "Escape", "Comment", "Help", "Preprocessor", "Breakpoint", "Current", "Selection", "Highlight", "CurrentLine", "Error", "Alternate"] +Public ColorNames As String[] = [("Background"), ("Normal text"), ("Keywords"), ("Constants"), ("Data types"), ("Subroutines"), ("Operators"), ("Symbols"), ("Labels"), ("Numbers"), ("Strings"), ("Characters"), ("Comments"), ("Help"), ("Preprocessor"), ("Breakpoints"), ("Current line"), ("Selection"), ("Highlighting"), ("Editing line"), ("Errors"), ("Alternate background")] + +Private $cDefault As Collection + +Public Sub _init() + + $cDefault = ReadFile(DEFAULT_THEME) + +End + +Public Sub IsBackgroundStyle(sKey As String) As Boolean + + Return ["Background", "Selection", "CurrentLine", "Current", "Breakpoint", "Highlight", "Alternate"].Exist(sKey) + +End + +Public Function ReadSettings(hSettings As Settings, sParent As String, Optional bDefault As Boolean) As Collection + + Dim cColor As New Collection + Dim sKey As String + Dim sColor As String + Dim aColor As String[] + + For Each sKey In ColorKeys + If bDefault Then + sColor = hSettings[sParent &/ sKey, $cDefault[sKey]] + Else + sColor = hSettings[sParent &/ sKey] + Endif + cColor[sKey] = sColor + Next + + For Each sKey In ColorKeys + Do + sColor = cColor[sKey] + If Not sColor Then Break + If Left(sColor) = "#" Then Break + aColor = Split(sColor) + aColor[0] = cColor[aColor[0]] + cColor[sKey] = aColor.Join() + Loop + Next + + Return cColor + +End + +Public Sub WriteSettings(hSettings As Settings, sParent As String, cColor As Collection) + + Dim sKey As String + + For Each sKey In ColorKeys + hSettings[sParent &/ sKey] = cColor[sKey] + Next + +End + +Public Function ReadFile(sPath As String) As Collection + + Dim hSettings As Settings + Dim sTemp As String + + If Left(sPath) <> "/" Then + sPath = "theme" &/ sPath + sTemp = Temp$() + Copy sPath To sTemp + sPath = sTemp + Endif + + hSettings = New Settings(sPath) + If sTemp Then Kill sTemp + + Return ReadSettings(hSettings, "Theme") + +End + +Public Sub WriteFile(sPath As String, cColor As Collection) + + Dim hSettings As Settings + + hSettings = New Settings(sPath) + WriteSettings(hSettings, "Theme", cColor) + hSettings.Save + +End + +Public Sub Copy(cColor As Collection) As Collection + + Dim cNew As New Collection + Dim sValue As String + + For Each sValue In cColor + cNew[cColor.Key] = sValue + Next + + Return cNew + +End + +Public Sub InvertColor(iCol As Integer, sKey As String) As Integer + + ' Dim R, G, B As Integer + ' Dim Y, U, V As Float + ' + ' With Color[iCol] + ' R = .Red + ' G = .Green + ' B = .Blue + ' End With + ' + ' Y = 0.299 * R + 0.587 * G + 0.114 * B + ' U = 0.436 * (B - Y) / (1 - 0.114) + ' V = 0.615 * (R - Y) / (1 - 0.299) + ' + ' R = Y + 1.14 * V + ' G = Y - 0.395 * U - 0.581 * V + ' B = Y + 2.033 * U + ' + ' Return Color.RGB(R, G, B) + + Dim H, S, V, L As Integer + + With Color[iCol] + H = .Hue + S = .Saturation + V = .Value + L = .Luminance + End With + + If sKey = "CurrentLine" Then + If V > 128 Then + V *= 0.5 + S = 255 - (255 - S) / 2 + Endif + Else If S < 32 Or If sKey = "Background" Then + V = 255 - V + Else If IsBackgroundStyle(sKey) Then + V *= 0.75 + Endif + + Return Color.HSV(H, S, V) + +End + +Public Sub InitEditor(hEditor As TextEditor, Optional bDesaturate As Boolean) + + Dim iInd As Integer + Dim hStyle As New CStyle + Dim iStyle As Integer + Dim iCol As Integer + Dim iBg As Integer + Dim bInvert As Boolean + Dim sKey As String + + If Application.DarkTheme Then bInvert = Settings["/Editor/InvertTheme", True] + + For iInd = 0 To ColorKeys.Max + + sKey = ColorKeys[iInd] + + hStyle.FromString(Settings["Highlight" &/ sKey, $cDefault[sKey]]) + iStyle = Object.GetProperty(Classes["Highlight"], sKey) + With hEditor.Styles[iStyle] + iCol = hStyle.Foreground + + If iInd = 0 Then + iBg = iCol + If Color[iBg].Value < 128 Then bInvert = False + Endif + + If bInvert Then iCol = InvertColor(iCol, sKey) + + If bDesaturate Then iCol = Color.Desaturate(iCol) + + .Color = iCol + .Bold = hStyle.Bold + .Underline = hStyle.Underline + .Dotted = hStyle.Dotted + + End With + + Next + + hEditor.Background = hEditor.Styles[Highlight.Background].Color + hEditor.Foreground = hEditor.Styles[Highlight.Normal].Color + + hEditor.Refresh + +End + +Public Sub GetColor(sStyle As String) As Integer + + Dim hStyle As New CStyle + + hStyle.FromString(Settings["Highlight" &/ sStyle, $cDefault[sStyle]]) + Return hStyle.Foreground + +End + +Public Sub InitControl(hControl As Control) + + If Application.DarkTheme And If Settings["/Editor/InvertTheme", True] Then + hControl.Background = GetColor("Normal") + hControl.Foreground = GetColor("Foreground") + Else + hControl.Background = GetColor("Background") + hControl.Foreground = GetColor("Normal") + Endif + +End + +Public Sub GetStyles() As TextHighlighterStyle[] + + Dim iInd As Integer + Dim hStyle As New CStyle + Dim iStyle As Integer + Dim iCol As Integer + Dim iBg As Integer + Dim bInvert As Boolean + Dim sKey As String + Dim aStyles As TextHighlighterStyle[] + Dim hTextStyle As TextHighlighterStyle + + aStyles = TextHighlighter.DefaultStyle + + If Application.DarkTheme Then bInvert = Settings["/Editor/InvertTheme", True] + For iInd = 0 To ColorKeys.Max + + sKey = ColorKeys[iInd] + + hStyle.FromString(Settings["Highlight" &/ sKey, $cDefault[sKey]]) + iStyle = Object.GetProperty(Classes["Highlight"], sKey) + + hTextStyle = aStyles[iStyle] + + With hTextStyle + + iCol = hStyle.Foreground + + If iInd = 0 Then + iBg = iCol + If Color[iBg].Value < 128 Then bInvert = False + Endif + + If bInvert Then iCol = InvertColor(iCol, sKey) + + .Color = iCol + .Bold = hStyle.Bold + .Underline = hStyle.Underline + + End With + + Next + + Return aStyles + +End diff --git a/app/src/gambas3/.src/Options/CBackground.class b/app/src/gambas3/.src/Options/CBackground.class new file mode 100644 index 00000000..11e5b6dd --- /dev/null +++ b/app/src/gambas3/.src/Options/CBackground.class @@ -0,0 +1,68 @@ +' Gambas class file + +Inherits UserControl + +Property Selected As Boolean + +Private $hView As DrawingArea +Private $hImage As Image +Private $bSelected As Boolean + +Public Sub _new() + + $hView = New DrawingArea(Me) As "View" + $hView.Background = Color.TextBackground + $hView.Mouse = Mouse.Pointing + Me.Proxy = $hView + Me.ResizeScaled(20, 20) + +End + +Public Sub View_Draw() + + Dim D As Integer = Desktop.Scale + + Paint.Rectangle(D * 2, D * 2, Paint.W - D * 4, Paint.H - D * 4) + Paint.Brush = Paint.Color(Color.LightForeground) + + If $hImage Then + Paint.Fill(True) + Paint.Brush = Paint.Image($hImage) + Endif + + Paint.Fill + + If $bSelected Then + Paint.Background = Color.LightBackground + Paint.Rectangle(0, 0, Paint.W, D) + Paint.Rectangle(0, Paint.H - D, Paint.W, D) + Paint.Rectangle(0, 0, D, Paint.H) + Paint.Rectangle(Paint.W - D, 0, D, Paint.H) + Paint.Fill + Endif + +End + +Private Function Selected_Read() As Boolean + + Return $bSelected + +End + +Private Sub Selected_Write(Value As Boolean) + + $bSelected = Value + $hView.Refresh + +End + +Public Sub SetImage(hImage As Image, iColor As Integer) + + If hImage Then + If Application.DarkTheme Then hImage = hImage.Invert(True) + hImage = hImage.Colorize(iColor) + Endif + $hImage = hImage + $hView.Refresh + +End diff --git a/app/src/gambas3/.src/Options/FLayout.class b/app/src/gambas3/.src/Options/FLayout.class new file mode 100644 index 00000000..7a44c222 --- /dev/null +++ b/app/src/gambas3/.src/Options/FLayout.class @@ -0,0 +1,58 @@ +' Gambas class file + +Static Public LayoutName As String + +Private $aLayout As String[] +Private $sName As String + +Public Sub Run(aLayout As String[], sName As String) As Boolean + + $aLayout = aLayout + $sName = sName + + Return Not Me.ShowModal() + +End + +Public Sub btnOK_Click() + + Dim sName As String + + sName = Trim(cmbName.Text) + + If Not sName Then + Message.Warning(("Please enter the name of the layout.")) + cmbName.SetFocus + Return + Endif + + If cmbName.Find(sName) >= 0 Then + If Message.Warning(("This layout already exists."), ("Override"), ("Cancel")) = 2 Then Return + Endif + + LayoutName = sName + Me.Close(True) + +End + +Public Sub btnCancel_Click() + + Me.Close + +End + + +Public Sub Form_Open() + + Dim I As Integer + + cmbName.Clear + For I = 2 To $aLayout.Max Step 2 + cmbName.Add($aLayout[I]) + Next + + cmbName.SetFocus + + cmbName.Text = $sName + +End diff --git a/app/src/gambas3/.src/Options/FLayout.form b/app/src/gambas3/.src/Options/FLayout.form new file mode 100644 index 00000000..52769689 --- /dev/null +++ b/app/src/gambas3/.src/Options/FLayout.form @@ -0,0 +1,38 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,64,16) + Text = ("Save layout") + Resizable = False + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + { Label1 Label + MoveScaled(1,1,26,3) + Text = ("Layout name") + } + { cmbName ComboBox + MoveScaled(1,5,58,4) + } + { Spring1 Spring + MoveScaled(24,9,2,2) + } + { HBox1 HBox + MoveScaled(2,11,62,4) + Spacing = True + { Panel1 Panel + MoveScaled(4,0,4,4) + Expand = True + } + { btnOK Button + MoveScaled(31,0,14,4) + Text = ("OK") + Default = True + } + { btnCancel Button + MoveScaled(48,0,14,4) + Text = ("Cancel") + Cancel = True + } + } +} diff --git a/app/src/gambas3/.src/Options/FOption.class b/app/src/gambas3/.src/Options/FOption.class new file mode 100644 index 00000000..9dcc27b4 --- /dev/null +++ b/app/src/gambas3/.src/Options/FOption.class @@ -0,0 +1,1835 @@ +' Gambas class file + +Static Private $aTheme As String[] = ["amethyst", "amber", "emerald", "gambas", "ruby", "sapphire", "visual", "obsidian", "quest", "quick", "blues", "zen", "pastel"] +Static Private $aThemeName As String[] = [("Amethyst"), ("Amber"), ("Emerald"), ("Gambas"), ("Ruby"), ("Sapphire"), ("Visual"), ("Obsidian"), ("Quest"), ("Quick"), ("Blues"), ("Zen"), ("Pastel")] +Static Private $aBrowser As String[] = ["konqueror", "rekonq", "firefox", "iceweasel", "epiphany", "seamonkey", "opera", "chromium"] +Static Private $aTerminal As String[] = ["konsole", "gnome-terminal", "mate-terminal", "Terminal", "lxterminal", "xterm"] +'Static Private $aImageEditor As String[] = ["gimp", "kolourpaint", "krita"] +Static Private $cLayoutName As Collection + +Private $cLast As Collection +Private $cCurrent As Collection +Private $bNoChange As Boolean +Private $aConfig As Variant[][] +Private $sStyle As String +Private $hDraw As DrawingArea +Private $hDownloadHelp As DownloadManager +Private $aLayout As String[] + +Private Sub ReadConfig() + + Dim aParam As Variant[] + Dim hCtrl As Object + Dim vVal As Variant + + For Each aParam In $aConfig + + hCtrl = aParam[0] + vVal = Settings[aParam[1], aParam[2]] + + Select Case Object.Type(hCtrl) + + Case "FontChooser" + hCtrl.SelectedFont = vVal + Case "ComboBox" + If hCtrl.ReadOnly Then + If TypeOf(vVal) = gb.Boolean Then + hCtrl.Index = If(vVal, 1, 0) + Else + hCtrl.Index = vVal + Endif + Else + hCtrl.Text = vVal + Endif + Case "SpinBox" + hCtrl.Value = vVal + Case "ButtonBox" + hCtrl.Text = vVal + Case "SwitchButton" + hCtrl.Value = vVal + Case "TextBox", "MaskBox" + hCtrl.Text = vVal + Case "FontBox" + hCtrl.Value = vVal + Default + Debug "Unmanaged type: "; Object.Type(hCtrl) + + End Select + + Next + +End + +' Private Sub LoadIgnoreFiles() +' +' Dim aIgnore As String[] +' Dim iInd As Integer +' +' aIgnore = Project.GetIgnoreFiles() +' tvwIgnore.Rows.Count = aIgnore.Count +' For iInd = 0 To aIgnore.Max +' tvwIgnore[iInd, 0].Text = aIgnore[iInd] +' Next +' +' End +' +Public Sub _new() + + Dim iInd As Integer + Dim hHBox As HBox + Dim hColor As DrawingArea + Dim hButton As ToolButton + Dim aColors As Integer[] + + gvwLayout.Columns.Count = 1 + + cmbTheme.List = $aThemeName.Copy().Sort(gb.Language) + cmbTheme.Add(("Custom"), 0) + + cmbIconTheme.List = [("Desktop"), "Gnome", "KDE", "Trinity", "KDE4", "KDE5", "LXDE", "Mate", "XFCE"].Insert(Stock.Themes) + cmbBrowser.List = [("(Default)"), "Konqueror", "Rekonq", "Firefox", "Iceweasel", "Epiphany", "SeaMonkey", "Opera", "Chromium"] + cmbTerminal.List = [("(Default)"), "Konsole", "Gnome terminal", "Mate terminal", "XFCE Terminal", "lxterminal", "XTerm"] + txtEditorFont.Default = Project.DEFAULT_FONT + txtConsoleFont.Default = Project.DEFAULT_FONT + txtPrintFont.Default = Project.DEFAULT_FONT + txtHelpFixedFont.Default = Project.DEFAULT_FONT + + $cLast = MTheme.ReadSettings(Settings, "/Highlight", True) + $cCurrent = MTheme.Copy($cLast) + + $aConfig = [ + [txtEditorFont, "/Editor/Font", ""], + [txtConsoleFont, "/ConsoleFont", ""], + [txtPrintFont, "/Printing/Font", ""], + [txtGlobalFont, "/Font", ""], + [txtHelpDefaultFont, "/Browser/Font", ""], + [txtHelpFixedFont, "/Browser/FixedFont", ""], + [btnCloseWithMiddleClick, "/CloseWithMiddleClick", 0], + [txtTabSize, "/DefaultTabSize", 2], + [btnFoldProc, "/Editor/CollapseByDefault", 0], + [btnWrapText, "/Editor/WrapTextByDefault", 1], + [btnTabIndent, "/Editor/TabIndentByDefault", 0], + [btnVersionControl, "/VersionControl/Enabled", 1], + [btnShowLimit, "/Editor/ProcedureLimit", 1], + [btnShowLineNumber, "/Editor/ShowLineNumbers", 0], + [btnShowChange, "/Editor/ShowChange", 1], + [btnShowCurrent, "/Editor/ShowCurrent", 1], + [btnShowSpaces, "/Editor/ShowSpaces", 1], + [btnShowIndent, "/Editor/ShowIndent", 1], + [btnShowPreview, "/Editor/ShowPreview", 0], + [btnFold, "/Editor/ShowExpand", 1], + [btnInvertTheme, "/Editor/InvertTheme", 1], + [btnShowDebug, "/ShowDebugPanelAutomatically", 1], + [btnUtility, "/UseUtilityWindows", 1], + [btnStartupLoad, "/RestoreFiles", 1], + [btnOptional, "/AlwaysDisplayOptionalMessages", 0], + [btnOfflineHelp, "/UseOfflineHelp", 0], + [btnTooltip, "/ShowTooltip", 1], + [btnAnimation, "/Animations", 1], + [btnShadow, "/Shadows", 1], + [btnShowFileInTitle, "/ShowFileInTitle", 1], + [btnHelpCompletion, "/ShowHelpInPopup", 1], + [btnSeparateStatic, "/Editor/SeparateStaticMethod", 1], + [btnUpperCaseKeywords, "/Editor/KeywordsUseUpperCase", 0], + [btnControlStructCompletion, "/Editor/ControlStructCompletion", 1], + [btnLocalVarDecl, "/Editor/LocalVariableDeclaration", 0], + [btnComment, "/Editor/AutoComment", 1], + [btnCloseBraces, "/Editor/CloseBraces", 1], + [btnCloseStrings, "/Editor/CloseStrings", 1], + [btnIndentDim, "/FormatCode/IndentLocal", 1], + [btnRemoveSpace, "/FormatCode/RemoveSpaces", 0], + [btnKeepVoidLine, "/FormatCode/KeepVoidLines", 0], + [btnFormatOnLoad, "/FormatCode/FormatOnLoad", 0], + [btnCodeSnippet, "/Editor/CodeSnippets", 1], + [txtName, "/Identity/Name", User.Name], + [txtMail, "/Identity/Mail", User.Name & "@" & System.Host], + [txtVendor, "/Packager/Vendor", ""], + [txtVendorPrefix, "/Packager/VendorPrefix", ""], + [txtLicense, "/Packager/License", "General Public License"], + [txtURL, "/Packager/URL", "www.endoftheinternet.com"], + [cmbPrefix, "/Packager/UsePrefix", 0], + [btnCompressPng, "/CompressPng", 1], + [btnAutoTrans, "/AutomaticTranslation/Enabled", 0]] + + $bNoChange = True + + ReadConfig + + cmbIconTheme.Index = Max(0, cmbIconTheme.List.Find(Settings["/Theme"])) + cmbBrowser.Index = $aBrowser.Find(Settings["/Browser"]) + 1 + cmbTerminal.Index = $aTerminal.Find(Settings["/Terminal"]) + 1 + + SetPercentSize(cmbProjectFontSize, Settings["/ProjectFontSize", 100]) + SetPercentSize(cmbTitleFontSize, Settings["/TitleFontSize", 80]) + SetPercentSize(cmbDebuggerFontSize, Settings["/DebuggerFontSize", 80]) + SetPercentSize(cmbHelpZoom, Settings["/Help/Zoom", 80]) + + iInd = $aTheme.Find(Settings["/Editor/Theme"]) + If iInd >= 0 Then + cmbTheme.Text = $aThemeName[iInd] + Else + cmbTheme.Index = 0 + Endif + + UpdateFont(txtGlobalFont.Value) + + $bNoChange = False + + For iInd = 0 To MTheme.ColorKeys.Max + + hHBox = New HBox(svwTheme) + hHBox.Tag = MTheme.ColorKeys[iInd] + hHBox.Height = 4 * Desktop.Scale + 'hHBox.Spacing = 4 + hColor = New DrawingArea(hHBox) As "dwgStyle" + hColor.Expand = True + hColor.Border = Border.Plain + hColor.Arrangement = Arrange.Horizontal + hColor.Invert = True + hButton = New ToolButton(hColor) As "btnStyle" + hButton.Picture = Picture["icon:/small/color"] + hButton.Resize(Desktop.Scale * 4, Desktop.Scale * 4) + + Next + + RefreshStyle + + gvwSnippet.Columns.Count = 2 + gvwSnippet.Columns[0].Width = Desktop.Scale * 8 + + aColors = [Color.White, &HC0C0C0, &H808080, &H404040, 0] + For iInd = 0 To 359 Step 30 + aColors.Add(Color.HSV(iInd, 255, 255)) + Next + choBackgroundColor.Colors = aColors + choBackgroundColor.Current = Project.GetBackgroundColor() + + sldBackgroundBrightness.Value = Project.GetBackgroundBrightness() + + btnAutoTrans_Click + + Me.Utility = Settings["/UseUtilityWindows", 1] + +End + +Public Sub Form_KeyPress() + + If Key.Code = Key.Escape Then Me.Close + +End + +Public Sub cmbTheme_Click() + + Dim iTheme As Integer + + iTheme = $aThemeName.Find(cmbTheme.Text) + + If iTheme < 0 Then + Settings["/Editor/Theme"] = "" + Return + Endif + + Settings["/Editor/Theme"] = $aTheme[iTheme] + $cCurrent = MTheme.ReadFile($aTheme[iTheme]) + RefreshEditor + +End + +Public Sub btnExport_Click() + + Dialog.Path = Settings["/FOption/ThemePath", User.Home &/ User.Name & ".gambas.theme"] + Dialog.Filter = ["*.gambas.theme", ("Gambas highlight theme files")] + Dialog.Title = ("Export a theme file") + Dialog.AutoExt = True + If Dialog.SaveFile() Then Return + Settings["/FOption/ThemePath"] = Dialog.Path + + MTheme.WriteFile(Dialog.Path, $cCurrent) + +End + +Private Sub RefreshStyle() + + Dim hHBox As HBox + Dim H As Integer + + H = Max(Project.GetEditorFont().Height + Desktop.Scale * 2, Desktop.Scale * 4) + + For Each hHBox In svwTheme.Children + hHBox.H = H + hHBox.Children[0].Refresh + Next + +End + + + +Private Sub RefreshEditor() + + Dim hFile As Object + + If $bNoChange Then Return + + Settings["/Editor/Font"] = txtEditorFont.Value + + RefreshStyle + MTheme.WriteSettings(Settings, "Highlight", $cCurrent) + + Project.InitWebView + Project.RefreshBreakpointPicture + + For Each hFile In Project.Files + Try hFile.ReadConfig() + Next + + FSearch.ReadConfig + FMain.ReadConfig + FProperty.ReadConfig + FFormStack.ReadConfig + FOutput.ReadConfig + FProfile.ReadConfig + FDebugInfo.ReadConfig + FDebugExpr.ReadConfig + FCompletion.ReadConfig + +End + +Private Sub RefreshConsole() + + If $bNoChange Then Return + + Settings["/ConsoleFont"] = txtConsoleFont.Value + FOutput.ReadConfig + FDebugInfo.ReadConfig + Project.InitWebView + +End + + +Public Sub btnUndo_Click() + + $cCurrent = MTheme.Copy($cLast) + cmbTheme.Index = 0 + RefreshEditor + +End + +Private Sub RefreshWindow() + + Dim hFile As Object + + If $bNoChange Then Return + + FProperty.ReadConfig + FMain.ReadConfig + FDebugInfo.ReadConfig + FSearch.ReadConfig + FFormStack.ReadConfig + FToolBox.ReadConfig + FDebugExpr.ReadConfig + FOutput.ReadConfig + FHelpBrowser.ReadConfig + FImageProperty.ReadConfig + For Each hFile In Project.Files + Try hFile.ReadConfig + Next + +End + +Private Sub SetPercentSize(hCombo As ComboBox, iSize As Integer) + + Try hCombo.Text = CStr(iSize) & " %" + +End + +Private Sub GetPercentSize(hCombo As ComboBox) As Integer + + Return CInt(Trim(Left(hCombo.Text, -1))) + +End + +Public Sub cmbProjectFontSize_Click() + + Settings["/ProjectFontSize"] = GetPercentSize(cmbProjectFontSize) + RefreshWindow + +End + +Public Sub cmbTitleFontSize_Click() + + Settings["/TitleFontSize"] = GetPercentSize(cmbTitleFontSize) + RefreshWindow + +End + +Public Sub cmbDebuggerFontSize_Click() + + Settings["/DebuggerFontSize"] = GetPercentSize(cmbDebuggerFontSize) + FDebugInfo.ReadConfig + +End + +Public Sub btnTooltip_Click() + + Settings["/ShowTooltip"] = btnTooltip.Value + Application.ShowTooltips = btnTooltip.Value + +End + +Public Sub btnAnimation_Click() + + Settings["/Animations"] = btnAnimation.Value + Application.Animations = btnAnimation.Value + +End + +Public Sub btnShadow_Click() + + Settings["/Shadows"] = btnShadow.Value + Application.Shadows = btnShadow.Value + +End + +Public Sub btnShowFileInTitle_Click() + + Settings["/ShowFileInTitle"] = btnShowFileInTitle.Value + Project.ShowFileInTitle = btnShowFileInTitle.Value + Project.UpdateTitle + +End + +Public Sub txtTabSize_Change() + + Settings["/DefaultTabSize"] = txtTabSize.Value + +End + +Public Sub btnShowLimit_Click() + + Settings["/Editor/ProcedureLimit"] = btnShowLimit.Value + RefreshEditor + +End + +Public Sub btnShowLineNumber_Click() + + Settings["/Editor/ShowLineNumbers"] = btnShowLineNumber.Value + RefreshEditor + +End + +Public Sub btnShowChange_Click() + + Settings["/Editor/ShowChange"] = btnShowChange.Value + RefreshEditor + +End + +Public Sub btnShowCurrent_Click() + + Settings["/Editor/ShowCurrent"] = btnShowCurrent.Value + RefreshEditor + +End + +Public Sub btnShowSpaces_Click() + + Settings["/Editor/ShowSpaces"] = btnShowSpaces.Value + RefreshEditor + +End + +Public Sub btnShowIndent_Click() + + Settings["/Editor/ShowIndent"] = btnShowIndent.Value + RefreshEditor + +End + +Public Sub btnShowPreview_Click() + + Settings["/Editor/ShowPreview"] = btnShowPreview.Value + RefreshEditor + +End + +' Public Sub cmbCompletion_Click() +' +' Settings["/Editor/Completion"] = cmbCompletion.Index = 1 +' RefreshEditor +' +' End + +Public Sub btnImport_Click() + + Dialog.Path = Settings["/FOption/ThemePath", User.Home] + Dialog.Filter = ["*.gambas.theme", ("Gambas highlight theme files")] + Dialog.Title = ("Select a theme file") + If Dialog.OpenFile() Then Return + + 'Enhanced Dialog.OpenFile() is buggy + If Not Dialog.Path Or If IsDir(Dialog.Path) Then Return + + Settings["/FOption/ThemePath"] = Dialog.Path + + $cCurrent = MTheme.ReadFile(Dialog.Path) + cmbTheme.Index = 0 + RefreshEditor + +End + +Public Sub btnCloseWithMiddleClick_Click() + + Settings["/CloseWithMiddleClick"] = btnCloseWithMiddleClick.Value + FMain.ReadConfig + +End + +Private Sub NeedRestart(hCtrl As Control) + + Balloon.Warning(("You need to restart the application to see your changes."), hCtrl) + +End + + +Public Sub cmbIconTheme_Click() + + If cmbIconTheme.Index > 0 + Settings["/Theme"] = cmbIconTheme.Text + Else + Settings["/Theme"] = "" + Endif + + NeedRestart(cmbIcontheme) + +End + +Public Sub cmbBrowser_Click() + + If cmbBrowser.Index > 0 Then + Settings["/Browser"] = $aBrowser[cmbBrowser.Index - 1] + Else + Settings["/Browser"] = "" + Endif + + Project.Browser = "" + +End + +Public Sub cmbTerminal_Click() + + If cmbTerminal.Index > 0 Then + Settings["/Terminal"] = $aTerminal[cmbTerminal.Index - 1] + Else + Settings["/Terminal"] = "" + Endif + +End + +Public Sub btnShowDebug_Click() + + Settings["/ShowDebugPanelAutomatically"] = btnShowDebug.Value + +End + +Public Sub btnUtility_Click() + + Settings["/UseUtilityWindows"] = btnUtility.Value + NeedRestart(btnUtility) + +End + +Public Sub btnStartupLoad_Click() + + Settings["/RestoreFiles"] = btnStartupLoad.Value + +End + +Public Sub btnOptional_Click() + + Settings["/AlwaysDisplayOptionalMessages"] = btnOptional.Value + +End + +Private Sub UpdateOfflineHelp() + + MHelp.ReadConfig + panDownloadHelp.Visible = btnOfflineHelp.Value + panProxyConfig.Visible = Not panDownloadHelp.Visible + UpdateDocumentationState + +End + +Public Sub btnOfflineHelp_Click() + + Settings["/UseOfflineHelp"] = btnOfflineHelp.Value + UpdateOfflineHelp + FHelpBrowser.GotoHome + +End + +Public Sub btnClose_Click() + + Me.Close + +End + +' Public Sub cmbMessage_Click() +' +' Settings["/ShowMessages"] = cmbMessage.Index +' FMain.ReadConfig +' +' End + +' Public Sub btnIntegratedHelp_Click() +' +' Settings["/PropertyHelp"] = btnIntegratedHelp.Value +' FProperty.CheckIntegratedHelpSetting +' +' End + +Public Sub btnHelpCompletion_Click() + + Settings["/ShowHelpInPopup"] = btnHelpCompletion.Value + +End + +Public Sub dwgStyle_Draw() + + Dim hDraw As DrawingArea = Last + Dim sKey As String = hDraw.Parent.Tag + Dim hStyle As CStyle = CStyle[$cCurrent[sKey]] + Dim sName As String + Dim iForeground As Integer + Dim iBackground As Integer + Dim bInvert As Boolean + Dim iBg As Integer + Dim D As Integer + Dim Y As Integer + Dim W As Integer + Dim LB As Integer + Dim XB As Integer + + sName = MTheme.ColorNames[MTheme.ColorKeys.Find(sKey)] + If Application.DarkTheme Then bInvert = Settings["/Editor/InvertTheme", True] + If bInvert Then + iBg = CStyle[$cCurrent["Background"]].Foreground + If Color[iBg].Value < 128 Then bInvert = False + Endif + + Paint.Font = Project.GetEditorFont() + + If MTheme.IsBackgroundStyle(sKey) Then + iBackground = hStyle.Foreground + iForeground = CStyle[$cCurrent["Normal"]].Foreground + If bInvert Then + iBackground = MTheme.InvertColor(iBackground, sKey) + iForeground = MTheme.InvertColor(iForeground, "Normal") + Endif + Else + iBackground = CStyle[$cCurrent["Background"]].Foreground + iForeground = hStyle.Foreground + If bInvert Then + iBackground = MTheme.InvertColor(iBackground, "Background") + iForeground = MTheme.InvertColor(iForeground, sKey) + Endif + Endif + + + Paint.FillRect(0, 0, hDraw.W, hDraw.H, iBackground) + D = Desktop.Scale + + W = hDraw.Width - D * 2 + + Paint.Background = iForeground + If hStyle.Bold Then + LB = 1 + Paint.Font.H \ If(bInvert, 4, 6) + XB = D + While LB >= 2 + Paint.DrawText(sName, XB, 0, W, hDraw.H, Align.Normal) 'DrawText(sStr, SX, X + 1, Y) + Inc XB + LB -= 2 + Wend + If LB Then + Paint.Background = Color.SetAlpha(iForeground, 128) + Paint.DrawText(sName, XB, 0, W, hDraw.H, Align.Normal) + Endif + Else + Paint.DrawText(sName, D, 0, W, hDraw.Height, Align.Normal) + Endif + + + Y = hDraw.H - (hDraw.H - Paint.Font.H) \ 2 + W = Paint.Font.TextWidth(sName) + + If hStyle.Underline Then + Paint.FillRect(D, Y, W, 1, Color.SetAlpha(iForeground, 128)) + Else If hStyle.Dotted Then + Paint.Background = Color.SetAlpha(iForeground, 128) + Paint.LineWidth = 1 + Paint.Dash = [1] + Paint.MoveTo(D, Y - 0.5) + Paint.RelLineTo(W, 0) + Paint.Stroke + Endif + +End + +Public Sub btnStyle_Click() + + $hDraw = Last.Parent '.Children[0] + $sStyle = $hDraw.Parent.Tag + mnuPopup.Popup + +End + +Public Sub mnuPopup_Show() + + With CStyle[$cCurrent[$sStyle]] + + mnuBold.Checked = .Bold + mnuUnderline.Checked = .Underline + mnuDotted.Checked = .Dotted + + End With + +End + +Private Sub UpdateStyle() + + Dim hStyle As New CStyle($cCurrent[$sStyle]) + + With hStyle + .Bold = mnuBold.Checked + .Underline = mnuUnderline.Checked + .Dotted = mnuDotted.Checked + End With + + $cCurrent[$sStyle] = hStyle.ToString() + cmbTheme.Index = 0 + RefreshEditor + +End + +Public Sub mnuBold_Click() + + mnuBold.Checked = Not mnuBold.Checked + UpdateStyle + +End + +Public Sub mnuUnderline_Click() + + mnuUnderline.Checked = Not mnuUnderline.Checked + UpdateStyle + +End + +Public Sub mnuDotted_Click() + + mnuDotted.Checked = Not mnuDotted.Checked + UpdateStyle + +End + +Public Sub mnuColor_Click() + + Dim hStyle As New CStyle($cCurrent[$sStyle]) + Dim iColor As Integer = hStyle.Foreground + + If FColorChooser.Run("&H" & Hex$(iColor, 6) & "&") Then Return + + hStyle.Foreground = FColorChooser.Value + $cCurrent[$sStyle] = hStyle.ToString() + cmbTheme.Index = 0 + RefreshEditor + +End + +Public Sub btnUpperCaseKeywords_Click() + + Settings["/Editor/KeywordsUseUpperCase"] = btnUpperCaseKeywords.Value + RefreshEditor + +End + +Public Sub btnControlStructCompletion_Click() + + Settings["/Editor/ControlStructCompletion"] = btnControlStructCompletion.Value + FEditor.StructControlCompletion = btnControlStructCompletion.Value + +End + +Public Sub btnLocalVarDecl_Click() + + Settings["/Editor/LocalVariableDeclaration"] = btnLocalVarDecl.Value + FEditor.LocalVariableDeclaration = btnLocalVarDecl.Value + +End + +Public Sub btnComment_Click() + + Settings["/Editor/AutoComment"] = btnComment.Value + FEditor.AutoComment = btnComment.Value + +End + +Public Sub btnCloseBraces_Click() + + Settings["/Editor/CloseBraces"] = btnCloseBraces.Value + RefreshEditor + +End + +Public Sub btnFold_Click() + + Settings["/Editor/ShowExpand"] = btnFold.Value + RefreshEditor + +End + +Public Sub btnFoldProc_Click() + + Settings["/Editor/CollapseByDefault"] = btnFoldProc.Value + +End + +Public Sub btnWrapText_Click() + + Settings["/Editor/WrapTextByDefault"] = btnWrapText.Value + +End + +Public Sub btnTabIndent_Click() + + Settings["/Editor/TabIndentByDefault"] = btnTabIndent.Value + +End + +Public Sub Form_Open() + + Me.Center + +End + + +Public Sub btnClearCache_Click() + + Dim sErr As String + + If Message.Question(("Do you really want to clear the documentation cache?"), ("Clear"), ("Cancel")) <> 1 Then Return + Inc Application.Busy + WebSettings.Cache.Clear() + Dec Application.Busy + +Catch + + sErr = Error.Text + Application.Busy = 0 + Message.Error(("Unable to clear documentation cache.") & "\n\n" & sErr) + +End + +Public Sub txtEditorFont_Change() + + RefreshEditor + +End + +Public Sub txtConsoleFont_Change() + + RefreshConsole + +End + +Private Sub UpdateFont(sFont As String) + + If sFont <> Settings["/Font"] Then + Settings["/Font"] = sFont + If sFont Then + Application.Font = Font[Settings["/Font"]] + Else + Application.Font = Font[Project.DESKTOP_FONT] + Endif + Project.InitWebView + RefreshWindow + Endif + +End + + +Public Sub txtGlobalFont_Change() + + UpdateFont(txtGlobalFont.Value) + +End + +' Public Sub svwOption_Arrange() +' +' panOption.Width = svwOption.ClientWidth - Desktop.Scale +' +' End + +Private Sub RefreshSnippet() + + CSampleCode.Init + gvwSnippet.Rows.Count = CSampleCode.All.Count + gvwSnippet.Rows.Height = Font[txtEditorFont.Value].Height + 8 + gvwSnippet.Refresh + +End + + +' Public Sub tabOption_Click() +' +' If tabOption.Index = 2 Then +' If gvwSnippet.Rows.Count = 0 Then +' RefreshSnippet +' UpdateSnippet +' Endif +' Endif +' +' End + +Private Sub GetSnippet(Optional iRow As Integer = -1) As CSampleCode + + Dim hSampleCode As CSampleCode + + If iRow < 0 Then + iRow = gvwSnippet.Row + If iRow < 0 Then Return + If Not gvwSnippet.Rows[iRow].Selected Then Return + Endif + Try hSampleCode = CSampleCode.All[CSampleCode.List[iRow]] + Return hSampleCode + +End + +Public Sub gvwSnippet_Data(Row As Integer, Column As Integer) + + Dim hSampleCode As CSampleCode = GetSnippet(Row) + + If Not hSampleCode Then Return + + With gvwSnippet + .Data.Padding = 4 + .Data.Font = Font[txtEditorFont.Value] + If Column = 0 Then + .Data.Text = hSampleCode.Trigger + If hSampleCode.Default Then + '.Data.Font.Italic = True + Else + .Data.Font.Bold = True + Endif + Else + .Data.Text = Mid$(Quote(hSampleCode.Pattern), 2, -1) + Endif + End With + +End + +Private Sub UpdateSnippet() + + Dim hSampleCode As CSampleCode = GetSnippet() + + If Not hSampleCode Then + btnRemoveSnippet.Enabled = False + btnEditSnippet.Enabled = False + Else + btnRemoveSnippet.Enabled = Not hSampleCode.Default + btnEditSnippet.Enabled = True 'Not hSampleCode.Default + Endif + +End + +Public Sub gvwSnippet_Select() + + UpdateSnippet + +End + +Public Sub btnCodeSnippet_Click() + + Settings["/Editor/CodeSnippet"] = btnCodeSnippet.Value + +End + +Public Sub btnInsertSnippet_Click() + + If FSnippet.Run() Then Return + RefreshSnippet + CSampleCode.Save + gvwSnippet.Row = CSampleCode.List.Find(FSnippet.NewTrigger) + +End + +Public Sub btnEditSnippet_Click() + + Dim hSampleCode As CSampleCode = GetSnippet() + + If Not hSampleCode Then Return + If FSnippet.Run(hSampleCode.Trigger) Then Return + RefreshSnippet + CSampleCode.Save + +End + +Public Sub gvwSnippet_Activate() + + btnEditSnippet.Value = True + +End + +Public Sub btnRemoveSnippet_Click() + + Dim hSampleCode As CSampleCode = GetSnippet() + + If Not hSampleCode Then Return + + If Message.Warning(("Do you really want to delete this snippet?"), ("Delete"), ("Cancel")) = 2 Then Return + + hSampleCode.Delete + RefreshSnippet + CSampleCode.Save + +End + +' Public Sub btnUndoSnippet_Click() +' +' If Message.Warning(("Do you really want to reset snippets to their default value?"), ("Reset"), ("Cancel")) = 2 Then Return +' +' CSampleCode.Reset +' RefreshSnippet +' +' End + +' Public Sub expOption_Show() +' +' Dim hLast As Expander = Last +' Dim hOther As Expander +' +' For Each hOther In svwOption.Children +' If hOther <> hLast Then hOther.Hidden = True +' Next +' +' End + +Private Sub RefreshBackground() + + Dim hBg As CBackground + Dim sBackground As String + Dim hImage As Image + Dim iColor As Integer + + Inc Application.Busy + + iColor = FColorChooser.FromString(Settings["/Background/Color", "#FFFFFF"]) + + svwBackground.Children.Clear + + hBg = New CBackground(svwBackground) As "Background" + hBg.Tag = "void" + hImage = New Image(16, 16, Color.LightForeground) + hBg.SetImage(hImage, iColor) + + For Each sBackground In Split(File.Load("img/background/list"), "\n", "", True) + Try hImage = Image.Load("img/background" &/ sBackground & ".png") + If Error Then Error "gambas3: warning: unable to load background image: "; sBackground + hBg = New CBackground(svwBackground) As "Background" + hBg.SetImage(hImage, iColor) + hBg.Tag = sBackground + Next + + sBackground = Settings["/Background/Image", Project.DEFAULT_BACKGROUND] + For Each hBg In svwBackground.Children + If hBg.Tag = sBackground Then + hBg.Selected = True + svwBackground.EnsureVisible(hBg.X, hBg.Y, hBg.W, hBg.H) + Endif + Next + + Dec Application.Busy + +End + +Public Sub ipnOption_Click() + + Select Case ipnOption.Text + + Case ("Projects") + + panCompressPng.Enabled = System.Exist("pngquant") + panAutoTrans.Enabled = System.Exist("trans") + If panAutoTrans.Enabled Then + FillAutoTransEngines + Else + btnAutoTrans.Value = False + Endif + + Case ("Code snippets") + + If gvwSnippet.Rows.Count = 0 Then + RefreshSnippet + UpdateSnippet + Endif + + Case ("Background") + + If svwBackground.Children.Count = 0 Then + RefreshBackground + Endif + + Case ("Help & applications") + + UpdateOfflineHelp + + Case ("Interface") + + SetCurrentLayout + If Not $aLayout Then RefreshLayout + + End Select + +End + +Public Sub btnIndentDim_Click() + + Settings["/FormatCode/IndentLocal"] = btnIndentDim.Value + +End + +Public Sub btnRemoveSpace_Click() + + Settings["/FormatCode/RemoveSpaces"] = btnRemoveSpace.Value + +End + +Public Sub btnKeepVoidLine_Click() + + Settings["/FormatCode/KeepVoidLines"] = btnKeepVoidLine.Value + +End + +Public Sub btnFormatOnLoad_Click() + + Settings["/FormatCode/FormatOnLoad"] = btnFormatOnLoad.Value + +End + +Public Sub btnProxy_Click() + + With FProxy + .Type = Settings["/Proxy/Type", 0] + .Host = Settings["/Proxy/Host"] + .Port = Settings["/Proxy/Port", 0] + .User = Settings["/Proxy/User"] + End With + + If FProxy.Run() Then Return + + With FProxy + Settings["/Proxy/Type"] = .Type + Settings["/Proxy/Host"] = .Host + Settings["/Proxy/Port"] = .Port + Settings["/Proxy/User"] = .User + End With + + MHelp.LoadProxyConfig + +End + +Public Sub txtName_LostFocus() + + Settings["/Identity/Name"] = txtName.Text + +End + +Public Sub txtMail_LostFocus() + + Settings["/Identity/Mail"] = txtMail.Text + +End + +Public Sub txtVendor_LostFocus() + + Settings["/Packager/Vendor"] = txtVendor.Text + +End + +Public Sub txtVendorPrefix_LostFocus() + + Settings["/Packager/VendorPrefix"] = txtVendorPrefix.Text + +End + +Public Sub txtLicense_LostFocus() + + Settings["/Packager/License"] = txtLicense.Text + +End + +Public Sub txtURL_LostFocus() + + Settings["/Packager/URL"] = txtURL.Text + +End + +Public Sub cmbPrefix_Click() + + Settings["/Packager/UsePrefix"] = cmbPrefix.Index = 1 + +End + +Public Sub btnInstallFont_Click() + + Dim sDir As String = "~/.fonts" + Dim sConf As String + Dim sData As String + Dim sFont As String + + If Message.Question(("Do you really want to install the Gambas font into your personal font directory?"), ("Install"), ("Cancel")) <> 1 Then Return + + If Not Exist(sDir) Then Mkdir sDir + + For Each sFont In ["GambasMedium-12.bdf", "GambasBold-12.bdf", "GambasMedium-13.bdf", "GambasBold-13.bdf", "GambasMedium-16.bdf", "GambasBold-16.bdf"] + Try Kill sDir &/ sFont + Try Copy "font" &/ sFont To sDir &/ sFont + Next + + Project.MakeDir("~/.config/fontconfig") + sConf = "~/.config/fontconfig/fonts.conf" + 'If Not Exist(sConf) Then sConf = "~/.config/fontconfig/.fonts.conf" + + If Not Exist(sConf) Then + Try Copy "font/font.conf" To sConf + Endif + + sData = File.Load(sConf) + If InStr(sData, "Gambas") = 0 Then + sData = Replace(sData, "", RTrim(File.Load("font/font.allow")) & "\n") + File.Save(sConf, sData) + Endif + + NeedRestart(btnInstallFont) + +End + +Public Sub Background_MouseDown() + + Dim hBg As CBackground + + For Each hBg In svwBackground.Children + hBg.Selected = hBg = Last + Next + + hBg = Last + svwBackground.EnsureVisible(hBg.X, hBg.Y, hBg.W, hBg.H) + Project.SetBackground(hBg.Tag) + +End + +Public Sub btnShortcut_Click() + + Action.Configure + +End + + +' Public Sub txtOfflineHelp_Click() +' +' Dialog.Title = ("Select the offline help directory") +' Dialog.Path = Project.UntildePath(txtOfflineHelp.Text) +' If Dialog.SelectDirectory() Then Return +' +' txtOfflineHelp.Text = Project.TildePath(Dialog.Path) +' MHelp.ReadConfig +' +' End + +' Public Sub txtOfflineHelp_Change() +' +' Settings["/OfflineHelpDir"] = txtOfflineHelp.Text +' +' End +' +' Public Sub txtOfflineHelp_KeyPress() +' +' If Key.Code = Key.Delete Or Key.Code = Key.Backspace Then +' txtOfflineHelp.Clear +' Endif +' +' End + +Private Sub UpdateDocumentationState() + + If Not panDownloadHelp.Visible Then Return + If $hDownloadHelp Then Return + + pgbDownload.Hide + btnCancelDownload.Hide + btnDownload.Enabled = True + + Select Case MHelp.GetOfflineState() + + Case MHelp.OFFLINE_NO_NETWORK + lblDocumentation.Text = ("Network is not available.") + lblDocumentation.Foreground = Color.Foreground + panDownload.Enabled = False + + Case MHelp.OFFLINE_UP_TO_DATE + lblDocumentation.Text = ("Documentation is up to date.") + lblDocumentation.Foreground = Color.Foreground + panDownload.Enabled = False + + Case MHelp.OFFLINE_NEW_AVAILABLE + lblDocumentation.Text = ("A new documentation is available!") + lblDocumentation.Foreground = Color.Red + panDownload.Enabled = True + + Case Else + lblDocumentation.Text = ("Documentation is not available.") + lblDocumentation.Foreground = Color.Foreground + panDownload.Enabled = False + + End Select + +End + +Public Sub Form_Close() + + Settings.Save + +End + +Public Sub choBackgroundColor_Click() + + Project.SetBackgroundColor("#" & Hex$(choBackgroundColor.Current, 6)) + RefreshBackground + +End + +Public Sub Form_Activate() + + ipnOption_Click + +End + +Public Sub btnInvertTheme_Click() + + Settings["/Editor/InvertTheme"] = btnInvertTheme.Value + RefreshEditor + +End + +Public Sub btnVersionControl_Click() + + Settings["/VersionControl/Enabled"] = btnVersionControl.Value + VersionControl.Refresh + Project.Refresh + +End + +Public Sub btnSeparateStatic_Click() + + Dim hFile As Object + Dim hEditor As FEditor + + Settings["/Editor/SeparateStaticMethod"] = btnSeparateStatic.Value + For Each hFile In Project.Files + Try hEditor = hFile + If Error Then Continue + hEditor.ResetProcList + Next + +End + +Private Sub RefreshBrowser() + + If $bNoChange Then Return + + Settings["/Browser/Font"] = txtHelpDefaultFont.Value + Settings["/Browser/FixedFont"] = txtHelpFixedFont.Value + + Project.InitWebView + +End + +Public Sub txtHelpDefaultFont_Change() + + RefreshBrowser + +End + +Public Sub txtHelpFixedFont_Change() + + RefreshBrowser + +End + +Public Sub cmbHelpZoom_Click() + + Settings["/Help/Zoom"] = GetPercentSize(cmbHelpZoom) + FProperty.ReadConfig + FCompletion.ReadConfig + +End + + +Public Sub btnCompressPng_Click() + + Settings["/CompressPng"] = btnCompressPng.Value + +End + +' Public Sub dwnHelp_Finish() +' +' Dim sMsg As String +' Dim sDir As String +' Dim sTimestamp As String +' Dim sFile As String +' Dim sParentDir As String +' +' sFile = dwnHelp.Target +' sDir = MHelp.GetOfflineDir() +' sParentDir = File.Dir(sFile) +' +' Inc Application.Busy +' +' sTimestamp = HttpClient.Download("http://gambaswiki.org/timestamp") +' +' Shell "rm -rf " & Shell(sParentDir &/ "gambas") Wait +' +' Shell "cd " & Shell$(sParentDir) & " && tar xfj " & Shell$(File.Name(sFile)) Wait +' +' If Not IsDir(sParentDir &/ "gambas") Then +' Shell "rm -rf " & Shell(sDir) & " " & Shell$(sFile) Wait +' sMsg = ("Unable to uncompress documentation.") +' Goto FAIL +' Endif +' +' If IsDir(sDir & "~") Then Shell "rm -rf " & Shell(sDir & "~") Wait +' If IsDir(sDir) Then Try Move sDir To sDir & "~" +' Try Move sParentDir &/ "gambas" To sDir +' +' If Not IsDir(sDir) Then +' sMsg = ("Unable to install documentation.") +' Goto FAIL +' Endif +' +' File.Save(sDir &/ "timestamp", sTimestamp) +' +' UpdateDocumentationState +' Dec Application.Busy +' Return +' +' FAIL: +' +' Dec Application.Busy +' Message.Warning(sMsg) +' Return +' +' End + + +' Public Sub dwnHelp_Start() +' +' Dim sDir As String +' Dim sParentDir As String +' Dim sFile As String +' Dim sMsg As String +' +' sMsg = Project.RequireProgram(["tar"]) +' If sMsg Then Error.Raise(sMsg) +' +' sDir = MHelp.GetOfflineDir() +' sParentDir = File.Dir(sDir) +' Project.MakeDir(sParentDir) +' sFile = sParentDir &/ "wiki.tar.bz2" +' Try Kill sFile +' +' dwnHelp.Target = sFile +' +' End +' + +Public Sub btnDownload_Click() + + Dim sMsg As String + + sMsg = Project.RequireProgram(["tar"]) + If sMsg Then Error.Raise(sMsg) + + $hDownloadHelp = New DownloadManager As "DownloadHelp" + $hDownloadHelp.Add("http://gambaswiki.org/gambas-wiki.tar.bz2", "help") + $hDownloadHelp.Add("http://gambaswiki.org/timestamp", "timestamp") + btnDownload.enabled = False + $hDownloadHelp.Start + + pgbDownload.Show + btnCancelDownload.Show + +End + +Public Sub DownloadHelp_Progress() + + If $hDownloadHelp.Progress > 0 Then + pgbDownload.Pulse = False + pgbDownload.Value = $hDownloadHelp.Progress + Else + pgbDownload.Pulse = True + Endif + +End + +Public Sub DownloadHelp_Error((Key) As String) + + Message.Error(("Cannot download '&1'.") & "\n\n&2", $hDownloadHelp[Key].Url, $hDownloadHelp[Key].ErrorText) + $hDownloadHelp = Null + UpdateDocumentationState + +End + +Public Sub DownloadHelp_End() + + Dim sDir As String + Dim sParentDir As String + Dim sFile As String + Dim sMsg As String + + Inc Application.Busy + + pgbDownload.Hide + btnCancelDownload.Hide + + sDir = MHelp.GetOfflineDir() + sParentDir = File.Dir(sDir) + + Shell.MkDir(sParentDir) + + sFile = sParentDir &/ "wiki.tar.bz2" + Shell.Move($hDownloadHelp["help"].Path, sFile, True) + + Try Shell.RmDir(sParentDir &/ "gambas") 'Shell "rm -rf " & Shell(sParentDir &/ "gambas") Wait + + Shell "cd " & Shell$(sParentDir) & " && tar xfj " & Shell$(File.Name(sFile)) Wait + + If Not IsDir(sParentDir &/ "gambas") Then + sMsg = ("Unable to uncompress documentation.") + Try Shell.RmDir(sParentDir &/ "gambas") + Try Kill sFile + Goto FAIL + Endif + + If IsDir(sDir & "~") Then Shell.RmDir(sDir & "~") 'Shell "rm -rf " & Shell(sDir & "~") Wait + If IsDir(sDir) Then Try Move sDir To sDir & "~" + Try Move sParentDir &/ "gambas" To sDir + + If Not IsDir(sDir) Then + sMsg = ("Unable to install documentation.") + Goto FAIL + Endif + + Shell.Move($hDownloadHelp["timestamp"].Path, sDir &/ "timestamp", True) + 'File.Save(sDir &/ "timestamp", sTimestamp) + + $hDownloadHelp = Null + UpdateDocumentationState + Dec Application.Busy + Return + +FAIL: + + Dec Application.Busy + Message.Warning(sMsg) + Return + +End + +Public Sub btnCancelDownload_Click() + + $hDownloadHelp.Stop() + $hDownloadHelp = Null + UpdateDocumentationState + +End + +Public Sub btnCloseStrings_Click() + + Settings["/Editor/CloseStrings"] = btnCloseStrings.Value + RefreshEditor + +End + +Public Sub btnAutoTrans_Click() + + Settings["/AutomaticTranslation/Enabled"] = btnAutoTrans.Value + panAutoTransEngine.Visible = btnAutoTrans.Value + +End + +Public Sub cmbAutoTrans_Click() + + Settings["/AutomaticTranslation/Engine"] = cmbAutoTrans.Text + +End + +Private Sub FillAutoTransEngines() + + Dim sResult As String + Dim sEngine As String + Dim aEngine As New String[] + + If cmbAutoTrans.Count Then Return + + Exec ["trans", "-S"] To sResult + + For Each sEngine In Split(Trim(sResult), "\n") + If sEngine Begins "* " Then sEngine = Mid$(sEngine, 2) + sEngine = Trim(sEngine) + If sEngine Then aEngine.Add(sEngine) + Next + + If Not aEngine.Exist("google") Then aEngine.Add("google") + aEngine.Sort() + + cmbAutoTrans.List = aEngine + + cmbAutoTrans.Text = Settings["/AutomaticTranslation/Engine", "google"] + If cmbAutoTrans.Index < 0 Then cmbAutoTrans.Text = "google" + +End + +Public Sub txtPrintFont_Click() + + Settings["/Printing/Font"] = txtPrintFont.Value + +End + +Private Sub GetLayoutDir() As String + + Return Desktop.DataDir &/ "gambas3/layout" + +End + + +Private Sub GetLayoutPath(sFile As String) As String + + If sFile Then + Return GetLayoutDir() &/ sFile & ".layout" + Else + Return Temp$("layout") + Endif + +End + +Private Sub RefreshLayout() + + Dim sFile As String + Dim sLang As String + Dim iPos As Integer + Dim sFullLang As String + Dim sName As String + Dim sDir As String + + If Not $cLayoutName Then + $cLayoutName = New Collection + $cLayoutName["$default"] = ("Default") + $cLayoutName["$compact"] = ("Compact") + Endif + + sLang = System.Language + iPos = InStr(sLang, ".") + If iPos Then sLang = Left(sLang, iPos - 1) + iPos = InStr(sLang, "_") + If iPos Then + sFullLang = sLang + sLang = Left(sLang, iPos - 1) + Endif + + $aLayout = New String[] + + $aLayout.Add("") + $aLayout.Add("" & ("Current") & "") + + sDir = GetLayoutDir() + + For Each sFile In Dir("layout", "*.layout").Sort(gb.Natural) + If Exist(sDir &/ sFile) Then Continue + sName = File.BaseName(sFile) + $aLayout.Add(sName) + If $cLayoutName.Exist(sName) Then sName = $cLayoutName[sName] + $aLayout.Add(Html(sName)) + Next + + If IsDir(sDir) Then + For Each sFile In Dir(sDir, "*.layout").Sort(gb.Natural) + sName = File.BaseName(sFile) + $aLayout.Add(sName) + If $cLayoutName.Exist(sName) Then sName = $cLayoutName[sName] + $aLayout.Add(Html(sName)) + Next + Endif + + gvwLayout.Rows.Count = $aLayout.Count \ 2 + + Object.Lock(gvwLayout) + gvwLayout.Row = 0 + Object.Unlock(gvwLayout) + +End + +Public Sub gvwLayout_Data(Row As Integer, (Column) As Integer) + + gvwLayout.Data.RichText = $aLayout[Row * 2 + 1] + +End + +Private Sub SaveLayout(Optional sFile As String) + + Dim sPath As String + Dim hSettings As Settings + + sPath = GetLayoutPath(sFile) + If sFile And If Exist(sPath) Then + If Message.Question(("Do you really want to override the existing layout?"), ("Override"), ("Cancel")) <> 1 Then Return + Endif + + Shell.MkDir(File.Dir(sPath)) + hSettings = New Settings(sPath, "Gambas IDE layout") + + hSettings["Toolbar/Main"] = ToolBar.GetLayout("main") + hSettings["Toolbar/Editor"] = ToolBar.GetLayout("editor") + hSettings["Toolbar/Text"] = ToolBar.GetLayout("text") + hSettings["Toolbar/Connection"] = ToolBar.GetLayout("connection") + hSettings["Toolbar/Form"] = ToolBar.GetLayout("form") + hSettings["Toolbar/Image"] = ToolBar.GetLayout("image") + hSettings["ShowMenus"] = Settings["/ShowMenus"] + hSettings["Toolbox/Size"] = Settings["/Toolbox/Size"] + hSettings["CloseWithMiddleClick"] = Settings["/CloseWithMiddleClick"] + hSettings["ProjectFontSize"] = Settings["/ProjectFontSize"] + hSettings["TitleFontSize"] = Settings["/TitleFontSize"] + hSettings["DebuggerFontSize"] = Settings["/DebuggerFontSize"] + hSettings["Help/Zoom"] = Settings["/Help/Zoom"] + hSettings["Property/Help"] = Not FProperty.IsHelpHidden() + hSettings["/Editor/InvertTheme"] = Settings["/Editor/InvertTheme"] + + hSettings.Save + +End + +Private Sub LoadLayout(sName As String) + + Dim sPath As String + Dim sKey As String + Dim hSettings As Settings + Dim sSlot As String + Dim vVal As Variant + + Inc Application.Busy + + sPath = GetLayoutPath(sName) + If Not Exist(sPath) Then sPath = "./layout" &/ sName & ".layout" + + hSettings = New Settings(sPath, "Gambas IDE layout") + + ' Toolbars last + + For Each sSlot In hSettings.Keys + For Each sKey In hSettings.Keys[sSlot] + vVal = hSettings[sSlot &/ sKey] + If sSlot = "Toolbar" Then Continue + If sSlot = "Property" And If sKey = "Help" Then + FProperty.ShowHelp(vVal) + Else + Settings[sSlot &/ sKey] = vVal + Endif + Next + Next + + RefreshWindow + + For Each sSlot In hSettings.Keys + For Each sKey In hSettings.Keys[sSlot] + vVal = hSettings[sSlot &/ sKey] + If sSlot = "Toolbar" Then + ToolBar.SetLayout(LCase(sKey), vVal) + Endif + Next + Next + +Finally + + Dec Application.Busy + +Catch + + Error.Propagate() + +End + + +Public Sub btnSaveLayout_Click() + + Dim sName As String + + If gvwLayout.Row > 0 Then sName = $aLayout[gvwLayout.Row * 2 + 1] + + If FLayout.Run($aLayout, sName) Then Return + + SaveLayout(FLayout.LayoutName) + RefreshLayout + +End + +Private Sub RemoveLayout(sFile As String) + + Dim sPath As String + + sPath = GetLayoutPath(sFile) + Try Kill sPath + RefreshLayout + +End + +Public Sub btnDeleteLayout_Click() + + If Message.Warning(("Do you really want to delete that layout?"), ("Delete"), ("Cancel")) <> 1 Then Return + + RemoveLayout($aLayout[gvwLayout.Row * 2]) + +End + +Public Sub gvwLayout_Select() + + Dim sName As String + + If gvwLayout.Row < 0 Then + btnDeleteLayout.Enabled = False + Return + Endif + + sName = $aLayout[gvwLayout.Row * 2] + btnDeleteLayout.Enabled = Exist(GetLayoutPath(sName)) + LoadLayout(sName) + +End + +Private Sub SetCurrentLayout() + + SaveLayout() + +End + +Public Sub sldBackgroundBrightness_Change() + + Dim iVal As Integer + + iVal = sldBackgroundBrightness.Value + iVal = Sgn(iVal) * ((Abs(iVal) + 8) \ 16) * 16 + Object.Lock(sldBackgroundBrightness) + sldBackgroundBrightness.Value = iVal + Object.Unlock(sldBackgroundBrightness) + Project.SetBackgroundBrightness(sldBackgroundBrightness.Value) + 'RefreshBackground + +End diff --git a/app/src/gambas3/.src/Options/FOption.form b/app/src/gambas3/.src/Options/FOption.form new file mode 100644 index 00000000..7585350f --- /dev/null +++ b/app/src/gambas3/.src/Options/FOption.form @@ -0,0 +1,1268 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,98,66) + Action = "option" + Text = ("Preferences") + Icon = Picture["icon:/small/options"] + Persistent = True + Utility = True + Arrangement = Arrange.Fill + Spacing = True + Margin = True + { mnuPopup Menu + Visible = False + { mnuColor Menu + Text = ("Color") & "..." + Picture = Picture["icon:/small/color"] + } + { Menu1 Menu + } + { mnuBold Menu + Text = ("Bold") + Picture = Picture["icon:/small/text-bold"] + } + { mnuUnderline Menu + Text = ("Underline") + Picture = Picture["icon:/small/text-underline"] + } + { mnuDotted Menu + Text = ("Dotted") + } + } + { ipnOption IconPanel + MoveScaled(1,1,94,64) + Arrangement = Arrange.Vertical + Spacing = True + Count = 10 + Border = True + Index = 0 + Text = ("Identity") + Picture = Picture["icon:/large/user"] + { Label60 Label + MoveScaled(1,1,61,3) + Font = Font["Bold"] + Text = ("Identity") + } + { HBox22 HBox + MoveScaled(1,5,66,4) + Spacing = True + Indent = True + { Label61 Label + MoveScaled(0,0,17,4) + Expand = True + Text = ("Name") + } + { txtName TextBox + MoveScaled(20,0,44,4) + } + } + { HBox50 HBox + MoveScaled(1,10,66,4) + Spacing = True + Indent = True + { Label63 Label + MoveScaled(0,0,17,4) + Expand = True + Text = ("E-mail") + } + { txtMail TextBox + MoveScaled(20,0,44,4) + } + } + { Label66 Label + MoveScaled(1,16,61,3) + Font = Font["Bold"] + Text = ("Package maintainer") + } + { HBox37 HBox + MoveScaled(1,20,66,4) + Spacing = True + Indent = True + { Label34 Label + MoveScaled(0,0,17,4) + Expand = True + Text = ("Vendor name") + } + { txtVendor MaskBox + MoveScaled(20,0,44,4) + Filter = "[A-Za-z0-9_-]" + } + } + { HBox36 HBox + MoveScaled(1,25,66,4) + Spacing = True + Indent = True + { Label35 Label + MoveScaled(0,0,17,4) + Expand = True + Text = ("Vendor prefix") + } + { txtVendorPrefix MaskBox + MoveScaled(20,0,44,4) + Filter = "[A-Za-z0-9]" + } + } + { HBox39 HBox + MoveScaled(1,31,66,4) + Spacing = True + Indent = True + { Label37 Label + MoveScaled(0,0,17,4) + Expand = True + Text = ("Default license") + } + { txtLicense ComboBox + MoveScaled(20,0,44,4) + #Translate = False + List = ["General Public License", "Public Domain", "Lesser General Public License", "Other License(s)", "Non-free License"] + Sorted = True + } + } + { HBox40 HBox + MoveScaled(1,36,66,4) + Spacing = True + Indent = True + { Label38 Label + MoveScaled(0,0,17,4) + Expand = True + Text = ("URL") + } + { txtURL TextBox + MoveScaled(20,0,44,4) + } + } + { HBox34 HBox + MoveScaled(1,41,66,4) + Spacing = True + Indent = True + { Label41 Label + MoveScaled(0,0,50,4) + Expand = True + Text = ("Add vendor prefix or name to package names") + } + { cmbPrefix ComboBox + MoveScaled(53,0,10,4) + ReadOnly = True + List = [("No"), ("Yes")] + } + } + Index = 1 + Text = ("Projects") + Picture = Picture["icon:/large/copy"] + { Label67 Label + MoveScaled(0,1,63,3) + Font = Font["Bold"] + Text = ("Projects") + } + { HBox14 HBox + MoveScaled(1,5,66,4) + Spacing = True + Indent = True + { Label40 Label + MoveScaled(0,0,31,4) + Expand = True + Text = ("Default tab size") + } + { txtTabSize SpinBox + MoveScaled(48,0,7,4) + MinValue = 1 + MaxValue = 16 + Value = 2 + } + { Label3 Label + MoveScaled(57,0,8,4) + AutoResize = True + Text = ("space(s)") + } + } + { HBox53 HBox + MoveScaled(1,10,66,4) + Spacing = True + Indent = True + { Label65 Label + MoveScaled(0,0,47,4) + Expand = True + Text = ("Indent with tab by default") + } + { btnTabIndent SwitchButton + MoveScaled(50,0,8,4) + Animated = True + } + } + { HBox35 HBox + MoveScaled(1,15,66,4) + Spacing = True + Indent = True + { Label33 Label + MoveScaled(0,0,47,4) + Expand = True + Text = ("Automatic word wrap by default") + } + { btnWrapText SwitchButton + MoveScaled(50,0,8,4) + Animated = True + } + } + { HBox4 HBox + MoveScaled(1,20,66,4) + Visible = False + Spacing = True + Indent = True + { Label17 Label + MoveScaled(0,0,47,4) + Expand = True + Text = ("Fold procedures by default") + } + { btnFoldProc SwitchButton + MoveScaled(50,0,8,4) + Animated = True + } + } + { HBox54 HBox + MoveScaled(1,25,66,4) + Spacing = True + Indent = True + { Label68 Label + MoveScaled(0,0,47,4) + Expand = True + Text = ("Activate version control") + } + { btnVersionControl SwitchButton + MoveScaled(50,0,8,4) + Animated = True + } + } + { HBox44 HBox + MoveScaled(1,30,66,4) + Spacing = True + Indent = True + { Label53 Label + MoveScaled(0,0,42,4) + Expand = True + Text = ("Restore files when loading a project") + } + { btnStartupLoad SwitchButton + MoveScaled(50,0,8,4) + Animated = True + } + } + { Label83 Label + MoveScaled(0,35,63,3) + Font = Font["Bold"] + Text = ("Images") + } + { panCompressPng Panel + MoveScaled(1,39,66,4) + Arrangement = Arrange.Horizontal + Spacing = True + Indent = True + { Label77 Label + MoveScaled(0,0,25,4) + AutoResize = True + Text = ("Compress PNG images with ") + } + { URLLabel1 URLLabel + MoveScaled(25,0,11,4) + #Translate = False + AutoResize = True + Text = "pngquant" + Link = "https://pngquant.org/" + } + { Spring3 Spring + MoveScaled(38,1,5,2) + } + { btnCompressPng SwitchButton + MoveScaled(50,0,8,4) + Animated = True + } + } + { Label82 Label + MoveScaled(0,46,63,3) + Font = Font["Bold"] + Text = ("Translation") + } + { panAutoTrans HBox + MoveScaled(1,50,66,4) + Spacing = True + Indent = True + { Label80 Label + MoveScaled(0,0,24,4) + AutoResize = True + Text = ("Automatic translation with ") + } + { URLLabel2 URLLabel + MoveScaled(23,0,14,4) + #Translate = False + AutoResize = True + Text = "translate-shell" + Link = "https://github.com/soimort/translate-shell" + } + { Spring4 Spring + MoveScaled(40,1,6,2) + } + { btnAutoTrans SwitchButton + MoveScaled(51,0,8,4) + Animated = True + } + } + { panAutoTransEngine HBox + MoveScaled(1,56,66,4) + Visible = False + Spacing = True + Indent = True + { Label81 Label + MoveScaled(0,0,43,4) + Expand = True + Text = ("Translation engine") + } + { cmbAutoTrans ComboBox + MoveScaled(50,0,16,4) + ReadOnly = True + } + } + Index = 2 + Text = ("Help & applications") + Picture = Picture["icon:/large/help"] + { Label46 Label + MoveScaled(1,0,63,3) + Font = Font["Bold"] + Text = ("Help") + } + { HBox5 HBox + MoveScaled(1,3,66,4) + Spacing = True + Indent = True + { Label23 Label + MoveScaled(0,0,47,4) + Expand = True + Text = ("Show documentation in popups") + } + { btnHelpCompletion SwitchButton + MoveScaled(48,0,8,4) + Animated = True + } + } + { HBox28 HBox + MoveScaled(1,8,66,4) + Spacing = True + Indent = True + { Label9 Label + MoveScaled(0,0,47,4) + Expand = True + Text = ("Always display optional messages") + } + { btnOptional SwitchButton + MoveScaled(48,0,8,4) + Animated = True + } + } + { Label72 Label + MoveScaled(0,14,63,3) + Font = Font["Bold"] + Text = ("Documentation") + } + { HBox49 HBox + MoveScaled(1,18,66,4) + Spacing = True + Indent = True + { Label59 Label + MoveScaled(0,0,47,4) + Expand = True + Text = ("Use offline documentation") + } + { btnOfflineHelp SwitchButton + MoveScaled(48,0,8,4) + Animated = True + } + } + { panDownloadHelp HBox + MoveScaled(1,23,62,7) + Indent = True + { VBox1 VBox + MoveScaled(0,0,60,7) + Expand = True + { lblDocumentation Label + MoveScaled(0,0,35,3) + Font = Font["Italic,-1"] + Alignment = Align.TopNormal + } + { panDownload HBox + MoveScaled(1,3,57,4) + Spacing = True + { btnDownload Button + MoveScaled(0,0,27,4) + AutoResize = True + Text = ("Download documentation") + Picture = Picture["icon:/small/download"] + } + { btnCancelDownload Button + MoveScaled(27,0,4,4) + Visible = False + Picture = Picture["icon:/small/cancel"] + } + { pgbDownload ProgressBar + MoveScaled(33,0,18,4) + Visible = False + Expand = True + } + } + } + } + { panProxyConfig HBox + MoveScaled(1,33,66,4) + Indent = True + { btnProxy Button + MoveScaled(0,0,31,4) + AutoResize = True + Text = ("Proxy configuration") & "..." + Picture = Picture["icon:/small/internet"] + } + } + { Panel4 HBox + MoveScaled(1,38,66,4) + Visible = False + Indent = True + { btnClearCache Button + MoveScaled(0,0,31,4) + AutoResize = True + Text = ("Clear documentation cache") + Picture = Picture["icon:/small/trash"] + } + } + { Label45 Label + MoveScaled(1,44,63,3) + Font = Font["Bold"] + Text = ("Applications") + } + { HBox12 HBox + MoveScaled(1,49,66,4) + Spacing = True + Indent = True + { Label13 Label + MoveScaled(0,0,43,4) + Expand = True + Text = ("Browser") + } + { cmbBrowser ComboBox + MoveScaled(46,0,20,4) + ReadOnly = True + } + } + { HBox2 HBox + MoveScaled(1,54,66,4) + Spacing = True + Indent = True + { Label4 Label + MoveScaled(0,0,44,4) + Expand = True + Text = ("Terminal") + } + { cmbTerminal ComboBox + MoveScaled(46,0,20,4) + ReadOnly = True + } + } + Index = 3 + Text = ("Editor") + Picture = Picture["icon:/large/edit"] + { Label44 Label + MoveScaled(0,1,63,3) + Font = Font["Bold"] + Text = ("Editor") + } + { HBox38 HBox + MoveScaled(1,5,66,4) + Spacing = True + Indent = True + { Label36 Label + MoveScaled(0,0,47,4) + Expand = True + Text = ("Show indentation with vertical lines") + } + { btnShowIndent SwitchButton + MoveScaled(50,0,8,4) + Animated = True + } + } + { HBox17 HBox + MoveScaled(1,10,66,4) + Spacing = True + Indent = True + { Label6 Label + MoveScaled(0,0,47,4) + Expand = True + Text = ("Highlight current line") + } + { btnShowCurrent SwitchButton + MoveScaled(50,0,8,4) + Animated = True + } + } + { HBox16 HBox + MoveScaled(1,15,66,4) + Spacing = True + Indent = True + { Label7 Label + MoveScaled(0,0,47,4) + Expand = True + Text = ("Highlight modified lines") + } + { btnShowChange SwitchButton + MoveScaled(50,0,8,4) + Animated = True + } + } + { HBox15 HBox + MoveScaled(1,20,66,4) + Spacing = True + Indent = True + { Label8 Label + MoveScaled(0,0,47,4) + Expand = True + Text = ("Show line numbers") + } + { btnShowLineNumber SwitchButton + MoveScaled(50,0,8,4) + Animated = True + } + } + { HBox42 HBox + MoveScaled(1,25,66,4) + Spacing = True + Indent = True + { Label50 Label + MoveScaled(0,0,47,4) + Expand = True + Text = ("Procedure folding") + } + { btnFold SwitchButton + MoveScaled(50,0,8,4) + Animated = True + } + } + { HBox18 HBox + MoveScaled(1,30,66,4) + Spacing = True + Indent = True + { Label5 Label + MoveScaled(0,0,46,4) + Expand = True + Text = ("Procedure separation") + } + { btnShowLimit SwitchButton + MoveScaled(50,0,8,4) + Animated = True + } + } + { HBox29 HBox + MoveScaled(1,35,66,4) + Spacing = True + Indent = True + { Label25 Label + MoveScaled(0,0,47,4) + Expand = True + Text = ("Show spaces at end of line with dots") + } + { btnShowSpaces SwitchButton + MoveScaled(50,0,8,4) + Animated = True + } + } + { HBox51 HBox + MoveScaled(1,40,66,4) + Spacing = True + Indent = True + { Label62 Label + MoveScaled(0,0,47,4) + Expand = True + Text = ("Show Preview") + } + { btnShowPreview SwitchButton + MoveScaled(50,0,8,4) + Animated = True + } + } + { HBox20 HBox + MoveScaled(1,45,66,4) + Visible = False + Spacing = True + Indent = True + { Label20 Label + MoveScaled(0,0,47,4) + Expand = True + Text = ("Keywords in upper case") + } + { btnUpperCaseKeywords SwitchButton + MoveScaled(50,0,8,4) + Animated = True + } + } + { HBox56 HBox + MoveScaled(1,50,66,4) + Spacing = True + Indent = True + { Label70 Label + MoveScaled(0,0,47,4) + Expand = True + Text = ("Separate static symbols in method selector") + } + { btnSeparateStatic SwitchButton + MoveScaled(50,0,8,4) + Animated = True + } + } + Index = 4 + Text = ("Code formatting") + Picture = Picture["icon:/large/wizard"] + { Label52 Label + MoveScaled(1,0,63,3) + Font = Font["Bold"] + Text = ("Automatic formatting") + } + { HBox25 HBox + MoveScaled(1,4,66,4) + Spacing = True + Indent = True + { Label22 Label + MoveScaled(0,0,47,4) + Expand = True + Text = ("Control structure completion") + } + { btnControlStructCompletion SwitchButton + MoveScaled(50,0,8,4) + Animated = True + } + } + { HBox43 HBox + MoveScaled(1,9,66,4) + Spacing = True + Indent = True + { Label51 Label + MoveScaled(0,0,47,4) + Expand = True + Text = ("Local variable declaration") + } + { btnLocalVarDecl SwitchButton + MoveScaled(50,0,8,4) + Animated = True + } + } + { HBox47 HBox + MoveScaled(1,14,66,4) + Spacing = True + Indent = True + { Label56 Label + MoveScaled(0,0,47,4) + Expand = True + Text = ("Comments insertion") + } + { btnComment SwitchButton + MoveScaled(50,0,8,4) + Animated = True + } + } + { HBox52 HBox + MoveScaled(1,19,66,4) + Spacing = True + Indent = True + { Label64 Label + MoveScaled(0,0,47,4) + Expand = True + Text = ("Close braces, brackets") & "..." + } + { btnCloseBraces SwitchButton + MoveScaled(50,0,8,4) + Animated = True + } + } + { HBox64 HBox + MoveScaled(1,24,66,4) + Spacing = True + Indent = True + { Label79 Label + MoveScaled(0,0,47,4) + Expand = True + Text = ("Close strings") + } + { btnCloseStrings SwitchButton + MoveScaled(50,0,8,4) + Animated = True + } + } + { Label48 Label + MoveScaled(1,31,63,3) + Font = Font["Bold"] + Text = ("Explicit formating") + } + { HBox33 HBox + MoveScaled(1,35,66,4) + Spacing = True + Indent = True + { Label31 Label + MoveScaled(0,0,47,4) + Expand = True + Text = ("Format on load & save") + } + { btnFormatOnLoad SwitchButton + MoveScaled(50,0,8,4) + Animated = True + } + } + { HBox30 HBox + MoveScaled(1,40,66,4) + Spacing = True + Indent = True + { Label28 Label + MoveScaled(0,0,47,4) + Expand = True + Text = ("Indent local variable declaration") + } + { btnIndentDim SwitchButton + MoveScaled(50,0,8,4) + Animated = True + } + } + { HBox31 HBox + MoveScaled(1,45,66,4) + Spacing = True + Indent = True + { Label29 Label + MoveScaled(0,0,47,4) + Expand = True + Text = ("Remove useless spaces at end of line") + } + { btnRemoveSpace SwitchButton + MoveScaled(50,0,8,4) + Animated = True + } + } + { HBox32 HBox + MoveScaled(1,50,66,4) + Spacing = True + Indent = True + { Label30 Label + MoveScaled(0,0,47,4) + Expand = True + Text = ("Keep successive void lines") + } + { btnKeepVoidLine SwitchButton + MoveScaled(50,0,8,4) + Animated = True + } + } + Index = 5 + Text = ("Code snippets") + Picture = Picture["icon:/large/insert-text"] + { Label47 Label + MoveScaled(1,0,63,3) + Font = Font["Bold"] + Text = ("Code snippets") + } + { HBox9 HBox + MoveScaled(1,4,66,4) + Spacing = True + { Label55 Label + MoveScaled(0,0,47,4) + Expand = True + Text = ("Activate code snippets") + } + { btnCodeSnippet SwitchButton + MoveScaled(50,0,8,4) + Animated = True + } + } + { Panel9 HBox + MoveScaled(1,9,66,25) + Expand = True + { HBox27 VBox + MoveScaled(0,0,65,24) + Expand = True + Spacing = True + { gvwSnippet GridView + MoveScaled(4,2,33,16) + Expand = True + Mode = Select.Single + ScrollBar = Scroll.Vertical + } + { VBox2 HBox + MoveScaled(1,19,62,4) + Spacing = True + { btnInsertSnippet Button + MoveScaled(0,0,17,4) + AutoResize = True + Text = Shortcut(("New"), "N") & "..." + Picture = Picture["icon:/small/new"] + } + { btnImportSnippet Button + MoveScaled(0,25,17,4) + Visible = False + AutoResize = True + Text = Shortcut(("Import"), "I") & "..." + Picture = Picture["icon:/small/open"] + } + { btnEditSnippet Button + MoveScaled(18,0,17,4) + AutoResize = True + Text = Shortcut(("Edit"), "E") & "..." + Picture = Picture["icon:/small/edit"] + } + { btnRemoveSnippet Button + MoveScaled(36,0,17,4) + AutoResize = True + Text = Shortcut(("Remove"), "R") + Picture = Picture["icon:/small/delete"] + } + } + } + } + Index = 6 + Text = ("Interface") + Picture = Picture["icon:/large/view-icon"] + { Label43 Label + MoveScaled(0,1,63,3) + Font = Font["Bold"] + Text = ("Interface") + } + { HBox58 HBox + MoveScaled(1,5,66,4) + Spacing = True + Indent = True + { Label57 Label + MoveScaled(0,0,42,4) + Expand = True + Text = ("Activate animations") + } + { btnAnimation SwitchButton + MoveScaled(43,0,8,4) + Animated = True + } + } + { HBox59 HBox + MoveScaled(1,10,66,4) + Spacing = True + Indent = True + { Label71 Label + MoveScaled(0,0,42,4) + Expand = True + Text = ("Show shadows") + } + { btnShadow SwitchButton + MoveScaled(43,0,8,4) + Animated = True + } + } + { HBox3 HBox + MoveScaled(1,15,66,4) + Spacing = True + Indent = True + { Label10 Label + MoveScaled(0,0,42,4) + Expand = True + Text = ("Show tooltips") + } + { btnTooltip SwitchButton + MoveScaled(43,0,8,4) + Animated = True + } + } + { HBox26 HBox + MoveScaled(1,20,66,4) + Spacing = True + Indent = True + { Label15 Label + MoveScaled(0,0,42,4) + Expand = True + Text = ("Use utility windows") + } + { btnUtility SwitchButton + MoveScaled(43,0,8,4) + Animated = True + } + } + { HBox41 HBox + MoveScaled(1,25,66,4) + Spacing = True + Indent = True + { Label39 Label + MoveScaled(0,0,47,4) + Expand = True + Text = ("Close tabs with middle mouse click") + } + { btnCloseWithMiddleClick SwitchButton + MoveScaled(43,0,8,4) + Animated = True + } + } + { HBox48 HBox + MoveScaled(1,30,66,4) + Spacing = True + Indent = True + { Label58 Label + MoveScaled(0,0,42,4) + Expand = True + Text = ("Show file name in window title") + } + { btnShowFileInTitle SwitchButton + MoveScaled(43,0,8,4) + Animated = True + } + } + { HBox57 HBox + MoveScaled(1,35,66,4) + Spacing = True + Indent = True + { Label49 Label + MoveScaled(0,0,47,4) + Expand = True + Text = ("Show debugging panel if needed") + } + { btnShowDebug SwitchButton + MoveScaled(43,0,8,4) + Animated = True + } + } + { Panel7 Panel + MoveScaled(23,40,4,1) + } + { Label1 Label + MoveScaled(1,40,63,3) + Font = Font["Bold"] + Text = ("Layout") + } + { Panel6 HBox + MoveScaled(1,45,63,16) + Expand = True + Spacing = True + { gvwLayout GridView + MoveScaled(0,0,39,15) + Expand = True + Mode = Select.Single + Grid = False + } + { VBox3 VBox + MoveScaled(40,0,19,12) + Spacing = True + { btnSaveLayout Button + MoveScaled(0,0,19,4) + AutoResize = True + Text = ("Save") & "..." + Picture = Picture["icon:/small/save"] + } + { btnDeleteLayout Button + MoveScaled(0,5,19,4) + AutoResize = True + Text = ("Delete") + Picture = Picture["icon:/small/delete"] + } + } + } + Index = 7 + Text = ("Fonts") + Picture = Picture["icon:/large/font"] + { Label42 Label + MoveScaled(1,1,63,3) + Font = Font["Bold"] + Text = ("Fonts") + } + { HBox6 HBox + MoveScaled(1,5,66,4) + Spacing = True + Indent = True + { Label11 Label + MoveScaled(0,0,12,4) + Expand = True + Text = ("Default font") + } + { txtGlobalFont FontBox + MoveScaled(23,0,42,4) + } + } + { HBox45 HBox + MoveScaled(1,10,66,4) + Spacing = True + Indent = True + { Label24 Label + MoveScaled(0,0,20,4) + Expand = True + Text = ("Global size") + } + { cmbProjectFontSize ComboBox + MoveScaled(23,0,11,4) + #Translate = False + ReadOnly = True + List = ["100 %", "95 %", "90 %", "85 %", "80 %", "75 %", "70 %"] + } + { Panel25 Panel + MoveScaled(35,0,30,4) + } + } + { HBox19 HBox + MoveScaled(1,15,66,4) + Spacing = True + Indent = True + { Label19 Label + MoveScaled(0,0,21,4) + Expand = True + Text = ("Title size") + } + { cmbTitleFontSize ComboBox + MoveScaled(23,0,11,4) + #Translate = False + ReadOnly = True + List = ["100 %", "95 %", "90 %", "85 %", "80 %", "75 %", "70 %"] + } + { Panel24 Panel + MoveScaled(35,0,30,4) + } + } + { HBox63 HBox + MoveScaled(1,20,66,4) + Spacing = True + Indent = True + { Label78 Label + MoveScaled(0,0,20,4) + Expand = True + Text = ("Debugger size") + } + { cmbDebuggerFontSize ComboBox + MoveScaled(23,0,11,4) + #Translate = False + ReadOnly = True + List = ["100 %", "95 %", "90 %", "85 %", "80 %", "75 %", "70 %"] + } + { Panel5 Panel + MoveScaled(35,0,30,4) + } + } + { HBox23 HBox + MoveScaled(1,25,66,4) + Spacing = True + Indent = True + { Label26 Label + MoveScaled(0,0,20,4) + Expand = True + Text = ("Editor") + } + { txtEditorFont FontBox + MoveScaled(23,0,42,4) + } + } + { HBox24 HBox + MoveScaled(1,30,66,4) + Spacing = True + Indent = True + { Label18 Label + MoveScaled(0,0,20,4) + Expand = True + Text = ("Console") + } + { txtConsoleFont FontBox + MoveScaled(23,0,42,4) + } + } + { HBox65 HBox + MoveScaled(1,35,66,4) + Spacing = True + Indent = True + { Label84 Label + MoveScaled(0,0,20,4) + Expand = True + Text = ("Printing") + } + { txtPrintFont FontBox + MoveScaled(23,0,42,4) + } + } + { Label74 Label + MoveScaled(1,40,63,3) + Font = Font["Bold"] + Text = ("Help") + } + { HBox60 HBox + MoveScaled(1,44,66,4) + Spacing = True + Indent = True + { Label73 Label + MoveScaled(0,0,20,4) + Expand = True + Text = ("Default font") + } + { txtHelpDefaultFont FontBox + MoveScaled(23,0,42,4) + } + } + { HBox61 HBox + MoveScaled(1,49,66,4) + Spacing = True + Indent = True + { Label75 Label + MoveScaled(0,0,20,4) + Expand = True + Text = ("Fixed font") + } + { txtHelpFixedFont FontBox + MoveScaled(23,0,42,4) + } + } + { HBox62 HBox + MoveScaled(1,54,66,4) + Spacing = True + Indent = True + { Label76 Label + MoveScaled(0,0,22,4) + Expand = True + Text = ("Zoom (browser excepted)") + } + { cmbHelpZoom ComboBox + MoveScaled(23,0,11,4) + #Translate = False + ReadOnly = True + List = ["100 %", "95 %", "90 %", "85 %", "80 %", "75 %", "70 %"] + } + { Panel2 Panel + MoveScaled(35,0,30,4) + } + } + { Spring1 Spring + MoveScaled(31,58,7,2) + } + { HBox46 HBox + MoveScaled(1,60,66,4) + Spacing = True + Indent = True + { Spring2 Spring + MoveScaled(8,0,5,4) + } + { btnInstallFont Button + MoveScaled(23,0,35,4) + AutoResize = True + Text = ("Install Gambas font for code edition") & "..." + } + } + Index = 8 + Text = ("Background") + Picture = Picture["icon:/large/image"] + { Label14 Label + MoveScaled(1,1,15,3) + Font = Font["Bold"] + Text = ("Background") + } + { svwBackground ScrollView + MoveScaled(2,5,63,42) + Background = Color.TextBackground + Expand = True + Arrangement = Arrange.Row + Margin = True + ScrollBar = Scroll.Vertical + } + { choBackgroundColor ColorPalette + MoveScaled(2,50,65,5) + ReadOnly = True + } + { Panel8 HBox + MoveScaled(2,56,66,4) + { PictureBox1 PictureBox + MoveScaled(0,0,4,4) + Padding = 4 + Picture = Picture["icon:/large/brightness"] + Mode = PictureBox.Fill + } + { sldBackgroundBrightness Slider + MoveScaled(6,0,59,4) + Expand = True + MaxValue = 255 + Step = 16 + PageStep = 16 + Value = 128 + } + } + Index = 9 + Text = ("Themes") + Picture = Picture["icon:/large/color"] + { Label27 Label + MoveScaled(0,1,63,3) + Font = Font["Bold"] + Text = ("Themes") + } + { HBox11 HBox + MoveScaled(1,5,65,4) + Spacing = True + Indent = True + { Label12 Label + MoveScaled(0,0,18,4) + Expand = True + Text = ("Icon theme") + } + { cmbIconTheme ComboBox + MoveScaled(27,0,38,4) + ReadOnly = True + } + } + { HBox1 HBox + MoveScaled(1,10,65,4) + Indent = True + { Label54 Label + MoveScaled(0,0,22,4) + Expand = True + Text = ("Highlighting theme") + } + { cmbTheme ComboBox + MoveScaled(27,0,25,4) + ReadOnly = True + } + { Panel1 Panel + MoveScaled(52,0,1,4) + } + { btnImport ToolButton + MoveScaled(53,0,4,4) + ToolTip = ("Import theme") + Picture = Picture["icon:/small/open"] + } + { btnExport ToolButton + MoveScaled(57,0,4,4) + ToolTip = ("Export theme") + Picture = Picture["icon:/small/save"] + } + { btnUndo ToolButton + MoveScaled(61,0,4,4) + ToolTip = ("Undo") + Picture = Picture["icon:/small/undo"] + } + } + { HBox55 HBox + MoveScaled(1,15,66,4) + Spacing = True + Indent = True + { Label69 Label + MoveScaled(0,0,47,4) + Expand = True + Text = ("Invert colors for dark themes") + } + { btnInvertTheme SwitchButton + MoveScaled(48,0,8,4) + Animated = True + } + } + { svwTheme ScrollView + MoveScaled(1,27,64,29) + Foreground = Color.TextForeground + Expand = True + Arrangement = Arrange.Vertical + Spacing = True + Padding = 4 + Border = False + ScrollBar = Scroll.Vertical + } + Index = 0 + } +} + +# Gambas Action File 3.0 + +{ Actions + { Action option + Text = "Preferences" + Picture = "icon:/small/options" + } +} diff --git a/app/src/gambas3/.src/Options/FProxy.class b/app/src/gambas3/.src/Options/FProxy.class new file mode 100644 index 00000000..99c06f47 --- /dev/null +++ b/app/src/gambas3/.src/Options/FProxy.class @@ -0,0 +1,55 @@ +' Gambas class file + +Static Public Type As Integer +Static Public Host As String +Static Public Port As Integer +Static Public (User) As String +'Static Public Password As String + +Public Sub Run() As Boolean + + Return Not Me.ShowModal() + +End + +Public Sub btnOK_Click() + + Type = cmbType.Index + Host = Trim(txtHost.Text) + Port = txtPort.Value + User = Trim(txtUser.Text) + + If User Then Try Desktop.Passwords["/Proxy" &/ User] = txtPassword.Text + + Me.Close(True) + +End + +Public Sub btnCancel_Click() + + Me.Close + +End + + +Public Sub cmbType_Click() + + txtHost.Enabled = cmbType.Index > 1 + txtPassword.Enabled = cmbType.Index > 1 + txtPort.Enabled = cmbType.Index > 1 + txtUser.Enabled = cmbType.Index > 1 + +End + +Public Sub Form_Open() + + cmbType.Index = Type + txtHost.Text = Host + txtPort.Value = Port + txtUser.Text = User + + If User Then + txtPassword.Text = Desktop.Passwords["/Proxy" &/ User] + Endif + +End diff --git a/app/src/gambas3/.src/Options/FProxy.form b/app/src/gambas3/.src/Options/FProxy.form new file mode 100644 index 00000000..d4f40794 --- /dev/null +++ b/app/src/gambas3/.src/Options/FProxy.form @@ -0,0 +1,67 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,61,35) + Text = ("Proxy configuration") + Resizable = False + Spacing = True + Margin = True + { Label1 Label + MoveScaled(1,1,15,4) + Text = ("Type") + } + { Label2 Label + MoveScaled(1,6,15,4) + Text = ("Host") + } + { Label3 Label + MoveScaled(1,11,15,4) + Text = ("Port") + } + { Label4 Label + MoveScaled(1,16,15,4) + Text = ("User") + } + { Label5 Label + MoveScaled(1,21,15,4) + Text = ("Password") + } + { HBox1 HBox + MoveScaled(1,30,59,4) + Spacing = True + Invert = True + { btnCancel Button + MoveScaled(41,0,16,4) + Text = ("Cancel") + Cancel = True + } + { btnOK Button + MoveScaled(24,0,16,4) + Text = ("OK") + Default = True + } + } + { txtHost TextBox + MoveScaled(17,6,43,4) + Enabled = False + } + { cmbType ComboBox + MoveScaled(17,1,43,4) + ReadOnly = True + List = [("Default proxy"), ("No proxy"), ("HTTP proxy"), ("SOCKS5 proxy")] + } + { txtPort SpinBox + MoveScaled(17,11,12,4) + Enabled = False + MaxValue = 65535 + } + { txtUser TextBox + MoveScaled(17,16,43,4) + Enabled = False + } + { txtPassword TextBox + MoveScaled(17,21,43,4) + Enabled = False + Password = True + } +} diff --git a/app/src/gambas3/.src/Options/FSnippet.class b/app/src/gambas3/.src/Options/FSnippet.class new file mode 100644 index 00000000..4c5e975d --- /dev/null +++ b/app/src/gambas3/.src/Options/FSnippet.class @@ -0,0 +1,79 @@ +' Gambas class file + +Static Public NewTrigger As String + +Private $sTrigger As String +Private $hSampleCode As CSampleCode + +Public Sub Run(Optional sTrigger As String) As Boolean + + $sTrigger = sTrigger + + Return Not Me.ShowModal() + +End + +Public Sub btnOK_Click() + + Dim sTrigger As String + + sTrigger = String.LCase(Trim(txtTrigger.Text)) + txtTrigger.Text = sTrigger + If Not sTrigger Then + Balloon.Warning(("Please enter a trigger string."), txtTrigger) + Return + Endif + + If sTrigger <> $sTrigger Then + If CSampleCode.All.Exist(sTrigger) Then + Balloon.Warning(("This trigger string is already in use."), txtTrigger) + Return + Endif + Endif + + If $sTrigger Then + If sTrigger <> $sTrigger Then $hSampleCode.Rename(sTrigger) + $hSampleCode.Pattern = edtSnippet.Text + Else + $hSampleCode = New CSampleCode(sTrigger, edtSnippet.Text) + NewTrigger = sTrigger + Endif + + Me.Close(True) + +End + +Public Sub btnCancel_Click() + + Me.Close + +End + + +Public Sub Form_Open() + + Settings.Read(Me) + + txtTrigger.Text = $sTrigger + If $sTrigger Then + $hSampleCode = CSampleCode.All[$sTrigger] + edtSnippet.Text = $hSampleCode.Pattern + edtSnippet.ReadOnly = $hSampleCode.Default + txtTrigger.ReadOnly = $hSampleCode.Default + btnOK.Enabled = Not $hSampleCode.Default + Me.Title = ("Edit code snippet") + edtSnippet.SetFocus + Else + Me.Title = ("New code snippet") + txtTrigger.setFocus + Endif + + edtSnippet.ReadConfig + +End + +Public Sub Form_Close() + + Settings.Write(Me) + +End diff --git a/app/src/gambas3/.src/Options/FSnippet.form b/app/src/gambas3/.src/Options/FSnippet.form new file mode 100644 index 00000000..3835381d --- /dev/null +++ b/app/src/gambas3/.src/Options/FSnippet.form @@ -0,0 +1,43 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,66,56) + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + { HBox2 HBox + MoveScaled(1,1,64,4) + Spacing = True + { Label1 Label + MoveScaled(0,0,14,4) + AutoResize = True + Text = ("Trigger string") + } + { txtTrigger TextBox + MoveScaled(17,0,44,4) + Expand = True + } + } + { edtSnippet TextEditor + MoveScaled(1,6,64,43) + Expand = True + } + { HBox1 HBox + MoveScaled(1,51,64,4) + Spacing = True + { Panel1 Panel + MoveScaled(4,0,20,4) + Expand = True + } + { btnOK Button + MoveScaled(26,0,16,4) + Text = ("OK") + Default = True + } + { btnCancel Button + MoveScaled(43,0,16,4) + Text = ("Cancel") + Cancel = True + } + } +} diff --git a/app/src/gambas3/.src/Packager/FMakeInstall.class b/app/src/gambas3/.src/Packager/FMakeInstall.class new file mode 100644 index 00000000..ad657a99 --- /dev/null +++ b/app/src/gambas3/.src/Packager/FMakeInstall.class @@ -0,0 +1,1340 @@ +' Gambas class file + +Private $sMenuSystem As String +Private $sGroupSystem As String +Private $sDepSystem As String +Private $sFileSystem As String +Private $cCatCache As New Collection +Private $sLastCat As String +Private $aDep As String[] +Private $aFile As String[] + +Private Const TAB_GROUP As Integer = 3 +Private Const TAB_MENU As Integer = 4 +Private Const TAB_MIME As Integer = 5 +Private Const TAB_DEP As Integer = 6 +Private Const TAB_FILE As Integer = 7 +Private Const TAB_TEST As Integer = 8 +Private Const TAB_DIR As Integer = 9 +Private Const TAB_CREATE As Integer = 10 + +Private Sub HasDebianTarget() As Boolean + + If Project.Systems.Exist("debian") Or If Project.Systems.Exist("ubuntu") Then Return True + +End + + +Private Sub MakeChangeLog() As String + + Dim aLine As String[] + Dim sLine As String + Dim sChangeLog As String + + aLine = Split(txtChange.Text, "\n") + For Each sLine In aLine + sLine = Trim(sLine) + If Not sLine Then Continue + If Left(sLine) <> "-" Then sLine = "- " & sLine + sChangeLog &= sLine & "\n" + Next + + sChangeLog = "* " & Package.GetChangeDate() & "\n" & sChangeLog & "\n" + + sChangeLog &= txtChangeLog.Text + Return sChangeLog + +End + +Public Sub Form_Open() + + If Project.Maintainer Then + txtName.Text = Project.Maintainer + Else + txtName.Text = Settings["/Identity/Name", User.Name] + Endif + + txtName.SelectAll + txtName.SetFocus + + If Project.Address Then + txtMail.Text = Project.Address + Else + txtMail.Text = Settings["/Identity/Mail", User.Name & "@" & System.Host] + Endif + + If Project.Vendor Then + txtVendor.Text = Project.Vendor + Else + txtVendor.Text = Settings["/Packager/Vendor"] + Endif + + If Project.VendorPrefix Then + txtVendorPrefix.Text = Project.VendorPrefix + Else + txtVendorPrefix.Text = Settings["/Packager/VendorPrefix"] + Endif + + If Project.License Then + txtLicense.Text = Project.License + Else + txtLicense.Text = Settings["/Packager/License", "General Public License"] + Endif + + If Project.Url Then + txtUrl.Text = Project.Url + Else + txtUrl.Text = Settings["/Packager/URL", Project.DEFAULT_URL] + Endif + + txtDescribe.Text = Project.Description + + Try txtChangeLog.Text = File.Load(Project.Dir &/ ".hidden" &/ "CHANGELOG") + txtChangeLog.Pos = 0 + txtTests.Text = Project.ExtraAutoconfTest + + If Project.Prefix + chkPrefix.Value = True + Else + chkPrefix.Value = Settings["/Packager/UsePrefix", False] + Endif + + chkPackageNameWithMajor.Value = Project.PackageNameWithMajor + + txtPackageVersion.Value = Max(1, Project.PackageVersion) + + chkSignature.Value = Project.PackageSignature + + spnVersionMin.MinValue = 0 + spnVersionMin.MaxValue = CInt(Split(System.FullVersion, ".")[1]) + If Project.RuntimeVersion Then + chkVersionMin.Value = True + spnVersionMin.Value = CInt(Split(Project.RuntimeVersion, ".")[1]) + Else + chkVersionMin.Value = False + spnVersionMin.Value = spnVersionMin.MaxValue + Endif + + Project.SetEditorFont(txtDesktop) + + 'InitSystemControls + InitSystems + + If Project.Type <> Project.TYPE_NORMAL Then + chkPrefix.Value = True + chkPrefix.Enabled = False + Endif + + UpdatePackageName + + cmbCategories.List = Split(File.Load("install/categories"), "\n", "", True) + + txtLicense.List = ["General Public License", "Freeware", "Public Domain", "Lesser General Public License", "Other License(s)", "Non-Free License"] + + chkCreateDir.Value = Project.CreateEachDirectory + + tvwDep.Columns.Count = 3 + tvwDep.Columns[0].Text = ("Package") + tvwDep.Columns[1].Text = ("Min. version") + tvwDep.Columns[2].Text = ("Max. version") + tvwDep.Columns[0].Width = Desktop.Scale * 32 + tvwDep.Columns[1].Width = Desktop.Scale * 16 + tvwDep.Columns[2].Width = Desktop.Scale * 16 + + tvwFile.Columns.Count = 2 + tvwFile.Columns[0].Text = ("File or directory") + tvwFile.Columns[1].Text = ("Destination directory") + tvwFile.Columns[0].Width = Desktop.Scale * 24 + tvwFile.Columns[1].Width = Desktop.Scale * 40 + 'tvwFile.Rows.H = Desktop.Scale * 4 + + chkDep.Value = Project.SameDependencies + chkFile.Value = Project.SameFiles + + lstMime.List = Project.MimeTypes + txtDesktop.Text = Project.ExtraDesktop + + edtLog.ReadConfig + edtLog.ShowModified = False + edtLog.ShowLineNumber = False + edtLog.ShowIcon = False + edtLog.ShowExpand = False + edtLog.ShowPosition = False + edtLog.Font = Font[Settings["/ConsoleFont", Project.DEFAULT_FONT]] + +End + +Public Sub wizInstall_Cancel() + + Me.Close + +End + +Private Sub UpdatePackageName() + + txtPackage.Text = Package.GetPackageFullName(txtVendor.Text, txtVendorPrefix.Text, chkPrefix.Value, chkPackageNameWithMajor.Value, True) + +End + + +Public Sub chkPrefix_Click() + + UpdatePackageName + +End + +Private Sub GetSystemControls() As Control[] + + Dim aObject As New Control[] + Dim hCtrl As Control + Dim hCont As Container + + For Each hCtrl In panSystem.Children + If Not hCtrl Is Container Then Continue + hCont = hCtrl + For Each hCtrl In hCont.Children + If hCtrl Is CheckBox Then + aObject.Add(hCtrl) + Endif + Next + Next + + Return aObject + +End + +Private Sub InitSystemControls() + + Dim hCtrl As Control + Dim hCont As HBox + Dim aMsg As New String[] + Dim sMsg As String + Dim hPanel As Panel + Dim hCheckBox As CheckBox + Dim hPictureBox As PictureBox + + Inc Application.Busy + + Package.CheckProgram + + For Each hCtrl In panSystem.Children + + If Not hCtrl Is Container Then Continue + hCont = hCtrl + + 'hCont.H = Desktop.Scale * 6 + sMsg = Package.CheckSystem(hCont.Tag) + If sMsg And If Not aMsg.Exist(sMsg) Then aMsg.Add(sMsg) + + hPanel = Null + For Each hCtrl In hCont.Children + If hCtrl Is PictureBox Then + hPictureBox = hCtrl + Else If hCtrl Is CheckBox Then + hCheckBox = hCtrl + Else If hCtrl Is Panel And If Panel(hCtrl).Tag Then + hPanel = hCtrl + Endif + Next + + hCheckBox.Enabled = Not sMsg + If Not hCheckBox.Enabled Then hCheckBox.Value = False + + With hPictureBox + .Enabled = hCheckBox.Value + .Width = hCont.H - hCont.Padding * 2 + End With + + Next + + If aMsg.Count Then + txtMessage.Text = aMsg.Join("
      ") + txtMessage.Show + Else + txtMessage.Hide + Endif + + Dec Application.Busy + +End + + +Private Sub InitSystems() + + Dim hCtrl As CheckBox + + For Each hCtrl In GetSystemControls() + hCtrl.Value = hCtrl.Enabled And Project.Systems.Find(hCtrl.Parent.Tag) >= 0 + Next + +End + +Public Sub wizInstall_Close() + + Project.WriteProject + + spnCreatePackage.Show + spnCreatePackage.Start + + ShowMessage(("Creating packages...")) + + If Not Package.Make() Then + ShowMessage(("The packages have been successfully created.")) + Endif + + spnCreatePackage.Stop + spnCreatePackage.Hide + +End + +Private Function CheckSys(cCol As Collection) As Boolean + + Dim sSys As String + + For Each sSys In Project.Systems + If sSys = "autotools" Or If sSys = "self" Then Continue + If Not cCol.Exist(sSys) Then Return True + Next + +End + + +Public Sub wizInstall_BeforeChange() + + Dim sFile As String + Dim aFile As String[] + Dim bEnabled As Boolean + Dim sSys As String + Dim aVer As String[] + + Select Case wizInstall.Index + + Case 0 + + ' If Project.Type = Project.TYPE_COMPONENT Then + ' + ' If InStr(Project.Name, ".") = 0 Then + ' Message.Warning(("Your project is a component, so its name must be prefixed by the vendor name followed by a dot:") & " <vendor>." & Project.Name & "\n\n" & ("Please rename your project if you want to create a package.")) + ' Stop Event + ' Return + ' Endif + ' + ' Endif + + + Project.Maintainer = Trim(txtName.Text) + Project.Address = Trim(txtMail.Text) + Project.Vendor = Trim(txtVendor.Text) + Project.VendorPrefix = Trim(txtVendorPrefix.Text) + Project.License = Trim(txtLicense.Text) + Project.Url = Trim(txtUrl.Text) + + If Not Project.Maintainer Then + Message.Warning(("Please enter your name.")) + Stop Event + Return + Endif + If Not Project.Address Then + Message.Warning(("Please enter your e-mail address.")) + Stop Event + Return + Endif + + If Project.Type = Project.TYPE_LIBRARY Then + If Not Project.Vendor Then + Message.Warning(("Please enter the vendor name.")) + Stop Event + Return + Endif + Endif + + Project.Description = txtDescribe.Text + Project.Prefix = chkPrefix.Value + Project.PackageName = txtPackage.Text + Project.PackageVersion = txtPackageVersion.Value + Project.PackageSignature = chkSignature.Value + Project.PackageNameWithMajor = chkPackageNameWithMajor.Value + + Case 1 + + If Not Trim(txtChange.Text) Then + If Message.Warning(("There is no CHANGELOG entry for this release."), ("Continue"), ("Cancel")) = 2 Then + Stop Event + Return + Endif + Endif + Package.ChangeLog = MakeChangeLog() + If Not Package.ChangeLog Then + Message.Warning(("Please enter the first CHANGELOG entry.")) + Stop Event + Return + Endif + + InitSystemControls + + Case 2 + + Project.Systems = GetSystems() + If Project.Systems.Count = 0 Then + Message.Warning(("Please choose at least one target distribution.")) + Stop Event + Return + Endif + + bEnabled = False + For Each sSys In Project.Systems + If sSys <> "autotools" And If sSys <> "self" Then + bEnabled = True + Break + Endif + Next + + wizInstall[TAB_GROUP].Enabled = bEnabled + wizInstall[TAB_MENU].Enabled = bEnabled + + bEnabled = False + For Each sSys In Project.Systems + If sSys <> "autotools" Then + bEnabled = True + Break + Endif + Next + + wizInstall[TAB_DEP].Enabled = bEnabled + wizInstall[TAB_FILE].Enabled = bEnabled + + wizInstall[TAB_TEST].Enabled = Project.Systems.Exist("autotools") + + If Project.Type <> Project.TYPE_NORMAL + wizInstall[TAB_MENU].Enabled = False + wizInstall[TAB_MIME].Enabled = False + Endif + + Case TAB_GROUP + + If CheckSys(Project.Groups) Then + If cmbGroup.Count > 1 Then + Message.Warning(("Please choose the package group for each target distribution.")) + Else + Message.Warning(("Please choose a package group.")) + Endif + Stop Event + Return + Endif + + Case TAB_MENU + + If CheckSys(Project.Menus) Then + If cmbMenu.Count > 1 Then + Message.Warning(("Please choose the menu location for each target distribution.")) + Else + Message.Warning(("Please choose a menu location.")) + Endif + Stop Event + Return + Endif + + Case TAB_MIME + + Project.MimeTypes = lstMime.List + Project.ExtraDesktop = Trim(txtDesktop.Text) + + Case TAB_DEP + + If chkVersionMin.Value Then + aVer = Split(System.FullVersion, ".") + aVer[1] = CStr(spnVersionMin.Value) + Project.RuntimeVersion = aVer[0] & "." & aVer[1] + Else + Project.RuntimeVersion = "" + Endif + + Case TAB_FILE + + tvwFile.Save + For Each sFile In $aFile + aFile = Scan(sFile, "*\t*") + If Not Exist(Project.Dir &/ ".hidden" &/ aFile[0]) Then + Message.Warning(Subst(("Cannot found extra file: &1"), aFile[0])) + Stop Event + Return + Endif + + If aFile[1] = "" Then + Message.Warning(("Please choose a target directory for each extra file.")) + Stop Event + Return + Endif + + If HasDebianTarget() Then + + If InStr(aFile[0], " ") Then + Message.Warning(("Debian packaging system cannot handle spaces in file names.")) + Stop Event + Return + Endif + + If InStr(aFile[1], " ") Then + Message.Warning(("Debian packaging system cannot handle spaces in directories.")) + Stop Event + Return + Endif + + Endif + Next + + Case TAB_TEST + + Project.ExtraAutoconfTest = txtTests.Text + + Case TAB_DIR + + Package.Dir = dchInstall.SelectedPath + If Package.Dir = Project.Dir Or If Package.Dir Begins Project.Dir &/ "/" Then + Message.Warning(("The package cannot be stored inside the project directory.")) + Stop Event + Return + Endif + + Project.Config["/Package/Dir"] = Project.TildePath(Package.Dir) + + Case TAB_CREATE + + ' If chkSignature.Value And If Not txtPassPhrase.Text Then + ' txtPassPhrase.SetFocus + ' Balloon.Warning(("Please enter your passphrase."), txtPassPhrase) + ' Stop Event + ' Return + ' Endif + ' Package.Signature = If(chkSignature.Value, txtPassPhrase.Text, "") + + End Select + +End + +Private Sub UpdateDepCombo() + + If chkDep.Value Then + cmbDep.Hide + cmbDep.Index = 0 + Else + cmbDep.Visible = cmbDep.Count > 1 + Endif + +End + +Private Sub UpdateFileCombo() + + If chkFile.Value Then + cmbFile.Hide + cmbFile.Index = 0 + Else + cmbFile.Visible = cmbFile.Count > 1 + Endif + +End + +Public Sub wizInstall_Change() + + Select Case wizInstall.Index + + Case 1 + lblChangeDate.Text = Package.GetChangeDate() + If Not txtChangeLog.Text Then txtChange.Text = ("Initial release") + txtChange.SetFocus + + Case TAB_GROUP + InitGroupTree + cmbGroup.Visible = cmbGroup.Count > 1 + + Case TAB_MENU + InitMenuTree + cmbMenu.Visible = cmbMenu.Count > 1 + + Case TAB_MIME + lstMime.SetFocus + + Case TAB_DEP + FillComboWithSystems(cmbDep) + chkDep.Visible = cmbDep.Count > 1 + UpdateDepCombo + 'cmbDep_Click + + Case TAB_FILE + FillComboWithSystems(cmbFile) + chkFile.Visible = cmbFile.Count > 1 + UpdateFileCombo + 'cmbFile_Click + + Case TAB_DIR + dchInstall.SelectedPath = Project.UntildePath(Project.Config["/Package/Dir", Settings["/FMakeInstall/PackagePath", "~"]]) + + Case TAB_CREATE + chkSignature.Value = Settings["/FMakeInstall/SignPackage", False] + panError.Hide + + End Select + + btnCreateNow.Visible = wizInstall.Index <> TAB_CREATE + +End + +Private Function GetSystems() As String[] + + Dim hCtrl As CheckBox + Dim aSys As New String[] + + For Each hCtrl In GetSystemControls() + If hCtrl.Value Then aSys.Add(hCtrl.Parent.Tag) + Next + + Return aSys + +End + + + +Private Function GetSystemFromName(sName As String) As String + + Dim hCtrl As CheckBox + + For Each hCtrl In GetSystemControls() + If Replace(hCtrl.Text, "&", "") = sName Then Return hCtrl.Parent.Tag + Next + +End + + +Public Function GetSystemName(sTag As String) As String + + Dim hCtrl As CheckBox + + For Each hCtrl In GetSystemControls() + If hCtrl.Parent.Tag = sTag Then Return Replace(hCtrl.Text, "&", "") + Next + +End + + + +Public Sub AddLog(sText As String, Optional bNoNewLine As Boolean) + + If Not bNoNewLine Then sText &= "\n" + edtLog.Goto(0, edtLog.Count) + edtLog.ReadOnly = False + edtLog.Print(sText) + edtLog.ReadOnly = True + Wait + +End + +Public Sub ClearLog() + + edtLog.Clear + Wait + +End + + +Private Sub FillComboWithSystems(hCombo As ComboBox) + + Dim sSys As String + Dim hCtrl As CheckBox + + hCombo.Clear + + For Each hCtrl In GetSystemControls() + sSys = hCtrl.Parent.Tag + If hCombo = cmbDep Or If hCombo = cmbFile Then + If sSys = "autotools" Then Continue + Else If hCombo = cmbGroup Or If hCombo = cmbMenu Then + If sSys = "autotools" Or If sSys = "self" Then Continue + Endif + If hCtrl.Value Then hCombo.Add(GetSystemName(sSys)) + Next + + hCombo.Index = 0 + +End + + +Private Sub InitMenuTree() + + FillComboWithSystems(cmbMenu) + +End + + +Private Sub InitGroupTree() + + FillComboWithSystems(cmbGroup) + +End + +Private Sub FindCategoriesFromMenu(sMenu As String) As String + + Dim sCat As String + Dim aCat As New String[] + + sMenu = Replace(sMenu, " ", "") + + For Each sCat In Split(sMenu, "/") + If cmbCategories.Find(sCat) >= 0 Then aCat.Add(sCat) + Next + + Return aCat.Join(";") + +End + + +Private Sub FillTreeWith(hTree As TreeView, sTitle As String, sIcon As String, sFile As String, hTextBox As TextBox, sSelect As String, Optional bCat As Boolean) + + Dim hFile As File + Dim sLig As String + Dim iLevel As Integer + Dim iNewLevel As Integer + Dim sParent As String + Dim sKey As String + Dim iPos As Integer + Dim sCat As String + Dim sAdd As String + Dim sElt As String + + hTree.Clear + hTree.Add("/", sTitle, Picture[sIcon]).Expanded = True + sParent = "/" + + If bCat Then + $cCatCache.Clear + $sLastCat = "" + Endif + + hFile = Open sFile + + While Not Eof(hFile) + + Line Input #hFile, sLig + sLig = RTrim(sLig) + If Not sLig Then Continue + + If bCat Then + iPos = InStr(sLig, "#") + If iPos Then + sCat = Trim(Mid(sLig, iPos + 1)) + sLig = RTrim(Left(sLig, iPos - 1)) + Else + sCat = "" + Endif + Endif + + If InStr(sLig, "/") Then + + sKey = "/" + sParent = "/" + + For Each sElt In Split(Trim(sLig), "/") + sKey &/= sElt + If Not hTree.Exist(sKey) Then + hTree.Add(sKey, File.Name(sKey),, sParent).Expanded = True + hTree[sParent].Expanded = True + Endif + sParent = sKey + Next + + sParent = File.Dir(sLig) + If sParent = "" Then sParent = "/" + sLig = File.Name(sLig) + + Else + + iNewLevel = Len(sLig) - Len(LTrim(sLig)) + + If iNewLevel > iLevel Then + sParent = sKey + Else If iNewLevel < iLevel Then + While iLevel > iNewLevel + hTree.MoveTo(sParent) + If hTree.MoveParent() Then + sParent = "" + Else + sParent = hTree.Item.Key + Endif + Dec iLevel + Wend + Endif + + iLevel = iNewLevel + + If sParent = "" Then sParent = "/" + sKey = sParent &/ Trim(sLig) + + hTree.Add(sKey, Trim(sLig),, sParent) + hTree[sParent].Expanded = True + 'DEBUG sKey + + Endif + + If bCat Then + sAdd = FindCategoriesFromMenu(sKey) + If sAdd And If sCat Then sCat &= ";" + $cCatCache[sKey] = sCat & sAdd + Endif + + Wend + + Close #hFile + + sSelect = "/" &/ sSelect + hTextBox.Clear + If sSelect Then + Try hTree[sSelect].Selected = True + Try hTree[sSelect].EnsureVisible + Endif + +End + + + +Public Sub cmbMenu_Click() + + $sMenuSystem = GetSystemFromName(cmbMenu.Text) + + cmbCategories.Text = Project.Categories[$sMenuSystem] + FillTreeWith(tvwMenu, ("Menus"), "img/16/menu.png", "install/menu" &/ $sMenuSystem, txtMenu, Project.Menus[$sMenuSystem], True) + +End + +Private Sub AddCategory(sAdd As String) + + Dim sAll As String = cmbCategories.Text & ";" & sAdd + Dim aCat As New String[] + Dim sCat As String + + For Each sCat In Split(sAll, ";").Sort() + If Not sCat Then Continue + If aCat.Exist(sCat) Then Continue + aCat.Add(sCat) + Next + + cmbCategories.Text = aCat.Join(";") + +End + +Private Sub RemoveCategory(sAdd As String) + + Dim aRemove As String[] = Split(sAdd, ";") + Dim aCat As New String[] + Dim sCat As String + + For Each sCat In Split(cmbCategories.Text, ";").Sort() + If Not sCat Then Continue + If aRemove.Exist(sCat) Then Continue + aCat.Add(sCat) + Next + + cmbCategories.Text = aCat.Join(";") + +End + + + +Public Sub tvwMenu_Select() + + Dim sMenu As String + + If tvwMenu.Item.Children Then Return + + RemoveCategory($sLastCat) + $sLastCat = $cCatCache[tvwMenu.Key] + AddCategory($sLastCat) + + tvwMenu.MoveCurrent + While tvwMenu.Item.Key <> "/" + sMenu = tvwMenu.Item.Text &/ sMenu + tvwMenu.MoveParent + Wend + + txtMenu.Text = sMenu + + 'sSys = GetSystemFromName(cmbMenu.Text) + + Project.Menus[$sMenuSystem] = sMenu + Project.Categories[$sMenuSystem] = cmbCategories.Text + +End + +Public Sub cmbGroup_Click() + + $sGroupSystem = GetSystemFromName(cmbGroup.Text) + + txtGroup.Clear + FillTreeWith(tvwGroup, ("Groups"), "icon:/small/package", "install/group" &/ $sGroupSystem, txtMenu, Project.Groups[$sGroupSystem]) + +End + +Public Sub tvwGroup_Select() + + Dim sGroup As String + + tvwGroup.MoveCurrent + While tvwGroup.Item.Key <> "/" + sGroup = tvwGroup.Item.Text &/ sGroup + tvwGroup.MoveParent + Wend + + txtGroup.Text = sGroup + Project.Groups[GetSystemFromName(cmbGroup.Text)] = sGroup + +End + +Public Sub cmbCategories_LostFocus() + + AddCategory("") + Project.Categories[$sMenuSystem] = cmbCategories.Text + +End + +Public Sub cmbCategories_Click() + + Dim sCat As String = cmbCategories[cmbCategories.Index].Text + + cmbCategories.Text = Project.Categories[$sMenuSystem] + AddCategory(sCat) + Project.Categories[$sMenuSystem] = cmbCategories.Text + +End + +Public Sub tvwMenu_Collapse() + + tvwMenu.Item.Expanded = True + +End + +Public Sub tvwGroup_Collapse() + + tvwGroup.Item.Expanded = True + +End + +Public Sub cmbDep_Click() + + $sDepSystem = GetSystemFromName(cmbDep.Text) + + $aDep = Split(Project.ExtraDependencies[$sDepSystem], "\n") + tvwDep.Rows.Count = $aDep.Count + tvwDep.Refresh + 'txtGroup.Clear + 'lstDep.List = Split(Project.ExtraDependencies[$sDepSystem], ",") + +End + +Public Sub chkDistro_Click() + + Dim hCheckBox As CheckBox = Last + Dim hPictureBox As PictureBox = hCheckBox.Parent.Children[0] + + hPictureBox.Enabled = hCheckBox.Value + +End + +Public Sub txtVendor_Change() + + UpdatePackageName + +End + +Public Sub txtVendorPrefix_Change() + + UpdatePackageName + +End + +Public Sub chkCreateDir_Click() + + Project.CreateEachDirectory = chkCreateDir.Value + +End + +Public Sub tvwDep_Click() + + tvwDep.Edit + +End + +Public Sub tvwDep_Data(Row As Integer, Column As Integer) + + Dim aRow As String[] = Split($aDep[Row], "\t") + Try tvwDep.Data.Text = aRow[Column] + +End + +Private Sub SaveExtraDependencies() + + Project.ExtraDependencies[$sDepSystem] = $aDep.Join("\n") + +End + +Private Sub SaveExtraFiles() + + Project.ExtraFiles[$sFileSystem] = $aFile.Join("\n") + +End + + +Public Sub tvwDep_Save(Row As Integer, Column As Integer, Value As String) + + Dim aRow As String[] + Dim iInd As Integer + Dim sCar As String + + For iInd = 1 To String.Len(Value) + sCar = String.Mid$(Value, iInd, 1) + If Len(sCar) = 1 Then + If Column = 0 And If IsLetter(sCar) Then Continue + If IsDigit(sCar) Or If InStr("-._", sCar) Then Continue + Endif + Balloon.Warning(("Incorrect characters"), tvwDep, tvwDep.Editor.ScreenX - tvwDep.ScreenX + tvwDep.Editor.W / 2, tvwDep.Editor.ScreenY - tvwDep.ScreenY + tvwDep.Editor.H / 2) + Stop Event + Return + Next + + aRow = Split($aDep[Row], "\t") + + While aRow.Count < 3 + aRow.Add("") + Wend + + aRow[Column] = Value + $aDep[Row] = aRow.Join("\t") + SaveExtraDependencies + +End + +Public Sub btnAddDep_Click() + + $aDep.Add("\t\t") + SaveExtraDependencies + Inc tvwDep.Rows.Count + tvwDep.Save + tvwDep.MoveTo($aDep.Max, 0) + tvwDep.Edit + +End + +Public Sub tvwDep_Insert() + + btnAddDep.Value = True + +End + +Public Sub btnRemoveDep_Click() + + If tvwDep.Row < 0 Then Return + tvwDep.Cancel + $aDep.Remove(tvwDep.Row) + SaveExtraDependencies + Dec tvwDep.Rows.Count + +End + +Public Sub btnUpDep_Click() + + If tvwDep.Row >= 1 Then + tvwDep.Save + Swap $aDep[tvwDep.Row], $aDep[tvwDep.Row - 1] + SaveExtraDependencies + tvwDep.Refresh + Dec tvwDep.Row + tvwDep.Edit + Endif + +End + +Public Sub btnDownDep_Click() + + If tvwDep.Row < $aDep.Max Then + tvwDep.Save + Swap $aDep[tvwDep.Row], $aDep[tvwDep.Row + 1] + SaveExtraDependencies + tvwDep.Refresh + Inc tvwDep.Row + tvwDep.Edit + Endif + + +End + +Public Sub btnClearDep_Click() + + If Message.Warning(("Do you really want to remove all extra dependencies?"), ("Cancel"), ("Remove")) <> 2 Then Return + tvwDep.Cancel + $aDep.Clear + SaveExtraDependencies + tvwDep.Rows.Count = 0 + +End + +Public Sub chkDep_Click() + + Project.SameDependencies = chkDep.Value + UpdateDepCombo + +End + +Public Sub chkFile_Click() + + Project.SameFiles = chkFile.Value + UpdateFileCombo + +End + +Public Sub cmbFile_Click() + + $sFileSystem = GetSystemFromName(cmbFile.Text) + + $aFile = Split(Project.ExtraFiles[$sFileSystem], "\n") + tvwFile.Rows.Count = $aFile.Count + tvwFile.Refresh + +End + +Public Sub tvwFile_Insert() + + btnAddFile.Value = True + +End + + +Public Sub tvwFile_Data(Row As Integer, Column As Integer) + + Dim aRow As String[] = Split($aFile[Row], "\t") + Try tvwFile.Data.Text = aRow[Column] + +End + +Public Sub btnAddFile_Click() + + Dim sFic As String + + sFic = FSelectExtraFile.Run("") + If Not sFic Then Return + + $aFile.Add(sFic & "\t") + SaveExtraFiles + Inc tvwFile.Rows.Count + tvwFile.MoveTo($aFile.Max, 0) + 'tvwFile.Refresh + 'tvwFile.Current.Text = sFic + 'tvwFile.Save + 'tvwFile_Save(tvwFile.Row, tvwFile.Column, sFic) + +End + +Public Sub btnRemoveFile_Click() + + If tvwFile.Row < 0 Then Return + tvwFile.Cancel + $aFile.Remove(tvwFile.Row) + SaveExtraFiles + Dec tvwFile.Rows.Count + +End + +Public Sub btnUpFile_Click() + + If tvwFile.Row >= 1 Then + tvwFile.Save + Swap $aFile[tvwFile.Row], $aFile[tvwFile.Row - 1] + SaveExtraFiles + tvwFile.Refresh + Dec tvwFile.Row + Endif + +End + +Public Sub btnDownFile_Click() + + If tvwFile.Row < $aFile.Max Then + tvwFile.Save + Swap $aFile[tvwFile.Row], $aFile[tvwFile.Row + 1] + SaveExtraFiles + tvwFile.Refresh + Inc tvwFile.Row + Endif + +End + +Public Sub btnClearFile_Click() + + If Message.Warning(("Do you really want to remove all extra files?"), ("Cancel"), ("Remove")) <> 2 Then Return + tvwFile.Cancel + $aFile.Clear + SaveExtraFiles + tvwFile.Rows.Count = 0 + +End + +Public Sub tvwFile_Save(Row As Integer, Column As Integer, Value As String) + + Dim aRow As String[] + aRow = Split($aFile[Row], "\t") + + While aRow.Count < 2 + aRow.Add("") + Wend + + aRow[Column] = Value + $aFile[Row] = aRow.Join("\t") + SaveExtraFiles + +End + +Public Sub tvwFile_Click() + + tvwFile.EditWith(txtFileDest) + +End + +Public Sub txtFileDest_Click() + + Dim sFic As String + + If tvwFile.Column = 0 Then + + sFic = FSelectExtraFile.Run(tvwFile.Current.Text) + If Not sFic Then Return + + txtFileDest.Text = sFic + tvwFile.Save + + 'tvwFile.Current.Text = sFic + 'tvwFile_Save(tvwFile.Row, tvwFile.Column, sFic) + 'tvwFile.Refresh + ' tvwFile.Edit(Dir(Project.Dir, "*[^~]", gb.File), True) + + Else If tvwFile.Column = 1 Then + + Dialog.Title = ("Select the destination directory") + Dialog.Path = tvwFile.Current.Text + If Dialog.SelectDirectory() Then Return + + txtFileDest.Text = Dialog.Path + tvwFile.Save + + 'tvwFile.Current.Text = Dialog.Path + 'tvwFile_Save(tvwFile.Row, tvwFile.Column, Dialog.Path) + 'tvwFile.Refresh + + Endif + + +End + +Public Sub ShowError(sMsg As String) + + txtError.Text = Replace(sMsg, "\n", "
      ") + txtError.Foreground = Color.Red + spnCreatePackage.H = Desktop.Scale + panError.Show + +End + +Public Sub ShowMessage(sMsg As String) + + txtError.Text = Replace(sMsg, "\n", "
      ") + txtError.Foreground = Color.TextForeground + spnCreatePackage.H = Desktop.Scale + panError.Show + +End + +Public Sub txtVendor_KeyPress() + + Project.OnVendorKeyPress + +End + +Public Sub txtVendorPrefix_KeyPress() + + Project.OnVendorKeyPress(True) + +End + +Public Sub btnCopy_Click() + + Clipboard.Copy(edtLog.Text, "text/plain;charset=utf-8") + +End + +Public Sub chkSignature_Click() + + Settings["/FMakeInstall/SignPackage"] = CBool(chkSignature.Value) + txtPassPhrase.Enabled = chkSignature.Value + If txtPassPhrase.Enabled Then txtPassPhrase.SetFocus + +End + +Public Sub panError_Arrange() + + spnCreatePackage.W = spnCreatePackage.H + +End + +Public Sub Form_Arrange() + + btnCreateNow.Move(Desktop.Scale, Me.ClientH - Desktop.Scale - btnCreateNow.H) + +End + +Public Sub btnCreateNow_Click() + + Dim iIndex As Integer + Dim bSave As Boolean + + 'wizInstall.Animated = False + bSave = Application.Animations + Application.Animations = False + Do + iIndex = wizInstall.Index + wizInstall.MoveNext + If iIndex = TAB_CREATE Then Break + If wizInstall.Index = iIndex Then Break + Loop + Application.Animations = bSave + 'wizInstall.Animated = True + +End + +Public Sub dwgVersionMin_Draw() + + Style.PaintBox(0, 0, Paint.W, Paint.H) + Paint.DrawText(System.Version & ".", 0, 0, spnVersionMin.X, Paint.H, Align.Right) + +End + +Public Sub dwgVersionMin_Arrange() + + Dim FW As Integer = Style.BoxFrameWidth + Dim FH As Integer = Style.BoxFrameHeight + + spnVersionMin.Move(dwgVersionMin.W - spnVersionMin.W - FW, FH, spnVersionMin.W, dwgVersionMin.H - FH * 2) + +End + +Public Sub chkVersionMin_Click() + + dwgVersionMin.Enabled = chkVersionMin.Value + If chkVersionMin.Value Then + spnVersionMin.SetFocus + Else + spnVersionMin.Value = spnVersionMin.MaxValue + Endif + dwgVersionMin.Refresh + +End + +Public Sub chkPackageNameWithMajor_Click() + + UpdatePackageName + +End diff --git a/app/src/gambas3/.src/Packager/FMakeInstall.form b/app/src/gambas3/.src/Packager/FMakeInstall.form new file mode 100644 index 00000000..d9816650 --- /dev/null +++ b/app/src/gambas3/.src/Packager/FMakeInstall.form @@ -0,0 +1,713 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,98,79) + Text = ("Make installation package") + Icon = Picture["icon:/large/package"] + Arrangement = Arrange.Vertical + Margin = True + { wizInstall Wizard + MoveScaled(1,1,89,77) + Expand = True + Arrangement = Arrange.Vertical + Spacing = True + Count = 11 + TextFont = Font["Bold,+2"] + ShowIndex = True + Border = False + ActionText = ("Create package") + ActionPicture = Picture["icon:/small/package"] + Index = 0 + Text = ("Package information") + { TextLabel1 TextLabel + MoveScaled(1,0,64,4) + Font = Font["Bold"] + AutoResize = True + Text = ("Package name") + Alignment = Align.BottomNormal + } + { txtPackage Label + MoveScaled(1,5,70,4) + Font = Font["Bold,+2"] + Background = Color.TextBackground + Foreground = Color.TextForeground + Padding = 4 + AutoResize = True + Border = Border.Plain + } + { Panel3 HBox + MoveScaled(1,10,87,8) + Spacing = True + { Panel5 VBox + MoveScaled(0,0,53,8) + Expand = True + { chkPrefix CheckBox + MoveScaled(0,0,52,4) + AutoResize = True + Text = ("Add vendor prefix or name to package names") + } + { chkPackageNameWithMajor CheckBox + MoveScaled(0,4,44,4) + Text = ("Add major version number to package names") + } + } + { Panel17 VBox + MoveScaled(55,0,32,7) + AutoResize = True + { Panel14 HBox + MoveScaled(0,0,26,4) + Spacing = True + { Label8 Label + MoveScaled(0,0,16,4) + AutoResize = True + Text = ("Package version") + Alignment = Align.Right + } + { txtPackageVersion SpinBox + MoveScaled(17,0,8,4) + MinValue = 1 + MaxValue = 999 + Value = 1 + } + } + } + } + { HBox8 HBox + MoveScaled(1,19,70,4) + Spacing = True + { Label3 Label + MoveScaled(0,0,23,4) + Text = ("Vendor name") + } + { txtVendor MaskBox + MoveScaled(24,0,44,4) + Expand = True + Filter = "[A-Za-z0-9_-]" + } + } + { HBox20 HBox + MoveScaled(1,24,70,4) + Spacing = True + { Label9 Label + MoveScaled(0,0,23,4) + Text = ("Vendor prefix") + } + { txtVendorPrefix MaskBox + MoveScaled(24,0,44,4) + Expand = True + Filter = "[A-Za-z0-9]" + } + } + { TextLabel2 TextLabel + MoveScaled(1,28,64,4) + Font = Font["Bold"] + AutoResize = True + Text = ("Maintainer information") + Alignment = Align.BottomNormal + } + { HBox1 HBox + MoveScaled(1,33,71,4) + Spacing = True + { Label1 Label + MoveScaled(0,0,23,4) + Text = ("Name") + } + { txtName TextBox + MoveScaled(24,0,44,4) + Expand = True + } + } + { HBox2 HBox + MoveScaled(1,38,70,4) + Spacing = True + { Label2 Label + MoveScaled(0,0,23,4) + Text = ("E-mail") + } + { txtMail TextBox + MoveScaled(24,0,44,4) + Expand = True + } + } + { HBox16 HBox + MoveScaled(1,43,70,4) + Spacing = True + { Label7 Label + MoveScaled(0,0,23,4) + Text = ("URL") + } + { txtUrl TextBox + MoveScaled(24,0,44,4) + Expand = True + } + } + { Panel1 HBox + MoveScaled(1,48,72,12) + Expand = True + Spacing = True + { Panel4 VBox + MoveScaled(0,0,23,10) + { Label6 Label + MoveScaled(0,0,23,4) + Font = Font["Bold"] + Text = ("Description") + } + } + { txtDescribe TextArea + MoveScaled(25,0,46,12) + Expand = True + Wrap = True + } + } + { Panel2 HBox + MoveScaled(1,61,73,4) + Spacing = True + { Label5 Label + MoveScaled(0,0,23,4) + Font = Font["Bold"] + Text = ("License") + } + { txtLicense ComboBox + MoveScaled(25,0,46,4) + #Translate = False + Expand = True + List = ["General Public License", "Public Domain", "Lesser General Public License", "Other License(s)", "Non-free License"] + Sorted = True + } + } + Index = 1 + Text = ("Changelog") + { lblChangeDate Label + MoveScaled(1,5,68,4) + Font = Font["Bold"] + AutoResize = True + } + { txtChange TextArea + MoveScaled(1,10,68,11) + Wrap = True + } + { txtChangeLog TextArea + MoveScaled(1,22,68,27) + Expand = True + ReadOnly = True + Wrap = True + } + Index = 2 + Text = ("Target distribution") + { txtMessage TextLabel + MoveScaled(0,0,86,6) + Visible = False + Font = Font["Italic,-1"] + Background = Color.TextBackground + Foreground = Color.TextForeground + Padding = 8 + AutoResize = True + Border = Border.Plain + } + { panSystem ScrollView + MoveScaled(0,7,88,52) + Expand = True + Arrangement = Arrange.Row + Spacing = True + Border = False + ScrollBar = Scroll.Vertical + { HBox10 HBox panDistro + Name = "HBox10" + MoveScaled(0,0,42,9) + Tag = "archlinux" + Padding = 4 + { PictureBox1 PictureBox + MoveScaled(0,0,8,8) + Picture = Picture["img/logo/archlinux.png"] + Stretch = True + Alignment = Align.Center + } + { Panel7 Panel + MoveScaled(9,1,3,6) + } + { CheckBox5 CheckBox chkDistro + Name = "CheckBox5" + MoveScaled(13,2,26,4) + #Translate = False + Expand = True + Text = "Archlinux" + } + } + { HBox15 HBox panDistro + Name = "HBox15" + MoveScaled(43,0,42,9) + Tag = "autotools" + Padding = 4 + { PictureBox6 PictureBox + MoveScaled(1,1,6,6) + Picture = Picture["img/logo/autotools.png"] + Stretch = True + Alignment = Align.Center + } + { Panel12 Panel + MoveScaled(9,1,3,6) + } + { CheckBox6 CheckBox chkDistro + Name = "CheckBox6" + MoveScaled(14,2,26,4) + #Translate = False + Expand = True + Text = "Autotools" + } + } + { HBox5 HBox panDistro + Name = "HBox5" + MoveScaled(0,10,42,9) + Tag = "debian" + Padding = 4 + { PictureBox2 PictureBox + MoveScaled(1,1,6,6) + Picture = Picture["img/logo/debian.png"] + Stretch = True + Alignment = Align.Center + } + { Panel8 Panel + MoveScaled(9,1,3,6) + } + { chkDebian CheckBox chkDistro + Name = "chkDebian" + MoveScaled(14,2,17,4) + #Translate = False + Expand = True + Text = "Debian" + } + } + { HBox6 HBox panDistro + Name = "HBox6" + MoveScaled(43,10,42,9) + Tag = "fedora" + Padding = 4 + { PictureBox7 PictureBox + MoveScaled(1,1,6,6) + Picture = Picture["img/logo/fedora.png"] + Stretch = True + Alignment = Align.Center + } + { Panel13 Panel + MoveScaled(9,1,3,6) + } + { CheckBox3 CheckBox chkDistro + Name = "CheckBox3" + MoveScaled(14,1,26,4) + #Translate = False + Expand = True + Text = "Fedora / RedHat / CentOS" + } + } + { HBox3 HBox panDistro + Name = "HBox3" + MoveScaled(0,20,42,9) + Tag = "mageia" + Padding = 4 + { PictureBox3 PictureBox + MoveScaled(1,1,6,6) + Picture = Picture["img/logo/mageia.png"] + Stretch = True + Alignment = Align.Center + } + { Panel9 Panel + MoveScaled(9,1,3,6) + } + { chkMageia CheckBox chkDistro + Name = "chkMageia" + MoveScaled(13,1,27,4) + #Translate = False + Expand = True + Text = "Mageia" + } + } + { HBox7 HBox panDistro + Name = "HBox7" + MoveScaled(0,30,42,9) + Tag = "suse" + Padding = 4 + { PictureBox4 PictureBox + MoveScaled(1,1,6,6) + Picture = Picture["img/logo/suse.png"] + Stretch = True + Alignment = Align.Center + } + { Panel10 Panel + MoveScaled(9,1,3,6) + } + { CheckBox4 CheckBox chkDistro + Name = "CheckBox4" + MoveScaled(13,2,26,4) + #Translate = False + Expand = True + Text = "OpenSUSE" + } + } + { HBox4 HBox panDistro + Name = "HBox4" + MoveScaled(43,30,42,9) + Tag = "slackware" + Padding = 4 + { PictureBox9 PictureBox + MoveScaled(1,1,6,6) + Picture = Picture["img/logo/slackware.png"] + Stretch = True + Alignment = Align.Center + } + { Panel15 Panel + MoveScaled(9,1,3,6) + } + { CheckBox2 CheckBox chkDistro + Name = "CheckBox2" + MoveScaled(14,2,26,4) + #Translate = False + Expand = True + Text = "Slackware" + } + } + { HBox9 HBox panDistro + Name = "HBox9" + MoveScaled(0,40,42,9) + Tag = "ubuntu" + Padding = 4 + { PictureBox5 PictureBox + MoveScaled(1,1,6,6) + Picture = Picture["img/logo/ubuntu.png"] + Stretch = True + Alignment = Align.Center + } + { Panel11 Panel + MoveScaled(9,1,3,6) + } + { CheckBox1 CheckBox chkDistro + Name = "CheckBox1" + MoveScaled(14,1,26,4) + #Translate = False + Expand = True + Text = "Ubuntu / Kubuntu / Mint..." + } + } + { HBox18 HBox panDistro + Name = "HBox18" + MoveScaled(43,40,42,9) + Visible = False + Tag = "self" + Padding = 4 + { PictureBox10 PictureBox + MoveScaled(1,1,6,6) + Picture = Picture["img/logo/self-extractible.png"] + Stretch = True + Alignment = Align.Center + } + { Panel16 Panel + MoveScaled(9,1,3,6) + } + { CheckBox7 CheckBox chkDistro + Name = "CheckBox7" + MoveScaled(14,2,26,4) + Expand = True + Text = ("Self-extractible") + } + } + } + Index = 3 + Text = ("Package group") + { cmbGroup ComboBox + MoveScaled(1,1,68,4) + ReadOnly = True + Text = (" ") + } + { tvwGroup TreeView + MoveScaled(1,6,68,40) + Expand = True + Sorted = True + ScrollBar = Scroll.Vertical + } + { txtGroup TextBox + MoveScaled(1,47,68,4) + ReadOnly = True + } + Index = 4 + Text = ("Menu entry") + { cmbMenu ComboBox + MoveScaled(1,1,68,4) + ReadOnly = True + Text = (" ") + } + { tvwMenu TreeView + MoveScaled(1,6,68,32) + Expand = True + ScrollBar = Scroll.Vertical + } + { txtMenu TextBox + MoveScaled(1,39,68,4) + ReadOnly = True + } + { Label4 Label + MoveScaled(1,43,67,4) + Font = Font["Bold"] + Text = ("Categories") + Alignment = Align.BottomNormal + } + { cmbCategories ComboBox + MoveScaled(1,48,68,4) + Sorted = True + } + Index = 5 + Text = ("Desktop configuration file") + { TextLabel6 TextLabel + MoveScaled(0,0,64,4) + Font = Font["Bold"] + AutoResize = True + Text = ("Mimetypes") + Alignment = Align.BottomNormal + } + { TextLabel5 TextLabel + MoveScaled(0,5,86,3) + Font = Font["Italic,-1"] + AutoResize = True + Text = ("Enter the mimetypes handled by your application there.\nPlease enter one mimetype by line.\n") + } + { lstMime ListEditor + MoveScaled(2,10,78,16) + Expand = True + } + { TextLabel7 TextLabel + MoveScaled(0,29,64,4) + Font = Font["Bold"] + AutoResize = True + Text = ("Additional configuration") + Alignment = Align.BottomNormal + } + { TextLabel8 TextLabel + MoveScaled(0,34,86,3) + Font = Font["Italic,-1"] + AutoResize = True + Text = ("The following will be added to the end of the desktop configuration file.") + } + { txtDesktop TextArea + MoveScaled(0,38,81,17) + Expand = True + } + Index = 6 + Text = ("Extra dependencies") + { HBox17 HBox + MoveScaled(2,1,83,4) + Spacing = True + { chkVersionMin CheckBox + MoveScaled(1,0,27,4) + AutoResize = True + Text = ("Minimum Gambas version") + } + { dwgVersionMin DrawingArea + MoveScaled(36,0,9,4) + Enabled = False + { spnVersionMin SpinBox + MoveScaled(4,0,5,4) + Border = False + } + } + } + { chkDep CheckBox + MoveScaled(1,8,55,3) + Text = ("Same dependencies for all targets") + } + { cmbDep ComboBox + MoveScaled(1,13,68,4) + ReadOnly = True + Text = (" ") + } + { HBox12 HBox + MoveScaled(1,18,79,38) + Expand = True + Spacing = True + { tvwDep TableView + MoveScaled(5,2,41,29) + Expand = True + Header = GridView.Horizontal + } + { HBox11 VBox + MoveScaled(48,2,18,27) + Spacing = True + { btnAddDep Button + MoveScaled(0,0,18,4) + Text = Shortcut(("Add"), "A") + Picture = Picture["icon:/small/add"] + } + { btnRemoveDep Button + MoveScaled(0,5,18,4) + Text = Shortcut(("Remove"), "R") + Picture = Picture["icon:/small/delete"] + } + { btnUpDep Button + MoveScaled(0,10,18,4) + Text = Shortcut(("Up"), "U") + Picture = Picture["icon:/small/up"] + } + { btnDownDep Button + MoveScaled(0,15,18,4) + Text = Shortcut(("Down"), "D") + Picture = Picture["icon:/small/down"] + } + { btnClearDep Button + MoveScaled(0,20,18,4) + Text = Shortcut(("Clear"), "C") + Picture = Picture["icon:/small/trash"] + } + } + } + Index = 7 + Text = ("Extra files") + { chkFile CheckBox + MoveScaled(0,1,55,3) + Text = ("Same files for all targets") + } + { cmbFile ComboBox + MoveScaled(0,6,68,4) + ReadOnly = True + Text = (" ") + } + { TextLabel9 TextLabel + MoveScaled(0,11,86,5) + Font = Font["Italic,-1"] + AutoResize = True + Text = ("Extra files must be located in the Project folder of the current project, i.e. the .hidden directory of the project on the disk.") + } + { HBox13 HBox + MoveScaled(0,19,79,41) + Expand = True + Spacing = True + { tvwFile TableView + MoveScaled(7,4,41,29) + Expand = True + Mode = Select.Single + Header = GridView.Horizontal + } + { HBox14 VBox + MoveScaled(53,4,18,34) + Spacing = True + { btnAddFile Button + MoveScaled(0,0,18,4) + Text = Shortcut(("Add"), "A") + Picture = Picture["icon:/small/add"] + } + { btnRemoveFile Button + MoveScaled(0,5,18,4) + Text = Shortcut(("Remove"), "R") + Picture = Picture["icon:/small/delete"] + } + { btnUpFile Button + MoveScaled(0,10,18,4) + Text = Shortcut(("Up"), "U") + Picture = Picture["icon:/small/up"] + } + { btnDownFile Button + MoveScaled(0,15,18,4) + Text = Shortcut(("Down"), "D") + Picture = Picture["icon:/small/down"] + } + { btnClearFile Button + MoveScaled(0,20,18,4) + Text = Shortcut(("Clear"), "C") + Picture = Picture["icon:/small/trash"] + } + } + { txtFileDest ButtonBox + MoveScaled(13,35,20,3) + Visible = False + Ignore = True + Border = False + } + } + Index = 8 + Text = ("Extra autoconf tests") + { TextLabel4 TextLabel + MoveScaled(2,1,66,9) + Font = Font["Italic,-1"] + AutoResize = True + Text = ("Add extra tests for the configuration process.\n

      Leave this blank if you don't need it, or if you don't know anything about autoconf scripts.") + } + { txtTests TextArea + MoveScaled(1,15,71,34) + Expand = True + } + Index = 9 + Text = ("Destination directory") + { dchInstall DirChooser + MoveScaled(1,0,72,50) + Expand = True + } + { chkCreateDir CheckBox + MoveScaled(1,53,69,4) + Text = ("Create directories for each distribution") + } + Index = 10 + Text = ("Create package") + { HBox19 HBox + MoveScaled(1,1,74,4) + Visible = False + Spacing = True + { chkSignature CheckBox + MoveScaled(0,0,34,4) + #Translate = False + AutoResize = True + Text = "Sign packages using passphrase" + } + { txtPassPhrase TextBox + MoveScaled(36,0,13,4) + #Translate = False + Enabled = False + Expand = True + Password = True + } + } + { Panel6 HBox + MoveScaled(2,8,82,4) + { Label10 Label + MoveScaled(0,0,28,4) + Font = Font["Bold"] + Expand = True + Text = ("Commands output") + } + { btnCopy Button + MoveScaled(60,0,17,4) + AutoResize = True + Text = ("Copy") + Picture = Picture["icon:/small/copy"] + } + } + { edtLog TextEditor + MoveScaled(7,17,49,28) + Expand = True + ReadOnly = True + } + { panError Panel + MoveScaled(1,51,87,7) + Visible = False + Background = Color.TextBackground + Arrangement = Arrange.Horizontal + AutoResize = True + Margin = True + Border = Border.Plain + { txtError TextLabel + MoveScaled(5,0,64,6) + Font = Font["-1"] + Background = Color.TextBackground + Expand = True + AutoResize = True + } + { spnCreatePackage Spinner + MoveScaled(81,0,3,3) + Visible = False + } + } + Index = 0 + } + { btnCreateNow Button + MoveScaled(92,1,25,4) + Ignore = True + AutoResize = True + Text = ("Create package now") + Picture = Picture["icon:/small/package"] + } +} diff --git a/app/src/gambas3/.src/Packager/FSelectExtraFile.class b/app/src/gambas3/.src/Packager/FSelectExtraFile.class new file mode 100644 index 00000000..a532860b --- /dev/null +++ b/app/src/gambas3/.src/Packager/FSelectExtraFile.class @@ -0,0 +1,39 @@ +' Gambas class file + +Private $sFic As String + +Public Sub Run(sFic As String) As String + + $sFic = sFic + If Not Me.ShowModal() Then Return + Return $sFic + +End + +Public Sub btnOK_Click() + + $sFic = Mid$(fchFile.SelectedPath, Len(fchFile.Root) + 1) + If Left($sFic) = "/" Then $sFic = Mid$($sFic, 2) + If Not $sFic Then Return + Me.Close(True) + +End + +Public Sub btnCancel_Click() + + Me.Close + +End + +Public Sub Form_Open() + + fchFile.Root = Project.Dir &/ ".hidden" + fchFile.SelectedPath = Project.Dir &/ ".hidden" &/ $sFic + +End + +Public Sub fchFile_Activate() + + btnOK.Value = True + +End diff --git a/app/src/gambas3/.src/Packager/FSelectExtraFile.form b/app/src/gambas3/.src/Packager/FSelectExtraFile.form new file mode 100644 index 00000000..aaeb82df --- /dev/null +++ b/app/src/gambas3/.src/Packager/FSelectExtraFile.form @@ -0,0 +1,35 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,113,64) + Text = ("Select an extra file") + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + { fchFile FileChooser + MoveScaled(1,1,110,56) + Expand = True + Picture = Picture["img/logo/head-16.png"] + ShowDirectory = True + ShowBookmark = False + ReadOnly = True + } + { HBox1 HBox + MoveScaled(1,59,66,4) + Spacing = True + { Panel1 Panel + MoveScaled(4,0,4,4) + Expand = True + } + { btnOK Button + MoveScaled(31,0,16,4) + Text = ("OK") + Default = True + } + { btnCancel Button + MoveScaled(48,0,16,4) + Text = ("Cancel") + Cancel = True + } + } +} diff --git a/app/src/gambas3/.src/Packager/Package.module b/app/src/gambas3/.src/Packager/Package.module new file mode 100644 index 00000000..771c3072 --- /dev/null +++ b/app/src/gambas3/.src/Packager/Package.module @@ -0,0 +1,2750 @@ +' Gambas module file + +Public Dir As String +Private Path As String +Public ChangeLog As String +Public Signature As String + +Private RPMBUILD_PROG As String +Private FAKEROOT_PROG As String +Private DKPG_PROG As String +Private TAR_1_13_PROG As String +Private AUTOCONF_PROG As String +Private AUTOMAKE_PROG As String +Private MAKEPKG_PROG As String +'Private MAKESELF_PROG As String + +Private $sOutput As String +Private $bEnd As Boolean + +Private $sName As String ' Project name +Private $sVendor As String ' Vendor +Private $sVendorPrefix As String ' Vendor prefix +Private $sComponentName As String ' Project name with a vendor prefix +Private $sLibraryName As String ' Library name, with the version +Private $sUnsafePackageName As String ' Package name, i.e project name with prefix, but with possible forbidden characters inside +Private $sCategories As String ' Categories list +Private $sHome As String ' Home user directory +Private $sVersion As String ' Package version +Private $sVersionWithRelease As String ' Package version with release number +Private $sDescription As String +Private $bDescription As Boolean + +Private $sSupportPackage As String + +Private MIN_VERSION As String +Private Const MAX_VERSION As String = "3.99.0" + +Private $sFormatSingle As String +Private $sFormatMin As String +Private $sFormatMax As String +Private $sFormatMinMax As String +Private $sFormatEqual As String + +Private Const QT4_SUPPORT As String = "qt4" +Private QT4_SUPPORT_PACKAGES As String[] = ["gb.qt4:gb.gui", "gb.qt4:gb.gui.qt", "gb.qt4.opengl:gb.gui.opengl", "gb.qt4.webkit:gb.gui.qt.webkit"] +Private Const QT5_SUPPORT As String = "qt5" +Private QT5_SUPPORT_PACKAGES As String[] = ["gb.qt5:gb.gui", "gb.qt5:gb.gui.qt", "gb.qt5.opengl:gb.gui.opengl", "gb.qt5.webkit:gb.gui.qt.webkit"] +Private Const GTK_SUPPORT As String = "gtk" +Private GTK_SUPPORT_PACKAGES As String[] = ["gb.gtk:gb.gui", "gb.gtk.opengl:gb.gui.opengl"] +Private Const GTK3_SUPPORT As String = "gtk3" +Private GTK3_SUPPORT_PACKAGES As String[] = ["gb.gtk3:gb.gui"] ', "gb.gtk.opengl:gb.gui.opengl"] + +Private Const DEBIAN_STANDARD As String = "3.9.6" +Private Const DEBIAN_DEBHELPER_VERSION As String = "9" +Private DEBIAN_ICON_SIZES As Integer[] = [16, 22, 32, 48, 64, 128, 256, 512, 1024] + +Public Sub CheckProgram() + + 'IF $bChecked THEN RETURN + + '$bChecked = TRUE + + If Not Project.CheckProgram("dh_install") Then DKPG_PROG = "dh_install" + If Not Project.CheckProgram("rpmbuild") Then RPMBUILD_PROG = "rpmbuild" + If Not Project.CheckProgram("fakeroot") Then FAKEROOT_PROG = "fakeroot" + If Not Project.CheckProgram("tar-1.13") Then + TAR_1_13_PROG = "tar-1.13" + Else If Not Project.CheckProgram("tar") Then + TAR_1_13_PROG = "tar" + Endif + If Not Project.CheckProgram("autoconf") Then AUTOCONF_PROG = "autoconf" + If Not Project.CheckProgram("automake") Then AUTOMAKE_PROG = "automake" + If Not Project.CheckProgram("makepkg") Then MAKEPKG_PROG = "makepkg" + 'If Not Project.CheckProgram("makeself") Then MAKESELF_PROG = "makeself" + +End + +Public Sub CheckSystem(sSys As String) As String + + Select Case sSys + + Case "mageia", "fedora", "suse" + If Not RPMBUILD_PROG Then Return Subst(("'&1' is missing."), "rpmbuild") + + Case "debian", "ubuntu" + If Not DKPG_PROG Then Return Subst(("'&1' is missing."), "debhelper") + If Not FAKEROOT_PROG Then Return Subst(("'&1' is missing."), "fakeroot") + + Case "slackware" + If Not TAR_1_13_PROG Then Return Subst(("'&1' is missing."), "tar-1.13") + + Case "autotools" + If Not AUTOCONF_PROG And If Not AUTOMAKE_PROG Then Return Subst(("'&1' and '&2' are missing."), "autoconf", "automake") + If Not AUTOCONF_PROG Then Return Subst(("'&1' is missing."), "autoconf") + If Not AUTOMAKE_PROG Then Return Subst(("'&1' is missing."), "automake") + + Case "archlinux" + If Not MAKEPKG_PROG Then Return Subst(("'&1' is missing."), "makepkg") + + 'Case "self" + ' If Not MAKESELF_PROG Then Return Subst(("'&1' is missing."), "makeself") + + Case Else + Return + + End Select + +End + +Private Sub ClearLog() + + FMakeInstall.ClearLog + +End + + +Private Sub AddLog(sText As String) + + FMakeInstall.AddLog(sText) + +End + +Private Sub RemoveEmptyLines(sText As String) As String + + Return Split(sText, "\n", "", True).Join("\n") + +End + + +Private Sub GetShortDesc(sText As String, Optional iMax As Integer) As String + + Dim iPos As Integer + + iPos = InStr(sText, ". ") + If iPos = 0 Then iPos = Len(sText) + 1 + sText = Trim(Replace(Left(sText, iPos), "\n", " ")) + + If iMax And If Len(sText) > iMax Then + sText = Left(sText, iMax - 3) & "..." + Endif + + Return sText + +End + +Private Sub FormatDesc(sText As String, Optional iMax As Integer) As String[] + + Dim aLine As New String[] + Dim iPos As Integer + Dim I As Integer + Dim sLine As String + Dim sCar As String + + If iMax = 0 Then Return Split(sText, "\n") + + aLine.Add("") + + While sText + + sCar = String.Left(sText) + sText = String.Mid$(sText, 2) + + If sCar = "\n" Then + aLine.Add("") + Continue + Endif + + aLine[aLine.Max] &= sCar + + sLine = aLine[aLine.Max] + If String.Len(sLine) > iMax Then + For I = Len(sLine) - 1 DownTo 1 + iPos = InStr(" .,;", Mid$(sLine, I, 1)) + If iPos Then + aLine[aLine.Max] = Left(sLine, I) + aLine.Add(Mid$(sLine, I + 1)) + Break + Endif + Next + If I = 0 Then + aLine[aLine.Max] = String.Left(sLine, iMax) + aLine.Add(String.Mid$(sLine, iMax + 1)) + Endif + Endif + + Wend + + Return aLine + +End + + + +Private Sub GetVersion() As String + + Return Project.FormatVersion() + +End + +Private Sub InitMake(sSys As String) + + If Project.CreateEachDirectory Then + Path = Dir &/ sSys + Try Mkdir Dir + Try Mkdir Path + Else + Path = Dir + Try Mkdir Path + Endif + + $sName = Project.Name + $sComponentName = $sName + $sVendor = Project.Vendor + $sVendorPrefix = Project.VendorPrefix + If Not $sVendorPrefix Then $sVendorPrefix = $sVendor + + If Project.Type = Project.TYPE_COMPONENT Then + If $sVendorPrefix Then + If $sName Not Begins $sVendorPrefix & "." Then $sComponentName = $sVendorPrefix & "." & $sName + Endif + $sComponentName = String.LCase($sComponentName) + Else If Project.Type = Project.TYPE_LIBRARY Then + $sLibraryName = $sName & ":" & Project.MajorVersion & "." & Project.MinorVersion + Endif + + '$sPrefix = GetPackagePrefix(Project.Vendor, Project.Prefix) + $sUnsafePackageName = GetPackageFullName($sVendor, $sVendorPrefix, Project.Prefix, Project.PackageNameWithMajor, False) + + $sHome = System.User.Home + + $sCategories = Project.Categories[sSys] + If $sCategories Then $sCategories &= ";" + + $sVersion = GetVersion() + If sSys = "ubuntu" Then + $sVersionWithRelease = $sVersion & "-0ubuntu" & CStr(Project.PackageVersion) + Else + $sVersionWithRelease = $sVersion & "-" & CStr(Project.PackageVersion) + Endif + + $sDescription = RemoveEmptyLines(Project.Description) + If $sDescription Then + $bDescription = True + Else + $sDescription = "Missing description." + $bDescription = False + Endif + + With Project.Components + If .Exist("gb.gui") Then + $sSupportPackage = "gb.gui" + Else If .Exist("gb.gui.qt") Then + $sSupportPackage = "gb.gui.qt" + Endif + End With + +End + +Public Function Make() As Boolean + + Dim sSys As String + Dim sMacro As String + Dim bAdd As Boolean + Dim sPath As String + Dim aVer As String[] + + If Project.RuntimeVersion Then + MIN_VERSION = Project.RuntimeVersion + Else + aVer = Split(System.FullVersion, ".") + MIN_VERSION = aVer[0] & "." & aVer[1] + Endif + + If Project.Systems.Exist("slackware") Then + If Project.MakeExecutable(True, True) Then Return True + Endif + + ' Save old rpm macro file + sMacro = User.Home &/ ".rpmmacros" + Try Move sMacro To sMacro & ".save" + Try Kill sMacro + + ClearLog + AddLog(("Saving CHANGELOG file.")) + sPath = Project.Dir &/ ".hidden" &/ "CHANGELOG" + bAdd = Not Exist(sPath) + 'Try Mkdir Project.Dir &/ ".hidden" + File.Save(sPath, ChangeLog) + Project.RefreshKey(sPath) + If bAdd Then VersionControl.AddFile(sPath) + + For Each sSys In Project.Systems + If MakePackage(sSys) Then Return True + Next + + ' Restore old rpm macro file + Try Kill sMacro + Try Move sMacro & ".save" To sMacro + + ' sPath = Project.Dir &/ ".extratest" + ' bAdd = Not Exist(sPath) + ' If Len(ExtraTest) > 0 Then + ' AddLog(("Saving extra tests settings.")) + ' File.Save(sPath, ExtraTest) + ' If bAdd Then VersionControl.AddFile(sPath) + ' Else + ' If Not bAdd Then VersionControl.RemoveFile(sPath) + ' Endif + + AddLog("\n" & String(40, "=") & "\n") + AddLog(("The packages have been successfully created.") & "\n") + +End + +Public Function GetChangeDate() As String + + Dim sLang As String + Dim sDate As String + + sLang = System.Language + System.Language = "C" + sDate = Format$(Now, "ddd mmm dd yyyy") & " " & Project.Maintainer & " " + If Project.Address Then sDate = sDate & "<" & Project.Address & "> " + sDate &= GetVersion() + System.Language = sLang + Return sDate + +End + +Private Function IsConsoleProject() As Boolean + + Dim sLib As String + Dim hComp As CComponent + + For Each sLib In Project.Components + hComp = Project.Documentation[sLib] + If hComp.IsForm() Then Return False + Next + + Return True + +End + +Private Sub ComponentToPackageName(sComp As String) As String + + Return "gambas" & System.Version & "-" & Replace(sComp, ".", "-") + +End + +Private Sub IsRuntimeComponent(sComp As String) As Boolean + + If sComp = "gb.debug" Or If sComp = "gb.eval" Or If sComp = "gb.test" Then Return True + If sComp = "gb.gui" Or If sComp Begins "gb.gui." Then Return True + +End + +Private Function GetDependencies(Optional aComp As String[]) As String + + Dim sRes As String + Dim sComp As String + Dim iPos As Integer + Dim sTest As String + + If Not aComp Then + If Project.Type = Project.TYPE_COMPONENT Then + aComp = Project.ReadComponentFile()["Require"] + Else + aComp = Project.Components + Endif + Endif + + If aComp Then + For Each sComp In aComp + + iPos = InStr(sComp, ":") + If iPos Then + sTest = Mid$(sComp, iPos + 1) + If Not Project.Components.Exist(sTest) Then Continue + sComp = Left(sComp, iPos - 1) + Endif + + If IsRuntimeComponent(sComp) Then Continue + + sRes &= GetDependency(sComp) + 'If sComp = "gb.form" Then sRes &= GetDependency("gb.form.stock") + Next + Endif + + For Each sComp In Project.Libraries + sRes &= GetDependency(sComp) + Next + + Return sRes + +End + +Private Function GetExtraDependencies(sSys As String) As String + + Dim sDep As String + Dim aDep As String[] + Dim sRes As String + Dim sFormat As String + + If Project.SameDependencies Then sSys = Project.Systems[0] + + 'If Not sFormatMinMax Then sFormatMinMax = sFormatMin & sFormatMax + + For Each sDep In Split(Project.ExtraDependencies[sSys], "\n") + + aDep = Split(sDep, "\t") + aDep.Resize(3) + + If aDep[1] And If aDep[2] Then + If aDep[1] = aDep[2] Then + sFormat = $sFormatEqual + Else + sFormat = $sFormatMinMax + Endif + Else If aDep[1] Then + sFormat = $sFormatMin + Else If aDep[2] Then + sFormat = $sFormatMax + Else + sFormat = $sFormatSingle + Endif + + sRes &= Subst(sFormat, aDep[0], aDep[1], aDep[2]) + + Next + + Return sRes + +End + +Private Function GetExtraFiles(sSys As String, sFormat As String, Optional sFormatDir As String) As String + + Dim sFile As String + Dim aFile As String[] + Dim sRes As String + Dim sFmt As String + + If Project.SameFiles Then sSys = Project.Systems[0] + + For Each sFile In Split(Project.ExtraFiles[sSys], "\n") + aFile = Split(sFile, "\t") + aFile.Resize(2) + + sFmt = If(IsDir(Project.Dir &/ ".hidden" &/ aFile[0]), sFormatDir, sFormat) + sRes &= Subst(sFmt, Shell$(aFile[0]), Shell$(aFile[1]), Shell$(Mid$(aFile[0], RInStr(aFile[0], "/") + 1))) & "\n" + + Next + + Return sRes + +End + +Private Sub FormatFileInList(sFile As String, Optional bDebian As Boolean) As String + + If InStr(sFile, " ") Then + If bDebian Then + sFile = Replace(sFile, " ", "[!#-~.\"!]") + Else + sFile = Chr$(34) & Replace(sFile, Chr$(34), "\\\"") & Chr$(34) + Endif + Endif + Return sFile + +End + + +Private Function GetExtraFilesList(sSys As String, sPrefix As String, sFormat As String, Optional bDebian As Boolean) As String + + Dim sFile As String + Dim aFile As String[] + Dim sRes As String + Dim sSrc, sDest, sDestDir As String + + If Project.SameFiles Then sSys = Project.Systems[0] + + For Each sFile In Split(Project.ExtraFiles[sSys], "\n") + aFile = Split(sFile, "\t") + aFile.Resize(2) + + sSrc = FormatFileInList(sPrefix &/ aFile[0], bDebian) + sDest = FormatFileInList(aFile[1] &/ File.Name(aFile[0]), bDebian) + sDestDir = FormatFileInList(aFile[1], bDebian) + sRes &= Subst(sFormat, sSrc, sDest, sDestDir) & "\n" + + Next + + Return sRes + +End + + +Private Function CopyExtraFiles(sSys As String, sBuildDir As String) + + Dim sFile As String + Dim aFile As String[] + Dim sSrc As String + Dim sDst As String + + If Project.SameFiles Then sSys = Project.Systems[0] + + For Each sFile In Split(Project.ExtraFiles[sSys], "\n") + aFile = Split(sFile, "\t") + 'aFile.Resize(2) + sSrc = Project.Dir &/ ".hidden" &/ aFile[0] + sDst = File.Dir(sBuildDir &/ aFile[1] &/ File.Name(aFile[0])) + + Project.MakeDir(sDst) + If IsDir(sSrc) Then + Shell "cp -R --preserve=timestamp " & Shell$(sSrc) & " " & Shell$(sDst) Wait + Else + Shell "cp --preserve=timestamp " & Shell$(sSrc) & " " & Shell$(sDst) Wait + 'Copy sSrc To sBuildDir &/ aFile[1] &/ File.Name(aFile[0]) + Endif + Next + +End + +Private Function GetExtraFilesDir(sSys As String, sFormat As String, Optional bDebian As Boolean) As String + + Dim sFile As String + Dim aFile As String[] + Dim sRes As String + + If Project.SameFiles Then sSys = Project.Systems[0] + + For Each sFile In Split(Project.ExtraFiles[sSys], "\n") + + aFile = Split(sFile, "\t") + aFile.Resize(2) + + If bDebian Then + sRes &= Subst(sFormat, aFile[1]) & "\n" + Else + sRes &= Subst(sFormat, Shell$(aFile[1])) & "\n" + Endif + + Next + + Return sRes + +End + +Private Function GetDependency(sLib As String) As String + + Dim hLibrary As CLibraryInfo + Dim sVersion As String + Dim aMinVersion As String[] + Dim aMaxVersion As String[] + Dim sPackageName As String + + If Left(sLib) = "/" Or If Left(sLib) = ":" Then + + ' The package name dependency must not include the version! + + hLibrary = CLibraryInfo[sLib] + sPackageName = hLibrary.GetDependencyName() + sVersion = hLibrary.Version + + aMinVersion = Split(sVersion, ".") + If aMinVersion[1] = "0" Then + If aMinVersion[0] <> "0" Then + aMinVersion[0] = CStr(CInt(aMinVersion[0]) - 1) + aMinVersion[1] = "90" + Endif + Else + aMinVersion[1] = CStr(CInt(aMinVersion[1]) - 1) + Endif + aMinVersion.Resize(3) + aMinVersion[2] = "0" + + If hLibrary.CompatibleUntil Then + aMaxVersion = Split(hLibrary.CompatibleUntil, ".") + Else + aMaxVersion = Split(sVersion, ".") + aMaxVersion.Resize(3) + aMaxVersion[2] = "90" + Endif + + ' Else If Left(sLib) = ":" Then + ' + ' sLib = File.Name(sLib) + ' iPos = RInStr(sLib, ":") + ' sVersion = Mid$(sLib, iPos + 1) + ' sLib = Left(sLib, iPos - 1) + ' + ' sPackageName = ComponentToPackageName(sLib) + ' + ' aMinVersion = Split(sVersion, ".") + ' aMaxVersion = Split(sVersion, ".") + + Else + + sPackageName = ComponentToPackageName(sLib) + + aMinVersion = Split(MIN_VERSION, ".") + aMaxVersion = Split(MAX_VERSION, ".") + + Endif + + Return Subst($sFormatMinMax, sPackageName, aMinVersion.Join("."), aMaxVersion.Join(".")) + +End + +Private Sub PrintOnlyShowIn(cLine As Collection, sCategories As String) + + Dim aCat As String[] = Split(sCategories, ";", "", True) + Dim sCat As String + Dim aOnly As New String[] + + If aCat.Exist("Screensaver") Or If aCat.Exist("TrayIcon") Or If aCat.Exist("Applet") Or If aCat.Exist("Shell") Then + + For Each sCat In aCat + If sCat = "KDE" Or If sCat = "GNOME" Or If sCat = "ROX" Or If sCat = "XFCE" Then + aOnly.Add(sCat) + Endif + Next + + If aOnly.Count Then cLine["ShowOnlyIn"] = aOnly.Join(";") & ";" + + Endif + +End + +Private Sub MakeOneLine(sStr As String) As String + + Dim iLen As Integer + + sStr = Replace(sStr, "\r", "") + sStr = Replace(sStr, "\n", " ") + sStr = Replace(sStr, "\t", " ") + + Repeat + iLen = Len(sStr) + sStr = Replace(sStr, " ", " ") + Until Len(sStr) = iLen + + Return Trim(sStr) + +End + +Private Sub PrintTranslatedDesktopEntry(cLine As Collection, sEntry As String, sText As String) + + Dim sLang As String + Dim sTrans As String + + cLine[sEntry] = MakeOneLine(sText) + + For Each sLang In Project.GetTranslations() + sTrans = CTranslation.FindTranslation(Language.GetPath(sLang, "po"), sText) + If sTrans Then cLine[sEntry & "[" & sLang & "]"] = MakeOneLine(sTrans) + Next + +End + +Private Sub PrintDesktopFile(hFile As File, sExec As String, sIcon As String, Optional sExtraCat As String) + + Dim cLine As New Collection + Dim sExtra As String + Dim iPos As Integer + + Print #hFile, "[Desktop Entry]" + Print #hFile, "Version=1.0" + + If Project.Title Then + PrintTranslatedDesktopEntry(cLine, "Name", Project.Title) + Else + PrintTranslatedDesktopEntry(cLine, "Name", Project.Name) + Endif + + If $bDescription Then PrintTranslatedDesktopEntry(cLine, "Comment", Project.Description) + + cLine["Exec"] = sExec + cLine["Icon"] = sIcon + cLine["Terminal"] = IIf(IsConsoleProject(), "true", "false") + cLine["Type"] = "Application" + cLine["StartupNotify"] = "true" + cLine["Categories"] = sExtraCat & $sCategories + If Project.MimeTypes.Count Then cLine["MimeType"] = Project.MimeTypes.Join(";") + PrintOnlyShowIn(cLine, $sCategories) + + If Trim(Project.ExtraDesktop) Then + For Each sExtra In Split(Project.ExtraDesktop, "\n") + sExtra = Trim(sExtra) + If Not sExtra Then Continue + If InStr("#;=", Left(sExtra)) Then Continue + iPos = InStr(sExtra, "=") + cLine[RTrim(Left(sExtra, iPos - 1))] = LTrim(Mid$(sExtra, iPos + 1)) + Next + Endif + + For Each sExtra In ["Name", "Comment", "Exec", "Icon", "Terminal", "Type", "StartupNotify", "Categories", "MimeType", "ShowOnlyIn"] + If cLine[sExtra] Then + Print #hFile, sExtra; "="; cLine[sExtra] + cLine.Remove(sExtra) + Endif + Next + + For Each sExtra In cLine + Print #hFile, cLine.Key; "="; sExtra + Next + +End + + +Private Sub RunCommand(sCmd As String, Optional sDir As String, Optional bIgnoreStderr As Boolean) + + Dim aCmd As New String[] + + $sOutput = "" + $bEnd = False + If sDir Then + AddLog("cd " & Shell$(sDir)) + aCmd.Push("cd " & SConv(Shell$(sDir))) + Endif + AddLog(sCmd) + aCmd.Push(sCmd) + If bIgnoreStderr = False Then aCmd.Last &= " 2>&1" + Shell aCmd.Join(" && ") For Input As "Process" + Repeat + Sleep 0.02 + Wait + Until $bEnd + +End + +Private Sub MakeSupportPackage(sSys As String) + + Dim sSupport As String + Dim aPackage As String[] + 'slackware doesn't use support packages + If sSys = "slackware" Then Return + + If $sSupportPackage = "gb.gui" Then + + sSupport = GTK_SUPPORT + aPackage = GTK_SUPPORT_PACKAGES + AddLog("\n============ " & Subst(("Making &1 support package..."), "GTK+")) + GoSub MAKE_PACKAGE + + If Not Project.Components.Exist("gb.gui.opengl") Then + sSupport = GTK3_SUPPORT + aPackage = GTK3_SUPPORT_PACKAGES + AddLog("\n============ " & Subst(("Making &1 support package..."), "GTK+3")) + GoSub MAKE_PACKAGE + Endif + + Endif + + sSupport = QT4_SUPPORT + aPackage = QT4_SUPPORT_PACKAGES + AddLog("\n============ " & Subst(("Making &1 support package..."), "QT4")) + GoSub MAKE_PACKAGE + + sSupport = QT5_SUPPORT + aPackage = QT5_SUPPORT_PACKAGES + AddLog("\n============ " & Subst(("Making &1 support package..."), "QT5")) + GoSub MAKE_PACKAGE + + Return + +MAKE_PACKAGE: + + Select Case sSys + + Case "mageia", "fedora", "suse" + MakeRpmSupportPackage(sSys, sSupport, aPackage) + + Case "debian", "ubuntu" + MakeDebSupportPackage(sSys, sSupport, aPackage) + + Case "slackware" + 'we shouldn't get here, but if we do, do nothing as not needed for slackware + 'MakeTgzSupportPackage(sSys, sSupport, aPackage) + + Case "archlinux" + MakeArchSupportPackage(sSys, sSupport, aPackage) + + Default + + End Select + + Return + +End + + +Private Function MakePackage(sSys As String) As Boolean + + Dim sErr As String + + AddLog("\n" & String(78, "=") & "\n") + AddLog(String.UCase(Subst(("Creating package for &1."), FMakeInstall.GetSystemName(sSys)))) + AddLog("\n") + + InitMake(sSys) + + Select Case sSys + + Case "mageia", "fedora", "suse" + MakeRpmPackage(sSys) + + Case "debian", "ubuntu" + MakeDebPackage(sSys) + + Case "slackware" + MakeTgzPackage(sSys) + + Case "autotools" + MakeAutotoolsPackage(sSys) + + Case "archlinux" + MakeArchPackage(sSys) + + Default + Return True + + End Select + + If $sSupportPackage Then MakeSupportPackage(sSys) + +Catch + + sErr = Error.Text + AddLog(("The package build has failed.") & "\n" & Error.Where & ": " & sErr) + FMakeInstall.ShowError("" & ("The package build has failed.") & "
      " & sErr) + Application.Busy = 0 + Return True + +End + +Private Sub GetDebianBuildPackageCommand() As String + + Dim sCmd As String + + sCmd = "dpkg-buildpackage -d -rfakeroot" + If Project.PackageSignature Then + sCmd &= " -k" & Shell(Project.Address) + Else + sCmd &= " -uc -us" + Endif + Return sCmd + +End + +' From Debian Policy Manual: +' Package names (both source and binary, see Package, Section 5.6.7) must consist only of lower case letters (a-z), digits (0-9), plus (+) and minus (-) signs, and periods (.). +' They must be at least two characters long And must start With an alphanumeric character. + + +Private Sub FormatDebPackageName(sName As String) As String + + Dim I As Integer + Dim sCar As String + Dim sRes As String + + For I = 1 To Len(sName) + sCar = Mid$(sName, I, 1) + If Not IsLetter(sCar) And If Not IsDigit(sCar) And If InStr("+-", sCar) = 0 Then sCar = "-" + sRes &= sCar + Next + + Return sRes + +End + +Private Function MakeDebPackage(sSys As String) + + Dim hFile As File + Dim sCmd As String + Dim sIcon As String + Dim sIconDir As String + Dim sArch As String + Dim sPackageName As String + Dim sPackagePath As String + Dim sLine As String + Dim hImageStat As ImageStat + Dim iSize As Integer + Dim sPath As String + Dim W As Integer + Dim H As Integer + Dim sExec As String + + Inc Application.Busy + + $sFormatSingle = ", &1" + $sFormatMin = ", &1 (>= &2)" + $sFormatMax = ", &1 (<< &3)" + $sFormatMinMax = $sFormatMin & $sFormatMax + $sFormatEqual = $sFormatMinMax + + sPackageName = FormatDebPackageName($sUnsafePackageName) + + '$sName = Replace$($sName, "_", "-") + + ' Step 1. Create the build directory + + AddLog(("Making build directory.")) + + RunCommand("rm -f " & Shell(Path &/ Subst("&1_&2", sPackageName, $sVersion)) & "*") + + sPackagePath = Path &/ Subst("&1-&2", sPackageName, $sVersion) + RunCommand("rm -Rf " & Shell$(sPackagePath)) + RunCommand("rm -Rf " & Shell$(sPackagePath & ".orig")) + + Mkdir sPackagePath + Mkdir sPackagePath &/ "src" + Mkdir sPackagePath &/ "debian" + + Mkdir sPackagePath &/ "debian/source" + File.Save(sPackagePath &/ "debian/source/format", "1.0") + + sArch = sPackagePath &/ "src/raw.tar.gz" + + ' Create icons + + sIconDir = Project.Dir &/ ".hidden/.icons" + Try Shell.RmDir(sIconDir) + Shell.MkDir(sIconDir) + + sIcon = sPackageName + + Project.StretchIcon(Project.Dir &/ Project.Icon, 32).Save(sIconDir &/ sIcon & ".xpm") + + Try hImageStat = ImageStat(Project.Dir &/ Project.Icon) + If Error Then + W = 32 + H = 32 + Else + W = hImageStat.Width + H = hImageStat.Height + Endif + + For Each iSize In DEBIAN_ICON_SIZES + If W >= iSize And If H >= iSize Then + Mkdir sIconDir &/ CStr(iSize) + Project.StretchIcon(Project.Dir &/ Project.Icon, iSize).Save(sIconDir &/ CStr(iSize) &/ sIcon & ".png") + Endif + Next + + Project.MakeSourcePackageTo(sArch) + + ' Remove the icon dir from the project now it has been archived + Shell.RmDir(sIconDir) + + sCmd = "cd " & Shell$(sPackagePath &/ "src") & "; tar xzf raw.tar.gz >/dev/null" + Shell sCmd Wait + + ' Rename the source archive project directory to the package name + 'TRY MOVE Path &/ (sPrefix & Subst("&1", Project.Name)) TO sPackagePath + Try Kill sArch + Try Shell "cp -Rf " & Shell(sPackagePath) & " " & Shell(sPackagePath & ".orig") Wait + + + ' Step 2. Make the desktop file + If Project.Type = Project.TYPE_NORMAL Then + AddLog(("Creating desktop file...")) + hFile = Open sPackagePath &/ "debian/" & sPackageName & ".desktop" For Create + PrintDesktopFile(hFile, $sName, sIcon) + Close #hFile + Endif + + 'Step 3. Create debianization needed files: control, rules + 'debian/copyright + AddLog(("Sources are being debianizated.")) + hFile = Open sPackagePath &/ "debian/copyright" For Create + Print #hFile, "This package was debianized by " & Project.Maintainer & " <" & Project.Address & "> on" + Print #hFile, Format$(Date, "ddd, dd mmm yyyy hh:nn:ss") & "+0000" + Print #hFile + Print #hFile, "Copyright Holder: " & Project.Maintainer & " <" & Project.Address & ">" + Print #hFile + Print #hFile, "License:" + Print #hFile + Print #hFile, If(Project.License, Project.License, "GNU General Public License") + Print #hFile + Print #hFile, "Created by: "; Project.Authors + Close #hFile + + 'debian/changelog + hFile = Open sPackagePath &/ "debian/changelog" For Create + Print #hFile, ChangelogToDebChangelog(sPackageName) + Close #hFile + + 'debian/compat + hFile = Open sPackagePath &/ "debian/compat" For Create + Print #hFile, DEBIAN_DEBHELPER_VERSION + Close #hFile + + 'debian/menu + If Project.Type = Project.TYPE_NORMAL Then + hFile = Open sPackagePath &/ "debian/menu" For Create + Print #hFile, "?package("; sPackageName; "):needs=\""; IIf(IsConsoleProject(), "text", "X11"); "\" section=\""; Project.Menus[sSys]; "\"\\" + Print #hFile, "title=\""; IIf(Project.Title, Project.Title, Project.Name); "\"\\" + Print #hFile, "command=\"/usr/bin/"; $sName; "\"\\" + Print #hFile, "icon=\"/usr/share/pixmaps/"; sIcon; ".xpm\"" + Close #hFile + Endif + + 'debian/dirs + hFile = Open sPackagePath &/ "debian/dirs" For Create + Select Case Project.Type + Case Project.TYPE_COMPONENT + Print #hFile, "usr/share/gambas"; System.Version; "/info" + Print #hFile, "usr/lib/gambas"; System.Version + If Exist(Project.Dir &/ ".hidden/control") Then Print #hFile, "usr/share/gambas" & System.Version & "/control/" & $sComponentName + Case Project.TYPE_LIBRARY + Print #hFile, "usr/lib/gambas"; System.Version; "/"; LCase($sVendor) + Case Project.TYPE_NORMAL + Print #hFile, "usr/bin" + Print #hFile, "usr/share/applications" + Print #hFile, "usr/share/pixmaps" + For Each iSize In DEBIAN_ICON_SIZES + Print #hFile, "usr/share/icons/hicolor/"; iSize; "x"; iSize; "/apps" + Next + End Select + Print #hFile, GetExtraFilesDir(sSys, "&1", True) + Close #hFile + + 'debian/install + hFile = Open sPackagePath &/ "debian/install" For Create + + Select Case Project.Type + + Case Project.TYPE_COMPONENT + + Print #hFile, "src/"; $sName; "/"; $sComponentName; ".gambas usr/lib/gambas" & System.Version + If Exist(Project.Dir &/ ".hidden/control") Then Print #hFile, "src/"; $sName; "/.hidden/control/*.png usr/share/gambas" & System.Version &/ "control" &/ $sComponentName + + Case Project.TYPE_LIBRARY + + Print #hFile, "src/"; $sName; "/"; $sLibraryName; ".gambas usr/lib/gambas" & System.Version; "/"; LCase($sVendor) + + Case Project.TYPE_NORMAL + + Print #hFile, "src/"; $sName; "/"; $sName; " usr/bin" + Print #hFile, "debian/"; sPackageName; ".desktop usr/share/applications" + + Print #hFile, "src/"; $sName; "/.hidden/.icons/"; sIcon; ".xpm usr/share/pixmaps" + For Each iSize In DEBIAN_ICON_SIZES + sPath = "src" &/ $sName &/ ".hidden/.icons" &/ CStr(iSize) &/ sIcon & ".png" + If Exist(sPackagePath &/ sPath) Then Print #hFile, sPath; " /usr/share/icons/hicolor/"; iSize; "x"; iSize; "/apps" + Next + + End Select + + Print #hFile, GetExtraFilesList(sSys, "src/" & $sName & "/.hidden", "&1 &3", True) + + Close #hFile + + 'debian/control + hFile = Open sPackagePath &/ "debian/control" For Create + Print #hFile, "Source: "; sPackageName + Print #hFile, "Section: contrib/"; Project.Groups[sSys] + Print #hFile, "Priority: optional" + Print #hFile, "Maintainer: "; Project.Maintainer; " <"; Project.Address; ">" + Print #hFile, "Build-Depends: debhelper (>= "; DEBIAN_DEBHELPER_VERSION; "), gambas"; System.Version; "-dev (>= "; MIN_VERSION; "), gambas"; System.Version; "-dev (<< "; MAX_VERSION; ")"; + Print #hFile, GetDependencies(); + Print #hFile, GetExtraDependencies(sSys); + Print #hFile + + Print #hFile, "Standards-Version: "; DEBIAN_STANDARD + Print #hFile + Print #hFile, "Package: "; sPackageName + Print #hFile, "Architecture: all" + Print #hFile, "Depends: gambas"; System.Version; "-runtime (>= "; MIN_VERSION; "), gambas"; System.Version; "-runtime (<< "; MAX_VERSION; ")"; + + Print #hFile, GetDependencies(); + Print #hFile, GetExtraDependencies(sSys); + Print #hFile + + Print #hFile, GetShortDesc("Description: " & $sDescription, 80) + ' If Project.Title Then + ' Print #hFile, Project.Title + ' Else + ' Print #hFile, Project.Name + ' Endif + + For Each sLine In FormatDesc($sDescription, 80) + Print #hFile, " "; sLine + Next + + Select Case Project.Type + Case Project.TYPE_NORMAL + Print #hFile, " This program is written in Gambas." + Case Project.TYPE_LIBRARY + Print #hFile, " This is a Gambas library." + Case Project.TYPE_COMPONENT + Print #hFile, " This is a Gambas component written in Gambas." + End Select + + Close #hFile + + 'debian/rules + hFile = Open sPackagePath &/ "debian/rules" For Create + Output To #hFile + Print "#!/usr/bin/make -f" + Print "build: build-stamp" + Print "build-stamp:" + Print "\tdh_testdir" + Print "\ttouch build-stamp" + Print "\t"; Project.GetCompileCommand(True, Not Project.KeepDebugInfo, True, False) & " src" &/ $sName + Print "\tgba"; System.Version; " -o "; + + Select Case Project.Type + Case Project.TYPE_COMPONENT + sExec = "src" &/ $sName &/ $sComponentName & ".gambas" + Case Project.TYPE_LIBRARY + sExec = "src" &/ $sName &/ $sLibraryName & ".gambas" + Case Project.TYPE_NORMAL + sExec = "src" &/ $sName &/ $sName + End Select + Print Shell(sExec); " src" &/ $sName + + ' If Project.Type = Project.TYPE_COMPONENT + ' If $sName <> $sComponentName Then + ' Print "\tmv "; Shell$("src" &/ $sName &/ $sName & ".gambas"); " "; Shell$("src" &/ $sName &/ $sComponentName & ".gambas") + ' Endif + ' Else If Project.Type = Project.TYPE_LIBRARY Then + ' Print "\tmv "; Shell$("src" &/ $sName &/ $sName & ".gambas"); " "; Shell$("src" &/ $sName &/ $sLibraryName & ".gambas") + ' Endif + + Print + Print "clean:" + Print "\tdh_testdir" + Print "\tdh_testroot" + Print "\trm -Rf "; Shell("src" &/ $sName &/ ".gambas") + Print "\trm -f "; Shell(sExec) + Print "\trm -f build-stamp install-stamp" + Print "\tdh_clean" + Print + Print "install: build" + Print "\tdh_testdir" + Print "\tdh_testroot" + Print "\tdh_prep" + Print "\tdh_installdirs" + If Project.Type = Project.TYPE_NORMAL Then + If $sName <> sPackageName Then Print "\tln -s " & Shell$($sName) & " \"$(CURDIR)\"/debian" &/ sPackageName &/ "/usr/bin" &/ Shell$(sPackageName) + Else If Project.Type = Project.TYPE_COMPONENT Then + Print "\tcp src" &/ $sName & "/.component \"$(CURDIR)\"/debian/" & sPackageName & "/usr/lib/gambas" & System.Version & "/" & Shell$($sComponentName) & ".component" + Print "\tcp src" &/ $sName & "/.info \"$(CURDIR)\"/debian/" & sPackageName & "/usr/share/gambas" & System.Version & "/info/" & Shell$($sComponentName) & ".info " "" + Print "\tcp src" &/ $sName & "/.list \"$(CURDIR)\"/debian/" & sPackageName & "/usr/share/gambas" & System.Version & "/info/" & Shell$($sComponentName) & ".list" + Endif + Print "\ttouch install-stamp" + Print + Print "binary-arch: build install" + Print "\tdh_testdir" + Print + Print "binary-indep: build install" + Print "\tdh_testdir -i" + Print "\tdh_testroot -i" + Print "\tdh_installdocs -i" + Print "\tdh_installchangelogs -i" + Print "\tdh_install -i" + Print "\tdh_installmenu" + Print "\tdh_compress -i" + Print "\tdh_fixperms -i" + Print "\tdh_installdeb -i" + Print "\tdh_gencontrol -i" + Print "\tdh_md5sums -i" + Print "\tdh_builddeb -i" + Print + Print "binary: binary-indep binary-arch" + Print ".PHONY: build clean binary-indep binary-arch binary install" + Output To Default + Close #hFile + Try Shell "chmod +x " & Shell(sPackagePath &/ "debian/rules") Wait + + ' Step 4. Build package + + AddLog(("Creating package...")) + 'sCmd = "cd " & Shell$(sPackagePath) & "; fakeroot dpkg-buildpackage -d" + 'sCmd = "fakeroot dpkg-buildpackage -d" + + RunCommand(GetDebianBuildPackageCommand(), sPackagePath) + + Dec Application.Busy + + If Process.LastValue > 2 Then Error.Raise(("'dpkg-buildpackage' has failed.")) + + Try Shell "rm -Rf " & Shell$(sPackagePath) Wait + Try Shell "rm -f " & Shell$(Path) &/ "*.dsc.asc" Wait + +End + +Private Function MakeDebSupportPackage(sSys As String, sSupport As String, aComp As String[]) + + Dim hFile As File + Dim sPackageName As String + Dim sPackagePath As String + Dim sDesc As String + Dim sLine As String + Dim sRelease As String + + Inc Application.Busy + + $sFormatSingle = ", &1" + $sFormatMin = ", &1 (>= &2)" + $sFormatMax = ", &1 (<< &3)" + $sFormatMinMax = $sFormatMin & $sFormatMax + $sFormatEqual = $sFormatMin & Replace($sFormatMax, "<<", "<=") + + sPackageName = FormatDebPackageName($sUnsafePackageName) & "-" & sSupport + + sRelease = CStr(Project.PackageVersion) + + ' Step 1. Create the build directory + + AddLog(("Making build directory.")) + sPackagePath = Path &/ Subst("&1-&2", sPackageName, $sVersion) + + Try Shell "rm -Rf " & Shell$(sPackagePath) Wait + Mkdir sPackagePath + Mkdir sPackagePath &/ "debian" + + 'Step 3. Create debianization needed files: control, rules + 'debian/copyright + AddLog(("Sources are being debianizated.")) + hFile = Open sPackagePath &/ "debian/copyright" For Create + Print #hFile, "This package was debianized by " & Project.Maintainer & " <" & Project.Address & "> on" + Print #hFile, Format$(Date, "ddd, dd mmm yyyy hh:nn:ss") & "+0000" + Print #hFile + Print #hFile, "Copyright Holder: " & Project.Maintainer & " <" & Project.Address & ">" + Print #hFile + Print #hFile, "License:" + Print #hFile + Print #hFile, If(Project.License, Project.License, "GNU General Public License") + Close #hFile + + 'debian/changelog + hFile = Open sPackagePath &/ "debian/changelog" For Create + Print #hFile, ChangelogToDebChangelog(sPackageName) + Close #hFile + + 'debian/compat + hFile = Open sPackagePath &/ "debian/compat" For Create + Print #hFile, DEBIAN_DEBHELPER_VERSION + Close #hFile + + 'debian/control + hFile = Open sPackagePath &/ "debian/control" For Create + Print #hFile, "Source: "; sPackageName + Print #hFile, "Section: contrib/"; Project.Groups[sSys] + Print #hFile, "Priority: optional" + Print #hFile, "Maintainer: "; Project.Maintainer; " <"; Project.Address; ">" + Print #hFile, "Build-Depends: debhelper (>= "; DEBIAN_DEBHELPER_VERSION; ")" + Print #hFile, "Standards-Version: "; DEBIAN_STANDARD + Print #hFile + Print #hFile, "Package: "; sPackageName + Print #hFile, "Architecture: all" + Print #hFile, "Depends: "; FormatDebPackageName($sUnsafePackageName);; "(>=";; $sVersionWithRelease;; "), "; FormatDebPackageName($sUnsafePackageName);; "(<=";; $sVersionWithRelease; ")"; GetDependencies(aComp) + + sDesc = sSupport & " package for " & If(Project.Title, Project.Title, Project.Name) + + Print #hFile, GetShortDesc("Description: " & sDesc, 80) + + sDesc = "This is the dummy " & sDesc + + For Each sLine In FormatDesc(sDesc) + Print #hFile, " "; sLine + Next + + + ' debian/rules + hFile = Open sPackagePath &/ "debian/rules" For Create + Output To #hFile + Print "#!/usr/bin/make -f" + Print + Print "build build-arch build-indep:" + Print + Print "clean:" + Print "\tdh_testdir" + Print "\tdh_clean" + Print + Print "install: build" + Print "\tdh_testdir" + Print "\tdh_testroot" + Print "\tdh_prep" + Print + Print "binary-arch: install" + Print + Print "binary-indep: install" + Print "\tdh_testdir" + Print "\tdh_testroot" + Print "\tdh_install" + Print "\tdh_installdocs" + Print "\tdh_installchangelogs" + Print "\tdh_compress" + Print "\tdh_fixperms" + Print "\tdh_installdeb" + Print "\tdh_gencontrol" + Print "\tdh_md5sums" + Print "\tdh_builddeb" + Print + Print "binary: binary-indep binary-arch" + Print ".PHONY: build clean binary-indep binary-arch binary install" + Print + Output To Default + Close #hFile + Try Shell "chmod +x " & Shell(sPackagePath &/ "debian/rules") Wait + + ' Step 4. Build package + + AddLog(("Creating package...")) + RunCommand(GetDebianBuildPackageCommand(), sPackagePath) + + Dec Application.Busy + + If Process.LastValue > 2 Then Error.Raise(("'dpkg-buildpackage' has failed.")) + + Try Shell "rm -Rf " & Shell$(sPackagePath) Wait + Try Shell "rm -f " & Shell$(Path) &/ "*.dsc.asc" Wait + +End + +Private Sub ChangelogToDebChangelog(sPackageName As String) As String + + Dim aLine As String[] + Dim sLine As String + Dim debChangelog As String + Dim sDate As String + Dim sBits As String[] + Dim previousLine As String + Dim sWord As String + Dim sNextWord As String + Dim aWord As String[] + + aLine = Split(ChangeLog, "\n") + + For Each sLine In aLine + + If Left$(sLine, 1) = "*" Then + + If sDate <> "" Then + 'Debian packages don't accept an empty changelog line for the release: + If previousLine = sPackageName & " (" & $sVersionWithRelease & ") unstable; urgency=low" & "\n\n" Then + debChangelog = debChangelog & " * New release version\n" + Endif + debChangelog = debChangelog & "\n -- " & Project.Maintainer & " <" & Project.Address & "> " & sDate & "\n\n" + Endif + sbits = Split(Trim$(sLine), " ") + sDate = sbits[1] & ", " & sbits[3] & " " & sbits[2] & " " & sbits[4] & " 12:00:00 +0000" + 'sVersion = GetDebVersion() + previousLine = sPackageName & " (" & $sVersionWithRelease & ") unstable; urgency=low" & "\n\n" + debChangelog &= previousLine + + Else + + If Trim$(sLine) <> "" Then + + aWord = Split(Right$(sLine, -2), " ") + previousLine = " * " + sLine = "" + For Each sWord In aWord + Repeat + If String.Len(sWord) > 76 Then + sNextWord = String.Mid$(sWord, 77) + sWord = String.Left(sWord, 76) + Else + sNextWord = "" + Endif + If String.Len(sLine & sWord) > 76 Then + previousLine &= sLine & "\n " + sLine = sWord + Else + sLine = LTrim(sLine & " " & sWord) + Endif + sWord = sNextWord + Until Not sWord + Next + If sLine Then previousLine &= sLine & "\n" + + debChangelog &= previousLine + + Endif + + Endif + + Next + + debChangelog &= "\n -- " & Project.Maintainer & " <" & Project.Address & "> " & sDate & "\n" + + Return debChangelog + +End + +Private Sub FormatRpmPackageName(sName As String) As String + + Dim I As Integer + Dim sCar As String + Dim sRes As String + Dim iLen As Integer + + For I = 1 To Len(sName) + sCar = Mid$(sName, I, 1) + If Not IsLetter(sCar) And If Not IsDigit(sCar) Then sCar = "-" + sRes &= sCar + Next + + Do + iLen = Len(sRes) + sRes = Replace(sRes, "--", "-") + If Len(sRes) = iLen Then Break + Loop + + Return sRes + +End + +Private Function MakeRpmPackage(sSys As String) + + Dim sSrc As String + Dim sDir As String + Dim sCmd As String + Dim hFile As File + Dim sArch As String + Dim sOutput As String + Dim sLang As String + Dim sPackage As String + Dim sIcon As String + Dim sDistribution As String + Dim sVendor As String + Dim sRelease As String + Dim sPackageName As String + + Inc Application.Busy + + $sFormatSingle = ",&1" + $sFormatMin = ",&1 >= &2" + $sFormatMax = ",&1 < &3" + $sFormatMinMax = $sFormatMin & $sFormatMax + $sFormatEqual = $sFormatMin & Replace($sFormatMax, "<", "<=") + + sPackageName = FormatRpmPackageName($sUnsafePackageName) + + sRelease = CStr(Project.PackageVersion) + + Select Case sSys + + Case "mageia" + sDistribution = "Mageia" + sVendor = "Mageia" + sRelease &= ".mga" + + Case "fedora" + sDistribution = "Fedora" + sVendor = "Fedora" + sRelease &= ".fdr" + + Case "suse" + sDistribution = "OpenSUSE" + sVendor = "Novell" + sRelease &= ".suse" + + End Select + + ' step 1, set up RPM dirs and macros if they're not there already + + AddLog(("Initializing ~/RPM directory.")) + + For Each sCmd In ["RPM/", "RPM/BUILD/", "RPM/RPMS/", "RPM/SOURCES/", "RPM/SPECS/", "RPM/SRPMS/", "RPM/tmp/"] + Try Mkdir $sHome &/ sCmd + Next + + hFile = Open $sHome &/ ".rpmmacros" For Create + Print #hFile, "%_topdir " & $sHome &/ "RPM" + Print #hFile, "%_tmppath " & $sHome &/ "RPM/tmp" + 'PRINT #hFile, "%_signature gpg" + 'PRINT #hFile, "%_gpg_name Mandrivalinux" + 'PRINT #hFile, "%_gpg_path ~/.gnupg" + Print #hFile, "%packager "; Project.Maintainer & "<" & SConv(Project.Address) & ">" + Print #hFile, "%buildhost "; System.Host + Print #hFile, "%distribution "; sDistribution + Print #hFile, "%vendor "; If($sVendor, $sVendor, sVendor) + Close #hFile + + ' step 2, write source tarball (with bzip) to SOURCES dir + + AddLog(("Creating source package.")) + + sSrc = $sHome &/ "RPM/SOURCES" + + sDir = Project.Dir &/ ".icon" + Shell "rm -rf " & Shell$(sDir) Wait + Try Mkdir sDir + + ' IF Project.Icon THEN + ' hIcon = Image.Load(Project.Dir &/ Project.Icon) + ' ELSE + ' hIcon = Image.Load("img/32/gambas.png") + ' ENDIF + + Project.StretchIcon(Project.Dir &/ Project.Icon, 16).Save(sDir &/ "16.png") + Project.StretchIcon(Project.Dir &/ Project.Icon, 32).Save(sDir &/ "32.png") + Project.StretchIcon(Project.Dir &/ Project.Icon, 48).Save(sDir &/ "48.png") + Project.StretchIcon(Project.Dir &/ Project.Icon, 64).Save(sDir &/ "64.png") + + sArch = sSrc &/ Subst("&1-&2.tar.bz2", sPackageName, $sVersion) + Project.MakeSourcePackageTo(sArch) + + Shell "rm -rf " & Shell$(sDir) Wait + + AddLog(("Creating .spec file.")) + + hFile = Open $sHome &/ "RPM/SPECS" &/ sPackageName & ".spec" For Create + + Print #hFile, "%define name " & sPackageName + Print #hFile, "%define version " & $sVersion + Print #hFile, "%define release "; sRelease + + Print #hFile + Print #hFile, "Summary: " & IIf(Project.Title, Project.Title, Project.Name) + Print #hFile, "Name: %{name}" + Print #hFile, "Version: %{version}" + Print #hFile, "Release: %{release}" + Print #hFile, "Source0: %{name}-%{version}.tar.bz2" + Print #hFile, "License: "; If(Project.License, Project.License, "GPL") + Print #hFile, "Group: " & Project.Groups[sSys] + Print #hFile, "BuildRoot: %{_tmppath}/%{name}-%{version}-${release}-buildroot" + If sSys <> "mageia" Then + Print #hFile, "Prefix: %{_prefix}" + Endif + 'PRINT #hFile, "BuildRequires: gambas2-ide" + Print #hFile, "BuildArch: noarch" + + Print #hFile, "Requires: gambas"; System.Version; "-runtime >= "; MIN_VERSION; ",gambas"; System.Version; "-runtime < "; MAX_VERSION; + + Print #hFile, GetDependencies(); + Print #hFile, GetExtraDependencies(sSys); + + Print #hFile + + Print #hFile, "AutoReqProv: no" + + Print #hFile, "\n%description\n" & $sDescription & "\nThis program is written in Gambas, so you will need Gambas to be installed." + + Print #hFile, "\n%prep" + If sSys <> "mageia" Then + Print #hFile, "rm -rf %{buildroot}" + Endif + + Print #hFile, "%setup -q -n " & Shell$($sName) + + If Project.Type = Project.TYPE_COMPONENT Then + + ' Components must be installed in Gambas prefix, which is not known at package creation time. + ' How can we do that? Hardcode installation path according to the distribution? + + Print #hFile, "\n%build" + Print #hFile, Project.GetCompileCommand(True, Not Project.KeepDebugInfo, True, False) & "\ngba"; System.Version + + Print #hFile, "\n%install" + Print #hFile, GetExtraFilesDir(sSys, "install -d %{buildroot}/&1") + Print #hFile, GetExtraFiles(sSys, "install -p .hidden/&1 %{buildroot}/&2/&1", "cp -R --preserve=timestamp .hidden/&1 %{buildroot}/&2/&1") + Print #hFile, "install -d %{buildroot}/%{_libdir}/gambas"; System.Version + Print #hFile, "install -p "; Shell$($sName); ".gambas %{buildroot}/%{_libdir}/gambas" & System.Version; "/"; Shell$($sComponentName); ".gambas" + Print #hFile, "install -p .component %{buildroot}/%{_libdir}/gambas"; System.Version; "/"; Shell$($sComponentName); ".component" + + Print #hFile, "install -d %{buildroot}/%{_datadir}/gambas"; System.Version; "/info" + Print #hFile, "install -p .info %{buildroot}/%{_datadir}/gambas"; System.Version; "/info/"; Shell$($sComponentName); ".info" + Print #hFile, "install -p .list %{buildroot}/%{_datadir}/gambas"; System.Version; "/info/"; Shell$($sComponentName); ".list" + + If Exist(Project.Dir &/ ".hidden/control") Then + Print #hFile, "install -d %{buildroot}/%{_datadir}/gambas"; System.Version; "/control/"; Shell$($sComponentName) + Print #hFile, "install -p "; ".hidden/control/*.png %{buildroot}/%{_datadir}/gambas" & System.Version &/ "control" &/ Shell$($sComponentName) + Endif + + Else + + Print #hFile, "\n%build" + Print #hFile, Project.GetCompileCommand(True, Not Project.KeepDebugInfo, True, False) & "\ngba"; System.Version + + Print #hFile, "\n%install" + + If Project.Type = Project.TYPE_NORMAL Then + Print #hFile, "install -Dp "; Shell$($sName); ".gambas %{buildroot}/%{_bindir}" &/ Shell$($sName) + Else If Project.Type = Project.TYPE_LIBRARY Then + Print #hFile, "install -d %{buildroot}/%{_libdir}/gambas"; System.Version; "/"; LCase($sVendor) + Print #hFile, "install -p "; Shell$($sName); ".gambas %{buildroot}/%{_libdir}/gambas"; System.Version; "/"; LCase($sVendor); "/"; Shell$($sLibraryName & ".gambas") + Endif + + Print #hFile, GetExtraFilesDir(sSys, "install -d %{buildroot}/&1") + Print #hFile, GetExtraFiles(sSys, "install -p .hidden/&1 %{buildroot}/&2/&1", "cp -R --preserve=timestamp .hidden/&1 %{buildroot}/&2/&1") + + If Project.Type = Project.TYPE_NORMAL + + sIcon = $sName & ".png" + + ' NOTE: There are explicit references to /usr/share. + ' I must find a way to use the rpm macros instead. + + Select Case sSys + + Case "mageia" + + Print #hFile, "install -Dp .icon/16.png %{buildroot}/%{_datadir}/icons/hicolor/16x16/apps" &/ Shell$(sIcon) + Print #hFile, "install -Dp .icon/32.png %{buildroot}/%{_datadir}/icons/hicolor/32x32/apps" &/ Shell$(sIcon) + Print #hFile, "install -Dp .icon/48.png %{buildroot}/%{_datadir}/icons/hicolor/48x48/apps" &/ Shell$(sIcon) + Print #hFile, "install -Dp .icon/64.png %{buildroot}/%{_datadir}/icons/hicolor/64x64/apps" &/ Shell$(sIcon) + + If $sName <> sPackageName Then Print #hFile, "ln -s " & Shell$($sName) & " \"%{buildroot}/%{_bindir}\"/" & Shell$(sPackageName) + + Print #hFile, "install -d %{buildroot}/%{_datadir}/applications" + Print #hFile, "cat << EOF > %{buildroot}/%{_datadir}/applications/%{name}.desktop" + + PrintDesktopFile(hFile, $sName, $sName) ', "X-MandrivaLinux-" & Replace(Replace(Project.Menus[sSys], " ", ""), "/", "-") & ";") + + Print #hFile, "EOF" + + Case "fedora" + + Print #hFile, "install -d %{buildroot}/%{_datadir}/pixmaps" + Print #hFile, "install -d %{buildroot}/%{_datadir}/applications" + Print #hFile, "install -p .icon/48.png %{buildroot}/%{_datadir}/pixmaps" &/ Shell$(sIcon) + + If $sName <> sPackageName Then Print #hFile, "ln -s " & Shell$($sName) & " \"%{buildroot}/%{_bindir}\"/" & Shell$(sPackageName) + + Print #hFile, "cat << EOF > %{buildroot}%{_datadir}/applications/%{name}.desktop" + + PrintDesktopFile(hFile, $sName, sIcon, "X-RedHat-Extra;") + + Print #hFile, "EOF" + + Case "suse" + + Print #hFile, "install -d %{buildroot}/%{_datadir}/pixmaps" + Print #hFile, "install -d %{buildroot}/%{_datadir}/applications" + Print #hFile, "install -p .icon/48.png %{buildroot}/%{_datadir}/pixmaps" &/ Shell$(sIcon) + + If $sName <> sPackageName Then Print #hFile, "ln -s " & Shell$($sName) & " \"%{buildroot}/%{_bindir}\"/" & Shell$(sPackageName) + + Print #hFile, "cat << EOF > %{buildroot}%{_datadir}/applications/%{name}.desktop" + + PrintDesktopFile(hFile, $sName, sIcon) + + Print #hFile, "EOF" + + End Select + + Endif + + Endif + + If sSys <> "mageia" Then + + Print #hFile, "\n%clean" + Print #hFile, "rm -rf %{buildroot}" + + Endif + + Print #hFile, "\n%files" + + If sSys <> "mageia" Then + + Print #hFile, "%defattr(-,root,root)" + + Endif + + If Project.Type = Project.TYPE_COMPONENT Then + + Print #hFile, FormatFileInList("%{_libdir}/gambas" & System.Version & "/" & $sComponentName & ".gambas") + Print #hfile, FormatFileInList("%{_libdir}/gambas" & System.Version & "/" & $sComponentName & ".component") + + Print #hFile, FormatFileInList("%{_datadir}/gambas" & System.Version & "/info/" & $sComponentName & ".info") + Print #hFile, FormatFileInList("%{_datadir}/gambas" & System.Version & "/info/" & $sComponentName & ".list") + + If Exist(Project.Dir &/ ".hidden/control") Then + Print #hFile, FormatFileInList("%{_datadir}/gambas" & System.Version & "/control/" & $sComponentName & "/*.png") + Endif + Print #hFile, GetExtraFilesList(sSys, "", "&2"); + + Else + + If Project.Type = Project.TYPE_NORMAL Then + Print #hFile, FormatFileInList("%{_bindir}" &/ $sName) + Print #hFile, FormatFileInList("%{_bindir}" &/ sPackageName) + Else If Project.Type = Project.TYPE_LIBRARY Then + Print #hFile, FormatFileInList("%{_libdir}/gambas" & System.Version &/ LCase($sVendor) &/ $sLibraryName & ".gambas") + Endif + + Print #hFile, GetExtraFilesList(sSys, "", "&2"); + + If Project.Type = Project.TYPE_NORMAL Then + + Select Case sSys + + Case "mageia" + + Print #hFile, FormatFileInList("%{_datadir}/icons/hicolor/*/apps" &/ sIcon) + 'PRINT #hFile, "/%{_menudir}" &/ sName + Print #hFile, "%{_datadir}/applications/%{name}.desktop" + + Case "fedora" + + Print #hFile, FormatFileInList("%{_datadir}/pixmaps" &/ sIcon) + Print #hFile, "%{_datadir}/applications/%{name}.desktop" + + Case "suse" + + Print #hFile, FormatFileInList("%{_datadir}/pixmaps" &/ sIcon) + Print #hFile, "%{_datadir}/applications/%{name}.desktop" + + End Select + + Endif + + Endif + + Print #hFile, "\n%changelog\n" + Print #hFile, ChangeLog + + Close #hFile + + ' and step 4.... build that sucker. + + AddLog(("Creating package...") & "\n") + + sLang = System.Language + System.Language = "C" + + sCmd = RPMBUILD_PROG & " -ba " & Shell$($sHome &/ "RPM/SPECS" &/ sPackageName & ".spec") + AddLog(sCmd) + + 'sTemp = Temp$ + $sOutput = "" + $bEnd = False + Shell sCmd & " 2>&1" Wait For Read As "Process" 'TO sOutput + ' REPEAT + ' SLEEP 0.01 + ' WAIT + ' UNTIL $bEnd + + AddLog("") + + sOutput = Replace($sOutput, "\r", "") + Try sOutput = DConv(sOutput) + + Try Kill $sHome &/ ".rpmmacros" + + System.Language = sLang + + Dec Application.Busy + + If Process.LastValue Then Error.Raise(("'rpmbuild' has returned the following error code:") & " " & Process.LastValue) + + For Each sCmd In Split(sOutput, "\n") + If Left(sCmd, 6) = "Wrote:" And Right$(sCmd, 10) = "noarch.rpm" Then + + sPackage = Subst("&1-&2-&3.noarch.rpm", sPackageName, $sVersion, sRelease) + ' IF sSys = "debian" THEN + ' SHELL "cd " & Shell$(sHome &/ "RPM/RPMS/noarch") & "; fakeroot " & ALIEN_PROG & " --to-deb -k " & Shell$(sPackage) WAIT + ' sPackage = sPrefix & Subst("&1_&2.&3-&4_all.deb", LCase(Project.Name), Project.MajorVersion, Project.MinorVersion, sRelease) + ' IF NOT Exist(sHome &/ "RPM/RPMS/noarch" &/ sPackage) THEN Error.Raise("alien command has failed") + ' ENDIF + MoveFile($sHome &/ "RPM/RPMS/noarch" &/ sPackage, Path &/ sPackage) + AddLog(sPackage) + + sPackage = Subst("&1-&2-&3.src.rpm", sPackageName, $sVersion, sRelease) + ' IF sSys = "debian" THEN + ' SHELL "cd " & Shell$(sHome &/ "RPM/SRPMS") & "; fakeroot alien --to-deb -k " & Shell$(sPackage) WAIT + ' sPackage = sPrefix & Subst("&1_&2.&3-&4_all.deb", LCase(Project.Name), Project.MajorVersion, Project.MinorVersion, sRelease) + ' IF NOT Exist(sHome &/ "RPM/SRPMS" &/ sPackage) THEN Error.Raise("alien command has failed") + ' MoveFile(sHome &/ "RPM/SRPMS" &/ sPackage, Path &/ File.BaseName(sPackage) & ".src.deb") + ' ELSE + MoveFile($sHome &/ "RPM/SRPMS" &/ sPackage, Path &/ sPackage) + AddLog(sPackage) + ' ENDIF + + End If + Next + +End + +Private Function MakeRpmSupportPackage(sSys As String, sSupport As String, aComp As String[]) + + Dim sCmd As String + Dim hFile As File + Dim sOutput As String + Dim sLang As String + Dim sPackage As String + Dim sDistribution As String + Dim sVendor As String + Dim sRelease As String + Dim sPackageName As String + Dim sDependency As String + + Inc Application.Busy + + $sFormatSingle = ",&1" + $sFormatMin = ",&1 >= &2" + $sFormatMax = ",&1 < &3" + $sFormatMinMax = $sFormatMin & $sFormatMax + $sFormatEqual = $sFormatMinMax + + sPackageName = FormatRpmPackageName($sUnsafePackageName) & "-" & sSupport + + sRelease = CStr(Project.PackageVersion) + + Select Case sSys + + Case "mageia" + sDistribution = "Mageia" + sVendor = "Mageia" + sRelease &= ".mga" + + Case "fedora" + sDistribution = "Fedora" + sVendor = "Fedora" + sRelease &= ".fdr" + + Case "suse" + sDistribution = "OpenSUSE" + sVendor = "Novell" + sRelease &= ".suse" + + End Select + + ' step 1, set up RPM dirs and macros if they're not there already + + AddLog(("Initializing ~/RPM directory.")) + + For Each sCmd In ["RPM/", "RPM/BUILD/", "RPM/RPMS/", "RPM/SOURCES/", "RPM/SPECS/", "RPM/SRPMS/", "RPM/tmp/"] + Try Mkdir $sHome &/ sCmd + Next + + hFile = Open $sHome &/ ".rpmmacros" For Create + Print #hFile, "%_topdir " & $sHome &/ "RPM" + Print #hFile, "%_tmppath " & $sHome &/ "RPM/tmp" + 'PRINT #hFile, "%_signature gpg" + 'PRINT #hFile, "%_gpg_name Mandrivalinux" + 'PRINT #hFile, "%_gpg_path ~/.gnupg" + Print #hFile, "%packager "; Project.Maintainer & "<" & SConv(Project.Address) & ">" + Print #hFile, "%buildhost "; System.Host + Print #hFile, "%distribution "; sDistribution + Print #hFile, "%vendor "; If($sVendor, $sVendor, sVendor) + Close #hFile + + ' step 2, write source tarball (with bzip) to SOURCES dir + + AddLog(("Creating .spec file.")) + + hFile = Open $sHome &/ "RPM/SPECS" &/ sPackageName & ".spec" For Create + + Print #hFile, "%define name " & sPackageName + Print #hFile, "%define version " & $sVersion + Print #hFile, "%define release "; sRelease + + Print #hFile + Print #hFile, "Summary: "; sSupport; " support for "; IIf(Project.Title, Project.Title, Project.Name) + Print #hFile, "Name: %{name}" + Print #hFile, "Version: %{version}" + Print #hFile, "Release: %{release}" + 'Print #hFile, "Source0: " '"%{name}-%{version}.tar.bz2" + Print #hFile, "License: "; If(Project.License, Project.License, "GPL") + Print #hFile, "Group: " & Project.Groups[sSys] + 'Print #hFile, "BuildRoot: %{_tmppath}/%{name}-%{version}-${release}-buildroot" + If sSys <> "mageia" Then + Print #hFile, "Prefix: %{_prefix}" + Endif + 'PRINT #hFile, "BuildRequires: gambas2-ide" + Print #hFile, "BuildArch: noarch" + + sDependency = $sVersion & "-" & sRelease + + Print #hFile, "Requires: "; FormatRpmPackageName($sUnsafePackageName);; ">=";; sDependency;; ","; FormatRpmPackageName($sUnsafePackageName);; "<=";; sDependency; GetDependencies(aComp) + + Print #hFile + + Print #hFile, "AutoReqProv: no" + + Print #hFile, "\n%description\n"; "This is the "; sSupport; " support for "; Project.Name + + Print #hFile, "\n%files" + If sSys <> "mageia" Then + Print #hFile, "%defattr(-,root,root)" + Endif + + Print #hFile, "\n%changelog\n" + Print #hFile, ChangeLog + + Close #hFile + + ' and step 4.... build that sucker. + + AddLog(("Creating package...") & "\n") + + sLang = System.Language + System.Language = "C" + + sCmd = RPMBUILD_PROG & " -ba " & Shell$($sHome &/ "RPM/SPECS" &/ sPackageName & ".spec") + AddLog(sCmd) + + 'sTemp = Temp$ + $sOutput = "" + $bEnd = False + Shell sCmd & " 2>&1" Wait For Read As "Process" 'TO sOutput + ' REPEAT + ' SLEEP 0.01 + ' WAIT + ' UNTIL $bEnd + + AddLog("") + + sOutput = Replace($sOutput, "\r", "") + Try sOutput = DConv(sOutput) + + Try Kill $sHome &/ ".rpmmacros" + + System.Language = sLang + + Dec Application.Busy + + If Process.LastValue Then Error.Raise(("'rpmbuild' has returned the following error code:") & " " & Process.LastValue) + + For Each sCmd In Split(sOutput, "\n") + If Left(sCmd, 6) = "Wrote:" And Right$(sCmd, 10) = "noarch.rpm" Then + + sPackage = Subst("&1-&2-&3.noarch.rpm", sPackageName, $sVersion, sRelease) + ' IF sSys = "debian" THEN + ' SHELL "cd " & Shell$(sHome &/ "RPM/RPMS/noarch") & "; fakeroot " & ALIEN_PROG & " --to-deb -k " & Shell$(sPackage) WAIT + ' sPackage = sPrefix & Subst("&1_&2.&3-&4_all.deb", LCase(Project.Name), Project.MajorVersion, Project.MinorVersion, sRelease) + ' IF NOT Exist(sHome &/ "RPM/RPMS/noarch" &/ sPackage) THEN Error.Raise("alien command has failed") + ' ENDIF + MoveFile($sHome &/ "RPM/RPMS/noarch" &/ sPackage, Path &/ sPackage) + AddLog(sPackage) + + sPackage = Subst("&1-&2-&3.src.rpm", sPackageName, $sVersion, sRelease) + ' IF sSys = "debian" THEN + ' SHELL "cd " & Shell$(sHome &/ "RPM/SRPMS") & "; fakeroot alien --to-deb -k " & Shell$(sPackage) WAIT + ' sPackage = sPrefix & Subst("&1_&2.&3-&4_all.deb", LCase(Project.Name), Project.MajorVersion, Project.MinorVersion, sRelease) + ' IF NOT Exist(sHome &/ "RPM/SRPMS" &/ sPackage) THEN Error.Raise("alien command has failed") + ' MoveFile(sHome &/ "RPM/SRPMS" &/ sPackage, Path &/ File.BaseName(sPackage) & ".src.deb") + ' ELSE + MoveFile($sHome &/ "RPM/SRPMS" &/ sPackage, Path &/ sPackage) + AddLog(sPackage) + ' ENDIF + + End If + Next + +End + +Private Sub PrintSlackDescRuler(hFile As File, sPackageName As String) + + Dim sLine As String + + sLine = Space(Len(sPackageName)) & "|-----handy-ruler" & String$(76, "-") + sLine = Left(sLine, 75) & "|" + Print #hFile, sLine + +End + +Private Sub PrintSlackDesc(hFile As File, sLine As String, sPackageName As String) + + sLine = sPackageName & ": " & sLine + sLine = Left(sLine, 76) + Print #hFile, sLine + +End + + +Private Sub PrintSlackDescContents(hFile As File, sData As String, nLine As Integer, sPackageName As String) + + Dim sLine As String + Dim iPos As Integer + + While nLine + If sData Then + If Len(sData) > (76 - Len(sPackageName) - 2) Then + sLine = Left(sData, 76 - Len(sPackageName) - 2) + iPos = RInStr(sLine, " ") + If iPos Then sLine = RTrim(Left(sLine, iPos - 1)) + sData = LTrim(Mid$(sData, Len(sLine) + 1)) + Else + sLine = sData + sData = "" + Endif + Else + sLine = "" + Endif + PrintSlackDesc(hFile, sLine, sPackageName) + Dec nLine + Wend + +End + +Private Sub FormatTgzPackageName(sName As String) As String + + ' Use the same format as RPM at the moment + Return FormatRpmPackageName(sName) + +End + +Private Sub MakeTgzPackage(sSys As String) + + Dim sDistribution As String + Dim sVendor As String + Dim sBuildDir As String + Dim hFile As File + 'Dim sPrefix As String + Dim sCmd As String + Dim sIcon As String + Dim sData As String + Dim sTempPackage As String + Dim sPackage As String + Dim sFile As String + Dim sPackageName As String + + Inc Application.Busy + + $sFormatSingle = "&1\n" + $sFormatMin = "&1 >= &2\n" + $sFormatMax = "&1 < &3\n" + $sFormatMinMax = $sFormatMin & $sFormatMax + $sFormatEqual = $sFormatMinMax + + sPackageName = FormatTgzPackageName($sUnsafePackageName) + sDistribution = "Slackware" + sVendor = "Slackware" + + ' 1. Create the temporary build directory + + AddLog(("Making build directory.")) + + sBuildDir = File.SetExt(Temp$("slackware"), "") + Shell "rm -rf " & Shell(sBuildDir) Wait + Mkdir sBuildDir + + Select Case Project.Type + + Case Project.TYPE_COMPONENT + + For Each sCmd In ["/usr", "/usr/lib", "/usr/lib/gambas" & System.Version, "/usr/share", "/usr/share/gambas" & System.Version, "/usr/share/gambas" & System.Version & "/info", "/install"] + Try Mkdir sBuildDir &/ sCmd + Next + + Case Project.TYPE_LIBRARY + + For Each sCmd In ["/usr", "/usr/lib", "/usr/lib/gambas" & System.Version, "/usr/lib/gambas" & System.Version &/ LCase($sVendor), "/install"] + Try Mkdir sBuildDir &/ sCmd + Next + + Case Project.TYPE_NORMAL + + For Each sCmd In ["/usr", "/usr/bin", "/usr/share", "/usr/share/applications", "/usr/share/pixmaps", "/install"] + Try Mkdir sBuildDir &/ sCmd + Next + + End Select + + CopyExtraFiles(sSys, sBuildDir) + + If Project.Type = Project.TYPE_COMPONENT Then + + ' 2. Copy the library, the information files and the controls + + Copy Project.GetExecPath() To sBuildDir &/ "/usr/lib/gambas" & System.Version &/ $sComponentName & ".gambas" + Copy Project.Dir &/ ".component" To sBuildDir &/ "/usr/lib/gambas" & System.Version &/ $sComponentName & ".component" + Copy Project.Dir &/ ".info" To sBuildDir &/ "/usr/share/gambas" & System.Version &/ "info/" & $sComponentName & ".info" + Copy Project.Dir &/ ".list" To sBuildDir &/ "/usr/share/gambas" & System.Version &/ "info/" & $sComponentName & ".list" + + If Exist(Project.Dir &/ ".hidden/control") Then + Try Mkdir sBuildDir &/ "/usr/share/gambas" & System.Version & "/control" + Try Mkdir sBuildDir &/ "/usr/share/gambas" & System.Version & "/control/" & $sComponentName + For Each sFile In Dir(Project.Dir &/ ".hidden/control", "*.png") + Copy Project.Dir &/ ".hidden/control" &/ sFile To sBuildDir &/ "/usr/share/gambas" & System.Version & "/control/" & $sComponentName &/ sFile + Next + Endif + + Else + + ' 2. Copy the executable + + 'COPY Project.Dir &/ Project.Name & ".gambas" TO sBuildDir &/ "/usr/bin" &/ Project.Name + + If Project.Type = Project.TYPE_NORMAL Then + Copy Project.GetExecPath() To sBuildDir &/ "/usr/bin" &/ $sName + Chmod sBuildDir &/ "/usr/bin" &/ $sName To "..x..x..x" + If $sName <> sPackageName Then Link $sName To sBuildDir &/ "/usr/bin" &/ sPackageName + Else If Project.Type = Project.TYPE_LIBRARY Then + Copy Project.GetExecPath() To sBuildDir &/ "/usr/lib/gambas" & System.Version &/ LCase($sVendor) &/ $sLibraryName & ".gambas" + Chmod sBuildDir &/ "/usr/lib/gambas" & System.Version &/ LCase($sVendor) &/ $sLibraryName & ".gambas" To "..x..x..x" + Endif + + If Project.Type = Project.TYPE_NORMAL Then + + ' 3. Copy the icon + + ' IF Project.Icon THEN + ' hIcon = Image.Load(Project.Dir &/ Project.Icon) + ' ELSE + ' hIcon = Image.Load("img/gambas.png") + ' ENDIF + + Project.StretchIcon(Project.Dir &/ Project.Icon, 48).Save(sBuildDir &/ "/usr/share/pixmaps" &/ Project.Name & ".png") + + ' 4. Make the desktop file + + sIcon = Shell$($sName) & ".png" + + hFile = Open sBuildDir &/ "/usr/share/applications/" & sPackageName & ".desktop" For Create + + PrintDesktopFile(hFile, $sName, "/usr/share/pixmaps/" & $sName & ".png") + + Close #hFile + ' if we are creating a project with desktop icon/menu we need to run a doinst.sh in the package + ' to make sure the menu item appears without needing a restart of xwindows. + hFile = Open sBuildDir &/ "install" &/ "doinst.sh" For Create + Print #hFile, "if [ -x /usr/bin/update-desktop-database ]; then" + Print #hfile, " /usr/bin/update-desktop-database -q usr/share/applications >/dev/null 2>&1" + Print #hFile, "fi" + Close #hFile + + + Endif + + Endif + + ' 5. Description file + + hFile = Open sBuildDir &/ "/install/slack-desc" For Create + + Print #hFile, File.Load("install/slack-desc-header"); + PrintSlackDescRuler(hFile, sPackageName) + PrintSlackDesc(hFile, Subst("&1 &2: &3", sPackageName, $sVersion, If(Project.Title, Project.Title, Project.Name)), sPackageName) + PrintSlackDesc(hFile, "", sPackageName) + sData = Replace($sDescription, "\n", " ") + PrintSlackDescContents(hFile, sData, 7, sPackageName) + PrintSlackDesc(hFile, "Package created by: " & Project.Maintainer, sPackageName) + PrintSlackDesc(hFile, "EMail address: " & Project.Address, sPackageName) + + Close #hFile + + ' 6. Dependencies. only used by slapt-get. other tools, like installpkg don't use it. + ' gambas is packaged a a single package - gambas3 including everything. + + hFile = Open sBuildDir &/ "/install/slack-required" For Create + + Print #hFile, "gambas"; System.Version; " >= "; MIN_VERSION + Print #hFile, "gambas"; System.Version; " < "; MAX_VERSION + + Print #hFile, GetDependencies(); + Print #hFile, GetExtraDependencies(sSys); + + Close #hFile + + ' 7. Create package + + AddLog(("Creating package...") & "\n") + + sTempPackage = File.SetExt(Temp$("slackware"), "tgz") + sCmd = TAR_1_13_PROG & " --exclude=slackware.tgz --owner=root --group=root -c -z -f " & Shell$(sTempPackage) & " ." + RunCommand(sCmd, sBuildDir) + ' AddLog(sCmd) + ' $sOutput = "" + ' $bEnd = FALSE + ' SHELL "(cd " & SConv(Shell$(sBuildDir)) & ";" & sCmd & ") 2>&1" FOR READ 'TO sOutput + ' REPEAT + ' SLEEP 0.01 + ' WAIT + ' UNTIL $bEnd + + Dec Application.Busy + + If Process.LastValue Then Error.Raise(("'tar' has returned the following error code:") & " " & Process.LastValue) + + AddLog("") + sPackage = Subst("&1-&2-noarch-&3.tgz", sPackageName, $sVersion, CStr(Project.PackageVersion)) + MoveFile(sTempPackage, Path &/ sPackage) + AddLog(sPackage) + +End + +' Private Sub MakeTgzSupportPackage((sSys) As String, sSupport As String, aComp As String[]) +' +' Dim sDistribution As String +' Dim sVendor As String +' Dim sBuildDir As String +' Dim hFile As File +' 'Dim sPrefix As String +' Dim sCmd As String +' Dim sData As String +' Dim sTempPackage As String +' Dim sPackage As String +' Dim sPackageName As String +' +' Inc Application.Busy +' +' $sFormatSingle = "&1\n" +' $sFormatMin = "&1 >= &2\n" +' $sFormatMax = "&1 < &3\n" +' $sFormatMinMax = $sFormatMin & $sFormatMax +' $sFormatEqual = $sFormatMinMax +' +' sPackageName = FormatTgzPackageName($sUnsafePackageName) & "-" & sSupport +' sDistribution = "Slackware" +' sVendor = "Slackware" +' +' ' 1. Create the temporary build directory +' +' AddLog(("Making build directory.")) +' +' sBuildDir = File.SetExt(Temp$("slackware"), "") +' Shell "rm -rf " & Shell(sBuildDir) Wait +' Mkdir sBuildDir +' Try Mkdir sBuildDir &/ "install" +' +' ' 5. Description file +' +' hFile = Open sBuildDir &/ "/install/slack-desc" For Create +' +' Print #hFile, File.Load("install/slack-desc-header"); +' PrintSlackDescRuler(hFile, sPackageName) +' PrintSlackDesc(hFile, Subst("&1 &2: &3", sPackageName, $sVersion, sSupport & " support for " & IIf(Project.Title, Project.Title, Project.Name)), sPackageName) +' PrintSlackDesc(hFile, "", sPackageName) +' sData = sSupport & " support for " & IIf(Project.Title, Project.Title, Project.Name) +' PrintSlackDescContents(hFile, sData, 7, sPackageName) +' PrintSlackDesc(hFile, "Package created by: " & Project.Maintainer, sPackageName) +' PrintSlackDesc(hFile, "EMail address: " & Project.Address, sPackageName) +' +' Close #hFile +' +' ' 6. Dependencies +' +' hFile = Open sBuildDir &/ "/install/slack-required" For Create +' +' Print #hFile, FormatTgzPackageName($sUnsafePackageName); " >= "; $sVersion +' Print #hFile, FormatTgzPackageName($sUnsafePackageName); " <= "; $sVersion +' Print #hFile, GetDependencies(aComp); +' +' Close #hFile +' +' ' 7. Create package +' +' AddLog(("Creating package...") & "\n") +' +' sTempPackage = File.SetExt(Temp$("slackware"), "tgz") +' sCmd = TAR_1_13_PROG & " --exclude=slackware.tgz --owner=root --group=root -c -z -f " & Shell$(sTempPackage) & " ." +' RunCommand(sCmd, sBuildDir) +' ' AddLog(sCmd) +' ' $sOutput = "" +' ' $bEnd = FALSE +' ' SHELL "(cd " & SConv(Shell$(sBuildDir)) & ";" & sCmd & ") 2>&1" FOR READ 'TO sOutput +' ' REPEAT +' ' SLEEP 0.01 +' ' WAIT +' ' UNTIL $bEnd +' +' Dec Application.Busy +' +' If Process.LastValue Then Error.Raise(("'tar' has returned the following error code:") & " " & Process.LastValue) +' +' AddLog("") +' sPackage = Subst("&1-&2-noarch-&3.tgz", sPackageName, $sVersion, CStr(Project.PackageVersion)) +' MoveFile(sTempPackage, Path &/ sPackage) +' AddLog(sPackage) +' +' End +' +Private Sub MakeAutotoolsPackage((sSys) As String) + + Dim sBuildDir As String + Dim sFile As String + Dim hFile As File + Dim sCmd As String + Dim sPackage As String + + sPackage = GetPackageName($sName) + + ' 1. Create the temporary build directory + + AddLog(("Making build directory.")) + Inc Application.Busy + + sBuildDir = File.SetExt(Temp$("autotools"), "") + Shell "rm -rf " & Shell(sBuildDir) Wait + Mkdir sBuildDir + + ' 2. Copy needed files + + Try sCmd = Scan(Project.GetCompileCommand(True, Not Project.KeepDebugInfo, True, False), "*/bin/gbc" & System.Version & " *")[1] + + 'Mkdir sBuildDir &/ Project.Name + Shell "cp -rL " & Shell$(Project.Dir) & " " & Shell$(sBuildDir &/ $sName) Wait + sFile = Replace(File.Load("install/acinclude.m4"), "$(VERSION)", CStr(System.Version)) + sFile = Replace(sFile, "$(PACKAGE_VERSION)", $sVersion) + sFile = Replace(sFile, "$(EXTRA_TEST)", Project.ExtraAutoconfTest) + File.Save(sBuildDir &/ "acinclude.m4", sFile) + sFile = Replace(File.Load("install/Makefile.am"), "$(VERSION)", CStr(System.Version)) + sFile = Replace(sFile, "$(COMPILE_FLAGS)", sCmd) + File.Save(sBuildDir &/ "Makefile.am", sFile) + + ' 3. Create needed files (AUTHORS, README, COPYING, NEWS, ChangeLog, configure.ac) + + If Exist(sBuildDir &/ $sName &/ "CHANGELOG") Then + Move sBuildDir &/ $sName &/ "CHANGELOG" To sBuildDir &/ "ChangeLog" + Endif + + File.Save(sBuildDir &/ "ChangeLog", ChangeLog) + File.Save(sBuildDir &/ "AUTHORS", Project.Maintainer & " <" & Project.Address & ">") + File.Save(sBuildDir &/ "README", Project.Description) + File.Save(sBuilddir &/ "COPYING", "This program is under : " & Project.License) + File.Save(sBuilddir &/ "NEWS", "") + + hFile = Open sBuildDir &/ "configure.ac" For Create + Print #hFile, "dnl -- package generated with gambas3 ide --" + Print #hFile, "" + Print #hFile, "AC_INIT([" & $sName & "],[" & $sVersion & "],[],[" & $sName & "])" + Print #hFile, "AC_CONFIG_SRCDIR([configure.ac])" + If Project.Type = Project.TYPE_COMPONENT Then + Print #hFile, "GB_INIT_PROJECT([" & $sName & "],[" & sPackage & "],[" & $sComponentName & "])" + Else + Print #hFile, "GB_INIT_PROJECT([" & $sName & "],[" & sPackage & "])" + Endif + Print #hFile, "" + Print #hFile, "dnl -- create makefile --" + Print #hFile, "" + Print #hFile, "AC_OUTPUT(Makefile)" + Close #hFile + + ' 4. create the package + + AddLog(("Creating package...") & "\n") + + For Each sCmd In ["aclocal", AUTOCONF_PROG, AUTOMAKE_PROG & " -a", "./configure", "make dist"] + RunCommand(sCmd, sBuildDir) + Next + + Dec Application.Busy + AddLog("") + + sPackage = Dir(sBuildDir, $sName & "*" & $sVersion & "*")[0] + MoveFile(sBuildDir &/ sPackage, Path &/ GetPackagePrefix(Project.Type, $sVendor, $sVendorPrefix, Project.Prefix) & sPackage) + AddLog(sPackage) + + ' Remove build dir + Shell "rm -rf " & Shell(sBuildDir) Wait + +End + +Private Sub FormatArchPackageName(sName As String) As String + + Dim I As Integer + Dim sCar As String + Dim sRes As String + + For I = 1 To Len(sName) + sCar = Mid$(sName, I, 1) + If Not IsLetter(sCar) And If Not IsDigit(sCar) Then sCar = "-" + sRes &= sCar + Next + + Return sRes + +End + + +Private Function MakeArchPackage(sSys As String) + + Dim sBuildDir As String + Dim sPkgTgz As String + Dim hFile As File + Dim sCmd As String + Dim sDependencies As String + Dim sPkgDesc As String + Dim sPackageName As String + + Inc Application.Busy + + sPackageName = FormatArchPackageName($sUnsafePackageName) + + sPkgDesc = Replace($sDescription, "\n", " ") + + If sPkgDesc = "" Then sPkgDesc = "a software done with Gambas3" + + $sFormatMinMax = "'&1>=&2' '&1<=&3' " + $sFormatMin = "'&1>=&2' " + $sFormatMax = "'&1<=&3' " + $sFormatSingle = "'&1' " + $sFormatEqual = "'&1=&2' " + sDependencies = GetDependencies() & GetExtraDependencies(sSys) + + ' 1. Create the temporary build directory + + AddLog(("Making build directory.")) + + sBuildDir = File.SetExt(Temp$("archlinux"), "") + Shell "rm -rf " & Shell$(sBuildDir) Wait + Mkdir sBuildDir + + ' 2. Copy needed files + + sPkgTgz = $sName & "-" & $sVersion & ".tar.bz2" + Project.MakeSourcePackageTo(sBuildDir &/ sPkgTgz) + + File.Save(sBuilddir &/ "license.txt", "This program is under : " & Project.License) + + If Project.Type = Project.TYPE_NORMAL Then + + Project.StretchIcon(Project.Dir &/ Project.Icon, 48).Save(sBuildDir &/ Project.Name & ".png") + + hFile = Open sBuildDir &/ sPackageName & ".desktop" For Create + PrintDesktopFile(hFile, $sName, "/usr/share/pixmaps/" & $sName & ".png") + Close #hFile + + Endif + + hFile = Open sBuildDir &/ "PKGBUILD" For Create + Print #hFile, "# generated by the gambas3 ide" + Print #hFile, "# Maintainer : " & Project.Maintainer & " <" & Project.Address & ">" + Print #hFile, "" + Print #hFile, "pkgname="; sPackageName + Print #hFile, "_realname="; $sName + Print #hFile, "pkgdesc=\"" & sPkgDesc & "\"" + Print #hFile, "pkgver=" & $sVersion + Print #hFile, "pkgrel="; Project.PackageVersion + Print #hFile, "arch=('any')" + Print #hFile, "url=\"" & Project.Url & "\"" + If Me.ChangeLog Then + File.Save(sBuildDir &/ "ChangeLog", Me.ChangeLog) + Print #hFile, "changelog=ChangeLog" + Endif + Print #hFile, "license=('custom')" + If Len(sDependencies) > 0 Then + Print #hFile, "depends=(" & Left$(sDependencies, -1) & ")" + Endif + Print #hFile, "makedepend=('gambas3-devel')" + Print #hFile, "source=(${_realname}-$pkgver.tar.bz2 license.txt"; + If Project.Type = Project.TYPE_NORMAL Then + Print #hFile, "\\\n '" & sPackageName & ".desktop'"; + Print #hFile, " '" & Project.Name & ".png'"; + Endif + Print #hFile, ")" + Close #hFile + + RunCommand("makepkg -m -g >> PKGBUILD", sBuildDir, True) + If Process.LastValue > 0 Then Error.Raise(("'makepkg' has failed.")) + + hFile = Open sBuildDir &/ "PKGBUILD" For Append + + Print #hFile, "" + Print #hFile, "build() {" + Print #hFile, " cd ${srcdir}/${_realname}" + Print #hFile, "" + Print #hFile, " "; Project.GetCompileCommand(True, Not Project.KeepDebugInfo, True, False); " && gba"; System.Version + Print #hFile, "}" + Print #hFile, "" + Print #hFile, "package() {" + Print #hFile, " cd ${srcdir}/${_realname}" + Print #hFile, "" + + Select Case Project.Type + + Case Project.TYPE_COMPONENT + + Print #hFile, " install -d ${pkgdir}/usr/lib/gambas" & System.Version + Print #hFile, " install -d ${pkgdir}/usr/share/gambas" & System.Version &/ "info" + Print #hFile, " install -m755 " & $sName & ".gambas ${pkgdir}/usr/lib/gambas" & System.Version &/ $sComponentName & ".gambas" + Print #hFile, " install .component ${pkgdir}/usr/lib/gambas" & System.Version &/ $sComponentName & ".component" + Print #hFile, " chmod a-x ${pkgdir}/usr/lib/gambas" & System.Version &/ $sComponentName & ".component" + Print #hFile, " install .info ${pkgdir}/usr/share/gambas" & System.Version &/ "info" &/ $sComponentName & ".info" + Print #hFile, " chmod a-x ${pkgdir}/usr/share/gambas" & System.Version &/ "info" &/ $sComponentName & ".info" + Print #hFile, " install .list ${pkgdir}/usr/share/gambas" & System.Version &/ "info" &/ $sComponentName & ".list" + Print #hFile, " chmod a-x ${pkgdir}/usr/share/gambas" & System.Version &/ "info" &/ $sComponentName & ".list" + Print #hFile, " if test -d control; then" + Print #hFile, " install -d ${pkgdir}/usr/share/gambas" & System.Version &/ "control" &/ $sComponentName + Print #hFile, " install .hidden/control/*.png ${pkgdir}/usr/share/gambas" & System.Version &/ "control" &/ $sComponentName + Print #hFile, " chmod a-x ${pkgdir}/usr/share/gambas" & System.Version &/ "control" &/ $sComponentName &/ "*.png" + Print #hFile, " fi" + + Case Project.TYPE_LIBRARY + + Print #hFile, " install -d ${pkgdir}/usr/lib/gambas" & System.Version &/ LCase($sVendor) + Print #hFile, " install -m755 " & $sName & ".gambas ${pkgdir}/usr/lib/gambas" & System.Version &/ LCase($sVendor) &/ $sLibraryName & ".gambas" + + Case Project.TYPE_NORMAL + + Print #hFile, " install -d ${pkgdir}/usr/bin" + Print #hFile, " install -m755 " & $sName & ".gambas ${pkgdir}/usr/bin" &/ $sName + If $sName <> sPackageName Then Print #hFile, " ln -s " & Shell$($sName) & " \"${pkgdir}\"/usr/bin" &/ Shell$(sPackageName) + Print #hFile, " install -D .." &/ Project.Name & ".png \\" + Print #hFile, " ${pkgdir}/usr/share/pixmaps" &/ Project.Name & ".png" + Print #hFile, " install -D .." &/ sPackageName & ".desktop \\" + Print #hFile, " ${pkgdir}/usr/share/applications" &/ sPackageName & ".desktop" + + End Select + + Print #hFile, GetExtraFilesDir(sSys, " install -d ${pkgdir}&1"); + Print #hFile, GetExtraFiles(sSys, " install -p ${srcdir}/${_realname}/.hidden/&1 ${pkgdir}&2/&1", " cp -R --preserve=timestamp ${srcdir}/${_realname}/.hidden/&1 ${pkgdir}&2/&1"); + Print #hFile, " install -Dm644 ${srcdir}/license.txt ${pkgdir}/usr/share/licenses" &/ sPackageName &/ "license.txt" + Print #hFile, "}" + + Close #hFile + + ' 4. create the packages + + AddLog(("Creating package...") & "\n") + + For Each sCmd In ["makepkg -m --allsource", "makepkg -m -d"] + RunCommand(sCmd, sBuildDir) + If Process.LastValue > 0 + Dec Application.Busy + Error.Raise(("'makepkg' has failed.")) + Endif + Next + + RunCommand("cp " & sPackageName & "-" & $sVersion & "-" & CStr(Project.PackageVersion) & "*.tar.* " & Shell$(Path) &/ "", sBuildDir) + + ' Remove build dir + Shell "rm -rf " & Shell(sBuildDir) Wait + + Dec Application.Busy + +End + +Private Function MakeArchSupportPackage((sSys) As String, sSupport As String, aComp As String[]) + + Dim sBuildDir As String + Dim hFile As File + Dim sCmd As String + Dim sDependencies As String + Dim sPkgDesc As String + Dim sPackageName As String + + Inc Application.Busy + + sPackageName = FormatArchPackageName($sUnsafePackageName & "-" & sSupport) + + sPkgDesc = "This is the " & sSupport & " support for " & If(Project.Title, Project.Title, Project.Name) + + $sFormatMinMax = "'&1>=&2' '&1<=&3' " + $sFormatMin = "'&1>=&2' " + $sFormatMax = "'&1<=&3' " + $sFormatSingle = "'&1' " + $sFormatEqual = "'&1=&2' " + + sDependencies = GetDependencies(aComp) + + ' 1. Create the temporary build directory + + AddLog(("Making build directory.")) + + sBuildDir = File.SetExt(Temp$("archlinux"), "") + Shell "rm -rf " & Shell$(sBuildDir) Wait + Mkdir sBuildDir + + ' 2. Copy needed files + + File.Save(sBuilddir &/ "license.txt", "This program is under : " & Project.License) + + hFile = Open sBuildDir &/ "PKGBUILD" For Create + Print #hFile, "# generated by the gambas3 ide" + Print #hFile, "# Maintainer : " & Project.Maintainer & " <" & Project.Address & ">" + Print #hFile, "" + Print #hFile, "pkgname=" & sPackageName + Print #hFile, "_realname="; sPackageName + Print #hFile, "pkgdesc=\"" & sPkgDesc & "\"" + Print #hFile, "pkgver=" & $sVersion + Print #hFile, "pkgrel="; Project.PackageVersion + Print #hFile, "arch=('any')" + Print #hFile, "url=\"" & Project.Url & "\"" + If Me.ChangeLog Then + File.Save(sBuildDir &/ "ChangeLog", Me.ChangeLog) + Print #hFile, "changelog=ChangeLog" + Endif + Print #hFile, "license=('custom')" + If Len(sDependencies) > 0 Then + Print #hFile, "depends=(" & Subst($sFormatEqual, FormatArchPackageName($sUnsafePackageName), $sVersion) & Left$(sDependencies, -1) & ")" + Endif + 'Print #hFile, "makedepend=('gambas3-devel')" + 'Print #hFile, "source=(${_realname}-$pkgver.tar.bz2 license.txt"; + 'If Project.Type = Project.TYPE_NORMAL Then + ' Print #hFile, "\\\n '" & $sPackageName & ".desktop'"; + ' Print #hFile, " '" & Project.Name & ".png'"; + 'Endif + 'Print #hFile, ")" + Close #hFile + + RunCommand("makepkg -m -g >> PKGBUILD", sBuildDir, True) + If Process.LastValue > 0 Then Error.Raise(("'makepkg' has failed.")) + + ' hFile = Open sBuildDir &/ "PKGBUILD" For Append + ' + ' Print #hFile, "" + ' Print #hFile, "build() {" + ' Print #hFile, " cd ${srcdir}/${_realname}" + ' Print #hFile, "" + ' Print #hFile, " "; Project.GetCompileCommand(True, Not Project.KeepDebugInfo, True, False); " && gba"; System.Version + ' Print #hFile, "}" + ' Print #hFile, "" + ' Print #hFile, "package() {" + ' Print #hFile, " cd ${srcdir}/${_realname}" + ' Print #hFile, "" + ' + ' Select Case Project.Type + ' + ' Case Project.TYPE_COMPONENT + ' + ' Print #hFile, " install -d ${pkgdir}/usr/lib/gambas" & System.Version + ' Print #hFile, " install -d ${pkgdir}/usr/share/gambas" & System.Version &/ "info" + ' Print #hFile, " install -m755 " & $sName & ".gambas ${pkgdir}/usr/lib/gambas" & System.Version + ' Print #hFile, " install .component ${pkgdir}/usr/lib/gambas" & System.Version &/ $sName & ".component" + ' Print #hFile, " chmod a-x ${pkgdir}/usr/lib/gambas" & System.Version &/ $sName & ".component" + ' Print #hFile, " install .info ${pkgdir}/usr/share/gambas" & System.Version &/ "info" &/ $sName & ".info" + ' Print #hFile, " chmod a-x ${pkgdir}/usr/share/gambas" & System.Version &/ "info" &/ $sName & ".info" + ' Print #hFile, " install .list ${pkgdir}/usr/share/gambas" & System.Version &/ "info" &/ $sName & ".list" + ' Print #hFile, " chmod a-x ${pkgdir}/usr/share/gambas" & System.Version &/ "info" &/ $sName & ".list" + ' Print #hFile, " if test -d control; then" + ' Print #hFile, " install -d ${pkgdir}/usr/share/gambas" & System.Version &/ "control" &/ $sName + ' Print #hFile, " install .hidden/control/*.png ${pkgdir}/usr/share/gambas" & System.Version &/ "control" &/ $sName + ' Print #hFile, " chmod a-x ${pkgdir}/usr/share/gambas" & System.Version &/ "control" &/ $sName &/ "*.png" + ' Print #hFile, " fi" + ' + ' Case Project.TYPE_LIBRARY + ' + ' Print #hFile, " install -d ${pkgdir}/usr/bin" + ' Print #hFile, " install -m755 " & $sName & ".gambas ${pkgdir}/usr/bin" &/ $sName & ".gambas" + ' + ' Case Project.TYPE_NORMAL + ' + ' Print #hFile, " install -d ${pkgdir}/usr/bin" + ' Print #hFile, " install -m755 " & $sName & ".gambas ${pkgdir}/usr/bin" &/ $sName + ' Print #hFile, " install -D .." &/ Project.Name & ".png \\" + ' Print #hFile, " ${pkgdir}/usr/share/pixmaps" &/ Project.Name & ".png" + ' Print #hFile, " install -D .." &/ $sPackageName & ".desktop \\" + ' Print #hFile, " ${pkgdir}/usr/share/applications" &/ $sPackageName & ".desktop" + ' + ' End Select + ' + ' Print #hFile, GetExtraFilesDir(sSys, " install -d ${pkgdir}&1\n"); + ' Print #hFile, GetExtraFiles(sSys, " install -p ${srcdir}/${_realname}/.hidden/&1 ${pkgdir}&2/&1", " cp -R --preserve=timestamp ${srcdir}/${_realname}/.hidden/&1 ${pkgdir}&2/&1"); + ' Print #hFile, " install -Dm644 ${srcdir}/license.txt ${pkgdir}/usr/share/licenses" &/ $sPackageName &/ "license.txt" + ' Print #hFile, "}" + ' + ' Close #hFile + + ' 4. create the packages + + AddLog(("Creating package...") & "\n") + + For Each sCmd In ["makepkg -m --allsource", "makepkg -m -d"] + RunCommand(sCmd, sBuildDir) + If Process.LastValue > 0 + Dec Application.Busy + Error.Raise(("'makepkg' has failed.")) + Endif + Next + + RunCommand("cp " & sPackageName & "-" & $sVersion & "-" & CStr(Project.PackageVersion) & "*.tar.* " & Shell$(Path) &/ "", sBuildDir) + + ' Remove build dir + Shell "rm -rf " & Shell(sBuildDir) Wait + + Dec Application.Busy + +End + +Private Sub MoveFile(sSrc As String, sDst As String) + + Try Kill sDst + Try Move sSrc To sDst + If Error Then + Copy sSrc To sDst + Try Kill sSrc + Endif + +End + +Public Sub Process_Kill() + + $bEnd = True + +End + +Public Sub Process_Read() + + Dim sData As String + + sData = Read #Last, -256 + $sOutput &= sData + FMakeInstall.AddLog(sData, True) + +End + +Public Sub Process_Error(sData As String) + + FMakeInstall.AddLog(sData, True) + +End + +Public Sub GetPackageName(sName As String) As String + + sName = LCase(String.RemoveDiacritics(sName)) + sName = Replace(sName, ".", "-") + Return sName + +End + +Public Sub GetPackagePrefix(iProjectType As Integer, sVendor As String, sVendorPrefix As String, bPrefix As Boolean) As String + + Dim sText As String + Dim sPackage As String + Dim sPrefix As String + + If iProjectType = Project.TYPE_COMPONENT Then + + sPrefix = String.LCase(Trim(sVendorPrefix)) + If Not sPrefix Then sPrefix = "gb" + + sPackage = GetPackageName(Project.Name) + If sPackage Begins sPrefix & "-" Or If sPackage = sPrefix Then + sPrefix = "" + Else + sPrefix &= "-" + Endif + sText = "gambas" & System.Version & "-" & sPrefix + + Else + + If bPrefix Then + + sPrefix = sVendorPrefix + If Not sPrefix Then sPrefix = sVendor + sPrefix = String.LCase(Trim(sPrefix)) + sPrefix = Replace(sPrefix, "_", "-") + + If Not sPrefix Then sPrefix = "gambas" + + sText = sPrefix & "-" + + Endif + + Endif + + Return sText + +End + +Public Sub GetPackageFullName(sVendor As String, sVendorPrefix As String, bPrefix As Boolean, bWithMajor As Boolean, bWithVersion As Boolean) As String + + Dim sText As String + + sText = GetPackagePrefix(Project.Type, sVendor, sVendorPrefix, bPrefix) & GetPackageName(Project.Name) + If bWithMajor Then sText &= CStr(Project.MajorVersion) + If bWithVersion Then sText &= "-" & Project.FormatVersion() + Return sText + +End diff --git a/app/src/gambas3/.src/Project.module b/app/src/gambas3/.src/Project.module new file mode 100644 index 00000000..5b680155 --- /dev/null +++ b/app/src/gambas3/.src/Project.module @@ -0,0 +1,6723 @@ +' Gambas module file + +' Gambas 3 +' Integrated Development Environment for Gambas +' +' Copyright (C) Benoît Minisini, Fabien Bodard, Charlie Reinl, José Luis Redrejo, Robert Rowe +' +' 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 2 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, write to the Free Software +' Foundation, Inc., 51 Franklin St, Fifth Floor, +' Boston, MA 02110-1301 USA +' + +Public Const COLOR_ORANGE As Integer = &HDF6B00 +Public Const COLOR_BLUE As Integer = &H61A7C3 '&H3398C3 + +Public ProjectTree As TreeView +Public Tree As CProjectTree +Public ProjectFilter As String +Public ProjectMessage As Label +Public (Workspace) As Workspace + +Public ActiveForm As Object + +Public Path As String +Public Name As String +Public Dir As String +Public SourceDir As String +Public ReadOnly As Boolean + +Public Title As String +Public Startup As String +Public (Components) As String[] +Public Libraries As String[] +Public ExtraReferences As String[] +Public Arguments As String[][] +Public CurrentArgument As String[] +Public Environment As String[] +Public KeepDebugInfo As Boolean +Public CreateShortcut As Boolean +Public RunAfterMakingExec As String +Public ControlPublic As Boolean +Public ModulePublic As Boolean +Public ShowDeprecated As Boolean +Public Warnings As Boolean +Public MajorVersion As Integer +Public MinorVersion As Integer +Public ReleaseVersion As Integer +Public VersionAddBranch As Boolean +Public Localize As Boolean +Public Description As String +Public Icon As String +Public LibraryPath As String + +Private OldExecPath As String + +Public Systems As String[] +Public Menus As Collection +Public Groups As Collection +Public ExtraDependencies As Collection +Public ExtraFiles As Collection +Public SameDependencies As Boolean +Public SameFiles As Boolean +Public ExtraAutoconfTest As String +Public Categories As Collection +Public MimeTypes As String[] +Public ExtraDesktop As String +Public Prefix As Boolean +Public PackageName As String +Public PackageVersion As Integer +Public PackageSignature As Boolean +Public PackageNameWithMajor As Boolean +Public Maintainer As String +Public Address As String +Public Vendor As String +Public VendorPrefix As String +Public Url As String +Public License As String +Public CreateEachDirectory As Boolean +Public RuntimeVersion As String + +Public PublishTags As String[] +Public PublishDependencies As String[] +Public PublishGambasVersion As String +Public PublishWebSite As String +Public PublishCreateMenu As Boolean + +Public TabSize As Integer +Public Version As String +Public FullVersion As String +Public FullVersionWithRevision As String +Public SourcePath As String +Public DefaultLanguage As String +Public Type As Integer +Public Authors As String +Public VersionFile As Boolean +Public UseTerminal As Boolean +Public RedirectStderr As Boolean +Public UseHttpServer As Boolean +Public Profiling As Boolean +Public ProfileIndex As Integer +Public DoNotTranslate As String[] + +Public Running As Boolean + +' Project type +Public Enum TYPE_NORMAL, TYPE_LIBRARY, TYPE_COMPONENT + +Public Const FORM_MAGIC As String = "# Gambas Form File 3.0" +Public Const FORM_MAGIC_1 As String = "# Gambas Form File 1.0" +Public Const FORM_MAGIC_2 As String = "# Gambas Form File 2.0" +Public Const PROJECT_MAGIC_1 As String = "# Gambas Project File 1.0" +Public Const PROJECT_MAGIC_2 As String = "# Gambas Project File 2.0" +Public Const PROJECT_MAGIC As String = "# Gambas Project File 3.0" +Public Const ACTION_MAGIC As String = "# Gambas Action File 3.0" +Public Const CONNECTION_MAGIC As String = "# Gambas Connection File 3.0" +Public Const TEMPLATE_MAGIC As String = "# Gambas Database Template File 3.0" + +Public DEFAULT_FONT As String +Public DESKTOP_FONT As String + +Public Const DEFAULT_URL As String = "http://www.endoftheinternet.com/" +Public WIKI_URL As String = "http://gambaswiki.org" +Public WIKI_ROOT As String = "http://gambaswiki.org/wiki" + +Public Const FILTER_ADDED As String = " A" +Public Const FILTER_EXPORTED As String = " X" +Public Const FILTER_CONFLICT As String = " C" +Public Const FILTER_MODIFIED As String = " M" + +Public Files As New Collection +Public ExternFiles As New Collection +Public RecentFiles As String[] + +Public AboutToQuit As Boolean + +Public Const MAX_ICON_SIZE As Integer = 262144 + +Public EXAMPLES_DIR As String + +'Public ShowAlwaysProperty As Boolean + +Private Const IMAGE_DIR As String = "img/16" + +Public Const KEY_SOURCE As String = "$S" +Public Const KEY_MISC As String = "$O" +Public Const KEY_PROJECT As String = "$P" +Public Const KEY_PUBLIC As String = "$B" +Public Const KEY_CONNECTION As String = "$D" +Public Const KEY_EXTERN As String = "$X" + +Private Const CLASS_AUTH_CAR As String = "abcdefghijklmnopqrstuvwxyz0123456789" +Private Const CLASS_AUTH_CAR_COMPONENT As String = "_" +Private Const CLASS_AUTH_FIRST_CAR As String = "abcdefghijklmnopqrstuvwxyz_" +Private Const FILE_FORBIDDEN_CAR As String = "?*/~" + +Private Const PROJECT_FILE As String = ".project" +Private Const STARTUP_FILE As String = ".startup" + +Private OUTPUT_FILE As String + +Public Browser As String +Public ImageEditors As String[] = ["Gimp", "KIconEdit", "KolourPaint", "Krita"] +Private IMAGE_EXT As String[] = ["jpg", "jpeg", "gif", "bmp", "xpm", "png", "tif", "tiff"] + +Private $aOldRefreshComponents As New String[] + +Public ExampleTitle As New Collection + +Public TimeStamp As Integer +Public ExecTimeStamp As Integer +Public Config As Settings + +Public RestoringFiles As Boolean + +Public ShowFileInTitle As Boolean + +'Private $aInheritance As New String[] +Private $iNoRefresh As Integer +Private $bDoRefresh As Boolean +Private $cProjectFilter As Collection + +Private $cImageCache As New Collection + +Private $hCurrentPopup As Menu + +Private $hLock As File + +' Path of source files +'Property Read Sources As Collection + +' File state from version control +Private $cPathFlag As Collection +Public Enum FLAG_MODIFIED, FLAG_ADDED, FLAG_LOCKED, FLAG_CONFLICT +Public HasConflict As Integer +Public HasAdded As Integer + +' I'm using the IDE to test the interpreter with valgrind! +Private $bTesting As Boolean + +' All possible packager target systems +Private $aSystems As String[] = ["archlinux", "autotools", "debian", "fedora", "mageia", "slackware", "suse", "ubuntu"] + +' Pretty background +Public DEFAULT_BACKGROUND As String = "gambas" +Private $hBackground As Image +Private $bBackgroundValid As Boolean + +' Global documentation object +' Another one is created for the offline wiki +Public Documentation As CDocumentation + +Public UseInheritance As Boolean + +Private $bFileIsUnknown As Boolean + +' If GetFileIcon() has been called on an added file +'Private $bLastAdded As Boolean + +Public Sub _init() + + ExampleTitle["Automation"] = ("Automation") + ExampleTitle["Basic"] = ("Basic") + ExampleTitle["Database"] = ("Database") + ExampleTitle["Drawing"] = ("Drawing") + ExampleTitle["Games"] = ("Games") + ExampleTitle["Image"] = ("Image") + ExampleTitle["Misc"] = ("Miscellaneous") + ExampleTitle["Networking"] = ("Networking") + ExampleTitle["OpenGL"] = ("OpenGL") + ExampleTitle["Printing"] = ("Printing") + ExampleTitle["Sound"] = ("Sound") + ExampleTitle["Video"] = ("Video") + ExampleTitle["Control"] = ("Controls") + ExampleTitle["Multimedia"] = ("Multimedia") + ExampleTitle["Web"] = ("Web") + +End + +Public Sub InitWebView() + + Dim sPath As String + Dim hDefaultFont As Font + Dim hFixedFont As Font + + If Not WebSettings.Cache.Path Then + sPath = "~/.cache" + Try Mkdir sPath + sPath &/= "gambas3" + Try Mkdir sPath + sPath &/= "help" + Try Mkdir sPath + WebSettings.Cache.Path = sPath + WebSettings.Cache.Enabled = True + Endif + + 'WebSettings.Fonts.StandardFont = Application.Font.Name + 'hFont = Font[Settings["/Editor/Font", Application.Font]] + + hDefaultFont = Font[Settings["/Browser/Font"]] + hFixedFont = Font[Settings["/Browser/FixedFont", DEFAULT_FONT]] + + WebSettings.Fonts.SerifFont = hDefaultFont.Name + WebSettings.Fonts.SansSerifFont = hDefaultFont.Name + WebSettings.Fonts.DefaultFontSize = hDefaultFont.Size + + ' sFont = Replace(sDefaultFont, "Sans", "Mono") + ' If sFont = sDefaultFont Or If Not Fonts.Exist(sFont) Then + ' sFont = Application.Font.Name & "Mono" + ' If Not Fonts.Exist(sFont) Then + ' sFont = Application.Font.Name & " Mono" + ' If Not Fonts.Exist(sFont) Then + ' sFont = "" + ' Endif + ' Endif + ' Endif + + WebSettings.Fonts.FixedFont = hFixedFont.Name + WebSettings.Fonts.DefaultFixedFontSize = hFixedFont.Size + +End + +Public Sub Main() + + Dim sPath As String + Dim iInd As Integer + Dim sArg As String + Dim aOpenFile As New String[] + + 'DB.Debug = True + + For iInd = 1 To Args.Count - 1 + sArg = Args[iInd] + If sArg = "-t" Then + $bTesting = True + Continue + Else If sArg = "--help" Or If sArg = "-h" Then + Print File.Load("usage") + Quit + Else If sArg = "--license" Or If sArg = "-L" Then + Print Replace(File.Load("license"), "YEAR", CStr(Year(Now))) + Quit + Else If sArg = "--version" Or If sArg = "-V" Then + Print Application.Version + Quit + Else If sArg = "--cleanup" Then + sPath = Args[iInd + 1] + If Not sPath Then sPath = Application.Dir + If CleanUp(sPath, True) Then + Quit 1 + Else + Quit + Endif + Else If Left(sArg) = "-" Then + Error "gambas3: unknown option: " & sArg + Quit + Else + If Not sPath Then + sPath = Args[iInd] + Else + aOpenFile.Add(Args[iInd]) + Endif + Endif + Next + + Try Component.Load("gb.inotify") + Try Component.Load("gb.media") + + If Not Settings["/ShowMenus", True] Then Env["APPMENU_DISPLAY_BOTH"] = "1" + Env["QT_LOGGING_RULES"] = "*.debug=false" + + Application.Theme = Settings["/Theme"] + DESKTOP_FONT = Application.Font.ToString() + + Try Application.Font = Font[Settings["/Font"]] + + 'Print Application.Theme + + OUTPUT_FILE = Temp$() + EXAMPLES_DIR = System.Path &/ "share/gambas" & Split(System.Version, ".")[0] & "/examples" + + Application.ShowTooltips = Settings["/ShowTooltip", True] + Application.Animations = Settings["/Animations", True] + Application.Shadows = Settings["/Shadows", True] + + RefreshBreakpointPicture + + Documentation = New CDocumentation + + If $bTesting And If sPath Then + InitVersion + InitWebView + CRecentProject.Load + FMain.Load + Design.ClearBreakpoints + Project.Open(sPath) + + Dim hComp As CComponent + For Each hComp In Project.Documentation.Components + hComp.Load + Next + + Project.CloseAllWindows + Wait + Project.Close + Project.Exit + + Quit + 'FSearch.FindProject("else") + 'Project.Close + 'FMain.Close + 'Project.Exit + Return + Endif + + If Fonts.Exist("Gambas") Then + DEFAULT_FONT = "Gambas," + Else If Fonts.Exist("Terminus") Then + DEFAULT_FONT = "Terminus," + Else + DEFAULT_FONT = "Monospace," + Endif + DEFAULT_FONT &= CStr(Application.Font.Size) + + InitVersion + InitWebView + ShowFileInTitle = Settings["/ShowFileInTitle", True] + MHelp.ReadConfig + FDebugExpr.ReadConfig + FMain.Load + Application.MainWindow = FMain + + Inc Application.Busy + + 'FHelpBrowser.Load + FHelpShortcut.Load + + ' QT5: If the main form is shown after the MDI windows have been embeddded, then + ' the window drawing becomes buggy + + FMain.Show + + If sPath Then + If File.IsRelative(sPath) Then sPath = Application.Dir &/ sPath + If IsDir(sPath) Then + Project.Open(sPath) + For Each sPath In aOpenFile + OpenFile(sPath) + Next + Else If Exist(sPath) Then + FMain.OpenExternFile(sPath) + Else + FMain.ShowWarning(("File not found!") & "\n\n" & sPath & "") + Endif + If Not Project.Dir Then + FMain.Close + Dec Application.Busy + Return + Endif + Endif + + RefreshActivate + + If Not sPath Then FMain.Welcome + + Dec Application.Busy + + If Settings["/ShowTipOnStartup", True] Then + FTips.Run + Endif + +End + +Private Sub InitVersion() + + Dim sVer As String + Dim aVer As String[] + + 'Shell "gbx" & System.Version & " -V" To sVer + 'FullVersion = Trim(Mid$(sVer, InStr(sVer, "-") + 1)) + FullVersion = System.FullVersion + aVer = Split(FullVersion, ".") + aVer.Remove(aVer.Max) + Version = aVer.Join(".") + + Exec [System.Path &/ "bin/gbx" & System.Version, "-V"] To sVer + FullVersionWithRevision = Trim(sVer) + If FullVersionWithRevision Ends ".0" Then FullVersionWithRevision = Left$(FullVersionWithRevision, -2) + +Catch + + Version = "?" + +End + +Private Sub LastOpenedFiles() + + Dim nOpen As Integer + Dim iInd As Integer + Dim aOpen As String[] + Dim hForm As Object + Dim iActive As Integer + Dim hActive As Object + Dim aFold As Integer[] + Dim sPath As String + + Inc Application.Busy + RestoringFiles = True + CPosition.Disable + Workspace.Lock + + nOpen = Config["/OpenFile/Count", 0] + iActive = Config["/OpenFile/Active", 0] + For iInd = 1 To nOpen + aOpen = Split(Config["/OpenFile/File[" & CStr(iInd) & "]"], ":") + sPath = aOpen[0] + If Left(sPath) <> "/" Then sPath = Project.Dir &/ sPath + If Not Exist(sPath) Then sPath = FindPath(File.Name(sPath)) + If Not Exist(sPath) Then Continue + 'If VersionControl.InConflict(sPath) Then Continue + If IsConflict(sPath) Then Continue + If IsConnectionPath(sPath) Then Continue + hForm = OpenFile(sPath) + If Not hForm Then Continue + If aOpen.Count = 2 Then Try hForm.SetState(aOpen[1]) + aFold = Config["/OpenFile/Fold[" & CStr(iInd) & "]"] + If aFold Then Try hForm.SetFoldedProc(aFold) + If iInd = iActive Then hActive = hForm + Next + + Workspace.Unlock + RestoringFiles = False + + If hActive Then + Activate(hActive) + Workspace.ActiveWindow = hActive + Endif + +Finally + + CPosition.Enable + Dec Application.Busy + +End + +Public Function Open(sDir As String, Optional bInAnotherWindow As Boolean, sOpenFile As String) As Boolean + + Dim sOldPath As String + Dim sOldName As String + Dim bConvert As Boolean + Dim sVer As String + Dim sFile As String + Dim hLock As Stream + Dim aDir As String[] + Dim iStep As Integer + Dim bStopConvert As Boolean + Dim sExec As String + Dim sPath As String + Dim sStatus As String + Dim bIsFake As Boolean + Dim aClass As String[] + Dim I As Integer + + sPath = FindProjectPath(sDir) + + If Not sPath Then + FMain.ShowError(("This project does not exist.") & "\n\n" & sDir) + Return True + Endif + + If bInAnotherWindow Then + + Try Config.Save + Try Settings.Save + + sExec = Application.Path &/ File.Name(Args[0]) + If Not Exist(sExec) Then sExec &= ".gambas" + If Not Exist(sExec) Then + Message.Error(Subst(("Unable to find Gambas IDE executable in directory:\n\n&1"), Application.Path)) + Return + Endif + If sOpenFile Then + Exec [sExec, sDir, sOpenFile] + Else + Exec [sExec, sDir] + Endif + + Return True + + Endif + + sOldPath = Project.Path + sOldName = Project.Name + + sVer = CheckProjectVersion(sDir &/ PROJECT_FILE) + If sVer Then + If sVer = "?" Then + Message.Error(("This is not a Gambas project.")) + Return True + Else If sVer = "1.0" Then + Message.Error(("This is a Gambas 1.0 project. Use Gambas 2 to convert it.")) + Return True + Else If sVer = "2.0" Then + If Message.Warning(Subst(("This is a Gambas 2.0 project.\n\nDo you want to convert it?"), sVer), ("Convert"), ("Cancel")) = 2 Then + Return True + Else + bConvert = True + Endif + Endif + Endif + + ReadOnly = Not Access(sDir, gb.Write) + + If Not ReadOnly Then + If Exist(sDir &/ ".startup") And If Not Access(sDir &/ ".startup", gb.Write) Then ReadOnly = True + Endif + + Try hLock = Lock sDir &/ ".lock" + + If Not ReadOnly And ((bConvert And Exist(sDir &/ ".lock")) Or Not hLock) Then + If Message.Warning(("This project seems to be already opened.\n\nOpening the same project twice can lead to data loss."), + ("Open after all"), ("Do not open")) = 2 Then + Return True + Endif + Endif + + If bConvert And If ReadOnly Then + Message.Error(("This project is read-only.") & " " & ("It cannot be converted.")) + Return True + Endif + + If Not $bTesting Then + If CloseProject() Then Return True + Endif + + If Right(sDir) = "/" Then sDir = Left(sDir, -1) + + Project.Dir = sDir + + If bConvert Then + + ' Create Gambas 2 lock file + Try File.Save(sDir &/ ".lock", "") + + FConvert.Start(("Copying project inside a temporary directory...")) + Project.Dir = Temp$("conv") + Shell "rm -rf " & Shell$(Project.Dir) & " && cp -R " & Shell$(sDir) & " " & Shell$(Project.Dir) Wait + If Process.LastValue Then Error.Raise(("Unable to create temporary directory")) + + Endif + +_INIT_AGAIN: + + Path = Project.Dir &/ PROJECT_FILE + Name = File.Name(Project.Dir) + SourceDir = Project.Dir &/ ".src" + Config = New Settings(Project.Dir &/ ".settings") + Tree = New CProjectTree(Project.Dir) + + ProjectFilter = "" + + bIsFake = IsFake(Project.Dir) + + If bIsFake Then + VersionControl.Disable + Else + VersionControl.Refresh + Endif + + If bConvert Then + + If ReadOnly Then + Message.Error(("This project is read-only.") & " " & ("It cannot be converted.")) + Return True + Endif + + bStopConvert = True + FConvert.SetMessage(("Converting project structure...")) + + ' Needed for MoveFile() + RefreshSources + Design.ClearBreakpoints + + ReadProject(True) + + If Not Exist(SourceDir) Then + + InsertDirectory(SourceDir) + aDir = Dir(Project.Dir, "*") + iStep = 0 + For Each sFile In aDir + If CModule.Ext.Exist(File.Ext(sFile)) Then MoveFile(Project.Dir &/ sFile, SourceDir &/ sFile) + Inc iStep + FConvert.SetProgress(iStep / aDir.Count) + Next + + RefreshSources + + Endif + + WriteProject(True) + + MakeDirectoryIcon + If ConvertProject() Then Goto _CANCEL + + GoSub _STOP_CONVERT + + FConvert.SetMessage(("Applying conversion...")) + Shell "rm -rf " & Shell$(sDir & "~") Wait + Move sDir To sDir & "~" + Shell "mv -f " & Shell$(Project.Dir) & " " & Shell$(sDir) Wait + If Process.LastValue Then + Try Move sDir & "~" To sDir + Error.Raise(("Unable to apply conversion")) + Endif + + ' Remove lock file from the backup project + Try Kill (sDir & "~") &/ ".lock" + + Project.Dir = sDir + + bConvert = False + + Goto _INIT_AGAIN + + Else If Not Exist(SourceDir) Then + + ' Needed for MoveFile() + RefreshSources + + InsertDirectory(SourceDir) + aDir = Dir(Project.Dir, "*") + For Each sFile In aDir + If CModule.Ext.Exist(File.Ext(sFile)) Then MoveFile(Project.Dir &/ sFile, SourceDir &/ sFile) + Next + + Endif + + Inc Application.Busy + + Config = New Settings(sDir &/ ".settings") + + Inc $iNoRefresh + ' ReadProject(bConvert) + ' If Not ReadOnly Then + ' If Not Exist(Project.Dir &/ ".hidden") Then Project.InsertDirectory(Project.Dir &/ ".hidden") + ' If bConvert Then WriteProject(True) + ' Endif + + CLibraryInfo.Clear + ' Component loading needs to know which classes are declared by the project, in the case of a component project that uses itself + RefreshSources + aClass = Tree.CheckDuplicates() + If aClass Then + GoSub _STOP_CONVERT + For I = 0 To aClass.Max + aClass[I] = "

    • " & Html(aClass[I]) & "
    • " + Next + Message.Error(("Cannot open project file :") & "\n" & sDir & "\n\n" & ("This project has duplicated class files!") & "
        " & aClass.Join("") & "
      ") + Goto _CANCEL + Endif + + If Not $bTesting + If Not bIsFake Then + Design.ClearOutput + Design.ReadBreakpoints + Endif + Endif + + ReadProject + + If Not ReadOnly Then + + If Not Exist(Project.Dir &/ ".hidden") Then InsertDirectory(Project.Dir &/ ".hidden") + + CreateGitIgnore + + Endif + + Dec $iNoRefresh + + Inc Project.TimeStamp + + MConnection.Password.Clear + + ' If Not $bTesting Then + ' DoRefresh(False, True) + ' Endif + + 'If Not bIsFake Then DefineStartup(Startup, True) ??? + + If Not bIsFake Then CRecentProject.Add(sDir) + + If Not $bTesting + FMain.OnProjectChange + FSearch.OnProjectChange + If Class.IsLoaded("FHelpBrowser") Then FHelpBrowser.OnProjectChange + FProfile.OnProjectChange + 'FOpenProject.OnUpdateRecent + + If Not bIsFake Then + FDebugInfo.OnProjectChange + FDebugButton.OnProjectChange + Endif + + Endif + + $hLock = hLock + + If bConvert Then + MakeDirectoryIcon + If ConvertProject() Then + Dec Application.Busy + Goto _CANCEL + Endif + Endif + + ' The .lang/.pot file must not be on version control + + If Localize And If VersionControl.Enabled Then + sPath = Project.Dir &/ ".lang/.pot" + sStatus = VersionControl.Status(sPath) + If sStatus And If Left(sStatus) <> "?" And If Left(sStatus) <> "D" Then VersionControl.RemoveFile(sPath) + Endif + + If Not IsFake() And If Settings["/RestoreFiles", 1] Then LastOpenedFiles + + RecentFiles = New String[] + CPosition.Clear + + GoSub _STOP_CONVERT + + If ReadOnly Then + FMain.ShowWarning(("This project is read-only.")) + Else + + ' Let's check libraries + + For Each sPath In Libraries + If Not CLibraryInfo.SolvePath(sPath) Then + Message.Warning(("Some libraries used by the project are missing.")) + FProjectProperty.ShowLibraries() + Break + Endif + Next + + Endif + + Application.Restart = ["gambas3", Project.Dir] + + Bookmarks.Add(sDir, ("Current project"), "icon:/small/gambas") + + 'SetMessage(("OK")) + Return + +Catch + + GoSub _STOP_CONVERT + + If Error.Text Then + Message.Error(("Cannot open project file :") & "\n" & sDir & "\n\n" & Error.Text & "\n" & Error.Backtrace.Join(" ") & "") + Endif + +_CANCEL: + + If hLock Then Try Unlock #hLock + + Path = sOldPath + Project.Dir = File.Dir(Path) + Name = sOldName + $iNoRefresh = 0 + + If Path Then ReadProject + UpdateTitle + + Return True + +_STOP_CONVERT: + + If bStopConvert Then + FConvert.Stop + bStopConvert = False + Endif + Application.Busy = 0 + + Return + +End + +Public Sub CloseAllWindows() + + Dim hForm As Window + + Workspace.Lock + For Each hForm In Files + hForm.Close + Next + Workspace.Unlock + +End + +Public Sub ReloadFile(hForm As Object) + + Dim sPath As String + Dim sErr As String + + sPath = hForm.Path + + If hForm.IsModified() Then + If Message.Warning(("The file has been modified.\n\nAll your changes will be lost."), ("Reload"), ("Cancel")) <> 1 Then Return + Endif + + Inc Application.Busy + hForm.Reload + Dec Application.Busy + +Catch + + sErr = Error.Text '& "\n" & Error.Backtrace.Join(" ") + Try hForm.Delete + Dec Application.Busy + Try Files[sPath] = Null + FMain.ShowError(("Cannot reload file.") & "\n\n" & sErr, sPath) + +End + + +Public Sub ReloadAll(Optional bFormOnly As Boolean) + + Dim hForm As Object + + Inc Application.Busy + For Each hForm In Files + If bFormOnly And If Not hForm Is FForm Then Continue + ReloadFile(hForm) + Next + Dec Application.Busy + +End + +Public Function CloseProject() As Boolean + + Dim hForm As Object + Dim bModif As Boolean + Dim nOpen As Integer + Dim sState As String + Dim aFold As Integer[] + Dim sPath As String + + 'IF Len(Path) = 0 THEN RETURN + + If Path Then + + If Running Then + Design.Stop + 'WAIT 0.5 + Endif + + For Each hForm In Files + If hForm.IsModified() Then + bModif = True + Break + Endif + Next + + If bModif Then + If FSave.Run(AboutToQuit) Then Return True + Endif + + 'FFind.Close + + Inc Application.Busy + + If Not IsFake() Then Design.WriteBreakpoints + + If Settings["/RestoreFiles", 1] Then + + Config.Clear("/OpenFile") + For Each hForm In Workspace.Windows + + If Not hForm.Closed Then + + If Not hForm.Path Then + Debug "hForm.Path = NULL ?" + 'Stop + Endif + + Inc nOpen + If hForm = ActiveForm Then Config["/OpenFile/Active"] = nOpen + + sState = "" + Try sState = hForm.GetState() + + aFold = Null + Try aFold = hForm.GetFoldedProc() + + If sState Then sState = ":" & sState + sPath = MakeProjectRelativePath(hForm.Path) + Config["/OpenFile/File[" & CStr(nOpen) & "]"] = sPath & sState + + If aFold And If aFold.Count Then Config["/OpenFile/Fold[" & CStr(nOpen) & "]"] = aFold + + Endif + + Next + + Endif + + If Not $bTesting Then + Workspace.Lock + CloseAllWindows + For Each hForm In Files + Try hForm.Delete + Next + Workspace.Unlock + Endif + Config["/OpenFile/Count"] = nOpen + + 'FFind.WriteConfig + Try Config = Null + + '$cSourceDir.Clear + + CPosition.Clear + Files.Clear + ActiveForm = Null + + If $hLock Then + Unlock #$hLock + Try Kill Project.Dir &/ ".lock" + $hLock = Null + Endif + + 'If IsFake() Then Shell "rm -rf " & Shell$(Project.Dir) Wait + + Bookmarks.Remove(Dir) + + Path = "" + {Dir} = "" + UpdateTitle + + Dec Application.Busy + + Endif + + If Not AboutToQuit Then + FProperty.HideAll + FFormStack.HideAll + Endif + + Return False + +End + +Public Function Close() As Boolean + + AboutToQuit = True + If CloseProject() Then + AboutToQuit = False + Return True + Endif + +End + +Public Sub Exit() + + CSoftware.Exit + CSampleCode.Exit + CLibraryInfo.Exit + CRecentProject.Exit + Wiki.Documentation.Exit + Documentation.Exit + +End + +Public Sub AddEmblem(hSource As Image, sEmblem As String, Optional iSize As Integer) As Image + + Dim hEmblem As Image + Dim hImage As Image + + Try hEmblem = Picture[sEmblem].Image + If Error Then + Error "gambas3: warning: unable to add emblem: "; sEmblem + Return hSource + Endif + + If iSize = 0 Then iSize = hEmblem.H + iSize = Min(iSize, hSource.H * 0.75) + hEmblem = hEmblem.Stretch(-1, iSize) ', iSize * hEmblem.H / hEmblem.W) + + 'iSize -= hSource.W \ 4 + + hImage = New Image(hSource.Width + iSize, hSource.Height, Color.Transparent) + hImage.PaintImage(hSource, iSize, 0) + hImage.PaintImage(hEmblem, 0, (hImage.H - hEmblem.H) / 2) + Return hImage + +End + +Public Sub AddLinkEmblem(hSource As Image) As Image + + Dim hImage As Image + Dim iSize As Integer + + hImage = hSource.Copy() + + iSize = Min(hSource.H, hSource.W) \ 2 + + Paint.Begin(hImage) + + Paint.MoveTo(hImage.W, hImage.H) + Paint.RelLineTo(0, -iSize) + Paint.RelLineTo(-iSize, iSize) + Paint.RelLineTo(iSize, 0) + Paint.Background = Color.Black + 'Paint.Background = Color.SetAlpha(Color.TextForeground, 64) + Paint.Operator = Paint.OperatorDestOut + Paint.Fill + + iSize *= 0.85 + + Paint.MoveTo(hImage.W, hImage.H) + Paint.RelLineTo(0, -iSize) + Paint.RelLineTo(-iSize, iSize) + Paint.RelLineTo(iSize, 0) + Paint.Background = Color.SetAlpha(Color.TextForeground, 64) + Paint.Operator = Paint.OperatorOver + Paint.Fill + + Paint.End + Return hImage + +End + +' Private Sub MakeExportedIcon(hImage As Image) +' +' Dim X, Y As Integer +' Dim iCol As Integer +' Dim hColorInfo As ColorInfo +' +' For X = 0 To hImage.W - 1 +' For Y = 0 To hImage.H - 1 +' +' iCol = hImage[X, Y] +' ' With Color[Color.Desaturate(iCol)] +' ' iGray = (255 - .Blue) * (255 - .Alpha) / 255 +' ' End With +' ' Print Mid$(" .,-~+=oOINS8&%@", iGray \ 16 + 1, 1); +' +' If Color.GetAlpha(iCol) > 192 Then Continue +' If X = 0 Or If X = (hImage.W - 1) Or If Y = 0 Or If Y = (hImage.H - 1) Or If Color[hImage[X - 1, Y]].Alpha = 255 Or If Color[hImage[X + 1, Y]].Alpha = 255 Or If Color[hImage[X, Y - 1]].Alpha = 255 Or If Color[hImage[X, Y + 1]].Alpha = 255 Then +' hColorInfo = Color[Color.Darker(iCol)] +' hColorInfo.Alpha = hColorInfo.Alpha \ 2 +' hImage[X, Y] = hColorInfo.Color +' Endif +' Next +' Next +' +' End + +Public Sub MakeModuleIcon(sModule As String, iSize As Integer, Optional bStartup As Boolean) As Image + + Dim hImage As Image + Dim sKey As String + 'Dim hStartup As Image + + bStartup = False + + 'If Not $cImageCache["base"] Then $cImageCache["base"] = Picture["icon:/32/file"].Image + + If iSize = 0 Then iSize = 16 + + sKey = sModule & "-" & iSize & If(bStartup, "s", "") & ".png" + hImage = $cImageCache[sKey] + If Not hImage Then + + hImage = Picture["img/module" &/ sModule & ".png"].Image + hImage = hImage.Stretch(iSize, iSize) + + 'If bExported Then MakeExportedIcon(hImage) + + If bStartup Then + ' hStartup = New Image(hImage.W, hImage.H, Color.Transparent) + ' hStartup.FillRect(2, 2, hImage.W - 4, hImage.H - 4, &HFF7F7F) + ' hStartup.PaintImage(hImage.Copy().Colorize(&HFF7F7F), 0, 0) + ' hImage = hStartup + hImage = AddEmblem(hImage, "img/32/startup.png") + 'hImageStartup = Image.Load("img/16/startup.png").Stretch((iSize * 2) \ 3, (iSize * 2) \ 3) + 'hImage.PaintImage(hImageStartup, 0, (hImage.H - hImageStartup.H) \ 2) + Endif + + $cImageCache[sKey] = hImage + Endif + + Return hImage + +End + +Public Sub GetFileIcon(sPath As String, Optional iSize As Integer) As Picture + + Dim hPict As Picture + + If IsConflict(sPath) Then + hPict = Picture["img/32/conflict.png"] + If iSize = 0 Then iSize = 16 + If iSize <> 32 Then hPict = hPict.Image.Stretch(iSize, iSize).Picture + Return hPict + Endif + If Tree Then Return Tree.GetFileIcon(sPath, iSize,, True) + + Return Desktop.GetFileIcon(sPath, iSize, True) + +End + +Public Sub GetParentClass(sPath As String) As String + + Dim hFile As File + Dim sLine As String + + If Left(sPath) <> "/" Then sPath = FindPath(sPath) + + Try hFile = Open sPath For Input + ' Possible, if sPath is a broken symbolic link + If Error Then Return + + For Each sLine In hFile.Lines + sLine = Trim(sLine) + If Not sLine Then Continue + If Left(sLine) = "'" Then Continue + If sLine Like "INHERITS *" Then + Highlight.Analyze(sLine) + sLine = Highlight.Symbols[1] + 'sLine = Scan(sLine, "INHERITS *")[0] + If Comp(sLine, File.BaseName(sPath), gb.IgnoreCase) = 0 Then sLine = "" + Return sLine + Endif + If sLine Like "CREATE" Then Continue + If sLine Like "EXPORT" Then Continue + If sLine Like "CREATE *" Then Continue + If sLine Like "EXPORT *" Then Continue + Break + Next + +End + +Public Sub GetSpecialDir(sKey As String) As String + + Select Case sKey + Case KEY_MISC + Return Project.Dir + Case KEY_PROJECT + Return Project.Dir &/ ".hidden" + Case KEY_PUBLIC + Return Project.Dir &/ ".public" + Case KEY_SOURCE + Return SourceDir + Case KEY_CONNECTION + Return Project.Dir &/ ".connection" + End Select + +End + +' Private Sub AddFile(sDir As String, sFile As String, Optional bAfter As Boolean, Optional bIgnoreInheritance As Boolean) As Boolean +' +' Dim bIgnore As Boolean +' Dim sPath As String +' Dim sKey As String +' Dim bShow As Boolean +' Dim sExt As String +' Dim sParent As String +' Dim hPict As Picture +' Dim bChecked As Boolean +' Dim bDir As Boolean +' Dim sAfter As String +' Dim hModule As CModule +' Dim bSource As Boolean +' Dim bExtern As Boolean +' Dim hStat As Stat +' Dim sTitle As String +' +' If $cProjectFilter And If Not $cProjectFilter.Exist(sDir &/ sFile) Then Return +' +' sPath = sDir &/ sFile +' +' sKey = sPath +' sParent = sDir +' +' If sDir = Project.Dir Then +' sParent = KEY_MISC +' Else If sDir = Project.Dir &/ ".hidden" Then +' sParent = KEY_PROJECT +' Else If sDir = Project.Dir &/ ".public" Then +' sParent = KEY_PUBLIC +' Else If sDir = SourceDir Then +' sParent = KEY_SOURCE +' Else If sDir = Project.Dir &/ ".connection" Then +' sParent = KEY_CONNECTION +' Else If Not Project.InsideDirectory(sDir, Project.Dir) Then +' sParent = KEY_EXTERN +' If Not ProjectTree.Exist(KEY_EXTERN) Then ProjectTree.Add(KEY_EXTERN, ("Files"), Picture["icon:/small/system"], Project.Dir) +' bExtern = True +' Try sTitle = Files[sPath].GetTitle() +' If sTitle Then sFile = sTitle +' Endif +' +' If Not ProjectTree.Exist(sParent) Then Return +' +' Try hStat = Stat(sPath) +' If Error Then Return +' +' With hStat +' +' If .Hidden Then Return +' +' bShow = False +' If Not bExtern Then bSource = IsSourcePath(sDir &/ sFile, True) +' +' If IsDir(sPath) Then +' +' If sFile = "CVS" Or If sFile = "CVSROOT" Then Return +' +' 'IF cDir THEN cDir.Add(sPath) +' bDir = True +' 'sIcon = "icon:/small/directory" 'IMAGE_DIR &/ "close.png" +' 'bShow = True +' +' Else +' +' 'IF InStr(.Perm.User & .Perm.Group & .Perm.Other, "x") THEN CONTINUE +' +' sExt = Lower(File.Ext(sFile)) +' bChecked = False +' +' If bSource Then +' +' If CModule.Ext.Exist(sExt) Then +' +' 'sIcon = IMAGE_DIR &/ sExt & ".png" +' bShow = sDir = SourceDir +' bChecked = True +' +' sParent = "" +' +' If sExt = "class" Then +' For Each hModule In CModule.All +' If Exist(sDir &/ File.BaseName(sFile) & "." & hModule.Key) Then +' bIgnore = True +' Break +' Endif +' Next +' +' If Not bIgnore Then +' 'IF sFile = "ReportContainer.class" THEN STOP +' sParent = FindKey(GetParentClass(sPath)) +' If sParent Then +' If File.Ext(sParent) <> "class" Then +' sParent = "" +' Else If File.Dir(sParent) <> sDir Then +' sParent = "" +' Else If Not ProjectTree.Exist(sParent) Then +' If Not bIgnoreInheritance Then +' $aInheritance.Add(sPath) +' bIgnore = True +' Else +' sParent = "" +' Endif +' 'Else +' ' $aInheritance.Add(sPath & "\n" & sParentClass) +' Endif +' Endif +' Endif +' ' Else If sExt = "module" Then +' ' Else +' ' 'hModule = CModule[sExt] +' ' 'sParent = hModule.TreeKey +' ' 'If Not hModule.Used Then bIgnore = True +' ' sParent = sDir +' Else If sExt <> "module" Then +' If Not HasModule(sExt) Then +' bIgnore = True +' Endif +' Endif +' +' If Not sParent Then sParent = sDir +' If sParent = SourceDir Then sParent = KEY_SOURCE +' +' If $cSourceDir[sFile] <> sPath Then +' bIgnore = True +' Endif +' +' sFile = File.BaseName(sFile) +' +' Endif +' +' Else If IsConnectionPath(sDir &/ sFile) Then +' +' If Components.Exist("gb.db") And If sExt = "connection" Then +' sFile = File.BaseName(sFile) +' bChecked = True +' Else +' bIgnore = True +' Endif +' +' Endif +' +' If Not bChecked Then +' +' If Right$(sFile) = "~" Then +' bIgnore = True +' Else If sDir = Project.Dir And If sExt = "gambas" Then +' bIgnore = True +' Endif +' +' Endif +' +' Endif +' +' If sExt = "mine" Or If Left(sExt) = "r" And IsDigit(Mid$(sExt, 2)) Then +' If Exist(sDir &/ File.BaseName(sPath)) Then +' bIgnore = True +' Endif +' Endif +' +' If Not bIgnore Then +' +' hPict = GetFileIcon(sPath,, hStat) +' +' If bAfter Then +' With ProjectTree +' .MoveTo(sParent) +' .MoveChild +' If Not bDir Then +' While .Available +' If Not IsDir(.Item.Key) Then Break +' sAfter = .Item.Key +' .MoveNext +' Wend +' Endif +' While .Available +' If String.Comp(.Item.Text, sFile, gb.IgnoreCase + gb.Natural) > 0 Then Break +' If bDir And If Not IsDir(.Item.Key) Then Break +' sAfter = .Item.Key +' .MoveNext +' Wend +' End With +' Endif +' +' With ProjectTree.Add(sKey, sFile, hPict, sParent) +' .Editable = Not IsLocked(sKey) +' 'If $bLastAdded Then .RichText = "" & .Text & "" +' 'If $cProjectFilter Then .Expanded = True +' If bAfter Then .MoveAfter(sAfter) +' If bShow Then +' ProjectTree.MoveTo(sKey) +' Do +' If ProjectTree.MoveParent() Then Break +' ProjectTree.Item.Expanded = True +' Loop +' Endif +' End With +' +' If bDir Then +' If Not bSource Then +' ProjectTree.Add(sKey & "/", "",, sKey) +' bDir = False +' Endif +' Endif +' +' RefreshIcon(sKey) +' +' Endif +' +' End With +' +' Return bDir +' +' End + +' Private Sub DoRefreshAfter() +' +' Dim sKey As String +' Dim iInd As Integer +' Dim iCount As Integer +' +' If $aInheritance.Count = 0 Then Return +' +' Do +' iCount = $aInheritance.Count +' For iInd = 0 To iCount - 1 +' 'aElt = Split($aInheritance[0], "\n") +' 'sKey = aElt[0] +' 'sParent = aElt[1] +' sKey = $aInheritance[0] +' $aInheritance.Remove(0) +' AddFile(File.Dir(sKey), File.Name(sKey), True) +' ' If ProjectTree.Exist("@" +' ' +' ' ProjectTree.Add("@" & sKey +' Next +' If $aInheritance.Count >= iCount Then Break +' Loop +' +' If $aInheritance.Count Then +' For iInd = 0 To $aInheritance.Max +' sKey = $aInheritance[iInd] +' AddFile(File.Dir(sKey), File.Name(sKey), True, True) +' $aInheritance[iInd] = File.BaseName(sKey) +' Next +' If Not ProjectFilter Then +' FMain.ShowError("" & ("The following classes have circular inheritance:") & "\n\n" & $aInheritance.Join(", ")) +' Endif +' $aInheritance.Clear +' Endif +' +' End + +' Private Procedure AddDir(Optional sDir As String) +' +' Dim cDir As New String[] +' Dim sFile As String +' Dim aFile As New String[] +' +' If sDir Then +' cDir.Add(sDir) +' Else +' cDir.Add(Project.Dir) +' If SourceDir <> Project.Dir Then cDir.Add(SourceDir) +' Endif +' +' $aInheritance.Clear +' +' Repeat +' +' sDir = cDir[0] +' aFile.Clear +' +' '$bGetSource = FALSE +' +' For Each sFile In Dir(sDir, "*") +' If IsDir(sDir &/ sFile) Then aFile.Add("D" & sFile) +' Next +' +' For Each sFile In Dir(sDir, "*") +' If Not IsDir(sDir &/ sFile) Then aFile.Add("F" & sFile) +' Next +' +' aFile.Sort(gb.Language + gb.Natural) +' +' For Each sFile In aFile +' +' sFile = Mid$(sFile, 2) +' If AddFile(sDir, sFile, True) Then cDir.Add(sDir &/ sFile) +' 'AddFile(sDir, sFile, True) +' +' Next +' +' cDir.Remove(0) +' +' Until cDir.Count = 0 +' +' DoRefreshAfter +' +' End + +' Public Sub FillDir(sDir As String) +' +' If Not sDir Then Return +' If Left(sDir) = "$" Then Return +' If Not IsDir(sDir) Then Return +' +' ProjectTree.MoveTo(sDir) +' If ProjectTree.MoveChild() Then Return +' If ProjectTree.Item.Key <> sDir & "/" Then Return +' +' Inc Application.Busy +' ProjectTree[sDir & "/"].Delete +' AddDir(sDir) +' Dec Application.Busy +' +' Catch +' +' Debug Error.Where; ": "; Error.Text +' Dec Application.Busy +' +' End +' +' Private Sub EnsureKey(sKey As String) +' +' Dim sPath As String +' Dim sElt As String +' +' sPath = "/" +' For Each sElt In Split(sKey, "/") +' sPath &/= sElt +' If ProjectTree.Exist(sPath) Then FillDir(sPath) +' Next +' +' End +' +' Public Sub SelectKey(sKey As String) +' +' Dim hModule As CModule +' Dim sBase As String +' +' EnsureKey(sKey) +' +' If Not ProjectTree.Exist(sKey) Then +' If Right$(sKey, 6) = ".class" Then +' sBase = Left$(sKey, -6) +' For Each hModule In CModule.All +' sKey = sBase & "." & hModule.Key +' If ProjectTree.Exist(sKey) Then Break +' Next +' Endif +' Endif +' +' Try ProjectTree[sKey].Selected = True +' Try ProjectTree[sKey].EnsureVisible +' +' End + +' PRIVATE SUB UpdateInheritance() +' +' DIM sPath AS String +' DIM sParent AS String +' +' FOR EACH sPath IN Dir(Project.Dir, "*.class") +' +' IF Exist(Project.Dir &/ File.SetExt(sPath, "form")) THEN CONTINUE +' +' sParent = GetParentClass(sPath) +' IF sParent THEN +' sParent = FindKey(sParent) +' IF File.Ext(sParent) <> "class" THEN sParent = "" +' ENDIF +' ENDIF +' IF NOT sParent THEN +' sParent = KEY_CLASS +' ENDIF +' +' NEXT +' +' END + +Public Sub RefreshRoot() + + ProjectTree[Project.Dir].Picture = GetIcon(Project.Dir, 16) + +End + +Private Sub OnRefreshSources() + + FMain.OnRefreshSources + FDebugButton.OnRefreshSources + +End + +Private Sub RefreshSources() As Boolean + + Dim hForm As Object + Dim sPath As String + + Tree.RefreshSources() + + For Each hForm In Files.Copy() + If IsSourcePath(hForm.Path) Then + sPath = Tree.Sources[File.Name(hForm.Path)] + If sPath <> hForm.Path Then + Files[sPath] = hForm + Files[hForm.Path] = Null + hForm.Path = sPath + Endif + Endif + Next + + VersionControl.CheckPaths() + OnRefreshSources + +End + +Public Sub FormatVersion(Optional bStripReleaseIfNull As Boolean) As String + + Dim sVer As String + + sVer = CStr(MajorVersion) & "." & CStr(MinorVersion) + If Not bStripReleaseIfNull Or If ReleaseVersion > 0 Then sVer &= "." & ReleaseVersion + Return sVer + +End + +Public Sub UpdateTitle() + + Dim sTitle As String + Dim sBranch As String + + If Path Then + + If ShowFileInTitle Then + If ActiveForm Then + ' sPath = ActiveForm.Path + ' If IsProjectPath(sPath) Then + ' sPath = ActiveForm.Text + ' Else If sPath Begins User.Home Then + ' sPath = "~/" &/ Mid$(sPath, Len(User.Home) + 1) + ' Endif + If sTitle Then sTitle &= " - " + sTitle &= ActiveForm.Title + Endif + Endif + + If Not IsFake() Then + If sTitle Then sTitle &= " - " + sTitle &= Name & " " & FormatVersion() + + VersionControl.GetBranches(ByRef sBranch) + If sBranch Then sTitle &= " (" & sBranch & ")" + + If ReadOnly Then sTitle &= " [" & ("read-only") & "]" + Endif + + Endif + + If sTitle Then sTitle &= " — " + sTitle &= Application.Title + + If Application.Version Like "*.9[0-9].*" Then + sTitle &= " - " & ("ALPHA VERSION, USE AT YOUR OWN RISK!") + Else If Application.Version Like "*.*.9[0-9]" Then + sTitle &= " - " & ("DEVELOPMENT VERSION, USE AT YOUR OWN RISK!") + Endif + + FMain.Title = sTitle + +End + +Private Sub AddPathToFilter(sPath As String) + + $cProjectFilter[sPath] = True + If IsSourcePath(sPath) And If File.Ext(sPath) = "class" Then + Try $cProjectFilter[Tree.FindForm(File.BaseName(sPath))] = True + Endif + + While Len(sPath) > Len(Project.Dir) + sPath = File.Dir(sPath) + $cProjectFilter[sPath] = True + Wend + +End + +Private Sub InitProjectFilter() + + Dim sPath As String + Dim sFile As String + Dim sFilter As String + + $cProjectFilter = Null + If Not ProjectFilter Then Return + + If ProjectFilter = FILTER_ADDED Then + + $cProjectFilter = New Collection + + For Each sPath In AllFlags(FLAG_ADDED) + AddPathToFilter(sPath) + Next + + Else If ProjectFilter = FILTER_MODIFIED Then + + $cProjectFilter = New Collection + + For Each sPath In AllFlags(FLAG_MODIFIED) + AddPathToFilter(sPath) + Next + + Else If ProjectFilter = FILTER_CONFLICT Then + + $cProjectFilter = New Collection + + For Each sPath In AllFlags(FLAG_CONFLICT) + AddPathToFilter(sPath) + Next + + Else If ProjectFilter = FILTER_EXPORTED Then + + $cProjectFilter = New Collection + + For Each sPath In Tree.Sources + If IsExported(sPath) Then AddPathToFilter(sPath) + Next + + Else + + sFilter = String.LCase(ProjectFilter) + + $cProjectFilter = New Collection + + For Each sFile In RDir(Project.Dir) + + sPath = Project.Dir &/ sFile + + If IsDir(sPath) Then Continue + If Right(sPath) = "~" Then Continue + If Left(File.Name(sFile)) = "." Then Continue + If InStr(sPath, "/.svn/") Then Continue + + sFile = File.Name(sFile) + If sPath Begins (Project.Dir &/ ".src") Then sFile = File.BaseName(sFile) + If InStr(String.LCase(sFile), sFilter) = 0 Then Continue + + AddPathToFilter(sPath) + + Next + + Endif + +End + +Private Sub DoRefresh(Optional bReset As Boolean, Optional bDoNotRefreshCache As Boolean) + + Dim sKey As String + Dim sKeyReset As String + Dim hFile As Object + Dim sPath As String + Dim sFamily As String + + '$bDisplayForm = Settings["/DisplayForm"] + + If Not ProjectTree Then Return + If $iNoRefresh Then Return + + If Not bReset Then + sKeyReset = ProjectTree.Key + Endif + + InitProjectFilter + VersionControl.CheckPaths + Tree.Refresh(bDoNotRefreshCache, $cProjectFilter) + + If sKeyReset Then sKey = sKeyReset + + Tree.SelectKey(sKey) + + 'DefineStartup(Startup, True) '??? + + For Each sFamily In CFamily.List + If Not HasModule(sFamily) Then + For Each hFile In Files + sPath = Files.Key + If Not IsSourcePath(sPath) Then Continue + If Exist(File.SetExt(sPath, sFamily)) Then + Files.Remove(sPath) + hFile.Delete + Endif + Next + Endif + Next + + ' Path may not exist in the tree if a filter is active + + If VersionControl.Enabled Then + + For Each sPath In AllFlags(FLAG_ADDED) + Tree.EnsureKey(sPath) + Try ProjectTree[sPath].EnsureVisible + Next + + For Each sPath In AllFlags(FLAG_CONFLICT) + Tree.EnsureKey(sPath) + Try ProjectTree[sPath].EnsureVisible + Next + + Endif + + If $cProjectFilter Then + + For Each $cProjectFilter + sPath = $cProjectFilter.Key + Tree.EnsureKey(sPath) + Try ProjectTree[sPath].EnsureVisible + Next + + ' Move to the first available item if the root item is selected + + If ProjectTree[Project.Dir].Selected Then + With ProjectTree + .MoveFirst() + Do + If .MoveBelow() Then Break + If Left(.Item.Key) <> "$" And Not IsDir(.Item.Key) Then + .Item.Selected = True + Break + Endif + Loop + End With + Endif + + Endif + + UpdateTitle + $bDoRefresh = False + +End + +Public Sub timRefresh_Timer() + + DoRefresh + +End + +Private Sub DisableRefresh() + + If $iNoRefresh = 0 Then $bDoRefresh = False + Inc $iNoRefresh + +End + +Public Sub Refresh(Optional bReset As Boolean) + + If bReset Or If $iNoRefresh = 0 Then + DoRefresh(bReset) + Else + $bDoRefresh = True + Endif + +End + +Public Sub RefreshAll() + + Inc Application.Busy + RefreshComponents(True) + Refresh(True) + Dec Application.Busy + +End + + +Private Sub EnableRefresh() + + Dec $iNoRefresh + If $iNoRefresh = 0 Then + If $bDoRefresh Then DoRefresh() + Endif + +End + +Public Function IsEditor(hFile As Object) As Boolean + + Return Object.Type(hFile) = "FEditor" + +End + +Public Function IsForm(hFile As Object) As Boolean + + If hFile Then Return Object.Type(hFile) = "FForm" + +End + +Public Sub IsTextFile(sPath As String) As Boolean + + Dim hFile As File + Dim sStr As String + Dim sCar As String + Dim iCode As Integer + Dim sTest As String + + hFile = Open sPath + sStr = Read #hFile, -256 + + While sStr + sCar = String.Left(sStr) + sStr = Mid$(sStr, Len(sCar) + 1) + If Not sCar Then Break + If Len(sCar) = 1 Then + iCode = Asc(sCar) + If iCode = &HFE Then Return False + If iCode = &HFF Then Return False + If iCode < 32 And If iCode <> 10 And If iCode <> 13 And If iCode <> 9 Then Return False + Else If sStr Then + Try sTest = Conv(sCar, "UTF-8", "UCS-4LE") + If Error Then Return False + Endif + Wend + + Return True + +End + +Public Sub IsSqliteFile(sPath As String) As Integer + + Dim hFile As File + Dim sText As String + + Try hFile = Open sPath + If Error Then Return + + sText = Read #hFile, -47 + Close #hFile + + If sText = "** This file contains an SQLite 2.1 database **" Then Return 2 + If sText Begins "SQLite format 3" Then Return 3 + +End + +Public Sub IsPatchFile(sPath As String) As Boolean + + Dim hFile As File + Dim sHead As String + + If Not IsTextFile(sPath) Then Return + hFile = Open sPath + sHead = Read #hFile, -4 + Return sHead = "diff" + +End + +Public Function LoadFile(sPath As String, Optional bNoErrorIfUnknown As Boolean) As Object + + Dim hForm As Object + Dim bError As Boolean + Dim sType As String + Dim sErr As String + + hForm = Files[sPath] + + If Not hForm Then + + 'Inc Application.Busy + + 'If VersionControl.InConflict(sPath) Then Error.Raise("File in conflict") + If IsConflict(sPath) Then + + hForm = New FConflictEditor(sPath) + + Else If IsSourcePath(sPath) Then + + sType = File.Ext(sPath) + + Select Case sType + + Case "module", "test", "class" + hForm = New FEditor(sPath) + + Case "form", "report", "webform", "termform" + If HasModule(sType) Then + hForm = New FForm(sPath) + Endif + + Case "webpage" + If HasModule("webpage") Then + hForm = New FTextEditor(sPath, Null, True) + Endif + + End Select + + Else If IsConnectionPath(sPath) Then + + If MConnection.CheckPassword(sPath) Then + 'Dec Application.Busy + Return + Endif + hForm = New FConnectionEditor(sPath) + + Endif + + If Not hForm Then + + Select Case Lower(File.Ext(sPath)) + + Case "png", "gif", "jpg", "jpeg", "bmp", "xpm" + hForm = New FImageEditor(sPath) + + Case "module", "test", "class" + hForm = New FEditor(sPath) + + Case Else + ' Check that it is not a binary file + If IsTextFile(sPath) Then + + hForm = New FTextEditor(sPath) + + Else + + 'Dec Application.Busy + Files[sPath] = Null + If bNoErrorIfUnknown Then + $bFileIsUnknown = True + Else + FMain.ShowError(("Cannot open a binary file."), sPath) + Endif + Return + + Endif + + End Select + + Endif + + Files[sPath] = hForm + + If hForm Then + + bError = hForm.LoadFile() + If bError Then + Files[sPath] = Null + Try hForm.Delete + 'Dec Application.Busy + Return + Endif + hForm.Icon = GetFileIcon(sPath) + Endif + + If hForm Then FSearch.OnNewForm(hForm) + + 'Dec Application.Busy + + Endif + + Return hForm + +Catch + + sErr = Error.Text & "\n" & Error.Backtrace.Join(" ") + If hForm Then Try hForm.Delete + 'Dec Application.Busy + Try Files[sPath] = Null + FMain.ShowError(("Cannot open file.") & "\n\n" & sErr, sPath) + +End + + +Public Function FindPath(sClass As String) As String + + If Not Tree Then Stop + Return Tree.FindPath(sClass) + +End + +' Private Sub FindKey(sClass As String) As String +' +' Return Tree.FindKey(sClass) +' +' End + +Public Sub ShowFile(hForm As Form) + + Workspace.Add(hForm) + Workspace.ActiveWindow = hForm + hForm.SetFocus + +'Catch + + 'FMain.ShowError(("Cannot open file.") & "\n\n" & Error.Text & "\n" & Error.Where) + +End + +Public Sub FileWasUnknown() As Boolean + + Return $bFileIsUnknown + +End + + +Public Sub OpenFile(sPath As String, Optional iLine As Integer, Optional iColumn As Integer = -1, Optional bNoErrorIfUnknown As Boolean) As Object + + Dim hForm As Object + Dim bAlreadyLoaded As Boolean + + If InStr(sPath, "/") = 0 Then sPath = FindPath(sPath) + + Try Stat(sPath, True) + If Error Then + FMain.ShowWarning(("File not found!") & "\n\n" & sPath & "") + Project.Refresh + Return + Endif + + 'IF File.Ext(sPath) = "form" THEN + ' FProperty.Show + ' FToolBox.Show + 'ENDIF + + ' If IsConflict(sPath) Then + ' FConflict.Run(sPath) + ' VersionControl.CheckPaths() + ' If IsConflict(sPath) Then Return + ' RefreshKey(sPath) + ' Endif + + If Files[sPath] Then bAlreadyLoaded = True + + $bFileIsUnknown = False + If Not LoadFile(sPath, bNoErrorIfUnknown) Then Return + + If Not InsideDirectory(sPath, Project.Dir) Then Tree.AddExtern(sPath) + + If Not ProjectTree.Exist(sPath) Then + RefreshKey(sPath) + Endif + + hForm = Files[sPath] + If Not hForm Then Return + + CPosition.Disable + Try ShowFile(hForm) + If Error Then + CPosition.Enable + Error.Raise(Error.Text) + Endif + + If iLine Then + Try hForm.GotoCenter(iLine - 1, iColumn) + Else If hForm.Name = Startup And If Not bAlreadyLoaded Then + Try hForm.GotoFunction(hForm.GetFunctionLine("Main")) + Endif + + CPosition.Enable + CPosition.SaveCurrent(Me) + + Return hForm + +End + +Public Function ExistForm(sClass As String) As Boolean + + Return Tree.ExistForm(sClass) + +End + +Public Sub FindForm(sClass As String) As String + + Return Tree.FindForm(sClass) + +End + +Public Sub OpenForm(sName As String, Optional sModule As String = "form", Optional sControl As String) + + Dim sPath As String + Dim hForm As Object + + sPath = Tree.Sources[sName & "." & sModule] + If Exist(sPath) Then + hForm = OpenFile(sPath) + If sControl Then hForm.SelectControl(sControl) + Endif + +End + +' Private Function AddMessage(sVoid As String) As String +' +' Dim iPos As Integer +' Dim sMsg As String +' +' If Stat(OUTPUT_FILE).Size = 0 Then +' +' SetMessage(sVoid) +' Return +' +' Else +' +' sMsg = RTrim(File.Load(OUTPUT_FILE)) +' iPos = RInStr(sMsg, "\n") +' If iPos Then sMsg = Mid$(sMsg, iPos + 1) +' Return sMsg +' +' Endif +' +' End + +Public Sub TranslateMessage(sErr As String) As String + + Dim aErr As String[] + + aErr = Split(sErr, "\t") + aErr.Resize(5) + If Left(aErr[1]) = "#" Then + Select CInt(Mid$(aErr[1], 2)) + Case 1 + aErr[1] = ("first") + Case 2 + aErr[1] = ("second") + Case 3 + aErr[1] = ("third") + Default + aErr[1] = Subst(("&1th"), Mid$(aErr[1], 2)) + End Select + Endif + + Return Subst(Tr$(aErr[0]), aErr[1], aErr[2], aErr[3], aErr[4]) + +End + +Private Sub CompileError(sMsg As String) + + Dim iPos As Integer + Dim sFile As String + Dim iLine As Integer + Dim iColumn As Integer + Dim hForm As Object + Dim sErr As String + Dim sInfo As String + Dim aInfo As String[] + Dim hEditor As TextEditor + + iPos = RInStr(sMsg, "\n") + If iPos Then sMsg = Mid$(sMsg, iPos + 1) + + If LCase(sMsg) Like "gbc*: error: *" Then + + sMsg = TranslateMessage(Mid$(sMsg, Len("gbc: error: ") + 1)) + SetMessage(sMsg) + 'Message.Error(("Cannot compile the project.") & "\n" & sMsg) + + Else + + iPos = InStr(sMsg, " ") + sInfo = Left$(sMsg, iPos - 1) + sMsg = Mid$(sMsg, iPos + 1) + + aInfo = Split(sInfo, ":", "", True) + + sFile = aInfo[0] + Try iLine = CInt(aInfo[1]) + Try iColumn = CInt(aInfo[2]) + 'if iLine = 0 then return + + 'sFile = File.Dir(Path) &/ File.Name(sFile) + + hForm = OpenFile(Tree.Sources[sFile], iLine, iColumn - 1) + + If sMsg Begins "error: " Then sMsg = Mid$(sMsg, 8) + + sErr = TranslateMessage(sMsg) + + Try hEditor = hForm.GetEditor() + + If hEditor And If iLine > hEditor.Count Then + SetMessage(File.BaseName(sFile) & ": " & sErr & " " & ("in form definition")) + sMsg = "" & sErr & " " & ("in form definition") + Else If iLine >= 1 Then + SetMessage(File.BaseName(sFile) & "." & CStr(iLine) & ": " & sErr) + sMsg = "" & sErr & " " & Subst(("in &1:&2."), File.Name(sFile), CStr(iLine)) + Else + SetMessage(File.BaseName(sFile) & ": " & sErr) + sMsg = "" & sErr & " " & Subst(("in &1."), File.Name(sFile)) + Endif + + Endif + + If hEditor Then + hForm.ShowErrorMessage(sMsg, "make") + Else + FMain.ShowMessage(sMsg, "make") + Endif + + 'Catch + +End + +' PUBLIC FUNCTION Quote(sPath AS String) AS String +' +' DIM sQuote AS String +' DIM iInd AS Integer +' DIM sCar AS String +' +' sPath = SConv$(sPath) +' 'DEBUG sPath +' +' FOR iInd = 1 TO Len(sPath) +' +' sCar = Mid$(sPath, iInd, 1) +' +' IF InStr("0123456789abcdefghijklmnopqrstuvwxyz.-/_~", LCase(sCar)) = 0 THEN +' sCar = "\\" & sCar +' ENDIF +' +' sQuote = sQuote & sCar +' +' NEXT +' +' RETURN sQuote +' +' END + +Private Function Escape(sStr As String) As String + + Dim sRes As String + Dim iInd As Integer + Dim sCar As String + Dim iPos As Integer + + For iInd = 1 To Len(sStr) + + sCar = Mid$(sStr, iInd, 1) + iPos = InStr("\"\\\n\r\t", sCar) + + If iPos Then sCar = "\\" & Mid$("\"\\nrt", iPos, 1) + + sRes = sRes & sCar + + Next + + Return sRes + +End + +Public Sub Process_Read() + + Dim sLig As String + + sLig = Read #Last, -4096 + Print sLig; + +End + +Public Sub Process_Kill() + + Dim sLink As String = Last.Tag + + If sLink Then RefreshKey(sLink) + +Catch ' Can fail when Process_Kill is raised after the IDE has been closed + +End + +Public Sub DeleteCompiledFiles() + + Dim sFile As String + + If Exist(Project.Dir &/ ".gambas") Then + For Each sFile In Dir(Project.Dir &/ ".gambas") + If sFile Begins "." Then Continue + Try Kill Project.Dir &/ sFile + Next + Endif + + If Exist(Project.Dir &/ ".lang") Then + For Each sFile In Dir(Project.Dir &/ ".lang", "*.pot") + Try Kill Project.Dir &/ ".lang" &/ sFile + Next + Endif + +End + +Public Function GetCompileCommand(bAll As Boolean, bNoDebug As Boolean, bMakeExecutable As Boolean, bIDE As Boolean) As String + + Dim sExec As String + + If bIDE Then + sExec = System.Path &/ "bin/gbc" & System.Version + Else + sExec = "gbc" & System.Version + Endif + sExec &= " -e " + If bAll Then sExec &= "-a " + If Not bNoDebug Then sExec &= "-g " + If Localize Then sExec &= "-t " + If ControlPublic Then sExec &= "-p " + If ModulePublic Then sExec &= "-m " + If bMakeExecutable Then sExec &= "-x " + 'sExec = sExec & "-c " & Quote(CLASSES_FILE) & " " & Quote(Project.Dir) & " > " & OUTPUT_FILE & " 2>&1" + If bIDE Then + If Project.Warnings Then sExec &= "-w " + sExec = sExec & Shell$(Project.Dir) + sExec = sExec & " > " & OUTPUT_FILE & " 2>&1" + Endif + + Return sExec + +End + +Public Sub CreateLangDirectory() + + Dim sDir As String = Project.Dir &/ ".lang" + + Try Mkdir sDir + If IsDir(sDir) And If Dir(sDir).Count = 0 Then VersionControl.AddDir(sDir) + +End + +Private Sub GetInfoFile() As String + + Try Return File.Load(Project.Dir &/ ".info") + +End + +Public Function Compile(Optional bAll As Boolean, Optional bNoDebug As Boolean, Optional bNoMessage As Boolean, Optional bMakeExecutable As Boolean) As Boolean + + Dim sExec As String + Dim sOutput As String + Dim sRes As String + Dim sDir As String + Dim sPath As String + Dim iPos As Integer + Dim sTrans As String + Dim sBefore, sAfter As String + Dim bGotError As Boolean + + If Project.ReadOnly Then Return + If Project.Running Then Return 'TRUE + + If LockIt() Then Return True + + sDir = Project.Dir + + FProperty.SaveProperty + Save(True) + + If HasConflict Then + UnlockIt() + If Not bNoMessage Then Message.Warning(("Some project source files are in conflict.\nPlease solve them if you want to compile the project.")) + Return True + Endif + + SetMessage(("Compiling project") & " " & Project.Name & "...") + + GetVersion + + If bAll Then + 'CleanUp + WriteProject(True) + DeleteCompiledFiles + Endif + + sBefore = GetInfoFile() + + sExec = GetCompileCommand(bAll, bNoDebug, bMakeExecutable, True) + + iPos = Environment.Find("GB_PCODE_VERSION=*", gb.Like) + If iPos >= 0 Then + Shell sExec With [Environment[iPos]] Wait + Else + Shell sExec Wait + Endif + + bGotError = Process.LastValue + + sOutput = Trim(File.Load(OUTPUT_FILE)) + + iPos = RInStr(sOutput, "\n") + If iPos Then + sRes = Mid$(sOutput, iPos + 1) + sOutput = Left(sOutput, iPos - 1) + Else + If sOutput <> "OK" Then + sRes = sOutput + Endif + sOutput = "" + Endif + + FDebugInfo.SetCompilation(sOutput) + 'FDebugInfo.GotoFirstWarning() + + If bGotError And If sRes Then + + UnlockIt() + If Not bNoMessage Then CompileError(sRes) + Return True + + Else + + If Localize Then + WriteProjectTranslation + sPath = sDir &/ ".lang/.pot" + Shell "msgcat " & Shell$(sDir) &/ ".lang/*.pot > " & Shell$(sPath) & " 2>/dev/null" Wait + sTrans = File.Load(sPath) + iPos = InStr(sTrans, "#,") + If iPos Then sTrans = Mid$(sTrans, iPos) + File.Save(sDir &/ ".lang/.pot", sTrans) + 'CompileTranslation(bAll) + Endif + + 'SetMessage(("OK")) + 'FMain.ShowAnimate("Happy") + + Endif + + sAfter = GetInfoFile() + + If sAfter <> sBefore Then + RefreshComponents(True) + Endif + + UnlockIt() + +End + +Private Function CheckRunning(Optional bCompileAll As Boolean) As Boolean + + If Project.Running Then Return + If Compile(bCompileAll) Then Return True + If CheckStartupClass() Then Return True + +End + +Public Sub Run(Optional bCompileAll As Boolean, Optional iDebug As Integer, Optional sStartup As String) + + If CheckRunning(bCompileAll) Then Return + + If iDebug = 1 Then + Design.Step + Else If iDebug = 2 Then + Design.Forward + Else If iDebug = 3 Then + Design.ReturnFrom + Else + If sStartup Then Design.Startup = sStartup + Design.Run + Design.Startup = "" + Endif + +End + +Public Sub Test() + + If CheckRunning() Then Return + Design.Test + +End + +Public Sub Forward() + + If CheckRunning() Then Return + Design.Forward + +End + +Public Sub ReturnFrom() + + If CheckRunning() Then Return + Design.ReturnFrom + +End + +Public Sub RunUntil(hForm As FEditor, iLine As Integer) + + If CheckRunning() Then Return + Design.RunUntil(hForm, iLine) + +End + +Public Sub Step() + + If Compile() Then Return + If CheckStartupClass() Then Return + + Design.Step + +End + +Public Sub Save(Optional (bReset) As Boolean) + + Dim hForm As Object + + Inc Application.Busy + + For Each hForm In Files + If hForm Is FEditor Then + If hForm.Save() Then Break + Else + If hForm.Save() Then Break + Endif + + Next + + Dec Application.Busy + +End + +Public Sub Reload() + + Open(Project.Dir) + +End + + +Public Sub CopyProject(sSrc As String, sDst As String) + + Dim sFile As String + + Try Mkdir sDst + + For Each sFile In Dir(sSrc) + If sFile = ".svn" Or sFile = "CVS" Or sFile = ".lock" Then Continue + + With Stat(sSrc &/ sFile) + + If .Type = gb.Directory Then + CopyProject(sSrc &/ sFile, sDst &/ sFile) + Else If .Type = gb.Link Then + Link .Link To sDst &/ sFile + Else + Copy sSrc &/ sFile To sDst &/ sFile + Endif + + End With + + Next + +End + +Public Sub SaveAs() + + FSaveProjectAs.Run + +End + +Public Sub GetAbsoluteLink(sPath As String, sLink As String) As String + + Dim aPath As String[] + Dim iInd As Integer + Dim sElt As String + + If Left$(sLink) = "/" Then Return sLink + + aPath = Split(File.Dir(sPath) &/ sLink, "/") + + While iInd < aPath.Count + sElt = aPath[iInd] + If sElt = "." Or If sElt = "" Then + aPath.Remove(iInd) + Else If sElt = ".." Then + If iInd Then + aPath.Remove(iInd - 1, 2) + Dec iInd + Else + aPath.Remove(iInd) + Endif + Else + Inc iInd + Endif + Wend + + Return "/" & aPath.Join("/") + +End + +Public Sub MakeRelativeLink(sLink As String, sPath As String) As String + + Dim aPath As String[] + Dim aLink As String[] + Dim iInd As Integer + Dim iMax As Integer + + aPath = Split(File.Dir(sPath), "/") + aLink = Split(sLink, "/") + + iMax = Min(aPath.Max, aLink.Max) + For iInd = 0 To iMax + If aPath[iInd] <> aLink[iInd] Then Break + Next + + If iInd <= iMax And (aPath.Count - iInd) <= 6 Then + + sLink = String$(aPath.Count - iInd, "../") + While iInd < aLink.Count + sLink = sLink &/ aLink[iInd] + Inc iInd + Wend + + Endif + + Return sLink + +End + +Public Sub InsertSource(sName As String, sType As String, sDir As String, Optional sTemplate As String, Optional bNoRefresh As Boolean, Optional bNoOpen As Boolean, Optional bLink As Boolean) + + Dim sPath As String + + sPath = sDir &/ File.BaseName(sName) & "." & sType + If Exist(sPath) Then + FMain.ShowWarning(("File already exists.")) + Return + Endif + + If bLink Then + sTemplate = MakeRelativeLink(sTemplate, sPath) + Link sTemplate To sPath ' swapped + Else If Left(sTemplate) = "/" Then + Try Copy sTemplate To sPath + Else + File.Save(sPath, sTemplate) + Endif + + VersionControl.AddFile(sPath) + + Tree.Sources[sName] = sPath + OnRefreshSources + + If Not bNoRefresh Then Refresh + If Not bNoOpen Then OpenFile(sPath) + +End + +Public Sub InsertFile(sName As String, sDir As String, Optional sTemplate As String, Optional bNoOpen As Boolean, Optional bLink As Boolean) + + Dim sPath As String + + sPath = sDir &/ sName + + If Len(sTemplate) Then + + If Exist(sPath) Then + If IsDir(sPath) Then + FMain.ShowWarning(("Directory already exists.")) + Else + FMain.ShowWarning(("File already exists.")) + Endif + Return + Endif + + 'SHELL "cp " & Quote(sTemplate) & " " & Quote(sPath) WAIT + If bLink Then + sTemplate = MakeRelativeLink(sTemplate, sPath) + Try Link sTemplate To sPath ' swapped + If Not Exist(sPath) Then + FMain.ShowError(("Cannot link template file.") & "\n\n" & Error.Text) + Return + Endif + Else + Try Copy sTemplate To sPath + If Not Exist(sPath) Then + FMain.ShowError(("Cannot copy template file.") & "\n\n" & Error.Text) + Return + Endif + Endif + + Endif + + VersionControl.AddFile(sPath) + + Refresh + 'RefreshLibrary + + If Not bNoOpen Then OpenFile(sPath) + +End + +Public Sub MakeDir(sDir As String) As Boolean + + Dim sPath As String + Dim sElt As String + + If sDir Begins "~/" Then sDir = User.Home &/ Mid$(sDir, 3) + + For Each sElt In Split(sDir, "/") + sPath &/= sElt + Try Mkdir "/" & sPath + Next + + If Not Exist(sDir) Or If Not IsDir(sDir) Then Return True + +End + +Public Function InsertDirectory(sDir As String, Optional bNoVerCtrl As Boolean) As Boolean + + Dim sPath As String + Dim sElt As String + + If Exist(sDir) Then + FMain.ShowWarning(("Directory already exists.")) + Return True + Endif + + sPath = "/" + For Each sElt In Split(sDir, "/") + sPath &/= sElt + If Len(sPath) > Len(Project.Dir) And If Not Exist(sPath) Then + Try Mkdir sPath + If Error Then + Message.Error(Error.Text) + Return False + Endif + If Not bNoVerCtrl Then VersionControl.AddDir(sPath) + RefreshKey(sPath) + Endif + Next + + Return True + +End + +Private Sub RefreshActivate() + + Dim hActive As Object = ActiveForm + + ActiveForm = Null + Activate(hActive) + +End + +Public Sub Activate(hForm As Object) + + Dim sType As String + Dim bEditor As Boolean + Dim bTextEditor As Boolean + + If AboutToQuit Then Return + + If hForm Then + Tree.SelectKey(hForm.Path) + If ActiveForm = hForm Then + Try ActiveForm.SetFocus + Return + Endif + 'ELSE + 'IF NOT ActiveForm THEN RETURN + Endif + + ActiveForm = hForm + + If Not ActiveForm Then + + FProperty.HideAll + FFormStack.HideAll + FMain.ShowTool("") + sType = "" + + Else + + FProperty.RefreshAll + FFormStack.RefreshAll + + sType = Object.Type(ActiveForm) + + FMain.ShowTool(sType) 'Or ShowAlwaysProperty) + + Endif + + bEditor = sType = "FEditor" + bTextEditor = sType = "FTextEditor" + + Action["break"].Enabled = bEditor + Action["watch"].Enabled = bEditor + Action["until"].Enabled = bEditor + + 'FFind.OnProjectActivate + FToolBox.OnProjectActivate + FImageProperty.OnProjectActivate + + Try ActiveForm.SetFocus + CPosition.SaveCurrent(ActiveForm) + + 'If hForm Then FMain.HideDebug(sType = "FConnectionEditor") + + FSearch.Update + + UpdateTitle + +End + +Public Sub Deactivate(hForm As Object) + + If ActiveForm <> hForm Then Return + + 'DEBUG hForm + + 'DEBUG "DeActivate: "; hForm.Title + + Select Case Object.Type(hForm) + + Case "FForm" + FProperty.HideAll + FFormStack.HideAll + 'FProperty.Hide + ' FToolBox.Hide + + End Select + +End + +Private Sub GetVersion(Optional bWriteProject As Boolean) As Boolean + + Dim sDir As String + Dim sVer As String + Dim aVer As String[] + Dim iMajor As Integer + Dim iMinor As Integer + Dim iRelease As Integer + Dim sOldVer As String + + If Not VersionFile Then Return True + + If bWriteProject Then sOldVer = FormatVersion() + + sDir = Project.Dir + Do + sDir = File.Dir(sDir) + If sDir = "/" Then Return True + If Exist(sDir &/ "VERSION") Then Break + Loop + + sVer = Trim(File.Load(sDir &/ "VERSION")) + + aVer = Split(Trim(sVer), ".") + + If aVer.Count = 0 Then Goto BAD_VERSION + + Try iMajor = aVer[0] + If Error Or If iMajor < 0 Then Goto BAD_VERSION + + If aVer.Count >= 2 Then + Try iMinor = aVer[1] + If Error Or If iMinor < 0 Then Goto BAD_VERSION + Else + iMinor = 0 + Endif + + If aVer.Count >= 3 Then + Try iRelease = aVer[2] + If Error Or If iRelease < 0 Then Goto BAD_VERSION + Else + iRelease = 0 + Endif + + MajorVersion = iMajor + MinorVersion = iMinor + ReleaseVersion = iRelease + + If bWriteProject Then + sVer = FormatVersion() + If sVer <> sOldVer Then WriteProject + Endif + + Return + +BAD_VERSION: + + FMain.ShowError(("The contents of VERSION file is incorrect.") & "\n" & sDir & "") + +End + +Public Sub InstallLibrary(sExecPath As String, sVendor As String, sVersion As String) As String + + Dim sDir As String + Dim sLink As String + + sDir = CLibraryInfo.UserPath + If sVendor Then + sDir &/= LCase(sVendor) + Else + sDir &/= "(unknown)" + Endif + + MakeDir(sDir) + + sLink = sDir &/ File.BaseName(sExecPath) & ":" & sVersion & ".gambas" + + Try Kill sLink + Try Copy sExecPath To sLink + If Error Then Return Subst(("Cannot install library in &1."), "" & sDir & "") & "\n\n" & Error.Text + +End + + +Public Function MakeExecutable(Optional bDoNotIncVersion As Boolean, Optional bSilent As Boolean) As Boolean + + Dim sExec As String + Dim sExecPath As String + Dim bOK As Boolean + Dim sErr As String + Dim bSaveDone As Boolean + Dim hProcess As Process + Dim hTerminal As TerminalView + Dim sCommand As String + Dim sPath As String + + If CheckStartupClass() Then Return True + + DisableRefresh + + sExecPath = GetExecPath() + + If Not bSilent Then + + 'IF Dialog.SaveFile() THEN RETURN TRUE + sExecPath = FMakeExecutable.Run(sExecPath) + If Not sExecPath Then + EnableRefresh + Return + Endif + + sExecPath = File.SetExt(sExecPath, "gambas") + If sExecPath Begins (Project.Dir & "/") Then + Config["/Executable/Path"] = Mid$(sExecPath, Len(Project.Dir) + 2) + Else + Config["/Executable/Path"] = sExecPath + Endif + + Config.Save + + Endif + + SetMessage(("Making executable...")) + + If Compile(True) Then + EnableRefresh + Return True + Endif + + bDoNotIncVersion = bDoNotIncVersion Or Project.Config["/Executable/DoNotIncrementVersion", False] + + If Not bDoNotIncVersion And If Project.TimeStamp = Project.ExecTimeStamp Then + If Message.Warning(("No change has been detected.") & "\n\n" & ("Do you really want to increment the project version and make the executable again?"), ("Make executable"), ("Cancel")) = 2 Then + EnableRefresh + Return True + Endif + Endif + + Exec ["rm", "-rf", Project.Dir &/ ".gambas.save"] Wait + 'Exec ["cp", "-rf", Project.Dir &/ ".gambas", Project.Dir &/ ".gambas.save"] Wait + Move Project.Dir &/ ".gambas" To Project.Dir &/ ".gambas.save" + bSaveDone = True + + If Not Compile(True, Not KeepDebugInfo, False, True) Then + + GetVersion() + + ' Save project before making the executable + WriteProject(True) + + If Config["/Executable/NoTestModule"] Then + + For Each sPath In Project.Tree.GetTestModules() + Try Kill Project.Dir &/ ".gambas" &/ UCase(File.BaseName(sPath)) + Next + + Endif + + sExec = System.Path &/ "bin/gba" & System.Version & " -o " & Shell$(sExecPath) & " " & Shell$(Project.Dir) & " > " & OUTPUT_FILE & " 2>&1" + Shell sExec Wait + If Process.LastValue Then Error.Raise(Trim(File.Load(OUTPUT_FILE))) + 'SetMessage(("OK")) + + If Not VersionFile And If Not bDoNotIncVersion Then Inc ReleaseVersion + WriteProject(True, True) + + If Type = TYPE_LIBRARY Then + sErr = InstallLibrary(sExecPath, Vendor, CStr(MajorVersion) & "." & CStr(MinorVersion)) + If sErr Then FMain.ShowWarning(sErr) + Endif + + If RunAfterMakingExec Then + 'Shell Replace(RunAfterMakingExec, "$(FILE)", Shell$(sExecPath)) Wait + FDebugInfo.ShowConsole() + hTerminal = FOutput.GetTerminal() + sCommand = Replace(RunAfterMakingExec, "$(FILE)", Shell$(sExecPath)) + hTerminal.Print(sCommand & "\r\n") + hProcess = hTerminal.Shell(sCommand) + hProcess.Wait + Endif + + UpdateTitle + + bOK = True + + Endif + + Exec ["rm", "-rf", Project.Dir &/ ".gambas"] Wait + Move Project.Dir &/ ".gambas.save" To Project.Dir &/ ".gambas" + + EnableRefresh + + ExecTimeStamp = TimeStamp + + Return Not bOK + +Catch + + FMain.ShowError(("Cannot make executable.") & "\n\n" & Error.Text & "\n" & Error.Where) + If bSaveDone Then + Exec ["rm", "-rf", Project.Dir &/ ".gambas"] Wait + Try Move Project.Dir &/ ".gambas.save" To Project.Dir &/ ".gambas" + Endif + EnableRefresh + Return True + +End + +Public Sub ExistClass(sClass As String) As Boolean + + Return Tree.ExistClass(sClass) + +End + +Public Function GetClasses(Optional bFullPath As Boolean) As String[] + + Dim sPath As String + Dim aClass As New String[] + + If Not Path Then Return aClass + + For Each sPath In Tree.Sources + + If IsCodeExt(sPath) Then + If bFullPath Then + aClass.Add(sPath) + Else + aClass.Add(File.BaseName(sPath)) + Endif + Endif + + Next + + aClass.Sort(gb.IgnoreCase + gb.Natural) + + 'If Not bFullPath Then aModule.Sort + + Return aClass + +End + +Private Sub CheckProjectVersion(sPath As String) As String + + Dim hFic As File + Dim sLig As String + + hFic = Open sPath + + Line Input #hFic, sLig + If sLig = PROJECT_MAGIC_1 Then Return "1.0" + If sLig = PROJECT_MAGIC_2 Then Return "2.0" + If sLig <> PROJECT_MAGIC Then Return "?" + +End + +' Private Sub CreateConnectionDirectory() +' +' If Libraries.Exist("gb.db") Then +' Mkdir Project.Dir &/ ".connection" +' Endif +' +' End + +Public Sub ReadProject(Optional bConvert As Boolean) + + Dim hFic As File + Dim sLig As String + Dim iPos As Integer + Dim sKey As String + Dim sVal As String + Dim sElt As String + Dim iElt As Integer + Dim aMissing As New String[] + Dim sMsg As String + Dim hComp As CComponent + Dim bNewPackagerConfig As Boolean + Dim aVer As String[] + + hFic = Open Path For Input + + Components = New String[] + Libraries = New String[] + ExtraReferences = New String[] + LibraryPath = "" + Title = "" + TabSize = Settings["/DefaultTabSize", 2] + Arguments = New String[][] + CurrentArgument = New String[] + Environment = New String[] + MajorVersion = 0 + MinorVersion = 0 + ReleaseVersion = 1 + VersionAddBranch = False + 'SnapToGrid = TRUE + 'ShowGrid = TRUE + ControlPublic = False + ModulePublic = False + ShowDeprecated = False + Warnings = True + KeepDebugInfo = True + Localize = False + Description = "" + Authors = "" + Icon = "" + Systems = New String[] + Menus = New Collection + Categories = New Collection + MimeTypes = New String[] + Groups = New Collection + ExtraDependencies = New Collection + ExtraFiles = New Collection + ExtraDesktop = "" + SameDependencies = False + SameFiles = False + ExtraAutoconfTest = "" + Prefix = False + PackageName = "" + PackageVersion = 1 + RuntimeVersion = "" + PackageSignature = False + PackageNameWithMajor = False + SourcePath = "" + Type = TYPE_NORMAL + CreateShortcut = False + RunAfterMakingExec = "" + DefaultLanguage = "" + VersionFile = False + 'Stack = 0 + 'StackTrace = False + UseTerminal = False + RedirectStderr = False + UseHttpServer = False + Profiling = False + ProfileIndex = 0 + 'BreakOnError = False + Maintainer = "" + Vendor = "" + VendorPrefix = "" + Address = "" + Url = "" + License = "" + CreateEachDirectory = False + PublishTags = New String[] + PublishDependencies = New String[] + PublishGambasVersion = "" + PublishWebSite = "" + PublishCreateMenu = False + DoNotTranslate = New String[] + + For Each sLig In hFic.Lines + + sLig = Trim(sLig) + + If Len(sLig) = 0 Then Continue + If Left$(sLig, 1) = "#" Then Continue + + iPos = InStr(sLig, "=") + If iPos = 0 Then Continue + + sKey = Lower$(Trim(Left$(sLig, iPos - 1))) + sVal = Trim(Mid$(sLig, iPos + 1)) + + Select sKey + + Case "title" + Title = sVal + + Case "startup" + 'DefineStartup(sVal, True) + Startup = sVal + + Case "component" + hComp = Project.Documentation[sVal] + If Not hComp Then + aMissing.Add(sVal) + Else If Not hComp.Hidden Then + If Not Components.Exist(sVal) Then Components.Add(sVal) + Endif + + Case "library" + If bConvert Then + For Each sVal In MConvert.ConvertComponent(sVal) + If Project.Documentation.Exist(sVal) Then + If Not Components.Exist(sVal) Then Components.Add(sVal) + Else + aMissing.Add(sVal) + Endif + Next + Else + If Not Libraries.Exist(sVal) Then Libraries.Add(sVal) + Endif + + Case "librarypath" + LibraryPath = sVal + + Case "tabsize" + TabSize = CInt(sVal) + + Case "arguments" + If Left(sVal) = "[" Then + Arguments = Settings.FromString(sVal) + Else + Arguments = [Split(UnQuote(sVal), "\n")] + Endif + + Case "currentargument" + If Left(sVal) = "[" Then CurrentArgument = Settings.FromString(sVal) + + Case "environment" + Environment = Split(UnQuote(sVal), "\n") + + Case "version" + iPos = InStr(sVal, " ") + If iPos Then sVal = Left(sVal, iPos - 1) + aVer = Split(sVal, ".") + Try MajorVersion = Val(aVer[0]) + Try MinorVersion = Val(aVer[1]) + Try ReleaseVersion = Val(aVer[2]) + + Case "versionfile" + VersionFile = CInt(sVal) <> 0 + + Case "versionaddbranch" + VersionAddBranch = CInt(sVal) <> 0 + + Case "localize", "translate" + Localize = CInt(sVal) <> 0 + + Case "language" + DefaultLanguage = sVal + + Case "keepdebuginfo" + KeepDebugInfo = CInt(sVal) <> 0 + + Case "createshortcut" + CreateShortcut = CInt(sVal) <> 0 + + Case "runafter" + RunAfterMakingExec = sVal + + Case "makecomponent" + Type = If(CInt(sVal) <> 0, TYPE_COMPONENT, TYPE_NORMAL) + 'CreateComponent = Val(sVal) <> 0 + + Case "type" + Select LCase(sVal) + Case "library" + Type = TYPE_LIBRARY + Case "component" + Type = TYPE_COMPONENT + End Select + + Case "controlpublic" + ControlPublic = CInt(sVal) <> 0 + + Case "modulepublic" + ModulePublic = CInt(sVal) <> 0 + + Case "showdeprecated" + ShowDeprecated = CInt(sVal) <> 0 + + Case "warnings" + Warnings = CInt(sVal) <> 0 + + Case "description" + Description = UnQuote(sVal) + + Case "authors" + Authors = UnQuote(sVal) + + Case "icon" + Icon = sVal + + Case "packager" + bNewPackagerConfig = CInt(sVal) <> 0 + + Case "systems" + Systems = Split(sVal, ",") + + Case "menus" + If bNewPackagerConfig Then + iPos = InStr(sVal, ":") + Menus[Left$(sVal, iPos - 1)] = UnQuote(Mid$(sVal, iPos + 1)) + Else + iElt = 0 + For Each sElt In Split(sVal, ",") + If iElt >= Systems.Count Then Break + Menus[Systems[iElt]] = sElt + Inc iElt + Next + Endif + + Case "categories" + If bNewPackagerConfig Then + iPos = InStr(sVal, ":") + Categories[Left$(sVal, iPos - 1)] = UnQuote(Mid$(sVal, iPos + 1)) + Else + iElt = 0 + For Each sElt In Split(sVal, ",") + If iElt >= Systems.Count Then Break + Categories[Systems[iElt]] = sElt + Inc iElt + Next + Endif + + Case "groups" + If bNewPackagerConfig Then + iPos = InStr(sVal, ":") + Groups[Left$(sVal, iPos - 1)] = UnQuote(Mid$(sVal, iPos + 1)) + Else + iElt = 0 + For Each sElt In Split(sVal, ",") + If iElt >= Systems.Count Then Break + Groups[Systems[iElt]] = sElt + Inc iElt + Next + Endif + + Case "extradependencies" + If bNewPackagerConfig Then + iPos = InStr(sVal, ":") + ExtraDependencies[Left$(sVal, iPos - 1)] = UnQuote(Mid$(sVal, iPos + 1)) + Else + iElt = 0 + For Each sElt In Split(sVal, ",") + If iElt >= Systems.Count Then Break + sElt = Replace(sElt, ";", "\n") + sElt = Replace(sElt, ":", "\t") + ExtraDependencies[Systems[iElt]] = sElt + Inc iElt + Next + Endif + + Case "extrafiles" + If bNewPackagerConfig Then + iPos = InStr(sVal, ":") + ExtraFiles[Left$(sVal, iPos - 1)] = UnQuote(Mid$(sVal, iPos + 1)) + Else + iElt = 0 + For Each sElt In Split(sVal, ",") + If iElt >= Systems.Count Then Break + sElt = Replace(sElt, ";", "\n") + sElt = Replace(sElt, ":", "\t") + ExtraFiles[Systems[iElt]] = sElt + Inc iElt + Next + Endif + + Case "extraautoconftest" + ExtraAutoconfTest = UnQuote(sVal) + + Case "extradesktop" + ExtraDesktop = UnQuote(sVal) + + Case "prefix" + Prefix = Val(sVal) + + Case "packagename" + PackageName = sVal + + Case "packageversion" + Try PackageVersion = CInt(sVal) + + Case "packagesignature" + PackageSignature = CInt(sVal) + + Case "packagenamewithmajor" + PackageNameWithMajor = CInt(sVal) <> 0 + + Case "maintainer" + Maintainer = sVal + + Case "vendor" + Vendor = sVal + + Case "vendorprefix" + VendorPrefix = sVal + + Case "runtimeversion" + RuntimeVersion = UnQuote(sVal) + + Case "address" + Address = sVal + + Case "url" + Url = sVal + + Case "license" + License = sVal + + Case "sourcepath" + SourcePath = sVal + + Case "useterminal" + UseTerminal = CInt(sVal) <> 0 + + Case "redirectstderr" + RedirectStderr = CInt(sVal) <> 0 + + Case "usehttpserver" + UseHttpServer = CInt(sVal) <> 0 + + Case "profiling" + Profiling = CInt(sVal) <> 0 + + ' Case "breakonerror" + ' BreakOnError = CInt(sVal) <> 0 + ' + Case "createeachdirectory" + CreateEachDirectory = CInt(sVal) <> 0 + + Case "samedependencies" + SameDependencies = CInt(sVal) <> 0 + + Case "samefiles" + SameFiles = CInt(sVal) <> 0 + + Case "mimetypes" + MimeTypes = Split(sVal, ",", Chr$(34), True) + + Case "execpath" + OldExecPath = sVal + + Case "tags" + PublishTags = Split(sVal) + + Case "gambasversion" + PublishGambasVersion = sVal + + Case "dependencies" + PublishDependencies = Split(sVal) + + Case "website" + PublishWebSite = sVal + + Case "createmenu" + PublishCreateMenu = CInt(sVal) <> 0 + + Case "donottranslate" + DoNotTranslate = Split(sVal, ",", Chr$(34), True) + + Case "reference" + If Not ExtraReferences.Exist(sVal) Then ExtraReferences.Add(sVal) + + End Select + + Next + + Close hFic + + VersionFile = Not GetVersion(True) + 'If JustUpdateVersion Then Return + + If aMissing.Count Then + sMsg = Subst(("Some components are missing: &1"), aMissing.Join(", ")) + If Message.Error(sMsg, ("Continue"), ("Cancel")) = 2 Then + Error.Raise("") + Endif + Endif + + If Not $bTesting Then FMain.UpdateTranslate + RefreshComponents + UpdateLibraries(Libraries) + 'CreateConnectionDirectory + +End + +Public Sub WriteProjectTranslation() + + Dim sPath As String + Dim hFic As File + + sPath = Project.Dir &/ ".lang/#project.pot" + Try Kill sPath + If Localize Then + + CreateLangDirectory + + hFic = Open sPath For Create + Print #hFic, "# "; Path + Print #hFic, CTranslation.SubstHeader(File.Load("pot-header.txt")) + If Title Then + Print #hFic, "#: .project:1" + Print #hFic, "msgid \""; Escape(Title); "\"" + Print #hFic, "msgstr \"\"\n" + Endif + If Description Then + Print #hFic, "#: .project:2" + Print #hFic, "msgid \""; Escape(Description); "\"" + Print #hFic, "msgstr \"\"\n" + Endif + Close #hFic + + Endif + +End + +Public Sub WriteProject(Optional bComponentDoNotChange As Boolean, Optional bMakeShortcut As Boolean) + + Dim hFile As File + Dim sSys As String + Dim sPath As String + Dim sVal As String + Dim hComp As CComponent + Dim sVer As String + Dim sBranch As String + + If Project.ReadOnly Then Return + + 'If Not JustUpdateVersion Then + + If Type + ' If bMakeShortcut Then + ' If Project.CreateShortcut Then + ' InstallComponent + ' Else + ' UninstallComponent + ' Endif + ' Endif + Else + MakeShortcut(bMakeShortcut) + If Not bComponentDoNotChange Then RefreshComponents + Endif + + 'Endif + + ' Creates the .project file + + sPath = Path + Try Kill sPath & ".tmp" + hFile = Open sPath & ".tmp" For Create + + Print #hFile, PROJECT_MAGIC + 'Print #hFic, "# Compiled with Gambas "; FullVersion + 'PRINT #hFic, "Project="; Name + + If Title Then Print #hFile, "Title="; Title + If Startup Then Print #hFile, "Startup="; Startup + 'If Stack Then Print #hFic, "Stack="; Stack + 'If StackTrace Then Print #hFic, "StackTrace=1" + If UseTerminal Then Print #hFile, "UseTerminal=1" + If RedirectStderr Then Print #hFile, "RedirectStderr=1" + If UseHttpServer Then Print #hFile, "UseHttpServer=1" + If Profiling Then Print #hFile, "Profiling=1" + 'If BreakOnError Then Print #hFic, "BreakOnError=1" + If Icon Then Print #hFile, "Icon="; Icon + + GetVersion() + sVer = FormatVersion() + If VersionAddBranch Then + VersionControl.GetBranches(ByRef sBranch) + If sBranch Then sVer &= " (" & sBranch & ")" + Endif + + Print #hFile, "Version="; sVer + If VersionFile Then Print #hFile, "VersionFile=1" + If VersionAddBranch Then Print #hFile, "VersionAddBranch=1" + + For Each hComp In Documentation.Components + If Components.Find(hComp.Key) >= 0 Then + Print #hFile, "Component="; hComp.Key + Endif + Next + + If LibraryPath Then Print #hFile, "LibraryPath="; LibraryPath + For Each sVal In Libraries + Print #hFile, "Library="; sVal + Next + + If Description Then Print #hFile, "Description="; Quote(Description) + If Authors Then Print #hFile, "Authors="; Quote(Authors) + + If Arguments.Count Then + Print #hFile, "Arguments="; Settings.ToString(Arguments) + If CurrentArgument And If CurrentArgument.Count Then Print #hFile, "CurrentArgument="; Settings.ToString(CurrentArgument) + Endif + If Environment.Count Then Print #hFile, "Environment="; Quote(Environment.Join("\n")) + + Print #hFile, "TabSize="; CStr(TabSize) + If Localize Then Print #hFile, "Translate=1" + If DefaultLanguage Then Print #hFile, "Language="; DefaultLanguage + If Not KeepDebugInfo Then Print #hFile, "KeepDebugInfo=0" + If CreateShortcut Then Print #hFile, "CreateShortcut=1" + If RunAfterMakingExec Then Print #hFile, "RunAfter="; RunAfterMakingExec + Select Case Type + Case TYPE_LIBRARY + Print #hFile, "Type=Library" + Case TYPE_COMPONENT + Print #hFile, "Type=Component" + End Select + If ControlPublic Then Print #hFile, "ControlPublic=1" + If ModulePublic Then Print #hFile, "ModulePublic=1" + If ShowDeprecated Then Print #hFile, "ShowDeprecated=1" + If Not Warnings Then Print #hFile, "Warnings=0" + If SourcePath Then Print #hFile, "SourcePath="; SourcePath + + If Maintainer Then Print #hFile, "Maintainer="; Maintainer + If Vendor Then Print #hFile, "Vendor="; Vendor + If VendorPrefix Then Print #hFile, "VendorPrefix="; VendorPrefix + If Address Then Print #hFile, "Address="; Address + If Url And If Url <> DEFAULT_URL Then Print #hFile, "Url="; Url + If License Then Print #hFile, "License="; License + If Prefix Then Print #hFile, "Prefix=1" + If PackageName Then Print #hFile, "PackageName="; PackageName + If PackageVersion > 1 Then Print #hFile, "PackageVersion="; PackageVersion + If PackageSignature Then Print #hFile, "PackageSignature=1" + If PackageNameWithMajor Then Print #hFile, "PackageNameWithMajor=1" + + If CreateEachDirectory Then Print #hFile, "CreateEachDirectory=1" + If MimeTypes.Count Then Print #hFile, "MimeTypes="; MimeTypes.Join(",", Chr$(34)) + If ExtraDesktop Then Print #hFile, "ExtraDesktop=" & Quote(ExtraDesktop) + If RuntimeVersion Then Print #hFile, "RuntimeVersion=" & Quote(RuntimeVersion) + + Print #hFile, "Packager=1" + If Systems.Count Then Print #hFile, "Systems="; Systems.Join(",") + If SameDependencies Then Print #hFile, "SameDependencies=1" + If SameFiles Then Print #hFile, "SameFiles=1" + If ExtraAutoconfTest Then Print #hFile, "ExtraAutoconfTest=" & Quote(ExtraAutoconfTest) + + For Each sSys In $aSystems + If Menus[sSys] Then Print #hFile, "Menus="; sSys; ":"; Quote(Menus[sSys]) + If Categories[sSys] Then Print #hFile, "Categories="; sSys; ":"; Quote(Categories[sSys]) + If Groups[sSys] Then Print #hFile, "Groups="; sSys; ":"; Quote(Groups[sSys]) + If ExtraDependencies[sSys] Then Print #hFile, "ExtraDependencies="; sSys; ":"; Quote(ExtraDependencies[sSys]) + If ExtraFiles[sSys] Then Print #hFile, "ExtraFiles="; sSys; ":"; Quote(ExtraFiles[sSys]) + Next + + If PublishTags And If PublishTags.Count Then Print #hFile, "Tags="; PublishTags.Join(",") + If PublishDependencies And If PublishDependencies.Count Then Print #hFile, "Dependencies="; PublishDependencies.Join(",") + If PublishGambasVersion Then Print #hFile, "GambasVersion="; PublishGambasVersion + If PublishWebSite Then Print #hFile, "WebSite="; PublishWebSite + If PublishCreateMenu Then Print #hFile, "CreateMenu=1" + + If DoNotTranslate.Count Then Print #hFile, "DoNotTranslate="; DoNotTranslate.Join(",", Chr$(34)) + + If ExtraReferences Then + For Each sVal In ExtraReferences + Print #hFile, "Reference="; sVal + Next + Endif + + Close #hFile + + Try Kill sPath + Move sPath & ".tmp" To sPath + + 'If JustUpdateVersion Then Return + + WriteProjectTranslation + UpdateComponentFile + + FMain.UpdateTranslate + FMain.UpdateMenu + UpdateTitle + 'CreateConnectionDirectory + +Catch + + FMain.ShowError(("Cannot write project file.") & "\n\n" & Error.Text) + +End + +Public Sub GetExecPath() As String + + Dim sExecPath As String = Config["Executable/Path"] + + If Not sExecPath Then sExecPath = OldExecPath + If Not sExecPath Then sExecPath = Project.Name & ".gambas" + + If Left(sExecPath) <> "/" Then + sExecPath = Project.Dir &/ sExecPath + Endif + + If Not Exist(File.Dir(sExecPath)) Then sExecPath = Project.Dir &/ File.Name(sExecPath) + + Return sExecPath + +End + +Public Sub MakeShortcut(Optional bForce As Boolean) + + Dim sDesktopPath As String + Dim sPath As String + Dim sShortcut As String + + If Not CreateShortcut Then Return + + sDesktopPath = Desktop.Path &/ Name & ".desktop" + + If Not bForce Then + If Not Exist(sDesktopPath) Then Return + Endif + + sShortcut = File.Load("shortcut.desktop") + sShortcut = Replace(sShortcut, "$(NAME)", If(Title, Title, Name)) + sShortcut = Replace(sShortcut, "$(EXEC)", GetExecPath()) + + sPath = "" + If Icon And If Exist(Project.Dir &/ Icon) Then + sPath = Project.Dir &/ Icon + Endif + sShortcut = Replace(sShortcut, "$(ICON)", sPath) + + File.Save(sDesktopPath, sShortcut) + +Catch + + FMain.ShowError(("Unable to create desktop shortcut.") & "\n\n" & Error.Text & "\n" & Error.Where) + +End + +' Private Sub MakeLink(sSrc As String, sDst As String) +' +' If Not Exist(sDst) Then Link sSrc To sDst +' +' End + +' Private Sub RefreshForComponent() +' +' Dim hForm As Object +' +' RefreshComponents(True) +' +' FFormStack.RefreshAll(, True) +' +' For Each hForm In Files +' If IsForm(hForm) And If hForm.Visible Then +' hForm.RefreshForComponent +' Endif +' Next +' +' End + +' Public Sub InstallComponent() +' +' Dim sDir As String = Component.UserPath +' Dim sClass As String +' Dim sIcon As String +' +' MakeDir(sDir) +' +' MakeLink(Project.ExecPath, sDir &/ Name & ".gambas") +' MakeLink(Project.Dir &/ ".component", sDir &/ Name & ".component") +' +' sDir = File.Dir(File.Dir(sDir)) &/ "share/gambas" & System.Version & "/info" +' MakeDir(sDir) +' +' MakeLink(Project.Dir &/ ".info", sDir &/ Name & ".info") +' MakeLink(Project.Dir &/ ".list", sDir &/ Name & ".list") +' +' sDir = File.Dir(sDir) &/ "control" &/ Name +' +' For Each sClass In GetClasses(True) +' If Not IsExported(sClass) Then Continue +' sClass = LCase(File.BaseName(sClass)) +' sIcon = Project.Dir &/ ".hidden/control" &/ sClass & ".png" +' If Exist(sIcon) Then +' MakeDir(sDir) +' MakeLink(sIcon, sDir &/ sClass & ".png") +' Endif +' Next +' +' If Not CComponent.All.Exist(Name) Then +' CComponent.FullReset +' Endif +' If Not Components.Exist(Name) Then +' Components.Add(Name) +' Endif +' RefreshForComponent +' +' Catch +' +' FMain.ShowError(("Unable to install component.") & "\n\n" & Error.Text & "\n" & Error.Where) +' +' End +' +' Public Sub UninstallComponent() +' +' Dim sDir As String = Component.UserPath +' Dim bRefresh As Boolean +' +' 'MakeDir(sDir) +' +' bRefresh = Exist(sDir &/ Name & ".component") +' +' Try Kill sDir &/ Name & ".gambas" +' Try Kill sDir &/ Name & ".component" +' +' sDir = File.Dir(File.Dir(sDir)) &/ "share/gambas" & System.Version & "/info" +' +' Try Kill sDir &/ Name & ".info" +' Try Kill sDir &/ Name & ".list" +' +' sDir = File.Dir(sDir) &/ "control" &/ Name +' Exec ["rm", "-rf", sDir] Wait +' +' If bRefresh Then +' If CComponent.All.Exist(Name) Then +' CComponent.FullReset +' Endif +' If Not CComponent.All.Exist(Name) Then +' If Components.Exist(Name) Then +' Components.Remove(Components.Find(Name)) +' Endif +' RefreshForComponent +' Endif +' Endif +' +' Catch +' +' FMain.ShowError(("Unable to uninstall component.") & "\n\n" & Error.Text & "\n" & Error.Where) +' +' End + +Public Function GetNextEditor(sKey As String) As String + + Dim sFirst As String + Dim sFile As String + Dim bNext As Boolean + + If Not sKey Then bNext = True + + For Each sFile In GetClasses(True) + + If bNext Then Return sFile + + If Not sFirst Then + sFirst = sFile + Endif + + If sFile = sKey Then + bNext = True + Endif + + Next + + If bNext Then Return sFirst + +End + +Public Function GetPreviousEditor(sKey As String) As String + + Dim sLast As String + Dim sFile As String + + For Each sFile In GetClasses(True) + + If sFile = sKey Then + If sLast Then + Return sLast + Endif + Endif + + sLast = sFile + + Next + + Return sLast + +End + +Public Sub SetMessage((sMsg) As String) + + ' ' If FMain.ShowVisible And If sMsg <> ("OK") Then + ' ' FMain.ShowInfo(sMsg) + ' ' Endif + ' If $bTesting Then Return + ' FMain.SetMessage(sMsg) + +End + +Public Sub UnloadFile(sPath As String) + + Dim hForm As Object + + If Not Exist(sPath) Then Return + + hForm = Files[sPath] + + If hForm Then + hForm.Delete + Files[sPath] = Null + Endif + +End + +Public Sub DeleteFile(sPath As String) + + Dim sExt As String + Dim bLink As Boolean + Dim bProject As Boolean + Dim sName As String + Dim hModule As CModule + Dim sPathPot As String + Dim bReloadComponent As Boolean + Dim bConnection As Boolean + + If Not Exist(sPath) Then Return + + bLink = Stat(sPath).Type = gb.Link + + bProject = IsSourcePath(sPath) + bConnection = IsConnectionPath(sPath) + + If bProject Then bReloadComponent = IsExported(sPath) + + UnloadFile(sPath) + + If Not bLink Then + Try Kill sPath & "~" + Try Move sPath To sPath & "~" + Else + Try Kill sPath + Endif + + If IsProjectPath(sPath) Then VersionControl.RemoveFile(sPath) + + If bProject Then + + sName = File.BaseName(sPath) + sExt = File.Ext(sPath) + + Try Kill Project.Dir &/ ".gambas" &/ UCase(sName) + sPathPot = Project.Dir &/ ".lang" &/ sName & ".pot" + If Exist(sPathPot) Then + Try Kill sPathPot + VersionControl.RemoveFile(sPathPot) + Endif + + DeleteFile(File.Dir(sPath) &/ File.BaseName(sPath) & ".class") + For Each hModule In CModule.All + DeleteFile(File.Dir(sPath) &/ sName & "." & hModule.Key) + Next + + Tree.Sources.Remove(File.Name(sPath)) + OnRefreshSources + + If sName = Startup Then + DefineStartup("") + Endif + + If bReloadComponent Then Compile(True,, True) + + Endif + + If bConnection And If File.Ext(sPath) = "connection" Then + + sPathPot = File.SetExt(sPath, "template") + If Exist(sPathPot) Then + VersionControl.RemoveFile(sPathPot) + Try Kill sPathPot + Endif + + Endif + + Tree.RefreshKey(sPath) + +End + +Public Sub DeleteDir(sDir As String, Optional bNoVerCtrl As Boolean) + + Dim sFile As String + + For Each sFile In Dir(sDir, "*~") + Try Kill sDir &/ sFile + Next + + If Not bNoVerCtrl And If VersionControl.Enabled Then + + VersionControl.RemoveDir(sDir) + If Exist(sDir) Then + Try Rmdir sDir + If Error Then Message.Warning(("The directory will be removed at the next commit.")) + Endif + + Else + + Rmdir sDir + + Endif + + Tree.RefreshKey(sDir) + +End + +Private Function CheckStartupClass() As Boolean + + If Startup Then Return + + FMain.ShowWarning(("You must define a startup class or form!")) + + Return True + +End + +Public Function CheckFileName(sName As String, Optional sDir As String) As String + + Dim iInd As Integer + + If Not sName Then Goto VOID_NAME + + If String.Left$(sName) = "." Then + iInd = 1 + Goto BAD_START + Endif + + For iInd = 1 To String.Len(sName) + + If InStr(FILE_FORBIDDEN_CAR, String.Mid$(sName, iInd, 1)) Then Goto BAD_CHAR + + Next + + If Len(sDir) Then + If Exist(sDir &/ sName) Then Goto ALREADY_EXIST + Endif + + Return + +VOID_NAME: + + Return ("Please type a name.") + +BAD_CHAR: + + Return ("This name contains a forbidden character:") & " [ " & String.Mid$(sName, iInd, 1) & " ]" + +BAD_START: + + Return ("The name cannot begins with a dot.") + +ALREADY_EXIST: + + Return ("This name is already used. Choose another one.") + +End + +Public Function CheckClassName(sName As String, Optional bCheckNotExist As Boolean) As String + + Dim iInd As Integer + Dim sCar As String + + If Not sName Then Goto VOID_NAME + + If Not IsAscii(sName) Then Goto BAD_CHAR + + iInd = 1 + + If InStr(CLASS_AUTH_FIRST_CAR, LCase(Left(sName))) = 0 Then Goto BAD_CHAR + + For iInd = 2 To Len(sName) + sCar = LCase(Mid$(sName, iInd, 1)) + If Project.Type And If InStr(CLASS_AUTH_CAR_COMPONENT, sCar) Then Continue + If InStr(CLASS_AUTH_CAR & "_", sCar) = 0 Then Goto BAD_CHAR + Next + + If bCheckNotExist Then + If Project.Exist(sName) Then Goto ALREADY_EXIST + Endif + + Return + +VOID_NAME: + + Return ("Please type a name.") + +BAD_CHAR: + + Return ("This name contains a forbidden character:") & " [ " & String.Mid$(sName, iInd, 1) & " ]" & "\n\n" & + ("A class name must begin with a letter or an underscore, followed by any letter or digit.") + +ALREADY_EXIST: + + Return ("This name is already used. Choose another one.") + +End + +' Private Sub RenamePathCollection(cCol As Collection, sOld As String, sNew As String) +' +' Dim aRename As New String[] +' Dim vVal As Variant +' Dim sKey As String +' +' For Each vVal In cCol +' sKey = cCol.Key +' If sKey = sOld Or If sKey Begins sOld &/ "/" Then aRename.Add(sKey) +' Next +' +' For Each sKey In aRename +' vVal = cCol[sKey] +' cCol[sKey] = Null +' If sKey <> sOld Then +' sKey = sNew &/ Mid$(sKey, Len(sOld) + 1) +' Endif +' cCol[sNew] = vVal +' Next +' +' End + +Private Function RenameOneFile(sDir As String, sName As String, sNewName As String, Optional sExt As String) As String + + Dim sPath As String + Dim sNewPath As String + + sPath = sDir &/ sName + If sExt Then sPath = sPath & "." & sExt + If Not Exist(sPath) Then Return + + sNewPath = sDir &/ sNewName + If sExt Then sNewPath = sNewPath & "." & sExt + + If Exist(sNewPath) Then + Error.Raise(("Destination already exists.")) + Endif + + If IsDir(sPath) Then + If VersionControl.Enabled Then + VersionControl.MoveDir(sPath, sNewPath) + 'If Exist(sPath) Then LockedPaths[sPath] = True + Else + Move sPath To sNewPath + Endif + Else If Stat(sPath).Type = gb.Link Then + If VersionControl.NeedMove() Then Move sPath To sNewPath + VersionControl.MoveFile(sPath, sNewPath) + Else + If VersionControl.NeedMove() Then Copy sPath To sNewPath + VersionControl.MoveFile(sPath, sNewPath) + Try Kill sPath + Endif + + If sExt Then + + Try Kill Project.Dir &/ ".gambas" &/ UCase(sName) + 'If Not Error Then bRecompile = True + 'Try Kill Project.Dir &/ ".list" + 'Try Kill Project.Dir &/ ".info" + 'Debug sDir &/ ".gambas" &/ UCase(sName); ": "; Exist(sDir &/ ".gambas" &/ UCase(sName)) + Endif + + RenamePaths(sPath, sNewPath) + + If sExt And If IsExported(sNewPath) Then + UpdateAllForms(sName, sNewName) + Endif + + Return sNewPath + +End + +Public Sub GetClassesOnly() As String[] + + Dim sPath As String + Dim sFile As String + Dim aClass As New String[] + Dim sClass As String + + For Each sPath In Tree.Sources + sFile = File.Name(sPath) + If File.Ext(sFile) <> "class" Then Continue + sClass = File.BaseName(sFile) + If ExistForm(sClass) Then Continue + aClass.Add(sClass) + Next + + Return aClass.Sort(gb.Natural) + +End + +' Private Sub RefreshInheritance() +' +' Dim sKey As String +' +' $aInheritance.Clear +' +' For Each sKey In $cSourceDir +' If Not File.Ext(sKey) = "class" Then Continue +' Try ProjectTree[sKey].Delete +' $aInheritance.Add(sKey) +' Next +' +' DoRefreshAfter +' +' End + +Public Sub RefreshKey(sKey As String, Optional sOld As String) + + Tree.RefreshKey(sKey, sOld) + +End + +Public Sub RenameFile(sPath As String, sNewName As String) + + Dim sName As String + Dim sExt As String + Dim sDir As String + Dim sNewPath As String + Dim sMsg As String + Dim sFamily As String + Dim bIsDir As Boolean + + sDir = File.Dir(sPath) + sExt = File.Ext(sPath) + bIsDir = IsDir(sPath) + + If Not bIsDir And If Project.IsSourcePath(sPath) Then + + sName = File.BaseName(sPath) + If sName = sNewName Then Return + + If UCase(sName) <> UCase(sNewName) Then + sMsg = CheckClassName(sNewName, True) + If sMsg Then Error.Raise(sMsg) + Endif + + If sName = Startup Then + Startup = sNewName + WriteProject(True) + Tree.DefineStartup(Startup) + Endif + + sNewPath = RenameOneFile(sDir, sName, sNewName, sExt) + + If CFamily.List.Exist(sExt) Then + RenameOneFile(sDir, sName, sNewName, "class") + Else If sExt = "class" Then + For Each sFamily In CFamily.List + If Exist(sDir &/ sName & "." & sFamily) Then RenameOneFile(sDir, sName, sNewName, sFamily) + Next + Endif + + Else + + If Project.IsConnectionPath(sPath) Then sNewName = File.SetExt(sNewName, ".connection") + + sName = File.Name(sPath) + If sName = sNewName Then Return + + sMsg = CheckFileName(sNewName) + If sMsg Then Error.Raise(sMsg) + + sNewPath = RenameOneFile(sDir, sName, sNewName) + + Endif + + If Not IsFake() Then + + If bIsDir Then + Refresh + Else + RefreshKey(sNewPath, sPath) + Endif + + 'AddFile(File.Dir(sNewPath), File.Name(sNewPath), TRUE) + 'IF IsDir(sNewPath) THEN AddDir(sNewPath) + + Try ProjectTree[sNewPath].Selected = True + Try ProjectTree[sNewPath].EnsureVisible + + Endif + +Catch + + sMsg = Error.Text & "\n" & Error.Backtrace.Join(" ") + RefreshKey(sPath) + FMain.ShowError(Subst(("Unable to rename '&1'") & "\n\n" & sMsg, File.Name(sPath)), sPath) + +End + +Public Function Exist(sName As String) As Boolean + + Return Project.GetClasses().Find(sName, gb.IgnoreCase) >= 0 + +End + +Private Function LockIt() As Boolean + + If Application.Busy Then Return True + Inc Application.Busy + 'PRINT "Lock" + +End + +Private Sub UnLockIt() + + If Application.Busy < 1 Then Return + Dec Application.Busy + +End + +' Private Sub LoadRecent() +' +' Dim nRecent As Integer +' Dim hMenu As Menu +' Dim iInd As Integer +' Dim sPath As String +' +' nRecent = Settings["/Recent/Count", 0] +' +' Recent.Clear +' RecentDate.Clear +' +' For iInd = 1 To nRecent +' sPath = Settings["/Recent/File[" & CStr(iInd) & "]"] +' If sPath Then +' If Exist(sPath) Then +' Recent.Add(sPath) +' RecentDate.Add(CDate(Settings["/Recent/Date[" & CStr(iInd) & "]"])) +' If Recent.Count >= DEFAULT_MAX_RECENT Then Break +' Endif +' Endif +' Next +' +' End + +' Private Sub AddRecent(sPath As String) +' +' Dim iInd As Integer +' Dim nMax As Integer +' +' If Right$(sPath) = "/" Then sPath = Left$(sPath, -1) +' +' 'sPath = "(" & File.BaseName(sPath) & ") " & File.Dir(sPath) +' +' While iInd < Recent.Count +' +' If Recent[iInd] = sPath Then +' Recent.Remove(iInd) +' RecentDate.Remove(iInd) +' Else +' Inc iind +' Endif +' +' Wend +' +' Recent.Add(sPath, 0) +' RecentDate.Add(CStr(Date(Now)), 0) +' +' 'nMax = Settings["/Recent/Max", DEFAULT_MAX_RECENT] +' While Recent.Count > DEFAULT_MAX_RECENT +' Recent.Remove(Recent.Max) +' RecentDate.Remove(RecentDate.Max) +' Wend +' +' SaveRecent +' +' End + +' Private Sub SaveRecent() +' +' Dim iInd As Integer +' +' Settings.Clear("/Recent") +' +' Settings["/Recent/Count"] = Recent.Count +' +' For iInd = 0 To Recent.Count - 1 +' Settings["/Recent/File[" & CStr(iInd + 1) & "]"] = Recent[iInd] +' Settings["/Recent/Date[" & CStr(iInd + 1) & "]"] = CStr(RecentDate[iInd]) +' Next +' +' Settings.Save +' +' End + +' Public Sub ClearRecent() +' +' Recent.Clear +' RecentDate.Clear +' SaveRecent +' +' End + +Public Function CheckProjectName(sName As String, Optional sDir As String) As String + + Dim iInd As Integer + Dim sCar As String + + sName = Trim(sName) + + If Not sName Then + Return ("Please type a project name.") + Endif + + For iInd = 1 To Len(sName) + + sCar = Mid$(sName, iInd, 1) + + If iInd = 1 Then + If sCar = "." Then Return ("The project name cannot begin with a dot.") + Endif + + If Asc(sCar) > 127 Then Return ("Non-ASCII characters are forbidden in a project name.") + If InStr(" ?*/<>(){}\\", sCar) Then Return ("The following characters are forbidden in a project name:") & "\n\n? * / \\ " & ("SPACE") & " ( ) < > { }" + + Next + + If sDir Then + sDir &/= sName + If Exist(sDir &/ PROJECT_FILE) Then + Return ("This project already exists.") + Else If Exist(sDir) Then + If IsDir(sDir) Then + Return Subst(("The project directory already exists."), sDir) + Else + Return Subst(("The project directory cannot be created because a file with the same name already exists."), sDir) + Endif + Endif + Endif + +End + +Public Sub MakeSourcePackageFromTo(sFrom As String, sPath As String) + + Dim sCmd As String + Dim sOpt As String + Dim sIgnore As String + Dim sTemp As String + + Inc Application.Busy + + If Right$(sPath, 3) = ".gz" Then + sOpt = "z" + Else If Right$(sPath, 4) = ".bz2" Then + sOpt = "j" + Else If Right$(sPath, 3) = ".xz" Then + sOpt = "J" + Endif + + sTemp = File.SetExt(Temp$(), File.Ext(sPath)) + + sCmd = "cd " & Shell$(File.Dir(sFrom)) & ";" + sCmd &= " tar cfvh" & sOpt & " " & Shell$(sTemp) + For Each sIgnore In [ + File.Name(GetExecPath()), ".gambas/*", ".settings", ".info", ".list", "*~", "core", "core.*", "vgcore*.*", ".lock", ".lang/*.pot", ".lang/.ot", ".xvpics", ".bzr", ".bzrignore", ".hg", ".hgignore", ".hgtags", "hgrc", ".git", ".gitignore", ".svn", "CVS", "CVSROOT" + ] + sCmd &= " --exclude=" & Shell$(sIgnore) + Next + sCmd &= " " & Shell$(File.Name(sFrom)) & " > /dev/null" + + Shell sCmd Wait + + If Not Exist(sTemp) Then Error.Raise(Subst$(("The '&1' command has failed."), "tar")) + + Try Kill sPath + Copy sTemp To sPath + Try Kill sTemp + + Dec Application.Busy + +Catch + + Dec Application.Busy + Message.Error(("Unable to create source archive.") & "\n\n" & Error.Text) + +End + +Public Sub MakeSourcePackageTo(sPath As String) + + Save + WriteProject(True) + MakeSourcePackageFromTo(Project.Dir, sPath) + +End + +Public Sub GetDefaultArchiveBaseName() As String + + Return Name & "-" & FormatVersion(True) + +End + +Public Sub MakePackage() + + Dim sDir As String = SourcePath + + If Not sDir Then sDir = System.User.Home + + Dialog.Path = sDir &/ GetDefaultArchiveBaseName() & ".tar.gz" + Dialog.Title = ("Create source package") + Dialog.Filter = ["*.tar.gz", ("Source packages"), "*.tar.bz2", ("Source packages"), "*.tar.xz", ("Source packages")] + Dialog.AutoExt = True + + If Dialog.SaveFile() Then Return + + If File.Dir(Dialog.Path) <> System.User.Home Then + SourcePath = File.Dir(Dialog.Path) + Project.WriteProject + Endif + + MakeSourcePackageTo(Dialog.Path) + +End + +Public Sub RefreshForm() + + Dim hFile As Object + + For Each hFile In Project.Files + + If Object.Type(hFile) = "FForm" Then + hFile.Refresh + Endif + + Next + +End + +Public Sub RefreshEditor() + + Dim hFile As Object + + For Each hFile In Project.Files + + If Project.IsEditor(hFile) Then + hFile.Refresh + Endif + + Next + +End + +Public Sub RefreshComponents(Optional bForce As Boolean) + + Dim sLib As String + Dim aLib As New String[] + Dim hComp As CComponent + Dim bChange As Boolean + + ' Sort components + + ' For Each hComp In Documentation.Components + ' If Components.Find(hComp.Key) >= 0 Then + ' aLib.Add(hComp.Key) + ' Endif + ' Next + ' Components = aLib.Copy() + aLib = Components.Copy() + + For Each sLib In ExtraReferences + aLib.Add(sLib) + Next + + For Each sLib In Libraries + aLib.Add(File.Name(sLib)) + Next + + bChange = aLib.Join() <> $aOldRefreshComponents.Join() + + If bForce Or bChange Then + + Documentation.Reset + + For Each sLib In Components + hComp = Documentation[sLib] + If hComp Then hComp.Load() + Next + + For Each sLib In ExtraReferences + Documentation.AddLibrary(sLib) + Next + + For Each sLib In Libraries + Documentation.AddLibrary(sLib) + Next + + If Not $bTesting Then + Documentation.LoadProjectComponent + FToolBox.RefreshToolbar(bForce) + FCompletion.OnRefreshComponents + FMain.OnRefreshComponents + FProperty.RefreshAll + Tree.RefreshInfo + Endif + + If Components.Exist("gb.db") And If Not Exist(Project.Dir &/ ".connection") Then InsertDirectory(Project.Dir &/ ".connection") + If Components.Exist("gb.web") And If Not Exist(Project.Dir &/ ".public") Then InsertDirectory(Project.Dir &/ ".public") + + If bChange Then ReloadAll(True) + + $aOldRefreshComponents = aLib + + 'HasTest = Components.Exist("gb.test") + + Endif + +End + +Public Function IsSourceDir(sDir As String) As Boolean + + Return sDir Begins SourceDir + +End + +Public Function IsSourcePath(sPath As String, Optional bAllowDir As Boolean) As Boolean + + Dim sExt As String + + If IsDir(sPath) And If Not bAllowDir Then Return + + If SourceDir <> {Dir} Then Return sPath & "/" Begins SourceDir &/ "/" + + If Left(sPath) = "/" Then + If File.Dir(sPath) <> SourceDir Then Return + Endif + + sExt = File.Ext(sPath) + If CModule.Ext.Exist(sExt) Then Return True + +End + +Public Function IsFormExt(sPath As String) As Boolean + + If File.Ext(sPath) = "class" Then Return + Return Exist(File.SetExt(sPath, "class")) + +End + +Public Function IsFormPath(sPath As String) As Boolean + + If Not IsSourcePath(sPath) Then Return + Return IsFormExt(sPath) + +End + +Public Function IsModuleExt(sPath As String) As Boolean + + Dim sExt As String = File.Ext(sPath) + If sExt = "module" Or If sExt = "test" Then Return True + +End + +Public Function IsCodeExt(sPath As String) As Boolean + + Dim sExt As String = File.Ext(sPath) + Return CModule.CodeExt.Exist(sExt) + +End + +Public Sub IsProjectPath(sPath As String) As Boolean + + Return sPath Begins Project.Dir &/ "/" + +End + +Public Function IsImagePath(sPath As String) As Boolean + + Return IMAGE_EXT.Exist(File.Ext(sPath)) + +End + +Public Sub IsConnectionPath(sPath As String) As Boolean + + Return sPath Begins Project.Dir &/ ".connection" &/ "/" + +End + +Public Sub IsHiddenPath(sPath As String) As Boolean + + Return sPath Begins Project.Dir &/ ".hidden" &/ "/" + +End + +Public Function StripPath(sPath As String) As String + + Dim sDir As String + + sDir = Project.Dir + If Right$(sDir) <> "/" Then sDir = sDir & "/" + + If Left$(sPath, Len(sDir)) = sDir Then + Return Mid$(sPath, Len(sDir) + 1) + Else + Return sPath + Endif + +End + +Public Sub RunTool(sTool As String) + + Dim aExec As New String[] + + aExec.Add(System.Path &/ "bin" &/ sTool & ".gambas") + aExec.Add(Project.Dir) + + Exec aExec + +End + +Public Sub DefineStartup(sPath As String, Optional bDoNotWrite As Boolean) + + Dim sKey As String + + sKey = ProjectTree.Key + + sPath = File.BaseName(sPath) + If Not Project.Exist(sPath) Then sPath = "" + + Tree.DefineStartup(sPath) + Startup = sPath + + If Not bDoNotWrite Then + WriteProject(True) + Compile + Endif + + Tree.SelectKey(sKey) + +'Catch + +End + +Public Sub GetUniqueName(sDir As String, sName As String, Optional sSuffix As String = "&1") As String + + Dim iInd As Integer + Dim sDest As String + Dim sExt As String + + sDest = sDir &/ sName + + While Exist(sDest) + Inc iInd + sExt = File.Ext(sName) + If sExt Then + sDest = sDir &/ File.BaseName(sName) & Subst(sSuffix, CStr(iInd)) & "." & sExt + Else + sDest = sDir &/ sName & Subst(sSuffix, CStr(iInd)) + Endif + Wend + + Return File.Name(sDest) + +End + +Public Sub GetUniqueSourceName(sName As String) As String + + Dim iInd As Integer + Dim sNewName As String + Dim sExt As String + + sNewName = sName + + While Tree.Sources.Exist(sNewName) + Inc iInd + sExt = File.Ext(sName) + sNewName = File.BaseName(sName) & CStr(iInd) & "." & File.Ext(sName) + Wend + + Return sNewName + +End + +Public Sub CopyFile(sSrc As String, sDst As String) + + Dim sDest As String + + sDest = File.Dir(sDst) &/ GetUniqueName(File.Dir(sDst), File.Name(sDst), " (&1)") + Copy sSrc To sDest + + VersionControl.AddFile(sDest) + + Tree.RefreshKey(sDest) + Tree.SelectKey(sDest) + +Catch + + Message.Error(Subst(("Cannot copy file &1."), sSrc) & "\n\n" & Error.Text) + +End + +Public Sub LinkFile(sSrc As String, sDst As String) + + Dim sDest As String + Dim aDst As String[] + Dim aSrc As String[] + Dim bDir As Boolean + + bDir = IsDir(sSrc) + + 'If IsDir(sSrc) Then + ' Message.Warning(("Linking a directory is forbidden.")) + ' Return + 'Endif + + sDest = File.Dir(sDst) &/ GetUniqueName(File.Dir(sDst), File.Name(sDst), " (&1)") + If sSrc Begins Project.Dir &/ "/" Then + + aDst = Split(File.Dir(Mid$(sDest, Len(Project.Dir) + 2)), "/") + + sSrc = Mid$(sSrc, Len(Project.Dir) + 2) + aSrc = Split(File.Dir(sSrc), "/") + + While aDst.Count > 0 And aSrc.Count > 0 + If aSrc[0] <> aDst[0] Then Break + aDst.Remove(0) + aSrc.Remove(0) + Wend + + sSrc = String(aDst.Count, "../") & aSrc.Join("/") &/ File.Name(sSrc) + + Endif + + If bDir Then RefreshSources + + Link sSrc To sDest ' swapped + VersionControl.AddFile(sDest) + + If bDir Then RefreshSources + + Tree.RefreshKey(sDest) + Tree.SelectKey(sDest) + +Catch + + FMain.ShowError(Subst(("Cannot create link &1."), sSrc) & "\n\n" & Error.Text, sSrc) + +End + +Public Sub MoveFile(sSrc As String, sDst As String, Optional bOther As Boolean) + + Dim hForm As Object + Dim sLink As String + Dim sDir As String + Dim bIsDir As Boolean + + If sSrc = sDst Then Return + + If Exist(sDst) Then Error.Raise(("Destination already exists.")) + + If Len(sDst) > Len(sSrc) And If Left(sDst, Len(sSrc)) = sSrc Then Error.Raise(("Cannot move a directory inside itself.")) + + bIsDir = IsDir(sSrc) + + If bOther And If Not bIsDir Then + + sDir = File.Dir(sSrc) + For Each sSrc In Dir(sDir, File.BaseName(sSrc) & ".*") + MoveFile(sDir &/ sSrc, File.Dir(sDst) &/ sSrc) + Next + Return + + Endif + + With Stat(sSrc) + If .Type = gb.Link Then + sLink = GetAbsoluteLink(sSrc, .Link) + ' If Left(sLink) <> "/" Then + ' sDir = File.Dir(sSrc) + ' While Left(sLink, 3) = "../" + ' sLink = Mid(sLink, 4) + ' sDir = File.Dir(sDir) + ' Wend + ' sLink = sDir &/ sLink + ' Endif + DeleteFile(sSrc) + LinkFile(sLink, sDst) + RenamePaths(sSrc, sDst) + Return + Endif + End With + + If bIsDir Then + 'Move sSrc To sDst + If VersionControl.Enabled Then + VersionControl.MoveDir(sSrc, sDst) + Else + Move sSrc To sDst + Endif + 'If Exist(sSrc) Then LockedPaths[sSrc] = True + Else + If VersionControl.NeedMove() Then Copy sSrc To sDst + If Right(sSrc) <> "~" Then VersionControl.MoveFile(sSrc, sDst) + Try Kill sSrc + Endif + + hForm = Files[sSrc] + If hForm Then + hForm.Rename(File.BaseName(sDst), sDst) + Files[sSrc] = Null + Files[sDst] = hForm + Endif + + RenamePaths(sSrc, sDst) + + If bIsDir Then + Refresh() + Else + Tree.RefreshKey(sDst, sSrc) + Tree.SelectKey(sDst) + Endif + +Catch + + FMain.ShowError(Subst(("Cannot move file &1."), File.Name(sSrc)) & "\n\n" & Error.Text & "\n" & Error.Backtrace.Join(" "), sSrc) + +End + +' PUBLIC SUB RefreshToolbox() +' +' FToolBox.ClearToolbar +' +' END + +Public Function GetNewName(sPrefix As String, Optional sDir As String) As String + + Dim iInd As Integer + Dim sName As String + Dim aFile As String[] + Dim iFile As Integer + + Do + Inc iInd + sName = sPrefix & iInd + If sDir Then + If Not Exist(sDir) Then Return sName + aFile = Dir(sDir, sName & ".*") + iFile = 0 + While iFile < aFile.Count + If Right(aFile[iFile]) = "~" Then + aFile.Remove(iFile) + Else + Inc iFile + Endif + Wend + If aFile.Count = 0 And If Not Exist(sDir &/ sName) Then Return sName + Else + If Not Project.Exist(sName) Then Return sName + Endif + Loop + +End + +Public Sub ResetScan() + + Dim hFile As Object + + For Each hFile In Files + Try hFile.Scan = Null + Next + +End + +Public Function HasModule(sType As String) As Boolean + + 'If sType = "class" Or If sType = "module" Then Return True + Return CModule[sType].Used + +End + +Public Sub MakeInstall() + + 'Dim iRelease As Integer = Project.ReleaseVersion + + If MakeExecutable(True, True) Then Return + If FMakeInstall.ShowModal() Then Return + + 'Project.ReleaseVersion = iRelease + 'Project.WriteProject + +End + +Public Function StretchIcon(sPath As String, Optional iSize As Integer = 48) As Image + + Dim hImage As Image + Dim hBackground As Image + Dim W, H As Integer + + hImage = Image.Load(sPath) + If hImage.Width > hImage.Height Then + W = iSize + H = iSize * hImage.H / hImage.W + 'hImage = hImage.Stretch(iSize, iSize * hImage.H / hImage.W) + Else + W = iSize * hImage.W / hImage.H + H = iSize + 'hImage = hImage.Stretch(iSize * hImage.W / hImage.H, iSize) + Endif + + If W < iSize Or H < iSize Then + hBackground = New Image(iSize, iSize) + hBackground.Fill(Color.Transparent) + hBackground.PaintImage(hImage, (iSize - W) / 2, (iSize - H) / 2, W, H) + hImage = hBackground + Else + hImage = hImage.Stretch(W, H) + Endif + + Return hImage + +Catch + + Return Image.Load("img/logo/project.png").Stretch(iSize, iSize) + +End + +Public Function GetIcon(sPath As String, Optional iSize As Integer) As Picture + + Dim hFile As File + Dim sLig As String + Dim sIcon As String + + hFile = Open sPath &/ ".project" + + For Each sLig In hFile.Lines + If Left$(sLig, 5) = "Icon=" Then + sIcon = Mid$(sLig, 6) + Break + Endif + Next + + Close #hFile + + If sIcon Then + sPath = sPath &/ sIcon + Else + sPath = "img/logo/project.png" + Endif + + If iSize Then + Return StretchIcon(sPath, iSize).Picture + Else + Return Picture.Load(sPath) + Endif + +Catch + + sPath = "img/logo/project.png" + + If iSize Then + Return StretchIcon(sPath, iSize).Picture + Else + Return Picture.Load(sPath) + Endif + +End + +Private Sub CreateGitIgnore() + + Dim sPath As String = Project.Dir &/ ".gitignore" + Dim sData As String + Dim iPos As Integer + Dim iPos2 As Integer + + If Not Exist(sPath) Then + Try Copy "gitignore" To sPath + Return + Endif + + sData = File.Load(sPath) + iPos = InStr(sData, "#---- Gambas files to ignore (v5)") + If iPos Then Return + + iPos = InStr(sData, "#---- Gambas files to ignore") + If iPos Then + iPos2 = InStr(sData, "#----", iPos + 5) + If iPos2 Then + iPos2 = InStr(sData, "\n", iPos2) + If iPos2 = 0 Then iPos2 = Len(sData) + 1 + sData = Left(sData, iPos - 1) & Mid$(sData, iPos2) + Endif + Endif + + sData = RTrim(sData) + If sData Then sData &= "\n" + + File.Save(sPath, RTrim(File.Load("gitignore")) & "\n" & sData) + +End + +Public Sub CleanUp(Optional sDir As String = Project.Dir, bCommandLine As Boolean) As Boolean + + Dim sFile As String + Dim aPattern As String[] = ["*.gambas", ".lock", "*~", "core", "core.*", "vgcore", "vgcore.*", ".kdbg*", ".*.prof", "cachegrind.out.*", "callgrind.out.*"] + Dim sName As String + Dim sPattern As String + Dim aFail As New String[] + + If Not bCommandLine Then Inc Application.Busy + + For Each sFile In RDir(sDir) + + If IsDir(sDir &/ sFile) Then Continue + + sName = File.Name(sFile) + For Each sPattern In aPattern + If sName Like sPattern Then Goto DELETE_FILE + Next + + If sFile Begins ".gambas/" Then Goto DELETE_FILE + If sFile Begins ".lang/" And If sName Like "*.pot" Then Goto DELETE_FILE + + Continue + +DELETE_FILE: + + Try Kill sDir &/ sFile + If Error Then aFail.Add(sFile) + + Next + + If sDir = Project.Dir Then Project.Refresh + + If Not bCommandLine Then Dec Application.Busy + + If aFail.Count Then + If bCommandLine Then + Error ("The following files couldn't be removed:") + Error aFail.Join("\n") + Return True + Else + Message.Error(("The following files couldn't be removed:") & "

      " & aFail.Join("
      ") & "
      ") + Endif + Endif + +End + +Public Function CheckProgram(sProg As String) As Boolean + + Dim iPos As Integer + + iPos = InStr(sProg, " ") + If iPos Then sProg = Left(sProg, iPos - 1) + Return Not System.Exist(sProg) + +End + +'' Open a URL inside an external browser. +'' - ~sLink~ is the URL to open. + +Public Sub OpenWebPage(sLink As String, Optional bNewInstance As Boolean) As Process + + Dim sExec As String + Dim aTest As String[] + Dim bCheck As Boolean + Dim hProcess As Process + 'Dim sNewInstance As String + + If Not Browser Then + + Select Case Settings["/Browser"] + + Case "konqueror" + aTest = ["konqueror"] + + Case "epiphany" + aTest = ["epiphany"] + + Case "firefox" + aTest = ["firefox", "mozilla-firefox"] + + Case "iceweasel" + aTest = ["iceweasel"] + + Case "seamonkey" + aTest = ["seamonkey"] + + Case "chromium" + aTest = ["chromium", "chromium-browser", "google-chrome-stable"] + + Case Else + + aTest = New String[] + If Env["BROWSER"] Then aTest.Add(Env["BROWSER"]) + + If Env["KDE_FULL_SESSION"] Then + aTest.Add("konqueror") + Else If Env["GNOME_DESKTOP_SESSION_ID"] Then + aTest.Add("epiphany") + aTest.Add("firefox") + aTest.Add("iceweasel") + Endif + + End Select + + aTest.Insert(["mozilla-firefox", "firefox", "mozilla", "iceweasel", "konqueror", "seamonkey", "chromium-browser", "opera"]) + + For Each sExec In aTest + If Not sExec Then Continue + bCheck = Not CheckProgram(sExec) + If bCheck Then Break + Next + + If Not bCheck Then Return + + Browser = sExec + + Endif + + If Left(sLink) = "/" Then + sLink = "file://" & Replace(sLink, "?", "%3F") + Endif + + ' If Browser = "firefox" Or If Browser = "iceweasel" Then + ' hProcess = Shell "firefox -remote \"openURL(" & sLink & ",new-window)\"" Wait + ' If hFirefox.Value Then + ' Shell Browser & " " & Chr$(34) & sLink & Chr$(34) + ' End If + ' Else + sExec = Browser + + If bNewInstance Then + + ' Select Case Browser + ' + ' Case "firefox", "iceweasel", "mozilla-firefox" + ' sExec &= " --new-instance" + ' + ' End Select + + Endif + + hProcess = Shell sExec & " " & Shell(sLink) + Return hProcess + 'End If + +Catch + + Message.Error(Error.Text) + +End + +Public Sub OpenImage(sLink As String, sEditor As String) As Boolean + + Dim sExec As String + Dim aTest As String[] + Dim bCheck As Boolean + Dim hProcess As Process + + Select Case LCase(sEditor) + + Case "kolourpaint" + aTest = ["kolourpaint"] + + Case "krita" + aTest = ["krita"] + + Case "gimp" + aTest = ["gimp-remote", "gimp"] + + Case "kiconedit" + aTest = ["kiconedit"] + + Case Else + Return True + + ' IF Application.Env["KDE_FULL_SESSION"] THEN + ' aTest = ["kolourpaint", "gimp"] + ' ELSE IF Application.Env["GNOME_SESSION_ID"] THEN + ' aTest = ["gimp-remote"] + ' ENDIF + + End Select + + For Each sExec In aTest + bCheck = Not CheckProgram(sExec) + If bCheck Then Break + Next + + If Not bCheck Then Return + + hProcess = Shell sExec & " " & Shell(sLink) As "Process" + hProcess.Tag = sLink + +Catch + + Message.Error(Error.Text) + +End + +Public Sub HasTranslation(sLang As String) As Boolean + + Return Exist(Project.Dir &/ ".lang" &/ sLang & ".po") + +End + +Public Sub GetTranslations() As String[] + + Dim sFile As String + Dim aLang As String[] + Dim sDir As String + + aLang = New String[] + sDir = Project.Dir &/ ".lang" + If IsDir(sDir) Then + For Each sFile In Dir(sDir, "*.po") + aLang.Add(File.BaseName(sFile)) + Next + aLang.Sort + Endif + + Return aLang + +End + + +Public Sub MakeDirectoryIcon(Optional sDir As String) + + Dim sIcon As String + Dim hDirIcon As Image + Dim hIcon As Image + Dim bExist As Boolean + Dim sPath As String + + If Not sDir Then sDir = Project.Dir + + If Project.Icon Then + sIcon = sDir &/ Project.Icon + Else + sIcon = "img/logo/project.png" + Endif + + hDirIcon = Image.Load("img/logo/folder.png") + + Try hIcon = StretchIcon(sIcon, 128) + If hIcon Then hDirIcon.PaintImage(hIcon, 64, 88) + + Try Kill sDir &/ ".icon.png" + hDirIcon.Save(sDir &/ ".icon.png") + + sPath = sDir &/ ".directory" + bExist = Exist(sPath) + File.Save(sPath, "[Desktop Entry]\nIcon=./.icon.png\n") + If Not bExist Then VersionControl.AddFile(sPath) + +Catch + + Error "gambas3: warning: unable to create project directory icon" + +End + +Public Sub RefreshBreakpointPicture() + + ' Dim iSize As Integer + ' Dim hImage As Image + ' + ' iSize = Font[Settings["/Editor/Font"]].Height + ' + ' 'hImage = Picture["icon:/small/halt"].Image + ' hImage = Picture["img/16/breakpoint.png"].Image + ' 'hImage.Opacity(0.75) + ' If iSize < Stock.GetSize("small") Then hImage = hImage.Stretch(iSize, iSize) + ' Try Editor.BreakpointPicture = hImage.Picture + ' + ' hImage = Picture["icon:/small/apply"].Image + ' 'hImage.Opacity(0.75) + ' If iSize < Stock.GetSize("small") Then hImage = hImage.Stretch(iSize, iSize) + ' Try Editor.BookmarkPicture = hImage.Picture + ' +End + +Public Sub DrawTitle(hForm As Object, Optional bNoReadOnly As Boolean) + + Dim sPath As String + Dim sTitle As String + + sPath = hForm.Path + 'If IsSourcePath(sPath) Or If IsConnectionPath(sPath) Then + ' sTitle = File.BaseName(sPath) + 'Else + Try sTitle = hForm.GetTitle() + If Not sTitle Then sTitle = File.Name(sPath) + 'Endif + + If hForm.IsModified() Then sTitle &= " (*)" & Left(("modified"), 0) + If Not bNoReadOnly Then + If IsReadOnly(hForm.Path) Then sTitle &= " [" & ("read-only") & "]" + Endif + + If Not IsProjectPath(sPath) Then + Try hForm.RichText = "" & Html(sTitle) & "" + Endif + + If hForm.Title <> sTitle Then + hForm.Title = sTitle + If ShowFileInTitle And If hForm = ActiveForm Then UpdateTitle + Endif + +End + +Public Sub IsExported(sPath As String) As Boolean + + Dim hFile As File + Dim sLine As String + + If Not IsModuleExt(sPath) Then sPath = File.SetExt(sPath, "class") + If Not Exist(sPath) Then Return + + Try hFile = Open sPath + If Error Then Return + + For Each sLine In hFile.Lines + sLine = Highlight.Purge(Trim(sLine)) + If Not sLine Then Continue + If Left(sLine) = "'" Then Continue + If sLine Like "INHERITS *" Then Continue + If sLine Like "CREATE" Then Continue + If sLine Like "CREATE *" Then Continue + If sLine Like "EXPORT" Then Return True + If sLine Like "EXPORT OPTIONAL" Then Return True + Break + Next + +End + +Public Sub IsLocked(sPath As String) As Boolean + + Return HasFlag(sPath, FLAG_LOCKED, True) + +End + +Public Sub IsAdded(sPath As String, Optional bNoRec As Boolean) As Boolean + + Return HasFlag(sPath, FLAG_ADDED, Not bNoRec) + +End + +Public Sub IsConflict(sPath As String) As Boolean + + Return HasFlag(sPath, FLAG_CONFLICT) + +End + +Public Sub GetCount(sType As String) As Integer + + Dim sPath As String + Dim iCount As Integer + + For Each sPath In Tree.Sources + If File.Ext(sPath) = sType Then Inc iCount + If sType = "class" And If Dir(File.Dir(sPath), File.BaseName(sPath) &/ ".*").Count >= 2 Then Dec iCount + Next + + Return iCount + +End + +Public Sub GetLinesOfCode(ByRef nFunc As Integer) As Integer + + Dim sPath As String + Dim iCount As Integer + Dim aLine As String[] + Dim iPos As Integer + Dim iComment As Integer + Dim sCar As String + + nFunc = 0 + For Each sPath In Tree.Sources + + aLine = Split(File.Load(sPath), "\n", "", True) + + iComment = 0 + + For iPos = 0 To aLine.Max + sCar = Left(LTrim(aLine[iPos])) + If sCar = "'" Or If sCar = "#" Then Inc iComment + Next + + iCount += aLine.Count - iComment + + If IsCodeExt(sPath) Then + For iPos = 0 To aLine.Max + Highlight.Analyze(aLine[iPos]) + If FEditor.IsCurrentProc() Then Inc nFunc + Next + Endif + + Next + + Return iCount + +End + +Public Sub GetFileSize(iSize As Long) As String + + If iSize < 1000 Then + Return Subst("&1 B", CStr(iSize)) + Else If iSize < 1000000 Then + Return Subst("&1 KiB", Format(iSize / 1000, "#.#")) + Else If iSize < 1000000000 Then + Return Subst("&1 MiB", Format(iSize / 1000000, "#.#")) + Else + Return Subst("&1 GiB", Format(iSize / 1000000000, "#.#")) + Endif + +End + +Public Sub SetCurrentPopup(hMenu As Menu) + + If hMenu = $hCurrentPopup Then + If Not hMenu Or If hMenu.Enabled Then Return + Endif + + 'Debug hMenu.Name + + Try $hCurrentPopup.Enabled = False + $hCurrentPopup = hMenu + Try $hCurrentPopup.Enabled = True + 'Debug $hCurrentPopup.Name;; $hCurrentPopup.Window.Title + +End + +Public Sub IsReadOnly(sPath As String) As Boolean + + If Not Exist(sPath) Then Return True + If Not Access(sPath, gb.Write) Then Return True + + If IsFake() Then Return ' Allow a file located in a linked directory to be modified only in "fake" mode, i.e. when opened alone. + + Do + If sPath = Project.Dir Or If sPath = "/" Or If Not sPath Then Break + If Stat(sPath).Type = gb.Link Then + Return True + Endif + sPath = File.Dir(sPath) + Loop + +End + +Public Sub UpdateLockedAction(hForm As Object) + + If ReadOnly Or If Running Then + Action[".locked", hForm].Visible = False + Else + Action[".locked", hForm].Visible = True + Action[".locked", hForm].Value = IsReadOnly(hForm.Path) + Endif + +End + + +Public Sub SetReadOnly(sPath As String, bReadOnly As Boolean) + + Dim sClass As String + Dim hForm As Object + + GoSub SET_READONLY + + If IsSourcePath(sPath) Then + sClass = File.BaseName(sPath) + sPath = FindPath(sClass) + GoSub SET_READONLY + sPath = FindForm(sClass) + If sPath Then GoSub SET_READONLY + Endif + + Return + +SET_READONLY: + + If Stat(sPath).Type = gb.File Then + + If bReadOnly Then + Try Chmod sPath To "r-.r-.r-.." + Else + Try Chmod sPath To "rw.rw.r..." + Endif + + Endif + + hForm = Files[sPath] + If hForm Then Try hForm.SetReadOnly + + Return + +End + + +Public Sub StoreCombo(hCombo As ComboBox) + + Dim sText As String = hCombo.Text + Dim iInd As Integer + + If Not sText Then Return + + iInd = hCombo.Find(sText) + If iInd >= 0 Then hCombo.Remove(iInd) + hCombo.Add(sText) + hCombo.Text = sText + +End + +Private Sub ConvertProject() As Boolean + + Dim sPath As String + Dim iStep As Integer + + FConvert.Start(("Project cleanup...")) + + Inc $iNoRefresh + Project.CleanUp + Dec $iNoRefresh + + FConvert.SetMessage(("Project files conversion...")) + + For Each sPath In Tree.Sources + + If File.Ext(sPath) <> "form" Then Continue + If Stat(sPath).Type = gb.Link Then Continue + + MConvert.ConvertFile(sPath) + Inc iStep + FConvert.SetProgress(iStep / Tree.Sources.Count) + + Next + + For Each sPath In Tree.Sources + + If File.Ext(sPath) = "form" Then Continue + If Stat(sPath).Type = gb.Link Then Continue + + MConvert.ConvertFile(sPath) + Inc iStep + FConvert.SetProgress(iStep / Tree.Sources.Count) + + Next + + FConvert.Stop + +Catch + + FConvert.StopAll + Application.Busy = 0 + Message.Error("" & Subst(("Unable to convert &1"), File.Name(sPath)) & "

      " & Error.Text & "
      " & Error.Where) + Return True + +End + +Public Sub GetSmallFont() As Font + + Dim hFont As Font = Font[Settings["/Font"]] + + Try hFont.Size *= GetPercentFontSize("/TitleFontSize", 80) + Return hFont + +End + +Public Sub SetSmallFont(hCtrl As Control) + + hCtrl.Font = GetSmallFont() + +End + +Public Sub GetPercentFontSize(sSettings As String, iDefault As Integer) As Float + + Dim iVal As Integer + + Try iVal = Settings[sSettings, iDefault] + If iVal < 10 Then iVal = iDefault + Return iVal / 100 + +End + +Public Sub SetNormalFont(hCtrl As Control, Optional fSize As Float) + + Dim hFont As Font = Font[Settings["/Font"]] + + If fSize = 0 Then fSize = GetPercentFontSize("/ProjectFontSize", 100) + Try hFont.Size *= fSize + hCtrl.Font = hFont + ' If hFont.ToString() = Application.Font.ToString() Then + ' hCtrl.Font = Null + ' Else + ' hCtrl.Font = hFont + ' Endif + +End + +Public Sub GetEditorFont() As Font + + Return Font[Settings["/Editor/Font", DEFAULT_FONT]] + +End + +Public Sub SetEditorFont(hCtrl As Control) + + hCtrl.Font = GetEditorFont() + +End + +Public Sub SetConsoleFont(hCtrl As Control) + + hCtrl.Font = Font[Settings["/ConsoleFont", DEFAULT_FONT]] + +End + + +Public Sub UpdateLibraries(aLib As String[]) As Boolean + + Dim sPath As String + Dim hLib As CLibraryInfo + Dim aAdd As String[] + Dim bChange As Boolean + + Do + + aAdd = New String[] + + For Each sPath In aLib + hLib = CLibraryInfo[sPath] + If hLib.NotFound Then Continue + For Each sPath In hLib.Libraries + If Not aLib.Exist(sPath) And If Not aAdd.Exist(sPath) Then aAdd.Add(sPath) + Next + Next + + If aAdd.Count = 0 Then Break + + aLib.Insert(aAdd) + bChange = True + + Loop + + Return bChange + +End + +' Private Function Sources_Read() As Collection +' +' Return $cSourceDir +' +' End +' +Public Sub SendMail() + + Dim sTemp As String = Temp$() + + sTemp = File.SetName(sTemp, GetDefaultArchiveBaseName()) & ".tar.gz" + Try Kill sTemp + MakeSourcePackageTo(sTemp) + Desktop.SendMail(Null,,, If(Project.Title, Project.Title, Project.Name),, sTemp) + +End + +Public Sub GetBackgroundColor() As Integer + + Return FColorChooser.FromString(Settings["/Background/Color", "#404040"]) + +End + +Public Sub GetBackgroundBgColor() As Integer + + Dim hColor As ColorInfo + hColor = Color[Color.Merge(Color.Background, Color.Foreground)] + If Application.DarkTheme Then + hColor.Luminance = 255 - GetBackgroundBrightness() + Else + hColor.Luminance = GetBackgroundBrightness() + Endif + Return hColor.Color + +End + +Public Sub GetBackground() As Image + + Dim sBackground As String + Dim iColor As Integer + + If Not $bBackgroundValid Then + $hBackground = Null + sBackground = Settings["/Background/Image", DEFAULT_BACKGROUND] + Try $hBackground = Image.Load("img/background" &/ sBackground & ".png") + If Not $hBackground Then $hBackground = New Image(32, 32, Color.RGB(128, 128, 128, 128)) + If Application.DarkTheme Then $hBackground = $hBackground.Invert(True) + iColor = GetBackgroundColor() + $hBackground.Colorize(iColor) + $bBackgroundValid = True + Endif + + Return $hBackground + +End + +Public Sub DrawBackground() + + Dim hBrush As PaintBrush + + GetBackground() + If $hBackground Then + hBrush = Paint.Brush + Paint.FillRect(0, 0, Paint.W, Paint.H, GetBackgroundBgColor()) + Paint.Brush = Paint.Image($hBackground) + Paint.Rectangle(0, 0, Paint.W, Paint.H) + Paint.Fill + Paint.Brush = hBrush + Endif + +End + +Private Sub ChangeBackground(bInvalidate As Boolean) + + If bInvalidate Then + $bBackgroundValid = False + GetBackground() + Endif + Try ActiveForm.OnBackgroundChange + FMain.OnBackgroundChange + +End + +Public Sub SetBackground(sBackground As String) + + If sBackground = DEFAULT_BACKGROUND Then sBackground = "" + Settings["/Background/Image"] = sBackground + ChangeBackground(True) + +End + +Public Sub SetBackgroundColor(sColor As String) + + Settings["/Background/Color"] = sColor + ChangeBackground(True) + +End + +Public Sub GetBackgroundBrightness() As Integer + + Return Settings["/Background/Brightness", 160] + +End + + +Public Sub SetBackgroundBrightness(iBrightness As Integer) + + Settings["/Background/Brightness"] = iBrightness + ChangeBackground(False) + +End + +' Try to save all files if there is an unexpected error + +Public Sub Application_Error() + + Try Save + +End + +Public Sub CanUseHttpServer() As Boolean + + If Components Then Return Components.Exist("gb.web") + +End + +Public Sub InsideDirectory(sPath As String, sDir As String) As Boolean + + If sPath = sDir Then Return True + If Right(sDir) <> "/" Then sDir &= "/" + If sPath Begins sDir Then Return True + +End + + +Public Sub UpdateAllForms(Optional sOldClass As String, sNewClass As String) + + Dim sPath As String + Dim hObject As Object + Dim hForm As Object + + Inc Application.Busy + + For Each sPath In Tree.Sources + + If Not IsFormPath(sPath) Then Continue + If Stat(sPath).Type = gb.Link Then Continue + + hObject = LoadFile(sPath) + If Not hObject Is FForm Then Continue + hForm = hObject + + If sOldClass Then + hForm.RenameClass(sOldClass, sNewClass) + Else + hForm.Modify() + hForm.Save() + Endif + + Next + + Dec Application.Busy + + If sOldClass Then + + Compile(True) + + Inc Application.Busy + + For Each sPath In Tree.Sources + + If Not IsFormPath(sPath) Then Continue + If Stat(sPath).Type = gb.Link Then Continue + + hForm = LoadFile(sPath) + hForm.Reload() + + Next + + Dec Application.Busy + + Endif + +Catch + + Application.Busy = 0 + Message.Error(("Unable to update forms.") & "

      " & Error.Text & "

      " & Error.Where & "
      ") + +End + +Public Sub Goto(sPosition As String) As Boolean + + Dim aScan As String[] + Dim sClass As String + Dim iLine As Integer + + aScan = Scan(sPosition, "*.*.*") + If aScan.Count <> 3 Then Return True + + sClass = aScan[0] + Try iLine = CInt(aScan[2]) + If Error Then Return True + + If ExistClass(sClass) Then OpenFile(sClass, iLine) + +End + +Public Sub IsFake(Optional sDir As String) As Boolean + + If Not sDir Then sDir = Project.Dir + Return sDir = File.Dir(Temp$()) &/ "fake" + +End + + +Public Sub OpenFake() As Boolean + + Dim sDir As String + + If Project.Dir Then Return True + + sDir = File.Dir(Temp$()) &/ "fake" + Shell "rm -rf " & Shell(sDir) Wait + If MakeDir(sDir) Then Return True + + Try Mkdir sDir &/ ".src" + Try Mkdir sDir &/ ".hidden" + + Copy "_fake_project" To sDir &/ ".project" + + Return Project.Open(sDir) + +End + +Public Sub TildePath(sPath As String) As String + + Dim sHome As String = User.Home + + If Right(sHome) <> "/" Then sHome &= "/" + If IsDir(sPath) And If Right(sPath) <> "/" Then sPath &= "/" + + If sPath = sHome Then + sPath = "~" + Else If sPath Begins sHome Then + sPath = "~" & Mid$(sPath, Len(sHome)) + Endif + + Return sPath + +End + +Public Sub UntildePath(sPath As String) As String + + If sPath = "~" Then Return User.Home + If sPath Begins "~/" Then Return User.Home &/ Mid$(sPath, 2) + Return sPath + +End + +Public Sub AddRecentFile(hForm As Object) + + RecentFiles.Add(hForm.Path) + If RecentFiles.Count > 20 Then RecentFiles.Remove(0, RecentFiles.Count - 20) + +End + +Public Sub RequireProgram(aProg As String[]) As String + + Dim sProg As String + Dim aMissing As New String[] + + For Each sProg In aProg + If Not System.Exist(sProg) Then aMissing.Add(sProg) + Next + + If aMissing.Count = 1 Then + Return Subst(("The &1 program is not installed on your system."), "" & aMissing[0] & "") + Else If aMissing.Count > 1 Then + Return Subst(("The following programs are not installed on your system: &1."), "" & aMissing.Join(", ") & "") + Endif + +End + +' Private Sub CreateComponentFile() +' +' Dim hFile As File +' +' If Type = TYPE_NORMAL Then Return +' If Exist(Project.Dir &/ ".component") Then Return +' +' hFile = Open Project.Dir &/ ".component" For Create +' Print #hFile, "[Component]" +' Print #hFile, "Key="; Project.Name +' Print #hFile, "Version="; FormatVersion() +' Close #hFile +' +' End + +Public Sub ReadComponentFile() As Collection + + Dim sPath As String = Project.Dir &/ ".component" + Dim hFile As File + Dim sLine As String + Dim sGroup As String + Dim iPos As Integer + Dim sKey As String + Dim cComp As New Collection + + If Type = TYPE_NORMAL Then Return + + cComp["State"] = CComponent.STABLE + + If Not Exist(sPath) Then Return cComp + + ' cComp["Need"] = New String[] + ' cComp["Require"] = New String[] + ' cComp["Exclude"] = New String[] + ' cComp["Implement"] = New String[] + ' cComp["Include"] = New String[] + + hFile = Open sPath + + Line Input #hFile, sLine + If Trim(sLine) <> "[Component]" Then Return + + For Each sLine In hFile.Lines + + sLine = Trim(sLine) + If Not sLine Then Continue + If Left(sLine) = ";" Then Continue + + If Left(sLine) = "[" Then + If sLine = "[Component]" Then Break + sGroup = Mid$(sLine, 2, -1) + Continue + Endif + + iPos = InStr(sLine, "=") + If iPos = 0 Then Continue + sKey = LCase(Left(sLine, iPos - 1)) + sLine = Mid$(sLine, iPos + 1) + + Select Case sKey + Case "need", "needs" + cComp["Need"] = Split(sLine) + Case "require", "requires" + cComp["Require"] = Split(sLine) + Case "exclude", "excludes" + cComp["Exclude"] = Split(sLine) + Case "implement", "implements" + cComp["Implement"] = Split(sLine) + Case "state" + cComp["State"] = CInt(sLine) + Case "hidden" + cComp["Hidden"] = sLine = "True" + Case "compatibleuntil" + cComp["CompatibleUntil"] = sLine + Case "include" + cComp["Include"] = Split(sLine) + End Select + + Next + + hFile.Close + + Return cComp + +Catch + + Message.Error(("Unable to read component description file.") & "\n\n" & Error.Text & "\n" & Error.Where) + +End + +Public Sub WriteComponentFile(cComp As Collection) As Boolean + + Dim sPath As String = Project.Dir &/ ".component" + Dim hFile As File + Dim bNew As Boolean + Dim aData As String[] + Dim sData As String + + If Type = TYPE_NORMAL Then + If Exist(sPath) Then + VersionControl.RemoveFile(sPath) + Try Kill sPath + Endif + Return + Endif + + If Not cComp Then cComp = New Collection + + hFile = Open Temp$("component") For Create + + Print #hFile, "[Component]" + Print #hFile, "Key="; Name + Print #hFile, "Version="; FormatVersion() + + If cComp["State"] Then Print #hFile, "State="; cComp["State"] + + If cComp["Hidden"] Then Print #hFile, "Hidden=True" + + If Authors Then Print #hFile, "Authors="; Replace(Project.Authors, "\n", ",") + + aData = cComp["Implement"] + If aData And If aData.Count Then Print #hFile, "Implements="; aData.Join(",") + + aData = cComp["Need"] + If aData And If aData.Count Then Print #hFile, "Needs="; aData.Join(",") + + aData = cComp["Require"] + If aData And If aData.Count Then Print #hFile, "Requires="; aData.Join(",") + + aData = cComp["Exclude"] + If aData And If aData.Count Then Print #hFile, "Excludes="; aData.Join(",") + + sData = cComp["CompatibleUntil"] + If sData And If sData <> "0.0.0" Then Print #hFile, "CompatibleUntil="; sData + + aData = cComp["Include"] + If aData And If aData.Count Then Print #hFile, "Include="; aData.Join(",") + + Close #hFile + + bNew = Not Exist(sPath) + Try Kill sPath + Copy Temp$("component") To sPath + If bNew Then VersionControl.AddFile(sPath) + +Catch + + Message.Error(("Cannot write component description file.") & "\n\n" & Error.Text & "\n" & Error.Where) + Return True + +End + +Public Sub UpdateComponentFile() + + If Type = TYPE_NORMAL Then Return + WriteComponentFile(ReadComponentFile()) + +End + +Public Sub OnVendorKeyPress(Optional bPrefix As Boolean) + + If Key.Control Then + Stop Event + Return + Endif + + If Key.Text Then + If Len(Key.Text) = 1 Then + If Asc(Key.Text) < 32 Then Return + If Asc(Key.Text) = 127 Then Return + If IsDigit(Key.Text) Then Return + If IsLetter(Key.Text) Then Return + If Not bPrefix Then + If InStr("-_", Key.Text) Then Return + Endif + Endif + Stop Event + Endif + +End + +Public Sub RefreshIcon(sPath As String) + + Dim hForm As Object + + hForm = Files[sPath] + If hForm Then hForm.Icon = GetFileIcon(sPath) + + If IsSourcePath(sPath) Then + If File.Ext(sPath) = "class" Then + sPath = FindForm(File.BaseName(sPath)) + Else + sPath = File.SetExt(sPath, "class") + Endif + + hForm = Files[sPath] + If hForm Then hForm.Icon = GetFileIcon(sPath) + + Endif + +End + +Public Sub GetBookmarks() As Collection[] + + Try Mkdir Desktop.DataDir &/ "gambas3/src" + Try Mkdir Desktop.DataDir &/ "gambas3/template" + + Return [["Name": ("Installed software"), "Path": Desktop.DataDir &/ "gambas" & System.Version & "/src", "Icon": "icon:/small/download"], + ["Name": ("Project templates"), "Path": Desktop.DataDir &/ "gambas" & System.Version & "/template", "Icon": "icon:/small/copy"]] + +End + +Public Sub RevertFile(sPath As String) + + Inc Application.Busy + + VersionControl.Revert(sPath) + Try Project.Files[sPath].Reload + + If File.Ext(sPath) <> ".class" Then + sPath = File.SetExt(sPath, "class") + If Exist(sPath) Then + VersionControl.Revert(sPath) + Try Project.Files[sPath].Reload + Endif + Endif + + Project.Refresh + + Dec Application.Busy + +End + +Public Sub ArgumentToString(aArg As String[]) As String + + Dim sResult As String + Dim sArg As String + + For Each sArg In aArg + If sResult Then sResult &= " " + If InStr(sArg, " ") Or If InStr(sArg, Chr$(34)) Then + sResult &= Chr$(34) & Replace(sArg, Chr$(34), Chr$(34) & Chr$(34)) & Chr$(34) + Else + sResult &= sArg + Endif + Next + + Return sResult + +End + +Public Sub OpenTerminal(sDir As String) + + Try Desktop.OpenTerminal(sDir) + If Error Then Message.Error(("Unable to run terminal.") & "\n\n" & Error.Text) + +End + +Private Sub MakeProjectRelativePath(sPath As String) As String + + If sPath Begins Project.Dir Then + sPath = Mid$(sPath, Len(Project.Dir) + 1) + If sPath Begins "/" Then sPath = Mid$(sPath, 2) + Endif + + Return sPath + +End + + +Public Sub ShouldTranslate(sPath As String, Optional bRecursive As Boolean) As Boolean + + Dim sRelPath As String + Dim sFormPath As String + + If Not sPath Then Return + + sRelPath = MakeProjectRelativePath(sPath) + If DoNotTranslate.Exist(sRelPath) Then Return + + If File.Ext(sPath) = "class" Then + sFormPath = FindForm(File.BaseName(sPath)) + If sFormPath Then + sRelPath = MakeProjectRelativePath(sFormPath) + If DoNotTranslate.Exist(sRelPath) Then Return + Endif + Endif + + If Not bRecursive Then Return True + + sPath = File.Dir(sPath) + If sPath = Project.Dir Then Return True + + Return ShouldTranslate(sPath, True) + +End + +Public Sub SetShouldTranslate(sPath As String, bTrans As Boolean) + + Dim iPos As Integer + + sPath = MakeProjectRelativePath(sPath) + iPos = DoNotTranslate.Find(sPath) + If bTrans And iPos >= 0 Then + DoNotTranslate.Remove(iPos) + RefreshKey(Project.Dir &/ sPath) + Else If Not bTrans And iPos < 0 Then + DoNotTranslate.Add(sPath) + RefreshKey(Project.Dir &/ sPath) + Endif + +End + +Public Sub HasFlag(sPath As String, iFlag As Integer, Optional bRec As Boolean) As Boolean + + If Not $cPathFlag Then Return + If Not sPath Then Return + If File.IsRelative(sPath) Then sPath = Project.Dir &/ sPath + If Not IsProjectPath(sPath) Then Return + If BTst($cPathFlag[sPath], iFlag) Then Return True + If Not bRec Then Return + Return HasFlag(File.Dir(sPath), iFlag, bRec) + +End + +Public Sub SetFlag(sPath As String, iFlag As Integer) + + $cPathFlag[sPath] = BSet($cPathFlag[sPath], iFlag) + If iFlag = FLAG_ADDED Then Inc HasAdded + If iFlag = FLAG_CONFLICT Then Inc HasConflict + +End + +Public Sub ResetFlags(Optional sPath As String) + + Dim iFlag As Integer + + If Not sPath Then + $cPathFlag = New Collection + $cPathFlag.Default = 0 + HasConflict = 0 + HasAdded = 0 + Else + iFlag = $cPathFlag[sPath] + If BTst(iFlag, FLAG_ADDED) Then Dec HasAdded + If BTst(iFlag, FLAG_CONFLICT) Then Dec HasConflict + $cPathFlag.Remove(sPath) + Endif + +End + +Public Sub AllFlags(iFlag As Integer) As String[] + + Dim aPath As New String[] + Dim iState As Integer + + If $cPathFlag Then + For Each iState In $cPathFlag + If BTst(iState, iFlag) Then aPath.Add($cPathFlag.Key) + Next + Endif + + Return aPath + +End + +Public Sub IsModified(sPath As String, Optional bNoClass As Boolean) As Boolean + + If HasFlag(sPath, FLAG_MODIFIED) Then Return True + If Not IsSourcePath(sPath) Then Return + If Not IsFormExt(sPath) Then Return + If bNoClass Then Return + Return HasFlag(File.SetExt(sPath, "class"), FLAG_MODIFIED) + +End + +Private Sub ApplyRename(sOld As String, sNew As String, sPath As String) As String + + Dim bRelative As Boolean + + If File.IsRelative(sPath) Then + bRelative = True + sPath = Project.Dir &/ sPath + Endif + + If sPath = sOld Then + sPath = sNew + Else If IsDir(sNew) Then + If Right(sOld) <> "/" Then sOld &= "/" + If sPath Not Begins sOld Then Return + sPath = sNew &/ Mid$(sPath, Len(sOld) + 1) + Else + Return + Endif + + If bRelative Then + sPath = MakeProjectRelativePath(sPath) + Endif + + Return sPath + +End + +Private Sub RenamePaths(sOld As String, sNew As String) + + Dim I As Integer + Dim sPath As String + Dim aRename As String[] + Dim hForm As Object + Dim sCheck As String + Dim sNewFormPath As String + + ' Rename DoNotTranslate + + For I = 0 To DoNotTranslate.Max + sPath = ApplyRename(sOld, sNew, DoNotTranslate[I]) + If sPath Then DoNotTranslate[I] = sPath + Next + + ' Rename sources + + If IsSourcePath(sOld) Then + If IsDir(sNew) Then + RefreshSources + Else + Tree.Sources[File.Name(sOld)] = Null + Tree.Sources[File.Name(sNew)] = sNew + OnRefreshSources + Endif + Endif + + ' Rename opened files + + aRename = New String[] + For Each hForm In Files + sCheck = hForm.Path + If sCheck = sOld Or If sCheck Begins sOld &/ "/" Then + If Not aRename.Exist(sCheck) Then aRename.Add(sCheck) + Endif + Next + + For Each sCheck In aRename + + hForm = Files[sCheck] + Files[sCheck] = Null + + If sCheck = sOld Then + hForm.Rename(File.BaseName(sNew), sNew) + Files[sNew] = hForm + Else + sNewFormPath = sNew &/ Mid$(sCheck, Len(sOld) + 1) + hForm.Rename(hForm.Name, sNewFormPath) + Files[sNewFormPath] = hForm + Endif + + Next + + ' Rename breakpoints + + If IsSourcePath(sOld) Then + If IsCodeExt(sOld) Then + Design.RenameClass(File.BaseName(sOld), File.BaseName(sNew)) + Endif + Endif + +End + +Public Sub FindProjectPath(sPath As String) As String + + Dim hFile As File + Dim sHeader As String + + Do + + If Exist(sPath &/ ".project") Then + + hFile = Open sPath &/ ".project" + sHeader = Read #hFile, -256 + hFile.Close + + If sHeader Begins Project.PROJECT_MAGIC Or If sHeader Begins Project.PROJECT_MAGIC_2 Then + Return sPath + Endif + + Endif + + sPath = File.Dir(sPath) + If sPath = "/" Then Break + Loop + +Catch + +End + +Public Sub CompileTranslation(bForce As Boolean, Optional sLang As String) + + Dim sPath As String + Dim sTrans As String + Dim aLang As String[] + Dim dTrans As Date + Dim dPath As Date + + If sLang Then + aLang = [sLang] + Else + aLang = Language.GetAll(True) + Endif + + ' If Not sLang Then + ' iPos = Project.Environment.Find("LANG=*", gb.Like) + ' If iPos >= 0 Then + ' sLang = Mid$(Project.Environment[iPos], 6) + ' Else + ' sLang = System.Language + ' Endif + ' sLang = Language.Find(sLang) + ' Endif + + For Each sLang In aLang + + sTrans = Language.GetPath(sLang, "po") + Try dTrans = Stat(sTrans).LastModified + If Error Then Continue + + sPath = Language.GetPath(sLang, "mo") + + If Not bForce Then + Try dPath = Stat(sPath).LastModified + If dPath And If dPath >= dTrans Then Continue + Endif + + Try Kill sPath + Shell "msgfmt -o " & Shell$(sPath) & " " & Shell(sTrans) Wait + + Next + +End + +Public Sub InitTooltip(hTooltip As Control) + + With hTooltip + + .Foreground = Color.TextBackground + .Background = Color.SetAlpha(Color.TextForeground, 248) + .Font.Grade = -1 + + End With + +End + +Public Sub GetUncompressedPath(sPath As String, Optional bActual As Boolean) As String + + Dim sUncPath As String = Project.Dir &/ ".hidden/.uncompressed" &/ Mid$(sPath, Len(Project.Dir) + 1) + If bActual And If Not Exist(sUncPath) Then sUncPath = sPath + Return sUncPath + +End + +Public Sub HasTest() As Boolean + + Return Tree.HasTest() + +End + +Public Sub SaveAsExtern() + + Dim hForm As Object + Dim sPath As String + + hForm = ActiveForm + If Not hForm Then Return + + Dialog.Key = "SaveAsExtern" + Dialog.Title = ("Save as") + If Dialog.SaveFile() Then Return + + sPath = Dialog.Path + + Files[hForm.Path] = Null + hForm.Rename(File.Name(sPath), sPath) + Files[hForm.Path] = hForm + + hForm.Save(True) + +End diff --git a/app/src/gambas3/.src/Project/ArgListBox.class b/app/src/gambas3/.src/Project/ArgListBox.class new file mode 100644 index 00000000..bbdcd50e --- /dev/null +++ b/app/src/gambas3/.src/Project/ArgListBox.class @@ -0,0 +1,225 @@ +' Gambas class file + +Inherits DrawingArea + +Event Activate +Event Cancel +Event Insert + +Property Text As String +Property Pos As Integer + +Static Private $hComp As FileCompletion + +Private $hTextBox As TextBox + +Public Sub _new() + + $hTextBox = New TextBox(Me) As "TextBox" + $hTextBox.Border = False + AutoResize + + Me.Proxy = $hTextBox + +End + +Private Sub AutoResize() + + Me.Resize(Max(Me.Font.TextWidth($hTextBox.Text), Me.Font.TextWidth("ø")) + Desktop.Scale + 2, Desktop.Scale * 3) + $hTextBox.Move(1, 1, Me.W - 2, Me.H - 2) + +End + + +Private Function Text_Read() As String + + Dim sText As String + + sText = $hTextBox.Text + If sText = "ø" Then sText = "" + Return sText + +End + +Private Sub Text_Write(Value As String) + + If Me.Next Then + If Not Value Then + Value = "ø" + $hTextBox.Foreground = Color.LightForeground + Else + $hTextBox.Foreground = Color.Default + Endif + Endif + $hTextBox.Text = Value + +End + +Public Sub TextBox_Change() + + AutoResize + +End + +Public Sub TextBox_GotFocus() + + If Not $hComp Then + $hComp = New FileCompletion(Last) + Else + $hComp.Editor = Last + Endif + + If $hTextBox.Text = "ø" Then + $hTextBox.Text = "" + $hTextBox.Foreground = Color.Default + Endif + Me.Border = Border.Plain + +End + +Public Sub TextBox_LostFocus() + + If Me.Next Then + If $hTextBox.Text = "" Then + $hTextBox.Text = "ø" + $hTextBox.Foreground = Color.LightForeground + Endif + Else + If $hTextBox.Text Then Raise Activate + Endif + + Me.Border = Border.None + +End + +Public Sub TextBox_KeyPress() + + Dim hArg As ArgListBox + Dim sText As String + Dim iPos As Integer + + If Key.Normal Then + + If Key.Code = Key.Left Then + + If $hTextBox.Pos = 0 Then + hArg = Me.Previous + If hArg And If Object.IsValid(hArg) Then + hArg.SetFocus + hArg.MoveEnd + Stop Event + Endif + Endif + + Else If Key.Code = Key.Right Then + + If $hTextBox.Pos = $hTextBox.Length Then + hArg = Me.Next + If hArg Then + hArg.SetFocus + hArg.MoveBegin + Stop Event + Endif + Endif + + Else If Key.Code = Key.Tab Then + + Raise Activate + Stop Event + + Else If Key.Code = Key.Enter Or If Key.Code = Key.Return Then + + Raise Insert + Stop Event + + Else If Key.Code = Key.Delete Then + + If $hTextBox.Pos = $hTextBox.Length Then + hArg = Me.Next + If hArg And If hArg.Next Then + sText = Me.Text + iPos = String.Len(sText) + Me.Text &= hArg.Text + Me.Pos = iPos + hArg.Delete + Endif + Stop Event + Endif + + Else If Key.Code = Key.Backspace Then + + If $hTextBox.Pos = 0 Then + hArg = Me.Previous + If hArg Then + sText = hArg.Text + iPos = String.Len(sText) + If Me.Next Then + hArg.Text = sText & Me.Text + Endif + Me.Delete + hArg.SetFocus + hArg.Pos = iPos + Endif + Stop Event + Endif + + ' If $hTextBox.Length = 0 Then + ' hArg = Me.Previous + ' Me.Delete + ' If hArg And If Object.IsValid(hArg) Then + ' hArg.SetFocus + ' hArg.MoveEnd + ' Endif + ' Stop Event + ' Endif + + Else If Key.Code = Key.Escape Then + + Raise Cancel + Stop Event + + Else If Key.Code = Key.Home Then + + If $hTextBox.Pos = 0 Then + hArg = Me.Parent.Children[0] + hArg.SetFocus + hArg.MoveBegin + Endif + + Else If Key.Code = Key.End Then + + If $hTextBox.Pos = $hTextBox.Length Then + hArg = Me.Parent.Children[Me.Parent.Children.Count - 1] + hArg.SetFocus + Endif + + Endif + + Endif + +End + +Public Sub MoveBegin() + + $hTextBox.Pos = 0 + +End + +Public Sub MoveEnd() + + $hTextBox.Pos = $hTextBox.Length + +End + + +Private Function Pos_Read() As Integer + + Return $hTextBox.Pos + +End + +Private Sub Pos_Write(Value As Integer) + + $hTextBox.Pos = Value + +End diff --git a/app/src/gambas3/.src/Project/ArgListEditor.class b/app/src/gambas3/.src/Project/ArgListEditor.class new file mode 100644 index 00000000..afd0f8e4 --- /dev/null +++ b/app/src/gambas3/.src/Project/ArgListEditor.class @@ -0,0 +1,204 @@ +' Gambas class file + +Export + +Inherits UserControl + +Event Click + +Property Selected As Boolean + +Private $hPanel As DrawingArea +Private $bSelected As Boolean +Private $bNoResizePanel As Boolean + +Public Sub _new() + + Me._Arrangement = Arrange.Fill + + $hPanel = New DrawingArea(Me) As "Panel" + $hPanel.Background = Color.TextBackground + $hPanel.Foreground = Color.TextForeground + $hPanel.Arrangement = Arrange.LeftRight + $hPanel.Margin = True + '$hPanel.Spacing = True + + Set(Null) + +End + +Private Sub Add(Optional sArg As String, Optional hAfter As ArgListBox) + + Dim hArg As ArgListBox + + hArg = New ArgListBox($hPanel) As "ArgListBox" + hArg.Text = sArg + + 'hArg = hArg.Previous + 'If hArg Then Try hArg.Text = hArg.Text + If hAfter Then + hArg.Next = hAfter.Next + hAfter.Next = hArg + Endif + +End + +Public Sub Set(aArg As String[]) + + Dim sArg As String + + $hPanel.Children.Clear + + $bNoResizePanel = True + + If aArg Then + For Each sArg In aArg + Add(sArg) + Next + Endif + + Add() + + $bNoResizePanel = False + + ResizePanel + +End + +Public Sub Get() As String[] + + Dim aArg As New String[] + Dim I As Integer + Dim hArg As ArgListBox + + For I = 0 To $hPanel.Children.Count - 1 + hArg = $hPanel.Children[I] + aArg.Add(hArg.Text) + Next + + While Not aArg[aArg.Max] + aArg.Remove(aArg.Max) + If aArg.Count = 0 Then Break + Wend + + Return aArg + +End + + +Private Sub ResizePanel() + + Dim H As Integer + + If $bNoResizePanel Then Return + + With $hPanel.Children[$hPanel.Children.Count - 1] + H = .Y + .H + Desktop.Scale + End With + + H = Max(H, Desktop.Scale * 5) + + $hPanel.H = H + Me.H = H + +End + +Public Sub Panel_Arrange() + + ResizePanel + +End + +Public Sub SetFocus() + + Dim hArg As ArgListBox + + Try hArg = $hPanel.Children[$hPanel.Children.Count - 1] + If Not hArg Or If hArg.Text Then Add() + + $hPanel.Children[$hPanel.Children.Count - 1].SetFocus + + Raise Click + +End + + +Public Sub Panel_MouseDown() + + SetFocus + +End + +Private Function Selected_Read() As Boolean + + Return $bSelected + +End + +Private Sub Selected_Write(Value As Boolean) + + If $bSelected = Value Then Return + $bSelected = Value + $hPanel.Refresh + +End + +Public Sub Panel_Draw() + + If $bSelected Then + Paint.Rectangle(1, 1, Paint.W - 2, Paint.H - 2) + Paint.LineWidth = 2 + Paint.Background = Color.SelectedBackground + Paint.Stroke + Else + Paint.Rectangle(0.5, 0.5, Paint.W - 1, Paint.H - 1) + Paint.LineWidth = 1 + Paint.Background = Color.LightForeground + Paint.Stroke + Endif + +End + +Public Sub ArgListBox_GotFocus() + + Raise Click + +End + +Public Sub ArgListBox_Activate() + + Dim hArg As ArgListBox = Last + + If Not hArg.Next Then Add() + If hArg.HasFocus Then Try hArg.Next.SetFocus + +End + +Public Sub ArgListBox_Insert() + + Dim hArg As ArgListBox = Last + Dim sText As String + Dim iPos As Integer + + sText = hArg.Text + iPos = hArg.Pos + hArg.Text = String.Left(sText, iPos) + + Add(String.Mid(sText, iPos + 1), hArg) + If hArg.HasFocus Then + hArg = hArg.Next + hArg.SetFocus + hArg.MoveBegin + Endif + +End + + +Public Sub ArgListBox_Cancel() + + Me.Selected = False + Me.Parent.SetFocus + +End + + diff --git a/app/src/gambas3/.src/Project/CProjectInfo.class b/app/src/gambas3/.src/Project/CProjectInfo.class new file mode 100644 index 00000000..e888609a --- /dev/null +++ b/app/src/gambas3/.src/Project/CProjectInfo.class @@ -0,0 +1,265 @@ +' Gambas class file + +Property Read Name As String +Property Read Path As String +Property Read Title As String +Property Read Version As String +Property Read Description As String +Property Read Authors As String[] +Property Read Icon As String +Property Read Startup As String +Property Read Components As String[] + +Public Type As Integer +Public Translate As Boolean +Public ControlPublic As Boolean +Public ModulePublic As Boolean +Public CreateMenu As Boolean + +Private $sName As String +Private $sPath As String +Private $sTitle As String +Private $sVersion As String +Private $sDescription As String +Private $aAuthors As New String[] +Private $sIcon As String +Private $sStartup As String +Private $aComponents As New String[] + +Private $bRead As Boolean +Private $sTranslatedTitle As String +Private $sTranslatedDescription As String + +Private Sub GetProjectPath(sPath As String) As String + + Do + If Exist(sPath &/ ".project") Then Return sPath + sPath = File.Dir(sPath) + If sPath = "/" Then Break + Loop + +Catch + +End + +Private Sub ReadProject() + + Dim hFile As File + Dim sLine As String + Dim iPos As Integer + Dim sKey As String + Dim sVal As String + + If $bRead Then Return + $bRead = True + + If Not $sPath Then Return + + $aComponents = New String[] + + hFile = Open $sPath &/ ".project" + + For Each sLine In hFile.Lines + sLine = Trim(sLine) + If Not sLine Then Continue + If Left(sLine) = "#" Then Continue + + iPos = InStr(sLine, "=") + If iPos = 0 Then Continue + + sKey = Lower$(Trim(Left$(sLine, iPos - 1))) + sVal = Trim(Mid$(sLine, iPos + 1)) + + Select Case sKey + + Case "title" + $sTitle = sVal + + Case "version" + $sVersion = sVal + + Case "description" + $sDescription = Trim(UnQuote(sVal)) + + Case "authors" + $aAuthors = Split(UnQuote(sVal), "\n") + + Case "icon" + $sIcon = sVal + + Case "startup" + $sStartup = sVal + + Case "component" + $aComponents.Add(sVal) + + Case "translate" + Translate = CInt(sVal) + + Case "controlpublic" + ControlPublic = CInt(sVal) + + Case "modulepublic" + ModulePublic = CInt(sVal) + + Case "createmenu" + CreateMenu = CInt(sVal) + + Case "type" + Select LCase(sVal) + Case "library" + Type = Project.TYPE_LIBRARY + Case "component" + Type = Project.TYPE_COMPONENT + End Select + + End Select + + Next + + Close #hFile + +End + +Public Sub _new(sPath As String) + + $sPath = GetProjectPath(sPath) + $sName = File.Name(sPath) + +End + +Public Sub GetTitle() As String + + If $sTitle Then Return $sTitle + Return $sName + +End + +' Public Sub GetIcon(Optional iSize As Integer) As Image +' +' Dim hImage As Image = Image.Load(Icon) +' +' If iSize Then hImage = hImage.Stretch(iSize, iSize) +' Return hImage +' +' End + +Private Function Name_Read() As String + + Return $sName + +End + +Private Function Path_Read() As String + + Return $sPath + +End + +Private Function Title_Read() As String + + ReadProject + Return $sTitle + +End + +Private Function Version_Read() As String + + ReadProject + Return $sVersion + +End + +Private Function Description_Read() As String + + ReadProject + Return $sDescription + +End + +Private Function Authors_Read() As String[] + + ReadProject + Return $aAuthors + +End + +Private Function Icon_Read() As String + + ReadProject + Return $sIcon + +End + +Private Function Startup_Read() As String + + ReadProject + Return $sStartup + +End + +Private Function Components_Read() As String[] + + ReadProject + Return $aComponents + +End + +Public Sub GetIconPath() As String + + ReadProject + If $sIcon Then + Return $sPath &/ $sIcon + Else + Return "img/logo/project.png" + Endif + +End + +Private Sub GetTranslation(sStr As String) As String + + Dim sLang As String + Dim sPath As String + Dim sTrans As String + + sLang = Language.Find(System.Language) + sPath = $sPath &/ ".lang" &/ sLang & ".po" + If Not Exist(sPath) Then Return sStr + + sTrans = CTranslation.FindTranslation(sPath, sStr) + If sTrans Then + Return sTrans + Else + Return sStr + Endif + + ' aTrans = Split(File.Load(sPath), "\n") + ' iPos = aTrans.Find("msgid " & Quote(sStr)) + ' If iPos < 0 Then Return sStr + ' + ' sTrans = aTrans[iPos + 1] + ' If sTrans Not Begins "msgstr " Then Return sStr + ' + ' Return UnQuote(Mid$(sTrans, 8)) + +End + +Public Sub GetTranslatedTitle() As String + + If Not $sTranslatedTitle Then + ReadProject + $sTranslatedTitle = GetTranslation($sTitle) + Endif + Return $sTranslatedTitle + +End + +Public Sub GetTranslatedDescription() As String + + If Not $sTranslatedDescription Then + ReadProject + $sTranslatedDescription = GetTranslation($sDescription) + Endif + Return $sTranslatedDescription + +End diff --git a/app/src/gambas3/.src/Project/CProjectList.class b/app/src/gambas3/.src/Project/CProjectList.class new file mode 100644 index 00000000..36c90d15 --- /dev/null +++ b/app/src/gambas3/.src/Project/CProjectList.class @@ -0,0 +1,678 @@ +' Gambas class file + +Public Enum TYPE_RECENT, TYPE_EXAMPLE, TYPE_SOFTWARE, TYPE_TEMPLATE + +Event Click(Path As String, Another As Boolean) +Event DblClick(Path As String) +Event Refresh +Event Fill + +Property AllowOpenExtern As Boolean +Property Current As ProjectBox + +Private $hList As ScrollView +Private $hFilter As ButtonBox +Private $iSort As Integer +Private $iType As Integer +Private $hObserver As Observer +Private $iArrange As Integer +Private $hObsList As Observer +Private $dRecent As Date +Private $sLastURL As String +Private $hHelp As WebView +Private $hCurrent As ProjectBox +Private $iCount As Integer +Private $bNoFilter As Boolean + +Public Sub _new(hList As ScrollView, hFilter As ButtonBox, iType As Integer, Optional iArrange As Integer = Arrange.Row) + + $hList = hList + '$hList.Shadow = True + $hFilter = hFilter + $iType = iType + $iArrange = iArrange + + $bNoFilter = Not $hFilter.Enabled + + $hObserver = New Observer($hFilter) As "Filter" + $hObsList = New Observer(hList) As "ScrollView" + +End + +Public Sub SetSort(iSort As Integer) + + $iSort = iSort + Fill(True) + +End + +Public Sub SetArrangement(iArrange As Integer) + + If $iArrange = iArrange Then Return + + $iArrange = iArrange + Clear + Fill + +End + +Private Sub GetExamples() As String[] + + Dim sFile As String + Dim aList As New String[] + Dim sDir As String + Dim hStat As Stat + + sDir = Desktop.DataDir &/ "gambas3/src/example" + If Not IsDir(sDir) Then Return aList + + For Each sFile In Dir(sDir) + If Left(sFile) = "." Then Continue + hStat = Stat(sDir &/ sFile) + If hStat.Link Then + aList.Add(Project.GetAbsoluteLink(sDir &/ sFile, hStat.Link)) + Else + aList.Add(sDir &/ sFile) + Endif + Next + + aList.Sort(gb.Natural) + + Return aList + +End + + +Private Sub FillWithExample() + + Dim sExample As String + ' Dim sDir As String + ' Dim sLastDir As String + ' Dim hDrawingArea As DrawingArea + Dim hProjectItem As ProjectBox + ' Dim sGroup As String + Dim aExamples As String[] + + Inc Application.Busy + $hList.Arrangement = Arrange.None + + aExamples = GetExamples() + $iCount = aExamples.Count + + If aExamples.Count = 0 Then + + If Not $hHelp Then + Clear + $hHelp = New WebView($hList) As "ExampleWebView" + $hHelp.MoveScaled(0, 0, 4, 4) + $hHelp.Foreground = Color.LightForeground + $hHelp.HTML = "" & + Subst(("Examples are stored on the Gambas farm server. Click &1 to access the farm server and download them..."), "" & ("here") & "") & + "" + Endif + $hList.Arrangement = Arrange.Fill + $hFilter.Enabled = False + + Else + + Clear + + For Each sExample In aExamples + + ' sDir = File.Dir(sExample) + ' If sDir <> sLastDir Then + ' If $iArrange = Arrange.Row And If $hList.Children.Count Then + ' hPanel = New Panel($hList) + ' hPanel.Resize(1, 1) + ' hPanel.Expand = True + ' Endif + ' hDrawingArea = New DrawingArea($hList) As "dwgTitle" + ' With hDrawingArea + ' .Enabled = False + ' .Tag = Project.ExampleTitle[sDir] + ' sGroup = .Tag + ' '.Font = Font["Bold"] + ' .H = .Font.Height + ' If $iArrange = Arrange.Row Then .Expand = True + ' End With + ' 'bHighlight = False + ' sLastDir = sDir + ' Endif + + hProjectItem = New ProjectBox($hList) As "ProjectItem" + If $iArrange = Arrange.Row Then + hProjectItem.ResizeScaled(32, 16) + Else + hProjectItem.ResizeScaled(1, 9) + Endif + hProjectItem.ShowAuthors = True + hProjectItem.Path = sExample + 'hProjectItem.Group = sGroup + + Next + + ApplyFilter($hFilter.Text) + $hList.Arrangement = $iArrange + $hFilter.Enabled = True + + Endif + + Dec Application.Busy + +End + +Private Sub GetSoftwares() As String[] + + Dim sFile As String + Dim aList As New String[] + Dim sDir As String + Dim hStat As Stat + Dim sVendor As String + + sDir = Desktop.DataDir &/ "gambas3/src/" + If Not IsDir(sDir) Then Return aList + + For Each sVendor In Dir(sDir) + For Each sFile In Dir(sDir &/ sVendor) + If Left(sFile) = "." Then Continue + hStat = Stat(sDir &/ sVendor &/ sFile) + If hStat.Link Then Continue + aList.Add(sDir &/ sVendor &/ sFile) + Next + Next + + aList.Sort(gb.Natural) + + Return aList + +End + +Public Sub IsVoid() As Boolean + + Return $iCount = 0 + +End + + +Private Sub FillWithSoftware() + + Dim hProjectItem As ProjectBox + Dim sGroup As String + Dim aSoft As String[] + Dim sSoft As String + Dim sDir As String + Dim sLastDir As String + Dim hPanel As Panel + Dim hDrawingArea As DrawingArea + Dim sTitle As String + + Inc Application.Busy + $hList.Arrangement = Arrange.None + + aSoft = GetSoftwares() + $iCount = aSoft.Count + + If aSoft.Count = 0 Then + + Else + + Clear + + For Each sSoft In aSoft + + sDir = File.Dir(sSoft) + If sDir <> sLastDir Then + If $iArrange = Arrange.Row And If $hList.Children.Count Then + hPanel = New Panel($hList) + hPanel.Resize(1, 1) + hPanel.Expand = True + Endif + hDrawingArea = New DrawingArea($hList) As "dwgTitle" + With hDrawingArea + .Enabled = False + sTitle = File.Name(sDir) + If sTitle = ".extension" Then + sTitle = ("IDE extensions") + Else + sTitle = String.UCaseFirst(sTitle) + Endif + .Tag = sTitle + sGroup = .Tag + '.Font = Font["Bold"] + .H = .Font.Height + If $iArrange = Arrange.Row Then .Expand = True + End With + 'bHighlight = False + sLastDir = sDir + Endif + + hProjectItem = New ProjectBox($hList) As "ProjectItem" + If $iArrange = Arrange.Row Then + hProjectItem.ResizeScaled(32, 16) + Else + hProjectItem.ResizeScaled(1, 9) + Endif + hProjectItem.ShowAuthors = True + hProjectItem.ShowRemove = True + hProjectItem.Path = sSoft + hProjectItem.Group = sGroup + + Next + + ApplyFilter($hFilter.Text) + $hList.Arrangement = $iArrange + $hFilter.Enabled = True + + Endif + + Dec Application.Busy + +End + +Private Sub GetTemplates() As String[] + + Dim sFile As String + Dim aList As New String[] + Dim sDir As String + + sDir = System.Path &/ "share/" & "gambas" & System.Version &/ "template" + If IsDir(sDir) Then + For Each sFile In Dir(sDir).Sort(gb.Natural) + If Left(sFile) = "." Then Continue + If Not Exist(sDir &/ sFile &/ ".project") Then Continue + aList.Add(sDir &/ sFile) + Next + Endif + + sDir = Desktop.DataDir &/ "gambas3/template/" + If IsDir(sDir) Then + For Each sFile In Dir(sDir).Sort(gb.Natural) + If Left(sFile) = "." Then Continue + If Not Exist(sDir &/ sFile &/ ".project") Then Continue + aList.Add(sDir &/ sFile) + Next + Endif + + Return aList + +End + +Private Sub FillWithTemplate() + + Dim hProjectItem As ProjectBox + Dim sGroup As String + Dim aSoft As String[] + Dim sSoft As String + Dim sComp As String + + Inc Application.Busy + $hList.Arrangement = Arrange.None + + aSoft = GetTemplates() + $iCount = aSoft.Count + + If aSoft.Count Then + + Clear + + For Each sSoft In aSoft + + hProjectItem = New ProjectBox($hList) As "ProjectItem" + hProjectItem.ResizeScaled(40, 16) + hProjectItem.Path = sSoft + hProjectItem.Group = sGroup + hProjectItem.Template = True + + For Each sComp In hProjectItem.Info.Components + If Not Project.Documentation.Exist(sComp) Then + hProjectItem.Enabled = False + Break + Endif + Next + + Next + + ApplyFilter($hFilter.Text) + $hList.Arrangement = $iArrange + $hFilter.Enabled = True + + Endif + + Dec Application.Busy + +End + +Public Sub Clear() + + $hList.Children.Clear + $hHelp = Null + $hCurrent = Null + +End + + +Private Sub FillWithRecent(bClear As Boolean) + + Dim hProjectItem As ProjectBox + 'Dim hFirst As ProjectBox + Dim aRecent As CRecentProject[] + Dim hRecent As CRecentProject + 'Dim bHighlight As Boolean + Dim sTitle As String + Dim sLastTitle As String + Dim hDrawingArea As DrawingArea + Dim hPanel As Panel + + If Not bClear Then + If $hList.Children.Count And If Not CRecentProject.IsOutOfDate($dRecent) Then Return + Endif + + Inc Application.Busy + + 'panRecent.Hide + 'lstRecent.Lock + $hList.Arrangement = Arrange.None + Clear() + + aRecent = CRecentProject.Get($iSort) + $iCount = aRecent.Count + + For Each hRecent In aRecent + + sTitle = hRecent.GetTitle($iSort) + + If sTitle <> sLastTitle Then + If $iArrange = Arrange.Row Then + If $hList.Children.Count Then + hPanel = New Panel($hList) + hPanel.Resize(1, 1) + hPanel.Expand = True + Endif + Endif + hDrawingArea = New DrawingArea($hList) As "dwgTitle" + With hDrawingArea + .Enabled = False + .Tag = sTitle + '.Font = Font["Bold"] + .H = .Font.Height + If $iArrange = Arrange.Row Then .Expand = True + End With + sLastTitle = sTitle + Endif + + hProjectItem = New ProjectBox($hList) As "ProjectItem" + If $iArrange = Arrange.Row Then + hProjectItem.ResizeScaled(32, 16) + Else + hProjectItem.ResizeScaled(1, 9) + Endif + hProjectItem.ShowAuthors = True + hProjectItem.ShowRemove = True + hProjectItem.Path = hRecent.Path + + Next + + ApplyFilter($hFilter.Text) + + 'If hFirst Then hFirst.Selected = True + + ' Workaround a scrollview bug that does not show the scrollbars. + 'lstRecent.Unlock + 'panRecent.Show + + $dRecent = CRecentProject.LastLoad + + $hList.Arrangement = $iArrange + $hList.ScrollY = 0 + + $hFilter.Enabled = aRecent.Count + + Dec Application.Busy + +End + +Public Sub Fill(Optional bClear As Boolean) + + Select Case $iType + Case TYPE_RECENT + FillWithRecent(bClear) + Case TYPE_EXAMPLE + FillWithExample + Case TYPE_SOFTWARE + FillWithSoftware + Case TYPE_TEMPLATE + FillWithTemplate + End Select + + Raise Fill + +End + +Public Sub ApplyFilter(sFilter As String) + + Dim hCtrl, hLast As Control + Dim hProjectItem As ProjectBox + Dim bShowEnd As Boolean + + If Len(sFilter) And If Len(sFilter) < 3 Then Return + + $hList.Arrangement = Arrange.None + + If $bNoFilter Or If Not sFilter Then + sFilter = "*" + Else + sFilter = "*" & String.LCase(sFilter) & "*" + Endif + + For Each hCtrl In $hList.Children + + If hCtrl Is ProjectBox Then + hProjectItem = hCtrl + hProjectItem.Visible = hProjectItem.Match(sFilter) + ' If hProjectItem.Visible Then + ' If Not hFirst Then hFirst = hProjectItem + ' Endif + Endif + + Next + + For Each hCtrl In $hList.Children + + If hCtrl Is DrawingArea Then + If hLast Then + hLast.Hide + Endif + hLast = hCtrl + bShowEnd = False + Else If hCtrl Is ProjectBox Then + If hCtrl.Visible Then + If hLast Then + hLast.Show + Endif + hLast = Null + bShowEnd = True + Endif + Else + hCtrl.Visible = bShowEnd + Endif + + Next + + If hLast Then hLast.Hide + + $hList.Arrangement = Arrange.Row + + 'hFirst.Selected = True + 'hList.Unlock + +End + + +Public Sub dwgTitle_Draw() + + Dim hDrawingArea As DrawingArea = Last + + Paint.Background = Color.Merge(Color.LightForeground, Color.Foreground) + Paint.DrawText(hDrawingArea.Tag, 1, 0, Paint.W, Paint.H, Align.BottomNormal) + +End + +Public Sub ProjectItem_Click() + + Me.Current = Last + Raise Click($hCurrent.Path, False) + +End + +Public Sub ProjectItem_DblClick() + + Me.Current = Last + Raise DblClick($hCurrent.Path) + +End + +Public Sub ProjectItem_ButtonClick() + + Raise Click(Last.Path, True) + +End + +Public Sub ProjectItem_RemoveClick() + + Dim hItem As ProjectBox = Last + Dim sErr As String + + If $hCurrent = hItem Then $hCurrent = Null + + If $iType = TYPE_RECENT Then + + CRecentProject.Remove(hItem.Path) + hItem.Delete + + Else If $iType = TYPE_SOFTWARE Then + + If Message.Question(("Do you really want to uninstall this software?"), ("Uninstall"), ("Cancel")) = 1 Then + sErr = CSoftware.UninstallFromPath(hItem.Path) + If sErr Then + Message.Error(("Unable to uninstall software:") & "\n\n" & sErr) + Else + Clear + Fill + Message(("The software has been successfully uninstalled.")) + Raise Refresh + Endif + Endif + + Endif + +End + +' Public Sub ProjectItem_preparePopUp(item As ProjectBox) +' +' $hCurrent = item +' +' End +' +Public Sub GetFirst() As String + + Dim hChild As Control + Dim hProjectItem As ProjectBox + + For Each hChild In $hList.Children + Try hProjectItem = hChild + If Not Error And If hProjectItem.Visible Then Return hProjectItem.Path + Next + +End + + +Public Sub Filter_Click() + + $hFilter.Text = "" + +End + +Public Sub Filter_Change() + + ApplyFilter($hFilter.Text) + +End + +Public Sub Filter_Activate() + + Dim sFirst As String = GetFirst() + If sFirst Then Raise Click(sFirst, False) + +End + + +Public Sub ScrollView_GotFocus() + + $hFilter.SetFocus + +End + +' Public Sub ScrollView_Arrange() +' +' Debug $hList.Name;; $hList.Children.Count;; +' If $hList.Children.Count Then +' Error Str($hList.Children[0].Visible);; +' Endif +' Error +' +' End + + +Private Function AllowOpenExtern_Read() As Boolean + + Return ProjectBox.ShowButton + +End + +Private Sub AllowOpenExtern_Write(Value As Boolean) + + ProjectBox.ShowButton = Value + +End + +Public Sub ExampleWebView_Link(sURL As String) + + $sLastURL = sURL + +End + +Public Sub ExampleWebView_Error() + + If $sLastURL = "farm://" Then + FSoftwareFarm.Run + Fill + Endif + +End + +Public Sub ExampleWebView_Menu() + + Stop Event + +End + +Private Function Current_Read() As ProjectBox + + Return $hCurrent + +End + +Private Sub Current_Write(Value As ProjectBox) + + If $hCurrent = Value Then Return + + If IsNull(Value) Then + $hCurrent = Value + Return + Endif + + If $hCurrent Then $hCurrent.Selected = False + $hCurrent = Value + If $hCurrent Then $hCurrent.Selected = True + +End diff --git a/app/src/gambas3/.src/Project/CProjectTree.class b/app/src/gambas3/.src/Project/CProjectTree.class new file mode 100644 index 00000000..faab757d --- /dev/null +++ b/app/src/gambas3/.src/Project/CProjectTree.class @@ -0,0 +1,1057 @@ +' Gambas class file + +Public Const KEY_SOURCE As String = "$S" +Public Const KEY_MISC As String = "$O" +Public Const KEY_PROJECT As String = "$P" +Public Const KEY_PUBLIC As String = "$B" +Public Const KEY_CONNECTION As String = "$D" +Public Const KEY_EXTERN As String = "$X" + +Public Sources As Collection + +Private $hTree As TreeView +Private $sDir As String +Private $bCurrentProject As Boolean +Private $sSourceDir As String +Private $aInheritance As New String[] +Private $hInfo As CProjectInfo +Private $hObserver As Observer +Private $cFilter As Collection +Private $bHasJustCollapsed As Boolean +Private $bExpandOnMouseUp As Boolean +Private $cExtern As New Collection +Private $sStartup As String + +Public Sub _new(sDir As String) + + $sDir = sDir + $bCurrentProject = $sDir = Project.Dir + + If $bCurrentProject Then Project.Tree = Me + + $sSourceDir = sDir &/ ".src" + If Not Exist($sSourceDir) Then $sSourceDir = $sDir + + $hInfo = New CProjectInfo(sDir) + $sStartup = $hInfo.Startup + +End + +Public Sub RefreshInfo() + + $hInfo = New CProjectInfo($sDir) + +End + + +Public Sub SetView(hTreeView As TreeView) + + If $hTree And If $hTree <> hTreeView Then Error.Raise("TreeView already set") + + $hTree = hTreeView + If $bCurrentProject Then Project.ProjectTree = hTreeView + $hObserver = New Observer(hTreeView) As "TreeView" + FillTree + +End + +Private Sub AddFile(sDir As String, sFile As String, Optional bAfter As Boolean, Optional bIgnoreInheritance As Boolean) As Boolean + + Dim bIgnore As Boolean + Dim sPath As String + Dim sKey As String + Dim bShow As Boolean + Dim sExt As String + Dim sParent As String + Dim hPict As Picture + Dim bChecked As Boolean + Dim bDir As Boolean + Dim sAfter As String + Dim hModule As CModule + Dim bSource As Boolean + Dim bExtern As Boolean + Dim sTitle As String + Dim hStat As Stat + Dim bParentLink As Boolean + Dim bStartup As Boolean + + sPath = sDir &/ sFile + + If $cFilter And If Not $cFilter.Exist(sPath) Then Return + + sKey = sPath + sParent = sDir + + If sDir = $sDir Then + sParent = KEY_MISC + Else If sDir = $sDir &/ ".hidden" Then + sParent = KEY_PROJECT + Else If sDir = $sDir &/ ".public" Then + sParent = KEY_PUBLIC + Else If sDir = $sSourceDir Then + sParent = KEY_SOURCE + Else If sDir = $sDir &/ ".connection" Then + sParent = KEY_CONNECTION + Else If $cExtern.Exist(sPath) Then + sParent = KEY_EXTERN + If Not $hTree.Exist(sParent) Then $hTree.Add(sParent, ("Files"), Picture["icon:/small/system"], $sDir) + bExtern = True + Try sTitle = Project.Files[sPath].GetTitle() + If sTitle Then sFile = sTitle + Endif + + Try hStat = Stat(sPath) + If Error Then Return + + With hStat + + If .Hidden Then Return + + bShow = False + If Not bExtern Then bSource = IsSourcePath(sDir &/ sFile) + + If IsDir(sPath) Then + + If sFile = "CVS" Or If sFile = "CVSROOT" Then Return + + bDir = True + + Else + + 'IF InStr(.Perm.User & .Perm.Group & .Perm.Other, "x") THEN CONTINUE + + sExt = Lower(File.Ext(sFile)) + bChecked = False + + If bSource Then + + If CModule.Ext.Exist(sExt) Then + + 'sIcon = IMAGE_DIR &/ sExt & ".png" + bShow = sDir = $sSourceDir + bChecked = True + + sParent = "" + + If sExt = "class" Then + For Each hModule In CModule.All + If Exist(sDir &/ File.BaseName(sFile) & "." & hModule.Key) Then + bIgnore = True + Break + Endif + Next + + If Not bIgnore Then + 'IF sFile = "ReportContainer.class" THEN STOP + If Project.UseInheritance Then sParent = FindKey(Project.GetParentClass(sPath)) + If sParent Then + If File.Ext(sParent) <> "class" Then + sParent = "" + Else If Not $hTree.Exist(sParent) Then + If Not bIgnoreInheritance Then + $aInheritance.Add(sPath) + bIgnore = True + Else + sParent = "" + Endif + Else If File.Dir(sParent) <> sDir Then + bParentLink = True + Endif + Endif + Endif + ' Else If sExt = "module" Then + ' Else + ' 'hModule = CModule[sExt] + ' 'sParent = hModule.TreeKey + ' 'If Not hModule.Used Then bIgnore = True + ' sParent = sDir + ' Else If sExt <> "module" Then + ' 'If Not HasModule(sExt) Then + ' ' bIgnore = True + ' 'Endif + Endif + + If Not sParent Then sParent = sDir + If sParent = $sSourceDir Then sParent = KEY_SOURCE + + If Sources[sFile] <> sPath Then + bIgnore = True + Endif + + sFile = File.BaseName(sFile) + bStartup = sFile = $sStartup + + Endif + + Else If IsConnectionPath(sDir &/ sFile) Then + + If $hInfo.Components.Exist("gb.db") And If sExt = "connection" Then + sFile = File.BaseName(sFile) + Else + bIgnore = True + Endif + + Endif + + If Not bChecked Then + + If Right$(sFile) = "~" Then + bIgnore = True + Else If sDir = $sDir And If sExt = "gambas" Then + bIgnore = True + Endif + + Endif + + Endif + + If sExt = "mine" Or If Left(sExt) = "r" And IsDigit(Mid$(sExt, 2)) Then + If Exist(sDir &/ File.BaseName(sPath)) Then + bIgnore = True + Endif + Endif + + If Not $hTree.Exist(sParent) Then bIgnore = True + + If Not bIgnore Then + + hPict = GetFileIcon(sPath,, hStat,, bParentLink) + + If bAfter Then + With $hTree + .MoveTo(sParent) + .MoveChild + If Not bDir Then + While .Available + If Not IsDir(.Item.Key) Then Break + sAfter = .Item.Key + .MoveNext + Wend + Endif + While .Available + If String.Comp(.Item.Text, sFile, gb.IgnoreCase + gb.Natural) > 0 Then Break + If bDir And If Not IsDir(.Item.Key) Then Break + sAfter = .Item.Key + .MoveNext + Wend + End With + Endif + + If $hTree.Exist(sKey) Then + With $hTree[sKey] + .Text = sFile + .Picture = hPict + .Reparent(sParent) + End With + Else + $hTree.Add(sKey, sFile, hPict, sParent) + If bDir And If Not bSource Then + $hTree.Add(sKey & "/", "",, sKey) + bDir = False + Endif + Endif + + With $hTree[sKey] + + If bStartup Then + .Font = $hTree.Font + .Font.Underline = True + .Font.Bold = True + Else + .Font = Null + Endif + + If $bCurrentProject Then .Editable = Not Project.IsLocked(sKey) + If bAfter Then .MoveAfter(sAfter) + If bShow Then + $hTree.MoveTo(sKey) + $hTree.MoveParent + $hTree.Item.Expanded = True + Endif + + End With + + If $bCurrentProject Then Project.RefreshIcon(sKey) + + 'hForm = Files[sKey] + 'If hForm Then hForm.Icon = GetFileIcon(sKey, 16) + + Endif + + End With + + Return bDir + +End + +Private Procedure AddDir(Optional sDir As String) + + Dim cDir As New String[] + Dim sFile As String + Dim aFile As New String[] + + If sDir Then + cDir.Add(sDir) + Else + cDir.Add($sDir) + If $sDir <> $sSourceDir Then cDir.Add($sSourceDir) + Endif + + Repeat + + sDir = cDir[0] + cDir.Remove(0) + + If Not IsDir(sDir) Then Continue + + aFile.Clear + + '$bGetSource = FALSE + + For Each sFile In Dir(sDir, "*") + If IsDir(sDir &/ sFile) Then aFile.Add("D" & sFile) + Next + + For Each sFile In Dir(sDir, "*") + If Not IsDir(sDir &/ sFile) Then aFile.Add("F" & sFile) + Next + + aFile.Sort(gb.Natural) + + $aInheritance.Clear + + For Each sFile In aFile + + sFile = Mid$(sFile, 2) + If AddFile(sDir, sFile, True) Then cDir.Add(sDir &/ sFile) + 'AddFile(sDir, sFile, True) + + Next + + DoRefreshAfter + + Until cDir.Count = 0 + +End + +Private Sub FillTree(Optional bDoNotRefreshCache As Boolean) + + Dim sKey As String + 'Dim sKeyReset As String + + '$bDisplayForm = Settings["/DisplayForm"] + + For Each $cExtern + If Not Exist($cExtern.Key) Then $cExtern.Remove($cExtern.Key) + Next + + If Not bDoNotRefreshCache Then RefreshSources + + With $hTree + + .Clear() + + sKey = $sDir + .Add(sKey, File.Name($sDir), Project.GetIcon($sDir, 16)) + + .Add(KEY_PROJECT, ("Project"), Picture["icon:/small/directory"], sKey) + '.Add(KEY_MODULE, ("Modules"), Picture["icon:/small/directory"], sKey) + '.Add(KEY_CLASS, ("Classes"), Picture["icon:/small/directory"], sKey) + .Add(KEY_SOURCE, ("Sources"), Picture["icon:/small/directory"], sKey) + + If $hInfo.Components.Exist("gb.db") Then .Add(KEY_CONNECTION, ("Connections"), Picture["icon:/small/directory"], sKey) + If $hInfo.Components.Exist("gb.web") Then .Add(KEY_PUBLIC, ("Public"), Picture["icon:/small/directory"], sKey) + .Add(KEY_MISC, ("Data"), Picture["icon:/small/directory"], sKey) + + '$bGetSource = TRUE + + AddDir() + If Exist($sDir &/ ".hidden") Then AddDir($sDir &/ ".hidden") + If $hInfo.Components.Exist("gb.db") And If Exist($sDir &/ ".connection") Then AddDir($sDir &/ ".connection") + If $hInfo.Components.Exist("gb.web") And If Exist($sDir &/ ".public") Then AddDir($sDir &/ ".public") + + For Each sKey In $cExtern + AddFile(File.Dir(sKey), File.Name(sKey)) + Next + + End With + + With $hTree + .MoveFirst + While .Available + .Item.Expanded = True + .MoveNext + Wend + End With + + 'If sKeyReset Then sKey = sKeyReset + + 'SelectKey(sKey) + + 'DefineStartup(Startup, True) + + ' For Each sFamily In CFamily.List + ' If Not HasModule(sFamily) Then + ' For Each hFile In Files + ' sPath = Files.Key + ' If Not IsSourcePath(sPath) Then Continue + ' If Exist(File.SetExt(sPath, sFamily)) Then + ' Files.Remove(sPath) + ' hFile.Delete + ' Endif + ' Next + ' Endif + ' Next + +End + +Public Function FindPath(sClass As String) As String + + Dim sPath As String + + sPath = Sources[sClass] + If sPath Then Return sPath + + sPath = Sources[sClass & ".class"] + If sPath Then Return sPath + + sPath = Sources[sClass & ".module"] + If sPath Then Return sPath + + sPath = Sources[sClass & ".test"] + If sPath Then Return sPath + +End + +Public Sub FindKey(sClass As String) As String + + Dim hModule As CModule + + Dim sPath As String + + If Not sClass Then Return + + For Each hModule In CModule.All + sPath = Sources[sClass & "." & hModule.Key] + If sPath Then Return sPath + Next + + Return FindPath(sClass) + +End + +Public Sub RefreshSources() + + Dim sPath As String + Dim sName As String + + Sources = New Collection(gb.IgnoreCase) + + For Each sPath In RDir($sSourceDir, "*", gb.File + gb.Directory, True) + If CModule.Ext.Exist(File.Ext(sPath)) Then + sName = File.Name(sPath) + Sources[sName] = $sSourceDir &/ sPath + Endif + Next + +End + +Public Sub CheckDuplicates() As String[] + + Dim sPath As String + Dim cName As New Collection + Dim aList As New String[] + Dim sName As String + Dim sDup As String + + For Each sPath In RDir($sSourceDir, "*", gb.File, True) + sName = File.Name(sPath) + If sName Ends "~" Then Continue + sDup = cName[sName] + If Not sDup Then + cName[sName] = sPath + Else + If sDup <> "*" Then + aList.Add(sDup) + cName[sName] = "*" + Endif + aList.Add(sPath) + Endif + Next + + If aList.Count Then Return aList + +End + + +Private Sub IsConnectionPath(sPath As String) As Boolean + + Return sPath Begins $sDir &/ ".connection" &/ "/" + +End + +Private Sub DoRefreshAfter() + + Dim sKey As String + Dim iInd As Integer + Dim iCount As Integer + + If $aInheritance.Count = 0 Then Return + + Do + iCount = $aInheritance.Count + For iInd = 0 To iCount - 1 + sKey = $aInheritance[0] + $aInheritance.Remove(0) + AddFile(File.Dir(sKey), File.Name(sKey), True) + Next + If $aInheritance.Count >= iCount Then Break + Loop + + If $aInheritance.Count Then + For iInd = 0 To $aInheritance.Max + sKey = $aInheritance[iInd] + AddFile(File.Dir(sKey), File.Name(sKey), True, True) + $aInheritance[iInd] = File.BaseName(sKey) + Next + 'FMain.ShowError(("The following classes have circular inheritance:") & "\n\n" & $aRefreshAfter.Join(", ")) + $aInheritance.Clear + Endif + +End + +Public Sub Refresh(Optional bDoNotRefreshCache As Boolean, cFilter As Collection) + + Dim vLayout As Variant + + $cFilter = cFilter + vLayout = $hTree.Layout + FillTree(bDoNotRefreshCache) + $hTree.Layout = vLayout + +End + +Public Sub GetFileIcon(sPath As String, Optional iSize As Integer, hStat As Stat, bNoEmblem As Boolean, bParentLink As Boolean) As Picture + + Dim hImage As Image + Dim hPict As Picture + Dim sKey As String + Dim sCacheKey As String + Dim bLink As Boolean + Dim sIcon As String + Dim sExt As String + Dim bStartup As Boolean + Dim iFileSize As Long + Dim hFile As File + Dim sPrefix As String + 'Dim bNoStartup As Boolean + Dim bConflict As Boolean + Dim sModule As String + Dim sLocalPrefix As String + Dim bLocked As Boolean + Dim bAdded As Boolean + Dim hProject As CProjectInfo + Dim sLink As String + Dim bExported As Boolean + Dim fRapport As Float + Dim bDoNotTranslate As Boolean + Dim bModified As Boolean + Dim iEmblemSize As Integer + + If iSize Then + sPrefix = "icon:/" & iSize + sLocalPrefix = "img/" & iSize + Else + sPrefix = "icon:/small" + sLocalPrefix = "img/16" + Endif + + If Not hStat Then hStat = Stat(sPath) + With hStat + + bLink = .Type = gb.Link Or bParentLink + bConflict = False + If $bCurrentProject Then + bLocked = Project.IsLocked(sPath) + bAdded = Project.IsAdded(sPath) + bDoNotTranslate = Not Project.ShouldTranslate(sPath) + bModified = Project.IsModified(sPath) + If iSize = 0 Then iEmblemSize = 16 + Endif + '$bLastAdded = bAdded + + If IsDir(sPath) Then + + If bLink Then + sLink = Project.GetAbsoluteLink(sPath, .Link) + 'If Left(sLink) <> "/" Then sLink = sPath &/ sLink + sLink = File.Dir(sLink) + hProject = New CProjectInfo(sLink) + sIcon = hProject.GetIconPath() + If iSize = 0 Then iSize = 16 + Else + sIcon = sPrefix &/ "directory" + Endif + + Else + + 'bConflict = VersionControl.InConflict(sPath) + If $bCurrentProject Then bConflict = Project.IsConflict(sPath) + + sIcon = "" 'sPrefix &/ "file" + + sExt = File.Ext(sPath) + Select Case sExt + + Case "form", "class", "module", "test", "webpage", "report", "webform", "termform" + If IsSourcePath(sPath) Then + sModule = sExt + sIcon = sExt + 'bStartup = File.BaseName(sPath) = $sStartup 'And Not bNoStartup + bExported = Project.IsExported(sPath) + Endif + + Case "jpg", "jpeg", "xpm", "bmp", "png", "gif" + + If bLink Then + Try hFile = Open sPath + If Error Then + iFileSize = 0 + Else + iFileSize = Lof(hFile) + Close hFile + Endif + Else + iFileSize = .Size + Endif + + If iFileSize > Project.MAX_ICON_SIZE Then + sIcon = sPrefix &/ "image" + Else + sIcon = sPath + Endif + + Case "svg", "svgz" + sIcon = sPrefix &/ "vector" + + Case "htm", "html", "css" + sIcon = sPrefix &/ "html" + + Case "js" + sIcon = sPrefix &/ "script" + + Case "txt", "text" + sIcon = sPrefix &/ "text" + + Case "pdf" + sIcon = sPrefix &/ "pdf" + + Case "connection" + If Exist(File.SetExt(sPath, "template")) Then bExported = True + sIcon = sPrefix &/ "database" + + Case "console" + sIcon = sPrefix &/ "terminal" + + Case Else + Try hImage = DesktopMime.FromFile(sPath).GetIcon(If(iSize, iSize, 16)) + If hImage Then + sIcon = "//" + Else + sIcon = sPrefix &/ "file" + Endif + + End Select + + Endif + + End With + + If Left$(sIcon) = "/" Then + + If Not hImage Then Try hImage = Image.Load(sIcon) + + If hImage Then + + fRapport = hImage.Width / hImage.Height + If fRapport < 1 Then fRapport = 1 / fRapport + + If fRapport < 8 Then + + If iSize Then + hImage = hImage.Stretch(hImage.Width * iSize / hImage.Height, iSize) + Else + iSize = 32 + If hImage.Height > iSize Then + hImage = hImage.Stretch(hImage.Width * iSize / hImage.Height, iSize) + Endif + If hImage.Width > iSize Then + hImage = hImage.Stretch(iSize, hImage.Height * iSize / hImage.Width) + Endif + Endif + + Else + + hImage = Null + + Endif + + Endif + + If Not hImage Then hImage = Picture[sPrefix &/ "image"].Image + GoSub ADD_EMBLEM + hPict = hImage.Picture + + Else + + sKey = File.Dir(sIcon) &/ File.BaseName(sIcon) & "-" + If iSize Then + sKey &= CStr(iSize) & "-" + Else + sKey &= "16-" + Endif + + + If bLink Then sKey &= "l" + + If Not bNoEmblem Then + 'If bStartup Then sKey &= "s" + If bConflict Then sKey &= "c" + If bLocked Then sKey &= "k" + If bAdded Then sKey &= "a" + If bModified Then sKey &= "m" + If bExported Then sKey &= "x" + If bDoNotTranslate Then sKey &= "t" + Endif + + If Right(sKey) = "-" Then sKey = Left(sKey, -1) + sKey &= ".png" + + 'hPict = NULL + 'IF NOT bNoStartup THEN hPict = Picture[sKey] + + sCacheKey = Replace(sKey, "icon:/", "$/") + Try hPict = Picture[sCacheKey] + If Not hPict Then + + If sModule Then + hImage = Project.MakeModuleIcon(sModule, iSize, bStartup And Not bNoEmblem) + Else + Try hImage = Picture[sIcon].Image + If Error Then hImage = Picture[sPrefix &/ "file"].Image + Endif + 'If Not hPict Then hPict = Picture[sPrefix &/ "file"] + 'If Not hPict Then hPict = Picture["img/16/unknown.png"] + 'hPict = hPict.Copy() + + If iSize Then hImage = hImage.Stretch(hImage.Width * iSize / hImage.Height, iSize) + GoSub ADD_EMBLEM + hPict = hImage.Picture + Picture[sCacheKey] = hPict + + Endif + + Endif + + Return hPict + +ADD_EMBLEM: + + If bLink Then hImage = Project.AddLinkEmblem(hImage) + + If Not bNoEmblem Then + If bExported Then hImage = Project.AddEmblem(hImage, "img/32/exported.png", iEmblemSize) + If bDoNotTranslate Then hImage = Project.AddEmblem(hImage, "img/32/do-not-translate.png", iEmblemSize) + If bAdded Then hImage = Project.AddEmblem(hImage, "img/32/added.png", iEmblemSize) + If bModified Then hImage = Project.AddEmblem(hImage, "img/32/modified.png", iEmblemSize) + If bConflict Then hImage = Project.AddEmblem(hImage, "img/32/conflict.png", iEmblemSize) + If bLocked Then hImage = Project.AddEmblem(hImage, "icon:/32/lock", iEmblemSize) + Endif + + Return + +End + +Private Function IsSourcePath(sPath As String) As Boolean + + Dim sExt As String + + If $sSourceDir <> $sDir Then Return sPath & "/" Begins $sSourceDir &/ "/" + + If Left(sPath) = "/" Then + If File.Dir(sPath) <> $sSourceDir Then Return + Endif + + sExt = File.Ext(sPath) + If CModule.Ext.Exist(sExt) Then Return True + +End + +Public Sub TreeView_Expand() + + Dim sKey As String + Try sKey = $hTree.Item.Key + If Not sKey Then Return + If Left(sKey) = "$" Then Return + FillDir(sKey) + +End + +Public Sub TreeView_Collapse() + + Dim sKey As String = $hTree.Item.Key + + $bHasJustCollapsed = True + If Not sKey Then Return + If File.Dir(sKey) = $sDir And If Not IsDir(sKey) Then $hTree[sKey].Expanded = True + +End + +Public Sub TreeView_Select() + + 'RefreshMenu + + If $hTree.Current And If $hTree.Current.Children Then + ' Print Mouse.X ;; Mouse.Y ' generates crashes on random places, strange... + 'If Not tvwProject.Find(Mouse.X, Mouse.Y) Then + $bExpandOnMouseUp = True + 'Endif + Endif + +End + +Public Sub TreeView_MouseUp() + + If $bExpandOnMouseUp And If Not $bHasJustCollapsed Then + Try $hTree.Current.Expanded = True + Endif + $bExpandOnMouseUp = False + $bHasJustCollapsed = False + +End + + +Public Sub FillDir(sDir As String) + + If Not sDir Then Return + If Left(sDir) = "$" Then Return + If Not IsDir(sDir) Then Return + + $hTree.MoveTo(sDir) + If $hTree.MoveChild() Then Return + If $hTree.Item.Key <> sDir & "/" Then Return + + Inc Application.Busy + $hTree[sDir & "/"].Delete + AddDir(sDir) + Dec Application.Busy + +Catch + + Debug Error.Where; ": "; Error.Text + Dec Application.Busy + +End + +Public Sub EnsureKey(sKey As String) + + Dim sPath As String + Dim sElt As String + + If Not $hTree Then Return + + sPath = "/" + For Each sElt In Split(sKey, "/") + sPath &/= sElt + If $hTree.Exist(sPath) Then FillDir(sPath) + Next + +End + +Public Sub SelectKey(sKey As String) + + Dim hModule As CModule + Dim sBase As String + + If Not $hTree Then Return + + EnsureKey(sKey) + + If Not $hTree.Exist(sKey) Then + If Right$(sKey, 6) = ".class" Then + sBase = Left$(sKey, -6) + For Each hModule In CModule.All + sKey = sBase & "." & hModule.Key + If $hTree.Exist(sKey) Then Break + Next + Endif + Endif + + Try $hTree[sKey].Selected = True + Try $hTree[sKey].EnsureVisible + +End + +Public Sub FindForm(sClass As String) As String + + Dim sFamily As String + Dim sPath As String + + For Each sFamily In CFamily.List + sPath = Sources[sClass & "." & sFamily] + If Exist(sPath) Then Return sPath + Next + +End + +Public Function ExistForm(sClass As String) As Boolean + + Dim sFamily As String + + For Each sFamily In CFamily.List + If Sources.Exist(sClass & "." & sFamily) Then Return True + Next + +End + +Public Sub HasTest() As Boolean + + Dim sPath As String + + For Each sPath In Sources + If File.Ext(sPath) = "test" Then Return True + Next + +End + +Public Sub GetTestModules() As String[] + + Dim sPath As String + Dim aResult As New String[] + + For Each sPath In Sources + If File.Ext(sPath) = "test" Then aResult.Add(sPath) + Next + + aResult.Sort(gb.Natural) + Return aResult + +End + + +Private Sub RefreshInheritance() + + Dim sKey As String + + $aInheritance.Clear + + For Each sKey In Sources + If Not File.Ext(sKey) = "class" Then Continue + Try $hTree[sKey].Delete + $aInheritance.Add(sKey) + Next + + DoRefreshAfter + +End + +Private Sub GetOpenedItems(sParent As String) As String[] + + Dim iLevel As Integer + Dim aOpen As String[] + + aOpen = New String[] + + $hTree.MoveTo(sParent) + + Do + If Not $hTree.Available Then + Dec iLevel + If iLevel <= 0 Then Break + $hTree.MoveParent + $hTree.MoveNext + Else If $hTree.Item.Expanded Then + aOpen.Add($hTree.Item.Key) + Inc iLevel + $hTree.MoveChild() + Else + $hTree.MoveNext + Endif + Loop + + Return aOpen + +End + +Public Sub RefreshKey(sKey As String, Optional sOld As String) + + Dim aOpen As String[] + Dim sOpen As String + + If Not $hTree Then Return + If Not sKey Then Return + + If Not $hTree.Exist(sKey) And If Not Exist(sKey) And If IsSourcePath(sKey) Then + sKey = FindForm(File.BaseName(sKey)) + Endif + + If Not Exist(sKey) Then + Try $hTree.Remove(sKey) + Return + Endif + + If Not sOld Or If sOld = sKey Then + + EnsureKey(sKey) + AddFile(File.Dir(sKey), File.Name(sKey), True) + + Else + + aOpen = GetOpenedItems(sOld) + + EnsureKey(sOld) + Try $hTree[sOld].Delete + If Error Then Return + + If IsSourcePath(sKey) And If File.Ext(sKey) = "class" And If Not ExistForm(File.BaseName(sKey)) Then + RefreshInheritance + Else + If AddFile(File.Dir(sKey), File.Name(sKey), True) Then AddDir(sKey) + If Exist(sOld) Then + If AddFile(File.Dir(sOld), File.Name(sOld), True) Then AddDir(sOld) + Endif + Endif + + For Each sOpen In aOpen + If sOpen Begins sOld Then $hTree[sKey & Mid$(sOpen, Len(sOld) + 1)].Expanded = True + Next + + Endif + +End + +Public Sub AddExtern(sPath As String) + + $cExtern[sPath] = True + +End + +Public Sub ExistClass(sClass As String) As Boolean + + If Sources.Exist(sClass & ".class") Then Return True + If Sources.Exist(sClass & ".module") Then Return True + If Sources.Exist(sClass & ".test") Then Return True + +End + +Public Sub DefineStartup(sClass As String) As String + + If sClass <> $sStartup Then + Swap $sStartup, sClass + RefreshKey(FindKey(sClass)) + RefreshKey(FindKey($sStartup)) + Endif + + Return $sStartup + +End diff --git a/app/src/gambas3/.src/Project/Component/ComponentChooser.class b/app/src/gambas3/.src/Project/Component/ComponentChooser.class new file mode 100644 index 00000000..18854136 --- /dev/null +++ b/app/src/gambas3/.src/Project/Component/ComponentChooser.class @@ -0,0 +1,167 @@ +' Gambas class file + +Export + +Inherits UserControl + +Public Const _Properties As String = "*,Border=True" +Public Const _DefaultEvent As String = "Activate" +Public Const _DefaultSize As String = "36,36" +Public Const _Group As String = "Chooser" +Public Const _DrawWith As String = "DrawingArea" + +Public Enum Unchecked = 0, Checked = 1, GrayChecked = 2 + +Event Select +Event Activate + +Property Border As Boolean +'Property Components As String[] +Property Current As String +Property ShowDeprecated As Boolean +Property ShowCheckedOnly As Boolean +Property Checkable As Boolean +Property HiddenComponents As String[] +Property CheckedComponents As String[] +Property Libraries As String[] + +Private $hForm As FComponentChooser + +Public Sub _new() + + $hForm = New FComponentChooser(Me) + +End + + +Private Function Border_Read() As Boolean + + Return $hForm.HasBorder() + +End + +Private Sub Border_Write(Value As Boolean) + + $hForm.SetBorder(Value) + +End + +' Private Function Components_Read() As String[] +' +' Return $hForm.GetComponents() +' +' End +' +' Private Sub Components_Write(Value As String[]) +' +' $hForm.SetComponents(Value) +' +' End + +Private Function Current_Read() As String + + Return $hForm.GetCurrent() + +End + +Private Sub Current_Write(Value As String) + + $hForm.SetCurrent(Value) + +End + +Private Function ShowDeprecated_Read() As Boolean + + Return $hForm.GetShowDeprecated() + +End + +Private Sub ShowDeprecated_Write(Value As Boolean) + + $hForm.SetShowDeprecated(Value) + +End + +Private Function HiddenComponents_Read() As String[] + + Return $hForm.GetHiddenComponents() + +End + +Private Sub HiddenComponents_Write(Value As String[]) + + $hForm.SetHiddenComponents(Value) + +End + +Private Function Checkable_Read() As Boolean + + Return $hForm.IsCheckable() + +End + +Private Sub Checkable_Write(Value As Boolean) + + $hForm.SetCheckable(Value) + +End + +Public Sub SetFocus() + + $hForm.SetFocus + +End + +Private Function CheckedComponents_Read() As String[] + + Return $hForm.GetCheckedComponents() + +End + +Private Sub CheckedComponents_Write(Value As String[]) + + $hForm.SetCheckedComponents(Value) + +End + +Public Sub CheckSelection() As Boolean + + Return $hForm.CheckSelection() + +End + +Public Sub IsChecked(sComp As String) As Boolean + + Return $hForm.IsChecked(sComp) + +End + +Private Function ShowCheckedOnly_Read() As Boolean + + Return $hForm.GetShowCheckedOnly() + +End + +Private Sub ShowCheckedOnly_Write(Value As Boolean) + + $hForm.SetCheckedOnly(Value) + +End + +Public Sub HideBrowser() + + $hForm.HideBrowser + +End + +Private Function Libraries_Read() As String[] + + Return $hForm.GetLibraries() + +End + +Private Sub Libraries_Write(Value As String[]) + + $hForm.SetLibraries(Value) + +End diff --git a/app/src/gambas3/.src/Project/Component/FComponentChooser.class b/app/src/gambas3/.src/Project/Component/FComponentChooser.class new file mode 100644 index 00000000..4152534f --- /dev/null +++ b/app/src/gambas3/.src/Project/Component/FComponentChooser.class @@ -0,0 +1,824 @@ +' Gambas class file + +Public Struct ComponentChooserItem + Key As String + Checked As Boolean + Dependencies As String[] +End Struct + +Static Private Const DEFAULT_ZOOM As Float = 1 + +Static Private $aPict As Picture[] +Static Private $hPictLocked As Picture + +Private $aComp As String[] +Private $cComp As Collection + +Private $bShowDeprecated As Boolean +Private $aHidden As String[] +Private $iTooltipLastRow As Integer +Private $bShowCheckedOnly As Boolean +Private $aLibraries As New String[] +'Private $iRow As Integer = -1 + +' Private Sub GetParent() As ComponentChooser +' +' Return Me.Parent +' +' End + +Public Sub _new() + + Dim hBorder As Border + + hBorder = Border("style:none;bottom-style:solid;padding:2 0 0 8;") + hBorder.Color = Color.Gradient(Color.LightForeground, Color.TextBackground) + gvwComponent.Rows.Border = hBorder + 'gvwComponent.Padding = 4 + + gvwComponent.Columns.Count = 5 + gvwComponent.Columns[0].Width = 16 + 'gvwComponent.Columns[0].Expand = False + 'gvwComponent.Columns[1].Expand = False + gvwComponent.Columns[2].Expand = True + gvwComponent.Columns[3].Width = 24 + gvwComponent.Columns[4].Width = 24 + 'gvwComponent.Columns[3].Expand = False + + SetCheckable(False) + + RefreshList + + btnZoomNormal_Click + +End + +Private Sub RefreshList() + + Dim aComp As New String[] + Dim hComp As CComponent + Dim sComp As String + Dim sFilter As String + Dim I As Integer + + sFilter = txtFilter.Text + + For Each hComp In Project.Documentation.Components + + sComp = hComp.Key + If hComp.Hidden Then Continue + If hComp.Library Then Continue + If hComp.Key = CComponent.PROJECT_NAME Then Continue + If hComp.Key = Project.Name Then Continue + If $aHidden And If $aHidden.Exist(sComp) Then Continue + If sFilter And If Not hComp.Match(sFilter) Then Continue + + If $cComp Then + If Not IsChecked(sComp) Then + If $bShowCheckedOnly Then Continue + If hComp.State = CComponent.DEPRECATED And If Not $bShowDeprecated Then Continue + Endif + aComp.Add(If(IsChecked(sComp), "0", "1") & sComp) + Else + If hComp.State = CComponent.DEPRECATED And If Not $bShowDeprecated Then Continue + aComp.Add(sComp) + Endif + + Next + + If $cComp Then + For Each $cComp + + sComp = $cComp.Key + hComp = Project.Documentation.Components[sComp] + If hComp Then Continue + + If $cComp Then + If Not IsChecked(sComp) Then + If $bShowCheckedOnly Then Continue + Endif + aComp.Add(If(IsChecked(sComp), "0", "1") & sComp) + Else + aComp.Add(sComp) + Endif + + Next + Endif + + aComp.Sort(gb.Natural) + + If $cComp Then + For I = 0 To aComp.Max + aComp[I] = Mid$(aComp[I], 2) + Next + Endif + + SetComponents(aComp) + +End + + +Public Sub txtFilter_Filter() + + RefreshList + +End + +Public Sub btnForward_Click() + + webAboutComponent.Forward + +End + +Public Sub webAboutComponent_Click((Frame) As WebFrame) + + btnForward.Enabled = webAboutComponent.History.Index < webAboutComponent.History.Max + +End + +Public Sub btnStop_Click() + + webAboutComponent.Stop + +End + +Public Sub btnReload_Click() + + webAboutComponent.Reload + +End + +Public Sub btnZoomIn_Click() + + webAboutComponent.TextZoom = Round(webAboutComponent.TextZoom * 1.125, -3) + +End + +Public Sub btnZoomOut_Click() + + webAboutComponent.TextZoom = Round(webAboutComponent.TextZoom / 1.125, -3) + +End + +Public Sub btnZoomNormal_Click() + + webAboutComponent.TextZoom = DEFAULT_ZOOM + +End + + +Public Sub btnBack_Click() + + If webAboutComponent.History.Index Then + webAboutComponent.Back + Else + webAboutComponent.Stop + wizComponent.MovePrevious + Endif + +End + + +Private Sub SetComponents(Value As String[]) + + If Not Value Then Value = New String[] + $aComp = Value + + gvwComponent.UnSelectAll + gvwComponent.Rows.Count = $aComp.Count + 'gvwComponent.Columns[1].W = -1 + gvwComponent_Arrange + +End + +Public Sub gvwComponent_Data(Row As Integer, Column As Integer) + + Dim sComp As String = $aComp[Row] + Dim hComp As CComponent = Project.Documentation[sComp] + + If Not hComp Then hComp = CComponent.GetUnknown(sComp) + + With gvwComponent.Data + + If hComp.State = CComponent.UNSTABLE Then + .Foreground = Color.LightForeground + Else If hComp.State = CComponent.DEPRECATED Then + .Foreground = Color.LightForeground + .Font.Strikeout = True + Else If hComp.State = CComponent.Unknown Then + .Foreground = Color.LightForeground + .Font.Italic = True + Endif + + Select Case Column + + Case 0 + ' If $cComp Then + ' If sComp = "gb" Then + ' .Picture = $hPictLocked + ' Else + ' .Picture = $aPict[GetState(sComp)] + ' Endif + ' Endif + + Case 1 + .Text = hComp.Key & " " + .Font.Bold = True + + Case 2 + .WordWrap = True + .RichText = hComp.Name + + Case 3 + Select Case hComp.State + Case CComponent.STABLE_NOT_FINISHED + .Picture = Picture["img/component/unfinished.png"] + Case CComponent.UNSTABLE + .Picture = Picture["img/component/experimental.png"] + Case CComponent.STABLE + .Picture = Picture["img/component/finished.png"] + Case CComponent.DEPRECATED + .Picture = Picture["img/component/deprecated.png"] + 'Case CComponent.UNKNOWN + ' .Picture = Picture["img/component/unknown.png"] + End Select + + Case 4 + If hComp.State <> CComponent.UNKNOWN Then .Picture = Picture["icon:/16/next"] + + End Select + + .Alignment = Align.TopNormal + '.Background = If(Even(Row), Color.Gradient(Color.LightForeground, Color.TextBackground, 0.9), Color.TextBackground) + .Background = Color.Gradient(Color.LightForeground, Color.TextBackground, 0.96) + + End With + +End + +Public Function GetCurrent() As String + + Try Return $aComp[gvwComponent.Row] + +End + +Public Sub SetCurrent(Value As String) + + gvwComponent.Row = $aComp.Find(Value) + +End + +Public Sub gvwComponent_Arrange() + + Dim I As Integer + + gvwComponent.Columns[1].Width = -1 + + For I = 0 To $aComp.Max + gvwComponent.Rows[I].H = -1 + 'Debug I;; gvwComponent.Rows[I].H + Next + +End + +Public Sub HasBorder() As Boolean + + Return wizComponent.Border + +End + +Public Sub SetBorder(Value As Boolean) + + wizComponent.Border = Value + +End + + +Public Sub GetShowDeprecated() As Boolean + + Return $bShowDeprecated + +End + +Public Sub SetShowDeprecated(Value As Boolean) + + $bShowDeprecated = Value + RefreshList + +End + +Public Sub GetHiddenComponents() As String[] + + Return $aHidden + +End + +Public Sub SetHiddenComponents(Value As String[]) + + $aHidden = Value + RefreshList + +End + +' Private Sub SetCurrentRow(iRow As Integer) +' +' If iRow = $iRow Then Return +' +' If $iRow >= 0 Then gvwComponent.Rows[$iRow].Refresh +' $iRow = iRow +' If $iRow >= 0 Then gvwComponent.Rows[$iRow].Refresh +' +' End + +Public Sub gvwComponent_MouseMove() + + Dim hComp As CComponent + Dim sText As String + Dim iCol As Integer + Dim iRow As Integer + + iRow = gvwComponent.RowAt(Mouse.ScreenY - gvwComponent.ScreenY - gvwComponent.ClientY) + iCol = gvwComponent.ColumnAt(Mouse.ScreenX - gvwComponent.ScreenX - gvwComponent.ClientX) + If iCol < 0 Then iRow = -1 + + If iCol >= 3 Then Try hComp = Project.Documentation[$aComp[iRow]] + + If iCol = 3 Then + + If hComp Then + Select Case hComp.State + Case CComponent.STABLE_NOT_FINISHED + sText = ("Not finished but stable") + Case CComponent.UNSTABLE + sText = ("Experimental") + Case CComponent.STABLE + sText = ("Stable") + Case CComponent.DEPRECATED + sText = ("Deprecated") + End Select + Else + sText = "" + Endif + + If $iTooltipLastRow <> iRow Then + gvwComponent.Tooltip = sText + $iTooltipLastRow = iRow + Endif + + Else + + gvwComponent.Tooltip = "" + $iTooltipLastRow = -1 + + Endif + + If iCol = 4 And If hComp Then + gvwComponent.Mouse = Mouse.Pointing + Else + gvwComponent.Mouse = Mouse.Default + Endif + + 'SetCurrentRow(iRow) + +End + +Public Sub IsCheckable() As Boolean + + Return $cComp + +End + +Public Sub SetCheckable(Value As Boolean) + + gvwComponent.Columns[0].W = If(Value, 32, 8) + + If Value Then + + If Not $aPict Then + $aPict = New Picture[3] + $aPict[ComponentChooser.Unchecked] = Picture["img/16/unchecked.png"] + $aPict[ComponentChooser.Checked] = Picture["img/16/checked.png"] + $aPict[ComponentChooser.GrayChecked] = Picture["img/16/checked-gray.png"] + $hPictLocked = Picture["img/16/checked-lock.png"] + Endif + + $cComp = New Collection + + Else + + $cComp = Null + + Endif + +End + + +Private Sub GetState(sComp As String) As Integer + + Dim hComp As ComponentChooserItem + + If sComp = "gb" Then Return ComponentChooser.Checked + + hComp = $cComp[sComp] + + If hComp Then + If hComp.Checked Then Return ComponentChooser.Checked + If hComp.Dependencies.Count Then Return ComponentChooser.GrayChecked + Endif + +End + +Public Sub IsChecked(sComp As String) As Boolean + + Return GetState(sComp) + +End + + +Public Sub gvwComponent_Leave() + + gvwComponent.Tooltip = "" + 'SetCurrentRow(-1) + +End + +Public Sub gvwComponent_Enter() + + $iTooltipLastRow = -1 + gvwComponent_MouseMove + +End + +Public Sub SetFocus() + + txtFilter.SetFocus + +End + +Public Sub gvwComponent_Click() + + Dim sComp As String = GetCurrent() + + If gvwComponent.Column = 0 And IsCheckable() Then + + sComp = $aComp[gvwComponent.Row] + If sComp = "gb" Then Return + If Not Project.Documentation.Exist(sComp) Then Return + + Select Case GetState(sComp) + Case ComponentChooser.Checked + UncheckComponent(sComp) + Case Else + CheckComponent(sComp) + End Select + + Else If gvwComponent.Column = 4 And If Project.Documentation.Exist(sComp) Then + + MHelp.InitWebViewWith(webAboutComponent, MHelp.TYPE_COMPONENT, GetCurrent(),, "v&nh") + webAboutComponent.Zoom = Settings["/Help/Zoom", 80] / 100 + wizComponent.MoveNext + + Endif + + ' For Each sDep In GetRequire(hCompItem.Key) + ' If hCompItem.Value Then + ' $cComp[sDep].Check(hCompItem.Key) + ' Else + ' $cComp[sDep].Uncheck(hCompItem.Key) + ' Endif + ' Next + +End + +Private Sub GetRequire(sComp As String) As String[] + + Dim hComp As CComponent = Project.Documentation[sComp] + + If hComp Then + Return hComp.Require + Else + Return New String[] + Endif + +End + +Public Sub CheckComponent(sComp As String, Optional sParent As String) + + Dim hComp As ComponentChooserItem + Dim sDep As String + + If sComp = "gb" Then Return + + hComp = $cComp[sComp] + If Not hComp Then + hComp = New ComponentChooserItem + hComp.Key = sComp + hComp.Dependencies = New String[] + $cComp[sComp] = hComp + Endif + + If sParent Then + hComp.Dependencies.Add(sParent) + Else + hComp.Checked = True + Endif + + For Each sDep In GetRequire(sComp) + CheckComponent(sDep, sComp) + Next + + gvwComponent.Refresh + +End + +Private Sub GetDependencies(hComp As ComponentChooserItem, Optional bLib As Boolean) As String[] + + Dim aDep As New String[] + Dim sComp As String + + For Each sComp In hComp.Dependencies + + If Not sComp Then Continue + If Left(sComp) = "/" Then + aDep.Add(File.Name(sComp)) + Else If Not bLib Then + aDep.Add(sComp) + Endif + + Next + + Return aDep + +End + +Public Sub UncheckComponent(sComp As String, Optional sParent As String) As Boolean + + Dim hComp As ComponentChooserItem + Dim sMsg As String + Dim aDep As String[] + Dim sDep As String + + If sComp = "gb" Then Return + + hComp = $cComp[sComp] + If Not hComp Then Return + + If sParent Then + If hComp.Dependencies.Exist(sParent) Then + hComp.Dependencies.Remove(hComp.Dependencies.Find(sParent)) + Return + Endif + Endif + + aDep = GetDependencies(hComp, True) + + If aDep.Count Then + If aDep.Count = 1 Then + sMsg = Subst(("This component is required by the following library:

      &1"), "" & aDep[0] & "") + Else + sMsg = Subst(("This component is required by the following libraries:

      &1"), "" & aDep.Join(", ") & "") + Endif + Message.Warning(sMsg) + Return True + Endif + + aDep = GetDependencies(hComp) + If aDep.Count Then + + sMsg = Subst(("This component is required by:

      &1"), "" & aDep.Join(", ") & "") + If Message.Warning(sMsg, ("Keep"), ("Remove all")) = 2 Then + + For Each sDep In aDep + UncheckComponent(sDep) + Next + + Endif + + aDep = GetDependencies(hComp) + + Endif + + If aDep.Count = 0 Then + $cComp.Remove(sComp) + Else + hComp.Checked = False + Endif + + For Each sDep In GetRequire(sComp) + hComp = $cComp[sDep] + hComp.Dependencies.Remove(hComp.Dependencies.Find(sComp)) + If hComp.Dependencies.Count = 0 And If Not hComp.Checked Then UncheckComponent(sDep) + Next + + gvwComponent.Refresh + +End + + + +Public Sub SetCheckedComponents(aComp As String[]) + + Dim sComp As String + + $cComp.Clear + $aLibraries.Clear + + CheckComponent("gb") + For Each sComp In aComp + CheckComponent(sComp) + Next + RefreshList + +End + +Public Sub GetCheckedComponents() As String[] + + Dim hComp As ComponentChooserItem + Dim aComp As New String[] + + For Each hComp In $cComp + If hComp.Key <> "gb" Then aComp.Add(hComp.Key) + Next + + Return aComp.Sort() + +End + +Public Sub CheckSelection() As Boolean + + Dim aComp As New String[] + Dim hComp As CComponent + Dim sComp As String + Dim aExclude As String[] + Dim aNeed As String[] + Dim sImpl As String + Dim sExcl As String + Dim sNeed As String + Dim bFound As Boolean + + aComp = GetCheckedComponents() + + For Each sComp In aComp + + aNeed = New String[] + aExclude = New String[] + + For Each sImpl In Project.Documentation[sComp].Implement + + For Each hComp In Project.Documentation.Components + + If hComp.Key = sComp Then Continue + If hComp.Implement.Find(sImpl) >= 0 Then + If Not aComp.Exist(hComp.Key) Then Continue + If aExclude.Find(hComp.Key) < 0 Then aExclude.Add(hComp.Key) + Endif + + Next + + Next + + For Each sExcl In Project.Documentation[sComp].Exclude + If Not aComp.Exist(sExcl) Then Continue + If Not aExclude.Exist(sExcl) Then aExclude.Add(sExcl) + Next + + ' IF aExclude.Count = 1 THEN + ' Message.Warning(Subst(("The &2 component is incompatible with the &1 component."), "" & sComp & "", "" & aExclude[0] & "")) + ' RETURN TRUE + ' ELSE IF aExclude.Count > 1 THEN + ' Message.Warning(Subst(("These components are incompatible with the &1 component:\n&2"), "" & sComp & "", "" & aExclude.Join(", ") & "")) + ' RETURN TRUE + ' ENDIF + + If aExclude.Count Then + Message.Warning(Subst(("These components are incompatible:
      &1."), "" & sComp & ", " & aExclude.Join(", ") & "")) + Return True + Endif + + For Each sNeed In Project.Documentation[sComp].Need + bFound = False + For Each hComp In Project.Documentation.Components + If hComp.Implement.Exist(sNeed) Then + If Not aNeed.Exist(hComp.Key) Then aNeed.Add(hComp.Key) + If aComp.Exist(hComp.Key) Then bFound = True + Endif + Next + If Not bFound Then + Message.Warning(Subst(("The &1 component needs one of the following components:
      &2."), "" & sComp & "", "" & aNeed.Join(", ") & "")) + Return True + Endif + Next + + For Each sNeed In Project.Documentation[sComp].Require + If Not aComp.Exist(sNeed) Then + Message.Warning(Subst(("The &1 component needs the &2 component."), "" & sComp & "", "" & sNeed & "")) + Return True + Endif + Next + + Next + +End + +Public Sub GetCheckedOnly() As Boolean + + Return $bShowCheckedOnly + +End + +Public Sub SetCheckedOnly(Value As Boolean) + + $bShowCheckedOnly = Value + RefreshList + +End + +Public Sub HideBrowser() + + wizComponent.Index = 0 + +End + +Public Sub SetLibraries(Value As String[]) + + Dim sLib As String + Dim hLibInfo As CLibraryInfo + Dim sDep As String + + If Not Value Then Value = New String[] + If Value.Join("\n") = $aLibraries.Join("\n") Then Return + + For Each sLib In $aLibraries + hLibInfo = CLibraryInfo[sLib] + For Each sDep In hLibInfo.Require + UncheckComponent(sDep, sLib) + Next + Next + + $aLibraries = Value.Copy() + + For Each sLib In $aLibraries + hLibInfo = CLibraryInfo[sLib] + For Each sDep In hLibInfo.Require + CheckComponent(sDep, sLib) + Next + Next + +End + +Public Sub GetLibraries() As String[] + + Return $aLibraries + +End + + +Public Sub gvwComponent_Scroll() + + gvwComponent_MouseMove + +End + +Public Sub gvwComponent_Draw(X As Integer, Y As Integer, Width As Integer, Height As Integer, Row As Integer, Column As Integer) + + Dim sComp As String = $aComp[Row] + Dim DX As Integer + + 'Dim hComp As CComponent = CComponent.All[sComp] + + If Not IsCheckable() Then Return + + Select Case Column + + Case 0 + + DX = (Width - 16) \ 2 + X += DX + Y += DX + 'Y += (gvwComponent.Rows.Height - gvwComponent.Padding * 2 - 16) \ 2 + Width = 16 + Height = 16 + + Style.PaintBox(X - 2, Y - 2, Width + 4, Height + 4) + + If sComp = "gb" Or If Not Project.Documentation.Exist(sComp) Then + Paint.DrawPicture(Picture["img/16/checked-lock.png"], X, Y) + Else + Select Case GetState(sComp) + Case ComponentChooser.Checked + Paint.DrawPicture(Picture["img/16/checked.png"], X, Y) + Case ComponentChooser.GrayChecked + Paint.DrawPicture(Picture["img/16/checked-gray.png"], X, Y) + Case ComponentChooser.Unchecked + End Select + Endif + + End Select + +End + +Public Sub btnDeprecated_Click() + + SetShowDeprecated(btnDeprecated.Value) + +End diff --git a/app/src/gambas3/.src/Project/Component/FComponentChooser.form b/app/src/gambas3/.src/Project/Component/FComponentChooser.form new file mode 100644 index 00000000..b28cb9d2 --- /dev/null +++ b/app/src/gambas3/.src/Project/Component/FComponentChooser.form @@ -0,0 +1,107 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,84,85) + Text = ("Select a component") + Arrangement = Arrange.Fill + { wizComponent Wizard + MoveScaled(1,1,82,56) + Background = Color.TextBackground + Expand = True + Arrangement = Arrange.Vertical + Count = 2 + ShowTitle = False + ShowButton = False + Index = 0 + Text = ("") + { Panel1 HBox + MoveScaled(3,3,59,3) + { txtFilter ButtonBox + MoveScaled(0,0,41,3) + Foreground = Color.LightForeground + Expand = True + Border = False + Button = False + ClearButton = True + Filter = True + } + { btnDeprecated ToolButton + MoveScaled(49,0,3,3) + ToolTip = ("Show deprecated components") + Picture = Picture["img/component/deprecated.png"] + Toggle = True + } + } + { Separator4 Separator + MoveScaled(29,9,21,0) + } + { gvwComponent GridView + MoveScaled(7,13,67,38) + Expand = True + Border = False + Mode = Select.Single + Grid = False + } + Index = 1 + Text = ("") + { panHelp VBox + MoveScaled(0,0,81,18) + Background = Color.TextBackground + Expand = True + { Panel8 HBox + MoveScaled(1,0,79,4) + { btnBack Button + MoveScaled(0,0,4,4) + Picture = Picture["icon:/small/previous"] + Border = False + } + { btnForward Button + MoveScaled(4,0,4,4) + Picture = Picture["icon:/small/next"] + Border = False + } + { btnStop ToolButton + MoveScaled(8,0,4,4) + ToolTip = ("Cancel") + Picture = Picture["icon:/small/delete"] + } + { btnReload ToolButton + MoveScaled(12,0,4,4) + ToolTip = ("Reload") + Picture = Picture["icon:/small/refresh"] + } + { Separator10 Separator + MoveScaled(17,0,0,4) + Visible = False + } + { btnZoomIn ToolButton + MoveScaled(18,0,4,4) + ToolTip = ("Zoom in") + Picture = Picture["icon:/small/zoom-in"] + } + { btnZoomOut ToolButton + MoveScaled(22,0,4,4) + ToolTip = ("Zoom out") + Picture = Picture["icon:/small/zoom-out"] + } + { btnZoomNormal ToolButton + MoveScaled(26,0,4,4) + ToolTip = ("No zoom") + Picture = Picture["icon:/small/zoom-normal"] + } + { Panel3 Panel + MoveScaled(51,0,7,4) + Expand = True + } + } + { Separator2 Separator + MoveScaled(0,9,24,0) + } + { webAboutComponent HelpView + MoveScaled(4,10,46,7) + Expand = True + } + } + Index = 0 + } +} diff --git a/app/src/gambas3/.src/Project/Component/FSelectComponent.class b/app/src/gambas3/.src/Project/Component/FSelectComponent.class new file mode 100644 index 00000000..560e29ea --- /dev/null +++ b/app/src/gambas3/.src/Project/Component/FSelectComponent.class @@ -0,0 +1,24 @@ +' Gambas class file + +Private $sCurrent As String + +Public Sub Run(aHide As String[]) As String + + choComponent.HiddenComponents = aHide + If Me.ShowDialog() Then Return $sCurrent + +End + + +Public Sub btnCancel_Click() + + Me.Close + +End + +Public Sub btnOK_Click() + + $sCurrent = choComponent.Current + Me.Close(True) + +End diff --git a/app/src/gambas3/.src/Project/Component/FSelectComponent.form b/app/src/gambas3/.src/Project/Component/FSelectComponent.form new file mode 100644 index 00000000..5fa24d83 --- /dev/null +++ b/app/src/gambas3/.src/Project/Component/FSelectComponent.form @@ -0,0 +1,30 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,86,87) + Text = ("Select a component") + Persistent = True + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + { choComponent ComponentChooser + MoveScaled(2,3,57,44) + Expand = True + } + { HBox1 HBox + MoveScaled(2,54,80,4) + Spacing = True + { Panel1 Panel + MoveScaled(33,1,2,4) + Expand = True + } + { btnOK Button + MoveScaled(41,0,18,4) + Text = ("OK") + } + { btnCancel Button + MoveScaled(60,0,18,4) + Text = ("Cancel") + } + } +} diff --git a/app/src/gambas3/.src/Project/Conversion/FConvert.class b/app/src/gambas3/.src/Project/Conversion/FConvert.class new file mode 100644 index 00000000..79ea06e4 --- /dev/null +++ b/app/src/gambas3/.src/Project/Conversion/FConvert.class @@ -0,0 +1,56 @@ +' Gambas class file + +Static $iLevel As Integer + +Public Sub Start(sMsg As String) + + Inc Application.Busy + Inc $iLevel + Me.Show + SetMessage(sMsg) + +End + +Public Sub SetMessage(sMsg As String) + + lblConvert.Text = sMsg + pgbConvert.Value = 0 + Wait + +End + +Public Sub SetProgress(fValue As Float) + + pgbConvert.Value = fValue + Wait + +End + +Public Sub Stop() + + If $iLevel = 0 Then Return + + Dec Application.Busy + Dec $iLevel + If $iLevel = 0 Then + Me.Hide + Else + pgbConvert.Value = 1 + Wait + Endif + +End + +Public Sub StopAll() + + $iLevel = 1 + Stop() + +End + + +Public Sub Form_Open() + + Me.Center + +End diff --git a/app/src/gambas3/.src/Project/Conversion/FConvert.form b/app/src/gambas3/.src/Project/Conversion/FConvert.form new file mode 100644 index 00000000..7d309af0 --- /dev/null +++ b/app/src/gambas3/.src/Project/Conversion/FConvert.form @@ -0,0 +1,22 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,53,13) + Text = ("Gambas 3 project conversion") + Resizable = False + Spacing = True + Margin = True + { PictureBox1 PictureBox + MoveScaled(1,1,11,11) + Picture = Picture["icon:/128/wizard"] + Stretch = True + } + { lblConvert TextLabel + MoveScaled(14,1,38,7) + Font = Font["Bold,+3"] + Expand = True + } + { pgbConvert ProgressBar + MoveScaled(14,9,38,3) + } +} diff --git a/app/src/gambas3/.src/Project/Conversion/MConvert.module b/app/src/gambas3/.src/Project/Conversion/MConvert.module new file mode 100644 index 00000000..944e37c0 --- /dev/null +++ b/app/src/gambas3/.src/Project/Conversion/MConvert.module @@ -0,0 +1,819 @@ +' Gambas module file + +Private $aLine As String[] +Private $sId As String +Private $hForm As FEditor + +Private $aIsType As String[] = ["IsBoolean", "IsByte", "IsShort", "IsInteger", "IsLong", "IsSingle", "IsFloat", "IsDate", "IsString", "IsObject"] + +Private $aTestFunc As String[] = + ["Boolean?", "Byte?", "Short?", "Integer?", "Long?", "Single?", "Float?", "Date?", "String?", "Object?", "Number?", "Null?", "Dir?", + "Ascii?", "Letter?", "LCase?", "Lower?", "UCase?", "Upper?", "Digit?", "Hexa?", "Space?", "Blank?", "Punct?"] + + +Private Sub AddDeclarationToClass(sPath As String, sDeclare As String) + + Dim aLine As String[] + + aLine = Split(File.Load(sPath), "\n") + aLine.Add("", 1) + aLine.Add(sDeclare, 2) + If aLine[3] Then aLine.Add("", 3) + File.Save(sPath, aLine.Join("\n")) + +End + + +Private Sub ConvertForm(sPath As String) + + Dim hFile As File + Dim sFullLine, sLine As String + Dim sClass As String + Dim aCoord As String[] + Dim fW, fH As Float + Dim iIndent As Integer + Dim sVal As String + Dim aVal As String[] + Dim sName As String + Dim sGroup As String + Dim iLevel As Integer + Dim cVirtualPos As New Collection + Dim sNewClass As String + Dim sProp As String + Dim sValue As String + Dim aScan As String[] + + $aLine = New String[] + hFile = Open sPath + Line Input #hFile, sFullLine + If sFullLine = Project.FORM_MAGIC Then Return + $aLine.Add(Project.FORM_MAGIC) + While Not Eof(hFile) + Line Input #hFile, sFullLine + sLine = LTrim(sFullLine) + iIndent = Len(sFullLine) - Len(sLine) + sLine = RTrim(sLine) + 'If Left(sLine) = "#" Then sLine = Mid$(sLine, 2) + + If Left(sLine) = "{" Then + + aVal = Split(Mid$(sLine, 2), " ", "", True) + sName = aVal[0] + sClass = aVal[1] + sGroup = "" + Try sGroup = aVal[2] + 'If Left(sClass) = "#" Then sClass = Mid$(sClass, 2) + + If sClass = "#TrayIcon" Then + + AddDeclarationToClass(File.SetExt(sPath, "class"), + If(Project.ControlPublic, "Public", "Private") & " " & sName & " As TrayIcon = New TrayIcon As " & Quote(If(sGroup, sGroup, sName))) + + Repeat + Line Input #hFile, sFullLine + Until Trim(sFullLine) = "}" + Continue + + Endif + + If sClass = "URLLabel" Then + sNewClass = "Label" + Else If sClass = "WebBrowser" Then + sNewClass = "WebView" + Else If sClass = "ColorBox" Then + sNewClass = "ColorButton" + Else + sNewClass = sClass + Endif + + sFullLine = "{ " & sName & " " & sNewClass & " " & sGroup + + Inc iLevel + cVirtualPos[iLevel] = 0 + + Else If sLine = "}" + Dec iLevel + Else If sLine Begins "MoveScaled(" Then + aCoord = Split(Mid$(sLine, 12, -1)) + If aCoord.Count = 4 Then + fW = CFloat(aCoord[2]) + fH = CFloat(aCoord[3]) + If fW <= 3 Then Inc fW + If fH <= 3 Then Inc fH + sFullLine = "MoveScaled(" & aCoord[0] & "," & aCoord[1] & "," & CStr(fW) & "," & CStr(fH) & ")" + Endif + Else If sLine Begins "'Move" Then + Continue + Else + + aScan = Scan(sLine, "* = *") + sProp = "" + Try sProp = aScan[0] + Try sValue = aScan[1] + + If sProp = "Border" Then + If sClass = "Form" Then + Select Case Trim(Scan(sLine, "*=*")[1]) + Case "Window.None" + sFullLine = "Border = False" + Case "Window.Resizable" + Continue + Case "Window.Fixed" + sFullLine = "Resizable = False" + End Select + Endif + Else If sProp == "ToolBox" Then + If sClass = "Form" Then + sFullLine = "Utility = " & sValue + Endif + Else If sLine Begins "List = " & Chr$(34) Then + If sClass = "ListBox" Or If sClass = "ComboBox" Then + sVal = UnQuote$(Trim(Mid$(sLine, 7))) + aVal = Split(sVal, "\n") + sFullLine = "List = " & CControl.StringArrayPropertyToString(aVal, True) + Endif + Else If sLine = "Text = (\"\")" Then + Continue + Else If sLine = "#(Scaled) = False" Then + sFullLine = "#Scaled = False" + Else If sProp = "URL" Then + If sClass = "URLLabel" Then Continue + Else If sProp = "#X" Then + sFullLine = "#MoveScaled(" & cVirtualPos[iLevel - 1] & "," & cVirtualPos[iLevel - 1] & ")" + Inc cVirtualPos[iLevel - 1] + Else If sProp = "#Y" Then + Continue + Else If sProp = "Padding" Then + If sClass <> "Label" And If sClass <> "TextLabel" Then + sFullLine = "Margin = True" + If CInt(sValue) <= 4 Then + sFullLine &= "\nPadding = " & sValue + Endif + Endif + Else If sProp = "Spacing" Then + sFullLine = "Spacing = True" + Else If sProp = "Arrangement" Then + If sValue = "LeftRight" Then + sFullLine = "Arrangement = Arrange.Row" + Else If sValue = "TopBottom" Then + sFullLine = "Arrangement = Arrange.Column" + Endif + Else If sClass = "WebBrowser" Then + If ["Java", "JavaScript", "Path", "Plugins", "Zoom"].Exist(sProp) Then Continue + Else If sClass = "ValueBox" Then + If sProp = "MaxLength" Then Continue + Endif + Endif + + For Each sFullLine In Split(sFullLine, "\n") + If Left(sFullLine) <> " " And If iIndent > 0 Then sFullLine = Space$(iIndent) & sFullLine + $aLine.Add(sFullLine) + Next + + Wend + + File.Save(sPath, $aLine.Join("\n")) + +End + +' Private Sub CheckAnalyze(aCheck As String[]) As Boolean +' +' Dim I, J As Integer +' Dim aSym As String[] = Highlight.Symbols +' Dim bNot As Boolean +' Dim bTest As Boolean +' +' Highlight.Analyze(sLine) +' +' Do +' If J >= aSym.Count And If I >= aCheck.Count Then Return False +' If J >= aSym.Count Or If I >= aCheck.Count Then Return True +' +' sCheck = aCheck[I] +' If Left(sCheck) = "!" Then +' bTest = Not (aSym[J] Like Mid$(sCheck, 2)) +' Else +' bTest = aSym[J] Like sCheck +' Endif +' +' If bTest Then +' Inc I +' Else +' J -= I +' I = 0 +' Endif +' Inc J +' Loop +' +' End + + +Private Sub CheckArrayInstanciation(sLine As String) As String + + Dim aSym As String[] + Dim iPos As Integer + Dim iInd As Integer + + aSym = Highlight.Analyze(sLine, True) + + If aSym.Count < 6 Then Return + If Not ["DIM", "PRIVATE", "PUBLIC"].Exist(aSym[0], gb.IgnoreCase) Then Return + + iInd = 1 + + Do + If iInd > aSym.Max Then Return + If Highlight.Types[iInd] <> Highlight.Symbol Then Return + Inc iInd + If aSym[iInd] = "," Then + Inc iInd + Continue + Endif + If aSym[iInd] == "AS" Then + Inc iInd + Break + Endif + Return + Loop + + If iInd > (aSym.Max - 2) Then Return + + If Highlight.Types[iInd] <> Highlight.DataType Then Return + If aSym[iInd + 1] <> "[" Then Return + If aSym[iInd + 2] = "]" Then Return + + iPos = InStr(sLine, "AS " & aSym[iInd], 1, gb.IgnoreCase) + sLine = Left(sLine, iPos - 1) & "As New " & Mid$(sLine, iPos + 3) + + $sId = "ARRD" + Return sLine + +Catch + +End + +Private Sub CheckOpen(sLine As String) As String + + Dim aSym As String[] + Dim iPos As Integer + Dim sVar As String + Dim sTry As String + + aSym = Highlight.Analyze(sLine, True) + + If aSym.Count < 5 Then Return + + If UCase(aSym[iPos]) = "TRY" Then + sLine = Trim(Mid$(sLine, 4)) + sTry = "Try " + Inc iPos + Endif + If UCase(aSym[iPos]) <> "OPEN" Then Return + + iPos = InStr(sLine, " AS ", 1, gb.IgnoreCase) + If iPos = 0 Then Return + + sVar = Mid$(sLine, iPos + 4) + If Left(sVar) = "#" Then sVar = Trim(Mid$(sVar, 2)) + sLine = sTry & sVar & " = " & Left(sLine, iPos - 1) + + $sId = "OPEN" + Return sLine + +Catch + +End + +Private Sub FindRightBrace(aSym As String[], iPos As Integer) As Integer + + Dim iLevel As Integer + + While iPos < aSym.Count + Select Case aSym[iPos] + Case ")", "]" + Dec iLevel + If iLevel = 0 Then Return iPos + Case "(", "[" + Inc iLevel + End Select + Inc iPos + Wend + + Return -1 + +End + +Private Sub CheckQuestionMark(sLine As String) As String + + Dim aSym As String[] + Dim I As Integer + Dim bFound As Boolean + + aSym = Highlight.Analyze(sLine, True) + + For I = aSym.Max - 1 DownTo 0 + If $aTestFunc.Exist(aSym[I], gb.IgnoreCase) And aSym[I + 1] = "(" Then + sLine = String.Left(sLine, Highlight.Positions[I]) & "Is" & Left(aSym[I], -1) & String.Mid$(sLine, Highlight.Positions[I + 1] + 1) + bFound = True + Endif + Next + + If Not bFound Then Return + + $sId = "QUES" + Return sLine + +Catch + +End + + +Private Sub CheckIsType(sLine As String) As String + + Dim aSym As String[] + Dim I, J As Integer + Dim bFound As Boolean + + aSym = Highlight.Analyze(sLine, True) + + For I = aSym.Max DownTo 0 + If $aIsType.Exist(aSym[I], gb.IgnoreCase) Then + J = FindRightBrace(aSym, I + 1) + If J < 0 Then Continue + sLine = String.Left(sLine, Highlight.Positions[I]) & "TypeOf" & String.Mid$(sLine, Highlight.Positions[I + 1] + 1, Highlight.Positions[J] - Highlight.Positions[I + 1] + 1) & " = gb." & Mid$(aSym[I], 3) & " " & String.Mid$(sLine, Highlight.Positions[J] + 2) + bFound = True + Else If aSym[I] == "IsNumber" Then + J = FindRightBrace(aSym, I + 1) + If J < 0 Then Continue + sLine = String.Left(sLine, Highlight.Positions[I]) & "TypeOf" & String.Mid$(sLine, Highlight.Positions[I + 1] + 1, Highlight.Positions[J] - Highlight.Positions[I + 1] + 1) & " <= gb.Float " & String.Mid$(sLine, Highlight.Positions[J] + 2) + bFound = True + Endif + Next + + If Not bFound Then Return + + $sId = "ISTY" + Return sLine + +Catch + +End + +Private Sub CheckQuoteShell(sLine As String) As String + + Dim aSym As String[] + Dim I As Integer + Dim bFound As Boolean + + aSym = Highlight.Analyze(sLine, True) + + For I = aSym.Max - 3 DownTo 0 + If aSym[I] = "Quote" And If aSym[I + 1] = "." And If aSym[I + 2] = "Shell" And If aSym[I + 3] = "(" Then + sLine = String.Left$(sLine, Highlight.Positions[I]) & "Shell$" & String.Mid$(sLine, Highlight.Positions[I + 3] + 1) + bFound = True + Endif + Next + + If Not bFound Then Return + + $sId = "QUOT" + Return sLine + +End + +Private Sub FindClassSymbol(sClass As String, sSymbol As String, aSym As String[], aType As Integer[], I As Integer, Optional bAllowAnonymous As Boolean) As Boolean + + Dim sType As String + Dim hClass As CClassInfo + + If aSym[I] == sSymbol And If aSym[I - 1] = "." Then + + sType = $hForm.GetExpressionType(aSym.Copy(0, I - 1), aType.Copy(0, I - 1), True) + + If Not sType Then + If bAllowAnonymous Then + sType = sClass + Else + Return + Endif + Endif + + If sType <> sClass Then + hClass = Project.Documentation.Classes[sType] + If Not hClass Then Return + If Not hClass.Inherits(sClass) Then Return + Endif + + Return True + + Endif + +End + + +Private Sub CheckReplaceClassSymbol(sId As String, sLine As String, sClass As String, sSymbol As String, sNewSymbol As String, Optional bAllowAnonymous As Boolean) As String + + Dim aSym As String[] + Dim I As Integer + Dim aPos As Integer[] + Dim aType As Integer[] + Dim sRest As String + + aSym = Highlight.Analyze(sLine, False).Copy() + aType = Highlight.Types.Copy() + aPos = Highlight.Positions.Copy() + + For I = aSym.Max DownTo 1 + + If FindClassSymbol(sClass, sSymbol, aSym, aType, I, bAllowAnonymous) Then + + sRest = String.Mid$(sLine, aPos[I] + Len(sSymbol) + 1) + If sId = "FNTH" And If sRest Begins "()" Then sRest = "(\"\")" & Mid$(sRest, 3) + sLine = String.Left$(sLine, aPos[I]) & sNewSymbol & sRest + $sId = sId + Return sLine + + Endif + + Next + +End + +Private Sub CheckUdpSocketBind(sId As String, sLine As String) As String + + Dim aSym As String[] + Dim I As Integer + Dim aPos As Integer[] + Dim aType As Integer[] + Dim sRest As String + + aSym = Highlight.Analyze(sLine, False).Copy() + aType = Highlight.Types.Copy() + aPos = Highlight.Positions.Copy() + + For I = aSym.Max DownTo 1 + + If FindClassSymbol("UdpSocket", "Bind", aSym, aType, I) Then + + sRest = String.Mid$(sLine, aPos[I] + Len("Bind") + 1) + If Left(sRest) <> "(" Then Return + If Mid$(sRest, 2, 1) = ")" Then Return + + sLine = String.Left$(sLine, aPos[I]) & "Port = " & Mid$(sRest, 2, -1) & "\n" & String.Left$(sLine, aPos[I] + Len("Bind")) & "()" + $sId = sId + Return sLine + + Endif + + Next + +End + + +Private Sub CheckSplitterLayout(sId As String, sLine As String) As String + + Dim aSym As String[] + Dim I As Integer + Dim aPos As Integer[] + Dim aType As Integer[] + Dim iPos As Integer + Dim iStart As Integer + + aSym = Highlight.Analyze(sLine, False).Copy() + aType = Highlight.Types.Copy() + aPos = Highlight.Positions.Copy() + + For I = aSym.Max DownTo 1 + + If FindClassSymbol("HSplit", "Layout", aSym, aType, I) Or If FindClassSymbol("VSplit", "Layout", aSym, aType, I) Then + + If I <= (aSym.Max - 2) And If aSym[I + 1] = "=" And InStr(String.Left(sLine, aPos[I]), "(") = 0 Then ' Assignment detection badly done + + If UCase(aSym[I + 2]) <> "SPLIT" Then + sLine = String.Left$(sLine, aPos[I + 1]) & " = Split(" & String.Mid$(sLine, aPos[I + 2] + 1) & ", \",\")" + $sId = sId + Return sLine + Endif + + Else + + If I <= (aSym.Max - 3) And If aSym[I + 1] = ")" And If aSym[I + 2] = "." And If UCase(aSym[I + 3]) = "JOIN" Then Continue + + iStart = FEditor.ExpressionStart + iPos = aPos[I] + Len("Layout") + + sLine = String.Left$(sLine, aPos[iStart]) & "String[](" & String.Mid$(sLine, aPos[iStart] + 1, iPos - aPos[iStart]) & ").Join(\",\")" & String.Mid$(sLine, iPos + 1) + $sId = sId + Return sLine + + Endif + + Endif + + Next + +End + + +Private Sub CheckReplaceFunction(sId As String, sLine As String, sFunc As String, sNewFunc As String) As String + + Dim aSym As String[] + Dim I As Integer + Dim bFound As Boolean + Dim aPos As Integer[] + Dim sRest As String + + aSym = Highlight.Analyze(sLine, False) + aPos = Highlight.Positions + + For I = 1 To aSym.Max - 1 + + If aSym[I] == sFunc And If aSym[I + 1] = "(" Then + + sRest = Mid$(sLine, aPos[I] + Len(sFunc) + 1) + 'If sId = "FNTH" And If sRest Begins "()" Then sRest = "(\"\")" & Mid$(sRest, 3) + sLine = Left$(sLine, aPos[I]) & sNewFunc & sRest + bFound = True + + aSym = Highlight.Analyze(sLine, False) + aPos = Highlight.Positions + + Endif + + Next + + If Not bFound Then Return + + $sId = sId + Return sLine + +End + +Private Sub CheckPublicProperty(sLine As String) As String + + Dim aSym As String[] + Dim iPos As Integer + Dim bStatic As Boolean + Dim bPublic As Boolean + + aSym = Highlight.Analyze(sLine, True) + + If aSym.Count < 5 Then Return + + For iPos = 0 To 3 + If UCase(aSym[iPos]) = "PUBLIC" Then + bPublic = True + Continue + Endif + If UCase(aSym[iPos]) = "STATIC" Then + bStatic = True + Continue + Endif + Break + Next + + If Not bPublic Then Return + If UCase(aSym[iPos]) <> "PROPERTY" Then Return + + $sId = "PPRO" + iPos = InStr(sLine, "PROPERTY ", 1, gb.IgnoreCase) + sLine = "Property " & Mid$(sLine, iPos + 9) + If bStatic Then sLine = "Static " & sLine + Return sLine + +Catch + +End + +Private Sub CheckNewKeyword(sLine As String) As String + + Dim aSym As String[] + Dim iPos As Integer + Dim bRepl As Boolean + + Do + + aSym = Highlight.Analyze(sLine, True) + + iPos = aSym.Find("ON", gb.IgnoreCase) + If iPos < 0 Then Break + + iPos = Highlight.Positions[iPos] + sLine = Left$(sLine, iPos) & "{On}" & Mid$(sLine, iPos + 3) + bRepl = True + + Loop + + If bRepl Then + $sId = "KEYW" + Return sLine + Endif + +End + +Private Sub CheckEventAs(sLine As String) As String + + Dim aSym As String[] + + aSym = Highlight.Analyze(sLine) + + If aSym.Count <= 3 Then Return + + If aSym[0] == "EVENT" And If aSym[aSym.Max - 1] = "AS" Then + $sId = "EVAS" + sLine = Left$(sLine, Highlight.Positions[aSym.Max - 1] - 1) + Return sLine + Endif + + +End + + +Private Sub ConvertClass(sPath As String) + + Dim sLine As String + Dim hEditor As TextEditor + Dim iLine As Integer + Dim sNewLine As String + Dim sIndent As String + Dim aLine As String[] + Dim iInd As Integer + + $aLine = New String[] + + $hForm = Project.LoadFile(sPath) + hEditor = $hForm.GetEditor() + + For iLine = 0 To hEditor.Count - 1 + + hEditor.Goto(0, iLine) + sLine = hEditor[iLine].Text + + If Left(LTrim(sLine)) <> "'" Then + + sIndent = hEditor.GetIndent(iLine) + sLine = Trim(sLine) + + Do + + $sId = "" + + sNewLine = CheckArrayInstanciation(sLine) + If sNewLine Then Goto NEW_LINE + + sNewLine = CheckOpen(sLine) + If sNewLine Then Goto NEW_LINE + + sNewLine = CheckQuestionMark(sLine) + If sNewLine Then Goto NEW_LINE + + sNewLine = CheckIsType(sLine) + If sNewLine Then Goto NEW_LINE + + sNewLine = CheckQuoteShell(sLine) + If sNewLine Then Goto NEW_LINE + + sNewLine = CheckReplaceClassSymbol("FNTH", sLine, "Font", "Height", "TextHeight") + If sNewLine Then Goto NEW_LINE + + sNewLine = CheckReplaceClassSymbol("FNTW", sLine, "Font", "Width", "TextWidth") + If sNewLine Then Goto NEW_LINE + + sNewLine = CheckReplaceClassSymbol("BCOL", sLine, "Control", "BackColor", "Background", True) + If sNewLine Then Goto NEW_LINE + + sNewLine = CheckReplaceClassSymbol("FCOL", sLine, "Control", "ForeColor", "Foreground", True) + If sNewLine Then Goto NEW_LINE + + sNewLine = CheckReplaceClassSymbol("BCOL", sLine, ".GridViewData", "BackColor", "Background", True) + If sNewLine Then Goto NEW_LINE + + sNewLine = CheckReplaceClassSymbol("FCOL", sLine, ".GridViewData", "ForeColor", "Foreground", True) + If sNewLine Then Goto NEW_LINE + + sNewLine = CheckReplaceClassSymbol("BCOL", sLine, "Draw", "BackColor", "Background", True) + If sNewLine Then Goto NEW_LINE + + sNewLine = CheckReplaceClassSymbol("FCOL", sLine, "Draw", "ForeColor", "Foreground", True) + If sNewLine Then Goto NEW_LINE + + sNewLine = CheckReplaceClassSymbol("DBGV", sLine, "DataBrowser", "GridView", "View") + If sNewLine Then Goto NEW_LINE + + sNewLine = CheckReplaceClassSymbol("TEXT", sLine, "gb", "Text", "IgnoreCase") + If sNewLine Then Goto NEW_LINE + + sNewLine = CheckReplaceFunction("CSNG", sLine, "CSng", "CSingle") + If sNewLine Then Goto NEW_LINE + + sNewLine = CheckReplaceFunction("CLNG", sLine, "CLng", "CLong") + If sNewLine Then Goto NEW_LINE + + sNewLine = CheckReplaceFunction("CFLT", sLine, "CFlt", "CFloat") + If sNewLine Then Goto NEW_LINE + + sNewLine = CheckUdpSocketBind("BIND", sLine) + If sNewLine Then Goto NEW_LINE + + sNewLine = CheckSplitterLayout("SLAY", sLine) + If sNewLine Then Goto NEW_LINE + + sNewLine = CheckPublicProperty(sLine) + If sNewLine Then Goto NEW_LINE + + sNewLine = CheckNewKeyword(sLine) + If sNewLine Then Goto NEW_LINE + + sNewLine = CheckEventAs(sLine) + If sNewLine Then Goto NEW_LINE + + $aLine.Add(sIndent & sLine) + Break + + NEW_LINE: + + $aLine.Add(sIndent & "' [GB2:" & $sId & "] " & sLine) + '$aLine.Add(sIndent & sNewLine) + + If InStr(sNewLine, "\n") Then + aLine = Split(sNewLine, "\n") + For iInd = 0 To aLine.Max - 1 + $aLine.Add(sIndent & aLine[iInd]) + Next + sNewLine = aLine[aLine.Max] + Endif + + sLine = sNewLine + + Loop + + Else + + $aLine.Add(sLine) + + Endif + + Next + + File.Save(sPath, $aLine.Join("\n")) + $hForm.Delete + $hForm = Null + Project.Files[sPath] = Null + +'Catch + +' Print Error.Where; ": "; Error.Text + +End + + +Public Sub ConvertFile(sPath As String) + + Select Case File.Ext(sPath) + + Case "module", "class" + ConvertClass(sPath) + Case "form" + ConvertForm(sPath) + + End Select + +End + +Public Sub ConvertComponent(sComp As String) As String[] + + Dim aComp As String[] + Dim iInd As Integer + Dim hComp As CComponent + + Select Case sComp + Case "gb.qt" + aComp = ["gb.qt4"] + Case "gb.qt.ext" + aComp = ["gb.qt4.ext"] + Case "gb.qt.kde.html" + aComp = ["gb.qt4.webkit"] + Case "gb.gtk.svg" + aComp = New String[] + Case "gb.image" + aComp = ["gb.image.effect"] + Default + aComp = [sComp] + End Select + + While iInd < aComp.Count + + hComp = Project.Documentation[aComp[iInd]] + If hComp Then + For Each sComp In hComp.Require + If Not aComp.Exist(sComp) Then aComp.Add(sComp) + Next + Endif + Inc iInd + + Wend + + Return aComp + +End + diff --git a/app/src/gambas3/.src/Project/FArguments.class b/app/src/gambas3/.src/Project/FArguments.class new file mode 100644 index 00000000..cd520c35 --- /dev/null +++ b/app/src/gambas3/.src/Project/FArguments.class @@ -0,0 +1,156 @@ +' Gambas class file + +Static Public Sub Run() As Boolean + + Return Not FArguments.ShowDialog() + +End + +Private Sub FromArgs(aArg As String[]) As String + + Dim I As Integer + Dim sArg As String + + If Not aArg Then Return + + aArg = aArg.Copy() + For I = 0 To aArg.Max + sArg = aArg[I] + If InStr(sArg, " ") Or If InStr(sArg, "\"") Or If Not sArg Then aArg[I] = Quote(sArg) + Next + + Return aArg.Join(" ") + +End + + +Public Sub Form_Open() + + Project.SetEditorFont(lstArg) + FillList + lstArg.Index = lstArg.Find(FromArgs(Project.CurrentArgument)) + +End + +Private Sub FillList() + + Dim aArg As String[] + + lstArg.Clear + For Each aArg In Project.Arguments + lstArg.Add(FromArgs(aArg)) + Next + + lstArg.SetFocus() + +End + +Private Sub ToArgs(sStr As String) As String[] + + Dim aArg As String[] + Dim I As Integer + Dim sCar As String + Dim sCurrent As String + Dim bEscape As Boolean + Dim bQuote As Boolean + + aArg = New String[] + sStr &= " " + + For I = 1 To Len(sStr) + + sCar = Mid$(sStr, I, 1) + sCurrent &= sCar + + If bEscape Then + bEscape = False + Continue + Endif + + If sCar = "\\" Then + bEscape = True + Continue + Endif + + If bQuote Then + If sCar = Chr$(34) Then + bQuote = False + GoSub ADD_ARGUMENT + Endif + Continue + Endif + + If sCar = Chr$(34) Then + bQuote = True + Continue + Endif + + If sCar = " " Then + GoSub ADD_ARGUMENT + Endif + + Next + + Return aArg + +ADD_ARGUMENT: + + sCurrent = Trim(sCurrent) + If Not sCurrent Then Return + If sCurrent Begins Chr$(34) Then sCurrent = UnQuote(sCurrent) + aArg.Add(sCurrent) + sCurrent = "" + Return + +End + +Private Sub SaveArgs() + + Dim aArgs As New String[][] + Dim aList As String[] + Dim I As Integer + + aList = lstArg.List + + For I = 0 To aList.Max + aArgs.Add(ToArgs(aList[I])) + Next + + Project.Arguments = aArgs + Project.CurrentArgument = ToArgs(lstArg.Text) + Project.WriteProject(True) + +End + +Public Sub btnRun_Click() + + 'Dim hTextBox As TextBox = lstArg.Editor + 'Design.Arguments = ToArgs(hTextBox.Text) + Me.Close(True) + +End + +Public Sub btnCancel_Click() + + Me.Close() + +End + +Public Sub Form_Close() + + SaveArgs() + +End + + +Public Sub lstArg_Activate() + + btnRun.Value = True + +End + +Public Sub btnUndo_Click() + + FillList + +End diff --git a/app/src/gambas3/.src/Project/FArguments.form b/app/src/gambas3/.src/Project/FArguments.form new file mode 100644 index 00000000..7d25ec43 --- /dev/null +++ b/app/src/gambas3/.src/Project/FArguments.form @@ -0,0 +1,37 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,112,38) + Text = ("Run with arguments") + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + { lstArg ListEditor + MoveScaled(1,2,73,25) + Expand = True + Unique = True + } + { HBox1 HBox + MoveScaled(10,30,64,4) + Spacing = True + { btnUndo Button + MoveScaled(1,0,16,4) + Text = ("Reset") + Picture = Picture["icon:/small/undo"] + } + { Spring1 Spring + MoveScaled(19,1,6,2) + } + { btnRun Button + MoveScaled(26,0,16,4) + Text = ("Run") + Picture = Picture["icon:/small/play"] + } + { btnCancel Button + MoveScaled(43,0,16,4) + Text = ("Close") + Picture = Picture["icon:/small/close"] + Cancel = True + } + } +} diff --git a/app/src/gambas3/.src/Project/FCreateFile.class b/app/src/gambas3/.src/Project/FCreateFile.class new file mode 100644 index 00000000..61a95803 --- /dev/null +++ b/app/src/gambas3/.src/Project/FCreateFile.class @@ -0,0 +1,355 @@ +' Gambas class file + +Private $sPath As String +Private $sDir As String +Private $sType As String +Private $bDoNotSetName As Boolean + +Public Sub Run(sPath As String, sDir As String, sType As String) + + $sPath = sPath + $sDir = sDir + $sType = sType + If Not Me.ShowModal() Then Return + +End + +Public Sub btnCancel_Click() + + Me.Close + +End + +Private Sub UpdateLayout() + + Dim sPrefix As String + Dim hChild As Control + Dim bOpt As Boolean + + sPrefix = $sType + For Each hChild In panOption.Children + If Not hChild.Tag Then Continue + hChild.Visible = Split(hChild.Tag, ",").Exist(sPrefix) + bOpt = bOpt Or hChild.Visible + Next + + Select Case $sType + Case "image" + txtWidth.Value = Settings["/FCreateFile/ImageWidth", 8] + txtHeight.Value = Settings["/FCreateFile/ImageHeight", 8] + cmbImageType.Text = Settings["/FCreateFile/ImageType", "PNG"] + End Select + + lblOption.Visible = bOpt + + If Not $bDoNotSetName Then + sPrefix = UCase(Left(sPrefix)) & Mid(sPrefix, 2) + Object.Lock(txtName) + Select Case LCase(sPrefix) + Case "text", "image", "html", "css", "js" + txtName.Text = Project.GetNewName(sPrefix, $sDir) + Case Else + txtName.Text = Project.GetNewName(sPrefix) + End Select + 'txtName.SelectAll + Object.Unlock(txtName) + Endif + + txtName.SelectAll + txtName.SetFocus + +End + +Public Sub Form_Open() + + Dim hPict As Picture + + $bDoNotSetName = False + + 'Settings.Read(Me) + + If Project.IsSourceDir($sDir) Then + + hPict = Project.MakeModuleIcon($sType, 64).Picture + + Else + + Select Case $sType + Case "css" + hPict = Picture["icon:/64/html"] + Case "js" + hPict = Picture["icon:/64/script"] + Case Else + Try hPict = Picture["icon:/64/" & $sType] + If Error Then hPict = Picture["icon:/64/text"] + End Select + + Endif + + picFile.Picture = hPict + + cmbParent.List = Project.GetClassesOnly() + cmbParent.Add(("(No parent)"), 0) + If Project.IsSourcePath($sPath) Then + cmbParent.Text = Project.GetParentClass($sPath) + Endif + If cmbParent.Index < 0 Then cmbParent.Index = 0 + + If Not $sType Then $sType = "module" + UpdateLayout + +End + +Public Sub txtWidth_Change() + + If btnLinked.Value Then txtHeight.Value = txtWidth.Value + +End + +Public Sub txtHeight_Change() + + If btnLinked.Value Then txtWidth.Value = txtHeight.Value + +End + +Public Sub txtName_Change() + + $bDoNotSetName = txtName.Text + +End + +Private Sub CreateFile() As Boolean + + Dim sType As String = $sType + Dim sName As String = Trim(txtName.Text) + Dim sMsg As String + Dim sTemp As String + Dim hImage As Image + + Select Case sType + + Case "image" + Settings["/FCreateFile/ImageWidth"] = txtWidth.Value + Settings["/FCreateFile/ImageHeight"] = txtHeight.Value + Settings["/FCreateFile/ImageType"] = cmbImageType.Text + + End Select + + Select Case sType + + Case "text", "image", "html", "css", "js" + + If sName And If chkExt.Value Then + If sType = "image" Then + sName = File.SetExt(sName, LCase(cmbImageType.Text)) + Else If sType = "html" Or If sType = "css" Or If sType = "js" Then + sName = File.SetExt(sName, sType) + Endif + Endif + + sMsg = Project.CheckFileName(sName, $sDir) + If sMsg Then + txtName.SetFocus + Balloon.Warning(sMsg, txtName) + Return True + Endif + + Case Else + + sMsg = Project.CheckClassName(sName, True) + If sMsg Then + txtName.SetFocus + Balloon.Warning(sMsg, txtName) + Return True + Endif + + End Select + + Select Case sType + + Case "module" + + sTemp = "' Gambas module file\n\n" + + Project.InsertSource(sName, sType, $sDir, sTemp) + + Case "test" + + sTemp = "' Gambas test file\n\n" + + Project.InsertSource(sName, sType, $sDir, sTemp) + + Case "class" + + sTemp = "' Gambas class file\n\n" + + If chkExport.Value Then sTemp &= "Export\n" + + If chkCreateStatic.Value Then + sTemp &= "Create Static\n" + Else If chkCreatePrivate.Value Then + sTemp &= "Create Private\n" + Endif + + If cmbParent.Index > 0 Then sTemp &= "Inherits " & cmbParent.Text & "\n" + sTemp = RTrim(sTemp) & "\n" + + Project.InsertSource(sName, sType, $sDir, sTemp) + + Case "form", "report", "webform", "termform" + + sTemp = "' Gambas class file\n\n" + + If sType = "webform" Then + sTemp &= "Export\n\n" + Endif + + If chkDialog.Value Then + sTemp &= "Public Sub Run() As Boolean\n\n" + "\tReturn Not Me.ShowModal()\n\n" + "End\n\n" + "Public Sub btnOK_Click()\n\n" + "\tMe.Close(TRUE)\n\n" + "End\n\n" + "Public Sub btnCancel_Click()\n\n" + "\tMe.Close\n\n" + "End\n\n" + sTemp = Replace(sTemp, "\t", Space$(Project.TabSize)) + Endif + + Project.InsertSource(sName, "class", $sDir, sTemp, True, True) + + sTemp = Project.FORM_MAGIC & "\n\n" & + "{ " & sName & " " & CFamily.Get(sType).Name & "\n" + + If sType = "form" Then + + sTemp &= " MoveScaled(0,0,64,64)\n" + + If chkDialog.Value Then + sTemp &= " Resizable = False\n" + " Arrangement = Arrange.Vertical\n" + " Spacing = True\n" + " Margin = True\n" + sTemp &= "{ HBox1 HBox\n" + " MoveScaled(1,59,62,4)\n" + " Spacing = True\n" + " { Panel1 Panel\n" + " MoveScaled(4,0,4,4)\n" + " Expand = True\n" + " }\n" + " { btnOK Button\n" + " MoveScaled(29,0,16,4)\n" + " Text = (\"OK\")\n" + " Default = True\n" + " }\n" + " { btnCancel Button\n" + " MoveScaled(46,0,16,4)\n" + " Text = (\"Cancel\")\n" + " Cancel = True\n" + " }\n" + "}\n" + Endif + + Else + + sTemp &= " #MoveScaled(0,0,64,91)\n" + + Endif + + sTemp &= "}\n" + + Project.InsertSource(sName, sType, $sDir, sTemp) + + Case "webpage" + + Project.InsertSource(sName, "class", $sDir, "' Gambas class file\n\n", True, True) + Project.InsertSource(sName, "webpage", $sDir, "\n\n<%\nPrint \"

      Gambas

      \";\n%>\n\n\n") + + Case "text" + + File.Save($sDir &/ sName, "") + Inc FMain.NoMessage + Project.InsertFile(sName, $sDir) + Dec FMain.NoMessage + + Case "html" + + File.Save($sDir &/ sName, "\n\n\n\n\n\n\n\n\n") + Project.InsertFile(sName, $sDir) + + Case "css" + + File.Save($sDir &/ sName, "BODY\n{\n}\n") + Project.InsertFile(sName, $sDir) + + Case "js" + + File.Save($sDir &/ sName, "// " & sName & "\n\nfunction foo()\n{\n}\n") + Project.InsertFile(sName, $sDir) + + Case "image" + + hImage = New Image(txtWidth.Value, txtHeight.Value) + If cmbImageType.Text = "JPEG" Then + hImage.Fill(Color.White) + Else + hImage.Fill(Color.Transparent) + Endif + hImage.Save($sDir &/ sName) + + Project.InsertFile(sName, $sDir) + + End Select + +End + +Public Sub btnOK_Click() + + If CreateFile() Then Return + Me.Close(True) + +Catch + + FMain.NoMessage = 0 + FMain.ShowError(("Cannot add file.") & "\n\n" & Error.Text & "\n" & Error.Where) + +End + +' Public Sub Form_Close() +' +' Settings.Write(Me) +' +' End + + +Public Sub panType_Arrange() + + Dim hPictureBox As PictureBox = Last.Children[0] + hPictureBox.W = hPictureBox.H + +End + +Public Sub panOption_Arrange() + + Dim hChild As Control + Dim H As Integer + + For Each hChild In panOption.Children + If hChild.Visible Then H = Max(H, hChild.Y + hChild.H) + Next + panNewFile.H = H + Desktop.Scale * 2 + +End + +Public Sub chkCreatePrivate_Click() + + If chkCreatePrivate.Value Then chkCreateStatic.Value = False + +End + +Public Sub chkCreateStatic_Click() + + If chkCreateStatic.Value Then chkCreatePrivate.Value = False + +End diff --git a/app/src/gambas3/.src/Project/FCreateFile.form b/app/src/gambas3/.src/Project/FCreateFile.form new file mode 100644 index 00000000..231d67ff --- /dev/null +++ b/app/src/gambas3/.src/Project/FCreateFile.form @@ -0,0 +1,155 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,64,74) + Text = ("New file") + Icon = Picture["icon:/small/new"] + Resizable = False + Arrangement = Arrange.Vertical + AutoResize = True + Spacing = True + Margin = True + { panNewFile Panel + MoveScaled(1,1,60,67) + Arrangement = Arrange.Horizontal + Spacing = True + { picFile PictureBox + MoveScaled(2,1,9,9) + } + { panOption VBox + MoveScaled(13,1,42,63) + Expand = True + Spacing = True + { Label9 Label + MoveScaled(0,0,25,3) + Font = Font["Bold"] + Text = ("Name") + } + { txtName TextBox + MoveScaled(0,3,26,4) + } + { lblOption Label + MoveScaled(0,7,25,3) + Font = Font["Bold"] + Text = ("Options") + } + { panImageOption Panel + MoveScaled(0,11,32,14) + Tag = "image" + { Label7 Label + MoveScaled(0,0,12,4) + Text = ("Width") + } + { txtWidth SpinBox + MoveScaled(13,0,10,4) + MinValue = 1 + MaxValue = 1024 + Step = 8 + Value = 8 + } + { Label8 Label + MoveScaled(0,5,12,4) + Text = ("Height") + } + { txtHeight SpinBox + MoveScaled(13,5,10,4) + MinValue = 1 + MaxValue = 1024 + Step = 8 + Value = 8 + } + { btnLinked ToggleButton + MoveScaled(28,0,3,9) + Picture = Picture["img/32/linked.png"] + Value = True + } + { Label11 Label + MoveScaled(0,10,11,4) + Text = ("Type") + } + { cmbImageType ComboBox + MoveScaled(13,10,18,4) + #Translate = False + ReadOnly = True + List = ["PNG", "JPEG", "XPM", "GIF"] + } + { Label13 Label + MoveScaled(24,0,4,4) + #Translate = False + Text = "px" + } + { Label14 Label + MoveScaled(24,5,4,4) + #Translate = False + Text = "px" + } + } + { panFormOption VBox + MoveScaled(0,28,41,4) + Tag = "form" + { chkDialog CheckBox + MoveScaled(0,0,30,4) + Text = ("Dialog box management") + } + } + { Panel2 VBox + MoveScaled(0,33,42,17) + Tag = "class" + Spacing = True + { Panel1 HBox + MoveScaled(0,0,43,4) + Spacing = True + { Label10 Label + MoveScaled(0,0,15,4) + AutoResize = True + Text = ("Parent class") + } + { cmbParent ComboBox + MoveScaled(17,0,25,4) + Expand = True + ReadOnly = True + } + } + { chkExport CheckBox + MoveScaled(0,5,39,3) + Expand = True + Text = ("Exported") + } + { chkCreateStatic CheckBox + MoveScaled(0,9,39,3) + Expand = True + Text = ("Automatic instance") + } + { chkCreatePrivate CheckBox + MoveScaled(0,13,39,3) + Expand = True + Text = ("Not creatable") + } + } + { Panel3 VBox + MoveScaled(0,55,41,4) + Tag = "image,html,css,js" + { chkExt CheckBox + MoveScaled(0,0,36,4) + Text = ("Automatic extension") + Value = CheckBox.True + } + } + } + } + { HBox6 HBox + MoveScaled(1,69,60,4) + Spacing = True + Invert = True + { btnCancel Button + MoveScaled(45,0,15,4) + Text = ("Cancel") + Cancel = True + } + { btnOK Button + MoveScaled(29,0,15,4) + Text = ("OK") + Default = True + } + } +} diff --git a/app/src/gambas3/.src/Project/FCreateProject.class b/app/src/gambas3/.src/Project/FCreateProject.class new file mode 100644 index 00000000..008d1d46 --- /dev/null +++ b/app/src/gambas3/.src/Project/FCreateProject.class @@ -0,0 +1,255 @@ +' Gambas class file + +Static Public InAnotherWindow As Boolean + +Static Private $sPath As String + +Static Private $bRepository As Boolean +Static Private $bAnother As Boolean + +Static Private $hTemplate As CProjectList +Static Private $sTemplate As String + +Static Public Sub Run(Optional bAnother As Boolean) As String + + $bAnother = bAnother + Inc Application.Busy + If Me.ShowModal() Then Return $sPath + +End + +Public Sub Form_Open() + + dchProject.Bookmarks = Project.GetBookmarks() + + 'dchProject.SelectedPath = Settings["/FCreateProject/Path", System.User.Home] + Settings.Read(Me) + wizProject.Index = 0 + edtOutput.ReadConfig + edtOutput.Text = "" + chkOther.Visible = $bAnother + Settings.Read(dchProject, "dchProject") + + ProjectBox.ShowButton = False + $hTemplate = New CProjectList(svwTemplate, txtFilter, CProjectList.TYPE_TEMPLATE, Arrange.Row) As "ProjectItem" + $hTemplate.Fill + $hTemplate.ApplyFilter(txtFilter.Text) + txtFilter.SetFocus + + $sTemplate = "" + + Dec Application.Busy + +End + +Public Sub wizProject_Cancel() + + Me.Close + +End + +Public Sub ProjectItem_Click(sPath As String, (bAnother) As Boolean) + + $sTemplate = sPath + Balloon.Hide + +End + +Public Sub ProjectItem_DblClick((sPath) As String) + + wizProject.MoveNext + +End + +Private Sub CreateProject() As Boolean + + Dim sDir As String + Dim sName As String + Dim sPath As String + Dim bErr As Boolean + Dim hFile As File + Dim hDest As File + Dim sLine As String + Dim sTemp As String + + 'DIM hIcon AS Picture + + If $bRepository Then + + sPath = Trim(txtRepository.Text) + If Right(sPath) = "/" Then sPath = Left(sPath, -1) + + sDir = dchProject.SelectedPath + edtOutput.ReadOnly = False + bErr = VersionControl.CheckoutSVN(sPath, sDir, edtOutput) + edtOutput.ReadOnly = True + + If bErr Then Error.Raise(("Project checkout has failed.")) + + sDir &/= File.Name(sPath) + + Else + + sName = Trim(txtName.Text) + sDir = dchProject.SelectedPath &/ sName + + Project.CopyProject($sTemplate, sDir) + + Shell "rm -rf " & Shell$(sDir &/ ".lang") Wait + Try Kill sDir &/ "icon.png" + + sTemp = Temp$() + + hFile = Open sDir &/ ".project" + hDest = Open sTemp For Create + + For Each sLine In hFile.Lines + + If sLine Begins "# Compiled with" Then + Continue + Else If sLine Begins "Title=" Then + sLine = "Title=" & txtTitle.Text + Else If sLine Begins "Translate=" Then + If Not chkTranslate.Value Then Continue + sLine = "Translate=1" + Mkdir sDir &/ ".lang" + Else If sLine Begins "Version=" Then + sLine = "Version=0.0.1" + Else If sLine Begins "Description=" Then + Continue + Else If sLine Begins "Icon=" Then + Continue + Else If sLine Begins "TabSize=" Then + Continue + Endif + + Print #hDest, sLine + + Next + + Close #hFile + Close #hDest + + Kill sDir &/ ".project" + Copy sTemp To sDir &/ ".project" + + Project.MakeDirectoryIcon(sDir) + + Endif + + $sPath = sDir + Return False + +Catch + + Message.Error(("Cannot create project!") & "\n\n" & Error.Text) + Return True + +End + + +Public Sub Form_Close() + + Settings.Write(dchProject, "dchProject") + Settings.Write(Me) + +End + +Public Sub dchProject_Icon(Path As String) + + If Exist(Path &/ ".project") Then + dchProject.Icon = Project.GetIcon(Path, 16) + Endif + +End + +Public Sub wizProject_BeforeChange() + + Select Case wizProject.Index + + Case 0 + If Not $sTemplate Then + Balloon.Warning(("Please choose a template"), svwTemplate) + Stop Event + Endif + $bRepository = File.Name($sTemplate) = "~subversion" + + Case 1 + panRepository.Visible = $bRepository + panIdent.Visible = Not $bRepository + If $bRepository Then + txtRepository.SetFocus + Else + txtName.SetFocus + txtName_Change + Endif + + End Select + +End + + +Public Sub wizProject_Close() + + Dim sMsg As String + + If $bRepository Then + + If Not Trim(txtRepository.Text) Then + txtRepository.SetFocus + Balloon.Warning(("Please enter the location of the repository."), txtRepository) + Return + Endif + + Else + + sMsg = Project.CheckProjectName(txtName.Text, dchProject.SelectedPath) + If sMsg + txtName.SetFocus + txtName.SelectAll + Balloon.Warning(sMsg, txtName) + Return + Endif + + Endif + + ' IF NOT dchProject.SelectedPath THEN + ' dchProject.SetFocus + ' 'tabProject.Index = 1 + ' Balloon.Warning(("Choose the project parent directory."), dchProject) + ' RETURN + ' ENDIF + + If CreateProject() Then Return + + 'Message(("The project has been successfully created.")) + + InAnotherWindow = chkOther.Value + + Me.Close(True) + +End + +' Public Sub lstType_Click() +' +' $bRepository = Left(lstType.Current.Tag) = "!" +' svwOption.Enabled = Not $bRepository +' +' End + +Public Sub txtName_Change() + + If Trim(txtName.Text) Then + lblFinalDir.Text = dchProject.SelectedPath &/ Trim(txtName.Text) + Else + lblFinalDir.Text = dchProject.SelectedPath &/ "..." + Endif + +End + +Public Sub svwTemplate_MouseUp() + + $hTemplate.Current = Null + $sTemplate = "" + +End diff --git a/app/src/gambas3/.src/Project/FCreateProject.form b/app/src/gambas3/.src/Project/FCreateProject.form new file mode 100644 index 00000000..ed7d5921 --- /dev/null +++ b/app/src/gambas3/.src/Project/FCreateProject.form @@ -0,0 +1,144 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,89,72) + Text = ("New project") + Icon = Picture["icon:/small/new"] + Persistent = True + Arrangement = Arrange.Fill + Margin = True + { wizProject Wizard + MoveScaled(1,1,83,69) + Arrangement = Arrange.Vertical + Spacing = True + Count = 3 + TextFont = Font["Bold,+3"] + ShowIndex = True + Border = False + Index = 0 + Text = ("Project type") + { Panel1 Panel + MoveScaled(1,1,80,54) + Background = Color.TextBackground + Expand = True + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + Border = Border.Plain + { Panel3 Panel + MoveScaled(6,4,38,4) + Visible = False + Arrangement = Arrange.Fill + Border = Border.Plain + { txtFilter ButtonBox + MoveScaled(1,0,24,4) + Enabled = False + Foreground = Color.LightForeground + Picture = Picture["icon:/small/clear"] + Border = False + } + } + { svwTemplate ScrollView + MoveScaled(4,12,72,39) + Background = Color.TextBackground + Expand = True + Arrangement = Arrange.Row + Spacing = True + Border = False + } + } + Index = 1 + Text = ("Parent directory") + { dchProject DirChooser + MoveScaled(4,3,73,50) + Expand = True + Root = "/" + } + Index = 2 + Text = ("Project details") + { panIdent VBox + MoveScaled(1,0,80,39) + Spacing = True + { Label10 Label + MoveScaled(0,0,25,3) + Font = Font["Bold"] + Text = ("Project name") + Alignment = Align.BottomNormal + } + { txtName TextBox + MoveScaled(0,4,49,4) + } + { Label2 Label + MoveScaled(0,8,76,3) + Font = Font["Italic,-1"] + Text = ("The project name is the name of the project directory.") + } + { Panel2 HBox + MoveScaled(0,11,74,3) + Spacing = True + { Label16 Label + MoveScaled(0,0,23,2) + Font = Font["Italic,-1"] + AutoResize = True + Text = ("The project final directory is :") + } + { lblFinalDir Label + MoveScaled(24,0,39,2) + Font = Font["Bold,-1"] + Expand = True + } + } + { Label3 Label + MoveScaled(1,15,25,3) + Font = Font["Bold"] + Text = ("Project title") + Alignment = Align.BottomNormal + } + { txtTitle TextBox + MoveScaled(1,19,51,4) + } + { Label14 Label + MoveScaled(1,23,76,2) + Font = Font["Italic,-1"] + Text = ("The project title is the true name of the application.") + } + { Panel4 Panel + MoveScaled(22,27,4,1) + } + { chkTranslate CheckBox + MoveScaled(1,29,43,3) + Text = ("Project is translatable") + } + { chkOther CheckBox + MoveScaled(1,33,43,3) + Text = ("Open in another window") + } + } + { panRepository VBox + MoveScaled(1,40,81,18) + Expand = True + Spacing = True + { Label7 Label + MoveScaled(0,0,25,3) + Font = Font["Bold"] + Text = ("Repository") + Alignment = Align.BottomNormal + } + { txtRepository TextBox + MoveScaled(0,4,51,4) + } + { Label15 Label + MoveScaled(0,8,76,2) + Font = Font["Italic,-1"] + Text = ("The project repository is directly sent to the 'svn checkout' command.") + } + { edtOutput TextEditor + MoveScaled(0,11,79,6) + Font = Font["Monospace,-1"] + Expand = True + ReadOnly = True + } + } + Index = 0 + } +} diff --git a/app/src/gambas3/.src/Project/FImportFile.class b/app/src/gambas3/.src/Project/FImportFile.class new file mode 100644 index 00000000..3aa2bec6 --- /dev/null +++ b/app/src/gambas3/.src/Project/FImportFile.class @@ -0,0 +1,204 @@ +' Gambas class file + +Private $sPath As String +Private $sDir As String +Private $sType As String + +Public Sub Run(sPath As String, sDir As String, sType As String) + + $sPath = sPath + $sDir = sDir + $sType = sType + If Not Me.ShowModal() Then Return + +End + +Private Sub InitFilter() + + Dim aFilter As String[] + Dim hModule As CModule + + If Project.IsSourceDir($sDir) Then + + aFilter = ["*.module", ("Gambas modules"), "*.class", ("Gambas classes")] + aFilter.Insert(["*.test", ("Gambas test modules")]) + For Each hModule In CModule.All + If Not hModule.Used Then Continue + aFilter.Add("*." & hModule.Key) + aFilter.Add(hModule.NameFilter) + Next + + Else + + aFilter = ["*.png;*.jpg;*.jpeg;*.xpm;*.gif", ("Picture files"), "*.htm;*.html", ("HTML files"), "*.css", ("Cascading style sheets"), "*.js", ("Javascript files")] + + Endif + + fchExisting.Filter = aFilter + +End + + +Public Sub Form_Open() + + InitFilter + Settings.Read(Me) + Settings.Read(fchExisting) + fchExisting.ShowHidden = True + +End + +Private Sub ImportDependencies(sName As String, sExt As String, sOrig As String, bLink As Boolean) + + Dim hIn As File + Dim hOut As File + Dim sLine As String + Dim iPos As Integer + Dim sImg As String + Dim sImportDir As String + Dim sDestImg As String + Dim sForm As String + Dim bSave As Boolean + + Inc Application.Busy + + sForm = Project.Dir &/ File.SetExt(sName, sExt) + sOrig = File.Dir(sOrig) + + hIn = Open sForm + hOut = Open Temp$(sExt) For Create + + ' TODO: Import Image.Load(*) and SvgImage.Load(*) + + While Not Eof(hIn) + + Line Input #hIn, sLine + + iPos = InStr(sLine, "Picture[") + If iPos = 0 Then Goto NEXT_LINE + + sImg = Scan(sLine, "*Picture\\[\"*\"]")[1] + If sImg Begins "icon:/" Then Goto NEXT_LINE + + sImportDir = Project.Dir &/ "import" + If Not Exist(sImportDir) Then Project.InsertDirectory(sImportDir) + sImportDir &/= sName + If Not Exist(sImportDir) Then Project.InsertDirectory(sImportDir) + + sDestImg = sImportDir &/ File.Name(sImg) + + If Exist(sOrig &/ sImg) Then + If Not Exist(sDestImg) Then + Project.InsertFile(File.Name(sDestImg), File.Dir(sDestImg), sOrig &/ sImg, True, bLink) + Endif + sLine = Left(sLine, iPos + 7) & Chr$(34) & "import" &/ sName &/ File.Name(sDestImg) & Chr$(34) & "]" + bSave = True + Else + Continue + Endif + +NEXT_LINE: + Print #hOut, sLine + + Wend + + Close #hOut + Close #hIn + + If bSave Then + Kill sForm + Copy Temp$(sExt) To sForm + Project.RefreshKey(sForm) + Endif + +Finally + + Dec Application.Busy + +End + +Private Sub ImportFile() As Boolean + + Dim sDir As String + Dim sName As String + Dim sTemp As String + Dim sExt As String + + For Each sTemp In fchExisting.SelectedPaths + + sDir = File.Dir(sTemp) + sName = File.Name(sTemp) + sExt = File.Ext(sTemp) + + Select Case sExt + + Case "module", "test", "class" + sName = File.BaseName(Project.GetUniqueSourceName(sName)) + Project.InsertSource(sName, sExt, $sDir, sTemp,,, chkLink.Value) + + ' Case "test" + ' sName = File.BaseName(Project.GetUniqueSourceName(sName)) + ' Project.InsertSource(sName, "test", $sDir, sTemp,,, chkLink.Value) + ' + ' Case "class" + ' sName = File.BaseName(Project.GetUniqueSourceName(sName)) + ' Project.InsertSource(sName, "class", $sDir, sTemp,,, chkLink.Value) + + Case "form", "report", "webform", "termform" + sName = File.BaseName(Project.GetUniqueSourceName(sName)) + Project.InsertSource(sName, "class", $sDir, File.SetExt(sTemp, "class"), True, True, chkLink.Value) + Project.InsertSource(sName, sExt, $sDir, sTemp, False, True, chkLink.Value) + ImportDependencies(sName, sExt, sTemp, chkLink.Value) + Project.OpenForm(sName) + + Case "webpage" + sName = File.BaseName(Project.GetUniqueSourceName(sName)) + Project.InsertSource(sName, "class", $sDir, File.SetExt(sTemp, "class"), True, True, chkLink.Value) + Project.InsertSource(sName, "webpage", $sDir, sTemp, False, False, chkLink.Value) + + Case Else + + Inc FMain.NoMessage + sName = Project.GetUniqueName($sDir, sName) + Project.InsertFile(sName, $sDir, sTemp,, chkLink.Value) + Dec FMain.NoMessage + + End Select + + Next + +End + +Public Sub Form_Close() + + Settings.Write(Me) + Settings.Write(fchExisting) + +End + +Public Sub fchExisting_Activate() + + If fchExisting.SelectedPaths.Count = 0 Then Return + If ImportFile() Then Return + Me.Close(True) + +Catch + + FMain.NoMessage = 0 + FMain.ShowError(("Cannot import file.") & "\n\n" & Error.Text & "\n" & Error.Where) + +End + +Public Sub fchExisting_Icon(Path As String) + + If Exist(Path &/ ".project") Then + fchExisting.Icon = Project.GetIcon(Path) + Endif + +End + +Public Sub fchExisting_Cancel() + + Me.Close + +End diff --git a/app/src/gambas3/.src/Project/FImportFile.form b/app/src/gambas3/.src/Project/FImportFile.form new file mode 100644 index 00000000..153dd147 --- /dev/null +++ b/app/src/gambas3/.src/Project/FImportFile.form @@ -0,0 +1,20 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,100,75) + Text = ("Import files") + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + { fchExisting FileChooser + MoveScaled(3,2,76,48) + Expand = True + Multi = True + ShowButton = True + ReadOnly = True + } + { chkLink CheckBox + MoveScaled(3,52,56,3) + Text = ("Create symbolic links") + } +} diff --git a/app/src/gambas3/.src/Project/FMakeExecutable.class b/app/src/gambas3/.src/Project/FMakeExecutable.class new file mode 100644 index 00000000..9334a065 --- /dev/null +++ b/app/src/gambas3/.src/Project/FMakeExecutable.class @@ -0,0 +1,68 @@ +' Gambas class file + +Private $sPath As String + +Public Sub Run(sPath As String) As String + + $sPath = sPath + If Me.ShowModal() Then Return $sPath + +End + + +Public Sub Form_Open() + + Settings.Read(Me) + Settings.Read(fchExec, "fchExec") + + fchExec.Filter = ["*.gambas", ("Gambas applications")] + fchExec.SelectedPath = $sPath + fchExec.SetFocus + + chkDebug.Value = Project.KeepDebugInfo + + chkIncVersion.Value = Not Project.Config["/Executable/DoNotIncrementVersion", False] + chkIncVersion.Visible = Not Project.VersionFile + + chkNoTest.Visible = Project.HasTest() + chkNoTest.Value = Project.Config["/Executable/NoTestModule", False] + + ' If Project.CreateComponent Then + ' chkShortcut.Text = ("Install in the user component directory") + ' Else + ' chkShortcut.Text = ("Create a shortcut on the desktop") + ' Endif + chkShortcut.Value = Project.CreateShortcut + chkShortcut.Visible = Project.Type = Project.TYPE_NORMAL + txtCommand.Text = Project.RunAfterMakingExec + + tabExec.Index = 0 + +End + +Public Sub Form_Close() + + Settings.Write(fchExec, "fchExec") + Settings.Write(Me) + +End + +Public Sub btnOK_Click() + + $sPath = fchExec.SelectedPath + Project.KeepDebugInfo = chkDebug.Value + Project.CreateShortcut = chkShortcut.Value + Project.RunAfterMakingExec = Trim(txtCommand.Text) + Project.Config["/Executable/DoNotIncrementVersion"] = chkIncVersion.Value = CheckBox.False + Project.Config["/Executable/NoTestModule"] = CBool(chkNoTest.Value) + Project.WriteProject(True) + Me.Close(True) + +End + +Public Sub btnCancel_Click() + + Me.Close + +End + diff --git a/app/src/gambas3/.src/Project/FMakeExecutable.form b/app/src/gambas3/.src/Project/FMakeExecutable.form new file mode 100644 index 00000000..8a990ed1 --- /dev/null +++ b/app/src/gambas3/.src/Project/FMakeExecutable.form @@ -0,0 +1,79 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,101,75) + Text = ("Make executable") + Icon = Picture["icon:/small/exec"] + Persistent = True + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + { tabExec TabPanel + MoveScaled(4,2,92,56) + Expand = True + Arrangement = Arrange.Fill + Count = 2 + Index = 0 + Text = ("Location") + { fchExec FileChooser + MoveScaled(4,1,76,49) + Border = False + Margin = True + } + Index = 1 + Text = ("Options") + { VBox1 VBox + MoveScaled(1,1,87,43) + Spacing = True + Margin = True + { chkIncVersion CheckBox + MoveScaled(1,1,19,4) + Text = ("Increment version") + } + { chkDebug CheckBox + MoveScaled(1,5,39,4) + Text = ("Keep debugging information in executable") + } + { chkShortcut CheckBox + MoveScaled(1,9,34,4) + Text = ("Create a shortcut on the desktop") + } + { chkNoTest CheckBox + MoveScaled(1,13,34,4) + Text = ("Exclude test modules") + } + { HBox2 HBox + MoveScaled(2,19,68,4) + Spacing = True + { Label1 Label + MoveScaled(0,0,24,4) + AutoResize = True + Text = ("Run this command after") + } + { txtCommand TextBox + MoveScaled(26,0,24,4) + ToolTip = ("$(FILE) will be replaced by the path of the executable") + Expand = True + } + } + } + Index = 0 + } + { HBox3 HBox + MoveScaled(6,62,79,4) + Spacing = True + { Spring1 Spring + MoveScaled(16,2,9,1) + } + { btnOK Button + MoveScaled(35,0,16,4) + Text = ("OK") + Default = True + } + { btnCancel Button + MoveScaled(54,0,16,4) + Text = ("Cancel") + Cancel = True + } + } +} diff --git a/app/src/gambas3/.src/Project/FOpenProject.class b/app/src/gambas3/.src/Project/FOpenProject.class new file mode 100644 index 00000000..94db5e62 --- /dev/null +++ b/app/src/gambas3/.src/Project/FOpenProject.class @@ -0,0 +1,196 @@ +' Gambas class file + +Static Private $sPath As String +Static Private $bAnother As Boolean + +Static Public InAnotherWindow As Boolean + +Private $iSort As Integer +'Private $bControl As Boolean +Private $hRecent As CProjectList +Private $hExample As CProjectList + +Public Sub Run(Optional bAnother As Boolean) As String + + $bAnother = bAnother + $sPath = "" + + Inc Application.Busy + If Me.ShowModal() Then + 'Debug + Return $sPath + Endif + 'Debug + +End + +Public Sub _new() + + $hRecent = New CProjectList(lstRecent, txtFilter, CProjectList.TYPE_RECENT, Arrange.Row) As "ProjectItem" + $hExample = New CProjectList(lstExample, txtFilterExample, CProjectList.TYPE_EXAMPLE, Arrange.Row) As "ProjectItem" + + tabProject[2].Visible = False + + txtFilter.Text = Settings["FWelcome/Filter"] + +End + + +Public Sub btnOpen_Click() + + If tabProject.Text = ("Open") Then + $sPath = pchProject.Path + Else If tabProject.Text = ("Recent") Then + If Not $sPath Then $sPath = $hRecent.GetFirst() + Else If tabProject.Text = ("Examples") Then + If Not $sPath Then $sPath = $hExample.GetFirst() + Endif + + If Not $sPath Then Return + + Me.Close(True) + +End + +Public Sub Form_Open() + + Dim hCtrl As RadioButton + + Settings.Read(Me) + Settings.Read(pchProject) + ' Settings.Read(dchProject) + ' Settings.Read(splProject) + ' dchProject.ShowFile = True + ' 'dchProject.Value = Settings["/FOpenProject/Path"] + ' dchProject_Change + + InAnotherWindow = False + $hRecent.AllowOpenExtern = $bAnother + $hExample.AllowOpenExtern = $bAnother + + $iSort = Settings["/FOpenProject/SortRecent", CRecentProject.SORT_BY_DATE] + + For Each hCtrl In [radSortByDate, radSortByName, radSortByPath] + If hCtrl.Tag = $iSort Then hCtrl.Value = True + Next + + pchProject.ShowAnother = $bAnother + + If $bAnother Then tabProject.Index = 1 + tabProject_Click + + Dec Application.Busy + +End + +Public Sub Form_Close() + + Settings["/FOpenProject/SortRecent"] = $iSort + Settings.Write(Me) + ' Settings.Write(splProject) + ' Settings.Write(dchProject) + Settings.Write(pchProject) + +End + +Public Sub tabProject_Click() + + If tabProject.Text = ("Recent") Then + $hRecent.Fill + + ' sorting as stored in Settings + $hRecent.SetSort($iSort) + + $hRecent.ApplyFilter(txtFilter.Text) + txtFilter.Editor.SelectAll() + txtFilter.SetFocus + Else If tabProject.Text = ("Examples") Then + $hExample.Fill + $hExample.ApplyFilter(txtFilterExample.Text) + txtFilterExample.Editor.SelectAll() + txtFilterExample.SetFocus + Endif + +End + +Public Sub OnUpdateRecent() + + $hRecent.Clear + If tabProject.Text = ("Recent") Then $hRecent.Fill + +End + +Public Sub btnOpenAnother_Click() + + InAnotherWindow = True + btnOpen_Click + +End + +Public Sub radSort_Click() + + $iSort = Last.Tag + + If tabProject.Text = ("Recent") Then + $hRecent.SetSort(Last.Tag) + $hRecent.ApplyFilter(txtFilter.Text) + txtFilter.SetFocus + Endif + +End + +Public Sub ProjectItem_Click(sPath As String, bAnother As Boolean) + + 'InAnotherWindow = $bControl Or bAnother + InAnotherWindow = bAnother + $sPath = sPath + btnOpen_Click + +End + +Public Sub pchProject_Activate() + + btnOpen_Click + +End + +Public Sub txtFilter_KeyPress() + + If Key.Control Then + If Key.Code = Key.Enter Or If Key.Code = Key.Return Then + btnOpen_Click + Endif + Else If Key.Normal Then + If Key.Code = Key.Esc Then + If txtFilter.Length Then + txtFilter.Clear + Else + Me.Close + Endif + Endif + Endif + +End + +Public Sub txtFilterExample_KeyPress() + + If Key.Control Then + If Key.Code = Key.Enter Or If Key.Code = Key.Return Then + btnOpen_Click + Endif + Endif + +End + +Public Sub pchProject_Cancel() + + Me.Close + +End + +Public Sub pchProject_Open((Path) As String, Extern As Boolean) + + InAnotherWindow = Extern + btnOpen_Click + +End diff --git a/app/src/gambas3/.src/Project/FOpenProject.form b/app/src/gambas3/.src/Project/FOpenProject.form new file mode 100644 index 00000000..35376911 --- /dev/null +++ b/app/src/gambas3/.src/Project/FOpenProject.form @@ -0,0 +1,117 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,114,77) + Text = ("Select a project") + Icon = Picture["icon:/32/open"] + Persistent = True + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + { tabProject TabPanel + MoveScaled(1,1,110,69) + Expand = True + Arrangement = Arrange.Vertical + Count = 3 + Index = 0 + Text = ("Open") + Picture = Picture["icon:/small/open"] + { pchProject ProjectChooser + MoveScaled(3,4,98,56) + Expand = True + ShowButton = True + } + Index = 1 + Text = ("Recent") + Picture = Picture["icon:/small/open-recent"] + { Panel5 VBox + MoveScaled(2,2,91,56) + Background = Color.TextBackground + Expand = True + Spacing = True + Margin = True + { HBox2 HBox + MoveScaled(0,0,78,4) + Spacing = True + { Panel2 Panel + MoveScaled(1,0,25,4) + Expand = True + Arrangement = Arrange.Fill + Border = Border.Plain + { txtFilter ButtonBox + MoveScaled(0,0,24,4) + Foreground = Color.LightForeground + Picture = Picture["icon:/small/clear"] + Border = False + } + } + { radSortByDate RadioButton radSort + Name = "radSortByDate" + MoveScaled(29,0,16,4) + Tag = "0" + AutoResize = True + Text = ("Sort by date") + Value = True + } + { radSortByName RadioButton radSort + Name = "radSortByName" + MoveScaled(45,0,16,4) + Tag = "1" + AutoResize = True + Text = ("Sort by name") + } + { radSortByPath RadioButton radSort + Name = "radSortByPath" + MoveScaled(61,0,16,4) + Tag = "2" + AutoResize = True + Text = ("Sort by path") + } + } + { lstRecent ScrollView + MoveScaled(2,12,73,43) + Background = Color.TextBackground + Expand = True + Arrangement = Arrange.Row + Spacing = True + Border = False + ScrollBar = Scroll.Vertical + } + } + Index = 2 + Text = ("Examples") + Picture = Picture["icon:/small/help"] + { Panel3 VBox + MoveScaled(1,1,92,60) + Background = Color.TextBackground + Expand = True + Spacing = True + Margin = True + { HBox3 HBox + MoveScaled(2,2,78,4) + { Panel4 Panel + MoveScaled(1,0,25,4) + Expand = True + Arrangement = Arrange.Fill + Border = Border.Plain + { txtFilterExample ButtonBox + MoveScaled(0,0,24,4) + Foreground = Color.LightForeground + Picture = Picture["icon:/small/clear"] + Border = False + } + } + } + { lstExample ScrollView + MoveScaled(4,13,73,43) + Background = Color.TextBackground + Expand = True + Arrangement = Arrange.Row + Spacing = True + Border = False + ScrollBar = Scroll.Vertical + } + } + Index = 0 + } +} diff --git a/app/src/gambas3/.src/Project/FProjectProperty.class b/app/src/gambas3/.src/Project/FProjectProperty.class new file mode 100644 index 00000000..d281cbfc --- /dev/null +++ b/app/src/gambas3/.src/Project/FProjectProperty.class @@ -0,0 +1,1360 @@ +' Gambas class file + +'Static Private $bShowUsed As Boolean +Static Private $bShowLibraries As Boolean +Static Private $bShowArguments As Boolean + +Private $sIcon As String + +Private $bCanInitComponents As Boolean + +Private $aEnv As String[] + +Private $aComponents As String[] +Private $aLibraries As String[] + +'Private $iDoNotRefreshComponent As Integer + +Private Const COMPONENT_PROPERTIES_TAB As Integer = 1 +Private Const LIBRARY_TAB As Integer = 3 +Private Const ARGUMENT_TAB As Integer = 5 +'Private Const VERSION_CONTROL_TAB As Integer = 8 + +Private $bInitInfo As Boolean +Private $aNeed As String[] +Private $aRequire As String[] +Private $aExclude As String[] +Private $aImplement As String[] +Private $iCurrentLibrary As Integer + +Static Public Function Run() As Boolean + + Return Not FProjectProperty.ShowModal() + +End + +Static Public Function ShowLibraries() As Boolean + + $bShowLibraries = True + Return Not FProjectProperty.ShowModal() + +End + +Static Public Function ShowArguments() As Boolean + + $bShowArguments = True + Return Not FProjectProperty.ShowModal() + +End + +Public Sub Form_Open() + + Dim sLang As String + Dim hBorder As Border + + Me.Title = ("Project properties") & " - " & Project.Name + + lblName.Text = Project.Name + txtPath.Text = File.Dir(Project.Dir) + 'txtName.Text = "" & Project.Name & "
      " & File.Dir(Project.Dir) + + cmbDefaultLanguage.Clear + For Each sLang In Language.GetAll() + cmbDefaultLanguage.Add(Language.ToName(sLang)) + Next + + With Project + + txtVendor.Text = .Vendor + txtTitle.Text = .Title + txtDesc.Text = .Description + txtAuthor.Text = .Authors + btnControlPublic.Value = .ControlPublic + btnModulePublic.Value = .ModulePublic + btnShowDeprecated.Value = .ShowDeprecated + btnWarning.Value = .Warnings + txtMajor.Value = .MajorVersion + txtMinor.Value = .MinorVersion + txtRelease.Value = .ReleaseVersion + btnTranslate.Value = .Localize + cmbType.Index = .Type + cmbDefaultLanguage.Text = Language.ToName(System.Language) + Try cmbDefaultLanguage.Text = Language.ToName(Project.DefaultLanguage) + ' Select Case .Type + ' Case .TYPE_NORMAL + ' radTypeNormal.Value = True + ' Case .TYPE_LIBRARY + ' radTypeLibrary.Value = True + ' Case .TYPE_COMPONENT + ' radTypeComponent.Value = True + ' End Select + $sIcon = .Icon + UpdateIcon + txtTabSize.Value = .TabSize + 'cmbStackSize.Index = 0 + 'If .Stack Then cmbStackSize.Text = .Stack & " K" + 'cmbStackTrace.Index = If(.StackTrace, 0, 1) + chkGetVersionFromFile.Value = .VersionFile + 'chkVersion.Value = NOT IsNull(.VersionProgram) + 'cmbTerminal.Index = If(.UseTerminal, 0, 1) + 'cmbRedirect.Index = If(.RedirectStderr, 0, 1) + 'cmbProfile.Index = If(.Profiling, 0, 1) + 'cmbHttpServer.Index = If(.UseHttpServer, 0, 1) + txtLibraryPath.Text = .LibraryPath + $aLibraries = .Libraries.Copy() + $aComponents = .Components.Copy() + + lstReferences.List = .ExtraReferences + + End With + + hBorder = Border("style:none;bottom-style:solid;padding:" & CStr(Desktop.Scale \ 2) & ";") + hBorder.Color = Color.LightForeground + gvwLibrary.Rows.Border = hBorder + + choComponent.Checkable = True + choComponent.CheckedComponents = Project.Components + choComponent.Libraries = $aLibraries + choComponent.ShowDeprecated = Project.ShowDeprecated + + 'chkShowUsed.Value = $bShowUsed + $bCanInitComponents = True + + 'ipnProject[VERSION_CONTROL_TAB].Visible = VersionControl.Enabled + gvwVcInfo.Visible = VersionControl.Enabled + 'sepVcInfo.Visible = gvwVcInfo.Visible + If VersionControl.Name = "Git" Then + btnVersionAddBranch.Enabled = True + btnVersionAddBranch.Value = Project.VersionAddBranch + Else + btnVersionAddBranch.Enabled = False + btnVersionAddBranch.Value = False + Endif + + ipnProject.Index = 0 + + InitEnvironment + + btnOK.Enabled = Not Project.ReadOnly And Not Project.Running + + $bInitInfo = False + + gvwVcInfo.Rows.Count = 0 + +End + +Public Sub Form_Activate() + + If $bShowLibraries Then + $bShowLibraries = False + ipnProject.Index = LIBRARY_TAB + Else If $bShowArguments Then + $bShowArguments = False + ipnProject.Index = ARGUMENT_TAB + Endif + +End + +Private Sub InitEnvironment() + + tvwEnv.Columns.Count = 2 + tvwEnv.Columns[0].Text = ("Variable") + tvwEnv.Columns[1].Text = ("Value") + + $aEnv = Project.Environment.Copy() + + tvwEnv.Rows.Resizable = False + + UpdateEnv + +End + +Private Sub SaveEnvironment() + + Dim iInd As Integer + + tvwEnv.Save + + While iInd < $aEnv.Count + If Not Trim(Scan($aEnv[iInd], "*=*")[0]) Then + $aEnv.Remove(iInd) + Else + Inc iInd + Endif + Wend + + Project.Environment = $aEnv + +End + +Public Sub btnCancel_Click() + + Me.Close + +End + + +Private Function DoApply() As Boolean + + ' Dim bRefreshForm As Boolean + Dim bRefreshEditor As Boolean + + If choComponent.CheckSelection() Then Return True + + With Project + + .Vendor = Trim(txtVendor.Text) + .Title = Trim(txtTitle.Text) + .Description = Trim(txtDesc.Text) + .Authors = Trim(txtAuthor.Text) + .Icon = $sIcon + '.Profiling = cmbProfile.Index = 0 + '.UseTerminal = cmbTerminal.Index = 0 + '.RedirectStderr = cmbRedirect.Index = 0 + '.UseHttpServer = cmbHttpServer.Index = 0 + + If .ControlPublic <> btnControlPublic.Value Or If .ModulePublic <> btnModulePublic.Value Then + .ControlPublic = btnControlPublic.Value + .ModulePublic = btnModulePublic.Value + Project.ResetScan + Project.DeleteCompiledFiles + Endif + + If .ShowDeprecated <> btnShowDeprecated.Value Then + .ShowDeprecated = btnShowDeprecated.Value + FToolBox.RefreshToolbar(True) + Endif + + .Warnings = btnWarning.Value + .MajorVersion = txtMajor.Value + .MinorVersion = txtMinor.Value + .ReleaseVersion = txtRelease.Value + .VersionFile = chkGetVersionFromFile.Value + '.SnapToGrid = chkSnap.Value + + 'IF chkShowGrid.Value <> .ShowGrid OR .Snap <> txtGrid.Value THEN + ' bRefreshForm = TRUE + 'ENDIF + + '.ShowGrid = chkShowGrid.Value + '.Snap = txtGrid.Value + If btnTranslate.Value And Not .Localize Then + Project.DeleteCompiledFiles() + Endif + .Localize = btnTranslate.Value + .DefaultLanguage = Language.FromName(cmbDefaultLanguage.Text) + + .Type = cmbType.Index + + If .TabSize <> txtTabSize.Value Then + bRefreshEditor = True + Endif + + .TabSize = txtTabSize.Value + + .LibraryPath = Trim(txtLibraryPath.Text) + .Libraries = $aLibraries + + .ExtraReferences = lstReferences.List + + If VersionControl.Enabled Then .VersionAddBranch = btnVersionAddBranch.Value + + End With + + SaveComponents + SaveEnvironment + WriteComponent + + Project.WriteProject + Project.MakeDirectoryIcon + Project.Compile + + Project.RefreshRoot + ' If bRefreshForm Then Project.RefreshForm + If bRefreshEditor Then Project.RefreshEditor + FMain.OnRefreshComponents + + Project.SetMessage(("OK")) + + Return + +BAD_GRID: + + Message.Error(("Snapping value is incorrect.")) + Return True + +End + + +Public Sub btnOK_Click() + + If DoApply() Then Return + + Me.Close(True) + +End + + +Private Sub SaveComponents() + + Project.Components = choComponent.CheckedComponents + Project.RefreshComponents + +End + + +' Public Sub gvwComponent_Data(Row As Integer, Column As Integer) +' +' Dim hCompItem As ComponentItem = $cComp[$aComp[Row]] +' Dim hComp As CComponent = CComponent.All[$aComp[Row]] +' +' With gvwComponent.Data +' +' Select Case Column +' +' Case 0 +' .Picture = hCompItem.Picture +' +' Case 1 +' .Text = hCompItem.Key +' .Font.Bold = True +' If hComp.State = CComponent.UNSTABLE Then +' .Font.Italic = True +' Else If hComp.State = CComponent.DEPRECATED Then +' .Foreground = Color.LightForeground +' '.Font.Strikeout = True +' Endif +' +' Case 2 +' .WordWrap = True +' .RichText = hCompItem.GetDescription() +' If hComp.State = CComponent.UNSTABLE Then +' .Font.Italic = True +' Else If hComp.State = CComponent.DEPRECATED Then +' .Foreground = Color.LightForeground +' '.Font.Strikeout = True +' Endif +' +' Case 3 +' Select Case hComp.State +' Case CComponent.STABLE_NOT_FINISHED +' .Picture = Picture["img/16/unfinished.png"] +' Case CComponent.UNSTABLE +' .Picture = Picture["img/16/experimental.png"] +' Case CComponent.STABLE +' .Picture = Picture["img/16/finished.png"] +' Case CComponent.DEPRECATED +' .Picture = Picture["img/16/deprecated.png"] +' End Select +' +' End Select +' +' .Alignment = Align.TopNormal +' '.Background = If(Even(Row), Color.Gradient(Color.LightForeground, Color.TextBackground, 0.9), Color.TextBackground) +' .Background = Color.Gradient(Color.LightForeground, Color.TextBackground, 0.95) +' +' End With +' +' End + + + + + +' Private Function CheckComponent(sKey As String, bCheck As Boolean) As Boolean +' +' Dim bBefore As Boolean +' Dim sDep As String +' +' bBefore = IsChecked(sKey) +' If bBefore = bCheck Then Return +' +' If bCheck Then +' $cComp[sKey].Check("") +' For Each sDep In GetRequire(sKey) +' $cComp[sDep].Check(sKey) +' Next +' Else +' $cComp[sKey].Uncheck("") +' Endif +' +' End + +' PRIVATE FUNCTION CheckComponent(sKey AS String, bCheck AS Boolean) AS Boolean +' +' DIM hComp AS CComponent +' DIM sComp AS String +' DIM aExclude AS NEW String[] +' DIM aNeed AS NEW String[] +' DIM sImpl AS String +' DIM sNeed AS String +' DIM bFound AS Boolean +' +' WITH cvwComponent +' +' IF NOT .Available THEN RETURN +' +' IF bCheck THEN +' +' FOR EACH sImpl IN CComponent.All[sKey].Implement +' +' FOR EACH hComp IN CComponent.All +' +' IF hComp.Key = sKey THEN CONTINUE +' IF hComp.Implement.Find(sImpl) >= 0 THEN +' IF NOT IsChecked(hComp.Key) THEN CONTINUE +' IF aExclude.Find(hComp.Key) < 0 THEN aExclude.Add(hComp.Key) +' ENDIF +' +' NEXT +' +' NEXT +' +' FOR EACH sComp IN CComponent.All[sKey].Exclude +' IF NOT IsChecked(sComp) THEN CONTINUE +' IF aExclude.Find(sComp) < 0 THEN aExclude.Add(sComp) +' NEXT +' +' IF aExclude.Count = 1 THEN +' IF Message.Warning(Subst(("The &2 component is incompatible with &1 component.\nIt will be disabled."), sKey, aExclude[0]), ("Continue"), ("Cancel")) = 2 THEN RETURN TRUE +' ELSE IF aExclude.Count > 1 THEN +' IF Message.Warning(Subst(("These components are incompatible with &1 component:\n&2\n\nThey will be disabled."), sKey, aExclude.Join(", ")), ("Continue"), ("Cancel")) = 2 THEN RETURN TRUE +' ENDIF +' +' FOR EACH sNeed IN CComponent.All[sKey].Need +' bFound = FALSE +' FOR EACH hComp IN CComponent.All +' IF hComp.Implement.Find(sNeed) >= 0 THEN +' aNeed.Add(hComp.Key) +' IF IsChecked(hComp.Key) THEN bFound = TRUE +' ENDIF +' NEXT +' IF NOT bFound THEN +' Message.Warning(Subst(("The &1 component needs one of the following components:\n&2."), sKey, aNeed.Join(", "))) +' RETURN TRUE +' ENDIF +' NEXT +' +' FOR EACH sComp IN aExclude +' IF CheckComponent(sComp, FALSE) THEN RETURN TRUE +' NEXT +' +' FOR EACH sComp IN CComponent.All[sKey].Require +' IF CheckComponent(sComp, TRUE) THEN RETURN TRUE +' NEXT +' +' .MoveTo(sKey) +' .Item.Picture = $hCheck +' +' ELSE +' +' .MoveTo(sKey) +' .Item.Picture = $hUncheck +' +' FOR EACH hComp IN CComponent.All +' IF hComp.Require.Find(sKey) < 0 THEN CONTINUE +' CheckComponent(hComp.Key, FALSE) +' NEXT +' +' ENDIF +' +' END WITH +' +' END + + +' Public Sub chkShowUsed_Click() +' +' choComponent.ShowCheckedOnly = chkShowUsed.Value +' +' End +' + +' PRIVATE SUB FillLibrary(sLib AS String) +' +' DIM sText AS String +' +' WITH CComponent.All[sLib] +' +' sText = "

      " & sLib & "

      " & .Name & "

      " +' +' IF .Alpha THEN +' sText = sText & "
      " & ("WARNING! This component is in BETA version.") & " " & +' ("It is under development and may change without notice.") & "

      " +' ELSE +' 'sText = sText & "

      " +' ENDIF +' +' sText = sText & "" & ("Authors:") & " " & .Authors.Join(", ") +' +' IF .Controls THEN +' IF .Controls.Count THEN +' sText = sText & "

      " & ("Controls:") & " " & .Controls.Join(", ") +' ENDIF +' ENDIF +' +' txtComponent.Text = sText +' +' END WITH +' +' END + +' PUBLIC SUB clvLibrary_Select() +' +' FillLibrary(clvLibrary.Key) +' 'lblLibrary.Visible = TRUE +' 'clvLibrary.Height = 200 +' 'clvLibrary.Current.EnsureVisible +' +' END + + +Public Sub btnIcon_Click() + + Dim sIcon As String + + sIcon = FSelectIcon.Run($sIcon, FSelectIcon.SELECT_IMAGE) + If Not sIcon Then Return + + $sIcon = sIcon + UpdateIcon + +End + +' Public Sub chkShowBeta_Click() +' +' $bShowBeta = chkShowBeta.Value +' RefreshComponents +' +' End + + + +' Public Sub cmbComponent_Click() +' +' Dim bComp As Boolean = cmbComponent.Index = 0 +' +' If bComp Then InitRequires +' +' tabProject[REQUIRES_TAB].Visible = bComp +' 'tabProject[COMPONENT_TAB + 1].Visible = bComp +' cmbComponentState.Enabled = bComp +' +' End + +' Private Sub GetParent(sPath As String) As String +' +' Dim hFile As File +' Dim sLine As String +' Dim sParent As String +' +' hFile = Open sPath +' While Not Eof(hFile) +' Line Input #hFile, sLine +' sLine = Trim(sLine) +' If Not sLine Then Continue +' If Left(sLine) = "'" Then Continue +' If sLine Like "INHERITS *" Then +' Try sParent = Trim(Scan(sLine, "INHERITS *")[0]) +' Return sParent +' Endif +' If sLine Like "EXPORT" Then Continue +' If sLine Like "CREATE" Then Continue +' If sLine Like "EXPORT *" Then Continue +' If sLine Like "CREATE *" Then Continue +' Break +' Wend +' +' End + + + + + +' PUBLIC SUB cmbRequire_Click() +' +' btnAdd_Click +' +' END + + +' PUBLIC SUB chkVersion_Click() +' +' txtVersionProg.Enabled = chkVersion.Value +' TRY txtVersionProg.SetFocus +' +' END +' + +' Public Sub btnCommit_Click() +' +' If FCommit.Run($sVerCtrlStatus, $sVerCtrlDiff) Then Return +' tabProject_Click +' +' End + + +' PUBLIC SUB btnSwap_Click() +' +' IF IsChecked("gb.qt") THEN +' cvwComponent["gb.qt"].Picture = $hUncheck +' cvwComponent["gb.gtk"].Picture = $hCheck +' ELSE IF IsChecked("gb.gtk") THEN +' cvwComponent["gb.gtk"].Picture = $hUncheck +' cvwComponent["gb.qt"].Picture = $hCheck +' ENDIF +' +' END + +Public Sub btnReset_Click() + + Select Case ipnProject.Text + + Case ("Components") + choComponent.CheckedComponents = Project.Components + choComponent.Libraries = $aLibraries + + Case ("Libraries") + $aLibraries = Project.Libraries.Copy() + RefreshLibraries + lstReferences.List = Project.ExtraReferences + + End Select + + +End + +Public Sub tvwEnv_Click() + + tvwEnv.Edit + +End + +Public Sub tvwEnv_Data(Row As Integer, Column As Integer) + + Dim aEnv As String[] = Scan($aEnv[Row], "*=*") + + Try tvwEnv.Data.Text = aEnv[Column] + +Catch + +End + +Public Sub tvwEnv_Save(Row As Integer, Column As Integer, Value As String) + + Dim aEnv As String[] = Scan($aEnv[Row], "*=*") + + If Column = 0 Then + $aEnv[Row] = Trim(Value) & "=" & aEnv[1] + tvwEnv.Columns[0].Width = -1 + Else + $aEnv[Row] = aEnv[0] & "=" & Value + Endif + +End + +Public Sub tvwEnv_Insert() + + If Key.Normal Then + btnOK.Value = True + Else If Key.Control Then + btnInsertEnv_Click + Endif + +End + +Public Sub btnInsertEnv_Click() + + If $aEnv.Count >= 255 Then Return + $aEnv.Add("=") + UpdateEnv + tvwEnv.MoveTo($aEnv.Max, 0) + tvwEnv.Edit + +End + +Public Sub mnuInsertEnv_Click() + + Dim sNewEnv As String = Last.Tag + Dim iInd As Integer + Dim aNewEnv As String[] + Dim aEnv As String[] + + If Not sNewEnv Then Return + + For Each sNewEnv In Split(sNewEnv) + + aNewEnv = Scan(sNewEnv, "*=*") + For iInd = 0 To $aEnv.Max + aEnv = Scan($aEnv[iInd], "*=*") + If aEnv[0] = aNewEnv[0] Then + aEnv[1] = aNewEnv[1] + $aEnv[iInd] = aEnv[0] & "=" & aEnv[1] + tvwEnv.Refresh + sNewEnv = "" + Break + Endif + Next + + If sNewEnv Then + $aEnv.Add(sNewEnv) + UpdateEnv + Endif + + Next + +End + + +Public Sub btnRemoveEnv_Click() + + If $aEnv.Count = 0 Then Return + If tvwEnv.Row < 0 Then Return + tvwEnv.Save + $aEnv.Remove(tvwEnv.Row) + UpdateEnv + +End + + +' Public Sub cmbTranslate_Click() +' +' If cmbTranslate.Index = 0 Then +' cmbDefaultLanguage.Enabled = True +' cmbDefaultLanguage.Text = Language.ToName(System.Language) +' Try cmbDefaultLanguage.Text = Language.ToName(Project.Language) +' Else +' cmbDefaultLanguage.Index = 0 +' cmbDefaultLanguage.Enabled = False +' Endif +' +' End + +Private Sub UpdateIcon() + + btnIcon.Picture = Project.StretchIcon(Project.Dir &/ $sIcon, btnIcon.Width - 16).Picture + btnIcon.ToolTip = $sIcon + +End + +Public Sub btnInsertLib_Click() + + Dim hLib As CLibraryInfo + Dim sPath As String + Dim I As Integer + + If FSelectLibrary.Run() Then Return + + sPath = FSelectLibrary.Path + + hLib = CLibraryInfo[sPath] + If hLib.Classes.Count = 0 Then + Message.Warning(Subst(("&1 does not export any class."), File.Name(sPath))) + Return + Endif + + For I = 0 To $aLibraries.Max + If File.Name($aLibraries[I]) = File.Name(sPath) Then + hLib = CLibraryInfo[$aLibraries[I]] + If Not hLib.NotFound Then + Message.Warning(Subst(("&1 is already used as a library."), File.Name(sPath))) + Return + Endif + Break + Endif + Next + + If I <= $aLibraries.Max Then + $aLibraries[I] = sPath + Else + $aLibraries.Add(sPath) + I = $aLibraries.Max + Endif + + Project.UpdateLibraries($aLibraries) + RefreshLibraries + gvwLibrary.Row = I + +End + +Private Sub RefreshLibraries() + + Dim Y As Integer + + 'If $iDoNotRefreshComponent Then Return + + gvwLibrary.Columns.Count = 1 + gvwLibrary.Rows.Count = $aLibraries.Count + + For Y = 0 To $aLibraries.Max + + With gvwLibrary[Y, 0] + + '.Picture = Picture["icon:/large/exec"] + .Alignment = Align.TopNormal + .RichText = CLibraryInfo[$aLibraries[Y]].GetDescription(False) + .WordWrap = True + .Background = Color.Gradient(Color.LightForeground, Color.TextBackground, 0.96) + + End With + + gvwLibrary.Rows[Y].Height = -1 + + Next + + choComponent.Libraries = $aLibraries + + $iCurrentLibrary = -1 + gvwLibrary.Row = -1 + +End + +Private Sub RemoveLibrary(sPath As String) + + Dim iPos As Integer + + iPos = $aLibraries.Find(sPath) + If iPos >= 0 Then + gvwLibrary.Row = -1 + $aLibraries.Remove(iPos) + Project.UpdateLibraries($aLibraries) + RefreshLibraries + Endif + +End + + +Public Sub btnRemoveLib_Click() + + If gvwLibrary.Row < 0 Then Return + RemoveLibrary($aLibraries[gvwLibrary.Row]) + +End + +Public Sub btnMoveUpLib_Click() + + Dim iPos As Integer = gvwLibrary.Row + + If iPos < 1 Then Return + + Swap $aLibraries[iPos], $aLibraries[iPos - 1] + RefreshLibraries + Dec gvwLibrary.Row + +End + +Public Sub btnMoveDownLib_Click() + + Dim iPos As Integer = gvwLibrary.Row + + If iPos < 0 Or If iPos >= $aLibraries.Max Then Return + + Swap $aLibraries[iPos], $aLibraries[iPos + 1] + RefreshLibraries + Inc gvwLibrary.Row + +End + +Public Sub chkGetVersionFromFile_Click() + + txtMajor.Enabled = Not chkGetVersionFromFile.Value + txtMinor.Enabled = txtMajor.Enabled + txtRelease.Enabled = txtMajor.Enabled + +End + +' Public Sub UncheckComponents(aComp As String[]) +' +' Dim sComp As String +' +' For Each sComp In aComp +' If Left(sComp) <> "/" Then $cComp[sComp].Uncheck("") +' Next +' +' End + +Public Sub ipnProject_Click() + + btnReset.Hide + + Select Case ipnProject.Text + Case ("Components") + 'choComponent.SetFocus + choComponent.HideBrowser + btnReset.Show + Case ("Libraries") + RefreshLibraries + btnReset.Show + Case ("Options") + 'panHttpServer.Enabled = choComponent.IsChecked("gb.web") 'Project.Components.Exist("gb.web") + Case ("Statistics") + UpdateStat + UpdateVcInfo + Case ("Information") + UpdateInfo + End Select + +End + +Private Sub AddStat(sName As String, sValue As String) + + Dim N As Integer + + N = gvwStat.Rows.Count + Inc gvwStat.Rows.Count + gvwStat[N, 0].Text = sName + 'gvwStat[N, 0].Foreground = Color.Merge(Color.TextBackground, Color.TextForeground, 0.7) + gvwStat[N, 1].Text = sValue + gvwStat[N, 1].Font.Bold = True + If Even(n) Then + gvwStat[N, 0].Background = Color.SetAlpha(Color.TextForeground, 250) + gvwStat[N, 1].Background = gvwStat[N, 0].Background + Endif + +End + + +Private Sub UpdateStat() + + Dim hModule As CModule + Dim iSize As Long + Dim nFunc As Integer + Dim nLine As Integer + + gvwStat.Columns.Count = 2 + gvwStat.Rows.Count = 0 + gvwStat.Columns[1].Alignment = Align.Right + + AddStat(("Modules"), CStr(Project.GetCount("module"))) + If Project.HasTest() Then AddStat(("Test modules"), CStr(Project.GetCount("test"))) + AddStat(("Classes"), CStr(Project.GetCount("class"))) + + For Each hModule In CModule.All + If Not hModule.Used Then Continue + AddStat(hModule.NamePlural, CStr(Project.GetCount(hModule.Key))) + Next + + nLine = Project.GetLinesOfCode(ByRef nFunc) + + AddStat(("Functions"), Format(nFunc, ",0")) + AddStat(("Lines of code"), Format(nLine, ",0")) + AddStat(("Average number of lines by function"), Format(nLine / nFunc, ",0.0")) + + Try iSize = Stat(Project.GetExecPath()).Size + If iSize Then AddStat(("Executable size"), Format(iSize, ",0") & " " & ("bytes")) + + gvwStat.Columns[0].Width = -1 + gvwStat.Columns[0].Width += 16 + +End + +Public Sub cmbType_Click() + + Select cmbType.Index + + Case Project.TYPE_NORMAL + ipnProject[COMPONENT_PROPERTIES_TAB].Visible = False + + Case Project.TYPE_COMPONENT + ipnProject[COMPONENT_PROPERTIES_TAB].Visible = True + 'ipnProject[COMPONENT_PROPERTIES_TAB].Text = ("Component properties") + lblInfo.Text = ("Information about component") + panCompatible.Hide + + Case Project.TYPE_LIBRARY + ipnProject[COMPONENT_PROPERTIES_TAB].Visible = True + 'ipnProject[COMPONENT_PROPERTIES_TAB].Text = ("Library properties") + lblInfo.Text = ("Information about library") + panCompatible.Show + + End Select + +End + +'-------------------------------------------------------------------------- + +Private Sub ReadComponentFile() + + Dim cComp As Collection + Dim aVer As String[] + + $aNeed = New String[] + $aRequire = New String[] + $aExclude = New String[] + $aImplement = New String[] + + cComp = Project.ReadComponentFile() + If Not cComp Then Return + + If cComp.Exist("Need") Then $aNeed = cComp["Need"] + If cComp.Exist("Require") Then $aRequire = cComp["Require"] + If cComp.Exist("Exclude") Then $aExclude = cComp["Exclude"] + If cComp.Exist("Implement") Then $aImplement = cComp["Implement"] + cmbComponentState.Index = cComp["State"] + btnHidden.Value = cComp["Hidden"] + If cComp.Exist("Include") Then txtIncludeInfo.Text = cComp["Include"].Join(",") + + Try aVer = Split(cComp["CompatibleUntil"], ".") + If aVer And If aVer.Count = 3 Then + chkCompat.Value = True + Try txtCompMajor.Value = CInt(aVer[0]) + Try txtCompMinor.Value = CInt(aVer[1]) + Try txtCompRelease.Value = CInt(aVer[2]) + Else + chkCompat.Value = False + Endif + +End + +Private Sub WriteFeatures(hCont As Container, aFeature As String[]) + + Dim hCtrl As CheckBox + + For Each hCtrl In hCont.Children + If hCtrl.Value Then aFeature.Add(hCtrl.Tag) + Next + +End + +Private Sub WriteComponent() + + Dim cComp As New Collection + + If Project.Type <> Project.TYPE_NORMAL Then + + ' If the component information has not been initialized, do nothing, don't erase the component file! + If Not $bInitInfo Then Return + + cComp["State"] = cmbComponentState.Index + + $aNeed.Clear + WriteFeatures(panNeed, $aNeed) + WriteFeatures(panNeed2, $aNeed) + + cComp["Hidden"] = btnHidden.Value + cComp["Implement"] = $aImplement + cComp["Need"] = $aNeed + cComp["Require"] = $aRequire + cComp["Exclude"] = $aExclude + If chkCompat.Value Then cComp["CompatibleUntil"] = CStr(txtCompMajor.Value) & "." & CStr(txtCompMinor.Value) & "." & CStr(txtCompRelease.Value) + cComp["Include"] = Split(Trim(txtIncludeInfo.Text)) + + Endif + + Project.WriteComponentFile(cComp) + +End + +Private Sub ReadComponent() + + 'Dim hComp As CComponent + + Dim sComp As String + + ReadComponentFile + + ' aComp = New String[] + ' For Each hComp In CComponent.All + ' If hComp.Hidden Then Continue + ' If hComp.Key = CComponent.PROJECT_NAME Then Continue + ' If hComp.Key = Project.Name Then Continue + ' If hComp.Key = "gb" Then Continue + ' If $aRequire.Exist(hComp.Key) Then Continue + ' aComp.Add(hComp.Key) + ' Next + ' aComp.Sort + + ReadFeatures(panNeed, $aNeed) + ReadFeatures(panNeed2, $aNeed) + + lvwRequire.Clear + For Each sComp In $aRequire + lvwRequire.Add(sComp, sComp, Picture["icon:/small/ok"]) + Next + For Each sComp In $aExclude + lvwRequire.Add(sComp, sComp, Picture["icon:/small/close"]) + Next + +End + +Private Sub ReadFeatures(hCont As Container, aFeature As String[]) + + Dim hCtrl As CheckBox + + For Each hCtrl In hCont.Children + hCtrl.Value = aFeature.Find(hCtrl.Tag, gb.IgnoreCase) >= 0 + Next + +End + +Private Sub AddRequireExclude(sComp As String, aComp As String[]) + + Dim sIcon As String + + If sComp = Project.Name Then Return + If lvwRequire.Exist(sComp) Then Return + + If aComp = $aRequire Then + sIcon = "ok" + Else + sIcon = "close" + Endif + + aComp.Add(sComp) + lvwRequire.Add(sComp, sComp, Picture["icon:/small/" & sIcon]) + +End + + +Public Sub btnRemove_Click() + + Dim sKey As String + Dim iFind As Integer + + sKey = lvwRequire.Key + If Not sKey Then Return + lvwRequire.Remove(sKey) + + iFind = $aRequire.Find(sKey) + If iFind >= 0 Then $aRequire.Remove(iFind) + + iFind = $aExclude.Find(sKey) + If iFind >= 0 Then $aExclude.Remove(iFind) + +End + +Public Sub btnRemoveAll_Click() + + lvwRequire.Clear + $aRequire.Clear + $aExclude.Clear + +End + +Public Sub chkCompat_Click() + + txtCompMajor.Enabled = chkCompat.Value + txtCompMinor.Enabled = chkCompat.Value + txtCompRelease.Enabled = chkCompat.Value + +End + +Private Sub UpdateInfo() + + If $bInitInfo Then Return + + ReadComponent + + 'Me.Title = + 'lblTitle.Text = Project.Name + + ' Try aClass = Split(File.Load(Project.Dir &/ ".list"), "\n", "", True) + ' If Not Error Then + ' For iInd = 0 To aClass.Max + ' If Left(aClass[iInd]) = "?" Then aClass[iInd] = Mid$(aClass[iInd], 2) + ' Next + ' Endif + ' lstExport.List = aClass + + $bInitInfo = True + +End + +Public Sub Form_Arrange() + + btnReset.Move(btnReset.Parent.W - btnReset.W - Desktop.Scale, Desktop.Scale) + +End + + +Public Sub btnAddRequire_Click() + + Dim sComp As String + + sComp = FSelectComponent.Run($aRequire.Copy().Insert($aExclude)) + If Not sComp Then Return + AddRequireExclude(sComp, $aRequire) + +End + +Public Sub btnAddExclude_Click() + + Dim sComp As String + + sComp = FSelectComponent.Run($aExclude.Copy().Insert($aRequire)) + If Not sComp Then Return + AddRequireExclude(sComp, $aExclude) + +End + + +Public Sub panGeneral_Arrange() + + txtAuthor.H = panGeneral.H - txtAuthor.Y - Desktop.Scale + +End + +Public Sub txtVendor_KeyPress() + + Project.OnVendorKeyPress + +End + +Public Sub gvwLibrary_Select() + + If $iCurrentLibrary >= 0 And If $iCurrentLibrary < gvwLibrary.Rows.Count Then + gvwLibrary[$iCurrentLibrary, 0].RichText = CLibraryInfo[$aLibraries[$iCurrentLibrary]].GetDescription(False) + gvwLibrary.Rows[$iCurrentLibrary].H = -1 + Endif + $iCurrentLibrary = gvwLibrary.Row + If $iCurrentLibrary >= 0 Then + gvwLibrary[$iCurrentLibrary, 0].RichText = CLibraryInfo[$aLibraries[$iCurrentLibrary]].GetDescription(True) + gvwLibrary.Rows[$iCurrentLibrary].H = -1 + Endif + + btnRemoveLib.Enabled = $iCurrentLibrary >= 0 + btnMoveDownLib.Enabled = btnRemoveLib.Enabled + btnMoveUpLib.Enabled = btnRemoveLib.Enabled + +End + +' Public Sub btnNewArgument_Click() +' +' Dim aArg As String[] +' +' tbvArgument.Save +' +' aArg = New String[] +' $aArg.Add(aArg) +' +' tbvArgument.Rows.Count = $aArg.Count +' +' tbvArgument.Row = $aArg.Max +' tbvArgument.Edit +' +' End +' +' Public Sub tbvArgument_Click() +' +' btnMoveDownArg.Enabled = tbvArgument.Row >= 0 And tbvArgument.Row < $aArg.Max +' btnMoveUpArg.Enabled = tbvArgument.Row > 0 +' tbvArgument.EditWith(txtArgument) +' $hComp = New FileCompletion(txtArgument) +' +' End +' +' Public Sub tbvArgument_Save(Row As Integer, (Column) As Integer, Value As String) +' +' $aArg[Row] = ArgumentFromString(Value) +' tbvArgument.Rows[Row].Height = -1 +' +' End +' +' Public Sub tbvArgument_Hide() +' +' btnMoveDownArg.Enabled = False +' btnMoveUpArg.Enabled = False +' +' End +' +' Public Sub btnMoveUpArg_Click() +' +' tbvArgument.Save +' Swap $aArg[tbvArgument.Row], $aArg[tbvArgument.Row - 1] +' tbvArgument.Refresh +' UpdateArguments +' Dec tbvArgument.Row +' tbvArgument_Click +' +' End +' +' Public Sub btnMoveDownArg_Click() +' +' tbvArgument.Save +' Swap $aArg[tbvArgument.Row], $aArg[tbvArgument.Row + 1] +' tbvArgument.Refresh +' UpdateArguments +' Inc tbvArgument.Row +' tbvArgument_Click +' +' End +' +' Public Sub tbvArgument_Insert() +' +' btnNewArgument_Click +' +' End + +Public Sub btnShowDeprecated_Click() + + choComponent.ShowDeprecated = btnShowDeprecated.Value + +End + +Private Sub UpdateVcInfo() + + Dim cInfo As Collection + Dim sValue As String + Dim iRow As Integer + Dim I As Integer + + If Not VersionControl.Enabled Then Return + If gvwVcInfo.Rows.Count Then Return + + Inc Application.Busy + + cInfo = VersionControl.Info() + + gvwVcInfo.Columns.Count = 2 + gvwVcInfo.Rows.Count = cInfo.Count + + For Each sValue In cInfo + gvwVcInfo[iRow, 0].Text = cInfo.Key + gvwVcInfo[iRow, 0].Alignment = Align.TopNormal + 'gvwVcInfo[iRow, 0].Foreground = Color.Merge(Color.TextBackground, Color.TextForeground, 0.7) + gvwVcInfo[iRow, 1].Text = sValue + Inc iRow + Next + + gvwVcInfo.Columns[0].W = -1 + gvwVcInfo.Columns[0].W += Desktop.Scale * 2 + + For I = 0 To gvwVcInfo.Rows.Count - 1 + gvwVcInfo.Rows[I].H = -1 + Next + + +Finally + + Dec Application.Busy + +End + +Private Sub UpdateEnv() + + tvwEnv.Rows.Count = $aEnv.Count + tvwEnv.Columns[0].Width = -1 + tvwEnv.Columns[0].Width = Max(tvwEnv.Columns[0].Width, Desktop.Scale * 24) + tvwEnv.Refresh + +End + +Public Sub lstReferences_Add() + + Dim sPath As String + + Dialog.Title = ("Select a Gambas executable") + Dialog.Filter = ["*.gambas", ("Gambas executable")] + Dialog.Path = Project.Config["FProjectProperty/LastExtraReference"] + + If Dialog.OpenFile() Then Return + + sPath = Dialog.Path + Project.Config["FProjectProperty/LastExtraReference"] = sPath + + sPath = Project.MakeRelativeLink(sPath, Project.Dir &/ File.Name(sPath)) + If lstReferences.List.Exist(sPath) Then Return + + lstReferences.Add(sPath) + +End diff --git a/app/src/gambas3/.src/Project/FProjectProperty.form b/app/src/gambas3/.src/Project/FProjectProperty.form new file mode 100644 index 00000000..cc63642d --- /dev/null +++ b/app/src/gambas3/.src/Project/FProjectProperty.form @@ -0,0 +1,721 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,112,73) + Text = ("Project properties") + Icon = Picture["icon:/small/edit"] + Persistent = True + Resizable = False + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + { mnuInsertEnv Menu + { Menu17 Menu mnuInsertEnv + Name = "Menu17" + #Translate = False + Text = "GB_GUI=gb.qt4" + Tag = "GB_GUI=gb.qt4" + } + { Menu1 Menu mnuInsertEnv + Name = "Menu1" + #Translate = False + Text = "GB_GUI=gb.qt5" + Tag = "GB_GUI=gb.qt5" + } + { Menu2 Menu mnuInsertEnv + Name = "Menu2" + #Translate = False + Text = "GB_GUI=gb.gtk" + Tag = "GB_GUI=gb.gtk" + } + { Menu9 Menu mnuInsertEnv + Name = "Menu9" + #Translate = False + Text = "GB_GUI=gb.gtk3" + Tag = "GB_GUI=gb.gtk3" + } + { Menu20 Menu + } + { Menu18 Menu mnuInsertEnv + Name = "Menu18" + #Translate = False + Text = "GB_GUI_BUSY=1" + Tag = "GB_GUI_BUSY=1" + } + { Menu19 Menu mnuInsertEnv + Name = "Menu19" + #Translate = False + Text = "GB_X11_INIT_THREADS=1" + Tag = "GB_X11_INIT_THREADS=1" + } + { Menu12 Menu mnuInsertEnv + Name = "Menu12" + #Translate = False + Text = "LIBOVERLAY_SCROLLBAR=0" + Tag = "LIBOVERLAY_SCROLLBAR=0" + } + { Menu10 Menu + } + { Menu16 Menu mnuInsertEnv + Name = "Menu16" + #Translate = False + Text = "GB_DB_DEBUG=1" + Tag = "GB_DB_DEBUG=1" + } + { Menu13 Menu + } + { Menu5 Menu mnuInsertEnv + Name = "Menu5" + #Translate = False + Text = "LANGUAGE=C ; LANG=C ; LC_ALL=C" + Tag = "LANGUAGE=C,LANG=C,LC_ALL=C" + } + { Menu8 Menu mnuInsertEnv + Name = "Menu8" + #Translate = False + Text = "GB_REVERSE=1" + Tag = "GB_REVERSE=1" + } + { Menu11 Menu + } + { Menu3 Menu mnuInsertEnv + Name = "Menu3" + #Translate = False + Text = "GB_STOCK_DEBUG=1" + Tag = "GB_STOCK_DEBUG=1" + } + { Menu15 Menu + } + { Menu21 Menu mnuInsertEnv + Name = "Menu21" + #Translate = False + Text = "GB_NO_JIT=1" + Tag = "GB_NO_JIT=1" + } + { Menu4 Menu mnuInsertEnv + Name = "Menu4" + #Translate = False + Text = "GB_JIT_DEBUG=1" + Tag = "GB_JIT_DEBUG=1" + } + { Menu14 Menu + } + { Menu7 Menu mnuInsertEnv + Name = "Menu7" + #Translate = False + Text = "GB_HTTPD_DEBUG=1" + Tag = "GB_HTTPD_DEBUG=1" + } + { Menu6 Menu mnuInsertEnv + Name = "Menu6" + #Translate = False + Text = "GB_HTTPD_PORT=8080" + Tag = "GB_HTTPD_PORT=8080" + } + } + { ipnProject IconPanel + MoveScaled(1,1,108,66) + Expand = True + Arrangement = Arrange.Vertical + Spacing = True + Count = 7 + Border = True + Index = 0 + Text = ("General") + Picture = Picture["icon:/large/gambas"] + { Panel4 VBox + MoveScaled(0,0,86,65) + Expand = True + Spacing = True + { Panel1 HBox + MoveScaled(0,0,84,9) + Spacing = True + { VBox1 HPanel + MoveScaled(0,0,72,9) + Expand = True + Spacing = True + { Label28 Label + MoveScaled(0,0,16,4) + Font = Font["Bold"] + Text = ("Name") + } + { lblName Label + MoveScaled(18,0,24,4) + Font = Font["+4,Bold"] + Expand = True + } + { Label29 Label + MoveScaled(0,5,16,4) + Font = Font["Bold"] + Text = ("Location") + } + { txtPath TextBox + MoveScaled(18,5,27,4) + Expand = True + ReadOnly = True + } + } + { Panel9 VBox + MoveScaled(73,0,9,9) + { btnIcon ToolButton + MoveScaled(0,0,9,9) + Border = True + } + } + } + { panGeneral HPanel + MoveScaled(0,10,84,54) + Expand = True + AutoResize = True + Spacing = True + { Label16 Label + MoveScaled(0,0,16,4) + Font = Font["Bold"] + Text = ("Type") + } + { Panel7 Panel + MoveScaled(18,0,61,4) + { cmbType ComboBox + MoveScaled(0,0,32,4) + Expand = True + ReadOnly = True + List = [("Normal"), ("Library"), ("Component")] + } + } + { Label18 Label + MoveScaled(0,5,16,4) + Font = Font["Bold"] + Text = ("Vendor") + } + { txtVendor MaskBox + MoveScaled(18,5,44,4) + Expand = True + Filter = "[A-Za-z0-9_-]" + } + { Label10 Label + MoveScaled(0,10,16,4) + Font = Font["Bold"] + Text = ("Version") + } + { HBox1 HBox + MoveScaled(18,10,64,4) + Expand = True + Spacing = True + { txtMajor SpinBox + MoveScaled(0,0,9,4) + MaxValue = 9999 + } + { txtMinor SpinBox + MoveScaled(10,0,9,4) + MaxValue = 9999 + } + { txtRelease SpinBox + MoveScaled(20,0,12,4) + MaxValue = 999999 + } + { chkGetVersionFromFile CheckBox + MoveScaled(33,0,24,4) + Expand = True + Text = ("Get from 'VERSION' file") + } + } + { Label12 Label + MoveScaled(0,15,16,4) + Font = Font["Bold"] + Text = ("Title") + } + { txtTitle TextBox + MoveScaled(18,15,60,4) + Expand = True + } + { Label3 Label + MoveScaled(0,19,16,4) + Font = Font["Bold"] + Text = ("Description") + } + { txtDesc TextArea + MoveScaled(18,20,60,16) + Expand = True + Wrap = True + } + { Label11 Label + MoveScaled(0,37,16,4) + Font = Font["Bold"] + Text = ("Authors") + } + { txtAuthor TextArea + MoveScaled(18,37,57,16) + Expand = True + Wrap = True + } + } + } + Index = 1 + Text = ("Information") + Picture = Picture["icon:/large/info"] + { Panel5 VBox + MoveScaled(2,1,82,65) + Expand = True + Spacing = True + { lblInfo Label + MoveScaled(0,0,79,3) + Font = Font["Bold"] + Text = ("Information") + } + { HBox15 HBox + MoveScaled(0,4,78,4) + Spacing = True + Indent = True + { Label26 Label + MoveScaled(0,0,33,4) + Text = ("Progress") + } + { cmbComponentState ComboBox + MoveScaled(34,0,32,4) + ReadOnly = True + List = [("Finished and stable"), ("Not finished but stable"), ("Experimental"), ("Deprecated")] + } + } + { HBox16 HBox + MoveScaled(0,9,71,4) + Spacing = True + Indent = True + { Label25 Label + MoveScaled(0,0,33,4) + Text = ("This component is hidden") + } + { btnHidden SwitchButton + MoveScaled(34,0,8,4) + Animated = True + } + } + { panCompatible HBox + MoveScaled(0,14,71,4) + Spacing = True + Indent = True + { chkCompat CheckBox + MoveScaled(0,0,33,4) + Text = ("Compatible until version") + } + { txtCompMajor SpinBox + MoveScaled(34,0,9,4) + Enabled = False + MaxValue = 9999 + } + { txtCompMinor SpinBox + MoveScaled(44,0,9,4) + Enabled = False + MaxValue = 9999 + } + { txtCompRelease SpinBox + MoveScaled(54,0,12,4) + Enabled = False + MaxValue = 999999 + } + } + { HBox14 HBox + MoveScaled(0,19,71,4) + Spacing = True + Indent = True + { Label13 Label + MoveScaled(0,0,33,4) + Text = ("Include information from") + } + { txtIncludeInfo TextBox + MoveScaled(34,0,19,4) + Expand = True + } + } + { Label15 Label + MoveScaled(0,24,79,3) + Font = Font["Bold"] + Text = ("Required features") + } + { HBox7 HBox + MoveScaled(0,28,75,12) + Indent = True + { panNeed Panel + MoveScaled(1,0,37,12) + Expand = True + Arrangement = Arrange.Vertical + { CheckBox5 CheckBox + MoveScaled(0,0,36,4) + Tag = "Form" + Text = ("Graphical form management") + } + { CheckBox6 CheckBox + MoveScaled(0,4,36,4) + Tag = "EventLoop" + Text = ("Event loop management") + } + { CheckBox7 CheckBox + MoveScaled(0,8,36,4) + Tag = "ImageIO" + Text = ("Image loading and saving") + } + } + { panNeed2 VBox + MoveScaled(39,0,30,12) + Expand = True + { CheckBox8 CheckBox + MoveScaled(0,0,29,4) + Tag = "OpenGLViewer" + Text = ("OpenGL display") + } + { CheckBox1 CheckBox + MoveScaled(0,4,29,4) + Tag = "XML" + Text = ("XML management") + } + } + } + { Panel12 HBox + MoveScaled(0,41,80,3) + { Label14 Label + MoveScaled(0,0,35,3) + Font = Font["Bold"] + Expand = True + Text = ("Required and excluded components") + } + } + { HBox10 HBox + MoveScaled(0,45,81,18) + Expand = True + Spacing = True + { lvwRequire ListView + MoveScaled(1,1,47,16) + Expand = True + Sorted = True + } + { VBox5 VBox + MoveScaled(59,1,20,17) + Spacing = True + { btnAddRequire Button + MoveScaled(0,0,16,4) + Text = ("Require") & "..." + Picture = Picture["icon:/small/ok"] + } + { btnAddExclude Button + MoveScaled(0,4,16,4) + Text = ("Exclude") & "..." + Picture = Picture["icon:/small/close"] + } + { btnRemove Button + MoveScaled(0,8,17,4) + Text = Shortcut(("Remove"), "R") + Picture = Picture["icon:/small/remove"] + } + { btnRemoveAll Button + MoveScaled(0,12,17,4) + Text = ("Remove All") + Picture = Picture["icon:/small/trash"] + } + } + } + } + Index = 2 + Text = ("Components") + Picture = Picture["icon:/large/component"] + { choComponent ComponentChooser + MoveScaled(6,9,67,37) + Expand = True + } + Index = 3 + Text = ("Libraries") + Picture = Picture["icon:/large/plugin"] + { Panel13 VBox + MoveScaled(1,1,85.75,63.875) + Expand = True + Spacing = True + { Label9 Label + MoveScaled(0,0,26,3) + Font = Font["Bold"] + Text = ("Libraries") + } + { Label17 Label + MoveScaled(1,4,60,4) + Visible = False + AutoResize = True + Text = ("Runtime library search path") + } + { txtLibraryPath TextBox + MoveScaled(1,8,24,4) + Visible = False + } + { Panel2 Panel + MoveScaled(0,14,84.875,20.875) + Expand = True + Arrangement = Arrange.Vertical + Border = Border.Plain + { gvwLibrary GridView + MoveScaled(1,0,59,14) + Expand = True + Border = False + Mode = Select.Single + Grid = False + } + { Separator1 Separator + MoveScaled(56,14,12,0) + } + { HBox18 HBox + MoveScaled(0,16,84,4) + Background = Color.TextBackground + { btnInsertLib ToolButton + MoveScaled(0,0,17,4) + AutoResize = True + Text = Shortcut(("Add"), "A") & "..." + Picture = Picture["icon:/small/add"] + } + { btnRemoveLib ToolButton + MoveScaled(18,0,17,4) + Enabled = False + AutoResize = True + Text = Shortcut(("Remove"), "R") + Picture = Picture["icon:/small/remove"] + } + { btnMoveUpLib ToolButton + MoveScaled(36,0,4,4) + Enabled = False + Picture = Picture["icon:/small/up"] + } + { btnMoveDownLib ToolButton + MoveScaled(43,0,4,4) + Enabled = False + Picture = Picture["icon:/small/down"] + } + } + } + { Label6 Label + MoveScaled(0,39,29,3) + Font = Font["Bold"] + Text = ("Additional references") + } + { lstReferences ListEditor + MoveScaled(0,43,79,20) + Expand = True + ReadOnly = True + Unique = True + } + } + Index = 4 + Text = ("Environment") + Picture = Picture["icon:/large/attach"] + { Panel3 Panel + MoveScaled(9,9,69,42) + Expand = True + Arrangement = Arrange.Vertical + Border = Border.Plain + { tvwEnv TableView + MoveScaled(0,0,68,20) + Expand = True + Border = False + Padding = 4 + Header = GridView.Horizontal + } + { Separator2 Separator + MoveScaled(28,24,15,0) + } + { HBox3 HBox + MoveScaled(1,34,64,4) + Background = Color.TextBackground + { btnInsertEnv MenuButton + MoveScaled(0,0,19,4) + AutoResize = True + Text = ("&Add") + Picture = Picture["icon:/small/add"] + Border = False + Menu = "mnuInsertEnv" + } + { btnRemoveEnv ToolButton + MoveScaled(20,0,17,4) + AutoResize = True + Text = Shortcut(("Remove"), "R") + Picture = Picture["icon:/small/remove"] + } + } + } + Index = 5 + Text = ("Options") + Picture = Picture["icon:/large/options"] + { Panel6 VBox + MoveScaled(1,2,86,60) + Expand = True + Spacing = True + { Label7 Label + MoveScaled(0,0,84,3) + Font = Font["Bold"] + Text = ("Edition") + Alignment = Align.BottomNormal + } + { HBox13 HBox + MoveScaled(1,4,83,4) + Spacing = True + Indent = True + { Label1 Label + MoveScaled(0,0,46,4) + Text = ("Tab size") + } + { txtTabSize SpinBox + MoveScaled(47,0,8,4) + MinValue = 1 + MaxValue = 16 + Value = 2 + } + { Label5 Label + MoveScaled(59,0,22,4) + Text = ("space(s)") + } + } + { HBox4 HBox + MoveScaled(1,9,83,4) + Spacing = True + Indent = True + { Label2 Label + MoveScaled(0,0,46,4) + Text = ("Show deprecated components and controls") + } + { btnShowDeprecated SwitchButton + MoveScaled(47,0,8,4) + Animated = True + } + } + { Label8 Label + MoveScaled(0,14,84,3) + Font = Font["Bold"] + Text = ("Compilation") + Alignment = Align.BottomNormal + } + { HBox12 HBox + MoveScaled(1,18,83,4) + Spacing = True + Indent = True + { Label21 Label + MoveScaled(0,0,46,4) + Text = ("Module symbols are public by default") + } + { btnModulePublic SwitchButton + MoveScaled(47,0,8,4) + Animated = True + } + } + { HBox11 HBox + MoveScaled(1,23,83,4) + Spacing = True + Indent = True + { Label22 Label + MoveScaled(0,0,46,4) + Text = ("Form controls are public") + } + { btnControlPublic SwitchButton + MoveScaled(47,0,8,4) + Animated = True + } + } + { HBox5 HBox + MoveScaled(1,28,83,4) + Spacing = True + Indent = True + { Label4 Label + MoveScaled(0,0,46,4) + Text = ("Activate warnings") + } + { btnWarning SwitchButton + MoveScaled(47,0,8,4) + Animated = True + } + } + { Label19 Label + MoveScaled(0,33,84,3) + Font = Font["Bold"] + Text = ("Translation") + Alignment = Align.BottomNormal + } + { HBox9 HBox + MoveScaled(1,37,83,4) + Spacing = True + Indent = True + { Label24 Label + MoveScaled(0,0,46,4) + Text = ("Project is translatable") + } + { btnTranslate SwitchButton + MoveScaled(47,0,8,4) + Animated = True + } + } + { HBox8 HBox + MoveScaled(1,42,83,4) + Spacing = True + Indent = True + { Label20 Label + MoveScaled(0,0,46,4) + Text = ("Default language") + } + { cmbDefaultLanguage ComboBox + MoveScaled(47,0,36,4) + Expand = True + ReadOnly = True + Sorted = True + } + } + { Label27 Label + MoveScaled(0,47,84,3) + Font = Font["Bold"] + Text = ("Version control") + Alignment = Align.BottomNormal + } + { HBox6 HBox + MoveScaled(1,52,83,4) + Spacing = True + Indent = True + { Label23 Label + MoveScaled(0,0,46,4) + Text = ("Add branch to version number") + } + { btnVersionAddBranch SwitchButton + MoveScaled(47,0,8,4) + Animated = True + } + } + } + Index = 6 + Text = ("Statistics") + Picture = Picture["icon:/large/monitor"] + { gvwStat GridView + MoveScaled(3,4,62,25) + Expand = True + Grid = False + Padding = 4 + } + { gvwVcInfo GridView + MoveScaled(4,35,62,25) + Expand = True + Padding = 4 + } + Index = 0 + } + { Panel10 HBox + MoveScaled(12,68,83,4) + Spacing = True + { Panel11 Panel + MoveScaled(0,1,14,3) + Expand = True + } + { btnReset Button + MoveScaled(19,0,17,4) + Visible = False + Text = Shortcut(("Reset"), "R") + Picture = Picture["icon:/small/undo"] + } + { btnOK Button + MoveScaled(37,0,17,4) + Text = ("OK") + Default = True + } + { btnCancel Button + MoveScaled(55,0,18,4) + Text = ("Cancel") + Cancel = True + } + } +} diff --git a/app/src/gambas3/.src/Project/FSaveProjectAs.class b/app/src/gambas3/.src/Project/FSaveProjectAs.class new file mode 100644 index 00000000..4563ffa8 --- /dev/null +++ b/app/src/gambas3/.src/Project/FSaveProjectAs.class @@ -0,0 +1,103 @@ +' Gambas class file + +Static Private $sNewPath As String + +Public Sub Run() + + $sNewPath = "" + If Me.ShowModal() Then + Project.Open($sNewPath) + Endif + +End + +Public Sub btnOK_Click() + + Dim sDir As String + Dim sName As String + Dim sMsg As String + Dim aLine As String[] + Dim iCount As Integer + Dim I As Integer + + sName = Trim(txtName.Text) + sDir = dchProject.Value + + sMsg = Project.CheckProjectName(sName, sDir) + If sMsg + txtName.SetFocus + txtName.SelectAll + Balloon.Warning(sMsg, txtName) + Return + Endif + + sDir &/= sName + + If sDir Begins (Project.Dir & "/") Then + dchProject.SetFocus + Balloon.Warning(("Cannot save a project inside its own directory."), txtName) + Return + Endif + + Inc Application.Busy + Project.Save + Project.CopyProject(Project.Dir, sDir) + + aLine = Split(File.Load(sDir &/ ".project"), "\n") + iCount = aLine.Count + I = aLine.Find("ExecPath=*", gb.Like) + If I >= 0 Then aLine.Remove(I) + I = aLine.Find("SourcePath=*", gb.Like) + If I >= 0 Then aLine.Remove(I) + If aLine.Count <> iCount Then File.Save(sDir &/ ".project", aLine.Join("\n")) + + Project.CleanUp(sDir) + + Dec Application.Busy + $sNewPath = sDir + Me.Close(True) + +Catch + + Application.Busy = 0 + Message.Error(("Unable to save the project.") & "\n\n" & Error.Text) + +End + +Public Sub btnCancel_Click() + + Me.Close + +End + +Public Sub Form_Open() + + txtName.Text = Project.Name + txtName.SelectAll + txtName.SetFocus + + Settings.Read(Me) + Settings.Read(dchProject, "dchProject") + + dchProject.Bookmarks = Project.GetBookmarks() + +End + +Public Sub Form_Close() + + Settings.Write(Me) + Settings.Write(dchProject, "dchProject") + +End + +Public Sub txtName_Change() + + lblFinalDir.Text = dchProject.Value &/ Trim(txtName.Text) + +End + +Public Sub dchProject_Change() + + txtName_Change + +End diff --git a/app/src/gambas3/.src/Project/FSaveProjectAs.form b/app/src/gambas3/.src/Project/FSaveProjectAs.form new file mode 100644 index 00000000..ea879da7 --- /dev/null +++ b/app/src/gambas3/.src/Project/FSaveProjectAs.form @@ -0,0 +1,65 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,68,72) + Text = ("Save project as") + Icon = Picture["icon:/small/save-as"] + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + { Label2 Label + MoveScaled(1,1,30,3) + Font = Font["Bold"] + Text = ("New project parent directory") + } + { dchProject DirChooser + MoveScaled(1,5,64,43) + Expand = True + } + { Label1 Label + MoveScaled(1,49,19,3) + Font = Font["Bold"] + Text = ("New project name") + } + { txtName TextBox + MoveScaled(1,52,41,4) + } + { Label3 Label + MoveScaled(1,57,76,2) + Font = Font["Italic,-1"] + Text = ("The project name is the name of the project directory.") + } + { Panel1 HBox + MoveScaled(1,60,74,2) + Spacing = True + { Label16 Label + MoveScaled(0,0,23,2) + Font = Font["Italic,-1"] + AutoResize = True + Text = ("The project final directory is :") + } + { lblFinalDir Label + MoveScaled(24,0,39,2) + Font = Font["Bold,-1"] + Expand = True + } + } + { Panel2 Panel + MoveScaled(23,63,10,1) + } + { HBox1 HBox + MoveScaled(1,65,66,4) + Spacing = True + Invert = True + { btnCancel Button + MoveScaled(48,0,16,4) + Text = ("Cancel") + Cancel = True + } + { btnOK Button + MoveScaled(31,0,16,4) + Text = Shortcut(("Save"), "S") + Default = True + } + } +} diff --git a/app/src/gambas3/.src/Project/Farm/CSoftware.class b/app/src/gambas3/.src/Project/Farm/CSoftware.class new file mode 100644 index 00000000..88b51cdc --- /dev/null +++ b/app/src/gambas3/.src/Project/Farm/CSoftware.class @@ -0,0 +1,692 @@ +' Gambas class file + +Event Change +Event Screenshot + +Static Public InstallAge As Integer = 1 + +Public Enum STATE_WAIT = 0, STATE_INFO = 1, STATE_ICON = 2, STATE_READY = 3, STATE_ERROR = 4 + +Static Property Read IconSize As Integer + +Property Read Farm As String + +Public State As Integer +Public Id As Integer +Public Name As String +Public Version As String +Public LastVersion As Boolean +Public Vendor As String +Public UploadDate As Date +Public Description As String +Public URL As String +Public RequiredGambasVersion As String +Public Checksum As String +Public Owner As String +Public DownloadCount As Integer +Public FullDownloadCount As Integer +Public VoteCount As Integer +Public YourVote As Integer +Public Icon As Image +Public Background As Image +Public Tags As String[] +Public Screenshot As Image +Public Size As Long + +Public Observed As Boolean +Public ErrorText As String + +Static Private $cCache As New Collection + +Private $sVersion As String +Private $sFarm As String +Private $hRequest As FarmRequest +Private $hRequestIcon As FarmRequest +Private $hRequestScreenshot As FarmRequest +Private $bGotScreenshot As Boolean + +Private $sInstallVersion As String +Private $iInstallVersionAge As Integer + +Static Public Sub ClearCache(Optional sFarm As String) + + If Not sFarm Then + $cCache.Clear + Else + $cCache[sFarm] = Null + Endif + +End + +Static Public Sub Exit() + + ClearCache + FarmIdentity.Exit + +End + + +Static Public Sub Get(sFarm As String, iId As Integer) As CSoftware + + Dim hSoft As CSoftware + + If Not $cCache.Exist(sFarm) Then $cCache[sFarm] = New Collection + + hSoft = $cCache[sFarm][iId] + If Not hSoft Then + hSoft = New CSoftware(iId, sFarm) + $cCache[sFarm][iId] = hSoft + Endif + Return hSoft + +End + + +Public Sub _new(iId As Integer, sFarm As String) ', sLogin As String, sPassword As String) + + Id = iId + $sFarm = sFarm + +End + +Public Sub Start() + + Try $hRequest.Abort + $hRequest = New FarmRequest($sFarm) As "Request" + $hRequest.GetSoftware(Id) + + Try $hRequestIcon.Abort + $hRequestIcon = New FarmRequest($sFarm) As "IconRequest" + $hRequestIcon.GetSoftwareIcon(Id) + + State = STATE_WAIT + +End + +Public Sub Abort() + + Try $hRequest.Abort + Try $hRequestIcon.Abort + +End + + + +Public Sub Request_Finished() + + Dim hReq As FarmRequest = Last + Dim cResult As Collection + + If hReq.HasFailed() Then + ErrorText = hReq.ErrorText + State = STATE_ERROR + $hRequestIcon.Abort + Raise Change + Return + Endif + + cResult = hReq.Result + + Name = UnQuote(cResult["Name"]) + $sVersion = cResult["Version"] + Version = $sVersion & "." & cResult["Release"] + LastVersion = CInt(cResult["LastVersion"]) + Vendor = UnQuote$(cResult["Vendor"]) + UploadDate = FarmRequest.GetDate(cResult["UploadDate"]) + Description = UnQuote(cResult["Description"]) + URL = Trim(UnQuote$(cResult["URL"])) + RequiredGambasVersion = cResult["RequiredGambasVersion"] + Checksum = UnQuote(cResult["Checksum"]) + Try DownloadCount = CInt(cResult["DownloadCount"]) + Try FullDownloadCount = CInt(cResult["FullDownloadCount"]) + Try VoteCount = CInt(cResult["VoteCount"]) + Owner = UnQuote(cResult["Owner"]) + If cResult.Exist("YourVote") Then + YourVote = cResult["YourVote"] + Else + YourVote = -1 + Endif + Tags = Split(cResult["Tags"]).Sort() + Try Size = CLong(cResult["Size"]) + + State = State Or STATE_INFO + Raise Change + +End + +Public Sub IconRequest_Finished() + + Dim hReq As FarmRequest = Last + + If hReq.HasFailed() Then + ErrorText = hReq.ErrorText + State = STATE_ERROR + $hRequest.Abort + Raise Change + Return + Endif + + Try Icon = Image.Load(hReq.ResultFile).Stretch(-1, CSoftware.IconSize) + State = State Or STATE_ICON + Raise Change + +End + +Public Sub IsFinished() As Boolean + + Return State = STATE_READY Or State = STATE_ERROR + +End + +Public Sub GetInstalledDir() As String + + Return Desktop.DataDir &/ "gambas3/src" &/ LCase(Vendor) &/ Name + +End + + +Public Sub GetInstallVersion() As String + + Dim sPath As String + Dim sLine As String + + If Not IsFinished() Then Return + If $iInstallVersionAge >= InstallAge Then Return $sInstallVersion + + $sInstallVersion = "" + sPath = GetInstalledDir() &/ ".project" + If Exist(sPath) Then + For Each sLine In Split(File.Load(sPath), "\n") + If sLine Begins "Version=" Then + $sInstallVersion = Trim(Mid$(sLine, 9)) + Break + Endif + Next + Endif + + $iInstallVersionAge = InstallAge + Return $sInstallVersion + +End + +' +' Private Sub MakeBackground() +' +' Dim X, Y As Integer +' Dim iCol As Integer +' Dim I As Integer +' +' Background = New Image(128, 128, Color.White) +' +' Randomize Val("&H" & Right(Checksum, 8)) +' +' Paint.Begin(Background) +' +' For I = 1 To 64 +' +' X = Rand(0, Background.W - 1) +' Y = Rand(0, Background.H - 1) +' +' iCol = Icon[Rand(Icon.W - 1), Rand(Icon.H - 1)] +' If Color[iCol].Alpha >= 128 Then iCol = Color.White +' iCol = Color.SetAlpha(iCol, 192) +' +' Paint.Ellipse(X, Y, 64, 64) +' Paint.Ellipse(X - Background.W, Y, 64, 64) +' Paint.Ellipse(X, Y - Background.H, 64, 64) +' Paint.Ellipse(X - Background.W, Y - Background.H, 64, 64) +' Paint.Background = iCol +' Paint.Fill +' +' Next +' +' Paint.End +' +' Background = Background.Opacity(0.3) +' +' End + +Public Sub GetTitle() As String + + Return Name & " " & Version + +End + +Public Sub IsInstalled() As Boolean + + Return GetInstallVersion() + +End + +Public Sub IsReallyInstalled() As Boolean + + Dim sVersion As String + + sVersion = GetInstallVersion() + If Not sVersion Then Return + Return Comp(Version, sVersion, gb.Natural) = 0 + +End + +Public Sub CanUpgrade() As Boolean + + Dim sVersion As String + + sVersion = GetInstallVersion() + If Not sVersion Then Return + Return Comp(Version, sVersion, gb.Natural) > 0 + +End + +Public Sub Install(Optional bJustDownload As Boolean) As String + + Dim hReq As FarmRequest + Dim sDir As String + Dim sPath As String + Dim sExec As String + Dim sOption As String + Dim sName As String + Dim aMissing As String[] + Dim sResult As String + Dim sSrcDir As String + Dim sExecDir As String + Dim sErr As String + Dim hDesktopFile As DesktopFile + Dim hProjectInfo As CProjectInfo + Dim sComp As String + Dim sTag As String + Dim aCat As String[] + Dim aExistCat As String[] + + ' Create directories + + sDir = Desktop.DataDir &/ "gambas3" + + sSrcDir = sDir &/ "src" &/ LCase(Vendor) + Project.MakeDir(sSrcDir) + sExecDir = Desktop.DataDir &/ "gambas3/bin" &/ LCase(Vendor) + Project.MakeDir(sExecDir) + + ' Download source archive + + hReq = New FarmRequest($sFarm) + + hReq.DownloadSoftware(Id) + If hReq.WaitFor() Then + If Not hReq.ErrorText Then + Return ("Download cancelled") + Else + Return hReq.ErrorText + Endif + Endif + + ' Check the checksum + + If FarmRequest.GetCheckSum(hReq.ResultFile) <> Checksum Then + Error.Raise(("The checksum of the downloaded package is invalid.")) + Endif + + sPath = hReq.ResultFile + + ' Uncompress the archive + + If sPath Ends ".tar.gz" Then + sOption = "z" + Else If sPath Ends ".tar.bz2" Then + sOption = "j" + Else + Error.Raise("Unknown archive format") + Endif + + Shell "cd " & Shell(File.Dir(sPath)) & " && tar x" & sOption & "f " & Shell(sPath) Wait + If Process.LastValue Then Error.Raise(("Unable to uncompress source archive.")) + + ' Analyze the project file + + aMissing = New String[] + + sName = Name + sDir = File.SetName(sPath, sName) + hProjectInfo = New CProjectInfo(sDir) + + ' Check the components + + For Each sComp In hProjectInfo.Components + If Not Exist(Component.Path &/ sComp & ".component") Then + aMissing.Add(sComp) + Endif + Next + + If aMissing.Count Then + If Message.Warning(("The following components are required:") & "\n\n" & aMissing.Join(", "), ("Abort"), ("Ignore")) = 1 Then + sErr = "*" + Goto LEAVE_INSTALL + Endif + Endif + + ' TODO: Check the libraries + + If bJustDownload Then + + GoSub INSTALL_SOURCE + + Else + + ' Compile the project + ' TODO: Use translatable error messages? + + sExec = System.Path &/ "bin/gbc" & System.Version & " -a -g -x " + If hProjectInfo.Translate Then sExec &= "-t " + If hProjectInfo.ControlPublic Then sExec &= "-p " + If hProjectInfo.ModulePublic Then sExec &= "-m " + sExec &= Shell$(sDir) + sExec &= " 2>&1" + + Shell sExec To sResult + + If Process.LastValue Then + Error.Raise(("Unable to compile the project.") & "\n\n" & sResult) + Endif + + ' Make executable + + sExec = System.Path &/ "bin/gba" & System.Version & " -o " & Shell$(sDir &/ sName & ".gambas") & " " & Shell$(sDir) & " 2>&1" + Shell sExec To sResult + If Process.LastValue Then Error.Raise(("Unable to make executable.") & "\n\n" & Trim(sResult)) + + ' Install executable + + Try Kill sExecDir &/ sName & ".gambas" + Copy sDir &/ sName & ".gambas" To sExecDir &/ sName & ".gambas" + Chmod sExecDir &/ sName & ".gambas" To "..x..x..x" + Try Kill sDir &/ sName & ".gambas" + + GoSub INSTALL_SOURCE + + ' Make a desktop file unless the project is a library or a component + + If hProjectInfo.Type = Project.TYPE_NORMAL Then + + aExistCat = Split(File.Load("install/categories"), "\n", "", True) + aCat = New String[] + For Each sTag In Tags + If aExistCat.Exist(sTag, gb.IgnoreCase) Then + aCat.Add(sTag) + Endif + Next + + Try Kill Desktop.DataDir &/ "applications" &/ "gambas-" & LCase(Vendor) & "-" & sName & ".desktop" + If hProjectInfo.CreateMenu Then + hDesktopFile = New DesktopFile(Desktop.DataDir &/ "applications" &/ "gambas-" & LCase(Vendor) & "-" & sName & ".desktop") + With hDesktopFile + .Name = hProjectInfo.GetTitle() + .Exec = sExecDir &/ sName & ".gambas" + If hProjectInfo.Icon Then .Icon = sSrcDir &/ sName &/ hProjectInfo.Icon + .Categories = aCat + End With + hDesktopFile.Save + Endif + + If Tags.Exist("ide extension", gb.IgnoreCase) Then + Try Mkdir File.SetName(sExecDir, ".extensions") + Link ".." &/ File.Name(sExecDir) &/ sName & ".gambas" To File.SetName(sExecDir, ".extensions") &/ sName + Endif + + Else If hProjectInfo.Type = Project.TYPE_LIBRARY Then + + sErr = Project.InstallLibrary(sExecDir &/ sName & ".gambas", Vendor, $sVersion) + If sErr Then Error.Raise(sErr) + + Endif + + Endif + + If LCase(Vendor) <> "example" And If Tags.Exist("example", gb.IgnoreCase) Then + Try Mkdir File.SetName(sSrcDir, "example") + Try Kill File.SetName(sSrcDir, "example") &/ sName + Link ".." &/ File.Name(sSrcDir) &/ sName To File.SetName(sSrcDir, "example") &/ sName + Endif + + Inc InstallAge + Start + Return + +INSTALL_SOURCE: + + ' Make a backup of the possible old version + + Exec ["rm", "-rf", sSrcDir &/ sName & "~"] Wait + Try Move sSrcDir &/ sName To sSrcDir &/ sName & "~" + + ' Move the source directory to its final location + + Exec ["mv", sDir, sSrcDir &/ sName] Wait + If Not IsDir(sSrcDir &/ sName) Then Error.Raise(("Unable to install source directory")) + + ' Remove the possible old version + + Exec ["rm", "-rf", sSrcDir &/ sName & "~"] Wait + + Return + +Catch + + sErr = Error.Text & "\n\n" & Error.Backtrace.Join(" ") + +LEAVE_INSTALL: + + ' Try to remove the partial installation + Try Move sSrcDir &/ sName & "~" To sSrcDir &/ sName + Try Kill sExecDir &/ sName & ".gambas" + Return sErr + +End + +Static Public Sub UninstallFromPath(sDir As String) As String + + Dim sVendor As String + Dim sName As String + Dim sExecDir As String + + Inc Application.Busy + + sName = File.Name(sDir) + sVendor = File.Name(File.Dir(sDir)) + + Exec ["rm", "-rf", sDir] Wait + + sExecDir = Desktop.DataDir &/ "gambas3/bin" + + Try Kill sExecDir &/ LCase(sVendor) &/ sName & ".gambas" + Try Rmdir sExecDir &/ LCase(sVendor) + Try Kill Desktop.DataDir &/ "applications" &/ "gambas-" & LCase(sVendor) & "-" & sName & ".desktop" + + If LCase(sVendor) <> "example" Then + Try Kill File.SetName(File.Dir(sDir), "example") &/ sName + Endif + + Try Kill File.SetName(sExecDir, ".extensions") &/ sName + + Dec Application.Busy + +Catch + + Dec Application.Busy + Return Error.Text + +End + + +Public Sub Uninstall() As String + + Dim sDir As String + Dim sErr As String + + If Not Me.IsInstalled() Then Return + + sDir = GetInstalledDir() + + sErr = UninstallFromPath(sDir) + If sErr Then Return sErr + + Inc InstallAge + Start + +End + +Public Sub DownloadScreenshot() As Boolean + + If $bGotScreenshot Then Return True + + $hRequestScreenshot = New FarmRequest($sFarm) As "ScreenshotRequest" + $hRequestScreenshot.DownloadScreenshot(Id) + +End + +Public Sub ScreenshotRequest_Finished() + + Dim hReq As FarmRequest = Last + + If Not hReq.HasFailed() Then + $bGotScreenshot = True + Try Screenshot = Image.Load(hReq.ResultFile) + Endif + + Raise Screenshot + +End + + +Public Sub MustReload() + + $cCache[$sFarm][Id] = Null + $hRequest.Abort + $hRequestIcon.Abort + $hRequestScreenshot.Abort + +End + + +Public Sub ToggleVote() As String + + Dim hReq As FarmRequest + + hReq = New FarmRequest($sFarm) + hReq.VoteForSoftware(Id, If(YourVote = 1, 0, 1)) + If hReq.WaitFor(,, True) Then + Return hReq.ErrorText + Endif + + Start + +Catch + + Return Error.Text + +End + +Private Function Farm_Read() As String + + Return $sFarm + +End + +Public Sub Delete() As String + + Dim hReq As FarmRequest + + hReq = New FarmRequest($sFarm) + hReq.DeleteSoftware(Id) + If hReq.WaitFor(,, True) Then + Return hReq.ErrorText + Endif + MustReload + +Catch + + Return Error.Text + +End + +Public Sub PaintName(X As Float, Y As Float) As Integer + + Dim iCol As Integer + Dim sText As String + Dim XO As Float + Dim W As Integer + Dim H As Integer + + Paint.Save + + iCol = Color.TextForeground + + Paint.Background = iCol + XO = X + + sText = Name + W = Paint.Font.TextWidth(sText) + H = Paint.Font.Height + Paint.DrawTextShadow(sText, X, Y, W, H, Align.TopLeft) + Paint.DrawText(sText, X, Y, W, H, Align.TopLeft) + + X += W + Desktop.Scale + Paint.DrawText(Version, X, Y, W, H, Align.TopLeft) + + X = XO + Y += H + Desktop.Scale \ 4 + + Paint.Font.Italic = True + Paint.Font.Grade -= 2 + Paint.Background = Color.Merge(iCol, Color.TextBackground) + Paint.DrawText(Vendor, X, Y, Paint.W, Paint.H, Align.TopLeft) + Y += Paint.Font.H + + Paint.Restore + + Return Y + +End + +Static Private Function IconSize_Read() As Integer + + Return Desktop.Scale * 6 + +End + +Public Sub GetUploadAge() As String + + Dim iDiff As Integer + + iDiff = DateDiff(UploadDate, Now, gb.Day) + + If iDiff = 1 Then + Return ("yesterday") + Else If iDiff < 7 Then + Return Subst(("&1 days ago"), CStr(iDiff)) + Endif + + iDiff = (iDiff + 6) \ 7 + + If iDiff = 1 Then + Return ("last week") + Else If iDiff <= 4 Then + Return Subst(("&1 weeks ago"), CStr(iDiff)) + Endif + + iDiff = DateDiff(UploadDate, Now, gb.Month) + + If iDiff = 1 Then + Return ("last month") + Else If iDiff < 12 Then + Return Subst(("&1 months ago"), iDiff) + Endif + + iDiff = DateDiff(UploadDate, Now, gb.Year) + + If iDiff = 1 Then + Return ("last year") + Else + Return Subst(("on &1"), CStr(Year(UploadDate))) + Endif + +End diff --git a/app/src/gambas3/.src/Project/Farm/CSoftwareGroup.class b/app/src/gambas3/.src/Project/Farm/CSoftwareGroup.class new file mode 100644 index 00000000..a230fc8c --- /dev/null +++ b/app/src/gambas3/.src/Project/Farm/CSoftwareGroup.class @@ -0,0 +1,27 @@ +' Gambas class file + +Public (Key) As String +Public Name As String +Public Icon As String + +Public Sub _compare(hOther As CSoftwareGroup) As Integer + + Return String.Comp(Name, hOther.Name, gb.IgnoreCase) + +End + +Static Public Sub _call(sKey As String, sName As String, sIcon As String) As CSoftwareGroup + + Dim hGroup As CSoftwareGroup + + hGroup = New CSoftwareGroup + With hGroup + .Key = sKey + .Name = sName + .Icon = sIcon + End With + Return hGroup + +End + + diff --git a/app/src/gambas3/.src/Project/Farm/FFarmConfig.class b/app/src/gambas3/.src/Project/Farm/FFarmConfig.class new file mode 100644 index 00000000..8cce6684 --- /dev/null +++ b/app/src/gambas3/.src/Project/Farm/FFarmConfig.class @@ -0,0 +1,32 @@ +' Gambas class file + + +Public Sub Run() As Boolean + + Return Not Me.ShowModal() + +End + +Public Sub Form_Open() + + lstFarm.List = FarmRequest.GetFarms() + +End + +Public Sub lstFarm_Change() + + FarmIdentity.FarmList = lstFarm.List + +End + +Public Sub btnCancel_Click() + + Me.Close + +End + +Public Sub btnOK_Click() + + Me.Close(True) + +End diff --git a/app/src/gambas3/.src/Project/Farm/FFarmConfig.form b/app/src/gambas3/.src/Project/Farm/FFarmConfig.form new file mode 100644 index 00000000..f560c639 --- /dev/null +++ b/app/src/gambas3/.src/Project/Farm/FFarmConfig.form @@ -0,0 +1,30 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,57,23) + Text = ("Farm servers") + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + { lstFarm ListEditor + MoveScaled(1,1,54,16) + Expand = True + } + { HBox1 HBox + MoveScaled(1,18,54,4) + Spacing = True + { Panel1 Panel + MoveScaled(4,0,13,4) + Expand = True + } + { btnOK Button + MoveScaled(20,0,16,4) + Text = ("OK") + } + { btnCancel Button + MoveScaled(37,0,16,4) + Text = ("Cancel") + Cancel = True + } + } +} diff --git a/app/src/gambas3/.src/Project/Farm/FFarmLogin.class b/app/src/gambas3/.src/Project/Farm/FFarmLogin.class new file mode 100644 index 00000000..dff34032 --- /dev/null +++ b/app/src/gambas3/.src/Project/Farm/FFarmLogin.class @@ -0,0 +1,113 @@ +' Gambas class file + +Static Private $sFarm As String +Static Private $hIdentity As FarmIdentity + +Static Property Read Identity As FarmIdentity + +Static Private Function Identity_Read() As FarmIdentity + + Return $hIdentity + +End + +Public Sub Run(sFarm As String) As Boolean + + $sFarm = sFarm + Return Not Me.ShowModal() + +End + +Public Sub btnOK_Click() + + Dim hReq As FarmRequest + + If Trim(txtLogin.Text) Then + hReq = New FarmRequest(cmbFarm.Text) + hReq.CheckAuth(Trim(txtLogin.Text), txtPassword.Text) + If hReq.WaitFor("", "", True) Then + Message.Error(("Authentication failed.")) + txtPassword.Clear + txtPassword.SetFocus + Stop Event + Return + Endif + Endif + + $hIdentity.Password = txtPassword.Text + 'Settings["/Farm"] = cmbFarm.Text + FarmIdentity.SaveSettings + + Me.Close(True) + +End + +Public Sub btnCancel_Click() + + Me.Close + +End + +Private Sub InitFarms() + + cmbFarm.List = FarmRequest.GetFarms() + cmbFarm.Text = FarmIdentity.LastFarm + If Not cmbFarm.Text Then cmbFarm.Text = FarmIdentity.DEFAULT_FARM + +End + +Public Sub Form_Open() + + InitFarms + + chkRememberPassword.Value = FarmIdentity.RememberPassword + +End + +Public Sub cmbFarm_Click() + + $hIdentity = FarmIdentity.Get(cmbFarm.Text) + txtLogin.Text = $hIdentity.Login + txtPassword.Text = $hIdentity.Password + +End + +Public Sub txtLogin_Change() + + $hIdentity.Login = Trim(txtLogin.Text) + +End + +Public Sub txtLogin_Activate() + + txtPassword.SetFocus + +End + +Public Sub txtPassword_Activate() + + btnOK.Value = True + +End + +Public Sub btnFarmConfig_Click() + + If FFarmConfig.Run() Then Return + InitFarms + +End + +Public Sub btnAnoymous_Click() + + txtLogin.Clear + txtPassword.Clear + btnOK.Value = True + +End + +Public Sub chkRememberPassword_Click() + + FarmIdentity.RememberPassword = CBool(chkRememberPassword.Value) + FarmIdentity.SaveSettings + +End diff --git a/app/src/gambas3/.src/Project/Farm/FFarmLogin.form b/app/src/gambas3/.src/Project/Farm/FFarmLogin.form new file mode 100644 index 00000000..896ce62a --- /dev/null +++ b/app/src/gambas3/.src/Project/Farm/FFarmLogin.form @@ -0,0 +1,90 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,64,28) + Text = ("Login") + Resizable = False + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + { HBox2 HBox + MoveScaled(1,1,58,4) + Spacing = True + { Label5 Label + MoveScaled(0,0,23,4) + Text = ("Server") + } + { cmbFarm ComboBox + MoveScaled(33,0,20,4) + Expand = True + ReadOnly = True + } + { btnFarmConfig Button + MoveScaled(54,0,4,4) + Picture = Picture["icon:/small/options"] + } + } + { HBox3 HBox + MoveScaled(1,6,58,4) + Spacing = True + { Label1 Label + MoveScaled(0,0,23,4) + Text = ("User") + } + { txtLogin TextBox + MoveScaled(33,0,24,4) + Expand = True + } + } + { HBox4 HBox + MoveScaled(1,11,58,4) + Spacing = True + { Label2 Label + MoveScaled(0,0,23,4) + Text = ("Password") + } + { txtPassword TextBox + MoveScaled(33,0,24,4) + Expand = True + Password = True + } + } + { HBox6 HBox + MoveScaled(1,16,58,3) + Spacing = True + { Label4 Label + MoveScaled(0,0,23,3) + } + { chkRememberPassword CheckBox + MoveScaled(33,0,25,3) + Expand = True + Text = ("Remember password") + } + } + { Panel2 Panel + MoveScaled(26,20,7,2) + Expand = True + } + { HBox1 HBox + MoveScaled(1,23,62,4) + Spacing = True + { btnAnoymous Button + MoveScaled(1,0,18,4) + AutoResize = True + Text = ("Be anonymous") + } + { Panel1 Panel + MoveScaled(22,0,6,4) + Expand = True + } + { btnOK Button + MoveScaled(29,0,16,4) + Text = ("OK") + } + { btnCancel Button + MoveScaled(46,0,16,4) + Text = ("Cancel") + Cancel = True + } + } +} diff --git a/app/src/gambas3/.src/Project/Farm/FFarmRegister.class b/app/src/gambas3/.src/Project/Farm/FFarmRegister.class new file mode 100644 index 00000000..25eb1fe4 --- /dev/null +++ b/app/src/gambas3/.src/Project/Farm/FFarmRegister.class @@ -0,0 +1,64 @@ +' Gambas class file + +Public Sub Run() As Boolean + + Return Not Me.ShowModal() + +End + +Public Sub btnCancel_Click() + + Me.Close + +End + +Public Sub btnRegister_Click() + + Dim sLogin As String + Dim sPassword As String + Dim sConfirmPassword As String + Dim sEmail As String + Dim hReq As FarmRequest + + sLogin = Trim(txtLogin.Text) + sPassword = Trim(txtPassword.Text) + + sEmail = Trim$(txtMail.Text) + If Not sEmail Or If InStr(sEmail, "@") = 0 Then + Balloon.Error(("Please enter a valid e-mail address."), txtMail) + Return + Endif + + sConfirmPassword = Trim(txtConfirmPassword.Text) + If sPassword <> sConfirmPassword Then + Balloon.Error(("Confirm password does not match."), txtConfirmPassword) + Return + Endif + + hReq = New FarmRequest(cmbFarm.Text) + hReq.RegisterUser(sLogin, sPassword, sEmail) + If Not hReq.WaitFor(("You have been successfully registered.\n\nYou will receive a confirmation e-mail soon."), ("Unable to register user.")) Then + btnCancel_Click + Endif + +End + +Private Sub InitFarms() + + cmbFarm.List = FarmRequest.GetFarms() + cmbFarm.Text = FarmIdentity.LastFarm + +End + +Public Sub Form_Open() + + InitFarms + +End + +Public Sub btnFarmConfig_Click() + + If FFarmConfig.Run() Then Return + InitFarms + +End diff --git a/app/src/gambas3/.src/Project/Farm/FFarmRegister.form b/app/src/gambas3/.src/Project/Farm/FFarmRegister.form new file mode 100644 index 00000000..cf412a44 --- /dev/null +++ b/app/src/gambas3/.src/Project/Farm/FFarmRegister.form @@ -0,0 +1,100 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,64,45) + Text = ("Register") + Resizable = False + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + { HBox1 HBox + MoveScaled(2,2,58,4) + Spacing = True + { Label5 Label + MoveScaled(0,0,25,4) + Text = ("Server") + } + { cmbFarm ComboBox + MoveScaled(33,0,19,4) + Expand = True + ReadOnly = True + } + { btnFarmConfig Button + MoveScaled(53,0,4,4) + Picture = Picture["icon:/small/options"] + } + } + { HBox2 HBox + MoveScaled(2,7,58,4) + Spacing = True + { Label1 Label + MoveScaled(0,0,25,4) + Text = ("User") + } + { txtLogin TextBox + MoveScaled(33,0,24,4) + Expand = True + } + } + { HBox3 HBox + MoveScaled(2,12,58,4) + Spacing = True + { Label2 Label + MoveScaled(0,0,25,4) + Text = ("Password") + } + { txtPassword TextBox + MoveScaled(33,0,24,4) + Expand = True + Password = True + } + } + { HBox38 HBox + MoveScaled(2,17,58,4) + Spacing = True + { Label64 Label + MoveScaled(0,0,25,4) + Text = ("Confirm password") + } + { txtConfirmPassword TextBox + MoveScaled(33,0,24,4) + Expand = True + Password = True + } + } + { HBox4 HBox + MoveScaled(2,22,58,4) + Spacing = True + { Label3 Label + MoveScaled(0,0,25,4) + Text = ("E-mail") + } + { txtMail TextBox + MoveScaled(33,0,24,4) + Expand = True + } + } + { TextLabel1 TextLabel + MoveScaled(2,27,59,11) + Font = Font["Italic"] + Expand = True + Text = ("A confirmation mail will be sent to the specified e-mail address. Click on the link included in that mail to activate your account.\n

      \nYour e-mail will not be stored on the publishing server.") + } + { HBox51 HBox + MoveScaled(2,40,58,4) + Spacing = True + { Panel3 Panel + MoveScaled(2,0,13,4) + Expand = True + } + { btnRegister Button + MoveScaled(20,0,19,4) + AutoResize = True + Text = ("Register") & "..." + } + { btnCancel Button + MoveScaled(40,0,16,4) + Text = ("Cancel") + } + } +} diff --git a/app/src/gambas3/.src/Project/Farm/FFarmRequest.class b/app/src/gambas3/.src/Project/Farm/FFarmRequest.class new file mode 100644 index 00000000..3fe4e6c1 --- /dev/null +++ b/app/src/gambas3/.src/Project/Farm/FFarmRequest.class @@ -0,0 +1,64 @@ +' Gambas class file + +Private $hRequest As HttpForm +Private $iProgress As Integer + +Public Sub Run(hRequest As HttpForm, sTitle As String, Optional iProgress As Integer) + + Dim hObs As Observer + + $hRequest = hRequest + $iProgress = iProgress + + hObs = New Observer(hRequest) As "Request" + lblRequest.Text = sTitle & "..." + Me.Title = sTitle + pgbRequest.Visible = $iProgress <> FarmRequest.PROGRESS_NONE + Me.ShowModal + $hRequest = Null + +End + +Public Sub Request_Error() + + Me.Close + +End + +Public Sub Request_Finished() + + Request_Progress + Me.Close + +End + +Public Sub Request_Cancel() + + Me.Close + +End + +Public Sub Request_Progress() + + If pgbRequest.Visible Then + If $iProgress = FarmRequest.PROGRESS_UPLOAD Then + Try pgbRequest.Value = $hRequest.Uploaded / $hRequest.TotalUploaded + Else + Try pgbRequest.Value = $hRequest.Downloaded / $hRequest.TotalDownloaded + Endif + Endif + +End + + +Public Sub btnCancel_Click() + + $hRequest.Stop + +End + +Public Sub Form_Open() + + If Not pgbRequest.Visible Then Me.H -= pgbRequest.H + +End diff --git a/app/src/gambas3/.src/Project/Farm/FFarmRequest.form b/app/src/gambas3/.src/Project/Farm/FFarmRequest.form new file mode 100644 index 00000000..afade8ed --- /dev/null +++ b/app/src/gambas3/.src/Project/Farm/FFarmRequest.form @@ -0,0 +1,32 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,63,15) + Resizable = False + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + { HBox1 HBox + MoveScaled(1,1,48,4) + Spacing = True + { lblRequest Label + MoveScaled(1,0,34,4) + Expand = True + } + { spnRequest Spinner + MoveScaled(41,0,4,4) + Visible = False + } + } + { pgbRequest ProgressBar + MoveScaled(1,6,48,3) + } + { HBox2 HBox + MoveScaled(1,10,48,4) + Invert = True + { btnCancel Button + MoveScaled(26,0,16,4) + Text = ("Cancel") + } + } +} diff --git a/app/src/gambas3/.src/Project/Farm/FPublish.class b/app/src/gambas3/.src/Project/Farm/FPublish.class new file mode 100644 index 00000000..70fe5568 --- /dev/null +++ b/app/src/gambas3/.src/Project/Farm/FPublish.class @@ -0,0 +1,355 @@ +' Gambas class file + +Private $aDep As String[] +Private $sScreenshot As String +Private $hIdentity As FarmIdentity + +Private Const SCREENSHOT_SIZE As Integer = 640 + +Public Sub Run() As Boolean + + If Project.MajorVersion = 0 And If Project.MinorVersion = 0 Then + FMain.ShowError(("You cannot publish a software whose version is \"0.0\".")) + Return + Endif + Return Not Me.ShowModal() + +End + +Private Sub FillGambasVersion() + + Dim aVersion As String[] + Dim iMajor As Integer + Dim iMajorMax As Integer + Dim iMinorMax As Integer + Dim iMinor As Integer + + aVersion = Split(System.FullVersion, ".") + + iMajorMax = CInt(aVersion[0]) + iMinorMax = CInt(aVersion[1]) + If CInt(aVersion[2]) >= 90 Then Inc iMinorMax + + iMajor = 3 + iMinor = 3 + + Do + + If iMajor > iMajorMax Or If iMinor > iMinorMax Then Break + cmbGambasVersion.Add(CStr(iMajor) & "." & CStr(iMinor)) + Inc iMinor + + Loop + +End + +Public Sub Form_Open() + + Dim aTag As String[] + Dim sTag As String + + Settings.Read(Me) + + $hIdentity = FarmIdentity.Get(Settings["/Publish/Farm"]) + $hIdentity.Init(lblIdentity) + + tagEditor.SetFarm($hIdentity.Farm) + tagEditor.SetTags(Project.PublishTags) + + $aDep = Project.PublishDependencies + + lblProject.Text = Project.Name & " " & Project.FormatVersion() + txtVendor.Text = Project.Vendor + + FillGambasVersion + cmbGambasVersion.Text = Project.PublishGambasVersion + txtURL.Text = Project.PublishWebSite + txtDesc.Text = Project.Description + + ' cmbScreenshot.Add(("None")) + ' If IsDir(Project.Dir &/ ".hidden/screenshots") Then + ' For Each sScreenshot In Dir(Project.Dir &/ ".hidden/screenshots") + ' If Right(sScreenshot) = "~" Then Continue + ' cmbScreenshot.Add(sScreenshot) + ' Next + ' Endif + ' + ' cmbScreenshot.Text = File.Name(Project.PublishScreenshot) + ' If cmbScreenshot.Index < 0 Then cmbScreenshot.Index = 0 + + If Project.HasModule("form") Or If Project.Components.Exist("gb.sdl") Then + btnCreateMenu.Value = Project.PublishCreateMenu + btnCreateMenu.Enabled = True + Else + btnCreateMenu.Value = False + btnCreateMenu.Enabled = False + Endif + + tbvDep.Columns.Count = 2 + tbvDep.Columns[0].Text = ("Software") + tbvDep.Columns[0].Expand = True + tbvDep.Columns[1].Text = ("Version") + tbvDep.Columns[1].Width = Desktop.Scale * 12 + tbvDep.Rows.Count = $aDep.Count + + aTag = Split(RTrim(File.Load("install/categories")), "\n") + For Each sTag In Split(RTrim(File.Load("tags.txt")), "\n") + If Not aTag.Exist(sTag) Then aTag.Add(sTag) + Next + aTag.Sort(gb.IgnoreCase) + lstTags.List = aTag + + +End + +Private Sub SaveProject() + + Project.Vendor = Trim(txtVendor.Text) + Project.PublishTags = tagEditor.GetTags() + Project.PublishDependencies = $aDep + Project.PublishGambasVersion = cmbGambasVersion.Text + Project.PublishWebSite = txtURL.Text + ' If cmbScreenshot.Index <= 0 Then + ' Project.PublishScreenshot = "" + ' Else + ' Project.PublishScreenshot = cmbScreenshot.Text + ' Endif + + If Project.HasModule("form") Then Project.PublishCreateMenu = btnCreateMenu.Value + Project.Description = txtDesc.Text + Project.WriteProject + +End + + +Public Sub Form_Close() + + Settings.Write(Me) + + Settings["/Publish/Farm"] = $hIdentity.Farm + + SaveProject + +End + +Public Sub wizPublish_Cancel() + + Me.Close + +End + +Public Sub lstTags_Activate() + + tagEditor.Add(lstTags.Text) + +End + +Public Sub wizPublish_Close() + + Dim hReq As FarmRequest + Dim sScreenshot As String + + SaveProject + + hReq = New FarmRequest($hIdentity.Farm) + + If radKeepScreenshot.Value Then + Else If radDeleteScreenshot.Value Then + sScreenshot = "*" + Else If imvScreenshot.Image Then + sScreenshot = $sScreenshot + Endif + + hReq.PublishSoftware(Trim(txtVendor.Text), sScreenshot, cmbGambasVersion.Text, tagEditor.GetTags(), $aDep, txtURL.Text, txtDesc.Text) + hReq.WaitFor(("The project has been successfully published."), ("Unable to publish project.")) + + Me.Close + +End + +Public Sub tbvDep_Data(Row As Integer, Column As Integer) + + Dim aDep As String[] = Split($aDep[Row], " ") + Try tbvDep.Data.Text = aDep[Column] + +End + +Public Sub btnAddDep_Click() + + tbvDep.Save + $aDep.Add("") + Inc tbvDep.Rows.Count + tbvDep.MoveTo($aDep.Max, 0) + tbvDep.Edit + +End + +Public Sub tbvDep_Insert() + + btnAddDep.Value = True + +End + +Public Sub btnRemoveDep_Click() + + If tbvDep.Row < 0 Then Return + tbvDep.Cancel + $aDep.Remove(tbvDep.Row) + 'SaveExtraDependencies + Dec tbvDep.Rows.Count + +End + +Public Sub btnUpDep_Click() + + If tbvDep.Row >= 1 Then + tbvDep.Save + Swap $aDep[tbvDep.Row], $aDep[tbvDep.Row - 1] + 'SaveExtraDependencies + tbvDep.Refresh + Dec tbvDep.Row + tbvDep.Edit + Endif + +End + +Public Sub btnDownDep_Click() + + If tbvDep.Row < $aDep.Max Then + tbvDep.Save + Swap $aDep[tbvDep.Row], $aDep[tbvDep.Row + 1] + 'SaveExtraDependencies + tbvDep.Refresh + Inc tbvDep.Row + tbvDep.Edit + Endif + +End + +Public Sub tbvDep_Save(Row As Integer, Column As Integer, Value As String) + + Dim aRow As String[] + + If Column = 0 Then + If Value And If InStr(Value, " ") Then + Balloon.Warning(("Spaces are not allowed."), tbvDep.Editor) + Stop Event + Return + Endif + Else If Column = 1 Then + If Value And If Not IsDigit(Replace(Value, ".", "")) Then + Balloon.Warning(("Incorrect version number."), tbvDep.Editor) + Stop Event + Return + Endif + Endif + + aRow = Split($aDep[Row], " ") + aRow.Resize(2) + aRow[Column] = Value + $aDep[Row] = Trim(aRow.Join(" ")) + +End + +Public Sub tbvDep_Click() + + tbvDep.Edit + +End + +Public Sub btnAddTag_Click() + + Dim I As Integer + + For I = 0 To lstTags.Count - 1 + If lstTags[I].Selected Then tagEditor.Add(lstTags[I].Text) + Next + lstTags.UnselectAll + +End + +Public Sub btnClearTags_Click() + + If Message.Delete(("Do you really want to remove all tags?"), ("Remove"), ("Cancel")) <> 1 Then Return + tagEditor.Clear + +End + +Public Sub btnSortTags_Click() + + tagEditor.Sort + +End + +Public Sub txtVendor_KeyPress() + + Project.OnVendorKeyPress() + +End + +Public Sub radScreenshot_Click() + + imvScreenshot.Visible = radPasteScreenshot.Value Or radLoadScreenshot.Value + txtScreenshot.Enabled = radLoadScreenshot.Value + + If radLoadScreenshot.Value Then + If Not txtScreenshot.Text Then txtScreenshot_Click + Endif + + SetScreenshot + +End + +Private Sub SetScreenshot() + + Dim hImage As Image + + If radLoadScreenshot.Value Then + Try hImage = Image.Load(Dialog.Path) + Else If radPasteScreenshot.Value Then + Try hImage = Clipboard.Paste() + Endif + + If hImage Then + If hImage.Width > SCREENSHOT_SIZE Then hImage = hImage.Stretch(SCREENSHOT_SIZE, -1) + If hImage.Height > SCREENSHOT_SIZE Then hImage = hImage.Stretch(-1, SCREENSHOT_SIZE) + + If Not $sScreenshot Then $sScreenshot = File.SetExt(Temp$(), "jpg") + hImage.Save($sScreenshot, 75) + Endif + + imvScreenshot.Image = hImage + imvScreenshot.ZoomFit + +End + +Public Sub txtScreenshot_Click() + + Dialog.Title = ("Select a screenshot file") + Dialog.Filter = ["*.png;*.jpg;*.jpeg", ("Screenshot files")] + If Dialog.OpenFile() Then Return + txtScreenshot.Text = Dialog.Path + SetScreenshot + +End + +Public Sub wizPublish_Arrange() + + imvScreenshot.ZoomFit + +End + +Public Sub btnRegister_Click() + + FFarmRegister.Run + +End + +Public Sub btnLogin_Click() + + If FFarmLogin.Run($hIdentity.Farm) Then Return + + $hIdentity = FFarmLogin.Identity + $hIdentity.Init(lblIdentity) + +End diff --git a/app/src/gambas3/.src/Project/Farm/FPublish.form b/app/src/gambas3/.src/Project/Farm/FPublish.form new file mode 100644 index 00000000..c13d373d --- /dev/null +++ b/app/src/gambas3/.src/Project/Farm/FPublish.form @@ -0,0 +1,236 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,75,63) + Text = ("Publish software") + Icon = Picture["icon:/small/internet"] + Arrangement = Arrange.Fill + Margin = True + { wizPublish Wizard + MoveScaled(1,1,72,61) + Arrangement = Arrange.Vertical + Spacing = True + Count = 5 + TextFont = Font["Bold,+3"] + ShowIndex = True + Border = False + ActionText = ("Publish") + ActionPicture = Picture["icon:/small/internet"] + Index = 0 + Text = ("Software description") + { lblProject Label + MoveScaled(1,0,18,5) + Font = Font["Bold,+2"] + Background = Color.LightBackground + Padding = 4 + AutoResize = True + } + { HBox6 HBox + MoveScaled(1,6,58,4) + Spacing = True + { Label4 Label + MoveScaled(0,0,26,4) + Text = ("Vendor name") + } + { txtVendor TextBox + MoveScaled(31,0,26,4) + Expand = True + } + } + { HBox8 HBox + MoveScaled(1,11,58,4) + Spacing = True + { Label10 Label + MoveScaled(0,0,26,4) + Text = ("Web site") + } + { txtURL TextBox + MoveScaled(31,0,26,4) + Expand = True + } + } + { HBox10 HBox + MoveScaled(1,21,58,4) + Spacing = True + { Label7 Label + MoveScaled(0,0,26,4) + Text = ("Create menu entry") + } + { btnCreateMenu SwitchButton + MoveScaled(32,0,8,4) + Animated = True + } + } + { Label2 Label + MoveScaled(1,26,21,4) + Font = Font["Bold"] + Text = ("Description") + } + { txtDesc TextArea + MoveScaled(1,30,30,19) + Expand = True + Wrap = True + } + Index = 1 + Text = ("Tags") + { tagEditor CTagEditor + MoveScaled(3,1,67,17) + Expand = True + } + { Panel3 HBox + MoveScaled(2,22,62,27) + Expand = True + Spacing = True + { lstTags ListBox + MoveScaled(0,0,34,15) + Expand = True + Mode = Select.Multiple + } + { VBox1 VBox + MoveScaled(42,1,17,25) + Spacing = True + { btnAddTag Button + MoveScaled(0,0,16,4) + Text = ("Add") + Picture = Picture["icon:/small/add"] + } + { btnSortTags Button + MoveScaled(0,5,16,4) + Text = ("Sort") + Picture = Picture["icon:/small/sort-ascent"] + } + { btnClearTags Button + MoveScaled(1,10,16,4) + Text = ("Clear") + Picture = Picture["icon:/small/trash"] + } + } + } + Index = 2 + Text = ("Screenshot") + { radKeepScreenshot RadioButton radScreenshot + Name = "radKeepScreenshot" + MoveScaled(0,0,53,3) + Text = ("Keep the screenshot stored on the server") + Value = True + } + { radDeleteScreenshot RadioButton radScreenshot + Name = "radDeleteScreenshot" + MoveScaled(0,4,54,3) + Text = ("Delete the screenshot stored on the server") + } + { radPasteScreenshot RadioButton radScreenshot + Name = "radPasteScreenshot" + MoveScaled(0,8,50,3) + Text = ("Upload a new screenshot taken from the clipboard") + } + { radLoadScreenshot RadioButton radScreenshot + Name = "radLoadScreenshot" + MoveScaled(0,12,55,3) + Text = ("Upload a new screenshot taken from the following file:") + } + { Panel1 HBox + MoveScaled(0,16,64,4) + { txtScreenshot ButtonBox + MoveScaled(15,0,48,4) + Enabled = False + Expand = True + Picture = Picture["icon:/small/image"] + ReadOnly = True + } + } + { imvScreenshot ImageView + MoveScaled(2,23,64,26) + Visible = False + Expand = True + Border = False + } + Index = 3 + Text = ("Dependencies") + { HBox7 HBox + MoveScaled(1,1,58,4) + Spacing = True + { Label8 Label + MoveScaled(0,0,30,4) + Text = ("Require Gambas version") + } + { cmbGambasVersion ComboBox + MoveScaled(31,0,11,4) + #Translate = False + ReadOnly = True + } + { Panel2 Panel + MoveScaled(44,1,11,2) + Expand = True + } + } + { HBox4 HBox + MoveScaled(1,7,69,41) + Expand = True + Spacing = True + { tbvDep TableView + MoveScaled(2,2,42,22) + Expand = True + Header = GridView.Horizontal + ScrollBar = Scroll.Vertical + } + { HBox11 VBox + MoveScaled(49,3,18,34) + Spacing = True + { btnAddDep Button + MoveScaled(0,0,18,4) + Text = Shortcut(("Add"), "A") + Picture = Picture["icon:/small/add"] + } + { btnRemoveDep Button + MoveScaled(0,5,18,4) + Text = Shortcut(("Remove"), "R") + Picture = Picture["icon:/small/delete"] + } + { btnUpDep Button + MoveScaled(0,10,18,4) + Text = Shortcut(("Up"), "U") + Picture = Picture["icon:/small/up"] + } + { btnDownDep Button + MoveScaled(0,15,18,4) + Text = Shortcut(("Down"), "D") + Picture = Picture["icon:/small/down"] + } + } + } + Index = 4 + Text = ("Publish") + { Panel5 HBox + MoveScaled(1,1,39,4) + Spacing = True + { Label1 Label + MoveScaled(1,0,11,4) + AutoResize = True + Text = ("Publish as") + } + { lblIdentity TextLabel + MoveScaled(19,0,18,4) + Expand = True + Alignment = Align.Normal + } + } + { Panel4 HBox + MoveScaled(1,6,37,4) + Spacing = True + { btnLogin Button + MoveScaled(0,0,15,4) + AutoResize = True + Text = ("Login") & "..." + Picture = Picture["icon:/small/identity"] + } + { btnRegister Button + MoveScaled(16,0,15,4) + AutoResize = True + Text = ("Register") & "..." + Picture = Picture["icon:/small/new"] + } + } + Index = 0 + } +} diff --git a/app/src/gambas3/.src/Project/Farm/FSoftwareFarm.class b/app/src/gambas3/.src/Project/Farm/FSoftwareFarm.class new file mode 100644 index 00000000..41563c71 --- /dev/null +++ b/app/src/gambas3/.src/Project/Farm/FSoftwareFarm.class @@ -0,0 +1,767 @@ +' Gambas class file + +Private $bNoRefresh As Boolean +Private $SY As Integer +Private $hSoft As CSoftware + +Private Enum WIZ_INDEX, WIZ_FARM, WIZ_SOFTWARE + +Private Enum SORT_DATE, SORT_DOWNLOAD, SORT_INSTALLED + +Private $hIdentity As FarmIdentity +Private $hTimerArrange As Timer +Private $hObs As Observer + +Public Sub Run() + + Me.ShowModal + +End + +Public Sub _new() + + dwgTitle.Background = Project.COLOR_BLUE + +End + + +Public Sub Form_Open() + + Dim aGroup As New CSoftwareGroup[] + Dim hButton As MenuButton + Dim hGroup As CSoftwareGroup + Dim sIcon As String + Dim sVendor As String + Dim hVoid As Control + + Settings.Read(Me) + Me.Center + + $hIdentity = FarmIdentity.Get(FarmIdentity.LastFarm) + ReloadFarm + + $bNoRefresh = True + 'cmbFarm.List = FarmRequest.GetFarms() + 'cmbFarm.Text = FarmIdentity.LastFarm + cmbSort.Index = 0 + $bNoRefresh = False + + aGroup.Add(CSoftwareGroup("Game", ("Games"), "game")) + aGroup.Add(CSoftwareGroup("Development", ("Development"), "development")) + aGroup.Add(CSoftwareGroup("Example", ("Examples"), "help")) + aGroup.Add(CSoftwareGroup("Education", ("Education"), "science")) + aGroup.Add(CSoftwareGroup("Graphics", ("Graphics"), "color")) + aGroup.Add(CSoftwareGroup("Audio", ("Audio"), "audio")) + aGroup.Add(CSoftwareGroup("Video", ("Video"), "video")) + aGroup.Add(CSoftwareGroup("Office", ("Office"), "office")) + aGroup.Add(CSoftwareGroup("Accessories", ("Accessories"), "tools")) + aGroup.Add(CSoftwareGroup("Internet", ("Internet"), "internet")) + aGroup.Add(CSoftwareGroup("System", ("System"), "computer")) + + aGroup.Sort + + aGroup.Add(Null) + + aGroup.Add(CSoftwareGroup("Library", ("Libraries"), "book")) + aGroup.Add(CSoftwareGroup("IDE Extension", ("Extensions"), "plugin")) + + aGroup.Add(Null) + + sVendor = Settings["/Packager/Vendor"] + If sVendor Then aGroup.Add(CSoftwareGroup(sVendor, ("My software") & "\n« " & sVendor & " »", "user")) + + If Project.Path And If Project.Vendor <> sVendor Then + sVendor = Project.Vendor + If sVendor Then aGroup.Add(CSoftwareGroup(sVendor, ("Other software from") & "\n« " & sVendor & " »", "people")) + Endif + + aGroup.Add(CSoftwareGroup("", ("All software"), "img/48/all.png")) + + For Each hGroup In aGroup + + If Not hGroup Then + hVoid = New Panel(panGroup) + hVoid.ResizeScaled(1, 1) + hVoid.Expand = True + hVoid = New Separator(panGroup) + 'hVoid.Foreground = Color.LightForeground 'Color.SetAlpha(Project.COLOR_ORANGE, 128) + hVoid.ResizeScaled(1, 3) + hVoid.Expand = True + Continue + Endif + + hButton = New MenuButton(panGroup) As "ButtonGroup" + hButton.Text = hGroup.Name + hButton.Arrow = False + hButton.Border = False + hButton.Tag = hGroup.Key + sIcon = hGroup.Icon + If InStr(sIcon, "/") = 0 Then sIcon = "icon:/48" &/ sIcon + hButton.Picture = Picture[sIcon] + hButton.ResizeScaled(36, 10) + hButton.Mouse = Mouse.Pointing + + Next + +End + +Public Sub Form_KeyPress() + + If Key.Code = Key.Esc Then Me.Close + +End + + +' Public Sub SoftwareSeparator_Draw() +' +' Paint.Brush = Paint.LinearGradient(0, 0, 0, Paint.H, [Color.Merge(Color.TextBackground, Color.TextForeground, 0.1), Color.Transparent], [0, 1]) +' Paint.Rectangle(0, 0, Paint.W, Paint.H) +' Paint.Fill +' +' End + +Public Sub ButtonGroup_Click() + + wizFarm.MoveNext + tagFarm.Clear + If Last.Tag Then tagFarm.Add(Last.Tag) + Reload + +End + + +' Public Sub Form_Arrange() +' +' dwgBackground.Move(svwFarm.X, svwFarm.Y, svwFarm.W, svwFarm.H) +' dwgBackground.Lower +' +' End +' +' Public Sub dwgBackground_Draw() +' +' Paint.DrawImage($hLogo, 16, 16, 256, 256) +' Paint.Font.Size = 40 +' Paint.Font.Bold = True +' Paint.Background = Color.Gray +' Paint.DrawTextShadow("Gambas\nSoftware\nFarm", 292, 16, Me.W, 256, Align.Left) +' Paint.Text("Gambas\nSoftware\nFarm", 292, 16, Me.W, 256, Align.Left) +' Paint.Fill +' +' End + +Public Sub cmbSort_Click() + + Reload + +End + +' Public Sub cmbFarm_Click() +' +' tagFarm.SetFarm(cmbFarm.Text) +' ReloadFarm +' +' End + +Public Sub Reload() + + Dim hReq As FarmRequest + + If wizFarm.Index <> WIZ_FARM Then Return + If $bNoRefresh Then Return + + timLoad.Stop + + $SY = svwFarm.ScrollY + + FarmRequestManager.Clear + svwFarm.Children.Clear + + hReq = New FarmRequest($hIdentity.Farm) As "Request" + hReq.SearchSoftware(["date", "download", "date"][cmbSort.Index], "", txtFilter.Text, tagFarm.GetTags()) + spnFarm.Show + +End + +Private Sub ShowMessage(sText As String, Optional bError As Boolean) + + Dim hLabel As Label + + hLabel = New Label(svwFarm) + hLabel.Text = sText + + If bError Then + Project.SetEditorFont(hLabel) + Else + hLabel.Font.Italic = True + hLabel.Font.Grade = 2 + Endif + + hLabel.Foreground = Color.LightForeground + hLabel.Padding = Desktop.Scale + hLabel.AutoResize = True + +End + + +Private Sub CheckSoftwareCount() + + If svwFarm.Children.Count Then Return + ShowMessage(("No software found.")) + +End + + +Public Sub Request_Finished() + + Dim hReq As FarmRequest = Last + Dim sId As String + Dim hSoftwareBox As SoftwareBox + Dim aId As String[] + Dim sText As String + + spnFarm.Hide + + If hReq.HasFailed() Then + If hReq.ErrorText Then + sText = hReq.ErrorText + Else + sText = ("Request cancelled.") + Endif + ShowMessage(sText, True) + Return + Endif + + aId = Split(hReq.Result["Result"]) + For Each sId In aId + + hSoftwareBox = New SoftwareBox(svwFarm, CInt(sId), hReq.Farm) As "SoftwareBox" + If cmbSort.Index = SORT_INSTALLED Then hSoftwareBox.Hide + hSoftwareBox.ResizeScaled(54, 30) + If cmbSort.Index = SORT_INSTALLED Then hSoftwareBox.Load + + Next + + CheckSoftwareCount() + + If $SY Then + Wait + svwFarm.ScrollY = $SY + Endif + +End + +Public Sub SoftwareBox_Ready() + + Dim hSoftwareBox As SoftwareBox = Last + Dim hSoft As CSoftware + + hSoft = hSoftwareBox.Software + + If cmbSort.Index = SORT_INSTALLED And If Not hSoft.IsInstalled() Then Goto DELETE + If chkShowAllVersion.Value = CheckBox.False Then + If Not hSoft.LastVersion Then + If Not hSoft.IsInstalled() Or If Comp(hSoft.Version, hSoft.GetInstallVersion(), gb.Natural) Then + Goto DELETE + Endif + Endif + Endif + hSoftwareBox.Show + Return + +DELETE: + + hSoftwareBox.Delete + +End + + +Public Sub Form_Close() + + If $hTimerArrange Then $hTimerArrange.Stop + + FarmRequestManager.Clear + FarmIdentity.LastFarm = $hIdentity.Farm + Settings.Write(Me) + +End + +Public Sub txtFilter_Click() + + txtFilter.Clear + +End + +Public Sub txtFilter_Change() + + timLoad.Stop + timLoad.Start + +End + +Public Sub timLoad_Timer() + + Reload + +End + +Public Sub tagFarm_Change() + + timLoad.Stop + timLoad.Start + +End + +Public Sub dwgTitle_Draw() + + Dim DS As Integer = Desktop.Scale + + Paint.Font.Grade = 8 + Paint.Font.Bold = True + Paint.Background = Color.Black + Paint.DrawTextShadow(("Gambas Software Farm"), DS, 0, DS * 32, Paint.H, Align.Left, 8) + Paint.Background = Color.White + Paint.DrawText(("Gambas Software Farm"), DS, 0, DS * 32, Paint.H, Align.Left) + +End + +Private Sub ReloadFarm() + + Dim hIdentity As FarmIdentity + + CSoftware.ClearCache($hIdentity.Farm) + hIdentity = FarmIdentity.Get($hIdentity.Farm) + hIdentity.Init(lblIdentity) + tagFarm.SetFarm($hIdentity.Farm) + Reload + +End + +Public Sub btnLogin_Click() + + If FFarmLogin.Run($hIdentity.Farm) Then Return + + $hIdentity = FFarmLogin.Identity + ReloadFarm + +End + +Private Sub UpdateSoftware() + + Dim sText As String + Dim sTag As String + Dim hTag As Label + + If Not $hSoft Then Return + + If $hSoft.State = CSoftware.STATE_ERROR Then Return + + With $hSoft + + 'lblName.Text = .Name & " " & .Version & " (" & .Vendor & ") " + dwgName.Tooltip = "#" & $hSoft.Id + + panURL.Visible = Not IsNull(.URL) + urlWebSite.Link = .URL + + If .YourVote < 0 Then + btnVote.Text = ("Vote") + btnVote.Enabled = False + Else + btnVote.Enabled = True + If .YourVote = 1 Then + btnVote.Text = ("Cancel my vote") + Else + btnVote.Text = ("Vote") + Endif + Endif + + If .CanUpgrade() Then + btnInstall.Text = ("Upgrade") + btnInstall.Picture = Picture["icon:/small/up"] + btnDownload.Hide + btnInstall.Show + Else If .IsReallyInstalled() Then + btnInstall.Text = ("Uninstall") + btnInstall.Picture = Picture["icon:/small/undo"] + btnDownload.Hide + btnInstall.Show + Else If Not .IsInstalled() Then + btnInstall.Text = ("Download and install") + btnInstall.Picture = Picture["icon:/small/add"] + btnDownload.Show + btnInstall.Show + Else + btnDownload.Hide + btnInstall.Hide + Endif + + btnRemove.Visible = FarmIdentity.Get($hSoft.Farm).Login = $hSoft.Owner + + sText = Trim(.Description) + + If Not sText Then + + txtDescription.Hide + + Else + + txtDescription.Text = sText + txtDescription.H = txtDescription.Font.RichTextHeight(Replace(Html(sText), "\n", "
      "), txtDescription.W) + txtDescription.Show + + Endif + + lblDesc.Visible = txtDescription.Visible + + lblUploadDate.Text = Subst(("Published &1 (on &2)"), .GetUploadAge(), Format(.UploadDate, gb.LongDate)) + 'lblUploadDate.Foreground = Color.Merge(Color.TextForeground, Color.LightForeground) + + Try picIcon.Picture = .Icon.Picture + + panTags.Children.Clear + + If .Tags Then + For Each sTag In .Tags + hTag = New Label(panTags) + hTag.Text = " " & sTag & " " + hTag.Padding = 4 + If sTag Begins "gb." Then + hTag.Background = Project.COLOR_ORANGE + Else + hTag.Background = Project.COLOR_BLUE + Endif + hTag.Foreground = Color.White + hTag.Font.Bold = True + hTag.AutoResize = True + Next + + lblTags.Visible = .Tags.Count > 0 + Endif + + imvScreenshot.Image = Null + panScreenshot.Hide + If .DownloadScreenshot() Then + UpdateScreenshot + Else + spnScreenshot.Show + spnScreenshot.Raise + Endif + + End With + + dwgName.Refresh + dwgStat.Refresh + +End + +Private Sub UpdateScreenshot() + + spnScreenshot.Hide + If $hSoft.Screenshot Then + Try imvScreenshot.Image = $hSoft.Screenshot + imvScreenshot.ZoomFit + panScreenshot.Show + Else + panScreenshot.Hide + Endif + +End + +Public Sub Software_Screenshot() + + If $hSoft <> Last Then Return + UpdateScreenshot + +End + + +Public Sub SoftwareBox_Click() + + Dim hSoft As CSoftware = Last.Software + If hSoft.State <> CSoftware.STATE_READY Then Return + + $hSoft = hSoft + wizFarm.MoveNext + +End + +Public Sub btnGoBack_Click() + + wizFarm.MovePrevious + +End + +Public Sub panTitle_Arrange() + + Dim W As Integer + + W = picIcon.Parent.H - Desktop.Scale * 2 + picIcon.Resize(W, W) + 'dwgStat.Move(dwgStat.Parent.W - dwgStat.W - Desktop.Scale, Desktop.Scale) + +End + +' Public Sub dwgScreenshot_Draw() +' +' Dim fScale, W, H As Float +' +' If $hScreenshot Then +' fScale = Max($hScreenshot.W / dwgScreenshot.W, $hScreenshot.H / dwgScreenshot.H) +' W = $hScreenshot.W / fScale +' H = $hScreenshot.H / fScale +' Paint.DrawImage($hScreenshot, (dwgScreenshot.W - W) / 2, (dwgScreenshot.H - H) / 2, W, H) +' Endif +' +' End + +Public Sub panTextDesc_Arrange() + + If txtDescription.Visible Then + If Not $hTimerArrange Then + $hTimerArrange = New Timer As "TimerArrange" + $hTimerArrange.Trigger + Endif + + Endif + +End + +Public Sub TimerArrange_Timer() + + txtDescription.H = txtDescription.Font.RichTextHeight(Replace(Html(txtDescription.Text), "\n", "
      "), txtDescription.W) + $hTimerArrange.Stop + $hTimerArrange = Null + +End + + +Public Sub panDesc_Arrange() + + spnScreenshot.Move(panDesc.ScreenX - spnScreenshot.Parent.ScreenX + panDesc.W \ 2 - spnScreenshot.W \ 2, panDesc.ScreenY - spnScreenshot.Parent.ScreenY + panDesc.H \ 2 - spnScreenshot.H \ 2) + If wizFarm.Index = WIZ_SOFTWARE Then imvScreenshot.ZoomFit + +End + + +Public Sub dwgStat_Draw() + + If Not $hSoft Then Return + Paint.Font.Grade = 2 + SoftwareBox.PaintStat($hSoft, Color.TextBackground, True) + +End + +Public Sub btnDownload_Click() + + Dim sName As String = $hSoft.GetTitle() + Dim sErr As String + + If Message.Question(Subst(("Do you really want to download &1?"), sName), ("Download"), ("Cancel")) = 1 Then + sErr = $hSoft.Install(True) + If sErr Then + If sErr <> "*" Then Message.Error(Subst(("Unable to download &1:"), sName) & "\n\n" & sErr) + Else + Message(Subst(("&1 has been successfully downloaded."), sName)) + Reload + Endif + Endif + +End + + +Public Sub btnInstall_Click() + + Dim sName As String = $hSoft.GetTitle() + Dim sErr As String + + If $hSoft.IsInstalled() Then + If $hSoft.CanUpgrade() Then + If Message.Question(Subst(("Do you really want to upgrade to &1?"), sName), ("Upgrade"), ("Cancel")) = 1 Then + sErr = $hSoft.Install() + If sErr Then + If sErr <> "*" Then Message.Error(Subst(("Unable to upgrade to &1:"), sName) & "\n\n" & sErr) + Else + Message(Subst("&1 has been successfully upgraded.", sName)) + Goto REFRESH + Endif + Endif + Else + If Message.Question(Subst(("Do you really want to uninstall &1?"), sName), ("Uninstall"), ("Cancel")) = 1 Then + sErr = $hSoft.Uninstall() + If sErr Then + Message.Error(Subst(("Unable to uninstall &1:"), sName) & "\n\n" & sErr) + Else + Message(Subst(("&1 has been successfully uninstalled."), sName)) + Goto REFRESH + Endif + Endif + Endif + Else + If Message.Question(Subst(("Do you really want to install &1?"), sName), ("Install"), ("Cancel")) = 1 Then + sErr = $hSoft.Install() + If sErr Then + If sErr <> "*" Then Message.Error(Subst(("Unable to install &1:"), sName) & "\n\n" & sErr) + Else + Message(Subst(("&1 has been successfully installed."), sName)) + Goto REFRESH + Endif + Endif + Endif + + Return + +REFRESH: + + Reload + +End + +Public Sub btnVote_Click() + + Dim sErr As String + + sErr = $hSoft.ToggleVote() + If sErr Then + Message.Error(("Unable to modify your vote.") & "\n\n" & sErr) + Else + Reload + Endif + +End + +Public Sub Software_Change() + + If $hSoft <> Last Then Return + UpdateSoftware + +End + +Public Sub svwFarm_Arrange() + + spnFarm.Move(svwFarm.W \ 2 - 32, svwFarm.H \ 2 - 32, 64, 64) + +End + +Public Sub urlWebSite_Click() + + Dim sLink As String + + sLink = urlWebSite.Link + If sLink Not Like "http*://*" Then sLink = "http://" &/ sLink + Project.OpenWebPage(sLink) + Stop Event + +End + +Public Sub btnRemove_Click() + + Dim sName As String = $hSoft.Name + Dim sErr As String + + If Message.Warning(Subst(("Do you really want to delete &1 from the farm server?"), sName), ("Delete"), ("Cancel")) <> 1 Then Return + + sErr = $hSoft.Delete() + If sErr Then + Message.Error(Subst(("Unable to remove &1:"), sName) & "\n\n" & sErr) + Else + Message(Subst("&1 has been successfully removed.", sName)) + Endif + + wizFarm.MovePrevious + ReloadFarm + +End + +' Public Sub txtVendor_Click() +' +' txtVendor.Clear +' +' End +' +' Public Sub txtVendor_Change() +' +' timLoad.Stop +' timLoad.Start +' +' End +' +' Public Sub txtVendor_KeyPress() +' +' Project.OnVendorKeyPress() +' +' End + +Public Sub wizFarm_Change() + + btnGoBack.Enabled = wizFarm.Index > 0 + + Select Case wizFarm.Index + + Case WIZ_INDEX + + FarmRequestManager.Clear + + Case WIZ_FARM + + If $hSoft Then + $hSoft.Abort + $hSoft = Null + Endif + + imvScreenshot.Image = Null + + chkShowFilter_Click + + Case WIZ_SOFTWARE + + If Not $hSoft.Observed Then + $hObs = New Observer($hSoft) As "Software" + $hSoft.Observed = True + Endif + + UpdateSoftware + + End Select + +End + +Public Sub chkShowFilter_Click() + + panFilter.Visible = chkShowFilter.Value + + tagFarm_Arrange + +End + +Public Sub btnRegister_Click() + + FFarmRegister.Run + +End + +Public Sub dwgName_Draw() + + If Not $hSoft Then Return + + Paint.Font.Grade = 4 + $hSoft.PaintName(0, 0) + +End + +Public Sub tagFarm_Arrange() + + tagFarm.Parent.H = tagFarm.H + + panFilter.AutoResize = True + panFilter.AutoResize = False + + panFilterFrame.AutoResize = True + panFilterFrame.AutoResize = False + +End + +Public Sub chkShowAllVersion_Click() + + Reload + +End diff --git a/app/src/gambas3/.src/Project/Farm/FSoftwareFarm.form b/app/src/gambas3/.src/Project/Farm/FSoftwareFarm.form new file mode 100644 index 00000000..b0495b65 --- /dev/null +++ b/app/src/gambas3/.src/Project/Farm/FSoftwareFarm.form @@ -0,0 +1,319 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,115,83) + Background = Color.TextBackground + Text = ("Gambas Software Farm") + Arrangement = Arrange.Vertical + { dwgTitle DrawingArea + MoveScaled(1,1,66,8) + Background = &H3398C3& + } + { VBox1 HBox + MoveScaled(0,10,98,6) + Background = Color.ButtonBackground + Spacing = True + { btnGoBack ToolButton + MoveScaled(0,0,6,6) + Enabled = False + Mouse = Mouse.Pointing + Picture = Picture["icon:/medium/left"] + } + { Panel12 Panel + MoveScaled(6,0,89,6) + Expand = True + Arrangement = Arrange.Horizontal + Spacing = True + Margin = True + { lblIdentity TextLabel + MoveScaled(30,1,16,4) + Font = Font["Bold"] + Expand = True + AutoResize = True + Alignment = Align.Right + } + { Panel14 Panel + MoveScaled(49,1,1,4) + } + { btnLogin Button + MoveScaled(56,1,15,4) + AutoResize = True + Text = ("Login") & "..." + Picture = Picture["icon:/small/identity"] + } + { btnRegister Button + MoveScaled(72,1,15,4) + AutoResize = True + Text = ("Register") & "..." + Picture = Picture["icon:/small/new"] + } + } + } + { Separator2 Separator + MoveScaled(44,18,14,0) + } + { wizFarm Wizard + MoveScaled(1,21,97,60) + Expand = True + Arrangement = Arrange.Vertical + Count = 3 + ShowTitle = False + ShowButton = False + Border = False + Index = 0 + Text = ("") + { panGroup ScrollView + MoveScaled(4,17,85,36) + Expand = True + Arrangement = Arrange.Row + Margin = True + Border = False + ScrollBar = Scroll.Vertical + } + Index = 1 + Text = ("") + { panFilterFrame VBox + MoveScaled(0,1,92,19) + Spacing = True + Margin = True + { HBox1 HBox + MoveScaled(1,2,86,4) + Spacing = True + { Label1 Label + MoveScaled(0,0,11,4) + AutoResize = True + Text = ("Show") + } + { cmbSort ComboBox + MoveScaled(15,0,29,4) + ReadOnly = True + List = [("Most recent"), ("Most downloaded"), ("Installed")] + } + { chkShowFilter CheckBox + MoveScaled(48,0,17,4) + AutoResize = True + Text = ("Show filters") + } + { chkShowAllVersion CheckBox + MoveScaled(64,0,20,4) + AutoResize = True + Text = ("Show old versions") + } + } + { panFilter VBox + MoveScaled(1,7,89,10) + Visible = False + Spacing = True + { panFilterTags HBox + MoveScaled(0,0,88,5) + Spacing = True + { Label3 Label + MoveScaled(0,0,11,4) + Text = ("Tags") + } + { tagFarm CTagEditor + MoveScaled(15,0,69,5) + Expand = True + } + } + { Panel5 HPanel + MoveScaled(0,6,89,4) + Spacing = True + { Label4 Label + MoveScaled(0,0,11,4) + Text = ("Filter") + } + { Panel2 Panel + MoveScaled(28,0,34,4) + Expand = True + Arrangement = Arrange.Fill + Border = Border.Plain + { txtFilter ButtonBox + MoveScaled(1,0,31,4) + Expand = True + Picture = Picture["icon:/small/clear"] + Border = False + } + } + } + } + } + { Separator3 Separator + MoveScaled(20,22,21,0) + Visible = False + } + { Panel7 Panel + MoveScaled(1,24,91,38) + Background = Color.TextBackground + Foreground = Color.TextForeground + Expand = True + Arrangement = Arrange.Fill + { svwFarm ScrollView + MoveScaled(3,7,69,23) + Background = Color.TextBackground + Foreground = Color.TextForeground + Expand = True + Arrangement = Arrange.Row + Spacing = True + Margin = True + Border = False + ScrollBar = Scroll.Vertical + } + { spnFarm Spinner + MoveScaled(77,27,10,9) + Visible = False + Ignore = True + } + } + Index = 2 + Text = ("") + { Panel9 Panel + MoveScaled(6,0,77,55) + Foreground = Color.TextForeground + Expand = True + Arrangement = Arrange.Vertical + { panTitle HBox + MoveScaled(2,1,71,10) + Spacing = True + Margin = True + { picIcon PictureBox + MoveScaled(1,1,8,8) + Stretch = True + Alignment = Align.Center + } + { Panel8 Panel + MoveScaled(11,1,1,7) + Visible = False + } + { dwgName DrawingArea + MoveScaled(15,1,28,5) + Expand = True + } + { dwgStat DrawingArea + MoveScaled(45,1,17,4) + } + { Panel13 Panel + MoveScaled(69,1,1,7) + Visible = False + } + } + { Separator1 Separator + MoveScaled(28,17,16,0) + Visible = False + } + { panDesc HSplit + MoveScaled(2,18,73,36) + Expand = True + Border = False + { Panel6 HBox + MoveScaled(1,1,52,34) + Margin = True + { panTextDesc ScrollView + MoveScaled(1,1,48,32) + Expand = True + Arrangement = Arrange.Vertical + Spacing = True + Border = False + ScrollBar = Scroll.Vertical + { lblUploadDate TextLabel + MoveScaled(2,3,21,3) + Font = Font["Italic"] + } + { lblDesc Label + MoveScaled(2,6,14,3) + Font = Font["Bold"] + Text = ("Description") + } + { txtDescription TextArea + MoveScaled(2,10,29,4) + ReadOnly = True + Wrap = True + Border = False + ScrollBar = Scroll.None + } + { panURL VBox + MoveScaled(2,14,29,7) + Spacing = True + { lblDesc2 Label + MoveScaled(0,0,14,3) + Font = Font["Bold"] + Text = ("Web site") + } + { urlWebSite URLLabel + MoveScaled(0,4,18,3) + AutoResize = True + } + } + { lblTags Label + MoveScaled(2,21,14,3) + Font = Font["Bold"] + Text = ("Tags") + } + { panTags HPanel + MoveScaled(2,24,26,8) + AutoResize = True + Spacing = True + } + } + } + { panScreenshot Panel + MoveScaled(55,8,15,19) + Visible = False + Arrangement = Arrange.Fill + Margin = True + { imvScreenshot ImageView + MoveScaled(1,1,13,15) + Border = False + Alignment = Align.TopLeft + } + } + } + { spnScreenshot Spinner + MoveScaled(64,10,10,10) + Ignore = True + } + } + { HBox2 HBox + MoveScaled(2,58,86,6) + Spacing = True + Margin = True + { btnDownload Button + MoveScaled(2,0,15,4) + Mouse = Mouse.Pointing + AutoResize = True + Text = ("Download") + Picture = Picture["icon:/small/download"] + } + { btnInstall Button + MoveScaled(19,0,15,4) + Mouse = Mouse.Pointing + AutoResize = True + Text = ("Download and install") + } + { btnVote Button + MoveScaled(38,0,15,4) + Visible = False + Mouse = Mouse.Pointing + AutoResize = True + Text = ("Vote") + Picture = Picture["icon:/small/bookmark"] + } + { Panel10 Panel + MoveScaled(53,0,2,4) + Expand = True + } + { btnRemove Button + MoveScaled(57,0,15,4) + Mouse = Mouse.Pointing + AutoResize = True + Text = ("Remove") + Picture = Picture["icon:/small/remove"] + } + } + Index = 0 + } + { timLoad #Timer + #MoveScaled(117,2) + Delay = 500 + } +} diff --git a/app/src/gambas3/.src/Project/Farm/FarmIdentity.class b/app/src/gambas3/.src/Project/Farm/FarmIdentity.class new file mode 100644 index 00000000..1a08d52a --- /dev/null +++ b/app/src/gambas3/.src/Project/Farm/FarmIdentity.class @@ -0,0 +1,144 @@ +' Gambas class file + +Public Const DEFAULT_FARM As String = "gambasfarm.org" + +Static Property FarmList As String[] +Static Property RememberPassword As Boolean +Static Property LastFarm As String + +Property Login As String +Property Password As String +Property Read Farm As String + +Static Private $hSettings As Settings +Static Private $cPassword As New Collection +Static Private $cCache As New Collection + +Private $sFarm As String + +Static Public Sub _init() + + $hSettings = New Settings("gambas3-farm") + +End + +Static Public Sub Get(sFarm As String) As FarmIdentity + + Dim hIdentity As FarmIdentity + + If Not sFarm Then sFarm = DEFAULT_FARM + + hIdentity = $cCache[sFarm] + If Not hIdentity Then + hIdentity = New FarmIdentity(sFarm) + $cCache[sFarm] = hIdentity + Endif + + Return hIdentity + +End + +Static Public Sub Exit() + + $cCache = Null + +End + + +Public Sub _new(sFarm As String) + + $sFarm = sFarm + +End + +Private Function Login_Read() As String + + Return $hSettings[$sFarm &/ "Login"] + +End + +Private Sub Login_Write(Value As String) + + $hSettings[$sFarm &/ "Login"] = Value + $hSettings.Save + +End + +Static Private Function RememberPassword_Read() As Boolean + + Return $hSettings["/RememberPassword", False] + +End + +Static Private Sub RememberPassword_Write(Value As Boolean) + + $hSettings["/RememberPassword"] = Value + $hSettings.Save + +End + +Private Function Password_Read() As String + + If Not $cPassword[$sFarm] Then + If $hSettings["/RememberPassword", False] Then Try $cPassword[$sFarm] = Desktop.Passwords["/Farm" &/ $sFarm] + Endif + Return $cPassword[$sFarm] + +End + +Private Sub Password_Write(Value As String) + + $cPassword[$sFarm] = Value + If $hSettings["/RememberPassword", False] Then Try Desktop.Passwords["/Farm" &/ $sFarm] = Value + +End + +Static Private Function FarmList_Read() As String[] + + Dim aDefault As New String[] + + Return $hSettings["/FarmList", aDefault] + +End + +Static Private Sub FarmList_Write(Value As String[]) + + $hSettings["/FarmList"] = Value + $hSettings.Save + +End + +Static Public Sub SaveSettings() + + $hSettings.Save + +End + +Static Private Function LastFarm_Read() As String + + Return $hSettings["/LastFarm", DEFAULT_FARM] + +End + +Static Private Sub LastFarm_Write(Value As String) + + $hSettings["/LastFarm"] = Value + $hSettings.Save + +End + +Public Sub Init(hLabel As TextLabel) + + If Me.Login And If Me.Password Then + hLabel.Text = "" & Me.Login & "@" & Me.Farm & "" + Else + hLabel.Text = "" & ("Anonymous") & "@" & Me.Farm & "" + Endif + +End + +Private Function Farm_Read() As String + + Return $sFarm + +End diff --git a/app/src/gambas3/.src/Project/Farm/FarmRequest.class b/app/src/gambas3/.src/Project/Farm/FarmRequest.class new file mode 100644 index 00000000..dbe38d52 --- /dev/null +++ b/app/src/gambas3/.src/Project/Farm/FarmRequest.class @@ -0,0 +1,396 @@ +' Gambas class file + +Event Finished + +Public Enum PROGRESS_NONE, PROGRESS_UPLOAD, PROGRESS_DOWNLOAD + +Public Farm As String +Public ErrorText As String +Public Result As Collection +Public ResultFile As String + +Private $sTitle As String +Private $hForm As HttpForm +Private $iProgress As Integer +Private $bFile As Boolean +Private $bFinished As Boolean + +Static Public Sub GetFarms() As String[] + + Dim aFarm As String[] + + aFarm = FarmIdentity.FarmList + If Not aFarm Then aFarm = New String[] + If Not aFarm.Exist(FarmIdentity.DEFAULT_FARM) Then + aFarm.Add(FarmIdentity.DEFAULT_FARM, 0) + Endif + Return aFarm + +End + + +Static Public Sub GetDate(sDate As String) As Date + + Dim dDate As Date + + If Len(sDate) = 14 Then + Try dDate = Date(CInt(Mid(sDate, 1, 4)), CInt(Mid(sDate, 5, 2)), CInt(Mid(sDate, 7, 2)), CInt(Mid$(sDate, 9, 2)), CInt(Mid$(sDate, 11, 2)), CInt(Mid$(sDate, 13, 2))) + Else If Len(sDate) = 8 Then + Try dDate = Date(CInt(Mid(sDate, 1, 4)), CInt(Mid(sDate, 5, 2)), CInt(Mid(sDate, 7, 2))) + Endif + + Return dDate + +End + + +Public Sub _new(sFarm As String) + + Dim hIdentity As FarmIdentity + + Farm = sFarm + + hIdentity = FarmIdentity.Get(sFarm) + $hForm = New HttpForm As "Request" + $hForm["login"] = hIdentity.Login + $hForm["password"] = hIdentity.Password + +End + +Public Sub _free() + + If ResultFile Then Try Kill ResultFile + +End + + +Public Sub Request_Error() + + ErrorText = $hForm.ErrorText + Result = Null + ResultFile = "" + $bFinished = True + Raise Finished + +End + +Public Sub Request_Cancel() + + ErrorText = "" + Result = Null + ResultFile = "" + $bFinished = True + Raise Finished + +End + +Public Sub Request_Finished() + + Dim aResult As String[] + Dim sLine As String + Dim iPos As Integer + Dim sResult As String + Dim sHeader As String + Dim sName As String + + $bFinished = True + + If $bFile Then + ResultFile = $hForm.TargetFile + If $hForm.Headers Then + For Each sHeader In $hForm.Headers + If sHeader Begins "Content-Disposition:" Then + iPos = InStr(sHeader, "filename=") + If iPos Then + sName = File.SetName(ResultFile, UnQuote(Mid$(sHeader, iPos + 9))) + Try Kill sName + Move ResultFile To sName + ResultFile = sName + Break + Endif + Endif + Next + Endif + Raise Finished + Return + Endif + + sResult = $hForm.Peek() + aResult = Split(Replace(sResult, "\r", ""), "\n") + If aResult.Count = 0 Or If aResult[0] <> "10 OK" Then + If aResult.Count Then + iPos = InStr(aResult[0], " ") + ErrorText = Replace(Mid$(sResult, iPos + 1), "\r", "") + Else + ErrorText = ("No answer.") + Endif + Result = Null + Raise Finished + Return + Endif + + ErrorText = "" + Result = New Collection + aResult.Remove(0) + For Each sLine In aResult + iPos = InStr(sLine, "=") + If iPos = 0 Then Continue + Result[Trim(Left(sLine, iPos - 1))] = Trim(Mid$(sLine, iPos + 1)) + Next + + Raise Finished + +End + + + +Static Public Sub GetCheckSum(sPath As String) As String + + Dim sChecksum As String + Dim iPos As Integer + + If Not System.Exist("sha256sum") Then Error.Raise("Cannot find 'sha256sum' program") + + Exec ["sha256sum", sPath] To sChecksum + iPos = InStr(sChecksum, " ") + sChecksum = Left(sChecksum, iPos - 1) + Return sChecksum + +Catch + + Error.Raise("Unable to compute checksum: " & Error.Text) + +End + +Public Sub RegisterUser(sLogin As String, sPassword As String, sEmail As String) + + $sTitle = ("Register user") + $iProgress = PROGRESS_NONE + + $hForm.URL = "http://" & Farm &/ "farm/register" + $hForm.Add("login", sLogin) + $hForm.Add("password", sPassword) + $hForm.Add("email", sEmail) + + FarmRequestManager.Add($hForm) + + '$sGoodMsg = ("You have been successfully registered.\n\nYou will receive a confirmation e-mail soon.") + '$sBadMsg = ("Unable to register user.") + +End + +Public Sub HasFailed() As Boolean + + Return If($bFile, IsNull(ResultFile), IsNull(Result)) + +End + + +Public Sub WaitFor(Optional sGood As String, sBad As String, Optional bNoWindow As Boolean) As Boolean + + Dim bFail As Boolean + + If bNoWindow Then + Inc Application.Busy + Do + Sleep 0.05 + If $bFinished Then Break + Wait + Loop + Dec Application.Busy + Else + FFarmRequest.Run($hForm, $sTitle, $iProgress) + $iProgress = PROGRESS_NONE + Endif + + bFail = HasFailed() + + If bFail Then + If sBad And If ErrorText Then Message.Error(sBad & "\n\n" & ErrorText) + Else + If sGood Then Message(sGood) + Endif + Return bFail + +End + +Private Sub AddLanguageTag(aTag As String[], sLang As String) + + sLang = Language.ToEnglishName(sLang) + If Not sLang Then Return + If Not aTag.Exist(sLang) Then aTag.Add(sLang) + +End + +Private Sub AddTag(aTag As String[], sTag As String) + + If Not aTag.Exist(sTag) Then aTag.Add(sTag) + +End + +Public Sub PublishSoftware(sVendor As String, sScreenshot As String, sGambasVersion As String, aTag As String[], aRequire As String[], sURL As String, sDesc As String) + + Dim sSource As String + Dim sIcon As String + Dim sChecksum As String + Dim sComp As String + Dim sLang As String + Dim sSave As String + + If Project.Compile(True) Then Return + + $sTitle = ("Publish project") + $iProgress = PROGRESS_UPLOAD + + sSource = Temp$() + sSource = File.Dir(sSource) &/ File.BaseName(sSource) & ".tar.bz2" 'Project.GetDefaultArchiveBaseName() & ".tar.bz2" + Project.MakeSourcePackageTo(sSource) + + sChecksum = GetCheckSum(sSource) + + If Project.Icon Then sIcon = Project.Dir &/ Project.Icon + If Not sIcon Or If Not Exist(sIcon) Then + sIcon = "img/logo/project.png" + Endif + + If Not Exist(sIcon) Then sIcon = "" + + '$sGoodMsg = ("The project has been successfully published.") + '$sBadMsg = ("Unable to publish project.") + + For Each sComp In Project.Components + AddTag(aTag, sComp) + Next + + sSave = System.Language + System.Language = "C" + + If Project.Localize Then + For Each sLang In Language.GetAll() + If Project.HasTranslation(sLang) Then AddLanguageTag(aTag, sLang) + Next + Endif + + If Project.DefaultLanguage Then AddLanguageTag(aTag, Project.DefaultLanguage) + + If Project.Type = Project.TYPE_LIBRARY Then AddTag(aTag, "library") + + System.Language = sSave + + $hForm.URL = "http://" & Farm &/ "/farm/publish" + '$hForm.Add("login", Login) + '$hForm.Add("password", Password) + $hForm.Add("name", Project.Name) + $hForm.Add("vendor", sVendor) + $hForm.Add("version", CStr(Project.MajorVersion) & "." & CStr(Project.MinorVersion)) + $hForm.Add("release", Project.ReleaseVersion) + $hForm.Add("desc", sDesc) + $hForm.Add("gambas", sGambasVersion) + $hForm.Add("checksum", sChecksum) + $hForm.AddFile("icon", sIcon, "icon.png") + $hForm.AddFile("source", sSource, Project.GetDefaultArchiveBaseName() & ".tar.bz2") + $hForm.Add("tags", aTag.Join(",")) + $hForm.Add("dependencies", aRequire.Join(",")) + $hForm.Add("url", sURL) + + If sScreenshot Then + If sScreenshot = "*" Then + $hForm.Add("screenshot", sScreenshot) + Else + $hForm.AddFile("screenshot", sScreenshot, "screenshot." & File.Ext(sScreenshot)) + Endif + Endif + + FarmRequestManager.Add($hForm) + +End + +Public Sub GetSoftware(iId As Integer) + + $hForm.URL = "http://" & Farm &/ "farm/get" + $hForm.Add("id", CStr(iId)) + FarmRequestManager.Add($hForm) + +End + +Public Sub GetSoftwareIcon(iId As Integer) + + $hForm.URL = "http://" & Farm &/ "farm/get?icon" + $hForm.Add("id", CStr(iId)) + $hForm.TargetFile = Temp$() + $bFile = True + FarmRequestManager.Add($hForm) + +End + +Public Sub SearchSoftware(sSort As String, sVendor As String, sFilter As String, aTag As String[]) + + $hForm.URL = "http://" & Farm &/ "farm/search" + $hForm["sort"] = sSort + $hForm["vendor"] = sVendor + $hForm["filter"] = sFilter + $hForm["tags"] = aTag.Join() + FarmRequestManager.Add($hForm) + +End + +Public Sub CheckAuth(sLogin As String, sPassword As String) + + $hForm.URL = "http://" & Farm &/ "farm/ident" + $hForm["login"] = sLogin + $hForm["password"] = sPassword + FarmRequestManager.Add($hForm) + +End + +Public Sub VoteForSoftware(iId As Integer, iVote As Integer) + + $hForm.URL = "http://" & Farm &/ "farm/vote" + $hForm["id"] = CStr(iId) + $hForm["vote"] = CStr(iVote) + FarmRequestManager.Add($hForm) + +End + +Public Sub Abort() + + FarmRequestManager.Remove($hForm) + +End + +Public Sub DownloadSoftware(iId As Integer) + + $sTitle = ("Download software") + $iProgress = PROGRESS_DOWNLOAD + + $hForm.URL = "http://" & Farm &/ "farm/download" + $hForm.Add("id", CStr(iId)) + $hForm.TargetFile = Temp$() + $bFile = True + FarmRequestManager.Add($hForm) + +End + +Public Sub DownloadScreenshot(iId As Integer) + + '$sTitle = ("Download screenshot") + '$iProgress = PROGRESS_DOWNLOAD + + $hForm.URL = "http://" & Farm &/ "farm/get?screenshot" + $hForm.Add("id", CStr(iId)) + $hForm.TargetFile = Temp$() + $bFile = True + FarmRequestManager.Add($hForm) + +End + +Public Sub DeleteSoftware(iId As Integer) + + $sTitle = ("Delete software") + + $hForm.URL = "http://" & Farm &/ "farm/remove" + $hForm.Add("id", CStr(iId)) + FarmRequestManager.Add($hForm) + +End + diff --git a/app/src/gambas3/.src/Project/Farm/FarmRequestManager.module b/app/src/gambas3/.src/Project/Farm/FarmRequestManager.module new file mode 100644 index 00000000..7aae965f --- /dev/null +++ b/app/src/gambas3/.src/Project/Farm/FarmRequestManager.module @@ -0,0 +1,97 @@ +' Gambas module file + +Property Read Count As Integer + +Private $aRequest As New HttpForm[] +Private Const MAX_REQUEST As Integer = 3 + +Public Sub Add(hRequest As HttpForm) + + Dim hObs As Observer + + 'hRequest.Debug = True + hObs = New Observer(hRequest) As "Request" + $aRequest.Add(hRequest) + 'Debug "Add "; hRequest + If $aRequest.Count <= MAX_REQUEST Then + 'Debug "Submit "; hRequest + hRequest.Submit + Endif + +End + +Public Sub Remove(hRequest As HttpForm) + + Dim iPos As Integer + + 'Debug "Remove "; hRequest + iPos = $aRequest.FindByRef(hRequest) + If iPos >= 0 Then + If iPos = 0 Then + 'Debug "Stop "; hRequest + hRequest.Stop + Else + $aRequest.Remove(iPos) + Endif + Endif + +End + + +Public Sub Request_Finished() + + Dim iPos As Integer + + 'Debug "Finished "; Last + + If $aRequest.Count = 0 Then Return + + 'Debug "Remove "; Last + iPos = $aRequest.FindByRef(Last) + If iPos >= 0 Then + $aRequest.Remove(iPos) + If $aRequest.Count >= MAX_REQUEST Then + 'Debug "Submit "; $aRequest[MAX_REQUEST - 1] + $aRequest[MAX_REQUEST - 1].Submit + Endif + Endif + +End + +Public Sub Request_Error() + + Request_Finished + +End + +Public Sub Request_Cancel() + + Request_Finished + +End + +Public Sub Clear() + + Dim aClear As HttpForm[] + Dim I As Integer + + If $aRequest.Count = 0 Then Return + + aClear = $aRequest.Copy() + $aRequest.Clear + 'Debug "Clear" + + For I = 0 To Min(aClear.Max, MAX_REQUEST) + 'Debug "Stop "; aClear[I] + aClear[I].Stop + Next + +End + + + +Private Function Count_Read() As Integer + + Return $aRequest.Count + +End diff --git a/app/src/gambas3/.src/Project/Farm/Publish/CTag.class b/app/src/gambas3/.src/Project/Farm/Publish/CTag.class new file mode 100644 index 00000000..8bd9fab1 --- /dev/null +++ b/app/src/gambas3/.src/Project/Farm/Publish/CTag.class @@ -0,0 +1,78 @@ +' Gambas class file + +Inherits UserControl + +Property Text As String + +Private $hButton As ToolButton +Private $hDraw As DrawingArea +Private $sText As String + +Public Sub _new() + + $hDraw = New DrawingArea(Me) As "DrawingArea" + $hDraw.Arrangement = Arrange.Horizontal + $hDraw.Mouse = Mouse.Pointing + + $hButton = New ToolButton($hDraw) As "Button" + $hButton.Picture = Picture["img/16/white-close.png"] + $hButton.Resize(Desktop.Scale * 3, Desktop.Scale * 3) + $hButton.Border = False + $hButton.Show + + Me.Font.Bold = True + +End + +Private Sub UpdateSize() + + Me.Resize(Desktop.Scale * 4 + Me.Font.TextWidth($sText), Me.Font.Height + Desktop.Scale \ 2) + +End + +Public Sub DrawingArea_Draw() + + Dim X As Integer + + 'Paint.Rectangle(0.5, 0.5, Paint.W - 1, Paint.H - 1, 3) + 'Paint.Background = Color.LightForeground + 'Paint.Stroke + + Paint.FillRect(0, 0, Paint.W, Paint.H, If($sText Begins "gb.", Project.COLOR_ORANGE, Project.COLOR_BLUE)) + + Paint.Background = Color.White + X = Desktop.Scale * 3 + Paint.DrawText($sText, X, 0, Paint.W - X, Paint.H, Align.Left) + +End + +Public Sub DrawingArea_Font() + + UpdateSize + +End + +Private Function Text_Read() As String + + Return $sText + +End + +Private Sub Text_Write(Value As String) + + If InStr(Value, ".") = 0 Then Value = UCase(Left(Value)) & Mid$(Value, 2) + + $sText = Value + $hDraw.Refresh + UpdateSize + +End + +Public Sub Button_Click() + + Dim hParent As CTagEditor = Me.Parent.Parent.Parent + + Me.Delete + hParent._RaiseChange() + +End diff --git a/app/src/gambas3/.src/Project/Farm/Publish/CTagCompletion.class b/app/src/gambas3/.src/Project/Farm/Publish/CTagCompletion.class new file mode 100644 index 00000000..a8f56f01 --- /dev/null +++ b/app/src/gambas3/.src/Project/Farm/Publish/CTagCompletion.class @@ -0,0 +1,71 @@ +' Gambas class file + +Inherits Completion + +Static Private $aTag As String[] + +Public Farm As String + +Private $aCache As String[] + +Static Public Sub _init() + + Dim I As Integer + + $aTag = ["Example", "Game", "OpenGL", "Database", "Multimedia", "Command-line", "Network", "Web", "Accessories", "Internet", "System"] + For I = 5 To CInt(Split(System.FullVersion, ".")[1]) + 1 + $aTag.Add("Gambas 3." & CStr(I)) + Next + + $aTag.Sort() + +End + +Public Sub Fill(Text As String, Explicit As Boolean) + + Dim aTag As String[] + Dim sTag As String + Dim hHttpClient As HttpClient + Dim sResult As String + Dim aResult As String[] + Dim I As Integer + + If Not Text Then + If Not Explicit Then Return + If $aCache Then + Me.List = $aCache + Return + Endif + Endif + + aTag = New String[] + For Each sTag In $aTag + If Left(sTag, Len(Text)) == Text Then aTag.Add(sTag) + Next + + If Farm Then + + hHttpClient = New HttpClient + hHttpClient.URL = Farm &/ "/farm/tags?name=" & URL.Encode(Text) + hHttpClient.Async = False + hHttpClient.Timeout = 3 + hHttpClient.Get() + sResult = hHttpClient.Peek() + If sResult Begins "10 OK" Then + aResult = Split(Replace(sResult, "\r", ""), "\n") + For I = 1 To aResult.Max + sTag = aResult[I] + 'sTag = UCase(Left(sTag)) & Mid$(sTag, 2) + If Not aTag.Exist(sTag) Then aTag.Add(sTag) + Next + aTag.Sort() + Endif + + Endif + + If Not Text Then $aCache = aTag + + Me.List = aTag + +End + diff --git a/app/src/gambas3/.src/Project/Farm/Publish/CTagEditor.class b/app/src/gambas3/.src/Project/Farm/Publish/CTagEditor.class new file mode 100644 index 00000000..8de22a5d --- /dev/null +++ b/app/src/gambas3/.src/Project/Farm/Publish/CTagEditor.class @@ -0,0 +1,186 @@ +' Gambas class file + +Export + +Event Change + +Inherits UserControl + +Private Const MARGIN As Integer = 5 + +Private $hView As Panel +Private $hEditor As MaskBox +Private $hBorder As Panel +Private $hCompletion As CTagCompletion + +Public Sub _new() + + $hBorder = New Panel(Me) + $hBorder.Border = Border.Plain + $hBorder.Arrangement = Arrange.Fill + $hBorder.Mouse = Mouse.Text + $hBorder.Background = Color.TextBackground + + $hView = New Panel($hBorder) As "View" + $hView.Border = False + $hView.Arrangement = Arrange.Row + $hView.Margin = True + $hView.Spacing = True + $hView.Padding = MARGIN + + Me.Proxy = $hView + + Clear() + +End + +Public Sub SetFarm(sFarm As String) + + $hCompletion.Farm = sFarm + +End + +Private Sub ResizeEditor() + + If Not Object.IsValid($hEditor) Then Return + + $hEditor.Resize(MARGIN * 2 + Max(Desktop.Scale * 12, $hEditor.Font.TextWidth($hEditor.Text) + 8), $hEditor.Font.Height + MARGIN) + $hEditor.Raise + + '$hView.EnsureVisible($hEditor.X, $hEditor.Y - MARGIN, $hEditor.W, $hEditor.H + MARGIN * 2) + With $hEditor + Me.H = .Y + .H + MARGIN + 2 + End With + +End + +Public Sub View_MouseDown() + + ResizeEditor + $hEditor.SetFocus + +End + +Public Sub Editor_Change() + + ResizeEditor + +End + +Public Sub Add(sTag As String) + + AddTag(sTag) + +End + + +Private Sub AddTag(sTag As String) + + Dim hTag As CTag + + sTag = Trim(sTag) + If Not sTag Then Return + If GetTags().Exist(sTag, gb.IgnoreCase) Then Return + + hTag = New CTag($hView) + hTag.Text = sTag + + $hEditor.Text = "" + ResizeEditor + + Raise Change + +End + +Public Sub Editor_Activate() + + AddTag($hEditor.Text) + +End + +Public Sub Editor_KeyPress() + + Dim hTag As CTag + Dim sText As String + + If Key.Code = Key.Backspace And If $hEditor.Length = 0 Then + If $hView.Children.Count >= 2 Then + hTag = $hView.Children[$hView.Children.Count - 2] + sText = hTag.Text + hTag.Delete + $hEditor.Text = sText + $hEditor.Pos = $hEditor.Length + ResizeEditor + Raise Change + Stop Event + Endif + Endif + +End + +Public Sub GetTags() As String[] + + Dim hChild As Control + Dim aTag As New String[] + + For Each hChild In $hView.Children + If hChild Is CTag Then + aTag.Add(CTag(hChild).Text) + Endif + Next + + Return aTag + +End + +Public Sub SetTags(aTag As String[]) + + Dim sTag As String + + Clear() + + For Each sTag In aTag + AddTag(sTag) + Next + +End + +Public Sub Completion_Activate() + + Editor_Activate + +End + +Public Sub _RaiseChange() + + Raise Change + +End + +Public Sub Clear() + + If $hView.Children.Count = 1 Then Return + + $hView.Children.Clear + + $hEditor = New MaskBox($hView) As "Editor" + $hEditor.Border = False + $hEditor.MaxLength = 24 + $hEditor.Filter = "[0-9A-Za-z .-]" + ResizeEditor + + $hCompletion = New CTagCompletion($hEditor) As "Completion" + +End + +Public Sub Sort() + + SetTags(GetTags().Sort(gb.IgnoreCase)) + +End + +Public Sub View_Arrange() + + ResizeEditor + +End diff --git a/app/src/gambas3/.src/Project/Farm/SoftwareBox.class b/app/src/gambas3/.src/Project/Farm/SoftwareBox.class new file mode 100644 index 00000000..1ebb4c96 --- /dev/null +++ b/app/src/gambas3/.src/Project/Farm/SoftwareBox.class @@ -0,0 +1,326 @@ +' Gambas class file + +Inherits UserControl + +Event Ready +'Event Install +'Event Vote +Event Click + +Static Private $hVote As Image +Static Private $hVoteOff As Image +Static Private $hInstall As Image + +Property Read Id As Integer +Property Read Software As CSoftware + +Private $hDrawingArea As DrawingArea +Private $hSoft As CSoftware +Private $hSpinner As Spinner +Private $sFarm As String +Private $iId As Integer +Private $bHighlight As Boolean +Private $bInit As Boolean + + +Public Sub _new(iId As Integer, sFarm As String) ', sLogin As String, sPassword As String) + + If Not $hVote Then + $hVote = Picture["icon:/16/bookmark"].Image + $hVoteOff = $hVote.Copy().Desaturate() + $hInstall = Picture["icon:/16/download"].Image + Endif + + Me.Foreground = Color.TextForeground + + $sFarm = sFarm + $iId = iId + + $hDrawingArea = New DrawingArea(Me) As "DrawingArea" + $hDrawingArea.Mouse = Mouse.Pointing + $hDrawingArea.Focus = True + $hDrawingArea.Tracking = True + + $hSpinner = New Spinner($hDrawingArea) + $hSpinner.Hide + + ' panAction = New Panel($hDrawingArea) + ' panAction.Spacing = True + ' panAction.Invert = True + ' panAction.Ignore = True + ' panAction.ResizeScaled(21, 5) + ' panAction.Arrangement = Arrange.Horizontal + ' + ' btnInstall = New ToolButton(panAction) As "btnInstall" + ' btnInstall.ResizeScaled(10, 5) + ' btnInstall.Font.Grade = 1 + ' btnInstall.AutoResize = True + ' + ' btnVote = New ToolButton(panAction) As "btnVote" + ' btnVote.ResizeScaled(10, 5) + ' 'btnVote.Font.Bold = True + ' btnVote.Font.Grade = 1 + ' btnVote.AutoResize = True + + $hSoft = CSoftware.Get($sFarm, $iId) + Object.Attach($hSoft, Me, "Software") + +End + +Public Sub Load() + + $bInit = True + If $hSoft.State <> CSoftware.STATE_READY Then + Reload + Else + Raise Ready + Endif + +End + + +Public Sub Software_Change() + + $hDrawingArea.Refresh + + If $hSoft.IsFinished() Then + + $hSpinner.Hide + + ' If $hSoft.State = CSoftware.STATE_READY Then + ' + ' 'UpdateButtons + ' + ' Endif + + Raise Ready + + Endif + +End + +Public Sub DrawingArea_Arrange() + + $hSpinner.Move($hDrawingArea.W \ 2 - 16, $hDrawingArea.H \ 2 - 16, 32, 32) + + 'panAction.Move($hDrawingArea.W - Desktop.Scale - panAction.W, Desktop.Scale) + +End + +Public Sub DrawingArea_Enter() + + $bHighlight = True + $hDrawingArea.Refresh + +End + +Public Sub DrawingArea_Leave() + + $bHighlight = False + $hDrawingArea.Refresh + +End + + +Public Sub DrawingArea_Draw() + + Dim X, Y, W, H As Integer + Dim P As Integer + Dim iCol As Integer + Dim sText As String + Dim HN As Integer + + If Not $bInit Then Load + + W = Paint.W + H = Paint.H + P = Desktop.Scale * 2 + + ' If $hSoft.IsInstalled() Then + ' If $hSoft.CanUpgrade() Then + ' iCol = &HDF6B00& + ' Else + ' iCol = &H3398C3& + ' Endif + ' Else + ' iCol = Color.LightForeground + ' Endif + + 'Paint.Brush = Paint.RadialGradient(X, Y, Desktop.Scale * 24, X, Y, [Color.Merge(iCol, Color.TextBackground, 0.6), Color.TextBackground], [0.0, 1.0]) + 'Paint.Rectangle(0, 0, W, H) + 'Paint.Fill + + Paint.AntiAlias = False + Paint.Rectangle(X + 1, Y + 1, W - 3, H - 3) + + Paint.Background = GetBackgroundColor() + Paint.Fill(True) + + If $hDrawingArea.HasFocus Or If $bHighlight Then + Paint.Background = Color.LightBackground + Paint.LineWidth = 2 + Else + Paint.Background = Color.LightForeground + Endif + + Paint.Stroke + Paint.AntiAlias = True + + If Not $hSoft Then Return + + If $hSoft.CanUpgrade() Then + iCol = Project.COLOR_ORANGE + Else If $hSoft.IsReallyInstalled() Then + iCol = Project.COLOR_BLUE + Else + iCol = 0 + Endif + + If iCol Then + Paint.Polygon([Paint.W - 2, Paint.H - P * 3 - 2, Paint.W - 2, Paint.H - 2, Paint.W - 2 - P * 3, Paint.H - 2]) + Paint.Background = Color.SetAlpha(iCol, 128) + Paint.Fill + Endif + + X += P + Y += P + W -= P * 2 + H -= P * 2 + + If $hSoft.State = CSoftware.STATE_ERROR Then + Paint.Font.Italic = True + Paint.Background = Color.Gray + Paint.DrawText($hSoft.ErrorText, X, Y, W, H, Align.TopLeft) + Return + Endif + + Paint.Save + + Paint.Rectangle(X, Y, W, H) + Paint.Clip + + With $hSoft + + If .Icon Then + Paint.DrawImage(.Icon, X, Y) + X += .Icon.W + P + Else + X += CSoftware.IconSize + P + Endif + + Paint.Font.Grade = 2 + HN = $hSoft.PaintName(X, Y) + + X = P '-= CSoftware.ICON_SIZE + P + + sText = .Description + Paint.Font.Grade = -1 + + HN = Max(CSoftware.IconSize, HN) + + W = Paint.W - X - P * 2 + Y += HN + H = Paint.H - Y - P * 3 + 'If .URL Then H -= Desktop.Scale + + Paint.Background = Color.TextForeground + Paint.DrawText(Paint.TrimText(sText, W, H), X, Y, W, H) + + If $hSoft.IsFinished() Then + + Y = Paint.H - P * 2 + H = P + Paint.Font.Grade = -3 + Paint.Font.Italic = True + + Paint.DrawText(Subst(("Published &1"), .GetUploadAge()), X, Y, W, H) + + PaintStat($hSoft, GetBackgroundColor()) + + Endif + + End With + + Paint.Restore + +End + +Private Function Id_Read() As Integer + + Return $hSoft.Id + +End + +Public Sub Reload() + + $hSpinner.Show + $hSoft.Start + '$hDrawingArea.Refresh + +End + +Public Sub DrawingArea_MouseDown() + + Raise Click + +End + +Private Function Software_Read() As CSoftware + + Return $hSoft + +End + +Static Private Sub GetBackgroundColor() As Integer + + Return Color.Merge(Color.TextForeground, Color.TextBackground, 0.97) + +End + + +Static Public Sub PaintStat(hSoft As CSoftware, iBg As Integer, Optional (bWithSize) As Boolean) + + Dim sDownload As String + Dim X, Y As Integer + Dim P As Integer + + P = Desktop.Scale * 2 + + With hSoft + + If .FullDownloadCount <> .DownloadCount Then + sDownload = CStr(.DownloadCount) & " / " & CStr(.FullDownloadCount) & "" + Else + sDownload = "" & CStr(.DownloadCount) & "" + Endif + + Y = P + 'W = Paint.Font.TextWidth(sVote) + + X = Paint.W - P - Paint.Font.RichTextWidth(sDownload) - 1 - $hInstall.W - P \ 2 + + Paint.FillRect(X - P, 0, Paint.W - X + P * 2, $hInstall.H + P * 2, iBg) + Paint.DrawImage($hInstall, X, Y) + X += $hInstall.W + P \ 2 + Paint.DrawRichText(sDownload, X, Y, Paint.W - X, $hInstall.H, Align.Left) + + ' 'Paint.DrawImage(If(.YourVote = 1, $hVote, $hVoteOff), X, Y) + ' + ' X += 20 + ' Paint.DrawText(sVote, X, Y, Paint.W, 16, Align.Left) + ' + ' X += W + 8 + ' + ' Paint.DrawImage($hInstall, X, Y) + ' + ' X += 20 + ' Paint.DrawText(sDownload, X, Y, Paint.W, 16, Align.Left) + ' + ' If bWithSize Then + ' Y += 24 + ' Paint.DrawText(Project.GetFileSize(.Size), P, Y, Paint.W - P * 2, 16, Align.Right) + ' Endif + + End With + +End diff --git a/app/src/gambas3/.src/Project/Library/CLibraryInfo.class b/app/src/gambas3/.src/Project/Library/CLibraryInfo.class new file mode 100644 index 00000000..0065d890 --- /dev/null +++ b/app/src/gambas3/.src/Project/Library/CLibraryInfo.class @@ -0,0 +1,225 @@ +' Gambas class file + +Static Property Read UserPath As String + +Public Name As String +Public Path As String +Public NotFound As Boolean +Public Version As String +Public (Classes) As String[] +Public Libraries As String[] +Public Info As String +Public Require As String[] +Public CompatibleUntil As String + +Private $sDesc As String + +Static Private $cAll As New Collection +Static Private $sInfo As String + +Public Sub Check(sPath As String) As Boolean + + Dim bNotFound As Boolean + + sPath = SolvePath(sPath) + If sPath Then + bNotFound = False + Else + bNotFound = True + Endif + + Return bNotFound <> NotFound + +End + +Static Public Sub _get(sPath As String) As CLibraryInfo + + Dim hLib As CLibraryInfo = $cAll[sPath] + + If hLib Then + If hLib.Check(sPath) Then hLib = Null + Endif + + If Not hLib Then + hLib = New CLibraryInfo(sPath) + $cAll[sPath] = hLib + Endif + Return hLib + +End + +Static Public Sub Clear() + + $cAll.Clear + +End + +Static Public Sub Exit() + + Clear() + +End + +Static Public Sub SolvePath(sPath As String, Optional bKeepPath As Boolean) As String + + Dim sSolve As String + + If Left(sPath) = ":" Then + sPath = Mid$(sPath, 2) + sSolve = CLibraryInfo.UserPath &/ sPath & ".gambas" + If Not Exist(sSolve) Then sSolve = Component.Path &/ sPath & ".gambas" + Else + sSolve = sPath + If sSolve Not Ends ".gambas" Then sSolve &= ".gambas" + Endif + + 'sSolve = File.SetExt(sSolve, "gambas") + + If bKeepPath Or If Exist(sSolve) Then Return sSolve + +End + +Public Sub _new(sPath As String) + + Dim sLine As String + Dim iPos As Integer + Dim sData As String + Dim aData As String[] + + If Left(sPath) = ":" Then + Name = File.Name(sPath) + iPos = RInStr(Name, ":") + If iPos Then + Version = Mid$(Name, iPos + 1) + Name = Left(Name, iPos - 1) + Endif + Else + Name = File.BaseName(sPath) + Endif + + sPath = SolvePath(sPath, True) + + Classes = New String[] + Libraries = New String[] + Require = New String[] + Path = sPath + + If Not sPath Or If Not Exist(sPath) Then + NotFound = True + Return + Endif + + Exec [System.Path &/ "bin/gba" & System.Version, "-x", sPath, ".startup"] To sData + aData = Split(sData, "\n") + Try Version = aData[4] + + For iPos = 5 To aData.Max + If aData[iPos] Then Break + Next + + While iPos <= aData.Max + If Left(aData[iPos]) = "/" Then Libraries.Add(aData[iPos]) + Inc iPos + Wend + + Exec [System.Path &/ "bin/gba" & System.Version, "-x", sPath, ".list"] To sData + Classes = Split(sData, "\n", "", True) + + Exec [System.Path &/ "bin/gba" & System.Version, "-x", sPath, ".component"] To sData + For Each sLine In Split(sData, "\n", "", True) + sLine = Trim(sLine) + If sLine Begins "Requires=" Then + Require.Insert(Split(Trim(Mid$(sLine, InStr(sLine, "=") + 1)))) + Else If sLine Begins "CompatibleUntil=" Then + CompatibleUntil = Trim(Mid$(sLine, InStr(sLine, "=") + 1)) + Endif + Next + +End + +Public Sub GetInfo() + + Exec [System.Path &/ "bin/gba" & System.Version, "-x", Path, ".info"] To Info + +End + +Public Sub GetHelp() As String + + Dim sData As String + Dim aData As String[] + Dim iPos As Integer + + If Not $sDesc Then + + Exec [System.Path &/ "bin/gba" & System.Version, "-x", Path, ".project"] To sData + + aData = Split(sData, "\n") + iPos = aData.Find("Description=*", gb.Like) + If iPos >= 0 Then + $sDesc = UnQuote(Scan(aData[iPos], "Description=*")[0]) + Else + $sDesc = " " + Endif + + Endif + + Return Trim($sDesc) + +End + +Public Sub GetDependencyName() As String + + Dim sProject As String + Dim sLine As String + Dim sVendor As String + Dim sVendorPrefix As String + + Exec [System.Path &/ "bin/gba" & System.Version, "-x", Path, ".project"] To sProject + + For Each sLine In Split(sProject, "\n") + If sLine Begins "Vendor=" Then + sVendor = Mid$(sLine, InStr(sLine, "=") + 1) + Else If sLine Begins "Vendor=" Then + sVendorPrefix = Mid$(sLine, InStr(sLine, "=") + 1) + Endif + Next + + Return Package.GetPackagePrefix(Project.TYPE_LIBRARY, sVendor, sVendorPrefix, True) & Package.GetPackageName(Name) + +End + +Private Sub AddInfo(sTitle As String, sValue As String) + + If $sInfo Then $sInfo &= "
      " + $sInfo &= Subst(("&1: &2"), sTitle, sValue) + +End + + +Public Sub GetDescription(bLong As Boolean) As String + + Dim sDesc As String + + If NotFound Then bLong = True + + $sInfo = "" + AddInfo(("Location"), Path) + If NotFound Then + $sInfo &= "
      " & ("WARNING! Library not found.") & "" + Else + AddInfo(("Provides"), Classes.Join(", ")) + If Require.Count Then AddInfo(("Requires"), Require.Join(", ")) + Endif + + sDesc = "

      " & File.Name(File.Dir(Path)) & " ▸ " & Name & " " & Version & "

      " + If bLong Then sDesc &= "

      " & $sInfo & "" + Return sDesc + +End + +Static Private Function UserPath_Read() As String + + Return Desktop.DataDir &/ "gambas3/lib" + +End + diff --git a/app/src/gambas3/.src/Project/Library/FSelectLibrary.class b/app/src/gambas3/.src/Project/Library/FSelectLibrary.class new file mode 100644 index 00000000..a127671e --- /dev/null +++ b/app/src/gambas3/.src/Project/Library/FSelectLibrary.class @@ -0,0 +1,146 @@ +' Gambas class file + +Static Public Path As String + +Public Sub Run() As Boolean + + Return Not Me.ShowModal() + +End + +Public Sub btnOK_Click() + + Dim sKey As String + + sKey = cvwLibrary.Key + If Not sKey Then Return + If Not cvwLibrary.Current.ParentKey Then Return + + Path = ":" & sKey + + Me.Close(True) + +End + +Public Sub btnCancel_Click() + + Me.Close + +End + +Private Sub RefreshLibraries() + + Dim sDir As String + Dim sVendor As String + Dim sLib As String + Dim bParent As Boolean + Dim aLib As String[] + Dim sKey As String + Dim hPict As Picture + + cvwLibrary.Clear + + For Each sDir In [CLibraryInfo.UserPath, Component.Path] + + If Not IsDir(sDir) Then Continue + + For Each sVendor In Dir(sDir, "*", gb.Directory).Sort(gb.Natural) + + bParent = cvwLibrary.Exist(sVendor) + + For Each sLib In Dir(sDir &/ sVendor, "*.gambas", gb.File).Sort(gb.Natural) + + sLib = File.BaseName(sLib) + sKey = sVendor &/ sLib + If cvwLibrary.Exist(sKey) Then Continue + + aLib = Split(sLib, ":") + If aLib.Count <> 2 Then Continue + + If Not bParent Then + If sVendor = "(unknown)" Then + With cvwLibrary.Add(sVendor, "", Picture["icon:/small/directory"]) + .Expanded = True + .RichText = "" & ("unknown") & "" + End With + Else + cvwLibrary.Add(sVendor, sVendor, Picture["icon:/small/directory"]).Expanded = True + Endif + bParent = True + Endif + + If sDir = Component.Path Then + hPict = Picture["icon:/small/component"] + Else + hPict = Picture["icon:/small/book"] + Endif + + cvwLibrary.Add(sKey, aLib[0], hPict, sVendor)[1] = aLib[1] + + Next + + Next + + Next + + If cvwLibrary.Count Then + cvwLibrary.Show + panNoLibrary.Hide + Else + cvwLibrary.Hide + panNoLibrary.Show + Endif + +End + +Public Sub Form_Open() + + Settings.Read(Me) + + cvwLibrary.Columns.Count = 2 + cvwLibrary.Columns[0].Text = ("Library") + cvwLibrary.Columns[0].Expand = True + cvwLibrary.Columns[1].Text = ("Version") + + RefreshLibraries + +End + +Public Sub cvwLibrary_Select() + + If cvwLibrary.Key And If Not cvwLibrary.Current.ParentKey Then + cvwLibrary.MoveChild + cvwLibrary.Item.Selected = True + Endif + + btnRemove.Enabled = cvwLibrary.Key + btnOK.Enabled = btnRemove.Enabled + +End + +Public Sub btnRemove_Click() + + Dim sPath As String + + If Not cvwLibrary.Key Then Return + + sPath = CLibraryInfo.UserPath &/ cvwLibrary.Key & ".gambas" + Try Kill sPath + Try Rmdir File.Dir(sPath) + + RefreshLibraries + cvwLibrary_Select + +End + +Public Sub cvwLibrary_Activate() + + btnOK.Value = True + +End + +Public Sub Form_Close() + + Settings.Write(Me) + +End diff --git a/app/src/gambas3/.src/Project/Library/FSelectLibrary.form b/app/src/gambas3/.src/Project/Library/FSelectLibrary.form new file mode 100644 index 00000000..069f300b --- /dev/null +++ b/app/src/gambas3/.src/Project/Library/FSelectLibrary.form @@ -0,0 +1,52 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,64,50) + Text = ("Select a library") + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + { cvwLibrary ColumnView + MoveScaled(5,5,39,31) + Expand = True + } + { panNoLibrary Panel + MoveScaled(9,21,43,17) + Visible = False + Background = Color.TextBackground + Expand = True + Arrangement = Arrange.Fill + Margin = True + Border = Border.Plain + { TextLabel1 TextLabel + MoveScaled(5,2,34,12) + Font = Font["Italic"] + Text = ("No library has been found on your system.") + } + } + { HBox1 HBox + MoveScaled(1,44,62,4) + Spacing = True + { btnRemove Button + MoveScaled(2,0,16,4) + Enabled = False + Text = ("Uninstall") + Picture = Picture["icon:/small/undo"] + } + { Panel1 Panel + MoveScaled(23,0,4,4) + Expand = True + } + { btnOK Button + MoveScaled(29,0,16,4) + Enabled = False + Text = ("OK") + Default = True + } + { btnCancel Button + MoveScaled(46,0,16,4) + Text = ("Cancel") + Cancel = True + } + } +} diff --git a/app/src/gambas3/.src/Project/Library/LibraryItem.class b/app/src/gambas3/.src/Project/Library/LibraryItem.class new file mode 100644 index 00000000..dcef4c05 --- /dev/null +++ b/app/src/gambas3/.src/Project/Library/LibraryItem.class @@ -0,0 +1,120 @@ +' Gambas class file + +Inherits UserControl + +Property Path As String + +Private $hDrawingArea As DrawingArea +Private $sPath As String +Private $hLibraryInfo As CLibraryInfo +Private $sText As String +Private $iTextW As Integer + +Private Const ICON_SIZE As Integer = 32 +Private Const PADDING As Integer = 6 + +Private $bHighlight As Boolean + +Property Background As Integer + +Public Sub _new() + + $hDrawingArea = New DrawingArea(Me) As "DrawingArea" + $hDrawingArea.Mouse = Mouse.Pointing + Me.H = Max(ICON_SIZE, Desktop.Scale * 12) + PADDING * 2 + +End + +Private Sub IsSelected() As Boolean + + Return Me.Background = Color.SelectedBackground + +End + + +Private Sub SetPath(sPath As String) + + $sPath = sPath + $hLibraryInfo = CLibraryInfo[sPath] + Me.Refresh + +End + +Public Sub DrawingArea_Draw() + + Dim X, W As Integer + + If Not $hLibraryInfo Then Return + + With $hLibraryInfo + + $sText = Subst("", If(IsSelected(), "white", "black")) + $sText &= "" & .Name & " " & .Version & "" + '$sText &= Subst("", If(IsSelected(), "white", "gray")) & Replace($sPath, System.User.Home, "~") & "" + $sText &= "


      " & ("Location") & " : " & Replace($sPath, User.Home, "~") & "" + If .NotFound Then + $sText &= "

      " & ("WARNING! Library not found.") & "" + Else + $sText &= "
      " & ("Provides") & " : " & .Classes.Join(", ") & "" + 'If .Libraries.Count Then $sText &= "
      " & ("Depends on") & " : " & .Libraries.Join(", ") & "" + If .Require.Count Then $sText &= "
      " & ("Requires") & " : " & .Require.Join(", ") & "" + $sText &= "
      " + Endif + + $iTextW = Draw.RichTextWidth($sText) + + Draw.Picture(Picture["icon:/" & ICON_SIZE & "/exec"], PADDING, PADDING) + + X = ICON_SIZE + PADDING * 2 + W = Max(Me.W - X - PADDING, $iTextW) + If IsSelected() Then Draw.Foreground = Color.SelectedForeground + Draw.RichText($sText, X, PADDING, W, Desktop.Scale * 6, Align.TopLeft) + + End With + +End + +Public Sub DrawingArea_Enter() + + 'If Me.Parent Is ListContainer Then + If Me.Background = Color.Default Then + $hDrawingArea.Background = Color.LightBackground + $bHighlight = True + Endif + 'Endif + +End + +Public Sub DrawingArea_Leave() + + If $bHighlight Then + $hDrawingArea.Background = Color.Default + Endif + +End + + +Private Function Background_Read() As Integer + + Return Super.Background + +End + +Private Sub Background_Write(Value As Integer) + + Super.Background = Value + $hDrawingArea.Background = Color.Default + +End + +Private Function Path_Read() As String + + Return $sPath + +End + +Private Sub Path_Write(Value As String) + + SetPath(Value) + +End diff --git a/app/src/gambas3/.src/Project/Patch/FMakePatch.class b/app/src/gambas3/.src/Project/Patch/FMakePatch.class new file mode 100644 index 00000000..ee3bc161 --- /dev/null +++ b/app/src/gambas3/.src/Project/Patch/FMakePatch.class @@ -0,0 +1,155 @@ +' Gambas class file + +' (C) 2013, 2014 Tobias Boege + +Private $sOldName As String +Private $hViewer As FPatch + +Public Sub wizMakePatch_BeforeChange() + + Dim hProject As CProjectInfo + + Select Case wizMakePatch.Index + Case 0 + wizMakePatch[1].Enabled = radArchive.Value + wizMakePatch[2].Enabled = Not radArchive.Value + + Case 1 + If Not Exist(fchOld.SelectedPath) Or If IsDir(fchOld.SelectedPath) Then + Message.Warning(("Please select the origin archive.")) + Stop Event + Endif + Project.Config["/FMakePatch/LastArchive"] = fchOld.SelectedPath + $sOldName = File.BaseName(fchOld.SelectedPath) + If File.Ext($sOldName) = "tar" Then $sOldName = File.BaseName($sOldName) + + Case 2 + If Not IsDir(pchOld.Path) Or If Not Exist(pchOld.Path &/ ".project") Then + Message.Warning(("Please select the origin project.")) + Stop Event + Endif + Project.Config["/FMakePatch/LastProject"] = pchOld.Path + $sOldName = File.Name(pchOld.Path) + hProject = New CProjectInfo(pchOld.Path) + $sOldName &= "-" & hProject.Version + + End Select + +End + +Private Function GetDiff() As String + + Dim sOld As String + + If radArchive.Value Then + sOld = fchOld.SelectedPath + Else + sOld = pchOld.Path + Endif + + Project.Config["/FMakePatch/MakeName"] = CBool(chkMakeName.Value) + Project.Config["/FMakePatch/EditPatch"] = CBool(chkEditPatch.Value) + If Not chkMakeName.Value Then + Project.Config["/FMakePatch/PatchName"] = fchPatch.Value + Endif + + Project.Save() + Return Patch.GenerateForOld(sOld) + +End + +Public Sub wizMakePatch_Close() + + Dim sDiff As String + + If Not fchPatch.Value Then + Message.Warning(("Please enter the patch file name.")) + Return + Endif + + ' Get the edited patch + If chkEditPatch.Value And If $hViewer Then + sDiff = $hViewer.Patch.MakeText() + Else + sDiff = GetDiff() + Endif + File.Save(fchPatch.Value, sDiff) + Message.Info(("Patch has been successfully generated.")) + Me.Close() + +Catch + + Message.Error(("Unable to generate the patch.") & "\n\n" & Error.Text) + +End + +Public Sub wizMakePatch_Cancel() + + Me.Close() + +End + +Public Sub chOld_Activate() + + wizMakePatch.Index = 3 + +End + +Public Sub fchPatch_Activate() + + wizMakePatch_Close() + +End + +Public Sub Form_Open() + + Settings.Read(Me) + Settings.Read(fchPatch) + + chkMakeName.Value = Project.Config["/FMakePatch/MakeName", True] + chkEditPatch.Value = Project.Config["/FMakePatch/EditPatch", True] + fchOld.SelectedPath = Project.Config["/FMakePatch/LastArchive", User.Home] + pchOld.Path = Project.Config["/FMakePatch/LastProject", User.Home] + + $hViewer = New FPatch(panViewer) + +End + +Public Sub Form_Close() + + Settings.Write(Me) + Settings.Write(fchPatch) + +End + +Public Sub wizMakePatch_Change() + + Dim sName As String + + If wizMakePatch.Index = 3 Then + $hViewer.Clear() + Try $hViewer.Parse(GetDiff()) + If Error Then + Message.Error(("Unable to generate the patch.") & "\n\n" & Error.Text) + Endif + Else If wizMakePatch.Index = 4 Then + If chkMakeName.Value Then + sName = $sOldName + sName &= "~" + If $sOldName Not Begins sName & "-" Then + sName &= Project.Name & "-" + Endif + sName &= Project.FormatVersion() + fchPatch.SelectedPath = fchPatch.Dir &/ sName & ".patch" + Else + fchPatch.SelectedPath = Project.Config["/FMakePatch/PatchName"] + Endif + Endif + +End + +Public Sub chkEditPatch_Click() + + wizMakePatch[3].Enabled = chkEditPatch.Value + +End diff --git a/app/src/gambas3/.src/Project/Patch/FMakePatch.form b/app/src/gambas3/.src/Project/Patch/FMakePatch.form new file mode 100644 index 00000000..55bce0a2 --- /dev/null +++ b/app/src/gambas3/.src/Project/Patch/FMakePatch.form @@ -0,0 +1,97 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,82,65) + Text = ("Generate patch") + Icon = Picture["icon:/16/text"] + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + { wizMakePatch Wizard + MoveScaled(1,1,79,63) + Expand = True + Arrangement = Arrange.Vertical + Spacing = True + Count = 5 + TextFont = Font["Bold,+3"] + ShowIndex = True + Border = False + Index = 0 + Text = ("Select patch origin") + { Panel1 VBox + MoveScaled(0,0,70,45) + Expand = True + { Label1 Label + MoveScaled(0,0,18,4) + Font = Font["Bold"] + Text = ("Patch origin") + } + { radArchive RadioButton radType + Name = "radArchive" + MoveScaled(1,4,40,4) + Text = ("Source archive") + Value = True + } + { radProject RadioButton radType + Name = "radProject" + MoveScaled(1,8,45,4) + Text = ("Project directory") + } + { Label2 Label + MoveScaled(0,13,23,4) + Font = Font["Bold,"] + Text = ("Options") + } + { chkMakeName CheckBox + MoveScaled(1,17,64,4) + Text = ("Automatic patch name") + Value = CheckBox.True + } + { chkEditPatch CheckBox + MoveScaled(1,21,64,4) + Text = ("Edit patch") + Value = CheckBox.True + } + { Panel2 Panel + MoveScaled(14,26,19,2) + } + { TextLabel1 TextLabel + MoveScaled(0,29,69,9) + Font = Font["Italic,-1"] + Text = ("This wizard will generate a patch between an origin project and the current project.") + } + } + Index = 1 + Text = ("Select source archive") + { fchOld FileChooser chOld + Name = "fchOld" + MoveScaled(2,2,75,48) + Expand = True + Filter = [("*.gz;*.bz2;*.xz"), ("Source packages")] + ShowFile = False + } + Index = 2 + Text = ("Select project directory") + { pchOld ProjectChooser chOld + Name = "pchOld" + MoveScaled(2,1,68,49) + Expand = True + Border = True + } + Index = 3 + Text = ("Edit patch") + { panViewer Panel + MoveScaled(2,1,70,45) + Expand = True + Arrangement = Arrange.Fill + } + Index = 4 + Text = ("Choose patch file name") + { fchPatch FileChooser + MoveScaled(0,1,77,51) + Expand = True + Filter = [("*.patch;*.diff"), ("Patch/Diff files")] + } + Index = 0 + } +} diff --git a/app/src/gambas3/.src/Project/Patch/FPatch.class b/app/src/gambas3/.src/Project/Patch/FPatch.class new file mode 100644 index 00000000..fbe64f57 --- /dev/null +++ b/app/src/gambas3/.src/Project/Patch/FPatch.class @@ -0,0 +1,221 @@ +' Gambas class file + +' (C) 2013, 2014, almost-2015 Tobias Boege + +'' Get the edited patch back +Property Read {Patch} As Patch + +Private $hPatch As New Patch +Private $hObs As Observer +' Whether we behave like a window or just an embedded control (see FMakePatch, Step #4) +Private $bWindowed As Boolean + +Public Sub _new() + + $bWindowed = Not Me.Parent + panSelectPath.Visible = $bWindowed + panButton.Visible = $bWindowed + Me.Margin = $bWindowed + +End + +Public Sub Form_Open() + + Settings.Read(Me) + + gvwHunks.Font = Project.GetEditorFont() + gvwHunks.Columns.Count = 4 + gvwHunks.Columns[0].Width = Desktop.Scale * 4 + gvwHunks.Columns[1].Expand = True + gvwHunks.Columns[2].Expand = False + gvwHunks.Columns[3].Expand = False + + $hObs = New Observer(gvwHunks.Proxy, True) As "Observer" + + edtPatch.ReadConfig + edtPatch.ShowLineNumber = True + +End + +Private Sub Check(iRow As Integer, bActive As Boolean) + + $hPatch[iRow].Active = bActive + gvwHunks[iRow, 0].Picture = If(bActive, Picture["img/16/checked.png"], Picture["img/16/unchecked.png"]) + edtPatch.Highlight = IIf($hPatch[gvwHunks.Row].Active, "diff", "") + +End + +Public Sub Observer_MouseDown() + + Dim bSelect As Boolean + Dim iRow As Integer + + With gvwHunks + + If .ColumnAt(Mouse.X) = 0 Then + iRow = .RowAt(Mouse.Y) + If iRow >= 0 Then + bSelect = Not $hPatch[.Row].Active + For Each iRow In .Rows.Selection + Check(iRow, bSelect) + Next + Endif + Stop Event + Endif + End With + +End + +Public Sub gvwHunks_Select() + + With gvwHunks + If .Row < 0 Then + edtPatch.Text = "" + Return + Endif + + If $hPatch[.Row].Active Then + 'gvwHunks[.Row, 0].Picture = Picture["img/16/checked.png"] + edtPatch.Highlight = "diff" + Else + 'gvwHunks[.Row, 0].Picture = Picture["img/16/unchecked.png"] + edtPatch.Highlight = "" + Endif + edtPatch.Text = $hPatch[.Row].Text + End With + +End + +' Public Sub gvwHunks_Activate() +' +' Dim iRow As Integer = gvwHunks.Row +' +' If iRow >= 0 Then Check(iRow, Not $hPatch[iRow].Active) +' +' End + +Public Sub edtPatch_Highlight(Text As String) + + TextHighlighter.Add(Highlight.Preprocessor, String.Len(Text)) + +End + +Private Sub RefreshHunks() + + Dim iInd As Integer + Dim sToFile As String + ' Dim sLineInfo As String + ' Dim iAltColor, iJ As Integer + Dim aScan As String[] + + ' iAltColor = Color.Merge(Color.TextBackground, Color.LightBackground) + + gvwHunks.Rows.Height = Max(gvwHunks.Font.Height, 20) + gvwHunks.Rows.Count = $hPatch.Count + For iInd = 0 To $hPatch.Count - 1 + With $hPatch[iInd] + gvwHunks[iInd, 0].Picture = Picture["img/16/" & IIf(.Active, "checked.png", "unchecked.png")] + gvwHunks[iInd, 0].Padding = 2 + If .ToFile Then + sToFile = Scan(.ToFile, "+++ */*\t*")[1] + Else + If iInd Then sToFile = gvwHunks[iInd - 1, 1].Text + Endif + gvwHunks[iInd, 1].Text = sToFile + aScan = Scan(RTrim(.LineInfo), "@@ -* +* @@") + 'sLineInfo = aScan[0] & "\t--> " & aScan[1] + gvwHunks[iInd, 2].Text = aScan[0] + gvwHunks[iInd, 3].Text = "--> " & aScan[1] + + ' If Even(iInd) Then + ' For iJ = 0 To gvwHunks.Columns.Count - 1 + ' gvwHunks[iInd, iJ].Background = iAltColor + ' Next + ' Endif + End With + Next + + gvwHunks.Columns[2].Width = -1 + gvwHunks.Columns[3].Width = -1 + + btnApply.Enabled = True + btnRevert.Enabled = True + +End + +Public Sub btnApply_Click() + + $hPatch.Apply() + Project.ReadProject() + Project.Refresh(True) + +End + +Public Sub btnRevert_Click() + + $hPatch.Revert() + Project.ReadProject() + Project.Refresh(True) + +End + +Public Sub btnClose_Click() + + Me.Close + +End + +Public Sub Form_Close() + + ' Save configuration only if we're windowed (else we're just a + ' control in some other window where it makes no sense to save + ' our geometry). + If $bWindowed Then Settings.Write(Me) + +End + +Public Sub txtPath_Click() + + Dialog.Title = ("Select patch") + Dialog.Filter = ["*.patch;*.diff", ("Patch/Diff files")] + Dialog.Path = Project.Config["/FPatch/LastPatch", User.Home] + + If Dialog.OpenFile() Then Return + + If Not Project.IsPatchFile(Dialog.Path) Then + Message.Warning(("That file does not look like a patch file!")) + Return + Endif + + Project.Config["/FPatch/LastPatch"] = Dialog.Path + txtPath.Text = Dialog.Path + + Inc Application.Busy + Parse(File.Load(Dialog.Path)) + Dec Application.Busy + +End + +Public Sub Clear() + + $hPatch = New Patch + RefreshHunks() + +End + +Public Sub Parse(sFile As String) + + Inc Application.Busy + $hPatch.Parse(sFile) + RefreshHunks() + + Finally + Dec Application.Busy + +End + +Private Function Patch_Read() As Patch + + Return $hPatch + +End diff --git a/app/src/gambas3/.src/Project/Patch/FPatch.form b/app/src/gambas3/.src/Project/Patch/FPatch.form new file mode 100644 index 00000000..73687e76 --- /dev/null +++ b/app/src/gambas3/.src/Project/Patch/FPatch.form @@ -0,0 +1,68 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,79,71) + Text = ("Patch the current project") + Icon = Picture["icon:/16/pen"] + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + { panSelectPath VBox + MoveScaled(2,3,67,8) + Spacing = True + { Label1 Label + MoveScaled(0,0,21,3) + Font = Font["Bold"] + Text = ("Select patch") + } + { txtPath ButtonBox + MoveScaled(0,4,19,4) + Picture = Picture["icon:/small/open"] + ReadOnly = True + } + } + { VSplit1 VSplit + MoveScaled(2,14,75,42) + Expand = True + Spacing = True + Border = False + { gvwHunks GridView + MoveScaled(4,5,58,15) + Font = Font["Monospace"] + Expand = True + Mode = Select.Multiple + Grid = False + } + { edtPatch TextEditor + MoveScaled(7,24,53,13) + Expand = True + ReadOnly = True + } + } + { panButton HBox + MoveScaled(3,64,59,4) + Spacing = True + { btnApply Button + MoveScaled(0,0,15,4) + Enabled = False + Text = Shortcut(("Apply"), "A") + Picture = Picture["icon:/small/apply"] + } + { btnRevert Button + MoveScaled(16,0,16,4) + Enabled = False + Text = Shortcut(("Revert"), "R") + Picture = Picture["icon:/small/undo"] + } + { Panel1 Panel + MoveScaled(34,0,2,3) + Expand = True + } + { btnClose Button + MoveScaled(39,0,16,4) + AutoResize = True + Text = Shortcut(("Close"), "C") + Picture = Picture["icon:/small/close"] + } + } +} diff --git a/app/src/gambas3/.src/Project/Patch/Patch.class b/app/src/gambas3/.src/Project/Patch/Patch.class new file mode 100644 index 00000000..ec5c088f --- /dev/null +++ b/app/src/gambas3/.src/Project/Patch/Patch.class @@ -0,0 +1,212 @@ +' Gambas class file + +' (C) 2013, 2014 Tobias Boege + +'' Represent a patch hunk +Public Struct Hunk + Command As String '' Hunk command + FromFile As String + ToFile As String + LineInfo As String '' Line information + Active As Boolean + Text As String +End Struct + +'' Get the number of hunks +Property Read Count As Integer + +Private $hHunks As Hunk[] +Static Private $sIgnoreFile As String + +Static Public Sub _init() + + $sIgnoreFile = "/tmp/gambas-patch-ignore" ' Prevent UID/PID leakage + File.Save($sIgnoreFile, "") + Chmod $sIgnoreFile To "rw-------" + File.Save($sIgnoreFile, ".settings\n.action\n.info\n.list\n.startup\n.pot\n") + +End + +Static Private Function PrepareOldSource(sOldSource As String) As String + + Dim sOld As String = File.SetExt(Temp$("a"), "") + Dim sOldArchive As String = Temp$("source-archive") & ".tar.gz" + Dim sType As String + + If IsDir(sOldSource) Then + If Not Exist(sOldSource &/ ".project") Then + Error.Raise(("The directory is not a Gambas project")) + Return Null + Endif + Project.MakeSourcePackageFromTo(sOldSource, sOldArchive) + sOldSource = sOldArchive + Endif + + If Right$(sOldSource, 3) = ".gz" Then + sType = "z" + Else If Right$(sOldSource, 4) = ".bz2" Then + sType = "j" + Else If Right$(sOldSource, 3) = ".xz" Then + sType = "J" + Else + Error.Raise(("Unsupported source archive format")) + Return Null + Endif + + Mkdir sOld + Shell Subst$("tar -&1xf &2 -C &3 --strip-components=1", sType, Shell$(sOldSource), sOld) Wait + If Exist(sOldArchive) Then Kill sOldArchive + Return sOld + +End + +Static Private Function PrepareNewSource() As String + + Dim sNew As String = File.SetExt(Temp$("b"), "") + Dim sNewArchive As String = Temp$("source-archive") & ".tar.gz" + + Project.MakeSourcePackageTo(sNewArchive) + Mkdir sNew + Shell Subst$("tar -zxf &1 -C &2 --strip-components=1", sNewArchive, sNew) Wait + Kill sNewArchive + Return sNew + +End + +'' Generate a patch for the old source archive or directory to ascend to the current project's state +Static Public Function GenerateForOld(sOldSource As String) As String + + Dim sOld As String + Dim sNew As String + Dim sCmd As String + Dim sPatch As String + + sOld = PrepareOldSource(sOldSource) + sNew = PrepareNewSource() + + sCmd = Subst$("cd &1; ", File.Dir(sOld)) + sCmd &= Subst$("diff -urNaX &1 &2 &3", $sIgnoreFile, File.Name(sOld), File.Name(sNew)) + Shell sCmd To sPatch + Shell Subst$("rm -r &1 &2", Shell(sOld), Shell(sNew)) + Return sPatch + +End + +Public Sub _new(Optional sPath As String) + + $hHunks = New Hunk[] + If Not sPath Then Return + Parse(File.Load(sPath)) + +End + +'' Parse the patch and add its hunks to the current object +Public Sub Parse(sText As String) + + Dim aLines As String[] + Dim iInd As Integer + Dim hHunk As Hunk + Dim bFirst As Boolean = True + Dim bInHeader As Boolean = False + + hHunk = New Hunk + hHunk.Active = True + aLines = Split(sText, "\n") + For iInd = 0 To aLines.Count - 1 + If Left$(aLines[iInd], 4) = "diff" Then + GoSub ADD_HUNK + bInHeader = True + hHunk.Command = aLines[iInd] + Else If Left$(aLines[iInd], 3) = "---" Then + GoSub ADD_HUNK + bInHeader = True + hHunk.FromFile = aLines[iInd] + Else If Left$(aLines[iInd], 3) = "+++" And If bInHeader Then + hHunk.ToFile = aLines[iInd] + Else If Left$(aLines[iInd]) = "@" Then + GoSub ADD_HUNK + bInHeader = True + hHunk.LineInfo = aLines[iInd] + Else If aLines[iInd] = "" Then + Continue + Else + bInHeader = False + Endif + hHunk.Text &= aLines[iInd] & "\n" + Next + +ADD_HUNK: + If Not bInHeader Then + If Not bFirst Then + $hHunks.Add(hHunk) + hHunk = New Hunk + hHunk.Active = True + Endif + bFirst = False + Endif + Return + +End + +'' Generate a patch file from all activated hunks +Public Function MakeText() As String + + Dim iInd As Integer + Dim sText As String + + For iInd = 0 To $hHunks.Count - 1 + If Not $hHunks[iInd].Active Then Continue + sText &= $hHunks[iInd].Text + Next + Return sText + +End + +Private Sub DoPatch(Optional sOpt As String = "") + + Dim sCmd As String + Dim sTemp As String = Temp$("current-patch") + Dim sBackup As String = Temp$("backup") & "/" + Dim sRes As String + + File.Save(sTemp, MakeText()) + Try Mkdir sBackup + sCmd = Subst$("cd &1; patch &2 -B &3 -r - ", Shell$(Project.Dir), sOpt, sBackup) + sCmd &= Subst$("-bsNp1 <&1", Shell$(sTemp)) + Shell sCmd To sRes + If Process.LastValue Then + If Dir(sBackup).Count Then Shell Subst$("cp -r &1 &2", Dir(sBackup).Join(" "), Shell$(Project.Dir)) Wait + Message.Error(("Patch didn't apply:\n") & sRes) + Else + Project.ReloadAll() + Endif + Shell "rm -r " & Shell(sBackup) + +End + +'' Apply this patch +Public Sub Apply() + + DoPatch() + +End + +'' Revert this patch +Public Sub Revert() + + DoPatch("-R") + +End + +'' Get a hunk from this patch +Public Sub _get(iIndex As Integer) As Hunk + + Return $hHunks[iIndex] + +End + +Private Function Count_Read() As Integer + + Return $hHunks.Count + +End diff --git a/app/src/gambas3/.src/Project/ProjectBox.class b/app/src/gambas3/.src/Project/ProjectBox.class new file mode 100644 index 00000000..48ae9e35 --- /dev/null +++ b/app/src/gambas3/.src/Project/ProjectBox.class @@ -0,0 +1,471 @@ +' Gambas class file + +Inherits UserControl + +Event Click +Event DblClick +Event ButtonClick +Event RemoveClick + +Static Public ShowButton As Boolean + +Property ShowPath As Boolean +Property Path As String +Property Highlight As Boolean +Property Selected As Boolean +Property ShowAuthors As Boolean +Property Read Info As CProjectInfo + +Public ShowRemove As Boolean +Public Group As String ' for examples +Public Template As Boolean + +Static Private $hRemove As Image +Static Private $hRemoveGray As Image + +Private $hDrawingArea As DrawingArea +Private $sPath As String +Private $hProjectInfo As CProjectInfo +Private $hIcon As Image +Private $bShowPath As Boolean +Private $bShowAuthors As Boolean + +Private ICON_SIZE As Integer = Desktop.Scale * 4 + +Private $bCanHighlight As Boolean = True +Private $bHighlight As Boolean + +Private $hObs As Observer + +'Private $iIdealH As Integer +Private $iIdealW As Integer +Private $bSelected As Boolean +Private $sToolTip As String +Private $bInsideButton As Boolean +Private $bInsideRemove As Boolean + +Public Sub _new() + + $hDrawingArea = New DrawingArea(Me) As "DrawingArea" + $hDrawingArea.Mouse = Mouse.Pointing + $hDrawingArea.Focus = True + $hDrawingArea.Tracking = True + + $hObs = New Observer(Me) As "ProjectItem" + + If Not $hRemove Then + $hRemove = Picture["icon:/small/remove"].Image + $hRemoveGray = $hRemove.Copy().Brightness(1).Colorize(Color.LightGray) + Endif + + ' If Not $hGradient Then + ' + ' $hGradient = New Image(128, 128) + ' + ' Paint.Begin($hGradient) + ' Paint.Brush = Paint.RadialGradient(0, 0, 64, 0, 0, [Color.Merge(Color.LightForeground, Color.TextBackground, 0.8), Color.TextBackground], [0.0, 1.0]) + ' Paint.Rectangle(0, 0, 128, 128) + ' Paint.Fill + ' Paint.End + ' + ' Endif + +End + + +Private Sub SetPath(sPath As String) + + $sPath = sPath + $hProjectInfo = New CProjectInfo(sPath) + $hIcon = Null + + $sToolTip = Replace($sPath, System.User.Home, "~") + $iIdealW = 0 + 'Me.H = Me.IdealHeight + Me.Refresh + +End + + +' Private Sub GetTitle() As String +' +' Dim sTitle As String +' Dim bSelected As Boolean +' +' bSelected = Me.Background = Color.SelectedBackground +' +' With $hProjectInfo +' sTitle = .Title +' If Not sTitle Then sTitle = .Name +' sTitle = "" & .Name & " " & .Version +' sTitle &= Subst("
      ", Hex$(If(bSelected, Color.SelectedForeground, Color.Gradient(Color.TextBackground, Color.TextForeground, 0.75)), 6)) & .Title +' If $bShowAuthors And If .Authors And If .Authors.Count Then +' If .Title Then sTitle &= " - " +' sTitle &= "" & If(.Authors.Count = 1, ("Author"), ("Authors")) & " : " & .Authors.Join(", ") & "" +' Endif +' sTitle &= "" +' If $bShowPath Then sTitle &= Subst("
      ", If(bSelected, "white", "gray")) & Replace($sPath, System.User.Home, "~") & "" +' End With +' +' Return sTitle +' +' End + +Public Sub DrawingArea_MouseMove() + + Dim DS As Integer = Desktop.Scale + Dim bInButton As Boolean + Dim bInRemove As Boolean + Dim sTooltip As String + + If Rect(DS, DS, ICON_SIZE, ICON_SIZE).Contains(Mouse.X, Mouse.Y) Then sTooltip = $sToolTip + If sTooltip <> $hDrawingArea.Tooltip Then $hDrawingArea.Tooltip = sTooltip + + If ShowButton Then bInButton = Rect(0, $hDrawingArea.H - DS * 4, $hDrawingArea.W, DS * 4).Contains(Mouse.X, Mouse.Y) + If bInButton <> $bInsideButton Then + $bInsideButton = bInButton + $hDrawingArea.Refresh + Endif + + If ShowRemove Then bInRemove = Rect($hDrawingArea.W - DS - $hRemove.W, DS, $hRemove.W, $hRemove.H).Contains(Mouse.X, Mouse.Y) + If bInRemove <> $bInsideRemove Then + $bInsideRemove = bInRemove + $hDrawingArea.Refresh + Endif + +End + + +Public Sub DrawingArea_Draw() + + Dim X, Y, W, H, HT As Integer + Dim XS, YS, WS, HS As Integer + Dim sText As String + Dim P As Integer + Dim bSmall As Boolean + Dim hScrollView As ScrollView + Dim WT As Integer + Dim iCol As Integer + Dim iBg As Integer + + If Not $hProjectInfo Then Return + + P = Desktop.Scale + bSmall = $hDrawingArea.H <= P * 12 + + X = 1 + Y = 1 + W = Paint.W - 1 + H = Paint.H - 1 + + If Me.Parent Is ScrollView Then + hScrollView = Me.Parent + If hScrollView.Arrangement = Arrange.Vertical And If hScrollView.ScrollH > hScrollView.ClientH Then + W -= P + Endif + Endif + + XS = X + YS = Y + WS = W + HS = H + + With $hProjectInfo + + If Not $hIcon Then + $hIcon = Project.StretchIcon(.GetIconPath(), ICON_SIZE) + Endif + + Paint.AntiAlias = False + Paint.Rectangle(X, Y, W - 1, H - 1) + + If $bSelected Or If $bHighlight Then + iBg = Color.Gradient(Color.LightBackground, Color.TextBackground) + Else + iBg = Color.TextBackground 'Color.Merge(Color.TextForeground, Color.TextBackground, 0.97) + Endif + Paint.Background = iBg + Paint.Fill(True) + + 'Paint.Brush = Paint.RadialGradient(X, Y, Desktop.Scale * 24, X, Y, [Color.Merge(Color.LightForeground, Color.TextBackground, 0.6), Color.Merge(Color.TextForeground, Color.TextBackground, 0.97)], [0.0, 1.0]) + 'Paint.Fill(True) + 'Paint.Brush = Null + 'Paint.DrawImage($hGradient, X, Y, W, W) + + + If $hDrawingArea.HasFocus Or If $bHighlight Then + + Paint.Background = Color.LightBackground + Paint.LineWidth = 2 + + Else + + Paint.Background = Color.LightForeground + + Endif + + Paint.Stroke + Paint.AntiAlias = True + + Paint.Save + + X += P + Y += P + W -= P * 2 + H -= P * 2 + + If ShowButton And If $bHighlight Then H -= P * 2 + + Paint.Rectangle(X, Y, W, H) + Paint.Clip + + Paint.DrawImage($hIcon, X, Y) + + iCol = Color.Foreground 'If($bSelected, Color.SelectedForeground, Color.Foreground) + + X += ICON_SIZE + P + + If Template Then + sText = .GetTranslatedTitle() + Else + sText = .Name + Endif + 'Paint.Font = Font["+1"] + Paint.Background = iCol 'Color.SetAlpha(iCol, 128) + 'Paint.DrawTextShadow(sText, X, Y, W, H, Align.TopLeft) + Paint.Font.Bold = True + Paint.DrawText(sText, X, Y, W, H, Align.TopLeft) + Paint.Font.Bold = False + + If Template Then + + X -= ICON_SIZE + P + + sText = .GetTranslatedDescription() + Paint.Font = Font["-1"] + + W = W - X - P * 2 + H = H - Y - ICON_SIZE + sText = Paint.TrimText(sText, W, H) + Paint.DrawText(sText, X, Y + ICON_SIZE + P, W, H) + + Else If bSmall Then + + WT = Paint.Font.TextWidth(sText & " ") + + Paint.Font.Bold = False + sText = .Version + 'Paint.Background = Color.Red + 'Paint.DrawTextShadow(sText, X + WT, Y, Paint.W, Paint.H, Align.TopLeft, 4) + Paint.DrawText(sText, X + WT, Y, Paint.W, Paint.H, Align.TopLeft) + + HT = Paint.Font.Height + + sText = .GetTranslatedDescription() + If Not sText Then sText = .GetTranslatedTitle() + Paint.Font = Font["-1"] + + W = Paint.W - X - P * 2 + H = Paint.H - Y - HT - P - 3 + Paint.DrawText(Paint.TrimText(sText, W, H), X, Y + HT + 3, W, H) + + Else + + Paint.Font.Bold = False + + sText = .Version + 'Paint.DrawTextShadow(sText, X + 1, Y + Paint.Font.Height + 1, Paint.W, Paint.H, Align.TopLeft, 4) + Paint.DrawText(sText, X, Y + Paint.Font.Height, Paint.W, Paint.H, Align.TopLeft) + + X -= ICON_SIZE + P + + sText = .GetTranslatedDescription() + If Not sText Then sText = .GetTranslatedTitle() + Paint.Font = Font["-1"] + + W = W - X - P * 2 + H = H - Y - ICON_SIZE + sText = Paint.TrimText(sText, W, H) + Paint.DrawText(sText, X, Y + ICON_SIZE + P, W, H) + + Endif + + End With + + Paint.Restore + + If ShowButton And If $bHighlight Then + X = 0 + Y = Paint.H - P * 4 + W = Paint.W + H = P * 4 + Paint.Font.Grade = -1 + If $bInsideButton Then + Paint.Background = Color.SelectedBackground + Paint.DrawTextShadow(("Open in another window") & "…", X + P, Y, W - P * 2, H, Align.Normal) + Else + Paint.Background = Color.LightForeground + Endif + Paint.DrawText(("Open in another window") & "…", X + P, Y, W - P * 2, H, Align.Normal) + Endif + + If ShowRemove And If $bHighlight Then + Paint.DrawImage(If($bInsideRemove, $hRemove, $hRemoveGray), Paint.W - $hRemove.W - P, P) + Endif + + If Not Me.Enabled Then Paint.FillRect(0, 0, Paint.W, Paint.H, Color.SetAlpha(Style.BackgroundOf($hDrawingArea), 64)) + + ' If Template And If $sPath = GetParent().Current Then + ' Paint.FillRect(0, 0, Paint.W, Paint.H, Color.SetAlpha(Color.SelectedBackground, 128)) + ' Endif + ' +End + +Public Sub DrawingArea_Enter() + + If $bCanHighlight And If Me.Enabled Then + 'If not $bHighlight Then + '$hDrawingArea.Background = Color.LightBackground + $bHighlight = True + $hDrawingArea.Refresh + 'Endif + Endif + +End + +Public Sub DrawingArea_Leave() + + If $bHighlight And If Me.Enabled Then + '$hDrawingArea.Background = Color.Default + $bHighlight = False + $hDrawingArea.Refresh + Endif + +End + +Public Sub DrawingArea_KeyPress() + + If Key.Code = Key.Space Then Raise Click + +End + +' Private Function Background_Read() As Integer +' +' Return Super.Background +' +' End +' +' Private Sub Background_Write(Value As Integer) +' +' Super.Background = Value +' $hDrawingArea.Background = Color.Default +' +' End + +Private Function ShowPath_Read() As Boolean + + Return $bShowPath + +End + +Private Sub ShowPath_Write(Value As Boolean) + + $bShowPath = Value + Me.Refresh + +End + +Private Function Path_Read() As String + + Return $sPath + +End + +Private Sub Path_Write(Value As String) + + SetPath(Value) + +End + +Private Function Highlight_Read() As Boolean + + Return $bCanHighlight + +End + +Private Sub Highlight_Write(Value As Boolean) + + $bCanHighlight = Value + $hDrawingArea.Mouse = If(Value, Mouse.Pointing, Mouse.Default) + +End + +Private Function Info_Read() As CProjectInfo + + Return $hProjectInfo + +End + +Public Sub DrawingArea_MouseUp() + + If Mouse.Left Then + If $bInsideButton Then + Raise ButtonClick + Else If $bInsideRemove Then + Raise RemoveClick + Stop Event + Else + Raise Click + Endif + $hDrawingArea.Refresh + Endif + +End + +Public Sub DrawingArea_DblClick() + + 'If Not Object.IsValid(Me) Then Return + If Mouse.Left Then Raise DblClick + +End + +Private Function ShowAuthors_Read() As Boolean + + Return $bShowAuthors + +End + +Private Sub ShowAuthors_Write(Value As Boolean) + + $bShowAuthors = Value + $hDrawingArea.Refresh + +End + +Public Sub Match(sFilter As String) As Boolean + + If Not sFilter Then Return True + With $hProjectInfo + If .Name Like sFilter Then Return True + If String.LCase(.GetTranslatedTitle()) Like sFilter Then Return True + If .Version Like sFilter Then Return True + If $bShowAuthors And If String.LCase(.Authors.Join(" ")) Like sFilter Then Return True + If String.LCase(Group) Like sFilter Then Return True + If String.LCase(.GetTranslatedDescription()) Like sFilter Then Return True + If .Components.Exist(sFilter) Then Return True + End With + +End + +Private Function Selected_Read() As Boolean + + Return $bSelected + +End + +Private Sub Selected_Write(Value As Boolean) + + $bSelected = Value + $hDrawingArea.Refresh + +End diff --git a/app/src/gambas3/.src/Save.module b/app/src/gambas3/.src/Save.module new file mode 100644 index 00000000..0d6d7e55 --- /dev/null +++ b/app/src/gambas3/.src/Save.module @@ -0,0 +1,62 @@ +' Gambas module file + +Public NewFile As Boolean + +Private $sPath As String +Private $bRename As Boolean + +Public Sub Begin(sPath As String, Optional bKeep As Boolean) + + $bRename = False + $sPath = sPath + + NewFile = Not Exist(sPath) + + Try Kill sPath & "~" + If Not NewFile Then + If bKeep Then + Copy sPath To sPath & "~" + Else + Move sPath To sPath & "~" + Endif + Endif + + $bRename = True + +End + +Public Sub End() + + Dim sForm As String + + VersionControl.UpdatePath($sPath) + Try Project.Tree.RefreshKey($sPath) + If File.Ext($sPath) = "class" Then + sForm = Project.Tree.FindForm(File.BaseName($sPath)) + If sForm Then Try Project.Tree.RefreshKey(sForm) + Endif + Try Project.Tree.SelectKey($sPath) + $sPath = "" + $bRename = False + +End + + +Public Function Error() As Boolean + + Dim sError As String + + sError = Error.Text & " (" & Error.Where & ")" + Debug sError + + If $bRename Then + Try Kill $sPath + Try Move $sPath & "~" To $sPath + Endif + + FMain.ShowError("" & ("Cannot save file !") & "\n\n" & sError, $sPath) + Try Save.End + Return True + +End + diff --git a/app/src/gambas3/.src/Search/CGrepResult.class b/app/src/gambas3/.src/Search/CGrepResult.class new file mode 100644 index 00000000..d5d24eaf --- /dev/null +++ b/app/src/gambas3/.src/Search/CGrepResult.class @@ -0,0 +1,6 @@ +' Gambas class file + +Public Path As String +Public Age As Integer +Public Command As String +Public Result As CSearchResult[] diff --git a/app/src/gambas3/.src/Search/CSearchResult.class b/app/src/gambas3/.src/Search/CSearchResult.class new file mode 100644 index 00000000..a889f027 --- /dev/null +++ b/app/src/gambas3/.src/Search/CSearchResult.class @@ -0,0 +1,47 @@ +' Gambas class file + +Public Path As String +Public (File) As String +Public (Line) As Integer +Public Pos As Integer +Public Column As Integer +Public Text As String +Public Bytes As Integer +Public Length As Integer +Public Dark As Boolean +Public Control As String +Public {Property} As String +Public (Highlight) As String +Public RichText As String +Public Location As String + +'Private $sWhere As String + +' Public Sub GetLocation() As String +' +' Dim hFile As Object +' Dim sPath As String +' +' sPath = Project.Dir &/ Path +' +' If Not Project.IsSourcePath(sPath) Then Return +' If $sWhere Then Return $sWhere +' +' $sWhere = "-" +' Try hFile = Project.LoadFile(sPath) +' If hFile Then +' If hFile Is FEditor Or If hFile Is FTextEditor Then +' $sWhere = hFile.GetProcAt({Line}) +' If Not $sWhere Then $sWhere = ("(Declarations)") +' Else If hFile Is FForm Then +' $sWhere = hFile.GetLocation({Line}) +' Endif +' Endif +' Return $sWhere +' +' Catch +' +' $sWhere = "?" +' Return $sWhere +' +' End diff --git a/app/src/gambas3/.src/Search/CSearchTask.class b/app/src/gambas3/.src/Search/CSearchTask.class new file mode 100644 index 00000000..e34ccadd --- /dev/null +++ b/app/src/gambas3/.src/Search/CSearchTask.class @@ -0,0 +1,260 @@ +' Gambas class file + +Inherits Task + +Public Search As String + +Public IgnoreCase As Boolean +Public WordsOnly As Boolean +Public RegularExpression As Boolean + +Public Where As String +Public Update As String[] + +Public Const ALL_FILES As String = "*" +Public Const SOURCE_FILES As String = "$" +Public Const DATA_FILES As String = "@" + +Private $aExt As String[] = ["jpg", "jpeg", "bmp", "gif", "png", "ico", "xpm", "tga", "gambas", "wav", "ogg", "mp3", "mp4", "avi", "webm"] + +Public Sub Main() + + Dim sDir As String + Dim sFile As String + Dim sPath As String + Dim sName As String + Dim sExt As String + Dim aFile As String[] + Dim aSort As String[] + + Application.Priority = 10 + + If Update Then + + sDir = "" + aFile = Update + + Else + + Select Case Where + + Case ALL_FILES, DATA_FILES + sDir = Project.Dir + + Case SOURCE_FILES + sDir = Project.SourceDir + + Case Else + sDir = File.Dir(Where) + aFile = [File.Name(Where)] + + End Select + + Endif + + If Not aFile Then + aFile = RDir(sDir).Sort(gb.Natural) + aSort = New String[] + For Each sPath In aFile + aSort.Add(File.Name(sPath)) + Next + aFile.SortUsing(aSort) + Endif + + For Each sFile In aFile + + If Right(sFile) = "~" Then Continue + + sPath = sDir &/ sFile + + sFile = Mid$(sPath, Len(Project.Dir) + 1) + If Left(sFile) = "/" Then sFile = Mid$(sFile, 2) + + If Left(sFile) = "." And If sFile Not Begins ".public/" Then + If Where = DATA_FILES Then Continue + If sFile Not Begins ".src/" Then Continue + Endif + + If IsDir(sPath) Then Continue + If InStr(sPath, "/.svn/") Then Continue + + sExt = LCase(File.Ext(sFile)) + If $aExt.Exist(sExt) Then Continue + + sName = File.Name(sPath) + If sName Begins "core." Then Continue + If sName Begins "vgcore." Then Continue + If sName Begins "callgrind.out." Then Continue + If sName Begins "cachegrind.out." Then Continue + + If Not Project.IsTextFile(sPath) Then Continue + + ' TODO: If bReplace And If Not Access(sPath) Then Continue + + Print "/" &/ Mid$(sPath, Len(Project.Dir) + 1) + + ' If sFile Begins ".src/" Then + ' FDebugInfo.SetSearchListInfo(sName) + ' Else + ' FDebugInfo.SetSearchListInfo(sFile) + ' Endif + + GrepFile(sPath) ', bReplace) + + 'Debug sName + Next + + +End + +Private Sub GrepQuote(sStr As String) As String + + Dim I As Integer + Dim sCar As String + Dim sResult As String + + For I = 1 To String.Len(sStr) + sCar = String.Mid$(sStr, I, 1) + If Len(sCar) > 1 Or If IsLetter(sCar) Or If IsDigit(sCar) Then + sResult &= sCar + Else + sResult &= "\\" & sCar + Endif + Next + + Return sResult + +End + +Private Sub GrepFile(sPath As String, Optional bUseReplaceString As Boolean) + + Dim sText As String + Dim aGrep As String[] + Dim sGrep As String + Dim sFind As String + Dim sTemp As String + ' Dim iAge As Integer + ' Dim hGrepResult As CGrepResult + Dim iPos As Integer + Dim sSearch As String + Dim hFile As Object + Dim sResult As String + Dim iFilePos As Integer + + hFile = Project.Files[sPath] + + If sPath Then + If Not hFile Or If Not hFile.IsModified() Then + sTemp = Project.GetUncompressedPath(sPath, True) + Endif + Endif + + If Not sTemp Then + Try sText = hFile.GetText() + If Error Then Return + sTemp = Temp$("grep") + File.Save(sTemp, sText) + Endif + + aGrep = ["grep", "-nobs"] + + If bUseReplaceString Then + ' aGrep.Add("-F") + ' aGrep.Add("--") + ' aGrep.Add(ReplaceString) + Else + If IgnoreCase Then aGrep.Add("-i") + If RegularExpression Then + aGrep.Add("-E") + Else If WordsOnly Then + aGrep.Add("-E") + Else + aGrep.Add("-F") + Endif + aGrep.Add("--") + + sSearch = Search + If WordsOnly Then sSearch = "(^|[^_$[:alnum:]])" & GrepQuote(Search) & "($|[^_$[:alnum:]])" + aGrep.Add(sSearch) + Endif + + aGrep.Add(sTemp) + + ' If sPath Then + ' hGrepResult = $cGrepCache[sPath] + ' + ' If hGrepResult Then + ' Try iAge = hFile.Age + ' If iAge = hGrepResult.Age Then + ' If aGrep.Join("\n") = hGrepResult.Command Then + ' Return hGrepResult.Result + ' Endif + ' Endif + ' Endif + ' Endif + + 'grep -nR -F -I -i -w -ob --exclude=*~ --exclude-dir=.svn -s -- "Date" * .src + + Exec aGrep To sGrep + + For Each sFind In Split(sGrep, "\n", "", True) + + If hFile Then + ' If hFile Is FOutput Then + ' hResult.Path = "" + ' hResult.File = "Console" + ' Else + 'hResult.Path = sPath + ''hResult.File = hFile.Name + 'Endif + Else + 'hResult.Path = sPath + ''hResult.File = If(Project.IsSourcePath(sPath), File.BaseName(sPath), File.Name(sPath)) + Endif + + 'hResult.Highlight = TextEditor.GetModeFromPath(sPath) + + iPos = InStr(sFind, ":") + If iPos = 0 Then Continue + + sResult = CStr(CInt(Left(sFind, iPos - 1))) + sFind = Mid$(sFind, iPos + 1) + + iPos = InStr(sFind, ":") + If iPos = 0 Then Continue + + iFilePos = CInt(Left(sFind, iPos - 1)) + sFind = Mid$(sFind, iPos + 1) + + If WordsOnly Then + If IgnoreCase Then + If String.LCase(sFind) Not Begins String.LCase(Search) Then iFilePos += String.Len(String.Left(sFind)) + Else + If sFind Not Begins Search Then iFilePos += String.Len(String.Left(sFind)) + Endif + sFind = Search + Endif + + sResult &= ":" & CStr(iFilePos) + + sResult &= ":" & CStr(Len(sFind)) & ":" & CStr(String.Len(sFind)) '& ":" & sFind + Print sResult + Flush + 'Sleep 0.005 + + Next + + ' If sPath Then + ' If hFile Then Try iAge = hFile.Age + ' hGrepResult = New CGrepResult + ' With hGrepResult + ' .Result = aResult.Copy() + ' .Age = iAge + ' .Path = sPath + ' .Command = aGrep.Join("\n") + ' End With + ' $cGrepCache[sPath] = hGrepResult + ' Endif + +End + diff --git a/app/src/gambas3/.src/Search/FSearch.class b/app/src/gambas3/.src/Search/FSearch.class new file mode 100644 index 00000000..1f37d7ad --- /dev/null +++ b/app/src/gambas3/.src/Search/FSearch.class @@ -0,0 +1,1543 @@ +' Gambas class file + +Public IgnoreCase As Boolean +Public RegularExpression As Boolean +Public IgnoreStrings As Boolean +Public IgnoreComments As Boolean +Public WordsOnly As Boolean +Public CurrentProcedure As Boolean +Public CurrentProcedureName As String +Public SearchString As String +Public ReplaceString As String +Public BrowseTimeStamp As Integer +Public OnlySource As Boolean +Public OnlyData As Boolean + +Private $hCurrent As Object +Private $sGrep As String +Private $bReplace As Boolean +'Private $aBrowse As New CSearchResult[] +Private $bCancel As Boolean + +Private $cGrepCache As New Collection +Private $cRefreshBrowse As New Collection +Private $hFont As Font +Private $CW As Float +Private $hStyle As TextHighlighterStyle[] + +Private gvwFind As GridView + +Private Const GO_FORWARD As Integer = 0 +Private Const GO_BACKWARD As Integer = 1 +Private Const DO_REPLACE As Integer = 2 +Private Const DO_ALL As Integer = 4 + +Private Enum SEARCH_STRING, SEARCH_REPLACE, SEARCH_AFTER_REPLACE, SEARCH_UPDATE + +Private $hTask As CSearchTask +Private $sTaskBuffer As String +Private $sTaskPath As String +Private $aResult As New CSearchResult[] +Private $iTaskIndex As Integer +Private $sTaskFullPath As String +Private $bTaskUpdate As Boolean + +Private $bReplaceAll As Boolean +Private $iReplaceFrom As Integer +Private $bIgnoreFileChange As Boolean +Private $nReplace As Integer +Private $bUseReplaceString As Boolean + +Public Sub _new() + + Me.Utility = Settings["/UseUtilityWindows", 1] + + gvwFind = FDebugInfo.GetSearchList() + Object.Attach(gvwFind, Me, "gvwFind") + + ReadConfig + +End + +Public Sub Form_Open() + + Settings.Read(Me) + + chkCaseSensitive.Value = Settings["/FSearch/CaseSensitive", False] + 'radCurrentProcedure.Value = Settings["/FSearch/CurrentProcedure", False] + chkHighlight.Value = Settings["/FSearch/Highlight", False] + chkIgnoreComments.Value = Settings["/FSearch/IgnoreComments", False] + chkIgnoreStrings.Value = Settings["/FSearch/IgnoreStrings", False] + chkRegularExpression.Value = Settings["/FSearch/RegularExpression", False] + chkWordsOnly.Value = Settings["/FSearch/WordsOnly", False] + 'radSourceFileOnly.Value = Settings["/FSearch/SourceOnly", False] + + gvwFind_Font + +End + +Public Sub Form_Close() + + Settings.Write(Me) + + Settings["/FSearch/CaseSensitive"] = CBool(chkCaseSensitive.Value) + 'Settings["/FSearch/CurrentProcedure"] = CBool(radCurrentProcedure.Value) + Settings["/FSearch/Highlight"] = CBool(chkHighlight.Value) + Settings["/FSearch/IgnoreComments"] = CBool(chkIgnoreComments.Value) + Settings["/FSearch/IgnoreStrings"] = CBool(chkIgnoreStrings.Value) + Settings["/FSearch/RegularExpression"] = CBool(chkRegularExpression.Value) + Settings["/FSearch/WordsOnly"] = CBool(chkWordsOnly.Value) + 'Settings["/FSearch/SourceOnly"] = CBool(radSourceFileOnly.Value) + +End + +Public Sub ReadConfig() + + Dim I As Integer + + Project.SetSmallFont(gvwFind) + $hFont = Font[Settings["/Editor/Font", Project.DEFAULT_FONT]] + While $hFont.Height > gvwFind.Font.Height + Dec $hFont.Size + If $hFont.Size < 6 Then Break + Wend + $CW = Paint._EstimateFixedFontCharWidth($hFont) + + $hStyle = MTheme.GetStyles() + For I = 0 To $aResult.Max + $aResult[I].RichText = "" + Next + + gvwFind.Refresh + +End + +Private Sub UpdateTitle() + + Dim sWhere As String + + ' If $hCurrent Is FOutput Then + ' sWhere = ("Console") + If $hCurrent Then + sWhere = $hCurrent.Title + Else + sWhere = ("Project") + Endif + + Me.Title = ("Search & Replace") & " - " & sWhere + +End + + +Public Sub Update(Optional bForce As Boolean) + + Dim bCode As Boolean + 'Dim hWindow As Window + Dim bAllProject As Boolean + + $hCurrent = Project.ActiveForm + + If Not Me.Visible And If Not bForce Then Return + + ' Try hWindow = Application.ActiveControl.Window + ' If hWindow = Me Then Return + ' $hCurrent = hWindow + + If $hCurrent Then + If $hCurrent Is FEditor Or If $hCurrent Is FTextEditor Then + bCode = $hCurrent.GetEditor().Highlight + Endif + radCurrentProcedure.Enabled = bCode + radCurrentFile.Enabled = True + 'radCurrentFile.Value = True + Else + bAllProject = True + radCurrentProcedure.Enabled = False + radCurrentFile.Enabled = False + Endif + + UpdateReplaceState + + If radCurrentProcedure.Value And If Not radCurrentProcedure.Enabled Then + radCurrentFile.Value = True + Endif + + If radCurrentFile.Value And If Not radCurrentFile.Enabled Then + radEverywhere.Value = True + Endif + + If Project.IsFake() Then + radSourceFileOnly.Enabled = False + radDataFileOnly.Enabled = False + radEverywhere.Enabled = False + If radSourceFileOnly.Value Or If radEverywhere.Value Or If radDataFileOnly.Value Then radCurrentFile.Value = True + Endif + + UpdateTitle + +End + +Public Sub Form_Show() + + Update() + +End + +Public Sub Form_Activate() + + Update() + RefreshBrowse() + +End + + +Public Sub cmbSearch_Activate() + + If btnNext.Visible Then + btnNext.Value = True + Else + btnBrowse.Value = True + Endif + +End + +Public Sub cmbReplace_Activate() + + If btnReplace.Visible Then + btnReplace.Value = True + Else If btnReplaceAll.Visible Then + btnReplaceAll.Value = True + Endif + +End + +Private Sub ShowMessage(sMsg As String, hCtrl As Control) + + If Me.Visible Then + Balloon.Info(sMsg, hCtrl) + Else + Project.SetMessage(sMsg) + Endif + +End + +Private Sub GrepQuote(sStr As String) As String + + Dim I As Integer + Dim sCar As String + Dim sResult As String + + For I = 1 To String.Len(sStr) + sCar = String.Mid$(sStr, I, 1) + If Len(sCar) > 1 Or If IsLetter(sCar) Or If IsDigit(sCar) Then + sResult &= sCar + Else + sResult &= "\\" & sCar + Endif + Next + + Return sResult + +End + +Private Sub GrepFile(hFile As Object, Optional sPath As String, Optional bUseReplaceString As Boolean) As CSearchResult[] + + Dim sText As String + Dim aGrep As String[] + Dim aResult As New CSearchResult[] + Dim sFind As String + Dim hResult As CSearchResult + Dim sTemp As String + Dim iAge As Integer + Dim hGrepResult As CGrepResult + Dim iPos As Integer + Dim sSearch As String + + If sPath Then + If Not hFile Or If Not hFile.IsModified() Then + sTemp = sPath + Endif + Endif + + If Not sTemp Then + Try sText = hFile.GetText() + If Error Then Return aResult + sTemp = Temp$("grep") + File.Save(sTemp, sText) + Endif + + aGrep = ["grep", "-nobs"] + + If bUseReplaceString Then + aGrep.Add("-F") + aGrep.Add("--") + aGrep.Add(ReplaceString) + Else + If IgnoreCase Then aGrep.Add("-i") + If RegularExpression Then + aGrep.Add("-E") + Else If WordsOnly Then + aGrep.Add("-E") + Else + aGrep.Add("-F") + Endif + aGrep.Add("--") + + sSearch = SearchString + If WordsOnly Then sSearch = "(^|[^_$[:alnum:]])" & GrepQuote(SearchString) & "($|[^_$[:alnum:]])" + aGrep.Add(sSearch) + Endif + + aGrep.Add(sTemp) + + If sPath Then + hGrepResult = $cGrepCache[sPath] + + If hGrepResult Then + Try iAge = hFile.Age + If iAge = hGrepResult.Age Then + If aGrep.Join("\n") = hGrepResult.Command Then + Return hGrepResult.Result + Endif + Endif + Endif + Endif + + 'grep -nR -F -I -i -w -ob --exclude=*~ --exclude-dir=.svn -s -- "Date" * .src + + Exec aGrep To $sGrep 'For Read Write As "Grep" + ' Print #hProcess, sText; + ' Close #hProcess + ' Repeat + ' Wait 0.01 + ' Until hProcess.State <> Process.Running + + For Each sFind In Split($sGrep, "\n", "", True) + + hResult = New CSearchResult + + If hFile Then + ' If hFile Is FOutput Then + ' hResult.Path = "" + ' hResult.File = "Console" + ' Else + hResult.Path = sPath + hResult.File = hFile.Name + 'Endif + Else + hResult.Path = sPath + hResult.File = If(Project.IsSourcePath(sPath), File.BaseName(sPath), File.Name(sPath)) + Endif + + hResult.Highlight = TextEditor.GetModeFromPath(sPath) + + iPos = InStr(sFind, ":") + If iPos = 0 Then Continue + + hResult.Line = CInt(Left(sFind, iPos - 1)) + sFind = Mid$(sFind, iPos + 1) + + iPos = InStr(sFind, ":") + If iPos = 0 Then Continue + + hResult.Pos = CInt(Left(sFind, iPos - 1)) + sFind = Mid$(sFind, iPos + 1) + + If WordsOnly Then + If IgnoreCase Then + If String.LCase(sFind) Not Begins String.LCase(SearchString) Then hResult.Pos += String.Len(String.Left(sFind)) + Else + If sFind Not Begins SearchString Then hResult.Pos += String.Len(String.Left(sFind)) + Endif + sFind = SearchString + Endif + + hResult.Bytes = Len(sFind) + hResult.Length = String.Len(sFind) + + aResult.Add(hResult) + + Next + + If sPath Then + If hFile Then Try iAge = hFile.Age + hGrepResult = New CGrepResult + With hGrepResult + .Result = aResult.Copy() + .Age = iAge + .Path = sPath + .Command = aGrep.Join("\n") + End With + $cGrepCache[sPath] = hGrepResult + Endif + + Return aResult + +End + +Private Sub InitSearch() As Boolean + + SearchString = cmbSearch.Text + ReplaceString = cmbReplace.Text + + Project.StoreCombo(cmbSearch) + Project.StoreCombo(cmbReplace) + + IgnoreCase = Not chkCaseSensitive.Value + IgnoreStrings = chkIgnoreStrings.Value + IgnoreComments = chkIgnoreComments.Value + RegularExpression = chkRegularExpression.Value + WordsOnly = chkWordsOnly.Value + CurrentProcedure = radCurrentProcedure.Value + OnlySource = radSourceFileOnly.Value + OnlyData = radDataFileOnly.Value + + If Not SearchString Then Return True + +End + +Private Sub DoReplace(aResult As CSearchResult[], iInd As Integer, sReplace As String) + + Dim iAdd As Integer + + iAdd = Len(sReplace) - aResult[iInd].Bytes + + aResult.Remove(iInd) + While iInd < aResult.Count + aResult[iInd].Pos += iAdd + Inc iInd + Wend + +End + +Private Sub Run(iAction As Integer) + + Dim aResult As CSearchResult[] + Dim iCurrentPos, iPos, iInd As Integer + Dim iTry As Integer + Dim nReplace As Integer + Dim hEditor As FEditor + Dim hTextEditor As TextEditor + Dim iLastPos As Integer + + If InitSearch() Then Return + ResetBrowse + + If CurrentProcedure Then + If $hCurrent Is FEditor Then + hEditor = $hCurrent + CurrentProcedureName = hEditor.GetProcAt(hEditor.GetEditor().Line) + Endif + Endif + + Try hTextEditor = $hCurrent.GetEditor() + If Error Then Return + + aResult = GrepFile($hCurrent) + + If iAction And DO_REPLACE And If iAction And DO_ALL Then + + Try hTextEditor.Begin + While aResult.Count + If $hCurrent.SetPosition(aResult[0], True) Then + aResult.Remove(0) + Else + $hCurrent.SetPosition(aResult[0], False) + If Not $hCurrent.Replace(ReplaceString) Then + Inc nReplace + DoReplace(aResult, 0, ReplaceString) + Endif + Endif + Wend + Try hTextEditor.End + + Else + + iCurrentPos = $hCurrent.GetPosition() + iLastPos = iCurrentPos + + If Not $hCurrent.GetSelection() Or If iAction And DO_REPLACE Then + If iAction And GO_BACKWARD Then + Inc iCurrentPos + Else + Dec iCurrentPos + Endif + Endif + + If aResult.Count Then + + For iTry = 1 To aResult.Count + + If iAction And GO_BACKWARD Then + + For iInd = aResult.Max To 0 Step -1 + iPos = aResult[iInd].Pos + If iPos < iCurrentPos Then Break + Next + + If iPos >= iCurrentPos Then + iInd = aResult.Max + iPos = aResult[iInd].Pos + Endif + + Else + + For iInd = 0 To aResult.Max + iPos = aResult[iInd].Pos + If iPos > iCurrentPos Then Break + Next + + If iPos <= iCurrentPos Then + iInd = 0 + iPos = aResult[iInd].Pos + Endif + + Endif + + If $hCurrent.SetPosition(aResult[iInd], True) Then Goto FIND_NEXT + $hCurrent.SetPosition(aResult[iInd], False) + + If iAction And DO_REPLACE And If iPos = iLastPos Then + If Not $hCurrent.Replace(ReplaceString) Then + DoReplace(aResult, iInd, ReplaceString) + Endif + iAction = iAction And Not DO_REPLACE + Else + Return + Endif + + FIND_NEXT: + + iCurrentPos = iPos + + Next + + Endif + + Endif + + If iAction And DO_REPLACE And If iAction And DO_ALL Then + If nReplace = 0 Then + ShowMessage(("Search string cannot be found."), cmbReplace) + Else If nReplace = 1 Then + ShowMessage(("Search string replaced once."), cmbReplace) + Else + ShowMessage(Subst(("Search string replaced &1 times."), nReplace), cmbReplace) + Endif + Else + ShowMessage(("Search string cannot be found."), cmbSearch) + Endif + +End + +' Private Sub UpdateSpan(iRow As Integer) +' +' Dim hResult As CSearchResult +' Dim iLastFile, iLastLine As Integer +' +' If iRow >= $aBrowse.Count Then Return +' +' iLastFile = iRow +' iLastLine = iRow +' +' gvwFind[iRow, 0].RowSpan = 1 +' gvwFind[iRow, 1].RowSpan = 1 +' +' Inc iRow +' +' While iRow < $aBrowse.Count +' +' hResult = $aBrowse[iRow] +' +' If hResult.File <> $aBrowse[iLastFile].File Then +' iLastFile = iRow +' iLastLine = iRow +' Else If hResult.Line <> $aBrowse[iLastLine].Line Then +' iLastLine = iRow +' Endif +' gvwFind[iLastFile, 0].RowSpan = iRow - iLastFile + 1 +' gvwFind[iLastLine, 1].RowSpan = iRow - iLastLine + 1 +' +' Inc iRow +' +' Wend +' +' End + + +Public Sub AddFound(hResult As CSearchResult, Optional iIndex As Integer = -1) + + If iIndex < 0 Then + iIndex = $aResult.Count + $aResult.Add(hResult) + Else + $aResult.Add(hResult, iIndex) + Endif + + If iIndex > 0 Then + If hResult.File = $aResult[iIndex - 1].File Then + hResult.Dark = $aResult[iIndex - 1].Dark + Else + hResult.Dark = Not $aResult[iIndex - 1].Dark + Endif + Endif + + ' iInd = iIndex + ' While iInd > 0 + ' If $aBrowse[iInd - 1].File <> hResult.File Then Break + ' Dec iInd + ' Wend + ' gvwFind[iInd, 0].RowSpan = iIndex - iInd + 1 + ' + ' iInd = iIndex + ' While iInd > 0 + ' If $aBrowse[iInd - 1].File <> hResult.File Then Break + ' If $aBrowse[iInd - 1].Line <> hResult.Line Then Break + ' Dec iInd + ' Wend + ' gvwFind[iInd, 1].RowSpan = iIndex - iInd + 1 + +End + +Private Sub FindPathInBrowseResult(sPath As String) As Integer + + Dim iInd As Integer + + For iInd = 0 To $aResult.Max + If $aResult[iInd].Path = sPath Then + Repeat + $aResult.Remove(iInd) + If iInd >= $aResult.Count Then Break + Until $aResult[iInd].Path <> sPath + Return iInd + Endif + Next + + Return -1 + +End + +Private Sub UpdateSearchList() + + Dim sMsg As String + + gvwFind.Rows.Count = $aResult.Count + gvwFind.Refresh + + If $aResult.Count = 0 Then + sMsg = "" + Else If $aResult.Count = 1 Then + sMsg = ("One match") + Else + sMsg = Subst(("&1 matches"), $aResult.Count) + Endif + + If $nReplace Then + If sMsg Then sMsg &= " ‒ " + If $nReplace = 1 Then + sMsg &= ("One replacement") + Else + sMsg &= Subst(("&1 replacements"), $nReplace) + Endif + Endif + + FDebugInfo.SetSearchListInfo(sMsg) + +End + +' Private Sub BrowseFile(sPath As String, bReplace As Boolean, Optional iIndex As Integer = -1, Optional bRefresh As Boolean) +' +' Dim hFile As Object +' Dim aResult As CSearchResult[] +' Dim iInd As Integer +' Dim hResult As CSearchResult +' Dim iStart As Integer +' +' If iIndex < 0 Then +' iStart = $aResult.Count +' Else +' iStart = iIndex +' Endif +' +' hFile = Project.Files[sPath] +' aResult = GrepFile(hFile, sPath) +' If aResult.Count = 0 Then Return +' +' Try hFile = Project.LoadFile(sPath) +' If Not hFile Then Return +' +' If bReplace Then +' +' For iInd = aResult.Max DownTo 0 +' hResult = aResult[iInd] +' If hFile.SetPosition(hResult) Then Continue +' hFile.Replace(ReplaceString) +' Next +' +' aResult = GrepFile(hFile, sPath, True) +' +' Endif +' +' For iInd = 0 To aResult.Max +' hResult = aResult[iInd] +' If Not hFile.SetPosition(hResult, True) Then +' hResult.Path = sPath +' AddFound(hResult, iIndex) +' If bRefresh Then +' If iIndex >= 0 Then gvwFind.Rows[iIndex].Refresh +' Endif +' If iIndex >= 0 Then Inc iIndex +' Endif +' Next +' +' UpdateSearchList +' +' End + +Public Sub ResetBrowse(Optional bKeepResult As Boolean) + + If $hTask Then $hTask.Stop() + timFillList.Stop + + If bKeepResult Then Return + + $bReplaceAll = False + $bUseReplaceString = False + 'gvwFind.Rows.Count = 0 + gvwFind.Clear + gvwFind.Rows.Height = Max(gvwFind.Font.Height, $hFont.Height) + 4 + $aResult.Clear + ClearCache + UpdateSearchList + +End + + +' Private Sub Browse(Optional bReplace As Boolean, Optional bAgain As Boolean) +' +' Dim sDir As String +' Dim sFile As String +' Dim sPath As String +' Dim sName As String +' Dim sExt As String +' Dim fTime As Float +' +' If Not bAgain Then +' If InitSearch() Then Return +' Else +' If Not SearchString Then Return +' Endif +' 'OnlySource = bOnlySource +' +' InBrowse = True +' +' CurrentProcedure = False +' BrowseTimeStamp = Project.TimeStamp +' +' FDebugInfo.ShowSearchList +' +' Inc Application.Busy +' FDebugInfo.EnableGUI(False) +' 'tabSearch.Enabled = False +' +' 'btnClose.Text = ("Cancel") +' $bCancel = False +' +' ResetBrowse +' +' Inc FMain.NoMessage +' +' If OnlySource Then +' sDir = Project.Dir &/ ".src" +' Else +' sDir = Project.Dir +' Endif +' +' fTime = Timer +' +' For Each sFile In RDir(sDir).Sort() +' +' If Left(sFile) = "." And If sFile Not Begins ".public/" Then +' If OnlyData Then Continue +' If sFile Not Begins ".src/" Then Continue +' Endif +' +' If Right(sFile) = "~" Then Continue +' +' sPath = sDir &/ sFile +' +' If IsDir(sPath) Then Continue +' If InStr(sPath, "/.svn/") Then Continue +' +' sExt = UCase(File.Ext(sFile)) +' If $aExt.Exist(sExt) Then Continue +' +' sName = File.Name(sPath) +' If sName Begins "core." Then Continue +' If sName Begins "vgcore." Then Continue +' If sName Begins "callgrind.out." Then Continue +' If sName Begins "cachegrind.out." Then Continue +' +' If Not Project.IsTextFile(sPath) Then Continue +' +' If bReplace And If Not Access(sPath) Then Continue +' +' If sFile Begins ".src/" Then +' FDebugInfo.SetSearchListInfo(sName) +' Else +' FDebugInfo.SetSearchListInfo(sFile) +' Endif +' +' BrowseFile(sPath, bReplace) +' If (Timer - fTime) > 0.2 Then +' fTime = Timer +' Wait 0.01 +' Endif +' If $bCancel Then Break +' +' 'Debug sName +' Next +' +' gvwFind.Columns[0].Width = -1 +' gvwFind.Columns[1].Width = -1 +' +' If bReplace Then +' SearchString = ReplaceString +' IgnoreCase = False +' RegularExpression = False +' WordsOnly = False +' Endif +' +' Finally +' +' Dec FMain.NoMessage +' +' UpdateSearchList +' +' 'lblBrowse.Hide +' FDebugInfo.EnableGUI(True) +' 'btnClose.Text = ("Close") +' Dec Application.Busy +' +' InBrowse = False +' +' End + +Public Sub btnNext_Click() + + Run(GO_FORWARD) + +End + +Public Sub btnPrevious_Click() + + Run(GO_BACKWARD) + +End + +Public Sub btnClose_Click() + + Me.Close + +End + +Public Sub Cancel() + + $bCancel = True + +End + + +Public Sub FindNext() + + Update(True) + Run(GO_FORWARD) + +End + +Public Sub FindPrevious() + + Update(True) + Run(GO_BACKWARD) + +End + +Public Sub FindProject(sText As String) + + 'WakeUp(False) + cmbSearch.Text = sText + radEverywhere.Value = True + Search(SEARCH_STRING) + +End + +Public Sub BrowseAgain() + + Search(SEARCH_STRING) + +End + + +' Public Sub UpdateSearchString(sText As String) +' +' If sText <> cmbSearch.Text Then cmbSearch.Text = sText +' +' End + +Private Sub ShowString() + + Dim hForm As Object + Dim bIgnoreCase As Boolean = chkCaseSensitive.Value = False + Dim bWordOnly As Boolean = chkWordsOnly.Value + Dim sStr As String + + If chkHighlight.Value And If Me.Visible And If chkRegularExpression.Value = False Then sStr = cmbSearch.Text + + For Each hForm In Project.Files + Try hForm.OnShowString(sStr, bIgnoreCase, bWordOnly) + Next + +End + +Public Sub cmbSearch_Change() + + 'If Not cmbSearch.Text Then Stop + 'FMain.UpdateSearchString(cmbSearch.Text) + ShowString + +End + + +Public Sub OnNewForm(hForm As Object) + + Dim sStr As String + + If chkHighlight.Value And If Me.Visible And If chkRegularExpression.Value = False Then sStr = cmbSearch.Text + + Try hForm.OnShowString(sStr, chkCaseSensitive.Value = False, chkWordsOnly.Value) + +End + +Public Sub chkCaseSensitive_Click() + + ShowString + +End + +Public Sub chkHighlight_Click() + + ShowString + +End + + +Public Sub btnReplace_Click() + + Run(GO_FORWARD + DO_REPLACE) + +End + +Public Sub btnReplaceAll_Click() + + If Message.Question(("Do you really want to replace every string?"), ("Replace"), ("Cancel")) <> 1 Then Return + + If btnBrowse.Visible Then + Search(SEARCH_REPLACE) + Else + Run(GO_FORWARD + DO_REPLACE + DO_ALL) + Endif + +End + +Public Sub WakeUp(bReplace As Boolean, Optional bKeepSearchIn As Boolean) + + Dim sFind As String + + $bReplace = bReplace + Me.Show + + If Not bKeepSearchIn Then radCurrentFile.Value = True + Update() + + If Not $hCurrent Is FForm Then + Try sFind = $hCurrent.GetSelection() + Endif + + If $bReplace And If sFind Then + cmbReplace.SelectAll + cmbReplace.SetFocus + Else + cmbSearch.SelectAll + cmbSearch.SetFocus + Endif + + If sFind Then + cmbSearch.Text = sFind + cmbSearch.SelectAll + Endif + + ShowString + +End + +Public Sub Form_Hide() + + If Not FMain.Enabled Then $bCancel = True + ShowString + +End + +Public Sub btnBrowse_Click() + + 'Browse(False) + + Search(SEARCH_STRING) + +End + +Public Sub gvwFind_Font() + + gvwFind.Rows.Height = Max(gvwFind.Font.Height, $hFont.Height) + 4 + gvwFind.Columns[0].Width = -1 + gvwFind.Columns[1].Width = -1 + gvwFind.Columns[0].Width = Max(gvwFind.Columns[0].Width, Desktop.Scale * 20) + gvwFind.Columns[1].Width = Max(gvwFind.Columns[1].Width, Desktop.Scale * 20) + gvwFind.Refresh + +End + +Public Sub gvwFind_Draw(X As Integer, Y As Integer, (Width) As Integer, Height As Integer, Row As Integer, Column As Integer) + + Dim hResult As CSearchResult + Dim sText As String + Dim iCol As Integer + Dim XX As Integer + Dim WW As Integer + + If Column <> 4 Then Return + + hResult = $aResult[Row] + + sText = hResult.Text + iCol = hResult.Column + + Paint.Font = $hFont + + X += Desktop.Scale \ 2 + + If hResult.Highlight And Len(sText) < 1024 Then + + If $CW Then + XX = $CW * iCol + WW = $CW * hResult.Length + X -= Max(0, XX - $CW * 40) + Else + XX = $hFont.TextWidth(String.Left(sText, iCol)) + WW = $hFont.TextWidth(String.Left(sText, iCol + hResult.Length)) - XX + X -= Max(0, XX - $hFont.TextWidth("0") * 40) + Endif + + Paint.FillRect(X + XX, Y, WW, Height, $hStyle[Highlight.Highlight].Color) + TextHighlighter[hResult.Highlight].Paint(sText, X, Y, $hStyle) + + Else + + If iCol > 40 Then + sText = String.Mid$(sText, iCol - 40) + iCol = 41 + Endif + + If $CW Then + XX = $CW * iCol + WW = $CW * hResult.Length + Else + XX = $hFont.TextWidth(String.Left(sText, iCol)) + WW = $hFont.TextWidth(String.Left(sText, iCol + hResult.Length)) - XX + Endif + + Paint.FillRect(X + XX, Y, WW, Height, $hStyle[Highlight.Highlight].Color) + + Paint.Background = $hStyle[Highlight.Normal].Color + Paint.DrawText(sText, X, Y + $hFont.Ascent) + + Endif + + ' If $CW And If hResult.Highlight And If iLen < 1024 Then + ' + ' sText = hResult.RichText + ' + ' If Not sText Then + ' sText = TextHighlighter[TextEditor.GetModeFromPath(hResult.Path)].ToRichText(hResult.Text, $hStyle) + ' hResult.RichText = sText + ' Endif + ' + ' bRichText = True + ' + ' Endif + ' + ' Paint.Font = $hFont + ' + ' ' If bRichText Then + ' ' If iCol >= 40 Then + ' ' X -= (iCol - 40) * $CW + ' ' Endif + ' ' Else + ' If iCol >= 40 Then + ' sText = String.Mid$(sText, iCol - 39) + ' iCol = 40 + ' Endif + ' 'Endif + ' + ' If System.RightToLeft Then + ' X -= -1000000 + ' Width += 1000000 + ' Width -= Desktop.Scale \ 2 + ' Else + ' X += Desktop.Scale \ 2 + ' Width = 1000000 + ' If $CW Then + ' XX = X + $CW * iCol '$hFont.TextWidth(String.Left(sText, iCol)) + ' WW = $CW * hResult.Length '$hFont.TextWidth(String.Mid$(sText, iCol + 1, hResult.Length)) + ' Else + ' XX = X + $hFont.TextWidth(String.Left(sText, iCol)) + ' WW = $hFont.TextWidth(String.Mid$(sText, iCol + 1, hResult.Length)) + ' Endif + ' Endif + ' + ' Paint.FillRect(XX, Y, WW, Height, $hStyle[Highlight.Highlight].Color) + ' + ' Paint.Background = $hStyle[Highlight.Normal].Color + ' + ' If bRichText Then + ' Paint.DrawRichText(sText, X, Y, Width, Height, Align.Normal) + ' Else + ' Paint.DrawText(sText, X, Y, Width, Height, Align.Normal) + ' Endif + +End + + +Public Sub gvwFind_Data(Row As Integer, Column As Integer) + + Dim hResult As CSearchResult + Dim iCol As Integer + + If Row > $aResult.Max Then Return + + With gvwFind.Data + + hResult = $aResult[Row] + + Select Case Column + Case 0 + .Text = hResult.File + .Alignment = Align.Normal + .Picture = Project.GetFileIcon(Project.Dir &/ hResult.Path, 16) + Case 1 + .Text = hResult.Location + .Alignment = Align.Normal + Case 2 + .Text = CStr(hResult.Line) & " " + .Alignment = Align.Right + Case 3 + .Text = CStr(hResult.Column + 1) & " " + .Alignment = Align.Right + End Select + + If Column = 4 Then + iCol = $hStyle[Highlight.Background].Color + 'If hResult.Dark Then iCol = Color.Merge(iCol, $hStyle[Highlight.Normal].Color, 0.05) + .Background = iCol + Else + If hResult.Dark Then .Background = Color.Merge(Color.TextBackground, Color.TextForeground, 0.05) + Endif + + End With + +End + +Public Sub gvwFind_Click() + + gvwFind_Select + +End + + +Public Sub gvwFind_Select() + + Dim hFind As CSearchResult + Dim hForm As Object + + If $aResult.Count = 0 Then Return + If gvwFind.Row < 0 Then Return + If Not gvwFind.Rows[gvwFind.Row].Selected Then Return + + hFind = $aResult[gvwFind.Row] + + Try hForm = Project.OpenFile(Project.Dir &/ hFind.Path) + If Not hForm Then Return + + Project.Activate(hForm) + hForm.SetPosition(hFind, False) + + gvwFind.ScrollX = 0 + + Me.Hide + +End + +Public Sub Form_KeyPress() + + If Key.Code = Key.Escape Then + If IsSearching() Then + Cancel + Else + Me.Close + Endif + Else If Key.Code = Key.F3 Then + btnNext.Value = True + Endif + +End + +Private Sub ClearCache() + + $cGrepCache.Clear + $cRefreshBrowse.Clear + timRefresh.Stop + +End + +Public Sub OnProjectChange() + + ClearCache + gvwFind.Rows.Count = 0 + gvwFind.Hide + $aResult.Clear + Update(True) + +End + +Public Sub OnFileChange(sPath As String) + + 'If Not $cGrepCache.Exist(sPath) Then Return + If $bIgnoreFileChange Then Return + 'Debug sPath + $cRefreshBrowse[sPath] = True + timRefresh.Restart + +End + +Public Sub RefreshBrowse() + + Dim sPath As String + Dim aPath As String[] + + If Not FDebugInfo.IsSearchListVisible() Then Return + If $cRefreshBrowse.Count = 0 Then Return + If IsSearching() Then Return + + Object.Lock(gvwFind) + + aPath = New String[] + For Each $cRefreshBrowse + sPath = $cRefreshBrowse.Key + $cGrepCache[sPath] = Null + aPath.Add(sPath) + Next + + If aPath.Count Then Search(SEARCH_UPDATE, aPath) + + $cRefreshBrowse.Clear + Object.Unlock(gvwFind) + gvwFind.Refresh + gvwFind.ScrollX = 0 + timRefresh.Stop + BrowseTimeStamp = Project.TimeStamp + UpdateSearchList + +Catch + + Debug Error.Text + Error Error.Backtrace.Join("\n") + +End + +Public Sub timRefresh_Timer() + + RefreshBrowse + +End + +Public Sub UpdateReplaceState() + + Dim bEnable As Boolean + + If radEverywhere.Value Or If radSourceFileOnly.Value Or If radDataFileOnly.Value Then + + bEnable = Not Project.Running + + btnReplaceAll.Enabled = bEnable + cmbReplace.Enabled = bEnable + + Else + + bEnable = Not Project.Running + If $hCurrent And If $hCurrent.ReadOnly Then bEnable = False + + btnReplace.Enabled = bEnable + btnReplaceAll.Enabled = bEnable + cmbReplace.Enabled = bEnable + + Endif + +End + +Public Sub OnProjectDebug() + + UpdateReplaceState + +End + +Public Sub radSearch_Click() + + btnBrowse.Visible = radEverywhere.Value Or radSourceFileOnly.Value Or radDataFileOnly.Value Or radCurrentFile.Value + btnReplace.Visible = Not (radEverywhere.Value Or radSourceFileOnly.Value Or radDataFileOnly.Value) + btnNext.Visible = btnReplace.Visible + btnPrevious.Visible = btnReplace.Visible + + UpdateReplaceState + + cmbSearch.SelectAll + cmbSearch.SetFocus + +End + +' Public Sub cmbSearch_KeyPress() +' +' If Key.Code = Key.Down Then +' Try cmbSearch.Text = cmbSearch[cmbSearch.Find(cmbSearch.Text) - 1].Text +' Stop Event +' Else If Key.Code = Key.Up Then +' Try cmbSearch.Text = cmbSearch[cmbSearch.Find(cmbSearch.Text) + 1].Text +' Stop Event +' Endif +' +' End + +Public Sub chkWordsOnly_Click() + + ShowString + +End + +Public Sub chkRegularExpression_Click() + + ShowString + +End + +Public Sub GetHighlightStyle() As TextHighlighterStyle[] + + Return $hStyle + +End + +Public Sub IsSearching() As Boolean + + Return timFillList.Enabled + +End + +Public Sub SearchTask_Read(Data As String) + + $sTaskBuffer &= Data + timFillList.Start + +End + +Public Sub timFillList_Timer() + + Dim sLine As String + Dim hResult As CSearchResult + Dim aResult As String[] + Dim hFile As Object + Dim fTimer As Float + Dim iPos As Integer + Dim bUndo As Boolean + Dim hNewFile As Object + + fTimer = Timer + + $bIgnoreFileChange = True + + While (Timer - fTimer) < 0.02 + + If $iReplaceFrom > 0 Then + + Dec $iReplaceFrom + hResult = $aResult[$iReplaceFrom] + + hNewFile = Project.LoadFile(Project.Dir &/ hResult.Path) + If hNewFile <> hFile Then + If bUndo Then + Try hFile.GetEditor().End + bUndo = False + Endif + hFile = hNewFile + Endif + + If Not hFile Then Continue + If hFile.SetPosition(hResult) Then Continue + + If Not bUndo Then + Try hFile.GetEditor().Begin + bUndo = True + Endif + + If Not hFile.Replace(ReplaceString) Then + hResult.Text = String.Left(hResult.Text, hResult.Column) & ReplaceString & String.Mid(hResult.Text, hResult.Column + hResult.Length + 1) + hResult.Length = String.Len(ReplaceString) + hResult.Bytes = Len(ReplaceString) + Inc $nReplace + Endif + + Continue + + Endif + + iPos = InStr($sTaskBuffer, "\n") + If iPos = 0 Then Break + sLine = Left($sTaskBuffer, iPos - 1) + $sTaskBuffer = Mid$($sTaskBuffer, iPos + 1) + + If sLine Begins "/" Then + + $sTaskPath = Mid$(sLine, 2) + $sTaskFullPath = Project.Dir &/ sLine + If $bTaskUpdate Then + $iTaskIndex = FindPathInBrowseResult($sTaskPath) + Else + $iTaskIndex = -1 + Endif + hFile = Null + + Else + + If Not hFile Then hFile = Project.LoadFile($sTaskFullPath) + If Not hFile Then Continue + + hResult = New CSearchResult + aResult = Split(sLine, ":") + hResult.Path = $sTaskPath + hResult.File = hFile.Name + hResult.Line = CInt(aResult[0]) + hResult.Pos = CInt(aResult[1]) + hResult.Bytes = CInt(aResult[2]) + hResult.Length = CInt(aResult[3]) + + If hFile.SetPosition(hResult, True) Then Continue + + hResult.Highlight = TextEditor.GetModeFromPath($sTaskFullPath) + + AddFound(hResult, $iTaskIndex) + If $iTaskIndex >= 0 Then Inc $iTaskIndex + + 'FOutput.Insert(hResult.File & " " & hResult.Line & " " & hResult.Column & "\n") + + Endif + + Wend + + $bIgnoreFileChange = False + + UpdateSearchList + + If bUndo Then + $bIgnoreFileChange = True + Try hFile.GetEditor().End + $bIgnoreFileChange = False + Endif + + If $sTaskBuffer Then Return + If $hTask Then Return + If $iReplaceFrom > 0 Then Return + + If $bReplaceAll Then + If $iReplaceFrom < 0 Then + $iReplaceFrom = $aResult.Count + Return + Endif + Endif + + gvwFind.Columns[0].Width = -1 + gvwFind.Columns[1].Width = -1 + gvwFind.Columns[4].W = -1 + + timFillList.Stop + FDebugInfo.StopSearch + + If $bReplaceAll Then + ClearCache + Search(SEARCH_AFTER_REPLACE) + Endif + +End + +Public Sub SearchTask_Kill() + + If $hTask = Last Then $hTask = Null + +End + +Private Sub Search(iMode As Integer, Optional aPath As String[]) + + If InitSearch() Then Return + + FDebugInfo.ShowSearchList + FDebugInfo.StartSearch + + $sTaskBuffer = "" + $sTaskPath = "" + $iTaskIndex = -1 + $bTaskUpdate = iMode = SEARCH_UPDATE + + ResetBrowse($bTaskUpdate) + + $hTask = New CSearchTask As "SearchTask" + + If iMode = SEARCH_AFTER_REPLACE Then $bUseReplaceString = True + + With $hTask + + If $bUseReplaceString Then + .Search = ReplaceString + .IgnoreCase = False + .RegularExpression = False + .WordsOnly = False + Else + .Search = SearchString + .IgnoreCase = IgnoreCase + .RegularExpression = RegularExpression + .WordsOnly = WordsOnly + Endif + + If $bTaskUpdate Then + .Update = aPath + Else If radEverywhere.Value Then + .Where = CSearchTask.ALL_FILES + Else If radSourceFileOnly.Value Then + .Where = CSearchTask.SOURCE_FILES + Else If radDataFileOnly.Value Then + .Where = CSearchTask.DATA_FILES + Else + .Where = $hCurrent.Path + Endif + + End With + + $bReplaceAll = iMode = SEARCH_REPLACE + $iReplaceFrom = -1 + If iMode = SEARCH_STRING Or If iMode = SEARCH_REPLACE Then $nReplace = 0 + +End diff --git a/app/src/gambas3/.src/Search/FSearch.form b/app/src/gambas3/.src/Search/FSearch.form new file mode 100644 index 00000000..6a1c8fee --- /dev/null +++ b/app/src/gambas3/.src/Search/FSearch.form @@ -0,0 +1,174 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,102,37) + Visible = False + Action = "find" + Text = ("Search & Replace") + Icon = Picture["icon:/small/find"] + Persistent = True + Resizable = False + Utility = True + Arrangement = Arrange.Horizontal + Spacing = True + Margin = True + { VBox3 VBox + MoveScaled(1,1,59,35) + Expand = True + Spacing = True + { HBox1 HBox + MoveScaled(0,0,51,4) + { Label1 Label + MoveScaled(0,0,16,4) + Text = ("Search") + } + { cmbSearch ComboBox + MoveScaled(18,0,32,4) + Expand = True + } + } + { HBox2 HBox + MoveScaled(0,5,51,4) + { Label2 Label + MoveScaled(0,0,16,4) + Text = ("Replace") + } + { cmbReplace ComboBox + MoveScaled(18,0,32,4) + Expand = True + } + } + { HBox4 Panel + MoveScaled(-1,10,58,25) + Expand = True + Arrangement = Arrange.Horizontal + Spacing = True + Margin = True + Border = Border.Plain + { VBox2 VBox + MoveScaled(1,0,26,25) + Expand = True + { Label4 Label + MoveScaled(0,0,19,3) + Font = Font["Bold"] + Text = ("Options") + Alignment = Align.TopNormal + } + { chkCaseSensitive CheckBox + MoveScaled(0,3,25,4) + Text = Shortcut(("Case sensitive"), "C") + } + { chkWordsOnly CheckBox + MoveScaled(0,6,25,4) + Text = Shortcut(("Words only"), "W") + } + { chkRegularExpression CheckBox + MoveScaled(0,9,25,4) + Text = Shortcut(("Regular expression"), "x") + } + { chkIgnoreStrings CheckBox + MoveScaled(0,15,25,4) + Text = Shortcut(("Ignore strings"), "I") + } + { chkIgnoreComments CheckBox + MoveScaled(0,18,25,4) + Text = Shortcut(("Ignore comments"), "g") + } + } + { Panel3 Panel + MoveScaled(29,11,1,5) + } + { panSearchIn VBox + MoveScaled(32,0,24,24) + Expand = True + { Label3 Label + MoveScaled(0,0,19,3) + Font = Font["Bold"] + Text = ("Search in") + Alignment = Align.TopNormal + } + { radCurrentProcedure RadioButton radSearch + Name = "radCurrentProcedure" + MoveScaled(0,4,25,4) + Text = Shortcut(("Current function"), "u") + } + { radCurrentFile RadioButton radSearch + Name = "radCurrentFile" + MoveScaled(0,8,25,4) + Text = Shortcut(("Current file"), "f") + Value = True + } + { radSourceFileOnly RadioButton radSearch + Name = "radSourceFileOnly" + MoveScaled(0,12,25,4) + Text = Shortcut(("Source files"), "S") + } + { radDataFileOnly RadioButton radSearch + Name = "radDataFileOnly" + MoveScaled(0,16,25,4) + Text = Shortcut(("Data files"), "D") + } + { radEverywhere RadioButton radSearch + Name = "radEverywhere" + MoveScaled(0,20,25,4) + Text = Shortcut(("All files"), "l") + } + } + } + } + { HBox5 VBox + MoveScaled(62,1,23,35) + Spacing = True + { btnNext Button + MoveScaled(0,0,22,4) + Text = Shortcut(("Next"), "N") + Picture = Picture["icon:/small/down"] + } + { btnPrevious Button + MoveScaled(0,5,21,4) + Text = Shortcut(("Previous"), "P") + Picture = Picture["icon:/small/up"] + } + { btnBrowse Button + MoveScaled(0,10,17,4) + Visible = False + Text = Shortcut(("Browse"), "B") + Picture = Picture["icon:/small/find"] + } + { btnReplace Button + MoveScaled(1,14,17,4) + Text = Shortcut(("Replace"), "R") + Picture = Picture["icon:/small/replace"] + } + { btnReplaceAll Button + MoveScaled(2,18,17,4) + Text = Shortcut(("Replace all"), "a") + Picture = Picture["icon:/small/wizard"] + } + { Panel1 Panel + MoveScaled(7,28,3,3) + Expand = True + } + { chkHighlight CheckBox + MoveScaled(0,30,25,4) + Text = Shortcut(("Highlight search"), "H") + } + } + { timRefresh #Timer + #MoveScaled(53,2) + Delay = 500 + } + { timFillList #Timer + #MoveScaled(88,6) + Delay = 100 + } +} + +# Gambas Action File 3.0 + +{ Actions + { Action find + Text = "Search Replace" + Picture = "icon:/small/find" + } +} diff --git a/app/src/gambas3/.src/Translation/CTranslation.class b/app/src/gambas3/.src/Translation/CTranslation.class new file mode 100644 index 00000000..749e9228 --- /dev/null +++ b/app/src/gambas3/.src/Translation/CTranslation.class @@ -0,0 +1,302 @@ +' Gambas class file + +Public Header As String +Public Keys As New String[] +Public Translations As New Collection +Public Comments As New Collection + +Private Const MODE_NONE As Integer = 0 +Private Const MODE_MSGID As Integer = 1 +Private Const MODE_MSGSTR As Integer = 2 + +Public Sub _new(sLang As String) + + LoadTranslation(sLang) + +End + +Static Public Sub SubstHeader(sHeader As String, Optional sLang As String) As String + + Dim sDate As String + + sDate = Format(DateAdd(Now, gb.Second, System.TimeZone), "yyyy-mm-dd hh:nn UTC") + + sHeader = Replace(sHeader, "$(PACKAGE)", Project.Name) + sHeader = Replace(sHeader, "$(VERSION)", Project.FullVersion) + sHeader = Replace(sHeader, "$(NOW)", sDate) + sHeader = Replace(sHeader, "$(DATE)", sDate) + sHeader = Replace(sHeader, "$(NAME)", Settings["/Identity/Name", User.Name]) + sHeader = Replace(sHeader, "$(MAIL)", Settings["/Identity/Mail", User.Name & "@" & System.Host]) + sHeader = Replace(sHeader, "$(LANG)", sLang) + + Return sHeader + +End + +Private Sub CheckTranslate(sMsgComment As String, cCache As Collection) As String + + Dim iPos As Integer + Dim sFile As String + Dim sPath As String + Dim aFile As String[] + Dim I As Integer + Dim aResult As New String[] + Dim bShouldTranslate As Boolean + + aFile = Split(sMsgComment, " ", "", True) + For I = 0 To aFile.Max + sFile = aFile[I] + If sFile Begins "." Then + aResult.Add(sFile) + Else + sPath = sFile + iPos = InStr(sPath, ":") + If iPos Then sPath = Left(sPath, iPos - 1) + + If cCache.Exist(sPath) Then + bShouldTranslate = cCache[sPath] + Else + bShouldTranslate = Project.ShouldTranslate(Project.FindPath(sPath), True) + cCache[sPath] = bShouldTranslate + Endif + + If bShouldTranslate Then aResult.Add(sFile) + + Endif + Next + + Return aResult.Join(" ") + +End + +Private Sub LoadTranslation(sLang As String) + + Dim sPath As String + Dim hFile As File + Dim sLine As String + Dim sMsgId As String + Dim sMsgStr As String + Dim sMsgComment As String + Dim iMode As Integer + Dim bFuzzy As Boolean + Dim iPos As Integer + Dim cCache As New Collection + Dim cKey As New Collection + Dim bIgnore As Boolean + + sPath = Language.GetPath(sLang, "po") + If Not Exist(sPath) Then Return + + hFile = Open sPath + + While Not Eof(hFile) + Line Input #hFile, sLine + If Not sLine Then Break + Header &= sLine & "\n" + Wend + + iPos = InStr(Header, "#, fuzzy") + If iPos = 0 Then iPos = InStr(Header, "#,fuzzy") + If iPos Then Header = Left(Header, iPos - 1) + + Header &= SubstHeader(File.Load("po-header.txt"), sLang) + + Do + + If Not Eof(hFile) Then + + Line Input #hFile, sLine + + If sLine Begins "#" Then + + If sLine Begins "#:" Then + sMsgComment = Trim(sMsgComment & " " & Mid$(sLine, 3)) + Continue + Else If sLine Begins "#," Then + If InStr(sLine, "fuzzy") Then + bFuzzy = True + Continue + Endif + Else If sLine = "# gb-ignore" Then + bIgnore = True + Endif + + Else + + If Left$(sLine, 6) = "msgid " Then + sMsgId = Mid$(sLine, 8, -1) + iMode = MODE_MSGID + Continue + Endif + + If Left$(sLine, 7) = "msgstr " Then + sMsgStr = Mid$(sLine, 9, -1) + iMode = MODE_MSGSTR + Continue + Endif + + If Left$(sLine) = Chr$(34) Then + If iMode = MODE_MSGID Then + sMsgId = sMsgId & Mid$(sLine, 2, -1) + Else If iMode = MODE_MSGSTR Then + sMsgStr = sMsgStr & Mid$(sLine, 2, -1) + Endif + Continue + Endif + + Endif + + Endif + + If Trim(sMsgId) Then + + If sMsgComment Then + sMsgComment = CheckTranslate(sMsgComment, cCache) + If Not sMsgComment Then + sMsgId = "" + sMsgComment = "" + sMsgStr = "" + bFuzzy = False + bIgnore = False + Continue + Endif + Endif + + 'Inc iIndex + If Not cKey.Exist(sMsgId) Then + Keys.Add(sMsgId) + cKey[sMsgId] = True + Else + Error "gambas3: warning: duplicate translation: "; sMsgId + Endif + + If sMsgStr = "-\\n" Then sMsgStr = "-" + + If bIgnore Then + sMsgStr = "-" + bIgnore = False + Endif + + If bFuzzy Then + bFuzzy = False + Else + Translations[sMsgId] = sMsgStr + Endif + Comments[sMsgId] = sMsgComment + sMsgId = "" + sMsgComment = "" + sMsgStr = "" + + Endif + + If Eof(hFile) Then Break + + Loop + + Close #hFile + +End + +Static Public Sub FindTranslation(sPath As String, sFind As String) As String + + Dim hFile As File + Dim sLine As String + Dim sMsgId As String + Dim sMsgStr As String + Dim sMsgComment As String + Dim iMode As Integer + Dim bFuzzy As Boolean + Dim bIgnore As Boolean + + If Not Exist(sPath) Then Return + + sFind = Replace(sFind, "\n", "\\n") + + hFile = Open sPath + + While Not Eof(hFile) + Line Input #hFile, sLine + If Not sLine Then Break + 'Header &= sLine & "\n" + Wend + + ' iPos = InStr(Header, "#, fuzzy") + ' If iPos = 0 Then iPos = InStr(Header, "#,fuzzy") + ' If iPos Then Header = Left(Header, iPos - 1) + ' + ' Header &= SubstHeader(File.Load("po-header.txt"), sLang) + + Do + + If Not Eof(hFile) Then + + Line Input #hFile, sLine + + If sLine Begins "#" Then + If sLine Begins "#:" Then + Continue + Else If sLine Begins "#," Then + If InStr(sLine, "fuzzy") Then + bFuzzy = True + Continue + Endif + Else If sLine = "# gb-ignore" Then + bIgnore = True + Endif + Else + If Left$(sLine, 6) = "msgid " Then + sMsgId = Mid$(sLine, 8, -1) + iMode = MODE_MSGID + Continue + Endif + + If Left$(sLine, 7) = "msgstr " Then + sMsgStr = Mid$(sLine, 9, -1) + iMode = MODE_MSGSTR + Continue + Endif + Endif + + If Left$(sLine) = Chr$(34) Then + If iMode = MODE_MSGID Then + sMsgId = sMsgId & Mid$(sLine, 2, -1) + Else If iMode = MODE_MSGSTR Then + sMsgStr = sMsgStr & Mid$(sLine, 2, -1) + Endif + Continue + Endif + + Endif + + If Trim(sMsgId) Then + + If sMsgStr = "-\\n" Then sMsgStr = "-" + + If bIgnore Then + sMsgStr = "-" + bIgnore = False + Endif + + If bFuzzy Then + bFuzzy = False + Else + If sMsgId = sFind Then + If sMsgStr = "-" Then sMsgStr = sMsgId + Close #hFile + Return Replace(sMsgStr, "\\n", "\n") + Endif + Endif + + sMsgId = "" + sMsgComment = "" + sMsgStr = "" + + Endif + + If Eof(hFile) Then Break + + Loop + + Close #hFile + +End diff --git a/app/src/gambas3/.src/Translation/FNewTranslation.class b/app/src/gambas3/.src/Translation/FNewTranslation.class new file mode 100644 index 00000000..1fe0b216 --- /dev/null +++ b/app/src/gambas3/.src/Translation/FNewTranslation.class @@ -0,0 +1,45 @@ +' Gambas class file + +Static Private $sLang As String + +Static Public Function Run() As String + + FNewTranslation.ShowModal + Return $sLang + +End + +Public Sub Form_Open() + + Dim sLang As String + + For Each sLang In Language.GetAll() + If Project.HasTranslation(sLang) Then Continue + lstLanguage.Add(Language.ToName(sLang)) + Next + + Try lstLanguage.Index = 0 + +End + + +Public Sub btnOK_Click() + + $sLang = Language.FromName(lstLanguage.Text) + Me.Close + +End + +Public Sub btnCancel_Click() + + $sLang = "" + Me.Close + +End + + +Public Sub lstLanguage_Activate() + + btnOK.Value = True + +End diff --git a/app/src/gambas3/.src/Translation/FNewTranslation.form b/app/src/gambas3/.src/Translation/FNewTranslation.form new file mode 100644 index 00000000..38501044 --- /dev/null +++ b/app/src/gambas3/.src/Translation/FNewTranslation.form @@ -0,0 +1,21 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,59,58) + Text = ("New translation") + Resizable = False + { btnOK Button + MoveScaled(23,53,17,4) + Text = ("OK") + Default = True + } + { btnCancel Button + MoveScaled(41,53,17,4) + Text = ("Cancel") + Cancel = True + } + { lstLanguage ListBox + MoveScaled(1,1,57,51) + Sorted = True + } +} diff --git a/app/src/gambas3/.src/Translation/FTranslate.class b/app/src/gambas3/.src/Translation/FTranslate.class new file mode 100644 index 00000000..0bae5618 --- /dev/null +++ b/app/src/gambas3/.src/Translation/FTranslate.class @@ -0,0 +1,1780 @@ +' Gambas class file + +' This must be put in an external help to define. +' +'F1 = this Help +'F3 = Find NEXT +'F4 = Find NEXT untranslated String +'Shift + F4 = Find previous untranslated String +'F5 = COPY untranslated String +'F6 = This String must NOT be translated +'F7 = Verify the translation +'F8 = Clear this translation +'Ctrl+F = goes TO Find - field +'Alt+Up / Alt+Down = moves on String up / down + +Private Const MODE_NONE As Integer = 0 +Private Const MODE_MSGID As Integer = 1 +Private Const MODE_MSGSTR As Integer = 2 + +Private Enum EXPORT_ALL, EXPORT_UNTRANSLATED, EXPORT_TRANSLATED + +Private Const TABLE_HEIGHT_MAX As Integer = 256 + +Private $sLang As String +Private $sPath As String +Private $sHeader As String +Private $bModify As Boolean +Private $bIgnore As Boolean +Private $nTrans As Integer +Private $sErrMerge As String +Private cvwTranslateOrg As ColumnView +Private $bDeleteIfVoid As Boolean +Private $cCacheImport As Collection +Private $bStatValid As Boolean + +Static Private $sTranslateShell As String +Static Private $sTranslateEngine As String + +Static Public Sub Run() + + If Project.GetClasses().Count = 0 Then + Message(("The project is void. There is nothing to translate.")) + Return + Endif + + If Settings["/AutomaticTranslation/Enabled"] Then + $sTranslateShell = System.Find("trans") + $sTranslateEngine = Settings["/AutomaticTranslation/Engine", "google"] + Else + $sTranslateShell = "" + $sTranslateEngine = "" + Endif + + FTranslate.ShowModal + +End + +Public Sub _new() + + With cvwTranslate + .Columns.Count = 4 + '.Columns[0].Text = ("Untranslated") + '.Columns[2].Text = ("Comments") + End With + cvwTranslateOrg = New ColumnView(Me) + With cvwTranslateOrg + .AutoResize = False + .Visible = False + .Columns.Count = 4 + '.Columns[0].Text = ("Untranslated") + '.Columns[2].Text = ("Comments") + End With + + cvwLang.Columns[0].Text = ("Language") + With cvwLang + .AddColumn(("Progress"),, Align.Right) + .AddColumn(("Not translated"),, Align.Right) + .AddColumn(("File")) + .AddColumn(("Size"),, Align.Right) + End With + + mnuAutoTrans.Enabled = $sTranslateShell + btnAutoTrans.Enabled = mnuAutoTrans.Enabled + + Project.SetSmallFont(panTransToolbar) + Project.SetSmallFont(panToolbar) + +End + +' Private Sub GetTransCount(sLang As String) As Integer +' +' Dim hFile As File +' Dim iVal As Integer +' +' If Not Exist(Language.GetPath(sLang, "mo")) Then Return +' +' hFile = Open Language.GetPath(sLang, "mo") +' +' iVal = Read #hFile As Integer +' If (iVal = &H950412DE) Xor (System.ByteOrder = gb.BigEndian) Then +' hFile.ByteOrder = gb.LittleEndian +' Else +' hFile.ByteOrder = gb.BigEndian +' Endif +' iVal = Read #hFile As Integer +' iVal = Read #hFile As Integer +' +' Close #hFile +' +' Return iVal - 1 +' +' End + +Private Sub ComputeTransStat(sLang As String, Optional nTrans As Integer) + + Dim nStr As Integer + Dim hTrans As CTranslation + + If nTrans = 0 Then nTrans = cvwTranslateOrg.Count + + hTrans = New CTranslation(sLang) + nStr = hTrans.Translations.Count + + With cvwLang[sLang] + .[1] = Min(100, (nStr * 100) \ nTrans) & "% " + .[2] = CStr(nTrans - nStr) & " " + .[3] = sLang & ".po" + Try .[4] = Project.GetFileSize(Stat(Language.GetPath(sLang, "po")).Size) + End With + +End + +Public Sub Form_Open() + + Dim sLang As String + Dim sPath As String + + Inc Application.Busy + + $sLang = "" + + Settings.Read(Me) + + $bStatValid = False + + cvwLang.Clear + cmbLang.Clear + cmbLangSource.Clear + cmbLangSource.Add(("(Default)")) + + 'For Each sLang In Language.GetAll() + For Each sLang In Project.GetTranslations() + 'If Project.HasTranslation(sLang) Then + cvwLang.Add(sLang, Language.ToName(sLang)) + cmbLang.Add(Language.ToName(sLang)) + cmbLangSource.Add(Language.ToName(sLang)) + 'Endif + Next + + sPath = Settings["/FTranslate/ImportPath"] + If Not sPath Then sPath = System.User.Home + dchImport.SelectedPath = sPath + ' If IsDir(sPath) Then + ' dchImport.SelectedPath = sPath + ' Else + ' dchImport.SelectedPath = sPath + ' fvwImport.Current = File.Name(sPath) + ' Endif + dchImport.FileView.Filter = ["*.po", ("Translation files")] + + Project.SetEditorFont(txtOrig) + Project.SetEditorFont(txtTranslate) + + Dec Application.Busy + + If SetLang() Then + Me.Close + Endif + + tabTranslate_Click + +End + +Private Sub ErrorMessage(sText As String, sDetail As String) + + Dim iPos As Integer + + sText = "

      " & Html(Trim(sText) & "\n\n") + sDetail = Trim(sDetail) + If sDetail Then + If String.Len(sDetail) > 1024 Then + sDetail = String.Left(sDetail, 1024) + iPos = RInStr(sDetail, "\n") + If iPos Then sDetail = Left(sDetail, iPos - 1) + sDetail &= "\n[...]" + Endif + sText &= "" & Html(sDetail) & "" + Endif + + Message.Error(sText) + +End + + +Private Sub SetLang(Optional sLang As String) As Boolean + + Dim sDir As String + Dim sPath As String + Dim sMsgId As String + Dim iIndex As Integer + Dim sMsg As String + Dim sCurrent As String + Dim sName As String + Dim hTrans, hTransSrc As CTranslation + Dim sLangSrc As String + + Inc Application.Busy + + sCurrent = cvwTranslate.Key + + SaveTranslate + + If Not sLang Then sLang = Language.Find(System.Language) + + sDir = Project.Dir &/ ".lang" + sPath = Language.GetPath(sLang, "po") + + 'lblFile.Text = File.Name(sPath) + cmbLang.ToolTip = File.Name(sPath) + + $bDeleteIfVoid = False + + If Not Exist(sPath) Then + Copy sDir &/ ".pot" To sPath + VersionControl.AddFile(sPath) + $bDeleteIfVoid = True + 'SHELL "cp " & Project.Quote(sDir &/ ".pot") & " " & Project.Quote(sPath) WAIT + Else If Stat(sPath).Size = 0 Then + $bDeleteIfVoid = True + Else + Try MergeMessage(sPath, Shell$(sPath) & " " & Shell$(sDir &/ ".pot")) + If Error Then + Try Copy sDir &/ ".pot" To sPath + ErrorMessage(Subst$(("The '&1' command has failed."), "msgmerge"), $sErrMerge) + 'ResizeTable + 'cmbLang.Text = Language + 'Dec Application.Busy + 'Return True + Endif + ' SHELL "msgmerge -o " & Project.Quote(sPath & ".new") & " " & Project.Quote(sPath) & " " & Project.Quote(sDir &/ ".pot") & " > " & Project.Quote(sTemp) & " 2>&1" WAIT + ' IF Exist(sPath & ".new") THEN + ' KILL sPath + ' RENAME sPath & ".new" AS sPath + ' ELSE + ' PRINT "msgmerge -o " & Project.Quote(sPath & ".new") & " " & Project.Quote(sPath) & " " & Project.Quote(sDir &/ ".pot") & " > " & Project.Quote(sTemp) & " 2>&1" + ' PRINT File.Load(sTemp) + ' Error.Raise(("The 'msgmerge' command has failed")) + ' ENDIF + ' TRY KILL sTemp + Endif + + cvwTranslate.Clear + 'cvwTranslate.Columns[2].AutoResize = FALSE + + hTrans = New CTranslation(sLang) + If cmbLangSource.Index > 0 Then + sLangSrc = Language.FromName(cmbLangSource.Text) + hTransSrc = New CTranslation(sLangSrc) + Endif + + $sHeader = hTrans.Header + + For Each sMsgId In hTrans.Keys + Inc iIndex + If hTransSrc Then + cvwTranslate.Add(iIndex, hTransSrc.Translations[sMsgId]) + Else + cvwTranslate.Add(iIndex, sMsgId) + Endif + cvwTranslate[iIndex][1] = hTrans.Translations[sMsgId] + cvwTranslate[iIndex][2] = hTrans.Comments[sMsgId] + cvwTranslate[iIndex][3] = sMsgId + Next + + $nTrans = hTrans.Translations.Count + + MakeFileChoice + UpdateOrg(True) + + 'cvwTranslate.Columns[1].Text = Language.ToName(sLang) + + txtOrig.Text = "" + Object.Lock(txtTranslate) + txtTranslate.Clear + Object.Unlock(txtTranslate) + + $bIgnore = False + + If cvwTranslate.MoveTo(sCurrent) Then + Wait ' let the columnview be sorted + cvwTranslate.MoveFirst + Endif + Try cvwTranslate.Item.Selected = True + Try cvwTranslate.Item.EnsureVisible + + $sLang = sLang + $sPath = sPath + $bModify = False + + sName = Language.ToName($sLang) + Try cvwLang.Add($sLang, sName) + If Not Error Then cmbLang.Add(sName) + 'If Not Error And If chkStat.Value Then cvwLang[$sLang][1] = "0%" + + 'Try cvwLang[$sLang].Selected = True + Try cmbLang.Index = cmbLang.Find(sName) + + DisplayTrans + +Finally + + ResizeTable + Dec Application.Busy + +Catch + + sMsg = Error.Text & "\n\n" & Error.Backtrace.Join(" ") & "\n\n" & Trim($sErrMerge) + ErrorMessage(Subst(("Cannot read translation file for language '&1'"), Language.ToName(sLang)), sMsg) + $bIgnore = False + Return True + +End + +Public Sub btnOK_Click() + + Me.Close + +End + +Private Sub FormatComment(sComment As String) + + Dim sFile As String + Dim sPath As String + Dim iPos As Integer + Dim sSuffix As String + Dim hLabel As Label + Dim hSep As Separator + + panComment.Children.Clear + + For Each sFile In Split(sComment, " ", "", True) + + iPos = RInStr(sFile, ":") + If iPos Then + sSuffix = Mid$(sFile, iPos + 1) + sFile = Left$(sFile, iPos - 1) + Else + sSuffix = "" + Endif + If sFile Not Begins "." Then + sPath = Project.FindPath(sFile) + sFile = Mid$(sPath, Len(Project.SourceDir) + 2) + Endif + + If sSuffix Then sFile &= " (" & sSuffix & ")" + + If panComment.Children.Count Then + hSep = New Separator(panComment) + hSep.Resize(1, 1) + Endif + + hLabel = New Label(panComment) + hLabel.Text = " " & sFile & " " + hLabel.Padding = Desktop.Scale \ 2 + hLabel.AutoResize = True + + Next + +End + +Public Sub cvwTranslate_Select() + + With cvwTranslate + + txtOrig.Text = .Current[0] + $bIgnore = True + txtTranslate.Text = .Current[1] + $bIgnore = False + FormatComment(.Current[2]) + + End With + + txtTranslate.SetFocus + +End + +Public Sub txtTranslate_Change() + + Dim nTransOld As Integer + + If $bIgnore Then Return + + nTransOld = $nTrans + If cvwTranslate.Current[1] Then Dec $nTrans + cvwTranslate.Current[1] = txtTranslate.Text + If cvwTranslate.Current[1] Then Inc $nTrans + + If $nTrans <> nTransOld Then DisplayTrans + + $bModify = True + +End + +Private Sub WriteTranslation(sPath As String, Optional iMode As Integer = EXPORT_ALL) As Boolean + + Dim hFile As File + Dim sStr As String + Dim bTrans As Boolean + + If Not sPath Then + + hFile = Open String For Write + + Else + + hFile = Open sPath For Create + Print #hFile, $sHeader + + Endif + + With cvwTranslateOrg + + .MoveFirst() + + While .Available + + sStr = .Item[1] + If iMode = EXPORT_TRANSLATED Then + If Not sStr Then Goto NEXT_TRANS + Else If iMode = EXPORT_UNTRANSLATED Then + If sStr Then Goto NEXT_TRANS + Endif + + If Not sPath Then + + Print #hFile, Mid$(Quote(.Item[3]), 2, -1) + + Else + + If sStr Then + If Right$(.Item[3], 2) = "\\n" Then + If Right$(sStr, 2) <> "\\n" Then + sStr = sStr & "\\n" + Endif + Else + While Right(sStr, 2) = "\\n" + sStr = Left(sStr, -2) + Wend + Endif + Endif + + If sStr = "-" Then + sStr = "" + Print #hFile, "# gb-ignore" + Endif + + Print #hFile, "#: "; .Item[2] + Print #hFile, "msgid "; Chr$(34); .Item[3]; Chr$(34) + Print #hFile, "msgstr "; Quote(UnQuote(sStr)) + Print #hFile + + Endif + + If sStr Then bTrans = True + + NEXT_TRANS: + .MoveNext() + Wend + + End With + + If Not sPath Then + sStr = Close #hFile + Clipboard.Copy(sStr) + Else + Close #hFile + Endif + + + Return Not bTrans + +End + +Private Sub SaveTranslate(Optional bForce As Boolean) + + Dim bNoTrans As Boolean + Dim bExistMO As Boolean + Dim sPathMO As String + + If Not $sLang Then Return + + If Not $bDeleteIfVoid Then + If Not ($bModify Or bForce) Then Return + Endif + + UpdateOrg() + + Project.CreateLangDirectory() + + sPathMO = File.SetExt($sPath, "mo") + bExistMO = Exist(sPathMO) + + If $nTrans = 0 Then + VersionControl.RemoveFile($sPath, True) + Try Kill $sPath + If bExistMO Then + VersionControl.RemoveFile(sPathMO, True) + Try Kill sPathMO + Endif + Return + Endif + + Inc Application.Busy + + 'PRINT "Saving "; $sPath + + bNoTrans = WriteTranslation($sPath & ".new") + Try Kill $sPath + + If Not bNoTrans Then + + Move $sPath & ".new" To $sPath + + 'Project.CompileTranslation(True, $sLang) + Project.Compile() + + 'Shell "msgfmt -o " & Shell$(sPathMO) & " " & Shell$($sPath) Wait + + 'If Not bExistMO Then VersionControl.AddFile(sPathMO) + + Else + + 'PRINT "Void translation" + + Try Kill $sPath & ".new" + If bExistMO Then + VersionControl.RemoveFile(sPathMO, True) + Try Kill sPathMO + Endif + + Endif + + ComputeTransStat($sLang) + + $bModify = False + $bStatValid = False + +Finally + + Dec Application.Busy + +Catch + + Message.Error(("Cannot save translation.") & "\n\n" & Error.Text) + +End + +' Private Function QuoteTranslation(sStr As String) As String +' +' ' sStr = Replace(sStr, "\n", "") +' ' sStr = Replace(sStr, "\\" & Chr$(34), "\n") +' ' sStr = Replace(sStr, Chr$(34), "\\" & Chr$(34)) +' ' sStr = Replace(sStr, "\n", "\\" & Chr$(34)) +' ' sStr = Replace(sStr, "\\", "\\\\") +' ' +' ' Return Chr$(34) & sStr & Chr$(34) +' +' Return Quote(sStr) +' +' End + +' Private Function QuoteTranslation(sStr As String) As String +' +' sStr = Replace(sStr, "\n", "") +' sStr = Replace(sStr, "\\n", "\n") +' Return Quote(sStr) +' +' End + +' Private Function UnQuoteTranslation(sStr As String) As String +' +' sStr = Unquote(sStr) +' sStr = Replace(sStr, "\n", "\\n") +' Return sStr +' +' End + +Public Sub btnSave_Click() + + SaveTranslate(True) + +End + +Public Sub btnCopy_Click() + + txtTranslate.Text = cvwTranslate.Current[0] + +End + +Public Sub txtFind_Click() + + Dim sStr As String + Dim sFind As String + Dim sKey As String + + sFind = String.LCase(txtFind.Text) + If Not sFind Then Return + If cvwTranslate.Count = 0 Then Return + + With cvwTranslate + + sKey = .Key + + Do + + .MoveNext() + If Not .Available Then + .MoveFirst() + Endif + + sStr = String.LCase(.Item[0] & "\n" & .Item[1]) + If InStr(sStr, sFind) Then + .Item.EnsureVisible + .Item.Selected = True + Return + Endif + + If .Item.Key = sKey Then + Balloon.Info(("Search string cannot be found."), txtFind) + Return + Endif + + Loop + + End With + +End + +Public Sub txtFind_Activate() + + txtFind_Click + +End + +' Public Sub cvwLang_Select() +' +' Dim sLang As String = cvwLang.Item.Key +' +' If sLang = $sLang Then Return +' +' SetLang(sLang) +' +' End + +Public Sub cmbLang_Click() + + Dim sLang As String = Language.FromName(cmbLang.Text) + + If sLang = $sLang Then Return + + SetLang(sLang) + +End + +Public Sub mnuDelete_Click() + + If Message.Delete(("Do you really want to delete this translation ?"), ("Delete"), ("Cancel")) = 2 Then Return + + With cvwTranslate + + .MoveFirst() + While .Available + .Item[1] = "" + .MoveNext() + Wend + + .MoveFirst() + .Item.Selected = True + .Item.EnsureVisible() + + $nTrans = 0 + + End With + + SaveTranslate(True) + cvwLang.Remove($sLang) + cmbLang.Remove(cmbLang.Index) + SetLang() + +End + +Public Sub mnuNew_Click() + + Dim sLang As String + + sLang = FNewTranslation.Run() + If Not sLang Then Return + + SetLang(sLang) + + ' IF sLang = $sLang THEN + ' Message(("This is the same translation !")) + ' RETURN + ' ENDIF + ' + ' IF Message.Question(("Do you really want to replace this translation ?"), ("Replace"), ("Cancel")) = 2 THEN RETURN + ' + ' 'TRY KILL Project.Dir &/ $sLang & ".po" + ' SHELL "cp -f " & Project.Quote(Project.Dir &/ ".lang" &/ sLang & ".po") & " " & Project.Quote(Project.Dir &/ ".lang" &/ $sLang & ".po") WAIT + ' + ' SetLang($sLang) + +End + +Public Sub txtTranslate_KeyPress() + + If Key.Alt Then + With cvwTranslate + If Key.Code = Key["Up"] Then + If Key.Shift Then + If btnPreviousTranslated.Enabled Then btnPreviousTranslated_Click + Else If Key.Control Then + If btnPreviousUntranslated.Enabled Then btnPreviousUntranslated_Click + Else + .MoveTo(.Key) + .MoveAbove() + If .Available Then + .Item.Selected = True + .Item.EnsureVisible() + Endif + Endif + Else If Key.Code = Key["Down"] Then + If Key.Shift Then + If btnNextTranslated.Enabled Then btnNextTranslated_Click + Else If Key.Control Then + If btnNextUntranslated.Enabled Then btnNextUntranslated_Click + Else + .MoveTo(.Key) + .MoveBelow() + If .Available Then + .Item.Selected = True + .Item.EnsureVisible() + Endif + Endif + Endif + End With + Else If Key.Shift Then + If Key.Code = Key.F4 Then + btnPreviousUntranslated_Click() + Endif + Else If Key.Control Then + If Key.Code = Key["F"] Then + txtFind.SetFocus + Endif + Else If Key.Normal Then + Select Case Key.Code + Case Key.F3 + txtFind_Click + Case Key.F4 + btnNextUntranslated_Click + Case Key.F5 + btnCopy_Click + Case Key.F6 + btnDoNotTranslate_Click + Case Key.F7 + btnVerify_Click + Case Key.F8 + btnClear_Click + End Select + Endif + +End + +Public Sub mnuReload_Click() + + If Message.Question(("Do you really want to reload this translation ?"), ("Reload"), ("Cancel")) = 2 Then Return + + SetLang($sLang) + +End + +Public Sub btnClear_Click() + + txtTranslate.Clear + +End + +Private Sub ExportTranslation(iMode As Integer) + + Dialog.Title = ("Export a translation") + Dialog.Path = Settings["/FTranslate/ExportPath", System.User.Home] &/ Project.Name & "-" & $sLang & "-" & Project.FormatVersion() & ".po" + Dialog.Filter = ["*.po", ("Translation files")] + Dialog.AutoExt = True + If Dialog.SaveFile() Then Return + + Settings["/FTranslate/ExportPath"] = File.Dir(Dialog.Path) + + UpdateOrg + Try Kill Dialog.Path + WriteTranslation(Dialog.Path, iMode) + +End + +Private Sub CopyTranslation(iMode As Integer) + + UpdateOrg + WriteTranslation("", iMode) + +End + + +Public Sub mnuExportAll_Click() + + ExportTranslation(EXPORT_ALL) + +End + +Public Sub mnuExportTranslated_Click() + + ExportTranslation(EXPORT_TRANSLATED) + +End + +Public Sub mnuExportUntranslated_Click() + + ExportTranslation(EXPORT_UNTRANSLATED) + +End + +Public Sub mnuCopytAll_Click() + + CopyTranslation(EXPORT_ALL) + +End + +Public Sub mnuCopyTranslated_Click() + + CopyTranslation(EXPORT_TRANSLATED) + +End + +Public Sub mnuCopyUntranslated_Click() + + CopyTranslation(EXPORT_UNTRANSLATED) + +End + +Private Sub InitIndex() + + $cCacheImport = New Collection + + cvwTranslate.MoveFirst + While cvwTranslate.Available + 'Debug cvwTranslate.Item[0]; "|"; cvwTranslate.Item[1]; "|"; cvwTranslate.Item[2]; "|"; cvwTranslate.Item[3] + $cCacheImport[cvwTranslate.Item[3]] = CInt(cvwTranslate.Item.Key) + cvwTranslate.MoveNext + Wend + +End + +Private Sub FindIndex(sMsgId As String) As Integer + + If Not sMsgId Then Return + If $cCacheImport.Exist(sMsgId) Then Return $cCacheImport[sMsgId] + +End + +Private Sub ImportMessage(sPath As String, bReplace As Boolean) As Integer + + Dim hFic As File + Dim sLine As String + Dim sMsgComment As String + Dim bFuzzy As Boolean + Dim sMsgId As String + Dim iMode As Integer + Dim sMsgStr As String + Dim iIndex As Integer + Dim nTrans As Integer + Dim sCharset As String + + ' sTemp = Temp$() + ' sOutput = Temp$() + ' Shell "msgconv -t UTF-8 -o " & Quote.Shell(sTemp) & " " & Quote.Shell(sPath) & " > " & Quote.Shell(sOutput) & " 2>&1" Wait + ' If Process.LastValue Then + ' $sErrMerge = "\n\n" & DConv(File.Load(sOutput)) + ' Error.Raise(("Unable to convert translation file to UTF-8.")) + ' Endif + + InitIndex + + hFic = Open sPath + + Do + + If Not Eof(hFic) Then + + Line Input #hFic, sLine + + If Left$(sLine) = "#" Then + + If Left$(sLine, 2) = "#:" Then + sMsgComment = Trim(Mid$(sLine, 3)) + Continue + Endif + + If Left$(sLine, 2) = "#," Then + If InStr(sLine, "fuzzy") Then + bFuzzy = True + Continue + Endif + Endif + + Continue + + Endif + + If Left$(sLine, 6) = "msgid " Then + sMsgId = Mid$(sLine, 8, -1) + iMode = MODE_MSGID + Continue + Endif + + If Left$(sLine, 7) = "msgstr " Then + sMsgStr = Mid$(sLine, 9, -1) + iMode = MODE_MSGSTR + Continue + Endif + + If Left$(sLine) = Chr$(34) Then + If iMode = MODE_MSGID Then + sMsgId = sMsgId & Mid$(sLine, 2, -1) + Else If iMode = MODE_MSGSTR Then + If Not sMsgId Then + If sLine Like "\"Content-type:*; charset=*" Then + sLine = Replace(Mid$(sLine, 2, -1), "\\n", "") + Try sCharset = UCase(Trim(Scan(sLine, "*; charset=*")[1])) + If sCharset = "UTF-8" Then sCharset = "" + Endif + Else + sMsgStr = sMsgStr & Mid$(sLine, 2, -1) + Endif + Endif + Continue + Endif + + Endif + + If Trim(sMsgId) Then + + If sCharset Then sMsgStr = Conv(sMsgStr, sCharset, "UTF-8") + + iIndex = FindIndex(sMsgId) + If iIndex <= 0 Then + sMsgId = CControl.RemoveShortcut(sMsgId) + sMsgStr = CControl.RemoveShortcut(sMsgStr) + iIndex = FindIndex(sMsgId) + Endif + + If iIndex > 0 Then + If bReplace Or If cvwTranslate[iIndex][1] = "" Then + + If sMsgStr = "-\\n" Then sMsgStr = "-" + + If bFuzzy Then + bFuzzy = False + Else + cvwTranslate[iIndex][1] = sMsgStr + If sMsgStr Then + Inc $nTrans + Inc nTrans + Endif + Endif + + Endif + + Endif + + Endif + + sMsgId = "" + sMsgComment = "" + sMsgStr = "" + bFuzzy = False + + If Eof(hFic) Then Break + + Loop + + Close hFic + + Return nTrans + +End + +Public Sub btnImport_Click() + + Dim sPath As String + Dim sTransDir, sTrans As String + Dim nTrans As Integer + + sTransDir = dchImport.SelectedPath + If Not chkBrowse.Value Then + sTrans = dchImport.FileView.Current + If Not sTrans Then + Message.Warning(("Please select the translation file to import.")) + Return + Endif + Endif + + Settings["/FTranslate/ImportPath"] = sTransDir + + 'If IsDir(Dialog.Path) Then + ' If Message.Warning("You have selected a directory. Do you want to browse it recursively and import all found translation files?", ("Cancel"), ("Browse")) = 1 Then Return + 'Endif + + ' If Not (File.BaseName(Dialog.Path) Like (Project.Name & "-" & $sLang & "-*")) Then + ' If Message.Warning(("Warning ! The translation file does not match the current language."), ("Continue"), ("Cancel")) <> 1 Then + ' Return + ' Endif + ' Endif + + Inc Application.Busy + + sPath = Language.GetPath($sLang, "po") + + 'SHELL "msgmerge -o " & Project.Quote(sPath & ".new") & " " & Project.Quote(Dialog.Path) & " " & Project.Quote(sPath) & " 2>/dev/null" WAIT + 'MergeMessage(sPath, "-o " & Quote.Shell(sPath & ".new") & " " & Quote.Shell(Dialog.Path) & " " & Quote.Shell(sPath)) + If chkBrowse.Value Then + For Each sTrans In RDir(sTransDir, "*.po") + nTrans += ImportMessage(sTransDir &/ sTrans, chkReplace.Value) + Next + Else + nTrans = ImportMessage(sTransDir &/ sTrans, chkReplace.Value) + Endif + + DisplayTrans + $bModify = True + SaveTranslate + + Dec Application.Busy + + If nTrans = 0 Then + Message.Info(("No translation were picked up.")) + Else If nTrans = 1 Then + Message.Info(("One translation was picked up.")) + Else If nTrans > 0 + Message.Info(Subst(("&1 translations were picked up."), nTrans)) + Endif + + 'SaveTranslate(TRUE) + +Catch + + Application.Busy = 0 + Message.Error(("Cannot import translation file.") & "\n\n" & Error.Text & $sErrMerge) + +End + +Private Function GetSymbols(sStr As String) As String + + Dim sSym As String + Dim iInd As Integer + Dim sCar As String + Dim bGetNext As Boolean + + For iInd = 1 To Len(sStr) + + sCar = Mid$(sStr, iInd, 1) + If bGetNext Then + sSym = sSym & sCar + bGetNext = False + Else If Asc(sCar) < 128 Then + If InStr("abcdefghijklmnopqrstuvwxyz- ',;:", LCase(sCar)) = 0 Then + sSym = sSym & sCar + If sCar = "\\" Then bGetNext = True + Endif + Endif + + Next + + Return sSym + +End + +Public Sub btnVerify_Click() + + Dim sKey As String + + If Not cvwTranslate.Key Then Return + + With cvwTranslate + + sKey = .Key + .MoveCurrent + + Do + + .MoveNext() + If Not .Available Then + .MoveFirst() + Endif + + If .Item.Key = sKey Then + Balloon.Info(("Everything seems to be correct."), btnVerify) + Return + Endif + + If .Item[1] Then + If .Item[1] <> "-" Then + + If GetSymbols(.Item[0]) <> GetSymbols(.Item[1]) Then + .Item.EnsureVisible + .Item.Selected = True + Balloon.Warning(("Translated string symbols do not match untranslated string ones."), txtTranslate) + Return + Endif + + Endif + Endif + + Loop + + End With + +End + +Public Sub btnDoNotTranslate_Click() + + txtTranslate.Text = "-" + +End + +Private Sub DisplayTrans() + + Dim nNotTrans As Integer + + nNotTrans = cvwTranslate.Count - $nTrans + + If nNotTrans = 0 Then + lblInfo.Text = Subst(("&1 strings. Everything is translated!"), cvwTranslate.Count, nNotTrans) + Else If nNotTrans = 1 Then + lblInfo.Text = Subst(("&1 strings. One is not translated. &3% done."), cvwTranslate.Count, nNotTrans, ($nTrans * 100) \ cvwTranslateOrg.Count) + Else + lblInfo.Text = Subst(("&1 strings. &2 are not translated. &3% done."), cvwTranslate.Count, nNotTrans, ($nTrans * 100) \ cvwTranslateOrg.Count) + Endif + + btnNextUntranslated.Enabled = cvwTranslate.Count - $nTrans + btnPreviousUntranslated.Enabled = btnNextUntranslated.Enabled + btnNextTranslated.Enabled = $nTrans > 0 + btnPreviousTranslated.Enabled = btnNextTranslated.Enabled + +End + +' PUBLIC SUB Form_Resize() +' +' DIM H AS Integer +' DIM D AS Integer +' +' D = ME.ClientH - cvwTranslate.Y - 120 +' +' H = (D - TABLE_HEIGHT_MAX) \ 2 +' IF H < 48 THEN +' cvwTranslate.H = D - 48 * 2 +' H = (D - cvwTranslate.H) \ 2 +' ELSE +' cvwTranslate.H = TABLE_HEIGHT_MAX +' ENDIF +' +' cvwTranslate.W = ME.ClientW - 16 +' ResizeTable +' +' lblOrig.Move(8, cvwTranslate.Y + cvwTranslate.H + 8) +' lblComment.Move(lblOrig.X + lblOrig.W, lblOrig.Y) +' lblComment.W = ME.ClientW - lblComment.X - 8 +' txtOrig.Move(8, lblOrig.Y + lblOrig.H, cvwTranslate.W, H) +' +' panTranslate.Move(ME.ClientW - panTranslate.W, txtOrig.Y + txtOrig.H + 8) +' lblTranslation.Y = panTranslate.Y + 8 +' txtTranslate.Move(8, lblTranslation.Y + lblTranslation.H, cvwTranslate.W, H) +' lblInfo.Y = ME.ClientH - lblInfo.H - 8 +' btnOK.Move(ME.CLientW - btnOK.W - 8, ME.CLientH - btnOK.H - 8) +' +' +' END + +Private Sub ResizeTable() + + Dim I As Integer + + With cvwTranslate + .Columns[0].Width = .ClientW \ 2 + .Columns[1].Width = .ClientW - .Columns[0].Width '- 16 + For I = 2 To .Columns.Max + .Columns[I].Width = 0 + Next + End With + +End + +Public Sub btnNextUntranslated_Click() + + Dim sKey As String + + With cvwTranslate + + sKey = .Key + .MoveCurrent() + + Do + + .MoveBelow() + If Not .Available Then + .MoveFirst() + Endif + + If Not .Item[1] Then + .Item.EnsureVisible + .Item.Selected = True + Return + Endif + + If .Item.Key = sKey Then Return + + Loop + + End With + +End + +Public Sub btnPreviousUntranslated_Click() + + Dim sKey As String + + With cvwTranslate + + sKey = .Key + .MoveCurrent() + + Do + + .MoveAbove() + If Not .Available Then + .MoveLast() + Endif + + If Not .Item[1] Then + .Item.EnsureVisible + .Item.Selected = True + Return + Endif + + If .Item.Key = sKey Then Return + + Loop + + End With + +End + +Private Sub MergeMessage(sPath As String, sOption As String) + + Dim sTemp As String + + sTemp = Temp$ + + Shell "msgmerge --no-wrap -F -o " & Shell$(sPath & ".new") & " " & sOption & " > " & Shell$(sTemp) & " 2>&1" Wait + If Exist(sPath & ".new") Then + Kill sPath + Move sPath & ".new" To sPath + $sErrMerge = "" + Try Kill sTemp + Else + 'PRINT "msgmerge -o " & sOption + $sErrMerge = DConv(File.Load(sTemp)) + Try Kill sTemp + Error.Raise(Subst$(("The '&1' command has failed."), "msgmerge")) + Endif + +End + +Public Sub Form_Close() + + Inc Application.Busy + If cmbFileChoice.Index <> 0 Then ShiftToSort + SaveTranslate + Settings.Write(Me) + Dec Application.Busy + +End + +Public Sub cmbFileChoice_Click() + + If cmbFileChoice.Index = 0 Then + ShiftToSort() + Else + ShiftToSort(cmbFileChoice.Text) + Endif + +End + +' PRIVATE SUB MakeFileChoice() +' +' DIM sTempIn AS String +' DIM sTemp AS String +' DIM sControl AS String +' DIM myPattern AS String = " " +' DIM iPos AS Integer +' DIM aChoice AS NEW String[] +' +' cbxFileChoice.Clear +' cbxFileChoice.Add("(" & ("All files") & ")") +' +' WITH cvwTranslate +' .MoveFirst +' DO WHILE .Available +' sTempIn = .Item[2] & myPattern +' DO +' iPos = InStr(sTempIn, myPattern, iPos) +' IF iPos = 0 THEN +' BREAK +' ELSE +' sTemp = Left(sTempIn, iPos) +' sTempIn = Mid(sTempIn, iPos) +' sTemp = "." & Trim(Left(sTemp, InStr(sTemp, "."))) +' IF InStr(sControl, sTemp) = 0 THEN +' sControl = sControl & sTemp +' aChoice.Add(Replace(sTemp, ".", "")) +' ENDIF +' ENDIF +' LOOP +' .MoveNext +' LOOP +' END WITH +' +' cbxFileChoice.Sorted = TRUE +' +' END +' +Private Sub MakeFileChoice() + + Dim sFile As String + Dim aChoice As New String[] + Dim iPos As Integer + + cmbFileChoice.Clear + 'cbxFileChoice.Add("(" & ("All files") & ")") + + With cvwTranslate + .MoveFirst + Do While .Available + For Each sFile In Split(.Item[2], " ", "", True) + iPos = InStr(sFile, ":") + If iPos Then sFile = Left(sFile, iPos - 1) + If Left(sFile) <> "." Then sFile = File.BaseName(sFile) + If aChoice.Find(sFile) < 0 Then aChoice.Add(sFile) + Next + .MoveNext + Loop + End With + + aChoice.Add("(" & ("All files") & ")", 0) + + cmbFileChoice.List = aChoice.Sort() + Object.Lock(cmbFileChoice) + cmbFileChoice.Index = 0 + Object.Unlock(cmbFileChoice) + +End + +Private Sub ShiftToSort(Optional sSortText As String) + + Dim iPos As Integer + Dim sKey As String + Dim sLastKey As String + Dim nI As Integer + + UpdateOrg() + + 'sSearchText = " " & sSortText + $nTrans = 0 + sLastKey = cvwTranslate.Key + cvwTranslate.Clear + With cvwTranslateOrg + .MoveFirst + Do While .Available + If sSortText Then + iPos = InStr(" " & .Item[2], " " & sSortText) + Else + iPos = -1 + Endif + + If iPos <> 0 Then + sKey = .Item.Key + cvwTranslate.Add(sKey, .Item[0]) + If .Item[1] Then Inc $nTrans + For ni = 1 To .Columns.Count - 1 + cvwTranslate.Item[nI] = .Item[nI] + Next + Endif + + .MoveNext + Loop + + End With + + If cvwTranslate.Count Then + Try cvwTranslate.MoveTo(sLastKey) + If Not cvwTranslate.Available Then + cvwTranslate.MoveFirst + Endif + cvwTranslate.Item.Selected = True + cvwTranslate.Item.EnsureVisible() + Endif + + DisplayTrans + ResizeTable + +End + +Private Sub UpdateOrg(Optional bNew As Boolean) + + Dim nI As Integer + Dim sKey As String + + If bNew Then cvwTranslateOrg.Clear + With cvwTranslate + .MoveFirst + Do While .Available + sKey = .Item.Key + If bNew Then + cvwTranslateOrg.Add(sKey, .Item[0]) + For ni = 1 To .Columns.Count - 1 + cvwTranslateOrg.Item[nI] = .Item[nI] + Next + Else + cvwTranslateOrg.MoveTo(sKey) + cvwTranslateOrg.Item[1] = .Item[1] + Endif + .MoveNext + Loop + End With + +End + +Private Sub UpdateStat() + + Dim sLang As String + + If $bStatValid Then Return + + Inc Application.Busy + + cvwLang.Header = True + + 'Shell "grep -c \"^msgid\" " & Shell$(Project.Dir &/ ".lang/.pot") To sRes + 'nTrans = Val(sRes) - 1 ' Remove the < msgid "" > line + + For Each sLang In Language.GetAll() + If Project.HasTranslation(sLang) Then + ComputeTransStat(sLang) + Endif + Next + + ' 'cvwLang.Resizable = True + ' For iCol = 0 To 3 + ' cvwLang.Columns[iCol].Width = -1 + ' Next + ' 'cvwLang.Resizable = False + ' + ' For iCol = 0 To 3 + ' iWidth += cvwLang.Columns[iCol].Width + ' Next + + $bStatValid = True + + Dec Application.Busy + +End + +Public Sub panLang_Resize() + + ResizeTable + +End + +Public Sub Form_Activate() + + ResizeTable + +End + +Public Sub cvwLang_Compare((Key) As String, OtherKey As String) + + Dim iVal, iOtherVal As Integer + Dim iComp As Integer + + iComp = String.Comp(cvwLang[Key][0], cvwLang[OtherKey][0]) + + Select Case cvwLang.Columns.Sort + + Case 1 + iVal = CInt(Trim$(Replace(cvwLang[Key][1], "%", ""))) + iOtherVal = CInt(Trim(Replace(cvwLang[OtherKey][1], "%", ""))) + If iVal > iOtherVal Then + iComp = 1 + Else If iVal < iOtherVal Then + iComp = -1 + Endif + + Case 2 + iComp = Sgn(CInt(Trim(cvwLang[Key][2])) - CInt(Trim(cvwLang[OtherKey][2]))) + + Case 3 + iComp = String.Comp(cvwLang[Key][3], cvwLang[OtherKey][3]) + + Case 4 + iVal = Stat(Language.GetPath(Key, "po")).Size + iOtherVal = Stat(Language.GetPath(OtherKey, "po")).Size + If iVal < iOtherVal Then + iComp = -1 + Else If iVal > iOtherVal Then + iComp = 1 + Endif + + End Select + +Finally + + cvwLang.Compare = iComp + +End + +Public Sub panTranslate_Arrange() + + ResizeTable + +End + +Public Sub tabTranslate_Click() + + If tabTranslate.Index = 1 Then UpdateStat + +End + +Public Sub chkBrowse_Click() + + dchImport.FileView.Enabled = chkBrowse.Value = 0 + +End + +Public Sub cmbLangSource_Click() + + SetLang($sLang) + +End + +Public Sub Form_Arrange() + + ResizeTable + +End + +Public Sub btnNextTranslated_Click() + + Dim sKey As String + + With cvwTranslate + + sKey = .Key + .MoveCurrent() + + Do + + .MoveBelow() + If Not .Available Then + .MoveFirst() + Endif + + If .Item[1] Then + .Item.EnsureVisible + .Item.Selected = True + Return + Endif + + If .Item.Key = sKey Then Return + + Loop + + End With + +End + +Public Sub btnPreviousTranslated_Click() + + Dim sKey As String + + With cvwTranslate + + sKey = .Key + .MoveCurrent() + + Do + + .MoveAbove() + If Not .Available Then + .MoveLast() + Endif + + If .Item[1] Then + .Item.EnsureVisible + .Item.Selected = True + Return + Endif + + If .Item.Key = sKey Then Return + + Loop + + End With + +End + + +Private Sub StripLang(sLang As String) As String + + Return Replace(sLang, "_", "-") + +End + + +Private Sub GetAutomaticTranslation(sText As String) As String + + Dim sLangSrc As String + Dim sLangDest As String + Dim sResult As String + Dim iPos As Integer + Dim iPos2 As Integer + Dim sDigit As String + Dim aText As String[] + Dim I As Integer + + Inc Application.Busy + + If cmbLangSource.Index > 0 Then + sLangSrc = Language.FromName(cmbLangSource.Text) + Else + sLangSrc = Project.DefaultLanguage + Endif + sLangSrc = StripLang(sLangSrc) + + sLangDest = StripLang(Language.FromName(cmbLang.Text)) + + aText = New String[] + + Do + + iPos = InStr(sText, "\\n") + If iPos = 0 Then + aText.Add(sText) + Break + Else + aText.Add(Left(sText, iPos - 1)) + sText = Mid$(sText, iPos + 2) + Endif + + Loop + + For I = 0 To aText.Max + + sText = aText[I] + If Not Trim(sText) Then Continue + + Do + iPos = InStr(sText, "&", iPos + 1) + If iPos = 0 Then Break + If IsDigit(Mid$(sText, iPos + 1, 1)) Then + sText = Left(sText, iPos - 1) & "[-" & Mid$(sText, iPos + 1, 1) & "-]" & Mid$(sText, iPos + 2) + Else If Mid$(sText, iPos + 1, 1) = "{" Then + iPos2 = InStr(sText, "}", iPos + 1) + If iPos2 Then + If IsDigit(Mid$(sText, iPos + 2, iPos2 - iPos - 1)) Then + sText = Left$(sText, iPos - 1) & "[-" & Mid$(sText, iPos + 2, iPos2 - iPos - 1) & "-]" & Mid$(sText, iPos2 + 1) + Endif + Endif + Endif + Loop + + Exec [$sTranslateShell, "-e", $sTranslateEngine, "-b", sText, sLangSrc & ":" & sLangDest] To sResult + + iPos = 0 + Do + iPos = InStr(sResult, "[-", iPos + 1) + If iPos = 0 Then Break + iPos2 = InStr(sResult, "-]", iPos + 1) + If iPos2 Then + sDigit = Trim(Mid$(sResult, iPos + 2, iPos2 - iPos - 2)) + If Len(sDigit) = 1 Then + sResult = Left(sResult, iPos - 1) & "&" & sDigit & Mid$(sResult, iPos2 + 2) + Else If Len(sDigit) > 1 Then + sResult = Left(sResult, iPos - 1) & "&{" & sDigit & "}" & Mid$(sResult, iPos2 + 2) + Endif + Endif + Loop + + aText[I] = Trim(sResult) + + Next + + sResult = aText.Join("\\n") + + Dec Application.Busy + + If sResult Then + If String.Left(sText) = String.UCase(String.Left(sText)) Then + sResult = String.UCaseFirst(sResult) + Else If String.Left(sText) = String.LCase(String.Left(sText)) Then + sResult = String.LCase(String.Left(sResult)) & String.Mid$(sResult, 2) + Endif + Endif + + Return sResult + +End + +Public Sub btnAutoTrans_Click() + + Dim sText As String + + sText = GetAutomaticTranslation(txtOrig.Text) + If Not sText Then + Message.Warning(("Automatic translation has failed.")) + Return + Endif + + txtTranslate.Text = sText + +End + +Public Sub mnuAutoTrans_Click() + + Dim sText As String + + If Message.Question(("Do you want to fill the translation automatically?"), ("Fill"), ("Cancel")) = 2 Then Return + + Inc Application.Busy + + cvwTranslate.MoveFirst + While cvwTranslate.Available + If Not cvwTranslate.Item[1] Then + cvwTranslate.Item.Selected = True + cvwTranslate.Item.EnsureVisible + Wait + sText = GetAutomaticTranslation(txtOrig.Text) + If Not sText Then + Message.Warning(("Automatic translation has failed.")) + Break + Endif + txtTranslate.Text = sText + Wait + Endif + cvwTranslate.MoveNext + Wend + + DisplayTrans + $bModify = True + SaveTranslate + + Dec Application.Busy + +End diff --git a/app/src/gambas3/.src/Translation/FTranslate.form b/app/src/gambas3/.src/Translation/FTranslate.form new file mode 100644 index 00000000..eef8fc85 --- /dev/null +++ b/app/src/gambas3/.src/Translation/FTranslate.form @@ -0,0 +1,347 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,116,76) + Text = ("Project translation") + Icon = Picture["icon:/small/language"] + Persistent = True + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + { mnuTranslation Menu + Visible = False + { mnuNew Menu + Text = Shortcut(("New"), "N") & "..." + Picture = Picture["icon:/small/new"] + } + { mnuReload Menu + Text = Shortcut(("Reload"), "R") + Picture = Picture["icon:/small/undo"] + } + { mnuDelete Menu + Text = Shortcut(("Delete"), "D") + Picture = Picture["icon:/small/delete"] + } + { Menu1 Menu + } + { mnuAutoTrans Menu + Text = ("Automatic translation") & "..." + Picture = Picture["icon:/small/fill"] + } + { Menu2 Menu + } + { mnuCopy Menu + Text = ("Copy") + Picture = Picture["icon:/small/copy"] + { mnuCopyUntranslated Menu + Text = Shortcut(("Untranslated strings"), "U") & "..." + } + { mnuCopyTranslated Menu + Text = Shortcut(("Translated strings"), "T") & "..." + } + { mnuCopyAll Menu + Text = Shortcut(("All strings"), "A") & "..." + } + } + { mnuExport Menu + Text = ("Export") + Picture = Picture["icon:/small/save-as"] + { mnuExportUntranslated Menu + Text = Shortcut(("Untranslated strings"), "U") & "..." + } + { mnuExportTranslated Menu + Text = Shortcut(("Translated strings"), "T") & "..." + } + { mnuExportAll Menu + Text = Shortcut(("All strings"), "A") & "..." + } + } + } + { tabTranslate TabPanel + MoveScaled(1,1,107,72) + Expand = True + Arrangement = Arrange.Vertical + Count = 3 + Index = 0 + Text = ("Translation") + { panTranslate VBox + MoveScaled(1,1,105,6) + Spacing = True + Margin = True + { HBox2 HBox + MoveScaled(1,0,102,4) + { btnMenu MenuButton + MoveScaled(0,0,6,4) + AutoResize = True + Picture = Picture["icon:/small/language"] + Border = False + Menu = "mnuTranslation" + MenuOnly = True + } + { cmbLangSource ComboBox + MoveScaled(6,0,21,4) + Expand = True + ReadOnly = True + Sorted = True + } + { PictureBox2 PictureBox + MoveScaled(28,0,4,4) + Picture = Picture["icon:/small/right"] + Alignment = Align.Center + } + { cmbLang ComboBox + MoveScaled(32,0,18,4) + Font = Font["Bold"] + Expand = True + ReadOnly = True + Sorted = True + } + { btnNew ToolButton mnuNew + Name = "btnNew" + MoveScaled(50,0,4,4) + ToolTip = ("Add a new translation") + Picture = Picture["icon:/small/add"] + } + { Panel8 Panel + MoveScaled(55,0,3,4) + } + { Label1 Label + MoveScaled(63,0,7,4) + AutoResize = True + Text = ("Show") + } + { Panel9 Panel + MoveScaled(72,0,1,4) + } + { cmbFileChoice ComboBox + MoveScaled(76,0,24,4) + Expand = True + ReadOnly = True + } + } + } + { Separator6 Separator + MoveScaled(30,8,10,0) + } + { panToolbar HBox + MoveScaled(3,10,91,4) + { btnSave ToolButton + MoveScaled(0,0,9,4) + ToolTip = ("Save translation") + AutoResize = True + Text = ("Save") + Picture = Picture["icon:/small/save"] + } + { btnVerify ToolButton + MoveScaled(12,0,11,4) + ToolTip = ("Verify the translation") + AutoResize = True + Text = ("Verify") + Picture = Picture["icon:/small/apply"] + } + { Separator7 Separator + MoveScaled(25,0,0,4) + } + { txtFind ButtonBox + MoveScaled(33,0,16,4) + Expand = True + Picture = Picture["icon:/16/find"] + Border = False + } + } + { Separator2 Separator + MoveScaled(21,15,11,0) + } + { VSplit1 VSplit + MoveScaled(1,17,98,44) + Expand = True + { cvwTranslate ColumnView + MoveScaled(7,2,70,8) + Expand = True + Sorted = True + Header = False + AutoResize = False + Border = False + ScrollBar = Scroll.Vertical + } + { VBox2 VBox + MoveScaled(3,15,85,28) + Expand = True + { panComment HBox + MoveScaled(7,0,11,4) + } + { Separator4 Separator + MoveScaled(0,4,15,0) + } + { Panel7 Panel + MoveScaled(1,6,40,6) + Expand = True + Arrangement = Arrange.Fill + Padding = 2 + { txtOrig TextArea + MoveScaled(0,0,39,5) + Background = Color.Transparent + ReadOnly = True + Wrap = True + Border = False + } + } + { Separator5 Separator + MoveScaled(3,13,15,0) + } + { panTransToolbar HBox + MoveScaled(1,15,82,4) + { btnNextTranslated ToolButton + MoveScaled(1,0,4,4) + ToolTip = ("Find next translated string") + Picture = Picture["icon:/small/down"] + } + { btnPreviousTranslated ToolButton + MoveScaled(5,0,4,4) + ToolTip = ("Find previous translated string") + Picture = Picture["icon:/small/up"] + } + { btnPreviousUntranslated ToolButton + MoveScaled(9,0,4,4) + ToolTip = ("Find previous untranslated string") + Picture = Picture["icon:/small/rewind"] + } + { btnNextUntranslated ToolButton + MoveScaled(13,0,4,4) + ToolTip = ("Find next untranslated string") + Picture = Picture["icon:/small/forward"] + } + { Separator9 Separator + MoveScaled(19,0,0,4) + } + { btnClear ToolButton + MoveScaled(21,0,4,4) + ToolTip = ("Clear this translation") + Picture = Picture["icon:/small/delete"] + } + { btnDoNotTranslate ToolButton + MoveScaled(25,0,4,4) + ToolTip = ("This string must not be translated") + Picture = Picture["icon:/small/warning"] + } + { btnCopy ToolButton + MoveScaled(29,0,4,4) + ToolTip = ("Copy untranslated string") + Picture = Picture["icon:/small/copy"] + } + { btnAutoTrans ToolButton + MoveScaled(34,0,23,4) + AutoResize = True + Text = ("Automatic translation") + Picture = Picture["icon:/small/fill"] + } + } + { Separator8 Separator + MoveScaled(1,20,15,0) + } + { Panel1 Panel + MoveScaled(1,21,40,6) + Background = Color.TextBackground + Expand = True + Arrangement = Arrange.Fill + Padding = 2 + { txtTranslate TextArea + MoveScaled(0,0,39,5) + Wrap = True + Border = False + } + } + } + } + { Separator1 Separator + MoveScaled(15,62,15,0) + } + { HBox6 Panel + MoveScaled(1,63,102,4) + Arrangement = Arrange.Horizontal + AutoResize = True + Spacing = True + Margin = True + { PictureBox3 PictureBox + MoveScaled(0,0,4,4) + AutoResize = True + Picture = Picture["icon:/medium/info"] + Alignment = Align.Center + } + { lblInfo Label + MoveScaled(11,0,9,3) + Expand = True + AutoResize = True + } + { btnOK Button + MoveScaled(83,0,18,4) + AutoResize = True + Text = Shortcut(("Close"), "C") + Picture = Picture["icon:/small/close"] + Cancel = True + } + } + Index = 1 + Text = ("Statistics") + { cvwLang ColumnView + MoveScaled(1,1,19,25) + Mouse = Mouse.Arrow + Expand = True + Mode = Select.None + Sorted = True + Header = False + Resizable = True + Border = False + ScrollBar = Scroll.Vertical + } + Index = 2 + Text = ("Import") + { dchImport DirChooser + MoveScaled(2,1,100,48) + Expand = True + Border = False + ShowFile = True + ShowDetailed = True + ShowSplitter = False + } + { Separator3 Separator + MoveScaled(19,51,16,0) + } + { HBox4 HBox + MoveScaled(1,55,100,10) + Spacing = True + Margin = True + { Panel4 VBox + MoveScaled(1,1,53,8) + AutoResize = True + { chkBrowse CheckBox + MoveScaled(0,0,33,4) + AutoResize = True + Text = ("Import all translations recursively") + } + { chkReplace CheckBox + MoveScaled(0,4,33,4) + AutoResize = True + Text = ("Replace existing translations") + } + } + { Panel5 Panel + MoveScaled(60,3,1,4) + Expand = True + } + { Panel3 VBox + MoveScaled(68,2,28,6) + AutoResize = True + Invert = True + { btnImport Button + MoveScaled(0,0,18,4) + ToolTip = ("Import a translation file") + AutoResize = True + Text = Shortcut(("Import"), "I") + Picture = Picture["icon:/small/open"] + } + } + } + Index = 0 + } +} diff --git a/app/src/gambas3/.src/Translation/Language.module b/app/src/gambas3/.src/Translation/Language.module new file mode 100644 index 00000000..8d04c347 --- /dev/null +++ b/app/src/gambas3/.src/Translation/Language.module @@ -0,0 +1,272 @@ +' Gambas module file + +Private Name As New Collection +Private EnglishName As New Collection + +Public Sub _init() + + Name["af"] = ("Afrikaans (South Africa)") + EnglishName["af"] = "Afrikaans" + + Name["ar"] = ("Arabic (Egypt)") + Name["ar_TN"] = ("Arabic (Tunisia)") + EnglishName["ar"] = "Arabic" + + Name["az"] = ("Azerbaijani (Azerbaijan)") + EnglishName["az"] = "Azerbaijani" + + Name["bg"] = ("Bulgarian (Bulgaria)") + EnglishName["bg"] = "Bulgarian" + + Name["ca"] = ("Catalan (Catalonia, Spain)") + 'Name["ca_ES"] = ("Catalan (Catalonia, Spain)") + EnglishName["ca"] = "Catalan" + + Name["cy"] = ("Welsh (United Kingdom)") + EnglishName["cy"] = "Welsh" + + Name["cs"] = ("Czech (Czech Republic)") + EnglishName["cs"] = "Czech" + + Name["da"] = ("Danish (Denmark)") + EnglishName["da"] = "Danish" + + Name["de"] = ("German (Germany)") + Name["de_BE"] = ("German (Belgium)") + EnglishName["de"] = "German" + + Name["el"] = ("Greek (Greece)") + EnglishName["el"] = "Greek" + + Name["en"] = ("English (common)") + Name["en_GB"] = ("English (United Kingdom)") + Name["en_US"] = ("English (U.S.A.)") + Name["en_AU"] = ("English (Australia)") + Name["en_CA"] = ("English (Canada)") + EnglishName["en"] = "English" + + Name["eo"] = ("Esperanto (Anywhere!)") + EnglishName["eo"] = "Esperanto" + + Name["es"] = ("Spanish (common)") + Name["es_ES"] = ("Spanish (Spain)") + Name["es_AR"] = ("Spanish (Argentina)") + EnglishName["es"] = "Spanish" + + Name["et_EE"] = ("Estonian (Estonia)") + EnglishName["et"] = "Estonian" + + Name["eu"] = ("Basque (Basque country)") + EnglishName["eu"] = "Basque" + + Name["fa"] = ("Farsi (Iran)") + EnglishName["fa"] = "Farsi" + + Name["fi"] = ("Finnish (Finland)") + EnglishName["fi"] = "Finnish" + + Name["fr"] = ("French (France)") + Name["fr_BE"] = ("French (Belgium)") + Name["fr_CA"] = ("French (Canada)") + Name["fr_CH"] = ("French (Switzerland)") + EnglishName["fr"] = "French" + + Name["gl_ES"] = ("Galician (Spain)") + EnglishName["gl"] = "Galician" + + Name["he"] = ("Hebrew (Israel)") + EnglishName["he"] = "Hebrew" + + Name["hi"] = ("Hindi (India)") + EnglishName["hi"] = "Hindi" + + Name["hu"] = ("Hungarian (Hungary)") + EnglishName["hu"] = "Hungarian" + + Name["hr"] = ("Croatian (Croatia)") + EnglishName["hr"] = "Croatian" + + Name["id"] = ("Indonesian (Indonesia)") + EnglishName["id"] = "Indonesian" + + Name["ir"] = ("Irish (Ireland)") + EnglishName["ir"] = "Irish" + + Name["is"] = ("Icelandic (Iceland)") + EnglishName["is"] = "Icelandic" + + Name["it"] = ("Italian (Italy)") + EnglishName["it"] = "Italian" + + Name["ja"] = ("Japanese (Japan)") + EnglishName["ja"] = "Japanase" + + Name["km"] = ("Khmer (Cambodia)") + EnglishName["km"] = "Khmer" + + Name["ko"] = ("Korean (Korea)") + EnglishName["ko"] = "Korean" + + Name["la"] = ("Latin") + EnglishName["la"] = "Latin" + + Name["lt"] = ("Lithuanian (Lithuania)") + EnglishName["lt"] = "Lithuanian" + + Name["ml"] = ("Malayalam (India)") + EnglishName["ml"] = "Malayalam" + + Name["mk"] = ("Macedonian (Republic of Macedonia)") + EnglishName["mk"] = "Macedonian" + + Name["nl"] = ("Dutch (Netherlands)") + Name["nl_BE"] = ("Dutch (Belgium)") + EnglishName["nl"] = "Dutch" + + Name["no"] = ("Norwegian (Norway)") + EnglishName["no"] = "Norwegian" + + Name["pa"] = ("Punjabi (India)") + EnglishName["pa"] = "Punjabi" + + Name["pl"] = ("Polish (Poland)") + EnglishName["pl"] = "Polish" + + Name["pt"] = ("Portuguese (Portugal)") + Name["pt_BR"] = ("Portuguese (Brazil)") + EnglishName["pt"] = "Portuguese" + + Name["qcv_ES"] = ("Valencian (Valencian Community, Spain)") + EnglishName["qcv"] = "Valencian" + + Name["ro"] = ("Romanian (Romania)") + EnglishName["ro"] = "Romanian" + + Name["ru"] = ("Russian (Russia)") + EnglishName["ru"] = "Russian" + + Name["sl"] = ("Slovenian (Slovenia)") + EnglishName["sl"] = "Slovenian" + + Name["sq"] = ("Albanian (Albania)") + EnglishName["sq"] = "Albanian" + + Name["sr"] = ("Serbian (Serbia & Montenegro)") + EnglishName["sr"] = "Serbian" + + Name["sv"] = ("Swedish (Sweden)") + EnglishName["sv"] = "Swedish" + + Name["tr"] = ("Turkish (Turkey)") + EnglishName["tr"] = "Turkish" + + Name["uk"] = ("Ukrainian (Ukrain)") + EnglishName["uk"] = "Ukrainian" + + Name["vi"] = ("Vietnamese (Vietnam)") + EnglishName["vi"] = "Vietnamese" + + Name["wa"] = ("Wallon (Belgium)") + EnglishName["wa"] = "Wallon" + + Name["zh"] = ("Simplified chinese (China)") + Name["zh_TW"] = ("Traditional chinese (Taiwan)") + EnglishName["zh"] = "Chinese" + +End + +Public Sub Find(Optional sLang As String, Optional cCol As Collection) As String + + Dim iPos As Integer + Dim sOrg As String + + If Not sLang Then sLang = System.Language + If Not cCol Then cCol = Name + + sOrg = sLang + + Do + + If cCol.Exist(sLang) Then Return sLang + + iPos = InStr(sLang, ".") + If iPos Then + sLang = Left$(sLang, iPos - 1) + Continue + Endif + + iPos = InStr(sLang, "_") + If iPos Then + sLang = Left$(sLang, iPos - 1) + Continue + Endif + + Return sOrg + + Loop + +End + +Public Function ToName(Optional sLang As String) As String + + Dim sName As String + + sLang = Find(sLang) + sName = Name[sLang] + + If sName Then + Return sName + Else + Return ("Unknown") & " (" & sLang & ")" + Endif + +End + +Public Function ToEnglishName(sLang As String) As String + + Return EnglishName[Find(sLang, EnglishName)] + +End + +Public Function FromName(sName As String) As String + + Dim sStr As String + + 'PRINT "sName = "; sName + + For Each sStr In Name + If sStr = sName Then Return Name.Key + Next + +End + +Public Function GetAll(Optional bCurrentOnly As Boolean) As String[] + + Dim aLang As New String[] + Dim sStr As String + + If bCurrentOnly Then + + For Each sStr In Dir(Project.Dir &/ ".lang", "*.po") + aLang.Add(File.BaseName(sStr)) + Next + + Else + + For Each sStr In Name + aLang.Add(Name.Key) + Next + + Endif + + aLang.Sort(gb.Language) + + Return aLang + +End + +Public Sub GetPath(sLang As String, sExt As String) As String + + Return Project.Dir &/ ".lang" &/ sLang & "." & sExt + +End diff --git a/app/src/gambas3/.src/Util.module b/app/src/gambas3/.src/Util.module new file mode 100644 index 00000000..d1c7efd8 --- /dev/null +++ b/app/src/gambas3/.src/Util.module @@ -0,0 +1,68 @@ +' Gambas module file + +Private Const REMOVE_ACC As String = "ÀÁÂÃÄÅ[A]àáâãäå[a]Æ[AE]æ[ae]Œ[OE]œ[oe]Ç[C]ç[c]ÈÉÊËẼ[E]èéêëẽ[e]ÌÍÎĨÏ[I]ìíîïĩ[i]ÑŃǸ[N]ñńǹ[n]ÒÓÔÕÖ[O]òóôõö[o]ÙÚÛÜ[U]ùúûü[u]ÝŸ[Y]ýÿ[y]ß[ss]°[]" + +Public Sub RemoveAccents(sStr As String) As String + + Dim iInd As Integer + Dim sCar As String + Dim iPos As Integer + Dim iPosL As Integer + Dim iPosR As Integer + Dim sNewStr As String + + If Not sStr Then Return + If IsAscii(sStr) Then Return sStr + + For iInd = 1 To String.Len(sStr) + sCar = String.Mid$(sStr, iInd, 1) + If Len(sCar) > 1 Then + iPos = InStr(REMOVE_ACC, sCar) + If iPos Then + iPosL = InStr(REMOVE_ACC, "[", iPos + 1) + iPosR = InStr(REMOVE_ACC, "]", iPos + 1) + If iPosL <> 0 And If iPosR <> 0 And If iPosL < iPosR Then + sCar = Mid$(REMOVE_ACC, iPosL + 1, iPosR - iPosL - 1) + Endif + Endif + Endif + sNewStr &= sCar + Next + + Return sNewStr + +End + +Public Sub GetFileSize(iSize As Long) As String + + If iSize < 1000 Then + Return Subst(("&1 B"), CStr(iSize)) + Else If iSize < 1000000 Then + Return Subst(("&1 KiB"), Format(iSize / 1024, "0.#")) + Else If iSize < 1000000000 Then + Return Subst(("&1 MiB"), Format(iSize / 1048576, "0.#")) + Else + Return Subst(("&1 GiB"), Format(iSize / 1073741824, "0.#")) + Endif + +End + +Public Sub Main() + + Dim A As Float + + Print Chr$(34); + For A = 0 To 6 + If A > 0 Then Print ";"; + Print CStr(Round(Cos(Pi(2) * A / 6), -10)); ","; CStr(Round(Sin(Pi(2) * A / 6), -10)); + Next + Print Chr$(34) + + Print "["; + For A = 0 To 6 + If A > 0 Then Print ","; + Print CStr(Round(Cos(Pi(2) * A / 6), -10)); ","; CStr(Round(Sin(Pi(2) * A / 6), -10)); + Next + Print "]" + +End diff --git a/app/src/gambas3/.src/Util/MErrorMessage.module b/app/src/gambas3/.src/Util/MErrorMessage.module new file mode 100644 index 00000000..66777977 --- /dev/null +++ b/app/src/gambas3/.src/Util/MErrorMessage.module @@ -0,0 +1,388 @@ +' Gambas module file + +'{ +Private Const ERR_001 As String = ("&1 cannot be static") +Private Const ERR_002 As String = ("&1 declaration does not match") +Private Const ERR_003 As String = ("&1 is declared but is not a function") +Private Const ERR_004 As String = ("&1 is not a structure") +Private Const ERR_005 As String = ("&1 is not declared") +Private Const ERR_006 As String = ("&1 must be static") +Private Const ERR_007 As String = ("&1: not in archive") +Private Const ERR_008 As String = ("&1: syntax error") +Private Const ERR_009 As String = ("&1: syntax error in form file") +Private Const ERR_010 As String = ("&1: too many nested containers") +Private Const ERR_011 As String = ("'&1' already declared") +Private Const ERR_012 As String = ("'&1.&2' is incorrectly overridden in class '&3'") +Private Const ERR_013 As String = ("'&1.&2' is not a property") +Private Const ERR_014 As String = ("'&1.&2' is not static") +Private Const ERR_015 As String = ("'&1.&2' is read only") +Private Const ERR_016 As String = ("'&1.&2' is static") +Private Const ERR_017 As String = ("'&1.&2' is write only") +Private Const ERR_018 As String = ("',' or ')'") +Private Const ERR_019 As String = ("A module cannot raise events") +Private Const ERR_020 As String = ("A property implementation cannot be public") +Private Const ERR_021 As String = ("A property must be public") +Private Const ERR_022 As String = ("Access forbidden") +Private Const ERR_023 As String = ("Alias name must be a string") +Private Const ERR_024 As String = ("Ambiguous expression. Please use brackets") +Private Const ERR_025 As String = ("Argument cannot be passed by reference") +Private Const ERR_026 As String = ("Arrays of structure are not supported") +Private Const ERR_027 As String = ("Assertion failed") +Private Const ERR_028 As String = ("Bad archive: &1: &2") +Private Const ERR_029 As String = ("Bad argument") +Private Const ERR_030 As String = ("Bad character constant in string") +Private Const ERR_031 As String = ("Bad constant type") +Private Const ERR_032 As String = ("Bad event handler in &1.&2(): &3") +Private Const ERR_033 As String = ("Bad expression: &1") +Private Const ERR_034 As String = ("Bad form file version") +Private Const ERR_035 As String = ("Bad format in section: ") +Private Const ERR_036 As String = ("Bad format string") +Private Const ERR_037 As String = ("Bad number of dimensions") +Private Const ERR_038 As String = ("Bad project file: line &1: &2") +Private Const ERR_039 As String = ("Bad regular expression: &1") +Private Const ERR_040 As String = ("Bad string conversion") +Private Const ERR_041 As String = ("Bad subscript range") +Private Const ERR_042 As String = ("Bad use of virtual class") +Private Const ERR_043 As String = ("Bad version string") +Private Const ERR_044 As String = ("Cannot change current directory to '&1': &2") +Private Const ERR_045 As String = ("Cannot create .startup file") +Private Const ERR_046 As String = ("Cannot create action file: &1") +Private Const ERR_047 As String = ("Cannot create callback: &1") +Private Const ERR_048 As String = ("Cannot create class information: &1: &2") +Private Const ERR_049 As String = ("Cannot create file: &1") +Private Const ERR_050 As String = ("Cannot create temporary archive file: &1") +Private Const ERR_051 As String = ("Cannot find dynamic library '&1': &2") +Private Const ERR_052 As String = ("Cannot find symbol '&2' in dynamic library '&1'") +Private Const ERR_053 As String = ("Cannot inherit itself") +Private Const ERR_054 As String = ("Cannot inherit twice") +Private Const ERR_055 As String = ("Cannot instantiate native types") +Private Const ERR_056 As String = ("Cannot load class '&1': &2&3") +Private Const ERR_057 As String = ("Cannot load component '&1': &2") +Private Const ERR_058 As String = ("Cannot load source file: &1") +Private Const ERR_059 As String = ("Cannot make executable: &1: &2") +Private Const ERR_060 As String = ("Cannot mix NEW and embedded array") +Private Const ERR_061 As String = ("Cannot mix NEW and embedded structure") +Private Const ERR_062 As String = ("Cannot open file '&1': &2") +Private Const ERR_063 As String = ("Cannot open file: &1") +Private Const ERR_064 As String = ("Cannot raise events in static function") +Private Const ERR_065 As String = ("Cannot read file: &1: &2") +Private Const ERR_066 As String = ("Cannot register class '&1'") +Private Const ERR_067 As String = ("Cannot remove file '&1': &2") +Private Const ERR_068 As String = ("Cannot rename file '&1' to '&2': &3") +Private Const ERR_069 As String = ("Cannot run child process: &1&2") +Private Const ERR_070 As String = ("Cannot set file owner: &1: &2") +Private Const ERR_071 As String = ("Cannot use &1 twice") +Private Const ERR_072 As String = ("Cannot use &1 with &2") +Private Const ERR_073 As String = ("Cannot use NEW operator there") +Private Const ERR_074 As String = ("Class '&1' is not creatable") +Private Const ERR_075 As String = ("Comparison operator expected") +Private Const ERR_076 As String = ("Component name must be a string") +Private Const ERR_077 As String = ("Component not found: &1") +Private Const ERR_078 As String = ("Constant string expected") +Private Const ERR_079 As String = ("Contents already declared") +Private Const ERR_080 As String = ("Default case already defined") +Private Const ERR_081 As String = ("Default case must be the last one") +Private Const ERR_082 As String = ("Device is full") +Private Const ERR_083 As String = ("Directory is not empty") +Private Const ERR_084 As String = ("Division by zero") +Private Const ERR_085 As String = ("Dynamic symbols cannot be used in static function") +Private Const ERR_086 As String = ("Embedded arrays are forbidden here") +Private Const ERR_087 As String = ("End of file") +Private Const ERR_088 As String = ("Equality or inequality operator expected") +Private Const ERR_089 As String = ("Expression too complex") +Private Const ERR_090 As String = ("Expression too complex. Too many operands") +Private Const ERR_091 As String = ("Extern library name must be a string") +Private Const ERR_092 As String = ("File already exists") +Private Const ERR_093 As String = ("File is a directory") +Private Const ERR_094 As String = ("File is locked") +Private Const ERR_095 As String = ("File name is too long") +Private Const ERR_096 As String = ("File or directory does not exist") +Private Const ERR_097 As String = ("Forbidden GOSUB") +Private Const ERR_098 As String = ("Forbidden GOTO") +Private Const ERR_099 As String = ("Free object referenced") +Private Const ERR_100 As String = ("Illegal instruction") +Private Const ERR_101 As String = ("Internal compiler error") +Private Const ERR_102 As String = ("Invalid assignment") +Private Const ERR_103 As String = ("Invalid date") +Private Const ERR_104 As String = ("Invalid object") +Private Const ERR_105 As String = ("Invalid path") +Private Const ERR_106 As String = ("IsMissing() requires a function argument") +Private Const ERR_107 As String = ("Jump is too far") +Private Const ERR_108 As String = ("Label '&1' not declared") +Private Const ERR_109 As String = ("Library name must be a string") +Private Const ERR_110 As String = ("Loop variable already in use") +Private Const ERR_111 As String = ("Loop variable cannot be an argument") +Private Const ERR_112 As String = ("Loop variable cannot be global") +Private Const ERR_113 As String = ("ME cannot be used in a static function") +Private Const ERR_114 As String = ("Mathematic error") +Private Const ERR_115 As String = ("Missing #Endif") +Private Const ERR_116 As String = ("Missing ']'") +Private Const ERR_117 As String = ("Missing '}'") +Private Const ERR_118 As String = ("Missing operator") +Private Const ERR_119 As String = ("Missing right brace") +Private Const ERR_120 As String = ("Multidimensional array") +Private Const ERR_121 As String = ("NEW cannot have arguments passed by reference") +Private Const ERR_122 As String = ("No instantiation method") +Private Const ERR_123 As String = ("No parent class") +Private Const ERR_124 As String = ("No return value") +Private Const ERR_125 As String = ("No startup method") +Private Const ERR_126 As String = ("Non terminated string") +Private Const ERR_127 As String = ("Not a directory: &1") +Private Const ERR_128 As String = ("Not a function") +Private Const ERR_129 As String = ("Not a procedure") +Private Const ERR_130 As String = ("Not an array") +Private Const ERR_131 As String = ("Not an enumeration") +Private Const ERR_132 As String = ("Not an object") +Private Const ERR_133 As String = ("Not enough argument to New()") +Private Const ERR_134 As String = ("Not enough arguments") +Private Const ERR_135 As String = ("Not enough arguments to &1()") +Private Const ERR_136 As String = ("Not implemented yet") +Private Const ERR_137 As String = ("Not supported") +Private Const ERR_138 As String = ("Null object") +Private Const ERR_139 As String = ("Number") +Private Const ERR_140 As String = ("Number or Date expected") +Private Const ERR_141 As String = ("Number or date") +Private Const ERR_142 As String = ("Number, Date or String") +Private Const ERR_143 As String = ("Number, String or Object") +Private Const ERR_144 As String = ("Object") +Private Const ERR_145 As String = ("Out of bounds") +Private Const ERR_146 As String = ("Out of memory") +Private Const ERR_147 As String = ("Out of range") +Private Const ERR_148 As String = ("Overflow") +Private Const ERR_149 As String = ("Overriding an already inherited class is forbidden") +Private Const ERR_150 As String = ("Read error") +Private Const ERR_151 As String = ("Read-only array") +Private Const ERR_152 As String = ("Return value datatype not specified in function declaration") +Private Const ERR_153 As String = ("STOP instruction encountered") +Private Const ERR_154 As String = ("SUPER cannot be used alone") +Private Const ERR_155 As String = ("Serialization error") +Private Const ERR_156 As String = ("Stack overflow") +Private Const ERR_157 As String = ("Standard type") +Private Const ERR_158 As String = ("Stream is closed") +Private Const ERR_159 As String = ("String expected") +Private Const ERR_160 As String = ("Structures must be public") +Private Const ERR_161 As String = ("Subroutine arguments cannot be passed by reference") +Private Const ERR_162 As String = ("Syntax error") +Private Const ERR_163 As String = ("Syntax error at function declaration") +Private Const ERR_164 As String = ("Syntax error in event name") +Private Const ERR_165 As String = ("Syntax error in file open mode") +Private Const ERR_166 As String = ("Syntax error in return type") +Private Const ERR_167 As String = ("Syntax error. &1 expected") +Private Const ERR_168 As String = ("Syntax error. '...' must be the last argument") +Private Const ERR_169 As String = ("Syntax error. CASE or DEFAULT expected after SELECT") +Private Const ERR_170 As String = ("Syntax error. CLASS needs an identifier") +Private Const ERR_171 As String = ("Syntax error. Cannot use this syntax in assignment") +Private Const ERR_172 As String = ("Syntax error. INHERITS needs a class name") +Private Const ERR_173 As String = ("Syntax error. Identifier expected") +Private Const ERR_174 As String = ("Syntax error. Identifier expected for property name") +Private Const ERR_175 As String = ("Syntax error. Identifier expected for property synonymous") +Private Const ERR_176 As String = ("Syntax error. Identifier expected for property variable") +Private Const ERR_177 As String = ("Syntax error. Invalid identifier in function name") +Private Const ERR_178 As String = ("Syntax error. Invalid optional parameter") +Private Const ERR_179 As String = ("Syntax error. Invalid property type") +Private Const ERR_180 As String = ("Syntax error. Invalid return type") +Private Const ERR_181 As String = ("Syntax error. Invalid type description of &1 argument") +Private Const ERR_182 As String = ("Syntax error. Invalid type description of &1 field") +Private Const ERR_183 As String = ("Syntax error. Needless arguments") +Private Const ERR_184 As String = ("Syntax error. Point syntax used outside of WITH / END WITH") +Private Const ERR_185 As String = ("Syntax error. STRUCT needs an identifier") +Private Const ERR_186 As String = ("Syntax error. The &1 argument is not a valid identifier") +Private Const ERR_187 As String = ("Syntax error. The &1 field is not a valid identifier") +Private Const ERR_188 As String = ("Syntax error. VarPtr() takes only one identifier") +Private Const ERR_189 As String = ("System error #&1: &2") +Private Const ERR_190 As String = ("The '!' operator must be followed by an identifier") +Private Const ERR_191 As String = ("The '.' operator must be followed by an identifier") +Private Const ERR_192 As String = ("The function must take a fixed number of arguments") +Private Const ERR_193 As String = ("The special method &1 cannot be a function") +Private Const ERR_194 As String = ("The special method &1 cannot be implemented") +Private Const ERR_195 As String = ("The special method &1 cannot be static") +Private Const ERR_196 As String = ("The special method &1 must be a function") +Private Const ERR_197 As String = ("The special method &1 must be public") +Private Const ERR_198 As String = ("The special method &1 must be static") +Private Const ERR_199 As String = ("The special method &1 must return a boolean") +Private Const ERR_200 As String = ("The special method &1 must take a variable number of arguments only") +Private Const ERR_201 As String = ("The special method &1 must take at least one argument") +Private Const ERR_202 As String = ("The special method &1 takes no arguments") +Private Const ERR_203 As String = ("The special method must return an integer") +Private Const ERR_204 As String = ("The special method must take exactly one argument") +Private Const ERR_205 As String = ("The special method must take exactly two arguments") +Private Const ERR_206 As String = ("The special method signature is incorrect") +Private Const ERR_207 As String = ("This expression cannot be a statement") +Private Const ERR_208 As String = ("This expression cannot be passed by reference") +Private Const ERR_209 As String = ("Too many arguments") +Private Const ERR_210 As String = ("Too many arguments to &1()") +Private Const ERR_211 As String = ("Too many array declarations") +Private Const ERR_212 As String = ("Too many constants") +Private Const ERR_213 As String = ("Too many different classes used") +Private Const ERR_214 As String = ("Too many dimensions") +Private Const ERR_215 As String = ("Too many dynamic variables") +Private Const ERR_216 As String = ("Too many events") +Private Const ERR_217 As String = ("Too many expressions in CASE") +Private Const ERR_218 As String = ("Too many external functions") +Private Const ERR_219 As String = ("Too many functions") +Private Const ERR_220 As String = ("Too many imbricated #If...#Endif") +Private Const ERR_221 As String = ("Too many labels") +Private Const ERR_222 As String = ("Too many local variables") +Private Const ERR_223 As String = ("Too many nested control structures.") +Private Const ERR_224 As String = ("Too many property synonymous") +Private Const ERR_225 As String = ("Too many simultaneous new strings") +Private Const ERR_226 As String = ("Too many static variables") +Private Const ERR_227 As String = ("Too many unknown symbols") +Private Const ERR_228 As String = ("Trailing backslash") +Private Const ERR_229 As String = ("Type mismatch") +Private Const ERR_230 As String = ("Type mismatch: wanted &1, got &2 instead") +Private Const ERR_231 As String = ("Unable to create closure") +Private Const ERR_232 As String = ("Unable to get file position") +Private Const ERR_233 As String = ("Unable to load class file") +Private Const ERR_234 As String = ("Unable to prepare function description") +Private Const ERR_235 As String = ("Unexpected &1") +Private Const ERR_236 As String = ("Unexpected end of line") +Private Const ERR_237 As String = ("Unexpected string") +Private Const ERR_238 As String = ("Unknown class '&1'") +Private Const ERR_239 As String = ("Unknown error") +Private Const ERR_240 As String = ("Unknown file extension") +Private Const ERR_241 As String = ("Unknown identifier: &1") +Private Const ERR_242 As String = ("Unknown operator") +Private Const ERR_243 As String = ("Unknown symbol '&2' in class '&1'") +Private Const ERR_244 As String = ("Unknown user or group") +Private Const ERR_245 As String = ("Unsupported datatype") +Private Const ERR_246 As String = ("Unsupported string conversion") +Private Const ERR_247 As String = ("Useless LOCK") +Private Const ERR_248 As String = ("VarPtr() argument must be a dynamic, a static or a local variable") +Private Const ERR_249 As String = ("Void identifier") +Private Const ERR_250 As String = ("Void key") +Private Const ERR_251 As String = ("Write error") +Private Const ERR_252 As String = ("cannot find component") +Private Const ERR_253 As String = ("cannot find library") +Private Const ERR_254 As String = ("class name hidden by global declaration: &1") +Private Const ERR_255 As String = ("class name hidden by local declaration: &1") +Private Const ERR_256 As String = ("constant hidden by local declaration: &1") +Private Const ERR_257 As String = ("extern function hidden by local declaration: &1") +Private Const ERR_258 As String = ("function hidden by local declaration: &1") +Private Const ERR_259 As String = ("global variable hidden by local declaration: &1") +Private Const ERR_260 As String = ("integer and boolean mixed with `&1' operator") +Private Const ERR_261 As String = ("uninitialized global variable: &1") +Private Const ERR_262 As String = ("uninitialized variable: &1") +Private Const ERR_263 As String = ("unknown error") +Private Const ERR_264 As String = ("unused argument: &1") +Private Const ERR_265 As String = ("unused extern function: &1") +Private Const ERR_266 As String = ("unused function: &1") +Private Const ERR_267 As String = ("unused global variable: &1") +Private Const ERR_268 As String = ("unused variable: &1") +'} + +' E_CHILD specific errors, updated by hand +Private Const ERR_CHILD_1 As String = ("cannot open slave pseudo-terminal: ") +Private Const ERR_CHILD_2 As String = ("cannot initialize pseudo-terminal: ") +Private Const ERR_CHILD_3 As String = ("cannot plug standard input: ") +Private Const ERR_CHILD_4 As String = ("cannot plug standard output and standard error: ") +Private Const ERR_CHILD_5 As String = ("cannot run executable: ") + + +Private $aErr As String[] + +Private Sub AddError(sErr As String) + + If Not Trim(sErr) Then Return + If UCase(sErr) = sErr Then Return + If $aErr.Exist(sErr) Then Return + $aErr.Add(sErr) + +End + +Public Sub Main() + + Dim sErr As String + Dim hFile As File + Dim sLine As String + Dim iPos, iPos2 As Integer + Dim sGrep As String + Dim iInd As Integer + Dim sData As String + Dim sPath As String + Dim bIgnore As Boolean + Dim sRoot As String + + $aErr = New String[] + + sRoot = "~/gambas/git/master" + + For Each sPath In [sRoot &/ "main/gbx/gb_error.c", sRoot &/ "main/gbc/gb_error.c"] + + hFile = Open sPath + While Not Eof(hFile) + Line Input #hFile, sLine + If InStr(sLine, "const char *const _message[") Then Break + Wend + + Line Input #hFile, sLine + Do + Line Input #hFile, sLine + iPos = InStr(sLine, Chr$(34)) + If iPos = 0 Then Break + iPos2 = InStr(sLine, Chr$(34), iPos + 1) + sErr = Mid$(sLine, iPos + 1, iPos2 - iPos - 1) + If Left(sErr) = "." Then sErr = Mid$(sErr, 3) + AddError(sErr) + Loop + + Close #hFile + + Next + + Shell "cd " & sRoot &/ "main" & "; grep -h \"THROW(\" gbc/*.c share/*.h gbx/*.c" To sGrep + + For Each sLine In Split(sGrep, "\n") + sLine = Trim(sLine) + If Not sLine Then Continue + If Left(sLine, 2) = "//" Then Continue + iPos = InStr(sLine, "THROW(") + sLine = Mid$(sLine, iPos) + While sLine + iPos = InStr(sLine, Chr$(34)) + If iPos = 0 Then Break + bIgnore = Mid$(sLine, iPos - 2, 2) = "$(" + iPos2 = InStr(sLine, Chr$(34), iPos + 1) + sErr = Mid$(sLine, iPos + 1, iPos2 - iPos - 1) + sLine = Mid$(sLine, iPos2 + 1) + If Not bIgnore Then AddError(sErr) + Wend + Next + + Shell "cd " & sRoot &/ "main" & "; grep -h \"COMPILE_print(MSG_WARNING,\" gbc/*.c" To sGrep + + For Each sLine In Split(sGrep, "\n") + sLine = Trim(sLine) + If Not sLine Then Continue + If Left(sLine, 2) = "//" Then Continue + iPos = InStr(sLine, "COMPILE_print(") + sLine = Mid$(sLine, iPos) + While sLine + iPos = InStr(sLine, Chr$(34)) + If iPos = 0 Then Break + 'If Mid$(sLine, iPos - 1, 1) <> "(" Then Continue + iPos2 = InStr(sLine, Chr$(34), iPos + 1) + sErr = Mid$(sLine, iPos + 1, iPos2 - iPos - 1) + sLine = Mid$(sLine, iPos2 + 1) + AddError(sErr) + Wend + Next + + $aErr.Sort + + For iInd = 0 To $aErr.Max + $aErr[iInd] = "Private Const ERR_" & Format(iInd + 1, "000") & " As String = (" & Quote($aErr[iInd]) & ")" + Print $aErr[iInd] + Next + + sPath = sRoot &/ "app/src/gambas3/.src/Util/MErrorMessage.module" + sData = File.Load(sPath) + iPos = InStr(sData, "\n'{\n") + If iPos = 0 Then Return + iPos2 = InStr(sData, "\n'}\n", iPos + 1) + If iPos = 0 Then Return + sData = Left(sData, iPos + 3) & $aErr.Join("\n") & Mid$(sData, iPos2) + File.Save(sPath, sData) + +End + diff --git a/app/src/gambas3/.src/Util/MRemoveAccents.module b/app/src/gambas3/.src/Util/MRemoveAccents.module new file mode 100644 index 00000000..da9979d9 --- /dev/null +++ b/app/src/gambas3/.src/Util/MRemoveAccents.module @@ -0,0 +1,69 @@ +' Gambas module file + +Private Const NO_ACCENTS As String = "AEIOUYBCDFGHJKLMNPQRSTVWXZaeiouybcdfghjklmnpqrstvwxz" + +Public Sub Main() + + Dim hFont As Font = Font["Gambas,9"] + Dim WC As Integer = hFont.TextWidth(" ") + Dim hImage As New Image(WC * 2, hFont.Height, Color.White) + Dim iCode As Integer + Dim iComp As Integer + Dim X As Integer + Dim iScore As Integer + Dim aScore As New Integer[52] + Dim aAccent As New String[52] + Dim iBest As Integer + Dim Y As Integer + Dim I As Integer + + 'For iCode = 65 To 687 + For iCode = 7680 To 7935 + + Print Format(iCode, "###");; String.Chr(iCode);; + iBest = 1024 + + For iComp = 1 To 52 + + hImage.Fill(Color.White) + Paint.Begin(hImage) + Paint.Font = hFont + Paint.DrawText(Mid$(NO_ACCENTS, iComp, 1) & String.Chr(iCode), 0, 0, WC * 2, hImage.H, Align.TopLeft) + Paint.End + + iScore = 0 + For Y = 0 To hImage.H - 1 + For X = 0 To WC - 1 + If hImage[X, Y] <> hImage[X + WC, Y] Then + Inc iScore + If hImage[X, Y] = Color.Black Then Inc iScore + Endif + Next + Next + + aScore[iComp - 1] = iScore + If iScore < iBest Then iBest = iScore + + Next + + For iComp = 1 To 52 + If aScore[iComp - 1] = iBest Then + Print Mid$(NO_ACCENTS, iComp, 1); + aAccent[iComp - 1] &= String.Chr(iCode) + Break + Endif + Next + + Print + + Next + + For I = 1 To 52 + + Print aAccent[I - 1]; "["; Mid$(NO_ACCENTS, I, 1); "]"; + + Next + Print + + +End diff --git a/app/src/gambas3/.src/Util/MSdlDefaultFont.module b/app/src/gambas3/.src/Util/MSdlDefaultFont.module new file mode 100644 index 00000000..2086a2c1 --- /dev/null +++ b/app/src/gambas3/.src/Util/MSdlDefaultFont.module @@ -0,0 +1,85 @@ +' Gambas module file + +Public Sub Main() + + Dim hFont As Font = Font["Gambas,10"] + Dim hImage As New Image(hFont.TextWidth(" "), hFont.Height, Color.White) + Dim C As Integer + Dim Y As Integer + Dim X As Integer + Dim V As Integer + Dim hFile As File + + hFile = Open "~/gambas/git/master/gb.sdl2/src/default_font_data.h" For Create + Output To #hFile + + Print "#define DEFAULT_FONT_WIDTH "; hImage.W + Print "#define DEFAULT_FONT_HEIGHT "; hImage.H + Print "#define DEFAULT_FONT_ASCENT "; 10 + Print "#define DEFAULT_FONT_DESCENT "; 3 + Print + Print "const char _default_font_33_126[] = {" + For C = 33 To 126 + GoSub WRITE_CHAR + Next + Print "};" + + Print + Print "const char _default_font_160_687[] = {" + For C = 160 To 687 + GoSub WRITE_CHAR + Next + Print "};" + + + Print + Print "const char _default_font_880_1319[] = {" + For C = 880 To 1319 + GoSub WRITE_CHAR + Next + Print "};" + + ' Print + ' Print "typedef" + ' Print " struct {" + ' Print " int start;" + ' Print " int end;" + ' Print " char *data;" + ' Print " }" + ' Print "FONT_SLICE;" + ' Print + ' Print "FONT_SLICE _default_font[] = {" + ' Print " { 32, 126, _default_font_32_136 }," + ' Print " { 160, 687, _default_font_160_687 }," + ' Print " { 0 }" + ' Print "};" + + Output To Default + Close #hFile + + Return + +WRITE_CHAR: + + hImage.Fill(Color.White) + Paint.Begin(hImage) + Paint.Background = Color.Black + Paint.Font = hFont + Paint.DrawText(String.Chr$(C), 0, 0, hImage.W, hImage.H, Align.TopLeft) + Paint.End + + Print " "; + For Y = 0 To hImage.H - 1 + V = 0 + For X = 0 To hImage.W - 1 + If hImage[X, Y] <> Color.White Then V += Shl(1, X) + Next + If Y Then Print ", "; + Print "0x"; Hex$(V, 2); + Next + + Print "," + + Return + +End diff --git a/app/src/gambas3/.src/VersionControl/CVersionControl.class b/app/src/gambas3/.src/VersionControl/CVersionControl.class new file mode 100644 index 00000000..41b90937 --- /dev/null +++ b/app/src/gambas3/.src/VersionControl/CVersionControl.class @@ -0,0 +1,118 @@ +' Gambas class file + +Create Static + +Public Const Name As String = "" +Public Const LongName As String = "" +Public Const DoNotPush As Boolean = False +Public Const CancelUpdate As Boolean = False +Public Const NeedMove As Boolean = True + +Public Sub AddFile((sPath) As String, Optional (bForce) As Boolean) + +End + +Public Sub AddDir((sPath) As String) + +End + +Public Sub RemoveFile((sPath) As String, Optional (bForce) As Boolean) + +End + +Public Sub RemoveDir((sPath) As String) + +End + +Public Sub MoveFile((sOld) As String, (sNew) As String) + +End + +Public Sub MoveDir((sOld) As String, (sNew) As String) As Boolean + +End + +Public Sub CheckPaths() + +End + +Public Sub UpdatePath((sPath) As String, Optional (sPath2) As String) + +End + +Public Sub Status(Optional (sPath) As String) As String + +End + +Public Sub Commit((sChange) As String, (bDoNotPush) As Boolean) As Boolean + +End + +Public Sub Update() As Integer + +End + +Public Sub Revert(Optional (sPath) As String) As Boolean + +End + +Public Sub InConflict((sPath) As String) As Boolean + +End + +Public Sub SolveConflict((sPath) As String, Optional (iAccept) As Integer) As Boolean + +End + +Public Sub GetVersion((sDir) As String) As String + +End + +Public Sub Diff((sPath) As String, Optional (bFull) As Boolean) As String + +End + +Public Sub History((sPath) As String, Optional (bFull) As Boolean) As String + +End + +Public Sub HighlightHistory((sText) As String) + +End + + +Public Sub Info() As Collection + +End + +Public Sub CleanUp((sPath) As String) + +End + +Public Sub GetBranches(ByRef (sCurrent) As String) As String[] + +End + +Public Sub GetCurrentBranch() As String + +End + +Public Sub GetDefaultJournal() As String + +End + +Public Sub SetBranch((sBranch) As String) + +End + +Public Sub CanControlProject() As Boolean + +End + +Public Sub ControlProject() As Boolean + +End + +Public Sub HasRemote() As Boolean + +End diff --git a/app/src/gambas3/.src/VersionControl/CVersionControlGit.class b/app/src/gambas3/.src/VersionControl/CVersionControlGit.class new file mode 100644 index 00000000..7d995c7d --- /dev/null +++ b/app/src/gambas3/.src/VersionControl/CVersionControlGit.class @@ -0,0 +1,497 @@ +' Gambas class file + +Inherits CVersionControl +Create Static + +Public Const Name As String = "Git" +Public Const LongName As String = "Git" +Public Const DoNotPush As Boolean = True +Public Const CancelUpdate As Boolean = True +Public Const NeedMove As Boolean = False + +Private $aConflict As String[] = ["DD", "AU", "UD", "UA", "DU", "AA", "UU"] + +Private $bHasGit As Boolean +Private $bCheckGit As Boolean +Private $sRoot As String +Private $bCanControl As Boolean +Private $bCanInit As Boolean +Private $bHasRemote As Boolean +Private $iPadHistory As Integer + +Private Sub Init() + + If $bCheckGit Then Return + + $bHasGit = System.Exist("git") + $bCheckGit = True + +End + +Private Sub RunShell(sCmd As String, Optional bSilent As Boolean) As String + + Return VersionControl.Shell("cd " & Shell(Project.Dir) & " && " & sCmd, bSilent) + +End + + +Public Sub Check() As Boolean + + Dim sResult As String + + Init() + + If $bHasGit Then + + sResult = RunShell("git status --porcelain .project") + + If Process.LastValue Then + $bCanInit = True + $bCanControl = False + Else + $bCanInit = False + $bCanControl = sResult Begins "??" + + If Not $bCanControl Then + sResult = RunShell("git rev-parse --show-toplevel") + If Process.LastValue = 0 Then + $sRoot = Trim(sResult) + $bHasRemote = RunShell("git remote show") + Return True + Endif + Endif + + Endif + + Endif + +End + +Public Sub GetBranches(ByRef sCurrent As String) As String[] + + Dim sResult As String + Dim sBranch As String + Dim aBranches As New String[] + Dim bCurrent As Boolean + + sResult = RunShell("git branch -a", True) + + For Each sBranch In Split(Trim(sResult), "\n") + + sBranch = Trim(sBranch) + If sBranch Begins "*" Then + + sBranch = Trim(Mid$(sBranch, 2)) + bCurrent = True + Else + bCurrent = False + If sBranch Begins "+ " Then sBranch = Mid$(sBranch, 3) + Endif + + If sBranch Begins "remotes/origin/" Then + sBranch = Mid$(sBranch, 16) + If InStr(sBranch, " -> ") Then Continue + Endif + + If bCurrent Then sCurrent = sBranch + + If Not aBranches.Exist(sBranch) Then aBranches.Add(sBranch) + + Next + + aBranches.Sort(gb.Natural) + + Return aBranches + +End + +Public Sub GetCurrentBranch() As String + + Dim sCurrent As String + + GetBranches(ByRef sCurrent) + If sCurrent = "master" Then sCurrent = "" + Return sCurrent + +End + +Public Sub Diff(sPath As String, Optional bFull As Boolean) As String + + Dim sDiff As String + Dim sCmd As String + Dim sHead As String + Dim sFull As String + Dim iPos As Integer + + 'If VersionControl.Shell("cd " & Shell(Project.Dir) & " && git log -1", True) Then + If RunShell("git log -1", True) Then + sHead = "HEAD" + Else + sHead = "--staged" + Endif + + If bFull Then sFull = " -U100000" + + If IsDir(sPath) Then + sCmd = "cd " & Shell(sPath) & " && git diff" & sFull & " " & sHead & " ." + Else + sCmd = "cd " & Shell(File.Dir(sPath)) & " && git diff" & sFull & " " & sHead & " " & Shell(File.Name(sPath)) + Endif + + sDiff = VersionControl.Shell(sCmd) + + If bFull Then + iPos = InStr(sDiff, "@@\n") + If iPos Then + sDiff = Mid$(sDiff, iPos + 3) + Else + sDiff = "" + Endif + Endif + + Return sDiff + +End + +Public Sub History(sPath As String, Optional (bFull) As Boolean) As String + + Dim sCmd As String + + If IsDir(sPath) Then + sCmd = "cd " & Shell(sPath) & " && git log --date=rfc2822 ." + Else + sCmd = "cd " & Shell(File.Dir(sPath)) & " && git log --date=rfc2822 " & Shell(File.Name(sPath)) + Endif + + Return VersionControl.Shell(sCmd) + +End + +Public Sub Status(Optional sPath As String) As String + + Dim sStatus As String + + If Not sPath Then sPath = Project.Dir + sStatus = VersionControl.Shell("cd " & Shell$(sPath) & " && git status .", True) + Return sStatus + +End + +Public Sub GetDefaultJournal() As String + + Dim aStatus As String[] + Dim I As Integer + + aStatus = Split(Status(Project.Dir), "\n") + For I = 0 To aStatus.Max + aStatus[I] = "# " & aStatus[I] + Next + + Return "# " & VersionControl.GetDelimChange() & "\n#\n" & aStatus.Join("\n") + +End + +Public Sub Update() As Integer + + Dim aEnv As String[] + + aEnv = VersionControl.LANG_ENV.Copy() + aEnv.Add("PWD=" & Project.Dir) + + VersionControl.Run(["git", "remote", "update", "origin", "--prune"], True, True, aEnv) + + Return VersionControl.Run(["git", "pull", "-q"], True, True, aEnv) + +End + +' Public Sub UpdatePath(aPath As String[]) +' +' Dim sStatus As String +' Dim sCmd As String +' Dim sPath As String +' +' sCmd = "cd " & Shell$(Project.Dir) & " && git status -uall --porcelain -z" +' For Each sPath In aPath +' sCmd &= " " & Mid$(sPath, Len(Project.Dir) + 2) +' Next +' +' sStatus = VersionControl.Shell(sCmd, True) +' UpdatePathFromStatus(sStatus) +' +' End + +Public Sub CheckPaths() + + Dim sStatus As String + + 'sStatus = VersionControl.Shell("cd " & Shell$(Project.Dir) & " && git status -uall --porcelain -z .", True) + sStatus = RunShell("git status -uall --porcelain -z .", True) + UpdatePathFromStatus(sStatus) + +End + +Private Sub UpdatePathFromStatus(sStatus As String) + + Dim sFile As String + Dim sPath As String + + For Each sStatus In Split(sStatus, Chr$(0), "", True) + + sFile = Mid$(sStatus, 4) + sPath = $sRoot &/ sFile + If sPath Not Begins Project.Dir Then Continue + + If sStatus Begins "??" Then + Project.SetFlag(sPath, Project.FLAG_ADDED) + Else If $aConflict.Exist(Left(sStatus, 2)) Then + Project.SetFlag(sPath, Project.FLAG_CONFLICT) + Else If InStr("MDR", Mid$(sStatus, 2, 1)) Or If InStr("AMR", Left(sStatus)) Then + Project.SetFlag(sPath, Project.FLAG_MODIFIED) + Endif + + Next + +End + +Public Sub AddFile(sPath As String, Optional (bForce) As Boolean) + + RunShell("git add " & Shell(sPath)) + +End + +Public Sub AddDir((sPath) As String) + + ' git does not track directories + ' AddFile(sPath) + +End + +Public Sub Revert(Optional sPath As String) As Boolean + + If sPath Then + RunShell("git checkout " & Shell(sPath)) + Else + RunShell("git checkout " & Shell(Project.Dir)) + Endif + +End + +Public Sub RemoveFile(sPath As String, Optional (bForce) As Boolean) + + RunShell("git rm " & Shell(sPath)) + +End + +Public Sub RemoveDir((sPath) As String) + + ' git does not track directories + ' RemoveFile(sPath) + +End + +Public Sub Commit(sChange As String, bDoNotPush As Boolean) As Boolean + + Dim sFile As String + Dim aEnv As String[] + + If sChange Then + sFile = Temp$() + File.Save(sFile, sChange) + 'VersionControl.Run(["git", "commit", "-F", sFile, Project.Dir], False, False, VersionControl.LANG_ENV) + RunShell("git commit -F " & Shell$(sFile) & " .") ', Project.Dir) + If Process.LastValue Then Return True + Endif + + If Not bDoNotPush And If $bHasRemote Then + + aEnv = VersionControl.LANG_ENV.Copy() + aEnv.Add("PWD=" & Project.Dir) + VersionControl.Run(["git", "push"], True, True, aEnv) + If Process.LastValue Then VersionControl.ShowError(("Unable to push the project.")) + + Endif + +End + +Public Sub Info() As Collection + + Dim cInfo As New Collection + Dim aResult As String[] + Dim sResult As String + Dim nModif As Integer + Dim sText As String + + cInfo[("Local root path")] = $sRoot + + aResult = Split(VersionControl.Shell("cd " & Shell(Project.Dir) & " && git log -n1"), "\n") + cInfo[("Last commit")] = Trim(Mid$(aResult[0], InStr(aResult[0], " ") + 1)) + cInfo[("Last commit author")] = Trim(Mid$(aResult[1], InStr(aResult[1], " ") + 1)) + cInfo[("Last commit date")] = Trim(Mid$(aResult[2], InStr(aResult[2], " ") + 1)) + + aResult = Split(RunShell("git branch -vv"), "\n") + For Each sResult In aResult + If sResult Begins "*" Then + aResult = Scan(sResult, "* * * [[]*] *") + If aResult.Count = 0 Then aResult = Scan(sResult, "* * *") + cInfo[("Current branch")] = aResult[1] + If aResult.Count >= 4 Then cInfo[("Origin")] = aResult[3] + Break + Endif + Next + + Try nModif = Split(Trim(RunShell("git status --porcelain")), "\n").Count + If nModif = 0 Then + sText = ("The current branch is up to date.") + Else If nModif = 1 Then + sText = ("One file to commit in the current branch.") + Else + sText = Subst(("&1 files to commit in the current branch."), nModif) + Endif + + If nModif Then + Try nModif = Split(Trim(RunShell("git status --porcelain " & Shell(Project.Dir))), "\n").Count + sText &= "\n" + If nModif = 0 Then + sText &= ("None in the current project.") + Else If nModif = 1 Then + sText &= ("One in the current project.") + Else + sText &= Subst(("&1 in the current project."), nModif) + Endif + Endif + + cInfo[("Status")] = sText + + aResult = Split(RunShell("git remote -vv"), "\n") + Try cInfo[("Remote repository URL")] = Scan(aResult[0], "* * *")[1] + + Return cInfo + +End + +Public Sub SetBranch(sBranch As String) + + RunShell("git checkout " & Shell(sBranch) & " 2>&1") + +End + +Public Sub MoveFile(sOld As String, sNew As String) + + RunShell("git mv " & Shell(sOld) & " " & Shell(sNew) & " && git add " & Shell(sNew)) + If Exist(sOld) And If Not Exist(sNew) Then Move sOld To sNew + +End + +Public Sub MoveDir(sOld As String, sNew As String) As Boolean + + MoveFile(sOld, sNew) + +End + +Public Sub UpdatePath(sPath As String, Optional sPath2 As String) + + Dim sStatus As String + Dim sCmd As String + + ' svn status is automatically recursive! + sCmd = "cd " & Shell$(Project.Dir) & "; git status -uall --porcelain -z " & Shell(Mid$(sPath, Len(Project.Dir) + 2)) + If sPath2 Then sCmd &= " " & Shell(Mid$(sPath2, Len(Project.Dir) + 2)) + + sStatus = VersionControl.Shell(sCmd, True) + UpdatePathFromStatus(sStatus) + +End + +Public Sub CanControlProject() As Boolean + + Return $bCanControl Or $bCanInit + +End + +Public Sub ControlProject() As Boolean + + If Not CanControlProject() Then Return True + + If $bCanInit Then + + If Message.Warning(("A new Git repository will be created for this project."), ("OK"), ("Cancel")) = 2 Then Return + + RunShell("git init && git add .") + If Process.LastValue Then Return True + + Else + + RunShell("git add .") + + Endif + +End + +Public Sub HasRemote() As Boolean + + Return $bHasRemote + +End + +Public Sub SolveConflict(sPath As String, Optional iAccept As Integer) As Boolean + + If iAccept Then + Select iAccept + Case VersionControl.ACCEPT_OURS + RunShell("git checkout --ours " & Shell$(sPath)) + Case VersionControl.ACCEPT_THEIRS + RunShell("git checkout --theirs " & Shell$(sPath)) + End Select + Return Process.LastValue + Endif + + RunShell("git add " & Shell$(sPath)) + If Process.LastValue Then Return True + + VersionControl.CheckPaths() + If Project.HasConflict Then Return + + 'FVersionControl.Run(True) + RunShell("git commit -m " & Shell$(("Solve conflict."))) ', Project.Dir) + +End + +Private Sub FormatDate(sDate As String) As String + + Dim dDate As Date + + Try dDate = Date.FromRFC822(sDate) + If Not dDate Then Return "?" + Return Format(dDate, gb.LongDate) + +End + +Public Sub HighlightHistory(Text As String) + + Dim iState As Integer + Dim iLen As Integer + + iState = TextHighlighter.State + iLen = String.Len(Text) + + TextHighlighter.Limit = False + + If $iPadHistory = 0 Then + $iPadHistory = Max(Max(String.Len(("Date")), String.Len(("Author"))), String.Len("Commit")) + Endif + + If Text Begins "commit " Then + TextHighlighter.TextAfter = String.PadRight("Commit", $iPadHistory) & " : " & Mid$(Text, 8) + TextHighlighter.Add(Highlight.DataType, String.Len(TextHighlighter.TextAfter)) + TextHighlighter.Limit = True + Else If Text Begins "Author: " Then + TextHighlighter.TextAfter = String.PadRight(("Author"), $iPadHistory) & " : " & Mid$(Text, 9) + TextHighlighter.Add(Highlight.Function, String.Len(TextHighlighter.TextAfter)) + Else If Text Begins "Date: " Then + TextHighlighter.TextAfter = String.PadRight(("Date"), $iPadHistory) & " : " & FormatDate(Mid$(Text, 7)) + TextHighlighter.Add(Highlight.Preprocessor, String.Len(TextHighlighter.TextAfter)) + Else + TextHighlighter.Add(Highlight.Normal, iLen) + Endif + +End diff --git a/app/src/gambas3/.src/VersionControl/CVersionControlSubversion.class b/app/src/gambas3/.src/VersionControl/CVersionControlSubversion.class new file mode 100644 index 00000000..a4b2b0e6 --- /dev/null +++ b/app/src/gambas3/.src/VersionControl/CVersionControlSubversion.class @@ -0,0 +1,377 @@ +' Gambas class file + +' TODO: Vérifier si la variable d'environnement EDITOR est bien disponible + +Inherits CVersionControl +Create Static + +Public Const Name As String = "Svn" +Public Const LongName As String = "Subversion" + +Private $sRealDir As String +Private $bHasSVN As Boolean +Private $bCheckSVN As Boolean +Private $sSvnVersion As String +Private $bSvn17 As Boolean +Private $bCanControl As Boolean + +Private Sub SvnPath$(sPath As String) As String + + If InStr(sPath, "@") Then sPath &= "@" + If sPath Begins Project.Dir Then sPath = $sRealDir &/ Mid$(sPath, Len(Project.Dir) + 1) + Return sPath + +End + +Private Sub Init() + + If $bCheckSVN Then Return + + $bHasSVN = System.Exist("svn") + $bCheckSVN = True + + If $bHasSVN Then + + If Not $sSvnVersion Then + Exec ["svn", "--version", "--quiet"] To $sSvnVersion + $sSvnVersion = Trim($sSvnVersion) + $bSvn17 = Comp($sSvnVersion, "1.7", gb.Natural) >= 0 + Endif + + Endif + +End + + +Public Sub Check() As Boolean + + Dim sResult As String + Dim sDir As String + + Shell "readlink -f " & Shell$(Project.Dir) To $sRealDir + $sRealDir = Trim($sRealDir) + + Init() + + If $bHasSVN Then + + $bCanControl = False + + If $bSvn17 Then + sResult = VersionControl.Shell("svn status " & Shell$(SvnPath$($sRealDir) &/ ".project") & " 2>&1") + If Process.LastValue = 0 And If sResult Not Like "svn:*W155007*:*" And If sResult Not Like "svn:*W155010*:*" Then Return True + Else + If Exist($sRealDir &/ ".svn") Then Return True + Endif + + If $bSvn17 Then + sDir = $sRealDir + Do + sDir = File.Dir(sDir) + If Exist(sDir &/ ".svn") Then + $bCanControl = True + Break + Endif + If sDir = "/" Then Break + Loop + Else + $bCanControl = Exist($sRealDir &/ "../.svn") + Endif + + Endif + +End + +Public Sub AddFile(sPath As String, Optional bForce As Boolean) + + Dim aCmd As String[] + + aCmd = ["svn", "add", SvnPath$(sPath)] + If bForce Then aCmd.Add("--force", 2) + VersionControl.Run(aCmd) + +End + +Public Sub AddDir(sPath As String) + + VersionControl.Run(["svn", "add", SvnPath$(sPath)]) + +End + +Public Sub RemoveFile(sPath As String, Optional (bForce) As Boolean) + + Dim aCmd As String[] + + aCmd = ["svn", "remove", SvnPath$(sPath), "--force"] + 'If bForce Then aCmd.Add("--force", 2) + VersionControl.Run(aCmd) + +End + +Public Sub RemoveDir(sPath As String) + + RemoveFile(sPath, True) + +End + +Public Sub MoveFile(sOld As String, sNew As String) + + AddFile(sNew) + RemoveFile(sOld, True) + +End + +Public Sub MoveDir(sOld As String, sNew As String) As Boolean + + VersionControl.Run(["svn", "move", "--force", SvnPath$(sOld), SvnPath$(sNew)]) + +End + +Private Sub UpdatePathFromStatus(sStatus As String) + + Dim sFile As String + Dim sExt As String + Dim sPath As String + + For Each sStatus In Split(sStatus, "\n") + + sFile = Mid$(sStatus, 9) + sPath = Project.Dir &/ sFile + + If Left(sStatus) = "D" Then + Project.SetFlag(sPath, Project.FLAG_LOCKED) + Else If Left(sStatus) = "C" Then + Project.SetFlag(sPath, Project.FLAG_CONFLICT) + Else If Left(sStatus) = "?" Then + If Left(File.Name(sFile)) = "." Then Continue + If sFile Begins ".lang/" Then Continue + If sFile Begins ".gambas/" Then Continue + If sFile = Project.Name & ".gambas" Then Continue + sExt = File.Ext(sFile) + If Left(sExt) = "r" And IsDigit(Mid$(sExt, 2)) And If Exist(Project.Dir &/ File.Dir(sFile) &/ File.BaseName(sFile)) Then Continue + Project.SetFlag(sPath, Project.FLAG_ADDED) + Else If Left(sStatus) <> " " Then + Project.SetFlag(sPath, Project.FLAG_MODIFIED) + Endif + + Next + +End + +Public Sub CheckPaths() + + Dim sStatus As String + + sStatus = VersionControl.Shell("cd " & Shell$($sRealDir) & "; svn status --no-ignore", True) + UpdatePathFromStatus(sStatus) + +End + +Public Sub Status(Optional sPath As String) As String + + Dim sStatus As String + Dim sCmd As String + + sCmd = "cd " & Shell$($sRealDir) & "; svn status -q" + If sPath Then sCmd &= " " & Shell$(SvnPath$(sPath)) + + sStatus = VersionControl.Shell(sCmd, True) + Return sStatus + +End + +Public Sub Commit(sChange As String, (bDoNotPush) As Boolean) As Boolean + + Dim sFile As String = Temp$() + + File.Save(sFile, sChange) + VersionControl.Run(["svn", "commit", "--file", sFile, SvnPath$($sRealDir)], True, False, VersionControl.LANG_ENV) + Return Process.LastValue + +End + +Public Sub Update() As Integer + + Return VersionControl.Run(["svn", "update", SvnPath$($sRealDir), "--accept", "postpone"], True) + +End + +Public Sub Revert(Optional sPath As String) As Boolean + + If sPath Then + VersionControl.Run(["svn", "revert", SvnPath$(sPath)]) + Else + VersionControl.Run(["svn", "-R", "revert", SvnPath$($sRealDir)]) + Endif + Return Process.LastValue + +End + +Public Sub InConflict(sPath As String) As Boolean + + If Not Exist(sPath) Then + Debug sPath; ": does not exist" + Return False + Endif + If Dir(File.Dir(sPath), File.Name(sPath) & ".r*").Count Then Return True + +End + +Public Sub SolveConflict(sPath As String, Optional iAccept As Integer) As Boolean + + Dim aArg As String[] + + Select Case iAccept + Case VersionControl.ACCEPT_OURS + aArg = ["svn", "resolve", SvnPath$(sPath), "--accept", "theirs-full"] + Case VersionControl.ACCEPT_THEIRS + aArg = ["svn", "resolve", SvnPath$(sPath), "--accept", "mine-full"] + Default + aArg = ["svn", "resolved", SvnPath$(sPath)] + End Select + + VersionControl.Run(aArg) + Return Process.LastValue + +End + +Public Sub Checkout(sPath As String, sDir As String) As Boolean + + VersionControl.Run(["svn", "checkout", SvnPath$(sPath), SvnPath$(sDir)], True) + +End + +Public Sub GetVersion(sDir As String) As String + + Dim sRes As String + + If Exist(sDir &/ ".svn") Then + sRes = VersionControl.Shell("cd " & Shell$(sDir) & "; " & VersionControl.LANG_ENV.Join(" ") & " svn info") + Try sRes = Scan(sRes, "*\nRevision: *\n*")[1] + If Error Then + Return "?" + Else + Return "r" & sRes + Endif + Endif + +End + +Public Sub Diff(sPath As String, Optional (bFull) As Boolean) As String + + Dim sDiff As String + + sDiff = VersionControl.Shell("svn diff " & Shell$(SvnPath$(sPath))) + Return sDiff + +End + +Public Sub History(sPath As String, Optional (bFull) As Boolean) As String + + Return VersionControl.Shell("svn log " & Shell$(SvnPath$(sPath))) + +End + +Private Sub FormatSvnDate(sDate As String) As String + + Dim aDate As String[] + + aDate = Split(sDate, "*-*-* *:*:* *") + Try Return Format(Date(CInt(aDate[0]), CInt(aDate[1]), CInt(aDate[2]), CInt(aDate[3]), CInt(aDate[4]), CInt(aDate[5])), gb.GeneralDate) + If Error Then Return sDate & " ?" + +End + +Public Sub Info() As Collection + + Dim sLine As String + Dim aLine As String[] + Dim sUrl As String + Dim cInfo As New Collection + Dim cData As New Collection + + If VersionControl.Run(["svn", "info", SvnPath$($sRealDir)], False, False, VersionControl.LANG_ENV) = 0 Then + + cData.Clear + For Each sLine In Split(VersionControl.Output, "\n", "", True) + aLine = Scan(sLine, "*: *") + 'If aLine[0] = "Repository Root" Then sUrl = Trim(aLine[1]) + cData[Trim(aLine[0])] = Trim(aLine[1]) + Next + + cInfo[("Local root path")] = cData["Working Copy Root Path"] + cInfo[("Revision")] = cData["Revision"] + cInfo[("Last commit author")] = cData["Last Changed Author"] + cInfo[("Last commit date")] = FormatSvnDate(cData["Last Changed Date"]) + sUrl = cData["Repository Root"] + + Endif + + If sUrl Then + + If VersionControl.Run(["svn", "info", SvnPath$(sUrl)], True, False, VersionControl.LANG_ENV) = 0 Then + + cData.Clear + For Each sLine In Split(VersionControl.Output, "\n", "", True) + aLine = Scan(sLine, "*: *") + cData[Trim(aLine[0])] = Trim(aLine[1]) + Next + + cInfo[("Remote repository URL")] = sURL + cInfo[("Remote revision")] = cData["Revision"] + cInfo[("Remote last commit author")] = cData["Last Changed Author"] + cInfo[("Remote last commit date")] = FormatSvnDate(cData["Last Changed Date"]) + + Endif + + Endif + + Return cInfo + +End + + +Public Sub CleanUp(sPath As String) + + VersionControl.Run(["svn", "cleanup", SvnPath$(sPath)]) + +End + +Public Sub GetDefaultJournal() As String + + Return VersionControl.GetDelimChange() & "\n\n" & Status() + +End + +Public Sub UpdatePath(sPath As String, Optional sPath2 As String) + + Dim sStatus As String + Dim sCmd As String + + ' svn status is automatically recursive! + sCmd = "cd " & Shell$($sRealDir) & "; svn status --no-ignore " & Shell(Mid$(sPath, Len(Project.Dir) + 2)) + If sPath2 Then sCmd &= " " & Shell(Mid$(sPath2, Len(Project.Dir) + 2)) + + sStatus = VersionControl.Shell(sCmd, True) + UpdatePathFromStatus(sStatus) + +End + +Public Sub CanControlProject() As Boolean + + Return $bCanControl + +End + +Public Sub ControlProject() As Boolean + + If Not $bCanControl Then Return True + If VersionControl.Run(["svn", "add", "--parents", SvnPath$($sRealDir)]) Then Return True + +End + +Public Sub HasRemote() As Boolean + + Return True + +End diff --git a/app/src/gambas3/.src/VersionControl/FConflict.class b/app/src/gambas3/.src/VersionControl/FConflict.class new file mode 100644 index 00000000..3a7f3102 --- /dev/null +++ b/app/src/gambas3/.src/VersionControl/FConflict.class @@ -0,0 +1,288 @@ +' Gambas class file + +Private $sPath As String +Private $sLoadedPath As String +Private $bModify As Boolean +Private $iType As Integer + +Private Const TYPE_TEXT As Integer = 0 +Private Const TYPE_IMAGE As Integer = 1 +Private Const TYPE_BINARY As Integer = 2 + +Public Sub Run(sPath As String) As Boolean + + If Message.Warning(Subst(("This file is in conflict. You must resolve the conflict in order to use the file again.")), ("&Edit"), ("Close")) = 2 Then Return + + $sPath = sPath + FConflict.ShowDialog + +End + + +Public Sub btnCut_Click() + + edtConflict.Cut + +End + +Public Sub btnCopy_Click() + + edtConflict.Copy + +End + +Public Sub btnPaste_Click() + + edtConflict.Paste + +End + +Public Sub btnUndo_Click() + + edtConflict.Undo + +End + +Public Sub btnRedo_Click() + + edtConflict.Redo + +End + +Public Sub btnIndent_Click() + + edtConflict.Indent + +End + +Public Sub btnUnindent_Click() + + edtConflict.Unindent + +End + +Public Sub btnClose_Click() + + Me.Close + +End + +Private Sub LoadFile(sPath As String) + + Inc Application.Busy + + If $iType = TYPE_TEXT Then + edtConflict.Load(sPath) + $bModify = False + edtConflict.SetFocus + Else + fprInfo.Hide + 'Else If $iType = TYPE_IMAGE Then + ' ivwImage.Image = Image.Load(sPath) + Endif + + fprInfo.Path = sPath + $sLoadedPath = sPath + + sPath = Mid$(sPath, Len(Project.Dir) + 1) + If Left(sPath) = "/" Then sPath = Mid$(sPath, 2) + lblPath.Text = sPath + panConflict_Arrange + ' + Dec Application.Busy + +Catch + + Application.Busy = 0 + Message.Error(("Unable to load file:") & "\n" & sPath & "\n\n" & Error.Text) + +End + +Private Sub GetFileType() As Integer + + Select Case String.LCase(File.Name($sPath)) + Case "changelog" + Return TYPE_TEXT + End Select + + Select Case LCase(File.Ext($sPath)) + + Case "class", "module", "test", "form", "text", "txt", "html", "css", "svg", "desktop", "inf" + Return TYPE_TEXT + + Case "jpg", "jpeg", "png", "gif", "xpm", "bmp" + Return TYPE_IMAGE + + End Select + + Return TYPE_BINARY + +End + + + +Public Sub Form_Open() + + Dim hTabPanel As TabPanel + Dim sFile As String + Dim hMenu As Menu + + 'Me.Title = Mid$($sPath, Len(Project.Dir) + 2) & " - " & ("Version conflict") + Me.Icon = Project.GetFileIcon($sPath) + + $iType = GetFileType() + + 'tabConflict[0].Visible = $iType = TYPE_TEXT + 'tabConflict[1].Visible = $iType = TYPE_IMAGE + + If $iType = TYPE_TEXT Then + fprInfo.Add(panEditor, ("Text")) + Else If $iType = TYPE_IMAGE Then + fprInfo.Add(panImage, ("Image")) + Endif + + hTabPanel = Container(fprInfo.Children[0]).Children[0] + hTabPanel.Index = hTabPanel.Count - 1 + + edtConflict.ReadConfig + edtConflict.Styles[Highlight.Comment].Bold = True + + hMenu = New Menu(mnuOpen) As "mnuOpen" + hMenu.Text = File.Name($sPath) + For Each sFile In Dir(File.Dir($sPath), File.Name($sPath) & ".*") + hMenu = New Menu(mnuOpen) As "mnuOpen" + hMenu.Text = sFile + Next + btnOpen.Menu = "mnuOpen" + + LoadFile($sPath) + + Settings.Read(Me) + +End + + +Public Sub edtConflict_Highlight(Text As String) + + Dim iState As Integer + + iState = TextHighlighter.State + + TextHighlighter.Limit = False + + If Text Begins "<<<<<<" Then + 'iPos = String.InStr(sText, " ") + TextHighlighter.Add(Highlight.Comment, String.Len(Text)) + 'Highlight.Add(Highlight.Keyword, String.Len(sText) - iPos) + TextHighlighter.State = Highlight.Number + TextHighlighter.Limit = True + Else If Text Begins "======" Then + TextHighlighter.Add(Highlight.Comment, String.Len(Text)) + TextHighlighter.State = Highlight.Function + Else If Text Begins ">>>>>>" Then + TextHighlighter.Add(Highlight.Comment, String.Len(Text)) + 'iPos = String.InStr(sText, " ") + 'Highlight.Add(Highlight.Comment, iPos) + 'Highlight.Add(Highlight.Keyword, String.Len(sText) - iPos) + TextHighlighter.State = Highlight.Normal + Else + TextHighlighter.Add(iState, String.Len(Text)) + Endif + +End + +Public Sub Form_Close() + + If $bModify Then + Select Case Message.Question(("The file has been modified.\nDo you really want to close the dialog?"), ("Close"), ("Cancel")) + Case 2 + Stop Event + Return + End Select + Endif + + If panConflict.Visible Then Settings.Write(Me) + +End + +Public Sub edtConflict_Change() + + $bModify = True + +End + +Public Sub btnSolve_Click() + + Dim iInd As Integer + Dim sText As String + + btnSave_Click + + For iInd = 0 To edtConflict.Count - 1 + sText = edtConflict[iInd].Text + If sText Begins "<<<<<<" Or If sText Begins "======" Or If sText Begins ">>>>>>" Then + edtConflict.GotoCenter(0, iInd) + Message.Warning(("Some conflicts are not yet resolved.")) + Return + Endif + Next + + If VersionControl.Resolve($sPath) Then + Message.Error(("Unable to resolve the conflict.")) + Return + Endif + + Me.Close + +End + +Public Sub btnSave_Click() + + Select $iType + Case TYPE_TEXT + edtConflict.Save($sPath) + $bModify = False + Default + If $sLoadedPath <> $sPath Then + Kill $sPath + Copy $sLoadedPath To $sPath + $bModify = False + Endif + End Select + +End + +Public Sub btnOpen_Click() + + If $iType = TYPE_TEXT Then + If $bModify Then + Select Case Message.Question(("The file has been modified.\nDo you really want to open another file?"), ("Open"), ("Cancel")) + Case 2 + Return + End Select + Endif + Endif + + Dialog.Path = $sPath + Dialog.Filter = [File.Name($sPath) & "*", ("Conflict files")] + Dialog.ShowHidden = True + If Dialog.OpenFile() Then Return + + LoadFile(Dialog.Path) + $bModify = True + +End + +Public Sub mnuOpen_Click() + + LoadFile(File.Dir($sPath) &/ Last.Text) + +End + +Public Sub panConflict_Arrange() + + lblPath.W = lblPath.Font.TextWidth(lblPath.Text) + 8 + lblPath.Move(panConflict.W - lblPath.W, 0) + lblPath.Raise + +End diff --git a/app/src/gambas3/.src/VersionControl/FConflict.form b/app/src/gambas3/.src/VersionControl/FConflict.form new file mode 100644 index 00000000..c5c3060f --- /dev/null +++ b/app/src/gambas3/.src/VersionControl/FConflict.form @@ -0,0 +1,121 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,102,74) + Text = ("Version conflict") + Icon = Picture["icon:/small/warning"] + Arrangement = Arrange.Vertical + { mnuOpen Menu + Visible = False + } + { panConflict VBox + MoveScaled(1,10,86,52) + Expand = True + Spacing = True + { fprInfo FileProperties + MoveScaled(2,2,54,21) + Expand = True + Border = False + } + { panImage Panel + MoveScaled(58,6,25,15) + Visible = False + Arrangement = Arrange.Fill + { imvImage ImageView + MoveScaled(2,2,16,10) + } + } + { panEditor Panel + MoveScaled(4,25,71,24) + Visible = False + Arrangement = Arrange.Vertical + { HBox4 HBox + MoveScaled(4,2,63,4) + { btnCut ToolButton + MoveScaled(4,0,4,4) + ToolTip = ("Cut") + Picture = Picture["icon:/small/cut"] + } + { btnCopy ToolButton + MoveScaled(8,0,4,4) + ToolTip = ("Copy") + Picture = Picture["icon:/small/copy"] + } + { btnPaste ToolButton + MoveScaled(12,0,4,4) + ToolTip = ("Paste") + Picture = Picture["icon:/small/paste"] + } + { btnUndo ToolButton + MoveScaled(16,0,4,4) + ToolTip = ("Undo") + Picture = Picture["icon:/small/undo"] + } + { btnRedo ToolButton + MoveScaled(20,0,4,4) + ToolTip = ("Redo") + Picture = Picture["icon:/small/redo"] + } + { btnIndent ToolButton + MoveScaled(24,0,4,4) + ToolTip = ("Indent") + Picture = Picture["icon:/small/indent"] + } + { btnUnindent ToolButton + MoveScaled(28,0,4,4) + ToolTip = ("Unindent") + Picture = Picture["icon:/small/unindent"] + } + { Panel2 Panel + MoveScaled(32,0,4,4) + Expand = True + } + } + { Separator1 Separator + MoveScaled(29,7,20,0) + } + { edtConflict TextEditor + MoveScaled(4,10,19,12) + Expand = True + Border = False + Highlight = "Custom" + } + } + { lblPath Label + MoveScaled(44,2,12,4) + Ignore = True + } + } + { panButton HBox + MoveScaled(1,64,96,6) + Spacing = True + Margin = True + { btnOpen MenuButton + MoveScaled(0,0,15,4) + ToolTip = ("Open") + AutoResize = True + Text = ("Open") & "..." + Picture = Picture["icon:/small/open"] + } + { btnSave Button + MoveScaled(22,0,16,4) + Text = Shortcut(("Save"), "S") + Picture = Picture["icon:/small/save-as"] + } + { Panel1 Panel + MoveScaled(48,0,3,3) + Expand = True + } + { btnSolve Button + MoveScaled(58,0,16,4) + Text = Shortcut(("Solve"), "v") + Picture = Picture["icon:/small/apply"] + } + { btnClose Button + MoveScaled(75,0,16,4) + Text = ("Close") + Picture = Picture["icon:/small/close"] + Cancel = True + } + } +} diff --git a/app/src/gambas3/.src/VersionControl/FProjectVersion.class b/app/src/gambas3/.src/VersionControl/FProjectVersion.class new file mode 100644 index 00000000..f9125ab6 --- /dev/null +++ b/app/src/gambas3/.src/VersionControl/FProjectVersion.class @@ -0,0 +1,307 @@ +' Gambas class file + +Private $sChange As String +Private $sDiff As String +Private $cInfo As Collection + +Private Const DELIM_CHANGE As String = ("This line and the following will be ignored") + +Public Sub Run() As Boolean + + Return Not Me.ShowModal() + +End + +Private Sub RefreshStatus(bRemote As Boolean) + + Inc Application.Busy + + GetAuthentication + + $sChange = VersionControl.Status() + $sDiff = VersionControl.Diff(Project.Dir) + + btnCommit.Enabled = $sChange + btnRevert.Enabled = btnCommit.Enabled + tabVersion[1].Visible = $sChange + tabVersion[2].Visible = $sChange + + $cInfo = VersionControl.Info(bRemote) + + txtRepository.Text = $cInfo["url"] + + gvwInfo.Columns.Count = 3 + gvwInfo.Rows.Count = 3 + gvwInfo.Columns[0].Text = "" + gvwInfo.Columns[1].Text = ("Local") + gvwInfo.Columns[2].Text = ("Remote") + gvwInfo.Columns.Width = -1 + gvwInfo.Rows.Height = gvwInfo.Font.Height + 8 + + Dec Application.Busy + +End + +Private Sub GetAuthentication() + + VersionControl.User = txtName.Text + VersionControl.Password = txtPassword.Text + +End + +Public Sub Form_Open() + + Settings.Read(Me) + + txtName.Text = Project.Config["/VersionControl/User"] + + chkRemember.Value = Project.Config["/VersionControl/RememberPassword", 0] + chkRemember.Enabled = Desktop.Passwords.Enabled + If chkRemember.Value Then Try txtPassword.Text = Desktop.Passwords[Project.Name &/ "VersionControl"] + + If Not txtName.Text Then + txtName.SetFocus + Else + txtPassword.SetFocus + Endif + + 'chkTerminal.Value = Project.Config["/VersionControl/UseTerminal", 0] + + RefreshStatus(False) + + edtChange.Highlight = "diff" + edtChange.ReadConfig + 'edtChange.Flags[Editor.ShowCursorPosition] = True + edtChange.Text = "\n---- " & DELIM_CHANGE & " ----\n\n" & $sChange + + edtDiff.Highlight = "diff" + edtDiff.ReadConfig + edtDiff.Text = $sDiff + + 'panAdded.Visible = Project.AddedPaths.Count > 0 + sepCommit.Visible = panAdded.Visible + +End + + +Public Sub btnCommit_Click() + + Dim sChange As String + Dim iPos As Integer + Dim bRes As Boolean + + If Not Trim(txtName.Text) Then + Balloon.Warning(("Please enter a user name."), txtName) + txtName.SetFocus + Return + Endif + + sChange = Trim(edtChange.Text) + Project.Config["/FCommit/LastCommit"] = sChange + iPos = InStr(sChange, "---- " & DELIM_CHANGE) + If iPos Then sChange = Left(sChange, iPos - 1) + + If Not Trim(sChange) Then + Balloon.Warning(("Please enter the journal."), btnCommit) + Return + Endif + + Inc Application.Busy + GetAuthentication + bRes = VersionControl.Commit(sChange) + If Not bRes Then Project.Refresh + Dec Application.Busy + + If bRes Then + Message.Error(("The project could not be committed.")) + Endif + +End + +Public Sub btnCancel_Click() + + Me.Close + +End + +Public Sub btnCut_Click() + + edtChange.Cut + +End + +Public Sub btnCopy_Click() + + edtChange.Copy + +End + +Public Sub btnPaste_Click() + + edtChange.Paste + +End + +Public Sub btnUndo_Click() + + edtChange.Undo + +End + +Public Sub btnRedo_Click() + + edtChange.Redo + +End + +Public Sub btnIndent_Click() + + edtChange.Indent + +End + +Public Sub btnUnindent_Click() + + edtChange.Unindent + +End + +Public Sub tbtClear_Click() + + edtChange.Clear + edtChange.SetFocus + +End + +Public Sub btnLastDesc_Click() + + Dim sLast As String = Project.Config["/FCommit/LastCommit"] + + If sLast Then edtChange.Text = sLast + +End + +Public Sub btnUpdate_Click() + + Dim bErr As Boolean + Dim hFile As Variant + + Inc Application.Busy + GetAuthentication + bErr = VersionControl.Update() + Project.Refresh + Dec Application.Busy + + If bErr Then + Message.Error(("Unable to update project from repository.")) + Else + Message.Info(("Project has been updated from repository successfully.")) + Endif + + RefreshStatus(True) + + For Each hFile In Project.Files + If Project.IsConflict(hFile.Path) Then Try hFile.Close + Next + +End + +Public Sub btnRevert_Click() + + If Message.Warning(("You are going to cancel your changes!"), ("Continue"), ("Cancel")) = 2 Then Return + + Inc Application.Busy + + VersionControl.Revert + Project.Refresh + Project.ReloadAll + + Dec Application.Busy + +End + + +Public Sub btnInfo_Click() + + RefreshStatus(True) + +End + +Public Sub btnOK_Click() + + Me.Close + +End + +Public Sub Form_Close() + + Settings.Write(Me) + + Project.Config["/VersionControl/User"] = Trim(txtName.Text) + Project.Config["/VersionControl/RememberPassword"] = If(chkRemember.Value, 1, 0) + + If chkRemember.Value Then + Try Desktop.Passwords[Project.Name &/ "VersionControl"] = txtPassword.Text + Else + Try Desktop.Passwords[Project.Name &/ "VersionControl"] = "" + Endif + + 'Project.Config["/VersionControl/UseTerminal"] = If(chkTerminal.Value, 1, 0) + +End + +Public Sub btnCleanUp_Click() + + Dim sDir As String + + sDir = $cInfo["path"] + If Not sDir Then sDir = File.Dir(Project.Dir) + VersionControl.CleanUp(sDir) + +End + +Public Sub tabVersion_Click() + + If tabVersion.Text = ("Journal") Then + edtChange.SetFocus + Endif + +End + +Public Sub gvwInfo_Data(Row As Integer, Column As Integer) + + Dim sField As String + + With gvwInfo.Data + + Select Case Column + + Case 0 + + Select Case Row + + Case 0 + .Text = ("Revision") + + Case 1 + .Text = ("Author") + + Case 2 + .Text = ("Date") + + End Select + + Case Else + + sField = ["revision", "author", "date"][Row] + If Column = 2 Then sField = "remote." & sField + + .Text = $cInfo[sField] + + End Select + + .Padding = 8 + + End With + +End diff --git a/app/src/gambas3/.src/VersionControl/FProjectVersion.form b/app/src/gambas3/.src/VersionControl/FProjectVersion.form new file mode 100644 index 00000000..52a0ce6e --- /dev/null +++ b/app/src/gambas3/.src/VersionControl/FProjectVersion.form @@ -0,0 +1,231 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,90,69) + Text = ("Project Version Control") + Icon = Picture["icon:/small/calendar"] + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + { tabVersion TabPanel + MoveScaled(1,1,87,62) + Expand = True + Arrangement = Arrange.Vertical + Count = 3 + Index = 0 + Text = ("Update") + { Panel4 HBox + MoveScaled(1,1,81,22) + { Panel2 VBox + MoveScaled(1,1,23,21) + Spacing = True + Margin = True + { btnUpdate Button + MoveScaled(1,1,18,4) + Text = Shortcut(("Update"), "U") + Picture = Picture["icon:/small/down"] + } + { btnRevert Button + MoveScaled(1,6,18,4) + Text = Shortcut(("Revert"), "R") + Picture = Picture["icon:/small/undo"] + } + { btnCommit Button + MoveScaled(1,11,18,4) + Text = Shortcut(("Commit"), "C") + Picture = Picture["icon:/small/ok"] + } + { btnCleanUp Button + MoveScaled(1,16,18,4) + Text = Shortcut(("Clean up"), "n") + Picture = Picture["icon:/small/wizard"] + } + } + { Separator4 Separator + MoveScaled(26,3,0,16) + } + { Panel6 Panel + MoveScaled(27,9,1,5) + } + { Panel5 Panel + MoveScaled(29,1,51,19) + Expand = True + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + { Label3 Label + MoveScaled(1,1,24,3) + Font = Font["Bold"] + Text = ("Authentication") + } + { HBox2 HBox + MoveScaled(1,5,49,4) + Spacing = True + { Label1 Label + MoveScaled(0,0,16,4) + Text = ("User") + } + { txtName TextBox + MoveScaled(17,0,32,4) + Expand = True + } + } + { HBox3 HBox + MoveScaled(1,10,49,4) + Spacing = True + { Label2 Label + MoveScaled(0,0,16,4) + Text = ("Password") + } + { txtPassword TextBox + MoveScaled(17,0,32,4) + Expand = True + Password = True + } + } + { chkRemember CheckBox + MoveScaled(1,15,23,4) + AutoResize = True + Text = ("Remember password") + } + } + } + { Separator3 Separator + MoveScaled(31,24,19,0) + } + { Panel3 VBox + MoveScaled(1,25,78,9) + Margin = True + { Label5 Label + MoveScaled(0,0,24,3) + Font = Font["Bold"] + Text = ("Repository") + } + { txtRepository Label + MoveScaled(0,3,29,4) + } + } + { Separator2 Separator + MoveScaled(30,36,14,0) + } + { gvwInfo GridView + MoveScaled(2,38,75,12) + Expand = True + Border = False + Header = GridView.Horizontal + } + { Panel7 HBox + MoveScaled(2,51,67,6) + Background = Color.TextBackground + Margin = True + { btnInfo Button + MoveScaled(1,1,28,4) + Text = Shortcut(("Refresh information"), "i") + Picture = Picture["icon:/small/refresh"] + } + } + Index = 1 + Text = ("Journal") + { panAdded Panel + MoveScaled(1,4,78,7) + Visible = False + Arrangement = Arrange.Horizontal + Spacing = True + Margin = True + { PictureBox1 PictureBox + MoveScaled(0,0,5,5) + Picture = Picture["icon:/large/warning"] + AutoResize = True + } + { TextLabel1 TextLabel + MoveScaled(6,0,69,6) + Font = Font["Bold"] + Expand = True + Text = ("Some files are not versioned and should be added manually to the repository.") + } + } + { sepCommit Separator + MoveScaled(2,13,35,0) + } + { HBox4 HBox + MoveScaled(4,15,69,4) + { btnCut ToolButton + MoveScaled(0,0,4,4) + ToolTip = ("Cut") + Picture = Picture["icon:/small/cut"] + } + { btnCopy ToolButton + MoveScaled(4,0,4,4) + ToolTip = ("Copy") + Picture = Picture["icon:/small/copy"] + } + { btnPaste ToolButton + MoveScaled(8,0,4,4) + ToolTip = ("Paste") + Picture = Picture["icon:/small/paste"] + } + { btnUndo ToolButton + MoveScaled(12,0,4,4) + ToolTip = ("Undo") + Picture = Picture["icon:/small/undo"] + } + { btnRedo ToolButton + MoveScaled(16,0,4,4) + ToolTip = ("Redo") + Picture = Picture["icon:/small/redo"] + } + { btnIndent ToolButton + MoveScaled(20,0,4,4) + ToolTip = ("Indent") + Picture = Picture["icon:/small/indent"] + } + { btnUnindent ToolButton + MoveScaled(24,0,4,4) + ToolTip = ("Unindent") + Picture = Picture["icon:/small/unindent"] + } + { tbtClear ToolButton + MoveScaled(28,0,4,4) + ToolTip = ("Clean up") + Picture = Picture["icon:/16/clear"] + } + { btnLastDesc ToolButton + MoveScaled(33,0,22,4) + AutoResize = True + Text = ("Previous description") + Picture = Picture["icon:/small/redo"] + } + } + { Separator1 Separator + MoveScaled(21,20,35,0) + } + { edtChange TextEditor + MoveScaled(3,21,65,21) + Font = Font["Monospace"] + Expand = True + Border = False + } + Index = 2 + Text = ("Changes") + { edtDiff TextEditor + MoveScaled(1,2,78,48) + Font = Font["Monospace"] + Expand = True + Border = False + ReadOnly = True + } + Index = 0 + } + { HBox1 HBox + MoveScaled(1,64,54,4) + Spacing = True + { Panel1 Panel + MoveScaled(3,0,4,4) + Expand = True + } + { btnOK Button + MoveScaled(37,0,15,4) + Text = ("Close") + } + } +} diff --git a/app/src/gambas3/.src/VersionControl/FVersionControl.class b/app/src/gambas3/.src/VersionControl/FVersionControl.class new file mode 100644 index 00000000..6222834c --- /dev/null +++ b/app/src/gambas3/.src/VersionControl/FVersionControl.class @@ -0,0 +1,138 @@ +' Gambas class file + +Public Sub Run() As Boolean + + Return Not Me.ShowModal() + +End + +Public Sub btnOK_Click() + + Dim sChange As String + Dim iPos As Integer + + If Not VersionControl.Diff() Then + If chkDoNotPush.Visible Then + If Message.Question(("There is nothing to commit.") & "\n\n" & ("Do you want to push the repository?"), ("Push"), ("Cancel")) = 1 Then + VersionControl.Commit("", False) + Me.Close + Endif + Else + Message.Info(("There is nothing to commit.")) + Endif + Return + Endif + + sChange = Trim(edtJournal.Text) + iPos = InStr(sChange, "- " & VersionControl.DELIM_CHANGE & " -") + If iPos Then + iPos = RInStr(sChange, "\n", iPos) + If iPos Then + sChange = Left(sChange, iPos - 1) + Else + sChange = "" + Endif + Endif + + If Not Trim(sChange) Then + tabVersionControl.Index = 0 + edtJournal.Goto(0, 0) + edtJournal.SetFocus + Balloon.Warning(("Please enter the journal."), btnOK) + Return + Endif + + Project.Config["/FCommit/LastCommit"] = RTrim(sChange) + + If VersionControl.Commit(sChange, chkDoNotPush.Value) Then Return + + Me.Close(True) + +End + +Public Sub btnCancel_Click() + + Me.Close + +End + + +Public Sub Form_Open() + + Dim DS As Integer + + Me.Title = ("Version control") & " (" & VersionControl.Name & ")" + + edtJournal.ReadConfig + edtDiff.ReadConfig + edtHistory.ReadConfig + Project.SetEditorFont(trmShell) + + edtJournal.Text = RTrim(Project.Config["/FCommit/LastCommit"]) & "\n\n" & VersionControl.GetDefaultJournal() + edtJournal.Goto(0, 0) + + LoadDiff + + tabVersionControl[0].Visible = edtDiff.Visible + + tabVersionControl_Click + + chkDoNotPush.Visible = VersionControl.DoNotPush And VersionControl.HasRemote() + + DS = Desktop.Scale + Me.Resize(FMain.W - DS * 16, FMain.H - DS * 16) + +End + +Public Sub Form_Close() + + Try trmShell.Kill + +End + +Private Sub LoadDiff() + + Dim sDiff As String + + If edtDiff.IsVoid() Then + Inc Application.Busy + sDiff = VersionControl.Diff() + If sDiff Then + edtDiff.Text = sDiff + Else + edtDiff.Text = "-" + edtDiff.Hide + txtDiffNothing.Show + Endif + Dec Application.Busy + Endif + +End + +Public Sub tabVersionControl_Click() + + Select Case tabVersionControl.Index + + Case 0 + edtJournal.SetFocus + + Case 1 + + Case 2 + If edtHistory.IsVoid() Then + edtHistory.FillWithHistory(Project.Dir) + Endif + + Case 3 + Try trmShell.Exec(["bash"], ["PWD=" & Project.Dir]) + trmShell.SetFocus + + End Select + +End + +Public Sub edtHistory_Highlight(Text As String) + + VersionControl.HighlightHistory(Text) + +End diff --git a/app/src/gambas3/.src/VersionControl/FVersionControl.form b/app/src/gambas3/.src/VersionControl/FVersionControl.form new file mode 100644 index 00000000..f34e44e4 --- /dev/null +++ b/app/src/gambas3/.src/VersionControl/FVersionControl.form @@ -0,0 +1,78 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,95,89) + Icon = Picture["icon:/small/save"] + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + { tabVersionControl TabPanel + MoveScaled(1,1,59,54) + Expand = True + Arrangement = Arrange.Fill + Count = 4 + Index = 0 + Text = ("Journal") + { edtJournal TextEditor + MoveScaled(13.25,11.125,16,16) + Border = False + } + Index = 1 + Text = ("Changes") + { edtDiff TextEditor + MoveScaled(12,23,16,16) + Border = False + Highlight = "Diff" + ReadOnly = True + Wrap = True + } + { txtDiffNothing TextLabel + MoveScaled(4,3,43,13) + Visible = False + Font = Font["Italic,+4"] + Padding = 16 + Text = ("There is nothing to commit.") + Alignment = Align.TopLeft + } + Index = 2 + Text = ("History") + { edtHistory TextEditor + MoveScaled(12,10,16,16) + Border = False + Highlight = "Custom" + ReadOnly = True + Wrap = True + } + Index = 3 + Text = ("Terminal") + { trmShell TerminalView + MoveScaled(11.25,13.75,16,16) + Border = False + } + Index = 0 + } + { HBox1 HBox + MoveScaled(1,59,85,4) + Spacing = True + { chkDoNotPush CheckBox + MoveScaled(0,0,32,4) + AutoResize = True + Text = ("Do not push to remote repository") + } + { Panel1 Panel + MoveScaled(39,0,4,4) + Expand = True + } + { btnOK Button + MoveScaled(45,0,16,4) + Text = ("Commit") + Picture = Picture["icon:/small/upload"] + Default = True + } + { btnCancel Button + MoveScaled(63,0,16,4) + Text = ("Cancel") + Cancel = True + } + } +} diff --git a/app/src/gambas3/.src/VersionControl/FVersionError.class b/app/src/gambas3/.src/VersionControl/FVersionError.class new file mode 100644 index 00000000..23e90f4d --- /dev/null +++ b/app/src/gambas3/.src/VersionControl/FVersionError.class @@ -0,0 +1,49 @@ +' Gambas class file + +Static Private $sText As String +Static Private $sDetail As String + +Public Sub Run(sText As String, sDetail As String) + + Dim iBusy As Integer + + $sText = sText + $sDetail = Trim(sDetail) + + iBusy = Application.Busy + Application.Busy = 0 + Me.ShowModal() + Application.Busy = iBusy + +End + +Public Sub btnOK_Click() + + Me.Close + +End + +Public Sub Form_Open() + + Dim DS As Integer + + DS = Desktop.Scale + + lblError.Text = $sText + + If $sDetail Then + + Project.SetEditorFont(trmDetail) + MTheme.InitControl(trmDetail) + trmDetail.Print(Replace($sDetail, "\n", "\r\n")) + trmDetail.Show + Me.Resize(DS * 120, trmDetail.Y + trmDetail.H + DS * 6) + + Else + + Me.Resize(DS * 60, trmDetail.Y + DS * 6) + trmDetail.Hide + + Endif + +End diff --git a/app/src/gambas3/.src/VersionControl/FVersionError.form b/app/src/gambas3/.src/VersionControl/FVersionError.form new file mode 100644 index 00000000..5ebb08ed --- /dev/null +++ b/app/src/gambas3/.src/VersionControl/FVersionError.form @@ -0,0 +1,45 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,67,16) + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + { HBox2 HBox + MoveScaled(1,1,54,7) + Spacing = True + { PictureBox1 PictureBox + MoveScaled(0,0,7,7) + Picture = Picture["icon:/huge/error"] + Stretch = True + } + { lblError Label + MoveScaled(11,1,37,5) + Expand = True + Alignment = Align.TopNormal + } + } + { Panel2 Panel + MoveScaled(33,17,4,1) + } + { trmDetail TerminalView + MoveScaled(6,10,45,24) + Visible = False + Expand = True + ReadOnly = True + } + { HBox1 HBox + MoveScaled(2,20,57,4) + Spacing = True + { Panel1 Panel + MoveScaled(4,0,4,4) + Expand = True + } + { btnOK Button + MoveScaled(40,0,16,4) + Text = ("OK") + Default = True + Cancel = True + } + } +} diff --git a/app/src/gambas3/.src/VersionControl/VersionControl.module b/app/src/gambas3/.src/VersionControl/VersionControl.module new file mode 100644 index 00000000..6f69a7ba --- /dev/null +++ b/app/src/gambas3/.src/VersionControl/VersionControl.module @@ -0,0 +1,710 @@ +' Gambas module file + +Property Read Name As String +Property Read Enabled As Boolean +Property Read Output As String +Property Read DoNotPush As Boolean + +Private $hVC As CVersionControl + +Private $bEnabled As Boolean +Private $bEnd As Boolean +Private $hEditor As TextEditor +Private $bOutput As Boolean +Private $sOutput As String +Private $dOutput As Date +Private $bIdent As Boolean + +Private $bAuth As Boolean +Private $sUser As String +Private $sPassword As String + +Private $sLastResult As String + +'Public (User) As String +'Public Password As String +'Public UseTerminal As Boolean + +Public LANG_ENV As String[] = ["LC_ALL=C.UTF-8", "LANG=C.UTF-8", "LANGUAGE=C.UTF-8"] +Public Const DELIM_CHANGE As String = ("This line and the following will be ignored") +Public Enum ACCEPT_OURS = 1, ACCEPT_THEIRS = 2 +Private $bCancel As Boolean + +Private Sub OnVersionControlChange() + + FMain.OnVersionControlChange + FDebugInfo.OnVersionControlChange + +End + +Private Sub GetTextEditor() As String + + Dim sProg As String + + If Desktop.Is("kde4") Or If Desktop.Is("kde5") Then + sProg = "kwrite" + Else If Desktop.Is("xfce") Then + sProg = "mousepad" + Else If Desktop.Is("lxde") Then + sProg = "leafpad" + Else If Desktop.Is("mate") Then + sProg = "pluma" + Else + sProg = "gedit" + Endif + + For Each sProg In [sProg, "kwrite", "gedit", "emacs"] + If System.Exist(sProg) Then Return sProg + Next + +End + +Public Sub Refresh() + + $hVC = CVersionControl + $bEnabled = False + + If Settings["/VersionControl/Enabled", 1] Then + If CVersionControlSubversion.Check() Then + $hVC = CVersionControlSubversion + $bEnabled = True + Else If CVersionControlGit.Check() Then + $hVC = CVersionControlGit + $bEnabled = True + Endif + Endif + + $bAuth = False + CheckPaths + OnVersionControlChange + + If $bEnabled Then + If Not Env["EDITOR"] Then + Env["EDITOR"] = GetTextEditor() + If Not Env["EDITOR"] Then + Message.Warning(("Please set the $EDITOR environment variable with your favorite graphical text editor. Some version control commands need it.")) + Endif + Endif + Endif + +End + +Public Sub Disable() + + If $hVC And If $hVC Is CVersionControl Then Return + + $hVC = CVersionControl + $bEnabled = False + OnVersionControlChange + +End + + +Public Sub Insert(sText As String) + + If $hEditor Then + $hEditor.Print(DConv(sText)) + Else + FDebugInfo.InsertVersionControl(sText) + Endif + +End + +Public Sub Shell(sCmd As String, Optional bSilent As Boolean, Optional aEnv As String[]) As String + + Dim sResult As String + + If Not bSilent Then Insert(sCmd & "\n") + Shell sCmd With aEnv To sResult + If Process.LastValue Then + $sLastResult = sResult + Insert(sResult) + Endif + Return sResult + +End + + +Public Sub Run(aCmd As String[], Optional bIdent As Boolean, Optional bOutput As Boolean, Optional aEnv As String[]) As Integer + + ' Dim sPassword As String + Dim hProcess As Process + Dim sCmd As String + + $bEnd = False + $bIdent = bIdent + $sOutput = "" + $bOutput = bOutput + $dOutput = Now + $sLastResult = "" + $bCancel = False + + ' If bIdent Then + ' 'aCmd.Add("--non-interactive") + ' If User Then + ' aCmd.Add("--username") + ' aCmd.Add(User) + ' If Password Then + ' sPassword = " --password " & Password + ' aCmd.Add("--password") + ' aCmd.Add(Password) + ' Endif + ' Endif + ' Endif + + hProcess = Exec aCmd With aEnv For Input Output As "Process" + + sCmd = aCmd.Join(" ") + 'If sPassword Then sCmd = Replace(sCmd, sPassword, "********") + + Insert(sCmd & "\n") + + Do + Wait + + If $bEnd Then Break + + If DateDiff($dOutput, Now, gb.Second) >= 15 Then + Close #hProcess + hProcess.Kill + Process_Error(("Command timeout.") & "\n" & ("Please check your network connection.") & "\n") + Endif + + Sleep 0.1 + Loop + + If $bCancel Then Return -1 + + If Process.LastValue Then $sLastResult = $sOutput + + Return Process.LastValue + +End + +Public Sub Process_Error(({Error}) As String) + + $sOutput &= {Error} + Insert({Error}) + +End + + +Public Sub Process_Read() + + Dim sData As String + Dim iPos As Integer + Dim sLine As String + Dim hProcess As Process + + hProcess = Last + + sData = Read #hProcess, -4096 + $sOutput &= Replace(sData, "\r", "") + If $bOutput Then Insert(sData) + 'Insert(sData) + $dOutput = Now + + iPos = RInStr($sOutput, "\n") + If iPos = 0 Then + sLine = $sOutput + Else + sLine = Mid$($sOutput, iPos + 1) + Endif + + If $bIdent Then + If Right(RTrim(sLine)) = ":" Then + If InStr(sLine, "username", 1, gb.IgnoreCase) Then + 'If $bOutput Then Insert(sLine) + If Not $bAuth Then + If GetAuthentication() Then Goto CANCEL + Endif + If Not $sUser Then Goto CANCEL + Print #Last, $sUser + Insert($sUser & "\n") + $sOutput = "" + Else If InStr(sLine, "password", 1, gb.IgnoreCase) Then + 'If $bOutput Then Insert(sLine) + If Not $bAuth Then + If GetAuthentication() Then Goto CANCEL + Endif + Print #Last, $sPassword + Insert("********" & "\n") + $sOutput = "" + Else If InStr(sLine, "passphrase", 1, gb.IgnoreCase) Then + 'If $bOutput Then Insert(sLine) + If Not $bAuth Then + If GetAuthentication(True) Then Goto CANCEL + Endif + Print #Last, $sPassword + Insert("********" & "\n") + $sOutput = "" + Endif + Else If RTrim(sLine) Ends "(yes/no)?" Then + Print #Last, "yes" + Insert("yes\n") + $sOutput = "" + Endif + Endif + + Return + +CANCEL: + + $bCancel = True + hProcess.Kill + +End + +Public Sub Process_Kill() + + $bEnd = True + +End + +Public Sub AddFile(sPath As String, Optional bForce As Boolean) + + $hVC.AddFile(sPath, bForce) + + ' If $bCVS Then + ' 'NB: For CVS file must already exist + ' Run(["cvs", "add", sPath]) + ' Endif + +End + +Public Sub AddDir(sPath As String) + + $hVC.AddDir(sPath) + + ' If $bCVS Then + ' 'NB: For CVS, directory must already exist + ' Run(["cvs", "add", sPath]) + ' Endif + +End + +' Must be called *after* the file has been deleted + +Public Sub RemoveFile(sPath As String, Optional (bForce) As Boolean) + + $hVC.RemoveFile(sPath, bForce) + ' If $bCVS Then + ' 'NB: For CVS do 'cvs remove file' first then delete file + ' Run(["cvs", "remove", sPath]) + ' Endif + CheckPaths + +End + +' Must be called *after* the directory has been deleted +' The directory must be empty + +Public Sub RemoveDir(sPath As String) + + $hVC.RemoveDir(sPath) + ' If $bCVS Then + ' 'NB: For CVS do 'cvs remove dirname' first then delete dirname + ' Run(["cvs", "remove", sPath]) + ' Endif + CheckPaths + +End + +' Must be called *after* the file has been moved + +Public Sub MoveFile(sOld As String, sNew As String) + + $hVC.MoveFile(sOld, sNew) + + ' If $bCVS Then + ' 'NB: make sure the file is added BEFORE + ' AddFile(sNew) + ' 'NB: make sure the file deleted AFTER + ' RemoveFile(sOld) + ' Endif + CheckPaths + +End + +Public Sub CheckPaths() + + Project.ResetFlags + If Not $bEnabled Then Return + $hVC.CheckPaths() + +End + +Public Sub UpdatePath(sPath As String, Optional sPath2 As String) + + If Not $bEnabled Then Return + Project.ResetFlags(sPath) + If sPath2 Then Project.ResetFlags(sPath2) + $hVC.UpdatePath(sPath, sPath2) + +End + + +Public Sub MoveDir(sOld As String, sNew As String) As Boolean + + $hVC.MoveDir(sOld, sNew) + CheckPaths + +End + +Public Sub Status(Optional sPath As String) As String + + Return $hVC.Status(sPath) + +End + +Public Sub Commit(sChange As String, bDoNotPush As Boolean) As Boolean + + Dim bRes As Boolean + + Inc Application.Busy + bRes = $hVC.Commit(sChange, bDoNotPush) + If Not bRes Then Project.Refresh + Dec Application.Busy + + If bRes Then + ShowError(("The project could not be committed.")) + Endif + + Return bRes + +End + +Public Sub Update() + + Dim hFile As Object + Dim sFile As String + Dim sPath As String + Dim aRemove As String[] + Dim iResult As Integer + + Inc Application.Busy + iResult = $hVC.Update() + CheckPaths + Project.Refresh + Dec Application.Busy + + If iResult < 0 Then Return ' cancelled + + If iResult Then + ShowError(("Unable to update project from repository.")) + Else + Message.Info(("Project has been updated from repository successfully.")) + Endif + + For Each sFile In [".project", ".startup", ".component", ".info"] + sPath = Project.Dir &/ sFile + If Exist(sPath) And If Project.IsConflict(sPath) Then SolveConflict(sPath, ACCEPT_THEIRS) + Next + For Each sFile In [".settings"] + sPath = Project.Dir &/ sFile + If Exist(sPath) And If Project.IsConflict(sPath) Then SolveConflict(sPath, ACCEPT_OURS) + Next + + aRemove = New String[] + Project.Workspace.Lock + For Each hFile In Project.Files + If hFile Is FConflictEditor Then Continue + sPath = hFile.Path + If Project.IsConflict(sPath) Then aRemove.Add(sPath) + Next + Project.Workspace.Unlock + + Project.Reload + + If aRemove.Count Then + FMain.DoFilter(Project.FILTER_CONFLICT) + Endif + +End + +Public Sub Revert(Optional sPath As String) As Boolean + + If sPath Then Return $hVC.Revert(sPath) + + If Message.Warning(("You are going to cancel your changes!"), ("Continue"), ("Cancel")) = 2 Then Return + + Inc Application.Busy + + $hVC.Revert() + 'Project.Refresh + Project.Reload + + Dec Application.Busy + +End + +Public Sub CheckoutSVN(sPath As String, sDir As String, hEditor As TextEditor) + + $hEditor = hEditor + CVersionControlSubversion.Checkout(sPath, sDir) + $hEditor = Null + +End + +Public Sub InConflict(sPath As String) As Boolean + + Return $hVC.InConflict(sPath) + +End + +Public Sub SolveConflict(sPath As String, Optional iAccept As Integer) As Boolean + + If $hVC.SolveConflict(sPath, iAccept) Then Return True + + CheckPaths + If Project.HasConflict Then + Project.Refresh + Else + Project.Reload + Endif + +End + +Public Sub GetVersion(sDir As String) As String + + Return $hVC.GetVersion(sDir) + +End + +' Private Sub RemoveFirstLines(sStr As String, iCount As Integer) As String +' +' Dim iPos As Integer +' +' While iCount +' iPos = InStr(sStr, "\n", iPos + 1) +' If iPos = 0 Then Return +' Dec iCount +' Wend +' +' Return Mid$(sStr, iPos + 1) +' +' End + +Public Sub Diff(Optional sPath As String, Optional bFull As Boolean) As String + + If Not sPath Then sPath = Project.Dir + Return $hVC.Diff(sPath, bFull) + +End + +Public Sub History(Optional sPath As String, Optional bFull As Boolean) As String + + If Not sPath Then sPath = Project.Dir + Return $hVC.History(sPath, bFull) + +End + +Public Sub HighlightHistory(sText As String) + + $hVC.HighlightHistory(sText) + +End + + +Public Sub CanControlProject() As Boolean + + Return False + + ' Dim sDir As String + ' + ' If $hVC <> CVersionControl Then Return + ' + ' If $bSvn17 Then + ' sDir = $sRealDir + ' Do + ' sDir = File.Dir(sDir) + ' If Exist(sDir &/ ".svn") Then Return True + ' If sDir = "/" Then Return False + ' Loop + ' Else + ' If Exist($sRealDir &/ "../.svn") Then Return True + ' Endif + ' + ' If Exist($sRealDir &/ "../CVS") Or Exist($sRealDir &/ "../CVSROOT") Then Return True + +End + +Public Sub ControlProject(sType As String) + + Dim hVC As CVersionControl + Dim bErr As Boolean + + Select Case sType + + Case CVersionControlSubversion.Name + hVC = CVersionControlSubversion + + Case CVersionControlGit.Name + hVC = CVersionControlGit + + Default + Return + + End Select + + If Not hVC.CanControlProject() Then Return + + If Message.Question(Subst(("Do you really want to put this project under version control with &1?"), hVC.LongName), ("Yes"), ("No")) = 2 Then Return + + Project.CleanUp + Try Kill Project.Dir &/ ".settings" + + bErr = hVC.ControlProject() + + Project.Config.Save + + If Not bErr Then + Refresh + Project.Refresh + FVersionControl.Run() + Else + ShowError(("The project could not be put under version control.")) + Endif + +End + +Public Sub Info() As Collection + + Return $hVC.Info() + +End + +Public Sub CleanUp(sPath As String) + + $hVC.CleanUp(sPath) + +End + +Private Function Enabled_Read() As Boolean + + Return $bEnabled + +End + +Private Function Output_Read() As String + + Return $sOutput + +End + +Public Sub GetBranches(ByRef sCurrent As String) As String[] + + Return $hVC.GetBranches(ByRef sCurrent) + +End + +Private Function Name_Read() As String + + Return $hVC.Name + +End + +Public Sub GetDefaultJournal() As String + + Return $hVC.GetDefaultJournal() + +End + +Public Sub GetDelimChange() As String + + Dim sStr As String + + sStr = String.Left("-------- " & DELIM_CHANGE & " ", 77) + sStr &= String$(78 - String.Len(sStr), "-") + Return sStr + +End + +Private Sub GetAuthentication(Optional bNoUser As Boolean) As Boolean + + Dialog.NoUser = bNoUser + Dialog.Key = Project.Name &/ "VersionControl" + If Dialog.AskPassword() Then Return True + $sUser = Dialog.User + $sPassword = Dialog.Password + $bAuth = True + +End + +Private Function DoNotPush_Read() As Boolean + + Return $hVC.DoNotPush + +End + +Public Sub SetBranch(sBranch As String) + + Dim sCurrent As String + + Inc Application.Busy + $hVC.SetBranch(sBranch) + GetBranches(ByRef sCurrent) + If sCurrent = sBranch Then Project.Reload + Dec Application.Busy + + If sCurrent <> sBranch Then + ShowError(Subst(("Unable to switch to branch `&1`."), sBranch)) + Endif + + Project.UpdateTitle + +End + +Public Sub InitControlProjectMenu(hParent As Menu) + + Dim hMenu As Menu + Dim hVC As CVersionControl + + hVC = CVersionControlSubversion + GoSub CHECK_CONTROL + hVC = CVersionControlGit + GoSub CHECK_CONTROL + Return + +CHECK_CONTROL: + + If hVC.CanControlProject() Then + hMenu = New Menu(hParent) As "ControlProject" + hMenu.Text = Subst(("With &1"), hVC.LongName) + hMenu.Tag = hVC.Name + Endif + + Return + +End + +Public Sub ControlProject_Click() + + ControlProject(Last.Tag) + +End + +Public Sub ShowError(sErr As String) + + FVersionError.Run(sErr, $sLastResult) + +End + +Public Sub HasRemote() As Boolean + + Return $hVC.HasRemote() + +End + +Public Sub GetSolveConflictMessage() As String + + Return $hVC.GetSolveConflictMessage() + +End + +Public Sub NeedMove() As Boolean + + Return $hVC.NeedMove + +End + diff --git a/app/src/gambas3/.src/Welcome/CCoolButton.class b/app/src/gambas3/.src/Welcome/CCoolButton.class new file mode 100644 index 00000000..621f9a67 --- /dev/null +++ b/app/src/gambas3/.src/Welcome/CCoolButton.class @@ -0,0 +1,230 @@ +' Gambas class file + +Property Enabled As Boolean +Property ToolTip As String +Property Foreground As Integer +Property Background As Integer +Property Highlight As Integer + +Public Tag As Variant + +Private $hPanel As DrawingArea +Private $hPict As Picture +Private $sText As String +Private $iBackground As Integer = Color.Default +Private $bInside As Boolean +Private $iHighlight As Integer = Color.SelectedBackground + +Event Click + +Public Sub _new(hContainer As Container, W As Integer, H As Integer, sText As String, vIcon As Variant, Optional sFont As String) + + $hPanel = New DrawingArea(hContainer) As "Panel" + $hPanel.Resize(W, H) + $hPanel.Mouse = Mouse.Pointing + $hPanel.Arrangement = Arrange.Horizontal + $hPanel.Spacing = True + $hPanel.Focus = True + + If TypeOf(vIcon) = gb.String Then + $hPict = Picture[vIcon] + Else + $hPict = vIcon + Endif + + $sText = sText + + If sFont Then $hPanel.Font = Font[sFont] + +End + +Private Sub UpdateBorder() + + '$hPanel.Border = If($bInside Or $hPanel.HasFocus, Border.Plain, Border.None) + $hPanel.Refresh + +End + +Public Sub Panel_Draw() + + If $iBackground <> Color.Default Then + Paint.FillRect(0, 0, Paint.W, Paint.H, $iBackground) + Endif + + If $bInside And If Me.Enabled Then + Paint.FillRect(0, 0, Paint.W, Paint.H, Color.SetAlpha(Color.TextForeground, 224)) + Endif + + Paint.DrawPicture($hPict, 16, ($hPanel.H - $hPict.H) \ 2) + 'If $bInside Then Draw.Foreground = Color.Gradient($hPanel.Foreground, $iHighlight) + Paint.Background = If(Me.Enabled, $hPanel.Foreground, Color.Merge($hPanel.Foreground, $hPanel.Background)) + 'Paint.DrawTextShadow($sText, $hPict.W + 24, 0, $hPanel.W - $hPict.W - 32, $hPanel.H, Align.Normal) + Paint.DrawText($sText, $hPict.W + 24, 0, $hPanel.W - $hPict.W - 32, $hPanel.H, Align.Normal) + + ' If $bArrow Then + ' Draw.Picture(Picture["img/16/white-arrow.png"], Draw.W - 24, (Draw.H - 16) \ 2) + ' 'Draw.Style.Arrow(Draw.W - 32, (Draw.H - 32) \ 2, 32, 32, Align.Right) + ' Endif + + If $hPanel.HasFocus Then + Paint.AntiAlias = False + Paint.LineWidth = 2 + Paint.Background = Color.SetAlpha($iHighlight, 128) + Paint.Rectangle(2, 2, Paint.W - 4, Paint.H - 4) + Paint.Stroke + Paint.AntiAlias = True + Endif + +End + + +Public Sub Panel_Enter() + + '$hPanel.Background = $iHighlight 'Color.LightBackground '&88D5FF& + $bInside = True + UpdateBorder + +End + +Public Sub Panel_Leave() + + '$hPanel.Background = Color.Default 'Last.Parent.Background + $bInside = False + UpdateBorder + +End + +Public Sub Panel_GotFocus() + + UpdateBorder + +End + +Public Sub Panel_LostFocus() + + UpdateBorder + +End + +' Public Sub Panel_KeyPress() +' +' If Key.Code = Key.Space Then Pressed(True) +' +' End + +Public Sub Panel_KeyRelease() + + If Not $hPanel.Enabled Then Return + If Key.Code = Key.Space Then + 'Pressed(False) + Panel_Leave + Raise Click + Endif + +End + +Public Sub Panel_MouseDown() + + If Not Mouse.Left Then Return + 'Pressed(True) + +End + + +Public Sub Panel_MouseUp() + + Dim X As Integer + Dim Y As Integer + + If Not Mouse.Left Then Return + If Not $hPanel.Enabled Then Return + + 'Pressed(False) + + X = Mouse.X + Y = Mouse.Y + + Raise Click + Stop Event + +End + + +Private Function Enabled_Read() As Boolean + + Return $hPanel.Enabled + +End + +Private Sub Enabled_Write(bEnabled As Boolean) + + $hPanel.Enabled = bEnabled + +End + + +Public Sub Move(X As Integer, Y As Integer) + + $hPanel.Move(X, Y) + +End + + +Public Sub Resize(W As Integer, H As Integer) + + $hPanel.Resize(W, H) + '$hLabel.Resize(W - ($hImage.X + $hImage.W + 8) - 8, H - 8) + +End + +Private Function ToolTip_Read() As String + + Return $hPanel.ToolTip + +End + +Private Sub ToolTip_Write(sToolTip As String) + + $hPanel.ToolTip = sToolTip + '$hImage.ToolTip = sToolTip + '$hLabel.ToolTip = sToolTip + +End + + +Private Function Foreground_Read() As Integer + + Return $hPanel.Foreground + +End + +Private Sub Foreground_Write(Value As Integer) + + $hPanel.Foreground = Value + +End + +Private Function Highlight_Read() As Integer + + Return $iHighlight + +End + +Private Sub Highlight_Write(Value As Integer) + + $iHighlight = Value + +End + +Private Function Background_Read() As Integer + + Return $iBackground + +End + +Private Sub Background_Write(Value As Integer) + + $iBackground = Value + $hPanel.Refresh + +End diff --git a/app/src/gambas3/.src/Welcome/CSnowFlake.class b/app/src/gambas3/.src/Welcome/CSnowFlake.class new file mode 100644 index 00000000..e0f63652 --- /dev/null +++ b/app/src/gambas3/.src/Welcome/CSnowFlake.class @@ -0,0 +1,8 @@ +' Gambas class file + +Public X As Float +Public Y As Float +Public Size As Integer +Public DX As Float +Public DY As Float +Public IgnoreTree As Boolean diff --git a/app/src/gambas3/.src/Welcome/CTear.class b/app/src/gambas3/.src/Welcome/CTear.class new file mode 100644 index 00000000..2f6e6c6e --- /dev/null +++ b/app/src/gambas3/.src/Welcome/CTear.class @@ -0,0 +1,4 @@ +' Gambas class file + +Public Seed As Integer +Public Age As Integer diff --git a/app/src/gambas3/.src/Welcome/CUser.class b/app/src/gambas3/.src/Welcome/CUser.class new file mode 100644 index 00000000..45b26a62 --- /dev/null +++ b/app/src/gambas3/.src/Welcome/CUser.class @@ -0,0 +1,11 @@ +' Gambas class file + +Public Name As String +Public Score As Float +Public (Color) As Integer +Public {Step} As Integer +Public XD As Integer +Public YD As Integer +Public Size As Float +Public (Image) As Image +Public Bold As Boolean diff --git a/app/src/gambas3/.src/Welcome/CWelcome.class b/app/src/gambas3/.src/Welcome/CWelcome.class new file mode 100644 index 00000000..1f916858 --- /dev/null +++ b/app/src/gambas3/.src/Welcome/CWelcome.class @@ -0,0 +1,366 @@ +' Gambas class file + +Static Private BACKGROUND_COLOR As Integer = Project.COLOR_BLUE +Static Private TEXT_COLOR As Integer = Project.COLOR_ORANGE + +Public NoTear As Boolean + +Private $hLogo As Image +Private $hText As Image + +Private $hObs As Observer + +Private $hTimer As Timer +Private $hSnow As Image +Private $aSnowFlakes As New CSnowFlake[] +Private MAX_SNOW_FLAKES As Integer = 250 +Private $aImage As Image[] +Private $bIgnoreTree As Boolean +Private $bSnow As Boolean + +Private $aTears As New CTear[] +Private $bTear As Boolean +Private $hTear As Image +Private $iTearAge As Integer + +Public Sub _new(hDrawingArea As DrawingArea, Optional bHasTear As Boolean) + + Dim hSnowFlake As Image + Dim I As Integer + Dim dNow As Date + + hDrawingArea.Background = BACKGROUND_COLOR + + $hObs = New Observer(hDrawingArea) As "dwgWelcome" + + dNow = Now + If dNow >= Date(Year(dNow), 12, 25) Then + + hSnowFlake = Image.Load("welcome/snowflake.png") + $aImage = New Image[8] + For I = 0 To $aImage.Max + $aImage[I] = hSnowFlake.Stretch(I + 1, I + 1) + Next + + $bSnow = True + + Endif + + $bTear = bHasTear + + If $bSnow Or If $bTear Then + $hTimer = New Timer As "SnowTimer" + $hTimer.Delay = 50 + Endif + +End + +Static Public Sub PaintText(sText As String, X As Integer, Y As Integer, iColor As Integer) As Integer + + Dim XR As Integer + Dim hShadow As Image + Dim hSize As RectF + Dim hFont As Font + Dim iRadius As Integer + + hSize = Paint.TextSize(sText) + iRadius = Ceil(hSize.H / 4) + + hShadow = New Image(hSize.W + iRadius * 2, hSize.H + iRadius * 2, Color.Rgb(0, 0, 0, 255)) + + hFont = Paint.Font + Paint.Begin(hShadow) + Paint.Font = hFont + Paint.Brush = Paint.Color(Color.Black) + Paint.Text(sText, iRadius, iRadius, hSize.W, hSize.H) + Paint.Fill + Paint.End + + hShadow.Fuzzy(iRadius) + + Paint.DrawImage(hShadow, X - iRadius, Y - iRadius - Paint.Font.Ascent) + + Paint.Brush = Paint.Color(iColor) + Paint.Text(sText, X, Y) + XR = X + Paint.PathExtents.Width + Paint.Fill + + Return XR + +End + + +Public Sub dwgWelcome_Draw() + + Dim X, Y As Integer + Dim hDrawingArea As DrawingArea = $hObs.Object + Dim I, S As Integer + Dim hSnowFlake As CSnowFlake + Dim hFir As Image + Dim sText As String + Dim sVersion As String + Dim hTear As CTear + Dim R As Float + Dim iAge As Integer + Dim XT As Float + Dim DXT As Float + Dim YT As Float + Dim J As Integer + Dim bDraw As Boolean + Dim DYT As Float + Dim iLum As Integer + + If Not $hLogo Then + + 'hSvgLogo = SvgImage.Load("img/logo/gambas.svg") + '$hLogo = New Image(hSvgLogo.Width, 256, Color.Transparent) + $hLogo = Image.Load("img/logo/head-256.png") + 'Paint.Begin($hLogo) + 'Paint.Scale(1.1, 1.1) + 'hSvgLogo.Paint + 'Paint.End + + $hText = New Image(hDrawingArea.Width, hDrawingArea.Height, Color.Transparent) + Paint.Begin($hText) + + Paint.Translate(Desktop.Scale, Desktop.Scale * 2) + + Paint.Font = Font["+10,Bold"] + Y = Paint.Font.Ascent + sVersion = Project.FullVersion + If sVersion Begins "3.14." And If sVersion Not Ends ".90" Then + If sVersion Ends ".0" Then sVersion = Left(sVersion, -2) + X = PaintText("Gambas " & sVersion, 8, Y, Color.White) 'TEXT_COLOR) + X += Desktop.Scale * 17 + For I = -6 To 14 + Paint.Font = Font[Format(I, "+0") & ",Italic,Bold"] + PaintText("π", X, Y, Color.White) + X -= Paint.Font.H / 6 + Next + Else + X = PaintText("Gambas " & sVersion, 8, Y, Color.White) 'TEXT_COLOR) + Endif + 'Paint.Font = Font["+12,Bold"] + 'PaintText(Project.FullVersionWithRevision, X + 8, Paint.Font.Ascent, Color.White) 'Color.SelectedForeground) + + Paint.Font = Font["+4,Bold"] + Y += Paint.Font.Height + PaintText("http://gambas.sourceforge.net", 12, Y, TEXT_COLOR) 'Color.LightForeground) + + Paint.Font = Font["Bold"] + Y += 16 + 'PaintText(("This program is published under the GNU General Public License.") & "\n" & ("The Gambas font is published under the SIL Open Font License."), 12, Y, Color.SelectedForeground) + sText = ("This program is published under the GNU General Public License.") & "
      " & ("The Gambas font is published under the SIL Open Font License.") + Paint.Background = Color.Black + Paint.DrawRichTextShadow(sText, 12, Y, Paint.W - 24, Paint.H - Y - 6, Align.TopNormal, Paint.Font.Height \ 4, 1) + Paint.Background = Color.SelectedForeground + Paint.DrawRichText(sText, 12, Y, Paint.W - 24, Paint.H - Y - 6, Align.TopNormal) + + Paint.End + + '$hLogo.Brightness(-0.1) + + Endif + + 'Paint.DrawImage($hLogo, hDrawingArea.W - $hLogo.Width, -10 - Desktop.Scale) + Paint.DrawImage($hLogo, hDrawingArea.W - $hLogo.Width - Desktop.Scale, 0) + + If $hTimer Then + + If $bTear Then + + If Not $hTear Then $hTear = New Image($hLogo.W, $hLogo.H, Color.Transparent, Image.Premultiplied) + + $hTear.Fill(Color.Transparent) + + Paint.Begin($hTear) + Paint.Translate(112, 87) + + 'Debug $aTears.Count + + I = 0 + While I < $aTears.Count + + hTear = $aTears[I] + Inc hTear.Age + bDraw = False + + Randomize hTear.Seed + + XT = Rnd(-4, 4) + YT = 0.0 + + DXT = Rnd(-2, 2) + DYT = 0.1 + + For J = 0 To hTear.Age + + iAge = hTear.Age - J + XT += DXT + Rnd(-0.1, 0.1) + YT += DYT + + iLum = Color[$hLogo[XT + 112, YT + 87]].Luminance + If iLum < 24 And If DYT > 0.5 Then + DYT = 0.1 + Else + DYT = Max(0.5, DYT + 0.025) + Endif + DXT *= 0.8 + + If iAge < 128 And If (YT - R) < (Paint.H - 87) Then + + R = Max(0.5, 3 - Sqr(iAge) / 4) + Paint.Ellipse(XT - R, YT - R, R * 2, R * 2) + Paint.Background = Color.RGB(220, 230, 255, 192) ', 255 + (iAge \ 8) - 16) + Paint.Fill + bDraw = True + + Endif + + Next + + If bDraw Then + Inc I + Else + $aTears.Remove(I) + Endif + + Wend + + Paint.End + + Paint.DrawImage($hTear, hDrawingArea.W - $hLogo.Width - Desktop.Scale, 0) + + Endif + + If $bSnow Then + + If Not $hSnow Then + $hSnow = New Image(hDrawingArea.Width, hDrawingArea.Height, Color.Transparent) + Paint.Begin($hSnow) + hFir = Image.Load("welcome/fir.png") + Paint.DrawImage(hFir, 430, $hSnow.H - hFir.H) + Paint.End + Endif + + Paint.DrawImage($hSnow, 0, 0) + + For I = 0 To $aSnowFlakes.Max + hSnowFlake = $aSnowFlakes[I] + With hSnowFlake + S = 1 + .Size \ 2 + Paint.DrawImage($aImage[.Size], CInt(.X) - S, CInt(.Y) - S) + End With + Next + + Endif + + $hTimer.Start + + Endif + + Paint.DrawImage($hText, 0, 0) + +End + +Fast Public Sub SnowTimer_Timer() + + Dim hDrawingArea As DrawingArea = $hObs.Object + Dim hSnowFlake As CSnowFlake + Dim I As Integer + Dim H As Integer + Dim S As Integer + Dim X As Integer + Dim Y As Integer + Dim C As Integer + Dim hTear As CTear + + $hTimer.Stop + If Not Object.IsValid(hDrawingArea) Then Return + + If $bSnow Then + + H = hDrawingArea.H - 1 + + Paint.Begin($hSnow) + Paint.Background = Color.SetAlpha(&HF0F0F0&, 128) + + While I < $aSnowFlakes.Count + hSnowFlake = $aSnowFlakes[I] + With hSnowFlake + .X += .DX + .Y += .DY + X = CInt(.X) + Y = Min(H, CInt(.Y)) + C = $hSnow[X, Y] + + If Y < H And If C <> Color.White Then + If .IgnoreTree Or If Color[C].Alpha > 16 Then + Inc I + Continue + Endif + Endif + + .X -= .DX + .Y -= .DY + + If .DX Then + + If .DX < 1 Then + .DX = 0 + Else + .DX *= 0.5 + .DY *= 0.75 + Endif + Inc I + Continue + + Endif + + $aSnowFlakes.Remove(I) + 'S = .Size \ 2 + 'Paint.DrawImage($aImage[S], X - S \ 2, Y - S \ 2) + 'Paint.DrawImage($aImage[.Size], CInt(.X), CInt(.Y)) + S = 1 + Min(3, .Size \ 2) + Paint.Ellipse(X - S \ 2, Y - S \ 2 + 1, S, S) + Paint.Fill + + End With + + Wend + + Paint.End + + If $aSnowFlakes.Count < MAX_SNOW_FLAKES Then + For I = 0 To Rand(4) + hSnowFlake = New CSnowFlake + hSnowFlake.X = Rand(-10, hDrawingArea.W + 10) + hSnowFlake.Size = Rand($aImage.Max) + hSnowFlake.DY = 0.5 + hSnowFlake.Size / 3 + Rnd + hSnowFlake.DX = (Rnd * 3 - 1.5) * hSnowFlake.DY + hSnowFlake.IgnoreTree = $bIgnoreTree + $bIgnoreTree = Not $bIgnoreTree + $aSnowFlakes.Add(hSnowFlake) + Next + Endif + + Endif + + If $bTear Then + Inc $iTearAge + If Not NoTear And If $aTears.Count < 3 Then + + Randomize + If $aTears.Count = 0 Or If Rnd < 0.005 Then + hTear = New CTear + hTear.Seed = Rand(2147483647) + $aTears.Add(hTear) + Endif + + Endif + Endif + + hDrawingArea.Refresh + +End + diff --git a/app/src/gambas3/.src/Welcome/FAbout.class b/app/src/gambas3/.src/Welcome/FAbout.class new file mode 100644 index 00000000..dc312d3b --- /dev/null +++ b/app/src/gambas3/.src/Welcome/FAbout.class @@ -0,0 +1,431 @@ +' Gambas class file + +'Static Private $aSupport As String[] +'Static Private $iWait As Integer +'Static Private $iSupport As Integer + +'Private $aUser As New CUser[] +'Private $hBack As Picture +'Private $iStep As Integer +'Private $iFirst As Integer +'Private $bDrawAbout As Boolean + +Private Const NSTEP As Integer = 100 + +Private $hWelcome As CWelcome + +Private $aCache As Image[] +Private $Y As Integer +Private $YP As Integer +Private $bPressed As Boolean + +Static Public Sub Run() + + Dim hForm As FAbout + + hForm = New FAbout + hForm.ShowModal + +End + +Public Sub _new() + + ' Dim hImage As Image + ' Dim hBackground As Image + + Me.Background = Color.SetAlpha(Color.TextBackground, 30) + + 'hImage = Image.Load("img/background/tawhid.png") + 'hBackground = New Image(hImage.W, hImage.H, Color.SetAlpha(Color.TextBackground, 160)) + 'hBackground.PaintImage(hImage, 0, 0) + 'Me.Picture = hBackground.Picture + +End + + +Public Sub Form_Open() + + $hWelcome = New CWelcome(dwgWelcome) + +End + + +Public Sub btnClose_Click() + + Me.Close + +End + + +Private Sub RemoveLink(sStr As String) As String + + Dim iPos As Integer + Dim iPos2 As Integer + + Do + + iPos = InStr(sStr, "", iPos) + If iPos2 = 0 Then iPos2 = Len(sStr) + 1 + sStr = Left(sStr, iPos - 1) & Mid(sStr, iPos2 + 1) + + Loop + + Return Replace(sStr, "", "") + +End + +Private Function GetStars(iStar As Integer) As String + + Dim sStar As String + Dim iInd As Integer + + For iInd = 1 To iStar + If ((iInd - 1) Mod 5) = 0 Then + sStar &= "★" + Else + sStar &= "☆" + Endif + Next + + Return sStar + +End + +Private Sub FillAbout() + + Dim hFile As File + Dim sText As String + Dim sLig As String + Dim sMail As String + Dim sCountry As String + Dim sName As String + Dim aAuthor As New String[] + Dim aFinancial As New String[] + Dim aSplit As String[] + Dim iPos As Integer + Dim I As Integer + Dim N As Integer + Dim sDesc As String + Dim sColor As String + Dim hFont As Font + + hFile = Open "AUTHORS" For Input + + While Not Eof(hFile) + + Line Input #hFile, sLig + sLig = RTrim(sLig) + If Not sLig Then Continue + If Left(sLig) = "#" Then Continue + + If Not IsSpace(Left(sLig)) Then + + If sName Then aAuthor.Add(sName & "\n\n" & Html(sMail) & "\n" & sCountry & "\n" & sDesc) + + sName = Trim(sLig) + sMail = "" + sCountry = "" + sDesc = "" + + iPos = RInStr(sName, "<") + If iPos Then + sMail = Mid$(sName, iPos + 1) + If Right(sMail) = ">" Then sMail = Left(sMail, -1) + sName = Trim(Left(sName, iPos - 1)) + Endif + + iPos = RInStr(sName, "(") + If iPos Then + sCountry = Mid$(sName, iPos + 1) + If Right(sCountry) = ")" Then sCountry = Left(sCountry, -1) + sName = Trim(Left(sName, iPos - 1)) + Endif + + Else + + sLig = RemoveLink(Markdown.ToHTML(LTrim(sLig))) + If sLig Begins "

      " Then sLig = Mid$(sLig, 4) + If sLig Ends "

      " Then sLig = Left$(sLig, -4) + If sDesc Then sDesc &= "
      " + sDesc &= sLig + + Endif + + Wend + + If sName Then aAuthor.Add(sName & "\n\n" & sMail & "\n" & sCountry & "\n" & sDesc) + + Close #hFile + + hFile = Open "support.txt" For Input + ' + While Not Eof(hFile) + + Line Input #hFile, sLig + + iPos = InStr(sLig, " ") + If iPos = 0 Then Break + + sName = Mid$(sLig, iPos + 1) + sText = sName & "\n" & Left(sLig, iPos - 1) + + aFinancial.Add(sText) + + ' iPos = aAuthor.Find(sName & "\n*", gb.Like) + ' If iPos < 0 Then + ' aAuthor.Add(sText) + ' Else + ' aAuthor[iPos] = sText & Mid$(aAuthor[iPos], Len(sName) + 2) + ' Endif + + Wend + + Close #hFile + + aAuthor.Sort(gb.Language + gb.IgnoreCase) + aFinancial.Reverse() + + gvwAbout.Columns.Count = 1 + N = 6 + + gvwAbout.Rows.Count = aAuthor.Count + aFinancial.Count + N + 2 + gvwAbout.Columns[0].Width = Me.ClientWidth - Desktop.Scale * 6 + gvwAbout.Padding = 0 + + ' Space + gvwAbout.Rows[0].H = dwgAbout.H + ' Gambas + gvwAbout[1, 0].RichText = "Gambas Almost
      Means BASic !" + gvwAbout[1, 0].Font = Font["+10"] + gvwAbout[1, 0].Alignment = Align.Top + 'gvwAbout[1, 0].WordWrap = True + ' Logo + gvwAbout[2, 0].Picture = Picture["icon:/128/gambas"] + gvwAbout[2, 0].Alignment = Align.Top + ' Licence title + 'gvwAbout[3, 0].Text = ("License") + 'gvwAbout[3, 0].Font = Font["Bold,+2"] + 'gvwAbout[3, 0].Alignment = Align.Top + ' Licence + gvwAbout[4, 0].RichText = "

      " & String.UCase(("License")) & "


      " & lblLicense.Text + gvwAbout[4, 0].WordWrap = True + gvwAbout[4, 0].Alignment = Align.Top + gvwAbout[4, 0].Padding = Desktop.Scale * 3 + ' Authors title + gvwAbout[5, 0].RichText = "

      " & String.UCase(("Authors")) & "

      " + 'gvwAbout[5, 0].WordWrap = True + gvwAbout[5, 0].Alignment = Align.Top + + For I = 1 To 5 + gvwAbout.Rows[I].H = -1 + Next + gvwAbout.Rows[4].H += Desktop.Scale * 2 + + sColor = "#" & Hex$(Color.Merge(Color.TextBackground, Color.TextForeground, 0.8), 6) + + For I = 0 To aAuthor.Max + + aSplit = Split(aAuthor[I], "\n") + + sName = String.UCase(aSplit[0]) + '"" & String$(64, "─") & " + sText = "

      " & sName & "" + + If aSplit.Count = 2 Then + + sText &= "
      " + sText &= "" + sText &= ("Financial support") & "
      " & GetStars(CInt(aSplit[1])) + + Else + + sText &= "
      " + If aSplit[3] Then sText &= " (" & aSplit[3] & ")" + If aSplit[2] Then sText &= "
      " & aSplit[2] & "" + sText &= "
      " + sText &= "" + sText &= aSplit[4] + If aSplit[1] Then sText &= "
      " & ("Financial support") & "
      " & GetStars(CInt(aSplit[1])) + sText &= "
      " + + Endif + + sText &= "
      " + + gvwAbout[N, 0].WordWrap = True + gvwAbout[N, 0].RichText = sText + gvwAbout[N, 0].Padding = Desktop.Scale + gvwAbout[N, 0].Alignment = Align.Center + gvwAbout.Rows[N].Height = -1 + Inc N + + Next + + gvwAbout[N, 0].RichText = "

      " & String.UCase(("Financial support")) & "

      " + 'gvwAbout[N, 0].WordWrap = True + gvwAbout[N, 0].Alignment = Align.Top + gvwAbout.Rows[N].H = -1 + gvwAbout.Rows[N].H += Desktop.Scale * 3 + Inc N + + hFont = gvwAbout.Font.Copy() + + For I = 0 To aFinancial.Max + + aSplit = Split(aFinancial[I], "\n") + + sText = String.UCase(aSplit[0]) + + hFont.Size = Min(24, CInt(aSplit[1]) / 2 + 7) + gvwAbout[N, 0].Font = hFont + gvwAbout[N, 0].WordWrap = True + gvwAbout[N, 0].RichText = sText + 'gvwAbout[N, 0].Padding = Desktop.Scale + gvwAbout[N, 0].Alignment = Align.Center + gvwAbout[N, 0].Padding = 0 + gvwAbout.Rows[N].Height = hFont.H + Desktop.Scale \ 4 + Inc N + + Next + + ' Final space + 'gvwAbout[N, 0].Background = Color.Yellow + gvwAbout.Rows[N].H = dwgAbout.H + +End + +Private Sub ScrollText(D As Integer) + + Dim hImage As Image + + $Y += D + + If D > 0 Then + + While $Y >= dwgAbout.H + + $Y -= dwgAbout.H + + hImage = $aCache[0] + $aCache[0] = $aCache[1] + $aCache[1] = $aCache[2] + $aCache[2] = hImage + + Inc $YP + If ($YP * dwgAbout.H) >= (gvwAbout.ScrollH - dwgAbout.H) Then $YP = 0 + + PaintAbout($aCache[2], $YP) + + Wend + + Else If D < 0 Then + + While $Y < 0 + + If $YP = 2 Then + $Y = 0 + Break + Endif + + $Y += dwgAbout.H + + hImage = $aCache[2] + $aCache[2] = $aCache[1] + $aCache[1] = $aCache[0] + $aCache[0] = hImage + + Dec $YP + If $YP < 0 Then $YP = gvwAbout.ScrollH \ dwgAbout.H - 1 + PaintAbout($aCache[0], $YP - 2) + + Wend + + Endif + + dwgAbout.Refresh + +End + +Public Sub timAbout_Timer() + + ScrollText(If($bPressed, 16, 1)) + +End + +Public Sub dwgAbout_Draw() + + Paint.DrawImage($aCache[0], 0, -$Y) + If $Y > 0 Then Paint.DrawImage($aCache[1], 0, dwgAbout.H - $Y) + +End + + + +Public Sub Form_KeyPress() + + If Key.Code = Key.Escape Then Me.Close + +End + + +Public Sub dwgWelcome_MouseDown() + + Me.Close + +End + +Private Sub PaintAbout(hImage As Image, iPos As Integer) + + gvwAbout.Move(Me.ClientW, 0, dwgAbout.W, dwgAbout.H) + If iPos < 0 Then iPos += gvwAbout.ScrollH \ dwgAbout.H + gvwAbout.Scroll(0, iPos * dwgAbout.H) + hImage.Fill(Color.Transparent) + Paint.Begin(hImage) + Paint.ClipRect = Rect(0, 0, dwgAbout.W, dwgAbout.H) + gvwAbout.ScrollArea_Draw + Paint.End + +End + +Public Sub Form_Arrange() + + Dim I As Integer + + FillAbout + + $aCache = New Image[3] + + For I = 0 To $aCache.Max + $aCache[I] = New Image(dwgAbout.W, dwgAbout.H) + PaintAbout($aCache[I], I) + '$aCache[I].Save("~/cache-" & CStr(I) & ".png") + Next + $YP = 2 + +End + +Public Sub dwgAbout_MouseDown() + + $bPressed = True + +End + +Public Sub dwgAbout_MouseUp() + + $bPressed = False + +End + +Public Sub dwgAbout_MouseWheel() + + Dim I As Integer + + For I = 1 To 32 + ScrollText(If(Mouse.Forward, -2, 2)) + Wait + Next + +End diff --git a/app/src/gambas3/.src/Welcome/FAbout.form b/app/src/gambas3/.src/Welcome/FAbout.form new file mode 100644 index 00000000..6fb98945 --- /dev/null +++ b/app/src/gambas3/.src/Welcome/FAbout.form @@ -0,0 +1,37 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,69,68) + Text = ("About Gambas") + Icon = Picture["img/logo/head-32.png"] + Resizable = False + Transparent = True + Arrangement = Arrange.Vertical + { dwgWelcome DrawingArea + MoveScaled(0,0,69,26) + } + { lblLicense TextLabel + MoveScaled(8,8,43,22) + Visible = False + Text = ("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 2, 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.\n") + Alignment = Align.Top + } + { dwgAbout DrawingArea + MoveScaled(27,40,24,18) + Expand = True + } + { gvwAbout GridView + MoveScaled(7,34,16,16) + Background = Color.Transparent + Expand = True + Ignore = True + Border = False + Grid = False + ScrollBar = Scroll.None + } + { timAbout #Timer + #MoveScaled(48,38) + Enabled = True + Delay = 25 + } +} diff --git a/app/src/gambas3/.src/Welcome/FSystemInfo.class b/app/src/gambas3/.src/Welcome/FSystemInfo.class new file mode 100644 index 00000000..fa04e961 --- /dev/null +++ b/app/src/gambas3/.src/Welcome/FSystemInfo.class @@ -0,0 +1,272 @@ +' Gambas class file + +Private $sInfo As String + +Public Sub btnClose_Click() + + Me.Close + +End + +Public Sub btnCopy_Click() + + Clipboard.Copy($sInfo) + +End + +' Private Sub FindLibraryRec(sDir As String, sPattern As String) As String +' +' Dim sSubDir As String +' Dim sLib As String +' Dim aDir As String[] +' +' Try aDir = Dir(sDir, sPattern) +' If aDir And If aDir.Count = 1 Then Return aDir[0] +' +' Try aDir = Dir(sDir, "*", gb.Directory) +' If Not Error Then +' For Each sSubDir In aDir +' sLib = FindLibraryRec(sDir &/ sSubDir, sPattern) +' If sLib Then Return sLib +' Next +' Endif +' +' End + +Static Private Sub ReadLsbRelease(sPath As String) As Collection + + Dim cCol As New Collection + Dim sLine As String + Dim aLine As String[] + + For Each sLine In Split(File.Load(sPath), "\n", "", True) + + aLine = Scan(sLine, "*=*") + Try cCol[aLine[0]] = UnQuote(aLine[1]) + + Next + + Return cCol + +End + +Static Private Sub GetDistribution() As String + + Dim cDist As Collection = ["lsb-release": "/etc/lsb-release", "vector": "/etc/vector-version", "slackware": "/etc/slackware-version", "debian": "/etc/debian_version", + "redhat": "/etc/redhat-release", "arch": "/etc/arch-release", "SuSE": "/etc/os-release", "gentoo": "/etc/gentoo-release", "conectiva": "/etc/conectiva-release", + "mandriva": "/etc/mandriva-release", "pardus": "/etc/pardus-release", "kanotix": "/etc/kanotix-release"] + Dim sPath As String + Dim sDistro As String + Dim cData As Collection + Dim iPos As Integer + + For Each sPath In cDist + sDistro = cDist.Key + + If Not Exist(sPath) Then Continue + + If sDistro = "lsb-release" Then + cData = ReadLsbRelease(sPath) + sDistro = cData["DISTRIB_DESCRIPTION"] + If sDistro Then Return sDistro + Return cData["DISTRIB_ID"] & " " & cData["DISTRIB_RELEASE"] + Else + Return sDistro & " " & Trim(File.Load(sPath)) + Endif + + Next + + If Exist("/etc/issue") Then + sDistro = File.Load("/etc/issue") + If sDistro Then + iPos = InStr(sDistro, "\\") + If iPos Then sDistro = Left(sDistro, iPos - 1) + Endif + Else + Exec ["uname", "-s"] To sDistro + Endif + Return Trim(sDistro) + +End + +Static Public Sub GetInfo() As String[] + + Dim aText As New String[] + Dim sTemp As String + Dim cSearch As Collection + Dim cFile As Collection + Dim sDir As String + Dim sFile As String + Dim sPattern As String + Dim aLib As New String[] + Dim aSearchPath As New String[] + Dim sVar As String + Dim aEnv As String[] + + aText.Add("[System]") + ' getting Version: set to FullVersionWithRevision at Project.initVersion + aText.Add("Gambas=" & Project.FullVersionWithRevision) + + aText.Add("OperatingSystem=" & System.Family) + + Exec ["uname", "-r"] To sTemp + aText.Add("Kernel=" & Trim(sTemp)) + + aText.Add("Architecture=" & System.Architecture) + aText.Add("Distribution=" & GetDistribution()) + aText.Add("Desktop=" & Desktop.Type) + aText.Add("Theme=" & Style.Name) + aText.Add("Language=" & System.Language) + + If System.Family = "FreeBSD" Then + Exec ["sysctl", "-n", "hw.physmem"] To sTemp + sTemp = CStr(CLong(Trim(sTemp)) \ 1024) + Else + Exec ["cat", "/proc/meminfo"] To sTemp + Try sTemp = Scan(sTemp, "*MemTotal:*\n*")[1] + If Error Then + sTemp = "" + Else + While Not IsDigit(Right(sTemp)) + sTemp = Left(sTemp, -1) + Wend + sTemp = Trim(sTemp) + Endif + Endif + + If sTemp Then + Try sTemp = Format(CInt(sTemp) / 1024, "0") & "M" + If Not Error Then aText.Add("Memory=" & sTemp) + Endif + If System.Family = "Cygwin" Then + + aSearchPath = ["/bin", "/usr/lib"] + + cSearch = ["QT4": "cygQtCore*.dll", "QT5": "cygQt5Core*.dll", "GTK+2": "cyggtk-x11-2*.dll", "GTK+3": "cyggtk-3-*.dll", "SDL": "cygSDL-*.dll", "GStreamer": "cyggstreamer-*.dll", "Poppler": "cygpoppler-*.dll", "Curl": "cygcurl-*.dll", "OpenGL": "cygGL-*.dll", + "Cairo": "cygcairo-[0-9]*.dll", "DBus": "cygdbus-[0-9]*.dll", "SQLite 3": "libsqlite3*.dll"] + + Else + + sVar = Env["LIBPATH"] + If sVar Then + aSearchPath = Split(sVar, ":") + Else + aSearchPath = ["/usr/lib"] + Endif + + cSearch = ["QT4": "libQtCore.so.*.*.*", "QT5": "libQt5Core.so.*.*.*", "GDK2": "libgdk-x11-2*.so.*.*.*", "GTK+2": "libgtk-x11-2*.so.*.*.*", "GDK3": "libgdk-3*.so.*.*.*", "GTK+3": "libgtk-3*.so.*.*.*", "SDL": "libSDL-1.*.so.*.*.*", "GStreamer": "libgstreamer-*.so.*.*.*", "Poppler": "libpoppler.so.*.*.*", "Curl": "libcurl.so.*.*.*", + "OpenGL": "libGL.so.*.*.*", "Cairo": "libcairo.so.*.*.*", "DBus": "libdbus-[0-9].so.*.*.*", "SQLite": "libsqlite3.so.*.*.*"] + + Endif + + If Stat("/lib", False).Type = gb.Directory Then 'Some systems link /lib to /usr/lib + aSearchPath.Add("/lib", 0) + Endif + + cFile = New Collection + aText.Add("") + aText.Add("[Libraries]") + + For Each sDir In aSearchPath + For Each sFile In RDir(sDir, "", gb.File, False) + sFile = File.Name(sFile) + For Each sPattern In cSearch + If sFile Like sPattern And If Not cFile.Exist(sFile) Then + aLib.Add(cSearch.Key & "=" & sFile) + cFile[sFile] = True + Break + Endif + Next + Next + Next + + aText.Insert(aLib.Sort()) + + aText.Add("") + aText.Add("[Environment]") + + aEnv = New String[] + For Each sVar In Env + aEnv.Add(sVar) + Next + aEnv.Sort + + For Each sVar In aEnv + aText.Add(sVar & "=" & Env[sVar]) + Next + + Return aText + +End + + + +Public Sub Form_Open() + + Dim aText As String[] + Dim sText As String + Dim I As Integer + Dim aLine As String[] + + Inc Application.Busy + + aText = GetInfo() + MakeAnonymous(aText) + + Project.SetEditorFont(gvwInfo) + + gvwInfo.Rows.Count = aText.Count + 1 + gvwInfo.Columns.Count = 3 + + With gvwInfo[0, 0] + .Text = ("Please copy these informations in all your bug reports.") + .ColumnSpan = 3 + .Font = Font["Italic,-1"] + .Foreground = Color.LightForeground + End With + gvwInfo.Rows[0].Height = Desktop.Scale * 4 + + I = 1 + For Each sText In aText + If Left(sText) = "[" Then + With gvwInfo[I, 0] + .Text = Mid$(sText, 2, -1) + .Font.Bold = True + .Font.Underline = True + .ColumnSpan = 3 + .Padding = 4 + End With + Else If sText Then + aLine = Split(sText, "=") + gvwInfo[I, 0].Text = Space$(2) & Trim(aLine[0]) + gvwInfo[I, 0].Padding = 4 + gvwInfo[I, 2].Text = Trim(aLine[1]) + gvwInfo[I, 2].Padding = 4 + Endif + Inc I + Next + + gvwInfo.Columns[0].Width = -1 + gvwInfo.Columns[1].Width = Desktop.Scale * 2 + + $sInfo = aText.Join("\n") + + Dec Application.Busy + +End + +Sub MakeAnonymous(aText As String[]) + + Dim I As Integer + Dim sText As String + + For I = 0 To aText.Max + sText = Replace(aText[I], System.Host, "") + sText = Replace(sText, User.Home, "") + aText[I] = Replace(sText, User.Name, "") + + Next + +End + + diff --git a/app/src/gambas3/.src/Welcome/FSystemInfo.form b/app/src/gambas3/.src/Welcome/FSystemInfo.form new file mode 100644 index 00000000..e114f9fe --- /dev/null +++ b/app/src/gambas3/.src/Welcome/FSystemInfo.form @@ -0,0 +1,38 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,98,75) + Background = Color.TextBackground + Text = ("System information") + Icon = Picture["icon:/large/system"] + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + { gvwInfo GridView + MoveScaled(5,5,49,22) + Font = Font["-2"] + Expand = True + Grid = False + ScrollBar = Scroll.Vertical + } + { HBox1 HBox + MoveScaled(1,62,66,4) + Spacing = True + { Panel1 Panel + MoveScaled(19,1,7,4) + Expand = True + } + { btnCopy Button + MoveScaled(29,0,18,4) + Text = Shortcut(("Copy"), "C") + Picture = Picture["icon:/small/copy"] + } + { btnClose Button + MoveScaled(48,0,18,4) + Text = ("Close") + Picture = Picture["icon:/16/close"] + Default = True + Cancel = True + } + } +} diff --git a/app/src/gambas3/.src/Welcome/FWelcome.class b/app/src/gambas3/.src/Welcome/FWelcome.class new file mode 100644 index 00000000..d7a92fd3 --- /dev/null +++ b/app/src/gambas3/.src/Welcome/FWelcome.class @@ -0,0 +1,458 @@ +' Gambas class file + +Class Media +Class MediaPlayer + +Static Public Filter As String + +Static Private $sPath As String +Private btnNew As CCoolButton +Private btnOpen As CCoolButton +Private btnOpenExtern As CCoolButton +Private btnRecent As CCoolButton +Private btnExample As CCoolButton +Private btnQuit As CCoolButton +Private btnAbout As CCoolButton +Private btnFarm As CCoolButton +Private btnSoft As CCoolButton + +Private $iRecent As Integer + +Private Const LIST_NONE As Integer = 0 +Private Const LIST_RECENT As Integer = 1 +Private Const LIST_EXAMPLE As Integer = 2 +Private Const LIST_SOFTWARE As Integer = 3 + +Private HEIGHT_BUTTON As Integer = Desktop.Scale * 7 + +Private $hWelcome As CWelcome +Private $iSort As Integer = CRecentProject.SORT_BY_DATE + +Private $hRecent As CProjectList +Private $hExample As CProjectList +Private $hSoft As CProjectList +Private $hPlayer As MediaPlayer + +' Static Public Function Run() As String +' +' 'DIM hForm AS Form +' +' $sPath = "" +' 'hForm = NEW FWelcome +' FWelcome.ShowModal() +' Return $sPath +' +' End +' +Public Sub _new() + + $hRecent = New CProjectList(lstRecent, txtFilter, CProjectList.TYPE_RECENT, Arrange.Row) As "ProjectItem" + $hExample = New CProjectList(lstExample, txtFilterExample, CProjectList.TYPE_EXAMPLE, Arrange.Row) As "ProjectItem" + $hSoft = New CProjectList(lstSoft, txtFilterSoft, CProjectList.TYPE_SOFTWARE, Arrange.Row) As "ProjectItem" + +End + + +Public Sub Form_Open() + + Dim W As Integer + Dim sFont As String + Dim hCtrl As CCoolButton + Dim bHasTear As Boolean + + 'Settings.Read(Me) + 'Me.Center + + sFont = "Bold" + W = panButton.ClientW + + btnNew = New CCoolButton(panButton, W, HEIGHT_BUTTON, ("New project..."), "icon:/large/new", sFont) As "btnNew" + btnOpen = New CCoolButton(panButton, W, HEIGHT_BUTTON, ("Open project") & "...", "icon:/large/open", sFont) As "btnOpen" + btnRecent = New CCoolButton(panButton, W, HEIGHT_BUTTON, ("Recent projects"), "icon:/large/open-recent", sFont) As "btnList" + btnExample = New CCoolButton(panButton, W, HEIGHT_BUTTON, ("Examples"), "icon:/large/help", sFont) As "btnList" + btnSoft = New CCoolButton(panButton, W, HEIGHT_BUTTON, ("Installed software"), "icon:/large/download", sFont) As "btnList" + btnFarm = New CCoolButton(panButton, W, HEIGHT_BUTTON, ("Software farm") & "...", "icon:/large/book", sFont) As "btnFarm" + btnOpenExtern = New CCoolButton(panButton, W, HEIGHT_BUTTON, ("Open file") & "...", "icon:/large/edit", sFont) As "btnOpenExtern" + btnAbout = New CCoolButton(panButton, W, HEIGHT_BUTTON, ("About Gambas") & "...", "icon:/large/info", sFont) As "btnAbout" + btnQuit = New CCoolButton(panButton, W, HEIGHT_BUTTON, ("Quit"), "icon:/large/quit", sFont) As "btnQuit" + + btnRecent.Tag = LIST_RECENT + btnExample.Tag = LIST_EXAMPLE + btnSoft.Tag = LIST_SOFTWARE + + For Each hCtrl In [btnNew, btnOpen, btnRecent, btnExample, btnSoft, btnFarm, btnOpenExtern, btnAbout, btnQuit] + hCtrl.Foreground = Color.Foreground + 'hCtrl.Highlight = &H61A7C3& + Next + + ' Fill recent list + + $iSort = Settings["/FWelcome/SortRecent", CRecentProject.SORT_BY_DATE] + UpdateMenuSort + $hRecent.SetSort($iSort) + + If CRecentProject.All.Count Then + Toggle(LIST_RECENT) + Else + Toggle(LIST_EXAMPLE) + Endif + + bHasTear = PlaySound() + $hWelcome = New CWelcome(dwgWelcome, bHasTear) + + $hSoft.Fill + +End + +Private Sub PlaySound() As Boolean + + Dim dNow As Date + Dim iYear As Integer + Dim dEaster As Date + Dim sPlay As String + Dim sTemp As String + + dNow = Date(Now) + 'dNow = Date(2020, 8, 15) + iYear = Year(dNow) + dEaster = Date.EasterDay(iYear) + + If dNow = Date(iYear, 12, 25) Then + sPlay = "bells.mp3" + Else If dNow = Date(iYear, 8, 15) Or If dNow = dEaster Or If dNow = dEaster + 39 Then + sPlay = "spiritus.mp3" + Else + Return + Endif + + Component.Load("gb.media") + $hPlayer = New MediaPlayer As "MediaPlayer" + sTemp = Temp$() + Copy "welcome" &/ sPlay To sTemp + $hPlayer.URL = Media.URL(sTemp) + $hPlayer.Play(True) + + Return True + +End + +' Public Sub cvwRecent_Click() +' +' $sPath = CRecentProject.All[Val(Last.Key)].Path +' Me.Close +' +' End + + +' PUBLIC SUB timMessage_Timer() +' +' IF System.RightToLeft THEN +' INC lblMessage.X +' IF lblMessage.X >= panMessage.W THEN +' lblMessage.X = - lblMessage.Width +' ENDIF +' ELSE +' DEC lblMessage.X +' IF lblMessage.X <= (- lblMessage.Width) THEN +' lblMessage.X = panMessage.Width +' ENDIF +' ENDIF +' +' END + + +Public Sub btnNew_Click() + + $sPath = FCreateProject.Run() + txtFilter.SetFocus + If $sPath Then Project.Open($sPath) + +End + + +Public Sub btnOpen_Click() + + $sPath = FOpenProject.Run() + txtFilter.SetFocus + If $sPath Then + Project.Open($sPath) + Else + $hRecent.Fill + Endif + +End + +Public Sub btnOpenExtern_Click() + + If FMain.OpenExternFile() Then FMain.Close + +End + +Public Sub btnList_Click() + + Toggle(Last.Tag) + +End + +Public Sub btnQuit_Click() + + $sPath = "" + FMain.Close() + +End + +Private Sub Toggle(iState As Integer) + + Dim hCtrl As CCoolButton + + If $iRecent = iState Then Return + + $iRecent = iState + + lstRecent.Hide + txtFilter.Hide + lstExample.Hide + txtFilterExample.Hide + lstSoft.Hide + txtFilterSoft.Hide + + Select Case $iRecent + + Case LIST_NONE + panList.Hide + + Case LIST_RECENT + panList.Raise + lstRecent.Show + txtFilter.Show + panList.Show + txtFilter.SetFocus + + Case LIST_EXAMPLE + $hExample.Fill + panList.Raise + lstExample.Show + txtFilterExample.Show + panList.Show + txtFilterExample.SetFocus + + Case LIST_SOFTWARE + $hSoft.Fill + panList.Raise + lstSoft.Show + txtFilterSoft.Show + panList.Show + txtFilterSoft.SetFocus + + End Select + + For Each hCtrl In [btnRecent, btnExample, btnSoft] + hCtrl.Background = If($iRecent = hCtrl.Tag, Color.SetAlpha(Color.TextForeground, 240), Color.Default) + 'hCtrl.Foreground = If($iRecent = hCtrl.Tag, Color.TextForeground, Color.White) + Next + +End + +Public Sub Form_KeyPress() + + If Key.Code = Key.Escape Then + btnQuit_Click + Else If Key.Alt Then + If Key.Code = Key["P"] Then + Toggle(LIST_RECENT) + Stop Event + Else If Key.Code = Key["E"] Then + Toggle(LIST_EXAMPLE) + Stop Event + Endif + Endif + +End + + +Public Sub Form_Hide() + + 'Settings.Write(Me) + Settings["/FWelcome/SortRecent"] = $iSort + Settings["/FWelcome/Filter"] = txtFilter.Text + +End + +' PUBLIC SUB dwgRound_Draw() +' +' Draw.FillColor = LAST.Foreground +' Draw.LineStyle = Line.None +' Draw.FillStyle = Fill.Solid +' Draw.RoundRect(0, 0, LAST.W, LAST.H) +' +' END + +Public Sub dwgExample_Draw() + + Dim hDrawingArea As DrawingArea = Last + + 'Draw.FillRect(Draw.Clip.X, Draw.Clip.Y, Draw.Clip.Width, Draw.Clip.Height, Int(Rnd(0, &H1000000))) + + Draw.Font = hDrawingArea.Font + Draw.Text(hDrawingArea.Tag, 4, 0, Draw.W - 16, Draw.H - 4, Align.BottomNormal) + Draw.Foreground = Color.Merge(Draw.Foreground, Color.White, 0.7) + Draw.Line(4, Draw.H - 4, Draw.W - 9, Draw.H - 4) + +End + +' Public Sub dwgExample_Draw() +' +' Dim hDrawingArea As DrawingArea = Last +' +' With hDrawingArea +' Draw.Font = .Font +' +' 'Draw.Foreground = .Foreground +' 'Draw.Line(0, .H / 2 - 2, .W - 1, .H / 2 - 2) +' 'Draw.Picture($hPicture, 0, 0, .W, .H) +' +' 'Draw.FillStyle = Fill.Solid +' 'Draw.LineStyle = Line.None +' 'Draw.FillColor = .Background +' 'Draw.Rect(8, 0, Draw.TextWidth(.Tag) + 8, .H) +' +' Draw.Text(.Tag, 8, 0, .W - 8, .H - 2, Align.Normal) +' +' End With +' +' End + +' Private Sub GetTitle(hProjectInfo As CProjectInfo) As String +' +' With hProjectInfo +' Return "" & .Name & " " & .Version & "
      " & .Title & "" +' End With +' +' End + +Public Sub lblWebSite_MouseDown() + + Last.Foreground = Color.LightBackground + +End + +Public Sub lblWebSite_MouseUp() + + Last.Foreground = Color.TextBackground + If Mouse.X >= 0 And If Mouse.Y >= 0 And If Mouse.X < Last.W And If Mouse.Y < Last.H Then + Wait + Desktop.Open(Last.Text) + Endif + +End + +Public Sub lblWebSite_Enter() + + Last.Foreground = Color.LightBackground + +End + +Public Sub lblWebSite_Leave() + + Last.Foreground = Color.Default + +End + + +Public Sub lstRecent_Menu() + + mnuSort.Popup + +End + +Private Sub UpdateMenuSort() + + Dim hMenu As Menu + + For Each hMenu In mnuSort.Children + If hMenu.Tag = $iSort Then + hMenu.Checked = True + Break + Endif + Next + +End + + +Public Sub mnuSort_Click() + + $iSort = Last.Tag + $hRecent.SetSort($iSort) + 'UpdateMenuSort + +End + +Public Sub ProjectItem_Click(Path As String, (Another) As Boolean) + + $sPath = Path + Project.Open($sPath) + +End + +Public Sub ProjectItem_Refresh() + + CRecentProject.Check() + $hRecent.Fill + $hExample.Fill + +End + +Public Sub ProjectItem_Fill() + + If Last = $hSoft Then + btnSoft.Enabled = Not $hSoft.IsVoid() + If Not btnSoft.Enabled And If $iRecent = LIST_SOFTWARE Then Toggle(LIST_RECENT) + Endif + +End + + +Public Sub btnAbout_Click() + + FAbout.Run + txtFilter.SetFocus + +End + +Public Sub btnFarm_Click() + + FSoftwareFarm.Run + + $hExample.Fill + $hSoft.Fill + +End + +Public Sub panList_Arrange() + + Dim iArr As Integer + + iArr = If(panList.W > Desktop.Scale * 70, Arrange.Row, Arrange.Vertical) + 'Debug iArr;; panList.W;; Desktop.Scale * 64 + $hRecent.SetArrangement(iArr) + $hExample.SetArrangement(iArr) + +End + +Public Sub Form_Activate() + + If $iRecent = LIST_EXAMPLE Then + txtFilterExample.SetFocus + Else + txtFilter.SetFocus + Endif + +End + +Public Sub MediaPlayer_End() + + 'Debug + $hPlayer = Null + '$hWelcome.NoTear = True + +End diff --git a/app/src/gambas3/.src/Welcome/FWelcome.form b/app/src/gambas3/.src/Welcome/FWelcome.form new file mode 100644 index 00000000..2965b8cc --- /dev/null +++ b/app/src/gambas3/.src/Welcome/FWelcome.form @@ -0,0 +1,114 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,87,81) + Background = Color.TextBackground + Foreground = Color.TextForeground + Text = ("Welcome to Gambas 3") + Icon = Picture["img/logo/logo-ide.png"] + Arrangement = Arrange.Vertical + { mnuSort Menu + { mnuSortByDate Menu mnuSort + Name = "mnuSortByDate" + Text = ("Sort by date") + Radio = True + Checked = True + Tag = "0" + } + { mnuSortByName Menu mnuSort + Name = "mnuSortByName" + Text = ("Sort by name") + Radio = True + Tag = "1" + } + { mnuSortByPath Menu mnuSort + Name = "mnuSortByPath" + Text = ("Sort by path") + Radio = True + Tag = "2" + } + } + { dwgWelcome DrawingArea + MoveScaled(4,1,20,24) + } + { HBox1 Panel + MoveScaled(1,27,78,41) + Expand = True + Arrangement = Arrange.Horizontal + { panButton ScrollView + MoveScaled(6,3,35,35) + Background = Color.ButtonBackground + Foreground = Color.TextForeground + Arrangement = Arrange.Vertical + Border = False + ScrollBar = Scroll.None + } + { Separator1 Separator + MoveScaled(43,10,0,6) + } + { panList Panel + MoveScaled(46,5,28,30) + Visible = False + Background = Color.TextBackground + Mouse = Mouse.Arrow + Expand = True + Arrangement = Arrange.Vertical + { Panel3 HBox + MoveScaled(0,0,27,4) + { panFilter Panel + MoveScaled(2,0,21,4) + Expand = True + Arrangement = Arrange.Fill + Padding = 1 + { txtFilter ButtonBox + MoveScaled(1,0,5,4) + Foreground = Color.LightForeground + Picture = Picture["icon:/small/clear"] + Border = False + } + { txtFilterExample ButtonBox + MoveScaled(7,0,5,4) + Visible = False + Foreground = Color.LightForeground + Picture = Picture["icon:/small/clear"] + Border = False + } + { txtFilterSoft ButtonBox + MoveScaled(13,0,6,4) + Visible = False + Foreground = Color.LightForeground + Picture = Picture["icon:/small/clear"] + Border = False + } + } + } + { Separator2 Separator + MoveScaled(3,6,20,0) + } + { lstRecent ScrollView + MoveScaled(2,7,9,9) + Expand = True + Spacing = True + Margin = True + Border = False + ScrollBar = Scroll.Vertical + } + { lstExample ScrollView + MoveScaled(16,17,8,10) + Expand = True + Spacing = True + Margin = True + Border = False + ScrollBar = Scroll.Vertical + } + { lstSoft ScrollView + MoveScaled(6,19,8,10) + Expand = True + Spacing = True + Margin = True + Border = False + ScrollBar = Scroll.Vertical + } + } + } +} diff --git a/app/src/gambas3/AUTHORS b/app/src/gambas3/AUTHORS new file mode 120000 index 00000000..d776b73d --- /dev/null +++ b/app/src/gambas3/AUTHORS @@ -0,0 +1 @@ +../../../AUTHORS \ No newline at end of file diff --git a/app/src/gambas3/_fake_project b/app/src/gambas3/_fake_project new file mode 100644 index 00000000..1baa758b --- /dev/null +++ b/app/src/gambas3/_fake_project @@ -0,0 +1,4 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.5.90 +Title=Fake project +Description="This is a fake project just for allowing to open a single file" diff --git a/app/src/gambas3/font/GambasBold-12.bdf b/app/src/gambas3/font/GambasBold-12.bdf new file mode 100644 index 00000000..a6a73569 --- /dev/null +++ b/app/src/gambas3/font/GambasBold-12.bdf @@ -0,0 +1,36160 @@ +STARTFONT 2.1 +FONT -xos4-Gambas-Bold-R-Normal--12-120-72-72-C-60-ISO10646-1 +SIZE 12 72 72 +FONTBOUNDINGBOX 6 12 0 -2 +COMMENT "Generated by fontforge, http://fontforge.sourceforge.net" +COMMENT "ter-u12b" +STARTPROPERTIES 20 +FAMILY_NAME "Gambas" +FOUNDRY "xos4" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +COPYRIGHT "Copyright (C) 2012 Dimitar Toshkov Zhekov" +NOTICE "Licensed under the SIL Open Font License, Version 1.1" +WEIGHT_NAME "Bold" +SLANT "R" +PIXEL_SIZE 12 +POINT_SIZE 120 +RESOLUTION_X 72 +RESOLUTION_Y 72 +SPACING "C" +AVERAGE_WIDTH 60 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +MIN_SPACE 6 +FONT_ASCENT 10 +FONT_DESCENT 2 +DEFAULT_CHAR 65533 +ENDPROPERTIES +CHARS 2398 +STARTCHAR char0 +ENCODING 0 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +88 +00 +88 +88 +00 +88 +D8 +ENDCHAR +STARTCHAR space +ENCODING 32 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 8 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +D8 +D8 +D8 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +F8 +F8 +50 +50 +F8 +F8 +50 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +78 +C0 +C0 +70 +18 +18 +F0 +20 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +60 +B0 +6C +18 +30 +60 +D8 +2C +18 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +30 +78 +78 +30 +7C +D8 +D8 +7C +ENDCHAR +STARTCHAR quotesingle +ENCODING 39 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 3 2 6 +BITMAP +C0 +C0 +C0 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +30 +60 +C0 +C0 +C0 +C0 +C0 +C0 +60 +30 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +C0 +60 +30 +30 +30 +30 +30 +30 +60 +C0 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +D8 +70 +F8 +70 +D8 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +30 +30 +FC +30 +30 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 4 1 -2 +BITMAP +60 +60 +60 +C0 +ENDCHAR +STARTCHAR hyphen +ENCODING 45 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 2 2 0 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +18 +30 +30 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +D8 +D8 +F8 +F8 +D8 +D8 +70 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 0 0 +BITMAP +30 +70 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +18 +18 +30 +60 +C0 +C0 +F8 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +18 +18 +70 +18 +18 +18 +F0 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +18 +38 +78 +D8 +F8 +18 +18 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +C0 +C0 +F0 +18 +18 +18 +F0 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +60 +C0 +F0 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +18 +18 +30 +30 +60 +60 +60 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +D8 +D8 +70 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +D8 +D8 +D8 +78 +18 +30 +60 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 6 2 0 +BITMAP +C0 +C0 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 8 1 -2 +BITMAP +60 +60 +00 +00 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +18 +30 +60 +C0 +60 +30 +18 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +F8 +00 +00 +F8 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +60 +30 +18 +30 +60 +C0 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +18 +18 +30 +60 +00 +60 +60 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +D8 +F8 +E8 +E8 +D8 +C0 +78 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +D8 +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +D8 +D8 +F0 +D8 +D8 +D8 +F0 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +C0 +C0 +C0 +C0 +C0 +C0 +78 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +E0 +D0 +D8 +D8 +D8 +D8 +D0 +E0 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +C0 +C0 +F0 +C0 +C0 +C0 +F8 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +C0 +C0 +F0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +C0 +C0 +C0 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +D8 +F8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 8 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +30 +30 +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +F0 +E0 +E0 +F0 +D8 +D8 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +F8 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +D8 +F8 +F8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +98 +D8 +F8 +F8 +F8 +F8 +D8 +C8 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +D8 +D8 +D8 +F0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +70 +D8 +D8 +D8 +D8 +D8 +F8 +70 +18 +0C +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +D8 +D8 +D8 +F0 +D8 +D8 +D8 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +C0 +C0 +70 +18 +18 +18 +F0 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +FC +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +D8 +D8 +70 +70 +70 +20 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +D8 +D8 +F8 +F8 +D8 +88 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +70 +20 +20 +70 +D8 +D8 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +CC +CC +78 +78 +30 +30 +30 +30 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +18 +18 +30 +60 +C0 +C0 +F8 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +F0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +F0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +C0 +60 +60 +30 +30 +18 +18 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 0 -1 +BITMAP +F0 +30 +30 +30 +30 +30 +30 +30 +30 +F0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +20 +70 +D8 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 1 0 0 +BITMAP +F8 +ENDCHAR +STARTCHAR grave +ENCODING 96 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 2 1 8 +BITMAP +C0 +60 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +18 +78 +D8 +D8 +78 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +C0 +F0 +D8 +D8 +D8 +D8 +F0 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +C0 +C0 +C0 +C0 +78 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +18 +78 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +D8 +F8 +C0 +C0 +78 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +38 +60 +F0 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +78 +D8 +D8 +D8 +D8 +78 +18 +70 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +C0 +F0 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 9 1 0 +BITMAP +C0 +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 11 0 -2 +BITMAP +30 +30 +00 +30 +30 +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +C0 +D8 +F0 +E0 +E0 +F0 +D8 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 8 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +60 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +F8 +F8 +F8 +D8 +D8 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F0 +D8 +D8 +D8 +D8 +F0 +C0 +C0 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +78 +D8 +D8 +D8 +D8 +78 +18 +18 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +C0 +70 +18 +18 +F0 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +C0 +C0 +F0 +C0 +C0 +C0 +C0 +70 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +D8 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +D8 +D8 +D8 +70 +70 +20 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +D8 +D8 +F8 +F8 +F8 +50 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +D8 +D8 +70 +70 +D8 +D8 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +D8 +D8 +D8 +78 +18 +70 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +18 +30 +60 +C0 +F8 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +38 +60 +60 +60 +C0 +C0 +60 +60 +60 +38 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 10 2 -1 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +E0 +30 +30 +30 +18 +18 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +68 +F8 +B0 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 8 2 0 +BITMAP +C0 +C0 +00 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +78 +C0 +C0 +C0 +C0 +78 +20 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +38 +60 +60 +F0 +60 +60 +60 +F8 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +D8 +70 +D8 +D8 +70 +D8 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +70 +20 +70 +20 +70 +20 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 10 2 -1 +BITMAP +C0 +C0 +C0 +C0 +00 +00 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +D8 +60 +F0 +D8 +78 +30 +D8 +70 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +78 +CC +B4 +BC +BC +B4 +CC +78 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 3 +BITMAP +70 +18 +78 +D8 +78 +00 +F8 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +24 +6C +D8 +6C +24 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +F8 +18 +18 +18 +ENDCHAR +STARTCHAR softhyphen +ENCODING 173 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +78 +8C +B4 +B4 +8C +B4 +B4 +78 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 1 1 9 +BITMAP +F0 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +70 +D8 +70 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +30 +FC +30 +30 +00 +FC +ENDCHAR +STARTCHAR twosuperior +ENCODING 178 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 5 +BITMAP +F0 +18 +70 +C0 +F8 +ENDCHAR +STARTCHAR threesuperior +ENCODING 179 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 5 +BITMAP +F0 +18 +70 +18 +F0 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 2 2 8 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni00B5 +ENCODING 181 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +D8 +D8 +D8 +E8 +C0 +C0 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +E8 +E8 +E8 +68 +28 +28 +28 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 2 2 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 3 0 -2 +BITMAP +20 +20 +C0 +ENDCHAR +STARTCHAR onesuperior +ENCODING 185 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +60 +E0 +60 +60 +60 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 5 +BITMAP +70 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +90 +D8 +6C +D8 +90 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +60 +E0 +60 +64 +68 +10 +20 +4C +9C +34 +3C +0C +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +60 +E0 +60 +64 +68 +10 +20 +78 +8C +18 +30 +3C +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +E0 +30 +E0 +34 +E8 +10 +20 +4C +9C +34 +3C +0C +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +30 +00 +30 +60 +C0 +C0 +78 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +70 +D8 +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +70 +D8 +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +20 +70 +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +70 +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +70 +D8 +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +20 +70 +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +7C +D8 +D8 +FC +D8 +D8 +D8 +DC +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +78 +C0 +C0 +C0 +C0 +C0 +C0 +78 +20 +C0 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +F8 +C0 +C0 +F0 +C0 +C0 +C0 +F8 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +F8 +C0 +C0 +F0 +C0 +C0 +C0 +F8 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +F8 +C0 +C0 +F0 +C0 +C0 +C0 +F8 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +F8 +C0 +C0 +F0 +C0 +C0 +C0 +F8 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +80 +40 +00 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 10 2 0 +BITMAP +40 +80 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +40 +A0 +00 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +A0 +00 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +E0 +D0 +D8 +F8 +D8 +D8 +D0 +E0 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +A8 +90 +00 +98 +D8 +F8 +F8 +D8 +C8 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +70 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +70 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +70 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +70 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +70 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +D8 +70 +20 +70 +D8 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +08 +70 +D8 +D8 +F8 +F8 +D8 +D8 +70 +80 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +D8 +D8 +70 +70 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +F0 +D8 +D8 +D8 +F0 +C0 +C0 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +70 +D8 +D8 +F0 +D8 +CC +EC +F8 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +00 +70 +18 +78 +D8 +D8 +78 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +70 +18 +78 +D8 +D8 +78 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +00 +70 +18 +78 +D8 +D8 +78 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +A8 +90 +00 +70 +18 +78 +D8 +D8 +78 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +70 +18 +78 +D8 +D8 +78 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +20 +00 +70 +18 +78 +D8 +D8 +78 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +34 +7C +F8 +B0 +7C +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +78 +C0 +C0 +C0 +C0 +78 +20 +C0 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +00 +70 +D8 +F8 +C0 +C0 +78 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +70 +D8 +F8 +C0 +C0 +78 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +00 +70 +D8 +F8 +C0 +C0 +78 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +70 +D8 +F8 +C0 +C0 +78 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 9 2 0 +BITMAP +80 +40 +00 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 9 2 0 +BITMAP +40 +80 +00 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +40 +A0 +00 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +A0 +00 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +60 +38 +70 +18 +78 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +A8 +90 +00 +F0 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +A8 +90 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +30 +00 +FC +00 +30 +30 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +08 +70 +D8 +F8 +F8 +D8 +70 +80 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +00 +D8 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +D8 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +00 +D8 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +D8 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +20 +00 +D8 +D8 +D8 +D8 +D8 +78 +18 +70 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +C0 +C0 +F0 +D8 +D8 +D8 +D8 +F0 +C0 +C0 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +50 +00 +D8 +D8 +D8 +D8 +D8 +78 +18 +70 +ENDCHAR +STARTCHAR Amacron +ENCODING 256 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +70 +D8 +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR amacron +ENCODING 257 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +00 +70 +18 +78 +D8 +D8 +78 +ENDCHAR +STARTCHAR Abreve +ENCODING 258 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR abreve +ENCODING 259 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +70 +00 +70 +18 +78 +D8 +D8 +78 +ENDCHAR +STARTCHAR Aogonek +ENCODING 260 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +70 +D8 +D8 +D8 +F8 +D8 +D8 +D8 +10 +0C +ENDCHAR +STARTCHAR aogonek +ENCODING 261 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +70 +18 +78 +D8 +D8 +78 +10 +0C +ENDCHAR +STARTCHAR Cacute +ENCODING 262 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +78 +C0 +C0 +C0 +C0 +C0 +C0 +78 +ENDCHAR +STARTCHAR cacute +ENCODING 263 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +78 +C0 +C0 +C0 +C0 +78 +ENDCHAR +STARTCHAR Ccircumflex +ENCODING 264 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +78 +C0 +C0 +C0 +C0 +C0 +C0 +78 +ENDCHAR +STARTCHAR ccircumflex +ENCODING 265 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +00 +78 +C0 +C0 +C0 +C0 +78 +ENDCHAR +STARTCHAR Cdotaccent +ENCODING 266 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +78 +C0 +C0 +C0 +C0 +C0 +C0 +78 +ENDCHAR +STARTCHAR cdotaccent +ENCODING 267 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +78 +C0 +C0 +C0 +C0 +78 +ENDCHAR +STARTCHAR Ccaron +ENCODING 268 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +78 +C0 +C0 +C0 +C0 +C0 +C0 +78 +ENDCHAR +STARTCHAR ccaron +ENCODING 269 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +20 +00 +78 +C0 +C0 +C0 +C0 +78 +ENDCHAR +STARTCHAR Dcaron +ENCODING 270 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +A0 +40 +E0 +D0 +D8 +D8 +D8 +D8 +D0 +E0 +ENDCHAR +STARTCHAR dcaron +ENCODING 271 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +18 +18 +78 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR Dcroat +ENCODING 272 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +E0 +D0 +D8 +F8 +D8 +D8 +D0 +E0 +ENDCHAR +STARTCHAR dcroat +ENCODING 273 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +18 +3C +18 +78 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR Emacron +ENCODING 274 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +F8 +C0 +C0 +F0 +C0 +C0 +C0 +F8 +ENDCHAR +STARTCHAR emacron +ENCODING 275 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +00 +70 +D8 +F8 +C0 +C0 +78 +ENDCHAR +STARTCHAR Ebreve +ENCODING 276 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +F8 +C0 +C0 +F0 +C0 +C0 +F8 +ENDCHAR +STARTCHAR ebreve +ENCODING 277 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +70 +00 +70 +D8 +F8 +C0 +C0 +78 +ENDCHAR +STARTCHAR Edotaccent +ENCODING 278 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +F8 +C0 +C0 +F0 +C0 +C0 +C0 +F8 +ENDCHAR +STARTCHAR edotaccent +ENCODING 279 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +70 +D8 +F8 +C0 +C0 +78 +ENDCHAR +STARTCHAR Eogonek +ENCODING 280 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +F8 +C0 +C0 +F0 +C0 +C0 +C0 +F8 +10 +0C +ENDCHAR +STARTCHAR eogonek +ENCODING 281 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +70 +D8 +F8 +C0 +C0 +78 +20 +18 +ENDCHAR +STARTCHAR Ecaron +ENCODING 282 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +F8 +C0 +C0 +F0 +C0 +C0 +C0 +F8 +ENDCHAR +STARTCHAR ecaron +ENCODING 283 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +20 +00 +70 +D8 +F8 +C0 +C0 +78 +ENDCHAR +STARTCHAR Gcircumflex +ENCODING 284 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +78 +C0 +C0 +C0 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR gcircumflex +ENCODING 285 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +20 +50 +00 +78 +D8 +D8 +D8 +D8 +78 +18 +70 +ENDCHAR +STARTCHAR Gbreve +ENCODING 286 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +78 +C0 +C0 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR gbreve +ENCODING 287 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +88 +70 +00 +78 +D8 +D8 +D8 +D8 +78 +18 +70 +ENDCHAR +STARTCHAR Gdotaccent +ENCODING 288 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +78 +C0 +C0 +C0 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR gdotaccent +ENCODING 289 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +00 +78 +D8 +D8 +D8 +D8 +78 +18 +70 +ENDCHAR +STARTCHAR Gcommaaccent +ENCODING 290 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +78 +C0 +C0 +C0 +D8 +D8 +D8 +70 +20 +C0 +ENDCHAR +STARTCHAR gcommaaccent +ENCODING 291 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +18 +20 +78 +D8 +D8 +D8 +D8 +78 +18 +70 +ENDCHAR +STARTCHAR Hcircumflex +ENCODING 292 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +D8 +D8 +D8 +F8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR hcircumflex +ENCODING 293 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +C0 +C0 +F0 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR Hbar +ENCODING 294 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +D8 +FC +D8 +F8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR hbar +ENCODING 295 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +F0 +C0 +F0 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR Itilde +ENCODING 296 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +A8 +90 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR itilde +ENCODING 297 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +A8 +90 +00 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR Imacron +ENCODING 298 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +E0 +00 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR imacron +ENCODING 299 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +E0 +00 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR Ibreve +ENCODING 300 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR ibreve +ENCODING 301 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +70 +00 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR Iogonek +ENCODING 302 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +80 +60 +ENDCHAR +STARTCHAR iogonek +ENCODING 303 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 11 2 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +80 +60 +ENDCHAR +STARTCHAR Idotaccent +ENCODING 304 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 10 2 0 +BITMAP +80 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR dotlessi +ENCODING 305 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 6 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR IJ +ENCODING 306 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +CC +CC +CC +CC +CC +CC +CC +D8 +ENDCHAR +STARTCHAR ij +ENCODING 307 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +D8 +00 +D8 +D8 +D8 +D8 +D8 +D8 +18 +70 +ENDCHAR +STARTCHAR Jcircumflex +ENCODING 308 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +28 +00 +18 +18 +18 +18 +18 +18 +F0 +ENDCHAR +STARTCHAR jcircumflex +ENCODING 309 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 11 0 -2 +BITMAP +20 +50 +00 +30 +30 +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR Kcommaaccent +ENCODING 310 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +D8 +D8 +F0 +E0 +E0 +F0 +D8 +D8 +20 +C0 +ENDCHAR +STARTCHAR kcommaaccent +ENCODING 311 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +C0 +C0 +D8 +F0 +E0 +E0 +F0 +D8 +20 +C0 +ENDCHAR +STARTCHAR kgreenlandic +ENCODING 312 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +D8 +F0 +E0 +E0 +F0 +D8 +ENDCHAR +STARTCHAR Lacute +ENCODING 313 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +40 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +F8 +ENDCHAR +STARTCHAR lacute +ENCODING 314 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 2 0 +BITMAP +40 +80 +00 +C0 +C0 +C0 +C0 +C0 +C0 +60 +ENDCHAR +STARTCHAR Lcommaaccent +ENCODING 315 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +F8 +20 +C0 +ENDCHAR +STARTCHAR lcommaaccent +ENCODING 316 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 -2 +BITMAP +60 +60 +60 +60 +60 +60 +60 +30 +20 +C0 +ENDCHAR +STARTCHAR Lcaron +ENCODING 317 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +F8 +ENDCHAR +STARTCHAR lcaron +ENCODING 318 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +A0 +40 +00 +60 +60 +60 +60 +60 +60 +30 +ENDCHAR +STARTCHAR Ldot +ENCODING 319 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +C0 +C0 +D8 +D8 +C0 +C0 +F8 +ENDCHAR +STARTCHAR ldot +ENCODING 320 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +C0 +C0 +D8 +D8 +C0 +C0 +60 +ENDCHAR +STARTCHAR Lslash +ENCODING 321 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +60 +60 +60 +70 +E0 +60 +60 +7C +ENDCHAR +STARTCHAR lslash +ENCODING 322 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +60 +60 +60 +70 +E0 +60 +60 +30 +ENDCHAR +STARTCHAR Nacute +ENCODING 323 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +98 +D8 +F8 +F8 +F8 +F8 +D8 +C8 +ENDCHAR +STARTCHAR nacute +ENCODING 324 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +F0 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR Ncommaaccent +ENCODING 325 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +98 +D8 +F8 +F8 +F8 +F8 +D8 +C8 +20 +C0 +ENDCHAR +STARTCHAR ncommaaccent +ENCODING 326 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F0 +D8 +D8 +D8 +D8 +D8 +20 +C0 +ENDCHAR +STARTCHAR Ncaron +ENCODING 327 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +98 +D8 +F8 +F8 +F8 +F8 +D8 +C8 +ENDCHAR +STARTCHAR ncaron +ENCODING 328 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +20 +00 +F0 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR napostrophe +ENCODING 329 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +40 +80 +00 +F0 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR Eng +ENCODING 330 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +98 +D8 +F8 +F8 +F8 +F8 +D8 +C8 +08 +10 +ENDCHAR +STARTCHAR eng +ENCODING 331 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F0 +D8 +D8 +D8 +D8 +D8 +08 +10 +ENDCHAR +STARTCHAR Omacron +ENCODING 332 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +70 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR omacron +ENCODING 333 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR Obreve +ENCODING 334 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR obreve +ENCODING 335 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +70 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR Ohungarumlaut +ENCODING 336 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +28 +50 +70 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR ohungarumlaut +ENCODING 337 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +50 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR OE +ENCODING 338 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +7C +D8 +D8 +DC +D8 +D8 +D8 +7C +ENDCHAR +STARTCHAR oe +ENCODING 339 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +78 +B4 +BC +B8 +B0 +7C +ENDCHAR +STARTCHAR Racute +ENCODING 340 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +F0 +D8 +D8 +D8 +F0 +D8 +D8 +D8 +ENDCHAR +STARTCHAR racute +ENCODING 341 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +78 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Rcommaaccent +ENCODING 342 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F0 +D8 +D8 +D8 +F0 +D8 +D8 +D8 +20 +C0 +ENDCHAR +STARTCHAR rcommaaccent +ENCODING 343 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +78 +C0 +C0 +C0 +C0 +C0 +20 +C0 +ENDCHAR +STARTCHAR Rcaron +ENCODING 344 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +F0 +D8 +D8 +D8 +F0 +D8 +D8 +D8 +ENDCHAR +STARTCHAR rcaron +ENCODING 345 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +20 +00 +78 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Sacute +ENCODING 346 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +78 +C0 +C0 +70 +18 +18 +18 +F0 +ENDCHAR +STARTCHAR sacute +ENCODING 347 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +78 +C0 +70 +18 +18 +F0 +ENDCHAR +STARTCHAR Scircumflex +ENCODING 348 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +78 +C0 +C0 +70 +18 +18 +18 +F0 +ENDCHAR +STARTCHAR scircumflex +ENCODING 349 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +00 +78 +C0 +70 +18 +18 +F0 +ENDCHAR +STARTCHAR Scedilla +ENCODING 350 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +78 +C0 +C0 +70 +18 +18 +18 +F0 +20 +C0 +ENDCHAR +STARTCHAR scedilla +ENCODING 351 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +78 +C0 +70 +18 +18 +F0 +20 +C0 +ENDCHAR +STARTCHAR Scaron +ENCODING 352 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +78 +C0 +C0 +70 +18 +18 +18 +F0 +ENDCHAR +STARTCHAR scaron +ENCODING 353 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +20 +00 +78 +C0 +70 +18 +18 +F0 +ENDCHAR +STARTCHAR Tcommaaccent +ENCODING 354 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +FC +30 +30 +30 +30 +30 +30 +30 +10 +60 +ENDCHAR +STARTCHAR tcommaaccent +ENCODING 355 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 -2 +BITMAP +C0 +C0 +F0 +C0 +C0 +C0 +C0 +70 +20 +C0 +ENDCHAR +STARTCHAR Tcaron +ENCODING 356 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +50 +20 +FC +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR tcaron +ENCODING 357 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +A0 +40 +C0 +C0 +F0 +C0 +C0 +C0 +C0 +70 +ENDCHAR +STARTCHAR Tbar +ENCODING 358 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +FC +30 +30 +78 +30 +30 +30 +30 +ENDCHAR +STARTCHAR tbar +ENCODING 359 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +60 +78 +60 +F0 +60 +60 +38 +ENDCHAR +STARTCHAR Utilde +ENCODING 360 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR utilde +ENCODING 361 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +A8 +90 +00 +D8 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR Umacron +ENCODING 362 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR umacron +ENCODING 363 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +00 +D8 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR Ubreve +ENCODING 364 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR ubreve +ENCODING 365 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +70 +00 +D8 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR Uring +ENCODING 366 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +20 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uring +ENCODING 367 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +20 +00 +D8 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR Uhungarumlaut +ENCODING 368 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +28 +50 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uhungarumlaut +ENCODING 369 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +50 +00 +D8 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR Uogonek +ENCODING 370 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +D8 +D8 +D8 +D8 +D8 +D8 +D8 +70 +20 +18 +ENDCHAR +STARTCHAR uogonek +ENCODING 371 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +D8 +D8 +D8 +D8 +D8 +78 +10 +0C +ENDCHAR +STARTCHAR Wcircumflex +ENCODING 372 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +D8 +D8 +D8 +D8 +F8 +F8 +D8 +88 +ENDCHAR +STARTCHAR wcircumflex +ENCODING 373 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +00 +D8 +D8 +F8 +F8 +F8 +50 +ENDCHAR +STARTCHAR Ycircumflex +ENCODING 374 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +20 +50 +CC +CC +78 +78 +30 +30 +30 +30 +ENDCHAR +STARTCHAR ycircumflex +ENCODING 375 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +20 +50 +00 +D8 +D8 +D8 +D8 +D8 +78 +18 +70 +ENDCHAR +STARTCHAR Ydieresis +ENCODING 376 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +50 +00 +CC +CC +78 +78 +30 +30 +30 +30 +ENDCHAR +STARTCHAR Zacute +ENCODING 377 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +F8 +18 +18 +30 +60 +C0 +C0 +F8 +ENDCHAR +STARTCHAR zacute +ENCODING 378 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +F8 +18 +30 +60 +C0 +F8 +ENDCHAR +STARTCHAR Zdotaccent +ENCODING 379 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +F8 +18 +18 +30 +60 +C0 +C0 +F8 +ENDCHAR +STARTCHAR zdotaccent +ENCODING 380 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +F8 +18 +30 +60 +C0 +F8 +ENDCHAR +STARTCHAR Zcaron +ENCODING 381 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +F8 +18 +18 +30 +60 +C0 +C0 +F8 +ENDCHAR +STARTCHAR zcaron +ENCODING 382 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +20 +00 +F8 +18 +30 +60 +C0 +F8 +ENDCHAR +STARTCHAR longs +ENCODING 383 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +70 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni0180 +ENCODING 384 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +E0 +C0 +F0 +D8 +D8 +D8 +F0 +ENDCHAR +STARTCHAR uni0181 +ENCODING 385 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +C0 +78 +6C +6C +78 +6C +6C +6C +78 +ENDCHAR +STARTCHAR uni0182 +ENCODING 386 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F0 +C0 +C0 +F0 +D8 +D8 +D8 +D8 +F0 +ENDCHAR +STARTCHAR uni0183 +ENCODING 387 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +C0 +F0 +D8 +D8 +D8 +D8 +F0 +ENDCHAR +STARTCHAR uni0184 +ENCODING 388 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +60 +E0 +E0 +78 +6C +6C +6C +78 +ENDCHAR +STARTCHAR uni0185 +ENCODING 389 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +60 +E0 +F8 +6C +6C +6C +6C +78 +ENDCHAR +STARTCHAR uni0186 +ENCODING 390 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +18 +18 +18 +18 +18 +18 +F0 +ENDCHAR +STARTCHAR uni0187 +ENCODING 391 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +04 +08 +78 +C0 +C0 +C0 +C0 +C0 +C0 +78 +ENDCHAR +STARTCHAR uni0188 +ENCODING 392 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +04 +08 +78 +C0 +C0 +C0 +C0 +78 +ENDCHAR +STARTCHAR uni0189 +ENCODING 393 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +78 +6C +6C +EC +6C +6C +6C +78 +ENDCHAR +STARTCHAR uni018A +ENCODING 394 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +C0 +78 +6C +6C +6C +6C +6C +6C +78 +ENDCHAR +STARTCHAR uni018B +ENCODING 395 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +78 +18 +18 +78 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni018C +ENCODING 396 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +18 +78 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni018D +ENCODING 397 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +D8 +D8 +D8 +70 +30 +18 +70 +ENDCHAR +STARTCHAR uni018E +ENCODING 398 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +18 +18 +78 +18 +18 +18 +F8 +ENDCHAR +STARTCHAR Schwa +ENCODING 399 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +18 +18 +18 +F8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni0190 +ENCODING 400 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +C0 +C0 +70 +C0 +C0 +C0 +78 +ENDCHAR +STARTCHAR uni0191 +ENCODING 401 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +78 +60 +60 +70 +60 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR florin +ENCODING 402 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 1 -1 +BITMAP +38 +60 +60 +F0 +60 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR uni0193 +ENCODING 403 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +04 +78 +C0 +C0 +C0 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni0194 +ENCODING 404 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +70 +20 +70 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni0195 +ENCODING 405 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +C0 +C0 +E0 +F4 +D4 +D4 +DC +C8 +ENDCHAR +STARTCHAR uni0196 +ENCODING 406 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +70 +ENDCHAR +STARTCHAR uni0197 +ENCODING 407 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +60 +60 +60 +60 +F0 +60 +60 +60 +ENDCHAR +STARTCHAR uni0198 +ENCODING 408 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +0C +D8 +D8 +F0 +E0 +E0 +F0 +D8 +D8 +ENDCHAR +STARTCHAR uni0199 +ENCODING 409 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +60 +C0 +C0 +D8 +F0 +E0 +E0 +F0 +D8 +ENDCHAR +STARTCHAR uni019A +ENCODING 410 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +60 +60 +60 +60 +F0 +60 +60 +30 +ENDCHAR +STARTCHAR uni019B +ENCODING 411 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +60 +78 +F0 +30 +78 +78 +CC +CC +ENDCHAR +STARTCHAR uni019C +ENCODING 412 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A8 +A8 +F8 +F8 +F8 +F8 +F8 +78 +ENDCHAR +STARTCHAR uni019D +ENCODING 413 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +4C +6C +7C +7C +7C +7C +6C +64 +C0 +ENDCHAR +STARTCHAR uni019E +ENCODING 414 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F0 +D8 +D8 +D8 +D8 +D8 +18 +18 +ENDCHAR +STARTCHAR uni019F +ENCODING 415 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +D8 +D8 +F8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR Ohorn +ENCODING 416 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +04 +74 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR ohorn +ENCODING 417 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +04 +74 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni01A2 +ENCODING 418 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +74 +DC +DC +DC +DC +DC +DC +74 +ENDCHAR +STARTCHAR uni01A3 +ENCODING 419 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +74 +DC +DC +DC +DC +7C +0C +0C +ENDCHAR +STARTCHAR uni01A4 +ENCODING 420 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +78 +B4 +34 +34 +38 +30 +30 +30 +ENDCHAR +STARTCHAR uni01A5 +ENCODING 421 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +78 +B4 +34 +34 +34 +38 +30 +30 +ENDCHAR +STARTCHAR uni01A6 +ENCODING 422 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +C0 +F0 +D8 +D8 +D8 +F0 +E0 +F0 +D8 +08 +ENDCHAR +STARTCHAR uni01A7 +ENCODING 423 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +18 +18 +70 +C0 +C0 +C0 +78 +ENDCHAR +STARTCHAR uni01A8 +ENCODING 424 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +18 +70 +C0 +C0 +78 +ENDCHAR +STARTCHAR uni01A9 +ENCODING 425 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +C0 +60 +30 +60 +60 +C0 +F8 +ENDCHAR +STARTCHAR uni01AA +ENCODING 426 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +60 +B0 +70 +30 +30 +30 +30 +30 +30 +30 +30 +18 +ENDCHAR +STARTCHAR uni01AB +ENCODING 427 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 -2 +BITMAP +C0 +C0 +F0 +C0 +C0 +C0 +C0 +70 +10 +20 +ENDCHAR +STARTCHAR uni01AC +ENCODING 428 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +7C +B0 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni01AD +ENCODING 429 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +60 +C0 +C0 +F0 +C0 +C0 +C0 +C0 +70 +ENDCHAR +STARTCHAR uni01AE +ENCODING 430 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +FC +30 +30 +30 +30 +30 +30 +30 +18 +ENDCHAR +STARTCHAR Uhorn +ENCODING 431 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +0C +D8 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uhorn +ENCODING 432 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +D8 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni01B1 +ENCODING 433 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +50 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni01B2 +ENCODING 434 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +0C +D8 +D8 +D8 +D8 +F8 +70 +70 +20 +ENDCHAR +STARTCHAR uni01B3 +ENCODING 435 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +04 +08 +CC +CC +78 +78 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni01B4 +ENCODING 436 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +04 +08 +D8 +D8 +D8 +D8 +D8 +78 +18 +70 +ENDCHAR +STARTCHAR uni01B5 +ENCODING 437 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +18 +18 +F8 +60 +C0 +C0 +F8 +ENDCHAR +STARTCHAR uni01B6 +ENCODING 438 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +18 +F8 +60 +C0 +F8 +ENDCHAR +STARTCHAR Ezh +ENCODING 439 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +18 +30 +70 +18 +18 +18 +F0 +ENDCHAR +STARTCHAR uni01B8 +ENCODING 440 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +C0 +60 +70 +C0 +C0 +C0 +78 +ENDCHAR +STARTCHAR uni01B9 +ENCODING 441 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F8 +C0 +60 +70 +C0 +C0 +C0 +78 +ENDCHAR +STARTCHAR uni01BA +ENCODING 442 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F8 +18 +70 +18 +18 +70 +C0 +70 +ENDCHAR +STARTCHAR uni01BB +ENCODING 443 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +18 +18 +30 +F8 +60 +C0 +F8 +ENDCHAR +STARTCHAR uni01BC +ENCODING 444 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +C0 +C0 +F0 +18 +18 +18 +F0 +ENDCHAR +STARTCHAR uni01BD +ENCODING 445 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F8 +C0 +C0 +F0 +18 +18 +18 +F0 +ENDCHAR +STARTCHAR uni01BE +ENCODING 446 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +F0 +60 +70 +18 +18 +18 +F0 +ENDCHAR +STARTCHAR uni01BF +ENCODING 447 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F0 +D8 +D8 +D8 +D0 +E0 +C0 +C0 +ENDCHAR +STARTCHAR uni01C0 +ENCODING 448 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 2 8 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni01C1 +ENCODING 449 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni01C2 +ENCODING 450 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +30 +FC +30 +30 +FC +30 +30 +30 +ENDCHAR +STARTCHAR uni01C3 +ENCODING 451 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 2 8 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni01C4 +ENCODING 452 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +14 +08 +DC +FC +A4 +A8 +A8 +B0 +FC +DC +ENDCHAR +STARTCHAR uni01C5 +ENCODING 453 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +D4 +E8 +BC +A4 +AC +B8 +F0 +DC +ENDCHAR +STARTCHAR uni01C6 +ENCODING 454 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +34 +28 +7C +E4 +AC +B8 +F0 +7C +ENDCHAR +STARTCHAR uni01C7 +ENCODING 455 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +CC +CC +CC +CC +CC +CC +CC +F8 +ENDCHAR +STARTCHAR uni01C8 +ENCODING 456 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +0C +CC +C0 +CC +CC +CC +CC +CC +FC +0C +38 +ENDCHAR +STARTCHAR uni01C9 +ENCODING 457 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +18 +D8 +C0 +D8 +D8 +D8 +D8 +D8 +78 +18 +70 +ENDCHAR +STARTCHAR uni01CA +ENCODING 458 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +AC +EC +EC +EC +EC +EC +EC +B8 +ENDCHAR +STARTCHAR uni01CB +ENCODING 459 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +0C +AC +E0 +EC +EC +EC +EC +EC +AC +0C +38 +ENDCHAR +STARTCHAR uni01CC +ENCODING 460 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +0C +0C +00 +CC +EC +AC +AC +AC +AC +0C +38 +ENDCHAR +STARTCHAR uni01CD +ENCODING 461 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +70 +D8 +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni01CE +ENCODING 462 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +20 +00 +70 +18 +78 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni01CF +ENCODING 463 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +A0 +40 +00 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni01D0 +ENCODING 464 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +A0 +40 +00 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni01D1 +ENCODING 465 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +70 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni01D2 +ENCODING 466 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +20 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni01D3 +ENCODING 467 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni01D4 +ENCODING 468 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +20 +00 +D8 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni01D5 +ENCODING 469 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +50 +00 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni01D6 +ENCODING 470 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +50 +00 +D8 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni01D7 +ENCODING 471 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +50 +00 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni01D8 +ENCODING 472 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +50 +00 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni01D9 +ENCODING 473 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +50 +00 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni01DA +ENCODING 474 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +50 +00 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni01DB +ENCODING 475 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +50 +00 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni01DC +ENCODING 476 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +50 +00 +D8 +D8 +D8 +F8 +78 +ENDCHAR +STARTCHAR uni01DD +ENCODING 477 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +18 +18 +F8 +D8 +70 +ENDCHAR +STARTCHAR uni01DE +ENCODING 478 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +50 +70 +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni01DF +ENCODING 479 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +50 +00 +70 +18 +78 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni01E0 +ENCODING 480 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +20 +70 +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni01E1 +ENCODING 481 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +20 +00 +70 +18 +78 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni01E2 +ENCODING 482 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +70 +00 +7C +D8 +D8 +FC +D8 +D8 +D8 +DC +ENDCHAR +STARTCHAR uni01E3 +ENCODING 483 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +00 +70 +28 +78 +F0 +A0 +78 +ENDCHAR +STARTCHAR uni01E4 +ENCODING 484 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +78 +C0 +C0 +D8 +D8 +DC +D8 +70 +ENDCHAR +STARTCHAR uni01E5 +ENCODING 485 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +78 +D8 +D8 +DC +D8 +78 +18 +70 +ENDCHAR +STARTCHAR Gcaron +ENCODING 486 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +78 +C0 +C0 +C0 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR gcaron +ENCODING 487 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +50 +20 +00 +78 +D8 +D8 +D8 +D8 +78 +18 +70 +ENDCHAR +STARTCHAR uni01E8 +ENCODING 488 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +D8 +D8 +F0 +E0 +E0 +F0 +D8 +D8 +ENDCHAR +STARTCHAR uni01E9 +ENCODING 489 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +C0 +C0 +D8 +F0 +E0 +E0 +F0 +D8 +ENDCHAR +STARTCHAR uni01EA +ENCODING 490 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +D8 +D8 +D8 +D8 +D8 +D8 +70 +20 +18 +ENDCHAR +STARTCHAR uni01EB +ENCODING 491 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +70 +D8 +D8 +D8 +D8 +70 +20 +18 +ENDCHAR +STARTCHAR uni01EC +ENCODING 492 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +70 +00 +70 +D8 +D8 +D8 +D8 +D8 +D8 +70 +20 +18 +ENDCHAR +STARTCHAR uni01ED +ENCODING 493 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +00 +70 +D8 +D8 +D8 +D8 +70 +20 +18 +ENDCHAR +STARTCHAR uni01EE +ENCODING 494 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +F8 +18 +30 +70 +18 +18 +18 +F0 +ENDCHAR +STARTCHAR uni01EF +ENCODING 495 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +50 +20 +00 +F8 +18 +30 +70 +18 +18 +18 +F0 +ENDCHAR +STARTCHAR uni01F0 +ENCODING 496 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 11 1 -2 +BITMAP +50 +20 +00 +30 +30 +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR uni01F1 +ENCODING 497 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +DC +E4 +AC +A8 +A8 +B8 +F0 +DC +ENDCHAR +STARTCHAR uni01F2 +ENCODING 498 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +C0 +E0 +BC +A4 +AC +B8 +F0 +DC +ENDCHAR +STARTCHAR uni01F3 +ENCODING 499 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +20 +20 +7C +E4 +AC +B8 +F0 +7C +ENDCHAR +STARTCHAR uni01F4 +ENCODING 500 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +78 +C0 +C0 +C0 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni01F5 +ENCODING 501 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +20 +00 +78 +D8 +D8 +D8 +D8 +78 +18 +70 +ENDCHAR +STARTCHAR uni01F6 +ENCODING 502 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A0 +A0 +E0 +E8 +E8 +A8 +B8 +90 +ENDCHAR +STARTCHAR uni01F7 +ENCODING 503 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +D8 +D8 +D0 +E0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni01F8 +ENCODING 504 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +98 +D8 +F8 +F8 +F8 +F8 +D8 +C8 +ENDCHAR +STARTCHAR uni01F9 +ENCODING 505 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +00 +F0 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR Aringacute +ENCODING 506 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +50 +20 +70 +D8 +D8 +F8 +D8 +D8 +ENDCHAR +STARTCHAR aringacute +ENCODING 507 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +50 +20 +70 +18 +78 +D8 +D8 +78 +ENDCHAR +STARTCHAR AEacute +ENCODING 508 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +10 +20 +7C +D8 +D8 +FC +D8 +D8 +D8 +DC +ENDCHAR +STARTCHAR aeacute +ENCODING 509 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +70 +28 +78 +F0 +A0 +78 +ENDCHAR +STARTCHAR Oslashacute +ENCODING 510 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +20 +48 +70 +D8 +D8 +F8 +F8 +D8 +D8 +70 +80 +ENDCHAR +STARTCHAR oslashacute +ENCODING 511 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +48 +70 +D8 +F8 +F8 +D8 +70 +80 +ENDCHAR +STARTCHAR uni0200 +ENCODING 512 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +A0 +50 +70 +D8 +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni0201 +ENCODING 513 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A0 +50 +00 +70 +18 +78 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni0202 +ENCODING 514 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +70 +D8 +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni0203 +ENCODING 515 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +00 +70 +18 +78 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni0204 +ENCODING 516 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +A0 +50 +F8 +C0 +C0 +F0 +C0 +C0 +C0 +F8 +ENDCHAR +STARTCHAR uni0205 +ENCODING 517 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A0 +50 +00 +70 +D8 +F8 +C0 +C0 +78 +ENDCHAR +STARTCHAR uni0206 +ENCODING 518 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +00 +F8 +C0 +C0 +F0 +C0 +C0 +F8 +ENDCHAR +STARTCHAR uni0207 +ENCODING 519 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +00 +70 +C8 +F8 +C0 +C0 +78 +ENDCHAR +STARTCHAR uni0208 +ENCODING 520 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 0 0 +BITMAP +A0 +50 +00 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni0209 +ENCODING 521 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 9 0 0 +BITMAP +A0 +50 +00 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni020A +ENCODING 522 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni020B +ENCODING 523 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +00 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni020C +ENCODING 524 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +A0 +50 +70 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni020D +ENCODING 525 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A0 +50 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni020E +ENCODING 526 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +70 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni020F +ENCODING 527 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni0210 +ENCODING 528 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +A0 +50 +F0 +D8 +D8 +D8 +F0 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni0211 +ENCODING 529 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A0 +50 +00 +78 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni0212 +ENCODING 530 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +00 +F0 +D8 +D8 +F0 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni0213 +ENCODING 531 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +00 +78 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni0214 +ENCODING 532 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +A0 +50 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni0215 +ENCODING 533 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A0 +50 +00 +D8 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni0216 +ENCODING 534 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +00 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni0217 +ENCODING 535 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +00 +D8 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR Scommaaccent +ENCODING 536 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +78 +C0 +C0 +70 +18 +18 +18 +F0 +20 +40 +ENDCHAR +STARTCHAR scommaaccent +ENCODING 537 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +78 +C0 +70 +18 +18 +F0 +20 +40 +ENDCHAR +STARTCHAR uni021A +ENCODING 538 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +FC +30 +30 +30 +30 +30 +30 +30 +20 +40 +ENDCHAR +STARTCHAR uni021B +ENCODING 539 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 -2 +BITMAP +C0 +C0 +F0 +C0 +C0 +C0 +C0 +70 +40 +80 +ENDCHAR +STARTCHAR uni021C +ENCODING 540 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +18 +18 +70 +18 +18 +30 +E0 +ENDCHAR +STARTCHAR uni021D +ENCODING 541 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F0 +18 +18 +70 +18 +18 +30 +E0 +ENDCHAR +STARTCHAR uni021E +ENCODING 542 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +D8 +D8 +D8 +F8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni021F +ENCODING 543 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +C0 +C0 +F0 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni0220 +ENCODING 544 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F0 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +18 +18 +ENDCHAR +STARTCHAR uni0221 +ENCODING 545 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +20 +20 +60 +E0 +A8 +BC +F4 +78 +10 +10 +ENDCHAR +STARTCHAR uni0222 +ENCODING 546 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +D8 +70 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni0223 +ENCODING 547 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +D8 +D8 +70 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni0224 +ENCODING 548 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F8 +18 +18 +30 +60 +C0 +C0 +F8 +08 +10 +ENDCHAR +STARTCHAR uni0225 +ENCODING 549 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F8 +18 +30 +60 +C0 +F8 +08 +10 +ENDCHAR +STARTCHAR uni0226 +ENCODING 550 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +70 +D8 +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni0227 +ENCODING 551 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +70 +18 +78 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni0228 +ENCODING 552 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F8 +C0 +C0 +F0 +C0 +C0 +C0 +F8 +20 +C0 +ENDCHAR +STARTCHAR uni0229 +ENCODING 553 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +70 +D8 +F8 +C0 +C0 +78 +20 +C0 +ENDCHAR +STARTCHAR uni022A +ENCODING 554 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +50 +70 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni022B +ENCODING 555 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +50 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni022C +ENCODING 556 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +68 +B0 +00 +70 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni022D +ENCODING 557 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +68 +B0 +00 +70 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni022E +ENCODING 558 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +70 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni022F +ENCODING 559 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni0230 +ENCODING 560 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +20 +70 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni0231 +ENCODING 561 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +20 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni0232 +ENCODING 562 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +70 +00 +CC +CC +78 +78 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni0233 +ENCODING 563 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +00 +D8 +D8 +D8 +D8 +D8 +78 +18 +70 +ENDCHAR +STARTCHAR uni0234 +ENCODING 564 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +D8 +E8 +70 +30 +30 +ENDCHAR +STARTCHAR uni0235 +ENCODING 565 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +C0 +E0 +A0 +A0 +A0 +AC +B4 +B8 +18 +18 +ENDCHAR +STARTCHAR uni0236 +ENCODING 566 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +C0 +C0 +F0 +C0 +C0 +D8 +E8 +70 +30 +30 +ENDCHAR +STARTCHAR dotlessj +ENCODING 567 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +30 +30 +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR uni0238 +ENCODING 568 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +30 +30 +78 +B4 +B4 +B4 +B4 +78 +ENDCHAR +STARTCHAR uni0239 +ENCODING 569 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +78 +B4 +B4 +B4 +B4 +78 +30 +30 +ENDCHAR +STARTCHAR uni023A +ENCODING 570 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +10 +70 +D8 +F8 +F8 +F8 +F8 +D8 +D8 +40 +ENDCHAR +STARTCHAR uni023B +ENCODING 571 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +10 +78 +D0 +E0 +E0 +E0 +E0 +C0 +78 +40 +ENDCHAR +STARTCHAR uni023C +ENCODING 572 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +10 +78 +D0 +E0 +E0 +C0 +78 +40 +ENDCHAR +STARTCHAR uni023D +ENCODING 573 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +60 +60 +F0 +60 +60 +60 +78 +ENDCHAR +STARTCHAR uni023E +ENCODING 574 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +FC +30 +34 +38 +30 +30 +70 +B0 +ENDCHAR +STARTCHAR uni023F +ENCODING 575 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +78 +C0 +C0 +70 +18 +18 +F0 +60 +30 +18 +ENDCHAR +STARTCHAR uni0240 +ENCODING 576 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F8 +18 +30 +60 +C0 +C0 +60 +30 +ENDCHAR +STARTCHAR uni0241 +ENCODING 577 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +18 +18 +30 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni0242 +ENCODING 578 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +18 +18 +30 +60 +60 +ENDCHAR +STARTCHAR uni0243 +ENCODING 579 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +78 +6C +6C +78 +6C +EC +6C +78 +ENDCHAR +STARTCHAR uni0244 +ENCODING 580 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +6C +6C +6C +FC +6C +6C +6C +38 +ENDCHAR +STARTCHAR uni0245 +ENCODING 581 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +70 +70 +70 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni0246 +ENCODING 582 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +10 +F8 +D0 +E0 +F8 +E0 +E0 +C0 +F8 +40 +ENDCHAR +STARTCHAR uni0247 +ENCODING 583 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +10 +70 +D8 +F8 +E0 +C0 +78 +40 +ENDCHAR +STARTCHAR uni0248 +ENCODING 584 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +30 +30 +78 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR uni0249 +ENCODING 585 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +30 +30 +00 +30 +30 +30 +78 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR uni024A +ENCODING 586 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +78 +D8 +D8 +D8 +78 +18 +18 +18 +18 +0C +ENDCHAR +STARTCHAR uni024B +ENCODING 587 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +78 +D8 +D8 +D8 +78 +18 +18 +0C +ENDCHAR +STARTCHAR uni024C +ENCODING 588 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +78 +6C +6C +6C +F8 +6C +6C +6C +ENDCHAR +STARTCHAR uni024D +ENCODING 589 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +38 +60 +60 +F0 +60 +60 +ENDCHAR +STARTCHAR uni024E +ENCODING 590 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +CC +CC +78 +78 +30 +FC +30 +30 +ENDCHAR +STARTCHAR uni024F +ENCODING 591 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +6C +6C +6C +FC +6C +3C +0C +78 +ENDCHAR +STARTCHAR uni0250 +ENCODING 592 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +D8 +D8 +F0 +C0 +70 +ENDCHAR +STARTCHAR uni0251 +ENCODING 593 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +68 +D8 +D8 +D8 +D8 +68 +ENDCHAR +STARTCHAR uni0252 +ENCODING 594 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +B0 +D8 +D8 +D8 +D8 +B0 +ENDCHAR +STARTCHAR uni0253 +ENCODING 595 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +60 +C0 +C0 +C0 +F0 +D8 +D8 +D8 +D8 +F0 +ENDCHAR +STARTCHAR uni0254 +ENCODING 596 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +18 +18 +18 +18 +F0 +ENDCHAR +STARTCHAR uni0255 +ENCODING 597 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +78 +C0 +C0 +D8 +E8 +70 +20 +ENDCHAR +STARTCHAR uni0256 +ENCODING 598 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +18 +18 +78 +D8 +D8 +D8 +D8 +78 +0C +ENDCHAR +STARTCHAR uni0257 +ENCODING 599 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +0C +18 +18 +78 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni0258 +ENCODING 600 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +D8 +F8 +18 +18 +F0 +ENDCHAR +STARTCHAR schwa +ENCODING 601 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +18 +18 +F8 +D8 +70 +ENDCHAR +STARTCHAR uni025A +ENCODING 602 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +70 +1C +78 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni025B +ENCODING 603 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +C0 +70 +C0 +C0 +78 +ENDCHAR +STARTCHAR uni025C +ENCODING 604 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +18 +70 +18 +18 +F0 +ENDCHAR +STARTCHAR uni025D +ENCODING 605 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +18 +F0 +18 +70 +18 +18 +F0 +ENDCHAR +STARTCHAR uni025E +ENCODING 606 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +D8 +F0 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni025F +ENCODING 607 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +30 +30 +30 +78 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR uni0260 +ENCODING 608 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +0C +78 +D8 +D8 +D8 +D8 +78 +18 +70 +ENDCHAR +STARTCHAR uni0261 +ENCODING 609 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +78 +D8 +D8 +D8 +D8 +78 +18 +70 +ENDCHAR +STARTCHAR uni0262 +ENCODING 610 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +C0 +C0 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni0263 +ENCODING 611 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +D8 +70 +20 +70 +D8 +70 +ENDCHAR +STARTCHAR uni0264 +ENCODING 612 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +A0 +40 +E0 +A0 +40 +ENDCHAR +STARTCHAR uni0265 +ENCODING 613 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +D8 +D8 +D8 +78 +18 +18 +ENDCHAR +STARTCHAR uni0266 +ENCODING 614 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +60 +C0 +C0 +C0 +F0 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni0267 +ENCODING 615 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +60 +C0 +C0 +C0 +F0 +D8 +D8 +D8 +D8 +D8 +18 +30 +ENDCHAR +STARTCHAR uni0268 +ENCODING 616 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +60 +60 +00 +60 +60 +F0 +60 +60 +60 +ENDCHAR +STARTCHAR uni0269 +ENCODING 617 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +70 +ENDCHAR +STARTCHAR uni026A +ENCODING 618 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 6 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni026B +ENCODING 619 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +30 +30 +30 +74 +B8 +30 +30 +18 +ENDCHAR +STARTCHAR uni026C +ENCODING 620 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +30 +70 +B0 +78 +30 +30 +18 +ENDCHAR +STARTCHAR uni026D +ENCODING 621 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +60 +ENDCHAR +STARTCHAR uni026E +ENCODING 622 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +C0 +C0 +FC +CC +CC +D8 +CC +6C +18 +70 +ENDCHAR +STARTCHAR uni026F +ENCODING 623 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +D8 +D8 +F8 +F8 +F8 +78 +ENDCHAR +STARTCHAR uni0270 +ENCODING 624 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +F8 +F8 +F8 +78 +18 +18 +ENDCHAR +STARTCHAR uni0271 +ENCODING 625 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +F0 +F8 +F8 +F8 +D8 +D8 +30 +ENDCHAR +STARTCHAR uni0272 +ENCODING 626 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +78 +6C +6C +6C +6C +6C +C0 +ENDCHAR +STARTCHAR uni0273 +ENCODING 627 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +F0 +D8 +D8 +D8 +D8 +D8 +0C +ENDCHAR +STARTCHAR uni0274 +ENCODING 628 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +98 +D8 +F8 +F8 +D8 +C8 +ENDCHAR +STARTCHAR uni0275 +ENCODING 629 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +D8 +F8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni0276 +ENCODING 630 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +7C +D8 +DC +D8 +D8 +7C +ENDCHAR +STARTCHAR uni0277 +ENCODING 631 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +D8 +A8 +A8 +F8 +70 +ENDCHAR +STARTCHAR uni0278 +ENCODING 632 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +78 +30 +78 +B4 +B4 +78 +30 +78 +ENDCHAR +STARTCHAR uni0279 +ENCODING 633 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +18 +18 +18 +18 +18 +F0 +ENDCHAR +STARTCHAR uni027A +ENCODING 634 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +18 +18 +18 +18 +18 +18 +F0 +ENDCHAR +STARTCHAR uni027B +ENCODING 635 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +18 +18 +18 +18 +18 +F0 +10 +08 +ENDCHAR +STARTCHAR uni027C +ENCODING 636 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +78 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni027D +ENCODING 637 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +78 +C0 +C0 +C0 +C0 +C0 +C0 +60 +ENDCHAR +STARTCHAR uni027E +ENCODING 638 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +1C +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni027F +ENCODING 639 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +E0 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni0280 +ENCODING 640 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +D8 +D8 +F0 +D8 +D8 +ENDCHAR +STARTCHAR uni0281 +ENCODING 641 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +D8 +D8 +F0 +D8 +D8 +F0 +ENDCHAR +STARTCHAR uni0282 +ENCODING 642 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +78 +C0 +70 +18 +18 +70 +C0 +ENDCHAR +STARTCHAR uni0283 +ENCODING 643 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +1C +30 +30 +30 +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR uni0284 +ENCODING 644 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +10 +20 +30 +30 +30 +F8 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR uni0285 +ENCODING 645 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +E0 +30 +30 +30 +30 +30 +30 +1C +ENDCHAR +STARTCHAR uni0286 +ENCODING 646 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +1C +30 +30 +30 +30 +30 +30 +7C +B0 +60 +ENDCHAR +STARTCHAR uni0287 +ENCODING 647 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +E0 +30 +30 +30 +30 +78 +30 +30 +ENDCHAR +STARTCHAR uni0288 +ENCODING 648 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 -2 +BITMAP +C0 +C0 +F0 +C0 +C0 +C0 +C0 +C0 +C0 +70 +ENDCHAR +STARTCHAR uni0289 +ENCODING 649 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +6C +6C +FC +6C +6C +3C +ENDCHAR +STARTCHAR uni028A +ENCODING 650 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +D8 +50 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni028B +ENCODING 651 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +D8 +D8 +D8 +70 +70 +20 +ENDCHAR +STARTCHAR uni028C +ENCODING 652 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +70 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni028D +ENCODING 653 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +50 +F8 +F8 +F8 +D8 +D8 +ENDCHAR +STARTCHAR uni028E +ENCODING 654 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +70 +C0 +F0 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni028F +ENCODING 655 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +CC +CC +78 +30 +30 +30 +ENDCHAR +STARTCHAR uni0290 +ENCODING 656 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +F8 +18 +30 +60 +C0 +F8 +08 +04 +ENDCHAR +STARTCHAR uni0291 +ENCODING 657 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +F8 +18 +30 +68 +D4 +F8 +10 +ENDCHAR +STARTCHAR ezh +ENCODING 658 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F8 +18 +30 +70 +18 +18 +18 +F0 +ENDCHAR +STARTCHAR uni0293 +ENCODING 659 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F8 +18 +30 +70 +18 +58 +B8 +70 +ENDCHAR +STARTCHAR uni0294 +ENCODING 660 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +18 +18 +30 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni0295 +ENCODING 661 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +C0 +C0 +60 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni0296 +ENCODING 662 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +60 +60 +60 +30 +18 +18 +F0 +ENDCHAR +STARTCHAR uni0297 +ENCODING 663 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +70 +C0 +C0 +C0 +C0 +C0 +C0 +70 +ENDCHAR +STARTCHAR uni0298 +ENCODING 664 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +D8 +A8 +A8 +D8 +70 +ENDCHAR +STARTCHAR uni0299 +ENCODING 665 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +D8 +F0 +D8 +D8 +F0 +ENDCHAR +STARTCHAR uni029A +ENCODING 666 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +D8 +78 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni029B +ENCODING 667 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +78 +C0 +C0 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni029C +ENCODING 668 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni029D +ENCODING 669 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +30 +30 +00 +70 +30 +30 +30 +30 +78 +B0 +60 +ENDCHAR +STARTCHAR uni029E +ENCODING 670 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +78 +38 +38 +78 +D8 +18 +18 +ENDCHAR +STARTCHAR uni029F +ENCODING 671 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +F8 +ENDCHAR +STARTCHAR uni02A0 +ENCODING 672 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +04 +08 +78 +D8 +D8 +D8 +D8 +78 +18 +18 +ENDCHAR +STARTCHAR uni02A1 +ENCODING 673 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +18 +18 +30 +60 +F0 +60 +60 +ENDCHAR +STARTCHAR uni02A2 +ENCODING 674 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +C0 +C0 +60 +30 +30 +78 +30 +ENDCHAR +STARTCHAR uni02A3 +ENCODING 675 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +20 +20 +7C +EC +AC +B8 +F8 +7C +ENDCHAR +STARTCHAR uni02A4 +ENCODING 676 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +20 +20 +7C +EC +B8 +AC +EC +6C +18 +ENDCHAR +STARTCHAR uni02A5 +ENCODING 677 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +20 +20 +7C +EC +B8 +AC +FC +7C +10 +ENDCHAR +STARTCHAR uni02A6 +ENCODING 678 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +60 +F0 +6C +78 +78 +6C +6C +38 +ENDCHAR +STARTCHAR uni02A7 +ENCODING 679 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +0C +D8 +F8 +D8 +D8 +D8 +D8 +D8 +78 +18 +30 +ENDCHAR +STARTCHAR uni02A8 +ENCODING 680 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +C0 +C0 +E8 +DC +D0 +D8 +F4 +7C +10 +ENDCHAR +STARTCHAR uni02A9 +ENCODING 681 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +70 +C0 +D8 +FC +D4 +D4 +D4 +D4 +04 +18 +ENDCHAR +STARTCHAR uni02AA +ENCODING 682 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +C0 +C0 +DC +F0 +F8 +CC +CC +78 +ENDCHAR +STARTCHAR uni02AB +ENCODING 683 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +C0 +C0 +FC +CC +D8 +D8 +F0 +7C +ENDCHAR +STARTCHAR uni02AC +ENCODING 684 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +D8 +F8 +F8 +50 +00 +D8 +F8 +F8 +50 +ENDCHAR +STARTCHAR uni02AD +ENCODING 685 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +D8 +D8 +D8 +00 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR commaturnedmod +ENCODING 699 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 2 2 8 +BITMAP +40 +80 +ENDCHAR +STARTCHAR afii57929 +ENCODING 700 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 2 2 8 +BITMAP +40 +80 +ENDCHAR +STARTCHAR afii64937 +ENCODING 701 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 2 2 8 +BITMAP +80 +40 +ENDCHAR +STARTCHAR circumflex +ENCODING 710 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 2 1 8 +BITMAP +40 +A0 +ENDCHAR +STARTCHAR caron +ENCODING 711 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 2 1 8 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR breve +ENCODING 728 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +88 +70 +ENDCHAR +STARTCHAR dotaccent +ENCODING 729 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 2 2 8 +BITMAP +80 +80 +ENDCHAR +STARTCHAR ring +ENCODING 730 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR ogonek +ENCODING 731 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 3 3 -2 +BITMAP +40 +80 +60 +ENDCHAR +STARTCHAR tilde +ENCODING 732 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +68 +F8 +B0 +ENDCHAR +STARTCHAR hungarumlaut +ENCODING 733 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 2 1 8 +BITMAP +50 +A0 +ENDCHAR +STARTCHAR gravecomb +ENCODING 768 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 2 1 8 +BITMAP +80 +40 +ENDCHAR +STARTCHAR acutecomb +ENCODING 769 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 2 2 8 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0302 +ENCODING 770 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 2 1 8 +BITMAP +40 +A0 +ENDCHAR +STARTCHAR tildecomb +ENCODING 771 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +68 +F8 +B0 +ENDCHAR +STARTCHAR uni0306 +ENCODING 774 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +88 +70 +ENDCHAR +STARTCHAR uni0307 +ENCODING 775 +SWIDTH 0 0 +DWIDTH 6 0 +BBX 1 1 2 9 +BITMAP +80 +ENDCHAR +STARTCHAR uni0308 +ENCODING 776 +SWIDTH 0 0 +DWIDTH 6 0 +BBX 3 1 1 9 +BITMAP +A0 +ENDCHAR +STARTCHAR uni030C +ENCODING 780 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 2 1 8 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR uni0329 +ENCODING 809 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 2 2 -2 +BITMAP +80 +80 +ENDCHAR +STARTCHAR uni0370 +ENCODING 880 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni0371 +ENCODING 881 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +C0 +C0 +F8 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni0372 +ENCODING 882 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +FC +B4 +B4 +B4 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni0373 +ENCODING 883 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +FC +B4 +B4 +30 +30 +30 +ENDCHAR +STARTCHAR uni0374 +ENCODING 884 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 3 2 7 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR uni0375 +ENCODING 885 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 3 1 -2 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR uni0376 +ENCODING 886 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +D8 +F8 +F8 +F8 +F8 +D8 +98 +ENDCHAR +STARTCHAR uni0377 +ENCODING 887 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +C8 +D8 +F8 +F8 +D8 +98 +ENDCHAR +STARTCHAR uni037A +ENCODING 890 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 3 2 -2 +BITMAP +80 +80 +40 +ENDCHAR +STARTCHAR uni037B +ENCODING 891 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +18 +18 +18 +18 +F0 +ENDCHAR +STARTCHAR uni037C +ENCODING 892 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +C0 +D8 +D8 +C0 +78 +ENDCHAR +STARTCHAR uni037D +ENCODING 893 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +18 +D8 +D8 +18 +F0 +ENDCHAR +STARTCHAR uni037E +ENCODING 894 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 8 1 -2 +BITMAP +60 +60 +00 +00 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR tonos +ENCODING 900 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 2 0 8 +BITMAP +40 +80 +ENDCHAR +STARTCHAR dieresistonos +ENCODING 901 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +90 +20 +48 +ENDCHAR +STARTCHAR Alphatonos +ENCODING 902 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +70 +D8 +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR anoteleia +ENCODING 903 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 2 2 4 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR Epsilontonos +ENCODING 904 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +F8 +C0 +C0 +F0 +C0 +C0 +C0 +F8 +ENDCHAR +STARTCHAR Etatonos +ENCODING 905 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +D8 +D8 +D8 +F8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR Iotatonos +ENCODING 906 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 0 0 +BITMAP +40 +80 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR Omicrontonos +ENCODING 908 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +70 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR Upsilontonos +ENCODING 910 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +80 +CC +CC +78 +78 +30 +30 +30 +30 +ENDCHAR +STARTCHAR Omegatonos +ENCODING 911 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +70 +D8 +D8 +D8 +D8 +D8 +50 +D8 +ENDCHAR +STARTCHAR iotadieresistonos +ENCODING 912 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +20 +48 +00 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR Alpha +ENCODING 913 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +D8 +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR Beta +ENCODING 914 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +D8 +D8 +F0 +D8 +D8 +D8 +F0 +ENDCHAR +STARTCHAR Gamma +ENCODING 915 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Delta +ENCODING 916 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +70 +70 +70 +D8 +D8 +F8 +ENDCHAR +STARTCHAR Epsilon +ENCODING 917 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +C0 +C0 +F0 +C0 +C0 +C0 +F8 +ENDCHAR +STARTCHAR Zeta +ENCODING 918 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +18 +18 +30 +60 +C0 +C0 +F8 +ENDCHAR +STARTCHAR Eta +ENCODING 919 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +D8 +F8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR Theta +ENCODING 920 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +D8 +D8 +F8 +F8 +D8 +D8 +70 +ENDCHAR +STARTCHAR Iota +ENCODING 921 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 8 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Kappa +ENCODING 922 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +F0 +E0 +E0 +F0 +D8 +D8 +ENDCHAR +STARTCHAR Lambda +ENCODING 923 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +70 +70 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR Mu +ENCODING 924 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +D8 +F8 +F8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR Nu +ENCODING 925 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +98 +D8 +F8 +F8 +F8 +F8 +D8 +C8 +ENDCHAR +STARTCHAR Xi +ENCODING 926 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +FC +00 +00 +78 +00 +00 +00 +FC +ENDCHAR +STARTCHAR Omicron +ENCODING 927 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR Pi +ENCODING 928 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR Rho +ENCODING 929 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +D8 +D8 +D8 +F0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Sigma +ENCODING 931 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +C0 +60 +30 +30 +60 +C0 +F8 +ENDCHAR +STARTCHAR Tau +ENCODING 932 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +FC +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR Upsilon +ENCODING 933 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +70 +70 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Phi +ENCODING 934 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +30 +78 +B4 +B4 +B4 +B4 +78 +30 +ENDCHAR +STARTCHAR Chi +ENCODING 935 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +70 +20 +20 +70 +D8 +D8 +ENDCHAR +STARTCHAR Psi +ENCODING 936 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A8 +A8 +A8 +A8 +F8 +70 +20 +20 +ENDCHAR +STARTCHAR Omega +ENCODING 937 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +D8 +D8 +D8 +D8 +D8 +50 +D8 +ENDCHAR +STARTCHAR Iotadieresis +ENCODING 938 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +A0 +00 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR Upsilondieresis +ENCODING 939 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +50 +00 +CC +CC +78 +78 +30 +30 +30 +30 +ENDCHAR +STARTCHAR alphatonos +ENCODING 940 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +68 +D8 +D8 +D8 +D8 +68 +ENDCHAR +STARTCHAR epsilontonos +ENCODING 941 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +78 +C0 +70 +C0 +C0 +78 +ENDCHAR +STARTCHAR etatonos +ENCODING 942 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +20 +00 +F0 +D8 +D8 +D8 +D8 +D8 +18 +18 +ENDCHAR +STARTCHAR iotatonos +ENCODING 943 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +20 +40 +00 +C0 +C0 +C0 +C0 +C0 +70 +ENDCHAR +STARTCHAR upsilondieresistonos +ENCODING 944 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +20 +48 +00 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR alpha +ENCODING 945 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +68 +D8 +D8 +D8 +D8 +68 +ENDCHAR +STARTCHAR beta +ENCODING 946 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +D8 +D8 +F0 +D8 +D8 +D8 +F0 +C0 +C0 +ENDCHAR +STARTCHAR gamma +ENCODING 947 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +D8 +70 +70 +20 +20 +20 +ENDCHAR +STARTCHAR delta +ENCODING 948 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +D8 +C0 +60 +F0 +D8 +D8 +70 +ENDCHAR +STARTCHAR epsilon +ENCODING 949 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +C0 +70 +C0 +C0 +78 +ENDCHAR +STARTCHAR zeta +ENCODING 950 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F8 +18 +30 +60 +C0 +C0 +C0 +78 +08 +10 +ENDCHAR +STARTCHAR eta +ENCODING 951 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F0 +D8 +D8 +D8 +D8 +D8 +18 +18 +ENDCHAR +STARTCHAR theta +ENCODING 952 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +D8 +D8 +F8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR iota +ENCODING 953 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +70 +ENDCHAR +STARTCHAR kappa +ENCODING 954 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +D8 +D8 +F0 +F0 +D8 +D8 +ENDCHAR +STARTCHAR lambda +ENCODING 955 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +C0 +60 +60 +70 +70 +D8 +D8 +ENDCHAR +STARTCHAR mugreek +ENCODING 956 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +D8 +D8 +D8 +E8 +C0 +C0 +ENDCHAR +STARTCHAR nu +ENCODING 957 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +D8 +D8 +70 +70 +20 +20 +ENDCHAR +STARTCHAR xi +ENCODING 958 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +78 +C0 +C0 +70 +C0 +C0 +C0 +78 +08 +10 +ENDCHAR +STARTCHAR omicron +ENCODING 959 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR pi +ENCODING 960 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR rho +ENCODING 961 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +70 +D8 +D8 +D8 +D8 +F0 +C0 +C0 +ENDCHAR +STARTCHAR sigma1 +ENCODING 962 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +78 +C0 +C0 +C0 +C0 +78 +08 +10 +ENDCHAR +STARTCHAR sigma +ENCODING 963 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +7C +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR tau +ENCODING 964 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +FC +30 +30 +30 +30 +18 +ENDCHAR +STARTCHAR upsilon +ENCODING 965 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR phi +ENCODING 966 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +98 +B4 +B4 +B4 +F8 +70 +30 +30 +ENDCHAR +STARTCHAR chi +ENCODING 967 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +D8 +D8 +70 +70 +D8 +D8 +ENDCHAR +STARTCHAR psi +ENCODING 968 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +20 +A8 +A8 +A8 +F8 +70 +20 +20 +ENDCHAR +STARTCHAR omega +ENCODING 969 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +A8 +A8 +F8 +F8 +50 +ENDCHAR +STARTCHAR iotadieresis +ENCODING 970 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A0 +00 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR upsilondieresis +ENCODING 971 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR omicrontonos +ENCODING 972 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR upsilontonos +ENCODING 973 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR omegatonos +ENCODING 974 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +88 +A8 +A8 +F8 +F8 +50 +ENDCHAR +STARTCHAR uni03CF +ENCODING 975 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +D8 +D8 +F0 +E0 +E0 +F0 +D8 +D8 +08 +10 +ENDCHAR +STARTCHAR uni03D0 +ENCODING 976 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +D8 +D8 +F0 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR theta1 +ENCODING 977 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +D8 +D8 +78 +38 +D8 +D8 +70 +ENDCHAR +STARTCHAR Upsilon1 +ENCODING 978 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +CC +CC +78 +78 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni03D3 +ENCODING 979 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +80 +00 +CC +CC +78 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni03D4 +ENCODING 980 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +50 +00 +CC +CC +78 +78 +30 +30 +30 +30 +ENDCHAR +STARTCHAR phi1 +ENCODING 981 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +30 +30 +78 +B4 +B4 +78 +30 +30 +ENDCHAR +STARTCHAR omega1 +ENCODING 982 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +88 +A8 +A8 +F8 +50 +ENDCHAR +STARTCHAR uni03D7 +ENCODING 983 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +F0 +E0 +F0 +D8 +D8 +08 +10 +ENDCHAR +STARTCHAR uni03D8 +ENCODING 984 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +D8 +D8 +D8 +D8 +D8 +D8 +70 +20 +20 +ENDCHAR +STARTCHAR uni03D9 +ENCODING 985 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +70 +D8 +D8 +D8 +D8 +70 +20 +20 +ENDCHAR +STARTCHAR uni03DA +ENCODING 986 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +78 +C0 +C0 +C0 +C0 +C0 +C0 +70 +08 +30 +ENDCHAR +STARTCHAR uni03DB +ENCODING 987 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +78 +C0 +C0 +C0 +C0 +70 +08 +30 +ENDCHAR +STARTCHAR uni03DC +ENCODING 988 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +C0 +C0 +F0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni03DD +ENCODING 989 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +1C +30 +30 +3C +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR uni03DE +ENCODING 990 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +68 +78 +F8 +F0 +B0 +18 +ENDCHAR +STARTCHAR uni03DF +ENCODING 991 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +60 +C0 +F8 +18 +30 +30 +ENDCHAR +STARTCHAR uni03E0 +ENCODING 992 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +F8 +6C +6C +0C +3C +6C +6C +6C +0C +18 +ENDCHAR +STARTCHAR uni03E1 +ENCODING 993 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +E0 +30 +18 +38 +6C +DC +3C +0C +0C +ENDCHAR +STARTCHAR uni03E2 +ENCODING 994 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +88 +88 +A8 +A8 +F8 +F8 +58 +08 +30 +ENDCHAR +STARTCHAR uni03E3 +ENCODING 995 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +88 +A8 +A8 +F8 +F8 +58 +08 +30 +ENDCHAR +STARTCHAR uni03E4 +ENCODING 996 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +D8 +D8 +D8 +D8 +D8 +D8 +D8 +78 +18 +18 +ENDCHAR +STARTCHAR uni03E5 +ENCODING 997 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +D8 +D8 +D8 +78 +18 +18 +ENDCHAR +STARTCHAR uni03E6 +ENCODING 998 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +C0 +C0 +F0 +D8 +D8 +D8 +D8 +D8 +18 +30 +ENDCHAR +STARTCHAR uni03E7 +ENCODING 999 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +70 +D8 +7C +18 +18 +F0 +ENDCHAR +STARTCHAR uni03E8 +ENCODING 1000 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F0 +18 +18 +18 +30 +60 +C0 +C0 +60 +38 +ENDCHAR +STARTCHAR uni03E9 +ENCODING 1001 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F0 +18 +18 +30 +60 +C0 +60 +38 +ENDCHAR +STARTCHAR uni03EA +ENCODING 1002 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +70 +20 +20 +70 +D8 +F8 +ENDCHAR +STARTCHAR uni03EB +ENCODING 1003 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +D8 +70 +20 +70 +D8 +F8 +ENDCHAR +STARTCHAR uni03EC +ENCODING 1004 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +C0 +C0 +F0 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni03ED +ENCODING 1005 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +70 +C0 +C0 +E0 +F0 +D0 +F0 +60 +ENDCHAR +STARTCHAR uni03EE +ENCODING 1006 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +20 +F8 +F8 +A8 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni03EF +ENCODING 1007 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +20 +F8 +F8 +A8 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni03F0 +ENCODING 1008 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +D8 +F0 +E0 +F0 +D8 +D8 +ENDCHAR +STARTCHAR uni03F1 +ENCODING 1009 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +70 +D8 +D8 +D8 +D8 +F0 +C0 +78 +ENDCHAR +STARTCHAR uni03F2 +ENCODING 1010 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +C0 +C0 +C0 +C0 +78 +ENDCHAR +STARTCHAR uni03F3 +ENCODING 1011 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 11 0 -2 +BITMAP +30 +30 +00 +30 +30 +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR uni03F4 +ENCODING 1012 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +D8 +D8 +F8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni03F5 +ENCODING 1013 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +C0 +F8 +C0 +C0 +78 +ENDCHAR +STARTCHAR uni03F6 +ENCODING 1014 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +18 +F8 +18 +18 +F0 +ENDCHAR +STARTCHAR uni03F7 +ENCODING 1015 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +C0 +F0 +D8 +D8 +F0 +C0 +C0 +ENDCHAR +STARTCHAR uni03F8 +ENCODING 1016 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +C0 +F0 +D8 +D8 +F0 +C0 +C0 +ENDCHAR +STARTCHAR uni03F9 +ENCODING 1017 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +C0 +C0 +C0 +C0 +C0 +C0 +78 +ENDCHAR +STARTCHAR uni03FA +ENCODING 1018 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +D8 +F8 +F8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni03FB +ENCODING 1019 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +88 +D8 +F8 +F8 +D8 +D8 +C0 +ENDCHAR +STARTCHAR uni03FC +ENCODING 1020 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +38 +6C +6C +6C +78 +60 +F0 +60 +ENDCHAR +STARTCHAR uni03FD +ENCODING 1021 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +18 +18 +18 +18 +18 +18 +F0 +ENDCHAR +STARTCHAR uni03FE +ENCODING 1022 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +C0 +C0 +D8 +D8 +C0 +C0 +78 +ENDCHAR +STARTCHAR uni03FF +ENCODING 1023 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +18 +18 +D8 +D8 +18 +18 +F0 +ENDCHAR +STARTCHAR uni0400 +ENCODING 1024 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +F8 +C0 +C0 +F0 +C0 +C0 +C0 +F8 +ENDCHAR +STARTCHAR afii10023 +ENCODING 1025 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +F8 +C0 +C0 +F0 +C0 +C0 +C0 +F8 +ENDCHAR +STARTCHAR afii10051 +ENCODING 1026 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +E0 +C0 +C0 +F0 +D8 +D8 +D8 +D8 +18 +30 +ENDCHAR +STARTCHAR afii10052 +ENCODING 1027 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +F8 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR afii10053 +ENCODING 1028 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +C0 +C0 +F0 +C0 +C0 +C0 +78 +ENDCHAR +STARTCHAR afii10054 +ENCODING 1029 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +C0 +C0 +70 +18 +18 +18 +F0 +ENDCHAR +STARTCHAR afii10055 +ENCODING 1030 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 8 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR afii10056 +ENCODING 1031 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +A0 +00 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR afii10057 +ENCODING 1032 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 0 0 +BITMAP +30 +30 +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR afii10058 +ENCODING 1033 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +E0 +B0 +B8 +A8 +A8 +B8 +B0 +ENDCHAR +STARTCHAR afii10059 +ENCODING 1034 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A0 +A0 +A0 +F0 +F8 +A8 +B8 +B0 +ENDCHAR +STARTCHAR afii10060 +ENCODING 1035 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +F0 +60 +60 +78 +6C +6C +6C +6C +ENDCHAR +STARTCHAR afii10061 +ENCODING 1036 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +D8 +D8 +F0 +E0 +E0 +F0 +D8 +D8 +ENDCHAR +STARTCHAR uni040D +ENCODING 1037 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +C8 +D8 +F8 +F8 +F8 +F8 +D8 +98 +ENDCHAR +STARTCHAR afii10062 +ENCODING 1038 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +D8 +D8 +D8 +78 +18 +18 +70 +ENDCHAR +STARTCHAR afii10145 +ENCODING 1039 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +D8 +D8 +D8 +D8 +D8 +D8 +D8 +F8 +20 +20 +ENDCHAR +STARTCHAR afii10017 +ENCODING 1040 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +D8 +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR afii10018 +ENCODING 1041 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +C0 +C0 +F0 +D8 +D8 +D8 +F0 +ENDCHAR +STARTCHAR afii10019 +ENCODING 1042 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +D8 +D8 +F0 +D8 +D8 +D8 +F0 +ENDCHAR +STARTCHAR afii10020 +ENCODING 1043 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR afii10021 +ENCODING 1044 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +38 +68 +68 +68 +68 +68 +68 +FC +CC +ENDCHAR +STARTCHAR afii10022 +ENCODING 1045 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +C0 +C0 +F0 +C0 +C0 +C0 +F8 +ENDCHAR +STARTCHAR afii10024 +ENCODING 1046 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A8 +A8 +F8 +70 +70 +F8 +A8 +A8 +ENDCHAR +STARTCHAR afii10025 +ENCODING 1047 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +18 +18 +70 +18 +18 +18 +F0 +ENDCHAR +STARTCHAR afii10026 +ENCODING 1048 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +D8 +F8 +F8 +F8 +F8 +D8 +98 +ENDCHAR +STARTCHAR afii10027 +ENCODING 1049 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +C8 +D8 +F8 +F8 +F8 +D8 +98 +ENDCHAR +STARTCHAR afii10028 +ENCODING 1050 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +F0 +E0 +E0 +F0 +D8 +D8 +ENDCHAR +STARTCHAR afii10029 +ENCODING 1051 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +38 +68 +68 +68 +68 +68 +68 +C8 +ENDCHAR +STARTCHAR afii10030 +ENCODING 1052 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +D8 +F8 +F8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR afii10031 +ENCODING 1053 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +D8 +F8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR afii10032 +ENCODING 1054 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR afii10033 +ENCODING 1055 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR afii10034 +ENCODING 1056 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +D8 +D8 +D8 +F0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR afii10035 +ENCODING 1057 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +C0 +C0 +C0 +C0 +C0 +C0 +78 +ENDCHAR +STARTCHAR afii10036 +ENCODING 1058 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +FC +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR afii10037 +ENCODING 1059 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +D8 +D8 +78 +18 +18 +70 +ENDCHAR +STARTCHAR afii10038 +ENCODING 1060 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -1 +BITMAP +30 +78 +FC +B4 +B4 +B4 +B4 +FC +78 +30 +ENDCHAR +STARTCHAR afii10039 +ENCODING 1061 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +70 +20 +20 +70 +D8 +D8 +ENDCHAR +STARTCHAR afii10040 +ENCODING 1062 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +D8 +D8 +D8 +D8 +D8 +D8 +D8 +7C +04 +04 +ENDCHAR +STARTCHAR afii10041 +ENCODING 1063 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +D8 +D8 +78 +18 +18 +18 +ENDCHAR +STARTCHAR afii10042 +ENCODING 1064 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +F8 +78 +ENDCHAR +STARTCHAR afii10043 +ENCODING 1065 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +F8 +7C +04 +04 +ENDCHAR +STARTCHAR afii10044 +ENCODING 1066 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +E0 +60 +70 +78 +68 +68 +78 +70 +ENDCHAR +STARTCHAR afii10045 +ENCODING 1067 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +98 +98 +D8 +F8 +B8 +B8 +F8 +D8 +ENDCHAR +STARTCHAR afii10046 +ENCODING 1068 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +C0 +C0 +E0 +F0 +D0 +D0 +F0 +E0 +ENDCHAR +STARTCHAR afii10047 +ENCODING 1069 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +18 +18 +78 +18 +18 +18 +F0 +ENDCHAR +STARTCHAR afii10048 +ENCODING 1070 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +98 +B4 +B4 +B4 +F4 +B4 +B4 +98 +ENDCHAR +STARTCHAR afii10049 +ENCODING 1071 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +D8 +D8 +D8 +78 +F8 +D8 +D8 +ENDCHAR +STARTCHAR afii10065 +ENCODING 1072 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +18 +78 +D8 +D8 +78 +ENDCHAR +STARTCHAR afii10066 +ENCODING 1073 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +C0 +F0 +D8 +D8 +D8 +D8 +F0 +ENDCHAR +STARTCHAR afii10067 +ENCODING 1074 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +D8 +F0 +D8 +D8 +F0 +ENDCHAR +STARTCHAR afii10068 +ENCODING 1075 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR afii10069 +ENCODING 1076 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +78 +D8 +D8 +D8 +D8 +78 +18 +70 +ENDCHAR +STARTCHAR afii10070 +ENCODING 1077 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +D8 +F8 +C0 +C0 +78 +ENDCHAR +STARTCHAR afii10072 +ENCODING 1078 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +A8 +A8 +70 +F8 +A8 +A8 +ENDCHAR +STARTCHAR afii10073 +ENCODING 1079 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +18 +70 +18 +18 +F0 +ENDCHAR +STARTCHAR afii10074 +ENCODING 1080 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +C8 +D8 +F8 +F8 +D8 +98 +ENDCHAR +STARTCHAR afii10075 +ENCODING 1081 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +70 +00 +C8 +D8 +F8 +F8 +D8 +98 +ENDCHAR +STARTCHAR afii10076 +ENCODING 1082 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +D8 +F0 +E0 +E0 +F0 +D8 +ENDCHAR +STARTCHAR afii10077 +ENCODING 1083 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +38 +78 +58 +58 +58 +D8 +ENDCHAR +STARTCHAR afii10078 +ENCODING 1084 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR afii10079 +ENCODING 1085 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR afii10080 +ENCODING 1086 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR afii10081 +ENCODING 1087 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR afii10082 +ENCODING 1088 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F0 +D8 +D8 +D8 +D8 +F0 +C0 +C0 +ENDCHAR +STARTCHAR afii10083 +ENCODING 1089 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +C0 +C0 +C0 +C0 +78 +ENDCHAR +STARTCHAR afii10084 +ENCODING 1090 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR afii10085 +ENCODING 1091 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +D8 +D8 +D8 +78 +18 +70 +ENDCHAR +STARTCHAR afii10086 +ENCODING 1092 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +70 +F8 +A8 +A8 +F8 +70 +20 +ENDCHAR +STARTCHAR afii10087 +ENCODING 1093 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +D8 +F8 +70 +70 +F8 +D8 +ENDCHAR +STARTCHAR afii10088 +ENCODING 1094 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +D8 +D8 +D8 +D8 +D8 +7C +0C +0C +ENDCHAR +STARTCHAR afii10089 +ENCODING 1095 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +D8 +D8 +D8 +78 +18 +18 +ENDCHAR +STARTCHAR afii10090 +ENCODING 1096 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +A8 +A8 +A8 +A8 +F8 +F8 +ENDCHAR +STARTCHAR afii10091 +ENCODING 1097 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +A8 +A8 +A8 +A8 +F8 +FC +04 +04 +ENDCHAR +STARTCHAR afii10092 +ENCODING 1098 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +E0 +60 +70 +68 +78 +70 +ENDCHAR +STARTCHAR afii10093 +ENCODING 1099 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +98 +98 +D8 +B8 +F8 +D8 +ENDCHAR +STARTCHAR afii10094 +ENCODING 1100 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +C0 +C0 +E0 +D0 +F0 +E0 +ENDCHAR +STARTCHAR afii10095 +ENCODING 1101 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +18 +38 +18 +18 +F0 +ENDCHAR +STARTCHAR afii10096 +ENCODING 1102 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +90 +B8 +A8 +E8 +B8 +90 +ENDCHAR +STARTCHAR afii10097 +ENCODING 1103 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +D8 +D8 +78 +78 +D8 +ENDCHAR +STARTCHAR uni0450 +ENCODING 1104 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +00 +70 +D8 +F8 +C0 +C0 +78 +ENDCHAR +STARTCHAR afii10071 +ENCODING 1105 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +70 +D8 +F8 +C0 +C0 +78 +ENDCHAR +STARTCHAR afii10099 +ENCODING 1106 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +C0 +F0 +C0 +F0 +D8 +D8 +D8 +D8 +18 +30 +ENDCHAR +STARTCHAR afii10100 +ENCODING 1107 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +F8 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR afii10101 +ENCODING 1108 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +C0 +F0 +C0 +C0 +78 +ENDCHAR +STARTCHAR afii10102 +ENCODING 1109 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +C0 +70 +18 +18 +F0 +ENDCHAR +STARTCHAR afii10103 +ENCODING 1110 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 9 2 0 +BITMAP +C0 +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR afii10104 +ENCODING 1111 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +A0 +00 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR afii10105 +ENCODING 1112 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 11 0 -2 +BITMAP +30 +30 +00 +30 +30 +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR afii10106 +ENCODING 1113 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +60 +E0 +B0 +B8 +A8 +B0 +ENDCHAR +STARTCHAR afii10107 +ENCODING 1114 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +A0 +A0 +F0 +F8 +A8 +B0 +ENDCHAR +STARTCHAR afii10108 +ENCODING 1115 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +F0 +C0 +F0 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR afii10109 +ENCODING 1116 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +10 +D8 +F0 +E0 +E0 +F0 +D8 +ENDCHAR +STARTCHAR uni045D +ENCODING 1117 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +00 +C8 +D8 +F8 +F8 +D8 +98 +ENDCHAR +STARTCHAR afii10110 +ENCODING 1118 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +50 +20 +D8 +D8 +D8 +D8 +D8 +78 +18 +70 +ENDCHAR +STARTCHAR afii10193 +ENCODING 1119 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +D8 +D8 +D8 +F8 +20 +20 +ENDCHAR +STARTCHAR uni0460 +ENCODING 1120 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +D8 +88 +A8 +A8 +F8 +F8 +50 +ENDCHAR +STARTCHAR uni0461 +ENCODING 1121 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +50 +D8 +A8 +F8 +F8 +50 +ENDCHAR +STARTCHAR afii10146 +ENCODING 1122 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +E0 +C0 +F0 +D8 +D8 +D8 +F0 +ENDCHAR +STARTCHAR afii10194 +ENCODING 1123 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +C0 +E0 +C0 +F0 +D8 +D8 +F0 +ENDCHAR +STARTCHAR uni0464 +ENCODING 1124 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +98 +B0 +B0 +F8 +B0 +B0 +B0 +98 +ENDCHAR +STARTCHAR uni0465 +ENCODING 1125 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +98 +B0 +F8 +B0 +B0 +98 +ENDCHAR +STARTCHAR uni0466 +ENCODING 1126 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +70 +70 +D8 +F8 +A8 +A8 +ENDCHAR +STARTCHAR uni0467 +ENCODING 1127 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +D8 +F8 +A8 +A8 +ENDCHAR +STARTCHAR uni0468 +ENCODING 1128 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +90 +90 +B8 +B8 +EC +FC +D4 +D4 +ENDCHAR +STARTCHAR uni0469 +ENCODING 1129 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +90 +B8 +EC +FC +D4 +D4 +ENDCHAR +STARTCHAR uni046A +ENCODING 1130 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +D8 +70 +20 +70 +F8 +A8 +A8 +ENDCHAR +STARTCHAR uni046B +ENCODING 1131 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +D8 +70 +70 +F8 +A8 +ENDCHAR +STARTCHAR uni046C +ENCODING 1132 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +B8 +A8 +B8 +D0 +B8 +FC +D4 +D4 +ENDCHAR +STARTCHAR uni046D +ENCODING 1133 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +B8 +A8 +D0 +B8 +FC +D4 +ENDCHAR +STARTCHAR uni046E +ENCODING 1134 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +50 +20 +F0 +18 +18 +70 +18 +18 +18 +70 +C0 +70 +ENDCHAR +STARTCHAR uni046F +ENCODING 1135 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +50 +20 +F0 +18 +78 +18 +18 +70 +C0 +70 +ENDCHAR +STARTCHAR uni0470 +ENCODING 1136 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +B4 +B4 +B4 +B4 +B4 +78 +30 +30 +ENDCHAR +STARTCHAR uni0471 +ENCODING 1137 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +30 +B4 +B4 +B4 +B4 +78 +30 +30 +ENDCHAR +STARTCHAR afii10147 +ENCODING 1138 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +D8 +D8 +F8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR afii10195 +ENCODING 1139 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +D8 +F8 +D8 +D8 +70 +ENDCHAR +STARTCHAR afii10148 +ENCODING 1140 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +DC +D8 +D8 +70 +70 +70 +20 +20 +ENDCHAR +STARTCHAR afii10196 +ENCODING 1141 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +DC +D8 +70 +70 +20 +20 +ENDCHAR +STARTCHAR uni0476 +ENCODING 1142 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +A0 +50 +00 +DC +D8 +70 +70 +70 +20 +20 +ENDCHAR +STARTCHAR uni0477 +ENCODING 1143 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +A0 +50 +00 +DC +D8 +70 +70 +20 +20 +ENDCHAR +STARTCHAR uni0478 +ENCODING 1144 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +40 +E0 +A8 +A8 +A8 +A8 +F8 +58 +18 +70 +ENDCHAR +STARTCHAR uni0479 +ENCODING 1145 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +40 +E8 +A8 +A8 +F8 +58 +18 +70 +ENDCHAR +STARTCHAR uni047A +ENCODING 1146 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +70 +D8 +D8 +D8 +D8 +D8 +D8 +70 +20 +ENDCHAR +STARTCHAR uni047B +ENCODING 1147 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +70 +D8 +D8 +D8 +70 +20 +ENDCHAR +STARTCHAR uni047C +ENCODING 1148 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +20 +A8 +88 +A8 +A8 +F8 +F8 +50 +ENDCHAR +STARTCHAR uni047D +ENCODING 1149 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +20 +A8 +88 +A8 +F8 +F8 +50 +ENDCHAR +STARTCHAR uni047E +ENCODING 1150 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +20 +A8 +88 +88 +A8 +A8 +F8 +F8 +50 +ENDCHAR +STARTCHAR uni047F +ENCODING 1151 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +20 +A8 +88 +A8 +F8 +F8 +50 +ENDCHAR +STARTCHAR uni0480 +ENCODING 1152 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +78 +C0 +C0 +C0 +C0 +C0 +C0 +78 +18 +18 +ENDCHAR +STARTCHAR uni0481 +ENCODING 1153 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +78 +C0 +C0 +C0 +C0 +78 +18 +18 +ENDCHAR +STARTCHAR uni0482 +ENCODING 1154 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +18 +70 +38 +E0 +70 +C0 +ENDCHAR +STARTCHAR uni048A +ENCODING 1162 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +88 +70 +C8 +D8 +F8 +F8 +F8 +F8 +D8 +98 +30 +ENDCHAR +STARTCHAR uni048B +ENCODING 1163 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +88 +70 +00 +C8 +D8 +F8 +F8 +D8 +98 +30 +ENDCHAR +STARTCHAR uni048C +ENCODING 1164 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +F0 +60 +70 +78 +68 +78 +70 +ENDCHAR +STARTCHAR uni048D +ENCODING 1165 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +60 +F0 +60 +70 +68 +70 +ENDCHAR +STARTCHAR uni048E +ENCODING 1166 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +D8 +D8 +F8 +F0 +D8 +C0 +C0 +ENDCHAR +STARTCHAR uni048F +ENCODING 1167 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F0 +D8 +D8 +D8 +F8 +F0 +D8 +C0 +ENDCHAR +STARTCHAR afii10050 +ENCODING 1168 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +08 +08 +F8 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR afii10098 +ENCODING 1169 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +08 +F8 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni0492 +ENCODING 1170 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +7C +60 +60 +60 +F0 +60 +60 +60 +ENDCHAR +STARTCHAR uni0493 +ENCODING 1171 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +60 +60 +F0 +60 +60 +ENDCHAR +STARTCHAR uni0494 +ENCODING 1172 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F8 +C0 +C0 +C0 +E0 +D8 +D8 +D8 +18 +30 +ENDCHAR +STARTCHAR uni0495 +ENCODING 1173 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F8 +C0 +C0 +E0 +D8 +D8 +18 +30 +ENDCHAR +STARTCHAR uni0496 +ENCODING 1174 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +A8 +A8 +F8 +70 +70 +F8 +A8 +AC +04 +04 +ENDCHAR +STARTCHAR uni0497 +ENCODING 1175 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +A8 +F8 +70 +F8 +A8 +AC +04 +04 +ENDCHAR +STARTCHAR uni0498 +ENCODING 1176 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F0 +18 +18 +70 +18 +18 +18 +F0 +20 +20 +ENDCHAR +STARTCHAR uni0499 +ENCODING 1177 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F0 +18 +70 +18 +18 +F0 +20 +20 +ENDCHAR +STARTCHAR uni049A +ENCODING 1178 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +D8 +D8 +F0 +E0 +E0 +F0 +D8 +DC +04 +04 +ENDCHAR +STARTCHAR uni049B +ENCODING 1179 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +D8 +F0 +E0 +E0 +F0 +DC +04 +04 +ENDCHAR +STARTCHAR uni049C +ENCODING 1180 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +40 +D8 +D8 +F0 +E0 +E0 +F0 +D8 +D8 +40 +ENDCHAR +STARTCHAR uni049D +ENCODING 1181 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +40 +D8 +F0 +E0 +E0 +F0 +D8 +40 +ENDCHAR +STARTCHAR uni049E +ENCODING 1182 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +6C +FC +78 +70 +70 +78 +6C +6C +ENDCHAR +STARTCHAR uni049F +ENCODING 1183 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +68 +F8 +70 +70 +78 +68 +ENDCHAR +STARTCHAR uni04A0 +ENCODING 1184 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +EC +6C +78 +70 +70 +78 +6C +6C +ENDCHAR +STARTCHAR uni04A1 +ENCODING 1185 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +E8 +78 +70 +70 +78 +68 +ENDCHAR +STARTCHAR uni04A2 +ENCODING 1186 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +D8 +D8 +D8 +F8 +D8 +D8 +D8 +DC +04 +04 +ENDCHAR +STARTCHAR uni04A3 +ENCODING 1187 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +D8 +D8 +F8 +D8 +D8 +DC +04 +04 +ENDCHAR +STARTCHAR uni04A4 +ENCODING 1188 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +DC +D8 +D8 +F8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni04A5 +ENCODING 1189 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +DC +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni04A6 +ENCODING 1190 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +E0 +E0 +B8 +AC +AC +AC +AC +AC +0C +18 +ENDCHAR +STARTCHAR uni04A7 +ENCODING 1191 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +E0 +E0 +B8 +AC +AC +AC +0C +18 +ENDCHAR +STARTCHAR uni04A8 +ENCODING 1192 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +30 +60 +D0 +B8 +A8 +A8 +E8 +78 +30 +18 +ENDCHAR +STARTCHAR uni04A9 +ENCODING 1193 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +30 +60 +D0 +B8 +E8 +78 +30 +18 +ENDCHAR +STARTCHAR uni04AA +ENCODING 1194 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +78 +C0 +C0 +C0 +C0 +C0 +C0 +78 +20 +20 +ENDCHAR +STARTCHAR uni04AB +ENCODING 1195 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +78 +C0 +C0 +C0 +C0 +78 +20 +20 +ENDCHAR +STARTCHAR uni04AC +ENCODING 1196 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +FC +30 +30 +30 +30 +30 +30 +38 +08 +08 +ENDCHAR +STARTCHAR uni04AD +ENCODING 1197 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +FC +30 +30 +30 +30 +38 +08 +08 +ENDCHAR +STARTCHAR uni04AE +ENCODING 1198 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +70 +70 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni04AF +ENCODING 1199 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +D8 +70 +70 +20 +20 +20 +ENDCHAR +STARTCHAR uni04B0 +ENCODING 1200 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +70 +70 +20 +70 +20 +20 +ENDCHAR +STARTCHAR uni04B1 +ENCODING 1201 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +D8 +70 +70 +20 +70 +20 +ENDCHAR +STARTCHAR uni04B2 +ENCODING 1202 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +D8 +D8 +70 +20 +20 +70 +D8 +DC +04 +04 +ENDCHAR +STARTCHAR uni04B3 +ENCODING 1203 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +D8 +70 +20 +20 +70 +DC +04 +04 +ENDCHAR +STARTCHAR uni04B4 +ENCODING 1204 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +F0 +6C +6C +6C +6C +6C +6C +7C +0C +0C +ENDCHAR +STARTCHAR uni04B5 +ENCODING 1205 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +F0 +6C +6C +6C +6C +7C +0C +0C +ENDCHAR +STARTCHAR uni04B6 +ENCODING 1206 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +D8 +D8 +D8 +D8 +78 +18 +18 +1C +04 +04 +ENDCHAR +STARTCHAR uni04B7 +ENCODING 1207 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +D8 +D8 +D8 +78 +18 +1C +04 +04 +ENDCHAR +STARTCHAR uni04B8 +ENCODING 1208 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +D8 +D8 +F8 +58 +58 +18 +ENDCHAR +STARTCHAR uni04B9 +ENCODING 1209 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +D8 +D8 +D8 +78 +58 +18 +ENDCHAR +STARTCHAR uni04BA +ENCODING 1210 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +C0 +C0 +F0 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni04BB +ENCODING 1211 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +C0 +C0 +F0 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni04BC +ENCODING 1212 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +68 +E8 +78 +60 +60 +60 +38 +ENDCHAR +STARTCHAR uni04BD +ENCODING 1213 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +30 +E8 +78 +60 +60 +38 +ENDCHAR +STARTCHAR uni04BE +ENCODING 1214 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +30 +68 +E8 +78 +60 +60 +60 +38 +10 +10 +ENDCHAR +STARTCHAR uni04BF +ENCODING 1215 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +30 +E8 +78 +60 +60 +38 +10 +10 +ENDCHAR +STARTCHAR uni04C0 +ENCODING 1216 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 8 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni04C1 +ENCODING 1217 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +A8 +A8 +F8 +70 +F8 +A8 +A8 +ENDCHAR +STARTCHAR uni04C2 +ENCODING 1218 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +70 +00 +A8 +A8 +70 +F8 +A8 +A8 +ENDCHAR +STARTCHAR uni04C3 +ENCODING 1219 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +D8 +D8 +F0 +E0 +E0 +F0 +D8 +D8 +08 +30 +ENDCHAR +STARTCHAR uni04C4 +ENCODING 1220 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +F0 +E0 +F0 +D8 +D8 +08 +30 +ENDCHAR +STARTCHAR uni04C5 +ENCODING 1221 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +78 +58 +58 +58 +58 +58 +58 +98 +04 +08 +ENDCHAR +STARTCHAR uni04C6 +ENCODING 1222 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +78 +58 +58 +58 +58 +98 +04 +08 +ENDCHAR +STARTCHAR uni04C7 +ENCODING 1223 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +D8 +D8 +D8 +F8 +D8 +D8 +D8 +D8 +08 +30 +ENDCHAR +STARTCHAR uni04C8 +ENCODING 1224 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +F8 +D8 +D8 +D8 +08 +30 +ENDCHAR +STARTCHAR uni04C9 +ENCODING 1225 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +D8 +D8 +D8 +F8 +D8 +D8 +D8 +D8 +30 +ENDCHAR +STARTCHAR uni04CA +ENCODING 1226 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +D8 +D8 +F8 +D8 +D8 +D8 +30 +ENDCHAR +STARTCHAR uni04CB +ENCODING 1227 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +D8 +D8 +D8 +78 +18 +18 +18 +38 +20 +20 +ENDCHAR +STARTCHAR uni04CC +ENCODING 1228 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +78 +18 +18 +38 +20 +20 +ENDCHAR +STARTCHAR uni04CD +ENCODING 1229 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +88 +D8 +F8 +F8 +D8 +D8 +D8 +D8 +04 +08 +ENDCHAR +STARTCHAR uni04CE +ENCODING 1230 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +88 +D8 +F8 +F8 +D8 +D8 +04 +08 +ENDCHAR +STARTCHAR uni04CF +ENCODING 1231 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 8 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni04D0 +ENCODING 1232 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni04D1 +ENCODING 1233 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +70 +00 +70 +18 +78 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni04D2 +ENCODING 1234 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +70 +D8 +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni04D3 +ENCODING 1235 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +70 +18 +78 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni04D4 +ENCODING 1236 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +7C +D8 +D8 +FC +D8 +D8 +D8 +DC +ENDCHAR +STARTCHAR uni04D5 +ENCODING 1237 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +28 +78 +F0 +A0 +78 +ENDCHAR +STARTCHAR uni04D6 +ENCODING 1238 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +F8 +C0 +C0 +F0 +C0 +C0 +F8 +ENDCHAR +STARTCHAR uni04D7 +ENCODING 1239 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +70 +00 +70 +D8 +F8 +C0 +C0 +78 +ENDCHAR +STARTCHAR uni04D8 +ENCODING 1240 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +18 +18 +18 +F8 +D8 +D8 +70 +ENDCHAR +STARTCHAR afii10846 +ENCODING 1241 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +18 +18 +F8 +D8 +70 +ENDCHAR +STARTCHAR uni04DA +ENCODING 1242 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +F0 +18 +18 +18 +F8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni04DB +ENCODING 1243 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +F0 +18 +18 +F8 +D8 +70 +ENDCHAR +STARTCHAR uni04DC +ENCODING 1244 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +A8 +A8 +F8 +70 +70 +F8 +A8 +A8 +ENDCHAR +STARTCHAR uni04DD +ENCODING 1245 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +A8 +F8 +70 +F8 +A8 +A8 +ENDCHAR +STARTCHAR uni04DE +ENCODING 1246 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +F0 +18 +18 +30 +18 +18 +18 +F0 +ENDCHAR +STARTCHAR uni04DF +ENCODING 1247 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +F0 +18 +30 +18 +18 +F0 +ENDCHAR +STARTCHAR uni04E0 +ENCODING 1248 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +18 +30 +70 +18 +18 +18 +F0 +ENDCHAR +STARTCHAR uni04E1 +ENCODING 1249 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +18 +70 +18 +18 +F0 +ENDCHAR +STARTCHAR uni04E2 +ENCODING 1250 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +C8 +D8 +F8 +F8 +F8 +F8 +D8 +98 +ENDCHAR +STARTCHAR uni04E3 +ENCODING 1251 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +00 +D8 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni04E4 +ENCODING 1252 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +C8 +D8 +F8 +F8 +F8 +F8 +D8 +98 +ENDCHAR +STARTCHAR uni04E5 +ENCODING 1253 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +D8 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni04E6 +ENCODING 1254 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +70 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni04E7 +ENCODING 1255 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni04E8 +ENCODING 1256 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +D8 +D8 +F8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni04E9 +ENCODING 1257 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +D8 +F8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni04EA +ENCODING 1258 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +70 +D8 +D8 +D8 +F8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni04EB +ENCODING 1259 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +70 +D8 +F8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni04EC +ENCODING 1260 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +F0 +18 +18 +78 +18 +18 +18 +F0 +ENDCHAR +STARTCHAR uni04ED +ENCODING 1261 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +F0 +18 +38 +18 +18 +F0 +ENDCHAR +STARTCHAR uni04EE +ENCODING 1262 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +D8 +D8 +D8 +D8 +78 +18 +18 +70 +ENDCHAR +STARTCHAR uni04EF +ENCODING 1263 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +00 +D8 +D8 +D8 +D8 +D8 +78 +18 +70 +ENDCHAR +STARTCHAR uni04F0 +ENCODING 1264 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +D8 +D8 +D8 +D8 +78 +18 +18 +70 +ENDCHAR +STARTCHAR uni04F1 +ENCODING 1265 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +50 +00 +D8 +D8 +D8 +D8 +D8 +78 +18 +70 +ENDCHAR +STARTCHAR uni04F2 +ENCODING 1266 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +28 +50 +D8 +D8 +D8 +D8 +78 +18 +18 +70 +ENDCHAR +STARTCHAR uni04F3 +ENCODING 1267 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +28 +50 +00 +D8 +D8 +D8 +D8 +D8 +78 +18 +70 +ENDCHAR +STARTCHAR uni04F4 +ENCODING 1268 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +D8 +D8 +D8 +D8 +78 +18 +18 +18 +ENDCHAR +STARTCHAR uni04F5 +ENCODING 1269 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +D8 +D8 +D8 +78 +18 +18 +ENDCHAR +STARTCHAR uni04F6 +ENCODING 1270 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F8 +C0 +C0 +C0 +C0 +C0 +C0 +E0 +20 +20 +ENDCHAR +STARTCHAR uni04F7 +ENCODING 1271 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F8 +C0 +C0 +C0 +C0 +E0 +20 +20 +ENDCHAR +STARTCHAR uni04F8 +ENCODING 1272 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +98 +98 +D8 +F8 +B8 +B8 +F8 +D8 +ENDCHAR +STARTCHAR uni04F9 +ENCODING 1273 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +98 +98 +D8 +B8 +F8 +D8 +ENDCHAR +STARTCHAR uni04FA +ENCODING 1274 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +78 +60 +60 +F0 +60 +60 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR uni04FB +ENCODING 1275 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +78 +60 +F0 +60 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR uni04FC +ENCODING 1276 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +D8 +D8 +70 +20 +20 +70 +D8 +D8 +08 +30 +ENDCHAR +STARTCHAR uni04FD +ENCODING 1277 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +70 +70 +D8 +D8 +08 +30 +ENDCHAR +STARTCHAR uni04FE +ENCODING 1278 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +70 +F8 +20 +70 +D8 +D8 +ENDCHAR +STARTCHAR uni04FF +ENCODING 1279 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +D8 +70 +F8 +20 +70 +D8 +ENDCHAR +STARTCHAR uni0500 +ENCODING 1280 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +18 +18 +78 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni0501 +ENCODING 1281 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +18 +18 +78 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni0502 +ENCODING 1282 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +10 +10 +74 +D4 +D4 +D4 +DC +68 +ENDCHAR +STARTCHAR uni0503 +ENCODING 1283 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +10 +10 +74 +D4 +DC +68 +ENDCHAR +STARTCHAR uni0504 +ENCODING 1284 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +68 +68 +C8 +68 +68 +68 +30 +ENDCHAR +STARTCHAR uni0505 +ENCODING 1285 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +C8 +68 +C8 +68 +68 +30 +ENDCHAR +STARTCHAR uni0506 +ENCODING 1286 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +E0 +30 +30 +E0 +30 +30 +30 +38 +08 +08 +ENDCHAR +STARTCHAR uni0507 +ENCODING 1287 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +E0 +30 +E0 +30 +30 +38 +08 +08 +ENDCHAR +STARTCHAR uni0508 +ENCODING 1288 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +F0 +D4 +D4 +D4 +D4 +D4 +DC +C8 +ENDCHAR +STARTCHAR uni0509 +ENCODING 1289 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +F0 +D4 +D4 +D4 +DC +C8 +ENDCHAR +STARTCHAR uni050A +ENCODING 1290 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +D0 +D0 +D4 +F4 +D4 +D4 +DC +C8 +ENDCHAR +STARTCHAR uni050B +ENCODING 1291 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +D0 +D4 +F4 +D4 +DC +C8 +ENDCHAR +STARTCHAR uni050C +ENCODING 1292 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +C0 +C0 +C0 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni050D +ENCODING 1293 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +C0 +C0 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni050E +ENCODING 1294 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +60 +68 +68 +68 +68 +68 +30 +ENDCHAR +STARTCHAR uni050F +ENCODING 1295 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +60 +68 +68 +68 +68 +30 +ENDCHAR +STARTCHAR uni0510 +ENCODING 1296 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +C0 +C0 +70 +C0 +C0 +C0 +78 +ENDCHAR +STARTCHAR uni0511 +ENCODING 1297 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +C0 +70 +C0 +C0 +78 +ENDCHAR +STARTCHAR uni0512 +ENCODING 1298 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +7C +6C +6C +6C +6C +6C +6C +CC +0C +18 +ENDCHAR +STARTCHAR uni0513 +ENCODING 1299 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +7C +6C +6C +6C +6C +CC +0C +18 +ENDCHAR +STARTCHAR uni0514 +ENCODING 1300 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +F4 +D4 +DC +C8 +C8 +DC +D4 +D4 +ENDCHAR +STARTCHAR uni0515 +ENCODING 1301 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +F4 +DC +C8 +DC +D4 +D4 +ENDCHAR +STARTCHAR uni0516 +ENCODING 1302 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +E4 +D4 +DC +D8 +E8 +CC +C4 +C4 +ENDCHAR +STARTCHAR uni0517 +ENCODING 1303 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +E4 +DC +D8 +DC +D4 +E4 +C0 +C0 +ENDCHAR +STARTCHAR uni0518 +ENCODING 1304 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +B0 +B0 +78 +F0 +B0 +B0 +B8 +ENDCHAR +STARTCHAR uni0519 +ENCODING 1305 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +A8 +78 +F8 +B0 +98 +ENDCHAR +STARTCHAR uni051A +ENCODING 1306 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +D8 +D8 +D8 +D8 +D8 +F8 +70 +18 +ENDCHAR +STARTCHAR uni051B +ENCODING 1307 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +78 +D8 +D8 +D8 +D8 +78 +18 +18 +ENDCHAR +STARTCHAR uni051C +ENCODING 1308 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +D8 +F8 +F8 +F8 +D8 +88 +ENDCHAR +STARTCHAR uni051D +ENCODING 1309 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +D8 +D8 +F8 +F8 +F8 +50 +ENDCHAR +STARTCHAR uni051E +ENCODING 1310 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +20 +D8 +D8 +F4 +E0 +E0 +F0 +D8 +D8 +ENDCHAR +STARTCHAR uni051F +ENCODING 1311 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +D8 +F0 +E8 +F0 +D8 +D8 +ENDCHAR +STARTCHAR uni0520 +ENCODING 1312 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +F0 +D0 +D0 +D8 +DC +D4 +D4 +D4 +04 +18 +ENDCHAR +STARTCHAR uni0521 +ENCODING 1313 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +F0 +D0 +D0 +D8 +DC +D4 +04 +08 +ENDCHAR +STARTCHAR uni0522 +ENCODING 1314 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +D0 +D0 +D0 +F8 +DC +D4 +D4 +D4 +04 +08 +ENDCHAR +STARTCHAR uni0523 +ENCODING 1315 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +D0 +D0 +F8 +DC +D4 +D4 +04 +08 +ENDCHAR +STARTCHAR uni0524 +ENCODING 1316 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +F8 +D8 +D8 +D8 +D8 +D8 +D8 +DC +04 +04 +ENDCHAR +STARTCHAR uni0525 +ENCODING 1317 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +F8 +D8 +D8 +D8 +D8 +DC +04 +04 +ENDCHAR +STARTCHAR uni0526 +ENCODING 1318 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +C0 +C0 +F0 +D8 +D8 +D8 +D8 +DC +04 +04 +ENDCHAR +STARTCHAR uni0527 +ENCODING 1319 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +C0 +C0 +F0 +D8 +D8 +DC +04 +04 +ENDCHAR +STARTCHAR afii57407 +ENCODING 1567 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +C0 +C0 +60 +30 +00 +30 +30 +ENDCHAR +STARTCHAR afii57409 +ENCODING 1569 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 5 2 1 +BITMAP +60 +C0 +C0 +60 +C0 +ENDCHAR +STARTCHAR afii57410 +ENCODING 1570 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +50 +A0 +00 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR afii57411 +ENCODING 1571 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +60 +C0 +E0 +00 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR afii57412 +ENCODING 1572 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +30 +60 +70 +00 +30 +78 +58 +38 +18 +F0 +ENDCHAR +STARTCHAR afii57413 +ENCODING 1573 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 -2 +BITMAP +60 +60 +60 +60 +60 +60 +00 +60 +C0 +E0 +ENDCHAR +STARTCHAR afii57414 +ENCODING 1574 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +60 +C0 +E0 +08 +1C +54 +D8 +D8 +70 +ENDCHAR +STARTCHAR afii57415 +ENCODING 1575 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 8 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR afii57416 +ENCODING 1576 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +30 +98 +D8 +70 +00 +20 +ENDCHAR +STARTCHAR afii57417 +ENCODING 1577 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +60 +D0 +D8 +D8 +70 +ENDCHAR +STARTCHAR afii57418 +ENCODING 1578 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +50 +00 +30 +98 +D8 +70 +ENDCHAR +STARTCHAR afii57419 +ENCODING 1579 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +50 +00 +30 +98 +D8 +70 +ENDCHAR +STARTCHAR afii57420 +ENCODING 1580 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F8 +30 +60 +C0 +D0 +C0 +60 +38 +ENDCHAR +STARTCHAR afii57421 +ENCODING 1581 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F8 +30 +60 +C0 +C0 +C0 +60 +38 +ENDCHAR +STARTCHAR afii57422 +ENCODING 1582 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +00 +F8 +30 +60 +C0 +C0 +C0 +60 +38 +ENDCHAR +STARTCHAR afii57423 +ENCODING 1583 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +60 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR afii57424 +ENCODING 1584 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +00 +60 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR afii57425 +ENCODING 1585 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 -1 +BITMAP +18 +18 +18 +30 +E0 +ENDCHAR +STARTCHAR afii57426 +ENCODING 1586 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +08 +00 +18 +18 +18 +30 +E0 +ENDCHAR +STARTCHAR afii57427 +ENCODING 1587 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +04 +54 +54 +7C +38 +A0 +40 +ENDCHAR +STARTCHAR afii57428 +ENCODING 1588 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +20 +00 +50 +04 +54 +54 +7C +38 +A0 +40 +ENDCHAR +STARTCHAR afii57429 +ENCODING 1589 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +28 +3C +B4 +B8 +E0 +40 +ENDCHAR +STARTCHAR afii57430 +ENCODING 1590 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +20 +00 +28 +3C +B4 +B8 +E0 +40 +ENDCHAR +STARTCHAR afii57431 +ENCODING 1591 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +60 +60 +60 +70 +78 +68 +F0 +ENDCHAR +STARTCHAR afii57432 +ENCODING 1592 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +60 +68 +60 +70 +78 +68 +F0 +ENDCHAR +STARTCHAR afii57433 +ENCODING 1593 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +60 +C0 +C0 +70 +C0 +C0 +D8 +70 +ENDCHAR +STARTCHAR afii57434 +ENCODING 1594 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +40 +00 +60 +C0 +C0 +70 +C0 +C0 +D8 +70 +ENDCHAR +STARTCHAR afii57440 +ENCODING 1600 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 1 0 0 +BITMAP +FC +ENDCHAR +STARTCHAR afii57441 +ENCODING 1601 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +30 +28 +98 +C8 +70 +ENDCHAR +STARTCHAR afii57442 +ENCODING 1602 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +28 +00 +30 +28 +98 +C8 +70 +ENDCHAR +STARTCHAR afii57443 +ENCODING 1603 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +58 +98 +58 +98 +18 +98 +98 +70 +ENDCHAR +STARTCHAR afii57444 +ENCODING 1604 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +58 +D8 +D8 +70 +ENDCHAR +STARTCHAR afii57445 +ENCODING 1605 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +70 +D8 +D8 +F0 +80 +80 +ENDCHAR +STARTCHAR afii57446 +ENCODING 1606 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +20 +00 +30 +98 +D8 +D8 +70 +ENDCHAR +STARTCHAR afii57470 +ENCODING 1607 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +60 +D0 +D8 +D8 +70 +ENDCHAR +STARTCHAR afii57448 +ENCODING 1608 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +70 +D8 +D8 +78 +18 +F0 +ENDCHAR +STARTCHAR afii57449 +ENCODING 1609 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 -1 +BITMAP +08 +1C +14 +D8 +D8 +70 +ENDCHAR +STARTCHAR afii57450 +ENCODING 1610 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +08 +1C +50 +D8 +D8 +70 +00 +50 +ENDCHAR +STARTCHAR afii57392 +ENCODING 1632 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 2 2 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR afii57393 +ENCODING 1633 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 0 0 +BITMAP +C0 +C0 +60 +60 +30 +30 +30 +30 +ENDCHAR +STARTCHAR afii57394 +ENCODING 1634 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +70 +70 +30 +30 +30 +30 +ENDCHAR +STARTCHAR afii57395 +ENCODING 1635 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A8 +F8 +F0 +C0 +60 +60 +60 +60 +ENDCHAR +STARTCHAR afii57396 +ENCODING 1636 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +C0 +C0 +60 +C0 +C0 +D8 +70 +ENDCHAR +STARTCHAR afii57397 +ENCODING 1637 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR afii57398 +ENCODING 1638 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +30 +30 +30 +30 +18 +18 +18 +ENDCHAR +STARTCHAR afii57399 +ENCODING 1639 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +70 +70 +70 +20 +20 +20 +ENDCHAR +STARTCHAR afii57400 +ENCODING 1640 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +20 +70 +70 +70 +D8 +D8 +ENDCHAR +STARTCHAR afii57401 +ENCODING 1641 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +D8 +D8 +78 +18 +18 +18 +18 +ENDCHAR +STARTCHAR afii57381 +ENCODING 1642 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +C8 +18 +30 +60 +C0 +98 +18 +ENDCHAR +STARTCHAR uni066B +ENCODING 1643 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 4 0 -1 +BITMAP +18 +18 +30 +E0 +ENDCHAR +STARTCHAR uni066C +ENCODING 1644 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +60 +60 +C0 +ENDCHAR +STARTCHAR uni066E +ENCODING 1646 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +30 +98 +D8 +70 +ENDCHAR +STARTCHAR uni066F +ENCODING 1647 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 -1 +BITMAP +30 +28 +98 +C8 +70 +ENDCHAR +STARTCHAR uni0FD5 +ENCODING 4053 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 2 +BITMAP +BC +B0 +FC +FC +34 +F4 +ENDCHAR +STARTCHAR uni0FD6 +ENCODING 4054 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 2 +BITMAP +F4 +34 +FC +FC +B0 +BC +ENDCHAR +STARTCHAR uni1E00 +ENCODING 7680 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +D8 +D8 +F8 +D8 +D8 +D8 +20 +50 +20 +ENDCHAR +STARTCHAR uni1E01 +ENCODING 7681 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +70 +18 +78 +D8 +78 +20 +50 +20 +ENDCHAR +STARTCHAR uni1E02 +ENCODING 7682 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +F0 +D8 +D8 +F0 +D8 +D8 +D8 +F0 +ENDCHAR +STARTCHAR uni1E03 +ENCODING 7683 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +C0 +C0 +F0 +D8 +D8 +D8 +D8 +F0 +ENDCHAR +STARTCHAR uni1E04 +ENCODING 7684 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F0 +D8 +D8 +F0 +D8 +D8 +D8 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E05 +ENCODING 7685 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +C0 +C0 +F0 +D8 +D8 +D8 +D8 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E06 +ENCODING 7686 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F0 +D8 +D8 +F0 +D8 +D8 +D8 +F0 +00 +70 +ENDCHAR +STARTCHAR uni1E07 +ENCODING 7687 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +C0 +C0 +F0 +D8 +D8 +D8 +D8 +F0 +00 +70 +ENDCHAR +STARTCHAR uni1E08 +ENCODING 7688 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +20 +78 +C0 +C0 +C0 +C0 +C0 +C0 +78 +20 +C0 +ENDCHAR +STARTCHAR uni1E09 +ENCODING 7689 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +20 +00 +78 +C0 +C0 +C0 +C0 +78 +20 +C0 +ENDCHAR +STARTCHAR uni1E0A +ENCODING 7690 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +E0 +D0 +D8 +D8 +D8 +D8 +D0 +E0 +ENDCHAR +STARTCHAR uni1E0B +ENCODING 7691 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +18 +18 +78 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni1E0C +ENCODING 7692 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +E0 +D0 +D8 +D8 +D8 +D8 +D0 +E0 +00 +20 +ENDCHAR +STARTCHAR uni1E0D +ENCODING 7693 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +18 +18 +78 +D8 +D8 +D8 +D8 +78 +00 +20 +ENDCHAR +STARTCHAR uni1E0E +ENCODING 7694 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +E0 +D0 +D8 +D8 +D8 +D8 +D0 +E0 +00 +70 +ENDCHAR +STARTCHAR uni1E0F +ENCODING 7695 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +18 +18 +78 +D8 +D8 +D8 +D8 +78 +00 +70 +ENDCHAR +STARTCHAR uni1E10 +ENCODING 7696 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +E0 +D0 +D8 +D8 +D8 +D8 +D0 +E0 +20 +C0 +ENDCHAR +STARTCHAR uni1E11 +ENCODING 7697 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +18 +18 +78 +D8 +D8 +D8 +D8 +78 +20 +C0 +ENDCHAR +STARTCHAR uni1E12 +ENCODING 7698 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +E0 +D0 +D8 +D8 +D8 +D8 +D0 +E0 +20 +50 +ENDCHAR +STARTCHAR uni1E13 +ENCODING 7699 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +18 +18 +78 +D8 +D8 +D8 +D8 +78 +20 +50 +ENDCHAR +STARTCHAR uni1E14 +ENCODING 7700 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +70 +00 +F8 +C0 +F8 +C0 +C0 +F8 +ENDCHAR +STARTCHAR uni1E15 +ENCODING 7701 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +70 +00 +70 +D8 +F8 +C0 +C0 +78 +ENDCHAR +STARTCHAR uni1E16 +ENCODING 7702 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +70 +00 +F8 +C0 +F8 +C0 +C0 +F8 +ENDCHAR +STARTCHAR uni1E17 +ENCODING 7703 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +70 +00 +70 +C8 +F8 +C0 +C0 +78 +ENDCHAR +STARTCHAR uni1E18 +ENCODING 7704 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F8 +C0 +C0 +F8 +C0 +C0 +C0 +F8 +20 +50 +ENDCHAR +STARTCHAR uni1E19 +ENCODING 7705 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +70 +C8 +F8 +C0 +C0 +78 +20 +50 +ENDCHAR +STARTCHAR uni1E1A +ENCODING 7706 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F8 +C0 +C0 +F8 +C0 +C0 +F8 +00 +68 +B0 +ENDCHAR +STARTCHAR uni1E1B +ENCODING 7707 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +70 +D8 +F8 +C0 +78 +00 +68 +B0 +ENDCHAR +STARTCHAR uni1E1C +ENCODING 7708 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +88 +70 +F8 +C0 +C0 +C0 +F8 +C0 +C0 +F8 +20 +C0 +ENDCHAR +STARTCHAR uni1E1D +ENCODING 7709 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +88 +70 +00 +70 +D8 +F8 +C0 +D8 +70 +20 +C0 +ENDCHAR +STARTCHAR uni1E1E +ENCODING 7710 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +F8 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni1E1F +ENCODING 7711 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +40 +00 +70 +C0 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni1E20 +ENCODING 7712 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +78 +C0 +C0 +C0 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1E21 +ENCODING 7713 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +00 +78 +D8 +D8 +D8 +D8 +78 +18 +70 +ENDCHAR +STARTCHAR uni1E22 +ENCODING 7714 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +D8 +D8 +D8 +F8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni1E23 +ENCODING 7715 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +C0 +C0 +F0 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni1E24 +ENCODING 7716 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +D8 +D8 +D8 +F8 +D8 +D8 +D8 +D8 +00 +20 +ENDCHAR +STARTCHAR uni1E25 +ENCODING 7717 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +C0 +C0 +F0 +D8 +D8 +D8 +D8 +D8 +00 +20 +ENDCHAR +STARTCHAR uni1E26 +ENCODING 7718 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +D8 +D8 +D8 +F8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni1E27 +ENCODING 7719 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +C0 +C0 +F0 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni1E28 +ENCODING 7720 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +D8 +D8 +D8 +F8 +D8 +D8 +D8 +D8 +20 +C0 +ENDCHAR +STARTCHAR uni1E29 +ENCODING 7721 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +C0 +C0 +F0 +D8 +D8 +D8 +D8 +D8 +20 +C0 +ENDCHAR +STARTCHAR uni1E2A +ENCODING 7722 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +D8 +D8 +D8 +F8 +D8 +D8 +D8 +00 +88 +70 +ENDCHAR +STARTCHAR uni1E2B +ENCODING 7723 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +C0 +C0 +F0 +D8 +D8 +D8 +D8 +00 +88 +70 +ENDCHAR +STARTCHAR uni1E2C +ENCODING 7724 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +30 +00 +68 +B0 +ENDCHAR +STARTCHAR uni1E2D +ENCODING 7725 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +30 +30 +00 +30 +30 +30 +30 +30 +00 +68 +B0 +ENDCHAR +STARTCHAR uni1E2E +ENCODING 7726 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +20 +40 +00 +A0 +00 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni1E2F +ENCODING 7727 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +20 +40 +00 +A0 +00 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni1E30 +ENCODING 7728 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +D8 +D8 +F0 +E0 +E0 +F0 +D8 +D8 +ENDCHAR +STARTCHAR uni1E31 +ENCODING 7729 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +C0 +C0 +D8 +F0 +E0 +E0 +F0 +D8 +ENDCHAR +STARTCHAR uni1E32 +ENCODING 7730 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +D8 +D8 +F0 +E0 +E0 +F0 +D8 +D8 +00 +20 +ENDCHAR +STARTCHAR uni1E33 +ENCODING 7731 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +C0 +C0 +D8 +F0 +E0 +E0 +F0 +D8 +00 +20 +ENDCHAR +STARTCHAR Klinebelow +ENCODING 7732 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +D8 +D8 +F0 +E0 +E0 +F0 +D8 +D8 +00 +70 +ENDCHAR +STARTCHAR klinebelow +ENCODING 7733 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +C0 +C0 +D8 +F0 +E0 +E0 +F0 +D8 +00 +70 +ENDCHAR +STARTCHAR uni1E36 +ENCODING 7734 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +F8 +00 +20 +ENDCHAR +STARTCHAR uni1E37 +ENCODING 7735 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +60 +00 +80 +ENDCHAR +STARTCHAR uni1E38 +ENCODING 7736 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +70 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +F8 +00 +20 +ENDCHAR +STARTCHAR uni1E39 +ENCODING 7737 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 12 1 -2 +BITMAP +E0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +60 +00 +40 +ENDCHAR +STARTCHAR uni1E3A +ENCODING 7738 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +F8 +00 +70 +ENDCHAR +STARTCHAR uni1E3B +ENCODING 7739 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +60 +00 +E0 +ENDCHAR +STARTCHAR uni1E3C +ENCODING 7740 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +F8 +20 +50 +ENDCHAR +STARTCHAR uni1E3D +ENCODING 7741 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +60 +00 +40 +A0 +ENDCHAR +STARTCHAR uni1E3E +ENCODING 7742 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +88 +D8 +F8 +F8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni1E3F +ENCODING 7743 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +F0 +F8 +F8 +F8 +D8 +D8 +ENDCHAR +STARTCHAR uni1E40 +ENCODING 7744 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +88 +D8 +F8 +F8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni1E41 +ENCODING 7745 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +F0 +F8 +F8 +F8 +D8 +D8 +ENDCHAR +STARTCHAR uni1E42 +ENCODING 7746 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +D8 +F8 +F8 +D8 +D8 +D8 +D8 +00 +20 +ENDCHAR +STARTCHAR uni1E43 +ENCODING 7747 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F0 +F8 +F8 +F8 +D8 +D8 +00 +20 +ENDCHAR +STARTCHAR uni1E44 +ENCODING 7748 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +98 +D8 +F8 +F8 +F8 +F8 +D8 +C8 +ENDCHAR +STARTCHAR uni1E45 +ENCODING 7749 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +F0 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni1E46 +ENCODING 7750 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +98 +D8 +F8 +F8 +F8 +F8 +D8 +C8 +00 +20 +ENDCHAR +STARTCHAR uni1E47 +ENCODING 7751 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F0 +D8 +D8 +D8 +D8 +D8 +00 +20 +ENDCHAR +STARTCHAR uni1E48 +ENCODING 7752 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +98 +D8 +F8 +F8 +F8 +F8 +D8 +D8 +00 +70 +ENDCHAR +STARTCHAR uni1E49 +ENCODING 7753 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F0 +D8 +D8 +D8 +D8 +D8 +00 +70 +ENDCHAR +STARTCHAR uni1E4A +ENCODING 7754 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +98 +D8 +F8 +F8 +F8 +F8 +D8 +C8 +20 +50 +ENDCHAR +STARTCHAR uni1E4B +ENCODING 7755 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F0 +D8 +D8 +D8 +D8 +D8 +20 +50 +ENDCHAR +STARTCHAR uni1E4C +ENCODING 7756 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +68 +B0 +00 +70 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1E4D +ENCODING 7757 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +68 +B0 +00 +70 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1E4E +ENCODING 7758 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +68 +B0 +00 +70 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1E4F +ENCODING 7759 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +68 +B0 +00 +70 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1E50 +ENCODING 7760 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +70 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1E51 +ENCODING 7761 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +70 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1E52 +ENCODING 7762 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +70 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1E53 +ENCODING 7763 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +70 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1E54 +ENCODING 7764 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +F0 +D8 +D8 +D8 +F0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni1E55 +ENCODING 7765 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +20 +00 +F0 +D8 +D8 +D8 +D8 +F0 +C0 +C0 +ENDCHAR +STARTCHAR uni1E56 +ENCODING 7766 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +F0 +D8 +D8 +D8 +F0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni1E57 +ENCODING 7767 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +00 +F0 +D8 +D8 +D8 +D8 +F0 +C0 +C0 +ENDCHAR +STARTCHAR uni1E58 +ENCODING 7768 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +F0 +D8 +D8 +D8 +F0 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni1E59 +ENCODING 7769 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +78 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni1E5A +ENCODING 7770 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F0 +D8 +D8 +D8 +F0 +D8 +D8 +D8 +00 +20 +ENDCHAR +STARTCHAR uni1E5B +ENCODING 7771 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +78 +C0 +C0 +C0 +C0 +C0 +00 +20 +ENDCHAR +STARTCHAR uni1E5C +ENCODING 7772 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +70 +00 +F0 +D8 +D8 +D8 +F0 +D8 +D8 +D8 +00 +20 +ENDCHAR +STARTCHAR uni1E5D +ENCODING 7773 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +00 +78 +C0 +C0 +C0 +C0 +C0 +00 +20 +ENDCHAR +STARTCHAR uni1E5E +ENCODING 7774 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F0 +D8 +D8 +D8 +F0 +D8 +D8 +D8 +00 +70 +ENDCHAR +STARTCHAR uni1E5F +ENCODING 7775 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +78 +C0 +C0 +C0 +C0 +C0 +00 +70 +ENDCHAR +STARTCHAR uni1E60 +ENCODING 7776 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +78 +C0 +C0 +70 +18 +18 +18 +F0 +ENDCHAR +STARTCHAR uni1E61 +ENCODING 7777 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +78 +C0 +70 +18 +18 +F0 +ENDCHAR +STARTCHAR uni1E62 +ENCODING 7778 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +78 +C0 +C0 +70 +18 +18 +18 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E63 +ENCODING 7779 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +78 +C0 +70 +18 +18 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E64 +ENCODING 7780 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +08 +50 +00 +78 +C0 +C0 +70 +18 +18 +F0 +ENDCHAR +STARTCHAR uni1E65 +ENCODING 7781 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +08 +50 +00 +78 +C0 +70 +18 +18 +F0 +ENDCHAR +STARTCHAR uni1E66 +ENCODING 7782 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +A0 +48 +00 +78 +C0 +C0 +70 +18 +18 +F0 +ENDCHAR +STARTCHAR uni1E67 +ENCODING 7783 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A0 +48 +00 +78 +C0 +70 +18 +18 +F0 +ENDCHAR +STARTCHAR uni1E68 +ENCODING 7784 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +20 +00 +78 +C0 +C0 +70 +18 +18 +18 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E69 +ENCODING 7785 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +00 +78 +C0 +70 +18 +18 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E6A +ENCODING 7786 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +20 +00 +FC +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni1E6B +ENCODING 7787 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +40 +00 +C0 +C0 +F0 +C0 +C0 +C0 +C0 +70 +ENDCHAR +STARTCHAR uni1E6C +ENCODING 7788 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +FC +30 +30 +30 +30 +30 +30 +30 +00 +20 +ENDCHAR +STARTCHAR uni1E6D +ENCODING 7789 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 -2 +BITMAP +C0 +C0 +F0 +C0 +C0 +C0 +C0 +70 +00 +40 +ENDCHAR +STARTCHAR uni1E6E +ENCODING 7790 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +FC +30 +30 +30 +30 +30 +30 +30 +00 +70 +ENDCHAR +STARTCHAR uni1E6F +ENCODING 7791 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 -2 +BITMAP +C0 +C0 +F0 +C0 +C0 +C0 +C0 +70 +00 +E0 +ENDCHAR +STARTCHAR uni1E70 +ENCODING 7792 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +FC +30 +30 +30 +30 +30 +30 +30 +20 +50 +ENDCHAR +STARTCHAR uni1E71 +ENCODING 7793 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 -2 +BITMAP +C0 +C0 +F0 +C0 +C0 +C0 +C0 +70 +40 +A0 +ENDCHAR +STARTCHAR uni1E72 +ENCODING 7794 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +D8 +D8 +D8 +D8 +D8 +D8 +D8 +70 +00 +50 +ENDCHAR +STARTCHAR uni1E73 +ENCODING 7795 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +D8 +D8 +D8 +78 +00 +50 +ENDCHAR +STARTCHAR uni1E74 +ENCODING 7796 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +D8 +D8 +D8 +D8 +D8 +D8 +70 +00 +68 +B0 +ENDCHAR +STARTCHAR uni1E75 +ENCODING 7797 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +D8 +D8 +78 +00 +68 +B0 +ENDCHAR +STARTCHAR uni1E76 +ENCODING 7798 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +D8 +D8 +D8 +D8 +D8 +D8 +D8 +70 +20 +50 +ENDCHAR +STARTCHAR uni1E77 +ENCODING 7799 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +D8 +D8 +D8 +78 +20 +50 +ENDCHAR +STARTCHAR uni1E78 +ENCODING 7800 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +68 +B0 +00 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1E79 +ENCODING 7801 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +68 +B0 +00 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni1E7A +ENCODING 7802 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +70 +00 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1E7B +ENCODING 7803 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +70 +00 +D8 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni1E7C +ENCODING 7804 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +D8 +D8 +D8 +70 +70 +20 +20 +ENDCHAR +STARTCHAR uni1E7D +ENCODING 7805 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +A8 +90 +00 +D8 +D8 +50 +70 +70 +20 +ENDCHAR +STARTCHAR uni1E7E +ENCODING 7806 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +D8 +D8 +D8 +70 +70 +70 +20 +20 +00 +20 +ENDCHAR +STARTCHAR uni1E7F +ENCODING 7807 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +D8 +70 +70 +20 +00 +20 +ENDCHAR +STARTCHAR Wgrave +ENCODING 7808 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +D8 +D8 +D8 +D8 +F8 +F8 +D8 +88 +ENDCHAR +STARTCHAR wgrave +ENCODING 7809 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +00 +D8 +D8 +F8 +F8 +F8 +50 +ENDCHAR +STARTCHAR Wacute +ENCODING 7810 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +D8 +D8 +D8 +D8 +F8 +F8 +D8 +88 +ENDCHAR +STARTCHAR wacute +ENCODING 7811 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +20 +D8 +D8 +F8 +F8 +F8 +50 +ENDCHAR +STARTCHAR Wdieresis +ENCODING 7812 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +D8 +D8 +D8 +D8 +F8 +F8 +D8 +88 +ENDCHAR +STARTCHAR wdieresis +ENCODING 7813 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +D8 +D8 +F8 +F8 +F8 +50 +ENDCHAR +STARTCHAR uni1E86 +ENCODING 7814 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +D8 +D8 +D8 +D8 +F8 +F8 +D8 +88 +ENDCHAR +STARTCHAR uni1E87 +ENCODING 7815 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +D8 +D8 +F8 +F8 +F8 +50 +ENDCHAR +STARTCHAR uni1E88 +ENCODING 7816 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +D8 +D8 +D8 +D8 +F8 +F8 +D8 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E89 +ENCODING 7817 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +F8 +F8 +F8 +50 +00 +20 +ENDCHAR +STARTCHAR uni1E8A +ENCODING 7818 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +D8 +D8 +70 +20 +20 +70 +D8 +D8 +ENDCHAR +STARTCHAR uni1E8B +ENCODING 7819 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +D8 +70 +20 +20 +70 +D8 +ENDCHAR +STARTCHAR uni1E8C +ENCODING 7820 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +D8 +D8 +70 +20 +20 +70 +D8 +D8 +ENDCHAR +STARTCHAR uni1E8D +ENCODING 7821 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +D8 +70 +20 +20 +70 +D8 +ENDCHAR +STARTCHAR uni1E8E +ENCODING 7822 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +20 +00 +CC +CC +78 +78 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni1E8F +ENCODING 7823 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +00 +D8 +D8 +D8 +D8 +D8 +78 +18 +70 +ENDCHAR +STARTCHAR uni1E90 +ENCODING 7824 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +F8 +18 +18 +30 +60 +C0 +C0 +F8 +ENDCHAR +STARTCHAR uni1E91 +ENCODING 7825 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +00 +F8 +18 +30 +60 +C0 +F8 +ENDCHAR +STARTCHAR uni1E92 +ENCODING 7826 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F8 +08 +18 +30 +60 +C0 +C0 +F8 +00 +20 +ENDCHAR +STARTCHAR uni1E93 +ENCODING 7827 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F8 +18 +30 +60 +C0 +F8 +00 +20 +ENDCHAR +STARTCHAR uni1E94 +ENCODING 7828 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F8 +08 +18 +30 +60 +C0 +C0 +F8 +00 +70 +ENDCHAR +STARTCHAR uni1E95 +ENCODING 7829 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F8 +18 +30 +60 +C0 +F8 +00 +70 +ENDCHAR +STARTCHAR uni1E96 +ENCODING 7830 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +C0 +C0 +F0 +D8 +D8 +D8 +D8 +D8 +00 +70 +ENDCHAR +STARTCHAR uni1E97 +ENCODING 7831 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +A0 +00 +C0 +C0 +F0 +C0 +C0 +C0 +C0 +70 +ENDCHAR +STARTCHAR uni1E98 +ENCODING 7832 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +70 +00 +D8 +D8 +F8 +F8 +F8 +50 +ENDCHAR +STARTCHAR uni1E99 +ENCODING 7833 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +88 +70 +00 +D8 +D8 +D8 +D8 +D8 +78 +18 +70 +ENDCHAR +STARTCHAR uni1E9A +ENCODING 7834 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +04 +74 +18 +78 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni1E9B +ENCODING 7835 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +38 +60 +E0 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni1E9C +ENCODING 7836 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +38 +60 +E0 +60 +70 +E0 +60 +60 +ENDCHAR +STARTCHAR uni1E9D +ENCODING 7837 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +38 +60 +F0 +60 +E0 +60 +60 +60 +ENDCHAR +STARTCHAR uni1E9E +ENCODING 7838 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +D8 +F8 +E0 +F0 +D8 +D8 +F0 +ENDCHAR +STARTCHAR uni1E9F +ENCODING 7839 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +D8 +C0 +60 +F0 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1EA0 +ENCODING 7840 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +D8 +D8 +D8 +F8 +D8 +D8 +D8 +00 +20 +ENDCHAR +STARTCHAR uni1EA1 +ENCODING 7841 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +70 +18 +78 +D8 +D8 +78 +00 +20 +ENDCHAR +STARTCHAR uni1EA2 +ENCODING 7842 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +20 +70 +D8 +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni1EA3 +ENCODING 7843 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +20 +70 +18 +78 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni1EA4 +ENCODING 7844 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +90 +28 +00 +70 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni1EA5 +ENCODING 7845 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +90 +28 +00 +70 +18 +78 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni1EA6 +ENCODING 7846 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +48 +A0 +00 +70 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni1EA7 +ENCODING 7847 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +48 +A0 +00 +70 +18 +78 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni1EA8 +ENCODING 7848 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +20 +50 +00 +70 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni1EA9 +ENCODING 7849 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +20 +50 +00 +70 +18 +78 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni1EAA +ENCODING 7850 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +20 +50 +00 +70 +D8 +F8 +D8 +D8 +ENDCHAR +STARTCHAR uni1EAB +ENCODING 7851 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +20 +50 +00 +70 +18 +78 +D8 +78 +ENDCHAR +STARTCHAR uni1EAC +ENCODING 7852 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +20 +50 +00 +70 +D8 +D8 +F8 +D8 +D8 +D8 +00 +20 +ENDCHAR +STARTCHAR uni1EAD +ENCODING 7853 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +20 +50 +00 +70 +18 +78 +D8 +D8 +78 +00 +20 +ENDCHAR +STARTCHAR uni1EAE +ENCODING 7854 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +88 +70 +00 +70 +D8 +F8 +D8 +D8 +ENDCHAR +STARTCHAR uni1EAF +ENCODING 7855 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +88 +70 +00 +70 +18 +78 +D8 +78 +ENDCHAR +STARTCHAR uni1EB0 +ENCODING 7856 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +88 +70 +00 +70 +D8 +F8 +D8 +D8 +ENDCHAR +STARTCHAR uni1EB1 +ENCODING 7857 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +88 +70 +00 +70 +18 +78 +D8 +78 +ENDCHAR +STARTCHAR uni1EB2 +ENCODING 7858 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +20 +88 +70 +00 +70 +D8 +F8 +D8 +D8 +ENDCHAR +STARTCHAR uni1EB3 +ENCODING 7859 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +20 +88 +70 +00 +70 +18 +78 +D8 +78 +ENDCHAR +STARTCHAR uni1EB4 +ENCODING 7860 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +88 +70 +00 +70 +D8 +F8 +D8 +D8 +ENDCHAR +STARTCHAR uni1EB5 +ENCODING 7861 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +88 +70 +00 +70 +18 +78 +D8 +78 +ENDCHAR +STARTCHAR uni1EB6 +ENCODING 7862 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +88 +70 +00 +70 +D8 +D8 +F8 +D8 +D8 +D8 +00 +20 +ENDCHAR +STARTCHAR uni1EB7 +ENCODING 7863 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +88 +70 +00 +70 +18 +78 +D8 +D8 +78 +00 +20 +ENDCHAR +STARTCHAR Edotbelow +ENCODING 7864 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F8 +C0 +C0 +F8 +C0 +C0 +C0 +F8 +00 +20 +ENDCHAR +STARTCHAR edotbelow +ENCODING 7865 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +70 +D8 +F8 +C0 +C0 +78 +00 +20 +ENDCHAR +STARTCHAR uni1EBA +ENCODING 7866 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +20 +F8 +C0 +C0 +F8 +C0 +C0 +C0 +F8 +ENDCHAR +STARTCHAR uni1EBB +ENCODING 7867 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +20 +70 +D8 +F8 +C0 +C0 +78 +ENDCHAR +STARTCHAR Etilde +ENCODING 7868 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +F8 +C0 +F8 +C0 +C0 +C0 +F8 +ENDCHAR +STARTCHAR etilde +ENCODING 7869 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +A8 +90 +00 +70 +D8 +F8 +C0 +C0 +78 +ENDCHAR +STARTCHAR uni1EBE +ENCODING 7870 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +90 +28 +00 +F8 +C0 +F8 +C0 +C0 +F8 +ENDCHAR +STARTCHAR uni1EBF +ENCODING 7871 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +90 +28 +00 +70 +D8 +F8 +C0 +C0 +78 +ENDCHAR +STARTCHAR uni1EC0 +ENCODING 7872 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +48 +A0 +00 +F8 +C0 +F8 +C0 +C0 +F8 +ENDCHAR +STARTCHAR uni1EC1 +ENCODING 7873 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +48 +A0 +00 +70 +D8 +F8 +C0 +C0 +78 +ENDCHAR +STARTCHAR uni1EC2 +ENCODING 7874 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +20 +50 +00 +F8 +C0 +F8 +C0 +C0 +F8 +ENDCHAR +STARTCHAR uni1EC3 +ENCODING 7875 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +20 +50 +00 +70 +D8 +F8 +C0 +C0 +78 +ENDCHAR +STARTCHAR uni1EC4 +ENCODING 7876 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +20 +50 +00 +F8 +C0 +F8 +C0 +F8 +ENDCHAR +STARTCHAR uni1EC5 +ENCODING 7877 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +20 +50 +00 +70 +C8 +F8 +C0 +78 +ENDCHAR +STARTCHAR uni1EC6 +ENCODING 7878 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +20 +50 +F8 +C0 +C0 +F8 +C0 +C0 +C0 +F8 +00 +20 +ENDCHAR +STARTCHAR uni1EC7 +ENCODING 7879 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +20 +50 +00 +70 +D8 +F8 +C0 +C0 +78 +00 +20 +ENDCHAR +STARTCHAR uni1EC8 +ENCODING 7880 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +C0 +20 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni1EC9 +ENCODING 7881 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 -2 +BITMAP +C0 +20 +60 +60 +60 +60 +60 +60 +00 +40 +ENDCHAR +STARTCHAR uni1ECA +ENCODING 7882 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 10 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +00 +80 +ENDCHAR +STARTCHAR uni1ECB +ENCODING 7883 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 11 2 -2 +BITMAP +C0 +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +00 +80 +ENDCHAR +STARTCHAR Odotbelow +ENCODING 7884 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +D8 +D8 +D8 +D8 +D8 +D8 +70 +00 +20 +ENDCHAR +STARTCHAR odotbelow +ENCODING 7885 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +70 +D8 +D8 +D8 +D8 +70 +00 +20 +ENDCHAR +STARTCHAR uni1ECE +ENCODING 7886 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +20 +70 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1ECF +ENCODING 7887 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +20 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1ED0 +ENCODING 7888 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +90 +28 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1ED1 +ENCODING 7889 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +90 +28 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1ED2 +ENCODING 7890 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +48 +A0 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1ED3 +ENCODING 7891 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +48 +A0 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1ED4 +ENCODING 7892 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +20 +50 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1ED5 +ENCODING 7893 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +20 +50 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1ED6 +ENCODING 7894 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +20 +50 +00 +70 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1ED7 +ENCODING 7895 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +20 +50 +00 +70 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1ED8 +ENCODING 7896 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +20 +50 +70 +D8 +D8 +D8 +D8 +D8 +D8 +70 +00 +20 +ENDCHAR +STARTCHAR uni1ED9 +ENCODING 7897 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +20 +50 +00 +70 +D8 +D8 +D8 +D8 +70 +00 +20 +ENDCHAR +STARTCHAR uni1EDA +ENCODING 7898 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +10 +24 +74 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1EDB +ENCODING 7899 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +20 +04 +74 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1EDC +ENCODING 7900 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +24 +74 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1EDD +ENCODING 7901 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +40 +20 +04 +74 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1EDE +ENCODING 7902 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +C0 +24 +74 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1EDF +ENCODING 7903 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +C0 +20 +04 +74 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1EE0 +ENCODING 7904 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +68 +B0 +04 +74 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1EE1 +ENCODING 7905 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +48 +A8 +90 +04 +74 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1EE2 +ENCODING 7906 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +04 +74 +D8 +D8 +D8 +D8 +D8 +D8 +70 +00 +20 +ENDCHAR +STARTCHAR uni1EE3 +ENCODING 7907 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +04 +74 +D8 +D8 +D8 +D8 +70 +00 +20 +ENDCHAR +STARTCHAR uni1EE4 +ENCODING 7908 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +D8 +D8 +D8 +D8 +D8 +D8 +D8 +70 +00 +20 +ENDCHAR +STARTCHAR uni1EE5 +ENCODING 7909 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +D8 +D8 +D8 +78 +00 +20 +ENDCHAR +STARTCHAR uni1EE6 +ENCODING 7910 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +20 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1EE7 +ENCODING 7911 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +20 +D8 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni1EE8 +ENCODING 7912 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +14 +24 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1EE9 +ENCODING 7913 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +24 +04 +D8 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni1EEA +ENCODING 7914 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +44 +24 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1EEB +ENCODING 7915 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +40 +24 +04 +D8 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni1EEC +ENCODING 7916 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +C4 +24 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1EED +ENCODING 7917 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +C0 +24 +04 +D8 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni1EEE +ENCODING 7918 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +68 +B4 +04 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1EEF +ENCODING 7919 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +48 +A8 +94 +04 +D8 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni1EF0 +ENCODING 7920 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +04 +04 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +70 +00 +20 +ENDCHAR +STARTCHAR uni1EF1 +ENCODING 7921 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +04 +04 +D8 +D8 +D8 +D8 +D8 +78 +00 +20 +ENDCHAR +STARTCHAR Ygrave +ENCODING 7922 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +20 +CC +CC +78 +78 +30 +30 +30 +30 +ENDCHAR +STARTCHAR ygrave +ENCODING 7923 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +40 +20 +D8 +D8 +D8 +D8 +D8 +78 +18 +70 +ENDCHAR +STARTCHAR uni1EF4 +ENCODING 7924 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +CC +CC +78 +78 +30 +30 +30 +30 +00 +20 +ENDCHAR +STARTCHAR uni1EF5 +ENCODING 7925 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +D8 +D8 +D8 +70 +30 +E8 +ENDCHAR +STARTCHAR uni1EF6 +ENCODING 7926 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +C0 +20 +CC +CC +78 +78 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni1EF7 +ENCODING 7927 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +20 +00 +D8 +D8 +D8 +D8 +D8 +78 +18 +70 +ENDCHAR +STARTCHAR Ytilde +ENCODING 7928 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +68 +B0 +00 +CC +CC +78 +78 +30 +30 +30 +ENDCHAR +STARTCHAR ytilde +ENCODING 7929 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +48 +A8 +90 +00 +D8 +D8 +D8 +D8 +D8 +78 +18 +70 +ENDCHAR +STARTCHAR uni1EFA +ENCODING 7930 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +D8 +D8 +D8 +D8 +D8 +D8 +D8 +FC +ENDCHAR +STARTCHAR uni1EFB +ENCODING 7931 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +D8 +D8 +D8 +D8 +D8 +D8 +D8 +6C +ENDCHAR +STARTCHAR uni1EFC +ENCODING 7932 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +38 +60 +C0 +C0 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1EFD +ENCODING 7933 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +38 +60 +C0 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1EFE +ENCODING 7934 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +CC +CC +78 +78 +30 +30 +70 +B0 +60 +ENDCHAR +STARTCHAR uni1EFF +ENCODING 7935 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +D8 +78 +18 +58 +B8 +70 +ENDCHAR +STARTCHAR uni1F00 +ENCODING 7936 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +10 +20 +00 +68 +D8 +D8 +D8 +D8 +68 +ENDCHAR +STARTCHAR uni1F01 +ENCODING 7937 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +40 +20 +00 +68 +D8 +D8 +D8 +D8 +68 +ENDCHAR +STARTCHAR uni1F02 +ENCODING 7938 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +50 +88 +00 +68 +D8 +D8 +D8 +D8 +68 +ENDCHAR +STARTCHAR uni1F03 +ENCODING 7939 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +90 +48 +00 +68 +D8 +D8 +D8 +D8 +68 +ENDCHAR +STARTCHAR uni1F04 +ENCODING 7940 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +48 +90 +00 +68 +D8 +D8 +D8 +D8 +68 +ENDCHAR +STARTCHAR uni1F05 +ENCODING 7941 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +88 +50 +00 +68 +D8 +D8 +D8 +D8 +68 +ENDCHAR +STARTCHAR uni1F06 +ENCODING 7942 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +A8 +20 +40 +00 +68 +D8 +D8 +D8 +68 +ENDCHAR +STARTCHAR uni1F07 +ENCODING 7943 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +A8 +20 +10 +00 +68 +D8 +D8 +D8 +68 +ENDCHAR +STARTCHAR uni1F08 +ENCODING 7944 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +40 +80 +70 +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni1F09 +ENCODING 7945 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +40 +20 +70 +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni1F0A +ENCODING 7946 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +48 +80 +70 +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni1F0B +ENCODING 7947 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +48 +20 +70 +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni1F0C +ENCODING 7948 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +50 +80 +70 +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni1F0D +ENCODING 7949 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +50 +20 +70 +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni1F0E +ENCODING 7950 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +A8 +20 +40 +70 +D8 +D8 +F8 +D8 +D8 +ENDCHAR +STARTCHAR uni1F0F +ENCODING 7951 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +A8 +20 +10 +70 +D8 +D8 +F8 +D8 +D8 +ENDCHAR +STARTCHAR uni1F10 +ENCODING 7952 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +10 +20 +00 +78 +C0 +70 +C0 +C0 +78 +ENDCHAR +STARTCHAR uni1F11 +ENCODING 7953 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +40 +20 +00 +78 +C0 +70 +C0 +C0 +78 +ENDCHAR +STARTCHAR uni1F12 +ENCODING 7954 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +50 +88 +00 +78 +C0 +70 +C0 +C0 +78 +ENDCHAR +STARTCHAR uni1F13 +ENCODING 7955 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +90 +48 +00 +78 +C0 +70 +C0 +C0 +78 +ENDCHAR +STARTCHAR uni1F14 +ENCODING 7956 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +48 +90 +00 +78 +C0 +70 +C0 +C0 +78 +ENDCHAR +STARTCHAR uni1F15 +ENCODING 7957 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +88 +50 +00 +78 +C0 +70 +C0 +C0 +78 +ENDCHAR +STARTCHAR uni1F18 +ENCODING 7960 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +10 +20 +F8 +C0 +C0 +F8 +C0 +C0 +F8 +ENDCHAR +STARTCHAR uni1F19 +ENCODING 7961 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +40 +20 +F8 +C0 +C0 +F8 +C0 +C0 +F8 +ENDCHAR +STARTCHAR uni1F1A +ENCODING 7962 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +48 +80 +00 +F8 +C0 +F8 +C0 +C0 +F8 +ENDCHAR +STARTCHAR uni1F1B +ENCODING 7963 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +88 +40 +00 +F8 +C0 +F8 +C0 +C0 +F8 +ENDCHAR +STARTCHAR uni1F1C +ENCODING 7964 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +50 +80 +00 +F8 +C0 +F8 +C0 +C0 +F8 +ENDCHAR +STARTCHAR uni1F1D +ENCODING 7965 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +90 +40 +00 +F8 +C0 +F8 +C0 +C0 +F8 +ENDCHAR +STARTCHAR uni1F20 +ENCODING 7968 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +10 +20 +00 +F0 +D8 +D8 +D8 +D8 +D8 +18 +18 +ENDCHAR +STARTCHAR uni1F21 +ENCODING 7969 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +40 +40 +20 +00 +F0 +D8 +D8 +D8 +D8 +D8 +18 +18 +ENDCHAR +STARTCHAR uni1F22 +ENCODING 7970 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +40 +50 +88 +00 +F0 +D8 +D8 +D8 +D8 +D8 +18 +18 +ENDCHAR +STARTCHAR uni1F23 +ENCODING 7971 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +80 +90 +48 +00 +F0 +D8 +D8 +D8 +D8 +D8 +18 +18 +ENDCHAR +STARTCHAR uni1F24 +ENCODING 7972 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +40 +48 +90 +00 +F0 +D8 +D8 +D8 +D8 +D8 +18 +18 +ENDCHAR +STARTCHAR uni1F25 +ENCODING 7973 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +80 +88 +50 +00 +F0 +D8 +D8 +D8 +D8 +D8 +18 +18 +ENDCHAR +STARTCHAR uni1F26 +ENCODING 7974 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +70 +A8 +20 +40 +00 +F0 +D8 +D8 +D8 +D8 +18 +18 +ENDCHAR +STARTCHAR uni1F27 +ENCODING 7975 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +70 +A8 +20 +10 +00 +F0 +D8 +D8 +D8 +D8 +18 +18 +ENDCHAR +STARTCHAR uni1F28 +ENCODING 7976 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +10 +20 +D8 +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni1F29 +ENCODING 7977 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +40 +20 +D8 +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni1F2A +ENCODING 7978 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +48 +80 +00 +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni1F2B +ENCODING 7979 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +88 +40 +00 +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni1F2C +ENCODING 7980 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +50 +80 +00 +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni1F2D +ENCODING 7981 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +90 +40 +00 +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni1F2E +ENCODING 7982 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +A8 +20 +40 +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni1F2F +ENCODING 7983 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +A8 +20 +10 +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni1F30 +ENCODING 7984 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +20 +20 +40 +00 +C0 +C0 +C0 +C0 +C0 +70 +ENDCHAR +STARTCHAR uni1F31 +ENCODING 7985 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +80 +80 +40 +00 +C0 +C0 +C0 +C0 +C0 +70 +ENDCHAR +STARTCHAR uni1F32 +ENCODING 7986 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +50 +88 +00 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR uni1F33 +ENCODING 7987 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +90 +48 +00 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR uni1F34 +ENCODING 7988 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +48 +90 +00 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR uni1F35 +ENCODING 7989 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +88 +50 +00 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR uni1F36 +ENCODING 7990 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +A8 +20 +40 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR uni1F37 +ENCODING 7991 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +A8 +20 +10 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR uni1F38 +ENCODING 7992 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 0 0 +BITMAP +40 +40 +80 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni1F39 +ENCODING 7993 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 0 0 +BITMAP +80 +80 +40 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni1F3A +ENCODING 7994 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +48 +80 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni1F3B +ENCODING 7995 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +88 +40 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni1F3C +ENCODING 7996 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +50 +80 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni1F3D +ENCODING 7997 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +90 +40 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni1F3E +ENCODING 7998 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +A8 +20 +40 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni1F3F +ENCODING 7999 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +A8 +20 +10 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni1F40 +ENCODING 8000 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +10 +20 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1F41 +ENCODING 8001 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +40 +20 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1F42 +ENCODING 8002 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +50 +88 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1F43 +ENCODING 8003 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +90 +48 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1F44 +ENCODING 8004 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +48 +90 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1F45 +ENCODING 8005 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +88 +50 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1F48 +ENCODING 8008 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +40 +80 +70 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1F49 +ENCODING 8009 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +40 +20 +70 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1F4A +ENCODING 8010 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +48 +80 +70 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1F4B +ENCODING 8011 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +48 +20 +70 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1F4C +ENCODING 8012 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +50 +80 +70 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1F4D +ENCODING 8013 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +44 +48 +20 +70 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1F50 +ENCODING 8016 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +10 +20 +00 +D8 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni1F51 +ENCODING 8017 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +40 +20 +00 +D8 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni1F52 +ENCODING 8018 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +50 +88 +00 +D8 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni1F53 +ENCODING 8019 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +90 +48 +00 +D8 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni1F54 +ENCODING 8020 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +48 +90 +00 +D8 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni1F55 +ENCODING 8021 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +88 +50 +00 +D8 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni1F56 +ENCODING 8022 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +A8 +20 +40 +00 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni1F57 +ENCODING 8023 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +A8 +20 +10 +00 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni1F59 +ENCODING 8025 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +40 +20 +CC +CC +78 +78 +30 +30 +30 +ENDCHAR +STARTCHAR uni1F5B +ENCODING 8027 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +50 +48 +20 +CC +CC +78 +78 +30 +30 +30 +ENDCHAR +STARTCHAR uni1F5D +ENCODING 8029 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +88 +90 +40 +00 +CC +CC +78 +30 +30 +30 +ENDCHAR +STARTCHAR uni1F5F +ENCODING 8031 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +70 +A8 +20 +10 +CC +CC +78 +30 +30 +30 +ENDCHAR +STARTCHAR uni1F60 +ENCODING 8032 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +10 +20 +00 +D8 +D8 +F8 +F8 +F8 +50 +ENDCHAR +STARTCHAR uni1F61 +ENCODING 8033 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +40 +20 +00 +D8 +D8 +F8 +F8 +F8 +50 +ENDCHAR +STARTCHAR uni1F62 +ENCODING 8034 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +50 +88 +00 +D8 +D8 +F8 +F8 +F8 +50 +ENDCHAR +STARTCHAR uni1F63 +ENCODING 8035 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +90 +48 +00 +D8 +D8 +F8 +F8 +F8 +50 +ENDCHAR +STARTCHAR uni1F64 +ENCODING 8036 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +48 +90 +00 +D8 +D8 +F8 +F8 +F8 +50 +ENDCHAR +STARTCHAR uni1F65 +ENCODING 8037 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +88 +50 +00 +D8 +D8 +F8 +F8 +F8 +50 +ENDCHAR +STARTCHAR uni1F66 +ENCODING 8038 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +A8 +20 +40 +00 +D8 +D8 +F8 +F8 +50 +ENDCHAR +STARTCHAR uni1F67 +ENCODING 8039 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +A8 +20 +10 +00 +D8 +D8 +F8 +F8 +50 +ENDCHAR +STARTCHAR uni1F68 +ENCODING 8040 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +40 +80 +70 +D8 +D8 +D8 +D8 +50 +D8 +ENDCHAR +STARTCHAR uni1F69 +ENCODING 8041 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +40 +20 +70 +D8 +D8 +D8 +D8 +50 +D8 +ENDCHAR +STARTCHAR uni1F6A +ENCODING 8042 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +48 +80 +70 +D8 +D8 +D8 +D8 +50 +D8 +ENDCHAR +STARTCHAR uni1F6B +ENCODING 8043 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +48 +20 +70 +D8 +D8 +D8 +D8 +50 +D8 +ENDCHAR +STARTCHAR uni1F6C +ENCODING 8044 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +50 +80 +70 +D8 +D8 +D8 +D8 +50 +D8 +ENDCHAR +STARTCHAR uni1F6D +ENCODING 8045 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +50 +20 +70 +D8 +D8 +D8 +D8 +50 +D8 +ENDCHAR +STARTCHAR uni1F6E +ENCODING 8046 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +A8 +20 +40 +70 +D8 +D8 +D8 +50 +D8 +ENDCHAR +STARTCHAR uni1F6F +ENCODING 8047 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +A8 +20 +10 +70 +D8 +D8 +D8 +50 +D8 +ENDCHAR +STARTCHAR uni1F70 +ENCODING 8048 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +00 +68 +D8 +D8 +D8 +D8 +68 +ENDCHAR +STARTCHAR uni1F71 +ENCODING 8049 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +68 +D8 +D8 +D8 +D8 +68 +ENDCHAR +STARTCHAR uni1F72 +ENCODING 8050 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +00 +78 +C0 +70 +C0 +C0 +78 +ENDCHAR +STARTCHAR uni1F73 +ENCODING 8051 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +78 +C0 +70 +C0 +C0 +78 +ENDCHAR +STARTCHAR uni1F74 +ENCODING 8052 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +40 +20 +00 +F0 +D8 +D8 +D8 +D8 +D8 +18 +18 +ENDCHAR +STARTCHAR uni1F75 +ENCODING 8053 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +20 +00 +F0 +D8 +D8 +D8 +D8 +D8 +18 +18 +ENDCHAR +STARTCHAR uni1F76 +ENCODING 8054 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +80 +40 +00 +C0 +C0 +C0 +C0 +C0 +70 +ENDCHAR +STARTCHAR uni1F77 +ENCODING 8055 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +20 +40 +00 +C0 +C0 +C0 +C0 +C0 +70 +ENDCHAR +STARTCHAR uni1F78 +ENCODING 8056 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1F79 +ENCODING 8057 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1F7A +ENCODING 8058 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +00 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1F7B +ENCODING 8059 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1F7C +ENCODING 8060 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +00 +D8 +D8 +F8 +F8 +F8 +50 +ENDCHAR +STARTCHAR uni1F7D +ENCODING 8061 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +D8 +D8 +F8 +F8 +F8 +50 +ENDCHAR +STARTCHAR uni1F80 +ENCODING 8064 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +10 +20 +00 +68 +D8 +D8 +D8 +D8 +68 +80 +40 +ENDCHAR +STARTCHAR uni1F81 +ENCODING 8065 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +40 +40 +20 +00 +68 +D8 +D8 +D8 +D8 +68 +80 +40 +ENDCHAR +STARTCHAR uni1F82 +ENCODING 8066 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +40 +50 +88 +00 +68 +D8 +D8 +D8 +D8 +68 +80 +40 +ENDCHAR +STARTCHAR uni1F83 +ENCODING 8067 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +80 +90 +48 +00 +68 +D8 +D8 +D8 +D8 +68 +80 +40 +ENDCHAR +STARTCHAR uni1F84 +ENCODING 8068 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +40 +48 +90 +00 +68 +D8 +D8 +D8 +D8 +68 +80 +40 +ENDCHAR +STARTCHAR uni1F85 +ENCODING 8069 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +80 +88 +50 +00 +68 +D8 +D8 +D8 +D8 +68 +80 +40 +ENDCHAR +STARTCHAR uni1F86 +ENCODING 8070 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +70 +A8 +20 +40 +00 +68 +D8 +D8 +D8 +68 +80 +40 +ENDCHAR +STARTCHAR uni1F87 +ENCODING 8071 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +70 +A8 +20 +10 +00 +68 +D8 +D8 +D8 +68 +80 +40 +ENDCHAR +STARTCHAR uni1F88 +ENCODING 8072 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +40 +80 +60 +D4 +D4 +F4 +D4 +D4 +D4 +ENDCHAR +STARTCHAR uni1F89 +ENCODING 8073 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +20 +20 +10 +60 +D4 +D4 +F4 +D4 +D4 +D4 +ENDCHAR +STARTCHAR uni1F8A +ENCODING 8074 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +50 +48 +80 +60 +D4 +D4 +F4 +D4 +D4 +D4 +ENDCHAR +STARTCHAR uni1F8B +ENCODING 8075 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +50 +48 +20 +60 +D4 +D4 +F4 +D4 +D4 +D4 +ENDCHAR +STARTCHAR uni1F8C +ENCODING 8076 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +48 +50 +80 +60 +D4 +D4 +F4 +D4 +D4 +D4 +ENDCHAR +STARTCHAR uni1F8D +ENCODING 8077 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +44 +48 +20 +00 +60 +D4 +F4 +D4 +D4 +D4 +ENDCHAR +STARTCHAR uni1F8E +ENCODING 8078 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +70 +A8 +20 +40 +00 +64 +D4 +F4 +D4 +D4 +ENDCHAR +STARTCHAR uni1F8F +ENCODING 8079 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +70 +A8 +20 +10 +60 +D4 +D4 +F4 +D4 +D4 +ENDCHAR +STARTCHAR uni1F90 +ENCODING 8080 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +10 +20 +00 +F0 +D8 +D8 +D8 +D8 +18 +98 +58 +ENDCHAR +STARTCHAR uni1F91 +ENCODING 8081 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +40 +40 +20 +00 +F0 +D8 +D8 +D8 +D8 +18 +98 +58 +ENDCHAR +STARTCHAR uni1F92 +ENCODING 8082 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +40 +50 +88 +00 +F0 +D8 +D8 +D8 +D8 +18 +98 +58 +ENDCHAR +STARTCHAR uni1F93 +ENCODING 8083 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +80 +90 +48 +00 +F0 +D8 +D8 +D8 +D8 +18 +98 +58 +ENDCHAR +STARTCHAR uni1F94 +ENCODING 8084 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +40 +48 +90 +00 +F0 +D8 +D8 +D8 +D8 +18 +98 +58 +ENDCHAR +STARTCHAR uni1F95 +ENCODING 8085 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +80 +88 +50 +00 +F0 +D8 +D8 +D8 +D8 +18 +98 +58 +ENDCHAR +STARTCHAR uni1F96 +ENCODING 8086 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +70 +A8 +20 +40 +00 +F0 +D8 +D8 +D8 +18 +98 +58 +ENDCHAR +STARTCHAR uni1F97 +ENCODING 8087 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +70 +A8 +20 +10 +00 +F0 +D8 +D8 +D8 +18 +98 +58 +ENDCHAR +STARTCHAR uni1F98 +ENCODING 8088 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +40 +80 +00 +D0 +D4 +F4 +D4 +D4 +D4 +ENDCHAR +STARTCHAR uni1F99 +ENCODING 8089 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +80 +80 +40 +00 +D0 +D4 +F4 +D4 +D4 +D4 +ENDCHAR +STARTCHAR uni1F9A +ENCODING 8090 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +50 +48 +80 +00 +D0 +D4 +F4 +D4 +D4 +D4 +ENDCHAR +STARTCHAR uni1F9B +ENCODING 8091 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +90 +88 +40 +00 +D0 +D4 +F4 +D4 +D4 +D4 +ENDCHAR +STARTCHAR uni1F9C +ENCODING 8092 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +48 +50 +80 +00 +D0 +D4 +F4 +D4 +D4 +D4 +ENDCHAR +STARTCHAR uni1F9D +ENCODING 8093 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +88 +90 +40 +00 +D0 +D4 +F4 +D4 +D4 +D4 +ENDCHAR +STARTCHAR uni1F9E +ENCODING 8094 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +70 +A8 +20 +40 +00 +D0 +D4 +F4 +D4 +D4 +ENDCHAR +STARTCHAR uni1F9F +ENCODING 8095 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +70 +A8 +20 +10 +00 +D0 +D4 +F4 +D4 +D4 +ENDCHAR +STARTCHAR uni1FA0 +ENCODING 8096 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +10 +20 +00 +D8 +D8 +F8 +F8 +F8 +50 +80 +40 +ENDCHAR +STARTCHAR uni1FA1 +ENCODING 8097 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +40 +40 +20 +00 +D8 +D8 +F8 +F8 +F8 +50 +80 +40 +ENDCHAR +STARTCHAR uni1FA2 +ENCODING 8098 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +40 +50 +88 +00 +D8 +D8 +F8 +F8 +F8 +50 +80 +40 +ENDCHAR +STARTCHAR uni1FA3 +ENCODING 8099 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +80 +90 +48 +00 +D8 +D8 +F8 +F8 +F8 +50 +80 +40 +ENDCHAR +STARTCHAR uni1FA4 +ENCODING 8100 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +40 +48 +90 +00 +D8 +D8 +F8 +F8 +F8 +50 +80 +40 +ENDCHAR +STARTCHAR uni1FA5 +ENCODING 8101 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +80 +88 +50 +00 +D8 +D8 +F8 +F8 +F8 +50 +80 +40 +ENDCHAR +STARTCHAR uni1FA6 +ENCODING 8102 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +70 +A8 +20 +40 +00 +D8 +D8 +F8 +F8 +50 +80 +40 +ENDCHAR +STARTCHAR uni1FA7 +ENCODING 8103 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +70 +A8 +20 +10 +00 +D8 +D8 +F8 +F8 +50 +80 +40 +ENDCHAR +STARTCHAR uni1FA8 +ENCODING 8104 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +40 +80 +60 +D4 +D4 +D4 +D4 +64 +F4 +ENDCHAR +STARTCHAR uni1FA9 +ENCODING 8105 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +80 +80 +40 +00 +60 +D4 +D4 +D4 +64 +F4 +ENDCHAR +STARTCHAR uni1FAA +ENCODING 8106 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +50 +48 +80 +60 +D4 +D4 +D4 +D4 +64 +F4 +ENDCHAR +STARTCHAR uni1FAB +ENCODING 8107 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +90 +88 +40 +00 +60 +D4 +D4 +D4 +64 +F4 +ENDCHAR +STARTCHAR uni1FAC +ENCODING 8108 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +48 +50 +80 +60 +D4 +D4 +D4 +D4 +64 +F4 +ENDCHAR +STARTCHAR uni1FAD +ENCODING 8109 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +88 +90 +40 +00 +60 +D4 +D4 +D4 +64 +F4 +ENDCHAR +STARTCHAR uni1FAE +ENCODING 8110 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +70 +A8 +20 +40 +00 +64 +D4 +D4 +64 +F4 +ENDCHAR +STARTCHAR uni1FAF +ENCODING 8111 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +70 +A8 +20 +10 +60 +D4 +D4 +D4 +64 +F4 +ENDCHAR +STARTCHAR uni1FB0 +ENCODING 8112 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +70 +00 +68 +D8 +D8 +D8 +D8 +68 +ENDCHAR +STARTCHAR uni1FB1 +ENCODING 8113 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +00 +68 +D8 +D8 +D8 +D8 +68 +ENDCHAR +STARTCHAR uni1FB2 +ENCODING 8114 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +40 +20 +00 +68 +D8 +D8 +D8 +D8 +68 +80 +40 +ENDCHAR +STARTCHAR uni1FB3 +ENCODING 8115 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +68 +D8 +D8 +D8 +D8 +68 +80 +40 +ENDCHAR +STARTCHAR uni1FB4 +ENCODING 8116 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +20 +00 +68 +D8 +D8 +D8 +D8 +68 +80 +40 +ENDCHAR +STARTCHAR uni1FB6 +ENCODING 8118 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +00 +68 +D8 +D8 +D8 +D8 +68 +ENDCHAR +STARTCHAR uni1FB7 +ENCODING 8119 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +88 +70 +00 +68 +D8 +D8 +D8 +D8 +68 +80 +40 +ENDCHAR +STARTCHAR uni1FB8 +ENCODING 8120 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni1FB9 +ENCODING 8121 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +70 +D8 +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni1FBA +ENCODING 8122 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +70 +D8 +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni1FBB +ENCODING 8123 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +70 +D8 +D8 +D8 +F8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni1FBC +ENCODING 8124 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +60 +D0 +D4 +D4 +F4 +D4 +D4 +D4 +ENDCHAR +STARTCHAR uni1FBD +ENCODING 8125 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 2 3 1 7 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR uni1FBE +ENCODING 8126 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni1FBF +ENCODING 8127 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 2 3 1 7 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR uni1FC0 +ENCODING 8128 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni1FC1 +ENCODING 8129 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 4 0 6 +BITMAP +70 +88 +00 +50 +ENDCHAR +STARTCHAR uni1FC2 +ENCODING 8130 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +40 +20 +00 +F0 +D8 +D8 +D8 +D8 +18 +98 +58 +ENDCHAR +STARTCHAR uni1FC3 +ENCODING 8131 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F0 +D8 +D8 +D8 +D8 +18 +98 +58 +ENDCHAR +STARTCHAR uni1FC4 +ENCODING 8132 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +20 +00 +F0 +D8 +D8 +D8 +D8 +18 +98 +58 +ENDCHAR +STARTCHAR uni1FC6 +ENCODING 8134 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +70 +88 +00 +F0 +D8 +D8 +D8 +D8 +18 +18 +18 +ENDCHAR +STARTCHAR uni1FC7 +ENCODING 8135 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +70 +88 +00 +F0 +D8 +D8 +D8 +D8 +18 +98 +58 +ENDCHAR +STARTCHAR uni1FC8 +ENCODING 8136 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +F8 +C0 +C0 +F8 +C0 +C0 +C0 +F8 +ENDCHAR +STARTCHAR uni1FC9 +ENCODING 8137 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +F8 +C0 +C0 +F8 +C0 +C0 +C0 +F8 +ENDCHAR +STARTCHAR uni1FCA +ENCODING 8138 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +D8 +D8 +D8 +F8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni1FCB +ENCODING 8139 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +D8 +D8 +D8 +F8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni1FCC +ENCODING 8140 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +D0 +D0 +D4 +F4 +D4 +D4 +D4 +D4 +ENDCHAR +STARTCHAR uni1FCD +ENCODING 8141 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +40 +50 +88 +ENDCHAR +STARTCHAR uni1FCE +ENCODING 8142 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +40 +48 +90 +ENDCHAR +STARTCHAR uni1FCF +ENCODING 8143 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 4 0 6 +BITMAP +70 +A8 +20 +40 +ENDCHAR +STARTCHAR uni1FD0 +ENCODING 8144 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +70 +00 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR uni1FD1 +ENCODING 8145 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +E0 +00 +C0 +C0 +C0 +C0 +C0 +70 +ENDCHAR +STARTCHAR uni1FD2 +ENCODING 8146 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +80 +40 +00 +A0 +00 +C0 +C0 +C0 +C0 +70 +ENDCHAR +STARTCHAR uni1FD3 +ENCODING 8147 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +20 +40 +00 +A0 +00 +C0 +C0 +C0 +C0 +70 +ENDCHAR +STARTCHAR uni1FD6 +ENCODING 8150 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +00 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR uni1FD7 +ENCODING 8151 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +00 +50 +00 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR uni1FD8 +ENCODING 8152 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni1FD9 +ENCODING 8153 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +E0 +00 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni1FDA +ENCODING 8154 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 0 0 +BITMAP +80 +40 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni1FDB +ENCODING 8155 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +40 +80 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni1FDD +ENCODING 8157 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +80 +90 +48 +ENDCHAR +STARTCHAR uni1FDE +ENCODING 8158 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +80 +88 +50 +ENDCHAR +STARTCHAR uni1FDF +ENCODING 8159 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 4 0 6 +BITMAP +70 +A8 +20 +10 +ENDCHAR +STARTCHAR uni1FE0 +ENCODING 8160 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +70 +00 +D8 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni1FE1 +ENCODING 8161 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +00 +D8 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni1FE2 +ENCODING 8162 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +50 +00 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni1FE3 +ENCODING 8163 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +50 +00 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni1FE4 +ENCODING 8164 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +20 +20 +40 +00 +70 +D8 +D8 +D8 +D8 +F0 +C0 +C0 +ENDCHAR +STARTCHAR uni1FE5 +ENCODING 8165 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +20 +20 +10 +00 +70 +D8 +D8 +D8 +D8 +F0 +C0 +C0 +ENDCHAR +STARTCHAR uni1FE6 +ENCODING 8166 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +00 +D8 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni1FE7 +ENCODING 8167 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +00 +50 +00 +D8 +D8 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni1FE8 +ENCODING 8168 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +88 +70 +00 +CC +CC +78 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni1FE9 +ENCODING 8169 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +70 +00 +CC +CC +78 +78 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni1FEA +ENCODING 8170 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +20 +CC +CC +78 +78 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni1FEB +ENCODING 8171 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +10 +20 +CC +CC +78 +78 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni1FEC +ENCODING 8172 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +80 +40 +F0 +D8 +D8 +F0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni1FED +ENCODING 8173 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +80 +40 +00 +A0 +ENDCHAR +STARTCHAR uni1FEE +ENCODING 8174 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +20 +40 +00 +A0 +ENDCHAR +STARTCHAR uni1FEF +ENCODING 8175 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 2 1 8 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni1FF2 +ENCODING 8178 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +40 +20 +00 +D8 +D8 +F8 +F8 +F8 +50 +80 +40 +ENDCHAR +STARTCHAR uni1FF3 +ENCODING 8179 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D8 +D8 +F8 +F8 +F8 +50 +80 +40 +ENDCHAR +STARTCHAR uni1FF4 +ENCODING 8180 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +20 +00 +D8 +D8 +F8 +F8 +F8 +50 +80 +40 +ENDCHAR +STARTCHAR uni1FF6 +ENCODING 8182 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +00 +D8 +D8 +F8 +F8 +F8 +50 +ENDCHAR +STARTCHAR uni1FF7 +ENCODING 8183 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +70 +88 +00 +D8 +D8 +F8 +F8 +F8 +50 +80 +40 +ENDCHAR +STARTCHAR uni1FF8 +ENCODING 8184 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +70 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1FF9 +ENCODING 8185 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +70 +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni1FFA +ENCODING 8186 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +70 +D8 +D8 +D8 +D8 +D8 +50 +D8 +ENDCHAR +STARTCHAR uni1FFB +ENCODING 8187 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +70 +D8 +D8 +D8 +D8 +D8 +50 +D8 +ENDCHAR +STARTCHAR uni1FFC +ENCODING 8188 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +60 +D0 +D4 +D4 +D4 +D4 +64 +F4 +ENDCHAR +STARTCHAR uni1FFD +ENCODING 8189 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 2 2 8 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni1FFE +ENCODING 8190 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 3 2 7 +BITMAP +80 +80 +40 +ENDCHAR +STARTCHAR hyphentwo +ENCODING 8208 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 1 1 3 +BITMAP +F0 +ENDCHAR +STARTCHAR uni2011 +ENCODING 8209 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 1 1 3 +BITMAP +F0 +ENDCHAR +STARTCHAR figuredash +ENCODING 8210 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR endash +ENCODING 8211 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR emdash +ENCODING 8212 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR afii00208 +ENCODING 8213 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR dblverticalbar +ENCODING 8214 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR underscoredbl +ENCODING 8215 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 -2 +BITMAP +F8 +00 +F8 +ENDCHAR +STARTCHAR quoteleft +ENCODING 8216 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 4 1 5 +BITMAP +80 +40 +C0 +C0 +ENDCHAR +STARTCHAR quoteright +ENCODING 8217 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 4 2 5 +BITMAP +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR quotesinglbase +ENCODING 8218 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 4 2 -2 +BITMAP +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR quotereversed +ENCODING 8219 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 4 2 5 +BITMAP +C0 +C0 +80 +40 +ENDCHAR +STARTCHAR quotedblleft +ENCODING 8220 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 4 0 5 +BITMAP +90 +48 +D8 +D8 +ENDCHAR +STARTCHAR quotedblright +ENCODING 8221 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 4 0 5 +BITMAP +D8 +D8 +48 +90 +ENDCHAR +STARTCHAR quotedblbase +ENCODING 8222 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 4 0 -2 +BITMAP +D8 +D8 +48 +90 +ENDCHAR +STARTCHAR uni201F +ENCODING 8223 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 4 0 5 +BITMAP +D8 +D8 +90 +48 +ENDCHAR +STARTCHAR dagger +ENCODING 8224 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +60 +F0 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR daggerdbl +ENCODING 8225 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +60 +F0 +60 +60 +60 +60 +F0 +60 +ENDCHAR +STARTCHAR bullet +ENCODING 8226 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 4 1 2 +BITMAP +60 +F0 +F0 +60 +ENDCHAR +STARTCHAR uni2023 +ENCODING 8227 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 4 1 2 +BITMAP +C0 +F0 +F0 +C0 +ENDCHAR +STARTCHAR onedotenleader +ENCODING 8228 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 2 2 0 +BITMAP +80 +80 +ENDCHAR +STARTCHAR twodotenleader +ENCODING 8229 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 2 1 0 +BITMAP +A0 +A0 +ENDCHAR +STARTCHAR ellipsis +ENCODING 8230 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 2 0 0 +BITMAP +A8 +A8 +ENDCHAR +STARTCHAR uni2027 +ENCODING 8231 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 2 2 2 +BITMAP +80 +80 +ENDCHAR +STARTCHAR perthousand +ENCODING 8240 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +E0 +40 +0C +30 +C0 +00 +28 +7C +28 +ENDCHAR +STARTCHAR uni2031 +ENCODING 8241 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +E0 +40 +0C +30 +C0 +00 +54 +FC +54 +ENDCHAR +STARTCHAR minute +ENCODING 8242 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 3 2 6 +BITMAP +C0 +C0 +C0 +ENDCHAR +STARTCHAR second +ENCODING 8243 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni2034 +ENCODING 8244 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2035 +ENCODING 8245 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 3 2 6 +BITMAP +80 +80 +40 +ENDCHAR +STARTCHAR uni2036 +ENCODING 8246 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 3 1 6 +BITMAP +A0 +A0 +50 +ENDCHAR +STARTCHAR uni2037 +ENCODING 8247 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 3 0 6 +BITMAP +A8 +A8 +54 +ENDCHAR +STARTCHAR uni2038 +ENCODING 8248 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 2 1 0 +BITMAP +40 +A0 +ENDCHAR +STARTCHAR guilsinglleft +ENCODING 8249 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +18 +30 +60 +C0 +60 +30 +18 +ENDCHAR +STARTCHAR guilsinglright +ENCODING 8250 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +60 +30 +18 +30 +60 +C0 +ENDCHAR +STARTCHAR exclamdbl +ENCODING 8252 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +D8 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni203D +ENCODING 8253 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +38 +38 +38 +30 +00 +30 +30 +ENDCHAR +STARTCHAR overline +ENCODING 8254 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 1 0 9 +BITMAP +F8 +ENDCHAR +STARTCHAR uni2043 +ENCODING 8259 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +20 +A8 +F8 +70 +F8 +A8 +20 +ENDCHAR +STARTCHAR uni2047 +ENCODING 8263 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +F8 +6C +6C +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2048 +ENCODING 8264 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +CC +6C +6C +CC +CC +00 +CC +CC +ENDCHAR +STARTCHAR uni2049 +ENCODING 8265 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +F8 +CC +CC +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni204B +ENCODING 8267 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +B8 +B8 +B8 +B0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni204E +ENCODING 8270 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +D8 +70 +F8 +70 +D8 +ENDCHAR +STARTCHAR uni204F +ENCODING 8271 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 7 2 -1 +BITMAP +C0 +C0 +00 +00 +C0 +C0 +60 +ENDCHAR +STARTCHAR uni2051 +ENCODING 8273 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +D8 +70 +F8 +70 +D8 +00 +D8 +70 +F8 +70 +D8 +ENDCHAR +STARTCHAR uni2070 +ENCODING 8304 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 5 +BITMAP +70 +D8 +F8 +D8 +70 +ENDCHAR +STARTCHAR uni2071 +ENCODING 8305 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 5 2 5 +BITMAP +C0 +00 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2074 +ENCODING 8308 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 5 +BITMAP +38 +78 +D8 +F8 +18 +ENDCHAR +STARTCHAR uni2075 +ENCODING 8309 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 5 +BITMAP +F8 +C0 +F0 +18 +F0 +ENDCHAR +STARTCHAR uni2076 +ENCODING 8310 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 5 +BITMAP +70 +C0 +F0 +D8 +70 +ENDCHAR +STARTCHAR uni2077 +ENCODING 8311 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 5 +BITMAP +F8 +18 +30 +60 +60 +ENDCHAR +STARTCHAR uni2078 +ENCODING 8312 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 5 +BITMAP +70 +D8 +70 +D8 +70 +ENDCHAR +STARTCHAR uni2079 +ENCODING 8313 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 5 +BITMAP +70 +D8 +78 +18 +70 +ENDCHAR +STARTCHAR uni207A +ENCODING 8314 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 3 1 6 +BITMAP +60 +F0 +60 +ENDCHAR +STARTCHAR uni207B +ENCODING 8315 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 1 1 7 +BITMAP +F0 +ENDCHAR +STARTCHAR uni207C +ENCODING 8316 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 3 1 6 +BITMAP +F0 +00 +F0 +ENDCHAR +STARTCHAR uni207D +ENCODING 8317 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +60 +C0 +C0 +C0 +60 +ENDCHAR +STARTCHAR uni207E +ENCODING 8318 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 5 1 5 +BITMAP +C0 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR nsuperior +ENCODING 8319 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 4 0 5 +BITMAP +F0 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni2080 +ENCODING 8320 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +70 +D8 +F8 +D8 +70 +ENDCHAR +STARTCHAR uni2081 +ENCODING 8321 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +60 +E0 +60 +60 +60 +ENDCHAR +STARTCHAR uni2082 +ENCODING 8322 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +70 +D8 +30 +60 +F8 +ENDCHAR +STARTCHAR uni2083 +ENCODING 8323 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +F0 +18 +70 +18 +F0 +ENDCHAR +STARTCHAR uni2084 +ENCODING 8324 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +38 +78 +D8 +F8 +18 +ENDCHAR +STARTCHAR uni2085 +ENCODING 8325 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +F8 +C0 +F0 +18 +F0 +ENDCHAR +STARTCHAR uni2086 +ENCODING 8326 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +70 +C0 +F0 +D8 +70 +ENDCHAR +STARTCHAR uni2087 +ENCODING 8327 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +F8 +18 +30 +60 +60 +ENDCHAR +STARTCHAR uni2088 +ENCODING 8328 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +70 +D8 +70 +D8 +70 +ENDCHAR +STARTCHAR uni2089 +ENCODING 8329 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +70 +D8 +78 +18 +70 +ENDCHAR +STARTCHAR uni208A +ENCODING 8330 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 3 0 -1 +BITMAP +60 +F0 +60 +ENDCHAR +STARTCHAR uni208B +ENCODING 8331 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 1 0 0 +BITMAP +F0 +ENDCHAR +STARTCHAR uni208C +ENCODING 8332 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 3 0 -1 +BITMAP +F0 +00 +F0 +ENDCHAR +STARTCHAR uni208D +ENCODING 8333 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +60 +C0 +C0 +C0 +60 +ENDCHAR +STARTCHAR uni208E +ENCODING 8334 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 5 1 -2 +BITMAP +C0 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR uni2090 +ENCODING 8336 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +70 +18 +78 +D8 +78 +ENDCHAR +STARTCHAR uni2091 +ENCODING 8337 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +70 +D8 +F8 +C0 +78 +ENDCHAR +STARTCHAR uni2092 +ENCODING 8338 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +70 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni2093 +ENCODING 8339 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +D8 +70 +20 +70 +D8 +ENDCHAR +STARTCHAR uni2094 +ENCODING 8340 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +F0 +18 +F8 +D8 +70 +ENDCHAR +STARTCHAR uni2095 +ENCODING 8341 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +C0 +C0 +F0 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni2096 +ENCODING 8342 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +C0 +D8 +F0 +E0 +F0 +D8 +ENDCHAR +STARTCHAR uni2097 +ENCODING 8343 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 6 1 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +60 +ENDCHAR +STARTCHAR uni2098 +ENCODING 8344 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +F0 +F8 +F8 +D8 +D8 +ENDCHAR +STARTCHAR uni2099 +ENCODING 8345 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +F0 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni209A +ENCODING 8346 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +F0 +D8 +D8 +F0 +C0 +C0 +ENDCHAR +STARTCHAR uni209B +ENCODING 8347 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +78 +C0 +70 +18 +F0 +ENDCHAR +STARTCHAR uni209C +ENCODING 8348 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +60 +F0 +60 +60 +60 +38 +ENDCHAR +STARTCHAR peseta +ENCODING 8359 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +E0 +D0 +F0 +F8 +DC +D8 +D8 +CC +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +60 +F0 +60 +F0 +60 +38 +ENDCHAR +STARTCHAR uni20AE +ENCODING 8366 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +FC +30 +3C +F0 +3C +F0 +30 +30 +ENDCHAR +STARTCHAR uni2102 +ENCODING 8450 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +38 +60 +E0 +E0 +E0 +E0 +60 +38 +ENDCHAR +STARTCHAR uni2103 +ENCODING 8451 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +A0 +40 +38 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR uni2109 +ENCODING 8457 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +A0 +40 +3C +30 +30 +38 +30 +30 +30 +ENDCHAR +STARTCHAR uni210D +ENCODING 8461 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +E8 +E8 +E8 +F8 +E8 +E8 +E8 +E8 +ENDCHAR +STARTCHAR uni210E +ENCODING 8462 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +C0 +F0 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni210F +ENCODING 8463 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +60 +F8 +60 +78 +6C +6C +6C +6C +ENDCHAR +STARTCHAR uni2115 +ENCODING 8469 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +E8 +F8 +F8 +F8 +E8 +E8 +E8 +ENDCHAR +STARTCHAR afii61352 +ENCODING 8470 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +94 +D4 +F0 +F4 +F0 +F0 +B0 +90 +ENDCHAR +STARTCHAR uni2119 +ENCODING 8473 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +E8 +E8 +E8 +F0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni211A +ENCODING 8474 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +E8 +E8 +E8 +E8 +E8 +E8 +70 +18 +ENDCHAR +STARTCHAR uni211D +ENCODING 8477 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +E8 +E8 +E8 +F0 +E8 +E8 +E8 +ENDCHAR +STARTCHAR trademark +ENCODING 8482 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 4 0 4 +BITMAP +F4 +FC +5C +54 +ENDCHAR +STARTCHAR uni2124 +ENCODING 8484 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +38 +38 +70 +70 +E0 +E0 +F8 +ENDCHAR +STARTCHAR Ohm +ENCODING 8486 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +D8 +D8 +D8 +D8 +D8 +50 +D8 +ENDCHAR +STARTCHAR uni2127 +ENCODING 8487 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +50 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni213E +ENCODING 8510 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni213F +ENCODING 8511 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +E8 +E8 +E8 +E8 +E8 +E8 +E8 +ENDCHAR +STARTCHAR uni2150 +ENCODING 8528 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +60 +E0 +60 +60 +64 +18 +60 +BC +0C +0C +18 +18 +ENDCHAR +STARTCHAR uni2151 +ENCODING 8529 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +60 +E0 +60 +60 +64 +18 +60 +98 +2C +1C +0C +38 +ENDCHAR +STARTCHAR onethird +ENCODING 8531 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +60 +E0 +60 +60 +64 +18 +60 +B8 +0C +18 +0C +38 +ENDCHAR +STARTCHAR twothirds +ENCODING 8532 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +E0 +30 +60 +C0 +F4 +18 +60 +B8 +0C +18 +0C +38 +ENDCHAR +STARTCHAR uni2155 +ENCODING 8533 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +60 +E0 +60 +60 +64 +18 +60 +BC +30 +38 +0C +38 +ENDCHAR +STARTCHAR uni2156 +ENCODING 8534 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +E0 +30 +60 +C0 +F4 +18 +60 +BC +30 +38 +0C +38 +ENDCHAR +STARTCHAR uni2157 +ENCODING 8535 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +E0 +30 +60 +30 +E4 +18 +60 +BC +30 +38 +0C +38 +ENDCHAR +STARTCHAR uni2158 +ENCODING 8536 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +70 +D0 +F0 +34 +18 +60 +BC +30 +38 +0C +38 +ENDCHAR +STARTCHAR uni2159 +ENCODING 8537 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +60 +E0 +60 +64 +68 +10 +20 +5C +B0 +38 +34 +18 +ENDCHAR +STARTCHAR uni215A +ENCODING 8538 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +F0 +C0 +E0 +34 +E8 +10 +20 +5C +B0 +38 +34 +18 +ENDCHAR +STARTCHAR oneeighth +ENCODING 8539 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +60 +E0 +60 +64 +68 +10 +20 +58 +B4 +18 +34 +18 +ENDCHAR +STARTCHAR threeeighths +ENCODING 8540 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +E0 +30 +60 +34 +E8 +10 +20 +58 +B4 +18 +34 +18 +ENDCHAR +STARTCHAR fiveeighths +ENCODING 8541 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +F0 +C0 +E0 +34 +E8 +10 +20 +58 +B4 +18 +34 +18 +ENDCHAR +STARTCHAR seveneighths +ENCODING 8542 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +F0 +30 +60 +64 +68 +10 +20 +58 +B4 +18 +34 +18 +ENDCHAR +STARTCHAR uni215F +ENCODING 8543 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 1 +BITMAP +60 +E0 +60 +64 +68 +10 +20 +40 +80 +ENDCHAR +STARTCHAR uni2189 +ENCODING 8585 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +60 +D0 +D0 +D0 +64 +18 +60 +B8 +0C +18 +0C +38 +ENDCHAR +STARTCHAR arrowleft +ENCODING 8592 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +60 +F8 +60 +20 +ENDCHAR +STARTCHAR arrowup +ENCODING 8593 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 2 +BITMAP +20 +70 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR arrowright +ENCODING 8594 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +30 +F8 +30 +20 +ENDCHAR +STARTCHAR arrowdown +ENCODING 8595 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +20 +F8 +70 +20 +ENDCHAR +STARTCHAR arrowboth +ENCODING 8596 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +50 +D8 +F8 +D8 +50 +ENDCHAR +STARTCHAR arrowupdn +ENCODING 8597 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +20 +70 +F8 +20 +20 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2196 +ENCODING 8598 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F0 +E0 +E0 +90 +08 +ENDCHAR +STARTCHAR uni2197 +ENCODING 8599 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +78 +38 +38 +48 +80 +ENDCHAR +STARTCHAR uni2198 +ENCODING 8600 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +80 +48 +38 +38 +78 +ENDCHAR +STARTCHAR uni2199 +ENCODING 8601 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +08 +90 +E0 +E0 +F0 +ENDCHAR +STARTCHAR uni21A2 +ENCODING 8610 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +68 +F0 +68 +20 +ENDCHAR +STARTCHAR uni21A3 +ENCODING 8611 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +B0 +78 +B0 +20 +ENDCHAR +STARTCHAR uni21A4 +ENCODING 8612 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +68 +F8 +68 +20 +ENDCHAR +STARTCHAR uni21A5 +ENCODING 8613 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 2 +BITMAP +20 +70 +F8 +20 +20 +70 +ENDCHAR +STARTCHAR uni21A6 +ENCODING 8614 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +B0 +F8 +B0 +20 +ENDCHAR +STARTCHAR uni21A7 +ENCODING 8615 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +70 +20 +F8 +70 +20 +ENDCHAR +STARTCHAR arrowupdnbse +ENCODING 8616 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +F8 +20 +F8 +70 +20 +F8 +ENDCHAR +STARTCHAR uni21A9 +ENCODING 8617 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +68 +F0 +60 +20 +ENDCHAR +STARTCHAR uni21AA +ENCODING 8618 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +B0 +78 +30 +20 +ENDCHAR +STARTCHAR uni21B0 +ENCODING 8624 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +60 +F8 +68 +28 +08 +08 +ENDCHAR +STARTCHAR uni21B1 +ENCODING 8625 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +30 +F8 +B0 +A0 +80 +80 +ENDCHAR +STARTCHAR uni21B2 +ENCODING 8626 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 2 +BITMAP +08 +08 +28 +68 +F8 +60 +20 +ENDCHAR +STARTCHAR uni21B3 +ENCODING 8627 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 2 +BITMAP +80 +80 +A0 +B0 +F8 +30 +20 +ENDCHAR +STARTCHAR uni21B4 +ENCODING 8628 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 2 +BITMAP +E0 +20 +20 +F8 +70 +20 +ENDCHAR +STARTCHAR carriagereturn +ENCODING 8629 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +08 +08 +28 +68 +F8 +60 +20 +ENDCHAR +STARTCHAR uni21B6 +ENCODING 8630 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +18 +24 +20 +F8 +70 +20 +ENDCHAR +STARTCHAR uni21B7 +ENCODING 8631 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +60 +90 +10 +7C +38 +10 +ENDCHAR +STARTCHAR uni21B9 +ENCODING 8633 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +A0 +C0 +F8 +C0 +A0 +28 +18 +F8 +18 +28 +ENDCHAR +STARTCHAR uni21BA +ENCODING 8634 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 2 +BITMAP +38 +30 +A8 +88 +88 +70 +ENDCHAR +STARTCHAR uni21BB +ENCODING 8635 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 2 +BITMAP +E0 +60 +A8 +88 +88 +70 +ENDCHAR +STARTCHAR uni21BC +ENCODING 8636 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +20 +60 +F8 +ENDCHAR +STARTCHAR uni21BD +ENCODING 8637 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +F8 +60 +20 +ENDCHAR +STARTCHAR uni21BE +ENCODING 8638 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 6 2 2 +BITMAP +80 +C0 +E0 +80 +80 +80 +ENDCHAR +STARTCHAR uni21BF +ENCODING 8639 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 6 0 2 +BITMAP +20 +60 +E0 +20 +20 +20 +ENDCHAR +STARTCHAR uni21C0 +ENCODING 8640 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +20 +30 +F8 +ENDCHAR +STARTCHAR uni21C1 +ENCODING 8641 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +F8 +30 +20 +ENDCHAR +STARTCHAR uni21C2 +ENCODING 8642 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 5 2 2 +BITMAP +80 +80 +E0 +C0 +80 +ENDCHAR +STARTCHAR uni21C3 +ENCODING 8643 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 5 0 2 +BITMAP +20 +20 +E0 +60 +20 +ENDCHAR +STARTCHAR uni21C4 +ENCODING 8644 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 2 +BITMAP +10 +F8 +10 +40 +F8 +40 +ENDCHAR +STARTCHAR uni21C5 +ENCODING 8645 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +40 +E0 +50 +50 +50 +38 +10 +ENDCHAR +STARTCHAR uni21C6 +ENCODING 8646 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 2 +BITMAP +40 +F8 +40 +10 +F8 +10 +ENDCHAR +STARTCHAR uni21C7 +ENCODING 8647 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +40 +F8 +40 +F8 +40 +ENDCHAR +STARTCHAR uni21C8 +ENCODING 8648 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +50 +F8 +50 +50 +50 +ENDCHAR +STARTCHAR uni21C9 +ENCODING 8649 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +10 +F8 +10 +F8 +10 +ENDCHAR +STARTCHAR uni21CA +ENCODING 8650 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +50 +50 +50 +F8 +50 +ENDCHAR +STARTCHAR uni21CB +ENCODING 8651 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +40 +F8 +00 +F8 +10 +ENDCHAR +STARTCHAR uni21CC +ENCODING 8652 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +10 +F8 +00 +F8 +40 +ENDCHAR +STARTCHAR arrowdblleft +ENCODING 8656 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 5 0 2 +BITMAP +20 +7C +E0 +7C +20 +ENDCHAR +STARTCHAR arrowdblup +ENCODING 8657 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +F8 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR arrowdblright +ENCODING 8658 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 5 0 2 +BITMAP +10 +F8 +1C +F8 +10 +ENDCHAR +STARTCHAR arrowdbldown +ENCODING 8659 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +50 +50 +50 +50 +F8 +70 +20 +ENDCHAR +STARTCHAR arrowdblboth +ENCODING 8660 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 5 0 2 +BITMAP +48 +FC +CC +FC +48 +ENDCHAR +STARTCHAR uni21D5 +ENCODING 8661 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +F8 +50 +50 +F8 +70 +20 +ENDCHAR +STARTCHAR uni21D6 +ENCODING 8662 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F0 +E0 +D0 +A8 +10 +ENDCHAR +STARTCHAR uni21D7 +ENCODING 8663 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +78 +38 +58 +A8 +40 +ENDCHAR +STARTCHAR uni21D8 +ENCODING 8664 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +40 +A8 +58 +38 +78 +ENDCHAR +STARTCHAR uni21D9 +ENCODING 8665 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +10 +A8 +D0 +E0 +F0 +ENDCHAR +STARTCHAR uni21E0 +ENCODING 8672 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +40 +A8 +40 +20 +ENDCHAR +STARTCHAR uni21E1 +ENCODING 8673 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +50 +A8 +00 +20 +ENDCHAR +STARTCHAR uni21E2 +ENCODING 8674 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 1 2 +BITMAP +20 +10 +A8 +10 +20 +ENDCHAR +STARTCHAR uni21E3 +ENCODING 8675 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +00 +A8 +50 +20 +ENDCHAR +STARTCHAR uni21E4 +ENCODING 8676 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +A0 +E0 +F8 +E0 +A0 +ENDCHAR +STARTCHAR uni21E5 +ENCODING 8677 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +28 +38 +F8 +38 +28 +ENDCHAR +STARTCHAR uni21E6 +ENCODING 8678 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +78 +E8 +78 +20 +ENDCHAR +STARTCHAR uni21E7 +ENCODING 8679 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 2 +BITMAP +20 +70 +F8 +50 +50 +70 +ENDCHAR +STARTCHAR uni21E8 +ENCODING 8680 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +F0 +B8 +F0 +20 +ENDCHAR +STARTCHAR uni21E9 +ENCODING 8681 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 2 +BITMAP +70 +50 +50 +F8 +70 +20 +ENDCHAR +STARTCHAR uni21F3 +ENCODING 8691 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +F8 +50 +50 +F8 +70 +20 +ENDCHAR +STARTCHAR uni21F5 +ENCODING 8693 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +10 +38 +50 +50 +50 +E0 +40 +ENDCHAR +STARTCHAR uni21F6 +ENCODING 8694 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +10 +F8 +10 +F8 +10 +F8 +10 +ENDCHAR +STARTCHAR universal +ENCODING 8704 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +D8 +D8 +F8 +D8 +D8 +70 +20 +ENDCHAR +STARTCHAR uni2201 +ENCODING 8705 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +C0 +C0 +C0 +C0 +C0 +78 +ENDCHAR +STARTCHAR partialdiff +ENCODING 8706 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +10 +18 +78 +D8 +D8 +70 +ENDCHAR +STARTCHAR existential +ENCODING 8707 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +18 +18 +F8 +18 +18 +F8 +ENDCHAR +STARTCHAR uni2204 +ENCODING 8708 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +F8 +38 +58 +F8 +58 +98 +F8 +80 +ENDCHAR +STARTCHAR emptyset +ENCODING 8709 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +70 +D8 +F8 +F8 +D8 +70 +80 +ENDCHAR +STARTCHAR increment +ENCODING 8710 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +70 +70 +D8 +F8 +ENDCHAR +STARTCHAR gradient +ENCODING 8711 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +F8 +D8 +70 +70 +20 +20 +ENDCHAR +STARTCHAR element +ENCODING 8712 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +60 +C0 +F8 +C0 +60 +38 +ENDCHAR +STARTCHAR notelement +ENCODING 8713 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +38 +70 +D0 +F8 +D0 +70 +38 +10 +ENDCHAR +STARTCHAR uni220A +ENCODING 8714 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +78 +C0 +F8 +C0 +78 +ENDCHAR +STARTCHAR suchthat +ENCODING 8715 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +30 +18 +F8 +18 +30 +E0 +ENDCHAR +STARTCHAR uni220C +ENCODING 8716 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +40 +E0 +70 +58 +F8 +58 +70 +E0 +40 +ENDCHAR +STARTCHAR uni220D +ENCODING 8717 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F0 +18 +F8 +18 +F0 +ENDCHAR +STARTCHAR product +ENCODING 8719 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR summation +ENCODING 8721 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +60 +30 +18 +18 +30 +60 +F8 +ENDCHAR +STARTCHAR minus +ENCODING 8722 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 1 0 3 +BITMAP +FC +ENDCHAR +STARTCHAR uni2213 +ENCODING 8723 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +00 +30 +30 +FC +30 +30 +ENDCHAR +STARTCHAR uni2214 +ENCODING 8724 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +30 +00 +30 +30 +FC +30 +30 +ENDCHAR +STARTCHAR bulletoperator +ENCODING 8729 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 3 1 3 +BITMAP +60 +F0 +60 +ENDCHAR +STARTCHAR radical +ENCODING 8730 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +1C +18 +18 +18 +D8 +D8 +78 +38 +18 +ENDCHAR +STARTCHAR uni221B +ENCODING 8731 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +C0 +6C +CC +6C +CC +0C +CC +6C +3C +1C +ENDCHAR +STARTCHAR uni221C +ENCODING 8732 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +20 +6C +AC +EC +2C +0C +CC +6C +3C +1C +ENDCHAR +STARTCHAR proportional +ENCODING 8733 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +68 +F8 +D0 +F8 +68 +ENDCHAR +STARTCHAR infinity +ENCODING 8734 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 4 0 3 +BITMAP +50 +E8 +B8 +50 +ENDCHAR +STARTCHAR orthogonal +ENCODING 8735 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +C0 +C0 +C0 +C0 +F8 +ENDCHAR +STARTCHAR angle +ENCODING 8736 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +18 +30 +60 +C0 +F8 +ENDCHAR +STARTCHAR uni2223 +ENCODING 8739 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 2 8 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2224 +ENCODING 8740 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +60 +60 +60 +70 +E0 +60 +60 +60 +ENDCHAR +STARTCHAR uni2225 +ENCODING 8741 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni2226 +ENCODING 8742 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +D8 +D8 +DC +F8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR logicaland +ENCODING 8743 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +70 +70 +D8 +D8 +ENDCHAR +STARTCHAR logicalor +ENCODING 8744 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +D8 +D8 +70 +70 +20 +20 +ENDCHAR +STARTCHAR intersection +ENCODING 8745 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +D8 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR union +ENCODING 8746 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR integral +ENCODING 8747 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +30 +60 +60 +60 +60 +60 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR uni222C +ENCODING 8748 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -1 +BITMAP +3C +78 +78 +78 +78 +78 +78 +78 +78 +F0 +ENDCHAR +STARTCHAR uni222E +ENCODING 8750 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -1 +BITMAP +18 +30 +78 +FC +B4 +B4 +FC +78 +30 +60 +ENDCHAR +STARTCHAR uni2242 +ENCODING 8770 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +00 +68 +F8 +B0 +ENDCHAR +STARTCHAR uni2243 +ENCODING 8771 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +68 +F8 +B0 +00 +F8 +ENDCHAR +STARTCHAR congruent +ENCODING 8773 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +68 +F8 +B0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR approxequal +ENCODING 8776 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +68 +F8 +B0 +00 +68 +F8 +B0 +ENDCHAR +STARTCHAR notequal +ENCODING 8800 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +18 +FC +30 +30 +FC +60 +ENDCHAR +STARTCHAR equivalence +ENCODING 8801 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +FC +00 +FC +00 +FC +ENDCHAR +STARTCHAR uni2262 +ENCODING 8802 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +18 +FC +30 +FC +30 +FC +60 +ENDCHAR +STARTCHAR uni2263 +ENCODING 8803 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +FC +00 +FC +00 +FC +00 +FC +ENDCHAR +STARTCHAR lessequal +ENCODING 8804 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +0C +38 +E0 +38 +0C +00 +FC +ENDCHAR +STARTCHAR greaterequal +ENCODING 8805 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +C0 +70 +1C +70 +C0 +00 +FC +ENDCHAR +STARTCHAR uni2266 +ENCODING 8806 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +0C +38 +E0 +38 +0C +00 +FC +00 +FC +ENDCHAR +STARTCHAR uni2267 +ENCODING 8807 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +C0 +70 +1C +70 +C0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2268 +ENCODING 8808 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 10 0 -1 +BITMAP +0C +38 +E0 +38 +0C +18 +FC +30 +FC +60 +ENDCHAR +STARTCHAR uni2269 +ENCODING 8809 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 10 0 -1 +BITMAP +C0 +70 +1C +70 +C0 +18 +F8 +30 +F8 +60 +ENDCHAR +STARTCHAR uni226A +ENCODING 8810 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +24 +6C +D8 +6C +24 +ENDCHAR +STARTCHAR uni226B +ENCODING 8811 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 5 0 1 +BITMAP +90 +D8 +6C +D8 +90 +ENDCHAR +STARTCHAR uni227A +ENCODING 8826 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +08 +38 +E0 +38 +08 +ENDCHAR +STARTCHAR uni227B +ENCODING 8827 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +80 +E0 +38 +E0 +80 +ENDCHAR +STARTCHAR uni227C +ENCODING 8828 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +08 +38 +E0 +38 +C8 +30 +08 +ENDCHAR +STARTCHAR uni227D +ENCODING 8829 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +80 +E0 +38 +E0 +98 +60 +80 +ENDCHAR +STARTCHAR propersubset +ENCODING 8834 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +78 +C0 +C0 +C0 +78 +ENDCHAR +STARTCHAR propersuperset +ENCODING 8835 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F0 +18 +18 +18 +F0 +ENDCHAR +STARTCHAR notsubset +ENCODING 8836 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +78 +D0 +E0 +E0 +78 +40 +ENDCHAR +STARTCHAR uni2285 +ENCODING 8837 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +F0 +38 +38 +58 +F0 +40 +ENDCHAR +STARTCHAR reflexsubset +ENCODING 8838 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +C0 +C0 +C0 +78 +00 +F8 +ENDCHAR +STARTCHAR reflexsuperset +ENCODING 8839 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +18 +18 +18 +F0 +00 +F8 +ENDCHAR +STARTCHAR uni2288 +ENCODING 8840 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +78 +D0 +E0 +E0 +78 +40 +F8 +40 +ENDCHAR +STARTCHAR uni2289 +ENCODING 8841 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +F0 +18 +38 +38 +F0 +40 +F8 +40 +ENDCHAR +STARTCHAR uni228A +ENCODING 8842 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +78 +C0 +C0 +C0 +78 +20 +F8 +40 +ENDCHAR +STARTCHAR uni228B +ENCODING 8843 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +F0 +18 +18 +18 +F0 +20 +F8 +40 +ENDCHAR +STARTCHAR uni22A2 +ENCODING 8866 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +C0 +C0 +F8 +C0 +C0 +ENDCHAR +STARTCHAR uni22A3 +ENCODING 8867 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +18 +18 +F8 +18 +18 +ENDCHAR +STARTCHAR uni22A4 +ENCODING 8868 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR perpendicular +ENCODING 8869 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +20 +20 +F8 +F8 +ENDCHAR +STARTCHAR uni22BF +ENCODING 8895 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +08 +18 +38 +68 +F8 +ENDCHAR +STARTCHAR uni22C0 +ENCODING 8896 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +70 +70 +D8 +D8 +ENDCHAR +STARTCHAR uni22C1 +ENCODING 8897 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +D8 +D8 +70 +70 +20 +20 +ENDCHAR +STARTCHAR uni22C2 +ENCODING 8898 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +D8 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni22C3 +ENCODING 8899 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +D8 +D8 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni22C8 +ENCODING 8904 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +88 +D8 +A8 +D8 +88 +ENDCHAR +STARTCHAR uni22C9 +ENCODING 8905 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +88 +D0 +A0 +D0 +88 +ENDCHAR +STARTCHAR uni22CA +ENCODING 8906 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +88 +58 +28 +58 +88 +ENDCHAR +STARTCHAR uni22CB +ENCODING 8907 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +80 +40 +20 +50 +88 +ENDCHAR +STARTCHAR uni22CC +ENCODING 8908 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +08 +10 +20 +50 +88 +ENDCHAR +STARTCHAR uni22CD +ENCODING 8909 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +B0 +F8 +68 +00 +F8 +ENDCHAR +STARTCHAR house +ENCODING 8962 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +70 +D8 +D8 +D8 +F8 +ENDCHAR +STARTCHAR revlogicalnot +ENCODING 8976 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +F8 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni231A +ENCODING 8986 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 1 +BITMAP +78 +CC +94 +94 +9C +84 +CC +78 +ENDCHAR +STARTCHAR uni231B +ENCODING 8987 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 1 +BITMAP +FC +CC +48 +78 +48 +78 +FC +FC +ENDCHAR +STARTCHAR integraltp +ENCODING 8992 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 -2 +BITMAP +60 +F0 +D0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR integralbt +ENCODING 8993 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 0 0 +BITMAP +30 +30 +30 +30 +30 +30 +30 +B0 +F0 +60 +ENDCHAR +STARTCHAR uni23BA +ENCODING 9146 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 1 0 9 +BITMAP +FC +ENDCHAR +STARTCHAR uni23BB +ENCODING 9147 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 1 0 6 +BITMAP +FC +ENDCHAR +STARTCHAR uni23BC +ENCODING 9148 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 1 0 1 +BITMAP +FC +ENDCHAR +STARTCHAR uni23BD +ENCODING 9149 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 1 0 -2 +BITMAP +FC +ENDCHAR +STARTCHAR uni2408 +ENCODING 9224 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +F0 +D8 +F0 +D8 +F0 +00 +3C +70 +38 +1C +78 +ENDCHAR +STARTCHAR uni2409 +ENCODING 9225 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +D8 +D8 +F8 +D8 +D8 +00 +FC +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni240A +ENCODING 9226 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +C0 +C0 +C0 +C0 +F8 +00 +7C +60 +78 +60 +60 +ENDCHAR +STARTCHAR uni240B +ENCODING 9227 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +D8 +D8 +D8 +70 +20 +00 +FC +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni240C +ENCODING 9228 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +F8 +C0 +F0 +C0 +C0 +00 +7C +60 +78 +60 +60 +ENDCHAR +STARTCHAR uni240D +ENCODING 9229 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +78 +C0 +C0 +C0 +78 +00 +78 +6C +78 +7C +6C +ENDCHAR +STARTCHAR uni2420 +ENCODING 9248 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +70 +C0 +70 +18 +70 +00 +78 +6C +78 +60 +60 +ENDCHAR +STARTCHAR uni2424 +ENCODING 9252 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +98 +D8 +F8 +D8 +C8 +00 +60 +60 +60 +60 +7C +ENDCHAR +STARTCHAR SF100000 +ENCODING 9472 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 1 0 4 +BITMAP +FC +ENDCHAR +STARTCHAR uni2501 +ENCODING 9473 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 2 0 3 +BITMAP +FC +FC +ENDCHAR +STARTCHAR SF110000 +ENCODING 9474 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2503 +ENCODING 9475 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2508 +ENCODING 9480 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 1 0 4 +BITMAP +A8 +ENDCHAR +STARTCHAR uni2509 +ENCODING 9481 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 2 0 3 +BITMAP +A8 +A8 +ENDCHAR +STARTCHAR uni250A +ENCODING 9482 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 11 2 -1 +BITMAP +80 +80 +00 +80 +80 +00 +80 +80 +00 +80 +80 +ENDCHAR +STARTCHAR uni250B +ENCODING 9483 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 11 2 -1 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR SF010000 +ENCODING 9484 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 2 -2 +BITMAP +F0 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni250D +ENCODING 9485 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 2 -2 +BITMAP +F0 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni250E +ENCODING 9486 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 2 -2 +BITMAP +F0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni250F +ENCODING 9487 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 2 -2 +BITMAP +F0 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR SF030000 +ENCODING 9488 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 7 0 -2 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2511 +ENCODING 9489 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 7 0 -2 +BITMAP +E0 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2512 +ENCODING 9490 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 0 -2 +BITMAP +F0 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2513 +ENCODING 9491 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 0 -2 +BITMAP +F0 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR SF020000 +ENCODING 9492 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 6 2 4 +BITMAP +80 +80 +80 +80 +80 +F0 +ENDCHAR +STARTCHAR uni2515 +ENCODING 9493 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 2 3 +BITMAP +80 +80 +80 +80 +80 +F0 +F0 +ENDCHAR +STARTCHAR uni2516 +ENCODING 9494 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 6 2 4 +BITMAP +C0 +C0 +C0 +C0 +C0 +F0 +ENDCHAR +STARTCHAR uni2517 +ENCODING 9495 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 2 3 +BITMAP +C0 +C0 +C0 +C0 +C0 +F0 +F0 +ENDCHAR +STARTCHAR SF040000 +ENCODING 9496 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 6 0 4 +BITMAP +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR uni2519 +ENCODING 9497 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 7 0 3 +BITMAP +20 +20 +20 +20 +20 +E0 +E0 +ENDCHAR +STARTCHAR uni251A +ENCODING 9498 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 6 0 4 +BITMAP +30 +30 +30 +30 +30 +F0 +ENDCHAR +STARTCHAR uni251B +ENCODING 9499 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 0 3 +BITMAP +30 +30 +30 +30 +30 +F0 +F0 +ENDCHAR +STARTCHAR SF080000 +ENCODING 9500 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +F0 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni251D +ENCODING 9501 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +F0 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni251E +ENCODING 9502 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +F0 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni251F +ENCODING 9503 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +F0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2520 +ENCODING 9504 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +F0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2521 +ENCODING 9505 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +F0 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2522 +ENCODING 9506 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +F0 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2523 +ENCODING 9507 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +F0 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR SF090000 +ENCODING 9508 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +E0 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2525 +ENCODING 9509 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +E0 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2526 +ENCODING 9510 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +F0 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2527 +ENCODING 9511 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +F0 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2528 +ENCODING 9512 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +F0 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2529 +ENCODING 9513 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +F0 +F0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni252A +ENCODING 9514 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +F0 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni252B +ENCODING 9515 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +F0 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR SF060000 +ENCODING 9516 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni252D +ENCODING 9517 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni252E +ENCODING 9518 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +3C +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni252F +ENCODING 9519 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2530 +ENCODING 9520 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2531 +ENCODING 9521 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2532 +ENCODING 9522 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +3C +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2533 +ENCODING 9523 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR SF070000 +ENCODING 9524 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 4 +BITMAP +20 +20 +20 +20 +20 +FC +ENDCHAR +STARTCHAR uni2535 +ENCODING 9525 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +20 +20 +20 +20 +20 +FC +E0 +ENDCHAR +STARTCHAR uni2536 +ENCODING 9526 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +20 +20 +20 +20 +20 +FC +3C +ENDCHAR +STARTCHAR uni2537 +ENCODING 9527 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +20 +20 +20 +20 +20 +FC +FC +ENDCHAR +STARTCHAR uni2538 +ENCODING 9528 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 4 +BITMAP +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni2539 +ENCODING 9529 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +30 +30 +30 +30 +30 +FC +F0 +ENDCHAR +STARTCHAR uni253A +ENCODING 9530 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +30 +30 +30 +30 +30 +FC +3C +ENDCHAR +STARTCHAR uni253B +ENCODING 9531 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +30 +30 +30 +30 +30 +FC +FC +ENDCHAR +STARTCHAR SF050000 +ENCODING 9532 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +FC +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni253D +ENCODING 9533 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +FC +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni253E +ENCODING 9534 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +FC +3C +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni253F +ENCODING 9535 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +FC +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2540 +ENCODING 9536 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +FC +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2541 +ENCODING 9537 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +FC +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2542 +ENCODING 9538 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +FC +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2543 +ENCODING 9539 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +FC +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2544 +ENCODING 9540 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +FC +3C +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2545 +ENCODING 9541 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +FC +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2546 +ENCODING 9542 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +FC +3C +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2547 +ENCODING 9543 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +FC +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2548 +ENCODING 9544 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +FC +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2549 +ENCODING 9545 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +FC +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni254A +ENCODING 9546 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +FC +3C +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni254B +ENCODING 9547 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +FC +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR SF430000 +ENCODING 9552 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 3 0 3 +BITMAP +FC +00 +FC +ENDCHAR +STARTCHAR SF240000 +ENCODING 9553 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 12 1 -2 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF510000 +ENCODING 9554 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 2 -2 +BITMAP +F0 +80 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR SF520000 +ENCODING 9555 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 1 -2 +BITMAP +F8 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF390000 +ENCODING 9556 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 1 -2 +BITMAP +F8 +80 +B8 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF220000 +ENCODING 9557 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 8 0 -2 +BITMAP +E0 +20 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF210000 +ENCODING 9558 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 0 -2 +BITMAP +F0 +50 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF250000 +ENCODING 9559 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 0 -2 +BITMAP +F0 +10 +D0 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF500000 +ENCODING 9560 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 2 3 +BITMAP +80 +80 +80 +80 +F0 +80 +F0 +ENDCHAR +STARTCHAR SF490000 +ENCODING 9561 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 1 4 +BITMAP +A0 +A0 +A0 +A0 +A0 +F8 +ENDCHAR +STARTCHAR SF380000 +ENCODING 9562 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 1 3 +BITMAP +A0 +A0 +A0 +A0 +B8 +80 +F8 +ENDCHAR +STARTCHAR SF280000 +ENCODING 9563 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 7 0 3 +BITMAP +20 +20 +20 +20 +E0 +20 +E0 +ENDCHAR +STARTCHAR SF270000 +ENCODING 9564 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 6 0 4 +BITMAP +50 +50 +50 +50 +50 +F0 +ENDCHAR +STARTCHAR SF260000 +ENCODING 9565 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 0 3 +BITMAP +50 +50 +50 +50 +D0 +10 +F0 +ENDCHAR +STARTCHAR SF360000 +ENCODING 9566 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +80 +80 +80 +80 +F0 +80 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR SF370000 +ENCODING 9567 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 1 -2 +BITMAP +A0 +A0 +A0 +A0 +A0 +B8 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF420000 +ENCODING 9568 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 1 -2 +BITMAP +A0 +A0 +A0 +A0 +B8 +80 +B8 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF190000 +ENCODING 9569 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 12 0 -2 +BITMAP +20 +20 +20 +20 +E0 +20 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF200000 +ENCODING 9570 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +50 +50 +50 +50 +50 +D0 +50 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF230000 +ENCODING 9571 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +50 +50 +50 +50 +D0 +10 +D0 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF470000 +ENCODING 9572 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +FC +00 +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF480000 +ENCODING 9573 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +50 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF410000 +ENCODING 9574 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +FC +00 +DC +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF450000 +ENCODING 9575 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +20 +20 +20 +20 +FC +00 +FC +ENDCHAR +STARTCHAR SF460000 +ENCODING 9576 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 4 +BITMAP +50 +50 +50 +50 +50 +FC +ENDCHAR +STARTCHAR SF400000 +ENCODING 9577 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +50 +50 +50 +50 +DC +00 +FC +ENDCHAR +STARTCHAR SF540000 +ENCODING 9578 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +FC +20 +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF530000 +ENCODING 9579 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +50 +50 +50 +50 +50 +FC +50 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF440000 +ENCODING 9580 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +50 +50 +50 +50 +DC +00 +DC +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR uni256D +ENCODING 9581 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 2 -2 +BITMAP +30 +40 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni256E +ENCODING 9582 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 7 0 -2 +BITMAP +80 +40 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni256F +ENCODING 9583 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 6 0 4 +BITMAP +20 +20 +20 +20 +40 +80 +ENDCHAR +STARTCHAR uni2570 +ENCODING 9584 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 6 2 4 +BITMAP +80 +80 +80 +80 +40 +30 +ENDCHAR +STARTCHAR uni2571 +ENCODING 9585 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +04 +04 +08 +08 +10 +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni2572 +ENCODING 9586 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +80 +80 +40 +40 +20 +20 +10 +10 +08 +08 +04 +04 +ENDCHAR +STARTCHAR uni2573 +ENCODING 9587 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +84 +84 +48 +48 +30 +30 +30 +30 +48 +48 +84 +84 +ENDCHAR +STARTCHAR uni2574 +ENCODING 9588 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 1 0 4 +BITMAP +E0 +ENDCHAR +STARTCHAR uni2575 +ENCODING 9589 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 6 2 4 +BITMAP +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2576 +ENCODING 9590 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 1 2 4 +BITMAP +F0 +ENDCHAR +STARTCHAR uni2577 +ENCODING 9591 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 7 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2578 +ENCODING 9592 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 2 0 3 +BITMAP +E0 +E0 +ENDCHAR +STARTCHAR uni2579 +ENCODING 9593 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 6 2 4 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni257A +ENCODING 9594 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 2 2 3 +BITMAP +F0 +F0 +ENDCHAR +STARTCHAR uni257B +ENCODING 9595 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 7 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni257C +ENCODING 9596 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 2 0 3 +BITMAP +FC +3C +ENDCHAR +STARTCHAR uni257D +ENCODING 9597 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni257E +ENCODING 9598 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 2 0 3 +BITMAP +FC +E0 +ENDCHAR +STARTCHAR uni257F +ENCODING 9599 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR upblock +ENCODING 9600 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 4 +BITMAP +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2581 +ENCODING 9601 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 2 0 -2 +BITMAP +FC +FC +ENDCHAR +STARTCHAR uni2582 +ENCODING 9602 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 3 0 -2 +BITMAP +FC +FC +FC +ENDCHAR +STARTCHAR uni2583 +ENCODING 9603 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 4 0 -2 +BITMAP +FC +FC +FC +FC +ENDCHAR +STARTCHAR dnblock +ENCODING 9604 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2585 +ENCODING 9605 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2586 +ENCODING 9606 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2587 +ENCODING 9607 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR block +ENCODING 9608 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2589 +ENCODING 9609 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni258A +ENCODING 9610 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni258B +ENCODING 9611 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR lfblock +ENCODING 9612 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 12 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni258D +ENCODING 9613 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 12 0 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni258E +ENCODING 9614 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 12 0 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni258F +ENCODING 9615 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 12 0 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR rtblock +ENCODING 9616 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 12 3 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR ltshade +ENCODING 9617 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +88 +20 +88 +20 +88 +20 +88 +20 +88 +20 +88 +20 +ENDCHAR +STARTCHAR shade +ENCODING 9618 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +A8 +54 +A8 +54 +A8 +54 +A8 +54 +A8 +54 +A8 +54 +ENDCHAR +STARTCHAR dkshade +ENCODING 9619 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +74 +DC +74 +DC +74 +DC +74 +DC +74 +DC +74 +DC +ENDCHAR +STARTCHAR uni2596 +ENCODING 9622 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 6 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2597 +ENCODING 9623 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 6 3 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2598 +ENCODING 9624 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 6 0 4 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2599 +ENCODING 9625 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni259A +ENCODING 9626 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR uni259B +ENCODING 9627 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni259C +ENCODING 9628 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR uni259D +ENCODING 9629 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 6 3 4 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni259E +ENCODING 9630 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +1C +1C +1C +1C +1C +1C +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni259F +ENCODING 9631 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +1C +1C +1C +1C +1C +1C +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR filledbox +ENCODING 9632 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR H22073 +ENCODING 9633 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +F8 +D8 +D8 +D8 +D8 +F8 +ENDCHAR +STARTCHAR uni25A2 +ENCODING 9634 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni25A3 +ENCODING 9635 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +F8 +D8 +F8 +F8 +D8 +F8 +ENDCHAR +STARTCHAR H18543 +ENCODING 9642 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 3 1 3 +BITMAP +E0 +E0 +E0 +ENDCHAR +STARTCHAR H18551 +ENCODING 9643 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 3 1 3 +BITMAP +E0 +A0 +E0 +ENDCHAR +STARTCHAR filledrect +ENCODING 9644 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 0 +BITMAP +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni25AD +ENCODING 9645 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 0 +BITMAP +F8 +D8 +F8 +ENDCHAR +STARTCHAR uni25AE +ENCODING 9646 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni25AF +ENCODING 9647 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +D8 +D8 +D8 +D8 +D8 +D8 +F8 +ENDCHAR +STARTCHAR uni25B0 +ENCODING 9648 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +78 +78 +F0 +F0 +ENDCHAR +STARTCHAR uni25B1 +ENCODING 9649 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +78 +58 +D0 +F0 +ENDCHAR +STARTCHAR triagup +ENCODING 9650 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +30 +30 +78 +78 +FC +FC +ENDCHAR +STARTCHAR uni25B3 +ENCODING 9651 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +30 +30 +78 +78 +CC +FC +ENDCHAR +STARTCHAR uni25B4 +ENCODING 9652 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 3 0 3 +BITMAP +30 +78 +FC +ENDCHAR +STARTCHAR uni25B5 +ENCODING 9653 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 3 0 3 +BITMAP +30 +68 +FC +ENDCHAR +STARTCHAR uni25B6 +ENCODING 9654 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +C0 +F0 +FC +FC +F0 +C0 +ENDCHAR +STARTCHAR uni25B7 +ENCODING 9655 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +C0 +F0 +DC +DC +F0 +C0 +ENDCHAR +STARTCHAR uni25B8 +ENCODING 9656 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 6 1 1 +BITMAP +80 +C0 +E0 +E0 +C0 +80 +ENDCHAR +STARTCHAR uni25B9 +ENCODING 9657 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 6 1 1 +BITMAP +80 +C0 +A0 +E0 +C0 +80 +ENDCHAR +STARTCHAR triagrt +ENCODING 9658 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +C0 +F0 +7C +7C +F0 +C0 +ENDCHAR +STARTCHAR uni25BB +ENCODING 9659 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +C0 +F0 +5C +5C +F0 +C0 +ENDCHAR +STARTCHAR triagdn +ENCODING 9660 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +FC +FC +78 +78 +30 +30 +ENDCHAR +STARTCHAR uni25BD +ENCODING 9661 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +FC +CC +78 +78 +30 +30 +ENDCHAR +STARTCHAR uni25BE +ENCODING 9662 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 3 0 3 +BITMAP +FC +78 +30 +ENDCHAR +STARTCHAR uni25BF +ENCODING 9663 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 3 0 3 +BITMAP +FC +68 +30 +ENDCHAR +STARTCHAR uni25C0 +ENCODING 9664 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +0C +3C +F8 +F8 +3C +0C +ENDCHAR +STARTCHAR uni25C1 +ENCODING 9665 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +0C +3C +E8 +E8 +3C +0C +ENDCHAR +STARTCHAR uni25C2 +ENCODING 9666 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 3 6 1 1 +BITMAP +20 +60 +E0 +E0 +60 +20 +ENDCHAR +STARTCHAR uni25C3 +ENCODING 9667 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 3 6 1 1 +BITMAP +20 +60 +A0 +E0 +60 +20 +ENDCHAR +STARTCHAR triaglf +ENCODING 9668 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +0C +3C +FC +FC +3C +0C +ENDCHAR +STARTCHAR uni25C5 +ENCODING 9669 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +0C +3C +EC +EC +3C +0C +ENDCHAR +STARTCHAR blackdiamond +ENCODING 9670 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +70 +F8 +70 +20 +ENDCHAR +STARTCHAR uni25C7 +ENCODING 9671 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 1 2 +BITMAP +20 +50 +88 +50 +20 +ENDCHAR +STARTCHAR uni25C8 +ENCODING 9672 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 1 2 +BITMAP +20 +50 +A8 +50 +20 +ENDCHAR +STARTCHAR lozenge +ENCODING 9674 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +20 +50 +50 +88 +50 +50 +20 +ENDCHAR +STARTCHAR circle +ENCODING 9675 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni25CC +ENCODING 9676 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +50 +88 +00 +88 +50 +ENDCHAR +STARTCHAR H18533 +ENCODING 9679 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +70 +F8 +F8 +F8 +70 +ENDCHAR +STARTCHAR uni25D0 +ENCODING 9680 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +70 +E8 +E8 +E8 +70 +ENDCHAR +STARTCHAR uni25D1 +ENCODING 9681 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +70 +B8 +B8 +B8 +70 +ENDCHAR +STARTCHAR uni25D2 +ENCODING 9682 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +70 +88 +F8 +F8 +70 +ENDCHAR +STARTCHAR uni25D3 +ENCODING 9683 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +70 +F8 +F8 +88 +70 +ENDCHAR +STARTCHAR uni25D4 +ENCODING 9684 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +70 +B8 +B8 +88 +70 +ENDCHAR +STARTCHAR uni25D5 +ENCODING 9685 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +70 +B8 +F8 +F8 +70 +ENDCHAR +STARTCHAR uni25D6 +ENCODING 9686 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 5 0 2 +BITMAP +60 +E0 +E0 +E0 +60 +ENDCHAR +STARTCHAR uni25D7 +ENCODING 9687 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 5 2 2 +BITMAP +C0 +E0 +E0 +E0 +C0 +ENDCHAR +STARTCHAR invbullet +ENCODING 9688 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +FC +FC +CC +84 +84 +CC +FC +FC +FC +FC +ENDCHAR +STARTCHAR invcircle +ENCODING 9689 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +FC +FC +CC +B4 +B4 +CC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni25DC +ENCODING 9692 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 3 0 4 +BITMAP +60 +80 +80 +ENDCHAR +STARTCHAR uni25DD +ENCODING 9693 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 3 2 4 +BITMAP +C0 +20 +20 +ENDCHAR +STARTCHAR uni25DE +ENCODING 9694 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 3 2 2 +BITMAP +20 +20 +C0 +ENDCHAR +STARTCHAR uni25DF +ENCODING 9695 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 3 0 2 +BITMAP +80 +80 +60 +ENDCHAR +STARTCHAR uni25E0 +ENCODING 9696 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +70 +88 +88 +ENDCHAR +STARTCHAR uni25E1 +ENCODING 9697 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +88 +88 +70 +ENDCHAR +STARTCHAR uni25E2 +ENCODING 9698 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +08 +18 +38 +78 +F8 +ENDCHAR +STARTCHAR uni25E3 +ENCODING 9699 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +80 +C0 +E0 +F0 +F8 +ENDCHAR +STARTCHAR uni25E4 +ENCODING 9700 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +F0 +E0 +C0 +80 +ENDCHAR +STARTCHAR uni25E5 +ENCODING 9701 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +78 +38 +18 +08 +ENDCHAR +STARTCHAR openbullet +ENCODING 9702 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 4 1 2 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni25E7 +ENCODING 9703 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +E8 +E8 +E8 +F8 +ENDCHAR +STARTCHAR uni25E8 +ENCODING 9704 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +B8 +B8 +B8 +F8 +ENDCHAR +STARTCHAR uni25E9 +ENCODING 9705 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +E8 +C8 +88 +F8 +ENDCHAR +STARTCHAR uni25EA +ENCODING 9706 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +88 +98 +B8 +F8 +ENDCHAR +STARTCHAR uni25EB +ENCODING 9707 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR uni25EC +ENCODING 9708 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +70 +50 +F8 +F8 +ENDCHAR +STARTCHAR uni25ED +ENCODING 9709 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +30 +30 +68 +68 +E4 +FC +ENDCHAR +STARTCHAR uni25EE +ENCODING 9710 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +30 +30 +58 +58 +9C +FC +ENDCHAR +STARTCHAR uni25EF +ENCODING 9711 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +78 +CC +84 +84 +CC +78 +ENDCHAR +STARTCHAR uni25F0 +ENCODING 9712 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +A8 +E8 +88 +F8 +ENDCHAR +STARTCHAR uni25F1 +ENCODING 9713 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +88 +E8 +A8 +F8 +ENDCHAR +STARTCHAR uni25F2 +ENCODING 9714 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +88 +B8 +A8 +F8 +ENDCHAR +STARTCHAR uni25F3 +ENCODING 9715 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +A8 +B8 +88 +F8 +ENDCHAR +STARTCHAR uni25F4 +ENCODING 9716 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +70 +A8 +E8 +88 +70 +ENDCHAR +STARTCHAR uni25F5 +ENCODING 9717 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +70 +88 +E8 +A8 +70 +ENDCHAR +STARTCHAR uni25F6 +ENCODING 9718 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +70 +88 +B8 +A8 +70 +ENDCHAR +STARTCHAR uni25F7 +ENCODING 9719 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +70 +A8 +B8 +88 +70 +ENDCHAR +STARTCHAR uni25F8 +ENCODING 9720 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +90 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni25F9 +ENCODING 9721 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +48 +28 +18 +08 +ENDCHAR +STARTCHAR uni25FA +ENCODING 9722 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +80 +C0 +A0 +90 +F8 +ENDCHAR +STARTCHAR uni25FB +ENCODING 9723 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni25FC +ENCODING 9724 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni25FD +ENCODING 9725 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 4 1 2 +BITMAP +F0 +90 +90 +F0 +ENDCHAR +STARTCHAR uni25FE +ENCODING 9726 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 4 1 2 +BITMAP +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni25FF +ENCODING 9727 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +08 +18 +28 +48 +F8 +ENDCHAR +STARTCHAR uni2609 +ENCODING 9737 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +70 +F8 +D8 +F8 +70 +ENDCHAR +STARTCHAR uni260A +ENCODING 9738 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 1 +BITMAP +78 +CC +CC +CC +78 +B4 +CC +ENDCHAR +STARTCHAR uni260B +ENCODING 9739 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 1 +BITMAP +CC +B4 +78 +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni2610 +ENCODING 9744 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 1 +BITMAP +FC +84 +84 +84 +84 +84 +FC +ENDCHAR +STARTCHAR uni2611 +ENCODING 9745 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 1 +BITMAP +FC +84 +8C +DC +F4 +A4 +FC +ENDCHAR +STARTCHAR uni2612 +ENCODING 9746 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 1 +BITMAP +FC +84 +CC +B4 +CC +84 +FC +ENDCHAR +STARTCHAR uni2639 +ENCODING 9785 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +78 +84 +CC +84 +B4 +CC +84 +78 +ENDCHAR +STARTCHAR smileface +ENCODING 9786 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +78 +84 +CC +84 +CC +B4 +84 +78 +ENDCHAR +STARTCHAR invsmileface +ENCODING 9787 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +78 +FC +B4 +FC +B4 +CC +FC +78 +ENDCHAR +STARTCHAR sun +ENCODING 9788 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +20 +A8 +70 +D8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni263D +ENCODING 9789 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +E0 +50 +28 +28 +28 +50 +E0 +ENDCHAR +STARTCHAR uni263E +ENCODING 9790 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +38 +50 +A0 +A0 +A0 +50 +38 +ENDCHAR +STARTCHAR uni263F +ENCODING 9791 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +88 +70 +88 +88 +88 +70 +20 +F8 +20 +ENDCHAR +STARTCHAR female +ENCODING 9792 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +88 +70 +20 +F8 +20 +ENDCHAR +STARTCHAR uni2641 +ENCODING 9793 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 2 +BITMAP +20 +F8 +20 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR male +ENCODING 9794 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +3C +0C +14 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2643 +ENCODING 9795 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +08 +08 +48 +A8 +28 +48 +F8 +08 +08 +08 +ENDCHAR +STARTCHAR uni2644 +ENCODING 9796 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +E0 +40 +70 +48 +48 +48 +50 +ENDCHAR +STARTCHAR uni2645 +ENCODING 9797 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +70 +70 +70 +F8 +20 +50 +20 +ENDCHAR +STARTCHAR uni2646 +ENCODING 9798 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +A8 +A8 +A8 +70 +20 +20 +70 +20 +ENDCHAR +STARTCHAR uni2647 +ENCODING 9799 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +88 +88 +88 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni2648 +ENCODING 9800 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +A8 +A8 +A8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2649 +ENCODING 9801 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni264A +ENCODING 9802 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +D8 +70 +50 +50 +50 +70 +D8 +ENDCHAR +STARTCHAR uni264B +ENCODING 9803 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +70 +A8 +C0 +18 +A8 +70 +ENDCHAR +STARTCHAR uni264C +ENCODING 9804 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +30 +48 +48 +28 +68 +A8 +C8 +10 +18 +ENDCHAR +STARTCHAR uni264D +ENCODING 9805 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +A0 +E0 +F0 +E8 +E8 +B0 +A0 +A0 +10 +ENDCHAR +STARTCHAR uni264E +ENCODING 9806 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +70 +88 +88 +50 +D8 +00 +F8 +ENDCHAR +STARTCHAR uni264F +ENCODING 9807 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +A0 +E0 +E0 +E0 +E0 +A0 +A8 +A8 +10 +ENDCHAR +STARTCHAR uni2650 +ENCODING 9808 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +38 +18 +A8 +40 +A0 +ENDCHAR +STARTCHAR uni2651 +ENCODING 9809 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +A0 +A0 +B0 +A8 +A8 +30 +40 +ENDCHAR +STARTCHAR uni2652 +ENCODING 9810 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +50 +A8 +00 +50 +A8 +ENDCHAR +STARTCHAR uni2653 +ENCODING 9811 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +88 +50 +50 +F8 +50 +50 +88 +ENDCHAR +STARTCHAR uni2654 +ENCODING 9812 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +20 +50 +A8 +A8 +A8 +70 +70 +ENDCHAR +STARTCHAR uni2655 +ENCODING 9813 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +A8 +70 +A8 +70 +50 +88 +F8 +ENDCHAR +STARTCHAR uni2656 +ENCODING 9814 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +A8 +F8 +88 +F8 +50 +50 +50 +70 +88 +F8 +ENDCHAR +STARTCHAR uni2657 +ENCODING 9815 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +70 +A8 +88 +50 +50 +70 +88 +F8 +ENDCHAR +STARTCHAR uni2658 +ENCODING 9816 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +38 +58 +A8 +88 +A8 +48 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2659 +ENCODING 9817 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +70 +88 +88 +70 +88 +F8 +ENDCHAR +STARTCHAR uni265A +ENCODING 9818 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +20 +70 +E8 +F8 +F8 +70 +70 +ENDCHAR +STARTCHAR uni265B +ENCODING 9819 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +A8 +70 +F8 +70 +70 +F8 +F8 +ENDCHAR +STARTCHAR uni265C +ENCODING 9820 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +A8 +F8 +E8 +F8 +70 +70 +70 +70 +F8 +F8 +ENDCHAR +STARTCHAR uni265D +ENCODING 9821 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +70 +70 +D8 +F8 +70 +70 +70 +F8 +F8 +ENDCHAR +STARTCHAR uni265E +ENCODING 9822 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +38 +78 +D8 +F8 +F8 +78 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni265F +ENCODING 9823 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +70 +F8 +F8 +70 +F8 +F8 +ENDCHAR +STARTCHAR spade +ENCODING 9824 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +70 +F8 +F8 +A8 +20 +70 +ENDCHAR +STARTCHAR club +ENCODING 9827 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +70 +A8 +F8 +F8 +A8 +20 +70 +ENDCHAR +STARTCHAR heart +ENCODING 9829 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +F8 +F8 +F8 +F8 +70 +70 +20 +ENDCHAR +STARTCHAR diamond +ENCODING 9830 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +70 +F8 +F8 +70 +20 +20 +ENDCHAR +STARTCHAR uni2669 +ENCODING 9833 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +20 +20 +20 +20 +20 +20 +60 +E0 +40 +ENDCHAR +STARTCHAR musicalnote +ENCODING 9834 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 1 0 +BITMAP +20 +30 +28 +20 +20 +20 +60 +E0 +40 +ENDCHAR +STARTCHAR musicalnotedbl +ENCODING 9835 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +30 +3C +2C +24 +24 +24 +64 +EC +5C +08 +ENDCHAR +STARTCHAR uni266C +ENCODING 9836 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +3C +24 +3C +24 +24 +24 +24 +6C +FC +48 +ENDCHAR +STARTCHAR uni266D +ENCODING 9837 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 0 0 +BITMAP +80 +80 +80 +A0 +D0 +90 +A0 +C0 +ENDCHAR +STARTCHAR uni266E +ENCODING 9838 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 0 0 +BITMAP +80 +80 +B0 +D0 +B0 +D0 +10 +10 +ENDCHAR +STARTCHAR uni266F +ENCODING 9839 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +58 +70 +D0 +58 +70 +D0 +40 +ENDCHAR +STARTCHAR uni2680 +ENCODING 9856 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +F8 +F8 +F8 +D8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni2681 +ENCODING 9857 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +F8 +E8 +F8 +F8 +F8 +B8 +F8 +ENDCHAR +STARTCHAR uni2682 +ENCODING 9858 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +F8 +E8 +F8 +D8 +F8 +B8 +F8 +ENDCHAR +STARTCHAR uni2683 +ENCODING 9859 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +F8 +A8 +F8 +F8 +F8 +A8 +F8 +ENDCHAR +STARTCHAR uni2684 +ENCODING 9860 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +F8 +A8 +F8 +D8 +F8 +A8 +F8 +ENDCHAR +STARTCHAR uni2685 +ENCODING 9861 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +F8 +A8 +F8 +A8 +F8 +A8 +F8 +ENDCHAR +STARTCHAR uni271D +ENCODING 10013 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +30 +30 +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2780 +ENCODING 10112 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +B4 +94 +94 +94 +84 +78 +ENDCHAR +STARTCHAR uni2781 +ENCODING 10113 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +8C +94 +A4 +BC +84 +78 +ENDCHAR +STARTCHAR uni2782 +ENCODING 10114 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +8C +94 +8C +B4 +84 +78 +ENDCHAR +STARTCHAR uni2783 +ENCODING 10115 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +B4 +D4 +F4 +94 +84 +78 +ENDCHAR +STARTCHAR uni2784 +ENCODING 10116 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +BC +A4 +B4 +8C +B4 +84 +78 +ENDCHAR +STARTCHAR uni2785 +ENCODING 10117 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +A4 +B4 +AC +94 +84 +78 +ENDCHAR +STARTCHAR uni2786 +ENCODING 10118 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +F4 +94 +A4 +A4 +A4 +84 +78 +ENDCHAR +STARTCHAR uni2787 +ENCODING 10119 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +AC +94 +AC +94 +84 +78 +ENDCHAR +STARTCHAR uni2788 +ENCODING 10120 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +D4 +B4 +94 +A4 +84 +78 +ENDCHAR +STARTCHAR uni2789 +ENCODING 10121 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +CC +D4 +D4 +D4 +CC +84 +78 +ENDCHAR +STARTCHAR uni278A +ENCODING 10122 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +EC +CC +EC +EC +EC +FC +78 +ENDCHAR +STARTCHAR uni278B +ENCODING 10123 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +CC +B4 +EC +DC +84 +FC +78 +ENDCHAR +STARTCHAR uni278C +ENCODING 10124 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +CC +B4 +EC +B4 +CC +FC +78 +ENDCHAR +STARTCHAR uni278D +ENCODING 10125 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +EC +CC +AC +84 +EC +FC +78 +ENDCHAR +STARTCHAR uni278E +ENCODING 10126 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +84 +BC +8C +F4 +8C +FC +78 +ENDCHAR +STARTCHAR uni278F +ENCODING 10127 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +CC +BC +8C +B4 +CC +FC +78 +ENDCHAR +STARTCHAR uni2790 +ENCODING 10128 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +84 +F4 +EC +DC +DC +FC +78 +ENDCHAR +STARTCHAR uni2791 +ENCODING 10129 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +CC +B4 +CC +B4 +CC +FC +78 +ENDCHAR +STARTCHAR uni2792 +ENCODING 10130 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +CC +B4 +C4 +F4 +CC +FC +78 +ENDCHAR +STARTCHAR uni2793 +ENCODING 10131 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +B4 +AC +AC +AC +B4 +FC +78 +ENDCHAR +STARTCHAR uni27A1 +ENCODING 10145 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +F0 +F8 +F0 +20 +ENDCHAR +STARTCHAR uni29CE +ENCODING 10702 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +18 +78 +C8 +78 +18 +C0 +F0 +98 +F0 +C0 +ENDCHAR +STARTCHAR uni29CF +ENCODING 10703 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +28 +68 +A8 +68 +28 +ENDCHAR +STARTCHAR uni29D0 +ENCODING 10704 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +A0 +B0 +A8 +B0 +A0 +ENDCHAR +STARTCHAR uni29D1 +ENCODING 10705 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +88 +D8 +E8 +D8 +88 +ENDCHAR +STARTCHAR uni29D2 +ENCODING 10706 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +88 +D8 +B8 +D8 +88 +ENDCHAR +STARTCHAR uni29D3 +ENCODING 10707 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +88 +D8 +F8 +D8 +88 +ENDCHAR +STARTCHAR uni29D4 +ENCODING 10708 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +88 +D0 +E0 +D0 +88 +ENDCHAR +STARTCHAR uni29D5 +ENCODING 10709 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +88 +58 +38 +58 +88 +ENDCHAR +STARTCHAR uni29D6 +ENCODING 10710 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +50 +20 +50 +F8 +ENDCHAR +STARTCHAR uni29D7 +ENCODING 10711 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +70 +20 +70 +F8 +ENDCHAR +STARTCHAR uni2A00 +ENCODING 10752 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +70 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2A01 +ENCODING 10753 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +70 +A8 +F8 +A8 +70 +ENDCHAR +STARTCHAR uni2A02 +ENCODING 10754 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +70 +D8 +A8 +D8 +70 +ENDCHAR +STARTCHAR uni2A03 +ENCODING 10755 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +88 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2A04 +ENCODING 10756 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +A8 +F8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2A05 +ENCODING 10757 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni2A06 +ENCODING 10758 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2A09 +ENCODING 10761 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni2B00 +ENCODING 11008 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +78 +38 +58 +A8 +C0 +ENDCHAR +STARTCHAR uni2B01 +ENCODING 11009 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F0 +E0 +D0 +A8 +18 +ENDCHAR +STARTCHAR uni2B02 +ENCODING 11010 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +C0 +A8 +58 +38 +78 +ENDCHAR +STARTCHAR uni2B03 +ENCODING 11011 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +18 +A8 +D0 +E0 +F0 +ENDCHAR +STARTCHAR uni2B04 +ENCODING 11012 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 5 0 2 +BITMAP +48 +FC +CC +FC +48 +ENDCHAR +STARTCHAR uni2B05 +ENCODING 11013 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +78 +F8 +78 +20 +ENDCHAR +STARTCHAR uni2B06 +ENCODING 11014 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +70 +F8 +70 +70 +ENDCHAR +STARTCHAR uni2B07 +ENCODING 11015 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +70 +70 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2B08 +ENCODING 11016 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +78 +38 +78 +E8 +C0 +ENDCHAR +STARTCHAR uni2B09 +ENCODING 11017 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F0 +E0 +F0 +B8 +18 +ENDCHAR +STARTCHAR uni2B0A +ENCODING 11018 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +C0 +E8 +78 +38 +78 +ENDCHAR +STARTCHAR uni2B0B +ENCODING 11019 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +18 +B8 +F0 +E0 +F0 +ENDCHAR +STARTCHAR uni2B0C +ENCODING 11020 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 5 0 2 +BITMAP +48 +FC +FC +FC +48 +ENDCHAR +STARTCHAR uni2B0D +ENCODING 11021 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +20 +70 +F8 +70 +70 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2B12 +ENCODING 11026 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +F8 +F8 +88 +F8 +ENDCHAR +STARTCHAR uni2B13 +ENCODING 11027 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +88 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni2B14 +ENCODING 11028 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +F8 +B8 +98 +F8 +ENDCHAR +STARTCHAR uni2B15 +ENCODING 11029 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +88 +C8 +E8 +F8 +ENDCHAR +STARTCHAR uni2B16 +ENCODING 11030 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +70 +E8 +70 +20 +ENDCHAR +STARTCHAR uni2B17 +ENCODING 11031 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +70 +B8 +70 +20 +ENDCHAR +STARTCHAR uni2B18 +ENCODING 11032 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +70 +F8 +50 +20 +ENDCHAR +STARTCHAR uni2B19 +ENCODING 11033 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +50 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2B2C +ENCODING 11052 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 4 0 2 +BITMAP +78 +FC +FC +78 +ENDCHAR +STARTCHAR uni2B2D +ENCODING 11053 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 4 0 2 +BITMAP +78 +CC +CC +78 +ENDCHAR +STARTCHAR uni2B2E +ENCODING 11054 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 6 1 1 +BITMAP +60 +F0 +F0 +F0 +F0 +60 +ENDCHAR +STARTCHAR uni2B2F +ENCODING 11055 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 6 1 1 +BITMAP +60 +F0 +90 +90 +F0 +60 +ENDCHAR +STARTCHAR uniA730 +ENCODING 42800 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +C0 +F0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uniA731 +ENCODING 42801 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +C0 +70 +18 +18 +F0 +ENDCHAR +STARTCHAR uniFE7C +ENCODING 65148 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 4 0 6 +BITMAP +A8 +B8 +F0 +40 +ENDCHAR +STARTCHAR uniFE7D +ENCODING 65149 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +A8 +B8 +F0 +40 +00 +00 +00 +00 +00 +FC +ENDCHAR +STARTCHAR uniFE7E +ENCODING 65150 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR uniFE7F +ENCODING 65151 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +20 +70 +20 +00 +00 +00 +00 +00 +00 +FC +ENDCHAR +STARTCHAR uniFE80 +ENCODING 65152 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 5 2 1 +BITMAP +60 +C0 +C0 +60 +C0 +ENDCHAR +STARTCHAR uniFE81 +ENCODING 65153 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +50 +A0 +00 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uniFE82 +ENCODING 65154 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 1 0 +BITMAP +50 +A0 +00 +60 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR uniFE83 +ENCODING 65155 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +60 +C0 +E0 +00 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uniFE84 +ENCODING 65156 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 1 0 +BITMAP +60 +C0 +E0 +00 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR uniFE85 +ENCODING 65157 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +30 +60 +70 +00 +30 +78 +58 +38 +18 +F0 +ENDCHAR +STARTCHAR uniFE86 +ENCODING 65158 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +30 +60 +70 +00 +30 +78 +58 +3C +18 +F0 +ENDCHAR +STARTCHAR uniFE87 +ENCODING 65159 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 -2 +BITMAP +60 +60 +60 +60 +60 +60 +00 +60 +C0 +E0 +ENDCHAR +STARTCHAR uniFE88 +ENCODING 65160 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +38 +6C +C0 +E0 +ENDCHAR +STARTCHAR uniFE89 +ENCODING 65161 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +60 +C0 +E0 +08 +1C +54 +D8 +D8 +70 +ENDCHAR +STARTCHAR uniFE8A +ENCODING 65162 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +60 +C0 +E0 +00 +48 +DC +F4 +60 +ENDCHAR +STARTCHAR uniFE8B +ENCODING 65163 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 0 0 +BITMAP +30 +60 +70 +00 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR uniFE8C +ENCODING 65164 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +30 +60 +70 +00 +30 +30 +70 +DC +ENDCHAR +STARTCHAR uniFE8D +ENCODING 65165 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 8 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uniFE8E +ENCODING 65166 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +70 +ENDCHAR +STARTCHAR uniFE8F +ENCODING 65167 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +30 +98 +D8 +70 +00 +20 +ENDCHAR +STARTCHAR uniFE90 +ENCODING 65168 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +30 +98 +DC +74 +00 +20 +ENDCHAR +STARTCHAR uniFE91 +ENCODING 65169 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 6 0 -2 +BITMAP +30 +30 +30 +E0 +00 +20 +ENDCHAR +STARTCHAR uniFE92 +ENCODING 65170 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +30 +30 +70 +DC +00 +20 +ENDCHAR +STARTCHAR uniFE93 +ENCODING 65171 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +60 +D0 +D8 +D8 +70 +ENDCHAR +STARTCHAR uniFE94 +ENCODING 65172 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +50 +00 +30 +58 +D8 +DC +74 +ENDCHAR +STARTCHAR uniFE95 +ENCODING 65173 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +50 +00 +30 +98 +D8 +70 +ENDCHAR +STARTCHAR uniFE96 +ENCODING 65174 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +50 +00 +30 +98 +DC +74 +ENDCHAR +STARTCHAR uniFE97 +ENCODING 65175 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 6 0 0 +BITMAP +50 +00 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR uniFE98 +ENCODING 65176 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +50 +00 +30 +30 +70 +DC +ENDCHAR +STARTCHAR uniFE99 +ENCODING 65177 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +50 +00 +30 +98 +D8 +70 +ENDCHAR +STARTCHAR uniFE9A +ENCODING 65178 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +20 +00 +50 +00 +30 +98 +DC +74 +ENDCHAR +STARTCHAR uniFE9B +ENCODING 65179 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 0 0 +BITMAP +20 +00 +50 +00 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR uniFE9C +ENCODING 65180 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +20 +00 +50 +00 +30 +30 +70 +DC +ENDCHAR +STARTCHAR uniFE9D +ENCODING 65181 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F8 +30 +60 +C0 +D0 +C0 +60 +38 +ENDCHAR +STARTCHAR uniFE9E +ENCODING 65182 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +F8 +30 +78 +CC +D4 +C0 +60 +38 +ENDCHAR +STARTCHAR uniFE9F +ENCODING 65183 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +70 +18 +30 +E0 +00 +20 +ENDCHAR +STARTCHAR uniFEA0 +ENCODING 65184 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +70 +18 +3C +E4 +00 +20 +ENDCHAR +STARTCHAR uniFEA1 +ENCODING 65185 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F8 +30 +60 +C0 +C0 +C0 +60 +38 +ENDCHAR +STARTCHAR uniFEA2 +ENCODING 65186 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +F8 +30 +78 +CC +C4 +C0 +60 +38 +ENDCHAR +STARTCHAR uniFEA3 +ENCODING 65187 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +70 +18 +30 +E0 +ENDCHAR +STARTCHAR uniFEA4 +ENCODING 65188 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +70 +18 +3C +E4 +ENDCHAR +STARTCHAR uniFEA5 +ENCODING 65189 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +00 +F8 +30 +60 +C0 +C0 +C0 +60 +38 +ENDCHAR +STARTCHAR uniFEA6 +ENCODING 65190 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +20 +00 +F8 +30 +78 +CC +C4 +C0 +60 +38 +ENDCHAR +STARTCHAR uniFEA7 +ENCODING 65191 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +00 +70 +18 +30 +E0 +ENDCHAR +STARTCHAR uniFEA8 +ENCODING 65192 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +20 +00 +70 +18 +3C +E4 +ENDCHAR +STARTCHAR uniFEA9 +ENCODING 65193 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +60 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR uniFEAA +ENCODING 65194 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 1 0 +BITMAP +60 +30 +30 +38 +E8 +ENDCHAR +STARTCHAR uniFEAB +ENCODING 65195 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +00 +60 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR uniFEAC +ENCODING 65196 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 1 0 +BITMAP +40 +00 +60 +30 +30 +38 +E8 +ENDCHAR +STARTCHAR uniFEAD +ENCODING 65197 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 -1 +BITMAP +18 +18 +18 +30 +E0 +ENDCHAR +STARTCHAR uniFEAE +ENCODING 65198 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 5 0 -1 +BITMAP +18 +18 +1C +34 +E0 +ENDCHAR +STARTCHAR uniFEAF +ENCODING 65199 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +08 +00 +18 +18 +18 +30 +E0 +ENDCHAR +STARTCHAR uniFEB0 +ENCODING 65200 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +08 +00 +18 +18 +1C +34 +E0 +ENDCHAR +STARTCHAR uniFEB1 +ENCODING 65201 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +04 +54 +54 +7C +38 +A0 +40 +ENDCHAR +STARTCHAR uniFEB2 +ENCODING 65202 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +04 +54 +54 +7C +38 +A0 +40 +ENDCHAR +STARTCHAR uniFEB3 +ENCODING 65203 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +04 +54 +54 +7C +F8 +ENDCHAR +STARTCHAR uniFEB4 +ENCODING 65204 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +04 +54 +54 +7C +F8 +ENDCHAR +STARTCHAR uniFEB5 +ENCODING 65205 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +20 +00 +50 +04 +54 +54 +7C +38 +A0 +40 +ENDCHAR +STARTCHAR uniFEB6 +ENCODING 65206 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +20 +00 +50 +04 +54 +54 +7C +38 +A0 +40 +ENDCHAR +STARTCHAR uniFEB7 +ENCODING 65207 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +20 +00 +50 +04 +54 +54 +7C +F8 +ENDCHAR +STARTCHAR uniFEB8 +ENCODING 65208 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +20 +00 +50 +04 +54 +54 +7C +F8 +ENDCHAR +STARTCHAR uniFEB9 +ENCODING 65209 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +28 +3C +B4 +B8 +E0 +40 +ENDCHAR +STARTCHAR uniFEBA +ENCODING 65210 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +28 +3C +B4 +BC +E0 +40 +ENDCHAR +STARTCHAR uniFEBB +ENCODING 65211 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +48 +5C +F4 +B8 +ENDCHAR +STARTCHAR uniFEBC +ENCODING 65212 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +48 +5C +F4 +BC +ENDCHAR +STARTCHAR uniFEBD +ENCODING 65213 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +20 +00 +28 +3C +B4 +B8 +E0 +40 +ENDCHAR +STARTCHAR uniFEBE +ENCODING 65214 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +20 +00 +28 +3C +B4 +BC +E0 +40 +ENDCHAR +STARTCHAR uniFEBF +ENCODING 65215 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +20 +00 +48 +5C +F4 +B8 +ENDCHAR +STARTCHAR uniFEC0 +ENCODING 65216 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +20 +00 +48 +5C +F4 +BC +ENDCHAR +STARTCHAR uniFEC1 +ENCODING 65217 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +60 +60 +60 +70 +78 +68 +F0 +ENDCHAR +STARTCHAR uniFEC2 +ENCODING 65218 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +60 +60 +60 +60 +70 +78 +68 +F4 +ENDCHAR +STARTCHAR uniFEC3 +ENCODING 65219 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +60 +60 +60 +70 +78 +68 +F0 +ENDCHAR +STARTCHAR uniFEC4 +ENCODING 65220 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +60 +60 +60 +60 +70 +78 +68 +F4 +ENDCHAR +STARTCHAR uniFEC5 +ENCODING 65221 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +60 +60 +68 +60 +70 +78 +68 +F4 +ENDCHAR +STARTCHAR uniFEC6 +ENCODING 65222 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +60 +60 +68 +60 +70 +78 +68 +F4 +ENDCHAR +STARTCHAR uniFEC7 +ENCODING 65223 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +60 +68 +60 +70 +78 +68 +F0 +ENDCHAR +STARTCHAR uniFEC8 +ENCODING 65224 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +60 +60 +68 +60 +70 +78 +68 +F4 +ENDCHAR +STARTCHAR uniFEC9 +ENCODING 65225 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +60 +C0 +C0 +70 +C0 +C0 +D8 +70 +ENDCHAR +STARTCHAR uniFECA +ENCODING 65226 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +70 +D8 +70 +D8 +CC +C0 +70 +ENDCHAR +STARTCHAR uniFECB +ENCODING 65227 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +30 +60 +60 +38 +60 +C0 +ENDCHAR +STARTCHAR uniFECC +ENCODING 65228 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +70 +50 +70 +20 +70 +DC +ENDCHAR +STARTCHAR uniFECD +ENCODING 65229 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +40 +00 +60 +C0 +C0 +70 +C0 +C0 +D8 +70 +ENDCHAR +STARTCHAR uniFECE +ENCODING 65230 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +20 +00 +70 +D8 +70 +D8 +CC +C0 +70 +ENDCHAR +STARTCHAR uniFECF +ENCODING 65231 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +00 +30 +60 +60 +38 +60 +C0 +ENDCHAR +STARTCHAR uniFED0 +ENCODING 65232 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +20 +00 +20 +70 +50 +70 +20 +70 +DC +ENDCHAR +STARTCHAR uniFED1 +ENCODING 65233 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +30 +28 +B8 +D8 +70 +ENDCHAR +STARTCHAR uniFED2 +ENCODING 65234 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +10 +00 +30 +28 +B8 +DC +70 +ENDCHAR +STARTCHAR uniFED3 +ENCODING 65235 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 0 -1 +BITMAP +20 +00 +60 +50 +30 +10 +30 +E0 +ENDCHAR +STARTCHAR uniFED4 +ENCODING 65236 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +20 +00 +20 +70 +50 +70 +20 +FC +ENDCHAR +STARTCHAR uniFED5 +ENCODING 65237 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +28 +00 +30 +28 +B8 +D8 +70 +ENDCHAR +STARTCHAR uniFED6 +ENCODING 65238 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +28 +00 +30 +28 +B8 +DC +70 +ENDCHAR +STARTCHAR uniFED7 +ENCODING 65239 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 0 -1 +BITMAP +50 +00 +60 +50 +30 +10 +30 +E0 +ENDCHAR +STARTCHAR uniFED8 +ENCODING 65240 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +50 +00 +20 +70 +50 +70 +20 +FC +ENDCHAR +STARTCHAR uniFED9 +ENCODING 65241 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +58 +98 +58 +98 +18 +98 +98 +70 +ENDCHAR +STARTCHAR uniFEDA +ENCODING 65242 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +58 +98 +58 +98 +18 +98 +98 +7C +ENDCHAR +STARTCHAR uniFEDB +ENCODING 65243 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +18 +70 +C0 +C0 +60 +30 +18 +18 +F0 +ENDCHAR +STARTCHAR uniFEDC +ENCODING 65244 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +18 +70 +C0 +C0 +60 +30 +18 +1C +F4 +ENDCHAR +STARTCHAR uniFEDD +ENCODING 65245 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +58 +D8 +D8 +70 +ENDCHAR +STARTCHAR uniFEDE +ENCODING 65246 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +58 +DC +D8 +70 +ENDCHAR +STARTCHAR uniFEDF +ENCODING 65247 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 0 0 +BITMAP +30 +30 +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR uniFEE0 +ENCODING 65248 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +30 +30 +30 +30 +30 +30 +38 +EC +ENDCHAR +STARTCHAR uniFEE1 +ENCODING 65249 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +70 +D8 +D8 +F0 +80 +80 +ENDCHAR +STARTCHAR uniFEE2 +ENCODING 65250 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +70 +D8 +DC +F4 +80 +80 +ENDCHAR +STARTCHAR uniFEE3 +ENCODING 65251 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +70 +D8 +D8 +F0 +ENDCHAR +STARTCHAR uniFEE4 +ENCODING 65252 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +70 +D8 +DC +F4 +ENDCHAR +STARTCHAR uniFEE5 +ENCODING 65253 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +20 +00 +30 +98 +D8 +D8 +70 +ENDCHAR +STARTCHAR uniFEE6 +ENCODING 65254 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +20 +00 +30 +98 +D8 +DC +70 +ENDCHAR +STARTCHAR uniFEE7 +ENCODING 65255 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 6 0 0 +BITMAP +20 +00 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR uniFEE8 +ENCODING 65256 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +20 +00 +30 +30 +70 +FC +ENDCHAR +STARTCHAR uniFEE9 +ENCODING 65257 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +60 +D0 +D8 +D8 +70 +ENDCHAR +STARTCHAR uniFEEA +ENCODING 65258 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +30 +58 +D8 +DC +74 +ENDCHAR +STARTCHAR uniFEEB +ENCODING 65259 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +E0 +30 +58 +E8 +A8 +E8 +58 +F0 +ENDCHAR +STARTCHAR uniFEEC +ENCODING 65260 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +10 +38 +68 +FC +68 +30 +ENDCHAR +STARTCHAR uniFEED +ENCODING 65261 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +70 +D8 +D8 +78 +18 +F0 +ENDCHAR +STARTCHAR uniFEEE +ENCODING 65262 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +70 +D8 +D8 +7C +18 +F0 +ENDCHAR +STARTCHAR uniFEEF +ENCODING 65263 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 -1 +BITMAP +08 +1C +14 +D8 +D8 +70 +ENDCHAR +STARTCHAR uniFEF0 +ENCODING 65264 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 5 0 -1 +BITMAP +08 +1C +D4 +F4 +60 +ENDCHAR +STARTCHAR uniFEF1 +ENCODING 65265 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +08 +1C +50 +D8 +D8 +70 +00 +50 +ENDCHAR +STARTCHAR uniFEF2 +ENCODING 65266 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +08 +5C +D4 +F4 +60 +00 +50 +ENDCHAR +STARTCHAR uniFEF3 +ENCODING 65267 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 6 0 -2 +BITMAP +30 +30 +30 +E0 +00 +50 +ENDCHAR +STARTCHAR uniFEF4 +ENCODING 65268 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +30 +30 +70 +DC +00 +50 +ENDCHAR +STARTCHAR uniFEF5 +ENCODING 65269 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +A0 +18 +58 +58 +38 +38 +18 +18 +70 +ENDCHAR +STARTCHAR uniFEF6 +ENCODING 65270 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +50 +A0 +18 +58 +58 +38 +38 +18 +1C +74 +ENDCHAR +STARTCHAR uniFEF7 +ENCODING 65271 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +60 +C0 +E0 +58 +58 +38 +38 +18 +18 +70 +ENDCHAR +STARTCHAR uniFEF8 +ENCODING 65272 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +60 +C0 +E0 +18 +58 +38 +38 +18 +1C +74 +ENDCHAR +STARTCHAR uniFEF9 +ENCODING 65273 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +18 +58 +58 +38 +38 +18 +D8 +70 +C0 +E0 +ENDCHAR +STARTCHAR uniFEFA +ENCODING 65274 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +18 +58 +58 +38 +38 +18 +DC +74 +C0 +E0 +ENDCHAR +STARTCHAR uniFEFB +ENCODING 65275 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +30 +B0 +B0 +70 +70 +30 +30 +E0 +ENDCHAR +STARTCHAR uniFEFC +ENCODING 65276 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 1 0 +BITMAP +30 +B0 +B0 +70 +70 +30 +38 +E8 +ENDCHAR +STARTCHAR uniFFFD +ENCODING 65533 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +F8 +ENDCHAR +ENDFONT diff --git a/app/src/gambas3/font/GambasBold-13.bdf b/app/src/gambas3/font/GambasBold-13.bdf new file mode 100644 index 00000000..7b1aba6f --- /dev/null +++ b/app/src/gambas3/font/GambasBold-13.bdf @@ -0,0 +1,41652 @@ +STARTFONT 2.1 +FONT -xos4-Gambas-Bold-R-Normal--13-120-75-75-P-70-ISO10646-1 +SIZE 12 75 75 +FONTBOUNDINGBOX 7 14 0 -2 +COMMENT "Generated by fontforge, http://fontforge.sourceforge.net" +COMMENT "Copyright (C) 2013 Benoit Minisini" +STARTPROPERTIES 33 +FOUNDRY "xos4" +FAMILY_NAME "Gambas" +WEIGHT_NAME "Bold" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 13 +POINT_SIZE 120 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 70 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +FONTNAME_REGISTRY "" +CHARSET_COLLECTIONS "ASCII ISOLatin1Encoding ISO8859-2 ISO8859-5 ISO8859-7 ISO8859-9 ISO8859-6 ISO8859-4 ISO10646-1" +FONT_NAME "GambasBold" +FACE_NAME "Gambas Bold" +FONT_VERSION "001.000" +FONT_ASCENT 11 +FONT_DESCENT 2 +UNDERLINE_POSITION -1 +UNDERLINE_THICKNESS 1 +X_HEIGHT 6 +CAP_HEIGHT 8 +RAW_ASCENT 846 +RAW_DESCENT 154 +NORM_SPACE 7 +RELATIVE_WEIGHT 50 +RELATIVE_SETWIDTH 50 +FIGURE_WIDTH 7 +AVG_LOWERCASE_WIDTH 70 +AVG_UPPERCASE_WIDTH 70 +ENDPROPERTIES +CHARS 2636 +STARTCHAR uni0000 +ENCODING 0 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +D8 +88 +00 +88 +88 +00 +00 +88 +D8 +ENDCHAR +STARTCHAR space +ENCODING 32 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 1 6 -2 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 9 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 3 1 7 +BITMAP +D8 +D8 +D8 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 1 1 +BITMAP +50 +F8 +F8 +50 +50 +F8 +F8 +50 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -1 +BITMAP +30 +30 +7C +C0 +C0 +78 +0C +0C +F8 +30 +30 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -1 +BITMAP +60 +D0 +D4 +6C +18 +30 +60 +D8 +B4 +34 +18 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +70 +D8 +D8 +70 +70 +FC +D8 +D8 +7C +ENDCHAR +STARTCHAR quotesingle +ENCODING 39 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 4 2 7 +BITMAP +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 11 1 -1 +BITMAP +30 +60 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +60 +30 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 11 1 -1 +BITMAP +C0 +60 +30 +30 +30 +30 +30 +30 +30 +60 +C0 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +D8 +70 +F8 +70 +D8 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +30 +30 +FC +30 +30 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 4 1 -2 +BITMAP +60 +60 +60 +C0 +ENDCHAR +STARTCHAR hyphen +ENCODING 45 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 1 0 4 +BITMAP +FC +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 2 2 0 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +0C +0C +18 +18 +30 +30 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +CC +DC +FC +EC +CC +CC +78 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +30 +70 +F0 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +0C +0C +18 +30 +60 +C0 +FC +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +0C +0C +78 +0C +0C +CC +78 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +08 +18 +38 +78 +D8 +FC +18 +18 +18 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +C0 +C0 +F8 +0C +0C +0C +CC +78 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +38 +60 +C0 +C0 +F8 +CC +CC +CC +78 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +0C +0C +18 +18 +30 +30 +60 +60 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +CC +CC +78 +CC +CC +CC +78 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +CC +CC +7C +0C +0C +18 +70 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 6 2 0 +BITMAP +C0 +C0 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 8 1 -2 +BITMAP +60 +60 +00 +00 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +0C +18 +30 +60 +C0 +60 +30 +18 +0C +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 4 0 2 +BITMAP +FC +00 +00 +FC +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C0 +60 +30 +18 +0C +18 +30 +60 +C0 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F0 +18 +18 +30 +60 +60 +00 +60 +60 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +38 +6C +DC +EC +EC +EC +D8 +60 +38 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +F8 +CC +CC +CC +F8 +CC +CC +CC +F8 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +7C +C0 +C0 +C0 +C0 +C0 +C0 +C0 +7C +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +F0 +D8 +CC +CC +CC +CC +CC +D8 +F0 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +C0 +C0 +C0 +F0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +7C +C0 +C0 +C0 +DC +CC +CC +CC +78 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +CC +CC +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +30 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +78 +30 +30 +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +CC +D8 +F0 +E0 +C0 +E0 +F0 +D8 +CC +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C4 +C4 +EC +EC +D4 +D4 +C4 +C4 +C4 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +8C +CC +EC +FC +FC +FC +DC +CC +C4 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +F8 +CC +CC +CC +F8 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +CC +CC +CC +CC +D4 +D8 +6C +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +F8 +CC +CC +CC +F8 +E0 +F0 +D8 +CC +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +7C +C0 +C0 +C0 +78 +0C +0C +0C +F8 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +CC +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +CC +CC +CC +78 +78 +78 +30 +30 +30 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C4 +C4 +C4 +D4 +D4 +EC +EC +C4 +C4 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +CC +CC +CC +78 +30 +78 +CC +CC +CC +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +CC +CC +78 +78 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +0C +18 +18 +30 +60 +60 +C0 +FC +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 11 1 -1 +BITMAP +F0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +F0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +C0 +C0 +60 +60 +30 +30 +18 +18 +0C +0C +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 11 1 -1 +BITMAP +F0 +30 +30 +30 +30 +30 +30 +30 +30 +30 +F0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 3 0 7 +BITMAP +30 +78 +CC +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 1 0 0 +BITMAP +FC +ENDCHAR +STARTCHAR grave +ENCODING 96 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 4 2 7 +BITMAP +C0 +C0 +C0 +60 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +0C +0C +7C +CC +CC +7C +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C0 +C0 +F8 +CC +CC +CC +CC +CC +F8 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +7C +C0 +C0 +C0 +C0 +C0 +7C +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +0C +0C +7C +CC +CC +CC +CC +CC +7C +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +CC +FC +C0 +C0 +7C +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +78 +C0 +C0 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +7C +CC +CC +CC +CC +CC +7C +0C +78 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C0 +C0 +F8 +CC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 10 1 0 +BITMAP +60 +60 +00 +E0 +60 +60 +60 +60 +60 +F0 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 12 0 -2 +BITMAP +18 +18 +00 +38 +18 +18 +18 +18 +18 +18 +18 +F0 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C0 +C0 +CC +D8 +F0 +E0 +F0 +D8 +CC +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 9 1 0 +BITMAP +E0 +60 +60 +60 +60 +60 +60 +60 +30 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +F8 +D4 +D4 +D4 +D4 +D4 +D4 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +F8 +CC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +F8 +CC +CC +CC +CC +CC +F8 +C0 +C0 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +7C +CC +CC +CC +CC +CC +7C +0C +0C +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +7C +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +7C +C0 +C0 +78 +0C +0C +F8 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +C0 +C0 +F8 +C0 +C0 +C0 +C0 +C0 +78 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +CC +CC +CC +CC +CC +CC +7C +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +CC +CC +78 +78 +78 +30 +30 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +C4 +C4 +C4 +D4 +D4 +EC +C4 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +CC +CC +78 +30 +78 +CC +CC +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +CC +CC +CC +CC +CC +DC +6C +0C +78 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +FC +0C +18 +30 +60 +C0 +FC +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 0 -1 +BITMAP +38 +60 +60 +60 +60 +C0 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 11 2 -1 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -1 +BITMAP +E0 +30 +30 +30 +30 +18 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 3 0 7 +BITMAP +64 +B4 +98 +ENDCHAR +STARTCHAR uni00A0 +ENCODING 160 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 1 6 -2 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 9 2 0 +BITMAP +C0 +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -1 +BITMAP +30 +30 +7C +C0 +C0 +C0 +C0 +C0 +7C +30 +30 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +3C +60 +60 +F8 +60 +60 +60 +60 +FC +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 1 +BITMAP +CC +78 +CC +CC +CC +78 +CC +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +CC +CC +78 +78 +30 +FC +30 +FC +30 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 10 2 0 +BITMAP +C0 +C0 +C0 +C0 +00 +00 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +78 +C0 +60 +F0 +D8 +78 +30 +18 +F0 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 1 1 10 +BITMAP +D8 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +38 +7C +E6 +DE +DE +DE +E6 +7C +38 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 4 +BITMAP +78 +0C +7C +CC +7C +00 +FC +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 2 +BITMAP +36 +6C +D8 +6C +36 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 4 0 3 +BITMAP +FC +0C +0C +0C +ENDCHAR +STARTCHAR uni00AD +ENCODING 173 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 1 0 4 +BITMAP +FC +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +38 +7C +CE +D6 +CE +D6 +D6 +7C +38 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 1 0 10 +BITMAP +FC +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 4 1 7 +BITMAP +70 +D8 +D8 +70 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 1 +BITMAP +30 +30 +FC +30 +30 +00 +FC +ENDCHAR +STARTCHAR uni00B2 +ENCODING 178 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 6 +BITMAP +F0 +18 +70 +C0 +F8 +ENDCHAR +STARTCHAR uni00B3 +ENCODING 179 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 6 +BITMAP +F0 +18 +70 +18 +F0 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 2 2 9 +BITMAP +60 +C0 +ENDCHAR +STARTCHAR uni00B5 +ENCODING 181 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +CC +CC +CC +CC +CC +CC +F8 +C0 +C0 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +7C +F4 +F4 +F4 +74 +34 +34 +34 +34 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 2 2 4 +BITMAP +E0 +E0 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 3 0 -2 +BITMAP +30 +30 +E0 +ENDCHAR +STARTCHAR uni00B9 +ENCODING 185 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 5 1 6 +BITMAP +60 +E0 +60 +60 +60 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 4 +BITMAP +78 +CC +CC +CC +78 +00 +FC +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 2 +BITMAP +D8 +6C +36 +6C +D8 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +30 +70 +30 +30 +30 +00 +FC +00 +18 +38 +58 +78 +18 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +30 +70 +30 +30 +30 +00 +FC +00 +70 +18 +30 +60 +78 +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +70 +18 +30 +18 +70 +00 +FC +00 +18 +38 +58 +78 +18 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +30 +30 +00 +30 +30 +60 +C0 +C0 +78 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +30 +78 +CC +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +30 +78 +CC +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +58 +00 +78 +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +64 +B4 +98 +00 +78 +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +6C +00 +78 +CC +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +58 +30 +00 +78 +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +7E +D8 +D8 +D8 +FE +D8 +D8 +D8 +DE +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +7C +C0 +C0 +C0 +C0 +C0 +C0 +C0 +7C +30 +E0 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +30 +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +30 +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +58 +00 +FC +C0 +C0 +F8 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +6C +00 +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +30 +FC +30 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +30 +FC +30 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +58 +00 +FC +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +6C +00 +FC +30 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +78 +6C +66 +66 +F6 +66 +66 +6C +78 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +64 +B4 +98 +00 +CC +EC +EC +FC +DC +DC +CC +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +30 +78 +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +30 +78 +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +58 +00 +78 +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +64 +B4 +98 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +6C +00 +78 +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +CC +78 +30 +78 +CC +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -1 +BITMAP +04 +78 +CC +DC +DC +FC +EC +EC +CC +78 +80 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +30 +CC +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +30 +CC +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +58 +00 +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +6C +00 +CC +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +30 +CC +CC +78 +78 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C0 +C0 +F8 +CC +CC +CC +F8 +C0 +C0 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +70 +D8 +D8 +F8 +CC +CC +CC +CC +F8 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +60 +30 +00 +78 +0C +0C +7C +CC +CC +7C +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +18 +30 +00 +78 +0C +0C +7C +CC +CC +7C +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +30 +58 +00 +78 +0C +0C +7C +CC +CC +7C +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +64 +B4 +98 +00 +78 +0C +0C +7C +CC +CC +7C +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +6C +00 +78 +0C +0C +7C +CC +CC +7C +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +58 +30 +00 +78 +0C +0C +7C +CC +CC +7C +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +7C +1A +1A +7C +D8 +D8 +7E +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +7C +C0 +C0 +C0 +C0 +C0 +7C +30 +E0 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +60 +30 +00 +78 +CC +CC +FC +C0 +C0 +7C +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +18 +30 +00 +78 +CC +CC +FC +C0 +C0 +7C +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +30 +58 +00 +78 +CC +CC +FC +C0 +C0 +7C +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +6C +00 +78 +CC +CC +FC +C0 +C0 +7C +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 10 1 0 +BITMAP +C0 +60 +00 +E0 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 10 1 0 +BITMAP +60 +C0 +00 +E0 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 10 1 0 +BITMAP +60 +B0 +00 +E0 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +D8 +00 +E0 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +70 +1C +38 +0C +7C +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +64 +B4 +98 +00 +F8 +CC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +60 +30 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +18 +30 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +30 +58 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +64 +B4 +98 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +6C +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 1 +BITMAP +30 +30 +00 +FC +00 +30 +30 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -1 +BITMAP +04 +78 +CC +DC +FC +EC +CC +78 +80 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +60 +30 +00 +CC +CC +CC +CC +CC +CC +7C +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +18 +30 +00 +CC +CC +CC +CC +CC +CC +7C +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +30 +58 +00 +CC +CC +CC +CC +CC +CC +7C +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +6C +00 +CC +CC +CC +CC +CC +CC +7C +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +18 +30 +00 +CC +CC +CC +CC +CC +CC +7C +0C +78 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +C0 +C0 +F8 +CC +CC +CC +CC +CC +F8 +C0 +C0 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +6C +00 +CC +CC +CC +CC +CC +CC +7C +0C +78 +ENDCHAR +STARTCHAR Amacron +ENCODING 256 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +00 +78 +CC +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR amacron +ENCODING 257 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +00 +78 +0C +0C +7C +CC +CC +7C +ENDCHAR +STARTCHAR Abreve +ENCODING 258 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +CC +78 +00 +78 +CC +CC +CC +FC +CC +CC +CC +ENDCHAR +STARTCHAR abreve +ENCODING 259 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +CC +78 +00 +78 +0C +0C +7C +CC +CC +7C +ENDCHAR +STARTCHAR Aogonek +ENCODING 260 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +78 +CC +CC +CC +FC +CC +CC +CC +CC +08 +06 +ENDCHAR +STARTCHAR aogonek +ENCODING 261 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 -2 +BITMAP +78 +0C +0C +7C +CC +CC +7C +08 +06 +ENDCHAR +STARTCHAR Cacute +ENCODING 262 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +30 +7C +C0 +C0 +C0 +C0 +C0 +C0 +C0 +7C +ENDCHAR +STARTCHAR cacute +ENCODING 263 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +18 +30 +00 +7C +C0 +C0 +C0 +C0 +C0 +7C +ENDCHAR +STARTCHAR Ccircumflex +ENCODING 264 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +58 +00 +7C +C0 +C0 +C0 +C0 +C0 +C0 +7C +ENDCHAR +STARTCHAR ccircumflex +ENCODING 265 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +30 +58 +00 +7C +C0 +C0 +C0 +C0 +C0 +7C +ENDCHAR +STARTCHAR Cdotaccent +ENCODING 266 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +00 +7C +C0 +C0 +C0 +C0 +C0 +C0 +C0 +7C +ENDCHAR +STARTCHAR cdotaccent +ENCODING 267 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +30 +00 +7C +C0 +C0 +C0 +C0 +C0 +7C +ENDCHAR +STARTCHAR Ccaron +ENCODING 268 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +CC +78 +00 +7C +C0 +C0 +C0 +C0 +C0 +C0 +7C +ENDCHAR +STARTCHAR ccaron +ENCODING 269 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +58 +30 +00 +7C +C0 +C0 +C0 +C0 +C0 +7C +ENDCHAR +STARTCHAR Dcaron +ENCODING 270 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +58 +30 +00 +F0 +D8 +CC +CC +CC +CC +D8 +F0 +ENDCHAR +STARTCHAR dcaron +ENCODING 271 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +58 +30 +0C +0C +7C +CC +CC +CC +CC +CC +7C +ENDCHAR +STARTCHAR Dcroat +ENCODING 272 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +78 +6C +66 +66 +F6 +66 +66 +6C +78 +ENDCHAR +STARTCHAR dcroat +ENCODING 273 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +0C +1E +0C +7C +CC +CC +CC +CC +7C +ENDCHAR +STARTCHAR Emacron +ENCODING 274 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +00 +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR emacron +ENCODING 275 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +00 +78 +CC +CC +FC +C0 +C0 +7C +ENDCHAR +STARTCHAR Ebreve +ENCODING 276 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +CC +78 +00 +FC +C0 +C0 +F8 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR ebreve +ENCODING 277 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +CC +78 +00 +78 +CC +CC +FC +C0 +C0 +7C +ENDCHAR +STARTCHAR Edotaccent +ENCODING 278 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +00 +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR edotaccent +ENCODING 279 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +30 +00 +78 +CC +CC +FC +C0 +C0 +7C +ENDCHAR +STARTCHAR Eogonek +ENCODING 280 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +FC +08 +06 +ENDCHAR +STARTCHAR eogonek +ENCODING 281 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 -2 +BITMAP +78 +CC +CC +FC +C0 +C0 +7C +08 +06 +ENDCHAR +STARTCHAR Ecaron +ENCODING 282 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +58 +30 +00 +FC +C0 +C0 +F8 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR ecaron +ENCODING 283 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +58 +30 +00 +78 +CC +CC +FC +C0 +C0 +7C +ENDCHAR +STARTCHAR Gcircumflex +ENCODING 284 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +58 +00 +7C +C0 +C0 +DC +CC +CC +CC +78 +ENDCHAR +STARTCHAR gcircumflex +ENCODING 285 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +30 +58 +00 +7C +CC +CC +CC +CC +CC +7C +0C +78 +ENDCHAR +STARTCHAR Gbreve +ENCODING 286 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +CC +78 +00 +7C +C0 +C0 +DC +CC +CC +CC +78 +ENDCHAR +STARTCHAR gbreve +ENCODING 287 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +CC +78 +00 +7C +CC +CC +CC +CC +CC +7C +0C +78 +ENDCHAR +STARTCHAR Gdotaccent +ENCODING 288 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +00 +7C +C0 +C0 +C0 +DC +CC +CC +CC +78 +ENDCHAR +STARTCHAR gdotaccent +ENCODING 289 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +30 +00 +7C +CC +CC +CC +CC +CC +7C +0C +78 +ENDCHAR +STARTCHAR Gcommaaccent +ENCODING 290 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +7C +C0 +C0 +C0 +DC +CC +CC +CC +78 +30 +E0 +ENDCHAR +STARTCHAR gcommaaccent +ENCODING 291 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +1C +30 +7C +CC +CC +CC +CC +CC +7C +0C +78 +ENDCHAR +STARTCHAR Hcircumflex +ENCODING 292 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +58 +00 +CC +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR hcircumflex +ENCODING 293 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +58 +00 +C0 +C0 +F8 +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR Hbar +ENCODING 294 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +CC +FE +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR hbar +ENCODING 295 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +60 +F8 +60 +78 +6C +6C +6C +6C +6C +ENDCHAR +STARTCHAR Itilde +ENCODING 296 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +64 +B4 +98 +00 +FC +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR itilde +ENCODING 297 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +64 +B4 +98 +00 +70 +30 +30 +30 +30 +30 +78 +ENDCHAR +STARTCHAR Imacron +ENCODING 298 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +00 +FC +30 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR imacron +ENCODING 299 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 9 1 0 +BITMAP +F0 +00 +E0 +60 +60 +60 +60 +60 +F0 +ENDCHAR +STARTCHAR Ibreve +ENCODING 300 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +CC +78 +00 +FC +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR ibreve +ENCODING 301 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +CC +78 +00 +70 +30 +30 +30 +30 +30 +78 +ENDCHAR +STARTCHAR Iogonek +ENCODING 302 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +FC +30 +30 +30 +30 +30 +30 +30 +FC +10 +0C +ENDCHAR +STARTCHAR iogonek +ENCODING 303 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +60 +60 +00 +E0 +60 +60 +60 +60 +60 +F0 +20 +18 +ENDCHAR +STARTCHAR Idotaccent +ENCODING 304 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +00 +FC +30 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR dotlessi +ENCODING 305 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 7 1 0 +BITMAP +E0 +60 +60 +60 +60 +60 +F0 +ENDCHAR +STARTCHAR IJ +ENCODING 306 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +F6 +66 +66 +66 +66 +66 +66 +66 +FC +ENDCHAR +STARTCHAR ij +ENCODING 307 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 12 0 -2 +BITMAP +66 +66 +00 +EE +66 +66 +66 +66 +66 +F6 +06 +1C +ENDCHAR +STARTCHAR Jcircumflex +ENCODING 308 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +2C +00 +3C +18 +18 +18 +18 +18 +18 +F0 +ENDCHAR +STARTCHAR jcircumflex +ENCODING 309 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 12 0 -2 +BITMAP +30 +58 +00 +70 +30 +30 +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR Kcommaaccent +ENCODING 310 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +CC +D8 +F0 +E0 +C0 +E0 +F0 +D8 +CC +30 +E0 +ENDCHAR +STARTCHAR kcommaaccent +ENCODING 311 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +C0 +C0 +CC +D8 +F0 +E0 +F0 +D8 +CC +30 +E0 +ENDCHAR +STARTCHAR kgreenlandic +ENCODING 312 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +CC +D8 +F0 +E0 +F0 +D8 +CC +ENDCHAR +STARTCHAR Lacute +ENCODING 313 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +30 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR lacute +ENCODING 314 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 11 1 0 +BITMAP +30 +60 +00 +E0 +60 +60 +60 +60 +60 +60 +30 +ENDCHAR +STARTCHAR Lcommaaccent +ENCODING 315 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FC +30 +E0 +ENDCHAR +STARTCHAR lcommaaccent +ENCODING 316 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 11 0 -2 +BITMAP +70 +30 +30 +30 +30 +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR Lcaron +ENCODING 317 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +58 +30 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR lcaron +ENCODING 318 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 11 1 0 +BITMAP +B0 +60 +00 +E0 +60 +60 +60 +60 +60 +60 +30 +ENDCHAR +STARTCHAR Ldot +ENCODING 319 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C0 +C0 +C0 +D8 +D8 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR ldot +ENCODING 320 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +E0 +60 +60 +6C +6C +60 +60 +60 +30 +ENDCHAR +STARTCHAR Lslash +ENCODING 321 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +60 +60 +60 +70 +E0 +60 +60 +60 +7E +ENDCHAR +STARTCHAR lslash +ENCODING 322 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 9 1 0 +BITMAP +E0 +60 +60 +70 +E0 +60 +60 +60 +30 +ENDCHAR +STARTCHAR Nacute +ENCODING 323 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +30 +CC +CC +EC +EC +FC +DC +DC +CC +CC +ENDCHAR +STARTCHAR nacute +ENCODING 324 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +18 +30 +00 +F8 +CC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR Ncommaaccent +ENCODING 325 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +CC +CC +EC +EC +FC +DC +DC +CC +CC +30 +E0 +ENDCHAR +STARTCHAR ncommaaccent +ENCODING 326 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +F8 +CC +CC +CC +CC +CC +CC +30 +E0 +ENDCHAR +STARTCHAR Ncaron +ENCODING 327 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +58 +30 +CC +CC +EC +EC +FC +DC +DC +CC +CC +ENDCHAR +STARTCHAR ncaron +ENCODING 328 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +58 +30 +00 +F8 +CC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR napostrophe +ENCODING 329 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +60 +C0 +00 +F8 +CC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR Eng +ENCODING 330 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +CC +CC +EC +EC +FC +DC +DC +CC +CC +0C +18 +ENDCHAR +STARTCHAR eng +ENCODING 331 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +F8 +CC +CC +CC +CC +CC +CC +0C +18 +ENDCHAR +STARTCHAR Omacron +ENCODING 332 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +00 +78 +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR omacron +ENCODING 333 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR Obreve +ENCODING 334 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +CC +78 +00 +78 +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR obreve +ENCODING 335 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +CC +78 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR Ohungarumlaut +ENCODING 336 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +6C +D8 +00 +78 +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR ohungarumlaut +ENCODING 337 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +6C +D8 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR OE +ENCODING 338 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +7E +D8 +D8 +D8 +DE +D8 +D8 +D8 +7E +ENDCHAR +STARTCHAR oe +ENCODING 339 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +7C +DA +DA +DC +D8 +D8 +7E +ENDCHAR +STARTCHAR Racute +ENCODING 340 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +30 +F8 +CC +CC +CC +F8 +E0 +F0 +D8 +CC +ENDCHAR +STARTCHAR racute +ENCODING 341 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +18 +30 +00 +7C +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Rcommaaccent +ENCODING 342 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +F8 +CC +CC +CC +F8 +E0 +F0 +D8 +CC +30 +E0 +ENDCHAR +STARTCHAR rcommaaccent +ENCODING 343 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +7C +C0 +C0 +C0 +C0 +C0 +C0 +30 +E0 +ENDCHAR +STARTCHAR Rcaron +ENCODING 344 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +58 +30 +00 +F8 +CC +CC +F8 +E0 +F0 +D8 +CC +ENDCHAR +STARTCHAR rcaron +ENCODING 345 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +58 +30 +00 +7C +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Sacute +ENCODING 346 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +30 +7C +C0 +C0 +C0 +78 +0C +0C +8C +78 +ENDCHAR +STARTCHAR sacute +ENCODING 347 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +18 +30 +00 +7C +C0 +C0 +78 +0C +0C +F8 +ENDCHAR +STARTCHAR Scircumflex +ENCODING 348 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +58 +00 +7C +C0 +C0 +78 +0C +0C +0C +F8 +ENDCHAR +STARTCHAR scircumflex +ENCODING 349 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +30 +58 +00 +7C +C0 +C0 +78 +0C +0C +F8 +ENDCHAR +STARTCHAR Scedilla +ENCODING 350 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +7C +C0 +C0 +C0 +78 +0C +0C +0C +F8 +30 +E0 +ENDCHAR +STARTCHAR scedilla +ENCODING 351 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +7C +C0 +C0 +78 +0C +0C +F8 +30 +E0 +ENDCHAR +STARTCHAR Scaron +ENCODING 352 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +58 +30 +00 +7C +C0 +C0 +78 +0C +0C +0C +F8 +ENDCHAR +STARTCHAR scaron +ENCODING 353 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +58 +30 +00 +7C +C0 +C0 +38 +0C +0C +F8 +ENDCHAR +STARTCHAR Tcommaaccent +ENCODING 354 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +FC +30 +30 +30 +30 +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR tcommaaccent +ENCODING 355 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +C0 +C0 +F8 +C0 +C0 +C0 +C0 +C0 +78 +30 +E0 +ENDCHAR +STARTCHAR Tcaron +ENCODING 356 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +58 +30 +00 +FC +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR tcaron +ENCODING 357 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +B0 +60 +00 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +78 +ENDCHAR +STARTCHAR Tbar +ENCODING 358 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +30 +30 +78 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR tbar +ENCODING 359 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +60 +60 +7C +60 +F0 +60 +60 +60 +3C +ENDCHAR +STARTCHAR Utilde +ENCODING 360 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +64 +B4 +98 +00 +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR utilde +ENCODING 361 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +64 +B4 +98 +00 +CC +CC +CC +CC +CC +CC +7C +ENDCHAR +STARTCHAR Umacron +ENCODING 362 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +00 +CC +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR umacron +ENCODING 363 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +00 +CC +CC +CC +CC +CC +CC +7C +ENDCHAR +STARTCHAR Ubreve +ENCODING 364 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +CC +78 +00 +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR ubreve +ENCODING 365 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +CC +78 +00 +CC +CC +CC +CC +CC +CC +7C +ENDCHAR +STARTCHAR Uring +ENCODING 366 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +58 +30 +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uring +ENCODING 367 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +58 +30 +00 +CC +CC +CC +CC +CC +CC +7C +ENDCHAR +STARTCHAR Uhungarumlaut +ENCODING 368 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +6C +D8 +00 +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uhungarumlaut +ENCODING 369 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +6C +D8 +00 +CC +CC +CC +CC +CC +CC +7C +ENDCHAR +STARTCHAR Uogonek +ENCODING 370 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +CC +CC +CC +CC +CC +CC +CC +CC +78 +10 +0C +ENDCHAR +STARTCHAR uogonek +ENCODING 371 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 -2 +BITMAP +CC +CC +CC +CC +CC +CC +7C +08 +06 +ENDCHAR +STARTCHAR Wcircumflex +ENCODING 372 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +58 +00 +C4 +C4 +D4 +D4 +EC +EC +C4 +C4 +ENDCHAR +STARTCHAR wcircumflex +ENCODING 373 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +30 +58 +00 +C4 +C4 +C4 +D4 +D4 +EC +C4 +ENDCHAR +STARTCHAR Ycircumflex +ENCODING 374 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +58 +00 +CC +CC +78 +78 +30 +30 +30 +30 +ENDCHAR +STARTCHAR ycircumflex +ENCODING 375 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +30 +58 +00 +CC +CC +CC +CC +CC +CC +7C +0C +78 +ENDCHAR +STARTCHAR Ydieresis +ENCODING 376 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +6C +00 +CC +CC +78 +78 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR Zacute +ENCODING 377 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +30 +FC +0C +18 +18 +30 +60 +60 +C0 +FC +ENDCHAR +STARTCHAR zacute +ENCODING 378 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +18 +30 +00 +FC +0C +18 +30 +60 +C0 +FC +ENDCHAR +STARTCHAR Zdotaccent +ENCODING 379 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +00 +FC +0C +18 +18 +30 +60 +60 +C0 +FC +ENDCHAR +STARTCHAR zdotaccent +ENCODING 380 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +30 +00 +FC +0C +18 +30 +60 +C0 +FC +ENDCHAR +STARTCHAR Zcaron +ENCODING 381 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +58 +30 +00 +FC +0C +18 +30 +30 +60 +C0 +FC +ENDCHAR +STARTCHAR zcaron +ENCODING 382 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +58 +30 +00 +FC +0C +18 +30 +60 +C0 +FC +ENDCHAR +STARTCHAR longs +ENCODING 383 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 9 1 0 +BITMAP +70 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni0180 +ENCODING 384 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +60 +F0 +60 +7C +66 +66 +66 +66 +7C +ENDCHAR +STARTCHAR uni0181 +ENCODING 385 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +7C +B6 +36 +36 +3C +36 +36 +36 +3C +ENDCHAR +STARTCHAR uni0182 +ENCODING 386 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +F8 +C0 +C0 +F8 +CC +CC +CC +CC +CC +F8 +ENDCHAR +STARTCHAR uni0183 +ENCODING 387 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +F8 +C0 +F8 +CC +CC +CC +CC +CC +F8 +ENDCHAR +STARTCHAR uni0184 +ENCODING 388 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +60 +E0 +7C +66 +66 +66 +66 +66 +7C +ENDCHAR +STARTCHAR uni0185 +ENCODING 389 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +60 +E0 +60 +7C +66 +66 +66 +7C +ENDCHAR +STARTCHAR uni0186 +ENCODING 390 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +F8 +0C +0C +0C +0C +0C +0C +0C +F8 +ENDCHAR +STARTCHAR uni0187 +ENCODING 391 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +06 +08 +7C +C0 +C0 +C0 +C0 +C0 +C0 +C0 +7C +ENDCHAR +STARTCHAR uni0188 +ENCODING 392 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +06 +08 +7C +C0 +C0 +C0 +C0 +C0 +7C +ENDCHAR +STARTCHAR uni0189 +ENCODING 393 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +78 +6C +66 +66 +F6 +66 +66 +6C +78 +ENDCHAR +STARTCHAR uni018A +ENCODING 394 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +78 +BC +36 +36 +36 +36 +36 +36 +3C +38 +ENDCHAR +STARTCHAR uni018B +ENCODING 395 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +7C +0C +0C +7C +CC +CC +CC +CC +CC +7C +ENDCHAR +STARTCHAR uni018C +ENCODING 396 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +7C +0C +7C +CC +CC +CC +CC +CC +7C +ENDCHAR +STARTCHAR uni018D +ENCODING 397 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +CC +CC +78 +30 +18 +0C +78 +ENDCHAR +STARTCHAR uni018E +ENCODING 398 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +0C +0C +0C +7C +0C +0C +0C +FC +ENDCHAR +STARTCHAR uni018F +ENCODING 399 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +F8 +0C +0C +0C +FC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni0190 +ENCODING 400 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +7C +C0 +C0 +C0 +78 +C0 +C0 +C0 +7C +ENDCHAR +STARTCHAR uni0191 +ENCODING 401 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 -1 +BITMAP +7E +60 +60 +60 +7C +60 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR florin +ENCODING 402 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +1C +30 +30 +78 +30 +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR uni0193 +ENCODING 403 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +02 +7C +C0 +C0 +C0 +DC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni0194 +ENCODING 404 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +CC +CC +78 +30 +78 +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni0195 +ENCODING 405 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +C0 +C0 +E0 +F6 +D6 +D6 +D6 +DE +CC +ENDCHAR +STARTCHAR uni0196 +ENCODING 406 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +F0 +60 +60 +60 +60 +60 +60 +60 +3C +ENDCHAR +STARTCHAR uni0197 +ENCODING 407 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +30 +30 +30 +78 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni0198 +ENCODING 408 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +06 +08 +CC +D8 +F0 +E0 +C0 +E0 +F0 +D8 +CC +ENDCHAR +STARTCHAR uni0199 +ENCODING 409 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +C0 +C6 +C8 +CC +D8 +F0 +E0 +F0 +D8 +CC +ENDCHAR +STARTCHAR uni019A +ENCODING 410 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 9 1 0 +BITMAP +E0 +60 +60 +60 +F0 +60 +60 +60 +30 +ENDCHAR +STARTCHAR uni019B +ENCODING 411 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C0 +60 +F8 +30 +30 +78 +78 +CC +CC +ENDCHAR +STARTCHAR uni019C +ENCODING 412 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C4 +C4 +C4 +C4 +D4 +D4 +D4 +D4 +6C +ENDCHAR +STARTCHAR uni019D +ENCODING 413 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +66 +66 +76 +76 +7E +6E +6E +66 +66 +20 +C0 +ENDCHAR +STARTCHAR uni019E +ENCODING 414 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +F8 +CC +CC +CC +CC +CC +CC +0C +0C +ENDCHAR +STARTCHAR uni019F +ENCODING 415 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +CC +CC +FC +CC +CC +CC +78 +ENDCHAR +STARTCHAR Ohorn +ENCODING 416 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +02 +7A +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR ohorn +ENCODING 417 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +02 +7A +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni01A2 +ENCODING 418 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +6C +FE +DA +DA +DA +DA +DA +DA +72 +ENDCHAR +STARTCHAR uni01A3 +ENCODING 419 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 -2 +BITMAP +6C +FE +DA +DA +DA +DA +72 +02 +02 +ENDCHAR +STARTCHAR uni01A4 +ENCODING 420 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +C0 +20 +7C +66 +66 +66 +7C +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni01A5 +ENCODING 421 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +C0 +20 +7C +66 +66 +66 +66 +66 +7C +60 +60 +ENDCHAR +STARTCHAR uni01A6 +ENCODING 422 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 -1 +BITMAP +C0 +F8 +CC +CC +CC +F8 +E0 +F0 +D8 +0C +ENDCHAR +STARTCHAR uni01A7 +ENCODING 423 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +F8 +0C +0C +0C +78 +C0 +C0 +C0 +7C +ENDCHAR +STARTCHAR uni01A8 +ENCODING 424 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +F8 +0C +0C +78 +C0 +C0 +7C +ENDCHAR +STARTCHAR uni01A9 +ENCODING 425 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +C0 +60 +30 +18 +30 +60 +C0 +FC +ENDCHAR +STARTCHAR uni01AA +ENCODING 426 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +70 +D8 +D8 +78 +18 +18 +18 +18 +18 +18 +0C +ENDCHAR +STARTCHAR uni01AB +ENCODING 427 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +C0 +C0 +F8 +C0 +C0 +C0 +C0 +C0 +78 +18 +30 +ENDCHAR +STARTCHAR uni01AC +ENCODING 428 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +7E +D8 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni01AD +ENCODING 429 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +60 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +C0 +78 +ENDCHAR +STARTCHAR uni01AE +ENCODING 430 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 -1 +BITMAP +FC +30 +30 +30 +30 +30 +30 +30 +30 +1C +ENDCHAR +STARTCHAR Uhorn +ENCODING 431 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +06 +CC +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uhorn +ENCODING 432 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +06 +CC +CC +CC +CC +CC +CC +7C +ENDCHAR +STARTCHAR uni01B1 +ENCODING 433 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +CC +48 +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni01B2 +ENCODING 434 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +06 +CC +CC +CC +78 +78 +78 +30 +30 +30 +ENDCHAR +STARTCHAR uni01B3 +ENCODING 435 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +06 +CC +CC +78 +78 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni01B4 +ENCODING 436 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +06 +08 +CC +CC +CC +CC +CC +DC +6C +0C +78 +ENDCHAR +STARTCHAR uni01B5 +ENCODING 437 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +0C +18 +18 +FC +60 +60 +C0 +FC +ENDCHAR +STARTCHAR uni01B6 +ENCODING 438 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +FC +0C +18 +FC +60 +C0 +FC +ENDCHAR +STARTCHAR uni01B7 +ENCODING 439 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +0C +18 +30 +78 +0C +0C +0C +F8 +ENDCHAR +STARTCHAR uni01B8 +ENCODING 440 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +C0 +60 +30 +78 +C0 +C0 +C0 +7C +ENDCHAR +STARTCHAR uni01B9 +ENCODING 441 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +FC +C0 +60 +30 +78 +C0 +C0 +C0 +7C +ENDCHAR +STARTCHAR uni01BA +ENCODING 442 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 -2 +BITMAP +7E +06 +06 +1C +06 +06 +7C +80 +60 +ENDCHAR +STARTCHAR uni01BB +ENCODING 443 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +F8 +0C +0C +18 +FC +60 +C0 +C0 +FC +ENDCHAR +STARTCHAR uni01BC +ENCODING 444 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +FE +60 +60 +7C +06 +06 +06 +06 +7C +ENDCHAR +STARTCHAR uni01BD +ENCODING 445 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +FE +60 +60 +7C +06 +06 +7C +ENDCHAR +STARTCHAR uni01BE +ENCODING 446 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C0 +F8 +C0 +60 +38 +0C +0C +0C +F8 +ENDCHAR +STARTCHAR uni01BF +ENCODING 447 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +F8 +CC +CC +CC +D8 +F0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni01C0 +ENCODING 448 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 9 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni01C1 +ENCODING 449 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +D8 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni01C2 +ENCODING 450 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +30 +30 +30 +FC +30 +FC +30 +30 +30 +ENDCHAR +STARTCHAR uni01C3 +ENCODING 451 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 9 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni01C4 +ENCODING 452 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +0A +04 +EE +D6 +D6 +D6 +DC +DC +DC +DC +EE +ENDCHAR +STARTCHAR uni01C5 +ENCODING 453 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +0A +E4 +D0 +DE +D6 +D6 +DE +DC +DC +EE +ENDCHAR +STARTCHAR uni01C6 +ENCODING 454 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +0A +14 +10 +7E +D6 +D6 +DE +DC +DC +7E +ENDCHAR +STARTCHAR uni01C7 +ENCODING 455 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +DC +CC +CC +CC +CC +CC +CC +CC +F8 +ENDCHAR +STARTCHAR uni01C8 +ENCODING 456 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +0C +CC +C0 +DC +CC +CC +CC +CC +CC +FC +0C +38 +ENDCHAR +STARTCHAR uni01C9 +ENCODING 457 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +0C +EC +60 +7C +6C +6C +6C +6C +6C +3C +0C +38 +ENDCHAR +STARTCHAR uni01CA +ENCODING 458 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +E6 +F6 +D6 +D6 +D6 +D6 +D6 +D6 +DC +ENDCHAR +STARTCHAR uni01CB +ENCODING 459 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 12 0 -2 +BITMAP +06 +E6 +F0 +D6 +D6 +D6 +D6 +D6 +D6 +D6 +06 +1C +ENDCHAR +STARTCHAR uni01CC +ENCODING 460 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 12 0 -2 +BITMAP +06 +06 +00 +EE +D6 +D6 +D6 +D6 +D6 +D6 +06 +1C +ENDCHAR +STARTCHAR uni01CD +ENCODING 461 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +58 +30 +00 +78 +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni01CE +ENCODING 462 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +58 +30 +00 +78 +0C +0C +7C +CC +CC +7C +ENDCHAR +STARTCHAR uni01CF +ENCODING 463 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +58 +30 +00 +FC +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni01D0 +ENCODING 464 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 10 1 0 +BITMAP +B0 +60 +00 +E0 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni01D1 +ENCODING 465 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +58 +30 +00 +78 +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni01D2 +ENCODING 466 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +58 +30 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni01D3 +ENCODING 467 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +58 +30 +00 +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni01D4 +ENCODING 468 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +58 +30 +00 +CC +CC +CC +CC +CC +CC +7C +ENDCHAR +STARTCHAR uni01D5 +ENCODING 469 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +00 +6C +00 +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni01D6 +ENCODING 470 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +00 +6C +00 +CC +CC +CC +CC +CC +CC +7C +ENDCHAR +STARTCHAR uni01D7 +ENCODING 471 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +30 +00 +6C +00 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni01D8 +ENCODING 472 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +30 +00 +6C +00 +CC +CC +CC +CC +CC +7C +ENDCHAR +STARTCHAR uni01D9 +ENCODING 473 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +58 +30 +00 +6C +00 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni01DA +ENCODING 474 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +58 +30 +00 +6C +00 +CC +CC +CC +CC +CC +7C +ENDCHAR +STARTCHAR uni01DB +ENCODING 475 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +30 +00 +6C +00 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni01DC +ENCODING 476 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +30 +00 +6C +00 +CC +CC +CC +CC +CC +7C +ENDCHAR +STARTCHAR uni01DD +ENCODING 477 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +F8 +0C +0C +FC +CC +CC +78 +ENDCHAR +STARTCHAR uni01DE +ENCODING 478 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +00 +6C +00 +78 +CC +CC +FC +CC +CC +CC +ENDCHAR +STARTCHAR uni01DF +ENCODING 479 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +00 +6C +00 +78 +0C +0C +7C +CC +CC +7C +ENDCHAR +STARTCHAR uni01E0 +ENCODING 480 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +00 +30 +00 +78 +CC +CC +FC +CC +CC +CC +ENDCHAR +STARTCHAR uni01E1 +ENCODING 481 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +00 +30 +00 +78 +0C +0C +7C +CC +CC +7C +ENDCHAR +STARTCHAR uni01E2 +ENCODING 482 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +3C +00 +7E +D8 +D8 +FE +D8 +D8 +D8 +D8 +DE +ENDCHAR +STARTCHAR uni01E3 +ENCODING 483 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +3C +00 +7C +1A +1A +7C +D8 +D8 +7E +ENDCHAR +STARTCHAR uni01E4 +ENCODING 484 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +7C +C0 +C0 +C0 +DC +CC +DE +CC +78 +ENDCHAR +STARTCHAR uni01E5 +ENCODING 485 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 -2 +BITMAP +7C +CC +CC +DE +CC +CC +7C +0C +78 +ENDCHAR +STARTCHAR Gcaron +ENCODING 486 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +58 +30 +00 +7C +C0 +C0 +DC +CC +CC +CC +78 +ENDCHAR +STARTCHAR gcaron +ENCODING 487 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +58 +30 +00 +7C +CC +CC +CC +CC +CC +7C +0C +78 +ENDCHAR +STARTCHAR uni01E8 +ENCODING 488 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +58 +30 +CC +D8 +F0 +E0 +C0 +E0 +F0 +D8 +CC +ENDCHAR +STARTCHAR uni01E9 +ENCODING 489 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +58 +30 +C0 +C0 +CC +D8 +F0 +E0 +F0 +D8 +CC +ENDCHAR +STARTCHAR uni01EA +ENCODING 490 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +78 +CC +CC +CC +CC +CC +CC +CC +78 +30 +1C +ENDCHAR +STARTCHAR uni01EB +ENCODING 491 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +78 +CC +CC +CC +CC +CC +78 +30 +1C +ENDCHAR +STARTCHAR uni01EC +ENCODING 492 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +78 +00 +78 +CC +CC +CC +CC +CC +CC +CC +78 +30 +1C +ENDCHAR +STARTCHAR uni01ED +ENCODING 493 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +78 +00 +78 +CC +CC +CC +CC +CC +78 +30 +1C +ENDCHAR +STARTCHAR uni01EE +ENCODING 494 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +58 +30 +00 +FC +0C +18 +38 +0C +0C +0C +F8 +ENDCHAR +STARTCHAR uni01EF +ENCODING 495 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +58 +30 +00 +FC +0C +18 +30 +78 +0C +0C +0C +F8 +ENDCHAR +STARTCHAR uni01F0 +ENCODING 496 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 12 0 -2 +BITMAP +58 +30 +00 +70 +30 +30 +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR uni01F1 +ENCODING 497 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +EE +D6 +D6 +D6 +DE +DC +DC +DC +EE +ENDCHAR +STARTCHAR uni01F2 +ENCODING 498 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +E0 +D0 +DE +D6 +D6 +DE +DC +DC +EE +ENDCHAR +STARTCHAR uni01F3 +ENCODING 499 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +10 +10 +7E +D6 +D6 +DE +DC +DC +7E +ENDCHAR +STARTCHAR uni01F4 +ENCODING 500 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +30 +7C +C0 +C0 +C0 +DC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni01F5 +ENCODING 501 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +18 +30 +00 +7C +CC +CC +CC +CC +CC +7C +0C +78 +ENDCHAR +STARTCHAR uni01F6 +ENCODING 502 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +D8 +D8 +DA +DA +FA +DA +DA +DA +CC +ENDCHAR +STARTCHAR uni01F7 +ENCODING 503 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +F8 +CC +CC +CC +CC +D8 +F0 +E0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni01F8 +ENCODING 504 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +30 +CC +CC +EC +EC +FC +DC +DC +CC +CC +ENDCHAR +STARTCHAR uni01F9 +ENCODING 505 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +60 +30 +00 +F8 +CC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR Aringacute +ENCODING 506 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +60 +B6 +6C +00 +78 +CC +CC +FC +CC +CC +CC +ENDCHAR +STARTCHAR aringacute +ENCODING 507 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +60 +B6 +6C +00 +78 +0C +7C +CC +CC +CC +7C +ENDCHAR +STARTCHAR AEacute +ENCODING 508 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +18 +30 +00 +7E +D8 +D8 +FE +D8 +D8 +D8 +DE +ENDCHAR +STARTCHAR aeacute +ENCODING 509 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +0C +18 +00 +7C +1A +1A +7E +D8 +D8 +7E +ENDCHAR +STARTCHAR Oslashacute +ENCODING 510 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 12 0 -1 +BITMAP +18 +30 +78 +CC +DC +DC +FC +EC +EC +CC +78 +80 +ENDCHAR +STARTCHAR oslashacute +ENCODING 511 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -1 +BITMAP +18 +30 +04 +78 +CC +DC +FC +EC +CC +78 +80 +ENDCHAR +STARTCHAR uni0200 +ENCODING 512 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +D8 +6C +00 +78 +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni0201 +ENCODING 513 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +D8 +6C +00 +78 +0C +7C +CC +CC +CC +7C +ENDCHAR +STARTCHAR uni0202 +ENCODING 514 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +CC +00 +78 +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni0203 +ENCODING 515 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +78 +CC +00 +78 +0C +7C +CC +CC +CC +7C +ENDCHAR +STARTCHAR uni0204 +ENCODING 516 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +D8 +6C +00 +FC +C0 +C0 +F8 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR uni0205 +ENCODING 517 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +D8 +6C +00 +78 +CC +CC +FC +C0 +C0 +7C +ENDCHAR +STARTCHAR uni0206 +ENCODING 518 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +CC +00 +FC +C0 +C0 +F8 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR uni0207 +ENCODING 519 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +78 +CC +00 +78 +CC +CC +FC +C0 +C0 +7C +ENDCHAR +STARTCHAR uni0208 +ENCODING 520 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +D8 +6C +00 +FC +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni0209 +ENCODING 521 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +D8 +6C +00 +70 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni020A +ENCODING 522 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +CC +00 +FC +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni020B +ENCODING 523 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +78 +CC +00 +70 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni020C +ENCODING 524 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +D8 +6C +00 +78 +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni020D +ENCODING 525 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +D8 +6C +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni020E +ENCODING 526 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +CC +00 +78 +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni020F +ENCODING 527 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +78 +CC +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni0210 +ENCODING 528 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +D8 +6C +00 +F8 +CC +CC +F8 +E0 +F0 +D8 +CC +ENDCHAR +STARTCHAR uni0211 +ENCODING 529 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +D8 +6C +00 +7C +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni0212 +ENCODING 530 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +CC +00 +F8 +CC +CC +F8 +E0 +F0 +D8 +CC +ENDCHAR +STARTCHAR uni0213 +ENCODING 531 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +78 +CC +00 +7C +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni0214 +ENCODING 532 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +D8 +6C +00 +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni0215 +ENCODING 533 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +D8 +6C +00 +CC +CC +CC +CC +CC +CC +7C +ENDCHAR +STARTCHAR uni0216 +ENCODING 534 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +CC +00 +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni0217 +ENCODING 535 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +78 +CC +00 +CC +CC +CC +CC +CC +CC +7C +ENDCHAR +STARTCHAR Scommaaccent +ENCODING 536 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +7C +C0 +C0 +C0 +78 +0C +0C +0C +F8 +30 +60 +ENDCHAR +STARTCHAR scommaaccent +ENCODING 537 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +7C +C0 +C0 +78 +0C +0C +F8 +30 +60 +ENDCHAR +STARTCHAR uni021A +ENCODING 538 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +FC +30 +30 +30 +30 +30 +30 +30 +30 +30 +60 +ENDCHAR +STARTCHAR uni021B +ENCODING 539 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +C0 +C0 +F0 +C0 +C0 +C0 +C0 +C0 +78 +60 +C0 +ENDCHAR +STARTCHAR uni021C +ENCODING 540 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 -1 +BITMAP +F8 +0C +0C +0C +38 +0C +0C +0C +38 +E0 +ENDCHAR +STARTCHAR uni021D +ENCODING 541 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +78 +0C +0C +38 +0C +0C +0C +38 +E0 +ENDCHAR +STARTCHAR uni021E +ENCODING 542 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +58 +30 +00 +CC +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni021F +ENCODING 543 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +58 +30 +C0 +C0 +F8 +CC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni0220 +ENCODING 544 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +F8 +CC +CC +CC +CC +CC +CC +CC +CC +0C +0C +ENDCHAR +STARTCHAR uni0221 +ENCODING 545 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +10 +10 +70 +D0 +D0 +D0 +DC +DA +7C +18 +18 +ENDCHAR +STARTCHAR uni0222 +ENCODING 546 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +CC +CC +CC +78 +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni0223 +ENCODING 547 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +CC +CC +78 +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni0224 +ENCODING 548 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +FC +0C +18 +18 +30 +60 +60 +C0 +FC +0C +18 +ENDCHAR +STARTCHAR uni0225 +ENCODING 549 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +FC +0C +18 +30 +60 +C0 +FC +0C +18 +ENDCHAR +STARTCHAR uni0226 +ENCODING 550 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +00 +78 +CC +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni0227 +ENCODING 551 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +30 +00 +78 +0C +7C +CC +CC +CC +7C +ENDCHAR +STARTCHAR uni0228 +ENCODING 552 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +FC +30 +E0 +ENDCHAR +STARTCHAR uni0229 +ENCODING 553 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +78 +CC +CC +FC +C0 +C0 +7C +30 +E0 +ENDCHAR +STARTCHAR uni022A +ENCODING 554 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +00 +6C +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni022B +ENCODING 555 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +78 +00 +6C +00 +78 +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni022C +ENCODING 556 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +00 +74 +D8 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni022D +ENCODING 557 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +00 +74 +D8 +00 +78 +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni022E +ENCODING 558 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +00 +78 +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni022F +ENCODING 559 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +30 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni0230 +ENCODING 560 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +00 +30 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni0231 +ENCODING 561 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +78 +00 +30 +00 +78 +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni0232 +ENCODING 562 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +00 +CC +CC +78 +78 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni0233 +ENCODING 563 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +78 +00 +CC +CC +CC +CC +CC +CC +7C +0C +78 +ENDCHAR +STARTCHAR uni0234 +ENCODING 564 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +E0 +60 +60 +60 +60 +60 +78 +74 +38 +30 +30 +ENDCHAR +STARTCHAR uni0235 +ENCODING 565 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +E0 +D0 +D0 +D0 +D0 +D0 +DC +DA +DC +18 +18 +ENDCHAR +STARTCHAR uni0236 +ENCODING 566 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +C0 +C0 +F0 +C0 +C0 +C0 +C8 +F4 +78 +30 +30 +ENDCHAR +STARTCHAR uni0237 +ENCODING 567 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 9 0 -2 +BITMAP +70 +30 +30 +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR uni0238 +ENCODING 568 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +30 +30 +78 +B4 +B4 +B4 +B4 +B4 +78 +ENDCHAR +STARTCHAR uni0239 +ENCODING 569 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +78 +B4 +B4 +B4 +B4 +B4 +78 +30 +30 +ENDCHAR +STARTCHAR uni023A +ENCODING 570 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -1 +BITMAP +04 +78 +CC +DC +DC +FC +EC +EC +CC +CC +80 +ENDCHAR +STARTCHAR uni023B +ENCODING 571 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -1 +BITMAP +08 +7C +C8 +C8 +D0 +D0 +D0 +D0 +E0 +7C +20 +ENDCHAR +STARTCHAR uni023C +ENCODING 572 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -1 +BITMAP +08 +7C +C8 +D0 +D0 +D0 +E0 +7C +20 +ENDCHAR +STARTCHAR uni023D +ENCODING 573 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +60 +60 +60 +F0 +60 +60 +60 +60 +7E +ENDCHAR +STARTCHAR uni023E +ENCODING 574 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +30 +30 +34 +38 +30 +30 +70 +B0 +ENDCHAR +STARTCHAR uni023F +ENCODING 575 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +7C +C0 +C0 +78 +0C +0C +F8 +60 +38 +ENDCHAR +STARTCHAR uni0240 +ENCODING 576 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +FC +0C +18 +30 +60 +C0 +C0 +60 +38 +ENDCHAR +STARTCHAR uni0241 +ENCODING 577 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F0 +18 +18 +30 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni0242 +ENCODING 578 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F0 +18 +18 +30 +60 +60 +60 +ENDCHAR +STARTCHAR uni0243 +ENCODING 579 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +7C +66 +66 +66 +7C +66 +F6 +66 +7C +ENDCHAR +STARTCHAR uni0244 +ENCODING 580 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +CC +CC +CC +FE +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni0245 +ENCODING 581 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +30 +30 +30 +78 +78 +78 +CC +CC +CC +ENDCHAR +STARTCHAR uni0246 +ENCODING 582 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -1 +BITMAP +08 +FC +C8 +C8 +D0 +F8 +D0 +D0 +E0 +FC +20 +ENDCHAR +STARTCHAR uni0247 +ENCODING 583 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -1 +BITMAP +08 +78 +CC +DC +FC +D0 +E0 +7C +20 +ENDCHAR +STARTCHAR uni0248 +ENCODING 584 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +3C +18 +18 +3C +18 +18 +18 +18 +F0 +ENDCHAR +STARTCHAR uni0249 +ENCODING 585 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 12 0 -2 +BITMAP +30 +30 +00 +70 +30 +30 +78 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR uni024A +ENCODING 586 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +7C +CC +CC +CC +CC +CC +7C +0C +0C +0C +06 +ENDCHAR +STARTCHAR uni024B +ENCODING 587 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 9 0 -2 +BITMAP +7C +CC +CC +CC +CC +7C +0C +0C +06 +ENDCHAR +STARTCHAR uni024C +ENCODING 588 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +7C +66 +66 +66 +FC +70 +78 +6C +66 +ENDCHAR +STARTCHAR uni024D +ENCODING 589 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +3E +60 +60 +F8 +60 +60 +60 +ENDCHAR +STARTCHAR uni024E +ENCODING 590 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +CC +CC +78 +78 +30 +FC +30 +30 +30 +ENDCHAR +STARTCHAR uni024F +ENCODING 591 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 -2 +BITMAP +CC +CC +CC +FE +CC +DC +6C +0C +78 +ENDCHAR +STARTCHAR uni0250 +ENCODING 592 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +F8 +CC +CC +F8 +C0 +C0 +78 +ENDCHAR +STARTCHAR uni0251 +ENCODING 593 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +74 +DC +CC +CC +CC +DC +74 +ENDCHAR +STARTCHAR uni0252 +ENCODING 594 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +B8 +EC +CC +CC +CC +EC +B8 +ENDCHAR +STARTCHAR uni0253 +ENCODING 595 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +70 +C0 +C0 +C0 +F8 +CC +CC +CC +CC +CC +F8 +ENDCHAR +STARTCHAR uni0254 +ENCODING 596 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +F8 +0C +0C +0C +0C +0C +F8 +ENDCHAR +STARTCHAR uni0255 +ENCODING 597 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +7C +C0 +C0 +C0 +D8 +F4 +78 +30 +30 +ENDCHAR +STARTCHAR uni0256 +ENCODING 598 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +0C +0C +7C +CC +CC +CC +CC +CC +7C +0C +06 +ENDCHAR +STARTCHAR uni0257 +ENCODING 599 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +06 +0C +0C +0C +7C +CC +CC +CC +CC +CC +7C +ENDCHAR +STARTCHAR uni0258 +ENCODING 600 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +CC +FC +0C +0C +F8 +ENDCHAR +STARTCHAR uni0259 +ENCODING 601 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +F8 +0C +0C +FC +CC +CC +78 +ENDCHAR +STARTCHAR uni025A +ENCODING 602 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +F4 +1A +38 +6C +CC +CC +78 +ENDCHAR +STARTCHAR uni025B +ENCODING 603 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +7C +C0 +C0 +78 +C0 +C0 +7C +ENDCHAR +STARTCHAR uni025C +ENCODING 604 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +F8 +0C +0C +78 +0C +0C +F8 +ENDCHAR +STARTCHAR uni025D +ENCODING 605 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +F4 +1A +18 +70 +18 +18 +F0 +ENDCHAR +STARTCHAR uni025E +ENCODING 606 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +CC +D8 +CC +CC +78 +ENDCHAR +STARTCHAR uni025F +ENCODING 607 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 0 -2 +BITMAP +70 +30 +30 +78 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR uni0260 +ENCODING 608 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 10 0 -2 +BITMAP +06 +7C +CC +CC +CC +CC +CC +7C +0C +78 +ENDCHAR +STARTCHAR uni0261 +ENCODING 609 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +7C +CC +CC +CC +CC +CC +7C +0C +78 +ENDCHAR +STARTCHAR uni0262 +ENCODING 610 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +7C +C0 +C0 +DC +CC +CC +78 +ENDCHAR +STARTCHAR uni0263 +ENCODING 611 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +CC +78 +30 +78 +CC +CC +78 +ENDCHAR +STARTCHAR uni0264 +ENCODING 612 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 6 1 1 +BITMAP +D8 +70 +70 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni0265 +ENCODING 613 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +CC +CC +CC +CC +CC +CC +7C +0C +0C +ENDCHAR +STARTCHAR uni0266 +ENCODING 614 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +70 +C0 +C0 +C0 +F8 +CC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni0267 +ENCODING 615 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +70 +C0 +C0 +C0 +F8 +CC +CC +CC +CC +CC +CC +0C +38 +ENDCHAR +STARTCHAR uni0268 +ENCODING 616 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 4 10 1 0 +BITMAP +60 +60 +00 +E0 +60 +60 +F0 +60 +60 +60 +ENDCHAR +STARTCHAR uni0269 +ENCODING 617 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +E0 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR uni026A +ENCODING 618 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +FC +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni026B +ENCODING 619 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +70 +30 +30 +74 +B4 +B8 +30 +30 +18 +ENDCHAR +STARTCHAR uni026C +ENCODING 620 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +70 +30 +30 +70 +B0 +7C +30 +30 +18 +ENDCHAR +STARTCHAR uni026D +ENCODING 621 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +E0 +60 +60 +60 +60 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR uni026E +ENCODING 622 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +E0 +60 +7E +66 +6C +78 +6C +66 +36 +06 +3C +ENDCHAR +STARTCHAR uni026F +ENCODING 623 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +C4 +C4 +C4 +D4 +D4 +D4 +6C +ENDCHAR +STARTCHAR uni0270 +ENCODING 624 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +C4 +C4 +C4 +D4 +D4 +D4 +6C +04 +04 +ENDCHAR +STARTCHAR uni0271 +ENCODING 625 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +F8 +D4 +D4 +D4 +C4 +C4 +C4 +04 +18 +ENDCHAR +STARTCHAR uni0272 +ENCODING 626 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 -2 +BITMAP +7C +66 +66 +66 +66 +66 +66 +60 +C0 +ENDCHAR +STARTCHAR uni0273 +ENCODING 627 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 9 0 -2 +BITMAP +F8 +CC +CC +CC +CC +CC +CC +0C +06 +ENDCHAR +STARTCHAR uni0274 +ENCODING 628 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +CC +CC +EC +FC +DC +CC +CC +ENDCHAR +STARTCHAR uni0275 +ENCODING 629 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +CC +FC +CC +CC +78 +ENDCHAR +STARTCHAR uni0276 +ENCODING 630 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +7E +D8 +D8 +DE +D8 +D8 +7E +ENDCHAR +STARTCHAR uni0277 +ENCODING 631 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +C4 +D4 +D4 +D4 +D4 +78 +ENDCHAR +STARTCHAR uni0278 +ENCODING 632 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +10 +10 +78 +D4 +D4 +D4 +D4 +D4 +78 +10 +10 +ENDCHAR +STARTCHAR uni0279 +ENCODING 633 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +0C +0C +0C +0C +1C +3C +EC +ENDCHAR +STARTCHAR uni027A +ENCODING 634 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +0C +0C +0C +0C +0C +0C +1C +3C +EC +ENDCHAR +STARTCHAR uni027B +ENCODING 635 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 9 0 -2 +BITMAP +0C +0C +0C +0C +1C +3C +EC +0C +06 +ENDCHAR +STARTCHAR uni027C +ENCODING 636 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +DC +F0 +E0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni027D +ENCODING 637 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +DC +F0 +E0 +C0 +C0 +C0 +C0 +C0 +70 +ENDCHAR +STARTCHAR uni027E +ENCODING 638 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +1C +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni027F +ENCODING 639 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +E0 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni0280 +ENCODING 640 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +F8 +CC +CC +F8 +F0 +D8 +CC +ENDCHAR +STARTCHAR uni0281 +ENCODING 641 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +CC +D8 +F0 +F8 +CC +CC +F8 +ENDCHAR +STARTCHAR uni0282 +ENCODING 642 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +7C +C0 +C0 +78 +0C +0C +F8 +C0 +70 +ENDCHAR +STARTCHAR uni0283 +ENCODING 643 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +1C +30 +30 +30 +30 +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR uni0284 +ENCODING 644 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +1C +30 +F0 +30 +30 +FC +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR uni0285 +ENCODING 645 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +E0 +30 +30 +30 +30 +30 +30 +30 +1C +ENDCHAR +STARTCHAR uni0286 +ENCODING 646 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +1C +30 +30 +30 +30 +30 +30 +30 +7C +B0 +60 +ENDCHAR +STARTCHAR uni0287 +ENCODING 647 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 -2 +BITMAP +F0 +18 +18 +18 +18 +18 +F8 +18 +18 +ENDCHAR +STARTCHAR uni0288 +ENCODING 648 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +C0 +C0 +F8 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +78 +ENDCHAR +STARTCHAR uni0289 +ENCODING 649 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +CC +CC +CC +FE +CC +CC +7C +ENDCHAR +STARTCHAR uni028A +ENCODING 650 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +CC +48 +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni028B +ENCODING 651 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +06 +CC +CC +CC +78 +78 +30 +30 +ENDCHAR +STARTCHAR uni028C +ENCODING 652 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +30 +30 +78 +78 +CC +CC +CC +ENDCHAR +STARTCHAR uni028D +ENCODING 653 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +D4 +D4 +D4 +C4 +C4 +C4 +ENDCHAR +STARTCHAR uni028E +ENCODING 654 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +78 +C0 +F8 +CC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni028F +ENCODING 655 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +CC +CC +78 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni0290 +ENCODING 656 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 9 0 -2 +BITMAP +FC +0C +18 +30 +60 +C0 +FC +18 +0E +ENDCHAR +STARTCHAR uni0291 +ENCODING 657 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 -2 +BITMAP +FC +0C +18 +30 +6C +DA +FC +18 +18 +ENDCHAR +STARTCHAR uni0292 +ENCODING 658 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +FC +0C +18 +30 +78 +0C +0C +0C +F8 +ENDCHAR +STARTCHAR uni0293 +ENCODING 659 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 -2 +BITMAP +FC +0C +18 +30 +78 +0C +7C +CC +7A +ENDCHAR +STARTCHAR uni0294 +ENCODING 660 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +F8 +0C +0C +18 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni0295 +ENCODING 661 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +7C +C0 +C0 +60 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni0296 +ENCODING 662 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +30 +30 +30 +30 +30 +18 +0C +0C +F8 +ENDCHAR +STARTCHAR uni0297 +ENCODING 663 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +7C +C0 +C0 +C0 +C0 +C0 +C0 +C0 +7C +ENDCHAR +STARTCHAR uni0298 +ENCODING 664 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +7C +C6 +C6 +D6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni0299 +ENCODING 665 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +F8 +CC +CC +F8 +CC +CC +F8 +ENDCHAR +STARTCHAR uni029A +ENCODING 666 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +CC +6C +CC +CC +78 +ENDCHAR +STARTCHAR uni029B +ENCODING 667 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +0C +10 +7C +C0 +C0 +DC +CC +CC +78 +ENDCHAR +STARTCHAR uni029C +ENCODING 668 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +CC +CC +CC +FC +CC +CC +CC +ENDCHAR +STARTCHAR uni029D +ENCODING 669 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 12 0 -2 +BITMAP +30 +30 +00 +70 +30 +30 +30 +30 +30 +78 +B0 +60 +ENDCHAR +STARTCHAR uni029E +ENCODING 670 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +CC +6C +3C +1C +3C +6C +CC +0C +0C +ENDCHAR +STARTCHAR uni029F +ENCODING 671 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR uni02A0 +ENCODING 672 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +06 +0C +7C +CC +CC +CC +CC +CC +7C +0C +0C +ENDCHAR +STARTCHAR uni02A1 +ENCODING 673 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +F8 +0C +0C +18 +30 +30 +78 +30 +30 +ENDCHAR +STARTCHAR uni02A2 +ENCODING 674 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +7C +C0 +C0 +60 +30 +30 +78 +30 +30 +ENDCHAR +STARTCHAR uni02A3 +ENCODING 675 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +10 +10 +7E +D6 +D6 +DE +DC +DC +7E +ENDCHAR +STARTCHAR uni02A4 +ENCODING 676 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +10 +10 +7E +D6 +D6 +DC +D6 +D6 +76 +06 +1C +ENDCHAR +STARTCHAR uni02A5 +ENCODING 677 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 10 0 -1 +BITMAP +10 +10 +7E +D6 +D6 +DC +DC +DA +7E +08 +ENDCHAR +STARTCHAR uni02A6 +ENCODING 678 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +C0 +C0 +FE +D8 +D8 +CC +C6 +C6 +7C +ENDCHAR +STARTCHAR uni02A7 +ENCODING 679 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +C6 +CC +FC +CC +CC +CC +CC +CC +7C +0C +18 +ENDCHAR +STARTCHAR uni02A8 +ENCODING 680 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 -1 +BITMAP +C0 +C0 +F6 +CC +D8 +D8 +DC +DA +7C +08 +ENDCHAR +STARTCHAR uni02A9 +ENCODING 681 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +70 +C0 +DC +FA +DA +DA +DA +DA +DA +02 +04 +ENDCHAR +STARTCHAR uni02AA +ENCODING 682 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +E0 +60 +6E +78 +78 +6C +66 +66 +3C +ENDCHAR +STARTCHAR uni02AB +ENCODING 683 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +E0 +60 +7E +66 +6C +6C +6C +78 +3E +ENDCHAR +STARTCHAR uni02AC +ENCODING 684 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +C4 +C4 +D4 +EC +C4 +00 +C4 +C4 +D4 +EC +C4 +ENDCHAR +STARTCHAR uni02AD +ENCODING 685 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +FC +CC +CC +CC +CC +00 +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni02AE +ENCODING 686 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +C0 +6C +6C +6C +6C +6C +6C +3C +0C +0C +ENDCHAR +STARTCHAR uni02AF +ENCODING 687 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 12 0 -2 +BITMAP +C0 +6C +6C +6C +6C +6C +6C +3C +0C +0C +0C +06 +ENDCHAR +STARTCHAR uni02BB +ENCODING 699 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 3 2 8 +BITMAP +60 +C0 +C0 +ENDCHAR +STARTCHAR afii57929 +ENCODING 700 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 3 2 8 +BITMAP +C0 +C0 +C0 +ENDCHAR +STARTCHAR afii64937 +ENCODING 701 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 3 2 8 +BITMAP +C0 +C0 +60 +ENDCHAR +STARTCHAR circumflex +ENCODING 710 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 2 1 9 +BITMAP +60 +B0 +ENDCHAR +STARTCHAR caron +ENCODING 711 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 2 1 9 +BITMAP +B0 +60 +ENDCHAR +STARTCHAR breve +ENCODING 728 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 2 0 9 +BITMAP +CC +78 +ENDCHAR +STARTCHAR dotaccent +ENCODING 729 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 1 2 10 +BITMAP +C0 +ENDCHAR +STARTCHAR ring +ENCODING 730 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 3 1 8 +BITMAP +60 +B0 +60 +ENDCHAR +STARTCHAR ogonek +ENCODING 731 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 3 2 -2 +BITMAP +40 +80 +60 +ENDCHAR +STARTCHAR tilde +ENCODING 732 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 3 0 8 +BITMAP +64 +B4 +98 +ENDCHAR +STARTCHAR hungarumlaut +ENCODING 733 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 2 0 9 +BITMAP +6C +D8 +ENDCHAR +STARTCHAR gravecomb +ENCODING 768 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 2 1 9 +BITMAP +C0 +60 +ENDCHAR +STARTCHAR acutecomb +ENCODING 769 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 2 2 9 +BITMAP +60 +C0 +ENDCHAR +STARTCHAR uni0302 +ENCODING 770 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 2 1 9 +BITMAP +60 +B0 +ENDCHAR +STARTCHAR tildecomb +ENCODING 771 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 3 0 8 +BITMAP +64 +B4 +98 +ENDCHAR +STARTCHAR uni0306 +ENCODING 774 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 2 0 9 +BITMAP +CC +78 +ENDCHAR +STARTCHAR uni0307 +ENCODING 775 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 1 2 10 +BITMAP +C0 +ENDCHAR +STARTCHAR uni0308 +ENCODING 776 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 1 1 10 +BITMAP +D8 +ENDCHAR +STARTCHAR uni030C +ENCODING 780 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 2 1 9 +BITMAP +B0 +60 +ENDCHAR +STARTCHAR uni0329 +ENCODING 809 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 2 2 -2 +BITMAP +80 +80 +ENDCHAR +STARTCHAR uni035F +ENCODING 863 +SWIDTH 0 0 +DWIDTH 7 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni0370 +ENCODING 880 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C0 +C0 +C0 +C0 +FC +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni0371 +ENCODING 881 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +C0 +C0 +C0 +FC +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni0372 +ENCODING 882 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +B4 +B4 +B4 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni0373 +ENCODING 883 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +FC +B4 +B4 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni0374 +ENCODING 884 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 3 3 1 8 +BITMAP +60 +60 +C0 +ENDCHAR +STARTCHAR uni0375 +ENCODING 885 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 3 3 1 -2 +BITMAP +60 +60 +C0 +ENDCHAR +STARTCHAR uni0376 +ENCODING 886 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +CC +CC +DC +DC +FC +EC +EC +CC +CC +ENDCHAR +STARTCHAR uni0377 +ENCODING 887 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +CC +DC +DC +FC +EC +EC +CC +ENDCHAR +STARTCHAR uni037B +ENCODING 891 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +F8 +0C +0C +0C +0C +0C +F8 +ENDCHAR +STARTCHAR uni037C +ENCODING 892 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +7C +C0 +C0 +D8 +C0 +C0 +7C +ENDCHAR +STARTCHAR uni037D +ENCODING 893 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +F8 +0C +0C +6C +0C +0C +F8 +ENDCHAR +STARTCHAR uni037E +ENCODING 894 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 3 8 1 -2 +BITMAP +60 +60 +00 +00 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR tonos +ENCODING 900 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 2 2 9 +BITMAP +60 +C0 +ENDCHAR +STARTCHAR dieresistonos +ENCODING 901 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 3 0 8 +BITMAP +D8 +30 +6C +ENDCHAR +STARTCHAR Alphatonos +ENCODING 902 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +C0 +38 +6C +6C +6C +7C +6C +6C +6C +6C +ENDCHAR +STARTCHAR anoteleia +ENCODING 903 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 2 2 4 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR Epsilontonos +ENCODING 904 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +C0 +7C +60 +60 +60 +78 +60 +60 +60 +7C +ENDCHAR +STARTCHAR Etatonos +ENCODING 905 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +C0 +6C +6C +6C +6C +7C +6C +6C +6C +6C +ENDCHAR +STARTCHAR Iotatonos +ENCODING 906 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +C0 +00 +FC +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR Omicrontonos +ENCODING 908 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +C0 +38 +6C +6C +6C +6C +6C +6C +6C +38 +ENDCHAR +STARTCHAR Upsilontonos +ENCODING 910 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +C0 +00 +CC +CC +78 +78 +30 +30 +30 +30 +ENDCHAR +STARTCHAR Omegatonos +ENCODING 911 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +C0 +00 +78 +CC +CC +CC +CC +CC +48 +CC +ENDCHAR +STARTCHAR iotadieresistonos +ENCODING 912 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +D8 +30 +6C +00 +70 +30 +30 +30 +30 +30 +1C +ENDCHAR +STARTCHAR Alpha +ENCODING 913 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR Beta +ENCODING 914 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +F8 +CC +CC +CC +F8 +CC +CC +CC +F8 +ENDCHAR +STARTCHAR Gamma +ENCODING 915 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Delta +ENCODING 916 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +30 +30 +30 +78 +78 +78 +CC +CC +FC +ENDCHAR +STARTCHAR Epsilon +ENCODING 917 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR Zeta +ENCODING 918 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +0C +18 +18 +30 +60 +60 +C0 +FC +ENDCHAR +STARTCHAR Eta +ENCODING 919 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +CC +CC +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR Theta +ENCODING 920 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +CC +CC +FC +CC +CC +CC +78 +ENDCHAR +STARTCHAR Iota +ENCODING 921 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +30 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR Kappa +ENCODING 922 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +CC +D8 +F0 +E0 +C0 +E0 +F0 +D8 +CC +ENDCHAR +STARTCHAR Lambda +ENCODING 923 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +30 +30 +30 +78 +78 +78 +CC +CC +CC +ENDCHAR +STARTCHAR Mu +ENCODING 924 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C4 +C4 +EC +EC +D4 +D4 +C4 +C4 +C4 +ENDCHAR +STARTCHAR Nu +ENCODING 925 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +CC +CC +EC +EC +FC +DC +DC +CC +CC +ENDCHAR +STARTCHAR Xi +ENCODING 926 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +00 +00 +00 +78 +00 +00 +00 +FC +ENDCHAR +STARTCHAR Omicron +ENCODING 927 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR Pi +ENCODING 928 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +CC +CC +CC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR Rho +ENCODING 929 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +F8 +CC +CC +CC +F8 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Sigma +ENCODING 931 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +C0 +60 +30 +18 +30 +60 +C0 +FC +ENDCHAR +STARTCHAR Tau +ENCODING 932 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR Upsilon +ENCODING 933 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +CC +CC +78 +78 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR Phi +ENCODING 934 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +30 +78 +B4 +B4 +B4 +B4 +B4 +78 +30 +ENDCHAR +STARTCHAR Chi +ENCODING 935 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +CC +CC +CC +78 +30 +78 +CC +CC +CC +ENDCHAR +STARTCHAR Psi +ENCODING 936 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +B4 +B4 +B4 +B4 +B4 +78 +30 +30 +30 +ENDCHAR +STARTCHAR Omega +ENCODING 937 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +CC +CC +CC +CC +CC +48 +CC +ENDCHAR +STARTCHAR Iotadieresis +ENCODING 938 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +6C +00 +FC +30 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR Upsilondieresis +ENCODING 939 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +6C +00 +CC +CC +78 +78 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR alphatonos +ENCODING 940 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +18 +30 +00 +6C +DC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR epsilontonos +ENCODING 941 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +18 +30 +00 +7C +C0 +C0 +78 +C0 +C0 +7C +ENDCHAR +STARTCHAR etatonos +ENCODING 942 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +18 +30 +00 +F8 +CC +CC +CC +CC +CC +CC +0C +0C +ENDCHAR +STARTCHAR iotatonos +ENCODING 943 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +C0 +60 +00 +E0 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR upsilondieresistonos +ENCODING 944 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +D8 +30 +6C +00 +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR alpha +ENCODING 945 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +6C +DC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR beta +ENCODING 946 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +70 +D8 +D8 +F0 +D8 +CC +CC +CC +F8 +C0 +C0 +ENDCHAR +STARTCHAR gamma +ENCODING 947 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +CC +CC +CC +78 +78 +30 +30 +60 +60 +ENDCHAR +STARTCHAR delta +ENCODING 948 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +C0 +70 +D8 +CC +CC +CC +78 +ENDCHAR +STARTCHAR epsilon +ENCODING 949 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +7C +C0 +C0 +78 +C0 +C0 +7C +ENDCHAR +STARTCHAR zeta +ENCODING 950 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +FC +18 +30 +60 +C0 +C0 +C0 +C0 +78 +0C +18 +ENDCHAR +STARTCHAR eta +ENCODING 951 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +F8 +CC +CC +CC +CC +CC +CC +0C +0C +ENDCHAR +STARTCHAR theta +ENCODING 952 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +CC +CC +FC +CC +CC +CC +78 +ENDCHAR +STARTCHAR iota +ENCODING 953 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +E0 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR kappa +ENCODING 954 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +CC +D8 +F0 +E0 +F0 +D8 +CC +ENDCHAR +STARTCHAR lambda +ENCODING 955 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +60 +60 +30 +30 +78 +78 +CC +CC +CC +ENDCHAR +STARTCHAR mu +ENCODING 956 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +CC +CC +CC +CC +CC +CC +F8 +C0 +C0 +ENDCHAR +STARTCHAR nu +ENCODING 957 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +CC +CC +CC +78 +78 +30 +30 +ENDCHAR +STARTCHAR xi +ENCODING 958 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +7C +C0 +C0 +C0 +78 +C0 +C0 +C0 +78 +0C +38 +ENDCHAR +STARTCHAR omicron +ENCODING 959 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR pi +ENCODING 960 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +FC +CC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR rho +ENCODING 961 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +78 +CC +CC +CC +CC +CC +F8 +C0 +C0 +ENDCHAR +STARTCHAR sigma1 +ENCODING 962 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +7C +C0 +C0 +C0 +C0 +C0 +78 +0C +38 +ENDCHAR +STARTCHAR sigma +ENCODING 963 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +7E +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR tau +ENCODING 964 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +FC +30 +30 +30 +30 +30 +1C +ENDCHAR +STARTCHAR upsilon +ENCODING 965 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR phi +ENCODING 966 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +18 +B4 +B4 +B4 +B4 +B4 +78 +30 +30 +ENDCHAR +STARTCHAR chi +ENCODING 967 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +CC +CC +78 +30 +78 +CC +CC +ENDCHAR +STARTCHAR psi +ENCODING 968 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +D4 +D4 +D4 +D4 +D4 +D4 +78 +10 +10 +ENDCHAR +STARTCHAR omega +ENCODING 969 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +C4 +C4 +D4 +D4 +D4 +D4 +68 +ENDCHAR +STARTCHAR iotadieresis +ENCODING 970 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +D8 +00 +E0 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR upsilondieresis +ENCODING 971 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +6C +00 +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR omicrontonos +ENCODING 972 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +18 +30 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR upsilontonos +ENCODING 973 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +18 +30 +00 +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR omegatonos +ENCODING 974 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +18 +30 +00 +C4 +C4 +D4 +D4 +D4 +D4 +68 +ENDCHAR +STARTCHAR uni03CF +ENCODING 975 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +CC +D8 +F0 +E0 +C0 +E0 +F0 +D8 +CC +04 +08 +ENDCHAR +STARTCHAR uni03D0 +ENCODING 976 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +CC +CC +F8 +CC +CC +CC +78 +ENDCHAR +STARTCHAR theta1 +ENCODING 977 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +CC +6C +3C +0C +CC +CC +78 +ENDCHAR +STARTCHAR Upsilon1 +ENCODING 978 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +CC +CC +78 +78 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni03D3 +ENCODING 979 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +C0 +00 +CC +CC +78 +78 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni03D4 +ENCODING 980 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +28 +00 +CC +CC +78 +78 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR phi1 +ENCODING 981 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +30 +30 +78 +B4 +B4 +B4 +78 +30 +30 +ENDCHAR +STARTCHAR omega1 +ENCODING 982 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +FC +48 +C4 +D4 +D4 +D4 +68 +ENDCHAR +STARTCHAR uni03D7 +ENCODING 983 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +CC +D8 +F0 +E0 +F0 +D8 +CC +0C +18 +ENDCHAR +STARTCHAR uni03D8 +ENCODING 984 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +78 +CC +CC +CC +CC +CC +CC +CC +78 +30 +30 +ENDCHAR +STARTCHAR uni03D9 +ENCODING 985 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +78 +CC +CC +CC +CC +CC +78 +30 +30 +ENDCHAR +STARTCHAR uni03DA +ENCODING 986 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +7C +C0 +C0 +C0 +C0 +C0 +C0 +C0 +78 +0C +38 +ENDCHAR +STARTCHAR uni03DB +ENCODING 987 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +7C +C0 +C0 +C0 +C0 +C0 +78 +0C +38 +ENDCHAR +STARTCHAR uni03DC +ENCODING 988 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni03DD +ENCODING 989 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +1C +30 +30 +30 +3C +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR uni03DE +ENCODING 990 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C0 +60 +6C +7C +FC +F8 +D8 +18 +0C +ENDCHAR +STARTCHAR uni03DF +ENCODING 991 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +60 +60 +C0 +C0 +FC +0C +0C +18 +18 +ENDCHAR +STARTCHAR uni03E0 +ENCODING 992 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +F8 +6C +6C +0C +3C +6C +6C +6C +6C +0C +18 +ENDCHAR +STARTCHAR uni03E1 +ENCODING 993 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +E0 +30 +18 +38 +6C +DC +3C +0C +0C +ENDCHAR +STARTCHAR uni03E2 +ENCODING 994 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +68 +C4 +D4 +D4 +D4 +D4 +D4 +D4 +6C +04 +38 +ENDCHAR +STARTCHAR uni03E3 +ENCODING 995 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +68 +C4 +C4 +D4 +D4 +D4 +6C +04 +38 +ENDCHAR +STARTCHAR uni03E4 +ENCODING 996 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +CC +CC +CC +CC +CC +CC +CC +CC +7C +0C +0C +ENDCHAR +STARTCHAR uni03E5 +ENCODING 997 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +CC +CC +CC +CC +CC +CC +7C +0C +0C +ENDCHAR +STARTCHAR uni03E6 +ENCODING 998 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C0 +C0 +F8 +CC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni03E7 +ENCODING 999 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +70 +D8 +D8 +7C +18 +18 +F0 +ENDCHAR +STARTCHAR uni03E8 +ENCODING 1000 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +F8 +0C +0C +0C +18 +30 +60 +C0 +C0 +60 +3C +ENDCHAR +STARTCHAR uni03E9 +ENCODING 1001 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +F8 +0C +0C +18 +30 +60 +C0 +60 +3C +ENDCHAR +STARTCHAR uni03EA +ENCODING 1002 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +CC +CC +CC +78 +30 +78 +CC +CC +FC +ENDCHAR +STARTCHAR uni03EB +ENCODING 1003 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +CC +CC +78 +30 +78 +CC +FC +ENDCHAR +STARTCHAR uni03EC +ENCODING 1004 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +7C +C0 +C0 +F8 +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni03ED +ENCODING 1005 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +78 +C0 +C0 +F0 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni03EE +ENCODING 1006 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +30 +30 +FC +B4 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni03EF +ENCODING 1007 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +30 +30 +FC +B4 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni03F0 +ENCODING 1008 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +CC +D8 +F0 +E0 +F0 +D8 +CC +ENDCHAR +STARTCHAR uni03F1 +ENCODING 1009 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +78 +CC +CC +CC +CC +CC +F8 +C0 +7C +ENDCHAR +STARTCHAR uni03F2 +ENCODING 1010 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +7C +C0 +C0 +C0 +C0 +C0 +7C +ENDCHAR +STARTCHAR uni03F3 +ENCODING 1011 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 12 1 -2 +BITMAP +30 +30 +00 +70 +30 +30 +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR uni03F4 +ENCODING 1012 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +CC +CC +FC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni03F5 +ENCODING 1013 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +7C +C0 +C0 +FC +C0 +C0 +7C +ENDCHAR +STARTCHAR uni03F6 +ENCODING 1014 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +F8 +0C +0C +FC +0C +0C +F8 +ENDCHAR +STARTCHAR uni03F7 +ENCODING 1015 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C0 +C0 +F8 +CC +CC +CC +F8 +C0 +C0 +ENDCHAR +STARTCHAR uni03F8 +ENCODING 1016 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +C0 +C0 +F8 +CC +CC +CC +F8 +C0 +C0 +ENDCHAR +STARTCHAR uni03F9 +ENCODING 1017 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +7C +C0 +C0 +C0 +C0 +C0 +C0 +C0 +7C +ENDCHAR +STARTCHAR uni03FA +ENCODING 1018 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C4 +C4 +EC +EC +D4 +D4 +C4 +C4 +C4 +ENDCHAR +STARTCHAR uni03FB +ENCODING 1019 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +C4 +EC +D4 +D4 +D4 +C4 +C4 +C0 +C0 +ENDCHAR +STARTCHAR uni03FC +ENCODING 1020 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +38 +6C +6C +6C +6C +78 +60 +F0 +60 +ENDCHAR +STARTCHAR uni03FD +ENCODING 1021 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +F8 +0C +0C +0C +0C +0C +0C +0C +F8 +ENDCHAR +STARTCHAR uni03FE +ENCODING 1022 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +7C +C0 +C0 +C0 +D8 +D8 +C0 +C0 +7C +ENDCHAR +STARTCHAR uni03FF +ENCODING 1023 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +F8 +0C +0C +0C +6C +6C +0C +0C +F8 +ENDCHAR +STARTCHAR uni0400 +ENCODING 1024 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +30 +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR afii10023 +ENCODING 1025 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +6C +00 +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR afii10051 +ENCODING 1026 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +F0 +60 +60 +78 +6C +6C +6C +6C +6C +0C +18 +ENDCHAR +STARTCHAR afii10052 +ENCODING 1027 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +30 +FC +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR afii10053 +ENCODING 1028 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +7C +C0 +C0 +C0 +F8 +C0 +C0 +C0 +7C +ENDCHAR +STARTCHAR afii10054 +ENCODING 1029 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +7C +C0 +C0 +C0 +78 +0C +0C +0C +F8 +ENDCHAR +STARTCHAR afii10055 +ENCODING 1030 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +30 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR afii10056 +ENCODING 1031 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +6C +00 +FC +30 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR afii10057 +ENCODING 1032 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +3C +18 +18 +18 +18 +18 +18 +18 +F0 +ENDCHAR +STARTCHAR afii10058 +ENCODING 1033 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +78 +68 +68 +68 +6C +6A +6A +6A +CC +ENDCHAR +STARTCHAR afii10059 +ENCODING 1034 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +D8 +D8 +D8 +D8 +FC +DA +DA +DA +DC +ENDCHAR +STARTCHAR afii10060 +ENCODING 1035 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +F0 +60 +60 +78 +6C +6C +6C +6C +6C +ENDCHAR +STARTCHAR afii10061 +ENCODING 1036 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +30 +CC +D8 +F0 +E0 +C0 +E0 +F0 +D8 +CC +ENDCHAR +STARTCHAR uni040D +ENCODING 1037 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +30 +CC +CC +DC +DC +FC +EC +EC +CC +CC +ENDCHAR +STARTCHAR afii10062 +ENCODING 1038 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +CC +78 +00 +CC +CC +CC +CC +DC +6C +0C +78 +ENDCHAR +STARTCHAR afii10145 +ENCODING 1039 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +CC +CC +CC +CC +CC +CC +CC +CC +FC +30 +30 +ENDCHAR +STARTCHAR afii10017 +ENCODING 1040 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR afii10018 +ENCODING 1041 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +F8 +C0 +C0 +C0 +F8 +CC +CC +CC +F8 +ENDCHAR +STARTCHAR afii10019 +ENCODING 1042 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +F8 +CC +CC +CC +F8 +CC +CC +CC +F8 +ENDCHAR +STARTCHAR afii10020 +ENCODING 1043 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR afii10021 +ENCODING 1044 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +3C +2C +2C +2C +2C +6C +6C +CC +FE +C6 +C6 +ENDCHAR +STARTCHAR afii10022 +ENCODING 1045 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR afii10024 +ENCODING 1046 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +B4 +B4 +B4 +B4 +78 +B4 +B4 +B4 +B4 +ENDCHAR +STARTCHAR afii10025 +ENCODING 1047 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +F8 +0C +0C +0C +78 +0C +0C +0C +F8 +ENDCHAR +STARTCHAR afii10026 +ENCODING 1048 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +CC +CC +DC +DC +FC +EC +EC +CC +CC +ENDCHAR +STARTCHAR afii10027 +ENCODING 1049 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +CC +78 +00 +CC +CC +DC +DC +FC +EC +EC +CC +ENDCHAR +STARTCHAR afii10028 +ENCODING 1050 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +CC +D8 +F0 +E0 +C0 +E0 +F0 +D8 +CC +ENDCHAR +STARTCHAR afii10029 +ENCODING 1051 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +7C +6C +6C +6C +6C +6C +6C +6C +CC +ENDCHAR +STARTCHAR afii10030 +ENCODING 1052 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +84 +CC +FC +FC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR afii10031 +ENCODING 1053 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +CC +CC +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR afii10032 +ENCODING 1054 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR afii10033 +ENCODING 1055 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +CC +CC +CC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR afii10034 +ENCODING 1056 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +F8 +CC +CC +CC +F8 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR afii10035 +ENCODING 1057 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +7C +C0 +C0 +C0 +C0 +C0 +C0 +C0 +7C +ENDCHAR +STARTCHAR afii10036 +ENCODING 1058 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR afii10037 +ENCODING 1059 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +CC +CC +CC +CC +CC +CC +7C +0C +78 +ENDCHAR +STARTCHAR afii10038 +ENCODING 1060 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -1 +BITMAP +30 +78 +FC +B4 +B4 +B4 +B4 +B4 +FC +78 +30 +ENDCHAR +STARTCHAR afii10039 +ENCODING 1061 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +CC +CC +CC +78 +30 +78 +CC +CC +CC +ENDCHAR +STARTCHAR afii10040 +ENCODING 1062 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +CC +CC +CC +CC +CC +CC +CC +CC +FE +06 +06 +ENDCHAR +STARTCHAR afii10041 +ENCODING 1063 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +CC +CC +CC +CC +7C +0C +0C +0C +0C +ENDCHAR +STARTCHAR afii10042 +ENCODING 1064 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +D4 +D4 +D4 +D4 +D4 +D4 +D4 +D4 +FC +ENDCHAR +STARTCHAR afii10043 +ENCODING 1065 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +D4 +D4 +D4 +D4 +D4 +D4 +D4 +D4 +FE +06 +06 +ENDCHAR +STARTCHAR afii10044 +ENCODING 1066 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +E0 +60 +78 +6C +6C +6C +6C +6C +78 +ENDCHAR +STARTCHAR afii10045 +ENCODING 1067 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +DC +CC +EC +DC +DC +DC +DC +DC +EC +ENDCHAR +STARTCHAR afii10046 +ENCODING 1068 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C0 +C0 +F8 +CC +CC +CC +CC +CC +F8 +ENDCHAR +STARTCHAR afii10047 +ENCODING 1069 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +F8 +0C +0C +0C +7C +0C +0C +0C +F8 +ENDCHAR +STARTCHAR afii10048 +ENCODING 1070 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +9C +B6 +B6 +B6 +F6 +B6 +B6 +B6 +9C +ENDCHAR +STARTCHAR afii10049 +ENCODING 1071 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +7C +CC +CC +CC +7C +1C +3C +6C +CC +ENDCHAR +STARTCHAR afii10065 +ENCODING 1072 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +0C +0C +7C +CC +CC +7C +ENDCHAR +STARTCHAR afii10066 +ENCODING 1073 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +C0 +F8 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR afii10067 +ENCODING 1074 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +F8 +CC +CC +F8 +CC +CC +F8 +ENDCHAR +STARTCHAR afii10068 +ENCODING 1075 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +FC +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR afii10069 +ENCODING 1076 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 -2 +BITMAP +3C +2C +2C +2C +6C +6C +FE +C6 +C6 +ENDCHAR +STARTCHAR afii10070 +ENCODING 1077 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +CC +FC +C0 +C0 +7C +ENDCHAR +STARTCHAR afii10072 +ENCODING 1078 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +B4 +B4 +B4 +78 +B4 +B4 +B4 +ENDCHAR +STARTCHAR afii10073 +ENCODING 1079 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +F8 +0C +0C +78 +0C +0C +F8 +ENDCHAR +STARTCHAR afii10074 +ENCODING 1080 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +CC +CC +DC +FC +EC +CC +CC +ENDCHAR +STARTCHAR afii10075 +ENCODING 1081 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +CC +78 +00 +CC +CC +DC +FC +EC +CC +CC +ENDCHAR +STARTCHAR afii10076 +ENCODING 1082 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +CC +D8 +F0 +E0 +F0 +D8 +CC +ENDCHAR +STARTCHAR afii10077 +ENCODING 1083 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +7C +6C +6C +6C +6C +6C +CC +ENDCHAR +STARTCHAR afii10078 +ENCODING 1084 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +84 +CC +FC +FC +CC +CC +CC +ENDCHAR +STARTCHAR afii10079 +ENCODING 1085 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +CC +CC +CC +FC +CC +CC +CC +ENDCHAR +STARTCHAR afii10080 +ENCODING 1086 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR afii10081 +ENCODING 1087 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +FC +CC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR afii10082 +ENCODING 1088 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +F8 +CC +CC +CC +CC +CC +F8 +C0 +C0 +ENDCHAR +STARTCHAR afii10083 +ENCODING 1089 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +7C +C0 +C0 +C0 +C0 +C0 +7C +ENDCHAR +STARTCHAR afii10084 +ENCODING 1090 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +FC +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR afii10085 +ENCODING 1091 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +CC +CC +CC +CC +CC +DC +6C +0C +78 +ENDCHAR +STARTCHAR afii10086 +ENCODING 1092 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -1 +BITMAP +30 +78 +B4 +B4 +B4 +B4 +B4 +78 +30 +ENDCHAR +STARTCHAR afii10087 +ENCODING 1093 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +CC +CC +78 +30 +78 +CC +CC +ENDCHAR +STARTCHAR afii10088 +ENCODING 1094 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 -2 +BITMAP +CC +CC +CC +CC +CC +CC +FE +06 +06 +ENDCHAR +STARTCHAR afii10089 +ENCODING 1095 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +CC +CC +CC +7C +0C +0C +0C +ENDCHAR +STARTCHAR afii10090 +ENCODING 1096 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +D4 +D4 +D4 +D4 +D4 +D4 +FC +ENDCHAR +STARTCHAR afii10091 +ENCODING 1097 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 8 0 -2 +BITMAP +D4 +D4 +D4 +D4 +D4 +FE +06 +06 +ENDCHAR +STARTCHAR afii10092 +ENCODING 1098 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +E0 +60 +78 +6C +6C +6C +78 +ENDCHAR +STARTCHAR afii10093 +ENCODING 1099 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +DC +CC +EC +DC +DC +DC +EC +ENDCHAR +STARTCHAR afii10094 +ENCODING 1100 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +C0 +C0 +F8 +CC +CC +CC +F8 +ENDCHAR +STARTCHAR afii10095 +ENCODING 1101 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +F8 +0C +0C +7C +0C +0C +F8 +ENDCHAR +STARTCHAR afii10096 +ENCODING 1102 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +9C +B6 +B6 +F6 +B6 +B6 +9C +ENDCHAR +STARTCHAR afii10097 +ENCODING 1103 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +7C +CC +CC +7C +3C +6C +CC +ENDCHAR +STARTCHAR uni0450 +ENCODING 1104 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +60 +30 +00 +78 +CC +CC +FC +C0 +C0 +7C +ENDCHAR +STARTCHAR afii10071 +ENCODING 1105 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +6C +00 +78 +CC +CC +FC +C0 +C0 +7C +ENDCHAR +STARTCHAR afii10099 +ENCODING 1106 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +60 +F8 +60 +78 +6C +6C +6C +6C +6C +0C +18 +ENDCHAR +STARTCHAR afii10100 +ENCODING 1107 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +18 +30 +00 +FC +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR afii10101 +ENCODING 1108 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +7C +C0 +C0 +F8 +C0 +C0 +7C +ENDCHAR +STARTCHAR afii10102 +ENCODING 1109 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +7C +C0 +C0 +78 +0C +0C +F8 +ENDCHAR +STARTCHAR afii10103 +ENCODING 1110 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 10 1 0 +BITMAP +60 +60 +00 +E0 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR afii10104 +ENCODING 1111 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +D8 +00 +70 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR afii10105 +ENCODING 1112 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 12 0 -2 +BITMAP +30 +30 +00 +70 +30 +30 +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR afii10106 +ENCODING 1113 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +78 +68 +6C +6A +6A +6A +CC +ENDCHAR +STARTCHAR afii10107 +ENCODING 1114 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +D8 +D8 +FC +DA +DA +DA +DC +ENDCHAR +STARTCHAR afii10108 +ENCODING 1115 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +60 +F8 +60 +78 +6C +6C +6C +6C +6C +ENDCHAR +STARTCHAR afii10109 +ENCODING 1116 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +18 +30 +00 +CC +D8 +F0 +E0 +F0 +D8 +CC +ENDCHAR +STARTCHAR uni045D +ENCODING 1117 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +60 +30 +00 +CC +CC +DC +FC +EC +CC +CC +ENDCHAR +STARTCHAR afii10110 +ENCODING 1118 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +CC +78 +00 +CC +CC +CC +CC +CC +DC +6C +0C +78 +ENDCHAR +STARTCHAR afii10193 +ENCODING 1119 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +CC +CC +CC +CC +CC +CC +FC +30 +30 +ENDCHAR +STARTCHAR uni0460 +ENCODING 1120 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +48 +C4 +D4 +D4 +D4 +D4 +D4 +D4 +78 +ENDCHAR +STARTCHAR uni0461 +ENCODING 1121 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +48 +C4 +D4 +D4 +D4 +D4 +78 +ENDCHAR +STARTCHAR afii10146 +ENCODING 1122 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +60 +F8 +60 +78 +6C +6C +6C +6C +78 +ENDCHAR +STARTCHAR afii10194 +ENCODING 1123 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +60 +60 +60 +F8 +60 +78 +6C +6C +78 +ENDCHAR +STARTCHAR uni0464 +ENCODING 1124 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +9C +B0 +B0 +B0 +FC +B0 +B0 +B0 +9C +ENDCHAR +STARTCHAR uni0465 +ENCODING 1125 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +9C +B0 +B0 +FC +B0 +B0 +9C +ENDCHAR +STARTCHAR uni0466 +ENCODING 1126 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +38 +38 +6C +6C +C6 +FE +D6 +D6 +D6 +ENDCHAR +STARTCHAR uni0467 +ENCODING 1127 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +38 +6C +C6 +FE +D6 +D6 +D6 +ENDCHAR +STARTCHAR uni0468 +ENCODING 1128 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +88 +88 +9C +9C +F6 +BE +AA +AA +AA +ENDCHAR +STARTCHAR uni0469 +ENCODING 1129 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +88 +9C +B6 +FE +AA +AA +AA +ENDCHAR +STARTCHAR uni046A +ENCODING 1130 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +FE +C6 +6C +38 +10 +7C +D6 +D6 +D6 +ENDCHAR +STARTCHAR uni046B +ENCODING 1131 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +7C +6C +38 +10 +7C +D6 +D6 +ENDCHAR +STARTCHAR uni046C +ENCODING 1132 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +BE +B6 +9C +9C +E8 +9C +AA +AA +AA +ENDCHAR +STARTCHAR uni046D +ENCODING 1133 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +BE +B6 +9C +E8 +9C +AA +AA +ENDCHAR +STARTCHAR uni046E +ENCODING 1134 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +50 +20 +00 +F0 +18 +18 +70 +18 +18 +18 +70 +C0 +70 +ENDCHAR +STARTCHAR uni046F +ENCODING 1135 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +50 +20 +00 +F0 +18 +18 +70 +18 +18 +70 +C0 +70 +ENDCHAR +STARTCHAR uni0470 +ENCODING 1136 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +B4 +B4 +B4 +B4 +B4 +B4 +78 +30 +30 +ENDCHAR +STARTCHAR uni0471 +ENCODING 1137 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +30 +B4 +B4 +B4 +B4 +B4 +78 +30 +30 +ENDCHAR +STARTCHAR afii10147 +ENCODING 1138 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +CC +CC +FC +CC +CC +CC +78 +ENDCHAR +STARTCHAR afii10195 +ENCODING 1139 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +CC +FC +CC +CC +78 +ENDCHAR +STARTCHAR afii10148 +ENCODING 1140 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +C6 +CC +CC +78 +78 +78 +30 +30 +30 +ENDCHAR +STARTCHAR afii10196 +ENCODING 1141 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +C6 +CC +CC +78 +78 +30 +30 +ENDCHAR +STARTCHAR uni0476 +ENCODING 1142 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +D8 +6C +00 +C6 +CC +78 +78 +78 +30 +30 +30 +ENDCHAR +STARTCHAR uni0477 +ENCODING 1143 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +D8 +6C +00 +C6 +CC +CC +78 +78 +30 +30 +ENDCHAR +STARTCHAR uni0478 +ENCODING 1144 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +40 +E0 +B6 +B6 +B6 +B6 +B6 +F6 +5E +06 +3C +ENDCHAR +STARTCHAR uni0479 +ENCODING 1145 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 -2 +BITMAP +56 +F6 +B6 +B6 +B6 +F6 +5E +06 +3C +ENDCHAR +STARTCHAR uni047A +ENCODING 1146 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -1 +BITMAP +30 +78 +B4 +84 +84 +84 +84 +84 +B4 +78 +30 +ENDCHAR +STARTCHAR uni047B +ENCODING 1147 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -1 +BITMAP +30 +78 +B4 +84 +84 +84 +B4 +78 +30 +ENDCHAR +STARTCHAR uni047C +ENCODING 1148 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +CC +00 +D4 +C4 +D4 +D4 +D4 +D4 +D4 +78 +ENDCHAR +STARTCHAR uni047D +ENCODING 1149 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +78 +CC +00 +D4 +C4 +D4 +D4 +D4 +D4 +78 +ENDCHAR +STARTCHAR uni047E +ENCODING 1150 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +38 +10 +D4 +C4 +C4 +D4 +D4 +D4 +D4 +D4 +78 +ENDCHAR +STARTCHAR uni047F +ENCODING 1151 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +38 +10 +10 +C4 +C4 +C4 +D4 +D4 +D4 +78 +ENDCHAR +STARTCHAR uni0480 +ENCODING 1152 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +7C +C0 +C0 +C0 +C0 +C0 +C0 +C0 +7C +0C +0C +ENDCHAR +STARTCHAR uni0481 +ENCODING 1153 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +7C +C0 +C0 +C0 +C0 +C0 +7C +0C +0C +ENDCHAR +STARTCHAR uni0482 +ENCODING 1154 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 6 1 0 +BITMAP +18 +70 +38 +E0 +70 +C0 +ENDCHAR +STARTCHAR uni0483 +ENCODING 1155 +SWIDTH 0 0 +DWIDTH 7 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni0484 +ENCODING 1156 +SWIDTH 0 0 +DWIDTH 7 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni0485 +ENCODING 1157 +SWIDTH 0 0 +DWIDTH 7 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni0486 +ENCODING 1158 +SWIDTH 0 0 +DWIDTH 7 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni0487 +ENCODING 1159 +SWIDTH 0 0 +DWIDTH 7 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni048A +ENCODING 1162 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +CC +78 +00 +CC +CC +DC +DC +FC +EC +EC +CC +02 +04 +ENDCHAR +STARTCHAR uni048B +ENCODING 1163 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 12 0 -2 +BITMAP +CC +78 +00 +CC +DC +DC +FC +EC +EC +CC +02 +04 +ENDCHAR +STARTCHAR uni048C +ENCODING 1164 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +60 +F0 +60 +78 +6C +6C +6C +6C +78 +ENDCHAR +STARTCHAR uni048D +ENCODING 1165 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +60 +F0 +60 +78 +6C +6C +78 +ENDCHAR +STARTCHAR uni048E +ENCODING 1166 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +F8 +CC +CC +DC +F8 +C8 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni048F +ENCODING 1167 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +F8 +CC +CC +CC +CC +DC +F8 +C8 +C0 +ENDCHAR +STARTCHAR afii10050 +ENCODING 1168 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +04 +04 +FC +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR afii10098 +ENCODING 1169 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +04 +04 +FC +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni0492 +ENCODING 1170 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +7C +60 +60 +60 +F8 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni0493 +ENCODING 1171 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +7C +60 +60 +F8 +60 +60 +60 +ENDCHAR +STARTCHAR uni0494 +ENCODING 1172 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +FC +C0 +C0 +C0 +F8 +CC +CC +CC +CC +0C +18 +ENDCHAR +STARTCHAR uni0495 +ENCODING 1173 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +FC +C0 +C0 +F8 +CC +CC +CC +0C +18 +ENDCHAR +STARTCHAR uni0496 +ENCODING 1174 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +B4 +B4 +B4 +B4 +78 +B4 +B4 +B4 +B6 +02 +02 +ENDCHAR +STARTCHAR uni0497 +ENCODING 1175 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 -2 +BITMAP +B4 +B4 +B4 +78 +B4 +B4 +B6 +02 +02 +ENDCHAR +STARTCHAR uni0498 +ENCODING 1176 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +F8 +0C +0C +0C +78 +0C +0C +0C +F8 +10 +10 +ENDCHAR +STARTCHAR uni0499 +ENCODING 1177 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +F8 +0C +0C +78 +0C +0C +F8 +10 +10 +ENDCHAR +STARTCHAR uni049A +ENCODING 1178 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +CC +D8 +F0 +E0 +C0 +E0 +F0 +D8 +CC +04 +04 +ENDCHAR +STARTCHAR uni049B +ENCODING 1179 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +CC +D8 +F0 +E0 +F0 +D8 +CC +04 +04 +ENDCHAR +STARTCHAR uni049C +ENCODING 1180 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +C6 +D6 +D6 +DC +F8 +DC +D6 +D6 +C6 +ENDCHAR +STARTCHAR uni049D +ENCODING 1181 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +C6 +D6 +DC +F8 +DC +D6 +C6 +ENDCHAR +STARTCHAR uni049E +ENCODING 1182 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +66 +F6 +6C +78 +70 +78 +6C +66 +66 +ENDCHAR +STARTCHAR uni049F +ENCODING 1183 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +66 +F6 +6C +78 +6C +66 +66 +ENDCHAR +STARTCHAR uni04A0 +ENCODING 1184 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +E6 +66 +6C +78 +70 +78 +6C +66 +66 +ENDCHAR +STARTCHAR uni04A1 +ENCODING 1185 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +E6 +66 +6C +78 +6C +66 +66 +ENDCHAR +STARTCHAR uni04A2 +ENCODING 1186 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +CC +CC +CC +CC +FC +CC +CC +CC +CE +02 +02 +ENDCHAR +STARTCHAR uni04A3 +ENCODING 1187 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 -2 +BITMAP +CC +CC +CC +FC +CC +CC +CE +02 +02 +ENDCHAR +STARTCHAR uni04A4 +ENCODING 1188 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +CE +CC +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni04A5 +ENCODING 1189 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +CE +CC +CC +FC +CC +CC +DC +ENDCHAR +STARTCHAR uni04A6 +ENCODING 1190 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +F0 +D0 +D0 +D0 +DC +D6 +D6 +D6 +D6 +06 +0C +ENDCHAR +STARTCHAR uni04A7 +ENCODING 1191 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 -2 +BITMAP +F0 +D0 +DC +D6 +D6 +D6 +D6 +06 +0C +ENDCHAR +STARTCHAR uni04A8 +ENCODING 1192 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +38 +60 +D8 +B4 +B4 +B4 +B4 +B4 +78 +30 +18 +ENDCHAR +STARTCHAR uni04A9 +ENCODING 1193 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +38 +60 +D8 +B4 +B4 +B4 +78 +30 +18 +ENDCHAR +STARTCHAR uni04AA +ENCODING 1194 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +7C +C0 +C0 +C0 +C0 +C0 +C0 +C0 +7C +10 +10 +ENDCHAR +STARTCHAR uni04AB +ENCODING 1195 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +7C +C0 +C0 +C0 +C0 +C0 +7C +10 +10 +ENDCHAR +STARTCHAR uni04AC +ENCODING 1196 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +FC +30 +30 +30 +30 +30 +30 +30 +38 +08 +08 +ENDCHAR +STARTCHAR uni04AD +ENCODING 1197 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +FC +30 +30 +30 +30 +30 +38 +08 +08 +ENDCHAR +STARTCHAR uni04AE +ENCODING 1198 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +CC +CC +78 +78 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni04AF +ENCODING 1199 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +CC +CC +78 +78 +78 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni04B0 +ENCODING 1200 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +CC +CC +78 +78 +30 +78 +30 +30 +30 +ENDCHAR +STARTCHAR uni04B1 +ENCODING 1201 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +CC +CC +CC +78 +78 +30 +78 +30 +30 +ENDCHAR +STARTCHAR uni04B2 +ENCODING 1202 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +CC +CC +CC +78 +30 +78 +CC +CC +CE +02 +02 +ENDCHAR +STARTCHAR uni04B3 +ENCODING 1203 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 -2 +BITMAP +CC +CC +78 +30 +78 +CC +CE +02 +02 +ENDCHAR +STARTCHAR uni04B4 +ENCODING 1204 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +F0 +6C +6C +6C +6C +6C +6C +6C +7E +02 +02 +ENDCHAR +STARTCHAR uni04B5 +ENCODING 1205 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 -2 +BITMAP +F0 +6C +6C +6C +6C +6C +7E +02 +02 +ENDCHAR +STARTCHAR uni04B6 +ENCODING 1206 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +CC +CC +CC +CC +7C +0C +0C +0C +0E +02 +02 +ENDCHAR +STARTCHAR uni04B7 +ENCODING 1207 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 -2 +BITMAP +CC +CC +CC +7C +0C +0C +0E +02 +02 +ENDCHAR +STARTCHAR uni04B8 +ENCODING 1208 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +C6 +C6 +C6 +D6 +7E +16 +06 +06 +06 +ENDCHAR +STARTCHAR uni04B9 +ENCODING 1209 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +C6 +C6 +D6 +7E +16 +06 +06 +ENDCHAR +STARTCHAR uni04BA +ENCODING 1210 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C0 +C0 +C0 +C0 +F8 +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni04BB +ENCODING 1211 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C0 +C0 +F8 +CC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni04BC +ENCODING 1212 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +38 +6C +6C +EC +7C +60 +60 +60 +3C +ENDCHAR +STARTCHAR uni04BD +ENCODING 1213 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +38 +6C +EC +7C +60 +60 +3C +ENDCHAR +STARTCHAR uni04BE +ENCODING 1214 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +38 +6C +6C +EC +7C +60 +60 +60 +3C +10 +10 +ENDCHAR +STARTCHAR uni04BF +ENCODING 1215 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +38 +6C +EC +7C +60 +60 +3C +10 +10 +ENDCHAR +STARTCHAR uni04C0 +ENCODING 1216 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +30 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni04C1 +ENCODING 1217 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +CC +78 +00 +B4 +B4 +B4 +78 +B4 +B4 +B4 +B4 +ENDCHAR +STARTCHAR uni04C2 +ENCODING 1218 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +44 +38 +00 +B4 +B4 +B4 +78 +B4 +B4 +B4 +ENDCHAR +STARTCHAR uni04C3 +ENCODING 1219 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +CC +D8 +F0 +E0 +C0 +E0 +F0 +D8 +CC +04 +18 +ENDCHAR +STARTCHAR uni04C4 +ENCODING 1220 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +CC +D8 +F0 +E0 +F0 +D8 +CC +04 +18 +ENDCHAR +STARTCHAR uni04C5 +ENCODING 1221 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +7C +6C +6C +6C +6C +6C +6C +6C +CC +02 +04 +ENDCHAR +STARTCHAR uni04C6 +ENCODING 1222 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 -2 +BITMAP +7C +6C +6C +6C +6C +6C +CC +02 +04 +ENDCHAR +STARTCHAR uni04C7 +ENCODING 1223 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +CC +CC +CC +CC +FC +CC +CC +CC +CC +04 +18 +ENDCHAR +STARTCHAR uni04C8 +ENCODING 1224 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +CC +CC +CC +FC +CC +CC +CC +04 +18 +ENDCHAR +STARTCHAR uni04C9 +ENCODING 1225 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +CC +CC +CC +CC +FC +CC +CC +CC +CC +02 +04 +ENDCHAR +STARTCHAR uni04CA +ENCODING 1226 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 -2 +BITMAP +CC +CC +CC +FC +CC +CC +CC +02 +04 +ENDCHAR +STARTCHAR uni04CB +ENCODING 1227 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +CC +CC +CC +CC +7C +0C +0C +0C +1C +10 +10 +ENDCHAR +STARTCHAR uni04CC +ENCODING 1228 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +CC +CC +CC +7C +0C +0C +1C +10 +10 +ENDCHAR +STARTCHAR uni04CD +ENCODING 1229 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +C4 +EC +D4 +D4 +D4 +C4 +C4 +C4 +C4 +02 +04 +ENDCHAR +STARTCHAR uni04CE +ENCODING 1230 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 -2 +BITMAP +C4 +EC +D4 +D4 +C4 +C4 +C4 +02 +04 +ENDCHAR +STARTCHAR uni04CF +ENCODING 1231 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +30 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni04D0 +ENCODING 1232 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +CC +78 +00 +78 +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni04D1 +ENCODING 1233 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +CC +78 +00 +78 +0C +0C +7C +CC +CC +7C +ENDCHAR +STARTCHAR uni04D2 +ENCODING 1234 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +6C +00 +78 +CC +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni04D3 +ENCODING 1235 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +6C +00 +78 +0C +0C +7C +CC +CC +7C +ENDCHAR +STARTCHAR uni04D4 +ENCODING 1236 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +7E +D8 +D8 +D8 +FE +D8 +D8 +D8 +DE +ENDCHAR +STARTCHAR uni04D5 +ENCODING 1237 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +7C +1A +1A +7E +D8 +D8 +7E +ENDCHAR +STARTCHAR uni04D6 +ENCODING 1238 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +CC +78 +00 +FC +C0 +C0 +F8 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR uni04D7 +ENCODING 1239 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +CC +78 +00 +78 +CC +CC +FC +C0 +C0 +7C +ENDCHAR +STARTCHAR uni04D8 +ENCODING 1240 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +F8 +0C +0C +0C +FC +CC +CC +CC +78 +ENDCHAR +STARTCHAR afii10846 +ENCODING 1241 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +0C +0C +FC +CC +CC +78 +ENDCHAR +STARTCHAR uni04DA +ENCODING 1242 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +6C +00 +F8 +0C +0C +0C +FC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni04DB +ENCODING 1243 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +6C +00 +F8 +0C +0C +FC +CC +CC +78 +ENDCHAR +STARTCHAR uni04DC +ENCODING 1244 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +6C +00 +B4 +B4 +B4 +B4 +78 +B4 +B4 +B4 +B4 +ENDCHAR +STARTCHAR uni04DD +ENCODING 1245 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +6C +00 +B4 +B4 +B4 +78 +B4 +B4 +B4 +ENDCHAR +STARTCHAR uni04DE +ENCODING 1246 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +6C +00 +F8 +0C +0C +0C +78 +0C +0C +0C +F8 +ENDCHAR +STARTCHAR uni04DF +ENCODING 1247 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +6C +00 +F8 +0C +0C +78 +0C +0C +F8 +ENDCHAR +STARTCHAR uni04E0 +ENCODING 1248 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +0C +18 +30 +78 +0C +0C +0C +F8 +ENDCHAR +STARTCHAR uni04E1 +ENCODING 1249 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +FC +0C +18 +30 +78 +0C +0C +0C +F8 +ENDCHAR +STARTCHAR uni04E2 +ENCODING 1250 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +00 +CC +CC +DC +DC +FC +EC +EC +CC +CC +ENDCHAR +STARTCHAR uni04E3 +ENCODING 1251 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +00 +CC +CC +DC +FC +EC +CC +CC +ENDCHAR +STARTCHAR uni04E4 +ENCODING 1252 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +6C +00 +CC +CC +DC +DC +FC +EC +EC +CC +CC +ENDCHAR +STARTCHAR uni04E5 +ENCODING 1253 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +28 +00 +CC +CC +DC +FC +EC +CC +CC +ENDCHAR +STARTCHAR uni04E6 +ENCODING 1254 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +6C +00 +78 +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni04E7 +ENCODING 1255 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +6C +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni04E8 +ENCODING 1256 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +CC +CC +FC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni04E9 +ENCODING 1257 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +CC +CC +FC +CC +CC +78 +ENDCHAR +STARTCHAR uni04EA +ENCODING 1258 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +6C +00 +78 +CC +CC +CC +FC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni04EB +ENCODING 1259 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +6C +00 +78 +CC +CC +FC +CC +CC +78 +ENDCHAR +STARTCHAR uni04EC +ENCODING 1260 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +6C +00 +F8 +0C +0C +0C +7C +0C +0C +0C +F8 +ENDCHAR +STARTCHAR uni04ED +ENCODING 1261 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +6C +00 +F8 +0C +0C +7C +0C +0C +F8 +ENDCHAR +STARTCHAR uni04EE +ENCODING 1262 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +00 +CC +CC +CC +CC +CC +CC +7C +0C +78 +ENDCHAR +STARTCHAR uni04EF +ENCODING 1263 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +78 +00 +CC +CC +CC +CC +CC +CC +7C +0C +78 +ENDCHAR +STARTCHAR uni04F0 +ENCODING 1264 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +6C +00 +CC +CC +CC +CC +CC +CC +7C +0C +78 +ENDCHAR +STARTCHAR uni04F1 +ENCODING 1265 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +6C +00 +CC +CC +CC +CC +CC +DC +6C +0C +78 +ENDCHAR +STARTCHAR uni04F2 +ENCODING 1266 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +6C +D8 +00 +CC +CC +CC +CC +CC +7C +0C +78 +ENDCHAR +STARTCHAR uni04F3 +ENCODING 1267 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +6C +D8 +00 +CC +CC +CC +CC +CC +CC +7C +0C +78 +ENDCHAR +STARTCHAR uni04F4 +ENCODING 1268 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +6C +00 +CC +CC +CC +CC +7C +0C +0C +0C +0C +ENDCHAR +STARTCHAR uni04F5 +ENCODING 1269 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +6C +00 +CC +CC +CC +7C +0C +0C +0C +ENDCHAR +STARTCHAR uni04F6 +ENCODING 1270 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +FC +C0 +C0 +C0 +C0 +C0 +C0 +C0 +E0 +20 +20 +ENDCHAR +STARTCHAR uni04F7 +ENCODING 1271 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +FC +C0 +C0 +C0 +C0 +C0 +E0 +20 +20 +ENDCHAR +STARTCHAR uni04F8 +ENCODING 1272 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +6C +00 +CC +CC +CC +CC +EC +DC +DC +DC +EC +ENDCHAR +STARTCHAR uni04F9 +ENCODING 1273 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +6C +00 +CC +CC +CC +EC +DC +DC +EC +ENDCHAR +STARTCHAR uni04FA +ENCODING 1274 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +7C +60 +60 +60 +F8 +60 +60 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR uni04FB +ENCODING 1275 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +7C +60 +60 +F8 +60 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR uni04FC +ENCODING 1276 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +CC +CC +CC +78 +30 +78 +CC +CC +CC +04 +08 +ENDCHAR +STARTCHAR uni04FD +ENCODING 1277 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +CC +CC +78 +30 +78 +CC +CC +04 +08 +ENDCHAR +STARTCHAR uni04FE +ENCODING 1278 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +CC +CC +CC +78 +FC +78 +CC +CC +CC +ENDCHAR +STARTCHAR uni04FF +ENCODING 1279 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +CC +CC +78 +FC +78 +CC +CC +ENDCHAR +STARTCHAR uni0500 +ENCODING 1280 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +0C +0C +0C +7C +CC +CC +CC +CC +7C +ENDCHAR +STARTCHAR uni0501 +ENCODING 1281 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +0C +0C +0C +7C +CC +CC +7C +ENDCHAR +STARTCHAR uni0502 +ENCODING 1282 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +10 +14 +74 +D4 +D4 +D4 +D4 +DC +68 +ENDCHAR +STARTCHAR uni0503 +ENCODING 1283 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +10 +10 +10 +14 +74 +D4 +D4 +DC +68 +ENDCHAR +STARTCHAR uni0504 +ENCODING 1284 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +E0 +30 +34 +E4 +34 +34 +34 +34 +18 +ENDCHAR +STARTCHAR uni0505 +ENCODING 1285 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +E0 +30 +34 +E4 +34 +34 +18 +ENDCHAR +STARTCHAR uni0506 +ENCODING 1286 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +F0 +18 +18 +70 +18 +18 +18 +18 +1C +04 +04 +ENDCHAR +STARTCHAR uni0507 +ENCODING 1287 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +F0 +18 +18 +70 +18 +18 +1C +04 +04 +ENDCHAR +STARTCHAR uni0508 +ENCODING 1288 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +78 +6A +6A +6A +6A +6A +6A +6E +C4 +ENDCHAR +STARTCHAR uni0509 +ENCODING 1289 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +78 +6A +6A +6A +6A +6E +C4 +ENDCHAR +STARTCHAR uni050A +ENCODING 1290 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +D0 +D4 +D4 +D4 +F4 +D4 +D4 +DC +C8 +ENDCHAR +STARTCHAR uni050B +ENCODING 1291 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +D0 +D4 +D4 +F4 +D4 +DC +C8 +ENDCHAR +STARTCHAR uni050C +ENCODING 1292 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +7C +C0 +C0 +C0 +DC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni050D +ENCODING 1293 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +7C +C0 +C0 +DC +CC +CC +78 +ENDCHAR +STARTCHAR uni050E +ENCODING 1294 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +30 +30 +34 +34 +34 +34 +3C +18 +ENDCHAR +STARTCHAR uni050F +ENCODING 1295 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +FC +30 +30 +34 +34 +3C +18 +ENDCHAR +STARTCHAR uni0510 +ENCODING 1296 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +7C +C0 +C0 +C0 +78 +C0 +C0 +C0 +7C +ENDCHAR +STARTCHAR uni0511 +ENCODING 1297 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +7C +C0 +C0 +78 +C0 +C0 +7C +ENDCHAR +STARTCHAR uni0512 +ENCODING 1298 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +7C +6C +6C +6C +6C +6C +6C +6C +6C +CC +0C +18 +ENDCHAR +STARTCHAR uni0513 +ENCODING 1299 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +7C +6C +6C +6C +6C +6C +CC +0C +18 +ENDCHAR +STARTCHAR uni0514 +ENCODING 1300 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +7A +6A +6A +6A +64 +6A +6A +6A +CA +ENDCHAR +STARTCHAR uni0515 +ENCODING 1301 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +7A +6A +6A +64 +6A +6A +CA +ENDCHAR +STARTCHAR uni0516 +ENCODING 1302 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +EC +DC +D8 +D8 +F0 +D8 +D8 +CC +CC +ENDCHAR +STARTCHAR uni0517 +ENCODING 1303 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +EC +DC +D8 +D0 +D8 +DC +EC +C0 +C0 +ENDCHAR +STARTCHAR uni0518 +ENCODING 1304 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +7E +D8 +D8 +D8 +7E +38 +78 +D8 +DE +ENDCHAR +STARTCHAR uni0519 +ENCODING 1305 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +7C +DA +DA +7E +38 +68 +C6 +ENDCHAR +STARTCHAR uni051A +ENCODING 1306 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 -1 +BITMAP +78 +CC +CC +CC +CC +CC +CC +CC +78 +0C +ENDCHAR +STARTCHAR uni051B +ENCODING 1307 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +7C +CC +CC +CC +CC +CC +7C +0C +0C +ENDCHAR +STARTCHAR uni051C +ENCODING 1308 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C4 +C4 +C4 +D4 +D4 +EC +EC +C4 +C4 +ENDCHAR +STARTCHAR uni051D +ENCODING 1309 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +C4 +C4 +C4 +D4 +D4 +EC +C4 +ENDCHAR +STARTCHAR uni051E +ENCODING 1310 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +10 +CC +D8 +F4 +E0 +C0 +E0 +F0 +D8 +CC +ENDCHAR +STARTCHAR uni051F +ENCODING 1311 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +10 +CC +D8 +F4 +E0 +F0 +D8 +CC +ENDCHAR +STARTCHAR uni0520 +ENCODING 1312 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +78 +68 +68 +68 +6C +6E +6A +6A +CA +06 +0C +ENDCHAR +STARTCHAR uni0521 +ENCODING 1313 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 -2 +BITMAP +78 +68 +68 +6C +6E +6A +CA +06 +0C +ENDCHAR +STARTCHAR uni0522 +ENCODING 1314 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +D8 +D8 +D8 +D8 +FC +DA +DA +DA +DA +02 +0C +ENDCHAR +STARTCHAR uni0523 +ENCODING 1315 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 -2 +BITMAP +D8 +D8 +D8 +FC +DA +DA +DA +02 +0C +ENDCHAR +STARTCHAR uni0524 +ENCODING 1316 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +FC +CC +CC +CC +CC +CC +CC +CC +CE +02 +02 +ENDCHAR +STARTCHAR uni0525 +ENCODING 1317 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 -2 +BITMAP +FC +CC +CC +CC +CC +CC +CE +02 +02 +ENDCHAR +STARTCHAR uni0526 +ENCODING 1318 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +C0 +C0 +F8 +CC +CC +CC +CC +CC +CE +02 +02 +ENDCHAR +STARTCHAR uni0527 +ENCODING 1319 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 -2 +BITMAP +C0 +C0 +F8 +CC +CC +CC +CE +02 +02 +ENDCHAR +STARTCHAR afii57407 +ENCODING 1567 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +70 +88 +88 +40 +20 +00 +00 +20 +20 +ENDCHAR +STARTCHAR afii57409 +ENCODING 1569 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 5 2 2 +BITMAP +60 +80 +80 +60 +C0 +ENDCHAR +STARTCHAR afii57410 +ENCODING 1570 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 11 1 0 +BITMAP +50 +A0 +00 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR afii57411 +ENCODING 1571 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 11 1 0 +BITMAP +60 +80 +E0 +00 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR afii57412 +ENCODING 1572 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 0 -2 +BITMAP +30 +40 +70 +00 +30 +48 +48 +48 +38 +08 +F0 +ENDCHAR +STARTCHAR afii57413 +ENCODING 1573 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 11 1 -2 +BITMAP +40 +40 +40 +40 +40 +40 +00 +00 +60 +80 +E0 +ENDCHAR +STARTCHAR afii57414 +ENCODING 1574 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +60 +80 +E0 +08 +14 +50 +00 +88 +88 +70 +ENDCHAR +STARTCHAR afii57415 +ENCODING 1575 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 9 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii57416 +ENCODING 1576 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 4 0 1 +BITMAP +10 +88 +88 +70 +ENDCHAR +STARTCHAR afii57417 +ENCODING 1577 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 0 0 +BITMAP +50 +00 +60 +90 +88 +88 +00 +70 +ENDCHAR +STARTCHAR afii57418 +ENCODING 1578 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 6 0 1 +BITMAP +50 +00 +10 +88 +88 +70 +ENDCHAR +STARTCHAR afii57419 +ENCODING 1579 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +20 +00 +50 +00 +10 +88 +88 +88 +70 +ENDCHAR +STARTCHAR afii57420 +ENCODING 1580 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +40 +80 +A0 +80 +00 +40 +38 +ENDCHAR +STARTCHAR afii57421 +ENCODING 1581 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +40 +80 +80 +80 +00 +40 +38 +ENDCHAR +STARTCHAR afii57422 +ENCODING 1582 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 0 -2 +BITMAP +20 +00 +F8 +20 +40 +80 +80 +80 +80 +40 +38 +ENDCHAR +STARTCHAR afii57423 +ENCODING 1583 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 5 1 1 +BITMAP +20 +10 +10 +10 +E0 +ENDCHAR +STARTCHAR afii57424 +ENCODING 1584 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 8 1 0 +BITMAP +40 +00 +20 +10 +10 +10 +00 +E0 +ENDCHAR +STARTCHAR afii57425 +ENCODING 1585 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 0 +BITMAP +08 +08 +08 +10 +E0 +ENDCHAR +STARTCHAR afii57426 +ENCODING 1586 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 0 -1 +BITMAP +08 +00 +08 +08 +08 +00 +00 +E0 +ENDCHAR +STARTCHAR afii57427 +ENCODING 1587 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 8 0 -2 +BITMAP +04 +54 +54 +54 +28 +A0 +00 +40 +ENDCHAR +STARTCHAR afii57428 +ENCODING 1588 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +20 +00 +50 +00 +54 +54 +54 +54 +20 +A0 +40 +ENDCHAR +STARTCHAR afii57429 +ENCODING 1589 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 -1 +BITMAP +28 +34 +A4 +B8 +A0 +40 +ENDCHAR +STARTCHAR afii57430 +ENCODING 1590 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +20 +00 +28 +34 +A4 +B8 +B0 +A0 +40 +ENDCHAR +STARTCHAR afii57431 +ENCODING 1591 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +40 +40 +40 +40 +50 +68 +68 +68 +F0 +ENDCHAR +STARTCHAR afii57432 +ENCODING 1592 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +40 +40 +50 +40 +50 +68 +68 +68 +F0 +ENDCHAR +STARTCHAR afii57433 +ENCODING 1593 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 -2 +BITMAP +60 +80 +80 +70 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR afii57434 +ENCODING 1594 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 0 -2 +BITMAP +40 +00 +60 +80 +80 +70 +00 +80 +80 +88 +70 +ENDCHAR +STARTCHAR afii57440 +ENCODING 1600 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 1 0 1 +BITMAP +FC +ENDCHAR +STARTCHAR afii57441 +ENCODING 1601 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 0 -1 +BITMAP +10 +00 +10 +28 +98 +88 +00 +70 +ENDCHAR +STARTCHAR afii57442 +ENCODING 1602 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 0 -1 +BITMAP +28 +00 +10 +28 +98 +88 +00 +70 +ENDCHAR +STARTCHAR afii57443 +ENCODING 1603 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +28 +48 +28 +C8 +08 +88 +88 +88 +70 +ENDCHAR +STARTCHAR afii57444 +ENCODING 1604 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +08 +48 +88 +88 +70 +ENDCHAR +STARTCHAR afii57445 +ENCODING 1605 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 6 0 -1 +BITMAP +30 +48 +48 +B0 +80 +80 +ENDCHAR +STARTCHAR afii57446 +ENCODING 1606 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 0 -1 +BITMAP +20 +00 +10 +88 +88 +88 +00 +70 +ENDCHAR +STARTCHAR afii57470 +ENCODING 1607 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 1 +BITMAP +60 +90 +88 +88 +70 +ENDCHAR +STARTCHAR afii57448 +ENCODING 1608 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 6 0 -1 +BITMAP +30 +48 +48 +38 +08 +F0 +ENDCHAR +STARTCHAR afii57449 +ENCODING 1609 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 0 +BITMAP +08 +14 +90 +88 +70 +ENDCHAR +STARTCHAR afii57450 +ENCODING 1610 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +08 +14 +50 +88 +88 +70 +00 +00 +50 +ENDCHAR +STARTCHAR afii57392 +ENCODING 1632 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 2 2 4 +BITMAP +80 +80 +ENDCHAR +STARTCHAR afii57393 +ENCODING 1633 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 9 1 0 +BITMAP +80 +80 +40 +40 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR afii57394 +ENCODING 1634 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 9 1 0 +BITMAP +90 +90 +60 +40 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR afii57395 +ENCODING 1635 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +A8 +A8 +70 +40 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR afii57396 +ENCODING 1636 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +60 +80 +80 +60 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR afii57397 +ENCODING 1637 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +20 +50 +50 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR afii57398 +ENCODING 1638 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 0 1 +BITMAP +F0 +10 +10 +10 +10 +08 +08 +08 +ENDCHAR +STARTCHAR afii57399 +ENCODING 1639 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +88 +88 +50 +50 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR afii57400 +ENCODING 1640 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +20 +20 +20 +50 +50 +50 +00 +88 +80 +ENDCHAR +STARTCHAR afii57401 +ENCODING 1641 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 0 1 +BITMAP +60 +90 +90 +70 +10 +08 +08 +08 +ENDCHAR +STARTCHAR afii57381 +ENCODING 1642 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +88 +90 +10 +20 +20 +40 +40 +48 +80 +ENDCHAR +STARTCHAR uni066B +ENCODING 1643 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 4 1 0 +BITMAP +10 +10 +20 +C0 +ENDCHAR +STARTCHAR uni066C +ENCODING 1644 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 3 2 9 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR uni066E +ENCODING 1646 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 4 0 1 +BITMAP +10 +88 +88 +70 +ENDCHAR +STARTCHAR uni066F +ENCODING 1647 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 0 +BITMAP +10 +28 +98 +88 +70 +ENDCHAR +STARTCHAR uni0FD5 +ENCODING 4053 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 3 +BITMAP +B8 +A0 +F8 +28 +E8 +ENDCHAR +STARTCHAR uni0FD6 +ENCODING 4054 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 3 +BITMAP +E8 +28 +F8 +A0 +B8 +ENDCHAR +STARTCHAR uni1E00 +ENCODING 7680 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +78 +CC +CC +FC +CC +CC +CC +CC +10 +28 +10 +ENDCHAR +STARTCHAR uni1E01 +ENCODING 7681 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 -2 +BITMAP +78 +0C +0C +7C +CC +CC +7C +10 +28 +10 +ENDCHAR +STARTCHAR uni1E02 +ENCODING 7682 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +20 +00 +F8 +CC +CC +CC +F8 +CC +CC +CC +F8 +ENDCHAR +STARTCHAR uni1E03 +ENCODING 7683 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +20 +00 +C0 +C0 +F8 +CC +CC +CC +CC +CC +F8 +ENDCHAR +STARTCHAR uni1E04 +ENCODING 7684 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +F8 +CC +CC +CC +F8 +CC +CC +CC +F8 +00 +20 +ENDCHAR +STARTCHAR uni1E05 +ENCODING 7685 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +C0 +C0 +F8 +CC +CC +CC +CC +CC +F8 +00 +20 +ENDCHAR +STARTCHAR uni1E06 +ENCODING 7686 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +F8 +CC +CC +CC +F8 +CC +CC +CC +F8 +00 +78 +ENDCHAR +STARTCHAR uni1E07 +ENCODING 7687 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +C0 +C0 +F8 +CC +CC +CC +CC +CC +F8 +00 +78 +ENDCHAR +STARTCHAR uni1E08 +ENCODING 7688 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +18 +30 +7C +C0 +C0 +C0 +C0 +C0 +C0 +C0 +7C +30 +E0 +ENDCHAR +STARTCHAR uni1E09 +ENCODING 7689 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +18 +30 +00 +7C +C0 +C0 +C0 +C0 +C0 +7C +30 +E0 +ENDCHAR +STARTCHAR uni1E0A +ENCODING 7690 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +20 +00 +F0 +D8 +CC +CC +CC +CC +CC +D8 +F0 +ENDCHAR +STARTCHAR uni1E0B +ENCODING 7691 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +20 +00 +0C +0C +7C +CC +CC +CC +CC +CC +7C +ENDCHAR +STARTCHAR uni1E0C +ENCODING 7692 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +F0 +D8 +CC +CC +CC +CC +CC +D8 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E0D +ENCODING 7693 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +0C +0C +7C +CC +CC +CC +CC +CC +7C +00 +20 +ENDCHAR +STARTCHAR uni1E0E +ENCODING 7694 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +F0 +D8 +CC +CC +CC +CC +CC +D8 +F0 +00 +78 +ENDCHAR +STARTCHAR uni1E0F +ENCODING 7695 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +0C +0C +7C +CC +CC +CC +CC +CC +7C +00 +78 +ENDCHAR +STARTCHAR uni1E10 +ENCODING 7696 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +F0 +D8 +CC +CC +CC +CC +CC +D8 +F0 +30 +E0 +ENDCHAR +STARTCHAR uni1E11 +ENCODING 7697 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +0C +0C +7C +CC +CC +CC +CC +CC +7C +30 +E0 +ENDCHAR +STARTCHAR uni1E12 +ENCODING 7698 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +F0 +D8 +CC +CC +CC +CC +CC +D8 +F0 +30 +58 +ENDCHAR +STARTCHAR uni1E13 +ENCODING 7699 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +0C +0C +7C +CC +CC +CC +CC +CC +7C +30 +58 +ENDCHAR +STARTCHAR uni1E14 +ENCODING 7700 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +30 +78 +00 +FC +C0 +C0 +F8 +C0 +C0 +FC +ENDCHAR +STARTCHAR uni1E15 +ENCODING 7701 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +30 +78 +00 +78 +CC +CC +FC +C0 +C0 +7C +ENDCHAR +STARTCHAR uni1E16 +ENCODING 7702 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +30 +78 +00 +FC +C0 +C0 +F8 +C0 +C0 +FC +ENDCHAR +STARTCHAR uni1E17 +ENCODING 7703 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +30 +78 +00 +78 +C4 +C4 +FC +C0 +C0 +7C +ENDCHAR +STARTCHAR uni1E18 +ENCODING 7704 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +FC +C0 +C0 +F8 +C0 +C0 +C0 +FC +00 +30 +58 +ENDCHAR +STARTCHAR uni1E19 +ENCODING 7705 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +78 +CC +FC +C0 +C0 +7C +00 +30 +58 +ENDCHAR +STARTCHAR uni1E1A +ENCODING 7706 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +FC +C0 +C0 +F8 +C0 +C0 +C0 +FC +00 +74 +B8 +ENDCHAR +STARTCHAR uni1E1B +ENCODING 7707 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +78 +CC +FC +C0 +C0 +7C +00 +74 +B8 +ENDCHAR +STARTCHAR uni1E1C +ENCODING 7708 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +CC +78 +00 +FC +C0 +C0 +F8 +C0 +C0 +C0 +FC +30 +E0 +ENDCHAR +STARTCHAR uni1E1D +ENCODING 7709 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +CC +78 +00 +78 +CC +CC +FC +C0 +C0 +7C +30 +E0 +ENDCHAR +STARTCHAR uni1E1E +ENCODING 7710 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +20 +00 +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni1E1F +ENCODING 7711 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +00 +38 +60 +60 +F8 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni1E20 +ENCODING 7712 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +00 +7C +C0 +C0 +C0 +DC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1E21 +ENCODING 7713 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +78 +00 +7C +CC +CC +CC +CC +CC +7C +0C +78 +ENDCHAR +STARTCHAR uni1E22 +ENCODING 7714 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +20 +00 +CC +CC +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni1E23 +ENCODING 7715 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +20 +00 +C0 +C0 +F8 +CC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni1E24 +ENCODING 7716 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +CC +CC +CC +CC +FC +CC +CC +CC +CC +00 +20 +ENDCHAR +STARTCHAR uni1E25 +ENCODING 7717 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +C0 +C0 +F8 +CC +CC +CC +CC +CC +CC +00 +20 +ENDCHAR +STARTCHAR uni1E26 +ENCODING 7718 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +6C +00 +CC +CC +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni1E27 +ENCODING 7719 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +6C +00 +C0 +C0 +F8 +CC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni1E28 +ENCODING 7720 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +CC +CC +CC +CC +FC +CC +CC +CC +CC +60 +C0 +ENDCHAR +STARTCHAR uni1E29 +ENCODING 7721 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +C0 +C0 +F8 +CC +CC +CC +CC +CC +CC +60 +C0 +ENDCHAR +STARTCHAR uni1E2A +ENCODING 7722 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +CC +CC +CC +FC +CC +CC +CC +CC +00 +CC +78 +ENDCHAR +STARTCHAR uni1E2B +ENCODING 7723 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +C0 +C0 +F8 +CC +CC +CC +CC +CC +00 +CC +78 +ENDCHAR +STARTCHAR uni1E2C +ENCODING 7724 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +FC +30 +30 +30 +30 +30 +30 +FC +00 +74 +B8 +ENDCHAR +STARTCHAR uni1E2D +ENCODING 7725 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +00 +70 +30 +30 +30 +30 +78 +00 +74 +B8 +ENDCHAR +STARTCHAR uni1E2E +ENCODING 7726 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +30 +00 +6C +00 +FC +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni1E2F +ENCODING 7727 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +30 +60 +00 +D8 +00 +E0 +60 +60 +60 +60 +F0 +ENDCHAR +STARTCHAR uni1E30 +ENCODING 7728 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +30 +CC +D8 +F0 +E0 +C0 +E0 +F0 +D8 +CC +ENDCHAR +STARTCHAR uni1E31 +ENCODING 7729 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +30 +C0 +C0 +CC +D8 +F0 +E0 +F0 +D8 +CC +ENDCHAR +STARTCHAR uni1E32 +ENCODING 7730 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +CC +D8 +F0 +E0 +C0 +E0 +F0 +D8 +CC +00 +20 +ENDCHAR +STARTCHAR uni1E33 +ENCODING 7731 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +C0 +C0 +CC +D8 +F0 +E0 +F0 +D8 +CC +00 +20 +ENDCHAR +STARTCHAR uni1E34 +ENCODING 7732 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +CC +D8 +F0 +E0 +C0 +E0 +F0 +D8 +CC +00 +78 +ENDCHAR +STARTCHAR uni1E35 +ENCODING 7733 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +C0 +C0 +CC +D8 +F0 +E0 +F0 +D8 +CC +00 +78 +ENDCHAR +STARTCHAR uni1E36 +ENCODING 7734 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FC +00 +20 +ENDCHAR +STARTCHAR uni1E37 +ENCODING 7735 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 4 11 1 -2 +BITMAP +E0 +60 +60 +60 +60 +60 +60 +60 +30 +00 +20 +ENDCHAR +STARTCHAR uni1E38 +ENCODING 7736 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +78 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FC +00 +20 +ENDCHAR +STARTCHAR uni1E39 +ENCODING 7737 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 4 13 1 -2 +BITMAP +F0 +00 +E0 +60 +60 +60 +60 +60 +60 +60 +30 +00 +20 +ENDCHAR +STARTCHAR uni1E3A +ENCODING 7738 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FC +00 +78 +ENDCHAR +STARTCHAR uni1E3B +ENCODING 7739 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 4 11 1 -2 +BITMAP +E0 +60 +60 +60 +60 +60 +60 +60 +30 +00 +F0 +ENDCHAR +STARTCHAR uni1E3C +ENCODING 7740 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FC +00 +30 +58 +ENDCHAR +STARTCHAR uni1E3D +ENCODING 7741 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 4 11 1 -2 +BITMAP +E0 +60 +60 +60 +60 +60 +60 +30 +00 +60 +B0 +ENDCHAR +STARTCHAR uni1E3E +ENCODING 7742 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +30 +C4 +C4 +EC +EC +D4 +D4 +C4 +C4 +C4 +ENDCHAR +STARTCHAR uni1E3F +ENCODING 7743 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +18 +30 +00 +F8 +D4 +D4 +D4 +D4 +D4 +D4 +ENDCHAR +STARTCHAR uni1E40 +ENCODING 7744 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +20 +00 +C4 +C4 +EC +EC +D4 +D4 +C4 +C4 +C4 +ENDCHAR +STARTCHAR uni1E41 +ENCODING 7745 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +20 +00 +F8 +D4 +D4 +D4 +D4 +D4 +D4 +ENDCHAR +STARTCHAR uni1E42 +ENCODING 7746 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +84 +CC +FC +FC +FC +CC +CC +CC +CC +00 +20 +ENDCHAR +STARTCHAR uni1E43 +ENCODING 7747 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +F8 +D4 +D4 +D4 +D4 +D4 +D4 +00 +20 +ENDCHAR +STARTCHAR uni1E44 +ENCODING 7748 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +20 +00 +8C +CC +EC +FC +FC +FC +DC +CC +C4 +ENDCHAR +STARTCHAR uni1E45 +ENCODING 7749 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +20 +00 +F8 +CC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni1E46 +ENCODING 7750 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +8C +CC +EC +FC +FC +FC +DC +CC +C4 +00 +20 +ENDCHAR +STARTCHAR uni1E47 +ENCODING 7751 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +F8 +CC +CC +CC +CC +CC +CC +00 +20 +ENDCHAR +STARTCHAR uni1E48 +ENCODING 7752 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +8C +CC +EC +FC +FC +FC +DC +CC +C4 +00 +78 +ENDCHAR +STARTCHAR uni1E49 +ENCODING 7753 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +F8 +CC +CC +CC +CC +CC +CC +00 +78 +ENDCHAR +STARTCHAR uni1E4A +ENCODING 7754 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +8C +CC +EC +FC +FC +FC +DC +CC +C4 +30 +58 +ENDCHAR +STARTCHAR uni1E4B +ENCODING 7755 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +F8 +CC +CC +CC +CC +CC +CC +30 +58 +ENDCHAR +STARTCHAR uni1E4C +ENCODING 7756 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +30 +74 +B8 +00 +78 +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1E4D +ENCODING 7757 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +30 +00 +74 +B8 +00 +78 +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1E4E +ENCODING 7758 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +6C +00 +74 +B8 +00 +78 +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1E4F +ENCODING 7759 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +6C +00 +74 +B8 +00 +78 +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1E50 +ENCODING 7760 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +30 +78 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1E51 +ENCODING 7761 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +30 +00 +78 +00 +78 +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1E52 +ENCODING 7762 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +30 +78 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1E53 +ENCODING 7763 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +30 +00 +78 +00 +78 +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1E54 +ENCODING 7764 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +30 +F8 +CC +CC +CC +F8 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni1E55 +ENCODING 7765 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +18 +30 +00 +F8 +CC +CC +CC +CC +CC +F8 +C0 +C0 +ENDCHAR +STARTCHAR uni1E56 +ENCODING 7766 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +20 +00 +F8 +CC +CC +CC +F8 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni1E57 +ENCODING 7767 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +20 +00 +F8 +CC +CC +CC +CC +CC +F8 +C0 +C0 +ENDCHAR +STARTCHAR uni1E58 +ENCODING 7768 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +20 +00 +F8 +CC +CC +CC +F8 +E0 +F0 +D8 +CC +ENDCHAR +STARTCHAR uni1E59 +ENCODING 7769 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +20 +00 +7C +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni1E5A +ENCODING 7770 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +F8 +CC +CC +CC +F8 +E0 +F0 +D8 +CC +00 +20 +ENDCHAR +STARTCHAR uni1E5B +ENCODING 7771 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +7C +C0 +C0 +C0 +C0 +C0 +C0 +00 +20 +ENDCHAR +STARTCHAR uni1E5C +ENCODING 7772 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +78 +00 +F8 +CC +CC +CC +F8 +E0 +F0 +D8 +CC +00 +20 +ENDCHAR +STARTCHAR uni1E5D +ENCODING 7773 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +78 +00 +7C +C0 +C0 +C0 +C0 +C0 +C0 +00 +20 +ENDCHAR +STARTCHAR uni1E5E +ENCODING 7774 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +F8 +CC +CC +CC +F8 +E0 +F0 +D8 +CC +00 +78 +ENDCHAR +STARTCHAR uni1E5F +ENCODING 7775 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +7C +C0 +C0 +C0 +C0 +C0 +C0 +00 +78 +ENDCHAR +STARTCHAR uni1E60 +ENCODING 7776 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +20 +00 +7C +C0 +C0 +C0 +78 +0C +0C +0C +F8 +ENDCHAR +STARTCHAR uni1E61 +ENCODING 7777 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +20 +00 +7C +C0 +C0 +78 +0C +0C +F8 +ENDCHAR +STARTCHAR uni1E62 +ENCODING 7778 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +7C +C0 +C0 +C0 +78 +0C +0C +0C +F8 +00 +20 +ENDCHAR +STARTCHAR uni1E63 +ENCODING 7779 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +7C +C0 +C0 +78 +0C +0C +F8 +00 +20 +ENDCHAR +STARTCHAR uni1E64 +ENCODING 7780 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +0C +58 +00 +7C +C0 +C0 +78 +0C +0C +0C +F8 +ENDCHAR +STARTCHAR uni1E65 +ENCODING 7781 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +0C +58 +00 +7C +C0 +C0 +78 +0C +0C +F8 +ENDCHAR +STARTCHAR uni1E66 +ENCODING 7782 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +D8 +74 +00 +7C +C0 +C0 +78 +0C +0C +0C +F8 +ENDCHAR +STARTCHAR uni1E67 +ENCODING 7783 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +D8 +74 +00 +7C +C0 +C0 +78 +0C +0C +F8 +ENDCHAR +STARTCHAR uni1E68 +ENCODING 7784 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +20 +00 +7C +C0 +C0 +C0 +78 +0C +0C +0C +F8 +00 +20 +ENDCHAR +STARTCHAR uni1E69 +ENCODING 7785 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +20 +00 +7C +C0 +C0 +78 +0C +0C +F8 +00 +20 +ENDCHAR +STARTCHAR uni1E6A +ENCODING 7786 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +20 +00 +FC +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni1E6B +ENCODING 7787 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +80 +00 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +C0 +78 +ENDCHAR +STARTCHAR uni1E6C +ENCODING 7788 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +FC +30 +30 +30 +30 +30 +30 +30 +30 +00 +20 +ENDCHAR +STARTCHAR uni1E6D +ENCODING 7789 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +C0 +C0 +F8 +C0 +C0 +C0 +C0 +C0 +78 +00 +40 +ENDCHAR +STARTCHAR uni1E6E +ENCODING 7790 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +FC +30 +30 +30 +30 +30 +30 +30 +30 +00 +78 +ENDCHAR +STARTCHAR uni1E6F +ENCODING 7791 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +C0 +C0 +F8 +C0 +C0 +C0 +C0 +C0 +78 +00 +F0 +ENDCHAR +STARTCHAR uni1E70 +ENCODING 7792 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +FC +30 +30 +30 +30 +30 +30 +30 +00 +30 +58 +ENDCHAR +STARTCHAR uni1E71 +ENCODING 7793 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +C0 +C0 +F8 +C0 +C0 +C0 +C0 +78 +00 +60 +B0 +ENDCHAR +STARTCHAR uni1E72 +ENCODING 7794 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +CC +CC +CC +CC +CC +CC +CC +CC +78 +00 +6C +ENDCHAR +STARTCHAR uni1E73 +ENCODING 7795 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +CC +CC +CC +CC +CC +CC +7C +00 +6C +ENDCHAR +STARTCHAR uni1E74 +ENCODING 7796 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +CC +CC +CC +CC +CC +CC +CC +78 +00 +74 +B8 +ENDCHAR +STARTCHAR uni1E75 +ENCODING 7797 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +CC +CC +CC +CC +CC +7C +00 +74 +B8 +ENDCHAR +STARTCHAR uni1E76 +ENCODING 7798 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +CC +CC +CC +CC +CC +CC +CC +78 +00 +30 +58 +ENDCHAR +STARTCHAR uni1E77 +ENCODING 7799 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +CC +CC +CC +CC +CC +7C +00 +30 +58 +ENDCHAR +STARTCHAR uni1E78 +ENCODING 7800 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +C0 +34 +58 +00 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1E79 +ENCODING 7801 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +C0 +34 +58 +00 +CC +CC +CC +CC +CC +7C +ENDCHAR +STARTCHAR uni1E7A +ENCODING 7802 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +6C +00 +78 +00 +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1E7B +ENCODING 7803 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +6C +00 +78 +00 +CC +CC +CC +CC +CC +CC +7C +ENDCHAR +STARTCHAR uni1E7C +ENCODING 7804 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +74 +B8 +00 +CC +CC +CC +78 +78 +78 +30 +30 +ENDCHAR +STARTCHAR uni1E7D +ENCODING 7805 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +64 +B4 +98 +00 +CC +CC +78 +78 +78 +30 +30 +ENDCHAR +STARTCHAR uni1E7E +ENCODING 7806 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +CC +CC +CC +78 +78 +78 +30 +30 +30 +00 +20 +ENDCHAR +STARTCHAR uni1E7F +ENCODING 7807 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +CC +CC +78 +78 +78 +30 +30 +00 +20 +ENDCHAR +STARTCHAR Wgrave +ENCODING 7808 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +30 +C4 +C4 +C4 +D4 +D4 +EC +EC +C4 +C4 +ENDCHAR +STARTCHAR wgrave +ENCODING 7809 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +60 +30 +00 +C4 +C4 +C4 +D4 +D4 +EC +C4 +ENDCHAR +STARTCHAR Wacute +ENCODING 7810 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +30 +C4 +C4 +C4 +D4 +D4 +EC +EC +C4 +C4 +ENDCHAR +STARTCHAR wacute +ENCODING 7811 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +18 +30 +00 +C4 +C4 +C4 +D4 +D4 +EC +C4 +ENDCHAR +STARTCHAR Wdieresis +ENCODING 7812 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +6C +00 +C4 +C4 +C4 +D4 +D4 +EC +EC +C4 +C4 +ENDCHAR +STARTCHAR wdieresis +ENCODING 7813 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +6C +00 +C4 +C4 +C4 +D4 +D4 +EC +C4 +ENDCHAR +STARTCHAR uni1E86 +ENCODING 7814 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +20 +00 +C4 +C4 +C4 +D4 +D4 +EC +EC +C4 +C4 +ENDCHAR +STARTCHAR uni1E87 +ENCODING 7815 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +20 +00 +C4 +C4 +C4 +D4 +D4 +EC +C4 +ENDCHAR +STARTCHAR uni1E88 +ENCODING 7816 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +C4 +C4 +C4 +D4 +D4 +EC +EC +C4 +C4 +00 +20 +ENDCHAR +STARTCHAR uni1E89 +ENCODING 7817 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +C4 +C4 +C4 +D4 +D4 +EC +C4 +00 +20 +ENDCHAR +STARTCHAR uni1E8A +ENCODING 7818 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +20 +00 +CC +CC +CC +78 +30 +78 +CC +CC +CC +ENDCHAR +STARTCHAR uni1E8B +ENCODING 7819 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +20 +00 +CC +CC +78 +30 +78 +CC +CC +ENDCHAR +STARTCHAR uni1E8C +ENCODING 7820 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +6C +00 +CC +CC +CC +78 +30 +78 +CC +CC +CC +ENDCHAR +STARTCHAR uni1E8D +ENCODING 7821 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +6C +00 +CC +CC +78 +30 +78 +CC +CC +ENDCHAR +STARTCHAR uni1E8E +ENCODING 7822 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +20 +00 +CC +CC +78 +78 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni1E8F +ENCODING 7823 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +20 +00 +CC +CC +CC +CC +CC +CC +7C +0C +78 +ENDCHAR +STARTCHAR uni1E90 +ENCODING 7824 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +58 +00 +FC +0C +0C +18 +30 +60 +C0 +FC +ENDCHAR +STARTCHAR uni1E91 +ENCODING 7825 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +30 +58 +00 +FC +0C +18 +30 +60 +C0 +FC +ENDCHAR +STARTCHAR uni1E92 +ENCODING 7826 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +FC +0C +0C +18 +30 +60 +C0 +C0 +FC +00 +20 +ENDCHAR +STARTCHAR uni1E93 +ENCODING 7827 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +FC +0C +18 +30 +60 +C0 +FC +00 +20 +ENDCHAR +STARTCHAR uni1E94 +ENCODING 7828 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +FC +0C +0C +18 +30 +60 +C0 +C0 +FC +00 +78 +ENDCHAR +STARTCHAR uni1E95 +ENCODING 7829 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +FC +0C +18 +30 +60 +C0 +FC +00 +78 +ENDCHAR +STARTCHAR uni1E96 +ENCODING 7830 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +C0 +C0 +F8 +CC +CC +CC +CC +CC +CC +00 +78 +ENDCHAR +STARTCHAR uni1E97 +ENCODING 7831 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +D8 +00 +60 +60 +F0 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR uni1E98 +ENCODING 7832 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +CC +78 +00 +C4 +C4 +C4 +D4 +D4 +EC +C4 +ENDCHAR +STARTCHAR uni1E99 +ENCODING 7833 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +CC +78 +00 +CC +CC +CC +CC +CC +CC +7C +0C +78 +ENDCHAR +STARTCHAR uni1E9A +ENCODING 7834 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +04 +02 +02 +04 +78 +0C +0C +7C +CC +CC +7C +ENDCHAR +STARTCHAR uni1E9B +ENCODING 7835 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 0 0 +BITMAP +20 +00 +38 +60 +60 +E0 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni1E9C +ENCODING 7836 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +1C +30 +70 +3C +38 +70 +F0 +30 +30 +ENDCHAR +STARTCHAR uni1E9D +ENCODING 7837 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +38 +60 +F0 +60 +E0 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni1E9E +ENCODING 7838 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +CC +D8 +D0 +D8 +CC +CC +D8 +ENDCHAR +STARTCHAR uni1E9F +ENCODING 7839 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +C0 +C0 +78 +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1EA0 +ENCODING 7840 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +78 +CC +CC +CC +FC +CC +CC +CC +CC +00 +20 +ENDCHAR +STARTCHAR uni1EA1 +ENCODING 7841 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +78 +0C +0C +7C +CC +CC +7C +00 +20 +ENDCHAR +STARTCHAR uni1EA2 +ENCODING 7842 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +E0 +30 +78 +CC +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni1EA3 +ENCODING 7843 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +E0 +30 +00 +78 +0C +0C +7C +CC +CC +7C +ENDCHAR +STARTCHAR uni1EA4 +ENCODING 7844 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +D8 +2C +00 +78 +CC +CC +FC +CC +CC +CC +ENDCHAR +STARTCHAR uni1EA5 +ENCODING 7845 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +D8 +2C +00 +78 +0C +0C +7C +CC +CC +7C +ENDCHAR +STARTCHAR uni1EA6 +ENCODING 7846 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +6C +B0 +00 +78 +CC +CC +FC +CC +CC +CC +ENDCHAR +STARTCHAR uni1EA7 +ENCODING 7847 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +6C +B0 +00 +78 +0C +0C +7C +CC +CC +7C +ENDCHAR +STARTCHAR uni1EA8 +ENCODING 7848 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +08 +30 +58 +00 +78 +CC +FC +CC +CC +CC +ENDCHAR +STARTCHAR uni1EA9 +ENCODING 7849 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +08 +30 +58 +00 +78 +0C +7C +CC +CC +7C +ENDCHAR +STARTCHAR uni1EAA +ENCODING 7850 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +34 +58 +30 +58 +00 +78 +CC +FC +CC +CC +CC +ENDCHAR +STARTCHAR uni1EAB +ENCODING 7851 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +34 +58 +30 +58 +00 +78 +0C +7C +CC +CC +7C +ENDCHAR +STARTCHAR uni1EAC +ENCODING 7852 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +30 +58 +00 +78 +CC +CC +FC +CC +CC +CC +CC +00 +20 +ENDCHAR +STARTCHAR uni1EAD +ENCODING 7853 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +30 +58 +00 +78 +0C +0C +7C +CC +CC +7C +00 +20 +ENDCHAR +STARTCHAR uni1EAE +ENCODING 7854 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +30 +CC +78 +00 +78 +CC +FC +CC +CC +CC +ENDCHAR +STARTCHAR uni1EAF +ENCODING 7855 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +30 +CC +78 +00 +78 +0C +7C +CC +CC +7C +ENDCHAR +STARTCHAR uni1EB0 +ENCODING 7856 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +30 +CC +78 +00 +78 +CC +FC +CC +CC +CC +ENDCHAR +STARTCHAR uni1EB1 +ENCODING 7857 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +30 +CC +78 +00 +78 +0C +7C +CC +CC +7C +ENDCHAR +STARTCHAR uni1EB2 +ENCODING 7858 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +C0 +20 +CC +78 +00 +78 +CC +FC +CC +CC +CC +ENDCHAR +STARTCHAR uni1EB3 +ENCODING 7859 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +C0 +20 +CC +78 +00 +78 +0C +7C +CC +CC +7C +ENDCHAR +STARTCHAR uni1EB4 +ENCODING 7860 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +64 +98 +CC +78 +00 +78 +CC +FC +CC +CC +CC +ENDCHAR +STARTCHAR uni1EB5 +ENCODING 7861 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +64 +98 +CC +78 +00 +78 +0C +7C +CC +CC +7C +ENDCHAR +STARTCHAR uni1EB6 +ENCODING 7862 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +CC +78 +00 +78 +CC +CC +FC +CC +CC +CC +CC +00 +20 +ENDCHAR +STARTCHAR uni1EB7 +ENCODING 7863 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +CC +78 +00 +78 +0C +0C +7C +CC +CC +7C +00 +20 +ENDCHAR +STARTCHAR uni1EB8 +ENCODING 7864 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +FC +00 +20 +ENDCHAR +STARTCHAR uni1EB9 +ENCODING 7865 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +78 +CC +CC +FC +C0 +C0 +7C +00 +20 +ENDCHAR +STARTCHAR uni1EBA +ENCODING 7866 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +10 +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR uni1EBB +ENCODING 7867 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +60 +10 +00 +78 +CC +CC +FC +C0 +C0 +7C +ENDCHAR +STARTCHAR uni1EBC +ENCODING 7868 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +74 +B8 +00 +FC +C0 +C0 +F8 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR uni1EBD +ENCODING 7869 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +64 +B4 +98 +00 +78 +CC +CC +FC +C0 +C0 +7C +ENDCHAR +STARTCHAR uni1EBE +ENCODING 7870 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +D8 +2C +00 +FC +C0 +C0 +F8 +C0 +C0 +FC +ENDCHAR +STARTCHAR uni1EBF +ENCODING 7871 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +D8 +2C +00 +78 +CC +CC +FC +C0 +C0 +7C +ENDCHAR +STARTCHAR uni1EC0 +ENCODING 7872 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +6C +B0 +00 +FC +C0 +C0 +F8 +C0 +C0 +FC +ENDCHAR +STARTCHAR uni1EC1 +ENCODING 7873 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +6C +B0 +00 +78 +CC +CC +FC +C0 +C0 +7C +ENDCHAR +STARTCHAR uni1EC2 +ENCODING 7874 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +C0 +30 +58 +00 +FC +C0 +C0 +F8 +C0 +C0 +FC +ENDCHAR +STARTCHAR uni1EC3 +ENCODING 7875 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +C0 +30 +58 +00 +78 +CC +CC +FC +C0 +C0 +7C +ENDCHAR +STARTCHAR uni1EC4 +ENCODING 7876 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +74 +B8 +30 +58 +00 +FC +C0 +F8 +C0 +C0 +FC +ENDCHAR +STARTCHAR uni1EC5 +ENCODING 7877 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +74 +B8 +30 +58 +00 +78 +CC +FC +C0 +C0 +7C +ENDCHAR +STARTCHAR uni1EC6 +ENCODING 7878 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +30 +58 +00 +FC +C0 +C0 +F8 +C0 +C0 +C0 +FC +00 +20 +ENDCHAR +STARTCHAR uni1EC7 +ENCODING 7879 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +30 +58 +00 +78 +CC +CC +FC +C0 +C0 +7C +00 +20 +ENDCHAR +STARTCHAR uni1EC8 +ENCODING 7880 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +10 +FC +30 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni1EC9 +ENCODING 7881 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 10 1 0 +BITMAP +C0 +20 +00 +E0 +60 +60 +60 +60 +60 +F0 +ENDCHAR +STARTCHAR uni1ECA +ENCODING 7882 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +FC +30 +30 +30 +30 +30 +30 +30 +FC +00 +20 +ENDCHAR +STARTCHAR uni1ECB +ENCODING 7883 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 12 1 -2 +BITMAP +60 +60 +00 +E0 +60 +60 +60 +60 +60 +F0 +00 +40 +ENDCHAR +STARTCHAR uni1ECC +ENCODING 7884 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +78 +CC +CC +CC +CC +CC +CC +CC +78 +00 +20 +ENDCHAR +STARTCHAR uni1ECD +ENCODING 7885 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +78 +CC +CC +CC +CC +CC +78 +00 +20 +ENDCHAR +STARTCHAR uni1ECE +ENCODING 7886 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +10 +78 +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1ECF +ENCODING 7887 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +60 +10 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1ED0 +ENCODING 7888 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +D8 +2C +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1ED1 +ENCODING 7889 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +D8 +2C +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1ED2 +ENCODING 7890 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +6C +B0 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1ED3 +ENCODING 7891 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +6C +B0 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1ED4 +ENCODING 7892 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +C0 +30 +58 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1ED5 +ENCODING 7893 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +C0 +30 +58 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1ED6 +ENCODING 7894 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +74 +B8 +30 +58 +00 +78 +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1ED7 +ENCODING 7895 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +74 +B8 +30 +58 +00 +78 +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1ED8 +ENCODING 7896 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +30 +58 +00 +78 +CC +CC +CC +CC +CC +CC +78 +00 +20 +ENDCHAR +STARTCHAR uni1ED9 +ENCODING 7897 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +30 +58 +00 +78 +CC +CC +CC +CC +CC +78 +00 +20 +ENDCHAR +STARTCHAR uni1EDA +ENCODING 7898 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +18 +32 +7A +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1EDB +ENCODING 7899 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +18 +30 +02 +7A +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1EDC +ENCODING 7900 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +60 +32 +7A +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1EDD +ENCODING 7901 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +60 +30 +02 +7A +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1EDE +ENCODING 7902 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +60 +12 +7A +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1EDF +ENCODING 7903 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +60 +10 +02 +7A +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1EE0 +ENCODING 7904 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +74 +B8 +02 +7A +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1EE1 +ENCODING 7905 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +64 +B4 +98 +02 +7A +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1EE2 +ENCODING 7906 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 12 0 -2 +BITMAP +02 +7A +CC +CC +CC +CC +CC +CC +CC +78 +00 +20 +ENDCHAR +STARTCHAR uni1EE3 +ENCODING 7907 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 10 0 -2 +BITMAP +02 +7A +CC +CC +CC +CC +CC +78 +00 +20 +ENDCHAR +STARTCHAR uni1EE4 +ENCODING 7908 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +CC +CC +CC +CC +CC +CC +CC +CC +78 +00 +20 +ENDCHAR +STARTCHAR uni1EE5 +ENCODING 7909 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +CC +CC +CC +CC +CC +CC +7C +00 +20 +ENDCHAR +STARTCHAR uni1EE6 +ENCODING 7910 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +10 +CC +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1EE7 +ENCODING 7911 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +60 +10 +00 +CC +CC +CC +CC +CC +CC +7C +ENDCHAR +STARTCHAR uni1EE8 +ENCODING 7912 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +18 +32 +02 +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1EE9 +ENCODING 7913 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +18 +32 +02 +CC +CC +CC +CC +CC +CC +7C +ENDCHAR +STARTCHAR uni1EEA +ENCODING 7914 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +60 +32 +02 +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1EEB +ENCODING 7915 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +60 +32 +02 +CC +CC +CC +CC +CC +CC +7C +ENDCHAR +STARTCHAR uni1EEC +ENCODING 7916 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +62 +12 +CC +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1EED +ENCODING 7917 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +60 +12 +02 +CC +CC +CC +CC +CC +CC +7C +ENDCHAR +STARTCHAR uni1EEE +ENCODING 7918 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +74 +BA +02 +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1EEF +ENCODING 7919 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +64 +B4 +9A +02 +CC +CC +CC +CC +CC +CC +7C +ENDCHAR +STARTCHAR uni1EF0 +ENCODING 7920 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +02 +02 +CC +CC +CC +CC +CC +CC +CC +CC +78 +00 +10 +ENDCHAR +STARTCHAR uni1EF1 +ENCODING 7921 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +02 +02 +CC +CC +CC +CC +CC +CC +7C +00 +20 +ENDCHAR +STARTCHAR Ygrave +ENCODING 7922 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +30 +CC +CC +78 +78 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR ygrave +ENCODING 7923 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +60 +30 +00 +CC +CC +CC +CC +CC +CC +7C +0C +78 +ENDCHAR +STARTCHAR uni1EF4 +ENCODING 7924 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +CC +CC +78 +78 +30 +30 +30 +30 +30 +00 +20 +ENDCHAR +STARTCHAR uni1EF5 +ENCODING 7925 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +CC +CC +CC +CC +CC +7C +18 +F0 +04 +ENDCHAR +STARTCHAR uni1EF6 +ENCODING 7926 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +10 +CC +CC +78 +78 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni1EF7 +ENCODING 7927 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +60 +10 +00 +CC +CC +CC +CC +CC +CC +7C +0C +78 +ENDCHAR +STARTCHAR uni1EF8 +ENCODING 7928 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +74 +B8 +00 +CC +CC +78 +78 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni1EF9 +ENCODING 7929 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +64 +B4 +98 +00 +CC +CC +CC +CC +CC +CC +7C +0C +78 +ENDCHAR +STARTCHAR uni1EFA +ENCODING 7930 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +D0 +D0 +D0 +D0 +D0 +D0 +D0 +D0 +FC +ENDCHAR +STARTCHAR uni1EFB +ENCODING 7931 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +F8 +68 +68 +68 +68 +68 +68 +68 +34 +ENDCHAR +STARTCHAR uni1EFC +ENCODING 7932 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +38 +60 +C0 +C0 +D8 +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1EFD +ENCODING 7933 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +38 +60 +C0 +D8 +CC +CC +78 +ENDCHAR +STARTCHAR uni1EFE +ENCODING 7934 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 -1 +BITMAP +CC +CC +78 +78 +30 +30 +30 +70 +D0 +60 +ENDCHAR +STARTCHAR uni1EFF +ENCODING 7935 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +CC +CC +CC +CC +7C +0C +6C +DC +78 +ENDCHAR +STARTCHAR uni1F00 +ENCODING 7936 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +10 +20 +00 +6C +DC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR uni1F01 +ENCODING 7937 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +20 +10 +00 +6C +DC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR uni1F02 +ENCODING 7938 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +C0 +58 +8C +00 +6C +DC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR uni1F03 +ENCODING 7939 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +C0 +98 +4C +00 +6C +DC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR uni1F04 +ENCODING 7940 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +C0 +4C +98 +00 +6C +DC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR uni1F05 +ENCODING 7941 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +C0 +8C +58 +00 +6C +DC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR uni1F06 +ENCODING 7942 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +CC +30 +10 +20 +6C +DC +CC +CC +DC +6C +ENDCHAR +STARTCHAR uni1F07 +ENCODING 7943 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +CC +30 +20 +10 +6C +DC +CC +CC +DC +6C +ENDCHAR +STARTCHAR uni1F08 +ENCODING 7944 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +10 +20 +78 +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni1F09 +ENCODING 7945 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +20 +10 +78 +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni1F0A +ENCODING 7946 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +D8 +4C +80 +78 +CC +CC +CC +FC +CC +CC +CC +ENDCHAR +STARTCHAR uni1F0B +ENCODING 7947 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +D8 +8C +40 +78 +CC +CC +CC +FC +CC +CC +CC +ENDCHAR +STARTCHAR uni1F0C +ENCODING 7948 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +CC +58 +80 +78 +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni1F0D +ENCODING 7949 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +CC +98 +40 +78 +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni1F0E +ENCODING 7950 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +CC +30 +10 +20 +78 +CC +FC +CC +CC +CC +ENDCHAR +STARTCHAR uni1F0F +ENCODING 7951 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +CC +30 +20 +10 +78 +CC +FC +CC +CC +CC +ENDCHAR +STARTCHAR uni1F10 +ENCODING 7952 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +10 +20 +00 +7C +C0 +C0 +78 +C0 +C0 +7C +ENDCHAR +STARTCHAR uni1F11 +ENCODING 7953 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +20 +10 +00 +7C +C0 +C0 +78 +C0 +C0 +7C +ENDCHAR +STARTCHAR uni1F12 +ENCODING 7954 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +C0 +58 +8C +00 +7C +C0 +C0 +78 +C0 +C0 +7C +ENDCHAR +STARTCHAR uni1F13 +ENCODING 7955 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +C0 +98 +4C +00 +7C +C0 +C0 +78 +C0 +C0 +7C +ENDCHAR +STARTCHAR uni1F14 +ENCODING 7956 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +C0 +4C +98 +00 +7C +C0 +C0 +78 +C0 +C0 +7C +ENDCHAR +STARTCHAR uni1F15 +ENCODING 7957 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +C0 +8C +58 +00 +7C +C0 +C0 +78 +C0 +C0 +7C +ENDCHAR +STARTCHAR uni1F18 +ENCODING 7960 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +10 +20 +FC +C0 +C0 +F8 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR uni1F19 +ENCODING 7961 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +20 +10 +FC +C0 +C0 +F8 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR uni1F1A +ENCODING 7962 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +D8 +4C +80 +00 +FC +C0 +C0 +F8 +C0 +C0 +FC +ENDCHAR +STARTCHAR uni1F1B +ENCODING 7963 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +D8 +8C +40 +00 +FC +C0 +C0 +F8 +C0 +C0 +FC +ENDCHAR +STARTCHAR uni1F1C +ENCODING 7964 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +CC +58 +80 +00 +FC +C0 +C0 +F8 +C0 +C0 +FC +ENDCHAR +STARTCHAR uni1F1D +ENCODING 7965 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +CC +98 +40 +00 +FC +C0 +C0 +F8 +C0 +C0 +FC +ENDCHAR +STARTCHAR uni1F20 +ENCODING 7968 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +30 +10 +20 +00 +F8 +CC +CC +CC +CC +CC +CC +0C +0C +ENDCHAR +STARTCHAR uni1F21 +ENCODING 7969 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +30 +20 +10 +00 +F8 +CC +CC +CC +CC +CC +CC +0C +0C +ENDCHAR +STARTCHAR uni1F22 +ENCODING 7970 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +C0 +58 +8C +00 +F8 +CC +CC +CC +CC +CC +CC +0C +0C +ENDCHAR +STARTCHAR uni1F23 +ENCODING 7971 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +C0 +98 +4C +00 +F8 +CC +CC +CC +CC +CC +CC +0C +0C +ENDCHAR +STARTCHAR uni1F24 +ENCODING 7972 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +C0 +4C +98 +00 +F8 +CC +CC +CC +CC +CC +CC +0C +0C +ENDCHAR +STARTCHAR uni1F25 +ENCODING 7973 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +C0 +8C +58 +00 +F8 +CC +CC +CC +CC +CC +CC +0C +0C +ENDCHAR +STARTCHAR uni1F26 +ENCODING 7974 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +78 +CC +30 +10 +20 +F8 +CC +CC +CC +CC +CC +0C +0C +ENDCHAR +STARTCHAR uni1F27 +ENCODING 7975 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +78 +CC +30 +20 +10 +F8 +CC +CC +CC +CC +CC +0C +0C +ENDCHAR +STARTCHAR uni1F28 +ENCODING 7976 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +C0 +40 +80 +CC +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni1F29 +ENCODING 7977 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +C0 +80 +40 +CC +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni1F2A +ENCODING 7978 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +D8 +4C +80 +CC +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni1F2B +ENCODING 7979 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +D8 +8C +40 +CC +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni1F2C +ENCODING 7980 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +CC +58 +80 +CC +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni1F2D +ENCODING 7981 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +CC +98 +40 +CC +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni1F2E +ENCODING 7982 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +CC +30 +10 +20 +CC +CC +FC +CC +CC +CC +ENDCHAR +STARTCHAR uni1F2F +ENCODING 7983 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +CC +30 +20 +10 +CC +CC +FC +CC +CC +CC +ENDCHAR +STARTCHAR uni1F30 +ENCODING 7984 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +60 +20 +40 +00 +E0 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR uni1F31 +ENCODING 7985 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +60 +40 +20 +00 +E0 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR uni1F32 +ENCODING 7986 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +C0 +58 +8C +00 +70 +30 +30 +30 +30 +30 +1C +ENDCHAR +STARTCHAR uni1F33 +ENCODING 7987 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +C0 +98 +4C +00 +70 +30 +30 +30 +30 +30 +1C +ENDCHAR +STARTCHAR uni1F34 +ENCODING 7988 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +C0 +4C +98 +00 +70 +30 +30 +30 +30 +30 +1C +ENDCHAR +STARTCHAR uni1F35 +ENCODING 7989 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +C0 +8C +58 +00 +70 +30 +30 +30 +30 +30 +1C +ENDCHAR +STARTCHAR uni1F36 +ENCODING 7990 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +CC +30 +10 +20 +70 +30 +30 +30 +30 +1C +ENDCHAR +STARTCHAR uni1F37 +ENCODING 7991 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +CC +30 +20 +10 +70 +30 +30 +30 +30 +1C +ENDCHAR +STARTCHAR uni1F38 +ENCODING 7992 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +10 +20 +FC +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni1F39 +ENCODING 7993 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +20 +10 +FC +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni1F3A +ENCODING 7994 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +D8 +4C +80 +FC +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni1F3B +ENCODING 7995 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +D8 +8C +40 +FC +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni1F3C +ENCODING 7996 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +CC +58 +80 +FC +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni1F3D +ENCODING 7997 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +CC +98 +40 +FC +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni1F3E +ENCODING 7998 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +CC +30 +10 +20 +FC +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni1F3F +ENCODING 7999 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +CC +30 +10 +20 +FC +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni1F40 +ENCODING 8000 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +10 +20 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1F41 +ENCODING 8001 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +20 +10 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1F42 +ENCODING 8002 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +C0 +58 +8C +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1F43 +ENCODING 8003 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +C0 +98 +4C +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1F44 +ENCODING 8004 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +C0 +4C +98 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1F45 +ENCODING 8005 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +C0 +8C +58 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1F48 +ENCODING 8008 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +10 +20 +78 +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1F49 +ENCODING 8009 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +20 +10 +78 +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1F4A +ENCODING 8010 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +D8 +4C +80 +78 +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1F4B +ENCODING 8011 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +D8 +8C +40 +78 +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1F4C +ENCODING 8012 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +CC +58 +80 +78 +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1F4D +ENCODING 8013 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +CC +98 +40 +78 +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1F50 +ENCODING 8016 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +10 +20 +00 +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1F51 +ENCODING 8017 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +20 +10 +00 +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1F52 +ENCODING 8018 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +C0 +58 +8C +00 +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1F53 +ENCODING 8019 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +C0 +98 +4C +00 +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1F54 +ENCODING 8020 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +C0 +4C +98 +00 +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1F55 +ENCODING 8021 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +C0 +8C +58 +00 +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1F56 +ENCODING 8022 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +CC +30 +10 +20 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1F57 +ENCODING 8023 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +CC +30 +20 +10 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1F59 +ENCODING 8025 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +20 +10 +CC +CC +78 +78 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni1F5B +ENCODING 8027 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +D8 +8C +40 +CC +CC +78 +78 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni1F5D +ENCODING 8029 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +CC +98 +40 +CC +CC +78 +78 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni1F5F +ENCODING 8031 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +CC +30 +20 +10 +CC +CC +78 +30 +30 +30 +ENDCHAR +STARTCHAR uni1F60 +ENCODING 8032 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +10 +20 +00 +CC +CC +CC +FC +FC +FC +78 +ENDCHAR +STARTCHAR uni1F61 +ENCODING 8033 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +20 +10 +00 +CC +CC +CC +FC +FC +FC +78 +ENDCHAR +STARTCHAR uni1F62 +ENCODING 8034 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +C0 +58 +8C +00 +CC +CC +CC +FC +FC +FC +78 +ENDCHAR +STARTCHAR uni1F63 +ENCODING 8035 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +C0 +98 +4C +00 +CC +CC +CC +FC +FC +FC +78 +ENDCHAR +STARTCHAR uni1F64 +ENCODING 8036 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +C0 +4C +98 +00 +CC +CC +CC +FC +FC +FC +78 +ENDCHAR +STARTCHAR uni1F65 +ENCODING 8037 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +C0 +8C +58 +00 +CC +CC +CC +FC +FC +FC +78 +ENDCHAR +STARTCHAR uni1F66 +ENCODING 8038 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +CC +30 +10 +20 +CC +CC +CC +FC +FC +78 +ENDCHAR +STARTCHAR uni1F67 +ENCODING 8039 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +CC +30 +20 +10 +CC +CC +CC +FC +FC +78 +ENDCHAR +STARTCHAR uni1F68 +ENCODING 8040 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +10 +20 +78 +CC +CC +CC +CC +CC +48 +CC +ENDCHAR +STARTCHAR uni1F69 +ENCODING 8041 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +20 +10 +78 +CC +CC +CC +CC +CC +48 +CC +ENDCHAR +STARTCHAR uni1F6A +ENCODING 8042 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +D8 +4C +80 +78 +CC +CC +CC +CC +CC +48 +CC +ENDCHAR +STARTCHAR uni1F6B +ENCODING 8043 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +D8 +8C +40 +78 +CC +CC +CC +CC +CC +48 +CC +ENDCHAR +STARTCHAR uni1F6C +ENCODING 8044 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +CC +58 +80 +78 +CC +CC +CC +CC +CC +48 +CC +ENDCHAR +STARTCHAR uni1F6D +ENCODING 8045 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +CC +98 +40 +78 +CC +CC +CC +CC +CC +48 +CC +ENDCHAR +STARTCHAR uni1F6E +ENCODING 8046 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +CC +30 +10 +20 +78 +CC +CC +CC +48 +CC +ENDCHAR +STARTCHAR uni1F6F +ENCODING 8047 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +CC +30 +20 +10 +78 +CC +CC +CC +48 +CC +ENDCHAR +STARTCHAR uni1F70 +ENCODING 8048 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +60 +30 +00 +6C +DC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR uni1F71 +ENCODING 8049 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +18 +30 +00 +6C +DC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR uni1F72 +ENCODING 8050 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +60 +30 +00 +7C +C0 +C0 +78 +C0 +C0 +7C +ENDCHAR +STARTCHAR uni1F73 +ENCODING 8051 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +18 +30 +00 +7C +C0 +C0 +78 +C0 +C0 +7C +ENDCHAR +STARTCHAR uni1F74 +ENCODING 8052 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +60 +30 +00 +F8 +CC +CC +CC +CC +CC +CC +0C +0C +ENDCHAR +STARTCHAR uni1F75 +ENCODING 8053 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +18 +30 +00 +F8 +CC +CC +CC +CC +CC +CC +0C +0C +ENDCHAR +STARTCHAR uni1F76 +ENCODING 8054 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +C0 +60 +00 +E0 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR uni1F77 +ENCODING 8055 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +30 +60 +00 +E0 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR uni1F78 +ENCODING 8056 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +60 +30 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1F79 +ENCODING 8057 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +18 +30 +00 +78 +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1F7A +ENCODING 8058 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +60 +30 +00 +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1F7B +ENCODING 8059 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +18 +30 +00 +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1F7C +ENCODING 8060 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +60 +30 +00 +CC +CC +CC +FC +FC +FC +78 +ENDCHAR +STARTCHAR uni1F7D +ENCODING 8061 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +18 +30 +00 +CC +CC +CC +FC +FC +FC +78 +ENDCHAR +STARTCHAR uni1F80 +ENCODING 8064 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +30 +10 +20 +00 +6C +DC +CC +CC +CC +DC +7C +30 +18 +ENDCHAR +STARTCHAR uni1F81 +ENCODING 8065 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +30 +20 +10 +00 +6C +DC +CC +CC +CC +DC +7C +30 +18 +ENDCHAR +STARTCHAR uni1F82 +ENCODING 8066 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +C0 +58 +8C +00 +6C +DC +CC +CC +CC +DC +7C +30 +18 +ENDCHAR +STARTCHAR uni1F83 +ENCODING 8067 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +C0 +98 +4C +00 +6C +DC +CC +CC +CC +DC +7C +30 +18 +ENDCHAR +STARTCHAR uni1F84 +ENCODING 8068 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +C0 +4C +98 +00 +6C +DC +CC +CC +CC +DC +7C +30 +18 +ENDCHAR +STARTCHAR uni1F85 +ENCODING 8069 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +C0 +8C +58 +00 +6C +DC +CC +CC +CC +DC +7C +30 +18 +ENDCHAR +STARTCHAR uni1F86 +ENCODING 8070 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +78 +CC +30 +10 +20 +6C +DC +CC +CC +DC +7C +30 +18 +ENDCHAR +STARTCHAR uni1F87 +ENCODING 8071 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +78 +CC +30 +20 +10 +6C +DC +CC +CC +DC +7C +30 +18 +ENDCHAR +STARTCHAR uni1F88 +ENCODING 8072 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +30 +10 +20 +78 +CC +CC +FC +CC +CC +CC +CC +30 +18 +ENDCHAR +STARTCHAR uni1F89 +ENCODING 8073 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +30 +20 +10 +78 +CC +CC +FC +CC +CC +CC +CC +30 +18 +ENDCHAR +STARTCHAR uni1F8A +ENCODING 8074 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +D8 +4C +80 +78 +CC +CC +CC +FC +CC +CC +CC +30 +18 +ENDCHAR +STARTCHAR uni1F8B +ENCODING 8075 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +D8 +8C +40 +78 +CC +CC +CC +FC +CC +CC +CC +30 +18 +ENDCHAR +STARTCHAR uni1F8C +ENCODING 8076 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +CC +58 +80 +78 +CC +CC +FC +CC +CC +CC +CC +30 +18 +ENDCHAR +STARTCHAR uni1F8D +ENCODING 8077 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +CC +98 +40 +78 +CC +CC +FC +CC +CC +CC +CC +30 +18 +ENDCHAR +STARTCHAR uni1F8E +ENCODING 8078 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +78 +CC +30 +10 +20 +78 +CC +FC +CC +CC +CC +30 +18 +ENDCHAR +STARTCHAR uni1F8F +ENCODING 8079 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +78 +CC +30 +20 +10 +78 +CC +FC +CC +CC +CC +30 +18 +ENDCHAR +STARTCHAR uni1F90 +ENCODING 8080 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +30 +10 +20 +00 +F8 +CC +CC +CC +CC +CC +0C +CC +6C +ENDCHAR +STARTCHAR uni1F91 +ENCODING 8081 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +30 +20 +10 +00 +F8 +CC +CC +CC +CC +CC +0C +CC +6C +ENDCHAR +STARTCHAR uni1F92 +ENCODING 8082 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +C0 +58 +8C +00 +F8 +CC +CC +CC +CC +CC +0C +CC +6C +ENDCHAR +STARTCHAR uni1F93 +ENCODING 8083 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +C0 +98 +4C +00 +F8 +CC +CC +CC +CC +CC +0C +CC +6C +ENDCHAR +STARTCHAR uni1F94 +ENCODING 8084 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +C0 +4C +98 +00 +F8 +CC +CC +CC +CC +CC +0C +CC +6C +ENDCHAR +STARTCHAR uni1F95 +ENCODING 8085 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +C0 +8C +58 +00 +F8 +CC +CC +CC +CC +CC +0C +CC +6C +ENDCHAR +STARTCHAR uni1F96 +ENCODING 8086 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +78 +CC +30 +10 +20 +F8 +CC +CC +CC +CC +0C +CC +6C +ENDCHAR +STARTCHAR uni1F97 +ENCODING 8087 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +78 +CC +30 +20 +10 +F8 +CC +CC +CC +CC +0C +CC +6C +ENDCHAR +STARTCHAR uni1F98 +ENCODING 8088 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +C0 +40 +80 +CC +CC +CC +FC +CC +CC +CC +CC +30 +18 +ENDCHAR +STARTCHAR uni1F99 +ENCODING 8089 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +C0 +80 +40 +CC +CC +CC +FC +CC +CC +CC +CC +30 +18 +ENDCHAR +STARTCHAR uni1F9A +ENCODING 8090 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +D8 +4C +80 +CC +CC +CC +FC +CC +CC +CC +CC +30 +18 +ENDCHAR +STARTCHAR uni1F9B +ENCODING 8091 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +D8 +8C +40 +CC +CC +CC +FC +CC +CC +CC +CC +30 +18 +ENDCHAR +STARTCHAR uni1F9C +ENCODING 8092 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +CC +58 +80 +CC +CC +CC +FC +CC +CC +CC +CC +30 +18 +ENDCHAR +STARTCHAR uni1F9D +ENCODING 8093 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +CC +98 +40 +CC +CC +CC +FC +CC +CC +CC +CC +30 +18 +ENDCHAR +STARTCHAR uni1F9E +ENCODING 8094 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +78 +CC +30 +10 +20 +CC +CC +FC +CC +CC +CC +30 +18 +ENDCHAR +STARTCHAR uni1F9F +ENCODING 8095 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +78 +CC +30 +20 +10 +CC +CC +FC +CC +CC +CC +30 +18 +ENDCHAR +STARTCHAR uni1FA0 +ENCODING 8096 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +30 +10 +20 +00 +CC +CC +CC +FC +FC +FC +78 +30 +18 +ENDCHAR +STARTCHAR uni1FA1 +ENCODING 8097 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +30 +20 +10 +00 +CC +CC +CC +FC +FC +FC +78 +30 +18 +ENDCHAR +STARTCHAR uni1FA2 +ENCODING 8098 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +C0 +58 +8C +00 +CC +CC +CC +FC +FC +FC +78 +30 +18 +ENDCHAR +STARTCHAR uni1FA3 +ENCODING 8099 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +C0 +98 +4C +00 +CC +CC +CC +FC +FC +FC +78 +30 +18 +ENDCHAR +STARTCHAR uni1FA4 +ENCODING 8100 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +C0 +4C +98 +00 +CC +CC +CC +FC +FC +FC +78 +30 +18 +ENDCHAR +STARTCHAR uni1FA5 +ENCODING 8101 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +C0 +8C +58 +00 +CC +CC +CC +FC +FC +FC +78 +30 +18 +ENDCHAR +STARTCHAR uni1FA6 +ENCODING 8102 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +78 +CC +30 +10 +20 +CC +CC +CC +FC +FC +78 +30 +18 +ENDCHAR +STARTCHAR uni1FA7 +ENCODING 8103 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +78 +CC +30 +20 +10 +CC +CC +CC +FC +FC +78 +30 +18 +ENDCHAR +STARTCHAR uni1FA8 +ENCODING 8104 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +30 +10 +20 +78 +CC +CC +CC +CC +CC +48 +CC +30 +18 +ENDCHAR +STARTCHAR uni1FA9 +ENCODING 8105 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +30 +20 +10 +78 +CC +CC +CC +CC +CC +48 +CC +30 +18 +ENDCHAR +STARTCHAR uni1FAA +ENCODING 8106 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +D8 +4C +80 +78 +CC +CC +CC +CC +CC +48 +CC +30 +18 +ENDCHAR +STARTCHAR uni1FAB +ENCODING 8107 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +D8 +8C +40 +78 +CC +CC +CC +CC +CC +48 +CC +30 +18 +ENDCHAR +STARTCHAR uni1FAC +ENCODING 8108 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +CC +58 +80 +78 +CC +CC +CC +CC +CC +48 +CC +30 +18 +ENDCHAR +STARTCHAR uni1FAD +ENCODING 8109 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +CC +98 +40 +78 +CC +CC +CC +CC +CC +48 +CC +30 +18 +ENDCHAR +STARTCHAR uni1FAE +ENCODING 8110 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +78 +CC +30 +10 +20 +78 +CC +CC +CC +48 +CC +30 +18 +ENDCHAR +STARTCHAR uni1FAF +ENCODING 8111 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +78 +CC +30 +20 +10 +78 +CC +CC +CC +48 +CC +30 +18 +ENDCHAR +STARTCHAR uni1FB0 +ENCODING 8112 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +CC +78 +00 +6C +DC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR uni1FB1 +ENCODING 8113 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +00 +6C +DC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR uni1FB2 +ENCODING 8114 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +60 +30 +00 +6C +DC +CC +CC +CC +DC +7C +30 +18 +ENDCHAR +STARTCHAR uni1FB3 +ENCODING 8115 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +6C +DC +CC +CC +CC +DC +7C +30 +18 +ENDCHAR +STARTCHAR uni1FB4 +ENCODING 8116 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +18 +30 +00 +6C +DC +CC +CC +CC +DC +7C +30 +18 +ENDCHAR +STARTCHAR uni1FB6 +ENCODING 8118 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +78 +CC +00 +6C +DC +CC +CC +CC +DC +6C +ENDCHAR +STARTCHAR uni1FB7 +ENCODING 8119 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +78 +CC +00 +6C +DC +CC +CC +CC +DC +7C +30 +18 +ENDCHAR +STARTCHAR uni1FB8 +ENCODING 8120 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +CC +78 +00 +78 +CC +CC +CC +FC +CC +CC +CC +ENDCHAR +STARTCHAR uni1FB9 +ENCODING 8121 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +00 +78 +CC +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni1FBA +ENCODING 8122 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +30 +78 +CC +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni1FBB +ENCODING 8123 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +30 +78 +CC +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni1FBC +ENCODING 8124 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +78 +CC +CC +CC +FC +CC +CC +CC +CC +30 +18 +ENDCHAR +STARTCHAR uni1FBD +ENCODING 8125 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 2 3 2 8 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR uni1FBE +ENCODING 8126 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 3 2 2 -2 +BITMAP +C0 +60 +ENDCHAR +STARTCHAR uni1FBF +ENCODING 8127 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 2 3 2 8 +BITMAP +C0 +40 +80 +ENDCHAR +STARTCHAR uni1FC0 +ENCODING 8128 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 2 0 9 +BITMAP +78 +CC +ENDCHAR +STARTCHAR uni1FC1 +ENCODING 8129 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 4 0 7 +BITMAP +78 +CC +00 +6C +ENDCHAR +STARTCHAR uni1FC2 +ENCODING 8130 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +60 +30 +00 +F8 +CC +CC +CC +CC +CC +0C +CC +6C +ENDCHAR +STARTCHAR uni1FC3 +ENCODING 8131 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +F8 +CC +CC +CC +CC +CC +0C +CC +6C +ENDCHAR +STARTCHAR uni1FC4 +ENCODING 8132 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +18 +30 +00 +F8 +CC +CC +CC +CC +CC +0C +CC +6C +ENDCHAR +STARTCHAR uni1FC6 +ENCODING 8134 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +78 +CC +00 +F8 +CC +CC +CC +CC +CC +CC +0C +0C +ENDCHAR +STARTCHAR uni1FC7 +ENCODING 8135 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +78 +CC +00 +F8 +CC +CC +CC +CC +CC +0C +CC +6C +ENDCHAR +STARTCHAR uni1FC8 +ENCODING 8136 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +30 +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR uni1FC9 +ENCODING 8137 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +30 +FC +C0 +C0 +C0 +F8 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR uni1FCA +ENCODING 8138 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +30 +CC +CC +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni1FCB +ENCODING 8139 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +30 +CC +CC +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni1FCC +ENCODING 8140 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +CC +CC +CC +CC +FC +CC +CC +CC +CC +30 +18 +ENDCHAR +STARTCHAR uni1FCD +ENCODING 8141 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 3 0 8 +BITMAP +C0 +58 +8C +ENDCHAR +STARTCHAR uni1FCE +ENCODING 8142 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 3 0 8 +BITMAP +C0 +58 +8C +ENDCHAR +STARTCHAR uni1FCF +ENCODING 8143 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 5 0 6 +BITMAP +78 +CC +30 +10 +20 +ENDCHAR +STARTCHAR uni1FD0 +ENCODING 8144 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +CC +78 +00 +70 +30 +30 +30 +30 +30 +1C +ENDCHAR +STARTCHAR uni1FD1 +ENCODING 8145 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F0 +00 +E0 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR uni1FD2 +ENCODING 8146 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +C0 +60 +00 +D8 +00 +E0 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR uni1FD3 +ENCODING 8147 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +30 +60 +00 +D8 +00 +E0 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR uni1FD6 +ENCODING 8150 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +78 +CC +00 +70 +30 +30 +30 +30 +30 +1C +ENDCHAR +STARTCHAR uni1FD7 +ENCODING 8151 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +CC +00 +6C +00 +70 +30 +30 +30 +30 +1C +ENDCHAR +STARTCHAR uni1FD8 +ENCODING 8152 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +CC +78 +00 +FC +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni1FD9 +ENCODING 8153 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +00 +FC +30 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni1FDA +ENCODING 8154 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +30 +FC +30 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni1FDB +ENCODING 8155 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +30 +FC +30 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni1FDD +ENCODING 8157 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 3 0 8 +BITMAP +C0 +98 +4C +ENDCHAR +STARTCHAR uni1FDE +ENCODING 8158 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 3 0 8 +BITMAP +C0 +8C +58 +ENDCHAR +STARTCHAR uni1FDF +ENCODING 8159 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 5 0 6 +BITMAP +78 +CC +30 +20 +10 +ENDCHAR +STARTCHAR uni1FE0 +ENCODING 8160 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +CC +78 +00 +CC +CC +CC +CC +CC +CC +7C +ENDCHAR +STARTCHAR uni1FE1 +ENCODING 8161 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +00 +CC +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1FE2 +ENCODING 8162 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +30 +00 +6C +00 +CC +CC +CC +CC +CC +7C +ENDCHAR +STARTCHAR uni1FE3 +ENCODING 8163 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +30 +00 +6C +00 +CC +CC +CC +CC +CC +7C +ENDCHAR +STARTCHAR uni1FE4 +ENCODING 8164 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +30 +10 +20 +00 +78 +CC +CC +CC +CC +CC +F8 +C0 +C0 +ENDCHAR +STARTCHAR uni1FE5 +ENCODING 8165 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +30 +20 +10 +00 +78 +CC +CC +CC +CC +CC +F8 +C0 +C0 +ENDCHAR +STARTCHAR uni1FE6 +ENCODING 8166 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +78 +CC +00 +CC +CC +CC +CC +CC +CC +7C +ENDCHAR +STARTCHAR uni1FE7 +ENCODING 8167 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +CC +00 +6C +00 +CC +CC +CC +CC +CC +7C +ENDCHAR +STARTCHAR uni1FE8 +ENCODING 8168 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +CC +78 +00 +CC +CC +78 +78 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni1FE9 +ENCODING 8169 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +78 +00 +CC +CC +78 +78 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni1FEA +ENCODING 8170 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +30 +CC +CC +78 +78 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni1FEB +ENCODING 8171 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +30 +CC +CC +78 +78 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni1FEC +ENCODING 8172 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +20 +10 +F8 +CC +CC +CC +F8 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni1FED +ENCODING 8173 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 4 1 7 +BITMAP +C0 +60 +00 +D8 +ENDCHAR +STARTCHAR uni1FEE +ENCODING 8174 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 4 1 7 +BITMAP +30 +60 +00 +D8 +ENDCHAR +STARTCHAR uni1FEF +ENCODING 8175 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 3 2 1 9 +BITMAP +C0 +60 +ENDCHAR +STARTCHAR uni1FF2 +ENCODING 8178 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +60 +30 +00 +CC +CC +CC +FC +FC +FC +78 +30 +18 +ENDCHAR +STARTCHAR uni1FF3 +ENCODING 8179 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +CC +CC +CC +FC +FC +FC +78 +30 +18 +ENDCHAR +STARTCHAR uni1FF4 +ENCODING 8180 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +18 +30 +00 +CC +CC +CC +FC +FC +FC +78 +30 +18 +ENDCHAR +STARTCHAR uni1FF6 +ENCODING 8182 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +78 +CC +00 +CC +CC +CC +FC +FC +FC +78 +ENDCHAR +STARTCHAR uni1FF7 +ENCODING 8183 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +78 +CC +00 +CC +CC +CC +FC +FC +FC +78 +30 +18 +ENDCHAR +STARTCHAR uni1FF8 +ENCODING 8184 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +30 +78 +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1FF9 +ENCODING 8185 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +30 +78 +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni1FFA +ENCODING 8186 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +60 +30 +78 +CC +CC +CC +CC +CC +CC +48 +CC +ENDCHAR +STARTCHAR uni1FFB +ENCODING 8187 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +18 +30 +78 +CC +CC +CC +CC +CC +CC +48 +CC +ENDCHAR +STARTCHAR uni1FFC +ENCODING 8188 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +78 +CC +CC +CC +CC +CC +CC +48 +CC +30 +18 +ENDCHAR +STARTCHAR uni1FFD +ENCODING 8189 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 3 2 2 9 +BITMAP +60 +C0 +ENDCHAR +STARTCHAR uni1FFE +ENCODING 8190 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 2 3 2 8 +BITMAP +C0 +80 +40 +ENDCHAR +STARTCHAR uni2010 +ENCODING 8208 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 1 1 4 +BITMAP +F8 +ENDCHAR +STARTCHAR uni2011 +ENCODING 8209 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 1 1 4 +BITMAP +F8 +ENDCHAR +STARTCHAR figuredash +ENCODING 8210 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 1 1 4 +BITMAP +F8 +ENDCHAR +STARTCHAR endash +ENCODING 8211 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 1 0 4 +BITMAP +FE +ENDCHAR +STARTCHAR emdash +ENCODING 8212 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 1 0 4 +BITMAP +FE +ENDCHAR +STARTCHAR afii00208 +ENCODING 8213 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 1 0 4 +BITMAP +FE +ENDCHAR +STARTCHAR uni2016 +ENCODING 8214 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 12 2 -2 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR underscoredbl +ENCODING 8215 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 3 0 -2 +BITMAP +FE +00 +FE +ENDCHAR +STARTCHAR quoteleft +ENCODING 8216 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 4 2 7 +BITMAP +60 +C0 +C0 +C0 +ENDCHAR +STARTCHAR quoteright +ENCODING 8217 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 4 1 7 +BITMAP +60 +60 +60 +C0 +ENDCHAR +STARTCHAR quotesinglbase +ENCODING 8218 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 4 1 -2 +BITMAP +60 +60 +60 +C0 +ENDCHAR +STARTCHAR quotereversed +ENCODING 8219 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 4 2 7 +BITMAP +C0 +C0 +C0 +60 +ENDCHAR +STARTCHAR quotedblleft +ENCODING 8220 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 4 0 7 +BITMAP +6C +D8 +D8 +D8 +ENDCHAR +STARTCHAR quotedblright +ENCODING 8221 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 4 0 7 +BITMAP +6C +6C +6C +D8 +ENDCHAR +STARTCHAR quotedblbase +ENCODING 8222 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 4 0 -2 +BITMAP +6C +6C +6C +D8 +ENDCHAR +STARTCHAR uni201F +ENCODING 8223 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 4 0 7 +BITMAP +D8 +D8 +D8 +6C +ENDCHAR +STARTCHAR dagger +ENCODING 8224 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +30 +30 +FC +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR daggerdbl +ENCODING 8225 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +30 +30 +30 +FC +30 +30 +FC +30 +30 +30 +ENDCHAR +STARTCHAR bullet +ENCODING 8226 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 3 +BITMAP +70 +F8 +F8 +F8 +70 +ENDCHAR +STARTCHAR uni2023 +ENCODING 8227 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 1 3 +BITMAP +C0 +F0 +FC +F0 +C0 +ENDCHAR +STARTCHAR onedotenleader +ENCODING 8228 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 2 3 0 +BITMAP +80 +80 +ENDCHAR +STARTCHAR twodotenleader +ENCODING 8229 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 2 2 0 +BITMAP +A0 +A0 +ENDCHAR +STARTCHAR ellipsis +ENCODING 8230 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 2 1 0 +BITMAP +A8 +A8 +ENDCHAR +STARTCHAR uni2027 +ENCODING 8231 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 2 3 4 +BITMAP +80 +80 +ENDCHAR +STARTCHAR uni202A +ENCODING 8234 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR perthousand +ENCODING 8240 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +40 +A0 +40 +0C +30 +C0 +00 +48 +B4 +48 +ENDCHAR +STARTCHAR uni2031 +ENCODING 8241 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +40 +A0 +40 +0C +30 +C0 +00 +54 +AA +54 +ENDCHAR +STARTCHAR minute +ENCODING 8242 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 4 1 7 +BITMAP +60 +60 +60 +C0 +ENDCHAR +STARTCHAR second +ENCODING 8243 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 4 0 7 +BITMAP +6C +6C +6C +D8 +ENDCHAR +STARTCHAR uni2034 +ENCODING 8244 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 4 0 7 +BITMAP +54 +54 +54 +A8 +ENDCHAR +STARTCHAR uni2035 +ENCODING 8245 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 3 4 2 7 +BITMAP +C0 +C0 +C0 +60 +ENDCHAR +STARTCHAR uni2036 +ENCODING 8246 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 4 0 7 +BITMAP +D8 +D8 +D8 +6C +ENDCHAR +STARTCHAR uni2037 +ENCODING 8247 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 4 0 7 +BITMAP +A8 +A8 +A8 +54 +ENDCHAR +STARTCHAR uni2038 +ENCODING 8248 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 3 0 -2 +BITMAP +30 +78 +CC +ENDCHAR +STARTCHAR guilsinglleft +ENCODING 8249 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 5 0 2 +BITMAP +30 +60 +C0 +60 +30 +ENDCHAR +STARTCHAR guilsinglright +ENCODING 8250 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 5 1 2 +BITMAP +C0 +60 +30 +60 +C0 +ENDCHAR +STARTCHAR uni203B +ENCODING 8251 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +10 +44 +28 +92 +28 +44 +10 +ENDCHAR +STARTCHAR exclamdbl +ENCODING 8252 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +D8 +D8 +D8 +D8 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni203D +ENCODING 8253 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +F8 +3C +3C +38 +30 +30 +00 +30 +30 +ENDCHAR +STARTCHAR uni203E +ENCODING 8254 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 1 1 10 +BITMAP +F8 +ENDCHAR +STARTCHAR uni2043 +ENCODING 8259 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 1 1 5 +BITMAP +F0 +ENDCHAR +STARTCHAR uni2047 +ENCODING 8263 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +D8 +6C +6C +6C +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni2048 +ENCODING 8264 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +EC +3C +3C +3C +6C +6C +00 +6C +6C +ENDCHAR +STARTCHAR uni2049 +ENCODING 8265 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +F8 +CC +CC +CC +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni204B +ENCODING 8267 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +F8 +DC +DC +DC +D8 +D0 +D0 +D0 +D0 +ENDCHAR +STARTCHAR uni204C +ENCODING 8268 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 5 2 3 +BITMAP +50 +D0 +D0 +D0 +50 +ENDCHAR +STARTCHAR uni204D +ENCODING 8269 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 5 1 3 +BITMAP +A0 +B0 +B0 +B0 +A0 +ENDCHAR +STARTCHAR uni204E +ENCODING 8270 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +50 +20 +F8 +20 +50 +ENDCHAR +STARTCHAR uni204F +ENCODING 8271 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 8 2 -2 +BITMAP +C0 +C0 +00 +00 +C0 +C0 +C0 +60 +ENDCHAR +STARTCHAR uni2051 +ENCODING 8273 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -1 +BITMAP +50 +20 +F8 +20 +50 +00 +50 +20 +F8 +20 +50 +ENDCHAR +STARTCHAR uni2055 +ENCODING 8277 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 5 1 3 +BITMAP +A8 +70 +F8 +70 +A8 +ENDCHAR +STARTCHAR uni2056 +ENCODING 8278 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 5 1 3 +BITMAP +10 +00 +80 +00 +10 +ENDCHAR +STARTCHAR uni2058 +ENCODING 8280 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 5 1 3 +BITMAP +20 +00 +88 +00 +20 +ENDCHAR +STARTCHAR uni2059 +ENCODING 8281 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 5 1 3 +BITMAP +88 +00 +20 +00 +88 +ENDCHAR +STARTCHAR uni205A +ENCODING 8282 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 1 7 3 2 +BITMAP +80 +00 +00 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni205B +ENCODING 8283 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 7 1 2 +BITMAP +20 +00 +00 +88 +00 +00 +20 +ENDCHAR +STARTCHAR uni205C +ENCODING 8284 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +10 +54 +10 +FE +10 +54 +10 +ENDCHAR +STARTCHAR uni205D +ENCODING 8285 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 1 7 3 2 +BITMAP +80 +00 +00 +80 +00 +00 +80 +ENDCHAR +STARTCHAR uni205E +ENCODING 8286 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 1 7 3 2 +BITMAP +80 +00 +80 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni2070 +ENCODING 8304 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 6 +BITMAP +70 +D8 +F8 +D8 +70 +ENDCHAR +STARTCHAR uni2071 +ENCODING 8305 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 5 0 6 +BITMAP +60 +00 +E0 +60 +60 +ENDCHAR +STARTCHAR uni2074 +ENCODING 8308 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 6 +BITMAP +38 +78 +D8 +F8 +38 +ENDCHAR +STARTCHAR uni2075 +ENCODING 8309 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 6 +BITMAP +F8 +C0 +F0 +18 +F0 +ENDCHAR +STARTCHAR uni2076 +ENCODING 8310 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 6 +BITMAP +70 +C0 +F0 +D8 +70 +ENDCHAR +STARTCHAR uni2077 +ENCODING 8311 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 6 +BITMAP +F8 +18 +30 +60 +60 +ENDCHAR +STARTCHAR uni2078 +ENCODING 8312 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 6 +BITMAP +70 +D8 +70 +D8 +70 +ENDCHAR +STARTCHAR uni2079 +ENCODING 8313 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 6 +BITMAP +70 +D8 +78 +18 +70 +ENDCHAR +STARTCHAR uni207A +ENCODING 8314 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 3 1 7 +BITMAP +60 +F0 +60 +ENDCHAR +STARTCHAR uni207B +ENCODING 8315 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 1 1 8 +BITMAP +F0 +ENDCHAR +STARTCHAR uni207C +ENCODING 8316 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 3 1 7 +BITMAP +F0 +00 +F0 +ENDCHAR +STARTCHAR uni207D +ENCODING 8317 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 5 2 6 +BITMAP +60 +C0 +C0 +C0 +60 +ENDCHAR +STARTCHAR uni207E +ENCODING 8318 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 5 1 6 +BITMAP +C0 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR uni207F +ENCODING 8319 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 4 0 6 +BITMAP +F0 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni2080 +ENCODING 8320 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 -1 +BITMAP +70 +D8 +F8 +D8 +70 +ENDCHAR +STARTCHAR uni2081 +ENCODING 8321 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 5 1 -1 +BITMAP +60 +E0 +60 +60 +60 +ENDCHAR +STARTCHAR uni2082 +ENCODING 8322 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 -1 +BITMAP +F0 +18 +70 +C0 +F8 +ENDCHAR +STARTCHAR uni2083 +ENCODING 8323 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 -1 +BITMAP +F0 +18 +70 +18 +F0 +ENDCHAR +STARTCHAR uni2084 +ENCODING 8324 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 -1 +BITMAP +38 +78 +D8 +F8 +18 +ENDCHAR +STARTCHAR uni2085 +ENCODING 8325 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 -1 +BITMAP +F8 +C0 +F0 +18 +F0 +ENDCHAR +STARTCHAR uni2086 +ENCODING 8326 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 -1 +BITMAP +70 +C0 +F0 +D8 +70 +ENDCHAR +STARTCHAR uni2087 +ENCODING 8327 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 -1 +BITMAP +F8 +18 +30 +60 +60 +ENDCHAR +STARTCHAR uni2088 +ENCODING 8328 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 -1 +BITMAP +70 +D8 +70 +D8 +70 +ENDCHAR +STARTCHAR uni2089 +ENCODING 8329 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 -1 +BITMAP +70 +D8 +78 +18 +70 +ENDCHAR +STARTCHAR uni208A +ENCODING 8330 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 3 1 0 +BITMAP +60 +F0 +60 +ENDCHAR +STARTCHAR uni208B +ENCODING 8331 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 1 1 1 +BITMAP +F0 +ENDCHAR +STARTCHAR uni208C +ENCODING 8332 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 3 1 0 +BITMAP +F0 +00 +F0 +ENDCHAR +STARTCHAR uni208D +ENCODING 8333 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 5 2 -1 +BITMAP +60 +C0 +C0 +C0 +60 +ENDCHAR +STARTCHAR uni208E +ENCODING 8334 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 5 1 -1 +BITMAP +C0 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR uni2090 +ENCODING 8336 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 -1 +BITMAP +70 +18 +78 +D8 +78 +ENDCHAR +STARTCHAR uni2091 +ENCODING 8337 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 -1 +BITMAP +70 +D8 +F8 +C0 +78 +ENDCHAR +STARTCHAR uni2092 +ENCODING 8338 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 -1 +BITMAP +70 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni2093 +ENCODING 8339 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 -1 +BITMAP +CC +78 +30 +78 +CC +ENDCHAR +STARTCHAR uni2094 +ENCODING 8340 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 -1 +BITMAP +F0 +18 +F8 +D8 +70 +ENDCHAR +STARTCHAR uni2095 +ENCODING 8341 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 6 0 -1 +BITMAP +C0 +C0 +F0 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni2096 +ENCODING 8342 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 6 0 -1 +BITMAP +C0 +D8 +F0 +E0 +F0 +D8 +ENDCHAR +STARTCHAR uni2097 +ENCODING 8343 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 6 0 -1 +BITMAP +E0 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni2098 +ENCODING 8344 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 -1 +BITMAP +F0 +F8 +F8 +D8 +D8 +ENDCHAR +STARTCHAR uni2099 +ENCODING 8345 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 -1 +BITMAP +F0 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni209A +ENCODING 8346 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 6 0 -2 +BITMAP +F0 +D8 +D8 +F0 +C0 +C0 +ENDCHAR +STARTCHAR uni209B +ENCODING 8347 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 -1 +BITMAP +78 +C0 +70 +18 +F0 +ENDCHAR +STARTCHAR uni209C +ENCODING 8348 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 6 0 -1 +BITMAP +60 +F0 +60 +60 +60 +38 +ENDCHAR +STARTCHAR uni20A0 +ENCODING 8352 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +70 +C0 +DE +D8 +D8 +DE +78 +18 +1E +ENDCHAR +STARTCHAR colonmonetary +ENCODING 8353 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -1 +BITMAP +10 +3C +50 +D0 +D0 +D0 +D0 +D0 +50 +3C +10 +ENDCHAR +STARTCHAR uni20A2 +ENCODING 8354 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +3C +40 +C0 +CC +D8 +D8 +D8 +40 +3C +ENDCHAR +STARTCHAR franc +ENCODING 8355 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +7C +60 +60 +60 +78 +60 +60 +F0 +60 +ENDCHAR +STARTCHAR lira +ENCODING 8356 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +38 +60 +60 +F0 +60 +F0 +60 +60 +F8 +ENDCHAR +STARTCHAR uni20A5 +ENCODING 8357 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +78 +7C +56 +5C +74 +D4 +54 +ENDCHAR +STARTCHAR uni20A6 +ENCODING 8358 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +4C +6C +7C +FE +7C +FE +7C +6C +64 +ENDCHAR +STARTCHAR peseta +ENCODING 8359 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +D0 +F0 +BE +B4 +F4 +D6 +92 +92 +8C +ENDCHAR +STARTCHAR uni20A8 +ENCODING 8360 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +E0 +D0 +DE +D8 +F8 +EC +F6 +D2 +DC +ENDCHAR +STARTCHAR uni20A9 +ENCODING 8361 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +6C +FE +6C +FE +6C +7C +7C +6C +44 +ENDCHAR +STARTCHAR afii57636 +ENCODING 8362 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +F2 +FA +8A +AA +AA +AA +A2 +BE +9E +ENDCHAR +STARTCHAR dong +ENCODING 8363 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 1 -2 +BITMAP +18 +3C +18 +78 +D8 +D8 +D8 +D8 +78 +00 +F8 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +1C +30 +60 +F8 +60 +F8 +60 +30 +1C +ENDCHAR +STARTCHAR uni20AD +ENCODING 8365 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +66 +6C +78 +70 +FC +70 +78 +6C +66 +ENDCHAR +STARTCHAR uni20AE +ENCODING 8366 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +30 +30 +38 +70 +38 +70 +30 +30 +ENDCHAR +STARTCHAR uni20AF +ENCODING 8367 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +E0 +70 +50 +50 +50 +54 +5E +7A +EC +08 +08 +ENDCHAR +STARTCHAR uni20D0 +ENCODING 8400 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni20D1 +ENCODING 8401 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni20D2 +ENCODING 8402 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni20D3 +ENCODING 8403 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni20D4 +ENCODING 8404 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni20D5 +ENCODING 8405 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni20D6 +ENCODING 8406 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni20D7 +ENCODING 8407 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni20D8 +ENCODING 8408 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni20D9 +ENCODING 8409 +SWIDTH 0 0 +DWIDTH 7 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni20DA +ENCODING 8410 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni20DB +ENCODING 8411 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni20DC +ENCODING 8412 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni20E1 +ENCODING 8417 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni20E5 +ENCODING 8421 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni20E6 +ENCODING 8422 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni20EB +ENCODING 8427 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni20EC +ENCODING 8428 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni20ED +ENCODING 8429 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni20EE +ENCODING 8430 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni20EF +ENCODING 8431 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2102 +ENCODING 8450 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +3C +70 +D0 +D0 +D0 +D0 +D0 +70 +3C +ENDCHAR +STARTCHAR uni2103 +ENCODING 8451 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +40 +A0 +40 +3C +60 +60 +60 +60 +60 +60 +3C +ENDCHAR +STARTCHAR afii61248 +ENCODING 8453 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +70 +C0 +C6 +7C +18 +30 +6C +DA +1A +0C +ENDCHAR +STARTCHAR uni2106 +ENCODING 8454 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +70 +C0 +C6 +7C +18 +30 +7A +DA +1A +0C +ENDCHAR +STARTCHAR uni2107 +ENCODING 8455 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +C0 +C0 +78 +C0 +C0 +CC +78 +ENDCHAR +STARTCHAR uni2109 +ENCODING 8457 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +40 +A0 +40 +7C +60 +60 +78 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni210D +ENCODING 8461 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +F4 +D4 +D4 +D4 +DC +D4 +D4 +D4 +F4 +ENDCHAR +STARTCHAR uni210E +ENCODING 8462 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +C0 +C0 +F0 +D8 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni210F +ENCODING 8463 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +60 +F0 +60 +78 +6C +6C +6C +6C +6C +ENDCHAR +STARTCHAR uni2115 +ENCODING 8469 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +CC +CC +EC +DC +EC +DC +CC +CC +CC +ENDCHAR +STARTCHAR afii61352 +ENCODING 8470 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +9A +DA +F8 +FA +F8 +F8 +F8 +D8 +C8 +ENDCHAR +STARTCHAR uni2117 +ENCODING 8471 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +38 +44 +B2 +AA +B2 +A2 +A2 +44 +38 +ENDCHAR +STARTCHAR uni2119 +ENCODING 8473 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +F8 +D4 +D4 +D4 +D8 +D0 +D0 +D0 +F0 +ENDCHAR +STARTCHAR uni211A +ENCODING 8474 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +D4 +D4 +D4 +D4 +D4 +D4 +D8 +7C +ENDCHAR +STARTCHAR uni211D +ENCODING 8477 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +F8 +D4 +D4 +D4 +D8 +D4 +D4 +D4 +F4 +ENDCHAR +STARTCHAR uni2120 +ENCODING 8480 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 5 0 6 +BITMAP +74 +9C +54 +34 +D4 +ENDCHAR +STARTCHAR trademark +ENCODING 8482 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 6 +BITMAP +F4 +5C +54 +54 +54 +ENDCHAR +STARTCHAR uni2124 +ENCODING 8484 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +2C +2C +58 +58 +58 +B0 +B0 +FC +ENDCHAR +STARTCHAR uni2126 +ENCODING 8486 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +CC +CC +CC +CC +CC +CC +48 +CC +ENDCHAR +STARTCHAR uni2127 +ENCODING 8487 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +CC +48 +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni212A +ENCODING 8490 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +CC +D8 +F0 +E0 +C0 +E0 +F0 +D8 +CC +ENDCHAR +STARTCHAR uni212B +ENCODING 8491 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +30 +48 +30 +78 +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni213E +ENCODING 8510 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +D0 +D0 +D0 +D0 +D0 +D0 +D0 +F0 +ENDCHAR +STARTCHAR uni213F +ENCODING 8511 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +D4 +D4 +D4 +D4 +D4 +D4 +D4 +F4 +ENDCHAR +STARTCHAR uni2140 +ENCODING 8512 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +D0 +68 +68 +34 +68 +68 +D0 +FC +ENDCHAR +STARTCHAR uni2145 +ENCODING 8517 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +F0 +D8 +D4 +D4 +D4 +D4 +D4 +D8 +F0 +ENDCHAR +STARTCHAR uni2146 +ENCODING 8518 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +1C +14 +74 +D4 +D4 +D4 +D4 +D4 +7C +ENDCHAR +STARTCHAR uni2147 +ENCODING 8519 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +D4 +D4 +DC +D0 +D0 +7C +ENDCHAR +STARTCHAR uni2148 +ENCODING 8520 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 10 1 0 +BITMAP +60 +60 +00 +F0 +D0 +D0 +D0 +D0 +D0 +F0 +ENDCHAR +STARTCHAR uni2149 +ENCODING 8521 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +18 +18 +00 +3C +34 +34 +34 +34 +34 +34 +34 +F8 +ENDCHAR +STARTCHAR uni2150 +ENCODING 8528 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +30 +70 +30 +30 +30 +00 +FC +00 +78 +18 +30 +60 +60 +ENDCHAR +STARTCHAR uni2151 +ENCODING 8529 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +30 +70 +30 +30 +30 +00 +FC +00 +30 +58 +38 +18 +70 +ENDCHAR +STARTCHAR uni2152 +ENCODING 8530 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +30 +70 +30 +30 +30 +00 +FC +00 +D8 +EC +EC +EC +D8 +ENDCHAR +STARTCHAR onethird +ENCODING 8531 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +30 +70 +30 +30 +30 +00 +FC +00 +70 +18 +30 +18 +70 +ENDCHAR +STARTCHAR twothirds +ENCODING 8532 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +70 +18 +30 +60 +78 +00 +FC +00 +70 +18 +30 +18 +70 +ENDCHAR +STARTCHAR uni2155 +ENCODING 8533 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +30 +70 +30 +30 +30 +00 +FC +00 +78 +60 +70 +18 +70 +ENDCHAR +STARTCHAR uni2156 +ENCODING 8534 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +70 +18 +30 +60 +78 +00 +FC +00 +78 +60 +70 +18 +70 +ENDCHAR +STARTCHAR uni2157 +ENCODING 8535 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +70 +18 +30 +18 +70 +00 +FC +00 +78 +60 +70 +18 +70 +ENDCHAR +STARTCHAR uni2158 +ENCODING 8536 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +18 +38 +58 +78 +18 +00 +FC +00 +78 +60 +70 +18 +70 +ENDCHAR +STARTCHAR uni2159 +ENCODING 8537 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +30 +70 +30 +30 +30 +00 +FC +00 +38 +60 +70 +68 +30 +ENDCHAR +STARTCHAR uni215A +ENCODING 8538 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +78 +60 +70 +18 +70 +00 +FC +00 +38 +60 +70 +68 +30 +ENDCHAR +STARTCHAR oneeighth +ENCODING 8539 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +30 +70 +30 +30 +30 +00 +FC +00 +30 +58 +30 +58 +30 +ENDCHAR +STARTCHAR threeeighths +ENCODING 8540 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +70 +18 +30 +18 +70 +00 +FC +00 +30 +58 +30 +58 +30 +ENDCHAR +STARTCHAR fiveeighths +ENCODING 8541 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +78 +60 +70 +18 +70 +00 +FC +00 +30 +58 +30 +58 +30 +ENDCHAR +STARTCHAR seveneighths +ENCODING 8542 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +78 +18 +30 +60 +60 +00 +FC +00 +30 +58 +30 +58 +30 +ENDCHAR +STARTCHAR uni215F +ENCODING 8543 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 4 +BITMAP +30 +70 +30 +30 +30 +00 +FC +ENDCHAR +STARTCHAR uni2189 +ENCODING 8585 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +30 +58 +58 +58 +30 +00 +FC +00 +70 +18 +30 +18 +70 +ENDCHAR +STARTCHAR arrowleft +ENCODING 8592 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +20 +40 +FE +40 +20 +ENDCHAR +STARTCHAR arrowup +ENCODING 8593 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 2 +BITMAP +20 +70 +A8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR arrowright +ENCODING 8594 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +08 +04 +FE +04 +08 +ENDCHAR +STARTCHAR arrowdown +ENCODING 8595 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 2 +BITMAP +20 +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR arrowboth +ENCODING 8596 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +28 +44 +FE +44 +28 +ENDCHAR +STARTCHAR arrowupdn +ENCODING 8597 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 1 +BITMAP +20 +70 +A8 +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2196 +ENCODING 8598 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 3 +BITMAP +F0 +C0 +A0 +90 +08 +ENDCHAR +STARTCHAR uni2197 +ENCODING 8599 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 3 +BITMAP +78 +18 +28 +48 +80 +ENDCHAR +STARTCHAR uni2198 +ENCODING 8600 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 3 +BITMAP +80 +48 +28 +18 +78 +ENDCHAR +STARTCHAR uni2199 +ENCODING 8601 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 3 +BITMAP +08 +90 +A0 +C0 +F0 +ENDCHAR +STARTCHAR uni219A +ENCODING 8602 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +20 +44 +FE +48 +20 +ENDCHAR +STARTCHAR uni219B +ENCODING 8603 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +08 +24 +FE +44 +08 +ENDCHAR +STARTCHAR uni219C +ENCODING 8604 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +F0 +C4 +AA +A8 +10 +ENDCHAR +STARTCHAR uni219D +ENCODING 8605 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +1E +46 +AA +2A +10 +ENDCHAR +STARTCHAR uni219E +ENCODING 8606 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +28 +50 +FE +50 +28 +ENDCHAR +STARTCHAR uni219F +ENCODING 8607 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 7 1 2 +BITMAP +20 +70 +A8 +70 +A8 +20 +20 +ENDCHAR +STARTCHAR uni21A0 +ENCODING 8608 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +28 +14 +FE +14 +28 +ENDCHAR +STARTCHAR uni21A1 +ENCODING 8609 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 7 1 2 +BITMAP +20 +20 +A8 +70 +A8 +70 +20 +ENDCHAR +STARTCHAR uni21A2 +ENCODING 8610 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +20 +42 +FC +42 +20 +ENDCHAR +STARTCHAR uni21A3 +ENCODING 8611 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +08 +84 +7E +84 +08 +ENDCHAR +STARTCHAR uni21A4 +ENCODING 8612 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +20 +42 +FE +42 +20 +ENDCHAR +STARTCHAR uni21A5 +ENCODING 8613 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 2 +BITMAP +20 +70 +A8 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni21A6 +ENCODING 8614 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +08 +84 +FE +84 +08 +ENDCHAR +STARTCHAR uni21A7 +ENCODING 8615 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 2 +BITMAP +70 +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR arrowupdnbse +ENCODING 8616 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -1 +BITMAP +20 +70 +A8 +20 +20 +20 +A8 +70 +20 +00 +F8 +ENDCHAR +STARTCHAR uni21A9 +ENCODING 8617 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 6 0 3 +BITMAP +04 +22 +42 +FC +40 +20 +ENDCHAR +STARTCHAR uni21AA +ENCODING 8618 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 6 0 3 +BITMAP +40 +88 +84 +7E +04 +08 +ENDCHAR +STARTCHAR uni21AB +ENCODING 8619 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 6 0 3 +BITMAP +04 +2A +4A +FC +48 +28 +ENDCHAR +STARTCHAR uni21AC +ENCODING 8620 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 6 0 3 +BITMAP +40 +A8 +A4 +7E +24 +28 +ENDCHAR +STARTCHAR uni21B0 +ENCODING 8624 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 9 0 1 +BITMAP +20 +40 +FE +42 +22 +02 +02 +02 +02 +ENDCHAR +STARTCHAR uni21B1 +ENCODING 8625 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 9 0 1 +BITMAP +08 +04 +FE +84 +88 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni21B2 +ENCODING 8626 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 9 0 1 +BITMAP +02 +02 +02 +02 +22 +42 +FE +40 +20 +ENDCHAR +STARTCHAR uni21B3 +ENCODING 8627 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 9 0 1 +BITMAP +80 +80 +80 +80 +88 +84 +FE +04 +08 +ENDCHAR +STARTCHAR uni21B4 +ENCODING 8628 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 9 0 1 +BITMAP +F8 +08 +08 +08 +08 +08 +2A +1C +08 +ENDCHAR +STARTCHAR carriagereturn +ENCODING 8629 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +02 +02 +22 +42 +FE +40 +20 +ENDCHAR +STARTCHAR uni21B6 +ENCODING 8630 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 6 0 2 +BITMAP +1C +22 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni21B7 +ENCODING 8631 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 6 0 2 +BITMAP +70 +88 +08 +2A +1C +08 +ENDCHAR +STARTCHAR uni21B8 +ENCODING 8632 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 2 +BITMAP +FC +00 +78 +60 +50 +48 +04 +ENDCHAR +STARTCHAR uni21B9 +ENCODING 8633 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +90 +A0 +FE +A0 +90 +00 +12 +0A +FE +0A +12 +ENDCHAR +STARTCHAR uni21BA +ENCODING 8634 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +0E +4C +8A +82 +82 +44 +38 +ENDCHAR +STARTCHAR uni21BB +ENCODING 8635 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +E0 +64 +A2 +82 +82 +44 +38 +ENDCHAR +STARTCHAR uni21BC +ENCODING 8636 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 3 0 5 +BITMAP +20 +40 +FE +ENDCHAR +STARTCHAR uni21BD +ENCODING 8637 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 3 0 3 +BITMAP +FE +40 +20 +ENDCHAR +STARTCHAR uni21BE +ENCODING 8638 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 7 3 2 +BITMAP +80 +C0 +A0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni21BF +ENCODING 8639 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 7 1 2 +BITMAP +20 +60 +A0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni21C0 +ENCODING 8640 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 3 0 5 +BITMAP +08 +04 +FE +ENDCHAR +STARTCHAR uni21C1 +ENCODING 8641 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 3 0 3 +BITMAP +FE +04 +08 +ENDCHAR +STARTCHAR uni21C2 +ENCODING 8642 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 7 3 2 +BITMAP +80 +80 +80 +80 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni21C3 +ENCODING 8643 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 7 1 2 +BITMAP +20 +20 +20 +20 +A0 +60 +20 +ENDCHAR +STARTCHAR uni21C4 +ENCODING 8644 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 1 +BITMAP +08 +04 +FE +04 +28 +40 +FE +40 +20 +ENDCHAR +STARTCHAR uni21C5 +ENCODING 8645 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +28 +78 +A8 +28 +2A +3C +28 +ENDCHAR +STARTCHAR uni21C6 +ENCODING 8646 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 1 +BITMAP +20 +40 +FE +40 +28 +04 +FE +04 +08 +ENDCHAR +STARTCHAR uni21C7 +ENCODING 8647 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 1 +BITMAP +20 +40 +FE +40 +20 +40 +FE +40 +20 +ENDCHAR +STARTCHAR uni21C8 +ENCODING 8648 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +28 +7C +AA +28 +28 +28 +28 +ENDCHAR +STARTCHAR uni21C9 +ENCODING 8649 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 1 +BITMAP +08 +04 +FE +04 +08 +04 +FE +04 +08 +ENDCHAR +STARTCHAR uni21CA +ENCODING 8650 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +28 +28 +28 +28 +AA +7C +28 +ENDCHAR +STARTCHAR uni21CB +ENCODING 8651 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +20 +40 +FE +00 +FE +04 +08 +ENDCHAR +STARTCHAR uni21CC +ENCODING 8652 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +08 +04 +FE +00 +FE +40 +20 +ENDCHAR +STARTCHAR arrowdblleft +ENCODING 8656 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +20 +7E +80 +7E +20 +ENDCHAR +STARTCHAR arrowdblup +ENCODING 8657 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 2 +BITMAP +20 +50 +D8 +50 +50 +50 +50 +ENDCHAR +STARTCHAR arrowdblright +ENCODING 8658 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +08 +FC +02 +FC +08 +ENDCHAR +STARTCHAR arrowdbldown +ENCODING 8659 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 2 +BITMAP +50 +50 +50 +50 +D8 +50 +20 +ENDCHAR +STARTCHAR arrowdblboth +ENCODING 8660 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +28 +7C +82 +7C +28 +ENDCHAR +STARTCHAR uni21D5 +ENCODING 8661 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 2 +BITMAP +20 +50 +D8 +50 +D8 +50 +20 +ENDCHAR +STARTCHAR uni21D6 +ENCODING 8662 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +F0 +A0 +D0 +A8 +14 +0A +04 +ENDCHAR +STARTCHAR uni21D7 +ENCODING 8663 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +1E +0A +16 +2A +50 +A0 +40 +ENDCHAR +STARTCHAR uni21D8 +ENCODING 8664 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +40 +A0 +50 +2A +16 +0A +1E +ENDCHAR +STARTCHAR uni21D9 +ENCODING 8665 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +04 +0A +14 +A8 +D0 +A0 +F0 +ENDCHAR +STARTCHAR uni21DA +ENCODING 8666 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +10 +3E +40 +FE +40 +3E +10 +ENDCHAR +STARTCHAR uni21DB +ENCODING 8667 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +10 +F8 +04 +FE +04 +F8 +10 +ENDCHAR +STARTCHAR uni21E0 +ENCODING 8672 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +20 +40 +EA +40 +20 +ENDCHAR +STARTCHAR uni21E1 +ENCODING 8673 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 2 +BITMAP +20 +70 +A8 +00 +20 +00 +20 +ENDCHAR +STARTCHAR uni21E2 +ENCODING 8674 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +08 +04 +AE +04 +08 +ENDCHAR +STARTCHAR uni21E3 +ENCODING 8675 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 2 +BITMAP +20 +00 +20 +00 +A8 +70 +20 +ENDCHAR +STARTCHAR uni21E4 +ENCODING 8676 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +90 +A0 +FE +A0 +90 +ENDCHAR +STARTCHAR uni21E5 +ENCODING 8677 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +12 +0A +FE +0A +12 +ENDCHAR +STARTCHAR uni21E6 +ENCODING 8678 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +20 +7E +C2 +7E +20 +ENDCHAR +STARTCHAR uni21E7 +ENCODING 8679 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 2 +BITMAP +20 +70 +D8 +50 +50 +50 +70 +ENDCHAR +STARTCHAR uni21E8 +ENCODING 8680 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +08 +FC +86 +FC +08 +ENDCHAR +STARTCHAR uni21E9 +ENCODING 8681 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 2 +BITMAP +70 +50 +50 +50 +D8 +70 +20 +ENDCHAR +STARTCHAR uni21EA +ENCODING 8682 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 8 1 1 +BITMAP +20 +70 +D8 +50 +50 +70 +50 +70 +ENDCHAR +STARTCHAR uni21EB +ENCODING 8683 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 8 1 1 +BITMAP +20 +70 +D8 +50 +50 +D8 +88 +F8 +ENDCHAR +STARTCHAR uni21F0 +ENCODING 8688 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +E8 +BC +86 +BC +E8 +ENDCHAR +STARTCHAR uni21F1 +ENCODING 8689 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +FE +80 +BC +B0 +A8 +A4 +80 +ENDCHAR +STARTCHAR uni21F2 +ENCODING 8690 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +02 +4A +2A +1A +7A +02 +FE +ENDCHAR +STARTCHAR uni21F3 +ENCODING 8691 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 2 +BITMAP +20 +70 +D8 +50 +D8 +70 +20 +ENDCHAR +STARTCHAR uni21F5 +ENCODING 8693 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +28 +3C +2A +28 +A8 +78 +28 +ENDCHAR +STARTCHAR uni21F6 +ENCODING 8694 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 7 1 2 +BITMAP +10 +F8 +10 +F8 +10 +F8 +10 +ENDCHAR +STARTCHAR uni21F7 +ENCODING 8695 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +28 +48 +FE +48 +28 +ENDCHAR +STARTCHAR uni21F8 +ENCODING 8696 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +28 +24 +FE +24 +28 +ENDCHAR +STARTCHAR uni21F9 +ENCODING 8697 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +54 +92 +FE +92 +54 +ENDCHAR +STARTCHAR uni21FA +ENCODING 8698 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +2A +4A +FE +4A +2A +ENDCHAR +STARTCHAR uni21FB +ENCODING 8699 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +A8 +A4 +FE +A4 +A8 +ENDCHAR +STARTCHAR uni21FD +ENCODING 8701 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +20 +60 +BE +60 +20 +ENDCHAR +STARTCHAR uni21FE +ENCODING 8702 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +08 +0C +FA +0C +08 +ENDCHAR +STARTCHAR uni21FF +ENCODING 8703 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +28 +6C +BA +6C +28 +ENDCHAR +STARTCHAR universal +ENCODING 8704 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +CC +CC +CC +FC +CC +CC +FC +78 +30 +ENDCHAR +STARTCHAR uni2201 +ENCODING 8705 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +7C +C0 +C0 +C0 +C0 +C0 +C0 +C0 +7C +ENDCHAR +STARTCHAR partialdiff +ENCODING 8706 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +70 +18 +0C +0C +7C +CC +CC +CC +78 +ENDCHAR +STARTCHAR existential +ENCODING 8707 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +0C +0C +0C +FC +0C +0C +0C +FC +ENDCHAR +STARTCHAR uni2204 +ENCODING 8708 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -1 +BITMAP +10 +FC +1C +1C +2C +FC +2C +4C +4C +FC +40 +ENDCHAR +STARTCHAR emptyset +ENCODING 8709 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +18 +78 +DC +B4 +B4 +B4 +EC +78 +60 +ENDCHAR +STARTCHAR uni2206 +ENCODING 8710 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 2 +BITMAP +30 +30 +78 +78 +CC +CC +FC +ENDCHAR +STARTCHAR gradient +ENCODING 8711 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 2 +BITMAP +FC +CC +CC +78 +78 +30 +30 +ENDCHAR +STARTCHAR element +ENCODING 8712 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +3C +60 +C0 +C0 +FC +C0 +C0 +60 +3C +ENDCHAR +STARTCHAR notelement +ENCODING 8713 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -1 +BITMAP +08 +3C +68 +C8 +D0 +FC +D0 +E0 +60 +3C +20 +ENDCHAR +STARTCHAR uni220A +ENCODING 8714 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +7C +C0 +FC +C0 +7C +ENDCHAR +STARTCHAR suchthat +ENCODING 8715 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +F0 +18 +0C +0C +FC +0C +0C +18 +F0 +ENDCHAR +STARTCHAR uni220C +ENCODING 8716 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -1 +BITMAP +10 +F0 +18 +1C +2C +FC +2C +4C +58 +F0 +40 +ENDCHAR +STARTCHAR uni220D +ENCODING 8717 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +F8 +0C +FC +0C +F8 +ENDCHAR +STARTCHAR uni220E +ENCODING 8718 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F8 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR product +ENCODING 8719 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +CC +CC +CC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni2210 +ENCODING 8720 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +CC +CC +CC +CC +CC +CC +CC +CC +FC +ENDCHAR +STARTCHAR summation +ENCODING 8721 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +C0 +60 +30 +18 +30 +60 +C0 +FC +ENDCHAR +STARTCHAR minus +ENCODING 8722 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 1 0 4 +BITMAP +FC +ENDCHAR +STARTCHAR uni2213 +ENCODING 8723 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 1 +BITMAP +FC +00 +30 +30 +FC +30 +30 +ENDCHAR +STARTCHAR uni2214 +ENCODING 8724 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 1 +BITMAP +30 +00 +30 +30 +FC +30 +30 +ENDCHAR +STARTCHAR uni2215 +ENCODING 8725 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +0C +0C +18 +18 +30 +30 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR uni2216 +ENCODING 8726 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +C0 +C0 +60 +60 +30 +30 +18 +18 +0C +0C +ENDCHAR +STARTCHAR asteriskmath +ENCODING 8727 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +D8 +70 +F8 +70 +D8 +ENDCHAR +STARTCHAR uni2218 +ENCODING 8728 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 4 0 2 +BITMAP +70 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni2219 +ENCODING 8729 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 2 2 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR radical +ENCODING 8730 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +1E +18 +18 +18 +18 +18 +D8 +78 +38 +18 +ENDCHAR +STARTCHAR uni221B +ENCODING 8731 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +C0 +2E +CC +2C +CC +0C +0C +6C +3C +1C +0C +ENDCHAR +STARTCHAR uni221C +ENCODING 8732 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +20 +6E +AC +EC +2C +0C +0C +6C +3C +1C +0C +ENDCHAR +STARTCHAR proportional +ENCODING 8733 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 5 0 1 +BITMAP +6C +D8 +D8 +D8 +6C +ENDCHAR +STARTCHAR infinity +ENCODING 8734 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 1 +BITMAP +68 +B4 +B4 +B4 +58 +ENDCHAR +STARTCHAR orthogonal +ENCODING 8735 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 3 +BITMAP +C0 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR angle +ENCODING 8736 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 3 +BITMAP +0C +18 +30 +60 +FC +ENDCHAR +STARTCHAR uni2223 +ENCODING 8739 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 9 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2224 +ENCODING 8740 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 4 9 1 0 +BITMAP +60 +60 +60 +70 +E0 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni2225 +ENCODING 8741 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +D8 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni2226 +ENCODING 8742 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +6C +6C +6C +6E +7C +EC +6C +6C +6C +ENDCHAR +STARTCHAR logicaland +ENCODING 8743 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +30 +30 +68 +68 +C4 +C4 +ENDCHAR +STARTCHAR logicalor +ENCODING 8744 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +C4 +C4 +68 +68 +30 +30 +ENDCHAR +STARTCHAR intersection +ENCODING 8745 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +78 +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR union +ENCODING 8746 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR integral +ENCODING 8747 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +1C +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR uni222C +ENCODING 8748 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +3E +6C +6C +6C +6C +6C +6C +6C +6C +6C +6C +6C +F8 +ENDCHAR +STARTCHAR uni222D +ENCODING 8749 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +3E +54 +54 +54 +54 +54 +54 +54 +54 +54 +54 +54 +F8 +ENDCHAR +STARTCHAR uni222E +ENCODING 8750 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +10 +20 +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +20 +40 +ENDCHAR +STARTCHAR uni222F +ENCODING 8751 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +14 +28 +28 +28 +7C +AA +AA +AA +7C +28 +28 +28 +50 +ENDCHAR +STARTCHAR therefore +ENCODING 8756 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 5 1 3 +BITMAP +20 +00 +00 +00 +88 +ENDCHAR +STARTCHAR uni2235 +ENCODING 8757 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 5 1 3 +BITMAP +88 +00 +00 +00 +20 +ENDCHAR +STARTCHAR uni2236 +ENCODING 8758 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 1 5 3 3 +BITMAP +80 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni2237 +ENCODING 8759 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 5 1 3 +BITMAP +88 +00 +00 +00 +88 +ENDCHAR +STARTCHAR uni2238 +ENCODING 8760 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 3 1 4 +BITMAP +20 +00 +F8 +ENDCHAR +STARTCHAR uni2239 +ENCODING 8761 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +08 +00 +F0 +00 +08 +ENDCHAR +STARTCHAR uni223A +ENCODING 8762 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +88 +00 +F8 +00 +88 +ENDCHAR +STARTCHAR uni223B +ENCODING 8763 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +10 +00 +64 +98 +00 +10 +ENDCHAR +STARTCHAR similar +ENCODING 8764 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 3 0 3 +BITMAP +64 +B4 +98 +ENDCHAR +STARTCHAR uni223D +ENCODING 8765 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 3 0 3 +BITMAP +98 +B4 +64 +ENDCHAR +STARTCHAR uni223E +ENCODING 8766 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +0C +66 +D6 +CC +60 +ENDCHAR +STARTCHAR uni223F +ENCODING 8767 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 2 +BITMAP +60 +B0 +B0 +30 +34 +34 +18 +ENDCHAR +STARTCHAR uni2240 +ENCODING 8768 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 3 8 2 0 +BITMAP +C0 +60 +60 +60 +C0 +C0 +C0 +60 +ENDCHAR +STARTCHAR uni2241 +ENCODING 8769 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +08 +68 +B4 +18 +20 +ENDCHAR +STARTCHAR uni2242 +ENCODING 8770 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +FC +00 +60 +B4 +18 +ENDCHAR +STARTCHAR uni2243 +ENCODING 8771 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +60 +B4 +18 +00 +FC +ENDCHAR +STARTCHAR uni2244 +ENCODING 8772 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 1 +BITMAP +08 +68 +B4 +18 +20 +FC +40 +ENDCHAR +STARTCHAR congruent +ENCODING 8773 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 7 0 1 +BITMAP +60 +B4 +18 +00 +FC +00 +FC +ENDCHAR +STARTCHAR approxequal +ENCODING 8776 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +60 +B4 +18 +60 +B4 +18 +ENDCHAR +STARTCHAR uni2249 +ENCODING 8777 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +08 +68 +B4 +18 +60 +B4 +58 +40 +ENDCHAR +STARTCHAR uni224A +ENCODING 8778 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +60 +B4 +18 +60 +B4 +18 +00 +FC +ENDCHAR +STARTCHAR uni224B +ENCODING 8779 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +60 +B4 +18 +60 +B4 +18 +60 +B4 +18 +ENDCHAR +STARTCHAR uni224C +ENCODING 8780 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 1 +BITMAP +18 +B4 +60 +00 +FC +00 +FC +ENDCHAR +STARTCHAR notequal +ENCODING 8800 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 1 +BITMAP +18 +FC +30 +FC +60 +ENDCHAR +STARTCHAR equivalence +ENCODING 8801 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 1 +BITMAP +FC +00 +FC +00 +FC +ENDCHAR +STARTCHAR uni2262 +ENCODING 8802 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +08 +FC +10 +FC +20 +FC +40 +ENDCHAR +STARTCHAR uni2263 +ENCODING 8803 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +FC +00 +FC +00 +FC +00 +FC +ENDCHAR +STARTCHAR lessequal +ENCODING 8804 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +1C +70 +C0 +70 +1C +00 +FC +ENDCHAR +STARTCHAR greaterequal +ENCODING 8805 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +E0 +38 +0C +38 +E0 +00 +FC +ENDCHAR +STARTCHAR uni2266 +ENCODING 8806 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +1C +70 +C0 +70 +1C +00 +FC +00 +FC +ENDCHAR +STARTCHAR uni2267 +ENCODING 8807 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +E0 +38 +0C +38 +E0 +00 +FC +00 +FC +ENDCHAR +STARTCHAR uni2268 +ENCODING 8808 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 10 0 -1 +BITMAP +1C +70 +C0 +70 +1C +18 +FC +30 +FC +60 +ENDCHAR +STARTCHAR uni2269 +ENCODING 8809 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 10 0 -1 +BITMAP +E0 +38 +0C +38 +E0 +18 +FC +30 +FC +60 +ENDCHAR +STARTCHAR uni226A +ENCODING 8810 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 2 +BITMAP +36 +6C +D8 +6C +36 +ENDCHAR +STARTCHAR uni226B +ENCODING 8811 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 2 +BITMAP +D8 +6C +36 +6C +D8 +ENDCHAR +STARTCHAR uni2276 +ENCODING 8822 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +1C +70 +C0 +70 +1C +E0 +38 +0C +38 +E0 +ENDCHAR +STARTCHAR uni2277 +ENCODING 8823 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +E0 +38 +0C +38 +E0 +1C +70 +C0 +70 +1C +ENDCHAR +STARTCHAR uni227A +ENCODING 8826 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +0C +38 +E0 +38 +0C +ENDCHAR +STARTCHAR uni227B +ENCODING 8827 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +C0 +70 +1C +70 +C0 +ENDCHAR +STARTCHAR uni227C +ENCODING 8828 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 1 +BITMAP +0C +38 +E0 +38 +EC +38 +0C +ENDCHAR +STARTCHAR uni227D +ENCODING 8829 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 1 +BITMAP +C0 +70 +1C +70 +DC +70 +C0 +ENDCHAR +STARTCHAR propersubset +ENCODING 8834 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +7C +C0 +C0 +C0 +C0 +7C +ENDCHAR +STARTCHAR propersuperset +ENCODING 8835 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +F8 +0C +0C +0C +0C +F8 +ENDCHAR +STARTCHAR notsubset +ENCODING 8836 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +08 +7C +C8 +D0 +D0 +D0 +7C +20 +ENDCHAR +STARTCHAR uni2285 +ENCODING 8837 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +10 +F8 +1C +2C +2C +2C +F8 +40 +ENDCHAR +STARTCHAR reflexsubset +ENCODING 8838 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +7C +C0 +C0 +C0 +C0 +7C +00 +FC +ENDCHAR +STARTCHAR reflexsuperset +ENCODING 8839 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +F8 +0C +0C +0C +0C +F8 +00 +FC +ENDCHAR +STARTCHAR uni2288 +ENCODING 8840 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 10 0 -1 +BITMAP +08 +7C +C8 +D0 +D0 +D0 +7C +20 +FC +20 +ENDCHAR +STARTCHAR uni2289 +ENCODING 8841 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 10 0 -1 +BITMAP +10 +F8 +1C +2C +2C +2C +F8 +40 +FC +40 +ENDCHAR +STARTCHAR uni228A +ENCODING 8842 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 9 0 -1 +BITMAP +7C +C0 +C0 +C0 +C0 +7C +10 +FC +20 +ENDCHAR +STARTCHAR uni228B +ENCODING 8843 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 9 0 -1 +BITMAP +F8 +0C +0C +0C +0C +F8 +10 +FC +20 +ENDCHAR +STARTCHAR uni228F +ENCODING 8847 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +FC +C0 +C0 +C0 +C0 +FC +ENDCHAR +STARTCHAR uni2290 +ENCODING 8848 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +FC +0C +0C +0C +0C +FC +ENDCHAR +STARTCHAR uni2291 +ENCODING 8849 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +FC +C0 +C0 +C0 +C0 +FC +00 +FC +ENDCHAR +STARTCHAR uni2292 +ENCODING 8850 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +FC +0C +0C +0C +0C +FC +00 +FC +ENDCHAR +STARTCHAR uni2293 +ENCODING 8851 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +FC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni2294 +ENCODING 8852 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +CC +CC +CC +CC +CC +FC +ENDCHAR +STARTCHAR circleplus +ENCODING 8853 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +7C +C6 +92 +BA +92 +C6 +7C +ENDCHAR +STARTCHAR uni2296 +ENCODING 8854 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +7C +C6 +82 +BA +82 +C6 +7C +ENDCHAR +STARTCHAR circlemultiply +ENCODING 8855 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +7C +C6 +AA +92 +AA +C6 +7C +ENDCHAR +STARTCHAR uni2298 +ENCODING 8856 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +7C +C6 +8A +92 +A2 +C6 +7C +ENDCHAR +STARTCHAR uni2299 +ENCODING 8857 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +7C +C6 +82 +92 +82 +C6 +7C +ENDCHAR +STARTCHAR uni229A +ENCODING 8858 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +7C +C6 +92 +AA +92 +C6 +7C +ENDCHAR +STARTCHAR uni229C +ENCODING 8860 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +7C +C6 +BA +82 +BA +C6 +7C +ENDCHAR +STARTCHAR uni229D +ENCODING 8861 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +7C +C6 +82 +BA +82 +C6 +7C +ENDCHAR +STARTCHAR uni229E +ENCODING 8862 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +82 +92 +BA +92 +82 +FE +ENDCHAR +STARTCHAR uni229F +ENCODING 8863 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +82 +82 +BA +82 +82 +FE +ENDCHAR +STARTCHAR uni22A0 +ENCODING 8864 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +82 +AA +92 +AA +82 +FE +ENDCHAR +STARTCHAR uni22A1 +ENCODING 8865 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +82 +82 +92 +82 +82 +FE +ENDCHAR +STARTCHAR uni22A2 +ENCODING 8866 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +C0 +C0 +FC +C0 +C0 +ENDCHAR +STARTCHAR uni22A3 +ENCODING 8867 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +0C +0C +FC +0C +0C +ENDCHAR +STARTCHAR uni22A4 +ENCODING 8868 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +FC +30 +30 +30 +30 +ENDCHAR +STARTCHAR perpendicular +ENCODING 8869 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni22A6 +ENCODING 8870 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +C0 +C0 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni22A7 +ENCODING 8871 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +C0 +C0 +C0 +F8 +C0 +F8 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni22A8 +ENCODING 8872 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C0 +C0 +C0 +FC +C0 +FC +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni22A9 +ENCODING 8873 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +D8 +D8 +D8 +DE +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni22AA +ENCODING 8874 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +A8 +A8 +A8 +AE +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni22AB +ENCODING 8875 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +D8 +D8 +DE +D8 +DE +D8 +D8 +ENDCHAR +STARTCHAR uni22AC +ENCODING 8876 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +C4 +C4 +C8 +FE +C8 +D0 +D0 +ENDCHAR +STARTCHAR uni22AD +ENCODING 8877 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +C4 +C4 +FE +C8 +FE +D0 +D0 +ENDCHAR +STARTCHAR uni22B2 +ENCODING 8882 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +0C +34 +C4 +34 +0C +ENDCHAR +STARTCHAR uni22B3 +ENCODING 8883 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +C0 +B0 +8C +B0 +C0 +ENDCHAR +STARTCHAR uni22B4 +ENCODING 8884 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +0C +34 +C4 +34 +0C +00 +FC +ENDCHAR +STARTCHAR uni22B5 +ENCODING 8885 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +C0 +B0 +8C +B0 +C0 +00 +FC +ENDCHAR +STARTCHAR uni22B6 +ENCODING 8886 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 3 0 3 +BITMAP +44 +BE +44 +ENDCHAR +STARTCHAR uni22B7 +ENCODING 8887 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 3 0 3 +BITMAP +44 +FA +44 +ENDCHAR +STARTCHAR uni22B8 +ENCODING 8888 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 3 0 3 +BITMAP +04 +FA +04 +ENDCHAR +STARTCHAR uni22BB +ENCODING 8891 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 8 0 1 +BITMAP +C4 +C4 +68 +68 +30 +30 +00 +FC +ENDCHAR +STARTCHAR uni22BC +ENCODING 8892 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 8 0 1 +BITMAP +FC +00 +30 +30 +68 +68 +C4 +C4 +ENDCHAR +STARTCHAR uni22BD +ENCODING 8893 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 8 0 1 +BITMAP +FC +00 +C4 +C4 +68 +68 +30 +30 +ENDCHAR +STARTCHAR uni22BF +ENCODING 8895 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 2 +BITMAP +04 +0C +1C +34 +64 +FC +ENDCHAR +STARTCHAR uni22C0 +ENCODING 8896 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +30 +30 +68 +68 +C4 +C4 +ENDCHAR +STARTCHAR uni22C1 +ENCODING 8897 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +C4 +C4 +68 +68 +30 +30 +ENDCHAR +STARTCHAR uni22C2 +ENCODING 8898 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +78 +C4 +C4 +C4 +C4 +C4 +ENDCHAR +STARTCHAR uni22C3 +ENCODING 8899 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +C4 +C4 +C4 +C4 +C4 +78 +ENDCHAR +STARTCHAR uni22C4 +ENCODING 8900 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +10 +38 +6C +C6 +6C +38 +10 +ENDCHAR +STARTCHAR dotmath +ENCODING 8901 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 1 1 3 4 +BITMAP +80 +ENDCHAR +STARTCHAR uni22C6 +ENCODING 8902 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +20 +A8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni22C7 +ENCODING 8903 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +10 +44 +28 +FE +28 +44 +10 +ENDCHAR +STARTCHAR uni22C8 +ENCODING 8904 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +C6 +EE +BA +92 +BA +EE +C6 +ENDCHAR +STARTCHAR uni22C9 +ENCODING 8905 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +C2 +E6 +BC +98 +BC +E6 +C2 +ENDCHAR +STARTCHAR uni22CA +ENCODING 8906 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +86 +CE +7A +32 +7A +CE +86 +ENDCHAR +STARTCHAR uni22CB +ENCODING 8907 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +80 +C0 +60 +30 +38 +6C +C6 +ENDCHAR +STARTCHAR uni22CC +ENCODING 8908 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +02 +06 +0C +18 +38 +6C +C6 +ENDCHAR +STARTCHAR uni22CD +ENCODING 8909 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +18 +B4 +60 +00 +FC +ENDCHAR +STARTCHAR uni22CE +ENCODING 8910 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +C4 +68 +68 +68 +30 +30 +ENDCHAR +STARTCHAR uni22CF +ENCODING 8911 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +30 +30 +68 +68 +68 +C4 +ENDCHAR +STARTCHAR house +ENCODING 8962 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 0 +BITMAP +30 +78 +CC +CC +CC +FC +ENDCHAR +STARTCHAR revlogicalnot +ENCODING 8976 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 4 0 2 +BITMAP +FC +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni231A +ENCODING 8986 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 1 +BITMAP +38 +44 +92 +92 +9A +82 +82 +44 +38 +ENDCHAR +STARTCHAR uni231B +ENCODING 8987 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 1 +BITMAP +FE +82 +82 +44 +44 +54 +BA +FE +FE +ENDCHAR +STARTCHAR uni231C +ENCODING 8988 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 3 3 0 8 +BITMAP +E0 +80 +80 +ENDCHAR +STARTCHAR uni231D +ENCODING 8989 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 3 3 4 8 +BITMAP +E0 +20 +20 +ENDCHAR +STARTCHAR uni231E +ENCODING 8990 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 3 3 0 -2 +BITMAP +80 +80 +E0 +ENDCHAR +STARTCHAR uni231F +ENCODING 8991 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 3 3 4 -2 +BITMAP +20 +20 +E0 +ENDCHAR +STARTCHAR integraltp +ENCODING 8992 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 13 2 -2 +BITMAP +60 +D0 +D0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR integralbt +ENCODING 8993 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 13 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +B0 +B0 +60 +ENDCHAR +STARTCHAR uni239B +ENCODING 9115 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 2 -2 +BITMAP +18 +30 +60 +60 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni239C +ENCODING 9116 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 2 13 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni239D +ENCODING 9117 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +60 +60 +30 +18 +ENDCHAR +STARTCHAR uni239E +ENCODING 9118 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 13 0 -2 +BITMAP +80 +C0 +60 +60 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni239F +ENCODING 9119 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 2 13 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni23A0 +ENCODING 9120 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 13 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +30 +30 +30 +60 +60 +C0 +80 +ENDCHAR +STARTCHAR uni23A1 +ENCODING 9121 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 2 -2 +BITMAP +F8 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni23A2 +ENCODING 9122 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 2 13 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni23A3 +ENCODING 9123 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +F8 +ENDCHAR +STARTCHAR uni23A4 +ENCODING 9124 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 13 0 -2 +BITMAP +F0 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni23A5 +ENCODING 9125 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 2 13 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni23A6 +ENCODING 9126 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 13 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +F0 +ENDCHAR +STARTCHAR uni23A7 +ENCODING 9127 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 2 -2 +BITMAP +38 +60 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni23A8 +ENCODING 9128 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 13 0 -2 +BITMAP +30 +30 +30 +30 +30 +60 +C0 +60 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni23A9 +ENCODING 9129 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +60 +38 +ENDCHAR +STARTCHAR uni23AA +ENCODING 9130 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 2 13 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni23AB +ENCODING 9131 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 13 0 -2 +BITMAP +C0 +60 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni23AC +ENCODING 9132 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +60 +38 +60 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni23AD +ENCODING 9133 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 13 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +60 +C0 +ENDCHAR +STARTCHAR uni23AE +ENCODING 9134 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 2 13 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni23BA +ENCODING 9146 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 1 0 10 +BITMAP +FE +ENDCHAR +STARTCHAR uni23BB +ENCODING 9147 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 1 0 7 +BITMAP +FE +ENDCHAR +STARTCHAR uni23BC +ENCODING 9148 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 1 0 3 +BITMAP +FE +ENDCHAR +STARTCHAR uni23BD +ENCODING 9149 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 1 0 0 +BITMAP +FE +ENDCHAR +STARTCHAR uni2408 +ENCODING 9224 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -1 +BITMAP +F0 +88 +F0 +88 +F0 +00 +3C +40 +38 +04 +78 +ENDCHAR +STARTCHAR uni2409 +ENCODING 9225 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -1 +BITMAP +88 +88 +F8 +88 +88 +00 +7C +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni240A +ENCODING 9226 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -1 +BITMAP +80 +80 +80 +80 +F8 +00 +7C +40 +78 +40 +40 +ENDCHAR +STARTCHAR uni240B +ENCODING 9227 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -1 +BITMAP +88 +88 +88 +50 +20 +00 +7C +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni240C +ENCODING 9228 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -1 +BITMAP +F8 +80 +E0 +80 +80 +00 +7C +40 +70 +40 +40 +ENDCHAR +STARTCHAR uni240D +ENCODING 9229 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -1 +BITMAP +78 +80 +80 +80 +78 +00 +78 +44 +78 +48 +44 +ENDCHAR +STARTCHAR uni240E +ENCODING 9230 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -1 +BITMAP +78 +80 +70 +08 +F0 +00 +38 +44 +44 +44 +38 +ENDCHAR +STARTCHAR uni240F +ENCODING 9231 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 0 -1 +BITMAP +78 +80 +70 +08 +F0 +00 +38 +10 +10 +10 +38 +ENDCHAR +STARTCHAR uni2420 +ENCODING 9248 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -1 +BITMAP +78 +80 +70 +08 +F0 +00 +78 +44 +78 +40 +40 +ENDCHAR +STARTCHAR uni2424 +ENCODING 9252 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -1 +BITMAP +88 +C8 +A8 +98 +88 +00 +40 +40 +40 +40 +7C +ENDCHAR +STARTCHAR SF100000 +ENCODING 9472 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 1 0 4 +BITMAP +FE +ENDCHAR +STARTCHAR uni2501 +ENCODING 9473 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 2 0 3 +BITMAP +FE +FE +ENDCHAR +STARTCHAR SF110000 +ENCODING 9474 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 13 3 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2503 +ENCODING 9475 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 13 3 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2504 +ENCODING 9476 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 1 0 4 +BITMAP +B4 +ENDCHAR +STARTCHAR uni2505 +ENCODING 9477 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 2 0 3 +BITMAP +B4 +B4 +ENDCHAR +STARTCHAR uni2506 +ENCODING 9478 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 1 13 3 -2 +BITMAP +80 +80 +80 +00 +00 +80 +80 +80 +00 +00 +80 +80 +80 +ENDCHAR +STARTCHAR uni2507 +ENCODING 9479 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 2 13 2 -2 +BITMAP +C0 +C0 +C0 +00 +00 +C0 +C0 +C0 +00 +00 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2508 +ENCODING 9480 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 1 0 4 +BITMAP +AA +ENDCHAR +STARTCHAR uni2509 +ENCODING 9481 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 2 0 3 +BITMAP +AA +AA +ENDCHAR +STARTCHAR uni250A +ENCODING 9482 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 12 3 -1 +BITMAP +80 +80 +00 +80 +80 +80 +00 +80 +80 +00 +80 +80 +ENDCHAR +STARTCHAR uni250B +ENCODING 9483 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 12 3 -1 +BITMAP +C0 +C0 +00 +C0 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR SF010000 +ENCODING 9484 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 7 3 -2 +BITMAP +F0 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni250D +ENCODING 9485 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 7 3 -2 +BITMAP +F0 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni250E +ENCODING 9486 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 7 3 -2 +BITMAP +F0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni250F +ENCODING 9487 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 7 3 -2 +BITMAP +F0 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR SF030000 +ENCODING 9488 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 7 0 -2 +BITMAP +F0 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni2511 +ENCODING 9489 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 7 0 -2 +BITMAP +F0 +F0 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni2512 +ENCODING 9490 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 0 -2 +BITMAP +F8 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni2513 +ENCODING 9491 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 0 -2 +BITMAP +F8 +F8 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR SF020000 +ENCODING 9492 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 7 3 4 +BITMAP +80 +80 +80 +80 +80 +80 +F0 +ENDCHAR +STARTCHAR uni2515 +ENCODING 9493 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 8 3 3 +BITMAP +80 +80 +80 +80 +80 +80 +F0 +F0 +ENDCHAR +STARTCHAR uni2516 +ENCODING 9494 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 7 3 4 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +F0 +ENDCHAR +STARTCHAR uni2517 +ENCODING 9495 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 8 3 3 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +F0 +F0 +ENDCHAR +STARTCHAR SF040000 +ENCODING 9496 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 7 0 4 +BITMAP +10 +10 +10 +10 +10 +10 +F0 +ENDCHAR +STARTCHAR uni2519 +ENCODING 9497 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 8 0 3 +BITMAP +10 +10 +10 +10 +10 +10 +F0 +F0 +ENDCHAR +STARTCHAR uni251A +ENCODING 9498 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 0 4 +BITMAP +18 +18 +18 +18 +18 +18 +F8 +ENDCHAR +STARTCHAR uni251B +ENCODING 9499 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 0 3 +BITMAP +18 +18 +18 +18 +18 +18 +F8 +F8 +ENDCHAR +STARTCHAR SF080000 +ENCODING 9500 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 13 3 -2 +BITMAP +80 +80 +80 +80 +80 +80 +F0 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni251D +ENCODING 9501 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 13 3 -2 +BITMAP +80 +80 +80 +80 +80 +80 +F0 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni251E +ENCODING 9502 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 13 3 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +F0 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni251F +ENCODING 9503 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 13 3 -2 +BITMAP +80 +80 +80 +80 +80 +80 +F0 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2520 +ENCODING 9504 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 13 3 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +F0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2521 +ENCODING 9505 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 13 3 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +F0 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2522 +ENCODING 9506 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 13 3 -2 +BITMAP +80 +80 +80 +80 +80 +80 +F0 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2523 +ENCODING 9507 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 13 3 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +F0 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR SF090000 +ENCODING 9508 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 13 0 -2 +BITMAP +10 +10 +10 +10 +10 +10 +F0 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni2525 +ENCODING 9509 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 13 0 -2 +BITMAP +10 +10 +10 +10 +10 +10 +F0 +F0 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni2526 +ENCODING 9510 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 13 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +F8 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni2527 +ENCODING 9511 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 13 0 -2 +BITMAP +10 +10 +10 +10 +10 +10 +F8 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni2528 +ENCODING 9512 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 13 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +F8 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni2529 +ENCODING 9513 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 13 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +F8 +F8 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni252A +ENCODING 9514 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 13 0 -2 +BITMAP +10 +10 +10 +10 +10 +10 +F8 +F8 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni252B +ENCODING 9515 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 13 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +F8 +F8 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR SF060000 +ENCODING 9516 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 -2 +BITMAP +FE +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni252D +ENCODING 9517 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 -2 +BITMAP +FE +F0 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni252E +ENCODING 9518 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 -2 +BITMAP +FE +1E +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni252F +ENCODING 9519 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 -2 +BITMAP +FE +FE +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni2530 +ENCODING 9520 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 -2 +BITMAP +FE +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni2531 +ENCODING 9521 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 -2 +BITMAP +FE +F8 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni2532 +ENCODING 9522 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 -2 +BITMAP +FE +1E +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni2533 +ENCODING 9523 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 -2 +BITMAP +FE +FE +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR SF070000 +ENCODING 9524 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 4 +BITMAP +10 +10 +10 +10 +10 +10 +FE +ENDCHAR +STARTCHAR uni2535 +ENCODING 9525 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 8 0 3 +BITMAP +10 +10 +10 +10 +10 +10 +FE +F0 +ENDCHAR +STARTCHAR uni2536 +ENCODING 9526 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 8 0 3 +BITMAP +10 +10 +10 +10 +10 +10 +FE +1E +ENDCHAR +STARTCHAR uni2537 +ENCODING 9527 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 8 0 3 +BITMAP +10 +10 +10 +10 +10 +10 +FE +FE +ENDCHAR +STARTCHAR uni2538 +ENCODING 9528 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 4 +BITMAP +18 +18 +18 +18 +18 +18 +FE +ENDCHAR +STARTCHAR uni2539 +ENCODING 9529 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 8 0 3 +BITMAP +18 +18 +18 +18 +18 +18 +FE +F8 +ENDCHAR +STARTCHAR uni253A +ENCODING 9530 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 8 0 3 +BITMAP +18 +18 +18 +18 +18 +18 +FE +1E +ENDCHAR +STARTCHAR uni253B +ENCODING 9531 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 8 0 3 +BITMAP +18 +18 +18 +18 +18 +18 +FE +FE +ENDCHAR +STARTCHAR SF050000 +ENCODING 9532 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +10 +10 +10 +10 +10 +10 +FE +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni253D +ENCODING 9533 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +10 +10 +10 +10 +10 +10 +FE +F0 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni253E +ENCODING 9534 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +10 +10 +10 +10 +10 +10 +FE +1E +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni253F +ENCODING 9535 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +10 +10 +10 +10 +10 +10 +FE +FE +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni2540 +ENCODING 9536 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +FE +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni2541 +ENCODING 9537 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +10 +10 +10 +10 +10 +10 +FE +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni2542 +ENCODING 9538 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +FE +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni2543 +ENCODING 9539 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +FE +F8 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni2544 +ENCODING 9540 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +FE +1E +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni2545 +ENCODING 9541 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +10 +10 +10 +10 +10 +10 +FE +F8 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni2546 +ENCODING 9542 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +10 +10 +10 +10 +10 +10 +FE +1E +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni2547 +ENCODING 9543 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +FE +FE +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni2548 +ENCODING 9544 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +10 +10 +10 +10 +10 +10 +FE +FE +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni2549 +ENCODING 9545 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +FE +F8 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni254A +ENCODING 9546 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +FE +1E +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni254B +ENCODING 9547 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +FE +FE +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR SF430000 +ENCODING 9552 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 3 0 3 +BITMAP +FE +00 +FE +ENDCHAR +STARTCHAR SF240000 +ENCODING 9553 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 13 2 -2 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF510000 +ENCODING 9554 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 8 3 -2 +BITMAP +F0 +80 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR SF520000 +ENCODING 9555 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 2 -2 +BITMAP +F8 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF390000 +ENCODING 9556 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 2 -2 +BITMAP +F8 +80 +B8 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF220000 +ENCODING 9557 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 8 0 -2 +BITMAP +F0 +10 +F0 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR SF210000 +ENCODING 9558 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 0 -2 +BITMAP +F8 +28 +28 +28 +28 +28 +28 +ENDCHAR +STARTCHAR SF250000 +ENCODING 9559 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 0 -2 +BITMAP +F8 +08 +E8 +28 +28 +28 +28 +28 +ENDCHAR +STARTCHAR SF500000 +ENCODING 9560 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 8 3 3 +BITMAP +80 +80 +80 +80 +80 +F0 +80 +F0 +ENDCHAR +STARTCHAR SF490000 +ENCODING 9561 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 2 4 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +F8 +ENDCHAR +STARTCHAR SF380000 +ENCODING 9562 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 2 3 +BITMAP +A0 +A0 +A0 +A0 +A0 +B8 +80 +F8 +ENDCHAR +STARTCHAR SF280000 +ENCODING 9563 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 8 0 3 +BITMAP +10 +10 +10 +10 +10 +F0 +10 +F0 +ENDCHAR +STARTCHAR SF270000 +ENCODING 9564 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 0 4 +BITMAP +28 +28 +28 +28 +28 +28 +F8 +ENDCHAR +STARTCHAR SF260000 +ENCODING 9565 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 0 3 +BITMAP +28 +28 +28 +28 +28 +E8 +08 +F8 +ENDCHAR +STARTCHAR SF360000 +ENCODING 9566 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 13 3 -2 +BITMAP +80 +80 +80 +80 +80 +F0 +80 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR SF370000 +ENCODING 9567 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 13 2 -2 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +B8 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF420000 +ENCODING 9568 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 13 2 -2 +BITMAP +A0 +A0 +A0 +A0 +A0 +B8 +80 +B8 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF190000 +ENCODING 9569 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 13 0 -2 +BITMAP +10 +10 +10 +10 +10 +F0 +10 +F0 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR SF200000 +ENCODING 9570 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 13 0 -2 +BITMAP +28 +28 +28 +28 +28 +28 +E8 +28 +28 +28 +28 +28 +28 +ENDCHAR +STARTCHAR SF230000 +ENCODING 9571 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 13 0 -2 +BITMAP +28 +28 +28 +28 +28 +E8 +08 +E8 +28 +28 +28 +28 +28 +ENDCHAR +STARTCHAR SF470000 +ENCODING 9572 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 8 0 -2 +BITMAP +FE +00 +FE +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR SF480000 +ENCODING 9573 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 -2 +BITMAP +FE +28 +28 +28 +28 +28 +28 +ENDCHAR +STARTCHAR SF410000 +ENCODING 9574 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 8 0 -2 +BITMAP +FE +00 +EE +28 +28 +28 +28 +28 +ENDCHAR +STARTCHAR SF450000 +ENCODING 9575 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 8 0 3 +BITMAP +10 +10 +10 +10 +10 +FE +00 +FE +ENDCHAR +STARTCHAR SF460000 +ENCODING 9576 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 4 +BITMAP +28 +28 +28 +28 +28 +28 +FE +ENDCHAR +STARTCHAR SF400000 +ENCODING 9577 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 8 0 3 +BITMAP +28 +28 +28 +28 +28 +EE +00 +FE +ENDCHAR +STARTCHAR SF540000 +ENCODING 9578 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +10 +10 +10 +10 +10 +FE +10 +FE +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR SF530000 +ENCODING 9579 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +28 +28 +28 +28 +28 +28 +FE +28 +28 +28 +28 +28 +28 +ENDCHAR +STARTCHAR SF440000 +ENCODING 9580 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +28 +28 +28 +28 +28 +EE +00 +EE +28 +28 +28 +28 +28 +ENDCHAR +STARTCHAR uni256D +ENCODING 9581 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 7 3 -2 +BITMAP +30 +40 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni256E +ENCODING 9582 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 7 0 -2 +BITMAP +C0 +20 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni256F +ENCODING 9583 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 7 0 4 +BITMAP +10 +10 +10 +10 +10 +20 +C0 +ENDCHAR +STARTCHAR uni2570 +ENCODING 9584 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 7 3 4 +BITMAP +80 +80 +80 +80 +80 +40 +30 +ENDCHAR +STARTCHAR uni2571 +ENCODING 9585 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +02 +02 +04 +04 +08 +08 +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni2572 +ENCODING 9586 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +80 +80 +40 +40 +20 +20 +10 +08 +08 +04 +04 +02 +02 +ENDCHAR +STARTCHAR uni2573 +ENCODING 9587 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +82 +82 +44 +44 +28 +28 +10 +28 +28 +44 +44 +82 +82 +ENDCHAR +STARTCHAR uni2574 +ENCODING 9588 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 1 0 4 +BITMAP +F0 +ENDCHAR +STARTCHAR uni2575 +ENCODING 9589 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 7 3 4 +BITMAP +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2576 +ENCODING 9590 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 1 3 4 +BITMAP +F0 +ENDCHAR +STARTCHAR uni2577 +ENCODING 9591 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 7 3 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2578 +ENCODING 9592 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 2 0 3 +BITMAP +F0 +F0 +ENDCHAR +STARTCHAR uni2579 +ENCODING 9593 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 7 3 4 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni257A +ENCODING 9594 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 2 3 3 +BITMAP +F0 +F0 +ENDCHAR +STARTCHAR uni257B +ENCODING 9595 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 7 3 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni257C +ENCODING 9596 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 2 0 3 +BITMAP +FE +1E +ENDCHAR +STARTCHAR uni257D +ENCODING 9597 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 13 3 -2 +BITMAP +80 +80 +80 +80 +80 +80 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni257E +ENCODING 9598 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 2 0 3 +BITMAP +FE +F0 +ENDCHAR +STARTCHAR uni257F +ENCODING 9599 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 13 3 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR upblock +ENCODING 9600 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 4 +BITMAP +FE +FE +FE +FE +FE +FE +FE +ENDCHAR +STARTCHAR uni2581 +ENCODING 9601 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 1 0 -2 +BITMAP +FE +ENDCHAR +STARTCHAR uni2582 +ENCODING 9602 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 3 0 -2 +BITMAP +FE +FE +FE +ENDCHAR +STARTCHAR uni2583 +ENCODING 9603 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 4 0 -2 +BITMAP +FE +FE +FE +FE +ENDCHAR +STARTCHAR dnblock +ENCODING 9604 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 -2 +BITMAP +FE +FE +FE +FE +FE +FE +FE +ENDCHAR +STARTCHAR uni2585 +ENCODING 9605 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 8 0 -2 +BITMAP +FE +FE +FE +FE +FE +FE +FE +FE +ENDCHAR +STARTCHAR uni2586 +ENCODING 9606 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2587 +ENCODING 9607 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +ENDCHAR +STARTCHAR block +ENCODING 9608 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +ENDCHAR +STARTCHAR uni2589 +ENCODING 9609 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni258A +ENCODING 9610 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 13 0 -2 +BITMAP +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni258B +ENCODING 9611 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 13 0 -2 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR lfblock +ENCODING 9612 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 13 0 -2 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni258D +ENCODING 9613 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 13 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni258E +ENCODING 9614 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 13 0 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni258F +ENCODING 9615 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 13 0 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR rtblock +ENCODING 9616 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 13 3 -2 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR ltshade +ENCODING 9617 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +88 +20 +0A +40 +14 +80 +24 +00 +4A +00 +90 +04 +20 +ENDCHAR +STARTCHAR shade +ENCODING 9618 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +54 +AA +54 +AA +54 +AA +54 +AA +54 +AA +54 +AA +54 +ENDCHAR +STARTCHAR dkshade +ENCODING 9619 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +6E +DA +FC +AE +F4 +5E +EA +BC +EE +DC +76 +EC +BA +ENDCHAR +STARTCHAR uni2594 +ENCODING 9620 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 2 0 9 +BITMAP +FE +FE +ENDCHAR +STARTCHAR uni2595 +ENCODING 9621 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 1 13 6 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2596 +ENCODING 9622 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 7 0 -2 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni2597 +ENCODING 9623 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 7 3 -2 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni2598 +ENCODING 9624 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 7 0 4 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni2599 +ENCODING 9625 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +FE +FE +FE +FE +FE +FE +FE +ENDCHAR +STARTCHAR uni259A +ENCODING 9626 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +FE +1E +1E +1E +1E +1E +1E +ENDCHAR +STARTCHAR uni259B +ENCODING 9627 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +FE +FE +FE +FE +FE +FE +FE +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni259C +ENCODING 9628 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +FE +FE +FE +FE +FE +FE +FE +1E +1E +1E +1E +1E +1E +ENDCHAR +STARTCHAR uni259D +ENCODING 9629 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 7 3 4 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni259E +ENCODING 9630 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +1E +1E +1E +1E +1E +1E +FE +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni259F +ENCODING 9631 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +1E +1E +1E +1E +1E +1E +FE +FE +FE +FE +FE +FE +FE +ENDCHAR +STARTCHAR filledbox +ENCODING 9632 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 2 +BITMAP +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR H22073 +ENCODING 9633 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 2 +BITMAP +FC +84 +84 +84 +84 +FC +ENDCHAR +STARTCHAR uni25A2 +ENCODING 9634 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 2 +BITMAP +78 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni25A3 +ENCODING 9635 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 2 +BITMAP +FC +84 +B4 +B4 +84 +FC +ENDCHAR +STARTCHAR H18543 +ENCODING 9642 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 3 2 3 +BITMAP +E0 +E0 +E0 +ENDCHAR +STARTCHAR H18551 +ENCODING 9643 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 3 2 3 +BITMAP +E0 +A0 +E0 +ENDCHAR +STARTCHAR filledrect +ENCODING 9644 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 3 0 3 +BITMAP +FC +FC +FC +ENDCHAR +STARTCHAR uni25AD +ENCODING 9645 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 3 0 3 +BITMAP +FC +84 +FC +ENDCHAR +STARTCHAR uni25AE +ENCODING 9646 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 9 2 0 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni25AF +ENCODING 9647 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 9 2 0 +BITMAP +E0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +E0 +ENDCHAR +STARTCHAR uni25B0 +ENCODING 9648 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 3 0 3 +BITMAP +3E +7C +F8 +ENDCHAR +STARTCHAR uni25B1 +ENCODING 9649 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 3 0 3 +BITMAP +3E +44 +F8 +ENDCHAR +STARTCHAR triagup +ENCODING 9650 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +10 +10 +38 +38 +7C +7C +FE +ENDCHAR +STARTCHAR uni25B3 +ENCODING 9651 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +10 +10 +28 +28 +44 +44 +FE +ENDCHAR +STARTCHAR uni25B4 +ENCODING 9652 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 3 1 3 +BITMAP +20 +70 +F8 +ENDCHAR +STARTCHAR uni25B5 +ENCODING 9653 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 3 1 3 +BITMAP +20 +50 +F8 +ENDCHAR +STARTCHAR uni25B6 +ENCODING 9654 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +80 +E0 +F8 +FE +F8 +E0 +80 +ENDCHAR +STARTCHAR uni25B7 +ENCODING 9655 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +80 +E0 +98 +86 +98 +E0 +80 +ENDCHAR +STARTCHAR uni25B8 +ENCODING 9656 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 5 2 2 +BITMAP +80 +C0 +E0 +C0 +80 +ENDCHAR +STARTCHAR uni25B9 +ENCODING 9657 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 5 2 2 +BITMAP +80 +C0 +A0 +C0 +80 +ENDCHAR +STARTCHAR triagrt +ENCODING 9658 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +C0 +F0 +FC +F0 +C0 +ENDCHAR +STARTCHAR uni25BB +ENCODING 9659 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +C0 +B0 +8C +B0 +C0 +ENDCHAR +STARTCHAR triagdn +ENCODING 9660 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +7C +7C +38 +38 +10 +10 +ENDCHAR +STARTCHAR uni25BD +ENCODING 9661 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +44 +44 +28 +28 +10 +10 +ENDCHAR +STARTCHAR uni25BE +ENCODING 9662 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 3 1 3 +BITMAP +F8 +70 +20 +ENDCHAR +STARTCHAR uni25BF +ENCODING 9663 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 3 1 3 +BITMAP +F8 +50 +20 +ENDCHAR +STARTCHAR uni25C0 +ENCODING 9664 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +02 +0E +3E +FE +3E +0E +02 +ENDCHAR +STARTCHAR uni25C1 +ENCODING 9665 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +02 +0E +32 +C2 +32 +0E +02 +ENDCHAR +STARTCHAR uni25C2 +ENCODING 9666 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 5 2 2 +BITMAP +20 +60 +E0 +60 +20 +ENDCHAR +STARTCHAR uni25C3 +ENCODING 9667 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 5 2 2 +BITMAP +20 +60 +A0 +60 +20 +ENDCHAR +STARTCHAR triaglf +ENCODING 9668 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +0C +3C +FC +3C +0C +ENDCHAR +STARTCHAR uni25C5 +ENCODING 9669 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +0C +34 +C4 +34 +0C +ENDCHAR +STARTCHAR uni25C6 +ENCODING 9670 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +10 +38 +7C +FE +7C +38 +10 +ENDCHAR +STARTCHAR uni25C7 +ENCODING 9671 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +10 +28 +44 +82 +44 +28 +10 +ENDCHAR +STARTCHAR uni25C8 +ENCODING 9672 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +10 +28 +54 +BA +54 +28 +10 +ENDCHAR +STARTCHAR lozenge +ENCODING 9674 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +20 +20 +50 +50 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR circle +ENCODING 9675 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +44 +82 +82 +82 +44 +38 +ENDCHAR +STARTCHAR uni25CC +ENCODING 9676 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +10 +44 +00 +82 +00 +44 +10 +ENDCHAR +STARTCHAR uni25CD +ENCODING 9677 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +6C +AA +AA +AA +6C +38 +ENDCHAR +STARTCHAR uni25CE +ENCODING 9678 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +44 +92 +AA +92 +44 +38 +ENDCHAR +STARTCHAR H18533 +ENCODING 9679 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +7C +FE +FE +FE +7C +38 +ENDCHAR +STARTCHAR uni25D0 +ENCODING 9680 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +74 +F2 +F2 +F2 +74 +38 +ENDCHAR +STARTCHAR uni25D1 +ENCODING 9681 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +5C +9E +9E +9E +5C +38 +ENDCHAR +STARTCHAR uni25D2 +ENCODING 9682 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +44 +82 +FE +FE +7C +38 +ENDCHAR +STARTCHAR uni25D3 +ENCODING 9683 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +7C +FE +FE +82 +44 +38 +ENDCHAR +STARTCHAR uni25D4 +ENCODING 9684 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +5C +9E +9E +82 +44 +38 +ENDCHAR +STARTCHAR uni25D5 +ENCODING 9685 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +5C +9E +FE +FE +7C +38 +ENDCHAR +STARTCHAR uni25D6 +ENCODING 9686 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 7 0 1 +BITMAP +30 +70 +F0 +F0 +F0 +70 +30 +ENDCHAR +STARTCHAR uni25D7 +ENCODING 9687 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 7 3 1 +BITMAP +C0 +E0 +F0 +F0 +F0 +E0 +C0 +ENDCHAR +STARTCHAR uni25DC +ENCODING 9692 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 4 0 4 +BITMAP +30 +40 +80 +80 +ENDCHAR +STARTCHAR uni25DD +ENCODING 9693 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 4 3 4 +BITMAP +C0 +20 +10 +10 +ENDCHAR +STARTCHAR uni25DE +ENCODING 9694 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 4 3 1 +BITMAP +10 +10 +20 +C0 +ENDCHAR +STARTCHAR uni25DF +ENCODING 9695 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 4 0 1 +BITMAP +80 +80 +40 +30 +ENDCHAR +STARTCHAR uni25E0 +ENCODING 9696 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 4 0 4 +BITMAP +38 +44 +82 +82 +ENDCHAR +STARTCHAR uni25E1 +ENCODING 9697 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 4 0 1 +BITMAP +82 +82 +44 +38 +ENDCHAR +STARTCHAR uni25E2 +ENCODING 9698 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +02 +06 +0E +1E +3E +7E +FE +ENDCHAR +STARTCHAR uni25E3 +ENCODING 9699 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +80 +C0 +E0 +F0 +F8 +FC +FE +ENDCHAR +STARTCHAR uni25E4 +ENCODING 9700 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +FC +F8 +F0 +E0 +C0 +80 +ENDCHAR +STARTCHAR uni25E5 +ENCODING 9701 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +7E +3E +1E +0E +06 +02 +ENDCHAR +STARTCHAR openbullet +ENCODING 9702 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni25E7 +ENCODING 9703 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +F2 +F2 +F2 +F2 +F2 +FE +ENDCHAR +STARTCHAR uni25E8 +ENCODING 9704 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +9E +9E +9E +9E +9E +FE +ENDCHAR +STARTCHAR uni25E9 +ENCODING 9705 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +FE +FA +F2 +E2 +C2 +FE +ENDCHAR +STARTCHAR uni25EA +ENCODING 9706 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +86 +8E +9E +BE +FE +FE +ENDCHAR +STARTCHAR uni25EB +ENCODING 9707 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +92 +92 +92 +92 +92 +FE +ENDCHAR +STARTCHAR uni25EC +ENCODING 9708 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 8 0 1 +BITMAP +10 +10 +28 +28 +44 +54 +82 +FE +ENDCHAR +STARTCHAR uni25ED +ENCODING 9709 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 8 0 1 +BITMAP +10 +10 +38 +38 +74 +74 +F2 +FE +ENDCHAR +STARTCHAR uni25EE +ENCODING 9710 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 8 0 1 +BITMAP +10 +10 +38 +38 +5C +5C +9E +FE +ENDCHAR +STARTCHAR uni25EF +ENCODING 9711 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +44 +82 +82 +82 +44 +38 +ENDCHAR +STARTCHAR uni25F0 +ENCODING 9712 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +92 +92 +F2 +82 +82 +FE +ENDCHAR +STARTCHAR uni25F1 +ENCODING 9713 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +82 +82 +F2 +92 +92 +FE +ENDCHAR +STARTCHAR uni25F2 +ENCODING 9714 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +82 +82 +9E +92 +92 +FE +ENDCHAR +STARTCHAR uni25F3 +ENCODING 9715 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +92 +92 +9E +82 +82 +FE +ENDCHAR +STARTCHAR uni25F4 +ENCODING 9716 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +54 +92 +F2 +82 +44 +38 +ENDCHAR +STARTCHAR uni25F5 +ENCODING 9717 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +44 +82 +F2 +92 +54 +38 +ENDCHAR +STARTCHAR uni25F6 +ENCODING 9718 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +44 +82 +9E +92 +54 +38 +ENDCHAR +STARTCHAR uni25F7 +ENCODING 9719 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +54 +92 +9E +82 +44 +38 +ENDCHAR +STARTCHAR uni25F8 +ENCODING 9720 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +84 +88 +90 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni25F9 +ENCODING 9721 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +42 +22 +12 +0A +06 +02 +ENDCHAR +STARTCHAR uni25FA +ENCODING 9722 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +80 +C0 +A0 +90 +88 +84 +FE +ENDCHAR +STARTCHAR uni25FB +ENCODING 9723 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +82 +82 +82 +82 +82 +FE +ENDCHAR +STARTCHAR uni25FC +ENCODING 9724 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +FE +FE +FE +FE +FE +FE +ENDCHAR +STARTCHAR uni25FD +ENCODING 9725 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +F8 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni25FE +ENCODING 9726 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni25FF +ENCODING 9727 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +02 +06 +0A +12 +22 +42 +FE +ENDCHAR +STARTCHAR uni2605 +ENCODING 9733 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 8 0 2 +BITMAP +10 +10 +38 +FE +7C +38 +6C +44 +ENDCHAR +STARTCHAR uni2606 +ENCODING 9734 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 8 0 2 +BITMAP +10 +10 +28 +C6 +44 +28 +7C +44 +ENDCHAR +STARTCHAR uni2609 +ENCODING 9737 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +44 +82 +92 +82 +44 +38 +ENDCHAR +STARTCHAR uni260A +ENCODING 9738 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +38 +44 +82 +82 +82 +44 +AA +AA +44 +ENDCHAR +STARTCHAR uni260B +ENCODING 9739 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +44 +AA +AA +44 +82 +82 +82 +44 +38 +ENDCHAR +STARTCHAR uni2610 +ENCODING 9744 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +FE +82 +82 +82 +82 +82 +82 +82 +FE +ENDCHAR +STARTCHAR uni2611 +ENCODING 9745 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +FE +82 +8A +8A +92 +D2 +A2 +82 +FE +ENDCHAR +STARTCHAR uni2612 +ENCODING 9746 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +FE +82 +C6 +AA +92 +AA +C6 +82 +FE +ENDCHAR +STARTCHAR uni262A +ENCODING 9770 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +38 +60 +C0 +C8 +DC +C8 +C0 +60 +38 +ENDCHAR +STARTCHAR uni2639 +ENCODING 9785 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +38 +44 +AA +AA +82 +92 +AA +44 +38 +ENDCHAR +STARTCHAR smileface +ENCODING 9786 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +38 +44 +AA +AA +82 +C6 +BA +44 +38 +ENDCHAR +STARTCHAR invsmileface +ENCODING 9787 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +38 +7C +D6 +D6 +FE +BA +C6 +7C +38 +ENDCHAR +STARTCHAR sun +ENCODING 9788 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +10 +92 +54 +38 +EE +38 +54 +92 +10 +ENDCHAR +STARTCHAR uni263D +ENCODING 9789 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +E0 +50 +28 +28 +28 +28 +28 +50 +E0 +ENDCHAR +STARTCHAR uni263E +ENCODING 9790 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +38 +50 +A0 +A0 +A0 +A0 +A0 +50 +38 +ENDCHAR +STARTCHAR uni263F +ENCODING 9791 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 10 1 -1 +BITMAP +88 +88 +70 +88 +88 +88 +70 +20 +70 +20 +ENDCHAR +STARTCHAR female +ENCODING 9792 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +70 +88 +88 +88 +70 +20 +70 +20 +ENDCHAR +STARTCHAR uni2641 +ENCODING 9793 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 1 1 +BITMAP +20 +70 +20 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR male +ENCODING 9794 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 8 1 1 +BITMAP +1C +0C +14 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2643 +ENCODING 9795 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +04 +64 +94 +14 +24 +FC +04 +04 +04 +ENDCHAR +STARTCHAR uni2644 +ENCODING 9796 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +40 +E0 +40 +58 +64 +44 +44 +44 +48 +ENDCHAR +STARTCHAR uni2645 +ENCODING 9797 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +D6 +54 +7C +54 +D6 +10 +28 +28 +10 +ENDCHAR +STARTCHAR uni2646 +ENCODING 9798 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 11 0 -1 +BITMAP +10 +38 +10 +54 +D6 +54 +54 +38 +10 +38 +10 +ENDCHAR +STARTCHAR uni2647 +ENCODING 9799 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F0 +88 +88 +88 +F0 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni2648 +ENCODING 9800 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +50 +A8 +A8 +A8 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2649 +ENCODING 9801 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +88 +88 +50 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni264A +ENCODING 9802 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +D8 +70 +50 +50 +50 +50 +70 +D8 +ENDCHAR +STARTCHAR uni264B +ENCODING 9803 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +38 +54 +52 +20 +08 +94 +54 +38 +ENDCHAR +STARTCHAR uni264C +ENCODING 9804 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +38 +44 +44 +44 +28 +68 +A8 +AA +44 +ENDCHAR +STARTCHAR uni264D +ENCODING 9805 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 -2 +BITMAP +50 +A8 +AC +AA +AA +AA +AA +AC +08 +34 +ENDCHAR +STARTCHAR uni264E +ENCODING 9806 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 1 1 +BITMAP +70 +88 +88 +88 +50 +D8 +00 +F8 +ENDCHAR +STARTCHAR uni264F +ENCODING 9807 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 -1 +BITMAP +50 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +AA +06 +ENDCHAR +STARTCHAR uni2650 +ENCODING 9808 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +3C +0C +F4 +34 +50 +90 +ENDCHAR +STARTCHAR uni2651 +ENCODING 9809 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +A0 +50 +50 +50 +50 +10 +18 +14 +28 +ENDCHAR +STARTCHAR uni2652 +ENCODING 9810 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +54 +A8 +00 +54 +A8 +ENDCHAR +STARTCHAR uni2653 +ENCODING 9811 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +50 +50 +50 +F8 +50 +50 +50 +88 +ENDCHAR +STARTCHAR uni2654 +ENCODING 9812 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +70 +20 +50 +A8 +A8 +A8 +A8 +70 +88 +F8 +ENDCHAR +STARTCHAR uni2655 +ENCODING 9813 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +10 +54 +54 +28 +AA +54 +38 +44 +7C +ENDCHAR +STARTCHAR uni2656 +ENCODING 9814 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +A8 +F8 +88 +F8 +50 +50 +50 +50 +70 +88 +F8 +ENDCHAR +STARTCHAR uni2657 +ENCODING 9815 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +50 +A8 +F8 +A8 +88 +50 +50 +70 +88 +F8 +ENDCHAR +STARTCHAR uni2658 +ENCODING 9816 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +A0 +E0 +90 +C8 +88 +A8 +C8 +48 +70 +88 +F8 +ENDCHAR +STARTCHAR uni2659 +ENCODING 9817 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +20 +50 +50 +20 +50 +70 +88 +F8 +ENDCHAR +STARTCHAR uni265A +ENCODING 9818 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +70 +20 +70 +F8 +A8 +A8 +F8 +50 +F8 +F8 +ENDCHAR +STARTCHAR uni265B +ENCODING 9819 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +10 +54 +54 +38 +BA +54 +38 +7C +7C +ENDCHAR +STARTCHAR uni265C +ENCODING 9820 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +A8 +F8 +F8 +F8 +50 +70 +70 +70 +50 +F8 +F8 +ENDCHAR +STARTCHAR uni265D +ENCODING 9821 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +70 +D8 +88 +D8 +F8 +70 +50 +70 +F8 +F8 +ENDCHAR +STARTCHAR uni265E +ENCODING 9822 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +A0 +E0 +F0 +B8 +F8 +D8 +B8 +78 +50 +F8 +F8 +ENDCHAR +STARTCHAR uni265F +ENCODING 9823 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +20 +70 +70 +20 +50 +70 +F8 +F8 +ENDCHAR +STARTCHAR spade +ENCODING 9824 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +10 +38 +7C +FE +FE +FE +54 +10 +38 +ENDCHAR +STARTCHAR uni2661 +ENCODING 9825 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +6C +92 +82 +82 +82 +44 +44 +28 +10 +ENDCHAR +STARTCHAR uni2662 +ENCODING 9826 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +10 +28 +44 +44 +82 +44 +44 +28 +10 +ENDCHAR +STARTCHAR club +ENCODING 9827 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +10 +38 +38 +54 +FE +FE +54 +10 +38 +ENDCHAR +STARTCHAR uni2664 +ENCODING 9828 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +10 +28 +44 +82 +92 +BA +54 +10 +38 +ENDCHAR +STARTCHAR heart +ENCODING 9829 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +6C +FE +FE +FE +FE +7C +7C +38 +10 +ENDCHAR +STARTCHAR diamond +ENCODING 9830 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +10 +38 +7C +7C +FE +7C +7C +38 +10 +ENDCHAR +STARTCHAR uni2667 +ENCODING 9831 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +10 +28 +28 +54 +BA +BA +54 +10 +38 +ENDCHAR +STARTCHAR uni2669 +ENCODING 9833 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 11 1 0 +BITMAP +20 +20 +20 +20 +20 +20 +20 +60 +E0 +E0 +40 +ENDCHAR +STARTCHAR musicalnote +ENCODING 9834 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +30 +28 +20 +20 +20 +20 +60 +E0 +E0 +40 +ENDCHAR +STARTCHAR musicalnotedbl +ENCODING 9835 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 12 0 -1 +BITMAP +30 +3C +2C +24 +24 +24 +64 +E4 +EC +5C +1C +08 +ENDCHAR +STARTCHAR uni266C +ENCODING 9836 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 12 0 -1 +BITMAP +30 +3C +2C +34 +3C +2C +64 +E4 +EC +5C +1C +08 +ENDCHAR +STARTCHAR uni266D +ENCODING 9837 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +80 +80 +80 +B0 +C8 +88 +88 +90 +E0 +ENDCHAR +STARTCHAR uni266E +ENCODING 9838 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +80 +80 +98 +A8 +C8 +88 +98 +A8 +C8 +08 +08 +ENDCHAR +STARTCHAR uni266F +ENCODING 9839 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -1 +BITMAP +10 +50 +58 +70 +D0 +50 +58 +70 +D0 +50 +40 +ENDCHAR +STARTCHAR uni2680 +ENCODING 9856 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +FE +82 +82 +82 +92 +82 +82 +82 +FE +ENDCHAR +STARTCHAR uni2681 +ENCODING 9857 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +FE +82 +8A +82 +82 +82 +A2 +82 +FE +ENDCHAR +STARTCHAR uni2682 +ENCODING 9858 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +FE +82 +8A +82 +92 +82 +A2 +82 +FE +ENDCHAR +STARTCHAR uni2683 +ENCODING 9859 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +FE +82 +AA +82 +82 +82 +AA +82 +FE +ENDCHAR +STARTCHAR uni2684 +ENCODING 9860 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +FE +82 +AA +82 +92 +82 +AA +82 +FE +ENDCHAR +STARTCHAR uni2685 +ENCODING 9861 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +FE +82 +AA +82 +AA +82 +AA +82 +FE +ENDCHAR +STARTCHAR uni2690 +ENCODING 9872 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +FE +C4 +C8 +C4 +FE +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2691 +ENCODING 9873 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +FE +FC +F8 +FC +FE +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni271D +ENCODING 10013 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +30 +30 +FC +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2776 +ENCODING 10102 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +FE +EE +CE +EE +EE +EE +EE +FE +7C +ENDCHAR +STARTCHAR uni2777 +ENCODING 10103 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +FE +CE +F6 +F6 +EE +DE +C6 +FE +7C +ENDCHAR +STARTCHAR uni2778 +ENCODING 10104 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +FE +CE +F6 +CE +F6 +F6 +CE +FE +7C +ENDCHAR +STARTCHAR uni2779 +ENCODING 10105 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +FE +F6 +E6 +D6 +C6 +F6 +F6 +FE +7C +ENDCHAR +STARTCHAR uni277A +ENCODING 10106 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +FE +C6 +DE +CE +F6 +F6 +CE +FE +7C +ENDCHAR +STARTCHAR uni277B +ENCODING 10107 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +FE +E6 +DE +CE +D6 +D6 +EE +FE +7C +ENDCHAR +STARTCHAR uni277C +ENCODING 10108 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +FE +C6 +F6 +F6 +EE +EE +EE +FE +7C +ENDCHAR +STARTCHAR uni277D +ENCODING 10109 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +FE +EE +D6 +EE +D6 +D6 +EE +FE +7C +ENDCHAR +STARTCHAR uni277E +ENCODING 10110 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +FE +EE +D6 +D6 +E6 +F6 +CE +FE +7C +ENDCHAR +STARTCHAR uni277F +ENCODING 10111 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +FE +D6 +8A +CA +CA +CA +D6 +FE +7C +ENDCHAR +STARTCHAR uni2780 +ENCODING 10112 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +82 +92 +B2 +92 +92 +92 +92 +82 +7C +ENDCHAR +STARTCHAR uni2781 +ENCODING 10113 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +82 +B2 +8A +8A +92 +A2 +BA +82 +7C +ENDCHAR +STARTCHAR uni2782 +ENCODING 10114 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +82 +B2 +8A +B2 +8A +8A +B2 +82 +7C +ENDCHAR +STARTCHAR uni2783 +ENCODING 10115 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +82 +8A +9A +AA +BA +8A +8A +82 +7C +ENDCHAR +STARTCHAR uni2784 +ENCODING 10116 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +82 +BA +A2 +B2 +8A +8A +B2 +82 +7C +ENDCHAR +STARTCHAR uni2785 +ENCODING 10117 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +82 +9A +A2 +B2 +AA +AA +92 +82 +7C +ENDCHAR +STARTCHAR uni2786 +ENCODING 10118 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +82 +BA +8A +8A +92 +92 +92 +82 +7C +ENDCHAR +STARTCHAR uni2787 +ENCODING 10119 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +82 +92 +AA +92 +AA +AA +92 +82 +7C +ENDCHAR +STARTCHAR uni2788 +ENCODING 10120 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +82 +92 +AA +AA +9A +8A +B2 +82 +7C +ENDCHAR +STARTCHAR uni2789 +ENCODING 10121 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +82 +AA +F6 +B6 +B6 +B6 +AA +82 +7C +ENDCHAR +STARTCHAR uni278A +ENCODING 10122 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +FE +EE +CE +EE +EE +EE +EE +FE +7C +ENDCHAR +STARTCHAR uni278B +ENCODING 10123 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +FE +CE +F6 +F6 +EE +DE +C6 +FE +7C +ENDCHAR +STARTCHAR uni278C +ENCODING 10124 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +FE +CE +F6 +CE +F6 +F6 +CE +FE +7C +ENDCHAR +STARTCHAR uni278D +ENCODING 10125 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +FE +F6 +E6 +D6 +C6 +F6 +F6 +FE +7C +ENDCHAR +STARTCHAR uni278E +ENCODING 10126 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +FE +C6 +DE +CE +F6 +F6 +CE +FE +7C +ENDCHAR +STARTCHAR uni278F +ENCODING 10127 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +FE +E6 +DE +CE +D6 +D6 +EE +FE +7C +ENDCHAR +STARTCHAR uni2790 +ENCODING 10128 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +FE +C6 +F6 +F6 +EE +EE +EE +FE +7C +ENDCHAR +STARTCHAR uni2791 +ENCODING 10129 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +FE +EE +D6 +EE +D6 +D6 +EE +FE +7C +ENDCHAR +STARTCHAR uni2792 +ENCODING 10130 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +FE +EE +D6 +D6 +E6 +F6 +CE +FE +7C +ENDCHAR +STARTCHAR uni2793 +ENCODING 10131 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +FE +D6 +8A +CA +CA +CA +D6 +FE +7C +ENDCHAR +STARTCHAR uni2794 +ENCODING 10132 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +10 +08 +FC +08 +10 +ENDCHAR +STARTCHAR uni2795 +ENCODING 10133 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2796 +ENCODING 10134 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 1 1 4 +BITMAP +F8 +ENDCHAR +STARTCHAR uni2797 +ENCODING 10135 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +20 +00 +F8 +00 +20 +ENDCHAR +STARTCHAR uni2798 +ENCODING 10136 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 5 1 0 +BITMAP +80 +48 +28 +18 +78 +ENDCHAR +STARTCHAR uni2799 +ENCODING 10137 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +20 +10 +F8 +10 +20 +ENDCHAR +STARTCHAR uni279A +ENCODING 10138 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 5 1 0 +BITMAP +78 +18 +28 +48 +80 +ENDCHAR +STARTCHAR uni279B +ENCODING 10139 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +10 +08 +FC +08 +10 +ENDCHAR +STARTCHAR uni279C +ENCODING 10140 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +10 +08 +FC +08 +10 +ENDCHAR +STARTCHAR uni279D +ENCODING 10141 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +10 +18 +FC +18 +10 +ENDCHAR +STARTCHAR uni279E +ENCODING 10142 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +10 +18 +FC +18 +10 +ENDCHAR +STARTCHAR uni279F +ENCODING 10143 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +10 +18 +BC +18 +10 +ENDCHAR +STARTCHAR uni27A0 +ENCODING 10144 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +10 +18 +BC +BE +BC +18 +10 +ENDCHAR +STARTCHAR uni27A1 +ENCODING 10145 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +10 +18 +FC +FE +FC +18 +10 +ENDCHAR +STARTCHAR uni29CE +ENCODING 10702 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 0 0 +BITMAP +18 +68 +88 +68 +18 +C0 +B0 +88 +B0 +C0 +ENDCHAR +STARTCHAR uni29CF +ENCODING 10703 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 3 +BITMAP +28 +68 +A8 +68 +28 +ENDCHAR +STARTCHAR uni29D0 +ENCODING 10704 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 3 +BITMAP +A0 +B0 +A8 +B0 +A0 +ENDCHAR +STARTCHAR uni29D1 +ENCODING 10705 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 3 +BITMAP +88 +D8 +E8 +D8 +88 +ENDCHAR +STARTCHAR uni29D2 +ENCODING 10706 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 3 +BITMAP +88 +D8 +B8 +D8 +88 +ENDCHAR +STARTCHAR uni29D3 +ENCODING 10707 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 3 +BITMAP +88 +D8 +F8 +D8 +88 +ENDCHAR +STARTCHAR uni29D4 +ENCODING 10708 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 3 +BITMAP +88 +D0 +E0 +D0 +88 +ENDCHAR +STARTCHAR uni29D5 +ENCODING 10709 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 3 +BITMAP +88 +58 +38 +58 +88 +ENDCHAR +STARTCHAR uni29D6 +ENCODING 10710 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 3 +BITMAP +F8 +50 +20 +50 +F8 +ENDCHAR +STARTCHAR uni29D7 +ENCODING 10711 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 3 +BITMAP +F8 +70 +20 +70 +F8 +ENDCHAR +STARTCHAR uni2A00 +ENCODING 10752 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +70 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2A01 +ENCODING 10753 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +70 +A8 +F8 +A8 +70 +ENDCHAR +STARTCHAR uni2A02 +ENCODING 10754 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +70 +D8 +A8 +D8 +70 +ENDCHAR +STARTCHAR uni2A03 +ENCODING 10755 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +88 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2A04 +ENCODING 10756 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +A8 +F8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2A05 +ENCODING 10757 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni2A06 +ENCODING 10758 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +CC +CC +CC +CC +FC +ENDCHAR +STARTCHAR uni2A09 +ENCODING 10761 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +CC +78 +30 +78 +CC +ENDCHAR +STARTCHAR uni2B00 +ENCODING 11008 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +78 +28 +58 +A8 +C0 +ENDCHAR +STARTCHAR uni2B01 +ENCODING 11009 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +F0 +A0 +D0 +A8 +18 +ENDCHAR +STARTCHAR uni2B02 +ENCODING 11010 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +C0 +A8 +58 +28 +78 +ENDCHAR +STARTCHAR uni2B03 +ENCODING 11011 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +18 +A8 +D0 +A0 +F0 +ENDCHAR +STARTCHAR uni2B04 +ENCODING 11012 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 2 +BITMAP +28 +7C +82 +7C +28 +ENDCHAR +STARTCHAR uni2B05 +ENCODING 11013 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +10 +30 +7E +FE +7E +30 +10 +ENDCHAR +STARTCHAR uni2B06 +ENCODING 11014 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +10 +38 +7C +FE +38 +38 +38 +ENDCHAR +STARTCHAR uni2B07 +ENCODING 11015 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +38 +38 +FE +7C +38 +10 +ENDCHAR +STARTCHAR uni2B08 +ENCODING 11016 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +7E +3E +1E +3E +76 +E2 +C0 +ENDCHAR +STARTCHAR uni2B09 +ENCODING 11017 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FC +F8 +F0 +F8 +DC +8E +06 +ENDCHAR +STARTCHAR uni2B0A +ENCODING 11018 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +C0 +E2 +76 +3E +1E +3E +7E +ENDCHAR +STARTCHAR uni2B0B +ENCODING 11019 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +06 +8E +DC +F8 +F0 +F8 +FC +ENDCHAR +STARTCHAR uni2B0C +ENCODING 11020 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 2 +BITMAP +28 +7C +FE +7C +28 +ENDCHAR +STARTCHAR uni2B0D +ENCODING 11021 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +20 +70 +F8 +70 +70 +70 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2B12 +ENCODING 11026 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +FE +FE +FE +82 +82 +FE +ENDCHAR +STARTCHAR uni2B13 +ENCODING 11027 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +82 +82 +FE +FE +FE +FE +ENDCHAR +STARTCHAR uni2B14 +ENCODING 11028 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +FE +BE +9E +8E +86 +FE +ENDCHAR +STARTCHAR uni2B15 +ENCODING 11029 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +C2 +E2 +F2 +FA +FE +FE +ENDCHAR +STARTCHAR uni2B16 +ENCODING 11030 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +10 +38 +74 +F2 +74 +38 +10 +ENDCHAR +STARTCHAR uni2B17 +ENCODING 11031 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +10 +38 +5C +9E +5C +38 +10 +ENDCHAR +STARTCHAR uni2B18 +ENCODING 11032 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +10 +38 +7C +FE +44 +28 +10 +ENDCHAR +STARTCHAR uni2B19 +ENCODING 11033 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +10 +28 +44 +FE +7C +38 +10 +ENDCHAR +STARTCHAR uni2B1A +ENCODING 11034 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +AA +00 +82 +00 +82 +00 +AA +ENDCHAR +STARTCHAR uni2B1B +ENCODING 11035 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +FE +FE +FE +FE +FE +FE +ENDCHAR +STARTCHAR uni2B1C +ENCODING 11036 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +82 +82 +82 +82 +82 +FE +ENDCHAR +STARTCHAR uni2B2C +ENCODING 11052 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 2 +BITMAP +7C +FE +FE +FE +7C +ENDCHAR +STARTCHAR uni2B2D +ENCODING 11053 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 5 0 2 +BITMAP +7C +82 +82 +82 +7C +ENDCHAR +STARTCHAR uni2B2E +ENCODING 11054 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 7 1 1 +BITMAP +70 +F8 +F8 +F8 +F8 +F8 +70 +ENDCHAR +STARTCHAR uni2B2F +ENCODING 11055 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 7 1 1 +BITMAP +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2C60 +ENCODING 11360 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +60 +60 +60 +F0 +60 +F0 +60 +60 +7C +ENDCHAR +STARTCHAR uni2C61 +ENCODING 11361 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 9 1 0 +BITMAP +F0 +60 +60 +F0 +60 +F0 +60 +60 +F0 +ENDCHAR +STARTCHAR uni2C62 +ENCODING 11362 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +30 +30 +30 +74 +B8 +30 +30 +30 +3C +ENDCHAR +STARTCHAR uni2C63 +ENCODING 11363 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +6C +FC +6C +78 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni2C64 +ENCODING 11364 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 -1 +BITMAP +F8 +CC +CC +CC +F8 +E0 +F0 +D8 +CC +60 +ENDCHAR +STARTCHAR uniA730 +ENCODING 42800 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 6 0 1 +BITMAP +F8 +80 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uniA731 +ENCODING 42801 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 6 0 1 +BITMAP +78 +80 +70 +08 +08 +F0 +ENDCHAR +STARTCHAR uniFE7C +ENCODING 65148 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 4 0 7 +BITMAP +88 +A8 +B0 +40 +ENDCHAR +STARTCHAR uniFE7D +ENCODING 65149 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +88 +A8 +B0 +40 +00 +00 +00 +00 +00 +00 +FC +ENDCHAR +STARTCHAR uniFE7E +ENCODING 65150 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 3 1 9 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR uniFE7F +ENCODING 65151 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +20 +50 +20 +00 +00 +00 +00 +00 +00 +00 +FC +ENDCHAR +STARTCHAR uniFE80 +ENCODING 65152 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 5 2 2 +BITMAP +60 +80 +80 +60 +C0 +ENDCHAR +STARTCHAR uniFE81 +ENCODING 65153 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 11 1 0 +BITMAP +50 +A0 +00 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uniFE82 +ENCODING 65154 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +A0 +00 +40 +40 +40 +40 +40 +40 +40 +38 +ENDCHAR +STARTCHAR uniFE83 +ENCODING 65155 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 11 1 0 +BITMAP +60 +80 +E0 +00 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uniFE84 +ENCODING 65156 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +60 +80 +E0 +00 +40 +40 +40 +40 +40 +40 +38 +ENDCHAR +STARTCHAR uniFE85 +ENCODING 65157 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 0 -2 +BITMAP +30 +40 +70 +00 +30 +48 +48 +48 +38 +08 +F0 +ENDCHAR +STARTCHAR uniFE86 +ENCODING 65158 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +30 +40 +70 +00 +30 +48 +48 +4C +3C +08 +F0 +ENDCHAR +STARTCHAR uniFE87 +ENCODING 65159 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 11 1 -2 +BITMAP +40 +40 +40 +40 +40 +40 +00 +00 +60 +80 +E0 +ENDCHAR +STARTCHAR uniFE88 +ENCODING 65160 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +00 +10 +64 +80 +E0 +ENDCHAR +STARTCHAR uniFE89 +ENCODING 65161 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +60 +80 +E0 +08 +14 +50 +00 +88 +88 +70 +ENDCHAR +STARTCHAR uniFE8A +ENCODING 65162 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +60 +80 +E0 +00 +40 +84 +94 +90 +60 +ENDCHAR +STARTCHAR uniFE8B +ENCODING 65163 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 9 0 0 +BITMAP +30 +40 +70 +00 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uniFE8C +ENCODING 65164 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +30 +40 +70 +00 +20 +20 +20 +20 +DC +ENDCHAR +STARTCHAR uniFE8D +ENCODING 65165 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 9 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uniFE8E +ENCODING 65166 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 9 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +70 +ENDCHAR +STARTCHAR uniFE8F +ENCODING 65167 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 4 0 1 +BITMAP +10 +88 +88 +70 +ENDCHAR +STARTCHAR uniFE90 +ENCODING 65168 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 4 0 1 +BITMAP +10 +88 +88 +74 +ENDCHAR +STARTCHAR uniFE91 +ENCODING 65169 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 4 0 1 +BITMAP +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uniFE92 +ENCODING 65170 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 4 0 1 +BITMAP +20 +20 +20 +DC +ENDCHAR +STARTCHAR uniFE93 +ENCODING 65171 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 0 0 +BITMAP +50 +00 +60 +90 +88 +88 +00 +70 +ENDCHAR +STARTCHAR uniFE94 +ENCODING 65172 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 0 0 +BITMAP +50 +00 +30 +48 +88 +88 +00 +70 +ENDCHAR +STARTCHAR uniFE95 +ENCODING 65173 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 6 0 1 +BITMAP +50 +00 +10 +88 +88 +70 +ENDCHAR +STARTCHAR uniFE96 +ENCODING 65174 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +50 +00 +10 +88 +88 +74 +ENDCHAR +STARTCHAR uniFE97 +ENCODING 65175 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 6 0 1 +BITMAP +50 +00 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uniFE98 +ENCODING 65176 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +50 +00 +20 +20 +20 +DC +ENDCHAR +STARTCHAR uniFE99 +ENCODING 65177 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +20 +00 +50 +00 +10 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uniFE9A +ENCODING 65178 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +20 +00 +50 +00 +10 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uniFE9B +ENCODING 65179 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 9 0 0 +BITMAP +20 +00 +50 +00 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uniFE9C +ENCODING 65180 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +20 +00 +50 +00 +20 +20 +20 +20 +DC +ENDCHAR +STARTCHAR uniFE9D +ENCODING 65181 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +40 +80 +A0 +80 +00 +40 +38 +ENDCHAR +STARTCHAR uniFE9E +ENCODING 65182 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +F8 +30 +50 +88 +A4 +80 +00 +40 +38 +ENDCHAR +STARTCHAR uniFE9F +ENCODING 65183 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 4 0 1 +BITMAP +70 +08 +30 +C0 +ENDCHAR +STARTCHAR uniFEA0 +ENCODING 65184 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 4 0 1 +BITMAP +70 +08 +38 +C4 +ENDCHAR +STARTCHAR uniFEA1 +ENCODING 65185 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +40 +80 +80 +80 +00 +40 +38 +ENDCHAR +STARTCHAR uniFEA2 +ENCODING 65186 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +F8 +30 +50 +88 +84 +80 +00 +40 +38 +ENDCHAR +STARTCHAR uniFEA3 +ENCODING 65187 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 4 0 1 +BITMAP +70 +08 +30 +C0 +ENDCHAR +STARTCHAR uniFEA4 +ENCODING 65188 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 4 0 1 +BITMAP +70 +08 +38 +C4 +ENDCHAR +STARTCHAR uniFEA5 +ENCODING 65189 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 0 -2 +BITMAP +20 +00 +F8 +20 +40 +80 +80 +80 +80 +40 +38 +ENDCHAR +STARTCHAR uniFEA6 +ENCODING 65190 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 0 -2 +BITMAP +20 +00 +F8 +30 +50 +88 +80 +80 +80 +40 +38 +ENDCHAR +STARTCHAR uniFEA7 +ENCODING 65191 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 6 0 1 +BITMAP +20 +00 +70 +08 +30 +C0 +ENDCHAR +STARTCHAR uniFEA8 +ENCODING 65192 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +20 +00 +70 +08 +38 +C4 +ENDCHAR +STARTCHAR uniFEA9 +ENCODING 65193 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 5 1 1 +BITMAP +20 +10 +10 +10 +E0 +ENDCHAR +STARTCHAR uniFEAA +ENCODING 65194 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +20 +10 +10 +10 +E8 +ENDCHAR +STARTCHAR uniFEAB +ENCODING 65195 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 8 1 0 +BITMAP +40 +00 +20 +10 +10 +10 +00 +E0 +ENDCHAR +STARTCHAR uniFEAC +ENCODING 65196 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 8 1 0 +BITMAP +40 +00 +20 +10 +10 +10 +00 +E0 +ENDCHAR +STARTCHAR uniFEAD +ENCODING 65197 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 0 +BITMAP +08 +08 +08 +10 +E0 +ENDCHAR +STARTCHAR uniFEAE +ENCODING 65198 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 0 +BITMAP +08 +08 +08 +14 +E0 +ENDCHAR +STARTCHAR uniFEAF +ENCODING 65199 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 0 -1 +BITMAP +08 +00 +08 +08 +08 +00 +00 +E0 +ENDCHAR +STARTCHAR uniFEB0 +ENCODING 65200 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 8 0 -1 +BITMAP +08 +00 +08 +08 +08 +04 +00 +E0 +ENDCHAR +STARTCHAR uniFEB1 +ENCODING 65201 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 8 0 -2 +BITMAP +04 +54 +54 +54 +28 +A0 +00 +40 +ENDCHAR +STARTCHAR uniFEB2 +ENCODING 65202 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 8 0 -2 +BITMAP +04 +54 +54 +54 +28 +A0 +00 +40 +ENDCHAR +STARTCHAR uniFEB3 +ENCODING 65203 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 1 +BITMAP +04 +54 +54 +54 +A8 +ENDCHAR +STARTCHAR uniFEB4 +ENCODING 65204 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 1 +BITMAP +04 +54 +54 +54 +A8 +ENDCHAR +STARTCHAR uniFEB5 +ENCODING 65205 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +20 +00 +50 +00 +54 +54 +54 +54 +20 +A0 +40 +ENDCHAR +STARTCHAR uniFEB6 +ENCODING 65206 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +20 +00 +50 +00 +54 +54 +54 +54 +20 +A0 +40 +ENDCHAR +STARTCHAR uniFEB7 +ENCODING 65207 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +20 +00 +50 +00 +54 +54 +54 +54 +A0 +ENDCHAR +STARTCHAR uniFEB8 +ENCODING 65208 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +20 +00 +50 +00 +54 +54 +54 +54 +A0 +ENDCHAR +STARTCHAR uniFEB9 +ENCODING 65209 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 -1 +BITMAP +28 +34 +A4 +B8 +A0 +40 +ENDCHAR +STARTCHAR uniFEBA +ENCODING 65210 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 -1 +BITMAP +28 +34 +A4 +BC +A0 +40 +ENDCHAR +STARTCHAR uniFEBB +ENCODING 65211 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 4 0 1 +BITMAP +48 +54 +64 +B8 +ENDCHAR +STARTCHAR uniFEBC +ENCODING 65212 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 4 0 1 +BITMAP +48 +54 +64 +BC +ENDCHAR +STARTCHAR uniFEBD +ENCODING 65213 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +20 +00 +28 +34 +A4 +B8 +B0 +A0 +40 +ENDCHAR +STARTCHAR uniFEBE +ENCODING 65214 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +20 +00 +28 +34 +A4 +BC +B0 +A0 +40 +ENDCHAR +STARTCHAR uniFEBF +ENCODING 65215 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +20 +00 +48 +54 +64 +B8 +ENDCHAR +STARTCHAR uniFEC0 +ENCODING 65216 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +20 +00 +48 +54 +64 +BC +ENDCHAR +STARTCHAR uniFEC1 +ENCODING 65217 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +40 +40 +40 +40 +50 +68 +68 +68 +F0 +ENDCHAR +STARTCHAR uniFEC2 +ENCODING 65218 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +40 +40 +40 +40 +50 +68 +68 +68 +F0 +ENDCHAR +STARTCHAR uniFEC3 +ENCODING 65219 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +40 +40 +40 +40 +50 +68 +68 +68 +F0 +ENDCHAR +STARTCHAR uniFEC4 +ENCODING 65220 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +40 +40 +40 +40 +50 +68 +68 +68 +F0 +ENDCHAR +STARTCHAR uniFEC5 +ENCODING 65221 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +40 +40 +50 +40 +50 +68 +68 +68 +F0 +ENDCHAR +STARTCHAR uniFEC6 +ENCODING 65222 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +40 +40 +50 +40 +50 +68 +68 +68 +F0 +ENDCHAR +STARTCHAR uniFEC7 +ENCODING 65223 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +40 +40 +50 +40 +50 +68 +68 +68 +F0 +ENDCHAR +STARTCHAR uniFEC8 +ENCODING 65224 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +40 +40 +50 +40 +50 +68 +68 +68 +F0 +ENDCHAR +STARTCHAR uniFEC9 +ENCODING 65225 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 -2 +BITMAP +60 +80 +80 +70 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR uniFECA +ENCODING 65226 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 8 0 -2 +BITMAP +60 +90 +60 +90 +8C +80 +00 +70 +ENDCHAR +STARTCHAR uniFECB +ENCODING 65227 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 6 0 1 +BITMAP +30 +40 +40 +38 +20 +C0 +ENDCHAR +STARTCHAR uniFECC +ENCODING 65228 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +20 +50 +50 +20 +50 +8C +ENDCHAR +STARTCHAR uniFECD +ENCODING 65229 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 0 -2 +BITMAP +40 +00 +60 +80 +80 +70 +00 +80 +80 +88 +70 +ENDCHAR +STARTCHAR uniFECE +ENCODING 65230 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 -2 +BITMAP +20 +00 +60 +90 +60 +90 +80 +84 +80 +70 +ENDCHAR +STARTCHAR uniFECF +ENCODING 65231 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +40 +00 +30 +40 +40 +38 +30 +20 +C0 +ENDCHAR +STARTCHAR uniFED0 +ENCODING 65232 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +20 +00 +20 +50 +50 +20 +00 +40 +84 +ENDCHAR +STARTCHAR uniFED1 +ENCODING 65233 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 0 -1 +BITMAP +10 +00 +10 +28 +98 +88 +00 +70 +ENDCHAR +STARTCHAR uniFED2 +ENCODING 65234 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 8 0 -1 +BITMAP +10 +00 +10 +28 +98 +8C +00 +70 +ENDCHAR +STARTCHAR uniFED3 +ENCODING 65235 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 9 0 -1 +BITMAP +20 +00 +20 +50 +30 +10 +00 +20 +C0 +ENDCHAR +STARTCHAR uniFED4 +ENCODING 65236 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +20 +00 +20 +50 +50 +20 +00 +CC +ENDCHAR +STARTCHAR uniFED5 +ENCODING 65237 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 0 -1 +BITMAP +28 +00 +10 +28 +98 +88 +00 +70 +ENDCHAR +STARTCHAR uniFED6 +ENCODING 65238 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 8 0 -1 +BITMAP +28 +00 +10 +28 +98 +8C +00 +70 +ENDCHAR +STARTCHAR uniFED7 +ENCODING 65239 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 9 0 -1 +BITMAP +50 +00 +20 +50 +30 +10 +00 +20 +C0 +ENDCHAR +STARTCHAR uniFED8 +ENCODING 65240 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +50 +00 +20 +50 +50 +20 +00 +CC +ENDCHAR +STARTCHAR uniFED9 +ENCODING 65241 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +28 +48 +28 +C8 +08 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uniFEDA +ENCODING 65242 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +28 +48 +28 +C8 +08 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uniFEDB +ENCODING 65243 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 0 0 +BITMAP +08 +30 +40 +40 +20 +10 +00 +08 +08 +F0 +ENDCHAR +STARTCHAR uniFEDC +ENCODING 65244 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 0 0 +BITMAP +08 +30 +40 +40 +20 +10 +00 +08 +08 +F0 +ENDCHAR +STARTCHAR uniFEDD +ENCODING 65245 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +08 +48 +88 +88 +70 +ENDCHAR +STARTCHAR uniFEDE +ENCODING 65246 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +08 +4C +8C +88 +70 +ENDCHAR +STARTCHAR uniFEDF +ENCODING 65247 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 9 0 0 +BITMAP +10 +10 +10 +10 +10 +10 +10 +10 +E0 +ENDCHAR +STARTCHAR uniFEE0 +ENCODING 65248 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +10 +10 +10 +10 +10 +10 +10 +10 +E4 +ENDCHAR +STARTCHAR uniFEE1 +ENCODING 65249 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 6 0 -1 +BITMAP +30 +48 +48 +B0 +80 +80 +ENDCHAR +STARTCHAR uniFEE2 +ENCODING 65250 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 -1 +BITMAP +30 +48 +48 +B4 +80 +80 +ENDCHAR +STARTCHAR uniFEE3 +ENCODING 65251 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 4 0 1 +BITMAP +30 +48 +48 +B0 +ENDCHAR +STARTCHAR uniFEE4 +ENCODING 65252 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 4 0 1 +BITMAP +30 +48 +48 +B4 +ENDCHAR +STARTCHAR uniFEE5 +ENCODING 65253 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 0 -1 +BITMAP +20 +00 +10 +88 +88 +88 +00 +70 +ENDCHAR +STARTCHAR uniFEE6 +ENCODING 65254 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 8 0 -1 +BITMAP +20 +00 +10 +88 +88 +8C +00 +70 +ENDCHAR +STARTCHAR uniFEE7 +ENCODING 65255 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 6 0 1 +BITMAP +20 +00 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uniFEE8 +ENCODING 65256 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +20 +00 +20 +20 +20 +DC +ENDCHAR +STARTCHAR uniFEE9 +ENCODING 65257 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 1 +BITMAP +60 +90 +88 +88 +70 +ENDCHAR +STARTCHAR uniFEEA +ENCODING 65258 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 1 +BITMAP +30 +48 +88 +88 +74 +ENDCHAR +STARTCHAR uniFEEB +ENCODING 65259 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 0 0 +BITMAP +E0 +10 +48 +A8 +A8 +48 +00 +90 +ENDCHAR +STARTCHAR uniFEEC +ENCODING 65260 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 -1 +BITMAP +10 +28 +48 +FC +4C +30 +ENDCHAR +STARTCHAR uniFEED +ENCODING 65261 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 6 0 -1 +BITMAP +30 +48 +48 +38 +08 +F0 +ENDCHAR +STARTCHAR uniFEEE +ENCODING 65262 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 -1 +BITMAP +30 +48 +48 +3C +0C +F0 +ENDCHAR +STARTCHAR uniFEEF +ENCODING 65263 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 0 +BITMAP +08 +14 +90 +88 +70 +ENDCHAR +STARTCHAR uniFEF0 +ENCODING 65264 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 0 +BITMAP +08 +14 +94 +94 +60 +ENDCHAR +STARTCHAR uniFEF1 +ENCODING 65265 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +08 +14 +50 +88 +88 +70 +00 +00 +50 +ENDCHAR +STARTCHAR uniFEF2 +ENCODING 65266 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 -1 +BITMAP +48 +94 +94 +60 +00 +40 +ENDCHAR +STARTCHAR uniFEF3 +ENCODING 65267 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 6 0 -1 +BITMAP +20 +20 +20 +C0 +00 +40 +ENDCHAR +STARTCHAR uniFEF4 +ENCODING 65268 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 -1 +BITMAP +20 +20 +20 +DC +00 +40 +ENDCHAR +STARTCHAR uniFEF5 +ENCODING 65269 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 0 0 +BITMAP +50 +A0 +08 +48 +48 +28 +28 +08 +18 +18 +70 +ENDCHAR +STARTCHAR uniFEF6 +ENCODING 65270 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 0 0 +BITMAP +50 +A0 +08 +48 +48 +28 +28 +08 +18 +18 +70 +ENDCHAR +STARTCHAR uniFEF7 +ENCODING 65271 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 0 0 +BITMAP +60 +80 +E8 +08 +48 +28 +28 +08 +18 +18 +70 +ENDCHAR +STARTCHAR uniFEF8 +ENCODING 65272 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 0 0 +BITMAP +60 +80 +E8 +08 +48 +28 +28 +08 +18 +18 +70 +ENDCHAR +STARTCHAR uniFEF9 +ENCODING 65273 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 0 -2 +BITMAP +08 +48 +48 +28 +28 +18 +18 +98 +70 +80 +E0 +ENDCHAR +STARTCHAR uniFEFA +ENCODING 65274 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 0 -2 +BITMAP +08 +48 +48 +28 +28 +18 +18 +98 +70 +80 +E0 +ENDCHAR +STARTCHAR uniFEFB +ENCODING 65275 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 9 1 0 +BITMAP +10 +90 +90 +50 +50 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR uniFEFC +ENCODING 65276 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 9 1 0 +BITMAP +10 +90 +90 +50 +50 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR uniFFFD +ENCODING 65533 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +88 +F8 +ENDCHAR +ENDFONT diff --git a/app/src/gambas3/font/GambasBold-16.bdf b/app/src/gambas3/font/GambasBold-16.bdf new file mode 100644 index 00000000..10b97866 --- /dev/null +++ b/app/src/gambas3/font/GambasBold-16.bdf @@ -0,0 +1,47749 @@ +STARTFONT 2.1 +FONT -xos4-Gambas-Bold-R-Normal--16-150-75-75-P-89-ISO10646-1 +SIZE 15 75 75 +FONTBOUNDINGBOX 9 18 0 -3 +COMMENT "Generated by fontforge, http://fontforge.sourceforge.net" +COMMENT "Copyright (C) 2012 Benoit Minisini" +STARTPROPERTIES 34 +FOUNDRY "xos4" +FAMILY_NAME "Gambas" +WEIGHT_NAME "Bold" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 16 +POINT_SIZE 150 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 89 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +FONTNAME_REGISTRY "" +CHARSET_COLLECTIONS "ASCII ISOLatin1Encoding ISO8859-2 ISO8859-5 ISO8859-7 ISO8859-9 ISO8859-6 ISO8859-4 ISO10646-1" +FONT_NAME "GambasBold" +FACE_NAME "Gambas Bold" +COPYRIGHT "Copyright (C) 2012 Benoit Minisini" +FONT_VERSION "001.000" +FONT_ASCENT 13 +FONT_DESCENT 3 +UNDERLINE_POSITION -2 +UNDERLINE_THICKNESS 1 +X_HEIGHT 7 +CAP_HEIGHT 10 +RAW_ASCENT 846 +RAW_DESCENT 154 +NORM_SPACE 9 +RELATIVE_WEIGHT 50 +RELATIVE_SETWIDTH 50 +FIGURE_WIDTH 9 +AVG_LOWERCASE_WIDTH 89 +AVG_UPPERCASE_WIDTH 90 +ENDPROPERTIES +CHARS 2765 +STARTCHAR uni0000 +ENCODING 0 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +AA +00 +82 +00 +82 +00 +82 +00 +82 +00 +AA +ENDCHAR +STARTCHAR space +ENCODING 32 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 8 -2 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 11 3 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 3 2 9 +BITMAP +D8 +D8 +D8 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +6C +6C +6C +FE +6C +6C +6C +FE +6C +6C +6C +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -1 +BITMAP +30 +30 +7C +C0 +C0 +C0 +78 +0C +0C +0C +F8 +30 +30 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 12 0 0 +BITMAP +7300 +DB00 +DE00 +7600 +0C00 +0C00 +1800 +1800 +3700 +3D80 +6D80 +6700 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +38 +6C +6C +6C +38 +30 +73 +DE +CC +DE +73 +ENDCHAR +STARTCHAR quotesingle +ENCODING 39 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 3 3 9 +BITMAP +C0 +C0 +C0 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 13 2 -1 +BITMAP +30 +60 +60 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +60 +60 +30 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 13 2 -1 +BITMAP +C0 +60 +60 +30 +30 +30 +30 +30 +30 +30 +60 +60 +C0 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 7 0 2 +BITMAP +18 +DB +7E +18 +7E +DB +18 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 7 0 2 +BITMAP +18 +18 +18 +FF +18 +18 +18 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 4 3 -2 +BITMAP +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR hyphen +ENCODING 45 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 1 0 5 +BITMAP +FF +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 2 3 0 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +06 +06 +0C +0C +18 +18 +30 +30 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7C +C6 +C6 +CE +DE +F6 +E6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +30 +70 +F0 +30 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FC +06 +06 +06 +0C +18 +30 +60 +C0 +C0 +FE +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FC +06 +06 +06 +06 +3C +06 +06 +06 +06 +FC +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +1C +1C +3C +3C +6C +6C +CC +CC +FE +0C +0C +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FE +C0 +C0 +C0 +F8 +0C +06 +06 +06 +0C +F8 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +3C +60 +C0 +C0 +FC +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FE +06 +06 +0C +0C +18 +18 +30 +30 +60 +60 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7C +C6 +C6 +C6 +C6 +7C +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7C +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +0C +78 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 7 3 0 +BITMAP +C0 +C0 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 9 3 -2 +BITMAP +C0 +C0 +00 +00 +00 +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 1 1 +BITMAP +0C +18 +30 +60 +C0 +60 +30 +18 +0C +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 4 1 4 +BITMAP +FC +00 +00 +FC +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 2 1 +BITMAP +C0 +60 +30 +18 +0C +18 +30 +60 +C0 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7C +C6 +06 +06 +0C +18 +30 +30 +00 +30 +30 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +3C +66 +C6 +CE +DE +DE +DE +CE +C0 +60 +3E +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7C +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FC +C6 +C6 +C6 +C6 +FC +C6 +C6 +C6 +C6 +FC +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7E +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +7E +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +F8 +CC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +CC +F8 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FE +C0 +C0 +C0 +C0 +F8 +C0 +C0 +C0 +C0 +FE +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FE +C0 +C0 +C0 +C0 +FC +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7E +C0 +C0 +C0 +C0 +CE +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +C6 +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 0 0 +BITMAP +FC +30 +30 +30 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +3C +18 +18 +18 +18 +18 +18 +18 +18 +18 +F0 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +C6 +CC +D8 +F0 +E0 +C0 +E0 +F0 +D8 +CC +C6 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FE +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +C3 +C3 +E7 +E7 +FF +DB +DB +C3 +C3 +C3 +C3 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +C6 +C6 +E6 +E6 +F6 +D6 +DE +CE +CE +C6 +C6 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FC +C6 +C6 +C6 +C6 +C6 +FC +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +DA +CC +76 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FC +C6 +C6 +C6 +C6 +FC +E0 +F0 +D8 +CC +C6 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7E +C0 +C0 +C0 +C0 +7C +06 +06 +06 +06 +FC +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +FF +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +C3 +C3 +C3 +66 +66 +66 +3C +3C +3C +18 +18 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +C3 +C3 +C3 +C3 +DB +DB +FF +E7 +E7 +C3 +C3 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +C3 +66 +66 +3C +3C +18 +3C +3C +66 +66 +C3 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +C3 +C3 +66 +66 +3C +3C +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FE +06 +0C +0C +18 +18 +30 +30 +60 +60 +FE +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 13 2 -1 +BITMAP +F8 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +F8 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +C0 +C0 +60 +60 +30 +30 +18 +18 +0C +0C +06 +06 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 13 2 -1 +BITMAP +F8 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +F8 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 6 2 7 +BITMAP +30 +30 +78 +78 +CC +CC +CC +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 1 0 0 +BITMAP +FF +ENDCHAR +STARTCHAR grave +ENCODING 96 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 2 3 10 +BITMAP +C0 +60 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +7C +06 +06 +7E +C6 +C6 +C6 +7E +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +C0 +C0 +C0 +FC +C6 +C6 +C6 +C6 +C6 +C6 +FC +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +7E +C0 +C0 +C0 +C0 +C0 +C0 +7E +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +06 +06 +06 +7E +C6 +C6 +C6 +C6 +C6 +C6 +7E +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +7C +C6 +C6 +C6 +FE +C0 +C0 +7E +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +3E +60 +60 +FC +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +7E +C6 +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +FC +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +C0 +C0 +C0 +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 2 0 +BITMAP +30 +00 +00 +F0 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 14 2 -3 +BITMAP +30 +00 +00 +F0 +30 +30 +30 +30 +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +C0 +C0 +C0 +C6 +CC +D8 +F0 +F0 +D8 +CC +C6 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 2 0 +BITMAP +E0 +60 +60 +60 +60 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +FE +DB +DB +DB +DB +DB +DB +DB +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +FC +C6 +C6 +C6 +C6 +C6 +C6 +FC +C0 +C0 +C0 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +7E +C6 +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +06 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +DE +E0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +7E +C0 +C0 +70 +1C +06 +06 +FC +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +60 +60 +60 +FC +60 +60 +60 +60 +60 +60 +3E +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +C3 +C3 +66 +66 +3C +3C +18 +18 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +C3 +C3 +DB +DB +FF +FF +66 +66 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +C6 +C6 +6C +38 +38 +6C +C6 +C6 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +FC +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +FE +06 +0C +18 +30 +60 +C0 +FE +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 2 -1 +BITMAP +1C +30 +30 +30 +30 +30 +E0 +30 +30 +30 +30 +30 +1C +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 14 3 -3 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 2 -1 +BITMAP +E0 +30 +30 +30 +30 +30 +1C +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 3 0 9 +BITMAP +73 +DB +CE +ENDCHAR +STARTCHAR uni00A0 +ENCODING 160 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 8 -2 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 11 3 0 +BITMAP +C0 +C0 +00 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 -2 +BITMAP +18 +18 +7E +C0 +C0 +C0 +C0 +C0 +C0 +7E +18 +18 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +1E +30 +60 +60 +60 +F8 +60 +60 +60 +60 +FE +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 7 0 1 +BITMAP +DB +66 +C3 +C3 +C3 +66 +DB +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +C3 +C3 +66 +66 +3C +3C +7E +18 +7E +18 +18 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 13 3 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +7E +C0 +C0 +C0 +78 +CC +C6 +C6 +66 +3C +06 +06 +06 +FC +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 1 2 11 +BITMAP +D8 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 10 0 1 +BITMAP +7E +C3 +9D +B1 +B1 +B1 +B1 +9D +C3 +7E +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 6 1 5 +BITMAP +78 +0C +7C +CC +CC +7C +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 7 0 2 +BITMAP +1B +36 +6C +D8 +6C +36 +1B +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 1 3 +BITMAP +FE +06 +06 +06 +06 +ENDCHAR +STARTCHAR uni00AD +ENCODING 173 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 1 1 5 +BITMAP +FC +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +7E +C3 +81 +B9 +B5 +BD +B9 +BD +B5 +81 +C3 +7E +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 1 2 12 +BITMAP +F0 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 4 1 7 +BITMAP +70 +D8 +D8 +70 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 1 +BITMAP +18 +18 +18 +FF +18 +18 +18 +00 +FF +ENDCHAR +STARTCHAR uni00B2 +ENCODING 178 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 6 2 6 +BITMAP +F0 +18 +18 +30 +60 +F8 +ENDCHAR +STARTCHAR uni00B3 +ENCODING 179 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 6 2 6 +BITMAP +F0 +18 +70 +18 +18 +F0 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 2 2 10 +BITMAP +60 +C0 +ENDCHAR +STARTCHAR uni00B5 +ENCODING 181 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +C6 +C6 +C6 +C6 +C6 +C6 +C6 +FB +C0 +C0 +C0 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7E +F6 +F6 +F6 +F6 +F6 +76 +36 +36 +36 +36 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 2 3 4 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 3 2 -3 +BITMAP +60 +30 +E0 +ENDCHAR +STARTCHAR uni00B9 +ENCODING 185 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 6 2 6 +BITMAP +30 +70 +F0 +30 +30 +30 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 5 1 6 +BITMAP +78 +CC +CC +CC +78 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 7 0 2 +BITMAP +D8 +6C +36 +1B +36 +6C +D8 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +30 +70 +F0 +30 +31 +32 +04 +08 +10 +20 +4E +8E +16 +16 +1F +06 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +30 +70 +F0 +30 +31 +32 +04 +08 +10 +20 +5E +83 +03 +06 +0C +1F +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +F0 +18 +70 +18 +19 +F2 +04 +08 +10 +20 +4E +8E +16 +16 +1F +06 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +30 +30 +00 +30 +30 +60 +C0 +C0 +C0 +C6 +7C +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +60 +30 +00 +7C +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +0C +18 +00 +7C +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +10 +38 +6C +00 +7C +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +76 +DC +00 +7C +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +00 +7C +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +38 +6C +38 +00 +7C +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +7F +CC +CC +CC +CC +FF +CC +CC +CC +CC +CF +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +7E +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +7E +18 +0C +38 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +30 +18 +00 +FE +C0 +C0 +C0 +FC +C0 +C0 +C0 +C0 +FE +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +0C +18 +00 +FE +C0 +C0 +C0 +FC +C0 +C0 +C0 +C0 +FE +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +10 +38 +6C +00 +FE +C0 +C0 +C0 +FC +C0 +C0 +C0 +FE +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +00 +FE +C0 +C0 +C0 +C0 +FC +C0 +C0 +C0 +C0 +FE +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +60 +30 +00 +FC +30 +30 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +18 +30 +00 +FC +30 +30 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +20 +70 +D8 +00 +FC +30 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +D8 +00 +FC +30 +30 +30 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +7C +66 +63 +63 +63 +FB +63 +63 +63 +66 +7C +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +76 +DC +00 +C6 +E6 +E6 +F6 +F6 +DE +DE +CE +CE +C6 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +60 +30 +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +0C +18 +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +10 +38 +6C +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +76 +DC +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 7 0 2 +BITMAP +C3 +66 +3C +18 +3C +66 +C3 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -1 +BITMAP +02 +7C +C6 +CE +CE +D6 +D6 +D6 +E6 +E6 +C6 +7C +80 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +30 +18 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +0C +18 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +10 +38 +6C +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +0C +18 +00 +C3 +C3 +66 +66 +3C +3C +18 +18 +18 +18 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +C0 +C0 +F8 +CC +C6 +C6 +C6 +CC +F8 +C0 +C0 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +78 +CC +CC +CC +D8 +D8 +D8 +CC +C6 +C6 +DC +C0 +C0 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +60 +30 +00 +00 +7C +06 +06 +7E +C6 +C6 +C6 +7E +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +0C +18 +00 +00 +7C +06 +06 +7E +C6 +C6 +C6 +7E +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +10 +38 +6C +00 +7C +06 +06 +7E +C6 +C6 +C6 +7E +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +76 +DC +00 +7C +06 +06 +7E +C6 +C6 +C6 +7E +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +6C +00 +00 +7C +06 +06 +7E +C6 +C6 +C6 +7E +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +38 +6C +38 +00 +7C +06 +06 +7E +C6 +C6 +C6 +7E +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +7E +1B +1B +7E +D8 +D8 +D8 +7F +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +7E +C0 +C0 +C0 +C0 +C0 +C0 +7E +30 +18 +70 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +60 +30 +00 +00 +7C +C6 +C6 +C6 +FE +C0 +C0 +7E +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +0C +18 +00 +00 +7C +C6 +C6 +C6 +FE +C0 +C0 +7E +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +10 +38 +6C +00 +7C +C6 +C6 +C6 +FE +C0 +C0 +7E +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +6C +00 +00 +7C +C6 +C6 +C6 +FE +C0 +C0 +7E +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 2 0 +BITMAP +60 +30 +00 +00 +F0 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 2 0 +BITMAP +18 +30 +00 +00 +F0 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 2 0 +BITMAP +20 +70 +D8 +00 +F0 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 2 0 +BITMAP +D8 +00 +00 +F0 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +68 +30 +58 +18 +0C +7C +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +76 +DC +00 +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +60 +30 +00 +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +0C +18 +00 +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +10 +38 +6C +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +76 +DC +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +6C +00 +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 9 1 1 +BITMAP +38 +38 +00 +00 +FE +00 +00 +38 +38 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 -1 +BITMAP +02 +7C +CE +CE +D6 +D6 +E6 +E6 +7C +80 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +60 +30 +00 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +0C +18 +00 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +10 +38 +6C +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +6C +00 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +0C +18 +00 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +7C +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -3 +BITMAP +C0 +C0 +C0 +F8 +CC +C6 +C6 +C6 +CC +F8 +C0 +C0 +C0 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +6C +00 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +FC +ENDCHAR +STARTCHAR Amacron +ENCODING 256 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +7C +00 +7C +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR amacron +ENCODING 257 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +7C +00 +7C +06 +06 +7E +C6 +C6 +C6 +7E +ENDCHAR +STARTCHAR Abreve +ENCODING 258 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +38 +00 +7C +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR abreve +ENCODING 259 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +6C +38 +00 +7C +06 +06 +7E +C6 +C6 +C6 +7E +ENDCHAR +STARTCHAR Aogonek +ENCODING 260 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +7C +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +C6 +0C +18 +0E +ENDCHAR +STARTCHAR aogonek +ENCODING 261 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +7C +06 +06 +7E +C6 +C6 +C6 +7E +0C +18 +0E +ENDCHAR +STARTCHAR Cacute +ENCODING 262 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +18 +30 +00 +7E +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +7E +ENDCHAR +STARTCHAR cacute +ENCODING 263 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +0C +18 +00 +00 +7E +C0 +C0 +C0 +C0 +C0 +C0 +7E +ENDCHAR +STARTCHAR Ccircumflex +ENCODING 264 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +10 +38 +6C +00 +7E +C0 +C0 +C0 +C0 +C0 +C0 +C0 +7E +ENDCHAR +STARTCHAR ccircumflex +ENCODING 265 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +10 +38 +6C +00 +7E +C0 +C0 +C0 +C0 +C0 +C0 +7E +ENDCHAR +STARTCHAR Cdotaccent +ENCODING 266 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +10 +00 +7E +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +7E +ENDCHAR +STARTCHAR cdotaccent +ENCODING 267 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +10 +00 +7E +C0 +C0 +C0 +C0 +C0 +C0 +7E +ENDCHAR +STARTCHAR Ccaron +ENCODING 268 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +38 +10 +00 +7E +C0 +C0 +C0 +C0 +C0 +C0 +C0 +7E +ENDCHAR +STARTCHAR ccaron +ENCODING 269 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +6C +38 +10 +00 +7E +C0 +C0 +C0 +C0 +C0 +C0 +7E +ENDCHAR +STARTCHAR Dcaron +ENCODING 270 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +38 +10 +00 +F8 +CC +C6 +C6 +C6 +C6 +C6 +CC +F8 +ENDCHAR +STARTCHAR dcaron +ENCODING 271 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +0D +0D +0D +7C +CC +CC +CC +CC +CC +CC +7C +ENDCHAR +STARTCHAR Dcroat +ENCODING 272 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +7C +66 +63 +63 +63 +FB +63 +63 +63 +66 +7C +ENDCHAR +STARTCHAR dcroat +ENCODING 273 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +06 +1F +06 +7E +C6 +C6 +C6 +C6 +C6 +C6 +7E +ENDCHAR +STARTCHAR Emacron +ENCODING 274 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +7C +00 +FE +C0 +C0 +C0 +C0 +FC +C0 +C0 +C0 +C0 +FE +ENDCHAR +STARTCHAR emacron +ENCODING 275 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +7C +00 +7C +C6 +C6 +C6 +FE +C0 +C0 +7E +ENDCHAR +STARTCHAR Ebreve +ENCODING 276 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +38 +00 +FE +C0 +C0 +C0 +FC +C0 +C0 +C0 +C0 +FE +ENDCHAR +STARTCHAR ebreve +ENCODING 277 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +6C +38 +00 +7C +C6 +C6 +C6 +FE +C0 +C0 +7E +ENDCHAR +STARTCHAR Edotaccent +ENCODING 278 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +10 +00 +FE +C0 +C0 +C0 +C0 +FC +C0 +C0 +C0 +C0 +FE +ENDCHAR +STARTCHAR edotaccent +ENCODING 279 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +10 +00 +7C +C6 +C6 +C6 +FE +C0 +C0 +7E +ENDCHAR +STARTCHAR Eogonek +ENCODING 280 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +FE +C0 +C0 +C0 +C0 +FC +C0 +C0 +C0 +C0 +FE +0C +18 +0E +ENDCHAR +STARTCHAR eogonek +ENCODING 281 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +7C +C6 +C6 +C6 +FE +C0 +C0 +7E +0C +18 +0E +ENDCHAR +STARTCHAR Ecaron +ENCODING 282 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +38 +10 +00 +FE +C0 +C0 +C0 +FC +C0 +C0 +C0 +FE +ENDCHAR +STARTCHAR ecaron +ENCODING 283 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +6C +38 +10 +00 +7C +C6 +C6 +C6 +FE +C0 +C0 +7E +ENDCHAR +STARTCHAR Gcircumflex +ENCODING 284 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +10 +38 +6C +00 +7E +C0 +C0 +C0 +DE +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR gcircumflex +ENCODING 285 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +10 +38 +6C +00 +7E +C6 +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +FC +ENDCHAR +STARTCHAR Gbreve +ENCODING 286 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +38 +00 +7E +C0 +C0 +C0 +C0 +DE +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR gbreve +ENCODING 287 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +6C +38 +00 +7E +C6 +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +FC +ENDCHAR +STARTCHAR Gdotaccent +ENCODING 288 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +10 +00 +7E +C0 +C0 +C0 +C0 +DE +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR gdotaccent +ENCODING 289 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -3 +BITMAP +10 +00 +7E +C6 +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +FC +ENDCHAR +STARTCHAR Gcommaaccent +ENCODING 290 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +7E +C0 +C0 +C0 +C0 +DE +C6 +C6 +C6 +C6 +7C +18 +18 +30 +ENDCHAR +STARTCHAR gcommaaccent +ENCODING 291 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +18 +18 +30 +00 +7E +C6 +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +FC +ENDCHAR +STARTCHAR Hcircumflex +ENCODING 292 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +10 +38 +6C +00 +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR hcircumflex +ENCODING 293 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +10 +38 +6C +00 +C0 +C0 +FC +C6 +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR Hbar +ENCODING 294 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +66 +66 +66 +FF +66 +7E +66 +66 +66 +66 +66 +ENDCHAR +STARTCHAR hbar +ENCODING 295 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +60 +F8 +60 +7E +63 +63 +63 +63 +63 +63 +63 +ENDCHAR +STARTCHAR Itilde +ENCODING 296 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +76 +DC +00 +FC +30 +30 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR itilde +ENCODING 297 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +76 +DC +00 +78 +18 +18 +18 +18 +18 +18 +7E +ENDCHAR +STARTCHAR Imacron +ENCODING 298 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +FC +00 +FC +30 +30 +30 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR imacron +ENCODING 299 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 2 0 +BITMAP +F8 +00 +F0 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR Ibreve +ENCODING 300 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +6C +38 +00 +FC +30 +30 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR ibreve +ENCODING 301 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 2 0 +BITMAP +D8 +70 +00 +F0 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR Iogonek +ENCODING 302 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +FC +30 +30 +30 +30 +30 +30 +30 +30 +30 +FC +30 +60 +38 +ENDCHAR +STARTCHAR iogonek +ENCODING 303 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 2 -3 +BITMAP +30 +00 +F0 +30 +30 +30 +30 +30 +30 +FC +30 +60 +38 +ENDCHAR +STARTCHAR Idotaccent +ENCODING 304 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +30 +00 +FC +30 +30 +30 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR dotlessi +ENCODING 305 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 2 0 +BITMAP +F0 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR IJ +ENCODING 306 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +F7 +63 +63 +63 +63 +63 +63 +63 +63 +63 +FE +ENDCHAR +STARTCHAR ij +ENCODING 307 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 -3 +BITMAP +63 +00 +E7 +63 +63 +63 +63 +63 +63 +F3 +03 +1B +0E +ENDCHAR +STARTCHAR Jcircumflex +ENCODING 308 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 2 0 +BITMAP +10 +38 +6C +00 +3C +18 +18 +18 +18 +18 +18 +18 +F0 +ENDCHAR +STARTCHAR jcircumflex +ENCODING 309 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 15 2 -3 +BITMAP +20 +70 +D8 +00 +F0 +30 +30 +30 +30 +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR Kcommaaccent +ENCODING 310 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +C6 +CC +D8 +F0 +E0 +C0 +E0 +F0 +D8 +CC +C6 +18 +18 +30 +ENDCHAR +STARTCHAR kcommaaccent +ENCODING 311 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +C0 +C0 +C6 +CC +D8 +F0 +E0 +F0 +D8 +CC +C6 +18 +18 +30 +ENDCHAR +STARTCHAR kgreenlandic +ENCODING 312 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +C6 +CC +D8 +F0 +F0 +D8 +CC +C6 +ENDCHAR +STARTCHAR Lacute +ENCODING 313 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +60 +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FE +ENDCHAR +STARTCHAR lacute +ENCODING 314 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 13 2 0 +BITMAP +30 +60 +00 +E0 +60 +60 +60 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR Lcommaaccent +ENCODING 315 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FE +18 +18 +30 +ENDCHAR +STARTCHAR lcommaaccent +ENCODING 316 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 14 2 -3 +BITMAP +E0 +60 +60 +60 +60 +60 +60 +60 +60 +60 +38 +30 +30 +60 +ENDCHAR +STARTCHAR Lcaron +ENCODING 317 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +CC +CC +D8 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FE +ENDCHAR +STARTCHAR lcaron +ENCODING 318 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +E6 +66 +6C +60 +60 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR Ldot +ENCODING 319 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +C0 +C0 +C0 +C0 +D8 +C0 +C0 +C0 +C0 +C0 +FE +ENDCHAR +STARTCHAR ldot +ENCODING 320 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 2 0 +BITMAP +E0 +60 +60 +60 +60 +6C +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR Lslash +ENCODING 321 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +60 +60 +60 +60 +70 +60 +E0 +60 +60 +60 +7F +ENDCHAR +STARTCHAR lslash +ENCODING 322 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 2 0 +BITMAP +E0 +60 +60 +60 +70 +E0 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR Nacute +ENCODING 323 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +18 +30 +00 +C6 +E6 +E6 +F6 +F6 +DE +DE +CE +CE +C6 +ENDCHAR +STARTCHAR nacute +ENCODING 324 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +0C +18 +00 +00 +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR Ncommaaccent +ENCODING 325 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +C6 +C6 +E6 +E6 +F6 +D6 +DE +CE +CE +C6 +C6 +18 +18 +30 +ENDCHAR +STARTCHAR ncommaaccent +ENCODING 326 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +18 +18 +30 +ENDCHAR +STARTCHAR Ncaron +ENCODING 327 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +38 +10 +C6 +E6 +E6 +F6 +F6 +DE +DE +CE +CE +C6 +ENDCHAR +STARTCHAR ncaron +ENCODING 328 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +6C +38 +10 +00 +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR napostrophe +ENCODING 329 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +60 +60 +C0 +3E +33 +33 +33 +33 +33 +33 +33 +ENDCHAR +STARTCHAR Eng +ENCODING 330 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +C6 +C6 +E6 +E6 +F6 +D6 +DE +CE +CE +C6 +C6 +06 +06 +0C +ENDCHAR +STARTCHAR eng +ENCODING 331 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +06 +06 +1C +ENDCHAR +STARTCHAR Omacron +ENCODING 332 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +7C +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR omacron +ENCODING 333 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +7C +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR Obreve +ENCODING 334 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +38 +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR obreve +ENCODING 335 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +6C +38 +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR Ohungarumlaut +ENCODING 336 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +36 +6C +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR ohungarumlaut +ENCODING 337 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +36 +6C +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR OE +ENCODING 338 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +7F +CC +CC +CC +CC +CF +CC +CC +CC +CC +7F +ENDCHAR +STARTCHAR oe +ENCODING 339 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +7E +DB +DB +DB +DF +D8 +D8 +7F +ENDCHAR +STARTCHAR Racute +ENCODING 340 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +18 +30 +00 +FC +C6 +C6 +C6 +C6 +FC +F0 +D8 +CC +C6 +ENDCHAR +STARTCHAR racute +ENCODING 341 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +0C +18 +00 +00 +DE +E0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Rcommaaccent +ENCODING 342 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +FC +C6 +C6 +C6 +C6 +FC +E0 +F0 +D8 +CC +C6 +18 +18 +30 +ENDCHAR +STARTCHAR rcommaaccent +ENCODING 343 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +DE +E0 +C0 +C0 +C0 +C0 +C0 +C0 +18 +18 +30 +ENDCHAR +STARTCHAR Rcaron +ENCODING 344 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +38 +10 +00 +FC +C6 +C6 +C6 +FC +F0 +D8 +CC +C6 +ENDCHAR +STARTCHAR rcaron +ENCODING 345 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +6C +38 +10 +00 +DE +E0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Sacute +ENCODING 346 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +0C +18 +00 +7E +C0 +C0 +C0 +7C +06 +06 +06 +06 +FC +ENDCHAR +STARTCHAR sacute +ENCODING 347 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +0C +18 +00 +00 +7E +C0 +C0 +70 +1C +06 +06 +FC +ENDCHAR +STARTCHAR Scircumflex +ENCODING 348 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +10 +38 +6C +00 +7E +C0 +C0 +C0 +7C +06 +06 +06 +FC +ENDCHAR +STARTCHAR scircumflex +ENCODING 349 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +10 +38 +6C +00 +7E +C0 +C0 +70 +1C +06 +06 +FC +ENDCHAR +STARTCHAR Scedilla +ENCODING 350 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +7E +C0 +C0 +C0 +C0 +7C +06 +06 +06 +06 +FC +18 +0C +38 +ENDCHAR +STARTCHAR scedilla +ENCODING 351 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +7E +C0 +C0 +70 +1C +06 +06 +FC +18 +0C +38 +ENDCHAR +STARTCHAR Scaron +ENCODING 352 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +38 +10 +00 +7E +C0 +C0 +C0 +7C +06 +06 +06 +FC +ENDCHAR +STARTCHAR scaron +ENCODING 353 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +6C +38 +10 +00 +7E +C0 +C0 +70 +1C +06 +06 +FC +ENDCHAR +STARTCHAR Tcommaaccent +ENCODING 354 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +FF +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +0C +38 +ENDCHAR +STARTCHAR tcommaaccent +ENCODING 355 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +60 +60 +60 +FC +60 +60 +60 +60 +60 +60 +3E +18 +0C +38 +ENDCHAR +STARTCHAR Tcaron +ENCODING 356 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +36 +1C +08 +00 +FF +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR tcaron +ENCODING 357 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +06 +06 +6C +60 +60 +FC +60 +60 +60 +60 +60 +60 +3E +ENDCHAR +STARTCHAR Tbar +ENCODING 358 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +FF +18 +18 +18 +18 +7E +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR tbar +ENCODING 359 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +60 +60 +60 +FC +60 +60 +FC +60 +60 +60 +3E +ENDCHAR +STARTCHAR Utilde +ENCODING 360 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +76 +DC +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR utilde +ENCODING 361 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +76 +DC +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR Umacron +ENCODING 362 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +7C +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR umacron +ENCODING 363 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +7C +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR Ubreve +ENCODING 364 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +38 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR ubreve +ENCODING 365 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +6C +38 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR Uring +ENCODING 366 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +38 +6C +38 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uring +ENCODING 367 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +38 +6C +38 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR Uhungarumlaut +ENCODING 368 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +36 +6C +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uhungarumlaut +ENCODING 369 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +36 +6C +00 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR Uogonek +ENCODING 370 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +18 +30 +1C +ENDCHAR +STARTCHAR uogonek +ENCODING 371 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +18 +30 +1C +ENDCHAR +STARTCHAR Wcircumflex +ENCODING 372 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +10 +38 +6C +00 +C3 +C3 +C3 +DB +DB +FF +FF +E7 +C3 +ENDCHAR +STARTCHAR wcircumflex +ENCODING 373 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +10 +38 +6C +00 +C3 +C3 +DB +DB +FF +FF +66 +66 +ENDCHAR +STARTCHAR Ycircumflex +ENCODING 374 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +10 +38 +6C +00 +C3 +C3 +66 +3C +3C +18 +18 +18 +18 +ENDCHAR +STARTCHAR ycircumflex +ENCODING 375 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +10 +38 +6C +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +FC +ENDCHAR +STARTCHAR Ydieresis +ENCODING 376 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +6C +00 +C3 +C3 +66 +66 +3C +3C +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR Zacute +ENCODING 377 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +18 +30 +00 +FE +0C +0C +18 +18 +30 +30 +60 +60 +FE +ENDCHAR +STARTCHAR zacute +ENCODING 378 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +0C +18 +00 +00 +FE +06 +0C +18 +30 +60 +C0 +FE +ENDCHAR +STARTCHAR Zdotaccent +ENCODING 379 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +10 +00 +FE +06 +0C +0C +18 +18 +30 +30 +60 +60 +FE +ENDCHAR +STARTCHAR zdotaccent +ENCODING 380 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +10 +00 +FE +06 +0C +18 +30 +60 +C0 +FE +ENDCHAR +STARTCHAR Zcaron +ENCODING 381 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +38 +10 +00 +FE +06 +0C +18 +30 +60 +C0 +C0 +FE +ENDCHAR +STARTCHAR zcaron +ENCODING 382 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +6C +38 +10 +00 +FE +06 +0C +18 +30 +60 +C0 +FE +ENDCHAR +STARTCHAR longs +ENCODING 383 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 3 0 +BITMAP +78 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni0180 +ENCODING 384 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +60 +F8 +60 +7E +63 +63 +63 +63 +63 +63 +7E +ENDCHAR +STARTCHAR uni0181 +ENCODING 385 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +7E +B3 +B3 +33 +33 +3E +33 +33 +33 +33 +3E +ENDCHAR +STARTCHAR uni0182 +ENCODING 386 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FC +C0 +C0 +C0 +C0 +FC +C6 +C6 +C6 +C6 +FC +ENDCHAR +STARTCHAR uni0183 +ENCODING 387 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FC +C0 +C0 +FC +C6 +C6 +C6 +C6 +C6 +C6 +FC +ENDCHAR +STARTCHAR uni0184 +ENCODING 388 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +60 +E0 +E0 +60 +60 +7E +63 +63 +63 +63 +7E +ENDCHAR +STARTCHAR uni0185 +ENCODING 389 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +60 +E0 +E0 +7E +63 +63 +63 +63 +63 +63 +7E +ENDCHAR +STARTCHAR uni0186 +ENCODING 390 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FC +06 +06 +06 +06 +06 +06 +06 +06 +06 +FC +ENDCHAR +STARTCHAR uni0187 +ENCODING 391 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +06 +08 +7E +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +7E +ENDCHAR +STARTCHAR uni0188 +ENCODING 392 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +06 +08 +7E +C0 +C0 +C0 +C0 +C0 +C0 +7E +ENDCHAR +STARTCHAR uni0189 +ENCODING 393 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +7C +66 +63 +63 +63 +FB +63 +63 +63 +66 +7C +ENDCHAR +STARTCHAR uni018A +ENCODING 394 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +7C +B6 +B3 +33 +33 +33 +33 +33 +33 +36 +3C +ENDCHAR +STARTCHAR uni018B +ENCODING 395 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7E +06 +06 +06 +06 +7E +C6 +C6 +C6 +C6 +7E +ENDCHAR +STARTCHAR uni018C +ENCODING 396 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7E +06 +06 +7E +C6 +C6 +C6 +C6 +C6 +C6 +7E +ENDCHAR +STARTCHAR uni018D +ENCODING 397 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7C +C6 +C6 +C6 +C6 +66 +3C +18 +0C +0C +78 +ENDCHAR +STARTCHAR uni018E +ENCODING 398 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FE +06 +06 +06 +06 +7E +06 +06 +06 +06 +FE +ENDCHAR +STARTCHAR uni018F +ENCODING 399 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7C +C6 +06 +06 +06 +FE +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni0190 +ENCODING 400 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7E +C0 +C0 +C0 +C0 +7C +C0 +C0 +C0 +C0 +7E +ENDCHAR +STARTCHAR uni0191 +ENCODING 401 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 -2 +BITMAP +7F +60 +60 +60 +60 +7E +60 +60 +60 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR florin +ENCODING 402 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 -2 +BITMAP +1F +30 +30 +7E +30 +30 +30 +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR uni0193 +ENCODING 403 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +06 +08 +7E +C0 +C0 +C0 +C0 +DE +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni0194 +ENCODING 404 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +C3 +66 +3C +3C +18 +18 +3C +3C +66 +66 +3C +ENDCHAR +STARTCHAR uni0195 +ENCODING 405 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +C0 +C0 +C0 +F3 +DB +DB +DB +DB +DB +DB +CE +ENDCHAR +STARTCHAR uni0196 +ENCODING 406 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 11 3 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +70 +ENDCHAR +STARTCHAR uni0197 +ENCODING 407 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +FC +30 +30 +30 +30 +FC +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni0198 +ENCODING 408 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +C6 +CD +D9 +F0 +E0 +C0 +E0 +F0 +D8 +CC +C6 +ENDCHAR +STARTCHAR uni0199 +ENCODING 409 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +70 +C0 +C0 +C0 +C6 +CC +D8 +F0 +F0 +D8 +CC +C6 +ENDCHAR +STARTCHAR uni019A +ENCODING 410 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +70 +30 +30 +30 +30 +FC +30 +30 +30 +30 +1C +ENDCHAR +STARTCHAR uni019B +ENCODING 411 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +68 +30 +30 +58 +18 +3C +3C +66 +66 +C3 +C3 +ENDCHAR +STARTCHAR uni019C +ENCODING 412 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +DB +DB +DB +DB +DB +DB +DB +DB +DB +DB +7F +ENDCHAR +STARTCHAR uni019D +ENCODING 413 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 -2 +BITMAP +63 +63 +73 +73 +7B +6B +6F +67 +67 +63 +63 +60 +C0 +ENDCHAR +STARTCHAR uni019E +ENCODING 414 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +06 +06 +06 +ENDCHAR +STARTCHAR uni019F +ENCODING 415 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7C +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR Ohorn +ENCODING 416 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +01 +7D +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR ohorn +ENCODING 417 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +01 +7D +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni01A2 +ENCODING 418 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +7E +DB +DB +DB +DB +DB +DB +DB +DB +DB +73 +ENDCHAR +STARTCHAR uni01A3 +ENCODING 419 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +7E +DB +DB +DB +DB +DB +DB +73 +03 +03 +03 +ENDCHAR +STARTCHAR uni01A4 +ENCODING 420 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +7E +B3 +B3 +33 +33 +33 +3E +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni01A5 +ENCODING 421 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -3 +BITMAP +70 +C0 +FC +C6 +C6 +C6 +C6 +C6 +C6 +FC +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni01A6 +ENCODING 422 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 0 -1 +BITMAP +C0 +C0 +FC +C6 +C6 +C6 +FC +E0 +F0 +D8 +CC +06 +ENDCHAR +STARTCHAR uni01A7 +ENCODING 423 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FC +06 +06 +06 +06 +7C +C0 +C0 +C0 +C0 +7E +ENDCHAR +STARTCHAR uni01A8 +ENCODING 424 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +FC +06 +06 +1C +70 +C0 +C0 +7E +ENDCHAR +STARTCHAR uni01A9 +ENCODING 425 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FE +C0 +60 +30 +18 +0C +18 +30 +60 +C0 +FE +ENDCHAR +STARTCHAR uni01AA +ENCODING 426 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 15 0 -3 +BITMAP +70 +D8 +7C +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +0F +ENDCHAR +STARTCHAR uni01AB +ENCODING 427 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +60 +60 +60 +FC +60 +60 +60 +60 +60 +60 +3E +06 +06 +0C +ENDCHAR +STARTCHAR uni01AC +ENCODING 428 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +7F +98 +98 +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni01AD +ENCODING 429 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +38 +60 +60 +60 +FC +60 +60 +60 +60 +60 +60 +3E +ENDCHAR +STARTCHAR uni01AE +ENCODING 430 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 -2 +BITMAP +FF +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +0E +ENDCHAR +STARTCHAR Uhorn +ENCODING 431 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +CD +CD +CE +CC +CC +CC +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uhorn +ENCODING 432 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +CD +CD +CE +CC +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni01B1 +ENCODING 433 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +E7 +24 +66 +C3 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uni01B2 +ENCODING 434 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +C0 +C0 +CC +C6 +C6 +C6 +C6 +C6 +C6 +CC +78 +ENDCHAR +STARTCHAR uni01B3 +ENCODING 435 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +C2 +C7 +6D +6C +3C +3C +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni01B4 +ENCODING 436 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 -3 +BITMAP +06 +CD +CD +CC +CC +CC +CC +CC +7C +0C +0C +F8 +ENDCHAR +STARTCHAR uni01B5 +ENCODING 437 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FE +06 +0C +0C +18 +FE +30 +30 +60 +60 +FE +ENDCHAR +STARTCHAR uni01B6 +ENCODING 438 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +FE +06 +0C +FE +30 +60 +C0 +FE +ENDCHAR +STARTCHAR uni01B7 +ENCODING 439 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FE +06 +0C +18 +38 +0C +06 +06 +06 +CC +78 +ENDCHAR +STARTCHAR uni01B8 +ENCODING 440 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FE +C0 +60 +30 +38 +60 +C0 +C0 +C0 +66 +3C +ENDCHAR +STARTCHAR uni01B9 +ENCODING 441 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +FE +C0 +60 +30 +38 +60 +C0 +C0 +C0 +66 +3C +ENDCHAR +STARTCHAR uni01BA +ENCODING 442 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +FE +06 +0C +18 +3C +06 +06 +7C +C0 +C0 +7C +ENDCHAR +STARTCHAR uni01BB +ENCODING 443 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FC +06 +06 +06 +0C +FE +30 +60 +C0 +C0 +FE +ENDCHAR +STARTCHAR uni01BC +ENCODING 444 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FE +C0 +C0 +C0 +F8 +0C +06 +06 +06 +0C +F8 +ENDCHAR +STARTCHAR uni01BD +ENCODING 445 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +FE +C0 +C0 +C0 +F8 +0C +06 +06 +06 +0C +F8 +ENDCHAR +STARTCHAR uni01BE +ENCODING 446 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +30 +30 +FC +30 +30 +1C +06 +06 +06 +C6 +7C +ENDCHAR +STARTCHAR uni01BF +ENCODING 447 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +DC +E6 +C6 +C6 +C6 +CC +D8 +F0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni01C0 +ENCODING 448 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 14 3 -3 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni01C1 +ENCODING 449 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 14 2 -3 +BITMAP +D8 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni01C2 +ENCODING 450 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +30 +30 +30 +30 +30 +FC +30 +30 +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni01C3 +ENCODING 451 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 11 3 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR uni01C4 +ENCODING 452 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +05 +02 +E0 +DF +D3 +D3 +D3 +D6 +D6 +D6 +DC +DC +EF +ENDCHAR +STARTCHAR uni01C5 +ENCODING 453 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +E5 +D2 +D0 +DF +D3 +D3 +D6 +D6 +DC +DC +EF +ENDCHAR +STARTCHAR uni01C6 +ENCODING 454 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +15 +12 +10 +7F +D3 +D3 +D6 +D6 +DC +DC +7F +ENDCHAR +STARTCHAR uni01C7 +ENCODING 455 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +C7 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +FE +ENDCHAR +STARTCHAR uni01C8 +ENCODING 456 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +C0 +C1 +C0 +C7 +C3 +C3 +C3 +C3 +C3 +C3 +FF +03 +03 +0E +ENDCHAR +STARTCHAR uni01C9 +ENCODING 457 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +E0 +62 +60 +67 +63 +63 +63 +63 +63 +63 +3B +03 +03 +0E +ENDCHAR +STARTCHAR uni01CA +ENCODING 458 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +9B +9B +DB +DB +FB +FB +FB +DB +DB +CB +CE +ENDCHAR +STARTCHAR uni01CB +ENCODING 459 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +98 +9A +D8 +DF +FB +FB +FB +DB +DB +CB +CB +03 +03 +0E +ENDCHAR +STARTCHAR uni01CC +ENCODING 460 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 -3 +BITMAP +02 +00 +F3 +DB +DB +DB +DB +DB +DB +DB +03 +03 +0E +ENDCHAR +STARTCHAR uni01CD +ENCODING 461 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +38 +10 +00 +7C +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR uni01CE +ENCODING 462 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +6C +38 +10 +00 +7C +06 +06 +7E +C6 +C6 +C6 +7E +ENDCHAR +STARTCHAR uni01CF +ENCODING 463 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +D8 +70 +20 +00 +FC +30 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni01D0 +ENCODING 464 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 2 0 +BITMAP +D8 +70 +20 +00 +F0 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni01D1 +ENCODING 465 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +38 +10 +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni01D2 +ENCODING 466 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +6C +38 +10 +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni01D3 +ENCODING 467 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +38 +10 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni01D4 +ENCODING 468 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +6C +38 +10 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni01D5 +ENCODING 469 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +7C +00 +6C +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni01D6 +ENCODING 470 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +7C +00 +6C +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni01D7 +ENCODING 471 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +18 +30 +C6 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni01D8 +ENCODING 472 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +0C +18 +00 +6C +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni01D9 +ENCODING 473 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +38 +10 +C6 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni01DA +ENCODING 474 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +6C +38 +10 +6C +00 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni01DB +ENCODING 475 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +30 +18 +C6 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni01DC +ENCODING 476 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +60 +30 +00 +6C +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni01DD +ENCODING 477 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +FC +06 +06 +FE +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni01DE +ENCODING 478 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +7C +00 +6C +00 +7C +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR uni01DF +ENCODING 479 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +7C +00 +6C +00 +7C +06 +06 +7E +C6 +C6 +C6 +7E +ENDCHAR +STARTCHAR uni01E0 +ENCODING 480 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +FC +00 +30 +00 +7C +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR uni01E1 +ENCODING 481 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +FC +00 +30 +00 +7C +06 +06 +7E +C6 +C6 +C6 +7E +ENDCHAR +STARTCHAR uni01E2 +ENCODING 482 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +3E +00 +7F +CC +CC +CC +CC +FF +CC +CC +CC +CC +CF +ENDCHAR +STARTCHAR uni01E3 +ENCODING 483 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 10 0 0 +BITMAP +7E +00 +7E +1B +1B +7B +DE +D8 +D8 +7F +ENDCHAR +STARTCHAR uni01E4 +ENCODING 484 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +7E +C0 +C0 +C0 +C0 +DE +C6 +DF +C6 +C6 +7C +ENDCHAR +STARTCHAR uni01E5 +ENCODING 485 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +7E +C6 +C6 +C6 +C6 +C6 +7E +06 +1F +06 +FC +ENDCHAR +STARTCHAR Gcaron +ENCODING 486 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +38 +10 +00 +7E +C0 +C0 +C0 +DE +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR gcaron +ENCODING 487 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +6C +38 +10 +00 +7E +C6 +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +FC +ENDCHAR +STARTCHAR uni01E8 +ENCODING 488 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +38 +10 +C6 +CC +D8 +F0 +E0 +E0 +F0 +D8 +CC +C6 +ENDCHAR +STARTCHAR uni01E9 +ENCODING 489 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +38 +10 +C0 +C0 +C6 +CC +D8 +F0 +F0 +D8 +CC +C6 +ENDCHAR +STARTCHAR uni01EA +ENCODING 490 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +30 +60 +38 +ENDCHAR +STARTCHAR uni01EB +ENCODING 491 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +30 +60 +38 +ENDCHAR +STARTCHAR uni01EC +ENCODING 492 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 16 1 -3 +BITMAP +7C +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +30 +60 +38 +ENDCHAR +STARTCHAR uni01ED +ENCODING 493 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -3 +BITMAP +7C +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +30 +60 +38 +ENDCHAR +STARTCHAR uni01EE +ENCODING 494 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +38 +10 +00 +FE +06 +0C +38 +0C +06 +06 +CC +78 +ENDCHAR +STARTCHAR uni01EF +ENCODING 495 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +6C +38 +10 +00 +FE +06 +0C +18 +38 +0C +06 +06 +06 +CC +78 +ENDCHAR +STARTCHAR uni01F0 +ENCODING 496 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 15 2 -3 +BITMAP +D8 +70 +20 +00 +F0 +30 +30 +30 +30 +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR uni01F1 +ENCODING 497 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +EF +D3 +D3 +D3 +D6 +D6 +D6 +DC +DC +DC +EF +ENDCHAR +STARTCHAR uni01F2 +ENCODING 498 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +E0 +D0 +D0 +DF +D3 +D3 +D6 +D6 +DC +DC +EF +ENDCHAR +STARTCHAR uni01F3 +ENCODING 499 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +10 +10 +10 +7F +D3 +D3 +D6 +D6 +DC +DC +7F +ENDCHAR +STARTCHAR uni01F4 +ENCODING 500 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +18 +30 +00 +7E +C0 +C0 +C0 +DE +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni01F5 +ENCODING 501 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +0C +18 +00 +00 +7E +C6 +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +FC +ENDCHAR +STARTCHAR uni01F6 +ENCODING 502 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +D8 +D8 +DB +DB +DB +FB +DB +DB +DB +DB +CE +ENDCHAR +STARTCHAR uni01F7 +ENCODING 503 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +DC +E6 +C6 +C6 +C6 +CC +CC +D8 +F0 +E0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni01F8 +ENCODING 504 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +30 +18 +E3 +E3 +F3 +F3 +FB +DB +DF +CF +CF +C7 +C7 +ENDCHAR +STARTCHAR uni01F9 +ENCODING 505 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +30 +30 +18 +00 +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR Aringacute +ENCODING 506 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +70 +DB +76 +00 +3E +63 +63 +63 +7F +63 +63 +63 +63 +ENDCHAR +STARTCHAR aringacute +ENCODING 507 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +70 +DB +76 +00 +3E +03 +03 +3F +63 +63 +63 +3F +ENDCHAR +STARTCHAR AEacute +ENCODING 508 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +0C +18 +00 +7F +CC +CC +CC +FF +CC +CC +CC +CC +CF +ENDCHAR +STARTCHAR aeacute +ENCODING 509 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +06 +0C +00 +00 +7E +1B +1B +7B +DE +D8 +D8 +7F +ENDCHAR +STARTCHAR Oslashacute +ENCODING 510 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +0C +18 +00 +18 +3D +66 +66 +6E +76 +66 +66 +BC +18 +ENDCHAR +STARTCHAR oslashacute +ENCODING 511 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +0C +18 +00 +00 +3D +66 +66 +6E +76 +66 +66 +BC +ENDCHAR +STARTCHAR uni0200 +ENCODING 512 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +D8 +6C +00 +7C +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR uni0201 +ENCODING 513 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +D8 +6C +00 +00 +7C +06 +06 +7E +C6 +C6 +C6 +7E +ENDCHAR +STARTCHAR uni0202 +ENCODING 514 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +38 +6C +00 +7C +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR uni0203 +ENCODING 515 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +38 +6C +00 +7C +06 +06 +7E +C6 +C6 +C6 +7E +ENDCHAR +STARTCHAR uni0204 +ENCODING 516 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +D8 +6C +00 +FE +C0 +C0 +C0 +FC +C0 +C0 +C0 +C0 +FE +ENDCHAR +STARTCHAR uni0205 +ENCODING 517 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +D8 +6C +00 +00 +7C +C6 +C6 +C6 +FE +C0 +C0 +7E +ENDCHAR +STARTCHAR uni0206 +ENCODING 518 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +38 +6C +00 +FE +C0 +C0 +C0 +FC +C0 +C0 +C0 +C0 +FE +ENDCHAR +STARTCHAR uni0207 +ENCODING 519 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +38 +6C +00 +7C +C6 +C6 +C6 +FE +C0 +C0 +7E +ENDCHAR +STARTCHAR uni0208 +ENCODING 520 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +D8 +6C +00 +FC +30 +30 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni0209 +ENCODING 521 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +D8 +6C +00 +00 +78 +18 +18 +18 +18 +18 +18 +7E +ENDCHAR +STARTCHAR uni020A +ENCODING 522 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +78 +CC +00 +FC +30 +30 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni020B +ENCODING 523 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 2 0 +BITMAP +70 +D8 +00 +F0 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni020C +ENCODING 524 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +D8 +6C +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni020D +ENCODING 525 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +D8 +6C +00 +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni020E +ENCODING 526 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +38 +6C +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni020F +ENCODING 527 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +38 +6C +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni0210 +ENCODING 528 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +D8 +6C +00 +FC +C6 +C6 +C6 +FC +E0 +F0 +D8 +CC +C6 +ENDCHAR +STARTCHAR uni0211 +ENCODING 529 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +D8 +6C +00 +00 +DE +E0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni0212 +ENCODING 530 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +38 +6C +00 +FC +C6 +C6 +C6 +FC +E0 +F0 +D8 +CC +C6 +ENDCHAR +STARTCHAR uni0213 +ENCODING 531 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +38 +6C +00 +DE +E0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni0214 +ENCODING 532 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +D8 +6C +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni0215 +ENCODING 533 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +D8 +6C +00 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni0216 +ENCODING 534 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +38 +6C +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni0217 +ENCODING 535 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +38 +6C +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR Scommaaccent +ENCODING 536 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +7E +C0 +C0 +C0 +C0 +7C +06 +06 +06 +06 +FC +00 +18 +30 +ENDCHAR +STARTCHAR scommaaccent +ENCODING 537 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +7E +C0 +C0 +70 +1C +06 +06 +FC +00 +18 +30 +ENDCHAR +STARTCHAR uni021A +ENCODING 538 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +FF +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +00 +18 +30 +ENDCHAR +STARTCHAR uni021B +ENCODING 539 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +60 +60 +60 +FC +60 +60 +60 +60 +60 +60 +3E +00 +18 +30 +ENDCHAR +STARTCHAR uni021C +ENCODING 540 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +7C +C6 +06 +06 +0C +18 +3C +66 +06 +06 +06 +0C +38 +E0 +ENDCHAR +STARTCHAR uni021D +ENCODING 541 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +7C +C6 +06 +06 +1C +76 +06 +06 +0C +38 +E0 +ENDCHAR +STARTCHAR uni021E +ENCODING 542 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +38 +10 +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR uni021F +ENCODING 543 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +38 +10 +C0 +C0 +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR uni0220 +ENCODING 544 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +06 +06 +06 +ENDCHAR +STARTCHAR uni0221 +ENCODING 545 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 -1 +BITMAP +0C +0C +0C +7C +CC +CC +CC +CC +CE +CD +7E +04 +ENDCHAR +STARTCHAR uni0222 +ENCODING 546 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +0C +66 +C6 +C6 +7C +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni0223 +ENCODING 547 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +6C +C6 +C6 +7C +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni0224 +ENCODING 548 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +FE +06 +0C +0C +18 +18 +30 +30 +60 +60 +FE +06 +1C +ENDCHAR +STARTCHAR uni0225 +ENCODING 549 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 -2 +BITMAP +FE +06 +0C +18 +30 +60 +C0 +FE +06 +1C +ENDCHAR +STARTCHAR uni0226 +ENCODING 550 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +30 +00 +7C +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR uni0227 +ENCODING 551 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +30 +00 +7C +06 +06 +7E +C6 +C6 +C6 +7E +ENDCHAR +STARTCHAR uni0228 +ENCODING 552 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +FE +C0 +C0 +C0 +C0 +FC +C0 +C0 +C0 +C0 +FE +18 +0C +38 +ENDCHAR +STARTCHAR uni0229 +ENCODING 553 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +7C +C6 +C6 +C6 +FE +C0 +C0 +7E +18 +0C +38 +ENDCHAR +STARTCHAR uni022A +ENCODING 554 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +7C +00 +6C +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni022B +ENCODING 555 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +7C +00 +6C +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni022C +ENCODING 556 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +7C +00 +76 +DC +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni022D +ENCODING 557 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +7C +00 +76 +DC +00 +7C +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni022E +ENCODING 558 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +30 +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni022F +ENCODING 559 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +30 +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni0230 +ENCODING 560 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +7C +00 +30 +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni0231 +ENCODING 561 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +7C +00 +30 +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni0232 +ENCODING 562 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +7E +00 +C3 +C3 +66 +66 +3C +3C +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni0233 +ENCODING 563 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -3 +BITMAP +7C +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +FC +ENDCHAR +STARTCHAR uni0234 +ENCODING 564 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 -1 +BITMAP +E0 +60 +60 +60 +60 +60 +60 +60 +78 +74 +38 +10 +ENDCHAR +STARTCHAR uni0235 +ENCODING 565 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 -1 +BITMAP +F8 +CC +CC +CC +CC +CE +CD +CE +04 +ENDCHAR +STARTCHAR uni0236 +ENCODING 566 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 0 -1 +BITMAP +60 +60 +60 +FC +60 +60 +60 +60 +6C +7A +3C +08 +ENDCHAR +STARTCHAR uni0237 +ENCODING 567 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 11 2 -3 +BITMAP +F0 +30 +30 +30 +30 +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR uni0238 +ENCODING 568 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +18 +18 +18 +7C +DB +DB +DB +DB +DB +DB +66 +ENDCHAR +STARTCHAR uni0239 +ENCODING 569 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +66 +DB +DB +DB +DB +DB +DB +7E +18 +18 +18 +ENDCHAR +STARTCHAR uni023A +ENCODING 570 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +01 +3E +63 +67 +6B +73 +7F +63 +63 +E3 +63 +63 +ENDCHAR +STARTCHAR uni023B +ENCODING 571 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -2 +BITMAP +02 +02 +7E +C4 +C8 +C8 +D0 +D0 +D0 +E0 +E0 +C0 +7E +80 +80 +ENDCHAR +STARTCHAR uni023C +ENCODING 572 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 -1 +BITMAP +02 +7E +C4 +C8 +D0 +D0 +E0 +C0 +7E +80 +ENDCHAR +STARTCHAR uni023D +ENCODING 573 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +60 +60 +60 +60 +60 +F0 +60 +60 +60 +60 +7F +ENDCHAR +STARTCHAR uni023E +ENCODING 574 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +FF +1A +1C +1C +18 +18 +18 +38 +58 +58 +98 +ENDCHAR +STARTCHAR uni023F +ENCODING 575 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +7E +C0 +C0 +70 +1C +06 +06 +FC +30 +18 +0E +ENDCHAR +STARTCHAR uni0240 +ENCODING 576 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +FE +06 +0C +18 +30 +60 +C0 +E0 +30 +18 +0E +ENDCHAR +STARTCHAR uni0241 +ENCODING 577 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7C +C6 +06 +06 +06 +1C +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni0242 +ENCODING 578 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +7C +C6 +06 +06 +1C +30 +30 +30 +ENDCHAR +STARTCHAR uni0243 +ENCODING 579 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +7E +63 +63 +63 +63 +7E +63 +FB +63 +63 +7E +ENDCHAR +STARTCHAR uni0244 +ENCODING 580 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +66 +66 +66 +66 +66 +FF +66 +66 +66 +66 +3C +ENDCHAR +STARTCHAR uni0245 +ENCODING 581 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +18 +18 +3C +3C +3C +66 +66 +66 +C3 +C3 +C3 +ENDCHAR +STARTCHAR uni0246 +ENCODING 582 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -1 +BITMAP +02 +FE +C4 +C8 +C8 +D0 +FC +E0 +E0 +C0 +C0 +FE +80 +ENDCHAR +STARTCHAR uni0247 +ENCODING 583 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +01 +3E +67 +6B +73 +7F +60 +60 +BF +ENDCHAR +STARTCHAR uni0248 +ENCODING 584 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 2 0 +BITMAP +3C +18 +18 +18 +18 +3C +18 +18 +18 +18 +F0 +ENDCHAR +STARTCHAR uni0249 +ENCODING 585 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 13 2 -3 +BITMAP +30 +00 +F0 +30 +30 +30 +78 +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR uni024A +ENCODING 586 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 14 0 -3 +BITMAP +7E00 +C600 +C600 +C600 +C600 +C600 +C600 +C600 +C600 +C600 +7E00 +0600 +0600 +0380 +ENDCHAR +STARTCHAR uni024B +ENCODING 587 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 11 0 -3 +BITMAP +7E00 +C600 +C600 +C600 +C600 +C600 +C600 +7E00 +0600 +0600 +0380 +ENDCHAR +STARTCHAR uni024C +ENCODING 588 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +7E +63 +63 +63 +63 +FE +70 +78 +6C +66 +63 +ENDCHAR +STARTCHAR uni024D +ENCODING 589 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +7E +63 +60 +60 +F0 +60 +60 +60 +ENDCHAR +STARTCHAR uni024E +ENCODING 590 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +C3 +C3 +66 +FF +3C +3C +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni024F +ENCODING 591 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +66 +66 +66 +FF +66 +66 +66 +3E +06 +06 +7C +ENDCHAR +STARTCHAR uni0250 +ENCODING 592 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +FC +C6 +C6 +C6 +FC +C0 +C0 +7C +ENDCHAR +STARTCHAR uni0251 +ENCODING 593 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +76 +CE +C6 +C6 +C6 +C6 +CE +76 +ENDCHAR +STARTCHAR uni0252 +ENCODING 594 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +DC +E6 +C6 +C6 +C6 +C6 +E6 +DC +ENDCHAR +STARTCHAR uni0253 +ENCODING 595 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +70 +C0 +C0 +FC +C6 +C6 +C6 +C6 +C6 +C6 +FC +ENDCHAR +STARTCHAR uni0254 +ENCODING 596 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 2 0 +BITMAP +F8 +0C +0C +0C +0C +0C +0C +F8 +ENDCHAR +STARTCHAR uni0255 +ENCODING 597 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 9 1 -1 +BITMAP +3E +60 +C0 +C0 +C0 +CC +7A +3C +08 +ENDCHAR +STARTCHAR uni0256 +ENCODING 598 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 13 0 -2 +BITMAP +0600 +0600 +0600 +7E00 +C600 +C600 +C600 +C600 +C600 +C600 +7E00 +0600 +0380 +ENDCHAR +STARTCHAR uni0257 +ENCODING 599 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 11 0 0 +BITMAP +0380 +0600 +0600 +7600 +CE00 +C600 +C600 +C600 +C600 +CE00 +7600 +ENDCHAR +STARTCHAR uni0258 +ENCODING 600 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +7C +C6 +C6 +C6 +FE +06 +06 +FC +ENDCHAR +STARTCHAR uni0259 +ENCODING 601 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +FC +06 +06 +FE +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni025A +ENCODING 602 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 8 0 0 +BITMAP +7000 +1B00 +0F00 +1D80 +7C00 +CC00 +6C00 +3800 +ENDCHAR +STARTCHAR uni025B +ENCODING 603 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +7E +C0 +C0 +7C +C0 +C0 +C0 +7E +ENDCHAR +STARTCHAR uni025C +ENCODING 604 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +FC +06 +06 +7C +06 +06 +06 +FC +ENDCHAR +STARTCHAR uni025D +ENCODING 605 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 8 0 0 +BITMAP +FD00 +0700 +0680 +7C00 +0600 +0600 +0600 +FC00 +ENDCHAR +STARTCHAR uni025E +ENCODING 606 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +7C +C6 +C6 +DC +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni025F +ENCODING 607 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 2 -3 +BITMAP +F0 +30 +30 +30 +30 +78 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR uni0260 +ENCODING 608 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 12 0 -3 +BITMAP +0380 +7E00 +C600 +C600 +C600 +C600 +C600 +C600 +7E00 +0600 +0600 +FC00 +ENDCHAR +STARTCHAR uni0261 +ENCODING 609 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +7E +C6 +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +FC +ENDCHAR +STARTCHAR uni0262 +ENCODING 610 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +7E +C0 +C0 +C0 +DE +C6 +C6 +7C +ENDCHAR +STARTCHAR uni0263 +ENCODING 611 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +C3 +66 +3C +3C +18 +18 +3C +3C +66 +66 +3C +ENDCHAR +STARTCHAR uni0264 +ENCODING 612 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +C3 +66 +3C +18 +3C +66 +66 +3C +ENDCHAR +STARTCHAR uni0265 +ENCODING 613 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +06 +ENDCHAR +STARTCHAR uni0266 +ENCODING 614 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +70 +C0 +C0 +C0 +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR uni0267 +ENCODING 615 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -1 +BITMAP +70 +C0 +C0 +C0 +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +1C +ENDCHAR +STARTCHAR uni0268 +ENCODING 616 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 2 0 +BITMAP +30 +00 +F0 +30 +30 +30 +78 +30 +30 +FC +ENDCHAR +STARTCHAR uni0269 +ENCODING 617 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 8 3 0 +BITMAP +E0 +60 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR uni026A +ENCODING 618 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +FC +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni026B +ENCODING 619 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +38 +18 +18 +18 +18 +7B +DE +18 +18 +18 +0E +ENDCHAR +STARTCHAR uni026C +ENCODING 620 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +70 +30 +30 +30 +70 +B0 +7C +30 +30 +30 +1C +ENDCHAR +STARTCHAR uni026D +ENCODING 621 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 13 2 -2 +BITMAP +E0 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR uni026E +ENCODING 622 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +E0 +60 +60 +7F +63 +66 +6C +7C +66 +63 +3B +03 +36 +1C +ENDCHAR +STARTCHAR uni026F +ENCODING 623 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +DB +DB +DB +DB +DB +DB +DB +7F +ENDCHAR +STARTCHAR uni0270 +ENCODING 624 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +DB +DB +DB +DB +DB +DB +DB +7F +03 +03 +03 +ENDCHAR +STARTCHAR uni0271 +ENCODING 625 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +FE +DB +DB +DB +DB +DB +DB +DB +03 +03 +0E +ENDCHAR +STARTCHAR uni0272 +ENCODING 626 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +3E +33 +33 +33 +33 +33 +33 +33 +30 +30 +E0 +ENDCHAR +STARTCHAR uni0273 +ENCODING 627 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 11 0 -3 +BITMAP +FC00 +C600 +C600 +C600 +C600 +C600 +C600 +C600 +0600 +0600 +0380 +ENDCHAR +STARTCHAR uni0274 +ENCODING 628 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +E6 +E6 +F6 +F6 +DE +DE +CE +CE +ENDCHAR +STARTCHAR uni0275 +ENCODING 629 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +7C +C6 +C6 +FE +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni0276 +ENCODING 630 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +7F +D8 +D8 +DF +D8 +D8 +D8 +7F +ENDCHAR +STARTCHAR uni0277 +ENCODING 631 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +3C +66 +C3 +C3 +DB +DB +DB +66 +ENDCHAR +STARTCHAR uni0278 +ENCODING 632 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +18 +18 +18 +3C +7E +DB +DB +DB +DB +7E +3C +18 +18 +18 +ENDCHAR +STARTCHAR uni0279 +ENCODING 633 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +06 +06 +06 +06 +06 +06 +C6 +7E +ENDCHAR +STARTCHAR uni027A +ENCODING 634 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +06 +06 +06 +06 +06 +06 +06 +06 +06 +C6 +7E +ENDCHAR +STARTCHAR uni027B +ENCODING 635 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 11 0 -3 +BITMAP +0600 +0600 +0600 +0600 +0600 +0600 +C600 +7E00 +0600 +0600 +0380 +ENDCHAR +STARTCHAR uni027C +ENCODING 636 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +FC +C6 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni027D +ENCODING 637 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +FC +C6 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +70 +ENDCHAR +STARTCHAR uni027E +ENCODING 638 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +3E +60 +60 +60 +60 +60 +60 +F0 +ENDCHAR +STARTCHAR uni027F +ENCODING 639 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +F8 +0C +0C +0C +0C +0C +0C +1E +ENDCHAR +STARTCHAR uni0280 +ENCODING 640 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +FC +C6 +C6 +C6 +FC +D8 +CC +C6 +ENDCHAR +STARTCHAR uni0281 +ENCODING 641 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +C6 +CC +D8 +FC +C6 +C6 +C6 +FC +ENDCHAR +STARTCHAR uni0282 +ENCODING 642 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +7E +C0 +C0 +70 +1C +06 +06 +FC +C0 +C0 +70 +ENDCHAR +STARTCHAR uni0283 +ENCODING 643 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +1C +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR uni0284 +ENCODING 644 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 2 -3 +BITMAP +1C +30 +30 +F0 +30 +30 +30 +FC +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR uni0285 +ENCODING 645 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +E0 +30 +30 +30 +30 +30 +30 +30 +30 +30 +1C +ENDCHAR +STARTCHAR uni0286 +ENCODING 646 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +1C +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +78 +A0 +40 +ENDCHAR +STARTCHAR uni0287 +ENCODING 647 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +F8 +0C +0C +0C +0C +0C +0C +7E +0C +0C +0C +ENDCHAR +STARTCHAR uni0288 +ENCODING 648 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +60 +60 +60 +FC +60 +60 +60 +60 +60 +60 +60 +60 +60 +3C +ENDCHAR +STARTCHAR uni0289 +ENCODING 649 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +66 +66 +66 +66 +FF +66 +66 +3C +ENDCHAR +STARTCHAR uni028A +ENCODING 650 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +E7 +24 +66 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uni028B +ENCODING 651 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +CC +C6 +C6 +C6 +C6 +C6 +CC +78 +ENDCHAR +STARTCHAR uni028C +ENCODING 652 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +18 +18 +3C +3C +66 +66 +C3 +C3 +ENDCHAR +STARTCHAR uni028D +ENCODING 653 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +66 +66 +FF +FF +DB +DB +C3 +C3 +ENDCHAR +STARTCHAR uni028E +ENCODING 654 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FC +06 +06 +7E +C6 +C6 +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR uni028F +ENCODING 655 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +C3 +66 +3C +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni0290 +ENCODING 656 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 1 -3 +BITMAP +FE +06 +0C +18 +30 +60 +C0 +FE +06 +06 +03 +ENDCHAR +STARTCHAR uni0291 +ENCODING 657 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 9 1 -1 +BITMAP +FE +06 +0C +18 +30 +64 +CA +FC +08 +ENDCHAR +STARTCHAR uni0292 +ENCODING 658 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +FE +06 +0C +18 +38 +0C +06 +06 +06 +CC +78 +ENDCHAR +STARTCHAR uni0293 +ENCODING 659 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +FE +06 +0C +18 +38 +0C +06 +06 +76 +CC +76 +ENDCHAR +STARTCHAR uni0294 +ENCODING 660 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7C +C6 +06 +06 +06 +1C +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni0295 +ENCODING 661 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7C +C6 +C0 +C0 +C0 +70 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni0296 +ENCODING 662 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +30 +30 +30 +30 +30 +1C +06 +06 +06 +C6 +7C +ENDCHAR +STARTCHAR uni0297 +ENCODING 663 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +3E +60 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +60 +3E +ENDCHAR +STARTCHAR uni0298 +ENCODING 664 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7C +C6 +C6 +C6 +C6 +D6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni0299 +ENCODING 665 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +FC +C6 +C6 +FC +C6 +C6 +C6 +FC +ENDCHAR +STARTCHAR uni029A +ENCODING 666 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +7C +C6 +C6 +76 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni029B +ENCODING 667 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +06 +08 +3E +60 +C0 +C0 +DE +C6 +66 +3C +ENDCHAR +STARTCHAR uni029C +ENCODING 668 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR uni029D +ENCODING 669 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -3 +BITMAP +18 +00 +78 +18 +18 +18 +18 +18 +18 +18 +7C +D8 +70 +ENDCHAR +STARTCHAR uni029E +ENCODING 670 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +C6 +66 +36 +1E +1E +36 +66 +C6 +06 +06 +06 +ENDCHAR +STARTCHAR uni029F +ENCODING 671 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FE +ENDCHAR +STARTCHAR uni02A0 +ENCODING 672 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 13 0 -3 +BITMAP +0380 +0600 +7E00 +C600 +C600 +C600 +C600 +C600 +C600 +7E00 +0600 +0600 +0600 +ENDCHAR +STARTCHAR uni02A1 +ENCODING 673 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7C +C6 +06 +06 +06 +1C +30 +30 +78 +30 +30 +ENDCHAR +STARTCHAR uni02A2 +ENCODING 674 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7C +C6 +C0 +C0 +C0 +70 +18 +18 +3C +18 +18 +ENDCHAR +STARTCHAR uni02A3 +ENCODING 675 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +18 +18 +18 +7F +DB +DB +DE +DE +DC +DC +7F +ENDCHAR +STARTCHAR uni02A4 +ENCODING 676 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +18 +18 +18 +7F +DB +DE +DE +DC +DE +DB +7B +03 +1B +0E +ENDCHAR +STARTCHAR uni02A5 +ENCODING 677 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 -2 +BITMAP +10 +10 +10 +7E +D6 +D6 +D6 +DC +DC +DF +7D +06 +04 +ENDCHAR +STARTCHAR uni02A6 +ENCODING 678 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +60 +60 +60 +F7 +6C +6C +66 +63 +63 +63 +3E +ENDCHAR +STARTCHAR uni02A7 +ENCODING 679 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +67 +6C +6C +FC +6C +6C +6C +6C +6C +6C +3C +0C +0C +38 +ENDCHAR +STARTCHAR uni02A8 +ENCODING 680 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 -1 +BITMAP +60 +60 +60 +F6 +6D +6C +6C +6C +6E +6D +3E +04 +ENDCHAR +STARTCHAR uni02A9 +ENCODING 681 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +3C +60 +60 +FE +6D +6D +6D +6D +6D +6D +6D +01 +01 +06 +ENDCHAR +STARTCHAR uni02AA +ENCODING 682 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +E0 +60 +60 +67 +6C +6C +66 +63 +63 +63 +3E +ENDCHAR +STARTCHAR uni02AB +ENCODING 683 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +E0 +60 +60 +7F +63 +66 +66 +6C +6C +78 +3F +ENDCHAR +STARTCHAR uni02AC +ENCODING 684 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +C6 +D6 +D6 +7C +6C +00 +C6 +D6 +D6 +7C +6C +ENDCHAR +STARTCHAR uni02AD +ENCODING 685 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 2 0 +BITMAP +FC +CC +CC +CC +CC +00 +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni02AE +ENCODING 686 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +E0 +30 +30 +33 +33 +33 +33 +33 +33 +33 +1F +03 +03 +03 +ENDCHAR +STARTCHAR uni02AF +ENCODING 687 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 14 0 -3 +BITMAP +E000 +3000 +3000 +3600 +3600 +3600 +3600 +3600 +3600 +3600 +1E00 +0600 +0600 +0380 +ENDCHAR +STARTCHAR uni02BB +ENCODING 699 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 2 2 2 12 +BITMAP +40 +80 +ENDCHAR +STARTCHAR afii57929 +ENCODING 700 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 2 2 4 12 +BITMAP +40 +80 +ENDCHAR +STARTCHAR afii64937 +ENCODING 701 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 2 2 2 12 +BITMAP +80 +40 +ENDCHAR +STARTCHAR circumflex +ENCODING 710 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 4 2 2 12 +BITMAP +40 +B0 +ENDCHAR +STARTCHAR caron +ENCODING 711 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 4 2 2 12 +BITMAP +B0 +40 +ENDCHAR +STARTCHAR breve +ENCODING 728 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 2 1 12 +BITMAP +84 +78 +ENDCHAR +STARTCHAR dotaccent +ENCODING 729 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 1 2 4 12 +BITMAP +80 +80 +ENDCHAR +STARTCHAR ring +ENCODING 730 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 4 4 2 10 +BITMAP +40 +B0 +40 +40 +ENDCHAR +STARTCHAR ogonek +ENCODING 731 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 3 4 2 -2 +BITMAP +40 +80 +60 +60 +ENDCHAR +STARTCHAR tilde +ENCODING 732 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 4 1 10 +BITMAP +44 +B4 +88 +88 +ENDCHAR +STARTCHAR hungarumlaut +ENCODING 733 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 2 1 12 +BITMAP +44 +88 +ENDCHAR +STARTCHAR gravecomb +ENCODING 768 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 2 2 2 12 +BITMAP +80 +40 +ENDCHAR +STARTCHAR acutecomb +ENCODING 769 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 2 2 4 12 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0302 +ENCODING 770 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 4 2 2 12 +BITMAP +40 +B0 +ENDCHAR +STARTCHAR tildecomb +ENCODING 771 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 4 1 10 +BITMAP +44 +B4 +88 +88 +ENDCHAR +STARTCHAR uni0306 +ENCODING 774 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 2 1 12 +BITMAP +84 +78 +ENDCHAR +STARTCHAR uni0307 +ENCODING 775 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 1 1 4 13 +BITMAP +80 +ENDCHAR +STARTCHAR uni0308 +ENCODING 776 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 4 1 2 13 +BITMAP +B0 +ENDCHAR +STARTCHAR uni030C +ENCODING 780 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 4 2 2 12 +BITMAP +B0 +40 +ENDCHAR +STARTCHAR uni0329 +ENCODING 809 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 1 2 2 0 +BITMAP +80 +80 +ENDCHAR +STARTCHAR uni0370 +ENCODING 880 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +FE +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni0371 +ENCODING 881 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +C0 +C0 +C0 +FE +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni0372 +ENCODING 882 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +FF +DB +DB +DB +DB +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni0373 +ENCODING 883 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +FC +B4 +B4 +B4 +B4 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni0374 +ENCODING 884 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 3 3 10 +BITMAP +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni0375 +ENCODING 885 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 3 3 -3 +BITMAP +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni0376 +ENCODING 886 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +C7 +C7 +CF +CF +DF +DB +FB +F3 +F3 +E3 +E3 +ENDCHAR +STARTCHAR uni0377 +ENCODING 887 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +CE +CE +DE +DE +F6 +F6 +E6 +E6 +ENDCHAR +STARTCHAR uni037B +ENCODING 891 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +FC +06 +06 +06 +06 +06 +06 +FC +ENDCHAR +STARTCHAR uni037C +ENCODING 892 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +7E +C0 +C0 +D8 +C0 +C0 +C0 +7E +ENDCHAR +STARTCHAR uni037D +ENCODING 893 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +FC +06 +06 +36 +06 +06 +06 +FC +ENDCHAR +STARTCHAR uni037E +ENCODING 894 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 2 10 3 -3 +BITMAP +C0 +C0 +00 +00 +00 +C0 +C0 +40 +40 +80 +ENDCHAR +STARTCHAR uni037F +ENCODING 895 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 2 0 +BITMAP +3C +18 +18 +18 +18 +18 +18 +18 +18 +18 +F0 +ENDCHAR +STARTCHAR tonos +ENCODING 900 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 3 3 3 10 +BITMAP +60 +60 +C0 +ENDCHAR +STARTCHAR dieresistonos +ENCODING 901 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 6 5 1 8 +BITMAP +18 +18 +30 +00 +CC +ENDCHAR +STARTCHAR Alphatonos +ENCODING 902 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +60 +C0 +18 +18 +3C +3C +3C +66 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR anoteleia +ENCODING 903 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 2 2 3 4 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR Epsilontonos +ENCODING 904 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +60 +C0 +00 +7F +60 +60 +60 +7E +60 +60 +60 +60 +7F +ENDCHAR +STARTCHAR Etatonos +ENCODING 905 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +60 +C0 +00 +63 +63 +63 +63 +7F +63 +63 +63 +63 +63 +ENDCHAR +STARTCHAR Iotatonos +ENCODING 906 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +60 +C0 +00 +7E +18 +18 +18 +18 +18 +18 +18 +18 +7E +ENDCHAR +STARTCHAR Omicrontonos +ENCODING 908 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +60 +C0 +3C +66 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR Upsilontonos +ENCODING 910 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +60 +C0 +00 +C3 +C3 +66 +66 +3C +3C +18 +18 +18 +18 +ENDCHAR +STARTCHAR Omegatonos +ENCODING 911 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +60 +C0 +3C +66 +C3 +C3 +C3 +C3 +C3 +C3 +66 +24 +E7 +ENDCHAR +STARTCHAR iotadieresistonos +ENCODING 912 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 6 13 2 0 +BITMAP +30 +60 +00 +D8 +00 +70 +30 +30 +30 +30 +30 +30 +1C +ENDCHAR +STARTCHAR Alpha +ENCODING 913 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7C +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR Beta +ENCODING 914 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FC +C6 +C6 +C6 +C6 +FC +C6 +C6 +C6 +C6 +FC +ENDCHAR +STARTCHAR Gamma +ENCODING 915 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FE +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Delta +ENCODING 916 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +18 +18 +3C +3C +3C +66 +66 +66 +C3 +C3 +FF +ENDCHAR +STARTCHAR Epsilon +ENCODING 917 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FE +C0 +C0 +C0 +C0 +FC +C0 +C0 +C0 +C0 +FE +ENDCHAR +STARTCHAR Zeta +ENCODING 918 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FE +06 +0C +0C +18 +18 +30 +30 +60 +60 +FE +ENDCHAR +STARTCHAR Eta +ENCODING 919 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +C6 +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR Theta +ENCODING 920 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7C +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR Iota +ENCODING 921 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 0 0 +BITMAP +FC +30 +30 +30 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR Kappa +ENCODING 922 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +C6 +CC +D8 +F0 +E0 +C0 +E0 +F0 +D8 +CC +C6 +ENDCHAR +STARTCHAR Lambda +ENCODING 923 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +18 +18 +3C +3C +3C +66 +66 +66 +C3 +C3 +C3 +ENDCHAR +STARTCHAR Mu +ENCODING 924 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +C3 +C3 +E7 +E7 +FF +DB +DB +C3 +C3 +C3 +C3 +ENDCHAR +STARTCHAR Nu +ENCODING 925 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +C6 +C6 +E6 +E6 +F6 +D6 +DE +CE +CE +C6 +C6 +ENDCHAR +STARTCHAR Xi +ENCODING 926 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FE +00 +00 +00 +00 +7C +00 +00 +00 +00 +FE +ENDCHAR +STARTCHAR Omicron +ENCODING 927 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR Pi +ENCODING 928 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FE +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR Rho +ENCODING 929 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FC +C6 +C6 +C6 +C6 +C6 +FC +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Sigma +ENCODING 931 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FE +C0 +60 +30 +18 +0C +18 +30 +60 +C0 +FE +ENDCHAR +STARTCHAR Tau +ENCODING 932 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +FF +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR Upsilon +ENCODING 933 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +C3 +C3 +66 +66 +3C +3C +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR Phi +ENCODING 934 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +18 +3C +7E +DB +DB +DB +DB +DB +7E +3C +18 +ENDCHAR +STARTCHAR Chi +ENCODING 935 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +C3 +66 +66 +3C +3C +18 +3C +3C +66 +66 +C3 +ENDCHAR +STARTCHAR Psi +ENCODING 936 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +DB +DB +DB +DB +DB +DB +DB +7E +3C +18 +18 +ENDCHAR +STARTCHAR Omega +ENCODING 937 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +3C +66 +C3 +C3 +C3 +C3 +C3 +C3 +66 +24 +E7 +ENDCHAR +STARTCHAR Iotadieresis +ENCODING 938 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +CC +00 +FC +30 +30 +30 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR Upsilondieresis +ENCODING 939 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +66 +00 +C3 +C3 +66 +66 +3C +3C +1C +18 +18 +18 +18 +ENDCHAR +STARTCHAR alphatonos +ENCODING 940 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +0C +0C +18 +00 +73 +DE +DE +CC +CC +DE +DE +73 +ENDCHAR +STARTCHAR epsilontonos +ENCODING 941 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +18 +18 +30 +00 +7E +C0 +C0 +7C +C0 +C0 +C0 +7E +ENDCHAR +STARTCHAR etatonos +ENCODING 942 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +18 +18 +30 +00 +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +06 +06 +06 +ENDCHAR +STARTCHAR iotatonos +ENCODING 943 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 12 2 0 +BITMAP +30 +30 +60 +00 +E0 +60 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR upsilondieresistonos +ENCODING 944 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +18 +30 +00 +CC +00 +CC +C6 +C6 +C6 +C6 +C6 +CC +78 +ENDCHAR +STARTCHAR alpha +ENCODING 945 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +73 +DE +DE +CC +CC +DE +DE +73 +ENDCHAR +STARTCHAR beta +ENCODING 946 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +3C +66 +C6 +C6 +CC +F8 +CC +C6 +C6 +E6 +DC +C0 +C0 +C0 +ENDCHAR +STARTCHAR gamma +ENCODING 947 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +C6 +66 +66 +3C +3C +3C +18 +18 +18 +30 +30 +ENDCHAR +STARTCHAR delta +ENCODING 948 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +3C +60 +60 +38 +6C +C6 +C6 +C6 +C6 +6C +38 +ENDCHAR +STARTCHAR epsilon +ENCODING 949 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +7E +C0 +C0 +7C +C0 +C0 +C0 +7E +ENDCHAR +STARTCHAR zeta +ENCODING 950 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +FE +0C +18 +30 +60 +60 +C0 +C0 +C0 +60 +3C +06 +06 +0C +ENDCHAR +STARTCHAR eta +ENCODING 951 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +06 +06 +06 +ENDCHAR +STARTCHAR theta +ENCODING 952 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +38 +6C +6C +C6 +C6 +FE +C6 +C6 +6C +6C +38 +ENDCHAR +STARTCHAR iota +ENCODING 953 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 8 3 0 +BITMAP +E0 +60 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR kappa +ENCODING 954 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +C6 +CC +D8 +F0 +F0 +D8 +CC +C6 +ENDCHAR +STARTCHAR lambda +ENCODING 955 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +30 +30 +18 +18 +18 +3C +3C +6C +66 +C6 +C6 +ENDCHAR +STARTCHAR mu +ENCODING 956 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +C6 +C6 +C6 +C6 +C6 +C6 +E6 +DB +C0 +C0 +C0 +ENDCHAR +STARTCHAR nu +ENCODING 957 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +CC +C6 +66 +66 +3C +3C +18 +18 +ENDCHAR +STARTCHAR xi +ENCODING 958 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +FE +60 +C0 +C0 +60 +3C +60 +C0 +C0 +60 +3C +06 +06 +1C +ENDCHAR +STARTCHAR omicron +ENCODING 959 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR pi +ENCODING 960 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +FE +6C +6C +6C +6C +6C +6C +66 +ENDCHAR +STARTCHAR rho +ENCODING 961 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +38 +6C +C6 +C6 +C6 +C6 +EC +D8 +C0 +C0 +C0 +ENDCHAR +STARTCHAR sigma1 +ENCODING 962 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +7E +C0 +C0 +C0 +C0 +C0 +C0 +7C +06 +06 +1C +ENDCHAR +STARTCHAR sigma +ENCODING 963 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +3F +6C +C6 +C6 +C6 +C6 +6C +38 +ENDCHAR +STARTCHAR tau +ENCODING 964 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +FC +30 +30 +30 +30 +30 +30 +1C +ENDCHAR +STARTCHAR upsilon +ENCODING 965 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +CC +C6 +C6 +C6 +C6 +C6 +CC +78 +ENDCHAR +STARTCHAR phi +ENCODING 966 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +4E +DB +DB +DB +DB +DB +7E +3C +18 +18 +18 +ENDCHAR +STARTCHAR chi +ENCODING 967 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +C3 +66 +66 +3C +3C +18 +3C +3C +66 +66 +C3 +ENDCHAR +STARTCHAR psi +ENCODING 968 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +DB +DB +DB +DB +DB +7F +7E +3C +18 +18 +18 +ENDCHAR +STARTCHAR omega +ENCODING 969 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +66 +C3 +C3 +C3 +DB +DB +DB +66 +ENDCHAR +STARTCHAR iotadieresis +ENCODING 970 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 2 0 +BITMAP +D8 +00 +00 +70 +30 +30 +30 +30 +30 +30 +1C +ENDCHAR +STARTCHAR upsilondieresis +ENCODING 971 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +6C +00 +00 +CC +C6 +C6 +C6 +C6 +C6 +CC +78 +ENDCHAR +STARTCHAR omicrontonos +ENCODING 972 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +18 +18 +30 +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR upsilontonos +ENCODING 973 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +18 +18 +30 +00 +CC +C6 +C6 +C6 +C6 +C6 +CC +78 +ENDCHAR +STARTCHAR omegatonos +ENCODING 974 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +0C +0C +18 +00 +66 +C3 +C3 +C3 +DB +DB +DB +66 +ENDCHAR +STARTCHAR uni03CF +ENCODING 975 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +C6 +CC +D8 +F0 +E0 +C0 +E0 +F0 +D8 +CC +C6 +0C +18 +ENDCHAR +STARTCHAR uni03D0 +ENCODING 976 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7C +C6 +C6 +C6 +CC +F8 +CC +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR theta1 +ENCODING 977 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +38 +6C +66 +66 +36 +1E +C6 +C6 +C6 +6C +38 +ENDCHAR +STARTCHAR Upsilon1 +ENCODING 978 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +C2 +67 +35 +34 +1C +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni03D3 +ENCODING 979 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +60 +C0 +02 +67 +35 +34 +1C +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni03D4 +ENCODING 980 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +66 +00 +C2 +67 +35 +34 +1C +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR phi1 +ENCODING 981 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +18 +18 +18 +3C +7E +DB +DB +DB +DB +7E +3C +18 +18 +18 +ENDCHAR +STARTCHAR omega1 +ENCODING 982 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +FF +66 +C3 +C3 +DB +DB +DB +66 +ENDCHAR +STARTCHAR uni03D7 +ENCODING 983 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +63 +B6 +1C +18 +18 +38 +6C +C7 +03 +03 +0E +ENDCHAR +STARTCHAR uni03D8 +ENCODING 984 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +10 +10 +10 +ENDCHAR +STARTCHAR uni03D9 +ENCODING 985 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +10 +10 +10 +ENDCHAR +STARTCHAR uni03DA +ENCODING 986 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +7C +C6 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +78 +0E +03 +0E +ENDCHAR +STARTCHAR uni03DB +ENCODING 987 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +7C +C6 +C0 +C0 +C0 +C0 +C0 +78 +0E +03 +0E +ENDCHAR +STARTCHAR uni03DC +ENCODING 988 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FE +C0 +C0 +C0 +C0 +FC +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni03DD +ENCODING 989 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +1E +30 +30 +30 +30 +30 +3C +30 +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR uni03DE +ENCODING 990 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -1 +BITMAP +60 +30 +30 +60 +6E +FE +EC +0C +18 +18 +0C +ENDCHAR +STARTCHAR uni03DF +ENCODING 991 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +60 +60 +60 +C0 +C0 +FE +06 +06 +0C +0C +0C +ENDCHAR +STARTCHAR uni03E0 +ENCODING 992 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +78 +FC +B6 +36 +37 +0F +0F +1B +1B +1B +1B +06 +06 +0C +ENDCHAR +STARTCHAR uni03E1 +ENCODING 993 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 -3 +BITMAP +E0 +30 +18 +18 +2C +2C +56 +56 +A6 +06 +06 +06 +ENDCHAR +STARTCHAR uni03E2 +ENCODING 994 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +66 +C3 +C3 +C3 +C3 +DB +DB +DB +DB +DB +66 +06 +0C +38 +ENDCHAR +STARTCHAR uni03E3 +ENCODING 995 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +66 +C3 +C3 +C3 +DB +DB +DB +66 +06 +0C +38 +ENDCHAR +STARTCHAR uni03E4 +ENCODING 996 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +66 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +6E +36 +06 +06 +06 +ENDCHAR +STARTCHAR uni03E5 +ENCODING 997 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +66 +C6 +C6 +C6 +C6 +C6 +6E +36 +06 +06 +06 +ENDCHAR +STARTCHAR uni03E6 +ENCODING 998 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +C0 +C0 +C0 +D8 +EC +C6 +C6 +C6 +C6 +C6 +C6 +06 +0C +38 +ENDCHAR +STARTCHAR uni03E7 +ENCODING 999 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +7B +C6 +CE +7E +06 +06 +6C +B8 +ENDCHAR +STARTCHAR uni03E8 +ENCODING 1000 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +F8 +0C +06 +06 +06 +0C +0C +18 +30 +60 +C0 +C0 +60 +3E +ENDCHAR +STARTCHAR uni03E9 +ENCODING 1001 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +FC +06 +06 +0C +18 +30 +60 +C0 +C0 +60 +3E +ENDCHAR +STARTCHAR uni03EA +ENCODING 1002 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +E7 +3C +3C +18 +18 +18 +3C +3C +66 +66 +FF +ENDCHAR +STARTCHAR uni03EB +ENCODING 1003 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +E7 +3C +18 +18 +3C +3C +66 +FF +ENDCHAR +STARTCHAR uni03EC +ENCODING 1004 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +03 +3E +60 +C0 +DC +E6 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uni03ED +ENCODING 1005 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +06 +3C +60 +C0 +D8 +EC +C6 +C6 +C6 +6C +38 +ENDCHAR +STARTCHAR uni03EE +ENCODING 1006 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +18 +18 +FF +DB +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni03EF +ENCODING 1007 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +30 +30 +FC +B4 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni03F0 +ENCODING 1008 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +63 +B6 +1C +18 +18 +38 +6C +C7 +ENDCHAR +STARTCHAR uni03F1 +ENCODING 1009 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +38 +6C +C6 +C6 +C6 +C6 +EC +D8 +C0 +60 +3E +ENDCHAR +STARTCHAR uni03F2 +ENCODING 1010 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +7E +C0 +C0 +C0 +C0 +C0 +C0 +7E +ENDCHAR +STARTCHAR uni03F3 +ENCODING 1011 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 14 2 -3 +BITMAP +30 +00 +00 +F0 +30 +30 +30 +30 +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR uni03F4 +ENCODING 1012 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7C +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni03F5 +ENCODING 1013 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +3E +60 +C0 +FC +C0 +C0 +60 +3E +ENDCHAR +STARTCHAR uni03F6 +ENCODING 1014 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +F8 +0C +06 +7E +06 +06 +0C +F8 +ENDCHAR +STARTCHAR uni03F7 +ENCODING 1015 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +C0 +C0 +F8 +CC +C6 +C6 +C6 +CC +F8 +C0 +C0 +ENDCHAR +STARTCHAR uni03F8 +ENCODING 1016 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +C0 +C0 +C0 +D8 +EC +C6 +C6 +C6 +C6 +EC +D8 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni03F9 +ENCODING 1017 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +3E +60 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +60 +3E +ENDCHAR +STARTCHAR uni03FA +ENCODING 1018 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +C3 +E7 +FF +DB +C3 +C3 +C3 +C3 +C3 +C3 +C3 +ENDCHAR +STARTCHAR uni03FB +ENCODING 1019 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +C3 +E7 +FF +DB +C3 +C3 +C3 +C3 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni03FC +ENCODING 1020 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +1C +36 +63 +63 +63 +63 +76 +6C +60 +F0 +60 +ENDCHAR +STARTCHAR uni03FD +ENCODING 1021 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FC +06 +06 +06 +06 +06 +06 +06 +06 +06 +FC +ENDCHAR +STARTCHAR uni03FE +ENCODING 1022 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7E +C0 +C0 +C0 +C0 +D8 +C0 +C0 +C0 +C0 +7E +ENDCHAR +STARTCHAR uni03FF +ENCODING 1023 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FC +06 +06 +06 +06 +36 +06 +06 +06 +06 +FC +ENDCHAR +STARTCHAR uni0400 +ENCODING 1024 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +30 +18 +00 +FE +C0 +C0 +C0 +FC +C0 +C0 +C0 +C0 +FE +ENDCHAR +STARTCHAR afii10023 +ENCODING 1025 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +00 +FE +C0 +C0 +C0 +C0 +FC +C0 +C0 +C0 +C0 +FE +ENDCHAR +STARTCHAR afii10051 +ENCODING 1026 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +FC +30 +30 +30 +30 +3E +33 +33 +33 +33 +33 +03 +03 +1E +ENDCHAR +STARTCHAR afii10052 +ENCODING 1027 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +18 +30 +00 +FE +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR afii10053 +ENCODING 1028 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +3E +60 +C0 +C0 +C0 +FC +C0 +C0 +C0 +60 +3E +ENDCHAR +STARTCHAR afii10054 +ENCODING 1029 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7E +C0 +C0 +C0 +C0 +7C +06 +06 +06 +06 +FC +ENDCHAR +STARTCHAR afii10055 +ENCODING 1030 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +FC +30 +30 +30 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR afii10056 +ENCODING 1031 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +CC +00 +FC +30 +30 +30 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR afii10057 +ENCODING 1032 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 2 0 +BITMAP +3C +18 +18 +18 +18 +18 +18 +18 +18 +18 +F0 +ENDCHAR +STARTCHAR afii10058 +ENCODING 1033 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +7C +6C +6C +6C +6C +6E +6D +6D +6D +6D +CE +ENDCHAR +STARTCHAR afii10059 +ENCODING 1034 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +CC +CC +CC +CC +CC +FE +CD +CD +CD +CD +CE +ENDCHAR +STARTCHAR afii10060 +ENCODING 1035 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +FC +30 +30 +30 +36 +3B +33 +33 +33 +33 +33 +ENDCHAR +STARTCHAR afii10061 +ENCODING 1036 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +18 +30 +C6 +CC +D8 +F0 +E0 +C0 +E0 +F0 +D8 +CC +C6 +ENDCHAR +STARTCHAR uni040D +ENCODING 1037 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +30 +18 +C6 +C6 +CE +CE +DE +D6 +F6 +E6 +E6 +C6 +C6 +ENDCHAR +STARTCHAR afii10062 +ENCODING 1038 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +6C +38 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +7C +ENDCHAR +STARTCHAR afii10145 +ENCODING 1039 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 -2 +BITMAP +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +FF +18 +18 +ENDCHAR +STARTCHAR afii10017 +ENCODING 1040 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7C +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR afii10018 +ENCODING 1041 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FC +C0 +C0 +C0 +C0 +FC +C6 +C6 +C6 +C6 +FC +ENDCHAR +STARTCHAR afii10019 +ENCODING 1042 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FC +C6 +C6 +C6 +C6 +FC +C6 +C6 +C6 +C6 +FC +ENDCHAR +STARTCHAR afii10020 +ENCODING 1043 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FE +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR afii10021 +ENCODING 1044 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +3E +36 +36 +36 +36 +36 +66 +66 +66 +FF +C3 +C3 +ENDCHAR +STARTCHAR afii10022 +ENCODING 1045 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FE +C0 +C0 +C0 +C0 +FC +C0 +C0 +C0 +C0 +FE +ENDCHAR +STARTCHAR afii10024 +ENCODING 1046 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +DB +DB +7E +7E +3C +3C +3C +7E +7E +DB +DB +ENDCHAR +STARTCHAR afii10025 +ENCODING 1047 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FC +06 +06 +06 +06 +3C +06 +06 +06 +06 +FC +ENDCHAR +STARTCHAR afii10026 +ENCODING 1048 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +C6 +C6 +CE +CE +DE +D6 +F6 +E6 +E6 +C6 +C6 +ENDCHAR +STARTCHAR afii10027 +ENCODING 1049 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +38 +00 +C6 +CE +CE +DE +DE +F6 +F6 +E6 +E6 +C6 +ENDCHAR +STARTCHAR afii10028 +ENCODING 1050 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +C6 +CC +D8 +F0 +E0 +C0 +E0 +F0 +D8 +CC +C6 +ENDCHAR +STARTCHAR afii10029 +ENCODING 1051 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +7F +63 +63 +63 +63 +63 +63 +63 +63 +63 +C3 +ENDCHAR +STARTCHAR afii10030 +ENCODING 1052 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +C3 +C3 +E7 +E7 +FF +DB +DB +C3 +C3 +C3 +C3 +ENDCHAR +STARTCHAR afii10031 +ENCODING 1053 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +C6 +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR afii10032 +ENCODING 1054 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR afii10033 +ENCODING 1055 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FE +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR afii10034 +ENCODING 1056 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FC +C6 +C6 +C6 +C6 +C6 +FC +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR afii10035 +ENCODING 1057 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7E +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +7E +ENDCHAR +STARTCHAR afii10036 +ENCODING 1058 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +FF +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR afii10037 +ENCODING 1059 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +7C +ENDCHAR +STARTCHAR afii10038 +ENCODING 1060 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +18 +18 +3C +7E +DB +DB +DB +DB +DB +7E +3C +18 +18 +ENDCHAR +STARTCHAR afii10039 +ENCODING 1061 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +C3 +66 +66 +3C +3C +18 +3C +3C +66 +66 +C3 +ENDCHAR +STARTCHAR afii10040 +ENCODING 1062 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 -2 +BITMAP +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +FF +03 +03 +ENDCHAR +STARTCHAR afii10041 +ENCODING 1063 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +06 +06 +06 +ENDCHAR +STARTCHAR afii10042 +ENCODING 1064 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +DB +DB +DB +DB +DB +DB +DB +DB +DB +DB +FF +ENDCHAR +STARTCHAR afii10043 +ENCODING 1065 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 13 0 -2 +BITMAP +DB00 +DB00 +DB00 +DB00 +DB00 +DB00 +DB00 +DB00 +DB00 +DB00 +FF80 +0180 +0180 +ENDCHAR +STARTCHAR afii10044 +ENCODING 1066 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +F0 +30 +30 +30 +30 +3E +33 +33 +33 +33 +3E +ENDCHAR +STARTCHAR afii10045 +ENCODING 1067 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +C3 +C3 +C3 +C3 +C3 +F3 +DB +DB +DB +DB +F3 +ENDCHAR +STARTCHAR afii10046 +ENCODING 1068 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +FC +C6 +C6 +C6 +C6 +FC +ENDCHAR +STARTCHAR afii10047 +ENCODING 1069 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +F8 +0C +06 +06 +06 +7E +06 +06 +06 +0C +F8 +ENDCHAR +STARTCHAR afii10048 +ENCODING 1070 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +CE +DB +DB +DB +DB +FB +DB +DB +DB +DB +CE +ENDCHAR +STARTCHAR afii10049 +ENCODING 1071 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7E +C6 +C6 +C6 +C6 +7E +0E +1E +36 +66 +C6 +ENDCHAR +STARTCHAR afii10065 +ENCODING 1072 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +7C +06 +06 +7E +C6 +C6 +C6 +7E +ENDCHAR +STARTCHAR afii10066 +ENCODING 1073 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +3C +60 +C0 +C0 +D8 +EC +C6 +C6 +C6 +6C +38 +ENDCHAR +STARTCHAR afii10067 +ENCODING 1074 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +FC +C6 +C6 +FC +C6 +C6 +C6 +FC +ENDCHAR +STARTCHAR afii10068 +ENCODING 1075 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +FE +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR afii10069 +ENCODING 1076 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 10 0 -2 +BITMAP +3E +36 +36 +36 +66 +66 +C6 +FF +C3 +C3 +ENDCHAR +STARTCHAR afii10070 +ENCODING 1077 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +7C +C6 +C6 +C6 +FE +C0 +C0 +7E +ENDCHAR +STARTCHAR afii10072 +ENCODING 1078 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +DB +5A +7E +3C +3C +7E +5A +DB +ENDCHAR +STARTCHAR afii10073 +ENCODING 1079 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +FC +06 +06 +3C +06 +06 +06 +FC +ENDCHAR +STARTCHAR afii10074 +ENCODING 1080 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +CE +CE +DE +DE +F6 +F6 +E6 +E6 +ENDCHAR +STARTCHAR afii10075 +ENCODING 1081 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +6C +38 +00 +CE +CE +DE +DE +F6 +F6 +E6 +E6 +ENDCHAR +STARTCHAR afii10076 +ENCODING 1082 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +C6 +CC +D8 +F0 +F0 +D8 +CC +C6 +ENDCHAR +STARTCHAR afii10077 +ENCODING 1083 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +7F +63 +63 +63 +63 +63 +63 +C3 +ENDCHAR +STARTCHAR afii10078 +ENCODING 1084 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +C3 +C3 +E7 +E7 +FF +DB +DB +C3 +ENDCHAR +STARTCHAR afii10079 +ENCODING 1085 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR afii10080 +ENCODING 1086 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR afii10081 +ENCODING 1087 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +FE +C6 +C6 +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR afii10082 +ENCODING 1088 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +FC +C6 +C6 +C6 +C6 +C6 +C6 +FC +C0 +C0 +C0 +ENDCHAR +STARTCHAR afii10083 +ENCODING 1089 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +7E +C0 +C0 +C0 +C0 +C0 +C0 +7E +ENDCHAR +STARTCHAR afii10084 +ENCODING 1090 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +FF +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR afii10085 +ENCODING 1091 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +FC +ENDCHAR +STARTCHAR afii10086 +ENCODING 1092 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +18 +18 +18 +7E +DB +DB +DB +DB +DB +DB +7E +18 +18 +18 +ENDCHAR +STARTCHAR afii10087 +ENCODING 1093 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +C6 +C6 +6C +38 +38 +6C +C6 +C6 +ENDCHAR +STARTCHAR afii10088 +ENCODING 1094 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 -2 +BITMAP +CC +CC +CC +CC +CC +CC +CC +FE +06 +06 +ENDCHAR +STARTCHAR afii10089 +ENCODING 1095 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +C6 +C6 +C6 +C6 +7E +06 +06 +06 +ENDCHAR +STARTCHAR afii10090 +ENCODING 1096 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +DB +DB +DB +DB +DB +DB +DB +FF +ENDCHAR +STARTCHAR afii10091 +ENCODING 1097 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 10 0 -2 +BITMAP +DB00 +DB00 +DB00 +DB00 +DB00 +DB00 +DB00 +FF80 +0180 +0180 +ENDCHAR +STARTCHAR afii10092 +ENCODING 1098 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +F0 +30 +30 +30 +3E +33 +33 +33 +3E +ENDCHAR +STARTCHAR afii10093 +ENCODING 1099 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +C3 +C3 +C3 +F3 +DB +DB +DB +F3 +ENDCHAR +STARTCHAR afii10094 +ENCODING 1100 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +C0 +C0 +C0 +FC +C6 +C6 +C6 +FC +ENDCHAR +STARTCHAR afii10095 +ENCODING 1101 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +F8 +0C +06 +7E +06 +06 +0C +F8 +ENDCHAR +STARTCHAR afii10096 +ENCODING 1102 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +CE +DB +DB +DB +FB +DB +DB +CE +ENDCHAR +STARTCHAR afii10097 +ENCODING 1103 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +7E +C6 +C6 +C6 +7E +36 +66 +C6 +ENDCHAR +STARTCHAR uni0450 +ENCODING 1104 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +60 +30 +00 +00 +7C +C6 +C6 +C6 +FE +C0 +C0 +7E +ENDCHAR +STARTCHAR afii10071 +ENCODING 1105 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +6C +00 +00 +7C +C6 +C6 +C6 +FE +C0 +C0 +7E +ENDCHAR +STARTCHAR afii10099 +ENCODING 1106 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +60 +60 +60 +F8 +60 +60 +6E +73 +63 +63 +63 +03 +03 +06 +ENDCHAR +STARTCHAR afii10100 +ENCODING 1107 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +0C +18 +00 +00 +FE +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR afii10101 +ENCODING 1108 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +3E +60 +C0 +FC +C0 +C0 +60 +3E +ENDCHAR +STARTCHAR afii10102 +ENCODING 1109 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +7E +C0 +C0 +70 +1C +06 +06 +FC +ENDCHAR +STARTCHAR afii10103 +ENCODING 1110 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 2 0 +BITMAP +30 +00 +00 +F0 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR afii10104 +ENCODING 1111 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 2 0 +BITMAP +D8 +00 +00 +F0 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR afii10105 +ENCODING 1112 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 14 2 -3 +BITMAP +30 +00 +00 +F0 +30 +30 +30 +30 +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR afii10106 +ENCODING 1113 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +7C +6C +6C +6E +6D +6D +6D +CE +ENDCHAR +STARTCHAR afii10107 +ENCODING 1114 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +CC +CC +CC +FE +CD +CD +CD +CE +ENDCHAR +STARTCHAR afii10108 +ENCODING 1115 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +30 +30 +FC +30 +3E +33 +33 +33 +33 +33 +33 +ENDCHAR +STARTCHAR afii10109 +ENCODING 1116 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +18 +18 +30 +00 +C6 +CC +D8 +F0 +F0 +D8 +CC +C6 +ENDCHAR +STARTCHAR uni045D +ENCODING 1117 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +60 +30 +00 +00 +CE +CE +DE +DE +F6 +F6 +E6 +E6 +ENDCHAR +STARTCHAR afii10110 +ENCODING 1118 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +6C +38 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +FC +ENDCHAR +STARTCHAR afii10193 +ENCODING 1119 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 10 0 -2 +BITMAP +C3 +C3 +C3 +C3 +C3 +C3 +C3 +FF +18 +18 +ENDCHAR +STARTCHAR uni0460 +ENCODING 1120 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +66 +C3 +C3 +C3 +DB +DB +DB +DB +DB +DB +66 +ENDCHAR +STARTCHAR uni0461 +ENCODING 1121 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +66 +C3 +C3 +DB +DB +DB +DB +66 +ENDCHAR +STARTCHAR afii10146 +ENCODING 1122 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +30 +FC +30 +30 +30 +3E +33 +33 +33 +33 +3E +ENDCHAR +STARTCHAR afii10194 +ENCODING 1123 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +30 +30 +30 +30 +FC +30 +30 +3E +33 +33 +3E +ENDCHAR +STARTCHAR uni0464 +ENCODING 1124 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +CF +D8 +D8 +D8 +D8 +FE +D8 +D8 +D8 +D8 +CF +ENDCHAR +STARTCHAR uni0465 +ENCODING 1125 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +CF +D8 +D8 +FE +D8 +D8 +D8 +CF +ENDCHAR +STARTCHAR uni0466 +ENCODING 1126 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +18 +18 +3C +3C +3C +66 +66 +7E +DB +DB +DB +ENDCHAR +STARTCHAR uni0467 +ENCODING 1127 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +18 +18 +3C +3C +66 +7E +DB +DB +ENDCHAR +STARTCHAR uni0468 +ENCODING 1128 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +C4 +C4 +C4 +CE +CA +FA +CA +DF +DF +D5 +D5 +ENDCHAR +STARTCHAR uni0469 +ENCODING 1129 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +C4 +C4 +CE +FA +CA +DF +DF +D5 +ENDCHAR +STARTCHAR uni046A +ENCODING 1130 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +FF +C3 +66 +3C +18 +3C +7E +7E +DB +DB +DB +ENDCHAR +STARTCHAR uni046B +ENCODING 1131 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +FF +66 +3C +18 +3C +7E +DB +DB +ENDCHAR +STARTCHAR uni046C +ENCODING 1132 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +DF +DB +CA +CE +F4 +CE +DF +D5 +D5 +D5 +D5 +ENDCHAR +STARTCHAR uni046D +ENCODING 1133 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +DF +DB +CE +F4 +CE +DF +D5 +D5 +ENDCHAR +STARTCHAR uni046E +ENCODING 1134 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 16 1 -3 +BITMAP +6C +38 +10 +7C +C6 +06 +06 +7C +06 +06 +06 +06 +7C +C0 +C0 +7C +ENDCHAR +STARTCHAR uni046F +ENCODING 1135 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +6C +38 +10 +00 +7C +C6 +06 +3C +06 +06 +06 +7C +C0 +C0 +7C +ENDCHAR +STARTCHAR uni0470 +ENCODING 1136 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +18 +DB +DB +DB +7E +7E +7E +3C +18 +18 +18 +ENDCHAR +STARTCHAR uni0471 +ENCODING 1137 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 -3 +BITMAP +18 +18 +DB +DB +DB +7E +7E +7E +3C +18 +18 +18 +ENDCHAR +STARTCHAR afii10147 +ENCODING 1138 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7C +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR afii10195 +ENCODING 1139 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +7C +C6 +C6 +FE +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR afii10148 +ENCODING 1140 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +C3 +C6 +C6 +66 +66 +6C +3C +3C +3C +18 +18 +ENDCHAR +STARTCHAR afii10196 +ENCODING 1141 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +C3 +C6 +66 +66 +3C +3C +18 +18 +ENDCHAR +STARTCHAR uni0476 +ENCODING 1142 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +6C +36 +00 +C3 +C6 +66 +66 +6C +3C +3C +3C +18 +18 +ENDCHAR +STARTCHAR uni0477 +ENCODING 1143 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +6C +36 +00 +C3 +C6 +66 +66 +3C +3C +18 +18 +ENDCHAR +STARTCHAR uni0478 +ENCODING 1144 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +60 +D0 +D0 +DD +DD +DD +DD +DD +DD +DD +67 +01 +01 +06 +ENDCHAR +STARTCHAR uni0479 +ENCODING 1145 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +6D +DD +DD +DD +DD +DD +DD +67 +01 +01 +06 +ENDCHAR +STARTCHAR uni047A +ENCODING 1146 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 -1 +BITMAP +10 +38 +7C +D6 +C6 +C6 +C6 +C6 +D6 +7C +38 +10 +ENDCHAR +STARTCHAR uni047B +ENCODING 1147 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 0 -1 +BITMAP +10 +38 +7C +D6 +C6 +C6 +D6 +7C +38 +10 +ENDCHAR +STARTCHAR uni047C +ENCODING 1148 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +3C +66 +18 +4A +D3 +C3 +C3 +C3 +C3 +C3 +C3 +DB +66 +ENDCHAR +STARTCHAR uni047D +ENCODING 1149 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +3C +66 +18 +08 +10 +66 +C3 +C3 +C3 +C3 +C3 +DB +66 +ENDCHAR +STARTCHAR uni047E +ENCODING 1150 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +FE +54 +00 +66 +C3 +C3 +C3 +C3 +C3 +DB +DB +DB +66 +ENDCHAR +STARTCHAR uni047F +ENCODING 1151 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +FE +54 +00 +66 +C3 +C3 +C3 +DB +DB +DB +66 +ENDCHAR +STARTCHAR uni0480 +ENCODING 1152 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +7C +C6 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +7C +0C +0C +0C +ENDCHAR +STARTCHAR uni0481 +ENCODING 1153 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +7C +C6 +C0 +C0 +C0 +C0 +C0 +7C +0C +0C +0C +ENDCHAR +STARTCHAR uni0482 +ENCODING 1154 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 -1 +BITMAP +06 +36 +0C +1B +D8 +30 +6C +60 +ENDCHAR +STARTCHAR uni048A +ENCODING 1162 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +66 +3C +00 +C7 +C7 +CF +CF +DB +DB +F3 +F3 +E3 +E3 +03 +06 +0C +ENDCHAR +STARTCHAR uni048B +ENCODING 1163 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +6C +38 +00 +CE +CE +DE +DE +F6 +F6 +E6 +E6 +06 +0C +18 +ENDCHAR +STARTCHAR uni048C +ENCODING 1164 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +60 +60 +F8 +60 +60 +7E +63 +63 +63 +63 +7E +ENDCHAR +STARTCHAR uni048D +ENCODING 1165 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +60 +F8 +60 +7E +63 +63 +63 +7E +ENDCHAR +STARTCHAR uni048E +ENCODING 1166 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FC +C6 +C6 +C6 +D6 +CC +FA +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni048F +ENCODING 1167 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +FC +C6 +C6 +C6 +C6 +D6 +CC +FA +C0 +C0 +C0 +ENDCHAR +STARTCHAR afii10050 +ENCODING 1168 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +06 +06 +FE +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR afii10098 +ENCODING 1169 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +06 +06 +FE +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni0492 +ENCODING 1170 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +7F +60 +60 +60 +60 +F8 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni0493 +ENCODING 1171 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +7F +60 +60 +F8 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni0494 +ENCODING 1172 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +FE +C0 +C0 +C0 +C0 +F8 +CC +C6 +C6 +C6 +C6 +06 +0C +38 +ENDCHAR +STARTCHAR uni0495 +ENCODING 1173 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +FE +C0 +C0 +C0 +F8 +CC +C6 +C6 +06 +0C +38 +ENDCHAR +STARTCHAR uni0496 +ENCODING 1174 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +DB +DB +7E +7E +3C +3C +3C +7E +7E +DB +DB +03 +03 +03 +ENDCHAR +STARTCHAR uni0497 +ENCODING 1175 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +DB +5A +7E +3C +3C +7E +5A +DB +01 +01 +01 +ENDCHAR +STARTCHAR uni0498 +ENCODING 1176 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +FC +06 +06 +06 +06 +7C +06 +06 +06 +06 +FC +18 +0C +38 +ENDCHAR +STARTCHAR uni0499 +ENCODING 1177 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +FC +06 +06 +7C +06 +06 +06 +FC +18 +0C +38 +ENDCHAR +STARTCHAR uni049A +ENCODING 1178 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +C6 +CC +D8 +F0 +E0 +C0 +E0 +F0 +D8 +CC +C6 +06 +06 +06 +ENDCHAR +STARTCHAR uni049B +ENCODING 1179 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 -2 +BITMAP +C6 +CC +D8 +F0 +F0 +D8 +CC +C6 +06 +06 +ENDCHAR +STARTCHAR uni049C +ENCODING 1180 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +C3 +D6 +DC +D8 +F0 +F0 +F0 +D8 +DC +D6 +C3 +ENDCHAR +STARTCHAR uni049D +ENCODING 1181 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +D6 +DC +D8 +F0 +F0 +D8 +DC +D6 +ENDCHAR +STARTCHAR uni049E +ENCODING 1182 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +63 +F6 +6C +78 +70 +60 +70 +78 +6C +66 +63 +ENDCHAR +STARTCHAR uni049F +ENCODING 1183 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +60 +60 +F0 +63 +66 +6C +78 +78 +6C +66 +63 +ENDCHAR +STARTCHAR uni04A0 +ENCODING 1184 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +E3 +63 +66 +6C +78 +70 +78 +6C +66 +63 +63 +ENDCHAR +STARTCHAR uni04A1 +ENCODING 1185 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +E3 +66 +6C +78 +78 +6C +66 +63 +ENDCHAR +STARTCHAR uni04A2 +ENCODING 1186 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +CC +CC +CC +CC +CC +FC +CC +CC +CC +CC +CE +02 +02 +02 +ENDCHAR +STARTCHAR uni04A3 +ENCODING 1187 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 -2 +BITMAP +CC +CC +CC +FC +CC +CC +CC +CE +02 +02 +ENDCHAR +STARTCHAR uni04A4 +ENCODING 1188 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +CF +CC +CC +CC +CC +FC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni04A5 +ENCODING 1189 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +CF +CC +CC +FC +CC +CC +CC +CC +ENDCHAR +STARTCHAR uni04A6 +ENCODING 1190 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +F8 +D8 +D8 +D8 +D8 +DE +DB +DB +DB +DB +DB +03 +03 +06 +ENDCHAR +STARTCHAR uni04A7 +ENCODING 1191 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +F8 +D8 +D8 +D8 +DE +DB +DB +DB +03 +03 +06 +ENDCHAR +STARTCHAR uni04A8 +ENCODING 1192 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +30 +60 +CC +DA +DA +DA +DA +DA +DA +6C +37 +ENDCHAR +STARTCHAR uni04A9 +ENCODING 1193 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +60 +C8 +D4 +D4 +D4 +D4 +68 +36 +ENDCHAR +STARTCHAR uni04AA +ENCODING 1194 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +7E +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +7E +18 +0C +38 +ENDCHAR +STARTCHAR uni04AB +ENCODING 1195 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +7E +C0 +C0 +C0 +C0 +C0 +C0 +7E +18 +0C +38 +ENDCHAR +STARTCHAR uni04AC +ENCODING 1196 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +FF +18 +18 +18 +18 +18 +18 +18 +18 +18 +1C +04 +04 +04 +ENDCHAR +STARTCHAR uni04AD +ENCODING 1197 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 10 0 -2 +BITMAP +FF +18 +18 +18 +18 +18 +18 +1C +04 +04 +ENDCHAR +STARTCHAR uni04AE +ENCODING 1198 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +C3 +C3 +66 +66 +3C +3C +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni04AF +ENCODING 1199 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +C3 +C3 +66 +66 +3C +3C +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni04B0 +ENCODING 1200 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +C3 +C3 +66 +66 +3C +3C +FF +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni04B1 +ENCODING 1201 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +C3 +C3 +66 +66 +3C +3C +18 +7E +18 +18 +18 +ENDCHAR +STARTCHAR uni04B2 +ENCODING 1202 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +C3 +C3 +66 +3C +3C +18 +3C +3C +66 +C3 +C3 +01 +01 +01 +ENDCHAR +STARTCHAR uni04B3 +ENCODING 1203 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +C6 +C6 +6C +38 +38 +6C +C6 +C6 +02 +02 +02 +ENDCHAR +STARTCHAR uni04B4 +ENCODING 1204 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +F6 +66 +66 +66 +66 +66 +66 +66 +66 +66 +7F +01 +01 +01 +ENDCHAR +STARTCHAR uni04B5 +ENCODING 1205 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 10 0 -2 +BITMAP +F6 +66 +66 +66 +66 +66 +66 +7F +01 +01 +ENDCHAR +STARTCHAR uni04B6 +ENCODING 1206 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +CC +CC +CC +CC +CC +7C +0C +0C +0C +0C +0E +02 +02 +02 +ENDCHAR +STARTCHAR uni04B7 +ENCODING 1207 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 -2 +BITMAP +CC +CC +CC +CC +7C +0C +0C +0E +02 +02 +ENDCHAR +STARTCHAR uni04B8 +ENCODING 1208 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +C6 +C6 +C6 +D6 +D6 +7E +16 +16 +06 +06 +06 +ENDCHAR +STARTCHAR uni04B9 +ENCODING 1209 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +C6 +C6 +C6 +D6 +7E +16 +06 +06 +ENDCHAR +STARTCHAR uni04BA +ENCODING 1210 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +FC +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR uni04BB +ENCODING 1211 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +C0 +C0 +C0 +FC +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR uni04BC +ENCODING 1212 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +1E +33 +33 +33 +B3 +7F +30 +30 +30 +30 +1F +ENDCHAR +STARTCHAR uni04BD +ENCODING 1213 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +1E +33 +33 +B3 +7F +30 +30 +1F +ENDCHAR +STARTCHAR uni04BE +ENCODING 1214 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 -2 +BITMAP +1E +33 +33 +33 +B3 +7F +30 +30 +30 +30 +1F +04 +04 +ENDCHAR +STARTCHAR uni04BF +ENCODING 1215 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 10 0 -2 +BITMAP +1E +33 +33 +B3 +7F +30 +30 +1F +04 +04 +ENDCHAR +STARTCHAR uni04C0 +ENCODING 1216 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +FC +30 +30 +30 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni04C1 +ENCODING 1217 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +66 +3C +00 +DB +DB +7E +7E +3C +3C +7E +7E +DB +DB +ENDCHAR +STARTCHAR uni04C2 +ENCODING 1218 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +66 +3C +00 +00 +DB +5A +7E +3C +3C +7E +5A +DB +ENDCHAR +STARTCHAR uni04C3 +ENCODING 1219 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +C6 +CC +D8 +F0 +E0 +FC +C6 +C6 +C6 +C6 +C6 +06 +06 +1C +ENDCHAR +STARTCHAR uni04C4 +ENCODING 1220 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +C6 +CC +D8 +F0 +FC +C6 +C6 +C6 +06 +06 +1C +ENDCHAR +STARTCHAR uni04C5 +ENCODING 1221 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +7E +66 +66 +66 +66 +66 +66 +66 +66 +66 +C6 +03 +06 +0C +ENDCHAR +STARTCHAR uni04C6 +ENCODING 1222 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +7E +66 +66 +66 +66 +66 +66 +C6 +03 +06 +0C +ENDCHAR +STARTCHAR uni04C7 +ENCODING 1223 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +C6 +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +C6 +06 +06 +1C +ENDCHAR +STARTCHAR uni04C8 +ENCODING 1224 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +06 +06 +1C +ENDCHAR +STARTCHAR uni04C9 +ENCODING 1225 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +CC +CC +CC +CC +CC +FC +CC +CC +CC +CC +CC +06 +0C +18 +ENDCHAR +STARTCHAR uni04CA +ENCODING 1226 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +CC +CC +CC +FC +CC +CC +CC +CC +06 +0C +18 +ENDCHAR +STARTCHAR uni04CB +ENCODING 1227 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +06 +06 +0E +08 +08 +ENDCHAR +STARTCHAR uni04CC +ENCODING 1228 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 -2 +BITMAP +C6 +C6 +C6 +C6 +7E +06 +06 +0E +08 +08 +ENDCHAR +STARTCHAR uni04CD +ENCODING 1229 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +C6 +C6 +EE +EE +FE +FE +D6 +D6 +C6 +C6 +C6 +03 +06 +0C +ENDCHAR +STARTCHAR uni04CE +ENCODING 1230 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +C6 +EE +EE +FE +FE +D6 +D6 +C6 +03 +06 +0C +ENDCHAR +STARTCHAR uni04CF +ENCODING 1231 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 0 +BITMAP +FC +30 +30 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni04D0 +ENCODING 1232 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +CC +78 +00 +7C +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR uni04D1 +ENCODING 1233 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +6C +38 +00 +7C +06 +06 +7E +C6 +C6 +C6 +7E +ENDCHAR +STARTCHAR uni04D2 +ENCODING 1234 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +CC +00 +7C +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR uni04D3 +ENCODING 1235 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +6C +00 +00 +7C +06 +06 +7E +C6 +C6 +C6 +7E +ENDCHAR +STARTCHAR uni04D4 +ENCODING 1236 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +7F +CC +CC +CC +CC +FF +CC +CC +CC +CC +CF +ENDCHAR +STARTCHAR uni04D5 +ENCODING 1237 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +7E +1B +1B +7B +DE +D8 +D8 +7F +ENDCHAR +STARTCHAR uni04D6 +ENCODING 1238 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +38 +00 +FE +C0 +C0 +C0 +FC +C0 +C0 +C0 +C0 +FE +ENDCHAR +STARTCHAR uni04D7 +ENCODING 1239 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +6C +38 +00 +7C +C6 +C6 +C6 +FE +C0 +C0 +7C +ENDCHAR +STARTCHAR uni04D8 +ENCODING 1240 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FC +06 +06 +06 +06 +FE +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR afii10846 +ENCODING 1241 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +FC +06 +06 +FE +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni04DA +ENCODING 1242 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +00 +FC +06 +06 +06 +06 +FE +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni04DB +ENCODING 1243 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +6C +00 +00 +FC +06 +06 +FE +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni04DC +ENCODING 1244 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +66 +00 +DB +DB +7E +7E +3C +3C +3C +7E +7E +DB +DB +ENDCHAR +STARTCHAR uni04DD +ENCODING 1245 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +66 +00 +00 +DB +5A +7E +3C +3C +7E +5A +DB +ENDCHAR +STARTCHAR uni04DE +ENCODING 1246 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +00 +FC +06 +06 +06 +06 +7C +06 +06 +06 +06 +FC +ENDCHAR +STARTCHAR uni04DF +ENCODING 1247 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +6C +00 +00 +FC +06 +06 +7C +06 +06 +06 +FC +ENDCHAR +STARTCHAR uni04E0 +ENCODING 1248 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FE +06 +0C +18 +38 +0C +06 +06 +06 +CC +78 +ENDCHAR +STARTCHAR uni04E1 +ENCODING 1249 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +FE +06 +0C +18 +38 +0C +06 +06 +06 +CC +78 +ENDCHAR +STARTCHAR uni04E2 +ENCODING 1250 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +7C +00 +C6 +C6 +CE +CE +DE +D6 +F6 +E6 +E6 +C6 +C6 +ENDCHAR +STARTCHAR uni04E3 +ENCODING 1251 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7C +00 +00 +CE +CE +DE +DE +F6 +F6 +E6 +E6 +ENDCHAR +STARTCHAR uni04E4 +ENCODING 1252 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +00 +C6 +C6 +CE +CE +DE +D6 +F6 +E6 +E6 +C6 +C6 +ENDCHAR +STARTCHAR uni04E5 +ENCODING 1253 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +6C +00 +00 +CE +CE +DE +DE +F6 +F6 +E6 +E6 +ENDCHAR +STARTCHAR uni04E6 +ENCODING 1254 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni04E7 +ENCODING 1255 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +6C +00 +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni04E8 +ENCODING 1256 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7C +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni04E9 +ENCODING 1257 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +7C +C6 +C6 +FE +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni04EA +ENCODING 1258 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +00 +7C +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni04EB +ENCODING 1259 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +6C +00 +00 +7C +C6 +C6 +FE +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni04EC +ENCODING 1260 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +00 +F8 +0C +06 +06 +06 +7E +06 +06 +06 +0C +F8 +ENDCHAR +STARTCHAR uni04ED +ENCODING 1261 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +6C +00 +00 +F8 +0C +06 +7E +06 +06 +0C +F8 +ENDCHAR +STARTCHAR uni04EE +ENCODING 1262 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +7C +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +7C +ENDCHAR +STARTCHAR uni04EF +ENCODING 1263 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +7C +00 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +7C +ENDCHAR +STARTCHAR uni04F0 +ENCODING 1264 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +7C +ENDCHAR +STARTCHAR uni04F1 +ENCODING 1265 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +6C +00 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +7C +ENDCHAR +STARTCHAR uni04F2 +ENCODING 1266 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +36 +6C +00 +C6 +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +7C +ENDCHAR +STARTCHAR uni04F3 +ENCODING 1267 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 16 1 -3 +BITMAP +36 +36 +6C +00 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +7C +ENDCHAR +STARTCHAR uni04F4 +ENCODING 1268 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +00 +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +06 +06 +06 +ENDCHAR +STARTCHAR uni04F5 +ENCODING 1269 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +6C +00 +00 +C6 +C6 +C6 +C6 +7E +06 +06 +06 +ENDCHAR +STARTCHAR uni04F6 +ENCODING 1270 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +FE +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +E0 +20 +20 +ENDCHAR +STARTCHAR uni04F7 +ENCODING 1271 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 -2 +BITMAP +FE +C0 +C0 +C0 +C0 +C0 +C0 +E0 +20 +20 +ENDCHAR +STARTCHAR uni04F8 +ENCODING 1272 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +36 +00 +C3 +C3 +C3 +C3 +C3 +F3 +DB +DB +DB +DB +F3 +ENDCHAR +STARTCHAR uni04F9 +ENCODING 1273 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +36 +00 +00 +C3 +C3 +C3 +F3 +DB +DB +DB +F3 +ENDCHAR +STARTCHAR uni04FA +ENCODING 1274 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +7F +60 +60 +60 +60 +F8 +60 +60 +60 +60 +78 +18 +18 +70 +ENDCHAR +STARTCHAR uni04FB +ENCODING 1275 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +7F +60 +60 +F8 +60 +60 +60 +78 +18 +18 +70 +ENDCHAR +STARTCHAR uni04FC +ENCODING 1276 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +C3 +66 +66 +3C +3C +18 +3C +3C +66 +66 +C3 +03 +03 +06 +ENDCHAR +STARTCHAR uni04FD +ENCODING 1277 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +C6 +C6 +6C +38 +38 +6C +C6 +C6 +06 +06 +1C +ENDCHAR +STARTCHAR uni04FE +ENCODING 1278 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +C3 +66 +66 +3C +3C +FF +3C +3C +66 +66 +C3 +ENDCHAR +STARTCHAR uni04FF +ENCODING 1279 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +C6 +C6 +6C +38 +FE +6C +C6 +C6 +ENDCHAR +STARTCHAR uni0500 +ENCODING 1280 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +06 +06 +06 +06 +7E +C6 +C6 +C6 +C6 +C6 +7E +ENDCHAR +STARTCHAR uni0501 +ENCODING 1281 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +06 +06 +06 +7E +C6 +C6 +C6 +7E +ENDCHAR +STARTCHAR uni0502 +ENCODING 1282 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +18 +18 +18 +1B +1B +7B +DB +DB +DB +DB +7E +ENDCHAR +STARTCHAR uni0503 +ENCODING 1283 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +18 +18 +1B +7B +DB +DB +DB +7E +ENDCHAR +STARTCHAR uni0504 +ENCODING 1284 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +F0 +18 +18 +1B +1B +73 +1B +1B +1B +1B +0E +ENDCHAR +STARTCHAR uni0505 +ENCODING 1285 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +F3 +1B +1B +73 +1B +1B +1B +0E +ENDCHAR +STARTCHAR uni0506 +ENCODING 1286 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +F8 +0C +0C +0C +0C +78 +0C +0C +0C +0C +0E +02 +02 +ENDCHAR +STARTCHAR uni0507 +ENCODING 1287 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 -2 +BITMAP +F8 +0C +0C +38 +0C +0C +0C +0E +02 +02 +ENDCHAR +STARTCHAR uni0508 +ENCODING 1288 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +78 +68 +68 +6B +6B +6B +6B +6B +6B +6B +C6 +ENDCHAR +STARTCHAR uni0509 +ENCODING 1289 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +78 +68 +6B +6B +6B +6B +6B +C6 +ENDCHAR +STARTCHAR uni050A +ENCODING 1290 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +D8 +D8 +D8 +DB +DB +FB +DB +DB +DB +DB +CE +ENDCHAR +STARTCHAR uni050B +ENCODING 1291 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +D8 +D8 +DB +FB +DB +DB +DB +CE +ENDCHAR +STARTCHAR uni050C +ENCODING 1292 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7E +C0 +C0 +C0 +C0 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni050D +ENCODING 1293 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +7E +C0 +C0 +C0 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni050E +ENCODING 1294 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +FC +30 +30 +30 +33 +33 +33 +33 +33 +33 +1E +ENDCHAR +STARTCHAR uni050F +ENCODING 1295 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +FC +30 +30 +33 +33 +33 +33 +1E +ENDCHAR +STARTCHAR uni0510 +ENCODING 1296 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7E +C0 +C0 +C0 +C0 +78 +C0 +C0 +C0 +C0 +7E +ENDCHAR +STARTCHAR uni0511 +ENCODING 1297 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +7E +C0 +C0 +70 +C0 +C0 +C0 +7E +ENDCHAR +STARTCHAR uni0512 +ENCODING 1298 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +7F +63 +63 +63 +63 +63 +63 +63 +63 +63 +C3 +03 +03 +06 +ENDCHAR +STARTCHAR uni0513 +ENCODING 1299 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +7F +63 +63 +63 +63 +63 +63 +C3 +03 +03 +0E +ENDCHAR +STARTCHAR uni0514 +ENCODING 1300 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +7B +5B +5B +4E +4E +44 +4E +4E +5B +5B +9B +ENDCHAR +STARTCHAR uni0515 +ENCODING 1301 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +7B +5B +4E +44 +4E +4E +5B +9B +ENDCHAR +STARTCHAR uni0516 +ENCODING 1302 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +F3 +DB +DE +DE +DC +FC +CC +C6 +C6 +C3 +C3 +ENDCHAR +STARTCHAR uni0517 +ENCODING 1303 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +F1 +DB +DE +DC +DC +DE +DB +F1 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni0518 +ENCODING 1304 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +7F +CC +CC +CC +CC +7F +3C +6C +6C +CC +CF +ENDCHAR +STARTCHAR uni0519 +ENCODING 1305 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +7E +DB +DB +DB +7F +38 +78 +CF +ENDCHAR +STARTCHAR uni051A +ENCODING 1306 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +DA +CC +76 +ENDCHAR +STARTCHAR uni051B +ENCODING 1307 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +7E +C6 +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +06 +ENDCHAR +STARTCHAR uni051C +ENCODING 1308 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +C3 +C3 +C3 +C3 +DB +DB +FF +E7 +E7 +C3 +C3 +ENDCHAR +STARTCHAR uni051D +ENCODING 1309 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +C3 +C3 +DB +DB +FF +FF +66 +66 +ENDCHAR +STARTCHAR uni051E +ENCODING 1310 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +D6 +CC +D8 +F4 +E0 +C0 +E0 +F0 +D8 +CC +C6 +ENDCHAR +STARTCHAR uni051F +ENCODING 1311 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 9 1 0 +BITMAP +D6 +CC +D8 +F4 +E0 +F0 +D8 +CC +C6 +ENDCHAR +STARTCHAR uni0520 +ENCODING 1312 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +78 +58 +58 +58 +58 +5E +5B +5B +5B +5B +9B +03 +03 +06 +ENDCHAR +STARTCHAR uni0521 +ENCODING 1313 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +78 +58 +58 +5E +5B +5B +5B +9B +03 +03 +06 +ENDCHAR +STARTCHAR uni0522 +ENCODING 1314 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +D8 +D8 +D8 +D8 +D8 +FE +DB +DB +DB +DB +DB +03 +03 +06 +ENDCHAR +STARTCHAR uni0523 +ENCODING 1315 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +D8 +D8 +D8 +FE +DB +DB +DB +DB +03 +03 +06 +ENDCHAR +STARTCHAR uni0524 +ENCODING 1316 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +FC +CC +CC +CC +CC +CC +CC +CC +CC +CC +CE +02 +02 +ENDCHAR +STARTCHAR uni0525 +ENCODING 1317 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 -2 +BITMAP +FC +CC +CC +CC +CC +CC +CC +CE +02 +02 +ENDCHAR +STARTCHAR uni0526 +ENCODING 1318 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +F8 +CC +CC +CC +CC +CE +02 +02 +ENDCHAR +STARTCHAR uni0527 +ENCODING 1319 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 -2 +BITMAP +C0 +C0 +C0 +F8 +CC +CC +CC +CE +02 +02 +ENDCHAR +STARTCHAR uni0528 +ENCODING 1320 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +33 +33 +33 +33 +33 +3F +33 +33 +33 +33 +33 +30 +30 +E0 +ENDCHAR +STARTCHAR uni0529 +ENCODING 1321 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +33 +33 +33 +3F +33 +33 +33 +33 +30 +30 +E0 +ENDCHAR +STARTCHAR uni052A +ENCODING 1322 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 -1 +BITMAP +75 +55 +55 +57 +57 +5E +57 +57 +D5 +D5 +F5 +D0 +ENDCHAR +STARTCHAR uni052B +ENCODING 1323 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 -1 +BITMAP +75 +55 +57 +5E +57 +D5 +D5 +F5 +D0 +ENDCHAR +STARTCHAR uni052C +ENCODING 1324 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 -1 +BITMAP +86 +86 +8E +8E +9E +5E +3E +36 +66 +66 +FF +C3 +ENDCHAR +STARTCHAR uni052D +ENCODING 1325 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 9 1 -1 +BITMAP +8C +9C +9C +7C +3C +6C +6C +FE +C6 +ENDCHAR +STARTCHAR uni052E +ENCODING 1326 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 -2 +BITMAP +7E +66 +66 +66 +66 +66 +66 +66 +66 +66 +C7 +01 +01 +ENDCHAR +STARTCHAR uni052F +ENCODING 1327 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 10 0 -2 +BITMAP +7E +66 +66 +66 +66 +66 +66 +C7 +01 +01 +ENDCHAR +STARTCHAR afii57407 +ENCODING 1567 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 11 1 1 +BITMAP +78 +80 +80 +80 +40 +30 +30 +00 +00 +30 +30 +ENDCHAR +STARTCHAR afii57409 +ENCODING 1569 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 4 6 2 2 +BITMAP +70 +80 +80 +80 +70 +C0 +ENDCHAR +STARTCHAR afii57410 +ENCODING 1570 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 13 2 1 +BITMAP +48 +B0 +00 +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR afii57411 +ENCODING 1571 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 4 13 2 1 +BITMAP +70 +80 +E0 +E0 +00 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR afii57412 +ENCODING 1572 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 14 1 -2 +BITMAP +38 +40 +70 +78 +00 +38 +44 +44 +44 +44 +3C +04 +F8 +F0 +ENDCHAR +STARTCHAR afii57413 +ENCODING 1573 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 4 14 2 -2 +BITMAP +40 +40 +40 +40 +40 +40 +40 +40 +00 +00 +70 +80 +E0 +E0 +ENDCHAR +STARTCHAR afii57414 +ENCODING 1574 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 12 0 1 +BITMAP +70 +80 +E0 +E0 +04 +0A +48 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR afii57415 +ENCODING 1575 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 1 11 4 1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii57416 +ENCODING 1576 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 6 1 1 +BITMAP +08 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR afii57417 +ENCODING 1577 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 10 1 0 +BITMAP +48 +00 +20 +70 +88 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR afii57418 +ENCODING 1578 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +48 +00 +00 +08 +84 +84 +84 +78 +38 +ENDCHAR +STARTCHAR afii57419 +ENCODING 1579 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 1 1 +BITMAP +30 +00 +00 +48 +00 +08 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR afii57420 +ENCODING 1580 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 1 -1 +BITMAP +FC +30 +00 +40 +80 +B0 +80 +80 +80 +40 +3C +ENDCHAR +STARTCHAR afii57421 +ENCODING 1581 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 1 -1 +BITMAP +FC +30 +00 +40 +80 +80 +80 +80 +80 +40 +3C +ENDCHAR +STARTCHAR afii57422 +ENCODING 1582 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 14 1 -2 +BITMAP +30 +00 +FC +FC +30 +40 +80 +80 +80 +80 +80 +40 +3C +1C +ENDCHAR +STARTCHAR afii57423 +ENCODING 1583 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 7 1 1 +BITMAP +08 +04 +04 +04 +04 +04 +F8 +ENDCHAR +STARTCHAR afii57424 +ENCODING 1584 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 10 1 0 +BITMAP +30 +00 +00 +08 +04 +04 +04 +04 +04 +F8 +ENDCHAR +STARTCHAR afii57425 +ENCODING 1585 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 7 1 1 +BITMAP +04 +04 +04 +04 +04 +08 +F0 +ENDCHAR +STARTCHAR afii57426 +ENCODING 1586 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 10 1 0 +BITMAP +04 +00 +04 +04 +04 +04 +04 +08 +08 +F0 +ENDCHAR +STARTCHAR afii57427 +ENCODING 1587 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 6 0 -1 +BITMAP +4A +8E +8E +8E +88 +70 +ENDCHAR +STARTCHAR afii57428 +ENCODING 1588 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 11 0 -1 +BITMAP +08 +02 +00 +08 +00 +4A +8E +8E +8E +88 +70 +ENDCHAR +STARTCHAR afii57429 +ENCODING 1589 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 9 7 0 -1 +BITMAP +0A00 +4D00 +8980 +8900 +8E00 +8800 +7000 +ENDCHAR +STARTCHAR afii57430 +ENCODING 1590 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 9 10 0 -2 +BITMAP +0400 +0000 +0000 +0A00 +4D80 +8980 +8E00 +8800 +8800 +7000 +ENDCHAR +STARTCHAR afii57431 +ENCODING 1591 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 11 0 1 +BITMAP +40 +40 +40 +40 +40 +40 +4C +72 +62 +62 +FE +ENDCHAR +STARTCHAR afii57432 +ENCODING 1592 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 11 0 1 +BITMAP +40 +40 +40 +40 +48 +40 +4C +72 +62 +62 +FE +ENDCHAR +STARTCHAR afii57433 +ENCODING 1593 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 1 -1 +BITMAP +70 +80 +80 +80 +78 +80 +80 +80 +80 +84 +78 +ENDCHAR +STARTCHAR afii57434 +ENCODING 1594 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 14 1 -2 +BITMAP +30 +00 +20 +60 +80 +80 +78 +80 +80 +80 +80 +84 +78 +30 +ENDCHAR +STARTCHAR afii57440 +ENCODING 1600 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 1 0 2 +BITMAP +FE +ENDCHAR +STARTCHAR afii57441 +ENCODING 1601 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 10 0 -1 +BITMAP +08 +00 +00 +08 +14 +8C +84 +84 +84 +78 +ENDCHAR +STARTCHAR afii57442 +ENCODING 1602 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 10 0 -1 +BITMAP +34 +00 +00 +08 +14 +8C +84 +84 +84 +78 +ENDCHAR +STARTCHAR afii57443 +ENCODING 1603 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 1 +BITMAP +34 +44 +24 +24 +C4 +04 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR afii57444 +ENCODING 1604 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 14 0 -2 +BITMAP +04 +04 +04 +04 +04 +04 +04 +04 +04 +44 +84 +84 +78 +30 +ENDCHAR +STARTCHAR afii57445 +ENCODING 1605 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 7 0 0 +BITMAP +38 +44 +44 +44 +98 +80 +80 +ENDCHAR +STARTCHAR afii57446 +ENCODING 1606 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 10 0 -1 +BITMAP +30 +00 +00 +08 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR afii57470 +ENCODING 1607 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 6 0 2 +BITMAP +70 +88 +84 +84 +84 +78 +ENDCHAR +STARTCHAR afii57448 +ENCODING 1608 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 7 0 0 +BITMAP +38 +44 +44 +44 +1C +04 +F8 +ENDCHAR +STARTCHAR afii57449 +ENCODING 1609 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 6 0 1 +BITMAP +04 +0A +88 +88 +84 +78 +ENDCHAR +STARTCHAR afii57450 +ENCODING 1610 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 11 0 -1 +BITMAP +04 +0A +08 +48 +84 +84 +78 +00 +00 +00 +48 +ENDCHAR +STARTCHAR afii57392 +ENCODING 1632 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 1 2 2 6 +BITMAP +80 +80 +ENDCHAR +STARTCHAR afii57393 +ENCODING 1633 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 4 11 1 1 +BITMAP +80 +80 +40 +40 +40 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR afii57394 +ENCODING 1634 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 11 1 1 +BITMAP +88 +88 +70 +60 +40 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR afii57395 +ENCODING 1635 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 1 +BITMAP +B4 +B4 +78 +78 +40 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR afii57396 +ENCODING 1636 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 1 +BITMAP +70 +80 +80 +80 +70 +80 +80 +80 +80 +84 +78 +ENDCHAR +STARTCHAR afii57397 +ENCODING 1637 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 1 +BITMAP +30 +48 +48 +48 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR afii57398 +ENCODING 1638 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 10 0 1 +BITMAP +F8 +08 +08 +08 +08 +08 +04 +04 +04 +04 +ENDCHAR +STARTCHAR afii57399 +ENCODING 1639 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 1 +BITMAP +84 +84 +48 +48 +48 +48 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR afii57400 +ENCODING 1640 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 1 +BITMAP +30 +30 +30 +30 +30 +48 +48 +48 +48 +84 +84 +ENDCHAR +STARTCHAR afii57401 +ENCODING 1641 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 10 0 1 +BITMAP +70 +88 +88 +98 +78 +08 +04 +04 +04 +04 +ENDCHAR +STARTCHAR afii57381 +ENCODING 1642 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 10 0 0 +BITMAP +84 +84 +08 +08 +30 +30 +40 +84 +84 +84 +ENDCHAR +STARTCHAR uni066B +ENCODING 1643 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 5 1 0 +BITMAP +08 +08 +10 +20 +C0 +ENDCHAR +STARTCHAR uni066C +ENCODING 1644 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 2 4 2 11 +BITMAP +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni066E +ENCODING 1646 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 5 0 1 +BITMAP +08 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni066F +ENCODING 1647 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 6 0 1 +BITMAP +08 +14 +8C +8C +84 +78 +ENDCHAR +STARTCHAR uni0FD5 +ENCODING 4053 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +8F80 +8800 +8800 +8800 +FF80 +0880 +0880 +0880 +F880 +ENDCHAR +STARTCHAR uni0FD6 +ENCODING 4054 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +F880 +0880 +0880 +0880 +FF80 +8800 +8800 +8800 +8F80 +ENDCHAR +STARTCHAR uni0FD7 +ENCODING 4055 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +8F80 +8800 +AA00 +8800 +FF80 +0880 +2A80 +0880 +F880 +ENDCHAR +STARTCHAR uni0FD8 +ENCODING 4056 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +F880 +0880 +2A80 +0880 +FF80 +8800 +AA00 +8800 +8F80 +ENDCHAR +STARTCHAR uni1DC4 +ENCODING 7620 +SWIDTH 0 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni1DC5 +ENCODING 7621 +SWIDTH 0 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni1DC6 +ENCODING 7622 +SWIDTH 0 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni1DC7 +ENCODING 7623 +SWIDTH 0 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni1DC8 +ENCODING 7624 +SWIDTH 0 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni1DC9 +ENCODING 7625 +SWIDTH 0 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni1DCA +ENCODING 7626 +SWIDTH 0 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni1DCB +ENCODING 7627 +SWIDTH 0 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni1DCC +ENCODING 7628 +SWIDTH 0 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni1DCD +ENCODING 7629 +SWIDTH 0 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni1DCE +ENCODING 7630 +SWIDTH 0 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni1DCF +ENCODING 7631 +SWIDTH 0 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni1E00 +ENCODING 7680 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +7C +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +C6 +38 +6C +38 +ENDCHAR +STARTCHAR uni1E01 +ENCODING 7681 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +7C +06 +06 +7E +C6 +C6 +C6 +7E +38 +6C +38 +ENDCHAR +STARTCHAR uni1E02 +ENCODING 7682 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +10 +00 +FC +C6 +C6 +C6 +C6 +FC +C6 +C6 +C6 +C6 +FC +ENDCHAR +STARTCHAR uni1E03 +ENCODING 7683 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +10 +00 +C0 +C0 +C0 +FC +C6 +C6 +C6 +C6 +C6 +C6 +FC +ENDCHAR +STARTCHAR uni1E04 +ENCODING 7684 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +FC +C6 +C6 +C6 +C6 +FC +C6 +C6 +C6 +C6 +FC +00 +10 +ENDCHAR +STARTCHAR uni1E05 +ENCODING 7685 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +C0 +C0 +C0 +FC +C6 +C6 +C6 +C6 +C6 +C6 +FC +00 +10 +ENDCHAR +STARTCHAR uni1E06 +ENCODING 7686 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +FC +C6 +C6 +C6 +C6 +FC +C6 +C6 +C6 +C6 +FC +00 +7C +ENDCHAR +STARTCHAR uni1E07 +ENCODING 7687 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +C0 +C0 +C0 +FC +C6 +C6 +C6 +C6 +C6 +C6 +FC +00 +7C +ENDCHAR +STARTCHAR uni1E08 +ENCODING 7688 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 16 1 -3 +BITMAP +0C +18 +00 +7E +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +7E +18 +0C +38 +ENDCHAR +STARTCHAR uni1E09 +ENCODING 7689 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +0C +18 +00 +00 +7E +C0 +C0 +C0 +C0 +C0 +C0 +7E +18 +0C +38 +ENDCHAR +STARTCHAR uni1E0A +ENCODING 7690 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +10 +00 +F8 +CC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +CC +F8 +ENDCHAR +STARTCHAR uni1E0B +ENCODING 7691 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +10 +00 +06 +06 +06 +7E +C6 +C6 +C6 +C6 +C6 +C6 +7E +ENDCHAR +STARTCHAR uni1E0C +ENCODING 7692 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +F8 +CC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +CC +F8 +00 +10 +ENDCHAR +STARTCHAR uni1E0D +ENCODING 7693 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +06 +06 +06 +7E +C6 +C6 +C6 +C6 +C6 +C6 +7E +00 +10 +ENDCHAR +STARTCHAR uni1E0E +ENCODING 7694 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +F8 +CC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +CC +F8 +00 +7C +ENDCHAR +STARTCHAR uni1E0F +ENCODING 7695 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +06 +06 +06 +7E +C6 +C6 +C6 +C6 +C6 +C6 +7E +00 +7C +ENDCHAR +STARTCHAR uni1E10 +ENCODING 7696 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +F8 +CC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +CC +F8 +30 +18 +70 +ENDCHAR +STARTCHAR uni1E11 +ENCODING 7697 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +06 +06 +06 +7E +C6 +C6 +C6 +C6 +C6 +C6 +7E +30 +18 +78 +ENDCHAR +STARTCHAR uni1E12 +ENCODING 7698 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +F8 +CC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +CC +F8 +10 +38 +6C +ENDCHAR +STARTCHAR uni1E13 +ENCODING 7699 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +06 +06 +06 +7E +C6 +C6 +C6 +C6 +C6 +C6 +7E +10 +38 +6C +ENDCHAR +STARTCHAR uni1E14 +ENCODING 7700 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +30 +18 +00 +7C +00 +FE +C0 +C0 +FC +C0 +C0 +C0 +FE +ENDCHAR +STARTCHAR uni1E15 +ENCODING 7701 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +30 +18 +00 +7C +00 +7C +C6 +C6 +C6 +FE +C0 +C0 +7E +ENDCHAR +STARTCHAR uni1E16 +ENCODING 7702 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +18 +30 +00 +7C +00 +FE +C0 +C0 +FC +C0 +C0 +C0 +FE +ENDCHAR +STARTCHAR uni1E17 +ENCODING 7703 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +18 +30 +00 +7C +00 +7C +C6 +C6 +C6 +FE +C0 +C0 +7E +ENDCHAR +STARTCHAR uni1E18 +ENCODING 7704 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +FE +C0 +C0 +C0 +C0 +FC +C0 +C0 +C0 +C0 +FE +10 +38 +6C +ENDCHAR +STARTCHAR uni1E19 +ENCODING 7705 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +7C +C6 +C6 +C6 +FE +C0 +C0 +7E +10 +38 +6C +ENDCHAR +STARTCHAR uni1E1A +ENCODING 7706 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +FE +C0 +C0 +C0 +C0 +FC +C0 +C0 +C0 +C0 +FE +00 +76 +DC +ENDCHAR +STARTCHAR uni1E1B +ENCODING 7707 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +7C +C6 +C6 +C6 +FE +C0 +C0 +7E +00 +76 +DC +ENDCHAR +STARTCHAR uni1E1C +ENCODING 7708 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 16 1 -3 +BITMAP +6C +38 +00 +FE +C0 +C0 +C0 +FC +C0 +C0 +C0 +C0 +FE +18 +0C +38 +ENDCHAR +STARTCHAR uni1E1D +ENCODING 7709 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +6C +38 +00 +7C +C6 +C6 +C6 +FE +C0 +C0 +7E +18 +0C +38 +ENDCHAR +STARTCHAR uni1E1E +ENCODING 7710 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +10 +00 +FE +C0 +C0 +C0 +C0 +FC +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni1E1F +ENCODING 7711 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +10 +00 +3E +60 +60 +FC +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni1E20 +ENCODING 7712 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +7C +00 +7E +C0 +C0 +C0 +C0 +DE +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1E21 +ENCODING 7713 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +7C +00 +00 +7E +C6 +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +7C +ENDCHAR +STARTCHAR uni1E22 +ENCODING 7714 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +10 +00 +C6 +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR uni1E23 +ENCODING 7715 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +10 +00 +C0 +C0 +C0 +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR uni1E24 +ENCODING 7716 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +C6 +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +C6 +00 +10 +ENDCHAR +STARTCHAR uni1E25 +ENCODING 7717 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +C0 +C0 +C0 +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +00 +10 +ENDCHAR +STARTCHAR uni1E26 +ENCODING 7718 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +00 +C6 +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR uni1E27 +ENCODING 7719 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +00 +C0 +C0 +C0 +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR uni1E28 +ENCODING 7720 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +63 +63 +63 +63 +63 +7F +63 +63 +63 +63 +63 +60 +30 +E0 +ENDCHAR +STARTCHAR uni1E29 +ENCODING 7721 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +60 +60 +60 +7E +63 +63 +63 +63 +63 +63 +63 +60 +30 +E0 +ENDCHAR +STARTCHAR uni1E2A +ENCODING 7722 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +C6 +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +C6 +00 +6C +38 +ENDCHAR +STARTCHAR uni1E2B +ENCODING 7723 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +C0 +C0 +C0 +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +00 +6C +38 +ENDCHAR +STARTCHAR uni1E2C +ENCODING 7724 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +FC +30 +30 +30 +30 +30 +30 +30 +30 +30 +FC +00 +76 +DC +ENDCHAR +STARTCHAR uni1E2D +ENCODING 7725 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +18 +00 +00 +78 +18 +18 +18 +18 +18 +18 +7E +00 +76 +DC +ENDCHAR +STARTCHAR uni1E2E +ENCODING 7726 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +18 +30 +CC +00 +FC +30 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni1E2F +ENCODING 7727 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 2 0 +BITMAP +18 +18 +30 +CC +00 +F0 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni1E30 +ENCODING 7728 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +18 +30 +C6 +CC +D8 +F0 +E0 +C0 +E0 +F0 +D8 +CC +C6 +ENDCHAR +STARTCHAR uni1E31 +ENCODING 7729 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +18 +30 +C0 +C0 +C0 +C6 +CC +D8 +F0 +F0 +D8 +CC +C6 +ENDCHAR +STARTCHAR uni1E32 +ENCODING 7730 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +C6 +CC +D8 +F0 +E0 +C0 +E0 +F0 +D8 +CC +C6 +00 +10 +ENDCHAR +STARTCHAR uni1E33 +ENCODING 7731 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +C0 +C0 +C0 +C6 +CC +D8 +F0 +F0 +D8 +CC +C6 +00 +10 +ENDCHAR +STARTCHAR uni1E34 +ENCODING 7732 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +C6 +CC +D8 +F0 +E0 +C0 +E0 +F0 +D8 +CC +C6 +00 +7C +ENDCHAR +STARTCHAR uni1E35 +ENCODING 7733 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +C0 +C0 +C0 +C6 +CC +D8 +F0 +F0 +D8 +CC +C6 +00 +7C +ENDCHAR +STARTCHAR uni1E36 +ENCODING 7734 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FE +00 +10 +ENDCHAR +STARTCHAR uni1E37 +ENCODING 7735 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 13 2 -2 +BITMAP +E0 +60 +60 +60 +60 +60 +60 +60 +60 +60 +38 +00 +20 +ENDCHAR +STARTCHAR uni1E38 +ENCODING 7736 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -2 +BITMAP +7C +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FE +00 +10 +ENDCHAR +STARTCHAR uni1E39 +ENCODING 7737 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 15 2 -2 +BITMAP +F8 +00 +E0 +60 +60 +60 +60 +60 +60 +60 +60 +60 +38 +00 +20 +ENDCHAR +STARTCHAR uni1E3A +ENCODING 7738 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FE +00 +7C +ENDCHAR +STARTCHAR uni1E3B +ENCODING 7739 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 13 2 -2 +BITMAP +E0 +60 +60 +60 +60 +60 +60 +60 +60 +60 +38 +00 +F8 +ENDCHAR +STARTCHAR uni1E3C +ENCODING 7740 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FE +10 +38 +6C +ENDCHAR +STARTCHAR uni1E3D +ENCODING 7741 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 14 2 -3 +BITMAP +E0 +60 +60 +60 +60 +60 +60 +60 +60 +60 +38 +20 +70 +D8 +ENDCHAR +STARTCHAR uni1E3E +ENCODING 7742 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +0C +18 +C3 +C3 +E7 +E7 +FF +FF +DB +DB +C3 +C3 +C3 +ENDCHAR +STARTCHAR uni1E3F +ENCODING 7743 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +0C +0C +18 +00 +FE +DB +DB +DB +DB +DB +DB +DB +ENDCHAR +STARTCHAR uni1E40 +ENCODING 7744 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +08 +00 +C3 +C3 +E7 +E7 +FF +FF +DB +DB +C3 +C3 +C3 +ENDCHAR +STARTCHAR uni1E41 +ENCODING 7745 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +08 +00 +00 +FE +DB +DB +DB +DB +DB +DB +DB +ENDCHAR +STARTCHAR uni1E42 +ENCODING 7746 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 -2 +BITMAP +C3 +C3 +E7 +E7 +FF +FF +DB +DB +C3 +C3 +C3 +00 +08 +ENDCHAR +STARTCHAR uni1E43 +ENCODING 7747 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 10 0 -2 +BITMAP +FE +DB +DB +DB +DB +DB +DB +DB +00 +08 +ENDCHAR +STARTCHAR uni1E44 +ENCODING 7748 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +10 +00 +C6 +C6 +E6 +E6 +F6 +D6 +DE +CE +CE +C6 +C6 +ENDCHAR +STARTCHAR uni1E45 +ENCODING 7749 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +10 +00 +00 +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR uni1E46 +ENCODING 7750 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +C6 +C6 +E6 +E6 +F6 +D6 +DE +CE +CE +C6 +C6 +00 +10 +ENDCHAR +STARTCHAR uni1E47 +ENCODING 7751 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 -2 +BITMAP +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +00 +10 +ENDCHAR +STARTCHAR uni1E48 +ENCODING 7752 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +C6 +C6 +E6 +E6 +F6 +D6 +DE +CE +CE +C6 +C6 +00 +7C +ENDCHAR +STARTCHAR uni1E49 +ENCODING 7753 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 -2 +BITMAP +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +00 +7C +ENDCHAR +STARTCHAR uni1E4A +ENCODING 7754 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +C6 +C6 +E6 +E6 +F6 +D6 +DE +CE +CE +C6 +C6 +10 +38 +6C +ENDCHAR +STARTCHAR uni1E4B +ENCODING 7755 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +10 +38 +6C +ENDCHAR +STARTCHAR uni1E4C +ENCODING 7756 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +6D +D6 +00 +3E +63 +63 +63 +63 +63 +63 +63 +63 +3E +ENDCHAR +STARTCHAR uni1E4D +ENCODING 7757 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +60 +C0 +3B +6E +00 +3E +63 +63 +63 +63 +63 +63 +3E +ENDCHAR +STARTCHAR uni1E4E +ENCODING 7758 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +00 +76 +DC +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1E4F +ENCODING 7759 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +6C +00 +76 +DC +00 +7C +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1E50 +ENCODING 7760 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +60 +30 +7C +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1E51 +ENCODING 7761 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +30 +18 +00 +7C +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1E52 +ENCODING 7762 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +18 +30 +7C +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1E53 +ENCODING 7763 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +18 +30 +00 +7C +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1E54 +ENCODING 7764 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +18 +30 +00 +FC +C6 +C6 +C6 +C6 +C6 +FC +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni1E55 +ENCODING 7765 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +0C +18 +00 +00 +FC +C6 +C6 +C6 +C6 +C6 +C6 +FC +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni1E56 +ENCODING 7766 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +10 +00 +FC +C6 +C6 +C6 +C6 +C6 +FC +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni1E57 +ENCODING 7767 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +10 +00 +00 +FC +C6 +C6 +C6 +C6 +C6 +C6 +FC +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni1E58 +ENCODING 7768 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +10 +00 +FC +C6 +C6 +C6 +C6 +FC +E0 +F0 +D8 +CC +C6 +ENDCHAR +STARTCHAR uni1E59 +ENCODING 7769 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +10 +00 +00 +DE +E0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni1E5A +ENCODING 7770 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +FC +C6 +C6 +C6 +C6 +FC +E0 +F0 +D8 +CC +C6 +00 +10 +ENDCHAR +STARTCHAR uni1E5B +ENCODING 7771 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 -2 +BITMAP +DE +E0 +C0 +C0 +C0 +C0 +C0 +C0 +00 +10 +ENDCHAR +STARTCHAR uni1E5C +ENCODING 7772 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -2 +BITMAP +7C +00 +FC +C6 +C6 +C6 +C6 +FC +E0 +F0 +D8 +CC +C6 +00 +10 +ENDCHAR +STARTCHAR uni1E5D +ENCODING 7773 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 -2 +BITMAP +7C +00 +DE +E0 +C0 +C0 +C0 +C0 +C0 +C0 +00 +10 +ENDCHAR +STARTCHAR uni1E5E +ENCODING 7774 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +FC +C6 +C6 +C6 +C6 +FC +E0 +F0 +D8 +CC +C6 +00 +7C +ENDCHAR +STARTCHAR uni1E5F +ENCODING 7775 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 -2 +BITMAP +DE +E0 +C0 +C0 +C0 +C0 +C0 +C0 +00 +7C +ENDCHAR +STARTCHAR uni1E60 +ENCODING 7776 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +10 +00 +7E +C0 +C0 +C0 +C0 +7C +06 +06 +06 +06 +FC +ENDCHAR +STARTCHAR uni1E61 +ENCODING 7777 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +10 +00 +00 +7E +C0 +C0 +70 +1C +06 +06 +FC +ENDCHAR +STARTCHAR uni1E62 +ENCODING 7778 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +7E +C0 +C0 +C0 +C0 +7C +06 +06 +06 +06 +FC +00 +10 +ENDCHAR +STARTCHAR uni1E63 +ENCODING 7779 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 -2 +BITMAP +7E +C0 +C0 +70 +1C +06 +06 +FC +00 +10 +ENDCHAR +STARTCHAR uni1E64 +ENCODING 7780 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +26 +0C +00 +7E +C0 +C0 +C0 +7C +06 +06 +06 +06 +FC +ENDCHAR +STARTCHAR uni1E65 +ENCODING 7781 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +0C +58 +00 +00 +7E +C0 +C0 +70 +1C +06 +06 +FC +ENDCHAR +STARTCHAR uni1E66 +ENCODING 7782 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +10 +6C +38 +10 +00 +7E +C0 +C0 +7C +06 +06 +06 +FC +ENDCHAR +STARTCHAR uni1E67 +ENCODING 7783 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +10 +00 +6C +38 +10 +00 +7E +C0 +C0 +7C +06 +06 +FC +ENDCHAR +STARTCHAR uni1E68 +ENCODING 7784 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -2 +BITMAP +10 +00 +7E +C0 +C0 +C0 +C0 +7C +06 +06 +06 +06 +FC +00 +10 +ENDCHAR +STARTCHAR uni1E69 +ENCODING 7785 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +10 +00 +00 +7E +C0 +C0 +70 +1C +06 +06 +FC +00 +10 +ENDCHAR +STARTCHAR uni1E6A +ENCODING 7786 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +08 +00 +FF +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni1E6B +ENCODING 7787 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +20 +00 +60 +60 +60 +FC +60 +60 +60 +60 +60 +60 +3E +ENDCHAR +STARTCHAR uni1E6C +ENCODING 7788 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 -2 +BITMAP +FF +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +00 +08 +ENDCHAR +STARTCHAR uni1E6D +ENCODING 7789 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +60 +60 +60 +FC +60 +60 +60 +60 +60 +60 +3E +00 +08 +ENDCHAR +STARTCHAR uni1E6E +ENCODING 7790 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 -2 +BITMAP +FF +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +00 +7E +ENDCHAR +STARTCHAR uni1E6F +ENCODING 7791 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +60 +60 +60 +FC +60 +60 +60 +60 +60 +60 +3E +00 +7C +ENDCHAR +STARTCHAR uni1E70 +ENCODING 7792 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +FF +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +08 +1C +36 +ENDCHAR +STARTCHAR uni1E71 +ENCODING 7793 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +60 +60 +60 +FC +60 +60 +60 +60 +60 +60 +3E +10 +38 +6C +ENDCHAR +STARTCHAR uni1E72 +ENCODING 7794 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +00 +6C +ENDCHAR +STARTCHAR uni1E73 +ENCODING 7795 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 -2 +BITMAP +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +00 +6C +ENDCHAR +STARTCHAR uni1E74 +ENCODING 7796 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +00 +76 +DC +ENDCHAR +STARTCHAR uni1E75 +ENCODING 7797 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +00 +76 +DC +ENDCHAR +STARTCHAR uni1E76 +ENCODING 7798 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +10 +38 +6C +ENDCHAR +STARTCHAR uni1E77 +ENCODING 7799 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +10 +38 +6C +ENDCHAR +STARTCHAR uni1E78 +ENCODING 7800 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +6D +D6 +00 +63 +63 +63 +63 +63 +63 +63 +63 +63 +3E +ENDCHAR +STARTCHAR uni1E79 +ENCODING 7801 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +60 +C0 +3B +6E +00 +63 +63 +63 +63 +63 +63 +63 +3E +ENDCHAR +STARTCHAR uni1E7A +ENCODING 7802 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +00 +7C +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1E7B +ENCODING 7803 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +6C +00 +7C +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1E7C +ENCODING 7804 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +3B +6E +00 +C3 +C3 +66 +66 +66 +3C +3C +3C +18 +18 +ENDCHAR +STARTCHAR uni1E7D +ENCODING 7805 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +3B +6E +00 +C3 +C3 +66 +66 +3C +3C +18 +18 +ENDCHAR +STARTCHAR uni1E7E +ENCODING 7806 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 -2 +BITMAP +C3 +C3 +C3 +66 +66 +66 +3C +3C +3C +18 +18 +00 +08 +ENDCHAR +STARTCHAR uni1E7F +ENCODING 7807 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 10 0 -2 +BITMAP +C3 +C3 +66 +66 +3C +3C +18 +18 +00 +08 +ENDCHAR +STARTCHAR Wgrave +ENCODING 7808 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +30 +18 +C3 +C3 +C3 +DB +DB +FF +FF +E7 +E7 +C3 +C3 +ENDCHAR +STARTCHAR wgrave +ENCODING 7809 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +30 +30 +18 +00 +C3 +C3 +DB +DB +FF +FF +66 +66 +ENDCHAR +STARTCHAR Wacute +ENCODING 7810 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +0C +18 +C3 +C3 +C3 +DB +DB +FF +FF +E7 +E7 +C3 +C3 +ENDCHAR +STARTCHAR wacute +ENCODING 7811 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +0C +0C +18 +00 +C3 +C3 +DB +DB +FF +FF +6C +6C +ENDCHAR +STARTCHAR Wdieresis +ENCODING 7812 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +66 +00 +C3 +C3 +C3 +DB +DB +FF +FF +E7 +E7 +C3 +C3 +ENDCHAR +STARTCHAR wdieresis +ENCODING 7813 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +66 +00 +00 +C3 +C3 +DB +DB +FF +FF +66 +66 +ENDCHAR +STARTCHAR uni1E86 +ENCODING 7814 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +10 +00 +C3 +C3 +C3 +DB +DB +FF +FF +E7 +E7 +C3 +C3 +ENDCHAR +STARTCHAR uni1E87 +ENCODING 7815 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +10 +00 +00 +C3 +C3 +DB +DB +FF +FF +66 +66 +ENDCHAR +STARTCHAR uni1E88 +ENCODING 7816 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 -2 +BITMAP +C3 +C3 +C3 +DB +DB +FF +FF +E7 +E7 +C3 +C3 +00 +10 +ENDCHAR +STARTCHAR uni1E89 +ENCODING 7817 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 10 0 -2 +BITMAP +C3 +C3 +DB +DB +FF +FF +66 +66 +00 +10 +ENDCHAR +STARTCHAR uni1E8A +ENCODING 7818 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +10 +00 +C3 +66 +66 +3C +3C +18 +3C +3C +66 +66 +C3 +ENDCHAR +STARTCHAR uni1E8B +ENCODING 7819 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +10 +00 +00 +C6 +C6 +6C +38 +38 +6C +C6 +C6 +ENDCHAR +STARTCHAR uni1E8C +ENCODING 7820 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +66 +00 +C3 +66 +66 +3C +3C +18 +3C +3C +66 +66 +C3 +ENDCHAR +STARTCHAR uni1E8D +ENCODING 7821 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +6C +00 +00 +C6 +C6 +6C +38 +38 +6C +C6 +C6 +ENDCHAR +STARTCHAR uni1E8E +ENCODING 7822 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +10 +00 +C3 +C3 +66 +66 +3C +3C +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni1E8F +ENCODING 7823 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +10 +00 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +7C +ENDCHAR +STARTCHAR uni1E90 +ENCODING 7824 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +10 +38 +6C +00 +FE +0C +18 +18 +30 +30 +60 +60 +FE +ENDCHAR +STARTCHAR uni1E91 +ENCODING 7825 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +10 +38 +6C +00 +FE +06 +0C +18 +30 +60 +C0 +FE +ENDCHAR +STARTCHAR uni1E92 +ENCODING 7826 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +FE +06 +0C +0C +18 +18 +30 +30 +60 +60 +FE +00 +10 +ENDCHAR +STARTCHAR uni1E93 +ENCODING 7827 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 -2 +BITMAP +FE +06 +0C +18 +30 +60 +C0 +FE +00 +10 +ENDCHAR +STARTCHAR uni1E94 +ENCODING 7828 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +FE +06 +0C +0C +18 +18 +30 +30 +60 +60 +FE +00 +7C +ENDCHAR +STARTCHAR uni1E95 +ENCODING 7829 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 -2 +BITMAP +FE +06 +0C +18 +30 +60 +C0 +FE +00 +7C +ENDCHAR +STARTCHAR uni1E96 +ENCODING 7830 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +C0 +C0 +C0 +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +00 +7C +ENDCHAR +STARTCHAR uni1E97 +ENCODING 7831 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +CC +00 +60 +60 +60 +FC +60 +60 +60 +60 +60 +60 +3E +ENDCHAR +STARTCHAR uni1E98 +ENCODING 7832 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +38 +6C +38 +00 +C3 +C3 +DB +DB +FF +FF +66 +66 +ENDCHAR +STARTCHAR uni1E99 +ENCODING 7833 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +38 +6C +38 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +7C +ENDCHAR +STARTCHAR uni1E9A +ENCODING 7834 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +0C +06 +06 +0C +7C +06 +06 +7E +C6 +C6 +C6 +7E +ENDCHAR +STARTCHAR uni1E9B +ENCODING 7835 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 13 3 0 +BITMAP +20 +00 +78 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni1E9C +ENCODING 7836 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +1E +30 +30 +30 +30 +3C +F0 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni1E9D +ENCODING 7837 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 2 0 +BITMAP +3C +60 +F0 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR uni1E9E +ENCODING 7838 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +38 +6C +C6 +CE +D8 +D8 +CC +CC +C6 +C6 +DC +ENDCHAR +STARTCHAR uni1E9F +ENCODING 7839 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +3C +60 +60 +38 +6C +C6 +C6 +C6 +C6 +6C +38 +ENDCHAR +STARTCHAR uni1EA0 +ENCODING 7840 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 -2 +BITMAP +18 +18 +3C +3C +3C +66 +66 +7E +C3 +C3 +C3 +00 +08 +ENDCHAR +STARTCHAR uni1EA1 +ENCODING 7841 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 -2 +BITMAP +7C +06 +06 +7E +C6 +C6 +C6 +7E +00 +10 +ENDCHAR +STARTCHAR uni1EA2 +ENCODING 7842 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +70 +18 +30 +18 +18 +3C +3C +3C +66 +66 +7E +C3 +C3 +ENDCHAR +STARTCHAR uni1EA3 +ENCODING 7843 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +70 +18 +30 +00 +7C +06 +06 +7E +C6 +C6 +C6 +7E +ENDCHAR +STARTCHAR uni1EA4 +ENCODING 7844 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +23 +76 +D8 +00 +18 +18 +3C +3C +66 +66 +FF +C3 +C3 +ENDCHAR +STARTCHAR uni1EA5 +ENCODING 7845 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +06 +2C +70 +D8 +00 +7C +06 +06 +7E +C6 +C6 +C6 +7E +ENDCHAR +STARTCHAR uni1EA6 +ENCODING 7846 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 13 0 0 +BITMAP +C400 +6E00 +1B00 +0000 +0C00 +0C00 +1E00 +1E00 +3300 +3300 +7F80 +6180 +6180 +ENDCHAR +STARTCHAR uni1EA7 +ENCODING 7847 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +C0 +68 +1C +36 +00 +3E +03 +03 +3F +63 +63 +63 +3F +ENDCHAR +STARTCHAR uni1EA8 +ENCODING 7848 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +26 +73 +DB +00 +18 +18 +3C +3C +66 +66 +FF +C3 +C3 +ENDCHAR +STARTCHAR uni1EA9 +ENCODING 7849 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +0C +26 +76 +D8 +00 +7C +06 +06 +7E +C6 +C6 +C6 +7E +ENDCHAR +STARTCHAR uni1EAA +ENCODING 7850 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +3B +6E +10 +38 +6C +18 +18 +3C +3C +66 +7E +C3 +C3 +ENDCHAR +STARTCHAR uni1EAB +ENCODING 7851 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +76 +DC +20 +70 +D8 +00 +7C +06 +06 +7E +C6 +C6 +7E +ENDCHAR +STARTCHAR uni1EAC +ENCODING 7852 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 15 0 -2 +BITMAP +08 +1C +36 +18 +18 +3C +3C +3C +66 +66 +7E +C3 +C3 +00 +08 +ENDCHAR +STARTCHAR uni1EAD +ENCODING 7853 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -2 +BITMAP +10 +38 +6C +00 +7C +06 +06 +7E +C6 +C6 +C6 +7E +00 +10 +ENDCHAR +STARTCHAR uni1EAE +ENCODING 7854 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +0C +18 +66 +3C +00 +18 +18 +3C +3C +66 +7E +C3 +C3 +ENDCHAR +STARTCHAR uni1EAF +ENCODING 7855 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +18 +30 +CC +78 +00 +7C +06 +06 +7E +C6 +C6 +C6 +7E +ENDCHAR +STARTCHAR uni1EB0 +ENCODING 7856 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +30 +18 +66 +3C +00 +18 +18 +3C +3C +66 +7E +C3 +C3 +ENDCHAR +STARTCHAR uni1EB1 +ENCODING 7857 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +60 +30 +CC +78 +00 +7C +06 +06 +7E +C6 +C6 +C6 +7E +ENDCHAR +STARTCHAR uni1EB2 +ENCODING 7858 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +30 +08 +66 +3C +00 +18 +18 +3C +3C +66 +7E +C3 +C3 +ENDCHAR +STARTCHAR uni1EB3 +ENCODING 7859 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +60 +10 +6C +38 +00 +7C +06 +06 +7E +C6 +C6 +C6 +7E +ENDCHAR +STARTCHAR uni1EB4 +ENCODING 7860 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +3B +6E +00 +66 +3C +00 +18 +18 +3C +24 +7E +66 +C3 +ENDCHAR +STARTCHAR uni1EB5 +ENCODING 7861 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +76 +DC +00 +6C +38 +00 +7C +06 +06 +7E +C6 +C6 +7E +ENDCHAR +STARTCHAR uni1EB6 +ENCODING 7862 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 15 0 -2 +BITMAP +66 +3C +00 +18 +18 +3C +3C +3C +66 +66 +7E +C3 +C3 +00 +08 +ENDCHAR +STARTCHAR uni1EB7 +ENCODING 7863 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +6C +38 +00 +7C +06 +06 +7E +C6 +C6 +C6 +7E +00 +10 +ENDCHAR +STARTCHAR uni1EB8 +ENCODING 7864 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +FE +C0 +C0 +C0 +C0 +FC +C0 +C0 +C0 +C0 +FE +00 +10 +ENDCHAR +STARTCHAR uni1EB9 +ENCODING 7865 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 -2 +BITMAP +7C +C6 +C6 +C6 +FE +C0 +C0 +7E +00 +10 +ENDCHAR +STARTCHAR uni1EBA +ENCODING 7866 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +38 +0C +18 +FE +C0 +C0 +C0 +FC +C0 +C0 +C0 +C0 +FE +ENDCHAR +STARTCHAR uni1EBB +ENCODING 7867 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +38 +0C +18 +00 +7C +C6 +C6 +C6 +FE +C0 +C0 +7E +ENDCHAR +STARTCHAR uni1EBC +ENCODING 7868 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +76 +DC +00 +FE +C0 +C0 +C0 +FC +C0 +C0 +C0 +C0 +FE +ENDCHAR +STARTCHAR uni1EBD +ENCODING 7869 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +76 +DC +00 +7C +C6 +C6 +C6 +FE +C0 +C0 +7E +ENDCHAR +STARTCHAR uni1EBE +ENCODING 7870 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +06 +2C +70 +D8 +00 +FE +C0 +C0 +FC +C0 +C0 +C0 +FE +ENDCHAR +STARTCHAR uni1EBF +ENCODING 7871 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +06 +2C +70 +D8 +00 +7C +C6 +C6 +C6 +FE +C0 +C0 +7E +ENDCHAR +STARTCHAR uni1EC0 +ENCODING 7872 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +C0 +68 +1C +36 +00 +7F +60 +60 +7C +60 +60 +60 +7F +ENDCHAR +STARTCHAR uni1EC1 +ENCODING 7873 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +C0 +68 +1C +36 +00 +3E +63 +63 +63 +7F +60 +60 +3F +ENDCHAR +STARTCHAR uni1EC2 +ENCODING 7874 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +04 +22 +72 +D8 +00 +FE +C0 +C0 +FC +C0 +C0 +C0 +FE +ENDCHAR +STARTCHAR uni1EC3 +ENCODING 7875 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +04 +22 +72 +D8 +00 +7C +C6 +C6 +C6 +FE +C0 +C0 +7E +ENDCHAR +STARTCHAR uni1EC4 +ENCODING 7876 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +76 +DC +20 +70 +D8 +00 +FE +C0 +C0 +FC +C0 +C0 +FE +ENDCHAR +STARTCHAR uni1EC5 +ENCODING 7877 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +76 +DC +20 +70 +D8 +00 +7C +C6 +C6 +FE +C0 +C0 +7E +ENDCHAR +STARTCHAR uni1EC6 +ENCODING 7878 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -2 +BITMAP +10 +38 +6C +00 +FE +C0 +C0 +C0 +FC +C0 +C0 +C0 +FE +00 +10 +ENDCHAR +STARTCHAR uni1EC7 +ENCODING 7879 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -2 +BITMAP +10 +38 +6C +00 +7C +C6 +C6 +C6 +FE +C0 +C0 +7E +00 +10 +ENDCHAR +STARTCHAR uni1EC8 +ENCODING 7880 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +70 +18 +30 +00 +FC +30 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni1EC9 +ENCODING 7881 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 2 0 +BITMAP +70 +18 +30 +00 +F0 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni1ECA +ENCODING 7882 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +FC +30 +30 +30 +30 +30 +30 +30 +30 +30 +FC +00 +10 +ENDCHAR +STARTCHAR uni1ECB +ENCODING 7883 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 2 -2 +BITMAP +30 +00 +00 +F0 +30 +30 +30 +30 +30 +30 +FC +00 +10 +ENDCHAR +STARTCHAR uni1ECC +ENCODING 7884 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +00 +10 +ENDCHAR +STARTCHAR uni1ECD +ENCODING 7885 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 -2 +BITMAP +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +00 +10 +ENDCHAR +STARTCHAR uni1ECE +ENCODING 7886 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +70 +18 +30 +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1ECF +ENCODING 7887 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +38 +0C +18 +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1ED0 +ENCODING 7888 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +23 +76 +D8 +00 +3E +63 +63 +63 +63 +63 +63 +63 +3E +ENDCHAR +STARTCHAR uni1ED1 +ENCODING 7889 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +06 +2C +70 +D8 +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1ED2 +ENCODING 7890 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +C4 +6E +1B +00 +3E +63 +63 +63 +63 +63 +63 +63 +3E +ENDCHAR +STARTCHAR uni1ED3 +ENCODING 7891 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +C0 +68 +1C +36 +00 +3E +63 +63 +63 +63 +63 +63 +3E +ENDCHAR +STARTCHAR uni1ED4 +ENCODING 7892 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +24 +72 +DA +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1ED5 +ENCODING 7893 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +04 +12 +3A +6C +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1ED6 +ENCODING 7894 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +76 +DC +20 +70 +D8 +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1ED7 +ENCODING 7895 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +76 +DC +20 +70 +D8 +00 +7C +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1ED8 +ENCODING 7896 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -2 +BITMAP +10 +38 +6C +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +00 +10 +ENDCHAR +STARTCHAR uni1ED9 +ENCODING 7897 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -2 +BITMAP +10 +38 +6C +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +00 +10 +ENDCHAR +STARTCHAR uni1EDA +ENCODING 7898 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +18 +32 +02 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1EDB +ENCODING 7899 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +0C +18 +02 +02 +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1EDC +ENCODING 7900 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +60 +32 +02 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1EDD +ENCODING 7901 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +60 +30 +02 +02 +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1EDE +ENCODING 7902 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +70 +18 +32 +02 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1EDF +ENCODING 7903 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +70 +18 +32 +02 +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1EE0 +ENCODING 7904 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +76 +DD +01 +3E +63 +63 +63 +63 +63 +63 +63 +63 +3E +ENDCHAR +STARTCHAR uni1EE1 +ENCODING 7905 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +76 +DC +01 +01 +3E +63 +63 +63 +63 +63 +63 +3E +ENDCHAR +STARTCHAR uni1EE2 +ENCODING 7906 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -2 +BITMAP +02 +02 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +00 +10 +ENDCHAR +STARTCHAR uni1EE3 +ENCODING 7907 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 -2 +BITMAP +02 +02 +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +00 +10 +ENDCHAR +STARTCHAR uni1EE4 +ENCODING 7908 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +00 +10 +ENDCHAR +STARTCHAR uni1EE5 +ENCODING 7909 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 -2 +BITMAP +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +00 +10 +ENDCHAR +STARTCHAR uni1EE6 +ENCODING 7910 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +70 +18 +30 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1EE7 +ENCODING 7911 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +70 +18 +30 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1EE8 +ENCODING 7912 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +18 +31 +01 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1EE9 +ENCODING 7913 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +0C +18 +01 +01 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1EEA +ENCODING 7914 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +60 +31 +01 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1EEB +ENCODING 7915 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +60 +30 +01 +01 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1EEC +ENCODING 7916 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +70 +19 +31 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1EED +ENCODING 7917 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +70 +19 +31 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1EEE +ENCODING 7918 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +34 +59 +01 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1EEF +ENCODING 7919 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +34 +59 +01 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1EF0 +ENCODING 7920 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 15 0 -2 +BITMAP +01 +01 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +00 +10 +ENDCHAR +STARTCHAR uni1EF1 +ENCODING 7921 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 -2 +BITMAP +01 +01 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +00 +10 +ENDCHAR +STARTCHAR Ygrave +ENCODING 7922 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +30 +18 +C3 +C3 +66 +66 +3C +3C +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR ygrave +ENCODING 7923 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +60 +30 +00 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +7C +ENDCHAR +STARTCHAR uni1EF4 +ENCODING 7924 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 -2 +BITMAP +C3 +C3 +66 +66 +3C +3C +18 +18 +18 +18 +18 +00 +08 +ENDCHAR +STARTCHAR uni1EF5 +ENCODING 7925 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 1 -3 +BITMAP +CC +CC +CC +CC +CC +CC +CC +7C +0C +0C +79 +ENDCHAR +STARTCHAR uni1EF6 +ENCODING 7926 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +38 +0C +18 +C3 +C3 +66 +66 +3C +3C +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni1EF7 +ENCODING 7927 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +38 +0C +18 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +7C +ENDCHAR +STARTCHAR uni1EF8 +ENCODING 7928 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +3B +6E +00 +C3 +C3 +66 +66 +3C +3C +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni1EF9 +ENCODING 7929 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +76 +DC +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7E +06 +06 +7C +ENDCHAR +STARTCHAR uni1EFA +ENCODING 7930 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +D8 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +FF +ENDCHAR +STARTCHAR uni1EFB +ENCODING 7931 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +6C +6C +FE +6C +6C +6C +6C +6C +6C +6C +6C +ENDCHAR +STARTCHAR uni1EFC +ENCODING 7932 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +0C +18 +30 +30 +60 +6C +C6 +C6 +C6 +6C +38 +ENDCHAR +STARTCHAR uni1EFD +ENCODING 7933 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +18 +30 +60 +60 +CC +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1EFE +ENCODING 7934 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +C6 +C6 +C6 +C6 +C6 +C6 +7E +06 +46 +A6 +7C +ENDCHAR +STARTCHAR uni1EFF +ENCODING 7935 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +C6 +C6 +C6 +C6 +C6 +C6 +7E +06 +46 +A6 +7C +ENDCHAR +STARTCHAR uni1F00 +ENCODING 7936 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +0C +0C +18 +00 +73 +DE +DE +CC +CC +DE +DE +73 +ENDCHAR +STARTCHAR uni1F01 +ENCODING 7937 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +30 +30 +18 +00 +73 +DE +DE +CC +CC +DE +DE +73 +ENDCHAR +STARTCHAR uni1F02 +ENCODING 7938 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +36 +33 +60 +00 +73 +DE +DE +CC +CC +DE +DE +73 +ENDCHAR +STARTCHAR uni1F03 +ENCODING 7939 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +66 +63 +30 +00 +73 +DE +DE +CC +CC +DE +DE +73 +ENDCHAR +STARTCHAR uni1F04 +ENCODING 7940 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +33 +36 +60 +00 +73 +DE +DE +CC +CC +DE +DE +73 +ENDCHAR +STARTCHAR uni1F05 +ENCODING 7941 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +63 +66 +30 +00 +73 +DE +DE +CC +CC +DE +DE +73 +ENDCHAR +STARTCHAR uni1F06 +ENCODING 7942 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +3B +6E +18 +18 +30 +00 +73 +DE +DE +CC +DE +DE +73 +ENDCHAR +STARTCHAR uni1F07 +ENCODING 7943 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +3B +6E +18 +18 +0C +00 +73 +DE +DE +CC +DE +DE +73 +ENDCHAR +STARTCHAR uni1F08 +ENCODING 7944 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +60 +60 +C0 +18 +18 +3C +3C +3C +66 +66 +7E +C3 +C3 +ENDCHAR +STARTCHAR uni1F09 +ENCODING 7945 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +C0 +C0 +60 +18 +18 +3C +3C +3C +66 +66 +7E +C3 +C3 +ENDCHAR +STARTCHAR uni1F0A +ENCODING 7946 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +6C +66 +C0 +18 +18 +3C +3C +3C +66 +66 +7E +C3 +C3 +ENDCHAR +STARTCHAR uni1F0B +ENCODING 7947 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +D8 +CC +60 +18 +18 +3C +3C +3C +66 +66 +7E +C3 +C3 +ENDCHAR +STARTCHAR uni1F0C +ENCODING 7948 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +66 +6C +C0 +18 +18 +3C +3C +3C +66 +66 +7E +C3 +C3 +ENDCHAR +STARTCHAR uni1F0D +ENCODING 7949 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +C6 +CC +60 +18 +18 +3C +3C +3C +66 +66 +7E +C3 +C3 +ENDCHAR +STARTCHAR uni1F0E +ENCODING 7950 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +3B +6E +00 +68 +68 +DC +1C +1C +36 +36 +3E +63 +63 +ENDCHAR +STARTCHAR uni1F0F +ENCODING 7951 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +3B +6E +00 +C8 +C8 +7C +1C +1C +36 +36 +3E +63 +63 +ENDCHAR +STARTCHAR uni1F10 +ENCODING 7952 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +18 +18 +30 +00 +7E +C0 +C0 +7C +C0 +C0 +C0 +7E +ENDCHAR +STARTCHAR uni1F11 +ENCODING 7953 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +30 +30 +18 +00 +7E +C0 +C0 +7C +C0 +C0 +C0 +7E +ENDCHAR +STARTCHAR uni1F12 +ENCODING 7954 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +6C +66 +C0 +00 +7E +C0 +C0 +7C +C0 +C0 +C0 +7E +ENDCHAR +STARTCHAR uni1F13 +ENCODING 7955 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +CC +C6 +60 +00 +7E +C0 +C0 +7C +C0 +C0 +C0 +7E +ENDCHAR +STARTCHAR uni1F14 +ENCODING 7956 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +66 +6C +C0 +00 +7E +C0 +C0 +7C +C0 +C0 +C0 +7E +ENDCHAR +STARTCHAR uni1F15 +ENCODING 7957 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +C6 +CC +60 +00 +7E +C0 +C0 +7C +C0 +C0 +C0 +7E +ENDCHAR +STARTCHAR uni1F18 +ENCODING 7960 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +60 +60 +C0 +00 +7F +60 +60 +60 +7E +60 +60 +60 +7F +ENDCHAR +STARTCHAR uni1F19 +ENCODING 7961 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +C0 +C0 +60 +00 +7F +60 +60 +60 +7E +60 +60 +60 +7F +ENDCHAR +STARTCHAR uni1F1A +ENCODING 7962 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +6C +66 +C0 +00 +7F +60 +60 +60 +7E +60 +60 +60 +7F +ENDCHAR +STARTCHAR uni1F1B +ENCODING 7963 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +CC +C6 +60 +00 +7F +60 +60 +60 +7E +60 +60 +60 +7F +ENDCHAR +STARTCHAR uni1F1C +ENCODING 7964 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +66 +6C +C0 +00 +7F +60 +60 +60 +7E +60 +60 +60 +7F +ENDCHAR +STARTCHAR uni1F1D +ENCODING 7965 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +C6 +CC +60 +00 +7F +60 +60 +60 +7E +60 +60 +60 +7F +ENDCHAR +STARTCHAR uni1F20 +ENCODING 7968 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +18 +18 +30 +00 +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +06 +06 +06 +ENDCHAR +STARTCHAR uni1F21 +ENCODING 7969 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +30 +30 +18 +00 +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +06 +06 +06 +ENDCHAR +STARTCHAR uni1F22 +ENCODING 7970 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +6C +66 +C0 +00 +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +06 +06 +06 +ENDCHAR +STARTCHAR uni1F23 +ENCODING 7971 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +CC +C6 +60 +00 +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +06 +06 +06 +ENDCHAR +STARTCHAR uni1F24 +ENCODING 7972 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +66 +6C +C0 +00 +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +06 +06 +06 +ENDCHAR +STARTCHAR uni1F25 +ENCODING 7973 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +C6 +CC +60 +00 +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +06 +06 +06 +ENDCHAR +STARTCHAR uni1F26 +ENCODING 7974 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 16 1 -3 +BITMAP +76 +DC +30 +30 +60 +00 +FC +C6 +C6 +C6 +C6 +C6 +C6 +06 +06 +06 +ENDCHAR +STARTCHAR uni1F27 +ENCODING 7975 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 16 1 -3 +BITMAP +76 +DC +30 +30 +18 +00 +FC +C6 +C6 +C6 +C6 +C6 +C6 +06 +06 +06 +ENDCHAR +STARTCHAR uni1F28 +ENCODING 7976 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +60 +60 +C0 +00 +63 +63 +63 +63 +7F +63 +63 +63 +63 +ENDCHAR +STARTCHAR uni1F29 +ENCODING 7977 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +C0 +C0 +60 +00 +63 +63 +63 +63 +7F +63 +63 +63 +63 +ENDCHAR +STARTCHAR uni1F2A +ENCODING 7978 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +6C +66 +C0 +00 +63 +63 +63 +63 +7F +63 +63 +63 +63 +ENDCHAR +STARTCHAR uni1F2B +ENCODING 7979 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +CC +C6 +60 +00 +63 +63 +63 +63 +7F +63 +63 +63 +63 +ENDCHAR +STARTCHAR uni1F2C +ENCODING 7980 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +66 +6C +C0 +00 +63 +63 +63 +63 +7F +63 +63 +63 +63 +ENDCHAR +STARTCHAR uni1F2D +ENCODING 7981 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +C6 +CC +60 +00 +63 +63 +63 +63 +7F +63 +63 +63 +63 +ENDCHAR +STARTCHAR uni1F2E +ENCODING 7982 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +CD +D6 +60 +00 +63 +63 +63 +63 +7F +63 +63 +63 +63 +ENDCHAR +STARTCHAR uni1F2F +ENCODING 7983 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +6D +76 +C0 +00 +63 +63 +63 +63 +7F +63 +63 +63 +63 +ENDCHAR +STARTCHAR uni1F30 +ENCODING 7984 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 12 2 0 +BITMAP +60 +60 +C0 +00 +E0 +60 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR uni1F31 +ENCODING 7985 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 12 2 0 +BITMAP +C0 +C0 +60 +00 +E0 +60 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR uni1F32 +ENCODING 7986 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +6C +66 +C0 +00 +70 +30 +30 +30 +30 +30 +30 +1C +ENDCHAR +STARTCHAR uni1F33 +ENCODING 7987 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +CC +C6 +60 +00 +70 +30 +30 +30 +30 +30 +30 +1C +ENDCHAR +STARTCHAR uni1F34 +ENCODING 7988 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +66 +6C +C0 +00 +70 +30 +30 +30 +30 +30 +30 +1C +ENDCHAR +STARTCHAR uni1F35 +ENCODING 7989 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +C6 +CC +60 +00 +70 +30 +30 +30 +30 +30 +30 +1C +ENDCHAR +STARTCHAR uni1F36 +ENCODING 7990 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +76 +DC +30 +30 +60 +00 +70 +30 +30 +30 +30 +30 +1C +ENDCHAR +STARTCHAR uni1F37 +ENCODING 7991 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +76 +DC +60 +60 +30 +00 +70 +30 +30 +30 +30 +30 +1C +ENDCHAR +STARTCHAR uni1F38 +ENCODING 7992 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +60 +60 +CF +06 +06 +06 +06 +06 +06 +06 +06 +06 +0F +ENDCHAR +STARTCHAR uni1F39 +ENCODING 7993 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +C0 +C0 +6F +06 +06 +06 +06 +06 +06 +06 +06 +06 +0F +ENDCHAR +STARTCHAR uni1F3A +ENCODING 7994 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +6C +66 +C0 +00 +7E +18 +18 +18 +18 +18 +18 +18 +7E +ENDCHAR +STARTCHAR uni1F3B +ENCODING 7995 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +CC +C6 +60 +00 +7E +18 +18 +18 +18 +18 +18 +18 +7E +ENDCHAR +STARTCHAR uni1F3C +ENCODING 7996 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +66 +6C +C0 +00 +7E +18 +18 +18 +18 +18 +18 +18 +7E +ENDCHAR +STARTCHAR uni1F3D +ENCODING 7997 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +C6 +CC +60 +00 +7E +18 +18 +18 +18 +18 +18 +18 +7E +ENDCHAR +STARTCHAR uni1F3E +ENCODING 7998 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +3B +6E +00 +6F +66 +C6 +06 +06 +06 +06 +06 +06 +0F +ENDCHAR +STARTCHAR uni1F3F +ENCODING 7999 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +3B +6E +00 +CF +C6 +66 +06 +06 +06 +06 +06 +06 +0F +ENDCHAR +STARTCHAR uni1F40 +ENCODING 8000 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +18 +18 +30 +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1F41 +ENCODING 8001 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +30 +30 +18 +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1F42 +ENCODING 8002 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +6C +66 +C0 +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1F43 +ENCODING 8003 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +CC +C6 +60 +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1F44 +ENCODING 8004 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +66 +6C +C0 +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1F45 +ENCODING 8005 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +C6 +CC +60 +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1F48 +ENCODING 8008 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +60 +60 +DE +33 +33 +33 +33 +33 +33 +33 +33 +33 +1E +ENDCHAR +STARTCHAR uni1F49 +ENCODING 8009 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +C0 +C0 +60 +1E +33 +33 +33 +33 +33 +33 +33 +33 +1E +ENDCHAR +STARTCHAR uni1F4A +ENCODING 8010 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +6C +66 +C0 +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1F4B +ENCODING 8011 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +CC +C6 +60 +00 +3E +63 +63 +63 +63 +63 +63 +63 +3E +ENDCHAR +STARTCHAR uni1F4C +ENCODING 8012 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +66 +6C +C0 +3E +63 +63 +63 +63 +63 +63 +63 +63 +3E +ENDCHAR +STARTCHAR uni1F4D +ENCODING 8013 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +CC +C6 +60 +00 +3E +63 +63 +63 +63 +63 +63 +63 +3E +ENDCHAR +STARTCHAR uni1F50 +ENCODING 8016 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +18 +18 +30 +00 +CC +C6 +C6 +C6 +C6 +C6 +CC +78 +ENDCHAR +STARTCHAR uni1F51 +ENCODING 8017 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +30 +30 +18 +00 +CC +C6 +C6 +C6 +C6 +C6 +CC +78 +ENDCHAR +STARTCHAR uni1F52 +ENCODING 8018 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +6C +66 +C0 +00 +CC +C6 +C6 +C6 +C6 +C6 +CC +78 +ENDCHAR +STARTCHAR uni1F53 +ENCODING 8019 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +CC +C6 +60 +00 +CC +C6 +C6 +C6 +C6 +C6 +CC +78 +ENDCHAR +STARTCHAR uni1F54 +ENCODING 8020 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +66 +6C +C0 +00 +CC +C6 +C6 +C6 +C6 +C6 +CC +78 +ENDCHAR +STARTCHAR uni1F55 +ENCODING 8021 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +C6 +CC +60 +00 +CC +C6 +C6 +C6 +C6 +C6 +CC +78 +ENDCHAR +STARTCHAR uni1F56 +ENCODING 8022 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +76 +DC +30 +30 +60 +00 +CC +C6 +C6 +C6 +C6 +CC +78 +ENDCHAR +STARTCHAR uni1F57 +ENCODING 8023 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +76 +DC +60 +60 +30 +00 +CC +C6 +C6 +C6 +C6 +CC +78 +ENDCHAR +STARTCHAR uni1F59 +ENCODING 8025 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +C0 +C0 +60 +00 +C3 +C3 +66 +3C +3C +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni1F5B +ENCODING 8027 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +CC +C6 +60 +00 +C3 +C3 +66 +3C +3C +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni1F5D +ENCODING 8029 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +C6 +CC +60 +00 +C3 +C3 +66 +3C +3C +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni1F5F +ENCODING 8031 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +6D +76 +C0 +33 +33 +33 +1E +1E +0C +0C +0C +0C +0C +ENDCHAR +STARTCHAR uni1F60 +ENCODING 8032 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +0C +0C +18 +00 +66 +C3 +C3 +C3 +DB +DB +DB +66 +ENDCHAR +STARTCHAR uni1F61 +ENCODING 8033 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +30 +30 +18 +00 +66 +C3 +C3 +C3 +DB +DB +DB +66 +ENDCHAR +STARTCHAR uni1F62 +ENCODING 8034 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +36 +33 +60 +00 +66 +C3 +C3 +C3 +DB +DB +DB +66 +ENDCHAR +STARTCHAR uni1F63 +ENCODING 8035 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +66 +63 +30 +00 +66 +C3 +C3 +C3 +DB +DB +DB +66 +ENDCHAR +STARTCHAR uni1F64 +ENCODING 8036 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +33 +36 +60 +00 +66 +C3 +C3 +C3 +DB +DB +DB +66 +ENDCHAR +STARTCHAR uni1F65 +ENCODING 8037 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +63 +66 +30 +00 +66 +C3 +C3 +C3 +DB +DB +DB +66 +ENDCHAR +STARTCHAR uni1F66 +ENCODING 8038 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +3B +6E +18 +18 +30 +00 +66 +C3 +C3 +DB +DB +DB +66 +ENDCHAR +STARTCHAR uni1F67 +ENCODING 8039 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +3B +6E +30 +30 +18 +00 +66 +C3 +C3 +DB +DB +DB +66 +ENDCHAR +STARTCHAR uni1F68 +ENCODING 8040 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +60 +60 +C0 +1C +36 +63 +63 +63 +63 +63 +36 +14 +77 +ENDCHAR +STARTCHAR uni1F69 +ENCODING 8041 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +C0 +C0 +60 +1C +36 +63 +63 +63 +63 +63 +36 +36 +77 +ENDCHAR +STARTCHAR uni1F6A +ENCODING 8042 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +6C +66 +C0 +1C +36 +63 +63 +63 +63 +63 +36 +14 +77 +ENDCHAR +STARTCHAR uni1F6B +ENCODING 8043 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +CC +C6 +60 +1C +36 +63 +63 +63 +63 +63 +36 +14 +77 +ENDCHAR +STARTCHAR uni1F6C +ENCODING 8044 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +66 +6C +C0 +1C +36 +63 +63 +63 +63 +63 +36 +14 +77 +ENDCHAR +STARTCHAR uni1F6D +ENCODING 8045 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +C6 +CC +60 +1C +36 +63 +63 +63 +63 +63 +36 +14 +77 +ENDCHAR +STARTCHAR uni1F6E +ENCODING 8046 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +CD +D6 +60 +1C +36 +63 +63 +63 +63 +63 +36 +14 +77 +ENDCHAR +STARTCHAR uni1F6F +ENCODING 8047 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +6D +76 +C0 +1C +36 +63 +63 +63 +63 +63 +36 +14 +77 +ENDCHAR +STARTCHAR uni1F70 +ENCODING 8048 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +30 +30 +18 +00 +73 +DE +DE +CC +CC +DE +DE +73 +ENDCHAR +STARTCHAR uni1F71 +ENCODING 8049 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +0C +0C +18 +00 +73 +DE +DE +CC +CC +DE +DE +73 +ENDCHAR +STARTCHAR uni1F72 +ENCODING 8050 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +30 +30 +18 +00 +7E +C0 +C0 +7C +C0 +C0 +C0 +7E +ENDCHAR +STARTCHAR uni1F73 +ENCODING 8051 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +18 +18 +30 +00 +7E +C0 +C0 +7C +C0 +C0 +C0 +7E +ENDCHAR +STARTCHAR uni1F74 +ENCODING 8052 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +30 +30 +18 +00 +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +06 +06 +06 +ENDCHAR +STARTCHAR uni1F75 +ENCODING 8053 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +18 +18 +30 +00 +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +06 +06 +06 +ENDCHAR +STARTCHAR uni1F76 +ENCODING 8054 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 12 2 0 +BITMAP +C0 +C0 +60 +00 +E0 +60 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR uni1F77 +ENCODING 8055 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 12 2 0 +BITMAP +60 +60 +C0 +00 +E0 +60 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR uni1F78 +ENCODING 8056 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +30 +30 +18 +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1F79 +ENCODING 8057 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +18 +18 +30 +00 +7C +C6 +C6 +C6 +C6 +C6 +C6 +7C +ENDCHAR +STARTCHAR uni1F7A +ENCODING 8058 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +30 +30 +18 +00 +CC +C6 +C6 +C6 +C6 +C6 +CC +78 +ENDCHAR +STARTCHAR uni1F7B +ENCODING 8059 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +18 +18 +30 +00 +CC +C6 +C6 +C6 +C6 +C6 +CC +78 +ENDCHAR +STARTCHAR uni1F7C +ENCODING 8060 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +30 +30 +18 +00 +66 +C3 +C3 +C3 +DB +DB +DB +66 +ENDCHAR +STARTCHAR uni1F7D +ENCODING 8061 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +0C +0C +18 +00 +66 +C3 +C3 +C3 +DB +DB +DB +66 +ENDCHAR +STARTCHAR uni1F80 +ENCODING 8064 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 15 0 -3 +BITMAP +0C +0C +18 +00 +73 +DE +DE +CC +CC +DE +DE +73 +00 +30 +1C +ENDCHAR +STARTCHAR uni1F81 +ENCODING 8065 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 15 0 -3 +BITMAP +30 +30 +18 +00 +73 +DE +DE +CC +CC +DE +DE +73 +00 +30 +1C +ENDCHAR +STARTCHAR uni1F82 +ENCODING 8066 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 15 0 -3 +BITMAP +36 +33 +60 +00 +73 +DE +DE +CC +CC +DE +DE +73 +00 +30 +1C +ENDCHAR +STARTCHAR uni1F83 +ENCODING 8067 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 15 0 -3 +BITMAP +66 +63 +30 +00 +73 +DE +DE +CC +CC +DE +DE +73 +00 +30 +1C +ENDCHAR +STARTCHAR uni1F84 +ENCODING 8068 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 15 0 -3 +BITMAP +33 +36 +60 +00 +73 +DE +DE +CC +CC +DE +DE +73 +00 +30 +1C +ENDCHAR +STARTCHAR uni1F85 +ENCODING 8069 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 15 0 -3 +BITMAP +63 +66 +30 +00 +73 +DE +DE +CC +CC +DE +DE +73 +00 +30 +1C +ENDCHAR +STARTCHAR uni1F86 +ENCODING 8070 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +3B +6E +18 +18 +30 +00 +73 +DE +DE +CC +DE +DE +73 +00 +30 +1C +ENDCHAR +STARTCHAR uni1F87 +ENCODING 8071 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +3B +6E +18 +18 +0C +00 +73 +DE +DE +CC +DE +DE +73 +00 +30 +1C +ENDCHAR +STARTCHAR uni1F88 +ENCODING 8072 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +60 +60 +C0 +18 +18 +3C +3C +3C +66 +66 +7E +C3 +C3 +00 +30 +1C +ENDCHAR +STARTCHAR uni1F89 +ENCODING 8073 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +C0 +C0 +60 +18 +18 +3C +3C +3C +66 +66 +7E +C3 +C3 +00 +30 +1C +ENDCHAR +STARTCHAR uni1F8A +ENCODING 8074 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +6C +66 +C0 +18 +18 +3C +3C +3C +66 +66 +7E +C3 +C3 +00 +30 +1C +ENDCHAR +STARTCHAR uni1F8B +ENCODING 8075 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +D8 +CC +60 +18 +18 +3C +3C +3C +66 +66 +7E +C3 +C3 +00 +30 +1C +ENDCHAR +STARTCHAR uni1F8C +ENCODING 8076 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +66 +6C +C0 +18 +18 +3C +3C +3C +66 +66 +7E +C3 +C3 +00 +30 +1C +ENDCHAR +STARTCHAR uni1F8D +ENCODING 8077 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +C6 +CC +60 +18 +18 +3C +3C +3C +66 +66 +7E +C3 +C3 +00 +30 +1C +ENDCHAR +STARTCHAR uni1F8E +ENCODING 8078 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +3B +6E +00 +68 +68 +DC +1C +1C +36 +36 +3E +63 +63 +00 +30 +1C +ENDCHAR +STARTCHAR uni1F8F +ENCODING 8079 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +3B +6E +00 +C8 +C8 +7C +1C +1C +36 +36 +3E +63 +63 +00 +30 +1C +ENDCHAR +STARTCHAR uni1F90 +ENCODING 8080 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +18 +18 +30 +00 +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +06 +C6 +76 +ENDCHAR +STARTCHAR uni1F91 +ENCODING 8081 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +30 +30 +18 +00 +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +06 +C6 +76 +ENDCHAR +STARTCHAR uni1F92 +ENCODING 8082 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +6C +66 +C0 +00 +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +06 +C6 +76 +ENDCHAR +STARTCHAR uni1F93 +ENCODING 8083 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +CC +C6 +60 +00 +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +06 +C6 +76 +ENDCHAR +STARTCHAR uni1F94 +ENCODING 8084 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +66 +6C +C0 +00 +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +06 +C6 +76 +ENDCHAR +STARTCHAR uni1F95 +ENCODING 8085 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +C6 +CC +60 +00 +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +06 +C6 +76 +ENDCHAR +STARTCHAR uni1F96 +ENCODING 8086 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 16 1 -3 +BITMAP +76 +DC +30 +30 +60 +00 +FC +C6 +C6 +C6 +C6 +C6 +C6 +06 +C6 +76 +ENDCHAR +STARTCHAR uni1F97 +ENCODING 8087 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 16 1 -3 +BITMAP +76 +DC +30 +30 +18 +00 +FC +C6 +C6 +C6 +C6 +C6 +C6 +06 +C6 +76 +ENDCHAR +STARTCHAR uni1F98 +ENCODING 8088 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +60 +60 +C0 +00 +63 +63 +63 +63 +7F +63 +63 +63 +63 +00 +18 +0E +ENDCHAR +STARTCHAR uni1F99 +ENCODING 8089 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +C0 +C0 +60 +00 +63 +63 +63 +63 +7F +63 +63 +63 +63 +00 +18 +0E +ENDCHAR +STARTCHAR uni1F9A +ENCODING 8090 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +6C +66 +C0 +00 +63 +63 +63 +63 +7F +63 +63 +63 +63 +00 +18 +0E +ENDCHAR +STARTCHAR uni1F9B +ENCODING 8091 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +CC +C6 +60 +00 +63 +63 +63 +63 +7F +63 +63 +63 +63 +00 +18 +0E +ENDCHAR +STARTCHAR uni1F9C +ENCODING 8092 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +66 +6C +C0 +00 +63 +63 +63 +63 +7F +63 +63 +63 +63 +00 +18 +0E +ENDCHAR +STARTCHAR uni1F9D +ENCODING 8093 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +C6 +CC +60 +00 +63 +63 +63 +63 +7F +63 +63 +63 +63 +00 +18 +0E +ENDCHAR +STARTCHAR uni1F9E +ENCODING 8094 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +CD +D6 +60 +00 +63 +63 +63 +63 +7F +63 +63 +63 +63 +00 +18 +0E +ENDCHAR +STARTCHAR uni1F9F +ENCODING 8095 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +6D +76 +C0 +00 +63 +63 +63 +63 +7F +63 +63 +63 +63 +00 +18 +0E +ENDCHAR +STARTCHAR uni1FA0 +ENCODING 8096 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 15 0 -3 +BITMAP +0C +0C +18 +00 +66 +C3 +C3 +C3 +DB +DB +DB +66 +00 +18 +0E +ENDCHAR +STARTCHAR uni1FA1 +ENCODING 8097 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 15 0 -3 +BITMAP +30 +30 +18 +00 +66 +C3 +C3 +C3 +DB +DB +DB +66 +00 +18 +0E +ENDCHAR +STARTCHAR uni1FA2 +ENCODING 8098 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 15 0 -3 +BITMAP +36 +33 +60 +00 +66 +C3 +C3 +C3 +DB +DB +DB +66 +00 +18 +0E +ENDCHAR +STARTCHAR uni1FA3 +ENCODING 8099 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 15 0 -3 +BITMAP +66 +63 +30 +00 +66 +C3 +C3 +C3 +DB +DB +DB +66 +00 +18 +0E +ENDCHAR +STARTCHAR uni1FA4 +ENCODING 8100 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 15 0 -3 +BITMAP +33 +36 +60 +00 +66 +C3 +C3 +C3 +DB +DB +DB +66 +00 +18 +0E +ENDCHAR +STARTCHAR uni1FA5 +ENCODING 8101 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 15 0 -3 +BITMAP +63 +66 +30 +00 +66 +C3 +C3 +C3 +DB +DB +DB +66 +00 +18 +0E +ENDCHAR +STARTCHAR uni1FA6 +ENCODING 8102 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +3B +6E +18 +18 +30 +00 +66 +C3 +C3 +DB +DB +DB +66 +00 +18 +0E +ENDCHAR +STARTCHAR uni1FA7 +ENCODING 8103 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +3B +6E +30 +30 +18 +00 +66 +C3 +C3 +DB +DB +DB +66 +00 +18 +0E +ENDCHAR +STARTCHAR uni1FA8 +ENCODING 8104 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +60 +60 +C0 +1C +36 +63 +63 +63 +63 +63 +36 +14 +77 +00 +18 +0E +ENDCHAR +STARTCHAR uni1FA9 +ENCODING 8105 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +C0 +C0 +60 +1C +36 +63 +63 +63 +63 +63 +36 +36 +77 +00 +18 +0E +ENDCHAR +STARTCHAR uni1FAA +ENCODING 8106 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +6C +66 +C0 +1C +36 +63 +63 +63 +63 +63 +36 +14 +77 +00 +18 +0E +ENDCHAR +STARTCHAR uni1FAB +ENCODING 8107 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +CC +C6 +60 +1C +36 +63 +63 +63 +63 +63 +36 +14 +77 +00 +18 +0E +ENDCHAR +STARTCHAR uni1FAC +ENCODING 8108 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +66 +6C +C0 +1C +36 +63 +63 +63 +63 +63 +36 +14 +77 +00 +18 +0E +ENDCHAR +STARTCHAR uni1FAD +ENCODING 8109 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +C6 +CC +60 +1C +36 +63 +63 +63 +63 +63 +36 +14 +77 +00 +18 +0E +ENDCHAR +STARTCHAR uni1FAE +ENCODING 8110 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +CD +D6 +60 +1C +36 +63 +63 +63 +63 +63 +36 +14 +77 +00 +18 +0E +ENDCHAR +STARTCHAR uni1FAF +ENCODING 8111 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +6D +76 +C0 +1C +36 +63 +63 +63 +63 +63 +36 +14 +77 +00 +18 +0E +ENDCHAR +STARTCHAR uni1FB0 +ENCODING 8112 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +66 +3C +00 +73 +DE +DE +CC +CC +DE +DE +73 +ENDCHAR +STARTCHAR uni1FB1 +ENCODING 8113 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +7E +00 +00 +73 +DE +DE +CC +CC +DE +DE +73 +ENDCHAR +STARTCHAR uni1FB2 +ENCODING 8114 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 15 0 -3 +BITMAP +30 +30 +18 +00 +73 +DE +DE +CC +CC +DE +DE +73 +00 +30 +1C +ENDCHAR +STARTCHAR uni1FB3 +ENCODING 8115 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +73 +DE +DE +CC +CC +DE +DE +73 +00 +30 +1C +ENDCHAR +STARTCHAR uni1FB4 +ENCODING 8116 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 15 0 -3 +BITMAP +0C +0C +18 +00 +73 +DE +DE +CC +CC +DE +DE +73 +00 +30 +1C +ENDCHAR +STARTCHAR uni1FB6 +ENCODING 8118 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +3B +6E +00 +73 +DE +DE +CC +CC +DE +DE +73 +ENDCHAR +STARTCHAR uni1FB7 +ENCODING 8119 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +3B +6E +00 +73 +DE +DE +CC +CC +DE +DE +73 +00 +18 +0E +ENDCHAR +STARTCHAR uni1FB8 +ENCODING 8120 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +66 +3C +00 +18 +18 +3C +3C +3C +66 +66 +7E +C3 +C3 +ENDCHAR +STARTCHAR uni1FB9 +ENCODING 8121 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +7E +00 +18 +18 +3C +3C +3C +66 +66 +7E +C3 +C3 +C3 +ENDCHAR +STARTCHAR uni1FBA +ENCODING 8122 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +C0 +C0 +60 +18 +18 +3C +3C +3C +66 +66 +7E +C3 +C3 +ENDCHAR +STARTCHAR uni1FBB +ENCODING 8123 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +60 +60 +C0 +18 +18 +3C +3C +3C +66 +66 +7E +C3 +C3 +ENDCHAR +STARTCHAR uni1FBC +ENCODING 8124 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +18 +18 +3C +3C +3C +66 +66 +7E +C3 +C3 +C3 +00 +18 +0E +ENDCHAR +STARTCHAR uni1FBD +ENCODING 8125 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 3 3 9 +BITMAP +60 +60 +C0 +ENDCHAR +STARTCHAR uni1FBE +ENCODING 8126 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 2 3 -3 +BITMAP +C0 +70 +ENDCHAR +STARTCHAR uni1FBF +ENCODING 8127 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 3 3 9 +BITMAP +60 +60 +C0 +ENDCHAR +STARTCHAR uni1FC0 +ENCODING 8128 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 2 1 10 +BITMAP +76 +DC +ENDCHAR +STARTCHAR uni1FC1 +ENCODING 8129 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 4 1 9 +BITMAP +76 +DC +00 +6C +ENDCHAR +STARTCHAR uni1FC2 +ENCODING 8130 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +30 +30 +18 +00 +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +06 +C6 +76 +ENDCHAR +STARTCHAR uni1FC3 +ENCODING 8131 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +06 +C6 +76 +ENDCHAR +STARTCHAR uni1FC4 +ENCODING 8132 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +18 +18 +30 +00 +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +06 +C6 +76 +ENDCHAR +STARTCHAR uni1FC6 +ENCODING 8134 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +76 +DC +00 +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +06 +06 +06 +ENDCHAR +STARTCHAR uni1FC7 +ENCODING 8135 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +76 +DC +00 +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +06 +C6 +76 +ENDCHAR +STARTCHAR uni1FC8 +ENCODING 8136 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +C0 +60 +00 +7F +60 +60 +60 +7E +60 +60 +60 +60 +7F +ENDCHAR +STARTCHAR uni1FC9 +ENCODING 8137 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +60 +C0 +00 +7F +60 +60 +60 +7E +60 +60 +60 +60 +7F +ENDCHAR +STARTCHAR uni1FCA +ENCODING 8138 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +C0 +60 +00 +63 +63 +63 +63 +7F +63 +63 +63 +63 +63 +ENDCHAR +STARTCHAR uni1FCB +ENCODING 8139 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +60 +C0 +00 +63 +63 +63 +63 +7F +63 +63 +63 +63 +63 +ENDCHAR +STARTCHAR uni1FCC +ENCODING 8140 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +C6 +C6 +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +C6 +00 +30 +1C +ENDCHAR +STARTCHAR uni1FCD +ENCODING 8141 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 3 1 9 +BITMAP +6C +66 +C0 +ENDCHAR +STARTCHAR uni1FCE +ENCODING 8142 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 3 1 9 +BITMAP +66 +6C +C0 +ENDCHAR +STARTCHAR uni1FCF +ENCODING 8143 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 1 8 +BITMAP +76 +DC +30 +30 +60 +ENDCHAR +STARTCHAR uni1FD0 +ENCODING 8144 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +D8 +70 +00 +70 +30 +30 +30 +30 +30 +30 +1C +ENDCHAR +STARTCHAR uni1FD1 +ENCODING 8145 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 10 2 0 +BITMAP +F8 +00 +E0 +60 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR uni1FD2 +ENCODING 8146 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +60 +30 +00 +CC +00 +70 +30 +30 +30 +30 +30 +30 +1C +ENDCHAR +STARTCHAR uni1FD3 +ENCODING 8147 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +18 +30 +00 +CC +00 +70 +30 +30 +30 +30 +30 +30 +1C +ENDCHAR +STARTCHAR uni1FD6 +ENCODING 8150 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +76 +DC +00 +70 +30 +30 +30 +30 +30 +30 +1C +ENDCHAR +STARTCHAR uni1FD7 +ENCODING 8151 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +76 +DC +00 +CC +00 +70 +30 +30 +30 +30 +30 +30 +1C +ENDCHAR +STARTCHAR uni1FD8 +ENCODING 8152 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +CC +78 +00 +FC +30 +30 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni1FD9 +ENCODING 8153 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +FC +00 +FC +30 +30 +30 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni1FDA +ENCODING 8154 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +60 +30 +00 +FC +30 +30 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni1FDB +ENCODING 8155 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +18 +30 +00 +FC +30 +30 +30 +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni1FDD +ENCODING 8157 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 3 1 9 +BITMAP +CC +C6 +60 +ENDCHAR +STARTCHAR uni1FDE +ENCODING 8158 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 3 1 9 +BITMAP +C6 +CC +60 +ENDCHAR +STARTCHAR uni1FDF +ENCODING 8159 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 1 8 +BITMAP +76 +DC +30 +30 +18 +ENDCHAR +STARTCHAR uni1FE0 +ENCODING 8160 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +6C +38 +00 +CC +C6 +C6 +C6 +C6 +C6 +CC +78 +ENDCHAR +STARTCHAR uni1FE1 +ENCODING 8161 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7C +00 +00 +CC +C6 +C6 +C6 +C6 +C6 +CC +78 +ENDCHAR +STARTCHAR uni1FE2 +ENCODING 8162 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +60 +30 +00 +CC +00 +CC +C6 +C6 +C6 +C6 +C6 +CC +78 +ENDCHAR +STARTCHAR uni1FE3 +ENCODING 8163 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +18 +30 +00 +CC +00 +CC +C6 +C6 +C6 +C6 +C6 +CC +78 +ENDCHAR +STARTCHAR uni1FE4 +ENCODING 8164 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +18 +18 +30 +00 +38 +6C +C6 +C6 +C6 +C6 +EC +D8 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni1FE5 +ENCODING 8165 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +60 +60 +30 +00 +38 +6C +C6 +C6 +C6 +C6 +EC +D8 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni1FE6 +ENCODING 8166 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +76 +DC +00 +CC +C6 +C6 +C6 +C6 +C6 +CC +78 +ENDCHAR +STARTCHAR uni1FE7 +ENCODING 8167 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +76 +DC +00 +6C +00 +CC +C6 +C6 +C6 +C6 +C6 +CC +78 +ENDCHAR +STARTCHAR uni1FE8 +ENCODING 8168 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +66 +3C +C3 +C3 +66 +66 +3C +3C +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni1FE9 +ENCODING 8169 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +7E +00 +C3 +C3 +66 +66 +3C +3C +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni1FEA +ENCODING 8170 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +C0 +60 +00 +C3 +C3 +66 +66 +3C +3C +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni1FEB +ENCODING 8171 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +60 +C0 +00 +C3 +C3 +66 +66 +3C +3C +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni1FEC +ENCODING 8172 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +C0 +DE +7B +1B +1B +1B +1B +1E +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni1FED +ENCODING 8173 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 4 1 9 +BITMAP +60 +30 +00 +CC +ENDCHAR +STARTCHAR uni1FEE +ENCODING 8174 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 4 1 9 +BITMAP +18 +30 +00 +CC +ENDCHAR +STARTCHAR uni1FEF +ENCODING 8175 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 2 3 10 +BITMAP +C0 +60 +ENDCHAR +STARTCHAR uni1FF2 +ENCODING 8178 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +30 +18 +00 +66 +C3 +C3 +C3 +DB +DB +DB +66 +00 +18 +0E +ENDCHAR +STARTCHAR uni1FF3 +ENCODING 8179 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +66 +C3 +C3 +C3 +DB +DB +DB +66 +00 +18 +0E +ENDCHAR +STARTCHAR uni1FF4 +ENCODING 8180 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +0C +18 +00 +66 +C3 +C3 +C3 +DB +DB +DB +66 +00 +18 +0E +ENDCHAR +STARTCHAR uni1FF6 +ENCODING 8182 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +76 +DC +00 +66 +C3 +C3 +C3 +DB +DB +DB +66 +ENDCHAR +STARTCHAR uni1FF7 +ENCODING 8183 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +76 +DC +00 +66 +C3 +C3 +C3 +DB +DB +DB +66 +00 +18 +0E +ENDCHAR +STARTCHAR uni1FF8 +ENCODING 8184 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +C0 +60 +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uni1FF9 +ENCODING 8185 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +60 +C0 +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uni1FFA +ENCODING 8186 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +C0 +60 +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +24 +E7 +ENDCHAR +STARTCHAR uni1FFB +ENCODING 8187 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +60 +C0 +00 +3C +66 +C3 +C3 +C3 +C3 +C3 +66 +24 +E7 +ENDCHAR +STARTCHAR uni1FFC +ENCODING 8188 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +3C +66 +C3 +C3 +C3 +C3 +C3 +C3 +66 +24 +E7 +00 +18 +0E +ENDCHAR +STARTCHAR uni1FFD +ENCODING 8189 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 3 2 9 +BITMAP +60 +60 +C0 +ENDCHAR +STARTCHAR uni1FFE +ENCODING 8190 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 3 3 9 +BITMAP +C0 +C0 +60 +ENDCHAR +STARTCHAR uni2000 +ENCODING 8192 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 8 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2001 +ENCODING 8193 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 8 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2002 +ENCODING 8194 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 8 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2003 +ENCODING 8195 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 8 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2004 +ENCODING 8196 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 8 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2005 +ENCODING 8197 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 8 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2006 +ENCODING 8198 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 8 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2007 +ENCODING 8199 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 8 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2008 +ENCODING 8200 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 8 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2009 +ENCODING 8201 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 8 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni200A +ENCODING 8202 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 8 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2010 +ENCODING 8208 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 1 2 5 +BITMAP +F0 +ENDCHAR +STARTCHAR uni2011 +ENCODING 8209 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 1 2 5 +BITMAP +F0 +ENDCHAR +STARTCHAR figuredash +ENCODING 8210 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 1 1 5 +BITMAP +F8 +ENDCHAR +STARTCHAR endash +ENCODING 8211 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 1 1 5 +BITMAP +F8 +ENDCHAR +STARTCHAR emdash +ENCODING 8212 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 1 0 5 +BITMAP +FE +ENDCHAR +STARTCHAR afii00208 +ENCODING 8213 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 1 0 5 +BITMAP +FE +ENDCHAR +STARTCHAR uni2016 +ENCODING 8214 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 14 2 -3 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR underscoredbl +ENCODING 8215 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 3 0 -3 +BITMAP +FF +00 +FF +ENDCHAR +STARTCHAR quoteleft +ENCODING 8216 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 4 3 9 +BITMAP +40 +80 +C0 +C0 +ENDCHAR +STARTCHAR quoteright +ENCODING 8217 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 4 3 9 +BITMAP +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR quotesinglbase +ENCODING 8218 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 4 3 -2 +BITMAP +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR quotereversed +ENCODING 8219 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 4 3 9 +BITMAP +C0 +C0 +80 +40 +ENDCHAR +STARTCHAR quotedblleft +ENCODING 8220 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 4 2 9 +BITMAP +48 +90 +D8 +D8 +ENDCHAR +STARTCHAR quotedblright +ENCODING 8221 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 4 1 9 +BITMAP +D8 +D8 +48 +90 +ENDCHAR +STARTCHAR quotedblbase +ENCODING 8222 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 4 1 -2 +BITMAP +D8 +D8 +48 +90 +ENDCHAR +STARTCHAR uni201F +ENCODING 8223 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 4 2 9 +BITMAP +D8 +D8 +90 +48 +ENDCHAR +STARTCHAR dagger +ENCODING 8224 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +18 +18 +18 +FF +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR daggerdbl +ENCODING 8225 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +18 +18 +18 +FF +18 +18 +18 +18 +18 +18 +FF +18 +18 +18 +ENDCHAR +STARTCHAR bullet +ENCODING 8226 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 4 2 3 +BITMAP +60 +F0 +F0 +60 +ENDCHAR +STARTCHAR uni2023 +ENCODING 8227 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 5 1 3 +BITMAP +C0 +F0 +FC +F0 +C0 +ENDCHAR +STARTCHAR onedotenleader +ENCODING 8228 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 2 3 0 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR twodotenleader +ENCODING 8229 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 2 2 0 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR ellipsis +ENCODING 8230 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 2 0 0 +BITMAP +DB +DB +ENDCHAR +STARTCHAR uni2027 +ENCODING 8231 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 2 3 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR perthousand +ENCODING 8240 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +60 +B1 +B3 +66 +0C +18 +30 +60 +D6 +AB +2B +16 +ENDCHAR +STARTCHAR uni2031 +ENCODING 8241 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +61 +B3 +B6 +6C +18 +30 +60 +C0 +56 +AB +AB +56 +ENDCHAR +STARTCHAR minute +ENCODING 8242 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 3 3 9 +BITMAP +C0 +C0 +C0 +ENDCHAR +STARTCHAR second +ENCODING 8243 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 3 1 8 +BITMAP +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni2034 +ENCODING 8244 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 3 0 8 +BITMAP +DB +DB +DB +ENDCHAR +STARTCHAR uni2035 +ENCODING 8245 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 3 3 9 +BITMAP +C0 +C0 +60 +ENDCHAR +STARTCHAR uni2036 +ENCODING 8246 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 3 1 9 +BITMAP +CC +CC +66 +ENDCHAR +STARTCHAR uni2037 +ENCODING 8247 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 3 0 9 +BITMAP +DB00 +DB00 +6D80 +ENDCHAR +STARTCHAR uni2038 +ENCODING 8248 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 3 2 -3 +BITMAP +20 +70 +D8 +ENDCHAR +STARTCHAR guilsinglleft +ENCODING 8249 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 5 2 1 +BITMAP +30 +60 +C0 +60 +30 +ENDCHAR +STARTCHAR guilsinglright +ENCODING 8250 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 5 2 1 +BITMAP +C0 +60 +30 +60 +C0 +ENDCHAR +STARTCHAR uni203B +ENCODING 8251 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 7 0 2 +BITMAP +DB +66 +3C +DB +3C +66 +DB +ENDCHAR +STARTCHAR exclamdbl +ENCODING 8252 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 2 0 +BITMAP +D8 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +00 +D8 +D8 +ENDCHAR +STARTCHAR uni203D +ENCODING 8253 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7C +FE +36 +36 +3C +38 +30 +30 +00 +30 +30 +ENDCHAR +STARTCHAR uni203E +ENCODING 8254 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 1 0 12 +BITMAP +FF +ENDCHAR +STARTCHAR uni203F +ENCODING 8255 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 2 0 -3 +BITMAP +C3 +7E +ENDCHAR +STARTCHAR uni2040 +ENCODING 8256 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 2 0 9 +BITMAP +7E +C3 +ENDCHAR +STARTCHAR uni2043 +ENCODING 8259 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 3 2 4 +BITMAP +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni2047 +ENCODING 8263 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +7E +DB +1B +1B +36 +36 +6C +6C +00 +6C +6C +ENDCHAR +STARTCHAR uni2048 +ENCODING 8264 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +73 +DB +1B +1B +33 +33 +63 +63 +00 +63 +63 +ENDCHAR +STARTCHAR uni2049 +ENCODING 8265 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +CE +DB +C3 +C3 +C6 +C6 +CC +CC +00 +CC +CC +ENDCHAR +STARTCHAR uni204A +ENCODING 8266 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni204B +ENCODING 8267 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +FE +DF +DF +DF +DF +DF +DE +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni204C +ENCODING 8268 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 0 2 +BITMAP +7E +FA +FA +FA +7E +ENDCHAR +STARTCHAR uni204D +ENCODING 8269 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 0 2 +BITMAP +FC +BE +BE +BE +FC +ENDCHAR +STARTCHAR uni204E +ENCODING 8270 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 5 1 -3 +BITMAP +30 +B4 +78 +B4 +30 +ENDCHAR +STARTCHAR uni204F +ENCODING 8271 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 9 3 -2 +BITMAP +C0 +C0 +00 +00 +00 +C0 +C0 +80 +40 +ENDCHAR +STARTCHAR uni2050 +ENCODING 8272 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2051 +ENCODING 8273 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -3 +BITMAP +30 +B4 +78 +B4 +30 +00 +00 +00 +30 +B4 +78 +B4 +30 +ENDCHAR +STARTCHAR uni2052 +ENCODING 8274 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2053 +ENCODING 8275 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2054 +ENCODING 8276 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2055 +ENCODING 8277 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 1 1 +BITMAP +10 +54 +38 +FE +38 +54 +10 +ENDCHAR +STARTCHAR uni205F +ENCODING 8287 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2060 +ENCODING 8288 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2061 +ENCODING 8289 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2062 +ENCODING 8290 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2063 +ENCODING 8291 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2064 +ENCODING 8292 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2065 +ENCODING 8293 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2066 +ENCODING 8294 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2067 +ENCODING 8295 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2068 +ENCODING 8296 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2069 +ENCODING 8297 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni206A +ENCODING 8298 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni206B +ENCODING 8299 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni206C +ENCODING 8300 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni206D +ENCODING 8301 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni206E +ENCODING 8302 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni206F +ENCODING 8303 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2070 +ENCODING 8304 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 6 2 6 +BITMAP +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni2071 +ENCODING 8305 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 7 2 6 +BITMAP +60 +00 +E0 +60 +60 +60 +F0 +ENDCHAR +STARTCHAR uni2072 +ENCODING 8306 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2073 +ENCODING 8307 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2074 +ENCODING 8308 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 6 2 6 +BITMAP +30 +70 +B0 +B0 +F8 +30 +ENDCHAR +STARTCHAR uni2075 +ENCODING 8309 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 6 2 6 +BITMAP +F8 +C0 +F0 +18 +18 +F0 +ENDCHAR +STARTCHAR uni2076 +ENCODING 8310 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 6 2 6 +BITMAP +70 +C0 +F0 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni2077 +ENCODING 8311 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 6 2 6 +BITMAP +F8 +18 +30 +30 +60 +60 +ENDCHAR +STARTCHAR uni2078 +ENCODING 8312 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 6 2 6 +BITMAP +70 +D8 +70 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni2079 +ENCODING 8313 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 6 2 6 +BITMAP +70 +D8 +D8 +78 +18 +70 +ENDCHAR +STARTCHAR uni207A +ENCODING 8314 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 3 2 8 +BITMAP +60 +F0 +60 +ENDCHAR +STARTCHAR uni207B +ENCODING 8315 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 1 2 9 +BITMAP +F0 +ENDCHAR +STARTCHAR uni207C +ENCODING 8316 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 3 2 8 +BITMAP +F0 +00 +F0 +ENDCHAR +STARTCHAR uni207D +ENCODING 8317 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 6 3 6 +BITMAP +60 +C0 +C0 +C0 +C0 +60 +ENDCHAR +STARTCHAR uni207E +ENCODING 8318 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 6 2 6 +BITMAP +C0 +60 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR uni207F +ENCODING 8319 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 5 2 6 +BITMAP +F0 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni2080 +ENCODING 8320 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 6 2 -3 +BITMAP +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni2081 +ENCODING 8321 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 6 2 -3 +BITMAP +30 +70 +F0 +30 +30 +30 +ENDCHAR +STARTCHAR uni2082 +ENCODING 8322 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 6 2 -3 +BITMAP +F0 +18 +18 +30 +60 +F8 +ENDCHAR +STARTCHAR uni2083 +ENCODING 8323 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 6 2 -3 +BITMAP +F0 +18 +70 +18 +18 +F0 +ENDCHAR +STARTCHAR uni2084 +ENCODING 8324 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 6 2 -3 +BITMAP +30 +70 +B0 +B0 +F8 +30 +ENDCHAR +STARTCHAR uni2085 +ENCODING 8325 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 6 2 -3 +BITMAP +F8 +C0 +F0 +18 +18 +F0 +ENDCHAR +STARTCHAR uni2086 +ENCODING 8326 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 6 2 -3 +BITMAP +70 +C0 +F0 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni2087 +ENCODING 8327 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 6 2 -3 +BITMAP +F8 +18 +30 +30 +60 +60 +ENDCHAR +STARTCHAR uni2088 +ENCODING 8328 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 6 2 -3 +BITMAP +70 +D8 +70 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni2089 +ENCODING 8329 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 6 2 -3 +BITMAP +70 +D8 +D8 +78 +18 +70 +ENDCHAR +STARTCHAR uni208A +ENCODING 8330 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 3 2 -2 +BITMAP +60 +F0 +60 +ENDCHAR +STARTCHAR uni208B +ENCODING 8331 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 1 2 -2 +BITMAP +F0 +ENDCHAR +STARTCHAR uni208C +ENCODING 8332 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 3 2 -2 +BITMAP +F0 +00 +F0 +ENDCHAR +STARTCHAR uni208D +ENCODING 8333 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 6 3 -3 +BITMAP +60 +C0 +C0 +C0 +C0 +60 +ENDCHAR +STARTCHAR uni208E +ENCODING 8334 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 6 2 -3 +BITMAP +C0 +60 +60 +60 +60 +C0 +ENDCHAR +STARTCHAR uni2090 +ENCODING 8336 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 6 2 -3 +BITMAP +70 +18 +78 +D8 +D8 +78 +ENDCHAR +STARTCHAR uni2091 +ENCODING 8337 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 6 2 -3 +BITMAP +70 +D8 +D8 +F8 +C0 +78 +ENDCHAR +STARTCHAR uni2092 +ENCODING 8338 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 6 2 -3 +BITMAP +70 +D8 +D8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni2093 +ENCODING 8339 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 6 2 -3 +BITMAP +D8 +D8 +70 +70 +D8 +D8 +ENDCHAR +STARTCHAR uni2094 +ENCODING 8340 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 6 2 -3 +BITMAP +F0 +18 +F8 +D8 +D8 +70 +ENDCHAR +STARTCHAR uni2095 +ENCODING 8341 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 8 2 -3 +BITMAP +C0 +C0 +C0 +F0 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni2096 +ENCODING 8342 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 8 2 -3 +BITMAP +C0 +C0 +D8 +F0 +E0 +E0 +F0 +D8 +ENDCHAR +STARTCHAR uni2097 +ENCODING 8343 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 8 2 -3 +BITMAP +E0 +60 +60 +60 +60 +60 +60 +F0 +ENDCHAR +STARTCHAR uni2098 +ENCODING 8344 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 6 0 -3 +BITMAP +FE +DB +DB +DB +DB +DB +ENDCHAR +STARTCHAR uni2099 +ENCODING 8345 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 6 2 -3 +BITMAP +F0 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni209A +ENCODING 8346 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 6 2 -3 +BITMAP +F0 +D8 +D8 +D8 +F0 +C0 +ENDCHAR +STARTCHAR uni209B +ENCODING 8347 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 6 2 -3 +BITMAP +78 +C0 +70 +18 +18 +F0 +ENDCHAR +STARTCHAR uni209C +ENCODING 8348 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 8 2 -3 +BITMAP +60 +60 +F8 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR uni20A0 +ENCODING 8352 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +7C +C0 +C0 +CF +CC +CC +CF +7C +0C +0C +0F +ENDCHAR +STARTCHAR colonmonetary +ENCODING 8353 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 -1 +BITMAP +28 +7E +E8 +E8 +E8 +E8 +E8 +E8 +E8 +E8 +7E +28 +ENDCHAR +STARTCHAR uni20A2 +ENCODING 8354 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7E +C0 +C0 +C0 +DA +DC +D8 +D8 +D8 +D8 +7E +ENDCHAR +STARTCHAR franc +ENCODING 8355 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +7F +60 +60 +60 +60 +7E +60 +60 +F8 +60 +60 +ENDCHAR +STARTCHAR lira +ENCODING 8356 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +1E +30 +60 +60 +F8 +60 +F8 +60 +60 +60 +FE +ENDCHAR +STARTCHAR uni20A5 +ENCODING 8357 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +6C +56 +57 +5E +76 +D6 +56 +56 +ENDCHAR +STARTCHAR uni20A6 +ENCODING 8358 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +66 +66 +76 +76 +FF +7E +FF +6E +6E +66 +66 +ENDCHAR +STARTCHAR peseta +ENCODING 8359 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +E6 +D6 +D6 +DF +D6 +D6 +E6 +C6 +C6 +C6 +C3 +ENDCHAR +STARTCHAR uni20A8 +ENCODING 8360 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +F0 +D8 +D8 +DF +DC +FC +F6 +F3 +DB +DB +CE +ENDCHAR +STARTCHAR uni20A9 +ENCODING 8361 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +66 +66 +FF +66 +FF +66 +7E +7E +7E +66 +42 +ENDCHAR +STARTCHAR afii57636 +ENCODING 8362 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +F9 +CD +C5 +D5 +D5 +D1 +D9 +CF +ENDCHAR +STARTCHAR dong +ENCODING 8363 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 -2 +BITMAP +06 +1F +06 +7E +C6 +C6 +C6 +C6 +C6 +C6 +7E +00 +7E +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 9 1 1 +BITMAP +3E +60 +60 +FC +60 +FC +60 +60 +3E +ENDCHAR +STARTCHAR uni20AD +ENCODING 8365 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +63 +66 +6C +78 +70 +FF +70 +78 +6C +66 +63 +ENDCHAR +STARTCHAR uni20AE +ENCODING 8366 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +FF +18 +18 +18 +1E +78 +1E +78 +18 +18 +18 +ENDCHAR +STARTCHAR uni20AF +ENCODING 8367 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +F8 +6C +6C +6C +6C +6C +6E +6D +6D +6D +BE +0C +0C +0C +ENDCHAR +STARTCHAR uni20BD +ENCODING 8381 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +7E +63 +63 +63 +63 +63 +FE +60 +F8 +60 +60 +ENDCHAR +STARTCHAR uni20D0 +ENCODING 8400 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni20D9 +ENCODING 8409 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 1 1 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2102 +ENCODING 8450 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +7F +D0 +D0 +D0 +D0 +D0 +D0 +D0 +D0 +D0 +7F +ENDCHAR +STARTCHAR uni2103 +ENCODING 8451 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +40 +A0 +BF +70 +30 +30 +30 +30 +30 +30 +30 +1F +ENDCHAR +STARTCHAR afii61248 +ENCODING 8453 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +70 +C0 +C1 +C2 +74 +08 +10 +2E +5B +9B +1B +0E +ENDCHAR +STARTCHAR uni2106 +ENCODING 8454 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +70 +C0 +C1 +C2 +74 +08 +10 +3B +5B +9B +1B +0E +ENDCHAR +STARTCHAR uni2107 +ENCODING 8455 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +3E +60 +C0 +C0 +60 +3C +60 +C0 +C0 +60 +3E +ENDCHAR +STARTCHAR uni2109 +ENCODING 8457 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +40 +AF +AC +4C +0C +0C +0F +0C +0C +0C +0C +0C +ENDCHAR +STARTCHAR uni210D +ENCODING 8461 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +F3 +D3 +D3 +D3 +D3 +DF +D3 +D3 +D3 +D3 +F3 +ENDCHAR +STARTCHAR uni210E +ENCODING 8462 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +C0 +C0 +C0 +FC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR uni210F +ENCODING 8463 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +60 +F8 +60 +60 +7E +63 +63 +63 +63 +63 +63 +ENDCHAR +STARTCHAR uni2115 +ENCODING 8469 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +E3 +D3 +D3 +EB +EB +D7 +D7 +CB +CB +C7 +C7 +ENDCHAR +STARTCHAR afii61352 +ENCODING 8470 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +9B +9B +D8 +DB +F8 +F8 +F8 +D8 +D8 +C8 +C8 +ENDCHAR +STARTCHAR uni2117 +ENCODING 8471 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 10 0 1 +BITMAP +7E +C3 +B9 +B5 +B5 +B9 +B1 +B1 +C3 +7E +ENDCHAR +STARTCHAR uni2119 +ENCODING 8473 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +FE +D3 +D3 +D3 +D3 +D3 +DE +D0 +D0 +D0 +F0 +ENDCHAR +STARTCHAR uni211A +ENCODING 8474 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +3C +76 +D3 +D3 +D3 +D3 +D3 +D3 +DD +76 +3B +ENDCHAR +STARTCHAR uni211D +ENCODING 8477 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +FE +D3 +D3 +D3 +D3 +DE +DC +D6 +D6 +D3 +F3 +ENDCHAR +STARTCHAR uni2120 +ENCODING 8480 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 6 +BITMAP +79 +CF +6F +39 +E9 +ENDCHAR +STARTCHAR trademark +ENCODING 8482 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 6 +BITMAP +F9 +6F +6F +69 +69 +ENDCHAR +STARTCHAR uni2124 +ENCODING 8484 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +FF +0D +0D +1A +1A +34 +34 +68 +68 +D0 +FF +ENDCHAR +STARTCHAR uni2126 +ENCODING 8486 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +3C +66 +C3 +C3 +C3 +C3 +C3 +C3 +66 +24 +E7 +ENDCHAR +STARTCHAR uni2127 +ENCODING 8487 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +E7 +24 +66 +C3 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR uni212A +ENCODING 8490 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +C6 +CC +D8 +F0 +E0 +C0 +E0 +F0 +D8 +CC +C6 +ENDCHAR +STARTCHAR uni212B +ENCODING 8491 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +38 +6C +38 +00 +7C +C6 +C6 +C6 +FE +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR uni213E +ENCODING 8510 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +FF +D0 +D0 +D0 +D0 +D0 +D0 +D0 +D0 +D0 +F0 +ENDCHAR +STARTCHAR uni213F +ENCODING 8511 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +FF +D3 +D3 +D3 +D3 +D3 +D3 +D3 +D3 +D3 +F3 +ENDCHAR +STARTCHAR uni2140 +ENCODING 8512 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +FF +D0 +68 +34 +34 +1A +34 +34 +68 +D0 +FF +ENDCHAR +STARTCHAR uni2145 +ENCODING 8517 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +FC +D6 +D3 +D3 +D3 +D3 +D3 +D3 +D3 +D6 +FC +ENDCHAR +STARTCHAR uni2146 +ENCODING 8518 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +0F +0D +0D +3D +6D +CD +CD +CD +CD +6D +3F +ENDCHAR +STARTCHAR uni2147 +ENCODING 8519 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +7E +D3 +D3 +DF +D0 +D0 +D0 +7F +ENDCHAR +STARTCHAR uni2148 +ENCODING 8520 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 11 2 0 +BITMAP +60 +00 +00 +F0 +D0 +D0 +D0 +D0 +D0 +D0 +F0 +ENDCHAR +STARTCHAR uni2149 +ENCODING 8521 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +0C +00 +00 +3E +1A +1A +1A +1A +1A +1A +1A +1A +1A +FC +ENDCHAR +STARTCHAR uni2150 +ENCODING 8528 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +30 +70 +30 +30 +31 +32 +04 +08 +10 +20 +5F +83 +06 +06 +0C +0C +ENDCHAR +STARTCHAR uni2151 +ENCODING 8529 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +30 +70 +30 +30 +31 +32 +04 +08 +10 +20 +4E +9B +1B +0F +03 +0E +ENDCHAR +STARTCHAR uni2152 +ENCODING 8530 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +30 +70 +30 +30 +31 +32 +04 +08 +10 +20 +52 +B7 +15 +15 +17 +12 +ENDCHAR +STARTCHAR onethird +ENCODING 8531 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +30 +70 +30 +30 +31 +32 +04 +08 +10 +20 +5E +83 +0E +03 +03 +1E +ENDCHAR +STARTCHAR twothirds +ENCODING 8532 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +F0 +18 +18 +30 +61 +FA +04 +08 +10 +20 +5E +83 +0E +03 +03 +1E +ENDCHAR +STARTCHAR uni2155 +ENCODING 8533 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +30 +70 +30 +30 +31 +32 +04 +08 +10 +20 +5F +98 +1E +03 +03 +1E +ENDCHAR +STARTCHAR uni2156 +ENCODING 8534 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +F0 +18 +18 +30 +61 +FA +04 +08 +10 +20 +5F +98 +1E +03 +03 +1E +ENDCHAR +STARTCHAR uni2157 +ENCODING 8535 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +F0 +18 +70 +18 +19 +F2 +04 +08 +10 +20 +5F +98 +1E +03 +03 +1E +ENDCHAR +STARTCHAR uni2158 +ENCODING 8536 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +70 +70 +B0 +B0 +F9 +32 +04 +08 +10 +20 +5F +98 +1E +03 +03 +1E +ENDCHAR +STARTCHAR uni2159 +ENCODING 8537 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +30 +70 +30 +30 +31 +32 +04 +08 +10 +20 +4E +98 +1E +1B +1B +0E +ENDCHAR +STARTCHAR uni215A +ENCODING 8538 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +F8 +C0 +F0 +18 +D9 +72 +04 +08 +10 +20 +4E +98 +1E +1B +1B +0E +ENDCHAR +STARTCHAR oneeighth +ENCODING 8539 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +30 +70 +30 +30 +31 +32 +04 +08 +10 +20 +4E +9B +0E +1B +1B +0E +ENDCHAR +STARTCHAR threeeighths +ENCODING 8540 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +F0 +18 +70 +18 +19 +F2 +04 +08 +10 +20 +4E +9B +0E +1B +1B +0E +ENDCHAR +STARTCHAR fiveeighths +ENCODING 8541 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +F8 +C0 +F0 +18 +D9 +72 +04 +08 +10 +20 +4E +9B +0E +1B +1B +0E +ENDCHAR +STARTCHAR seveneighths +ENCODING 8542 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +F8 +18 +30 +30 +61 +62 +04 +08 +10 +20 +4E +9B +0E +1B +1B +0E +ENDCHAR +STARTCHAR uni215F +ENCODING 8543 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 1 +BITMAP +30 +70 +30 +30 +31 +32 +04 +08 +10 +20 +40 +80 +ENDCHAR +STARTCHAR uni2160 +ENCODING 8544 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 11 3 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2161 +ENCODING 8545 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 2 0 +BITMAP +D8 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni2162 +ENCODING 8546 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +DB +DB +DB +DB +DB +DB +DB +DB +DB +DB +DB +ENDCHAR +STARTCHAR uni2163 +ENCODING 8547 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +DB +DB +DB +DB +CE +CE +CE +CE +C4 +C4 +C4 +ENDCHAR +STARTCHAR uni2164 +ENCODING 8548 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +C3 +C3 +C3 +66 +66 +66 +3C +3C +3C +18 +18 +ENDCHAR +STARTCHAR uni2165 +ENCODING 8549 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +DB +DB +DB +DB +73 +73 +73 +73 +23 +23 +23 +ENDCHAR +STARTCHAR uni2166 +ENCODING 8550 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +D5 +D5 +D5 +D5 +D5 +D5 +D5 +E5 +65 +65 +65 +ENDCHAR +STARTCHAR uni2167 +ENCODING 8551 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 11 0 0 +BITMAP +AA80 +AA80 +AA80 +AA80 +AA80 +AA80 +AA80 +AA80 +4A80 +4A80 +4A80 +ENDCHAR +STARTCHAR uni2168 +ENCODING 8552 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +DB +DB +DB +CE +CE +C4 +CE +CE +DB +DB +DB +ENDCHAR +STARTCHAR uni2169 +ENCODING 8553 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +C3 +66 +66 +3C +3C +18 +3C +3C +66 +66 +C3 +ENDCHAR +STARTCHAR uni216A +ENCODING 8554 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +DB +DB +DB +73 +73 +23 +73 +73 +DB +DB +DB +ENDCHAR +STARTCHAR uni216B +ENCODING 8555 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +D5 +D5 +D5 +D5 +65 +65 +65 +D5 +D5 +D5 +D5 +ENDCHAR +STARTCHAR uni216C +ENCODING 8556 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FE +ENDCHAR +STARTCHAR uni216D +ENCODING 8557 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7E +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +7E +ENDCHAR +STARTCHAR uni216E +ENCODING 8558 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +F8 +CC +C6 +C6 +C6 +C6 +C6 +C6 +C6 +CC +F8 +ENDCHAR +STARTCHAR uni216F +ENCODING 8559 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +C3 +C3 +E7 +E7 +FF +FF +DB +DB +C3 +C3 +C3 +ENDCHAR +STARTCHAR uni2170 +ENCODING 8560 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 10 3 0 +BITMAP +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2171 +ENCODING 8561 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 10 2 0 +BITMAP +D8 +00 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni2172 +ENCODING 8562 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 10 0 0 +BITMAP +DB +00 +DB +DB +DB +DB +DB +DB +DB +DB +ENDCHAR +STARTCHAR uni2173 +ENCODING 8563 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 10 0 0 +BITMAP +C0 +00 +DB +DB +DB +CE +CE +CE +C4 +C4 +ENDCHAR +STARTCHAR uni2174 +ENCODING 8564 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +C3 +C3 +66 +66 +3C +3C +18 +18 +ENDCHAR +STARTCHAR uni2175 +ENCODING 8565 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 10 0 0 +BITMAP +03 +00 +DB +DB +DB +73 +73 +73 +23 +23 +ENDCHAR +STARTCHAR uni2176 +ENCODING 8566 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 10 0 0 +BITMAP +05 +00 +D5 +D5 +D5 +D5 +D5 +D5 +65 +65 +ENDCHAR +STARTCHAR uni2177 +ENCODING 8567 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 10 0 0 +BITMAP +0A80 +0000 +AA80 +AA80 +AA80 +AA80 +AA80 +AA80 +4A80 +4A80 +ENDCHAR +STARTCHAR uni2178 +ENCODING 8568 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 10 0 0 +BITMAP +C0 +00 +DB +DB +CE +CE +CE +CE +DB +DB +ENDCHAR +STARTCHAR uni2179 +ENCODING 8569 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +C3 +66 +3C +18 +18 +3C +66 +C3 +ENDCHAR +STARTCHAR uni217A +ENCODING 8570 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 10 0 0 +BITMAP +03 +00 +DB +DB +73 +73 +73 +73 +DB +DB +ENDCHAR +STARTCHAR uni217B +ENCODING 8571 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 10 0 0 +BITMAP +05 +00 +D5 +D5 +D5 +65 +65 +D5 +D5 +D5 +ENDCHAR +STARTCHAR uni217C +ENCODING 8572 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 2 0 +BITMAP +E0 +60 +60 +60 +60 +60 +60 +60 +60 +60 +38 +ENDCHAR +STARTCHAR uni217D +ENCODING 8573 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +7E +C0 +C0 +C0 +C0 +C0 +C0 +7E +ENDCHAR +STARTCHAR uni217E +ENCODING 8574 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +06 +06 +06 +7E +C6 +C6 +C6 +C6 +C6 +C6 +7E +ENDCHAR +STARTCHAR uni217F +ENCODING 8575 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +FE +DB +DB +DB +DB +DB +DB +DB +ENDCHAR +STARTCHAR uni2180 +ENCODING 8576 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 11 0 0 +BITMAP +3E00 +6B00 +C980 +C980 +C980 +C980 +C980 +C980 +C980 +6B00 +3E00 +ENDCHAR +STARTCHAR uni2181 +ENCODING 8577 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +FC +C6 +F3 +DB +DB +DB +DB +DB +F3 +C6 +FC +ENDCHAR +STARTCHAR uni2182 +ENCODING 8578 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 11 0 0 +BITMAP +3E00 +6B00 +DD80 +BE80 +AA80 +AA80 +AA80 +BE80 +DD80 +6B00 +3E00 +ENDCHAR +STARTCHAR uni2183 +ENCODING 8579 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FC +06 +06 +06 +06 +06 +06 +06 +06 +06 +FC +ENDCHAR +STARTCHAR uni2184 +ENCODING 8580 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +FC +06 +06 +06 +06 +06 +06 +FC +ENDCHAR +STARTCHAR uni2185 +ENCODING 8581 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +7E +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +7E +06 +06 +06 +ENDCHAR +STARTCHAR uni2189 +ENCODING 8585 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +70 +D8 +D8 +D8 +D9 +72 +04 +08 +10 +20 +5E +83 +0E +03 +03 +1E +ENDCHAR +STARTCHAR arrowleft +ENCODING 8592 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 0 3 +BITMAP +20 +40 +FE +40 +20 +ENDCHAR +STARTCHAR arrowup +ENCODING 8593 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 7 1 2 +BITMAP +20 +70 +A8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR arrowright +ENCODING 8594 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 0 3 +BITMAP +08 +04 +FE +04 +08 +ENDCHAR +STARTCHAR arrowdown +ENCODING 8595 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 7 1 2 +BITMAP +20 +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR arrowboth +ENCODING 8596 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 3 +BITMAP +24 +42 +FF +42 +24 +ENDCHAR +STARTCHAR arrowupdn +ENCODING 8597 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 8 1 1 +BITMAP +20 +70 +A8 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2196 +ENCODING 8598 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 5 1 3 +BITMAP +F0 +C0 +A0 +90 +08 +ENDCHAR +STARTCHAR uni2197 +ENCODING 8599 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 5 1 3 +BITMAP +78 +18 +28 +48 +80 +ENDCHAR +STARTCHAR uni2198 +ENCODING 8600 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 5 1 3 +BITMAP +80 +48 +28 +18 +78 +ENDCHAR +STARTCHAR uni2199 +ENCODING 8601 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 5 1 3 +BITMAP +08 +90 +A0 +C0 +F0 +ENDCHAR +STARTCHAR uni219A +ENCODING 8602 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 0 3 +BITMAP +20 +44 +FE +48 +20 +ENDCHAR +STARTCHAR uni219B +ENCODING 8603 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 0 3 +BITMAP +08 +44 +FE +24 +08 +ENDCHAR +STARTCHAR uni219C +ENCODING 8604 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 4 0 4 +BITMAP +F0 +C0 +A6 +99 +ENDCHAR +STARTCHAR uni219D +ENCODING 8605 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 4 0 4 +BITMAP +0F +03 +65 +99 +ENDCHAR +STARTCHAR uni219E +ENCODING 8606 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 3 +BITMAP +24 +48 +FF +48 +24 +ENDCHAR +STARTCHAR uni219F +ENCODING 8607 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 8 1 1 +BITMAP +20 +70 +A8 +20 +70 +A8 +20 +20 +ENDCHAR +STARTCHAR uni21A0 +ENCODING 8608 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 3 +BITMAP +24 +12 +FF +12 +24 +ENDCHAR +STARTCHAR uni21A1 +ENCODING 8609 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 8 1 1 +BITMAP +20 +20 +A8 +70 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni21A2 +ENCODING 8610 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 3 +BITMAP +21 +42 +FC +42 +21 +ENDCHAR +STARTCHAR uni21A3 +ENCODING 8611 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 3 +BITMAP +84 +42 +3F +42 +84 +ENDCHAR +STARTCHAR uni21A4 +ENCODING 8612 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 0 3 +BITMAP +22 +42 +FE +42 +22 +ENDCHAR +STARTCHAR uni21A5 +ENCODING 8613 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 7 1 2 +BITMAP +20 +70 +A8 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni21A6 +ENCODING 8614 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 0 3 +BITMAP +88 +84 +FE +84 +88 +ENDCHAR +STARTCHAR uni21A7 +ENCODING 8615 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 7 1 2 +BITMAP +F8 +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR arrowupdnbse +ENCODING 8616 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 9 1 0 +BITMAP +20 +70 +A8 +20 +20 +A8 +70 +20 +F8 +ENDCHAR +STARTCHAR uni21A9 +ENCODING 8617 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 6 0 3 +BITMAP +02 +21 +41 +FE +40 +20 +ENDCHAR +STARTCHAR uni21AA +ENCODING 8618 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 6 0 3 +BITMAP +40 +84 +82 +7F +02 +04 +ENDCHAR +STARTCHAR uni21AB +ENCODING 8619 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 6 0 3 +BITMAP +02 +25 +45 +FE +44 +20 +ENDCHAR +STARTCHAR uni21AC +ENCODING 8620 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 6 0 3 +BITMAP +40 +A4 +A2 +7F +22 +04 +ENDCHAR +STARTCHAR uni21AF +ENCODING 8623 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 1 1 +BITMAP +80 +90 +B0 +D0 +90 +10 +54 +38 +10 +ENDCHAR +STARTCHAR uni21B0 +ENCODING 8624 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 0 +BITMAP +20 +40 +FC +44 +24 +04 +04 +04 +04 +04 +ENDCHAR +STARTCHAR uni21B1 +ENCODING 8625 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 0 +BITMAP +10 +08 +FC +88 +90 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni21B2 +ENCODING 8626 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 0 +BITMAP +04 +04 +04 +04 +04 +24 +44 +FC +40 +20 +ENDCHAR +STARTCHAR uni21B3 +ENCODING 8627 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 0 +BITMAP +80 +80 +80 +80 +80 +90 +88 +FC +08 +10 +ENDCHAR +STARTCHAR uni21B4 +ENCODING 8628 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +FC +04 +04 +04 +04 +15 +0E +04 +ENDCHAR +STARTCHAR carriagereturn +ENCODING 8629 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +01 +01 +01 +21 +41 +FF +40 +20 +ENDCHAR +STARTCHAR uni21B6 +ENCODING 8630 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 6 0 3 +BITMAP +0E +11 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni21B7 +ENCODING 8631 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 6 0 3 +BITMAP +70 +88 +04 +15 +0E +04 +ENDCHAR +STARTCHAR uni21B8 +ENCODING 8632 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 7 1 3 +BITMAP +FC +00 +F0 +C0 +A0 +90 +08 +ENDCHAR +STARTCHAR uni21B9 +ENCODING 8633 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +90 +A0 +FF +A0 +99 +05 +FF +05 +09 +ENDCHAR +STARTCHAR uni21BA +ENCODING 8634 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 1 +BITMAP +0E +0C +4A +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR uni21BB +ENCODING 8635 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 1 +BITMAP +70 +30 +52 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR uni21BC +ENCODING 8636 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 3 0 5 +BITMAP +20 +40 +FE +ENDCHAR +STARTCHAR uni21BD +ENCODING 8637 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 3 0 3 +BITMAP +FE +40 +20 +ENDCHAR +STARTCHAR uni21BE +ENCODING 8638 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 7 3 2 +BITMAP +80 +C0 +A0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni21BF +ENCODING 8639 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 7 1 2 +BITMAP +20 +60 +A0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni21C0 +ENCODING 8640 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 3 0 5 +BITMAP +08 +04 +FE +ENDCHAR +STARTCHAR uni21C1 +ENCODING 8641 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 3 0 3 +BITMAP +FE +04 +08 +ENDCHAR +STARTCHAR uni21C2 +ENCODING 8642 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 7 3 2 +BITMAP +80 +80 +80 +80 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni21C3 +ENCODING 8643 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 7 1 2 +BITMAP +20 +20 +20 +20 +A0 +60 +20 +ENDCHAR +STARTCHAR uni21C4 +ENCODING 8644 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +04 +02 +FF +02 +24 +40 +FF +40 +20 +ENDCHAR +STARTCHAR uni21C5 +ENCODING 8645 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 8 0 0 +BITMAP +2200 +7200 +AA00 +2200 +2200 +2A80 +2700 +2200 +ENDCHAR +STARTCHAR uni21C6 +ENCODING 8646 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +20 +40 +FF +40 +24 +02 +FF +02 +04 +ENDCHAR +STARTCHAR uni21C7 +ENCODING 8647 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +20 +40 +FF +40 +20 +40 +FF +40 +20 +ENDCHAR +STARTCHAR uni21C8 +ENCODING 8648 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 8 0 0 +BITMAP +2200 +7700 +AA80 +2200 +2200 +2200 +2200 +2200 +ENDCHAR +STARTCHAR uni21C9 +ENCODING 8649 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +04 +02 +FF +02 +04 +02 +FF +02 +04 +ENDCHAR +STARTCHAR uni21CA +ENCODING 8650 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 8 0 0 +BITMAP +2200 +2200 +2200 +2200 +2200 +AA80 +7700 +2200 +ENDCHAR +STARTCHAR uni21CB +ENCODING 8651 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 7 0 0 +BITMAP +20 +40 +FF +00 +FF +02 +04 +ENDCHAR +STARTCHAR uni21CC +ENCODING 8652 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 7 0 0 +BITMAP +04 +02 +FF +00 +FF +40 +20 +ENDCHAR +STARTCHAR uni21CD +ENCODING 8653 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 2 +BITMAP +22 +7F +C4 +7F +28 +ENDCHAR +STARTCHAR uni21CE +ENCODING 8654 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni21CF +ENCODING 8655 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 2 +BITMAP +14 +FE +23 +FE +44 +ENDCHAR +STARTCHAR arrowdblleft +ENCODING 8656 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 2 +BITMAP +20 +7F +C0 +7F +20 +ENDCHAR +STARTCHAR arrowdblup +ENCODING 8657 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 8 1 1 +BITMAP +20 +70 +D8 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR arrowdblright +ENCODING 8658 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 2 +BITMAP +04 +FE +03 +FE +04 +ENDCHAR +STARTCHAR arrowdbldown +ENCODING 8659 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 8 1 1 +BITMAP +50 +50 +50 +50 +50 +D8 +70 +20 +ENDCHAR +STARTCHAR arrowdblboth +ENCODING 8660 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 2 +BITMAP +24 +7E +C3 +7E +24 +ENDCHAR +STARTCHAR uni21D5 +ENCODING 8661 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 8 1 1 +BITMAP +20 +70 +D8 +50 +50 +D8 +70 +20 +ENDCHAR +STARTCHAR uni21D6 +ENCODING 8662 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 6 1 2 +BITMAP +F0 +A0 +D0 +A8 +14 +08 +ENDCHAR +STARTCHAR uni21D7 +ENCODING 8663 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 6 1 2 +BITMAP +3C +14 +2C +54 +A0 +40 +ENDCHAR +STARTCHAR uni21D8 +ENCODING 8664 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 6 1 2 +BITMAP +40 +A0 +54 +2C +14 +3C +ENDCHAR +STARTCHAR uni21D9 +ENCODING 8665 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 6 1 2 +BITMAP +08 +14 +A8 +D0 +A0 +F0 +ENDCHAR +STARTCHAR uni21DA +ENCODING 8666 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 7 0 1 +BITMAP +10 +3F +40 +FF +40 +3F +10 +ENDCHAR +STARTCHAR uni21DB +ENCODING 8667 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 7 0 1 +BITMAP +08 +FC +02 +FF +02 +FC +08 +ENDCHAR +STARTCHAR uni21DC +ENCODING 8668 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 3 +BITMAP +20 +40 +F5 +4A +20 +ENDCHAR +STARTCHAR uni21DD +ENCODING 8669 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 3 +BITMAP +04 +52 +AF +02 +04 +ENDCHAR +STARTCHAR uni21DE +ENCODING 8670 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 9 1 0 +BITMAP +20 +70 +A8 +20 +F8 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni21DF +ENCODING 8671 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 9 1 0 +BITMAP +20 +20 +F8 +20 +F8 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni21E0 +ENCODING 8672 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 0 3 +BITMAP +20 +40 +EA +40 +20 +ENDCHAR +STARTCHAR uni21E1 +ENCODING 8673 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 7 1 2 +BITMAP +20 +70 +A8 +00 +20 +00 +20 +ENDCHAR +STARTCHAR uni21E2 +ENCODING 8674 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 0 3 +BITMAP +08 +04 +AE +04 +08 +ENDCHAR +STARTCHAR uni21E3 +ENCODING 8675 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 7 1 2 +BITMAP +20 +00 +20 +00 +A8 +70 +20 +ENDCHAR +STARTCHAR uni21E4 +ENCODING 8676 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 3 +BITMAP +90 +A0 +FF +A0 +90 +ENDCHAR +STARTCHAR uni21E5 +ENCODING 8677 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 3 +BITMAP +09 +05 +FF +05 +09 +ENDCHAR +STARTCHAR uni21E6 +ENCODING 8678 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 0 3 +BITMAP +30 +5E +82 +5E +30 +ENDCHAR +STARTCHAR uni21E7 +ENCODING 8679 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 7 1 2 +BITMAP +20 +50 +88 +D8 +50 +50 +70 +ENDCHAR +STARTCHAR uni21E8 +ENCODING 8680 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 0 3 +BITMAP +18 +F4 +82 +F4 +18 +ENDCHAR +STARTCHAR uni21E9 +ENCODING 8681 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 7 1 2 +BITMAP +70 +50 +50 +D8 +88 +50 +20 +ENDCHAR +STARTCHAR uni21EA +ENCODING 8682 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 9 1 0 +BITMAP +20 +50 +88 +D8 +70 +00 +70 +50 +70 +ENDCHAR +STARTCHAR uni21EB +ENCODING 8683 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 8 1 1 +BITMAP +20 +50 +88 +D8 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni21EC +ENCODING 8684 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 8 1 1 +BITMAP +20 +50 +88 +F8 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni21EE +ENCODING 8686 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 9 1 2 +BITMAP +20 +50 +A8 +50 +88 +D8 +50 +50 +70 +ENDCHAR +STARTCHAR uni21EF +ENCODING 8687 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 1 0 +BITMAP +20 +50 +A8 +50 +88 +D8 +50 +50 +D8 +88 +F8 +ENDCHAR +STARTCHAR uni21F0 +ENCODING 8688 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 3 +BITMAP +CC +BA +81 +BA +CC +ENDCHAR +STARTCHAR uni21F1 +ENCODING 8689 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 3 +BITMAP +FE +80 +BC +B0 +A8 +A4 +82 +ENDCHAR +STARTCHAR uni21F2 +ENCODING 8690 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 3 +BITMAP +82 +4A +2A +1A +7A +02 +FE +ENDCHAR +STARTCHAR uni21F3 +ENCODING 8691 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 10 1 0 +BITMAP +20 +50 +88 +D8 +50 +50 +D8 +88 +50 +20 +ENDCHAR +STARTCHAR uni21F4 +ENCODING 8692 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 3 +BITMAP +24 +52 +FF +52 +24 +ENDCHAR +STARTCHAR uni21F5 +ENCODING 8693 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 8 0 0 +BITMAP +2200 +2700 +2A80 +2200 +2200 +AA00 +7200 +2200 +ENDCHAR +STARTCHAR uni21F6 +ENCODING 8694 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 -1 +BITMAP +04 +02 +FF +02 +04 +02 +FF +02 +04 +02 +FF +02 +04 +ENDCHAR +STARTCHAR uni21F7 +ENCODING 8695 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 0 3 +BITMAP +28 +48 +FE +48 +28 +ENDCHAR +STARTCHAR uni21F8 +ENCODING 8696 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 0 3 +BITMAP +28 +24 +FE +24 +28 +ENDCHAR +STARTCHAR uni21F9 +ENCODING 8697 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 5 0 3 +BITMAP +2A00 +4900 +FF80 +4900 +2A00 +ENDCHAR +STARTCHAR uni21FA +ENCODING 8698 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 3 +BITMAP +2A +4A +FF +4A +2A +ENDCHAR +STARTCHAR uni21FB +ENCODING 8699 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 3 +BITMAP +54 +52 +FF +52 +54 +ENDCHAR +STARTCHAR uni21FD +ENCODING 8701 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 0 3 +BITMAP +20 +60 +BE +60 +20 +ENDCHAR +STARTCHAR uni21FE +ENCODING 8702 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 0 3 +BITMAP +08 +0C +FA +0C +08 +ENDCHAR +STARTCHAR uni21FF +ENCODING 8703 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 3 +BITMAP +24 +66 +BD +66 +24 +ENDCHAR +STARTCHAR universal +ENCODING 8704 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +C3 +C3 +C3 +7E +66 +66 +3C +3C +3C +18 +18 +ENDCHAR +STARTCHAR uni2201 +ENCODING 8705 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7E +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +7E +ENDCHAR +STARTCHAR partialdiff +ENCODING 8706 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +38 +0C +0C +06 +36 +6E +C6 +C6 +C6 +6C +38 +ENDCHAR +STARTCHAR existential +ENCODING 8707 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FE +06 +06 +06 +06 +7E +06 +06 +06 +06 +FE +ENDCHAR +STARTCHAR uni2204 +ENCODING 8708 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -1 +BITMAP +10 +FE +16 +16 +26 +26 +7E +26 +26 +46 +46 +FE +40 +ENDCHAR +STARTCHAR emptyset +ENCODING 8709 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 1 +BITMAP +3D +66 +C7 +CB +D3 +D3 +E3 +66 +BC +ENDCHAR +STARTCHAR uni2206 +ENCODING 8710 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 1 +BITMAP +18 +18 +3C +3C +66 +66 +C3 +C3 +FF +ENDCHAR +STARTCHAR gradient +ENCODING 8711 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 1 +BITMAP +FF +C3 +C3 +66 +66 +3C +3C +18 +18 +ENDCHAR +STARTCHAR element +ENCODING 8712 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +3E +60 +C0 +C0 +C0 +FE +C0 +C0 +C0 +60 +3E +ENDCHAR +STARTCHAR notelement +ENCODING 8713 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -1 +BITMAP +04 +3E +64 +C4 +C8 +C8 +FE +C8 +C8 +D0 +70 +3E +10 +ENDCHAR +STARTCHAR uni220A +ENCODING 8714 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 1 1 +BITMAP +3E +60 +C0 +FE +C0 +60 +3E +ENDCHAR +STARTCHAR suchthat +ENCODING 8715 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +F8 +0C +06 +06 +06 +FE +06 +06 +06 +0C +F8 +ENDCHAR +STARTCHAR uni220C +ENCODING 8716 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -1 +BITMAP +10 +F8 +1C +16 +26 +26 +FE +26 +26 +46 +4C +F8 +40 +ENDCHAR +STARTCHAR uni220D +ENCODING 8717 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 1 1 +BITMAP +F8 +0C +06 +FE +06 +0C +F8 +ENDCHAR +STARTCHAR uni220E +ENCODING 8718 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 1 0 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR product +ENCODING 8719 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FE +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR uni2210 +ENCODING 8720 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +FE +ENDCHAR +STARTCHAR summation +ENCODING 8721 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +FE +C0 +60 +30 +18 +0C +18 +30 +60 +C0 +FE +ENDCHAR +STARTCHAR minus +ENCODING 8722 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 1 0 5 +BITMAP +FF +ENDCHAR +STARTCHAR uni2213 +ENCODING 8723 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 1 +BITMAP +FF +00 +18 +18 +18 +FF +18 +18 +18 +ENDCHAR +STARTCHAR uni2214 +ENCODING 8724 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 2 +BITMAP +18 +00 +18 +18 +18 +FF +18 +18 +18 +ENDCHAR +STARTCHAR uni2215 +ENCODING 8725 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +06 +06 +0C +0C +18 +18 +30 +30 +60 +60 +C0 +C0 +ENDCHAR +STARTCHAR uni2216 +ENCODING 8726 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +C0 +C0 +60 +60 +30 +30 +18 +18 +0C +0C +06 +06 +ENDCHAR +STARTCHAR asteriskmath +ENCODING 8727 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 7 1 2 +BITMAP +30 +B4 +78 +30 +78 +B4 +30 +ENDCHAR +STARTCHAR uni2218 +ENCODING 8728 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 5 1 3 +BITMAP +78 +CC +CC +CC +78 +ENDCHAR +STARTCHAR uni2219 +ENCODING 8729 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 5 1 3 +BITMAP +78 +FC +FC +FC +78 +ENDCHAR +STARTCHAR radical +ENCODING 8730 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +07 +06 +06 +0C +0C +CC +D8 +78 +78 +30 +30 +ENDCHAR +STARTCHAR uni221B +ENCODING 8731 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +F0 +18 +77 +1E +F6 +0C +0C +CC +D8 +78 +78 +30 +30 +ENDCHAR +STARTCHAR uni221C +ENCODING 8732 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +30 +70 +B7 +FE +36 +0C +0C +CC +D8 +78 +78 +30 +30 +ENDCHAR +STARTCHAR proportional +ENCODING 8733 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +73 +DE +DE +CC +CC +DE +DE +73 +ENDCHAR +STARTCHAR infinity +ENCODING 8734 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 6 0 1 +BITMAP +66 +FF +DB +DB +FF +66 +ENDCHAR +STARTCHAR orthogonal +ENCODING 8735 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 7 0 3 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +FF +ENDCHAR +STARTCHAR angle +ENCODING 8736 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 3 +BITMAP +18 +18 +30 +30 +60 +60 +C0 +FF +ENDCHAR +STARTCHAR uni2221 +ENCODING 8737 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 2 +BITMAP +18 +58 +30 +30 +68 +68 +C4 +FF +04 +ENDCHAR +STARTCHAR uni2222 +ENCODING 8738 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 7 0 3 +BITMAP +0B +0E +3C +E4 +3C +0E +0B +ENDCHAR +STARTCHAR uni2223 +ENCODING 8739 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 14 3 -3 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2224 +ENCODING 8740 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +30 +30 +30 +30 +34 +38 +30 +70 +B0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2225 +ENCODING 8741 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 14 2 -3 +BITMAP +D8 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni2226 +ENCODING 8742 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +6C +6C +6C +6C +6C +6C +6E +7C +EC +6C +6C +6C +6C +6C +ENDCHAR +STARTCHAR logicaland +ENCODING 8743 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +18 +18 +3C +3C +66 +66 +C3 +C3 +ENDCHAR +STARTCHAR logicalor +ENCODING 8744 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +C3 +C3 +66 +66 +3C +3C +18 +18 +ENDCHAR +STARTCHAR intersection +ENCODING 8745 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +3C +66 +C3 +C3 +C3 +C3 +C3 +C3 +ENDCHAR +STARTCHAR union +ENCODING 8746 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +C3 +C3 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR integral +ENCODING 8747 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 15 2 -3 +BITMAP +1C +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR uni222C +ENCODING 8748 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 15 0 -3 +BITMAP +1B80 +3600 +3600 +3600 +3600 +3600 +3600 +3600 +3600 +3600 +3600 +3600 +3600 +3600 +EC00 +ENDCHAR +STARTCHAR uni222D +ENCODING 8749 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 15 0 -3 +BITMAP +1580 +2A00 +2A00 +2A00 +2A00 +2A00 +2A00 +2A00 +2A00 +2A00 +2A00 +2A00 +2A00 +2A00 +D400 +ENDCHAR +STARTCHAR uni222E +ENCODING 8750 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +0C +10 +10 +10 +10 +7C +D6 +D6 +D6 +7C +10 +10 +10 +10 +60 +ENDCHAR +STARTCHAR uni222F +ENCODING 8751 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +16 +28 +28 +28 +28 +7C +AA +AA +AA +7C +28 +28 +28 +28 +D0 +ENDCHAR +STARTCHAR uni2230 +ENCODING 8752 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 15 0 -3 +BITMAP +1580 +2A00 +2A00 +2A00 +2A00 +3E00 +6B00 +6B00 +6B00 +3E00 +2A00 +2A00 +2A00 +2A00 +D400 +ENDCHAR +STARTCHAR therefore +ENCODING 8756 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 5 1 3 +BITMAP +20 +00 +00 +00 +88 +ENDCHAR +STARTCHAR uni2235 +ENCODING 8757 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 5 1 3 +BITMAP +88 +00 +00 +00 +20 +ENDCHAR +STARTCHAR uni2236 +ENCODING 8758 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 5 3 3 +BITMAP +80 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni2237 +ENCODING 8759 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 5 1 3 +BITMAP +88 +00 +00 +00 +88 +ENDCHAR +STARTCHAR uni2238 +ENCODING 8760 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 3 1 5 +BITMAP +20 +00 +F8 +ENDCHAR +STARTCHAR uni2239 +ENCODING 8761 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 5 1 3 +BITMAP +04 +00 +F8 +00 +04 +ENDCHAR +STARTCHAR uni223A +ENCODING 8762 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 5 1 3 +BITMAP +88 +00 +F8 +00 +88 +ENDCHAR +STARTCHAR uni223B +ENCODING 8763 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 6 1 3 +BITMAP +10 +00 +64 +98 +00 +20 +ENDCHAR +STARTCHAR similar +ENCODING 8764 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 2 1 5 +BITMAP +64 +98 +ENDCHAR +STARTCHAR uni223D +ENCODING 8765 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 2 1 5 +BITMAP +98 +64 +ENDCHAR +STARTCHAR uni223E +ENCODING 8766 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 4 0 4 +BITMAP +62 +91 +89 +46 +ENDCHAR +STARTCHAR uni223F +ENCODING 8767 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 2 +BITMAP +40 +A0 +A0 +90 +12 +0A +0A +04 +ENDCHAR +STARTCHAR uni2240 +ENCODING 8768 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 10 3 0 +BITMAP +80 +40 +40 +40 +40 +80 +80 +80 +80 +40 +ENDCHAR +STARTCHAR uni2241 +ENCODING 8769 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 4 1 4 +BITMAP +10 +74 +B8 +20 +ENDCHAR +STARTCHAR uni2242 +ENCODING 8770 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 4 1 4 +BITMAP +FC +00 +64 +98 +ENDCHAR +STARTCHAR uni2243 +ENCODING 8771 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 4 1 4 +BITMAP +64 +98 +00 +FC +ENDCHAR +STARTCHAR uni2244 +ENCODING 8772 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 6 1 3 +BITMAP +10 +74 +98 +20 +FC +20 +ENDCHAR +STARTCHAR congruent +ENCODING 8773 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 6 1 3 +BITMAP +64 +98 +00 +FC +00 +FC +ENDCHAR +STARTCHAR uni2246 +ENCODING 8774 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 7 1 2 +BITMAP +64 +98 +00 +FC +10 +FC +20 +ENDCHAR +STARTCHAR uni2247 +ENCODING 8775 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 2 +BITMAP +08 +6C +98 +10 +FC +20 +FC +40 +ENDCHAR +STARTCHAR approxequal +ENCODING 8776 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 5 1 3 +BITMAP +64 +98 +00 +64 +98 +ENDCHAR +STARTCHAR uni2249 +ENCODING 8777 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 7 1 2 +BITMAP +10 +74 +98 +10 +64 +B8 +20 +ENDCHAR +STARTCHAR uni224A +ENCODING 8778 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 7 1 2 +BITMAP +64 +98 +00 +64 +98 +00 +FC +ENDCHAR +STARTCHAR uni224B +ENCODING 8779 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 1 +BITMAP +64 +98 +00 +64 +98 +00 +64 +98 +ENDCHAR +STARTCHAR uni224C +ENCODING 8780 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 6 1 3 +BITMAP +98 +64 +00 +FC +00 +FC +ENDCHAR +STARTCHAR notequal +ENCODING 8800 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 6 1 2 +BITMAP +10 +F8 +20 +20 +F8 +40 +ENDCHAR +STARTCHAR equivalence +ENCODING 8801 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 5 1 3 +BITMAP +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2262 +ENCODING 8802 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 7 1 2 +BITMAP +10 +F8 +20 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2263 +ENCODING 8803 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 7 1 2 +BITMAP +F8 +00 +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR lessequal +ENCODING 8804 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 7 1 2 +BITMAP +0C +30 +C0 +30 +0C +00 +FC +ENDCHAR +STARTCHAR greaterequal +ENCODING 8805 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 7 1 2 +BITMAP +C0 +30 +0C +30 +C0 +00 +FC +ENDCHAR +STARTCHAR uni2266 +ENCODING 8806 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 1 1 +BITMAP +0C +30 +C0 +30 +0C +00 +FC +00 +FC +ENDCHAR +STARTCHAR uni2267 +ENCODING 8807 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 1 1 +BITMAP +C0 +30 +0C +30 +C0 +00 +FC +00 +FC +ENDCHAR +STARTCHAR uni2268 +ENCODING 8808 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 0 +BITMAP +0C +30 +C0 +30 +0C +10 +FC +20 +FC +40 +ENDCHAR +STARTCHAR uni2269 +ENCODING 8809 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 0 +BITMAP +C0 +30 +0C +30 +C0 +10 +FC +20 +FC +40 +ENDCHAR +STARTCHAR uni226A +ENCODING 8810 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 1 3 +BITMAP +12 +6C +90 +6C +12 +ENDCHAR +STARTCHAR uni226B +ENCODING 8811 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 1 3 +BITMAP +90 +6C +12 +6C +90 +ENDCHAR +STARTCHAR uni226E +ENCODING 8814 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 6 7 1 2 +BITMAP +08 +0C +30 +D0 +30 +2C +20 +ENDCHAR +STARTCHAR uni226F +ENCODING 8815 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 6 7 1 2 +BITMAP +08 +C8 +30 +1C +30 +E0 +20 +ENDCHAR +STARTCHAR uni2270 +ENCODING 8816 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 6 9 1 1 +BITMAP +08 +0C +38 +D0 +30 +2C +20 +FC +40 +ENDCHAR +STARTCHAR uni2271 +ENCODING 8817 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 6 8 1 1 +BITMAP +C8 +38 +1C +30 +E0 +20 +FC +40 +ENDCHAR +STARTCHAR uni2276 +ENCODING 8822 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 0 +BITMAP +0C +30 +C0 +30 +0C +C0 +30 +0C +30 +C0 +ENDCHAR +STARTCHAR uni2277 +ENCODING 8823 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 0 +BITMAP +C0 +30 +0C +30 +C0 +0C +30 +C0 +30 +0C +ENDCHAR +STARTCHAR uni227A +ENCODING 8826 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 7 1 2 +BITMAP +04 +08 +30 +C0 +30 +08 +04 +ENDCHAR +STARTCHAR uni227B +ENCODING 8827 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 7 1 2 +BITMAP +80 +40 +30 +0C +30 +40 +80 +ENDCHAR +STARTCHAR uni227C +ENCODING 8828 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 1 1 +BITMAP +04 +08 +30 +C0 +30 +C8 +34 +08 +04 +ENDCHAR +STARTCHAR uni227D +ENCODING 8829 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 1 1 +BITMAP +80 +40 +30 +0C +30 +4C +B0 +40 +80 +ENDCHAR +STARTCHAR uni2280 +ENCODING 8832 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 6 7 1 2 +BITMAP +04 +08 +30 +C0 +30 +08 +04 +ENDCHAR +STARTCHAR propersubset +ENCODING 8834 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 6 1 1 +BITMAP +7C +80 +80 +80 +80 +7C +ENDCHAR +STARTCHAR propersuperset +ENCODING 8835 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 6 1 1 +BITMAP +F8 +04 +04 +04 +04 +F8 +ENDCHAR +STARTCHAR notsubset +ENCODING 8836 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +08 +7C +88 +90 +90 +A0 +7C +20 +ENDCHAR +STARTCHAR uni2285 +ENCODING 8837 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +10 +F8 +14 +24 +24 +44 +F8 +40 +ENDCHAR +STARTCHAR reflexsubset +ENCODING 8838 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +7C +80 +80 +80 +80 +7C +00 +FC +ENDCHAR +STARTCHAR reflexsuperset +ENCODING 8839 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +F8 +04 +04 +04 +04 +F8 +00 +FC +ENDCHAR +STARTCHAR uni2288 +ENCODING 8840 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 -1 +BITMAP +08 +7C +88 +90 +90 +A0 +7C +20 +FC +40 +ENDCHAR +STARTCHAR uni2289 +ENCODING 8841 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 -1 +BITMAP +10 +F8 +14 +24 +24 +44 +F8 +40 +FC +80 +ENDCHAR +STARTCHAR uni228A +ENCODING 8842 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 1 -1 +BITMAP +7C +80 +80 +80 +80 +7C +10 +FC +20 +ENDCHAR +STARTCHAR uni228B +ENCODING 8843 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 1 -1 +BITMAP +F8 +04 +04 +04 +04 +F8 +10 +FC +20 +ENDCHAR +STARTCHAR uni228F +ENCODING 8847 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 6 1 1 +BITMAP +FC +80 +80 +80 +80 +FC +ENDCHAR +STARTCHAR uni2290 +ENCODING 8848 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 6 1 1 +BITMAP +FC +04 +04 +04 +04 +FC +ENDCHAR +STARTCHAR uni2291 +ENCODING 8849 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +FC +80 +80 +80 +80 +FC +00 +FC +ENDCHAR +STARTCHAR uni2292 +ENCODING 8850 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +FC +04 +04 +04 +04 +FC +00 +FC +ENDCHAR +STARTCHAR uni2293 +ENCODING 8851 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 6 1 1 +BITMAP +FC +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR uni2294 +ENCODING 8852 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 6 1 1 +BITMAP +84 +84 +84 +84 +84 +FC +ENDCHAR +STARTCHAR circleplus +ENCODING 8853 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 2 +BITMAP +38 +44 +92 +BA +92 +44 +38 +ENDCHAR +STARTCHAR uni2296 +ENCODING 8854 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 2 +BITMAP +38 +44 +82 +BA +82 +44 +38 +ENDCHAR +STARTCHAR circlemultiply +ENCODING 8855 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 2 +BITMAP +38 +44 +AA +92 +AA +44 +38 +ENDCHAR +STARTCHAR uni2298 +ENCODING 8856 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 2 +BITMAP +38 +44 +8A +92 +A2 +44 +38 +ENDCHAR +STARTCHAR uni2299 +ENCODING 8857 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 2 +BITMAP +38 +44 +82 +92 +82 +44 +38 +ENDCHAR +STARTCHAR uni229A +ENCODING 8858 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 2 +BITMAP +38 +44 +92 +AA +92 +44 +38 +ENDCHAR +STARTCHAR uni229C +ENCODING 8860 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 2 +BITMAP +38 +44 +BA +82 +BA +44 +38 +ENDCHAR +STARTCHAR uni229D +ENCODING 8861 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 2 +BITMAP +38 +44 +82 +BA +82 +44 +38 +ENDCHAR +STARTCHAR uni229E +ENCODING 8862 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 2 +BITMAP +FE +82 +92 +BA +92 +82 +FE +ENDCHAR +STARTCHAR uni229F +ENCODING 8863 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 2 +BITMAP +FE +82 +82 +BA +82 +82 +FE +ENDCHAR +STARTCHAR uni22A0 +ENCODING 8864 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 2 +BITMAP +FE +82 +AA +92 +AA +82 +FE +ENDCHAR +STARTCHAR uni22A1 +ENCODING 8865 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 2 +BITMAP +FE +82 +82 +92 +82 +82 +FE +ENDCHAR +STARTCHAR uni22A2 +ENCODING 8866 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 1 2 +BITMAP +80 +80 +80 +FE +80 +80 +80 +ENDCHAR +STARTCHAR uni22A3 +ENCODING 8867 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 1 2 +BITMAP +02 +02 +02 +FE +02 +02 +02 +ENDCHAR +STARTCHAR uni22A4 +ENCODING 8868 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 1 2 +BITMAP +FE +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR perpendicular +ENCODING 8869 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 1 2 +BITMAP +10 +10 +10 +10 +10 +10 +FE +ENDCHAR +STARTCHAR uni22A6 +ENCODING 8870 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 2 0 +BITMAP +80 +80 +80 +80 +80 +F8 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni22A7 +ENCODING 8871 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 2 0 +BITMAP +80 +80 +80 +80 +F8 +80 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni22A8 +ENCODING 8872 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +80 +80 +80 +80 +FE +80 +FE +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni22A9 +ENCODING 8873 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +BE +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni22AA +ENCODING 8874 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +AF +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni22AB +ENCODING 8875 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +A0 +A0 +A0 +A0 +BE +A0 +BE +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni22AC +ENCODING 8876 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 2 0 +BITMAP +80 +80 +80 +90 +90 +F8 +A0 +A0 +80 +80 +80 +ENDCHAR +STARTCHAR uni22AD +ENCODING 8877 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +80 +80 +84 +84 +FE +88 +FE +90 +90 +80 +80 +ENDCHAR +STARTCHAR uni22AE +ENCODING 8878 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +A0 +A0 +A0 +A4 +A4 +BE +A8 +A8 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni22AF +ENCODING 8879 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +A0 +A0 +A4 +A4 +BE +A8 +BE +B0 +B0 +A0 +A0 +ENDCHAR +STARTCHAR uni22B0 +ENCODING 8880 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 7 1 2 +BITMAP +08 +04 +18 +E0 +18 +04 +08 +ENDCHAR +STARTCHAR uni22B1 +ENCODING 8881 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 7 1 2 +BITMAP +40 +80 +60 +1C +60 +80 +40 +ENDCHAR +STARTCHAR uni22B2 +ENCODING 8882 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 5 1 3 +BITMAP +0C +34 +C4 +34 +0C +ENDCHAR +STARTCHAR uni22B3 +ENCODING 8883 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 5 1 3 +BITMAP +C0 +B0 +8C +B0 +C0 +ENDCHAR +STARTCHAR uni22B4 +ENCODING 8884 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 7 1 2 +BITMAP +0C +34 +C4 +34 +0C +00 +FC +ENDCHAR +STARTCHAR uni22B5 +ENCODING 8885 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 7 1 2 +BITMAP +C0 +B0 +8C +B0 +C0 +00 +FC +ENDCHAR +STARTCHAR uni22B6 +ENCODING 8886 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 3 0 4 +BITMAP +66 +9F +66 +ENDCHAR +STARTCHAR uni22B7 +ENCODING 8887 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 3 0 4 +BITMAP +66 +F9 +66 +ENDCHAR +STARTCHAR uni22B8 +ENCODING 8888 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 3 0 4 +BITMAP +06 +F9 +06 +ENDCHAR +STARTCHAR uni22BB +ENCODING 8891 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 0 0 +BITMAP +82 +82 +44 +44 +28 +28 +10 +10 +00 +FE +ENDCHAR +STARTCHAR uni22BC +ENCODING 8892 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 0 0 +BITMAP +FE +00 +10 +10 +28 +28 +44 +44 +82 +82 +ENDCHAR +STARTCHAR uni22BD +ENCODING 8893 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 0 0 +BITMAP +FE +00 +82 +82 +44 +44 +28 +28 +10 +10 +ENDCHAR +STARTCHAR uni22BE +ENCODING 8894 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni22BF +ENCODING 8895 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 6 1 3 +BITMAP +04 +0C +1C +24 +64 +FC +ENDCHAR +STARTCHAR uni22C0 +ENCODING 8896 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +18 +18 +18 +24 +24 +24 +24 +42 +42 +42 +81 +81 +81 +81 +ENDCHAR +STARTCHAR uni22C1 +ENCODING 8897 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +81 +81 +81 +81 +42 +42 +42 +24 +24 +24 +24 +18 +18 +18 +ENDCHAR +STARTCHAR uni22C2 +ENCODING 8898 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +3C +42 +81 +81 +81 +81 +81 +81 +81 +81 +81 +81 +81 +81 +ENDCHAR +STARTCHAR uni22C3 +ENCODING 8899 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +81 +81 +81 +81 +81 +81 +81 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR uni22C4 +ENCODING 8900 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 5 1 3 +BITMAP +20 +50 +88 +50 +20 +ENDCHAR +STARTCHAR dotmath +ENCODING 8901 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 3 5 +BITMAP +80 +ENDCHAR +STARTCHAR uni22C6 +ENCODING 8902 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 6 1 3 +BITMAP +20 +20 +F8 +70 +70 +88 +ENDCHAR +STARTCHAR uni22C7 +ENCODING 8903 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 2 +BITMAP +92 +44 +28 +FE +28 +44 +92 +ENDCHAR +STARTCHAR uni22C8 +ENCODING 8904 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 2 +BITMAP +82 +C6 +AA +92 +AA +C6 +82 +ENDCHAR +STARTCHAR uni22C9 +ENCODING 8905 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 2 +BITMAP +82 +C4 +A8 +90 +A8 +C4 +82 +ENDCHAR +STARTCHAR uni22CA +ENCODING 8906 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 2 +BITMAP +82 +46 +2A +12 +2A +46 +82 +ENDCHAR +STARTCHAR uni22CB +ENCODING 8907 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 2 +BITMAP +80 +40 +20 +10 +28 +44 +82 +ENDCHAR +STARTCHAR uni22CC +ENCODING 8908 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 2 +BITMAP +02 +04 +08 +10 +28 +44 +82 +ENDCHAR +STARTCHAR uni22CD +ENCODING 8909 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 4 1 4 +BITMAP +98 +64 +00 +FC +ENDCHAR +STARTCHAR uni22CE +ENCODING 8910 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 6 0 2 +BITMAP +82 +44 +28 +28 +10 +10 +ENDCHAR +STARTCHAR uni22CF +ENCODING 8911 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 6 0 2 +BITMAP +10 +10 +28 +28 +44 +82 +ENDCHAR +STARTCHAR uni22D0 +ENCODING 8912 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +3E +40 +9E +A0 +9E +40 +3E +ENDCHAR +STARTCHAR uni22D1 +ENCODING 8913 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +F8 +04 +F2 +0A +F2 +04 +F8 +ENDCHAR +STARTCHAR uni22D2 +ENCODING 8914 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +38 +44 +92 +AA +AA +AA +AA +ENDCHAR +STARTCHAR uni22D3 +ENCODING 8915 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +AA +AA +AA +AA +92 +44 +38 +ENDCHAR +STARTCHAR uni22D6 +ENCODING 8918 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 5 1 3 +BITMAP +0C +30 +C4 +30 +0C +ENDCHAR +STARTCHAR uni22D7 +ENCODING 8919 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 5 1 3 +BITMAP +C0 +30 +8C +30 +C0 +ENDCHAR +STARTCHAR uni22D8 +ENCODING 8920 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 0 3 +BITMAP +2A +54 +A8 +54 +2A +ENDCHAR +STARTCHAR uni22D9 +ENCODING 8921 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 0 3 +BITMAP +A8 +54 +2A +54 +A8 +ENDCHAR +STARTCHAR uni22DA +ENCODING 8922 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +0C +30 +C0 +30 +0C +00 +FC +00 +C0 +30 +0C +30 +C0 +ENDCHAR +STARTCHAR uni22DB +ENCODING 8923 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +C0 +30 +0C +30 +C0 +00 +FC +00 +0C +30 +C0 +30 +0C +ENDCHAR +STARTCHAR uni22DC +ENCODING 8924 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 7 1 2 +BITMAP +FC +00 +0C +30 +C0 +30 +0C +ENDCHAR +STARTCHAR uni22DD +ENCODING 8925 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 7 1 2 +BITMAP +FC +00 +C0 +30 +0C +30 +C0 +ENDCHAR +STARTCHAR uni22DE +ENCODING 8926 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 1 1 +BITMAP +04 +08 +34 +C8 +30 +C0 +30 +08 +04 +ENDCHAR +STARTCHAR uni22DF +ENCODING 8927 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 1 1 +BITMAP +80 +40 +B0 +4C +30 +0C +30 +40 +80 +ENDCHAR +STARTCHAR house +ENCODING 8962 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 7 1 1 +BITMAP +30 +48 +84 +84 +84 +84 +FC +ENDCHAR +STARTCHAR revlogicalnot +ENCODING 8976 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 5 1 2 +BITMAP +FC +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni231A +ENCODING 8986 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +38 +38 +44 +92 +92 +9A +82 +82 +44 +38 +38 +ENDCHAR +STARTCHAR uni231B +ENCODING 8987 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +FE +44 +44 +44 +28 +10 +28 +54 +6C +54 +FE +ENDCHAR +STARTCHAR uni231C +ENCODING 8988 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 4 4 0 7 +BITMAP +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni231D +ENCODING 8989 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 4 4 4 7 +BITMAP +F0 +10 +10 +10 +ENDCHAR +STARTCHAR uni231E +ENCODING 8990 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 4 4 0 0 +BITMAP +80 +80 +80 +F0 +ENDCHAR +STARTCHAR uni231F +ENCODING 8991 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 4 4 4 0 +BITMAP +10 +10 +10 +F0 +ENDCHAR +STARTCHAR integraltp +ENCODING 8992 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 4 16 3 -3 +BITMAP +60 +90 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR integralbt +ENCODING 8993 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 4 16 0 -3 +BITMAP +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR uni239B +ENCODING 9115 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 5 16 4 -3 +BITMAP +08 +10 +20 +20 +40 +40 +40 +40 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni239C +ENCODING 9116 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 1 16 4 -3 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni239D +ENCODING 9117 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 5 16 4 -3 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +40 +40 +40 +40 +20 +20 +10 +08 +ENDCHAR +STARTCHAR uni239E +ENCODING 9118 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 5 16 0 -3 +BITMAP +80 +40 +20 +20 +10 +10 +10 +10 +08 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni239F +ENCODING 9119 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 1 16 4 -3 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A0 +ENCODING 9120 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 5 16 0 -3 +BITMAP +08 +08 +08 +08 +08 +08 +08 +08 +10 +10 +10 +10 +20 +20 +40 +80 +ENDCHAR +STARTCHAR uni23A1 +ENCODING 9121 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 5 16 4 -3 +BITMAP +F8 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A2 +ENCODING 9122 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 1 16 4 -3 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A3 +ENCODING 9123 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 5 16 4 -3 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni23A4 +ENCODING 9124 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 5 16 0 -3 +BITMAP +F8 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni23A5 +ENCODING 9125 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 1 16 4 -3 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A6 +ENCODING 9126 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 5 16 0 -3 +BITMAP +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +F8 +ENDCHAR +STARTCHAR uni23A7 +ENCODING 9127 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 5 16 4 -3 +BITMAP +18 +20 +40 +40 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A8 +ENCODING 9128 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 5 16 0 -3 +BITMAP +08 +08 +08 +08 +10 +10 +20 +C0 +20 +10 +10 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni23A9 +ENCODING 9129 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 5 16 4 -3 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +40 +40 +20 +18 +ENDCHAR +STARTCHAR uni23AA +ENCODING 9130 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 1 16 4 -3 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23AB +ENCODING 9131 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 5 16 0 -3 +BITMAP +C0 +20 +10 +10 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni23AC +ENCODING 9132 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 5 16 4 -3 +BITMAP +80 +80 +80 +80 +40 +40 +20 +18 +20 +40 +40 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23AD +ENCODING 9133 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 5 16 0 -3 +BITMAP +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +10 +10 +20 +C0 +ENDCHAR +STARTCHAR uni23AE +ENCODING 9134 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 1 16 4 -3 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23BA +ENCODING 9146 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 1 0 12 +BITMAP +FF80 +ENDCHAR +STARTCHAR uni23BB +ENCODING 9147 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 1 0 8 +BITMAP +FF80 +ENDCHAR +STARTCHAR uni23BC +ENCODING 9148 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 1 0 4 +BITMAP +FF80 +ENDCHAR +STARTCHAR uni23BD +ENCODING 9149 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 1 0 0 +BITMAP +FF80 +ENDCHAR +STARTCHAR uni2408 +ENCODING 9224 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 11 0 1 +BITMAP +F0 +88 +F0 +88 +F0 +00 +0F +10 +0E +01 +1E +ENDCHAR +STARTCHAR uni2409 +ENCODING 9225 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 11 0 1 +BITMAP +88 +88 +F8 +88 +88 +00 +1F +04 +04 +04 +04 +ENDCHAR +STARTCHAR uni240A +ENCODING 9226 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 11 0 1 +BITMAP +80 +80 +80 +80 +F8 +00 +1F +10 +1E +10 +10 +ENDCHAR +STARTCHAR uni240B +ENCODING 9227 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 11 0 1 +BITMAP +88 +88 +50 +50 +20 +00 +1F +04 +04 +04 +04 +ENDCHAR +STARTCHAR uni240C +ENCODING 9228 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 11 0 1 +BITMAP +F8 +80 +F0 +80 +80 +00 +1F +10 +1E +10 +10 +ENDCHAR +STARTCHAR uni240D +ENCODING 9229 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 11 0 1 +BITMAP +78 +80 +80 +80 +78 +00 +1E +11 +1E +12 +11 +ENDCHAR +STARTCHAR uni240E +ENCODING 9230 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 8 11 0 1 +BITMAP +78 +80 +70 +08 +F0 +00 +0E +11 +11 +11 +0E +ENDCHAR +STARTCHAR uni240F +ENCODING 9231 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 7 11 0 1 +BITMAP +78 +80 +70 +08 +F0 +00 +0E +04 +04 +04 +0E +ENDCHAR +STARTCHAR uni2420 +ENCODING 9248 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 11 0 1 +BITMAP +78 +80 +70 +08 +F0 +00 +1E +11 +1E +10 +10 +ENDCHAR +STARTCHAR uni2424 +ENCODING 9252 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 11 0 1 +BITMAP +88 +C8 +A8 +98 +88 +00 +10 +10 +10 +10 +1F +ENDCHAR +STARTCHAR SF100000 +ENCODING 9472 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 1 0 5 +BITMAP +FF80 +ENDCHAR +STARTCHAR uni2501 +ENCODING 9473 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 3 0 4 +BITMAP +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR SF110000 +ENCODING 9474 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 16 4 -3 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2503 +ENCODING 9475 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 16 3 -3 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2504 +ENCODING 9476 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 1 0 5 +BITMAP +DB +ENDCHAR +STARTCHAR uni2505 +ENCODING 9477 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 3 0 4 +BITMAP +DB +DB +DB +ENDCHAR +STARTCHAR uni2506 +ENCODING 9478 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 15 4 -2 +BITMAP +80 +80 +80 +80 +00 +80 +80 +80 +80 +00 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2507 +ENCODING 9479 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 15 3 -2 +BITMAP +E0 +E0 +E0 +E0 +00 +E0 +E0 +E0 +E0 +00 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2508 +ENCODING 9480 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 1 0 6 +BITMAP +AB +ENDCHAR +STARTCHAR uni2509 +ENCODING 9481 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 3 0 5 +BITMAP +AB +AB +AB +ENDCHAR +STARTCHAR uni250A +ENCODING 9482 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 15 4 -2 +BITMAP +80 +80 +80 +00 +80 +80 +80 +00 +80 +80 +80 +00 +80 +80 +80 +ENDCHAR +STARTCHAR uni250B +ENCODING 9483 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 15 3 -2 +BITMAP +E0 +E0 +E0 +00 +E0 +E0 +E0 +00 +E0 +E0 +E0 +00 +E0 +E0 +E0 +ENDCHAR +STARTCHAR SF010000 +ENCODING 9484 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 9 4 -3 +BITMAP +F8 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni250D +ENCODING 9485 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 10 4 -3 +BITMAP +F8 +F8 +F8 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni250E +ENCODING 9486 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 3 -3 +BITMAP +FC +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni250F +ENCODING 9487 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 3 -3 +BITMAP +FC +FC +FC +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR SF030000 +ENCODING 9488 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 9 0 -3 +BITMAP +F8 +08 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni2511 +ENCODING 9489 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 10 0 -3 +BITMAP +F8 +F8 +F8 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni2512 +ENCODING 9490 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 0 -3 +BITMAP +FC +1C +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR uni2513 +ENCODING 9491 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 0 -3 +BITMAP +FC +FC +FC +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR SF020000 +ENCODING 9492 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 8 4 5 +BITMAP +80 +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni2515 +ENCODING 9493 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 9 4 4 +BITMAP +80 +80 +80 +80 +80 +80 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni2516 +ENCODING 9494 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 3 5 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +FC +ENDCHAR +STARTCHAR uni2517 +ENCODING 9495 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 3 4 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +FC +FC +FC +ENDCHAR +STARTCHAR SF040000 +ENCODING 9496 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 8 0 5 +BITMAP +08 +08 +08 +08 +08 +08 +08 +F8 +ENDCHAR +STARTCHAR uni2519 +ENCODING 9497 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 9 0 4 +BITMAP +08 +08 +08 +08 +08 +08 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni251A +ENCODING 9498 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 0 5 +BITMAP +1C +1C +1C +1C +1C +1C +1C +FC +ENDCHAR +STARTCHAR uni251B +ENCODING 9499 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 0 4 +BITMAP +1C +1C +1C +1C +1C +1C +FC +FC +FC +ENDCHAR +STARTCHAR SF080000 +ENCODING 9500 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 16 4 -3 +BITMAP +80 +80 +80 +80 +80 +80 +80 +F8 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni251D +ENCODING 9501 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 16 4 -3 +BITMAP +80 +80 +80 +80 +80 +80 +F8 +F8 +F8 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni251E +ENCODING 9502 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 3 -3 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +FC +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni251F +ENCODING 9503 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 3 -3 +BITMAP +40 +40 +40 +40 +40 +40 +40 +FC +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2520 +ENCODING 9504 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 3 -3 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +FC +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2521 +ENCODING 9505 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 3 -3 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +FC +FC +FC +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni2522 +ENCODING 9506 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 3 -3 +BITMAP +40 +40 +40 +40 +40 +40 +FC +FC +FC +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2523 +ENCODING 9507 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 3 -3 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +FC +FC +FC +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR SF090000 +ENCODING 9508 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 16 0 -3 +BITMAP +08 +08 +08 +08 +08 +08 +08 +F8 +08 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni2525 +ENCODING 9509 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 16 0 -3 +BITMAP +08 +08 +08 +08 +08 +08 +F8 +F8 +F8 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni2526 +ENCODING 9510 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 0 -3 +BITMAP +1C +1C +1C +1C +1C +1C +1C +FC +08 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni2527 +ENCODING 9511 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 0 -3 +BITMAP +08 +08 +08 +08 +08 +08 +08 +FC +1C +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR uni2528 +ENCODING 9512 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 0 -3 +BITMAP +1C +1C +1C +1C +1C +1C +1C +FC +1C +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR uni2529 +ENCODING 9513 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 0 -3 +BITMAP +1C +1C +1C +1C +1C +1C +FC +FC +FC +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni252A +ENCODING 9514 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 0 -3 +BITMAP +08 +08 +08 +08 +08 +08 +FC +FC +FC +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR uni252B +ENCODING 9515 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 0 -3 +BITMAP +1C +1C +1C +1C +1C +1C +FC +FC +FC +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR SF060000 +ENCODING 9516 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 -3 +BITMAP +FF80 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR uni252D +ENCODING 9517 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 10 0 -3 +BITMAP +F800 +FF80 +F800 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR uni252E +ENCODING 9518 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 10 0 -3 +BITMAP +0F80 +FF80 +0F80 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR uni252F +ENCODING 9519 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 10 0 -3 +BITMAP +FF80 +FF80 +FF80 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR uni2530 +ENCODING 9520 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 -3 +BITMAP +FF80 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR uni2531 +ENCODING 9521 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 10 0 -3 +BITMAP +FC00 +FF80 +FC00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR uni2532 +ENCODING 9522 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 10 0 -3 +BITMAP +1F80 +FF80 +1F80 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR uni2533 +ENCODING 9523 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 10 0 -3 +BITMAP +FF80 +FF80 +FF80 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR SF070000 +ENCODING 9524 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 8 0 5 +BITMAP +0800 +0800 +0800 +0800 +0800 +0800 +0800 +FF80 +ENDCHAR +STARTCHAR uni2535 +ENCODING 9525 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 4 +BITMAP +0800 +0800 +0800 +0800 +0800 +0800 +F800 +FF80 +F800 +ENDCHAR +STARTCHAR uni2536 +ENCODING 9526 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 4 +BITMAP +0800 +0800 +0800 +0800 +0800 +0800 +0F80 +FF80 +0F80 +ENDCHAR +STARTCHAR uni2537 +ENCODING 9527 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 4 +BITMAP +0800 +0800 +0800 +0800 +0800 +0800 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR uni2538 +ENCODING 9528 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 8 0 5 +BITMAP +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +FF80 +ENDCHAR +STARTCHAR uni2539 +ENCODING 9529 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 4 +BITMAP +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +FC00 +FF80 +FC00 +ENDCHAR +STARTCHAR uni253A +ENCODING 9530 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 4 +BITMAP +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1F80 +FF80 +1F80 +ENDCHAR +STARTCHAR uni253B +ENCODING 9531 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 4 +BITMAP +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR SF050000 +ENCODING 9532 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +0800 +0800 +0800 +0800 +0800 +0800 +0800 +FF80 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR uni253D +ENCODING 9533 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +0800 +0800 +0800 +0800 +0800 +0800 +F800 +FF80 +F800 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR uni253E +ENCODING 9534 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +0800 +0800 +0800 +0800 +0800 +0800 +0F80 +FF80 +0F80 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR uni253F +ENCODING 9535 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +0800 +0800 +0800 +0800 +0800 +0800 +FF80 +FF80 +FF80 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR uni2540 +ENCODING 9536 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +FF80 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR uni2541 +ENCODING 9537 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +0800 +0800 +0800 +0800 +0800 +0800 +0800 +FF80 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR uni2542 +ENCODING 9538 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +FF80 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR uni2543 +ENCODING 9539 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +FC00 +FF80 +FC00 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR uni2544 +ENCODING 9540 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1F80 +FF80 +1F80 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR uni2545 +ENCODING 9541 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +0800 +0800 +0800 +0800 +0800 +0800 +FC00 +FF80 +FC00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR uni2546 +ENCODING 9542 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +0800 +0800 +0800 +0800 +0800 +0800 +1F80 +FF80 +1F80 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR uni2547 +ENCODING 9543 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +FF80 +FF80 +FF80 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR uni2548 +ENCODING 9544 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +0800 +0800 +0800 +0800 +0800 +0800 +FF80 +FF80 +FF80 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR uni2549 +ENCODING 9545 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +FC00 +FF80 +FC00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR uni254A +ENCODING 9546 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1F80 +FF80 +1F80 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR uni254B +ENCODING 9547 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +FF80 +FF80 +FF80 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR uni254C +ENCODING 9548 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 1 0 5 +BITMAP +EF +ENDCHAR +STARTCHAR uni254D +ENCODING 9549 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 3 0 4 +BITMAP +EF +EF +EF +ENDCHAR +STARTCHAR uni254E +ENCODING 9550 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 15 4 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +00 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni254F +ENCODING 9551 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 15 3 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +00 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR SF430000 +ENCODING 9552 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 3 0 4 +BITMAP +FF80 +0000 +FF80 +ENDCHAR +STARTCHAR SF240000 +ENCODING 9553 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 16 3 -3 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF510000 +ENCODING 9554 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 10 4 -3 +BITMAP +F8 +80 +F8 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR SF520000 +ENCODING 9555 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 3 -3 +BITMAP +FC +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF390000 +ENCODING 9556 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 3 -3 +BITMAP +FC +80 +BC +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF220000 +ENCODING 9557 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 10 0 -3 +BITMAP +F8 +08 +F8 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR SF210000 +ENCODING 9558 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 0 -3 +BITMAP +FC +14 +14 +14 +14 +14 +14 +14 +14 +ENDCHAR +STARTCHAR SF250000 +ENCODING 9559 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 0 -3 +BITMAP +FC +04 +F4 +14 +14 +14 +14 +14 +14 +14 +ENDCHAR +STARTCHAR SF500000 +ENCODING 9560 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 9 4 4 +BITMAP +80 +80 +80 +80 +80 +80 +F8 +80 +F8 +ENDCHAR +STARTCHAR SF490000 +ENCODING 9561 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 3 5 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +FC +ENDCHAR +STARTCHAR SF380000 +ENCODING 9562 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 3 4 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +BC +80 +FC +ENDCHAR +STARTCHAR SF280000 +ENCODING 9563 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 9 0 4 +BITMAP +08 +08 +08 +08 +08 +08 +F8 +08 +F8 +ENDCHAR +STARTCHAR SF270000 +ENCODING 9564 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 0 5 +BITMAP +14 +14 +14 +14 +14 +14 +14 +FC +ENDCHAR +STARTCHAR SF260000 +ENCODING 9565 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 0 4 +BITMAP +14 +14 +14 +14 +14 +14 +F4 +04 +FC +ENDCHAR +STARTCHAR SF360000 +ENCODING 9566 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 16 4 -3 +BITMAP +80 +80 +80 +80 +80 +80 +F8 +80 +F8 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR SF370000 +ENCODING 9567 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 3 -3 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +BC +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF420000 +ENCODING 9568 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 3 -3 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +BC +80 +BC +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF190000 +ENCODING 9569 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 16 0 -3 +BITMAP +08 +08 +08 +08 +08 +08 +F8 +08 +F8 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR SF200000 +ENCODING 9570 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 0 -3 +BITMAP +14 +14 +14 +14 +14 +14 +14 +F4 +14 +14 +14 +14 +14 +14 +14 +14 +ENDCHAR +STARTCHAR SF230000 +ENCODING 9571 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 0 -3 +BITMAP +14 +14 +14 +14 +14 +14 +F4 +04 +F4 +14 +14 +14 +14 +04 +14 +14 +ENDCHAR +STARTCHAR SF470000 +ENCODING 9572 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 10 0 -3 +BITMAP +FF80 +0000 +FF80 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR SF480000 +ENCODING 9573 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 -3 +BITMAP +FF80 +1400 +1400 +1400 +1400 +1400 +1400 +1400 +1400 +ENDCHAR +STARTCHAR SF410000 +ENCODING 9574 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 10 0 -3 +BITMAP +FF80 +0000 +F780 +1400 +1400 +1400 +1400 +1400 +1400 +1400 +ENDCHAR +STARTCHAR SF450000 +ENCODING 9575 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 4 +BITMAP +0800 +0800 +0800 +0800 +0800 +0800 +FF80 +0000 +FF80 +ENDCHAR +STARTCHAR SF460000 +ENCODING 9576 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 8 0 5 +BITMAP +1400 +1400 +1400 +1400 +1400 +1400 +1400 +FF80 +ENDCHAR +STARTCHAR SF400000 +ENCODING 9577 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 4 +BITMAP +1400 +1400 +1400 +1400 +1400 +1400 +F780 +0000 +FF80 +ENDCHAR +STARTCHAR SF540000 +ENCODING 9578 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +0800 +0800 +0800 +0800 +0800 +0800 +FF80 +0000 +FF80 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR SF530000 +ENCODING 9579 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +1400 +1400 +1400 +1400 +1400 +1400 +1400 +F780 +1400 +1400 +1400 +1400 +1400 +1400 +1400 +1400 +ENDCHAR +STARTCHAR SF440000 +ENCODING 9580 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +1400 +1400 +1400 +1400 +1400 +1400 +F780 +0000 +F780 +1400 +1400 +1400 +1400 +1400 +1400 +1400 +ENDCHAR +STARTCHAR uni256D +ENCODING 9581 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 9 4 -3 +BITMAP +38 +40 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni256E +ENCODING 9582 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 9 0 -3 +BITMAP +E0 +10 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni256F +ENCODING 9583 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 8 0 5 +BITMAP +08 +08 +08 +08 +08 +08 +10 +E0 +ENDCHAR +STARTCHAR uni2570 +ENCODING 9584 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 8 4 5 +BITMAP +80 +80 +80 +80 +80 +80 +40 +38 +ENDCHAR +STARTCHAR uni2571 +ENCODING 9585 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +0080 +0080 +0100 +0100 +0200 +0400 +0400 +0800 +0800 +1000 +1000 +2000 +4000 +4000 +8000 +8000 +ENDCHAR +STARTCHAR uni2572 +ENCODING 9586 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +8000 +8000 +4000 +4000 +2000 +1000 +1000 +0800 +0800 +0400 +0400 +0200 +0100 +0100 +0080 +0080 +ENDCHAR +STARTCHAR uni2573 +ENCODING 9587 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +8080 +8080 +4100 +4100 +2200 +1400 +1400 +0800 +0800 +1400 +1400 +2200 +4100 +4100 +8080 +8080 +ENDCHAR +STARTCHAR uni2574 +ENCODING 9588 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 1 0 5 +BITMAP +F8 +ENDCHAR +STARTCHAR uni2575 +ENCODING 9589 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 8 4 5 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2576 +ENCODING 9590 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 1 4 5 +BITMAP +F8 +ENDCHAR +STARTCHAR uni2577 +ENCODING 9591 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 9 4 -3 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2578 +ENCODING 9592 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 3 0 4 +BITMAP +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni2579 +ENCODING 9593 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 8 3 5 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni257A +ENCODING 9594 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 3 4 4 +BITMAP +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni257B +ENCODING 9595 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 9 3 -3 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni257C +ENCODING 9596 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 3 0 4 +BITMAP +0F80 +FF80 +0F80 +ENDCHAR +STARTCHAR uni257D +ENCODING 9597 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 16 3 -3 +BITMAP +40 +40 +40 +40 +40 +40 +40 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni257E +ENCODING 9598 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 3 0 4 +BITMAP +F800 +FF80 +F800 +ENDCHAR +STARTCHAR uni257F +ENCODING 9599 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 16 3 -3 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR upblock +ENCODING 9600 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 8 0 5 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR uni2581 +ENCODING 9601 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 2 0 -3 +BITMAP +FF80 +FF80 +ENDCHAR +STARTCHAR uni2582 +ENCODING 9602 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 4 0 -3 +BITMAP +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR uni2583 +ENCODING 9603 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 6 0 -3 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR dnblock +ENCODING 9604 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 8 0 -3 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR uni2585 +ENCODING 9605 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 10 0 -3 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR uni2586 +ENCODING 9606 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 12 0 -3 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR uni2587 +ENCODING 9607 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 14 0 -3 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR block +ENCODING 9608 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR uni2589 +ENCODING 9609 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +ENDCHAR +STARTCHAR uni258A +ENCODING 9610 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 16 0 -3 +BITMAP +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +ENDCHAR +STARTCHAR uni258B +ENCODING 9611 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 0 -3 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR lfblock +ENCODING 9612 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 16 0 -3 +BITMAP +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni258D +ENCODING 9613 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 16 0 -3 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni258E +ENCODING 9614 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 16 0 -3 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni258F +ENCODING 9615 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 16 0 -3 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR rtblock +ENCODING 9616 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 16 4 -3 +BITMAP +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR ltshade +ENCODING 9617 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +C3 +18 +C3 +18 +C3 +18 +C3 +18 +C3 +18 +C3 +18 +C3 +18 +C3 +18 +ENDCHAR +STARTCHAR shade +ENCODING 9618 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +DB00 +2480 +DB00 +2480 +DB00 +2480 +DB00 +2480 +DB00 +2480 +DB00 +2480 +DB00 +2480 +DB00 +2480 +ENDCHAR +STARTCHAR dkshade +ENCODING 9619 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +3C80 +E780 +3C80 +E780 +3C80 +E780 +3C80 +E780 +3C80 +E780 +3C80 +E780 +3C80 +E780 +3C80 +E780 +ENDCHAR +STARTCHAR uni2594 +ENCODING 9620 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 2 0 11 +BITMAP +FF80 +FF80 +ENDCHAR +STARTCHAR uni2595 +ENCODING 9621 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 16 7 -3 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2596 +ENCODING 9622 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 8 0 -3 +BITMAP +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni2597 +ENCODING 9623 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 8 4 -3 +BITMAP +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni2598 +ENCODING 9624 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 8 0 5 +BITMAP +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni2599 +ENCODING 9625 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR uni259A +ENCODING 9626 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR uni259B +ENCODING 9627 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +ENDCHAR +STARTCHAR uni259C +ENCODING 9628 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR uni259D +ENCODING 9629 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 8 4 5 +BITMAP +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni259E +ENCODING 9630 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +ENDCHAR +STARTCHAR uni259F +ENCODING 9631 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR filledbox +ENCODING 9632 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +FE +FE +FE +FE +FE +FE +ENDCHAR +STARTCHAR H22073 +ENCODING 9633 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +82 +82 +82 +82 +82 +FE +ENDCHAR +STARTCHAR uni25A2 +ENCODING 9634 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +7C +82 +82 +82 +82 +82 +7C +ENDCHAR +STARTCHAR uni25A3 +ENCODING 9635 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +82 +BA +BA +BA +82 +FE +ENDCHAR +STARTCHAR uni25A4 +ENCODING 9636 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +82 +FE +82 +FE +82 +FE +ENDCHAR +STARTCHAR uni25A5 +ENCODING 9637 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +AA +AA +AA +AA +AA +FE +ENDCHAR +STARTCHAR uni25A6 +ENCODING 9638 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +AA +FE +AA +FE +AA +FE +ENDCHAR +STARTCHAR uni25A7 +ENCODING 9639 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +CA +A6 +92 +CA +A6 +FE +ENDCHAR +STARTCHAR uni25A8 +ENCODING 9640 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +A6 +CA +92 +A6 +CA +FE +ENDCHAR +STARTCHAR uni25A9 +ENCODING 9641 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +D6 +AA +D6 +AA +D6 +FE +ENDCHAR +STARTCHAR H18543 +ENCODING 9642 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 5 5 1 1 +BITMAP +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR H18551 +ENCODING 9643 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 5 5 1 1 +BITMAP +F8 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR filledrect +ENCODING 9644 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 5 0 1 +BITMAP +FE +FE +FE +FE +FE +ENDCHAR +STARTCHAR uni25AD +ENCODING 9645 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 5 0 1 +BITMAP +FE +82 +82 +82 +FE +ENDCHAR +STARTCHAR uni25AE +ENCODING 9646 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 5 7 1 0 +BITMAP +F8 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni25AF +ENCODING 9647 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 5 7 1 0 +BITMAP +F8 +88 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni25B0 +ENCODING 9648 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 5 0 1 +BITMAP +3F +3E +7E +7C +FC +ENDCHAR +STARTCHAR uni25B1 +ENCODING 9649 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 5 0 1 +BITMAP +3F +22 +42 +44 +FC +ENDCHAR +STARTCHAR triagup +ENCODING 9650 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +10 +10 +38 +38 +7C +7C +FE +FE +ENDCHAR +STARTCHAR uni25B3 +ENCODING 9651 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +10 +10 +28 +28 +44 +44 +82 +FE +ENDCHAR +STARTCHAR uni25B4 +ENCODING 9652 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 5 6 1 1 +BITMAP +20 +20 +70 +70 +F8 +F8 +ENDCHAR +STARTCHAR uni25B5 +ENCODING 9653 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 5 6 1 1 +BITMAP +20 +20 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni25B6 +ENCODING 9654 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 7 0 0 +BITMAP +C0 +F0 +FC +FF +FC +F0 +C0 +ENDCHAR +STARTCHAR uni25B7 +ENCODING 9655 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 7 0 0 +BITMAP +C0 +B0 +8C +83 +8C +B0 +C0 +ENDCHAR +STARTCHAR uni25B8 +ENCODING 9656 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 6 5 1 1 +BITMAP +C0 +F0 +FC +F0 +C0 +ENDCHAR +STARTCHAR uni25B9 +ENCODING 9657 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 6 5 1 1 +BITMAP +C0 +B0 +8C +B0 +C0 +ENDCHAR +STARTCHAR triagrt +ENCODING 9658 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 5 0 1 +BITMAP +E0 +FC +FF +FC +E0 +ENDCHAR +STARTCHAR uni25BB +ENCODING 9659 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 5 0 1 +BITMAP +E0 +9C +83 +9C +E0 +ENDCHAR +STARTCHAR triagdn +ENCODING 9660 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +FE +FE +7C +7C +38 +38 +10 +10 +ENDCHAR +STARTCHAR uni25BD +ENCODING 9661 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +FE +82 +44 +44 +28 +28 +10 +10 +ENDCHAR +STARTCHAR uni25BE +ENCODING 9662 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 5 6 1 1 +BITMAP +F8 +F8 +70 +70 +20 +20 +ENDCHAR +STARTCHAR uni25BF +ENCODING 9663 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 5 6 1 1 +BITMAP +F8 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni25C0 +ENCODING 9664 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 7 0 0 +BITMAP +03 +0F +3F +FF +3F +0F +03 +ENDCHAR +STARTCHAR uni25C1 +ENCODING 9665 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 7 0 0 +BITMAP +03 +0D +31 +C1 +31 +0D +03 +ENDCHAR +STARTCHAR uni25C2 +ENCODING 9666 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 6 5 1 1 +BITMAP +0C +3C +FC +3C +0C +ENDCHAR +STARTCHAR uni25C3 +ENCODING 9667 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 6 5 1 1 +BITMAP +0C +34 +C4 +34 +0C +ENDCHAR +STARTCHAR triaglf +ENCODING 9668 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 5 0 1 +BITMAP +07 +3F +FF +3F +07 +ENDCHAR +STARTCHAR uni25C5 +ENCODING 9669 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 5 0 1 +BITMAP +07 +39 +C1 +39 +07 +ENDCHAR +STARTCHAR uni25C6 +ENCODING 9670 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +10 +38 +7C +FE +7C +38 +10 +ENDCHAR +STARTCHAR uni25C7 +ENCODING 9671 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +10 +28 +44 +82 +44 +28 +10 +ENDCHAR +STARTCHAR uni25C8 +ENCODING 9672 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +10 +28 +54 +BA +54 +28 +10 +ENDCHAR +STARTCHAR uni25C9 +ENCODING 9673 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +38 +44 +BA +BA +BA +44 +38 +ENDCHAR +STARTCHAR lozenge +ENCODING 9674 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 5 10 1 0 +BITMAP +20 +20 +50 +50 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR circle +ENCODING 9675 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +38 +44 +82 +82 +82 +44 +38 +ENDCHAR +STARTCHAR uni25CC +ENCODING 9676 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +10 +44 +00 +82 +00 +44 +10 +ENDCHAR +STARTCHAR uni25CD +ENCODING 9677 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +38 +6C +AA +AA +AA +6C +38 +ENDCHAR +STARTCHAR uni25CE +ENCODING 9678 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +38 +44 +92 +AA +92 +44 +38 +ENDCHAR +STARTCHAR H18533 +ENCODING 9679 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +38 +7C +FE +FE +FE +7C +38 +ENDCHAR +STARTCHAR uni25D0 +ENCODING 9680 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +38 +64 +E2 +E2 +E2 +64 +38 +ENDCHAR +STARTCHAR uni25D1 +ENCODING 9681 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +38 +4C +8E +8E +8E +4C +38 +ENDCHAR +STARTCHAR uni25D2 +ENCODING 9682 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +38 +44 +82 +82 +FE +7C +38 +ENDCHAR +STARTCHAR uni25D3 +ENCODING 9683 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +38 +7C +FE +82 +82 +44 +38 +ENDCHAR +STARTCHAR uni25D4 +ENCODING 9684 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +38 +5C +9E +9E +82 +44 +38 +ENDCHAR +STARTCHAR uni25D5 +ENCODING 9685 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +38 +4C +8E +8E +FE +7C +38 +ENDCHAR +STARTCHAR uni25D6 +ENCODING 9686 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 4 7 0 0 +BITMAP +30 +70 +F0 +F0 +F0 +70 +30 +ENDCHAR +STARTCHAR uni25D7 +ENCODING 9687 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 4 7 3 0 +BITMAP +C0 +E0 +F0 +F0 +F0 +E0 +C0 +ENDCHAR +STARTCHAR invbullet +ENCODING 9688 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 6 8 1 1 +BITMAP +FC +FC +CC +84 +84 +CC +FC +FC +ENDCHAR +STARTCHAR uni25DC +ENCODING 9692 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 4 4 0 3 +BITMAP +30 +40 +80 +80 +ENDCHAR +STARTCHAR uni25DD +ENCODING 9693 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 4 4 3 3 +BITMAP +C0 +20 +10 +10 +ENDCHAR +STARTCHAR uni25DE +ENCODING 9694 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 4 4 3 0 +BITMAP +10 +10 +20 +C0 +ENDCHAR +STARTCHAR uni25DF +ENCODING 9695 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 4 4 0 0 +BITMAP +80 +80 +40 +30 +ENDCHAR +STARTCHAR uni25E0 +ENCODING 9696 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 4 0 3 +BITMAP +38 +44 +82 +82 +ENDCHAR +STARTCHAR uni25E1 +ENCODING 9697 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 4 0 0 +BITMAP +82 +82 +44 +38 +ENDCHAR +STARTCHAR uni25E2 +ENCODING 9698 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +02 +06 +0E +1E +3E +7E +FE +ENDCHAR +STARTCHAR uni25E3 +ENCODING 9699 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +80 +C0 +E0 +F0 +F8 +FC +FE +ENDCHAR +STARTCHAR uni25E4 +ENCODING 9700 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +FC +F8 +F0 +E0 +C0 +80 +ENDCHAR +STARTCHAR uni25E5 +ENCODING 9701 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +7E +3E +1E +0E +06 +02 +ENDCHAR +STARTCHAR openbullet +ENCODING 9702 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 4 4 2 3 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni25E7 +ENCODING 9703 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +E2 +E2 +E2 +E2 +E2 +FE +ENDCHAR +STARTCHAR uni25E8 +ENCODING 9704 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +8E +8E +8E +8E +8E +FE +ENDCHAR +STARTCHAR uni25E9 +ENCODING 9705 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +FE +FA +F2 +E2 +C2 +FE +ENDCHAR +STARTCHAR uni25EA +ENCODING 9706 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +86 +8E +9E +BE +FE +FE +ENDCHAR +STARTCHAR uni25EB +ENCODING 9707 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +92 +92 +92 +92 +92 +FE +ENDCHAR +STARTCHAR uni25EC +ENCODING 9708 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +10 +10 +28 +28 +44 +54 +82 +FE +ENDCHAR +STARTCHAR uni25ED +ENCODING 9709 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +10 +10 +28 +28 +64 +64 +E2 +FE +ENDCHAR +STARTCHAR uni25EE +ENCODING 9710 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +10 +10 +28 +28 +4C +4C +8E +FE +ENDCHAR +STARTCHAR uni25EF +ENCODING 9711 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +3E00 +4100 +8080 +8080 +8080 +8080 +8080 +4100 +3E00 +ENDCHAR +STARTCHAR uni25F0 +ENCODING 9712 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +92 +92 +F2 +82 +82 +FE +ENDCHAR +STARTCHAR uni25F1 +ENCODING 9713 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +82 +82 +F2 +92 +92 +FE +ENDCHAR +STARTCHAR uni25F2 +ENCODING 9714 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +82 +82 +9E +92 +92 +FE +ENDCHAR +STARTCHAR uni25F3 +ENCODING 9715 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +92 +92 +9E +82 +82 +FE +ENDCHAR +STARTCHAR uni25F4 +ENCODING 9716 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +38 +54 +92 +F2 +82 +44 +38 +ENDCHAR +STARTCHAR uni25F5 +ENCODING 9717 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +38 +44 +82 +F2 +92 +54 +38 +ENDCHAR +STARTCHAR uni25F6 +ENCODING 9718 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +38 +44 +82 +9E +92 +54 +38 +ENDCHAR +STARTCHAR uni25F7 +ENCODING 9719 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +38 +54 +92 +9E +82 +44 +38 +ENDCHAR +STARTCHAR uni25F8 +ENCODING 9720 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +84 +88 +90 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni25F9 +ENCODING 9721 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +42 +22 +12 +0A +06 +02 +ENDCHAR +STARTCHAR uni25FA +ENCODING 9722 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +80 +C0 +A0 +90 +88 +84 +FE +ENDCHAR +STARTCHAR uni25FB +ENCODING 9723 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 6 6 1 2 +BITMAP +FC +84 +84 +84 +84 +FC +ENDCHAR +STARTCHAR uni25FC +ENCODING 9724 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 6 6 1 2 +BITMAP +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni25FD +ENCODING 9725 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 5 5 1 1 +BITMAP +F8 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni25FE +ENCODING 9726 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 5 5 1 1 +BITMAP +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni25FF +ENCODING 9727 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +02 +06 +0A +12 +22 +42 +FE +ENDCHAR +STARTCHAR uni2600 +ENCODING 9728 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 9 9 0 1 +BITMAP +0800 +4900 +2A00 +1C00 +FF80 +1C00 +2A00 +4900 +0800 +ENDCHAR +STARTCHAR uni2602 +ENCODING 9730 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 9 11 0 0 +BITMAP +0800 +3E00 +7F00 +FF80 +FF80 +0800 +0800 +0800 +0800 +4800 +3000 +ENDCHAR +STARTCHAR uni2605 +ENCODING 9733 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 9 10 0 1 +BITMAP +0800 +0800 +1C00 +1C00 +FF80 +7F00 +3E00 +3E00 +7700 +6300 +ENDCHAR +STARTCHAR uni2606 +ENCODING 9734 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 9 10 0 1 +BITMAP +0800 +0800 +1400 +1400 +E380 +4100 +2200 +2A00 +5500 +6300 +ENDCHAR +STARTCHAR uni2609 +ENCODING 9737 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 8 0 2 +BITMAP +3C +42 +81 +99 +99 +81 +42 +3C +ENDCHAR +STARTCHAR uni260A +ENCODING 9738 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 8 10 0 1 +BITMAP +3C +42 +81 +81 +81 +81 +42 +A5 +A5 +42 +ENDCHAR +STARTCHAR uni260B +ENCODING 9739 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 8 10 0 1 +BITMAP +42 +A5 +A5 +42 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR uni260C +ENCODING 9740 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +01 +3A +44 +82 +82 +82 +44 +38 +ENDCHAR +STARTCHAR uni260D +ENCODING 9741 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +0E +11 +11 +11 +0E +08 +18 +10 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni260E +ENCODING 9742 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +3C +7E +E7 +DB +3C +7E +66 +C3 +C3 +E7 +FF +ENDCHAR +STARTCHAR uni260F +ENCODING 9743 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +3C +5A +A5 +DB +24 +42 +5A +BD +BD +99 +FF +ENDCHAR +STARTCHAR uni2610 +ENCODING 9744 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 9 9 0 1 +BITMAP +FF80 +8080 +8080 +8080 +8080 +8080 +8080 +8080 +FF80 +ENDCHAR +STARTCHAR uni2611 +ENCODING 9745 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 9 0 1 +BITMAP +FF80 +8080 +8280 +8480 +A880 +9080 +9080 +8080 +FF80 +ENDCHAR +STARTCHAR uni2612 +ENCODING 9746 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 9 9 0 1 +BITMAP +FF80 +8080 +A280 +9480 +8880 +9480 +A280 +8080 +FF80 +ENDCHAR +STARTCHAR uni262A +ENCODING 9770 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +0E +30 +60 +C0 +C4 +CE +C4 +C0 +60 +30 +0E +ENDCHAR +STARTCHAR uni262F +ENCODING 9775 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 1 +BITMAP +3E00 +4100 +8480 +B080 +F980 +FF80 +EF80 +7F00 +3E00 +ENDCHAR +STARTCHAR uni2630 +ENCODING 9776 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 9 1 1 +BITMAP +FE +00 +00 +00 +FE +00 +00 +00 +FE +ENDCHAR +STARTCHAR uni2631 +ENCODING 9777 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 9 1 1 +BITMAP +EE +00 +00 +00 +FE +00 +00 +00 +FE +ENDCHAR +STARTCHAR uni2632 +ENCODING 9778 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 9 1 1 +BITMAP +FE +00 +00 +00 +EE +00 +00 +00 +FE +ENDCHAR +STARTCHAR uni2633 +ENCODING 9779 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 9 1 1 +BITMAP +EE +00 +00 +00 +EE +00 +00 +00 +FE +ENDCHAR +STARTCHAR uni2634 +ENCODING 9780 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 9 1 1 +BITMAP +FE +00 +00 +00 +FE +00 +00 +00 +EE +ENDCHAR +STARTCHAR uni2635 +ENCODING 9781 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 9 1 1 +BITMAP +EE +00 +00 +00 +FE +00 +00 +00 +EE +ENDCHAR +STARTCHAR uni2636 +ENCODING 9782 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 9 1 1 +BITMAP +FE +00 +00 +00 +EE +00 +00 +00 +EE +ENDCHAR +STARTCHAR uni2637 +ENCODING 9783 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 9 1 1 +BITMAP +EE +00 +00 +00 +EE +00 +00 +00 +EE +ENDCHAR +STARTCHAR uni2639 +ENCODING 9785 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 11 0 0 +BITMAP +3E00 +4100 +8080 +A280 +8080 +8080 +9C80 +A280 +8080 +4100 +3E00 +ENDCHAR +STARTCHAR smileface +ENCODING 9786 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 11 0 0 +BITMAP +3E00 +4100 +8080 +A280 +8080 +8080 +A280 +9C80 +8080 +4100 +3E00 +ENDCHAR +STARTCHAR invsmileface +ENCODING 9787 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 11 0 0 +BITMAP +3E00 +7F00 +FF80 +DD80 +FF80 +FF80 +DD80 +E380 +FF80 +7F00 +3E00 +ENDCHAR +STARTCHAR sun +ENCODING 9788 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 9 0 1 +BITMAP +0800 +4900 +2A00 +1400 +E380 +1400 +2A00 +4900 +0800 +ENDCHAR +STARTCHAR uni263D +ENCODING 9789 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +E0 +50 +28 +14 +14 +14 +14 +14 +28 +50 +E0 +ENDCHAR +STARTCHAR uni263E +ENCODING 9790 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +1C +28 +50 +A0 +A0 +A0 +A0 +A0 +50 +28 +1C +ENDCHAR +STARTCHAR uni263F +ENCODING 9791 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 7 15 1 -2 +BITMAP +82 +82 +44 +38 +44 +82 +82 +82 +44 +38 +10 +10 +7C +10 +10 +ENDCHAR +STARTCHAR female +ENCODING 9792 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 12 1 -2 +BITMAP +38 +44 +82 +82 +82 +44 +38 +10 +10 +7C +10 +10 +ENDCHAR +STARTCHAR uni2641 +ENCODING 9793 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +10 +10 +7C +10 +10 +38 +44 +82 +82 +82 +44 +38 +ENDCHAR +STARTCHAR male +ENCODING 9794 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +0380 +0180 +3A80 +4400 +8200 +8200 +8200 +4400 +3800 +ENDCHAR +STARTCHAR uni2643 +ENCODING 9795 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +01 +71 +89 +05 +05 +05 +09 +FF +01 +01 +01 +ENDCHAR +STARTCHAR uni2644 +ENCODING 9796 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +40 +40 +E0 +40 +5C +62 +41 +41 +41 +42 +42 +ENDCHAR +STARTCHAR uni2645 +ENCODING 9797 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 13 0 -1 +BITMAP +C980 +4900 +4900 +7F00 +4900 +4900 +C980 +0800 +1C00 +2200 +2200 +2200 +1C00 +ENDCHAR +STARTCHAR uni2646 +ENCODING 9798 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 13 0 0 +BITMAP +0800 +1C00 +4900 +EB80 +4900 +4900 +4900 +4900 +2A00 +1C00 +0800 +1C00 +0800 +ENDCHAR +STARTCHAR uni2647 +ENCODING 9799 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +F0 +88 +84 +84 +84 +88 +F0 +80 +80 +80 +FC +ENDCHAR +STARTCHAR uni2648 +ENCODING 9800 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 11 0 0 +BITMAP +4100 +A280 +A280 +1400 +1400 +1400 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR uni2649 +ENCODING 9801 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 9 11 0 0 +BITMAP +8080 +4100 +4100 +2200 +1C00 +2200 +4100 +4100 +4100 +2200 +1C00 +ENDCHAR +STARTCHAR uni264A +ENCODING 9802 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +81 +7E +24 +24 +24 +24 +24 +24 +24 +7E +81 +ENDCHAR +STARTCHAR uni264B +ENCODING 9803 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +63 +90 +90 +66 +09 +09 +C6 +3C +ENDCHAR +STARTCHAR uni264C +ENCODING 9804 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 11 0 0 +BITMAP +3C00 +4200 +4200 +4200 +2200 +6400 +9400 +9400 +6400 +0480 +0300 +ENDCHAR +STARTCHAR uni264D +ENCODING 9805 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 13 0 -3 +BITMAP +A8 +54 +56 +55 +55 +55 +55 +55 +55 +55 +03 +0D +01 +ENDCHAR +STARTCHAR uni264E +ENCODING 9806 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 8 0 1 +BITMAP +3C +42 +42 +42 +24 +E7 +00 +FF +ENDCHAR +STARTCHAR uni264F +ENCODING 9807 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 11 0 -1 +BITMAP +A800 +5400 +5400 +5400 +5400 +5400 +5400 +5400 +5400 +5480 +0300 +ENDCHAR +STARTCHAR uni2650 +ENCODING 9808 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 8 0 2 +BITMAP +1F +03 +05 +89 +51 +20 +50 +88 +ENDCHAR +STARTCHAR uni2651 +ENCODING 9809 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +A0 +50 +50 +50 +56 +59 +09 +16 +10 +10 +60 +ENDCHAR +STARTCHAR uni2652 +ENCODING 9810 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 9 0 1 +BITMAP +54 +55 +AA +2A +00 +54 +55 +AA +2A +ENDCHAR +STARTCHAR uni2653 +ENCODING 9811 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +81 +42 +42 +24 +24 +FF +24 +24 +42 +42 +81 +ENDCHAR +STARTCHAR uni2654 +ENCODING 9812 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +10 +38 +10 +6C +92 +92 +92 +92 +54 +7C +82 +82 +FE +ENDCHAR +STARTCHAR uni2655 +ENCODING 9813 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 9 11 0 0 +BITMAP +AA80 +AA80 +5500 +5500 +2200 +2200 +1400 +3E00 +4100 +4100 +7F00 +ENDCHAR +STARTCHAR uni2656 +ENCODING 9814 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +D6 +AA +FE +44 +7C +44 +44 +44 +44 +7C +82 +82 +FE +ENDCHAR +STARTCHAR uni2657 +ENCODING 9815 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +38 +44 +92 +BA +92 +44 +7C +44 +44 +82 +82 +FE +ENDCHAR +STARTCHAR uni2658 +ENCODING 9816 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +28 +38 +48 +E4 +84 +82 +8A +8A +91 +61 +41 +41 +7F +ENDCHAR +STARTCHAR uni2659 +ENCODING 9817 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +38 +44 +44 +44 +38 +44 +7C +82 +82 +FE +ENDCHAR +STARTCHAR uni265A +ENCODING 9818 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +10 +38 +10 +6C +92 +BA +BA +BA +54 +7C +82 +FE +FE +ENDCHAR +STARTCHAR uni265B +ENCODING 9819 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 11 0 0 +BITMAP +AA80 +AA80 +5D00 +7F00 +3E00 +3E00 +1C00 +3E00 +4100 +7F00 +7F00 +ENDCHAR +STARTCHAR uni265C +ENCODING 9820 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +D6 +FE +FE +44 +7C +7C +7C +7C +7C +7C +82 +FE +FE +ENDCHAR +STARTCHAR uni265D +ENCODING 9821 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +38 +7C +EE +C6 +EE +7C +44 +7C +7C +82 +FE +FE +ENDCHAR +STARTCHAR uni265E +ENCODING 9822 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +28 +38 +78 +9C +FC +FE +F6 +F6 +EF +1F +7F +41 +7F +ENDCHAR +STARTCHAR uni265F +ENCODING 9823 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +38 +7C +7C +7C +38 +44 +7C +82 +FE +FE +ENDCHAR +STARTCHAR spade +ENCODING 9824 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 10 0 0 +BITMAP +0800 +1C00 +3E00 +7F00 +7F00 +FF80 +FF80 +6B00 +0800 +1C00 +ENDCHAR +STARTCHAR uni2661 +ENCODING 9825 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 9 10 0 0 +BITMAP +6300 +9480 +8880 +8080 +8080 +4100 +4100 +2200 +1400 +0800 +ENDCHAR +STARTCHAR uni2662 +ENCODING 9826 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 9 9 0 1 +BITMAP +0800 +1400 +2200 +4100 +8080 +4100 +2200 +1400 +0800 +ENDCHAR +STARTCHAR club +ENCODING 9827 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 10 0 0 +BITMAP +1C00 +3E00 +3E00 +1C00 +7F00 +FF80 +FF80 +6B00 +0800 +1C00 +ENDCHAR +STARTCHAR uni2664 +ENCODING 9828 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 9 10 0 0 +BITMAP +0800 +1400 +2200 +4100 +4100 +8080 +9480 +6B00 +0800 +1C00 +ENDCHAR +STARTCHAR heart +ENCODING 9829 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 10 0 0 +BITMAP +6300 +F780 +FF80 +FF80 +FF80 +7F00 +7F00 +3E00 +1C00 +0800 +ENDCHAR +STARTCHAR diamond +ENCODING 9830 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 9 0 1 +BITMAP +0800 +1C00 +3E00 +7F00 +FF80 +7F00 +3E00 +1C00 +0800 +ENDCHAR +STARTCHAR uni2667 +ENCODING 9831 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 9 10 0 0 +BITMAP +1C00 +2200 +2200 +1400 +6300 +8080 +9480 +6B00 +0800 +1C00 +ENDCHAR +STARTCHAR uni2669 +ENCODING 9833 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 4 11 1 0 +BITMAP +10 +10 +10 +10 +10 +10 +10 +10 +70 +F0 +60 +ENDCHAR +STARTCHAR musicalnote +ENCODING 9834 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +10 +18 +14 +12 +12 +12 +14 +10 +70 +F0 +60 +ENDCHAR +STARTCHAR musicalnotedbl +ENCODING 9835 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +18 +1E +17 +11 +11 +11 +11 +11 +71 +F1 +61 +07 +0F +06 +ENDCHAR +STARTCHAR uni266C +ENCODING 9836 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +1F +1F +11 +1F +1F +11 +11 +11 +77 +FF +66 +ENDCHAR +STARTCHAR uni266D +ENCODING 9837 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +C0 +C0 +C0 +C0 +DC +E6 +C6 +C6 +C6 +CC +F8 +ENDCHAR +STARTCHAR uni266E +ENCODING 9838 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +C0 +C0 +C6 +DE +F6 +C6 +C6 +C6 +DE +F6 +C6 +06 +06 +06 +ENDCHAR +STARTCHAR uni266F +ENCODING 9839 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 12 1 -1 +BITMAP +0C +6C +6E +7C +EC +6C +6C +6E +7C +EC +6C +60 +ENDCHAR +STARTCHAR uni2680 +ENCODING 9856 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +FF80 +8080 +8080 +8080 +8880 +8080 +8080 +8080 +FF80 +ENDCHAR +STARTCHAR uni2681 +ENCODING 9857 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +FF80 +8080 +8280 +8080 +8080 +8080 +A080 +8080 +FF80 +ENDCHAR +STARTCHAR uni2682 +ENCODING 9858 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +FF80 +8080 +8280 +8080 +8880 +8080 +A080 +8080 +FF80 +ENDCHAR +STARTCHAR uni2683 +ENCODING 9859 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +FF80 +8080 +A280 +8080 +8080 +8080 +A280 +8080 +FF80 +ENDCHAR +STARTCHAR uni2684 +ENCODING 9860 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +FF80 +8080 +A280 +8080 +8880 +8080 +A280 +8080 +FF80 +ENDCHAR +STARTCHAR uni2685 +ENCODING 9861 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +FF80 +8080 +A280 +8080 +A280 +8080 +A280 +8080 +FF80 +ENDCHAR +STARTCHAR uni2690 +ENCODING 9872 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 7 11 0 1 +BITMAP +FE +84 +88 +88 +84 +FE +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2691 +ENCODING 9873 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 7 11 0 1 +BITMAP +FE +FC +F8 +F8 +FC +FE +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni271D +ENCODING 10013 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +18 +18 +18 +FF +FF +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni2776 +ENCODING 10102 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +7E +F7 +E7 +F7 +F7 +F7 +7E +3C +ENDCHAR +STARTCHAR uni2777 +ENCODING 10103 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +7E +C7 +FB +F7 +EF +C3 +7E +3C +ENDCHAR +STARTCHAR uni2778 +ENCODING 10104 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +7E +C7 +FB +E7 +FB +C7 +7E +3C +ENDCHAR +STARTCHAR uni2779 +ENCODING 10105 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +7E +F7 +E7 +D7 +C3 +F7 +7E +3C +ENDCHAR +STARTCHAR uni277A +ENCODING 10106 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +7E +C3 +DF +C7 +FB +C7 +7E +3C +ENDCHAR +STARTCHAR uni277B +ENCODING 10107 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +7E +E3 +DF +C7 +DB +E7 +7E +3C +ENDCHAR +STARTCHAR uni277C +ENCODING 10108 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +7E +C3 +FB +F7 +EF +EF +7E +3C +ENDCHAR +STARTCHAR uni277D +ENCODING 10109 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +7E +E7 +DB +E7 +DB +E7 +7E +3C +ENDCHAR +STARTCHAR uni277E +ENCODING 10110 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +7E +E7 +DB +E3 +FB +E7 +7E +3C +ENDCHAR +STARTCHAR uni277F +ENCODING 10111 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +7E +DB +95 +D5 +D5 +DB +7E +3C +ENDCHAR +STARTCHAR uni2780 +ENCODING 10112 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +42 +89 +99 +89 +89 +89 +42 +3C +ENDCHAR +STARTCHAR uni2781 +ENCODING 10113 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +42 +B9 +85 +89 +91 +BD +42 +3C +ENDCHAR +STARTCHAR uni2782 +ENCODING 10114 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +42 +B9 +85 +99 +85 +B9 +42 +3C +ENDCHAR +STARTCHAR uni2783 +ENCODING 10115 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +42 +89 +99 +A9 +BD +89 +42 +3C +ENDCHAR +STARTCHAR uni2784 +ENCODING 10116 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +42 +BD +A1 +B9 +85 +B9 +42 +3C +ENDCHAR +STARTCHAR uni2785 +ENCODING 10117 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +42 +9D +A1 +B9 +A5 +99 +42 +3C +ENDCHAR +STARTCHAR uni2786 +ENCODING 10118 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +42 +BD +85 +89 +91 +91 +42 +3C +ENDCHAR +STARTCHAR uni2787 +ENCODING 10119 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +42 +99 +A5 +99 +A5 +99 +42 +3C +ENDCHAR +STARTCHAR uni2788 +ENCODING 10120 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +42 +99 +A5 +9D +85 +99 +42 +3C +ENDCHAR +STARTCHAR uni2789 +ENCODING 10121 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +42 +A9 +B5 +B5 +B5 +A9 +42 +3C +ENDCHAR +STARTCHAR uni278A +ENCODING 10122 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +7E +F7 +E7 +F7 +F7 +F7 +7E +3C +ENDCHAR +STARTCHAR uni278B +ENCODING 10123 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +7E +C7 +FB +F7 +EF +C3 +7E +3C +ENDCHAR +STARTCHAR uni278C +ENCODING 10124 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +7E +C7 +FB +E7 +FB +C7 +7E +3C +ENDCHAR +STARTCHAR uni278D +ENCODING 10125 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +7E +F7 +E7 +D7 +C3 +F7 +7E +3C +ENDCHAR +STARTCHAR uni278E +ENCODING 10126 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +7E +C3 +DF +C7 +FB +C7 +7E +3C +ENDCHAR +STARTCHAR uni278F +ENCODING 10127 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +7E +E3 +DF +C7 +DB +E7 +7E +3C +ENDCHAR +STARTCHAR uni2790 +ENCODING 10128 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +7E +C3 +FB +F7 +EF +EF +7E +3C +ENDCHAR +STARTCHAR uni2791 +ENCODING 10129 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +7E +E7 +DB +E7 +DB +E7 +7E +3C +ENDCHAR +STARTCHAR uni2792 +ENCODING 10130 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +7E +E7 +DB +E3 +FB +E7 +7E +3C +ENDCHAR +STARTCHAR uni2793 +ENCODING 10131 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +7E +DB +95 +D5 +D5 +DB +7E +3C +ENDCHAR +STARTCHAR uni2794 +ENCODING 10132 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 6 0 2 +BITMAP +0C +06 +FF +FF +06 +0C +ENDCHAR +STARTCHAR uni2795 +ENCODING 10133 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 1 +BITMAP +18 +18 +18 +FF +FF +18 +18 +18 +ENDCHAR +STARTCHAR uni2796 +ENCODING 10134 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 2 0 4 +BITMAP +FF +FF +ENDCHAR +STARTCHAR uni2797 +ENCODING 10135 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 10 0 0 +BITMAP +18 +18 +00 +00 +FF +FF +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2798 +ENCODING 10136 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 1 +BITMAP +40 +E0 +73 +3B +1F +0F +3F +3F +ENDCHAR +STARTCHAR uni2799 +ENCODING 10137 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 1 +BITMAP +08 +1C +0E +FF +FF +0E +1C +08 +ENDCHAR +STARTCHAR uni279A +ENCODING 10138 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 1 +BITMAP +3F +3F +0F +1F +3B +73 +E0 +40 +ENDCHAR +STARTCHAR uni279B +ENCODING 10139 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 7 0 1 +BITMAP +08 +04 +06 +FF +06 +04 +08 +ENDCHAR +STARTCHAR uni279C +ENCODING 10140 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 1 +BITMAP +18 +1C +0E +FF +FF +0E +1C +18 +ENDCHAR +STARTCHAR uni279D +ENCODING 10141 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 7 0 1 +BITMAP +08 +0C +0E +FF +0E +0C +08 +ENDCHAR +STARTCHAR uni279E +ENCODING 10142 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 1 +BITMAP +08 +0C +0E +FF +FF +0E +0C +08 +ENDCHAR +STARTCHAR uni279F +ENCODING 10143 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 3 +BITMAP +04 +06 +AF +06 +04 +ENDCHAR +STARTCHAR uni27A0 +ENCODING 10144 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 3 +BITMAP +04 +AE +AF +AE +04 +ENDCHAR +STARTCHAR uni27A1 +ENCODING 10145 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 3 +BITMAP +04 +FE +FF +FE +04 +ENDCHAR +STARTCHAR uni29CE +ENCODING 10702 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 12 0 1 +BITMAP +0C +74 +84 +84 +74 +0C +C0 +F8 +98 +84 +B8 +C0 +ENDCHAR +STARTCHAR uni29CF +ENCODING 10703 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 6 0 5 +BITMAP +34 +74 +B4 +B4 +74 +34 +ENDCHAR +STARTCHAR uni29D0 +ENCODING 10704 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 6 0 5 +BITMAP +B0 +B8 +B4 +B4 +B8 +B0 +ENDCHAR +STARTCHAR uni29D1 +ENCODING 10705 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 6 0 5 +BITMAP +84 +CC +FC +F4 +CC +84 +ENDCHAR +STARTCHAR uni29D2 +ENCODING 10706 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 6 0 5 +BITMAP +84 +CC +FC +BC +CC +84 +ENDCHAR +STARTCHAR uni29D3 +ENCODING 10707 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 6 0 5 +BITMAP +84 +CC +FC +FC +CC +84 +ENDCHAR +STARTCHAR uni29D4 +ENCODING 10708 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 6 0 5 +BITMAP +84 +C8 +F0 +F0 +C8 +84 +ENDCHAR +STARTCHAR uni29D5 +ENCODING 10709 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 6 0 5 +BITMAP +84 +4C +3C +3C +4C +84 +ENDCHAR +STARTCHAR uni29D6 +ENCODING 10710 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 6 0 5 +BITMAP +FC +68 +30 +30 +68 +FC +ENDCHAR +STARTCHAR uni29D7 +ENCODING 10711 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 6 0 5 +BITMAP +FC +78 +30 +30 +78 +FC +ENDCHAR +STARTCHAR uni2A00 +ENCODING 10752 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +3E00 +4100 +8080 +9C80 +9C80 +9C80 +8080 +4100 +3E00 +ENDCHAR +STARTCHAR uni2A01 +ENCODING 10753 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +3E00 +4100 +8880 +8880 +BE80 +8880 +8880 +4100 +3E00 +ENDCHAR +STARTCHAR uni2A02 +ENCODING 10754 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +3E00 +4100 +A280 +9480 +8880 +9480 +A280 +4100 +3E00 +ENDCHAR +STARTCHAR uni2A03 +ENCODING 10755 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 8 10 0 0 +BITMAP +81 +81 +81 +81 +81 +99 +99 +81 +42 +3C +ENDCHAR +STARTCHAR uni2A04 +ENCODING 10756 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +82 +82 +82 +82 +92 +BA +92 +82 +44 +38 +ENDCHAR +STARTCHAR uni2A05 +ENCODING 10757 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +FE +82 +82 +82 +82 +82 +82 +82 +82 +82 +ENDCHAR +STARTCHAR uni2A06 +ENCODING 10758 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +82 +82 +82 +82 +82 +82 +82 +82 +82 +FE +ENDCHAR +STARTCHAR uni2A09 +ENCODING 10761 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 1 2 +BITMAP +82 +44 +28 +10 +28 +44 +82 +ENDCHAR +STARTCHAR uni2B00 +ENCODING 11008 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 8 0 1 +BITMAP +1F +09 +11 +23 +45 +88 +50 +20 +ENDCHAR +STARTCHAR uni2B01 +ENCODING 11009 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 8 0 1 +BITMAP +F8 +90 +88 +C4 +A2 +11 +0A +04 +ENDCHAR +STARTCHAR uni2B02 +ENCODING 11010 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 8 0 1 +BITMAP +20 +50 +88 +45 +23 +11 +09 +1F +ENDCHAR +STARTCHAR uni2B03 +ENCODING 11011 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 8 0 1 +BITMAP +04 +0A +11 +A2 +C4 +88 +90 +F8 +ENDCHAR +STARTCHAR uni2B04 +ENCODING 11012 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 7 0 2 +BITMAP +1400 +3600 +5D00 +8080 +5D00 +3600 +1400 +ENDCHAR +STARTCHAR uni2B05 +ENCODING 11013 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 7 0 2 +BITMAP +10 +30 +7F +FF +7F +30 +10 +ENDCHAR +STARTCHAR uni2B06 +ENCODING 11014 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 8 1 2 +BITMAP +10 +38 +7C +FE +38 +38 +38 +38 +ENDCHAR +STARTCHAR uni2B07 +ENCODING 11015 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 8 1 2 +BITMAP +38 +38 +38 +38 +FE +7C +38 +10 +ENDCHAR +STARTCHAR uni2B08 +ENCODING 11016 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 8 0 1 +BITMAP +1F +0F +1F +3F +7D +F8 +70 +20 +ENDCHAR +STARTCHAR uni2B09 +ENCODING 11017 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 8 0 1 +BITMAP +F8 +F0 +F8 +FC +BE +1F +0E +04 +ENDCHAR +STARTCHAR uni2B0A +ENCODING 11018 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 8 0 1 +BITMAP +20 +70 +F8 +7D +3F +1F +0F +1F +ENDCHAR +STARTCHAR uni2B0B +ENCODING 11019 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 8 0 1 +BITMAP +04 +0E +1F +BE +FC +F8 +F0 +F8 +ENDCHAR +STARTCHAR uni2B0C +ENCODING 11020 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 7 0 2 +BITMAP +1400 +3600 +7F00 +FF80 +7F00 +3600 +1400 +ENDCHAR +STARTCHAR uni2B0D +ENCODING 11021 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +10 +38 +7C +FE +38 +38 +FE +7C +38 +10 +ENDCHAR +STARTCHAR uni2B12 +ENCODING 11026 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +FE +FE +82 +82 +82 +FE +ENDCHAR +STARTCHAR uni2B13 +ENCODING 11027 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +82 +82 +82 +FE +FE +FE +ENDCHAR +STARTCHAR uni2B14 +ENCODING 11028 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +BE +9E +8E +86 +82 +FE +ENDCHAR +STARTCHAR uni2B15 +ENCODING 11029 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +82 +C2 +E2 +F2 +FA +FE +ENDCHAR +STARTCHAR uni2B16 +ENCODING 11030 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +10 +38 +74 +F2 +74 +38 +10 +ENDCHAR +STARTCHAR uni2B17 +ENCODING 11031 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +10 +38 +5C +9E +5C +38 +10 +ENDCHAR +STARTCHAR uni2B18 +ENCODING 11032 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +10 +38 +7C +FE +44 +28 +10 +ENDCHAR +STARTCHAR uni2B19 +ENCODING 11033 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +10 +28 +44 +FE +7C +38 +10 +ENDCHAR +STARTCHAR uni2B1A +ENCODING 11034 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +AA +00 +82 +00 +82 +00 +AA +ENDCHAR +STARTCHAR uni2B1B +ENCODING 11035 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +FF +FF +FF +FF +FF +FF +FF +FF +ENDCHAR +STARTCHAR uni2B1C +ENCODING 11036 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +FF +81 +81 +81 +81 +81 +81 +FF +ENDCHAR +STARTCHAR uni2C60 +ENCODING 11360 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +40 +40 +40 +40 +F8 +40 +F8 +40 +40 +40 +7E +ENDCHAR +STARTCHAR uni2C61 +ENCODING 11361 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 5 11 1 0 +BITMAP +60 +20 +20 +20 +F8 +20 +F8 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni2C62 +ENCODING 11362 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +20 +20 +20 +20 +64 +B8 +20 +20 +20 +20 +3F +ENDCHAR +STARTCHAR uni2C63 +ENCODING 11363 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +78 +44 +42 +F2 +42 +44 +78 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni2C64 +ENCODING 11364 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +F8 +84 +84 +84 +84 +F8 +C0 +A0 +90 +88 +84 +80 +80 +60 +ENDCHAR +STARTCHAR uniA730 +ENCODING 42800 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +FC +80 +80 +80 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uniA731 +ENCODING 42801 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +7C +80 +80 +80 +78 +04 +04 +F8 +F8 +ENDCHAR +STARTCHAR uniFE7C +ENCODING 65148 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 5 0 9 +BITMAP +84 +94 +B8 +B8 +40 +ENDCHAR +STARTCHAR uniFE7D +ENCODING 65149 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 14 0 0 +BITMAP +84 +94 +B8 +B8 +40 +00 +00 +00 +00 +00 +00 +00 +FE +FE +ENDCHAR +STARTCHAR uniFE7E +ENCODING 65150 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 4 4 1 11 +BITMAP +40 +B0 +40 +40 +ENDCHAR +STARTCHAR uniFE7F +ENCODING 65151 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 14 0 0 +BITMAP +30 +48 +30 +00 +00 +00 +00 +00 +00 +00 +00 +00 +FE +FE +ENDCHAR +STARTCHAR uniFE80 +ENCODING 65152 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 4 6 2 3 +BITMAP +70 +80 +80 +80 +70 +C0 +ENDCHAR +STARTCHAR uniFE81 +ENCODING 65153 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 13 1 1 +BITMAP +48 +B0 +00 +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uniFE82 +ENCODING 65154 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 14 1 0 +BITMAP +48 +B0 +00 +00 +40 +40 +40 +40 +40 +40 +40 +40 +3C +1C +ENDCHAR +STARTCHAR uniFE83 +ENCODING 65155 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 4 13 1 1 +BITMAP +70 +80 +E0 +E0 +00 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uniFE84 +ENCODING 65156 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 14 1 0 +BITMAP +70 +80 +E0 +E0 +00 +40 +40 +40 +40 +40 +40 +40 +3C +1C +ENDCHAR +STARTCHAR uniFE85 +ENCODING 65157 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 14 0 -2 +BITMAP +38 +40 +70 +78 +00 +38 +44 +44 +44 +44 +3C +04 +F8 +F0 +ENDCHAR +STARTCHAR uniFE86 +ENCODING 65158 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 14 0 -2 +BITMAP +38 +40 +70 +78 +00 +38 +44 +44 +44 +46 +3E +04 +F8 +F0 +ENDCHAR +STARTCHAR uniFE87 +ENCODING 65159 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 4 14 1 -2 +BITMAP +40 +40 +40 +40 +40 +40 +40 +00 +00 +00 +70 +80 +E0 +E0 +ENDCHAR +STARTCHAR uniFE88 +ENCODING 65160 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 14 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +30 +00 +00 +08 +72 +80 +E0 +E0 +ENDCHAR +STARTCHAR uniFE89 +ENCODING 65161 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 12 0 1 +BITMAP +70 +80 +E0 +E0 +04 +0A +48 +00 +00 +84 +84 +78 +ENDCHAR +STARTCHAR uniFE8A +ENCODING 65162 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 11 0 1 +BITMAP +70 +80 +E0 +E0 +00 +40 +82 +8A +8A +88 +70 +ENDCHAR +STARTCHAR uniFE8B +ENCODING 65163 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 11 0 1 +BITMAP +38 +40 +70 +78 +00 +30 +30 +30 +30 +30 +C0 +ENDCHAR +STARTCHAR uniFE8C +ENCODING 65164 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 11 0 1 +BITMAP +38 +40 +70 +78 +00 +30 +30 +30 +30 +30 +CE +ENDCHAR +STARTCHAR uniFE8D +ENCODING 65165 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 1 11 2 1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uniFE8E +ENCODING 65166 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 11 2 1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +78 +ENDCHAR +STARTCHAR uniFE8F +ENCODING 65167 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 5 0 1 +BITMAP +08 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uniFE90 +ENCODING 65168 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 5 0 1 +BITMAP +08 +84 +84 +84 +7A +ENDCHAR +STARTCHAR uniFE91 +ENCODING 65169 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 4 5 0 1 +BITMAP +30 +30 +30 +20 +C0 +ENDCHAR +STARTCHAR uniFE92 +ENCODING 65170 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 5 0 1 +BITMAP +30 +30 +30 +30 +CE +ENDCHAR +STARTCHAR uniFE93 +ENCODING 65171 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 10 0 0 +BITMAP +48 +00 +20 +70 +88 +84 +84 +00 +00 +78 +ENDCHAR +STARTCHAR uniFE94 +ENCODING 65172 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 10 0 0 +BITMAP +48 +00 +10 +38 +44 +84 +84 +00 +00 +78 +ENDCHAR +STARTCHAR uniFE95 +ENCODING 65173 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 7 0 2 +BITMAP +48 +00 +00 +08 +84 +84 +78 +ENDCHAR +STARTCHAR uniFE96 +ENCODING 65174 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 7 0 2 +BITMAP +48 +00 +00 +08 +84 +84 +7A +ENDCHAR +STARTCHAR uniFE97 +ENCODING 65175 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 7 0 2 +BITMAP +48 +00 +00 +30 +30 +30 +C0 +ENDCHAR +STARTCHAR uniFE98 +ENCODING 65176 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 7 0 2 +BITMAP +48 +00 +00 +30 +30 +30 +CE +ENDCHAR +STARTCHAR uniFE99 +ENCODING 65177 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 1 +BITMAP +30 +00 +00 +48 +00 +08 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uniFE9A +ENCODING 65178 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 1 +BITMAP +30 +00 +00 +48 +00 +08 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uniFE9B +ENCODING 65179 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 11 0 1 +BITMAP +30 +00 +00 +48 +00 +30 +30 +30 +30 +30 +C0 +ENDCHAR +STARTCHAR uniFE9C +ENCODING 65180 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 11 0 1 +BITMAP +30 +00 +00 +48 +00 +30 +30 +30 +30 +30 +CE +ENDCHAR +STARTCHAR uniFE9D +ENCODING 65181 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 -1 +BITMAP +FC +30 +00 +40 +80 +B0 +80 +00 +00 +40 +3C +ENDCHAR +STARTCHAR uniFE9E +ENCODING 65182 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 11 0 -1 +BITMAP +FC +38 +18 +48 +84 +B2 +80 +00 +00 +40 +3C +ENDCHAR +STARTCHAR uniFE9F +ENCODING 65183 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 5 0 1 +BITMAP +78 +04 +18 +38 +C0 +ENDCHAR +STARTCHAR uniFEA0 +ENCODING 65184 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 5 0 1 +BITMAP +78 +04 +1C +3C +C2 +ENDCHAR +STARTCHAR uniFEA1 +ENCODING 65185 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 -1 +BITMAP +FC +30 +00 +40 +80 +80 +80 +00 +00 +40 +3C +ENDCHAR +STARTCHAR uniFEA2 +ENCODING 65186 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 11 0 -1 +BITMAP +FC +38 +18 +48 +84 +82 +80 +00 +00 +40 +3C +ENDCHAR +STARTCHAR uniFEA3 +ENCODING 65187 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 5 0 1 +BITMAP +78 +04 +18 +38 +C0 +ENDCHAR +STARTCHAR uniFEA4 +ENCODING 65188 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 5 0 1 +BITMAP +78 +04 +1C +3C +C2 +ENDCHAR +STARTCHAR uniFEA5 +ENCODING 65189 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 14 0 -2 +BITMAP +30 +00 +FC +FC +30 +40 +80 +80 +80 +80 +80 +40 +3C +1C +ENDCHAR +STARTCHAR uniFEA6 +ENCODING 65190 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 14 0 -2 +BITMAP +30 +00 +FC +FC +38 +48 +84 +80 +80 +80 +80 +40 +3C +1C +ENDCHAR +STARTCHAR uniFEA7 +ENCODING 65191 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 7 0 2 +BITMAP +30 +00 +30 +78 +04 +38 +C0 +ENDCHAR +STARTCHAR uniFEA8 +ENCODING 65192 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 7 0 2 +BITMAP +30 +00 +30 +78 +04 +3C +C2 +ENDCHAR +STARTCHAR uniFEA9 +ENCODING 65193 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 6 1 2 +BITMAP +30 +08 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR uniFEAA +ENCODING 65194 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 6 1 2 +BITMAP +30 +08 +08 +08 +08 +F4 +ENDCHAR +STARTCHAR uniFEAB +ENCODING 65195 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 10 1 0 +BITMAP +40 +00 +00 +10 +08 +08 +08 +00 +00 +F0 +ENDCHAR +STARTCHAR uniFEAC +ENCODING 65196 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 10 1 0 +BITMAP +40 +00 +00 +10 +08 +08 +08 +00 +00 +F0 +ENDCHAR +STARTCHAR uniFEAD +ENCODING 65197 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 6 0 1 +BITMAP +04 +04 +04 +04 +08 +F0 +ENDCHAR +STARTCHAR uniFEAE +ENCODING 65198 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 6 0 1 +BITMAP +04 +04 +04 +04 +0A +F0 +ENDCHAR +STARTCHAR uniFEAF +ENCODING 65199 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 10 0 -1 +BITMAP +04 +00 +04 +04 +04 +04 +00 +00 +00 +F0 +ENDCHAR +STARTCHAR uniFEB0 +ENCODING 65200 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 10 0 -1 +BITMAP +04 +00 +04 +04 +04 +04 +02 +00 +00 +F0 +ENDCHAR +STARTCHAR uniFEB1 +ENCODING 65201 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 10 0 -2 +BITMAP +02 +4A +4A +4A +4A +34 +B0 +00 +00 +40 +ENDCHAR +STARTCHAR uniFEB2 +ENCODING 65202 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 10 0 -2 +BITMAP +02 +4A +4A +4A +4A +34 +B0 +00 +00 +40 +ENDCHAR +STARTCHAR uniFEB3 +ENCODING 65203 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 6 0 2 +BITMAP +02 +4A +4A +4A +4A +B4 +ENDCHAR +STARTCHAR uniFEB4 +ENCODING 65204 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 6 0 2 +BITMAP +02 +4A +4A +4A +4A +B4 +ENDCHAR +STARTCHAR uniFEB5 +ENCODING 65205 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 13 0 -1 +BITMAP +30 +00 +00 +48 +00 +4A +4A +4A +4A +4A +30 +B0 +40 +ENDCHAR +STARTCHAR uniFEB6 +ENCODING 65206 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 13 0 -1 +BITMAP +30 +00 +00 +48 +00 +4A +4A +4A +4A +4A +30 +B0 +40 +ENDCHAR +STARTCHAR uniFEB7 +ENCODING 65207 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 11 0 1 +BITMAP +30 +00 +00 +48 +00 +4A +4A +4A +4A +4A +B0 +ENDCHAR +STARTCHAR uniFEB8 +ENCODING 65208 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 11 0 1 +BITMAP +30 +00 +00 +48 +00 +4A +4A +4A +4A +4A +B0 +ENDCHAR +STARTCHAR uniFEB9 +ENCODING 65209 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 7 0 0 +BITMAP +34 +3A +B2 +B2 +BC +B0 +40 +ENDCHAR +STARTCHAR uniFEBA +ENCODING 65210 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 7 0 0 +BITMAP +34 +3A +B2 +B2 +BE +B0 +40 +ENDCHAR +STARTCHAR uniFEBB +ENCODING 65211 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 5 0 1 +BITMAP +44 +4A +72 +72 +9C +ENDCHAR +STARTCHAR uniFEBC +ENCODING 65212 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 5 0 1 +BITMAP +44 +4A +72 +72 +9E +ENDCHAR +STARTCHAR uniFEBD +ENCODING 65213 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 11 0 -1 +BITMAP +30 +00 +04 +34 +3A +B2 +BC +B8 +B8 +B0 +40 +ENDCHAR +STARTCHAR uniFEBE +ENCODING 65214 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 11 0 -1 +BITMAP +30 +00 +04 +34 +3A +B2 +BE +B8 +B8 +B0 +40 +ENDCHAR +STARTCHAR uniFEBF +ENCODING 65215 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 7 0 2 +BITMAP +30 +00 +04 +44 +6A +72 +BC +ENDCHAR +STARTCHAR uniFEC0 +ENCODING 65216 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 7 0 2 +BITMAP +30 +00 +04 +44 +6A +72 +BE +ENDCHAR +STARTCHAR uniFEC1 +ENCODING 65217 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 1 +BITMAP +40 +40 +40 +40 +40 +48 +74 +74 +74 +74 +F8 +ENDCHAR +STARTCHAR uniFEC2 +ENCODING 65218 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 1 +BITMAP +40 +40 +40 +40 +40 +48 +74 +74 +74 +74 +F8 +ENDCHAR +STARTCHAR uniFEC3 +ENCODING 65219 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 1 +BITMAP +40 +40 +40 +40 +40 +48 +74 +74 +74 +74 +F8 +ENDCHAR +STARTCHAR uniFEC4 +ENCODING 65220 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 1 +BITMAP +40 +40 +40 +40 +40 +48 +74 +74 +74 +74 +F8 +ENDCHAR +STARTCHAR uniFEC5 +ENCODING 65221 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 1 +BITMAP +40 +40 +40 +48 +40 +48 +74 +74 +74 +74 +F8 +ENDCHAR +STARTCHAR uniFEC6 +ENCODING 65222 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 1 +BITMAP +40 +40 +40 +48 +40 +48 +74 +74 +74 +74 +F8 +ENDCHAR +STARTCHAR uniFEC7 +ENCODING 65223 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 1 +BITMAP +40 +40 +40 +48 +40 +48 +74 +74 +74 +74 +F8 +ENDCHAR +STARTCHAR uniFEC8 +ENCODING 65224 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 1 +BITMAP +40 +40 +40 +48 +40 +48 +74 +74 +74 +74 +F8 +ENDCHAR +STARTCHAR uniFEC9 +ENCODING 65225 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 -1 +BITMAP +70 +80 +80 +80 +78 +80 +80 +80 +80 +84 +78 +ENDCHAR +STARTCHAR uniFECA +ENCODING 65226 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 10 0 -2 +BITMAP +70 +88 +70 +70 +88 +86 +80 +00 +00 +78 +ENDCHAR +STARTCHAR uniFECB +ENCODING 65227 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 7 0 2 +BITMAP +38 +40 +40 +40 +3C +30 +C0 +ENDCHAR +STARTCHAR uniFECC +ENCODING 65228 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 7 0 2 +BITMAP +30 +48 +48 +48 +30 +48 +86 +ENDCHAR +STARTCHAR uniFECD +ENCODING 65229 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 14 0 -2 +BITMAP +40 +00 +20 +60 +80 +80 +78 +00 +00 +80 +80 +84 +78 +30 +ENDCHAR +STARTCHAR uniFECE +ENCODING 65230 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 12 0 -1 +BITMAP +30 +00 +20 +70 +88 +70 +88 +80 +80 +82 +80 +78 +ENDCHAR +STARTCHAR uniFECF +ENCODING 65231 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 1 +BITMAP +40 +00 +10 +38 +40 +40 +3C +38 +38 +30 +C0 +ENDCHAR +STARTCHAR uniFED0 +ENCODING 65232 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 11 0 1 +BITMAP +30 +00 +00 +30 +48 +48 +30 +00 +00 +40 +82 +ENDCHAR +STARTCHAR uniFED1 +ENCODING 65233 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 10 0 -1 +BITMAP +08 +00 +00 +08 +14 +8C +84 +00 +00 +78 +ENDCHAR +STARTCHAR uniFED2 +ENCODING 65234 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 10 0 -1 +BITMAP +08 +00 +00 +08 +14 +8C +86 +00 +00 +78 +ENDCHAR +STARTCHAR uniFED3 +ENCODING 65235 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 11 0 0 +BITMAP +30 +00 +00 +30 +48 +38 +08 +00 +00 +30 +C0 +ENDCHAR +STARTCHAR uniFED4 +ENCODING 65236 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 10 0 0 +BITMAP +30 +00 +00 +30 +48 +48 +30 +00 +00 +C6 +ENDCHAR +STARTCHAR uniFED5 +ENCODING 65237 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 10 0 -1 +BITMAP +34 +00 +00 +08 +14 +8C +84 +00 +00 +78 +ENDCHAR +STARTCHAR uniFED6 +ENCODING 65238 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 10 0 -1 +BITMAP +34 +00 +00 +08 +14 +8C +86 +00 +00 +78 +ENDCHAR +STARTCHAR uniFED7 +ENCODING 65239 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 11 0 0 +BITMAP +48 +00 +00 +30 +48 +38 +08 +00 +00 +30 +C0 +ENDCHAR +STARTCHAR uniFED8 +ENCODING 65240 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 10 0 0 +BITMAP +48 +00 +00 +30 +48 +48 +30 +00 +00 +C6 +ENDCHAR +STARTCHAR uniFED9 +ENCODING 65241 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 1 +BITMAP +34 +44 +24 +24 +C4 +04 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uniFEDA +ENCODING 65242 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 1 +BITMAP +34 +44 +24 +24 +C4 +04 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uniFEDB +ENCODING 65243 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 12 0 1 +BITMAP +04 +18 +00 +40 +40 +30 +08 +00 +00 +04 +04 +F8 +ENDCHAR +STARTCHAR uniFEDC +ENCODING 65244 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 12 0 1 +BITMAP +04 +18 +00 +40 +40 +30 +08 +00 +00 +04 +04 +F8 +ENDCHAR +STARTCHAR uniFEDD +ENCODING 65245 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 14 0 -2 +BITMAP +04 +04 +04 +04 +04 +04 +04 +04 +04 +44 +84 +84 +78 +30 +ENDCHAR +STARTCHAR uniFEDE +ENCODING 65246 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 14 0 -2 +BITMAP +04 +04 +04 +04 +04 +04 +04 +04 +04 +46 +86 +84 +78 +30 +ENDCHAR +STARTCHAR uniFEDF +ENCODING 65247 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 11 0 1 +BITMAP +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR uniFEE0 +ENCODING 65248 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 11 0 1 +BITMAP +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +F2 +ENDCHAR +STARTCHAR uniFEE1 +ENCODING 65249 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 7 0 0 +BITMAP +38 +44 +44 +44 +98 +80 +80 +ENDCHAR +STARTCHAR uniFEE2 +ENCODING 65250 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 7 0 0 +BITMAP +38 +44 +44 +44 +9A +80 +80 +ENDCHAR +STARTCHAR uniFEE3 +ENCODING 65251 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 5 0 1 +BITMAP +38 +44 +44 +44 +98 +ENDCHAR +STARTCHAR uniFEE4 +ENCODING 65252 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 5 0 1 +BITMAP +38 +44 +44 +44 +9A +ENDCHAR +STARTCHAR uniFEE5 +ENCODING 65253 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 10 0 -1 +BITMAP +30 +00 +00 +08 +84 +84 +84 +00 +00 +78 +ENDCHAR +STARTCHAR uniFEE6 +ENCODING 65254 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 10 0 -1 +BITMAP +30 +00 +00 +08 +84 +84 +86 +00 +00 +78 +ENDCHAR +STARTCHAR uniFEE7 +ENCODING 65255 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 4 7 0 2 +BITMAP +30 +00 +00 +30 +30 +30 +C0 +ENDCHAR +STARTCHAR uniFEE8 +ENCODING 65256 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 7 0 2 +BITMAP +30 +00 +00 +30 +30 +30 +CE +ENDCHAR +STARTCHAR uniFEE9 +ENCODING 65257 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 6 0 2 +BITMAP +70 +88 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uniFEEA +ENCODING 65258 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 6 0 2 +BITMAP +38 +44 +84 +84 +84 +7A +ENDCHAR +STARTCHAR uniFEEB +ENCODING 65259 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 10 0 0 +BITMAP +F0 +08 +04 +44 +B4 +B4 +44 +00 +00 +88 +ENDCHAR +STARTCHAR uniFEEC +ENCODING 65260 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 7 0 0 +BITMAP +08 +14 +04 +64 +FE +46 +38 +ENDCHAR +STARTCHAR uniFEED +ENCODING 65261 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 7 0 0 +BITMAP +38 +44 +44 +44 +1C +04 +F8 +ENDCHAR +STARTCHAR uniFEEE +ENCODING 65262 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 7 0 0 +BITMAP +38 +44 +44 +44 +1E +06 +F8 +ENDCHAR +STARTCHAR uniFEEF +ENCODING 65263 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 6 0 1 +BITMAP +04 +0A +88 +88 +84 +78 +ENDCHAR +STARTCHAR uniFEF0 +ENCODING 65264 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 6 0 1 +BITMAP +04 +0A +8A +8A +8A +70 +ENDCHAR +STARTCHAR uniFEF1 +ENCODING 65265 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 11 0 -1 +BITMAP +04 +0A +08 +48 +84 +84 +78 +00 +00 +00 +48 +ENDCHAR +STARTCHAR uniFEF2 +ENCODING 65266 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 7 0 0 +BITMAP +44 +8A +8A +8A +70 +00 +40 +ENDCHAR +STARTCHAR uniFEF3 +ENCODING 65267 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 4 7 0 0 +BITMAP +30 +30 +30 +20 +C0 +00 +40 +ENDCHAR +STARTCHAR uniFEF4 +ENCODING 65268 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 7 0 0 +BITMAP +30 +30 +30 +30 +CE +00 +40 +ENDCHAR +STARTCHAR uniFEF5 +ENCODING 65269 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 14 0 0 +BITMAP +48 +B0 +04 +04 +44 +44 +34 +34 +04 +04 +0C +0C +78 +30 +ENDCHAR +STARTCHAR uniFEF6 +ENCODING 65270 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 14 0 0 +BITMAP +48 +B0 +04 +04 +44 +44 +34 +34 +04 +04 +0C +0C +78 +30 +ENDCHAR +STARTCHAR uniFEF7 +ENCODING 65271 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 14 0 0 +BITMAP +70 +80 +E4 +E4 +04 +44 +34 +34 +04 +04 +0C +0C +78 +30 +ENDCHAR +STARTCHAR uniFEF8 +ENCODING 65272 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 14 0 0 +BITMAP +70 +80 +E4 +E4 +04 +44 +34 +34 +04 +04 +0C +0C +78 +30 +ENDCHAR +STARTCHAR uniFEF9 +ENCODING 65273 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 14 0 -2 +BITMAP +04 +44 +44 +44 +34 +34 +0C +0C +0C +8C +78 +80 +E0 +E0 +ENDCHAR +STARTCHAR uniFEFA +ENCODING 65274 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 14 0 -2 +BITMAP +04 +44 +44 +44 +34 +34 +0C +0C +0C +8C +78 +80 +E0 +E0 +ENDCHAR +STARTCHAR uniFEFB +ENCODING 65275 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 11 1 1 +BITMAP +08 +88 +88 +88 +48 +48 +38 +38 +38 +38 +F0 +ENDCHAR +STARTCHAR uniFEFC +ENCODING 65276 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 11 1 1 +BITMAP +08 +88 +88 +88 +48 +48 +38 +38 +38 +38 +F0 +ENDCHAR +STARTCHAR uniFFFD +ENCODING 65533 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 1 +BITMAP +FC +84 +84 +84 +84 +84 +84 +84 +84 +84 +FC +ENDCHAR +ENDFONT diff --git a/app/src/gambas3/font/GambasMedium-12.bdf b/app/src/gambas3/font/GambasMedium-12.bdf new file mode 100644 index 00000000..f4d33c00 --- /dev/null +++ b/app/src/gambas3/font/GambasMedium-12.bdf @@ -0,0 +1,36575 @@ +STARTFONT 2.1 +FONT -xos4-Gambas-Medium-R-Normal--12-120-72-72-C-60-ISO10646-1 +SIZE 12 72 72 +FONTBOUNDINGBOX 6 12 0 -2 +COMMENT "Generated by fontforge, http://fontforge.sourceforge.net" +COMMENT "ter-u12n" +STARTPROPERTIES 20 +FAMILY_NAME "Gambas" +FOUNDRY "xos4" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +COPYRIGHT "Copyright (C) 2012 Dimitar Toshkov Zhekov" +NOTICE "Licensed under the SIL Open Font License, Version 1.1" +WEIGHT_NAME "Medium" +SLANT "R" +PIXEL_SIZE 12 +POINT_SIZE 120 +RESOLUTION_X 72 +RESOLUTION_Y 72 +SPACING "C" +AVERAGE_WIDTH 60 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +MIN_SPACE 6 +FONT_ASCENT 10 +FONT_DESCENT 2 +DEFAULT_CHAR 65533 +ENDPROPERTIES +CHARS 2437 +STARTCHAR uni0000 +ENCODING 0 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +88 +00 +88 +88 +00 +88 +D8 +ENDCHAR +STARTCHAR space +ENCODING 32 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 8 2 0 +BITMAP +80 +80 +80 +80 +80 +00 +80 +80 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +A0 +A0 +A0 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +50 +F8 +50 +50 +F8 +50 +50 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +78 +A0 +A0 +70 +28 +28 +F0 +20 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +A0 +48 +10 +20 +40 +90 +28 +10 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +50 +20 +68 +90 +90 +68 +ENDCHAR +STARTCHAR quotesingle +ENCODING 39 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 3 2 6 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +20 +40 +80 +80 +80 +80 +80 +80 +40 +20 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +80 +40 +20 +20 +20 +20 +20 +20 +40 +80 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +50 +20 +F8 +20 +50 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 3 1 -1 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR hyphen +ENCODING 45 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 2 2 0 +BITMAP +80 +80 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +10 +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +98 +A8 +C8 +88 +88 +70 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +20 +60 +A0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +08 +08 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +08 +08 +70 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +18 +28 +48 +88 +F8 +08 +08 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +80 +80 +F0 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +40 +80 +F0 +88 +88 +88 +70 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +08 +08 +10 +10 +20 +20 +20 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +88 +78 +08 +10 +60 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 6 2 0 +BITMAP +80 +80 +00 +00 +80 +80 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 7 1 -1 +BITMAP +40 +40 +00 +00 +40 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 0 0 +BITMAP +10 +20 +40 +80 +40 +20 +10 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +F8 +00 +00 +F8 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +40 +20 +10 +20 +40 +80 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +E0 +10 +10 +20 +40 +00 +40 +40 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +98 +A8 +A8 +98 +80 +78 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +88 +88 +F0 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +80 +80 +80 +80 +80 +80 +78 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +E0 +90 +88 +88 +88 +88 +90 +E0 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +80 +80 +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +80 +80 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +80 +80 +80 +98 +88 +88 +70 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 8 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 0 0 +BITMAP +10 +10 +10 +10 +10 +10 +10 +E0 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +90 +A0 +C0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +D8 +A8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +C8 +C8 +A8 +A8 +98 +98 +88 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +88 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +88 +88 +88 +88 +88 +88 +70 +10 +08 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +88 +88 +88 +F0 +A0 +90 +88 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +80 +80 +70 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +88 +50 +50 +50 +20 +20 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +88 +88 +A8 +A8 +D8 +88 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +50 +20 +20 +50 +88 +88 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +50 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +08 +10 +20 +40 +80 +80 +F8 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +E0 +80 +80 +80 +80 +80 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +80 +80 +40 +40 +20 +20 +10 +10 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +20 +50 +88 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 1 0 0 +BITMAP +F8 +ENDCHAR +STARTCHAR grave +ENCODING 96 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 2 1 8 +BITMAP +80 +40 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +F0 +88 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +80 +80 +80 +80 +78 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +08 +78 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 8 2 0 +BITMAP +60 +80 +80 +E0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +78 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +F0 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 9 2 0 +BITMAP +80 +80 +00 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 11 0 -2 +BITMAP +20 +20 +00 +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +80 +80 +90 +A0 +C0 +C0 +A0 +90 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 8 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +40 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F0 +88 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +78 +88 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +80 +70 +08 +08 +F0 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +80 +80 +E0 +80 +80 +80 +80 +60 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +50 +20 +20 +50 +88 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +30 +40 +40 +40 +80 +80 +40 +40 +40 +30 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 10 2 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 -1 +BITMAP +C0 +20 +20 +20 +10 +10 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +48 +A8 +90 +ENDCHAR +STARTCHAR uni00A0 +ENCODING 160 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 8 2 0 +BITMAP +80 +80 +00 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +78 +A0 +A0 +A0 +A0 +78 +20 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +38 +40 +40 +F0 +40 +40 +40 +F8 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 6 1 1 +BITMAP +90 +60 +90 +90 +60 +90 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +50 +20 +70 +20 +70 +20 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 10 2 -1 +BITMAP +80 +80 +80 +80 +00 +00 +80 +80 +80 +80 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +60 +90 +40 +A0 +90 +50 +20 +90 +60 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 1 1 9 +BITMAP +A0 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +78 +84 +B4 +A4 +A4 +B4 +84 +78 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 1 3 +BITMAP +60 +10 +70 +90 +70 +00 +F0 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +28 +50 +A0 +50 +28 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +F8 +08 +08 +08 +ENDCHAR +STARTCHAR uni00AD +ENCODING 173 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 1 1 3 +BITMAP +F0 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +78 +84 +B4 +AC +B4 +AC +84 +78 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 1 1 9 +BITMAP +E0 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +F8 +20 +20 +00 +F8 +ENDCHAR +STARTCHAR uni00B2 +ENCODING 178 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 5 1 5 +BITMAP +E0 +10 +60 +80 +F0 +ENDCHAR +STARTCHAR uni00B3 +ENCODING 179 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 5 1 5 +BITMAP +E0 +10 +60 +10 +E0 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 2 2 8 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni00B5 +ENCODING 181 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +88 +88 +88 +88 +98 +E8 +80 +80 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +A8 +A8 +A8 +68 +28 +28 +28 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 2 2 3 +BITMAP +80 +80 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 3 0 -2 +BITMAP +20 +20 +C0 +ENDCHAR +STARTCHAR uni00B9 +ENCODING 185 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 5 1 5 +BITMAP +40 +C0 +40 +40 +40 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 5 1 5 +BITMAP +60 +90 +90 +90 +60 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +A0 +50 +28 +50 +A0 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +40 +C0 +40 +44 +48 +10 +20 +44 +8C +14 +1C +04 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +40 +C0 +40 +44 +48 +10 +20 +58 +84 +08 +10 +1C +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +C0 +20 +C0 +24 +C8 +10 +20 +44 +8C +14 +1C +04 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +00 +20 +40 +80 +80 +78 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +70 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +70 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +70 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +A8 +90 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +70 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +20 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +7C +90 +90 +FC +90 +90 +90 +9C +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +78 +80 +80 +80 +80 +80 +80 +78 +20 +C0 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +F8 +80 +80 +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +F8 +80 +80 +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +F8 +80 +80 +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +F8 +80 +80 +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 10 1 0 +BITMAP +80 +40 +00 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 10 2 0 +BITMAP +40 +80 +00 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +40 +A0 +00 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +A0 +00 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +50 +48 +E8 +48 +48 +50 +60 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +A8 +90 +88 +C8 +C8 +A8 +98 +98 +88 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +A8 +90 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +08 +70 +98 +98 +A8 +A8 +C8 +C8 +70 +80 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +88 +88 +50 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +90 +90 +B0 +88 +88 +C8 +B0 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +00 +70 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +70 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +00 +70 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +A8 +90 +00 +70 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +70 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +20 +00 +70 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +28 +68 +B0 +A0 +78 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +78 +80 +80 +80 +80 +78 +20 +C0 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +00 +70 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +70 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +00 +70 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +70 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 9 1 0 +BITMAP +80 +40 +00 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 9 2 0 +BITMAP +40 +80 +00 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +40 +A0 +00 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +A0 +00 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +18 +30 +08 +78 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +A8 +90 +00 +F0 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +A8 +90 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +20 +00 +F8 +00 +20 +20 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +08 +70 +98 +A8 +A8 +C8 +70 +80 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +00 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +00 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +20 +00 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +80 +80 +F0 +88 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +50 +00 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR Amacron +ENCODING 256 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +70 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR amacron +ENCODING 257 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +00 +70 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR Abreve +ENCODING 258 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR abreve +ENCODING 259 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +70 +00 +70 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR Aogonek +ENCODING 260 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +70 +88 +88 +88 +F8 +88 +88 +88 +10 +0C +ENDCHAR +STARTCHAR aogonek +ENCODING 261 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +70 +08 +78 +88 +88 +78 +10 +0C +ENDCHAR +STARTCHAR Cacute +ENCODING 262 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +78 +80 +80 +80 +80 +80 +80 +78 +ENDCHAR +STARTCHAR cacute +ENCODING 263 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +78 +80 +80 +80 +80 +78 +ENDCHAR +STARTCHAR Ccircumflex +ENCODING 264 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +78 +80 +80 +80 +80 +80 +80 +78 +ENDCHAR +STARTCHAR ccircumflex +ENCODING 265 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +00 +78 +80 +80 +80 +80 +78 +ENDCHAR +STARTCHAR Cdotaccent +ENCODING 266 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +78 +80 +80 +80 +80 +80 +80 +78 +ENDCHAR +STARTCHAR cdotaccent +ENCODING 267 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +78 +80 +80 +80 +80 +78 +ENDCHAR +STARTCHAR Ccaron +ENCODING 268 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +78 +80 +80 +80 +80 +80 +80 +78 +ENDCHAR +STARTCHAR ccaron +ENCODING 269 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +20 +00 +78 +80 +80 +80 +80 +78 +ENDCHAR +STARTCHAR Dcaron +ENCODING 270 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +E0 +90 +88 +88 +88 +88 +90 +E0 +ENDCHAR +STARTCHAR dcaron +ENCODING 271 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +08 +08 +78 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR Dcroat +ENCODING 272 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +50 +48 +E8 +48 +48 +50 +60 +ENDCHAR +STARTCHAR dcroat +ENCODING 273 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +08 +3C +08 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR Emacron +ENCODING 274 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +F8 +80 +80 +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR emacron +ENCODING 275 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +00 +70 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR Ebreve +ENCODING 276 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +F8 +80 +80 +F8 +80 +80 +F8 +ENDCHAR +STARTCHAR ebreve +ENCODING 277 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +70 +00 +70 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR Edotaccent +ENCODING 278 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +F8 +80 +80 +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR edotaccent +ENCODING 279 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +70 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR Eogonek +ENCODING 280 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +F8 +80 +80 +F8 +80 +80 +80 +F8 +10 +0C +ENDCHAR +STARTCHAR eogonek +ENCODING 281 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +70 +88 +F8 +80 +80 +78 +20 +18 +ENDCHAR +STARTCHAR Ecaron +ENCODING 282 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +F8 +80 +80 +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR ecaron +ENCODING 283 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +20 +00 +70 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR Gcircumflex +ENCODING 284 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +78 +80 +80 +80 +98 +88 +88 +70 +ENDCHAR +STARTCHAR gcircumflex +ENCODING 285 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +20 +50 +00 +78 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR Gbreve +ENCODING 286 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +78 +80 +80 +98 +88 +88 +70 +ENDCHAR +STARTCHAR gbreve +ENCODING 287 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +88 +70 +00 +78 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR Gdotaccent +ENCODING 288 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +78 +80 +80 +80 +98 +88 +88 +70 +ENDCHAR +STARTCHAR gdotaccent +ENCODING 289 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +00 +78 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR Gcommaaccent +ENCODING 290 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +78 +80 +80 +80 +98 +88 +88 +70 +20 +C0 +ENDCHAR +STARTCHAR gcommaaccent +ENCODING 291 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +18 +20 +78 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR Hcircumflex +ENCODING 292 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +88 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR hcircumflex +ENCODING 293 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +80 +80 +F0 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Hbar +ENCODING 294 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +48 +FC +48 +78 +48 +48 +48 +48 +ENDCHAR +STARTCHAR hbar +ENCODING 295 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +F0 +40 +70 +48 +48 +48 +48 +ENDCHAR +STARTCHAR Itilde +ENCODING 296 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +A8 +90 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR itilde +ENCODING 297 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +A8 +90 +00 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Imacron +ENCODING 298 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +E0 +00 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR imacron +ENCODING 299 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +E0 +00 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR Ibreve +ENCODING 300 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR ibreve +ENCODING 301 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +70 +00 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Iogonek +ENCODING 302 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 -2 +BITMAP +40 +40 +40 +40 +40 +40 +40 +40 +80 +60 +ENDCHAR +STARTCHAR iogonek +ENCODING 303 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 11 1 -2 +BITMAP +40 +40 +00 +40 +40 +40 +40 +40 +40 +80 +60 +ENDCHAR +STARTCHAR Idotaccent +ENCODING 304 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 10 2 0 +BITMAP +80 +00 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR dotlessi +ENCODING 305 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 6 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR IJ +ENCODING 306 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +88 +88 +88 +88 +88 +B0 +ENDCHAR +STARTCHAR ij +ENCODING 307 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 11 1 -2 +BITMAP +90 +90 +00 +90 +90 +90 +90 +90 +90 +10 +60 +ENDCHAR +STARTCHAR Jcircumflex +ENCODING 308 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +28 +00 +10 +10 +10 +10 +10 +10 +E0 +ENDCHAR +STARTCHAR jcircumflex +ENCODING 309 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 11 0 -2 +BITMAP +20 +50 +00 +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR Kcommaaccent +ENCODING 310 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +90 +A0 +C0 +C0 +A0 +90 +88 +20 +C0 +ENDCHAR +STARTCHAR kcommaaccent +ENCODING 311 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +40 +40 +48 +50 +60 +60 +50 +48 +20 +C0 +ENDCHAR +STARTCHAR kgreenlandic +ENCODING 312 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +90 +A0 +C0 +C0 +A0 +90 +ENDCHAR +STARTCHAR Lacute +ENCODING 313 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +40 +80 +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR lacute +ENCODING 314 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 10 2 0 +BITMAP +40 +80 +00 +80 +80 +80 +80 +80 +80 +40 +ENDCHAR +STARTCHAR Lcommaaccent +ENCODING 315 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +F8 +20 +C0 +ENDCHAR +STARTCHAR lcommaaccent +ENCODING 316 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR Lcaron +ENCODING 317 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +80 +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR lcaron +ENCODING 318 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +A0 +40 +00 +40 +40 +40 +40 +40 +40 +20 +ENDCHAR +STARTCHAR Ldot +ENCODING 319 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +90 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR ldot +ENCODING 320 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 8 2 0 +BITMAP +80 +80 +80 +A0 +80 +80 +80 +40 +ENDCHAR +STARTCHAR Lslash +ENCODING 321 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +40 +40 +40 +60 +C0 +40 +40 +7C +ENDCHAR +STARTCHAR lslash +ENCODING 322 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +40 +40 +40 +60 +C0 +40 +40 +20 +ENDCHAR +STARTCHAR Nacute +ENCODING 323 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +88 +C8 +C8 +A8 +A8 +98 +98 +88 +ENDCHAR +STARTCHAR nacute +ENCODING 324 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +F0 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Ncommaaccent +ENCODING 325 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +C8 +C8 +A8 +A8 +98 +98 +88 +20 +C0 +ENDCHAR +STARTCHAR ncommaaccent +ENCODING 326 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F0 +88 +88 +88 +88 +88 +20 +C0 +ENDCHAR +STARTCHAR Ncaron +ENCODING 327 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +88 +C8 +C8 +A8 +A8 +98 +98 +88 +ENDCHAR +STARTCHAR ncaron +ENCODING 328 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +20 +00 +F0 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR napostrophe +ENCODING 329 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +40 +80 +00 +F0 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Eng +ENCODING 330 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +C8 +C8 +A8 +A8 +98 +98 +88 +08 +10 +ENDCHAR +STARTCHAR eng +ENCODING 331 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F0 +88 +88 +88 +88 +88 +08 +10 +ENDCHAR +STARTCHAR Omacron +ENCODING 332 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR omacron +ENCODING 333 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Obreve +ENCODING 334 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR obreve +ENCODING 335 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +70 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Ohungarumlaut +ENCODING 336 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +28 +50 +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ohungarumlaut +ENCODING 337 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +50 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR OE +ENCODING 338 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +7C +90 +90 +9C +90 +90 +90 +7C +ENDCHAR +STARTCHAR oe +ENCODING 339 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +A8 +A8 +B0 +A0 +78 +ENDCHAR +STARTCHAR Racute +ENCODING 340 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +F0 +88 +88 +88 +F0 +A0 +90 +88 +ENDCHAR +STARTCHAR racute +ENCODING 341 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +78 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Rcommaaccent +ENCODING 342 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F0 +88 +88 +88 +F0 +A0 +90 +88 +20 +C0 +ENDCHAR +STARTCHAR rcommaaccent +ENCODING 343 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +78 +80 +80 +80 +80 +80 +20 +C0 +ENDCHAR +STARTCHAR Rcaron +ENCODING 344 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +F0 +88 +88 +88 +F0 +A0 +90 +88 +ENDCHAR +STARTCHAR rcaron +ENCODING 345 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +20 +00 +78 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Sacute +ENCODING 346 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +78 +80 +80 +70 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR sacute +ENCODING 347 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +78 +80 +70 +08 +08 +F0 +ENDCHAR +STARTCHAR Scircumflex +ENCODING 348 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +78 +80 +80 +70 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR scircumflex +ENCODING 349 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +00 +78 +80 +70 +08 +08 +F0 +ENDCHAR +STARTCHAR Scedilla +ENCODING 350 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +78 +80 +80 +70 +08 +08 +08 +F0 +20 +C0 +ENDCHAR +STARTCHAR scedilla +ENCODING 351 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +78 +80 +70 +08 +08 +F0 +20 +C0 +ENDCHAR +STARTCHAR Scaron +ENCODING 352 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +78 +80 +80 +70 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR scaron +ENCODING 353 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +20 +00 +78 +80 +70 +08 +08 +F0 +ENDCHAR +STARTCHAR Tcommaaccent +ENCODING 354 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +10 +60 +ENDCHAR +STARTCHAR tcommaaccent +ENCODING 355 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 0 -2 +BITMAP +40 +40 +70 +40 +40 +40 +40 +30 +20 +C0 +ENDCHAR +STARTCHAR Tcaron +ENCODING 356 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +F8 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR tcaron +ENCODING 357 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +A0 +40 +80 +80 +E0 +80 +80 +80 +80 +60 +ENDCHAR +STARTCHAR Tbar +ENCODING 358 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +20 +20 +70 +20 +20 +20 +20 +ENDCHAR +STARTCHAR tbar +ENCODING 359 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 0 0 +BITMAP +40 +40 +70 +40 +E0 +40 +40 +30 +ENDCHAR +STARTCHAR Utilde +ENCODING 360 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR utilde +ENCODING 361 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +A8 +90 +00 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR Umacron +ENCODING 362 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR umacron +ENCODING 363 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +00 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR Ubreve +ENCODING 364 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ubreve +ENCODING 365 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +70 +00 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR Uring +ENCODING 366 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +20 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uring +ENCODING 367 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +20 +00 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR Uhungarumlaut +ENCODING 368 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +28 +50 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uhungarumlaut +ENCODING 369 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +28 +50 +00 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR Uogonek +ENCODING 370 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +88 +88 +88 +88 +88 +88 +70 +20 +18 +ENDCHAR +STARTCHAR uogonek +ENCODING 371 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +88 +88 +88 +88 +88 +78 +10 +0C +ENDCHAR +STARTCHAR Wcircumflex +ENCODING 372 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +88 +88 +88 +88 +A8 +A8 +D8 +88 +ENDCHAR +STARTCHAR wcircumflex +ENCODING 373 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +00 +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR Ycircumflex +ENCODING 374 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +88 +88 +50 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR ycircumflex +ENCODING 375 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +20 +50 +00 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR Ydieresis +ENCODING 376 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +88 +88 +50 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Zacute +ENCODING 377 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +F8 +08 +10 +20 +40 +80 +80 +F8 +ENDCHAR +STARTCHAR zacute +ENCODING 378 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +F8 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR Zdotaccent +ENCODING 379 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +F8 +08 +10 +20 +40 +80 +80 +F8 +ENDCHAR +STARTCHAR zdotaccent +ENCODING 380 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +F8 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR Zcaron +ENCODING 381 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +F8 +08 +10 +20 +40 +80 +80 +F8 +ENDCHAR +STARTCHAR zcaron +ENCODING 382 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +D0 +20 +00 +F8 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR longs +ENCODING 383 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 8 2 0 +BITMAP +60 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni0180 +ENCODING 384 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +E0 +40 +70 +48 +48 +48 +70 +ENDCHAR +STARTCHAR uni0181 +ENCODING 385 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +C0 +70 +48 +48 +70 +48 +48 +48 +70 +ENDCHAR +STARTCHAR uni0182 +ENCODING 386 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F0 +80 +80 +F0 +88 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR uni0183 +ENCODING 387 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +80 +F0 +88 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR uni0184 +ENCODING 388 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +C0 +C0 +70 +48 +48 +48 +70 +ENDCHAR +STARTCHAR uni0185 +ENCODING 389 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +C0 +F0 +48 +48 +48 +48 +70 +ENDCHAR +STARTCHAR uni0186 +ENCODING 390 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +08 +08 +08 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR uni0187 +ENCODING 391 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +04 +08 +78 +80 +80 +80 +80 +80 +80 +78 +ENDCHAR +STARTCHAR uni0188 +ENCODING 392 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +04 +08 +78 +80 +80 +80 +80 +78 +ENDCHAR +STARTCHAR uni0189 +ENCODING 393 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +50 +48 +E8 +48 +48 +50 +60 +ENDCHAR +STARTCHAR uni018A +ENCODING 394 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +C0 +60 +50 +48 +48 +48 +48 +50 +60 +ENDCHAR +STARTCHAR uni018B +ENCODING 395 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +78 +08 +08 +78 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni018C +ENCODING 396 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +08 +78 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni018D +ENCODING 397 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +88 +70 +20 +10 +60 +ENDCHAR +STARTCHAR uni018E +ENCODING 398 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +08 +08 +78 +08 +08 +08 +F8 +ENDCHAR +STARTCHAR uni018F +ENCODING 399 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +08 +08 +08 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni0190 +ENCODING 400 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +80 +80 +70 +80 +80 +80 +78 +ENDCHAR +STARTCHAR uni0191 +ENCODING 401 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +78 +40 +40 +78 +40 +40 +40 +40 +80 +ENDCHAR +STARTCHAR florin +ENCODING 402 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +18 +20 +20 +38 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni0193 +ENCODING 403 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +04 +78 +80 +80 +80 +98 +88 +88 +70 +ENDCHAR +STARTCHAR uni0194 +ENCODING 404 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +50 +20 +50 +88 +88 +70 +ENDCHAR +STARTCHAR uni0195 +ENCODING 405 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +C0 +A8 +A8 +A8 +A8 +90 +ENDCHAR +STARTCHAR uni0196 +ENCODING 406 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +70 +ENDCHAR +STARTCHAR uni0197 +ENCODING 407 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +40 +40 +40 +40 +E0 +40 +40 +40 +ENDCHAR +STARTCHAR uni0198 +ENCODING 408 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +0C +90 +90 +A0 +C0 +C0 +A0 +90 +90 +ENDCHAR +STARTCHAR uni0199 +ENCODING 409 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +40 +80 +80 +80 +90 +A0 +C0 +C0 +A0 +90 +ENDCHAR +STARTCHAR uni019A +ENCODING 410 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +40 +40 +40 +40 +E0 +40 +40 +20 +ENDCHAR +STARTCHAR uni019B +ENCODING 411 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +60 +A0 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni019C +ENCODING 412 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +A8 +58 +ENDCHAR +STARTCHAR uni019D +ENCODING 413 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +88 +C8 +A8 +98 +88 +88 +C8 +40 +80 +ENDCHAR +STARTCHAR uni019E +ENCODING 414 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F0 +88 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni019F +ENCODING 415 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Ohorn +ENCODING 416 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +04 +74 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ohorn +ENCODING 417 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +04 +74 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01A2 +ENCODING 418 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +64 +9C +94 +94 +94 +94 +94 +64 +ENDCHAR +STARTCHAR uni01A3 +ENCODING 419 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +64 +9C +94 +94 +94 +64 +04 +04 +ENDCHAR +STARTCHAR uni01A4 +ENCODING 420 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +A8 +28 +28 +30 +20 +20 +20 +ENDCHAR +STARTCHAR uni01A5 +ENCODING 421 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +70 +A8 +28 +28 +28 +30 +20 +20 +ENDCHAR +STARTCHAR uni01A6 +ENCODING 422 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +80 +F0 +88 +88 +88 +F0 +C0 +A0 +90 +08 +ENDCHAR +STARTCHAR uni01A7 +ENCODING 423 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +08 +08 +70 +80 +80 +80 +78 +ENDCHAR +STARTCHAR uni01A8 +ENCODING 424 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +08 +70 +80 +80 +78 +ENDCHAR +STARTCHAR uni01A9 +ENCODING 425 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +40 +20 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR uni01AA +ENCODING 426 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +40 +A0 +60 +20 +20 +20 +20 +20 +20 +20 +20 +10 +ENDCHAR +STARTCHAR uni01AB +ENCODING 427 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 3 10 1 -2 +BITMAP +80 +80 +E0 +80 +80 +80 +80 +60 +20 +40 +ENDCHAR +STARTCHAR uni01AC +ENCODING 428 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +7C +90 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni01AD +ENCODING 429 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +40 +80 +80 +E0 +80 +80 +80 +80 +60 +ENDCHAR +STARTCHAR uni01AE +ENCODING 430 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR Uhorn +ENCODING 431 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +04 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uhorn +ENCODING 432 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +04 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni01B1 +ENCODING 433 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +50 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01B2 +ENCODING 434 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +04 +88 +88 +88 +50 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni01B3 +ENCODING 435 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +04 +88 +88 +50 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni01B4 +ENCODING 436 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +04 +08 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni01B5 +ENCODING 437 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +08 +10 +F8 +40 +80 +80 +F8 +ENDCHAR +STARTCHAR uni01B6 +ENCODING 438 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +10 +F8 +40 +80 +F8 +ENDCHAR +STARTCHAR uni01B7 +ENCODING 439 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +08 +10 +30 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR uni01B8 +ENCODING 440 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +80 +40 +60 +80 +80 +80 +78 +ENDCHAR +STARTCHAR uni01B9 +ENCODING 441 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F8 +80 +40 +60 +80 +80 +80 +78 +ENDCHAR +STARTCHAR uni01BA +ENCODING 442 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F8 +08 +30 +08 +08 +F0 +80 +70 +ENDCHAR +STARTCHAR uni01BB +ENCODING 443 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +08 +08 +10 +F8 +40 +80 +F8 +ENDCHAR +STARTCHAR uni01BC +ENCODING 444 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +80 +80 +F0 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR uni01BD +ENCODING 445 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F8 +80 +80 +F0 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR uni01BE +ENCODING 446 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +20 +10 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR uni01BF +ENCODING 447 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +B0 +C8 +88 +88 +90 +E0 +80 +80 +ENDCHAR +STARTCHAR uni01C0 +ENCODING 448 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 8 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni01C1 +ENCODING 449 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni01C2 +ENCODING 450 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +F8 +20 +20 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni01C3 +ENCODING 451 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 8 2 0 +BITMAP +80 +80 +80 +80 +80 +00 +80 +80 +ENDCHAR +STARTCHAR uni01C4 +ENCODING 452 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +14 +08 +DC +A4 +A4 +A8 +A8 +B0 +B0 +DC +ENDCHAR +STARTCHAR uni01C5 +ENCODING 453 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +D4 +A8 +BC +A4 +A8 +A8 +B0 +DC +ENDCHAR +STARTCHAR uni01C6 +ENCODING 454 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +34 +28 +7C +A4 +A8 +A8 +B0 +7C +ENDCHAR +STARTCHAR uni01C7 +ENCODING 455 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +8C +84 +84 +84 +84 +84 +84 +D8 +ENDCHAR +STARTCHAR uni01C8 +ENCODING 456 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +04 +84 +80 +84 +84 +84 +84 +84 +F4 +04 +18 +ENDCHAR +STARTCHAR uni01C9 +ENCODING 457 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +08 +88 +80 +88 +88 +88 +88 +88 +48 +08 +30 +ENDCHAR +STARTCHAR uni01CA +ENCODING 458 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +94 +94 +D4 +D4 +B4 +B4 +94 +98 +ENDCHAR +STARTCHAR uni01CB +ENCODING 459 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +04 +94 +90 +D4 +D4 +B4 +B4 +94 +94 +04 +18 +ENDCHAR +STARTCHAR uni01CC +ENCODING 460 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +04 +04 +00 +E4 +94 +94 +94 +94 +94 +04 +18 +ENDCHAR +STARTCHAR uni01CD +ENCODING 461 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +70 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni01CE +ENCODING 462 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +20 +00 +70 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR uni01CF +ENCODING 463 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +A0 +40 +00 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni01D0 +ENCODING 464 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +A0 +40 +00 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni01D1 +ENCODING 465 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D2 +ENCODING 466 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +20 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D3 +ENCODING 467 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D4 +ENCODING 468 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +50 +20 +00 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni01D5 +ENCODING 469 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +50 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D6 +ENCODING 470 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +50 +00 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni01D7 +ENCODING 471 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +50 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D8 +ENCODING 472 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +50 +00 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni01D9 +ENCODING 473 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +50 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01DA +ENCODING 474 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +00 +50 +00 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni01DB +ENCODING 475 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +50 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01DC +ENCODING 476 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +50 +00 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni01DD +ENCODING 477 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +08 +08 +F8 +88 +70 +ENDCHAR +STARTCHAR uni01DE +ENCODING 478 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +50 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni01DF +ENCODING 479 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +50 +00 +70 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR uni01E0 +ENCODING 480 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +20 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni01E1 +ENCODING 481 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +20 +00 +70 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR uni01E2 +ENCODING 482 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +70 +00 +7C +90 +90 +FC +90 +90 +90 +9C +ENDCHAR +STARTCHAR uni01E3 +ENCODING 483 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +00 +70 +28 +68 +B0 +A0 +78 +ENDCHAR +STARTCHAR uni01E4 +ENCODING 484 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +78 +80 +80 +98 +88 +9C +88 +70 +ENDCHAR +STARTCHAR uni01E5 +ENCODING 485 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +78 +88 +88 +9C +88 +78 +08 +70 +ENDCHAR +STARTCHAR Gcaron +ENCODING 486 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +78 +80 +80 +80 +98 +88 +88 +70 +ENDCHAR +STARTCHAR gcaron +ENCODING 487 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +50 +20 +00 +78 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni01E8 +ENCODING 488 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +88 +90 +A0 +C0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni01E9 +ENCODING 489 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +A0 +40 +80 +80 +90 +A0 +C0 +C0 +A0 +90 +ENDCHAR +STARTCHAR uni01EA +ENCODING 490 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +88 +88 +88 +88 +88 +88 +70 +20 +18 +ENDCHAR +STARTCHAR uni01EB +ENCODING 491 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +70 +88 +88 +88 +88 +70 +20 +18 +ENDCHAR +STARTCHAR uni01EC +ENCODING 492 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +70 +00 +70 +88 +88 +88 +88 +88 +88 +70 +20 +18 +ENDCHAR +STARTCHAR uni01ED +ENCODING 493 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +00 +70 +88 +88 +88 +88 +70 +20 +18 +ENDCHAR +STARTCHAR uni01EE +ENCODING 494 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +F8 +08 +10 +30 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR uni01EF +ENCODING 495 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +50 +20 +00 +F8 +08 +10 +30 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR uni01F0 +ENCODING 496 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 11 0 -2 +BITMAP +50 +20 +00 +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni01F1 +ENCODING 497 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +DC +A4 +A4 +A8 +A8 +B0 +B0 +DC +ENDCHAR +STARTCHAR uni01F2 +ENCODING 498 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +C0 +A0 +BC +A4 +A8 +A8 +B0 +DC +ENDCHAR +STARTCHAR uni01F3 +ENCODING 499 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +20 +20 +7C +A4 +A8 +A8 +B0 +7C +ENDCHAR +STARTCHAR uni01F4 +ENCODING 500 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +78 +80 +80 +80 +98 +88 +88 +70 +ENDCHAR +STARTCHAR uni01F5 +ENCODING 501 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +20 +00 +78 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni01F6 +ENCODING 502 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A0 +A0 +A0 +E8 +A8 +A8 +A8 +90 +ENDCHAR +STARTCHAR uni01F7 +ENCODING 503 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +88 +88 +90 +E0 +80 +80 +80 +ENDCHAR +STARTCHAR uni01F8 +ENCODING 504 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +88 +C8 +C8 +A8 +A8 +98 +98 +88 +ENDCHAR +STARTCHAR uni01F9 +ENCODING 505 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +00 +F0 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Aringacute +ENCODING 506 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +50 +20 +70 +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR aringacute +ENCODING 507 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +50 +20 +70 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR AEacute +ENCODING 508 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +10 +20 +7C +90 +90 +FC +90 +90 +90 +9C +ENDCHAR +STARTCHAR aeacute +ENCODING 509 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +70 +28 +68 +B0 +A0 +78 +ENDCHAR +STARTCHAR Oslashacute +ENCODING 510 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -1 +BITMAP +20 +48 +70 +98 +98 +A8 +A8 +C8 +C8 +70 +80 +ENDCHAR +STARTCHAR oslashacute +ENCODING 511 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +20 +48 +70 +98 +A8 +A8 +C8 +70 +80 +ENDCHAR +STARTCHAR uni0200 +ENCODING 512 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +A0 +50 +70 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni0201 +ENCODING 513 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A0 +50 +00 +70 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR uni0202 +ENCODING 514 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +70 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni0203 +ENCODING 515 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +00 +70 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR uni0204 +ENCODING 516 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +A0 +50 +F8 +80 +80 +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni0205 +ENCODING 517 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A0 +50 +00 +70 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR uni0206 +ENCODING 518 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +00 +F8 +80 +80 +F8 +80 +80 +F8 +ENDCHAR +STARTCHAR uni0207 +ENCODING 519 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +00 +70 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR uni0208 +ENCODING 520 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 0 0 +BITMAP +A0 +50 +00 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni0209 +ENCODING 521 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 9 0 0 +BITMAP +A0 +50 +00 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni020A +ENCODING 522 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni020B +ENCODING 523 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +00 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni020C +ENCODING 524 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +A0 +50 +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni020D +ENCODING 525 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A0 +50 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni020E +ENCODING 526 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni020F +ENCODING 527 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0210 +ENCODING 528 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +A0 +50 +F0 +88 +88 +88 +F0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni0211 +ENCODING 529 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A0 +50 +00 +78 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni0212 +ENCODING 530 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +00 +F0 +88 +88 +F0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni0213 +ENCODING 531 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +00 +78 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni0214 +ENCODING 532 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +A0 +50 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0215 +ENCODING 533 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A0 +50 +00 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni0216 +ENCODING 534 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0217 +ENCODING 535 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +00 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR Scommaaccent +ENCODING 536 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +78 +80 +80 +70 +08 +08 +08 +F0 +20 +40 +ENDCHAR +STARTCHAR scommaaccent +ENCODING 537 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +78 +80 +70 +08 +08 +F0 +20 +40 +ENDCHAR +STARTCHAR uni021A +ENCODING 538 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +20 +40 +ENDCHAR +STARTCHAR uni021B +ENCODING 539 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 -2 +BITMAP +80 +80 +E0 +80 +80 +80 +80 +60 +40 +80 +ENDCHAR +STARTCHAR uni021C +ENCODING 540 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +08 +08 +30 +08 +08 +30 +C0 +ENDCHAR +STARTCHAR uni021D +ENCODING 541 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F0 +08 +08 +30 +08 +08 +30 +C0 +ENDCHAR +STARTCHAR uni021E +ENCODING 542 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +88 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni021F +ENCODING 543 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +20 +80 +80 +F0 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni0220 +ENCODING 544 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +B0 +C8 +88 +88 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni0221 +ENCODING 545 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +20 +20 +60 +A0 +A0 +A8 +B4 +78 +10 +10 +ENDCHAR +STARTCHAR uni0222 +ENCODING 546 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +88 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0223 +ENCODING 547 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +70 +88 +88 +70 +ENDCHAR +STARTCHAR uni0224 +ENCODING 548 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F8 +08 +10 +20 +40 +80 +80 +F8 +08 +10 +ENDCHAR +STARTCHAR uni0225 +ENCODING 549 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F8 +10 +20 +40 +80 +F8 +08 +10 +ENDCHAR +STARTCHAR uni0226 +ENCODING 550 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +70 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni0227 +ENCODING 551 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +70 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR uni0228 +ENCODING 552 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F8 +80 +80 +F8 +80 +80 +80 +F8 +20 +C0 +ENDCHAR +STARTCHAR uni0229 +ENCODING 553 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +70 +88 +F8 +80 +80 +78 +20 +C0 +ENDCHAR +STARTCHAR uni022A +ENCODING 554 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +50 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022B +ENCODING 555 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +50 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022C +ENCODING 556 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +68 +B0 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022D +ENCODING 557 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +68 +B0 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022E +ENCODING 558 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022F +ENCODING 559 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0230 +ENCODING 560 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +20 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0231 +ENCODING 561 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +20 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0232 +ENCODING 562 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +88 +88 +50 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni0233 +ENCODING 563 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +00 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni0234 +ENCODING 564 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 -2 +BITMAP +80 +80 +80 +80 +80 +A0 +D0 +60 +40 +40 +ENDCHAR +STARTCHAR uni0235 +ENCODING 565 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +C0 +A0 +A0 +A0 +A0 +A8 +B4 +B8 +10 +10 +ENDCHAR +STARTCHAR uni0236 +ENCODING 566 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +80 +80 +E0 +80 +80 +90 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni0237 +ENCODING 567 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 8 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni0238 +ENCODING 568 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +70 +A8 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni0239 +ENCODING 569 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +70 +A8 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni023A +ENCODING 570 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +10 +70 +98 +A8 +A8 +F8 +A8 +C8 +C8 +40 +ENDCHAR +STARTCHAR uni023B +ENCODING 571 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +10 +78 +90 +A0 +A0 +A0 +A0 +C0 +78 +40 +ENDCHAR +STARTCHAR uni023C +ENCODING 572 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +10 +78 +90 +A0 +A0 +C0 +78 +40 +ENDCHAR +STARTCHAR uni023D +ENCODING 573 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +40 +40 +E0 +40 +40 +40 +78 +ENDCHAR +STARTCHAR uni023E +ENCODING 574 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +20 +20 +28 +30 +20 +60 +A0 +ENDCHAR +STARTCHAR uni023F +ENCODING 575 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +78 +80 +80 +70 +08 +08 +F0 +40 +20 +10 +ENDCHAR +STARTCHAR uni0240 +ENCODING 576 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F8 +10 +20 +40 +80 +80 +60 +10 +ENDCHAR +STARTCHAR uni0241 +ENCODING 577 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +E0 +10 +10 +20 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni0242 +ENCODING 578 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +E0 +10 +20 +40 +40 +40 +ENDCHAR +STARTCHAR uni0243 +ENCODING 579 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +48 +48 +70 +48 +E8 +48 +70 +ENDCHAR +STARTCHAR uni0244 +ENCODING 580 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +48 +48 +48 +FC +48 +48 +48 +30 +ENDCHAR +STARTCHAR uni0245 +ENCODING 581 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +50 +50 +50 +88 +88 +88 +ENDCHAR +STARTCHAR uni0246 +ENCODING 582 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +10 +F8 +90 +A0 +F8 +A0 +A0 +C0 +F8 +40 +ENDCHAR +STARTCHAR uni0247 +ENCODING 583 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +10 +70 +98 +F8 +A0 +C0 +78 +40 +ENDCHAR +STARTCHAR uni0248 +ENCODING 584 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +10 +10 +38 +10 +10 +10 +E0 +ENDCHAR +STARTCHAR uni0249 +ENCODING 585 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 4 11 0 -2 +BITMAP +20 +20 +00 +20 +20 +20 +70 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni024A +ENCODING 586 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +78 +88 +88 +88 +78 +08 +08 +08 +08 +04 +ENDCHAR +STARTCHAR uni024B +ENCODING 587 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +78 +88 +88 +88 +78 +08 +08 +04 +ENDCHAR +STARTCHAR uni024C +ENCODING 588 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +48 +48 +48 +F0 +60 +50 +48 +ENDCHAR +STARTCHAR uni024D +ENCODING 589 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +38 +40 +40 +F0 +40 +40 +ENDCHAR +STARTCHAR uni024E +ENCODING 590 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +50 +50 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni024F +ENCODING 591 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +48 +48 +48 +F8 +48 +38 +08 +70 +ENDCHAR +STARTCHAR uni0250 +ENCODING 592 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +88 +88 +F0 +80 +70 +ENDCHAR +STARTCHAR uni0251 +ENCODING 593 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +68 +98 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni0252 +ENCODING 594 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +B0 +C8 +88 +88 +C8 +B0 +ENDCHAR +STARTCHAR uni0253 +ENCODING 595 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +80 +80 +F0 +88 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR uni0254 +ENCODING 596 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +08 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR uni0255 +ENCODING 597 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +78 +80 +80 +90 +A8 +70 +20 +ENDCHAR +STARTCHAR uni0256 +ENCODING 598 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +08 +08 +78 +88 +88 +88 +88 +78 +08 +04 +ENDCHAR +STARTCHAR uni0257 +ENCODING 599 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +04 +08 +08 +08 +78 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni0258 +ENCODING 600 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +F8 +08 +08 +F0 +ENDCHAR +STARTCHAR uni0259 +ENCODING 601 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +08 +08 +F8 +88 +70 +ENDCHAR +STARTCHAR uni025A +ENCODING 602 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +60 +1C +68 +88 +88 +70 +ENDCHAR +STARTCHAR uni025B +ENCODING 603 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +80 +70 +80 +80 +78 +ENDCHAR +STARTCHAR uni025C +ENCODING 604 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +08 +70 +08 +08 +F0 +ENDCHAR +STARTCHAR uni025D +ENCODING 605 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +08 +F0 +08 +70 +08 +08 +F0 +ENDCHAR +STARTCHAR uni025E +ENCODING 606 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +B0 +88 +88 +70 +ENDCHAR +STARTCHAR uni025F +ENCODING 607 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 4 8 1 -2 +BITMAP +20 +20 +20 +70 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni0260 +ENCODING 608 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +04 +78 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni0261 +ENCODING 609 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +78 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni0262 +ENCODING 610 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR uni0263 +ENCODING 611 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +50 +20 +50 +88 +70 +ENDCHAR +STARTCHAR uni0264 +ENCODING 612 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 5 1 1 +BITMAP +A0 +40 +A0 +A0 +40 +ENDCHAR +STARTCHAR uni0265 +ENCODING 613 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni0266 +ENCODING 614 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +80 +80 +F0 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni0267 +ENCODING 615 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +40 +80 +80 +80 +F0 +88 +88 +88 +88 +88 +08 +10 +ENDCHAR +STARTCHAR uni0268 +ENCODING 616 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +20 +00 +20 +20 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni0269 +ENCODING 617 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +E0 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni026A +ENCODING 618 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 1 6 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni026B +ENCODING 619 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +20 +68 +B0 +20 +20 +10 +ENDCHAR +STARTCHAR uni026C +ENCODING 620 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 0 0 +BITMAP +20 +20 +60 +A0 +70 +20 +20 +10 +ENDCHAR +STARTCHAR uni026D +ENCODING 621 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 3 10 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +60 +ENDCHAR +STARTCHAR uni026E +ENCODING 622 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +80 +80 +BC +84 +88 +98 +84 +44 +08 +30 +ENDCHAR +STARTCHAR uni026F +ENCODING 623 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +78 +ENDCHAR +STARTCHAR uni0270 +ENCODING 624 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +A8 +A8 +A8 +A8 +A8 +78 +08 +08 +ENDCHAR +STARTCHAR uni0271 +ENCODING 625 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +D0 +A8 +A8 +A8 +A8 +A8 +08 +10 +ENDCHAR +STARTCHAR uni0272 +ENCODING 626 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +70 +48 +48 +48 +48 +48 +40 +80 +ENDCHAR +STARTCHAR uni0273 +ENCODING 627 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +E0 +90 +90 +90 +90 +90 +10 +08 +ENDCHAR +STARTCHAR uni0274 +ENCODING 628 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +C8 +A8 +A8 +98 +88 +ENDCHAR +STARTCHAR uni0275 +ENCODING 629 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni0276 +ENCODING 630 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +7C +90 +9C +90 +90 +7C +ENDCHAR +STARTCHAR uni0277 +ENCODING 631 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni0278 +ENCODING 632 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +20 +70 +A8 +A8 +70 +20 +70 +ENDCHAR +STARTCHAR uni0279 +ENCODING 633 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +08 +08 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR uni027A +ENCODING 634 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +08 +08 +08 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR uni027B +ENCODING 635 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +08 +08 +08 +08 +08 +F0 +10 +08 +ENDCHAR +STARTCHAR uni027C +ENCODING 636 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +78 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni027D +ENCODING 637 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +78 +80 +80 +80 +80 +80 +80 +40 +ENDCHAR +STARTCHAR uni027E +ENCODING 638 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +18 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni027F +ENCODING 639 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +C0 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni0280 +ENCODING 640 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +88 +88 +F0 +90 +88 +ENDCHAR +STARTCHAR uni0281 +ENCODING 641 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +90 +F0 +88 +88 +F0 +ENDCHAR +STARTCHAR uni0282 +ENCODING 642 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +78 +80 +70 +08 +08 +F0 +80 +40 +ENDCHAR +STARTCHAR uni0283 +ENCODING 643 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +18 +20 +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni0284 +ENCODING 644 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 -2 +BITMAP +10 +20 +20 +20 +20 +70 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni0285 +ENCODING 645 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C0 +20 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni0286 +ENCODING 646 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +18 +20 +20 +20 +20 +20 +20 +78 +A0 +40 +ENDCHAR +STARTCHAR uni0287 +ENCODING 647 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 8 1 -2 +BITMAP +C0 +20 +20 +20 +20 +E0 +20 +20 +ENDCHAR +STARTCHAR uni0288 +ENCODING 648 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 2 -2 +BITMAP +80 +80 +E0 +80 +80 +80 +80 +80 +80 +60 +ENDCHAR +STARTCHAR uni0289 +ENCODING 649 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +48 +48 +FC +48 +48 +38 +ENDCHAR +STARTCHAR uni028A +ENCODING 650 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +D8 +50 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni028B +ENCODING 651 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +04 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni028C +ENCODING 652 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni028D +ENCODING 653 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +50 +A8 +A8 +A8 +88 +88 +ENDCHAR +STARTCHAR uni028E +ENCODING 654 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +70 +80 +F0 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni028F +ENCODING 655 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni0290 +ENCODING 656 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +F8 +10 +20 +40 +80 +F8 +08 +04 +ENDCHAR +STARTCHAR uni0291 +ENCODING 657 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +F8 +10 +20 +48 +94 +F8 +10 +ENDCHAR +STARTCHAR uni0292 +ENCODING 658 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F8 +08 +10 +30 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR uni0293 +ENCODING 659 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +F8 +08 +10 +30 +08 +68 +98 +74 +ENDCHAR +STARTCHAR uni0294 +ENCODING 660 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +E0 +10 +10 +20 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni0295 +ENCODING 661 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +70 +80 +80 +40 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni0296 +ENCODING 662 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +40 +40 +40 +40 +20 +10 +10 +E0 +ENDCHAR +STARTCHAR uni0297 +ENCODING 663 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +70 +80 +80 +80 +80 +80 +80 +70 +ENDCHAR +STARTCHAR uni0298 +ENCODING 664 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni0299 +ENCODING 665 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +88 +F0 +88 +88 +F0 +ENDCHAR +STARTCHAR uni029A +ENCODING 666 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +68 +88 +88 +70 +ENDCHAR +STARTCHAR uni029B +ENCODING 667 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +10 +78 +80 +80 +B8 +88 +70 +ENDCHAR +STARTCHAR uni029C +ENCODING 668 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni029D +ENCODING 669 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +10 +00 +10 +10 +10 +10 +10 +78 +90 +60 +ENDCHAR +STARTCHAR uni029E +ENCODING 670 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +90 +50 +30 +30 +50 +90 +10 +10 +ENDCHAR +STARTCHAR uni029F +ENCODING 671 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni02A0 +ENCODING 672 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +04 +08 +78 +88 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni02A1 +ENCODING 673 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +E0 +10 +10 +20 +40 +40 +E0 +40 +ENDCHAR +STARTCHAR uni02A2 +ENCODING 674 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +70 +80 +80 +40 +20 +20 +70 +20 +ENDCHAR +STARTCHAR uni02A3 +ENCODING 675 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +20 +20 +7C +A4 +A8 +A8 +B0 +7C +ENDCHAR +STARTCHAR uni02A4 +ENCODING 676 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +20 +20 +7C +A4 +A8 +A4 +A4 +64 +18 +ENDCHAR +STARTCHAR uni02A5 +ENCODING 677 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +20 +20 +7C +A4 +A8 +AC +B4 +7C +10 +ENDCHAR +STARTCHAR uni02A6 +ENCODING 678 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +40 +E0 +4C +50 +48 +44 +44 +38 +ENDCHAR +STARTCHAR uni02A7 +ENCODING 679 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +08 +50 +F0 +50 +50 +50 +50 +50 +30 +10 +20 +ENDCHAR +STARTCHAR uni02A8 +ENCODING 680 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +80 +80 +D8 +A4 +A0 +A8 +B4 +78 +10 +ENDCHAR +STARTCHAR uni02A9 +ENCODING 681 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +30 +40 +58 +F4 +54 +54 +54 +54 +04 +08 +ENDCHAR +STARTCHAR uni02AA +ENCODING 682 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +98 +A0 +90 +88 +88 +70 +ENDCHAR +STARTCHAR uni02AB +ENCODING 683 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +B8 +88 +90 +90 +A0 +78 +ENDCHAR +STARTCHAR uni02AC +ENCODING 684 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +A8 +D8 +88 +00 +88 +A8 +D8 +88 +ENDCHAR +STARTCHAR uni02AD +ENCODING 685 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +88 +88 +00 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni02BB +ENCODING 699 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 2 2 8 +BITMAP +40 +80 +ENDCHAR +STARTCHAR afii57929 +ENCODING 700 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 2 2 8 +BITMAP +40 +80 +ENDCHAR +STARTCHAR afii64937 +ENCODING 701 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 2 2 8 +BITMAP +80 +40 +ENDCHAR +STARTCHAR circumflex +ENCODING 710 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 2 1 8 +BITMAP +40 +A0 +ENDCHAR +STARTCHAR caron +ENCODING 711 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 2 1 8 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR breve +ENCODING 728 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +88 +70 +ENDCHAR +STARTCHAR dotaccent +ENCODING 729 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 2 2 8 +BITMAP +80 +80 +ENDCHAR +STARTCHAR ring +ENCODING 730 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR ogonek +ENCODING 731 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 3 3 -2 +BITMAP +40 +80 +60 +ENDCHAR +STARTCHAR tilde +ENCODING 732 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +48 +A8 +90 +ENDCHAR +STARTCHAR hungarumlaut +ENCODING 733 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 2 1 8 +BITMAP +50 +A0 +ENDCHAR +STARTCHAR gravecomb +ENCODING 768 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 2 1 8 +BITMAP +80 +40 +ENDCHAR +STARTCHAR acutecomb +ENCODING 769 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 2 2 8 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0302 +ENCODING 770 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 2 1 8 +BITMAP +40 +A0 +ENDCHAR +STARTCHAR tildecomb +ENCODING 771 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +48 +A8 +90 +ENDCHAR +STARTCHAR uni0306 +ENCODING 774 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +88 +70 +ENDCHAR +STARTCHAR uni0307 +ENCODING 775 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 1 2 9 +BITMAP +80 +ENDCHAR +STARTCHAR uni0308 +ENCODING 776 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 1 1 9 +BITMAP +A0 +ENDCHAR +STARTCHAR uni030C +ENCODING 780 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 2 1 8 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR uni0329 +ENCODING 809 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 2 2 -2 +BITMAP +80 +80 +ENDCHAR +STARTCHAR uni0370 +ENCODING 880 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni0371 +ENCODING 881 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +80 +80 +F8 +80 +80 +80 +ENDCHAR +STARTCHAR uni0372 +ENCODING 882 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +A8 +A8 +A8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni0373 +ENCODING 883 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +A8 +A8 +20 +20 +20 +ENDCHAR +STARTCHAR uni0374 +ENCODING 884 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 3 2 7 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR uni0375 +ENCODING 885 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 3 1 -2 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR uni0376 +ENCODING 886 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +98 +98 +A8 +A8 +C8 +C8 +88 +ENDCHAR +STARTCHAR uni0377 +ENCODING 887 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +98 +A8 +A8 +C8 +88 +ENDCHAR +STARTCHAR uni037A +ENCODING 890 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 3 2 -2 +BITMAP +80 +80 +40 +ENDCHAR +STARTCHAR uni037B +ENCODING 891 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +08 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR uni037C +ENCODING 892 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +80 +A0 +A0 +80 +78 +ENDCHAR +STARTCHAR uni037D +ENCODING 893 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +08 +28 +28 +08 +F0 +ENDCHAR +STARTCHAR uni037E +ENCODING 894 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 7 1 -1 +BITMAP +40 +40 +00 +00 +40 +40 +80 +ENDCHAR +STARTCHAR tonos +ENCODING 900 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 2 0 8 +BITMAP +40 +80 +ENDCHAR +STARTCHAR dieresistonos +ENCODING 901 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +90 +20 +48 +ENDCHAR +STARTCHAR Alphatonos +ENCODING 902 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +70 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR anoteleia +ENCODING 903 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 2 2 4 +BITMAP +80 +80 +ENDCHAR +STARTCHAR Epsilontonos +ENCODING 904 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +F8 +80 +80 +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR Etatonos +ENCODING 905 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +88 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Iotatonos +ENCODING 906 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 0 0 +BITMAP +40 +80 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Omicrontonos +ENCODING 908 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Upsilontonos +ENCODING 910 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +88 +88 +50 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Omegatonos +ENCODING 911 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +70 +88 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR iotadieresistonos +ENCODING 912 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +20 +48 +00 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR Alpha +ENCODING 913 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR Beta +ENCODING 914 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +88 +88 +F0 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR Gamma +ENCODING 915 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Delta +ENCODING 916 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +50 +50 +50 +88 +88 +F8 +ENDCHAR +STARTCHAR Epsilon +ENCODING 917 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +80 +80 +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR Zeta +ENCODING 918 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +08 +10 +20 +40 +80 +80 +F8 +ENDCHAR +STARTCHAR Eta +ENCODING 919 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Theta +ENCODING 920 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Iota +ENCODING 921 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 8 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Kappa +ENCODING 922 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +90 +A0 +C0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR Lambda +ENCODING 923 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +50 +50 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Mu +ENCODING 924 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +D8 +A8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Nu +ENCODING 925 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +C8 +A8 +98 +88 +88 +88 +ENDCHAR +STARTCHAR Xi +ENCODING 926 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +00 +00 +70 +00 +00 +00 +F8 +ENDCHAR +STARTCHAR Omicron +ENCODING 927 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Pi +ENCODING 928 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Rho +ENCODING 929 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +88 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR Sigma +ENCODING 931 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +40 +20 +10 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR Tau +ENCODING 932 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Upsilon +ENCODING 933 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +50 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Phi +ENCODING 934 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +A8 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR Chi +ENCODING 935 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +50 +20 +20 +50 +88 +88 +ENDCHAR +STARTCHAR Psi +ENCODING 936 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR Omega +ENCODING 937 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR Iotadieresis +ENCODING 938 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +A0 +00 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR Upsilondieresis +ENCODING 939 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +88 +88 +50 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR alphatonos +ENCODING 940 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +68 +98 +88 +88 +98 +68 +ENDCHAR +STARTCHAR epsilontonos +ENCODING 941 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +78 +80 +70 +80 +80 +78 +ENDCHAR +STARTCHAR etatonos +ENCODING 942 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +20 +00 +F0 +88 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR iotatonos +ENCODING 943 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 9 2 0 +BITMAP +40 +80 +00 +80 +80 +80 +80 +80 +60 +ENDCHAR +STARTCHAR upsilondieresistonos +ENCODING 944 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +20 +48 +00 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR alpha +ENCODING 945 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +68 +98 +88 +88 +98 +68 +ENDCHAR +STARTCHAR beta +ENCODING 946 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +E0 +90 +90 +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR gamma +ENCODING 947 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +88 +88 +50 +50 +20 +20 +40 +40 +ENDCHAR +STARTCHAR delta +ENCODING 948 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +48 +40 +60 +90 +88 +88 +70 +ENDCHAR +STARTCHAR epsilon +ENCODING 949 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +80 +70 +80 +80 +78 +ENDCHAR +STARTCHAR zeta +ENCODING 950 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F8 +10 +20 +40 +80 +80 +80 +70 +08 +10 +ENDCHAR +STARTCHAR eta +ENCODING 951 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F0 +88 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR theta +ENCODING 952 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +60 +90 +90 +F0 +90 +90 +90 +60 +ENDCHAR +STARTCHAR iota +ENCODING 953 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 6 2 0 +BITMAP +80 +80 +80 +80 +80 +60 +ENDCHAR +STARTCHAR kappa +ENCODING 954 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +90 +A0 +C0 +C0 +A0 +90 +ENDCHAR +STARTCHAR lambda +ENCODING 955 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +40 +20 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR mu +ENCODING 956 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +88 +88 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR nu +ENCODING 957 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR xi +ENCODING 958 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +80 +80 +70 +80 +80 +80 +70 +08 +10 +ENDCHAR +STARTCHAR omicron +ENCODING 959 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR pi +ENCODING 960 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR rho +ENCODING 961 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +70 +88 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR sigma1 +ENCODING 962 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +78 +80 +80 +80 +80 +70 +08 +10 +ENDCHAR +STARTCHAR sigma +ENCODING 963 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR tau +ENCODING 964 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR upsilon +ENCODING 965 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR phi +ENCODING 966 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +90 +A8 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR chi +ENCODING 967 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +50 +20 +20 +50 +88 +ENDCHAR +STARTCHAR psi +ENCODING 968 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +20 +A8 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR omega +ENCODING 969 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR iotadieresis +ENCODING 970 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +A0 +00 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR upsilondieresis +ENCODING 971 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR omicrontonos +ENCODING 972 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR upsilontonos +ENCODING 973 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR omegatonos +ENCODING 974 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni03CF +ENCODING 975 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +90 +A0 +C0 +C0 +A0 +90 +88 +08 +10 +ENDCHAR +STARTCHAR uni03D0 +ENCODING 976 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +F0 +88 +88 +88 +70 +ENDCHAR +STARTCHAR theta1 +ENCODING 977 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +48 +38 +88 +88 +70 +ENDCHAR +STARTCHAR Upsilon1 +ENCODING 978 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +04 +88 +88 +50 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni03D3 +ENCODING 979 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +80 +44 +44 +28 +28 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni03D4 +ENCODING 980 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +50 +04 +88 +88 +50 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR phi1 +ENCODING 981 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +70 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR omega1 +ENCODING 982 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni03D7 +ENCODING 983 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +88 +90 +E0 +90 +88 +88 +08 +10 +ENDCHAR +STARTCHAR uni03D8 +ENCODING 984 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +88 +88 +88 +88 +88 +88 +70 +20 +20 +ENDCHAR +STARTCHAR uni03D9 +ENCODING 985 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +70 +88 +88 +88 +88 +70 +20 +20 +ENDCHAR +STARTCHAR uni03DA +ENCODING 986 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +78 +80 +80 +80 +80 +80 +80 +70 +08 +30 +ENDCHAR +STARTCHAR uni03DB +ENCODING 987 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +78 +80 +80 +80 +80 +70 +08 +30 +ENDCHAR +STARTCHAR uni03DC +ENCODING 988 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +80 +80 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni03DD +ENCODING 989 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +18 +20 +20 +38 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni03DE +ENCODING 990 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +80 +48 +58 +A8 +D0 +90 +08 +ENDCHAR +STARTCHAR uni03DF +ENCODING 991 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +40 +40 +80 +F8 +08 +10 +10 +ENDCHAR +STARTCHAR uni03E0 +ENCODING 992 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F0 +48 +48 +18 +28 +28 +28 +28 +08 +10 +ENDCHAR +STARTCHAR uni03E1 +ENCODING 993 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 -2 +BITMAP +C0 +20 +10 +30 +48 +98 +28 +08 +08 +ENDCHAR +STARTCHAR uni03E2 +ENCODING 994 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +88 +88 +A8 +A8 +A8 +A8 +58 +08 +30 +ENDCHAR +STARTCHAR uni03E3 +ENCODING 995 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +88 +88 +88 +A8 +A8 +58 +08 +30 +ENDCHAR +STARTCHAR uni03E4 +ENCODING 996 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +88 +88 +88 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni03E5 +ENCODING 997 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +88 +88 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni03E6 +ENCODING 998 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +80 +80 +F0 +88 +88 +88 +88 +88 +08 +30 +ENDCHAR +STARTCHAR uni03E7 +ENCODING 999 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +60 +90 +78 +10 +10 +E0 +ENDCHAR +STARTCHAR uni03E8 +ENCODING 1000 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F0 +08 +08 +10 +20 +40 +80 +80 +40 +38 +ENDCHAR +STARTCHAR uni03E9 +ENCODING 1001 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F0 +08 +08 +30 +40 +80 +40 +38 +ENDCHAR +STARTCHAR uni03EA +ENCODING 1002 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +50 +20 +20 +50 +88 +F8 +ENDCHAR +STARTCHAR uni03EB +ENCODING 1003 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +50 +20 +20 +50 +F8 +ENDCHAR +STARTCHAR uni03EC +ENCODING 1004 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +80 +80 +F0 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni03ED +ENCODING 1005 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +70 +80 +80 +E0 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uni03EE +ENCODING 1006 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +20 +F8 +A8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni03EF +ENCODING 1007 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +20 +F8 +A8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni03F0 +ENCODING 1008 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +90 +E0 +90 +88 +88 +ENDCHAR +STARTCHAR uni03F1 +ENCODING 1009 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +70 +88 +88 +88 +88 +F0 +80 +78 +ENDCHAR +STARTCHAR uni03F2 +ENCODING 1010 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +80 +80 +88 +70 +ENDCHAR +STARTCHAR uni03F3 +ENCODING 1011 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 11 0 -2 +BITMAP +20 +20 +00 +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni03F4 +ENCODING 1012 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni03F5 +ENCODING 1013 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +80 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR uni03F6 +ENCODING 1014 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +08 +F8 +08 +08 +F0 +ENDCHAR +STARTCHAR uni03F7 +ENCODING 1015 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +F0 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR uni03F8 +ENCODING 1016 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +80 +80 +F0 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR uni03F9 +ENCODING 1017 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +80 +80 +80 +80 +80 +80 +78 +ENDCHAR +STARTCHAR uni03FA +ENCODING 1018 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +D8 +A8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni03FB +ENCODING 1019 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +88 +D8 +A8 +88 +88 +88 +80 +ENDCHAR +STARTCHAR uni03FC +ENCODING 1020 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +30 +48 +48 +48 +70 +40 +E0 +40 +ENDCHAR +STARTCHAR uni03FD +ENCODING 1021 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +08 +08 +08 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR uni03FE +ENCODING 1022 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +80 +80 +A0 +A0 +80 +80 +78 +ENDCHAR +STARTCHAR uni03FF +ENCODING 1023 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +08 +08 +28 +28 +08 +08 +F0 +ENDCHAR +STARTCHAR uni0400 +ENCODING 1024 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +F8 +80 +80 +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR afii10023 +ENCODING 1025 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +F8 +80 +80 +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR afii10051 +ENCODING 1026 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +E0 +40 +40 +70 +48 +48 +48 +48 +08 +10 +ENDCHAR +STARTCHAR afii10052 +ENCODING 1027 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +F8 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10053 +ENCODING 1028 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +80 +80 +F0 +80 +80 +80 +78 +ENDCHAR +STARTCHAR afii10054 +ENCODING 1029 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +80 +80 +70 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR afii10055 +ENCODING 1030 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 8 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10056 +ENCODING 1031 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +A0 +00 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR afii10057 +ENCODING 1032 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 0 0 +BITMAP +10 +10 +10 +10 +10 +10 +10 +E0 +ENDCHAR +STARTCHAR afii10058 +ENCODING 1033 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +A0 +B0 +A8 +A8 +A8 +A8 +B0 +ENDCHAR +STARTCHAR afii10059 +ENCODING 1034 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A0 +A0 +A0 +F0 +A8 +A8 +A8 +B0 +ENDCHAR +STARTCHAR afii10060 +ENCODING 1035 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +E0 +40 +40 +70 +48 +48 +48 +48 +ENDCHAR +STARTCHAR afii10061 +ENCODING 1036 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +88 +90 +A0 +C0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni040D +ENCODING 1037 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +88 +98 +98 +A8 +A8 +C8 +C8 +88 +ENDCHAR +STARTCHAR afii10062 +ENCODING 1038 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +88 +88 +88 +78 +08 +08 +70 +ENDCHAR +STARTCHAR afii10145 +ENCODING 1039 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +88 +88 +88 +88 +88 +88 +F8 +20 +20 +ENDCHAR +STARTCHAR afii10017 +ENCODING 1040 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR afii10018 +ENCODING 1041 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +80 +80 +F0 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR afii10019 +ENCODING 1042 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +88 +88 +F0 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR afii10020 +ENCODING 1043 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10021 +ENCODING 1044 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 -1 +BITMAP +78 +48 +48 +48 +48 +48 +48 +FC +84 +ENDCHAR +STARTCHAR afii10022 +ENCODING 1045 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +80 +80 +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR afii10024 +ENCODING 1046 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A8 +A8 +A8 +70 +70 +A8 +A8 +A8 +ENDCHAR +STARTCHAR afii10025 +ENCODING 1047 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +08 +08 +70 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR afii10026 +ENCODING 1048 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +98 +98 +A8 +A8 +C8 +C8 +88 +ENDCHAR +STARTCHAR afii10027 +ENCODING 1049 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +88 +98 +98 +A8 +A8 +C8 +C8 +88 +ENDCHAR +STARTCHAR afii10028 +ENCODING 1050 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +90 +A0 +C0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR afii10029 +ENCODING 1051 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +48 +48 +48 +48 +48 +48 +88 +ENDCHAR +STARTCHAR afii10030 +ENCODING 1052 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +D8 +A8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR afii10031 +ENCODING 1053 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR afii10032 +ENCODING 1054 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR afii10033 +ENCODING 1055 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR afii10034 +ENCODING 1056 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +88 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR afii10035 +ENCODING 1057 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +80 +80 +80 +80 +80 +80 +78 +ENDCHAR +STARTCHAR afii10036 +ENCODING 1058 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR afii10037 +ENCODING 1059 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +88 +88 +78 +08 +08 +70 +ENDCHAR +STARTCHAR afii10038 +ENCODING 1060 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +70 +A8 +A8 +A8 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR afii10039 +ENCODING 1061 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +50 +20 +20 +50 +88 +88 +ENDCHAR +STARTCHAR afii10040 +ENCODING 1062 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +88 +88 +88 +88 +88 +88 +88 +7C +04 +04 +ENDCHAR +STARTCHAR afii10041 +ENCODING 1063 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +88 +88 +78 +08 +08 +08 +ENDCHAR +STARTCHAR afii10042 +ENCODING 1064 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +A8 +78 +ENDCHAR +STARTCHAR afii10043 +ENCODING 1065 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +A8 +7C +04 +04 +ENDCHAR +STARTCHAR afii10044 +ENCODING 1066 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +40 +70 +48 +48 +48 +48 +70 +ENDCHAR +STARTCHAR afii10045 +ENCODING 1067 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +C8 +A8 +A8 +A8 +A8 +C8 +ENDCHAR +STARTCHAR afii10046 +ENCODING 1068 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +80 +80 +E0 +90 +90 +90 +90 +E0 +ENDCHAR +STARTCHAR afii10047 +ENCODING 1069 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +08 +08 +78 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR afii10048 +ENCODING 1070 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +98 +A4 +A4 +E4 +A4 +A4 +A4 +98 +ENDCHAR +STARTCHAR afii10049 +ENCODING 1071 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +88 +88 +88 +78 +28 +48 +88 +ENDCHAR +STARTCHAR afii10065 +ENCODING 1072 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR afii10066 +ENCODING 1073 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +80 +F0 +88 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR afii10067 +ENCODING 1074 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +88 +F0 +88 +88 +F0 +ENDCHAR +STARTCHAR afii10068 +ENCODING 1075 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10069 +ENCODING 1076 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +78 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR afii10070 +ENCODING 1077 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR afii10072 +ENCODING 1078 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +A8 +A8 +70 +A8 +A8 +A8 +ENDCHAR +STARTCHAR afii10073 +ENCODING 1079 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +08 +70 +08 +08 +F0 +ENDCHAR +STARTCHAR afii10074 +ENCODING 1080 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +98 +A8 +A8 +C8 +88 +ENDCHAR +STARTCHAR afii10075 +ENCODING 1081 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +70 +00 +88 +98 +A8 +A8 +C8 +88 +ENDCHAR +STARTCHAR afii10076 +ENCODING 1082 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +90 +A0 +C0 +C0 +A0 +90 +ENDCHAR +STARTCHAR afii10077 +ENCODING 1083 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +38 +48 +48 +48 +48 +88 +ENDCHAR +STARTCHAR afii10078 +ENCODING 1084 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +D8 +A8 +88 +88 +88 +ENDCHAR +STARTCHAR afii10079 +ENCODING 1085 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR afii10080 +ENCODING 1086 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR afii10081 +ENCODING 1087 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR afii10082 +ENCODING 1088 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F0 +88 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR afii10083 +ENCODING 1089 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +80 +80 +80 +80 +78 +ENDCHAR +STARTCHAR afii10084 +ENCODING 1090 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR afii10085 +ENCODING 1091 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR afii10086 +ENCODING 1092 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +70 +A8 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR afii10087 +ENCODING 1093 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +50 +20 +20 +50 +88 +ENDCHAR +STARTCHAR afii10088 +ENCODING 1094 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +88 +88 +88 +88 +88 +7C +04 +04 +ENDCHAR +STARTCHAR afii10089 +ENCODING 1095 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR afii10090 +ENCODING 1096 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +78 +ENDCHAR +STARTCHAR afii10091 +ENCODING 1097 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +A8 +A8 +A8 +A8 +A8 +7C +04 +04 +ENDCHAR +STARTCHAR afii10092 +ENCODING 1098 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +C0 +40 +70 +48 +48 +70 +ENDCHAR +STARTCHAR afii10093 +ENCODING 1099 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +C8 +A8 +A8 +C8 +ENDCHAR +STARTCHAR afii10094 +ENCODING 1100 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +80 +80 +E0 +90 +90 +E0 +ENDCHAR +STARTCHAR afii10095 +ENCODING 1101 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +08 +78 +08 +08 +F0 +ENDCHAR +STARTCHAR afii10096 +ENCODING 1102 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +90 +A8 +A8 +E8 +A8 +90 +ENDCHAR +STARTCHAR afii10097 +ENCODING 1103 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +88 +88 +78 +28 +48 +ENDCHAR +STARTCHAR uni0450 +ENCODING 1104 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +00 +70 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR afii10071 +ENCODING 1105 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +70 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR afii10099 +ENCODING 1106 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +40 +F0 +40 +70 +48 +48 +48 +48 +08 +10 +ENDCHAR +STARTCHAR afii10100 +ENCODING 1107 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +F8 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10101 +ENCODING 1108 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +80 +F0 +80 +80 +78 +ENDCHAR +STARTCHAR afii10102 +ENCODING 1109 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +80 +70 +08 +08 +F0 +ENDCHAR +STARTCHAR afii10103 +ENCODING 1110 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 9 2 0 +BITMAP +80 +80 +00 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10104 +ENCODING 1111 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +A0 +00 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR afii10105 +ENCODING 1112 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 11 0 -2 +BITMAP +20 +20 +00 +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR afii10106 +ENCODING 1113 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +E0 +A0 +B0 +A8 +A8 +B0 +ENDCHAR +STARTCHAR afii10107 +ENCODING 1114 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +A0 +A0 +F0 +A8 +A8 +B0 +ENDCHAR +STARTCHAR afii10108 +ENCODING 1115 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +F0 +40 +70 +48 +48 +48 +48 +ENDCHAR +STARTCHAR afii10109 +ENCODING 1116 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +20 +40 +00 +90 +A0 +C0 +C0 +A0 +90 +ENDCHAR +STARTCHAR uni045D +ENCODING 1117 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +00 +88 +98 +A8 +A8 +C8 +88 +ENDCHAR +STARTCHAR afii10110 +ENCODING 1118 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +88 +70 +00 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR afii10193 +ENCODING 1119 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +88 +88 +88 +88 +88 +F8 +20 +20 +ENDCHAR +STARTCHAR uni0460 +ENCODING 1120 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +88 +A8 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni0461 +ENCODING 1121 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR afii10146 +ENCODING 1122 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +E0 +40 +70 +48 +48 +48 +70 +ENDCHAR +STARTCHAR afii10194 +ENCODING 1123 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +40 +E0 +40 +70 +48 +48 +70 +ENDCHAR +STARTCHAR uni0464 +ENCODING 1124 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +98 +A0 +A0 +F8 +A0 +A0 +A0 +98 +ENDCHAR +STARTCHAR uni0465 +ENCODING 1125 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +98 +A0 +F8 +A0 +A0 +98 +ENDCHAR +STARTCHAR uni0466 +ENCODING 1126 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +50 +50 +88 +F8 +A8 +A8 +ENDCHAR +STARTCHAR uni0467 +ENCODING 1127 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +50 +88 +F8 +A8 +A8 +ENDCHAR +STARTCHAR uni0468 +ENCODING 1128 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +90 +90 +A8 +A8 +C4 +FC +D4 +D4 +ENDCHAR +STARTCHAR uni0469 +ENCODING 1129 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +90 +A8 +C4 +FC +D4 +D4 +ENDCHAR +STARTCHAR uni046A +ENCODING 1130 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +88 +50 +20 +70 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni046B +ENCODING 1131 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +50 +20 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni046C +ENCODING 1132 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +B8 +A8 +A8 +D0 +B8 +D4 +D4 +D4 +ENDCHAR +STARTCHAR uni046D +ENCODING 1133 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +B8 +A8 +D0 +B8 +D4 +D4 +ENDCHAR +STARTCHAR uni046E +ENCODING 1134 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +50 +20 +F0 +08 +08 +70 +08 +08 +08 +70 +80 +70 +ENDCHAR +STARTCHAR uni046F +ENCODING 1135 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +50 +20 +F0 +08 +70 +08 +08 +70 +80 +70 +ENDCHAR +STARTCHAR uni0470 +ENCODING 1136 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni0471 +ENCODING 1137 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +20 +A8 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR afii10147 +ENCODING 1138 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +88 +70 +ENDCHAR +STARTCHAR afii10195 +ENCODING 1139 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR afii10148 +ENCODING 1140 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +8C +88 +88 +50 +50 +50 +20 +20 +ENDCHAR +STARTCHAR afii10196 +ENCODING 1141 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +8C +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni0476 +ENCODING 1142 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +A0 +50 +00 +8C +88 +50 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni0477 +ENCODING 1143 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +A0 +50 +00 +8C +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni0478 +ENCODING 1144 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +40 +A0 +A8 +A8 +A8 +A8 +A8 +58 +08 +30 +ENDCHAR +STARTCHAR uni0479 +ENCODING 1145 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +68 +A8 +A8 +A8 +A8 +58 +08 +30 +ENDCHAR +STARTCHAR uni047A +ENCODING 1146 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +20 +70 +A8 +88 +88 +88 +88 +A8 +70 +20 +ENDCHAR +STARTCHAR uni047B +ENCODING 1147 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +20 +70 +A8 +88 +88 +A8 +70 +20 +ENDCHAR +STARTCHAR uni047C +ENCODING 1148 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +20 +A8 +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni047D +ENCODING 1149 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +20 +A8 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni047E +ENCODING 1150 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +20 +A8 +88 +88 +A8 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni047F +ENCODING 1151 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +20 +A8 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni0480 +ENCODING 1152 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +78 +80 +80 +80 +80 +80 +80 +78 +08 +08 +ENDCHAR +STARTCHAR uni0481 +ENCODING 1153 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +78 +80 +80 +80 +80 +78 +08 +08 +ENDCHAR +STARTCHAR uni0482 +ENCODING 1154 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 6 1 0 +BITMAP +10 +60 +30 +C0 +60 +80 +ENDCHAR +STARTCHAR uni048A +ENCODING 1162 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +88 +70 +88 +98 +98 +A8 +A8 +C8 +C8 +88 +08 +10 +ENDCHAR +STARTCHAR uni048B +ENCODING 1163 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +88 +70 +00 +88 +98 +A8 +A8 +C8 +88 +08 +10 +ENDCHAR +STARTCHAR uni048C +ENCODING 1164 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +E0 +40 +70 +48 +48 +48 +70 +ENDCHAR +STARTCHAR uni048D +ENCODING 1165 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +40 +E0 +40 +70 +48 +70 +ENDCHAR +STARTCHAR uni048E +ENCODING 1166 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +88 +88 +A8 +F0 +88 +80 +80 +ENDCHAR +STARTCHAR uni048F +ENCODING 1167 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F0 +88 +88 +88 +A8 +F0 +88 +80 +ENDCHAR +STARTCHAR afii10050 +ENCODING 1168 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +08 +08 +F8 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10098 +ENCODING 1169 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +08 +F8 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni0492 +ENCODING 1170 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +7C +40 +40 +40 +F0 +40 +40 +40 +ENDCHAR +STARTCHAR uni0493 +ENCODING 1171 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +40 +40 +F0 +40 +40 +ENDCHAR +STARTCHAR uni0494 +ENCODING 1172 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F8 +80 +80 +80 +F0 +88 +88 +88 +08 +10 +ENDCHAR +STARTCHAR uni0495 +ENCODING 1173 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F8 +80 +80 +E0 +90 +90 +10 +20 +ENDCHAR +STARTCHAR uni0496 +ENCODING 1174 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +A8 +A8 +A8 +70 +70 +A8 +A8 +AC +04 +04 +ENDCHAR +STARTCHAR uni0497 +ENCODING 1175 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +A8 +A8 +70 +A8 +A8 +AC +04 +04 +ENDCHAR +STARTCHAR uni0498 +ENCODING 1176 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F0 +08 +08 +30 +08 +08 +08 +F0 +20 +20 +ENDCHAR +STARTCHAR uni0499 +ENCODING 1177 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F0 +08 +30 +08 +08 +F0 +20 +20 +ENDCHAR +STARTCHAR uni049A +ENCODING 1178 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +88 +90 +A0 +C0 +C0 +A0 +90 +8C +04 +04 +ENDCHAR +STARTCHAR uni049B +ENCODING 1179 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 1 -2 +BITMAP +90 +A0 +C0 +C0 +A0 +98 +08 +08 +ENDCHAR +STARTCHAR uni049C +ENCODING 1180 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +84 +A8 +B0 +E0 +E0 +B0 +A8 +84 +ENDCHAR +STARTCHAR uni049D +ENCODING 1181 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +A8 +B0 +E0 +E0 +B0 +A8 +ENDCHAR +STARTCHAR uni049E +ENCODING 1182 +SWIDTH 583 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +44 +E8 +50 +60 +60 +50 +48 +44 +ENDCHAR +STARTCHAR uni049F +ENCODING 1183 +SWIDTH 583 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +48 +F0 +60 +60 +50 +48 +ENDCHAR +STARTCHAR uni04A0 +ENCODING 1184 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +C4 +48 +50 +60 +60 +50 +48 +44 +ENDCHAR +STARTCHAR uni04A1 +ENCODING 1185 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +C8 +50 +60 +60 +50 +48 +ENDCHAR +STARTCHAR uni04A2 +ENCODING 1186 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +8C +04 +04 +ENDCHAR +STARTCHAR uni04A3 +ENCODING 1187 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +88 +88 +F8 +88 +88 +8C +04 +04 +ENDCHAR +STARTCHAR uni04A4 +ENCODING 1188 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +9C +90 +90 +F0 +90 +90 +90 +90 +ENDCHAR +STARTCHAR uni04A5 +ENCODING 1189 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +9C +90 +F0 +90 +90 +90 +ENDCHAR +STARTCHAR uni04A6 +ENCODING 1190 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +E0 +A0 +B0 +A8 +A8 +A8 +A8 +A8 +08 +10 +ENDCHAR +STARTCHAR uni04A7 +ENCODING 1191 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +E0 +A0 +B0 +A8 +A8 +A8 +08 +10 +ENDCHAR +STARTCHAR uni04A8 +ENCODING 1192 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +30 +40 +90 +A8 +A8 +A8 +A8 +70 +20 +10 +ENDCHAR +STARTCHAR uni04A9 +ENCODING 1193 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +30 +40 +90 +A8 +A8 +70 +20 +10 +ENDCHAR +STARTCHAR uni04AA +ENCODING 1194 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +78 +80 +80 +80 +80 +80 +80 +78 +20 +20 +ENDCHAR +STARTCHAR uni04AB +ENCODING 1195 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +78 +80 +80 +80 +80 +78 +20 +20 +ENDCHAR +STARTCHAR uni04AC +ENCODING 1196 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +30 +10 +10 +ENDCHAR +STARTCHAR uni04AD +ENCODING 1197 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F8 +20 +20 +20 +20 +30 +10 +10 +ENDCHAR +STARTCHAR uni04AE +ENCODING 1198 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +50 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni04AF +ENCODING 1199 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +88 +88 +88 +50 +50 +20 +20 +20 +ENDCHAR +STARTCHAR uni04B0 +ENCODING 1200 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +50 +50 +20 +70 +20 +20 +ENDCHAR +STARTCHAR uni04B1 +ENCODING 1201 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +88 +88 +88 +50 +50 +20 +70 +20 +ENDCHAR +STARTCHAR uni04B2 +ENCODING 1202 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +88 +88 +50 +20 +20 +50 +88 +8C +04 +04 +ENDCHAR +STARTCHAR uni04B3 +ENCODING 1203 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +88 +50 +20 +20 +50 +8C +04 +04 +ENDCHAR +STARTCHAR uni04B4 +ENCODING 1204 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +E8 +48 +48 +48 +48 +48 +48 +7C +04 +04 +ENDCHAR +STARTCHAR uni04B5 +ENCODING 1205 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +E8 +48 +48 +48 +48 +7C +04 +04 +ENDCHAR +STARTCHAR uni04B6 +ENCODING 1206 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +88 +88 +88 +88 +78 +08 +08 +0C +04 +04 +ENDCHAR +STARTCHAR uni04B7 +ENCODING 1207 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +88 +88 +88 +78 +08 +0C +04 +04 +ENDCHAR +STARTCHAR uni04B8 +ENCODING 1208 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +A8 +A8 +78 +28 +28 +08 +ENDCHAR +STARTCHAR uni04B9 +ENCODING 1209 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +A8 +A8 +78 +28 +08 +ENDCHAR +STARTCHAR uni04BA +ENCODING 1210 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +80 +F0 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni04BB +ENCODING 1211 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +80 +80 +F0 +88 +88 +88 +ENDCHAR +STARTCHAR uni04BC +ENCODING 1212 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +48 +C8 +78 +40 +40 +40 +38 +ENDCHAR +STARTCHAR uni04BD +ENCODING 1213 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +30 +C8 +78 +40 +40 +38 +ENDCHAR +STARTCHAR uni04BE +ENCODING 1214 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +30 +48 +C8 +78 +40 +40 +40 +38 +10 +10 +ENDCHAR +STARTCHAR uni04BF +ENCODING 1215 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +30 +C8 +78 +40 +40 +38 +10 +10 +ENDCHAR +STARTCHAR uni04C0 +ENCODING 1216 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 8 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni04C1 +ENCODING 1217 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +A8 +A8 +A8 +70 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni04C2 +ENCODING 1218 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +70 +00 +A8 +A8 +70 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni04C3 +ENCODING 1219 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +90 +A0 +C0 +C0 +A0 +90 +88 +08 +30 +ENDCHAR +STARTCHAR uni04C4 +ENCODING 1220 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +88 +90 +E0 +90 +88 +88 +08 +30 +ENDCHAR +STARTCHAR uni04C5 +ENCODING 1221 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +78 +48 +48 +48 +48 +48 +48 +88 +04 +08 +ENDCHAR +STARTCHAR uni04C6 +ENCODING 1222 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +78 +48 +48 +48 +48 +88 +04 +08 +ENDCHAR +STARTCHAR uni04C7 +ENCODING 1223 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +88 +08 +30 +ENDCHAR +STARTCHAR uni04C8 +ENCODING 1224 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +88 +88 +F8 +88 +88 +88 +08 +30 +ENDCHAR +STARTCHAR uni04C9 +ENCODING 1225 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +88 +08 +10 +ENDCHAR +STARTCHAR uni04CA +ENCODING 1226 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +88 +88 +F8 +88 +88 +88 +08 +10 +ENDCHAR +STARTCHAR uni04CB +ENCODING 1227 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +88 +88 +78 +08 +08 +08 +18 +10 +10 +ENDCHAR +STARTCHAR uni04CC +ENCODING 1228 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +88 +88 +78 +08 +08 +18 +10 +10 +ENDCHAR +STARTCHAR uni04CD +ENCODING 1229 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +88 +D8 +A8 +A8 +88 +88 +88 +88 +04 +08 +ENDCHAR +STARTCHAR uni04CE +ENCODING 1230 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +88 +D8 +A8 +88 +88 +88 +04 +08 +ENDCHAR +STARTCHAR uni04CF +ENCODING 1231 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 8 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni04D0 +ENCODING 1232 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni04D1 +ENCODING 1233 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +70 +00 +70 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR uni04D2 +ENCODING 1234 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +70 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni04D3 +ENCODING 1235 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +70 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR uni04D4 +ENCODING 1236 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +7C +90 +90 +FC +90 +90 +90 +9C +ENDCHAR +STARTCHAR uni04D5 +ENCODING 1237 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +28 +68 +B0 +A0 +78 +ENDCHAR +STARTCHAR uni04D6 +ENCODING 1238 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +F8 +80 +80 +F8 +80 +80 +F8 +ENDCHAR +STARTCHAR uni04D7 +ENCODING 1239 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +70 +00 +70 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR uni04D8 +ENCODING 1240 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +08 +08 +08 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR afii10846 +ENCODING 1241 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F0 +08 +08 +F8 +88 +70 +ENDCHAR +STARTCHAR uni04DA +ENCODING 1242 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +F0 +08 +08 +08 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni04DB +ENCODING 1243 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +F0 +08 +08 +F8 +88 +70 +ENDCHAR +STARTCHAR uni04DC +ENCODING 1244 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +A8 +A8 +A8 +70 +70 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni04DD +ENCODING 1245 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +A8 +A8 +70 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni04DE +ENCODING 1246 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +F0 +08 +08 +70 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR uni04DF +ENCODING 1247 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +F0 +08 +70 +08 +08 +F0 +ENDCHAR +STARTCHAR uni04E0 +ENCODING 1248 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +08 +10 +30 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR uni04E1 +ENCODING 1249 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +08 +30 +08 +08 +F0 +ENDCHAR +STARTCHAR uni04E2 +ENCODING 1250 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +88 +98 +98 +A8 +A8 +C8 +C8 +88 +ENDCHAR +STARTCHAR uni04E3 +ENCODING 1251 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +00 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni04E4 +ENCODING 1252 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +88 +98 +98 +A8 +A8 +C8 +C8 +88 +ENDCHAR +STARTCHAR uni04E5 +ENCODING 1253 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni04E6 +ENCODING 1254 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni04E7 +ENCODING 1255 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni04E8 +ENCODING 1256 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +F8 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni04E9 +ENCODING 1257 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni04EA +ENCODING 1258 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +70 +88 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni04EB +ENCODING 1259 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +70 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni04EC +ENCODING 1260 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +F0 +08 +08 +78 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR uni04ED +ENCODING 1261 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +F0 +08 +78 +08 +08 +F0 +ENDCHAR +STARTCHAR uni04EE +ENCODING 1262 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +88 +88 +88 +88 +78 +08 +08 +70 +ENDCHAR +STARTCHAR uni04EF +ENCODING 1263 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +00 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni04F0 +ENCODING 1264 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +88 +88 +88 +88 +78 +08 +08 +70 +ENDCHAR +STARTCHAR uni04F1 +ENCODING 1265 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +50 +00 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni04F2 +ENCODING 1266 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +28 +50 +88 +88 +88 +88 +78 +08 +08 +70 +ENDCHAR +STARTCHAR uni04F3 +ENCODING 1267 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +28 +50 +00 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni04F4 +ENCODING 1268 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +88 +88 +88 +88 +78 +08 +08 +08 +ENDCHAR +STARTCHAR uni04F5 +ENCODING 1269 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni04F6 +ENCODING 1270 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F8 +80 +80 +80 +80 +80 +80 +C0 +40 +40 +ENDCHAR +STARTCHAR uni04F7 +ENCODING 1271 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F8 +80 +80 +80 +80 +C0 +40 +40 +ENDCHAR +STARTCHAR uni04F8 +ENCODING 1272 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +88 +88 +C8 +A8 +A8 +A8 +A8 +C8 +ENDCHAR +STARTCHAR uni04F9 +ENCODING 1273 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +88 +88 +C8 +A8 +A8 +C8 +ENDCHAR +STARTCHAR uni04FA +ENCODING 1274 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +78 +40 +40 +F0 +40 +40 +40 +40 +40 +80 +ENDCHAR +STARTCHAR uni04FB +ENCODING 1275 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +78 +40 +F0 +40 +40 +40 +40 +80 +ENDCHAR +STARTCHAR uni04FC +ENCODING 1276 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +88 +50 +20 +20 +50 +88 +88 +08 +30 +ENDCHAR +STARTCHAR uni04FD +ENCODING 1277 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +88 +50 +20 +20 +50 +88 +08 +30 +ENDCHAR +STARTCHAR uni04FE +ENCODING 1278 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +50 +F8 +20 +50 +88 +88 +ENDCHAR +STARTCHAR uni04FF +ENCODING 1279 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +50 +F8 +20 +50 +88 +ENDCHAR +STARTCHAR uni0500 +ENCODING 1280 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +08 +08 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni0501 +ENCODING 1281 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +08 +78 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni0502 +ENCODING 1282 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +68 +A8 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni0503 +ENCODING 1283 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +68 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni0504 +ENCODING 1284 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +28 +28 +C8 +28 +28 +28 +10 +ENDCHAR +STARTCHAR uni0505 +ENCODING 1285 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +C8 +28 +C8 +28 +28 +10 +ENDCHAR +STARTCHAR uni0506 +ENCODING 1286 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 0 -2 +BITMAP +C0 +20 +20 +C0 +20 +20 +20 +30 +10 +10 +ENDCHAR +STARTCHAR uni0507 +ENCODING 1287 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 0 -2 +BITMAP +C0 +20 +C0 +20 +20 +30 +10 +10 +ENDCHAR +STARTCHAR uni0508 +ENCODING 1288 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +E0 +A8 +A8 +A8 +A8 +A8 +A8 +90 +ENDCHAR +STARTCHAR uni0509 +ENCODING 1289 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +E0 +A8 +A8 +A8 +A8 +90 +ENDCHAR +STARTCHAR uni050A +ENCODING 1290 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A0 +A0 +A8 +E8 +A8 +A8 +A8 +90 +ENDCHAR +STARTCHAR uni050B +ENCODING 1291 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +A0 +A8 +E8 +A8 +A8 +90 +ENDCHAR +STARTCHAR uni050C +ENCODING 1292 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +80 +80 +80 +98 +88 +88 +70 +ENDCHAR +STARTCHAR uni050D +ENCODING 1293 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +80 +80 +98 +88 +70 +ENDCHAR +STARTCHAR uni050E +ENCODING 1294 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +20 +28 +28 +28 +28 +28 +10 +ENDCHAR +STARTCHAR uni050F +ENCODING 1295 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +20 +28 +28 +28 +28 +10 +ENDCHAR +STARTCHAR uni0510 +ENCODING 1296 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +80 +80 +70 +80 +80 +80 +78 +ENDCHAR +STARTCHAR uni0511 +ENCODING 1297 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +80 +70 +80 +80 +78 +ENDCHAR +STARTCHAR uni0512 +ENCODING 1298 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +78 +48 +48 +48 +48 +48 +48 +88 +08 +10 +ENDCHAR +STARTCHAR uni0513 +ENCODING 1299 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +78 +48 +48 +48 +48 +88 +08 +10 +ENDCHAR +STARTCHAR uni0514 +ENCODING 1300 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +E8 +A8 +A8 +90 +90 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni0515 +ENCODING 1301 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +E8 +A8 +90 +90 +A8 +A8 +ENDCHAR +STARTCHAR uni0516 +ENCODING 1302 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +A8 +B0 +A0 +D0 +90 +88 +88 +ENDCHAR +STARTCHAR uni0517 +ENCODING 1303 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +C8 +A8 +B0 +B0 +A8 +C8 +80 +80 +ENDCHAR +STARTCHAR uni0518 +ENCODING 1304 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +78 +A0 +A0 +78 +60 +A0 +A0 +B8 +ENDCHAR +STARTCHAR uni0519 +ENCODING 1305 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +70 +A8 +78 +A0 +A0 +98 +ENDCHAR +STARTCHAR uni051A +ENCODING 1306 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +70 +88 +88 +88 +88 +88 +88 +70 +08 +ENDCHAR +STARTCHAR uni051B +ENCODING 1307 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +78 +88 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni051C +ENCODING 1308 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +88 +88 +A8 +A8 +D8 +88 +ENDCHAR +STARTCHAR uni051D +ENCODING 1309 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni051E +ENCODING 1310 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A8 +90 +A8 +C0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni051F +ENCODING 1311 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +A8 +90 +E8 +90 +88 +88 +ENDCHAR +STARTCHAR uni0520 +ENCODING 1312 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +E0 +A0 +A0 +B0 +A8 +A8 +A8 +A8 +08 +30 +ENDCHAR +STARTCHAR uni0521 +ENCODING 1313 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +E0 +A0 +A0 +B0 +A8 +A8 +08 +10 +ENDCHAR +STARTCHAR uni0522 +ENCODING 1314 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +A0 +A0 +A0 +F0 +A8 +A8 +A8 +A8 +08 +10 +ENDCHAR +STARTCHAR uni0523 +ENCODING 1315 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +A0 +A0 +F0 +A8 +A8 +A8 +08 +10 +ENDCHAR +STARTCHAR uni0524 +ENCODING 1316 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +8C +04 +04 +ENDCHAR +STARTCHAR uni0525 +ENCODING 1317 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +F8 +88 +88 +88 +88 +8C +04 +04 +ENDCHAR +STARTCHAR uni0526 +ENCODING 1318 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +80 +80 +F0 +88 +88 +88 +88 +8C +04 +04 +ENDCHAR +STARTCHAR uni0527 +ENCODING 1319 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +80 +80 +F0 +88 +88 +8C +04 +04 +ENDCHAR +STARTCHAR afii57407 +ENCODING 1567 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +70 +80 +80 +40 +20 +00 +20 +20 +ENDCHAR +STARTCHAR afii57409 +ENCODING 1569 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 5 2 1 +BITMAP +60 +80 +80 +60 +C0 +ENDCHAR +STARTCHAR afii57410 +ENCODING 1570 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +50 +A0 +00 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR afii57411 +ENCODING 1571 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +60 +80 +E0 +00 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR afii57412 +ENCODING 1572 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +30 +40 +70 +00 +30 +48 +48 +38 +08 +F0 +ENDCHAR +STARTCHAR afii57413 +ENCODING 1573 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 -2 +BITMAP +40 +40 +40 +40 +40 +40 +00 +60 +80 +E0 +ENDCHAR +STARTCHAR afii57414 +ENCODING 1574 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +60 +80 +E0 +08 +14 +50 +88 +88 +70 +ENDCHAR +STARTCHAR afii57415 +ENCODING 1575 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 8 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii57416 +ENCODING 1576 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +10 +88 +88 +70 +00 +20 +ENDCHAR +STARTCHAR afii57417 +ENCODING 1577 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +60 +90 +88 +88 +70 +ENDCHAR +STARTCHAR afii57418 +ENCODING 1578 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +50 +00 +10 +88 +88 +70 +ENDCHAR +STARTCHAR afii57419 +ENCODING 1579 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +50 +00 +10 +88 +88 +70 +ENDCHAR +STARTCHAR afii57420 +ENCODING 1580 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F8 +20 +40 +80 +A0 +80 +40 +38 +ENDCHAR +STARTCHAR afii57421 +ENCODING 1581 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F8 +20 +40 +80 +80 +80 +40 +38 +ENDCHAR +STARTCHAR afii57422 +ENCODING 1582 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +00 +F8 +20 +40 +80 +80 +80 +40 +38 +ENDCHAR +STARTCHAR afii57423 +ENCODING 1583 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +20 +10 +10 +10 +E0 +ENDCHAR +STARTCHAR afii57424 +ENCODING 1584 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +00 +20 +10 +10 +10 +E0 +ENDCHAR +STARTCHAR afii57425 +ENCODING 1585 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 -1 +BITMAP +08 +08 +08 +10 +E0 +ENDCHAR +STARTCHAR afii57426 +ENCODING 1586 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +08 +00 +08 +08 +08 +10 +E0 +ENDCHAR +STARTCHAR afii57427 +ENCODING 1587 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +04 +54 +54 +54 +28 +A0 +40 +ENDCHAR +STARTCHAR afii57428 +ENCODING 1588 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +20 +00 +50 +04 +54 +54 +54 +28 +A0 +40 +ENDCHAR +STARTCHAR afii57429 +ENCODING 1589 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +28 +34 +A4 +B8 +A0 +40 +ENDCHAR +STARTCHAR afii57430 +ENCODING 1590 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +20 +00 +28 +34 +A4 +B8 +A0 +40 +ENDCHAR +STARTCHAR afii57431 +ENCODING 1591 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +40 +40 +40 +50 +68 +48 +F0 +ENDCHAR +STARTCHAR afii57432 +ENCODING 1592 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +40 +50 +40 +50 +68 +48 +F0 +ENDCHAR +STARTCHAR afii57433 +ENCODING 1593 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +60 +80 +80 +70 +80 +80 +88 +70 +ENDCHAR +STARTCHAR afii57434 +ENCODING 1594 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +40 +00 +60 +80 +80 +70 +80 +80 +88 +70 +ENDCHAR +STARTCHAR afii57440 +ENCODING 1600 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 1 0 0 +BITMAP +FC +ENDCHAR +STARTCHAR afii57441 +ENCODING 1601 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +10 +28 +98 +88 +70 +ENDCHAR +STARTCHAR afii57442 +ENCODING 1602 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +28 +00 +10 +28 +98 +88 +70 +ENDCHAR +STARTCHAR afii57443 +ENCODING 1603 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +28 +48 +28 +C8 +08 +88 +88 +70 +ENDCHAR +STARTCHAR afii57444 +ENCODING 1604 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +48 +88 +88 +70 +ENDCHAR +STARTCHAR afii57445 +ENCODING 1605 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +30 +48 +48 +B0 +80 +80 +ENDCHAR +STARTCHAR afii57446 +ENCODING 1606 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +20 +00 +10 +88 +88 +88 +70 +ENDCHAR +STARTCHAR afii57470 +ENCODING 1607 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +60 +90 +88 +88 +70 +ENDCHAR +STARTCHAR afii57448 +ENCODING 1608 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +30 +48 +48 +38 +08 +F0 +ENDCHAR +STARTCHAR afii57449 +ENCODING 1609 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 5 0 -1 +BITMAP +08 +14 +90 +88 +70 +ENDCHAR +STARTCHAR afii57450 +ENCODING 1610 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +08 +14 +50 +88 +88 +70 +00 +50 +ENDCHAR +STARTCHAR afii57392 +ENCODING 1632 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 2 2 3 +BITMAP +80 +80 +ENDCHAR +STARTCHAR afii57393 +ENCODING 1633 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +80 +80 +40 +40 +20 +20 +20 +20 +ENDCHAR +STARTCHAR afii57394 +ENCODING 1634 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +90 +90 +60 +40 +20 +20 +20 +20 +ENDCHAR +STARTCHAR afii57395 +ENCODING 1635 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A8 +A8 +70 +40 +20 +20 +20 +20 +ENDCHAR +STARTCHAR afii57396 +ENCODING 1636 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +80 +80 +60 +80 +80 +88 +70 +ENDCHAR +STARTCHAR afii57397 +ENCODING 1637 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +50 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR afii57398 +ENCODING 1638 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +10 +10 +10 +10 +08 +08 +08 +ENDCHAR +STARTCHAR afii57399 +ENCODING 1639 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +88 +50 +50 +50 +20 +20 +20 +ENDCHAR +STARTCHAR afii57400 +ENCODING 1640 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +20 +50 +50 +50 +88 +88 +ENDCHAR +STARTCHAR afii57401 +ENCODING 1641 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +60 +90 +90 +70 +10 +08 +08 +08 +ENDCHAR +STARTCHAR afii57381 +ENCODING 1642 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +90 +10 +20 +20 +40 +48 +88 +ENDCHAR +STARTCHAR uni066B +ENCODING 1643 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 4 1 -1 +BITMAP +10 +10 +20 +C0 +ENDCHAR +STARTCHAR uni066C +ENCODING 1644 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 3 2 7 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR uni066E +ENCODING 1646 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +10 +88 +88 +70 +ENDCHAR +STARTCHAR uni066F +ENCODING 1647 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 -1 +BITMAP +10 +28 +98 +88 +70 +ENDCHAR +STARTCHAR uni0FD5 +ENCODING 4053 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +B8 +A0 +F8 +28 +E8 +ENDCHAR +STARTCHAR uni0FD6 +ENCODING 4054 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +E8 +28 +F8 +A0 +B8 +ENDCHAR +STARTCHAR uni1E00 +ENCODING 7680 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +88 +88 +F8 +88 +88 +88 +20 +50 +20 +ENDCHAR +STARTCHAR uni1E01 +ENCODING 7681 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +70 +08 +78 +88 +78 +20 +50 +20 +ENDCHAR +STARTCHAR uni1E02 +ENCODING 7682 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +F0 +88 +88 +F0 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR uni1E03 +ENCODING 7683 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +80 +80 +F0 +88 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR uni1E04 +ENCODING 7684 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F0 +88 +88 +F0 +88 +88 +88 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E05 +ENCODING 7685 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +80 +80 +F0 +88 +88 +88 +88 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E06 +ENCODING 7686 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F0 +88 +88 +F0 +88 +88 +88 +F0 +00 +70 +ENDCHAR +STARTCHAR uni1E07 +ENCODING 7687 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +80 +80 +F0 +88 +88 +88 +88 +F0 +00 +70 +ENDCHAR +STARTCHAR uni1E08 +ENCODING 7688 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +20 +78 +80 +80 +80 +80 +80 +80 +78 +20 +C0 +ENDCHAR +STARTCHAR uni1E09 +ENCODING 7689 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +20 +00 +78 +80 +80 +80 +80 +78 +20 +C0 +ENDCHAR +STARTCHAR uni1E0A +ENCODING 7690 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +E0 +90 +88 +88 +88 +88 +90 +E0 +ENDCHAR +STARTCHAR uni1E0B +ENCODING 7691 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +08 +08 +78 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni1E0C +ENCODING 7692 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +E0 +90 +88 +88 +88 +88 +90 +E0 +00 +20 +ENDCHAR +STARTCHAR uni1E0D +ENCODING 7693 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +08 +08 +78 +88 +88 +88 +88 +78 +00 +20 +ENDCHAR +STARTCHAR uni1E0E +ENCODING 7694 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +E0 +90 +88 +88 +88 +88 +90 +E0 +00 +70 +ENDCHAR +STARTCHAR uni1E0F +ENCODING 7695 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +08 +08 +78 +88 +88 +88 +88 +78 +00 +70 +ENDCHAR +STARTCHAR uni1E10 +ENCODING 7696 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +E0 +90 +88 +88 +88 +88 +90 +E0 +20 +C0 +ENDCHAR +STARTCHAR uni1E11 +ENCODING 7697 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +08 +08 +78 +88 +88 +88 +88 +78 +20 +C0 +ENDCHAR +STARTCHAR uni1E12 +ENCODING 7698 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +E0 +90 +88 +88 +88 +88 +90 +E0 +20 +50 +ENDCHAR +STARTCHAR uni1E13 +ENCODING 7699 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +08 +08 +78 +88 +88 +88 +88 +78 +20 +50 +ENDCHAR +STARTCHAR uni1E14 +ENCODING 7700 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +70 +00 +F8 +80 +F8 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1E15 +ENCODING 7701 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +70 +00 +70 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR uni1E16 +ENCODING 7702 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +70 +00 +F8 +80 +F8 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1E17 +ENCODING 7703 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +70 +00 +70 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR uni1E18 +ENCODING 7704 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F8 +80 +80 +F8 +80 +80 +80 +F8 +20 +50 +ENDCHAR +STARTCHAR uni1E19 +ENCODING 7705 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +70 +88 +F8 +80 +80 +78 +20 +50 +ENDCHAR +STARTCHAR uni1E1A +ENCODING 7706 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F8 +80 +80 +F8 +80 +80 +F8 +00 +68 +90 +ENDCHAR +STARTCHAR uni1E1B +ENCODING 7707 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +70 +88 +F8 +80 +78 +00 +68 +90 +ENDCHAR +STARTCHAR uni1E1C +ENCODING 7708 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +88 +70 +F8 +80 +80 +F8 +80 +80 +80 +F8 +20 +C0 +ENDCHAR +STARTCHAR uni1E1D +ENCODING 7709 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +88 +70 +00 +70 +88 +F8 +80 +80 +78 +20 +C0 +ENDCHAR +STARTCHAR uni1E1E +ENCODING 7710 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +F8 +80 +80 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E1F +ENCODING 7711 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 2 0 +BITMAP +80 +00 +60 +80 +E0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E20 +ENCODING 7712 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +78 +80 +80 +80 +98 +88 +88 +70 +ENDCHAR +STARTCHAR uni1E21 +ENCODING 7713 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +00 +78 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni1E22 +ENCODING 7714 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +88 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni1E23 +ENCODING 7715 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +80 +80 +F0 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni1E24 +ENCODING 7716 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E25 +ENCODING 7717 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +80 +80 +F0 +88 +88 +88 +88 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E26 +ENCODING 7718 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +88 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni1E27 +ENCODING 7719 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +80 +80 +F0 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni1E28 +ENCODING 7720 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +48 +48 +48 +78 +48 +48 +48 +48 +20 +C0 +ENDCHAR +STARTCHAR uni1E29 +ENCODING 7721 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +40 +40 +70 +48 +48 +48 +48 +48 +20 +C0 +ENDCHAR +STARTCHAR uni1E2A +ENCODING 7722 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +00 +88 +70 +ENDCHAR +STARTCHAR uni1E2B +ENCODING 7723 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +80 +80 +F0 +88 +88 +88 +88 +00 +88 +70 +ENDCHAR +STARTCHAR uni1E2C +ENCODING 7724 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +20 +00 +68 +90 +ENDCHAR +STARTCHAR uni1E2D +ENCODING 7725 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +20 +20 +00 +20 +20 +20 +20 +20 +00 +68 +90 +ENDCHAR +STARTCHAR uni1E2E +ENCODING 7726 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +20 +40 +00 +A0 +00 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni1E2F +ENCODING 7727 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +20 +40 +00 +A0 +00 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni1E30 +ENCODING 7728 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +88 +90 +A0 +C0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni1E31 +ENCODING 7729 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +20 +40 +80 +80 +90 +A0 +C0 +C0 +A0 +90 +ENDCHAR +STARTCHAR uni1E32 +ENCODING 7730 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +90 +A0 +C0 +C0 +A0 +90 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E33 +ENCODING 7731 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 -2 +BITMAP +80 +80 +90 +A0 +C0 +C0 +A0 +90 +00 +40 +ENDCHAR +STARTCHAR uni1E34 +ENCODING 7732 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +90 +A0 +C0 +C0 +A0 +90 +88 +00 +70 +ENDCHAR +STARTCHAR uni1E35 +ENCODING 7733 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 -2 +BITMAP +80 +80 +90 +A0 +C0 +C0 +A0 +90 +00 +E0 +ENDCHAR +STARTCHAR uni1E36 +ENCODING 7734 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +F8 +00 +20 +ENDCHAR +STARTCHAR uni1E37 +ENCODING 7735 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 2 10 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +40 +00 +80 +ENDCHAR +STARTCHAR uni1E38 +ENCODING 7736 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +70 +00 +80 +80 +80 +80 +80 +80 +80 +F8 +00 +20 +ENDCHAR +STARTCHAR uni1E39 +ENCODING 7737 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 3 12 1 -2 +BITMAP +E0 +00 +40 +40 +40 +40 +40 +40 +40 +20 +00 +40 +ENDCHAR +STARTCHAR uni1E3A +ENCODING 7738 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +F8 +00 +70 +ENDCHAR +STARTCHAR uni1E3B +ENCODING 7739 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 3 10 1 -2 +BITMAP +40 +40 +40 +40 +40 +40 +40 +20 +00 +E0 +ENDCHAR +STARTCHAR uni1E3C +ENCODING 7740 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +F8 +20 +50 +ENDCHAR +STARTCHAR uni1E3D +ENCODING 7741 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 3 10 1 -2 +BITMAP +40 +40 +40 +40 +40 +40 +20 +00 +40 +A0 +ENDCHAR +STARTCHAR uni1E3E +ENCODING 7742 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +88 +D8 +A8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni1E3F +ENCODING 7743 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +F0 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni1E40 +ENCODING 7744 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +88 +D8 +A8 +A8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni1E41 +ENCODING 7745 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +F0 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni1E42 +ENCODING 7746 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +D8 +A8 +A8 +88 +88 +88 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E43 +ENCODING 7747 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F0 +A8 +A8 +A8 +A8 +A8 +00 +20 +ENDCHAR +STARTCHAR uni1E44 +ENCODING 7748 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +88 +C8 +C8 +A8 +A8 +98 +98 +88 +ENDCHAR +STARTCHAR uni1E45 +ENCODING 7749 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +F0 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni1E46 +ENCODING 7750 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +C8 +C8 +A8 +A8 +98 +98 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E47 +ENCODING 7751 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F0 +88 +88 +88 +88 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E48 +ENCODING 7752 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +C8 +C8 +A8 +A8 +98 +98 +88 +00 +70 +ENDCHAR +STARTCHAR uni1E49 +ENCODING 7753 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F0 +88 +88 +88 +88 +88 +00 +70 +ENDCHAR +STARTCHAR uni1E4A +ENCODING 7754 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +C8 +C8 +A8 +A8 +98 +98 +88 +20 +50 +ENDCHAR +STARTCHAR uni1E4B +ENCODING 7755 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F0 +88 +88 +88 +88 +88 +20 +50 +ENDCHAR +STARTCHAR uni1E4C +ENCODING 7756 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +68 +B0 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1E4D +ENCODING 7757 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +68 +B0 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1E4E +ENCODING 7758 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +68 +B0 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1E4F +ENCODING 7759 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +68 +B0 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1E50 +ENCODING 7760 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +70 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1E51 +ENCODING 7761 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +70 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1E52 +ENCODING 7762 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +70 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1E53 +ENCODING 7763 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +70 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1E54 +ENCODING 7764 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +F0 +88 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E55 +ENCODING 7765 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +20 +00 +F0 +88 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR uni1E56 +ENCODING 7766 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +F0 +88 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E57 +ENCODING 7767 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +00 +F0 +88 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR uni1E58 +ENCODING 7768 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +F0 +88 +88 +88 +F0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni1E59 +ENCODING 7769 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +78 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E5A +ENCODING 7770 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F0 +88 +88 +88 +F0 +A0 +90 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E5B +ENCODING 7771 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +78 +80 +80 +80 +80 +80 +00 +20 +ENDCHAR +STARTCHAR uni1E5C +ENCODING 7772 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +70 +00 +F0 +88 +88 +88 +F0 +A0 +90 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E5D +ENCODING 7773 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +00 +78 +80 +80 +80 +80 +80 +00 +20 +ENDCHAR +STARTCHAR uni1E5E +ENCODING 7774 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F0 +88 +88 +88 +F0 +A0 +90 +88 +00 +70 +ENDCHAR +STARTCHAR uni1E5F +ENCODING 7775 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +78 +80 +80 +80 +80 +80 +00 +70 +ENDCHAR +STARTCHAR uni1E60 +ENCODING 7776 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +78 +80 +80 +70 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR uni1E61 +ENCODING 7777 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +78 +80 +70 +08 +08 +F0 +ENDCHAR +STARTCHAR uni1E62 +ENCODING 7778 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +78 +80 +80 +70 +08 +08 +08 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E63 +ENCODING 7779 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +78 +80 +70 +08 +08 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E64 +ENCODING 7780 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +08 +50 +00 +78 +80 +80 +70 +08 +08 +F0 +ENDCHAR +STARTCHAR uni1E65 +ENCODING 7781 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +08 +50 +00 +78 +80 +70 +08 +08 +F0 +ENDCHAR +STARTCHAR uni1E66 +ENCODING 7782 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +A0 +48 +00 +78 +80 +80 +70 +08 +08 +F0 +ENDCHAR +STARTCHAR uni1E67 +ENCODING 7783 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +A0 +48 +00 +78 +80 +70 +08 +08 +F0 +ENDCHAR +STARTCHAR uni1E68 +ENCODING 7784 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +20 +00 +78 +80 +80 +70 +08 +08 +08 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E69 +ENCODING 7785 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +00 +78 +80 +70 +08 +08 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E6A +ENCODING 7786 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1E6B +ENCODING 7787 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +40 +00 +80 +80 +E0 +80 +80 +80 +80 +60 +ENDCHAR +STARTCHAR uni1E6C +ENCODING 7788 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +00 +20 +ENDCHAR +STARTCHAR uni1E6D +ENCODING 7789 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 3 10 1 -2 +BITMAP +80 +80 +E0 +80 +80 +80 +80 +60 +00 +40 +ENDCHAR +STARTCHAR uni1E6E +ENCODING 7790 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +00 +70 +ENDCHAR +STARTCHAR uni1E6F +ENCODING 7791 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 3 10 1 -2 +BITMAP +80 +80 +E0 +80 +80 +80 +80 +60 +00 +E0 +ENDCHAR +STARTCHAR uni1E70 +ENCODING 7792 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +20 +50 +ENDCHAR +STARTCHAR uni1E71 +ENCODING 7793 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 3 10 1 -2 +BITMAP +80 +80 +E0 +80 +80 +80 +80 +60 +40 +A0 +ENDCHAR +STARTCHAR uni1E72 +ENCODING 7794 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +88 +88 +88 +88 +88 +88 +70 +00 +50 +ENDCHAR +STARTCHAR uni1E73 +ENCODING 7795 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +88 +88 +88 +88 +88 +78 +00 +50 +ENDCHAR +STARTCHAR uni1E74 +ENCODING 7796 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +88 +88 +88 +88 +88 +70 +00 +68 +90 +ENDCHAR +STARTCHAR uni1E75 +ENCODING 7797 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +88 +88 +88 +88 +78 +00 +68 +90 +ENDCHAR +STARTCHAR uni1E76 +ENCODING 7798 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +88 +88 +88 +88 +88 +88 +70 +20 +50 +ENDCHAR +STARTCHAR uni1E77 +ENCODING 7799 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +88 +88 +88 +88 +88 +78 +20 +50 +ENDCHAR +STARTCHAR uni1E78 +ENCODING 7800 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +68 +B0 +00 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1E79 +ENCODING 7801 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +68 +B0 +00 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni1E7A +ENCODING 7802 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +70 +00 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1E7B +ENCODING 7803 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +70 +00 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni1E7C +ENCODING 7804 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +90 +00 +88 +88 +50 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni1E7D +ENCODING 7805 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +A8 +90 +00 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni1E7E +ENCODING 7806 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +88 +88 +50 +50 +50 +20 +20 +00 +20 +ENDCHAR +STARTCHAR uni1E7F +ENCODING 7807 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +88 +88 +50 +50 +20 +20 +00 +20 +ENDCHAR +STARTCHAR Wgrave +ENCODING 7808 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +88 +88 +88 +88 +A8 +A8 +D8 +88 +ENDCHAR +STARTCHAR wgrave +ENCODING 7809 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +00 +88 +88 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR Wacute +ENCODING 7810 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +88 +88 +88 +88 +A8 +A8 +D8 +88 +ENDCHAR +STARTCHAR wacute +ENCODING 7811 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +88 +88 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR Wdieresis +ENCODING 7812 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +88 +88 +88 +88 +A8 +A8 +D8 +88 +ENDCHAR +STARTCHAR wdieresis +ENCODING 7813 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +88 +88 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni1E86 +ENCODING 7814 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +88 +88 +88 +88 +A8 +A8 +D8 +88 +ENDCHAR +STARTCHAR uni1E87 +ENCODING 7815 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +88 +88 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni1E88 +ENCODING 7816 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +88 +88 +88 +A8 +A8 +D8 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E89 +ENCODING 7817 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +88 +88 +A8 +A8 +A8 +70 +00 +20 +ENDCHAR +STARTCHAR uni1E8A +ENCODING 7818 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +88 +88 +50 +20 +20 +50 +88 +88 +ENDCHAR +STARTCHAR uni1E8B +ENCODING 7819 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +88 +50 +20 +20 +50 +88 +ENDCHAR +STARTCHAR uni1E8C +ENCODING 7820 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +00 +88 +88 +50 +20 +20 +50 +88 +88 +ENDCHAR +STARTCHAR uni1E8D +ENCODING 7821 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +00 +88 +50 +20 +20 +50 +88 +ENDCHAR +STARTCHAR uni1E8E +ENCODING 7822 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +00 +88 +88 +50 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1E8F +ENCODING 7823 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +00 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni1E90 +ENCODING 7824 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +F8 +08 +10 +20 +40 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1E91 +ENCODING 7825 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +50 +00 +F8 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR uni1E92 +ENCODING 7826 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F8 +08 +10 +20 +40 +80 +80 +F8 +00 +20 +ENDCHAR +STARTCHAR uni1E93 +ENCODING 7827 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F8 +10 +20 +40 +80 +F8 +00 +20 +ENDCHAR +STARTCHAR uni1E94 +ENCODING 7828 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F8 +08 +10 +20 +40 +80 +80 +F8 +00 +70 +ENDCHAR +STARTCHAR uni1E95 +ENCODING 7829 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F8 +10 +20 +40 +80 +F8 +00 +70 +ENDCHAR +STARTCHAR uni1E96 +ENCODING 7830 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +80 +80 +F0 +88 +88 +88 +88 +88 +00 +70 +ENDCHAR +STARTCHAR uni1E97 +ENCODING 7831 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +A0 +00 +80 +80 +E0 +80 +80 +80 +80 +60 +ENDCHAR +STARTCHAR uni1E98 +ENCODING 7832 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +70 +00 +88 +88 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni1E99 +ENCODING 7833 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +88 +70 +00 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni1E9A +ENCODING 7834 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +04 +74 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR uni1E9B +ENCODING 7835 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 0 0 +BITMAP +20 +00 +30 +40 +C0 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni1E9C +ENCODING 7836 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 0 0 +BITMAP +30 +40 +C0 +40 +60 +C0 +40 +40 +ENDCHAR +STARTCHAR uni1E9D +ENCODING 7837 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 0 0 +BITMAP +30 +40 +E0 +40 +C0 +40 +40 +40 +ENDCHAR +STARTCHAR uni1E9E +ENCODING 7838 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +B8 +C0 +B0 +88 +88 +F0 +ENDCHAR +STARTCHAR uni1E9F +ENCODING 7839 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +48 +40 +60 +90 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EA0 +ENCODING 7840 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +88 +88 +88 +F8 +88 +88 +88 +00 +20 +ENDCHAR +STARTCHAR uni1EA1 +ENCODING 7841 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +70 +08 +78 +88 +88 +78 +00 +20 +ENDCHAR +STARTCHAR uni1EA2 +ENCODING 7842 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +20 +70 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1EA3 +ENCODING 7843 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +C0 +20 +00 +70 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR uni1EA4 +ENCODING 7844 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +90 +28 +00 +70 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1EA5 +ENCODING 7845 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +90 +28 +00 +70 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR uni1EA6 +ENCODING 7846 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +48 +A0 +00 +70 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1EA7 +ENCODING 7847 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +48 +A0 +00 +70 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR uni1EA8 +ENCODING 7848 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +20 +50 +00 +70 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1EA9 +ENCODING 7849 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +20 +50 +00 +70 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR uni1EAA +ENCODING 7850 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +20 +50 +00 +70 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni1EAB +ENCODING 7851 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +20 +50 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni1EAC +ENCODING 7852 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +20 +50 +00 +70 +88 +88 +F8 +88 +88 +88 +00 +20 +ENDCHAR +STARTCHAR uni1EAD +ENCODING 7853 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +20 +50 +00 +70 +08 +78 +88 +88 +78 +00 +20 +ENDCHAR +STARTCHAR uni1EAE +ENCODING 7854 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +88 +70 +00 +70 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni1EAF +ENCODING 7855 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +88 +70 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni1EB0 +ENCODING 7856 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +88 +70 +00 +70 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni1EB1 +ENCODING 7857 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +88 +70 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni1EB2 +ENCODING 7858 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +20 +88 +70 +00 +70 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni1EB3 +ENCODING 7859 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +20 +88 +70 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni1EB4 +ENCODING 7860 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +88 +70 +00 +70 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni1EB5 +ENCODING 7861 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +88 +70 +00 +70 +08 +78 +88 +78 +ENDCHAR +STARTCHAR uni1EB6 +ENCODING 7862 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +88 +70 +00 +70 +88 +88 +F8 +88 +88 +88 +00 +20 +ENDCHAR +STARTCHAR uni1EB7 +ENCODING 7863 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +88 +70 +00 +70 +08 +78 +88 +88 +78 +00 +20 +ENDCHAR +STARTCHAR uni1EB8 +ENCODING 7864 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +F8 +80 +80 +F8 +80 +80 +80 +F8 +00 +20 +ENDCHAR +STARTCHAR uni1EB9 +ENCODING 7865 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +70 +88 +F8 +80 +80 +78 +00 +20 +ENDCHAR +STARTCHAR uni1EBA +ENCODING 7866 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +20 +F8 +80 +80 +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1EBB +ENCODING 7867 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +C0 +20 +00 +70 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR uni1EBC +ENCODING 7868 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +90 +00 +F8 +80 +80 +F8 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1EBD +ENCODING 7869 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +A8 +90 +00 +70 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR uni1EBE +ENCODING 7870 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +90 +28 +00 +F8 +80 +F8 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1EBF +ENCODING 7871 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +90 +28 +00 +70 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR uni1EC0 +ENCODING 7872 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +48 +A0 +00 +F8 +80 +F8 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1EC1 +ENCODING 7873 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +48 +A0 +00 +70 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR uni1EC2 +ENCODING 7874 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +20 +50 +00 +F8 +80 +F8 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1EC3 +ENCODING 7875 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +20 +50 +00 +70 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR uni1EC4 +ENCODING 7876 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +20 +50 +00 +F8 +80 +F8 +80 +F8 +ENDCHAR +STARTCHAR uni1EC5 +ENCODING 7877 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +20 +50 +00 +70 +88 +F8 +80 +78 +ENDCHAR +STARTCHAR uni1EC6 +ENCODING 7878 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +20 +50 +F8 +80 +80 +F8 +80 +80 +80 +F8 +00 +20 +ENDCHAR +STARTCHAR uni1EC7 +ENCODING 7879 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +20 +50 +00 +70 +88 +F8 +80 +80 +78 +00 +20 +ENDCHAR +STARTCHAR uni1EC8 +ENCODING 7880 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +C0 +20 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni1EC9 +ENCODING 7881 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 3 11 0 -2 +BITMAP +C0 +20 +00 +20 +20 +20 +20 +20 +20 +00 +20 +ENDCHAR +STARTCHAR uni1ECA +ENCODING 7882 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 10 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +00 +80 +ENDCHAR +STARTCHAR uni1ECB +ENCODING 7883 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 11 2 -2 +BITMAP +80 +80 +00 +80 +80 +80 +80 +80 +80 +00 +80 +ENDCHAR +STARTCHAR uni1ECC +ENCODING 7884 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +70 +88 +88 +88 +88 +88 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1ECD +ENCODING 7885 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +70 +88 +88 +88 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1ECE +ENCODING 7886 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +20 +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1ECF +ENCODING 7887 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +C0 +20 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1ED0 +ENCODING 7888 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +90 +28 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1ED1 +ENCODING 7889 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +90 +28 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1ED2 +ENCODING 7890 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +48 +A0 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1ED3 +ENCODING 7891 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +48 +A0 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1ED4 +ENCODING 7892 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +20 +50 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1ED5 +ENCODING 7893 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +20 +50 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1ED6 +ENCODING 7894 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +20 +50 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1ED7 +ENCODING 7895 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +B0 +20 +50 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1ED8 +ENCODING 7896 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +20 +50 +70 +88 +88 +88 +88 +88 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1ED9 +ENCODING 7897 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +20 +50 +00 +70 +88 +88 +88 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1EDA +ENCODING 7898 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +10 +24 +74 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EDB +ENCODING 7899 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +20 +04 +74 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EDC +ENCODING 7900 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +24 +74 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EDD +ENCODING 7901 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +40 +20 +04 +74 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EDE +ENCODING 7902 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +C0 +24 +74 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EDF +ENCODING 7903 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +C0 +20 +04 +74 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EE0 +ENCODING 7904 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +68 +B0 +04 +74 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EE1 +ENCODING 7905 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +48 +A8 +90 +04 +74 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EE2 +ENCODING 7906 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 11 0 -2 +BITMAP +04 +74 +88 +88 +88 +88 +88 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1EE3 +ENCODING 7907 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +04 +74 +88 +88 +88 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1EE4 +ENCODING 7908 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +88 +88 +88 +88 +88 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1EE5 +ENCODING 7909 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +88 +88 +88 +88 +88 +78 +00 +20 +ENDCHAR +STARTCHAR uni1EE6 +ENCODING 7910 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +20 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EE7 +ENCODING 7911 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +20 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni1EE8 +ENCODING 7912 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +14 +24 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EE9 +ENCODING 7913 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +10 +24 +04 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni1EEA +ENCODING 7914 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +44 +24 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EEB +ENCODING 7915 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +40 +24 +04 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni1EEC +ENCODING 7916 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +C4 +24 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EED +ENCODING 7917 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +C0 +24 +04 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni1EEE +ENCODING 7918 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +68 +B4 +04 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EEF +ENCODING 7919 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +48 +A8 +94 +04 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni1EF0 +ENCODING 7920 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +04 +04 +88 +88 +88 +88 +88 +88 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1EF1 +ENCODING 7921 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +04 +04 +88 +88 +88 +88 +88 +78 +00 +20 +ENDCHAR +STARTCHAR Ygrave +ENCODING 7922 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +88 +88 +50 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR ygrave +ENCODING 7923 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +40 +20 +00 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni1EF4 +ENCODING 7924 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +88 +88 +50 +50 +20 +20 +20 +20 +00 +20 +ENDCHAR +STARTCHAR uni1EF5 +ENCODING 7925 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +88 +88 +88 +88 +88 +70 +10 +E8 +ENDCHAR +STARTCHAR uni1EF6 +ENCODING 7926 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +C0 +20 +88 +88 +50 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1EF7 +ENCODING 7927 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +C0 +20 +00 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni1EF8 +ENCODING 7928 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +68 +90 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1EF9 +ENCODING 7929 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +48 +A8 +90 +00 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni1EFA +ENCODING 7930 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +F8 +ENDCHAR +STARTCHAR uni1EFB +ENCODING 7931 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +50 +ENDCHAR +STARTCHAR uni1EFC +ENCODING 7932 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +30 +40 +80 +80 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EFD +ENCODING 7933 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +30 +40 +80 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EFE +ENCODING 7934 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +88 +88 +50 +50 +20 +20 +60 +A0 +40 +ENDCHAR +STARTCHAR uni1EFF +ENCODING 7935 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +88 +88 +88 +78 +08 +48 +A8 +70 +ENDCHAR +STARTCHAR uni1F00 +ENCODING 7936 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +10 +20 +00 +68 +98 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni1F01 +ENCODING 7937 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +40 +20 +00 +68 +98 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni1F02 +ENCODING 7938 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +50 +88 +00 +68 +98 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni1F03 +ENCODING 7939 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +90 +48 +00 +68 +98 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni1F04 +ENCODING 7940 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +48 +90 +00 +68 +98 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni1F05 +ENCODING 7941 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +88 +50 +00 +68 +98 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni1F06 +ENCODING 7942 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +A8 +20 +40 +00 +68 +98 +88 +98 +68 +ENDCHAR +STARTCHAR uni1F07 +ENCODING 7943 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +A8 +20 +10 +00 +68 +98 +88 +98 +68 +ENDCHAR +STARTCHAR uni1F08 +ENCODING 7944 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +40 +80 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F09 +ENCODING 7945 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +40 +20 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F0A +ENCODING 7946 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +48 +80 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F0B +ENCODING 7947 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +48 +20 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F0C +ENCODING 7948 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +50 +80 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F0D +ENCODING 7949 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +50 +20 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F0E +ENCODING 7950 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +A8 +20 +40 +70 +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni1F0F +ENCODING 7951 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +A8 +20 +10 +70 +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni1F10 +ENCODING 7952 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +10 +20 +00 +78 +80 +70 +80 +80 +78 +ENDCHAR +STARTCHAR uni1F11 +ENCODING 7953 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +40 +20 +00 +78 +80 +70 +80 +80 +78 +ENDCHAR +STARTCHAR uni1F12 +ENCODING 7954 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +50 +88 +00 +78 +80 +70 +80 +80 +78 +ENDCHAR +STARTCHAR uni1F13 +ENCODING 7955 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +90 +48 +00 +78 +80 +70 +80 +80 +78 +ENDCHAR +STARTCHAR uni1F14 +ENCODING 7956 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +48 +90 +00 +78 +80 +70 +80 +80 +78 +ENDCHAR +STARTCHAR uni1F15 +ENCODING 7957 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +88 +50 +00 +78 +80 +70 +80 +80 +78 +ENDCHAR +STARTCHAR uni1F18 +ENCODING 7960 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +10 +20 +F8 +80 +80 +F8 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F19 +ENCODING 7961 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +40 +20 +F8 +80 +80 +F8 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F1A +ENCODING 7962 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +48 +80 +00 +F8 +80 +F8 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F1B +ENCODING 7963 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +88 +40 +00 +F8 +80 +F8 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F1C +ENCODING 7964 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +50 +80 +00 +F8 +80 +F8 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F1D +ENCODING 7965 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +90 +40 +00 +F8 +80 +F8 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F20 +ENCODING 7968 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +10 +20 +00 +F0 +88 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F21 +ENCODING 7969 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +40 +40 +20 +00 +F0 +88 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F22 +ENCODING 7970 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +40 +50 +88 +00 +F0 +88 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F23 +ENCODING 7971 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +80 +90 +48 +00 +F0 +88 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F24 +ENCODING 7972 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +40 +48 +90 +00 +F0 +88 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F25 +ENCODING 7973 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +80 +88 +50 +00 +F0 +88 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F26 +ENCODING 7974 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +70 +A8 +20 +40 +00 +F0 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F27 +ENCODING 7975 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +70 +A8 +20 +10 +00 +F0 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F28 +ENCODING 7976 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +10 +20 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F29 +ENCODING 7977 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +40 +20 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F2A +ENCODING 7978 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +48 +80 +00 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F2B +ENCODING 7979 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +88 +40 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F2C +ENCODING 7980 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +50 +80 +00 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F2D +ENCODING 7981 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +90 +40 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F2E +ENCODING 7982 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +A8 +20 +40 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F2F +ENCODING 7983 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +A8 +20 +10 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F30 +ENCODING 7984 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 2 0 +BITMAP +40 +40 +80 +00 +80 +80 +80 +80 +80 +60 +ENDCHAR +STARTCHAR uni1F31 +ENCODING 7985 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +80 +80 +40 +00 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR uni1F32 +ENCODING 7986 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +50 +88 +00 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni1F33 +ENCODING 7987 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +90 +48 +00 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni1F34 +ENCODING 7988 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +48 +90 +00 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni1F35 +ENCODING 7989 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +88 +50 +00 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni1F36 +ENCODING 7990 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +A8 +20 +40 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni1F37 +ENCODING 7991 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +A8 +20 +10 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni1F38 +ENCODING 7992 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 0 0 +BITMAP +40 +40 +80 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1F39 +ENCODING 7993 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 0 0 +BITMAP +80 +80 +40 +00 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1F3A +ENCODING 7994 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +48 +80 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1F3B +ENCODING 7995 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +90 +88 +40 +00 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1F3C +ENCODING 7996 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +50 +80 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1F3D +ENCODING 7997 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +90 +40 +00 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1F3E +ENCODING 7998 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +A8 +20 +40 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1F3F +ENCODING 7999 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +A8 +20 +10 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1F40 +ENCODING 8000 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +10 +20 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F41 +ENCODING 8001 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +40 +20 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F42 +ENCODING 8002 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +50 +88 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F43 +ENCODING 8003 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +90 +48 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F44 +ENCODING 8004 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +48 +90 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F45 +ENCODING 8005 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +88 +50 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F48 +ENCODING 8008 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +40 +80 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F49 +ENCODING 8009 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +40 +20 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F4A +ENCODING 8010 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +48 +80 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F4B +ENCODING 8011 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +48 +20 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F4C +ENCODING 8012 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +50 +80 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F4D +ENCODING 8013 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +44 +48 +20 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F50 +ENCODING 8016 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +10 +20 +00 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni1F51 +ENCODING 8017 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +40 +20 +00 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni1F52 +ENCODING 8018 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +50 +88 +00 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni1F53 +ENCODING 8019 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +90 +48 +00 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni1F54 +ENCODING 8020 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +48 +90 +00 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni1F55 +ENCODING 8021 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +88 +50 +00 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni1F56 +ENCODING 8022 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +A8 +20 +40 +00 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni1F57 +ENCODING 8023 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +A8 +20 +10 +00 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni1F59 +ENCODING 8025 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +40 +20 +88 +88 +50 +50 +20 +20 +20 +ENDCHAR +STARTCHAR uni1F5B +ENCODING 8027 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +48 +20 +88 +88 +50 +50 +20 +20 +20 +ENDCHAR +STARTCHAR uni1F5D +ENCODING 8029 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +90 +40 +88 +88 +50 +50 +20 +20 +20 +ENDCHAR +STARTCHAR uni1F5F +ENCODING 8031 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +A8 +20 +10 +88 +88 +50 +20 +20 +20 +ENDCHAR +STARTCHAR uni1F60 +ENCODING 8032 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +10 +20 +00 +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F61 +ENCODING 8033 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +40 +20 +00 +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F62 +ENCODING 8034 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +50 +88 +00 +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F63 +ENCODING 8035 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +90 +48 +00 +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F64 +ENCODING 8036 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +48 +90 +00 +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F65 +ENCODING 8037 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +88 +50 +00 +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F66 +ENCODING 8038 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +A8 +20 +40 +00 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F67 +ENCODING 8039 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +A8 +20 +10 +00 +88 +88 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F68 +ENCODING 8040 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +40 +80 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F69 +ENCODING 8041 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +40 +20 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F6A +ENCODING 8042 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +48 +80 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F6B +ENCODING 8043 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +48 +20 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F6C +ENCODING 8044 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +50 +80 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F6D +ENCODING 8045 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +48 +50 +20 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F6E +ENCODING 8046 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +A8 +20 +40 +70 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F6F +ENCODING 8047 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +A8 +20 +10 +70 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F70 +ENCODING 8048 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +00 +68 +98 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni1F71 +ENCODING 8049 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +68 +98 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni1F72 +ENCODING 8050 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +00 +78 +80 +70 +80 +80 +78 +ENDCHAR +STARTCHAR uni1F73 +ENCODING 8051 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +78 +80 +70 +80 +80 +78 +ENDCHAR +STARTCHAR uni1F74 +ENCODING 8052 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +40 +20 +00 +F0 +88 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F75 +ENCODING 8053 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +20 +00 +F0 +88 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F76 +ENCODING 8054 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 9 1 0 +BITMAP +80 +40 +00 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR uni1F77 +ENCODING 8055 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 9 2 0 +BITMAP +40 +80 +00 +80 +80 +80 +80 +80 +60 +ENDCHAR +STARTCHAR uni1F78 +ENCODING 8056 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F79 +ENCODING 8057 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F7A +ENCODING 8058 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +00 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F7B +ENCODING 8059 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F7C +ENCODING 8060 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +40 +20 +00 +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F7D +ENCODING 8061 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +10 +20 +00 +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F80 +ENCODING 8064 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +10 +20 +00 +68 +98 +88 +88 +98 +68 +80 +40 +ENDCHAR +STARTCHAR uni1F81 +ENCODING 8065 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +40 +40 +20 +00 +68 +98 +88 +88 +98 +68 +80 +40 +ENDCHAR +STARTCHAR uni1F82 +ENCODING 8066 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +40 +50 +88 +00 +68 +98 +88 +88 +98 +68 +80 +40 +ENDCHAR +STARTCHAR uni1F83 +ENCODING 8067 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +80 +90 +48 +00 +68 +98 +88 +88 +98 +68 +80 +40 +ENDCHAR +STARTCHAR uni1F84 +ENCODING 8068 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +40 +48 +90 +00 +68 +98 +88 +88 +98 +68 +80 +40 +ENDCHAR +STARTCHAR uni1F85 +ENCODING 8069 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +80 +88 +50 +00 +68 +98 +88 +88 +98 +68 +80 +40 +ENDCHAR +STARTCHAR uni1F86 +ENCODING 8070 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +70 +A8 +20 +40 +00 +68 +98 +88 +98 +68 +80 +40 +ENDCHAR +STARTCHAR uni1F87 +ENCODING 8071 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +70 +A8 +20 +10 +00 +68 +98 +88 +98 +68 +80 +40 +ENDCHAR +STARTCHAR uni1F88 +ENCODING 8072 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +40 +80 +40 +A8 +A8 +E8 +A8 +A8 +A4 +ENDCHAR +STARTCHAR uni1F89 +ENCODING 8073 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +20 +20 +10 +40 +A8 +A8 +E8 +A8 +A8 +A4 +ENDCHAR +STARTCHAR uni1F8A +ENCODING 8074 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +50 +48 +80 +40 +A8 +A8 +E8 +A8 +A8 +A4 +ENDCHAR +STARTCHAR uni1F8B +ENCODING 8075 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +50 +48 +20 +40 +A8 +A8 +E8 +A8 +A8 +A4 +ENDCHAR +STARTCHAR uni1F8C +ENCODING 8076 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +48 +50 +80 +40 +A8 +A8 +E8 +A8 +A8 +A4 +ENDCHAR +STARTCHAR uni1F8D +ENCODING 8077 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +44 +48 +20 +40 +A8 +A8 +E8 +A8 +A8 +A4 +ENDCHAR +STARTCHAR uni1F8E +ENCODING 8078 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +70 +A8 +20 +40 +00 +48 +A8 +E8 +A8 +A4 +ENDCHAR +STARTCHAR uni1F8F +ENCODING 8079 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +70 +A8 +20 +10 +40 +A8 +A8 +E8 +A8 +A4 +ENDCHAR +STARTCHAR uni1F90 +ENCODING 8080 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +10 +20 +00 +F0 +88 +88 +88 +88 +08 +88 +48 +ENDCHAR +STARTCHAR uni1F91 +ENCODING 8081 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +40 +40 +20 +00 +F0 +88 +88 +88 +88 +08 +88 +48 +ENDCHAR +STARTCHAR uni1F92 +ENCODING 8082 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +40 +50 +88 +00 +F0 +88 +88 +88 +88 +08 +88 +48 +ENDCHAR +STARTCHAR uni1F93 +ENCODING 8083 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +80 +90 +48 +00 +F0 +88 +88 +88 +88 +08 +88 +48 +ENDCHAR +STARTCHAR uni1F94 +ENCODING 8084 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +40 +48 +90 +00 +F0 +88 +88 +88 +88 +08 +88 +48 +ENDCHAR +STARTCHAR uni1F95 +ENCODING 8085 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +80 +88 +50 +00 +F0 +88 +88 +88 +88 +08 +88 +48 +ENDCHAR +STARTCHAR uni1F96 +ENCODING 8086 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +70 +A8 +20 +40 +00 +F0 +88 +88 +88 +08 +88 +48 +ENDCHAR +STARTCHAR uni1F97 +ENCODING 8087 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +70 +A8 +20 +10 +00 +F0 +88 +88 +88 +08 +88 +48 +ENDCHAR +STARTCHAR uni1F98 +ENCODING 8088 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +40 +80 +00 +A0 +A8 +E8 +A8 +A8 +A4 +ENDCHAR +STARTCHAR uni1F99 +ENCODING 8089 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +80 +80 +40 +00 +A0 +A8 +E8 +A8 +A8 +A4 +ENDCHAR +STARTCHAR uni1F9A +ENCODING 8090 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +50 +48 +80 +00 +A0 +A8 +E8 +A8 +A8 +A4 +ENDCHAR +STARTCHAR uni1F9B +ENCODING 8091 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +90 +88 +40 +00 +A0 +A8 +E8 +A8 +A8 +A4 +ENDCHAR +STARTCHAR uni1F9C +ENCODING 8092 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +48 +50 +80 +00 +A0 +A8 +E8 +A8 +A8 +A4 +ENDCHAR +STARTCHAR uni1F9D +ENCODING 8093 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +88 +90 +40 +00 +A0 +A8 +E8 +A8 +A8 +A4 +ENDCHAR +STARTCHAR uni1F9E +ENCODING 8094 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +70 +A8 +20 +40 +00 +A8 +A8 +E8 +A8 +A4 +ENDCHAR +STARTCHAR uni1F9F +ENCODING 8095 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +70 +A8 +20 +10 +A0 +A8 +E8 +A8 +A8 +A4 +ENDCHAR +STARTCHAR uni1FA0 +ENCODING 8096 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +10 +10 +20 +00 +88 +88 +A8 +A8 +A8 +50 +80 +40 +ENDCHAR +STARTCHAR uni1FA1 +ENCODING 8097 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +40 +40 +20 +00 +88 +88 +A8 +A8 +A8 +50 +80 +40 +ENDCHAR +STARTCHAR uni1FA2 +ENCODING 8098 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +40 +50 +88 +00 +88 +88 +A8 +A8 +A8 +50 +80 +40 +ENDCHAR +STARTCHAR uni1FA3 +ENCODING 8099 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +80 +90 +48 +00 +88 +88 +A8 +A8 +A8 +50 +80 +40 +ENDCHAR +STARTCHAR uni1FA4 +ENCODING 8100 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +40 +48 +90 +00 +88 +88 +A8 +A8 +A8 +50 +80 +40 +ENDCHAR +STARTCHAR uni1FA5 +ENCODING 8101 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +80 +88 +50 +00 +88 +88 +A8 +A8 +A8 +50 +80 +40 +ENDCHAR +STARTCHAR uni1FA6 +ENCODING 8102 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +70 +A8 +20 +40 +00 +88 +88 +A8 +A8 +50 +80 +40 +ENDCHAR +STARTCHAR uni1FA7 +ENCODING 8103 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +70 +A8 +20 +10 +00 +88 +88 +A8 +A8 +50 +80 +40 +ENDCHAR +STARTCHAR uni1FA8 +ENCODING 8104 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +40 +80 +40 +A8 +A8 +A8 +A8 +48 +E4 +ENDCHAR +STARTCHAR uni1FA9 +ENCODING 8105 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +80 +80 +40 +00 +40 +A8 +A8 +A8 +48 +E4 +ENDCHAR +STARTCHAR uni1FAA +ENCODING 8106 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +50 +48 +80 +40 +A8 +A8 +A8 +A8 +48 +E4 +ENDCHAR +STARTCHAR uni1FAB +ENCODING 8107 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +90 +88 +40 +00 +40 +A8 +A8 +A8 +48 +E4 +ENDCHAR +STARTCHAR uni1FAC +ENCODING 8108 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +48 +50 +80 +40 +A8 +A8 +A8 +A8 +48 +E4 +ENDCHAR +STARTCHAR uni1FAD +ENCODING 8109 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +88 +90 +40 +00 +40 +A8 +A8 +A8 +48 +E4 +ENDCHAR +STARTCHAR uni1FAE +ENCODING 8110 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +70 +A8 +20 +40 +A8 +A8 +A8 +A8 +48 +E4 +ENDCHAR +STARTCHAR uni1FAF +ENCODING 8111 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +70 +A8 +20 +10 +40 +A8 +A8 +A8 +48 +E4 +ENDCHAR +STARTCHAR uni1FB0 +ENCODING 8112 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +70 +00 +68 +98 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni1FB1 +ENCODING 8113 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +00 +68 +98 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni1FB2 +ENCODING 8114 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +40 +20 +00 +68 +98 +88 +88 +98 +68 +80 +40 +ENDCHAR +STARTCHAR uni1FB3 +ENCODING 8115 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +68 +98 +88 +88 +98 +68 +80 +40 +ENDCHAR +STARTCHAR uni1FB4 +ENCODING 8116 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +20 +00 +68 +98 +88 +88 +98 +68 +80 +40 +ENDCHAR +STARTCHAR uni1FB6 +ENCODING 8118 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +00 +68 +98 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni1FB7 +ENCODING 8119 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +88 +70 +00 +68 +98 +88 +88 +98 +68 +80 +40 +ENDCHAR +STARTCHAR uni1FB8 +ENCODING 8120 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FB9 +ENCODING 8121 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +70 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FBA +ENCODING 8122 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +70 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FBB +ENCODING 8123 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +70 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FBC +ENCODING 8124 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +40 +A0 +A8 +A8 +E8 +A8 +A8 +A4 +ENDCHAR +STARTCHAR uni1FBD +ENCODING 8125 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 3 1 7 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR uni1FBE +ENCODING 8126 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 2 2 -2 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni1FBF +ENCODING 8127 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 3 1 7 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR uni1FC0 +ENCODING 8128 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 2 0 8 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni1FC1 +ENCODING 8129 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 4 0 6 +BITMAP +70 +88 +00 +50 +ENDCHAR +STARTCHAR uni1FC2 +ENCODING 8130 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +40 +20 +00 +F0 +88 +88 +88 +88 +08 +88 +48 +ENDCHAR +STARTCHAR uni1FC3 +ENCODING 8131 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F0 +88 +88 +88 +88 +08 +88 +48 +ENDCHAR +STARTCHAR uni1FC4 +ENCODING 8132 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +20 +00 +F0 +88 +88 +88 +88 +08 +88 +48 +ENDCHAR +STARTCHAR uni1FC6 +ENCODING 8134 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +70 +88 +00 +F0 +88 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1FC7 +ENCODING 8135 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +70 +88 +00 +F0 +88 +88 +88 +88 +08 +88 +48 +ENDCHAR +STARTCHAR uni1FC8 +ENCODING 8136 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +F8 +80 +80 +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1FC9 +ENCODING 8137 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +F8 +80 +80 +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1FCA +ENCODING 8138 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +40 +88 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FCB +ENCODING 8139 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +88 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FCC +ENCODING 8140 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +A0 +A0 +A8 +E8 +A8 +A8 +A8 +A4 +ENDCHAR +STARTCHAR uni1FCD +ENCODING 8141 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +40 +50 +88 +ENDCHAR +STARTCHAR uni1FCE +ENCODING 8142 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +40 +48 +90 +ENDCHAR +STARTCHAR uni1FCF +ENCODING 8143 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 4 0 6 +BITMAP +70 +A8 +20 +40 +ENDCHAR +STARTCHAR uni1FD0 +ENCODING 8144 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +70 +00 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni1FD1 +ENCODING 8145 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +E0 +00 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR uni1FD2 +ENCODING 8146 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +80 +40 +00 +A0 +00 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR uni1FD3 +ENCODING 8147 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +20 +40 +00 +A0 +00 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR uni1FD6 +ENCODING 8150 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +00 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni1FD7 +ENCODING 8151 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +00 +50 +00 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni1FD8 +ENCODING 8152 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1FD9 +ENCODING 8153 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +E0 +00 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni1FDA +ENCODING 8154 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 10 2 0 +BITMAP +80 +40 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni1FDB +ENCODING 8155 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 10 1 0 +BITMAP +40 +80 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni1FDD +ENCODING 8157 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +80 +90 +48 +ENDCHAR +STARTCHAR uni1FDE +ENCODING 8158 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 7 +BITMAP +80 +88 +50 +ENDCHAR +STARTCHAR uni1FDF +ENCODING 8159 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 4 0 6 +BITMAP +70 +A8 +20 +10 +ENDCHAR +STARTCHAR uni1FE0 +ENCODING 8160 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +88 +70 +00 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni1FE1 +ENCODING 8161 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +00 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni1FE2 +ENCODING 8162 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +00 +50 +00 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni1FE3 +ENCODING 8163 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +00 +50 +00 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni1FE4 +ENCODING 8164 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +20 +20 +40 +00 +70 +88 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR uni1FE5 +ENCODING 8165 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +20 +20 +10 +00 +70 +88 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR uni1FE6 +ENCODING 8166 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +00 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni1FE7 +ENCODING 8167 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +88 +00 +50 +00 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni1FE8 +ENCODING 8168 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +70 +00 +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1FE9 +ENCODING 8169 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +70 +00 +88 +88 +50 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1FEA +ENCODING 8170 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +88 +88 +50 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1FEB +ENCODING 8171 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +20 +88 +88 +50 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1FEC +ENCODING 8172 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +80 +80 +40 +F0 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni1FED +ENCODING 8173 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +80 +40 +00 +A0 +ENDCHAR +STARTCHAR uni1FEE +ENCODING 8174 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 4 1 6 +BITMAP +20 +40 +00 +A0 +ENDCHAR +STARTCHAR uni1FEF +ENCODING 8175 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 2 1 8 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni1FF2 +ENCODING 8178 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +40 +20 +00 +88 +88 +A8 +A8 +A8 +50 +80 +40 +ENDCHAR +STARTCHAR uni1FF3 +ENCODING 8179 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +88 +88 +A8 +A8 +A8 +50 +80 +40 +ENDCHAR +STARTCHAR uni1FF4 +ENCODING 8180 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +10 +20 +00 +88 +88 +A8 +A8 +A8 +50 +80 +40 +ENDCHAR +STARTCHAR uni1FF6 +ENCODING 8182 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +70 +88 +00 +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1FF7 +ENCODING 8183 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +70 +88 +00 +88 +88 +A8 +A8 +A8 +50 +80 +40 +ENDCHAR +STARTCHAR uni1FF8 +ENCODING 8184 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FF9 +ENCODING 8185 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FFA +ENCODING 8186 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +20 +70 +88 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1FFB +ENCODING 8187 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +80 +70 +88 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1FFC +ENCODING 8188 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +40 +A0 +A8 +A8 +A8 +A8 +48 +E4 +ENDCHAR +STARTCHAR uni1FFD +ENCODING 8189 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 2 2 8 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni1FFE +ENCODING 8190 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 3 2 7 +BITMAP +80 +80 +40 +ENDCHAR +STARTCHAR uni2000 +ENCODING 8192 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2001 +ENCODING 8193 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2002 +ENCODING 8194 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2003 +ENCODING 8195 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2004 +ENCODING 8196 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2005 +ENCODING 8197 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2006 +ENCODING 8198 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2007 +ENCODING 8199 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2008 +ENCODING 8200 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2009 +ENCODING 8201 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni200A +ENCODING 8202 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 1 5 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2010 +ENCODING 8208 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 1 1 3 +BITMAP +F0 +ENDCHAR +STARTCHAR uni2011 +ENCODING 8209 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 1 1 3 +BITMAP +F0 +ENDCHAR +STARTCHAR figuredash +ENCODING 8210 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR endash +ENCODING 8211 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 1 0 3 +BITMAP +FC +ENDCHAR +STARTCHAR emdash +ENCODING 8212 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 1 0 3 +BITMAP +FC +ENDCHAR +STARTCHAR afii00208 +ENCODING 8213 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 1 0 3 +BITMAP +FC +ENDCHAR +STARTCHAR uni2016 +ENCODING 8214 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 -2 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR underscoredbl +ENCODING 8215 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 3 0 -2 +BITMAP +FC +00 +FC +ENDCHAR +STARTCHAR quoteleft +ENCODING 8216 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 3 2 6 +BITMAP +40 +80 +80 +ENDCHAR +STARTCHAR quoteright +ENCODING 8217 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 3 1 6 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR quotesinglbase +ENCODING 8218 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 3 1 -1 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR quotereversed +ENCODING 8219 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 3 2 6 +BITMAP +80 +80 +40 +ENDCHAR +STARTCHAR quotedblleft +ENCODING 8220 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 3 1 6 +BITMAP +50 +A0 +A0 +ENDCHAR +STARTCHAR quotedblright +ENCODING 8221 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 3 1 6 +BITMAP +50 +50 +A0 +ENDCHAR +STARTCHAR quotedblbase +ENCODING 8222 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 3 0 -1 +BITMAP +50 +50 +A0 +ENDCHAR +STARTCHAR uni201F +ENCODING 8223 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 3 0 6 +BITMAP +A0 +A0 +50 +ENDCHAR +STARTCHAR dagger +ENCODING 8224 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +40 +E0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR daggerdbl +ENCODING 8225 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +40 +E0 +40 +40 +40 +40 +E0 +40 +ENDCHAR +STARTCHAR bullet +ENCODING 8226 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 4 1 2 +BITMAP +60 +F0 +F0 +60 +ENDCHAR +STARTCHAR uni2023 +ENCODING 8227 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 4 1 2 +BITMAP +C0 +F0 +F0 +C0 +ENDCHAR +STARTCHAR onedotenleader +ENCODING 8228 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 2 2 0 +BITMAP +80 +80 +ENDCHAR +STARTCHAR twodotenleader +ENCODING 8229 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 2 1 0 +BITMAP +A0 +A0 +ENDCHAR +STARTCHAR ellipsis +ENCODING 8230 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 2 0 0 +BITMAP +A8 +A8 +ENDCHAR +STARTCHAR uni2027 +ENCODING 8231 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 2 2 2 +BITMAP +80 +80 +ENDCHAR +STARTCHAR perthousand +ENCODING 8240 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +A0 +40 +0C +30 +C0 +00 +28 +54 +28 +ENDCHAR +STARTCHAR uni2031 +ENCODING 8241 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +40 +A0 +40 +0C +30 +C0 +00 +54 +A8 +54 +ENDCHAR +STARTCHAR minute +ENCODING 8242 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 3 2 6 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR second +ENCODING 8243 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni2034 +ENCODING 8244 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 3 0 6 +BITMAP +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2035 +ENCODING 8245 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 2 3 2 6 +BITMAP +80 +80 +40 +ENDCHAR +STARTCHAR uni2036 +ENCODING 8246 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 4 3 1 6 +BITMAP +A0 +A0 +50 +ENDCHAR +STARTCHAR uni2037 +ENCODING 8247 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 3 0 6 +BITMAP +A8 +A8 +54 +ENDCHAR +STARTCHAR uni2038 +ENCODING 8248 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 2 1 0 +BITMAP +40 +A0 +ENDCHAR +STARTCHAR guilsinglleft +ENCODING 8249 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +10 +20 +40 +80 +40 +20 +10 +ENDCHAR +STARTCHAR guilsinglright +ENCODING 8250 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +80 +40 +20 +10 +20 +40 +80 +ENDCHAR +STARTCHAR exclamdbl +ENCODING 8252 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +00 +A0 +A0 +ENDCHAR +STARTCHAR uni203D +ENCODING 8253 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +28 +28 +30 +20 +00 +20 +20 +ENDCHAR +STARTCHAR uni203E +ENCODING 8254 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 1 0 9 +BITMAP +F8 +ENDCHAR +STARTCHAR uni2043 +ENCODING 8259 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR uni2047 +ENCODING 8263 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +28 +28 +28 +50 +00 +50 +50 +ENDCHAR +STARTCHAR uni2048 +ENCODING 8264 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C8 +28 +28 +28 +48 +00 +48 +48 +ENDCHAR +STARTCHAR uni2049 +ENCODING 8265 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +B0 +88 +88 +88 +90 +00 +90 +90 +ENDCHAR +STARTCHAR uni204B +ENCODING 8267 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +A8 +A8 +A8 +B0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni204E +ENCODING 8270 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +50 +20 +F8 +20 +50 +ENDCHAR +STARTCHAR uni204F +ENCODING 8271 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 7 2 -1 +BITMAP +80 +80 +00 +00 +80 +80 +40 +ENDCHAR +STARTCHAR uni2051 +ENCODING 8273 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 11 0 -2 +BITMAP +50 +20 +F8 +20 +50 +00 +50 +20 +F8 +20 +50 +ENDCHAR +STARTCHAR uni2070 +ENCODING 8304 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 5 1 5 +BITMAP +60 +B0 +D0 +90 +60 +ENDCHAR +STARTCHAR uni2071 +ENCODING 8305 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 5 2 5 +BITMAP +80 +00 +80 +80 +80 +ENDCHAR +STARTCHAR uni2074 +ENCODING 8308 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 5 1 5 +BITMAP +20 +60 +A0 +F0 +20 +ENDCHAR +STARTCHAR uni2075 +ENCODING 8309 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 5 1 5 +BITMAP +F0 +80 +E0 +10 +E0 +ENDCHAR +STARTCHAR uni2076 +ENCODING 8310 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 5 1 5 +BITMAP +60 +80 +E0 +90 +60 +ENDCHAR +STARTCHAR uni2077 +ENCODING 8311 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 5 1 5 +BITMAP +F0 +10 +20 +40 +40 +ENDCHAR +STARTCHAR uni2078 +ENCODING 8312 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 5 1 5 +BITMAP +60 +90 +60 +90 +60 +ENDCHAR +STARTCHAR uni2079 +ENCODING 8313 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 5 1 5 +BITMAP +60 +90 +70 +10 +60 +ENDCHAR +STARTCHAR uni207A +ENCODING 8314 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR uni207B +ENCODING 8315 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 1 1 7 +BITMAP +E0 +ENDCHAR +STARTCHAR uni207C +ENCODING 8316 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 3 1 6 +BITMAP +E0 +00 +E0 +ENDCHAR +STARTCHAR uni207D +ENCODING 8317 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 5 2 5 +BITMAP +40 +80 +80 +80 +40 +ENDCHAR +STARTCHAR uni207E +ENCODING 8318 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 5 2 5 +BITMAP +80 +40 +40 +40 +80 +ENDCHAR +STARTCHAR uni207F +ENCODING 8319 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 4 1 5 +BITMAP +E0 +90 +90 +90 +ENDCHAR +STARTCHAR uni2080 +ENCODING 8320 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 5 1 -2 +BITMAP +60 +B0 +D0 +90 +60 +ENDCHAR +STARTCHAR uni2081 +ENCODING 8321 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 5 2 -2 +BITMAP +40 +C0 +40 +40 +40 +ENDCHAR +STARTCHAR uni2082 +ENCODING 8322 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 5 1 -2 +BITMAP +E0 +10 +60 +80 +F0 +ENDCHAR +STARTCHAR uni2083 +ENCODING 8323 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 5 1 -2 +BITMAP +E0 +10 +60 +10 +E0 +ENDCHAR +STARTCHAR uni2084 +ENCODING 8324 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 5 1 -2 +BITMAP +20 +60 +A0 +F0 +20 +ENDCHAR +STARTCHAR uni2085 +ENCODING 8325 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 5 1 -2 +BITMAP +F0 +80 +E0 +10 +E0 +ENDCHAR +STARTCHAR uni2086 +ENCODING 8326 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 5 1 -2 +BITMAP +60 +80 +E0 +90 +60 +ENDCHAR +STARTCHAR uni2087 +ENCODING 8327 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 5 1 -2 +BITMAP +F0 +10 +20 +40 +40 +ENDCHAR +STARTCHAR uni2088 +ENCODING 8328 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 5 1 -2 +BITMAP +60 +90 +60 +90 +60 +ENDCHAR +STARTCHAR uni2089 +ENCODING 8329 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 5 1 -2 +BITMAP +60 +90 +70 +10 +60 +ENDCHAR +STARTCHAR uni208A +ENCODING 8330 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 3 1 -1 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR uni208B +ENCODING 8331 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 1 1 0 +BITMAP +E0 +ENDCHAR +STARTCHAR uni208C +ENCODING 8332 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 3 1 -1 +BITMAP +E0 +00 +E0 +ENDCHAR +STARTCHAR uni208D +ENCODING 8333 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 5 2 -2 +BITMAP +40 +80 +80 +80 +40 +ENDCHAR +STARTCHAR uni208E +ENCODING 8334 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 5 2 -2 +BITMAP +80 +40 +40 +40 +80 +ENDCHAR +STARTCHAR uni2090 +ENCODING 8336 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 5 1 -2 +BITMAP +60 +10 +70 +90 +70 +ENDCHAR +STARTCHAR uni2091 +ENCODING 8337 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 5 1 -2 +BITMAP +60 +90 +F0 +80 +70 +ENDCHAR +STARTCHAR uni2092 +ENCODING 8338 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 5 1 -2 +BITMAP +60 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uni2093 +ENCODING 8339 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni2094 +ENCODING 8340 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 5 1 -2 +BITMAP +E0 +10 +F0 +90 +60 +ENDCHAR +STARTCHAR uni2095 +ENCODING 8341 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 6 1 -2 +BITMAP +80 +80 +E0 +90 +90 +90 +ENDCHAR +STARTCHAR uni2096 +ENCODING 8342 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 6 1 -2 +BITMAP +80 +90 +A0 +C0 +A0 +90 +ENDCHAR +STARTCHAR uni2097 +ENCODING 8343 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 6 2 -2 +BITMAP +80 +80 +80 +80 +80 +40 +ENDCHAR +STARTCHAR uni2098 +ENCODING 8344 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 -2 +BITMAP +D0 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2099 +ENCODING 8345 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 5 1 -2 +BITMAP +E0 +90 +90 +90 +90 +ENDCHAR +STARTCHAR uni209A +ENCODING 8346 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 6 1 -2 +BITMAP +E0 +90 +90 +E0 +80 +80 +ENDCHAR +STARTCHAR uni209B +ENCODING 8347 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 5 1 -2 +BITMAP +70 +80 +60 +10 +E0 +ENDCHAR +STARTCHAR uni209C +ENCODING 8348 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 6 1 -2 +BITMAP +40 +E0 +40 +40 +40 +30 +ENDCHAR +STARTCHAR peseta +ENCODING 8359 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +C0 +A0 +A0 +C8 +9C +88 +88 +84 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +F0 +40 +F0 +40 +38 +ENDCHAR +STARTCHAR uni20AE +ENCODING 8366 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +20 +30 +60 +30 +60 +20 +20 +ENDCHAR +STARTCHAR uni2102 +ENCODING 8450 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +38 +60 +A0 +A0 +A0 +A0 +60 +38 +ENDCHAR +STARTCHAR uni2103 +ENCODING 8451 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +A0 +40 +38 +40 +40 +40 +40 +40 +38 +ENDCHAR +STARTCHAR uni2109 +ENCODING 8457 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +40 +A0 +40 +38 +20 +20 +38 +20 +20 +20 +ENDCHAR +STARTCHAR uni210D +ENCODING 8461 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +E8 +A8 +A8 +B8 +A8 +A8 +A8 +E8 +ENDCHAR +STARTCHAR uni210E +ENCODING 8462 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +80 +80 +F0 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni210F +ENCODING 8463 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +F0 +40 +70 +48 +48 +48 +48 +ENDCHAR +STARTCHAR uni2115 +ENCODING 8469 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +88 +C8 +A8 +D8 +A8 +98 +88 +88 +ENDCHAR +STARTCHAR afii61352 +ENCODING 8470 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +94 +94 +D0 +D4 +B0 +B0 +90 +90 +ENDCHAR +STARTCHAR uni2119 +ENCODING 8473 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +A8 +A8 +A8 +B0 +A0 +A0 +E0 +ENDCHAR +STARTCHAR uni211A +ENCODING 8474 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +30 +68 +A8 +A8 +A8 +A8 +68 +30 +08 +ENDCHAR +STARTCHAR uni211D +ENCODING 8477 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +A8 +A8 +B0 +A8 +A8 +A8 +E8 +ENDCHAR +STARTCHAR trademark +ENCODING 8482 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 4 0 4 +BITMAP +F4 +5C +54 +54 +ENDCHAR +STARTCHAR uni2124 +ENCODING 8484 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +28 +28 +50 +50 +A0 +A0 +F8 +ENDCHAR +STARTCHAR uni2126 +ENCODING 8486 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni2127 +ENCODING 8487 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +D8 +50 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni213E +ENCODING 8510 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +A0 +A0 +A0 +A0 +A0 +A0 +E0 +ENDCHAR +STARTCHAR uni213F +ENCODING 8511 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +A8 +A8 +A8 +A8 +A8 +A8 +E8 +ENDCHAR +STARTCHAR uni2150 +ENCODING 8528 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +40 +C0 +40 +44 +48 +10 +20 +5C +84 +08 +10 +10 +ENDCHAR +STARTCHAR uni2151 +ENCODING 8529 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +40 +C0 +40 +44 +48 +10 +20 +48 +94 +0C +04 +18 +ENDCHAR +STARTCHAR onethird +ENCODING 8531 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +40 +C0 +40 +44 +48 +10 +20 +58 +84 +08 +04 +18 +ENDCHAR +STARTCHAR twothirds +ENCODING 8532 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +C0 +20 +40 +84 +E8 +10 +20 +58 +84 +08 +04 +18 +ENDCHAR +STARTCHAR uni2155 +ENCODING 8533 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +40 +C0 +40 +44 +48 +10 +20 +5C +90 +18 +04 +18 +ENDCHAR +STARTCHAR uni2156 +ENCODING 8534 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +C0 +20 +40 +84 +E8 +10 +20 +5C +90 +18 +04 +18 +ENDCHAR +STARTCHAR uni2157 +ENCODING 8535 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +C0 +20 +40 +24 +C8 +10 +20 +5C +90 +18 +04 +18 +ENDCHAR +STARTCHAR uni2158 +ENCODING 8536 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +60 +A0 +E4 +28 +10 +20 +5C +90 +18 +04 +18 +ENDCHAR +STARTCHAR uni2159 +ENCODING 8537 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +40 +C0 +40 +44 +48 +10 +20 +4C +90 +18 +14 +08 +ENDCHAR +STARTCHAR uni215A +ENCODING 8538 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +E0 +80 +C0 +24 +C8 +10 +20 +4C +90 +18 +14 +08 +ENDCHAR +STARTCHAR oneeighth +ENCODING 8539 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +40 +C0 +40 +44 +48 +10 +20 +48 +94 +08 +14 +08 +ENDCHAR +STARTCHAR threeeighths +ENCODING 8540 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +C0 +20 +40 +24 +C8 +10 +20 +48 +94 +08 +14 +08 +ENDCHAR +STARTCHAR fiveeighths +ENCODING 8541 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +E0 +80 +C0 +24 +C8 +10 +20 +48 +94 +08 +14 +08 +ENDCHAR +STARTCHAR seveneighths +ENCODING 8542 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +E0 +20 +40 +84 +88 +10 +20 +48 +94 +08 +14 +08 +ENDCHAR +STARTCHAR uni215F +ENCODING 8543 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 1 +BITMAP +40 +C0 +40 +44 +48 +10 +20 +40 +80 +ENDCHAR +STARTCHAR uni2189 +ENCODING 8585 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +40 +A0 +A0 +A4 +48 +10 +20 +58 +84 +08 +04 +18 +ENDCHAR +STARTCHAR arrowleft +ENCODING 8592 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +40 +F8 +40 +20 +ENDCHAR +STARTCHAR arrowup +ENCODING 8593 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 2 +BITMAP +20 +70 +A8 +20 +20 +20 +ENDCHAR +STARTCHAR arrowright +ENCODING 8594 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +10 +F8 +10 +20 +ENDCHAR +STARTCHAR arrowdown +ENCODING 8595 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR arrowboth +ENCODING 8596 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +50 +88 +F8 +88 +50 +ENDCHAR +STARTCHAR arrowupdn +ENCODING 8597 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +20 +70 +A8 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2196 +ENCODING 8598 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F0 +C0 +A0 +90 +08 +ENDCHAR +STARTCHAR uni2197 +ENCODING 8599 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +78 +18 +28 +48 +80 +ENDCHAR +STARTCHAR uni2198 +ENCODING 8600 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +80 +48 +28 +18 +78 +ENDCHAR +STARTCHAR uni2199 +ENCODING 8601 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +08 +90 +A0 +C0 +F0 +ENDCHAR +STARTCHAR uni21A2 +ENCODING 8610 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +48 +F0 +48 +20 +ENDCHAR +STARTCHAR uni21A3 +ENCODING 8611 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +90 +78 +90 +20 +ENDCHAR +STARTCHAR uni21A4 +ENCODING 8612 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +48 +F8 +48 +20 +ENDCHAR +STARTCHAR uni21A5 +ENCODING 8613 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 2 +BITMAP +20 +70 +A8 +20 +20 +70 +ENDCHAR +STARTCHAR uni21A6 +ENCODING 8614 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +90 +F8 +90 +20 +ENDCHAR +STARTCHAR uni21A7 +ENCODING 8615 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +70 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR arrowupdnbse +ENCODING 8616 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +A8 +20 +A8 +70 +20 +F8 +ENDCHAR +STARTCHAR uni21A9 +ENCODING 8617 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +48 +F0 +40 +20 +ENDCHAR +STARTCHAR uni21AA +ENCODING 8618 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +90 +78 +10 +20 +ENDCHAR +STARTCHAR uni21B0 +ENCODING 8624 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +40 +F8 +48 +28 +08 +08 +ENDCHAR +STARTCHAR uni21B1 +ENCODING 8625 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +10 +F8 +90 +A0 +80 +80 +ENDCHAR +STARTCHAR uni21B2 +ENCODING 8626 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 7 0 2 +BITMAP +08 +08 +28 +48 +F8 +40 +20 +ENDCHAR +STARTCHAR uni21B3 +ENCODING 8627 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 7 0 2 +BITMAP +80 +80 +A0 +90 +F8 +10 +20 +ENDCHAR +STARTCHAR uni21B4 +ENCODING 8628 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 6 0 2 +BITMAP +E0 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR carriagereturn +ENCODING 8629 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +08 +08 +28 +48 +F8 +40 +20 +ENDCHAR +STARTCHAR uni21B6 +ENCODING 8630 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +18 +24 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni21B7 +ENCODING 8631 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +60 +90 +10 +54 +38 +10 +ENDCHAR +STARTCHAR uni21B9 +ENCODING 8633 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +A0 +C0 +F8 +C0 +A0 +28 +18 +F8 +18 +28 +ENDCHAR +STARTCHAR uni21BA +ENCODING 8634 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 2 +BITMAP +38 +30 +A8 +88 +88 +70 +ENDCHAR +STARTCHAR uni21BB +ENCODING 8635 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 2 +BITMAP +E0 +60 +A8 +88 +88 +70 +ENDCHAR +STARTCHAR uni21BC +ENCODING 8636 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +20 +40 +F8 +ENDCHAR +STARTCHAR uni21BD +ENCODING 8637 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +F8 +40 +20 +ENDCHAR +STARTCHAR uni21BE +ENCODING 8638 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 6 2 2 +BITMAP +80 +C0 +A0 +80 +80 +80 +ENDCHAR +STARTCHAR uni21BF +ENCODING 8639 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 6 0 2 +BITMAP +20 +60 +A0 +20 +20 +20 +ENDCHAR +STARTCHAR uni21C0 +ENCODING 8640 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +20 +10 +F8 +ENDCHAR +STARTCHAR uni21C1 +ENCODING 8641 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +F8 +10 +20 +ENDCHAR +STARTCHAR uni21C2 +ENCODING 8642 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 5 2 2 +BITMAP +80 +80 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni21C3 +ENCODING 8643 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 5 0 2 +BITMAP +20 +20 +A0 +60 +20 +ENDCHAR +STARTCHAR uni21C4 +ENCODING 8644 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 2 +BITMAP +10 +F8 +10 +40 +F8 +40 +ENDCHAR +STARTCHAR uni21C5 +ENCODING 8645 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 2 +BITMAP +40 +E8 +48 +48 +5C +08 +ENDCHAR +STARTCHAR uni21C6 +ENCODING 8646 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 2 +BITMAP +40 +F8 +40 +10 +F8 +10 +ENDCHAR +STARTCHAR uni21C7 +ENCODING 8647 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +40 +F8 +40 +F8 +40 +ENDCHAR +STARTCHAR uni21C8 +ENCODING 8648 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +50 +F8 +50 +50 +50 +ENDCHAR +STARTCHAR uni21C9 +ENCODING 8649 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +10 +F8 +10 +F8 +10 +ENDCHAR +STARTCHAR uni21CA +ENCODING 8650 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +50 +50 +50 +F8 +50 +ENDCHAR +STARTCHAR uni21CB +ENCODING 8651 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +40 +F8 +00 +F8 +10 +ENDCHAR +STARTCHAR uni21CC +ENCODING 8652 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +10 +F8 +00 +F8 +40 +ENDCHAR +STARTCHAR arrowdblleft +ENCODING 8656 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 5 0 2 +BITMAP +20 +7C +80 +7C +20 +ENDCHAR +STARTCHAR arrowdblup +ENCODING 8657 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 2 +BITMAP +20 +50 +D8 +50 +50 +50 +ENDCHAR +STARTCHAR arrowdblright +ENCODING 8658 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 5 0 2 +BITMAP +10 +F8 +04 +F8 +10 +ENDCHAR +STARTCHAR arrowdbldown +ENCODING 8659 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 2 +BITMAP +50 +50 +50 +D8 +50 +20 +ENDCHAR +STARTCHAR arrowdblboth +ENCODING 8660 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 5 0 2 +BITMAP +48 +FC +84 +FC +48 +ENDCHAR +STARTCHAR uni21D5 +ENCODING 8661 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +D8 +50 +50 +D8 +50 +20 +ENDCHAR +STARTCHAR uni21D6 +ENCODING 8662 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F0 +A0 +D0 +A8 +10 +ENDCHAR +STARTCHAR uni21D7 +ENCODING 8663 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +78 +28 +58 +A8 +40 +ENDCHAR +STARTCHAR uni21D8 +ENCODING 8664 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +40 +A8 +58 +28 +78 +ENDCHAR +STARTCHAR uni21D9 +ENCODING 8665 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +10 +A8 +D0 +A0 +F0 +ENDCHAR +STARTCHAR uni21E0 +ENCODING 8672 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +40 +A8 +40 +20 +ENDCHAR +STARTCHAR uni21E1 +ENCODING 8673 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +50 +A8 +00 +20 +ENDCHAR +STARTCHAR uni21E2 +ENCODING 8674 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 1 2 +BITMAP +20 +10 +A8 +10 +20 +ENDCHAR +STARTCHAR uni21E3 +ENCODING 8675 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +00 +A8 +50 +20 +ENDCHAR +STARTCHAR uni21E4 +ENCODING 8676 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +A0 +C0 +F8 +C0 +A0 +ENDCHAR +STARTCHAR uni21E5 +ENCODING 8677 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +28 +18 +F8 +18 +28 +ENDCHAR +STARTCHAR uni21E6 +ENCODING 8678 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +78 +C8 +78 +20 +ENDCHAR +STARTCHAR uni21E7 +ENCODING 8679 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 2 +BITMAP +20 +70 +D8 +50 +50 +70 +ENDCHAR +STARTCHAR uni21E8 +ENCODING 8680 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +F0 +98 +F0 +20 +ENDCHAR +STARTCHAR uni21E9 +ENCODING 8681 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 2 +BITMAP +70 +50 +50 +D8 +70 +20 +ENDCHAR +STARTCHAR uni21F3 +ENCODING 8691 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +D8 +50 +50 +D8 +70 +20 +ENDCHAR +STARTCHAR uni21F5 +ENCODING 8693 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +10 +38 +50 +50 +50 +E0 +40 +ENDCHAR +STARTCHAR uni21F6 +ENCODING 8694 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +10 +F8 +10 +F8 +10 +F8 +10 +ENDCHAR +STARTCHAR universal +ENCODING 8704 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +F8 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni2201 +ENCODING 8705 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +80 +80 +80 +80 +80 +78 +ENDCHAR +STARTCHAR partialdiff +ENCODING 8706 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +60 +10 +08 +78 +88 +88 +70 +ENDCHAR +STARTCHAR existential +ENCODING 8707 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +08 +08 +F8 +08 +08 +F8 +ENDCHAR +STARTCHAR uni2204 +ENCODING 8708 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +F8 +18 +28 +F8 +28 +48 +F8 +40 +ENDCHAR +STARTCHAR emptyset +ENCODING 8709 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +08 +70 +98 +A8 +A8 +C8 +70 +80 +ENDCHAR +STARTCHAR uni2206 +ENCODING 8710 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR gradient +ENCODING 8711 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +F8 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR element +ENCODING 8712 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +38 +40 +80 +F8 +80 +40 +38 +ENDCHAR +STARTCHAR notelement +ENCODING 8713 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +38 +50 +A0 +F8 +A0 +40 +78 +40 +ENDCHAR +STARTCHAR uni220A +ENCODING 8714 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +78 +80 +F8 +80 +78 +ENDCHAR +STARTCHAR suchthat +ENCODING 8715 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +10 +08 +F8 +08 +10 +E0 +ENDCHAR +STARTCHAR uni220C +ENCODING 8716 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +F0 +10 +28 +F8 +28 +50 +E0 +40 +ENDCHAR +STARTCHAR uni220D +ENCODING 8717 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F0 +08 +F8 +08 +F0 +ENDCHAR +STARTCHAR product +ENCODING 8719 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR summation +ENCODING 8721 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +40 +20 +10 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR minus +ENCODING 8722 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR uni2213 +ENCODING 8723 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2214 +ENCODING 8724 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +20 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2219 +ENCODING 8729 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 3 1 3 +BITMAP +60 +F0 +60 +ENDCHAR +STARTCHAR radical +ENCODING 8730 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +0C +08 +08 +08 +88 +88 +48 +28 +18 +ENDCHAR +STARTCHAR uni221B +ENCODING 8731 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +C0 +2C +48 +28 +C8 +08 +88 +48 +28 +18 +ENDCHAR +STARTCHAR uni221C +ENCODING 8732 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +20 +6C +A8 +E8 +28 +08 +88 +48 +28 +18 +ENDCHAR +STARTCHAR proportional +ENCODING 8733 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR infinity +ENCODING 8734 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 4 0 3 +BITMAP +50 +A8 +A8 +50 +ENDCHAR +STARTCHAR orthogonal +ENCODING 8735 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR angle +ENCODING 8736 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +08 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR uni2223 +ENCODING 8739 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 8 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2224 +ENCODING 8740 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +40 +40 +40 +60 +C0 +40 +40 +40 +ENDCHAR +STARTCHAR uni2225 +ENCODING 8741 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 3 8 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni2226 +ENCODING 8742 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +50 +58 +70 +D0 +50 +50 +50 +ENDCHAR +STARTCHAR logicaland +ENCODING 8743 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR logicalor +ENCODING 8744 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR intersection +ENCODING 8745 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR union +ENCODING 8746 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR integral +ENCODING 8747 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 -1 +BITMAP +20 +40 +40 +40 +40 +40 +40 +40 +40 +80 +ENDCHAR +STARTCHAR uni222C +ENCODING 8748 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +28 +50 +50 +50 +50 +50 +50 +50 +50 +A0 +ENDCHAR +STARTCHAR uni222E +ENCODING 8750 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +10 +20 +70 +A8 +A8 +A8 +A8 +70 +20 +40 +ENDCHAR +STARTCHAR uni222F +ENCODING 8751 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +28 +50 +70 +D8 +D8 +D8 +D8 +70 +50 +A0 +ENDCHAR +STARTCHAR uni2242 +ENCODING 8770 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +00 +48 +A8 +90 +ENDCHAR +STARTCHAR uni2243 +ENCODING 8771 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +48 +A8 +90 +00 +F8 +ENDCHAR +STARTCHAR congruent +ENCODING 8773 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +48 +A8 +90 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR approxequal +ENCODING 8776 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +48 +A8 +90 +00 +48 +A8 +90 +ENDCHAR +STARTCHAR notequal +ENCODING 8800 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +10 +F8 +20 +20 +F8 +40 +ENDCHAR +STARTCHAR equivalence +ENCODING 8801 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2262 +ENCODING 8802 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +F8 +20 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2263 +ENCODING 8803 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F8 +00 +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR lessequal +ENCODING 8804 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +18 +60 +80 +60 +18 +00 +F8 +ENDCHAR +STARTCHAR greaterequal +ENCODING 8805 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +C0 +30 +08 +30 +C0 +00 +F8 +ENDCHAR +STARTCHAR uni2266 +ENCODING 8806 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +18 +60 +80 +60 +18 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2267 +ENCODING 8807 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +C0 +30 +08 +30 +C0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2268 +ENCODING 8808 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +18 +60 +80 +60 +18 +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2269 +ENCODING 8809 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 -1 +BITMAP +C0 +30 +08 +30 +C0 +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni226A +ENCODING 8810 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +28 +50 +A0 +50 +28 +ENDCHAR +STARTCHAR uni226B +ENCODING 8811 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +A0 +50 +28 +50 +A0 +ENDCHAR +STARTCHAR uni227A +ENCODING 8826 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +08 +30 +C0 +30 +08 +ENDCHAR +STARTCHAR uni227B +ENCODING 8827 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +80 +60 +18 +60 +80 +ENDCHAR +STARTCHAR uni227C +ENCODING 8828 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +08 +30 +C0 +30 +C8 +30 +08 +ENDCHAR +STARTCHAR uni227D +ENCODING 8829 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +80 +60 +18 +60 +98 +60 +80 +ENDCHAR +STARTCHAR propersubset +ENCODING 8834 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +78 +80 +80 +80 +78 +ENDCHAR +STARTCHAR propersuperset +ENCODING 8835 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +F0 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR notsubset +ENCODING 8836 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +78 +90 +A0 +A0 +78 +40 +ENDCHAR +STARTCHAR uni2285 +ENCODING 8837 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +10 +F0 +28 +28 +48 +F0 +40 +ENDCHAR +STARTCHAR reflexsubset +ENCODING 8838 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +78 +80 +80 +80 +78 +00 +F8 +ENDCHAR +STARTCHAR reflexsuperset +ENCODING 8839 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +F0 +08 +08 +08 +F0 +00 +F8 +ENDCHAR +STARTCHAR uni2288 +ENCODING 8840 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +78 +90 +A0 +A0 +78 +40 +F8 +40 +ENDCHAR +STARTCHAR uni2289 +ENCODING 8841 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +10 +F0 +18 +28 +28 +F0 +40 +F8 +40 +ENDCHAR +STARTCHAR uni228A +ENCODING 8842 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +78 +80 +80 +80 +78 +20 +F8 +40 +ENDCHAR +STARTCHAR uni228B +ENCODING 8843 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 -1 +BITMAP +F0 +08 +08 +08 +F0 +20 +F8 +40 +ENDCHAR +STARTCHAR uni22A2 +ENCODING 8866 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +80 +80 +F8 +80 +80 +ENDCHAR +STARTCHAR uni22A3 +ENCODING 8867 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +08 +08 +F8 +08 +08 +ENDCHAR +STARTCHAR uni22A4 +ENCODING 8868 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR perpendicular +ENCODING 8869 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni22BF +ENCODING 8895 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +08 +18 +28 +48 +F8 +ENDCHAR +STARTCHAR uni22C0 +ENCODING 8896 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni22C1 +ENCODING 8897 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni22C2 +ENCODING 8898 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni22C3 +ENCODING 8899 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni22C8 +ENCODING 8904 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +88 +D8 +A8 +D8 +88 +ENDCHAR +STARTCHAR uni22C9 +ENCODING 8905 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +88 +D0 +A0 +D0 +88 +ENDCHAR +STARTCHAR uni22CA +ENCODING 8906 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +88 +58 +28 +58 +88 +ENDCHAR +STARTCHAR uni22CB +ENCODING 8907 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +80 +40 +20 +50 +88 +ENDCHAR +STARTCHAR uni22CC +ENCODING 8908 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +08 +10 +20 +50 +88 +ENDCHAR +STARTCHAR uni22CD +ENCODING 8909 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +90 +A8 +48 +00 +F8 +ENDCHAR +STARTCHAR house +ENCODING 8962 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +50 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR revlogicalnot +ENCODING 8976 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +F8 +80 +80 +80 +ENDCHAR +STARTCHAR uni231A +ENCODING 8986 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 1 +BITMAP +78 +84 +94 +94 +9C +84 +84 +78 +ENDCHAR +STARTCHAR uni231B +ENCODING 8987 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 1 +BITMAP +FC +84 +48 +30 +48 +78 +FC +FC +ENDCHAR +STARTCHAR integraltp +ENCODING 8992 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 2 -2 +BITMAP +40 +A0 +A0 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR integralbt +ENCODING 8993 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 0 0 +BITMAP +20 +20 +20 +20 +20 +20 +20 +A0 +A0 +40 +ENDCHAR +STARTCHAR uni23BA +ENCODING 9146 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 1 0 9 +BITMAP +FC +ENDCHAR +STARTCHAR uni23BB +ENCODING 9147 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 1 0 6 +BITMAP +FC +ENDCHAR +STARTCHAR uni23BC +ENCODING 9148 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 1 0 1 +BITMAP +FC +ENDCHAR +STARTCHAR uni23BD +ENCODING 9149 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 1 0 -2 +BITMAP +FC +ENDCHAR +STARTCHAR uni2408 +ENCODING 9224 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +F0 +88 +F0 +88 +F0 +00 +3C +40 +38 +04 +78 +ENDCHAR +STARTCHAR uni2409 +ENCODING 9225 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +90 +90 +F0 +90 +90 +00 +7C +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni240A +ENCODING 9226 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +80 +80 +80 +80 +F0 +00 +3C +20 +38 +20 +20 +ENDCHAR +STARTCHAR uni240B +ENCODING 9227 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +88 +88 +88 +50 +20 +00 +7C +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni240C +ENCODING 9228 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +F0 +80 +E0 +80 +80 +00 +3C +20 +38 +20 +20 +ENDCHAR +STARTCHAR uni240D +ENCODING 9229 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +70 +80 +80 +80 +70 +00 +38 +24 +38 +28 +24 +ENDCHAR +STARTCHAR uni2420 +ENCODING 9248 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +60 +80 +60 +10 +60 +00 +38 +24 +38 +20 +20 +ENDCHAR +STARTCHAR uni2424 +ENCODING 9252 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 11 0 -1 +BITMAP +90 +D0 +B0 +90 +90 +00 +20 +20 +20 +20 +3C +ENDCHAR +STARTCHAR SF100000 +ENCODING 9472 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 1 0 4 +BITMAP +FC +ENDCHAR +STARTCHAR uni2501 +ENCODING 9473 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 2 0 3 +BITMAP +FC +FC +ENDCHAR +STARTCHAR SF110000 +ENCODING 9474 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2503 +ENCODING 9475 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2504 +ENCODING 9476 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 1 0 4 +BITMAP +A8 +ENDCHAR +STARTCHAR uni2505 +ENCODING 9477 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 2 0 3 +BITMAP +A8 +A8 +ENDCHAR +STARTCHAR uni2506 +ENCODING 9478 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 11 2 -1 +BITMAP +80 +80 +80 +00 +80 +80 +80 +00 +80 +80 +80 +ENDCHAR +STARTCHAR uni2507 +ENCODING 9479 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 11 2 -1 +BITMAP +C0 +C0 +C0 +00 +C0 +C0 +C0 +00 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2508 +ENCODING 9480 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 1 0 4 +BITMAP +A8 +ENDCHAR +STARTCHAR uni2509 +ENCODING 9481 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 2 0 3 +BITMAP +A8 +A8 +ENDCHAR +STARTCHAR uni250A +ENCODING 9482 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 11 2 -1 +BITMAP +80 +80 +00 +80 +80 +00 +80 +80 +00 +80 +80 +ENDCHAR +STARTCHAR uni250B +ENCODING 9483 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 11 2 -1 +BITMAP +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR SF010000 +ENCODING 9484 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 2 -2 +BITMAP +F0 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni250D +ENCODING 9485 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 2 -2 +BITMAP +F0 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni250E +ENCODING 9486 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 2 -2 +BITMAP +F0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni250F +ENCODING 9487 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 2 -2 +BITMAP +F0 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR SF030000 +ENCODING 9488 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 7 0 -2 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2511 +ENCODING 9489 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 7 0 -2 +BITMAP +E0 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2512 +ENCODING 9490 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 0 -2 +BITMAP +F0 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2513 +ENCODING 9491 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 0 -2 +BITMAP +F0 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR SF020000 +ENCODING 9492 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 6 2 4 +BITMAP +80 +80 +80 +80 +80 +F0 +ENDCHAR +STARTCHAR uni2515 +ENCODING 9493 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 2 3 +BITMAP +80 +80 +80 +80 +80 +F0 +F0 +ENDCHAR +STARTCHAR uni2516 +ENCODING 9494 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 6 2 4 +BITMAP +C0 +C0 +C0 +C0 +C0 +F0 +ENDCHAR +STARTCHAR uni2517 +ENCODING 9495 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 2 3 +BITMAP +C0 +C0 +C0 +C0 +C0 +F0 +F0 +ENDCHAR +STARTCHAR SF040000 +ENCODING 9496 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 6 0 4 +BITMAP +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR uni2519 +ENCODING 9497 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 7 0 3 +BITMAP +20 +20 +20 +20 +20 +E0 +E0 +ENDCHAR +STARTCHAR uni251A +ENCODING 9498 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 6 0 4 +BITMAP +30 +30 +30 +30 +30 +F0 +ENDCHAR +STARTCHAR uni251B +ENCODING 9499 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 0 3 +BITMAP +30 +30 +30 +30 +30 +F0 +F0 +ENDCHAR +STARTCHAR SF080000 +ENCODING 9500 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +F0 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni251D +ENCODING 9501 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +F0 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni251E +ENCODING 9502 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +F0 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni251F +ENCODING 9503 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +F0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2520 +ENCODING 9504 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +F0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2521 +ENCODING 9505 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +F0 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2522 +ENCODING 9506 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +F0 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2523 +ENCODING 9507 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +F0 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR SF090000 +ENCODING 9508 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +E0 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2525 +ENCODING 9509 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +E0 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2526 +ENCODING 9510 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +F0 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2527 +ENCODING 9511 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +F0 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2528 +ENCODING 9512 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +F0 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2529 +ENCODING 9513 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +F0 +F0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni252A +ENCODING 9514 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +F0 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni252B +ENCODING 9515 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +F0 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR SF060000 +ENCODING 9516 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni252D +ENCODING 9517 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni252E +ENCODING 9518 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +3C +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni252F +ENCODING 9519 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2530 +ENCODING 9520 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2531 +ENCODING 9521 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2532 +ENCODING 9522 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +3C +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2533 +ENCODING 9523 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR SF070000 +ENCODING 9524 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 4 +BITMAP +20 +20 +20 +20 +20 +FC +ENDCHAR +STARTCHAR uni2535 +ENCODING 9525 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +20 +20 +20 +20 +20 +FC +E0 +ENDCHAR +STARTCHAR uni2536 +ENCODING 9526 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +20 +20 +20 +20 +20 +FC +3C +ENDCHAR +STARTCHAR uni2537 +ENCODING 9527 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +20 +20 +20 +20 +20 +FC +FC +ENDCHAR +STARTCHAR uni2538 +ENCODING 9528 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 4 +BITMAP +30 +30 +30 +30 +30 +FC +ENDCHAR +STARTCHAR uni2539 +ENCODING 9529 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +30 +30 +30 +30 +30 +FC +F0 +ENDCHAR +STARTCHAR uni253A +ENCODING 9530 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +30 +30 +30 +30 +30 +FC +3C +ENDCHAR +STARTCHAR uni253B +ENCODING 9531 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +30 +30 +30 +30 +30 +FC +FC +ENDCHAR +STARTCHAR SF050000 +ENCODING 9532 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +FC +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni253D +ENCODING 9533 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +FC +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni253E +ENCODING 9534 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +FC +3C +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni253F +ENCODING 9535 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +FC +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2540 +ENCODING 9536 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +FC +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2541 +ENCODING 9537 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +FC +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2542 +ENCODING 9538 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +FC +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2543 +ENCODING 9539 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +FC +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2544 +ENCODING 9540 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +FC +3C +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2545 +ENCODING 9541 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +FC +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2546 +ENCODING 9542 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +FC +3C +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2547 +ENCODING 9543 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +FC +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2548 +ENCODING 9544 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +20 +FC +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni2549 +ENCODING 9545 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +FC +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni254A +ENCODING 9546 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +FC +3C +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni254B +ENCODING 9547 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +30 +30 +30 +30 +30 +FC +FC +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR uni254C +ENCODING 9548 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 1 0 4 +BITMAP +D8 +ENDCHAR +STARTCHAR uni254D +ENCODING 9549 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 2 0 3 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR uni254E +ENCODING 9550 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 11 2 -1 +BITMAP +80 +80 +80 +80 +80 +00 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni254F +ENCODING 9551 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 11 2 -1 +BITMAP +C0 +C0 +C0 +C0 +C0 +00 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR SF430000 +ENCODING 9552 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 3 0 3 +BITMAP +FC +00 +FC +ENDCHAR +STARTCHAR SF240000 +ENCODING 9553 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 12 1 -2 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF510000 +ENCODING 9554 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 2 -2 +BITMAP +F0 +80 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR SF520000 +ENCODING 9555 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 1 -2 +BITMAP +F8 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF390000 +ENCODING 9556 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 1 -2 +BITMAP +F8 +80 +B8 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF220000 +ENCODING 9557 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 8 0 -2 +BITMAP +E0 +20 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF210000 +ENCODING 9558 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 0 -2 +BITMAP +F0 +50 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF250000 +ENCODING 9559 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 0 -2 +BITMAP +F0 +10 +D0 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF500000 +ENCODING 9560 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 2 3 +BITMAP +80 +80 +80 +80 +F0 +80 +F0 +ENDCHAR +STARTCHAR SF490000 +ENCODING 9561 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 1 4 +BITMAP +A0 +A0 +A0 +A0 +A0 +F8 +ENDCHAR +STARTCHAR SF380000 +ENCODING 9562 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 1 3 +BITMAP +A0 +A0 +A0 +A0 +B8 +80 +F8 +ENDCHAR +STARTCHAR SF280000 +ENCODING 9563 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 7 0 3 +BITMAP +20 +20 +20 +20 +E0 +20 +E0 +ENDCHAR +STARTCHAR SF270000 +ENCODING 9564 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 6 0 4 +BITMAP +50 +50 +50 +50 +50 +F0 +ENDCHAR +STARTCHAR SF260000 +ENCODING 9565 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 0 3 +BITMAP +50 +50 +50 +50 +D0 +10 +F0 +ENDCHAR +STARTCHAR SF360000 +ENCODING 9566 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 12 2 -2 +BITMAP +80 +80 +80 +80 +F0 +80 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR SF370000 +ENCODING 9567 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 1 -2 +BITMAP +A0 +A0 +A0 +A0 +A0 +B8 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF420000 +ENCODING 9568 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 1 -2 +BITMAP +A0 +A0 +A0 +A0 +B8 +80 +B8 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF190000 +ENCODING 9569 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 12 0 -2 +BITMAP +20 +20 +20 +20 +E0 +20 +E0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF200000 +ENCODING 9570 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +50 +50 +50 +50 +50 +D0 +50 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF230000 +ENCODING 9571 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +50 +50 +50 +50 +D0 +10 +D0 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF470000 +ENCODING 9572 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +FC +00 +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF480000 +ENCODING 9573 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +50 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF410000 +ENCODING 9574 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +FC +00 +DC +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF450000 +ENCODING 9575 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +20 +20 +20 +20 +FC +00 +FC +ENDCHAR +STARTCHAR SF460000 +ENCODING 9576 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 4 +BITMAP +50 +50 +50 +50 +50 +FC +ENDCHAR +STARTCHAR SF400000 +ENCODING 9577 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 3 +BITMAP +50 +50 +50 +50 +DC +00 +FC +ENDCHAR +STARTCHAR SF540000 +ENCODING 9578 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +20 +20 +20 +20 +FC +20 +FC +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR SF530000 +ENCODING 9579 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +50 +50 +50 +50 +50 +FC +50 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR SF440000 +ENCODING 9580 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +50 +50 +50 +50 +DC +00 +DC +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR uni256D +ENCODING 9581 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 2 -2 +BITMAP +30 +40 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni256E +ENCODING 9582 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 7 0 -2 +BITMAP +80 +40 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni256F +ENCODING 9583 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 6 0 4 +BITMAP +20 +20 +20 +20 +40 +80 +ENDCHAR +STARTCHAR uni2570 +ENCODING 9584 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 6 2 4 +BITMAP +80 +80 +80 +80 +40 +30 +ENDCHAR +STARTCHAR uni2571 +ENCODING 9585 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +04 +04 +08 +08 +10 +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni2572 +ENCODING 9586 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +80 +80 +40 +40 +20 +20 +10 +10 +08 +08 +04 +04 +ENDCHAR +STARTCHAR uni2573 +ENCODING 9587 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +84 +84 +48 +48 +30 +30 +30 +30 +48 +48 +84 +84 +ENDCHAR +STARTCHAR uni2574 +ENCODING 9588 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 1 0 4 +BITMAP +E0 +ENDCHAR +STARTCHAR uni2575 +ENCODING 9589 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 6 2 4 +BITMAP +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2576 +ENCODING 9590 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 1 2 4 +BITMAP +F0 +ENDCHAR +STARTCHAR uni2577 +ENCODING 9591 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 7 2 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2578 +ENCODING 9592 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 2 0 3 +BITMAP +E0 +E0 +ENDCHAR +STARTCHAR uni2579 +ENCODING 9593 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 6 2 4 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni257A +ENCODING 9594 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 2 2 3 +BITMAP +F0 +F0 +ENDCHAR +STARTCHAR uni257B +ENCODING 9595 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 7 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni257C +ENCODING 9596 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 2 0 3 +BITMAP +FC +3C +ENDCHAR +STARTCHAR uni257D +ENCODING 9597 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 12 2 -2 +BITMAP +80 +80 +80 +80 +80 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni257E +ENCODING 9598 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 2 0 3 +BITMAP +FC +E0 +ENDCHAR +STARTCHAR uni257F +ENCODING 9599 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 12 2 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR upblock +ENCODING 9600 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 4 +BITMAP +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2581 +ENCODING 9601 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 1 0 -2 +BITMAP +FC +ENDCHAR +STARTCHAR uni2582 +ENCODING 9602 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 3 0 -2 +BITMAP +FC +FC +FC +ENDCHAR +STARTCHAR uni2583 +ENCODING 9603 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 4 0 -2 +BITMAP +FC +FC +FC +FC +ENDCHAR +STARTCHAR dnblock +ENCODING 9604 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2585 +ENCODING 9605 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2586 +ENCODING 9606 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2587 +ENCODING 9607 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR block +ENCODING 9608 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2589 +ENCODING 9609 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni258A +ENCODING 9610 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni258B +ENCODING 9611 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 12 0 -2 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR lfblock +ENCODING 9612 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 12 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni258D +ENCODING 9613 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 2 12 0 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni258E +ENCODING 9614 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 12 0 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni258F +ENCODING 9615 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 12 0 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR rtblock +ENCODING 9616 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 12 3 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR ltshade +ENCODING 9617 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 12 0 -2 +BITMAP +88 +20 +88 +20 +88 +20 +88 +20 +88 +20 +88 +20 +ENDCHAR +STARTCHAR shade +ENCODING 9618 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +A8 +54 +A8 +54 +A8 +54 +A8 +54 +A8 +54 +A8 +54 +ENDCHAR +STARTCHAR dkshade +ENCODING 9619 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +74 +DC +74 +DC +74 +DC +74 +DC +74 +DC +74 +DC +ENDCHAR +STARTCHAR uni2596 +ENCODING 9622 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 6 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2597 +ENCODING 9623 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 6 3 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2598 +ENCODING 9624 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 6 0 4 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2599 +ENCODING 9625 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni259A +ENCODING 9626 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR uni259B +ENCODING 9627 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni259C +ENCODING 9628 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR uni259D +ENCODING 9629 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 6 3 4 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni259E +ENCODING 9630 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +1C +1C +1C +1C +1C +1C +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni259F +ENCODING 9631 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +1C +1C +1C +1C +1C +1C +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR filledbox +ENCODING 9632 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR H22073 +ENCODING 9633 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +F8 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni25A2 +ENCODING 9634 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni25A3 +ENCODING 9635 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +F8 +88 +A8 +A8 +88 +F8 +ENDCHAR +STARTCHAR H18543 +ENCODING 9642 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 3 1 3 +BITMAP +E0 +E0 +E0 +ENDCHAR +STARTCHAR H18551 +ENCODING 9643 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 3 1 3 +BITMAP +E0 +A0 +E0 +ENDCHAR +STARTCHAR filledrect +ENCODING 9644 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 0 +BITMAP +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni25AD +ENCODING 9645 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 0 +BITMAP +F8 +88 +F8 +ENDCHAR +STARTCHAR uni25AE +ENCODING 9646 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni25AF +ENCODING 9647 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni25B0 +ENCODING 9648 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +78 +78 +F0 +F0 +ENDCHAR +STARTCHAR uni25B1 +ENCODING 9649 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 4 0 2 +BITMAP +78 +48 +90 +F0 +ENDCHAR +STARTCHAR triagup +ENCODING 9650 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +70 +70 +F8 +F8 +ENDCHAR +STARTCHAR uni25B3 +ENCODING 9651 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni25B4 +ENCODING 9652 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +20 +70 +F8 +ENDCHAR +STARTCHAR uni25B5 +ENCODING 9653 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +20 +50 +F8 +ENDCHAR +STARTCHAR uni25B6 +ENCODING 9654 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 5 0 2 +BITMAP +C0 +F0 +FC +F0 +C0 +ENDCHAR +STARTCHAR uni25B7 +ENCODING 9655 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 5 0 2 +BITMAP +C0 +B0 +8C +B0 +C0 +ENDCHAR +STARTCHAR uni25B8 +ENCODING 9656 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 5 1 2 +BITMAP +80 +C0 +E0 +C0 +80 +ENDCHAR +STARTCHAR uni25B9 +ENCODING 9657 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 5 1 2 +BITMAP +80 +C0 +A0 +C0 +80 +ENDCHAR +STARTCHAR triagrt +ENCODING 9658 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 5 0 2 +BITMAP +C0 +70 +7C +70 +C0 +ENDCHAR +STARTCHAR uni25BB +ENCODING 9659 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 5 0 2 +BITMAP +C0 +70 +4C +70 +C0 +ENDCHAR +STARTCHAR triagdn +ENCODING 9660 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +F8 +F8 +70 +70 +20 +20 +ENDCHAR +STARTCHAR uni25BD +ENCODING 9661 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +F8 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni25BE +ENCODING 9662 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +F8 +70 +20 +ENDCHAR +STARTCHAR uni25BF +ENCODING 9663 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 3 +BITMAP +F8 +50 +20 +ENDCHAR +STARTCHAR uni25C0 +ENCODING 9664 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 5 0 2 +BITMAP +0C +38 +F8 +38 +0C +ENDCHAR +STARTCHAR uni25C1 +ENCODING 9665 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 5 0 2 +BITMAP +0C +38 +C8 +38 +0C +ENDCHAR +STARTCHAR uni25C2 +ENCODING 9666 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 5 1 2 +BITMAP +20 +60 +E0 +60 +20 +ENDCHAR +STARTCHAR uni25C3 +ENCODING 9667 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 5 1 2 +BITMAP +20 +60 +A0 +60 +20 +ENDCHAR +STARTCHAR triaglf +ENCODING 9668 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 5 0 2 +BITMAP +0C +3C +FC +3C +0C +ENDCHAR +STARTCHAR uni25C5 +ENCODING 9669 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 5 0 2 +BITMAP +0C +34 +C4 +34 +0C +ENDCHAR +STARTCHAR uni25C6 +ENCODING 9670 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +70 +F8 +70 +20 +ENDCHAR +STARTCHAR uni25C7 +ENCODING 9671 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +50 +88 +50 +20 +ENDCHAR +STARTCHAR uni25C8 +ENCODING 9672 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +50 +A8 +50 +20 +ENDCHAR +STARTCHAR lozenge +ENCODING 9674 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +20 +50 +50 +88 +50 +50 +20 +ENDCHAR +STARTCHAR circle +ENCODING 9675 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni25CC +ENCODING 9676 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +50 +88 +00 +88 +50 +ENDCHAR +STARTCHAR H18533 +ENCODING 9679 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +70 +F8 +F8 +F8 +70 +ENDCHAR +STARTCHAR uni25D0 +ENCODING 9680 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +70 +E8 +E8 +E8 +70 +ENDCHAR +STARTCHAR uni25D1 +ENCODING 9681 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +70 +B8 +B8 +B8 +70 +ENDCHAR +STARTCHAR uni25D2 +ENCODING 9682 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +70 +88 +F8 +F8 +70 +ENDCHAR +STARTCHAR uni25D3 +ENCODING 9683 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +70 +F8 +F8 +88 +70 +ENDCHAR +STARTCHAR uni25D4 +ENCODING 9684 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +70 +B8 +B8 +88 +70 +ENDCHAR +STARTCHAR uni25D5 +ENCODING 9685 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +70 +B8 +F8 +F8 +70 +ENDCHAR +STARTCHAR uni25D6 +ENCODING 9686 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 5 0 2 +BITMAP +60 +E0 +E0 +E0 +60 +ENDCHAR +STARTCHAR uni25D7 +ENCODING 9687 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 5 2 2 +BITMAP +C0 +E0 +E0 +E0 +C0 +ENDCHAR +STARTCHAR invbullet +ENCODING 9688 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +FC +FC +CC +84 +84 +CC +FC +FC +FC +FC +ENDCHAR +STARTCHAR invcircle +ENCODING 9689 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 12 0 -2 +BITMAP +FC +FC +FC +FC +CC +B4 +B4 +CC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni25DC +ENCODING 9692 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 3 0 4 +BITMAP +60 +80 +80 +ENDCHAR +STARTCHAR uni25DD +ENCODING 9693 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 3 2 4 +BITMAP +C0 +20 +20 +ENDCHAR +STARTCHAR uni25DE +ENCODING 9694 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 3 2 2 +BITMAP +20 +20 +C0 +ENDCHAR +STARTCHAR uni25DF +ENCODING 9695 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 3 0 2 +BITMAP +80 +80 +60 +ENDCHAR +STARTCHAR uni25E0 +ENCODING 9696 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 4 +BITMAP +70 +88 +88 +ENDCHAR +STARTCHAR uni25E1 +ENCODING 9697 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 3 0 2 +BITMAP +88 +88 +70 +ENDCHAR +STARTCHAR uni25E2 +ENCODING 9698 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +08 +18 +38 +78 +F8 +ENDCHAR +STARTCHAR uni25E3 +ENCODING 9699 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +80 +C0 +E0 +F0 +F8 +ENDCHAR +STARTCHAR uni25E4 +ENCODING 9700 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +F0 +E0 +C0 +80 +ENDCHAR +STARTCHAR uni25E5 +ENCODING 9701 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +78 +38 +18 +08 +ENDCHAR +STARTCHAR openbullet +ENCODING 9702 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 4 1 2 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni25E7 +ENCODING 9703 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +E8 +E8 +E8 +F8 +ENDCHAR +STARTCHAR uni25E8 +ENCODING 9704 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +B8 +B8 +B8 +F8 +ENDCHAR +STARTCHAR uni25E9 +ENCODING 9705 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +E8 +C8 +88 +F8 +ENDCHAR +STARTCHAR uni25EA +ENCODING 9706 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +88 +98 +B8 +F8 +ENDCHAR +STARTCHAR uni25EB +ENCODING 9707 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR uni25EC +ENCODING 9708 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +50 +50 +A8 +F8 +ENDCHAR +STARTCHAR uni25ED +ENCODING 9709 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +50 +50 +C8 +F8 +ENDCHAR +STARTCHAR uni25EE +ENCODING 9710 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +20 +20 +50 +50 +98 +F8 +ENDCHAR +STARTCHAR uni25EF +ENCODING 9711 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 1 +BITMAP +78 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni25F0 +ENCODING 9712 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +A8 +E8 +88 +F8 +ENDCHAR +STARTCHAR uni25F1 +ENCODING 9713 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +88 +E8 +A8 +F8 +ENDCHAR +STARTCHAR uni25F2 +ENCODING 9714 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +88 +B8 +A8 +F8 +ENDCHAR +STARTCHAR uni25F3 +ENCODING 9715 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +A8 +B8 +88 +F8 +ENDCHAR +STARTCHAR uni25F4 +ENCODING 9716 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +70 +A8 +E8 +88 +70 +ENDCHAR +STARTCHAR uni25F5 +ENCODING 9717 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +70 +88 +E8 +A8 +70 +ENDCHAR +STARTCHAR uni25F6 +ENCODING 9718 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +70 +88 +B8 +A8 +70 +ENDCHAR +STARTCHAR uni25F7 +ENCODING 9719 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +70 +A8 +B8 +88 +70 +ENDCHAR +STARTCHAR uni25F8 +ENCODING 9720 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +90 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni25F9 +ENCODING 9721 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +48 +28 +18 +08 +ENDCHAR +STARTCHAR uni25FA +ENCODING 9722 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +80 +C0 +A0 +90 +F8 +ENDCHAR +STARTCHAR uni25FB +ENCODING 9723 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni25FC +ENCODING 9724 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni25FD +ENCODING 9725 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 4 1 2 +BITMAP +F0 +90 +90 +F0 +ENDCHAR +STARTCHAR uni25FE +ENCODING 9726 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 4 1 2 +BITMAP +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni25FF +ENCODING 9727 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +08 +18 +28 +48 +F8 +ENDCHAR +STARTCHAR uni2609 +ENCODING 9737 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +70 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni260A +ENCODING 9738 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 1 +BITMAP +78 +84 +84 +84 +48 +B4 +48 +ENDCHAR +STARTCHAR uni260B +ENCODING 9739 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 1 +BITMAP +48 +B4 +48 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni2610 +ENCODING 9744 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 7 0 1 +BITMAP +FC +84 +84 +84 +84 +84 +FC +ENDCHAR +STARTCHAR uni2611 +ENCODING 9745 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 1 +BITMAP +FC +84 +8C +DC +F4 +A4 +FC +ENDCHAR +STARTCHAR uni2612 +ENCODING 9746 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 7 0 1 +BITMAP +FC +84 +CC +B4 +CC +84 +FC +ENDCHAR +STARTCHAR uni262A +ENCODING 9770 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +38 +60 +C0 +C8 +C0 +60 +38 +ENDCHAR +STARTCHAR uni2639 +ENCODING 9785 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +78 +84 +CC +84 +B4 +CC +84 +78 +ENDCHAR +STARTCHAR smileface +ENCODING 9786 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +78 +84 +CC +84 +CC +B4 +84 +78 +ENDCHAR +STARTCHAR invsmileface +ENCODING 9787 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +78 +FC +B4 +FC +B4 +CC +FC +78 +ENDCHAR +STARTCHAR sun +ENCODING 9788 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +20 +A8 +70 +D8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni263D +ENCODING 9789 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +E0 +50 +28 +28 +28 +50 +E0 +ENDCHAR +STARTCHAR uni263E +ENCODING 9790 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +38 +50 +A0 +A0 +A0 +50 +38 +ENDCHAR +STARTCHAR uni263F +ENCODING 9791 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +88 +88 +70 +88 +88 +88 +70 +20 +70 +20 +ENDCHAR +STARTCHAR female +ENCODING 9792 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +70 +88 +88 +88 +70 +20 +70 +20 +ENDCHAR +STARTCHAR uni2641 +ENCODING 9793 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +70 +20 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR male +ENCODING 9794 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +1C +0C +14 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2643 +ENCODING 9795 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +08 +08 +48 +A8 +28 +48 +F8 +08 +08 +08 +ENDCHAR +STARTCHAR uni2644 +ENCODING 9796 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +E0 +40 +70 +48 +48 +48 +50 +ENDCHAR +STARTCHAR uni2645 +ENCODING 9797 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +D8 +70 +70 +70 +F8 +20 +50 +20 +ENDCHAR +STARTCHAR uni2646 +ENCODING 9798 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +A8 +A8 +A8 +70 +20 +20 +70 +20 +ENDCHAR +STARTCHAR uni2647 +ENCODING 9799 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F0 +88 +88 +88 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni2648 +ENCODING 9800 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +A8 +A8 +A8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2649 +ENCODING 9801 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +88 +88 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni264A +ENCODING 9802 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +D8 +70 +50 +50 +50 +70 +D8 +ENDCHAR +STARTCHAR uni264B +ENCODING 9803 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 1 +BITMAP +70 +A8 +C0 +18 +A8 +70 +ENDCHAR +STARTCHAR uni264C +ENCODING 9804 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +30 +48 +48 +28 +68 +A8 +C8 +10 +18 +ENDCHAR +STARTCHAR uni264D +ENCODING 9805 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +A0 +E0 +F0 +E8 +E8 +B0 +A0 +A0 +10 +ENDCHAR +STARTCHAR uni264E +ENCODING 9806 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +70 +88 +88 +50 +D8 +00 +F8 +ENDCHAR +STARTCHAR uni264F +ENCODING 9807 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 -1 +BITMAP +A0 +E0 +E0 +E0 +E0 +A0 +A8 +A8 +10 +ENDCHAR +STARTCHAR uni2650 +ENCODING 9808 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +38 +18 +A8 +40 +A0 +ENDCHAR +STARTCHAR uni2651 +ENCODING 9809 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +C0 +A0 +A0 +B0 +A8 +A8 +30 +40 +ENDCHAR +STARTCHAR uni2652 +ENCODING 9810 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +50 +A8 +00 +50 +A8 +ENDCHAR +STARTCHAR uni2653 +ENCODING 9811 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +88 +50 +50 +F8 +50 +50 +88 +ENDCHAR +STARTCHAR uni2654 +ENCODING 9812 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +20 +50 +A8 +A8 +A8 +70 +70 +ENDCHAR +STARTCHAR uni2655 +ENCODING 9813 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +A8 +70 +A8 +70 +50 +88 +F8 +ENDCHAR +STARTCHAR uni2656 +ENCODING 9814 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +A8 +F8 +88 +F8 +50 +50 +50 +70 +88 +F8 +ENDCHAR +STARTCHAR uni2657 +ENCODING 9815 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +50 +70 +A8 +88 +50 +50 +70 +88 +F8 +ENDCHAR +STARTCHAR uni2658 +ENCODING 9816 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +38 +58 +A8 +88 +A8 +48 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2659 +ENCODING 9817 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +70 +88 +88 +70 +88 +F8 +ENDCHAR +STARTCHAR uni265A +ENCODING 9818 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +20 +70 +20 +70 +E8 +F8 +F8 +70 +70 +ENDCHAR +STARTCHAR uni265B +ENCODING 9819 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +A8 +70 +F8 +70 +70 +F8 +F8 +ENDCHAR +STARTCHAR uni265C +ENCODING 9820 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +A8 +F8 +E8 +F8 +70 +70 +70 +70 +F8 +F8 +ENDCHAR +STARTCHAR uni265D +ENCODING 9821 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +20 +70 +70 +D8 +F8 +70 +70 +70 +F8 +F8 +ENDCHAR +STARTCHAR uni265E +ENCODING 9822 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +10 +38 +78 +D8 +F8 +F8 +78 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni265F +ENCODING 9823 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +50 +70 +F8 +F8 +70 +F8 +F8 +ENDCHAR +STARTCHAR spade +ENCODING 9824 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +70 +F8 +F8 +F8 +20 +70 +ENDCHAR +STARTCHAR uni2661 +ENCODING 9825 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +A8 +88 +88 +88 +50 +50 +20 +ENDCHAR +STARTCHAR uni2662 +ENCODING 9826 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +50 +88 +88 +50 +20 +20 +ENDCHAR +STARTCHAR club +ENCODING 9827 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +70 +F8 +F8 +F8 +20 +70 +ENDCHAR +STARTCHAR uni2664 +ENCODING 9828 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +50 +88 +A8 +F8 +20 +70 +ENDCHAR +STARTCHAR heart +ENCODING 9829 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +50 +F8 +F8 +F8 +F8 +70 +70 +20 +ENDCHAR +STARTCHAR diamond +ENCODING 9830 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +70 +F8 +F8 +70 +20 +20 +ENDCHAR +STARTCHAR uni2667 +ENCODING 9831 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +70 +50 +F8 +A8 +F8 +20 +70 +ENDCHAR +STARTCHAR uni2669 +ENCODING 9833 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 9 1 0 +BITMAP +20 +20 +20 +20 +20 +20 +60 +E0 +40 +ENDCHAR +STARTCHAR musicalnote +ENCODING 9834 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 1 0 +BITMAP +20 +30 +28 +20 +20 +20 +60 +E0 +40 +ENDCHAR +STARTCHAR musicalnotedbl +ENCODING 9835 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +30 +3C +2C +24 +24 +24 +64 +EC +5C +08 +ENDCHAR +STARTCHAR uni266C +ENCODING 9836 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +3C +24 +3C +24 +24 +24 +24 +6C +FC +48 +ENDCHAR +STARTCHAR uni266D +ENCODING 9837 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 0 0 +BITMAP +80 +80 +80 +A0 +D0 +90 +A0 +C0 +ENDCHAR +STARTCHAR uni266E +ENCODING 9838 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 0 0 +BITMAP +80 +80 +B0 +D0 +B0 +D0 +10 +10 +ENDCHAR +STARTCHAR uni266F +ENCODING 9839 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +10 +58 +70 +D0 +58 +70 +D0 +40 +ENDCHAR +STARTCHAR uni2680 +ENCODING 9856 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +F8 +F8 +F8 +D8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni2681 +ENCODING 9857 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +F8 +E8 +F8 +F8 +F8 +B8 +F8 +ENDCHAR +STARTCHAR uni2682 +ENCODING 9858 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +F8 +E8 +F8 +D8 +F8 +B8 +F8 +ENDCHAR +STARTCHAR uni2683 +ENCODING 9859 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +F8 +A8 +F8 +F8 +F8 +A8 +F8 +ENDCHAR +STARTCHAR uni2684 +ENCODING 9860 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +F8 +A8 +F8 +D8 +F8 +A8 +F8 +ENDCHAR +STARTCHAR uni2685 +ENCODING 9861 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 1 +BITMAP +F8 +A8 +F8 +A8 +F8 +A8 +F8 +ENDCHAR +STARTCHAR uni271D +ENCODING 10013 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +20 +F8 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2780 +ENCODING 10112 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +B4 +94 +94 +94 +84 +78 +ENDCHAR +STARTCHAR uni2781 +ENCODING 10113 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +8C +94 +A4 +BC +84 +78 +ENDCHAR +STARTCHAR uni2782 +ENCODING 10114 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +B4 +8C +94 +8C +B4 +84 +78 +ENDCHAR +STARTCHAR uni2783 +ENCODING 10115 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +B4 +D4 +F4 +94 +84 +78 +ENDCHAR +STARTCHAR uni2784 +ENCODING 10116 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +BC +A4 +B4 +8C +B4 +84 +78 +ENDCHAR +STARTCHAR uni2785 +ENCODING 10117 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +A4 +B4 +AC +94 +84 +78 +ENDCHAR +STARTCHAR uni2786 +ENCODING 10118 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +F4 +94 +A4 +A4 +A4 +84 +78 +ENDCHAR +STARTCHAR uni2787 +ENCODING 10119 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +94 +AC +94 +AC +94 +84 +78 +ENDCHAR +STARTCHAR uni2788 +ENCODING 10120 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +A4 +D4 +B4 +94 +A4 +84 +78 +ENDCHAR +STARTCHAR uni2789 +ENCODING 10121 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +84 +CC +D4 +D4 +D4 +CC +84 +78 +ENDCHAR +STARTCHAR uni278A +ENCODING 10122 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +EC +CC +EC +EC +EC +FC +78 +ENDCHAR +STARTCHAR uni278B +ENCODING 10123 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +CC +B4 +EC +DC +84 +FC +78 +ENDCHAR +STARTCHAR uni278C +ENCODING 10124 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +CC +B4 +EC +B4 +CC +FC +78 +ENDCHAR +STARTCHAR uni278D +ENCODING 10125 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +EC +CC +AC +84 +EC +FC +78 +ENDCHAR +STARTCHAR uni278E +ENCODING 10126 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +84 +BC +8C +F4 +8C +FC +78 +ENDCHAR +STARTCHAR uni278F +ENCODING 10127 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +CC +BC +8C +B4 +CC +FC +78 +ENDCHAR +STARTCHAR uni2790 +ENCODING 10128 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +84 +F4 +EC +DC +DC +FC +78 +ENDCHAR +STARTCHAR uni2791 +ENCODING 10129 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +CC +B4 +CC +B4 +CC +FC +78 +ENDCHAR +STARTCHAR uni2792 +ENCODING 10130 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +CC +B4 +C4 +F4 +CC +FC +78 +ENDCHAR +STARTCHAR uni2793 +ENCODING 10131 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +78 +FC +B4 +AC +AC +AC +B4 +FC +78 +ENDCHAR +STARTCHAR uni2794 +ENCODING 10132 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +10 +F8 +10 +20 +ENDCHAR +STARTCHAR uni2795 +ENCODING 10133 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2796 +ENCODING 10134 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 1 0 3 +BITMAP +F8 +ENDCHAR +STARTCHAR uni2797 +ENCODING 10135 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +00 +F8 +00 +20 +ENDCHAR +STARTCHAR uni2798 +ENCODING 10136 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +80 +40 +28 +18 +38 +ENDCHAR +STARTCHAR uni2799 +ENCODING 10137 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +10 +F8 +10 +20 +ENDCHAR +STARTCHAR uni279A +ENCODING 10138 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +38 +18 +28 +40 +80 +ENDCHAR +STARTCHAR uni279B +ENCODING 10139 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +10 +F8 +10 +20 +ENDCHAR +STARTCHAR uni279C +ENCODING 10140 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +10 +F8 +10 +20 +ENDCHAR +STARTCHAR uni279D +ENCODING 10141 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +30 +F8 +30 +20 +ENDCHAR +STARTCHAR uni279E +ENCODING 10142 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +F0 +F8 +F0 +20 +ENDCHAR +STARTCHAR uni279F +ENCODING 10143 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +30 +B8 +30 +20 +ENDCHAR +STARTCHAR uni27A0 +ENCODING 10144 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 1 +BITMAP +20 +B0 +B8 +B0 +20 +ENDCHAR +STARTCHAR uni27A1 +ENCODING 10145 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +F0 +F8 +F0 +20 +ENDCHAR +STARTCHAR uni29CE +ENCODING 10702 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +18 +68 +88 +68 +18 +C0 +B0 +88 +B0 +C0 +ENDCHAR +STARTCHAR uni29CF +ENCODING 10703 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +28 +68 +A8 +68 +28 +ENDCHAR +STARTCHAR uni29D0 +ENCODING 10704 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +A0 +B0 +A8 +B0 +A0 +ENDCHAR +STARTCHAR uni29D1 +ENCODING 10705 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +88 +D8 +E8 +D8 +88 +ENDCHAR +STARTCHAR uni29D2 +ENCODING 10706 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +88 +D8 +B8 +D8 +88 +ENDCHAR +STARTCHAR uni29D3 +ENCODING 10707 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +88 +D8 +F8 +D8 +88 +ENDCHAR +STARTCHAR uni29D4 +ENCODING 10708 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +88 +D0 +E0 +D0 +88 +ENDCHAR +STARTCHAR uni29D5 +ENCODING 10709 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +88 +58 +38 +58 +88 +ENDCHAR +STARTCHAR uni29D6 +ENCODING 10710 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +50 +20 +50 +F8 +ENDCHAR +STARTCHAR uni29D7 +ENCODING 10711 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +70 +20 +70 +F8 +ENDCHAR +STARTCHAR uni2A00 +ENCODING 10752 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +70 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2A01 +ENCODING 10753 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +70 +A8 +F8 +A8 +70 +ENDCHAR +STARTCHAR uni2A02 +ENCODING 10754 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +70 +D8 +A8 +D8 +70 +ENDCHAR +STARTCHAR uni2A03 +ENCODING 10755 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +88 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2A04 +ENCODING 10756 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +A8 +F8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2A05 +ENCODING 10757 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni2A06 +ENCODING 10758 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2A09 +ENCODING 10761 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni2B00 +ENCODING 11008 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +78 +28 +58 +A8 +C0 +ENDCHAR +STARTCHAR uni2B01 +ENCODING 11009 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F0 +A0 +D0 +A8 +18 +ENDCHAR +STARTCHAR uni2B02 +ENCODING 11010 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +C0 +A8 +58 +28 +78 +ENDCHAR +STARTCHAR uni2B03 +ENCODING 11011 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +18 +A8 +D0 +A0 +F0 +ENDCHAR +STARTCHAR uni2B04 +ENCODING 11012 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 5 0 2 +BITMAP +48 +FC +84 +FC +48 +ENDCHAR +STARTCHAR uni2B05 +ENCODING 11013 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +78 +F8 +78 +20 +ENDCHAR +STARTCHAR uni2B06 +ENCODING 11014 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +70 +F8 +70 +70 +ENDCHAR +STARTCHAR uni2B07 +ENCODING 11015 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +70 +70 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2B08 +ENCODING 11016 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +78 +38 +78 +E8 +C0 +ENDCHAR +STARTCHAR uni2B09 +ENCODING 11017 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F0 +E0 +F0 +B8 +18 +ENDCHAR +STARTCHAR uni2B0A +ENCODING 11018 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +C0 +E8 +78 +38 +78 +ENDCHAR +STARTCHAR uni2B0B +ENCODING 11019 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +18 +B8 +F0 +E0 +F0 +ENDCHAR +STARTCHAR uni2B0C +ENCODING 11020 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 5 0 2 +BITMAP +48 +FC +FC +FC +48 +ENDCHAR +STARTCHAR uni2B0D +ENCODING 11021 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 1 +BITMAP +20 +70 +F8 +70 +70 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2B12 +ENCODING 11026 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +F8 +F8 +88 +F8 +ENDCHAR +STARTCHAR uni2B13 +ENCODING 11027 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +88 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni2B14 +ENCODING 11028 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +F8 +B8 +98 +F8 +ENDCHAR +STARTCHAR uni2B15 +ENCODING 11029 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +F8 +88 +C8 +E8 +F8 +ENDCHAR +STARTCHAR uni2B16 +ENCODING 11030 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +70 +E8 +70 +20 +ENDCHAR +STARTCHAR uni2B17 +ENCODING 11031 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +70 +B8 +70 +20 +ENDCHAR +STARTCHAR uni2B18 +ENCODING 11032 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +70 +F8 +50 +20 +ENDCHAR +STARTCHAR uni2B19 +ENCODING 11033 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 2 +BITMAP +20 +50 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2B2C +ENCODING 11052 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 4 0 2 +BITMAP +78 +FC +FC +78 +ENDCHAR +STARTCHAR uni2B2D +ENCODING 11053 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 6 4 0 2 +BITMAP +78 +84 +84 +78 +ENDCHAR +STARTCHAR uni2B2E +ENCODING 11054 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 4 6 1 1 +BITMAP +60 +F0 +F0 +F0 +F0 +60 +ENDCHAR +STARTCHAR uni2B2F +ENCODING 11055 +SWIDTH 1000 0 +DWIDTH 6 0 +BBX 4 6 1 1 +BITMAP +60 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uniA730 +ENCODING 42800 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +F8 +80 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uniA731 +ENCODING 42801 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +78 +80 +70 +08 +08 +F0 +ENDCHAR +STARTCHAR uniFE7C +ENCODING 65148 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 4 0 6 +BITMAP +88 +A8 +B0 +40 +ENDCHAR +STARTCHAR uniFE7D +ENCODING 65149 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +88 +A8 +B0 +40 +00 +00 +00 +00 +00 +FC +ENDCHAR +STARTCHAR uniFE7E +ENCODING 65150 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 3 1 7 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR uniFE7F +ENCODING 65151 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +20 +50 +20 +00 +00 +00 +00 +00 +00 +FC +ENDCHAR +STARTCHAR uniFE80 +ENCODING 65152 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 5 2 1 +BITMAP +60 +80 +80 +60 +C0 +ENDCHAR +STARTCHAR uniFE81 +ENCODING 65153 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 10 1 0 +BITMAP +50 +A0 +00 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uniFE82 +ENCODING 65154 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 1 0 +BITMAP +50 +A0 +00 +40 +40 +40 +40 +40 +40 +38 +ENDCHAR +STARTCHAR uniFE83 +ENCODING 65155 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 0 +BITMAP +60 +80 +E0 +00 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uniFE84 +ENCODING 65156 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 1 0 +BITMAP +60 +80 +E0 +00 +40 +40 +40 +40 +40 +38 +ENDCHAR +STARTCHAR uniFE85 +ENCODING 65157 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +30 +40 +70 +00 +30 +48 +48 +38 +08 +F0 +ENDCHAR +STARTCHAR uniFE86 +ENCODING 65158 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +30 +40 +70 +00 +30 +48 +48 +3C +08 +F0 +ENDCHAR +STARTCHAR uniFE87 +ENCODING 65159 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 10 1 -2 +BITMAP +40 +40 +40 +40 +40 +40 +00 +60 +80 +E0 +ENDCHAR +STARTCHAR uniFE88 +ENCODING 65160 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +10 +6C +80 +E0 +ENDCHAR +STARTCHAR uniFE89 +ENCODING 65161 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +60 +80 +E0 +08 +14 +50 +88 +88 +70 +ENDCHAR +STARTCHAR uniFE8A +ENCODING 65162 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +60 +80 +E0 +00 +48 +94 +94 +60 +ENDCHAR +STARTCHAR uniFE8B +ENCODING 65163 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 0 0 +BITMAP +30 +40 +70 +00 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uniFE8C +ENCODING 65164 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +30 +40 +70 +00 +20 +20 +20 +DC +ENDCHAR +STARTCHAR uniFE8D +ENCODING 65165 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 1 8 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uniFE8E +ENCODING 65166 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +70 +ENDCHAR +STARTCHAR uniFE8F +ENCODING 65167 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +10 +88 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uniFE90 +ENCODING 65168 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +10 +88 +88 +74 +00 +20 +ENDCHAR +STARTCHAR uniFE91 +ENCODING 65169 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 6 0 -2 +BITMAP +20 +20 +20 +C0 +00 +20 +ENDCHAR +STARTCHAR uniFE92 +ENCODING 65170 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +20 +20 +20 +DC +00 +20 +ENDCHAR +STARTCHAR uniFE93 +ENCODING 65171 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +50 +00 +60 +90 +88 +88 +70 +ENDCHAR +STARTCHAR uniFE94 +ENCODING 65172 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +50 +00 +30 +48 +88 +88 +74 +ENDCHAR +STARTCHAR uniFE95 +ENCODING 65173 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +50 +00 +10 +88 +88 +70 +ENDCHAR +STARTCHAR uniFE96 +ENCODING 65174 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +50 +00 +10 +88 +88 +74 +ENDCHAR +STARTCHAR uniFE97 +ENCODING 65175 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 6 0 0 +BITMAP +50 +00 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uniFE98 +ENCODING 65176 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +50 +00 +20 +20 +20 +DC +ENDCHAR +STARTCHAR uniFE99 +ENCODING 65177 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +20 +00 +50 +00 +10 +88 +88 +70 +ENDCHAR +STARTCHAR uniFE9A +ENCODING 65178 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +20 +00 +50 +00 +10 +88 +88 +74 +ENDCHAR +STARTCHAR uniFE9B +ENCODING 65179 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 0 0 +BITMAP +20 +00 +50 +00 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uniFE9C +ENCODING 65180 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +20 +00 +50 +00 +20 +20 +20 +DC +ENDCHAR +STARTCHAR uniFE9D +ENCODING 65181 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F8 +20 +40 +80 +A0 +80 +40 +38 +ENDCHAR +STARTCHAR uniFE9E +ENCODING 65182 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +F8 +30 +50 +88 +A4 +80 +40 +38 +ENDCHAR +STARTCHAR uniFE9F +ENCODING 65183 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +70 +08 +30 +C0 +00 +20 +ENDCHAR +STARTCHAR uniFEA0 +ENCODING 65184 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +70 +08 +38 +C4 +00 +20 +ENDCHAR +STARTCHAR uniFEA1 +ENCODING 65185 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +F8 +20 +40 +80 +80 +80 +40 +38 +ENDCHAR +STARTCHAR uniFEA2 +ENCODING 65186 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +F8 +30 +50 +88 +84 +80 +40 +38 +ENDCHAR +STARTCHAR uniFEA3 +ENCODING 65187 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +70 +08 +30 +C0 +ENDCHAR +STARTCHAR uniFEA4 +ENCODING 65188 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +70 +08 +38 +C4 +ENDCHAR +STARTCHAR uniFEA5 +ENCODING 65189 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +20 +00 +F8 +20 +40 +80 +80 +80 +40 +38 +ENDCHAR +STARTCHAR uniFEA6 +ENCODING 65190 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +20 +00 +F8 +30 +50 +88 +84 +80 +40 +38 +ENDCHAR +STARTCHAR uniFEA7 +ENCODING 65191 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +20 +00 +70 +08 +30 +C0 +ENDCHAR +STARTCHAR uniFEA8 +ENCODING 65192 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +20 +00 +70 +08 +38 +C4 +ENDCHAR +STARTCHAR uniFEA9 +ENCODING 65193 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 5 1 0 +BITMAP +20 +10 +10 +10 +E0 +ENDCHAR +STARTCHAR uniFEAA +ENCODING 65194 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 1 0 +BITMAP +20 +10 +10 +10 +E8 +ENDCHAR +STARTCHAR uniFEAB +ENCODING 65195 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 7 1 0 +BITMAP +40 +00 +20 +10 +10 +10 +E0 +ENDCHAR +STARTCHAR uniFEAC +ENCODING 65196 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 1 0 +BITMAP +40 +00 +20 +10 +10 +10 +E8 +ENDCHAR +STARTCHAR uniFEAD +ENCODING 65197 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 -1 +BITMAP +08 +08 +08 +10 +E0 +ENDCHAR +STARTCHAR uniFEAE +ENCODING 65198 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 5 0 -1 +BITMAP +08 +08 +08 +14 +E0 +ENDCHAR +STARTCHAR uniFEAF +ENCODING 65199 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +08 +00 +08 +08 +08 +10 +E0 +ENDCHAR +STARTCHAR uniFEB0 +ENCODING 65200 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +08 +00 +08 +08 +08 +14 +E0 +ENDCHAR +STARTCHAR uniFEB1 +ENCODING 65201 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +04 +54 +54 +54 +28 +A0 +40 +ENDCHAR +STARTCHAR uniFEB2 +ENCODING 65202 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +04 +54 +54 +54 +28 +A0 +40 +ENDCHAR +STARTCHAR uniFEB3 +ENCODING 65203 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +04 +54 +54 +54 +A8 +ENDCHAR +STARTCHAR uniFEB4 +ENCODING 65204 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +04 +54 +54 +54 +A8 +ENDCHAR +STARTCHAR uniFEB5 +ENCODING 65205 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +20 +00 +50 +04 +54 +54 +54 +28 +A0 +40 +ENDCHAR +STARTCHAR uniFEB6 +ENCODING 65206 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +20 +00 +50 +04 +54 +54 +54 +28 +A0 +40 +ENDCHAR +STARTCHAR uniFEB7 +ENCODING 65207 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +20 +00 +50 +04 +54 +54 +54 +A8 +ENDCHAR +STARTCHAR uniFEB8 +ENCODING 65208 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +20 +00 +50 +04 +54 +54 +54 +A8 +ENDCHAR +STARTCHAR uniFEB9 +ENCODING 65209 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +28 +34 +A4 +B8 +A0 +40 +ENDCHAR +STARTCHAR uniFEBA +ENCODING 65210 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +28 +34 +A4 +BC +A0 +40 +ENDCHAR +STARTCHAR uniFEBB +ENCODING 65211 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +48 +54 +64 +B8 +ENDCHAR +STARTCHAR uniFEBC +ENCODING 65212 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +48 +54 +64 +BC +ENDCHAR +STARTCHAR uniFEBD +ENCODING 65213 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +20 +00 +28 +34 +A4 +B8 +A0 +40 +ENDCHAR +STARTCHAR uniFEBE +ENCODING 65214 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +20 +00 +28 +34 +A4 +BC +A0 +40 +ENDCHAR +STARTCHAR uniFEBF +ENCODING 65215 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +20 +00 +48 +54 +64 +B8 +ENDCHAR +STARTCHAR uniFEC0 +ENCODING 65216 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +20 +00 +48 +54 +64 +BC +ENDCHAR +STARTCHAR uniFEC1 +ENCODING 65217 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +40 +40 +40 +50 +68 +48 +F0 +ENDCHAR +STARTCHAR uniFEC2 +ENCODING 65218 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +40 +40 +40 +40 +50 +68 +48 +F4 +ENDCHAR +STARTCHAR uniFEC3 +ENCODING 65219 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +40 +40 +40 +50 +68 +48 +F0 +ENDCHAR +STARTCHAR uniFEC4 +ENCODING 65220 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +40 +40 +40 +40 +50 +68 +48 +F4 +ENDCHAR +STARTCHAR uniFEC5 +ENCODING 65221 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +40 +50 +40 +50 +68 +48 +F0 +ENDCHAR +STARTCHAR uniFEC6 +ENCODING 65222 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +40 +40 +50 +40 +50 +68 +48 +F4 +ENDCHAR +STARTCHAR uniFEC7 +ENCODING 65223 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +40 +50 +40 +50 +68 +48 +F0 +ENDCHAR +STARTCHAR uniFEC8 +ENCODING 65224 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +40 +40 +50 +40 +50 +68 +48 +F4 +ENDCHAR +STARTCHAR uniFEC9 +ENCODING 65225 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 -2 +BITMAP +60 +80 +80 +70 +80 +80 +88 +70 +ENDCHAR +STARTCHAR uniFECA +ENCODING 65226 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 -2 +BITMAP +60 +90 +60 +90 +8C +80 +70 +ENDCHAR +STARTCHAR uniFECB +ENCODING 65227 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 0 +BITMAP +30 +40 +40 +38 +20 +C0 +ENDCHAR +STARTCHAR uniFECC +ENCODING 65228 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +20 +50 +50 +20 +50 +8C +ENDCHAR +STARTCHAR uniFECD +ENCODING 65229 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +40 +00 +60 +80 +80 +70 +80 +80 +88 +70 +ENDCHAR +STARTCHAR uniFECE +ENCODING 65230 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 -2 +BITMAP +20 +00 +60 +90 +60 +90 +8C +80 +70 +ENDCHAR +STARTCHAR uniFECF +ENCODING 65231 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +40 +00 +30 +40 +40 +38 +20 +C0 +ENDCHAR +STARTCHAR uniFED0 +ENCODING 65232 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +20 +00 +20 +50 +50 +20 +50 +8C +ENDCHAR +STARTCHAR uniFED1 +ENCODING 65233 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +10 +00 +10 +28 +98 +88 +70 +ENDCHAR +STARTCHAR uniFED2 +ENCODING 65234 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +10 +00 +10 +28 +98 +8C +70 +ENDCHAR +STARTCHAR uniFED3 +ENCODING 65235 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 0 -1 +BITMAP +20 +00 +20 +50 +30 +10 +20 +C0 +ENDCHAR +STARTCHAR uniFED4 +ENCODING 65236 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +20 +00 +20 +50 +50 +20 +DC +ENDCHAR +STARTCHAR uniFED5 +ENCODING 65237 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +28 +00 +10 +28 +98 +88 +70 +ENDCHAR +STARTCHAR uniFED6 +ENCODING 65238 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +28 +00 +10 +28 +98 +8C +70 +ENDCHAR +STARTCHAR uniFED7 +ENCODING 65239 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 0 -1 +BITMAP +50 +00 +20 +50 +30 +10 +20 +C0 +ENDCHAR +STARTCHAR uniFED8 +ENCODING 65240 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 0 +BITMAP +50 +00 +20 +50 +50 +20 +DC +ENDCHAR +STARTCHAR uniFED9 +ENCODING 65241 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +28 +48 +28 +C8 +08 +88 +88 +70 +ENDCHAR +STARTCHAR uniFEDA +ENCODING 65242 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +28 +48 +28 +C8 +08 +88 +88 +74 +ENDCHAR +STARTCHAR uniFEDB +ENCODING 65243 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 9 0 0 +BITMAP +08 +30 +40 +40 +20 +10 +08 +08 +F0 +ENDCHAR +STARTCHAR uniFEDC +ENCODING 65244 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 9 0 0 +BITMAP +08 +30 +40 +40 +20 +10 +08 +08 +F4 +ENDCHAR +STARTCHAR uniFEDD +ENCODING 65245 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +48 +88 +88 +70 +ENDCHAR +STARTCHAR uniFEDE +ENCODING 65246 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +48 +8C +88 +70 +ENDCHAR +STARTCHAR uniFEDF +ENCODING 65247 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 0 0 +BITMAP +10 +10 +10 +10 +10 +10 +10 +E0 +ENDCHAR +STARTCHAR uniFEE0 +ENCODING 65248 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 0 +BITMAP +10 +10 +10 +10 +10 +10 +10 +EC +ENDCHAR +STARTCHAR uniFEE1 +ENCODING 65249 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +30 +48 +48 +B0 +80 +80 +ENDCHAR +STARTCHAR uniFEE2 +ENCODING 65250 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +30 +48 +48 +B4 +80 +80 +ENDCHAR +STARTCHAR uniFEE3 +ENCODING 65251 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 4 0 0 +BITMAP +30 +48 +48 +B0 +ENDCHAR +STARTCHAR uniFEE4 +ENCODING 65252 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 4 0 0 +BITMAP +30 +48 +48 +B4 +ENDCHAR +STARTCHAR uniFEE5 +ENCODING 65253 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 -1 +BITMAP +20 +00 +10 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uniFEE6 +ENCODING 65254 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 7 0 -1 +BITMAP +20 +00 +10 +88 +88 +8C +70 +ENDCHAR +STARTCHAR uniFEE7 +ENCODING 65255 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 3 6 0 0 +BITMAP +20 +00 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uniFEE8 +ENCODING 65256 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 0 +BITMAP +20 +00 +20 +20 +20 +DC +ENDCHAR +STARTCHAR uniFEE9 +ENCODING 65257 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 5 0 0 +BITMAP +60 +90 +88 +88 +70 +ENDCHAR +STARTCHAR uniFEEA +ENCODING 65258 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 5 0 0 +BITMAP +30 +48 +88 +88 +74 +ENDCHAR +STARTCHAR uniFEEB +ENCODING 65259 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 7 0 0 +BITMAP +E0 +10 +48 +A8 +A8 +48 +B0 +ENDCHAR +STARTCHAR uniFEEC +ENCODING 65260 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +10 +28 +48 +FC +48 +30 +ENDCHAR +STARTCHAR uniFEED +ENCODING 65261 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 6 0 -2 +BITMAP +30 +48 +48 +38 +08 +F0 +ENDCHAR +STARTCHAR uniFEEE +ENCODING 65262 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +30 +48 +48 +3C +08 +F0 +ENDCHAR +STARTCHAR uniFEEF +ENCODING 65263 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 5 0 -1 +BITMAP +08 +14 +90 +88 +70 +ENDCHAR +STARTCHAR uniFEF0 +ENCODING 65264 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 5 0 -1 +BITMAP +08 +14 +94 +94 +60 +ENDCHAR +STARTCHAR uniFEF1 +ENCODING 65265 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 8 0 -2 +BITMAP +08 +14 +50 +88 +88 +70 +00 +50 +ENDCHAR +STARTCHAR uniFEF2 +ENCODING 65266 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +48 +94 +94 +60 +00 +50 +ENDCHAR +STARTCHAR uniFEF3 +ENCODING 65267 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 6 0 -2 +BITMAP +20 +20 +20 +C0 +00 +50 +ENDCHAR +STARTCHAR uniFEF4 +ENCODING 65268 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 6 0 -2 +BITMAP +20 +20 +20 +DC +00 +50 +ENDCHAR +STARTCHAR uniFEF5 +ENCODING 65269 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +50 +A0 +08 +48 +48 +28 +28 +18 +18 +70 +ENDCHAR +STARTCHAR uniFEF6 +ENCODING 65270 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +50 +A0 +08 +48 +48 +28 +28 +18 +18 +74 +ENDCHAR +STARTCHAR uniFEF7 +ENCODING 65271 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 0 +BITMAP +60 +80 +E8 +08 +48 +28 +28 +18 +18 +70 +ENDCHAR +STARTCHAR uniFEF8 +ENCODING 65272 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 0 +BITMAP +60 +80 +E8 +08 +48 +28 +28 +18 +18 +74 +ENDCHAR +STARTCHAR uniFEF9 +ENCODING 65273 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 10 0 -2 +BITMAP +08 +48 +48 +28 +28 +18 +98 +70 +80 +E0 +ENDCHAR +STARTCHAR uniFEFA +ENCODING 65274 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 6 10 0 -2 +BITMAP +08 +48 +48 +28 +28 +18 +98 +74 +80 +E0 +ENDCHAR +STARTCHAR uniFEFB +ENCODING 65275 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 4 8 1 0 +BITMAP +10 +90 +90 +50 +50 +30 +30 +E0 +ENDCHAR +STARTCHAR uniFEFC +ENCODING 65276 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 1 0 +BITMAP +10 +90 +90 +50 +50 +30 +30 +E8 +ENDCHAR +STARTCHAR uniFFFD +ENCODING 65533 +SWIDTH 500 0 +DWIDTH 6 0 +BBX 5 8 0 0 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +F8 +ENDCHAR +ENDFONT diff --git a/app/src/gambas3/font/GambasMedium-13.bdf b/app/src/gambas3/font/GambasMedium-13.bdf new file mode 100644 index 00000000..fb9a9a1d --- /dev/null +++ b/app/src/gambas3/font/GambasMedium-13.bdf @@ -0,0 +1,41608 @@ +STARTFONT 2.1 +FONT -xos4-Gambas-Medium-R-Normal--13-120-75-75-C-70-ISO10646-1 +SIZE 12 75 75 +FONTBOUNDINGBOX 7 14 0 -2 +COMMENT "Generated by fontforge, http://fontforge.sourceforge.net" +COMMENT "Copyright (C) 2012 Dimitar Toshkov Zhekov" +COMMENT "Copyright (C) 2012 Benoit Minisini" +STARTPROPERTIES 34 +FOUNDRY "xos4" +FAMILY_NAME "Gambas" +WEIGHT_NAME "Medium" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 13 +POINT_SIZE 120 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "C" +AVERAGE_WIDTH 70 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +FONTNAME_REGISTRY "" +CHARSET_COLLECTIONS "ASCII ISOLatin1Encoding ISO8859-2 ISO8859-5 ISO8859-7 ISO8859-9 ISO8859-6 ISO8859-4 ISO10646-1" +FONT_NAME "GambasMedium" +FACE_NAME "Gambas Medium" +COPYRIGHT "Copyright (C) 2012 Dimitar Toshkov Zhekov" +FONT_VERSION "001.000" +FONT_ASCENT 11 +FONT_DESCENT 2 +UNDERLINE_POSITION -1 +UNDERLINE_THICKNESS 1 +X_HEIGHT 6 +CAP_HEIGHT 8 +RAW_ASCENT 846 +RAW_DESCENT 154 +NORM_SPACE 7 +RELATIVE_WEIGHT 50 +RELATIVE_SETWIDTH 50 +FIGURE_WIDTH 7 +AVG_LOWERCASE_WIDTH 70 +AVG_UPPERCASE_WIDTH 70 +ENDPROPERTIES +CHARS 2631 +STARTCHAR uni0000 +ENCODING 0 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +A8 +00 +88 +00 +88 +00 +88 +00 +A8 +ENDCHAR +STARTCHAR space +ENCODING 32 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 1 6 -2 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 9 3 0 +BITMAP +80 +80 +80 +80 +80 +80 +00 +80 +80 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 3 2 7 +BITMAP +A0 +A0 +A0 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 1 1 +BITMAP +50 +50 +F8 +50 +50 +F8 +50 +50 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -1 +BITMAP +20 +20 +78 +80 +80 +70 +08 +08 +F0 +20 +20 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +40 +A0 +A4 +48 +10 +20 +48 +94 +14 +08 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +30 +48 +48 +30 +20 +54 +88 +88 +74 +ENDCHAR +STARTCHAR quotesingle +ENCODING 39 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 3 3 7 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 11 2 -1 +BITMAP +20 +40 +80 +80 +80 +80 +80 +80 +80 +40 +20 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 11 2 -1 +BITMAP +80 +40 +20 +20 +20 +20 +20 +20 +20 +40 +80 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +50 +20 +F8 +20 +50 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 4 2 -2 +BITMAP +40 +40 +40 +80 +ENDCHAR +STARTCHAR hyphen +ENCODING 45 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 1 1 4 +BITMAP +F8 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 2 3 0 +BITMAP +80 +80 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +08 +08 +10 +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +98 +A8 +C8 +88 +88 +70 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +20 +60 +A0 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +08 +08 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +08 +08 +70 +08 +08 +88 +70 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +08 +18 +28 +48 +88 +FC +08 +08 +08 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +80 +80 +F0 +08 +08 +08 +88 +70 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +30 +40 +80 +80 +F0 +88 +88 +88 +70 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +08 +08 +10 +10 +20 +20 +40 +40 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +88 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +88 +78 +08 +08 +10 +60 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 6 3 0 +BITMAP +80 +80 +00 +00 +80 +80 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 8 2 -2 +BITMAP +40 +40 +00 +00 +40 +40 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +08 +10 +20 +40 +80 +40 +20 +10 +08 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 4 1 2 +BITMAP +F8 +00 +00 +F8 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +80 +40 +20 +10 +08 +10 +20 +40 +80 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +08 +10 +20 +20 +00 +20 +20 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +38 +44 +9C +A4 +A4 +A4 +98 +40 +3C +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F0 +88 +88 +88 +F0 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +78 +80 +80 +80 +80 +80 +80 +80 +78 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +E0 +90 +88 +88 +88 +88 +88 +90 +E0 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +80 +80 +80 +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +80 +80 +80 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +78 +80 +80 +80 +98 +88 +88 +88 +70 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +88 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +38 +10 +10 +10 +10 +10 +10 +10 +E0 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +90 +A0 +C0 +80 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +88 +D8 +D8 +A8 +A8 +88 +88 +88 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +C8 +C8 +A8 +A8 +98 +98 +88 +88 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F0 +88 +88 +88 +F0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +88 +88 +88 +A8 +90 +68 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F0 +88 +88 +88 +F0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +78 +80 +80 +80 +70 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +88 +88 +50 +50 +50 +20 +20 +20 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +88 +88 +A8 +A8 +D8 +D8 +88 +88 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +88 +50 +50 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +88 +50 +50 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +08 +10 +10 +20 +40 +40 +80 +F8 +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 11 2 -1 +BITMAP +E0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +E0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +80 +80 +40 +40 +20 +20 +10 +10 +08 +08 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 11 2 -1 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +20 +20 +20 +E0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 3 1 7 +BITMAP +20 +50 +88 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 1 0 0 +BITMAP +FC +ENDCHAR +STARTCHAR grave +ENCODING 96 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 2 2 8 +BITMAP +80 +40 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +70 +08 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +80 +80 +F0 +88 +88 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +78 +80 +80 +80 +80 +80 +78 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +08 +08 +78 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +70 +88 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 9 2 0 +BITMAP +70 +80 +80 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +78 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +80 +80 +F0 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 10 2 0 +BITMAP +40 +40 +00 +C0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 12 1 -2 +BITMAP +20 +20 +00 +60 +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +80 +80 +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 9 2 0 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F0 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F0 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +F0 +88 +88 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +78 +88 +88 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +78 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +78 +80 +80 +70 +08 +08 +F0 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 9 2 0 +BITMAP +80 +80 +F0 +80 +80 +80 +80 +80 +70 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +88 +88 +A8 +A8 +D8 +88 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +88 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F8 +08 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 11 1 -1 +BITMAP +30 +40 +40 +40 +40 +80 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 11 3 -1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 11 2 -1 +BITMAP +C0 +20 +20 +20 +20 +10 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 3 1 7 +BITMAP +48 +A8 +90 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 9 3 0 +BITMAP +80 +80 +00 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -1 +BITMAP +20 +20 +78 +A0 +A0 +A0 +A0 +A0 +78 +20 +20 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +38 +40 +40 +F0 +40 +40 +40 +40 +F8 +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 1 +BITMAP +88 +70 +88 +88 +88 +70 +88 +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +88 +50 +50 +20 +F8 +20 +F8 +20 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 10 3 0 +BITMAP +80 +80 +80 +80 +00 +00 +80 +80 +80 +80 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 9 1 0 +BITMAP +70 +80 +40 +A0 +90 +50 +20 +10 +E0 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 1 2 10 +BITMAP +A0 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +38 +44 +9A +A2 +A2 +A2 +9A +44 +38 +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 5 1 6 +BITMAP +60 +10 +70 +90 +70 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +24 +48 +90 +48 +24 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 4 1 3 +BITMAP +F8 +08 +08 +08 +ENDCHAR +STARTCHAR uni00AD +ENCODING 173 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 1 1 4 +BITMAP +F8 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +38 +44 +B2 +AA +B2 +AA +AA +44 +38 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 1 2 10 +BITMAP +E0 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 4 1 7 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 1 +BITMAP +20 +20 +F8 +20 +20 +00 +F8 +ENDCHAR +STARTCHAR uni00B2 +ENCODING 178 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 5 1 6 +BITMAP +E0 +10 +60 +80 +F0 +ENDCHAR +STARTCHAR uni00B3 +ENCODING 179 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 5 1 6 +BITMAP +E0 +10 +60 +10 +E0 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 2 3 9 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni00B5 +ENCODING 181 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +88 +88 +88 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +78 +E8 +E8 +E8 +68 +28 +28 +28 +28 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 2 2 4 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 3 1 -2 +BITMAP +20 +20 +C0 +ENDCHAR +STARTCHAR uni00B9 +ENCODING 185 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 5 1 6 +BITMAP +40 +C0 +40 +40 +40 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 5 1 6 +BITMAP +60 +90 +90 +90 +60 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +90 +48 +24 +48 +90 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +40 +C0 +40 +40 +40 +0C +30 +C0 +08 +18 +28 +3C +08 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +40 +C0 +40 +40 +40 +0C +30 +C0 +38 +04 +18 +20 +3C +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +E0 +10 +60 +10 +E0 +0C +30 +C0 +08 +18 +28 +3C +08 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 9 1 0 +BITMAP +20 +20 +00 +20 +20 +40 +80 +80 +70 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +20 +70 +88 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +40 +70 +88 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +50 +00 +70 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +48 +A8 +90 +00 +70 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +00 +70 +88 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +50 +20 +00 +70 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +7C +90 +90 +90 +FC +90 +90 +90 +9C +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +78 +80 +80 +80 +80 +80 +80 +80 +78 +20 +C0 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +20 +F8 +80 +80 +80 +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +20 +F8 +80 +80 +80 +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +50 +00 +F8 +80 +80 +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +00 +F8 +80 +80 +80 +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +20 +F8 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +20 +F8 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +50 +00 +F8 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +70 +48 +44 +44 +E4 +44 +44 +48 +70 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +48 +A8 +90 +00 +88 +C8 +C8 +A8 +98 +98 +88 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +20 +70 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +20 +70 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +50 +00 +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +48 +A8 +90 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +00 +70 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -1 +BITMAP +08 +70 +98 +98 +A8 +A8 +A8 +C8 +C8 +70 +80 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +20 +88 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +20 +88 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +50 +00 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +00 +88 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +20 +88 +88 +50 +50 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +80 +80 +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +60 +90 +90 +B0 +88 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +40 +20 +00 +70 +08 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +10 +20 +00 +70 +08 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +20 +50 +00 +70 +08 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +48 +A8 +90 +00 +70 +08 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +50 +00 +70 +08 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +50 +20 +00 +70 +08 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +14 +14 +78 +90 +90 +7C +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +78 +80 +80 +80 +80 +80 +78 +20 +C0 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +40 +20 +00 +70 +88 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +10 +20 +00 +70 +88 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +20 +50 +00 +70 +88 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +50 +00 +70 +88 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 10 2 0 +BITMAP +80 +40 +00 +C0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 10 2 0 +BITMAP +40 +80 +00 +C0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 10 2 0 +BITMAP +40 +A0 +00 +C0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 9 2 0 +BITMAP +A0 +00 +C0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +60 +18 +30 +08 +78 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +48 +A8 +90 +00 +F0 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +40 +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +10 +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +20 +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +48 +A8 +90 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 1 +BITMAP +20 +20 +00 +F8 +00 +20 +20 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -1 +BITMAP +08 +70 +98 +A8 +A8 +A8 +C8 +70 +80 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +40 +20 +00 +88 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +10 +20 +00 +88 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +20 +50 +00 +88 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +50 +00 +88 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +10 +20 +00 +88 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +80 +80 +F0 +88 +88 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +50 +00 +88 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR Amacron +ENCODING 256 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +00 +70 +88 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR amacron +ENCODING 257 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +00 +70 +08 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR Abreve +ENCODING 258 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +88 +70 +00 +70 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR abreve +ENCODING 259 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +88 +70 +00 +70 +08 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR Aogonek +ENCODING 260 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 1 -2 +BITMAP +70 +88 +88 +88 +F8 +88 +88 +88 +88 +10 +0C +ENDCHAR +STARTCHAR aogonek +ENCODING 261 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 1 -2 +BITMAP +70 +08 +08 +78 +88 +88 +78 +10 +0C +ENDCHAR +STARTCHAR Cacute +ENCODING 262 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +20 +78 +80 +80 +80 +80 +80 +80 +80 +78 +ENDCHAR +STARTCHAR cacute +ENCODING 263 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +10 +20 +00 +78 +80 +80 +80 +80 +80 +78 +ENDCHAR +STARTCHAR Ccircumflex +ENCODING 264 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +50 +00 +78 +80 +80 +80 +80 +80 +80 +78 +ENDCHAR +STARTCHAR ccircumflex +ENCODING 265 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +20 +50 +00 +78 +80 +80 +80 +80 +80 +78 +ENDCHAR +STARTCHAR Cdotaccent +ENCODING 266 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +00 +78 +80 +80 +80 +80 +80 +80 +80 +78 +ENDCHAR +STARTCHAR cdotaccent +ENCODING 267 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +20 +00 +78 +80 +80 +80 +80 +80 +78 +ENDCHAR +STARTCHAR Ccaron +ENCODING 268 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +20 +00 +78 +80 +80 +80 +80 +80 +80 +78 +ENDCHAR +STARTCHAR ccaron +ENCODING 269 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +50 +20 +00 +78 +80 +80 +80 +80 +80 +78 +ENDCHAR +STARTCHAR Dcaron +ENCODING 270 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +20 +00 +E0 +90 +88 +88 +88 +88 +90 +E0 +ENDCHAR +STARTCHAR dcaron +ENCODING 271 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +20 +08 +08 +78 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR Dcroat +ENCODING 272 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +70 +48 +44 +44 +E4 +44 +44 +48 +70 +ENDCHAR +STARTCHAR dcroat +ENCODING 273 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +08 +1C +08 +78 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR Emacron +ENCODING 274 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +00 +F8 +80 +80 +80 +F0 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR emacron +ENCODING 275 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +00 +70 +88 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR Ebreve +ENCODING 276 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +88 +70 +00 +F8 +80 +80 +F0 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR ebreve +ENCODING 277 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +88 +70 +00 +70 +88 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR Edotaccent +ENCODING 278 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +00 +F8 +80 +80 +80 +F0 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR edotaccent +ENCODING 279 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +20 +00 +70 +88 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR Eogonek +ENCODING 280 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 1 -2 +BITMAP +F8 +80 +80 +80 +F0 +80 +80 +80 +F8 +10 +0C +ENDCHAR +STARTCHAR eogonek +ENCODING 281 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 1 -2 +BITMAP +70 +88 +88 +F8 +80 +80 +78 +10 +0C +ENDCHAR +STARTCHAR Ecaron +ENCODING 282 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +20 +00 +F8 +80 +80 +F0 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR ecaron +ENCODING 283 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +50 +20 +00 +70 +88 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR Gcircumflex +ENCODING 284 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +50 +00 +78 +80 +80 +98 +88 +88 +88 +70 +ENDCHAR +STARTCHAR gcircumflex +ENCODING 285 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +20 +50 +00 +78 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR Gbreve +ENCODING 286 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +88 +70 +00 +78 +80 +80 +98 +88 +88 +88 +70 +ENDCHAR +STARTCHAR gbreve +ENCODING 287 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +88 +70 +00 +78 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR Gdotaccent +ENCODING 288 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +00 +78 +80 +80 +80 +98 +88 +88 +88 +70 +ENDCHAR +STARTCHAR gdotaccent +ENCODING 289 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +20 +00 +78 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR Gcommaaccent +ENCODING 290 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +78 +80 +80 +80 +98 +88 +88 +88 +70 +20 +C0 +ENDCHAR +STARTCHAR gcommaaccent +ENCODING 291 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +18 +20 +78 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR Hcircumflex +ENCODING 292 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +50 +00 +88 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR hcircumflex +ENCODING 293 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +50 +00 +80 +80 +F0 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Hbar +ENCODING 294 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +44 +FE +44 +44 +7C +44 +44 +44 +44 +ENDCHAR +STARTCHAR hbar +ENCODING 295 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +40 +F0 +40 +78 +44 +44 +44 +44 +44 +ENDCHAR +STARTCHAR Itilde +ENCODING 296 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +48 +A8 +90 +00 +F8 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR itilde +ENCODING 297 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +48 +A8 +90 +00 +60 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Imacron +ENCODING 298 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR imacron +ENCODING 299 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 9 2 0 +BITMAP +E0 +00 +C0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR Ibreve +ENCODING 300 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +88 +70 +00 +F8 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR ibreve +ENCODING 301 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +88 +70 +00 +60 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Iogonek +ENCODING 302 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 11 2 -2 +BITMAP +E0 +40 +40 +40 +40 +40 +40 +40 +E0 +40 +30 +ENDCHAR +STARTCHAR iogonek +ENCODING 303 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 12 2 -2 +BITMAP +40 +40 +00 +C0 +40 +40 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR Idotaccent +ENCODING 304 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR dotlessi +ENCODING 305 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 7 2 0 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR IJ +ENCODING 306 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +EC +44 +44 +44 +44 +44 +44 +44 +F8 +ENDCHAR +STARTCHAR ij +ENCODING 307 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +48 +48 +00 +D8 +48 +48 +48 +48 +48 +48 +08 +30 +ENDCHAR +STARTCHAR Jcircumflex +ENCODING 308 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +28 +00 +38 +10 +10 +10 +10 +10 +10 +E0 +ENDCHAR +STARTCHAR jcircumflex +ENCODING 309 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 12 2 -2 +BITMAP +20 +50 +00 +60 +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR Kcommaaccent +ENCODING 310 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +88 +90 +A0 +C0 +80 +C0 +A0 +90 +88 +20 +C0 +ENDCHAR +STARTCHAR kcommaaccent +ENCODING 311 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +80 +80 +88 +90 +A0 +C0 +A0 +90 +88 +20 +C0 +ENDCHAR +STARTCHAR kgreenlandic +ENCODING 312 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR Lacute +ENCODING 313 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +20 +80 +80 +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR lacute +ENCODING 314 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 11 2 0 +BITMAP +20 +40 +00 +C0 +40 +40 +40 +40 +40 +40 +20 +ENDCHAR +STARTCHAR Lcommaaccent +ENCODING 315 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +F8 +20 +C0 +ENDCHAR +STARTCHAR lcommaaccent +ENCODING 316 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 11 2 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +40 +20 +20 +C0 +ENDCHAR +STARTCHAR Lcaron +ENCODING 317 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +20 +80 +80 +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR lcaron +ENCODING 318 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 11 2 0 +BITMAP +A0 +40 +00 +C0 +40 +40 +40 +40 +40 +40 +20 +ENDCHAR +STARTCHAR Ldot +ENCODING 319 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +80 +80 +80 +B0 +B0 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR ldot +ENCODING 320 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +C0 +40 +40 +58 +58 +40 +40 +40 +20 +ENDCHAR +STARTCHAR Lslash +ENCODING 321 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +40 +40 +40 +60 +C0 +40 +40 +40 +7C +ENDCHAR +STARTCHAR lslash +ENCODING 322 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 9 2 0 +BITMAP +C0 +40 +40 +60 +C0 +40 +40 +40 +20 +ENDCHAR +STARTCHAR Nacute +ENCODING 323 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +20 +88 +C8 +C8 +A8 +A8 +98 +98 +88 +88 +ENDCHAR +STARTCHAR nacute +ENCODING 324 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +10 +20 +00 +F0 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Ncommaaccent +ENCODING 325 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +88 +C8 +C8 +A8 +A8 +98 +98 +88 +88 +20 +C0 +ENDCHAR +STARTCHAR ncommaaccent +ENCODING 326 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +F0 +88 +88 +88 +88 +88 +88 +20 +C0 +ENDCHAR +STARTCHAR Ncaron +ENCODING 327 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +20 +88 +C8 +C8 +A8 +A8 +98 +98 +88 +88 +ENDCHAR +STARTCHAR ncaron +ENCODING 328 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +50 +20 +00 +F0 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR napostrophe +ENCODING 329 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +40 +40 +80 +00 +78 +44 +44 +44 +44 +44 +44 +ENDCHAR +STARTCHAR Eng +ENCODING 330 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +88 +C8 +C8 +A8 +A8 +98 +98 +88 +88 +08 +10 +ENDCHAR +STARTCHAR eng +ENCODING 331 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +F0 +88 +88 +88 +88 +88 +88 +08 +10 +ENDCHAR +STARTCHAR Omacron +ENCODING 332 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +00 +70 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR omacron +ENCODING 333 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Obreve +ENCODING 334 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +88 +70 +00 +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR obreve +ENCODING 335 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +88 +70 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Ohungarumlaut +ENCODING 336 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +48 +90 +00 +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ohungarumlaut +ENCODING 337 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +48 +90 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR OE +ENCODING 338 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +7C +90 +90 +90 +9C +90 +90 +90 +7C +ENDCHAR +STARTCHAR oe +ENCODING 339 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +94 +94 +98 +90 +90 +7C +ENDCHAR +STARTCHAR Racute +ENCODING 340 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +20 +F0 +88 +88 +88 +F0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR racute +ENCODING 341 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +10 +20 +00 +78 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Rcommaaccent +ENCODING 342 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +F0 +88 +88 +88 +F0 +C0 +A0 +90 +88 +20 +C0 +ENDCHAR +STARTCHAR rcommaaccent +ENCODING 343 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +78 +80 +80 +80 +80 +80 +80 +20 +C0 +ENDCHAR +STARTCHAR Rcaron +ENCODING 344 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +20 +00 +F0 +88 +88 +F0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR rcaron +ENCODING 345 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +50 +20 +00 +78 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Sacute +ENCODING 346 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +20 +78 +80 +80 +80 +70 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR sacute +ENCODING 347 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +10 +20 +00 +78 +80 +80 +70 +08 +08 +F0 +ENDCHAR +STARTCHAR Scircumflex +ENCODING 348 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +50 +00 +78 +80 +80 +70 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR scircumflex +ENCODING 349 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +20 +50 +00 +78 +80 +80 +70 +08 +08 +F0 +ENDCHAR +STARTCHAR Scedilla +ENCODING 350 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +78 +80 +80 +80 +70 +08 +08 +08 +F0 +20 +C0 +ENDCHAR +STARTCHAR scedilla +ENCODING 351 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +78 +80 +80 +70 +08 +08 +F0 +20 +C0 +ENDCHAR +STARTCHAR Scaron +ENCODING 352 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +20 +00 +78 +80 +80 +70 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR scaron +ENCODING 353 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +50 +20 +00 +78 +80 +80 +70 +08 +08 +F0 +ENDCHAR +STARTCHAR Tcommaaccent +ENCODING 354 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +20 +10 +60 +ENDCHAR +STARTCHAR tcommaaccent +ENCODING 355 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 11 2 -2 +BITMAP +80 +80 +F0 +80 +80 +80 +80 +80 +70 +20 +C0 +ENDCHAR +STARTCHAR Tcaron +ENCODING 356 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +20 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR tcaron +ENCODING 357 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 11 2 0 +BITMAP +A0 +40 +00 +80 +80 +F0 +80 +80 +80 +80 +70 +ENDCHAR +STARTCHAR Tbar +ENCODING 358 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +20 +20 +70 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR tbar +ENCODING 359 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +40 +40 +78 +40 +E0 +40 +40 +40 +38 +ENDCHAR +STARTCHAR Utilde +ENCODING 360 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +48 +A8 +90 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR utilde +ENCODING 361 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +48 +A8 +90 +00 +88 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR Umacron +ENCODING 362 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +00 +88 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR umacron +ENCODING 363 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +00 +88 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR Ubreve +ENCODING 364 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +88 +70 +00 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ubreve +ENCODING 365 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +88 +70 +00 +88 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR Uring +ENCODING 366 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +50 +20 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uring +ENCODING 367 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +50 +20 +00 +88 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR Uhungarumlaut +ENCODING 368 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +48 +90 +00 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uhungarumlaut +ENCODING 369 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +48 +90 +00 +88 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR Uogonek +ENCODING 370 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +88 +88 +88 +88 +88 +88 +88 +88 +70 +20 +18 +ENDCHAR +STARTCHAR uogonek +ENCODING 371 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 1 -2 +BITMAP +88 +88 +88 +88 +88 +88 +78 +10 +0C +ENDCHAR +STARTCHAR Wcircumflex +ENCODING 372 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +50 +00 +88 +88 +A8 +A8 +D8 +D8 +88 +88 +ENDCHAR +STARTCHAR wcircumflex +ENCODING 373 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +20 +50 +00 +88 +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR Ycircumflex +ENCODING 374 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +50 +00 +88 +88 +50 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR ycircumflex +ENCODING 375 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +20 +50 +00 +88 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR Ydieresis +ENCODING 376 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +00 +88 +88 +50 +50 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Zacute +ENCODING 377 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +20 +F8 +08 +10 +10 +20 +40 +40 +80 +F8 +ENDCHAR +STARTCHAR zacute +ENCODING 378 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +10 +20 +00 +F8 +08 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR Zdotaccent +ENCODING 379 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +00 +F8 +08 +10 +10 +20 +40 +40 +80 +F8 +ENDCHAR +STARTCHAR zdotaccent +ENCODING 380 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +20 +00 +F8 +08 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR Zcaron +ENCODING 381 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +20 +00 +F8 +08 +10 +20 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR zcaron +ENCODING 382 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +50 +20 +00 +F8 +08 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR longs +ENCODING 383 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 9 2 0 +BITMAP +60 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni0180 +ENCODING 384 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +40 +E0 +40 +78 +44 +44 +44 +44 +78 +ENDCHAR +STARTCHAR uni0181 +ENCODING 385 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +A4 +24 +24 +38 +24 +24 +24 +38 +ENDCHAR +STARTCHAR uni0182 +ENCODING 386 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +F0 +80 +80 +F0 +88 +88 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR uni0183 +ENCODING 387 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F0 +80 +F0 +88 +88 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR uni0184 +ENCODING 388 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +40 +C0 +78 +44 +44 +44 +44 +44 +78 +ENDCHAR +STARTCHAR uni0185 +ENCODING 389 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +40 +C0 +40 +78 +44 +44 +44 +78 +ENDCHAR +STARTCHAR uni0186 +ENCODING 390 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F0 +08 +08 +08 +08 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR uni0187 +ENCODING 391 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +0C +10 +78 +80 +80 +80 +80 +80 +80 +80 +78 +ENDCHAR +STARTCHAR uni0188 +ENCODING 392 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +0C +10 +78 +80 +80 +80 +80 +80 +78 +ENDCHAR +STARTCHAR uni0189 +ENCODING 393 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +70 +48 +44 +44 +E4 +44 +44 +48 +70 +ENDCHAR +STARTCHAR uni018A +ENCODING 394 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +70 +A8 +24 +24 +24 +24 +24 +24 +28 +30 +ENDCHAR +STARTCHAR uni018B +ENCODING 395 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +78 +08 +08 +78 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni018C +ENCODING 396 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +78 +08 +78 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni018D +ENCODING 397 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +88 +50 +20 +10 +08 +70 +ENDCHAR +STARTCHAR uni018E +ENCODING 398 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +08 +08 +08 +F8 +08 +08 +08 +F8 +ENDCHAR +STARTCHAR uni018F +ENCODING 399 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F0 +08 +08 +08 +F8 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0190 +ENCODING 400 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +78 +80 +80 +80 +70 +80 +80 +80 +78 +ENDCHAR +STARTCHAR uni0191 +ENCODING 401 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 -1 +BITMAP +7C +40 +40 +40 +7C +40 +40 +40 +40 +80 +ENDCHAR +STARTCHAR florin +ENCODING 402 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +38 +40 +40 +78 +40 +40 +40 +40 +40 +40 +80 +ENDCHAR +STARTCHAR uni0193 +ENCODING 403 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +04 +78 +80 +80 +80 +98 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0194 +ENCODING 404 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +88 +50 +20 +50 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0195 +ENCODING 405 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +80 +80 +C0 +A8 +A8 +A8 +A8 +A8 +90 +ENDCHAR +STARTCHAR uni0196 +ENCODING 406 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +E0 +40 +40 +40 +40 +40 +40 +40 +38 +ENDCHAR +STARTCHAR uni0197 +ENCODING 407 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +20 +20 +20 +70 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni0198 +ENCODING 408 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +0C +10 +88 +90 +A0 +C0 +80 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni0199 +ENCODING 409 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +80 +8C +90 +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni019A +ENCODING 410 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 9 2 0 +BITMAP +C0 +40 +40 +40 +E0 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni019B +ENCODING 411 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +80 +40 +F0 +20 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni019C +ENCODING 412 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +58 +ENDCHAR +STARTCHAR uni019D +ENCODING 413 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +44 +64 +64 +54 +54 +4C +4C +44 +44 +20 +C0 +ENDCHAR +STARTCHAR uni019E +ENCODING 414 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +F0 +88 +88 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni019F +ENCODING 415 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +88 +F8 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Ohorn +ENCODING 416 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +04 +74 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR ohorn +ENCODING 417 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 8 1 0 +BITMAP +04 +74 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01A2 +ENCODING 418 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +64 +9C +94 +94 +94 +94 +94 +94 +64 +ENDCHAR +STARTCHAR uni01A3 +ENCODING 419 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +64 +9C +94 +94 +94 +94 +64 +04 +04 +ENDCHAR +STARTCHAR uni01A4 +ENCODING 420 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +C0 +20 +78 +44 +44 +44 +78 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni01A5 +ENCODING 421 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +C0 +20 +78 +44 +44 +44 +44 +44 +78 +40 +40 +ENDCHAR +STARTCHAR uni01A6 +ENCODING 422 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 -1 +BITMAP +80 +F0 +88 +88 +88 +F0 +C0 +A0 +90 +08 +ENDCHAR +STARTCHAR uni01A7 +ENCODING 423 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F0 +08 +08 +08 +70 +80 +80 +80 +78 +ENDCHAR +STARTCHAR uni01A8 +ENCODING 424 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F0 +08 +08 +70 +80 +80 +78 +ENDCHAR +STARTCHAR uni01A9 +ENCODING 425 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +80 +40 +20 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR uni01AA +ENCODING 426 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +60 +90 +90 +70 +10 +10 +10 +10 +10 +10 +08 +ENDCHAR +STARTCHAR uni01AB +ENCODING 427 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 4 11 2 -2 +BITMAP +80 +80 +F0 +80 +80 +80 +80 +80 +70 +20 +40 +ENDCHAR +STARTCHAR uni01AC +ENCODING 428 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +7C +90 +10 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni01AD +ENCODING 429 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 10 2 0 +BITMAP +40 +80 +80 +F0 +80 +80 +80 +80 +80 +70 +ENDCHAR +STARTCHAR uni01AE +ENCODING 430 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 -1 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR Uhorn +ENCODING 431 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +04 +88 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uhorn +ENCODING 432 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 8 1 0 +BITMAP +04 +88 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni01B1 +ENCODING 433 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +D8 +50 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01B2 +ENCODING 434 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +04 +88 +88 +88 +50 +50 +50 +20 +20 +20 +ENDCHAR +STARTCHAR uni01B3 +ENCODING 435 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +04 +88 +88 +50 +50 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni01B4 +ENCODING 436 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 11 1 -2 +BITMAP +0C +10 +88 +88 +88 +88 +88 +98 +68 +08 +70 +ENDCHAR +STARTCHAR uni01B5 +ENCODING 437 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +08 +10 +10 +F8 +40 +40 +80 +F8 +ENDCHAR +STARTCHAR uni01B6 +ENCODING 438 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F8 +08 +10 +F8 +40 +80 +F8 +ENDCHAR +STARTCHAR uni01B7 +ENCODING 439 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +08 +10 +20 +70 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR uni01B8 +ENCODING 440 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +80 +40 +20 +70 +80 +80 +80 +78 +ENDCHAR +STARTCHAR uni01B9 +ENCODING 441 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +F8 +80 +40 +20 +70 +80 +80 +80 +78 +ENDCHAR +STARTCHAR uni01BA +ENCODING 442 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +7C +04 +04 +18 +04 +04 +78 +80 +60 +ENDCHAR +STARTCHAR uni01BB +ENCODING 443 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F0 +08 +08 +10 +F8 +40 +80 +80 +F8 +ENDCHAR +STARTCHAR uni01BC +ENCODING 444 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +40 +40 +78 +04 +04 +04 +04 +78 +ENDCHAR +STARTCHAR uni01BD +ENCODING 445 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +FC +40 +40 +78 +04 +04 +78 +ENDCHAR +STARTCHAR uni01BE +ENCODING 446 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +80 +F0 +80 +40 +30 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR uni01BF +ENCODING 447 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +F0 +88 +88 +88 +90 +E0 +80 +80 +80 +ENDCHAR +STARTCHAR uni01C0 +ENCODING 448 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 9 3 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni01C1 +ENCODING 449 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 9 2 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni01C2 +ENCODING 450 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +20 +20 +20 +F8 +20 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni01C3 +ENCODING 451 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 9 3 0 +BITMAP +80 +80 +80 +80 +80 +80 +00 +80 +80 +ENDCHAR +STARTCHAR uni01C4 +ENCODING 452 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +14 +08 +DC +A4 +A4 +A8 +A8 +A8 +B0 +B0 +DC +ENDCHAR +STARTCHAR uni01C5 +ENCODING 453 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +14 +C8 +A0 +BC +A4 +A8 +A8 +A8 +B0 +DC +ENDCHAR +STARTCHAR uni01C6 +ENCODING 454 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +14 +28 +20 +7C +A4 +A8 +A8 +A8 +B0 +7C +ENDCHAR +STARTCHAR uni01C7 +ENCODING 455 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +8C +84 +84 +84 +84 +84 +84 +84 +F8 +ENDCHAR +STARTCHAR uni01C8 +ENCODING 456 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +04 +84 +80 +8C +84 +84 +84 +84 +84 +F4 +04 +18 +ENDCHAR +STARTCHAR uni01C9 +ENCODING 457 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +08 +C8 +40 +58 +48 +48 +48 +48 +48 +E8 +08 +30 +ENDCHAR +STARTCHAR uni01CA +ENCODING 458 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +94 +94 +D4 +D4 +B4 +B4 +94 +94 +98 +ENDCHAR +STARTCHAR uni01CB +ENCODING 459 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +04 +94 +90 +D4 +D4 +B4 +B4 +94 +94 +94 +04 +18 +ENDCHAR +STARTCHAR uni01CC +ENCODING 460 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +04 +04 +00 +EC +94 +94 +94 +94 +94 +94 +04 +18 +ENDCHAR +STARTCHAR uni01CD +ENCODING 461 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +20 +00 +70 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni01CE +ENCODING 462 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +50 +20 +00 +70 +08 +78 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni01CF +ENCODING 463 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +20 +00 +F8 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni01D0 +ENCODING 464 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 10 2 0 +BITMAP +A0 +40 +00 +C0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni01D1 +ENCODING 465 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +20 +00 +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D2 +ENCODING 466 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +50 +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D3 +ENCODING 467 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +20 +00 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D4 +ENCODING 468 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +50 +20 +00 +88 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni01D5 +ENCODING 469 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +00 +50 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D6 +ENCODING 470 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +00 +50 +00 +88 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni01D7 +ENCODING 471 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +20 +00 +50 +00 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01D8 +ENCODING 472 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +20 +00 +50 +00 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni01D9 +ENCODING 473 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +20 +00 +50 +00 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01DA +ENCODING 474 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +20 +00 +50 +00 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni01DB +ENCODING 475 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +20 +00 +50 +00 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01DC +ENCODING 476 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +20 +00 +50 +00 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni01DD +ENCODING 477 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F0 +08 +08 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni01DE +ENCODING 478 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +00 +50 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni01DF +ENCODING 479 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +00 +50 +00 +70 +08 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR uni01E0 +ENCODING 480 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +00 +20 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni01E1 +ENCODING 481 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +00 +20 +00 +70 +08 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR uni01E2 +ENCODING 482 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +38 +00 +7C +90 +90 +FC +90 +90 +90 +90 +9C +ENDCHAR +STARTCHAR uni01E3 +ENCODING 483 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +38 +00 +78 +14 +14 +78 +90 +90 +7C +ENDCHAR +STARTCHAR uni01E4 +ENCODING 484 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +78 +80 +80 +80 +98 +88 +9C +88 +70 +ENDCHAR +STARTCHAR uni01E5 +ENCODING 485 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 1 -2 +BITMAP +78 +88 +88 +9C +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR Gcaron +ENCODING 486 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +20 +00 +78 +80 +80 +98 +88 +88 +88 +70 +ENDCHAR +STARTCHAR gcaron +ENCODING 487 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +50 +20 +00 +78 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni01E8 +ENCODING 488 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +20 +88 +90 +A0 +C0 +80 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni01E9 +ENCODING 489 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +20 +80 +80 +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni01EA +ENCODING 490 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +70 +88 +88 +88 +88 +88 +88 +88 +70 +20 +18 +ENDCHAR +STARTCHAR uni01EB +ENCODING 491 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +70 +88 +88 +88 +88 +88 +70 +20 +18 +ENDCHAR +STARTCHAR uni01EC +ENCODING 492 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +70 +00 +70 +88 +88 +88 +88 +88 +88 +88 +70 +20 +18 +ENDCHAR +STARTCHAR uni01ED +ENCODING 493 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +70 +00 +70 +88 +88 +88 +88 +88 +70 +20 +18 +ENDCHAR +STARTCHAR uni01EE +ENCODING 494 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +20 +00 +F8 +08 +10 +30 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR uni01EF +ENCODING 495 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +50 +20 +00 +F8 +08 +10 +20 +70 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR uni01F0 +ENCODING 496 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 12 1 -2 +BITMAP +50 +20 +00 +60 +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni01F1 +ENCODING 497 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +DC +A4 +A4 +A8 +A8 +A8 +B0 +B0 +DC +ENDCHAR +STARTCHAR uni01F2 +ENCODING 498 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C0 +A0 +BC +A4 +A8 +A8 +A8 +B0 +DC +ENDCHAR +STARTCHAR uni01F3 +ENCODING 499 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +20 +20 +7C +A4 +A8 +A8 +A8 +B0 +7C +ENDCHAR +STARTCHAR uni01F4 +ENCODING 500 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +20 +78 +80 +80 +80 +98 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni01F5 +ENCODING 501 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +10 +20 +00 +78 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni01F6 +ENCODING 502 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +A0 +A0 +A0 +A8 +E8 +A8 +A8 +A8 +90 +ENDCHAR +STARTCHAR uni01F7 +ENCODING 503 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +F0 +88 +88 +88 +88 +90 +A0 +C0 +80 +80 +80 +ENDCHAR +STARTCHAR uni01F8 +ENCODING 504 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +20 +88 +C8 +C8 +A8 +A8 +98 +98 +88 +88 +ENDCHAR +STARTCHAR uni01F9 +ENCODING 505 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +40 +20 +00 +F0 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Aringacute +ENCODING 506 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +A8 +50 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR aringacute +ENCODING 507 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +A8 +50 +00 +70 +08 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR AEacute +ENCODING 508 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +08 +10 +00 +7C +90 +90 +FC +90 +90 +90 +9C +ENDCHAR +STARTCHAR aeacute +ENCODING 509 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +08 +10 +00 +78 +14 +14 +7C +90 +90 +7C +ENDCHAR +STARTCHAR Oslashacute +ENCODING 510 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 12 1 -1 +BITMAP +20 +48 +70 +98 +98 +A8 +A8 +A8 +C8 +C8 +70 +80 +ENDCHAR +STARTCHAR oslashacute +ENCODING 511 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -1 +BITMAP +10 +20 +08 +70 +98 +A8 +A8 +A8 +C8 +70 +80 +ENDCHAR +STARTCHAR uni0200 +ENCODING 512 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +90 +48 +00 +70 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni0201 +ENCODING 513 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +90 +48 +00 +70 +08 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR uni0202 +ENCODING 514 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +88 +00 +70 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni0203 +ENCODING 515 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +70 +88 +00 +70 +08 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR uni0204 +ENCODING 516 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +90 +48 +00 +F8 +80 +80 +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni0205 +ENCODING 517 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +90 +48 +00 +70 +88 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR uni0206 +ENCODING 518 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +88 +00 +F8 +80 +80 +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni0207 +ENCODING 519 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +70 +88 +00 +70 +88 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR uni0208 +ENCODING 520 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +90 +48 +00 +F8 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni0209 +ENCODING 521 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +90 +48 +00 +60 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni020A +ENCODING 522 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +88 +00 +F8 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni020B +ENCODING 523 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +70 +88 +00 +60 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni020C +ENCODING 524 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +90 +48 +00 +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni020D +ENCODING 525 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +90 +48 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni020E +ENCODING 526 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +88 +00 +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni020F +ENCODING 527 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +70 +88 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0210 +ENCODING 528 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +90 +48 +00 +F0 +88 +88 +F0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni0211 +ENCODING 529 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +90 +48 +00 +78 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni0212 +ENCODING 530 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +88 +00 +F0 +88 +88 +F0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni0213 +ENCODING 531 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +70 +88 +00 +78 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni0214 +ENCODING 532 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +90 +48 +00 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0215 +ENCODING 533 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +90 +48 +00 +88 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni0216 +ENCODING 534 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +88 +00 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0217 +ENCODING 535 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +70 +88 +00 +88 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR Scommaaccent +ENCODING 536 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +78 +80 +80 +80 +70 +08 +08 +08 +F0 +20 +40 +ENDCHAR +STARTCHAR scommaaccent +ENCODING 537 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +78 +80 +80 +70 +08 +08 +F0 +20 +40 +ENDCHAR +STARTCHAR uni021A +ENCODING 538 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +20 +20 +40 +ENDCHAR +STARTCHAR uni021B +ENCODING 539 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 11 2 -2 +BITMAP +80 +80 +F0 +80 +80 +80 +80 +80 +70 +40 +80 +ENDCHAR +STARTCHAR uni021C +ENCODING 540 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 -1 +BITMAP +F0 +08 +08 +08 +30 +08 +08 +08 +30 +C0 +ENDCHAR +STARTCHAR uni021D +ENCODING 541 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +70 +08 +08 +30 +08 +08 +08 +30 +C0 +ENDCHAR +STARTCHAR uni021E +ENCODING 542 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +20 +00 +88 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni021F +ENCODING 543 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +20 +80 +80 +F0 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni0220 +ENCODING 544 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +F0 +88 +88 +88 +88 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni0221 +ENCODING 545 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +20 +20 +60 +A0 +A0 +A0 +A8 +B4 +78 +10 +10 +ENDCHAR +STARTCHAR uni0222 +ENCODING 546 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +88 +88 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0223 +ENCODING 547 +SWIDTH 583 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +88 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0224 +ENCODING 548 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +F8 +08 +10 +10 +20 +40 +40 +80 +F8 +08 +10 +ENDCHAR +STARTCHAR uni0225 +ENCODING 549 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +F8 +08 +10 +20 +40 +80 +F8 +08 +10 +ENDCHAR +STARTCHAR uni0226 +ENCODING 550 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +00 +70 +88 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni0227 +ENCODING 551 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +20 +00 +70 +08 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR uni0228 +ENCODING 552 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +F8 +80 +80 +80 +F8 +80 +80 +80 +F8 +20 +C0 +ENDCHAR +STARTCHAR uni0229 +ENCODING 553 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +70 +88 +88 +F8 +80 +80 +78 +20 +C0 +ENDCHAR +STARTCHAR uni022A +ENCODING 554 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +00 +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022B +ENCODING 555 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +70 +00 +50 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022C +ENCODING 556 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +00 +68 +B0 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022D +ENCODING 557 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +00 +68 +B0 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022E +ENCODING 558 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +00 +70 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni022F +ENCODING 559 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0230 +ENCODING 560 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +00 +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0231 +ENCODING 561 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +70 +00 +20 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni0232 +ENCODING 562 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +00 +88 +88 +50 +50 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni0233 +ENCODING 563 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +70 +00 +88 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni0234 +ENCODING 564 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +50 +68 +30 +20 +20 +ENDCHAR +STARTCHAR uni0235 +ENCODING 565 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +C0 +A0 +A0 +A0 +A0 +A0 +A8 +B4 +B8 +10 +10 +ENDCHAR +STARTCHAR uni0236 +ENCODING 566 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +80 +80 +F0 +80 +80 +80 +90 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni0237 +ENCODING 567 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 9 1 -2 +BITMAP +60 +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni0238 +ENCODING 568 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +20 +20 +70 +A8 +A8 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni0239 +ENCODING 569 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +70 +A8 +A8 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni023A +ENCODING 570 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -1 +BITMAP +10 +70 +98 +98 +A8 +F8 +A8 +A8 +C8 +C8 +40 +ENDCHAR +STARTCHAR uni023B +ENCODING 571 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -1 +BITMAP +10 +78 +90 +90 +A0 +A0 +A0 +A0 +C0 +78 +40 +ENDCHAR +STARTCHAR uni023C +ENCODING 572 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -1 +BITMAP +10 +78 +90 +A0 +A0 +A0 +C0 +78 +40 +ENDCHAR +STARTCHAR uni023D +ENCODING 573 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +40 +40 +40 +E0 +40 +40 +40 +40 +7C +ENDCHAR +STARTCHAR uni023E +ENCODING 574 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +20 +20 +28 +30 +20 +60 +A0 +20 +ENDCHAR +STARTCHAR uni023F +ENCODING 575 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +78 +80 +80 +70 +08 +08 +F0 +40 +30 +ENDCHAR +STARTCHAR uni0240 +ENCODING 576 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +F8 +08 +10 +20 +40 +80 +80 +40 +30 +ENDCHAR +STARTCHAR uni0241 +ENCODING 577 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 9 2 0 +BITMAP +E0 +10 +10 +20 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni0242 +ENCODING 578 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 7 2 0 +BITMAP +E0 +10 +10 +20 +40 +40 +40 +ENDCHAR +STARTCHAR uni0243 +ENCODING 579 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +44 +44 +44 +78 +44 +E4 +44 +78 +ENDCHAR +STARTCHAR uni0244 +ENCODING 580 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +44 +44 +44 +FE +44 +44 +44 +44 +38 +ENDCHAR +STARTCHAR uni0245 +ENCODING 581 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +20 +20 +20 +50 +50 +50 +88 +88 +88 +ENDCHAR +STARTCHAR uni0246 +ENCODING 582 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -1 +BITMAP +10 +F8 +90 +90 +A0 +F0 +A0 +A0 +C0 +F8 +40 +ENDCHAR +STARTCHAR uni0247 +ENCODING 583 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -1 +BITMAP +10 +70 +98 +A8 +F8 +A0 +C0 +78 +40 +ENDCHAR +STARTCHAR uni0248 +ENCODING 584 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +38 +10 +10 +38 +10 +10 +10 +10 +E0 +ENDCHAR +STARTCHAR uni0249 +ENCODING 585 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 4 12 1 -2 +BITMAP +20 +20 +00 +60 +20 +20 +70 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni024A +ENCODING 586 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 1 -2 +BITMAP +78 +88 +88 +88 +88 +88 +78 +08 +08 +08 +04 +ENDCHAR +STARTCHAR uni024B +ENCODING 587 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 9 1 -2 +BITMAP +78 +88 +88 +88 +88 +78 +08 +08 +04 +ENDCHAR +STARTCHAR uni024C +ENCODING 588 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +44 +44 +44 +F8 +60 +50 +48 +44 +ENDCHAR +STARTCHAR uni024D +ENCODING 589 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +3C +40 +40 +40 +F0 +40 +40 +ENDCHAR +STARTCHAR uni024E +ENCODING 590 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +88 +50 +50 +20 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR uni024F +ENCODING 591 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 -2 +BITMAP +44 +44 +44 +FE +44 +44 +3C +04 +38 +ENDCHAR +STARTCHAR uni0250 +ENCODING 592 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F0 +88 +88 +F0 +80 +80 +70 +ENDCHAR +STARTCHAR uni0251 +ENCODING 593 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +68 +98 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni0252 +ENCODING 594 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +B0 +C8 +88 +88 +88 +C8 +B0 +ENDCHAR +STARTCHAR uni0253 +ENCODING 595 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +60 +80 +80 +80 +F0 +88 +88 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR uni0254 +ENCODING 596 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F0 +08 +08 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR uni0255 +ENCODING 597 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +78 +80 +80 +80 +90 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni0256 +ENCODING 598 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 11 1 -2 +BITMAP +08 +08 +78 +88 +88 +88 +88 +88 +78 +08 +04 +ENDCHAR +STARTCHAR uni0257 +ENCODING 599 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +04 +08 +08 +08 +78 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni0258 +ENCODING 600 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +70 +88 +88 +F8 +08 +08 +F0 +ENDCHAR +STARTCHAR uni0259 +ENCODING 601 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F0 +08 +08 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni025A +ENCODING 602 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 1 0 +BITMAP +E8 +14 +30 +48 +88 +88 +70 +ENDCHAR +STARTCHAR uni025B +ENCODING 603 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +78 +80 +80 +70 +80 +80 +78 +ENDCHAR +STARTCHAR uni025C +ENCODING 604 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F0 +08 +08 +70 +08 +08 +F0 +ENDCHAR +STARTCHAR uni025D +ENCODING 605 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 1 0 +BITMAP +E8 +14 +10 +60 +10 +10 +E0 +ENDCHAR +STARTCHAR uni025E +ENCODING 606 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +70 +88 +88 +B0 +88 +88 +70 +ENDCHAR +STARTCHAR uni025F +ENCODING 607 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 4 9 2 -2 +BITMAP +60 +20 +20 +70 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni0260 +ENCODING 608 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 10 1 -2 +BITMAP +04 +78 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni0261 +ENCODING 609 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +78 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni0262 +ENCODING 610 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +78 +80 +80 +98 +88 +88 +70 +ENDCHAR +STARTCHAR uni0263 +ENCODING 611 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +50 +20 +50 +88 +88 +70 +ENDCHAR +STARTCHAR uni0264 +ENCODING 612 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 6 2 1 +BITMAP +A0 +40 +A0 +A0 +A0 +40 +ENDCHAR +STARTCHAR uni0265 +ENCODING 613 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +88 +88 +88 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni0266 +ENCODING 614 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +60 +80 +80 +80 +F0 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni0267 +ENCODING 615 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +60 +80 +80 +80 +F0 +88 +88 +88 +88 +88 +88 +08 +30 +ENDCHAR +STARTCHAR uni0268 +ENCODING 616 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 3 10 2 0 +BITMAP +40 +40 +00 +C0 +40 +40 +E0 +40 +40 +40 +ENDCHAR +STARTCHAR uni0269 +ENCODING 617 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +E0 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni026A +ENCODING 618 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F8 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni026B +ENCODING 619 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +60 +20 +20 +68 +A8 +B0 +20 +20 +10 +ENDCHAR +STARTCHAR uni026C +ENCODING 620 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +60 +20 +20 +60 +A0 +78 +20 +20 +10 +ENDCHAR +STARTCHAR uni026D +ENCODING 621 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 4 11 2 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR uni026E +ENCODING 622 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +C0 +40 +7C +44 +48 +50 +48 +44 +44 +04 +38 +ENDCHAR +STARTCHAR uni026F +ENCODING 623 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +58 +ENDCHAR +STARTCHAR uni0270 +ENCODING 624 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +58 +08 +08 +ENDCHAR +STARTCHAR uni0271 +ENCODING 625 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +F0 +A8 +A8 +A8 +A8 +A8 +A8 +08 +30 +ENDCHAR +STARTCHAR uni0272 +ENCODING 626 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +78 +44 +44 +44 +44 +44 +44 +40 +80 +ENDCHAR +STARTCHAR uni0273 +ENCODING 627 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 9 1 -2 +BITMAP +F0 +88 +88 +88 +88 +88 +88 +08 +04 +ENDCHAR +STARTCHAR uni0274 +ENCODING 628 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +C8 +C8 +A8 +98 +98 +88 +ENDCHAR +STARTCHAR uni0275 +ENCODING 629 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni0276 +ENCODING 630 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +7C +90 +90 +9C +90 +90 +7C +ENDCHAR +STARTCHAR uni0277 +ENCODING 631 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +70 +88 +A8 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni0278 +ENCODING 632 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +20 +20 +70 +A8 +A8 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni0279 +ENCODING 633 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +08 +08 +08 +08 +08 +18 +E8 +ENDCHAR +STARTCHAR uni027A +ENCODING 634 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +08 +08 +08 +08 +08 +08 +08 +18 +E8 +ENDCHAR +STARTCHAR uni027B +ENCODING 635 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 9 1 -2 +BITMAP +08 +08 +08 +08 +08 +18 +E8 +08 +04 +ENDCHAR +STARTCHAR uni027C +ENCODING 636 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +78 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni027D +ENCODING 637 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +78 +80 +80 +80 +80 +80 +80 +80 +60 +ENDCHAR +STARTCHAR uni027E +ENCODING 638 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +18 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni027F +ENCODING 639 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +C0 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni0280 +ENCODING 640 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F0 +88 +88 +F0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni0281 +ENCODING 641 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +90 +A0 +F0 +88 +88 +F0 +ENDCHAR +STARTCHAR uni0282 +ENCODING 642 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +78 +80 +80 +70 +08 +08 +F0 +80 +60 +ENDCHAR +STARTCHAR uni0283 +ENCODING 643 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +18 +20 +20 +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni0284 +ENCODING 644 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 10 2 -2 +BITMAP +10 +60 +20 +20 +F0 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni0285 +ENCODING 645 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +C0 +20 +20 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni0286 +ENCODING 646 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +18 +20 +20 +20 +20 +20 +20 +20 +78 +A0 +40 +ENDCHAR +STARTCHAR uni0287 +ENCODING 647 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 9 1 -2 +BITMAP +E0 +10 +10 +10 +10 +10 +F0 +10 +10 +ENDCHAR +STARTCHAR uni0288 +ENCODING 648 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 11 2 -2 +BITMAP +80 +80 +F0 +80 +80 +80 +80 +80 +80 +80 +70 +ENDCHAR +STARTCHAR uni0289 +ENCODING 649 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +44 +44 +44 +FE +44 +44 +3C +ENDCHAR +STARTCHAR uni028A +ENCODING 650 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +D8 +50 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni028B +ENCODING 651 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 8 1 0 +BITMAP +04 +88 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni028C +ENCODING 652 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +20 +20 +50 +50 +88 +88 +88 +ENDCHAR +STARTCHAR uni028D +ENCODING 653 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +50 +A8 +A8 +A8 +88 +88 +88 +ENDCHAR +STARTCHAR uni028E +ENCODING 654 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +70 +80 +F0 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni028F +ENCODING 655 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +88 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni0290 +ENCODING 656 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 9 1 -2 +BITMAP +F8 +08 +10 +20 +40 +80 +F8 +10 +0C +ENDCHAR +STARTCHAR uni0291 +ENCODING 657 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 1 -2 +BITMAP +F8 +08 +10 +20 +58 +A4 +F8 +20 +20 +ENDCHAR +STARTCHAR uni0292 +ENCODING 658 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +F8 +08 +10 +20 +70 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR uni0293 +ENCODING 659 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 1 -2 +BITMAP +F8 +08 +10 +20 +70 +08 +78 +88 +74 +ENDCHAR +STARTCHAR uni0294 +ENCODING 660 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F0 +08 +08 +10 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni0295 +ENCODING 661 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +78 +80 +80 +40 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni0296 +ENCODING 662 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +20 +20 +20 +20 +10 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR uni0297 +ENCODING 663 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +78 +80 +80 +80 +80 +80 +80 +80 +78 +ENDCHAR +STARTCHAR uni0298 +ENCODING 664 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +70 +88 +88 +A8 +88 +88 +70 +ENDCHAR +STARTCHAR uni0299 +ENCODING 665 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F0 +88 +88 +F0 +88 +88 +F0 +ENDCHAR +STARTCHAR uni029A +ENCODING 666 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +70 +88 +88 +68 +88 +88 +70 +ENDCHAR +STARTCHAR uni029B +ENCODING 667 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +18 +20 +78 +80 +80 +98 +88 +88 +70 +ENDCHAR +STARTCHAR uni029C +ENCODING 668 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni029D +ENCODING 669 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +10 +10 +00 +30 +10 +10 +10 +10 +10 +78 +90 +60 +ENDCHAR +STARTCHAR uni029E +ENCODING 670 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +48 +28 +18 +28 +48 +88 +08 +08 +ENDCHAR +STARTCHAR uni029F +ENCODING 671 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni02A0 +ENCODING 672 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 11 1 -2 +BITMAP +04 +08 +78 +88 +88 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni02A1 +ENCODING 673 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F0 +08 +08 +10 +20 +20 +70 +20 +20 +ENDCHAR +STARTCHAR uni02A2 +ENCODING 674 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +78 +80 +80 +40 +20 +20 +70 +20 +20 +ENDCHAR +STARTCHAR uni02A3 +ENCODING 675 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +20 +20 +7C +A4 +A8 +A8 +A8 +B0 +7C +ENDCHAR +STARTCHAR uni02A4 +ENCODING 676 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +20 +20 +7C +A4 +A4 +A8 +A4 +A4 +64 +04 +18 +ENDCHAR +STARTCHAR uni02A5 +ENCODING 677 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 10 0 -1 +BITMAP +20 +20 +7C +A4 +A8 +A8 +AC +BA +7C +08 +ENDCHAR +STARTCHAR uni02A6 +ENCODING 678 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +80 +80 +EC +90 +90 +88 +84 +84 +78 +ENDCHAR +STARTCHAR uni02A7 +ENCODING 679 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +84 +88 +E8 +88 +88 +88 +88 +88 +78 +08 +10 +ENDCHAR +STARTCHAR uni02A8 +ENCODING 680 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +80 +80 +EC +90 +90 +90 +98 +94 +78 +10 +10 +ENDCHAR +STARTCHAR uni02A9 +ENCODING 681 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +60 +80 +B8 +E4 +A4 +A4 +A4 +A4 +A4 +04 +08 +ENDCHAR +STARTCHAR uni02AA +ENCODING 682 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C0 +40 +4C +50 +50 +48 +44 +44 +F8 +ENDCHAR +STARTCHAR uni02AB +ENCODING 683 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C0 +40 +5C +44 +48 +48 +48 +50 +3C +ENDCHAR +STARTCHAR uni02AC +ENCODING 684 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +88 +88 +A8 +D8 +88 +00 +88 +88 +A8 +D8 +88 +ENDCHAR +STARTCHAR uni02AD +ENCODING 685 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +F8 +88 +88 +88 +88 +00 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni02AE +ENCODING 686 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +80 +44 +44 +44 +44 +44 +44 +3C +04 +04 +ENDCHAR +STARTCHAR uni02AF +ENCODING 687 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 12 0 -2 +BITMAP +80 +44 +44 +44 +44 +44 +44 +3C +04 +04 +04 +02 +ENDCHAR +STARTCHAR uni02BB +ENCODING 699 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 2 2 9 +BITMAP +40 +80 +ENDCHAR +STARTCHAR afii57929 +ENCODING 700 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 2 3 9 +BITMAP +40 +80 +ENDCHAR +STARTCHAR afii64937 +ENCODING 701 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 2 2 9 +BITMAP +80 +40 +ENDCHAR +STARTCHAR circumflex +ENCODING 710 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 2 2 9 +BITMAP +40 +A0 +ENDCHAR +STARTCHAR caron +ENCODING 711 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 2 2 9 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR breve +ENCODING 728 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 2 1 9 +BITMAP +88 +70 +ENDCHAR +STARTCHAR dotaccent +ENCODING 729 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 2 3 9 +BITMAP +80 +80 +ENDCHAR +STARTCHAR ring +ENCODING 730 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 3 2 8 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR ogonek +ENCODING 731 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 3 2 -2 +BITMAP +40 +80 +60 +ENDCHAR +STARTCHAR tilde +ENCODING 732 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 3 1 8 +BITMAP +48 +A8 +90 +ENDCHAR +STARTCHAR hungarumlaut +ENCODING 733 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 2 1 9 +BITMAP +48 +90 +ENDCHAR +STARTCHAR gravecomb +ENCODING 768 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 2 2 9 +BITMAP +80 +40 +ENDCHAR +STARTCHAR acutecomb +ENCODING 769 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 2 3 9 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0302 +ENCODING 770 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 2 2 9 +BITMAP +40 +A0 +ENDCHAR +STARTCHAR tildecomb +ENCODING 771 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 3 1 8 +BITMAP +48 +A8 +90 +ENDCHAR +STARTCHAR uni0306 +ENCODING 774 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 2 1 9 +BITMAP +88 +70 +ENDCHAR +STARTCHAR uni0307 +ENCODING 775 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 1 3 10 +BITMAP +80 +ENDCHAR +STARTCHAR uni0308 +ENCODING 776 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 1 2 10 +BITMAP +A0 +ENDCHAR +STARTCHAR uni030C +ENCODING 780 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 2 2 9 +BITMAP +A0 +40 +ENDCHAR +STARTCHAR uni0329 +ENCODING 809 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 2 2 -1 +BITMAP +80 +80 +ENDCHAR +STARTCHAR uni0370 +ENCODING 880 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +80 +80 +80 +80 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni0371 +ENCODING 881 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +80 +80 +80 +F8 +80 +80 +80 +ENDCHAR +STARTCHAR uni0372 +ENCODING 882 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +A8 +A8 +A8 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni0373 +ENCODING 883 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F8 +A8 +A8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni0374 +ENCODING 884 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 2 3 2 8 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR uni0375 +ENCODING 885 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 2 3 2 -2 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR uni0376 +ENCODING 886 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +98 +98 +A8 +A8 +C8 +C8 +88 +88 +ENDCHAR +STARTCHAR uni0377 +ENCODING 887 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +98 +98 +A8 +C8 +C8 +88 +ENDCHAR +STARTCHAR uni037B +ENCODING 891 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F0 +08 +08 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR uni037C +ENCODING 892 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +78 +80 +80 +90 +80 +80 +78 +ENDCHAR +STARTCHAR uni037D +ENCODING 893 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F0 +08 +08 +48 +08 +08 +F0 +ENDCHAR +STARTCHAR uni037E +ENCODING 894 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 2 8 2 -2 +BITMAP +40 +40 +00 +00 +40 +40 +40 +80 +ENDCHAR +STARTCHAR tonos +ENCODING 900 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 2 0 10 +BITMAP +40 +80 +ENDCHAR +STARTCHAR dieresistonos +ENCODING 901 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 3 1 8 +BITMAP +90 +20 +48 +ENDCHAR +STARTCHAR Alphatonos +ENCODING 902 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +40 +80 +38 +44 +44 +44 +7C +44 +44 +44 +44 +ENDCHAR +STARTCHAR anoteleia +ENCODING 903 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 2 3 4 +BITMAP +80 +80 +ENDCHAR +STARTCHAR Epsilontonos +ENCODING 904 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +40 +80 +7C +40 +40 +40 +7C +40 +40 +40 +7C +ENDCHAR +STARTCHAR Etatonos +ENCODING 905 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +40 +80 +44 +44 +44 +44 +7C +44 +44 +44 +44 +ENDCHAR +STARTCHAR Iotatonos +ENCODING 906 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 0 0 +BITMAP +40 +80 +38 +10 +10 +10 +10 +10 +10 +10 +38 +ENDCHAR +STARTCHAR Omicrontonos +ENCODING 908 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +40 +80 +38 +44 +44 +44 +44 +44 +44 +44 +38 +ENDCHAR +STARTCHAR Upsilontonos +ENCODING 910 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +40 +80 +44 +44 +28 +28 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR Omegatonos +ENCODING 911 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +40 +80 +38 +44 +44 +44 +44 +44 +28 +28 +6C +ENDCHAR +STARTCHAR iotadieresistonos +ENCODING 912 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +90 +20 +48 +00 +60 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR Alpha +ENCODING 913 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Beta +ENCODING 914 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F0 +88 +88 +88 +F0 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR Gamma +ENCODING 915 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Delta +ENCODING 916 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +20 +20 +20 +50 +50 +50 +88 +88 +F8 +ENDCHAR +STARTCHAR Epsilon +ENCODING 917 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +80 +80 +80 +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR Zeta +ENCODING 918 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +08 +10 +10 +20 +40 +40 +80 +F8 +ENDCHAR +STARTCHAR Eta +ENCODING 919 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +88 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Theta +ENCODING 920 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +A8 +A8 +A8 +88 +88 +70 +ENDCHAR +STARTCHAR Iota +ENCODING 921 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR Kappa +ENCODING 922 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +90 +A0 +C0 +80 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR Lambda +ENCODING 923 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +20 +20 +20 +50 +50 +50 +88 +88 +88 +ENDCHAR +STARTCHAR Mu +ENCODING 924 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +88 +D8 +D8 +A8 +A8 +88 +88 +88 +ENDCHAR +STARTCHAR Nu +ENCODING 925 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +C8 +C8 +A8 +A8 +98 +98 +88 +88 +ENDCHAR +STARTCHAR Xi +ENCODING 926 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +00 +00 +00 +70 +00 +00 +00 +F8 +ENDCHAR +STARTCHAR Omicron +ENCODING 927 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR Pi +ENCODING 928 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR Rho +ENCODING 929 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F0 +88 +88 +88 +F0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Sigma +ENCODING 931 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +80 +40 +20 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR Tau +ENCODING 932 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Upsilon +ENCODING 933 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +88 +50 +50 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR Phi +ENCODING 934 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +20 +70 +A8 +A8 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR Chi +ENCODING 935 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +88 +50 +50 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR Psi +ENCODING 936 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR Omega +ENCODING 937 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +88 +88 +88 +50 +50 +D8 +ENDCHAR +STARTCHAR Iotadieresis +ENCODING 938 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR Upsilondieresis +ENCODING 939 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +00 +88 +88 +50 +50 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR alphatonos +ENCODING 940 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +10 +20 +00 +68 +98 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR epsilontonos +ENCODING 941 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +10 +20 +00 +78 +80 +80 +70 +80 +80 +78 +ENDCHAR +STARTCHAR etatonos +ENCODING 942 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +10 +20 +00 +F0 +88 +88 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR iotatonos +ENCODING 943 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 10 2 0 +BITMAP +20 +40 +00 +C0 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR upsilondieresistonos +ENCODING 944 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +90 +20 +48 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR alpha +ENCODING 945 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +68 +98 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR beta +ENCODING 946 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +60 +90 +90 +E0 +90 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR gamma +ENCODING 947 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +88 +88 +88 +50 +50 +20 +20 +40 +40 +ENDCHAR +STARTCHAR delta +ENCODING 948 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +80 +60 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR epsilon +ENCODING 949 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +78 +80 +80 +70 +80 +80 +78 +ENDCHAR +STARTCHAR zeta +ENCODING 950 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +F8 +10 +20 +40 +80 +80 +80 +80 +70 +08 +10 +ENDCHAR +STARTCHAR eta +ENCODING 951 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +F0 +88 +88 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR theta +ENCODING 952 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 9 1 0 +BITMAP +60 +90 +90 +90 +F0 +90 +90 +90 +60 +ENDCHAR +STARTCHAR iota +ENCODING 953 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 7 2 0 +BITMAP +C0 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR kappa +ENCODING 954 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR lambda +ENCODING 955 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +40 +40 +20 +20 +50 +50 +88 +88 +88 +ENDCHAR +STARTCHAR mu +ENCODING 956 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +88 +88 +88 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR nu +ENCODING 957 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR xi +ENCODING 958 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +78 +80 +80 +80 +70 +80 +80 +80 +70 +08 +30 +ENDCHAR +STARTCHAR omicron +ENCODING 959 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR pi +ENCODING 960 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR rho +ENCODING 961 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +70 +88 +88 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR sigma1 +ENCODING 962 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +78 +80 +80 +80 +80 +80 +70 +08 +30 +ENDCHAR +STARTCHAR sigma +ENCODING 963 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 1 0 +BITMAP +7C +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR tau +ENCODING 964 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F8 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR upsilon +ENCODING 965 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR phi +ENCODING 966 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +10 +A8 +A8 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR chi +ENCODING 967 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR psi +ENCODING 968 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR omega +ENCODING 969 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +50 +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR iotadieresis +ENCODING 970 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 9 2 0 +BITMAP +A0 +00 +C0 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR upsilondieresis +ENCODING 971 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +50 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR omicrontonos +ENCODING 972 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +10 +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR upsilontonos +ENCODING 973 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +10 +20 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR omegatonos +ENCODING 974 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +10 +20 +00 +50 +88 +A8 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni03CF +ENCODING 975 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +88 +90 +A0 +C0 +80 +C0 +A0 +90 +88 +08 +10 +ENDCHAR +STARTCHAR uni03D0 +ENCODING 976 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +88 +F0 +88 +88 +88 +70 +ENDCHAR +STARTCHAR theta1 +ENCODING 977 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 9 1 0 +BITMAP +60 +90 +90 +90 +F0 +90 +90 +90 +60 +ENDCHAR +STARTCHAR Upsilon1 +ENCODING 978 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +50 +50 +50 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni03D3 +ENCODING 979 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +40 +80 +04 +48 +28 +28 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni03D4 +ENCODING 980 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +00 +88 +50 +50 +50 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR phi1 +ENCODING 981 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR omega1 +ENCODING 982 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F8 +50 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni03D7 +ENCODING 983 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +08 +10 +ENDCHAR +STARTCHAR uni03D8 +ENCODING 984 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +70 +88 +88 +88 +88 +88 +88 +88 +70 +20 +20 +ENDCHAR +STARTCHAR uni03D9 +ENCODING 985 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +70 +88 +88 +88 +88 +88 +70 +20 +20 +ENDCHAR +STARTCHAR uni03DA +ENCODING 986 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +78 +80 +80 +80 +80 +80 +80 +80 +70 +08 +30 +ENDCHAR +STARTCHAR uni03DB +ENCODING 987 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +78 +80 +80 +80 +80 +80 +70 +08 +30 +ENDCHAR +STARTCHAR uni03DC +ENCODING 988 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +80 +80 +80 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni03DD +ENCODING 989 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +18 +20 +20 +20 +38 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni03DE +ENCODING 990 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +80 +40 +48 +58 +A8 +D0 +90 +10 +08 +ENDCHAR +STARTCHAR uni03DF +ENCODING 991 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +40 +40 +80 +80 +F8 +08 +08 +10 +10 +ENDCHAR +STARTCHAR uni03E0 +ENCODING 992 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +F0 +48 +48 +48 +18 +28 +28 +28 +28 +08 +10 +ENDCHAR +STARTCHAR uni03E1 +ENCODING 993 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +C0 +20 +10 +30 +48 +98 +28 +08 +08 +ENDCHAR +STARTCHAR uni03E2 +ENCODING 994 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +88 +88 +A8 +A8 +A8 +A8 +A8 +A8 +58 +08 +30 +ENDCHAR +STARTCHAR uni03E3 +ENCODING 995 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +88 +88 +88 +A8 +A8 +A8 +58 +08 +30 +ENDCHAR +STARTCHAR uni03E4 +ENCODING 996 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +88 +88 +88 +88 +88 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni03E5 +ENCODING 997 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +88 +88 +88 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni03E6 +ENCODING 998 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +80 +80 +F0 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni03E7 +ENCODING 999 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +60 +90 +90 +78 +10 +10 +E0 +ENDCHAR +STARTCHAR uni03E8 +ENCODING 1000 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +F0 +08 +08 +08 +10 +20 +40 +80 +80 +40 +38 +ENDCHAR +STARTCHAR uni03E9 +ENCODING 1001 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +F0 +08 +08 +10 +20 +40 +80 +40 +38 +ENDCHAR +STARTCHAR uni03EA +ENCODING 1002 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +88 +88 +50 +20 +50 +88 +88 +F8 +ENDCHAR +STARTCHAR uni03EB +ENCODING 1003 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +88 +50 +20 +50 +88 +F8 +ENDCHAR +STARTCHAR uni03EC +ENCODING 1004 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +78 +80 +80 +F0 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni03ED +ENCODING 1005 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 9 1 0 +BITMAP +70 +80 +80 +E0 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uni03EE +ENCODING 1006 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +20 +20 +F8 +A8 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni03EF +ENCODING 1007 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +20 +20 +F8 +A8 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni03F0 +ENCODING 1008 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni03F1 +ENCODING 1009 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +70 +88 +88 +88 +88 +88 +F0 +80 +78 +ENDCHAR +STARTCHAR uni03F2 +ENCODING 1010 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +78 +80 +80 +80 +80 +80 +78 +ENDCHAR +STARTCHAR uni03F3 +ENCODING 1011 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 12 2 -2 +BITMAP +20 +20 +00 +60 +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni03F4 +ENCODING 1012 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +88 +F8 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni03F5 +ENCODING 1013 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +78 +80 +80 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR uni03F6 +ENCODING 1014 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F0 +08 +08 +F8 +08 +08 +F0 +ENDCHAR +STARTCHAR uni03F7 +ENCODING 1015 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +80 +80 +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR uni03F8 +ENCODING 1016 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +80 +80 +F0 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR uni03F9 +ENCODING 1017 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +78 +80 +80 +80 +80 +80 +80 +80 +78 +ENDCHAR +STARTCHAR uni03FA +ENCODING 1018 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +88 +D8 +D8 +A8 +A8 +88 +88 +88 +ENDCHAR +STARTCHAR uni03FB +ENCODING 1019 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +88 +D8 +A8 +A8 +88 +88 +88 +80 +80 +ENDCHAR +STARTCHAR uni03FC +ENCODING 1020 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +38 +44 +44 +44 +44 +78 +40 +E0 +40 +ENDCHAR +STARTCHAR uni03FD +ENCODING 1021 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F0 +08 +08 +08 +08 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR uni03FE +ENCODING 1022 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +78 +80 +80 +80 +90 +80 +80 +80 +78 +ENDCHAR +STARTCHAR uni03FF +ENCODING 1023 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F0 +08 +08 +08 +48 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR uni0400 +ENCODING 1024 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +20 +F8 +80 +80 +80 +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR afii10023 +ENCODING 1025 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +00 +F8 +80 +80 +80 +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR afii10051 +ENCODING 1026 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +E0 +40 +40 +78 +44 +44 +44 +44 +44 +04 +08 +ENDCHAR +STARTCHAR afii10052 +ENCODING 1027 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +20 +F8 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10053 +ENCODING 1028 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +78 +80 +80 +80 +F0 +80 +80 +80 +78 +ENDCHAR +STARTCHAR afii10054 +ENCODING 1029 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +78 +80 +80 +80 +70 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR afii10055 +ENCODING 1030 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR afii10056 +ENCODING 1031 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR afii10057 +ENCODING 1032 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +38 +10 +10 +10 +10 +10 +10 +10 +E0 +ENDCHAR +STARTCHAR afii10058 +ENCODING 1033 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +70 +50 +50 +50 +58 +54 +54 +54 +98 +ENDCHAR +STARTCHAR afii10059 +ENCODING 1034 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +90 +90 +90 +90 +F8 +94 +94 +94 +98 +ENDCHAR +STARTCHAR afii10060 +ENCODING 1035 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +E0 +40 +40 +78 +44 +44 +44 +44 +44 +ENDCHAR +STARTCHAR afii10061 +ENCODING 1036 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +20 +88 +90 +A0 +C0 +80 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni040D +ENCODING 1037 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +20 +88 +98 +98 +A8 +A8 +C8 +C8 +88 +88 +ENDCHAR +STARTCHAR afii10062 +ENCODING 1038 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +88 +70 +00 +88 +88 +88 +88 +98 +68 +08 +70 +ENDCHAR +STARTCHAR afii10145 +ENCODING 1039 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +88 +88 +88 +88 +88 +88 +88 +88 +F8 +20 +20 +ENDCHAR +STARTCHAR afii10017 +ENCODING 1040 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR afii10018 +ENCODING 1041 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F0 +80 +80 +80 +F0 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR afii10019 +ENCODING 1042 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F0 +88 +88 +88 +F0 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR afii10020 +ENCODING 1043 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10021 +ENCODING 1044 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +38 +28 +28 +28 +28 +48 +48 +88 +FC +84 +84 +ENDCHAR +STARTCHAR afii10022 +ENCODING 1045 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +80 +80 +80 +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR afii10024 +ENCODING 1046 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +A8 +A8 +A8 +A8 +70 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR afii10025 +ENCODING 1047 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F0 +08 +08 +08 +70 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR afii10026 +ENCODING 1048 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +98 +98 +A8 +A8 +C8 +C8 +88 +88 +ENDCHAR +STARTCHAR afii10027 +ENCODING 1049 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +88 +70 +00 +88 +98 +98 +A8 +A8 +C8 +C8 +88 +ENDCHAR +STARTCHAR afii10028 +ENCODING 1050 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +90 +A0 +C0 +80 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR afii10029 +ENCODING 1051 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +7C +44 +44 +44 +44 +44 +44 +44 +84 +ENDCHAR +STARTCHAR afii10030 +ENCODING 1052 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +D8 +A8 +A8 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR afii10031 +ENCODING 1053 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +88 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR afii10032 +ENCODING 1054 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR afii10033 +ENCODING 1055 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR afii10034 +ENCODING 1056 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F0 +88 +88 +88 +F0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10035 +ENCODING 1057 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +78 +80 +80 +80 +80 +80 +80 +80 +78 +ENDCHAR +STARTCHAR afii10036 +ENCODING 1058 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR afii10037 +ENCODING 1059 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR afii10038 +ENCODING 1060 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -1 +BITMAP +20 +70 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR afii10039 +ENCODING 1061 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +88 +88 +50 +20 +50 +88 +88 +88 +ENDCHAR +STARTCHAR afii10040 +ENCODING 1062 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 1 -2 +BITMAP +88 +88 +88 +88 +88 +88 +88 +88 +FC +04 +04 +ENDCHAR +STARTCHAR afii10041 +ENCODING 1063 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +88 +88 +88 +78 +08 +08 +08 +08 +ENDCHAR +STARTCHAR afii10042 +ENCODING 1064 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR afii10043 +ENCODING 1065 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 1 -2 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +FC +04 +04 +ENDCHAR +STARTCHAR afii10044 +ENCODING 1066 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C0 +40 +78 +44 +44 +44 +44 +44 +78 +ENDCHAR +STARTCHAR afii10045 +ENCODING 1067 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +98 +88 +C8 +A8 +A8 +A8 +A8 +A8 +C8 +ENDCHAR +STARTCHAR afii10046 +ENCODING 1068 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +80 +80 +F0 +88 +88 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR afii10047 +ENCODING 1069 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F0 +08 +08 +08 +78 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR afii10048 +ENCODING 1070 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +98 +A4 +A4 +A4 +E4 +A4 +A4 +A4 +98 +ENDCHAR +STARTCHAR afii10049 +ENCODING 1071 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +78 +88 +88 +88 +78 +18 +28 +48 +88 +ENDCHAR +STARTCHAR afii10065 +ENCODING 1072 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +70 +08 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR afii10066 +ENCODING 1073 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +80 +F0 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR afii10067 +ENCODING 1074 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F0 +88 +88 +F0 +88 +88 +F0 +ENDCHAR +STARTCHAR afii10068 +ENCODING 1075 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F8 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10069 +ENCODING 1076 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +38 +28 +28 +28 +48 +48 +FC +84 +84 +ENDCHAR +STARTCHAR afii10070 +ENCODING 1077 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +70 +88 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR afii10072 +ENCODING 1078 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +A8 +A8 +A8 +70 +A8 +A8 +A8 +ENDCHAR +STARTCHAR afii10073 +ENCODING 1079 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F0 +08 +08 +70 +08 +08 +F0 +ENDCHAR +STARTCHAR afii10074 +ENCODING 1080 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +98 +98 +A8 +C8 +C8 +88 +ENDCHAR +STARTCHAR afii10075 +ENCODING 1081 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +88 +70 +00 +88 +98 +98 +A8 +C8 +C8 +88 +ENDCHAR +STARTCHAR afii10076 +ENCODING 1082 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR afii10077 +ENCODING 1083 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +78 +48 +48 +48 +48 +48 +88 +ENDCHAR +STARTCHAR afii10078 +ENCODING 1084 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +D8 +A8 +A8 +88 +88 +88 +ENDCHAR +STARTCHAR afii10079 +ENCODING 1085 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR afii10080 +ENCODING 1086 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR afii10081 +ENCODING 1087 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR afii10082 +ENCODING 1088 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +F0 +88 +88 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR afii10083 +ENCODING 1089 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +78 +80 +80 +80 +80 +80 +78 +ENDCHAR +STARTCHAR afii10084 +ENCODING 1090 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR afii10085 +ENCODING 1091 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +88 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR afii10086 +ENCODING 1092 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -1 +BITMAP +20 +70 +A8 +A8 +A8 +A8 +A8 +70 +20 +ENDCHAR +STARTCHAR afii10087 +ENCODING 1093 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR afii10088 +ENCODING 1094 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 1 -2 +BITMAP +88 +88 +88 +88 +88 +88 +FC +04 +04 +ENDCHAR +STARTCHAR afii10089 +ENCODING 1095 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +88 +88 +78 +08 +08 +08 +ENDCHAR +STARTCHAR afii10090 +ENCODING 1096 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +F8 +ENDCHAR +STARTCHAR afii10091 +ENCODING 1097 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 8 1 -2 +BITMAP +A8 +A8 +A8 +A8 +A8 +FC +04 +04 +ENDCHAR +STARTCHAR afii10092 +ENCODING 1098 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +C0 +40 +78 +44 +44 +44 +78 +ENDCHAR +STARTCHAR afii10093 +ENCODING 1099 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +98 +88 +C8 +A8 +A8 +A8 +C8 +ENDCHAR +STARTCHAR afii10094 +ENCODING 1100 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +80 +80 +F0 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR afii10095 +ENCODING 1101 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F0 +08 +08 +78 +08 +08 +F0 +ENDCHAR +STARTCHAR afii10096 +ENCODING 1102 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +90 +A8 +A8 +E8 +A8 +A8 +90 +ENDCHAR +STARTCHAR afii10097 +ENCODING 1103 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +78 +88 +88 +78 +28 +48 +88 +ENDCHAR +STARTCHAR uni0450 +ENCODING 1104 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +40 +20 +00 +70 +88 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR afii10071 +ENCODING 1105 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +50 +00 +70 +88 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR afii10099 +ENCODING 1106 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +40 +F8 +40 +78 +44 +44 +44 +44 +44 +04 +08 +ENDCHAR +STARTCHAR afii10100 +ENCODING 1107 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +10 +20 +00 +F8 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10101 +ENCODING 1108 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +78 +80 +80 +F0 +80 +80 +78 +ENDCHAR +STARTCHAR afii10102 +ENCODING 1109 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +78 +80 +80 +70 +08 +08 +F0 +ENDCHAR +STARTCHAR afii10103 +ENCODING 1110 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 10 2 0 +BITMAP +40 +40 +00 +C0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR afii10104 +ENCODING 1111 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 9 2 0 +BITMAP +A0 +00 +C0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR afii10105 +ENCODING 1112 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 12 2 -2 +BITMAP +20 +20 +00 +60 +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR afii10106 +ENCODING 1113 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +70 +50 +58 +54 +54 +54 +98 +ENDCHAR +STARTCHAR afii10107 +ENCODING 1114 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +90 +90 +F8 +94 +94 +94 +98 +ENDCHAR +STARTCHAR afii10108 +ENCODING 1115 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +40 +F0 +40 +78 +44 +44 +44 +44 +44 +ENDCHAR +STARTCHAR afii10109 +ENCODING 1116 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +10 +20 +00 +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni045D +ENCODING 1117 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +40 +20 +00 +88 +98 +98 +A8 +C8 +C8 +88 +ENDCHAR +STARTCHAR afii10110 +ENCODING 1118 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +88 +70 +00 +88 +88 +88 +88 +88 +98 +68 +08 +70 +ENDCHAR +STARTCHAR afii10193 +ENCODING 1119 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +88 +88 +88 +88 +88 +88 +F8 +20 +20 +ENDCHAR +STARTCHAR uni0460 +ENCODING 1120 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +50 +88 +88 +A8 +A8 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni0461 +ENCODING 1121 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +50 +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR afii10146 +ENCODING 1122 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +40 +F0 +40 +78 +44 +44 +44 +44 +78 +ENDCHAR +STARTCHAR afii10194 +ENCODING 1123 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +40 +40 +40 +F0 +40 +78 +44 +44 +78 +ENDCHAR +STARTCHAR uni0464 +ENCODING 1124 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +9C +A0 +A0 +A0 +F8 +A0 +A0 +A0 +9C +ENDCHAR +STARTCHAR uni0465 +ENCODING 1125 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +9C +A0 +A0 +F8 +A0 +A0 +9C +ENDCHAR +STARTCHAR uni0466 +ENCODING 1126 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +20 +20 +50 +50 +88 +F8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni0467 +ENCODING 1127 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +20 +50 +88 +F8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni0468 +ENCODING 1128 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +88 +88 +94 +94 +E2 +BE +AA +AA +AA +ENDCHAR +STARTCHAR uni0469 +ENCODING 1129 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +88 +94 +A2 +FE +AA +AA +AA +ENDCHAR +STARTCHAR uni046A +ENCODING 1130 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +88 +50 +50 +20 +70 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni046B +ENCODING 1131 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F8 +88 +50 +20 +70 +A8 +A8 +ENDCHAR +STARTCHAR uni046C +ENCODING 1132 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +BE +A2 +94 +94 +E8 +9C +AA +AA +AA +ENDCHAR +STARTCHAR uni046D +ENCODING 1133 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +BE +A2 +94 +E8 +9C +AA +AA +ENDCHAR +STARTCHAR uni046E +ENCODING 1134 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +50 +20 +00 +F0 +08 +08 +70 +08 +08 +08 +70 +80 +70 +ENDCHAR +STARTCHAR uni046F +ENCODING 1135 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +50 +20 +00 +70 +08 +08 +70 +08 +08 +70 +80 +70 +ENDCHAR +STARTCHAR uni0470 +ENCODING 1136 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR uni0471 +ENCODING 1137 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +20 +A8 +A8 +A8 +A8 +A8 +70 +20 +20 +ENDCHAR +STARTCHAR afii10147 +ENCODING 1138 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +88 +F8 +88 +88 +88 +70 +ENDCHAR +STARTCHAR afii10195 +ENCODING 1139 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR afii10148 +ENCODING 1140 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +86 +88 +88 +50 +50 +50 +20 +20 +20 +ENDCHAR +STARTCHAR afii10196 +ENCODING 1141 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +86 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni0476 +ENCODING 1142 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +A0 +50 +06 +88 +88 +50 +50 +50 +20 +20 +20 +ENDCHAR +STARTCHAR uni0477 +ENCODING 1143 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +50 +28 +00 +86 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni0478 +ENCODING 1144 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +40 +A0 +B4 +B4 +B4 +B4 +B4 +B4 +5C +04 +38 +ENDCHAR +STARTCHAR uni0479 +ENCODING 1145 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +54 +B4 +B4 +B4 +B4 +B4 +5C +04 +38 +ENDCHAR +STARTCHAR uni047A +ENCODING 1146 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 -1 +BITMAP +20 +70 +A8 +88 +88 +88 +88 +88 +A8 +70 +20 +ENDCHAR +STARTCHAR uni047B +ENCODING 1147 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 -1 +BITMAP +20 +70 +A8 +88 +88 +88 +A8 +70 +20 +ENDCHAR +STARTCHAR uni047C +ENCODING 1148 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +88 +20 +A8 +88 +88 +A8 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni047D +ENCODING 1149 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +70 +88 +20 +A8 +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni047E +ENCODING 1150 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +20 +A8 +88 +88 +A8 +A8 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni047F +ENCODING 1151 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +70 +20 +20 +88 +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni0480 +ENCODING 1152 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +78 +80 +80 +80 +80 +80 +80 +80 +78 +08 +08 +ENDCHAR +STARTCHAR uni0481 +ENCODING 1153 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +78 +80 +80 +80 +80 +80 +78 +08 +08 +ENDCHAR +STARTCHAR uni0482 +ENCODING 1154 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 6 1 0 +BITMAP +10 +60 +30 +C0 +60 +80 +ENDCHAR +STARTCHAR uni048A +ENCODING 1162 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 13 1 -2 +BITMAP +88 +70 +00 +88 +98 +98 +A8 +A8 +C8 +C8 +88 +04 +08 +ENDCHAR +STARTCHAR uni048B +ENCODING 1163 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 12 1 -2 +BITMAP +88 +70 +00 +88 +98 +98 +A8 +C8 +C8 +88 +04 +08 +ENDCHAR +STARTCHAR uni048C +ENCODING 1164 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +40 +E0 +40 +78 +44 +44 +44 +44 +78 +ENDCHAR +STARTCHAR uni048D +ENCODING 1165 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +40 +E0 +40 +78 +44 +44 +78 +ENDCHAR +STARTCHAR uni048E +ENCODING 1166 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F0 +88 +88 +A8 +F0 +90 +80 +80 +80 +ENDCHAR +STARTCHAR uni048F +ENCODING 1167 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +F0 +88 +88 +88 +88 +A8 +F0 +90 +80 +ENDCHAR +STARTCHAR afii10050 +ENCODING 1168 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +08 +08 +F8 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10098 +ENCODING 1169 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +08 +08 +F8 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni0492 +ENCODING 1170 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +7C +40 +40 +40 +F0 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni0493 +ENCODING 1171 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +7C +40 +40 +F0 +40 +40 +40 +ENDCHAR +STARTCHAR uni0494 +ENCODING 1172 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +F8 +80 +80 +80 +F0 +88 +88 +88 +88 +08 +10 +ENDCHAR +STARTCHAR uni0495 +ENCODING 1173 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +F8 +80 +80 +F0 +88 +88 +88 +08 +10 +ENDCHAR +STARTCHAR uni0496 +ENCODING 1174 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 1 -2 +BITMAP +A8 +A8 +A8 +A8 +70 +A8 +A8 +A8 +AC +04 +04 +ENDCHAR +STARTCHAR uni0497 +ENCODING 1175 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 1 -2 +BITMAP +A8 +A8 +A8 +70 +A8 +A8 +AC +04 +04 +ENDCHAR +STARTCHAR uni0498 +ENCODING 1176 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +F0 +08 +08 +08 +70 +08 +08 +08 +F0 +20 +20 +ENDCHAR +STARTCHAR uni0499 +ENCODING 1177 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +F0 +08 +08 +70 +08 +08 +F0 +20 +20 +ENDCHAR +STARTCHAR uni049A +ENCODING 1178 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +88 +90 +A0 +C0 +80 +C0 +A0 +90 +88 +08 +08 +ENDCHAR +STARTCHAR uni049B +ENCODING 1179 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +08 +08 +ENDCHAR +STARTCHAR uni049C +ENCODING 1180 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +84 +84 +A8 +B0 +E0 +B0 +A8 +84 +84 +ENDCHAR +STARTCHAR uni049D +ENCODING 1181 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +84 +A8 +B0 +E0 +B0 +A8 +84 +ENDCHAR +STARTCHAR uni049E +ENCODING 1182 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +44 +E8 +50 +60 +40 +60 +50 +48 +44 +ENDCHAR +STARTCHAR uni049F +ENCODING 1183 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +44 +E8 +50 +60 +50 +48 +44 +ENDCHAR +STARTCHAR uni04A0 +ENCODING 1184 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C4 +48 +50 +60 +40 +60 +50 +48 +44 +ENDCHAR +STARTCHAR uni04A1 +ENCODING 1185 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +C4 +48 +50 +60 +50 +48 +44 +ENDCHAR +STARTCHAR uni04A2 +ENCODING 1186 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 1 -2 +BITMAP +88 +88 +88 +88 +F8 +88 +88 +88 +8C +04 +04 +ENDCHAR +STARTCHAR uni04A3 +ENCODING 1187 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 1 -2 +BITMAP +88 +88 +88 +F8 +88 +88 +8C +04 +04 +ENDCHAR +STARTCHAR uni04A4 +ENCODING 1188 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +8C +88 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni04A5 +ENCODING 1189 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 1 0 +BITMAP +8C +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni04A6 +ENCODING 1190 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +E0 +A0 +A0 +A0 +B0 +A8 +A8 +A8 +A8 +08 +10 +ENDCHAR +STARTCHAR uni04A7 +ENCODING 1191 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +E0 +A0 +B0 +A8 +A8 +A8 +A8 +08 +10 +ENDCHAR +STARTCHAR uni04A8 +ENCODING 1192 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +30 +40 +90 +A8 +A8 +A8 +A8 +A8 +70 +20 +10 +ENDCHAR +STARTCHAR uni04A9 +ENCODING 1193 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +30 +40 +90 +A8 +A8 +A8 +70 +20 +10 +ENDCHAR +STARTCHAR uni04AA +ENCODING 1194 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +78 +80 +80 +80 +80 +80 +80 +80 +78 +20 +20 +ENDCHAR +STARTCHAR uni04AB +ENCODING 1195 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +78 +80 +80 +80 +80 +80 +78 +20 +20 +ENDCHAR +STARTCHAR uni04AC +ENCODING 1196 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +30 +10 +10 +ENDCHAR +STARTCHAR uni04AD +ENCODING 1197 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +30 +10 +10 +ENDCHAR +STARTCHAR uni04AE +ENCODING 1198 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +88 +50 +50 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni04AF +ENCODING 1199 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +88 +88 +50 +50 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni04B0 +ENCODING 1200 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +88 +50 +50 +20 +70 +20 +20 +20 +ENDCHAR +STARTCHAR uni04B1 +ENCODING 1201 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +88 +88 +88 +50 +50 +20 +70 +20 +20 +ENDCHAR +STARTCHAR uni04B2 +ENCODING 1202 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 1 -2 +BITMAP +88 +88 +88 +50 +20 +50 +88 +88 +8C +04 +04 +ENDCHAR +STARTCHAR uni04B3 +ENCODING 1203 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 1 -2 +BITMAP +88 +88 +50 +20 +50 +88 +8C +04 +04 +ENDCHAR +STARTCHAR uni04B4 +ENCODING 1204 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 1 -2 +BITMAP +E8 +48 +48 +48 +48 +48 +48 +48 +7C +04 +04 +ENDCHAR +STARTCHAR uni04B5 +ENCODING 1205 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 1 -2 +BITMAP +E8 +48 +48 +48 +48 +48 +7C +04 +04 +ENDCHAR +STARTCHAR uni04B6 +ENCODING 1206 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 1 -2 +BITMAP +88 +88 +88 +88 +78 +08 +08 +08 +0C +04 +04 +ENDCHAR +STARTCHAR uni04B7 +ENCODING 1207 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 1 -2 +BITMAP +88 +88 +88 +78 +08 +08 +0C +04 +04 +ENDCHAR +STARTCHAR uni04B8 +ENCODING 1208 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +88 +88 +A8 +78 +28 +08 +08 +08 +ENDCHAR +STARTCHAR uni04B9 +ENCODING 1209 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +88 +A8 +78 +28 +08 +08 +ENDCHAR +STARTCHAR uni04BA +ENCODING 1210 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +80 +80 +80 +80 +F0 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni04BB +ENCODING 1211 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +80 +80 +F0 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni04BC +ENCODING 1212 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +38 +44 +44 +C4 +7C +40 +40 +40 +3C +ENDCHAR +STARTCHAR uni04BD +ENCODING 1213 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +38 +44 +C4 +7C +40 +40 +3C +ENDCHAR +STARTCHAR uni04BE +ENCODING 1214 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +38 +44 +44 +C4 +7C +40 +40 +40 +3C +10 +10 +ENDCHAR +STARTCHAR uni04BF +ENCODING 1215 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +38 +44 +C4 +7C +40 +40 +3C +10 +10 +ENDCHAR +STARTCHAR uni04C0 +ENCODING 1216 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni04C1 +ENCODING 1217 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +88 +70 +00 +A8 +A8 +A8 +70 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni04C2 +ENCODING 1218 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +88 +70 +00 +A8 +A8 +A8 +70 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni04C3 +ENCODING 1219 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +88 +90 +A0 +C0 +80 +C0 +A0 +90 +88 +08 +30 +ENDCHAR +STARTCHAR uni04C4 +ENCODING 1220 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +88 +90 +A0 +C0 +A0 +90 +88 +08 +30 +ENDCHAR +STARTCHAR uni04C5 +ENCODING 1221 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +7C +44 +44 +44 +44 +44 +44 +44 +84 +02 +04 +ENDCHAR +STARTCHAR uni04C6 +ENCODING 1222 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 1 -2 +BITMAP +78 +48 +48 +48 +48 +48 +88 +04 +08 +ENDCHAR +STARTCHAR uni04C7 +ENCODING 1223 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +88 +88 +88 +88 +F8 +88 +88 +88 +88 +08 +30 +ENDCHAR +STARTCHAR uni04C8 +ENCODING 1224 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +08 +30 +ENDCHAR +STARTCHAR uni04C9 +ENCODING 1225 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 11 1 -2 +BITMAP +88 +88 +88 +88 +F8 +88 +88 +88 +88 +04 +08 +ENDCHAR +STARTCHAR uni04CA +ENCODING 1226 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 9 1 -2 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +04 +08 +ENDCHAR +STARTCHAR uni04CB +ENCODING 1227 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +88 +88 +88 +88 +78 +08 +08 +08 +18 +10 +10 +ENDCHAR +STARTCHAR uni04CC +ENCODING 1228 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +88 +88 +88 +78 +08 +08 +18 +10 +10 +ENDCHAR +STARTCHAR uni04CD +ENCODING 1229 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 1 -2 +BITMAP +88 +88 +D8 +D8 +A8 +A8 +88 +88 +88 +04 +08 +ENDCHAR +STARTCHAR uni04CE +ENCODING 1230 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 1 -2 +BITMAP +88 +D8 +A8 +A8 +88 +88 +88 +04 +08 +ENDCHAR +STARTCHAR uni04CF +ENCODING 1231 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni04D0 +ENCODING 1232 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +88 +70 +00 +70 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni04D1 +ENCODING 1233 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +88 +70 +00 +70 +08 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR uni04D2 +ENCODING 1234 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +00 +70 +88 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni04D3 +ENCODING 1235 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +50 +00 +70 +08 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR uni04D4 +ENCODING 1236 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +7C +90 +90 +90 +FC +90 +90 +90 +9C +ENDCHAR +STARTCHAR uni04D5 +ENCODING 1237 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +68 +14 +14 +7C +90 +90 +7C +ENDCHAR +STARTCHAR uni04D6 +ENCODING 1238 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +88 +70 +00 +F8 +80 +80 +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni04D7 +ENCODING 1239 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +88 +70 +00 +70 +88 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR uni04D8 +ENCODING 1240 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F0 +08 +08 +08 +F8 +88 +88 +88 +70 +ENDCHAR +STARTCHAR afii10846 +ENCODING 1241 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F0 +08 +08 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni04DA +ENCODING 1242 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +00 +F0 +08 +08 +08 +F8 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni04DB +ENCODING 1243 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +50 +00 +F0 +08 +08 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni04DC +ENCODING 1244 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +00 +A8 +A8 +A8 +A8 +70 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni04DD +ENCODING 1245 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +50 +00 +A8 +A8 +A8 +70 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni04DE +ENCODING 1246 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +00 +F0 +08 +08 +08 +70 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR uni04DF +ENCODING 1247 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +50 +00 +F0 +08 +08 +70 +08 +08 +F0 +ENDCHAR +STARTCHAR uni04E0 +ENCODING 1248 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +08 +10 +20 +70 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR uni04E1 +ENCODING 1249 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +F8 +08 +10 +20 +70 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR uni04E2 +ENCODING 1250 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +00 +88 +98 +98 +A8 +A8 +C8 +C8 +88 +88 +ENDCHAR +STARTCHAR uni04E3 +ENCODING 1251 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +00 +88 +98 +98 +A8 +C8 +C8 +88 +ENDCHAR +STARTCHAR uni04E4 +ENCODING 1252 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +00 +88 +98 +98 +A8 +A8 +C8 +C8 +88 +88 +ENDCHAR +STARTCHAR uni04E5 +ENCODING 1253 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +50 +00 +88 +98 +98 +A8 +C8 +C8 +88 +ENDCHAR +STARTCHAR uni04E6 +ENCODING 1254 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +00 +70 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni04E7 +ENCODING 1255 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni04E8 +ENCODING 1256 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +88 +F8 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni04E9 +ENCODING 1257 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni04EA +ENCODING 1258 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +00 +70 +88 +88 +88 +F8 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni04EB +ENCODING 1259 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +50 +00 +70 +88 +88 +F8 +88 +88 +70 +ENDCHAR +STARTCHAR uni04EC +ENCODING 1260 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +00 +F0 +08 +08 +08 +78 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR uni04ED +ENCODING 1261 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +50 +00 +F0 +08 +08 +78 +08 +08 +F0 +ENDCHAR +STARTCHAR uni04EE +ENCODING 1262 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +00 +88 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni04EF +ENCODING 1263 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +70 +00 +88 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni04F0 +ENCODING 1264 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +00 +88 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni04F1 +ENCODING 1265 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +50 +00 +88 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni04F2 +ENCODING 1266 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +28 +50 +00 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni04F3 +ENCODING 1267 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +28 +50 +00 +88 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni04F4 +ENCODING 1268 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +00 +88 +88 +88 +88 +78 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni04F5 +ENCODING 1269 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +50 +00 +88 +88 +88 +78 +08 +08 +08 +ENDCHAR +STARTCHAR uni04F6 +ENCODING 1270 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +F8 +80 +80 +80 +80 +80 +80 +80 +C0 +40 +40 +ENDCHAR +STARTCHAR uni04F7 +ENCODING 1271 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +F8 +80 +80 +80 +80 +80 +C0 +40 +40 +ENDCHAR +STARTCHAR uni04F8 +ENCODING 1272 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +00 +88 +88 +88 +88 +C8 +A8 +A8 +A8 +C8 +ENDCHAR +STARTCHAR uni04F9 +ENCODING 1273 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +50 +00 +88 +88 +88 +C8 +A8 +A8 +C8 +ENDCHAR +STARTCHAR uni04FA +ENCODING 1274 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +7C +40 +40 +40 +F8 +40 +40 +40 +40 +40 +80 +ENDCHAR +STARTCHAR uni04FB +ENCODING 1275 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +7C +40 +40 +F8 +40 +40 +40 +40 +80 +ENDCHAR +STARTCHAR uni04FC +ENCODING 1276 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +88 +88 +50 +50 +20 +50 +50 +88 +88 +08 +10 +ENDCHAR +STARTCHAR uni04FD +ENCODING 1277 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +88 +88 +50 +20 +50 +88 +88 +08 +10 +ENDCHAR +STARTCHAR uni04FE +ENCODING 1278 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +88 +50 +50 +F8 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni04FF +ENCODING 1279 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +88 +50 +F8 +50 +88 +88 +ENDCHAR +STARTCHAR uni0500 +ENCODING 1280 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +08 +08 +08 +78 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni0501 +ENCODING 1281 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 0 0 +BITMAP +08 +08 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR uni0502 +ENCODING 1282 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +10 +14 +74 +94 +94 +94 +94 +94 +68 +ENDCHAR +STARTCHAR uni0503 +ENCODING 1283 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +10 +10 +10 +14 +74 +94 +94 +94 +68 +ENDCHAR +STARTCHAR uni0504 +ENCODING 1284 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +C0 +20 +28 +C8 +28 +28 +28 +28 +10 +ENDCHAR +STARTCHAR uni0505 +ENCODING 1285 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +C0 +20 +28 +C8 +28 +28 +10 +ENDCHAR +STARTCHAR uni0506 +ENCODING 1286 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +E0 +10 +10 +60 +10 +10 +10 +10 +18 +08 +08 +ENDCHAR +STARTCHAR uni0507 +ENCODING 1287 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +E0 +10 +10 +60 +10 +10 +18 +08 +08 +ENDCHAR +STARTCHAR uni0508 +ENCODING 1288 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +70 +54 +54 +54 +54 +54 +54 +54 +88 +ENDCHAR +STARTCHAR uni0509 +ENCODING 1289 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +70 +54 +54 +54 +54 +54 +88 +ENDCHAR +STARTCHAR uni050A +ENCODING 1290 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +A0 +A8 +A8 +A8 +E8 +A8 +A8 +A8 +90 +ENDCHAR +STARTCHAR uni050B +ENCODING 1291 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +A0 +A8 +A8 +E8 +A8 +A8 +90 +ENDCHAR +STARTCHAR uni050C +ENCODING 1292 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +78 +80 +80 +80 +98 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni050D +ENCODING 1293 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +78 +80 +80 +98 +88 +88 +70 +ENDCHAR +STARTCHAR uni050E +ENCODING 1294 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +F8 +20 +20 +24 +24 +24 +24 +24 +18 +ENDCHAR +STARTCHAR uni050F +ENCODING 1295 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +F8 +20 +20 +24 +24 +24 +18 +ENDCHAR +STARTCHAR uni0510 +ENCODING 1296 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +78 +80 +80 +80 +70 +80 +80 +80 +78 +ENDCHAR +STARTCHAR uni0511 +ENCODING 1297 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +78 +80 +80 +70 +80 +80 +78 +ENDCHAR +STARTCHAR uni0512 +ENCODING 1298 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 12 0 -2 +BITMAP +7C +44 +44 +44 +44 +44 +44 +44 +44 +84 +04 +08 +ENDCHAR +STARTCHAR uni0513 +ENCODING 1299 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +7C +44 +44 +44 +44 +44 +84 +04 +08 +ENDCHAR +STARTCHAR uni0514 +ENCODING 1300 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +74 +54 +54 +54 +48 +54 +54 +54 +94 +ENDCHAR +STARTCHAR uni0515 +ENCODING 1301 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +74 +54 +54 +48 +54 +54 +94 +ENDCHAR +STARTCHAR uni0516 +ENCODING 1302 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +C8 +A8 +B0 +B0 +E0 +90 +90 +88 +88 +ENDCHAR +STARTCHAR uni0517 +ENCODING 1303 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +C8 +A8 +B0 +A0 +B0 +A8 +C8 +80 +80 +ENDCHAR +STARTCHAR uni0518 +ENCODING 1304 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +7C +90 +90 +90 +7C +30 +50 +90 +9C +ENDCHAR +STARTCHAR uni0519 +ENCODING 1305 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +94 +94 +7C +30 +50 +8C +ENDCHAR +STARTCHAR uni051A +ENCODING 1306 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 10 1 -1 +BITMAP +70 +88 +88 +88 +88 +88 +88 +88 +70 +08 +ENDCHAR +STARTCHAR uni051B +ENCODING 1307 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +78 +88 +88 +88 +88 +88 +78 +08 +08 +ENDCHAR +STARTCHAR uni051C +ENCODING 1308 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +88 +88 +A8 +A8 +D8 +D8 +88 +88 +ENDCHAR +STARTCHAR uni051D +ENCODING 1309 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +88 +88 +88 +A8 +A8 +D8 +88 +ENDCHAR +STARTCHAR uni051E +ENCODING 1310 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +A8 +90 +A8 +C0 +80 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni051F +ENCODING 1311 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +A8 +90 +A8 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni0520 +ENCODING 1312 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +70 +50 +50 +50 +58 +54 +54 +54 +94 +04 +18 +ENDCHAR +STARTCHAR uni0521 +ENCODING 1313 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +70 +50 +50 +58 +54 +54 +94 +04 +18 +ENDCHAR +STARTCHAR uni0522 +ENCODING 1314 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +A0 +A0 +A0 +A0 +F0 +A8 +A8 +A8 +A8 +08 +30 +ENDCHAR +STARTCHAR uni0523 +ENCODING 1315 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +A0 +A0 +A0 +F0 +A8 +A8 +A8 +08 +30 +ENDCHAR +STARTCHAR uni0524 +ENCODING 1316 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 1 -2 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +88 +8C +04 +04 +ENDCHAR +STARTCHAR uni0525 +ENCODING 1317 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 1 -2 +BITMAP +F8 +88 +88 +88 +88 +88 +8C +04 +04 +ENDCHAR +STARTCHAR uni0526 +ENCODING 1318 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 1 -2 +BITMAP +80 +80 +F0 +88 +88 +88 +88 +88 +8C +04 +04 +ENDCHAR +STARTCHAR uni0527 +ENCODING 1319 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 1 -2 +BITMAP +80 +80 +F0 +88 +88 +88 +8C +04 +04 +ENDCHAR +STARTCHAR uni0528 +ENCODING 1320 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 -1 +BITMAP +44 +44 +44 +44 +7C +44 +44 +44 +44 +80 +ENDCHAR +STARTCHAR uni0529 +ENCODING 1321 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 8 0 -1 +BITMAP +44 +44 +44 +7C +44 +44 +44 +80 +ENDCHAR +STARTCHAR uni052E +ENCODING 1326 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +7C +44 +44 +44 +44 +44 +44 +44 +86 +02 +02 +ENDCHAR +STARTCHAR uni052F +ENCODING 1327 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 9 1 -2 +BITMAP +78 +48 +48 +48 +48 +48 +8C +04 +04 +ENDCHAR +STARTCHAR afii57407 +ENCODING 1567 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 9 1 0 +BITMAP +70 +80 +80 +40 +20 +20 +00 +20 +20 +ENDCHAR +STARTCHAR afii57409 +ENCODING 1569 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 5 2 1 +BITMAP +60 +80 +80 +60 +C0 +ENDCHAR +STARTCHAR afii57410 +ENCODING 1570 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 11 2 0 +BITMAP +50 +A0 +00 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR afii57411 +ENCODING 1571 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 11 2 0 +BITMAP +60 +80 +E0 +00 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR afii57412 +ENCODING 1572 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +30 +40 +70 +00 +30 +48 +48 +48 +38 +08 +F0 +ENDCHAR +STARTCHAR afii57413 +ENCODING 1573 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 11 2 -2 +BITMAP +40 +40 +40 +40 +40 +40 +40 +00 +60 +80 +E0 +ENDCHAR +STARTCHAR afii57414 +ENCODING 1574 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +60 +80 +E0 +08 +14 +50 +88 +88 +88 +70 +ENDCHAR +STARTCHAR afii57415 +ENCODING 1575 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 9 3 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii57416 +ENCODING 1576 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 -2 +BITMAP +10 +88 +88 +88 +70 +00 +20 +ENDCHAR +STARTCHAR afii57417 +ENCODING 1577 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +50 +00 +60 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR afii57418 +ENCODING 1578 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +50 +00 +10 +88 +88 +88 +70 +ENDCHAR +STARTCHAR afii57419 +ENCODING 1579 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +20 +00 +50 +00 +10 +88 +88 +88 +70 +ENDCHAR +STARTCHAR afii57420 +ENCODING 1580 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +F8 +20 +40 +80 +A0 +80 +80 +40 +38 +ENDCHAR +STARTCHAR afii57421 +ENCODING 1581 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +F8 +20 +40 +80 +80 +80 +80 +40 +38 +ENDCHAR +STARTCHAR afii57422 +ENCODING 1582 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +20 +00 +F8 +20 +40 +80 +80 +80 +80 +40 +38 +ENDCHAR +STARTCHAR afii57423 +ENCODING 1583 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 6 1 0 +BITMAP +10 +08 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR afii57424 +ENCODING 1584 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +20 +00 +10 +08 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR afii57425 +ENCODING 1585 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 6 1 0 +BITMAP +08 +08 +08 +08 +10 +E0 +ENDCHAR +STARTCHAR afii57426 +ENCODING 1586 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +08 +00 +08 +08 +08 +08 +10 +E0 +ENDCHAR +STARTCHAR afii57427 +ENCODING 1587 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 -2 +BITMAP +54 +9C +9C +90 +60 +ENDCHAR +STARTCHAR afii57428 +ENCODING 1588 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +10 +04 +10 +00 +54 +9C +9C +90 +60 +ENDCHAR +STARTCHAR afii57429 +ENCODING 1589 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 6 0 -2 +BITMAP +14 +5A +92 +9C +90 +60 +ENDCHAR +STARTCHAR afii57430 +ENCODING 1590 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 8 0 -2 +BITMAP +08 +00 +14 +5A +92 +9C +90 +60 +ENDCHAR +STARTCHAR afii57431 +ENCODING 1591 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +40 +40 +40 +40 +40 +58 +64 +44 +FC +ENDCHAR +STARTCHAR afii57432 +ENCODING 1592 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +40 +40 +40 +50 +40 +58 +64 +44 +FC +ENDCHAR +STARTCHAR afii57433 +ENCODING 1593 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +60 +80 +80 +70 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR afii57434 +ENCODING 1594 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +20 +00 +60 +80 +80 +70 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR afii57440 +ENCODING 1600 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 1 0 1 +BITMAP +FC +ENDCHAR +STARTCHAR afii57441 +ENCODING 1601 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 0 -1 +BITMAP +10 +00 +10 +28 +98 +88 +88 +70 +ENDCHAR +STARTCHAR afii57442 +ENCODING 1602 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 0 -1 +BITMAP +28 +00 +10 +28 +98 +88 +88 +70 +ENDCHAR +STARTCHAR afii57443 +ENCODING 1603 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +28 +48 +28 +C8 +08 +88 +88 +88 +70 +ENDCHAR +STARTCHAR afii57444 +ENCODING 1604 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +08 +48 +88 +88 +70 +ENDCHAR +STARTCHAR afii57445 +ENCODING 1605 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 6 0 -1 +BITMAP +30 +48 +48 +B0 +80 +80 +ENDCHAR +STARTCHAR afii57446 +ENCODING 1606 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 0 -1 +BITMAP +20 +00 +10 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR afii57470 +ENCODING 1607 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 1 +BITMAP +60 +90 +88 +88 +70 +ENDCHAR +STARTCHAR afii57448 +ENCODING 1608 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 6 0 -1 +BITMAP +30 +48 +48 +38 +08 +F0 +ENDCHAR +STARTCHAR afii57449 +ENCODING 1609 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 0 +BITMAP +08 +14 +90 +88 +70 +ENDCHAR +STARTCHAR afii57450 +ENCODING 1610 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +08 +14 +50 +88 +88 +70 +00 +00 +50 +ENDCHAR +STARTCHAR afii57392 +ENCODING 1632 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 2 2 4 +BITMAP +80 +80 +ENDCHAR +STARTCHAR afii57393 +ENCODING 1633 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 9 1 0 +BITMAP +80 +80 +40 +40 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR afii57394 +ENCODING 1634 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 9 1 0 +BITMAP +90 +90 +60 +40 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR afii57395 +ENCODING 1635 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +A8 +A8 +70 +40 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR afii57396 +ENCODING 1636 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +60 +80 +80 +60 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR afii57397 +ENCODING 1637 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +20 +50 +50 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR afii57398 +ENCODING 1638 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 0 1 +BITMAP +F0 +10 +10 +10 +10 +08 +08 +08 +ENDCHAR +STARTCHAR afii57399 +ENCODING 1639 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +88 +88 +50 +50 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR afii57400 +ENCODING 1640 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +20 +20 +20 +20 +50 +50 +50 +88 +88 +ENDCHAR +STARTCHAR afii57401 +ENCODING 1641 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 0 1 +BITMAP +60 +90 +90 +70 +10 +08 +08 +08 +ENDCHAR +STARTCHAR afii57381 +ENCODING 1642 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 0 0 +BITMAP +88 +88 +10 +20 +20 +40 +88 +88 +ENDCHAR +STARTCHAR uni066B +ENCODING 1643 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 4 1 0 +BITMAP +10 +10 +20 +C0 +ENDCHAR +STARTCHAR uni066C +ENCODING 1644 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 3 2 9 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR uni066E +ENCODING 1646 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 4 0 1 +BITMAP +10 +88 +88 +70 +ENDCHAR +STARTCHAR uni066F +ENCODING 1647 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 0 +BITMAP +10 +28 +98 +88 +70 +ENDCHAR +STARTCHAR uni0FD5 +ENCODING 4053 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 3 +BITMAP +B8 +A0 +F8 +28 +E8 +ENDCHAR +STARTCHAR uni0FD6 +ENCODING 4054 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 3 +BITMAP +E8 +28 +F8 +A0 +B8 +ENDCHAR +STARTCHAR uni1E00 +ENCODING 7680 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +70 +88 +88 +F8 +88 +88 +88 +88 +20 +50 +20 +ENDCHAR +STARTCHAR uni1E01 +ENCODING 7681 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 10 1 -2 +BITMAP +70 +08 +08 +78 +88 +88 +78 +20 +50 +20 +ENDCHAR +STARTCHAR uni1E02 +ENCODING 7682 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +00 +F0 +88 +88 +88 +F0 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR uni1E03 +ENCODING 7683 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +00 +80 +80 +F0 +88 +88 +88 +88 +88 +F0 +ENDCHAR +STARTCHAR uni1E04 +ENCODING 7684 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +F0 +88 +88 +88 +F0 +88 +88 +88 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E05 +ENCODING 7685 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +80 +80 +F0 +88 +88 +88 +88 +88 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E06 +ENCODING 7686 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +F0 +88 +88 +88 +F0 +88 +88 +88 +F0 +00 +70 +ENDCHAR +STARTCHAR uni1E07 +ENCODING 7687 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +80 +80 +F0 +88 +88 +88 +88 +88 +F0 +00 +70 +ENDCHAR +STARTCHAR uni1E08 +ENCODING 7688 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +10 +20 +78 +80 +80 +80 +80 +80 +80 +80 +78 +20 +C0 +ENDCHAR +STARTCHAR uni1E09 +ENCODING 7689 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +10 +20 +00 +78 +80 +80 +80 +80 +80 +78 +20 +C0 +ENDCHAR +STARTCHAR uni1E0A +ENCODING 7690 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +00 +E0 +90 +88 +88 +88 +88 +88 +90 +E0 +ENDCHAR +STARTCHAR uni1E0B +ENCODING 7691 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +00 +08 +08 +78 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni1E0C +ENCODING 7692 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +E0 +90 +88 +88 +88 +88 +88 +90 +E0 +00 +20 +ENDCHAR +STARTCHAR uni1E0D +ENCODING 7693 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +08 +08 +78 +88 +88 +88 +88 +88 +78 +00 +20 +ENDCHAR +STARTCHAR uni1E0E +ENCODING 7694 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +E0 +90 +88 +88 +88 +88 +88 +90 +E0 +00 +70 +ENDCHAR +STARTCHAR uni1E0F +ENCODING 7695 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +08 +08 +78 +88 +88 +88 +88 +88 +78 +00 +70 +ENDCHAR +STARTCHAR uni1E10 +ENCODING 7696 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +E0 +90 +88 +88 +88 +88 +88 +90 +E0 +20 +C0 +ENDCHAR +STARTCHAR uni1E11 +ENCODING 7697 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +08 +08 +78 +88 +88 +88 +88 +88 +78 +20 +C0 +ENDCHAR +STARTCHAR uni1E12 +ENCODING 7698 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +E0 +90 +88 +88 +88 +88 +88 +90 +E0 +20 +50 +ENDCHAR +STARTCHAR uni1E13 +ENCODING 7699 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +08 +08 +78 +88 +88 +88 +88 +88 +78 +20 +50 +ENDCHAR +STARTCHAR uni1E14 +ENCODING 7700 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +20 +70 +00 +F8 +80 +80 +F8 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1E15 +ENCODING 7701 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +20 +70 +00 +70 +88 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR uni1E16 +ENCODING 7702 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +20 +70 +00 +F8 +80 +80 +F8 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1E17 +ENCODING 7703 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +20 +70 +00 +70 +88 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR uni1E18 +ENCODING 7704 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +F8 +80 +80 +F8 +80 +80 +80 +F8 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E19 +ENCODING 7705 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +70 +88 +F8 +80 +80 +78 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E1A +ENCODING 7706 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +F8 +80 +80 +F8 +80 +80 +80 +F8 +00 +68 +90 +ENDCHAR +STARTCHAR uni1E1B +ENCODING 7707 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +70 +88 +F8 +80 +80 +78 +00 +68 +90 +ENDCHAR +STARTCHAR uni1E1C +ENCODING 7708 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +88 +70 +00 +F8 +80 +80 +F8 +80 +80 +80 +F8 +20 +C0 +ENDCHAR +STARTCHAR uni1E1D +ENCODING 7709 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +88 +70 +00 +70 +88 +88 +F8 +80 +80 +78 +20 +C0 +ENDCHAR +STARTCHAR uni1E1E +ENCODING 7710 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +00 +F8 +80 +80 +80 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E1F +ENCODING 7711 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 11 3 0 +BITMAP +80 +00 +60 +80 +80 +E0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E20 +ENCODING 7712 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +00 +78 +80 +80 +80 +98 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1E21 +ENCODING 7713 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +70 +00 +78 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni1E22 +ENCODING 7714 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +00 +88 +88 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni1E23 +ENCODING 7715 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +00 +80 +80 +F0 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni1E24 +ENCODING 7716 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +88 +88 +88 +88 +F8 +88 +88 +88 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E25 +ENCODING 7717 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +80 +80 +F0 +88 +88 +88 +88 +88 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E26 +ENCODING 7718 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +00 +88 +88 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni1E27 +ENCODING 7719 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +00 +80 +80 +F0 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni1E28 +ENCODING 7720 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +44 +44 +44 +44 +7C +44 +44 +44 +44 +20 +C0 +ENDCHAR +STARTCHAR uni1E29 +ENCODING 7721 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +40 +40 +78 +44 +44 +44 +44 +44 +44 +20 +C0 +ENDCHAR +STARTCHAR uni1E2A +ENCODING 7722 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +88 +88 +88 +F8 +88 +88 +88 +88 +00 +88 +70 +ENDCHAR +STARTCHAR uni1E2B +ENCODING 7723 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +80 +80 +F0 +88 +88 +88 +88 +88 +00 +88 +70 +ENDCHAR +STARTCHAR uni1E2C +ENCODING 7724 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +F8 +00 +68 +90 +ENDCHAR +STARTCHAR uni1E2D +ENCODING 7725 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +20 +20 +00 +60 +20 +20 +20 +20 +20 +00 +68 +90 +ENDCHAR +STARTCHAR uni1E2E +ENCODING 7726 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +20 +50 +00 +F8 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni1E2F +ENCODING 7727 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 3 11 2 0 +BITMAP +20 +40 +A0 +00 +C0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni1E30 +ENCODING 7728 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +20 +88 +90 +A0 +C0 +80 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni1E31 +ENCODING 7729 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +20 +80 +80 +88 +90 +A0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni1E32 +ENCODING 7730 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +88 +90 +A0 +C0 +80 +C0 +A0 +90 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E33 +ENCODING 7731 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +80 +80 +88 +90 +A0 +C0 +A0 +90 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E34 +ENCODING 7732 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +88 +90 +A0 +C0 +80 +C0 +A0 +90 +88 +00 +70 +ENDCHAR +STARTCHAR uni1E35 +ENCODING 7733 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +80 +80 +88 +90 +A0 +C0 +A0 +90 +88 +00 +70 +ENDCHAR +STARTCHAR uni1E36 +ENCODING 7734 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +F8 +00 +20 +ENDCHAR +STARTCHAR uni1E37 +ENCODING 7735 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 3 11 2 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +40 +20 +00 +40 +ENDCHAR +STARTCHAR uni1E38 +ENCODING 7736 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +70 +00 +80 +80 +80 +80 +80 +80 +80 +80 +F8 +00 +20 +ENDCHAR +STARTCHAR uni1E39 +ENCODING 7737 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 3 13 2 -2 +BITMAP +E0 +00 +C0 +40 +40 +40 +40 +40 +40 +40 +20 +00 +40 +ENDCHAR +STARTCHAR uni1E3A +ENCODING 7738 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +F8 +00 +70 +ENDCHAR +STARTCHAR uni1E3B +ENCODING 7739 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 3 11 2 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +40 +20 +00 +E0 +ENDCHAR +STARTCHAR uni1E3C +ENCODING 7740 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +F8 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E3D +ENCODING 7741 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 3 11 2 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +20 +00 +40 +A0 +ENDCHAR +STARTCHAR uni1E3E +ENCODING 7742 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +20 +88 +88 +D8 +D8 +A8 +A8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1E3F +ENCODING 7743 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +10 +20 +00 +F0 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni1E40 +ENCODING 7744 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +00 +88 +88 +D8 +D8 +A8 +A8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1E41 +ENCODING 7745 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +20 +00 +F0 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni1E42 +ENCODING 7746 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +88 +88 +D8 +D8 +A8 +A8 +88 +88 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E43 +ENCODING 7747 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +F0 +A8 +A8 +A8 +A8 +A8 +A8 +00 +20 +ENDCHAR +STARTCHAR uni1E44 +ENCODING 7748 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +00 +88 +C8 +C8 +A8 +A8 +98 +98 +88 +88 +ENDCHAR +STARTCHAR uni1E45 +ENCODING 7749 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +20 +00 +F0 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni1E46 +ENCODING 7750 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +88 +C8 +C8 +A8 +A8 +98 +98 +88 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E47 +ENCODING 7751 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +F0 +88 +88 +88 +88 +88 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E48 +ENCODING 7752 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +88 +C8 +C8 +A8 +A8 +98 +98 +88 +88 +00 +70 +ENDCHAR +STARTCHAR uni1E49 +ENCODING 7753 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +F0 +88 +88 +88 +88 +88 +88 +00 +70 +ENDCHAR +STARTCHAR uni1E4A +ENCODING 7754 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +88 +C8 +C8 +A8 +A8 +98 +98 +88 +88 +20 +50 +ENDCHAR +STARTCHAR uni1E4B +ENCODING 7755 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +F0 +88 +88 +88 +88 +88 +88 +20 +50 +ENDCHAR +STARTCHAR uni1E4C +ENCODING 7756 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +80 +68 +B0 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1E4D +ENCODING 7757 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +80 +68 +B0 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1E4E +ENCODING 7758 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +00 +68 +B0 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1E4F +ENCODING 7759 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +00 +68 +B0 +00 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1E50 +ENCODING 7760 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +20 +70 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1E51 +ENCODING 7761 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +20 +70 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1E52 +ENCODING 7762 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +20 +70 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1E53 +ENCODING 7763 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +20 +70 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1E54 +ENCODING 7764 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +20 +F0 +88 +88 +88 +F0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E55 +ENCODING 7765 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +10 +20 +00 +F0 +88 +88 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR uni1E56 +ENCODING 7766 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +00 +F0 +88 +88 +88 +F0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E57 +ENCODING 7767 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +20 +00 +F0 +88 +88 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR uni1E58 +ENCODING 7768 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +00 +F0 +88 +88 +88 +F0 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni1E59 +ENCODING 7769 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +20 +00 +78 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E5A +ENCODING 7770 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +F0 +88 +88 +88 +F0 +C0 +A0 +90 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E5B +ENCODING 7771 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +78 +80 +80 +80 +80 +80 +80 +00 +20 +ENDCHAR +STARTCHAR uni1E5C +ENCODING 7772 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +70 +00 +F0 +88 +88 +88 +F0 +C0 +A0 +90 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E5D +ENCODING 7773 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +70 +00 +78 +80 +80 +80 +80 +80 +80 +00 +20 +ENDCHAR +STARTCHAR uni1E5E +ENCODING 7774 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +F0 +88 +88 +88 +F0 +C0 +A0 +90 +88 +00 +70 +ENDCHAR +STARTCHAR uni1E5F +ENCODING 7775 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +78 +80 +80 +80 +80 +80 +80 +00 +70 +ENDCHAR +STARTCHAR uni1E60 +ENCODING 7776 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +00 +78 +80 +80 +80 +70 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR uni1E61 +ENCODING 7777 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +20 +00 +78 +80 +80 +70 +08 +08 +F0 +ENDCHAR +STARTCHAR uni1E62 +ENCODING 7778 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +78 +80 +80 +80 +70 +08 +08 +08 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E63 +ENCODING 7779 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +78 +80 +80 +70 +08 +08 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E64 +ENCODING 7780 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +08 +50 +00 +78 +80 +80 +70 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR uni1E65 +ENCODING 7781 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +08 +50 +00 +78 +80 +80 +70 +08 +08 +F0 +ENDCHAR +STARTCHAR uni1E66 +ENCODING 7782 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +A0 +48 +00 +78 +80 +80 +70 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR uni1E67 +ENCODING 7783 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +A0 +48 +00 +78 +80 +80 +70 +08 +08 +F0 +ENDCHAR +STARTCHAR uni1E68 +ENCODING 7784 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +20 +00 +78 +80 +80 +80 +70 +08 +08 +08 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E69 +ENCODING 7785 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +20 +00 +78 +80 +80 +70 +08 +08 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E6A +ENCODING 7786 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1E6B +ENCODING 7787 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 4 11 2 0 +BITMAP +80 +00 +80 +80 +F0 +80 +80 +80 +80 +80 +70 +ENDCHAR +STARTCHAR uni1E6C +ENCODING 7788 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +20 +00 +20 +ENDCHAR +STARTCHAR uni1E6D +ENCODING 7789 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 4 11 2 -2 +BITMAP +80 +80 +F0 +80 +80 +80 +80 +80 +70 +00 +40 +ENDCHAR +STARTCHAR uni1E6E +ENCODING 7790 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +20 +00 +70 +ENDCHAR +STARTCHAR uni1E6F +ENCODING 7791 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 4 11 2 -2 +BITMAP +80 +80 +F0 +80 +80 +80 +80 +80 +70 +00 +E0 +ENDCHAR +STARTCHAR uni1E70 +ENCODING 7792 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E71 +ENCODING 7793 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 4 11 2 -2 +BITMAP +80 +80 +F0 +80 +80 +80 +80 +70 +00 +40 +A0 +ENDCHAR +STARTCHAR uni1E72 +ENCODING 7794 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +88 +88 +88 +88 +88 +88 +88 +88 +70 +00 +50 +ENDCHAR +STARTCHAR uni1E73 +ENCODING 7795 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +88 +88 +88 +88 +88 +88 +78 +00 +50 +ENDCHAR +STARTCHAR uni1E74 +ENCODING 7796 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +88 +88 +88 +88 +88 +88 +88 +70 +00 +68 +90 +ENDCHAR +STARTCHAR uni1E75 +ENCODING 7797 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +88 +88 +88 +88 +88 +78 +00 +68 +90 +ENDCHAR +STARTCHAR uni1E76 +ENCODING 7798 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +88 +88 +88 +88 +88 +88 +88 +70 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E77 +ENCODING 7799 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +88 +88 +88 +88 +88 +78 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E78 +ENCODING 7800 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +80 +68 +B0 +00 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1E79 +ENCODING 7801 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +80 +68 +B0 +00 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni1E7A +ENCODING 7802 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +00 +70 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1E7B +ENCODING 7803 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +00 +70 +00 +88 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni1E7C +ENCODING 7804 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +68 +90 +00 +88 +88 +88 +50 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni1E7D +ENCODING 7805 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +48 +A8 +90 +00 +88 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni1E7E +ENCODING 7806 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +88 +88 +88 +50 +50 +50 +20 +20 +20 +00 +20 +ENDCHAR +STARTCHAR uni1E7F +ENCODING 7807 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +88 +88 +88 +50 +50 +20 +20 +00 +20 +ENDCHAR +STARTCHAR Wgrave +ENCODING 7808 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +20 +88 +88 +88 +A8 +A8 +D8 +D8 +88 +88 +ENDCHAR +STARTCHAR wgrave +ENCODING 7809 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +40 +20 +00 +88 +88 +88 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR Wacute +ENCODING 7810 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +20 +88 +88 +88 +A8 +A8 +D8 +D8 +88 +88 +ENDCHAR +STARTCHAR wacute +ENCODING 7811 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +10 +20 +00 +88 +88 +88 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR Wdieresis +ENCODING 7812 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +00 +88 +88 +88 +A8 +A8 +D8 +D8 +88 +88 +ENDCHAR +STARTCHAR wdieresis +ENCODING 7813 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +50 +00 +88 +88 +88 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni1E86 +ENCODING 7814 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +00 +88 +88 +88 +A8 +A8 +D8 +D8 +88 +88 +ENDCHAR +STARTCHAR uni1E87 +ENCODING 7815 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +20 +00 +88 +88 +88 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni1E88 +ENCODING 7816 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +88 +88 +88 +A8 +A8 +D8 +D8 +88 +88 +00 +20 +ENDCHAR +STARTCHAR uni1E89 +ENCODING 7817 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +88 +88 +88 +A8 +A8 +A8 +70 +00 +20 +ENDCHAR +STARTCHAR uni1E8A +ENCODING 7818 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +00 +88 +88 +50 +50 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni1E8B +ENCODING 7819 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +20 +00 +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR uni1E8C +ENCODING 7820 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +00 +88 +88 +50 +50 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni1E8D +ENCODING 7821 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +50 +00 +88 +88 +50 +20 +50 +88 +88 +ENDCHAR +STARTCHAR uni1E8E +ENCODING 7822 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +00 +88 +88 +50 +50 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1E8F +ENCODING 7823 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +20 +00 +88 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni1E90 +ENCODING 7824 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +50 +00 +F8 +08 +10 +20 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR uni1E91 +ENCODING 7825 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +20 +50 +00 +F8 +08 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR uni1E92 +ENCODING 7826 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +F8 +08 +10 +10 +20 +40 +40 +80 +F8 +00 +20 +ENDCHAR +STARTCHAR uni1E93 +ENCODING 7827 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +F8 +08 +10 +20 +40 +80 +F8 +00 +20 +ENDCHAR +STARTCHAR uni1E94 +ENCODING 7828 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +F8 +08 +10 +10 +20 +40 +40 +80 +F8 +00 +70 +ENDCHAR +STARTCHAR uni1E95 +ENCODING 7829 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +F8 +08 +10 +20 +40 +80 +F8 +00 +70 +ENDCHAR +STARTCHAR uni1E96 +ENCODING 7830 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +80 +80 +F0 +88 +88 +88 +88 +88 +88 +00 +70 +ENDCHAR +STARTCHAR uni1E97 +ENCODING 7831 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 11 2 0 +BITMAP +A0 +00 +40 +40 +E0 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR uni1E98 +ENCODING 7832 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +50 +20 +00 +88 +88 +88 +A8 +A8 +A8 +70 +ENDCHAR +STARTCHAR uni1E99 +ENCODING 7833 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +20 +50 +20 +00 +88 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni1E9A +ENCODING 7834 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +08 +04 +04 +08 +70 +08 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR uni1E9B +ENCODING 7835 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 11 1 0 +BITMAP +20 +00 +30 +40 +40 +C0 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni1E9C +ENCODING 7836 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 9 1 0 +BITMAP +30 +40 +C0 +40 +60 +C0 +40 +40 +40 +ENDCHAR +STARTCHAR uni1E9D +ENCODING 7837 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 9 1 0 +BITMAP +30 +40 +E0 +40 +C0 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni1E9E +ENCODING 7838 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +98 +A0 +A0 +90 +88 +88 +B0 +ENDCHAR +STARTCHAR uni1E9F +ENCODING 7839 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +80 +80 +70 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EA0 +ENCODING 7840 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +70 +88 +88 +88 +F8 +88 +88 +88 +88 +00 +20 +ENDCHAR +STARTCHAR uni1EA1 +ENCODING 7841 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +70 +08 +08 +78 +88 +88 +78 +00 +20 +ENDCHAR +STARTCHAR uni1EA2 +ENCODING 7842 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +C0 +20 +70 +88 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni1EA3 +ENCODING 7843 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +C0 +20 +00 +70 +08 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR uni1EA4 +ENCODING 7844 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +40 +90 +28 +00 +38 +44 +44 +7C +44 +44 +44 +ENDCHAR +STARTCHAR uni1EA5 +ENCODING 7845 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +40 +90 +28 +00 +38 +04 +04 +3C +44 +44 +3C +ENDCHAR +STARTCHAR uni1EA6 +ENCODING 7846 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +08 +24 +50 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1EA7 +ENCODING 7847 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +08 +24 +50 +00 +70 +08 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR uni1EA8 +ENCODING 7848 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +C0 +20 +50 +00 +70 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1EA9 +ENCODING 7849 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +C0 +20 +50 +00 +70 +08 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR uni1EAA +ENCODING 7850 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +68 +B0 +08 +14 +00 +38 +44 +7C +44 +44 +44 +ENDCHAR +STARTCHAR uni1EAB +ENCODING 7851 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +68 +B0 +08 +14 +00 +38 +04 +3C +44 +44 +3C +ENDCHAR +STARTCHAR uni1EAC +ENCODING 7852 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +20 +50 +00 +70 +88 +88 +F8 +88 +88 +88 +88 +00 +20 +ENDCHAR +STARTCHAR uni1EAD +ENCODING 7853 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +20 +50 +00 +70 +08 +08 +78 +88 +88 +78 +00 +20 +ENDCHAR +STARTCHAR uni1EAE +ENCODING 7854 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +20 +88 +70 +00 +70 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1EAF +ENCODING 7855 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +20 +88 +70 +00 +70 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR uni1EB0 +ENCODING 7856 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +20 +88 +70 +00 +70 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1EB1 +ENCODING 7857 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +20 +88 +70 +00 +70 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR uni1EB2 +ENCODING 7858 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +C0 +20 +88 +70 +00 +70 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1EB3 +ENCODING 7859 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +C0 +20 +88 +70 +00 +70 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR uni1EB4 +ENCODING 7860 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +68 +B0 +88 +70 +00 +70 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1EB5 +ENCODING 7861 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +68 +B0 +88 +70 +00 +70 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR uni1EB6 +ENCODING 7862 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +88 +70 +00 +70 +88 +88 +F8 +88 +88 +88 +88 +00 +20 +ENDCHAR +STARTCHAR uni1EB7 +ENCODING 7863 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +88 +70 +00 +70 +08 +08 +78 +88 +88 +78 +00 +20 +ENDCHAR +STARTCHAR uni1EB8 +ENCODING 7864 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +F8 +80 +80 +80 +F8 +80 +80 +80 +F8 +00 +20 +ENDCHAR +STARTCHAR uni1EB9 +ENCODING 7865 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +70 +88 +88 +F8 +80 +80 +78 +00 +20 +ENDCHAR +STARTCHAR uni1EBA +ENCODING 7866 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +C0 +20 +F8 +80 +80 +80 +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1EBB +ENCODING 7867 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +C0 +20 +00 +70 +88 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR uni1EBC +ENCODING 7868 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +68 +B0 +00 +F8 +80 +80 +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1EBD +ENCODING 7869 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +48 +A8 +90 +00 +70 +88 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR uni1EBE +ENCODING 7870 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +40 +90 +28 +00 +7C +40 +40 +7C +40 +40 +7C +ENDCHAR +STARTCHAR uni1EBF +ENCODING 7871 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +40 +90 +28 +00 +38 +44 +44 +7C +40 +40 +3C +ENDCHAR +STARTCHAR uni1EC0 +ENCODING 7872 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +08 +24 +50 +00 +F8 +80 +80 +F8 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1EC1 +ENCODING 7873 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +08 +24 +50 +00 +70 +88 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR uni1EC2 +ENCODING 7874 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +C0 +20 +50 +00 +F8 +80 +80 +F0 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1EC3 +ENCODING 7875 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +C0 +20 +50 +00 +70 +88 +88 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR uni1EC4 +ENCODING 7876 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +68 +B0 +08 +14 +00 +7C +40 +7C +40 +40 +7C +ENDCHAR +STARTCHAR uni1EC5 +ENCODING 7877 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +68 +B0 +08 +14 +00 +38 +44 +7C +40 +40 +3C +ENDCHAR +STARTCHAR uni1EC6 +ENCODING 7878 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +20 +50 +00 +F8 +80 +80 +F8 +80 +80 +80 +F8 +00 +20 +ENDCHAR +STARTCHAR uni1EC7 +ENCODING 7879 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +20 +50 +00 +70 +88 +88 +F8 +80 +80 +78 +00 +20 +ENDCHAR +STARTCHAR uni1EC8 +ENCODING 7880 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +C0 +20 +F8 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni1EC9 +ENCODING 7881 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 3 10 1 0 +BITMAP +C0 +20 +00 +60 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1ECA +ENCODING 7882 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +F8 +00 +20 +ENDCHAR +STARTCHAR uni1ECB +ENCODING 7883 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 12 2 -2 +BITMAP +40 +40 +00 +C0 +40 +40 +40 +40 +40 +40 +00 +40 +ENDCHAR +STARTCHAR uni1ECC +ENCODING 7884 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +70 +88 +88 +88 +88 +88 +88 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1ECD +ENCODING 7885 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +70 +88 +88 +88 +88 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1ECE +ENCODING 7886 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +C0 +20 +70 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1ECF +ENCODING 7887 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +C0 +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1ED0 +ENCODING 7888 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +40 +90 +28 +00 +38 +44 +44 +44 +44 +44 +38 +ENDCHAR +STARTCHAR uni1ED1 +ENCODING 7889 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +40 +90 +28 +00 +38 +44 +44 +44 +44 +44 +38 +ENDCHAR +STARTCHAR uni1ED2 +ENCODING 7890 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +08 +24 +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1ED3 +ENCODING 7891 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +08 +24 +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1ED4 +ENCODING 7892 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +C0 +20 +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1ED5 +ENCODING 7893 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +C0 +20 +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1ED6 +ENCODING 7894 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +68 +B0 +08 +14 +00 +38 +44 +44 +44 +44 +38 +ENDCHAR +STARTCHAR uni1ED7 +ENCODING 7895 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +68 +B0 +08 +14 +00 +38 +44 +44 +44 +44 +38 +ENDCHAR +STARTCHAR uni1ED8 +ENCODING 7896 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +20 +50 +00 +70 +88 +88 +88 +88 +88 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1ED9 +ENCODING 7897 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +20 +50 +00 +70 +88 +88 +88 +88 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1EDA +ENCODING 7898 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +10 +24 +74 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EDB +ENCODING 7899 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +10 +20 +04 +74 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EDC +ENCODING 7900 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +40 +24 +74 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EDD +ENCODING 7901 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +40 +20 +04 +74 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EDE +ENCODING 7902 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +C0 +24 +74 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EDF +ENCODING 7903 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +C0 +20 +04 +74 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EE0 +ENCODING 7904 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +68 +B0 +04 +74 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EE1 +ENCODING 7905 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +48 +A8 +90 +04 +74 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EE2 +ENCODING 7906 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 12 1 -2 +BITMAP +04 +74 +88 +88 +88 +88 +88 +88 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1EE3 +ENCODING 7907 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 1 -2 +BITMAP +04 +74 +88 +88 +88 +88 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1EE4 +ENCODING 7908 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +88 +88 +88 +88 +88 +88 +88 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1EE5 +ENCODING 7909 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +88 +88 +88 +88 +88 +88 +78 +00 +20 +ENDCHAR +STARTCHAR uni1EE6 +ENCODING 7910 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +C0 +20 +88 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EE7 +ENCODING 7911 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +C0 +20 +88 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni1EE8 +ENCODING 7912 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +10 +24 +04 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EE9 +ENCODING 7913 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +10 +24 +04 +88 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni1EEA +ENCODING 7914 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +40 +24 +04 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EEB +ENCODING 7915 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +40 +24 +04 +88 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni1EEC +ENCODING 7916 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +C4 +24 +88 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EED +ENCODING 7917 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +C0 +24 +04 +88 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni1EEE +ENCODING 7918 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +68 +B4 +04 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EEF +ENCODING 7919 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +48 +A8 +94 +04 +88 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni1EF0 +ENCODING 7920 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 1 -2 +BITMAP +04 +04 +88 +88 +88 +88 +88 +88 +88 +88 +70 +00 +20 +ENDCHAR +STARTCHAR uni1EF1 +ENCODING 7921 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 1 -2 +BITMAP +04 +04 +88 +88 +88 +88 +88 +88 +78 +00 +20 +ENDCHAR +STARTCHAR Ygrave +ENCODING 7922 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +20 +88 +88 +50 +50 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR ygrave +ENCODING 7923 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +40 +20 +00 +88 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni1EF4 +ENCODING 7924 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +88 +88 +50 +50 +20 +20 +20 +20 +20 +00 +20 +ENDCHAR +STARTCHAR uni1EF5 +ENCODING 7925 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +88 +88 +88 +88 +88 +68 +10 +20 +C8 +ENDCHAR +STARTCHAR uni1EF6 +ENCODING 7926 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +C0 +20 +88 +88 +50 +50 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1EF7 +ENCODING 7927 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +C0 +20 +00 +88 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni1EF8 +ENCODING 7928 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +68 +90 +00 +88 +88 +50 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1EF9 +ENCODING 7929 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +48 +A8 +90 +00 +88 +88 +88 +88 +88 +88 +78 +08 +70 +ENDCHAR +STARTCHAR uni1EFA +ENCODING 7930 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +F8 +ENDCHAR +STARTCHAR uni1EFB +ENCODING 7931 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F0 +50 +50 +50 +50 +50 +50 +50 +28 +ENDCHAR +STARTCHAR uni1EFC +ENCODING 7932 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +30 +40 +80 +80 +90 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EFD +ENCODING 7933 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +30 +40 +80 +90 +88 +88 +70 +ENDCHAR +STARTCHAR uni1EFE +ENCODING 7934 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 10 1 -1 +BITMAP +88 +88 +50 +50 +20 +20 +20 +60 +A0 +40 +ENDCHAR +STARTCHAR uni1EFF +ENCODING 7935 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +88 +88 +88 +88 +78 +08 +48 +A8 +70 +ENDCHAR +STARTCHAR uni1F00 +ENCODING 7936 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +10 +20 +00 +68 +98 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni1F01 +ENCODING 7937 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +40 +20 +00 +68 +98 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni1F02 +ENCODING 7938 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +50 +88 +00 +68 +98 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni1F03 +ENCODING 7939 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +80 +90 +48 +00 +68 +98 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni1F04 +ENCODING 7940 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +48 +90 +00 +68 +98 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni1F05 +ENCODING 7941 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +80 +88 +50 +00 +68 +98 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni1F06 +ENCODING 7942 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +A8 +20 +40 +00 +68 +98 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni1F07 +ENCODING 7943 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +A8 +20 +10 +00 +68 +98 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni1F08 +ENCODING 7944 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +40 +80 +70 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F09 +ENCODING 7945 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +80 +80 +40 +38 +44 +44 +7C +44 +44 +44 +44 +ENDCHAR +STARTCHAR uni1F0A +ENCODING 7946 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +50 +48 +80 +38 +44 +44 +7C +44 +44 +44 +44 +ENDCHAR +STARTCHAR uni1F0B +ENCODING 7947 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +90 +88 +40 +38 +44 +44 +7C +44 +44 +44 +44 +ENDCHAR +STARTCHAR uni1F0C +ENCODING 7948 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +48 +50 +80 +38 +44 +44 +7C +44 +44 +44 +44 +ENDCHAR +STARTCHAR uni1F0D +ENCODING 7949 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +88 +90 +40 +38 +44 +44 +7C +44 +44 +44 +44 +ENDCHAR +STARTCHAR uni1F0E +ENCODING 7950 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +70 +A8 +20 +40 +38 +44 +44 +7C +44 +44 +44 +ENDCHAR +STARTCHAR uni1F0F +ENCODING 7951 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +70 +A8 +20 +10 +38 +44 +44 +7C +44 +44 +44 +ENDCHAR +STARTCHAR uni1F10 +ENCODING 7952 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +10 +20 +00 +78 +80 +80 +70 +80 +80 +78 +ENDCHAR +STARTCHAR uni1F11 +ENCODING 7953 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +40 +20 +00 +78 +80 +80 +70 +80 +80 +78 +ENDCHAR +STARTCHAR uni1F12 +ENCODING 7954 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +50 +88 +00 +78 +80 +80 +70 +80 +80 +78 +ENDCHAR +STARTCHAR uni1F13 +ENCODING 7955 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +80 +90 +48 +00 +78 +80 +80 +70 +80 +80 +78 +ENDCHAR +STARTCHAR uni1F14 +ENCODING 7956 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +48 +90 +00 +78 +80 +80 +70 +80 +80 +78 +ENDCHAR +STARTCHAR uni1F15 +ENCODING 7957 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +80 +88 +50 +00 +78 +80 +80 +70 +80 +80 +78 +ENDCHAR +STARTCHAR uni1F18 +ENCODING 7960 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +10 +20 +F8 +80 +80 +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F19 +ENCODING 7961 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +40 +20 +F8 +80 +80 +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1F1A +ENCODING 7962 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +50 +48 +80 +00 +7C +40 +40 +7C +40 +40 +7C +ENDCHAR +STARTCHAR uni1F1B +ENCODING 7963 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +90 +88 +40 +00 +7C +40 +40 +78 +40 +40 +7C +ENDCHAR +STARTCHAR uni1F1C +ENCODING 7964 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +48 +50 +80 +00 +7C +40 +40 +7C +40 +40 +7C +ENDCHAR +STARTCHAR uni1F1D +ENCODING 7965 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +88 +90 +40 +00 +7C +40 +40 +7C +40 +40 +7C +ENDCHAR +STARTCHAR uni1F20 +ENCODING 7968 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +10 +10 +20 +00 +F0 +88 +88 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F21 +ENCODING 7969 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +40 +40 +20 +00 +F0 +88 +88 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F22 +ENCODING 7970 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +40 +50 +88 +00 +F0 +88 +88 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F23 +ENCODING 7971 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +80 +90 +48 +00 +F0 +88 +88 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F24 +ENCODING 7972 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +40 +48 +90 +00 +F0 +88 +88 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F25 +ENCODING 7973 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +80 +88 +50 +00 +F0 +88 +88 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F26 +ENCODING 7974 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +70 +A8 +20 +40 +00 +F0 +88 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F27 +ENCODING 7975 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +70 +A8 +20 +10 +00 +F0 +88 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F28 +ENCODING 7976 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +40 +40 +80 +44 +44 +44 +7C +44 +44 +44 +44 +ENDCHAR +STARTCHAR uni1F29 +ENCODING 7977 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +80 +80 +40 +88 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F2A +ENCODING 7978 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +50 +48 +80 +44 +44 +44 +7C +44 +44 +44 +44 +ENDCHAR +STARTCHAR uni1F2B +ENCODING 7979 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +A0 +90 +40 +88 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F2C +ENCODING 7980 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +44 +48 +80 +44 +44 +44 +7C +44 +44 +44 +44 +ENDCHAR +STARTCHAR uni1F2D +ENCODING 7981 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +88 +90 +40 +88 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F2E +ENCODING 7982 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +A8 +20 +40 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F2F +ENCODING 7983 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +A8 +20 +10 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1F30 +ENCODING 7984 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 11 2 0 +BITMAP +20 +20 +40 +00 +C0 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR uni1F31 +ENCODING 7985 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 11 2 0 +BITMAP +80 +80 +40 +00 +C0 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR uni1F32 +ENCODING 7986 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +50 +88 +00 +60 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni1F33 +ENCODING 7987 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +80 +90 +48 +00 +60 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni1F34 +ENCODING 7988 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +48 +90 +00 +60 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni1F35 +ENCODING 7989 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +80 +88 +50 +00 +60 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni1F36 +ENCODING 7990 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +A8 +20 +40 +00 +60 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni1F37 +ENCODING 7991 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +A8 +20 +10 +00 +60 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni1F38 +ENCODING 7992 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +40 +40 +80 +7C +10 +10 +10 +10 +10 +10 +7C +ENDCHAR +STARTCHAR uni1F39 +ENCODING 7993 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +80 +80 +40 +7C +10 +10 +10 +10 +10 +10 +7C +ENDCHAR +STARTCHAR uni1F3A +ENCODING 7994 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +50 +48 +80 +7C +10 +10 +10 +10 +10 +10 +7C +ENDCHAR +STARTCHAR uni1F3B +ENCODING 7995 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +90 +88 +40 +7C +10 +10 +10 +10 +10 +10 +7C +ENDCHAR +STARTCHAR uni1F3C +ENCODING 7996 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +48 +50 +80 +7C +10 +10 +10 +10 +10 +10 +7C +ENDCHAR +STARTCHAR uni1F3D +ENCODING 7997 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +88 +90 +40 +7C +10 +10 +10 +10 +10 +10 +7C +ENDCHAR +STARTCHAR uni1F3E +ENCODING 7998 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +70 +A8 +20 +40 +7C +10 +10 +10 +10 +10 +7C +ENDCHAR +STARTCHAR uni1F3F +ENCODING 7999 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +70 +A8 +20 +10 +7C +10 +10 +10 +10 +10 +7C +ENDCHAR +STARTCHAR uni1F40 +ENCODING 8000 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +10 +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F41 +ENCODING 8001 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +40 +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F42 +ENCODING 8002 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +50 +88 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F43 +ENCODING 8003 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +80 +90 +48 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F44 +ENCODING 8004 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +48 +90 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F45 +ENCODING 8005 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +80 +88 +50 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F48 +ENCODING 8008 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +10 +20 +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F49 +ENCODING 8009 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +40 +20 +70 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F4A +ENCODING 8010 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +50 +48 +80 +38 +44 +44 +44 +44 +44 +44 +38 +ENDCHAR +STARTCHAR uni1F4B +ENCODING 8011 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +90 +88 +40 +38 +44 +44 +44 +44 +44 +44 +38 +ENDCHAR +STARTCHAR uni1F4C +ENCODING 8012 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +48 +50 +80 +38 +44 +44 +44 +44 +44 +44 +38 +ENDCHAR +STARTCHAR uni1F4D +ENCODING 8013 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +88 +90 +40 +38 +44 +44 +44 +44 +44 +44 +38 +ENDCHAR +STARTCHAR uni1F50 +ENCODING 8016 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +10 +20 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F51 +ENCODING 8017 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +40 +20 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F52 +ENCODING 8018 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +50 +88 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F53 +ENCODING 8019 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +80 +90 +48 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F54 +ENCODING 8020 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +48 +90 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F55 +ENCODING 8021 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +80 +88 +50 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F56 +ENCODING 8022 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +A8 +20 +40 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F57 +ENCODING 8023 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +A8 +20 +10 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F59 +ENCODING 8025 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +40 +20 +88 +88 +50 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1F5B +ENCODING 8027 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +48 +20 +88 +88 +50 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1F5D +ENCODING 8029 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +88 +90 +40 +88 +88 +50 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1F5F +ENCODING 8031 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +A8 +20 +10 +88 +88 +50 +50 +20 +20 +20 +ENDCHAR +STARTCHAR uni1F60 +ENCODING 8032 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +10 +20 +00 +88 +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F61 +ENCODING 8033 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +40 +20 +00 +88 +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F62 +ENCODING 8034 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +50 +88 +00 +88 +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F63 +ENCODING 8035 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +80 +90 +48 +00 +88 +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F64 +ENCODING 8036 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +48 +90 +00 +88 +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F65 +ENCODING 8037 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +80 +88 +50 +00 +88 +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F66 +ENCODING 8038 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +A8 +20 +40 +88 +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F67 +ENCODING 8039 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +A8 +20 +10 +88 +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F68 +ENCODING 8040 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +40 +40 +80 +38 +44 +44 +44 +44 +44 +28 +6C +ENDCHAR +STARTCHAR uni1F69 +ENCODING 8041 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +80 +80 +40 +38 +44 +44 +44 +44 +44 +28 +6C +ENDCHAR +STARTCHAR uni1F6A +ENCODING 8042 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +50 +48 +80 +38 +44 +44 +44 +44 +44 +28 +6C +ENDCHAR +STARTCHAR uni1F6B +ENCODING 8043 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +90 +88 +40 +38 +44 +44 +44 +44 +44 +28 +6C +ENDCHAR +STARTCHAR uni1F6C +ENCODING 8044 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +48 +50 +80 +38 +44 +44 +44 +44 +44 +28 +6C +ENDCHAR +STARTCHAR uni1F6D +ENCODING 8045 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +88 +90 +40 +38 +44 +44 +44 +44 +44 +28 +6C +ENDCHAR +STARTCHAR uni1F6E +ENCODING 8046 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +A8 +20 +40 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F6F +ENCODING 8047 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +A8 +20 +10 +70 +88 +88 +88 +88 +50 +D8 +ENDCHAR +STARTCHAR uni1F70 +ENCODING 8048 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +40 +20 +00 +68 +98 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni1F71 +ENCODING 8049 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +10 +20 +00 +68 +98 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni1F72 +ENCODING 8050 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +40 +20 +00 +78 +80 +80 +70 +80 +80 +78 +ENDCHAR +STARTCHAR uni1F73 +ENCODING 8051 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +10 +20 +00 +78 +80 +80 +70 +80 +80 +78 +ENDCHAR +STARTCHAR uni1F74 +ENCODING 8052 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +40 +20 +00 +F0 +88 +88 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F75 +ENCODING 8053 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +10 +20 +00 +F0 +88 +88 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1F76 +ENCODING 8054 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 10 2 0 +BITMAP +80 +40 +00 +C0 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR uni1F77 +ENCODING 8055 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 10 2 0 +BITMAP +20 +40 +00 +C0 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR uni1F78 +ENCODING 8056 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +40 +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F79 +ENCODING 8057 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +10 +20 +00 +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F7A +ENCODING 8058 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +40 +20 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F7B +ENCODING 8059 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +10 +20 +00 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1F7C +ENCODING 8060 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +40 +20 +00 +88 +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F7D +ENCODING 8061 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +10 +20 +00 +88 +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1F80 +ENCODING 8064 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +10 +10 +20 +00 +68 +98 +88 +88 +88 +98 +68 +80 +40 +ENDCHAR +STARTCHAR uni1F81 +ENCODING 8065 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +40 +40 +20 +00 +68 +98 +88 +88 +88 +98 +68 +80 +40 +ENDCHAR +STARTCHAR uni1F82 +ENCODING 8066 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +40 +50 +88 +00 +68 +98 +88 +88 +88 +98 +68 +80 +40 +ENDCHAR +STARTCHAR uni1F83 +ENCODING 8067 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +80 +90 +48 +00 +68 +98 +88 +88 +88 +98 +68 +80 +40 +ENDCHAR +STARTCHAR uni1F84 +ENCODING 8068 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +40 +48 +90 +00 +68 +98 +88 +88 +88 +98 +68 +80 +40 +ENDCHAR +STARTCHAR uni1F85 +ENCODING 8069 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +80 +88 +50 +00 +68 +98 +88 +88 +88 +98 +68 +80 +40 +ENDCHAR +STARTCHAR uni1F86 +ENCODING 8070 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +70 +A8 +20 +40 +00 +68 +98 +88 +88 +98 +68 +80 +40 +ENDCHAR +STARTCHAR uni1F87 +ENCODING 8071 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +70 +A8 +20 +10 +00 +68 +98 +88 +88 +98 +68 +80 +40 +ENDCHAR +STARTCHAR uni1F88 +ENCODING 8072 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +40 +40 +80 +40 +A8 +A8 +E8 +A8 +A8 +A8 +A4 +ENDCHAR +STARTCHAR uni1F89 +ENCODING 8073 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +20 +20 +10 +40 +A8 +A8 +E8 +A8 +A8 +A8 +A4 +ENDCHAR +STARTCHAR uni1F8A +ENCODING 8074 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +50 +48 +80 +20 +54 +54 +74 +54 +54 +54 +52 +ENDCHAR +STARTCHAR uni1F8B +ENCODING 8075 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +50 +48 +20 +40 +A8 +A8 +E8 +A8 +A8 +A8 +A4 +ENDCHAR +STARTCHAR uni1F8C +ENCODING 8076 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +48 +50 +80 +20 +54 +54 +74 +54 +54 +54 +52 +ENDCHAR +STARTCHAR uni1F8D +ENCODING 8077 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +44 +48 +20 +40 +A8 +A8 +E8 +A8 +A8 +A8 +A4 +ENDCHAR +STARTCHAR uni1F8E +ENCODING 8078 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +70 +A8 +20 +40 +24 +54 +54 +74 +54 +54 +52 +ENDCHAR +STARTCHAR uni1F8F +ENCODING 8079 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +70 +A8 +20 +10 +24 +54 +54 +74 +54 +54 +52 +ENDCHAR +STARTCHAR uni1F90 +ENCODING 8080 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +10 +10 +20 +00 +F0 +88 +88 +88 +88 +88 +08 +88 +48 +ENDCHAR +STARTCHAR uni1F91 +ENCODING 8081 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +40 +40 +20 +00 +F0 +88 +88 +88 +88 +88 +08 +88 +48 +ENDCHAR +STARTCHAR uni1F92 +ENCODING 8082 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +40 +50 +88 +00 +F0 +88 +88 +88 +88 +88 +08 +88 +48 +ENDCHAR +STARTCHAR uni1F93 +ENCODING 8083 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +80 +90 +48 +00 +F0 +88 +88 +88 +88 +88 +08 +88 +48 +ENDCHAR +STARTCHAR uni1F94 +ENCODING 8084 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +40 +48 +90 +00 +F0 +88 +88 +88 +88 +88 +08 +88 +48 +ENDCHAR +STARTCHAR uni1F95 +ENCODING 8085 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +80 +88 +50 +00 +F0 +88 +88 +88 +88 +88 +08 +88 +48 +ENDCHAR +STARTCHAR uni1F96 +ENCODING 8086 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +70 +A8 +20 +40 +00 +F0 +88 +88 +88 +88 +08 +88 +48 +ENDCHAR +STARTCHAR uni1F97 +ENCODING 8087 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +70 +A8 +20 +10 +00 +F0 +88 +88 +88 +88 +08 +88 +48 +ENDCHAR +STARTCHAR uni1F98 +ENCODING 8088 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +40 +40 +80 +00 +A0 +A8 +A8 +E8 +A8 +A8 +A4 +ENDCHAR +STARTCHAR uni1F99 +ENCODING 8089 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +20 +20 +10 +00 +A0 +A8 +A8 +E8 +A8 +A8 +A4 +ENDCHAR +STARTCHAR uni1F9A +ENCODING 8090 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +50 +48 +80 +00 +50 +54 +54 +74 +54 +54 +52 +ENDCHAR +STARTCHAR uni1F9B +ENCODING 8091 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +50 +48 +20 +00 +A0 +A8 +A8 +E8 +A8 +A8 +A4 +ENDCHAR +STARTCHAR uni1F9C +ENCODING 8092 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +48 +50 +80 +00 +50 +54 +54 +74 +54 +54 +52 +ENDCHAR +STARTCHAR uni1F9D +ENCODING 8093 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +44 +48 +20 +00 +A0 +A8 +A8 +E8 +A8 +A8 +A4 +ENDCHAR +STARTCHAR uni1F9E +ENCODING 8094 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +70 +A8 +20 +40 +00 +A0 +A8 +E8 +A8 +A8 +A4 +ENDCHAR +STARTCHAR uni1F9F +ENCODING 8095 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +70 +A8 +20 +10 +A0 +A8 +A8 +E8 +A8 +A8 +A4 +ENDCHAR +STARTCHAR uni1FA0 +ENCODING 8096 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +10 +10 +20 +00 +88 +88 +88 +A8 +A8 +A8 +50 +80 +40 +ENDCHAR +STARTCHAR uni1FA1 +ENCODING 8097 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +40 +40 +20 +00 +88 +88 +88 +A8 +A8 +A8 +50 +80 +40 +ENDCHAR +STARTCHAR uni1FA2 +ENCODING 8098 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +40 +50 +88 +00 +88 +88 +88 +A8 +A8 +A8 +50 +80 +40 +ENDCHAR +STARTCHAR uni1FA3 +ENCODING 8099 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +80 +90 +48 +00 +88 +88 +88 +A8 +A8 +A8 +50 +80 +40 +ENDCHAR +STARTCHAR uni1FA4 +ENCODING 8100 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +40 +48 +90 +00 +88 +88 +88 +A8 +A8 +A8 +50 +80 +40 +ENDCHAR +STARTCHAR uni1FA5 +ENCODING 8101 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +80 +88 +50 +00 +88 +88 +88 +A8 +A8 +A8 +50 +80 +40 +ENDCHAR +STARTCHAR uni1FA6 +ENCODING 8102 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +70 +A8 +20 +40 +88 +88 +88 +A8 +A8 +A8 +50 +80 +40 +ENDCHAR +STARTCHAR uni1FA7 +ENCODING 8103 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +70 +A8 +20 +10 +88 +88 +88 +A8 +A8 +A8 +50 +80 +40 +ENDCHAR +STARTCHAR uni1FA8 +ENCODING 8104 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +40 +40 +80 +40 +A8 +A8 +A8 +A8 +A8 +48 +E4 +ENDCHAR +STARTCHAR uni1FA9 +ENCODING 8105 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +20 +20 +10 +40 +A8 +A8 +A8 +A8 +A8 +48 +E4 +ENDCHAR +STARTCHAR uni1FAA +ENCODING 8106 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +50 +48 +80 +20 +54 +54 +54 +54 +54 +24 +72 +ENDCHAR +STARTCHAR uni1FAB +ENCODING 8107 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +50 +48 +20 +40 +A8 +A8 +A8 +A8 +A8 +48 +E4 +ENDCHAR +STARTCHAR uni1FAC +ENCODING 8108 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +48 +50 +80 +20 +54 +54 +54 +54 +54 +24 +72 +ENDCHAR +STARTCHAR uni1FAD +ENCODING 8109 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +44 +48 +20 +40 +A8 +A8 +A8 +A8 +A8 +48 +E4 +ENDCHAR +STARTCHAR uni1FAE +ENCODING 8110 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +70 +A8 +20 +40 +20 +54 +54 +54 +54 +24 +72 +ENDCHAR +STARTCHAR uni1FAF +ENCODING 8111 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 1 0 +BITMAP +70 +A8 +20 +10 +40 +A8 +A8 +A8 +A8 +48 +E4 +ENDCHAR +STARTCHAR uni1FB0 +ENCODING 8112 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +88 +70 +00 +68 +98 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni1FB1 +ENCODING 8113 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +00 +68 +98 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni1FB2 +ENCODING 8114 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +40 +20 +00 +68 +98 +88 +88 +88 +98 +68 +80 +40 +ENDCHAR +STARTCHAR uni1FB3 +ENCODING 8115 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +68 +98 +88 +88 +88 +98 +68 +80 +40 +ENDCHAR +STARTCHAR uni1FB4 +ENCODING 8116 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +10 +20 +00 +68 +98 +88 +88 +88 +98 +68 +80 +40 +ENDCHAR +STARTCHAR uni1FB6 +ENCODING 8118 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +70 +88 +00 +68 +98 +88 +88 +88 +98 +68 +ENDCHAR +STARTCHAR uni1FB7 +ENCODING 8119 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +70 +88 +00 +68 +98 +88 +88 +88 +98 +68 +80 +40 +ENDCHAR +STARTCHAR uni1FB8 +ENCODING 8120 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +88 +70 +00 +70 +88 +88 +88 +F8 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FB9 +ENCODING 8121 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +00 +70 +88 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FBA +ENCODING 8122 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +20 +70 +88 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FBB +ENCODING 8123 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +20 +70 +88 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FBC +ENCODING 8124 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +40 +A0 +A8 +A8 +E8 +A8 +A8 +A8 +A4 +ENDCHAR +STARTCHAR uni1FBD +ENCODING 8125 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 2 3 2 8 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR uni1FBE +ENCODING 8126 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 2 2 2 -2 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni1FBF +ENCODING 8127 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 2 3 2 8 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR uni1FC0 +ENCODING 8128 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 2 1 9 +BITMAP +70 +88 +ENDCHAR +STARTCHAR uni1FC1 +ENCODING 8129 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 4 1 7 +BITMAP +70 +88 +00 +50 +ENDCHAR +STARTCHAR uni1FC2 +ENCODING 8130 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +40 +20 +00 +F0 +88 +88 +88 +88 +88 +08 +88 +48 +ENDCHAR +STARTCHAR uni1FC3 +ENCODING 8131 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +F0 +88 +88 +88 +88 +88 +08 +88 +48 +ENDCHAR +STARTCHAR uni1FC4 +ENCODING 8132 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +10 +20 +00 +F0 +88 +88 +88 +88 +88 +08 +88 +48 +ENDCHAR +STARTCHAR uni1FC6 +ENCODING 8134 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +70 +88 +00 +F0 +88 +88 +88 +88 +88 +88 +08 +08 +ENDCHAR +STARTCHAR uni1FC7 +ENCODING 8135 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +70 +88 +00 +F0 +88 +88 +88 +88 +88 +08 +88 +48 +ENDCHAR +STARTCHAR uni1FC8 +ENCODING 8136 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +20 +F8 +80 +80 +80 +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1FC9 +ENCODING 8137 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +20 +F8 +80 +80 +80 +F8 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni1FCA +ENCODING 8138 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +20 +88 +88 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FCB +ENCODING 8139 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +20 +88 +88 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni1FCC +ENCODING 8140 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +A0 +A0 +A8 +A8 +E8 +A8 +A8 +A8 +A4 +ENDCHAR +STARTCHAR uni1FCD +ENCODING 8141 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 3 1 8 +BITMAP +40 +50 +88 +ENDCHAR +STARTCHAR uni1FCE +ENCODING 8142 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 3 1 8 +BITMAP +40 +50 +88 +ENDCHAR +STARTCHAR uni1FCF +ENCODING 8143 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 5 1 6 +BITMAP +70 +88 +20 +20 +40 +ENDCHAR +STARTCHAR uni1FD0 +ENCODING 8144 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +88 +70 +00 +60 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni1FD1 +ENCODING 8145 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 9 2 0 +BITMAP +E0 +00 +C0 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR uni1FD2 +ENCODING 8146 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 11 2 0 +BITMAP +80 +40 +00 +A0 +00 +C0 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR uni1FD3 +ENCODING 8147 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 11 2 0 +BITMAP +20 +40 +00 +A0 +00 +C0 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR uni1FD6 +ENCODING 8150 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +70 +88 +00 +60 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni1FD7 +ENCODING 8151 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +88 +00 +50 +00 +60 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni1FD8 +ENCODING 8152 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +88 +70 +00 +F8 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni1FD9 +ENCODING 8153 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni1FDA +ENCODING 8154 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +20 +F8 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni1FDB +ENCODING 8155 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +20 +F8 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni1FDD +ENCODING 8157 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 3 1 8 +BITMAP +80 +90 +48 +ENDCHAR +STARTCHAR uni1FDE +ENCODING 8158 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 3 1 8 +BITMAP +80 +88 +50 +ENDCHAR +STARTCHAR uni1FDF +ENCODING 8159 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 4 1 7 +BITMAP +70 +A8 +20 +10 +ENDCHAR +STARTCHAR uni1FE0 +ENCODING 8160 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +88 +70 +00 +88 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni1FE1 +ENCODING 8161 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +00 +88 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FE2 +ENCODING 8162 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +20 +00 +50 +00 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni1FE3 +ENCODING 8163 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +20 +00 +50 +00 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni1FE4 +ENCODING 8164 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +20 +20 +40 +00 +70 +88 +88 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR uni1FE5 +ENCODING 8165 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +20 +20 +10 +00 +70 +88 +88 +88 +88 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR uni1FE6 +ENCODING 8166 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +70 +88 +00 +88 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni1FE7 +ENCODING 8167 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +88 +00 +50 +00 +88 +88 +88 +88 +88 +78 +ENDCHAR +STARTCHAR uni1FE8 +ENCODING 8168 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +88 +70 +00 +88 +88 +50 +50 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1FE9 +ENCODING 8169 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +70 +00 +88 +88 +50 +50 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1FEA +ENCODING 8170 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +20 +88 +88 +50 +50 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1FEB +ENCODING 8171 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +20 +88 +88 +50 +50 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1FEC +ENCODING 8172 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +40 +20 +F0 +88 +88 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni1FED +ENCODING 8173 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 3 4 2 7 +BITMAP +80 +40 +00 +A0 +ENDCHAR +STARTCHAR uni1FEE +ENCODING 8174 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 3 4 2 7 +BITMAP +20 +40 +00 +A0 +ENDCHAR +STARTCHAR uni1FEF +ENCODING 8175 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 2 2 2 9 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni1FF2 +ENCODING 8178 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +40 +20 +00 +88 +88 +88 +A8 +A8 +A8 +50 +80 +40 +ENDCHAR +STARTCHAR uni1FF3 +ENCODING 8179 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 -2 +BITMAP +88 +88 +88 +A8 +A8 +A8 +50 +80 +40 +ENDCHAR +STARTCHAR uni1FF4 +ENCODING 8180 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +10 +20 +00 +88 +88 +88 +A8 +A8 +A8 +50 +80 +40 +ENDCHAR +STARTCHAR uni1FF6 +ENCODING 8182 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +70 +88 +00 +88 +88 +88 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR uni1FF7 +ENCODING 8183 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +70 +88 +00 +88 +88 +88 +A8 +A8 +A8 +50 +80 +40 +ENDCHAR +STARTCHAR uni1FF8 +ENCODING 8184 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +20 +70 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FF9 +ENCODING 8185 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +20 +70 +88 +88 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni1FFA +ENCODING 8186 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +40 +20 +70 +88 +88 +88 +88 +88 +50 +50 +D8 +ENDCHAR +STARTCHAR uni1FFB +ENCODING 8187 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +10 +20 +70 +88 +88 +88 +88 +88 +50 +50 +D8 +ENDCHAR +STARTCHAR uni1FFC +ENCODING 8188 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 1 0 +BITMAP +40 +A0 +A8 +A8 +A8 +A8 +A8 +48 +E4 +ENDCHAR +STARTCHAR uni1FFD +ENCODING 8189 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 2 2 3 9 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni1FFE +ENCODING 8190 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 2 3 2 8 +BITMAP +80 +80 +40 +ENDCHAR +STARTCHAR uni2000 +ENCODING 8192 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 1 6 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2001 +ENCODING 8193 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 1 6 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2002 +ENCODING 8194 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 1 6 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2003 +ENCODING 8195 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 1 6 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2004 +ENCODING 8196 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 1 6 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2005 +ENCODING 8197 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 1 6 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2006 +ENCODING 8198 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 1 6 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2007 +ENCODING 8199 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 1 6 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2008 +ENCODING 8200 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 1 6 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2009 +ENCODING 8201 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 1 6 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni200A +ENCODING 8202 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 1 6 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2010 +ENCODING 8208 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 1 1 4 +BITMAP +F8 +ENDCHAR +STARTCHAR uni2011 +ENCODING 8209 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 1 1 4 +BITMAP +F8 +ENDCHAR +STARTCHAR figuredash +ENCODING 8210 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 1 1 4 +BITMAP +F8 +ENDCHAR +STARTCHAR endash +ENCODING 8211 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 1 0 4 +BITMAP +FE +ENDCHAR +STARTCHAR emdash +ENCODING 8212 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 1 0 4 +BITMAP +FE +ENDCHAR +STARTCHAR afii00208 +ENCODING 8213 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 1 0 4 +BITMAP +FE +ENDCHAR +STARTCHAR uni2016 +ENCODING 8214 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 12 2 -2 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR underscoredbl +ENCODING 8215 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 3 0 -2 +BITMAP +FE +00 +FE +ENDCHAR +STARTCHAR quoteleft +ENCODING 8216 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 3 3 7 +BITMAP +40 +80 +80 +ENDCHAR +STARTCHAR quoteright +ENCODING 8217 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 3 2 7 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR quotesinglbase +ENCODING 8218 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 3 2 -2 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR quotereversed +ENCODING 8219 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 3 3 7 +BITMAP +80 +80 +40 +ENDCHAR +STARTCHAR quotedblleft +ENCODING 8220 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 3 2 7 +BITMAP +50 +A0 +A0 +ENDCHAR +STARTCHAR quotedblright +ENCODING 8221 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 3 1 7 +BITMAP +50 +50 +A0 +ENDCHAR +STARTCHAR quotedblbase +ENCODING 8222 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 3 0 0 +BITMAP +50 +50 +A0 +ENDCHAR +STARTCHAR uni201F +ENCODING 8223 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 3 1 7 +BITMAP +A0 +A0 +50 +ENDCHAR +STARTCHAR dagger +ENCODING 8224 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +20 +20 +F8 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR daggerdbl +ENCODING 8225 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +20 +20 +20 +F8 +20 +20 +F8 +20 +20 +20 +ENDCHAR +STARTCHAR bullet +ENCODING 8226 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 3 +BITMAP +70 +F8 +F8 +F8 +70 +ENDCHAR +STARTCHAR uni2023 +ENCODING 8227 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 1 3 +BITMAP +C0 +F0 +FC +F0 +C0 +ENDCHAR +STARTCHAR onedotenleader +ENCODING 8228 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 2 3 0 +BITMAP +80 +80 +ENDCHAR +STARTCHAR twodotenleader +ENCODING 8229 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 2 2 0 +BITMAP +A0 +A0 +ENDCHAR +STARTCHAR ellipsis +ENCODING 8230 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 2 1 0 +BITMAP +A8 +A8 +ENDCHAR +STARTCHAR uni2027 +ENCODING 8231 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 2 3 4 +BITMAP +80 +80 +ENDCHAR +STARTCHAR perthousand +ENCODING 8240 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +40 +A0 +40 +0C +30 +C0 +00 +48 +B4 +48 +ENDCHAR +STARTCHAR uni2031 +ENCODING 8241 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +40 +A0 +40 +0C +30 +C0 +00 +54 +AA +54 +ENDCHAR +STARTCHAR minute +ENCODING 8242 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 3 3 7 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR second +ENCODING 8243 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 3 2 7 +BITMAP +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni2034 +ENCODING 8244 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 3 1 7 +BITMAP +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2035 +ENCODING 8245 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 2 3 3 7 +BITMAP +80 +80 +40 +ENDCHAR +STARTCHAR uni2036 +ENCODING 8246 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 4 3 2 7 +BITMAP +A0 +A0 +50 +ENDCHAR +STARTCHAR uni2037 +ENCODING 8247 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 3 1 7 +BITMAP +A8 +A8 +54 +ENDCHAR +STARTCHAR uni2038 +ENCODING 8248 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 3 1 -2 +BITMAP +20 +50 +88 +ENDCHAR +STARTCHAR guilsinglleft +ENCODING 8249 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 5 1 2 +BITMAP +20 +40 +80 +40 +20 +ENDCHAR +STARTCHAR guilsinglright +ENCODING 8250 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 5 2 2 +BITMAP +80 +40 +20 +40 +80 +ENDCHAR +STARTCHAR uni203B +ENCODING 8251 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +10 +44 +28 +92 +28 +44 +10 +ENDCHAR +STARTCHAR exclamdbl +ENCODING 8252 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 9 2 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +00 +A0 +A0 +ENDCHAR +STARTCHAR uni203D +ENCODING 8253 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F0 +28 +28 +30 +20 +20 +00 +20 +20 +ENDCHAR +STARTCHAR uni203E +ENCODING 8254 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 1 1 10 +BITMAP +F8 +ENDCHAR +STARTCHAR uni2043 +ENCODING 8259 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 1 1 5 +BITMAP +F8 +ENDCHAR +STARTCHAR uni2047 +ENCODING 8263 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +D8 +24 +24 +24 +48 +48 +00 +48 +48 +ENDCHAR +STARTCHAR uni2048 +ENCODING 8264 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +C8 +28 +28 +28 +48 +48 +00 +48 +48 +ENDCHAR +STARTCHAR uni2049 +ENCODING 8265 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +B0 +88 +88 +88 +90 +90 +00 +90 +90 +ENDCHAR +STARTCHAR uni204B +ENCODING 8267 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F0 +B8 +B8 +B8 +B0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni204C +ENCODING 8268 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 5 2 3 +BITMAP +50 +D0 +D0 +D0 +50 +ENDCHAR +STARTCHAR uni204D +ENCODING 8269 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 5 1 3 +BITMAP +A0 +B0 +B0 +B0 +A0 +ENDCHAR +STARTCHAR uni204E +ENCODING 8270 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +50 +20 +F8 +20 +50 +ENDCHAR +STARTCHAR uni204F +ENCODING 8271 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 8 3 -2 +BITMAP +80 +80 +00 +00 +80 +80 +80 +40 +ENDCHAR +STARTCHAR uni2051 +ENCODING 8273 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -1 +BITMAP +50 +20 +F8 +20 +50 +00 +50 +20 +F8 +20 +50 +ENDCHAR +STARTCHAR uni2055 +ENCODING 8277 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 5 1 3 +BITMAP +A8 +70 +F8 +70 +A8 +ENDCHAR +STARTCHAR uni2056 +ENCODING 8278 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 5 1 3 +BITMAP +10 +00 +80 +00 +10 +ENDCHAR +STARTCHAR uni2058 +ENCODING 8280 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 5 1 3 +BITMAP +20 +00 +88 +00 +20 +ENDCHAR +STARTCHAR uni2059 +ENCODING 8281 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 5 1 3 +BITMAP +88 +00 +20 +00 +88 +ENDCHAR +STARTCHAR uni205A +ENCODING 8282 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 1 7 3 2 +BITMAP +80 +00 +00 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni205B +ENCODING 8283 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 7 1 2 +BITMAP +20 +00 +00 +88 +00 +00 +20 +ENDCHAR +STARTCHAR uni205C +ENCODING 8284 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +10 +54 +10 +FE +10 +54 +10 +ENDCHAR +STARTCHAR uni205D +ENCODING 8285 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 1 7 3 2 +BITMAP +80 +00 +00 +80 +00 +00 +80 +ENDCHAR +STARTCHAR uni205E +ENCODING 8286 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 1 7 3 2 +BITMAP +80 +00 +80 +00 +80 +00 +80 +ENDCHAR +STARTCHAR uni2070 +ENCODING 8304 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 5 1 6 +BITMAP +60 +B0 +D0 +90 +60 +ENDCHAR +STARTCHAR uni2071 +ENCODING 8305 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 5 2 6 +BITMAP +80 +00 +80 +80 +80 +ENDCHAR +STARTCHAR uni2074 +ENCODING 8308 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 5 1 6 +BITMAP +20 +60 +A0 +F0 +20 +ENDCHAR +STARTCHAR uni2075 +ENCODING 8309 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 5 1 6 +BITMAP +F0 +80 +E0 +10 +E0 +ENDCHAR +STARTCHAR uni2076 +ENCODING 8310 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 5 1 6 +BITMAP +60 +80 +E0 +90 +60 +ENDCHAR +STARTCHAR uni2077 +ENCODING 8311 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 5 1 6 +BITMAP +F0 +10 +20 +40 +40 +ENDCHAR +STARTCHAR uni2078 +ENCODING 8312 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 5 1 6 +BITMAP +60 +90 +60 +90 +60 +ENDCHAR +STARTCHAR uni2079 +ENCODING 8313 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 5 1 6 +BITMAP +60 +90 +70 +10 +60 +ENDCHAR +STARTCHAR uni207A +ENCODING 8314 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 3 2 7 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR uni207B +ENCODING 8315 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 1 2 8 +BITMAP +E0 +ENDCHAR +STARTCHAR uni207C +ENCODING 8316 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 3 2 7 +BITMAP +E0 +00 +E0 +ENDCHAR +STARTCHAR uni207D +ENCODING 8317 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 5 3 6 +BITMAP +40 +80 +80 +80 +40 +ENDCHAR +STARTCHAR uni207E +ENCODING 8318 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 5 2 6 +BITMAP +80 +40 +40 +40 +80 +ENDCHAR +STARTCHAR uni207F +ENCODING 8319 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 4 1 6 +BITMAP +E0 +90 +90 +90 +ENDCHAR +STARTCHAR uni2080 +ENCODING 8320 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 5 1 -1 +BITMAP +60 +B0 +D0 +90 +60 +ENDCHAR +STARTCHAR uni2081 +ENCODING 8321 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 5 2 -1 +BITMAP +40 +C0 +40 +40 +40 +ENDCHAR +STARTCHAR uni2082 +ENCODING 8322 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 5 1 -1 +BITMAP +60 +90 +20 +40 +F0 +ENDCHAR +STARTCHAR uni2083 +ENCODING 8323 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 5 1 -1 +BITMAP +E0 +10 +60 +10 +E0 +ENDCHAR +STARTCHAR uni2084 +ENCODING 8324 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 5 1 -1 +BITMAP +20 +60 +A0 +F0 +20 +ENDCHAR +STARTCHAR uni2085 +ENCODING 8325 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 5 1 -1 +BITMAP +F0 +80 +E0 +10 +E0 +ENDCHAR +STARTCHAR uni2086 +ENCODING 8326 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 5 1 -1 +BITMAP +60 +80 +E0 +90 +60 +ENDCHAR +STARTCHAR uni2087 +ENCODING 8327 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 5 1 -1 +BITMAP +F0 +10 +20 +40 +40 +ENDCHAR +STARTCHAR uni2088 +ENCODING 8328 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 5 1 -1 +BITMAP +60 +90 +60 +90 +60 +ENDCHAR +STARTCHAR uni2089 +ENCODING 8329 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 5 1 -1 +BITMAP +60 +90 +70 +10 +60 +ENDCHAR +STARTCHAR uni208A +ENCODING 8330 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 3 2 0 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR uni208B +ENCODING 8331 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 1 2 1 +BITMAP +E0 +ENDCHAR +STARTCHAR uni208C +ENCODING 8332 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 3 2 0 +BITMAP +E0 +00 +E0 +ENDCHAR +STARTCHAR uni208D +ENCODING 8333 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 5 3 -1 +BITMAP +40 +80 +80 +80 +40 +ENDCHAR +STARTCHAR uni208E +ENCODING 8334 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 5 2 -1 +BITMAP +80 +40 +40 +40 +80 +ENDCHAR +STARTCHAR uni2090 +ENCODING 8336 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 5 1 -1 +BITMAP +60 +10 +70 +90 +70 +ENDCHAR +STARTCHAR uni2091 +ENCODING 8337 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 5 1 -1 +BITMAP +60 +90 +F0 +80 +70 +ENDCHAR +STARTCHAR uni2092 +ENCODING 8338 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 5 1 -1 +BITMAP +60 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uni2093 +ENCODING 8339 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 -1 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni2094 +ENCODING 8340 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 5 1 -1 +BITMAP +E0 +10 +F0 +90 +60 +ENDCHAR +STARTCHAR uni2095 +ENCODING 8341 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 6 1 -1 +BITMAP +80 +80 +E0 +90 +90 +90 +ENDCHAR +STARTCHAR uni2096 +ENCODING 8342 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 6 1 -1 +BITMAP +80 +90 +A0 +C0 +A0 +90 +ENDCHAR +STARTCHAR uni2097 +ENCODING 8343 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 6 1 -1 +BITMAP +C0 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni2098 +ENCODING 8344 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 -1 +BITMAP +F0 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2099 +ENCODING 8345 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 5 1 -1 +BITMAP +E0 +90 +90 +90 +90 +ENDCHAR +STARTCHAR uni209A +ENCODING 8346 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 6 1 -2 +BITMAP +E0 +90 +90 +E0 +80 +80 +ENDCHAR +STARTCHAR uni209B +ENCODING 8347 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 5 1 -1 +BITMAP +70 +80 +60 +10 +E0 +ENDCHAR +STARTCHAR uni209C +ENCODING 8348 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 6 2 -1 +BITMAP +80 +E0 +80 +80 +80 +60 +ENDCHAR +STARTCHAR uni20A0 +ENCODING 8352 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +60 +80 +9C +90 +90 +9C +70 +10 +1C +ENDCHAR +STARTCHAR colonmonetary +ENCODING 8353 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -1 +BITMAP +10 +3C +50 +90 +90 +90 +90 +90 +50 +3C +10 +ENDCHAR +STARTCHAR uni20A2 +ENCODING 8354 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +3C +40 +80 +8C +90 +90 +90 +40 +3C +ENDCHAR +STARTCHAR franc +ENCODING 8355 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +7C +40 +40 +40 +78 +40 +40 +E0 +40 +ENDCHAR +STARTCHAR lira +ENCODING 8356 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +38 +40 +40 +F0 +40 +F0 +40 +40 +F8 +ENDCHAR +STARTCHAR uni20A5 +ENCODING 8357 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 0 +BITMAP +28 +54 +56 +5C +74 +D4 +54 +ENDCHAR +STARTCHAR uni20A6 +ENCODING 8358 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +44 +44 +64 +FE +54 +FE +4C +44 +44 +ENDCHAR +STARTCHAR peseta +ENCODING 8359 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +C0 +A0 +A8 +A8 +DC +88 +88 +88 +84 +ENDCHAR +STARTCHAR uni20A8 +ENCODING 8360 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +E0 +90 +96 +98 +E8 +C4 +A2 +92 +9C +ENDCHAR +STARTCHAR uni20A9 +ENCODING 8361 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +44 +FE +44 +FE +44 +54 +54 +6C +44 +ENDCHAR +STARTCHAR afii57636 +ENCODING 8362 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +F2 +8A +8A +AA +AA +AA +A2 +A2 +9E +ENDCHAR +STARTCHAR dong +ENCODING 8363 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 1 -2 +BITMAP +08 +1C +08 +78 +88 +88 +88 +88 +78 +00 +F8 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +1C +20 +40 +F0 +40 +F0 +40 +20 +1C +ENDCHAR +STARTCHAR uni20AD +ENCODING 8365 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +44 +48 +50 +60 +FC +60 +50 +48 +44 +ENDCHAR +STARTCHAR uni20AE +ENCODING 8366 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +20 +20 +30 +60 +30 +60 +20 +20 +ENDCHAR +STARTCHAR uni20AF +ENCODING 8367 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +E0 +50 +50 +50 +50 +54 +5A +5A +AC +08 +08 +ENDCHAR +STARTCHAR uni20D9 +ENCODING 8409 +SWIDTH 0 0 +DWIDTH 7 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2102 +ENCODING 8450 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +3C +60 +A0 +A0 +A0 +A0 +A0 +60 +3C +ENDCHAR +STARTCHAR uni2103 +ENCODING 8451 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +40 +AC +50 +20 +20 +20 +20 +10 +0C +ENDCHAR +STARTCHAR afii61248 +ENCODING 8453 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +60 +80 +84 +68 +10 +20 +48 +94 +14 +08 +ENDCHAR +STARTCHAR uni2106 +ENCODING 8454 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +60 +80 +84 +68 +10 +20 +54 +94 +14 +08 +ENDCHAR +STARTCHAR uni2107 +ENCODING 8455 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +78 +80 +80 +80 +70 +80 +80 +80 +78 +ENDCHAR +STARTCHAR uni2109 +ENCODING 8457 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +40 +BC +50 +10 +1C +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni210D +ENCODING 8461 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +E4 +A4 +A4 +A4 +BC +A4 +A4 +A4 +E4 +ENDCHAR +STARTCHAR uni210E +ENCODING 8462 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +80 +80 +F0 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni210F +ENCODING 8463 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +40 +F0 +40 +78 +44 +44 +44 +44 +44 +ENDCHAR +STARTCHAR uni2115 +ENCODING 8469 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +84 +C4 +A4 +D4 +AC +94 +8C +84 +84 +ENDCHAR +STARTCHAR afii61352 +ENCODING 8470 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +96 +96 +D0 +D6 +B0 +B0 +90 +90 +90 +ENDCHAR +STARTCHAR uni2117 +ENCODING 8471 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +38 +44 +B2 +AA +B2 +A2 +A2 +44 +38 +ENDCHAR +STARTCHAR uni2119 +ENCODING 8473 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +F8 +A4 +A4 +A4 +B8 +A0 +A0 +A0 +E0 +ENDCHAR +STARTCHAR uni211A +ENCODING 8474 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +A4 +A4 +A4 +A4 +A4 +B4 +A8 +74 +ENDCHAR +STARTCHAR uni211D +ENCODING 8477 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +F8 +A4 +A4 +A4 +B8 +B0 +A8 +A4 +E4 +ENDCHAR +STARTCHAR uni2120 +ENCODING 8480 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 5 0 6 +BITMAP +74 +9C +54 +34 +D4 +ENDCHAR +STARTCHAR trademark +ENCODING 8482 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 6 +BITMAP +F4 +5C +54 +54 +54 +ENDCHAR +STARTCHAR uni2124 +ENCODING 8484 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +14 +28 +28 +50 +50 +A0 +A0 +FC +ENDCHAR +STARTCHAR uni2126 +ENCODING 8486 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +70 +88 +88 +88 +88 +88 +50 +50 +D8 +ENDCHAR +STARTCHAR uni2127 +ENCODING 8487 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +D8 +50 +50 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni212A +ENCODING 8490 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +90 +A0 +C0 +80 +C0 +A0 +90 +88 +ENDCHAR +STARTCHAR uni212B +ENCODING 8491 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +50 +20 +70 +88 +88 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni213E +ENCODING 8510 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +A0 +A0 +A0 +A0 +A0 +A0 +A0 +E0 +ENDCHAR +STARTCHAR uni213F +ENCODING 8511 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +A4 +A4 +A4 +A4 +A4 +A4 +A4 +E4 +ENDCHAR +STARTCHAR uni2140 +ENCODING 8512 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +A0 +50 +50 +28 +50 +50 +A0 +FC +ENDCHAR +STARTCHAR uni2145 +ENCODING 8517 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +F0 +A8 +A4 +A4 +A4 +A4 +A4 +A8 +F0 +ENDCHAR +STARTCHAR uni2146 +ENCODING 8518 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +1C +14 +74 +94 +94 +94 +94 +94 +7C +ENDCHAR +STARTCHAR uni2147 +ENCODING 8519 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +78 +A4 +A4 +BC +A0 +A0 +7C +ENDCHAR +STARTCHAR uni2148 +ENCODING 8520 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 3 10 2 0 +BITMAP +40 +40 +00 +E0 +A0 +A0 +A0 +A0 +A0 +E0 +ENDCHAR +STARTCHAR uni2149 +ENCODING 8521 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 12 1 -2 +BITMAP +10 +10 +00 +38 +28 +28 +28 +28 +28 +28 +28 +F0 +ENDCHAR +STARTCHAR uni2150 +ENCODING 8528 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +40 +C0 +40 +40 +40 +0C +30 +C0 +1C +04 +08 +10 +10 +ENDCHAR +STARTCHAR uni2151 +ENCODING 8529 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +40 +C0 +40 +40 +40 +0C +30 +C0 +08 +14 +0C +04 +18 +ENDCHAR +STARTCHAR uni2152 +ENCODING 8530 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +40 +C0 +40 +40 +40 +0C +30 +C0 +48 +D4 +54 +54 +48 +ENDCHAR +STARTCHAR onethird +ENCODING 8531 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +40 +C0 +40 +40 +40 +0C +30 +C0 +18 +04 +08 +04 +18 +ENDCHAR +STARTCHAR twothirds +ENCODING 8532 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +C0 +20 +40 +80 +E0 +0C +30 +C0 +18 +04 +08 +04 +18 +ENDCHAR +STARTCHAR uni2155 +ENCODING 8533 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +40 +C0 +40 +40 +40 +0C +30 +C0 +1C +10 +18 +04 +18 +ENDCHAR +STARTCHAR uni2156 +ENCODING 8534 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +C0 +20 +40 +80 +E0 +0C +30 +C0 +1C +10 +18 +04 +18 +ENDCHAR +STARTCHAR uni2157 +ENCODING 8535 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +C0 +20 +40 +20 +C0 +0C +30 +C0 +1C +10 +18 +04 +18 +ENDCHAR +STARTCHAR uni2158 +ENCODING 8536 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +20 +60 +A0 +E0 +20 +0C +30 +C0 +1C +10 +18 +04 +18 +ENDCHAR +STARTCHAR uni2159 +ENCODING 8537 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +40 +C0 +40 +40 +40 +0C +30 +C0 +0C +10 +18 +14 +08 +ENDCHAR +STARTCHAR uni215A +ENCODING 8538 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +E0 +80 +C0 +20 +C0 +0C +30 +C0 +0C +10 +18 +14 +08 +ENDCHAR +STARTCHAR oneeighth +ENCODING 8539 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +40 +C0 +40 +40 +40 +0C +30 +C0 +08 +14 +08 +14 +08 +ENDCHAR +STARTCHAR threeeighths +ENCODING 8540 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +C0 +20 +40 +20 +C0 +0C +30 +C0 +08 +14 +08 +14 +08 +ENDCHAR +STARTCHAR fiveeighths +ENCODING 8541 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +E0 +80 +C0 +20 +C0 +0C +30 +C0 +08 +14 +08 +14 +08 +ENDCHAR +STARTCHAR seveneighths +ENCODING 8542 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +E0 +20 +40 +80 +80 +0C +30 +C0 +08 +14 +08 +14 +08 +ENDCHAR +STARTCHAR uni215F +ENCODING 8543 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 8 0 3 +BITMAP +40 +C0 +40 +40 +40 +0C +30 +C0 +ENDCHAR +STARTCHAR uni2189 +ENCODING 8585 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +40 +A0 +A0 +A0 +40 +0C +30 +C0 +18 +04 +08 +04 +18 +ENDCHAR +STARTCHAR arrowleft +ENCODING 8592 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +20 +40 +FE +40 +20 +ENDCHAR +STARTCHAR arrowup +ENCODING 8593 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 2 +BITMAP +20 +70 +A8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR arrowright +ENCODING 8594 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +08 +04 +FE +04 +08 +ENDCHAR +STARTCHAR arrowdown +ENCODING 8595 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 2 +BITMAP +20 +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR arrowboth +ENCODING 8596 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +28 +44 +FE +44 +28 +ENDCHAR +STARTCHAR arrowupdn +ENCODING 8597 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 1 +BITMAP +20 +70 +A8 +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2196 +ENCODING 8598 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 3 +BITMAP +F0 +C0 +A0 +90 +08 +ENDCHAR +STARTCHAR uni2197 +ENCODING 8599 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 3 +BITMAP +78 +18 +28 +48 +80 +ENDCHAR +STARTCHAR uni2198 +ENCODING 8600 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 3 +BITMAP +80 +48 +28 +18 +78 +ENDCHAR +STARTCHAR uni2199 +ENCODING 8601 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 3 +BITMAP +08 +90 +A0 +C0 +F0 +ENDCHAR +STARTCHAR uni219A +ENCODING 8602 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +20 +44 +FE +48 +20 +ENDCHAR +STARTCHAR uni219B +ENCODING 8603 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +08 +24 +FE +44 +08 +ENDCHAR +STARTCHAR uni219C +ENCODING 8604 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +F0 +C4 +AA +A8 +10 +ENDCHAR +STARTCHAR uni219D +ENCODING 8605 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +1E +46 +AA +2A +10 +ENDCHAR +STARTCHAR uni219E +ENCODING 8606 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +28 +50 +FE +50 +28 +ENDCHAR +STARTCHAR uni219F +ENCODING 8607 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 7 1 2 +BITMAP +20 +70 +A8 +70 +A8 +20 +20 +ENDCHAR +STARTCHAR uni21A0 +ENCODING 8608 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +28 +14 +FE +14 +28 +ENDCHAR +STARTCHAR uni21A1 +ENCODING 8609 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 7 1 2 +BITMAP +20 +20 +A8 +70 +A8 +70 +20 +ENDCHAR +STARTCHAR uni21A2 +ENCODING 8610 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +20 +42 +FC +42 +20 +ENDCHAR +STARTCHAR uni21A3 +ENCODING 8611 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +08 +84 +7E +84 +08 +ENDCHAR +STARTCHAR uni21A4 +ENCODING 8612 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +20 +42 +FE +42 +20 +ENDCHAR +STARTCHAR uni21A5 +ENCODING 8613 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 2 +BITMAP +20 +70 +A8 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni21A6 +ENCODING 8614 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +08 +84 +FE +84 +08 +ENDCHAR +STARTCHAR uni21A7 +ENCODING 8615 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 2 +BITMAP +70 +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR arrowupdnbse +ENCODING 8616 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -1 +BITMAP +20 +70 +A8 +20 +20 +20 +A8 +70 +20 +00 +F8 +ENDCHAR +STARTCHAR uni21A9 +ENCODING 8617 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 6 0 3 +BITMAP +04 +22 +42 +FC +40 +20 +ENDCHAR +STARTCHAR uni21AA +ENCODING 8618 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 6 0 3 +BITMAP +40 +88 +84 +7E +04 +08 +ENDCHAR +STARTCHAR uni21AB +ENCODING 8619 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 6 0 3 +BITMAP +04 +2A +4A +FC +48 +28 +ENDCHAR +STARTCHAR uni21AC +ENCODING 8620 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 6 0 3 +BITMAP +40 +A8 +A4 +7E +24 +28 +ENDCHAR +STARTCHAR uni21B0 +ENCODING 8624 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 9 0 1 +BITMAP +20 +40 +FE +42 +22 +02 +02 +02 +02 +ENDCHAR +STARTCHAR uni21B1 +ENCODING 8625 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 9 0 1 +BITMAP +08 +04 +FE +84 +88 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni21B2 +ENCODING 8626 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 9 0 1 +BITMAP +02 +02 +02 +02 +22 +42 +FE +40 +20 +ENDCHAR +STARTCHAR uni21B3 +ENCODING 8627 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 9 0 1 +BITMAP +80 +80 +80 +80 +88 +84 +FE +04 +08 +ENDCHAR +STARTCHAR uni21B4 +ENCODING 8628 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 9 0 1 +BITMAP +F8 +08 +08 +08 +08 +08 +2A +1C +08 +ENDCHAR +STARTCHAR carriagereturn +ENCODING 8629 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +02 +02 +22 +42 +FE +40 +20 +ENDCHAR +STARTCHAR uni21B6 +ENCODING 8630 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 6 0 2 +BITMAP +1C +22 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni21B7 +ENCODING 8631 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 6 0 2 +BITMAP +70 +88 +08 +2A +1C +08 +ENDCHAR +STARTCHAR uni21B8 +ENCODING 8632 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 2 +BITMAP +FC +00 +78 +60 +50 +48 +04 +ENDCHAR +STARTCHAR uni21B9 +ENCODING 8633 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +90 +A0 +FE +A0 +90 +00 +12 +0A +FE +0A +12 +ENDCHAR +STARTCHAR uni21BA +ENCODING 8634 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +0E +4C +8A +82 +82 +44 +38 +ENDCHAR +STARTCHAR uni21BB +ENCODING 8635 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +E0 +64 +A2 +82 +82 +44 +38 +ENDCHAR +STARTCHAR uni21BC +ENCODING 8636 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 3 0 5 +BITMAP +20 +40 +FE +ENDCHAR +STARTCHAR uni21BD +ENCODING 8637 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 3 0 3 +BITMAP +FE +40 +20 +ENDCHAR +STARTCHAR uni21BE +ENCODING 8638 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 7 3 2 +BITMAP +80 +C0 +A0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni21BF +ENCODING 8639 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 7 1 2 +BITMAP +20 +60 +A0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni21C0 +ENCODING 8640 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 3 0 5 +BITMAP +08 +04 +FE +ENDCHAR +STARTCHAR uni21C1 +ENCODING 8641 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 3 0 3 +BITMAP +FE +04 +08 +ENDCHAR +STARTCHAR uni21C2 +ENCODING 8642 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 7 3 2 +BITMAP +80 +80 +80 +80 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni21C3 +ENCODING 8643 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 7 1 2 +BITMAP +20 +20 +20 +20 +A0 +60 +20 +ENDCHAR +STARTCHAR uni21C4 +ENCODING 8644 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 1 +BITMAP +08 +04 +FE +04 +28 +40 +FE +40 +20 +ENDCHAR +STARTCHAR uni21C5 +ENCODING 8645 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +28 +78 +A8 +28 +2A +3C +28 +ENDCHAR +STARTCHAR uni21C6 +ENCODING 8646 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 1 +BITMAP +20 +40 +FE +40 +28 +04 +FE +04 +08 +ENDCHAR +STARTCHAR uni21C7 +ENCODING 8647 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 1 +BITMAP +20 +40 +FE +40 +20 +40 +FE +40 +20 +ENDCHAR +STARTCHAR uni21C8 +ENCODING 8648 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +28 +7C +AA +28 +28 +28 +28 +ENDCHAR +STARTCHAR uni21C9 +ENCODING 8649 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 1 +BITMAP +08 +04 +FE +04 +08 +04 +FE +04 +08 +ENDCHAR +STARTCHAR uni21CA +ENCODING 8650 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +28 +28 +28 +28 +AA +7C +28 +ENDCHAR +STARTCHAR uni21CB +ENCODING 8651 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +20 +40 +FE +00 +FE +04 +08 +ENDCHAR +STARTCHAR uni21CC +ENCODING 8652 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +08 +04 +FE +00 +FE +40 +20 +ENDCHAR +STARTCHAR arrowdblleft +ENCODING 8656 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +20 +7E +80 +7E +20 +ENDCHAR +STARTCHAR arrowdblup +ENCODING 8657 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 2 +BITMAP +20 +50 +D8 +50 +50 +50 +50 +ENDCHAR +STARTCHAR arrowdblright +ENCODING 8658 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +08 +FC +02 +FC +08 +ENDCHAR +STARTCHAR arrowdbldown +ENCODING 8659 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 2 +BITMAP +50 +50 +50 +50 +D8 +50 +20 +ENDCHAR +STARTCHAR arrowdblboth +ENCODING 8660 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +28 +7C +82 +7C +28 +ENDCHAR +STARTCHAR uni21D5 +ENCODING 8661 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 2 +BITMAP +20 +50 +D8 +50 +D8 +50 +20 +ENDCHAR +STARTCHAR uni21D6 +ENCODING 8662 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +F0 +A0 +D0 +A8 +14 +0A +04 +ENDCHAR +STARTCHAR uni21D7 +ENCODING 8663 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +1E +0A +16 +2A +50 +A0 +40 +ENDCHAR +STARTCHAR uni21D8 +ENCODING 8664 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +40 +A0 +50 +2A +16 +0A +1E +ENDCHAR +STARTCHAR uni21D9 +ENCODING 8665 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +04 +0A +14 +A8 +D0 +A0 +F0 +ENDCHAR +STARTCHAR uni21DA +ENCODING 8666 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +10 +3E +40 +FE +40 +3E +10 +ENDCHAR +STARTCHAR uni21DB +ENCODING 8667 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +10 +F8 +04 +FE +04 +F8 +10 +ENDCHAR +STARTCHAR uni21E0 +ENCODING 8672 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +20 +40 +EA +40 +20 +ENDCHAR +STARTCHAR uni21E1 +ENCODING 8673 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 2 +BITMAP +20 +70 +A8 +00 +20 +00 +20 +ENDCHAR +STARTCHAR uni21E2 +ENCODING 8674 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +08 +04 +AE +04 +08 +ENDCHAR +STARTCHAR uni21E3 +ENCODING 8675 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 2 +BITMAP +20 +00 +20 +00 +A8 +70 +20 +ENDCHAR +STARTCHAR uni21E4 +ENCODING 8676 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +90 +A0 +FE +A0 +90 +ENDCHAR +STARTCHAR uni21E5 +ENCODING 8677 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +12 +0A +FE +0A +12 +ENDCHAR +STARTCHAR uni21E6 +ENCODING 8678 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +20 +7E +C2 +7E +20 +ENDCHAR +STARTCHAR uni21E7 +ENCODING 8679 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 2 +BITMAP +20 +70 +D8 +50 +50 +50 +70 +ENDCHAR +STARTCHAR uni21E8 +ENCODING 8680 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +08 +FC +86 +FC +08 +ENDCHAR +STARTCHAR uni21E9 +ENCODING 8681 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 2 +BITMAP +70 +50 +50 +50 +D8 +70 +20 +ENDCHAR +STARTCHAR uni21EA +ENCODING 8682 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 8 1 1 +BITMAP +20 +70 +D8 +50 +50 +70 +50 +70 +ENDCHAR +STARTCHAR uni21EB +ENCODING 8683 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 8 1 1 +BITMAP +20 +70 +D8 +50 +50 +D8 +88 +F8 +ENDCHAR +STARTCHAR uni21F0 +ENCODING 8688 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +E8 +BC +86 +BC +E8 +ENDCHAR +STARTCHAR uni21F1 +ENCODING 8689 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +FE +80 +BC +B0 +A8 +A4 +80 +ENDCHAR +STARTCHAR uni21F2 +ENCODING 8690 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +02 +4A +2A +1A +7A +02 +FE +ENDCHAR +STARTCHAR uni21F3 +ENCODING 8691 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 2 +BITMAP +20 +70 +D8 +50 +D8 +70 +20 +ENDCHAR +STARTCHAR uni21F4 +ENCODING 8692 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +08 +24 +DE +24 +08 +ENDCHAR +STARTCHAR uni21F5 +ENCODING 8693 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +28 +3C +2A +28 +A8 +78 +28 +ENDCHAR +STARTCHAR uni21F6 +ENCODING 8694 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 7 1 2 +BITMAP +10 +F8 +10 +F8 +10 +F8 +10 +ENDCHAR +STARTCHAR uni21F7 +ENCODING 8695 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +28 +48 +FE +48 +28 +ENDCHAR +STARTCHAR uni21F8 +ENCODING 8696 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +28 +24 +FE +24 +28 +ENDCHAR +STARTCHAR uni21F9 +ENCODING 8697 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +54 +92 +FE +92 +54 +ENDCHAR +STARTCHAR uni21FA +ENCODING 8698 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +2A +4A +FE +4A +2A +ENDCHAR +STARTCHAR uni21FB +ENCODING 8699 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +A8 +A4 +FE +A4 +A8 +ENDCHAR +STARTCHAR uni21FD +ENCODING 8701 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +20 +60 +BE +60 +20 +ENDCHAR +STARTCHAR uni21FE +ENCODING 8702 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +08 +0C +FA +0C +08 +ENDCHAR +STARTCHAR uni21FF +ENCODING 8703 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +28 +6C +BA +6C +28 +ENDCHAR +STARTCHAR universal +ENCODING 8704 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +88 +88 +70 +50 +50 +20 +20 +20 +ENDCHAR +STARTCHAR uni2201 +ENCODING 8705 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +78 +80 +80 +80 +80 +80 +80 +80 +78 +ENDCHAR +STARTCHAR partialdiff +ENCODING 8706 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +60 +10 +08 +08 +78 +88 +88 +88 +70 +ENDCHAR +STARTCHAR existential +ENCODING 8707 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +08 +08 +08 +F8 +08 +08 +08 +F8 +ENDCHAR +STARTCHAR uni2204 +ENCODING 8708 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -1 +BITMAP +10 +F8 +18 +18 +28 +F8 +28 +48 +48 +F8 +40 +ENDCHAR +STARTCHAR emptyset +ENCODING 8709 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +08 +70 +98 +A8 +A8 +A8 +C8 +70 +80 +ENDCHAR +STARTCHAR uni2206 +ENCODING 8710 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 2 +BITMAP +20 +20 +50 +50 +88 +88 +F8 +ENDCHAR +STARTCHAR gradient +ENCODING 8711 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 2 +BITMAP +F8 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR element +ENCODING 8712 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +38 +40 +80 +80 +F8 +80 +80 +40 +38 +ENDCHAR +STARTCHAR notelement +ENCODING 8713 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -1 +BITMAP +10 +38 +50 +90 +A0 +F8 +A0 +A0 +40 +78 +40 +ENDCHAR +STARTCHAR uni220A +ENCODING 8714 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +78 +80 +F8 +80 +78 +ENDCHAR +STARTCHAR suchthat +ENCODING 8715 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F0 +08 +08 +08 +F8 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR uni220C +ENCODING 8716 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -1 +BITMAP +10 +F0 +18 +18 +28 +F8 +28 +28 +48 +F0 +40 +ENDCHAR +STARTCHAR uni220D +ENCODING 8717 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +F0 +08 +F8 +08 +F0 +ENDCHAR +STARTCHAR uni220E +ENCODING 8718 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F8 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR product +ENCODING 8719 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni2210 +ENCODING 8720 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +88 +88 +88 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR summation +ENCODING 8721 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F8 +80 +40 +20 +10 +20 +40 +80 +F8 +ENDCHAR +STARTCHAR minus +ENCODING 8722 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 1 1 4 +BITMAP +F8 +ENDCHAR +STARTCHAR uni2213 +ENCODING 8723 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 1 +BITMAP +F8 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2214 +ENCODING 8724 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 1 +BITMAP +20 +00 +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2215 +ENCODING 8725 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +08 +08 +10 +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni2216 +ENCODING 8726 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +80 +80 +40 +40 +20 +20 +10 +10 +08 +08 +ENDCHAR +STARTCHAR asteriskmath +ENCODING 8727 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +50 +20 +F8 +20 +50 +ENDCHAR +STARTCHAR uni2218 +ENCODING 8728 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 4 1 2 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni2219 +ENCODING 8729 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 2 2 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR radical +ENCODING 8730 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +0E +08 +08 +08 +08 +08 +88 +48 +28 +18 +ENDCHAR +STARTCHAR uni221B +ENCODING 8731 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +C0 +2E +C8 +28 +C8 +08 +08 +88 +48 +28 +18 +ENDCHAR +STARTCHAR uni221C +ENCODING 8732 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 11 0 0 +BITMAP +20 +6E +A8 +E8 +28 +08 +08 +88 +48 +28 +18 +ENDCHAR +STARTCHAR proportional +ENCODING 8733 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +68 +90 +90 +90 +68 +ENDCHAR +STARTCHAR infinity +ENCODING 8734 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +50 +A8 +A8 +A8 +50 +ENDCHAR +STARTCHAR orthogonal +ENCODING 8735 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 3 +BITMAP +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR angle +ENCODING 8736 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 3 +BITMAP +08 +10 +20 +40 +F8 +ENDCHAR +STARTCHAR uni2223 +ENCODING 8739 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 9 3 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2224 +ENCODING 8740 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 3 9 2 0 +BITMAP +40 +40 +40 +60 +C0 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni2225 +ENCODING 8741 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 3 9 2 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni2226 +ENCODING 8742 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +50 +50 +50 +58 +70 +D0 +50 +50 +50 +ENDCHAR +STARTCHAR logicaland +ENCODING 8743 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 6 1 1 +BITMAP +20 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR logicalor +ENCODING 8744 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 6 1 1 +BITMAP +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR intersection +ENCODING 8745 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 6 1 1 +BITMAP +70 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR union +ENCODING 8746 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 6 1 1 +BITMAP +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR integral +ENCODING 8747 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +18 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni222C +ENCODING 8748 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +1E +28 +28 +28 +28 +28 +28 +28 +28 +28 +28 +28 +F0 +ENDCHAR +STARTCHAR uni222D +ENCODING 8749 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +3E +54 +54 +54 +54 +54 +54 +54 +54 +54 +54 +54 +F8 +ENDCHAR +STARTCHAR uni222E +ENCODING 8750 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 13 1 -2 +BITMAP +10 +20 +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +20 +40 +ENDCHAR +STARTCHAR uni222F +ENCODING 8751 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +14 +28 +28 +28 +7C +AA +AA +AA +7C +28 +28 +28 +50 +ENDCHAR +STARTCHAR uni2230 +ENCODING 8752 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +3E +54 +54 +54 +7C +D6 +D6 +D6 +7C +54 +54 +54 +F8 +ENDCHAR +STARTCHAR therefore +ENCODING 8756 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 5 1 3 +BITMAP +20 +00 +00 +00 +88 +ENDCHAR +STARTCHAR uni2235 +ENCODING 8757 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 5 1 3 +BITMAP +88 +00 +00 +00 +20 +ENDCHAR +STARTCHAR uni2236 +ENCODING 8758 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 1 5 3 3 +BITMAP +80 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni2237 +ENCODING 8759 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 5 1 3 +BITMAP +88 +00 +00 +00 +88 +ENDCHAR +STARTCHAR uni2238 +ENCODING 8760 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 3 1 4 +BITMAP +20 +00 +F8 +ENDCHAR +STARTCHAR uni2239 +ENCODING 8761 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +08 +00 +F0 +00 +08 +ENDCHAR +STARTCHAR uni223A +ENCODING 8762 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +88 +00 +F8 +00 +88 +ENDCHAR +STARTCHAR uni223B +ENCODING 8763 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +10 +00 +64 +98 +00 +10 +ENDCHAR +STARTCHAR similar +ENCODING 8764 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 2 0 3 +BITMAP +64 +98 +ENDCHAR +STARTCHAR uni223D +ENCODING 8765 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 2 0 3 +BITMAP +98 +64 +ENDCHAR +STARTCHAR uni223E +ENCODING 8766 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 5 0 3 +BITMAP +04 +62 +92 +8C +40 +ENDCHAR +STARTCHAR uni223F +ENCODING 8767 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 7 1 2 +BITMAP +40 +A0 +A0 +20 +28 +28 +10 +ENDCHAR +STARTCHAR uni2240 +ENCODING 8768 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 2 8 2 0 +BITMAP +80 +40 +40 +40 +80 +80 +80 +40 +ENDCHAR +STARTCHAR uni2241 +ENCODING 8769 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 4 0 2 +BITMAP +10 +74 +B8 +20 +ENDCHAR +STARTCHAR uni2242 +ENCODING 8770 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 4 0 2 +BITMAP +FC +00 +64 +98 +ENDCHAR +STARTCHAR uni2243 +ENCODING 8771 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 4 0 2 +BITMAP +64 +98 +00 +FC +ENDCHAR +STARTCHAR uni2244 +ENCODING 8772 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +10 +74 +B8 +20 +FC +40 +ENDCHAR +STARTCHAR congruent +ENCODING 8773 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +64 +98 +00 +FC +00 +FC +ENDCHAR +STARTCHAR approxequal +ENCODING 8776 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 1 +BITMAP +64 +98 +00 +64 +98 +ENDCHAR +STARTCHAR uni2249 +ENCODING 8777 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +10 +74 +98 +30 +64 +B8 +20 +ENDCHAR +STARTCHAR uni224A +ENCODING 8778 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +64 +98 +00 +64 +98 +00 +FC +ENDCHAR +STARTCHAR uni224B +ENCODING 8779 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +64 +98 +00 +64 +98 +00 +64 +98 +ENDCHAR +STARTCHAR uni224C +ENCODING 8780 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +98 +64 +00 +FC +00 +FC +ENDCHAR +STARTCHAR notequal +ENCODING 8800 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR equivalence +ENCODING 8801 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2262 +ENCODING 8802 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +10 +F8 +20 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2263 +ENCODING 8803 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F8 +00 +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR lessequal +ENCODING 8804 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +18 +60 +80 +60 +18 +00 +F8 +ENDCHAR +STARTCHAR greaterequal +ENCODING 8805 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +C0 +30 +08 +30 +C0 +00 +F8 +ENDCHAR +STARTCHAR uni2266 +ENCODING 8806 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +18 +60 +80 +60 +18 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2267 +ENCODING 8807 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +C0 +30 +08 +30 +C0 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2268 +ENCODING 8808 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 10 1 -1 +BITMAP +18 +60 +80 +60 +18 +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2269 +ENCODING 8809 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 10 1 -1 +BITMAP +C0 +30 +08 +30 +C0 +10 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni226A +ENCODING 8810 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +28 +50 +A0 +50 +28 +ENDCHAR +STARTCHAR uni226B +ENCODING 8811 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +A0 +50 +28 +50 +A0 +ENDCHAR +STARTCHAR uni2276 +ENCODING 8822 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +18 +60 +80 +60 +18 +C0 +30 +08 +30 +C0 +ENDCHAR +STARTCHAR uni2277 +ENCODING 8823 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +C0 +30 +08 +30 +C0 +18 +60 +80 +60 +18 +ENDCHAR +STARTCHAR uni227A +ENCODING 8826 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +08 +30 +C0 +30 +08 +ENDCHAR +STARTCHAR uni227B +ENCODING 8827 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +80 +60 +18 +60 +80 +ENDCHAR +STARTCHAR uni227C +ENCODING 8828 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 1 +BITMAP +08 +30 +C0 +30 +C8 +30 +08 +ENDCHAR +STARTCHAR uni227D +ENCODING 8829 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 1 +BITMAP +80 +60 +18 +60 +98 +60 +80 +ENDCHAR +STARTCHAR propersubset +ENCODING 8834 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 6 1 1 +BITMAP +78 +80 +80 +80 +80 +78 +ENDCHAR +STARTCHAR propersuperset +ENCODING 8835 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 6 1 1 +BITMAP +F0 +08 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR notsubset +ENCODING 8836 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +10 +78 +90 +A0 +A0 +A0 +78 +40 +ENDCHAR +STARTCHAR uni2285 +ENCODING 8837 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +10 +F0 +18 +28 +28 +28 +F0 +40 +ENDCHAR +STARTCHAR reflexsubset +ENCODING 8838 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +78 +80 +80 +80 +80 +78 +00 +F8 +ENDCHAR +STARTCHAR reflexsuperset +ENCODING 8839 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +F0 +08 +08 +08 +08 +F0 +00 +F8 +ENDCHAR +STARTCHAR uni2288 +ENCODING 8840 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 10 1 -1 +BITMAP +10 +78 +90 +A0 +A0 +A0 +78 +40 +F8 +40 +ENDCHAR +STARTCHAR uni2289 +ENCODING 8841 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 10 1 -1 +BITMAP +10 +F0 +18 +28 +28 +28 +F0 +40 +F8 +40 +ENDCHAR +STARTCHAR uni228A +ENCODING 8842 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 1 -1 +BITMAP +78 +80 +80 +80 +80 +78 +10 +F8 +20 +ENDCHAR +STARTCHAR uni228B +ENCODING 8843 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 9 1 -1 +BITMAP +F0 +08 +08 +08 +08 +F0 +10 +F8 +20 +ENDCHAR +STARTCHAR uni228F +ENCODING 8847 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 6 1 1 +BITMAP +F8 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni2290 +ENCODING 8848 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 6 1 1 +BITMAP +F8 +08 +08 +08 +08 +F8 +ENDCHAR +STARTCHAR uni2291 +ENCODING 8849 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +F8 +80 +80 +80 +80 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2292 +ENCODING 8850 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +F8 +08 +08 +08 +08 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2293 +ENCODING 8851 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 6 1 1 +BITMAP +F8 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni2294 +ENCODING 8852 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 6 1 1 +BITMAP +88 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR circleplus +ENCODING 8853 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +44 +92 +BA +92 +44 +38 +ENDCHAR +STARTCHAR uni2296 +ENCODING 8854 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +44 +82 +BA +82 +44 +38 +ENDCHAR +STARTCHAR circlemultiply +ENCODING 8855 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +44 +AA +92 +AA +44 +38 +ENDCHAR +STARTCHAR uni2298 +ENCODING 8856 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +44 +8A +92 +A2 +44 +38 +ENDCHAR +STARTCHAR uni2299 +ENCODING 8857 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +44 +82 +92 +82 +44 +38 +ENDCHAR +STARTCHAR uni229A +ENCODING 8858 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +44 +92 +AA +92 +44 +38 +ENDCHAR +STARTCHAR uni229C +ENCODING 8860 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +44 +BA +82 +BA +44 +38 +ENDCHAR +STARTCHAR uni229D +ENCODING 8861 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +44 +82 +BA +82 +44 +38 +ENDCHAR +STARTCHAR uni229E +ENCODING 8862 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +82 +92 +BA +92 +82 +FE +ENDCHAR +STARTCHAR uni229F +ENCODING 8863 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +82 +82 +BA +82 +82 +FE +ENDCHAR +STARTCHAR uni22A0 +ENCODING 8864 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +82 +AA +92 +AA +82 +FE +ENDCHAR +STARTCHAR uni22A1 +ENCODING 8865 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +82 +82 +92 +82 +82 +FE +ENDCHAR +STARTCHAR uni22A2 +ENCODING 8866 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +80 +80 +F8 +80 +80 +ENDCHAR +STARTCHAR uni22A3 +ENCODING 8867 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +08 +08 +F8 +08 +08 +ENDCHAR +STARTCHAR uni22A4 +ENCODING 8868 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR perpendicular +ENCODING 8869 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni22A6 +ENCODING 8870 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 7 2 1 +BITMAP +80 +80 +80 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni22A7 +ENCODING 8871 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 7 2 1 +BITMAP +80 +80 +F0 +80 +F0 +80 +80 +ENDCHAR +STARTCHAR uni22A8 +ENCODING 8872 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 1 +BITMAP +80 +80 +FC +80 +FC +80 +80 +ENDCHAR +STARTCHAR uni22A9 +ENCODING 8873 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 1 +BITMAP +A0 +A0 +A0 +BC +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni22AA +ENCODING 8874 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +A8 +A8 +A8 +AE +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni22AB +ENCODING 8875 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 7 0 1 +BITMAP +A0 +A0 +BC +A0 +BC +A0 +A0 +ENDCHAR +STARTCHAR uni22AC +ENCODING 8876 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 1 +BITMAP +88 +88 +90 +FC +90 +A0 +A0 +ENDCHAR +STARTCHAR uni22AD +ENCODING 8877 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 7 0 1 +BITMAP +88 +88 +FC +90 +FC +A0 +A0 +ENDCHAR +STARTCHAR uni22B2 +ENCODING 8882 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +0C +34 +C4 +34 +0C +ENDCHAR +STARTCHAR uni22B3 +ENCODING 8883 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +C0 +B0 +8C +B0 +C0 +ENDCHAR +STARTCHAR uni22B4 +ENCODING 8884 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +0C +34 +C4 +34 +0C +00 +FC +ENDCHAR +STARTCHAR uni22B5 +ENCODING 8885 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 6 7 0 0 +BITMAP +C0 +B0 +8C +B0 +C0 +00 +FC +ENDCHAR +STARTCHAR uni22B6 +ENCODING 8886 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 3 0 3 +BITMAP +44 +BE +44 +ENDCHAR +STARTCHAR uni22B7 +ENCODING 8887 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 3 0 3 +BITMAP +44 +FA +44 +ENDCHAR +STARTCHAR uni22B8 +ENCODING 8888 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 3 0 3 +BITMAP +04 +FA +04 +ENDCHAR +STARTCHAR uni22BB +ENCODING 8891 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 8 0 1 +BITMAP +88 +88 +50 +50 +20 +20 +00 +F8 +ENDCHAR +STARTCHAR uni22BC +ENCODING 8892 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 8 0 1 +BITMAP +F8 +00 +20 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni22BD +ENCODING 8893 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 8 0 1 +BITMAP +F8 +00 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni22BF +ENCODING 8895 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +08 +18 +28 +48 +F8 +ENDCHAR +STARTCHAR uni22C0 +ENCODING 8896 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 6 1 1 +BITMAP +20 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR uni22C1 +ENCODING 8897 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 6 1 1 +BITMAP +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni22C2 +ENCODING 8898 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 6 1 1 +BITMAP +70 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni22C3 +ENCODING 8899 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 6 1 1 +BITMAP +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni22C4 +ENCODING 8900 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +20 +50 +88 +50 +20 +ENDCHAR +STARTCHAR dotmath +ENCODING 8901 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 1 1 3 4 +BITMAP +80 +ENDCHAR +STARTCHAR uni22C6 +ENCODING 8902 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +20 +A8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni22C7 +ENCODING 8903 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +10 +44 +28 +FE +28 +44 +10 +ENDCHAR +STARTCHAR uni22C8 +ENCODING 8904 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +82 +C6 +AA +92 +AA +C6 +82 +ENDCHAR +STARTCHAR uni22C9 +ENCODING 8905 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +82 +C4 +A8 +90 +A8 +C4 +82 +ENDCHAR +STARTCHAR uni22CA +ENCODING 8906 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +82 +46 +2A +12 +2A +46 +82 +ENDCHAR +STARTCHAR uni22CB +ENCODING 8907 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +80 +40 +20 +10 +28 +44 +82 +ENDCHAR +STARTCHAR uni22CC +ENCODING 8908 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 2 +BITMAP +02 +04 +08 +10 +28 +44 +82 +ENDCHAR +STARTCHAR uni22CD +ENCODING 8909 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 4 0 2 +BITMAP +98 +64 +00 +FC +ENDCHAR +STARTCHAR uni22CE +ENCODING 8910 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 6 1 1 +BITMAP +88 +50 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni22CF +ENCODING 8911 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 6 1 1 +BITMAP +20 +20 +50 +50 +50 +88 +ENDCHAR +STARTCHAR house +ENCODING 8962 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 6 1 0 +BITMAP +20 +50 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR revlogicalnot +ENCODING 8976 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 4 1 2 +BITMAP +F8 +80 +80 +80 +ENDCHAR +STARTCHAR uni231A +ENCODING 8986 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 1 +BITMAP +38 +44 +92 +92 +9A +82 +82 +44 +38 +ENDCHAR +STARTCHAR uni231B +ENCODING 8987 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 1 +BITMAP +FE +82 +82 +44 +44 +54 +BA +FE +FE +ENDCHAR +STARTCHAR uni231C +ENCODING 8988 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 3 3 0 8 +BITMAP +E0 +80 +80 +ENDCHAR +STARTCHAR uni231D +ENCODING 8989 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 3 3 4 8 +BITMAP +E0 +20 +20 +ENDCHAR +STARTCHAR uni231E +ENCODING 8990 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 3 3 0 -2 +BITMAP +80 +80 +E0 +ENDCHAR +STARTCHAR uni231F +ENCODING 8991 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 3 3 4 -2 +BITMAP +20 +20 +E0 +ENDCHAR +STARTCHAR integraltp +ENCODING 8992 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 13 3 -2 +BITMAP +40 +A0 +A0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR integralbt +ENCODING 8993 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 13 1 -2 +BITMAP +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +A0 +A0 +40 +ENDCHAR +STARTCHAR uni239B +ENCODING 9115 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 13 3 -2 +BITMAP +10 +20 +40 +40 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni239C +ENCODING 9116 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 1 13 3 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni239D +ENCODING 9117 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 13 3 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +40 +40 +20 +10 +ENDCHAR +STARTCHAR uni239E +ENCODING 9118 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 13 0 -2 +BITMAP +80 +40 +20 +20 +10 +10 +10 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni239F +ENCODING 9119 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 1 13 3 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A0 +ENCODING 9120 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 13 0 -2 +BITMAP +10 +10 +10 +10 +10 +10 +10 +10 +10 +20 +20 +40 +80 +ENDCHAR +STARTCHAR uni23A1 +ENCODING 9121 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 13 3 -2 +BITMAP +F0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A2 +ENCODING 9122 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 1 13 3 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A3 +ENCODING 9123 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 13 3 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +F0 +ENDCHAR +STARTCHAR uni23A4 +ENCODING 9124 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 13 0 -2 +BITMAP +F0 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni23A5 +ENCODING 9125 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 1 13 3 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A6 +ENCODING 9126 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 13 0 -2 +BITMAP +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +F0 +ENDCHAR +STARTCHAR uni23A7 +ENCODING 9127 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 13 3 -2 +BITMAP +30 +40 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A8 +ENCODING 9128 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 13 0 -2 +BITMAP +10 +10 +10 +10 +10 +20 +C0 +20 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni23A9 +ENCODING 9129 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 13 3 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +40 +30 +ENDCHAR +STARTCHAR uni23AA +ENCODING 9130 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 1 13 3 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23AB +ENCODING 9131 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 13 0 -2 +BITMAP +C0 +20 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni23AC +ENCODING 9132 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 13 3 -2 +BITMAP +80 +80 +80 +80 +80 +40 +30 +40 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23AD +ENCODING 9133 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 4 13 0 -2 +BITMAP +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +20 +C0 +ENDCHAR +STARTCHAR uni23AE +ENCODING 9134 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 1 13 3 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23BA +ENCODING 9146 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 1 0 10 +BITMAP +FE +ENDCHAR +STARTCHAR uni23BB +ENCODING 9147 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 1 0 7 +BITMAP +FE +ENDCHAR +STARTCHAR uni23BC +ENCODING 9148 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 1 0 3 +BITMAP +FE +ENDCHAR +STARTCHAR uni23BD +ENCODING 9149 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 1 0 0 +BITMAP +FE +ENDCHAR +STARTCHAR uni2408 +ENCODING 9224 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -1 +BITMAP +F0 +88 +F0 +88 +F0 +00 +3C +40 +38 +04 +78 +ENDCHAR +STARTCHAR uni2409 +ENCODING 9225 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -1 +BITMAP +88 +88 +F8 +88 +88 +00 +7C +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni240A +ENCODING 9226 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -1 +BITMAP +80 +80 +80 +80 +F8 +00 +7C +40 +78 +40 +40 +ENDCHAR +STARTCHAR uni240B +ENCODING 9227 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -1 +BITMAP +88 +88 +88 +50 +20 +00 +7C +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni240C +ENCODING 9228 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -1 +BITMAP +F8 +80 +E0 +80 +80 +00 +7C +40 +70 +40 +40 +ENDCHAR +STARTCHAR uni240D +ENCODING 9229 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -1 +BITMAP +78 +80 +80 +80 +78 +00 +78 +44 +78 +48 +44 +ENDCHAR +STARTCHAR uni240E +ENCODING 9230 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 11 0 -1 +BITMAP +78 +80 +70 +08 +F0 +00 +38 +44 +44 +44 +38 +ENDCHAR +STARTCHAR uni240F +ENCODING 9231 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 11 0 -1 +BITMAP +78 +80 +70 +08 +F0 +00 +38 +10 +10 +10 +38 +ENDCHAR +STARTCHAR uni2420 +ENCODING 9248 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -1 +BITMAP +78 +80 +70 +08 +F0 +00 +78 +44 +78 +40 +40 +ENDCHAR +STARTCHAR uni2424 +ENCODING 9252 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -1 +BITMAP +88 +C8 +A8 +98 +88 +00 +40 +40 +40 +40 +7C +ENDCHAR +STARTCHAR SF100000 +ENCODING 9472 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 1 0 4 +BITMAP +FE +ENDCHAR +STARTCHAR uni2501 +ENCODING 9473 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 2 0 3 +BITMAP +FE +FE +ENDCHAR +STARTCHAR SF110000 +ENCODING 9474 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 13 3 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2503 +ENCODING 9475 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 13 3 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2504 +ENCODING 9476 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 1 0 4 +BITMAP +B4 +ENDCHAR +STARTCHAR uni2505 +ENCODING 9477 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 2 0 3 +BITMAP +B4 +B4 +ENDCHAR +STARTCHAR uni2506 +ENCODING 9478 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 1 13 3 -2 +BITMAP +80 +80 +80 +00 +00 +80 +80 +80 +00 +00 +80 +80 +80 +ENDCHAR +STARTCHAR uni2507 +ENCODING 9479 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 2 13 2 -2 +BITMAP +C0 +C0 +C0 +00 +00 +C0 +C0 +C0 +00 +00 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2508 +ENCODING 9480 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 1 0 4 +BITMAP +AA +ENDCHAR +STARTCHAR uni2509 +ENCODING 9481 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 2 0 3 +BITMAP +AA +AA +ENDCHAR +STARTCHAR uni250A +ENCODING 9482 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 12 3 -1 +BITMAP +80 +80 +00 +80 +80 +80 +00 +80 +80 +00 +80 +80 +ENDCHAR +STARTCHAR uni250B +ENCODING 9483 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 12 3 -1 +BITMAP +C0 +C0 +00 +C0 +C0 +C0 +00 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR SF010000 +ENCODING 9484 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 7 3 -2 +BITMAP +F0 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni250D +ENCODING 9485 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 7 3 -2 +BITMAP +F0 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni250E +ENCODING 9486 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 7 3 -2 +BITMAP +F0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni250F +ENCODING 9487 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 7 3 -2 +BITMAP +F0 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR SF030000 +ENCODING 9488 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 7 0 -2 +BITMAP +F0 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni2511 +ENCODING 9489 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 7 0 -2 +BITMAP +F0 +F0 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni2512 +ENCODING 9490 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 0 -2 +BITMAP +F8 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni2513 +ENCODING 9491 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 0 -2 +BITMAP +F8 +F8 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR SF020000 +ENCODING 9492 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 7 3 4 +BITMAP +80 +80 +80 +80 +80 +80 +F0 +ENDCHAR +STARTCHAR uni2515 +ENCODING 9493 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 8 3 3 +BITMAP +80 +80 +80 +80 +80 +80 +F0 +F0 +ENDCHAR +STARTCHAR uni2516 +ENCODING 9494 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 7 3 4 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +F0 +ENDCHAR +STARTCHAR uni2517 +ENCODING 9495 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 8 3 3 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +F0 +F0 +ENDCHAR +STARTCHAR SF040000 +ENCODING 9496 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 7 0 4 +BITMAP +10 +10 +10 +10 +10 +10 +F0 +ENDCHAR +STARTCHAR uni2519 +ENCODING 9497 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 8 0 3 +BITMAP +10 +10 +10 +10 +10 +10 +F0 +F0 +ENDCHAR +STARTCHAR uni251A +ENCODING 9498 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 0 4 +BITMAP +18 +18 +18 +18 +18 +18 +F8 +ENDCHAR +STARTCHAR uni251B +ENCODING 9499 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 0 3 +BITMAP +18 +18 +18 +18 +18 +18 +F8 +F8 +ENDCHAR +STARTCHAR SF080000 +ENCODING 9500 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 13 3 -2 +BITMAP +80 +80 +80 +80 +80 +80 +F0 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni251D +ENCODING 9501 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 13 3 -2 +BITMAP +80 +80 +80 +80 +80 +80 +F0 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni251E +ENCODING 9502 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 13 3 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +F0 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni251F +ENCODING 9503 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 13 3 -2 +BITMAP +80 +80 +80 +80 +80 +80 +F0 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2520 +ENCODING 9504 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 13 3 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +F0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2521 +ENCODING 9505 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 13 3 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +F0 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2522 +ENCODING 9506 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 13 3 -2 +BITMAP +80 +80 +80 +80 +80 +80 +F0 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2523 +ENCODING 9507 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 13 3 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +F0 +F0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR SF090000 +ENCODING 9508 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 13 0 -2 +BITMAP +10 +10 +10 +10 +10 +10 +F0 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni2525 +ENCODING 9509 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 13 0 -2 +BITMAP +10 +10 +10 +10 +10 +10 +F0 +F0 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni2526 +ENCODING 9510 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 13 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +F8 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni2527 +ENCODING 9511 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 13 0 -2 +BITMAP +10 +10 +10 +10 +10 +10 +F8 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni2528 +ENCODING 9512 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 13 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +F8 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni2529 +ENCODING 9513 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 13 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +F8 +F8 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni252A +ENCODING 9514 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 13 0 -2 +BITMAP +10 +10 +10 +10 +10 +10 +F8 +F8 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni252B +ENCODING 9515 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 13 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +F8 +F8 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR SF060000 +ENCODING 9516 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 -2 +BITMAP +FE +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni252D +ENCODING 9517 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 -2 +BITMAP +FE +F0 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni252E +ENCODING 9518 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 -2 +BITMAP +FE +1E +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni252F +ENCODING 9519 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 -2 +BITMAP +FE +FE +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni2530 +ENCODING 9520 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 -2 +BITMAP +FE +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni2531 +ENCODING 9521 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 -2 +BITMAP +FE +F8 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni2532 +ENCODING 9522 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 -2 +BITMAP +FE +1E +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni2533 +ENCODING 9523 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 -2 +BITMAP +FE +FE +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR SF070000 +ENCODING 9524 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 4 +BITMAP +10 +10 +10 +10 +10 +10 +FE +ENDCHAR +STARTCHAR uni2535 +ENCODING 9525 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 8 0 3 +BITMAP +10 +10 +10 +10 +10 +10 +FE +F0 +ENDCHAR +STARTCHAR uni2536 +ENCODING 9526 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 8 0 3 +BITMAP +10 +10 +10 +10 +10 +10 +FE +1E +ENDCHAR +STARTCHAR uni2537 +ENCODING 9527 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 8 0 3 +BITMAP +10 +10 +10 +10 +10 +10 +FE +FE +ENDCHAR +STARTCHAR uni2538 +ENCODING 9528 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 4 +BITMAP +18 +18 +18 +18 +18 +18 +FE +ENDCHAR +STARTCHAR uni2539 +ENCODING 9529 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 8 0 3 +BITMAP +18 +18 +18 +18 +18 +18 +FE +F8 +ENDCHAR +STARTCHAR uni253A +ENCODING 9530 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 8 0 3 +BITMAP +18 +18 +18 +18 +18 +18 +FE +1E +ENDCHAR +STARTCHAR uni253B +ENCODING 9531 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 8 0 3 +BITMAP +18 +18 +18 +18 +18 +18 +FE +FE +ENDCHAR +STARTCHAR SF050000 +ENCODING 9532 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +10 +10 +10 +10 +10 +10 +FE +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni253D +ENCODING 9533 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +10 +10 +10 +10 +10 +10 +FE +F0 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni253E +ENCODING 9534 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +10 +10 +10 +10 +10 +10 +FE +1E +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni253F +ENCODING 9535 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +10 +10 +10 +10 +10 +10 +FE +FE +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni2540 +ENCODING 9536 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +FE +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni2541 +ENCODING 9537 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +10 +10 +10 +10 +10 +10 +FE +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni2542 +ENCODING 9538 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +FE +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni2543 +ENCODING 9539 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +FE +F8 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni2544 +ENCODING 9540 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +FE +1E +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni2545 +ENCODING 9541 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +10 +10 +10 +10 +10 +10 +FE +F8 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni2546 +ENCODING 9542 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +10 +10 +10 +10 +10 +10 +FE +1E +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni2547 +ENCODING 9543 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +FE +FE +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni2548 +ENCODING 9544 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +10 +10 +10 +10 +10 +10 +FE +FE +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni2549 +ENCODING 9545 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +FE +F8 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni254A +ENCODING 9546 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +FE +1E +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni254B +ENCODING 9547 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +18 +18 +18 +18 +18 +18 +FE +FE +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR SF430000 +ENCODING 9552 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 3 0 3 +BITMAP +FE +00 +FE +ENDCHAR +STARTCHAR SF240000 +ENCODING 9553 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 13 2 -2 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF510000 +ENCODING 9554 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 8 3 -2 +BITMAP +F0 +80 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR SF520000 +ENCODING 9555 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 2 -2 +BITMAP +F8 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF390000 +ENCODING 9556 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 2 -2 +BITMAP +F8 +80 +B8 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF220000 +ENCODING 9557 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 8 0 -2 +BITMAP +F0 +10 +F0 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR SF210000 +ENCODING 9558 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 0 -2 +BITMAP +F8 +28 +28 +28 +28 +28 +28 +ENDCHAR +STARTCHAR SF250000 +ENCODING 9559 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 0 -2 +BITMAP +F8 +08 +E8 +28 +28 +28 +28 +28 +ENDCHAR +STARTCHAR SF500000 +ENCODING 9560 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 8 3 3 +BITMAP +80 +80 +80 +80 +80 +F0 +80 +F0 +ENDCHAR +STARTCHAR SF490000 +ENCODING 9561 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 2 4 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +F8 +ENDCHAR +STARTCHAR SF380000 +ENCODING 9562 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 2 3 +BITMAP +A0 +A0 +A0 +A0 +A0 +B8 +80 +F8 +ENDCHAR +STARTCHAR SF280000 +ENCODING 9563 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 8 0 3 +BITMAP +10 +10 +10 +10 +10 +F0 +10 +F0 +ENDCHAR +STARTCHAR SF270000 +ENCODING 9564 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 0 4 +BITMAP +28 +28 +28 +28 +28 +28 +F8 +ENDCHAR +STARTCHAR SF260000 +ENCODING 9565 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 0 3 +BITMAP +28 +28 +28 +28 +28 +E8 +08 +F8 +ENDCHAR +STARTCHAR SF360000 +ENCODING 9566 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 13 3 -2 +BITMAP +80 +80 +80 +80 +80 +F0 +80 +F0 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR SF370000 +ENCODING 9567 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 13 2 -2 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +B8 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF420000 +ENCODING 9568 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 13 2 -2 +BITMAP +A0 +A0 +A0 +A0 +A0 +B8 +80 +B8 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF190000 +ENCODING 9569 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 13 0 -2 +BITMAP +10 +10 +10 +10 +10 +F0 +10 +F0 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR SF200000 +ENCODING 9570 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 13 0 -2 +BITMAP +28 +28 +28 +28 +28 +28 +E8 +28 +28 +28 +28 +28 +28 +ENDCHAR +STARTCHAR SF230000 +ENCODING 9571 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 13 0 -2 +BITMAP +28 +28 +28 +28 +28 +E8 +08 +E8 +28 +28 +28 +28 +28 +ENDCHAR +STARTCHAR SF470000 +ENCODING 9572 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 8 0 -2 +BITMAP +FE +00 +FE +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR SF480000 +ENCODING 9573 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 -2 +BITMAP +FE +28 +28 +28 +28 +28 +28 +ENDCHAR +STARTCHAR SF410000 +ENCODING 9574 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 8 0 -2 +BITMAP +FE +00 +EE +28 +28 +28 +28 +28 +ENDCHAR +STARTCHAR SF450000 +ENCODING 9575 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 8 0 3 +BITMAP +10 +10 +10 +10 +10 +FE +00 +FE +ENDCHAR +STARTCHAR SF460000 +ENCODING 9576 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 4 +BITMAP +28 +28 +28 +28 +28 +28 +FE +ENDCHAR +STARTCHAR SF400000 +ENCODING 9577 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 8 0 3 +BITMAP +28 +28 +28 +28 +28 +EE +00 +FE +ENDCHAR +STARTCHAR SF540000 +ENCODING 9578 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +10 +10 +10 +10 +10 +FE +10 +FE +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR SF530000 +ENCODING 9579 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +28 +28 +28 +28 +28 +28 +FE +28 +28 +28 +28 +28 +28 +ENDCHAR +STARTCHAR SF440000 +ENCODING 9580 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +28 +28 +28 +28 +28 +EE +00 +EE +28 +28 +28 +28 +28 +ENDCHAR +STARTCHAR uni256D +ENCODING 9581 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 7 3 -2 +BITMAP +30 +40 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni256E +ENCODING 9582 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 7 0 -2 +BITMAP +C0 +20 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni256F +ENCODING 9583 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 7 0 4 +BITMAP +10 +10 +10 +10 +10 +20 +C0 +ENDCHAR +STARTCHAR uni2570 +ENCODING 9584 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 7 3 4 +BITMAP +80 +80 +80 +80 +80 +40 +30 +ENDCHAR +STARTCHAR uni2571 +ENCODING 9585 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +02 +02 +04 +04 +08 +08 +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni2572 +ENCODING 9586 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +80 +80 +40 +40 +20 +20 +10 +08 +08 +04 +04 +02 +02 +ENDCHAR +STARTCHAR uni2573 +ENCODING 9587 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +82 +82 +44 +44 +28 +28 +10 +28 +28 +44 +44 +82 +82 +ENDCHAR +STARTCHAR uni2574 +ENCODING 9588 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 1 0 4 +BITMAP +F0 +ENDCHAR +STARTCHAR uni2575 +ENCODING 9589 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 7 3 4 +BITMAP +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2576 +ENCODING 9590 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 1 3 4 +BITMAP +F0 +ENDCHAR +STARTCHAR uni2577 +ENCODING 9591 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 7 3 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2578 +ENCODING 9592 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 2 0 3 +BITMAP +F0 +F0 +ENDCHAR +STARTCHAR uni2579 +ENCODING 9593 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 7 3 4 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni257A +ENCODING 9594 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 2 3 3 +BITMAP +F0 +F0 +ENDCHAR +STARTCHAR uni257B +ENCODING 9595 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 7 3 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni257C +ENCODING 9596 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 2 0 3 +BITMAP +FE +1E +ENDCHAR +STARTCHAR uni257D +ENCODING 9597 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 13 3 -2 +BITMAP +80 +80 +80 +80 +80 +80 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni257E +ENCODING 9598 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 2 0 3 +BITMAP +FE +F0 +ENDCHAR +STARTCHAR uni257F +ENCODING 9599 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 13 3 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR upblock +ENCODING 9600 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 4 +BITMAP +FE +FE +FE +FE +FE +FE +FE +ENDCHAR +STARTCHAR uni2581 +ENCODING 9601 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 1 0 -2 +BITMAP +FE +ENDCHAR +STARTCHAR uni2582 +ENCODING 9602 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 3 0 -2 +BITMAP +FE +FE +FE +ENDCHAR +STARTCHAR uni2583 +ENCODING 9603 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 4 0 -2 +BITMAP +FE +FE +FE +FE +ENDCHAR +STARTCHAR dnblock +ENCODING 9604 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 -2 +BITMAP +FE +FE +FE +FE +FE +FE +FE +ENDCHAR +STARTCHAR uni2585 +ENCODING 9605 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 8 0 -2 +BITMAP +FE +FE +FE +FE +FE +FE +FE +FE +ENDCHAR +STARTCHAR uni2586 +ENCODING 9606 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni2587 +ENCODING 9607 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 11 0 -2 +BITMAP +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +ENDCHAR +STARTCHAR block +ENCODING 9608 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +ENDCHAR +STARTCHAR uni2589 +ENCODING 9609 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 13 0 -2 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni258A +ENCODING 9610 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 13 0 -2 +BITMAP +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni258B +ENCODING 9611 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 13 0 -2 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR lfblock +ENCODING 9612 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 13 0 -2 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni258D +ENCODING 9613 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 13 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni258E +ENCODING 9614 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 2 13 0 -2 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni258F +ENCODING 9615 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 13 0 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR rtblock +ENCODING 9616 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 13 3 -2 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR ltshade +ENCODING 9617 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +88 +22 +88 +22 +88 +22 +88 +22 +88 +22 +88 +22 +88 +ENDCHAR +STARTCHAR shade +ENCODING 9618 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +54 +AA +54 +AA +54 +AA +54 +AA +54 +AA +54 +AA +54 +ENDCHAR +STARTCHAR dkshade +ENCODING 9619 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +DC +76 +DC +76 +DC +76 +DC +76 +DC +76 +DC +76 +DC +ENDCHAR +STARTCHAR uni2594 +ENCODING 9620 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 2 0 9 +BITMAP +FE +FE +ENDCHAR +STARTCHAR uni2595 +ENCODING 9621 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 1 13 6 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2596 +ENCODING 9622 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 7 0 -2 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni2597 +ENCODING 9623 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 7 3 -2 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni2598 +ENCODING 9624 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 7 0 4 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni2599 +ENCODING 9625 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +FE +FE +FE +FE +FE +FE +FE +ENDCHAR +STARTCHAR uni259A +ENCODING 9626 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +FE +1E +1E +1E +1E +1E +1E +ENDCHAR +STARTCHAR uni259B +ENCODING 9627 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +FE +FE +FE +FE +FE +FE +FE +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni259C +ENCODING 9628 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +FE +FE +FE +FE +FE +FE +FE +1E +1E +1E +1E +1E +1E +ENDCHAR +STARTCHAR uni259D +ENCODING 9629 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 7 3 4 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni259E +ENCODING 9630 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +1E +1E +1E +1E +1E +1E +FE +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni259F +ENCODING 9631 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 13 0 -2 +BITMAP +1E +1E +1E +1E +1E +1E +FE +FE +FE +FE +FE +FE +FE +ENDCHAR +STARTCHAR filledbox +ENCODING 9632 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 2 +BITMAP +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR H22073 +ENCODING 9633 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 2 +BITMAP +FC +84 +84 +84 +84 +FC +ENDCHAR +STARTCHAR uni25A2 +ENCODING 9634 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 2 +BITMAP +78 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni25A3 +ENCODING 9635 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 2 +BITMAP +FC +84 +B4 +B4 +84 +FC +ENDCHAR +STARTCHAR H18543 +ENCODING 9642 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 3 2 3 +BITMAP +E0 +E0 +E0 +ENDCHAR +STARTCHAR H18551 +ENCODING 9643 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 3 2 3 +BITMAP +E0 +A0 +E0 +ENDCHAR +STARTCHAR filledrect +ENCODING 9644 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 3 0 3 +BITMAP +FC +FC +FC +ENDCHAR +STARTCHAR uni25AD +ENCODING 9645 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 3 0 3 +BITMAP +FC +84 +FC +ENDCHAR +STARTCHAR uni25AE +ENCODING 9646 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 9 2 0 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni25AF +ENCODING 9647 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 9 2 0 +BITMAP +E0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +E0 +ENDCHAR +STARTCHAR uni25B0 +ENCODING 9648 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 3 0 3 +BITMAP +3E +7C +F8 +ENDCHAR +STARTCHAR uni25B1 +ENCODING 9649 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 3 0 3 +BITMAP +3E +44 +F8 +ENDCHAR +STARTCHAR triagup +ENCODING 9650 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +10 +10 +38 +38 +7C +7C +FE +ENDCHAR +STARTCHAR uni25B3 +ENCODING 9651 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +10 +10 +28 +28 +44 +44 +FE +ENDCHAR +STARTCHAR uni25B4 +ENCODING 9652 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 3 1 3 +BITMAP +20 +70 +F8 +ENDCHAR +STARTCHAR uni25B5 +ENCODING 9653 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 3 1 3 +BITMAP +20 +50 +F8 +ENDCHAR +STARTCHAR uni25B6 +ENCODING 9654 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +80 +E0 +F8 +FE +F8 +E0 +80 +ENDCHAR +STARTCHAR uni25B7 +ENCODING 9655 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +80 +E0 +98 +86 +98 +E0 +80 +ENDCHAR +STARTCHAR uni25B8 +ENCODING 9656 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 5 2 2 +BITMAP +80 +C0 +E0 +C0 +80 +ENDCHAR +STARTCHAR uni25B9 +ENCODING 9657 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 5 2 2 +BITMAP +80 +C0 +A0 +C0 +80 +ENDCHAR +STARTCHAR triagrt +ENCODING 9658 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +C0 +F0 +FC +F0 +C0 +ENDCHAR +STARTCHAR uni25BB +ENCODING 9659 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +C0 +B0 +8C +B0 +C0 +ENDCHAR +STARTCHAR triagdn +ENCODING 9660 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +7C +7C +38 +38 +10 +10 +ENDCHAR +STARTCHAR uni25BD +ENCODING 9661 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +44 +44 +28 +28 +10 +10 +ENDCHAR +STARTCHAR uni25BE +ENCODING 9662 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 3 1 3 +BITMAP +F8 +70 +20 +ENDCHAR +STARTCHAR uni25BF +ENCODING 9663 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 3 1 3 +BITMAP +F8 +50 +20 +ENDCHAR +STARTCHAR uni25C0 +ENCODING 9664 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +02 +0E +3E +FE +3E +0E +02 +ENDCHAR +STARTCHAR uni25C1 +ENCODING 9665 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +02 +0E +32 +C2 +32 +0E +02 +ENDCHAR +STARTCHAR uni25C2 +ENCODING 9666 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 5 2 2 +BITMAP +20 +60 +E0 +60 +20 +ENDCHAR +STARTCHAR uni25C3 +ENCODING 9667 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 5 2 2 +BITMAP +20 +60 +A0 +60 +20 +ENDCHAR +STARTCHAR triaglf +ENCODING 9668 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +0C +3C +FC +3C +0C +ENDCHAR +STARTCHAR uni25C5 +ENCODING 9669 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +0C +34 +C4 +34 +0C +ENDCHAR +STARTCHAR uni25C6 +ENCODING 9670 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +10 +38 +7C +FE +7C +38 +10 +ENDCHAR +STARTCHAR uni25C7 +ENCODING 9671 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +10 +28 +44 +82 +44 +28 +10 +ENDCHAR +STARTCHAR uni25C8 +ENCODING 9672 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +10 +28 +54 +BA +54 +28 +10 +ENDCHAR +STARTCHAR uni25C9 +ENCODING 9673 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +44 +BA +BA +BA +44 +38 +ENDCHAR +STARTCHAR lozenge +ENCODING 9674 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 10 1 0 +BITMAP +20 +20 +50 +50 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR circle +ENCODING 9675 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +44 +82 +82 +82 +44 +38 +ENDCHAR +STARTCHAR uni25CC +ENCODING 9676 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +10 +44 +00 +82 +00 +44 +10 +ENDCHAR +STARTCHAR uni25CD +ENCODING 9677 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +6C +AA +AA +AA +6C +38 +ENDCHAR +STARTCHAR uni25CE +ENCODING 9678 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +44 +92 +AA +92 +44 +38 +ENDCHAR +STARTCHAR H18533 +ENCODING 9679 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +7C +FE +FE +FE +7C +38 +ENDCHAR +STARTCHAR uni25D0 +ENCODING 9680 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +74 +F2 +F2 +F2 +74 +38 +ENDCHAR +STARTCHAR uni25D1 +ENCODING 9681 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +5C +9E +9E +9E +5C +38 +ENDCHAR +STARTCHAR uni25D2 +ENCODING 9682 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +44 +82 +FE +FE +7C +38 +ENDCHAR +STARTCHAR uni25D3 +ENCODING 9683 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +7C +FE +FE +82 +44 +38 +ENDCHAR +STARTCHAR uni25D4 +ENCODING 9684 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +5C +9E +9E +82 +44 +38 +ENDCHAR +STARTCHAR uni25D5 +ENCODING 9685 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +5C +9E +FE +FE +7C +38 +ENDCHAR +STARTCHAR uni25D6 +ENCODING 9686 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 7 0 1 +BITMAP +30 +70 +F0 +F0 +F0 +70 +30 +ENDCHAR +STARTCHAR uni25D7 +ENCODING 9687 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 7 3 1 +BITMAP +C0 +E0 +F0 +F0 +F0 +E0 +C0 +ENDCHAR +STARTCHAR invbullet +ENCODING 9688 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +FE +FE +C6 +BA +BA +BA +C6 +FE +FE +ENDCHAR +STARTCHAR uni25DC +ENCODING 9692 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 4 0 4 +BITMAP +30 +40 +80 +80 +ENDCHAR +STARTCHAR uni25DD +ENCODING 9693 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 4 3 4 +BITMAP +C0 +20 +10 +10 +ENDCHAR +STARTCHAR uni25DE +ENCODING 9694 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 4 3 1 +BITMAP +10 +10 +20 +C0 +ENDCHAR +STARTCHAR uni25DF +ENCODING 9695 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 4 0 1 +BITMAP +80 +80 +40 +30 +ENDCHAR +STARTCHAR uni25E0 +ENCODING 9696 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 4 0 4 +BITMAP +38 +44 +82 +82 +ENDCHAR +STARTCHAR uni25E1 +ENCODING 9697 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 4 0 1 +BITMAP +82 +82 +44 +38 +ENDCHAR +STARTCHAR uni25E2 +ENCODING 9698 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +02 +06 +0E +1E +3E +7E +FE +ENDCHAR +STARTCHAR uni25E3 +ENCODING 9699 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +80 +C0 +E0 +F0 +F8 +FC +FE +ENDCHAR +STARTCHAR uni25E4 +ENCODING 9700 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +FC +F8 +F0 +E0 +C0 +80 +ENDCHAR +STARTCHAR uni25E5 +ENCODING 9701 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +7E +3E +1E +0E +06 +02 +ENDCHAR +STARTCHAR openbullet +ENCODING 9702 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni25E7 +ENCODING 9703 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +F2 +F2 +F2 +F2 +F2 +FE +ENDCHAR +STARTCHAR uni25E8 +ENCODING 9704 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +9E +9E +9E +9E +9E +FE +ENDCHAR +STARTCHAR uni25E9 +ENCODING 9705 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +FE +FA +F2 +E2 +C2 +FE +ENDCHAR +STARTCHAR uni25EA +ENCODING 9706 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +86 +8E +9E +BE +FE +FE +ENDCHAR +STARTCHAR uni25EB +ENCODING 9707 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +92 +92 +92 +92 +92 +FE +ENDCHAR +STARTCHAR uni25EC +ENCODING 9708 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 8 0 1 +BITMAP +10 +10 +28 +28 +44 +54 +82 +FE +ENDCHAR +STARTCHAR uni25ED +ENCODING 9709 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 8 0 1 +BITMAP +10 +10 +38 +38 +74 +74 +F2 +FE +ENDCHAR +STARTCHAR uni25EE +ENCODING 9710 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 8 0 1 +BITMAP +10 +10 +38 +38 +5C +5C +9E +FE +ENDCHAR +STARTCHAR uni25EF +ENCODING 9711 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +44 +82 +82 +82 +44 +38 +ENDCHAR +STARTCHAR uni25F0 +ENCODING 9712 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +92 +92 +F2 +82 +82 +FE +ENDCHAR +STARTCHAR uni25F1 +ENCODING 9713 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +82 +82 +F2 +92 +92 +FE +ENDCHAR +STARTCHAR uni25F2 +ENCODING 9714 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +82 +82 +9E +92 +92 +FE +ENDCHAR +STARTCHAR uni25F3 +ENCODING 9715 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +92 +92 +9E +82 +82 +FE +ENDCHAR +STARTCHAR uni25F4 +ENCODING 9716 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +54 +92 +F2 +82 +44 +38 +ENDCHAR +STARTCHAR uni25F5 +ENCODING 9717 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +44 +82 +F2 +92 +54 +38 +ENDCHAR +STARTCHAR uni25F6 +ENCODING 9718 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +44 +82 +9E +92 +54 +38 +ENDCHAR +STARTCHAR uni25F7 +ENCODING 9719 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +54 +92 +9E +82 +44 +38 +ENDCHAR +STARTCHAR uni25F8 +ENCODING 9720 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +84 +88 +90 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni25F9 +ENCODING 9721 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +42 +22 +12 +0A +06 +02 +ENDCHAR +STARTCHAR uni25FA +ENCODING 9722 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +80 +C0 +A0 +90 +88 +84 +FE +ENDCHAR +STARTCHAR uni25FB +ENCODING 9723 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +82 +82 +82 +82 +82 +FE +ENDCHAR +STARTCHAR uni25FC +ENCODING 9724 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +FE +FE +FE +FE +FE +FE +ENDCHAR +STARTCHAR uni25FD +ENCODING 9725 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +F8 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni25FE +ENCODING 9726 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni25FF +ENCODING 9727 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +02 +06 +0A +12 +22 +42 +FE +ENDCHAR +STARTCHAR uni2600 +ENCODING 9728 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +10 +92 +54 +38 +FE +38 +54 +92 +10 +ENDCHAR +STARTCHAR uni2602 +ENCODING 9730 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +10 +7C +FE +FE +10 +10 +10 +10 +50 +20 +ENDCHAR +STARTCHAR uni2605 +ENCODING 9733 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 8 0 2 +BITMAP +10 +10 +38 +FE +7C +38 +6C +44 +ENDCHAR +STARTCHAR uni2606 +ENCODING 9734 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 8 0 2 +BITMAP +10 +10 +28 +C6 +44 +28 +7C +44 +ENDCHAR +STARTCHAR uni2609 +ENCODING 9737 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +44 +82 +92 +82 +44 +38 +ENDCHAR +STARTCHAR uni260A +ENCODING 9738 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +38 +44 +82 +82 +82 +44 +AA +AA +44 +ENDCHAR +STARTCHAR uni260B +ENCODING 9739 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +44 +AA +AA +44 +82 +82 +82 +44 +38 +ENDCHAR +STARTCHAR uni260E +ENCODING 9742 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +7C +C6 +BA +7C +EE +D6 +EE +FE +FE +ENDCHAR +STARTCHAR uni260F +ENCODING 9743 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +7C +C6 +BA +44 +92 +AA +92 +82 +FE +ENDCHAR +STARTCHAR uni2610 +ENCODING 9744 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +FE +82 +82 +82 +82 +82 +82 +82 +FE +ENDCHAR +STARTCHAR uni2611 +ENCODING 9745 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +FE +82 +8A +8A +92 +D2 +A2 +82 +FE +ENDCHAR +STARTCHAR uni2612 +ENCODING 9746 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +FE +82 +C6 +AA +92 +AA +C6 +82 +FE +ENDCHAR +STARTCHAR uni262A +ENCODING 9770 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +38 +60 +C0 +C8 +DC +C8 +C0 +60 +38 +ENDCHAR +STARTCHAR uni2639 +ENCODING 9785 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +38 +44 +AA +AA +82 +92 +AA +44 +38 +ENDCHAR +STARTCHAR smileface +ENCODING 9786 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +38 +44 +AA +AA +82 +C6 +BA +44 +38 +ENDCHAR +STARTCHAR invsmileface +ENCODING 9787 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +38 +7C +D6 +D6 +FE +BA +C6 +7C +38 +ENDCHAR +STARTCHAR sun +ENCODING 9788 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +10 +92 +54 +28 +C6 +28 +54 +92 +10 +ENDCHAR +STARTCHAR uni263D +ENCODING 9789 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +E0 +50 +28 +28 +28 +28 +28 +50 +E0 +ENDCHAR +STARTCHAR uni263E +ENCODING 9790 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +38 +50 +A0 +A0 +A0 +A0 +A0 +50 +38 +ENDCHAR +STARTCHAR uni263F +ENCODING 9791 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 10 1 -1 +BITMAP +88 +88 +70 +88 +88 +88 +70 +20 +70 +20 +ENDCHAR +STARTCHAR female +ENCODING 9792 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +70 +88 +88 +88 +70 +20 +70 +20 +ENDCHAR +STARTCHAR uni2641 +ENCODING 9793 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 1 1 +BITMAP +20 +70 +20 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR male +ENCODING 9794 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 8 1 1 +BITMAP +1C +0C +14 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2643 +ENCODING 9795 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +04 +64 +94 +14 +24 +FC +04 +04 +04 +ENDCHAR +STARTCHAR uni2644 +ENCODING 9796 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +40 +E0 +40 +58 +64 +44 +44 +44 +48 +ENDCHAR +STARTCHAR uni2645 +ENCODING 9797 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +D6 +54 +7C +54 +D6 +10 +28 +28 +10 +ENDCHAR +STARTCHAR uni2646 +ENCODING 9798 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 11 0 -1 +BITMAP +10 +38 +10 +54 +D6 +54 +54 +38 +10 +38 +10 +ENDCHAR +STARTCHAR uni2647 +ENCODING 9799 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +F0 +88 +88 +88 +F0 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni2648 +ENCODING 9800 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +50 +A8 +A8 +A8 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2649 +ENCODING 9801 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +88 +88 +50 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni264A +ENCODING 9802 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +D8 +70 +50 +50 +50 +50 +70 +D8 +ENDCHAR +STARTCHAR uni264B +ENCODING 9803 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 8 0 0 +BITMAP +38 +54 +52 +20 +08 +94 +54 +38 +ENDCHAR +STARTCHAR uni264C +ENCODING 9804 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +38 +44 +44 +44 +28 +68 +A8 +AA +44 +ENDCHAR +STARTCHAR uni264D +ENCODING 9805 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 -2 +BITMAP +50 +A8 +AC +AA +AA +AA +AA +AC +08 +34 +ENDCHAR +STARTCHAR uni264E +ENCODING 9806 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 1 1 +BITMAP +70 +88 +88 +88 +50 +D8 +00 +F8 +ENDCHAR +STARTCHAR uni264F +ENCODING 9807 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 -1 +BITMAP +50 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +AA +06 +ENDCHAR +STARTCHAR uni2650 +ENCODING 9808 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +3C +0C +F4 +34 +50 +90 +ENDCHAR +STARTCHAR uni2651 +ENCODING 9809 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +A0 +50 +50 +50 +50 +10 +18 +14 +28 +ENDCHAR +STARTCHAR uni2652 +ENCODING 9810 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +54 +A8 +00 +54 +A8 +ENDCHAR +STARTCHAR uni2653 +ENCODING 9811 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +88 +50 +50 +50 +F8 +50 +50 +50 +88 +ENDCHAR +STARTCHAR uni2654 +ENCODING 9812 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +70 +20 +50 +A8 +A8 +A8 +A8 +70 +88 +F8 +ENDCHAR +STARTCHAR uni2655 +ENCODING 9813 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +10 +54 +54 +28 +AA +54 +38 +44 +7C +ENDCHAR +STARTCHAR uni2656 +ENCODING 9814 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +A8 +F8 +88 +F8 +50 +50 +50 +50 +70 +88 +F8 +ENDCHAR +STARTCHAR uni2657 +ENCODING 9815 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +50 +A8 +F8 +A8 +88 +50 +50 +70 +88 +F8 +ENDCHAR +STARTCHAR uni2658 +ENCODING 9816 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +A0 +E0 +90 +C8 +88 +A8 +C8 +48 +70 +88 +F8 +ENDCHAR +STARTCHAR uni2659 +ENCODING 9817 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +20 +50 +50 +20 +50 +70 +88 +F8 +ENDCHAR +STARTCHAR uni265A +ENCODING 9818 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +70 +20 +70 +F8 +A8 +A8 +F8 +50 +F8 +F8 +ENDCHAR +STARTCHAR uni265B +ENCODING 9819 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +10 +54 +54 +38 +BA +54 +38 +7C +7C +ENDCHAR +STARTCHAR uni265C +ENCODING 9820 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +A8 +F8 +F8 +F8 +50 +70 +70 +70 +50 +F8 +F8 +ENDCHAR +STARTCHAR uni265D +ENCODING 9821 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +70 +D8 +88 +D8 +F8 +70 +50 +70 +F8 +F8 +ENDCHAR +STARTCHAR uni265E +ENCODING 9822 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +A0 +E0 +F0 +B8 +F8 +D8 +B8 +78 +50 +F8 +F8 +ENDCHAR +STARTCHAR uni265F +ENCODING 9823 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 1 0 +BITMAP +20 +70 +70 +20 +50 +70 +F8 +F8 +ENDCHAR +STARTCHAR spade +ENCODING 9824 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +10 +38 +7C +FE +FE +FE +54 +10 +38 +ENDCHAR +STARTCHAR uni2661 +ENCODING 9825 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +6C +92 +82 +82 +82 +44 +44 +28 +10 +ENDCHAR +STARTCHAR uni2662 +ENCODING 9826 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +10 +28 +44 +44 +82 +44 +44 +28 +10 +ENDCHAR +STARTCHAR club +ENCODING 9827 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +10 +38 +38 +54 +FE +FE +54 +10 +38 +ENDCHAR +STARTCHAR uni2664 +ENCODING 9828 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +10 +28 +44 +82 +92 +BA +54 +10 +38 +ENDCHAR +STARTCHAR heart +ENCODING 9829 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +6C +FE +FE +FE +FE +7C +7C +38 +10 +ENDCHAR +STARTCHAR diamond +ENCODING 9830 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +10 +38 +7C +7C +FE +7C +7C +38 +10 +ENDCHAR +STARTCHAR uni2667 +ENCODING 9831 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +10 +28 +28 +54 +BA +BA +54 +10 +38 +ENDCHAR +STARTCHAR uni2669 +ENCODING 9833 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 11 1 0 +BITMAP +20 +20 +20 +20 +20 +20 +20 +60 +E0 +E0 +40 +ENDCHAR +STARTCHAR musicalnote +ENCODING 9834 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +20 +30 +28 +20 +20 +20 +20 +60 +E0 +E0 +40 +ENDCHAR +STARTCHAR musicalnotedbl +ENCODING 9835 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 12 0 -1 +BITMAP +30 +3C +2C +24 +24 +24 +64 +E4 +EC +5C +1C +08 +ENDCHAR +STARTCHAR uni266C +ENCODING 9836 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 12 0 -1 +BITMAP +30 +3C +2C +34 +3C +2C +64 +E4 +EC +5C +1C +08 +ENDCHAR +STARTCHAR uni266D +ENCODING 9837 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +80 +80 +80 +B0 +C8 +88 +88 +90 +E0 +ENDCHAR +STARTCHAR uni266E +ENCODING 9838 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -2 +BITMAP +80 +80 +98 +A8 +C8 +88 +98 +A8 +C8 +08 +08 +ENDCHAR +STARTCHAR uni266F +ENCODING 9839 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 -1 +BITMAP +10 +50 +58 +70 +D0 +50 +58 +70 +D0 +50 +40 +ENDCHAR +STARTCHAR uni2680 +ENCODING 9856 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +FE +82 +82 +82 +92 +82 +82 +82 +FE +ENDCHAR +STARTCHAR uni2681 +ENCODING 9857 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +FE +82 +8A +82 +82 +82 +A2 +82 +FE +ENDCHAR +STARTCHAR uni2682 +ENCODING 9858 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +FE +82 +8A +82 +92 +82 +A2 +82 +FE +ENDCHAR +STARTCHAR uni2683 +ENCODING 9859 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +FE +82 +AA +82 +82 +82 +AA +82 +FE +ENDCHAR +STARTCHAR uni2684 +ENCODING 9860 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +FE +82 +AA +82 +92 +82 +AA +82 +FE +ENDCHAR +STARTCHAR uni2685 +ENCODING 9861 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 9 0 0 +BITMAP +FE +82 +AA +82 +AA +82 +AA +82 +FE +ENDCHAR +STARTCHAR uni2690 +ENCODING 9872 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +88 +90 +88 +FC +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2691 +ENCODING 9873 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +FC +F8 +F0 +F8 +FC +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni271D +ENCODING 10013 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +20 +20 +F8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2776 +ENCODING 10102 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +FE +EE +CE +EE +EE +EE +EE +FE +7C +ENDCHAR +STARTCHAR uni2777 +ENCODING 10103 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +FE +CE +F6 +F6 +EE +DE +C6 +FE +7C +ENDCHAR +STARTCHAR uni2778 +ENCODING 10104 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +FE +CE +F6 +CE +F6 +F6 +CE +FE +7C +ENDCHAR +STARTCHAR uni2779 +ENCODING 10105 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +FE +F6 +E6 +D6 +C6 +F6 +F6 +FE +7C +ENDCHAR +STARTCHAR uni277A +ENCODING 10106 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +FE +C6 +DE +CE +F6 +F6 +CE +FE +7C +ENDCHAR +STARTCHAR uni277B +ENCODING 10107 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +FE +E6 +DE +CE +D6 +D6 +EE +FE +7C +ENDCHAR +STARTCHAR uni277C +ENCODING 10108 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +FE +C6 +F6 +F6 +EE +EE +EE +FE +7C +ENDCHAR +STARTCHAR uni277D +ENCODING 10109 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +FE +EE +D6 +EE +D6 +D6 +EE +FE +7C +ENDCHAR +STARTCHAR uni277E +ENCODING 10110 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +FE +EE +D6 +D6 +E6 +F6 +CE +FE +7C +ENDCHAR +STARTCHAR uni277F +ENCODING 10111 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +FE +D6 +8A +CA +CA +CA +D6 +FE +7C +ENDCHAR +STARTCHAR uni2780 +ENCODING 10112 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +82 +92 +B2 +92 +92 +92 +92 +82 +7C +ENDCHAR +STARTCHAR uni2781 +ENCODING 10113 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +82 +B2 +8A +8A +92 +A2 +BA +82 +7C +ENDCHAR +STARTCHAR uni2782 +ENCODING 10114 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +82 +B2 +8A +B2 +8A +8A +B2 +82 +7C +ENDCHAR +STARTCHAR uni2783 +ENCODING 10115 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +82 +8A +9A +AA +BA +8A +8A +82 +7C +ENDCHAR +STARTCHAR uni2784 +ENCODING 10116 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +82 +BA +A2 +B2 +8A +8A +B2 +82 +7C +ENDCHAR +STARTCHAR uni2785 +ENCODING 10117 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +82 +9A +A2 +B2 +AA +AA +92 +82 +7C +ENDCHAR +STARTCHAR uni2786 +ENCODING 10118 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +82 +BA +8A +8A +92 +92 +92 +82 +7C +ENDCHAR +STARTCHAR uni2787 +ENCODING 10119 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +82 +92 +AA +92 +AA +AA +92 +82 +7C +ENDCHAR +STARTCHAR uni2788 +ENCODING 10120 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +82 +92 +AA +AA +9A +8A +B2 +82 +7C +ENDCHAR +STARTCHAR uni2789 +ENCODING 10121 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +82 +AA +F6 +B6 +B6 +B6 +AA +82 +7C +ENDCHAR +STARTCHAR uni278A +ENCODING 10122 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +FE +EE +CE +EE +EE +EE +EE +FE +7C +ENDCHAR +STARTCHAR uni278B +ENCODING 10123 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +FE +CE +F6 +F6 +EE +DE +C6 +FE +7C +ENDCHAR +STARTCHAR uni278C +ENCODING 10124 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +FE +CE +F6 +CE +F6 +F6 +CE +FE +7C +ENDCHAR +STARTCHAR uni278D +ENCODING 10125 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +FE +F6 +E6 +D6 +C6 +F6 +F6 +FE +7C +ENDCHAR +STARTCHAR uni278E +ENCODING 10126 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +FE +C6 +DE +CE +F6 +F6 +CE +FE +7C +ENDCHAR +STARTCHAR uni278F +ENCODING 10127 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +FE +E6 +DE +CE +D6 +D6 +EE +FE +7C +ENDCHAR +STARTCHAR uni2790 +ENCODING 10128 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +FE +C6 +F6 +F6 +EE +EE +EE +FE +7C +ENDCHAR +STARTCHAR uni2791 +ENCODING 10129 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +FE +EE +D6 +EE +D6 +D6 +EE +FE +7C +ENDCHAR +STARTCHAR uni2792 +ENCODING 10130 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +FE +EE +D6 +D6 +E6 +F6 +CE +FE +7C +ENDCHAR +STARTCHAR uni2793 +ENCODING 10131 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7C +FE +D6 +8A +CA +CA +CA +D6 +FE +7C +ENDCHAR +STARTCHAR uni2794 +ENCODING 10132 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +10 +08 +FC +08 +10 +ENDCHAR +STARTCHAR uni2795 +ENCODING 10133 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +20 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni2796 +ENCODING 10134 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 1 1 4 +BITMAP +F8 +ENDCHAR +STARTCHAR uni2797 +ENCODING 10135 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +20 +00 +F8 +00 +20 +ENDCHAR +STARTCHAR uni2798 +ENCODING 10136 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 5 1 0 +BITMAP +80 +48 +28 +18 +78 +ENDCHAR +STARTCHAR uni2799 +ENCODING 10137 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +20 +10 +F8 +10 +20 +ENDCHAR +STARTCHAR uni279A +ENCODING 10138 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 5 1 0 +BITMAP +78 +18 +28 +48 +80 +ENDCHAR +STARTCHAR uni279B +ENCODING 10139 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +10 +08 +FC +08 +10 +ENDCHAR +STARTCHAR uni279C +ENCODING 10140 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +10 +08 +FC +08 +10 +ENDCHAR +STARTCHAR uni279D +ENCODING 10141 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +10 +18 +FC +18 +10 +ENDCHAR +STARTCHAR uni279E +ENCODING 10142 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +10 +18 +FC +18 +10 +ENDCHAR +STARTCHAR uni279F +ENCODING 10143 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 5 0 2 +BITMAP +10 +18 +BC +18 +10 +ENDCHAR +STARTCHAR uni27A0 +ENCODING 10144 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +10 +18 +BC +BE +BC +18 +10 +ENDCHAR +STARTCHAR uni27A1 +ENCODING 10145 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +10 +18 +FC +FE +FC +18 +10 +ENDCHAR +STARTCHAR uni29CE +ENCODING 10702 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 0 0 +BITMAP +18 +68 +88 +68 +18 +C0 +B0 +88 +B0 +C0 +ENDCHAR +STARTCHAR uni29CF +ENCODING 10703 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 3 +BITMAP +28 +68 +A8 +68 +28 +ENDCHAR +STARTCHAR uni29D0 +ENCODING 10704 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 3 +BITMAP +A0 +B0 +A8 +B0 +A0 +ENDCHAR +STARTCHAR uni29D1 +ENCODING 10705 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 3 +BITMAP +88 +D8 +E8 +D8 +88 +ENDCHAR +STARTCHAR uni29D2 +ENCODING 10706 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 3 +BITMAP +88 +D8 +B8 +D8 +88 +ENDCHAR +STARTCHAR uni29D3 +ENCODING 10707 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 3 +BITMAP +88 +D8 +F8 +D8 +88 +ENDCHAR +STARTCHAR uni29D4 +ENCODING 10708 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 3 +BITMAP +88 +D0 +E0 +D0 +88 +ENDCHAR +STARTCHAR uni29D5 +ENCODING 10709 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 3 +BITMAP +88 +58 +38 +58 +88 +ENDCHAR +STARTCHAR uni29D6 +ENCODING 10710 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 3 +BITMAP +F8 +50 +20 +50 +F8 +ENDCHAR +STARTCHAR uni29D7 +ENCODING 10711 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 3 +BITMAP +F8 +70 +20 +70 +F8 +ENDCHAR +STARTCHAR uni2A00 +ENCODING 10752 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +70 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2A01 +ENCODING 10753 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +70 +A8 +F8 +A8 +70 +ENDCHAR +STARTCHAR uni2A02 +ENCODING 10754 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +70 +D8 +A8 +D8 +70 +ENDCHAR +STARTCHAR uni2A03 +ENCODING 10755 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +88 +88 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2A04 +ENCODING 10756 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +A8 +F8 +A8 +88 +70 +ENDCHAR +STARTCHAR uni2A05 +ENCODING 10757 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni2A06 +ENCODING 10758 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni2A09 +ENCODING 10761 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni2B00 +ENCODING 11008 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +78 +28 +58 +A8 +40 +ENDCHAR +STARTCHAR uni2B01 +ENCODING 11009 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +F0 +A0 +D0 +A8 +10 +ENDCHAR +STARTCHAR uni2B02 +ENCODING 11010 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +40 +A8 +58 +28 +78 +ENDCHAR +STARTCHAR uni2B03 +ENCODING 11011 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 2 +BITMAP +10 +A8 +D0 +A0 +F0 +ENDCHAR +STARTCHAR uni2B04 +ENCODING 11012 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 2 +BITMAP +28 +7C +82 +7C +28 +ENDCHAR +STARTCHAR uni2B05 +ENCODING 11013 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +10 +30 +7E +FE +7E +30 +10 +ENDCHAR +STARTCHAR uni2B06 +ENCODING 11014 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +10 +38 +7C +FE +38 +38 +38 +ENDCHAR +STARTCHAR uni2B07 +ENCODING 11015 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +38 +38 +38 +FE +7C +38 +10 +ENDCHAR +STARTCHAR uni2B08 +ENCODING 11016 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +7E +3E +1E +3E +76 +E2 +C0 +ENDCHAR +STARTCHAR uni2B09 +ENCODING 11017 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FC +F8 +F0 +F8 +DC +8E +06 +ENDCHAR +STARTCHAR uni2B0A +ENCODING 11018 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +C0 +E2 +76 +3E +1E +3E +7E +ENDCHAR +STARTCHAR uni2B0B +ENCODING 11019 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +06 +8E +DC +F8 +F0 +F8 +FC +ENDCHAR +STARTCHAR uni2B0C +ENCODING 11020 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 2 +BITMAP +28 +7C +FE +7C +28 +ENDCHAR +STARTCHAR uni2B0D +ENCODING 11021 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 1 0 +BITMAP +20 +70 +F8 +70 +70 +70 +F8 +70 +20 +ENDCHAR +STARTCHAR uni2B12 +ENCODING 11026 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +FE +FE +FE +82 +82 +FE +ENDCHAR +STARTCHAR uni2B13 +ENCODING 11027 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +82 +82 +FE +FE +FE +FE +ENDCHAR +STARTCHAR uni2B14 +ENCODING 11028 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +FE +BE +9E +8E +86 +FE +ENDCHAR +STARTCHAR uni2B15 +ENCODING 11029 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +C2 +E2 +F2 +FA +FE +FE +ENDCHAR +STARTCHAR uni2B16 +ENCODING 11030 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +10 +38 +74 +F2 +74 +38 +10 +ENDCHAR +STARTCHAR uni2B17 +ENCODING 11031 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +10 +38 +5C +9E +5C +38 +10 +ENDCHAR +STARTCHAR uni2B18 +ENCODING 11032 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +10 +38 +7C +FE +44 +28 +10 +ENDCHAR +STARTCHAR uni2B19 +ENCODING 11033 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +10 +28 +44 +FE +7C +38 +10 +ENDCHAR +STARTCHAR uni2B1A +ENCODING 11034 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +AA +00 +82 +00 +82 +00 +AA +ENDCHAR +STARTCHAR uni2B1B +ENCODING 11035 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +FE +FE +FE +FE +FE +FE +ENDCHAR +STARTCHAR uni2B1C +ENCODING 11036 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 7 7 0 1 +BITMAP +FE +82 +82 +82 +82 +82 +FE +ENDCHAR +STARTCHAR uni2B2C +ENCODING 11052 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 7 5 0 2 +BITMAP +7C +FE +FE +FE +7C +ENDCHAR +STARTCHAR uni2B2D +ENCODING 11053 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 7 5 0 2 +BITMAP +7C +82 +82 +82 +7C +ENDCHAR +STARTCHAR uni2B2E +ENCODING 11054 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 7 1 1 +BITMAP +70 +F8 +F8 +F8 +F8 +F8 +70 +ENDCHAR +STARTCHAR uni2B2F +ENCODING 11055 +SWIDTH 1000 0 +DWIDTH 7 0 +BBX 5 7 1 1 +BITMAP +70 +88 +88 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2C60 +ENCODING 11360 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +40 +40 +40 +F0 +40 +F0 +40 +40 +7C +ENDCHAR +STARTCHAR uni2C61 +ENCODING 11361 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 3 9 2 0 +BITMAP +E0 +40 +40 +E0 +40 +E0 +40 +40 +E0 +ENDCHAR +STARTCHAR uni2C62 +ENCODING 11362 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +20 +20 +20 +68 +B0 +20 +20 +20 +3C +ENDCHAR +STARTCHAR uni2C63 +ENCODING 11363 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +78 +44 +E4 +44 +78 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni2C64 +ENCODING 11364 +SWIDTH 538 0 +DWIDTH 7 0 +BBX 5 10 1 -1 +BITMAP +F0 +88 +88 +88 +F0 +C0 +A0 +90 +88 +40 +ENDCHAR +STARTCHAR uniA730 +ENCODING 42800 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +F8 +80 +80 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uniA731 +ENCODING 42801 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 7 1 0 +BITMAP +78 +80 +80 +70 +08 +08 +F0 +ENDCHAR +STARTCHAR uniFE7C +ENCODING 65148 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 4 0 7 +BITMAP +88 +A8 +B0 +40 +ENDCHAR +STARTCHAR uniFE7D +ENCODING 65149 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +88 +A8 +B0 +40 +00 +00 +00 +00 +00 +00 +FC +ENDCHAR +STARTCHAR uniFE7E +ENCODING 65150 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 3 1 9 +BITMAP +40 +A0 +40 +ENDCHAR +STARTCHAR uniFE7F +ENCODING 65151 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 0 +BITMAP +20 +50 +20 +00 +00 +00 +00 +00 +00 +00 +FC +ENDCHAR +STARTCHAR uniFE80 +ENCODING 65152 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 5 2 2 +BITMAP +60 +80 +80 +60 +C0 +ENDCHAR +STARTCHAR uniFE81 +ENCODING 65153 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 11 1 0 +BITMAP +50 +A0 +00 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uniFE82 +ENCODING 65154 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +50 +A0 +00 +40 +40 +40 +40 +40 +40 +40 +38 +ENDCHAR +STARTCHAR uniFE83 +ENCODING 65155 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 11 1 0 +BITMAP +60 +80 +E0 +00 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uniFE84 +ENCODING 65156 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 1 0 +BITMAP +60 +80 +E0 +00 +40 +40 +40 +40 +40 +40 +38 +ENDCHAR +STARTCHAR uniFE85 +ENCODING 65157 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 0 -2 +BITMAP +30 +40 +70 +00 +30 +48 +48 +48 +38 +08 +F0 +ENDCHAR +STARTCHAR uniFE86 +ENCODING 65158 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +30 +40 +70 +00 +30 +48 +48 +4C +3C +08 +F0 +ENDCHAR +STARTCHAR uniFE87 +ENCODING 65159 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 11 1 -2 +BITMAP +40 +40 +40 +40 +40 +40 +00 +00 +60 +80 +E0 +ENDCHAR +STARTCHAR uniFE88 +ENCODING 65160 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +20 +20 +20 +20 +20 +20 +00 +10 +64 +80 +E0 +ENDCHAR +STARTCHAR uniFE89 +ENCODING 65161 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 0 +BITMAP +60 +80 +E0 +08 +14 +50 +00 +88 +88 +70 +ENDCHAR +STARTCHAR uniFE8A +ENCODING 65162 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +60 +80 +E0 +00 +40 +84 +94 +90 +60 +ENDCHAR +STARTCHAR uniFE8B +ENCODING 65163 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 9 0 0 +BITMAP +30 +40 +70 +00 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uniFE8C +ENCODING 65164 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +30 +40 +70 +00 +20 +20 +20 +20 +DC +ENDCHAR +STARTCHAR uniFE8D +ENCODING 65165 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 1 9 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uniFE8E +ENCODING 65166 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 9 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +70 +ENDCHAR +STARTCHAR uniFE8F +ENCODING 65167 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 4 0 1 +BITMAP +10 +88 +88 +70 +ENDCHAR +STARTCHAR uniFE90 +ENCODING 65168 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 4 0 1 +BITMAP +10 +88 +88 +74 +ENDCHAR +STARTCHAR uniFE91 +ENCODING 65169 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 4 0 1 +BITMAP +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uniFE92 +ENCODING 65170 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 4 0 1 +BITMAP +20 +20 +20 +DC +ENDCHAR +STARTCHAR uniFE93 +ENCODING 65171 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 0 0 +BITMAP +50 +00 +60 +90 +88 +88 +00 +70 +ENDCHAR +STARTCHAR uniFE94 +ENCODING 65172 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 0 0 +BITMAP +50 +00 +30 +48 +88 +88 +00 +70 +ENDCHAR +STARTCHAR uniFE95 +ENCODING 65173 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 6 0 1 +BITMAP +50 +00 +10 +88 +88 +70 +ENDCHAR +STARTCHAR uniFE96 +ENCODING 65174 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +50 +00 +10 +88 +88 +74 +ENDCHAR +STARTCHAR uniFE97 +ENCODING 65175 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 6 0 1 +BITMAP +50 +00 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uniFE98 +ENCODING 65176 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +50 +00 +20 +20 +20 +DC +ENDCHAR +STARTCHAR uniFE99 +ENCODING 65177 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +20 +00 +50 +00 +10 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uniFE9A +ENCODING 65178 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +20 +00 +50 +00 +10 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uniFE9B +ENCODING 65179 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 9 0 0 +BITMAP +20 +00 +50 +00 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uniFE9C +ENCODING 65180 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +20 +00 +50 +00 +20 +20 +20 +20 +DC +ENDCHAR +STARTCHAR uniFE9D +ENCODING 65181 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +40 +80 +A0 +80 +00 +40 +38 +ENDCHAR +STARTCHAR uniFE9E +ENCODING 65182 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +F8 +30 +50 +88 +A4 +80 +00 +40 +38 +ENDCHAR +STARTCHAR uniFE9F +ENCODING 65183 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 4 0 1 +BITMAP +70 +08 +30 +C0 +ENDCHAR +STARTCHAR uniFEA0 +ENCODING 65184 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 4 0 1 +BITMAP +70 +08 +38 +C4 +ENDCHAR +STARTCHAR uniFEA1 +ENCODING 65185 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 -2 +BITMAP +F8 +20 +40 +80 +80 +80 +00 +40 +38 +ENDCHAR +STARTCHAR uniFEA2 +ENCODING 65186 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +F8 +30 +50 +88 +84 +80 +00 +40 +38 +ENDCHAR +STARTCHAR uniFEA3 +ENCODING 65187 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 4 0 1 +BITMAP +70 +08 +30 +C0 +ENDCHAR +STARTCHAR uniFEA4 +ENCODING 65188 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 4 0 1 +BITMAP +70 +08 +38 +C4 +ENDCHAR +STARTCHAR uniFEA5 +ENCODING 65189 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 0 -2 +BITMAP +20 +00 +F8 +20 +40 +80 +80 +80 +80 +40 +38 +ENDCHAR +STARTCHAR uniFEA6 +ENCODING 65190 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 0 -2 +BITMAP +20 +00 +F8 +30 +50 +88 +80 +80 +80 +40 +38 +ENDCHAR +STARTCHAR uniFEA7 +ENCODING 65191 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 6 0 1 +BITMAP +20 +00 +70 +08 +30 +C0 +ENDCHAR +STARTCHAR uniFEA8 +ENCODING 65192 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +20 +00 +70 +08 +38 +C4 +ENDCHAR +STARTCHAR uniFEA9 +ENCODING 65193 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 5 1 1 +BITMAP +20 +10 +10 +10 +E0 +ENDCHAR +STARTCHAR uniFEAA +ENCODING 65194 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 1 1 +BITMAP +20 +10 +10 +10 +E8 +ENDCHAR +STARTCHAR uniFEAB +ENCODING 65195 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 8 1 0 +BITMAP +40 +00 +20 +10 +10 +10 +00 +E0 +ENDCHAR +STARTCHAR uniFEAC +ENCODING 65196 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 8 1 0 +BITMAP +40 +00 +20 +10 +10 +10 +00 +E0 +ENDCHAR +STARTCHAR uniFEAD +ENCODING 65197 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 0 +BITMAP +08 +08 +08 +10 +E0 +ENDCHAR +STARTCHAR uniFEAE +ENCODING 65198 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 0 +BITMAP +08 +08 +08 +14 +E0 +ENDCHAR +STARTCHAR uniFEAF +ENCODING 65199 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 0 -1 +BITMAP +08 +00 +08 +08 +08 +00 +00 +E0 +ENDCHAR +STARTCHAR uniFEB0 +ENCODING 65200 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 8 0 -1 +BITMAP +08 +00 +08 +08 +08 +04 +00 +E0 +ENDCHAR +STARTCHAR uniFEB1 +ENCODING 65201 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 8 0 -2 +BITMAP +04 +54 +54 +54 +28 +A0 +00 +40 +ENDCHAR +STARTCHAR uniFEB2 +ENCODING 65202 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 8 0 -2 +BITMAP +04 +54 +54 +54 +28 +A0 +00 +40 +ENDCHAR +STARTCHAR uniFEB3 +ENCODING 65203 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 1 +BITMAP +04 +54 +54 +54 +A8 +ENDCHAR +STARTCHAR uniFEB4 +ENCODING 65204 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 1 +BITMAP +04 +54 +54 +54 +A8 +ENDCHAR +STARTCHAR uniFEB5 +ENCODING 65205 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +20 +00 +50 +00 +54 +54 +54 +54 +20 +A0 +40 +ENDCHAR +STARTCHAR uniFEB6 +ENCODING 65206 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +20 +00 +50 +00 +54 +54 +54 +54 +20 +A0 +40 +ENDCHAR +STARTCHAR uniFEB7 +ENCODING 65207 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +20 +00 +50 +00 +54 +54 +54 +54 +A0 +ENDCHAR +STARTCHAR uniFEB8 +ENCODING 65208 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +20 +00 +50 +00 +54 +54 +54 +54 +A0 +ENDCHAR +STARTCHAR uniFEB9 +ENCODING 65209 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 -1 +BITMAP +28 +34 +A4 +B8 +A0 +40 +ENDCHAR +STARTCHAR uniFEBA +ENCODING 65210 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 -1 +BITMAP +28 +34 +A4 +BC +A0 +40 +ENDCHAR +STARTCHAR uniFEBB +ENCODING 65211 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 4 0 1 +BITMAP +48 +54 +64 +B8 +ENDCHAR +STARTCHAR uniFEBC +ENCODING 65212 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 4 0 1 +BITMAP +48 +54 +64 +BC +ENDCHAR +STARTCHAR uniFEBD +ENCODING 65213 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +20 +00 +28 +34 +A4 +B8 +B0 +A0 +40 +ENDCHAR +STARTCHAR uniFEBE +ENCODING 65214 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +20 +00 +28 +34 +A4 +BC +B0 +A0 +40 +ENDCHAR +STARTCHAR uniFEBF +ENCODING 65215 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +20 +00 +48 +54 +64 +B8 +ENDCHAR +STARTCHAR uniFEC0 +ENCODING 65216 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +20 +00 +48 +54 +64 +BC +ENDCHAR +STARTCHAR uniFEC1 +ENCODING 65217 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +40 +40 +40 +40 +50 +68 +68 +68 +F0 +ENDCHAR +STARTCHAR uniFEC2 +ENCODING 65218 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +40 +40 +40 +40 +50 +68 +68 +68 +F0 +ENDCHAR +STARTCHAR uniFEC3 +ENCODING 65219 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +40 +40 +40 +40 +50 +68 +68 +68 +F0 +ENDCHAR +STARTCHAR uniFEC4 +ENCODING 65220 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +40 +40 +40 +40 +50 +68 +68 +68 +F0 +ENDCHAR +STARTCHAR uniFEC5 +ENCODING 65221 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +40 +40 +50 +40 +50 +68 +68 +68 +F0 +ENDCHAR +STARTCHAR uniFEC6 +ENCODING 65222 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +40 +40 +50 +40 +50 +68 +68 +68 +F0 +ENDCHAR +STARTCHAR uniFEC7 +ENCODING 65223 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +40 +40 +50 +40 +50 +68 +68 +68 +F0 +ENDCHAR +STARTCHAR uniFEC8 +ENCODING 65224 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +40 +40 +50 +40 +50 +68 +68 +68 +F0 +ENDCHAR +STARTCHAR uniFEC9 +ENCODING 65225 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 -2 +BITMAP +60 +80 +80 +70 +80 +80 +80 +88 +70 +ENDCHAR +STARTCHAR uniFECA +ENCODING 65226 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 8 0 -2 +BITMAP +60 +90 +60 +90 +8C +80 +00 +70 +ENDCHAR +STARTCHAR uniFECB +ENCODING 65227 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 6 0 1 +BITMAP +30 +40 +40 +38 +20 +C0 +ENDCHAR +STARTCHAR uniFECC +ENCODING 65228 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +20 +50 +50 +20 +50 +8C +ENDCHAR +STARTCHAR uniFECD +ENCODING 65229 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 0 -2 +BITMAP +40 +00 +60 +80 +80 +70 +00 +80 +80 +88 +70 +ENDCHAR +STARTCHAR uniFECE +ENCODING 65230 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 10 0 -2 +BITMAP +20 +00 +60 +90 +60 +90 +80 +84 +80 +70 +ENDCHAR +STARTCHAR uniFECF +ENCODING 65231 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +40 +00 +30 +40 +40 +38 +30 +20 +C0 +ENDCHAR +STARTCHAR uniFED0 +ENCODING 65232 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +20 +00 +20 +50 +50 +20 +00 +40 +84 +ENDCHAR +STARTCHAR uniFED1 +ENCODING 65233 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 0 -1 +BITMAP +10 +00 +10 +28 +98 +88 +00 +70 +ENDCHAR +STARTCHAR uniFED2 +ENCODING 65234 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 8 0 -1 +BITMAP +10 +00 +10 +28 +98 +8C +00 +70 +ENDCHAR +STARTCHAR uniFED3 +ENCODING 65235 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 9 0 -1 +BITMAP +20 +00 +20 +50 +30 +10 +00 +20 +C0 +ENDCHAR +STARTCHAR uniFED4 +ENCODING 65236 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +20 +00 +20 +50 +50 +20 +00 +CC +ENDCHAR +STARTCHAR uniFED5 +ENCODING 65237 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 0 -1 +BITMAP +28 +00 +10 +28 +98 +88 +00 +70 +ENDCHAR +STARTCHAR uniFED6 +ENCODING 65238 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 8 0 -1 +BITMAP +28 +00 +10 +28 +98 +8C +00 +70 +ENDCHAR +STARTCHAR uniFED7 +ENCODING 65239 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 9 0 -1 +BITMAP +50 +00 +20 +50 +30 +10 +00 +20 +C0 +ENDCHAR +STARTCHAR uniFED8 +ENCODING 65240 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 8 0 0 +BITMAP +50 +00 +20 +50 +50 +20 +00 +CC +ENDCHAR +STARTCHAR uniFED9 +ENCODING 65241 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +28 +48 +28 +C8 +08 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uniFEDA +ENCODING 65242 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +28 +48 +28 +C8 +08 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uniFEDB +ENCODING 65243 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 0 0 +BITMAP +08 +30 +40 +40 +20 +10 +00 +08 +08 +F0 +ENDCHAR +STARTCHAR uniFEDC +ENCODING 65244 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 10 0 0 +BITMAP +08 +30 +40 +40 +20 +10 +00 +08 +08 +F0 +ENDCHAR +STARTCHAR uniFEDD +ENCODING 65245 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +08 +48 +88 +88 +70 +ENDCHAR +STARTCHAR uniFEDE +ENCODING 65246 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 11 0 -2 +BITMAP +08 +08 +08 +08 +08 +08 +08 +4C +8C +88 +70 +ENDCHAR +STARTCHAR uniFEDF +ENCODING 65247 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 9 0 0 +BITMAP +10 +10 +10 +10 +10 +10 +10 +10 +E0 +ENDCHAR +STARTCHAR uniFEE0 +ENCODING 65248 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 0 +BITMAP +10 +10 +10 +10 +10 +10 +10 +10 +E4 +ENDCHAR +STARTCHAR uniFEE1 +ENCODING 65249 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 6 0 -1 +BITMAP +30 +48 +48 +B0 +80 +80 +ENDCHAR +STARTCHAR uniFEE2 +ENCODING 65250 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 -1 +BITMAP +30 +48 +48 +B4 +80 +80 +ENDCHAR +STARTCHAR uniFEE3 +ENCODING 65251 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 4 0 1 +BITMAP +30 +48 +48 +B0 +ENDCHAR +STARTCHAR uniFEE4 +ENCODING 65252 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 4 0 1 +BITMAP +30 +48 +48 +B4 +ENDCHAR +STARTCHAR uniFEE5 +ENCODING 65253 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 0 -1 +BITMAP +20 +00 +10 +88 +88 +88 +00 +70 +ENDCHAR +STARTCHAR uniFEE6 +ENCODING 65254 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 8 0 -1 +BITMAP +20 +00 +10 +88 +88 +8C +00 +70 +ENDCHAR +STARTCHAR uniFEE7 +ENCODING 65255 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 6 0 1 +BITMAP +20 +00 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uniFEE8 +ENCODING 65256 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 1 +BITMAP +20 +00 +20 +20 +20 +DC +ENDCHAR +STARTCHAR uniFEE9 +ENCODING 65257 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 5 0 1 +BITMAP +60 +90 +88 +88 +70 +ENDCHAR +STARTCHAR uniFEEA +ENCODING 65258 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 1 +BITMAP +30 +48 +88 +88 +74 +ENDCHAR +STARTCHAR uniFEEB +ENCODING 65259 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 8 0 0 +BITMAP +E0 +10 +48 +A8 +A8 +48 +00 +90 +ENDCHAR +STARTCHAR uniFEEC +ENCODING 65260 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 -1 +BITMAP +10 +28 +48 +FC +4C +30 +ENDCHAR +STARTCHAR uniFEED +ENCODING 65261 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 6 0 -1 +BITMAP +30 +48 +48 +38 +08 +F0 +ENDCHAR +STARTCHAR uniFEEE +ENCODING 65262 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 -1 +BITMAP +30 +48 +48 +3C +0C +F0 +ENDCHAR +STARTCHAR uniFEEF +ENCODING 65263 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 0 +BITMAP +08 +14 +90 +88 +70 +ENDCHAR +STARTCHAR uniFEF0 +ENCODING 65264 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 5 0 0 +BITMAP +08 +14 +94 +94 +60 +ENDCHAR +STARTCHAR uniFEF1 +ENCODING 65265 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 9 0 -2 +BITMAP +08 +14 +50 +88 +88 +70 +00 +00 +50 +ENDCHAR +STARTCHAR uniFEF2 +ENCODING 65266 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 -1 +BITMAP +48 +94 +94 +60 +00 +40 +ENDCHAR +STARTCHAR uniFEF3 +ENCODING 65267 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 3 6 0 -1 +BITMAP +20 +20 +20 +C0 +00 +40 +ENDCHAR +STARTCHAR uniFEF4 +ENCODING 65268 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 6 6 0 -1 +BITMAP +20 +20 +20 +DC +00 +40 +ENDCHAR +STARTCHAR uniFEF5 +ENCODING 65269 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 0 0 +BITMAP +50 +A0 +08 +48 +48 +28 +28 +08 +18 +18 +70 +ENDCHAR +STARTCHAR uniFEF6 +ENCODING 65270 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 0 0 +BITMAP +50 +A0 +08 +48 +48 +28 +28 +08 +18 +18 +70 +ENDCHAR +STARTCHAR uniFEF7 +ENCODING 65271 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 0 0 +BITMAP +60 +80 +E8 +08 +48 +28 +28 +08 +18 +18 +70 +ENDCHAR +STARTCHAR uniFEF8 +ENCODING 65272 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 0 0 +BITMAP +60 +80 +E8 +08 +48 +28 +28 +08 +18 +18 +70 +ENDCHAR +STARTCHAR uniFEF9 +ENCODING 65273 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 0 -2 +BITMAP +08 +48 +48 +28 +28 +18 +18 +98 +70 +80 +E0 +ENDCHAR +STARTCHAR uniFEFA +ENCODING 65274 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 11 0 -2 +BITMAP +08 +48 +48 +28 +28 +18 +18 +98 +70 +80 +E0 +ENDCHAR +STARTCHAR uniFEFB +ENCODING 65275 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 9 1 0 +BITMAP +10 +90 +90 +50 +50 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR uniFEFC +ENCODING 65276 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 4 9 1 0 +BITMAP +10 +90 +90 +50 +50 +30 +30 +30 +E0 +ENDCHAR +STARTCHAR uniFFFD +ENCODING 65533 +SWIDTH 500 0 +DWIDTH 7 0 +BBX 5 9 0 0 +BITMAP +F8 +88 +88 +88 +88 +88 +88 +88 +F8 +ENDCHAR +ENDFONT diff --git a/app/src/gambas3/font/GambasMedium-16.bdf b/app/src/gambas3/font/GambasMedium-16.bdf new file mode 100644 index 00000000..5c44743b --- /dev/null +++ b/app/src/gambas3/font/GambasMedium-16.bdf @@ -0,0 +1,48934 @@ +STARTFONT 2.1 +FONT -xos4-Gambas-Medium-R-Normal--16-150-75-75-P-89-ISO10646-1 +SIZE 15 75 75 +FONTBOUNDINGBOX 9 18 0 -3 +COMMENT "Generated by fontforge, http://fontforge.sourceforge.net" +COMMENT "Copyright (C) 2012 Benoit Minisini" +STARTPROPERTIES 34 +FOUNDRY "xos4" +FAMILY_NAME "Gambas" +WEIGHT_NAME "Medium" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 16 +POINT_SIZE 150 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "P" +AVERAGE_WIDTH 89 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +FONTNAME_REGISTRY "" +CHARSET_COLLECTIONS "ASCII ISOLatin1Encoding ISO8859-2 ISO8859-5 ISO8859-7 ISO8859-9 ISO8859-6 ISO8859-4 ISO10646-1" +FONT_NAME "GambasMedium" +FACE_NAME "Gambas Medium" +COPYRIGHT "Copyright (C) 2012 Benoit Minisini" +FONT_VERSION "001.000" +FONT_ASCENT 13 +FONT_DESCENT 3 +UNDERLINE_POSITION -2 +UNDERLINE_THICKNESS 1 +X_HEIGHT 7 +CAP_HEIGHT 10 +RAW_ASCENT 846 +RAW_DESCENT 154 +NORM_SPACE 9 +RELATIVE_WEIGHT 50 +RELATIVE_SETWIDTH 50 +FIGURE_WIDTH 9 +AVG_LOWERCASE_WIDTH 89 +AVG_UPPERCASE_WIDTH 90 +ENDPROPERTIES +CHARS 2834 +STARTCHAR uni0000 +ENCODING 0 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +AA +00 +82 +00 +82 +00 +82 +00 +82 +00 +AA +ENDCHAR +STARTCHAR space +ENCODING 32 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 8 -2 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 11 3 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +00 +80 +80 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 3 3 9 +BITMAP +A0 +A0 +A0 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +48 +48 +48 +FC +48 +48 +48 +FC +48 +48 +48 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 13 2 -1 +BITMAP +20 +20 +78 +80 +80 +80 +70 +08 +08 +08 +F0 +20 +20 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +44 +A4 +A8 +48 +10 +10 +20 +20 +48 +54 +94 +88 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +30 +48 +48 +50 +20 +20 +50 +94 +88 +88 +74 +ENDCHAR +STARTCHAR quotesingle +ENCODING 39 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 3 3 9 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 13 2 -1 +BITMAP +20 +40 +40 +80 +80 +80 +80 +80 +80 +80 +40 +40 +20 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 13 3 -1 +BITMAP +80 +40 +40 +20 +20 +20 +20 +20 +20 +20 +40 +40 +80 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 7 1 2 +BITMAP +20 +A8 +70 +20 +70 +A8 +20 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 2 +BITMAP +10 +10 +10 +FE +10 +10 +10 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 4 3 -2 +BITMAP +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR hyphen +ENCODING 45 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 1 0 5 +BITMAP +FE +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 2 3 0 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +04 +04 +08 +08 +10 +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +78 +84 +84 +8C +94 +A4 +C4 +84 +84 +84 +78 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 1 0 +BITMAP +20 +60 +A0 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +F8 +04 +04 +04 +04 +08 +10 +20 +40 +80 +FC +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +F8 +04 +04 +04 +04 +38 +04 +04 +04 +04 +F8 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +18 +18 +28 +28 +48 +48 +88 +88 +FC +08 +08 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +FC +80 +80 +80 +F0 +08 +04 +04 +04 +08 +F0 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +38 +40 +80 +80 +F8 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +FC +04 +04 +08 +08 +10 +10 +20 +20 +40 +40 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +78 +84 +84 +84 +84 +78 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +78 +84 +84 +84 +84 +84 +7C +04 +04 +08 +70 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 7 3 0 +BITMAP +C0 +C0 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 9 3 -2 +BITMAP +C0 +C0 +00 +00 +00 +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 9 1 1 +BITMAP +08 +10 +20 +40 +80 +40 +20 +10 +08 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 4 1 3 +BITMAP +F8 +00 +00 +F8 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 9 2 1 +BITMAP +80 +40 +20 +10 +08 +10 +20 +40 +80 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +78 +84 +04 +04 +08 +10 +20 +20 +00 +20 +20 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +38 +44 +84 +9C +A4 +A4 +A4 +9C +80 +40 +3C +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +78 +84 +84 +84 +84 +FC +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +F8 +84 +84 +84 +84 +F8 +84 +84 +84 +84 +F8 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +7C +80 +80 +80 +80 +80 +80 +80 +80 +80 +7C +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +F0 +88 +84 +84 +84 +84 +84 +84 +84 +88 +F0 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +FC +80 +80 +80 +80 +F8 +80 +80 +80 +80 +FC +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +FC +80 +80 +80 +80 +F8 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +7C +80 +80 +80 +80 +9C +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +84 +84 +84 +84 +84 +FC +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 1 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 2 0 +BITMAP +38 +10 +10 +10 +10 +10 +10 +10 +10 +10 +E0 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +84 +88 +90 +A0 +C0 +80 +C0 +A0 +90 +88 +84 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +FC +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +82 +82 +C6 +C6 +AA +AA +92 +92 +82 +82 +82 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +84 +C4 +C4 +A4 +A4 +94 +94 +8C +8C +84 +84 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +78 +84 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +F8 +84 +84 +84 +84 +84 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +78 +84 +84 +84 +84 +84 +84 +84 +94 +88 +74 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +F8 +84 +84 +84 +84 +F8 +C0 +A0 +90 +88 +84 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +7C +80 +80 +80 +80 +78 +04 +04 +04 +04 +F8 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +FE +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +84 +84 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +82 +82 +82 +44 +44 +44 +28 +28 +28 +10 +10 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +82 +82 +82 +92 +92 +AA +AA +C6 +C6 +82 +82 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +82 +44 +44 +28 +28 +10 +28 +28 +44 +44 +82 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +82 +82 +44 +44 +28 +28 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +FC +04 +08 +08 +10 +10 +20 +20 +40 +40 +FC +ENDCHAR +STARTCHAR bracketleft +ENCODING 91 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 13 2 -1 +BITMAP +F0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +F0 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +80 +80 +40 +40 +20 +20 +10 +10 +08 +08 +04 +04 +ENDCHAR +STARTCHAR bracketright +ENCODING 93 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 13 2 -1 +BITMAP +F0 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +F0 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 6 2 6 +BITMAP +20 +20 +50 +50 +88 +88 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 1 0 0 +BITMAP +FF +ENDCHAR +STARTCHAR grave +ENCODING 96 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 2 3 10 +BITMAP +80 +40 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +78 +04 +04 +7C +84 +84 +84 +7C +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +80 +80 +80 +F8 +84 +84 +84 +84 +84 +84 +F8 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +7C +80 +80 +80 +80 +80 +80 +7C +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +04 +04 +04 +7C +84 +84 +84 +84 +84 +84 +7C +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +78 +84 +84 +84 +FC +80 +80 +7C +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +3C +40 +40 +F8 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +7C +84 +84 +84 +84 +84 +84 +7C +04 +04 +F8 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +80 +80 +80 +F8 +84 +84 +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 2 0 +BITMAP +20 +00 +00 +E0 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 14 2 -3 +BITMAP +20 +00 +00 +E0 +20 +20 +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +80 +80 +80 +84 +88 +90 +A0 +E0 +90 +88 +84 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 11 2 0 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +FC +92 +92 +92 +92 +92 +92 +92 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +F8 +84 +84 +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +78 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +F8 +84 +84 +84 +84 +84 +84 +F8 +80 +80 +80 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +7C +84 +84 +84 +84 +84 +84 +7C +04 +04 +04 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +BC +C0 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +7C +80 +80 +60 +18 +04 +04 +F8 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +40 +40 +40 +F8 +40 +40 +40 +40 +40 +40 +3C +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +82 +82 +44 +44 +28 +28 +10 +10 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +82 +82 +92 +92 +AA +AA +44 +44 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +84 +84 +48 +30 +30 +48 +84 +84 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +84 +84 +84 +84 +84 +84 +84 +7C +04 +04 +F8 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +FC +04 +08 +10 +20 +40 +80 +FC +ENDCHAR +STARTCHAR braceleft +ENCODING 123 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 13 2 -1 +BITMAP +18 +20 +20 +20 +20 +20 +C0 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 14 3 -3 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR braceright +ENCODING 125 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 13 2 -1 +BITMAP +C0 +20 +20 +20 +20 +20 +18 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 3 1 9 +BITMAP +62 +92 +8C +ENDCHAR +STARTCHAR uni00A0 +ENCODING 160 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 8 -2 +BITMAP +00 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 11 3 0 +BITMAP +80 +80 +00 +00 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR cent +ENCODING 162 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 -2 +BITMAP +10 +10 +7C +80 +80 +80 +80 +80 +80 +7C +10 +10 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +1C +20 +40 +40 +40 +F0 +40 +40 +40 +40 +FC +ENDCHAR +STARTCHAR currency +ENCODING 164 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 1 +BITMAP +BA +44 +82 +82 +82 +44 +BA +ENDCHAR +STARTCHAR yen +ENCODING 165 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +82 +82 +44 +44 +28 +28 +7C +10 +7C +10 +10 +ENDCHAR +STARTCHAR brokenbar +ENCODING 166 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 13 3 0 +BITMAP +80 +80 +80 +80 +80 +80 +00 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR section +ENCODING 167 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +7C +80 +80 +80 +70 +88 +84 +84 +44 +38 +04 +04 +04 +F8 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 1 2 11 +BITMAP +90 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 10 0 1 +BITMAP +3C +42 +9D +A1 +A1 +A1 +A1 +9D +42 +3C +ENDCHAR +STARTCHAR ordfeminine +ENCODING 170 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 6 1 5 +BITMAP +70 +08 +78 +88 +88 +78 +ENDCHAR +STARTCHAR guillemotleft +ENCODING 171 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 1 2 +BITMAP +12 +24 +48 +90 +48 +24 +12 +ENDCHAR +STARTCHAR logicalnot +ENCODING 172 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 5 1 3 +BITMAP +FC +04 +04 +04 +04 +ENDCHAR +STARTCHAR uni00AD +ENCODING 173 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 1 2 5 +BITMAP +F8 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 10 0 1 +BITMAP +3C +42 +B9 +A5 +A5 +B9 +A9 +A5 +42 +3C +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 1 2 12 +BITMAP +F0 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 4 1 7 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR plusminus +ENCODING 177 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 9 0 1 +BITMAP +10 +10 +10 +FE +10 +10 +10 +00 +FE +ENDCHAR +STARTCHAR uni00B2 +ENCODING 178 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 6 2 6 +BITMAP +E0 +10 +10 +20 +40 +F0 +ENDCHAR +STARTCHAR uni00B3 +ENCODING 179 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 6 2 6 +BITMAP +E0 +10 +60 +10 +10 +E0 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 2 2 10 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni00B5 +ENCODING 181 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +84 +84 +84 +84 +84 +84 +CC +B2 +80 +80 +80 +ENDCHAR +STARTCHAR paragraph +ENCODING 182 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +7C +F4 +F4 +F4 +F4 +F4 +74 +14 +14 +14 +14 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 2 3 4 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 3 2 -3 +BITMAP +40 +20 +C0 +ENDCHAR +STARTCHAR uni00B9 +ENCODING 185 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 6 2 6 +BITMAP +20 +60 +A0 +20 +20 +20 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 5 1 6 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR guillemotright +ENCODING 187 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 1 2 +BITMAP +90 +48 +24 +12 +24 +48 +90 +ENDCHAR +STARTCHAR onequarter +ENCODING 188 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +20 +60 +A0 +20 +21 +22 +04 +08 +10 +20 +46 +86 +0A +0A +0F +02 +ENDCHAR +STARTCHAR onehalf +ENCODING 189 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +20 +60 +A0 +20 +21 +22 +04 +08 +10 +20 +4E +81 +01 +02 +04 +0F +ENDCHAR +STARTCHAR threequarters +ENCODING 190 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +E0 +10 +60 +10 +11 +E2 +04 +08 +10 +20 +46 +86 +0A +0A +0F +02 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +20 +20 +00 +20 +20 +40 +80 +80 +80 +84 +78 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +40 +20 +00 +78 +84 +84 +84 +FC +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +08 +10 +00 +78 +84 +84 +84 +FC +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +20 +50 +00 +78 +84 +84 +84 +84 +FC +84 +84 +84 +84 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +64 +98 +00 +78 +84 +84 +84 +FC +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +48 +00 +78 +84 +84 +84 +84 +FC +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +30 +48 +30 +00 +78 +84 +84 +84 +FC +84 +84 +84 +84 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7E +90 +90 +90 +90 +FE +90 +90 +90 +90 +9E +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +78 +84 +80 +80 +80 +80 +80 +80 +80 +84 +78 +10 +08 +30 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +40 +20 +00 +FC +80 +80 +80 +F8 +80 +80 +80 +80 +FC +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +08 +10 +00 +FC +80 +80 +80 +F8 +80 +80 +80 +80 +FC +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +20 +50 +00 +FC +80 +80 +80 +F8 +80 +80 +80 +80 +FC +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +48 +00 +FC +80 +80 +80 +80 +F8 +80 +80 +80 +80 +FC +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 13 1 0 +BITMAP +40 +20 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 13 1 0 +BITMAP +10 +20 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 13 1 0 +BITMAP +20 +50 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 13 1 0 +BITMAP +50 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +78 +44 +42 +42 +42 +F2 +42 +42 +42 +44 +78 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +64 +98 +00 +84 +C4 +C4 +A4 +A4 +94 +94 +8C +8C +84 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +40 +20 +00 +78 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +08 +10 +00 +78 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +20 +50 +00 +78 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +64 +98 +00 +78 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +48 +00 +78 +84 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 1 2 +BITMAP +82 +44 +28 +10 +28 +44 +82 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +3D +42 +42 +46 +4A +4A +52 +62 +62 +42 +BC +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +20 +10 +00 +84 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +10 +20 +00 +84 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +20 +50 +00 +84 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +48 +00 +84 +84 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +08 +10 +00 +82 +82 +44 +44 +28 +28 +10 +10 +10 +10 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +80 +80 +F0 +88 +84 +84 +84 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +70 +88 +88 +88 +90 +90 +90 +88 +84 +84 +B8 +80 +80 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +40 +20 +00 +00 +78 +04 +04 +7C +84 +84 +84 +7C +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +08 +10 +00 +00 +78 +04 +04 +7C +84 +84 +84 +7C +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +10 +28 +00 +00 +78 +04 +04 +7C +84 +84 +84 +7C +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +64 +98 +00 +78 +04 +04 +7C +84 +84 +84 +7C +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +48 +00 +00 +78 +04 +04 +7C +84 +84 +84 +7C +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +30 +48 +30 +00 +78 +04 +04 +7C +84 +84 +84 +7C +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +7C +12 +12 +7C +90 +90 +90 +7E +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +7C +80 +80 +80 +80 +80 +80 +7C +10 +08 +30 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +40 +20 +00 +00 +78 +84 +84 +84 +FC +80 +80 +7C +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +08 +10 +00 +00 +78 +84 +84 +84 +FC +80 +80 +7C +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +20 +50 +00 +00 +78 +84 +84 +84 +FC +80 +80 +7C +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +48 +00 +00 +78 +84 +84 +84 +FC +80 +80 +7C +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 12 2 0 +BITMAP +80 +40 +00 +00 +E0 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 12 2 0 +BITMAP +10 +20 +00 +00 +E0 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 12 2 0 +BITMAP +20 +50 +00 +00 +E0 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 2 0 +BITMAP +90 +00 +00 +E0 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +74 +08 +14 +04 +04 +7C +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +64 +98 +00 +F8 +84 +84 +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +40 +20 +00 +00 +78 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +08 +10 +00 +00 +78 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +20 +50 +00 +00 +78 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +64 +98 +00 +78 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +48 +00 +00 +78 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 1 1 +BITMAP +30 +30 +00 +00 +FC +00 +00 +30 +30 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +3D +42 +46 +4A +52 +62 +42 +BC +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +40 +20 +00 +00 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +08 +10 +00 +00 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +20 +50 +00 +00 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +48 +00 +00 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 15 1 -3 +BITMAP +08 +10 +00 +00 +84 +84 +84 +84 +84 +84 +84 +7C +04 +04 +F8 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -3 +BITMAP +80 +80 +80 +F0 +88 +84 +84 +84 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +48 +00 +00 +84 +84 +84 +84 +84 +84 +84 +7C +04 +04 +F8 +ENDCHAR +STARTCHAR Amacron +ENCODING 256 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +78 +00 +78 +84 +84 +84 +84 +FC +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR amacron +ENCODING 257 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 0 +BITMAP +78 +00 +78 +04 +04 +7C +84 +84 +84 +7C +ENDCHAR +STARTCHAR Abreve +ENCODING 258 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +48 +30 +00 +78 +84 +84 +84 +FC +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR abreve +ENCODING 259 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +48 +30 +00 +78 +04 +04 +7C +84 +84 +84 +7C +ENDCHAR +STARTCHAR Aogonek +ENCODING 260 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +78 +84 +84 +84 +84 +FC +84 +84 +84 +84 +84 +04 +08 +06 +ENDCHAR +STARTCHAR aogonek +ENCODING 261 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +78 +04 +04 +7C +84 +84 +84 +7C +08 +10 +0C +ENDCHAR +STARTCHAR Cacute +ENCODING 262 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +08 +10 +00 +7C +80 +80 +80 +80 +80 +80 +80 +80 +7C +ENDCHAR +STARTCHAR cacute +ENCODING 263 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +08 +10 +00 +00 +7C +80 +80 +80 +80 +80 +80 +7C +ENDCHAR +STARTCHAR Ccircumflex +ENCODING 264 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +10 +28 +00 +7C +80 +80 +80 +80 +80 +80 +80 +80 +7C +ENDCHAR +STARTCHAR ccircumflex +ENCODING 265 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +10 +28 +00 +00 +7C +80 +80 +80 +80 +80 +80 +7C +ENDCHAR +STARTCHAR Cdotaccent +ENCODING 266 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +20 +00 +7C +80 +80 +80 +80 +80 +80 +80 +80 +80 +7C +ENDCHAR +STARTCHAR cdotaccent +ENCODING 267 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 0 +BITMAP +20 +00 +7C +80 +80 +80 +80 +80 +80 +7C +ENDCHAR +STARTCHAR Ccaron +ENCODING 268 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +28 +10 +00 +7C +80 +80 +80 +80 +80 +80 +80 +80 +7C +ENDCHAR +STARTCHAR ccaron +ENCODING 269 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +28 +10 +00 +00 +7C +80 +80 +80 +80 +80 +80 +7C +ENDCHAR +STARTCHAR Dcaron +ENCODING 270 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +50 +20 +00 +F0 +88 +84 +84 +84 +84 +84 +84 +88 +F0 +ENDCHAR +STARTCHAR dcaron +ENCODING 271 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +05 +05 +05 +7C +84 +84 +84 +84 +84 +84 +7C +ENDCHAR +STARTCHAR Dcroat +ENCODING 272 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +78 +44 +42 +42 +42 +F2 +42 +42 +42 +44 +78 +ENDCHAR +STARTCHAR dcroat +ENCODING 273 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +04 +1E +04 +7C +84 +84 +84 +84 +84 +84 +7C +ENDCHAR +STARTCHAR Emacron +ENCODING 274 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +78 +00 +FC +80 +80 +80 +80 +F8 +80 +80 +80 +80 +FC +ENDCHAR +STARTCHAR emacron +ENCODING 275 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 0 +BITMAP +78 +00 +78 +84 +84 +84 +FC +80 +80 +7C +ENDCHAR +STARTCHAR Ebreve +ENCODING 276 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +48 +30 +00 +FC +80 +80 +80 +F8 +80 +80 +80 +80 +FC +ENDCHAR +STARTCHAR ebreve +ENCODING 277 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +48 +30 +00 +78 +84 +84 +84 +FC +80 +80 +7C +ENDCHAR +STARTCHAR Edotaccent +ENCODING 278 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +20 +00 +FC +80 +80 +80 +80 +F8 +80 +80 +80 +80 +FC +ENDCHAR +STARTCHAR edotaccent +ENCODING 279 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 0 +BITMAP +20 +00 +78 +84 +84 +84 +FC +80 +80 +7C +ENDCHAR +STARTCHAR Eogonek +ENCODING 280 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +FC +80 +80 +80 +80 +F8 +80 +80 +80 +80 +FC +08 +10 +0C +ENDCHAR +STARTCHAR eogonek +ENCODING 281 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +78 +84 +84 +84 +FC +80 +80 +7C +08 +10 +0C +ENDCHAR +STARTCHAR Ecaron +ENCODING 282 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +50 +20 +00 +FC +80 +80 +80 +F8 +80 +80 +80 +80 +FC +ENDCHAR +STARTCHAR ecaron +ENCODING 283 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +50 +20 +00 +00 +78 +84 +84 +84 +FC +80 +80 +7C +ENDCHAR +STARTCHAR Gcircumflex +ENCODING 284 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +10 +28 +00 +7C +80 +80 +80 +9C +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR gcircumflex +ENCODING 285 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 15 1 -3 +BITMAP +20 +50 +00 +00 +7C +84 +84 +84 +84 +84 +84 +7C +04 +04 +F8 +ENDCHAR +STARTCHAR Gbreve +ENCODING 286 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +48 +30 +00 +7C +80 +80 +80 +80 +9C +84 +84 +84 +78 +ENDCHAR +STARTCHAR gbreve +ENCODING 287 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +48 +30 +00 +7C +84 +84 +84 +84 +84 +84 +7C +04 +04 +F8 +ENDCHAR +STARTCHAR Gdotaccent +ENCODING 288 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +20 +00 +7C +80 +80 +80 +80 +9C +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR gdotaccent +ENCODING 289 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -3 +BITMAP +20 +00 +7C +84 +84 +84 +84 +84 +84 +7C +04 +04 +F8 +ENDCHAR +STARTCHAR Gcommaaccent +ENCODING 290 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +7C +80 +80 +80 +80 +9C +84 +84 +84 +84 +78 +10 +08 +30 +ENDCHAR +STARTCHAR gcommaaccent +ENCODING 291 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 15 1 -3 +BITMAP +08 +10 +10 +00 +7C +84 +84 +84 +84 +84 +84 +7C +04 +04 +F8 +ENDCHAR +STARTCHAR Hcircumflex +ENCODING 292 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +20 +50 +00 +84 +84 +84 +84 +FC +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR hcircumflex +ENCODING 293 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +20 +50 +00 +80 +80 +F8 +84 +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR Hbar +ENCODING 294 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +42 +42 +42 +FF +42 +7E +42 +42 +42 +42 +42 +ENDCHAR +STARTCHAR hbar +ENCODING 295 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +40 +F0 +40 +7C +42 +42 +42 +42 +42 +42 +42 +ENDCHAR +STARTCHAR Itilde +ENCODING 296 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +64 +98 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR itilde +ENCODING 297 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +64 +98 +00 +70 +10 +10 +10 +10 +10 +10 +7C +ENDCHAR +STARTCHAR Imacron +ENCODING 298 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 13 1 0 +BITMAP +78 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR imacron +ENCODING 299 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 10 2 0 +BITMAP +F0 +00 +E0 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR Ibreve +ENCODING 300 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 13 1 0 +BITMAP +48 +30 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR ibreve +ENCODING 301 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 2 0 +BITMAP +90 +60 +00 +E0 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR Iogonek +ENCODING 302 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 14 1 -3 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +20 +20 +F8 +20 +40 +30 +ENDCHAR +STARTCHAR iogonek +ENCODING 303 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 13 2 -3 +BITMAP +20 +00 +E0 +20 +20 +20 +20 +20 +20 +F8 +20 +40 +30 +ENDCHAR +STARTCHAR Idotaccent +ENCODING 304 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 13 1 0 +BITMAP +20 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR dotlessi +ENCODING 305 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 8 2 0 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR IJ +ENCODING 306 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +EE +44 +44 +44 +44 +44 +44 +44 +44 +44 +F8 +ENDCHAR +STARTCHAR ij +ENCODING 307 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -3 +BITMAP +44 +00 +CC +44 +44 +44 +44 +44 +44 +E4 +04 +24 +18 +ENDCHAR +STARTCHAR Jcircumflex +ENCODING 308 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 13 2 0 +BITMAP +10 +28 +00 +38 +10 +10 +10 +10 +10 +10 +10 +10 +E0 +ENDCHAR +STARTCHAR jcircumflex +ENCODING 309 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 15 2 -3 +BITMAP +40 +A0 +00 +00 +E0 +20 +20 +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR Kcommaaccent +ENCODING 310 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +84 +88 +90 +A0 +C0 +80 +C0 +A0 +90 +88 +84 +10 +10 +20 +ENDCHAR +STARTCHAR kcommaaccent +ENCODING 311 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +80 +80 +84 +88 +90 +A0 +C0 +A0 +90 +88 +84 +10 +10 +20 +ENDCHAR +STARTCHAR kgreenlandic +ENCODING 312 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +84 +88 +90 +A0 +E0 +90 +88 +84 +ENDCHAR +STARTCHAR Lacute +ENCODING 313 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +40 +80 +00 +80 +80 +80 +80 +80 +80 +80 +80 +80 +FC +ENDCHAR +STARTCHAR lacute +ENCODING 314 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 13 2 0 +BITMAP +20 +40 +00 +C0 +40 +40 +40 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR Lcommaaccent +ENCODING 315 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +FC +10 +10 +20 +ENDCHAR +STARTCHAR lcommaaccent +ENCODING 316 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 14 2 -3 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +30 +20 +20 +40 +ENDCHAR +STARTCHAR Lcaron +ENCODING 317 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +88 +88 +90 +80 +80 +80 +80 +80 +80 +80 +FC +ENDCHAR +STARTCHAR lcaron +ENCODING 318 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 2 0 +BITMAP +C8 +48 +50 +40 +40 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR Ldot +ENCODING 319 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +80 +80 +80 +80 +90 +80 +80 +80 +80 +80 +FC +ENDCHAR +STARTCHAR ldot +ENCODING 320 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 11 2 0 +BITMAP +C0 +40 +40 +40 +40 +50 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR Lslash +ENCODING 321 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +40 +40 +40 +40 +60 +C0 +40 +40 +40 +40 +7E +ENDCHAR +STARTCHAR lslash +ENCODING 322 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 11 2 0 +BITMAP +C0 +40 +40 +40 +60 +C0 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR Nacute +ENCODING 323 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +08 +10 +00 +84 +C4 +C4 +A4 +A4 +94 +94 +8C +8C +84 +ENDCHAR +STARTCHAR nacute +ENCODING 324 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +08 +10 +00 +00 +F8 +84 +84 +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR Ncommaaccent +ENCODING 325 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +84 +C4 +C4 +A4 +A4 +94 +94 +8C +8C +84 +84 +10 +10 +20 +ENDCHAR +STARTCHAR ncommaaccent +ENCODING 326 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +F8 +84 +84 +84 +84 +84 +84 +84 +10 +10 +20 +ENDCHAR +STARTCHAR Ncaron +ENCODING 327 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +50 +20 +00 +84 +C4 +C4 +A4 +A4 +94 +94 +8C +8C +84 +ENDCHAR +STARTCHAR ncaron +ENCODING 328 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +50 +20 +00 +00 +F8 +84 +84 +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR napostrophe +ENCODING 329 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +40 +40 +80 +3E +21 +21 +21 +21 +21 +21 +21 +ENDCHAR +STARTCHAR Eng +ENCODING 330 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +84 +C4 +C4 +A4 +A4 +94 +94 +8C +8C +84 +84 +04 +04 +18 +ENDCHAR +STARTCHAR eng +ENCODING 331 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +F8 +84 +84 +84 +84 +84 +84 +84 +04 +04 +18 +ENDCHAR +STARTCHAR Omacron +ENCODING 332 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +78 +00 +78 +84 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR omacron +ENCODING 333 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 0 +BITMAP +78 +00 +78 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Obreve +ENCODING 334 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +48 +30 +00 +78 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR obreve +ENCODING 335 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +48 +30 +00 +78 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Ohungarumlaut +ENCODING 336 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +24 +48 +00 +78 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR ohungarumlaut +ENCODING 337 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +24 +48 +00 +78 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR OE +ENCODING 338 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7E +90 +90 +90 +90 +9C +90 +90 +90 +90 +7E +ENDCHAR +STARTCHAR oe +ENCODING 339 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +7C +92 +92 +92 +9E +90 +90 +7E +ENDCHAR +STARTCHAR Racute +ENCODING 340 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +08 +10 +00 +F8 +84 +84 +84 +84 +F8 +A0 +90 +88 +84 +ENDCHAR +STARTCHAR racute +ENCODING 341 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +08 +10 +00 +00 +BC +C0 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Rcommaaccent +ENCODING 342 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +F8 +84 +84 +84 +84 +F8 +C0 +A0 +90 +88 +84 +10 +10 +20 +ENDCHAR +STARTCHAR rcommaaccent +ENCODING 343 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +BC +C0 +80 +80 +80 +80 +80 +80 +10 +10 +20 +ENDCHAR +STARTCHAR Rcaron +ENCODING 344 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +50 +20 +00 +F8 +84 +84 +84 +F8 +C0 +A0 +90 +88 +84 +ENDCHAR +STARTCHAR rcaron +ENCODING 345 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +50 +20 +00 +00 +BC +C0 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Sacute +ENCODING 346 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +08 +10 +00 +7C +80 +80 +80 +78 +04 +04 +04 +04 +F8 +ENDCHAR +STARTCHAR sacute +ENCODING 347 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +08 +10 +00 +00 +7C +80 +80 +60 +18 +04 +04 +F8 +ENDCHAR +STARTCHAR Scircumflex +ENCODING 348 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +20 +50 +00 +7C +80 +80 +80 +78 +04 +04 +04 +04 +F8 +ENDCHAR +STARTCHAR scircumflex +ENCODING 349 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +20 +50 +00 +00 +7C +80 +80 +60 +18 +04 +04 +F8 +ENDCHAR +STARTCHAR Scedilla +ENCODING 350 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +7C +80 +80 +80 +80 +78 +04 +04 +04 +04 +F8 +10 +08 +30 +ENDCHAR +STARTCHAR scedilla +ENCODING 351 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +7C +80 +80 +60 +18 +04 +04 +F8 +10 +08 +30 +ENDCHAR +STARTCHAR Scaron +ENCODING 352 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +50 +20 +00 +7C +80 +80 +80 +78 +04 +04 +04 +04 +F8 +ENDCHAR +STARTCHAR scaron +ENCODING 353 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +50 +20 +00 +00 +7C +80 +80 +60 +18 +04 +04 +F8 +ENDCHAR +STARTCHAR Tcommaaccent +ENCODING 354 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 0 -3 +BITMAP +FE +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +08 +30 +ENDCHAR +STARTCHAR tcommaaccent +ENCODING 355 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +40 +40 +40 +F8 +40 +40 +40 +40 +40 +40 +3C +10 +08 +30 +ENDCHAR +STARTCHAR Tcaron +ENCODING 356 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +28 +10 +00 +FE +10 +10 +10 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR tcaron +ENCODING 357 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +08 +08 +50 +40 +40 +F8 +40 +40 +40 +40 +40 +40 +3C +ENDCHAR +STARTCHAR Tbar +ENCODING 358 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +FE +10 +10 +10 +10 +7C +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR tbar +ENCODING 359 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +40 +40 +40 +F8 +40 +40 +F8 +40 +40 +40 +3C +ENDCHAR +STARTCHAR Utilde +ENCODING 360 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +64 +98 +00 +84 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR utilde +ENCODING 361 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +64 +98 +00 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Umacron +ENCODING 362 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +78 +00 +84 +84 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR umacron +ENCODING 363 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 0 +BITMAP +78 +00 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Ubreve +ENCODING 364 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +48 +30 +00 +84 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR ubreve +ENCODING 365 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +48 +30 +00 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Uring +ENCODING 366 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +30 +48 +30 +84 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uring +ENCODING 367 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +30 +48 +30 +00 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Uhungarumlaut +ENCODING 368 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +24 +48 +00 +84 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uhungarumlaut +ENCODING 369 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +24 +48 +00 +00 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Uogonek +ENCODING 370 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +84 +84 +84 +84 +84 +84 +84 +84 +84 +84 +78 +10 +20 +18 +ENDCHAR +STARTCHAR uogonek +ENCODING 371 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +84 +84 +84 +84 +84 +84 +84 +78 +08 +10 +0C +ENDCHAR +STARTCHAR Wcircumflex +ENCODING 372 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +10 +28 +00 +82 +82 +92 +92 +AA +AA +C6 +C6 +82 +82 +ENDCHAR +STARTCHAR wcircumflex +ENCODING 373 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 0 0 +BITMAP +10 +28 +00 +00 +82 +82 +92 +92 +AA +AA +44 +44 +ENDCHAR +STARTCHAR Ycircumflex +ENCODING 374 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +10 +28 +00 +82 +82 +44 +44 +28 +28 +10 +10 +10 +10 +ENDCHAR +STARTCHAR ycircumflex +ENCODING 375 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 15 1 -3 +BITMAP +20 +50 +00 +00 +84 +84 +84 +84 +84 +84 +84 +7C +04 +04 +F8 +ENDCHAR +STARTCHAR Ydieresis +ENCODING 376 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +28 +00 +82 +82 +44 +44 +28 +28 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR Zacute +ENCODING 377 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +10 +20 +00 +FC +08 +08 +10 +10 +20 +20 +40 +40 +FC +ENDCHAR +STARTCHAR zacute +ENCODING 378 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +08 +10 +00 +00 +FC +04 +08 +10 +20 +40 +80 +FC +ENDCHAR +STARTCHAR Zdotaccent +ENCODING 379 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +20 +00 +FC +04 +08 +08 +10 +10 +20 +20 +40 +40 +FC +ENDCHAR +STARTCHAR zdotaccent +ENCODING 380 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 0 +BITMAP +20 +00 +FC +04 +08 +10 +20 +40 +80 +FC +ENDCHAR +STARTCHAR Zcaron +ENCODING 381 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +50 +20 +00 +FC +08 +08 +10 +10 +20 +20 +40 +40 +FC +ENDCHAR +STARTCHAR zcaron +ENCODING 382 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +50 +20 +00 +00 +FC +04 +08 +10 +20 +40 +80 +FC +ENDCHAR +STARTCHAR longs +ENCODING 383 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 11 3 0 +BITMAP +70 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni0180 +ENCODING 384 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +40 +F0 +40 +7C +42 +42 +42 +42 +42 +42 +7C +ENDCHAR +STARTCHAR uni0181 +ENCODING 385 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +7C +A2 +A2 +22 +22 +3C +22 +22 +22 +22 +3C +ENDCHAR +STARTCHAR uni0182 +ENCODING 386 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +F8 +80 +80 +80 +80 +F8 +84 +84 +84 +84 +F8 +ENDCHAR +STARTCHAR uni0183 +ENCODING 387 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +F8 +80 +80 +F8 +84 +84 +84 +84 +84 +84 +F8 +ENDCHAR +STARTCHAR uni0184 +ENCODING 388 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +40 +C0 +C0 +40 +40 +7C +42 +42 +42 +42 +7C +ENDCHAR +STARTCHAR uni0185 +ENCODING 389 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +40 +C0 +C0 +7C +42 +42 +42 +42 +42 +42 +7C +ENDCHAR +STARTCHAR uni0186 +ENCODING 390 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +F8 +04 +04 +04 +04 +04 +04 +04 +04 +04 +F8 +ENDCHAR +STARTCHAR uni0187 +ENCODING 391 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +0C +10 +7C +80 +80 +80 +80 +80 +80 +80 +80 +80 +7C +ENDCHAR +STARTCHAR uni0188 +ENCODING 392 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 0 +BITMAP +0C +10 +7C +80 +80 +80 +80 +80 +80 +7C +ENDCHAR +STARTCHAR uni0189 +ENCODING 393 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +78 +44 +42 +42 +42 +F2 +42 +42 +42 +44 +78 +ENDCHAR +STARTCHAR uni018A +ENCODING 394 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +78 +A4 +A2 +22 +22 +22 +22 +22 +22 +24 +38 +ENDCHAR +STARTCHAR uni018B +ENCODING 395 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +7C +04 +04 +04 +04 +7C +84 +84 +84 +84 +7C +ENDCHAR +STARTCHAR uni018C +ENCODING 396 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +7C +04 +04 +7C +84 +84 +84 +84 +84 +84 +7C +ENDCHAR +STARTCHAR uni018D +ENCODING 397 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +78 +84 +84 +84 +84 +44 +28 +10 +08 +08 +70 +ENDCHAR +STARTCHAR uni018E +ENCODING 398 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +FC +04 +04 +04 +04 +7C +04 +04 +04 +04 +FC +ENDCHAR +STARTCHAR uni018F +ENCODING 399 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +F8 +04 +04 +04 +04 +FC +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni0190 +ENCODING 400 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +7C +80 +80 +80 +80 +78 +80 +80 +80 +80 +7C +ENDCHAR +STARTCHAR uni0191 +ENCODING 401 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 -2 +BITMAP +3F +20 +20 +20 +20 +3E +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR florin +ENCODING 402 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 -2 +BITMAP +1E +20 +20 +7C +20 +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni0193 +ENCODING 403 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +0C +10 +78 +84 +80 +80 +80 +9C +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni0194 +ENCODING 404 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +82 +44 +28 +28 +10 +10 +28 +28 +44 +44 +38 +ENDCHAR +STARTCHAR uni0195 +ENCODING 405 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +80 +80 +80 +E4 +92 +92 +92 +92 +92 +92 +8C +ENDCHAR +STARTCHAR uni0196 +ENCODING 406 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 11 3 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +60 +ENDCHAR +STARTCHAR uni0197 +ENCODING 407 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 1 0 +BITMAP +F8 +20 +20 +20 +20 +F8 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni0198 +ENCODING 408 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +84 +8A +92 +A0 +C0 +80 +C0 +A0 +90 +88 +84 +ENDCHAR +STARTCHAR uni0199 +ENCODING 409 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +60 +80 +80 +80 +84 +88 +90 +A0 +E0 +90 +88 +84 +ENDCHAR +STARTCHAR uni019A +ENCODING 410 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 1 0 +BITMAP +60 +20 +20 +20 +20 +F8 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni019B +ENCODING 411 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +48 +30 +20 +50 +10 +28 +28 +44 +44 +82 +82 +ENDCHAR +STARTCHAR uni019C +ENCODING 412 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +92 +92 +92 +92 +92 +92 +92 +92 +92 +92 +6E +ENDCHAR +STARTCHAR uni019D +ENCODING 413 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 -2 +BITMAP +21 +31 +31 +29 +29 +25 +25 +23 +23 +21 +21 +20 +C0 +ENDCHAR +STARTCHAR uni019E +ENCODING 414 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +F8 +84 +84 +84 +84 +84 +84 +84 +04 +04 +04 +ENDCHAR +STARTCHAR uni019F +ENCODING 415 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +78 +84 +84 +84 +84 +FC +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Ohorn +ENCODING 416 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +79 +85 +86 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR ohorn +ENCODING 417 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 1 0 +BITMAP +79 +85 +86 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni01A2 +ENCODING 418 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +76 +8A +8A +8A +8A +8A +8A +8A +8A +8A +72 +ENDCHAR +STARTCHAR uni01A3 +ENCODING 419 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +7C +8A +8A +8A +8A +8A +8A +72 +02 +02 +02 +ENDCHAR +STARTCHAR uni01A4 +ENCODING 420 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +7E +A1 +A1 +21 +21 +21 +3E +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni01A5 +ENCODING 421 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -3 +BITMAP +60 +80 +B8 +C4 +84 +84 +84 +84 +C4 +B8 +80 +80 +80 +ENDCHAR +STARTCHAR uni01A6 +ENCODING 422 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 -1 +BITMAP +80 +80 +F8 +84 +84 +84 +F8 +C0 +A0 +90 +88 +04 +ENDCHAR +STARTCHAR uni01A7 +ENCODING 423 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +F8 +04 +04 +04 +08 +30 +40 +80 +80 +80 +7C +ENDCHAR +STARTCHAR uni01A8 +ENCODING 424 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +F8 +04 +04 +18 +60 +80 +80 +7C +ENDCHAR +STARTCHAR uni01A9 +ENCODING 425 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +FC +80 +40 +20 +10 +08 +10 +20 +40 +80 +FC +ENDCHAR +STARTCHAR uni01AA +ENCODING 426 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 15 1 -3 +BITMAP +40 +A0 +A0 +60 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +1C +ENDCHAR +STARTCHAR uni01AB +ENCODING 427 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +40 +40 +40 +F8 +40 +40 +40 +40 +40 +40 +3C +04 +04 +08 +ENDCHAR +STARTCHAR uni01AC +ENCODING 428 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +7F +88 +88 +08 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni01AD +ENCODING 429 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +30 +40 +40 +40 +F8 +40 +40 +40 +40 +40 +40 +3C +ENDCHAR +STARTCHAR uni01AE +ENCODING 430 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 -2 +BITMAP +FE +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +0C +ENDCHAR +STARTCHAR Uhorn +ENCODING 431 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +85 +85 +86 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uhorn +ENCODING 432 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +85 +85 +86 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni01B1 +ENCODING 433 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +EE +28 +44 +82 +82 +82 +82 +82 +82 +44 +38 +ENDCHAR +STARTCHAR uni01B2 +ENCODING 434 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +80 +80 +88 +84 +84 +84 +84 +84 +84 +88 +70 +ENDCHAR +STARTCHAR uni01B3 +ENCODING 435 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +83 +84 +44 +44 +28 +28 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni01B4 +ENCODING 436 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 -3 +BITMAP +03 +84 +84 +84 +84 +84 +84 +84 +7C +04 +04 +78 +ENDCHAR +STARTCHAR uni01B5 +ENCODING 437 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +FC +04 +08 +08 +10 +FC +20 +20 +40 +40 +FC +ENDCHAR +STARTCHAR uni01B6 +ENCODING 438 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +FC +04 +08 +FC +20 +40 +80 +FC +ENDCHAR +STARTCHAR uni01B7 +ENCODING 439 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +FC +04 +08 +10 +30 +08 +04 +04 +04 +88 +70 +ENDCHAR +STARTCHAR uni01B8 +ENCODING 440 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +FC +80 +40 +20 +30 +40 +80 +80 +80 +44 +38 +ENDCHAR +STARTCHAR uni01B9 +ENCODING 441 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +FC +80 +40 +20 +30 +40 +80 +80 +80 +44 +38 +ENDCHAR +STARTCHAR uni01BA +ENCODING 442 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +FC +04 +08 +10 +38 +04 +04 +78 +80 +80 +78 +ENDCHAR +STARTCHAR uni01BB +ENCODING 443 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +F8 +04 +04 +04 +08 +FC +20 +40 +80 +80 +FC +ENDCHAR +STARTCHAR uni01BC +ENCODING 444 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +FC +80 +80 +80 +F0 +08 +04 +04 +04 +08 +F0 +ENDCHAR +STARTCHAR uni01BD +ENCODING 445 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +FC +80 +80 +80 +F0 +08 +04 +04 +04 +08 +F0 +ENDCHAR +STARTCHAR uni01BE +ENCODING 446 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +20 +20 +F8 +20 +20 +18 +04 +04 +04 +84 +78 +ENDCHAR +STARTCHAR uni01BF +ENCODING 447 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +B8 +C4 +84 +84 +84 +88 +90 +A0 +C0 +80 +80 +ENDCHAR +STARTCHAR uni01C0 +ENCODING 448 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 14 3 -3 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni01C1 +ENCODING 449 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 14 2 -3 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni01C2 +ENCODING 450 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 14 1 -3 +BITMAP +20 +20 +20 +20 +20 +F8 +20 +20 +F8 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni01C3 +ENCODING 451 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 11 3 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +00 +00 +80 +80 +ENDCHAR +STARTCHAR uni01C4 +ENCODING 452 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +05 +02 +E0 +97 +91 +91 +92 +92 +92 +94 +94 +94 +E7 +ENDCHAR +STARTCHAR uni01C5 +ENCODING 453 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +05 +E2 +90 +90 +97 +91 +91 +92 +92 +94 +94 +E7 +ENDCHAR +STARTCHAR uni01C6 +ENCODING 454 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +05 +12 +10 +10 +77 +91 +91 +92 +92 +94 +94 +77 +ENDCHAR +STARTCHAR uni01C7 +ENCODING 455 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +86 +82 +82 +82 +82 +82 +82 +82 +82 +82 +EC +ENDCHAR +STARTCHAR uni01C8 +ENCODING 456 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +80 +81 +80 +83 +81 +81 +81 +81 +81 +81 +FD +01 +01 +06 +ENDCHAR +STARTCHAR uni01C9 +ENCODING 457 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +C0 +42 +40 +46 +42 +42 +42 +42 +42 +42 +32 +02 +02 +0C +ENDCHAR +STARTCHAR uni01CA +ENCODING 458 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +8B +89 +C9 +C9 +A9 +A9 +A9 +99 +99 +89 +8A +ENDCHAR +STARTCHAR uni01CB +ENCODING 459 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +88 +89 +C8 +CB +A9 +A9 +A9 +99 +99 +89 +89 +01 +01 +06 +ENDCHAR +STARTCHAR uni01CC +ENCODING 460 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 -3 +BITMAP +01 +00 +F3 +89 +89 +89 +89 +89 +89 +89 +01 +01 +06 +ENDCHAR +STARTCHAR uni01CD +ENCODING 461 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +50 +20 +00 +78 +84 +84 +84 +FC +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR uni01CE +ENCODING 462 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +50 +20 +00 +00 +78 +04 +04 +7C +84 +84 +84 +7C +ENDCHAR +STARTCHAR uni01CF +ENCODING 463 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 13 1 0 +BITMAP +50 +20 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni01D0 +ENCODING 464 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 12 2 0 +BITMAP +A0 +40 +00 +00 +E0 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni01D1 +ENCODING 465 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +50 +20 +00 +78 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni01D2 +ENCODING 466 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +50 +20 +00 +00 +78 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni01D3 +ENCODING 467 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +50 +20 +00 +84 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni01D4 +ENCODING 468 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +50 +20 +00 +00 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni01D5 +ENCODING 469 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +78 +00 +48 +00 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni01D6 +ENCODING 470 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +78 +00 +48 +00 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni01D7 +ENCODING 471 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +10 +A4 +00 +84 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni01D8 +ENCODING 472 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +08 +10 +00 +48 +00 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni01D9 +ENCODING 473 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +50 +20 +88 +00 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni01DA +ENCODING 474 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +50 +20 +88 +00 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni01DB +ENCODING 475 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +20 +94 +00 +84 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni01DC +ENCODING 476 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +40 +20 +00 +48 +00 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni01DD +ENCODING 477 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +F8 +04 +04 +FC +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni01DE +ENCODING 478 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +78 +00 +48 +00 +78 +84 +84 +84 +FC +84 +84 +84 +84 +ENDCHAR +STARTCHAR uni01DF +ENCODING 479 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +78 +00 +48 +00 +78 +04 +04 +7C +84 +84 +84 +7C +ENDCHAR +STARTCHAR uni01E0 +ENCODING 480 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +78 +00 +20 +00 +78 +84 +84 +84 +FC +84 +84 +84 +84 +ENDCHAR +STARTCHAR uni01E1 +ENCODING 481 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +78 +00 +20 +00 +78 +04 +04 +7C +84 +84 +84 +7C +ENDCHAR +STARTCHAR uni01E2 +ENCODING 482 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +3C +00 +7F +88 +88 +88 +88 +FE +88 +88 +88 +88 +8F +ENDCHAR +STARTCHAR uni01E3 +ENCODING 483 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 0 0 +BITMAP +7C +00 +7C +12 +12 +7C +90 +90 +90 +7E +ENDCHAR +STARTCHAR uni01E4 +ENCODING 484 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7C +80 +80 +80 +80 +9C +84 +9E +84 +84 +78 +ENDCHAR +STARTCHAR uni01E5 +ENCODING 485 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +7C +84 +84 +84 +84 +84 +7C +04 +1E +04 +F8 +ENDCHAR +STARTCHAR Gcaron +ENCODING 486 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +50 +20 +00 +7C +80 +80 +80 +9C +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR gcaron +ENCODING 487 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +50 +20 +00 +7C +84 +84 +84 +84 +84 +84 +7C +04 +04 +F8 +ENDCHAR +STARTCHAR uni01E8 +ENCODING 488 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +50 +20 +00 +84 +88 +90 +A0 +C0 +C0 +A0 +90 +88 +84 +ENDCHAR +STARTCHAR uni01E9 +ENCODING 489 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +50 +20 +00 +80 +80 +84 +88 +90 +A0 +E0 +90 +88 +84 +ENDCHAR +STARTCHAR uni01EA +ENCODING 490 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +78 +84 +84 +84 +84 +84 +84 +84 +84 +84 +78 +20 +40 +30 +ENDCHAR +STARTCHAR uni01EB +ENCODING 491 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +78 +84 +84 +84 +84 +84 +84 +78 +20 +40 +30 +ENDCHAR +STARTCHAR uni01EC +ENCODING 492 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 1 -3 +BITMAP +78 +00 +78 +84 +84 +84 +84 +84 +84 +84 +84 +84 +78 +20 +40 +30 +ENDCHAR +STARTCHAR uni01ED +ENCODING 493 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -3 +BITMAP +78 +00 +78 +84 +84 +84 +84 +84 +84 +78 +20 +40 +30 +ENDCHAR +STARTCHAR uni01EE +ENCODING 494 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +50 +20 +00 +FC +04 +08 +10 +30 +08 +04 +04 +88 +70 +ENDCHAR +STARTCHAR uni01EF +ENCODING 495 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 15 1 -3 +BITMAP +50 +20 +00 +00 +FC +04 +08 +10 +30 +08 +04 +04 +04 +88 +70 +ENDCHAR +STARTCHAR uni01F0 +ENCODING 496 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 15 2 -3 +BITMAP +A0 +40 +00 +00 +E0 +20 +20 +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni01F1 +ENCODING 497 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +E7 +91 +91 +91 +92 +92 +92 +94 +94 +94 +E7 +ENDCHAR +STARTCHAR uni01F2 +ENCODING 498 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +E0 +90 +90 +97 +91 +91 +92 +92 +94 +94 +E7 +ENDCHAR +STARTCHAR uni01F3 +ENCODING 499 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +10 +10 +10 +77 +91 +91 +92 +92 +94 +94 +77 +ENDCHAR +STARTCHAR uni01F4 +ENCODING 500 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +08 +10 +00 +7C +80 +80 +80 +9C +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni01F5 +ENCODING 501 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 15 1 -3 +BITMAP +08 +10 +00 +00 +7C +84 +84 +84 +84 +84 +84 +7C +04 +04 +F8 +ENDCHAR +STARTCHAR uni01F6 +ENCODING 502 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +88 +88 +89 +89 +89 +F9 +89 +89 +89 +89 +86 +ENDCHAR +STARTCHAR uni01F7 +ENCODING 503 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +B8 +C4 +84 +84 +84 +88 +88 +90 +A0 +C0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni01F8 +ENCODING 504 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +40 +20 +84 +C4 +C4 +A4 +A4 +94 +94 +8C +8C +84 +84 +ENDCHAR +STARTCHAR uni01F9 +ENCODING 505 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +40 +20 +00 +00 +F8 +84 +84 +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR Aringacute +ENCODING 506 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +44 +A8 +40 +00 +78 +84 +84 +84 +FC +84 +84 +84 +84 +ENDCHAR +STARTCHAR aringacute +ENCODING 507 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +44 +A8 +40 +00 +78 +04 +04 +7C +84 +84 +84 +7C +ENDCHAR +STARTCHAR AEacute +ENCODING 508 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +08 +10 +00 +7F +88 +88 +88 +FE +88 +88 +88 +88 +8F +ENDCHAR +STARTCHAR aeacute +ENCODING 509 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 0 0 +BITMAP +04 +08 +00 +00 +7C +12 +12 +7C +90 +90 +90 +7E +ENDCHAR +STARTCHAR Oslashacute +ENCODING 510 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +08 +10 +00 +3C +43 +42 +46 +4A +52 +62 +42 +C2 +3C +ENDCHAR +STARTCHAR oslashacute +ENCODING 511 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +04 +08 +00 +00 +3D +42 +46 +4A +52 +62 +42 +BC +ENDCHAR +STARTCHAR uni0200 +ENCODING 512 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +90 +48 +00 +78 +84 +84 +84 +FC +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR uni0201 +ENCODING 513 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +90 +48 +00 +00 +78 +04 +04 +7C +84 +84 +84 +7C +ENDCHAR +STARTCHAR uni0202 +ENCODING 514 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +30 +48 +00 +78 +84 +84 +84 +FC +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR uni0203 +ENCODING 515 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +30 +48 +00 +78 +04 +04 +7C +84 +84 +84 +7C +ENDCHAR +STARTCHAR uni0204 +ENCODING 516 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +90 +48 +00 +FC +80 +80 +80 +F8 +80 +80 +80 +80 +FC +ENDCHAR +STARTCHAR uni0205 +ENCODING 517 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +90 +48 +00 +00 +78 +84 +84 +84 +FC +80 +80 +7C +ENDCHAR +STARTCHAR uni0206 +ENCODING 518 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +30 +48 +00 +FC +80 +80 +80 +F8 +80 +80 +80 +80 +FC +ENDCHAR +STARTCHAR uni0207 +ENCODING 519 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +30 +48 +00 +78 +84 +84 +84 +FC +80 +80 +7C +ENDCHAR +STARTCHAR uni0208 +ENCODING 520 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 13 1 0 +BITMAP +90 +48 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni0209 +ENCODING 521 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +90 +48 +00 +00 +70 +10 +10 +10 +10 +10 +10 +7C +ENDCHAR +STARTCHAR uni020A +ENCODING 522 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 13 1 0 +BITMAP +70 +88 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni020B +ENCODING 523 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 2 0 +BITMAP +60 +90 +00 +E0 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni020C +ENCODING 524 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +90 +48 +00 +78 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni020D +ENCODING 525 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +90 +48 +00 +00 +78 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni020E +ENCODING 526 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +30 +48 +00 +78 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni020F +ENCODING 527 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +30 +48 +00 +78 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni0210 +ENCODING 528 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +90 +48 +00 +F8 +84 +84 +84 +F8 +C0 +A0 +90 +88 +84 +ENDCHAR +STARTCHAR uni0211 +ENCODING 529 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +90 +48 +00 +00 +BC +C0 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni0212 +ENCODING 530 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +30 +48 +00 +F8 +84 +84 +84 +F8 +C0 +A0 +90 +88 +84 +ENDCHAR +STARTCHAR uni0213 +ENCODING 531 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +30 +48 +00 +BC +C0 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni0214 +ENCODING 532 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +90 +48 +00 +84 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni0215 +ENCODING 533 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +90 +48 +00 +00 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni0216 +ENCODING 534 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +30 +48 +00 +84 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni0217 +ENCODING 535 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +30 +48 +00 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Scommaaccent +ENCODING 536 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +7C +80 +80 +80 +80 +78 +04 +04 +04 +04 +F8 +00 +10 +20 +ENDCHAR +STARTCHAR scommaaccent +ENCODING 537 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +7C +80 +80 +60 +18 +04 +04 +F8 +00 +10 +20 +ENDCHAR +STARTCHAR uni021A +ENCODING 538 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 0 -3 +BITMAP +FE +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +00 +10 +20 +ENDCHAR +STARTCHAR uni021B +ENCODING 539 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +40 +40 +40 +F8 +40 +40 +40 +40 +40 +40 +3C +00 +10 +20 +ENDCHAR +STARTCHAR uni021C +ENCODING 540 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +78 +84 +04 +04 +08 +10 +38 +44 +04 +04 +04 +08 +30 +C0 +ENDCHAR +STARTCHAR uni021D +ENCODING 541 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +78 +84 +04 +04 +18 +64 +04 +04 +08 +30 +C0 +ENDCHAR +STARTCHAR uni021E +ENCODING 542 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +50 +20 +00 +84 +84 +84 +84 +FC +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR uni021F +ENCODING 543 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +28 +10 +80 +80 +80 +F8 +84 +84 +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR uni0220 +ENCODING 544 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +F8 +84 +84 +84 +84 +84 +84 +84 +84 +84 +84 +04 +04 +04 +ENDCHAR +STARTCHAR uni0221 +ENCODING 545 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 -1 +BITMAP +08 +08 +08 +78 +88 +88 +88 +88 +8C +8A +7C +08 +ENDCHAR +STARTCHAR uni0222 +ENCODING 546 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +08 +44 +84 +84 +78 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni0223 +ENCODING 547 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +48 +84 +84 +78 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni0224 +ENCODING 548 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +FC +04 +08 +08 +10 +10 +20 +20 +40 +40 +FC +04 +18 +ENDCHAR +STARTCHAR uni0225 +ENCODING 549 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 -2 +BITMAP +FC +04 +08 +10 +20 +40 +80 +FC +04 +18 +ENDCHAR +STARTCHAR uni0226 +ENCODING 550 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +20 +00 +78 +84 +84 +84 +84 +FC +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR uni0227 +ENCODING 551 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 0 +BITMAP +20 +00 +78 +04 +04 +7C +84 +84 +84 +7C +ENDCHAR +STARTCHAR uni0228 +ENCODING 552 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +FC +80 +80 +80 +80 +F8 +80 +80 +80 +80 +FC +10 +08 +30 +ENDCHAR +STARTCHAR uni0229 +ENCODING 553 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +78 +84 +84 +84 +FC +80 +80 +7C +10 +08 +30 +ENDCHAR +STARTCHAR uni022A +ENCODING 554 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +78 +00 +48 +00 +78 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni022B +ENCODING 555 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +78 +00 +48 +00 +78 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni022C +ENCODING 556 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +78 +00 +64 +98 +00 +78 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni022D +ENCODING 557 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +78 +00 +64 +98 +00 +78 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni022E +ENCODING 558 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +20 +00 +78 +84 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni022F +ENCODING 559 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 0 +BITMAP +20 +00 +78 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni0230 +ENCODING 560 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +78 +00 +20 +00 +78 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni0231 +ENCODING 561 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +78 +00 +20 +00 +78 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni0232 +ENCODING 562 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +3C +00 +82 +82 +44 +44 +28 +28 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni0233 +ENCODING 563 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -3 +BITMAP +78 +00 +84 +84 +84 +84 +84 +84 +84 +7C +04 +04 +F8 +ENDCHAR +STARTCHAR uni0234 +ENCODING 564 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 12 2 -1 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +40 +50 +68 +70 +20 +ENDCHAR +STARTCHAR uni0235 +ENCODING 565 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 9 1 -1 +BITMAP +F0 +88 +88 +88 +88 +8C +8A +8C +08 +ENDCHAR +STARTCHAR uni0236 +ENCODING 566 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 -1 +BITMAP +40 +40 +40 +F8 +40 +40 +40 +40 +48 +54 +38 +10 +ENDCHAR +STARTCHAR uni0237 +ENCODING 567 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 11 2 -3 +BITMAP +E0 +20 +20 +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni0238 +ENCODING 568 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +10 +10 +10 +7C +92 +92 +92 +92 +92 +92 +6C +ENDCHAR +STARTCHAR uni0239 +ENCODING 569 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 -3 +BITMAP +6C +92 +92 +92 +92 +92 +92 +7C +10 +10 +10 +ENDCHAR +STARTCHAR uni023A +ENCODING 570 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 -1 +BITMAP +02 +3C +46 +4A +4A +52 +7E +62 +62 +42 +42 +C2 +80 +ENDCHAR +STARTCHAR uni023B +ENCODING 571 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -2 +BITMAP +08 +7C +88 +90 +90 +90 +90 +A0 +A0 +A0 +A0 +7C +40 +40 +ENDCHAR +STARTCHAR uni023C +ENCODING 572 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 -2 +BITMAP +08 +08 +7C +90 +90 +90 +A0 +A0 +A0 +7C +40 +40 +ENDCHAR +STARTCHAR uni023D +ENCODING 573 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +40 +40 +40 +40 +40 +E0 +40 +40 +40 +40 +7E +ENDCHAR +STARTCHAR uni023E +ENCODING 574 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 -1 +BITMAP +02 +FE +14 +18 +18 +10 +10 +30 +30 +50 +50 +90 +80 +ENDCHAR +STARTCHAR uni023F +ENCODING 575 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +7C +80 +80 +60 +18 +04 +04 +F8 +20 +10 +0C +ENDCHAR +STARTCHAR uni0240 +ENCODING 576 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +FC +04 +08 +10 +20 +40 +80 +C0 +20 +10 +0C +ENDCHAR +STARTCHAR uni0241 +ENCODING 577 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +78 +84 +04 +04 +04 +18 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni0242 +ENCODING 578 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +78 +84 +04 +04 +18 +20 +20 +20 +ENDCHAR +STARTCHAR uni0243 +ENCODING 579 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +7C +42 +42 +42 +42 +7C +42 +F2 +42 +42 +7C +ENDCHAR +STARTCHAR uni0244 +ENCODING 580 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +42 +42 +42 +42 +42 +FF +42 +42 +42 +42 +3C +ENDCHAR +STARTCHAR uni0245 +ENCODING 581 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +10 +10 +28 +28 +28 +44 +44 +44 +82 +82 +82 +ENDCHAR +STARTCHAR uni0246 +ENCODING 582 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 -1 +BITMAP +02 +7E +44 +48 +48 +50 +7C +60 +60 +40 +40 +FE +80 +ENDCHAR +STARTCHAR uni0247 +ENCODING 583 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +3D +42 +46 +4A +7E +60 +40 +BE +ENDCHAR +STARTCHAR uni0248 +ENCODING 584 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 2 0 +BITMAP +38 +10 +10 +10 +10 +38 +10 +10 +10 +10 +E0 +ENDCHAR +STARTCHAR uni0249 +ENCODING 585 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 13 2 -3 +BITMAP +20 +00 +E0 +20 +20 +20 +70 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni024A +ENCODING 586 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 1 -3 +BITMAP +7C +84 +84 +84 +84 +84 +84 +84 +84 +84 +7C +04 +04 +03 +ENDCHAR +STARTCHAR uni024B +ENCODING 587 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 1 -3 +BITMAP +7C +84 +84 +84 +84 +84 +84 +7C +04 +04 +03 +ENDCHAR +STARTCHAR uni024C +ENCODING 588 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +7C +42 +42 +42 +42 +FC +60 +50 +48 +44 +42 +ENDCHAR +STARTCHAR uni024D +ENCODING 589 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +5E +60 +40 +40 +E0 +40 +40 +40 +ENDCHAR +STARTCHAR uni024E +ENCODING 590 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +82 +82 +44 +FE +28 +28 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni024F +ENCODING 591 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +42 +42 +42 +42 +FF +42 +42 +3E +02 +02 +7C +ENDCHAR +STARTCHAR uni0250 +ENCODING 592 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +F8 +84 +84 +84 +F8 +80 +80 +78 +ENDCHAR +STARTCHAR uni0251 +ENCODING 593 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +74 +8C +84 +84 +84 +84 +8C +74 +ENDCHAR +STARTCHAR uni0252 +ENCODING 594 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +B8 +C4 +84 +84 +84 +84 +C4 +B8 +ENDCHAR +STARTCHAR uni0253 +ENCODING 595 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +60 +80 +80 +F8 +84 +84 +84 +84 +84 +84 +F8 +ENDCHAR +STARTCHAR uni0254 +ENCODING 596 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +F8 +04 +04 +04 +04 +04 +04 +F8 +ENDCHAR +STARTCHAR uni0255 +ENCODING 597 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 1 -1 +BITMAP +7C +80 +80 +80 +80 +88 +94 +78 +10 +ENDCHAR +STARTCHAR uni0256 +ENCODING 598 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 1 -2 +BITMAP +04 +04 +04 +7C +84 +84 +84 +84 +84 +84 +7C +04 +03 +ENDCHAR +STARTCHAR uni0257 +ENCODING 599 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 1 0 +BITMAP +03 +04 +04 +7C +84 +84 +84 +84 +84 +84 +7C +ENDCHAR +STARTCHAR uni0258 +ENCODING 600 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +78 +84 +84 +84 +FC +04 +04 +F8 +ENDCHAR +STARTCHAR uni0259 +ENCODING 601 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +F8 +04 +04 +FC +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni025A +ENCODING 602 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 1 0 +BITMAP +70 +0A +06 +1D +64 +84 +44 +38 +ENDCHAR +STARTCHAR uni025B +ENCODING 603 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +7C +80 +80 +78 +80 +80 +80 +7C +ENDCHAR +STARTCHAR uni025C +ENCODING 604 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +F8 +04 +04 +78 +04 +04 +04 +F8 +ENDCHAR +STARTCHAR uni025D +ENCODING 605 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 1 0 +BITMAP +FA +06 +05 +78 +04 +04 +04 +F8 +ENDCHAR +STARTCHAR uni025E +ENCODING 606 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +78 +84 +84 +B8 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni025F +ENCODING 607 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 11 2 -3 +BITMAP +E0 +20 +20 +20 +20 +70 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni0260 +ENCODING 608 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 1 -3 +BITMAP +03 +7C +84 +84 +84 +84 +84 +84 +7C +04 +04 +F8 +ENDCHAR +STARTCHAR uni0261 +ENCODING 609 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +7C +84 +84 +84 +84 +84 +84 +7C +04 +04 +F8 +ENDCHAR +STARTCHAR uni0262 +ENCODING 610 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +7C +80 +80 +80 +9C +84 +84 +78 +ENDCHAR +STARTCHAR uni0263 +ENCODING 611 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 -3 +BITMAP +82 +44 +28 +28 +10 +10 +28 +28 +44 +44 +38 +ENDCHAR +STARTCHAR uni0264 +ENCODING 612 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +82 +44 +28 +10 +28 +44 +44 +38 +ENDCHAR +STARTCHAR uni0265 +ENCODING 613 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +84 +84 +84 +84 +84 +84 +84 +7C +04 +04 +04 +ENDCHAR +STARTCHAR uni0266 +ENCODING 614 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +60 +80 +80 +80 +F8 +84 +84 +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR uni0267 +ENCODING 615 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -1 +BITMAP +60 +80 +80 +80 +F8 +84 +84 +84 +84 +84 +84 +84 +18 +ENDCHAR +STARTCHAR uni0268 +ENCODING 616 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 10 2 0 +BITMAP +20 +00 +E0 +20 +20 +20 +70 +20 +20 +F8 +ENDCHAR +STARTCHAR uni0269 +ENCODING 617 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 8 3 0 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR uni026A +ENCODING 618 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 8 1 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni026B +ENCODING 619 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 1 0 +BITMAP +60 +20 +20 +20 +20 +68 +B0 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni026C +ENCODING 620 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 1 0 +BITMAP +60 +20 +20 +20 +60 +A0 +78 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni026D +ENCODING 621 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 13 2 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR uni026E +ENCODING 622 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +C0 +40 +40 +7E +42 +44 +48 +58 +44 +42 +32 +02 +24 +18 +ENDCHAR +STARTCHAR uni026F +ENCODING 623 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +92 +92 +92 +92 +92 +92 +92 +7E +ENDCHAR +STARTCHAR uni0270 +ENCODING 624 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 -3 +BITMAP +92 +92 +92 +92 +92 +92 +92 +7E +02 +02 +02 +ENDCHAR +STARTCHAR uni0271 +ENCODING 625 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 -3 +BITMAP +FC +92 +92 +92 +92 +92 +92 +92 +02 +02 +0C +ENDCHAR +STARTCHAR uni0272 +ENCODING 626 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +3E +21 +21 +21 +21 +21 +21 +21 +20 +20 +C0 +ENDCHAR +STARTCHAR uni0273 +ENCODING 627 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 1 -3 +BITMAP +F8 +84 +84 +84 +84 +84 +84 +84 +04 +04 +03 +ENDCHAR +STARTCHAR uni0274 +ENCODING 628 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +C4 +C4 +A4 +A4 +94 +94 +8C +8C +ENDCHAR +STARTCHAR uni0275 +ENCODING 629 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +78 +84 +84 +FC +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni0276 +ENCODING 630 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +7E +90 +90 +9C +90 +90 +90 +7E +ENDCHAR +STARTCHAR uni0277 +ENCODING 631 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +38 +44 +82 +82 +92 +92 +92 +6C +ENDCHAR +STARTCHAR uni0278 +ENCODING 632 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 0 -3 +BITMAP +10 +10 +10 +38 +54 +92 +92 +92 +92 +54 +38 +10 +10 +10 +ENDCHAR +STARTCHAR uni0279 +ENCODING 633 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +04 +04 +04 +04 +04 +04 +0C +F4 +ENDCHAR +STARTCHAR uni027A +ENCODING 634 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +04 +04 +04 +04 +04 +04 +04 +04 +04 +0C +F4 +ENDCHAR +STARTCHAR uni027B +ENCODING 635 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 1 -3 +BITMAP +04 +04 +04 +04 +04 +04 +0C +F4 +04 +04 +03 +ENDCHAR +STARTCHAR uni027C +ENCODING 636 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +BC +C0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni027D +ENCODING 637 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +BC +C0 +80 +80 +80 +80 +80 +80 +80 +80 +60 +ENDCHAR +STARTCHAR uni027E +ENCODING 638 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +3C +40 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni027F +ENCODING 639 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +F0 +08 +08 +08 +08 +08 +08 +1C +ENDCHAR +STARTCHAR uni0280 +ENCODING 640 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +F8 +84 +84 +84 +F8 +90 +88 +84 +ENDCHAR +STARTCHAR uni0281 +ENCODING 641 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +84 +88 +90 +F8 +84 +84 +84 +F8 +ENDCHAR +STARTCHAR uni0282 +ENCODING 642 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +7C +80 +80 +60 +18 +04 +04 +F8 +80 +80 +60 +ENDCHAR +STARTCHAR uni0283 +ENCODING 643 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 14 1 -3 +BITMAP +18 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni0284 +ENCODING 644 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 14 2 -3 +BITMAP +18 +20 +20 +E0 +20 +20 +20 +F8 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni0285 +ENCODING 645 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 1 -3 +BITMAP +C0 +20 +20 +20 +20 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni0286 +ENCODING 646 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 14 1 -3 +BITMAP +18 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +70 +A0 +40 +ENDCHAR +STARTCHAR uni0287 +ENCODING 647 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +F0 +08 +08 +08 +08 +08 +08 +7C +08 +08 +08 +ENDCHAR +STARTCHAR uni0288 +ENCODING 648 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 14 1 -3 +BITMAP +40 +40 +40 +F8 +40 +40 +40 +40 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR uni0289 +ENCODING 649 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +42 +42 +42 +42 +FF +42 +42 +3C +ENDCHAR +STARTCHAR uni028A +ENCODING 650 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +EE +28 +44 +82 +82 +82 +44 +38 +ENDCHAR +STARTCHAR uni028B +ENCODING 651 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +88 +84 +84 +84 +84 +84 +88 +70 +ENDCHAR +STARTCHAR uni028C +ENCODING 652 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +10 +10 +28 +28 +44 +44 +82 +82 +ENDCHAR +STARTCHAR uni028D +ENCODING 653 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +44 +44 +AA +AA +92 +92 +82 +82 +ENDCHAR +STARTCHAR uni028E +ENCODING 654 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +F8 +04 +04 +7C +84 +84 +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR uni028F +ENCODING 655 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +82 +44 +28 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni0290 +ENCODING 656 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 1 -3 +BITMAP +FC +04 +08 +10 +20 +40 +80 +FC +04 +04 +03 +ENDCHAR +STARTCHAR uni0291 +ENCODING 657 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 9 1 -1 +BITMAP +FC +04 +08 +10 +20 +44 +8A +FC +08 +ENDCHAR +STARTCHAR uni0292 +ENCODING 658 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +FC +04 +08 +10 +30 +08 +04 +04 +04 +88 +70 +ENDCHAR +STARTCHAR uni0293 +ENCODING 659 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +FC +04 +08 +10 +30 +08 +04 +04 +74 +88 +74 +ENDCHAR +STARTCHAR uni0294 +ENCODING 660 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +78 +84 +04 +04 +04 +04 +38 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni0295 +ENCODING 661 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +78 +84 +80 +80 +80 +80 +70 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni0296 +ENCODING 662 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +20 +20 +20 +20 +38 +04 +04 +04 +04 +84 +78 +ENDCHAR +STARTCHAR uni0297 +ENCODING 663 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +3C +40 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +40 +3C +ENDCHAR +STARTCHAR uni0298 +ENCODING 664 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +78 +84 +84 +84 +84 +B4 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni0299 +ENCODING 665 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +F8 +84 +84 +F8 +84 +84 +84 +F8 +ENDCHAR +STARTCHAR uni029A +ENCODING 666 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +78 +84 +84 +74 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni029B +ENCODING 667 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +06 +08 +7C +80 +80 +9C +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni029C +ENCODING 668 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +84 +84 +84 +FC +84 +84 +84 +84 +ENDCHAR +STARTCHAR uni029D +ENCODING 669 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 13 1 -3 +BITMAP +10 +00 +70 +10 +10 +10 +10 +10 +10 +10 +78 +90 +60 +ENDCHAR +STARTCHAR uni029E +ENCODING 670 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +84 +44 +24 +1C +14 +24 +44 +84 +04 +04 +04 +ENDCHAR +STARTCHAR uni029F +ENCODING 671 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +FC +ENDCHAR +STARTCHAR uni02A0 +ENCODING 672 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 1 -3 +BITMAP +03 +04 +7C +84 +84 +84 +84 +84 +84 +7C +04 +04 +04 +ENDCHAR +STARTCHAR uni02A1 +ENCODING 673 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +78 +84 +04 +04 +04 +18 +20 +20 +70 +20 +20 +ENDCHAR +STARTCHAR uni02A2 +ENCODING 674 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +78 +84 +80 +80 +80 +60 +10 +10 +38 +10 +10 +ENDCHAR +STARTCHAR uni02A3 +ENCODING 675 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +10 +10 +10 +7F +91 +92 +92 +94 +94 +98 +7F +ENDCHAR +STARTCHAR uni02A4 +ENCODING 676 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +10 +10 +10 +7F +91 +92 +92 +94 +92 +91 +71 +01 +09 +06 +ENDCHAR +STARTCHAR uni02A5 +ENCODING 677 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 -2 +BITMAP +10 +10 +10 +7E +92 +92 +94 +94 +98 +9B +7D +06 +04 +ENDCHAR +STARTCHAR uni02A6 +ENCODING 678 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +40 +40 +40 +F7 +48 +48 +46 +41 +41 +41 +3E +ENDCHAR +STARTCHAR uni02A7 +ENCODING 679 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +43 +44 +44 +F4 +44 +44 +44 +44 +44 +44 +3C +04 +04 +18 +ENDCHAR +STARTCHAR uni02A8 +ENCODING 680 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 -1 +BITMAP +40 +40 +40 +F6 +49 +48 +48 +48 +4A +4D +3E +04 +ENDCHAR +STARTCHAR uni02A9 +ENCODING 681 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +38 +44 +40 +FE +49 +49 +49 +49 +49 +49 +49 +01 +01 +06 +ENDCHAR +STARTCHAR uni02AA +ENCODING 682 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +C0 +40 +40 +4E +50 +50 +4C +42 +42 +42 +3C +ENDCHAR +STARTCHAR uni02AB +ENCODING 683 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +C0 +40 +40 +4F +41 +42 +42 +44 +44 +48 +3F +ENDCHAR +STARTCHAR uni02AC +ENCODING 684 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 2 0 +BITMAP +88 +A8 +A8 +50 +50 +00 +88 +A8 +A8 +50 +50 +ENDCHAR +STARTCHAR uni02AD +ENCODING 685 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 2 0 +BITMAP +F8 +88 +88 +88 +88 +00 +F8 +88 +88 +88 +88 +ENDCHAR +STARTCHAR uni02AE +ENCODING 686 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +C0 +20 +20 +21 +21 +21 +21 +21 +21 +21 +1F +01 +01 +01 +ENDCHAR +STARTCHAR uni02AF +ENCODING 687 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 14 0 -3 +BITMAP +C000 +2000 +2000 +2200 +2200 +2200 +2200 +2200 +2200 +2200 +1E00 +0200 +0200 +0180 +ENDCHAR +STARTCHAR uni02BB +ENCODING 699 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 2 2 2 12 +BITMAP +40 +80 +ENDCHAR +STARTCHAR afii57929 +ENCODING 700 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 2 2 4 12 +BITMAP +40 +80 +ENDCHAR +STARTCHAR afii64937 +ENCODING 701 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 2 2 2 12 +BITMAP +80 +40 +ENDCHAR +STARTCHAR circumflex +ENCODING 710 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 4 2 2 12 +BITMAP +40 +B0 +ENDCHAR +STARTCHAR caron +ENCODING 711 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 4 2 2 12 +BITMAP +B0 +40 +ENDCHAR +STARTCHAR breve +ENCODING 728 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 2 1 12 +BITMAP +84 +78 +ENDCHAR +STARTCHAR dotaccent +ENCODING 729 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 1 2 4 12 +BITMAP +80 +80 +ENDCHAR +STARTCHAR ring +ENCODING 730 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 4 4 2 10 +BITMAP +40 +B0 +40 +40 +ENDCHAR +STARTCHAR ogonek +ENCODING 731 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 3 4 2 -2 +BITMAP +40 +80 +60 +60 +ENDCHAR +STARTCHAR tilde +ENCODING 732 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 4 1 10 +BITMAP +44 +B4 +88 +88 +ENDCHAR +STARTCHAR hungarumlaut +ENCODING 733 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 2 1 12 +BITMAP +44 +88 +ENDCHAR +STARTCHAR gravecomb +ENCODING 768 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 2 2 2 12 +BITMAP +80 +40 +ENDCHAR +STARTCHAR acutecomb +ENCODING 769 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 2 2 4 12 +BITMAP +40 +80 +ENDCHAR +STARTCHAR uni0302 +ENCODING 770 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 4 2 2 12 +BITMAP +40 +B0 +ENDCHAR +STARTCHAR tildecomb +ENCODING 771 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 4 1 10 +BITMAP +44 +B4 +88 +88 +ENDCHAR +STARTCHAR uni0306 +ENCODING 774 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 2 1 12 +BITMAP +84 +78 +ENDCHAR +STARTCHAR uni0307 +ENCODING 775 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 1 1 4 13 +BITMAP +80 +ENDCHAR +STARTCHAR uni0308 +ENCODING 776 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 4 1 2 13 +BITMAP +B0 +ENDCHAR +STARTCHAR uni030C +ENCODING 780 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 4 2 2 12 +BITMAP +B0 +40 +ENDCHAR +STARTCHAR uni0329 +ENCODING 809 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 1 2 2 0 +BITMAP +80 +80 +ENDCHAR +STARTCHAR uni0370 +ENCODING 880 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +80 +80 +80 +80 +80 +FC +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni0371 +ENCODING 881 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +80 +80 +80 +FC +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni0372 +ENCODING 882 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +FE +92 +92 +92 +92 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni0373 +ENCODING 883 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 1 0 +BITMAP +F8 +A8 +A8 +A8 +A8 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni0374 +ENCODING 884 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 3 4 10 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR uni0375 +ENCODING 885 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 3 4 -3 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR uni0376 +ENCODING 886 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +84 +8C +8C +94 +94 +A4 +A4 +C4 +C4 +84 +84 +ENDCHAR +STARTCHAR uni0377 +ENCODING 887 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +8C +8C +94 +94 +A4 +A4 +C4 +C4 +ENDCHAR +STARTCHAR uni037B +ENCODING 891 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +F8 +04 +04 +04 +04 +04 +04 +F8 +ENDCHAR +STARTCHAR uni037C +ENCODING 892 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +7C +80 +80 +90 +80 +80 +80 +7C +ENDCHAR +STARTCHAR uni037D +ENCODING 893 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +F8 +04 +04 +24 +04 +04 +04 +F8 +ENDCHAR +STARTCHAR uni037E +ENCODING 894 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 10 3 -3 +BITMAP +C0 +C0 +00 +00 +00 +C0 +C0 +40 +40 +80 +ENDCHAR +STARTCHAR uni037F +ENCODING 895 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 2 0 +BITMAP +38 +10 +10 +10 +10 +10 +10 +10 +10 +10 +E0 +ENDCHAR +STARTCHAR tonos +ENCODING 900 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 3 3 10 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR dieresistonos +ENCODING 901 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 5 2 8 +BITMAP +20 +20 +40 +00 +90 +ENDCHAR +STARTCHAR Alphatonos +ENCODING 902 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +40 +80 +10 +10 +28 +28 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR anoteleia +ENCODING 903 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 2 3 4 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR Epsilontonos +ENCODING 904 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +40 +80 +7E +40 +40 +40 +40 +7C +40 +40 +40 +40 +7E +ENDCHAR +STARTCHAR Etatonos +ENCODING 905 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +40 +80 +42 +42 +42 +42 +42 +7E +42 +42 +42 +42 +42 +ENDCHAR +STARTCHAR Iotatonos +ENCODING 906 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 0 0 +BITMAP +40 +80 +7C +10 +10 +10 +10 +10 +10 +10 +10 +10 +7C +ENDCHAR +STARTCHAR Omicrontonos +ENCODING 908 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +40 +80 +3C +42 +42 +42 +42 +42 +42 +42 +42 +42 +3C +ENDCHAR +STARTCHAR Upsilontonos +ENCODING 910 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +10 +20 +82 +82 +44 +44 +28 +28 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR Omegatonos +ENCODING 911 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +40 +80 +38 +44 +82 +82 +82 +82 +82 +82 +44 +28 +EE +ENDCHAR +STARTCHAR iotadieresistonos +ENCODING 912 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 13 2 0 +BITMAP +20 +40 +00 +90 +00 +60 +20 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR Alpha +ENCODING 913 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +10 +10 +28 +28 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR Beta +ENCODING 914 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +F8 +84 +84 +84 +84 +F8 +84 +84 +84 +84 +F8 +ENDCHAR +STARTCHAR Gamma +ENCODING 915 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +FC +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Delta +ENCODING 916 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +10 +10 +28 +28 +28 +44 +44 +44 +82 +82 +FE +ENDCHAR +STARTCHAR Epsilon +ENCODING 917 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +FC +80 +80 +80 +80 +F8 +80 +80 +80 +80 +FC +ENDCHAR +STARTCHAR Zeta +ENCODING 918 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +FC +04 +08 +08 +10 +10 +20 +20 +40 +40 +FC +ENDCHAR +STARTCHAR Eta +ENCODING 919 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +84 +84 +84 +84 +84 +FC +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR Theta +ENCODING 920 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +78 +84 +84 +84 +84 +B4 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Iota +ENCODING 921 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 1 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR Kappa +ENCODING 922 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +84 +88 +90 +A0 +C0 +80 +C0 +A0 +90 +88 +84 +ENDCHAR +STARTCHAR Lambda +ENCODING 923 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +10 +10 +28 +28 +28 +44 +44 +44 +82 +82 +82 +ENDCHAR +STARTCHAR Mu +ENCODING 924 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +82 +82 +C6 +C6 +AA +AA +92 +92 +82 +82 +82 +ENDCHAR +STARTCHAR Nu +ENCODING 925 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +84 +C4 +C4 +A4 +A4 +94 +94 +8C +8C +84 +84 +ENDCHAR +STARTCHAR Xi +ENCODING 926 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +FC +00 +00 +00 +00 +78 +00 +00 +00 +00 +FC +ENDCHAR +STARTCHAR Omicron +ENCODING 927 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +78 +84 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR Pi +ENCODING 928 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +FC +84 +84 +84 +84 +84 +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR Rho +ENCODING 929 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +F8 +84 +84 +84 +84 +84 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR Sigma +ENCODING 931 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +FC +80 +40 +20 +10 +08 +10 +20 +40 +80 +FC +ENDCHAR +STARTCHAR Tau +ENCODING 932 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +FE +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR Upsilon +ENCODING 933 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +82 +82 +44 +44 +28 +28 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR Phi +ENCODING 934 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +10 +38 +54 +92 +92 +92 +92 +92 +54 +38 +10 +ENDCHAR +STARTCHAR Chi +ENCODING 935 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +82 +44 +44 +28 +28 +10 +28 +28 +44 +44 +82 +ENDCHAR +STARTCHAR Psi +ENCODING 936 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +92 +92 +92 +92 +92 +92 +92 +54 +38 +10 +10 +ENDCHAR +STARTCHAR Omega +ENCODING 937 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +38 +44 +82 +82 +82 +82 +82 +82 +44 +28 +EE +ENDCHAR +STARTCHAR Iotadieresis +ENCODING 938 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 13 1 0 +BITMAP +48 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR Upsilondieresis +ENCODING 939 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +48 +00 +82 +82 +44 +44 +28 +28 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR alphatonos +ENCODING 940 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +08 +10 +00 +00 +62 +94 +94 +88 +88 +94 +94 +62 +ENDCHAR +STARTCHAR epsilontonos +ENCODING 941 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +08 +10 +00 +00 +7C +80 +80 +78 +80 +80 +80 +7C +ENDCHAR +STARTCHAR etatonos +ENCODING 942 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 15 1 -3 +BITMAP +08 +10 +00 +00 +F8 +84 +84 +84 +84 +84 +84 +84 +04 +04 +04 +ENDCHAR +STARTCHAR iotatonos +ENCODING 943 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 12 2 0 +BITMAP +20 +40 +00 +00 +C0 +40 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR upsilondieresistonos +ENCODING 944 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +10 +20 +00 +48 +00 +88 +84 +84 +84 +84 +84 +88 +70 +ENDCHAR +STARTCHAR alpha +ENCODING 945 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +62 +94 +94 +88 +88 +94 +94 +62 +ENDCHAR +STARTCHAR beta +ENCODING 946 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +38 +44 +84 +84 +88 +B0 +88 +84 +84 +C4 +B8 +80 +80 +80 +ENDCHAR +STARTCHAR gamma +ENCODING 947 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +84 +44 +44 +28 +28 +28 +10 +10 +10 +20 +20 +ENDCHAR +STARTCHAR delta +ENCODING 948 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +38 +40 +40 +30 +48 +84 +84 +84 +84 +48 +30 +ENDCHAR +STARTCHAR epsilon +ENCODING 949 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +7C +80 +80 +78 +80 +80 +80 +7C +ENDCHAR +STARTCHAR zeta +ENCODING 950 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +FC +08 +10 +20 +40 +40 +80 +80 +80 +40 +38 +04 +04 +08 +ENDCHAR +STARTCHAR eta +ENCODING 951 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +F8 +84 +84 +84 +84 +84 +84 +84 +04 +04 +04 +ENDCHAR +STARTCHAR theta +ENCODING 952 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +30 +48 +48 +84 +84 +FC +84 +84 +48 +48 +30 +ENDCHAR +STARTCHAR iota +ENCODING 953 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 8 3 0 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR kappa +ENCODING 954 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +84 +88 +90 +A0 +E0 +90 +88 +84 +ENDCHAR +STARTCHAR lambda +ENCODING 955 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +20 +20 +10 +10 +10 +28 +28 +48 +44 +84 +84 +ENDCHAR +STARTCHAR mu +ENCODING 956 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +84 +84 +84 +84 +84 +84 +CC +B4 +80 +80 +80 +ENDCHAR +STARTCHAR nu +ENCODING 957 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +88 +84 +44 +44 +28 +28 +10 +10 +ENDCHAR +STARTCHAR xi +ENCODING 958 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +FC +40 +80 +80 +40 +38 +40 +80 +80 +40 +38 +04 +04 +18 +ENDCHAR +STARTCHAR omicron +ENCODING 959 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +78 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR pi +ENCODING 960 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +FC +48 +48 +48 +48 +48 +48 +44 +ENDCHAR +STARTCHAR rho +ENCODING 961 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +30 +48 +84 +84 +84 +84 +C8 +B0 +80 +80 +80 +ENDCHAR +STARTCHAR sigma1 +ENCODING 962 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +3C +40 +80 +80 +80 +80 +40 +38 +04 +04 +18 +ENDCHAR +STARTCHAR sigma +ENCODING 963 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +3E +48 +84 +84 +84 +84 +48 +30 +ENDCHAR +STARTCHAR tau +ENCODING 964 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 8 1 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR upsilon +ENCODING 965 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +88 +84 +84 +84 +84 +84 +88 +70 +ENDCHAR +STARTCHAR phi +ENCODING 966 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 -3 +BITMAP +4C +92 +92 +92 +92 +92 +54 +38 +10 +10 +10 +ENDCHAR +STARTCHAR chi +ENCODING 967 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 -3 +BITMAP +82 +44 +44 +28 +28 +10 +28 +28 +44 +44 +82 +ENDCHAR +STARTCHAR psi +ENCODING 968 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 -3 +BITMAP +92 +92 +92 +92 +92 +54 +54 +38 +10 +10 +10 +ENDCHAR +STARTCHAR omega +ENCODING 969 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +44 +82 +82 +82 +92 +92 +92 +6C +ENDCHAR +STARTCHAR iotadieresis +ENCODING 970 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 2 0 +BITMAP +90 +00 +00 +60 +20 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR upsilondieresis +ENCODING 971 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +48 +00 +00 +88 +84 +84 +84 +84 +84 +88 +70 +ENDCHAR +STARTCHAR omicrontonos +ENCODING 972 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +08 +10 +00 +00 +78 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR upsilontonos +ENCODING 973 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +08 +10 +00 +00 +88 +84 +84 +84 +84 +84 +88 +70 +ENDCHAR +STARTCHAR omegatonos +ENCODING 974 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +08 +10 +00 +00 +44 +82 +82 +82 +92 +92 +92 +6C +ENDCHAR +STARTCHAR uni03CF +ENCODING 975 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +84 +88 +90 +A0 +C0 +80 +C0 +A0 +90 +88 +84 +08 +10 +ENDCHAR +STARTCHAR uni03D0 +ENCODING 976 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +78 +84 +84 +84 +88 +F0 +88 +84 +84 +84 +78 +ENDCHAR +STARTCHAR theta1 +ENCODING 977 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +30 +48 +44 +44 +24 +1C +84 +84 +84 +48 +30 +ENDCHAR +STARTCHAR Upsilon1 +ENCODING 978 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +84 +4A +28 +28 +28 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni03D3 +ENCODING 979 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 1 +BITMAP +40 +80 +22 +25 +14 +14 +14 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni03D4 +ENCODING 980 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +48 +00 +84 +4A +28 +28 +28 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR phi1 +ENCODING 981 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 0 -3 +BITMAP +10 +10 +10 +38 +54 +92 +92 +92 +92 +54 +38 +10 +10 +10 +ENDCHAR +STARTCHAR omega1 +ENCODING 982 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +FE +44 +82 +82 +92 +92 +92 +6C +ENDCHAR +STARTCHAR uni03D7 +ENCODING 983 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 -3 +BITMAP +46 +AA +2C +38 +28 +68 +AA +C6 +02 +02 +0C +ENDCHAR +STARTCHAR uni03D8 +ENCODING 984 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +78 +84 +84 +84 +84 +84 +84 +84 +84 +84 +78 +20 +20 +20 +ENDCHAR +STARTCHAR uni03D9 +ENCODING 985 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +78 +84 +84 +84 +84 +84 +84 +78 +20 +20 +20 +ENDCHAR +STARTCHAR uni03DA +ENCODING 986 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +38 +44 +80 +80 +80 +80 +80 +80 +80 +40 +30 +0C +02 +0C +ENDCHAR +STARTCHAR uni03DB +ENCODING 987 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +38 +44 +80 +80 +80 +80 +40 +30 +0C +02 +1C +ENDCHAR +STARTCHAR uni03DC +ENCODING 988 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +FC +80 +80 +80 +80 +F8 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni03DD +ENCODING 989 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +1C +20 +20 +20 +20 +20 +38 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni03DE +ENCODING 990 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -1 +BITMAP +40 +20 +20 +40 +4C +B4 +C8 +08 +10 +10 +08 +ENDCHAR +STARTCHAR uni03DF +ENCODING 991 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +40 +40 +40 +80 +80 +FC +04 +04 +08 +08 +08 +ENDCHAR +STARTCHAR uni03E0 +ENCODING 992 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +38 +64 +A2 +22 +23 +05 +05 +09 +09 +09 +09 +02 +02 +04 +ENDCHAR +STARTCHAR uni03E1 +ENCODING 993 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 -3 +BITMAP +C0 +20 +10 +10 +28 +28 +54 +54 +A4 +04 +04 +04 +ENDCHAR +STARTCHAR uni03E2 +ENCODING 994 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 0 -3 +BITMAP +44 +82 +82 +82 +82 +92 +92 +92 +92 +92 +6C +04 +08 +30 +ENDCHAR +STARTCHAR uni03E3 +ENCODING 995 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 -3 +BITMAP +44 +82 +82 +82 +92 +92 +92 +6C +04 +08 +30 +ENDCHAR +STARTCHAR uni03E4 +ENCODING 996 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +44 +84 +84 +84 +84 +84 +84 +84 +84 +4C +34 +04 +04 +04 +ENDCHAR +STARTCHAR uni03E5 +ENCODING 997 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +44 +84 +84 +84 +84 +84 +4C +34 +04 +04 +04 +ENDCHAR +STARTCHAR uni03E6 +ENCODING 998 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +80 +80 +80 +B0 +C8 +84 +84 +84 +84 +84 +84 +04 +08 +30 +ENDCHAR +STARTCHAR uni03E7 +ENCODING 999 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +7A +84 +8C +74 +04 +04 +48 +B0 +ENDCHAR +STARTCHAR uni03E8 +ENCODING 1000 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +F0 +08 +04 +04 +04 +08 +08 +10 +20 +40 +80 +80 +40 +3C +ENDCHAR +STARTCHAR uni03E9 +ENCODING 1001 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +F8 +04 +04 +08 +10 +20 +40 +80 +80 +40 +3C +ENDCHAR +STARTCHAR uni03EA +ENCODING 1002 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +C6 +28 +28 +10 +10 +10 +28 +28 +44 +44 +FE +ENDCHAR +STARTCHAR uni03EB +ENCODING 1003 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +C6 +28 +10 +10 +28 +28 +44 +FE +ENDCHAR +STARTCHAR uni03EC +ENCODING 1004 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +02 +3C +40 +80 +B8 +C4 +82 +82 +82 +44 +38 +ENDCHAR +STARTCHAR uni03ED +ENCODING 1005 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +04 +38 +40 +80 +B0 +C8 +84 +84 +84 +48 +30 +ENDCHAR +STARTCHAR uni03EE +ENCODING 1006 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +10 +10 +FE +92 +10 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni03EF +ENCODING 1007 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 1 0 +BITMAP +20 +20 +F8 +A8 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni03F0 +ENCODING 1008 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +46 +AC +28 +38 +38 +28 +6A +C4 +ENDCHAR +STARTCHAR uni03F1 +ENCODING 1009 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +30 +48 +84 +84 +84 +84 +C8 +B0 +80 +40 +3C +ENDCHAR +STARTCHAR uni03F2 +ENCODING 1010 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +7C +80 +80 +80 +80 +80 +80 +7C +ENDCHAR +STARTCHAR uni03F3 +ENCODING 1011 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 14 2 -3 +BITMAP +20 +00 +00 +E0 +20 +20 +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni03F4 +ENCODING 1012 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +78 +84 +84 +84 +84 +FC +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni03F5 +ENCODING 1013 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +3C +40 +80 +F8 +80 +80 +40 +3C +ENDCHAR +STARTCHAR uni03F6 +ENCODING 1014 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +F0 +08 +04 +7C +04 +04 +08 +F0 +ENDCHAR +STARTCHAR uni03F7 +ENCODING 1015 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +80 +80 +F0 +88 +84 +84 +84 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR uni03F8 +ENCODING 1016 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +80 +80 +80 +F0 +88 +84 +84 +84 +84 +88 +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni03F9 +ENCODING 1017 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +3C +40 +80 +80 +80 +80 +80 +80 +80 +40 +3C +ENDCHAR +STARTCHAR uni03FA +ENCODING 1018 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +82 +C6 +AA +92 +82 +82 +82 +82 +82 +82 +82 +ENDCHAR +STARTCHAR uni03FB +ENCODING 1019 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 -3 +BITMAP +82 +C6 +AA +92 +82 +82 +82 +82 +80 +80 +80 +ENDCHAR +STARTCHAR uni03FC +ENCODING 1020 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 -3 +BITMAP +18 +24 +42 +42 +42 +42 +64 +58 +40 +E0 +40 +ENDCHAR +STARTCHAR uni03FD +ENCODING 1021 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +F8 +04 +04 +04 +04 +04 +04 +04 +04 +04 +F8 +ENDCHAR +STARTCHAR uni03FE +ENCODING 1022 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +7C +80 +80 +80 +80 +90 +80 +80 +80 +80 +7C +ENDCHAR +STARTCHAR uni03FF +ENCODING 1023 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +F8 +04 +04 +04 +04 +24 +04 +04 +04 +04 +F8 +ENDCHAR +STARTCHAR uni0400 +ENCODING 1024 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +40 +20 +00 +FC +80 +80 +80 +F8 +80 +80 +80 +80 +FC +ENDCHAR +STARTCHAR afii10023 +ENCODING 1025 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +48 +00 +FC +80 +80 +80 +80 +F8 +80 +80 +80 +80 +FC +ENDCHAR +STARTCHAR afii10051 +ENCODING 1026 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 0 -3 +BITMAP +F8 +20 +20 +20 +20 +3C +22 +22 +22 +22 +22 +02 +02 +1C +ENDCHAR +STARTCHAR afii10052 +ENCODING 1027 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +08 +10 +00 +FC +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10053 +ENCODING 1028 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +3C +40 +80 +80 +80 +F8 +80 +80 +80 +40 +3C +ENDCHAR +STARTCHAR afii10054 +ENCODING 1029 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +7C +80 +80 +80 +80 +78 +04 +04 +04 +04 +F8 +ENDCHAR +STARTCHAR afii10055 +ENCODING 1030 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 1 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR afii10056 +ENCODING 1031 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 13 1 0 +BITMAP +48 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR afii10057 +ENCODING 1032 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 2 0 +BITMAP +38 +10 +10 +10 +10 +10 +10 +10 +10 +10 +E0 +ENDCHAR +STARTCHAR afii10058 +ENCODING 1033 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +78 +48 +48 +48 +48 +4E +49 +49 +49 +49 +8E +ENDCHAR +STARTCHAR afii10059 +ENCODING 1034 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +88 +88 +88 +88 +88 +FE +89 +89 +89 +89 +8E +ENDCHAR +STARTCHAR afii10060 +ENCODING 1035 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +F8 +20 +20 +20 +2C +32 +22 +22 +22 +22 +22 +ENDCHAR +STARTCHAR afii10061 +ENCODING 1036 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +08 +10 +84 +88 +90 +A0 +C0 +80 +C0 +A0 +90 +88 +84 +ENDCHAR +STARTCHAR uni040D +ENCODING 1037 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +40 +20 +84 +8C +8C +94 +94 +A4 +A4 +C4 +C4 +84 +84 +ENDCHAR +STARTCHAR afii10062 +ENCODING 1038 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +48 +30 +00 +84 +84 +84 +84 +84 +84 +84 +7C +04 +04 +F8 +ENDCHAR +STARTCHAR afii10145 +ENCODING 1039 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 -2 +BITMAP +82 +82 +82 +82 +82 +82 +82 +82 +82 +82 +FE +10 +10 +ENDCHAR +STARTCHAR afii10017 +ENCODING 1040 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +10 +10 +28 +28 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR afii10018 +ENCODING 1041 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +F8 +80 +80 +80 +80 +F8 +84 +84 +84 +84 +F8 +ENDCHAR +STARTCHAR afii10019 +ENCODING 1042 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +F8 +84 +84 +84 +84 +F8 +84 +84 +84 +84 +F8 +ENDCHAR +STARTCHAR afii10020 +ENCODING 1043 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +FC +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10021 +ENCODING 1044 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 0 0 +BITMAP +3C +24 +24 +24 +24 +24 +44 +44 +44 +FE +82 +82 +ENDCHAR +STARTCHAR afii10022 +ENCODING 1045 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +FC +80 +80 +80 +80 +F8 +80 +80 +80 +80 +FC +ENDCHAR +STARTCHAR afii10024 +ENCODING 1046 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +92 +92 +54 +54 +38 +38 +38 +54 +54 +92 +92 +ENDCHAR +STARTCHAR afii10025 +ENCODING 1047 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +F8 +04 +04 +04 +04 +38 +04 +04 +04 +04 +F8 +ENDCHAR +STARTCHAR afii10026 +ENCODING 1048 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +84 +8C +8C +94 +94 +A4 +A4 +C4 +C4 +84 +84 +ENDCHAR +STARTCHAR afii10027 +ENCODING 1049 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +48 +30 +00 +84 +8C +8C +94 +94 +A4 +A4 +C4 +C4 +84 +ENDCHAR +STARTCHAR afii10028 +ENCODING 1050 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +84 +88 +90 +A0 +C0 +80 +C0 +A0 +90 +88 +84 +ENDCHAR +STARTCHAR afii10029 +ENCODING 1051 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +7E +42 +42 +42 +42 +42 +42 +42 +42 +42 +82 +ENDCHAR +STARTCHAR afii10030 +ENCODING 1052 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +82 +82 +C6 +C6 +AA +AA +92 +92 +82 +82 +82 +ENDCHAR +STARTCHAR afii10031 +ENCODING 1053 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +84 +84 +84 +84 +84 +FC +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR afii10032 +ENCODING 1054 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +78 +84 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR afii10033 +ENCODING 1055 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +FC +84 +84 +84 +84 +84 +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR afii10034 +ENCODING 1056 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +F8 +84 +84 +84 +84 +84 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10035 +ENCODING 1057 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +7C +80 +80 +80 +80 +80 +80 +80 +80 +80 +7C +ENDCHAR +STARTCHAR afii10036 +ENCODING 1058 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +FE +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR afii10037 +ENCODING 1059 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +84 +84 +84 +84 +84 +84 +84 +7C +04 +04 +78 +ENDCHAR +STARTCHAR afii10038 +ENCODING 1060 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +10 +10 +38 +54 +92 +92 +92 +92 +92 +54 +38 +10 +10 +ENDCHAR +STARTCHAR afii10039 +ENCODING 1061 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +82 +82 +44 +28 +28 +10 +28 +28 +44 +82 +82 +ENDCHAR +STARTCHAR afii10040 +ENCODING 1062 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +84 +84 +84 +84 +84 +84 +84 +84 +84 +84 +FE +02 +02 +ENDCHAR +STARTCHAR afii10041 +ENCODING 1063 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +84 +84 +84 +84 +84 +7C +04 +04 +04 +04 +04 +ENDCHAR +STARTCHAR afii10042 +ENCODING 1064 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +92 +92 +92 +92 +92 +92 +92 +92 +92 +92 +FE +ENDCHAR +STARTCHAR afii10043 +ENCODING 1065 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 -2 +BITMAP +92 +92 +92 +92 +92 +92 +92 +92 +92 +92 +FF +01 +01 +ENDCHAR +STARTCHAR afii10044 +ENCODING 1066 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +E0 +20 +20 +20 +20 +3C +22 +22 +22 +22 +3C +ENDCHAR +STARTCHAR afii10045 +ENCODING 1067 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +82 +82 +82 +82 +82 +F2 +8A +8A +8A +8A +F2 +ENDCHAR +STARTCHAR afii10046 +ENCODING 1068 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +80 +80 +80 +80 +80 +F8 +84 +84 +84 +84 +F8 +ENDCHAR +STARTCHAR afii10047 +ENCODING 1069 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +F0 +08 +04 +04 +04 +7C +04 +04 +04 +08 +F0 +ENDCHAR +STARTCHAR afii10048 +ENCODING 1070 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +9C +A2 +A2 +A2 +A2 +E2 +A2 +A2 +A2 +A2 +9C +ENDCHAR +STARTCHAR afii10049 +ENCODING 1071 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +7C +84 +84 +84 +84 +7C +0C +14 +24 +44 +84 +ENDCHAR +STARTCHAR afii10065 +ENCODING 1072 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +78 +04 +04 +7C +84 +84 +84 +7C +ENDCHAR +STARTCHAR afii10066 +ENCODING 1073 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +38 +40 +80 +80 +B0 +C8 +84 +84 +84 +48 +30 +ENDCHAR +STARTCHAR afii10067 +ENCODING 1074 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +F8 +84 +84 +F8 +84 +84 +84 +F8 +ENDCHAR +STARTCHAR afii10068 +ENCODING 1075 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +FC +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10069 +ENCODING 1076 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 10 0 -2 +BITMAP +3E +22 +22 +22 +42 +42 +82 +FF +81 +81 +ENDCHAR +STARTCHAR afii10070 +ENCODING 1077 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +78 +84 +84 +84 +FC +80 +80 +7C +ENDCHAR +STARTCHAR afii10072 +ENCODING 1078 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +92 +54 +54 +38 +38 +54 +54 +92 +ENDCHAR +STARTCHAR afii10073 +ENCODING 1079 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +F8 +04 +04 +38 +04 +04 +04 +F8 +ENDCHAR +STARTCHAR afii10074 +ENCODING 1080 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +8C +8C +94 +94 +A4 +A4 +C4 +C4 +ENDCHAR +STARTCHAR afii10075 +ENCODING 1081 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +48 +30 +00 +8C +8C +94 +94 +A4 +A4 +C4 +C4 +ENDCHAR +STARTCHAR afii10076 +ENCODING 1082 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +84 +88 +90 +A0 +E0 +90 +88 +84 +ENDCHAR +STARTCHAR afii10077 +ENCODING 1083 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +7E +42 +42 +42 +42 +42 +42 +82 +ENDCHAR +STARTCHAR afii10078 +ENCODING 1084 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +82 +C6 +C6 +AA +AA +92 +92 +82 +ENDCHAR +STARTCHAR afii10079 +ENCODING 1085 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +84 +84 +84 +FC +84 +84 +84 +84 +ENDCHAR +STARTCHAR afii10080 +ENCODING 1086 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +78 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR afii10081 +ENCODING 1087 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +FC +84 +84 +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR afii10082 +ENCODING 1088 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +F8 +84 +84 +84 +84 +84 +84 +F8 +80 +80 +80 +ENDCHAR +STARTCHAR afii10083 +ENCODING 1089 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +7C +80 +80 +80 +80 +80 +80 +7C +ENDCHAR +STARTCHAR afii10084 +ENCODING 1090 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +FE +10 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR afii10085 +ENCODING 1091 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +84 +84 +84 +84 +84 +84 +84 +7C +04 +04 +78 +ENDCHAR +STARTCHAR afii10086 +ENCODING 1092 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 0 -3 +BITMAP +10 +10 +10 +7C +92 +92 +92 +92 +92 +92 +7C +10 +10 +10 +ENDCHAR +STARTCHAR afii10087 +ENCODING 1093 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +84 +84 +48 +30 +30 +48 +84 +84 +ENDCHAR +STARTCHAR afii10088 +ENCODING 1094 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 -2 +BITMAP +84 +84 +84 +84 +84 +84 +84 +FE +02 +02 +ENDCHAR +STARTCHAR afii10089 +ENCODING 1095 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +84 +84 +84 +84 +7C +04 +04 +04 +ENDCHAR +STARTCHAR afii10090 +ENCODING 1096 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +92 +92 +92 +92 +92 +92 +92 +FE +ENDCHAR +STARTCHAR afii10091 +ENCODING 1097 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 10 0 -2 +BITMAP +92 +92 +92 +92 +92 +92 +92 +FF +01 +01 +ENDCHAR +STARTCHAR afii10092 +ENCODING 1098 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 9 0 0 +BITMAP +E0 +20 +20 +20 +3C +22 +22 +22 +3C +ENDCHAR +STARTCHAR afii10093 +ENCODING 1099 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +82 +82 +82 +F2 +8A +8A +8A +F2 +ENDCHAR +STARTCHAR afii10094 +ENCODING 1100 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +80 +80 +80 +F8 +84 +84 +84 +F8 +ENDCHAR +STARTCHAR afii10095 +ENCODING 1101 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +F0 +08 +04 +7C +04 +04 +08 +F0 +ENDCHAR +STARTCHAR afii10096 +ENCODING 1102 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +9C +A2 +A2 +E2 +A2 +A2 +A2 +9C +ENDCHAR +STARTCHAR afii10097 +ENCODING 1103 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +7C +84 +84 +84 +7C +24 +44 +84 +ENDCHAR +STARTCHAR uni0450 +ENCODING 1104 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +40 +20 +00 +00 +78 +84 +84 +84 +FC +80 +80 +7C +ENDCHAR +STARTCHAR afii10071 +ENCODING 1105 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +48 +00 +00 +78 +84 +84 +84 +FC +80 +80 +7C +ENDCHAR +STARTCHAR afii10099 +ENCODING 1106 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 0 -3 +BITMAP +40 +40 +40 +F0 +40 +40 +5C +62 +42 +42 +42 +02 +02 +04 +ENDCHAR +STARTCHAR afii10100 +ENCODING 1107 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +08 +10 +00 +00 +FC +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10101 +ENCODING 1108 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +3C +40 +80 +F8 +80 +80 +40 +3C +ENDCHAR +STARTCHAR afii10102 +ENCODING 1109 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +7C +80 +80 +60 +18 +04 +04 +F8 +ENDCHAR +STARTCHAR afii10103 +ENCODING 1110 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 2 0 +BITMAP +20 +00 +00 +E0 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR afii10104 +ENCODING 1111 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 2 0 +BITMAP +90 +00 +00 +E0 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR afii10105 +ENCODING 1112 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 14 2 -3 +BITMAP +20 +00 +00 +E0 +20 +20 +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR afii10106 +ENCODING 1113 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +78 +48 +48 +4E +49 +49 +49 +8E +ENDCHAR +STARTCHAR afii10107 +ENCODING 1114 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +88 +88 +88 +FE +89 +89 +89 +8E +ENDCHAR +STARTCHAR afii10108 +ENCODING 1115 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +20 +20 +F8 +20 +3E +21 +21 +21 +21 +21 +21 +ENDCHAR +STARTCHAR afii10109 +ENCODING 1116 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +08 +10 +00 +00 +84 +88 +90 +A0 +E0 +90 +88 +84 +ENDCHAR +STARTCHAR uni045D +ENCODING 1117 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +40 +20 +00 +00 +8C +8C +94 +94 +A4 +A4 +C4 +C4 +ENDCHAR +STARTCHAR afii10110 +ENCODING 1118 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +48 +30 +00 +84 +84 +84 +84 +84 +84 +84 +7C +04 +04 +F8 +ENDCHAR +STARTCHAR afii10193 +ENCODING 1119 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 0 -2 +BITMAP +82 +82 +82 +82 +82 +82 +82 +FE +10 +10 +ENDCHAR +STARTCHAR uni0460 +ENCODING 1120 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +44 +82 +82 +82 +92 +92 +92 +92 +92 +92 +6C +ENDCHAR +STARTCHAR uni0461 +ENCODING 1121 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +44 +82 +82 +92 +92 +92 +92 +6C +ENDCHAR +STARTCHAR afii10146 +ENCODING 1122 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +20 +F8 +20 +20 +20 +3E +21 +21 +21 +21 +3E +ENDCHAR +STARTCHAR afii10194 +ENCODING 1123 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +20 +20 +20 +20 +F8 +20 +20 +3E +21 +21 +3E +ENDCHAR +STARTCHAR uni0464 +ENCODING 1124 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +8E +90 +A0 +A0 +A0 +FC +A0 +A0 +A0 +90 +8E +ENDCHAR +STARTCHAR uni0465 +ENCODING 1125 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +9E +A0 +A0 +FC +A0 +A0 +A0 +9E +ENDCHAR +STARTCHAR uni0466 +ENCODING 1126 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +10 +10 +28 +28 +28 +44 +44 +7C +92 +92 +92 +ENDCHAR +STARTCHAR uni0467 +ENCODING 1127 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +10 +10 +28 +28 +44 +7C +92 +92 +ENDCHAR +STARTCHAR uni0468 +ENCODING 1128 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +88 +88 +88 +88 +94 +F4 +94 +BE +AA +AA +AA +ENDCHAR +STARTCHAR uni0469 +ENCODING 1129 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +88 +88 +94 +F4 +94 +BE +AA +AA +ENDCHAR +STARTCHAR uni046A +ENCODING 1130 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +FE +82 +44 +28 +10 +38 +54 +54 +92 +92 +92 +ENDCHAR +STARTCHAR uni046B +ENCODING 1131 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +FE +44 +28 +10 +38 +54 +92 +92 +ENDCHAR +STARTCHAR uni046C +ENCODING 1132 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +BE +A2 +94 +94 +E8 +9C +AA +AA +AA +AA +AA +ENDCHAR +STARTCHAR uni046D +ENCODING 1133 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +BE +A2 +94 +E8 +9C +AA +AA +AA +ENDCHAR +STARTCHAR uni046E +ENCODING 1134 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 1 -3 +BITMAP +50 +20 +00 +F8 +04 +04 +04 +78 +04 +04 +04 +04 +78 +80 +80 +78 +ENDCHAR +STARTCHAR uni046F +ENCODING 1135 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +50 +20 +00 +F8 +04 +04 +38 +04 +04 +04 +78 +80 +80 +78 +ENDCHAR +STARTCHAR uni0470 +ENCODING 1136 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +10 +92 +92 +92 +54 +54 +54 +38 +10 +10 +10 +ENDCHAR +STARTCHAR uni0471 +ENCODING 1137 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 0 -3 +BITMAP +10 +10 +92 +92 +92 +54 +54 +54 +38 +10 +10 +10 +ENDCHAR +STARTCHAR afii10147 +ENCODING 1138 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +78 +84 +84 +84 +84 +FC +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR afii10195 +ENCODING 1139 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +78 +84 +84 +FC +84 +84 +84 +78 +ENDCHAR +STARTCHAR afii10148 +ENCODING 1140 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +83 +84 +84 +44 +44 +48 +28 +28 +28 +10 +10 +ENDCHAR +STARTCHAR afii10196 +ENCODING 1141 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +83 +84 +44 +44 +28 +28 +10 +10 +ENDCHAR +STARTCHAR uni0476 +ENCODING 1142 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +48 +24 +00 +83 +84 +44 +44 +48 +28 +28 +28 +10 +10 +ENDCHAR +STARTCHAR uni0477 +ENCODING 1143 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +48 +24 +00 +83 +84 +44 +44 +28 +28 +10 +10 +ENDCHAR +STARTCHAR uni0478 +ENCODING 1144 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +60 +90 +90 +95 +95 +95 +95 +95 +95 +95 +63 +01 +01 +06 +ENDCHAR +STARTCHAR uni0479 +ENCODING 1145 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +65 +95 +95 +95 +95 +95 +95 +63 +01 +01 +06 +ENDCHAR +STARTCHAR uni047A +ENCODING 1146 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 0 -1 +BITMAP +10 +38 +54 +82 +82 +82 +82 +82 +82 +54 +38 +10 +ENDCHAR +STARTCHAR uni047B +ENCODING 1147 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 0 -1 +BITMAP +10 +38 +54 +82 +82 +82 +82 +54 +38 +10 +ENDCHAR +STARTCHAR uni047C +ENCODING 1148 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +3C +42 +18 +4A +91 +81 +81 +81 +81 +81 +81 +99 +66 +ENDCHAR +STARTCHAR uni047D +ENCODING 1149 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +3C +42 +18 +08 +10 +42 +81 +81 +81 +81 +81 +99 +66 +ENDCHAR +STARTCHAR uni047E +ENCODING 1150 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +FE +54 +00 +44 +82 +82 +82 +82 +82 +92 +92 +92 +6C +ENDCHAR +STARTCHAR uni047F +ENCODING 1151 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +FE +54 +00 +44 +82 +82 +82 +92 +92 +92 +6C +ENDCHAR +STARTCHAR uni0480 +ENCODING 1152 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +38 +44 +80 +80 +80 +80 +80 +80 +80 +40 +38 +08 +08 +08 +ENDCHAR +STARTCHAR uni0481 +ENCODING 1153 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +38 +44 +80 +80 +80 +80 +40 +38 +08 +08 +08 +ENDCHAR +STARTCHAR uni0482 +ENCODING 1154 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 -1 +BITMAP +04 +34 +08 +16 +D0 +20 +58 +40 +ENDCHAR +STARTCHAR uni048A +ENCODING 1162 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 16 1 -3 +BITMAP +48 +30 +00 +84 +8C +8C +94 +94 +A4 +A4 +C4 +C4 +84 +02 +04 +08 +ENDCHAR +STARTCHAR uni048B +ENCODING 1163 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +48 +30 +00 +8C +8C +94 +94 +A4 +A4 +C4 +C4 +02 +04 +08 +ENDCHAR +STARTCHAR uni048C +ENCODING 1164 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +40 +40 +F0 +40 +40 +7C +42 +42 +42 +42 +7C +ENDCHAR +STARTCHAR uni048D +ENCODING 1165 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +40 +F0 +40 +7C +42 +42 +42 +7C +ENDCHAR +STARTCHAR uni048E +ENCODING 1166 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +F8 +84 +84 +84 +94 +88 +F4 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni048F +ENCODING 1167 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +F8 +84 +84 +84 +84 +94 +88 +F4 +80 +80 +80 +ENDCHAR +STARTCHAR afii10050 +ENCODING 1168 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +04 +04 +FC +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii10098 +ENCODING 1169 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 0 +BITMAP +04 +04 +FC +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni0492 +ENCODING 1170 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +7E +40 +40 +40 +40 +F0 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni0493 +ENCODING 1171 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +7E +40 +40 +F0 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni0494 +ENCODING 1172 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +FC +80 +80 +80 +80 +F0 +88 +84 +84 +84 +84 +04 +08 +30 +ENDCHAR +STARTCHAR uni0495 +ENCODING 1173 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +FC +80 +80 +80 +F0 +88 +84 +84 +04 +08 +30 +ENDCHAR +STARTCHAR uni0496 +ENCODING 1174 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 0 -3 +BITMAP +92 +92 +54 +54 +38 +38 +38 +54 +54 +92 +92 +02 +02 +02 +ENDCHAR +STARTCHAR uni0497 +ENCODING 1175 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 -3 +BITMAP +92 +54 +54 +38 +38 +54 +54 +92 +02 +02 +02 +ENDCHAR +STARTCHAR uni0498 +ENCODING 1176 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +F8 +04 +04 +04 +04 +78 +04 +04 +04 +04 +F8 +10 +08 +30 +ENDCHAR +STARTCHAR uni0499 +ENCODING 1177 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +F8 +04 +04 +78 +04 +04 +04 +F8 +10 +08 +30 +ENDCHAR +STARTCHAR uni049A +ENCODING 1178 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +84 +88 +90 +A0 +C0 +80 +C0 +A0 +90 +88 +84 +04 +04 +04 +ENDCHAR +STARTCHAR uni049B +ENCODING 1179 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 -2 +BITMAP +84 +88 +90 +A0 +E0 +90 +88 +84 +04 +04 +ENDCHAR +STARTCHAR uni049C +ENCODING 1180 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +82 +84 +84 +A8 +A8 +F0 +A8 +A8 +84 +84 +82 +ENDCHAR +STARTCHAR uni049D +ENCODING 1181 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +82 +84 +A8 +B0 +F0 +A8 +A4 +82 +ENDCHAR +STARTCHAR uni049E +ENCODING 1182 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +42 +E4 +48 +50 +60 +40 +60 +50 +48 +44 +42 +ENDCHAR +STARTCHAR uni049F +ENCODING 1183 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +40 +40 +E0 +42 +44 +48 +50 +70 +48 +44 +42 +ENDCHAR +STARTCHAR uni04A0 +ENCODING 1184 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +E1 +22 +24 +28 +30 +20 +30 +28 +24 +22 +21 +ENDCHAR +STARTCHAR uni04A1 +ENCODING 1185 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +E1 +22 +24 +28 +38 +24 +22 +21 +ENDCHAR +STARTCHAR uni04A2 +ENCODING 1186 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +84 +84 +84 +84 +84 +FC +84 +84 +84 +84 +86 +02 +02 +02 +ENDCHAR +STARTCHAR uni04A3 +ENCODING 1187 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 -2 +BITMAP +84 +84 +84 +FC +84 +84 +84 +86 +02 +02 +ENDCHAR +STARTCHAR uni04A4 +ENCODING 1188 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +87 +84 +84 +84 +84 +FC +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR uni04A5 +ENCODING 1189 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +87 +84 +84 +FC +84 +84 +84 +84 +ENDCHAR +STARTCHAR uni04A6 +ENCODING 1190 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +F8 +88 +88 +88 +88 +8E +89 +89 +89 +89 +89 +01 +01 +02 +ENDCHAR +STARTCHAR uni04A7 +ENCODING 1191 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +F8 +88 +88 +88 +8E +89 +89 +89 +01 +01 +02 +ENDCHAR +STARTCHAR uni04A8 +ENCODING 1192 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +20 +40 +8C +92 +92 +92 +92 +92 +92 +4C +33 +ENDCHAR +STARTCHAR uni04A9 +ENCODING 1193 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +40 +88 +94 +94 +94 +94 +48 +36 +ENDCHAR +STARTCHAR uni04AA +ENCODING 1194 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +7C +80 +80 +80 +80 +80 +80 +80 +80 +80 +7C +10 +08 +30 +ENDCHAR +STARTCHAR uni04AB +ENCODING 1195 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +7C +80 +80 +80 +80 +80 +80 +7C +10 +08 +30 +ENDCHAR +STARTCHAR uni04AC +ENCODING 1196 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 0 -3 +BITMAP +FE +10 +10 +10 +10 +10 +10 +10 +10 +10 +18 +08 +08 +08 +ENDCHAR +STARTCHAR uni04AD +ENCODING 1197 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 0 -2 +BITMAP +FE +10 +10 +10 +10 +10 +10 +18 +08 +08 +ENDCHAR +STARTCHAR uni04AE +ENCODING 1198 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +82 +82 +44 +44 +28 +28 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni04AF +ENCODING 1199 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 -3 +BITMAP +82 +82 +44 +44 +28 +28 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni04B0 +ENCODING 1200 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +82 +82 +44 +44 +28 +28 +FE +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni04B1 +ENCODING 1201 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 -3 +BITMAP +82 +82 +44 +44 +28 +28 +10 +7C +10 +10 +10 +ENDCHAR +STARTCHAR uni04B2 +ENCODING 1202 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +82 +82 +44 +28 +28 +10 +28 +28 +44 +82 +83 +01 +01 +01 +ENDCHAR +STARTCHAR uni04B3 +ENCODING 1203 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 -2 +BITMAP +84 +84 +48 +30 +30 +48 +84 +86 +02 +02 +ENDCHAR +STARTCHAR uni04B4 +ENCODING 1204 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +FA +22 +22 +22 +22 +22 +22 +22 +22 +22 +3F +01 +01 +01 +ENDCHAR +STARTCHAR uni04B5 +ENCODING 1205 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 10 0 -2 +BITMAP +FA +22 +22 +22 +22 +22 +22 +3F +01 +01 +ENDCHAR +STARTCHAR uni04B6 +ENCODING 1206 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +84 +84 +84 +84 +84 +7C +04 +04 +04 +04 +06 +02 +02 +02 +ENDCHAR +STARTCHAR uni04B7 +ENCODING 1207 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 -2 +BITMAP +84 +84 +84 +84 +7C +04 +04 +06 +02 +02 +ENDCHAR +STARTCHAR uni04B8 +ENCODING 1208 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +84 +84 +84 +A4 +A4 +7C +24 +24 +04 +04 +04 +ENDCHAR +STARTCHAR uni04B9 +ENCODING 1209 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +84 +84 +84 +A4 +7C +24 +04 +04 +ENDCHAR +STARTCHAR uni04BA +ENCODING 1210 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +80 +80 +80 +80 +80 +F8 +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR uni04BB +ENCODING 1211 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +80 +80 +80 +F8 +84 +84 +84 +84 +ENDCHAR +STARTCHAR uni04BC +ENCODING 1212 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +1E +21 +21 +21 +A1 +7F +20 +20 +20 +20 +1F +ENDCHAR +STARTCHAR uni04BD +ENCODING 1213 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +1E +21 +21 +A1 +7F +20 +20 +1F +ENDCHAR +STARTCHAR uni04BE +ENCODING 1214 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 -2 +BITMAP +1E +21 +21 +21 +A1 +7F +20 +20 +20 +20 +1F +04 +04 +ENDCHAR +STARTCHAR uni04BF +ENCODING 1215 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 10 0 -2 +BITMAP +1E +21 +21 +A1 +7F +20 +20 +1F +04 +04 +ENDCHAR +STARTCHAR uni04C0 +ENCODING 1216 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 1 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni04C1 +ENCODING 1217 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +44 +38 +00 +92 +92 +54 +54 +38 +38 +54 +54 +92 +92 +ENDCHAR +STARTCHAR uni04C2 +ENCODING 1218 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 0 0 +BITMAP +44 +38 +00 +00 +92 +54 +54 +38 +38 +54 +54 +92 +ENDCHAR +STARTCHAR uni04C3 +ENCODING 1219 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +84 +88 +90 +A0 +C0 +80 +F8 +84 +84 +84 +84 +04 +04 +18 +ENDCHAR +STARTCHAR uni04C4 +ENCODING 1220 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +84 +88 +90 +A0 +F8 +84 +84 +84 +04 +04 +18 +ENDCHAR +STARTCHAR uni04C5 +ENCODING 1221 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +7E +42 +42 +42 +42 +42 +42 +42 +42 +42 +82 +01 +02 +04 +ENDCHAR +STARTCHAR uni04C6 +ENCODING 1222 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +7E +42 +42 +42 +42 +42 +42 +82 +01 +02 +04 +ENDCHAR +STARTCHAR uni04C7 +ENCODING 1223 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +84 +84 +84 +84 +84 +FC +84 +84 +84 +84 +84 +04 +04 +18 +ENDCHAR +STARTCHAR uni04C8 +ENCODING 1224 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +84 +84 +84 +FC +84 +84 +84 +84 +04 +04 +18 +ENDCHAR +STARTCHAR uni04C9 +ENCODING 1225 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +84 +84 +84 +84 +84 +FC +84 +84 +84 +84 +84 +02 +04 +08 +ENDCHAR +STARTCHAR uni04CA +ENCODING 1226 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +84 +84 +84 +FC +84 +84 +84 +84 +02 +04 +08 +ENDCHAR +STARTCHAR uni04CB +ENCODING 1227 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +84 +84 +84 +84 +84 +7C +04 +04 +04 +04 +0C +08 +08 +ENDCHAR +STARTCHAR uni04CC +ENCODING 1228 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 -2 +BITMAP +84 +84 +84 +84 +7C +04 +04 +0C +08 +08 +ENDCHAR +STARTCHAR uni04CD +ENCODING 1229 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +82 +82 +C6 +C6 +AA +AA +92 +92 +82 +82 +82 +01 +02 +04 +ENDCHAR +STARTCHAR uni04CE +ENCODING 1230 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +82 +C6 +C6 +AA +AA +92 +92 +82 +01 +02 +04 +ENDCHAR +STARTCHAR uni04CF +ENCODING 1231 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 10 1 0 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni04D0 +ENCODING 1232 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +48 +30 +00 +78 +84 +84 +84 +FC +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR uni04D1 +ENCODING 1233 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +48 +30 +00 +78 +04 +04 +7C +84 +84 +84 +7C +ENDCHAR +STARTCHAR uni04D2 +ENCODING 1234 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +48 +00 +78 +84 +84 +84 +84 +FC +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR uni04D3 +ENCODING 1235 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +48 +00 +00 +78 +04 +04 +7C +84 +84 +84 +7C +ENDCHAR +STARTCHAR uni04D4 +ENCODING 1236 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +7F +88 +88 +88 +88 +FF +88 +88 +88 +88 +8F +ENDCHAR +STARTCHAR uni04D5 +ENCODING 1237 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +6C +12 +12 +72 +9C +90 +90 +7E +ENDCHAR +STARTCHAR uni04D6 +ENCODING 1238 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +48 +30 +00 +FC +80 +80 +80 +F8 +80 +80 +80 +80 +FC +ENDCHAR +STARTCHAR uni04D7 +ENCODING 1239 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +48 +30 +00 +78 +84 +84 +84 +FC +80 +80 +7C +ENDCHAR +STARTCHAR uni04D8 +ENCODING 1240 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +F8 +04 +04 +04 +04 +FC +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR afii10846 +ENCODING 1241 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +F8 +04 +04 +FC +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni04DA +ENCODING 1242 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +48 +00 +F8 +04 +04 +04 +04 +FC +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni04DB +ENCODING 1243 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +48 +00 +00 +F8 +04 +04 +FC +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni04DC +ENCODING 1244 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +24 +00 +92 +92 +54 +54 +38 +38 +38 +54 +54 +92 +92 +ENDCHAR +STARTCHAR uni04DD +ENCODING 1245 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +24 +00 +00 +92 +54 +54 +38 +38 +54 +54 +92 +ENDCHAR +STARTCHAR uni04DE +ENCODING 1246 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +48 +00 +F8 +04 +04 +04 +04 +78 +04 +04 +04 +04 +F8 +ENDCHAR +STARTCHAR uni04DF +ENCODING 1247 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +48 +00 +00 +F8 +04 +04 +78 +04 +04 +04 +F8 +ENDCHAR +STARTCHAR uni04E0 +ENCODING 1248 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +FC +04 +08 +10 +30 +08 +04 +04 +04 +88 +70 +ENDCHAR +STARTCHAR uni04E1 +ENCODING 1249 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +FC +04 +08 +10 +30 +08 +04 +04 +04 +88 +70 +ENDCHAR +STARTCHAR uni04E2 +ENCODING 1250 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +78 +00 +84 +8C +8C +94 +94 +A4 +A4 +C4 +C4 +84 +84 +ENDCHAR +STARTCHAR uni04E3 +ENCODING 1251 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +78 +00 +00 +8C +8C +94 +94 +A4 +A4 +C4 +C4 +ENDCHAR +STARTCHAR uni04E4 +ENCODING 1252 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +48 +00 +84 +8C +8C +94 +94 +A4 +A4 +C4 +C4 +84 +84 +ENDCHAR +STARTCHAR uni04E5 +ENCODING 1253 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +48 +00 +00 +8C +8C +94 +94 +A4 +A4 +C4 +C4 +ENDCHAR +STARTCHAR uni04E6 +ENCODING 1254 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +48 +00 +78 +84 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni04E7 +ENCODING 1255 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +48 +00 +00 +78 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni04E8 +ENCODING 1256 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +78 +84 +84 +84 +84 +FC +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni04E9 +ENCODING 1257 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +78 +84 +84 +FC +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni04EA +ENCODING 1258 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +48 +00 +78 +84 +84 +84 +84 +FC +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni04EB +ENCODING 1259 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +48 +00 +00 +78 +84 +84 +FC +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni04EC +ENCODING 1260 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +48 +00 +F0 +08 +04 +04 +04 +7C +04 +04 +04 +08 +F0 +ENDCHAR +STARTCHAR uni04ED +ENCODING 1261 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +48 +00 +00 +F0 +08 +04 +7C +04 +04 +08 +F0 +ENDCHAR +STARTCHAR uni04EE +ENCODING 1262 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +78 +00 +84 +84 +84 +84 +84 +84 +84 +7C +04 +04 +F8 +ENDCHAR +STARTCHAR uni04EF +ENCODING 1263 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +78 +00 +00 +84 +84 +84 +84 +84 +84 +84 +7C +04 +04 +F8 +ENDCHAR +STARTCHAR uni04F0 +ENCODING 1264 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +48 +00 +84 +84 +84 +84 +84 +84 +84 +7C +04 +04 +F8 +ENDCHAR +STARTCHAR uni04F1 +ENCODING 1265 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +48 +00 +00 +84 +84 +84 +84 +84 +84 +84 +7C +04 +04 +F8 +ENDCHAR +STARTCHAR uni04F2 +ENCODING 1266 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +24 +48 +00 +84 +84 +84 +84 +84 +84 +7C +04 +04 +F8 +ENDCHAR +STARTCHAR uni04F3 +ENCODING 1267 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 15 1 -3 +BITMAP +24 +48 +00 +00 +84 +84 +84 +84 +84 +84 +84 +7C +04 +04 +F8 +ENDCHAR +STARTCHAR uni04F4 +ENCODING 1268 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +48 +00 +84 +84 +84 +84 +84 +7C +04 +04 +04 +04 +04 +ENDCHAR +STARTCHAR uni04F5 +ENCODING 1269 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +48 +00 +00 +84 +84 +84 +84 +7C +04 +04 +04 +ENDCHAR +STARTCHAR uni04F6 +ENCODING 1270 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +FC +80 +80 +80 +80 +80 +80 +80 +80 +80 +C0 +40 +40 +ENDCHAR +STARTCHAR uni04F7 +ENCODING 1271 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 -2 +BITMAP +FC +80 +80 +80 +80 +80 +80 +C0 +40 +40 +ENDCHAR +STARTCHAR uni04F8 +ENCODING 1272 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +28 +00 +82 +82 +82 +82 +82 +F2 +8A +8A +8A +8A +F2 +ENDCHAR +STARTCHAR uni04F9 +ENCODING 1273 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +28 +00 +00 +82 +82 +82 +F2 +8A +8A +8A +F2 +ENDCHAR +STARTCHAR uni04FA +ENCODING 1274 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 0 -3 +BITMAP +7E +40 +40 +40 +40 +F0 +40 +40 +40 +40 +70 +10 +10 +60 +ENDCHAR +STARTCHAR uni04FB +ENCODING 1275 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 -3 +BITMAP +7E +40 +40 +F0 +40 +40 +40 +70 +10 +10 +60 +ENDCHAR +STARTCHAR uni04FC +ENCODING 1276 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 0 -3 +BITMAP +82 +82 +44 +28 +28 +10 +28 +28 +44 +82 +82 +02 +02 +0C +ENDCHAR +STARTCHAR uni04FD +ENCODING 1277 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +84 +84 +48 +30 +30 +48 +84 +84 +04 +04 +18 +ENDCHAR +STARTCHAR uni04FE +ENCODING 1278 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +82 +82 +44 +28 +28 +FE +28 +28 +44 +82 +82 +ENDCHAR +STARTCHAR uni04FF +ENCODING 1279 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +84 +84 +48 +30 +FC +48 +84 +84 +ENDCHAR +STARTCHAR uni0500 +ENCODING 1280 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +04 +04 +04 +04 +3C +44 +84 +84 +84 +44 +3C +ENDCHAR +STARTCHAR uni0501 +ENCODING 1281 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +04 +04 +04 +7C +84 +84 +84 +7C +ENDCHAR +STARTCHAR uni0502 +ENCODING 1282 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +10 +10 +10 +12 +12 +72 +92 +92 +92 +92 +6C +ENDCHAR +STARTCHAR uni0503 +ENCODING 1283 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +10 +10 +12 +72 +92 +92 +92 +6C +ENDCHAR +STARTCHAR uni0504 +ENCODING 1284 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +E0 +10 +10 +12 +12 +62 +12 +12 +12 +12 +0C +ENDCHAR +STARTCHAR uni0505 +ENCODING 1285 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +E2 +12 +12 +62 +12 +12 +12 +0C +ENDCHAR +STARTCHAR uni0506 +ENCODING 1286 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +F8 +04 +04 +04 +04 +38 +04 +04 +04 +04 +06 +02 +02 +ENDCHAR +STARTCHAR uni0507 +ENCODING 1287 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 -2 +BITMAP +F8 +04 +04 +38 +04 +04 +04 +06 +02 +02 +ENDCHAR +STARTCHAR uni0508 +ENCODING 1288 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +78 +48 +48 +49 +49 +49 +49 +49 +49 +49 +86 +ENDCHAR +STARTCHAR uni0509 +ENCODING 1289 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +78 +48 +49 +49 +49 +49 +49 +86 +ENDCHAR +STARTCHAR uni050A +ENCODING 1290 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +88 +88 +88 +89 +89 +F9 +89 +89 +89 +89 +86 +ENDCHAR +STARTCHAR uni050B +ENCODING 1291 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +88 +88 +89 +F9 +89 +89 +89 +86 +ENDCHAR +STARTCHAR uni050C +ENCODING 1292 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +7C +80 +80 +80 +80 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni050D +ENCODING 1293 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +7C +80 +80 +80 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni050E +ENCODING 1294 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +FE +10 +10 +10 +11 +11 +11 +11 +11 +11 +0E +ENDCHAR +STARTCHAR uni050F +ENCODING 1295 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +FE +10 +10 +11 +11 +11 +11 +0E +ENDCHAR +STARTCHAR uni0510 +ENCODING 1296 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +7C +80 +80 +80 +80 +70 +80 +80 +80 +80 +7C +ENDCHAR +STARTCHAR uni0511 +ENCODING 1297 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +7C +80 +80 +70 +80 +80 +80 +7C +ENDCHAR +STARTCHAR uni0512 +ENCODING 1298 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +3F +21 +21 +21 +21 +21 +21 +21 +21 +21 +C1 +01 +01 +06 +ENDCHAR +STARTCHAR uni0513 +ENCODING 1299 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 -3 +BITMAP +7E +42 +42 +42 +42 +42 +42 +82 +02 +02 +0C +ENDCHAR +STARTCHAR uni0514 +ENCODING 1300 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +71 +51 +51 +4A +4A +44 +4A +4A +51 +51 +91 +ENDCHAR +STARTCHAR uni0515 +ENCODING 1301 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +71 +51 +4A +44 +44 +4A +51 +91 +ENDCHAR +STARTCHAR uni0516 +ENCODING 1302 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +F1 +89 +8A +8A +8C +F4 +84 +82 +82 +81 +81 +ENDCHAR +STARTCHAR uni0517 +ENCODING 1303 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +B1 +CA +8A +8C +8C +8A +CA +B1 +80 +80 +80 +ENDCHAR +STARTCHAR uni0518 +ENCODING 1304 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +7F +88 +88 +88 +88 +7F +28 +48 +48 +88 +8F +ENDCHAR +STARTCHAR uni0519 +ENCODING 1305 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +76 +89 +89 +89 +7F +28 +48 +87 +ENDCHAR +STARTCHAR uni051A +ENCODING 1306 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +78 +84 +84 +84 +84 +84 +84 +84 +94 +88 +74 +ENDCHAR +STARTCHAR uni051B +ENCODING 1307 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +7C +84 +84 +84 +84 +84 +84 +7C +04 +04 +04 +ENDCHAR +STARTCHAR uni051C +ENCODING 1308 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +82 +82 +82 +92 +92 +AA +AA +C6 +C6 +82 +82 +ENDCHAR +STARTCHAR uni051D +ENCODING 1309 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +82 +82 +92 +92 +AA +AA +44 +44 +ENDCHAR +STARTCHAR uni051E +ENCODING 1310 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +84 +A8 +90 +A8 +C0 +80 +C0 +A0 +90 +88 +84 +ENDCHAR +STARTCHAR uni051F +ENCODING 1311 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 1 0 +BITMAP +94 +88 +94 +A0 +C0 +A0 +90 +88 +84 +ENDCHAR +STARTCHAR uni0520 +ENCODING 1312 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +78 +48 +48 +48 +48 +4E +49 +49 +49 +49 +89 +01 +01 +02 +ENDCHAR +STARTCHAR uni0521 +ENCODING 1313 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +78 +48 +48 +4E +49 +49 +49 +89 +01 +01 +02 +ENDCHAR +STARTCHAR uni0522 +ENCODING 1314 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +88 +88 +88 +88 +88 +FE +89 +89 +89 +89 +89 +01 +01 +02 +ENDCHAR +STARTCHAR uni0523 +ENCODING 1315 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +88 +88 +88 +FE +89 +89 +89 +89 +01 +01 +02 +ENDCHAR +STARTCHAR uni0524 +ENCODING 1316 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +FC +84 +84 +84 +84 +84 +84 +84 +84 +84 +86 +02 +02 +ENDCHAR +STARTCHAR uni0525 +ENCODING 1317 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 -2 +BITMAP +FC +84 +84 +84 +84 +84 +84 +86 +02 +02 +ENDCHAR +STARTCHAR uni0526 +ENCODING 1318 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +80 +80 +80 +80 +80 +F8 +84 +84 +84 +84 +86 +02 +02 +ENDCHAR +STARTCHAR uni0527 +ENCODING 1319 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 -2 +BITMAP +80 +80 +80 +F8 +84 +84 +84 +86 +02 +02 +ENDCHAR +STARTCHAR uni0528 +ENCODING 1320 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +21 +21 +21 +21 +21 +3F +21 +21 +21 +21 +21 +20 +20 +C0 +ENDCHAR +STARTCHAR uni0529 +ENCODING 1321 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -3 +BITMAP +21 +21 +21 +3F +21 +21 +21 +21 +20 +20 +C0 +ENDCHAR +STARTCHAR uni052A +ENCODING 1322 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 -1 +BITMAP +75 +55 +55 +55 +56 +5C +56 +55 +95 +95 +F5 +90 +ENDCHAR +STARTCHAR uni052B +ENCODING 1323 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 -1 +BITMAP +75 +55 +55 +5E +55 +95 +95 +F5 +90 +ENDCHAR +STARTCHAR uni052C +ENCODING 1324 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 -1 +BITMAP +86 +86 +8A +8A +92 +52 +3E +22 +42 +42 +FF +81 +ENDCHAR +STARTCHAR uni052D +ENCODING 1325 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 9 1 -1 +BITMAP +8C +94 +94 +64 +3C +44 +44 +FE +82 +ENDCHAR +STARTCHAR uni052E +ENCODING 1326 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 -2 +BITMAP +7E +42 +42 +42 +42 +42 +42 +42 +42 +42 +83 +01 +01 +ENDCHAR +STARTCHAR uni052F +ENCODING 1327 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 10 0 -2 +BITMAP +7E +42 +42 +42 +42 +42 +42 +83 +01 +01 +ENDCHAR +STARTCHAR afii57407 +ENCODING 1567 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 11 1 1 +BITMAP +78 +80 +80 +80 +40 +30 +30 +00 +00 +30 +30 +ENDCHAR +STARTCHAR afii57409 +ENCODING 1569 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 4 6 2 2 +BITMAP +70 +80 +80 +80 +70 +C0 +ENDCHAR +STARTCHAR afii57410 +ENCODING 1570 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 13 2 1 +BITMAP +48 +B0 +00 +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR afii57411 +ENCODING 1571 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 4 13 2 1 +BITMAP +70 +80 +E0 +E0 +00 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR afii57412 +ENCODING 1572 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 14 1 -2 +BITMAP +38 +40 +70 +78 +00 +38 +44 +44 +44 +44 +3C +04 +F8 +F0 +ENDCHAR +STARTCHAR afii57413 +ENCODING 1573 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 4 14 2 -2 +BITMAP +40 +40 +40 +40 +40 +40 +40 +40 +00 +00 +70 +80 +E0 +E0 +ENDCHAR +STARTCHAR afii57414 +ENCODING 1574 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 12 0 1 +BITMAP +70 +80 +E0 +E0 +04 +0A +48 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR afii57415 +ENCODING 1575 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 1 11 4 1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR afii57416 +ENCODING 1576 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 6 1 1 +BITMAP +08 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR afii57417 +ENCODING 1577 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 10 1 0 +BITMAP +48 +00 +20 +70 +88 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR afii57418 +ENCODING 1578 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +48 +00 +00 +08 +84 +84 +84 +78 +38 +ENDCHAR +STARTCHAR afii57419 +ENCODING 1579 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 1 1 +BITMAP +30 +00 +00 +48 +00 +08 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR afii57420 +ENCODING 1580 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 1 -1 +BITMAP +FC +30 +00 +40 +80 +B0 +80 +80 +80 +40 +3C +ENDCHAR +STARTCHAR afii57421 +ENCODING 1581 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 1 -1 +BITMAP +FC +30 +00 +40 +80 +80 +80 +80 +80 +40 +3C +ENDCHAR +STARTCHAR afii57422 +ENCODING 1582 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 14 1 -2 +BITMAP +30 +00 +FC +FC +30 +40 +80 +80 +80 +80 +80 +40 +3C +1C +ENDCHAR +STARTCHAR afii57423 +ENCODING 1583 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 7 1 1 +BITMAP +08 +04 +04 +04 +04 +04 +F8 +ENDCHAR +STARTCHAR afii57424 +ENCODING 1584 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 10 1 0 +BITMAP +30 +00 +00 +08 +04 +04 +04 +04 +04 +F8 +ENDCHAR +STARTCHAR afii57425 +ENCODING 1585 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 7 1 1 +BITMAP +04 +04 +04 +04 +04 +08 +F0 +ENDCHAR +STARTCHAR afii57426 +ENCODING 1586 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 10 1 0 +BITMAP +04 +00 +04 +04 +04 +04 +04 +08 +08 +F0 +ENDCHAR +STARTCHAR afii57427 +ENCODING 1587 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 6 0 -1 +BITMAP +4A +8E +8E +8E +88 +70 +ENDCHAR +STARTCHAR afii57428 +ENCODING 1588 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 11 0 -1 +BITMAP +08 +02 +00 +08 +00 +4A +8E +8E +8E +88 +70 +ENDCHAR +STARTCHAR afii57429 +ENCODING 1589 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 9 7 0 -1 +BITMAP +0A00 +4D00 +8980 +8900 +8E00 +8800 +7000 +ENDCHAR +STARTCHAR afii57430 +ENCODING 1590 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 9 10 0 -2 +BITMAP +0400 +0000 +0000 +0A00 +4D80 +8980 +8E00 +8800 +8800 +7000 +ENDCHAR +STARTCHAR afii57431 +ENCODING 1591 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 11 0 1 +BITMAP +40 +40 +40 +40 +40 +40 +4C +72 +62 +62 +FE +ENDCHAR +STARTCHAR afii57432 +ENCODING 1592 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 11 0 1 +BITMAP +40 +40 +40 +40 +48 +40 +4C +72 +62 +62 +FE +ENDCHAR +STARTCHAR afii57433 +ENCODING 1593 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 1 -1 +BITMAP +70 +80 +80 +80 +78 +80 +80 +80 +80 +84 +78 +ENDCHAR +STARTCHAR afii57434 +ENCODING 1594 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 14 1 -2 +BITMAP +30 +00 +20 +60 +80 +80 +78 +80 +80 +80 +80 +84 +78 +30 +ENDCHAR +STARTCHAR afii57440 +ENCODING 1600 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 1 0 2 +BITMAP +FE +ENDCHAR +STARTCHAR afii57441 +ENCODING 1601 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 10 0 -1 +BITMAP +08 +00 +00 +08 +14 +8C +84 +84 +84 +78 +ENDCHAR +STARTCHAR afii57442 +ENCODING 1602 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 10 0 -1 +BITMAP +34 +00 +00 +08 +14 +8C +84 +84 +84 +78 +ENDCHAR +STARTCHAR afii57443 +ENCODING 1603 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 1 +BITMAP +34 +44 +24 +24 +C4 +04 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR afii57444 +ENCODING 1604 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 14 0 -2 +BITMAP +04 +04 +04 +04 +04 +04 +04 +04 +04 +44 +84 +84 +78 +30 +ENDCHAR +STARTCHAR afii57445 +ENCODING 1605 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 7 0 0 +BITMAP +38 +44 +44 +44 +98 +80 +80 +ENDCHAR +STARTCHAR afii57446 +ENCODING 1606 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 10 0 -1 +BITMAP +30 +00 +00 +08 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR afii57470 +ENCODING 1607 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 6 0 2 +BITMAP +70 +88 +84 +84 +84 +78 +ENDCHAR +STARTCHAR afii57448 +ENCODING 1608 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 7 0 0 +BITMAP +38 +44 +44 +44 +1C +04 +F8 +ENDCHAR +STARTCHAR afii57449 +ENCODING 1609 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 6 0 1 +BITMAP +04 +0A +88 +88 +84 +78 +ENDCHAR +STARTCHAR afii57450 +ENCODING 1610 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 11 0 -1 +BITMAP +04 +0A +08 +48 +84 +84 +78 +00 +00 +00 +48 +ENDCHAR +STARTCHAR afii57392 +ENCODING 1632 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 1 2 2 6 +BITMAP +80 +80 +ENDCHAR +STARTCHAR afii57393 +ENCODING 1633 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 4 11 1 1 +BITMAP +80 +80 +40 +40 +40 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR afii57394 +ENCODING 1634 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 11 1 1 +BITMAP +88 +88 +70 +60 +40 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR afii57395 +ENCODING 1635 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 1 +BITMAP +B4 +B4 +78 +78 +40 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR afii57396 +ENCODING 1636 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 1 +BITMAP +70 +80 +80 +80 +70 +80 +80 +80 +80 +84 +78 +ENDCHAR +STARTCHAR afii57397 +ENCODING 1637 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 1 +BITMAP +30 +48 +48 +48 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR afii57398 +ENCODING 1638 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 10 0 1 +BITMAP +F8 +08 +08 +08 +08 +08 +04 +04 +04 +04 +ENDCHAR +STARTCHAR afii57399 +ENCODING 1639 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 1 +BITMAP +84 +84 +48 +48 +48 +48 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR afii57400 +ENCODING 1640 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 1 +BITMAP +30 +30 +30 +30 +30 +48 +48 +48 +48 +84 +84 +ENDCHAR +STARTCHAR afii57401 +ENCODING 1641 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 10 0 1 +BITMAP +70 +88 +88 +98 +78 +08 +04 +04 +04 +04 +ENDCHAR +STARTCHAR afii57381 +ENCODING 1642 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 10 0 0 +BITMAP +84 +84 +08 +08 +30 +30 +40 +84 +84 +84 +ENDCHAR +STARTCHAR uni066B +ENCODING 1643 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 5 1 0 +BITMAP +08 +08 +10 +20 +C0 +ENDCHAR +STARTCHAR uni066C +ENCODING 1644 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 2 4 2 11 +BITMAP +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni066E +ENCODING 1646 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 5 0 1 +BITMAP +08 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni066F +ENCODING 1647 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 6 0 1 +BITMAP +08 +14 +8C +8C +84 +78 +ENDCHAR +STARTCHAR uni0FD5 +ENCODING 4053 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +8F80 +8800 +8800 +8800 +FF80 +0880 +0880 +0880 +F880 +ENDCHAR +STARTCHAR uni0FD6 +ENCODING 4054 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +F880 +0880 +0880 +0880 +FF80 +8800 +8800 +8800 +8F80 +ENDCHAR +STARTCHAR uni0FD7 +ENCODING 4055 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +8F80 +8800 +AA00 +8800 +FF80 +0880 +2A80 +0880 +F880 +ENDCHAR +STARTCHAR uni0FD8 +ENCODING 4056 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +F880 +0880 +2A80 +0880 +FF80 +8800 +AA00 +8800 +8F80 +ENDCHAR +STARTCHAR uni1DC4 +ENCODING 7620 +SWIDTH 0 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni1DC5 +ENCODING 7621 +SWIDTH 0 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni1DC6 +ENCODING 7622 +SWIDTH 0 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni1DC7 +ENCODING 7623 +SWIDTH 0 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni1DC8 +ENCODING 7624 +SWIDTH 0 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni1DC9 +ENCODING 7625 +SWIDTH 0 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni1DCA +ENCODING 7626 +SWIDTH 0 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni1DCB +ENCODING 7627 +SWIDTH 0 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni1DCC +ENCODING 7628 +SWIDTH 0 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni1DCD +ENCODING 7629 +SWIDTH 0 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni1DCE +ENCODING 7630 +SWIDTH 0 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni1DCF +ENCODING 7631 +SWIDTH 0 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni1E00 +ENCODING 7680 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +78 +84 +84 +84 +84 +FC +84 +84 +84 +84 +84 +30 +48 +30 +ENDCHAR +STARTCHAR uni1E01 +ENCODING 7681 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +78 +04 +04 +7C +84 +84 +84 +7C +30 +48 +30 +ENDCHAR +STARTCHAR uni1E02 +ENCODING 7682 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +20 +00 +F8 +84 +84 +84 +84 +F8 +84 +84 +84 +84 +F8 +ENDCHAR +STARTCHAR uni1E03 +ENCODING 7683 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +10 +00 +80 +80 +80 +F8 +84 +84 +84 +84 +84 +84 +F8 +ENDCHAR +STARTCHAR uni1E04 +ENCODING 7684 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +F8 +84 +84 +84 +84 +F8 +84 +84 +84 +84 +F8 +00 +20 +ENDCHAR +STARTCHAR uni1E05 +ENCODING 7685 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +80 +80 +80 +F8 +84 +84 +84 +84 +84 +84 +F8 +00 +10 +ENDCHAR +STARTCHAR uni1E06 +ENCODING 7686 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +F8 +84 +84 +84 +84 +F8 +84 +84 +84 +84 +F8 +00 +78 +ENDCHAR +STARTCHAR uni1E07 +ENCODING 7687 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +80 +80 +80 +F8 +84 +84 +84 +84 +84 +84 +F8 +00 +78 +ENDCHAR +STARTCHAR uni1E08 +ENCODING 7688 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 1 -3 +BITMAP +08 +10 +00 +7C +80 +80 +80 +80 +80 +80 +80 +80 +7C +10 +08 +30 +ENDCHAR +STARTCHAR uni1E09 +ENCODING 7689 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 15 1 -3 +BITMAP +08 +10 +00 +00 +7C +80 +80 +80 +80 +80 +80 +7C +10 +08 +30 +ENDCHAR +STARTCHAR uni1E0A +ENCODING 7690 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +20 +00 +F0 +88 +84 +84 +84 +84 +84 +84 +84 +88 +F0 +ENDCHAR +STARTCHAR uni1E0B +ENCODING 7691 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +20 +00 +04 +04 +04 +7C +84 +84 +84 +84 +84 +84 +7C +ENDCHAR +STARTCHAR uni1E0C +ENCODING 7692 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +F0 +88 +84 +84 +84 +84 +84 +84 +84 +88 +F0 +00 +20 +ENDCHAR +STARTCHAR uni1E0D +ENCODING 7693 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +04 +04 +04 +7C +84 +84 +84 +84 +84 +84 +7C +00 +20 +ENDCHAR +STARTCHAR uni1E0E +ENCODING 7694 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +F0 +88 +84 +84 +84 +84 +84 +84 +84 +88 +F0 +00 +78 +ENDCHAR +STARTCHAR uni1E0F +ENCODING 7695 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +04 +04 +04 +7C +84 +84 +84 +84 +84 +84 +7C +00 +78 +ENDCHAR +STARTCHAR uni1E10 +ENCODING 7696 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +F0 +88 +84 +84 +84 +84 +84 +84 +84 +88 +F0 +20 +10 +60 +ENDCHAR +STARTCHAR uni1E11 +ENCODING 7697 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +04 +04 +04 +7C +84 +84 +84 +84 +84 +84 +7C +20 +10 +60 +ENDCHAR +STARTCHAR uni1E12 +ENCODING 7698 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +F0 +88 +84 +84 +84 +84 +84 +84 +84 +88 +F0 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E13 +ENCODING 7699 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +04 +04 +04 +7C +84 +84 +84 +84 +84 +84 +7C +00 +20 +50 +ENDCHAR +STARTCHAR uni1E14 +ENCODING 7700 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +20 +10 +00 +78 +00 +FC +80 +80 +F8 +80 +80 +80 +FC +ENDCHAR +STARTCHAR uni1E15 +ENCODING 7701 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +20 +10 +00 +78 +00 +78 +84 +84 +84 +FC +80 +80 +7C +ENDCHAR +STARTCHAR uni1E16 +ENCODING 7702 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +10 +20 +00 +78 +00 +FC +80 +80 +F8 +80 +80 +80 +FC +ENDCHAR +STARTCHAR uni1E17 +ENCODING 7703 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +10 +20 +00 +78 +00 +78 +84 +84 +84 +FC +80 +80 +7C +ENDCHAR +STARTCHAR uni1E18 +ENCODING 7704 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +FC +80 +80 +80 +80 +F8 +80 +80 +80 +80 +FC +00 +20 +50 +ENDCHAR +STARTCHAR uni1E19 +ENCODING 7705 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +78 +84 +84 +84 +FC +80 +80 +7C +00 +20 +50 +ENDCHAR +STARTCHAR uni1E1A +ENCODING 7706 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +FC +80 +80 +80 +80 +F8 +80 +80 +80 +80 +FC +00 +64 +98 +ENDCHAR +STARTCHAR uni1E1B +ENCODING 7707 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +78 +84 +84 +84 +FC +80 +80 +7C +00 +64 +98 +ENDCHAR +STARTCHAR uni1E1C +ENCODING 7708 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 1 -3 +BITMAP +48 +30 +00 +FC +80 +80 +80 +F8 +80 +80 +80 +80 +FC +10 +08 +30 +ENDCHAR +STARTCHAR uni1E1D +ENCODING 7709 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +48 +30 +00 +78 +84 +84 +84 +FC +80 +80 +7C +10 +08 +30 +ENDCHAR +STARTCHAR uni1E1E +ENCODING 7710 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +20 +00 +FC +80 +80 +80 +80 +F8 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E1F +ENCODING 7711 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +10 +00 +3C +40 +40 +F8 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni1E20 +ENCODING 7712 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +78 +00 +7C +80 +80 +80 +80 +9C +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1E21 +ENCODING 7713 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +78 +00 +00 +7C +84 +84 +84 +84 +84 +84 +7C +04 +04 +78 +ENDCHAR +STARTCHAR uni1E22 +ENCODING 7714 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +20 +00 +84 +84 +84 +84 +84 +FC +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR uni1E23 +ENCODING 7715 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +20 +00 +80 +80 +80 +F8 +84 +84 +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR uni1E24 +ENCODING 7716 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +84 +84 +84 +84 +84 +FC +84 +84 +84 +84 +84 +00 +20 +ENDCHAR +STARTCHAR uni1E25 +ENCODING 7717 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +80 +80 +80 +F8 +84 +84 +84 +84 +84 +84 +84 +00 +20 +ENDCHAR +STARTCHAR uni1E26 +ENCODING 7718 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +48 +00 +84 +84 +84 +84 +84 +FC +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR uni1E27 +ENCODING 7719 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +48 +00 +80 +80 +80 +F8 +84 +84 +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR uni1E28 +ENCODING 7720 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 0 -3 +BITMAP +42 +42 +42 +42 +42 +7E +42 +42 +42 +42 +42 +40 +20 +C0 +ENDCHAR +STARTCHAR uni1E29 +ENCODING 7721 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 0 -3 +BITMAP +40 +40 +40 +7C +42 +42 +42 +42 +42 +42 +42 +40 +20 +C0 +ENDCHAR +STARTCHAR uni1E2A +ENCODING 7722 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +84 +84 +84 +84 +84 +FC +84 +84 +84 +84 +84 +00 +48 +30 +ENDCHAR +STARTCHAR uni1E2B +ENCODING 7723 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +80 +80 +80 +F8 +84 +84 +84 +84 +84 +84 +84 +00 +48 +30 +ENDCHAR +STARTCHAR uni1E2C +ENCODING 7724 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +20 +20 +F8 +00 +64 +98 +ENDCHAR +STARTCHAR uni1E2D +ENCODING 7725 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +10 +00 +00 +70 +10 +10 +10 +10 +10 +10 +7C +00 +64 +98 +ENDCHAR +STARTCHAR uni1E2E +ENCODING 7726 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 13 1 0 +BITMAP +10 +20 +88 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni1E2F +ENCODING 7727 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 13 2 0 +BITMAP +10 +10 +20 +88 +00 +E0 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni1E30 +ENCODING 7728 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +10 +20 +84 +88 +90 +A0 +C0 +80 +C0 +A0 +90 +88 +84 +ENDCHAR +STARTCHAR uni1E31 +ENCODING 7729 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +10 +20 +80 +80 +80 +84 +88 +90 +A0 +E0 +90 +88 +84 +ENDCHAR +STARTCHAR uni1E32 +ENCODING 7730 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +84 +88 +90 +A0 +C0 +80 +C0 +A0 +90 +88 +84 +00 +20 +ENDCHAR +STARTCHAR uni1E33 +ENCODING 7731 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +80 +80 +80 +84 +88 +90 +A0 +E0 +90 +88 +84 +00 +20 +ENDCHAR +STARTCHAR uni1E34 +ENCODING 7732 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +84 +88 +90 +A0 +C0 +80 +C0 +A0 +90 +88 +84 +00 +78 +ENDCHAR +STARTCHAR uni1E35 +ENCODING 7733 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +80 +80 +80 +84 +88 +90 +A0 +E0 +90 +88 +84 +00 +78 +ENDCHAR +STARTCHAR uni1E36 +ENCODING 7734 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +FC +00 +20 +ENDCHAR +STARTCHAR uni1E37 +ENCODING 7735 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 13 2 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +30 +00 +40 +ENDCHAR +STARTCHAR uni1E38 +ENCODING 7736 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 15 1 -2 +BITMAP +78 +00 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +FC +00 +20 +ENDCHAR +STARTCHAR uni1E39 +ENCODING 7737 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 15 2 -2 +BITMAP +F0 +00 +C0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +30 +00 +40 +ENDCHAR +STARTCHAR uni1E3A +ENCODING 7738 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +FC +00 +78 +ENDCHAR +STARTCHAR uni1E3B +ENCODING 7739 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 13 2 -2 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +30 +00 +F0 +ENDCHAR +STARTCHAR uni1E3C +ENCODING 7740 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +FC +00 +20 +50 +ENDCHAR +STARTCHAR uni1E3D +ENCODING 7741 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 14 2 -3 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +30 +00 +40 +A0 +ENDCHAR +STARTCHAR uni1E3E +ENCODING 7742 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +08 +10 +82 +82 +C6 +C6 +AA +AA +92 +92 +82 +82 +82 +ENDCHAR +STARTCHAR uni1E3F +ENCODING 7743 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 0 0 +BITMAP +08 +10 +00 +00 +FC +92 +92 +92 +92 +92 +92 +92 +ENDCHAR +STARTCHAR uni1E40 +ENCODING 7744 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +10 +00 +82 +82 +C6 +C6 +AA +AA +92 +92 +82 +82 +82 +ENDCHAR +STARTCHAR uni1E41 +ENCODING 7745 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +10 +00 +00 +FC +92 +92 +92 +92 +92 +92 +92 +ENDCHAR +STARTCHAR uni1E42 +ENCODING 7746 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 -2 +BITMAP +82 +82 +C6 +C6 +AA +AA +92 +92 +82 +82 +82 +00 +10 +ENDCHAR +STARTCHAR uni1E43 +ENCODING 7747 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 0 -2 +BITMAP +FC +92 +92 +92 +92 +92 +92 +92 +00 +10 +ENDCHAR +STARTCHAR uni1E44 +ENCODING 7748 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +20 +00 +84 +C4 +C4 +A4 +A4 +94 +94 +8C +8C +84 +84 +ENDCHAR +STARTCHAR uni1E45 +ENCODING 7749 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +20 +00 +00 +F8 +84 +84 +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR uni1E46 +ENCODING 7750 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +84 +C4 +C4 +A4 +A4 +94 +94 +8C +8C +84 +84 +00 +20 +ENDCHAR +STARTCHAR uni1E47 +ENCODING 7751 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 -2 +BITMAP +F8 +84 +84 +84 +84 +84 +84 +84 +00 +20 +ENDCHAR +STARTCHAR uni1E48 +ENCODING 7752 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +84 +C4 +C4 +A4 +A4 +94 +94 +8C +8C +84 +84 +00 +78 +ENDCHAR +STARTCHAR uni1E49 +ENCODING 7753 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 -2 +BITMAP +F8 +84 +84 +84 +84 +84 +84 +84 +00 +78 +ENDCHAR +STARTCHAR uni1E4A +ENCODING 7754 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +84 +C4 +C4 +A4 +A4 +94 +94 +8C +8C +84 +84 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E4B +ENCODING 7755 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +F8 +84 +84 +84 +84 +84 +84 +84 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E4C +ENCODING 7756 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 13 0 0 +BITMAP +4C80 +9300 +0000 +3C00 +4200 +4200 +4200 +4200 +4200 +4200 +4200 +4200 +3C00 +ENDCHAR +STARTCHAR uni1E4D +ENCODING 7757 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +40 +80 +32 +4C +00 +3C +42 +42 +42 +42 +42 +42 +3C +ENDCHAR +STARTCHAR uni1E4E +ENCODING 7758 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +48 +00 +64 +98 +00 +78 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1E4F +ENCODING 7759 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +48 +00 +64 +98 +00 +78 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1E50 +ENCODING 7760 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +40 +20 +78 +00 +78 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1E51 +ENCODING 7761 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +20 +10 +00 +78 +00 +78 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1E52 +ENCODING 7762 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +10 +20 +78 +00 +78 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1E53 +ENCODING 7763 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +10 +20 +00 +78 +00 +78 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1E54 +ENCODING 7764 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +10 +20 +00 +F8 +84 +84 +84 +84 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E55 +ENCODING 7765 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 15 1 -3 +BITMAP +08 +10 +00 +00 +F8 +84 +84 +84 +84 +84 +84 +F8 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E56 +ENCODING 7766 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +20 +00 +F8 +84 +84 +84 +84 +84 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E57 +ENCODING 7767 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +10 +00 +00 +F8 +84 +84 +84 +84 +84 +84 +F8 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E58 +ENCODING 7768 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +20 +00 +F8 +84 +84 +84 +84 +F8 +C0 +A0 +90 +88 +84 +ENDCHAR +STARTCHAR uni1E59 +ENCODING 7769 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +20 +00 +00 +BC +C0 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E5A +ENCODING 7770 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +F8 +84 +84 +84 +84 +F8 +C0 +A0 +90 +88 +84 +00 +20 +ENDCHAR +STARTCHAR uni1E5B +ENCODING 7771 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 -2 +BITMAP +BC +C0 +80 +80 +80 +80 +80 +80 +00 +20 +ENDCHAR +STARTCHAR uni1E5C +ENCODING 7772 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 15 1 -2 +BITMAP +78 +00 +F8 +84 +84 +84 +84 +F8 +C0 +A0 +90 +88 +84 +00 +20 +ENDCHAR +STARTCHAR uni1E5D +ENCODING 7773 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 -2 +BITMAP +78 +00 +BC +C0 +80 +80 +80 +80 +80 +80 +00 +20 +ENDCHAR +STARTCHAR uni1E5E +ENCODING 7774 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +F8 +84 +84 +84 +84 +F8 +C0 +A0 +90 +88 +84 +00 +78 +ENDCHAR +STARTCHAR uni1E5F +ENCODING 7775 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 -2 +BITMAP +BC +C0 +80 +80 +80 +80 +80 +80 +00 +78 +ENDCHAR +STARTCHAR uni1E60 +ENCODING 7776 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +20 +00 +7C +80 +80 +80 +80 +78 +04 +04 +04 +04 +F8 +ENDCHAR +STARTCHAR uni1E61 +ENCODING 7777 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +20 +00 +00 +7C +80 +80 +60 +18 +04 +04 +F8 +ENDCHAR +STARTCHAR uni1E62 +ENCODING 7778 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +7C +80 +80 +80 +80 +78 +04 +04 +04 +04 +F8 +00 +20 +ENDCHAR +STARTCHAR uni1E63 +ENCODING 7779 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 -2 +BITMAP +7C +80 +80 +60 +18 +04 +04 +F8 +00 +20 +ENDCHAR +STARTCHAR uni1E64 +ENCODING 7780 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +48 +10 +00 +7C +80 +80 +80 +78 +04 +04 +04 +04 +F8 +ENDCHAR +STARTCHAR uni1E65 +ENCODING 7781 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +08 +50 +00 +00 +7C +80 +80 +60 +18 +04 +04 +F8 +ENDCHAR +STARTCHAR uni1E66 +ENCODING 7782 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +20 +00 +50 +20 +00 +7C +80 +80 +78 +04 +04 +04 +F8 +ENDCHAR +STARTCHAR uni1E67 +ENCODING 7783 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +20 +00 +50 +20 +00 +00 +7C +80 +80 +78 +04 +04 +F8 +ENDCHAR +STARTCHAR uni1E68 +ENCODING 7784 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 15 1 -2 +BITMAP +20 +00 +7C +80 +80 +80 +80 +78 +04 +04 +04 +04 +F8 +00 +20 +ENDCHAR +STARTCHAR uni1E69 +ENCODING 7785 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +20 +00 +00 +7C +80 +80 +60 +18 +04 +04 +F8 +00 +20 +ENDCHAR +STARTCHAR uni1E6A +ENCODING 7786 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +10 +00 +FE +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni1E6B +ENCODING 7787 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +40 +00 +40 +40 +40 +F8 +40 +40 +40 +40 +40 +40 +3C +ENDCHAR +STARTCHAR uni1E6C +ENCODING 7788 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 -2 +BITMAP +FE +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +00 +10 +ENDCHAR +STARTCHAR uni1E6D +ENCODING 7789 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +40 +40 +40 +F8 +40 +40 +40 +40 +40 +40 +3C +00 +10 +ENDCHAR +STARTCHAR uni1E6E +ENCODING 7790 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 -2 +BITMAP +FE +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +00 +7C +ENDCHAR +STARTCHAR uni1E6F +ENCODING 7791 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +40 +40 +40 +F8 +40 +40 +40 +40 +40 +40 +3C +00 +78 +ENDCHAR +STARTCHAR uni1E70 +ENCODING 7792 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 0 -3 +BITMAP +FE +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +00 +10 +28 +ENDCHAR +STARTCHAR uni1E71 +ENCODING 7793 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +40 +40 +40 +F8 +40 +40 +40 +40 +40 +40 +3C +00 +20 +50 +ENDCHAR +STARTCHAR uni1E72 +ENCODING 7794 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +84 +84 +84 +84 +84 +84 +84 +84 +84 +84 +78 +00 +48 +ENDCHAR +STARTCHAR uni1E73 +ENCODING 7795 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 -2 +BITMAP +84 +84 +84 +84 +84 +84 +84 +78 +00 +48 +ENDCHAR +STARTCHAR uni1E74 +ENCODING 7796 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +84 +84 +84 +84 +84 +84 +84 +84 +84 +84 +78 +00 +64 +98 +ENDCHAR +STARTCHAR uni1E75 +ENCODING 7797 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +84 +84 +84 +84 +84 +84 +84 +78 +00 +64 +98 +ENDCHAR +STARTCHAR uni1E76 +ENCODING 7798 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +84 +84 +84 +84 +84 +84 +84 +84 +84 +84 +78 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E77 +ENCODING 7799 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +84 +84 +84 +84 +84 +84 +84 +78 +00 +20 +50 +ENDCHAR +STARTCHAR uni1E78 +ENCODING 7800 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 13 0 0 +BITMAP +4C80 +9300 +0000 +4200 +4200 +4200 +4200 +4200 +4200 +4200 +4200 +4200 +3C00 +ENDCHAR +STARTCHAR uni1E79 +ENCODING 7801 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +40 +80 +32 +4C +00 +42 +42 +42 +42 +42 +42 +42 +3C +ENDCHAR +STARTCHAR uni1E7A +ENCODING 7802 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +48 +00 +78 +00 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1E7B +ENCODING 7803 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +48 +00 +78 +00 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1E7C +ENCODING 7804 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +32 +4C +00 +82 +82 +44 +44 +44 +28 +28 +28 +10 +10 +ENDCHAR +STARTCHAR uni1E7D +ENCODING 7805 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +32 +4C +00 +82 +82 +44 +44 +28 +28 +10 +10 +ENDCHAR +STARTCHAR uni1E7E +ENCODING 7806 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 -2 +BITMAP +82 +82 +82 +44 +44 +44 +28 +28 +28 +10 +10 +00 +10 +ENDCHAR +STARTCHAR uni1E7F +ENCODING 7807 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 0 -2 +BITMAP +82 +82 +44 +44 +28 +28 +10 +10 +00 +10 +ENDCHAR +STARTCHAR Wgrave +ENCODING 7808 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +20 +10 +82 +82 +82 +92 +92 +AA +AA +C6 +C6 +82 +82 +ENDCHAR +STARTCHAR wgrave +ENCODING 7809 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 0 0 +BITMAP +20 +10 +00 +00 +82 +82 +92 +92 +AA +AA +44 +44 +ENDCHAR +STARTCHAR Wacute +ENCODING 7810 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +08 +10 +82 +82 +82 +92 +92 +AA +AA +C6 +C6 +82 +82 +ENDCHAR +STARTCHAR wacute +ENCODING 7811 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 0 0 +BITMAP +08 +10 +00 +00 +82 +82 +92 +92 +AA +AA +44 +44 +ENDCHAR +STARTCHAR Wdieresis +ENCODING 7812 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +28 +00 +82 +82 +82 +92 +92 +AA +AA +C6 +C6 +82 +82 +ENDCHAR +STARTCHAR wdieresis +ENCODING 7813 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +28 +00 +00 +82 +82 +92 +92 +AA +AA +44 +44 +ENDCHAR +STARTCHAR uni1E86 +ENCODING 7814 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +10 +00 +82 +82 +82 +92 +92 +AA +AA +C6 +C6 +82 +82 +ENDCHAR +STARTCHAR uni1E87 +ENCODING 7815 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +10 +00 +00 +82 +82 +92 +92 +AA +AA +44 +44 +ENDCHAR +STARTCHAR uni1E88 +ENCODING 7816 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 -2 +BITMAP +82 +82 +82 +92 +92 +AA +AA +C6 +C6 +82 +82 +00 +10 +ENDCHAR +STARTCHAR uni1E89 +ENCODING 7817 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 0 -2 +BITMAP +82 +82 +92 +92 +AA +AA +44 +44 +00 +10 +ENDCHAR +STARTCHAR uni1E8A +ENCODING 7818 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +10 +00 +82 +44 +44 +28 +28 +10 +28 +28 +44 +44 +82 +ENDCHAR +STARTCHAR uni1E8B +ENCODING 7819 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +20 +00 +00 +84 +84 +48 +30 +30 +48 +84 +84 +ENDCHAR +STARTCHAR uni1E8C +ENCODING 7820 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +28 +00 +82 +44 +44 +28 +28 +10 +28 +28 +44 +44 +82 +ENDCHAR +STARTCHAR uni1E8D +ENCODING 7821 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +48 +00 +00 +84 +84 +48 +30 +30 +48 +84 +84 +ENDCHAR +STARTCHAR uni1E8E +ENCODING 7822 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +10 +00 +82 +82 +44 +44 +28 +28 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni1E8F +ENCODING 7823 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +20 +00 +00 +84 +84 +84 +84 +84 +84 +84 +7C +04 +04 +78 +ENDCHAR +STARTCHAR uni1E90 +ENCODING 7824 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +20 +50 +00 +FC +08 +08 +10 +10 +20 +20 +40 +40 +FC +ENDCHAR +STARTCHAR uni1E91 +ENCODING 7825 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +20 +50 +00 +00 +FC +04 +08 +10 +20 +40 +80 +FC +ENDCHAR +STARTCHAR uni1E92 +ENCODING 7826 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +FC +04 +08 +08 +10 +10 +20 +20 +40 +40 +FC +00 +20 +ENDCHAR +STARTCHAR uni1E93 +ENCODING 7827 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 -2 +BITMAP +FC +04 +08 +10 +20 +40 +80 +FC +00 +20 +ENDCHAR +STARTCHAR uni1E94 +ENCODING 7828 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +FC +04 +08 +08 +10 +10 +20 +20 +40 +40 +FC +00 +78 +ENDCHAR +STARTCHAR uni1E95 +ENCODING 7829 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 -2 +BITMAP +FC +04 +08 +10 +20 +40 +80 +FC +00 +78 +ENDCHAR +STARTCHAR uni1E96 +ENCODING 7830 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +80 +80 +80 +F8 +84 +84 +84 +84 +84 +84 +84 +00 +78 +ENDCHAR +STARTCHAR uni1E97 +ENCODING 7831 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +90 +00 +40 +40 +40 +F8 +40 +40 +40 +40 +40 +40 +3C +ENDCHAR +STARTCHAR uni1E98 +ENCODING 7832 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 0 0 +BITMAP +10 +28 +10 +00 +82 +82 +92 +92 +AA +AA +44 +44 +ENDCHAR +STARTCHAR uni1E99 +ENCODING 7833 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 15 1 -3 +BITMAP +20 +50 +20 +00 +84 +84 +84 +84 +84 +84 +84 +7C +04 +04 +78 +ENDCHAR +STARTCHAR uni1E9A +ENCODING 7834 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +04 +02 +02 +04 +78 +04 +04 +7C +84 +84 +84 +7C +ENDCHAR +STARTCHAR uni1E9B +ENCODING 7835 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 13 3 0 +BITMAP +20 +00 +70 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni1E9C +ENCODING 7836 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +1C +20 +20 +20 +20 +38 +E0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni1E9D +ENCODING 7837 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 2 0 +BITMAP +38 +40 +E0 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni1E9E +ENCODING 7838 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +30 +48 +84 +98 +A0 +A0 +90 +88 +84 +84 +B8 +ENDCHAR +STARTCHAR uni1E9F +ENCODING 7839 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +38 +40 +40 +30 +48 +84 +84 +84 +84 +48 +30 +ENDCHAR +STARTCHAR uni1EA0 +ENCODING 7840 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +78 +84 +84 +84 +84 +FC +84 +84 +84 +84 +84 +00 +20 +ENDCHAR +STARTCHAR uni1EA1 +ENCODING 7841 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 -2 +BITMAP +78 +04 +04 +7C +84 +84 +84 +7C +00 +20 +ENDCHAR +STARTCHAR uni1EA2 +ENCODING 7842 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +C0 +20 +78 +84 +84 +84 +84 +FC +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR uni1EA3 +ENCODING 7843 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +60 +10 +20 +00 +78 +04 +04 +7C +84 +84 +84 +7C +ENDCHAR +STARTCHAR uni1EA4 +ENCODING 7844 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +22 +54 +00 +78 +84 +84 +84 +FC +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR uni1EA5 +ENCODING 7845 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +02 +24 +50 +00 +00 +78 +04 +04 +7C +84 +84 +84 +7C +ENDCHAR +STARTCHAR uni1EA6 +ENCODING 7846 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +88 +54 +00 +3C +42 +42 +42 +7E +42 +42 +42 +42 +42 +ENDCHAR +STARTCHAR uni1EA7 +ENCODING 7847 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +80 +48 +14 +00 +00 +3C +02 +02 +3E +42 +42 +42 +3E +ENDCHAR +STARTCHAR uni1EA8 +ENCODING 7848 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +24 +52 +02 +78 +84 +84 +84 +FC +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR uni1EA9 +ENCODING 7849 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +04 +22 +52 +00 +00 +78 +04 +04 +7C +84 +84 +84 +7C +ENDCHAR +STARTCHAR uni1EAA +ENCODING 7850 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +64 +98 +20 +50 +00 +78 +84 +84 +FC +84 +84 +84 +84 +ENDCHAR +STARTCHAR uni1EAB +ENCODING 7851 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +64 +98 +00 +20 +50 +00 +78 +04 +04 +7C +84 +84 +7C +ENDCHAR +STARTCHAR uni1EAC +ENCODING 7852 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 15 1 -2 +BITMAP +20 +50 +00 +78 +84 +84 +84 +FC +84 +84 +84 +84 +84 +00 +20 +ENDCHAR +STARTCHAR uni1EAD +ENCODING 7853 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -2 +BITMAP +20 +50 +00 +00 +78 +04 +04 +7C +84 +84 +84 +7C +00 +20 +ENDCHAR +STARTCHAR uni1EAE +ENCODING 7854 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +10 +20 +88 +70 +00 +78 +84 +84 +FC +84 +84 +84 +84 +ENDCHAR +STARTCHAR uni1EAF +ENCODING 7855 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +10 +20 +88 +70 +00 +78 +04 +04 +7C +84 +84 +84 +7C +ENDCHAR +STARTCHAR uni1EB0 +ENCODING 7856 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +40 +20 +88 +70 +00 +78 +84 +84 +FC +84 +84 +84 +84 +ENDCHAR +STARTCHAR uni1EB1 +ENCODING 7857 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +40 +20 +88 +70 +00 +78 +04 +04 +7C +84 +84 +84 +7C +ENDCHAR +STARTCHAR uni1EB2 +ENCODING 7858 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +C0 +20 +88 +70 +00 +78 +84 +84 +FC +84 +84 +84 +84 +ENDCHAR +STARTCHAR uni1EB3 +ENCODING 7859 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +C0 +20 +88 +70 +00 +78 +04 +04 +7C +84 +84 +84 +7C +ENDCHAR +STARTCHAR uni1EB4 +ENCODING 7860 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +64 +98 +00 +48 +30 +00 +78 +84 +84 +FC +84 +84 +84 +ENDCHAR +STARTCHAR uni1EB5 +ENCODING 7861 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +64 +98 +00 +48 +30 +00 +78 +04 +04 +7C +84 +84 +7C +ENDCHAR +STARTCHAR uni1EB6 +ENCODING 7862 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 15 1 -2 +BITMAP +88 +70 +00 +78 +84 +84 +84 +FC +84 +84 +84 +84 +84 +00 +20 +ENDCHAR +STARTCHAR uni1EB7 +ENCODING 7863 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +48 +30 +00 +78 +04 +04 +7C +84 +84 +84 +7C +00 +20 +ENDCHAR +STARTCHAR uni1EB8 +ENCODING 7864 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +FC +80 +80 +80 +80 +F8 +80 +80 +80 +80 +FC +00 +20 +ENDCHAR +STARTCHAR uni1EB9 +ENCODING 7865 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 -2 +BITMAP +78 +84 +84 +84 +FC +80 +80 +7C +00 +20 +ENDCHAR +STARTCHAR uni1EBA +ENCODING 7866 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +30 +08 +10 +FC +80 +80 +80 +F8 +80 +80 +80 +80 +FC +ENDCHAR +STARTCHAR uni1EBB +ENCODING 7867 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +30 +08 +10 +00 +78 +84 +84 +84 +FC +80 +80 +7C +ENDCHAR +STARTCHAR uni1EBC +ENCODING 7868 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +64 +98 +00 +FC +80 +80 +80 +F8 +80 +80 +80 +80 +FC +ENDCHAR +STARTCHAR uni1EBD +ENCODING 7869 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +64 +98 +00 +78 +84 +84 +84 +FC +80 +80 +7C +ENDCHAR +STARTCHAR uni1EBE +ENCODING 7870 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +22 +54 +00 +FC +80 +80 +80 +F8 +80 +80 +80 +80 +FC +ENDCHAR +STARTCHAR uni1EBF +ENCODING 7871 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +02 +24 +50 +00 +00 +78 +84 +84 +84 +FC +80 +80 +7C +ENDCHAR +STARTCHAR uni1EC0 +ENCODING 7872 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +88 +54 +00 +7E +40 +40 +40 +7C +40 +40 +40 +40 +7E +ENDCHAR +STARTCHAR uni1EC1 +ENCODING 7873 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +80 +48 +14 +00 +00 +3C +42 +42 +42 +7E +40 +40 +3E +ENDCHAR +STARTCHAR uni1EC2 +ENCODING 7874 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +24 +52 +02 +00 +FC +80 +80 +80 +F8 +80 +80 +80 +FC +ENDCHAR +STARTCHAR uni1EC3 +ENCODING 7875 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +04 +22 +52 +00 +00 +78 +84 +84 +84 +FC +80 +80 +7C +ENDCHAR +STARTCHAR uni1EC4 +ENCODING 7876 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +64 +98 +20 +50 +00 +FC +80 +80 +F8 +80 +80 +80 +FC +ENDCHAR +STARTCHAR uni1EC5 +ENCODING 7877 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +64 +98 +20 +50 +00 +00 +78 +84 +84 +FC +80 +80 +7C +ENDCHAR +STARTCHAR uni1EC6 +ENCODING 7878 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 15 1 -2 +BITMAP +20 +50 +00 +FC +80 +80 +80 +F8 +80 +80 +80 +80 +FC +00 +20 +ENDCHAR +STARTCHAR uni1EC7 +ENCODING 7879 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -2 +BITMAP +20 +50 +00 +00 +78 +84 +84 +84 +FC +80 +80 +7C +00 +20 +ENDCHAR +STARTCHAR uni1EC8 +ENCODING 7880 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 13 1 0 +BITMAP +60 +10 +20 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni1EC9 +ENCODING 7881 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 12 2 0 +BITMAP +60 +10 +20 +00 +E0 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni1ECA +ENCODING 7882 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 13 1 -2 +BITMAP +F8 +20 +20 +20 +20 +20 +20 +20 +20 +20 +F8 +00 +20 +ENDCHAR +STARTCHAR uni1ECB +ENCODING 7883 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 13 2 -2 +BITMAP +20 +00 +00 +E0 +20 +20 +20 +20 +20 +20 +F8 +00 +20 +ENDCHAR +STARTCHAR uni1ECC +ENCODING 7884 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +78 +84 +84 +84 +84 +84 +84 +84 +84 +84 +78 +00 +20 +ENDCHAR +STARTCHAR uni1ECD +ENCODING 7885 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 -2 +BITMAP +78 +84 +84 +84 +84 +84 +84 +78 +00 +20 +ENDCHAR +STARTCHAR uni1ECE +ENCODING 7886 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +60 +10 +20 +00 +78 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1ECF +ENCODING 7887 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +30 +08 +10 +00 +78 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1ED0 +ENCODING 7888 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +22 +54 +00 +78 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1ED1 +ENCODING 7889 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +02 +24 +50 +00 +78 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1ED2 +ENCODING 7890 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +88 +54 +00 +3C +42 +42 +42 +42 +42 +42 +42 +42 +3C +ENDCHAR +STARTCHAR uni1ED3 +ENCODING 7891 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 0 0 +BITMAP +80 +48 +14 +00 +3C +42 +42 +42 +42 +42 +42 +3C +ENDCHAR +STARTCHAR uni1ED4 +ENCODING 7892 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +24 +52 +02 +78 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1ED5 +ENCODING 7893 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +08 +04 +24 +50 +00 +78 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1ED6 +ENCODING 7894 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +64 +98 +20 +50 +00 +78 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1ED7 +ENCODING 7895 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +64 +98 +20 +50 +00 +78 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1ED8 +ENCODING 7896 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 15 1 -2 +BITMAP +20 +50 +00 +78 +84 +84 +84 +84 +84 +84 +84 +84 +78 +00 +20 +ENDCHAR +STARTCHAR uni1ED9 +ENCODING 7897 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +20 +50 +00 +78 +84 +84 +84 +84 +84 +84 +78 +00 +20 +ENDCHAR +STARTCHAR uni1EDA +ENCODING 7898 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +10 +20 +02 +7A +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1EDB +ENCODING 7899 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +08 +10 +00 +02 +7A +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1EDC +ENCODING 7900 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +40 +20 +02 +7A +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1EDD +ENCODING 7901 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +40 +20 +00 +02 +7A +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1EDE +ENCODING 7902 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +60 +10 +20 +02 +7A +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1EDF +ENCODING 7903 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +60 +10 +20 +02 +7A +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1EE0 +ENCODING 7904 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +64 +98 +01 +3D +42 +42 +42 +42 +42 +42 +42 +42 +3C +ENDCHAR +STARTCHAR uni1EE1 +ENCODING 7905 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +64 +99 +01 +3D +42 +42 +42 +42 +42 +42 +3C +ENDCHAR +STARTCHAR uni1EE2 +ENCODING 7906 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -2 +BITMAP +02 +7A +84 +84 +84 +84 +84 +84 +84 +84 +84 +78 +00 +20 +ENDCHAR +STARTCHAR uni1EE3 +ENCODING 7907 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -2 +BITMAP +02 +7A +84 +84 +84 +84 +84 +84 +78 +00 +20 +ENDCHAR +STARTCHAR uni1EE4 +ENCODING 7908 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +84 +84 +84 +84 +84 +84 +84 +84 +84 +84 +78 +00 +20 +ENDCHAR +STARTCHAR uni1EE5 +ENCODING 7909 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 -2 +BITMAP +84 +84 +84 +84 +84 +84 +84 +78 +00 +20 +ENDCHAR +STARTCHAR uni1EE6 +ENCODING 7910 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +60 +10 +20 +84 +84 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1EE7 +ENCODING 7911 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +60 +10 +20 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1EE8 +ENCODING 7912 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +10 +20 +01 +85 +86 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1EE9 +ENCODING 7913 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +08 +10 +00 +01 +85 +86 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1EEA +ENCODING 7914 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +20 +10 +01 +85 +86 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1EEB +ENCODING 7915 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +40 +20 +00 +01 +85 +86 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1EEC +ENCODING 7916 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +60 +10 +21 +85 +86 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1EED +ENCODING 7917 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +60 +10 +21 +85 +86 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1EEE +ENCODING 7918 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +64 +98 +01 +85 +86 +84 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1EEF +ENCODING 7919 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +64 +98 +01 +85 +86 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1EF0 +ENCODING 7920 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -2 +BITMAP +01 +85 +86 +84 +84 +84 +84 +84 +84 +84 +84 +78 +00 +20 +ENDCHAR +STARTCHAR uni1EF1 +ENCODING 7921 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 -2 +BITMAP +01 +85 +86 +84 +84 +84 +84 +84 +78 +00 +20 +ENDCHAR +STARTCHAR Ygrave +ENCODING 7922 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +20 +10 +82 +82 +44 +44 +28 +28 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR ygrave +ENCODING 7923 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 15 1 -3 +BITMAP +40 +20 +00 +00 +84 +84 +84 +84 +84 +84 +84 +7C +04 +04 +78 +ENDCHAR +STARTCHAR uni1EF4 +ENCODING 7924 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 -2 +BITMAP +82 +82 +44 +44 +28 +28 +10 +10 +10 +10 +10 +00 +10 +ENDCHAR +STARTCHAR uni1EF5 +ENCODING 7925 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +88 +88 +88 +88 +88 +88 +88 +78 +08 +08 +72 +ENDCHAR +STARTCHAR uni1EF6 +ENCODING 7926 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +30 +08 +10 +82 +82 +44 +44 +28 +28 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni1EF7 +ENCODING 7927 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 15 1 -3 +BITMAP +30 +08 +10 +00 +84 +84 +84 +84 +84 +84 +84 +7C +04 +04 +78 +ENDCHAR +STARTCHAR uni1EF8 +ENCODING 7928 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +32 +4C +00 +82 +82 +44 +44 +28 +28 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni1EF9 +ENCODING 7929 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +64 +98 +00 +84 +84 +84 +84 +84 +84 +84 +7C +04 +04 +78 +ENDCHAR +STARTCHAR uni1EFA +ENCODING 7930 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +90 +90 +90 +90 +90 +90 +90 +90 +90 +90 +FE +ENDCHAR +STARTCHAR uni1EFB +ENCODING 7931 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +48 +48 +FC +48 +48 +48 +48 +48 +48 +48 +48 +ENDCHAR +STARTCHAR uni1EFC +ENCODING 7932 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +08 +10 +20 +20 +40 +48 +84 +84 +84 +48 +30 +ENDCHAR +STARTCHAR uni1EFD +ENCODING 7933 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +10 +20 +40 +40 +98 +84 +84 +78 +ENDCHAR +STARTCHAR uni1EFE +ENCODING 7934 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +84 +84 +84 +84 +84 +84 +7C +04 +44 +A4 +78 +ENDCHAR +STARTCHAR uni1EFF +ENCODING 7935 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +84 +84 +84 +84 +84 +84 +7C +04 +44 +A4 +78 +ENDCHAR +STARTCHAR uni1F00 +ENCODING 7936 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +10 +10 +20 +00 +62 +94 +94 +88 +88 +94 +94 +62 +ENDCHAR +STARTCHAR uni1F01 +ENCODING 7937 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +20 +20 +10 +00 +62 +94 +94 +88 +88 +94 +94 +62 +ENDCHAR +STARTCHAR uni1F02 +ENCODING 7938 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +28 +24 +40 +00 +62 +94 +94 +88 +88 +94 +94 +62 +ENDCHAR +STARTCHAR uni1F03 +ENCODING 7939 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +48 +44 +20 +00 +62 +94 +94 +88 +88 +94 +94 +62 +ENDCHAR +STARTCHAR uni1F04 +ENCODING 7940 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +24 +28 +40 +00 +62 +94 +94 +88 +88 +94 +94 +62 +ENDCHAR +STARTCHAR uni1F05 +ENCODING 7941 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +44 +48 +20 +00 +62 +94 +94 +88 +88 +94 +94 +62 +ENDCHAR +STARTCHAR uni1F06 +ENCODING 7942 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +32 +4C +10 +10 +20 +00 +62 +94 +94 +88 +94 +94 +62 +ENDCHAR +STARTCHAR uni1F07 +ENCODING 7943 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +64 +98 +20 +20 +10 +00 +62 +94 +94 +88 +94 +94 +62 +ENDCHAR +STARTCHAR uni1F08 +ENCODING 7944 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +40 +40 +90 +10 +28 +28 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR uni1F09 +ENCODING 7945 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +80 +80 +50 +10 +28 +28 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR uni1F0A +ENCODING 7946 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +50 +48 +80 +10 +10 +28 +28 +28 +44 +44 +7C +82 +82 +ENDCHAR +STARTCHAR uni1F0B +ENCODING 7947 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +90 +88 +40 +10 +10 +28 +28 +28 +44 +44 +7C +82 +82 +ENDCHAR +STARTCHAR uni1F0C +ENCODING 7948 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +48 +50 +80 +10 +10 +28 +28 +28 +44 +44 +7C +82 +82 +ENDCHAR +STARTCHAR uni1F0D +ENCODING 7949 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +88 +90 +40 +10 +10 +28 +28 +28 +44 +44 +7C +82 +82 +ENDCHAR +STARTCHAR uni1F0E +ENCODING 7950 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +32 +4C +00 +48 +48 +94 +14 +14 +22 +22 +3E +41 +41 +ENDCHAR +STARTCHAR uni1F0F +ENCODING 7951 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +32 +4C +00 +88 +88 +54 +14 +14 +22 +22 +3E +41 +41 +ENDCHAR +STARTCHAR uni1F10 +ENCODING 7952 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +10 +10 +20 +00 +7C +80 +80 +78 +80 +80 +80 +7C +ENDCHAR +STARTCHAR uni1F11 +ENCODING 7953 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +20 +20 +10 +00 +7C +80 +80 +78 +80 +80 +80 +7C +ENDCHAR +STARTCHAR uni1F12 +ENCODING 7954 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +28 +24 +40 +00 +7C +80 +80 +78 +80 +80 +80 +7C +ENDCHAR +STARTCHAR uni1F13 +ENCODING 7955 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +48 +44 +20 +00 +7C +80 +80 +78 +80 +80 +80 +7C +ENDCHAR +STARTCHAR uni1F14 +ENCODING 7956 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +24 +28 +40 +00 +7C +80 +80 +78 +80 +80 +80 +7C +ENDCHAR +STARTCHAR uni1F15 +ENCODING 7957 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +24 +28 +40 +00 +7C +80 +80 +78 +80 +80 +80 +7C +ENDCHAR +STARTCHAR uni1F18 +ENCODING 7960 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +40 +40 +80 +00 +7E +40 +40 +40 +7C +40 +40 +40 +7E +ENDCHAR +STARTCHAR uni1F19 +ENCODING 7961 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +80 +80 +40 +00 +7E +40 +40 +40 +7C +40 +40 +40 +7E +ENDCHAR +STARTCHAR uni1F1A +ENCODING 7962 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +50 +48 +80 +00 +7E +40 +40 +40 +7C +40 +40 +40 +7E +ENDCHAR +STARTCHAR uni1F1B +ENCODING 7963 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +90 +88 +40 +00 +7E +40 +40 +40 +7C +40 +40 +40 +7E +ENDCHAR +STARTCHAR uni1F1C +ENCODING 7964 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +48 +50 +80 +00 +7E +40 +40 +40 +7C +40 +40 +40 +7E +ENDCHAR +STARTCHAR uni1F1D +ENCODING 7965 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +88 +90 +40 +00 +7E +40 +40 +40 +7C +40 +40 +40 +7E +ENDCHAR +STARTCHAR uni1F20 +ENCODING 7968 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 15 1 -3 +BITMAP +10 +10 +20 +00 +F8 +84 +84 +84 +84 +84 +84 +84 +04 +04 +04 +ENDCHAR +STARTCHAR uni1F21 +ENCODING 7969 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 15 1 -3 +BITMAP +20 +20 +10 +00 +F8 +84 +84 +84 +84 +84 +84 +84 +04 +04 +04 +ENDCHAR +STARTCHAR uni1F22 +ENCODING 7970 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 15 1 -3 +BITMAP +50 +48 +80 +00 +F8 +84 +84 +84 +84 +84 +84 +84 +04 +04 +04 +ENDCHAR +STARTCHAR uni1F23 +ENCODING 7971 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 15 1 -3 +BITMAP +90 +88 +40 +00 +F8 +84 +84 +84 +84 +84 +84 +84 +04 +04 +04 +ENDCHAR +STARTCHAR uni1F24 +ENCODING 7972 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 15 1 -3 +BITMAP +48 +50 +80 +00 +F8 +84 +84 +84 +84 +84 +84 +84 +04 +04 +04 +ENDCHAR +STARTCHAR uni1F25 +ENCODING 7973 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 15 1 -3 +BITMAP +88 +90 +40 +00 +F8 +84 +84 +84 +84 +84 +84 +84 +04 +04 +04 +ENDCHAR +STARTCHAR uni1F26 +ENCODING 7974 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 1 -3 +BITMAP +64 +98 +20 +20 +40 +00 +F8 +84 +84 +84 +84 +84 +84 +04 +04 +04 +ENDCHAR +STARTCHAR uni1F27 +ENCODING 7975 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 1 -3 +BITMAP +64 +98 +20 +20 +10 +00 +F8 +84 +84 +84 +84 +84 +84 +04 +04 +04 +ENDCHAR +STARTCHAR uni1F28 +ENCODING 7976 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +40 +40 +80 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +ENDCHAR +STARTCHAR uni1F29 +ENCODING 7977 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +80 +80 +40 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +ENDCHAR +STARTCHAR uni1F2A +ENCODING 7978 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +50 +48 +80 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +ENDCHAR +STARTCHAR uni1F2B +ENCODING 7979 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +90 +88 +40 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +ENDCHAR +STARTCHAR uni1F2C +ENCODING 7980 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +48 +50 +80 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +ENDCHAR +STARTCHAR uni1F2D +ENCODING 7981 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +88 +90 +40 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +ENDCHAR +STARTCHAR uni1F2E +ENCODING 7982 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +19 +26 +00 +91 +91 +51 +11 +1F +11 +11 +11 +11 +11 +ENDCHAR +STARTCHAR uni1F2F +ENCODING 7983 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +19 +26 +00 +51 +51 +91 +11 +1F +11 +11 +11 +11 +11 +ENDCHAR +STARTCHAR uni1F30 +ENCODING 7984 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 12 3 0 +BITMAP +20 +20 +40 +00 +C0 +40 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR uni1F31 +ENCODING 7985 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 12 3 0 +BITMAP +80 +80 +40 +00 +C0 +40 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR uni1F32 +ENCODING 7986 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 12 2 0 +BITMAP +50 +48 +80 +00 +60 +20 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni1F33 +ENCODING 7987 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 12 2 0 +BITMAP +90 +88 +40 +00 +60 +20 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni1F34 +ENCODING 7988 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 12 2 0 +BITMAP +48 +50 +80 +00 +60 +20 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni1F35 +ENCODING 7989 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 12 2 0 +BITMAP +88 +90 +40 +00 +60 +20 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni1F36 +ENCODING 7990 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +64 +98 +20 +20 +40 +00 +30 +10 +10 +10 +10 +10 +0C +ENDCHAR +STARTCHAR uni1F37 +ENCODING 7991 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +64 +98 +20 +20 +10 +00 +30 +10 +10 +10 +10 +10 +0C +ENDCHAR +STARTCHAR uni1F38 +ENCODING 7992 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +40 +40 +9F +04 +04 +04 +04 +04 +04 +04 +04 +04 +1F +ENDCHAR +STARTCHAR uni1F39 +ENCODING 7993 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +80 +80 +5F +04 +04 +04 +04 +04 +04 +04 +04 +04 +1F +ENDCHAR +STARTCHAR uni1F3A +ENCODING 7994 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 0 0 +BITMAP +50 +48 +80 +00 +7C +10 +10 +10 +10 +10 +10 +10 +7C +ENDCHAR +STARTCHAR uni1F3B +ENCODING 7995 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 0 0 +BITMAP +90 +88 +40 +00 +7C +10 +10 +10 +10 +10 +10 +10 +7C +ENDCHAR +STARTCHAR uni1F3C +ENCODING 7996 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 0 0 +BITMAP +48 +50 +80 +00 +7C +10 +10 +10 +10 +10 +10 +10 +7C +ENDCHAR +STARTCHAR uni1F3D +ENCODING 7997 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 0 0 +BITMAP +88 +90 +40 +00 +7C +10 +10 +10 +10 +10 +10 +10 +7C +ENDCHAR +STARTCHAR uni1F3E +ENCODING 7998 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +19 +26 +00 +9F +84 +44 +04 +04 +04 +04 +04 +04 +1F +ENDCHAR +STARTCHAR uni1F3F +ENCODING 7999 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +19 +26 +00 +9F +84 +44 +04 +04 +04 +04 +04 +04 +1F +ENDCHAR +STARTCHAR uni1F40 +ENCODING 8000 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +10 +10 +20 +00 +78 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1F41 +ENCODING 8001 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +20 +20 +10 +00 +78 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1F42 +ENCODING 8002 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +50 +48 +80 +00 +78 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1F43 +ENCODING 8003 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +90 +88 +40 +00 +78 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1F44 +ENCODING 8004 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +48 +50 +80 +00 +78 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1F45 +ENCODING 8005 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +88 +90 +40 +00 +78 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1F48 +ENCODING 8008 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +40 +40 +9E +21 +21 +21 +21 +21 +21 +21 +21 +21 +1E +ENDCHAR +STARTCHAR uni1F49 +ENCODING 8009 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +80 +80 +40 +1E +21 +21 +21 +21 +21 +21 +21 +21 +1E +ENDCHAR +STARTCHAR uni1F4A +ENCODING 8010 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +50 +48 +80 +3C +42 +42 +42 +42 +42 +42 +42 +42 +3C +ENDCHAR +STARTCHAR uni1F4B +ENCODING 8011 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +90 +88 +40 +00 +3C +42 +42 +42 +42 +42 +42 +42 +3C +ENDCHAR +STARTCHAR uni1F4C +ENCODING 8012 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +48 +50 +80 +3C +42 +42 +42 +42 +42 +42 +42 +42 +3C +ENDCHAR +STARTCHAR uni1F4D +ENCODING 8013 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +90 +88 +40 +00 +3C +42 +42 +42 +42 +42 +42 +42 +3C +ENDCHAR +STARTCHAR uni1F50 +ENCODING 8016 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +10 +10 +20 +00 +88 +84 +84 +84 +84 +84 +88 +70 +ENDCHAR +STARTCHAR uni1F51 +ENCODING 8017 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +20 +20 +10 +00 +88 +84 +84 +84 +84 +84 +88 +70 +ENDCHAR +STARTCHAR uni1F52 +ENCODING 8018 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +50 +48 +80 +00 +88 +84 +84 +84 +84 +84 +88 +70 +ENDCHAR +STARTCHAR uni1F53 +ENCODING 8019 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +90 +88 +40 +00 +88 +84 +84 +84 +84 +84 +88 +70 +ENDCHAR +STARTCHAR uni1F54 +ENCODING 8020 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +48 +50 +80 +00 +88 +84 +84 +84 +84 +84 +88 +70 +ENDCHAR +STARTCHAR uni1F55 +ENCODING 8021 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +88 +90 +40 +00 +88 +84 +84 +84 +84 +84 +88 +70 +ENDCHAR +STARTCHAR uni1F56 +ENCODING 8022 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +64 +98 +20 +20 +40 +00 +88 +84 +84 +84 +84 +88 +70 +ENDCHAR +STARTCHAR uni1F57 +ENCODING 8023 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +64 +98 +40 +40 +20 +00 +88 +84 +84 +84 +84 +88 +70 +ENDCHAR +STARTCHAR uni1F59 +ENCODING 8025 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +91 +91 +51 +11 +0A +0A +04 +04 +04 +04 +04 +ENDCHAR +STARTCHAR uni1F5B +ENCODING 8027 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +90 +88 +40 +00 +41 +41 +22 +14 +14 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni1F5D +ENCODING 8029 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +88 +90 +40 +00 +41 +41 +22 +14 +14 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni1F5F +ENCODING 8031 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +19 +26 +00 +51 +51 +91 +0A +0A +04 +04 +04 +04 +04 +ENDCHAR +STARTCHAR uni1F60 +ENCODING 8032 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 0 0 +BITMAP +08 +08 +10 +00 +44 +82 +82 +82 +92 +92 +92 +6C +ENDCHAR +STARTCHAR uni1F61 +ENCODING 8033 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 0 0 +BITMAP +20 +20 +10 +00 +44 +82 +82 +82 +92 +92 +92 +6C +ENDCHAR +STARTCHAR uni1F62 +ENCODING 8034 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 0 0 +BITMAP +28 +24 +40 +00 +44 +82 +82 +82 +92 +92 +92 +6C +ENDCHAR +STARTCHAR uni1F63 +ENCODING 8035 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 0 0 +BITMAP +48 +44 +20 +00 +44 +82 +82 +82 +92 +92 +92 +6C +ENDCHAR +STARTCHAR uni1F64 +ENCODING 8036 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 0 0 +BITMAP +24 +28 +40 +00 +44 +82 +82 +82 +92 +92 +92 +6C +ENDCHAR +STARTCHAR uni1F65 +ENCODING 8037 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 0 0 +BITMAP +44 +48 +20 +00 +44 +82 +82 +82 +92 +92 +92 +6C +ENDCHAR +STARTCHAR uni1F66 +ENCODING 8038 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +32 +4C +10 +10 +20 +00 +44 +82 +82 +92 +92 +92 +6C +ENDCHAR +STARTCHAR uni1F67 +ENCODING 8039 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +32 +4C +10 +10 +08 +00 +44 +82 +82 +92 +92 +92 +6C +ENDCHAR +STARTCHAR uni1F68 +ENCODING 8040 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +40 +40 +8C +12 +21 +21 +21 +21 +21 +21 +12 +12 +33 +ENDCHAR +STARTCHAR uni1F69 +ENCODING 8041 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +80 +80 +4C +12 +21 +21 +21 +21 +21 +21 +12 +12 +33 +ENDCHAR +STARTCHAR uni1F6A +ENCODING 8042 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +50 +48 +80 +1C +22 +41 +41 +41 +41 +41 +22 +14 +77 +ENDCHAR +STARTCHAR uni1F6B +ENCODING 8043 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +90 +88 +40 +1C +22 +41 +41 +41 +41 +41 +22 +14 +77 +ENDCHAR +STARTCHAR uni1F6C +ENCODING 8044 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +48 +50 +80 +1C +22 +41 +41 +41 +41 +41 +22 +14 +77 +ENDCHAR +STARTCHAR uni1F6D +ENCODING 8045 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +88 +90 +40 +1C +22 +41 +41 +41 +41 +41 +22 +14 +77 +ENDCHAR +STARTCHAR uni1F6E +ENCODING 8046 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +64 +98 +00 +8E +91 +51 +11 +11 +11 +11 +0A +0A +1B +ENDCHAR +STARTCHAR uni1F6F +ENCODING 8047 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +64 +98 +00 +4E +51 +91 +11 +11 +11 +11 +0A +0A +1B +ENDCHAR +STARTCHAR uni1F70 +ENCODING 8048 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +20 +20 +10 +00 +62 +94 +94 +88 +88 +94 +94 +62 +ENDCHAR +STARTCHAR uni1F71 +ENCODING 8049 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +10 +10 +20 +00 +62 +94 +94 +88 +88 +94 +94 +62 +ENDCHAR +STARTCHAR uni1F72 +ENCODING 8050 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +20 +20 +10 +00 +7C +80 +80 +78 +80 +80 +80 +7C +ENDCHAR +STARTCHAR uni1F73 +ENCODING 8051 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +10 +10 +20 +00 +7C +80 +80 +78 +80 +80 +80 +7C +ENDCHAR +STARTCHAR uni1F74 +ENCODING 8052 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 15 1 -3 +BITMAP +20 +20 +10 +00 +F8 +84 +84 +84 +84 +84 +84 +84 +04 +04 +04 +ENDCHAR +STARTCHAR uni1F75 +ENCODING 8053 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 15 1 -3 +BITMAP +10 +10 +20 +00 +F8 +84 +84 +84 +84 +84 +84 +84 +04 +04 +04 +ENDCHAR +STARTCHAR uni1F76 +ENCODING 8054 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 12 3 0 +BITMAP +80 +80 +40 +00 +C0 +40 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR uni1F77 +ENCODING 8055 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 12 3 0 +BITMAP +40 +40 +80 +00 +C0 +40 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR uni1F78 +ENCODING 8056 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +20 +20 +10 +00 +78 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1F79 +ENCODING 8057 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +10 +10 +20 +00 +78 +84 +84 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uni1F7A +ENCODING 8058 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +20 +20 +10 +00 +88 +84 +84 +84 +84 +84 +88 +70 +ENDCHAR +STARTCHAR uni1F7B +ENCODING 8059 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +10 +10 +20 +00 +88 +84 +84 +84 +84 +84 +88 +70 +ENDCHAR +STARTCHAR uni1F7C +ENCODING 8060 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 0 0 +BITMAP +20 +20 +10 +00 +44 +82 +82 +82 +92 +92 +92 +6C +ENDCHAR +STARTCHAR uni1F7D +ENCODING 8061 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 0 0 +BITMAP +10 +10 +20 +00 +44 +82 +82 +82 +92 +92 +92 +6C +ENDCHAR +STARTCHAR uni1F80 +ENCODING 8064 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +10 +10 +20 +00 +62 +94 +94 +88 +88 +94 +94 +62 +00 +20 +18 +ENDCHAR +STARTCHAR uni1F81 +ENCODING 8065 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +20 +20 +10 +00 +62 +94 +94 +88 +88 +94 +94 +62 +00 +20 +18 +ENDCHAR +STARTCHAR uni1F82 +ENCODING 8066 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +28 +24 +40 +00 +62 +94 +94 +88 +88 +94 +94 +62 +00 +20 +18 +ENDCHAR +STARTCHAR uni1F83 +ENCODING 8067 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +48 +44 +20 +00 +62 +94 +94 +88 +88 +94 +94 +62 +00 +20 +18 +ENDCHAR +STARTCHAR uni1F84 +ENCODING 8068 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +24 +28 +40 +00 +62 +94 +94 +88 +88 +94 +94 +62 +00 +20 +18 +ENDCHAR +STARTCHAR uni1F85 +ENCODING 8069 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +44 +48 +20 +00 +62 +94 +94 +88 +88 +94 +94 +62 +00 +20 +18 +ENDCHAR +STARTCHAR uni1F86 +ENCODING 8070 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 16 1 -3 +BITMAP +32 +4C +10 +10 +20 +00 +62 +94 +94 +88 +94 +94 +62 +00 +20 +18 +ENDCHAR +STARTCHAR uni1F87 +ENCODING 8071 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 16 1 -3 +BITMAP +64 +98 +20 +20 +10 +00 +62 +94 +94 +88 +94 +94 +62 +00 +20 +18 +ENDCHAR +STARTCHAR uni1F88 +ENCODING 8072 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 16 0 -3 +BITMAP +40 +40 +90 +10 +28 +28 +28 +44 +44 +7C +82 +82 +82 +00 +10 +0C +ENDCHAR +STARTCHAR uni1F89 +ENCODING 8073 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 16 0 -3 +BITMAP +80 +80 +50 +10 +28 +28 +28 +44 +44 +7C +82 +82 +82 +00 +10 +0C +ENDCHAR +STARTCHAR uni1F8A +ENCODING 8074 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 16 0 -3 +BITMAP +50 +48 +80 +10 +10 +28 +28 +28 +44 +44 +7C +82 +82 +00 +10 +0C +ENDCHAR +STARTCHAR uni1F8B +ENCODING 8075 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 16 0 -3 +BITMAP +90 +88 +40 +10 +10 +28 +28 +28 +44 +44 +7C +82 +82 +00 +10 +0C +ENDCHAR +STARTCHAR uni1F8C +ENCODING 8076 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 16 0 -3 +BITMAP +48 +50 +80 +10 +10 +28 +28 +28 +44 +44 +7C +82 +82 +00 +10 +0C +ENDCHAR +STARTCHAR uni1F8D +ENCODING 8077 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 16 0 -3 +BITMAP +88 +90 +40 +10 +10 +28 +28 +28 +44 +44 +7C +82 +82 +00 +10 +0C +ENDCHAR +STARTCHAR uni1F8E +ENCODING 8078 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +32 +4C +00 +48 +48 +94 +14 +14 +22 +22 +3E +41 +41 +00 +08 +06 +ENDCHAR +STARTCHAR uni1F8F +ENCODING 8079 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +32 +4C +00 +88 +88 +54 +14 +14 +22 +22 +3E +41 +41 +00 +08 +06 +ENDCHAR +STARTCHAR uni1F90 +ENCODING 8080 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 15 1 -3 +BITMAP +10 +10 +20 +00 +F8 +84 +84 +84 +84 +84 +84 +84 +04 +84 +64 +ENDCHAR +STARTCHAR uni1F91 +ENCODING 8081 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 15 1 -3 +BITMAP +20 +20 +10 +00 +F8 +84 +84 +84 +84 +84 +84 +84 +04 +84 +64 +ENDCHAR +STARTCHAR uni1F92 +ENCODING 8082 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 15 1 -3 +BITMAP +50 +48 +80 +00 +F8 +84 +84 +84 +84 +84 +84 +84 +04 +84 +64 +ENDCHAR +STARTCHAR uni1F93 +ENCODING 8083 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 15 1 -3 +BITMAP +90 +88 +40 +00 +F8 +84 +84 +84 +84 +84 +84 +84 +04 +84 +64 +ENDCHAR +STARTCHAR uni1F94 +ENCODING 8084 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 15 1 -3 +BITMAP +48 +50 +80 +00 +F8 +84 +84 +84 +84 +84 +84 +84 +04 +84 +64 +ENDCHAR +STARTCHAR uni1F95 +ENCODING 8085 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 15 1 -3 +BITMAP +88 +90 +40 +00 +F8 +84 +84 +84 +84 +84 +84 +84 +04 +84 +64 +ENDCHAR +STARTCHAR uni1F96 +ENCODING 8086 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 1 -3 +BITMAP +64 +98 +20 +20 +40 +00 +F8 +84 +84 +84 +84 +84 +84 +04 +84 +64 +ENDCHAR +STARTCHAR uni1F97 +ENCODING 8087 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 1 -3 +BITMAP +64 +98 +20 +20 +10 +00 +F8 +84 +84 +84 +84 +84 +84 +04 +84 +64 +ENDCHAR +STARTCHAR uni1F98 +ENCODING 8088 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 16 0 -3 +BITMAP +40 +40 +80 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +00 +10 +0C +ENDCHAR +STARTCHAR uni1F99 +ENCODING 8089 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 16 0 -3 +BITMAP +80 +80 +40 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +00 +10 +0C +ENDCHAR +STARTCHAR uni1F9A +ENCODING 8090 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 16 0 -3 +BITMAP +50 +48 +80 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +00 +10 +0C +ENDCHAR +STARTCHAR uni1F9B +ENCODING 8091 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 16 0 -3 +BITMAP +90 +88 +40 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +00 +10 +0C +ENDCHAR +STARTCHAR uni1F9C +ENCODING 8092 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 16 0 -3 +BITMAP +48 +50 +80 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +00 +10 +0C +ENDCHAR +STARTCHAR uni1F9D +ENCODING 8093 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 16 0 -3 +BITMAP +88 +90 +40 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +00 +10 +0C +ENDCHAR +STARTCHAR uni1F9E +ENCODING 8094 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +19 +26 +00 +91 +91 +51 +11 +1F +11 +11 +11 +11 +11 +00 +04 +03 +ENDCHAR +STARTCHAR uni1F9F +ENCODING 8095 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +19 +26 +00 +51 +51 +91 +11 +1F +11 +11 +11 +11 +11 +00 +04 +03 +ENDCHAR +STARTCHAR uni1FA0 +ENCODING 8096 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 0 -3 +BITMAP +08 +08 +10 +00 +44 +82 +82 +82 +92 +92 +92 +6C +00 +10 +0C +ENDCHAR +STARTCHAR uni1FA1 +ENCODING 8097 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 0 -3 +BITMAP +20 +20 +10 +00 +44 +82 +82 +82 +92 +92 +92 +6C +00 +10 +0C +ENDCHAR +STARTCHAR uni1FA2 +ENCODING 8098 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 0 -3 +BITMAP +28 +24 +40 +00 +44 +82 +82 +82 +92 +92 +92 +6C +00 +10 +0C +ENDCHAR +STARTCHAR uni1FA3 +ENCODING 8099 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 0 -3 +BITMAP +48 +44 +20 +00 +44 +82 +82 +82 +92 +92 +92 +6C +00 +10 +0C +ENDCHAR +STARTCHAR uni1FA4 +ENCODING 8100 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 0 -3 +BITMAP +24 +28 +40 +00 +44 +82 +82 +82 +92 +92 +92 +6C +00 +10 +0C +ENDCHAR +STARTCHAR uni1FA5 +ENCODING 8101 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 0 -3 +BITMAP +44 +48 +20 +00 +44 +82 +82 +82 +92 +92 +92 +6C +00 +10 +0C +ENDCHAR +STARTCHAR uni1FA6 +ENCODING 8102 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 16 0 -3 +BITMAP +32 +4C +10 +10 +20 +00 +44 +82 +82 +92 +92 +92 +6C +00 +10 +0C +ENDCHAR +STARTCHAR uni1FA7 +ENCODING 8103 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 16 0 -3 +BITMAP +32 +4C +10 +10 +08 +00 +44 +82 +82 +92 +92 +92 +6C +00 +10 +0C +ENDCHAR +STARTCHAR uni1FA8 +ENCODING 8104 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +40 +40 +8C +12 +21 +21 +21 +21 +21 +21 +12 +12 +33 +00 +08 +06 +ENDCHAR +STARTCHAR uni1FA9 +ENCODING 8105 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +80 +80 +4C +12 +21 +21 +21 +21 +21 +21 +12 +12 +33 +00 +08 +06 +ENDCHAR +STARTCHAR uni1FAA +ENCODING 8106 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +50 +48 +80 +1C +22 +41 +41 +41 +41 +41 +22 +14 +77 +00 +08 +06 +ENDCHAR +STARTCHAR uni1FAB +ENCODING 8107 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +90 +88 +40 +1C +22 +41 +41 +41 +41 +41 +22 +14 +77 +00 +08 +06 +ENDCHAR +STARTCHAR uni1FAC +ENCODING 8108 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +48 +50 +80 +1C +22 +41 +41 +41 +41 +41 +22 +14 +77 +00 +08 +06 +ENDCHAR +STARTCHAR uni1FAD +ENCODING 8109 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +88 +90 +40 +1C +22 +41 +41 +41 +41 +41 +22 +14 +77 +00 +08 +06 +ENDCHAR +STARTCHAR uni1FAE +ENCODING 8110 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +64 +98 +00 +8E +91 +51 +11 +11 +11 +11 +0A +0A +1B +00 +04 +03 +ENDCHAR +STARTCHAR uni1FAF +ENCODING 8111 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +64 +98 +00 +4E +51 +91 +11 +11 +11 +11 +0A +0A +1B +00 +04 +03 +ENDCHAR +STARTCHAR uni1FB0 +ENCODING 8112 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +44 +38 +00 +62 +94 +94 +88 +88 +94 +94 +62 +ENDCHAR +STARTCHAR uni1FB1 +ENCODING 8113 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +7C +00 +62 +94 +94 +88 +88 +94 +94 +62 +ENDCHAR +STARTCHAR uni1FB2 +ENCODING 8114 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +20 +20 +10 +00 +62 +94 +94 +88 +88 +94 +94 +62 +00 +20 +18 +ENDCHAR +STARTCHAR uni1FB3 +ENCODING 8115 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 -3 +BITMAP +62 +94 +94 +88 +88 +94 +94 +62 +00 +20 +18 +ENDCHAR +STARTCHAR uni1FB4 +ENCODING 8116 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +10 +10 +20 +00 +62 +94 +94 +88 +88 +94 +94 +62 +00 +20 +18 +ENDCHAR +STARTCHAR uni1FB6 +ENCODING 8118 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +64 +98 +00 +62 +94 +94 +88 +88 +94 +94 +62 +ENDCHAR +STARTCHAR uni1FB7 +ENCODING 8119 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 1 -3 +BITMAP +64 +98 +00 +62 +94 +94 +88 +88 +94 +94 +62 +00 +20 +18 +ENDCHAR +STARTCHAR uni1FB8 +ENCODING 8120 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +44 +38 +00 +10 +10 +28 +28 +28 +44 +44 +7C +82 +82 +ENDCHAR +STARTCHAR uni1FB9 +ENCODING 8121 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +7C +00 +10 +10 +28 +28 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR uni1FBA +ENCODING 8122 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +80 +80 +50 +10 +28 +28 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR uni1FBB +ENCODING 8123 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +40 +40 +90 +10 +28 +28 +28 +44 +44 +7C +82 +82 +82 +ENDCHAR +STARTCHAR uni1FBC +ENCODING 8124 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 0 -3 +BITMAP +10 +10 +28 +28 +28 +44 +44 +7C +82 +82 +82 +00 +10 +0C +ENDCHAR +STARTCHAR uni1FBD +ENCODING 8125 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 3 3 9 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR uni1FBE +ENCODING 8126 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 2 3 -3 +BITMAP +80 +60 +ENDCHAR +STARTCHAR uni1FBF +ENCODING 8127 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 3 3 9 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR uni1FC0 +ENCODING 8128 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 2 1 10 +BITMAP +64 +98 +ENDCHAR +STARTCHAR uni1FC1 +ENCODING 8129 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 4 1 9 +BITMAP +64 +98 +00 +48 +ENDCHAR +STARTCHAR uni1FC2 +ENCODING 8130 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 15 1 -3 +BITMAP +20 +20 +10 +00 +F8 +84 +84 +84 +84 +84 +84 +84 +04 +84 +64 +ENDCHAR +STARTCHAR uni1FC3 +ENCODING 8131 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 -3 +BITMAP +F8 +84 +84 +84 +84 +84 +84 +84 +04 +84 +64 +ENDCHAR +STARTCHAR uni1FC4 +ENCODING 8132 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 15 1 -3 +BITMAP +10 +10 +20 +00 +F8 +84 +84 +84 +84 +84 +84 +84 +04 +84 +64 +ENDCHAR +STARTCHAR uni1FC6 +ENCODING 8134 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +64 +98 +00 +F8 +84 +84 +84 +84 +84 +84 +84 +04 +04 +04 +ENDCHAR +STARTCHAR uni1FC7 +ENCODING 8135 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +64 +98 +00 +F8 +84 +84 +84 +84 +84 +84 +84 +04 +84 +64 +ENDCHAR +STARTCHAR uni1FC8 +ENCODING 8136 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +80 +40 +00 +7E +40 +40 +40 +7C +40 +40 +40 +40 +7E +ENDCHAR +STARTCHAR uni1FC9 +ENCODING 8137 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +40 +80 +00 +7E +40 +40 +40 +7C +40 +40 +40 +40 +7E +ENDCHAR +STARTCHAR uni1FCA +ENCODING 8138 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +80 +40 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +42 +ENDCHAR +STARTCHAR uni1FCB +ENCODING 8139 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +40 +80 +00 +42 +42 +42 +42 +7E +42 +42 +42 +42 +42 +ENDCHAR +STARTCHAR uni1FCC +ENCODING 8140 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +84 +84 +84 +84 +84 +FC +84 +84 +84 +84 +84 +00 +20 +18 +ENDCHAR +STARTCHAR uni1FCD +ENCODING 8141 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 3 1 9 +BITMAP +50 +48 +80 +ENDCHAR +STARTCHAR uni1FCE +ENCODING 8142 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 3 1 9 +BITMAP +48 +50 +80 +ENDCHAR +STARTCHAR uni1FCF +ENCODING 8143 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 5 1 8 +BITMAP +64 +98 +20 +20 +40 +ENDCHAR +STARTCHAR uni1FD0 +ENCODING 8144 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 2 0 +BITMAP +90 +60 +00 +60 +20 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni1FD1 +ENCODING 8145 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 10 2 0 +BITMAP +F0 +00 +60 +20 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni1FD2 +ENCODING 8146 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 12 2 0 +BITMAP +40 +20 +88 +00 +60 +20 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni1FD3 +ENCODING 8147 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 12 2 0 +BITMAP +10 +20 +88 +00 +60 +20 +20 +20 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni1FD6 +ENCODING 8150 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +64 +98 +00 +30 +10 +10 +10 +10 +10 +10 +0C +ENDCHAR +STARTCHAR uni1FD7 +ENCODING 8151 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +64 +98 +00 +48 +00 +30 +10 +10 +10 +10 +10 +10 +0C +ENDCHAR +STARTCHAR uni1FD8 +ENCODING 8152 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 13 1 0 +BITMAP +88 +70 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni1FD9 +ENCODING 8153 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 13 1 0 +BITMAP +F8 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni1FDA +ENCODING 8154 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 13 1 0 +BITMAP +40 +20 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni1FDB +ENCODING 8155 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 13 1 0 +BITMAP +10 +20 +00 +F8 +20 +20 +20 +20 +20 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni1FDD +ENCODING 8157 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 3 1 9 +BITMAP +90 +88 +40 +ENDCHAR +STARTCHAR uni1FDE +ENCODING 8158 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 3 1 9 +BITMAP +88 +90 +40 +ENDCHAR +STARTCHAR uni1FDF +ENCODING 8159 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 5 1 8 +BITMAP +64 +98 +20 +20 +10 +ENDCHAR +STARTCHAR uni1FE0 +ENCODING 8160 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +48 +30 +00 +88 +84 +84 +84 +84 +84 +88 +70 +ENDCHAR +STARTCHAR uni1FE1 +ENCODING 8161 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 0 +BITMAP +78 +00 +88 +84 +84 +84 +84 +84 +88 +70 +ENDCHAR +STARTCHAR uni1FE2 +ENCODING 8162 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +40 +20 +88 +00 +88 +84 +84 +84 +84 +84 +88 +70 +ENDCHAR +STARTCHAR uni1FE3 +ENCODING 8163 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +10 +20 +88 +00 +88 +84 +84 +84 +84 +84 +88 +70 +ENDCHAR +STARTCHAR uni1FE4 +ENCODING 8164 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 15 1 -3 +BITMAP +10 +10 +20 +00 +30 +48 +84 +84 +84 +84 +C8 +B0 +80 +80 +80 +ENDCHAR +STARTCHAR uni1FE5 +ENCODING 8165 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 15 1 -3 +BITMAP +40 +40 +20 +00 +30 +48 +84 +84 +84 +84 +C8 +B0 +80 +80 +80 +ENDCHAR +STARTCHAR uni1FE6 +ENCODING 8166 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +64 +98 +00 +88 +84 +84 +84 +84 +84 +88 +70 +ENDCHAR +STARTCHAR uni1FE7 +ENCODING 8167 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +64 +98 +00 +48 +00 +88 +84 +84 +84 +84 +84 +88 +70 +ENDCHAR +STARTCHAR uni1FE8 +ENCODING 8168 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +44 +38 +82 +82 +44 +44 +28 +28 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni1FE9 +ENCODING 8169 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +7C +00 +82 +82 +44 +44 +28 +28 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni1FEA +ENCODING 8170 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +80 +40 +00 +82 +82 +44 +44 +28 +28 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni1FEB +ENCODING 8171 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +40 +80 +00 +82 +82 +44 +44 +28 +28 +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni1FEC +ENCODING 8172 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +80 +9E +51 +11 +11 +11 +11 +1E +10 +10 +10 +10 +ENDCHAR +STARTCHAR uni1FED +ENCODING 8173 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 4 2 9 +BITMAP +40 +20 +00 +90 +ENDCHAR +STARTCHAR uni1FEE +ENCODING 8174 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 4 2 9 +BITMAP +20 +40 +00 +90 +ENDCHAR +STARTCHAR uni1FEF +ENCODING 8175 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 2 3 10 +BITMAP +80 +40 +ENDCHAR +STARTCHAR uni1FF2 +ENCODING 8178 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 0 -3 +BITMAP +20 +10 +00 +44 +82 +82 +82 +92 +92 +92 +6C +00 +10 +0C +ENDCHAR +STARTCHAR uni1FF3 +ENCODING 8179 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 -3 +BITMAP +44 +82 +82 +82 +92 +92 +92 +6C +00 +10 +0C +ENDCHAR +STARTCHAR uni1FF4 +ENCODING 8180 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 0 -3 +BITMAP +08 +10 +00 +44 +82 +82 +82 +92 +92 +92 +6C +00 +10 +0C +ENDCHAR +STARTCHAR uni1FF6 +ENCODING 8182 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +64 +98 +00 +44 +82 +82 +82 +92 +92 +92 +6C +ENDCHAR +STARTCHAR uni1FF7 +ENCODING 8183 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 0 -3 +BITMAP +64 +98 +00 +44 +82 +82 +82 +92 +92 +92 +6C +00 +10 +0C +ENDCHAR +STARTCHAR uni1FF8 +ENCODING 8184 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +80 +40 +00 +3C +42 +42 +42 +42 +42 +42 +42 +42 +3C +ENDCHAR +STARTCHAR uni1FF9 +ENCODING 8185 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +40 +80 +3C +42 +42 +42 +42 +42 +42 +42 +42 +42 +3C +ENDCHAR +STARTCHAR uni1FFA +ENCODING 8186 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +80 +40 +00 +38 +44 +82 +82 +82 +82 +82 +44 +28 +EE +ENDCHAR +STARTCHAR uni1FFB +ENCODING 8187 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 0 0 +BITMAP +40 +80 +38 +44 +82 +82 +82 +82 +82 +82 +44 +28 +EE +ENDCHAR +STARTCHAR uni1FFC +ENCODING 8188 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 0 -3 +BITMAP +38 +44 +82 +82 +82 +82 +82 +82 +44 +28 +EE +00 +10 +0C +ENDCHAR +STARTCHAR uni1FFD +ENCODING 8189 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 3 2 9 +BITMAP +40 +40 +80 +ENDCHAR +STARTCHAR uni1FFE +ENCODING 8190 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 3 3 9 +BITMAP +80 +80 +40 +ENDCHAR +STARTCHAR uni2000 +ENCODING 8192 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 8 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2001 +ENCODING 8193 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 8 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2002 +ENCODING 8194 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 8 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2003 +ENCODING 8195 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 8 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2004 +ENCODING 8196 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 8 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2005 +ENCODING 8197 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 8 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2006 +ENCODING 8198 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 8 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2007 +ENCODING 8199 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 8 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2008 +ENCODING 8200 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 8 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2009 +ENCODING 8201 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 8 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni200A +ENCODING 8202 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 8 -2 +BITMAP +00 +ENDCHAR +STARTCHAR uni2010 +ENCODING 8208 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 1 2 5 +BITMAP +F0 +ENDCHAR +STARTCHAR uni2011 +ENCODING 8209 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 1 2 5 +BITMAP +F0 +ENDCHAR +STARTCHAR figuredash +ENCODING 8210 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 1 1 5 +BITMAP +F8 +ENDCHAR +STARTCHAR endash +ENCODING 8211 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 1 1 5 +BITMAP +F8 +ENDCHAR +STARTCHAR emdash +ENCODING 8212 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 1 0 5 +BITMAP +FE +ENDCHAR +STARTCHAR afii00208 +ENCODING 8213 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 1 0 5 +BITMAP +FE +ENDCHAR +STARTCHAR uni2016 +ENCODING 8214 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 14 2 -3 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR underscoredbl +ENCODING 8215 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 3 0 -3 +BITMAP +FF +00 +FF +ENDCHAR +STARTCHAR quoteleft +ENCODING 8216 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 4 3 9 +BITMAP +40 +80 +C0 +C0 +ENDCHAR +STARTCHAR quoteright +ENCODING 8217 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 4 3 9 +BITMAP +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR quotesinglbase +ENCODING 8218 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 4 3 -2 +BITMAP +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR quotereversed +ENCODING 8219 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 4 3 9 +BITMAP +C0 +C0 +80 +40 +ENDCHAR +STARTCHAR quotedblleft +ENCODING 8220 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 4 2 9 +BITMAP +48 +90 +D8 +D8 +ENDCHAR +STARTCHAR quotedblright +ENCODING 8221 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 4 1 9 +BITMAP +D8 +D8 +48 +90 +ENDCHAR +STARTCHAR quotedblbase +ENCODING 8222 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 4 1 -2 +BITMAP +D8 +D8 +48 +90 +ENDCHAR +STARTCHAR uni201F +ENCODING 8223 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 4 2 9 +BITMAP +D8 +D8 +90 +48 +ENDCHAR +STARTCHAR dagger +ENCODING 8224 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +10 +10 +10 +FE +10 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR daggerdbl +ENCODING 8225 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 14 0 -3 +BITMAP +10 +10 +10 +FE +10 +10 +10 +10 +10 +10 +FE +10 +10 +10 +ENDCHAR +STARTCHAR bullet +ENCODING 8226 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 4 2 3 +BITMAP +60 +F0 +F0 +60 +ENDCHAR +STARTCHAR uni2023 +ENCODING 8227 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 5 1 3 +BITMAP +C0 +F0 +FC +F0 +C0 +ENDCHAR +STARTCHAR onedotenleader +ENCODING 8228 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 2 3 0 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR twodotenleader +ENCODING 8229 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 2 2 0 +BITMAP +D8 +D8 +ENDCHAR +STARTCHAR ellipsis +ENCODING 8230 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 2 0 0 +BITMAP +DB +DB +ENDCHAR +STARTCHAR uni2027 +ENCODING 8231 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 2 3 3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR perthousand +ENCODING 8240 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +40 +A0 +A1 +42 +04 +08 +10 +20 +4A +95 +15 +0A +ENDCHAR +STARTCHAR uni2031 +ENCODING 8241 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +41 +A2 +A4 +48 +10 +20 +40 +80 +2A +55 +55 +2A +ENDCHAR +STARTCHAR minute +ENCODING 8242 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 3 4 9 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR second +ENCODING 8243 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 3 2 8 +BITMAP +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni2034 +ENCODING 8244 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 3 1 8 +BITMAP +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2035 +ENCODING 8245 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 3 3 9 +BITMAP +80 +80 +40 +ENDCHAR +STARTCHAR uni2036 +ENCODING 8246 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 3 2 9 +BITMAP +90 +90 +48 +ENDCHAR +STARTCHAR uni2037 +ENCODING 8247 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 3 1 9 +BITMAP +A8 +A8 +54 +ENDCHAR +STARTCHAR uni2038 +ENCODING 8248 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 3 1 -3 +BITMAP +20 +50 +88 +ENDCHAR +STARTCHAR guilsinglleft +ENCODING 8249 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 5 3 1 +BITMAP +20 +40 +80 +40 +20 +ENDCHAR +STARTCHAR guilsinglright +ENCODING 8250 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 5 2 1 +BITMAP +80 +40 +20 +40 +80 +ENDCHAR +STARTCHAR uni203B +ENCODING 8251 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 2 +BITMAP +92 +44 +28 +92 +28 +44 +92 +ENDCHAR +STARTCHAR exclamdbl +ENCODING 8252 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 11 2 0 +BITMAP +90 +90 +90 +90 +90 +90 +90 +90 +00 +90 +90 +ENDCHAR +STARTCHAR uni203D +ENCODING 8253 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +78 +A4 +24 +24 +28 +30 +20 +20 +00 +20 +20 +ENDCHAR +STARTCHAR uni203E +ENCODING 8254 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 1 0 12 +BITMAP +FF +ENDCHAR +STARTCHAR uni203F +ENCODING 8255 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 3 0 -3 +BITMAP +81 +42 +3C +ENDCHAR +STARTCHAR uni2040 +ENCODING 8256 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 3 0 8 +BITMAP +3C +42 +81 +ENDCHAR +STARTCHAR uni2043 +ENCODING 8259 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 3 2 4 +BITMAP +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni2047 +ENCODING 8263 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +66 +99 +11 +11 +22 +44 +44 +44 +00 +44 +44 +ENDCHAR +STARTCHAR uni2048 +ENCODING 8264 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +72 +8A +0A +0A +12 +22 +22 +22 +00 +22 +22 +ENDCHAR +STARTCHAR uni2049 +ENCODING 8265 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +9C +A2 +82 +82 +84 +88 +88 +88 +00 +88 +88 +ENDCHAR +STARTCHAR uni204A +ENCODING 8266 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni204B +ENCODING 8267 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +F8 +BC +BC +BC +BC +BC +B8 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni204C +ENCODING 8268 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 0 2 +BITMAP +7E +FA +FA +FA +7E +ENDCHAR +STARTCHAR uni204D +ENCODING 8269 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 0 2 +BITMAP +FC +BE +BE +BE +FC +ENDCHAR +STARTCHAR uni204E +ENCODING 8270 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 5 2 -3 +BITMAP +20 +A8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni204F +ENCODING 8271 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 9 3 -2 +BITMAP +C0 +C0 +00 +00 +00 +C0 +C0 +80 +40 +ENDCHAR +STARTCHAR uni2050 +ENCODING 8272 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2051 +ENCODING 8273 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 13 2 -3 +BITMAP +20 +A8 +70 +A8 +20 +00 +00 +00 +20 +A8 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2052 +ENCODING 8274 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2053 +ENCODING 8275 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2054 +ENCODING 8276 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2055 +ENCODING 8277 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 1 1 +BITMAP +10 +54 +38 +FE +38 +54 +10 +ENDCHAR +STARTCHAR uni205F +ENCODING 8287 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2060 +ENCODING 8288 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2061 +ENCODING 8289 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2062 +ENCODING 8290 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2063 +ENCODING 8291 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2064 +ENCODING 8292 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2065 +ENCODING 8293 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2066 +ENCODING 8294 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2067 +ENCODING 8295 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2068 +ENCODING 8296 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2069 +ENCODING 8297 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni206A +ENCODING 8298 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni206B +ENCODING 8299 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni206C +ENCODING 8300 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni206D +ENCODING 8301 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni206E +ENCODING 8302 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni206F +ENCODING 8303 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2070 +ENCODING 8304 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 6 2 6 +BITMAP +60 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uni2071 +ENCODING 8305 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 7 2 6 +BITMAP +40 +00 +C0 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni2072 +ENCODING 8306 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2073 +ENCODING 8307 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2074 +ENCODING 8308 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 6 2 6 +BITMAP +60 +60 +A0 +A0 +F0 +20 +ENDCHAR +STARTCHAR uni2075 +ENCODING 8309 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 6 2 6 +BITMAP +F0 +80 +E0 +10 +10 +E0 +ENDCHAR +STARTCHAR uni2076 +ENCODING 8310 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 6 2 6 +BITMAP +60 +80 +E0 +90 +90 +60 +ENDCHAR +STARTCHAR uni2077 +ENCODING 8311 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 6 2 6 +BITMAP +F0 +10 +20 +20 +40 +40 +ENDCHAR +STARTCHAR uni2078 +ENCODING 8312 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 6 2 6 +BITMAP +60 +90 +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni2079 +ENCODING 8313 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 6 2 6 +BITMAP +60 +90 +90 +70 +10 +60 +ENDCHAR +STARTCHAR uni207A +ENCODING 8314 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 3 2 8 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR uni207B +ENCODING 8315 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 1 2 9 +BITMAP +E0 +ENDCHAR +STARTCHAR uni207C +ENCODING 8316 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 3 2 8 +BITMAP +E0 +00 +E0 +ENDCHAR +STARTCHAR uni207D +ENCODING 8317 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 6 3 6 +BITMAP +40 +80 +80 +80 +80 +40 +ENDCHAR +STARTCHAR uni207E +ENCODING 8318 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 6 2 6 +BITMAP +80 +40 +40 +40 +40 +80 +ENDCHAR +STARTCHAR uni207F +ENCODING 8319 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 5 2 6 +BITMAP +E0 +90 +90 +90 +90 +ENDCHAR +STARTCHAR uni2080 +ENCODING 8320 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 6 2 -3 +BITMAP +60 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uni2081 +ENCODING 8321 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 6 2 -3 +BITMAP +20 +60 +A0 +20 +20 +20 +ENDCHAR +STARTCHAR uni2082 +ENCODING 8322 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 6 2 -3 +BITMAP +E0 +10 +10 +20 +40 +F0 +ENDCHAR +STARTCHAR uni2083 +ENCODING 8323 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 6 2 -3 +BITMAP +E0 +10 +60 +10 +10 +E0 +ENDCHAR +STARTCHAR uni2084 +ENCODING 8324 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 6 2 -3 +BITMAP +60 +60 +A0 +A0 +F0 +20 +ENDCHAR +STARTCHAR uni2085 +ENCODING 8325 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 6 2 -3 +BITMAP +F0 +80 +E0 +10 +10 +E0 +ENDCHAR +STARTCHAR uni2086 +ENCODING 8326 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 6 2 -3 +BITMAP +60 +80 +E0 +90 +90 +60 +ENDCHAR +STARTCHAR uni2087 +ENCODING 8327 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 6 2 -3 +BITMAP +F0 +10 +20 +20 +40 +40 +ENDCHAR +STARTCHAR uni2088 +ENCODING 8328 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 6 2 -3 +BITMAP +60 +90 +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni2089 +ENCODING 8329 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 6 2 -3 +BITMAP +60 +90 +90 +70 +10 +60 +ENDCHAR +STARTCHAR uni208A +ENCODING 8330 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 3 2 -2 +BITMAP +40 +E0 +40 +ENDCHAR +STARTCHAR uni208B +ENCODING 8331 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 1 2 -2 +BITMAP +E0 +ENDCHAR +STARTCHAR uni208C +ENCODING 8332 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 3 2 -2 +BITMAP +E0 +00 +E0 +ENDCHAR +STARTCHAR uni208D +ENCODING 8333 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 6 3 -3 +BITMAP +40 +80 +80 +80 +80 +40 +ENDCHAR +STARTCHAR uni208E +ENCODING 8334 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 6 2 -3 +BITMAP +80 +40 +40 +40 +40 +80 +ENDCHAR +STARTCHAR uni2090 +ENCODING 8336 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 6 2 -3 +BITMAP +60 +10 +70 +90 +90 +70 +ENDCHAR +STARTCHAR uni2091 +ENCODING 8337 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 6 2 -3 +BITMAP +60 +90 +90 +F0 +80 +70 +ENDCHAR +STARTCHAR uni2092 +ENCODING 8338 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 6 2 -3 +BITMAP +60 +90 +90 +90 +90 +60 +ENDCHAR +STARTCHAR uni2093 +ENCODING 8339 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 6 2 -3 +BITMAP +88 +50 +20 +20 +50 +88 +ENDCHAR +STARTCHAR uni2094 +ENCODING 8340 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 6 2 -3 +BITMAP +E0 +10 +F0 +90 +90 +60 +ENDCHAR +STARTCHAR uni2095 +ENCODING 8341 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 8 2 -3 +BITMAP +80 +80 +80 +E0 +90 +90 +90 +90 +ENDCHAR +STARTCHAR uni2096 +ENCODING 8342 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 8 2 -3 +BITMAP +80 +80 +90 +A0 +C0 +C0 +A0 +90 +ENDCHAR +STARTCHAR uni2097 +ENCODING 8343 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 8 2 -3 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +E0 +ENDCHAR +STARTCHAR uni2098 +ENCODING 8344 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 6 1 -3 +BITMAP +F0 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2099 +ENCODING 8345 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 6 2 -3 +BITMAP +E0 +90 +90 +90 +90 +90 +ENDCHAR +STARTCHAR uni209A +ENCODING 8346 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 6 2 -3 +BITMAP +E0 +90 +90 +90 +E0 +80 +ENDCHAR +STARTCHAR uni209B +ENCODING 8347 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 6 2 -3 +BITMAP +70 +80 +60 +10 +10 +E0 +ENDCHAR +STARTCHAR uni209C +ENCODING 8348 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 8 2 -3 +BITMAP +40 +40 +E0 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR uni20A0 +ENCODING 8352 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +78 +80 +80 +8F +88 +88 +8F +78 +08 +08 +0F +ENDCHAR +STARTCHAR colonmonetary +ENCODING 8353 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 -1 +BITMAP +28 +7C +A8 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +7C +28 +ENDCHAR +STARTCHAR uni20A2 +ENCODING 8354 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +7C +80 +80 +80 +AC +B0 +A0 +A0 +A0 +A0 +7C +ENDCHAR +STARTCHAR franc +ENCODING 8355 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +7E +40 +40 +40 +40 +7C +40 +40 +F0 +40 +40 +ENDCHAR +STARTCHAR lira +ENCODING 8356 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +1C +20 +40 +40 +F0 +40 +F0 +40 +40 +40 +FC +ENDCHAR +STARTCHAR uni20A5 +ENCODING 8357 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 8 0 0 +BITMAP +7E00 +4900 +4980 +4F00 +7900 +C900 +4900 +4900 +ENDCHAR +STARTCHAR uni20A6 +ENCODING 8358 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +42 +62 +62 +52 +FF +4A +FF +46 +46 +42 +42 +ENDCHAR +STARTCHAR peseta +ENCODING 8359 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +E4 +94 +94 +9E +94 +94 +E4 +84 +84 +84 +83 +ENDCHAR +STARTCHAR uni20A8 +ENCODING 8360 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +E0 +90 +90 +97 +98 +E8 +A6 +A1 +91 +91 +8E +ENDCHAR +STARTCHAR uni20A9 +ENCODING 8361 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +82 +82 +82 +92 +FE +AA +FE +C6 +C6 +82 +82 +ENDCHAR +STARTCHAR afii57636 +ENCODING 8362 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +F2 +8A +AA +AA +AA +AA +A2 +9E +ENDCHAR +STARTCHAR dong +ENCODING 8363 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 -2 +BITMAP +04 +1E +04 +7C +84 +84 +84 +84 +84 +84 +7C +00 +FC +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 1 0 +BITMAP +3C +40 +40 +F8 +40 +F8 +40 +40 +3C +ENDCHAR +STARTCHAR uni20AD +ENCODING 8365 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +42 +44 +48 +50 +60 +FE +60 +50 +48 +44 +42 +ENDCHAR +STARTCHAR uni20AE +ENCODING 8366 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +FE +10 +10 +10 +1C +70 +1C +70 +10 +10 +10 +ENDCHAR +STARTCHAR uni20AF +ENCODING 8367 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +F0 +48 +48 +48 +48 +48 +4A +4D +4D +4D +BE +04 +04 +04 +ENDCHAR +STARTCHAR uni20BD +ENCODING 8381 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +7C +42 +42 +42 +42 +FC +40 +F0 +40 +40 +40 +ENDCHAR +STARTCHAR uni20D0 +ENCODING 8400 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni20D9 +ENCODING 8409 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 1 1 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2102 +ENCODING 8450 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +7E +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +7E +ENDCHAR +STARTCHAR uni2103 +ENCODING 8451 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +40 +AF +B0 +50 +10 +10 +10 +10 +10 +10 +10 +0F +ENDCHAR +STARTCHAR afii61248 +ENCODING 8453 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +70 +80 +81 +82 +74 +08 +10 +26 +49 +89 +09 +06 +ENDCHAR +STARTCHAR uni2106 +ENCODING 8454 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +70 +80 +81 +82 +74 +08 +10 +29 +49 +89 +09 +06 +ENDCHAR +STARTCHAR uni2107 +ENCODING 8455 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +3C +40 +80 +80 +40 +38 +40 +80 +80 +40 +3C +ENDCHAR +STARTCHAR uni2109 +ENCODING 8457 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +40 +AF +A8 +48 +08 +08 +0F +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni210D +ENCODING 8461 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +E2 +A2 +A2 +A2 +A2 +BE +A2 +A2 +A2 +A2 +E2 +ENDCHAR +STARTCHAR uni210E +ENCODING 8462 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +80 +80 +80 +F8 +84 +84 +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR uni210F +ENCODING 8463 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +40 +F0 +40 +40 +7C +42 +42 +42 +42 +42 +42 +ENDCHAR +STARTCHAR uni2115 +ENCODING 8469 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +C4 +A4 +A4 +D4 +D4 +AC +AC +94 +94 +8C +8C +ENDCHAR +STARTCHAR afii61352 +ENCODING 8470 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +8B +8B +C8 +CB +A8 +A8 +A8 +98 +98 +88 +88 +ENDCHAR +STARTCHAR uni2117 +ENCODING 8471 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 10 0 1 +BITMAP +3C +42 +B9 +A5 +A5 +B9 +A1 +A1 +42 +3C +ENDCHAR +STARTCHAR uni2119 +ENCODING 8473 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +FC +A2 +A2 +A2 +A2 +A2 +BC +A0 +A0 +A0 +E0 +ENDCHAR +STARTCHAR uni211A +ENCODING 8474 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +7C +A2 +A2 +A2 +A2 +A2 +A2 +A2 +AA +A4 +7A +ENDCHAR +STARTCHAR uni211D +ENCODING 8477 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +FC +A2 +A2 +A2 +A2 +BC +B0 +A8 +A4 +A2 +E2 +ENDCHAR +STARTCHAR uni2120 +ENCODING 8480 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 6 +BITMAP +71 +9B +55 +31 +D1 +ENDCHAR +STARTCHAR trademark +ENCODING 8482 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 6 +BITMAP +F1 +5B +55 +51 +51 +ENDCHAR +STARTCHAR uni2124 +ENCODING 8484 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +FE +0A +0A +14 +14 +28 +28 +50 +50 +A0 +FE +ENDCHAR +STARTCHAR uni2126 +ENCODING 8486 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +38 +44 +82 +82 +82 +82 +82 +82 +44 +28 +EE +ENDCHAR +STARTCHAR uni2127 +ENCODING 8487 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +EE +28 +44 +82 +82 +82 +82 +82 +82 +44 +38 +ENDCHAR +STARTCHAR uni212A +ENCODING 8490 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +84 +88 +90 +A0 +C0 +80 +C0 +A0 +90 +88 +84 +ENDCHAR +STARTCHAR uni212B +ENCODING 8491 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 0 +BITMAP +30 +48 +30 +00 +78 +84 +84 +84 +FC +84 +84 +84 +84 +ENDCHAR +STARTCHAR uni213E +ENCODING 8510 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +FE +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +E0 +ENDCHAR +STARTCHAR uni213F +ENCODING 8511 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +FE +A2 +A2 +A2 +A2 +A2 +A2 +A2 +A2 +A2 +E2 +ENDCHAR +STARTCHAR uni2140 +ENCODING 8512 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +FE +A0 +50 +28 +28 +14 +28 +28 +50 +A0 +FE +ENDCHAR +STARTCHAR uni2145 +ENCODING 8517 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +F8 +A4 +A2 +A2 +A2 +A2 +A2 +A2 +A2 +A4 +F8 +ENDCHAR +STARTCHAR uni2146 +ENCODING 8518 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +0E +0A +0A +3A +4A +8A +8A +8A +8A +4A +3E +ENDCHAR +STARTCHAR uni2147 +ENCODING 8519 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +7C +A2 +A2 +BE +A0 +A0 +A0 +7E +ENDCHAR +STARTCHAR uni2148 +ENCODING 8520 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 11 2 0 +BITMAP +40 +00 +00 +E0 +A0 +A0 +A0 +A0 +A0 +A0 +E0 +ENDCHAR +STARTCHAR uni2149 +ENCODING 8521 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +08 +00 +00 +3C +14 +14 +14 +14 +14 +14 +14 +14 +14 +F8 +ENDCHAR +STARTCHAR uni2150 +ENCODING 8528 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +20 +60 +20 +20 +21 +22 +04 +08 +10 +20 +4F +81 +02 +02 +04 +04 +ENDCHAR +STARTCHAR uni2151 +ENCODING 8529 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +20 +60 +20 +20 +21 +22 +04 +08 +10 +20 +46 +89 +09 +07 +01 +06 +ENDCHAR +STARTCHAR uni2152 +ENCODING 8530 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +20 +60 +20 +20 +21 +22 +04 +08 +10 +20 +52 +B5 +15 +15 +15 +12 +ENDCHAR +STARTCHAR onethird +ENCODING 8531 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +20 +60 +20 +20 +21 +22 +04 +08 +10 +20 +4E +81 +06 +01 +01 +0E +ENDCHAR +STARTCHAR twothirds +ENCODING 8532 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +E0 +10 +10 +20 +41 +F2 +04 +08 +10 +20 +4E +81 +06 +01 +01 +0E +ENDCHAR +STARTCHAR uni2155 +ENCODING 8533 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +20 +60 +20 +20 +21 +22 +04 +08 +10 +20 +4F +88 +0E +01 +01 +0E +ENDCHAR +STARTCHAR uni2156 +ENCODING 8534 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +E0 +10 +10 +20 +41 +F2 +04 +08 +10 +20 +4F +88 +0E +01 +01 +0E +ENDCHAR +STARTCHAR uni2157 +ENCODING 8535 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +E0 +10 +60 +10 +11 +E2 +04 +08 +10 +20 +4F +88 +0E +01 +01 +0E +ENDCHAR +STARTCHAR uni2158 +ENCODING 8536 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +60 +60 +A0 +A0 +F1 +22 +04 +08 +10 +20 +4F +88 +0E +01 +01 +0E +ENDCHAR +STARTCHAR uni2159 +ENCODING 8537 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +20 +60 +20 +20 +21 +22 +04 +08 +10 +20 +46 +88 +0E +09 +09 +06 +ENDCHAR +STARTCHAR uni215A +ENCODING 8538 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +F0 +80 +E0 +10 +11 +E2 +04 +08 +10 +20 +46 +88 +0E +09 +09 +06 +ENDCHAR +STARTCHAR oneeighth +ENCODING 8539 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +20 +60 +20 +20 +21 +22 +04 +08 +10 +20 +46 +89 +06 +09 +09 +06 +ENDCHAR +STARTCHAR threeeighths +ENCODING 8540 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +E0 +10 +60 +10 +11 +E2 +04 +08 +10 +20 +46 +89 +06 +09 +09 +06 +ENDCHAR +STARTCHAR fiveeighths +ENCODING 8541 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +F0 +80 +E0 +10 +11 +E2 +04 +08 +10 +20 +46 +89 +06 +09 +09 +06 +ENDCHAR +STARTCHAR seveneighths +ENCODING 8542 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +F0 +10 +20 +20 +41 +42 +04 +08 +10 +20 +46 +89 +06 +09 +09 +06 +ENDCHAR +STARTCHAR uni215F +ENCODING 8543 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 12 0 1 +BITMAP +20 +60 +20 +20 +21 +22 +04 +08 +10 +20 +40 +80 +ENDCHAR +STARTCHAR uni2160 +ENCODING 8544 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 11 3 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2161 +ENCODING 8545 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 11 2 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni2162 +ENCODING 8546 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 1 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2163 +ENCODING 8547 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +A2 +A2 +A2 +A2 +94 +94 +94 +94 +88 +88 +88 +ENDCHAR +STARTCHAR uni2164 +ENCODING 8548 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +82 +82 +82 +44 +44 +44 +28 +28 +28 +10 +10 +ENDCHAR +STARTCHAR uni2165 +ENCODING 8549 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +8A +8A +8A +8A +52 +52 +52 +52 +22 +22 +22 +ENDCHAR +STARTCHAR uni2166 +ENCODING 8550 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +AA +AA +AA +AA +AA +AA +AA +AA +4A +4A +4A +ENDCHAR +STARTCHAR uni2167 +ENCODING 8551 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 11 0 0 +BITMAP +AA80 +AA80 +AA80 +AA80 +AA80 +AA80 +AA80 +AA80 +4A80 +4A80 +4A80 +ENDCHAR +STARTCHAR uni2168 +ENCODING 8552 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +A2 +A2 +94 +94 +88 +88 +88 +94 +94 +A2 +A2 +ENDCHAR +STARTCHAR uni2169 +ENCODING 8553 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +82 +44 +44 +28 +28 +10 +28 +28 +44 +44 +82 +ENDCHAR +STARTCHAR uni216A +ENCODING 8554 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +8A +8A +52 +52 +22 +22 +22 +52 +52 +8A +8A +ENDCHAR +STARTCHAR uni216B +ENCODING 8555 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +AA +AA +AA +AA +4A +4A +4A +AA +AA +AA +AA +ENDCHAR +STARTCHAR uni216C +ENCODING 8556 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +FC +ENDCHAR +STARTCHAR uni216D +ENCODING 8557 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +7C +80 +80 +80 +80 +80 +80 +80 +80 +80 +7C +ENDCHAR +STARTCHAR uni216E +ENCODING 8558 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +F0 +88 +84 +84 +84 +84 +84 +84 +84 +88 +F0 +ENDCHAR +STARTCHAR uni216F +ENCODING 8559 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +82 +82 +C6 +C6 +AA +AA +92 +92 +82 +82 +82 +ENDCHAR +STARTCHAR uni2170 +ENCODING 8560 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 10 3 0 +BITMAP +80 +00 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2171 +ENCODING 8561 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 10 2 0 +BITMAP +A0 +00 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni2172 +ENCODING 8562 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 10 1 0 +BITMAP +A8 +00 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni2173 +ENCODING 8563 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 0 0 +BITMAP +80 +00 +A2 +A2 +A2 +94 +94 +94 +88 +88 +ENDCHAR +STARTCHAR uni2174 +ENCODING 8564 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +82 +82 +44 +44 +28 +28 +10 +10 +ENDCHAR +STARTCHAR uni2175 +ENCODING 8565 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 0 0 +BITMAP +02 +00 +8A +8A +8A +52 +52 +52 +22 +22 +ENDCHAR +STARTCHAR uni2176 +ENCODING 8566 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 0 0 +BITMAP +0A +00 +AA +AA +AA +AA +AA +AA +4A +4A +ENDCHAR +STARTCHAR uni2177 +ENCODING 8567 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 10 0 0 +BITMAP +0A80 +0000 +AA80 +AA80 +AA80 +AA80 +AA80 +AA80 +4A80 +4A80 +ENDCHAR +STARTCHAR uni2178 +ENCODING 8568 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 0 0 +BITMAP +80 +00 +A2 +A2 +94 +88 +88 +94 +A2 +A2 +ENDCHAR +STARTCHAR uni2179 +ENCODING 8569 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +84 +84 +48 +30 +30 +48 +84 +84 +ENDCHAR +STARTCHAR uni217A +ENCODING 8570 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 0 0 +BITMAP +02 +00 +8A +8A +52 +22 +22 +52 +8A +8A +ENDCHAR +STARTCHAR uni217B +ENCODING 8571 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 0 0 +BITMAP +0A +00 +AA +AA +AA +4A +4A +AA +AA +AA +ENDCHAR +STARTCHAR uni217C +ENCODING 8572 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 11 2 0 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +30 +ENDCHAR +STARTCHAR uni217D +ENCODING 8573 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +7C +80 +80 +80 +80 +80 +80 +7C +ENDCHAR +STARTCHAR uni217E +ENCODING 8574 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +04 +04 +04 +7C +84 +84 +84 +84 +84 +84 +7C +ENDCHAR +STARTCHAR uni217F +ENCODING 8575 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +FC +92 +92 +92 +92 +92 +92 +92 +ENDCHAR +STARTCHAR uni2180 +ENCODING 8576 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 11 0 0 +BITMAP +3E00 +4900 +8880 +8880 +8880 +8880 +8880 +8880 +8880 +4900 +3E00 +ENDCHAR +STARTCHAR uni2181 +ENCODING 8577 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +F0 +88 +E4 +94 +94 +94 +94 +94 +E4 +88 +F0 +ENDCHAR +STARTCHAR uni2182 +ENCODING 8578 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 11 0 0 +BITMAP +3E00 +4900 +9C80 +AA80 +AA80 +AA80 +AA80 +AA80 +9C80 +4900 +3E00 +ENDCHAR +STARTCHAR uni2183 +ENCODING 8579 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +F8 +04 +04 +04 +04 +04 +04 +04 +04 +04 +F8 +ENDCHAR +STARTCHAR uni2184 +ENCODING 8580 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +F8 +04 +04 +04 +04 +04 +04 +F8 +ENDCHAR +STARTCHAR uni2185 +ENCODING 8581 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +7C +80 +80 +80 +80 +80 +80 +80 +80 +80 +7C +04 +04 +04 +ENDCHAR +STARTCHAR uni2189 +ENCODING 8585 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +60 +90 +90 +90 +91 +62 +04 +08 +10 +20 +4E +81 +06 +01 +01 +0E +ENDCHAR +STARTCHAR arrowleft +ENCODING 8592 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 0 3 +BITMAP +20 +40 +FE +40 +20 +ENDCHAR +STARTCHAR arrowup +ENCODING 8593 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 7 1 2 +BITMAP +20 +70 +A8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR arrowright +ENCODING 8594 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 0 3 +BITMAP +08 +04 +FE +04 +08 +ENDCHAR +STARTCHAR arrowdown +ENCODING 8595 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 7 1 2 +BITMAP +20 +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR arrowboth +ENCODING 8596 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 3 +BITMAP +24 +42 +FF +42 +24 +ENDCHAR +STARTCHAR arrowupdn +ENCODING 8597 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 8 1 1 +BITMAP +20 +70 +A8 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni2196 +ENCODING 8598 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 5 1 3 +BITMAP +F0 +C0 +A0 +90 +08 +ENDCHAR +STARTCHAR uni2197 +ENCODING 8599 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 5 1 3 +BITMAP +78 +18 +28 +48 +80 +ENDCHAR +STARTCHAR uni2198 +ENCODING 8600 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 5 1 3 +BITMAP +80 +48 +28 +18 +78 +ENDCHAR +STARTCHAR uni2199 +ENCODING 8601 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 5 1 3 +BITMAP +08 +90 +A0 +C0 +F0 +ENDCHAR +STARTCHAR uni219A +ENCODING 8602 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 0 3 +BITMAP +20 +44 +FE +48 +20 +ENDCHAR +STARTCHAR uni219B +ENCODING 8603 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 0 3 +BITMAP +08 +44 +FE +24 +08 +ENDCHAR +STARTCHAR uni219C +ENCODING 8604 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 4 0 4 +BITMAP +F0 +C0 +A6 +99 +ENDCHAR +STARTCHAR uni219D +ENCODING 8605 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 4 0 4 +BITMAP +0F +03 +65 +99 +ENDCHAR +STARTCHAR uni219E +ENCODING 8606 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 3 +BITMAP +24 +48 +FF +48 +24 +ENDCHAR +STARTCHAR uni219F +ENCODING 8607 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 8 1 1 +BITMAP +20 +70 +A8 +20 +70 +A8 +20 +20 +ENDCHAR +STARTCHAR uni21A0 +ENCODING 8608 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 3 +BITMAP +24 +12 +FF +12 +24 +ENDCHAR +STARTCHAR uni21A1 +ENCODING 8609 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 8 1 1 +BITMAP +20 +20 +A8 +70 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni21A2 +ENCODING 8610 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 3 +BITMAP +21 +42 +FC +42 +21 +ENDCHAR +STARTCHAR uni21A3 +ENCODING 8611 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 3 +BITMAP +84 +42 +3F +42 +84 +ENDCHAR +STARTCHAR uni21A4 +ENCODING 8612 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 0 3 +BITMAP +22 +42 +FE +42 +22 +ENDCHAR +STARTCHAR uni21A5 +ENCODING 8613 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 7 1 2 +BITMAP +20 +70 +A8 +20 +20 +20 +F8 +ENDCHAR +STARTCHAR uni21A6 +ENCODING 8614 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 0 3 +BITMAP +88 +84 +FE +84 +88 +ENDCHAR +STARTCHAR uni21A7 +ENCODING 8615 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 7 1 2 +BITMAP +F8 +20 +20 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR arrowupdnbse +ENCODING 8616 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 9 1 0 +BITMAP +20 +70 +A8 +20 +20 +A8 +70 +20 +F8 +ENDCHAR +STARTCHAR uni21A9 +ENCODING 8617 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 6 0 3 +BITMAP +02 +21 +41 +FE +40 +20 +ENDCHAR +STARTCHAR uni21AA +ENCODING 8618 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 6 0 3 +BITMAP +40 +84 +82 +7F +02 +04 +ENDCHAR +STARTCHAR uni21AB +ENCODING 8619 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 6 0 3 +BITMAP +02 +25 +45 +FE +44 +20 +ENDCHAR +STARTCHAR uni21AC +ENCODING 8620 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 6 0 3 +BITMAP +40 +A4 +A2 +7F +22 +04 +ENDCHAR +STARTCHAR uni21AF +ENCODING 8623 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 1 1 +BITMAP +80 +90 +B0 +D0 +90 +10 +54 +38 +10 +ENDCHAR +STARTCHAR uni21B0 +ENCODING 8624 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 0 +BITMAP +20 +40 +FC +44 +24 +04 +04 +04 +04 +04 +ENDCHAR +STARTCHAR uni21B1 +ENCODING 8625 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 0 +BITMAP +10 +08 +FC +88 +90 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni21B2 +ENCODING 8626 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 0 +BITMAP +04 +04 +04 +04 +04 +24 +44 +FC +40 +20 +ENDCHAR +STARTCHAR uni21B3 +ENCODING 8627 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 0 +BITMAP +80 +80 +80 +80 +80 +90 +88 +FC +08 +10 +ENDCHAR +STARTCHAR uni21B4 +ENCODING 8628 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +FC +04 +04 +04 +04 +15 +0E +04 +ENDCHAR +STARTCHAR carriagereturn +ENCODING 8629 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +01 +01 +01 +21 +41 +FF +40 +20 +ENDCHAR +STARTCHAR uni21B6 +ENCODING 8630 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 6 0 3 +BITMAP +0E +11 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni21B7 +ENCODING 8631 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 6 0 3 +BITMAP +70 +88 +04 +15 +0E +04 +ENDCHAR +STARTCHAR uni21B8 +ENCODING 8632 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 7 1 3 +BITMAP +FC +00 +F0 +C0 +A0 +90 +08 +ENDCHAR +STARTCHAR uni21B9 +ENCODING 8633 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +90 +A0 +FF +A0 +99 +05 +FF +05 +09 +ENDCHAR +STARTCHAR uni21BA +ENCODING 8634 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 1 +BITMAP +0E +0C +4A +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR uni21BB +ENCODING 8635 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 1 +BITMAP +70 +30 +52 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR uni21BC +ENCODING 8636 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 3 0 5 +BITMAP +20 +40 +FE +ENDCHAR +STARTCHAR uni21BD +ENCODING 8637 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 3 0 3 +BITMAP +FE +40 +20 +ENDCHAR +STARTCHAR uni21BE +ENCODING 8638 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 7 3 2 +BITMAP +80 +C0 +A0 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni21BF +ENCODING 8639 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 7 1 2 +BITMAP +20 +60 +A0 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni21C0 +ENCODING 8640 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 3 0 5 +BITMAP +08 +04 +FE +ENDCHAR +STARTCHAR uni21C1 +ENCODING 8641 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 3 0 3 +BITMAP +FE +04 +08 +ENDCHAR +STARTCHAR uni21C2 +ENCODING 8642 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 7 3 2 +BITMAP +80 +80 +80 +80 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni21C3 +ENCODING 8643 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 7 1 2 +BITMAP +20 +20 +20 +20 +A0 +60 +20 +ENDCHAR +STARTCHAR uni21C4 +ENCODING 8644 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +04 +02 +FF +02 +24 +40 +FF +40 +20 +ENDCHAR +STARTCHAR uni21C5 +ENCODING 8645 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 8 0 0 +BITMAP +2200 +7200 +AA00 +2200 +2200 +2A80 +2700 +2200 +ENDCHAR +STARTCHAR uni21C6 +ENCODING 8646 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +20 +40 +FF +40 +24 +02 +FF +02 +04 +ENDCHAR +STARTCHAR uni21C7 +ENCODING 8647 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +20 +40 +FF +40 +20 +40 +FF +40 +20 +ENDCHAR +STARTCHAR uni21C8 +ENCODING 8648 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 8 0 0 +BITMAP +2200 +7700 +AA80 +2200 +2200 +2200 +2200 +2200 +ENDCHAR +STARTCHAR uni21C9 +ENCODING 8649 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +04 +02 +FF +02 +04 +02 +FF +02 +04 +ENDCHAR +STARTCHAR uni21CA +ENCODING 8650 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 8 0 0 +BITMAP +2200 +2200 +2200 +2200 +2200 +AA80 +7700 +2200 +ENDCHAR +STARTCHAR uni21CB +ENCODING 8651 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 7 0 0 +BITMAP +20 +40 +FF +00 +FF +02 +04 +ENDCHAR +STARTCHAR uni21CC +ENCODING 8652 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 7 0 0 +BITMAP +04 +02 +FF +00 +FF +40 +20 +ENDCHAR +STARTCHAR uni21CD +ENCODING 8653 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 2 +BITMAP +22 +7F +C4 +7F +28 +ENDCHAR +STARTCHAR uni21CF +ENCODING 8655 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 2 +BITMAP +14 +FE +23 +FE +44 +ENDCHAR +STARTCHAR arrowdblleft +ENCODING 8656 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 2 +BITMAP +20 +7F +C0 +7F +20 +ENDCHAR +STARTCHAR arrowdblup +ENCODING 8657 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 8 1 1 +BITMAP +20 +70 +D8 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR arrowdblright +ENCODING 8658 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 2 +BITMAP +04 +FE +03 +FE +04 +ENDCHAR +STARTCHAR arrowdbldown +ENCODING 8659 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 8 1 1 +BITMAP +50 +50 +50 +50 +50 +D8 +70 +20 +ENDCHAR +STARTCHAR arrowdblboth +ENCODING 8660 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 2 +BITMAP +24 +7E +C3 +7E +24 +ENDCHAR +STARTCHAR uni21D5 +ENCODING 8661 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 8 1 1 +BITMAP +20 +70 +D8 +50 +50 +D8 +70 +20 +ENDCHAR +STARTCHAR uni21D6 +ENCODING 8662 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 6 1 2 +BITMAP +F0 +A0 +D0 +A8 +14 +08 +ENDCHAR +STARTCHAR uni21D7 +ENCODING 8663 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 6 1 2 +BITMAP +3C +14 +2C +54 +A0 +40 +ENDCHAR +STARTCHAR uni21D8 +ENCODING 8664 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 6 1 2 +BITMAP +40 +A0 +54 +2C +14 +3C +ENDCHAR +STARTCHAR uni21D9 +ENCODING 8665 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 6 1 2 +BITMAP +08 +14 +A8 +D0 +A0 +F0 +ENDCHAR +STARTCHAR uni21DA +ENCODING 8666 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 7 0 1 +BITMAP +10 +3F +40 +FF +40 +3F +10 +ENDCHAR +STARTCHAR uni21DB +ENCODING 8667 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 7 0 1 +BITMAP +08 +FC +02 +FF +02 +FC +08 +ENDCHAR +STARTCHAR uni21DC +ENCODING 8668 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 3 +BITMAP +20 +40 +F5 +4A +20 +ENDCHAR +STARTCHAR uni21DD +ENCODING 8669 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 3 +BITMAP +04 +52 +AF +02 +04 +ENDCHAR +STARTCHAR uni21DE +ENCODING 8670 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 9 1 0 +BITMAP +20 +70 +A8 +20 +F8 +20 +F8 +20 +20 +ENDCHAR +STARTCHAR uni21DF +ENCODING 8671 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 9 1 0 +BITMAP +20 +20 +F8 +20 +F8 +20 +A8 +70 +20 +ENDCHAR +STARTCHAR uni21E0 +ENCODING 8672 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 0 3 +BITMAP +20 +40 +EA +40 +20 +ENDCHAR +STARTCHAR uni21E1 +ENCODING 8673 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 7 1 2 +BITMAP +20 +70 +A8 +00 +20 +00 +20 +ENDCHAR +STARTCHAR uni21E2 +ENCODING 8674 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 0 3 +BITMAP +08 +04 +AE +04 +08 +ENDCHAR +STARTCHAR uni21E3 +ENCODING 8675 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 7 1 2 +BITMAP +20 +00 +20 +00 +A8 +70 +20 +ENDCHAR +STARTCHAR uni21E4 +ENCODING 8676 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 3 +BITMAP +90 +A0 +FF +A0 +90 +ENDCHAR +STARTCHAR uni21E5 +ENCODING 8677 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 3 +BITMAP +09 +05 +FF +05 +09 +ENDCHAR +STARTCHAR uni21E6 +ENCODING 8678 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 0 3 +BITMAP +30 +5E +82 +5E +30 +ENDCHAR +STARTCHAR uni21E7 +ENCODING 8679 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 7 1 2 +BITMAP +20 +50 +88 +D8 +50 +50 +70 +ENDCHAR +STARTCHAR uni21E8 +ENCODING 8680 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 0 3 +BITMAP +18 +F4 +82 +F4 +18 +ENDCHAR +STARTCHAR uni21E9 +ENCODING 8681 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 7 1 2 +BITMAP +70 +50 +50 +D8 +88 +50 +20 +ENDCHAR +STARTCHAR uni21EA +ENCODING 8682 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 9 1 0 +BITMAP +20 +50 +88 +D8 +70 +00 +70 +50 +70 +ENDCHAR +STARTCHAR uni21EB +ENCODING 8683 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 8 1 1 +BITMAP +20 +50 +88 +D8 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni21EC +ENCODING 8684 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 8 1 1 +BITMAP +20 +50 +88 +F8 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni21EE +ENCODING 8686 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 9 1 2 +BITMAP +20 +50 +A8 +50 +88 +D8 +50 +50 +70 +ENDCHAR +STARTCHAR uni21EF +ENCODING 8687 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 1 0 +BITMAP +20 +50 +A8 +50 +88 +D8 +50 +50 +D8 +88 +F8 +ENDCHAR +STARTCHAR uni21F0 +ENCODING 8688 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 3 +BITMAP +CC +BA +81 +BA +CC +ENDCHAR +STARTCHAR uni21F1 +ENCODING 8689 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 3 +BITMAP +FE +80 +BC +B0 +A8 +A4 +82 +ENDCHAR +STARTCHAR uni21F2 +ENCODING 8690 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 3 +BITMAP +82 +4A +2A +1A +7A +02 +FE +ENDCHAR +STARTCHAR uni21F3 +ENCODING 8691 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 10 1 0 +BITMAP +20 +50 +88 +D8 +50 +50 +D8 +88 +50 +20 +ENDCHAR +STARTCHAR uni21F4 +ENCODING 8692 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 3 +BITMAP +24 +52 +FF +52 +24 +ENDCHAR +STARTCHAR uni21F5 +ENCODING 8693 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 8 0 0 +BITMAP +2200 +2700 +2A80 +2200 +2200 +AA00 +7200 +2200 +ENDCHAR +STARTCHAR uni21F6 +ENCODING 8694 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 -1 +BITMAP +04 +02 +FF +02 +04 +02 +FF +02 +04 +02 +FF +02 +04 +ENDCHAR +STARTCHAR uni21F7 +ENCODING 8695 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 0 3 +BITMAP +28 +48 +FE +48 +28 +ENDCHAR +STARTCHAR uni21F8 +ENCODING 8696 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 0 3 +BITMAP +28 +24 +FE +24 +28 +ENDCHAR +STARTCHAR uni21F9 +ENCODING 8697 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 5 0 3 +BITMAP +2A00 +4900 +FF80 +4900 +2A00 +ENDCHAR +STARTCHAR uni21FA +ENCODING 8698 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 3 +BITMAP +2A +4A +FF +4A +2A +ENDCHAR +STARTCHAR uni21FB +ENCODING 8699 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 3 +BITMAP +54 +52 +FF +52 +54 +ENDCHAR +STARTCHAR uni21FD +ENCODING 8701 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 0 3 +BITMAP +20 +60 +BE +60 +20 +ENDCHAR +STARTCHAR uni21FE +ENCODING 8702 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 0 3 +BITMAP +08 +0C +FA +0C +08 +ENDCHAR +STARTCHAR uni21FF +ENCODING 8703 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 3 +BITMAP +24 +66 +BD +66 +24 +ENDCHAR +STARTCHAR universal +ENCODING 8704 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +82 +82 +82 +7C +44 +44 +28 +28 +28 +10 +10 +ENDCHAR +STARTCHAR uni2201 +ENCODING 8705 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +7C +80 +80 +80 +80 +80 +80 +80 +80 +80 +7C +ENDCHAR +STARTCHAR partialdiff +ENCODING 8706 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +30 +08 +08 +04 +34 +4C +84 +84 +84 +48 +30 +ENDCHAR +STARTCHAR existential +ENCODING 8707 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +FC +04 +04 +04 +04 +7C +04 +04 +04 +04 +FC +ENDCHAR +STARTCHAR uni2204 +ENCODING 8708 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -1 +BITMAP +10 +FC +14 +14 +24 +24 +7C +24 +24 +44 +44 +FC +40 +ENDCHAR +STARTCHAR emptyset +ENCODING 8709 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 9 0 1 +BITMAP +3A +44 +8A +8A +92 +A2 +A2 +44 +B8 +ENDCHAR +STARTCHAR uni2206 +ENCODING 8710 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 9 0 1 +BITMAP +10 +10 +28 +28 +44 +44 +82 +82 +FE +ENDCHAR +STARTCHAR gradient +ENCODING 8711 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 9 0 1 +BITMAP +FE +82 +82 +44 +44 +28 +28 +10 +10 +ENDCHAR +STARTCHAR element +ENCODING 8712 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +3C +40 +80 +80 +80 +FC +80 +80 +80 +40 +3C +ENDCHAR +STARTCHAR notelement +ENCODING 8713 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -1 +BITMAP +08 +3C +48 +88 +90 +90 +FC +90 +90 +A0 +60 +3C +20 +ENDCHAR +STARTCHAR uni220A +ENCODING 8714 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 7 1 1 +BITMAP +3C +40 +80 +FC +80 +40 +3C +ENDCHAR +STARTCHAR suchthat +ENCODING 8715 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +F0 +08 +04 +04 +04 +FC +04 +04 +04 +08 +F0 +ENDCHAR +STARTCHAR uni220C +ENCODING 8716 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -1 +BITMAP +10 +F0 +18 +14 +24 +24 +FC +24 +24 +44 +48 +F0 +40 +ENDCHAR +STARTCHAR uni220D +ENCODING 8717 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 7 1 1 +BITMAP +F0 +08 +04 +FC +04 +08 +F0 +ENDCHAR +STARTCHAR uni220E +ENCODING 8718 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 1 0 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR product +ENCODING 8719 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +FC +84 +84 +84 +84 +84 +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR uni2210 +ENCODING 8720 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +84 +84 +84 +84 +84 +84 +84 +84 +84 +84 +FC +ENDCHAR +STARTCHAR summation +ENCODING 8721 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +FC +80 +40 +20 +10 +08 +10 +20 +40 +80 +FC +ENDCHAR +STARTCHAR minus +ENCODING 8722 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 1 0 5 +BITMAP +FE +ENDCHAR +STARTCHAR uni2213 +ENCODING 8723 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 9 0 1 +BITMAP +FE +00 +10 +10 +10 +FE +10 +10 +10 +ENDCHAR +STARTCHAR uni2214 +ENCODING 8724 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 9 0 2 +BITMAP +10 +00 +10 +10 +10 +FE +10 +10 +10 +ENDCHAR +STARTCHAR uni2215 +ENCODING 8725 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +04 +04 +08 +08 +10 +10 +20 +20 +40 +40 +80 +80 +ENDCHAR +STARTCHAR uni2216 +ENCODING 8726 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 0 +BITMAP +80 +80 +40 +40 +20 +20 +10 +10 +08 +08 +04 +04 +ENDCHAR +STARTCHAR asteriskmath +ENCODING 8727 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 7 1 2 +BITMAP +20 +A8 +70 +20 +70 +A8 +20 +ENDCHAR +STARTCHAR uni2218 +ENCODING 8728 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 5 1 3 +BITMAP +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni2219 +ENCODING 8729 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 5 1 3 +BITMAP +70 +F8 +F8 +F8 +70 +ENDCHAR +STARTCHAR radical +ENCODING 8730 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +07 +04 +04 +08 +08 +88 +90 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni221B +ENCODING 8731 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +E0 +10 +67 +14 +E4 +08 +08 +88 +90 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni221C +ENCODING 8732 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +60 +A0 +A7 +F4 +24 +08 +08 +88 +90 +50 +50 +20 +20 +ENDCHAR +STARTCHAR proportional +ENCODING 8733 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +62 +94 +94 +88 +88 +94 +94 +62 +ENDCHAR +STARTCHAR infinity +ENCODING 8734 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 6 0 1 +BITMAP +44 +AA +92 +92 +AA +44 +ENDCHAR +STARTCHAR orthogonal +ENCODING 8735 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 1 3 +BITMAP +80 +80 +80 +80 +80 +80 +FE +ENDCHAR +STARTCHAR angle +ENCODING 8736 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 3 +BITMAP +10 +10 +20 +20 +40 +40 +80 +FE +ENDCHAR +STARTCHAR uni2221 +ENCODING 8737 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 9 1 2 +BITMAP +10 +10 +60 +20 +50 +50 +88 +FE +08 +ENDCHAR +STARTCHAR uni2222 +ENCODING 8738 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 7 0 3 +BITMAP +0B +0C +34 +C4 +34 +0C +0B +ENDCHAR +STARTCHAR uni2223 +ENCODING 8739 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 14 3 -3 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2224 +ENCODING 8740 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 14 1 -3 +BITMAP +20 +20 +20 +20 +20 +28 +30 +60 +A0 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2225 +ENCODING 8741 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 14 2 -3 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni2226 +ENCODING 8742 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 14 1 -3 +BITMAP +50 +50 +50 +50 +50 +50 +58 +70 +D0 +50 +50 +50 +50 +50 +ENDCHAR +STARTCHAR logicaland +ENCODING 8743 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +10 +10 +28 +28 +44 +44 +82 +82 +ENDCHAR +STARTCHAR logicalor +ENCODING 8744 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +82 +82 +44 +44 +28 +28 +10 +10 +ENDCHAR +STARTCHAR intersection +ENCODING 8745 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +38 +44 +82 +82 +82 +82 +82 +82 +ENDCHAR +STARTCHAR union +ENCODING 8746 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +82 +82 +82 +82 +82 +82 +44 +38 +ENDCHAR +STARTCHAR integral +ENCODING 8747 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 15 2 -3 +BITMAP +10 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni222C +ENCODING 8748 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 15 1 -3 +BITMAP +14 +28 +28 +28 +28 +28 +28 +28 +28 +28 +28 +28 +28 +28 +D0 +ENDCHAR +STARTCHAR uni222D +ENCODING 8749 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 15 0 -3 +BITMAP +15 +2A +2A +2A +2A +2A +2A +2A +2A +2A +2A +2A +2A +2A +D4 +ENDCHAR +STARTCHAR uni222E +ENCODING 8750 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 15 2 -3 +BITMAP +10 +20 +20 +20 +20 +70 +A8 +A8 +A8 +70 +20 +20 +20 +20 +C0 +ENDCHAR +STARTCHAR uni222F +ENCODING 8751 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -3 +BITMAP +14 +28 +28 +28 +28 +7C +AA +AA +AA +7C +28 +28 +28 +28 +D0 +ENDCHAR +STARTCHAR uni2230 +ENCODING 8752 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 15 0 -3 +BITMAP +15 +2A +2A +2A +2A +2A +3E +6B +6B +3E +2A +2A +2A +2A +D4 +ENDCHAR +STARTCHAR therefore +ENCODING 8756 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 5 1 3 +BITMAP +20 +00 +00 +00 +88 +ENDCHAR +STARTCHAR uni2235 +ENCODING 8757 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 5 1 3 +BITMAP +88 +00 +00 +00 +20 +ENDCHAR +STARTCHAR uni2236 +ENCODING 8758 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 5 3 3 +BITMAP +80 +00 +00 +00 +80 +ENDCHAR +STARTCHAR uni2237 +ENCODING 8759 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 5 1 3 +BITMAP +88 +00 +00 +00 +88 +ENDCHAR +STARTCHAR uni2238 +ENCODING 8760 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 3 1 5 +BITMAP +20 +00 +F8 +ENDCHAR +STARTCHAR uni2239 +ENCODING 8761 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 5 1 3 +BITMAP +04 +00 +F8 +00 +04 +ENDCHAR +STARTCHAR uni223A +ENCODING 8762 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 5 1 3 +BITMAP +88 +00 +F8 +00 +88 +ENDCHAR +STARTCHAR uni223B +ENCODING 8763 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 6 1 3 +BITMAP +10 +00 +64 +98 +00 +20 +ENDCHAR +STARTCHAR similar +ENCODING 8764 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 2 1 5 +BITMAP +64 +98 +ENDCHAR +STARTCHAR uni223D +ENCODING 8765 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 2 1 5 +BITMAP +98 +64 +ENDCHAR +STARTCHAR uni223E +ENCODING 8766 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 4 0 4 +BITMAP +62 +91 +89 +46 +ENDCHAR +STARTCHAR uni223F +ENCODING 8767 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 2 +BITMAP +40 +A0 +A0 +90 +12 +0A +0A +04 +ENDCHAR +STARTCHAR uni2240 +ENCODING 8768 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 10 3 0 +BITMAP +80 +40 +40 +40 +40 +80 +80 +80 +80 +40 +ENDCHAR +STARTCHAR uni2241 +ENCODING 8769 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 4 1 4 +BITMAP +10 +74 +B8 +20 +ENDCHAR +STARTCHAR uni2242 +ENCODING 8770 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 4 1 4 +BITMAP +FC +00 +64 +98 +ENDCHAR +STARTCHAR uni2243 +ENCODING 8771 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 4 1 4 +BITMAP +64 +98 +00 +FC +ENDCHAR +STARTCHAR uni2244 +ENCODING 8772 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 6 1 3 +BITMAP +10 +74 +98 +20 +FC +20 +ENDCHAR +STARTCHAR congruent +ENCODING 8773 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 6 1 3 +BITMAP +64 +98 +00 +FC +00 +FC +ENDCHAR +STARTCHAR uni2246 +ENCODING 8774 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 7 1 2 +BITMAP +64 +98 +00 +FC +10 +FC +20 +ENDCHAR +STARTCHAR uni2247 +ENCODING 8775 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 2 +BITMAP +08 +6C +98 +10 +FC +20 +FC +40 +ENDCHAR +STARTCHAR approxequal +ENCODING 8776 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 5 1 3 +BITMAP +64 +98 +00 +64 +98 +ENDCHAR +STARTCHAR uni2249 +ENCODING 8777 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 7 1 2 +BITMAP +10 +74 +98 +10 +64 +B8 +20 +ENDCHAR +STARTCHAR uni224A +ENCODING 8778 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 7 1 2 +BITMAP +64 +98 +00 +64 +98 +00 +FC +ENDCHAR +STARTCHAR uni224B +ENCODING 8779 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 1 +BITMAP +64 +98 +00 +64 +98 +00 +64 +98 +ENDCHAR +STARTCHAR uni224C +ENCODING 8780 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 6 1 3 +BITMAP +98 +64 +00 +FC +00 +FC +ENDCHAR +STARTCHAR notequal +ENCODING 8800 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 6 1 2 +BITMAP +10 +F8 +20 +20 +F8 +40 +ENDCHAR +STARTCHAR equivalence +ENCODING 8801 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 5 1 3 +BITMAP +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR uni2262 +ENCODING 8802 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 7 1 2 +BITMAP +10 +F8 +20 +F8 +20 +F8 +40 +ENDCHAR +STARTCHAR uni2263 +ENCODING 8803 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 7 1 2 +BITMAP +F8 +00 +F8 +00 +F8 +00 +F8 +ENDCHAR +STARTCHAR lessequal +ENCODING 8804 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 7 1 2 +BITMAP +0C +30 +C0 +30 +0C +00 +FC +ENDCHAR +STARTCHAR greaterequal +ENCODING 8805 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 7 1 2 +BITMAP +C0 +30 +0C +30 +C0 +00 +FC +ENDCHAR +STARTCHAR uni2266 +ENCODING 8806 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 1 1 +BITMAP +0C +30 +C0 +30 +0C +00 +FC +00 +FC +ENDCHAR +STARTCHAR uni2267 +ENCODING 8807 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 1 1 +BITMAP +C0 +30 +0C +30 +C0 +00 +FC +00 +FC +ENDCHAR +STARTCHAR uni2268 +ENCODING 8808 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 0 +BITMAP +0C +30 +C0 +30 +0C +10 +FC +20 +FC +40 +ENDCHAR +STARTCHAR uni2269 +ENCODING 8809 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 0 +BITMAP +C0 +30 +0C +30 +C0 +10 +FC +20 +FC +40 +ENDCHAR +STARTCHAR uni226A +ENCODING 8810 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 1 3 +BITMAP +12 +6C +90 +6C +12 +ENDCHAR +STARTCHAR uni226B +ENCODING 8811 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 1 3 +BITMAP +90 +6C +12 +6C +90 +ENDCHAR +STARTCHAR uni226E +ENCODING 8814 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 7 1 2 +BITMAP +08 +0C +30 +D0 +30 +2C +20 +ENDCHAR +STARTCHAR uni226F +ENCODING 8815 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 7 1 2 +BITMAP +08 +C8 +30 +1C +30 +E0 +20 +ENDCHAR +STARTCHAR uni2270 +ENCODING 8816 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 1 1 +BITMAP +08 +0C +38 +D0 +30 +2C +20 +FC +40 +ENDCHAR +STARTCHAR uni2271 +ENCODING 8817 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 1 +BITMAP +C8 +38 +1C +30 +E0 +20 +FC +40 +ENDCHAR +STARTCHAR uni2272 +ENCODING 8818 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 1 +BITMAP +0C +30 +C0 +30 +0C +00 +64 +98 +ENDCHAR +STARTCHAR uni2273 +ENCODING 8819 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 1 +BITMAP +C0 +30 +0C +30 +C0 +00 +64 +98 +ENDCHAR +STARTCHAR uni2274 +ENCODING 8820 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 6 10 1 0 +BITMAP +08 +0C +38 +C8 +30 +1C +10 +74 +B8 +20 +ENDCHAR +STARTCHAR uni2275 +ENCODING 8821 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 0 +BITMAP +08 +C8 +38 +1C +30 +D0 +10 +74 +B8 +20 +ENDCHAR +STARTCHAR uni2276 +ENCODING 8822 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 0 +BITMAP +0C +30 +C0 +30 +0C +C0 +30 +0C +30 +C0 +ENDCHAR +STARTCHAR uni2277 +ENCODING 8823 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 0 +BITMAP +C0 +30 +0C +30 +C0 +0C +30 +C0 +30 +0C +ENDCHAR +STARTCHAR uni227A +ENCODING 8826 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 7 1 2 +BITMAP +04 +08 +30 +C0 +30 +08 +04 +ENDCHAR +STARTCHAR uni227B +ENCODING 8827 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 7 1 2 +BITMAP +80 +40 +30 +0C +30 +40 +80 +ENDCHAR +STARTCHAR uni227C +ENCODING 8828 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 1 1 +BITMAP +04 +08 +30 +C0 +30 +C8 +34 +08 +04 +ENDCHAR +STARTCHAR uni227D +ENCODING 8829 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 1 1 +BITMAP +80 +40 +30 +0C +30 +4C +B0 +40 +80 +ENDCHAR +STARTCHAR uni227E +ENCODING 8830 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +04 +38 +C0 +38 +04 +00 +64 +98 +ENDCHAR +STARTCHAR uni227F +ENCODING 8831 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +80 +70 +0C +70 +80 +00 +64 +98 +ENDCHAR +STARTCHAR propersubset +ENCODING 8834 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 6 1 1 +BITMAP +7C +80 +80 +80 +80 +7C +ENDCHAR +STARTCHAR propersuperset +ENCODING 8835 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 6 1 1 +BITMAP +F8 +04 +04 +04 +04 +F8 +ENDCHAR +STARTCHAR notsubset +ENCODING 8836 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +08 +7C +88 +90 +90 +A0 +7C +20 +ENDCHAR +STARTCHAR uni2285 +ENCODING 8837 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +10 +F8 +14 +24 +24 +44 +F8 +40 +ENDCHAR +STARTCHAR reflexsubset +ENCODING 8838 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +7C +80 +80 +80 +80 +7C +00 +FC +ENDCHAR +STARTCHAR reflexsuperset +ENCODING 8839 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +F8 +04 +04 +04 +04 +F8 +00 +FC +ENDCHAR +STARTCHAR uni2288 +ENCODING 8840 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 -1 +BITMAP +08 +7C +88 +90 +90 +A0 +7C +20 +FC +40 +ENDCHAR +STARTCHAR uni2289 +ENCODING 8841 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 1 -1 +BITMAP +10 +F8 +14 +24 +24 +44 +F8 +40 +FC +80 +ENDCHAR +STARTCHAR uni228A +ENCODING 8842 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 1 -1 +BITMAP +7C +80 +80 +80 +80 +7C +10 +FC +20 +ENDCHAR +STARTCHAR uni228B +ENCODING 8843 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 1 -1 +BITMAP +F8 +04 +04 +04 +04 +F8 +10 +FC +20 +ENDCHAR +STARTCHAR uni228F +ENCODING 8847 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 6 1 1 +BITMAP +FC +80 +80 +80 +80 +FC +ENDCHAR +STARTCHAR uni2290 +ENCODING 8848 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 6 1 1 +BITMAP +FC +04 +04 +04 +04 +FC +ENDCHAR +STARTCHAR uni2291 +ENCODING 8849 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +FC +80 +80 +80 +80 +FC +00 +FC +ENDCHAR +STARTCHAR uni2292 +ENCODING 8850 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 0 +BITMAP +FC +04 +04 +04 +04 +FC +00 +FC +ENDCHAR +STARTCHAR uni2293 +ENCODING 8851 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 6 1 1 +BITMAP +FC +84 +84 +84 +84 +84 +ENDCHAR +STARTCHAR uni2294 +ENCODING 8852 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 6 1 1 +BITMAP +84 +84 +84 +84 +84 +FC +ENDCHAR +STARTCHAR circleplus +ENCODING 8853 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 2 +BITMAP +38 +44 +92 +BA +92 +44 +38 +ENDCHAR +STARTCHAR uni2296 +ENCODING 8854 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 2 +BITMAP +38 +44 +82 +BA +82 +44 +38 +ENDCHAR +STARTCHAR circlemultiply +ENCODING 8855 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 2 +BITMAP +38 +44 +AA +92 +AA +44 +38 +ENDCHAR +STARTCHAR uni2298 +ENCODING 8856 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 2 +BITMAP +38 +44 +8A +92 +A2 +44 +38 +ENDCHAR +STARTCHAR uni2299 +ENCODING 8857 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 2 +BITMAP +38 +44 +82 +92 +82 +44 +38 +ENDCHAR +STARTCHAR uni229A +ENCODING 8858 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 2 +BITMAP +38 +44 +92 +AA +92 +44 +38 +ENDCHAR +STARTCHAR uni229C +ENCODING 8860 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 2 +BITMAP +38 +44 +BA +82 +BA +44 +38 +ENDCHAR +STARTCHAR uni229D +ENCODING 8861 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 2 +BITMAP +38 +44 +82 +BA +82 +44 +38 +ENDCHAR +STARTCHAR uni229E +ENCODING 8862 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 2 +BITMAP +FE +82 +92 +BA +92 +82 +FE +ENDCHAR +STARTCHAR uni229F +ENCODING 8863 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 2 +BITMAP +FE +82 +82 +BA +82 +82 +FE +ENDCHAR +STARTCHAR uni22A0 +ENCODING 8864 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 2 +BITMAP +FE +82 +AA +92 +AA +82 +FE +ENDCHAR +STARTCHAR uni22A1 +ENCODING 8865 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 2 +BITMAP +FE +82 +82 +92 +82 +82 +FE +ENDCHAR +STARTCHAR uni22A2 +ENCODING 8866 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 1 2 +BITMAP +80 +80 +80 +FE +80 +80 +80 +ENDCHAR +STARTCHAR uni22A3 +ENCODING 8867 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 1 2 +BITMAP +02 +02 +02 +FE +02 +02 +02 +ENDCHAR +STARTCHAR uni22A4 +ENCODING 8868 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 1 2 +BITMAP +FE +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR perpendicular +ENCODING 8869 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 1 2 +BITMAP +10 +10 +10 +10 +10 +10 +FE +ENDCHAR +STARTCHAR uni22A6 +ENCODING 8870 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 2 0 +BITMAP +80 +80 +80 +80 +80 +F8 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni22A7 +ENCODING 8871 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 2 0 +BITMAP +80 +80 +80 +80 +F8 +80 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni22A8 +ENCODING 8872 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +80 +80 +80 +80 +FE +80 +FE +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni22A9 +ENCODING 8873 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +A0 +A0 +A0 +A0 +A0 +BE +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni22AA +ENCODING 8874 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +A8 +A8 +A8 +A8 +A8 +AF +A8 +A8 +A8 +A8 +A8 +ENDCHAR +STARTCHAR uni22AB +ENCODING 8875 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +A0 +A0 +A0 +A0 +BE +A0 +BE +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni22AC +ENCODING 8876 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +80 +80 +80 +88 +88 +FE +90 +90 +80 +80 +80 +ENDCHAR +STARTCHAR uni22AD +ENCODING 8877 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +80 +80 +84 +84 +FE +88 +FE +90 +90 +80 +80 +ENDCHAR +STARTCHAR uni22AE +ENCODING 8878 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +A0 +A0 +A0 +A4 +A4 +BE +A8 +A8 +A0 +A0 +A0 +ENDCHAR +STARTCHAR uni22AF +ENCODING 8879 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +A0 +A0 +A4 +A4 +BE +A8 +BE +B0 +B0 +A0 +A0 +ENDCHAR +STARTCHAR uni22B0 +ENCODING 8880 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 6 7 1 2 +BITMAP +08 +04 +18 +E0 +18 +04 +08 +ENDCHAR +STARTCHAR uni22B1 +ENCODING 8881 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 7 1 2 +BITMAP +40 +80 +60 +1C +60 +80 +40 +ENDCHAR +STARTCHAR uni22B2 +ENCODING 8882 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 5 1 3 +BITMAP +0C +34 +C4 +34 +0C +ENDCHAR +STARTCHAR uni22B3 +ENCODING 8883 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 5 1 3 +BITMAP +C0 +B0 +8C +B0 +C0 +ENDCHAR +STARTCHAR uni22B4 +ENCODING 8884 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 7 1 2 +BITMAP +0C +34 +C4 +34 +0C +00 +FC +ENDCHAR +STARTCHAR uni22B5 +ENCODING 8885 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 7 1 2 +BITMAP +C0 +B0 +8C +B0 +C0 +00 +FC +ENDCHAR +STARTCHAR uni22B6 +ENCODING 8886 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 3 0 4 +BITMAP +66 +9F +66 +ENDCHAR +STARTCHAR uni22B7 +ENCODING 8887 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 3 0 4 +BITMAP +66 +F9 +66 +ENDCHAR +STARTCHAR uni22B8 +ENCODING 8888 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 3 0 4 +BITMAP +06 +F9 +06 +ENDCHAR +STARTCHAR uni22BB +ENCODING 8891 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 0 0 +BITMAP +82 +82 +44 +44 +28 +28 +10 +10 +00 +FE +ENDCHAR +STARTCHAR uni22BC +ENCODING 8892 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 0 0 +BITMAP +FE +00 +10 +10 +28 +28 +44 +44 +82 +82 +ENDCHAR +STARTCHAR uni22BD +ENCODING 8893 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 0 0 +BITMAP +FE +00 +82 +82 +44 +44 +28 +28 +10 +10 +ENDCHAR +STARTCHAR uni22BE +ENCODING 8894 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni22BF +ENCODING 8895 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 6 1 3 +BITMAP +04 +0C +14 +24 +44 +FC +ENDCHAR +STARTCHAR uni22C0 +ENCODING 8896 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +18 +18 +18 +24 +24 +24 +24 +42 +42 +42 +81 +81 +81 +81 +ENDCHAR +STARTCHAR uni22C1 +ENCODING 8897 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +81 +81 +81 +81 +42 +42 +42 +24 +24 +24 +24 +18 +18 +18 +ENDCHAR +STARTCHAR uni22C2 +ENCODING 8898 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +3C +42 +81 +81 +81 +81 +81 +81 +81 +81 +81 +81 +81 +81 +ENDCHAR +STARTCHAR uni22C3 +ENCODING 8899 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +81 +81 +81 +81 +81 +81 +81 +81 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR uni22C4 +ENCODING 8900 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 5 1 3 +BITMAP +20 +50 +88 +50 +20 +ENDCHAR +STARTCHAR dotmath +ENCODING 8901 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 3 5 +BITMAP +80 +ENDCHAR +STARTCHAR uni22C6 +ENCODING 8902 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 6 1 3 +BITMAP +20 +20 +F8 +70 +70 +88 +ENDCHAR +STARTCHAR uni22C7 +ENCODING 8903 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 2 +BITMAP +92 +44 +28 +FE +28 +44 +92 +ENDCHAR +STARTCHAR uni22C8 +ENCODING 8904 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 2 +BITMAP +82 +C6 +AA +92 +AA +C6 +82 +ENDCHAR +STARTCHAR uni22C9 +ENCODING 8905 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 2 +BITMAP +82 +C4 +A8 +90 +A8 +C4 +82 +ENDCHAR +STARTCHAR uni22CA +ENCODING 8906 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 2 +BITMAP +82 +46 +2A +12 +2A +46 +82 +ENDCHAR +STARTCHAR uni22CB +ENCODING 8907 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 2 +BITMAP +80 +40 +20 +10 +28 +44 +82 +ENDCHAR +STARTCHAR uni22CC +ENCODING 8908 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 2 +BITMAP +02 +04 +08 +10 +28 +44 +82 +ENDCHAR +STARTCHAR uni22CD +ENCODING 8909 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 4 1 4 +BITMAP +98 +64 +00 +FC +ENDCHAR +STARTCHAR uni22CE +ENCODING 8910 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 6 0 2 +BITMAP +82 +44 +28 +28 +10 +10 +ENDCHAR +STARTCHAR uni22CF +ENCODING 8911 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 6 0 2 +BITMAP +10 +10 +28 +28 +44 +82 +ENDCHAR +STARTCHAR uni22D0 +ENCODING 8912 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +3E +40 +9E +A0 +9E +40 +3E +ENDCHAR +STARTCHAR uni22D1 +ENCODING 8913 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +F8 +04 +F2 +0A +F2 +04 +F8 +ENDCHAR +STARTCHAR uni22D2 +ENCODING 8914 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +38 +44 +92 +AA +AA +AA +AA +ENDCHAR +STARTCHAR uni22D3 +ENCODING 8915 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +AA +AA +AA +AA +92 +44 +38 +ENDCHAR +STARTCHAR uni22D6 +ENCODING 8918 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 5 1 3 +BITMAP +0C +30 +C4 +30 +0C +ENDCHAR +STARTCHAR uni22D7 +ENCODING 8919 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 5 1 3 +BITMAP +C0 +30 +8C +30 +C0 +ENDCHAR +STARTCHAR uni22D8 +ENCODING 8920 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 7 5 0 3 +BITMAP +2A +54 +A8 +54 +2A +ENDCHAR +STARTCHAR uni22D9 +ENCODING 8921 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 0 3 +BITMAP +A8 +54 +2A +54 +A8 +ENDCHAR +STARTCHAR uni22DA +ENCODING 8922 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +0C +30 +C0 +30 +0C +00 +FC +00 +C0 +30 +0C +30 +C0 +ENDCHAR +STARTCHAR uni22DB +ENCODING 8923 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 13 1 -2 +BITMAP +C0 +30 +0C +30 +C0 +00 +FC +00 +0C +30 +C0 +30 +0C +ENDCHAR +STARTCHAR uni22DC +ENCODING 8924 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 7 1 2 +BITMAP +FC +00 +0C +30 +C0 +30 +0C +ENDCHAR +STARTCHAR uni22DD +ENCODING 8925 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 7 1 2 +BITMAP +FC +00 +C0 +30 +0C +30 +C0 +ENDCHAR +STARTCHAR uni22DE +ENCODING 8926 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 1 1 +BITMAP +04 +08 +34 +C8 +30 +C0 +30 +08 +04 +ENDCHAR +STARTCHAR uni22DF +ENCODING 8927 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 1 1 +BITMAP +80 +40 +B0 +4C +30 +0C +30 +40 +80 +ENDCHAR +STARTCHAR house +ENCODING 8962 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 7 1 1 +BITMAP +30 +48 +84 +84 +84 +84 +FC +ENDCHAR +STARTCHAR revlogicalnot +ENCODING 8976 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 5 1 2 +BITMAP +FC +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni231A +ENCODING 8986 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +38 +38 +44 +92 +92 +9A +82 +82 +44 +38 +38 +ENDCHAR +STARTCHAR uni231B +ENCODING 8987 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 11 0 0 +BITMAP +FE +44 +44 +44 +28 +10 +28 +54 +6C +54 +FE +ENDCHAR +STARTCHAR uni231C +ENCODING 8988 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 4 4 0 7 +BITMAP +F0 +80 +80 +80 +ENDCHAR +STARTCHAR uni231D +ENCODING 8989 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 4 4 4 7 +BITMAP +F0 +10 +10 +10 +ENDCHAR +STARTCHAR uni231E +ENCODING 8990 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 4 4 0 0 +BITMAP +80 +80 +80 +F0 +ENDCHAR +STARTCHAR uni231F +ENCODING 8991 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 4 4 4 0 +BITMAP +10 +10 +10 +F0 +ENDCHAR +STARTCHAR integraltp +ENCODING 8992 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 4 16 3 -3 +BITMAP +60 +90 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR integralbt +ENCODING 8993 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 4 16 0 -3 +BITMAP +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +90 +60 +ENDCHAR +STARTCHAR uni239B +ENCODING 9115 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 16 4 -3 +BITMAP +08 +10 +20 +20 +40 +40 +40 +40 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni239C +ENCODING 9116 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 16 4 -3 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni239D +ENCODING 9117 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 16 4 -3 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +40 +40 +40 +40 +20 +20 +10 +08 +ENDCHAR +STARTCHAR uni239E +ENCODING 9118 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 16 0 -3 +BITMAP +80 +40 +20 +20 +10 +10 +10 +10 +08 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni239F +ENCODING 9119 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 16 4 -3 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A0 +ENCODING 9120 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 16 0 -3 +BITMAP +08 +08 +08 +08 +08 +08 +08 +08 +10 +10 +10 +10 +20 +20 +40 +80 +ENDCHAR +STARTCHAR uni23A1 +ENCODING 9121 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 16 4 -3 +BITMAP +F8 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A2 +ENCODING 9122 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 16 4 -3 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A3 +ENCODING 9123 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 16 4 -3 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni23A4 +ENCODING 9124 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 16 0 -3 +BITMAP +F8 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni23A5 +ENCODING 9125 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 16 4 -3 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A6 +ENCODING 9126 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 16 0 -3 +BITMAP +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +F8 +ENDCHAR +STARTCHAR uni23A7 +ENCODING 9127 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 16 4 -3 +BITMAP +18 +20 +40 +40 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23A8 +ENCODING 9128 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 16 0 -3 +BITMAP +08 +08 +08 +08 +10 +10 +20 +C0 +20 +10 +10 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni23A9 +ENCODING 9129 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 16 4 -3 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +40 +40 +20 +18 +ENDCHAR +STARTCHAR uni23AA +ENCODING 9130 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 16 4 -3 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23AB +ENCODING 9131 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 16 0 -3 +BITMAP +C0 +20 +10 +10 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni23AC +ENCODING 9132 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 16 4 -3 +BITMAP +80 +80 +80 +80 +40 +40 +20 +18 +20 +40 +40 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23AD +ENCODING 9133 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 16 0 -3 +BITMAP +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +10 +10 +20 +C0 +ENDCHAR +STARTCHAR uni23AE +ENCODING 9134 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 16 4 -3 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni23AF +ENCODING 9135 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 1 0 -3 +BITMAP +FF80 +ENDCHAR +STARTCHAR uni23BA +ENCODING 9146 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 1 0 12 +BITMAP +FF80 +ENDCHAR +STARTCHAR uni23BB +ENCODING 9147 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 1 0 8 +BITMAP +FF80 +ENDCHAR +STARTCHAR uni23BC +ENCODING 9148 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 1 0 4 +BITMAP +FF80 +ENDCHAR +STARTCHAR uni23BD +ENCODING 9149 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 1 0 0 +BITMAP +FF80 +ENDCHAR +STARTCHAR uni23F4 +ENCODING 9204 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 9 2 0 +BITMAP +08 +18 +38 +78 +F8 +78 +38 +18 +08 +ENDCHAR +STARTCHAR uni23F5 +ENCODING 9205 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 9 2 0 +BITMAP +80 +C0 +E0 +F0 +F8 +F0 +E0 +C0 +80 +ENDCHAR +STARTCHAR uni23F6 +ENCODING 9206 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 5 0 2 +BITMAP +0800 +1C00 +3E00 +7F00 +FF80 +ENDCHAR +STARTCHAR uni23F7 +ENCODING 9207 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 5 0 2 +BITMAP +FF80 +7F00 +3E00 +1C00 +0800 +ENDCHAR +STARTCHAR uni23F8 +ENCODING 9208 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 7 2 1 +BITMAP +D8 +D8 +D8 +D8 +D8 +D8 +D8 +ENDCHAR +STARTCHAR uni23F9 +ENCODING 9209 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 1 1 +BITMAP +FE +FE +FE +FE +FE +FE +FE +ENDCHAR +STARTCHAR uni23FA +ENCODING 9210 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 1 1 +BITMAP +7C +FE +FE +FE +FE +FE +7C +ENDCHAR +STARTCHAR uni2400 +ENCODING 9216 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 5 16 2 -3 +BITMAP +88 +C8 +A8 +98 +88 +00 +88 +88 +88 +70 +00 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni2401 +ENCODING 9217 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 5 16 2 -3 +BITMAP +78 +80 +70 +08 +F0 +00 +70 +88 +88 +70 +00 +88 +88 +F8 +88 +88 +ENDCHAR +STARTCHAR uni2402 +ENCODING 9218 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 5 16 2 -3 +BITMAP +78 +80 +70 +08 +F0 +00 +F8 +20 +20 +20 +00 +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni2403 +ENCODING 9219 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 5 16 2 -3 +BITMAP +F8 +80 +F0 +80 +F8 +00 +F8 +20 +20 +20 +00 +88 +50 +20 +50 +88 +ENDCHAR +STARTCHAR uni2404 +ENCODING 9220 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 5 16 2 -3 +BITMAP +F8 +80 +F0 +80 +F8 +00 +70 +88 +88 +70 +00 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni2405 +ENCODING 9221 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 5 16 2 -3 +BITMAP +F8 +80 +F0 +80 +F8 +00 +C8 +A8 +98 +88 +00 +70 +88 +88 +90 +68 +ENDCHAR +STARTCHAR uni2406 +ENCODING 9222 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 5 16 2 -3 +BITMAP +70 +88 +F8 +88 +88 +00 +78 +80 +80 +78 +00 +88 +90 +E0 +90 +88 +ENDCHAR +STARTCHAR uni2407 +ENCODING 9223 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 5 16 2 -3 +BITMAP +F0 +88 +F0 +88 +F0 +00 +F8 +80 +F0 +80 +F8 +00 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni2408 +ENCODING 9224 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 2 1 +BITMAP +F0 +88 +F0 +88 +F0 +00 +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR uni2409 +ENCODING 9225 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 2 1 +BITMAP +88 +88 +F8 +88 +88 +00 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni240A +ENCODING 9226 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 2 1 +BITMAP +80 +80 +80 +80 +F8 +00 +F8 +80 +F0 +80 +80 +ENDCHAR +STARTCHAR uni240B +ENCODING 9227 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 2 1 +BITMAP +88 +88 +50 +50 +20 +00 +F8 +20 +20 +20 +20 +ENDCHAR +STARTCHAR uni240C +ENCODING 9228 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 2 1 +BITMAP +F8 +80 +F0 +80 +80 +00 +F8 +80 +F0 +80 +80 +ENDCHAR +STARTCHAR uni240D +ENCODING 9229 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 2 1 +BITMAP +78 +80 +80 +80 +78 +00 +F0 +88 +F0 +90 +88 +ENDCHAR +STARTCHAR uni240E +ENCODING 9230 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 2 1 +BITMAP +78 +80 +70 +08 +F0 +00 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni240F +ENCODING 9231 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 2 1 +BITMAP +78 +80 +70 +08 +F0 +00 +70 +20 +20 +20 +70 +ENDCHAR +STARTCHAR uni2410 +ENCODING 9232 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 5 16 2 -3 +BITMAP +F0 +88 +88 +88 +F0 +00 +80 +80 +80 +F8 +00 +F8 +80 +F0 +80 +F8 +ENDCHAR +STARTCHAR uni2411 +ENCODING 9233 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 5 16 2 -3 +BITMAP +F0 +88 +88 +88 +F0 +00 +78 +80 +80 +78 +00 +20 +60 +20 +20 +70 +ENDCHAR +STARTCHAR uni2412 +ENCODING 9234 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 5 16 2 -3 +BITMAP +F0 +88 +88 +88 +F0 +00 +78 +80 +80 +78 +00 +F0 +08 +70 +80 +F8 +ENDCHAR +STARTCHAR uni2413 +ENCODING 9235 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 5 16 2 -3 +BITMAP +F0 +88 +88 +88 +F0 +00 +78 +80 +80 +78 +00 +F0 +08 +70 +08 +F0 +ENDCHAR +STARTCHAR uni2414 +ENCODING 9236 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 5 16 2 -3 +BITMAP +F0 +88 +88 +88 +F0 +00 +78 +80 +80 +78 +00 +30 +50 +90 +F8 +10 +ENDCHAR +STARTCHAR uni2415 +ENCODING 9237 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 5 16 2 -3 +BITMAP +88 +C8 +A8 +98 +88 +00 +70 +88 +F8 +88 +00 +88 +90 +E0 +90 +88 +ENDCHAR +STARTCHAR uni2416 +ENCODING 9238 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 5 16 2 -3 +BITMAP +78 +80 +70 +08 +F0 +00 +88 +50 +20 +20 +00 +88 +C8 +A8 +98 +88 +ENDCHAR +STARTCHAR uni2417 +ENCODING 9239 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 5 16 2 -3 +BITMAP +F8 +80 +F0 +80 +F8 +00 +F8 +20 +20 +20 +00 +F0 +88 +F0 +88 +F0 +ENDCHAR +STARTCHAR uni2418 +ENCODING 9240 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 5 16 2 -3 +BITMAP +78 +80 +80 +78 +00 +70 +88 +F8 +88 +88 +00 +88 +C8 +A8 +98 +88 +ENDCHAR +STARTCHAR uni2419 +ENCODING 9241 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 5 11 2 1 +BITMAP +F8 +80 +F0 +80 +F8 +00 +88 +D8 +A8 +88 +88 +ENDCHAR +STARTCHAR uni241A +ENCODING 9242 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 5 16 2 -3 +BITMAP +78 +80 +70 +08 +F0 +00 +88 +88 +88 +70 +00 +F0 +88 +F0 +88 +F0 +ENDCHAR +STARTCHAR uni241B +ENCODING 9243 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 5 16 2 -3 +BITMAP +F8 +80 +F0 +80 +F8 +00 +78 +80 +70 +08 +F0 +00 +78 +80 +80 +78 +ENDCHAR +STARTCHAR uni241C +ENCODING 9244 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 5 11 2 1 +BITMAP +F8 +80 +F0 +80 +80 +00 +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR uni241D +ENCODING 9245 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 5 11 2 1 +BITMAP +78 +80 +B8 +88 +78 +00 +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR uni241E +ENCODING 9246 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 5 11 2 1 +BITMAP +F0 +88 +F0 +88 +88 +00 +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR uni241F +ENCODING 9247 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 5 11 2 1 +BITMAP +88 +88 +88 +88 +70 +00 +78 +80 +70 +08 +F0 +ENDCHAR +STARTCHAR uni2420 +ENCODING 9248 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 2 1 +BITMAP +78 +80 +70 +08 +F0 +00 +F0 +88 +F0 +80 +80 +ENDCHAR +STARTCHAR uni2421 +ENCODING 9249 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 5 16 2 -3 +BITMAP +F0 +88 +88 +88 +F0 +00 +F8 +80 +F0 +80 +F8 +00 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni2424 +ENCODING 9252 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 11 2 1 +BITMAP +88 +C8 +A8 +98 +88 +00 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR SF100000 +ENCODING 9472 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 1 0 5 +BITMAP +FF80 +ENDCHAR +STARTCHAR uni2501 +ENCODING 9473 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 3 0 4 +BITMAP +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR SF110000 +ENCODING 9474 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 16 4 -3 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2503 +ENCODING 9475 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 16 3 -3 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2504 +ENCODING 9476 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 1 0 5 +BITMAP +DB +ENDCHAR +STARTCHAR uni2505 +ENCODING 9477 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 3 0 4 +BITMAP +DB +DB +DB +ENDCHAR +STARTCHAR uni2506 +ENCODING 9478 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 15 4 -2 +BITMAP +80 +80 +80 +80 +00 +80 +80 +80 +80 +00 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2507 +ENCODING 9479 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 15 3 -2 +BITMAP +E0 +E0 +E0 +E0 +00 +E0 +E0 +E0 +E0 +00 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2508 +ENCODING 9480 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 1 0 6 +BITMAP +AB +ENDCHAR +STARTCHAR uni2509 +ENCODING 9481 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 3 0 5 +BITMAP +AB +AB +AB +ENDCHAR +STARTCHAR uni250A +ENCODING 9482 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 15 4 -2 +BITMAP +80 +80 +80 +00 +80 +80 +80 +00 +80 +80 +80 +00 +80 +80 +80 +ENDCHAR +STARTCHAR uni250B +ENCODING 9483 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 15 3 -2 +BITMAP +E0 +E0 +E0 +00 +E0 +E0 +E0 +00 +E0 +E0 +E0 +00 +E0 +E0 +E0 +ENDCHAR +STARTCHAR SF010000 +ENCODING 9484 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 9 4 -3 +BITMAP +F8 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni250D +ENCODING 9485 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 10 4 -3 +BITMAP +F8 +F8 +F8 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni250E +ENCODING 9486 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 3 -3 +BITMAP +FC +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni250F +ENCODING 9487 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 3 -3 +BITMAP +FC +FC +FC +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR SF030000 +ENCODING 9488 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 9 0 -3 +BITMAP +F8 +08 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni2511 +ENCODING 9489 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 10 0 -3 +BITMAP +F8 +F8 +F8 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni2512 +ENCODING 9490 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 0 -3 +BITMAP +FC +1C +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR uni2513 +ENCODING 9491 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 0 -3 +BITMAP +FC +FC +FC +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR SF020000 +ENCODING 9492 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 8 4 5 +BITMAP +80 +80 +80 +80 +80 +80 +80 +F8 +ENDCHAR +STARTCHAR uni2515 +ENCODING 9493 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 9 4 4 +BITMAP +80 +80 +80 +80 +80 +80 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni2516 +ENCODING 9494 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 3 5 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +FC +ENDCHAR +STARTCHAR uni2517 +ENCODING 9495 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 3 4 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +FC +FC +FC +ENDCHAR +STARTCHAR SF040000 +ENCODING 9496 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 8 0 5 +BITMAP +08 +08 +08 +08 +08 +08 +08 +F8 +ENDCHAR +STARTCHAR uni2519 +ENCODING 9497 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 9 0 4 +BITMAP +08 +08 +08 +08 +08 +08 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni251A +ENCODING 9498 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 0 5 +BITMAP +1C +1C +1C +1C +1C +1C +1C +FC +ENDCHAR +STARTCHAR uni251B +ENCODING 9499 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 0 4 +BITMAP +1C +1C +1C +1C +1C +1C +FC +FC +FC +ENDCHAR +STARTCHAR SF080000 +ENCODING 9500 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 16 4 -3 +BITMAP +80 +80 +80 +80 +80 +80 +80 +F8 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni251D +ENCODING 9501 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 16 4 -3 +BITMAP +80 +80 +80 +80 +80 +80 +F8 +F8 +F8 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni251E +ENCODING 9502 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 3 -3 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +FC +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni251F +ENCODING 9503 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 3 -3 +BITMAP +40 +40 +40 +40 +40 +40 +40 +FC +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2520 +ENCODING 9504 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 3 -3 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +FC +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2521 +ENCODING 9505 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 3 -3 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +FC +FC +FC +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni2522 +ENCODING 9506 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 3 -3 +BITMAP +40 +40 +40 +40 +40 +40 +FC +FC +FC +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2523 +ENCODING 9507 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 3 -3 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +FC +FC +FC +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR SF090000 +ENCODING 9508 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 16 0 -3 +BITMAP +08 +08 +08 +08 +08 +08 +08 +F8 +08 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni2525 +ENCODING 9509 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 16 0 -3 +BITMAP +08 +08 +08 +08 +08 +08 +F8 +F8 +F8 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni2526 +ENCODING 9510 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 0 -3 +BITMAP +1C +1C +1C +1C +1C +1C +1C +FC +08 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni2527 +ENCODING 9511 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 0 -3 +BITMAP +08 +08 +08 +08 +08 +08 +08 +FC +1C +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR uni2528 +ENCODING 9512 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 0 -3 +BITMAP +1C +1C +1C +1C +1C +1C +1C +FC +1C +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR uni2529 +ENCODING 9513 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 0 -3 +BITMAP +1C +1C +1C +1C +1C +1C +FC +FC +FC +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni252A +ENCODING 9514 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 0 -3 +BITMAP +08 +08 +08 +08 +08 +08 +FC +FC +FC +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR uni252B +ENCODING 9515 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 0 -3 +BITMAP +1C +1C +1C +1C +1C +1C +FC +FC +FC +1C +1C +1C +1C +1C +1C +1C +ENDCHAR +STARTCHAR SF060000 +ENCODING 9516 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 -3 +BITMAP +FF80 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR uni252D +ENCODING 9517 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 10 0 -3 +BITMAP +F800 +FF80 +F800 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR uni252E +ENCODING 9518 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 10 0 -3 +BITMAP +0F80 +FF80 +0F80 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR uni252F +ENCODING 9519 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 10 0 -3 +BITMAP +FF80 +FF80 +FF80 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR uni2530 +ENCODING 9520 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 -3 +BITMAP +FF80 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR uni2531 +ENCODING 9521 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 10 0 -3 +BITMAP +FC00 +FF80 +FC00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR uni2532 +ENCODING 9522 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 10 0 -3 +BITMAP +1F80 +FF80 +1F80 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR uni2533 +ENCODING 9523 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 10 0 -3 +BITMAP +FF80 +FF80 +FF80 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR SF070000 +ENCODING 9524 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 8 0 5 +BITMAP +0800 +0800 +0800 +0800 +0800 +0800 +0800 +FF80 +ENDCHAR +STARTCHAR uni2535 +ENCODING 9525 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 4 +BITMAP +0800 +0800 +0800 +0800 +0800 +0800 +F800 +FF80 +F800 +ENDCHAR +STARTCHAR uni2536 +ENCODING 9526 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 4 +BITMAP +0800 +0800 +0800 +0800 +0800 +0800 +0F80 +FF80 +0F80 +ENDCHAR +STARTCHAR uni2537 +ENCODING 9527 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 4 +BITMAP +0800 +0800 +0800 +0800 +0800 +0800 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR uni2538 +ENCODING 9528 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 8 0 5 +BITMAP +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +FF80 +ENDCHAR +STARTCHAR uni2539 +ENCODING 9529 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 4 +BITMAP +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +FC00 +FF80 +FC00 +ENDCHAR +STARTCHAR uni253A +ENCODING 9530 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 4 +BITMAP +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1F80 +FF80 +1F80 +ENDCHAR +STARTCHAR uni253B +ENCODING 9531 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 4 +BITMAP +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR SF050000 +ENCODING 9532 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +0800 +0800 +0800 +0800 +0800 +0800 +0800 +FF80 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR uni253D +ENCODING 9533 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +0800 +0800 +0800 +0800 +0800 +0800 +F800 +FF80 +F800 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR uni253E +ENCODING 9534 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +0800 +0800 +0800 +0800 +0800 +0800 +0F80 +FF80 +0F80 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR uni253F +ENCODING 9535 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +0800 +0800 +0800 +0800 +0800 +0800 +FF80 +FF80 +FF80 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR uni2540 +ENCODING 9536 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +FF80 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR uni2541 +ENCODING 9537 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +0800 +0800 +0800 +0800 +0800 +0800 +0800 +FF80 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR uni2542 +ENCODING 9538 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +FF80 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR uni2543 +ENCODING 9539 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +FC00 +FF80 +FC00 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR uni2544 +ENCODING 9540 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1F80 +FF80 +1F80 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR uni2545 +ENCODING 9541 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +0800 +0800 +0800 +0800 +0800 +0800 +FC00 +FF80 +FC00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR uni2546 +ENCODING 9542 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +0800 +0800 +0800 +0800 +0800 +0800 +1F80 +FF80 +1F80 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR uni2547 +ENCODING 9543 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +FF80 +FF80 +FF80 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR uni2548 +ENCODING 9544 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +0800 +0800 +0800 +0800 +0800 +0800 +FF80 +FF80 +FF80 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR uni2549 +ENCODING 9545 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +FC00 +FF80 +FC00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR uni254A +ENCODING 9546 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1F80 +FF80 +1F80 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR uni254B +ENCODING 9547 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +FF80 +FF80 +FF80 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR uni254C +ENCODING 9548 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 1 0 5 +BITMAP +EF +ENDCHAR +STARTCHAR uni254D +ENCODING 9549 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 3 0 4 +BITMAP +EF +EF +EF +ENDCHAR +STARTCHAR uni254E +ENCODING 9550 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 15 4 -2 +BITMAP +80 +80 +80 +80 +80 +80 +80 +00 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni254F +ENCODING 9551 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 15 3 -2 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +00 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR SF430000 +ENCODING 9552 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 3 0 4 +BITMAP +FF80 +0000 +FF80 +ENDCHAR +STARTCHAR SF240000 +ENCODING 9553 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 16 3 -3 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF510000 +ENCODING 9554 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 10 4 -3 +BITMAP +F8 +80 +F8 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR SF520000 +ENCODING 9555 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 3 -3 +BITMAP +FC +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF390000 +ENCODING 9556 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 3 -3 +BITMAP +FC +80 +BC +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF220000 +ENCODING 9557 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 10 0 -3 +BITMAP +F8 +08 +F8 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR SF210000 +ENCODING 9558 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 0 -3 +BITMAP +FC +14 +14 +14 +14 +14 +14 +14 +14 +ENDCHAR +STARTCHAR SF250000 +ENCODING 9559 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 10 0 -3 +BITMAP +FC +04 +F4 +14 +14 +14 +14 +14 +14 +14 +ENDCHAR +STARTCHAR SF500000 +ENCODING 9560 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 9 4 4 +BITMAP +80 +80 +80 +80 +80 +80 +F8 +80 +F8 +ENDCHAR +STARTCHAR SF490000 +ENCODING 9561 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 3 5 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +FC +ENDCHAR +STARTCHAR SF380000 +ENCODING 9562 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 3 4 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +BC +80 +FC +ENDCHAR +STARTCHAR SF280000 +ENCODING 9563 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 9 0 4 +BITMAP +08 +08 +08 +08 +08 +08 +F8 +08 +F8 +ENDCHAR +STARTCHAR SF270000 +ENCODING 9564 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 0 5 +BITMAP +14 +14 +14 +14 +14 +14 +14 +FC +ENDCHAR +STARTCHAR SF260000 +ENCODING 9565 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 9 0 4 +BITMAP +14 +14 +14 +14 +14 +14 +F4 +04 +FC +ENDCHAR +STARTCHAR SF360000 +ENCODING 9566 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 16 4 -3 +BITMAP +80 +80 +80 +80 +80 +80 +F8 +80 +F8 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR SF370000 +ENCODING 9567 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 3 -3 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +A0 +BC +A0 +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF420000 +ENCODING 9568 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 3 -3 +BITMAP +A0 +A0 +A0 +A0 +A0 +A0 +BC +80 +BC +A0 +A0 +A0 +A0 +A0 +A0 +A0 +ENDCHAR +STARTCHAR SF190000 +ENCODING 9569 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 16 0 -3 +BITMAP +08 +08 +08 +08 +08 +08 +F8 +08 +F8 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR SF200000 +ENCODING 9570 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 0 -3 +BITMAP +14 +14 +14 +14 +14 +14 +14 +F4 +14 +14 +14 +14 +14 +14 +14 +14 +ENDCHAR +STARTCHAR SF230000 +ENCODING 9571 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 0 -3 +BITMAP +14 +14 +14 +14 +14 +14 +F4 +04 +F4 +14 +14 +14 +14 +04 +14 +14 +ENDCHAR +STARTCHAR SF470000 +ENCODING 9572 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 10 0 -3 +BITMAP +FF80 +0000 +FF80 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR SF480000 +ENCODING 9573 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 -3 +BITMAP +FF80 +1400 +1400 +1400 +1400 +1400 +1400 +1400 +1400 +ENDCHAR +STARTCHAR SF410000 +ENCODING 9574 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 10 0 -3 +BITMAP +FF80 +0000 +F780 +1400 +1400 +1400 +1400 +1400 +1400 +1400 +ENDCHAR +STARTCHAR SF450000 +ENCODING 9575 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 4 +BITMAP +0800 +0800 +0800 +0800 +0800 +0800 +FF80 +0000 +FF80 +ENDCHAR +STARTCHAR SF460000 +ENCODING 9576 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 8 0 5 +BITMAP +1400 +1400 +1400 +1400 +1400 +1400 +1400 +FF80 +ENDCHAR +STARTCHAR SF400000 +ENCODING 9577 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 4 +BITMAP +1400 +1400 +1400 +1400 +1400 +1400 +F780 +0000 +FF80 +ENDCHAR +STARTCHAR SF540000 +ENCODING 9578 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +0800 +0800 +0800 +0800 +0800 +0800 +FF80 +0000 +FF80 +0800 +0800 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR SF530000 +ENCODING 9579 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +1400 +1400 +1400 +1400 +1400 +1400 +1400 +F780 +1400 +1400 +1400 +1400 +1400 +1400 +1400 +1400 +ENDCHAR +STARTCHAR SF440000 +ENCODING 9580 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +1400 +1400 +1400 +1400 +1400 +1400 +F780 +0000 +F780 +1400 +1400 +1400 +1400 +1400 +1400 +1400 +ENDCHAR +STARTCHAR uni256D +ENCODING 9581 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 9 4 -3 +BITMAP +38 +40 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni256E +ENCODING 9582 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 9 0 -3 +BITMAP +E0 +10 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR uni256F +ENCODING 9583 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 8 0 5 +BITMAP +08 +08 +08 +08 +08 +08 +10 +E0 +ENDCHAR +STARTCHAR uni2570 +ENCODING 9584 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 8 4 5 +BITMAP +80 +80 +80 +80 +80 +80 +40 +38 +ENDCHAR +STARTCHAR uni2571 +ENCODING 9585 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +0080 +0080 +0100 +0100 +0200 +0400 +0400 +0800 +0800 +1000 +1000 +2000 +4000 +4000 +8000 +8000 +ENDCHAR +STARTCHAR uni2572 +ENCODING 9586 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +8000 +8000 +4000 +4000 +2000 +1000 +1000 +0800 +0800 +0400 +0400 +0200 +0100 +0100 +0080 +0080 +ENDCHAR +STARTCHAR uni2573 +ENCODING 9587 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +8080 +8080 +4100 +4100 +2200 +1400 +1400 +0800 +0800 +1400 +1400 +2200 +4100 +4100 +8080 +8080 +ENDCHAR +STARTCHAR uni2574 +ENCODING 9588 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 1 0 5 +BITMAP +F8 +ENDCHAR +STARTCHAR uni2575 +ENCODING 9589 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 8 4 5 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2576 +ENCODING 9590 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 1 4 5 +BITMAP +F8 +ENDCHAR +STARTCHAR uni2577 +ENCODING 9591 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 9 4 -3 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2578 +ENCODING 9592 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 3 0 4 +BITMAP +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni2579 +ENCODING 9593 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 8 3 5 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni257A +ENCODING 9594 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 3 4 4 +BITMAP +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni257B +ENCODING 9595 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 9 3 -3 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni257C +ENCODING 9596 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 3 0 4 +BITMAP +0F80 +FF80 +0F80 +ENDCHAR +STARTCHAR uni257D +ENCODING 9597 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 16 3 -3 +BITMAP +40 +40 +40 +40 +40 +40 +40 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni257E +ENCODING 9598 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 3 0 4 +BITMAP +F800 +FF80 +F800 +ENDCHAR +STARTCHAR uni257F +ENCODING 9599 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 16 3 -3 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR upblock +ENCODING 9600 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 8 0 5 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR uni2581 +ENCODING 9601 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 2 0 -3 +BITMAP +FF80 +FF80 +ENDCHAR +STARTCHAR uni2582 +ENCODING 9602 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 4 0 -3 +BITMAP +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR uni2583 +ENCODING 9603 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 6 0 -3 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR dnblock +ENCODING 9604 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 8 0 -3 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR uni2585 +ENCODING 9605 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 10 0 -3 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR uni2586 +ENCODING 9606 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 12 0 -3 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR uni2587 +ENCODING 9607 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 14 0 -3 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR block +ENCODING 9608 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR uni2589 +ENCODING 9609 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +FF +ENDCHAR +STARTCHAR uni258A +ENCODING 9610 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 16 0 -3 +BITMAP +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +ENDCHAR +STARTCHAR uni258B +ENCODING 9611 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 16 0 -3 +BITMAP +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR lfblock +ENCODING 9612 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 16 0 -3 +BITMAP +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni258D +ENCODING 9613 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 16 0 -3 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR uni258E +ENCODING 9614 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 16 0 -3 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni258F +ENCODING 9615 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 16 0 -3 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR rtblock +ENCODING 9616 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 16 4 -3 +BITMAP +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR ltshade +ENCODING 9617 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 16 0 -3 +BITMAP +C3 +18 +C3 +18 +C3 +18 +C3 +18 +C3 +18 +C3 +18 +C3 +18 +C3 +18 +ENDCHAR +STARTCHAR shade +ENCODING 9618 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +DB00 +2480 +DB00 +2480 +DB00 +2480 +DB00 +2480 +DB00 +2480 +DB00 +2480 +DB00 +2480 +DB00 +2480 +ENDCHAR +STARTCHAR dkshade +ENCODING 9619 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +3C80 +E780 +3C80 +E780 +3C80 +E780 +3C80 +E780 +3C80 +E780 +3C80 +E780 +3C80 +E780 +3C80 +E780 +ENDCHAR +STARTCHAR uni2594 +ENCODING 9620 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 2 0 11 +BITMAP +FF80 +FF80 +ENDCHAR +STARTCHAR uni2595 +ENCODING 9621 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 2 16 7 -3 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR uni2596 +ENCODING 9622 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 8 0 -3 +BITMAP +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni2597 +ENCODING 9623 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 8 4 -3 +BITMAP +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni2598 +ENCODING 9624 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 8 0 5 +BITMAP +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni2599 +ENCODING 9625 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR uni259A +ENCODING 9626 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR uni259B +ENCODING 9627 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +ENDCHAR +STARTCHAR uni259C +ENCODING 9628 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +ENDCHAR +STARTCHAR uni259D +ENCODING 9629 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 8 4 5 +BITMAP +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni259E +ENCODING 9630 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +ENDCHAR +STARTCHAR uni259F +ENCODING 9631 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 16 0 -3 +BITMAP +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR filledbox +ENCODING 9632 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +FE +FE +FE +FE +FE +FE +ENDCHAR +STARTCHAR H22073 +ENCODING 9633 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +82 +82 +82 +82 +82 +FE +ENDCHAR +STARTCHAR uni25A2 +ENCODING 9634 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +7C +82 +82 +82 +82 +82 +7C +ENDCHAR +STARTCHAR uni25A3 +ENCODING 9635 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +82 +BA +BA +BA +82 +FE +ENDCHAR +STARTCHAR uni25A4 +ENCODING 9636 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +82 +FE +82 +FE +82 +FE +ENDCHAR +STARTCHAR uni25A5 +ENCODING 9637 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +AA +AA +AA +AA +AA +FE +ENDCHAR +STARTCHAR uni25A6 +ENCODING 9638 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +AA +FE +AA +FE +AA +FE +ENDCHAR +STARTCHAR uni25A7 +ENCODING 9639 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +CA +A6 +92 +CA +A6 +FE +ENDCHAR +STARTCHAR uni25A8 +ENCODING 9640 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +A6 +CA +92 +A6 +CA +FE +ENDCHAR +STARTCHAR uni25A9 +ENCODING 9641 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +D6 +AA +D6 +AA +D6 +FE +ENDCHAR +STARTCHAR H18543 +ENCODING 9642 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 5 1 1 +BITMAP +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR H18551 +ENCODING 9643 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 5 1 1 +BITMAP +F8 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR filledrect +ENCODING 9644 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 0 1 +BITMAP +FE +FE +FE +FE +FE +ENDCHAR +STARTCHAR uni25AD +ENCODING 9645 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 5 0 1 +BITMAP +FE +82 +82 +82 +FE +ENDCHAR +STARTCHAR uni25AE +ENCODING 9646 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 7 1 0 +BITMAP +F8 +F8 +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni25AF +ENCODING 9647 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 7 1 0 +BITMAP +F8 +88 +88 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni25B0 +ENCODING 9648 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 1 +BITMAP +3F +3E +7E +7C +FC +ENDCHAR +STARTCHAR uni25B1 +ENCODING 9649 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 1 +BITMAP +3F +22 +42 +44 +FC +ENDCHAR +STARTCHAR triagup +ENCODING 9650 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +10 +10 +38 +38 +7C +7C +FE +FE +ENDCHAR +STARTCHAR uni25B3 +ENCODING 9651 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +10 +10 +28 +28 +44 +44 +82 +FE +ENDCHAR +STARTCHAR uni25B4 +ENCODING 9652 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 6 1 1 +BITMAP +20 +20 +70 +70 +F8 +F8 +ENDCHAR +STARTCHAR uni25B5 +ENCODING 9653 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 6 1 1 +BITMAP +20 +20 +50 +50 +88 +F8 +ENDCHAR +STARTCHAR uni25B6 +ENCODING 9654 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 7 0 0 +BITMAP +C0 +F0 +FC +FF +FC +F0 +C0 +ENDCHAR +STARTCHAR uni25B7 +ENCODING 9655 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 7 0 0 +BITMAP +C0 +B0 +8C +83 +8C +B0 +C0 +ENDCHAR +STARTCHAR uni25B8 +ENCODING 9656 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 5 1 1 +BITMAP +C0 +F0 +FC +F0 +C0 +ENDCHAR +STARTCHAR uni25B9 +ENCODING 9657 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 5 1 1 +BITMAP +C0 +B0 +8C +B0 +C0 +ENDCHAR +STARTCHAR triagrt +ENCODING 9658 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 1 +BITMAP +E0 +FC +FF +FC +E0 +ENDCHAR +STARTCHAR uni25BB +ENCODING 9659 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 1 +BITMAP +E0 +9C +83 +9C +E0 +ENDCHAR +STARTCHAR triagdn +ENCODING 9660 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +FE +FE +7C +7C +38 +38 +10 +10 +ENDCHAR +STARTCHAR uni25BD +ENCODING 9661 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +FE +82 +44 +44 +28 +28 +10 +10 +ENDCHAR +STARTCHAR uni25BE +ENCODING 9662 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 6 1 1 +BITMAP +F8 +F8 +70 +70 +20 +20 +ENDCHAR +STARTCHAR uni25BF +ENCODING 9663 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 6 1 1 +BITMAP +F8 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR uni25C0 +ENCODING 9664 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 7 0 0 +BITMAP +03 +0F +3F +FF +3F +0F +03 +ENDCHAR +STARTCHAR uni25C1 +ENCODING 9665 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 7 0 0 +BITMAP +03 +0D +31 +C1 +31 +0D +03 +ENDCHAR +STARTCHAR uni25C2 +ENCODING 9666 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 5 1 1 +BITMAP +0C +3C +FC +3C +0C +ENDCHAR +STARTCHAR uni25C3 +ENCODING 9667 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 5 1 1 +BITMAP +0C +34 +C4 +34 +0C +ENDCHAR +STARTCHAR triaglf +ENCODING 9668 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 1 +BITMAP +07 +3F +FF +3F +07 +ENDCHAR +STARTCHAR uni25C5 +ENCODING 9669 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 1 +BITMAP +07 +39 +C1 +39 +07 +ENDCHAR +STARTCHAR uni25C6 +ENCODING 9670 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +10 +38 +7C +FE +7C +38 +10 +ENDCHAR +STARTCHAR uni25C7 +ENCODING 9671 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +10 +28 +44 +82 +44 +28 +10 +ENDCHAR +STARTCHAR uni25C8 +ENCODING 9672 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +10 +28 +54 +BA +54 +28 +10 +ENDCHAR +STARTCHAR uni25C9 +ENCODING 9673 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +38 +44 +BA +BA +BA +44 +38 +ENDCHAR +STARTCHAR lozenge +ENCODING 9674 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 10 1 0 +BITMAP +20 +20 +50 +50 +88 +88 +50 +50 +20 +20 +ENDCHAR +STARTCHAR circle +ENCODING 9675 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +38 +44 +82 +82 +82 +44 +38 +ENDCHAR +STARTCHAR uni25CC +ENCODING 9676 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +10 +44 +00 +82 +00 +44 +10 +ENDCHAR +STARTCHAR uni25CD +ENCODING 9677 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +38 +6C +AA +AA +AA +6C +38 +ENDCHAR +STARTCHAR uni25CE +ENCODING 9678 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +38 +44 +92 +AA +92 +44 +38 +ENDCHAR +STARTCHAR H18533 +ENCODING 9679 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +38 +7C +FE +FE +FE +7C +38 +ENDCHAR +STARTCHAR uni25D0 +ENCODING 9680 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +38 +64 +E2 +E2 +E2 +64 +38 +ENDCHAR +STARTCHAR uni25D1 +ENCODING 9681 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +38 +4C +8E +8E +8E +4C +38 +ENDCHAR +STARTCHAR uni25D2 +ENCODING 9682 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +38 +44 +82 +82 +FE +7C +38 +ENDCHAR +STARTCHAR uni25D3 +ENCODING 9683 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +38 +7C +FE +82 +82 +44 +38 +ENDCHAR +STARTCHAR uni25D4 +ENCODING 9684 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +38 +5C +9E +9E +82 +44 +38 +ENDCHAR +STARTCHAR uni25D5 +ENCODING 9685 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +38 +4C +8E +8E +FE +7C +38 +ENDCHAR +STARTCHAR uni25D6 +ENCODING 9686 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 7 0 0 +BITMAP +30 +70 +F0 +F0 +F0 +70 +30 +ENDCHAR +STARTCHAR uni25D7 +ENCODING 9687 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 7 3 0 +BITMAP +C0 +E0 +F0 +F0 +F0 +E0 +C0 +ENDCHAR +STARTCHAR invbullet +ENCODING 9688 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 8 1 1 +BITMAP +FC +FC +CC +84 +84 +CC +FC +FC +ENDCHAR +STARTCHAR uni25DC +ENCODING 9692 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 4 0 3 +BITMAP +30 +40 +80 +80 +ENDCHAR +STARTCHAR uni25DD +ENCODING 9693 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 4 3 3 +BITMAP +C0 +20 +10 +10 +ENDCHAR +STARTCHAR uni25DE +ENCODING 9694 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 4 3 0 +BITMAP +10 +10 +20 +C0 +ENDCHAR +STARTCHAR uni25DF +ENCODING 9695 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 4 0 0 +BITMAP +80 +80 +40 +30 +ENDCHAR +STARTCHAR uni25E0 +ENCODING 9696 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 4 0 3 +BITMAP +38 +44 +82 +82 +ENDCHAR +STARTCHAR uni25E1 +ENCODING 9697 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 4 0 0 +BITMAP +82 +82 +44 +38 +ENDCHAR +STARTCHAR uni25E2 +ENCODING 9698 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +02 +06 +0E +1E +3E +7E +FE +ENDCHAR +STARTCHAR uni25E3 +ENCODING 9699 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +80 +C0 +E0 +F0 +F8 +FC +FE +ENDCHAR +STARTCHAR uni25E4 +ENCODING 9700 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +FC +F8 +F0 +E0 +C0 +80 +ENDCHAR +STARTCHAR uni25E5 +ENCODING 9701 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +7E +3E +1E +0E +06 +02 +ENDCHAR +STARTCHAR openbullet +ENCODING 9702 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 4 2 3 +BITMAP +60 +90 +90 +60 +ENDCHAR +STARTCHAR uni25E7 +ENCODING 9703 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +E2 +E2 +E2 +E2 +E2 +FE +ENDCHAR +STARTCHAR uni25E8 +ENCODING 9704 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +8E +8E +8E +8E +8E +FE +ENDCHAR +STARTCHAR uni25E9 +ENCODING 9705 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +FE +FA +F2 +E2 +C2 +FE +ENDCHAR +STARTCHAR uni25EA +ENCODING 9706 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +86 +8E +9E +BE +FE +FE +ENDCHAR +STARTCHAR uni25EB +ENCODING 9707 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +92 +92 +92 +92 +92 +FE +ENDCHAR +STARTCHAR uni25EC +ENCODING 9708 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +10 +10 +28 +28 +44 +54 +82 +FE +ENDCHAR +STARTCHAR uni25ED +ENCODING 9709 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +10 +10 +28 +28 +64 +64 +E2 +FE +ENDCHAR +STARTCHAR uni25EE +ENCODING 9710 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +10 +10 +28 +28 +4C +4C +8E +FE +ENDCHAR +STARTCHAR uni25EF +ENCODING 9711 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +3E00 +4100 +8080 +8080 +8080 +8080 +8080 +4100 +3E00 +ENDCHAR +STARTCHAR uni25F0 +ENCODING 9712 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +92 +92 +F2 +82 +82 +FE +ENDCHAR +STARTCHAR uni25F1 +ENCODING 9713 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +82 +82 +F2 +92 +92 +FE +ENDCHAR +STARTCHAR uni25F2 +ENCODING 9714 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +82 +82 +9E +92 +92 +FE +ENDCHAR +STARTCHAR uni25F3 +ENCODING 9715 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +92 +92 +9E +82 +82 +FE +ENDCHAR +STARTCHAR uni25F4 +ENCODING 9716 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +38 +54 +92 +F2 +82 +44 +38 +ENDCHAR +STARTCHAR uni25F5 +ENCODING 9717 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +38 +44 +82 +F2 +92 +54 +38 +ENDCHAR +STARTCHAR uni25F6 +ENCODING 9718 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +38 +44 +82 +9E +92 +54 +38 +ENDCHAR +STARTCHAR uni25F7 +ENCODING 9719 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +38 +54 +92 +9E +82 +44 +38 +ENDCHAR +STARTCHAR uni25F8 +ENCODING 9720 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +84 +88 +90 +A0 +C0 +80 +ENDCHAR +STARTCHAR uni25F9 +ENCODING 9721 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +42 +22 +12 +0A +06 +02 +ENDCHAR +STARTCHAR uni25FA +ENCODING 9722 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +80 +C0 +A0 +90 +88 +84 +FE +ENDCHAR +STARTCHAR uni25FB +ENCODING 9723 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 6 1 2 +BITMAP +FC +84 +84 +84 +84 +FC +ENDCHAR +STARTCHAR uni25FC +ENCODING 9724 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 6 1 2 +BITMAP +FC +FC +FC +FC +FC +FC +ENDCHAR +STARTCHAR uni25FD +ENCODING 9725 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 5 1 1 +BITMAP +F8 +88 +88 +88 +F8 +ENDCHAR +STARTCHAR uni25FE +ENCODING 9726 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 5 5 1 1 +BITMAP +F8 +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR uni25FF +ENCODING 9727 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +02 +06 +0A +12 +22 +42 +FE +ENDCHAR +STARTCHAR uni2600 +ENCODING 9728 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 1 +BITMAP +0800 +4900 +2A00 +1C00 +FF80 +1C00 +2A00 +4900 +0800 +ENDCHAR +STARTCHAR uni2602 +ENCODING 9730 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 9 11 0 0 +BITMAP +0800 +3E00 +7F00 +FF80 +FF80 +0800 +0800 +0800 +0800 +4800 +3000 +ENDCHAR +STARTCHAR uni2605 +ENCODING 9733 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 9 10 0 1 +BITMAP +0800 +0800 +1C00 +1C00 +FF80 +7F00 +3E00 +3E00 +7700 +6300 +ENDCHAR +STARTCHAR uni2606 +ENCODING 9734 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 9 10 0 1 +BITMAP +0800 +0800 +1400 +1400 +E380 +4100 +2200 +2A00 +5500 +6300 +ENDCHAR +STARTCHAR uni2609 +ENCODING 9737 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 2 +BITMAP +3C +42 +81 +99 +99 +81 +42 +3C +ENDCHAR +STARTCHAR uni260A +ENCODING 9738 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 10 0 1 +BITMAP +3C +42 +81 +81 +81 +81 +42 +A5 +A5 +42 +ENDCHAR +STARTCHAR uni260B +ENCODING 9739 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 10 0 1 +BITMAP +42 +A5 +A5 +42 +81 +81 +81 +81 +42 +3C +ENDCHAR +STARTCHAR uni260C +ENCODING 9740 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +01 +3A +44 +82 +82 +82 +44 +38 +ENDCHAR +STARTCHAR uni260D +ENCODING 9741 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +0E +11 +11 +11 +0E +08 +18 +10 +70 +88 +88 +88 +70 +ENDCHAR +STARTCHAR uni260E +ENCODING 9742 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +3C +7E +E7 +DB +3C +7E +66 +C3 +C3 +E7 +FF +ENDCHAR +STARTCHAR uni260F +ENCODING 9743 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +3C +5A +A5 +DB +24 +42 +5A +BD +BD +99 +FF +ENDCHAR +STARTCHAR uni2610 +ENCODING 9744 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 9 9 0 1 +BITMAP +FF80 +8080 +8080 +8080 +8080 +8080 +8080 +8080 +FF80 +ENDCHAR +STARTCHAR uni2611 +ENCODING 9745 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 9 0 1 +BITMAP +FF80 +8080 +8280 +8480 +A880 +9080 +9080 +8080 +FF80 +ENDCHAR +STARTCHAR uni2612 +ENCODING 9746 +SWIDTH 1000 0 +DWIDTH 9 0 +BBX 9 9 0 1 +BITMAP +FF80 +8080 +A280 +9480 +8880 +9480 +A280 +8080 +FF80 +ENDCHAR +STARTCHAR uni262A +ENCODING 9770 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +0E +30 +60 +C0 +C4 +CE +C4 +C0 +60 +30 +0E +ENDCHAR +STARTCHAR uni262F +ENCODING 9775 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 1 +BITMAP +3E00 +4100 +8480 +B080 +F980 +FF80 +EF80 +7F00 +3E00 +ENDCHAR +STARTCHAR uni2630 +ENCODING 9776 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 9 1 1 +BITMAP +FE +00 +00 +00 +FE +00 +00 +00 +FE +ENDCHAR +STARTCHAR uni2631 +ENCODING 9777 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 9 1 1 +BITMAP +EE +00 +00 +00 +FE +00 +00 +00 +FE +ENDCHAR +STARTCHAR uni2632 +ENCODING 9778 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 9 1 1 +BITMAP +FE +00 +00 +00 +EE +00 +00 +00 +FE +ENDCHAR +STARTCHAR uni2633 +ENCODING 9779 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 9 1 1 +BITMAP +EE +00 +00 +00 +EE +00 +00 +00 +FE +ENDCHAR +STARTCHAR uni2634 +ENCODING 9780 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 9 1 1 +BITMAP +FE +00 +00 +00 +FE +00 +00 +00 +EE +ENDCHAR +STARTCHAR uni2635 +ENCODING 9781 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 9 1 1 +BITMAP +EE +00 +00 +00 +FE +00 +00 +00 +EE +ENDCHAR +STARTCHAR uni2636 +ENCODING 9782 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 9 1 1 +BITMAP +FE +00 +00 +00 +EE +00 +00 +00 +EE +ENDCHAR +STARTCHAR uni2637 +ENCODING 9783 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 9 1 1 +BITMAP +EE +00 +00 +00 +EE +00 +00 +00 +EE +ENDCHAR +STARTCHAR uni2639 +ENCODING 9785 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 11 0 0 +BITMAP +3E00 +4100 +8080 +A280 +8080 +8080 +9C80 +A280 +8080 +4100 +3E00 +ENDCHAR +STARTCHAR smileface +ENCODING 9786 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 11 0 0 +BITMAP +3E00 +4100 +8080 +A280 +8080 +8080 +A280 +9C80 +8080 +4100 +3E00 +ENDCHAR +STARTCHAR invsmileface +ENCODING 9787 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 11 0 0 +BITMAP +3E00 +7F00 +FF80 +DD80 +FF80 +FF80 +DD80 +E380 +FF80 +7F00 +3E00 +ENDCHAR +STARTCHAR sun +ENCODING 9788 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 1 +BITMAP +0800 +4900 +2A00 +1400 +E380 +1400 +2A00 +4900 +0800 +ENDCHAR +STARTCHAR uni263D +ENCODING 9789 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +E0 +50 +28 +14 +14 +14 +14 +14 +28 +50 +E0 +ENDCHAR +STARTCHAR uni263E +ENCODING 9790 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +1C +28 +50 +A0 +A0 +A0 +A0 +A0 +50 +28 +1C +ENDCHAR +STARTCHAR uni263F +ENCODING 9791 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 15 1 -2 +BITMAP +82 +82 +44 +38 +44 +82 +82 +82 +44 +38 +10 +10 +7C +10 +10 +ENDCHAR +STARTCHAR female +ENCODING 9792 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 -2 +BITMAP +38 +44 +82 +82 +82 +44 +38 +10 +10 +7C +10 +10 +ENDCHAR +STARTCHAR uni2641 +ENCODING 9793 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +10 +10 +7C +10 +10 +38 +44 +82 +82 +82 +44 +38 +ENDCHAR +STARTCHAR male +ENCODING 9794 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +0380 +0180 +3A80 +4400 +8200 +8200 +8200 +4400 +3800 +ENDCHAR +STARTCHAR uni2643 +ENCODING 9795 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +01 +71 +89 +05 +05 +05 +09 +FF +01 +01 +01 +ENDCHAR +STARTCHAR uni2644 +ENCODING 9796 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +40 +40 +E0 +40 +5C +62 +41 +41 +41 +42 +42 +ENDCHAR +STARTCHAR uni2645 +ENCODING 9797 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 13 0 -1 +BITMAP +C980 +4900 +4900 +7F00 +4900 +4900 +C980 +0800 +1C00 +2200 +2200 +2200 +1C00 +ENDCHAR +STARTCHAR uni2646 +ENCODING 9798 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 13 0 0 +BITMAP +0800 +1C00 +4900 +EB80 +4900 +4900 +4900 +4900 +2A00 +1C00 +0800 +1C00 +0800 +ENDCHAR +STARTCHAR uni2647 +ENCODING 9799 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +F0 +88 +84 +84 +84 +88 +F0 +80 +80 +80 +FC +ENDCHAR +STARTCHAR uni2648 +ENCODING 9800 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 11 0 0 +BITMAP +4100 +A280 +A280 +1400 +1400 +1400 +0800 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR uni2649 +ENCODING 9801 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 11 0 0 +BITMAP +8080 +4100 +4100 +2200 +1C00 +2200 +4100 +4100 +4100 +2200 +1C00 +ENDCHAR +STARTCHAR uni264A +ENCODING 9802 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +81 +7E +24 +24 +24 +24 +24 +24 +24 +7E +81 +ENDCHAR +STARTCHAR uni264B +ENCODING 9803 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +63 +90 +90 +66 +09 +09 +C6 +3C +ENDCHAR +STARTCHAR uni264C +ENCODING 9804 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 11 0 0 +BITMAP +3C00 +4200 +4200 +4200 +2200 +6400 +9400 +9400 +6400 +0480 +0300 +ENDCHAR +STARTCHAR uni264D +ENCODING 9805 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 -3 +BITMAP +A8 +54 +56 +55 +55 +55 +55 +55 +55 +55 +03 +0D +01 +ENDCHAR +STARTCHAR uni264E +ENCODING 9806 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 1 +BITMAP +3C +42 +42 +42 +24 +E7 +00 +FF +ENDCHAR +STARTCHAR uni264F +ENCODING 9807 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 11 0 -1 +BITMAP +A800 +5400 +5400 +5400 +5400 +5400 +5400 +5400 +5400 +5480 +0300 +ENDCHAR +STARTCHAR uni2650 +ENCODING 9808 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 2 +BITMAP +1F +03 +05 +89 +51 +20 +50 +88 +ENDCHAR +STARTCHAR uni2651 +ENCODING 9809 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +A0 +50 +50 +50 +56 +59 +09 +16 +10 +10 +60 +ENDCHAR +STARTCHAR uni2652 +ENCODING 9810 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 9 0 1 +BITMAP +54 +55 +AA +2A +00 +54 +55 +AA +2A +ENDCHAR +STARTCHAR uni2653 +ENCODING 9811 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +81 +42 +42 +24 +24 +FF +24 +24 +42 +42 +81 +ENDCHAR +STARTCHAR uni2654 +ENCODING 9812 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +10 +38 +10 +6C +92 +92 +92 +92 +54 +7C +82 +82 +FE +ENDCHAR +STARTCHAR uni2655 +ENCODING 9813 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 11 0 0 +BITMAP +AA80 +AA80 +5500 +5500 +2200 +2200 +1400 +3E00 +4100 +4100 +7F00 +ENDCHAR +STARTCHAR uni2656 +ENCODING 9814 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +D6 +AA +FE +44 +7C +44 +44 +44 +44 +7C +82 +82 +FE +ENDCHAR +STARTCHAR uni2657 +ENCODING 9815 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +38 +44 +92 +BA +92 +44 +7C +44 +44 +82 +82 +FE +ENDCHAR +STARTCHAR uni2658 +ENCODING 9816 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +28 +38 +48 +E4 +84 +82 +8A +8A +91 +61 +41 +41 +7F +ENDCHAR +STARTCHAR uni2659 +ENCODING 9817 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +38 +44 +44 +44 +38 +44 +7C +82 +82 +FE +ENDCHAR +STARTCHAR uni265A +ENCODING 9818 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +10 +38 +10 +6C +92 +BA +BA +BA +54 +7C +82 +FE +FE +ENDCHAR +STARTCHAR uni265B +ENCODING 9819 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 11 0 0 +BITMAP +AA80 +AA80 +5D00 +7F00 +3E00 +3E00 +1C00 +3E00 +4100 +7F00 +7F00 +ENDCHAR +STARTCHAR uni265C +ENCODING 9820 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +D6 +FE +FE +44 +7C +7C +7C +7C +7C +7C +82 +FE +FE +ENDCHAR +STARTCHAR uni265D +ENCODING 9821 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 12 1 0 +BITMAP +38 +7C +EE +C6 +EE +7C +44 +7C +7C +82 +FE +FE +ENDCHAR +STARTCHAR uni265E +ENCODING 9822 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 0 +BITMAP +28 +38 +78 +9C +FC +FE +F6 +F6 +EF +1F +7F +41 +7F +ENDCHAR +STARTCHAR uni265F +ENCODING 9823 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +38 +7C +7C +7C +38 +44 +7C +82 +FE +FE +ENDCHAR +STARTCHAR spade +ENCODING 9824 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 10 0 0 +BITMAP +0800 +1C00 +3E00 +7F00 +7F00 +FF80 +FF80 +6B00 +0800 +1C00 +ENDCHAR +STARTCHAR uni2661 +ENCODING 9825 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 10 0 0 +BITMAP +6300 +9480 +8880 +8080 +8080 +4100 +4100 +2200 +1400 +0800 +ENDCHAR +STARTCHAR uni2662 +ENCODING 9826 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 1 +BITMAP +0800 +1400 +2200 +4100 +8080 +4100 +2200 +1400 +0800 +ENDCHAR +STARTCHAR club +ENCODING 9827 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 10 0 0 +BITMAP +1C00 +3E00 +3E00 +1C00 +7F00 +FF80 +FF80 +6B00 +0800 +1C00 +ENDCHAR +STARTCHAR uni2664 +ENCODING 9828 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 10 0 0 +BITMAP +0800 +1400 +2200 +4100 +4100 +8080 +9480 +6B00 +0800 +1C00 +ENDCHAR +STARTCHAR heart +ENCODING 9829 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 10 0 0 +BITMAP +6300 +F780 +FF80 +FF80 +FF80 +7F00 +7F00 +3E00 +1C00 +0800 +ENDCHAR +STARTCHAR diamond +ENCODING 9830 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 1 +BITMAP +0800 +1C00 +3E00 +7F00 +FF80 +7F00 +3E00 +1C00 +0800 +ENDCHAR +STARTCHAR uni2667 +ENCODING 9831 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 10 0 0 +BITMAP +1C00 +2200 +2200 +1400 +6300 +8080 +9480 +6B00 +0800 +1C00 +ENDCHAR +STARTCHAR uni2668 +ENCODING 9832 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR uni2669 +ENCODING 9833 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 4 11 1 0 +BITMAP +10 +10 +10 +10 +10 +10 +10 +10 +70 +F0 +60 +ENDCHAR +STARTCHAR musicalnote +ENCODING 9834 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 11 1 0 +BITMAP +10 +18 +14 +12 +12 +12 +14 +10 +70 +F0 +60 +ENDCHAR +STARTCHAR musicalnotedbl +ENCODING 9835 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 14 0 -3 +BITMAP +18 +1E +17 +11 +11 +11 +11 +11 +71 +F1 +61 +07 +0F +06 +ENDCHAR +STARTCHAR uni266C +ENCODING 9836 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +1F +1F +11 +1F +1F +11 +11 +11 +77 +FF +66 +ENDCHAR +STARTCHAR uni266D +ENCODING 9837 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 11 1 0 +BITMAP +80 +80 +80 +80 +B8 +C4 +84 +84 +84 +88 +F0 +ENDCHAR +STARTCHAR uni266E +ENCODING 9838 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +80 +80 +80 +8C +B4 +C4 +84 +84 +8C +B4 +C4 +04 +04 +04 +ENDCHAR +STARTCHAR uni266F +ENCODING 9839 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 6 12 1 -1 +BITMAP +08 +48 +4C +78 +C8 +48 +48 +4C +78 +C8 +48 +40 +ENDCHAR +STARTCHAR uni2680 +ENCODING 9856 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +FF80 +8080 +8080 +8080 +8880 +8080 +8080 +8080 +FF80 +ENDCHAR +STARTCHAR uni2681 +ENCODING 9857 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +FF80 +8080 +8280 +8080 +8080 +8080 +A080 +8080 +FF80 +ENDCHAR +STARTCHAR uni2682 +ENCODING 9858 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +FF80 +8080 +8280 +8080 +8880 +8080 +A080 +8080 +FF80 +ENDCHAR +STARTCHAR uni2683 +ENCODING 9859 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +FF80 +8080 +A280 +8080 +8080 +8080 +A280 +8080 +FF80 +ENDCHAR +STARTCHAR uni2684 +ENCODING 9860 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +FF80 +8080 +A280 +8080 +8880 +8080 +A280 +8080 +FF80 +ENDCHAR +STARTCHAR uni2685 +ENCODING 9861 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +FF80 +8080 +A280 +8080 +A280 +8080 +A280 +8080 +FF80 +ENDCHAR +STARTCHAR uni2690 +ENCODING 9872 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +80 +FF +82 +84 +88 +84 +82 +FF +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2691 +ENCODING 9873 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 8 12 0 0 +BITMAP +80 +FF +FE +FC +F8 +FC +FE +FF +80 +80 +80 +80 +ENDCHAR +STARTCHAR uni2713 +ENCODING 10003 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 6 0 2 +BITMAP +01 +02 +04 +88 +50 +20 +ENDCHAR +STARTCHAR uni2714 +ENCODING 10004 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 7 0 1 +BITMAP +03 +07 +0E +DC +F8 +70 +20 +ENDCHAR +STARTCHAR uni2715 +ENCODING 10005 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 1 1 +BITMAP +82 +44 +28 +10 +28 +44 +82 +ENDCHAR +STARTCHAR uni2716 +ENCODING 10006 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 1 1 +BITMAP +C6 +EE +7C +38 +7C +EE +C6 +ENDCHAR +STARTCHAR uni271D +ENCODING 10013 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +18 +18 +18 +FF +FF +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR uni2776 +ENCODING 10102 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +7E +F7 +E7 +F7 +F7 +F7 +7E +3C +ENDCHAR +STARTCHAR uni2777 +ENCODING 10103 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +7E +C7 +FB +F7 +EF +C3 +7E +3C +ENDCHAR +STARTCHAR uni2778 +ENCODING 10104 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +7E +C7 +FB +E7 +FB +C7 +7E +3C +ENDCHAR +STARTCHAR uni2779 +ENCODING 10105 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +7E +F7 +E7 +D7 +C3 +F7 +7E +3C +ENDCHAR +STARTCHAR uni277A +ENCODING 10106 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +7E +C3 +DF +C7 +FB +C7 +7E +3C +ENDCHAR +STARTCHAR uni277B +ENCODING 10107 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +7E +E3 +DF +C7 +DB +E7 +7E +3C +ENDCHAR +STARTCHAR uni277C +ENCODING 10108 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +7E +C3 +FB +F7 +EF +EF +7E +3C +ENDCHAR +STARTCHAR uni277D +ENCODING 10109 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +7E +E7 +DB +E7 +DB +E7 +7E +3C +ENDCHAR +STARTCHAR uni277E +ENCODING 10110 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +7E +E7 +DB +E3 +FB +E7 +7E +3C +ENDCHAR +STARTCHAR uni277F +ENCODING 10111 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +7E +DB +95 +D5 +D5 +DB +7E +3C +ENDCHAR +STARTCHAR uni2780 +ENCODING 10112 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +42 +89 +99 +89 +89 +89 +42 +3C +ENDCHAR +STARTCHAR uni2781 +ENCODING 10113 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +42 +B9 +85 +89 +91 +BD +42 +3C +ENDCHAR +STARTCHAR uni2782 +ENCODING 10114 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +42 +B9 +85 +99 +85 +B9 +42 +3C +ENDCHAR +STARTCHAR uni2783 +ENCODING 10115 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +42 +89 +99 +A9 +BD +89 +42 +3C +ENDCHAR +STARTCHAR uni2784 +ENCODING 10116 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +42 +BD +A1 +B9 +85 +B9 +42 +3C +ENDCHAR +STARTCHAR uni2785 +ENCODING 10117 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +42 +9D +A1 +B9 +A5 +99 +42 +3C +ENDCHAR +STARTCHAR uni2786 +ENCODING 10118 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +42 +BD +85 +89 +91 +91 +42 +3C +ENDCHAR +STARTCHAR uni2787 +ENCODING 10119 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +42 +99 +A5 +99 +A5 +99 +42 +3C +ENDCHAR +STARTCHAR uni2788 +ENCODING 10120 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +42 +99 +A5 +9D +85 +99 +42 +3C +ENDCHAR +STARTCHAR uni2789 +ENCODING 10121 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +42 +A9 +B5 +B5 +B5 +A9 +42 +3C +ENDCHAR +STARTCHAR uni278A +ENCODING 10122 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +7E +F7 +E7 +F7 +F7 +F7 +7E +3C +ENDCHAR +STARTCHAR uni278B +ENCODING 10123 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +7E +C7 +FB +F7 +EF +C3 +7E +3C +ENDCHAR +STARTCHAR uni278C +ENCODING 10124 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +7E +C7 +FB +E7 +FB +C7 +7E +3C +ENDCHAR +STARTCHAR uni278D +ENCODING 10125 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +7E +F7 +E7 +D7 +C3 +F7 +7E +3C +ENDCHAR +STARTCHAR uni278E +ENCODING 10126 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +7E +C3 +DF +C7 +FB +C7 +7E +3C +ENDCHAR +STARTCHAR uni278F +ENCODING 10127 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +7E +E3 +DF +C7 +DB +E7 +7E +3C +ENDCHAR +STARTCHAR uni2790 +ENCODING 10128 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +7E +C3 +FB +F7 +EF +EF +7E +3C +ENDCHAR +STARTCHAR uni2791 +ENCODING 10129 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +7E +E7 +DB +E7 +DB +E7 +7E +3C +ENDCHAR +STARTCHAR uni2792 +ENCODING 10130 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +7E +E7 +DB +E3 +FB +E7 +7E +3C +ENDCHAR +STARTCHAR uni2793 +ENCODING 10131 +SWIDTH 500 0 +DWIDTH 9 0 +BBX 8 9 0 0 +BITMAP +3C +7E +DB +95 +D5 +D5 +DB +7E +3C +ENDCHAR +STARTCHAR uni2794 +ENCODING 10132 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 6 0 2 +BITMAP +0C +06 +FF +FF +06 +0C +ENDCHAR +STARTCHAR uni2795 +ENCODING 10133 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 1 +BITMAP +18 +18 +18 +FF +FF +18 +18 +18 +ENDCHAR +STARTCHAR uni2796 +ENCODING 10134 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 2 0 4 +BITMAP +FF +FF +ENDCHAR +STARTCHAR uni2797 +ENCODING 10135 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 10 0 0 +BITMAP +18 +18 +00 +00 +FF +FF +00 +00 +18 +18 +ENDCHAR +STARTCHAR uni2798 +ENCODING 10136 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 1 +BITMAP +40 +E0 +73 +3B +1F +0F +3F +3F +ENDCHAR +STARTCHAR uni2799 +ENCODING 10137 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 1 +BITMAP +08 +1C +0E +FF +FF +0E +1C +08 +ENDCHAR +STARTCHAR uni279A +ENCODING 10138 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 1 +BITMAP +3F +3F +0F +1F +3B +73 +E0 +40 +ENDCHAR +STARTCHAR uni279B +ENCODING 10139 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 7 0 1 +BITMAP +08 +04 +06 +FF +06 +04 +08 +ENDCHAR +STARTCHAR uni279C +ENCODING 10140 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 1 +BITMAP +18 +1C +0E +FF +FF +0E +1C +18 +ENDCHAR +STARTCHAR uni279D +ENCODING 10141 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 7 0 1 +BITMAP +08 +0C +0E +FF +0E +0C +08 +ENDCHAR +STARTCHAR uni279E +ENCODING 10142 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 1 +BITMAP +08 +0C +0E +FF +FF +0E +0C +08 +ENDCHAR +STARTCHAR uni279F +ENCODING 10143 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 3 +BITMAP +04 +06 +AF +06 +04 +ENDCHAR +STARTCHAR uni27A0 +ENCODING 10144 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 3 +BITMAP +04 +AE +AF +AE +04 +ENDCHAR +STARTCHAR uni27A1 +ENCODING 10145 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 5 0 3 +BITMAP +04 +FE +FF +FE +04 +ENDCHAR +STARTCHAR uni29C4 +ENCODING 10692 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +FF80 +8180 +8280 +8480 +8880 +9080 +A080 +C080 +FF80 +ENDCHAR +STARTCHAR uni29C5 +ENCODING 10693 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +FF80 +C080 +A080 +9080 +8880 +8480 +8280 +8180 +FF80 +ENDCHAR +STARTCHAR uni29C6 +ENCODING 10694 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +FF80 +8080 +8880 +AA80 +9C80 +AA80 +8880 +8080 +FF80 +ENDCHAR +STARTCHAR uni29C7 +ENCODING 10695 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +FF80 +8080 +9C80 +A280 +A280 +A280 +9C80 +8080 +FF80 +ENDCHAR +STARTCHAR uni29C8 +ENCODING 10696 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +FF80 +8080 +BE80 +A280 +A280 +A280 +BE80 +8080 +FF80 +ENDCHAR +STARTCHAR uni29C9 +ENCODING 10697 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +FC00 +8400 +8400 +9F80 +9480 +FC80 +1080 +1080 +1F80 +ENDCHAR +STARTCHAR uni29CE +ENCODING 10702 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 13 0 -2 +BITMAP +C0 +B0 +8C +83 +8C +B0 +C3 +0D +31 +C1 +31 +0D +03 +ENDCHAR +STARTCHAR uni29CF +ENCODING 10703 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 7 0 1 +BITMAP +0280 +0E80 +3280 +C280 +3280 +0E80 +0280 +ENDCHAR +STARTCHAR uni29D0 +ENCODING 10704 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 7 0 1 +BITMAP +A000 +B800 +A600 +A180 +A600 +B800 +A000 +ENDCHAR +STARTCHAR uni29D1 +ENCODING 10705 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 1 +BITMAP +81 +C3 +E5 +F9 +F9 +E5 +C3 +81 +ENDCHAR +STARTCHAR uni29D2 +ENCODING 10706 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 1 +BITMAP +81 +C3 +A7 +9F +9F +A7 +C3 +81 +ENDCHAR +STARTCHAR uni29D3 +ENCODING 10707 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 1 +BITMAP +81 +C3 +E7 +FF +FF +E7 +C3 +81 +ENDCHAR +STARTCHAR uni29D4 +ENCODING 10708 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 1 +BITMAP +81 +C2 +E4 +F8 +F8 +E4 +C2 +81 +ENDCHAR +STARTCHAR uni29D5 +ENCODING 10709 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 1 +BITMAP +81 +43 +27 +1F +1F +27 +43 +81 +ENDCHAR +STARTCHAR uni29D6 +ENCODING 10710 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 1 +BITMAP +FF +42 +24 +18 +18 +24 +42 +FF +ENDCHAR +STARTCHAR uni29D7 +ENCODING 10711 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 1 +BITMAP +FF +7E +3C +18 +18 +3C +7E +FF +ENDCHAR +STARTCHAR uni29E8 +ENCODING 10728 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +FE +E2 +64 +64 +28 +28 +10 +10 +ENDCHAR +STARTCHAR uni29E9 +ENCODING 10729 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 0 0 +BITMAP +FE +8E +4C +4C +28 +28 +10 +10 +ENDCHAR +STARTCHAR uni2A00 +ENCODING 10752 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +3E00 +4100 +8080 +9C80 +9C80 +9C80 +8080 +4100 +3E00 +ENDCHAR +STARTCHAR uni2A01 +ENCODING 10753 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +3E00 +4100 +8880 +8880 +BE80 +8880 +8880 +4100 +3E00 +ENDCHAR +STARTCHAR uni2A02 +ENCODING 10754 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +3E00 +4100 +A280 +9480 +8880 +9480 +A280 +4100 +3E00 +ENDCHAR +STARTCHAR uni2A03 +ENCODING 10755 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 10 0 0 +BITMAP +81 +81 +81 +81 +81 +99 +99 +81 +42 +3C +ENDCHAR +STARTCHAR uni2A04 +ENCODING 10756 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +82 +82 +82 +82 +92 +BA +92 +82 +44 +38 +ENDCHAR +STARTCHAR uni2A05 +ENCODING 10757 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +FE +82 +82 +82 +82 +82 +82 +82 +82 +82 +ENDCHAR +STARTCHAR uni2A06 +ENCODING 10758 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +82 +82 +82 +82 +82 +82 +82 +82 +82 +FE +ENDCHAR +STARTCHAR uni2A09 +ENCODING 10761 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 1 2 +BITMAP +82 +44 +28 +10 +28 +44 +82 +ENDCHAR +STARTCHAR uni2B00 +ENCODING 11008 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 1 +BITMAP +1F +09 +11 +23 +45 +88 +50 +20 +ENDCHAR +STARTCHAR uni2B01 +ENCODING 11009 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 1 +BITMAP +F8 +90 +88 +C4 +A2 +11 +0A +04 +ENDCHAR +STARTCHAR uni2B02 +ENCODING 11010 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 1 +BITMAP +20 +50 +88 +45 +23 +11 +09 +1F +ENDCHAR +STARTCHAR uni2B03 +ENCODING 11011 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 1 +BITMAP +04 +0A +11 +A2 +C4 +88 +90 +F8 +ENDCHAR +STARTCHAR uni2B04 +ENCODING 11012 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 7 0 2 +BITMAP +1400 +3600 +5D00 +8080 +5D00 +3600 +1400 +ENDCHAR +STARTCHAR uni2B05 +ENCODING 11013 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 7 0 2 +BITMAP +10 +30 +7F +FF +7F +30 +10 +ENDCHAR +STARTCHAR uni2B06 +ENCODING 11014 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 2 +BITMAP +10 +38 +7C +FE +38 +38 +38 +38 +ENDCHAR +STARTCHAR uni2B07 +ENCODING 11015 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 2 +BITMAP +38 +38 +38 +38 +FE +7C +38 +10 +ENDCHAR +STARTCHAR uni2B08 +ENCODING 11016 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 1 +BITMAP +1F +0F +1F +3F +7D +F8 +70 +20 +ENDCHAR +STARTCHAR uni2B09 +ENCODING 11017 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 1 +BITMAP +F8 +F0 +F8 +FC +BE +1F +0E +04 +ENDCHAR +STARTCHAR uni2B0A +ENCODING 11018 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 1 +BITMAP +20 +70 +F8 +7D +3F +1F +0F +1F +ENDCHAR +STARTCHAR uni2B0B +ENCODING 11019 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 1 +BITMAP +04 +0E +1F +BE +FC +F8 +F0 +F8 +ENDCHAR +STARTCHAR uni2B0C +ENCODING 11020 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 7 0 2 +BITMAP +1400 +3600 +7F00 +FF80 +7F00 +3600 +1400 +ENDCHAR +STARTCHAR uni2B0D +ENCODING 11021 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +10 +38 +7C +FE +38 +38 +FE +7C +38 +10 +ENDCHAR +STARTCHAR uni2B12 +ENCODING 11026 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +FE +FE +82 +82 +82 +FE +ENDCHAR +STARTCHAR uni2B13 +ENCODING 11027 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +82 +82 +82 +FE +FE +FE +ENDCHAR +STARTCHAR uni2B14 +ENCODING 11028 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +BE +9E +8E +86 +82 +FE +ENDCHAR +STARTCHAR uni2B15 +ENCODING 11029 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +FE +82 +C2 +E2 +F2 +FA +FE +ENDCHAR +STARTCHAR uni2B16 +ENCODING 11030 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +10 +38 +74 +F2 +74 +38 +10 +ENDCHAR +STARTCHAR uni2B17 +ENCODING 11031 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +10 +38 +5C +9E +5C +38 +10 +ENDCHAR +STARTCHAR uni2B18 +ENCODING 11032 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +10 +38 +7C +FE +44 +28 +10 +ENDCHAR +STARTCHAR uni2B19 +ENCODING 11033 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +10 +28 +44 +FE +7C +38 +10 +ENDCHAR +STARTCHAR uni2B1A +ENCODING 11034 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 7 0 0 +BITMAP +AA +00 +82 +00 +82 +00 +AA +ENDCHAR +STARTCHAR uni2B1B +ENCODING 11035 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +FF +FF +FF +FF +FF +FF +FF +FF +ENDCHAR +STARTCHAR uni2B1C +ENCODING 11036 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +FF +81 +81 +81 +81 +81 +81 +FF +ENDCHAR +STARTCHAR uni2B1D +ENCODING 11037 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 3 3 3 +BITMAP +E0 +E0 +E0 +ENDCHAR +STARTCHAR uni2B1E +ENCODING 11038 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 3 3 3 3 +BITMAP +E0 +A0 +E0 +ENDCHAR +STARTCHAR uni2B24 +ENCODING 11044 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +3C +7E +FF +FF +FF +FF +7E +3C +ENDCHAR +STARTCHAR uni2B95 +ENCODING 11157 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 7 0 2 +BITMAP +08 +0C +FE +FF +FE +0C +08 +ENDCHAR +STARTCHAR uni2B98 +ENCODING 11160 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +03 +0E +32 +C4 +FC +3E +0E +03 +ENDCHAR +STARTCHAR uni2B99 +ENCODING 11161 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +18 +18 +34 +34 +72 +7A +E7 +81 +ENDCHAR +STARTCHAR uni2B9A +ENCODING 11162 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +C0 +70 +4C +23 +3F +7C +70 +C0 +ENDCHAR +STARTCHAR uni2B9B +ENCODING 11163 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +81 +E7 +5E +4E +2C +2C +18 +18 +ENDCHAR +STARTCHAR uni2B9C +ENCODING 11164 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +03 +0E +3E +FC +FC +3E +0E +03 +ENDCHAR +STARTCHAR uni2B9D +ENCODING 11165 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +18 +18 +3C +3C +7E +7E +E7 +81 +ENDCHAR +STARTCHAR uni2B9E +ENCODING 11166 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +C0 +70 +7C +3F +3F +7C +70 +C0 +ENDCHAR +STARTCHAR uni2B9F +ENCODING 11167 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 8 0 0 +BITMAP +81 +E7 +7E +7E +3C +3C +18 +18 +ENDCHAR +STARTCHAR uni2BBA +ENCODING 11194 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +1F80 +1080 +1080 +FC80 +9480 +9F80 +8400 +8400 +FC00 +ENDCHAR +STARTCHAR uni2BBB +ENCODING 11195 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +1F80 +1F80 +1F80 +FF80 +9F80 +9F80 +8400 +8400 +FC00 +ENDCHAR +STARTCHAR uni2BBC +ENCODING 11196 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 9 9 0 0 +BITMAP +1F80 +1F80 +1F80 +FF80 +FF80 +FF80 +FC00 +FC00 +FC00 +ENDCHAR +STARTCHAR uni2BC5 +ENCODING 11205 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +10 +10 +38 +38 +7C +7C +FE +FE +ENDCHAR +STARTCHAR uni2BC6 +ENCODING 11206 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 7 8 1 0 +BITMAP +FE +FE +7C +7C +38 +38 +10 +10 +ENDCHAR +STARTCHAR uni2BC7 +ENCODING 11207 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 7 0 1 +BITMAP +03 +0F +3F +FF +3F +0F +03 +ENDCHAR +STARTCHAR uni2BC8 +ENCODING 11208 +SWIDTH 562 0 +DWIDTH 9 0 +BBX 8 7 0 1 +BITMAP +C0 +F0 +FC +FF +FC +F0 +C0 +ENDCHAR +STARTCHAR uni2C60 +ENCODING 11360 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +40 +40 +40 +40 +F8 +40 +F8 +40 +40 +40 +7E +ENDCHAR +STARTCHAR uni2C61 +ENCODING 11361 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 5 11 1 0 +BITMAP +60 +20 +20 +20 +F8 +20 +F8 +20 +20 +20 +18 +ENDCHAR +STARTCHAR uni2C62 +ENCODING 11362 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 8 11 0 0 +BITMAP +20 +20 +20 +20 +64 +B8 +20 +20 +20 +20 +3F +ENDCHAR +STARTCHAR uni2C63 +ENCODING 11363 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 7 11 0 0 +BITMAP +7C +42 +42 +F2 +42 +42 +7C +40 +40 +40 +40 +ENDCHAR +STARTCHAR uni2C64 +ENCODING 11364 +SWIDTH 538 0 +DWIDTH 9 0 +BBX 6 14 1 -3 +BITMAP +F8 +84 +84 +84 +84 +F8 +C0 +A0 +90 +88 +84 +80 +80 +60 +ENDCHAR +STARTCHAR uniA730 +ENCODING 42800 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +FC +80 +80 +80 +F8 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uniA731 +ENCODING 42801 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 9 1 0 +BITMAP +7C +80 +80 +80 +78 +04 +04 +F8 +F8 +ENDCHAR +STARTCHAR uniFE7C +ENCODING 65148 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 5 0 9 +BITMAP +84 +94 +B8 +B8 +40 +ENDCHAR +STARTCHAR uniFE7D +ENCODING 65149 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 14 0 0 +BITMAP +84 +94 +B8 +B8 +40 +00 +00 +00 +00 +00 +00 +00 +FE +FE +ENDCHAR +STARTCHAR uniFE7E +ENCODING 65150 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 4 4 1 11 +BITMAP +40 +B0 +40 +40 +ENDCHAR +STARTCHAR uniFE7F +ENCODING 65151 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 14 0 0 +BITMAP +30 +48 +30 +00 +00 +00 +00 +00 +00 +00 +00 +00 +FE +FE +ENDCHAR +STARTCHAR uniFE80 +ENCODING 65152 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 4 6 2 3 +BITMAP +70 +80 +80 +80 +70 +C0 +ENDCHAR +STARTCHAR uniFE81 +ENCODING 65153 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 13 1 1 +BITMAP +48 +B0 +00 +00 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uniFE82 +ENCODING 65154 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 14 1 0 +BITMAP +48 +B0 +00 +00 +40 +40 +40 +40 +40 +40 +40 +40 +3C +1C +ENDCHAR +STARTCHAR uniFE83 +ENCODING 65155 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 4 13 1 1 +BITMAP +70 +80 +E0 +E0 +00 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR uniFE84 +ENCODING 65156 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 14 1 0 +BITMAP +70 +80 +E0 +E0 +00 +40 +40 +40 +40 +40 +40 +40 +3C +1C +ENDCHAR +STARTCHAR uniFE85 +ENCODING 65157 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 14 0 -2 +BITMAP +38 +40 +70 +78 +00 +38 +44 +44 +44 +44 +3C +04 +F8 +F0 +ENDCHAR +STARTCHAR uniFE86 +ENCODING 65158 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 14 0 -2 +BITMAP +38 +40 +70 +78 +00 +38 +44 +44 +44 +46 +3E +04 +F8 +F0 +ENDCHAR +STARTCHAR uniFE87 +ENCODING 65159 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 4 14 1 -2 +BITMAP +40 +40 +40 +40 +40 +40 +40 +00 +00 +00 +70 +80 +E0 +E0 +ENDCHAR +STARTCHAR uniFE88 +ENCODING 65160 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 14 0 -2 +BITMAP +30 +30 +30 +30 +30 +30 +30 +00 +00 +08 +72 +80 +E0 +E0 +ENDCHAR +STARTCHAR uniFE89 +ENCODING 65161 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 12 0 1 +BITMAP +70 +80 +E0 +E0 +04 +0A +48 +00 +00 +84 +84 +78 +ENDCHAR +STARTCHAR uniFE8A +ENCODING 65162 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 11 0 1 +BITMAP +70 +80 +E0 +E0 +00 +40 +82 +8A +8A +88 +70 +ENDCHAR +STARTCHAR uniFE8B +ENCODING 65163 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 11 0 1 +BITMAP +38 +40 +70 +78 +00 +30 +30 +30 +30 +30 +C0 +ENDCHAR +STARTCHAR uniFE8C +ENCODING 65164 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 11 0 1 +BITMAP +38 +40 +70 +78 +00 +30 +30 +30 +30 +30 +CE +ENDCHAR +STARTCHAR uniFE8D +ENCODING 65165 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 1 11 2 1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR uniFE8E +ENCODING 65166 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 11 2 1 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +78 +ENDCHAR +STARTCHAR uniFE8F +ENCODING 65167 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 5 0 1 +BITMAP +08 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uniFE90 +ENCODING 65168 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 5 0 1 +BITMAP +08 +84 +84 +84 +7A +ENDCHAR +STARTCHAR uniFE91 +ENCODING 65169 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 4 5 0 1 +BITMAP +30 +30 +30 +20 +C0 +ENDCHAR +STARTCHAR uniFE92 +ENCODING 65170 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 5 0 1 +BITMAP +30 +30 +30 +30 +CE +ENDCHAR +STARTCHAR uniFE93 +ENCODING 65171 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 10 0 0 +BITMAP +48 +00 +20 +70 +88 +84 +84 +00 +00 +78 +ENDCHAR +STARTCHAR uniFE94 +ENCODING 65172 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 10 0 0 +BITMAP +48 +00 +10 +38 +44 +84 +84 +00 +00 +78 +ENDCHAR +STARTCHAR uniFE95 +ENCODING 65173 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 7 0 2 +BITMAP +48 +00 +00 +08 +84 +84 +78 +ENDCHAR +STARTCHAR uniFE96 +ENCODING 65174 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 7 0 2 +BITMAP +48 +00 +00 +08 +84 +84 +7A +ENDCHAR +STARTCHAR uniFE97 +ENCODING 65175 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 7 0 2 +BITMAP +48 +00 +00 +30 +30 +30 +C0 +ENDCHAR +STARTCHAR uniFE98 +ENCODING 65176 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 7 0 2 +BITMAP +48 +00 +00 +30 +30 +30 +CE +ENDCHAR +STARTCHAR uniFE99 +ENCODING 65177 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 1 +BITMAP +30 +00 +00 +48 +00 +08 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uniFE9A +ENCODING 65178 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 1 +BITMAP +30 +00 +00 +48 +00 +08 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uniFE9B +ENCODING 65179 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 11 0 1 +BITMAP +30 +00 +00 +48 +00 +30 +30 +30 +30 +30 +C0 +ENDCHAR +STARTCHAR uniFE9C +ENCODING 65180 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 11 0 1 +BITMAP +30 +00 +00 +48 +00 +30 +30 +30 +30 +30 +CE +ENDCHAR +STARTCHAR uniFE9D +ENCODING 65181 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 -1 +BITMAP +FC +30 +00 +40 +80 +B0 +80 +00 +00 +40 +3C +ENDCHAR +STARTCHAR uniFE9E +ENCODING 65182 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 11 0 -1 +BITMAP +FC +38 +18 +48 +84 +B2 +80 +00 +00 +40 +3C +ENDCHAR +STARTCHAR uniFE9F +ENCODING 65183 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 5 0 1 +BITMAP +78 +04 +18 +38 +C0 +ENDCHAR +STARTCHAR uniFEA0 +ENCODING 65184 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 5 0 1 +BITMAP +78 +04 +1C +3C +C2 +ENDCHAR +STARTCHAR uniFEA1 +ENCODING 65185 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 -1 +BITMAP +FC +30 +00 +40 +80 +80 +80 +00 +00 +40 +3C +ENDCHAR +STARTCHAR uniFEA2 +ENCODING 65186 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 11 0 -1 +BITMAP +FC +38 +18 +48 +84 +82 +80 +00 +00 +40 +3C +ENDCHAR +STARTCHAR uniFEA3 +ENCODING 65187 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 5 0 1 +BITMAP +78 +04 +18 +38 +C0 +ENDCHAR +STARTCHAR uniFEA4 +ENCODING 65188 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 5 0 1 +BITMAP +78 +04 +1C +3C +C2 +ENDCHAR +STARTCHAR uniFEA5 +ENCODING 65189 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 14 0 -2 +BITMAP +30 +00 +FC +FC +30 +40 +80 +80 +80 +80 +80 +40 +3C +1C +ENDCHAR +STARTCHAR uniFEA6 +ENCODING 65190 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 14 0 -2 +BITMAP +30 +00 +FC +FC +38 +48 +84 +80 +80 +80 +80 +40 +3C +1C +ENDCHAR +STARTCHAR uniFEA7 +ENCODING 65191 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 7 0 2 +BITMAP +30 +00 +30 +78 +04 +38 +C0 +ENDCHAR +STARTCHAR uniFEA8 +ENCODING 65192 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 7 0 2 +BITMAP +30 +00 +30 +78 +04 +3C +C2 +ENDCHAR +STARTCHAR uniFEA9 +ENCODING 65193 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 6 1 2 +BITMAP +30 +08 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR uniFEAA +ENCODING 65194 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 6 1 2 +BITMAP +30 +08 +08 +08 +08 +F4 +ENDCHAR +STARTCHAR uniFEAB +ENCODING 65195 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 10 1 0 +BITMAP +40 +00 +00 +10 +08 +08 +08 +00 +00 +F0 +ENDCHAR +STARTCHAR uniFEAC +ENCODING 65196 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 10 1 0 +BITMAP +40 +00 +00 +10 +08 +08 +08 +00 +00 +F0 +ENDCHAR +STARTCHAR uniFEAD +ENCODING 65197 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 6 0 1 +BITMAP +04 +04 +04 +04 +08 +F0 +ENDCHAR +STARTCHAR uniFEAE +ENCODING 65198 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 6 0 1 +BITMAP +04 +04 +04 +04 +0A +F0 +ENDCHAR +STARTCHAR uniFEAF +ENCODING 65199 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 10 0 -1 +BITMAP +04 +00 +04 +04 +04 +04 +00 +00 +00 +F0 +ENDCHAR +STARTCHAR uniFEB0 +ENCODING 65200 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 10 0 -1 +BITMAP +04 +00 +04 +04 +04 +04 +02 +00 +00 +F0 +ENDCHAR +STARTCHAR uniFEB1 +ENCODING 65201 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 10 0 -2 +BITMAP +02 +4A +4A +4A +4A +34 +B0 +00 +00 +40 +ENDCHAR +STARTCHAR uniFEB2 +ENCODING 65202 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 10 0 -2 +BITMAP +02 +4A +4A +4A +4A +34 +B0 +00 +00 +40 +ENDCHAR +STARTCHAR uniFEB3 +ENCODING 65203 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 6 0 2 +BITMAP +02 +4A +4A +4A +4A +B4 +ENDCHAR +STARTCHAR uniFEB4 +ENCODING 65204 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 6 0 2 +BITMAP +02 +4A +4A +4A +4A +B4 +ENDCHAR +STARTCHAR uniFEB5 +ENCODING 65205 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 13 0 -1 +BITMAP +30 +00 +00 +48 +00 +4A +4A +4A +4A +4A +30 +B0 +40 +ENDCHAR +STARTCHAR uniFEB6 +ENCODING 65206 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 13 0 -1 +BITMAP +30 +00 +00 +48 +00 +4A +4A +4A +4A +4A +30 +B0 +40 +ENDCHAR +STARTCHAR uniFEB7 +ENCODING 65207 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 11 0 1 +BITMAP +30 +00 +00 +48 +00 +4A +4A +4A +4A +4A +B0 +ENDCHAR +STARTCHAR uniFEB8 +ENCODING 65208 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 11 0 1 +BITMAP +30 +00 +00 +48 +00 +4A +4A +4A +4A +4A +B0 +ENDCHAR +STARTCHAR uniFEB9 +ENCODING 65209 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 7 0 0 +BITMAP +34 +3A +B2 +B2 +BC +B0 +40 +ENDCHAR +STARTCHAR uniFEBA +ENCODING 65210 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 7 0 0 +BITMAP +34 +3A +B2 +B2 +BE +B0 +40 +ENDCHAR +STARTCHAR uniFEBB +ENCODING 65211 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 5 0 1 +BITMAP +44 +4A +72 +72 +9C +ENDCHAR +STARTCHAR uniFEBC +ENCODING 65212 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 5 0 1 +BITMAP +44 +4A +72 +72 +9E +ENDCHAR +STARTCHAR uniFEBD +ENCODING 65213 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 11 0 -1 +BITMAP +30 +00 +04 +34 +3A +B2 +BC +B8 +B8 +B0 +40 +ENDCHAR +STARTCHAR uniFEBE +ENCODING 65214 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 11 0 -1 +BITMAP +30 +00 +04 +34 +3A +B2 +BE +B8 +B8 +B0 +40 +ENDCHAR +STARTCHAR uniFEBF +ENCODING 65215 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 7 0 2 +BITMAP +30 +00 +04 +44 +6A +72 +BC +ENDCHAR +STARTCHAR uniFEC0 +ENCODING 65216 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 7 0 2 +BITMAP +30 +00 +04 +44 +6A +72 +BE +ENDCHAR +STARTCHAR uniFEC1 +ENCODING 65217 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 1 +BITMAP +40 +40 +40 +40 +40 +48 +74 +74 +74 +74 +F8 +ENDCHAR +STARTCHAR uniFEC2 +ENCODING 65218 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 1 +BITMAP +40 +40 +40 +40 +40 +48 +74 +74 +74 +74 +F8 +ENDCHAR +STARTCHAR uniFEC3 +ENCODING 65219 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 1 +BITMAP +40 +40 +40 +40 +40 +48 +74 +74 +74 +74 +F8 +ENDCHAR +STARTCHAR uniFEC4 +ENCODING 65220 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 1 +BITMAP +40 +40 +40 +40 +40 +48 +74 +74 +74 +74 +F8 +ENDCHAR +STARTCHAR uniFEC5 +ENCODING 65221 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 1 +BITMAP +40 +40 +40 +48 +40 +48 +74 +74 +74 +74 +F8 +ENDCHAR +STARTCHAR uniFEC6 +ENCODING 65222 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 1 +BITMAP +40 +40 +40 +48 +40 +48 +74 +74 +74 +74 +F8 +ENDCHAR +STARTCHAR uniFEC7 +ENCODING 65223 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 1 +BITMAP +40 +40 +40 +48 +40 +48 +74 +74 +74 +74 +F8 +ENDCHAR +STARTCHAR uniFEC8 +ENCODING 65224 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 1 +BITMAP +40 +40 +40 +48 +40 +48 +74 +74 +74 +74 +F8 +ENDCHAR +STARTCHAR uniFEC9 +ENCODING 65225 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 -1 +BITMAP +70 +80 +80 +80 +78 +80 +80 +80 +80 +84 +78 +ENDCHAR +STARTCHAR uniFECA +ENCODING 65226 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 10 0 -2 +BITMAP +70 +88 +70 +70 +88 +86 +80 +00 +00 +78 +ENDCHAR +STARTCHAR uniFECB +ENCODING 65227 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 7 0 2 +BITMAP +38 +40 +40 +40 +3C +30 +C0 +ENDCHAR +STARTCHAR uniFECC +ENCODING 65228 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 7 0 2 +BITMAP +30 +48 +48 +48 +30 +48 +86 +ENDCHAR +STARTCHAR uniFECD +ENCODING 65229 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 14 0 -2 +BITMAP +40 +00 +20 +60 +80 +80 +78 +00 +00 +80 +80 +84 +78 +30 +ENDCHAR +STARTCHAR uniFECE +ENCODING 65230 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 12 0 -1 +BITMAP +30 +00 +20 +70 +88 +70 +88 +80 +80 +82 +80 +78 +ENDCHAR +STARTCHAR uniFECF +ENCODING 65231 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 1 +BITMAP +40 +00 +10 +38 +40 +40 +3C +38 +38 +30 +C0 +ENDCHAR +STARTCHAR uniFED0 +ENCODING 65232 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 11 0 1 +BITMAP +30 +00 +00 +30 +48 +48 +30 +00 +00 +40 +82 +ENDCHAR +STARTCHAR uniFED1 +ENCODING 65233 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 10 0 -1 +BITMAP +08 +00 +00 +08 +14 +8C +84 +00 +00 +78 +ENDCHAR +STARTCHAR uniFED2 +ENCODING 65234 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 10 0 -1 +BITMAP +08 +00 +00 +08 +14 +8C +86 +00 +00 +78 +ENDCHAR +STARTCHAR uniFED3 +ENCODING 65235 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 11 0 0 +BITMAP +30 +00 +00 +30 +48 +38 +08 +00 +00 +30 +C0 +ENDCHAR +STARTCHAR uniFED4 +ENCODING 65236 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 10 0 0 +BITMAP +30 +00 +00 +30 +48 +48 +30 +00 +00 +C6 +ENDCHAR +STARTCHAR uniFED5 +ENCODING 65237 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 10 0 -1 +BITMAP +34 +00 +00 +08 +14 +8C +84 +00 +00 +78 +ENDCHAR +STARTCHAR uniFED6 +ENCODING 65238 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 10 0 -1 +BITMAP +34 +00 +00 +08 +14 +8C +86 +00 +00 +78 +ENDCHAR +STARTCHAR uniFED7 +ENCODING 65239 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 11 0 0 +BITMAP +48 +00 +00 +30 +48 +38 +08 +00 +00 +30 +C0 +ENDCHAR +STARTCHAR uniFED8 +ENCODING 65240 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 10 0 0 +BITMAP +48 +00 +00 +30 +48 +48 +30 +00 +00 +C6 +ENDCHAR +STARTCHAR uniFED9 +ENCODING 65241 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 1 +BITMAP +34 +44 +24 +24 +C4 +04 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uniFEDA +ENCODING 65242 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 1 +BITMAP +34 +44 +24 +24 +C4 +04 +84 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uniFEDB +ENCODING 65243 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 12 0 1 +BITMAP +04 +18 +00 +40 +40 +30 +08 +00 +00 +04 +04 +F8 +ENDCHAR +STARTCHAR uniFEDC +ENCODING 65244 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 12 0 1 +BITMAP +04 +18 +00 +40 +40 +30 +08 +00 +00 +04 +04 +F8 +ENDCHAR +STARTCHAR uniFEDD +ENCODING 65245 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 14 0 -2 +BITMAP +04 +04 +04 +04 +04 +04 +04 +04 +04 +44 +84 +84 +78 +30 +ENDCHAR +STARTCHAR uniFEDE +ENCODING 65246 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 14 0 -2 +BITMAP +04 +04 +04 +04 +04 +04 +04 +04 +04 +46 +86 +84 +78 +30 +ENDCHAR +STARTCHAR uniFEDF +ENCODING 65247 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 11 0 1 +BITMAP +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +F0 +ENDCHAR +STARTCHAR uniFEE0 +ENCODING 65248 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 11 0 1 +BITMAP +08 +08 +08 +08 +08 +08 +08 +08 +08 +08 +F2 +ENDCHAR +STARTCHAR uniFEE1 +ENCODING 65249 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 7 0 0 +BITMAP +38 +44 +44 +44 +98 +80 +80 +ENDCHAR +STARTCHAR uniFEE2 +ENCODING 65250 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 7 0 0 +BITMAP +38 +44 +44 +44 +9A +80 +80 +ENDCHAR +STARTCHAR uniFEE3 +ENCODING 65251 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 5 0 1 +BITMAP +38 +44 +44 +44 +98 +ENDCHAR +STARTCHAR uniFEE4 +ENCODING 65252 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 5 0 1 +BITMAP +38 +44 +44 +44 +9A +ENDCHAR +STARTCHAR uniFEE5 +ENCODING 65253 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 10 0 -1 +BITMAP +30 +00 +00 +08 +84 +84 +84 +00 +00 +78 +ENDCHAR +STARTCHAR uniFEE6 +ENCODING 65254 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 10 0 -1 +BITMAP +30 +00 +00 +08 +84 +84 +86 +00 +00 +78 +ENDCHAR +STARTCHAR uniFEE7 +ENCODING 65255 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 4 7 0 2 +BITMAP +30 +00 +00 +30 +30 +30 +C0 +ENDCHAR +STARTCHAR uniFEE8 +ENCODING 65256 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 7 0 2 +BITMAP +30 +00 +00 +30 +30 +30 +CE +ENDCHAR +STARTCHAR uniFEE9 +ENCODING 65257 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 6 0 2 +BITMAP +70 +88 +84 +84 +84 +78 +ENDCHAR +STARTCHAR uniFEEA +ENCODING 65258 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 6 0 2 +BITMAP +38 +44 +84 +84 +84 +7A +ENDCHAR +STARTCHAR uniFEEB +ENCODING 65259 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 10 0 0 +BITMAP +F0 +08 +04 +44 +B4 +B4 +44 +00 +00 +88 +ENDCHAR +STARTCHAR uniFEEC +ENCODING 65260 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 7 0 0 +BITMAP +08 +14 +04 +64 +FE +46 +38 +ENDCHAR +STARTCHAR uniFEED +ENCODING 65261 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 7 0 0 +BITMAP +38 +44 +44 +44 +1C +04 +F8 +ENDCHAR +STARTCHAR uniFEEE +ENCODING 65262 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 7 0 0 +BITMAP +38 +44 +44 +44 +1E +06 +F8 +ENDCHAR +STARTCHAR uniFEEF +ENCODING 65263 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 6 0 1 +BITMAP +04 +0A +88 +88 +84 +78 +ENDCHAR +STARTCHAR uniFEF0 +ENCODING 65264 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 6 0 1 +BITMAP +04 +0A +8A +8A +8A +70 +ENDCHAR +STARTCHAR uniFEF1 +ENCODING 65265 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 11 0 -1 +BITMAP +04 +0A +08 +48 +84 +84 +78 +00 +00 +00 +48 +ENDCHAR +STARTCHAR uniFEF2 +ENCODING 65266 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 7 0 0 +BITMAP +44 +8A +8A +8A +70 +00 +40 +ENDCHAR +STARTCHAR uniFEF3 +ENCODING 65267 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 4 7 0 0 +BITMAP +30 +30 +30 +20 +C0 +00 +40 +ENDCHAR +STARTCHAR uniFEF4 +ENCODING 65268 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 7 7 0 0 +BITMAP +30 +30 +30 +30 +CE +00 +40 +ENDCHAR +STARTCHAR uniFEF5 +ENCODING 65269 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 14 0 0 +BITMAP +48 +B0 +04 +04 +44 +44 +34 +34 +04 +04 +0C +0C +78 +30 +ENDCHAR +STARTCHAR uniFEF6 +ENCODING 65270 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 14 0 0 +BITMAP +48 +B0 +04 +04 +44 +44 +34 +34 +04 +04 +0C +0C +78 +30 +ENDCHAR +STARTCHAR uniFEF7 +ENCODING 65271 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 14 0 0 +BITMAP +70 +80 +E4 +E4 +04 +44 +34 +34 +04 +04 +0C +0C +78 +30 +ENDCHAR +STARTCHAR uniFEF8 +ENCODING 65272 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 14 0 0 +BITMAP +70 +80 +E4 +E4 +04 +44 +34 +34 +04 +04 +0C +0C +78 +30 +ENDCHAR +STARTCHAR uniFEF9 +ENCODING 65273 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 14 0 -2 +BITMAP +04 +44 +44 +44 +34 +34 +0C +0C +0C +8C +78 +80 +E0 +E0 +ENDCHAR +STARTCHAR uniFEFA +ENCODING 65274 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 14 0 -2 +BITMAP +04 +44 +44 +44 +34 +34 +0C +0C +0C +8C +78 +80 +E0 +E0 +ENDCHAR +STARTCHAR uniFEFB +ENCODING 65275 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 11 1 1 +BITMAP +08 +88 +88 +88 +48 +48 +38 +38 +38 +38 +F0 +ENDCHAR +STARTCHAR uniFEFC +ENCODING 65276 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 5 11 1 1 +BITMAP +08 +88 +88 +88 +48 +48 +38 +38 +38 +38 +F0 +ENDCHAR +STARTCHAR uniFFFD +ENCODING 65533 +SWIDTH 500 0 +DWIDTH 8 0 +BBX 6 11 0 1 +BITMAP +FC +84 +84 +84 +84 +84 +84 +84 +84 +84 +FC +ENDCHAR +ENDFONT diff --git a/app/src/gambas3/font/font.allow b/app/src/gambas3/font/font.allow new file mode 100644 index 00000000..e8e65537 --- /dev/null +++ b/app/src/gambas3/font/font.allow @@ -0,0 +1,7 @@ + + + + Gambas + + + diff --git a/app/src/gambas3/font/font.conf b/app/src/gambas3/font/font.conf new file mode 100644 index 00000000..9a275257 --- /dev/null +++ b/app/src/gambas3/font/font.conf @@ -0,0 +1,4 @@ + + + + diff --git a/app/src/gambas3/gitignore b/app/src/gambas3/gitignore new file mode 100644 index 00000000..06e26c54 --- /dev/null +++ b/app/src/gambas3/gitignore @@ -0,0 +1,17 @@ +#---- Gambas files to ignore (v5) +*.gambas +.lock +*~ +core +core.* +vgcore +vgcore.* +.kdbg* +.*.prof +.lang/*.pot +.gambas/* +.settings +.startup +.list +.info +#---- diff --git a/app/src/gambas3/help/class-help.html b/app/src/gambas3/help/class-help.html new file mode 100644 index 00000000..441f7e2f --- /dev/null +++ b/app/src/gambas3/help/class-help.html @@ -0,0 +1,36 @@ + + + + + + + + + + +

      $(title)

      + +$(help) + +

      + + + +ShowSymbols[ + +ShowSymbols] + +
      + + + +
      + +$(symbols) + +
      + + + diff --git a/app/src/gambas3/help/component-help.html b/app/src/gambas3/help/component-help.html new file mode 100644 index 00000000..5e980416 --- /dev/null +++ b/app/src/gambas3/help/component-help.html @@ -0,0 +1,25 @@ + + + + + + + + +
      +
      $(title)
      +

      + $(help) +

      ''Classes''
      +
      + + $(classes) +
      +
      +
      + + + diff --git a/app/src/gambas3/help/property-help.html b/app/src/gambas3/help/property-help.html new file mode 100644 index 00000000..12c25077 --- /dev/null +++ b/app/src/gambas3/help/property-help.html @@ -0,0 +1,22 @@ + + + + + + + + + +

      $(class).$(name)

      +
      +

      Property $(name) As $(type)

      +
      +

      +$(help) + +

      $(warning)

      + + + diff --git a/app/src/gambas3/help/symbol-help.html b/app/src/gambas3/help/symbol-help.html new file mode 100644 index 00000000..e68544f9 --- /dev/null +++ b/app/src/gambas3/help/symbol-help.html @@ -0,0 +1,20 @@ + + + + + + + + + + +

      $(title)

      + +
      $(syntax)
      +

      +$(help) + + + diff --git a/app/src/gambas3/help/wiki/critical.png b/app/src/gambas3/help/wiki/critical.png new file mode 100644 index 0000000000000000000000000000000000000000..b7efe8fc4d36855c8632f596dd32d0669fb982cf GIT binary patch literal 589 zcmV-T0kdg0006MNkl&v_#MZ-r^I0bn-5^gn?I zS5rbRyv-_~_}08gm^NDgzggru-H7hvjIc-$No>`XsN!!qW6}8T=Z#My!uPqI2v_$A zyU7v}Zn$V&TRG1pbIdWx0Ik+OKqW~c$OGI{rxtEfaBiT;n3cE#K(Ok>2Y96p9V{eV z;&?2PmjJ}h5agjkpC0{P0{+mc#7WBT831znal#WlWotAKfRjK5LFnSU2cKbwV+g|K zcoIP#0y+_dD_$Jnn%1dOO9J4lx;<@x!?apH*OCDEsOHxVaCon_Wfe$i8MPiQvCEy1 z$08zS_)zSGcV z9YU^JfeX$ggl+EInUEoL3iT!iA1W+c+5bYLiV~{N6Mz~7YVYo+;6;>#+XNzeH&HbGUB&??3WSK*v bhg*LD(aJGI!z{@%00000NkvXXu0mjf6#faF literal 0 HcmV?d00001 diff --git a/app/src/gambas3/help/wiki/error-bg.png b/app/src/gambas3/help/wiki/error-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..1215a27fcee9cc25ca4b51eeafed0a65bb767209 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9JOMr-u0Z<#y?Y>Z|Gu8^!m~g= zb4ie2FhkwGbYVVSAlK5<#W95Adh7{9K?VgLmV@4{JZm2C%sJ|Gkdg0008eNklYB;&vPUKWVlK%7x&t|v`BKh zY1x@~J~;244LKV6EEBFr1l+R9>umkx6Y7Z@fMSM0F4Ib!IIZM(z$^-I12s(Qu=I2O z68MaB28lRX@&rKeEwT^YRbGcBIwO-Sr;8%smFTRgUS5YOQgzb>;UopXD}}nyC;TOt zB5r9(26)3NK0YhF<{nA=EkOYY7WHu}pq{`|RrP*;*Ld)Yn^j#D0rl7#=LWvLdxB>i zhEdyNHvz6s$Nt((z_?YfP9G*snvtr=Q_GtG)VPR{aXn>?>kn0IMi5e=Sf62@L$k4~ zPl>({Gj??0yN}R9hNq#}s*x4u0DW833m7z^0UE&_!+r>;=P@pdd@|#_R%NYIb;7uA zo}Wd8OS1bHT8-xFfm)S;h4Irw+W@cRxIreK5G5iaz9d4mDzynkJ=x!&q?F~aA8X(b zuZvi6TO?y%{xpO|zBD9IVP!=mu^e;eMRF$et|5W9=9v=_=d0+u zFl!g-*O4x)&}5E2IAVE|fEp7K z5uJ5|fG+bPUPoetm|^8mxO=+Yj6)4Wk&{-vuVyD<#WpXb`3|TdJ6BS{Hz<&>lxFVm zil3Az^MjY%vZE7@F%1L@B&)2^S+4|zsxA&YX{LdHYx>Lqcj@#>P^7zVdXDeFzcnsI zEQrnqix4ou*~sMcOrn5bp{BZ(IIbSMK4|86NDpl!Nzz6SkNAiN+&wiEx_d3?P~#iB zQ6_Hfs4;7tg%jDyDY-%~mxA`)(;}(O#Ip0%nUz9pyO#SOkb3J4QFWzZ00000NkvXX Hu0mjf;D~BA literal 0 HcmV?d00001 diff --git a/app/src/gambas3/help/wiki/page.html b/app/src/gambas3/help/wiki/page.html new file mode 100644 index 00000000..fa3834f2 --- /dev/null +++ b/app/src/gambas3/help/wiki/page.html @@ -0,0 +1,37 @@ + + + + + + + + Offline help + + + + + $(noheader) + +

      + +
      +
      +
      + +
      +
      + $(link) +
      + +
      +
      + +
      +$(page) +
      + +
      + + diff --git a/app/src/gambas3/help/wiki/style-custom.css b/app/src/gambas3/help/wiki/style-custom.css new file mode 100644 index 00000000..34e06adc --- /dev/null +++ b/app/src/gambas3/help/wiki/style-custom.css @@ -0,0 +1,13 @@ +BODY { + height: auto; + overflow: auto; + box-sizing: border-box; +} + +BODY P { + line-height: 1.5em; +} + +BODY > DIV:last-child { + height: 1em; +} diff --git a/app/src/gambas3/help/wiki/style-offline.css b/app/src/gambas3/help/wiki/style-offline.css new file mode 100644 index 00000000..953b1ac2 --- /dev/null +++ b/app/src/gambas3/help/wiki/style-offline.css @@ -0,0 +1,17 @@ +.login { + display: none !important; +} + +.header { + position: absolute; + top: 0; + left: 0; + right: 0; + padding: 0 2em; + border-bottom: solid 1px #C0C0C0; + box-sizing: border-box; +} + +.page { + background: white; +} \ No newline at end of file diff --git a/app/src/gambas3/help/wiki/style.css b/app/src/gambas3/help/wiki/style.css new file mode 120000 index 00000000..7f431c7f --- /dev/null +++ b/app/src/gambas3/help/wiki/style.css @@ -0,0 +1 @@ +../../../gambas-wiki/.public/style.css \ No newline at end of file diff --git a/app/src/gambas3/help/wiki/tip.png b/app/src/gambas3/help/wiki/tip.png new file mode 100644 index 0000000000000000000000000000000000000000..7e418302b9963eebeb3dce400720e9325d5367dc GIT binary patch literal 534 zcmV+x0_pvUP)kdg0005qNkl6y%6vuxF>0&{vm7o@})}ez4BJNKRanNo$n?+5heuR7j5pi-V2=*&f972Y!QmmvR zR7+}$riyl!@N>AgB`a zr=51*x@(6N-4PVNSKalF46M8E1&WR0{OX1?L*a-sf!*9QgyVnpLJX*Q!zGtYtVGLf zs4uUKkl1Y==d}h{v=v&hiyA=64lQh zkIoD3tGe$(w488z#4vBFzV=uQXsX(byUD}pXp;w%kn~k1!Aj`y6$$ka? Y0HK?ReSDWs`Tzg`07*qoM6N<$f|7UmL;wH) literal 0 HcmV?d00001 diff --git a/app/src/gambas3/help/wiki/up.png b/app/src/gambas3/help/wiki/up.png new file mode 100644 index 0000000000000000000000000000000000000000..e0f524add98a941405ddbe802261ff9341dee564 GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf68a!PbLp07GJ!iC<3>V#!6260rC!FY7`sA(J=QJb1{jP@|W$!Kfy~N{* z)BUY}6K9-iF{p^2IOFsdozm9M>H0#(Gq>65RUKNf>rkNcWihUER)@I!A0}k5yS7Z4 kywTTH!&c+f=l?sIYuP%PZJz!-4|EHIr>mdKI;Vst0DlKc%m4rY literal 0 HcmV?d00001 diff --git a/app/src/gambas3/help/wiki/vb.png b/app/src/gambas3/help/wiki/vb.png new file mode 100644 index 0000000000000000000000000000000000000000..ac609e2d579be079a1f3104ba5375fc32f8cd87e GIT binary patch literal 907 zcmV;619bd}P)`}_O*{QUg<{QUd-`}_O*`}_O<|Nr~Up7)kF_@q+(>DBwmne}-9_Jb4t?cM(K z==FaL_?tlavTgj?w*Kwh^?U{QkuCrI{Q0O_{p8H`dI9!_8~^(C_@GPr!i)Xh!S;d? z{`T$v{{HurH2Je{{L-oZ?A!nR`Syz<`K)34&7k&;Ci${#`p1^_dII>TSNq46`L%NW z@8SH?s{P@{{`m6tg%Q1_ZX`n`ht)v)=lWc~K;^?e8Y*RuA3 z5c#TJ_nAEU%A5MdlKRi2`_iiU!i)EjF8}`h`n7ZZ{QCL5gZ=gG_?tof@#g&F%KEu^ z``f(x&7c17;q`q8``Nht@Z|M-1O4vc`Kn#^h#mj>_W7w?`LAaB!i@dw+x+6l`M!nx z=F$4goc-w2{p;HL&Z7SL_4%w~_JI%n^y~PaNd4~L`_HBP<<9)-*ZHw){M@|z*R=MC z9QdC}{`m9z+Pd|71pVpO_?}1o^XdKG!1=+7_J$btgcSFUC-;{*_@ht#;l=ifApiUL z31p&N00009bW%=J06*R8)YI42;tO_-hX4QpjY&j7R5;6hljU0iK@i686qUgk6;x0# zu@eKavAerFP!zkn5Qm8I2>>D|AW=^SG;k0Ukc3RhArTaiVw4T0)KCZlq@h>35C{U8Ej~kfMlgZ^ zndnzm5P|^Ne|^lc22M)@xp@i$<_BDr00qiE8Vl7S8Yn8plF~B7@(LSsRH_gJsFL=o z(NbfV5tdpdLIaLE#QKItY=UNQNQ(kN0H?Iq>M*vocleIc=||8jS-YgIZs@W1VqgEj zpoAG3_919SBl7J>$Hpgca%y@8478l}A}C;PUZyUzFD~J71)5-mR;z0=f&lB@*bUf3 z+}hr8?Xr_N8G-DBwmne}-9_Jb4t?cM(K z==FaL_?tlavTgj?w*Kwh^?U{QkuCrI{Q0O_{p8H`dI9!_8~^(C_@GPpn?e2H#P)_5 z`ofF--ogFn()z%M_JR@q_U-@v{`ZtL{_x}b%A5JKZ~W4!{_NZT{Q35aBKW6Q`^T02 z;l}>>^7e%m_nJQXy@LGLvi5-x{_x`a%9{6)F8}`h`n7ZUs$ToepZ@RR^?eBSehT@p zY51d1_J|$-`u6#$T>a?N^?L*Qx_tJ55B~J)_@7Amv1|O?y!Cqo{pr^Do=5!Ar~KQy z`L%NStYY?r6!(oM_m?^Nqfhh000SeQchC?+P#~LQfI0*P7w9CNe5`^CbQNkq zcTb#x1-;}Y9iw1@Tl9gx{(1!q2KdupW@wm)kvatnM%CFdV4R1EQnXtRCZ`lI4a}%< zHgZ)Kl*t4NbKxQm<`+T$Ert{TpYMALE^u(@Zyp_=_)|JPt0`D;PO+(I1q&`NgT1`#UImNm8`W?Y z-2NRhZo#=zR|W1#0v;X#2A&MyxmtZOmaiIkBQft9_>h554SeOK@8A6BRwIygh5P_b mmYu>sNvUSbNJ{+Ajr;;gzB9!bun5@z0000!lvI6;x#X;^) z4C~IxyaaN10(?STeKHIGGcYtXGyutVuZ7w`ai)?WzhH*OH#&8FK%T0ni(?4K_2dXv z79L(69v_L8W`+qr5|~wTek8KY;GTA15p#+NL)TOO-&QS;WPutOJYD@<);T3K0RX~8 BD((OP literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/16/arrange-hcenter.png b/app/src/gambas3/img/16/arrange-hcenter.png new file mode 100644 index 0000000000000000000000000000000000000000..0f557ba7902bd7af02ef780b8c80477a7433b911 GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaN10(?STeKHIGGcW*ALqo#~ah(Z3ai)?WzhH*OH#&8FK%R!Di(?4K_2eJ? zEIjNI5;GRE+-8wr6t~`z6>8k#5VU+NliPu#4sMJLAI?b1Ye|If1nOb%boFyt=akR{ E06(WIH2?qr literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/16/arrange-lr.png b/app/src/gambas3/img/16/arrange-lr.png new file mode 100644 index 0000000000000000000000000000000000000000..9ab65ac2a065ef8216cda008bc3c2f8f1a451be3 GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaN10(?STeKHIGGcW*ALqo#~ah(Z3ai)?WzhH*OH#&8FK%R!Di(?4K_2eJ? zEIjNI5;G+EEI1fCS*0ADnz`K?b|!HC*`&bi;Ks;sQcC=^cG4LRpdJQKS3j3^P6!lvI6;x#X;^) z4C~IxyaaN10(?STeKHIGGcW*ALqo#~ah(Z3ai)?WzhH*OH#&8FK%SbXi(?4K_2eJ? zEIjNI5;G=tB+ucTEXlX_LROl^hK6npP6I|GE{2z(5_3;p+42;qgTd3)&t;ucLK6TN C9V~PJ literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/16/arrange-v.png b/app/src/gambas3/img/16/arrange-v.png new file mode 100644 index 0000000000000000000000000000000000000000..5f39edd79cf38137f1e1fcd87f3f1c51775f5420 GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaN10(?STeKHIGGcYtXGyutVuZ7w`ai)?WzhH*OH#&8FK%SDPi(?4K_2dXv x79L(69-k8}J)9FB{AW;^!7rfBsN~?r$S_+#U}BU0Dm9>L22WQ%mvv4FO#m7$CvgA( literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/16/arrange-vcenter.png b/app/src/gambas3/img/16/arrange-vcenter.png new file mode 100644 index 0000000000000000000000000000000000000000..583e29395050198acfc472a08fe2436da74c1bf8 GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaN10(?STeKHIGGcW*ALqo#~ah(Z3ai)?WzhH*OH#&8FK%SPTi(?4K_2eJ? zEIjNI5;GRE1T)Xc$V#(#!J@)vdXU3FT&Hmf-#YOW5r$GJ8P6d3_|-sN44$rjF6*2U FngDI7DhmJr literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/16/average.png b/app/src/gambas3/img/16/average.png new file mode 100644 index 0000000000000000000000000000000000000000..66dc53f13b088a3ff4c715affddb65d5963a3b51 GIT binary patch literal 416 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJXMsm#F#`kN5fEmas?8@26r3O6 z6XNP#;FACbv9YoB_4Qdx8O zQsUy`AV#I7r9l)xxIi-@T%b5m1R@KOf@^^oo8kFj3(y@VB|(0{41d0HGw~ExNif#1 zEwX;)+?p54a_v)OthUnOooi0Yn9XqIzuoC|fphjo*1saZ-`r74cxDt6v~o63f4ZlO zV~E7%P;k-siz~Y1@hgazw?i2_JzkKCFxRcqj zhR%x;M`J>BW1Um>&6&p~J(;CRUq^NIQ6=3&T;c)(Q&SQiJb2s~dHBpZ{zVl#Ejm7F ZFsNs->lUqjTLH9^!PC{xWt~$(69D;Pln?*_ literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/16/checked-gray.png b/app/src/gambas3/img/16/checked-gray.png new file mode 100644 index 0000000000000000000000000000000000000000..c8d293578bcfad26478d4c6ac13791b21c3841cc GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFq<&F77hvbOGvT@O1TaS?83{1OO+$KE40| literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/16/checked-lock.png b/app/src/gambas3/img/16/checked-lock.png new file mode 100644 index 0000000000000000000000000000000000000000..d406624e3b72d0053ee411fe1287de70c17600fd GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHVEbxddW?X?_wfUrhg8TtK zA+GKPJ_!j4abN&saDLmT29#nc3GxeOcok??{pVBykgwwD;uyklJvre3`wSNu(E~hg q%xR1U&8>|G8GUv$G&0}hnZv-)vV+UVAc_T~pTX1B&t;ucLK6UI|0ys4 literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/16/checked.png b/app/src/gambas3/img/16/checked.png new file mode 100644 index 0000000000000000000000000000000000000000..256bc424ecab2e716af5a3c8413dd6bde5348b0b GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPHVEbxddW?X?_wfUrhf}#OF zA+GW9@v*V7?gc&x2?;@zX9dYa0V&BWMpIg+un4s@@EE&IV3?pd;Q@mPgOSM1OA?B=9JLPc9CctS aV`O+#CfHqC?5_tjh{4m<&t;ucLK6V7Tr`aU literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/16/close-window.png b/app/src/gambas3/img/16/close-window.png new file mode 100644 index 0000000000000000000000000000000000000000..8b5c28af601e9f906ea58b3de8120ecd4dbe2f56 GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaMM1AIbUeKHIGgTc8}(|VvFQ%R6tFhk=Tow`0CPutVQF@)oKa)JYE53dg& zj}P|_DG7_I literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/16/collapse-container.png b/app/src/gambas3/img/16/collapse-container.png new file mode 100644 index 0000000000000000000000000000000000000000..be2091499ba39bce73486ede9440966e1356db4c GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaN10(?STeKHIGGcX)DaG;@~;ZX8?Q;?#PAirP+hi5m^fE+DP7sn8e>&YCv zya@>f2?7=jN_>I}4PE?(42)AY{Qob1CaFmvW_8$FCWiH21h1%ePvimWV(@hJb6Mw< G&;$VXRxQ;4 literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/16/control.png b/app/src/gambas3/img/16/control.png new file mode 100644 index 0000000000000000000000000000000000000000..70e9b01bef20357d6ba9e7c1b9ff9e9051dbae5d GIT binary patch literal 411 zcmV;M0c8G(P)5 z+9?3>FM+H^Y!)h?Ck9C@9+5d_~GH<`uh6b-rnWqQ`_sz}C)z#J4 z*Vn?r!a_nq+uPgG(b12erUw830H{esK~xyiUC2icgfI|9QD-n(}1y(AwWir2`|FXj3Pi96e1)iW6}Tt zj3)tP?;Sh@D1b=CsLq|N7^5V5pLk^qL-uX6jE zMH3^y+4uGJ`Mqb2j{p_tyyBnb5n*sZq_xI1(K<9>(+@wD44vpoV5k59002ovPDHLk FV1md_*yR8K literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/16/cursive.png b/app/src/gambas3/img/16/cursive.png new file mode 100644 index 0000000000000000000000000000000000000000..dc69dfda2b31ae1f7f8011f43a08a8b6ee7462ab GIT binary patch literal 551 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstUx|vage(c z!@6@aFM*uf0X`wFKADA~p`i|7;Oy)Sq#Yd{AzT+17dtyUdwYAJS|ABjW^8N>kphxH zS)d?XF+?L!1juj#0|*>Gg3H1g zKyhRM6o2bEBd6=ixRIH4$GhoDsp=Qz@AH0n zN?JMba#`MnphI(*xD+MT4x~RVYW}Bx_b~VOUR&#Jj$X+gpO$EBisaWc>nWE%n70CG z<}^>9?IFwGKQzc_U!lvI6;x#X;^) z4C~IxyaaMM1AIbUeKHFV95~R>(9nJ$F%G1nB*-tA!Qt7BG$6;=)5S4_<9ad&D-#<# z8=D))!!1lME*YjwoS_OEnLI2EGEAMO7U(hv&EYg)I@9`^Rg#rKS(%sF@Yb7qK!lvI6;x#X;^) z4C~IxyaaMM1AIbUeKHIGGcYtXG`!t%={HD4NswPKgTu2MX+Vy;r;B3<$Ms|mRwg!f zHa0hohg+C@GE9{O`FIkTmb7Fusxe;YHsWFkG3C>bz9&BmsD;7P)z4*}Q$iB}aQ`Qg literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/16/expand-container.png b/app/src/gambas3/img/16/expand-container.png new file mode 100644 index 0000000000000000000000000000000000000000..18860cc4e341e3ba845efac49bbd7e958dee1c24 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaN10(?STeKHFV960cwfuW(H;l0XleUPG(AirP+hi5m^fE+DP7sn8e>&YCv zya@>f2?7=jN_>I}4PE?(42)AY{Qob1CaFmvW_8$FCWiH21h1%ePvimWV(@hJb6Mw< G&;$Sv%`O=L literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/16/fantasy.png b/app/src/gambas3/img/16/fantasy.png new file mode 100644 index 0000000000000000000000000000000000000000..74859ad0eaa942a5cb50635953025c2aa19a6e02 GIT binary patch literal 478 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstUx|vage(c z!@6@aFM*sb0X`wFKADB~_Vx}A4iFN^u(Y%Uk`UnJSlsv-sZ|qqyhSPuopls?(M_x6<*NdIR$s z{`kMi_lu^rUVc{fE7FZsROwQFfT~J&&Yw1$xxzo@UVZTsXiTH0i(`ny<=+0|LQM<; z&f-hF1g*Kcx)R>An*9GCzs^`Ez37DBy(be?vsT>RToc1z`X+8)!dza);63+R7d;Gl zx-Cu9MgB!lfZ&Gv8$})@pQ&@vIB>MZc9RXG^P7Lix3Tt2*d%SqCi)^__s#W22c~%G qKa8yE3A5e0KjM7)lNr7D{xD8j#{H_=l-U{R7zR&QKbLh*2~7YkIit`3 literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/16/max-window.png b/app/src/gambas3/img/16/max-window.png new file mode 100644 index 0000000000000000000000000000000000000000..ffa7e5054d0c39631ae2b52360a6711e569012dc GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaN10(?STeKHIG!+`zn_Cr8%=8_=4V1~NJi>1mS19d!I978y+Cnp?Wn<3S} z@}FHH@jtuApN;7W3I7h%H#Gid_{`2$#@5Eovx9-b-<2cS!besesE@(Z)z4*}Q$iB} D!*(>0 literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/16/monospace.png b/app/src/gambas3/img/16/monospace.png new file mode 100644 index 0000000000000000000000000000000000000000..1545bc7c6267c877194b029f415aa2ddbd4ccf25 GIT binary patch literal 372 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstUx|vage(c z!@6@aFM*u80G|+7pUgrBQ~;EL3s_oOI)Z_-volc8)6>)5-X6#Rl0X2IfvW^EoSd8> zQb2K_EJO;Z(az2e$c8J1O92^tij2}g`?N}e{DK)~6im*!z{qojgVWwit%3dS1II+? z=^hidSiL*glzQ4iOEo#~ME}(afx?O;zGXmNah@)YArhCDo_7^$FkoOlFvW?ty!`)v z_KA)B4t>^^DhJv(XasJ(ym)OgTe~DWM4fKA>^) literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/16/percent.png b/app/src/gambas3/img/16/percent.png new file mode 100644 index 0000000000000000000000000000000000000000..667dbe7be4ae61a7a697739e13291dd065185a21 GIT binary patch literal 547 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJXMsm#F#`kN5fEmas?8@26nqlk z6XNP#;FACbSy@>?IxQ_NIyxFC86O`HrGKz2$>N^EQ_kO33{ zvg6|7Anef4P#^=shA^Nf1GxOCY8Jxe#YSNT60A0~tU>fFw{Q z+yM|nASBDNwJU*M@-7MT3uc&lgJ%*KAEWk+w5NCG-e>A!+0DL5My#q$T>5A?+uoO} zO`rc;x>(OYMk&g`PR%O7=J<4xz*(h}RbM}tdD%PJZ(8Q;o>jv0-Og}a%&qa|1sdDu z>Eak7aXC3bfz4y1M!`m71CHV%2i7H$r8|5jBvf2(DAt7K$Fc<%v)QV8u3$3D_hnPg zPLr$MA?cHL%%^Nl9*46i?^>BRKW_x+6g@3_{`9j!!{?i^b7c2M?5ude6lFHguZKtM z-kE@XEB2T%bL%(H+N9HRUSH+hfrRXp>$KQI4=5^dn7BE+y7g$xXJQE2%wur-b3Z5< OFnGH9xvXNS%G}U;vjb? zhIQv;UIICs0X`wF|Lg1jGcfpM7OrOPhy)5Umjw9**Vi-f*7S7&xr&}Hjv*Y^lM^l^ w30zIeh&;L>L-a5gTbrmN&*~P5uu?__$0=+Ti%!q42P$UpboFyt=akR{0N=hTy8r+H literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/16/red-arrow-h.png b/app/src/gambas3/img/16/red-arrow-h.png new file mode 100644 index 0000000000000000000000000000000000000000..40b6a7b7062a30db9268be947ef429c8ad70019d GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^93afZ3?z3ZhDiV^mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wF|Lg1jGcfpM7OrOPhy)5Umjw9**Vi-f*7S7&xl*1kjv*Y^lQW`@ pUf9&NFtmH&RqmcG4tJJ?GQ=!k-&pxPrUj^q!PC{xWt~$(695x2DtrI{ literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/16/red-arrow-r.png b/app/src/gambas3/img/16/red-arrow-r.png new file mode 100644 index 0000000000000000000000000000000000000000..6692b05cb02660d8d5e7253ff6652817b73d4a89 GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^93afZ3?z3ZhDiV^mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wF|Lg1jGcfpM7OrOPhy)5Umjw9**Vi-f*7S7&xw4)vjv*Y^lOIGK sRoK$y$l_6CSiotxMkq0YRb?lGIS0$sKl3#bfC?ErUHx3vIVCg!030eODgXcg literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/16/red-arrow-v.png b/app/src/gambas3/img/16/red-arrow-v.png new file mode 100644 index 0000000000000000000000000000000000000000..3e3fd9befaf25a6f5d7a6086c0cdf0d46dc385a6 GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^93afZ3?z3ZhDiV^mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wF|Lg1jGcfpM7OrOPhy)5Umjw9**Vi-f*7S7&xpJN^jv*Y^lOwiv sF><&#OGGtGh*cS`xsb%rwI+&{!NZ2_*E)reUZ6?_Pgg&ebxsLQ04vicI{*Lx literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/16/remove-from-container.png b/app/src/gambas3/img/16/remove-from-container.png new file mode 100644 index 0000000000000000000000000000000000000000..243fc86f73231d80069f887c12086a7cbb6e30b2 GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaMM1AIbUeKHGItXRQN|G!P9H4LPpB*-tA!Qt7BG$2Ra)5S4_<9ad&D-#<# z8=D))LkT9eEm9LX*x3vigAPeGcpmuL)WgK^@*H>j@z3mKKrIZOu6{1-oD!M3f*DqYK9VW4IM!=$YF0H+(9P4uF@)oK za>4;dHJ=6}i-RhQnYfyl7HKWsAUNURss|?{CcWgG!m%YKB;iU*!UKU*Ed~PVjW~b6Mw<&;$Uv<2_FR literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/16/round-ne.png b/app/src/gambas3/img/16/round-ne.png new file mode 100644 index 0000000000000000000000000000000000000000..bb940ecc3f777f7019e3bcecb0beeef708488607 GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFS;1lBNlUWF4;sN_q=9K`Yxk`fkf*D?GpZ-0&JDS_NfTOnnDC*?t;uykl zJ-NVSZ307c=;~=Kj*_dxR1ZjWi!SI1on&y#iB%(cDr3(^o?{V98IoBJNXQu+E0Rdo i?Aa)BEP^9hhmk?zfwRc!3>F2D6Fgo0T-G@yGywokX*P%e literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/16/round-nw.png b/app/src/gambas3/img/16/round-nw.png new file mode 100644 index 0000000000000000000000000000000000000000..6b9e731559d0e0b32c8e1b9a3d1ea040960307a5 GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFS;1lBNlUWF4;sN_q=9K`Yxk`fkf*F3lKCL~wJDS^iOTZLKps0(di(?4K z_2dMG#%~F(25+^tW{GyBMQ`Ogld!SLNNsJCLBy5?JkLS{+{C6F+{AS%q18|-u}4cn knd{hwCc`ZWJenHJ496zeOKjRDkq&Z%r>mdKI;Vst0DTZT*#H0l literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/16/round-se.png b/app/src/gambas3/img/16/round-se.png new file mode 100644 index 0000000000000000000000000000000000000000..5a672928ae3023bab4d2c5dd18c4d0d922fb7f79 GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFS;1lBNlUWF4;sN_q=9K`Yxk`fkf*D?)*8V-aJDS`2Lj@ljP}IrO#W95A zdU6CSqqoF@o>qfnN)pMMJsV|?eP}RbO5kDENS0)tvXCKF$E3kXMN*;1l`X)HiFw9G h6$uw(i&bF_nGBy^J1duj1|)%;;OXk;vd$@?2>`&uG_C*u literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/16/round-sw.png b/app/src/gambas3/img/16/round-sw.png new file mode 100644 index 0000000000000000000000000000000000000000..622dbf447960e9ca3357252fff63e550ed9bcc73 GIT binary patch literal 216 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFS;1lBNlUWF4;sN_q=9K`Yxk`fkf*D?GpZ-0&JDS_NfTOnnC~EKN;uykl zJ^4cvDLCoEppA_UTyaA~15g~uH8wT|N&(G;D1$3N=IUlV*#~r@O-Ybn zFvA~a)2;L8-eCNa_tW;U@tc(wIrl_FPf*@?zv5r*4JhnX|A96*!AL# a85r&<^GN!lvI6;x#X;^) z4C~IxyaaMM1AIbUeKHIG|NjrqwKI6S L`njxgN@xNA`=Ku2 literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/16/separator.png b/app/src/gambas3/img/16/separator.png new file mode 100644 index 0000000000000000000000000000000000000000..0fff7765b8c4c3e6e7a0983dcbcd99b12a73a31f GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;OS+@4BLl<6e(pbstUx|vage(c z!@6@aFM%A+0*}aI1_r((Aj~*bn@<`j$QIxe;_8!Gn2?b0>qx>Oke-qtzhDN3XE)M- q96?VP#}JO|$q5J8E?siq0P0XHV4V4F$-+B8Nd`|>KbLh*2~7abuqMp_ literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/16/serif.png b/app/src/gambas3/img/16/serif.png new file mode 100644 index 0000000000000000000000000000000000000000..13cbfdf05d60711e2b3af093a3b3501dd0d323ec GIT binary patch literal 493 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstUx|vage(c z!@6@aFM*r`0X`wFKADA%j*g+Bp$;$rDn8c+nz0J1GDEuEd6;acFPLA1lgfm)oLoPe?r1wh*&QX3|CngJbZ zUlQaO%rK2PVS<9!krGB@k0slD_+QVSt9x;E;)ilyoznu(Huybd-DBYGa4^f|HVXfe10jcV|8aSV~ToSdM*rjhkRdd90&N-SI6^sZTx z`$gg*Q`<2ghf7D|Sk)FJb1Lb+5%jXiy*Xp1<(sJqHL1SU#@5BA)nyv-ZU^IHXE!#A z>M3OEa~p{$Dx~T2E_(8i>Cm@tK@QDNA29Lge0$_1q_pT8lg*ug=$|Z=kvD!=T3GDp b_^8S7+=WNS=C~CoVi`PL{an^LB{Ts5YA~Dq literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/16/stack.png b/app/src/gambas3/img/16/stack.png new file mode 100644 index 0000000000000000000000000000000000000000..b8524680b1fac4a7c2305164b190f154b7f60b98 GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaMM1AIbUeKHFh8X689II!2@g)m4(NswPKgTu2MX+VySr;B3<$Mxid1l|N7 z5Nr@k(33G}YqK&iSQo{r>=47k!OFz8fI+#1p^#A_n&a<57dvO5J_b)$KbLh*2~7Zq C6)Haf literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/16/tabmove.png b/app/src/gambas3/img/16/tabmove.png new file mode 100644 index 0000000000000000000000000000000000000000..0826743839637cebbd0f81a4a98d5a240f335ca0 GIT binary patch literal 275 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstUx|vage(c z!@6@aFM%A_0G|+7pUlFYyLK;Hv}phS{oA%}>*(n0>7DT7$B$*pmH|nisue3%KYjjY z$F6+~7A$!1=*7DAo9^Aaw`b3u`3n}UTet4cojcpM?L63gq8q4`t0c%Tn8D%ye~0}I z4f`GD=Faf}iiUZ*IEF}EEIun#A`o-y@ELtL0AO!j{T8 zzeS>@8ox>mdKI;Vst098G7$N&HU literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/16/tabstrip.png b/app/src/gambas3/img/16/tabstrip.png new file mode 100644 index 0000000000000000000000000000000000000000..fb8515c48168e30c71e7fe953d261241c2f6fb11 GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstUx|vage(c z!@6@aFM%AV0G|+7pUlFYyLK;Hv}phS{oA%}>*(n0>7DT7$B$*pmI28XD^@>!{$|In zeG3*Wc<|`Oy7imx-MhDE&z|`U7Oh*i?#`V%+qUhT#B0b4G>xky$S;_|;s1Y!{S6KK z9p>iF@d1k3dAc};NL)^Skif>AD8{Cd&=#QNWaDt)Jcqb|z*9CRJF^`O%N4{qHf%b; sB4Kg!V1u|G1FKJSctbNMYXJj8%NfQ$8O%mXK$93eUHx3vIVCg!00UQE^8f$< literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/16/tile.png b/app/src/gambas3/img/16/tile.png new file mode 100644 index 0000000000000000000000000000000000000000..b5086632a9c57c6616dffdac16e58f3a11f58eec GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;OS+@4BLl<6e(pbstUx|vage(c z!@6@aFM%Ak0G|-o{rmUF$H!Y_?G*)z2za_UhHzX@PWW-YLG+;j8$;cG{*O^-t7ZY^ O7(8A5T-G@yGywqUR3AhD literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/16/toggle-container.png b/app/src/gambas3/img/16/toggle-container.png new file mode 100644 index 0000000000000000000000000000000000000000..fe4c5fad194c0a3ac5886e9c41521278548f205a GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaMM1AIbUeKHIGGcYtXG`!t%={HD4NswPKgTu2MX+VySr;B3<$Mxihs|U7p zEo^LT_!@p sBjoAg7{YNq`N#kH3mYd!eEDzBz_Wsz``Q5sS)eR~r>mdKI;Vst0KOk4y8r+H literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/16/white-close.png b/app/src/gambas3/img/16/white-close.png new file mode 100644 index 0000000000000000000000000000000000000000..b4d08d2b21e4b36c4072ae9b7f89da96d642a0a6 GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaMM1AIbU|NsB*lUWEP9j{EE3lwB33Gxfx$G~&dj}ORG@pN$v;kcg6!OFx| x(qziup;5)a$?vKlc!f*(K+Fb~2+n133^MnH-xhx?b_S|v@O1TaS?83{1OWbtD@p(W literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/32/added.png b/app/src/gambas3/img/32/added.png new file mode 100644 index 0000000000000000000000000000000000000000..e30758b6cfd284079d11147ae62584a143c525d0 GIT binary patch literal 326 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP|zm8 zC&bmgz{h_6e+aT$@ZSN!lvI6;x#X;^) z4C~IxyaaOW1AIbUeKHHpE{-7!fc;x*gPz bNMK<2{+`KDXlGsy&?E*=S3j3^P6x%&Tg$QTQQ*G3*5Dn`bqt=aelF{r5}E*%0)n{! literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/32/cross.png b/app/src/gambas3/img/32/cross.png new file mode 100644 index 0000000000000000000000000000000000000000..e7e93e4e4f6bc735baabbe3bb926a4e0e65d991f GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wF|NsB@$t(o&9J4m|11YAGAiv-S248{DVj$1R)5S4F;&L)aD-+wA z9svnu50O(GB1>0sFf$7?Gbd{}pYRcw(Wv57yL*C*Q$e-lR7QqWPTxrW0^w~y-3*?t KelF{r5}E+W!zyS1 literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/32/do-not-translate.png b/app/src/gambas3/img/32/do-not-translate.png new file mode 100644 index 0000000000000000000000000000000000000000..f01771b09e5e7ac359838d2d93f9a015999f6c4b GIT binary patch literal 433 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP%t^b zC&bmgz~_HG!~bdq5ZS=+zXr^xgONZHpg05p*$^&7_W%F?U1I-VUisf8`oCM^|Ep{N zUtIeC`o{mw>HoK6{@^rkBlhQxIL+_*$LCPpR{5c*4p}@0yh#%c~YL2F+^_>7SRheHW|! zOHKK2|DW&*#hy<;v*>cr9z`h?v-*sW4O$J2YFqgCF%<8n*=i7WUR zQCjePr@q*;kF`%NS%G}U;vjb? zhIQv;UIIBn0X`wFKADBFv9a;-@rj9v31Dz#%Ct0~ENe-SUoeB%<#Q)~2$A%m7c7t022g-ploqHG<3 hLOp5>-|r-_F?j#wKcM{R!#1En44$rjF6*2UngBk(Ia&Y! literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/32/exported.png b/app/src/gambas3/img/32/exported.png new file mode 100644 index 0000000000000000000000000000000000000000..bb27581f92844072d8ef480911a9fd155c26571b GIT binary patch literal 600 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAQ1E4g|No&P5OE-hECN&jL_ooZ4?*I0?tmB&5r`oWDTuK^ zaiA4NjCP-tJ52A`pVz1@L8u(uXAQkui*4AljbbUHR+l5clP7& zQ$>~ap8t-XH}m-9U-9(^v?GA#-S>2H46!)9chXg%!wLefk1v>%mY0`*|NB2bD`S~% z%LyO(s`vzp^n^%(mi@~^J_~k<=Et#mRB`1t>=Dmzm^rQef}+!zxyua&3vPx6Jeaz} z*jM6UgDOjtTa%iH4e#dF)&`bxOP)HrOuNWB{mi}UJ9B=%s6KV4bN)-CV>aOe!5LT1 zz1I9T$s@5+F*V=WW7$rbN7ACpS~obWmquNvT$dPiKuWzMXJWPAi3kOujmLP@V@`b9 zwQ}WT#+hF&9ho9rwx?XXJ>z`c(-xT{W%K8Y9=Eg(SADkIfAcC|ho<|7&Q~(|D|w6h T?*HZw^eTg=tDnm{r-UW|K>-~Q literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/32/filter-menu.png b/app/src/gambas3/img/32/filter-menu.png new file mode 100644 index 0000000000000000000000000000000000000000..13fdf943e6e13005e8fa67cd7045bd23e1026e7a GIT binary patch literal 530 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL*0(?STfix!Y$t=VaBu_-QD*g*lr$R}PU$BA%6StJGEQ35FzZkO&rw}U_ z2M?R50I#$h3%iJg1bMM-(_(`vZ*^-JE`M&D-DmQ?L5` zQMp|5Q0w6z1*S(|x*y(mFg0~{cXvn>ZJN64x7Y;LNn5|LU1%!`j0zdJigpXcR+O;?q5 zr$~L8y4cd{Z;7?GS4`;bfPIsnELzupZJx`ObStJ`D|W}2&vs4V*!AF}=l#Bb-Hvn3 qYIQeFJbL@4{@?cF+5dj*+Rw0hg7i+O8+xlivEu3K=d#Wzp$Pzu#Ip|o literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/32/filter.png b/app/src/gambas3/img/32/filter.png new file mode 100644 index 0000000000000000000000000000000000000000..f61efdfe56145c1843069f2f5fec8c46432c3193 GIT binary patch literal 521 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL*0(?STfix!Y$t=VaBu_-QD*g*lr$R}PU$6obx4f{d1OuZKzZkO&rw}U_ z2M?R50I#$h3%iJDN_)CEhFF|lJNahOVFeyn{qB_v@4aQxGynb9*Y;>< zH1}I>e08#}Ea!!(A3keD`(FfyCwTiOI~1gsIi@S_xT~yXEGU#@q0Y%yj2{SuQM%RlTK}Lbxl2O zvGjZcZ`$?Cq8Y{x4>vNaC7ftrD`VeLv6@9fBalgMg>l2rl~Y2G&f^Xu%=Xt;1YdX?hU^5?<^^CRR;f=?`3&3{U)h<)w(M4l<8-!06u?F^PQpT4@? zB%th!d*8GdDW%ovS~=UYHRpSNGF;bxY@Sb#ehCYY;k%awg~tTUOZG%QNS%G}U;vjb? zhIQv;UIICC0X`wFKAD9KrMe6yIt&>a3~tguVG#G6E{NQ$%ehaw9Vo(H666=m(9qbQ z#qF?&K|Bd4nR5L(S?~62! y1)L^}b~`ipF5rA|i7zFAK_o%gg+Z{*k%z%NFZSOfD~@d-dp%wKT-G@yGywp1jy2o> literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/32/linked.png b/app/src/gambas3/img/32/linked.png new file mode 100644 index 0000000000000000000000000000000000000000..c7e63ca0ca336d0b73985edcdd63b3276c654879 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^96+qV!VDzu-cxxDq*&4&eH|GXHuiJ>Nn{1`8HU2`q@={h$0sBtBqk;T$yJ`A-arLxB|(0{3}WJ!uUzwd z{EZDLV(aPR7{YNqIYEFkDIvk6I4MEEPb?w9gPDng@yW7Al}i#0UJWdhnINS%G}U;vjb? zhIQv;UIICs0X`wF|NsB@$t(o&9J4m|11YAGAiv-S248{DVj!==)5S4F;&SeJYrX~r z0oTB&=*Kz-&h6lm7D`T4GxknWEIAU&_1-agiIw8?^DOVR{~WYh>QAg~rcdQT$R9@s( hyDs;^5BZ85Z{~%MvqT7@l{IgnxlVhfBDnQ z3m#_jJDYW_d6|p2k6Xuobek$+*0CqZk4NATvy<$cmIEqt&sul}9s9zmp4#S?$gHH^ zYZdkOP27FGORpC3&VO3-B>4A}-T7>3|Llr_|JGy_zVQwVUGvA_+y2YkVQTVSp}P}r Q0{z6`>FVdQ&MBb@0A*RJdjJ3c literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/32/opengl.png b/app/src/gambas3/img/32/opengl.png new file mode 100644 index 0000000000000000000000000000000000000000..e682e21933598f4d915a33b2c066a153fe49b05d GIT binary patch literal 1329 zcmV-11Px&08mU+MNDaN<>u${_4iqYpjU&Q`~3a={r&&{|NsC0 z|Ns8~|NdTzrCf-kWR9uR*4gv+`2PO>TZf|U?Ctvd`fP}r^z`)f_xktx`}OtqScIQu zk*)jv{*KP@csV&`uh5}zsT$G^zQBMs=&{0ik)DL zsEVSrvcb!ElA>pcq1NB#T!WhT`TF7L?(p>XZHbzIm88(x;*_MXimJYMkfNBSu9>mH zjjh3MhM1?Wv)tX^=;!C_>+EZap7QeZ*W&5R*x+!JsrL8yskg$s$<*E6;M?2Xi+O%Gvs{IpVvebAn6azF({hic@9**1;pKs!vdhucT7#b7;NxnH zqyGQ@!qMBj&fC=B=xK$P=jZ3?>FVL*w)XY( zg%e(()9WI%F)%5rLks&nwhl5)700y!Ns!2)K-3$+UDzC zftPZavT25vR)U_6rMFFXk79q3N^*@+c#-`3`c`<2S$&kc#m<(YtJ>S#$;rx|s+PJRsE3uL zd6%kdh?s$(wdL#ZldHRDhMKs=&~uEPlc>14y}-!L&sTbnft#z~-`}gf$zF${Vta~a zg_WGN#87jGvcJihtGS!9!|?I(zsAaQj-Bl9@P?hQb%v6TpsV!s^iFt^>+bQDs=3wG z*68c$iJz@FMdGu)1M^m6M~e zz|h%%m!{U?=4^=tbCrdh?Ssm zi<_skz~SKGj;_FclA?#7u&%$%d5oLCzr)Yd*ZTSUa*d&IikW+!w`zozvbDL2slR!R zoW8-u)Z5}+ev@dCt2Pwen*aa+2y{|TQvm<}|NsC0s?N*tNdN!=yGcYrR5;6HU>F&I zod96q00T}=PFDG%k`jJ#6^;ZBWB^gXSEL#R7Aj^_MR)Zc7I$2nge0X`k%4$L69ulL^~dC4Olp zbq|9bix=uxn@{HhDhLc^mhD-`!Qp!A$>Y1{z06jcA28dsee0$b3)I|JffQ&8O3L=` z<>YXEYW2zM-5rZ_Cl7k>+qjK!=TfcJ(?AORLzpF5)(W#d^ZokS?W6Pk8y8Ny=y@7$ zHntI&X{ehV#UK&P!o#h7>G?~af8T!p{P6zXwKJlJe01k7TQZ}sCB;;cfg>m)mY3K4 zwbPd$e;hz`jLg>G!Xx-X)AO&1n2}h~quV!+DNZav z4r^Ye6Z43W5;dSR#F0S6A}KqmFFP_2nd zQ#OR&ns;|T!$oeB7{S7$E2V9iIC;2q8d=y_{a!dTH8WX%QD(n#SdRBNS%G}U;vjb? zhIQv;UIICy0X`wFKADBFv9a;-@hK@O2?+^_iHShcX?cVWPyt&>kY6x^*k$o6*VM8$ zo(77zdb&7W#~DSY45qxU6-+!%o=hv4da{7b1XT?t1yzAY6AOa_ uiVX`{+ZRe)TV&01_@%_W!yo=RFf;Hb3V%Fr`~3jWKn71&KbLh*2~7aF+CC%z literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/32/uncomment.png b/app/src/gambas3/img/32/uncomment.png new file mode 100644 index 0000000000000000000000000000000000000000..f50784ba0aff624d933cabc91d98cf261cd8cb6a GIT binary patch literal 325 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaLr1AIbUeKHI01KA7=@$vCMhJ%AcWMt$W28IU=3_vbWFd-oUNJ1E)p`k!V zT3Q;AjEjp)Nl9sFXaKTfVq$lFzu{eEq!cL(E1s<2?CdT*C5C7X=$vD64(xGsNjrnS` z1!{c)IXwyjE5apyZJJkjR{32;ubG*~{b@IRH$16WSJAY1e*)8edG^VIPM?xC_$w-V yJo#CvksrZbWSHY6_GHz9-T?1a*{j-r&EZyLWqtbImVGzSVg^rFKbLh*2~7ZRe{=x= literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/32/wrap.png b/app/src/gambas3/img/32/wrap.png new file mode 100644 index 0000000000000000000000000000000000000000..71d6a2337154253cc81078cee2f88eac6200a9cb GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIDN0X`wFKAD9H2??R0p+FJ>l9Q7m43);Sc|c_xB|(0{3|Badex8*-Q~2C_ zHBijj)5S4F<9u?$0;vGLmoHv8JlgD8vVcpYX~zjBu@_8&FPP+5Sd}=Wx)OCyBx*46 koKnqT;^8^$*}%lWFiBHA)_v1{ZJ;p>p00i_>zopr0O@c%8UO$Q literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/48/all.png b/app/src/gambas3/img/48/all.png new file mode 100644 index 0000000000000000000000000000000000000000..1ba5f7bd9a76ea8b4d442f06777bcbe52cb5a2f8 GIT binary patch literal 1521 zcmYjQdpOez82&};bmr-HS}A#^b1G4yn>bQ(nM=7Yx`@t*%B2toT}@(}MC4NBS_c)H z(rUBKWo^SWA?7lf%d{D`tX*w$R_C1OIp6bsxA%Sj{637gr^^bk0T=*)6>hFhaBbiH zJ(ufhD}w#=8*N*9!QR6j0P3^!R6!u^z9bgz;sDe!4fz0|W904b3v&;P`5Xz1M*^Ma zfzMF@CjuD#f&UMm!+_CnU_@*9PyNR;8VP8@(INuign##Z=YP}@?Vweo|7Dtxz~bVf zRy9T9H7ezJ0%YO_R3(~Hi3Oa?py}e1Q|SjrBXy*GxSh#_`PTeFzS!rk~xifVeV!8*X9SD7_bPRHZNaLs?_$GE%zFS<|ze)ex6#R zQK>bs`>hLV%>guNZz}O{MswO**13vK^OVM8x$j+aD3oD=^wXO?sl>jiug=+&eQCtJ zW_Huyv_~FQp;ABVoOseUR!-*}K#?p`8e4}2JCOMOX{64vxwoIb9La3K_w(NM@ji?R zi7ftCnNloY_@-E>W{j&en!AL-bi&}37u|k^ZGYDG z(ivXGWKWBS_+sw@S~`AkY*zC8!$fRNcP(>rN+dg5+HnWR8lDzgqDW@Rge>9^20!5Q zkY})JacK{ z%E@W~(6x7SviEhR=bex^ZrTGO>+GVY9gM_A!}O>lVCv1b`(r8Pu?gQpp({IUPMRD# zOaHtotWbEpU@~lLyWfrA;E9Z&^70_syMYZxe4|$_tBWhMFH&qQ;_MzI6&A^hRB=3V zHk9YPt%tSN&e}UUwid<>rS|nvL%Fd2fY4pL2aBUtR(LzZjMr>^{acFpPmcl>0^R6C zq#lQW_wYxVu1C;%rMI?kzngf!#tfkKdN=4v(J#q6-?PT|Gs znjmaXV#O0z4U#kpDIersXGnjO|6=#ewAa@*8y_Jfi1l*5vnC2#8wuvkaJf&`!j#k9~d&&oJy9 z>vxYagR;V>)*Bd)S|NVXo4GF%)z8+03v?{q_O_m)L6ks%@ruk=2fDsbP?k;s&}Wj` za;nDcTbGVJ0#s#(!+>2NL~!*QxJgFew?*a$$fbaQz+#r@`m9+2(!ktgKf~q<5)D?l zqP{^2F^OAm@jYx*DYZ_-{Z@jq%+{3`R_{2^&2)V0!REZ@m$b`7y_GclxHZ&3wuBU6 z)WrIAm{8Jm(@K_>A#LrcE?j@~qKMN7;#od!c&J)g VqX-8=VA|gU++dzgbq!lvI6;x#X;^) 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 l>@Qry6_>jZqrhiSe{6CuAbHd5!lvI6;x#X;^) z4C~IxyaaMM3p^r=85sDEfH31!Z9Zv`V1Q4EYePfBkt0X`|NkGDb~+X)$XpWS7c3_y zcc{Tb0?767ba4!^IGr5P$|NBnv8+wOIf^rZVaDH#cMcb}2p)LEXJWR=XoaMSfW(o9 zjc@oAxI?)oxC%EqO3Q61X`JIHp%9g!Yanr$nIX7S)@0WIuQz~ZGI+ZBxvXNS%G}U;vjb? zhIQv;UIICC0X`wFKAD9L4Gs0Epb-pKty*PkIDIWpC09w1Uob;`RRxQWm$xT#$LszT zKv8W^7sn8d^T`Pk{~A<1?lQVIga#M@NzZ@_4Eq^&FGyfsweX~vu$#jTMuwLq%tu!j S`fUYjWAJqKb6Mw<&;$TxRXn@^ literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/background/cross.png b/app/src/gambas3/img/background/cross.png new file mode 100644 index 0000000000000000000000000000000000000000..79c7642b64e0164dd772acecbbebe61681636c4d GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wFKAD9LVBlS!?FJNNE(!7rW~ggeRwUd8bP0l+XkKRw*WP literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/background/cubism.png b/app/src/gambas3/img/background/cubism.png new file mode 100644 index 0000000000000000000000000000000000000000..ccb12773130b9a1a2bcfcb55a1d2aa1f231f4adf GIT binary patch literal 63853 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 literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/background/dark.png b/app/src/gambas3/img/background/dark.png new file mode 100644 index 0000000000000000000000000000000000000000..0bcd488b0eaa2f6e59c7ca11c0ba4361abe9620d GIT binary patch literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;OS+@4BLl<6e(pbstUx|vage(c z!@6@aFM%B90G|-ohK7a-CANk@E{~^+V+hCfZ30@)BQM5MB^ z63&GvE-o$xGQg@z;f7aKQ~=pPP*{lWHn>WlEQAd)87>atLJS9zKpTN7Tl!Vqf&TR= z3GxeO(9zR2(A76KGSuRe(o|)ZQBdP#lvZJ66c!T@;9)c1RN~-Zl;jr`WMbwOEaj?aro^t_vy181X`qD zxS4onsICpmY<}B&&hmNA|Ns9V%Oy-_jIVl@B)^Ss(v0t`NZ#bL5v?J!}nHlG%FgnUS)-)9q`cV3t z*KdNL@lyFRjh_4c_WQYKuCy@Hp82unLJ!|T&vGtLj${`})eEj@ ztrg~b)$m(#$Lno3+js11)~v`ZTz_lg;TvZkM*ZKM_w3UxvC#ih%(H&4waJjbYJP1_ zWzCXr{wHi+=eYUp+!142`OiUmLh$c(9u7fUyH9J(&G^5+GWgQj7(3O5*^wWcnqDk5 zdSD^)|NETD@{*_aRA_tm&udj=)qZ>TPnli`dfSUU+0%U?|)_Y{}=z2{llaESLF|M z{|~EYkpFl4FJsM*{O{}^9`3&@f1v$;8H(V8`t|k=*8hM1eaOFn-DLmgDek4fG|AxU L>gTe~DWM4f34XHK literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/background/hline.png b/app/src/gambas3/img/background/hline.png new file mode 100644 index 0000000000000000000000000000000000000000..f24f6d24b463fb0d5715b2bdaa4e2b6385ae9901 GIT binary patch literal 138 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

      sjoaag) z1S1G1`>l)SMS#ic)lrT3LYttke@~ZBrG{S|d@Fk%9SN-Rr#S3Qhdd;X@l~sLp(kNg z9f{qJ)&t0P;x%i^>o!wMQ=k)rK&wFNrk=LIfDeO)-LqsDZDB=>u}}o16cSgoPnu2$ zopDZ4I6>D^k!(sE18NG-Ci$Ob?>8qmO1!Fjo0xdwXjmOvJUc`CyftDljaztecxlt& zU;y}ew(T_RhsmSmAM3zomC*f)TR`f-=R@EA(nDBAR~*N9CUqpu+(G!Ha*Ur+=+gKs zg=sL-d1z^4JJ%39Iw@_N`e85=6+MoJL!Elnm{R2ZF5RV@D^hXZ+XH7febPve+Xqr^ zvJ3!3bn^RE8)YY@dp$yXpVNm~ADb$z_%)vc+{N&0QbU9_c@9Zq4B6m=BPX4Lxn8qAcm;W7j^tCdi|s+O_HB^I4Az)E|`whM1X4+RezkjXDQ~ zCYjEHaoh)?$;Qs#SWfi^Tk_2-;$h)pzkULQv_nIa58ig3F8Xb;5bD>v;>x`4!E8YQ?KV7L2D^`b_?tzp? zR3}RHcNoc3w0ic}`3;hTWtFdU1DnXg^h?ecdro!rN1Ij93uyl3ZsU30$DSE`>Uc3^ z0NHcGnHoH{7QLOG8YwOV31YE?bF-Gacy&5G;s@s@ZLHE6YqESFe7XJTdWAC8n*YpbI1l_wdwu}>{$0ubX0;57r8KCg~nSsdVxS<_;K|T zXlv4;QdziGWX(d@WUY>81G!&7FS2vWlzGI74R8;Iin;O&B9wj4aOj_N=ex;xc{$w$ z2p2#O^wzrteRIjt+`(x?i(_Ue8ZJE4$B7TxK{|(~@_dt;+En_(;8K`sRR$S{9(Qvd zydhW9SJ8B5O+oh#rGPnT9B~{rYV1(sp7h6ks`?1Ns*oPL$WMy`YVE@P$6^x-X0SDE zFn{M5hOX^|pDZg!*L7NgX-Go5M^1uA2vCbdiMLhB0fl;Q0|#-QjbuIjL2%-*t$ajX z=WM%?exm_&`XH+}M!8{(IK~l-D7pw6ajllYcEW0}zM*wmX1btFr{m;O%%WA8jV)%| zZ=7VQO!l)8x>DAT01P7Oil)K9Vd{7(HQ{u3zMh~UZ*jK6)dHD>akn*>ZaF^T6vx8B z9lsNa;4eIS;5* zCKQR5on=qx0?s#J_p@ovF4ms#yVxvS*s4MY`=WM2Yk6r!mnDK1b8O`HW`d8t@kB0@ z*SoVl!EO9oa`^kF0n%3PXb?ChS|vbsC!qb9fRr3G|B;;m0O>uunRuk;T2NjAuQ%?7-jXs=Xx-qPhc-W9? ztIcw(!*3|+R8{K|!UVfgYBBt0~O1A0tNXkGBtzr1vjoVFQmaX%4zF1YNr2d+0f_<@zw z3!icVFSB!(#!QvGA{W?{3fTfD*$P zUBMZ5()G6EJ~QmJb)ttvjhFLBGnm_K18MO$%sJ+V&&?Ao`Fy`DrjdjD;>wsd@NCAr z0^a&sBMMVHmBx_p9cFT%B+@LPsaWT7ENDLVQO7%?%ed)VwoH;e*DAN|$ZW+{fGZ_> zv_x>2-P_?Mij#)1af{mdQNHQQ08@|SRxW4lmiI`qYjkLNhx*H9^oyi!@G7g+N5GxoE&8Sp3<2nlbNon%cQ!$gQSP`1ZYhd*P1ntrf% zTrM~AwPJPze+K{WBbx|pJ=grX75pnRd^%F`{`~moyHGuJ$!HAyR8I|qVZPP4C+96U zc@WcJmXD);rF6zi?HdHw#uYZ4(@ay|^c^^%;!Evyw^EOLvNgd8L4E(2=`ER|VpOw; zA7nMsakE5R?0StD>iuK*#vo{o$90)~-B)b-q37Juq>N&x0U-Hlc)s~7^U4p~B`nD} zOu79`Y#)0SjDQnQ$6Gh^Zf%tdh~fP3agI#mwesS}@97+;3_GVXE+-!OxqEz&6I;v` z;SRlcbPnkt20js+#P|eBQozZ%_TV-+HjmyGOffSk(+ME5*8%^Nm48DuMb28V@c2RQ zhaY$cow;nGG!@>F%0@1I^;^}*)(%WqF1*+|Yx>at$!A9*In1eRL<8BfzwjI7P#f9E z!_%pa_aa&F&qm7uA8d~LM~VFUswEfG#hv95Gj8OyQZx;$ZgR4Jff99JUn$v?xr=#A z5$&}SylI74l;IAKO9SoQ>9<8i^K|QL2Z_5|V}a0Ll$v>K^=!+Bo+PhHH*0K=jtP&C z3j7x_#<`ohl=Zaok1wY?yaNqIc+LlqmhZHwktEWCf_6zz^e5OK%q`t?Y}V-CA;mjc zge)x69VhO`2LRdvfX@BZ8UF3e0(_xRNrHlL&wM2toGH{!Rmj_?Aj+Jr_)dHEtK4h+p}E6O*N&qUooaIDiDjo z>kD%2l0wbBEY4P1|6EH2uu(V;GiP$bZ!m9h;}M|PqFoaV!VY7PE4l7cB>RJqj>FHG zlfE1W(Y#7f94gqy4ZQHXe>=!+=3fknGtQuZ9QT7VOT=Stq?Qs4&w$Ya-up!DMtZ#1 z8#P#VPgAgDqiYtsANA-GC=|g?uERBhgtSM8p>{q3lpI@0@OTo`V$U|3qEe?lucHjc zv6O`K6|lw@5x6C3j8;yB-b*1! z^{LkAJ>O)bzIjg;0h>!}rOqD5m&~ zua(L}|C0-FR|)m~8hB?t)-rGYFF+_f|B9$VIPtxzh1&0-B@cqdp50+034)WaO5k$c zi#Om&7r``Ozzm3z0vYIMfLIjfIQ_P&Y%$jAVbc0srQ7i>%bEYUnA2gxy4tIWbBm{!IpVb2DLWy*8KD|A7UIc14MR6l64LBJY zwt%NQa(cy^LdXIcSY+DB)sV5eNan4;ma=lv7fZNrF3Bp5X^n$Ec6h%{L0PzBbAfhE z&hUvlwYa}!1o{CBCz^($G?;}3%v-}UW_o{g=b-DwE+k9rCTFX|_V*Aep%Iw!4?%D+ zKr>O{QJ^|C0GQ;QE~8J=kxnoce{Buhf`m>tTHWhJ7?Ja!%4n*hB>o^*f-5Rbgws|| zfd#&MuN!|zke_=B6)9$Icy%uZLnrX}2fmuNZD`5tWz*ZIugu+-e}Hh11$6=R-oSu4 zlq7h#EiW*UfMvtixv)d`ltA|h5lWALl{;$M)1#KaVfYYabPfBer35~Lu4TP;%rnp3 zWtvbK{40$J5zkB*nD-VDZS?*uk$Pa%=Eb|#unAx5Xp3Ewt*%!Q{_ zt;Z5>7d+9>S|s2KjK>H7#NqjQ(#uMjhaRBm5j%co62EZZxFc8>%pM`Lem6LroJ&l;A45Q_iKZ8b5&cvkbZ$= z8${Pm{8NIB-Cx0xilZ<;pMCRYT6fsAr@GNodg?=}hL2j5P%>qqrc+_wh+^-uAT2a? z1=oE5T5%)bEVuQD9(cpV(VFLB`#cRluk@q&I7%XBQ(S9JaW@N`@GzLHXCv68aC@KI zW~Im*G(VnzhpfMh9~dUgp3G~usY!CGH-pm)fhG6 z7}Ty;RU)6yl&_?sZ05&Dt%ZpTw=B%5`-ck5cQ5&Rh!!o!cT<)JqE+L-v|J&O~HV) zXLe^Rb-P~KpbcZ0z`83Q*b?K2w$jc09hRFQVIQbJ8HBTtKoYe6#<;^x7P3|V zw}Tgh>eCbtbrmZ{Yy>lS*P{y%fKJnU%{^!{R5YD^q9B219$|kzb!`B5HHMtG(zj`9 z!qV3?i!Mt6SL_m~3W2wz(flINQ(ajkXVt*o`m~4U6R|j@Hz)Cyn378yrzp?bbRRY= zHh4zw6F{P!OgmqvS;l}PAUn>t&R@Dz=7X{-=a;mE>U)e7tDpSyx!G>cYu?R-*Sp#N z)VZJOmwdiV{3+f9;i9FB57y%4!Ax9+c`8>at7JesMM!-*3+i1 zUhXa>HAld%|LaYEEvBMQFa1Zb_OA{^`WjzX6yH1*D(j&v|N7c&(`Om)7YpvIt_=E85iqmon~(wbzC6*eW2iWMcFL`~<3WvjYv zxF)*Vgey__+oL^;?+kkxRtcrtDV$#g&!i?j^)%FwNEJd$xTb%WXup@1?g08dqIuwN z{@9C6a}4_A+P+=|y?_Q`7J@;HCeDo?IHIO$rDGk&_|NNYaKbQ-miEPIKFqOvZuQ2K zV^&pZX)6|y?EGxpf+XdFo+katElzI-jG-Nn1D9y(YlLqR zSPXQOTjDA`+2p3rJbOX{K#vbzqknl3Pp@vIZ~#!4@Q&B^^V5abZ?@*dH5FG)=-8fE zpoNP0itNtmba7TA8@;kfh427uV}Dtjt?OP0i%=_OteZ(Ig`&Q2dtiGtBPL1`)jPsnaB$w|IXXhMaed>u!^CU*V1O+_B35k7XXSZZ8h8@7i#(Yh|Ao!AJF*FU- z4E3yyn(mw{GKat=te>VztC5k&qNE|u_m-uEH{G=Pf~LU@xBfWey>^HY=D(h@?2@_#G1OCn?gN8Sl1~JwHemPSW8^vuOVf-=91-U-?PV*bls8`N+(fqW6vyk8z$p@Q?d%ohaa&i( zJbXSh=e*7c6og0esMQb|AvgDNmG9*!m2TrC$bV(Bnjv%3B6c7=tL3(r5D9VO_b`p? zJBVdO|1hr|iNv=kB9cNSfXs`N*@^OEi5z)$cu4qTh)vWOL^2aXg83#0HtdxC_3CdY z+^D5B1=j3_hit?-GEDUL^6VoN0JCqr+YJ+(us^Z?d`7B9xviA>&VE92B!*qB)pq?o z%#u^qkQZRYSOpqGUE31{n56jQvRqu|_FlB)U?Pcr57?;Y!x$zghBxVDj4n(M(YZ7b zNo{76%|QuI6@P2x{mx|R>FmskoMCRrfG*n>UxE_eiJHB2YnS|6{l4=JTL-zqHP?8^=Alg zqWx_lQbt<5^9NW8#LM$)gw#|~?manp|MuGhYLWL?Uqe^zw2?aM|cj5l#{mw0}(cCBF|I){bVrb^4=1Y5CG!JdQV-n>s@$ zhI(Sst`ntZiTgx6;M?-YTA9$9z>JBGoAvCJfihpQo3JMK-(i?v?DfBKX5{>4_n@U6 z{^daBq;O4@3ilDF&qWZW!{Ll$-mQDImO((3(Df;*)7(Yr5@_4G>+uL-1~2> z8nq6@SK!ll1HujPS2TX=>Rr4D8yi1K((Qp0_vErvH3}a*uLC^rYUy$9cO*}>H!Jye z%m1Y<6dyFL!Tx#|p)7`TikrX+pWnI`UOqoulOEDuZW2@AJH(p{d`!W+55A-tcJTuA z14#$As(@grOXJy0?`+6qba`8)jO5JbGPP9SUJXSCEpCS;{Z*x=~wvFQfEwz_T#D$+m^lx7uZT(+9Hv;VNHPbizE^KInH;xUjEPPeHkUemsh>y|j0_96K|c zPMXY=Kg1DtE=J*4oa=U-Q~+0(F^ruT_A$wV}N7o>2hm~gNokWm8g^lB>j_{sqy2MybM`iQgJ>`t!+x+=wQNf{gB-!sD z4iG16+4{nNTHUhWFe+yqCgY9#TAj~PO#$I40%)?t+Lt8{&GU3ltBx5v1iSRR>Hw}^ zVRbPR$>7_F+4Q({Rx1*e_l={zta0iUDyt!^H!NdCsJGGhVAg~Mo5&;?FWrS6r$JsJ z&xg%*Tk4V&z^)tF?|L+NC0}PbH-J~qs2$gy~J92JL0M6#xjS8+%?N|8G1H`o{jWkWRKqe%Q<-~_5>?K1mvw((K^;d#WqKBrU7 z8)*VR9c+0`q6Ng$7u9(j=4mpFsbdH<#88*|ILa}Wk8PWDF!<)$U0-x8L#-}=f>`-# zjs?GVPe?otq@HHIB}6h?OuR)}=Xh6E0rBMz-%UJ2#eMhdD4e0DfTlTt5)@u?^0ST%cG5Fg3hu3nPFz4DV-RZTlNo zQx;F&9~v0@mo68HWl+1L+ab-4Rmk1qo3hIo7<7o!X=>D*pjVqxnq~#Gj5WHa?p60d zM*w5PqGQGcB6uOMH!z_Ac*^RegG;`>#n*mV_#lw=ncGBGN{fK4w3Z(WM1|$@lrgx3 z<&a-aoZ`Vrd;OaVeAgrI*3(oGb)*U0?F4Tc@oir>L2q4kxISx=ZD}`(4r)cEQ^xL2 zyedK1M8S4sLN9%)3eA-)sNl$^v1rI5&J^Vq3HxYy*mp;eb% z%H^2jQoY5JAh~rk5)b?t`D4ZUM-06}izcId1BB;f8ma`c&y@jxH4JYGa&6#zs)8zS?xr|KO%|BO1dUGS)B5rBU>OQ&#NhaZN)uqfwdaa2Z*+)@qMF|&-zL|~= zOJzn)T9U|Z;z^m+?}~UX@o6GGBr}tDIk#eRXhr&b_#v71F>0<;73TT7q?Z{~f*z-B zHo@njMD&MR>J7ZlKc52m^gg9VhkvSvA1A(EhB%Ro^sM2`Rc*r+*-RJFh;=`>nNG5t zbrr+Xv>n8!t%U>pFJvf=BG>UWH%3_&Vl;o;DAN@%omPE#z%nTTguq%RF(O0FRVP%{ zJgB}h{WSgXJ$Osuo+sJMT7NmHrV+D}m|J&b%f8i9V74rtn6K@_-$F(`PEsOLYZXUZ zM6tt&Y;EA>-M;-^Vs7z`IsE`muyr?IS?-1;7f&5gsqnlBfHz#g9H6hWJKirw<$tGg zfQHt_l&qeRqJLe;?Qur_^c=x31}&dMZiJW9+8VSD+$_8sQY`wx=kY5q>vEq4?yM)R z4{wMz=~7A11WKT{lVnrWc+?NeC$a}*G!y7u`&U`XqpISS+n#)0<;=n5{a!$|S%*Aa zczDlq3Foh`y@wNw{n%6{CQ&@D@2mb<^F#h_!ui$<;ohoEfwplrTi8l&saCgNWAgBxk=1zM3wwZn8Ya5eY2KXJ(EQa9}IS7h%v zf{LlY^pH(r0?^#xgm0};vb{Mh|0oqkCJ0hmC(4vnMZ&?DNTz0U#ly=+glS3l>%oAf zeQxZ|zdi`>GOVH)GdRx_uk8MO*eIw)5YmNJ&=zVq@IeXCm+xr2TC+VG{o!5eh<|5P z8#?yuELdh1iPaJd$-(V;T@|;l!=rgD8gspWXUCCXUJVClyE}(hdngY|jet*rjiGA1 zQ%Mii{OYG14miVHt6k+NmbTVJkgj#onbq=q7cLU9z-Tl3uwmXJxVXd82?NDN^ODb7 zCzaw&g$;RrH}@DyLC`Mni-8)b+-%QkSCJLPZY)ni$(nAFfgT{3D|Ox8{S-A1Kg~8u zgtAlpT+do96ARvi05*@E#%I3+BK92$e90CZ0t20M5gC(Aw0h9%#2EL;rIm4*q2yMv z%19UP*&x-#hem{>B6tEBDBfhSpy78nleT*;-El1p2v=a2O+I?m4pn5$2=~08B$FQGD>zEn3#qoAlArk&o|b5c zi%_hojS@VitH}=cUBU3O+jg6pNQt9bnq&UucmN2v>}4OBmEDvwZv$@{H#|dWiV8ewx>?QpN4Ei(#(faqOO?5OU6ij}nP1-}-rWtWl(1bBDD3dJow#rPM+- z(HRinP?R4pex2r+T?#o()U=Ym^Sxqjf{E_TFJ<($7CI6(_>>Wm6D9(`D#E=I>zien zE7G2=`eZ;$rPF>JECPuMUlk6I$WQ29tpZXJ_T@ITrT<}?F zB!Fr8bE-^9NC}pK}yN-RUrmQ zSK}s>YBsOR0`JTOFbeE${~&U~8IE}}-9!01Awc06RG&MaGf+}0Yztnb0qY~ZJbJ(R z2phiX1(n@v_S3k-X)^Mky9n<~3>>a1zP=v5q-YP3y&#Lmy=a0Cp=NBHwceVQE?{07 z@ce;P87r;t+1xZL1P%InF#P)dGC!ejy0;t%8$0a9J?-SJkxE^bQOGdbEhM!3Cz!snBm&7xhT21hC=1z>9tC|NO<~ z#&NT7v-7|-?FK_xK#nFC0sL5-tDF!sxMLOM}3eaw&dajFq{APF|*##!WF~V67 z?_%2ds0@V0%X8R(Rco}|vB^*VQi?i<`oWvjKFZ_$4gRGECFFVIhJOQ=O`}h~4Ta`a z0J+X-3v=05zM6F71)RrNxcGQgoNwh{%4Vi$pn}}>DfvvHrgd_`fO!bZ;05#e4+UxR zH-1llQ^-BZ-rTbZ-%j|`NG3F++>c_~Eh(Jl;1=AL>f>{?A(2ImdIHM$HMfX*SBCyC z-T@%!Uk#SpcM*M%(xD?CSM`S7u7ri=lvet?y8NcCC$8mcJNF7%(So+Tg!?t39m;^7 z$MqVuq0tg~z5x#x15GWz!y)+8uX8>7K_{$)cH|%3f(A4-b%+U7>b7RNTp20)!&e-F zKPw$HlmpOzE4I}eCxkUTF&acK*F&;t@Gib-pAQY(=%ng1hUbj9(PCp$*9;YL1k}bY z>)PmF<`?@O)YQDbzW{+j_$44G-w09Ff44sdA?{sfLX91L|0{-~Ea zf4E&!J*F=}ws`1JVs?o%l0moM+%*li(~ur%fxn_uTGgY7{Gq7ql zVfVm5uP}4AdFsW*`e?=xa6Fto9nS9-0G?i+a_sT4XKW`cr<@CA#7_6028949O?!$Y z@086h*hnZBc;GdxroRm~cPQW$H&J9-%{_|W)||m%@FKLru)dSJxPFxR>H7Rq^x{lT zk~{?oc#}n0Y50IHrn$)DGGI9K^kshWTB9 z)gXDs1z)AEi=mDUV)XAMISh0hP1)cJs9IOk_e^rLw4i{x)a5BrJ>B{C(C`Iwu;hme z4&pp^Pv5vF?++WeYn;hRF$Jt27;h+MHF2nIe@UdRw~ou>p-kb)P$8fWey<}Pdb7=K zZ`-@RT;;cXeN|kme`Z>Y!&GS+u3pp+3YvKlp2;!)02q|h;$_rK29_>Ob4s+1$<%c% zbZCP-!N<4cg^hxF?ykyD5=nEOm;LTq?ABVh?w_xXNrZQtgfoDL{&>?#agd4%wd@HW z*;uOc#tRYfr%W6dFd`}RX{qpvcild+lXRJAG76+5l@9@VN^z9qG>4jDDDzmAoz2Rc z4cRqvaP(RBw8kqN8V`~!43gmk2Asze#VMMW$h`D3X;?md4Yjr^f7FK?Rbd-0Yn|ST znTnZ?eZ%yih9>p{dhcY*^R~>SP?L-5WLh27lohwCqF0%$e7-(kyk7nNzn-51j3fvR z8#d#z8^ng5MG+SFtoCivvL6ugnLDJ27VyW+D-52C+G!wI)rS3n9Fb=gX;^lbPm5!1 zvmP2zShLjxYYQU@9MSoEkxCgIZEH(suzcy=UD@T)SPHaIs5MtHMMZ%={|bZ7B>y7W zk8HKuyK_4JVlbPLVhYp5N-YcXtxD85i7?!GE~1Gx1Ske>l7J4A(A~{g9{fS4r<&%9 zMANucnj4OjMWo#FBTYv{BrKR$Rj`EBfvP35Jc))A?dM?zNFp8Dbug}}GmdsBo?GDO zSq$gf?bi8%8%j7R<6^Gn+^M_{hOcbp2zcHm(t?HORBD5=h(cxggTK2Sz3SYv&derl zlJJY+KNeQ(hsNm3j%tC2W~LrJ2F52 z<$@PvY~}bS3?RdO%hFzD*TJ?&S{P>p>B&LnNguT_RyV4;2v^Q8aj6Pc=OXADh>fA+ z4^k?Qd!qfT_^7hIVe-7F zLGZiTOz+n_=#)SA{E)9>rg8F&rR|Wv#uz-yqNk3%&MMN|S9g8#JbtnxT-X8vx#r$| zJ6u?7m`RU>b9MGz$F-cTT1G6mtS47t?#mxu3jo!tKUw`u4V$?61H`E zxk3{H1!lYM#SGPGOd|T_PkeK>P`M~Drgo<>xYB zEPjNXrr-$kHpL5K=#cpA zHCrYJAPyLu-M3zsUteD4Q+tKLF#*MO=myHT}){oc?yPN2?|zGH(|3rdK~Hg;UJ83_rKqJ;({Bwp`_5t#>@1 za1%ORAO>ZZ2!^?;GHPyQLZ8ZP#?nnK+n54kxYTsNfetv*&4xtSVilfoi8S^s>qsy0 zR%VvIpR>fgxP=CVLynI*CLMWfv`ab|>K$*W| z|9m`NJ;jz&4RsJ6nelk!&$GHeAHUA$wmpu|ynj92G);Uo&vW^vrY&>5!M9fwzqp4o zuhXVTzX|_EPY>&t4YNc>!~)gl83zDu=2`f=Y304uaSt$WWOU9on0h?7 zKgap|&wuvg^SMpOpS@Yr4ykIF@uTjC>J4!ntR3t{4otBkFGBy5>TWFc#1|srAq&;a zBDG}y%P`N4c19Hy8+Ds!N4I|6?{|NcDrLZEMy*1a`&Mq3aCgr;LnjlH6k99;-RG-L;+^AJ$1ISS9>69~uX4m^g^Mv6VptRyfag*gh z8E0^>Ts^Q|Eb9^e%H453g$zjMJB-inwSvb0x;0-LqUTr|IWiy`0VQx1GN`c_r<}w( z$dcjOjxUpj`9pUCKw__3?HYMdSzWnSGBPUUupQTXemw4zI-Rd?|GeJ<>ake#gJW+; z54AUHYt!w4^MW(5khL-@krTBBMYWOqVw4qJTj@3)k^;F9XAAj9HAJ1QRGKDScmhHL>1JnV;CA~J*Pr6{w zc|F%{U+>#?Kb@Q}O_bAJtpN$BbERAKd9DbBqFr2XV_C_XyLN2+I{{x?)PK$ zrmn8@k8khq=y}eMg!S0ATh8(ZQ8BHO3n6ShiG5ZQxjd0;rs;UZZrc43O3e-ThxamJ zJ=e6A&-0X#7fFpg8r!<-)L4Olh_260o;$POH!{bGyxY6`IsJKT|JHv4k)O}}+++mA zlZA^~LoV%jv8Ip_Pf-$^QNn?Y2$ehTM@;<5=(eDIbqcX{nkBEzO*cXWK7`IiNSu*l zM0*>=1)F@X&p-Q-!5&ir{(rxJyuJ6fv64HG-NDPJF3g%CvurF`mwi)Tq~{GwF}zwc z^!h(hHsm`P$-DX0yz?s8)HKPA!S`^$(H>TC0gyO)xEm!{{O%A zW}+umTJ3Jz*l;*A1Lq7Tq{r$5;6S%lQN(Jgsxm~Rhe1sOGL)A_2s(5i=7fuMJKl~B zU&La;7b!NnkOxWY`jgr>9{wpC2s7flkN!(tmpyy0?eFsJVW*4S1}+oOI{QK8t07ew`WvA zn{#oGb^rb8qtz8srC^^eW`d3cH=YOGRja|~ZY+))*c7TIueb>ovr;oFshS6)QUhXJ z)<}EwKFhMPtQ!-#m4*;>oB2*->P)N3yS5o+1HD!TT>Cmk%|7 z`3VHc(6}uv-_OJ67#ROce!U>ld<~6;*id8NmG^m`Cvp4n-uJpx(@#7((g|>xOc1LF zniFCVSg-JC+-HW+09`0YAh22w_-e~|En3?Qe;a%M#ittjdFN|w-Bf9&Q z*E=W)OHU*eX$#`6NpwhU9_};n5S!buWxhB8cw9I ztHJ{VEx2t8&PgkSP$#-l3MDbiUHi6(z}te(UJw@CXrOhRVpUR$acSopsLn)-jhbEK zcGU&X7DP3D{AUDGwvt644MZPXGRN^&a%;F!_yq8RQ5qe5a!YS`hXXI(@rA%s;E7hC z>Vd49xNDcvxi0u|ge(SjNZAyQMn%6amk%Kj09|>+^h_X-2Ndw)4C9(+c1nOA`fnv1Tn;gW%(ST*t-B8kD-muXrl$ zUDQ1SFD{x*x^JEck^s$YO&=FJi_n}AzYjKX&&l2)*pF8@K-QEV2ZNyLAhtyOd@Mks z{jr|bo&9IrHoP5}A`q}DE~W2#R)z8u8&nj(5Mf`zmN^C%RFm5q7=z(fvJtI^c5j62 zDb^gqRWaX7d_{h?&_Y!~zlM@cES)Ub-B1vnG(L&OoWKX3rVPsT4gL>c(*?LNje`PrE#h^$6=1hU@Y7wz@i=i7hR?!Xy;!r5(#(T~TM+ zR>odPj}*Lw)$gC6OsvX*46P@fVVw7{{8#>dO+~8=XeDUM{ABX zz4G%s4{rDMp_eMy1~~_eZ35!-NE7+52l5K1n8!@q8m)E)cI8=u_lQN7IG!#`@9eM|-XKh~C{b>H3brYO5b!=k%&_t~K}jOpxoipx0RZMQxuiKgTgM9j{|uH$3_0>CdnI^Un*@&0GO4m$7Di{4|SJc8&=v9V6qkXT>QGojVPx6Z~@g z|FVP4hiyA|s6orKLDjPY|6M6W`wGMZJuGhEzAW!4=69=NHxHQX={n7<%|mu8*vecD ztek2!Pd`*U7ThgFj0ozG5$bEEpZU+95c-r_kcHELX+{EVOx11K<%m^~mfRP&nB0+nira|(XfCSTJXw?MzFq5m7tfsi$d7$2cD^9E|Du3QSZY7&@8v4y4eS&{W zg>2xwSss|F^f)sJS)mh4p}S$Cb1kAA2xWOg9w?*VJ=PCI_sW}UGMIn=Ka#GsxltVp z@(?c}1PGAjV409WAj8_@Om^6VWAjMm+5_ia$|FRj{P zJIwgl=gBXN^K~*kO_f+l0L?Xc7cM z2*9I}P|O}+881k>41@tH791JWrhYlm%_Q%M10_b_1uEstMbUsWr6=C+hFW3;IPjr< zsl&ePo05&&Q_cdU&+_s3mt`}+Gny4{!>+zAjBO0yluu|c`3II-Mp zF^IZj_P_RVRqP%WgIz{+bd=l_PI=d}$Tg2c;$U*KfA-dlD^TNSx~PjBETBhfsKEsC zqT$d5m%fx`UX@jt((wT4HDD94=G2uzPALFx`Rw`vq|b6w0I&dX+R;~)J10=iAd1f} zM$-xc$i9vU#UgNaLg2c#^^;zfcE8h)5;3qD73zeQ9FoaEPTS#^hX%0Cp)g{ zS>hENAUs$fqP}TDo*D<4xO7bnCKX|Nc|$A{TqktB4(T#g#(B`P4@d;mK?1YEKT1+2 z@$)!XLNMo2Lc$^Jp3Wj(*?At?#CUs*G^P6U{c|NV>s*tg+^znFbdNyS^9X)Y)Lix}CvVnrek z=b+MZ_71@?7u_|DPTeWZ5y+>mz`ONjTJ}9J)q)G2>ON<&FXRF>B~O7sjr;U^4v;~b zlzvn4+|(71#}X|NU9uIH)@#u9sw)y2v!&VHl z-Bup0fI^6o_P*N;&WSmvhrAHZI4`URqih$T5F0(T9+1VuU_d*_ea5K=X-QVJI<0}zSeGCj29x7i!NxijLr+66!ejsb{rBI0 z+1ro@tO&586?z2LuU;7w_Rw+=$}QHg-TinZVjS#@d6QgE9=glV<2p=!^J=xe-MpD* zEPX`>uh=gJ!Vw%OE)s5oHdS5Mr6}oOkQK2U#o!cZg-6;(rpv=Bc`4Y^?(%m2{P*YU z%jxs-+SHT_IS{6Q+WSVp5rDi*Gj{!C&tKyZ<$H`y>~N?o~++b&x|l zC%FbG9ArG;*&SO{4hgaU_V_c-P!X6Vr&y^;Mr7Nu(c%Qws`F%vM1!wDK`4GpY9&f6 zb|g&GIx!=!vdFkK0_-W{-ZaKg@+dOqj%dV-!lQJ+9L845fZ1dhPD|dd=B)5 zP=4(${gsUzUZ38)udmnZR|P5@Aje81O%b>3Se?hL*n=WXLVA|-)(rT$^_t=@6&9L9 zgowKVx!;a7(#bS6)3nX29Gzm1cHq?LlXXKDyM6BmUSde-Qmv&QCkO%Uc#j~+Q>c0q zrIncP_>iA<3;F1j1e<=U2j={FVLva+KGdY4tTe&@%JeV}CU=>}n5!y1U(!o|!lFu| z{_->wu5FzM>7L#=XKp5cZ|b4?+eC%w#ouP zH6-)W>XG|vfIvPr6l%j;>ZAf$JBhn;W8r9_PLU{8 zYrS_ydRAU7TJAufcp5B7zygp@=1m2*HHmu+poCy4U7ea(yd+OU8pQlSyVi}J?V$)D z`-B5!obJhF9DcHr&4&#L8M3~hy|D!03j{8^E9T`=t*|M~iPxx9QdKR&*Gz6M`)4l&PeIY?|g>tgq>qGVx2V&a5tNfc6G z%Zs;dn2s&YmLM(4^Qo4+u5rmgGbJ=E;@r(Qiw_R;8l1P;%=$09wRY1o$f-bRJRZN1 z5KI!YL4znQOKLr0e*Zs5*R>tDlEj)h=bXckLr#`PvLyS4-TnWcT44NWAIW61s|x6@ z0?MT;v2q;s$B*Be%K%vYW=|#R37}6#E$Lp=y|IpN^GTiJ*1Pb2u8bV=Uy<_r@RqTQww^`rLw=P4AEX@JS`Z z(|`XQAE!TJey_Y#;y|>gtFr0?P>2rH6HATtrR%rrmN`d0*=Ayuu96!s*@!mO!&h&* zY{)v}Jj0s}@!D*S%53U`@Y?EDMjL4C)Wix!NqrPfP8_kQ`Yf8m1j4jG@6*T7tW&dJ z@@AUyWmrCL%k!tZ+?U&u%Fu%Sc*R#*rl zwQIu(399wi3`ND0p+rohj_mpIUJ0Tp=5>|OThUJ+xnPy7h1R} zyvkJ!BLGw~Z0vhal|5ZnDT-wlu?*j4Xk&?UEv$60?{I3I8hgUW-VraSG{SnOI ziSZpY8W=q7E6C2a-1dEa+t=H+;HUB-?n+-6H1;W7%Vt}V7Q3-y z$-1q{vPyMo186w#B#{W!2}3HfjQISA>QvK{YD5Jz0g&<3l~cc;AJ^-ZQZ3{8c(|Vb zCr*!Jit_1=BU{CdT#yW)u*sTa(O8zJ8z{rzRlL@f6bgvMvTO)y^io2?HB9=qQqtLP zVtZPic)$+WAwm*$8WH+36&f}6)WvxdFQ6)bs8N}NS(4!Re)If!yLY!=an!Brx_#^` zkW@ExYmCAdQ@mJ!iG$g?s$c3Z7^7tAreVvxtwK6>M4^wZR5)57@WPLxZRHxt z9s|G^HK8qA8y2VIWA2Zkck25?-Cs`+;S@zcN0+)vLm+9x2a5p6wJp^%D6Vftt{s&z zs<0zRfW=avI2@FUOfN|R=!F&{6ys)6)R=yRe%?eA36&|ZbM(y6?a&cgq$7`W@LL-c zP<@4014Iwyx|ZGT?XO>#WqCs>y{}JD=k5M>S%=FL*cWiBjAE<^Xpp4DdgeA*GgXxX zY!M(>76VIkriEbxKzm4KiRp;I-({ z)+`fZ9Bg!0{EkW^I>$O`;U?nJUf4#GqsUDFP38LW@2}_A*U$5E+kXw)jXPjiFSqC3 ztqX-sQC`U*Q9N_kps@9VtU)pEKn9?aDk;II4cee+5#`m@!J9qC`8_RqDQSao4kVAq zTD6C~e=ZL5`EeLi8bSjMr6B^R05=TvB1|PGkR`Gp)eD^0n0#n(@|PtTnN&*?Ne)es z6uc^t95zR%lnyRJ6Kv4nA(>4DbI={$9a~ncPJs6EXaxa#`LtMNcT(5fhRMg)pE~f% zTp9NA_V>@%Hf-BR-n}i;_BQ0%db=P!t}pvD8>nENfG;yZfOzSmOmQ^{*sM`IO?Ck5 zt7_JC$DU=WHOC~VrT!77eOe&2c?cMeNjMhOVeSD1Pme=OZN92L&J_L-?MMOZqDn%L zUtS%WGMRv8Dpa5W6>}|%olK^aXhvcfML}2bRAmpDV>ucY0L0NQQ8*B^D`K{EHBRJ; zCCfSmC|pq;guD_NG%${Q?E)_E+gY>P9ZgF1;qvp(&wjaVU%VyGZcABaw{1r~9m=Lz zF1!oRBYHdm_(lUDImnmIvri#=K?P`Y9_jHa=D;}w*SY=n4oQ{NVJNARMenjcl*Y#u zNuNg0JvH0-=SVxqgQ)AOZ_~M`9nQYKhNA1R^&}5)&|)71uZ4glJlf{q-$5X$5pS3t zyXQc_u?;k#(x1Kbr#u>>4zKD3uDycPVb=pY(xNZ7j0{YE$f+XWE(mT={-)cex99rt z`}h6%+}^h3YbrlV;BEx}v?5r_?(!QHfqIp0*{~&@$B=AX6O@@uk`z7wIRi$n@FwWaf` ztWjRpVl_anFoJ~YP)S8Kzrq0^5Glft=s^mx(*QUXz0ue+ui1toBR$G_bJIeTCJS`y z22P9EBOSf0t2=zahU&a!*~QsD-KP6x79mN?GM`kmFOP4p-9qeX}n`OfalwhjyzAf9wZF-g;Ket~)e82C% zFMbS2aQk>(_66K|i`>|y7y*!J*#HWl#sZrL!nU39%J}Y_^hPsSi_$5?|Kv)&RCa{J1T7cX@2)J$@f-6TBXxdUnu95TcwfuE*&W<>M z9>99r0+HUEJRc%^$^d#VNRe2NDT})p!B5-cmF;XD;|p0Nvtn1t1TsrTn_JBg8qlz?>TtoBKSW`SEA&ojs&?60Rn*p;xYzf(PSwwPv;R^15GtumAk#^$$qF*PjEK?>Imjj=yz#ZF#FS=5rvC z8F(k|$AUh;RgkxN(Ap@;J?%EnD%D_|=F4^6^B)L!O{pD zCUUDtR}_MH-vlK{2OOc|nr-L4(>)fGW8+mBcuh47HzWw)oERk`&TDnd`{A!6Fl!Kx zb)DlE&aSiY6A|E_RAdAmj!h0UwA8JQ@xSRfUUxHJ4+Z*rtjGxb__Y8kfhWx~xJ4`N zVUYKvtexsTW(MXJAQ0jtm~EE$)`^lT3%e-N8rX(1+`8*E>VMC&w|(BWkLUTeeLuD{ z4PYlwV~T-NA)`i>aubogwFhV%StgV{FB?vcV3Q0CmjW?`FFRA@`m`Z9687MNaAqA= z0b3z-ftzYO9@ZYJ_35+G8W3ww6na*?^QXhfTl>`1(YV-USyntjWX^HkU-#wu`!yba zetoSkYvz{^ENPMGeDyXiP=pV)34I|PFOu&flE*Zb!4|mE7>F19x_r{Gx2rDSKevza zTy7{>!*hFVxBq@VKc3sq_I*oL*-+x)A!z{)#)cOJA@Gk9g&(q^N$`N) zi+vEe#7LeLNNf@S1eq@uPn&w!;8Q}>^RhGi!Jq%%5`cxWt+KOVQxLvlHpcKycve6e z7L<}wX_=Q*pN^YNwB@)>AKfPv`l-Hpna;Q8bfHt>_j&8wPP>|_Jz2y|<@te=^WKkR zdA?6R;Ff?yG-^U>14O8F6g7I#+qONLemK7m^Err4ADyh>d`^kFkwhR&$N<+bV-$7+ ztyxSS);97fKZOrR(#9#q!o;;XfSB4^WpRrLxbDB_6$t8X|CsR?$nc6kcO=H~z-F=a zv5&KAM@LZayv~tc=5PTb6o#3irnP8->Kyb_)!feC{cRh*&!1=ZH}pRjg#GqJ1-xBu zj{#|G>Z(Bl@WjZfJXhrSokJbj2zx5hMW1y8?U;HFnw8B3QB~3)u)j@JK|R>ePuL_$ zXEQgdq7X|NQCLlkvTlR*YHRx2P{ozqg=yyj@A&&M<~GeGJMV>P>%$<^3G1K=wAXRu z9cG@|`2dVs?E$RVw(7c$2E25Z7Syj~naPqewg$+cmb0uE5spBEKHDc{>iWT;9dMuT zkI!5GeEdsneBN%;^RYdi6s1NT-~mPtazy0-31}kTtyXy~6mVUXQtt)ehA5DV@Kd?D z(LfjMlb(j|+&6_jqaJd2l0KPWfhdDz<#z07_fjX2quD`)XKZqdxR)YSb%glGf|0hS zk?>_!h$v}iH3Q7j;}d&+S&Z4S%iH>^o_D$LuLGF*c-fUeV4d%P1vK*k2P;CQ+I4To zeV<4CIJ+n?LM(lrCV}>Rw=A3O`_@kZA@bMVRm$Q7BZb z8DuqOqZ6B{RbuMgf>ou+Uh(K;DK9I3=au-4bN|QK9RG}4;pn|9=8iP zz=RZ-;dLZ+3V!(#bRD&Y{UdMD^nl{9w1i-vrPpxos;3N8IUxKr9rUy=8w%#4grI!J zp-eo7a}^-u9T<7gc_uN)^FC6P$wwRG`-38c0LMx=LOLELyHbtUSEMp5^jRadtuOGS zRT@*P)#R%{KrCPa>N<*%X$2vkQa&;P+KStnj*uvb@5v048tkc=xQIicg*Tz{d0m&` zFR#FhZWuCfzXys}M-GV6$Xj9h)^qmDfSQ2EC8?iDCo42<&!d#*oNnLKaHdQ-gjtmy zGJl7<=rtadN!+I6X{b*o!Gop&J7g=9$pg+4{utydAkS*^(JacbLaqqX$Pr!{D$0-g zj@(r^l0{@99qrhvwjJ@#^1E%1;B^PH7Hr85!TaPW+githLNtC5%s!$4+pAU_!T=)* zlAI+b0zJ(#Z>S2CQ1|d06$5X3 zPz6cv=-<+4mkK6c*#jtXq>$Qm*z3)7O8Nn~!Qnb43BARWlJ?QP%Vxi{HsgUz2eQMl zA?nijsR~ls-_1yNyy~4>uz3nty6-OgT(!q4#um#5p2L=sI?X|db1T)d=dEyZk)7O- z{Ujg`ycYL!AKZAP?JppP@`EVK@tb$s`2tc41~BM}&AwINpUUn;m&2*rhOTE%2qA9t z)*>)K{7!YQye{q=~2-P<9oz^ZN4r9Ef1`+d6*BUDN6SxC4)lW17BF2{qf2Dpo6={HTuI_<7EwcW}g4 z%fmCvv$ci&HOJN77rfr)GM-zDs)6he8X=?=Zv(I}eGeBmG+@Is&cJGP-)%)jnl}t| zYD5_H(?*LTS`Vby;GOe7lCEt@P8|sfNg!@Q+{C?shUp%6d+hN!yBjC=|9@;V*%wEQ z!=3+nAGO4!-e#3e8)TOj}N8FTDf-b2%0628b2ZQkO$8kaevFp-I?S6ir^j)Z~ zxzS937dZsR#Qtj^iEe&$fi6w13+w|m`}9T^3j9=25Hgk5jIHW&t4vk=@x^U^JO;Md z`_B!y;PJ1|-+w>`c{ly}`TLQ7Y}*I85$a(jZUtp0Qq*CC^zE;)zPU3h!g91rvp?4b zV1F4=09QO?rtWu$LLgE@pH|I_ zwhAD(#sa2T==|64Bi*_O=o2@b?-B>hYi7zdvukX8*W9s4bJn6?U1b zIs{6=>j4WOoE9Cp2-YExG~yhe6YUw!qm9QASPc+~vt#4BJOSkp-_lZ@mO~>_vJ*_W z6VRYiV6`BU<8+Y`)mcfF0UbVm5MmlygLT%y_D%iXYO_2 z*|Ud@52~RCHff|es$kA8w-9KqNK|38Y^hMIa)YdY@38Yj?}B{r>3#e4H&~#$-HDRt ztp*dmRXP1+>ln~IpSKXacq>4!jX)3?y4_SJW2;b!)ZK8@5G!~#c62CT%u&uE7mn+5 z2kkE-D&jhN1vryAWrZ6@tYC^L8r!lzR%+spwE95=fgz2VmF)r)HMVQn@;u>K8y7`! zfglR0U1xfE*_*#7RbGH|hNv|aXEAN$ z0N>j_Sdg+#%06F~^pUnsJC0q__ZP^XUEe@5c?d!yLn)ZRsmGD3;^eIwjbCU62*92U zbqdfGsxl4QrlN(5xFs6P{`v4Xqmx^b6!YWf$Ky9@gGoR9FbpWHpn}6tbh+TA;0%Ci z*pJVtHJyimG@3LvQvuD0siFC9$96|?27rl-%}NTgt}7lKaCoF0Yb+y9CZd+P&gS)WwJlU>Fc$BA1k6@-FGC|wnqtzbKqfAL&QFi-u1D=xQem9 zi4G7A2>;4=y3={;a+MiHWgvES$7w5?{Sb{n7TLT}6dNjXB}8 zmSA@%PKv!Wz?5~;fuU%iNdcmVtx<)I7L}5e=BgA$hmu+-PpP{`Tb-7|Uor}+8Ynze z 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�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 literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/background/labyrinth.png b/app/src/gambas3/img/background/labyrinth.png new file mode 100644 index 0000000000000000000000000000000000000000..fd1e9dd756112bd25eabf8ccd16bb852e1de89a2 GIT binary patch literal 973 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

      tfuXu2H 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 literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/background/mosaic.png b/app/src/gambas3/img/background/mosaic.png new file mode 100644 index 0000000000000000000000000000000000000000..b8e18036a1c258870b9351f9653f792a7ad4557d GIT binary patch literal 76015 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
      HkV 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 literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/background/nature.png b/app/src/gambas3/img/background/nature.png new file mode 100644 index 0000000000000000000000000000000000000000..38e42798f683a80c38d103f3c0374a87156c6b10 GIT binary patch literal 46970 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 o$3Oo(9Fd;g3eHAcSsV(gDGBAx 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%0A&1s0$@&~lMs(obsz5tl0SXl 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%0AdTa)h4?7xmg9<)PNQF3F=d8lWEiOhROqRi4; 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 JPDHLkV1gN(0jU50 literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/background/point.png b/app/src/gambas3/img/background/point.png new file mode 100644 index 0000000000000000000000000000000000000000..e920a6613624ea5b8d6a6e0102fb481714711132 GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?smO1^9%x`eYW?*VnIo)BXe~!c-FE7tGKwTiZ_p$P@H*aSY+Oo}92iDIupp bFoc;Q;2azkVd*Yq?IngrCVwRY2jTz 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 V7UbheEusJb002ovPDHLkV1i6Gzmxy~ literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/background/square.png b/app/src/gambas3/img/background/square.png new file mode 100644 index 0000000000000000000000000000000000000000..23d25da25a8cf52628d00ff9c465356f51ce845f GIT binary patch literal 480 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaM~1^9%x*26$mRTYp~jRb()nwlDjJVX}4t*oqsi^JI!6%`PbKq&|tuBN=a z9Bx!;X(^ChTU%RPTnu3V$-=@yAPEFO@!Z^82m>ropO%&e6ojxtLqj2Kpxc2W6+S2b z16g(@L4LssGAhzavdZ#`a;j2lk`n3~;+kSwqS_+DIzqaFdinwe{CtK+ygbI-CZ=4R zW*p}17M5&Qtkx_x%(hI7cCPOpod%jz<>}%WVsX0l`U VUmk4x?g!8n44$rjF6*2UngC-Uy&(Vq literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/background/star.png b/app/src/gambas3/img/background/star.png new file mode 100644 index 0000000000000000000000000000000000000000..542dca4ac4a8b9217140b1682b6bc02d2f617b70 GIT binary patch literal 34262 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 alxA@kK&LgeQ%64l>}6$cXI5?M8UH^MxR^Hp literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/background/vline.png b/app/src/gambas3/img/background/vline.png new file mode 100644 index 0000000000000000000000000000000000000000..e5af138e9a662515ce16c277383013a5a47c0976 GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?smO1^9%x*4NkjWETD{Pc;+l&m}-922WQ%mvv4FO#u9ABQgL0 literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/background/warda.png b/app/src/gambas3/img/background/warda.png new file mode 100644 index 0000000000000000000000000000000000000000..99b3947a42c0cec7db0b674ab0dfbb19a3264960 GIT binary patch literal 24560 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

      %0#9aP3JTQZU=F1IcxrdXK_ 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

      " Then + If Not Trim(aLine[iLine - 1]) Then + If iLine < aLine.Max And If GetIndent(aLine[iLine + 1]) >= hMarkupList.iIndent Then + bJustList = False + Endif + aResult[aResult.Max - 1] = "

      \n" & aResult[aResult.Max - 1] + Endif + aResult.Remove(aResult.Max) + Else + GoSub CLOSE_PARA + aResult.Add(Space$(iCurrentIndent) & "
        ") + Endif + iCurrentIndent = hMarkupList.iIndent + aResult.Add(Space$(iCurrentIndent) & "
      • ") + sLine = Mid$(sLine, 3) + + Else If sList = "+" Or If Right(sList) = "." And IsDigit(Left(sList, -1)) Then + + hMarkupList = New MarkupList + hMarkupList.sType = "ol" + hMarkupList.iIndent = iIndent + 1 + GetIndent(Mid$(sLine, 2)) + aList.Add(hMarkupList) + bJustList = True + If aResult.Count And If Trim(aResult[aResult.Max]) = "
        >|oTn)+u4`z~SdVT06kc+>bBzrYqiQV3PUfzV*ttxfS)x8)OJTy+BqKyurQ zYl=XbAFR`YVyX~n)$U$vN@A2N7dpqfb+!^fiH!C8$P&{TJxs^uw;3|SIc1TyjPp*d z`Wcvsp!WlbhbQhV{-)_bQ|6Ul$*UG}%e^&+=nrALy>zVKRExCjQ$uPsCS>}+&Sr98 zL)1=PWzjo*2EOMGsBLuAdGt_@$#}O(w%prmIX}@) zI5pGzN)fw;N9~IUj5fHPiR~qbW*MziE?W~)QrDJ*m^kr# zDQ2nrO1e6$@pLuxEAZj?FfEDvghY_7H*8LJLkyr4u2QrVcTy65Iqv!P3#OmFonU<- zVf&v9X~J!J$e${X%w`WRuE^oxv}2=7f}sO<8YWVA)@|$^SZ{uqCv0t9hyjzAm!6gu z@A==&O^w0iiVf)GMqjK+(!x;yj4m0&hM_w1Ze}s5lR=%=bW{r>`5A9fzFUIp7OS*pD*>(GjG*KbpcSrcYu5NX={vBOk1TRnP=LJK9s6lb1Bq_NgvM{ z#sp+dH`le2z_^f_v_Gj#!R@03=iaw%2?WVH8;l+TF|*RX59%%hmN{M43tD=^2KyLd zvOmUlJ>(xWX6=V+GPFBtou~Ej|F(HN9KC-V@OZUb^W^IJ!$R8Fx+h)%!o$0@^3`ix z)8mu9&y$x~=FR7dg~y|i&Vkz(3QRFoxHqT|77BS1AY7SZ#}mJN`{LmCAvm1QB}()a6gn8n){J$ zD}*g`No=vfU;y(0zymS z9IQ435O?YNRV_H8@Rhkb!|k-h^JA+{W{1z&Mwba-%r(^6l`D~;ORj*{OQ{m~ysiIW zW)yZis^?kB-%0W5?r~LJNKpuIh*1qI+_4z%)}=`~&!Oe>>POIxVs~9q7Fl@n{+z*@ zY;!1{>jm*mfkax#h%jkbJ_H4RPgsrZ5)=&rjjS!;aiIh9!fY4PEHhIUpPbm*3zK>+ zER-gD2faY2l0)v^9#5AC`wI&&j47MEX}e)!o*eDy8!7g?$93mLk#=cdfG5gB05b7Z zM%euH^W*C9nT?MxZ<#4ob?^2$n&<}xpAdqu)hfMcBA`xuuyR|@)_IoB%_eIbx3+5x z#r=2=lf%UN1jQQe?`bKpWE5IWLK?vZu#*CLGD6=B z_GfvL?AezZe~qu5(<8}cGjr=V2p{uhC(h#XQJs>dq8v338cnf#<~mVH&BQF^jtlg% zke_&!fi54i)%Te@$P_^MD?yt5l^Tm`4^SO%EGsbzizKzcZM$!sYWXhNW0&!1lnGu9 z7cOl-5#F_qEAoxqm_Gqm9(z8hjCYHQEqT=n^GopgLYwL>d5cD86=67e6-ztSQ6l0x z?#!jThDm&du494Ek6lacUKe+!1>}5(SLfIM-QcI&dRXyz#=_3oJ`8^GVfFc8y-NG; z>@a%Ngh{E(Ml{>7N`-lAATfMGaz@s6*g+vl%{3SwI+b&*)3msA5e(-&yxQ4`sYs%S z!S1G}l5Q`T2SxtMv#L_Yq)4muspRpCF#aLYo85QV`6J8rM&A%8W#gLON{f1q@&Tjb}f!WOys2D$!$r( zw`OgJZ&yA4flW*K{1+##p-M6=Bib&kgRMJ-uE(L1{EL2Ar^ z=>HuZ=#cwQ^Zx<*zl~1(msS5a=>Oln_+N^OcR|b=m~cT%`#-!w#T|psmaz6`Zg3UL ROCLJ`ET+{& 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 + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/app/src/gambas3/img/component/deprecated.png b/app/src/gambas3/img/component/deprecated.png new file mode 100644 index 0000000000000000000000000000000000000000..71eeb6ae0e9286d07f96b209cbd82bbeebd5e9c4 GIT binary patch literal 228 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFM;1lBNlUaCAQSpJi{Cx!l2!e25h>JgylDe&;0u)S3_3Q?!=Pn8I3udqj zyn5)nZ#Op=pU5rADL`R&PZ!4!j_b(@2iRxCIEx(Ud2}Z8SpuUr+p)6>iqlxwG7Z@k znoF4;yY(>`I7cy@N$|XL;sD#Eq)lQ85j@x8=Uhzd%Tmx|VDS9GeL!c2-U*+2f2R8$Q{vP(*GArM@08L@=boFyt=akR{02S;1lBNlUZnAZ*N~`Z{J{VS8tbpKi|FIJ>gJ7&aIr>+qt>7axE;^O92(L zmIV0)Gkgy`)NRhx>;n|A@^oaz|Fvy!zAx@251U{r>mdKI;Vst0C*-pI{*Lx literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/component/unfinished.png b/app/src/gambas3/img/component/unfinished.png new file mode 100644 index 0000000000000000000000000000000000000000..62a8db966b93c5bfa740cd8d45da28c9f7fec2bf GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstUx|vage(c z!@6@aFM%AJ0G|+7pUlF>#>NI1fUxcB?d|LA?Hlav>g^yh-QC^!_wy4DCAjyy=ibWA zxs{W9J2&_Btrb9X_)3EOf*As@a((wb^gZxUcQ+sRG}}LifHF~@E{-7*m*@6-^Bqv& za1j;#aJlQ-zw+EQ5#P_H8Sx9TCG(|Ttlnas&T)?Q#DAGn8XFH5F(JgQu&X%Q~loCICA0 BWyb&j literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/component/unknown.png b/app/src/gambas3/img/component/unknown.png new file mode 100644 index 0000000000000000000000000000000000000000..0d7aecd2af98680dc02eca78ee806f33505b6751 GIT binary patch literal 304 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 X4KpgE-trFiH-cU6e*0U>K>z?d!nX?j literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/control/button.png b/app/src/gambas3/img/control/button.png new file mode 100644 index 0000000000000000000000000000000000000000..d19ffab869a7f4244fc6522de04ef341b50c08b9 GIT binary patch literal 598 zcmV-c0;&CpP)Px$3s6i{MNDaN`}_Ol<>mSL`TqX?FMe2?(XpL@a*jD_4W1h^YiQL>i_@%3JMB1I5_0wSkSoYmFU=H})R z5fKs+5?fnaR8&;x=;&~8a6dmkYHDghK|uil0p8x;R`T`r00001bW%=J06^y0W&i*H z+(|@1R5;7s(#KZ9P!xsXC~8n|OL7uA0SnlB?~P^`>-#^6d#!sjJjAW+siohbD}U#eMu>tCr10%Nsl$CwU% zn`ZoYd0cX|IN_vb5k<1am9|lPm<& kECjPG1bLP}`f_98AFEs=O#keAD*ylh07*qoM6N<$f{JYr2LJ#7 literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/control/checkbox.png b/app/src/gambas3/img/control/checkbox.png new file mode 100644 index 0000000000000000000000000000000000000000..86da7b02f91c8dd8a79e75c92ef277b8148ad367 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBn0X`wFKADC8|Nn1jXaEWvIB;OWf(1``Q)hsbmIV0)GdMiEkp|?rdb&7< zXq-<@kT5u~goTyMfYDK7L5u^dufqurUx!FRPY0GY44wxf1(z^*0)>_^+~i4}z?8zc kfk`BqN%Jdr6$3BOlol7h{XFGc)PPI|Pgg&ebxsLQ04~lp_y7O^ literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/control/columnview.png b/app/src/gambas3/img/control/columnview.png new file mode 100644 index 0000000000000000000000000000000000000000..99ae4889cca8d1bfc3d114b3c8987196279c720f GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBh0X`wF|Ns9#aNs~gL&N?1_m!Tl4*-hmd%8G=NL)^iU}fd`{r~@8ewP0m z3?5`jNk~XGG;kiw;3;h}lITb{Ai`f)oDj#xAaTj+9pBUkHbAWmp00i_>zopr01H(x A{Qv*} literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/control/combobox.png b/app/src/gambas3/img/control/combobox.png new file mode 100644 index 0000000000000000000000000000000000000000..5d74871eb2b7aa1a3b3b0cb20aa1ad3c8ac73bd1 GIT binary patch literal 312 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaLr1AIbUeKHFlJ$m%`@#CjYpML%N_51hl4<0;dXlVHT`}fbEKmYyv_vg=_ z=g*(NeEIVA>(_7Iy!rh3^SgKNK79D_>C-2m8C6wPm6es{<>eI>6+3q9sIIPNdmoz! zvZ*Ad$DYF3GiZ>>N3Hbg}?K`Zu7IJ=c%(fZoeMAU$?2i;KqhN0ghXXFS_0P zukvF~M_S=dj(h1zG5k%_T`qXA%ygOH#nR~#;PLO*>AQ#c*=i*YMg|@*2fBg5)78&q Iol`;+0LjUdkpKVy literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/control/dial.png b/app/src/gambas3/img/control/dial.png new file mode 100644 index 0000000000000000000000000000000000000000..32284171c7474c7c0618e3e9f06ca3fea179cd72 GIT binary patch literal 745 zcmVPx$AW%$HMNDaNnVFg0-{jfZ+2-f!=jZ3<=H}()<>%u+Kva-U$!jqGe-QC^B#>U~{;Xgk=xw*O4*4EzM-le6bjEsz_sj1r9+M1f0i;Ihg zhljYhxVyW%)YR0sx3`Lling}4&d$zxd3lM6iBeKhbaZt&IXQlQemXij$jHdRz`#jK zNq~TWh=_=TgM(93Q?<3VudlCxfq{~elF`x8)z#ISnw;O@<=o!mo}QkhrKsTH=6id4 z#Ky|p+}z^g;@H~X;p69bcX#9D=!uGquCKGq&eC>wc(Aar+uh=nm6*G{zvSfP%gf8b z!NJ?y-EVJisHmt&NJv6LLV z*i3t|m;e9(3UpFVQvm<}|B^|P+ezCk@Y!ns00B`+L_t(I%dJyqcY;6=oP#7Jf*rvw zVysbye1J8WQzI$(Xm}TGI?i}E;1$xF=6PTx`$zzki9FU>M3IZbu zj|OxtmF_B~mYRb+>t&-E^q<-(*+zAx+6W^XWfFoBBu(AL;UW+b9T)?qI*XjXV!vLk zq4UAvYw9qHCwc!PZaa}k&uRW(BtrX0khacGAPL*+Dg0rf+T^1H(3hKoK4q3xBJ0z2g`f2VzZoaDR8KaUK7X-zs?-(@ura=)vz6%9_Kitww4uop?Ko#gu5(juWzpdcb?|1 z8_+6}*#oZ27v6-5<|^ymY~bN?oa6?goh;qldRa!aRQAPtmfiNr-m<$Z7Wp5J{q#Hw bz`xlK*B~3kLnEQ200000NkvXXu0mjfv*wOF literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/control/dnsclient.png b/app/src/gambas3/img/control/dnsclient.png new file mode 100644 index 0000000000000000000000000000000000000000..44b0d2e2ed19ccecec12d48ff1d47327ebb682ca GIT binary patch literal 1192 zcmV;Z1XufsP)Px%F;GlYMNDaNfWNQgHr{Hg<;BTkj zfPnvRr{Ha--*BhkZ>QgGr{8a<-fySiZ>QgHsorj-;BTkj|NsAhfPitR-*l?ra;f0{ z|Nr>={rUXSu4`uh5omX`Yb{&lM0p2X>-$Lof*HPiv;^N}k+S+=q;&-g!y4CQR!RVdC>95Z1 zyu7^G==Y7e=IrzP;q3Ut+wzXO=FiX1#8yXK^%q?*F%f3f4;>i4h6?1hDep~dRu<>l+^>*VC*@bK`Onwpc7ll1iTv$M0p!ottu z^y2OLrpfEP*6@3-;@Ic*fU)D+==Z71?8n{nk-X=#(eCi}{Py|%in!&m&+f+D^6Kj9 zi@4?O?d_G7m58_H=<)i=-t*k*_u1Lmy}iA+x3}{0^3>$@l)dMCui~kxsf~?|_4W0O zi;MX9_=AIkv9YnLs;a=iz>klQh=_>c?fA6O?uWJHjk@Nh$m_w`@sqvhfwJTD`2Eu3 z^_s!y=kfaK^7@v)=z6Z<^Y{F_*6@O}-hKg_nDcQfq{XgrKO;tppuf3%F4?2 z_V&!o%#@UrhK7dS-QCR=+f@Jn02FjmPE!B`%qhd_V~YF&^FK@J!u#9YK1zjPyMO=y z0rg2lK~y-)wUA|78&MF2Nr)^7rO=+c*^M{E-Ent!E0nssd#Ss-ySv-3>l&dn^ywFR zKHWR#eP+%~M#eNMORH8WDN3nOYqO@XWvV>D-sEyc0OYD^c=Nh5U?Op2d3~g@yZe<6RQ7NEHF#;(zrF7~b*0mHIDq{dXqO|qK%ARkYvLRW}%w4d|x=}zknz8mdULPC$B zlJ?JITHpPF7%+0H{$C zyi*|gi`HQ$0zb5?;O(QTc)bs7f@X&j@_GmbHV8`Y( zU{1sL=%|hKe@I$d6TM|S(}B74yoBxRKx@)+{7}!a@RY!yZRFFte#_y5M-tI=;N$0? zqqY(H39*z#_wU-22E?AmzVr?c(&5Px$GEhuZMgRZ*z5l($|HQ6~q5pq>zixj&+`oVSe}I61 zf8765+|!f)lmDTisptQsZe)Pm|Nrgn|Nj1b{eoQVqN#3apKf2c?Ej$U|D5Fi_x=Cn z`2UCA|KRuk;Q!##^Z&{4|HttE|M>Xz{Qv*Q$N!3o|NQ*_zP_L3|Np_k|MT$MgLE|Cg86|JGOD&-VTQNa41X;{T`rr{wtm zr2ePd_5auO|GDh{|J2m{et-Xffd8wj=J@~Rcz^$afyI%b)O3G+{(;VNfB%t@ll+j0 z%j?8%e{%SYL*BdSd4I!;Po&9i@OyvacYm&mpulc_eD#8B^pmb~UYc`cNYb`V%(0zt zVXSU!cbtcclZ%YSqZuO8{fr;_}008(&L_t(I%VXdm02nwJ@B;cNkYz*wV{8hT z*b#u6umS-B3Iq)e@GEd+F%`t8z}JU`MIWDn5Ed2|9aZcKyaJ+9BZGkoSd_6T5E2e# zV`EE+4h1SuQN&bWqz9B{i;dxn2m`86!%!e(36f_^6y;-O4Ps%@)|J2PyD( zVqwumQDA0mYt97%Ng^T%tgNhVEG+H+6a^;yoJha{ONvrQR^W<7feexnyjatu0$kq80(+vBlZNV7!j-Be m<#{E<#iRx(NS%G}U;vjb? zhIQv;UIIB<0X`wF4Gj&Ajg9~R{|7P{>i-`&Z~!QCKbzs%vu6h%{Qv*pAP_Vj`2Xa| zlRZyY835&&N`m}?Uj?4a+inBo9r1K=4AD5BEMVZq*u%5OOXC4kv!GG9X~@ij9!K3z zavr%kjZOH%OqOZBO{)Wnii&0$ajHyU6K7yry2M09G=b6dt;r0@07lamU4_Qn%m7h| zcLxM6_}yNzWJzdT2#at4^G=6YPtHgMU0#iVxR5wjK@V@H%*c=>AxruK7_TsjI2bWI zJM68w_-T=ns*>!oM@&2lq6+6ZAJ%r5Ot|!-fn!I-Du$~&EgV^6)GSx7XlUYG$FyRG oMWbeb@r1jLp$y8KE>31GB+x$$p00i_>zopr0LgZL>Hq)$ literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/control/embedder.png b/app/src/gambas3/img/control/embedder.png new file mode 100644 index 0000000000000000000000000000000000000000..e9bfdc6f2e314c023fe8a84b1dc8ac0e23851c21 GIT binary patch literal 1510 zcmX9-2~bm46phdb1|l#B1`O#BKrwlagR~7Ra(WrBG2n#5b**rI1fW+@A zG|~h{S^~VCj26H;9m9jwfUqA$38(2Ch#xTcUjd<^p;NR3h$oSRl>iYK5&l#R-^0Tr zARr(rDvHf!GZ>7(z(6LG>F@6^5C~uk3`8O^Cnv|=-aaBCV%xTDBoZkrD@!aE1135; zIwd6~IXRh1r2>OoE*FVJYPFin<-*&BhK8=LE~!-7+uI9qQc{wQjSa|odwT;dg+c*5 zWMyY(7ZMU8kw`!&J3AYP!}noK^ zCiC?41Q=)mCL<%`D?eC(Lpa&Gbt_y15;B=gAQ0T$-5nep;N02S85{u*7K;T(z)7Rg zfIlWC27_5?4paa*AuC{LZf*wV;Nalc*x16tLP#FAPyvttvl}*SaC375X2>KyK0Y!s z(#OXKkl+puL1NRUO$dSvM#OG#BayzZ^#F&IF;Cmlt3llRa#1y|*8D;qiD5QOFS)t7paRwu3I&J5VX;`?4oHMTA+#83o|cvd z)-)Oov^70Fy}G)(udlDFs;Z--qqViQrKP2^vJxf%yyxZR6%-Vdl$1bjr%#_A9v(h; z@Zi9}0E__)1NdrdYwPdt*J`y&rIOF*Lu;T}P->Y_R8&+{R#pZhSH4pYnU~74dV>8( zU~H&_&rU#PXt69bbComBWu4P0M{VEZF6kL{C$Dz-%OQGa!--dxj=ybwsuAQBaCa0O zQ44M;o{ozjEq8r8n-W(WKB0H~*|NUX;#TI_g=m+E7 z7xRo!R(4i}?a{YMv3hgKnBGg`Dg4*i{k*;TbA`2cJz4jXdLya0Z#nK+@0eK_e9C{Y zXjB2^_e=u^{dmjaWk!4YePKP;HuEp3@l)k(OjAe~Ge0}8;?1WW z`#hBTn`653#dqIhP1ZLPW-$gQb?2GxX)|Ef}Ij^d2QDPUh*5V{4an#(xhJAGW zeD2(Gs>#~4r9RASmHv({2VeS3SGOzBu{!1QF%^%w--1Ybd2hzWWa=(CQM=g_zjTuA zM|n6?y6;ViNrf(Htj%F3kAAn9mU3ZXcD+(nwKP4|n`^=hR{yit;GM`+*IqM8 zQq%P7*D}jXku~#54Z&xOE<;DaF*upPmP}K=bg1|zus+YQF^51###KgKjMFK_t{faX^US|uD!Bw zYWES}(sinJ^PyMu#Kr?ns>aDRSxzLhc<-HQCgxDk?b5kZ`px4MfhY=wQ||Rdf-H<+ OAw;ndHtk%rr2c;ueL-sg literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/control/frame.png b/app/src/gambas3/img/control/frame.png new file mode 100644 index 0000000000000000000000000000000000000000..e305c1366c34df217d7feee6da7617482c33e069 GIT binary patch literal 554 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaM?1o(uw`eYUYnZpb;G&F?dAFu=Z%Dp7WFPMRg!*_~XfX*Ei=j-0jqwQXN z6`g9hAZ)hq;zY5Fxxeo7i#R=CTxPkF@A%d8e!4Rbu+C)eo^NV(Wz{E^z-IrXbS3Mj z>|gXvcz^zJ0vb8j)5S5w;&gI>I)lU=$q!5>tUg&RA{&YW7Brl1IXbm*?)766Bu^v? zi;FphCmhSye{kkqQu^7m#}!WNsvc`uci`07izgXVTG!e&+ZZnsm3k(o(=w2AvwrdF|0!AGyIt_8at8{LmzIp8t9eZJs{ ri3zExN2K^znyW$%u3$PPD!{;ScC)VV;TEYmpcwUZ^>bP0l+XkKB9(ui literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/control/ftpclient.png b/app/src/gambas3/img/control/ftpclient.png new file mode 100644 index 0000000000000000000000000000000000000000..50b95c3c29e6cc896ce2b11069c6243603d3792f GIT binary patch literal 1128 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 literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/control/gridview.png b/app/src/gambas3/img/control/gridview.png new file mode 100644 index 0000000000000000000000000000000000000000..ba44dc89d7b34b68251da4c29f53d642a4c55e8c GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBh0X`wF|Ns9#aNs~gL&N?1_m!Tl4*-hmdb&7NS%G}U;vjb? zhIQv;UIID%0X`wFKADC885lsQp#ez#iD9_~lwvLk@(X6DbMz8?xB$qt^>lFz(Kw%M z;Kt0u#-q_tX~1p3X>hsLF{m%v#QU< b$;=EFH3j=w?gw!I4Px+g^>bP0l+XkKF_<%y literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/control/hpanel.png b/app/src/gambas3/img/control/hpanel.png new file mode 100644 index 0000000000000000000000000000000000000000..1b4389f4671974a5a133cb82050ee6ac60c80adb GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIID%0X`wF{}~v3G7Ev^|Aq!2Dcz;M4k*Q3666NS%G}U;vjb? zhIQv;UIIBn0X`wFKADC885lsQq2d4j{XmAm2N!doEOSYaUobQXLk8oe1jY$G5e!EdI2%+H+L$68 u7&nByVUmctzPx%A5ctGMNDaNfWNQgHr{Hg<;BTkj zfPnvRr{Ha--*BhkZ>QgGr{8a<-fySiZ>QgHsorj-;BTkj|NsAhfPnDu@NuZ$bgJOG zy1H_y;Qs&r`1}2kkdXQO{=L`m@AdoX>FNId|N8p+(9qEO{Qh;S;Dm&Pp2X>-$Lof* z{r;MonxLSd^z`(^#Kh(0<$A8- zcdX&M)$p0Y=$*squg>k+==Y7e=IrzP;q3Ut+wzXO=Hu@9kh|uZ!s&mp8x8>;Z`pMq&o12^5>i5#p($wVjl)dMC zuj1kD__WdPhqdI5y5@F4qK>GJxPzvz0d z;q&+WyVmf6v*V-3>%iIZjJf90+7khslUI!mzS5=*w~DWjK#&p#>U2nhljhnyRNRT`^A{? z0000KbW%=J00hh_!|G#-`~veoOXxiI?(S}XVAlv)+Ma&N{V-?d-QSsa-^M`K5-b7bU=6-;5)|0cY0@$Vn{$8R)U0@v#yFM3|Wl1{5h{Mh=K2 zM{>WMqb@AG$`=baaZLIjxIO_}cyP$=Om; zvCXz?(|WfW_!4)QQ96GfrE^IswN>qiuT=w|e)VMo-Rt5j{%ny2^i2=xeobxPD7|ou k(#>19&<(3|zlVS8H~0O22KgoO{{R3007*qoM6N<$f~`K$@Bjb+ literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/control/iconview.png b/app/src/gambas3/img/control/iconview.png new file mode 100644 index 0000000000000000000000000000000000000000..b96d916e422e18fc36873d77ed3ac67b87c5a403 GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wF|Ns9#aNs~gL&Nd+8}9=J)jVAsLnJOIN3gQ;@bV-aa8YVDyu#Sw oz{AF_pmd-?Q|?RI!6sIQ<%gB#URgY8Gf)SEr>mdKI;Vst06B6hl>h($ literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/control/label.png b/app/src/gambas3/img/control/label.png new file mode 100644 index 0000000000000000000000000000000000000000..e03ba275e8df5b638c260766d3e2b74a15d80262 GIT binary patch literal 621 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaOI2Ka=y`eYUYnIi?vU%*xr6$ z$G2HxZ@{nIBfnD}1A!(V@pN$vu{eEqawy+n0|A#&*O>*AkMsa`yzM7gh`F zURJK`5Nw;!mQlYgiOI1|!1-b5;SVc!x;lKi>MWq6b+F;UZ;SonY*QEfuao2dvOmUs j8orCkFhtUm%b=!lvI6;x#X;^) z4C~IxyaaN31AIbUeKHGgxP@MG54zYEuvdT_ad}dzJuE=CjHjYIZc^#G2V(c6TL*i|P#TRAf zAGGn>9-Xo$BB`sgYGG#H)|ixSF{v_~+}#yba}8}~<`r*?PU)zs-W`!t(X?L;Xrf3- zkY6x^qU4N3&!w_Er95Wu@LDY~^U;bqIZc0jfby$7T^vI!PT#$FQ>e*+hxI~-$eQ0m zTpaIy|N1{a-B8zP#;;Y6YqMrKpW4C@-}R>RVEeXPYo_n6U3DRE3U}1XP??u9=Z!BP zIKdV5b@ETKQoog%R~p_p+~Df|WRTkU;b2G3!KQ6&Dw}4o#tHZA_~h_WF$N cL-)@N$veezz5YLJ2RfU<)78&qol`;+09>`W#sB~S literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/control/listbox.png b/app/src/gambas3/img/control/listbox.png new file mode 100644 index 0000000000000000000000000000000000000000..9a732959349f77eb708cc7c466bed04514281c4d GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wF4O{;MK|@1>-d;g9prDMWi(`ny<>UxfRvuoSgaa;`$ypi_ExfsG bIuQ)N*ZXaMsWVX*sE)zY)z4*}Q$iB}7G@)_ literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/control/listview.png b/app/src/gambas3/img/control/listview.png new file mode 100644 index 0000000000000000000000000000000000000000..f440759f33f48ee02f73d5e2a54d7d625031f4db GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wF|NsAQXlOWa;K1K}i%CF1B~KT}5Q)pl9IZ@j>}&=JM~+2oWjK`) kpm3%^TkaIwp(a)akysgRzBAt=fvOoiUHx3vIVCg!0A|o9r2qf` literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/control/moviebox.png b/app/src/gambas3/img/control/moviebox.png new file mode 100644 index 0000000000000000000000000000000000000000..121f0c7c0a51bd5148fca7759a9b090cd8db7d46 GIT binary patch literal 493 zcmVPx#!%$3AMNDaNZ>i8Lfx2Iy%jfa;Glsl0hQ0s)|A2si zDS)|fs?cSm&92YokGht(}vDBHv-h;K)!P@Ki z`~6Fl#LM9B{{H_qhrQqI^)-jRJBz=Bw%0j{zE76LXr<0mnZ{9=##EWdIElW5w$^5( z&BWa7^Z5IRxY)kg>Y~WuK#jng#NIB0yQjVp2|j%!twX| z^7#8Pgu9@};4g!_WL(v^00001bW%=J06^y0W&i*HyGcYrR5;7!lSK~0Fc3upc9Nfl z%FN8nc>hziaW-8{>P^*6pJdt6Jjq`(wxYROfv z8I>Y*s*}w(p-44~W8>c*XLT`yU!?>cyKvjzwV+ORat`iXu7?xWUd*`N=>Fv-cHG{U j2glX)kKg2{&nx2zcfBF>A<1Je00000NkvXXu0mjfC(rtR literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/control/panel.png b/app/src/gambas3/img/control/panel.png new file mode 100644 index 0000000000000000000000000000000000000000..b8d55d6bc49e1d3e6282a09c2873462a9314e3a7 GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?smO1^9%x`eYV1G&HOYTKEklT@vIM%;50sMjDVK>gnPb!f`$M2R{oBFAq;o db3cP6FN2?rxVV7dG%uh622WQ%mvv4FO#qR$A~^s6 literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/control/picturebox.png b/app/src/gambas3/img/control/picturebox.png new file mode 100644 index 0000000000000000000000000000000000000000..dabadf1c6e8ccf3383b3b0ce6be51bdb7fe052c7 GIT binary patch literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICC0X`wFKADC8|NlR5;6VQU{O#|z-@niB@FCyZx4HlReLwo?C~wWB{~&E8 zL4Lsu4$p3+0XYetE{-7@=aUl@c%}p}gfTj*I0QF-+rkyncNS%G}U;vjb? zhIQv;UIID%0X`wFKAD9F4jh<2fBygf|MTzX&%08R4^meWFVdQ&MBb@06_6E3;+NC literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/control/progressbar.png b/app/src/gambas3/img/control/progressbar.png new file mode 100644 index 0000000000000000000000000000000000000000..b7443d5f60199770a02cc475d750531a3eb28321 GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIB10X`wFKAD9L4GoQrjSXA>0|AiTu<8jAuyZun1Jy8>1o;Isyb5&c-ggVg zRrhpp4AD5BoFK8w!BB*i!>~j0a3i;Xh!M+Tt{s=$7!F7AwDZO?FetxNJ1CR&s1c}z N!PC{xWt~$(69DhlHQxXL literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/control/radiobutton.png b/app/src/gambas3/img/control/radiobutton.png new file mode 100644 index 0000000000000000000000000000000000000000..9396b7b244be2f1b798bdc42cee27b8340dde943 GIT binary patch literal 502 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaMK2Ka=y`eYV1Ac2`PXErxCLj>TA#>PgV2!uptKokJQK~h`)1Hsj+SAYHa zf9A}YKY#vQzI^%f=g&a(pFVwR+WK$8-hW@de3?Ig{)GMizJC2WZ{EC9r%vs^_5b&u z|JSZvTd-h3!G%uR&c55QoTH{${8##x?>8qayXJjv+U;mtUCi|IQ&ZHU zM5nf$C%FwbBs+C&P|k>WaG-^$bHPEy8^(#PD~@yD6Z`Vx)cWj@O$qG>dB03qdNiwd zsnQL{O>KYgQu&X J%Q~loCIAa21ib(N literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/control/scrollarea.png b/app/src/gambas3/img/control/scrollarea.png new file mode 100644 index 0000000000000000000000000000000000000000..be0330a69b69683b79dfdd4ee210908ff7aef539 GIT binary patch literal 642 zcmV-|0)737P)Px$AW%$HMgRZ*zixj&+`qm5y?@;Q=H}-Ae}8}ff55=N zfPjF+|HQ6~p;O$`lmCX-kdR5?wg1u4|JvIBnwoa{h{ylO_5A|MTPpfq})5q11GLeg1*Ya)1Akk^i-||A2u1tE-dzkcrFd#BYCc_>4o|yXbj;!;4R( z$!_p_f8uw4u8N?*Zhw6Bf@}1Xu5w217?**teM2ejzTPvikmv_%%WS4^t>DuG6S+PR-sU^~oDLFli+FO- z3v6e9|KQ;26tNSLLZp8_f2-1@QU&qcf0l<ICIA2c07*qoM6N<$f?p+IY5)KL literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/control/scrollbar.png b/app/src/gambas3/img/control/scrollbar.png new file mode 100644 index 0000000000000000000000000000000000000000..6ee1e7fbdbd3e29939ec45e4adf9534c49561c3c GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICC0X`wFKAD9;=79qTo<4mFVLX5S9LRn4>=}^zp@PL6NU@g$`2{o7H8$Eg zI#wrh`T~XQJY5_^G|nd{Ncc5eYz*Bi!=Yt0OE`k1foT$x&r^X$KIUVc4y?kGHxik6 r9U=vsgc!V%ITA7s8i-uJ^^lq2W{z5G{F|~kph*m#u6{1-oD!M<{eeHK literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/control/scrollview.png b/app/src/gambas3/img/control/scrollview.png new file mode 100644 index 0000000000000000000000000000000000000000..58847106049083c56ab7e22b549796a9e8b49e51 GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIID%0X`wFKADC8|NlR5;6Ot|!?S14Uff+Q4pLVVh5!dnu9yaghQ^r^j48qnOfOC{GF+V~ VQ^OzgNEm1WgQu&X%Q~loCIBbwG&=wQ literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/control/select.png b/app/src/gambas3/img/control/select.png new file mode 100644 index 0000000000000000000000000000000000000000..45cc209dee3340c2e8f99cdb8fb689e2933220aa GIT binary patch literal 984 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~Ixyacjm2l#}z`eYUY#UY@eprE_E8^$9*8yg!J7DDxwmzSrdrSI z|Ni~+qP{$ zCjlJ>)Cg2Ib?VebixvUR+`oT6&=#N+Pz0!J%a$!bqn0jRI&mp!ZTr zg8YIRI9d4wbeI`gn79Qv*w_Vmg~VAo`6c;Twf|gx@Z>MYTOO`IJiJ`zM89#~miWAX z@3cPxe>eq1te^d`GUnm2B7#4=;ubPEw|tCa@>5rdiVW##w|0M@?|dy@7jJ?NZ`%P-7-JG=4Ikkz1Bv$X3Is#*+*xTwO6kf>zejpZrM&3VUN02 zGlPEt1`=K2JC-QV^<;e{92yz#{@747)YQO6Wyv2?v(B2GIcDdprZK%zpXx5?liPMM zbM3aBV$WXGD7YQ1n{drP!Q{iFqdBwZMDp~Xe*3bRed{-c#&SJ>pMK9pg0I)hv#524 yPKmBO5@pE25;uv5WAk(oFS-0nV5D)w~sb6Mw<&;$U$s;Gnj literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/control/separator.png b/app/src/gambas3/img/control/separator.png new file mode 100644 index 0000000000000000000000000000000000000000..d6222ddc97dc5385fc7674bfba96220a2c1d200d GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?smO1^9%x`eYV1G&HOYTKEklT@vIM%;50sMjDVK;OXKR!f`!0!GYnJqssvX Z2F^SN+1xABmICD%JYD@<);T3K0RRXUBG~`{ literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/control/serialport.png b/app/src/gambas3/img/control/serialport.png new file mode 100644 index 0000000000000000000000000000000000000000..f9319ed61893f6721273655eb4401cc9d8cfbbf5 GIT binary patch literal 419 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaM`0(?STeKHFjFo2_@qn(|dlamuf2FQglfSQoiy1Kdox%OZHR18rD7sixWbN7l3VFx(TR!nWu|mh{fr*7t{F;EAX%;q)*yAIc?ZO#5+Q zn!>NCDymDSa5i%lX|d@#J$x&mn=dTJs57IYI$^QH$_KkT%xok|B0L#i?dk|C;i-DV zbmO9NMgfN|p9#+=!R3X=gp>biah-Ab{@Y~n1*1a_CG#8DT%>NS=v~mZwz2uj4W-t_ zjqPVFQrP^(^^%l39`4hQ|Ka`rclNZ8ceq~8_n%ifPu6z=`_dCY7c+Re`njxgN@xNA D^7xU# literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/control/serversocket.png b/app/src/gambas3/img/control/serversocket.png new file mode 100644 index 0000000000000000000000000000000000000000..305cf32fdfd2e3973a89e09d47945688c3b7fab6 GIT binary patch literal 484 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaMe1AIbUeKHH}?Ccy+fuo~iLqh{Z%--G}F6rdt1eAgRh~WSK|Gm7tCQX|3 z^XJdgr%%tGJv%Zo^54II`}XY%4-fzT{d;qB^PfL|e*gac`t|EKZ{AFwK7HD>X){f& z8G#NEDGBlmX3+e6JDKH77t^2LFAu#sY-jK7b?1CgG{_TgJzX3_EKaWtzA4mXz~izm zC@+z@X#TJN^EDKVLal@67S5lPwmj2Z+V{8eoEfc*&mB)Bxd&}KBf`#exoZ9VoCR9l zl@iYutzr26CCdJF#_U;TSA4l`D_0hOk>z|*^3@=L y9sYLN!Y}CdYVq`|%1Qg4@0xdB>G^!^TJ{_>6Sf0Y&69y1XYh3Ob6Mw<&;$T!%FW*Z literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/control/slider.png b/app/src/gambas3/img/control/slider.png new file mode 100644 index 0000000000000000000000000000000000000000..67ba6b0482583ed4e6b2bcd3ffc8ed40016fbf51 GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaO00(?STeKHFhP(gQhcOw{pgtz@a00s?P|2H)?_4oHT^vr8$YVrNJ>I~2X zo{}KHV1{lkzVC;)eFLvHHU_+%?E@4K^K@|xu{fQaAi?^DO=gXb&Kj8=PbDpH&YW?> zQnK*X^AxtgGjnF76?|-JV6bjEe(roT*AB@8pY}BQ2(aeVWN=k*Xe(r}I=UvmVs?dHxB|1_n=8KbLh*2~7ao)MOw4 literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/control/socket.png b/app/src/gambas3/img/control/socket.png new file mode 100644 index 0000000000000000000000000000000000000000..1ca7ae80b8425280372a889af0ddc94ab5d7854d GIT binary patch literal 358 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaMQ0(?STeKHFh8XD~E>>L~%9335jBoNr!+r!yTPEJ4(2p1?0mIo0)5r`l} zWQmKxN}!qIB|(0{3{0BIU1vBxPGb3NciZdG%in+Qc-tR-b$|DqB%qR+o-U3d7N@UH ze$Cgcz~lB*&3xyMm3#ir-c=gCrB6>yPiENnG++IUdZ$$q-& zIsw)LSEsgoYOXz0SoN!g=a36GXUjw}C5}mADjdwZ6#^0NU#-7MIR`XVoX-s1yZ((j z=ew-hNS%G}U;vjb? zhIQv;UIIB10X`wFKAD9L4GoQrjsO4uhcJLLPo6ya)zP5=WHFZn`2{n)3Uun;cMHh% z@pN$v(Kw%+uz)+D#F5d7=g~2Z1rrWRh8|$q?;tg+Au_{gmBXq+iB%38Hfkz5dy0FQ ynK_GcFh}($CCn1*NpsUE+?K#1;3jYh=$gyVT{>lgJH>(KGI+ZBxvXNS%G}U;vjb? zhIQv;UIICs0X`wFKADC885n>lMd{gJpdfQekY6xEon6=JUS1$q+tbA{MB;LCLPA17 zZbCytX22}PCeBkH4_b_*LL@JU7`i%0&fyF=R$#);AeGMl(c<+6W1uz$Pgg&ebxsLQ E08&~kO#lD@ literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/control/tabstrip.png b/app/src/gambas3/img/control/tabstrip.png new file mode 100644 index 0000000000000000000000000000000000000000..48c36357cfa79eff53d8e38f9e239646abb8455c GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIDl0X`wFKADAWZEZh({Mff|-_z%BdU_|EI(=c=wrz(GAKtlh=hJ6zcJA7J z=icMD8|6QN^p^zr1v5B2yO9Rugn7C+hG?8mP7r5dE@YF?2w`GA$~2=vpe0C*m$fOQ zrJ=2ZTVO|?1BXW=OAS*2w}Gz@Gh+)wv)YkgOgk8ak5m=zU=We$~G literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/control/textarea.png b/app/src/gambas3/img/control/textarea.png new file mode 100644 index 0000000000000000000000000000000000000000..ffe7c8d993e293083a73142923be4d04670c677b GIT binary patch literal 460 zcmV;-0WPx#$xuvGMgRZ*P*70I%gfNv&?_q|gM)+q{{Db~fWW}O z=H}*LU|`bH()084O-)VD&(B3gMZUhixw*OZ_4Ufi%282K$;rv0qM}GhNSm9R#>U3n z+}s!#7^Ha0f-`T2x|gl%nYSy@@y+SNm(A0Hofc6Ki>FB%#e92^|s;o)XxW}u*; z85tSd+uMzejlaLY4-XF>9v;B5j4%KI0HH}lK~y-)V_+u$7}y!`0=x=1I5>T_zSU{N5)s$~FFU?ZTX!zQdC!_1AYfLWej zQ;@;XgqKx_fkBo_T#U?+994h=aB^~vDnMjj0ssJh#1FO1P((cd0000Px#*icMVMNDaN_4W0Oi;JtPtJBld{{H^`{r&&{|A2si zBO@bzetzoe>iGEhzrVlh>+22<4l^?|k&%&da&ksSM&#t=_V)HPG&CzKD;padKR-WQ zTwFs#L$kB9nVFgH?(U$Vpc)z)#>U22SXk)j=<)IKA|fK*-ri`6&U85tQqK0ab%Vw;fsEvKiajEsz;qM|`TL349+tgNj2`};LDHF=vTT>t<80d!JMQvg8b*k%9# z0GvrgK~y-)V_+B-fP(;F;9$oK=&e9rnScUL7V;JF3fK#|v2$7&8tJmLGfRpyqbo4A z<8yaq=d>|5F=pjekm2J-SHS4tD9i-1!i-->T?mU6!q!gCUPx$tx!xlq@@bKv9=u}ixjg5^lF){1w>!hTl;o;%w>FI86Zhd`yudlCrdwcfw z_O-ROEG#VB+uL4VUc$n{_4W0Betzxk?X9h?PEJnX;NYmJs8LZ-`1tt6#l-~$1)-s# z-{0R;Q&WF`f3&o;%F4>u*VmMkl$Ms3NJvQR?Ce)pS3^TXKR-WQTwF&-M|E{|OiWDi z@$sObpgTJ|rlzK6XJ<=GOFlk6tE;P!kdT9egTB7LxVX5wy1JjApI={JuCA_4O-(vF zI$&U6FfcH`zrS&DaWXP8BqSv6?(R}jQi6hlv$M0@+}!Hw>hJIG$;rvV!NIJotfi%; z2L}fp9v*3FX*4u6EiElIH8m3x6Y}!%ARr(T5)yK9a<;a%h=_=nmzUJk)VsU8!^6Wi zHa2i@aEFJ7-QC^2y}cP38Ka}40|NuZ#KhIr)m>d(($dmxZEg57$c_L20k=s+K~y-) zrPJqE(_j<^@TYwTNlChQ%N}L#-2wtC%Y`fjmEl0y!@(9*K<3}<+d)a8g~RcFNKQ_E z=gGaf3DWK;q~X@O6-bhF4^Z7&VVGN00~9rzDzHbY0B-4ckfeu=HlcnKpk(IhqwIJ@9GnOLg0&w1LNgXV^rznhA!21{ zI%;z?$8I!lvI6;x#X;^) z4C~Ixyack91AIbUeKHGy;-dgh2xzA}Zvsjulmz(&Ggw?@Vqptr)cGZ})T>X6gR9p( zf3LuvhZ6B`Wcbp9j3s~HafqDB8^E*wahY;e$bt61N80LdFJkpr;=N`5+k>xme^&XP z{j5{{>DFV#M@`?I61BayJv7mYbKddgf=xe6k}QtLPX*fb-qXb~#NzbR$Q?rqH*n(?`$DS-NxOr=9lX!lvI6;x#X;^) z4C~IxyaaM`0(?STeKHH1o0}W3fyTy0G~uSECZGti`2YX^_wV0-KR^HP-@l(eecH2U z&x8pRu3Wj&-{1f1*RQo}*WS5v=kDFRyLRo`xpU`ZRgY+(y&@$+e!&cypKt$RIn%|I z{QKo0yI1yyy}j<(7fFH~{om8YF~s8Z+Q}~`H5mxB2r@ln+qn2n`@a9y?%4qJu151``D>j;Tx4@)WkDbJ%7m9yB@fZAA7qj+MeO!$-eouK8r6% zssHE|O^-;E+!goKP(LBPXn+6jkM9{d3ftFjZV?pw$kV|(ah1tIlmG0`I8R>u&$`Tx zxkK>aeH$&FL#!Q)tt=K*<` zT}y&oqjG~*nyqyVTpCoZUd&|=+fA>$zwliG2 z>F=)Fb)`4|eLZ~hdEf^d@5?&RUH_a_|I7URva!n#-Q;J$pkVNH^>bP0l+XkK$vovJ literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/control/togglebutton.png b/app/src/gambas3/img/control/togglebutton.png new file mode 100644 index 0000000000000000000000000000000000000000..1a97cf630425f5e7eca7a4b876d42994826367bf GIT binary patch literal 252 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaM=0(?STeKHGQzI^%l^XCT-9=v}2`pug+@7}#@XlVHG;lrm-pZ@*(_x=0# zM~@yoe*F07&!119KK=ds_n$w1zJC4s{Q2{^5RD3up(R0n!3+-1ZlnP@fu1goAr`0a zUb1F#Fkm=vVOmgB{rCN=Ba;k2J?r6o=>Dm>`T|#zr@)z}1W}gd3LQ-foK1cLUz!pG xSQaZ}upCt6Sfvoba!`$<%rQV^fAqV@dULG!K0j4T;sqMc;OXk;vd$@?2>?b}aGd}E literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/control/toolbutton.png b/app/src/gambas3/img/control/toolbutton.png new file mode 100644 index 0000000000000000000000000000000000000000..0e3d968014bd882fda731e92dfee0fdf84f0e44f GIT binary patch literal 631 zcmV--0*L*IP)Px$8cFMR=<@fjZ=jZ43_4VuP>+J08^YioW?(XvP@-l_H@bK{9>hR+1@-&9M+T`jh zfx1gww?hP+9V!Ze1wZKuu5+2Ve%(KCg-IEcMBh`pi2 z+kmptf3eb*z}sS=$vlg{iMQ0;O_ami~5&e zQ<%ketj}$y&Qh1fIf=bspU7dL$*#!Rey`8K)#I1F)>)dxXrjrKyVNa$x|_e&t;pHg z-r=#y+2`o!Lyo_hz16G5)`PLmFoU{1ioKt}){M2!RhPqAnZ#C@#4dumvdh~;T)v_J z0004WQchC+{}G;inH zOc)Zt7+b;o#PTWz*}^0?86!YSIf8YwxQ)JgKd>bw0b1(;EX|r>q>XD$KpY>?zx#53ybtNG8x7Gx RO>F=G002ovPDHLkV1iu(Q|!lvI6;x#X;^) z4C~IxyaaO22l#}z`eYVrHSE*`BbA12IxQe}Lqh|M+@%4Q(r5rOc0kygtvi6SK(evl&t#11kjmF)YjUYq*|Njqh@V|fmSf~Dz1bWS}B*-tAVa?xFGP0ju zeXiTT{a8Y)&sWLkX_a$NH&5}p#=-dEquM09H|O7;-EwL2nU~x8^M4k)`DXHE-DUdr z;|Tx0LxS$*PqrScr( z6!Xp;opx_?*sQ6Nzav}J;udjEUodm~^ci`McRKzobP!u=8=7nTaow$XN=)y+e{J0C zKc}+DH7Im{Qv76<{6k)`+t$srQ1!?tkLLXmsn~6zx?)1*^7bGL{v{d+{%*M(>MBor-9bo%+e*xe$dT5!gB_FFG0UO}y(roN|-Bm8SFa@~B)V^ec$e!qmY soUi+wpVwDDpVY(L|4y%4-~Owt|G{XV`Yjy%Kuzng9R* literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/control/treeview.png b/app/src/gambas3/img/control/treeview.png new file mode 100644 index 0000000000000000000000000000000000000000..36f38d6cdc9448fb7ea8b729e174ca45735c82b6 GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBh0X`wF|Ns9#aNs~gL&Jjy4<2W7{Q-*GdAc};NL)^iU}fdub4QX5o6!fO7PbaSA3i=Nft8#ucy@@y82;sHVdZ96K3P@&_U0)) QK$93eUHx3vIVCg!0BMIaKL7v# literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/control/udpsocket.png b/app/src/gambas3/img/control/udpsocket.png new file mode 100644 index 0000000000000000000000000000000000000000..95a645cec130650a42c1657213d9f40ba6ae8c45 GIT binary patch literal 640 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaMS2l#}z`eYV5I5^nZ*#Su)XlQ5vlJ@rYj$i;}J2^Q4Ngxj*4kUp9!iA6! zk&hog{{R2q&CLy{cj3Z?FJHc_udnav>3RM7wY$6f?%lg*%$RZg`t_|_x3;#nE?c&2 z?b@|oUS5@zmGSZM9v&V$ckVoT^yt2Q`?9jKPMtdS`SWKN7nc_=Ud*07`}yUFXlA|M20%FJHbKJ9cc{x^*{i-hB4#*{W5mmMmEk z85y~E@7}JiuB%tCR#jCkUApw-$&=^KojZU2{GZJiI)UC7FA4GsW=PgN!@9QztraD5TlS!Zjr9`U%%CaM&AyO*7!5Ot4l}Q^;L&R$I<|ImCX^$`Zxlva?@ei7T_Ng`C=d&@n+>euLnOC(L3@TEChZ?DjoWui=uq{P1ZZud`^Q?w8%w z8{*lw{|u}DviJ4sgNodxEH28dR}?C~?R|0R?Xj7Pdh-q%E--J?NI7tN?)$m(Wj6Nw zu3oNkq&>}|>Oa%>&tLyt`|kHK%rVOBU^YWHU>{u KKbLh*2~7Zm4Jt?g literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/control/unknown.png b/app/src/gambas3/img/control/unknown.png new file mode 100644 index 0000000000000000000000000000000000000000..968b3eac40b831d90c8945b42aeda9ca90c7b296 GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?smO1^9%x{{R2Kp`jt^%;l*-5m8SU#}JO|$v^m6czAhudYbzgEO{CHY{bO{ T{HA#U6)NS%G}U;vjb? zhIQv;UIID%0X`wFKADC885lsQp#ez#iD9_~lwvLk@(X6DbMz8?xB$qt_jGX#(Kw%M z;Kt0u#-q_NGlx-)k&VrbRfW;bosCV9F-2F2Nx=}r>tJeGsMMFS&48Px#t58f-MNDaN)YseF-r~~L+1=pe;N$1k+1=dS+|A9+ zg@%dZ<>}$%=-l7q-r?od*xc9J-q_pU*xcaR+~C^X;nUXI(9+h?)Y!+$&F=B_qok$P z)z$6r^xxv<=Fw+8^2*H6+T7sG&eGi6+|JO{)79D4*W1|I-t6!5=j!h1?C|8~ z>f`3>*p^&Ck=x%g@iz)zQ<}+1uaJ)Y#P4+Sb_I^o2N)00008bW%=J z0RR90|NsAp8>_Ib0001-Nkl_X_n!OVg(S+EVDHwW`Nl*)or zA9`_c>_HC>_FX9A;Lw47f!Bua9QaLWBMa;nbmd@LgI2O296%QitOm4@1;G%yad3{H nxD2$4q4Iiv&g)S1{T=!Ox`Qt2{Moe|00000NkvXXu0mjfYs38E literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/control/vpanel.png b/app/src/gambas3/img/control/vpanel.png new file mode 100644 index 0000000000000000000000000000000000000000..13c559a2883c5c4009c8c62cfa200caeefa30348 GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIID%0X`wF{}~v3G7Ev^|Aq!2Dcz;M4k*Q3666Y& npuwT+e%GbP0l+XkK2wODI literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/control/vsplit.png b/app/src/gambas3/img/control/vsplit.png new file mode 100644 index 0000000000000000000000000000000000000000..a6b89b608ee582cb411af63f278100981664a7ca GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBn0X`wFKADC885lsQq2d4j{XmAm2N!doEOSYaUob)eJttA<7nKHb9fPNPx%98gSDMQ^9y`~CiOs^IYU{Qmy_`~3cTuHpax|A2si z?ezQP?)rJH;c}_p%ir_4)bE6}J*%;OzH!tl^Tp=9s|e{QduMr{DMb{rmj=a;f01&FquC z=gi>q-0Am;x8(i){^aiY%ir>FsNbr}>)`D8oWkhm@cEg*=luQtdadF9{{Q;?{)4mR znZf9iz2}6q6-_YXoajD;T ztKhoT@RYsgoWtm!#OjH*ErJCq{r*M*6`@@`tSAobE@FE)$f9`;(xK?x6|*x*YJzD+<;f@%HWw=JoLQ z`?=Ndl)mQ7-}HE_;M3&w?)3V6ui=op=GEo(*5>u|`22>n&DDr^)K&?)a|G>|?wbegFUg zwn;=mR5;6H;2;1PIN0$5IxAomm?mW7?k*+7E5L|N0Vkj9togRfHcB%v@K52yRM2I| zHhaM$H%Cq<21!9CJ1%qu24dWzGo%-buUWTxz4O|Y3~UCd3OKbbT_pOan=Wx(#kQH% z!p+dKj}ut|BOe=|1Y@tD5d(w0%ckYlRuU5?3acV15D+nMXmrqH0D`3(RxEUw$vU~a zgBeKyFI#!7f*?qqVd|WDbIpw>={t+*ASrMXsnlWu%h$C7xn?FkES(}kND6FhE6Tv~ z4E|8>vFNr+At^{zsi}e}FoY^-Y2)ERQlObp%@Q6Aa)bh_g*XdPM59?!6G=gsQj$1( zWPl$7gS@bhq6WwrO=`$i1gXWVv+G9)%Q7(d%9=(2Bd(r@0ojqf3^}?$hdBm7m;weSWiHGl7tLo6ljj!= u!J259VG%@0000tJY5_^IIbrrG%!A6<|z{8 fagw_s7{JBDkavgWK+~^YkYx;>u6{1-oD!M!lvI6;x#X;^) z4C~IxyaaMM1AIbUeKHFV95~R>(9nJ$F%G1nB*-tA!Qt7BG$2RW)5S4_<9c$$Rwt7w w3mcsq1hpBbxi(x7P`KX6s?pfXaFU7P?lCUc_bn37fXW#>UHx3vIVCg!0Gt3Uh5!Hn literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/draw/invert.png b/app/src/gambas3/img/draw/invert.png new file mode 100644 index 0000000000000000000000000000000000000000..cc38148eb01a6a5aa18778bdc017923f817ce341 GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaN10(?STeKHFVfI&k;Lu-IX7f_t3B*-tAq4AAQT_2EV<>}%W!f`!0fr0V& z|Ns9DBn%8rG<3))9NfX?v7wPeQ(z*iibOagr1mWNsjiEK&-*cuoZe!Uk< UaR1{s4`>R5r>mdKI;Vst03!S~vj6}9 literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/draw/join-bevel.png b/app/src/gambas3/img/draw/join-bevel.png new file mode 100644 index 0000000000000000000000000000000000000000..7659a944bd8d23552d953b643d47553991e9d458 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF;1lBNlUdl*)Kphj*8l@Rc71(4kf(BHl@(AKM@f)hFoU`Ki|;=?Uv^x) z8weD$^mK6y;kcfhaDZusjg^&^15YX=8ynw*21VwUg*ptAn2neuFR>oTl0HzRz_yxU j%E5yU6BrHUxEUBusBo&C&{2>88p7b|>gTe~DWM4f&4E0H literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/draw/join-miter.png b/app/src/gambas3/img/draw/join-miter.png new file mode 100644 index 0000000000000000000000000000000000000000..b6a60bbc72b5d7a6c40a6eaecce810bc99b44ea3 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;OS+@4BLl<6e(pbstUx|vage(c z!@6@aFM%Ak0G|+7pUlFBhK9943%`M+OM?7@862M7NCR?YJzX3_IIbrrFfjkN=i$;( mSn{vkv6Yc~Q{#$c28NRB%=bH!BR>HZGI+ZBxvXEak7ak;n8o$r8x0JHCVTh9Og zGbc20xYvB@+p?|E*-$T3ewKRSMQ-CWEKg27Ef(HUqs+Q1E!lvI6;x#X;^) z4C~IxyaaN10(?STeKHIGGcZ7qVxz<~pg40$kY6yvt3apjeYb#IHBT4E5RU7~KMwyt zIPW0?GqZ7v12emYaD&hr@dTER?sY8d#8X5VgcEpq)jIcz0d+8Vy85}Sb4q9e09GC= AQUCw| literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/draw/offset.png b/app/src/gambas3/img/draw/offset.png new file mode 100644 index 0000000000000000000000000000000000000000..012a7a275d752b044b1f739230209fe48dfb9222 GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaMM1AIbUeKHFV95~R>(9nJ$F%G1nB*-tA!Qt7BG$2RS)5S4_<9c!e1LMUD y7X;WC+1SK1HfD)V$VfQk-Z1q*X#+09>y+$Qxb?NIYE_WfeXU^U?vDZi z40pp0ywWz|Da>vaIDJQ1ul`}mYR$ULN#}#-vY+|O>Ypt9wzb`=7id0%r>mdKI;Vst E0P6=#Hvj+t literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/draw/scroll.png b/app/src/gambas3/img/draw/scroll.png new file mode 100644 index 0000000000000000000000000000000000000000..048a1d994fdb9d5ebc9543aa260f1cfef7de557e GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFNNac9lEAv#W%GSrLD$K z6Rb6T@5X*}d0A+xQQqki*_2}TZ5p$Wj^R(1zO1sJ-|yF`GV_XL;!Fy6 ajvr^-*~7lH*SQH~JcFmJpUXO@geCwDqa_gl literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/draw/text.png b/app/src/gambas3/img/draw/text.png new file mode 100644 index 0000000000000000000000000000000000000000..616a7cf2356a5b73a4b20ff818ee480a7dcc0df8 GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaN10(?STeKHFh8X6iK8-e7O?Ce6IICDvmUobXLqU|=L)z`!M!aKNv?o!lvI6;x#X;^) z4C~IxyaaMM1AIbUeKHIGgTc8}(|VvFQ%R6tFas;wPs{B!lvI6;x#X;^) z4C~IxyaaMM1AIbUeKHIGgTc8}(|VvFQ%R6tFas;wPs{B> literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/family/expand.png b/app/src/gambas3/img/family/expand.png new file mode 100644 index 0000000000000000000000000000000000000000..8df8eb2f4c0cec34bceeaa12b286929cf9107d54 GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^93afZ3?z3ZhDiV^mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wF{}~v7$S1S#Na*V2Ktbk`Aiv-`JBFusX8i&Bku=Ya|sJYD@<);T3K0RXteAkqK; literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/family/horizontal-invert.png b/app/src/gambas3/img/family/horizontal-invert.png new file mode 100644 index 0000000000000000000000000000000000000000..84009eb8bd0fabefe1519f605053563c04d17f7e GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^{2OXN)%{>u6{Kl`wd^`njxgN@xNA3jHDn literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/family/hsplit.png b/app/src/gambas3/img/family/hsplit.png new file mode 100644 index 0000000000000000000000000000000000000000..ef106bf049b6133ef699d3db6c7f75894ba95ce2 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^{2!lvI6;x#X;^) z4C~IxyaaMM1AIbUeKHIGgTc8}(|VvFQ%R6tFas;wPs{BDQV12C+nGaOT;OXk;vd$@?2>?pxDRlq< literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/family/row.png b/app/src/gambas3/img/family/row.png new file mode 100644 index 0000000000000000000000000000000000000000..f1eda66b078807e972214d0f2d8eb54c9f9a7990 GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^{2!lvI6;x#X;^) z4C~IxyaaMM1AIbUeKHIGgTc8}(|VvFQ%R6tFas;wPs{Bgy85}Sb4q9e030A8rT_o{ literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/family/vertical.png b/app/src/gambas3/img/family/vertical.png new file mode 100644 index 0000000000000000000000000000000000000000..abfbb00bb582b431648251abd3bd0529b79f6dd5 GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^{2#ab=44$rjF6*2UngFJXCkp@o literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/logo/archlinux.png b/app/src/gambas3/img/logo/archlinux.png new file mode 100644 index 0000000000000000000000000000000000000000..a104a9ad63ca7a9eb6d2e665c582b2b77f455a92 GIT binary patch literal 2137 zcmb_ciC9TB}wdCf{G9%dvX&3D2w8T_Q_faZvuVqFL?P)zB_Z~oB7V1Gxuf^LISi9h6or8 zriBm0hJvS$^1lHNBI9n#d+_)s)_0#T493dV_!_+)j8)Et2Kd36UKmfqU~m{AI2;#z zB4Kkb7c?|YV4Sb)7*IG!fKa%G>1+^{ZFRUBd23V3el7=0p$kC*XLBA8N#SnE;jQ9) zfFN@@0MVfjD$~}Im62<(+Bc*Oxs-`KD5iGf1HRN3-ajyVP>{%(< zQv>tQksK{y`Vmmxy*130%sB zRtzDS!jy@CfKFv%r*esNso1$pj42l@Y5#rFHRF^v>EsOf*GX5sQ(6Nwv?~^^i3V1I zd>{)T;9Ug)GT;IL0y~QYuI1uyt01RRaU^R*pTaTB;~C}iObYm+&2m5!}7W#=CQ&Az?84W7=x(6bi+*diauGhc~r|b zDMB%)C^bkQXU@zo<`#J?DCL_PE*b5hg$-K=JoSppdgcCx7&a}zX^8p{dHylC9G805 z&$8I@qiOw{&hh!qABkSvxkWFo!YJp5${-0#u`&?1Fy>dTsGZ=i+@|*%S=A_(&S#Ti zX9bF+I%EZzGQ8y4Nj`8Dp;-C9{1oQ(^O@lD0K;Q_!-+jHM;>Z#(c5AP|NLCvuw@RV zfm_NiNak1e!JOx|-OGCuOKLwhjk88*5~8D8C*n3PF1ZyjNo~i++g)3=Hc1xap0`$| zRUI?>{a=^FFBqdABQhy<-gDdve$D=wr8~vLH1>ss^DdmM!%=_s@tc>%9(9(W978_r z-Z4Oabv1qC^7_KhwXB;~a2ry`p?dgv9Lac-7!Lx4(MkN57(4yEN@#yN)bn7wW71lh{2g zb&s*uiu;gFa7<#HvUo(M_M1ka9O$X_C5Ly1tz;lC*6drzO(#4%}G ze)f8@<2GF7&;}Jadi0h*w+kUpWkg??4JeVORMKMZxtWwey3zU;-;DEZyLF!2ft^w4 zMffB<4UP0v{e)_mAY4`7eFml8_UlWL?LA|NJo$-jVcU1ptc#7TQStA?Fr9n?Et%N! z>uhb7c>@Gv@~}^qPfq6JXtL37kv%z86Tc50pLx(Eh&2KnHeqvt7mo=;)S*DR0TZ9i5QfKvV4M7oT=@?II9|R0 literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/logo/autotools.png b/app/src/gambas3/img/logo/autotools.png new file mode 100644 index 0000000000000000000000000000000000000000..961f5df91bd2b3310b5fa3067c9516fc1a28cdc7 GIT binary patch literal 2115 zcmb7FXH-+!7QRU+A+!Jrgis<#2pDP3h%@R7FsOin0i=lV1j!(ZgQzG<@9iPvAqp0j zVJw6qMS2f}UIT_E(m_H13Dt*k?_ z{^!r1o0^&$8ylymr~CT)I2=xYfB)Yx|Cd==Spm<>%gewoEC2<2#$vH%XJ-MK>gwv+ z+S-nej`sHUo}QlW?(U(Xp^qOw4h{}hR#tj=coY;AfbG1zyg)cNHwPq?mzP&mR7_1x z&CJYzOkG{w?(QzYY-wpxP*CXY?FD=QF=b_CAOs)-*x}(}fZW;H+11qrkO2r-%jI%M zM@Ipr`T2RE3%~*ndiuIR5m5T!!v_EkHU%;PAHaWXYz%Oln3w?bi;Igtefl&xIXON) zUQ$w0T3XuL+FDpxn4g~yxYgI!18F2}Ey4i;k*KM0Py>j4|NgzcfnHTr6=0s1mp3vp z!e+C9d{tEyH8nLA73HF$B3-@1K<~SE?{afD;X{gw zid$P-o12?|^|zs+;o-xF2?+^FNl6hA5hMUf(!yXcC=@CrBm}fRDk=)}Jv1~FydmM? z;dDAZI5-%K#b#w?$*H)V14VcCv$eK^D0q8E5ebACN#_n)%K<5bgJE%D8#&bj@Zxb$ zOBlWY--h=LJcD?juIA}eG;Lo=SQI`26Rm3DZy@`Zt-P24*Ioh!j^az32j^ki!p!7? z6MJlE-f`4nALQ%Yc-;aiWX^~>iPEO6SjZVx`A3uS=MxoF?~k_PkDw49rXyH~;lNZ} z3fW|C?f5N!EWdW`nyBuZw{JmlT;dW>q`i2NO2;bT z@py$adTMHruHl-gxw)k!{|!pew32^XIJSYc9e0Ql$#@gl(vkI>?EBQtL4E%HfYL!~ zXLgEM$A3-<=S2M3Xc(SnY2&S*^T0ADru(t&!Hq>n^&YnI!kY!+9O)V_xqmfVS=Bcf96x>>X6}qQ zhlb9915z6p9K3)3eo0A5Y1N%)vGJ74!zCmZKE1P9<;c6!qLcG#g=c;tv`Ej6a08J$ zu(Gl1_h1@Ypf4#1GJ4G$@7}%s+EWBWz2tIMkRGN5wKJR|kuJI3atId)FZ|kJ)d3m~T18WB!d%GX->`*W zuN;*T|H*R9_|^T`t94fNoOY6NHqlqs;#UmD{KsKv;U40KE1_Me5@Gj2>Wsp$6yp^% zRwF)HtC{|k#PWlZTIT}NdHao%ivwBPCWggS!sTO&3oJ$@YS^xF_3$-W@pCs3FGd)p zD>z0bluP>tOWfWS!zNI}h@mBNh2652WD+4I?bUPMHyPGW$c^mqhqqF&epjh>Nne%K zac*G&L17vODaxpgR5_+FS>MK*A%Fc7bM)YK;!W$v( z_YOp25{2(iGvosdjQuHlGq*yJrBuF1dIk(uh@+fz#JHwLB4J=a@MbwmE-#5JtJ5{F^b?41 zYqs9wujo0VdujGXQIuD%xc|26mQSG_Ei*oy9A_O~K|A`m!IL^d(=~H9E!mM$@+$Jb zHxgLQ*P7jIlzrqY2l;Pv-McGpyHIjm?eiRdai9wF-J*7dE}ASeZzUS_D88+WaTFZC zld;vmCK@MPcY7&Qq*c|K{+;5FXl2*`Af7x4w@vYQ&y9TMW@nYVyAtCo1HboVjQV?A zF-#75_UO)HOE-_lJ~Mf-KIlnC2F(8YlC?UgFx4upM>b<(XpQgnrYqNY)w}}4&mnaU@ literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/logo/debian.png b/app/src/gambas3/img/logo/debian.png new file mode 100644 index 0000000000000000000000000000000000000000..425da2659bfebdbf44fc0c3193b849bc92252284 GIT binary patch literal 2277 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 literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/logo/folder.png b/app/src/gambas3/img/logo/folder.png new file mode 100644 index 0000000000000000000000000000000000000000..2012b2a5011bfe4a6d92164a1f834fab1d0bbd6f GIT binary patch literal 2647 zcmY+Gc~n!^7RGNNklajyEt85eq}CF`BuIrKA%#i`3JL-O34tK<_rb6ztuS_0BFiWZ+pw_R--PSB?Aq8M`i&)Ce+d1 z*~UKbYUe$I=$_6X|NO6cXMW?@{>HX_D{y?3ZT2eNtiRZHAl+=?f#GVI?tG4+INxBI ztG8IBKX>0qQlYz2N?hjYt?-G9h5F(=gSkwj)pFgXV!ionqb0WfLaw2tk|3=j%x4)b zarEc1jAk=VE^+jlB8((Lg1Eq7rGzN0Cal%yNQH!nI@(&T&Zqu*K*i>ARC$88F$D!d0J#Yo?xT+9rbttwr z93u?I&U_&H^=L;6oQ5-so zMMVljP&^-WO&GSs7ggW|vc17VFYtjUlIxA;?#eKHKU8@Dy2uO6r-G$^V09?EkOr0o zfF%rcwmY&s5NwRXHSAr#K^uyg_N5NqZ8Z z!XK0429EK+<X^K9~q2l-qtiTuB z9IIX*d4M0FwEoz(^B%F(U+Kwhb*k;J0_ZEmL|;7b1l;^%) zinW#VjZyK?hL@A8>g$!TwvEZSs#!lgK6!CMFw&SPZ>XuEm98GcKR=d=LQ z^ijRuPSvBx^2u_+D!$j&Fa9I=Mz>Ay*cQ9{gWRbwmLq*wOrEg{mBC^XK*+2E-mr*&k7&ilvH3(d;xnb`?%QU zut$QA(TN{NNx-T`Yc*P<9gpKEr-5)TVKbFnKQ4-n@kFkBg5b08=pIQj13KzwW9*T zG#p!pKp3uBFZfRTgW8BOabx^rxPEx}MswWgXuv-k`FIII@_v7 zI;SccJ||;6eJwVsI7OLL@#s=(;?N&WX^}Dk$Cht=6Pm0bGt-NQIhpC3C6OUdEnHv{ zZ^pIK{Ea!=t=sMD=vG?Z*8FmQZ85?O9Tlmod{_~lE*|nBfUFoJ*_ylJ1RoN7-hMpa zFo9!@Fla3^>6|V6uyaC7^t2YOBZ=9(^-SI?&uHhqdP+))oLs((U2y-g^38e%gTdvB zxgmFC#R;0Nrmd#t=5Z5sp=P>x(ua)kZrN$cwXH*}0_Lz?cmnx4Jmfh&dr}5ZS9h9} zl^$1J#;C?t9!*&2xol3vlh%6@4{uz%HlW?#?|8{w=?)yFtDLT_D&6|Kdz;ZL%eq6d zj2Q3to8kLwm|wI6!R)%+6!@()Ks!Ks%7~drR#E)=$a5bp)raopRs25wx>Ib{B*Q>8 zH{M>k=_U-1DCpVFfnjPck7)N#b3&?6H##yiyOp9_J(UYm`j{mXR`qXd=KHTZfd=o^^JTTcYRP+37XL7x&MancvNo&y@Yr@M=+)5n3_f^$L=QlxGYVpDqPnQ?ui>}WVB3;E)55ncaem42V3O;{ONoVgcJSn z&!EEMI+XJx<6Kh5>Tzd`=Y8*;#?H=?^P0rOMOSVY5lQ-(wz;V-8{pq-a#{@ucXxL` zG+&*VDC2rL;J^>FoEA$%!wXyKE(^-YQeyfFq{M$$6%rXt4<>1zsMBYhn|Seia&ofu ziiZJ7K&bqfg~?WE`so)1E3`+Fo%{;80ygz)0eIG{Wr*jGkNv!QXS=8<$X6$jR){V)nWu&vIt;)Q#0dI1pG}BMGUsOQ|s76neiD8T`&={VLMJGGkiSepYgO2Ik!j5q5i>eV;t{@CE9j; + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Gambas 3 + 15/09/2008 + + + Fabien Bodard + + + + + Common Creative + + + + + Fabien Bodard + + + gbFBodard150908 + http://gambas.sf.net + + + gambas3 logo basic shrimp + + + A pretty shrimp, a malicious new gambas logo... we got the power ! + + + Fabien Bodard + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/gambas3/img/logo/head-16.png b/app/src/gambas3/img/logo/head-16.png new file mode 100644 index 0000000000000000000000000000000000000000..70070de27a5476e43aa5d4ff034bd9d0a11debfd GIT binary patch literal 514 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%0DtE)=`w-VkQiM+qU+4#W@ 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 literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/logo/head-32.png b/app/src/gambas3/img/logo/head-32.png new file mode 100644 index 0000000000000000000000000000000000000000..436f4422b8d93e3ab70e94223aae4c36ad7a196f GIT binary patch literal 946 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyacjS1AIbUeKHF*8+K_lY;n2v@sd2bcjN!MYlDs7%@h6x2W{Luk=z+^GfDqT9Yjs}X4FPL0MLT1`8&8+NNS zY*X*t2-XM^2QnB|tx{>*2DA>zC?IkXAjpL~G+RLy0Ye5T0y3cYHyAzw{p}lquc4_|lxlnBc&}n(a>?Jj*+wY5$JI8pYPw?DMhJuMwDvRokB=)E2G4wH*8v2?=FKw$n;CduEM$eXM zj?=Zkz;$6u+T0GDJF6SRkNw``!|L!{?4_} wclFCo&wg;d`mt6?^&!RT>gkWquYY3xx@+5qluBtuV6-!My85}Sb4q9e0O#Jd3;+NC literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/logo/logo-ide.png b/app/src/gambas3/img/logo/logo-ide.png new file mode 100644 index 0000000000000000000000000000000000000000..420a1c77bc3700382f2e2b1e56f2a2c5cd7c7aef GIT binary patch literal 6834 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%0A$04Kd+QVy$i8=pj3(8eu?#$2BIH$xDwicnW zWlo7zU(p!~L`n!VOJUb(wR7GTlKT+cbBHgMv{`LD@em)e8!e7<4mJ2>uoCZ-RDnhb zvHlWTq0772Y%1|4c)`R05Xd<5S5m{& z*l+|V-)f0kobLog($YF5{ySBptEGm(h_9xmrr1v9@3Xn!*&8^PtbZ1BmgzHi zmVR^tmwngLJY*a}v_oK*+Vi59zu9*l(Uc&o0hLOZ_#A~@k2vYa_oQ%lKKCe&m;L=%!9 zp28qiwEJyf|Z7K^O}!d($rr>g?WfZta!G8GtoDiwUi9j97vD4mU8@ z4Hx2$SfguyxV7FMTLdLuu!wFbKE%MaRsWvK{?b$!j;?x@?4&IE$ox>qzpIUCAH=w4 zXv|g`?>-4mF|D`}H`nbq8S^MB4r$T;Nl`VKu)k*odWX9mR^oDa8I!Ft>%QxyQ(;x! zfU?_8e>JH;-|*A}IxzaN5%<2q^JDWcecQhwsz(QvnxJb)+TL__#97;>@mQGS>5$s>OdY|}~ z;!9E~ci?~y-*Kx>lhn06(jh5;Zb1bfVBYO^&}hvo!=kah-q_=*k@V_2NBwgLyTqlel`%EccNxx9llR9FR*-2a4N@WWzmF zS~#Kk!k{r`EIJpyx|gPoB)&TsZLjG4YLWTJ6D|^@QIiLb-^n{+j(?bUmFfHMsn0R2 zCX3GVH}+Veld^N1 zTtUbAoPVoJ&9()gSp%^ez}2eWAGCW6V4nt26~_DTMv=?eJFrcMpOM6#JP96OuIm(| zjd5-L;yF%HJhSzrn}8F0Q~zf(H~xT%;$0ileb^(iq<0ia4&J}&kWa<-~b3upe^gNi25b*8O^kY z+-U7-&7T;9QNhO{=Bup@bbHvEo4)DQKdX;frUcLAo(Ww0@leKwxm3xv@*Lry(JBcf z+7YYTxP^KRBYsoe(P>A`jn6(_>s9CC!Kis&dUu!v)x1&BT9OtjA1-RJQ^Zv;hc;FW z3!d+Z{dklNNDp+&i3h1FB#Cg%RLz|nAMr6Tdfc-6cBy7v+E9geQ#gl4A1W-v{~c+| zy)V$lYYVr`XJKf&5?YgUg%%w#OZ#mlD_g=6?hDE;Ol>-DqBHg;H}$fJ!DN}jYwbd` zDgCoU2g9HE2vZb!ESb3$M7?t2u<)Fv{fDvlIupt#m5$JIKxDr5a@ZH)44OUXmJf9Y z>*lo!j_E|ckj64^<qPiAE<5`2tGKtw9{dJ38Kl1 z@_9Z+ANXU*RPF@B6JeJ5y~wET5VVX*OPA*|byH7Vjm}{LcO69G?lFw8^#W z)t@MznBIVPuXd#&Ws=0dX=kh(t$yU8_x*szl-{6}_;4~2!NJ#wbzXn-#!R$AT1)!& zZm&x|&S*-oV+MK3I#5Mj*WWT``(#nrotz}@x3!HQj2CLz-uECGJy4ZNWP?7H9#XWHQ<7n-YFjoBP=uc}*o-KINpN_X zTce_(r1A~t{oy_BCD|Bt!1_8rW#OVT{{WM3vl%`Cerm6v?_}9|Ts|~8X$ver-u%bT o#=^oZ{)|gh@`FOsmg5b8XtUE8q@O9c`&$R8DQPK|DVPQPA7goEE&u=k literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/logo/logo.png b/app/src/gambas3/img/logo/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..7fea6edf0adb4c1e4add58f463c930f996cd7b96 GIT binary patch literal 5164 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 literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/logo/mageia.png b/app/src/gambas3/img/logo/mageia.png new file mode 100644 index 0000000000000000000000000000000000000000..5baca978af76ea40acc1542fca398395e2236f19 GIT binary patch literal 1967 zcmW+$2UwF=7tVkXmWH9=Xifb^0z?uL!X8P;fItQiAOwU2M21$`A|kTNsQoMAs8|`L zlu8StfD5RCNQDCWR7FKr*abyW(8`QG^m*=g@45H6=bZO_&$(ZLNWj(A+OCB_Aap(4 zSw67RH$E&H=91f)Z(&i3WbhdX#EmoBYjSniBNKeMOvJUvJ7*9GG(zMhW_v})*|5Wy z$1f3WgcdeJSDyr%$ZyQ8y{L@+4!kH!2eBP5k}W++_f0gX@h$CrV7BK)nNdA$IpKEh z2i+v8ve8xP>m@4}3HZVcUKDyT(N?t2-siuQK=1|IEg%)*P^yPn(vv|0%RYZDnqGN9 zv=drDSO>AIPdrncxB|Mi4r(LZtB> zJY!tFD%|w%`@j$<(O7a*GIuYDZOaJ*k-@NZ@CA;x+ylTD zNI5o)LmX~!22@Qxw#ErQWk%&~h(KnGpS=eIhM-%?@0#B~ylh_n3T{GV$m@7>0eRHXHm(BwV(s$CycW{e-wrXp7c?Nyqo z=IXeJ*^WA+yvitJvR_K8XlQtsyV=vSCZEnBsbS$A$?|HpiBZwo)VFWeoS*)(7 zZ1;p`Gj-}u=F_h$Pl}3@l$U7Zr}`#G%9sE6&V7xv=_D{}FLp{Gv-8fx3_qAfOeWIXoZ;#=~-L%LbgO>AG3#ww-*q`>mrRJgIwMPvz%zNI5&JXyIJ-p4l^l%X0&_49N-W0l1|A zc9E*DtW8GE|7<~1XS)YQ_R@$f(Fh}Om1T+9hY~wmj9e72y09@(sXQoI6WfQEqb-6&@Dn!wDkFA zJq+=_2Ihn}n{9x9pvITgpTc6yHyb=>>6KpA)kkU@P`*%5^z$_pH}w2$f-{K8#arsq zOBc^QF+f-?F^l>Zcgo9iA0g@*mNHDwC%09X&7su(dSh=MLf3fKVm$E$@x&F3@!;5R z>S|5&stXo{$SFpYsfJ9k%_57HVp1FX6@AqcC(7ZJxt;y-TubGFhO~QurPj|e*R#IM zwbK!$BQZ@_Qd~T>zCJzyfBt;7pF}~Xe=;||qtJ{9$k+eh+xo3C4{F*>rDj;`p11W+ zTFa4T$Uz+Kh{WXo^BIh7!<8|b{=V5a6RnWln!IsZ`L3Ey{X_9v@9LtmI4QargoVhC zebbNfUn1oBNXeFhK?IVC$=K2x`EcJcH&h+6p*7}WeE7L@$I+PJ6x~?#uf>lu`Hv@Q z#@KNhv{sdN-b51adi&3z+iNCLO_TczWL>;841umw*k&2Ds-lN5Y2_xq{>-7c zJUt`VPg`)8PWP%Eyjr>GUR05~#pwNtoMQh;{Ojdqb!C;c$;Hz+#W!2s>W$hcM59S% zz_no`IsN->)x9FAj=@C}@%@AwN@oNTUtRJ;2NBkYrbJb1C8(4 zg#0+)&dRxzA60>^xs#*4q~9+#Xv+QUj=_*1yfn_pU}>fB>GOm#>Y_ab8{FX@b7*AX kc!+{a#!4F~Df=vw5EY!h9(ECG2mDwN9&7>Y8dH|_FCfuSYXATM literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/logo/mandriva.png b/app/src/gambas3/img/logo/mandriva.png new file mode 100644 index 0000000000000000000000000000000000000000..d85b3bdff92d269c41bfc51210b04503f5170c94 GIT binary patch literal 2048 zcmZ8h2~-nT7oHGE06_x$;=&T3HU+5|Ku0kw2_+hm31t(NdNim7At7N=q*h`A2uQ8) zt3}YV2x<{IY*tWycG*D|t$^S>FWJ*Vf~+_~@G@7?#^Z{FmLhx<-# z&2^d(1Zlf*T)n`PiT%`xz-N@pC&5ECki};~P)YKN1%EZLCPaAcbb$&xjV2(72zekr zY$PZQ39dmR-nvA-MhjtJyhtTl45LF>%ne-t-aB#@E8W8~po9qPL4XJwu_bPZsEvmw zKV_DKqGbU32;lFd%`hTr1tlcpArjKT6+HnlSEAqu-{F9Ur9&~_jT3kbBa-L5payJ< zsO4+15-o?(hcMa>yN3?)!=}+LtiRilHVh!{1s)hr*v<`V2lNn8Cr|ts%ZNt+5**44 z#yBIQF6;6X7pDW zZGzD{7_EiTG8nCfK^~J1EdPg>K$BLyPdy%hYBP)ip@0Xw8ep^$ua>|l0JOvWuyM2k z&)mgf?HFxD)P&7G1V-!Q2DM`Gl7Wdn#b9J%8$a{~5`r=3hmRl;%1``xk^v;-ft&Cd zXu=hCa{_un3F8k&1_8Jd_z~Qo9&TVaKU4woe905w5mB?dWB{<`i`qGX-B>1a5fdNR ziW}4n_AYVzJM#cs7(|G@M9gp)B7U?KU>+X??OQJWv-i;wlS&jw0i**kpcN3|K8%SB zH0;0y0ot~~*u|*Cr2{h7;L-u*tMFFwfDA?w9Q_nF6&w!(AI8v8 zFL!U~;|di+3PJtzLCu$H7KBCC1ZgPorb@+p&sQDRle5w9H)?#~^>hcwUE1u|t)A6M zv-dDop^jG763x|=RtDoyOjh_j$Z(gq$`*_^C3;EDrG2uKU`|NSR4-D^H_oFXO2fQt}v%Gceqs^W-Ifdrz zf(_?<%Hn5e;$!U4x^Mh;P5IJJ9c5SZ4f+C~FO*fBKklKwhu`VnRg`f+oyqeVeX}DX z_4JRXBZb>tw}fQI|Cty4m(}}@fzkOHi;*4Rv%l@;%JSKB|BzsfTCPkgfKSf_4tU=< zU^!Q!$0p4>NgXou79;*}kcwQ-5N?||OC6F`7B|35VgSXroJroP?pp<2rl)61-|yPC z-Y>I?e3|0HQNp`SCiQ%;XJtl5`P=K=v zcJvl!<=ngZ+)Y&Hs!a_!UF*2bbfHKwUalL-l3Sq^Gfrq&)* zp$9sitBxF1)>y?G85uFX8|0*IxjT|m>`SR8PIa4yr>m68gSjioz~k*(=77z6||G8S11P$>z(SGt+z~kh%$*6 zZ6b2cep#yFoGBX_Vf4pUZ8)i=b!k-IquzSJpGj0LS?~Ru0E#E}>%LCfRXd?rZ(+uk zuksUYWomA*VH$hxZzZQX>ZzJ*|03h~7myNfntgG^gX45^Pf8zj;f2gYaHxYRZ#gZN zJ&N{$!sDQsf(7!C+5?Qutg9XKKo5hfYR`!^#(cREP zHi~MiNTLIilpR33_%sgst6w{fWLtZ7?cNqc&l?=lmoc}$FEPv}*eY1Ir6~j-@~ON3 zp?Z~3>cq7^#e@qft}bTm^D%@?>kkF7v?-0A*Q{c-Qi|D$KND|0v#43w@M6RzE#+J; za-7JhGtSKFBtFhpD~?SQ{cuV4($Ij@d$Gx1M(dZ6r5@H<2Hk%OQpX0ibhe~_V~{{d z%@+`*LYdW85+SeeyU6?#1x!nm=lx;!a@`S9nCmur^UpKNJF6@cqGHddt|+{`k#ev$ zmj5a<0qIH$-ml4+SFqxAf(gXUEYc-{gMm(WolQ;bktEr%OsmeeEsPIalOo5M-UvIX zJ$1A&^GWG~?m%*|K(f)ze)!h#ca`CBrxxda+Ei`Z6aK4^t{HC%L4NsDWf$tC3h++_ Nxv||{3ta>;{|9yk{;dE2 literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/logo/package-gnu.png b/app/src/gambas3/img/logo/package-gnu.png new file mode 100644 index 0000000000000000000000000000000000000000..e74c9fd45b43d17982894d77c0e9136c320b676c GIT binary patch literal 3166 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 literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/logo/project.png b/app/src/gambas3/img/logo/project.png new file mode 100644 index 0000000000000000000000000000000000000000..3234b1c54601456ed8434a255650e9e83a8785ea GIT binary patch literal 1242 zcmV<01SR{4P)Px$=}=5mMgRZ*HJQZy{{A-_)8*>)`SADqNTSK-^Y~S%&FS>`Hk!mxr_1>J{ZFRLeZATB z`us(q$b!JyQmD+5$lvYu`Z=4$&*$-Buh2oC$I0aHeZJY+?DW6i?1jPGOr^@f-|eQ- zX+oW`Tk!Hx&VzAMn&*Oo=+TQNUA z%Ba)jiNoAzv(v@m?!@8lZMD?O`G3CIhQixNqRDBq)7R_s&F1jb>GFWT+WY;~ z-}CwVoz3Fl@Akmo?cDD5VXx7_;O%(3*O|=WnaklnpT1;`H>ey10b?@!H zz1$Cp<@?^p@=4KMz@h~j_zM8A04o3rfd3re+tH9{X-PC3ZZi!l3$OtvYAleL*z7RI zcTRbjfNC3@XST)Jes34-VFBtys58;6_ZOE#C@}!lS@8-%HwRZYgegW61KRvct=e07 zGJfHXa>LI6tj95_w;$%h*6+*kXp83F)UA&1(*Zu5fB($*v@-WdBh6W!R4y~%z&BR3te7YW7y2ou0JbfX?Q4;7K5RL}t-BzOnFtnww> zf5|ut3B~28l+#&F(gA1Ui4O*F)Y~M_ZnRc`dENkq`B5+x9Wn2UOsyRo(`hHC1z#Xj5N0ZxP7y| zF{oU|R!y#ZIIOw`rjV~T$^@K5qU&T7U6Ij^;V%NsYST$;_h0pQZ9LP~zUHCcE zF1@J3O>$B$<*LqWu&_j@aqc47Eb`e0>jZizArL!PeT5M~`$NmKDAvel))(E82TyUijJL zj{LhcX?KmkRC)CIZSgYUkNd>&;Xxk761SM07*qoM6N<$ Ef|BdQE&u=k literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/logo/redhat.png b/app/src/gambas3/img/logo/redhat.png new file mode 100644 index 0000000000000000000000000000000000000000..dabdf1dd38527b6339ff0d882eaad2ec37731e02 GIT binary patch literal 1373 zcmV-j1)}Px%rcg{&MNDaN>gww5?(W{+-s|h@0RaK%=;;6d{{R30 z!XO^g)6@R`{t5~Tz#tyMARfIR9pK>L+1c3|8XDZ(+?yI0+uPd?4h{hT0KB}s5d#AR z1O&Rey5ZsB0|NsB0s_|7)&~a%wzjtB=H}Ja)i?`E$v>qIm85g)79Cj2E zAt51FR#x)z^85Syq#GGiQ&Z>X=LH1?KtMp485oF&h@YRI&CSi!)YNlxbKl?Jq@<)9 z8yn2b%(5LEgccP!IXN;22o3@QLJJD~{QTF~*M^3MFfcGv4h_A%y{H@-Hwg)F5)!f= z9Jn4GAO!_n4-O0h0$vagbaZrX5)n=e4EOi<}2IJ%7(9qD) z(b2=h!xaMqRSpe!cz7Hf95e|Cv$L~8LPBv95>gHgx*r`L9v*WO5|WaVJv}|J9UFrd z6jW4HK@=1R1_nG14#2>`Ul0%M?Cf7(UmqVIQBhG55fLaTC|X)tof;UJn3!G=4p&!K zWe^Zz5DQP%F3}F99&#n z0ssIyIyy5mGfhoR3=9nL@bE@PMx&#nPEJm6sDbMM0004WQchCB~Wzn;x{`{Dg( z_X-j@)H{<}9m81v2Y6dK$yvd-_NQ?`h+tlK)}XWhD}v^_@LwI6XG$Oi&H_XfOwBuV zNh^q??aYW72-!m50(F+dnS--6ZlV(dR+Xc307t1YIhCw5b+FL|M8z_~jEVqes;Lt> zJ(%uBU!JSGMCME)<7#xCe0%cJ`9lW)WN{$5y&$Z-3GfA(XrW;#+}0Q~`Xsvh`1}-5Hp-{js9ri0_F7w5~Uvio<>_bm@u5b`QGQuNz_rB&6#*aDhTS6~{ zAzlm|cf3_%Tm}^t*3h4I4eZVZ_<7Ip)M^dNmg;J4jlU?M^d^+oF4kgP^1N7T;ny}S zpsP5KudFY@cvgbM{V*iqNg`nMQc_VF==t_!BeTUtl3G7sxj|a*_ED1uKD^xUl7H00000NkvXXu0mjf^cY10 literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/logo/self-extractible.png b/app/src/gambas3/img/logo/self-extractible.png new file mode 100644 index 0000000000000000000000000000000000000000..07e1d56e603c4700142d5cfb7e571f632e2794e8 GIT binary patch literal 2595 zcmbVOc{CLI7oRLIA!|yOM3E()m*UY=$R3h4TcIc0pd!YS%wU)?i!c~jvW~5>gt40; z``}rcXKO4IL&?}pmhqc+e&_uD`u+9pIrnq#_nvz{_nv#ce_WWgmC0FN30?pIaMsM! z(1vaG{!t!IHs%n(Yiz^it#7Fh0MwxQjy$;8?^D4xCI$ffu+%C5zzMLnurspoeStv3 z^5dM-(=qIX(16E(jSjP&I6q@H{!idZ35jrMdwW||^#>>{77l};(8%0q&*T&&Hp)IF z^g&}r01BN1MCxJs0l0h_Qn>v?aOa#MB~yLDw2m>h9^ z9Br~t?LQKyIRw7R9)svDQ4Dq{!{ru3>__5mWxsZ>NN|aPM0a>gen5KGrTP*wfCV8Y znX$mROcQofdwct7Qbt9xS4omP4&gz_d0C$oG*AQWDtpsY3I34cO=(MQ$_p83Nb1AK zjW(icGl0}N>O^yLdr^36epofeuN3Jy^bs~aGd({)Pb`UAohEH>Z&N6gDPsEO*5>l^ zG6@$|hI-ms5JscXsxW@!kFeUzfP;gB_M(W{*_nx!w+sejtP%C&$J)l`#sIl*WrYrh z!}gi`larHVGI?ovskylsgTeInb?@%(eCq97TwIKciydh|uvjeG*M*6RiKU6gv9Ym~ zR5YQH(2I}#SXZ5#jQsxn+x!AG6N{-z@rm@Ynwp+!&U>|xq&!EiEGjA>kx2Okd9PoC zD3jxT_}IVOQlo)(IXPJx z9^{3OxIXcDv^VC)c+}PHFGXuz!1b}rhGQXF9R7-MQb1 z?(NYk6H_D9G^a}jad6iq# zmHi9XLTs#T0pD2L8XT-MOc^OYwF7C^k+HzTUv}ABBW^i)v!?X+_e*73n5@w~mZA`g zwduL9v6J^Z{Ft#muW%j5mHLYH6WrG_p-@Rv7XDP8U5RO=0}B>Q>)}WJouxtzJUUxq)#_v-%sq zMxV@vF}@rQzGFmow9v&7hwzO?y+v^m`ew%#j@!sYm=pWtKsqR!;2yA?-RnwwyH>{f z%IT+9<(KURr6rF}`oM5ITk(7IlyCqeUM z^o*OOH$Kh#SGgzd&ehE7cO31?2(`QF+Y|kqkstT9nt6;}q%JOeQq3>5-sj1gU%lmK ziK|K*$+;aHC7)JU%T=AWg_t zKIn}E3DWImX@bUR4d-awkPrzNHWj>GmHhjbkwJT=pgvhIOWyVM@z&?UrCv$g?cGzN z%Fx;Z5&38Q6f>i!(n)ln06qJg4rs?YoTf~_XexH$9?$r-hgXcri4r2bCgWd6@}3{B zeI8%xMO%gi7OIE-2Csd}X%oxKEhJL>-Yqo3Z#Namc$ zidXYLC!{5|_~*iqXm@#;hN4GJBhgV-!J5hY$x}d`OO3 zr-JA9NBy*Of^LvU2CBe^Y9&CISNm*sG%fct08#a9DrwL{rKv zhKce{Jk*u5x45Qnchgyvt7L$t{Unx}{rwt!);KUNYgga*yU9hQ&AEt|jWN$VTnqf#C#y-(_=JFu7>CWYf+AzWQ1QGuGUqN;h z59I+dc+s>{ZJP@HuhjyRVt^(<*Zje>Tg-HXco)~pKl}*VHzmrZDrq`j zB`i`*BkWoq9pIqj6pxY9)!ZDX94Tl?KQGtk1-*r#g*}i#wN#O1a%63w?!N*R&xAeRcOgh<&tNGaW&pV~`@f@?cvKU@mB#D8M% z^x)n-G@|sE>xvJ8WNz3UoHygosVQ4fV<43VXTsLj2|p#&eCnNb6Kpx$|DO8s3aBo$ z0g`wA@TKIIcsS->hiaZd4K~*&;OEm3#)WT{(jA&R$`$411Aut0_I8n`aw~^`@6}H7 zyKOB3^>>V9#T_Fy$L8IQf`fhMyeD=r>6(sq`~r`gC$&%p)s;K12&*o}P9%Dutq#g& zLzFZVsHfED%Yvo|D*6oP3$0Z$DcJqhvPm-~=DH?>%56@9?mh5fj>YetJqLk(32L<5 zH{>OitnaV;W5)xD(1O&bw3~<)6;W7RZIUcZwEI1dXPr{{H^EtOGY|BckPC$O( zfrScKb9K$12_Dp@+x<_=xagWKL)zw~eAU3Px&08mU+MNDaNoSvX)X>D(Dc9D{oe}RRTmzk}sva74J znwh19hKZ%6s-mT-hlz`Ca-M&DnqzdaX>ONYX`pm-m5h#%eSdQQ){(XZnjNiuuWvGRcy9UXtPUWu2O2WBq1+N zWw1+QuS{dERc*CWYqd*btyXTgS#Y*iZnjZrvrlKTRBNp3FHmMmIidS8A_PXs(o_*NBq5LQa1|PlqTaI7V2Q zOkt)jF;I}6(=#_-K23--I$|(1Q%FZqL_$tRRgX+!t5RsOY=FT@S(Q0NcX^A+S#h{Y zTbq@k%vo-;O<$dVlg~6eXD={Hf{nO5M|f0dtVc;`aD&81U7${3pe!mnG%-Myq|$nV zpGZ}Rc!8;qoW_8W%~DlrK|@)PoX$u^SW{D8F)&40XPs1Aers`*U}0rgTXZ`{ds$gw zTWO?DT$5mKp?8SEP-LZ!p3G5Zs$XM(M_7}2g|BFBh+$!CYH*HPYN>>h#&?FhP+N*} zd6qpqQeI$qeTb-li?LX2uw8JoUvjl>ccN!^r-+onNljijJzqCDR6j&yJw$9yO;%)W zre$-iMN4#Yf3HkaZZ4Ykx&QzGJ9JV`Qvgc-`;Omh0tO1w8zsU=G4^NE9joPd67rn7 zmEza@S+xFh^vBf@RsKT$hun;(SvTUX$$X;ZmHO?bWi>$1000YDNklwkl{9v2w@u>PNt~uhlj+^gfDTqSl2$CzO01-nrAn*>lDNcSNf;Z+U?8RzcEwR+ z1Ew}UY7iJ4u#JIYL%4hoPH=tScVatD+$3$^FYqLpI%)dtE<0%Eef$0IfA4!gi}gfI znZ59>MX!DSA>i}*i{{RpJ&pDMV8+|?uWm$0NlD2<@2;!!elvaQ_l%zQ%B(jxW8g`L6ia=e~I_B_+Jc=#PB_+tNj(4VgdwdRvH}Y{z28dINQ`reXkRXWF>Euqh zg){QOy#V`ZK8;zJs6^HS~ zVm<9`E%9CZJHq;vH6`mqHNoPBVzWPc;;)nIsNLU9EpUdisQ*tDvTMr*0?Hy(#Elt#>P^F zM!*+^YS;%#D%FTY?#AE$EJCCp0 zyb9f?gN$5m5^}i&F!a_WW!I{zDk`c@Hw^jhxn!F?FWT{fomM9o%7rG5$a<#krHQ?qdCq2&pzkO1lB4+rod*u=-u-@wU5^=*81xex zkD@}g2LSLRRHVry1PN*@vugO|ae~(@Hc1?WBk=g4`)dIYLV8SzU`WNG9qctXcJJQ3 zxy0_&%Hz2lHAk({SbM)5moQ_o#pZB0fS@QjI$0lDP!0H3GoL3*RT`A3I9trtJM+)h ztvztDP^8ty0)v#pQLEKib;FS?ybS^z4v2=UDB0M$U?1RgC@ez_p-fF(u>xnaHKCfb zeL=6*6|0rY<4r;{$E=}CyCAg3!=F z5Cxs7jg8epJV40hXb7h3z)@Jk!Yz?4fZ(E{BA$%rE zM<4u{bsDOm392}`D4NGZ1Ux05@dpQQj()oA-3ipAKg-XT_zAFgGwgsGJ`YRitv>oP z>p1j*Lxscx0eWOgOvZOs_6(Jr?Hssyet2ZVyMaKU9&o%#bJHKdrNIDZkebTI*$D~unhk*@MfP9;WkT}}=>USNPyhKt*6$F33fU1DT8t-jTal(v z)YtmM$WU-R;wO4-S#5oGwj#5yk`l@(F3JE>aB4qv(@bb4#K7~Aqz9I89w|t=b=c2@ z#W*+tgohb_-;sbqkv1C4rC=^_%u=(4WazHyW0xnhX7pMd5}0X{f|V=n5`F$9$U)N5 zq+7K?zn!LaI-0Tj3kOkrcIIF+MG-V1)o>UQnM-!;*zokvS<`+S*#-yJd~(1W$1ekd zr3iuHi-&!|p}j$0U+wKoh*t#q3v;2DxNu0|Xxef~a`WnSKZ4ot4ze^DX#SG}l^DP5 zrb4lF0`=>qe7zLz|^tt&2?(uc5)`E6?c3Yl9PxJRU}~kT9E(n~-GH>O+^u2lUh>e}jhdlwG-7 z$yXT@+_`qr38y@L*a@AO%aH9fCD%E%Fq8mbh_DB0P21w?%w3Zv4jGegY_ZvL5J5QX zaXOu0XE^Lc&;e*SMMKp=?}!LEoLJicR*lttYUiQLlOK=gB`sTk;8N%MuaJT641^(c z?;YA3K_NnGx`=7q_n*qk=QV9GjN?mUQqg)-TX)-KTTk7+NWr&E8RNalVgor0tUc&K z8Yq>~_9DHs3xt7m5uqdL{1KTTbb_*WL5C+%is-F_?O#|sdfM~G(b=tT-Pe%Y^W=Hu z;ro8RlHs`GMe6g>S?=SPljjrla!jY6HXq;1_Eehs#n|ps^EkczYE0Wd)#-FzU+Miw zZ&Sx|snvClL6XzcHgmObtrlLXg^6Aety)U1Cdrdbrc#@rbUK|{8{{Q}y#{&|(>7zV zXcUP6x(JB@jD->KgD);UODrW4fb6h`;HE2UnY^ShbJt0ed)PK%ouD4P2tgB!gA0TW zu+@Zr!jp>?7GZHQmnljr?fpG!*uEZUu_%I-LIJA0(>6M0E#Rh$vaT*yCE~!ZS=_-*hvwPStK)9Ljay& zU;{n@i?|$*uNUeKNug~wCb%h%`F60UuZwVuko7NM47Q430G>pz_|u9e=cSgxcqe5R z%G3Rx*)z!yA|gNJ7odw!;rU9X64k23MpNy2sL83x>86eI4+Tw+ih)o-gz6v`k+2~w z2zo(=@>ZF4JO7&dC`Z41k*)6Un(so8y+9i%q-zDazSD#9KKo$mAJNgyv3*0iIM2$1 z3}Np5%s{ReOO2+a8hw_#f1B_+?_!3AqV^gk(BWZ2YDz7|7&5N;TSxF|uWObbUK(Wu zR5mV$^sLJ}{a*q8&dejuch|wP9@gRVadR`1j{XCy0+Fz!+)6e80000Px&08mU+MNDaN7+FsjTThq0i5N~qle&X0VOg-$nJHga zpvriVxQchWICQx(j=o%tykK^^HjuwwpT=|~WLa>zEpoXq7f?kUUsHp-PJ+5bbhtBp zyh0IENO-zDe7QY;y+nApJbbxBZ@MapyiuXbcNSSqdbvAtxiVINdUlz!dHj6O?$jOfx1GGz+i>FPJp~d7FbOWRY-llK+^ZHin~^s#cF!JI(E7? zdbvP=xkh%mHhj555mHBZx;lBgJUwGxc)2=txiojXH+;E4gSt?Axjvc4ZFjjh7+Fnm zw=lTXnj>ITb-6TpxIJ^YGkLo^nZ<2#TT+9)NO-w8AYW7*T1|Pe zK!CeTeY`qzwJ&cqvyFz)oH*UEoZn-B4Q%P;Q zC~vtYZn-H6Q%G*PC2hGU2vkXJx+iV9DQvnYZ@4LLx+QJ8CU3bc3sXjKxhQVADsQ6i^fx>(RsJqmUp`|3{pna>AlzM#IxFs>Gj*f-=@6X zna$?1n$2a@>A?|MPM}tf?f?J)#B@?lQvkey0viKL0bUFS%HTII&?pX``|~ODQcm$} zZNrYDoN)a?34n*_3J<-A5g6}VR?}S+SYp%dt_3_A?bWG^#&}-YxD%%3%$G)i7UIXg zA7|*b`Kug*OWpWt6(aslXBzYyUcKXSdg;>JAbxh#G#aLH7Pv_|>khX>!%we2I(jFp zusclF{I&FrFTT4}&!5p^AiC{d_Q8adxa(}3k2OS0HKI8#+;CJ@0O z4gN4O2(eAG^Wv^H&&I4MK<@5KADW*K;9*2#wz2CCxHZ1kxd| zoDxp~dhU9J8A4!8)-&9N*jgtbu-z0CG{qwgD-JD*2 zhLlCl2$)E!uD;`nSwoV4T_g*7_!}~<&iN-_me(21b=^?4cl`Q;A>PfwcZ)GOXCIjg zB>_>**Uxr!UA?4dY#t7QU<+~yXEf-1nteZu z%f0oK5R>=EQcY(V{e^Z-vv-1h2RR5ezjhxErnq}zPjUHH!80_lP4;JjA*rayB*!BV zjuXYW5;-cu8Wo%buGyy?|ESR+l4ObQvUtbLl*(qcx3J=YKyU!liU`M*A2NalZAS1b7DK_La z1)$hqLQnOs$z}#{u%wPf1(0qu#@7_rh{T0@$`4nRG@_h7y}p`I5pn^6qH7RE zvUSD>U?XY3M;h@Ai8l6G6tNUF5i120Hc?2I4RJx|>#5QyVwtr$k(-WTg?sx=%W{A7 zOaXzlr;sK5Ej-Rs@Yz;akj*}EBgXV!rU;W&2wVhN24vBPa5PbZH)D|s-5nx#p}U|6 zKWk={EGQ_-s;dtl`TuV+#cW1TnkeoHp~3?k$*Lh3(E!nt_>o`5^(~hgf~WZ;K3LUj zRa_xg8Tfu%G1;D(beL|?s@o0&ytIhx`t6N-;FH=$tyZi46c+B&a)J7l=b!DB@CXY% z7Fx2k`?83oYwy6=4lv?JYy*b39fwpp6{jBD4L<4vhq-9m3#$ZowWjSuM>OK}Xik8h z4&(kFZBO~o5A`fu91xHq0pA5nDw9B&5)cpv$;u^_3fS53!BC8|2u=ujUA!_|#6&ZfHg(2eT0 zwuU{NKuZ$%O@j%ZkbW23{k`P7Wg`DOVa!;7ZGjk5wQqL|Xpe*Ik-)&}>TwNU`p~r> zA3XRfe>^Q4c!7s`fp5MpjT!F{;PIyVbzH>zd4W7fZtCgJ`_`bJgKu%dA+T8XCt@R07*qoM6N<$ Eg0)RnCjbBd literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/logo/ubuntu.png b/app/src/gambas3/img/logo/ubuntu.png new file mode 100644 index 0000000000000000000000000000000000000000..76f47512415df87b5037949a011d5e1a4873658e GIT binary patch literal 2113 zcmY*Z2~<*P6n=;y5|)V>x#Sj}F_Sdc(n1ka49yrSsT459YOK`KY;z&T+{UfZY$_$E z#jHpjb+k>eC{1fhvzp^*Vv7~Fo1qDB9y}mB=jXorfB$#C`~CMFUQT#ekP*fl0|0;# zHJCz&o_?wy8VSV{e`k(B5B)g*P=5fZE1W*bnFj3L7DAd-TL_0im=EW0R8>t~YNkdCQd2E7 zEDNS%VR86WC#x=pEUCLg{3a+-`+@Qnyov@NX$V?1ZBv+_p=m+2rrNo-79z9*Iz*$d z6NeI24x885hRv(u)KksGG-lKs^~5xHRM+bGFbHqeQ8Qs3{#{({TvrGsDh{-?{xw?| zQIo$P!3KV`p;FM*s@}Nv?r`nY*QBFO?Kou=KbTRMYs9rua3h%Zy|2!^PD}LR>Hx2O#`w^?0 zRD3p^92_tRQJU8xd)vQ_zO`AfsG0s*{Ln$4h&dof2JAIy9%gqTHJw5uw5B;_E zJ>28^`=aH>6`95@DJIi;mq|K@ADvva{u#r%pfEsCX<_HP{VQptEJVI`bCctG#@#mq z_{%h-)lo)s7VZg+ADP#kD>D1*S<5CK;i|Q(&#J`jrw@tJcHG)wYdcPTvf=Eu$M1^Zo)Cy%^2`KPuEm?@9fMPKxY1FOW9&1bp zF<9B%lDwv~s$S?$dUarVj?~_|4ItPx7!WFH@;smyi@k_ORvF4#`4=qEqj>znS*Tq& z&p~&m8icij>uB(eQ5KlJZc$H&gAFrltLP~UizNvhd~a6blOw@H$aC4Bt5FdOF1xnw z;qZCmbjz%Dt+WRqI4Sm9k?T@pc!tEpC* zx(I;h=VWg^`_9}EwVfQ=^}tlZXCOx=HZ>2T&=*#ehI9u9dUDR2c`CY`!C4}U$P~J5 zQiC_gO@O1e9+{cdu+@Ve@jQtAW|1@b)v#9^H(+rI?vCr}#?ZkDhc_p zT^qt8;bzHR3%k&2PJ5a(^EK;czEeeUx0jvA5+cp1dhh3gOwQ6S{q*CGp)<GB&ul zHr{0`AE%+Rb{H$>@tS)kj3_VbGqOjRSf|BjTp|KYcy1M4Wd$D&VknfE#G+U+d%CB{ zh($dn!5|ey^*G1Ga#tGaZ0xrE2 z{P2{vFJ4Q@$VB3G4Dpy1>K&QFuoO(3Mf~~EN4(io%709p8-7y3WGi-%-2ALEyliLR z__ESNbT}!VD&>EAjKzlX4<}XYS765UeBH*ST{JS^f=lG~Iar47t%cZ={jxle+A-9Az!m;+!U(n%Oer-r| z@);&EM7w9kg>1lF9Ei<~4{&rp0D52g+WY!yYA(UZ)+1c*kCIn4(rm|?EXec#qWyqF z!QzG-d;ZIWbK3>Wx&7wO#`+QGi1JegfJ#~&pUgpw|^PJHI6fJWmku+ z$%>anj>5HA-F_j8Q9h+al}!qr4v&bLx3C8d0f1fpTX138L?8621E_&v6d{?-`ybIm Bz(xQ7 literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/module/class.png b/app/src/gambas3/img/module/class.png new file mode 100644 index 0000000000000000000000000000000000000000..98a3a727aba54a500fea75f13817eedba5b67066 GIT binary patch literal 594 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAQ1D@Z zPl&5~floq0LVSFDXlQ7CeLavJ7Z(SV1Tr8X2@HUOKs7)SAOlDO*@=mXKr%Ns7s!RM z)6&u)S|DUrRu)7Vgc}S6Ba3KPA9_@5N!|#;`YMb-%?-NnH8x%ij0ffu{KTcv(5nEC8zB9#V+TUjjUdbgm7(F}6 zBES{l68mz(gxk806j*d;FE#B+TdHLC_Fd`hEW6Xk7TeoPh|90NJpbv2xDU~x3u5l( R`vX10;OXk;vd$@?2>?s??{NSC literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/module/form.png b/app/src/gambas3/img/module/form.png new file mode 100644 index 0000000000000000000000000000000000000000..cda077c348ae122a1d0efc7cde4c041618c09ce8 GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;I14-?iy0XBj({-ZRBb+Kpded- zPl&5~floq0!v9UKeLxY$k|4ie28U-i(tsRkPZ!4!j_b(@4a~p)|Ns9$jYmSFBEwf9 cr-2Rs&`{NqAirRS8Y>mSKieCgJkwwd<*>;4wk+vYxEpteb0C|fra>+9 z$s1iCrCqi&*~?DLA*Hi808b-J~;|aj9ju69dD$2gU~jD%&N1)-!mz`njxgN@xNACzg57 literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/module/report.png b/app/src/gambas3/img/module/report.png new file mode 100644 index 0000000000000000000000000000000000000000..2fcba342da2a0603d24fd8fe2b2e2e6b509b35bc GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~r@&x#V zxVjhkBqSun#l->1Z>a)nf#S?1L4LsuuL7OA_uT?=4Ln^OLnJOICmdk-^Z(!jW+7&! z#xoCqx*qs27~Rk}FxU|9kal3HK`F0Uu|Z82BZH-;(^<}_SucTl89ZJ6T-G@yGywpc Cfi9u| literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/module/termform.png b/app/src/gambas3/img/module/termform.png new file mode 100644 index 0000000000000000000000000000000000000000..9afe1ffef2b3c350997783829297cf8ac1177d8a GIT binary patch literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;I14-?iy0XBj({-ZRBb+Kpded- zPl&5~floq0!v9UKeLxY$k|4ie28U-i(tsQjPZ!4!j_b(@4a~p)|Nrm6!OX@c$M*UE z|N997pC2A6w)iOQr*Pz%`5}&+WeJK0!jxhd*clf8^!K)`KI;b5&*16m=d#Wzp$PyA C3o$YP literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/module/test.png b/app/src/gambas3/img/module/test.png new file mode 100644 index 0000000000000000000000000000000000000000..403edca541b665c5b30a3dc68b3ed789e80b3fb3 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5D99h+ z6XNP#;8R~;A0Ho|00tKyU1I`Dv6KY)1v4lFz(Kx?#;ziB_1{^Mr z*&eYmy1!s~`_?`+6FQy@ZF?(`S=$f~O znAgZUF`W_E)bzSQkw3I$!gVeuj|cr)n@`+nQ~sBk%z116>mufANtF=Y%;p(D3mH6J L{an^LB{Ts5Yy(W# literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/module/webform.png b/app/src/gambas3/img/module/webform.png new file mode 100644 index 0000000000000000000000000000000000000000..a9271f83f150fb764e80a818315817aafac6df5d GIT binary patch literal 673 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAQ1Ekr zPl&5~fsdl1qJn|~P(V&jP96+^Tw`NnAPM9_WPxl511O@Rq5_d}aBvV87l*Lb)z#r@ zfDA1yEuea7X=#Xol9G}@U9z&Wa07u1B_$<@7NAN98|VPIAwWThUZ4mN0NKjQ$`Ce0 zF zW0zf)SE_-U412Ws9l8hx3li-pirM@vO9O{ju_#Me!H@NdFZ%G5_!PhRo1@rQD-u7+JF4o3FpmDAK|u zu&p-WU6*6^m$1t%Od22JBtG^_&Q_~EmvW$I?gtCmeBZcVk4()}4_IZ+U1qng>RiQy zm?)uy`S(-mG!?V1^rnR}oy&V~lu$UyX`Oe&zncFd47-oEIfm$*ZuoXX^*Lk2-8+iO z=Zl|C_&1>^jOB%Nh`uA=O~-(RemoV~Ti!bEQ!}&>w>iBt?j}?4x+v>2HCLE4!skwF u)n9o!>dM<+`({Uf|G)2KYW=lIzgS#O1l@>zQxgvi0|rl5KbLh*2~7aX{>-HS literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/module/webpage.png b/app/src/gambas3/img/module/webpage.png new file mode 100644 index 0000000000000000000000000000000000000000..0646c6fc0d0e54b2920fe6cb7a0c6d0190030808 GIT binary patch literal 304 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP|z~K zC&bmgz$ZRFJ|Q6iLIN2;5E>c^Bx7S^fh15oDk>^5F%hC5E-ntFA|b&hI^{6X5TTMF zzhH)90qyBuiwn1V7>JJU7&2er;B5V#p$h+U-C65a5Pw(Y_PufKQY_T z*Su@iG5MJ_MbV+GEpktE3*PTGdC=frV8qa|{HS6R$C)E+4pA-(miJAa#m1R&(yYcl zY8K0Z2_J7(n=&5Sd?J#m}D3iwHJ0M?gBc6!PC{xWt~$(697WDZHE8= literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/search.png b/app/src/gambas3/img/search.png new file mode 100644 index 0000000000000000000000000000000000000000..f3aaa0a6fc97459cdd20fbd80b026073b9b9d6a6 GIT binary patch literal 2518 zcmWla2{;s56vyX@EJcaDr<$J3D2G+WlfeR%NWL*u`lr&+t{~;!Hh75 z8QFL0QAT5Dtj$=)&VA#4-~Ij1Ip4YWe&^oreg_FPddSNo&I5r!c=h#kjajOBJh@J= zm{l9H!V-2zEki8`q$=Um!3z$S|C_h*Lv2V!zr-R0asmQ(W39`R|#Vzom z7m!y#8w0d6j+xR88WuqW8Ay6>Om2bLFM!LQ(Y*-}MDTqB46cIoL2xg6dj}kkNHSpT zfV{j~E2~i3{DZMgfS(1yM37T4glq;mBOrAEcvbDYxWt&5!MwdwEG>h=nn3d}klY9O zoz|_gwj#+#B+>xBru|X!j-zALKcS_mWnc62>u|VM^Xxsvpv{GCP&Ys?FDF+F?s--3 zTUiBFRecE#&SV|xhS~MR?AbV_nVZ90U1LfszNou(nR?dL)pa^MBVApi&Ew};X(lHA zFHlSM_1&qdn2E%5zP@Rmo+;ts=zxHaAF@e_Z9pe>Gr0?tw@}Q@12iKUVTAqia?*zk z++$BtapUAOSVLJGEdsNs;xkR80z?57X(-e=vlZKXknrYdP93GNWf6%iO6vudmVp)) za1W2T>gv|AvZme*(DQxX!U7i8dYFXi_m29UMy9*@=dh~F$*HNY@4}3M1gKE$B={LC z{`xgC9={xl>i75m7-xJoEGz?#WyC|z!eA(BoLG$$JD7+Epl>N(a*y<611$jP6=d?j z!N6MpI>3k#BMGvNRZ2^%u(yx+^r?weELe`Mz&6|3hD1i@Wut3qYdewAg~`dE;^T{* zoREcug!cAt=^0fP7J=5*!ESDGtk>M!+@Vlry}Xixf->Iurq0c+6c;xxEv@zSjgE{= zPE63=dc-pr%&xBQLqpWE>i)gG1J?D1g=M$HMJruIz;euR1V6RJn4DtsHAyksMtG$o z(9tuKR&ec0&_%eJ+GefVVBYIOm8rL{muk3S0jA7djE2$P9Iq0*Vm zbhI6ciP}P?qfksH^XNFrQWTTrv*Ik11(vXIOcu6S%UEV8|8e{X#oVB@!IUSClkwC1 z6Kx4Qd&+1Ore@D{Z`BTg)-0?)9MEL+E)5{0dZiM^TuB~uiXCbHTRyFq{<#S|KYBQS zu-v;d4<#*==11w{P&AfAD(Xd}zpmhR>1gZ{bO{RG+)nVIZ_W}Kwh#yhUSC(s)S_ke zyQ8UzqZlUxqOB*3(5mYdloI#*N5k7_`4)*!ujU!Y_5%*c0>D^wVfctJoQiFZ9^ zbX+n)DDrBnSp(Vq)Mc#Vq;iXpy~MPB^YG2{2X^JA zW{tn4k$00M`0h&ZBudHk|2E&Uu<%76crUETVD!l zj{l2`Sm;oY56LQll04rTPX<bfwDw%5zczWejOf0m1Y z?BGerN3{Bl+doLEJ)@&>5{@*C6%d}&mpTKHk%e9|Lw+CcYN@l9|F;LyG8akE%EL(A zs?Gfqd%;?V+eu1uzR@l-shdWlZS0nwJ}E^!2;=ZPUeGI=RX?x0lwzV*+Ilwce+j8R6!1&Xw+B7F6WCzUEo7cFFLta)Q2sQoA{s zf@`^@cEO40j_E=*eyk`1e-VgJOKc%LIK!j#^ zukw@%`)94c2r!6wSN@YmpKCXi-B2v7x?*Sl=$W2$>T=rOGAeo#IYGG}xXx09Jbt@( zX8xrKn>Lxfpp`J|r@pp+F86)mgU2p3YwLoVkL<7db2Pl^lWBiLI*`JC;L zcgx)SRAEZPf?2vmFSTpR(#0yW?5%Q!Z0uKVukDC3jFMiX?%LIuT^TaFVKJ1WX@IyG z^#sMnMM^wtF_mXS4S6I=fn(o}q(fJ)Di!+Ae>fRl7v>kBF7;D~&A|JPQnx@pu}`7e zI^?rKOdjRCEwdLH!BJE&kexBA*7eN|<>KNXS9Fgq(zmoVH zz5KEKN=3X^7lZ?zF+*s;Re5nm9GQ0_<%+U%%z|KDEZx0Uj#wi6$RVI=ZXtv~*xV!# zL={xzZxbKn@pna-g)wHRG%S2Qu~9IN(2B=ydWTG=bJGEJCmeYuoHO*oi~XJOiHbPMI`g`_elM@Sk@&LOJONAl+OBAG zk>FV<8>aetYJQLx^ROyL)ohAVuAv*{Mza9VpSZan4Ttg=M0fBE_6M5c>r4LF2s#)A aqDM(<*PpMy2xRpii2i*e-3o2H(EkB#zH4^? literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/symbol/constant.png b/app/src/gambas3/img/symbol/constant.png new file mode 100644 index 0000000000000000000000000000000000000000..bb5acb10b1cb9ef34a13fc501fb2708e4fd3d0ef GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;I14-?iy0XBj({-ZRBb+Kpded- zPl&5~fzSW?de8McHGm?FB|(0{3=Yq3qyafXo-U3d9M_W*6l8DwSDddP%D^yl9p6#Q Srh835Sq4v6KbLh*2~7a+t{}ev literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/symbol/control.png b/app/src/gambas3/img/symbol/control.png new file mode 100644 index 0000000000000000000000000000000000000000..8edd4a45a98f8db53408a1c6129a46f055a0c8a4 GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;I14-?iy0XBj({-ZRBb+Kpded- zPl&5~fzSVQ)<+L4jsS`zopr09d9W8vpiM+d9gMCGFV9G_iZt4$ zpObNYW_)dqWpNOLXTwt-0UZY+4>ryS1i^Y1M$P{kAiM5=9S{K-5Cl;GWJ4GbsmYtPE&>e^DhcunX4th; z{-5I4=*ktppZlN9HR-%!8dzbSW9bCSERNyN2f>(@xLJo{>2G<&z)E&n&6 hCwH!p-?+cu+*w_2^EJs=i-B%p@O1TaS?83{1OOZ|h$sL6 literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/symbol/property-ro.png b/app/src/gambas3/img/symbol/property-ro.png new file mode 100644 index 0000000000000000000000000000000000000000..da24ca0ab113fcc126e9f1e723d9313574544e4d GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;I14-?iy0XBj({-ZRBb+Kpded- zPl&5~flvMZ|9v;U9RrFmmIV0)GdMiEkp|=ldAc};a9mGLP>{XxUva*ICzopr0Eqt~@&Et; literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/symbol/s-method.png b/app/src/gambas3/img/symbol/s-method.png new file mode 100644 index 0000000000000000000000000000000000000000..c8e1a90212416e6992648700630b79361458b4ff GIT binary patch literal 390 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP%tFG zC&bmgz(;<*JP^svmy=&0FTV)H1|o%d3P2Hs`3gV;6jz+12oj$MmIW%CFJJ$^UTKk1 z;fKPAn-K;Z4eI{Zgc?p^_lKV1}npc1A0H{a3j{Vb^c@UnO6P zqms7k0%do3x;TbdoIV?LTdYYzz~v)TSB6r@kN^KAPk$5;aJ9X<=k2)z_t+Nxck({g zwJ}R2cbZ(r{}CWI9PLGzYwFynNKsOIn)X={!)lDxOL)4)8S__vt zyHvY;#g6Oft=f@glG?Y`XJ)Z{!8_&RcRh)D?{&AE+@F2zrrh;8*MGFWt#7y9SELXx TWu3JH=nDo$Cpx0MW;nK3 bnlLex=<<3R9KLP|RK?)w>gTe~DWM4f)7By7 literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/symbol/s-property.png b/app/src/gambas3/img/symbol/s-property.png new file mode 100644 index 0000000000000000000000000000000000000000..21719558e1519d07d2cddb7d206e7c61712a9e82 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~q2Ka=y zx)=D!$Iq|d|9@3w(juTBV@Z%-FoVOh8)-m}tfz}(h{WaO1O@&LZA^{~jBZy}g?hg{ es&L5m2?Il@wyvgc{;>|ALIzJ)KbLh*2~7ZG5F}&( literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/symbol/s-special.png b/app/src/gambas3/img/symbol/s-special.png new file mode 100644 index 0000000000000000000000000000000000000000..3e9b2c37c6d2c9cbf6ee30b783eb77e5953e26b3 GIT binary patch literal 375 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP|z>H zC&bmgz-N9yzycuh_n+_Y4v$_#sBN;Z|3A|3J+f#5b(FY z{$oYOi{j#``_6>`O%^H%@(X5A*tK)Tzpv4XmA~bGJ$+L0rC25Y?sK5*Mo$;V5R21i zgKmp8DF{sI7I(S8!218cd-6$V2eF?apSM{bzBgmpPkkPq?n03nyvt1%t+l!k^zYR7 zxn38(s@kt+D*kAv68?BiX&SF%7_;NwvoDy_n)NgU10IyiZftH+`+e|_o4Ub<)5Xzj ze@oeBG`lkDaoc!J&=9aI+IisTl%A%G?q=c<^Jnc74~Y(GU$ZXKHstFSUi+VGTH}Ad v6Fz*$E;{e!`q^eT=AFo#^rZJ~eY>^h0tM}_HvSnv$1`}k`njxgN@xNAK}ecI literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/symbol/s-variable.png b/app/src/gambas3/img/symbol/s-variable.png new file mode 100644 index 0000000000000000000000000000000000000000..0f49a994739173a24cccc30c2615451020c5d6e8 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~q2Ka=y zx)=EDssA4%KVNLcpSM6k#*!evU-f*;o6b*}LU#`M=5T gGQ29kaeu$Lyp!c89_4pnO!-j?@64fefCmelF{r5}E)xI6)%- literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/symbol/unknown.png b/app/src/gambas3/img/symbol/unknown.png new file mode 100644 index 0000000000000000000000000000000000000000..52615e640cf505604005eb5ef4febd3dfb17d12c GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5D5x9Y z6XNP#;FFM$5E>c^B+)=@Y;1INbXrdExKx?p|j0U|QwBY5PxBMa~)jEV=F RLx83;c)I$ztaD0e0sy9{P51x+ literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/symbol/variable.png b/app/src/gambas3/img/symbol/variable.png new file mode 100644 index 0000000000000000000000000000000000000000..ba182912d97bfb669ef9d3b51ba78c1eb88335eb GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;I14-?iy0XBj({-ZRBb+Kpded- zPl&5~fzO`$|JP1)P6UcDmIV0)GdMiEkp|?5c)B=-a9mGLIKVyQ|9^XjY$kmM2F0D` Uq5?`Elz{RKp00i_>zopr08{!Q2mk;8 literal 0 HcmV?d00001 diff --git a/app/src/gambas3/img/waiting.gif b/app/src/gambas3/img/waiting.gif new file mode 100644 index 0000000000000000000000000000000000000000..3a27730caf882fb1b5d8503dd47d4012a2f53357 GIT binary patch literal 4931 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 literal 0 HcmV?d00001 diff --git a/app/src/gambas3/install/Makefile.am b/app/src/gambas3/install/Makefile.am new file mode 100644 index 00000000..322e1064 --- /dev/null +++ b/app/src/gambas3/install/Makefile.am @@ -0,0 +1,64 @@ +EXTRA_DIST = $(PACKAGE) + +all: + @(if test "$(COMPONENT_build)" = "1"; then \ + echo "Building $(COMPONENT_name) component..."; \ + else \ + echo "Compiling $(PACKAGE) project..."; \ + fi) + @(cd $(srcdir)/$(PACKAGE); \ + $(GAMBAS_path)/gbc$(VERSION) $(COMPILE_FLAGS); \ + $(GAMBAS_path)/gba$(VERSION)) + +install-exec-local: + @(cd $(srcdir)/$(PACKAGE); \ + if test "$(COMPONENT_build)" = "1"; then \ + echo "Installing $(PACKAGE).gambas in $(GBLIBRARY_path)"; \ + $(INSTALL) -d $(DESTDIR)/$(GBLIBRARY_path); \ + $(INSTALL) $(PACKAGE).gambas $(DESTDIR)/$(GBLIBRARY_path)/$(COMPONENT_name).gambas; \ + echo "Installing $(PACKAGE).component in $(GBLIBRARY_path)"; \ + $(INSTALL) -d $(DESTDIR)/$(GBLIBRARY_path); \ + $(INSTALL) .component $(DESTDIR)/$(GBLIBRARY_path)/$(COMPONENT_name).component; \ + chmod a-x $(DESTDIR)/$(GBLIBRARY_path)/$(COMPONENT_name).component; \ + echo "Installing $(PACKAGE).info in $(GBINFO_path)"; \ + $(INSTALL) -d $(DESTDIR)/$(GBINFO_path); \ + $(INSTALL) .info $(DESTDIR)/$(GBINFO_path)/$(COMPONENT_name).info; \ + chmod a-x $(DESTDIR)/$(GBINFO_path)/$(COMPONENT_name).info; \ + echo "Installing $(PACKAGE).list in $(GBINFO_path)"; \ + $(INSTALL) .list $(DESTDIR)/$(GBINFO_path)/$(COMPONENT_name).list; \ + chmod a-x $(DESTDIR)/$(GBINFO_path)/$(COMPONENT_name).list; \ + if test -d .hidden/control; then \ + echo "Installing controls in $(GBCONTROL_path)"; \ + $(INSTALL) -d $(DESTDIR)/$(GBCONTROL_path)/$(COMPONENT_name); \ + $(INSTALL) .hidden/control/*.png $(DESTDIR)/$(GBCONTROL_path)/$(COMPONENT_name); \ + chmod a-x $(DESTDIR)/$(GBCONTROL_path)/$(COMPONENT_name)/*.png; \ + fi \ + else \ + echo "Installing '$(PACKAGE)' executable in $(bindir)..."; \ + $(INSTALL) -d $(DESTDIR)$(bindir); \ + $(INSTALL) $(PACKAGE).gambas $(DESTDIR)$(bindir); \ + ln -sf $(PACKAGE).gambas $(DESTDIR)$(bindir)/$(PACKAGE); \ + if test "$(PACKAGE)" != $(PACKAGE_LCASE); then \ + echo "Creating lower case symbolic link..."; \ + ln -sf $(PACKAGE).gambas $(DESTDIR)$(bindir)/$(PACKAGE_LCASE); \ + fi \ + fi) + +uninstall-local: + @(if test "$(COMPONENT_build)" = "1"; then \ + echo "Removing $(COMPONENT_name) component..."; \ + rm -f $(DESTDIR)/$(GBLIBRARY_path)/$(COMPONENT_name).gambas; \ + rm -f $(DESTDIR)/$(GBLIBRARY_path)/$(COMPONENT_name).component; \ + rm -f $(DESTDIR)/$(GBINFO_path)/$(COMPONENT_name).info; \ + rm -f $(DESTDIR)/$(GBINFO_path)/$(COMPONENT_name).list; \ + rm -rf $(DESTDIR)/$(GBCONTROL_path)/$(COMPONENT_name); \ + else \ + echo "Removing executable..."; \ + rm -f $(DESTDIR)$(bindir)/$(PACKAGE).gambas; \ + rm -f $(DESTDIR)$(bindir)/$(PACKAGE); \ + rm -f $(DESTDIR)$(bindir)/$(PACKAGE_LCASE); \ + fi) + +dist-hook: + @(cd $(distdir)/$(PACKAGES); \ + rm -rf `find . -name ".gambas" -o -name ".lock" -o -name ".xvpics" -o -name "*~" -o -name "*.out" -o -name "*.pot" -o -name "*.gambas" -o -name "core.*" -o -name ".kdbg*" -o -name ".svn"`;) diff --git a/app/src/gambas3/install/acinclude.m4 b/app/src/gambas3/install/acinclude.m4 new file mode 100644 index 00000000..33e6fe26 --- /dev/null +++ b/app/src/gambas3/install/acinclude.m4 @@ -0,0 +1,161 @@ +####################################################################################### +## +## GB_FIND() macro is part of gambas$(VERSION) project +## by Benoit Minisini +## others are from me (Laurent Carlier) +## +####################################################################################### + +## --------------------------------------------------------------------------- +## GB_INIT_PROJECT +## Initialization and checking for gambas things +## +## $1 = gambas$(VERSION) project to build +## $2 = name of the project in lowercase +## $3 = component name +## --------------------------------------------------------------------------- + +AC_DEFUN([GB_INIT_PROJECT], +[ + if !(test -e $1/.project); then + AC_MSG_ERROR(Cannot find .project file for $1 !) + fi + + AM_INIT_AUTOMAKE + PACKAGE_LCASE=$2 + AC_SUBST(PACKAGE_LCASE) + + ## List of needed components + COMPONENTS=`cat $1/.project | grep "^Component=" | sed s/"Component="//g` + + ## Check if the project is a component + COMPONENT_build=`cat $1/.project | grep "^Type=Component" | sed s/"Type=Component"/1/g` + AC_SUBST(COMPONENT_build) + + if test "$COMPONENT_build" = "1"; then + COMPONENT_name=$3 + AC_SUBST(COMPONENT_name) + fi + + AC_MSG_CHECKING(for gambas$(VERSION) binaries) + GAMBAS_path=`gbx$(VERSION) -e system.path`/bin + if test "$?" != "0"; then + AC_MSG_RESULT(No) + AC_MSG_ERROR(Failed to find gambas$(VERSION) utilities, check your gambas$(VERSION) installation !) + else + AC_MSG_RESULT(Ok) + AC_SUBST(GAMBAS_path) + fi + + ## Find component components path + AC_MSG_CHECKING(for gambas$(VERSION) components path) + GBLIBRARY_path=`gbx$(VERSION) -e component.path` + if test "$?" != "0"; then + AC_MSG_RESULT(No) + AC_MSG_ERROR(Failed to find gambas$(VERSION) library path !) + else + AC_MSG_RESULT(Ok) + AC_SUBST(GBLIBRARY_path) + fi + + GBINFO_path=`echo $GBLIBRARY_path | sed s/"\/lib\/gambas$(VERSION)"/"\/share\/gambas$(VERSION)\/info"/` + AC_SUBST(GBINFO_path) + + GBCONTROL_path=`echo $GBLIBRARY_path | sed s/"\/lib\/gambas$(VERSION)"/"\/share\/gambas$(VERSION)\/control"/` + AC_SUBST(GBCONTROL_path) + + GBHOME_path=`gbx$(VERSION) -e user.home`/.local/lib/gambas$(VERSION) + + for comp in $COMPONENTS; do + if test "$comp" = "$1"; then continue; fi + AC_MSG_CHECKING(for $comp component) + GB_FIND(${comp}.component, $GBLIBRARY_path $GBHOME_path, ./) + if test "$gb_val" = "no"; then + AC_MSG_RESULT(No) + AC_MSG_ERROR(Failed to find $comp component !) + else + AC_MSG_RESULT(Ok) + fi + done + + $(EXTRA_TEST) +]) + +## --------------------------------------------------------------------------- +## GB_FIND +## Find files in directories +## +## $1 = Files to search +## $2 = Directories +## $3 = Sub-directories patterns +## +## Returns a path list in $gb_val +## --------------------------------------------------------------------------- + +AC_DEFUN([GB_FIND], +[ +dnl echo "Searching $1, $2, $3" +gb_val="" +gb_save=`pwd` +gb_file_list="$1" + +for gb_main_dir in $2; do + if test -d $gb_main_dir; then + cd $gb_main_dir + for gb_search_dir in $3; do + for gb_dir in $gb_search_dir/ $gb_search_dir/*/ $gb_search_dir/*/*/; do + + gb_new_file_list="" + gb_find_dir="" + + for gb_file in $gb_file_list; do + + gb_find=no + if test -r "$gb_main_dir/$gb_dir/$gb_file" || test -d "$gb_main_dir/$gb_dir/$gb_file"; then + + ifelse($4,[], + + gb_find=yes, + + for gb_test in $4; do + gb_output=`ls -la $gb_main_dir/$gb_dir/$gb_file | grep "$gb_test"` + if test "x$gb_output" != "x"; then + gb_find=yes + fi + done + ) + + fi + + if test "$gb_find" = "yes"; then + if test "x$gb_find_dir" = "x"; then + if test "x$gb_val" = "x"; then + gb_val="$gb_main_dir/$gb_dir" + else + gb_val="$gb_val $gb_main_dir/$gb_dir" + fi + fi + gb_find_dir=yes + else + gb_new_file_list="$gb_new_file_list $gb_file" + fi + + done + + gb_file_list=$gb_new_file_list + + if test "x$gb_file_list" = "x " || test "x$gb_file_list" = "x"; then + break 3 + fi + + done + done + fi +done + +if test "x$gb_file_list" != "x " && test "x$gb_file_list" != "x"; then + gb_val=no +fi + +cd $gb_save +]) diff --git a/app/src/gambas3/install/categories b/app/src/gambas3/install/categories new file mode 100644 index 00000000..eaf35476 --- /dev/null +++ b/app/src/gambas3/install/categories @@ -0,0 +1,136 @@ +AudioVideo +Audio +Video +Development +Education +Game +Graphics +Network +Office +Settings +System +Utility +Building +Debugger +IDE +GUIDesigner +Profiling +RevisionControl +Translation +Calendar +ContactManagement +Database +Dictionary +Chart +Email +Finance +FlowChart +PDA +ProjectManagement +Presentation +Spreadsheet +WordProcessor +2DGraphics +VectorGraphics +RasterGraphics +3DGraphics +Scanning +OCR +Photography +Publishing +Viewer +TextTools +DesktopSettings +HardwareSettings +Printing +PackageManager +Dialup +InstantMessaging +Chat +IRCClient +FileTransfer +HamRadio +News +P2P +RemoteAccess +Telephony +TelephonyTools +VideoConference +WebBrowser +WebDevelopment +Midi +Mixer +Sequencer +Tuner +TV +AudioVideoEditing +Player +Recorder +DiscBurning +ActionGame +AdventureGame +ArcadeGame +BoardGame +BlocksGame +CardGame +KidsGame +LogicGame +RolePlaying +Simulation +SportsGame +StrategyGame +Art +Construction +Music +Languages +Science +ArtificialIntelligence +Astronomy +Biology +Chemistry +ComputerScience +DataVisualization +Economy +Electricity +Geography +Geology +Geoscience +History +ImageProcessing +Literature +Math +NumericalAnalysis +MedicalSoftware +Physics +Robotics +Sports +ParallelComputing +Amusement +Archiving +Compression +Electronics +Emulator +Engineering +FileTools +FileManager +TerminalEmulator +Filesystem +Monitor +Security +Accessibility +Calculator +Clock +TextEditor +Documentation +Core +KDE +GNOME +GTK +Qt +Motif +Java +ConsoleOnly +Screensaver +TrayIcon +Applet +Shell \ No newline at end of file diff --git a/app/src/gambas3/install/group/archlinux b/app/src/gambas3/install/group/archlinux new file mode 100644 index 00000000..80f35715 --- /dev/null +++ b/app/src/gambas3/install/group/archlinux @@ -0,0 +1,51 @@ +admin +cli-mono +comm +database +devel +debug +doc +editors +electronics +embedded +fonts +games +gnome +graphics +gnu-r +gnustep +hamradio +haskell +httpd +interpreters +java +kde +kernel +libs +libdevel +lisp +localization +mail +math +misc +net +news +ocaml +oldlibs +otherosfs +perl +php +python +ruby +science +shells +sound +tex +text +utils +vcs +video +web +x11 +xfce +zope diff --git a/app/src/gambas3/install/group/autotools b/app/src/gambas3/install/group/autotools new file mode 100644 index 00000000..621e94f0 --- /dev/null +++ b/app/src/gambas3/install/group/autotools @@ -0,0 +1 @@ +none diff --git a/app/src/gambas3/install/group/debian b/app/src/gambas3/install/group/debian new file mode 100644 index 00000000..af419329 --- /dev/null +++ b/app/src/gambas3/install/group/debian @@ -0,0 +1,57 @@ +admin +cli-mono +comm +database +debug +devel +doc +editors +education +electronics +embedded +fonts +games +gnome +gnu-r +gnustep +golang +graphics +hamradio +haskell +httpd +interpreters +introspection +java +javascript +kde +kernel +libdevel +libs +lisp +localization +mail +math +metapackages +misc +net +news +ocaml +oldlibs +otherosfs +perl +php +python +ruby +rust +science +shells +sound +tex +text +utils +vcs +video +web +x11 +xfce +zope diff --git a/app/src/gambas3/install/group/fedora b/app/src/gambas3/install/group/fedora new file mode 100644 index 00000000..3b67a487 --- /dev/null +++ b/app/src/gambas3/install/group/fedora @@ -0,0 +1,34 @@ +Amusements + Games + Graphics +Applications + Archiving + Communications + Databases + Editors + Emulators + Engineering + File + Internet + Multimedia + Productivity + Publishing + System + Text +Development + Debuggers + Languages + Libraries + System + Tools +Documentation +System Environment + Base + Daemons + Kernel + Libraries + Shells +User Interface + Desktops + X + X Hardware Support diff --git a/app/src/gambas3/install/group/mageia b/app/src/gambas3/install/group/mageia new file mode 100644 index 00000000..ecec5f03 --- /dev/null +++ b/app/src/gambas3/install/group/mageia @@ -0,0 +1,132 @@ +Accessibility +Archiving + Backup + Cd burning + Compression + Other +Communications + Bluetooth + Dial-Up + Fax + Mobile + Radio + Serial + Telephony +Databases +Development + Basic + C + C++ + C# + Databases + Debug + Erlang + GNOME and GTK+ + Java + KDE and Qt + Kernel + OCaml + Other + Perl + PHP + Python + Ruby + Tools + X11 +Documentation +Editors +Education +Emulators +File tools +Games + Adventure + Arcade + Boards + Cards + Other + Puzzles + Shooter + Simulation + Sports + Strategy +Geography +Graphical desktop + Cinnamon + Enlightenment + GNOME + Icewm + KDE + MATE + Other + WindowMaker + Xfce +Graphics + 3D + Editors and Converters + Utilities + Photography + Scanning + Viewers +Monitoring +Networking + File transfer + IRC + Instant messaging + Mail + News + Other + Remote access + WWW +Office + Dictionary + Finance + Management + Organizer + Utilities + Spreadsheet + Suite + Word processor +Publishing +Sciences + Astronomy + Biology + Chemistry + Computer science + Geosciences + Mathematics + Other + Physics +Security +Shells +Sound + Editors and Converters + Midi + Mixers + Players + Utilities +System + Base + Boot and Init + Cluster + Configuration + Fonts + True type + Type1 + X11 bitmap + Internationalization + Kernel and hardware + Libraries + Networking + Packaging + Printing + Servers + X11 +Terminals +Text tools +Toys +Video + Editors and Converters + Players + Television + Utilities + \ No newline at end of file diff --git a/app/src/gambas3/install/group/mandriva b/app/src/gambas3/install/group/mandriva new file mode 100644 index 00000000..effd9b63 --- /dev/null +++ b/app/src/gambas3/install/group/mandriva @@ -0,0 +1,99 @@ +Accessibility +Archiving + Backup + Cd burning + Compression + Other +Books + Computer books + Faqs + Howtos + Literature + Other +Communications +Databases +Development + C + C++ + Databases + GNOME and GTK+ + Java + KDE and Qt + Kernel + Other + Perl + PHP + Python + X11 +Editors +Education +Emulators +File tools +Games + Adventure + Arcade + Boards + Cards + Other + Puzzles + Sports + Strategy +Graphical desktop + Enlightenment + FVWM based + GNOME + Icewm + KDE + Other + Sawfish + WindowMaker + Xfce +Graphics +Monitoring +Networking + Chat + File transfer + Instant messaging + IRC + Mail + News + Other + Remote access + WWW +Office +Publishing +Sciences + Astronomy + Biology + Chemistry + Computer science + Geosciences + Mathematics + Other + Physics +Shells +Sound +System + Base + Configuration + Boot and Init + Hardware + Networking + Other + Packaging + Printing + Fonts + Console + True type + Type1 + X11 bitmap + Internationalization + Kernel and hardware + Libraries + Servers + X11 +Terminals +Text tools +Toys +Video + \ No newline at end of file diff --git a/app/src/gambas3/install/group/self b/app/src/gambas3/install/group/self new file mode 100644 index 00000000..621e94f0 --- /dev/null +++ b/app/src/gambas3/install/group/self @@ -0,0 +1 @@ +none diff --git a/app/src/gambas3/install/group/slackware b/app/src/gambas3/install/group/slackware new file mode 100644 index 00000000..3b67a487 --- /dev/null +++ b/app/src/gambas3/install/group/slackware @@ -0,0 +1,34 @@ +Amusements + Games + Graphics +Applications + Archiving + Communications + Databases + Editors + Emulators + Engineering + File + Internet + Multimedia + Productivity + Publishing + System + Text +Development + Debuggers + Languages + Libraries + System + Tools +Documentation +System Environment + Base + Daemons + Kernel + Libraries + Shells +User Interface + Desktops + X + X Hardware Support diff --git a/app/src/gambas3/install/group/suse b/app/src/gambas3/install/group/suse new file mode 100644 index 00000000..231062f3 --- /dev/null +++ b/app/src/gambas3/install/group/suse @@ -0,0 +1,225 @@ +Amusements/Games/3D/Other +Amusements/Games/3D/Race +Amusements/Games/3D/Shoot +Amusements/Games/3D/Simulation +Amusements/Games/Action/Arcade +Amusements/Games/Action/Breakout +Amusements/Games/Action/Other +Amusements/Games/Action/Race +Amusements/Games/Action/Shoot +Amusements/Games/Board/Card +Amusements/Games/Board/Chess +Amusements/Games/Board/Other +Amusements/Games/Board/Pool +Amusements/Games/Board/Puzzle +Amusements/Games/Logic +Amusements/Games/Other +Amusements/Games/RPG +Amusements/Games/Strategy/Other +Amusements/Games/Strategy/Real Time +Amusements/Games/Strategy/Turn Based +Amusements/Toys/Background +Amusements/Toys/Clocks +Amusements/Toys/Graphics +Amusements/Toys/Other +Amusements/Toys/Screensavers +Development/Languages/C and C++ +Development/Languages/Fortran +Development/Languages/Java +Development/Languages/Other +Development/Languages/Perl +Development/Languages/Python +Development/Languages/Scheme +Development/Languages/Tcl +Development/Libraries/C and C++ +Development/Libraries/Cross +Development/Libraries/GNOME +Development/Libraries/Java +Development/Libraries/KDE +Development/Libraries/Other +Development/Libraries/Parallel +Development/Libraries/Perl +Development/Libraries/Python +Development/Libraries/Tcl +Development/Libraries/X11 +Development/Libraries/YaST +Development/Tools/Building +Development/Tools/Debuggers +Development/Tools/Doc Generators +Development/Tools/GUI Builders +Development/Tools/IDE +Development/Tools/Navigators +Development/Tools/Other +Development/Tools/Version Control +Documentation/Howto +Documentation/HTML +Documentation/Man +Documentation/Other +Documentation/SuSE +Hardware/Fax +Hardware/ISDN +Hardware/Joystick +Hardware/Mobile +Hardware/Modem +Hardware/Other +Hardware/Palm +Hardware/Printing +Hardware/Psion +Hardware/Radio +Hardware/Scanner +Hardware/TV +Hardware/UPS +Productivity/Archiving/Backup +Productivity/Archiving/Compression +Productivity/Clustering/Computing +Productivity/Clustering/HA +Productivity/Databases/Clients +Productivity/Databases/Servers +Productivity/Databases/Tools +Productivity/Editors/Emacs +Productivity/Editors/Other +Productivity/Editors/Vi +Productivity/File utilities +Productivity/Graphics/3D Editors +Productivity/Graphics/Bitmap Editors +Productivity/Graphics/CAD +Productivity/Graphics/Convertors +Productivity/Graphics/Other +Productivity/Graphics/Vector Editors +Productivity/Graphics/Viewers +Productivity/Graphics/Visualization/Graph +Productivity/Graphics/Visualization/Other +Productivity/Graphics/Visualization/Raytracers +Productivity/Hamradio/Fax +Productivity/Hamradio/Logging +Productivity/Hamradio/Morse +Productivity/Hamradio/Other +Productivity/Hamradio/Packet +Productivity/Hamradio/Psk31 +Productivity/Hamradio/Satellite +Productivity/Multimedia/CD/Grabbers +Productivity/Multimedia/CD/Players +Productivity/Multimedia/CD/Record +Productivity/Multimedia/Other +Productivity/Multimedia/Sound/Editors and Convertors +Productivity/Multimedia/Sound/Midi +Productivity/Multimedia/Sound/Mixers +Productivity/Multimedia/Sound/Players +Productivity/Multimedia/Sound/Utilities +Productivity/Multimedia/Sound/Visualization +Productivity/Multimedia/Video/Editors and Convertors +Productivity/Multimedia/Video/Players +Productivity/Networking/AOLInstantMessenger +Productivity/Networking/Archie +Productivity/Networking/Boot/Clients +Productivity/Networking/Boot/Servers +Productivity/Networking/Boot/Utilities +Productivity/Networking/Diagnostic +Productivity/Networking/DNS/Servers +Productivity/Networking/DNS/Utilities +Productivity/Networking/Email/Clients +Productivity/Networking/Email/Mailinglists +Productivity/Networking/Email/Servers +Productivity/Networking/Email/Utilities +Productivity/Networking/Ftp/Clients +Productivity/Networking/Ftp/Servers +Productivity/Networking/ICQ +Productivity/Networking/IRC +Productivity/Networking/LDAP/Clients +Productivity/Networking/LDAP/Servers +Productivity/Networking/LDAP/Utilities +Productivity/Networking/Napster +Productivity/Networking/News/Clients +Productivity/Networking/News/Servers +Productivity/Networking/News/Utilities +Productivity/Networking/NFS +Productivity/Networking/NIS +Productivity/Networking/Novell +Productivity/Networking/Other +Productivity/Networking/PPP +Productivity/Networking/Radius/Clients +Productivity/Networking/Radius/Servers +Productivity/Networking/Routing +Productivity/Networking/Samba +Productivity/Networking/Security +Productivity/Networking/SSH +Productivity/Networking/System +Productivity/Networking/Talk/Clients +Productivity/Networking/Talk/Servers +Productivity/Networking/Web/Browsers +Productivity/Networking/Web/Frontends +Productivity/Networking/Web/Proxy +Productivity/Networking/Web/Servers +Productivity/Networking/Web/Utilities +Productivity/Office/Dictionary +Productivity/Office/Finance +Productivity/Office/Organizers +Productivity/Office/Other +Productivity/Office/Spreadsheets +Productivity/Office/Suite +Productivity/Other +Productivity/Publishing/DocBook +Productivity/Publishing/HTML/Editors +Productivity/Publishing/HTML/Tools +Productivity/Publishing/Other +Productivity/Publishing/PDF +Productivity/Publishing/Presentation +Productivity/Publishing/PS +Productivity/Publishing/SGML +Productivity/Publishing/TeX/Base +Productivity/Publishing/TeX/Fonts +Productivity/Publishing/TeX/Frontends +Productivity/Publishing/TeX/Utilities +Productivity/Publishing/Texinfo +Productivity/Publishing/Troff +Productivity/Publishing/Word +Productivity/Publishing/XML +Productivity/Scientific/Astronomy +Productivity/Scientific/Chemistry +Productivity/Scientific/Electronics +Productivity/Scientific/Math +Productivity/Scientific/Other +Productivity/Scientific/Physics +Productivity/Security +Productivity/Telephony/Clients +Productivity/Telephony/H323/Clients +Productivity/Telephony/H323/Servers +Productivity/Telephony/H323/Utilities +Productivity/Telephony/Servers +Productivity/Telephony/SIP/Clients +Productivity/Telephony/SIP/Servers +Productivity/Telephony/SIP/Utilities +Productivity/Telephony/Utilities +Productivity/Text/Convertors +Productivity/Text/Spell +Productivity/Text/Utilities +System/Base +System/Benchmark +System/Boot +System/Console +System/Daemons +System/Emulators/Other +System/Emulators/PC +System/Fhs +System/Filesystems +System/GUI/GNOME +System/GUI/KDE +System/GUI/Other +System/I18n/Chinese +System/I18n/Japanese +System/I18n/Korean +System/Kernel +System/Libraries +System/Management +System/Monitoring +System/Packages +System/Shells +System/Sound Daemons +System/X11/Displaymanagers +System/X11/Fonts +System/X11/Icons +System/X11/Servers/XF86_3 +System/X11/Servers/XF86_4 +System/X11/Terminals +System/X11/Utilities +System/YaST diff --git a/app/src/gambas3/install/group/ubuntu b/app/src/gambas3/install/group/ubuntu new file mode 100644 index 00000000..af419329 --- /dev/null +++ b/app/src/gambas3/install/group/ubuntu @@ -0,0 +1,57 @@ +admin +cli-mono +comm +database +debug +devel +doc +editors +education +electronics +embedded +fonts +games +gnome +gnu-r +gnustep +golang +graphics +hamradio +haskell +httpd +interpreters +introspection +java +javascript +kde +kernel +libdevel +libs +lisp +localization +mail +math +metapackages +misc +net +news +ocaml +oldlibs +otherosfs +perl +php +python +ruby +rust +science +shells +sound +tex +text +utils +vcs +video +web +x11 +xfce +zope diff --git a/app/src/gambas3/install/menu/archlinux b/app/src/gambas3/install/menu/archlinux new file mode 100644 index 00000000..ebf42c2e --- /dev/null +++ b/app/src/gambas3/install/menu/archlinux @@ -0,0 +1,64 @@ +Applications + Accessibility + Amateur Radio + Data Management + Editors + Education + Emulators + File Management + Graphics + Mobile Devices + Network + Communication + File Transfer + Monitoring + Web Browsing + Web News + Office + Programming + Project Management + Science + Astronomy + Biology + Chemistry + Data Analysis + Electronics + Engineering + Geoscience + Mathematics + Medicine + Physics + Social + Shells + Sound + System + Administration + Hardware + Language Environment + Monitoring + Package Management + Security + Terminal Emulators + Text + TV and Radio + Viewers + Video + Web Development +Games + Action + Adventure + Blocks + Board + Card + Puzzles + Simulation + Strategy + Tools + Toys +Help +Screen + Saving + Locking +Window Managers +FVWM Modules +Window Maker diff --git a/app/src/gambas3/install/menu/autotools b/app/src/gambas3/install/menu/autotools new file mode 100644 index 00000000..621e94f0 --- /dev/null +++ b/app/src/gambas3/install/menu/autotools @@ -0,0 +1 @@ +none diff --git a/app/src/gambas3/install/menu/debian b/app/src/gambas3/install/menu/debian new file mode 100644 index 00000000..ebf42c2e --- /dev/null +++ b/app/src/gambas3/install/menu/debian @@ -0,0 +1,64 @@ +Applications + Accessibility + Amateur Radio + Data Management + Editors + Education + Emulators + File Management + Graphics + Mobile Devices + Network + Communication + File Transfer + Monitoring + Web Browsing + Web News + Office + Programming + Project Management + Science + Astronomy + Biology + Chemistry + Data Analysis + Electronics + Engineering + Geoscience + Mathematics + Medicine + Physics + Social + Shells + Sound + System + Administration + Hardware + Language Environment + Monitoring + Package Management + Security + Terminal Emulators + Text + TV and Radio + Viewers + Video + Web Development +Games + Action + Adventure + Blocks + Board + Card + Puzzles + Simulation + Strategy + Tools + Toys +Help +Screen + Saving + Locking +Window Managers +FVWM Modules +Window Maker diff --git a/app/src/gambas3/install/menu/fedora b/app/src/gambas3/install/menu/fedora new file mode 100644 index 00000000..164be866 --- /dev/null +++ b/app/src/gambas3/install/menu/fedora @@ -0,0 +1,109 @@ +Amusement +Applet +Archiving +Audio Video + Audio + Midi + Mixer + Player + Sequencer + Tuner + Audio Video Editing + Disc Burning + Music + Video + Player + TV +Development + Building + Debugger + GUI Designer + IDE + Profiling + Project Management + Revision Control + Translation + Web Development +Education + Art + Construction + Music + Languages + Science + Astronomy + Biology + Chemistry + Geology + Math + Medical Software + Physics + Teaching +Electronics +Emulator +Engineering +File Manager +Game + Action Game + Adventure Game + Arcade Game + Board Game + Blocks Game + Card Game + Kids Game + Logic Game + Role Playing + Simulation + Sports Game + Strategy Game +Office + Calendar + Contact Management + Database + Dictionary + Chart + Finance + Flow Chart + PDA + Presentation + Spreadsheet + Viewer + Word Processor +Graphics + 2D Graphics + Vector Graphics + Raster Graphics + 3D Graphics + Scanning + OCR + Photograph + Viewer +Network + Dialup + EMail + File Transfer + Ham Radio + Instant Messaging + IRC Client + News + P2P + Remote Access + Telephony + Web Browser +Settings + Accessibility + Desktop Settings + Hardware Settings + Package Manager +Screensaver +Shell +System + Filesystem + Monitor + Security +Terminal Emulator +Tray Icon +Utility + Accessibility + Calculator + Clock + Text Editor diff --git a/app/src/gambas3/install/menu/mageia b/app/src/gambas3/install/menu/mageia new file mode 100644 index 00000000..454aafdf --- /dev/null +++ b/app/src/gambas3/install/menu/mageia @@ -0,0 +1,111 @@ +Office # Office + Accessories # Office;Utility + Address Books # Office;ContactManagement + Communications + Fax + PDA # Office;PDA + Phone # Network;Telephony + Other + Drawing # Graphics;2DGraphics + Graphs # Office;Chart + Presentations # Office;Presentation + Publishing # Graphics;Viewer + Spreadsheets # Office;Spreadsheet + Tasks Management # Office + Time Management # Office;Calendar + Other # Office + Word processors # Office;WordProcessor +Internet # Network + Chat # Network + File Transfer # Network;FileTransfer + Instant Messaging # Network;InstantMessaging + Mail # Office;Network;Email + News # Network;News + Video Conference # Network + Other # Network + Remote Access # Network;RemoteAccess + Web Browsers # Network;WebBrowser + Web Editors # Network;WebDevelopment +More Applications + Accessibility # Utility;Accessibility + Communications + Databases # Database + Development # Development + Code Generators # Development;Building + Development Environments # Development;IDE + Interpreters # Development + Tools # Development + Other # Development + Documentation + Other + Editors # TextEditor + Education + Economy + Geography + History + Languages + Literature + Sciences # Science + Sports + Other + Emulators # Emulator + Finances # Office;Finance + Games # Game + Adventure # Game;AdventureGame + Arcade # Game;ArcadeGame + Boards # Game;BoardGame + Cards # Game;CardGame + Puzzles # Game + Sports # Game;SportsGame + Strategy # Game;StrategyGame + Other # Game + Toys # Amusement + Sciences # Science + Artificial Intelligence # Science + Astronomy # Science;Astronomy + Biology # Science;Biology + Chemistry # Science;Chemistry + Computer Science # Science + Data Visualization # Science + Electricity # Science + Geosciences # Science;Geology + Image Processing # Science + Mathematics # Science;Math + Numerical Analysis # Science + Parallel Computing # Science + Physics # Science;Physics + Robotics # Science + Other # Science + Shells # Shell +Multimedia + Graphics # Graphics + Sound # Audio;AudioVideo + Video # Video;AudioVideo + Other +System # System + Archiving # Archiving + Backup # Archiving + CD Burning # Archiving;AudioVideo;DiscBurning + Compression # Archiving + Other # Archiving + Configuration # Settings + Boot and Init # Settings;System + GNOME # Settings;DesktopSettings;GNOME + Advanced # Settings;DesktopSettings;GNOME + Accessibility # Settings;DesktopSettings;GNOME;Accessibility + Hardware # Settings;HardwareSettings + KDE # Settings;DesktopSettings;KDE + Components # Settings;DesktopSettings;KDE + System # Settings;DesktopSettings;KDE + Networking # Settings;Network + Packaging # Settings;PackageManager + Printing # Settings + Users # Settings + Other # Settings + File Tools # System;FileSystem + Monitoring # System;Monitor + Session + Window managers + Terminals # TerminalEmulator + Text Tools +Other diff --git a/app/src/gambas3/install/menu/mandriva b/app/src/gambas3/install/menu/mandriva new file mode 100644 index 00000000..454aafdf --- /dev/null +++ b/app/src/gambas3/install/menu/mandriva @@ -0,0 +1,111 @@ +Office # Office + Accessories # Office;Utility + Address Books # Office;ContactManagement + Communications + Fax + PDA # Office;PDA + Phone # Network;Telephony + Other + Drawing # Graphics;2DGraphics + Graphs # Office;Chart + Presentations # Office;Presentation + Publishing # Graphics;Viewer + Spreadsheets # Office;Spreadsheet + Tasks Management # Office + Time Management # Office;Calendar + Other # Office + Word processors # Office;WordProcessor +Internet # Network + Chat # Network + File Transfer # Network;FileTransfer + Instant Messaging # Network;InstantMessaging + Mail # Office;Network;Email + News # Network;News + Video Conference # Network + Other # Network + Remote Access # Network;RemoteAccess + Web Browsers # Network;WebBrowser + Web Editors # Network;WebDevelopment +More Applications + Accessibility # Utility;Accessibility + Communications + Databases # Database + Development # Development + Code Generators # Development;Building + Development Environments # Development;IDE + Interpreters # Development + Tools # Development + Other # Development + Documentation + Other + Editors # TextEditor + Education + Economy + Geography + History + Languages + Literature + Sciences # Science + Sports + Other + Emulators # Emulator + Finances # Office;Finance + Games # Game + Adventure # Game;AdventureGame + Arcade # Game;ArcadeGame + Boards # Game;BoardGame + Cards # Game;CardGame + Puzzles # Game + Sports # Game;SportsGame + Strategy # Game;StrategyGame + Other # Game + Toys # Amusement + Sciences # Science + Artificial Intelligence # Science + Astronomy # Science;Astronomy + Biology # Science;Biology + Chemistry # Science;Chemistry + Computer Science # Science + Data Visualization # Science + Electricity # Science + Geosciences # Science;Geology + Image Processing # Science + Mathematics # Science;Math + Numerical Analysis # Science + Parallel Computing # Science + Physics # Science;Physics + Robotics # Science + Other # Science + Shells # Shell +Multimedia + Graphics # Graphics + Sound # Audio;AudioVideo + Video # Video;AudioVideo + Other +System # System + Archiving # Archiving + Backup # Archiving + CD Burning # Archiving;AudioVideo;DiscBurning + Compression # Archiving + Other # Archiving + Configuration # Settings + Boot and Init # Settings;System + GNOME # Settings;DesktopSettings;GNOME + Advanced # Settings;DesktopSettings;GNOME + Accessibility # Settings;DesktopSettings;GNOME;Accessibility + Hardware # Settings;HardwareSettings + KDE # Settings;DesktopSettings;KDE + Components # Settings;DesktopSettings;KDE + System # Settings;DesktopSettings;KDE + Networking # Settings;Network + Packaging # Settings;PackageManager + Printing # Settings + Users # Settings + Other # Settings + File Tools # System;FileSystem + Monitoring # System;Monitor + Session + Window managers + Terminals # TerminalEmulator + Text Tools +Other diff --git a/app/src/gambas3/install/menu/self b/app/src/gambas3/install/menu/self new file mode 100644 index 00000000..621e94f0 --- /dev/null +++ b/app/src/gambas3/install/menu/self @@ -0,0 +1 @@ +none diff --git a/app/src/gambas3/install/menu/slackware b/app/src/gambas3/install/menu/slackware new file mode 100644 index 00000000..164be866 --- /dev/null +++ b/app/src/gambas3/install/menu/slackware @@ -0,0 +1,109 @@ +Amusement +Applet +Archiving +Audio Video + Audio + Midi + Mixer + Player + Sequencer + Tuner + Audio Video Editing + Disc Burning + Music + Video + Player + TV +Development + Building + Debugger + GUI Designer + IDE + Profiling + Project Management + Revision Control + Translation + Web Development +Education + Art + Construction + Music + Languages + Science + Astronomy + Biology + Chemistry + Geology + Math + Medical Software + Physics + Teaching +Electronics +Emulator +Engineering +File Manager +Game + Action Game + Adventure Game + Arcade Game + Board Game + Blocks Game + Card Game + Kids Game + Logic Game + Role Playing + Simulation + Sports Game + Strategy Game +Office + Calendar + Contact Management + Database + Dictionary + Chart + Finance + Flow Chart + PDA + Presentation + Spreadsheet + Viewer + Word Processor +Graphics + 2D Graphics + Vector Graphics + Raster Graphics + 3D Graphics + Scanning + OCR + Photograph + Viewer +Network + Dialup + EMail + File Transfer + Ham Radio + Instant Messaging + IRC Client + News + P2P + Remote Access + Telephony + Web Browser +Settings + Accessibility + Desktop Settings + Hardware Settings + Package Manager +Screensaver +Shell +System + Filesystem + Monitor + Security +Terminal Emulator +Tray Icon +Utility + Accessibility + Calculator + Clock + Text Editor diff --git a/app/src/gambas3/install/menu/suse b/app/src/gambas3/install/menu/suse new file mode 100644 index 00000000..164be866 --- /dev/null +++ b/app/src/gambas3/install/menu/suse @@ -0,0 +1,109 @@ +Amusement +Applet +Archiving +Audio Video + Audio + Midi + Mixer + Player + Sequencer + Tuner + Audio Video Editing + Disc Burning + Music + Video + Player + TV +Development + Building + Debugger + GUI Designer + IDE + Profiling + Project Management + Revision Control + Translation + Web Development +Education + Art + Construction + Music + Languages + Science + Astronomy + Biology + Chemistry + Geology + Math + Medical Software + Physics + Teaching +Electronics +Emulator +Engineering +File Manager +Game + Action Game + Adventure Game + Arcade Game + Board Game + Blocks Game + Card Game + Kids Game + Logic Game + Role Playing + Simulation + Sports Game + Strategy Game +Office + Calendar + Contact Management + Database + Dictionary + Chart + Finance + Flow Chart + PDA + Presentation + Spreadsheet + Viewer + Word Processor +Graphics + 2D Graphics + Vector Graphics + Raster Graphics + 3D Graphics + Scanning + OCR + Photograph + Viewer +Network + Dialup + EMail + File Transfer + Ham Radio + Instant Messaging + IRC Client + News + P2P + Remote Access + Telephony + Web Browser +Settings + Accessibility + Desktop Settings + Hardware Settings + Package Manager +Screensaver +Shell +System + Filesystem + Monitor + Security +Terminal Emulator +Tray Icon +Utility + Accessibility + Calculator + Clock + Text Editor diff --git a/app/src/gambas3/install/menu/ubuntu b/app/src/gambas3/install/menu/ubuntu new file mode 100644 index 00000000..ebf42c2e --- /dev/null +++ b/app/src/gambas3/install/menu/ubuntu @@ -0,0 +1,64 @@ +Applications + Accessibility + Amateur Radio + Data Management + Editors + Education + Emulators + File Management + Graphics + Mobile Devices + Network + Communication + File Transfer + Monitoring + Web Browsing + Web News + Office + Programming + Project Management + Science + Astronomy + Biology + Chemistry + Data Analysis + Electronics + Engineering + Geoscience + Mathematics + Medicine + Physics + Social + Shells + Sound + System + Administration + Hardware + Language Environment + Monitoring + Package Management + Security + Terminal Emulators + Text + TV and Radio + Viewers + Video + Web Development +Games + Action + Adventure + Blocks + Board + Card + Puzzles + Simulation + Strategy + Tools + Toys +Help +Screen + Saving + Locking +Window Managers +FVWM Modules +Window Maker diff --git a/app/src/gambas3/install/slack-desc-header b/app/src/gambas3/install/slack-desc-header new file mode 100644 index 00000000..7110607d --- /dev/null +++ b/app/src/gambas3/install/slack-desc-header @@ -0,0 +1,7 @@ +# HOW TO EDIT THIS FILE: +# The "handy ruler" below makes it easier to edit a package description. Line +# up the first '|' above the ':' following the base package name, and the '|' on +# the right side marks the last column you can put a character in. You must make +# exactly 11 lines for the formatting to be correct. It's also customary to +# leave one space after the ':'. + diff --git a/app/src/gambas3/layout/$compact.layout b/app/src/gambas3/layout/$compact.layout new file mode 100644 index 00000000..b03050be --- /dev/null +++ b/app/src/gambas3/layout/$compact.layout @@ -0,0 +1,23 @@ +# Gambas IDE layout +[General] +ShowMenus=False +ToolboxSize=1 +CloseWithMiddleClick=False +ProjectFontSize=100 +TitleFontSize=80 +DebuggerFontSize=100 + +[Help] +Zoom=90 + +[Property] +Help=False + +[Toolbar] +Main="Tiny,menu-file,new-project,open-project,save-project,save-project-as,project-property,|,menu-edit,menu-project,exec,translate,|,compile,compile-all,menu-debug,start,pause,stop,step,forward,return,until,gui,|,option,menu-tool,menu-view,menu-help,~,find-project,go-back,go-forward,$btnShowMenu" +Editor="Tiny" +Text="Tiny" +Connection="Tiny" +Form="Tiny,show-class,save,reload,run-me,|,undo,redo,|,menu,grid,tooltip,|,raise,lower,align-top,align-bottom,align-left,align-right,same-width,same-height,arrange-hcenter,arrange-vcenter,|,move-tab-first,move-tab-previous,move-tab-next,move-tab-last,show-tab,|,text-font,text-bold,text-italic,text-underline,text-zoom-in,text-zoom-out,text-zoom-normal,format-background,format-foreground,~,locked" +Image="Tiny" + diff --git a/app/src/gambas3/layout/$default.layout b/app/src/gambas3/layout/$default.layout new file mode 100644 index 00000000..a0d3b39c --- /dev/null +++ b/app/src/gambas3/layout/$default.layout @@ -0,0 +1,23 @@ +# Gambas IDE layout +[General] +ShowMenus=True +ToolboxSize=1 +CloseWithMiddleClick=False +ProjectFontSize=100 +TitleFontSize=80 +DebuggerFontSize=100 + +[Help] +Zoom=80 + +[Property] +Help=True + +[Toolbar] +Main="Tiny" +Editor="Tiny" +Text="Tiny" +Connection="Tiny" +Form="Tiny" +Image="Tiny" + diff --git a/app/src/gambas3/license b/app/src/gambas3/license new file mode 100644 index 00000000..86a281b5 --- /dev/null +++ b/app/src/gambas3/license @@ -0,0 +1,15 @@ + +Gambas 3 Integrated Development Environment + +(c) YEAR Benoît Minisini, Fabien Bodard, Charlie Reinl, + José Luis Redrejo, Robert Rowe + +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 2, or +(at your option) any later version. + +The Gambas font is licensed under the SIL Open Font License, +Version 1.1. You will find a copy of the license inside the +IDE source code, and it is also available with a FAQ at: +http://scripts.sil.org/OFL diff --git a/app/src/gambas3/po-header.txt b/app/src/gambas3/po-header.txt new file mode 100644 index 00000000..061b4676 --- /dev/null +++ b/app/src/gambas3/po-header.txt @@ -0,0 +1,10 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: $(PACKAGE) $(VERSION)\n" +"PO-Revision-Date: $(DATE)\n" +"Last-Translator: $(NAME) <$(MAIL)>\n" +"Language: $(LANG)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" diff --git a/app/src/gambas3/pot-header.txt b/app/src/gambas3/pot-header.txt new file mode 100644 index 00000000..03d15972 --- /dev/null +++ b/app/src/gambas3/pot-header.txt @@ -0,0 +1,10 @@ +# Generated by the Gambas IDE + +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: $(PACKAGE) $(VERSION)\n" +"POT-Creation-Date: $(NOW)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" diff --git a/app/src/gambas3/shortcut.desktop b/app/src/gambas3/shortcut.desktop new file mode 100644 index 00000000..1d9d10ed --- /dev/null +++ b/app/src/gambas3/shortcut.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Comment= +Encoding=UTF-8 +Exec='$(EXEC)' +Icon=$(ICON) +Name=$(NAME) +StartupNotify=true +Terminal=false +TerminalOptions= +Type=Application diff --git a/app/src/gambas3/snippets b/app/src/gambas3/snippets new file mode 100644 index 00000000..465434ad --- /dev/null +++ b/app/src/gambas3/snippets @@ -0,0 +1,97 @@ +[Snippets] +Count=94 +Snippet[1]="fo\nFor ${1:Var} = ${2:Start} To ${3:End}\n ${}\nNext" +Snippet[2]="fe\nFor Each ${1:Var} In ${2:Collection}\n ${}\nNext" +Snippet[3]="if\nIf ${1:Test} Then\n ${}\nEndif" +Snippet[4]="ie\nIf ${1:Test} Then\n ${2}\nElse\n ${3}\nEndif" +Snippet[5]="ps\nPublic Sub ${1:Name}(${2:Arguments})\n\n ${}\n\nEnd" +Snippet[6]="pf\nPublic Function ${1:Name}(${2:Arguments}) As ${3:ReturnType}\n\n ${}\n\nEnd" +Snippet[7]="sps\nStatic Public Sub ${1:Name}(${2:Arguments})\n\n ${}\n\nEnd" +Snippet[8]="spf\nStatic Public Function ${1:Name}(${2:Arguments}) As ${3:ReturnType}\n\n ${}\n\nEnd" +Snippet[9]="s\nPrivate Sub ${1:Name}(${2:Arguments})\n\n ${}\n\nEnd" +Snippet[10]="f\nPrivate Function ${1:Name}(${2:Arguments}) As ${3:ReturnType}\n\n ${}\n\nEnd" +Snippet[11]="ss\nStatic Private Sub ${1:Name}(${2:Arguments})\n\n ${}\n\nEnd" +Snippet[12]="sf\nStatic Private Function ${1:Name}(${2:Arguments}) As ${3:ReturnType}\n\n ${}\n\nEnd" +Snippet[13]="d\nDim ${1:Var} As ${2:Type}" +Snippet[14]="v\nPrivate $${1:Var} As ${2:Type}" +Snippet[15]="pv\nPublic ${1:Var} As ${2:Type}" +Snippet[16]="spv\nStatic Public ${1:Var} As ${2:Type}" +Snippet[17]="sv\nStatic Private $${1:Var} As ${2:Type}" +Snippet[18]="pc\nPublic Const ${1:Name} As ${2:Type} = ${3:Value}" +Snippet[19]="c\nPrivate Const ${1:Name} As ${2:Type} = ${3:Value}" +Snippet[20]="pr\nProperty ${1:Name} As ${2:Type}" +Snippet[21]="prr\nProperty Read ${1:Name} As ${2:Type}" +Snippet[22]="spp\nStatic Property ${1:Name} As ${2:Type}" +Snippet[23]="sppr\nStatic Property Read ${1:Name} As ${2:Type}" +Snippet[24]="wh\nWhile ${1:Test}\n ${}\nWend" +Snippet[25]="re\nRepeat\n ${}\nUntil ${1:Test}" +Snippet[26]="do\nDo\n ${}\nLoop" +Snippet[27]="w\nWith ${1:Expression}\n ${}\nEnd With" +Snippet[28]="op\n${1:File} = Open ${2:Path} For ${3:Mode}" +Snippet[29]="se\nSelect ${1:Expression}\n Case ${2:Compare}\n ${3}\n Case ${4:Compare}\n ${5}\n Default\n ${6}\nEnd Select" +Snippet[30]="_n\nPublic Sub _new(${1:Arguments})\n\n ${}\n\nEnd" +Snippet[31]="_g\nPublic Function _get(${1:Indexes}) As ${2:Type}\n\n ${}\n\nEnd" +Snippet[32]="_p\nPublic Sub _put(${1:Value} As ${2:Type}, ${3:Indexes})\n\n ${}\n\nEnd" +Snippet[33]="_c\nPublic Function _compare(${1:Other} As ${2:Type}) As Integer\n\n ${}\n\nEnd" +Snippet[34]="ev\nEvent ${1:Name}" +Snippet[35]="gpl\n'\n' ${1:$TITLE}\n' ${2:$DESCRIPTION}\n' \n' Copyright (C) ${3:$AUTHORS}\n'\n' This program is free software; you can redistribute it and/or modify\n' it under the terms of the GNU General Public License as published by\n' the Free Software Foundation; either version 2 of the License, or\n' (at your option) any later version.\n'\n' This program is distributed in the hope that it will be useful,\n' but WITHOUT ANY WARRANTY; without even the implied warranty of\n' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n' GNU General Public License for more details.\n'\n' You should have received a copy of the GNU General Public License\n' along with this program; if not, write to the Free Software\n' Foundation, Inc., 51 Franklin St, Fifth Floor, \n' Boston, MA 02110-1301 USA\n'\n" +Snippet[36]="main\nPublic Sub Main()\n\n ${}\n\nEnd\n" +Snippet[37]="r\nReturn " +Snippet[38]="di\nDim i${1:Var} As Integer" +Snippet[39]="db\nDim b${1:Var} As Boolean" +Snippet[40]="ds\nDim s${1:Var} As String" +Snippet[41]="dc\nDim c${1:Var} As Collection" +Snippet[42]="df\nDim f${1:Var} As Float" +Snippet[43]="da\nDim a${1:Var} As ${2:Type}[]" +Snippet[44]="vi\nPrivate $i${1:Var} As Integer" +Snippet[45]="vb\nPrivate $b${1:Var} As Boolean" +Snippet[46]="vs\nPrivate $s${1:Var} As String" +Snippet[47]="vc\nPrivate $c${1:Var} As Collection" +Snippet[48]="vf\nPrivate $f${1:Var} As Float" +Snippet[43]="va\nPrivate a${1:Var} As ${2:Type}[]" +Snippet[49]="pvi\nPublic ${1:Var} As Integer" +Snippet[50]="pvb\nPublic ${1:Var} As Boolean" +Snippet[51]="pvs\nPublic ${1:Var} As String" +Snippet[52]="pvc\nPublic ${1:Var} As Collection" +Snippet[53]="pvf\nPublic ${1:Var} As Float" +Snippet[54]="pva\nPublic ${1:Var} As ${2:Type}[]" +Snippet[55]="svi\nStatic Private $i${1:Var} As Integer" +Snippet[56]="svb\nStatic Private $b${1:Var} As Boolean" +Snippet[57]="svs\nStatic Private $s${1:Var} As String" +Snippet[58]="svc\nStatic Private $c${1:Var} As Collection" +Snippet[59]="svf\nStatic Private $f${1:Var} As Float" +Snippet[60]="sva\nStatic Private $a${1:Var} As ${2:Type}[]" +Snippet[61]="spvi\nStatic Public ${1:Var} As Integer" +Snippet[62]="spvb\nStatic Public ${1:Var} As Boolean" +Snippet[63]="spvs\nStatic Public ${1:Var} As String" +Snippet[64]="spvc\nStatic Public ${1:Var} As Collection" +Snippet[65]="spvf\nStatic Public ${1:Var} As Float" +Snippet[66]="spva\nStatic Public ${1:Var} As ${2:Type}[]" +Snippet[67]="todo\n' TODO: " +Snippet[68]="note\n' NOTE: " +Snippet[69]="fixme\n' FIXME: " +Snippet[70]="dai\nDim a${1:Var} As Integer[]" +Snippet[71]="dab\nDim a${1:Var} As Boolean[]" +Snippet[72]="das\nDim a${1:Var} As String[]" +Snippet[73]="dac\nDim a${1:Var} As Collection[]" +Snippet[74]="daf\nDim a${1:Var} As Float[]" +Snippet[75]="vai\nPrivate $a${1:Var} As Integer[]" +Snippet[76]="vab\nPrivate $a${1:Var} As Boolean[]" +Snippet[77]="vas\nPrivate $a${1:Var} As String[]" +Snippet[78]="vac\nPrivate $a${1:Var} As Collection[]" +Snippet[79]="vaf\nPrivate $a${1:Var} As Float[]" +Snippet[80]="svai\nStatic Private $a${1:Var} As Integer[]" +Snippet[81]="svab\nStatic Private $a${1:Var} As Boolean[]" +Snippet[82]="svas\nStatic Private $a${1:Var} As String[]" +Snippet[83]="svac\nStatic Private $a${1:Var} As Collection[]" +Snippet[84]="svaf\nStatic Private $a${1:Var} As Float[]" +Snippet[85]="pvai\nPublic {1:Var} As Integer[]" +Snippet[86]="pvab\nPublic {1:Var} As Boolean[]" +Snippet[87]="pvas\nPublic {1:Var} As String[]" +Snippet[88]="pvac\nPublic {1:Var} As Collection[]" +Snippet[89]="pvaf\nPublic {1:Var} As Float[]" +Snippet[90]="spvai\nStatic Public ${1:Var} As Integer[]" +Snippet[91]="spvab\nStatic Public ${1:Var} As Boolean[]" +Snippet[92]="spvas\nStatic Public ${1:Var} As String[]" +Snippet[93]="spvac\nStatic Public ${1:Var} As Collection[]" +Snippet[94]="spvaf\nStatic Public ${1:Var} As Float[]" diff --git a/app/src/gambas3/support.txt b/app/src/gambas3/support.txt new file mode 100644 index 00000000..2361746c --- /dev/null +++ b/app/src/gambas3/support.txt @@ -0,0 +1,156 @@ +60 Maurizio Da Lio +37 GNU/Linex† +33 Radoslav Dejanovic +26 Chris McLennan +24 David Müller +24 Ricardo Díaz Martin +21 David Müller +18 Kari Laine +18 Jon Nicholson +16 DistroWatch.com +16 Brian Grindley +15 Yvick Miossec +15 Christian Henri Fischer +13 Gianluigi Gradaschi +12 Leo Barnhoorn +12 Eric Damron +12 Hans-Martin Bundeshund +12 Michael Zbinden +12 Eight Virtues +12 Laurent Carlier +12 Gerry Douglas +12 José Ignacio Dominguez Romero +12 Paolo Milliery +12 Kitiipong Mapagdee +12 Jacky Tripoteau +12 Edward Kelm +11 Sharon Mayost (שרון מיוסט) +10 Thierry Senges +10 Nando Favaro +9 Technical Racing Products +9 David Losada +8 Mark Dootson +8 Two-Second Software +8 Boris Diskus +8 Hermann Friedhoff +8 Mohee Jarada +8 Hugo Sutherland +8 Phil Denby +8 Evan Owen +8 Mario Carena +8 Christian Beck +8 Joel Barnett +7 John Laurence +7 Roy Jones +7 Nicola Giacobbe +7 Robert Blick +6 Yves Ribéreau +6 Alberto Alday +6 Terry Blunt +6 David Nelson +6 Leonardo Miliani +6 Thierry Lescoat +6 Charles Guerin +6 Pearces Hardware +6 Adrian Nicol +6 Olivier Cruilles +6 Thomas Westhoff +6 Louis W Adams Jr +6 Laurent Gallego +6 Adolf J. Winterer +6 Alexander G Schaller +6 Randall Wilkinson +6 Ron Klinkien +6 David Villalobos +6 Gordon Karnauka +5 Pierre Chassagneux +5 Igor Furlan +5 Fernando J Parra Velandia +5 Steven Heather +5 David Asorey Alvarez +5 Jorge Enguidanos Naranjo +5 Mike Daugird +5 Andrea Chabala +5 Peter Lang +5 Amos Bilardo +5 Gianni Piccini +5 Enrico Righetto +5 Franck Tomesch +5 Salim Safran +5 Antonio Giovanni Di Motta +5 Michael Perryman +5 Stefan Sprickmann +5 Shant Katcherian +5 Donald Montaine +5 J-M. Blandin +5 Santos Fernández Vázquez +5 Christopher Bray +4 James Skagg +4 Frank Berg +4 Robin Hahn +4 ViridumSoft +4 Allen Murphy +4 Kenneth Gerhardstein +4 Serge Derrick +4 Jorge Carrión +4 Vincent Bermel +3 Dallen Wilson +3 Vincent Benner +3 Luciano Tomé dos Santos +3 Ron Onstenk +3 Luca De Giorgi +3 Stefano Palmeri +3 Giorigio Pontremolesi +3 N. Althuisius +3 Robert Roomberg +3 Emil Tchecov +3 Candice Menat +3 Daniel Bassa +3 Richard Englert +3 Netsinerji Ticaret Cemalettin Polat +3 Sandro Catallo +3 Dimosthenis Koptsis +3 Luca Brandani +3 Frank Tomesch +3 Nicola Giacobbe +3 John Tsatsakis +3 Peter Garlick +3 Milton Gallinger +3 Eric Villeminot +3 Pablo Garcia Morano +3 Jean Charles Authier +3 Torsten Gaidies +3 Andy Wood +3 James Carver +3 Rainer Hirthammer +3 Twitch CalumaXs +3 Peter Pach +3 DaifNet +3 Alessandri Guzman Abad +2 Eloy Velázquez López +2 Reza Salari +2 Vincenzo Domenico Femia +2 Yannick Butin +2 Sergio Caparrós +2 Jason Scurtu +2 Gaja Sophie Peters +2 Pier Sante Zaccheroni +2 Joris Alders +2 Jason Scurtu +2 Ľuboš Ilenčík +2 Jose Aguilar Vega +2 Olivier Reichelt +2 Manfred Heyen +2 John Terry +2 Timucin Kanatli +2 Brice Vidal +2 Mathew Rule +2 Daniel Reumerman +2 Francisco Mora Sánchez +1 Louviaux +1 Cooke Dylan +1 Ľuboš Ilenčík +1 Leonardo Suárez Arce +1 Marco Iosif Constantinescu +1 Rodrigo Sanchez Reyes +1 José Robson Araujo Silva diff --git a/app/src/gambas3/tags.txt b/app/src/gambas3/tags.txt new file mode 100644 index 00000000..bd02f4a7 --- /dev/null +++ b/app/src/gambas3/tags.txt @@ -0,0 +1,19 @@ +Audio +Database +Example +Gambas 3.6 +Gambas 3.7 +Gambas 3.8 +Gambas 3.9 +Game +IDEPlugin +Image +JustInTime +Library +Multimedia +MySQL +OpenGL +PostgreSQL +SQLite +Video +Web diff --git a/app/src/gambas3/template/CClass.class b/app/src/gambas3/template/CClass.class new file mode 100644 index 00000000..6fdb7e80 --- /dev/null +++ b/app/src/gambas3/template/CClass.class @@ -0,0 +1,9 @@ +' Gambas class file + +@IF COMPONENT +EXPORT +@ENDIF + +PUBLIC SUB _new() + +END diff --git a/app/src/gambas3/template/CContainer.class b/app/src/gambas3/template/CContainer.class new file mode 100644 index 00000000..57f39233 --- /dev/null +++ b/app/src/gambas3/template/CContainer.class @@ -0,0 +1,9 @@ +' Gambas class file + +EXPORT + +INHERITS UserContainer + +PUBLIC SUB _new() + +END diff --git a/app/src/gambas3/template/CControl.class b/app/src/gambas3/template/CControl.class new file mode 100644 index 00000000..8565ba8e --- /dev/null +++ b/app/src/gambas3/template/CControl.class @@ -0,0 +1,29 @@ +' Gambas class file + +EXPORT + +INHERITS UserControl + +PUBLIC SUB _new() + + DIM hLabel AS Label + + hLabel = NEW Label(ME) AS "MyLabel" + hLabel.Text = "Gambas!" + hLabel.Font = Font["+4,Bold,Italic"] + hLabel.Border = Border.Plain + +END + +PUBLIC SUB MyLabel_Enter() + + LAST.Text = "Gambas Almost Means BASIC!" + +END + +PUBLIC SUB MyLabel_Leave() + + LAST.Text = "Gambas!" + +END + diff --git a/app/src/gambas3/template/FMain.class b/app/src/gambas3/template/FMain.class new file mode 100644 index 00000000..536c587d --- /dev/null +++ b/app/src/gambas3/template/FMain.class @@ -0,0 +1,9 @@ +' Gambas class file + +Public Sub _new() + +End + +Public Sub Form_Open() + +End diff --git a/app/src/gambas3/template/FMain.form b/app/src/gambas3/template/FMain.form new file mode 100644 index 00000000..909943fb --- /dev/null +++ b/app/src/gambas3/template/FMain.form @@ -0,0 +1,6 @@ +# Gambas Form File 3.0 + +{ FMain Form + MoveScaled(0,0,50,50) +} + diff --git a/app/src/gambas3/template/FTest.class b/app/src/gambas3/template/FTest.class new file mode 100644 index 00000000..536c587d --- /dev/null +++ b/app/src/gambas3/template/FTest.class @@ -0,0 +1,9 @@ +' Gambas class file + +Public Sub _new() + +End + +Public Sub Form_Open() + +End diff --git a/app/src/gambas3/template/FTest.form b/app/src/gambas3/template/FTest.form new file mode 100644 index 00000000..64f09ef0 --- /dev/null +++ b/app/src/gambas3/template/FTest.form @@ -0,0 +1,5 @@ +# Gambas Form File 3.0 + +{ FTest Form + MoveScaled(0,0,50,50) +} diff --git a/app/src/gambas3/template/MMain.module b/app/src/gambas3/template/MMain.module new file mode 100644 index 00000000..c21a66e7 --- /dev/null +++ b/app/src/gambas3/template/MMain.module @@ -0,0 +1,5 @@ +' Gambas module file + +Public Sub Main() + +End diff --git a/app/src/gambas3/template/MTest.module b/app/src/gambas3/template/MTest.module new file mode 100644 index 00000000..fff65918 --- /dev/null +++ b/app/src/gambas3/template/MTest.module @@ -0,0 +1,9 @@ +' Gambas module file + +Public Sub Main() + + Dim hClass As CClass + + hClass = New CClass + +End diff --git a/app/src/gambas3/template/_project b/app/src/gambas3/template/_project new file mode 100644 index 00000000..05f4b701 --- /dev/null +++ b/app/src/gambas3/template/_project @@ -0,0 +1,108 @@ +# Gambas Project File 3.0 +Title=$(TITLE) +@ +@IF CONSOLE OR GAME OR WEB + @IF COMPONENT +Startup=MTest + @ELSE +Startup=MMain + @ENDIF +@ENDIF +@IF GRAPHIC + @IF COMPONENT +Startup=FTest + @ELSE +Startup=FMain + @ENDIF +@ENDIF +@ +@IF DATABASE +Component=gb.db +@ENDIF +@ +@IF NETWORK +Component=gb.net +Component=gb.net.curl +Component=gb.net.smtp +@ENDIF +@ +@IF REGEXP +Component=gb.pcre +@ENDIF +@ +@IF SETTINGS +Component=gb.settings +@ENDIF +@ +@IF SCIENCE +Component=gb.gsl +@ENDIF +@ +@IF VISUAL +Component=gb.vb +@ENDIF +@ +@IF XML +Component=gb.xml +Component=gb.xml.xslt +@ENDIF +@ +@IF OPENGL +Component=gb.opengl +@ENDIF +@IF GRAPHIC +Component=gb.image + @IF GTK +Component=gb.gtk +Component=gb.form + @IF OPENGL +Component=gb.gtk.opengl + @ENDIF + @ENDIF + @IF QT +Component=gb.qt4 +Component=gb.qt4.ext +Component=gb.form + @IF OPENGL +Component=gb.qt4.opengl + @ENDIF + @ENDIF + @IF GUI +Component=gb.gui +Component=gb.form + @IF OPENGL +Component=gb.gui.opengl + @ENDIF + @ENDIF + @IF DATABASE +Component=gb.db.form + @ENDIF +@ENDIF +@ +@IF IMAGE +Component=gb.image.effect +@ENDIF +@ +@IF GAME +Component=gb.image +Component=gb.image.io +Component=gb.sdl +Component=gb.sdl.sound +@ENDIF +@ +@IF WEB +Component=gb.web +@ENDIF +@ +@IF TRANSLATE +Translate=1 +Language=$(LANGUAGE) +@ENDIF +@IF VISUAL +ControlPublic=1 +ModulePublic=1 +@ENDIF +@IF COMPONENT +MakeComponent=1 +@ENDIF + diff --git a/app/src/gambas3/template/ccontainer.png b/app/src/gambas3/template/ccontainer.png new file mode 100644 index 0000000000000000000000000000000000000000..0c964749ebf7dbdb57d5191e0da2b88753fc8546 GIT binary patch literal 1606 zcmV-M2D$l(P)0zwsps4b}iQOhG0k04crPgN`N zsVXI3c&LP=0e?VYOQ=ZWQb+^oLv3juG^)tUbz)~@JC42U-SzA|4}iYHXZ5i zy?Zr#e*b&!xo6KsMEJbT*~J<^$9_MDjO^qQAO&c%vGKXU=9_f-IrdBUW#XN9O5F3m z68YeZlHbPjKL&5__u`l$}vUDNf!s`2Jm)yGii+T0i580xW%8Q8i ze+lq%>LFd@d97nZJIkMdmMky|6oDe1SpZsq5*QxF*T2OV)c*T^D81Jf%iO7y>K74r z)&ktO)EZr5yT0JI4sQ4*T(TG#iNRrv>V+Y)WI-xmn_!tFzkEHd6>It9YtQYq9qv?0 z^)(Y=Gy(t2$S(c{H*JSYZv_fdz(Ffv6$(HFoB)nxf^Cvn)`|GCY|HHf2Ud6TfKuvj zfGc%D7YjoFcWQ^0Y~RQ=KZPs53kV`*{PIaWdl=s>;d^DQk+ZmF5zjFh@6WSj-8CRU zbsVhmpbwjQ<~&13FO&|P;5$EfgTDfHR7Cs~?7LRz+zbov1_U$@(ur{O(N+jOQG&sf zFmO8fy>1}B0`XC@@rrhFbr7D zkKvJ@L*Zk%dGl1bKMr;k#!KNws-QzKk}8M?%?I6~B^}R2g#iHCLt_mD=mx039B1DH zUEsRgAz=mZ$Z?}oM2r;5il2aqvFl7R?+0lq0qBjlAeD)&iow5tc@kEx2ctX*uuc5Z z7)nzSconR$x$dNm=t--~i**7dB4FYJtRfulhO0V3*FzCi{Bi{&n+bq+H4x!g0XUhO z1d9Z=1$^HL#*GC4sq`c`D#96t6Gd3G0=xhwo;T@s+X~)Grena^7{M10@R|vTcmNd_ zP}`QF9>~nWFPG4i1Ylnvk*tG;_GA){2)m(TjY(sbxQ6dP_2=IoFW4QBCt*z6GP=J?!WM<~@+Ps=Z zz|c_XvAOT>d#UA)JJ9FNi)=+yL^$Ur!B5W)j(`>y5c}5g6x)yW+D{kvypPpC7@UYH zEgkfUWDo3XC&T zlTICc^piY2T?gqsIB@v)eQe#?!x4hwa!5qXhW7%clme1FzQ?Msb?|oEimzrDu75Bt z!f_zc$3(J0!bJt+(y1Yizw{wz|D8X%Z-A{^KjrTPl}uPlQ56xt>BXcb;(--({A3mH z%wKuyvdcI8I1Ee$P6ZPADe&sx2t7Oh%>TMS8TijAuRVK+-4SpZFafVtk~J+zL`0NQ zcGn?#Q;NGcS3i2!F51f$ZF&~HrH$b4ygC7P%N35lyof0cX7?0WPcyb=Oy<&??A zs^VskQp)(z3Ko5TIlo!3cLEk(RH-IUqT_R~YGXvDtQov`+N1_R|i;N`ox8~^|S07*qoM6N<$ Ef+WBOQvd(} literal 0 HcmV?d00001 diff --git a/app/src/gambas3/template/ccontrol.png b/app/src/gambas3/template/ccontrol.png new file mode 100644 index 0000000000000000000000000000000000000000..0c964749ebf7dbdb57d5191e0da2b88753fc8546 GIT binary patch literal 1606 zcmV-M2D$l(P)0zwsps4b}iQOhG0k04crPgN`N zsVXI3c&LP=0e?VYOQ=ZWQb+^oLv3juG^)tUbz)~@JC42U-SzA|4}iYHXZ5i zy?Zr#e*b&!xo6KsMEJbT*~J<^$9_MDjO^qQAO&c%vGKXU=9_f-IrdBUW#XN9O5F3m z68YeZlHbPjKL&5__u`l$}vUDNf!s`2Jm)yGii+T0i580xW%8Q8i ze+lq%>LFd@d97nZJIkMdmMky|6oDe1SpZsq5*QxF*T2OV)c*T^D81Jf%iO7y>K74r z)&ktO)EZr5yT0JI4sQ4*T(TG#iNRrv>V+Y)WI-xmn_!tFzkEHd6>It9YtQYq9qv?0 z^)(Y=Gy(t2$S(c{H*JSYZv_fdz(Ffv6$(HFoB)nxf^Cvn)`|GCY|HHf2Ud6TfKuvj zfGc%D7YjoFcWQ^0Y~RQ=KZPs53kV`*{PIaWdl=s>;d^DQk+ZmF5zjFh@6WSj-8CRU zbsVhmpbwjQ<~&13FO&|P;5$EfgTDfHR7Cs~?7LRz+zbov1_U$@(ur{O(N+jOQG&sf zFmO8fy>1}B0`XC@@rrhFbr7D zkKvJ@L*Zk%dGl1bKMr;k#!KNws-QzKk}8M?%?I6~B^}R2g#iHCLt_mD=mx039B1DH zUEsRgAz=mZ$Z?}oM2r;5il2aqvFl7R?+0lq0qBjlAeD)&iow5tc@kEx2ctX*uuc5Z z7)nzSconR$x$dNm=t--~i**7dB4FYJtRfulhO0V3*FzCi{Bi{&n+bq+H4x!g0XUhO z1d9Z=1$^HL#*GC4sq`c`D#96t6Gd3G0=xhwo;T@s+X~)Grena^7{M10@R|vTcmNd_ zP}`QF9>~nWFPG4i1Ylnvk*tG;_GA){2)m(TjY(sbxQ6dP_2=IoFW4QBCt*z6GP=J?!WM<~@+Ps=Z zz|c_XvAOT>d#UA)JJ9FNi)=+yL^$Ur!B5W)j(`>y5c}5g6x)yW+D{kvypPpC7@UYH zEgkfUWDo3XC&T zlTICc^piY2T?gqsIB@v)eQe#?!x4hwa!5qXhW7%clme1FzQ?Msb?|oEimzrDu75Bt z!f_zc$3(J0!bJt+(y1Yizw{wz|D8X%Z-A{^KjrTPl}uPlQ56xt>BXcb;(--({A3mH z%wKuyvdcI8I1Ee$P6ZPADe&sx2t7Oh%>TMS8TijAuRVK+-4SpZFafVtk~J+zL`0NQ zcGn?#Q;NGcS3i2!F51f$ZF&~HrH$b4ygC7P%N35lyof0cX7?0WPcyb=Oy<&??A zs^VskQp)(z3Ko5TIlo!3cLEk(RH-IUqT_R~YGXvDtQov`+N1_R|i;N`ox8~^|S07*qoM6N<$ Ef+WBOQvd(} literal 0 HcmV?d00001 diff --git a/app/src/gambas3/template/list b/app/src/gambas3/template/list new file mode 100644 index 00000000..2c4dd73f --- /dev/null +++ b/app/src/gambas3/template/list @@ -0,0 +1,22 @@ +_project +@IF CONSOLE OR GAME OR WEB + @IF COMPONENT +CClass.class +MTest.module + @ELSE +MMain.module + @ENDIF +@ENDIF +@IF GRAPHIC + @IF COMPONENT +CControl.class +CContainer.class +FTest.class +FTest.form +.hidden/control/ccontrol.png +.hidden/control/ccontainer.png + @ELSE +FMain.class +FMain.form + @ENDIF +@ENDIF diff --git a/app/src/gambas3/theme/amber b/app/src/gambas3/theme/amber new file mode 100644 index 00000000..970c144f --- /dev/null +++ b/app/src/gambas3/theme/amber @@ -0,0 +1,23 @@ +[Theme] +Background="#FFFFFF" +Normal="#000000" +Keyword="#DD9300,Bold" +Function="#DD4A00" +Operator="#DD4A00,Bold" +Symbol="#202020" +Number="#0000FF" +String="#00C000" +Comment="#FFD480" +Breakpoint="#FF5F5F" +Current="#FFAA00" +Datatype="#DD9300" +Selection="#F4B679" +Highlight="#CF9FFF" +CurrentLine="#FFEFCF" +Error="#028078,Underline" +Help="#FFD480,Bold" +Preprocessor="#FF00FF,Bold" +Escape="String,Bold,Dotted" +Label="Normal,Dotted" +Constant="Number" +Alternate="#E0E0E0" diff --git a/app/src/gambas3/theme/amethyst b/app/src/gambas3/theme/amethyst new file mode 100644 index 00000000..ddd2bf0c --- /dev/null +++ b/app/src/gambas3/theme/amethyst @@ -0,0 +1,23 @@ +[Theme] +Background="#FFFFFF" +Normal="#000000" +Keyword="#BF00FF,Bold" +Function="#FF00FF" +Operator="#FF00FF,Bold" +Symbol="#000000" +Number="#808000" +String="#FF8000" +Comment="#BF7FFF,Italic" +Breakpoint="#FF5F5F" +Current="#EFBFFF" +Datatype="#BF00FF" +Selection="#E0AAE0" +Highlight="#9FFF9F" +CurrentLine="#F9E7FF" +Error="#008000,Underline" +Help="#BF7FFF,Bold,Italic" +Preprocessor="#0000FF,Bold" +Escape="String,Bold,Dotted" +Label="Normal,Dotted" +Constant="Number" +Alternate="#E0E0E0" diff --git a/app/src/gambas3/theme/blues b/app/src/gambas3/theme/blues new file mode 100644 index 00000000..ada250e6 --- /dev/null +++ b/app/src/gambas3/theme/blues @@ -0,0 +1,24 @@ +[Theme] +Background="#143250" +Normal="#BFBFBF" +Keyword="#80CEFF" +Datatype="#0094F0" +Function="#FFFFFF" +Operator="#F0AB4A,Bold" +Symbol="#BFBFBF" +Number="#D96D6D" +String="#FFFF80" +Comment="#3F7F3F" +Help="#BFBFBF,Bold" +Preprocessor="#B94B4B,Bold" +Breakpoint="#BF4749" +Current="#5F5FBF" +Selection="#1F5F97" +Highlight="#0055FF" +CurrentLine="#00376F" +Error="#D96D6D" +Escape="String,Bold,Dotted" +Label="Normal,Dotted" +Constant="Number" +Alternate="#E0E0E0" + diff --git a/app/src/gambas3/theme/emerald b/app/src/gambas3/theme/emerald new file mode 100644 index 00000000..1f9c1b70 --- /dev/null +++ b/app/src/gambas3/theme/emerald @@ -0,0 +1,23 @@ +[Theme] +Background="#FFFFFF" +Normal="#000000" +Highlight="#FFCF9F" +Selection="#B0F0D0" +Keyword="#00C0A0,Bold" +Datatype="#00806B" +Operator="#00C000,Bold" +Function="#00C000" +Symbol="#000000" +Number="#FF00FF" +String="#00007F" +Comment="#805500,Italic" +Breakpoint="#FF5F5F" +Current="#BFFFBF" +CurrentLine="#E7FFE7" +Error="#800080,Underline" +Help="#805500,Bold,Italic" +Preprocessor="#FF8000,Bold" +Escape="String,Bold,Dotted" +Label="Normal,Dotted" +Constant="Number" +Alternate="#E0E0E0" diff --git a/app/src/gambas3/theme/gambas b/app/src/gambas3/theme/gambas new file mode 100644 index 00000000..2b151420 --- /dev/null +++ b/app/src/gambas3/theme/gambas @@ -0,0 +1,23 @@ +[Theme] +Background="#FFFFFF" +Normal="#000000" +Keyword="#000000,Bold" +Datatype="#DF6B00,Bold" +Function="#3398C3,Bold" +Operator="#000000,Bold" +Symbol="#000000" +Number="#FF0000,Bold" +String="#7F0000" +Comment="#888786,Italic" +Help="#888786,Bold,Italic" +Preprocessor="#006E28,Bold" +Breakpoint="#FF5F5F" +Current="#42C9FF" +Selection="#A4D9F0" +Highlight="#8BDF37" +CurrentLine="#E7F7FF" +Error="#BF0303,Underline" +Escape="String,Bold,Dotted" +Label="Normal,Dotted" +Constant="Number" +Alternate="#E0E0E0" diff --git a/app/src/gambas3/theme/obsidian b/app/src/gambas3/theme/obsidian new file mode 100644 index 00000000..e3ed680f --- /dev/null +++ b/app/src/gambas3/theme/obsidian @@ -0,0 +1,24 @@ +[Theme] +Background="#000000" +Normal="#FFFFFF" +Keyword="#F0F000,Bold" +Function="#7F7FFF" +Operator="#FF00FF,Bold" +Symbol="#E0E0E0" +Number="#808000" +String="#FF0000" +Comment="#BF7FFF,Italic" +Breakpoint="#FF5F5F" +Current="#607080" +Datatype="#FF5F5F" +Selection="#9000C0" +Highlight="#5FC08E" +CurrentLine="#303030" +Error="#C00000,Underline" +Help="#BF7FFF,Bold,Italic" +Preprocessor="#00C000,Bold" +Escape="String,Bold,Dotted" +Label="Normal,Dotted" +Constant="Number" +Alternate="#E0E0E0" + diff --git a/app/src/gambas3/theme/pastel b/app/src/gambas3/theme/pastel new file mode 100644 index 00000000..88ed9e29 --- /dev/null +++ b/app/src/gambas3/theme/pastel @@ -0,0 +1,24 @@ +[Theme] +Background="#042C37" +Normal="#BBD2D2" +Keyword="#2BA8C8" +Datatype="#ACEE90" +Function="#FEF9ED" +Operator="#F17F7F" +Symbol="#C5DEDE" +Number="#ECB075,Bold" +String="#FEFEBE" +Comment="#266F82" +Help="#C3DCDC,Bold" +Preprocessor="#EB3632,Bold" +Breakpoint="#280000" +Current="#355B82" +Selection="#000014" +Highlight="#2F8DA0" +CurrentLine="#003846" +Error="#EF5454" +Escape="String,Bold,Dotted" +Label="Normal,Dotted" +Constant="Number" +Alternate="#E0E0E0" + diff --git a/app/src/gambas3/theme/quest b/app/src/gambas3/theme/quest new file mode 100644 index 00000000..2189fd11 --- /dev/null +++ b/app/src/gambas3/theme/quest @@ -0,0 +1,23 @@ +[Theme] +Background="#FFFFFF" +Normal="#000000" +Keyword="#000000,Bold" +Datatype="#0057AE" +Function="#0095FF" +Operator="#000000,Bold" +Symbol="#000000" +Number="#B08000" +String="#BF0303" +Comment="#888786,Italic" +Breakpoint="#FF5F5F" +Current="#BFDFFF" +Selection="#81AFDE" +Highlight="#FFFF00" +CurrentLine="#E7F3FF" +Error="#BF0303,Underline" +Help="#888786,Bold,Italic" +Preprocessor="#006E28,Bold" +Escape="String,Bold,Dotted" +Label="Normal,Dotted" +Constant="Number" +Alternate="#E0E0E0" diff --git a/app/src/gambas3/theme/quick b/app/src/gambas3/theme/quick new file mode 100644 index 00000000..08df5f81 --- /dev/null +++ b/app/src/gambas3/theme/quick @@ -0,0 +1,24 @@ +[Theme] +Background="#003F77" +Normal="#BFBFBF" +Highlight="#BF5C00" +Selection="#1F5F97" +Keyword="#BFBFBF" +Datatype="#9FFF9F" +Operator="#E0E000,Bold" +Function="#BFBFFF" +Symbol="#FFFFFF" +Number="#FF9F9F" +String="#C0C0FF" +Comment="#5FBF5F" +Breakpoint="#BF4749" +Current="#5F5FBF" +CurrentLine="#00376F" +Error="#808000" +Help="#5FBF5F,Bold" +Preprocessor="#FF0000,Bold" +Escape="String,Bold,Dotted" +Label="Normal,Dotted" +Constant="Number" +Alternate="#E0E0E0" + diff --git a/app/src/gambas3/theme/ruby b/app/src/gambas3/theme/ruby new file mode 100644 index 00000000..55b8b3c6 --- /dev/null +++ b/app/src/gambas3/theme/ruby @@ -0,0 +1,23 @@ +[Theme] +Background="#FFFFFF" +Normal="#000000" +Highlight="#AAEEFF" +Selection="#E0A9A9" +Keyword="#FF3F3F,Bold" +Datatype="#FF3F3F" +Operator="#C00000,Bold" +Function="#C00000" +Symbol="#000000" +Number="#00C000" +String="#808000" +Comment="#FF8000,Italic" +Breakpoint="#FF5F5F" +Current="#FFBFBF" +CurrentLine="#FFE7E7" +Error="#008000,Underline" +Help="#FF8000,Bold,Italic" +Preprocessor="#0000FF,Bold" +Escape="String,Bold,Dotted" +Label="Normal,Dotted" +Constant="Number" +Alternate="#E0E0E0" diff --git a/app/src/gambas3/theme/sapphire b/app/src/gambas3/theme/sapphire new file mode 100644 index 00000000..8f68d787 --- /dev/null +++ b/app/src/gambas3/theme/sapphire @@ -0,0 +1,24 @@ +[Theme] +Background="#FFFFFF" +Normal="#000000" +Keyword="#0080FF,Bold" +Function="#0000FF" +Operator="#0000FF,Bold" +Symbol="#000000" +Number="#FF0000" +String="#FF00FF" +Comment="#7FBFFF" +Breakpoint="#FF5F5F" +Current="#BFDFFF" +Datatype="#0080FF" +Selection="#DFECFF" +Highlight="#E0E000" +CurrentLine="#E7F3FF" +Error="#808000,Underline" +Help="#7FBFFF,Bold" +Preprocessor="#00C000,Bold" +Escape="String,Bold,Dotted" +Label="Normal,Dotted" +Constant="Number" +Alternate="#E0E0E0" + diff --git a/app/src/gambas3/theme/visual b/app/src/gambas3/theme/visual new file mode 100644 index 00000000..1187c118 --- /dev/null +++ b/app/src/gambas3/theme/visual @@ -0,0 +1,23 @@ +[Theme] +Background="#FFFFFF" +Normal="#000000" +Highlight="#5FFFFF" +Selection="#9DA2CC" +Keyword="#0006FF,Bold" +Datatype="#000066" +Operator="#000066,Bold" +Function="#000066" +Symbol="#000066" +Number="#000000" +String="#558888" +Comment="#008800,Italic" +Breakpoint="#FF5F5F" +Current="#BFBFFF" +CurrentLine="#E7F3FF" +Error="#004040,Underline" +Help="#008800,Bold,Italic" +Preprocessor="#808000,Bold" +Escape="String,Bold,Dotted" +Label="Normal,Dotted" +Constant="Number" +Alternate="#E0E0E0" diff --git a/app/src/gambas3/theme/zen b/app/src/gambas3/theme/zen new file mode 100644 index 00000000..0d315bd2 --- /dev/null +++ b/app/src/gambas3/theme/zen @@ -0,0 +1,24 @@ +[Theme] +Background="#042C37" +Normal="#BBD2D2" +Keyword="#2BA8C8" +Constant="#ECB075,Bold" +Datatype="#ACEE90" +Function="#FEF9ED" +Operator="#F17F7F" +Symbol="#C5DEDE" +Label="#BBD2D2,Dotted" +Number="#ECB075,Bold" +String="#FEFEBE" +Escape="#FEFEBE,Bold,Dotted" +Comment="#266F82" +Help="#C3DCDC,Bold" +Preprocessor="#EB3632,Bold" +Breakpoint="#FF7F7F" +Current="#355B82" +Selection="#1C5260" +Highlight="#2F89A0" +CurrentLine="#003846" +Error="#EF5454" +Alternate="#404040" + diff --git a/app/src/gambas3/tips/tips.ca b/app/src/gambas3/tips/tips.ca new file mode 100644 index 00000000..a0321e39 --- /dev/null +++ b/app/src/gambas3/tips/tips.ca @@ -0,0 +1,463 @@ +[WELCOME] + +

        Benvingut a Gambas !

        + +

        Gambas és un entorn gràfic de desenvolupament basat en un intèrpret Basic avançat.

        + +

        El propòsit de Gambas és permetre crear aplicacions potents de manera fàcil i ràpida. Però la netedat dels vostres programes resta sota la vostra responsabilitat...

        + +

        Gaudiu-lo !

        + +

        Benoît Minisini
        +gambas@users.sourceforge.net

        + + +[STARTUP] + +

        Cada projecte ha de tenir una classe d'inici. Aquesta classe d'inici ha de tenir definit un mètode públic i estàtic anomenat Main sense arguments, el qual actuarà com a mètode d'inici del vostre programa.

        + +

        Podeu definir la classe d'inici fent clic sobre ella amb el botó dret del ratolí a l'arbre de projecte, i seleccionant Classe d'inici al menú contextual.

        + +

        No és necessari definir un mètode Main en un formulari d'inici, per que ja en te un de predefinit.

        + +

        Aquest mètode d'inici predefinit instancia el formulari i el mostra, igual que a Visual Basic™.

        + + +[OPEN] + +

        La instrucció OPEN de Gambas no fa el mateix que la de Visual Basic. No retorna el fitxer com un integer, si no com un objecte File.

        + +

        Per tant, en comptes d'escriure :

        + +
        DIM handle AS Integer
        +...
        +OPEN "elmeufitxer" FOR READ AS #handle
        + +

        heu d'escriure :

        + +
        DIM handle AS File
        +...
        +handle = OPEN "elmeufitxer" FOR READ
        + + +[CATDIR] + +

        Sabeu que podeu concatenar noms de directori i noms de fitxer amb l'operador "&/"? Aquest operador afegeix si cal els separadors de directoris, així que el camí resultant és perfecte.

        + +

        Per exemple:

        + +
        PRINT "/home/gambas" &/ ".bashrc"
        +/home/gambas/.bashrc
        +
        +PRINT "/home/gambas/" &/ "/tmp" &/ "foo.bar"
        +/home/gambas/tmp/foo.bar
        +
        + +

        No és meravellós ?

        + + +[EXEC] + +

        Podeu crear un fitxer executable de tot el vostre projecte. Seleccioneu Crea executable dins el menú Projecte.

        + +

        Quan Gambas crea un fitxer executable, el posa per defecte dins del directori del vostre projecte. El nom de l'executable és el mateix que el del vostre projecte.

        + + +[PATH] +

        +Els camins relatius tenen un significat especial a Gambas. +Sempre fan referència a fitxers dintre dels vostres projectes. +

        +No existeix el concepte de directori actual, ni paraula clau com CHDIR per canviar-lo. +

        +Aneu amb compte: només heu de fer servir camins relatius per accedir als fitxers del projecte, ja que els camins absoluts deixaran de funcionar quan creeu un executable. + + +[GLOBAL] + +No hi han variables globals a Gambas! +

        +Com a solució temporal, poseu-les dins del mòdul principal i declareu-les com a PUBLIC. +

        +Si en comptes d'un mòdul principal teniu un formulari principal al vostre projecte, llavors declareu-les com a STATIC PUBLIC. +

        +Per accedir a aquestes variables heu de fer servir el nom de mòdul principal ò del formulari: ElMeuModulPrincipal.LaMevaVariableGlobal ò ElMeuFormulariPrincipal.LaMevaVariableGlobal. + + +[EMPTY] + +

        Per saber si una cadena és buida, no és necessari fer servir la funció Len(). Ho poseu comprovar directament ja que una cadena buida és FALSE i una cadena no buida és TRUE.

        + +

        Per exemple, en comptes de fer :

        + +
        IF Len(LaMevaCadena) > 0 THEN ...
        +IF Len(LaMevaCadena) = 0 THEN ...
        + +

        Heu de fer :

        + +
        IF LaMevaCadena THEN ...
        +IF NOT LaMevaCadena THEN ...
        + + +[TRANSLATE] + +

        Les aplicacions del Gambas son totalment traduïbles, permetent que indiqueu quines cadenes s'han de traduir i quines no.

        +

        Per a marcar una cadena com a traduïble, només l'heu de tancar entre parèntesis:

        + +

        PRINT ("Traduïu-me")
        +PRINT "Però no em traduïu!"
        + + +[SUBST] + +

        La substitució és molt útil per a la internacionalització de la vostra aplicació. +Es fa amb l'instrucció Subst().

        + +

        Té com a mínim 2 paràmetres. El primer és la màscara de text a on s'aplica la substitució. Després hi són les vostres variables, a on la primera té el número 1. S'usa d'aquesta manera: &1, &2, ...

        + +
        Subst(("Substitució de &1, &2 i &3"), "primer", "segon", "tercer")
        +
        +'...retornarà això:
        +'Substitució de primer, segon i tercer
        + + +[EVENT] + +

        Tots els controls i tots els objectes que poden rebre esdeveniments, tenen un observador d'esdeveniments i un nom de grup d'esdeveniment.

        + +

        L'observador d'esdeveniments captura tots els esdeveniments rebuts per l'objecte, i el nom de grup de l'esdeveniment és el prefixe del procediment encarregat de gestionar l'esdeveniment.

        + +

        Per defecte, l'observador d'esdeveniments és l'objecte a on heu creat el control, i el nom de grup és el nom del control.

        + +

        D'aquesta manera, un formulari rep tots els esdeveniments produïts sobre el control que heu creat dins d'ell.

        + +
        ' Gambas form
        +Public Sub _new()
        +  Dim hButton As Button
        +  hButton = New Button(Me) As "ElMeuBoto"
        +End
        +
        +Public Sub ElMeuBoto_Click()
        +  Print "Heu fet clic a ElMeuBoto!"
        +End
        +
        + + +[GROUP] + +

        Tot control te la propietat (Group). Quan aquesta propietat es fa servir, el prefix del nom del gestor d'esdeveniments és el nom del grup i no el nom del control.

        + +

        Suposem que teniu un Botó anomenat btnAction amb el gestor d'esdeveniments Click següent :

        + +
        PUBLIC SUB btnAction_Click()
        + +

        Si definiu la propietat (Group) de btnAction com a ElMeuGrup, llavors el gestor d'esdeveniments que rebrà els esdeveniments del botó serà el següent :

        + +
        PUBLIC SUB ElMeuGrup_Click()
        + +

        Aquesta propietat us permet gestionar els esdeveniments de diversos controls en una sola funció. I els controls del mateix grup no han de ser del mateix tipus !

        + +

        Nota : Els veterans del vell Visual Basic reconeixeran el concepte de control array, però en una implementació més potent. :-)

        + + +[FORM] + +

        A Gambas, un formulari és el seu propi observador d'esdeveniments, de manera que podeu gestionar directament els seus esdeveniments (com Resize, Activate, ...) dins del seu propi codi de classe.

        + +

        D'aquesta manera, els novells provinents de Visual Basic no es desorientaran :-).

        + + +[EMBED] + +

        A Gambas podeu fer que qualsevol formulari estigui incrustat dins d'altres formularis !

        + +

        Per fer servir aquesta poderosa eina, només heu d'instanciar el formulari passant un contenidor pare com a últim argument del constructor.

        + +

        Per exemple :

        +

        DIM hForm AS MyDialog
        +DIM hSuperControl AS MyForm

        +' Crea un quadre de diàleg
        +hForm = NEW MyDialog
        +' Insereix un formulari dins d'aquest quadre de diàleg
        +' Observeu que aquest formulari rep dos paràmetres abans del contenidor
        +hSuperControl = NEW MyForm(Param1, Param2, MyDialog)
        +' Mou i canvia la mida del formulari
        +hSuperControl.Move(8, 8, 128, 64)
        +

        + +

        Aneu amb compte: un formulari incrustat dins d'un altre formulari segueix sent un formulari, i per tant el seu propi observador d'esdeveniments.

        + + +[TAG] + +

        Cada control te una propietat anomenada Tag. Aquesta propietat és per al programador, i pot contenir qualsevol dada VARIANT que trobeu pertinent.

        + +

        Això és molt útil quan voleu distingir controls del mateix grup dins d'un gestor d'esdeveniments comú.

        + + + +[LAST] + +

        La paraula clau LAST retorna l'últim control que ha rebut un esdeveniment. Això és molt útil quan vulgueu escriure un gestor d'esdeveniments que sigui independent de qualsevol nom de control.

        + +

        Per exemple, suposem que voleu escriure un programa calculadora. +Heu definit deu botons, un per cada dígit, tots dins del mateix group "Digit". El valor Tag de cada control és el que es mostrarà en el botó. El vostre gestor d'esdeveniments tindria un aspecte com això :

        + +

        PUBLIC SUB Digit_Click()

        +  Display = Display & LAST.Tag
        +  RefreshDisplay

        +END

        + + +[LEFT] + +

        Les ben conegudes rutines de BASIC Left$, Right$ i Mid$ tenen un comportament molt útil a Gambas

        + +

        El segon paràmetre de Left$ i Right$ és opcional, i és 1 per defecte.

        + +

        Left$("Gambas") retorna "G"
        +Right$("Gambas") retorna "s"

        + +

        Aquest segon paràmetre pot ser negatiu, i llavors dona el nombre de caràcters que no es mostraran.

        + +

        Left$("Gambas", -2) retorna "Gamb"
        +Right$("Gambas", -2) retorna "mbas"

        + +

        Així mateix, el tercer argument de Mid$ pot ser negatiu, i llavors representa el nombre de caràcters des del final de la cadena que no es mostraran.

        + +

        Mid$("Gambas", 2, -2) retorna "amb" + + +[OBSERVER] + +

        La classe Observer us permet interceptar tots els esdeveniments produïts per un objecte abans de que siguin enviats.

        + +
        MyTextBox = NEW TextBox(ME) AS "MyTextBox"
        +MyObserver = NEW Observer(MyTextBox) AS "MyObserver"
        +...
        +PUBLIC SUB MyObserver_KeyPress()
        +  DEBUG "Obtingut primer"
        +END
        +
        +PUBLIC SUB MyTextBox_KeyPress()
        +  DEBUG "Obtingut després"
        +END
        + +L'Observer pot canceŀlar l'esdeveniment per prevenir que efectivament es produeixi. + + +[STRING] + +

        Gambas fa servir el joc de caràcters UTF-8 per representar cadenes a la memòria.

        + +

        Però totes les funcions estàndard de cadenes del Gambas treballen amb ASCII: +Left, Mid, Right, UCase... + +

        Si voleu manipular cadenes UTF-8, heu de fer servir els mètodes de la classe estàtica String, els quals tenen el mateix nom que els seus homòlegs estàndards. + +

        PRINT Len("pròleg");; Left$("pròleg", 4)
        +7 prò
        +PRINT String.Len("pròleg");; String.Left("pròleg", 4)
        +6 pròl
        + + +[ASSIGNMENT] + +

        El Gambas implementa les dreceres d'assignació tal com els programadors de C/C++ fan servir també. + +

        LaMevaVariable += 2 és una equivalència de LaMevaVariable = LaMevaVariable + 2 + +

        LaMevaVariable &= "Pròleg" és una equivalència de LaMevaVariable = LaMevaVariable & "Pròleg" + +

        etc... + + +[DEBUG] + +

        Podeu fer servir l'instrucció DEBUG per a imprimir missatges de depuració a la consola (és a dir, la sortida d'errors estàndard). Es comporta exactament igual a la instrucció PRINT. + +

        Aquests son missatges prefixats amb el nom de la classe, nom del mètode i número de línia de la instrucció DEBUG. + +

        Els missatges de depuració es suprimeixen automàticament quan es crea un executable sense informació de depuració. + + +[TRY] + +

        La gestió d'errors al Gambas es fa amb les següents instruccions: +TRY, ERROR, CATCH, i FINALLY. + +

        TRY prova d'executar la sentència sense llançar l'error. La instrucció ERROR es fa servir just després de saber si la sentència s'ha executat correctament. + +

        TRY ElMeuFitxer = OPEN "/etc/password" FOR WRITE
        +IF ERROR THEN PRINT "No puc fer el que vull!"
        + + +[CATCH] + +

        La gestió d'errors al Gambas es fa amb les següents instruccions: +TRY, ERROR, CATCH, i FINALLY. + +

        CATCH indica el principi de la part de gestió d'errors d'una funció o procediment. +Es posa al final del codi de la funció. + +

        El part del catch s'executa si es produeix un error entre el principi i el final de la funció. + +

        Si es produeix un error dins la part del catch, aquest és tractat normalment. + +

        SUB ProcessFile(FileName AS STRING)
        +  ...
        +  OPEN FileName FOR READ AS #hFile
        +  ...
        +  CLOSE #hFile
        +CATCH ' S'executa només si hi ha un error
        +  PRINT "No es pot processar el fitxer "; FileName
        +END
        + + +[FINALLY] + +

        La gestió d'errors al Gambas es fa amb les següents instruccions: +TRY, ERROR, CATCH, i FINALLY. + +

        FINALLY inclou el codi que s'executa al final de la funció, fins i tot si s'ha produït un error durant la seva execució. + +

        La part finally no és obligatòria. Si hi ha una part catch a la funció, la part finally l'ha de precedir. + +

        Si es produeix un error dins la part del finally, aquest és tractat normalment. + +

        SUB ProcessFile(FileName AS STRING)
        +  ...
        +  OPEN FileName FOR READ AS #hFile
        +  ...
        +FINALLY ' S'executa sempre, fins i tot si s'ha produït un error
        +  CLOSE #hFile
        +CATCH ' S'executa només si hi ha un error
        +  PRINT "No es pot processar el fitxer "; FileName
        +END
        + + +[OPTIONAL] + +

        Les funcions i procediments al Gambas poden tenir paràmetres opcionals.

        + +

        Els paràmetres són opcionals simplement posant l'indicador OPTIONAL just a davant de la variable

        + +
        PRIVATE SUB LaMevaFuncio(param AS String, OPTIONAL optim AS String)
        +  ...
        +  PRINT param & " requerit, '" & optim "' opcional"
        +  ...
        +END
        +
        +'cridant la funció:
        +
        +LaMevaFuncio("parametre") 'sense argument opcional (si no cal)
        +LaMevaFuncio("parametre", "parametre_opcional")
        +
        + + +[ARRAY] + +

        Al Gambas podeu recórrer fàcilment una matriu d'una coŀlecció de variables amb la funció FOR EACH.

        + +

        Exemple:

        + +
        DIM xml AS NEW XmlDocument
        +DIM node AS XmlNode
        +DIM i AS Integer
        +
        +'Obre l'xml
        +xml.Open("pokus.xml")
        +'Children s'indexa via [i], perquè és una matriu
        +FOR i = 0 TO xml.Root.Children.Count - 1
        +  'Attributes es recorren via FOR EACH, perquè és una coŀlecció
        +  FOR EACH node IN xml.Root.Children[i].Attributes
        +    DEBUG node.Name;; Node.Value
        +  NEXT
        +NEXT
        + + +[ICON] + +

        Podeu fer servir les icones internes per a crear una interfície més agradable de la vostra aplicació, les quals estan disponibles en diverses mides (des de 16x16 fins a 128x128)

        + +

        Per exemple:

        + +
        Imatge1.Picture = Picture["icon:/32/warning"]
        + + +[SETTINGS] + +

        Si necessiteu desar la configuració del vostre programa (tal com la mida i posició de la finestra), llavors esteu de sort. Això és molt elegant i fàcil de fer a Gambas.

        + +

        Podeu desar tota la configuració d'un objecte, o només una propietat.

        + +

        Exemple:

        + +
        'Desa la posició d'un objecte
        +Settings.Write(ME)
        +
        +'Carrega l'objecte
        +Settings.Read(ME)
        +
        +'Desa la propietat
        +Settings["win/x"] = ME.X
        +
        +'Llegeix la propietat
        +'podeu utilitzar el valor per defecte com aquest: ["win/x", 0]
        +ME.X = Settings["win/x"]
        +
        + +

        Atenció: heu d'incloure el component: gb.settings

        + + +[EDITOR] + +

        Alguns consells de l'editor...

        + +

        Dues classes de comentaris

        + +
        ' Comentari normal
        +
        '' Comentari en negreta
        + +

        Els comentaris en negreta es fan servir per a documentar el vostre codi.

        + +

        Com utilitzar fragments de codi

        + +

        Si escriviu main i després premeu la tecla TAB, s'insereix automàticament al vostre codi una funció d'inici Main estàtica pública. + +

        Si escriviu ds i després premeu la tecla TAB, s'insereix automàticament una declaració de variable del tipus string, i seguidament ja podeu escriure el nom de la variable. + +

        Els fragments de codi són totalment configurables des del diàleg de les opcions globals de l'IDE. + + +[END] + +

        Ja heu llegit tots els consells del dia. Espero que us hàgiu convertit en un expert en Gambas! :-)

        + +

        Si voleu contribuir, envieu nous consells a l'adreça següent :

        +

        gambas@users.sourceforge.net

        + +

        Gràcies per endavant !

        + + + + +[MESSAGE] + +

        Per a informar als usuaris, podeu usar les classes del Gambas Message i Balloon. Message prové dels components (QT, GTK+)i el Balloon de gb.form.

        + +

        Message i Balloon tenen els següents tipus possibles: Message.Delete(), .Error(), .Info(), .Question() i .Warning()

        + +

        A cada botó del diàleg Message podeu establir les vostres pròpies etiquetes. Després de prémer el botó, us tornarà un valor numèric (de 1 a X, depenent del tipus i la quantitat de botons).

        + +
        DEBUG Message.Info("Bon dia món!")  'retornarà 1
        +
        +Message("Bon dia món!")  'El mateix però el formulari més curt
        + +

        Mentre creeu el Balloon heu de definir el contenidor pare. +Opcionalment podeu definir el temps de mostra en ms, i la posició X,Y.

        + +
        Balloon.Info("Bon dia món!", ME)
        +'Mostrarà el «ballon» dins el formulari principal
        +
        +'més reduït sense icona: Balloon("Bon dia món!", ME)
        diff --git a/app/src/gambas3/tips/tips.cs b/app/src/gambas3/tips/tips.cs new file mode 100644 index 00000000..a8a0d99d --- /dev/null +++ b/app/src/gambas3/tips/tips.cs @@ -0,0 +1,547 @@ +[WELCOME] + +

        Vítej v Gambasu !

        + +

        Gambas je grafické vývojové +prostředí založené na pokročilém Basic interpretovy.

        + +

        Cílem Gambasu je umožnit Vám, vytvářet +užitečné programy snadno a rychle. Ale čistota těchto programů +zůstává na vaší plné odpovědnosti...

        + +

        Užijte si to !

        + +

        Benoît Minisini
        +gambas@users.sourceforge.net

        + + +[STARTUP] + +

        Každý projekt musí mít hlavní třídu. Hlavní třída definuje +veřejnou statickou metodu nazvanou Main, argumentů, +která bude fungovat jako spouštěcí metoda vašeho programu.

        + +

        Hlavní třídu můžete nastavit tak, že ve stromu projektu kliknete +pravým tlačítkem myši a v popup menu vyberete položku Hlavní třída.

        + +

        Po startu není nutné nastavovat methodu Main, protože je již přednastavená.

        + +

        Tato metoda je zodpovědná za vytváření instance a poté zobrazení formuláře, jako ve +Visual Basic™.

        + + +[OPEN] + +

        Instrukci OPEN nemůžete použít v Gambasu +stejně jako ve Visual Basic. Soubor totiž nevrácí integer, +ale objekt File.

        + +

        Takže místo:

        + +
        DIM handle AS Integer
        +...
        +OPEN "myfile" FOR READ AS #handle
        + +

        musíte psát:

        + +
        DIM handle AS File
        +...
        +handle = OPEN "myfile" FOR READ
        + + +[CATDIR] + +Víte, že můžete spojit názvy adresářů a souborů operatorem &/ ? +

        Tento operátor se v případě potřeby postará +o správné přidání oddělovače '/' do cesty.

        + +

        Například:

        + +
        PRINT "/home/gambas" &/ ".bashrc"
        +/home/gambas/.bashrc
        +
        +PRINT "/home/gambas/" &/ "/tmp" &/ "foo.bar"
        +/home/gambas/tmp/foo.bar
        +
        + +

        No není to úžasné ?

        + + +[EXEC] + +

        Z celého projektu můžete vytvořit spustitelný soubor. Klikni v +menu Projekt a Vytvořit/Spustitelný....

        + +

        Když Gambas vytvoří spustitelný soubor, tak jej defaultně vloží +do stejné složky ve které se nachází projekt. +Spustitelný soubor má pak stejné jméno jako projekt.

        + + +[PATH] + +

        Relativní cesta má v Gambasu zvláštní význam. +Vždy se totiž odkazuje na soubory uvnitř svého projektů.

        + +

        Neexistuje žádný koncept akuálního adresáře, +ani žádné slovo pro změnu jako CHDIR.

        + +

        Buť tedy opatrný: musíš použít relativní cesty pouze pro přístup k +souborům projektu. Protože absolutní cesty již nefungují ve vytvořeném spustitelném programu.

        + + +[GLOBAL] + +

        V Gambasu nejsou globální proměnné!

        + +

        Jako dočasné řešení, je můžete vkládat do hlavního modulu a deklarovat je +jako PUBLIC.

        + +

        Pokud nemáte hlavní modul, ale hlavní formulář, +pak deklarujte jako STATIC PUBLIC.

        + +

        Pro přístup k těmto proměnným, musíte používat název modulu +nebo formuláře: MyMainModule.MyGlobalVariable nebo +MyMainForm.MyGlobalVariable.

        + + +[EMPTY] + +

        Chcete-li jestli je řetězec prázdný, není nutné srovnání s "" nebo používat +funkci Len(). Je možné testovat přímo, protože prázdný řetězec +je ekvivalentní k FALSE a neprázdný řetězec je ekvivalentní k TRUE.

        + +

        Například, než psát:

        + +
        IF Len(MyString) > 0 THEN ...
        +IF Len(MyString) = 0 THEN ...
        + +

        Místo toho můžete psát:

        + +
        IF MyString THEN ...
        +IF NOT MyString THEN ...
        + + +[TRANSLATE] + +

        Program napsaný v Gambasu je přeložitelný do jakéhokoli jazyka, +za předpokladu, že uvedete, které řezezce musí být přeloženy, a které ne.

        +

        Chcete-li označit řetězec pro překlad, stačí je uzavřít mezi kulaté závorky:

        + +

        PRINT ("Mě přelož")
        +PRINT "Ale mě nepřekládej!"
        + + +[EVENT] + +

        Každý ovládací prvek či objekt, kterému lze přiřadit událost, má +pozorovatele událostí a událost název skupiny.

        + +

        Pozorovatel události zachytává každou událost vyvolanou objektem. Název skupiny +událostí tvoří prefix volané procedury, která se stará o vykonání události.

        + +

        Defaultně je pozorovatel události tvořen mateřským objektem kontrolního prvku +a název skupiny je tvořen názvem kontrolního prvku.

        + +

        Touto cestou formulář dostává všechny události vyvolané vnitřními prvky.

        + +
        ' Gambas form
        +DIM hButton AS Button
        +
        +PUBLIC SUB _new()
        +  hButton = NEW Button(ME) AS "MyButton"
        +END
        +
        +PUBLIC SUB MyButton_Click()
        +  PRINT "You have clicked MyButton !"
        +END
        +
        + + +[FORM] + +

        V Gambasu, je formulář vlastní pozorovatel událostí, takže si +může svoje události spravovat přímo (jako Resize, +Activate, ...) ve svém vlastním kódu.

        + +

        Tímto způsobem, nováčci přícházející z Visual Basic +a nejsou dezorientovaný :-).

        + + +[EMBED] + +

        Do formuláře Gambasu můžete vložit jakýkoliv jiný formulář !

        + +

        Stačí předat rodičovský kontejner formuláře jako poslední argument konstruktoru.

        + +

        Například:

        +

        DIM hForm AS MyDialog
        +DIM hSuperControl AS MyForm

        +' Vytvoření dialogu
        +hForm = NEW MyDialog
        +' Vložení formuláře do tohoto dialogu
        +' Všimněte si, formulář má ještě dva parametry před rodičovským kontejner
        +hSuperControl = NEW MyForm(Param1, Param2, MyDialog)
        +' Nastavení polohy a velikosti formuláře
        +hSuperControl.Move(8, 8, 128, 64)
        +

        + +

        Buďte opatrní: formulář vložený do jiného formuláře je stále formulářem, +a tak ma i vlastního pozorovatele událostí.

        + + +[GROUP] + +

        Každý ovládací prvek ma vlastnost (Group) [skupinová akce]. +Pokud je tato vlastnost nastavena, tak název skupiny je předpona pro zpracování událostí +a ne název ovladacího prvku.

        + +

        Předpokládejme, že máte Button nazvaný btnAction +s následným zpracováním událostí Click:

        + +
        PUBLIC SUB btnAction_Click()
        + +

        Pokud nastavíte vlastnost (Group) v btnAction na +MyGroup, pak zpracování událostí bude od tlačítka příjímat +následující událost:

        + +
        PUBLIC SUB MyGroup_Click()
        + +

        Tato vlastnost umožňuje zpracovávat události z různých ovládacích prvků +v jedné funkci. A ovladací prvky vůbec nemusí být stejné!

        + +

        Poznámka: Zkušený veterán Visual Basicu možná pozná +pojem control array, ale v mnohem silnější implementaci. :-)

        + + +[TAG] + +

        Kazdý ovládací prvek má vlastnost Tag. Tato vlastnost je pro +programátory, a může obsahovat jakoukoli VARIANTu dat, +kterou považujete za relevantní.

        + +

        Je to velmi užitečné, když chcete odlišit různé ovládací prvky +stejné skupiny při společném zpracování událostí.

        + + +[LAST] + +

        Klíčové slovo LAST vrací objekt posledního ovládacího prveku, od kterého +obdržel událost. Je to velmi užitečné, pokud chcete psát obsluhu událostí, +která je nezávislá na názvech prvků.

        + +

        Například, předpokládejme, že chceme napsat program kalkulačky. +Máte nadefinovaná tlačítka pro každé z deseti čísel. Každé je +ve stejné skupině (group) "Digit". Tag každého prvku +má nastaveno číslo, které je na tlačítku. Zpracování události pak +může vypadat takhle:

        + +

        PUBLIC SUB Digit_Click()

        +  Display = Display & LAST.Tag
        +  RefreshDisplay

        +END

        + + +[LEFT] + +

        Známé rutiny BASICu jako Left$, Right$ +a Mid$ jsou i v Gambasu

        + +

        Druhý parametr Left$ a Right$ je volitelný, +a defultni hodnota je 1.

        + +

        Left$("Gambas") vrací "G"
        +Right$("Gambas") vrací "s"

        + +

        Tento druhý parametr může být i záporný, a +pak udává počet znaků od konce řetězce.

        + +

        Left$("Gambas", -2) vrací "Gamb"
        +Right$("Gambas", -2) vrací "mbas"

        + +

        Podobně, tak třetí parametr v Mid$ může být záporný, a +pak udává počet znaků od konce řetězce.

        + +

        Mid$("Gambas", 2, -2) vrací "amb"

        + + +[OBSERVER] + +

        Třída Observer (pozorovatel událostí) vám umožňuje zachytit všechny události +vyvolané objekty ještě před tím než jsou skutečně poslány.

        + +
        MyTextBox = NEW TextBox(ME) AS "MyTextBox"
        +MyObserver = NEW Observer(MyTextBox) AS "MyObserver"
        +...
        +PUBLIC SUB MyObserver_KeyPress()
        +  DEBUG "Spuštěno první"
        +END
        +
        +PUBLIC SUB MyTextBox_KeyPress()
        +  DEBUG "Spuštěno další"
        +END
        + +

        Pozorovatel událostí může zastavit událost, v zájmu ochrany objektu.

        + + +[STRING] + +

        Gambas používá pro reprezentaci řetězců v paměti znakovou sadu UTF-8.

        + +

        Ale všechny standartní řetezcové funkce pracují s ASCII: +Left, Mid, Right, UCase...

        + +

        Pokud chcete pracovat s UTF-8 řetězci, musíte používat metody statické třídy String, +které mají stejné názvy jako jejich standartní protějšky.

        + +
        PRINT Len("bébé");; Left$("bébé", 3)
        +6 bé
        +PRINT String.Len("bébé");; String.Left("bébé", 3)
        +4 béb
        + + +[ASSIGNMENT] + +

        Gambas implementuje zkrácené přiřazování na +které jsou zvykli programátoři z C/C++.

        + +

        MyVariable += 2 je ekvivalent +MyVariable = MyVariable + 2

        + +

        MyVariable *= 4 je ekvivalent +MyVariable = MyVariable * 4

        + +

        MyVariable &= "Great" je ekvivalent +MyVariable = MyVariable & "Great"

        + +

        A tak dále...

        + + +[DEBUG] + +

        Také můžete používat instrukci DEBUG pro tisk ladících zpráv do +konzole (tedy standartní chybový výstup). Chová se stejně jako instrukce PRINT.

        + +

        Tyto zprávy obsahuji název třídy, název metody a číslo řádku +z místa volání instrukce DEBUG.

        + +

        Při vytváření spustitelného souboru jsou ladící zprávy automaticky odstraněny.

        + + +[TRY] + +

        Správa řízení chyb je v Gambasu řízena skrze instrukce: +TRY, ERROR, CATCH, a FINALLY. + +

        TRY se pokusí provést výraz bez chyb. Instrukce ERROR +se používá aby se vědělo, jestli byl výraz proveden správně.

        + +
        TRY MyFile = OPEN "/etc/password" FOR WRITE
        +IF ERROR THEN PRINT "Nemůžu dělat, to co chci!"
        + + +[CATCH] + +

        Správa řízení chyb je v Gambasu řízena skrze instrukce: +TRY, ERROR, CATCH, a FINALLY.

        + +

        CATCH označuje začátek řízení chyb části funkce nebo procedůry. +Píše se na konec kodu funkce.

        + +

        Catch blok se provede jen tehdy, když se uvnitř výkoného bloku kodu, vyskytne chyba.

        + +

        Vyskatne-li se chyba během provádění bloku catch, je běžně zobrazena.

        + +
        SUB ProcessFile(FileName AS STRING)
        +  ...
        +  OPEN FileName FOR READ AS #hFile
        +  ...
        +  CLOSE #hFile
        +CATCH ' Vykonán pouze v případě, že se vyskytla chyba
        +  PRINT "Nemůže zpracovat soubor "; FileName
        +END
        + + +[FINALLY] + +

        Správa řízení chyb je v Gambasu řízena skrze instrukce: +TRY, ERROR, CATCH, a FINALLY.

        + +

        FINALLY zavádí kód vykonání na konci funkce, +i když byla chyba vyvolána během jejího plnění.

        + +

        Finally blok není povinný. Je-li tu blok Catch blok ve funkci, +tak musí finally blok předcházet.

        + +

        Vyvstane-li chyba během provádění Finally bloku, je běžně zobrazena.

        + +
        SUB ProcessFile(FileName AS STRING)
        +  ...
        +  Open FileName For Read As #hFile
        +  ...
        +Finally ' Provedeno vždy, i když byla chyba vyvolána
        +
        +  Close #hFile
        +  
        +Catch ' Vykonán pouze v případě, že se vyskytla chyba
        +  
        +  Print "Cannot print file "; FileName
        +  
        +End
        + + +[OPTIONAL] + +

        Funke a procedry v Gambasu mohou mít volitelné parametry.

        + +

        Provádí se to tak že se před název proměnné napíše instrkukce OPTIONAL. +A ta oznamuje že je parametr volitelný.

        + +
        PRIVATE SUB MyFunction(param AS String, OPTIONAL optim AS String)
        +  ...
        +  PRINT "povinný " & param & ", nepovinný '" & optim "'"
        +  ...
        +END
        +
        +'volání v kodu:
        +
        +MyFunction("parametr") 'není-li za potřebí tak se nemusí volat
        +MyFunction("parametr", "param")
        +
        + + +[ARRAY] + +

        V Gambasu se dají procházet proměnné (typu array, collection) za pomocí FOR EACH +(pro collection a pole) nebo FOR cyklus (pro pole)

        + +

        Například:

        + +
        DIM xml AS NEW XmlDocument
        +DIM node AS XmlNode
        +DIM i AS Integer
        +
        +'otevre xml
        +xml.Open("pokus.xml")
        +'Children se musi indexovat přes [i]!, je to array
        +FOR i = 0 TO xml.Root.Children.Count - 1
        +  'Attributes se musí procházet přes FOR EACH, je to collection
        +  FOR EACH node IN xml.Root.Children[i].Attributes
        +    DEBUG node.Name;; Node.Value
        +  NEXT
        +NEXT
        + + +[ICON] + +

        Můžete použít i vestavěné ikony pro doplnění krásy své aplikace, +a máte zde i například na výběr rozměr od 16x16 až po 128x128

        + +

        Například:

        + +
        Image1.Picture = Picture["icon:/32/warning"]
        +Image2.Picture = Picture["icon:/small/error"]
        +
        + +

        Pozor: musíte mít zapnutou komponentu: gb.form. + + +[SETTINGS] + +

        Pokud si potřebujete uložit konfigurací programu, +jako je třeba velikost a poloha okna, je to jednodušší než jste čekaly.

        + +

        Můžete ukládat konfiguraci celého objektu, nebo jen jeho dílčí hodnotu.

        + +

        Například:

        + +
        'uložení polohy onjektu
        +Settings.Write(ME)
        +
        +'Načtení objektu
        +Settings.Read(ME)
        +
        +'Uložení hodnoty
        +Settings["win/x"] = ME.X
        +
        +'Načtení hodnoty
        +'lze zadat i defaultni hodnotu: ["win/x", 0]
        +ME.X = Settings["win/x"]
        +
        + +

        Pozor: musíte mít zapnutou komponentu: gb.settings

        + + +[MESSAGE] + +

        V Gambasu můžete pro informování uživatele užít následující třídy: +Message a Balloon. +Message je z komponenty (QT, GTK+), a Balloon z gb.form.

        + +

        Třída Message a Balloon má možné typy: +Message.Delete(), .Error(), .Info(), .Question() a .Warning()

        + +

        U každého Message jdou nastavit i vlastní popisky tlačítek, po zmáčknutí tlačítka v dialogu je +vrácena číselná hodnota tlačítka od 1 do X, dle typu a počtu tlačítek.

        + +
        DEBUG Message.Info("Ahoj světe!")  'vrátí číslo 1
        +
        +Message("Ahoj světe!")  'To samé zkráceně
        + +

        Při vytváření Balloon se musí uvést rodičovský kontejner, volitelně jde nastavit i pozice X a Y, +lze nastavit i prodleva zobrazení v ms a font.

        + +
        Balloon.Info("Ahoj světe!", ME)  'zobrazí bublinu na hlavním formuláři
        +
        +'lze zkátit na: Balloon("Ahoj světe!", ME) ale pak je bez ikony
        +
        + + +[SUBST] + +

        Pro jednoduší překlad textů v gambasu je možno použít substituci, +instrkukce Subst().

        + +

        Má minimalné 2 parametry, kde první je textová maska na kterou se substituce aplikuje, +další parametry jsou vaše proměnné, kde první vložený parametr má pořadové číslo 1. +Jako substituční znak se užívá &1, &2, ..., číslo je dle pořadí vložené proměnné.

        + +
        Subst(("Nahrazeni za &1, &2 a &3"), "prvni", "druhou", "dalsi")
        +
        +'vypise:
        +'Nahrazeni za prvni a za druhou, dalsi
        + + +[EDITOR] + +

        Několik typů v editoru:

        + +

        Dva typy komentářů:

        + +
        'normální komentář
        +
        ''tučný komentář
        + +

        Tučné komentáře jsou používány pro dokumentování kódu.

        + +

        Jak používat úryvky kodu:
        + +'napíšete: +

        main
        +'a pak zmáčknete tabulátor, a doplní se útržek kódu,
        +'podle toho jak je v nastavení definován +

        + +

        Úryvky kodu jsou zcela konfigurovatelné z globálního dialogu nastavení IDE.

        + + +[END] + +

        Přečetly jste všechny tipy dnů. Doufám, že jste se stal +nyní odborníkem na Gambas ! :-)

        + +

        Pokud chcete přidat nové tipy z vaší vlastní zkušenosti, +neváhejte a pošlete je na adresu:

        + +

        gambas@users.sourceforge.net

        + +

        Díky předem !

        + diff --git a/app/src/gambas3/tips/tips.de b/app/src/gambas3/tips/tips.de new file mode 100644 index 00000000..6afe1578 --- /dev/null +++ b/app/src/gambas3/tips/tips.de @@ -0,0 +1,417 @@ +[WELCOME] + +

        Willkommen zu Gambas!

        + +

        Gambas ist eine graphische IDE, die auf einem modernen Basic-Interpreter basiert.

        + +

        Gambas möchte Sie in die Lage versetzen, schnell und einfach komplexe Programme zu schreiben. +Sauberes Programmieren bleibt natürlich Ihr Verantwortungsbereich...

        + +

        Viel Spaß damit!

        + +

        Benoît Minisini
        +gambas@users.sourceforge.net

        + + +[STARTUP] + +

        Jedes Projekt braucht eine Startklasse. Diese muss eine +gemeinsame (statische) Methode namens Main ohne Argumente definieren, +die dann als Startpunkt für die Anwendung fungiert.

        + +

        Sie können die Startklasse definieren, indem Sie im Projektfenster mit der rechten Maustaste +darauf klicken und Startklasse im Popupmenü auswählen.

        + +

        Wenn die Startklasse ein Formular ist, muss sie keine Methode Main besitzen, +da ein Formular bereits eine vorgefertigte mitbringt.

        + +

        Diese vordefinierte Methode tut dasselbe wie es in Visual +Basic™ Standard ist: Das Formular wird instanziert und +angezeigt.

        + + +[OPEN] + +

        Die OPEN-Anweisung von Gambas funktioniert nicht +wie die in Visual Basic™. Sie liefert keine Dateinummer zurück, +sondern ein File-Objekt.

        + +

        Also, anstatt

        + +
        DIM handle AS Integer
        +...
        +OPEN "myfile" FOR READ AS #handle
        + +

        schreiben Sie:

        + +
        DIM handle AS File
        +...
        +handle = OPEN "myfile" FOR READ
        + + +[CATDIR] + +

        Wussten Sie, dass Sie Verzeichnis- und Dateinamen mit dem +&/-Operator +zusammenhängen können? Dieser Operator kümmert sich automatisch um die +Schrägstriche, sodass +im Ergebnis weder welche fehlen noch doppelt vorhanden sind.

        + +

        Zum Beispiel:

        + +
        PRINT "/home/gambas" &/ ".bashrc"
        +/home/gambas/.bashrc
        +
        +PRINT "/home/gambas/" &/ "/tmp" &/ "foo.bar"
        +/home/gambas/tmp/foo.bar
        +
        + +

        Ist das nicht praktisch?

        + + +[EXEC] + +

        Sie können eine ausführbare Datei aus Ihrem gesamten Projekt machen. +Wählen Sie Ausführbare Datei erstellen aus dem Menü Projekt.

        + +

        Wenn Gambas eine ausführbare Datei erstellt, legt es das Ergebnis +direkt im Verzeichnis Ihres Projekts ab. Der Name der Datei ist der des Projekts.

        + + +[PATH] +

        +Relative Pfade haben in Gambas eine spezielle Bedeutung. +Sie verweisen immer auf Dateien innerhalb Ihrer Projekte. +

        +Es gibt kein Konzept von current directory, und keinen Befehl wie +CHDIR, um es zu ändern. +

        +Vorsicht: um Projektdateien zu öffnen, dürfen Sie nur relative +Pfadangaben verwenden, weil absolute Pfadangaben nicht mehr vorhanden sind, +wenn Sie eine ausführbare Datei erstellt haben. + + +[GLOBAL] + +In Gambas gibt es keine globalen Variablen! +

        +Hilfsweise können Sie solche Variablen im Modul Main definieren und als +PUBLIC deklarieren. +

        +Wenn Sie in Ihrem Projekt kein Modul Main haben, sondern ein Formular +Main, dann deklarieren Sie sie dort als STATIC PUBLIC. +

        +Um diese Variablen zu verwenden, müssen Sie den Namen des Moduls/Formulars +Main angeben: MyMainModule.MyGlobalVariable oder +MyMainForm.MyGlobalVariable. + + +[EMPTY] + +

        Wenn Sie prüfen wollen, ob ein String leer ist, müssen Sie nicht die +Len()-Funktion verwenden. Sie können den String direkt mit IF +testen, da ein leerer String FALSE und ein nicht-leerer TRUE +ergibt.

        + +

        Also, anstatt

        + +
        IF Len(MyString) > 0 THEN ...
        +IF Len(MyString) = 0 THEN ...
        + +

        sollten Sie schreiben:

        + +
        IF MyString THEN ...
        +IF NOT MyString THEN ...
        + + +[TRANSLATE] + +

        Gambas-Anwendungen sind übersetzbar, vorausgesetzt Sie geben an, welche +Ausdrücke übersetzt werden sollen und welche nicht.

        +

        Um Ausdrücke zum Übersetzen zu markieren, setzen Sie sie einfach in +Klammern:

        + +

        PRINT ("Übersetze mich")
        +PRINT "Aber mich nicht übersetzen!"
        + + +[EVENT] + +

        Jedes Steuerelement und jedes Objekt kann Events auslösen. Es besitzt +einen Event-Observer und einen Event-Gruppennamen.

        + +

        Der Event-Observer fängt jedes vom Objekt ausgelöste Event auf, und +der Event-Gruppenname ist das Präfix des Methodennamens, der beim Auslösen +des Events aufgerufen wird.

        + +

        Standardmäßig ist der Event-Observer das Objekt, in dem Sie das Steuerelement +erstellt haben, und der Gruppenname ist der Name des Elements.

        + +

        Auf diese Art und Weise erhält ein Formular die Events aller seiner +Steuerelemente.

        + +
        ' Gambas form
        +DIM hButton AS Button
        +
        +PUBLIC SUB _new()
        +  hButton = NEW Button(ME) AS "MyButton"
        +END
        +
        +PUBLIC SUB MyButton_Click()
        +  PRINT "Sie haben auf MyButton geklickt!"
        +END
        +
        + + +[FORM] + +

        In Gambas ist ein Formular sein eigener Event-Observer, +sodass Sie seine Events (wie Resize, Activate etc.) im +Code der Klasse selbst managen können.

        + +

        Auf diese Weise werden auch Umsteiger von Visual Basic™ +nicht orientierungslos :-).

        + + +[EMBED] + +

        Sie können jedes Formular in andere Formulare mit Gambas +einbetten!

        + +

        Um so etwas mächtiges zu tun, erstellen Sie einfach eine Instanz des Formulars, +wobei Sie als letztes Argument für den Konstruktor den Container für die Form angeben.

        + +

        Zum Beispiel:

        +

        DIM hForm AS MyDialog
        +DIM hSuperControl AS MyForm

        +' Dialog erstellen
        +hForm = NEW MyDialog
        +' Formular in den Dialog einfügen
        +' Achtung: Diese Form hat zwei Konstruktorargumente vor dem Containerargument
        +hSuperControl = NEW MyForm(Param1, Param2, MyDialog)
        +' Die Form auf die richtige Größe bringen
        +hSuperControl.Move(8, 8, 128, 64)
        +

        + +

        Achtung: Eine eingebettete Form ist immer noch ihr eigener Event-Observer und +erhält damit ihre Events selbst!

        + + +[GROUP] + +

        Jedes Steuerelement hat eine (Group)-Eigenschaft. Wenn diese Eigenschaft +gesetzt ist, ist das Präfix des Eventhandlers eben dieser Gruppenname und nicht +der Namen des Elements.

        + +

        Nehmen wir an, Sie haben einen Button namens btnAction mit +folgendem Click-Eventhandler:

        + +
        PUBLIC SUB btnAction_Click()
        + +

        Wenn Sie die (Group)-Eigenschaft auf MyGroup setzen, sieht der +Eventhandler, der die Events des Buttons erhält, so aus:

        + +
        PUBLIC SUB MyGroup_Click()
        + +

        Dadurch können Sie die Events von verschiedenen Steuerelementen in einer +einzelnen Funktion behandeln. Die Steuerelemente einer Gruppe müssen nicht vom +selben Typ sein!

        + +

        Bemerkung: Der Visual Basic™-Veteran mag das Konzept der +Control Arrays wiedererkennen, aber in einer leistungsfähigeren Implementation. :-)

        + + +[TAG] + +

        Jedes Steuerelement hat eine Tag-Eigenschaft, genau wie in +Visual Basic™. Sie erfüllt für das Objekt selbst keinen Zweck, +sondern kann vom Programmierer benutzt werden, um irgendwelche VARIANT-Daten +zu speichern, die er für nützlich hält.

        + +

        Das ist zum Beispiel praktisch, wenn Sie mehrere Steuerelemente derselben Gruppe +in einem Eventhandler unterscheiden wollen.

        + + +[LAST] + +

        Das LAST-Schlüsselwort gibt das letzte Steuerelement zurück, +das ein Event ausgelöst hat. Dies ist sehr nützlich, wenn Sie einen Eventhandler +schreiben wollen, der vom Namen eines Elements unabhängig ist.

        + +

        Zum Beispiel, wenn Sie einen Taschenrechner schreiben wollen, können Sie zehn +Buttons erstellen, einen für jede Ziffer, und jeden in derselben Gruppe namens "Digit". +Angenommen, Sie setzen die Tag-Eigenschaft von jedem Button auf die Ziffer, die er +repräsentiert, dann können Sie folgenden Eventhandler schreiben:

        + +

        PUBLIC SUB Digit_Click()

        +  Display = Display & LAST.Tag
        +  RefreshDisplay

        +END

        + + +[LEFT] + +

        Die bekannten BASIC-Routinen Left$, Right$ +und Mid$ sind in Gambas verbessert:

        + +

        Der zweite Parameter von Left$ und Right$ ist optional, und +standardmäßig 1.

        + +

        Left$("Gambas") ergibt "G"
        +Right$("Gambas") ergibt "s"

        + +

        Er kann auch negativ sein und gibt so die Anzahl Zeichen an, die nicht +zurückgegeben werden sollen.

        + +

        Left$("Gambas", -2) ergibt "Gamb"
        +Right$("Gambas", -2) ergibt "mbas"

        + +Genauso kann das dritte Argument von Mid$ negativ sein und gibt +dann die Anzahl an Zeichen vom Ende des Strings an, die nicht zurückgegeben werden sollen.

        + +

        Mid$("Gambas", 2, -2) ergibt "amb" + + +[OBSERVER] + +

        Die Observer-Klasse erlaubt es, alle Ereignisse eines Objekts +abzufangen, bevor sie tatsächlich gesendet werden.

        + +
        MyTextBox = NEW TextBox(ME) AS "MyTextBox"
        +MyObserver = NEW Observer(MyTextBox) AS "MyObserver"
        +...
        +PUBLIC SUB MyObserver_KeyPress()
        +  DEBUG "Got it first"
        +END
        +
        +PUBLIC SUB MyTextBox_KeyPress()
        +  DEBUG "Got it next"
        +END
        + +Der Observer kann ein Ereignis abbrechen, um zu vermeiden, dass ein +Objekt es überhaupt auslöst. + + +[STRING] + +

        Gambas verwendet den UTF-8-Zeichensatz, um Ausdrücke im +Arbeitsspeicher zu verwalten.

        + +

        Aber alle standardmäßigen Stringfunktionen von Gambas verwenden +ASCII: +Left, Mid, Right, UCase... + +

        Wenn Sie UTF-8-Ausdrücke bearbeiten wollen, müssen Sie die Methoden der +statischen String-Klasse verwenden, die den gleichen Namen haben wie +ihre standardmäßigen Entsprechungen. + +

        PRINT Len("bébé");; Left$("bébé", 3)
        +6 bé
        +PRINT String.Len("bébé");; String.Left("bébé", 3)
        +4 béb
        + + +[ASSIGNMENT] + +

        Gambas hat die Zuweisungs-Abkürzungen eingebaut, die C/C++ Programmierer +gewohnt sind. + +

        MyVariable += 2 ist gleichbedeutend mit MyVariable = +MyVariable + 2 + +

        MyVariable &= "Great" ist dasselbe wie +MyVariable = MyVariable & "Great" + +

        Und so weiter... + + +[DEBUG] + +

        Sie können die DEBUG-Anweisung benützen, um Debug-Meldungen auf +der Konsole auszugeben (vor allem die standardmäßigen Fehlerausgaben). Das +funktioniert genau so wie die PRINT-Anweisung. + +

        Bei diesen Meldungen wird die Klasse, Methode und Zeilennummer der +DEBUG-Anweisung vorangestellt. + +

        Die Debug-Meldungen werden automatisch gelöscht, wenn eine ausführbare +Datei ohne Debug-Informationen erstellt wird. + + +[TRY] + +

        Die Fehlerbehandlung wird in Gambas mit folgenden Befehlen ausgeführt: +TRY, ERROR, CATCH, und +FINALLY. + +

        TRY versucht, einen Befehl auszuführen, ohne einen Fehler +auszulösen. Die Anweisung ERROR wird direkt danach verwendet, um +zu prüfen, ob der Befehl korrekt ausgeführt werden konnte. + +

        TRY MyFile = OPEN "/etc/password" FOR WRITE
        +IF ERROR THEN PRINT "Ich kann nicht!"
        + + +[CATCH] + +

        Die Fehlerbehandlung wird in Gambas mit folgenden Befehlen ausgeführt: +TRY, ERROR, CATCH, und +FINALLY. + +

        CATCH zeigt den Beginn einer Fehlerbehandlungsroutine in einer +Funktion oder Prozedur an. +Dieser Befehl wird ans Ende des Codes gestellt. + +

        Die CATCH-Anweisung wird ausgeführt, wenn ein Fehler zwischen dem Anfang +und dem Ende der Funktion oder Prozedur auftritt. + +

        Wenn während der Verarbeitung der CATCH-Anweisung ein Fehler auftritt, +wird er er normal angezeigt. + +

        SUB ProcessFile(FileName AS STRING)
        +  ...
        +  OPEN FileName FOR READ AS #hFile
        +  ...
        +  CLOSE #hFile
        +CATCH ' wird nur ausgeführt, wenn ein Fehler auftritt
        +  PRINT "Kann Datei nicht laden "; FileName
        +END
        + + +[FINALLY] + +

        Die Fehlerbehandlung wird in Gambas mit folgenden Befehlen ausgeführt: +TRY, ERROR, CATCH, und +FINALLY. + +

        FINALLY leitet den Code am Ende der Funktion ein, der +ausgeführt wird, selbst wenn ein Fehler in der Funktion aufgetreten ist. + +

        Der Abschnitt FINALLY ist nicht obligatorisch. Wenn in der Funktion eine +CATCH-Anweisung vorkommt, muss FINALLY davor stehen. + +

        Wenn im FINALLY-Abschnitt ein Fehler auftritt, wird er normal angezeigt. + +

        SUB ProcessFile(FileName AS STRING)
        +  ...
        +  OPEN FileName FOR READ AS #hFile
        +  ...
        +FINALLY ' wird immer ausgeführt, auch wenn ein Fehler auftritt
        +  CLOSE #hFile
        +CATCH ' wird nur bei einem Fehler ausgeführt
        +  PRINT "Kann die Datei nicht ausgeben "; FileName
        +END
        + + +[END] + +

        Jetzt haben Sie alle Tipps des Tages gelesen. Ich hoffe, Sie sind jetzt ein +Gambas-Experte geworden! :-)

        + +

        Wenn Sie neue Tipps beisteuern wollen, senden Sie sie an folgende Adresse:

        +

        gambas@users.sourceforge.net

        + +

        Danke im Voraus!

        + +

        Deutsche Übersetzung der Tipps: Georg Brandl, g.brandl@gmx.net

        + diff --git a/app/src/gambas3/tips/tips.en b/app/src/gambas3/tips/tips.en new file mode 100644 index 00000000..b22a8a19 --- /dev/null +++ b/app/src/gambas3/tips/tips.en @@ -0,0 +1,592 @@ +[WELCOME] + +

        Welcome to Gambas!

        + +

        Gambas is a graphical development +environment based on an advanced Basic interpreter.

        + +

        Gambas aims at enabling you to make +powerful programs easily and quickly. But clean programs +remain on your own responsibility...

        + +

        Enjoy it !

        + +

        Benoît Minisini
        +g4mba5@gmail.com


        + + +[STARTUP] + +

        Startup class

        + +

        Each project must have a startup class. This +startup class must define a static public method named Main +with no arguments, that will act as the startup method of +your program.

        + +

        You can define the startup class by clicking on it with the +right mouse button in the project tree, and by selecting +Startup class in the popup menu.

        + +

        It is not necessary to define a Main method in a startup +form, because it already has a predefined one.

        + +

        This predefined startup method instanciates the form and shows it, like in +Visual Basic™.

        + + +[OPEN] + +

        Open

        + +

        The Open instruction of Gambas does not +work like the Visual Basic™ one. It does not return the file +as an integer, but as a File object.

        + +

        So, instead of typing :

        + +
        Dim handle As Integer
        +...
        +Open "myfile" For Read As #handle
        + +

        you must type :

        + +
        Dim handle As File
        +...
        +handle = Open "myfile" For Read
        + + +[CATDIR] + +

        Path concatenation

        + +

        Do you know that you can concatenate directory names and +file names with the &/ operator ? This operator +deals with the trailing slashes so that the resulting path is +perfect.

        + +

        For example:

        + +
        Print "/home/gambas" &/ ".bashrc"
        +→ /home/gambas/.bashrc
        +
        +Print "/home/gambas/" &/ "/tmp" &/ "foo.bar"
        +→ /home/gambas/tmp/foo.bar
        +
        + +

        Isn't it marvelous ?

        + + +[EXEC] + +

        Executable

        + +

        You can make an executable file from your entire project. Select +Make executable in the Project menu.

        + +

        When Gambas makes an executable file, it puts +the result in the directory of your project by default. +The executable name has the same name as your project.

        + + +[PATH] + +

        Relative paths

        + +

        Relative paths have a special meaning in Gambas. +They always refer to files inside your projects.

        +

        +There is no concept of current directory, and no keyword like +CHDIR to change it.

        +

        +Be careful: you must use relative paths only for accessing +project files, because absolute paths won't work anymore when +you make an executable.

        + + +[GLOBAL] + +

        Global variables

        + +There is no global variables in Gambas! +

        +As a workaround, put them in your main module and declare them +as Public.

        +

        +If you do not have a main module in your project, but a main +form, then declare them as Static Public.

        +

        +To access these variables, you must use the name of the main module +or form: MyMainModule.MyGlobalVariable or +MyMainForm.MyGlobalVariable.

        + + +[EMPTY] + +

        Empty strings

        + +

        To know if a string is empty, it is not necessary to use the +Len() function. You can directly test it, as an empty string +is False and a non-empty string is True.

        + +

        For example, instead of doing :

        + +
        If Len(MyString) > 0 Then ...
        +If Len(MyString) = 0 Then ...
        + +

        You should do :

        + +
        If MyString THEN ...
        +If Not MyString THEN ...
        + + +[TRANSLATE] + +

        Translation

        + +

        Gambas applications are fully translatable, provided that you tell it +which strings must be translated, and which one must not.

        +

        To mark strings as translatable, just enclose them between braces:

        + +
        Print ("Translate me")
        +Print "But do not translate me!"
        + + +[SUBST] + +

        Subst$

        + +

        The Subst$() function is very useful to internationalize your application.

        + +

        It takes at least two arguments. The first one is the text mask which the substitution applies on. +The other ones are the substitution arguments, numbered from one.

        + +

        Each &X pattern in the substitution string will be replaced by the Xth substitution argument. +For example:

        + +
        Print Subst(("Substitution of &1, &2 and &3"),
        +  "first", "second", "third")
        +
        +→ Substitution of first, second and third
        + + +[EVENT] + +

        Event Handlers

        + +

        Every control, and every object that can raise events, has an +event observer and an event group name.

        + +

        The event observer catches every event raised by the object, and +the event group name is the prefix of the procedure called to manage +the event. That function is called event handler.

        + +

        By default, this event observer is the object where you have +created the control, and the group name is the name of the control.

        + +

        This way, a form receives all events raised by the controls you +created inside.

        + +
        ' Gambas form
        +Dim hButton As Button
        +
        +Public Sub _new()
        +  hButton = New Button(Me) As "MyButton"
        +End
        +
        +Public Sub MyButton_Click()
        +  Print "You have clicked MyButton !"
        +End
        +
        + + +[GROUP] + +

        Control groups

        + +

        Every control has a (Group) property. When this property +is set, the prefix of the event handler name is the name of the group +and not the name of the control.

        + +

        Let's suppose you have a Button named btnAction +with the following Click event handler :

        + +
        Public SubbtnAction_Click()
        + +

        If you set the (Group) property of btnAction to +"MyGroup", then the event handler that will receive events from +the button will be the following :

        + +
        Pubic Sub MyGroup_Click()
        + +

        This property lets you handle events of different controls in +a single function. And the controls of the same group do not need +to have the same type !

        + +

        Note : The old Visual Basic™ veteran may recognize +the concept of control array, but in a more powerful +implementation. :-)

        + + +[FORM] + +

        Forms

        + +

        In Gambas, a form is its own event observer, so that +you can directly manage its events (like Resize, +Activate, ...) into its own class code.

        + +

        This way, newbies coming from Visual Basic™ are not +disorientated :-).

        + + +[EMBED] + +

        Embedding forms

        + +

        You can embed any form into other forms with Gambas!

        + +

        To do such a powerful thing, just instanciate the form by passing +a parent container as last argument of the constructor.

        + +

        For example:

        +
        Dim hForm As MyDialog
        +Dim hSuperControl As MyForm
        +' Create a dialog
        +hForm = New MyDialog
        +' Insert a form into this dialog
        +' Note that this form takes two parameters before the container
        +hSuperControl = New MyForm(Param1, Param2, MyDialog)
        +' Moves and resizes the form
        +hSuperControl.Move(8, 8, 128, 64)
        +
        + +

        Be careful: a form embedded into another form is still a form, and +so is its own event observer.

        + + +[TAG] + +

        Tag Property

        + +

        Each control has a Tag property. This property is for the +programmer, and can contain any Variant data that you find +relevant.

        + +

        This is very useful, when you want to distinguish controls of the +same group in a common event handler.

        + + +[LAST] + +

        Last

        + +

        The Last keyword returns the last control that has +received an event. This is very useful when you want to write an +event handler that is independent of any control name.

        + +

        For example, let's suppose you want to write a calculator program. +You have defined ten buttons, one for each digit, each one in the +same control group "Digit". The Tag of each control is set to +the digit drawn in the button.

        + +

        Your event handler may look like that :

        + +
        Public Sub Digit_Click()
        +
        +  Display = Display & Last.Tag
        +  RefreshDisplay
        +END
        +
        + + +[LEFT] + +

        Left$ / Mid$ / Right$

        + +

        The well known BASIC routines Left$, Right$ +and Mid$ have useful behaviours in Gambas

        + +

        The second parameter of Left$ and Right$ is +optional, and is one by default.

        + +

        Left$("Gambas") returns "G"
        +Right$("Gambas") returns "s"

        + +

        This second parameter can be negative, and then gives the number +of characters not to extract.

        + +

        Left$("Gambas", -2) returns "Gamb"
        +Right$("Gambas", -2) returns "mbas"

        + +

        Likewise, the third argument of Mid$ can be negative, and +then gives the number of characters from the end of the string +not to extract.

        + +

        Mid$("Gambas", 2, -2) returns "amb"

        + + +[OBSERVER] + +

        Observer

        + +

        The Observer class allows you to intercept all events raised +by an object before they are actually sent.

        + +
        MyTextBox = New TextBox(Me) As "MyTextBox"
        +MyObserver = New Observer(MyTextBox) As "MyObserver"
        +...
        +Public Sub MyObserver_KeyPress()
        +  Debug "Got it first"
        +End
        +
        +Public Sub MyTextBox_KeyPress()
        +  Debug "Got it next"
        +End
        + +

        The observer can cancel the event with Stop Event to prevent the object from effectively +raising it.

        + + +[STRING] + +

        UTF-8 Strings

        + +

        Gambas uses the UTF-8 charset to represent strings in memory.

        + +

        But all standard string functions deal with ASCII only: +Left, Mid, Right, UCase...

        + +

        If you want to deal with UTF-8 strings, you have to use the methods of the +String static class, which have the same name as their standard counterparts.

        + +
        Print Len("bébé");; Left$("bébé", 3)
        +→ 6 bé
        +
        +Print String.Len("bébé");; String.Left("bébé", 3)
        +→ 4 béb
        + + +[ASSIGNMENT] + +

        Assignments

        + +

        Gambas implements the assignment shortcuts that the C/C++ programmers are used to.

        + +
        MyVariable += 2
        +MyVariable *= 4
        +MyVariable &= "Great"
        +is an equivalent of +
        MyVariable = MyVariable + 2
        +MyVariable = MyVariable * 4
        +MyVariable = MyVariable & "Great"
        + +

        And so on...

        + + +[DEBUG] + +

        Debug

        + +

        You can use the Debug instruction to print debugging messages to the +console (namely the standard error output). It behaves exactly like the Print +instruction.

        + +

        These messages are prefixed with the class name, method name and line number of +the Debug instruction. If you don't want that prefix, you can use the Error +instruction instead of Debug.

        + +

        The debugging messages are automatically removed when creating an executable +without debugging information.

        + + +[TRY] + +

        Error management (1)

        + +

        Error management in Gambasis done with the following instructions: +Try, Error, Catch, and Finally.

        + +

        Try tries to execute a statement without raising an error. The Error +keyword is used just after to know if the statement was executed correctly.

        + +
        Try MyFile = Open "/etc/password" For Write
        +If Error Then Print "I cannot do what I want!"
        + + +[CATCH] + +

        Error management (2)

        + +

        Error management in Gambasis done with the following instructions: +Try, Error, Catch, and Finally.

        + +

        Catch indicates the beginning of the error management part of a function or procedure. +It is put at the end of the function code.

        + +

        The catch part is executed when an error is raised between the beginning of the function execution +and its end.

        + +

        If an error is raised during the execution of the catch part, it is normally propagated.

        + +
        Sub ProcessFile(FileName As String)
        +  ...
        +  Open FileName For Read As #hFile
        +  ...
        +  Close #hFile
        +  
        +Catch ' Executed only if there is an error
        +
        +  Print "Cannot process file "; FileName
        +
        +End
        + + +[FINALLY] + +

        Error management (3)

        + +

        Error management in Gambasis done with the following instructions: +Try, Error, Catch, and Finally.

        + +

        Finally introduces the code executed at the end of the function, even if an error was +raised during its execution.

        + +

        The finally part is not mandatory. If there is a catch part in the function, the finally part must precede it.

        + +

        If an error is raised during the execution of the finally part, it is normally propagated.

        + +
        Sub ProcessFile(FileName As String)
        +  ...
        +  Open FileName For Read As #hFile
        +  ...
        +Finally ' Always executed, even if a error is raised
        +
        +  Close #hFile
        +  
        +Catch ' Executed only if there is an error
        +  
        +  Print "Cannot print file "; FileName
        +  
        +End
        + + +[OPTIONAL] + +

        Optional

        + +

        Functions and procedures in Gambas can have optional arguments.

        + +

        Optional arguments are done simply by putting down the Optional +keyword just before the argument name.

        + +

        Optional arguments can have an explicit default value too.

        + +
        Private Sub MyFunction(Param AS String, Optional Optim AS String = "Default")
        +  ...
        +  Print "Required: "; param; ", Optional: "; optim
        +  ...
        +End
        + + +[ARRAY] + +

        For Each

        + +

        In Gambas you can easily loop through an array, a collection, or many other +enumerable classes with the For Each instruction.

        + +

        For example:

        + +
        Dim Xml As New XmlDocument
        +Dim Node As XmlNode
        +Dim I As Integer
        +
        +' Open XML file
        +Xml.Open("pokus.xml")
        +' Children is indexed via [i], since it's an array
        +For I = 0 To Xml.Root.Children.Count - 1
        +  'Attributes are looped via For Each, since it's a collection
        +  For Each Node In Xml.Root.Children[i].Attributes
        +    Print Node.Name;; Node.Value
        +  Next
        +Next
        + + +[ICON] + +

        Default Icons

        + +

        You can use built in icons for nicer GUI of your application, which are available +in several predefined sizes ("small", "medium", "large",...) +or absolute sizes (from 16x16 to 256x256).

        + +

        For example:

        + +
        Image1.Picture = Picture["icon:/32/warning"]
        +Image2.Picture = Picture["icon:/small/error"]
        +
        + +

        Warning: the gb.form component is required.

        + + +[SETTINGS] + +

        Settings

        + +

        If you need to store the configuration of your program (like the geometry of your forms), +then you are a lucky guy. It's very easy and elegant in Gambas. :-)

        + +

        To save the position of a form:

        +
        Settings.Write(TheForm)
        + +

        To recall it:

        +
        Settings.Read(TheForm)
        + +To save any settings: +
        Settings["Slot/Key"] = Value
        + +And to read the settings back: +
        Value = Settings["Slot/Key", DefaultValue]
        + +These settings are stored in the ~/.config/gambas3/<MyApplication>.conf file, +where <MyApplication> is the name of your project. + +

        Warning: The gb.settings component is required.

        + + +[EDITOR] + +

        Here is a few editor tips...

        + +

        Two Types Of Comments

        + +
        ' Normal comment
        +
        '' Bold comment
        + +

        Bold comments are used for documenting your code.

        + +

        How To Use Code Snippets

        + +

        Let's type main then the TAB key. A static public Main +startup function is automatically inserted in your code.

        + +

        Let's type ds then the TAB key. A local string variable declaration is +automatically inserted, and you can type the variable name immediately.

        + +

        Code snippets are entirely configurable from the Preferences dialog of IDE's Tools menu.

        + + +[END] + +

        That's All Folks!

        + +

        You have read all the tips of the days. I hope you have became +a Gambas expert now ! :-)

        + +

        If you want to contribute, send new tips to the following +address:

        +

        user@lists.gambas-basic.org

        + +

        Thanks beforehand !

        + diff --git a/app/src/gambas3/tips/tips.es b/app/src/gambas3/tips/tips.es new file mode 100644 index 00000000..46089364 --- /dev/null +++ b/app/src/gambas3/tips/tips.es @@ -0,0 +1,302 @@ +[WELCOME] + +

        ¡Bienvenido a Gambas!

        + +

        Gambas es un ambiente integrado de desarrollo basado en un intérprete Basic avanzado.

        + +

        Gambas pretende permitirle crear poderosos programas rápida y fácilmente. Pero la claridad de éstos programas es su propia responsabilidad...

        + +

        ¡Disfrútelo!

        + +

        Benoît Minisini
        gambas@users.sourceforge.net

        + +[STARTUP] + +

        Cada proyecto debe tener una clase de inicio. Ésta clase de inicio debe definir un método estático y público llamado Main sin argumentos, que actuará como el método de inicio de su programa.

        + +

        Usted puede definir la clase de inicio haciendo click sobre ella con el botón derecho del ratón en el árbol del proyecto, y seleccionado Clase de inicio en el menú contextual.

        + +

        No es necesario definir un método Main en un formulario de inicio, porque éste ya tiene uno predefinido.

        + +

        Éste método predefinido de inicio instancia el formulario y lo muestra, como en Visual Basic™.

        + +[OPEN] + +

        La instrucción OPEN de Gambas no trabaja como la de Visual Basic™. Ésta no retorna el archivo como un entero, sino como un objeto File.

        + +

        Así que, en lugar de escribir:

        + +
        DIM handle AS Integer
        +...
        +OPEN "myfile" FOR READ AS #handle
        + +

        debe escribir:

        + +
        DIM handle AS File
        +...
        +handle = OPEN "myfile" FOR READ
        + +[CATDIR] + +

        ¿Sabía que puede concatenar nombres de directorios y nombres de archivos con el operador &/? Éste operador maneja las barras inclinadas de tal forma que la ruta resultante es perfecta.

        + +

        Por ejemplo:

        + +
        PRINT "/home/gambas" &/ ".bashrc"
        +/home/gambas/.bashrc
        +
        +PRINT "/home/gambas/" &/ "/tmp" &/ "foo.bar"
        +/home/gambas/tmp/foo.bar
        +
        + +

        ¿No es maravilloso?

        + +[EXEC] + +

        Usted puede crear un archivo ejecutable del proyecto entero. Seleccione Crear ejecutable en el menú Proyecto.

        + +

        Cuando Gambas hace un archivo ejecutable, por defecto pone el resultado en el directorio del proyecto. El nombre del ejecutable tiene el mismo nombre de su proyecto.

        + +[PATH] + +

        Las rutas relativas tienen un significado especial en Gambas. Ellas siempre se refieren a archivos dentro de sus proyectos.

        + +

        No existe el concepto de directorio actual, ni palabra reservada como CHDIR para cambiarlo.

        + +

        Tenga cuidado: debe utilizar rutas relativas sólo para acceder archivos del proyecto, porque las rutas absolutas no trabajarán más cuando usted cree un ejecutable.

        + +[GLOBAL] + +

        ¡No hay variables globales en Gambas!

        + +

        Como apoyo, póngalas en su módulo principal y declárelas como PUBLIC.

        + +

        Si no tiene un módulo principal en su proyecto, pero sí un formulario principal, entonces declárelas como STATIC PUBLIC.

        + +

        Para acceder a esas variables, debe utilizar el nombre del módulo o formulario principal: MyMainModule.MyGlobalVariable o MyMainForm.MyGlobalVariable.

        + + +[EMPTY] + +

        Para saber si una cadena está vacía, no es necesario usar la función Len(). Usted puede probarla directamente, ya que una cadena vacía es FALSE y una no vacía es TRUE.

        + +

        Por ejemplo, en lugar de hacer:

        + +
        IF Len(MyString) > 0 THEN ...
        +IF Len(MyString) = 0 THEN ...
        + +

        Usted podría hacer:

        + +
        IF MyString THEN ...
        +IF NOT MyString THEN ...
        + +[TRANSLATE] + +

        Las aplicaciones Gambas son completamente traducibles, usted decide cual cadena debe ser traducida, y cual no.

        + +

        Para marcar una cadena como traducible, sólo enciérrela entre paréntesis:

        + +
        PRINT ("Tradúceme")
        +PRINT "¡Pero no me traduzcas a mi!"
        + +[EVENT] + +

        Cada control, y cada objeto que puede lanzar eventos, tiene un observador de eventos y un nombre de grupo de evento.

        + +

        El observador de eventos atrapa cada evento lanzado por el objeto, y el grupo de nombre es el prefijo del procedimiento llamado para manejar el evento.

        + +

        Por defecto, este observador de eventos es el objeto donde usted creó el control, y el nombre de grupo es el nombre del control.

        + +

        De esta forma, un formulario recibe todos los eventos lanzados por los controles que usted creó dentro de él.

        + +
        ' Gambas form
        +DIM hButton AS Button
        +
        +PUBLIC SUB _new()
        +  hButton = NEW Button(ME) AS "MyButton"
        +END
        +
        +PUBLIC SUB MyButton_Click()
        +  PRINT "¡Usted ha presionado MyButton!"
        +END
        +
        + +[FORM] + +

        En Gambas, un formulario es su propio observador de eventos, así que usted puede manejar sus eventos directamente (como Resize, Activate, ...) dentro su propio código de clase.

        + +

        De esta forma, los novatos que vengan de Visual Basic™ no estarán desorientados :-).

        + +[EMBED] + +

        ¡Usted puede incrustar cualquier formulario dentro de otros con Gambas!

        + +

        Para hacer una cosa tan poderosa, sólo instancie el formulario pasando un contenedor padre como último argumento del constructor.

        + +

        Por ejemplo:

        +

        DIM hForm AS MyDialog
        +DIM hSuperControl AS MyForm

        +' Crear un dialigo
        +hForm = NEW MyDialog
        +' Insertar un formulario dentro de éste dialogo
        +' Note que éste formualario toma dos parámetros antes del contenedor
        +hSuperControl = NEW MyForm(Param1, Param2, MyDialog)
        +' Mover y redimensionar el formulario
        +hSuperControl.Move(8, 8, 128, 64)
        +

        + +

        Tenga cuidado: un formulario incrustado dentro de otro es aún un formulario, y entonces es su propio observador de eventos.

        + +[GROUP] + +

        Cada control tiene una propiedad (Group). Cuando ésta propiedad es configurada, el prefirjo del nombre del manejador de eventos es el nombre del grupo y no el nombre del control.

        + +

        Supongamos que tiene un Butón llamado btnAction con el siguiente manejador de eventos Click:

        + +
        PUBLIC SUB btnAction_Click()
        + +

        Si usted configura la propiedad (Group) de btnAction a MyGroup, entonces el manejador de eventos que recibirá los eventos del botón será el siguiente:

        + +
        PUBLIC SUB MyGroup_Click()
        + +

        Esta propiedad permite manejar eventos de diferentes controles en una función. ¡Y los controles del mismo nombre de grupo no tienen que ser del mismo tipo!

        + +

        Nota: Los viejos veteranos de Visual Basic™ podrían reconocer el concepto de arreglo de controles, pero en una implementación más poderosa. :-)

        + +[TAG] + +

        Cada control tiene una propiedad Tag. Ésta propiedad es para el programador, y puede contener cualquier dato de tipo VARIANT que usted pueda encontrar relevante.

        + +

        Ésto es muy útil, cuando quiere distinguir controles del mismo grupo en un manejador de eventos común.

        + +[LAST] + +

        La palabra clave LAST retorna el último control que ha recibido un evento. Ésto es muy últil cuando usted quiere escribir un manejador de eventos que es independiente de cada nombre de control.

        + +

        Por ejemplo, supongamos que usted quiere escribir un programa de una calculadora. Usted ha definido diez botones, uno para cada dígito, cada uno en el mismo group "Digit". El Tag de cada control es configurado para el dígito dibujado en el botón. Su manejador de eventos podría lucir así:

        + +

        PUBLIC SUB Digit_Click()

        +  Display = Display & LAST.Tag
        +  RefreshDisplay

        +END

        + + +[LEFT] + +

        Las bien conocidas rutinas BASIC Left$, Right$ y Mid$ tienen conductas útiles en Gambas.

        + +

        El segundo parámetro de Left$ y Right$ es opcional, y es uno por defecto.

        + +

        Left$("Gambas") retorna "G"
        Right$("Gambas") retorna "s"

        + +

        El segundo parámetro puede ser negativo, y entonces da el número de caracteres a no extraer.

        + +

        Left$("Gambas", -2) retorna "Gamb"
        Right$("Gambas", -2) retorna "mbas"

        + +

        Asimismo, el tercer argumento de Mid$ puede ser negativo, y entonces da el número de caracteres desde el final de la cadena a no extraer.

        + +

        Mid$("Gambas", 2, -2) retorna "amb" + +[OBSERVER] + +

        El clase Observer le permite interceptar todos los eventos lanzados por un objeto antes que de que sean enviados.

        + +
        MyTextBox = NEW TextBox(ME) AS "MyTextBox"
        +MyObserver = NEW Observer(MyTextBox) AS "MyObserver"
        +...
        +PUBLIC SUB MyObserver_KeyPress()
        +  DEBUG "Tengo ésto primero"
        +END
        +
        +PUBLIC SUB MyTextBox_KeyPress()
        +  DEBUG "Tengo ésto después"
        +END
        + +

        El observador puede cancelar el evento para prevenir que el objeto eventualmente lo lance.

        + +[STRING] + +

        Gambas usa el juego de caracteres UTF-8 para representar cadenas en la memoria.

        + +

        Pero todas las funciones de cadena estándar de Gambas trabajan con ASCII: Left, Mid, Right, UCase...

        + +

        Si quiere manipular una cadena UTF-8, tiene que usar los métodos de la clase estática String, la cual tiene el mismo nombre de sus homólogos estándar.

        + +
        PRINT Len("bébé");; Left$("bébé", 3)
        +6 bé
        +PRINT String.Len("bébé");; String.Left("bébé", 3)
        +4 béb
        + +[ASSIGNMENT] + +

        Gambas implementa los atajos de asignación a los que los programadores de C/C++ están acostumbrados.

        + +

        MyVariable += 2 es equivalente a MyVariable = MyVariable + 2

        + +

        MyVariable &= "Great" es equivalente a MyVariable = MyVariable & "Great"

        + +

        Así consecutivamente...

        + +[DEBUG] + +

        Usted puede usar la instrucción DEBUG para imprimir mensajes de depurado en la consola (llamada la salida de errores estándar). Ésta se comporta exactamente como la instrucción PRINT.

        + +

        Los mensajes tienen el prefijo del nombre de la clase, nombre del método y número de línea de la instrucción DEBUG.

        + +

        Los mensajes de depurado son automáticamente removidos cuando se crea un ejecutable sin la información del depurado.

        + +[TRY] + +

        El manejo de Errores en Gambas es echo con las siguientes instrucciones: TRY, ERROR, CATCH, y FINALLY + +

        TRY trata de ejecutar una sentencia sin lanzar un error. La instrucción ERROR es usada justo después para saber si la instrucción fue ejecutada correctamente.

        + +
        TRY MyFile = OPEN "/etc/password" FOR WRITE
        +IF ERROR THEN PRINT "¡No puedo hacer lo que quiero!"
        + +[CATCH] + +

        El manejo de Errores en Gambas es echo con las siguientes instrucciones: TRY, ERROR, CATCH, y FINALLY.

        + +

        CATCH indica el inicio de la parte de manejo de errores de una función o procedimiento. Es puesto al final del código de la función.

        + +

        La parte catch es ejecutada cuando un error es lanzado entre el inicio de la ejecución de la función y su final.

        + +

        Si un error es lanzado durante la ejecución de la parte catch, éste es normalmente propagado.

        + +
        SUB ProcessFile(FileName AS STRING)
        +  ...
        +  OPEN FileName FOR READ AS #hFile
        +  ...
        +  CLOSE #hFile
        +CATCH ' Ejecutado sólo si hay un error
        +  PRINT "No se puede procesar el archivo "; FileName
        +END
        + +[FINALLY] + +

        El manejo de Errores en Gambas es echo con las siguientes instrucciones: TRY, ERROR, CATCH, y FINALLY.

        + +

        FINALLY introduce el código ejecutado al final de la función, aunque un error haya sido lanzado durante su ejecución.

        + +

        La parte finally no es mandatoria. Si hay una parte catch en la función, la parte finally debe de precederle.

        + +

        Si un error es lanzado durante la ejecución de la parte finally, éste es normalmente propagado.

        + +
        SUB ProcessFile(FileName AS STRING)
        +  ...
        +  OPEN FileName FOR READ AS #hFile
        +  ...
        +FINALLY ' Siempre ejecutada, aunque un error sea lanzado
        +  CLOSE #hFile
        +CATCH ' Ejecutado sólo si hay un error
        +  PRINT "No se puede imprimir el archivo "; FileName
        +END
        + +[END] + +

        Usted ha leído todos los consejos de los días. ¡Espero que ahora se haya convertido en en experto en Gambas! :-)

        + +

        Si quiere contribuir, envíe nuevos consejos a la siguiente dirección:

        + +

        gambas@users.sourceforge.net

        \ No newline at end of file diff --git a/app/src/gambas3/tips/tips.fr b/app/src/gambas3/tips/tips.fr new file mode 100644 index 00000000..ae291df1 --- /dev/null +++ b/app/src/gambas3/tips/tips.fr @@ -0,0 +1,604 @@ +[WELCOME] + +

        Bienvenue dans Gambas !

        + +

        Gambas est un environnement graphique de développement +basé sur un interpréteur Basic avancé.

        + +

        Le but de Gambas est de vous permettre de concevoir de +puissants programmes, et ce facilement et rapidement. Mais la propreté de ces +programmes reste sous votre entière responsabilité...

        + +

        En espérant que vous l'apprécierez !

        + +

        Benoît Minisini
        +gambas@users.sourceforge.net

        + + +[STARTUP] + +

        Classe de démarrage

        + +

        Tout projet doit avoir une classe de démarrage. Cette classe +de démarrage doit posséder une méthode publique statique appelée +Main ne possédant aucun paramètre. Celle-ci agira alors comme +méthode de démarrage de votre programme.

        + +

        Pour définir la classe de démarrage, cliquez dessus avec le bouton +droit dans l'arbre du projet, et cochez l'entrée Classe de +démarrage dans le menu contextuel.

        + +

        Il n'est pas nécessaire de définir la méthode Main dans un +formulaire de démarrage, car celui-ci en possède une par défaut.

        + +

        Cette méthode de démarrage par défaut se charge d'instancier puis +d'afficher le formulaire, à la manière de Visual Basic™. +

        + + +[EXEC] + +

        Exécutable

        + +Vous pouvez créer un fichier exécutable à partir de votre projet. +Pour cela, sélectionnez Générer l'exécutable... dans le menu +Projet. +

        +L'exécutable est placé par défaut dans le répertoire du projet. +Il porte le même nom que le projet. + + +[OPEN] + +

        Open

        + +L'instruction Open de Gambas ne fonctionne +pas comme celle de Visual Basic™. Elle ne retourne +pas le fichier ouvert sous forme d'un entier, mais d'un objet de +la classe File. +

        +Ainsi, au lieu de taper : +

        Dim Handle As Integer
        +...
        +Open "mon-fichier.txt" For Read As #Handle
        +

        +Vous devez taper : +

        Dim Handle As File
        +...
        +Handle = Open "mon-fichier.txt" For Read
        + + +[CATDIR] + +

        Concaténation de chemins

        + +Savez-vous que vous pouvez concaténer des noms de répertoires et +de fichiers avec l'opérateur &/ ? +

        +Cet opérateur s'occupe d'ajouter le caractère de délimitation +de répertoire '/' lorsque c'est nécessaire. +

        +Par exemple : +

        Print "/home/gambas" &/ ".bashrc"
        +→ /home/gambas/.bashrc
        +
        +Print "/home/gambas/" &/ "/tmp" &/ "foo.bar"
        +→ /home/gambas/tmp/foo.bar
        +
        +

        N'est-ce pas merveilleux ? :-) + + +[PATH] + +

        Chemins relatifs

        + +Les chemins relatifs ont une signification particulière dans Gambas. +Ils font référence aux fichiers situés à l'intérieur de votre projet. +

        +Il n'y a pas de concept de répertoire courant, et aucune instruction +telle que CHDIR qui serait susceptible de le modifier. +

        +Attention : vous devez toujours utiliser des chemins relatifs pour +accéder aux fichiers de votre projet, car les chemins absolus vers ces +fichiers n'ont plus de signification lorsque le projet est transformé +en exécutable. + + +[GLOBAL] + +

        Variables globales

        + +Il n'y a pas de variables globales en Gambas ! +

        +Par contre, vous pouvez placer les variables auxquelles vous désirez accéder depuis +n'importe quelle partie de votre projet à l'intérieur de votre module principal en les déclarant Public. +

        +Si vous n'avez pas de module principal, mais un formulaire principal, +déclarez-les comme Static Public. +

        +Pour accéder à ces variables, vous devez utiliser le nom du module ou du +formulaire principal ainsi : + +

        MonModulePrincipal.MaVariableGlobale +

        ou bien +

        MonFormulairePrincipal.MaVariableGlobale + + +[EMPTY] + +

        Chaînes vides

        + +Pour savoir si une chaîne est vide, il n'est pas nécessaire d'effectuer +une comparaison avec "" ou bien d'utiliser la fonction +Len(). Il est possible de la tester directement, car une +chaîne vide est équivalente à False et une chaîne non-vide +est équivalente à True. +

        +Par exemple, plutôt que de faire : +

        If Len(MaChaine) > 0 Then ...
        +If Len(MaChaine) = 0 Then ...
        +

        +Vous devriez plutôt faire : +

        If MaChaine Then ...
        +If Not MaChaine Then ...
        + + +[TRANSLATE] + +

        Traduction

        + +

        Un programme écrit en Gambas est traduisible dans n'importe quel langue, +à condition que vous indiquiez parmi les chaînes de caractères du programme +lesquelles doivent être traduites, et lesquelles ne le doivent pas.

        + +

        Pour indiquer quelles chaînes doivent être traduites, il suffit de les +écrire entre parenthèses:

        + +
        Print ("Traduisez-moi")
        +Print "Mais ne me traduisez pas!"
        + + +[SUBST] + +

        Subst$

        + +

        La fonction Subst$() est très utile pour internationaliser votre application. + +

        Elle prend au moins deux arguments. Le premier est le masque de texte à l'intérieur duquel les +substitutions vont s'appliquer. Les autres sont les substitutions, numérotées en commençant par un. + +

        Chaque occurence &X de la chaîne de substitution sera remplacée par le Xème +argument à substituer. Par exemple : + +

        Print Subst(("Substitution de &1, &2 et &3"),
        +  "premier", "deuxième", "troisième")
        +
        +→ Substitution de premier, deuxième et troisième
        + + +[EVENT] + +

        Gestionnaires d'évènements

        + +Chaque contrôle, et chaque objet pouvant générer des évènements, possède +un observateur d'évènement et un nom de groupe d'évènement. +

        +L'observateur d'évènement reçoit chaque évènement généré par un objet, et +le nom de groupe d'évènenement est le préfixe de la fonction qui sera +appelée pour gérer l'évènement. Cette fonction est appelée gestionnaire +d'évènements. +

        +Par défaut, l'observateur d'évènement est l'objet à l'intérieur duquel +vous avez créé le contrôle, et le nom de groupe est le nom du contrôle. +

        +De cette manière, un formulaire recevra tous les évènements des contrôles +lui appartenant. +

        +

        ' Gambas form
        +Dim hButton As Button
        +
        +Public Sub _new()
        +  hButton = New Button(Me) As "MonBouton"
        +End
        +
        +Public Sub MonButton_Click()
        +  Print "Vous avez cliqué sur MonBouton !"
        +End
        +
        + + +[FORM] + +

        Formulaires

        + +En Gambas, un formulaire est son propre observateur d'évènements, afin +que vous puissez directement gérer ses évènements (comme Resize, +Activate, ...) dans le code même de la classe associée. +

        +De cette manière, les débutants venant de Visual Basic™ ne sont +pas désorientés :-). + + +[EMBED] + +

        Formulaires imbriqués

        + +

        Vous pouvez imbriquer un formulaire à l'intérieur d'un autre en +Gambas ! Pour cela, instanciez simplement votre formulaire en lui passant +un conteneur parent en argument supplémentaire.

        + +

        Par exemple :

        +

        Dim hForm As MyDialog
        +Dim hSuperControl As MyForm
        +
        +' Création d'une boîte dialogue
        +hForm = New MyDialog
        +' Insertion d'un formulaire dans le dialogue
        +' Notez que le constructeur du formulaire prend deux arguments avant 
        +' le conteneur
        +hSuperControl = New MyForm(Param1, Param2, MyDialog)
        +' Déplacement et redimensionnement du formulaire
        +hSuperControl.Move(8, 8, 128, 64)
        +
        + +

        Attention : un formulaire imbriqué reste un formulaire, et par conséquent +est son propre observateur d'évènements.

        + + +[GROUP] + +

        Groupes de contrôles

        + +

        Chaque contrôle possède une propriété (Group). Lorsque cette propriété est +définie, le préfixe de chaque gestionnaire d'évènement devient le nom de ce groupe +et non plus le nom du contrôle.

        + +

        Supposons qu'on ait un Button appelé btnAction avec le gestionnaire +d'évènement Click suivant :

        + +
        Public Sub btnAction_Click()
        + +

        Si vous définissez la propriété (Group) de btnAction à "MyGroup", +alors le gestionnaire d'évènement sera le suivant :

        + +
        Public Sub MyGroup_Click()
        + +

        Cette propriété vous permet de gérer les évènements de différents contrôles au sein +d'une seule fonction. Et les contrôles d'un même groupe peuvent être de types différents !

        + +

        Remarque : le bon vieux vétéran du Visual Basic reconnaîtra éventuellement +le concept de tableau de contrôle, mais dans une implémentation bien plus puissante. :-)

        + +[TAG] + +

        La propriété Tag

        + +

        Chaque contrôle possède une propriété Tag. Cette propriété est +destinée au programmeur, et peut contenir n'importe quel donnée de type Variant +que vous trouverez adéquate.

        + +

        Ceci est très utile si, par exemple, vous voulez distinguer les contrôles d'un +même groupe au sein de leur gestionnaire d'évènement commun.

        + + +[LAST] + +

        Last

        + +

        Le mot-clef Last retourne le dernier contrôle ayant reçu +un évènement. Ceci est très utile si vous voulez écrire un gestionnaire +d'évènement indépendant d'un nom de contrôle.

        + +

        Par exemple, supposons que vous voulez programmez une calculatrice. +Vous avez défini dix boutons, un pour chaque chiffre, tous dans le même +groupe "Digit". La propriété Tag de chaque bouton +contient le chiffre dessiné sur le bouton.

        + +

        Votre gestionnaire d'évènement ressemblera à ceci :

        + +
        Public Sub Digit_Click()
        +
        +  Display = Display & Last.Tag
        +  RefreshDisplay
        +
        +End
        + + +[LEFT] + +

        Left$ / Mid$ / Right$

        + +

        Les fonctions BASIC bien connues que sont Left$, Right$ +et Mid$ possèdent des syntaxes spécifiques bien utiles en Gambas. + +

        Le deuxième argument de Left$ et de Right$ est optionnel, +et vaut un par défaut.

        + +

        Left$("Gambas") retourne "G".
        +Right$("Gambas") retourne "s".

        + +

        Ce second argument peut être négatif. Il donne alors le nombre de +caractères à ne pas extraire.

        + +

        Left$("Gambas", -2) retourne "Gamb".
        +Right$("Gambas", -2) retourne "mbas".

        + +

        De même, le troisième argument de Mid$ peut être négatif. Il +donne alors le nombre de caractères depuis la fin de la chaîne à ne pas extraire.

        + +

        Mid$("Gambas", 2, -2) retourne "amb".

        + + +[OBSERVER] + +

        Observer

        + +

        La classe Observer vous permet d'intercepter n'importe quel évènement +de n'importe quel objet avant même qu'il ait été effectivement émis.

        + +
        MyTextBox = New TextBox(Me) As "MyTextBox"
        +MyObserver = New Observer(MyTextBox) As "MyObserver"
        +...
        +Public Sub MyObserver_KeyPress()
        +  Debug "Reçu en premier"
        +End
        +
        +Public Sub MyTextBox_KeyPress()
        +  Debug "Reçu en dernier"
        +End
        + +L'observateur peut annuler l'évènement avec Stop Event pour +empêcher son émission. + + +[STRING] + +

        Chaînes UTF-8

        + +

        Gambas utilise le jeu de caractères UTF-8 pour représenter +les chaînes de caractères en mémoire. + +

        Mais les fonctions de traitement de chaînes de caractères standardes ne +fonctionnent qu'avec de l'ASCII : +Left, Mid, Right, UCase... + +

        Si vous voulez manipuler des chaînes de caractères UTF-8, vous devez utiliser +les méthodes de la classe statique String, qui possèdent les mêmes noms +que leur équivalent standardes. + +

        Print Len("bébé");; Left$("bébé", 3)
        +→ 6 bé
        +
        +Print String.Len("bébé");; String.Left("bébé", 3)
        +→ 4 béb
        + + +[ASSIGNMENT] + +

        Assignations

        + +

        Gambas implémente les raccourcis d'assignation auxquels les programmeurs C/C++ sont habitués. + +

        MyVariable += 2
        +MyVariable *= 4
        +MyVariable &= "Great"
        +équivaut à +
        MyVariable = MyVariable + 2
        +MyVariable = MyVariable * 4
        +MyVariable = MyVariable & "Great"
        + +

        Et ainsi de suite... + + +[DEBUG] + +

        Debug

        + +

        Vous pouvez utiliser l'instruction Debug pour imprimer des messages de débogage +sur la console (c'est-à-dire la sortie erreur standard). Elle se comporte exactement comme +l'instruction Print. + +

        Ces messages sont prefixés avec le nom de la classe, le nom de la méthode et le numéro de ligne +de l'instruction Debug. Si vous ne voulez pas de ce préfixe, vous pouvez utiliser +l'instruction Error à la place de Debug. + +

        Les messages de débogages sont automatiquement ignorés lorsque vous créez un exécutable +privé des informations de débogage. + + +[TRY] + +

        Gestion des erreurs (1)

        + +

        La gestion des erreurs en Gambas s'effectue à l'aide des instructions suivantes : +Try, Error, Catch, et Finally. + +

        Try essaie d'exécuter une instruction sans déclencher d'erreur. Le mot-clef Error +est utilisé juste après pour savoir si l'instruction s'est exécutée correctement. + +

        Try MyFile = Open "/etc/password" For Write
        +If Error Then Print "Je ne peux pas faire tout ce que je veux !"
        + + +[CATCH] + +

        Gestion des erreurs (2)

        + +

        La gestion des erreurs en Gambas s'effectue à l'aide des instructions suivantes : +Try, Error, Catch, et Finally. + +

        Catch marque le début du gestionnaire d'erreurs d'une fonction ou d'une procédure. +Il doit être placé à la fin du code de la fonction. + +

        Ce gestionnaire d'erreur est exécuté lorsqu'une erreur est levée entre le début et la fin de +l'exécution de la fonction. + +

        Si une erreur survient pendant l'exécution du gestionnaire d'erreur, elle est propagée normalement. + +

        Sub ProcessFile(FileName As String)
        +  ...
        +  Open FileName For Read As #hFile
        +  ...
        +  Close #hFile
        +  
        +Catch ' Exécuté seulement si il y'a eu une erreur
        +
        +  Print "Impossible de traiter le fichier "; FileName
        +
        +End
        + + +[FINALLY] + +

        Gestion des erreurs (3)

        + +

        La gestion des erreurs en Gambas s'effectue à l'aide des instructions suivantes : +Try, Error, Catch, et Finally. + +

        Finally introduit une partie de code exécutée à la fin de la fonction dans tous les cas, +même si une erreur a été levée pendant l'exécution de la fonciton. + +

        L'utilisation de Finally est facultative. Mais si l'instruction Catch est utilisée, +alors Finally doit obligatoirement la précéder. + +

        Si une erreur survient pendant l'exécution du code introduit par Finally, elle est propagée +normalement. + +

        Sub ProcessFile(FileName As String)
        +  ...
        +  Open FileName For Read As #hFile
        +  ...
        +Finally ' Toujours exécuté, même s'il y a eu une erreur
        +
        +  Close #hFile
        +  
        +Catch ' Exécuté seulement en cas d'erreur
        +  
        +  Print "Cannot print file "; FileName
        +  
        +End
        + + +[OPTIONAL] + +

        Optional

        + +

        Les fonctions ou procédures de Gambas peuvent avoir des arguments optionels. + +

        Les arguments sont rendus optionnels en les prefixant simplement avec le mot-clef +Optional. + +

        Les arguments optionnels peuvent aussi avoir une valeur par défaut explicite. + +

        Private Sub MyFunction(Param AS String, Optional Optim AS String = "Default")
        +  ...
        +  Print "Obligatoire: "; param; ", Optionnel: "; optim
        +  ...
        +End
        + + +[ARRAY] + +

        For Each

        + +

        En Gambas vous pouvez facilement enumérer le contenu d'un tableau, d'une +collection, ou de toute autre classe enumérable, avec l'instruction For Each. + +

        Par exemple : + +

        Dim Xml As New XmlDocument
        +Dim Node As XmlNode
        +Dim I As Integer
        +
        +' Ouverture du fichier XML
        +Xml.Open("pokus.xml")
        +' Les noeuds enfants sont indexés avec [I], car il s'agit
        +' d'un tableau
        +For I = 0 To Xml.Root.Children.Count - 1
        +  ' Les attributs sont énumérés avec For Each, car il s'agit
        +  ' d'une collection
        +  For Each Node In Xml.Root.Children[i].Attributes
        +    Print Node.Name;; Node.Value
        +  Next
        +Next
        + + +[ICON] + +

        Icônes prédéfinies

        + +

        Vous pouvez utiliser les icônes prédéfinies pour améliorer l'apparence de vos interfaces. +Ces icônes sont disponibles en tailles prédéfinies ("small", "medium", "large",...) +ou bien en tailles absolues (de 16x16 à 256x256). + +

        Par exemple : + +

        Image1.Picture = Picture["icon:/32/warning"]
        +Image2.Picture = Picture["icon:/small/error"]
        +
        + +

        Attention : le composant gb.form est requis. + + +[SETTINGS] + +

        Settings

        + +

        Si vous avez besoin de mémoriser la configuration de votre programme (comme la géométrie de vos formulaires) +alors vous être chanceux. C'est très simple et très élégant à faire en Gambas. :-) + +

        Pour enregistrer la position d'un formulaire : +

        Settings.Write(TheForm)
        + +

        Pour la rappeler : +

        Settings.Read(TheForm)
        + +

        Pour enregistrer un élément de configuration : +

        Settings["Slot/Key"] = Value
        + +

        Et pour le rappeler : +

        Value = Settings["Slot/Key", DefaultValue]
        + +La configuration est enregistrée dans le fichier ~/.config/gambas3/<MonApplication>.conf, +où <MonApplication> est le nom de votre projet. + +

        Attention : Le composant gb.settings est requis. + + +[EDITOR] + +

        Voici quelques astuces de l'éditeur... + +

        Deux types de commentaires

        + +
        ' Commentaire normal
        +
        '' Commentaire en gras
        + +

        Les commentaires en gras sont utilisés pour documenter votre code. + +

        Comment utiliser les fragments de code

        + +

        Saisissez main puis appuyez sur la touche TAB. Une fonction de démarrage +publique et statique Main est automatiquement insérée dans votre code. + +

        Saisissez ds puis appuyez sur la touche TAB. Une déclaration de variable +locale de type String est insérée automatiquement, et vous pouvez saisir le nom +de la variable immédiatement. + +

        Les fragments code sont intégralement configurables depuis la boîte de dialogue des +options globales de l'environnement de développement. + + +[END] + +

        C'est terminé !

        + +

        Vous avez lu toutes les astuces du jour. J'espère que vous êtes +devenu un expert Gambas maintenant ! :-)

        + +

        Si vous désirez ajouter de nouvelles astuces de votre cru, +n'hésitez-pas à les envoyer à l'adresse suivante :

        + +

        gambas@users.sourceforge.net

        + +

        Merci d'avance !

        diff --git a/app/src/gambas3/tips/tips.it b/app/src/gambas3/tips/tips.it new file mode 100644 index 00000000..b61075c6 --- /dev/null +++ b/app/src/gambas3/tips/tips.it @@ -0,0 +1,527 @@ +[WELCOME] + +

        Benvenuto in Gambas !

        + +

        Gambas è un ambiente grafico di sviluppo basato su un interprete avanzato +Basic.

        + +

        L'obiettivo di Gambas è quello di permettere di creare programmi potenti +in maniera facile e veloce. Ma la responsabilità di creare programmi puliti è tutta vostra...

        + +

        Spero vi piaccia!

        + +

        Benoît Minisini
        +g4mba5@gmail.com




        + + +[STARTUP] + +

        Ogni progetto deve avere una classe di inizio. + Questa classe di inizio deve definire un metodo pubblico (public) e statico (static) + denominato Main senza argomenti, che si comporterà come il metodo di inizio del tuo programma

        + +

        Puoi definire la classe di inizio cliccando su di essa con il tasto destro del mouse e selezionando Classe di avvio +nel menù a cascata

        + +

        Non è necessario definire un metodo Main in un Form di avvio perché ne esiste già uno predefinito.

        + +

        Questo metodo predefinito inizializza il form e lo mostra, come in Visual Basic™.

        + + +[OPEN] + +

        L'Istruzione OPEN di Gambas non si comporta nella stessa maniera + che in Visual Basic. + Non ritorna il file come un Integer, ma come un ogetto File.

        + +

        In pratica, invece di digitare:

        + +
        DIM handle AS Integer
        +...
        +OPEN "ilmiofile" FOR READ AS #handle
        + +

        Devi digitare :

        + +
        DIM handle AS File
        +...
        +handle = OPEN "ilmiofile" FOR READ
        + + +[CATDIR] + +

        Lo sapevi che puoi concatenare nomi di directory e nomi di file +con l'operatore &/? +Questo operatore aggiunge se necessario la slash ("/") in maniera tale che +l'indirizzo risultante sia perfetto.

        + +

        Per esempio :

        + +
        PRINT "/home/gambas" &/ ".bashrc"
        +/home/gambas/.bashrc
        +
        +PRINT "/home/gambas/" &/ "/tmp" &/ "foo.bar"
        +/home/gambas/tmp/foo.bar
        +
        + +

        Non è stupendo ?

        + +[EXEC] + +

        Puoi realizzare un file eseguibile di tutto il tuo progetto. + Seleziona Crea eseguibile nel menu Progetto.

        + +

        Quando Gambas crea un file eseguibile, colloca il risultato direttamente +nella directory del tuo progetto e il nome del file eseguibile sarà quello del +tuo progetto

        + + +[PATH] +

        +I percorsi relativi hanno un significato speciale in Gambas. +Sono sempre riferiti a file dentro il tuo progetto. +

        +Non c'è il concetto di directory corrente, e nessuna parola chiave come +CHDIR per cambiarla. +

        +Attenzione: devi usare i percorsi relativi solo per accedere ai file di +progetto, perché i percorsi assoluti non funzioneranno quando crei l'eseguibile. + + +[GLOBAL] + +Non ci sono variabili globali in Gambas! +

        +Come sostituto, dichiarale nel modulo principale come PUBLIC. +

        +Se non hai un modulo principale nel tuo progetto, ma un form principale, +allora dichiarale come STATIC PUBLIC. +

        +Per accedere a queste variabili, devi usare il nome del modulo principale +o form: MyMainModule.MyGlobalVariable o +MyMainForm.MyGlobalVariable. + +[EMPTY] + +

        Per sapere se una stringa è vuota non è necessario usare la funzione Len() . + Puoi direttamente testare la stringa, visto che una stringa vuota è FALSE e una non vuota è TRUE.

        + +

        Per esempio, invece di :

        + +
        IF Len(Lamiastringa) > 0 THEN ...
        +IF Len(Lamiastringa) = 0 THEN ...
        + +

        Puoi fare :

        + +
        IF Lamiastringa THEN ...
        +IF NOT Lamiastringa THEN ...
        + + +[TRANSLATE] + +

        Traduzione

        + +

        Le applicazioni Gambas sono completamente traducibili, a condizione +che tu dica quali stringhe devono essere tradotte e quali no.

        +

        Per contrassegnare le stringhe come traducibili, racchiudile tra parentesi tonde:

        + +

        Print ("Traducimi")
        +Print "Non tradurmi!"
        + + +[SUBST] + +

        Subst$

        + +

        La funzione Subst$() è molto utile per internazionalizzare la tua applicazione.

        + +

        Ci vogliono almeno due argomenti. Il primo è la maschera di testo su cui si applica la sostituzione. +Gli altri sono gli argomenti di sostituzione, numerati a partire da uno.

        + +

        Ogni modello &X nella stringa di sostituzione verrà sostituito dall'argomento di sostituzione X. +Per esempio:

        + +
        Print Subst(("Sostituzione di &1, &2 e &3"),
        +  "primo", "secondo", "terzo")
        +
        +→ Sostituzione di primo, secondo e terzo
        + +[EVENT] + +

        Tutti i controlli e tutti gli oggetti che possono avere eventi, + hanno un Osservatore di eventi e un nome di gruppo del evento.

        + +

        L'osservatore di eventi coglie tutti gli eventi prodotti dall'oggetto, + e il nome del gruppo del evento è il prefisso del procedimento incaricato di gestire l'evento.

        + +

        Di default, questo osservatore di eventi è l'oggetto dove si è creato il controllo, + e il nome di gruppo è il nome del controllo.

        + +

        In questo modo, un form riceve tutti gli eventi prodotti dai controlli che tu ci hai creato dentro.

        + +
        ' Gambas form
        +
        +DIM hButton AS Button
        +
        +PUBLIC SUB _new()
        +  ...
        +  hButton = NEW Button(ME) AS "Ilmiopulsante"
        +  ...
        +END
        +
        +PUBLIC SUB Ilmiopulsante_Click()
        +  ...
        +END
        +
        + + +[GROUP] + +

        Tutti i controlli hanno una proprietà (Group). + Quando questa proprietà è utilizzata, il prefisso del gestore di eventi è il nome del + gruppo e non il nome del controllo.

        +

        Supponiamo di avere un Button chiamato btnAzione con il gestore di eventi Click +seguente :

        + +
        PUBLIC SUB btnAzione_Click()
        + +

        Se definisci la proprietà (Group) di btnAzione come IlMioGruppo, + Allora il gestore di eventi che riceverà gli eventi del pulsante sarà il seguente:

        + +
        PUBLIC SUB IlMioGruppo_Click()
        + +

        Questa proprietà permette di gestire vari eventi con una semplice funzione. + E i controlli dello stesso gruppo non devono per forza essere dello stesso tipo !!!

        + +

        Nota : I veterani del vecchio Visual Basic riconosceranno il concetto di control array, + soltanto che qui viene implementato in un modo più potente. :-)

        + + +[FORM] + +

        Un form è l'osservatore di eventi di se stesso, in questo modo puoi gestire direttamente i suoi eventi (Resize, Activate, ...) +dentro il codice della sua stessa classe.

        + +

        In questo modo, i nuovi arrivati da Visual Basic non si sentiranno persi :-).

        + + +[EMBED] + +

        Con Gambas puoi fare in modo che qualsiasi form venga +racchiuso in un altro form!

        + +

        Per fare una cosa così utile devi soltanto inizializzare il form passando +un contenitore padre come ultimo argomento nel costruttore.

        + +

        Per esempio :

        +

        DIM hForm AS MyDialog
        +DIM hSuperControl AS MyForm

        +' Crea un dialogo
        +hForm = NEW MyDialog
        +' Inserisce un form in questo dialogo
        +' Nota che questo form riceve due parametri prima del contenitore
        +hSuperControl = NEW MyForm(Param1, Param2, MyDialog)
        +' Muove e ridimensiona il form
        +hSuperControl.Move(8, 8, 128, 64)

        + +

        Ricorda che: un form racchiuso in un altro continua ad essere un form + e quindi osservatore di eventi di se stesso.

        + + +[TAG] + +

        Tutti i controlli hanno una proprietà chiamata Tag + Questa proprietà è pensata per essere usata dai programmatori e può contenere qualsiasi dato +VARIANT che credi utile.

        + +

        Questo è molto utile quando vuoi differenziare controlli dello stesso gruppo nello stesso gestore di eventi.

        + + +[LAST] + +

        La parola chiave LAST ritorna l'ultimo controllo che ha ricevuto un evento. + E' molto utile quando vuoi scrivere un gestore di eventi +che sia indipendente dal nome del controllo.

        + +

        Supponiamo di voler scrivere un programma calcolatrice. + Hai definito dieci pulsanti, uno per ogni numero e tutti con lo stesso group "Digit". + Il valore del Tag di ogni controllo sarà il numero visualizzato da ogni pulsante. + Il tuo gestore di eventi sarà più o meno così :

        + +

        PUBLIC SUB Digit_Click()

        +  Display = Display & LAST.Tag
        +  RefreshDisplay

        +END

        + + +[LEFT] + +

        Le famose routine Left$, Right$, Mid$ di BASIC + hanno un comportamento molto utile in Gambas.

        + +

        Il secondo parametro di Left$ e Right$ è facoltativo, e per default è pari a uno.

        + +

        Left$("Gambas") ritorna "G"
        +Right$("Gambas") ritorna "s"

        + +

        Il secondo parametro può essere negativo e in questo caso rappresenta il numero di caratteri da non ritornare.

        + +

        Left$("Gambas", -2) ritorna "Gamb"
        +Right$("Gambas", -2) ritorna "mbas"

        + +

        Allo stesso modo, il terzo parametro di Mid$ può essere negativo, + e quindi rappresentare il numero di caratteri dalla fine della stringa da non ritornare.

        + +

        Mid$("Gambas", 2, -2) ritorna "amb" + + +[OBSERVER] + +

        Observer

        + +

        La classe Observer ti consente di intercettare tutti gli eventi generati da un +oggetto prima che vengano effettivamente inviati.

        + +
        MyTextBox = New TextBox(Me) As "MyTextBox"
        +MyObserver = New Observer(MyTextBox) As "MyObserver"
        +...
        +Public Sub MyObserver_KeyPress()
        +  Debug "Got it first"
        +End
        +
        +Public Sub MyTextBox_KeyPress()
        +  Debug "Got it next"
        +End
        + +L'osservatore può annullare l'evento con Stop Event per prevenire l'oggetto dal +sollevarlo effettivamente. + + +[STRING] + +

        UTF-8 Strings

        + +

        Gambas utilizza il set di caratteri UTF-8 per rappresentare le stringhe in memoria. + +

        Ma tutte le funzioni di stringa standard riguardano solo ASCII: +Left, Mid, Right, UCase... + +

        Se si desidera gestire le stringhe UTF-8, è necessario utilizzare i metodi della classe statica +String, che hanno lo stesso nome delle loro controparti standard. + +

        Print Len("bébé");; Left$("bébé", 3)
        +→ 6 bé
        +
        +Print String.Len("bébé");; String.Left("bébé", 3)
        +→ 4 béb
        + + +[ASSIGNMENT] + +

        Assegnazioni

        + +

        Gambas implementa le scorciatoie di assegnazione a cui i programmatori C / C ++ sono abituati. + +

        MyVariable += 2
        +MyVariable *= 4
        +MyVariable &= "Great"
        +è un equivalente di +
        MyVariable = MyVariable + 2
        +MyVariable = MyVariable * 4
        +MyVariable = MyVariable & "Great"
        + +

        E così via... + + +[DEBUG] + +

        Debug

        + +

        È possibile utilizzare l'istruzione Debug per stampare messaggi di debug sulla +console (ovvero l'output di errore standard). Si comporta esattamente come l'istruzione Print. + +

        Questi messaggi hanno come prefisso il nome della classe, il nome del metodo e il numero di +riga dell'istruzione Debug. Se non si desidera il prefisso, è possibile utilizzare +l'istruzione Error anziché Debug. + +

        I messaggi di debug vengono automaticamente rimossi durante la creazione di +un eseguibile senza eseguire il debug delle informazioni. + + +[TRY] + +

        Gestione degli errori (1)

        + +

        La gestione degli errori in Gambas viene eseguita con le seguenti istruzioni: +Try, Error, Catch, and Finally. + +

        Try prova a eseguire una dichiarazione senza generare un errore. La parola chiave +Error viene utilizzata subito dopo per sapere se l'istruzione è stata eseguita correttamente. + +

        Try MyFile = Open "/etc/password" For Write
        +If Error Then Print "Non posso fare quello che voglio!"
        + + +[CATCH] + +

        Gestione degli errori (2)

        + +

        La gestione degli errori in Gambas viene eseguita con le seguenti istruzioni: +Try, Error, Catch, and Finally. + +

        Catch indica l'inizio della parte di gestione degli errori di una funzione o procedura. +È messo alla fine del codice della funzione. + +

        La parte catch viene eseguita quando viene generato un errore tra l'inizio dell'esecuzione della funzione e la sua fine. + +

        Se viene sollevato un errore durante l'esecuzione della parte catch, l'errore viene propagato normalmente. + +

        Sub ProcessFile(FileName As String)
        +  ...
        +  Open FileName For Read As #hFile
        +  ...
        +  Close #hFile
        +  
        +Catch ' Eseguito solo se c'è un errore
        +
        +  Print "Impossibile elaborare il file "; FileName
        +
        +End
        + + +[FINALLY] + +

        Gestione degli errori (3)

        + +

        La gestione degli errori in Gambas viene eseguita con le seguenti istruzioni: +Try, Error, Catch, and Finally. + +

        Finally introduce il codice eseguito alla fine della funzione, anche se viene sollevato un errore durante l'esecuzione. + +

        La parte finally non è obbligatoria. Se c'è una parte catch nella funzione, la parte finally deve precederla. + +

        Se viene generato un errore durante l'esecuzione della parte finally, l'errore viene propagato normalmente. + +

        Sub ProcessFile(FileName As String)
        +  ...
        +  Open FileName For Read As #hFile
        +  ...
        +Finally ' Viene sempre eseguito, anche se viene sollevato un errore
        +
        +  Close #hFile
        +  
        +Catch ' Eseguito solo se c'è un errore
        +  
        +  Print "Impossibile stampare il file "; FileName
        +  
        +End
        + + +[OPTIONAL] + +

        Optional

        + +

        Le funzioni e le procedure in Gambas possono avere argomenti opzionali.

        + +

        Gli argomenti opzionali vengono semplicemente fatti mettendo la parola chiave Optional subito prima del nome dell'argomento.

        + +

        Gli argomenti opzionali possono avere anche un valore predefinito esplicito.

        + +
        Private Sub MyFunction(Param AS String, Optional Optim AS String = "Default")
        +  ...
        +  Print "Necessario: "; param; ", Opzionale: "; optim
        +  ...
        +End
        + + +[ARRAY] + +

        For Each

        + +

        In Gambas puoi facilmente scorrere un array, una raccolta o molte altre classi enumerabili con l'istruzione For Each.

        + +

        Per esempio:

        + +
        Dim Xml As New XmlDocument
        +Dim Node As XmlNode
        +Dim I As Integer
        +
        +' Apre un file XML
        +Xml.Open("pokus.xml")
        +' I children sono indicizzati tramite [i], poiché si tratta di un array
        +For I = 0 To Xml.Root.Children.Count - 1
        +  ' Gli attributi vengono ciclati tramite For Each, poiché si tratta di una collection
        +  For Each Node In Xml.Root.Children[i].Attributes
        +    Print Node.Name;; Node.Value
        +  Next
        +Next
        + + +[ICON] + +

        Icone di default

        + +

        Puoi utilizzare le icone incorporate per una migliore GUI della tua applicazione, le icone sono disponibili in diverse dimensioni predefinite +("small", "medium", "large",...) o in dimensioni assolute (da 16x16 a 256x256).

        + +

        Per esempio: + +

        Image1.Picture = Picture["icon:/32/warning"]
        +Image2.Picture = Picture["icon:/small/error"]
        +
        + +

        Attenzione: è richiesto il componente gb.form. + + +[SETTINGS] + +

        Settings

        + +

        Se hai bisogno di memorizzare la configurazione del tuo programma (come la geometria dei tuoi form), allora sei un ragazzo fortunato. In Gambas è molto semplice ed elegante. :-) + +

        Per salvare la posizione di un form: +

        Settings.Write(TheForm)
        + +

        Per richiamarlo: +

        Settings.Read(TheForm)
        + +Per salvare qualsiasi impostazione: +
        Settings["Slot/Key"] = Value
        + +E per rileggerne le impostazioni: +
        Value = Settings["Slot/Key", DefaultValue]
        + +Queste impostazioni sono memorizzate nel file ~/.config/gambas3/<MyApplication>.conf, +dove <MyApplication> è il nome del tuo progetto. + +

        Attenzione: è richiesto il componente gb.settings. + + +[EDITOR] + +

        Ecco alcuni suggerimenti per l'editor...

        + +

        Due tipi di commenti

        + +
        ' Commento normale
        +
        '' Commento in grassetto
        + +

        I commenti in grassetto sono usati per documentare il tuo codice.

        + +

        Come utilizzare i frammenti di codice

        + +

        Digita main quindi il tasto TAB. Una funzione statica e pubblica di avvio Main viene automaticamente inserita nel codice. + +

        Digita ds quindi il tasto TAB. Una dichiarazione locale di variabile stringa viene inserita automaticamente ed è possibile digitare immediatamente il nome della variabile. + +

        I frammenti di codice sono completamente configurabili dalla finestra di dialogo Preferenze del menu Strumenti dell'IDE. + + +[END] + +

        Hai letto tutti i suggerimenti del giorno. Spero che ora tu sia un esperto di Gambas ! :-)

        + +

        Se vuoi contribuire, invia i nuovi consigli al seguente indirizzo :

        +

        user@lists.gambas-basic.org

        + +

        Grazie in anticipo !

        + diff --git a/app/src/gambas3/tips/tips.nl b/app/src/gambas3/tips/tips.nl new file mode 100644 index 00000000..4cede578 --- /dev/null +++ b/app/src/gambas3/tips/tips.nl @@ -0,0 +1,274 @@ +[WELCOME] + +

        Welkom bij Gambas !

        + +

        Gambas is een grafisch ontwikkel omgeving gebaseerd op een +geavanceerdd Basic interpreter.

        + +

        Gambas is geschreven om eenvoudig en snel +krachtige applicaties te ontwikkelen. Het bouwen van de +programmacode blijft je eigen verantwoordelijkheid...

        + +

        Veel plezier ermee !

        + +

        Benoît Minisini
        +gambas@users.sourceforge.net

        + + +[STARTUP] + +

        Elk project moet een startup class hebben. Deze +startup class moet een piblieke methode Main hebben, +zonder argumenten. Deze Main methode fungeerd als +de opstart methode voor de applicatie.

        + +

        Je kunt de startup class definieren door in de projectboom +met de rechter muisknop op het object te klikken en +startup class in het popup menu te selecteren

        + + + +

        Het is niet nodig om een Main methode in een opstart +formulier te declareren, omdat het opstart formulier al een Main methode bevat.

        + +

        Deze reeds gedefinieerde Main methode initieerd het formulier, net zoals in +Visual Basic™.

        + + +[OPEN] + +

        De OPEN instructie van Gambas werkt niet zoals de Visual Basic variant. +Het retourneerd geen integer, maar een File object.

        + +

        Dus in plaats van:

        + +
        DIM handle AS Integer
        +...
        +OPEN "mijnfile" FOR READ AS #handle
        + +

        gebruik je :

        + +
        DIM handle AS File
        +...
        +handle = OPEN "mijnfile" FOR READ
        + + +[CATDIR] + +

        Weet je dat je directory- en filenamen kunt koppelen met de &/ operator ? +Deze operator lost alle problemen met eindigende slashes voor je op.

        + +

        Bijvoorbeeld:

        + +
        PRINT "/home/gambas" &/ ".bashrc"
        +/home/gambas/.bashrc
        +
        +PRINT "/home/gambas/" &/ "/tmp" &/ "foo.bar"
        +/home/gambas/tmp/foo.bar
        +
        + +

        Is dit niet fantastisch ?

        + + +[EXEC] + +

        Je kunt een 'executable' file (binairy) maken van je gehele project. +Selecteer Make executable in het Project menu.

        + +

        Als Gambas een binairy file voor je maakt, plaatst het +het resultaat in de standaard directory van je project. +Deze executable krijgt dezelfde naam als het project.

        + + +[PATH] +

        +Relatieve paden hebben altijd een speciale betekenis in Gambas. +Ze refereren altijd naar bestanden in je project. +

        +Er is geen concept als current directory, en geen commando als +CHDIR om het te veranderen. +

        +Wees voorzichtig: je moet altijd relatieve paden gebruiken voor verwijzingen +naar andere files in het project, omdat volledige paden niet meer werken als er +een executable van het project gemaakt wordt.

        + +[GLOBAL] + +Er zijn geen globale variabelen in Gambas! +

        +Als oplossing kun je ze in je main module plaatsen en declareren als PUBLIC. +

        +Als je geen main module hebt, maar een main form, declareer ze dan als STATIC PUBLIC. +

        +Om bij deze variabelen te komen gebruik je de naam van de module: MijnMainModule.MijnGlobaleVariable of +MijnMainForm.MijnGlobaleVariable. + + +[EMPTY] + +

        Om te kijken of een string leeg is hoef je geen gebruik te maken van de +Len() functie. Je kunt het direct testen: een lege string +is FALSE en een niet-lege string is TRUE.

        + +

        Bijvoorbeeld, in plaats van :

        + +
        IF Len(MijnString) > 0 THEN ...
        +IF Len(MijnString) = 0 THEN ...
        + +

        Kun je sneller :

        + +
        IF MijnString THEN ...
        +IF NOT MijnString THEN ...
        + + +[EVENT] + +

        Elke controller, en elk object dat een gebeurtenis (event) kan oproepen, heeft een +event observer en een event group name.

        + +

        De event observer ondervangt ieder event opgeroepen door het object, en +de 'event group name' is het voorvoegsel van de procedure die opgeroepen wordt om het +event af te handelen.

        + +

        Standaard is de event observer het object waar je de controller gemaakt hebt, en de +group name is de naam van de controller.

        + +

        Op deze manier ontvangt een formulier alle gebeurtenissen die door controllers op dit +formulier gemaakt zijn.

        + +
        ' Gambas form
        +DIM hButton AS Button
        +
        +PUBLIC SUB _new()
        +  hButton = NEW Button(ME) AS "MyButton"
        +END
        +
        +PUBLIC SUB MyButton_Click()
        +  PRINT "You have clicked MyButton !"
        +END
        +
        + + +[FORM] + +

        In Gambas, is een formulier zijn eigen event observer, +zodat je gebeurtenissen als Resize, +Activate, ...) kunt afhandelen in zijn eigen class code.

        + +

        Op deze manier worden de newbies van Visual Basic niet teveel +afgeschrikt :-).

        + + +[EMBED] + +

        Je kunt bij Gambas een formulier in een ander formulier invoegen + !

        + +

        Om zo'n krachtige actie te doen hoef je enkel een ouder container (parent) mee te geven +als laatste parameter bij het oproepen van het formulier.

        + +

        Bij voorbeeld :

        +

        DIM hForm AS MijnDialog
        +DIM hSuperControl AS MijnForm

        +' Create a dialog
        +hForm = NEW MijnDialog
        +' Insert a form into this dialog
        +' Note that this form takes two parameters before the container
        +hSuperControl = NEW MijnForm(Param1, Param2, MijnDialog)
        +' Moves and resizes the form
        +hSuperControl.Move(8, 8, 128, 64)
        +

        + +

        Let op: een formulier ingevoegd in een ander is nog steeds een formulier, +met zijn eigen event observer.

        + + +[GROUP] + +

        Elke controller heeft een (Group) eigenschap. +Als deze eigenschap wordt gebruikt wordt de naam van de groep gebuikt voor het +afhandelen van de events, en niet de naam van de controller. +

        + +

        Stel: we hebben een Button genaamd btnAction +Met de volgende Click event handler :

        + +
        PUBLIC SUB btnAction_Click()
        + +

        Als je de (Group) eigenschap van btnAction zet op +MijnGroup, dan wordt de event handlerdie alle events ontvangt:

        + +
        PUBLIC SUB MijnGroup_Click()
        + +

        Op deze manier kun je verschillende controllers dezelfde functie toekennen. +De controllers hoeven hiervoor niet eens van hetzelfde type te zijn!

        + +

        NB : Een oude Visual Basic veteraan zal het systeem van een +control array herkennen, maar dan in een krachtigere uitvoering :-).

        + + +[TAG] + +

        Elke controlller heeft een Tag eigenschap. Deze eigenschap is voor +de programmeur, en kan elke gewenste VARIANT gegevens bevatten die je +relevant vindt.

        + +

        Deze eigenschap is erg handig om verschillende controllers die bij elkaar +in dezelfde group zitten te onderscheiden +binnen de gezamenlijke event handler van deze group.

        + + + +[LAST] + +

        Het LAST commando retourneerd de laatst opgeroepen controller. +Dit is erg handis als je een event handler wilt schrijven die +onafhankelijk is van de controller naam.

        + +

        Bijvoorbeeld: Stel je wilt een rekenmachine programmeren. +Je hebt tien knoppen gedefinieerd, elk voor een cijfer, en de knoppen gehangen +aan de group "Digit". De Tag van elke controlller is gelijk aan het +getal op de button. Je event handler kan er dan zo uit zien :

        + +

        PUBLIC SUB Digit_Click()

        +  Display = Display & LAST.Tag
        +  RefreshDisplay

        +END

        + + +[LEFT] + +

        De bekende BASIC routines Left$, Right$ +en Mid$ hebben handige functies in Gambas

        + +

        De tweede parameter van Left$ en Right$ is +optioneel, en is standaard 1.

        + +

        Left$("Gambas") retourneerd "G"
        +Right$("Gambas") retourneerd "s"

        + +

        De tweede parameter mag negatief zijn, en geeft dan het aantal karakters dat +je niet wilt.

        + +

        Left$("Gambas", -2) retourneerd "Gamb"
        +Right$("Gambas", -2) retourneerd "mbas"

        + +

        Vanzelfsprekend, het derde argument van Mid$ mag negatief zijn, en geeft +dan het aantal karakters vanaf het eind van de string dat genegeerd moet worden.

        + +

        Mid$("Gambas", 2, -2) retourneerd "amb" + + +[END] + +

        Je hebt alle tips van de dag gelezen. Ik hoop dat je nu een Gambas +expert geworden bent ! :-)

        + +

        Als je tips toe te voegen hebt, zend je nieuwe tips dan naar het volgende +adres :

        +

        gambas@users.sourceforge.net

        + +

        Alvast bedankt !

        + + + diff --git a/app/src/gambas3/tips/tips.pl b/app/src/gambas3/tips/tips.pl new file mode 100644 index 00000000..74bcb7ca --- /dev/null +++ b/app/src/gambas3/tips/tips.pl @@ -0,0 +1,280 @@ +[WELCOME] + +

        Witaj w Gambasie !

        + +

        Gambas jest zintegrowanym środowiskiem programistycznym + bazującym na zaawansowanym interpreterze Basica.

        + +

        Gambas umożliwi Ci łatwe i szybkie tworzenie programów. +Jednak to, czy programy będą ładne, funcjonalne i przejrzyste zależy tylko od Ciebie... +

        + +

        Miłej pracy !

        + +

        Benoît Minisini
        +gambas@users.sourceforge.net

        + + +[STARTUP] + +

        Każdy projekt musi mieć klasę startową. Klasa +startowa musi definiować statyczną metodę publiczną o nazwie Main +bez argumentów, która uruchomi Twój program.

        + +

        Możesz zdefiniować klasę startową poprzez kliknięcie prawym klawiszem +myszki w drzewie projektu i wybrać opcję Klasa startowa w menu podręcznym.

        + +

        Nie jest konieczne definiowanie metody Main w formularzu +startowym, ponieważ jest już w nim predefiniowana.

        + +

        Ta predefiniowana metoda startowa inicjuje formularz i wyświetla go podobnie jak +w Visual Basic™.

        + + +[OPEN] + +

        W Gambasie instrukcja OPEN nie działa jak ta +w Visual Basicu. Nie zwraca pliku jako integer, ale jako obiekt File.

        + +

        Dlatego, zamiast pisać :

        + +
        DIM hPliku AS Integer
        +...
        +OPEN "MójPlik" FOR READ AS #hPliku
        + +

        musisz napisać :

        + +
        DIM hPliku AS File
        +...
        +hPliku = OPEN "MójPlik" FOR READ
        + + +[CATDIR] + +

        Czy wiesz, że możesz połączyć ścieżkę z nazwą pliku +używając operatora &/ ? Ten operator +połączy dwa łańcuchy znaków dodając między nimi '/', +jeśli wcześniej go tam nie było, lub zredukuje jego wielokrotność.

        + +

        Przykład:

        + +
        PRINT "/home/gambas" &/ ".bashrc"
        +/home/gambas/.bashrc
        +
        +PRINT "/home/gambas/" &/ "/tmp" &/ "foo.bar"
        +/home/gambas/tmp/foo.bar
        +
        + +

        Czyż to nie wpaniałe ?

        + + +[EXEC] + +

        Z projektu możesz utworzyć plik uruchamialny. + Wybierz opcję Utwórz plik uruchamialny w menu Projekt.

        + +

        Kiedy Gambas stworzy plik uruchamialny umieści go +w domyślnym katalogu projektu. +Nazwa pliku uruchamialnego jest taka sama jak nazwa Twojego projektu.

        + + +[PATH] +

        +Ścieżki względne mają specjalne znaczenie w Gambasie. +Zawsze odwołują się do pliku wewnątrz Twojego projektu. + +

        +Nie istnieje idea bieżącego katalogu i nie ma słowa kluczowego +takiego jak CHDIR, które pozwalałoby na zmianę katalogu roboczego. +

        +Uwaga: musisz używać tylko ścieżek względnych do +dostępu do plików wewnątrz projektu, ponieważ ścieżki bezwględne + po utworzeniu pliku uruchamialnego nie będą działać poprawnie. + + +[GLOBAL] + +W Gambasie nie ma zmiennych globalnych! +

        +Aby to obejść, zadeklaruj zmienne jako PUBLIC w module startowym. +

        +Jeśli nie masz w projekcie modułu startowego tylko formularz +startowy, wtedy zadeklaruj zmienne jako STATIC PUBLIC. +

        +Aby mieć dostęp do tych zmiennych musisz użyć nazwy modułu lub +formularza startowego przed nazwą zmiennej: +MójModułStartowy.MojaZmiennaGlobalna lub +MójFormularzStartowy.MojaZmiennaGlobalna. + + +[EMPTY] + +

        Nie jest konieczne użycie funcji Len() aby się dowiedzieć czy +łańcuch znaków jest pusty. Możesz przetestować go bezpośrednio; +jeśli łańcuch jest pusty, to zostanie zwrócone FALSE, a jeśli nie jest pusty +zostanie zwrócone TRUE.

        + +

        Na przykład, zamiast :

        + +
        IF Len(MójŁańcuchZnaków) > 0 THEN ...
        +IF Len(MójŁańcuchZnaków) = 0 THEN ...
        + +

        Możesz wpisać :

        + +
        IF MójŁańcuchZnaków THEN ...
        +IF NOT MójŁańcuchZnaków THEN ...
        + + +[EVENT] + +

        Każda kontrolka i każdy obiekt, który może wywołać zdarzenie +posiada obserwatora zdarzenia (event observer) i +nazwę grupy zdarzenia.

        + +

        Obserwator zdarzenia wyłapuje każde zdarzenie wywołane przez obiekt, +a nazwa grupy zdarzenia jest prefiksem procedury wywołanej do zarządzania +zdarzeniem.

        + +

        Domyślnie, obserwator zdarzenia jest obiektem +utworzonej kontrolki, a nazwa grupy jest nazwą tej kontrolki. +

        + +

        W ten sposób formularz otrzymuje wszystkie zdarzenia wywołane przez +kontrolki utworzone wewnątrz tego formularza.

        + +
        ' Gambas form
        +DIM hPrzycisku AS Button
        +
        +PUBLIC SUB _new()
        +  hPrzycisku = NEW Button(ME) AS "MójPrzycisk"
        +END
        +
        +PUBLIC SUB MójPrzycisk_Click()
        +  PRINT "Kliknąłeś w MójPrzycisk !"
        +END
        +
        + + +[FORM] + +

        W Gambasie formularz jest obserwatorem +własnych zdarzeń, w związku z czym możesz bezpośrednio zarządzać +jego zdarzeniami (takimi jak Resize, +Activate, ...) w kodzie jego własnej klasy.

        + +

        Dzięki temu początkujący w Gambasie, pracujący wcześniej w +Visual Basicu nie są zdezorientowani :-).

        + + +[EMBED] + +

        W Gambasie możesz osadzać dowolny formularz + w innym formularzu !

        + +

        Aby uzyskać tak wspaniałą funkcjonalność +wystarczy zainicjować formularz poprzez podanie +nadrzędnego kontenera jako ostatniego argumentu konstruktora.

        + +

        Przykład :

        +

        DIM hFormularza AS MójFormularz
        +DIM hPodformularza AS MójPodformularz

        +' Tworzenie formularza głównego
        +hFormularza = NEW MójFormularz
        +' Wstawienie podformularza do formularza głównego
        +'Zauważ, że ten formularz pobiera dwa parametry przed kontenerem
        +hPodformularza = NEW MójPodformularz(Param1, Param2, MójFormularz)
        +' Przenieś i zmień wielkość formularza
        +hPodformularza.Move(8, 8, 128, 64)
        +

        + +

        Uwaga: formularz osadzony w innym formularzu jest nadal formularzem +i tym samym jest własnym obserwatorem zdarzeń.

        + + +[GROUP] + +

        Każda kontrolka posiada właściwość (Group). +Kiedy właściwość ta jest ustawiona, prefiks nazwy uchwytu zdarzenia +jest nazwą grupy, a nie nazwą kontrolki.

        + +

        Załóżmy, że masz Przycisk o nazwie btnMójPrzycisk +z następującym uchwytem zdarzenia Click:

        + +
        PUBLIC SUB btnMójPrzycisk_Click()
        + +

        Jesli ustawisz właściwość (Group) dla btnMójPrzycisk +na MojaGrupa wtedy uchwyt zdarzenia, który otrzyma +zdarzenia z przycisku będzie następujący:

        + +
        PUBLIC SUB MojaGrupa_Click()
        + +

        Ta właściwość pozwala Ci na wychwytywanie zdarzeń różnych kontrolek +w jednej funkcji, a kontrolki tej samej grupy nie muszą być tego samego typu !

        + +

        Notatka : Starzy weterani Visual Basica moga rozpoznać ideę +tablicy kontrolek (control array), ale w bardziej funkcjonalnej implementacji. :-)

        + + +[TAG] + +

        Każda kontrolka ma właściwość Tag. Ta właściwość jest przeznaczona +dla programistów i może zawierać dowolne dane typu VARIANT, które +uważa on za istotne.

        + +

        To jest bardzo użyteczne kiedy chcesz rozróżnić kontrolki tej samej grupy we +wspólnym uchwycie zdarzenia.

        + + +[LAST] + +

        Słowo kluczowe LAST zwraca ostatnią kontrolkę, która odebrała +zdarzenie. Jest to bardzo użyteczne kiedy chcesz napisać uchwyt zdarzenia, + który jest niezależny od nazwy kontrolki.

        + +

        Przykładowo, przypuśćmy, że chcesz napisać program kalkulator. +Zdefiniowałeś przyciski, po jednym dla każdej cyfry, każdy w tej samej grupie +o nazwie "Cyfry". Właściwość Tag każdej kontrolki zawiera cyfrę widoczną +na przycisku. Twój uchwyt zdarzenia może wyglądać tak:

        + +

        PUBLIC SUB Cyfry_Click()

        +  Display = Display & LAST.Tag
        +  RefreshDisplay

        +END

        + + +[LEFT] + +

        Dobrze znane funkcje z BASICa: Left$, Right$ +i Mid$ mają dodatkową użyteczność w Gambasie.

        + +

        Drugi parametr Left$ i Right$ jest opcjonalny i domyślnie zwraca +jeden znak.

        + +

        Left$("Gambas") zwraca "G"
        +Right$("Gambas") zwraca "s"

        + +

        Drugi parametr może być ujemny i wtedy funkcja zwraca wartość +bez określonej ilości niechcianych znaków.

        + +

        Left$("Gambas", -2) zwraca "Gamb"
        +Right$("Gambas", -2) zwraca "mbas"

        + +

        Na podobnej zasadzie, trzeci argument funkcji Mid$ +może mieć również wartość ujemną.

        + +

        Mid$("Gambas", 2, -2) zwraca "amb" + + +[END] + +

        Przeczytałeś wszystkie porady dnia. Mam nadzieję, że dzięki nim stałeś się +ekspertem programowania w Gambasie ! :-)

        + +

        Jesli chcesz dodać nowe porady, prześlij je na adres + :

        +

        gambas@users.sourceforge.net

        + +

        Z góry dziękuję !

        + + + diff --git a/app/src/gambas3/tips/tips.ru b/app/src/gambas3/tips/tips.ru new file mode 100644 index 00000000..402cc89b --- /dev/null +++ b/app/src/gambas3/tips/tips.ru @@ -0,0 +1,578 @@ +[WELCOME] + +

        Добро пожаловать в Gambas!

        + +

        Gambas - это графическая среда разработки, +основанная на продвинутом интерпретаторе Basic.

        + +

        Цель Gambas - дать вам возможность легко и +быстро создавать мощные программы. Но чистые +программы остаются на вашей ответственности...

        + +

        Наслаждайтесь!

        + +

        Benoît Minisini
        g4mba5@gmail.com


        + + +[STARTUP] + +

        Класс запуска

        + +

        Каждый проект должен иметь класс запуска. Этот класс +запуска должен определять статический открытый метод +с именем Main без аргументов, который будет действовать +как метод запуска вашей программы.

        + +

        Вы можете определить класс запуска, щёлкнув по +нему правой кнопкой мыши в дереве проекта и +выбрав класс запуска во всплывающем меню.

        + +

        Нет необходимости определять метод Main в форме +запуска, поскольку он уже имеет предопределённый метод.

        + +

        Этот предопределённый метод запуска создаёт экземпляр формы и показывает её как в +Visual Basic™.

        + + +[OPEN] + +

        Открыть

        + +

        Инструкция Open в Gambas не работает +как в Visual Basic™. Она не возвращает файл как целое число, +а как объект File.

        + +

        Итак, вместо того, чтобы написать:

        + +
        Dim handle As Integer
        +...
        +Open "myfile" For Read As #handle
        + +

        Вы должны написать:

        + +
        Dim handle As File
        +...
        +handle = Open "myfile" For Read
        + + +[CATDIR] + +

        Конкатенация путей

        + +

        Знаете ли вы, что вы можете объединить имена директорий +и файлов с помощью оператора &/? Этот +оператор имеет дело с косыми чертами, так что получающийся +путь идеален.

        + +

        Например:

        + +
        Print "/home/gambas" &/ ".bashrc"
        +→ /home/gambas/.bashrc
        +
        +Print "/home/gambas/" &/ "/tmp" &/ "foo.bar"
        +→ /home/gambas/tmp/foo.bar
        + +

        Разве это не чудесно?

        + + +[EXEC] + +

        Исполняемый файл

        + +

        Вы можете создать исполняемый файл из всего вашего проекта. +Выберите Создать исполняемый файл в меню Проект.

        + +

        Когда Gambas создаёт исполняемый файл, он по +умолчанию помещает результат в директорию вашего проекта. +Имя исполняемого файла совпадает с именем вашего проекта.

        + + +[PATH] + +

        Относительные пути

        + +

        Относительные пути имеют особое значение в Gambas. +Они всегда ссылаются на файлы внутри ваших проектов.

        +

        Нет понятия текущей директории и нет ключевого слова, такого как CHDIR, чтобы изменить её.

        +

        Будьте осторожны: вы должны использовать относительные пути +только для доступа к файлам проекта, потому что абсолютные пути +больше не будут работать, когда вы создаёте исполняемый файл.

        + + +[GLOBAL] + +

        Глобальные переменные

        + +В Gambas нет глобальных переменных! +

        В качестве обходного пути, поместите их в свой основной модуль +и объявите их как Public.

        +

        Если у вас нет основного модуля main в вашем проекте, но +есть основная форма, то объявите их как Static Public.

        +

        Чтобы получить доступ к этим переменным, необходимо использовать +имя основного модуля main или форму: MyMainModule.MyGlobalVariable +или MyMainForm.MyGlobalVariable.

        + + +[EMPTY] + +

        Пустые строки

        + +

        Чтобы узнать, является ли строка пустой, нет необходимости использовать +функцию Len(). Вы можете непосредственно проверить это, +так как пустая строка - False, а непустая строка - True.

        + +

        Например, вместо того, чтобы делать:

        + +
        If Len(MyString) > 0 Then ...
        +If Len(MyString) = 0 Then ...
        + +

        Вы должны делать:

        + +
        If MyString THEN ...
        +If Not MyString THEN ...
        + + +[TRANSLATE] + +

        Перевод

        + +

        Приложения Gambas полностью переводимое, при условии, что вы +сообщаете ему, какие строки должны быть переведены, а какие нет.

        +

        Чтобы пометить строки как переводимые, просто заключите их в круглые скобки:

        + +
        Print ("Translate me")
        +Print "But do not translate me!"
        + + +[SUBST] + +

        Subst$

        + +

        Функция Subst$() очень полезна для интернационализации вашего приложения.

        + +

        Требуется как минимум два аргумента. Первый - это текстовая маска, к которой применяется подстановка. +Другие являются аргументами замещения, пронумерованными от одного.

        + +

        Каждый &X шаблон в строке замены будет заменён X-ым аргументом замены. +Например:

        + +
        Print Subst(("Substitution of &1, &2 and &3"),
        +  "first", "second", "third")
        +
        +→ Substitution of first, second and third
        + + +[EVENT] + +

        Обработчики событий

        + +

        Каждый элемент управления и каждый объект, который может вызывать +события, имеет наблюдателя событий и имя группы событий.

        + +

        Наблюдатель событий перехватывает каждое событие, вызванное объектом, +а имя группы событий является префиксом процедуры, вызываемой для +управления событием. Эта функция называется обработчиком событий.

        + +

        По умолчанию этот наблюдатель событий является объектом, в котором вы +создали элемент управления, а имя группы - это имя элемента управления.

        + +

        Таким образом, форма получает все события, созданные +элементами управления, которые вы создали внутри.

        + +
        ' Gambas form
        +Dim hButton As Button
        +
        +Public Sub _new()
        +  hButton = New Button(Me) As "MyButton"
        +End
        +
        +Public Sub MyButton_Click()
        +  Print "You have clicked MyButton !"
        +End
        + + +[GROUP] + +

        Группы элементов управления

        + +

        Каждый элемент управления имеет свойство (Group). Когда это +свойство установлено, префикс имени обработчика события - это +имя группы, а не имя элемента управления.

        + +

        Предположим, у вас есть кнопка с именем btnAction со следующим обработчиком события Click:

        + +
        Public SubbtnAction_Click()
        + +

        Если вы установите свойство (Group) для btnAction +в значение "MyGroup", то обработчик событий, который будет +получать события от кнопки, будет выглядеть следующим образом:

        + +
        Pubic Sub MyGroup_Click()
        + +

        Это свойство позволяет обрабатывать события различных элементов +управления в одной функции. И элементы управления одной и той же +группы не обязательно должны быть одного типа!

        + +

        Примечание: Старый ветеран Visual Basic™ может +распознавать концепцию управляющего массива, но в более мощной +реализации. :-)

        + + +[FORM] + +

        Формы

        + +

        В Gambas форма является собственным наблюдателем событий, +так что вы можете напрямую управлять её событиями (такими как +Resize, Activate, ...) в своём собственном коде класса.

        + +

        Таким образом, новички из Visual Basic™ +не дезориентированы :-).

        + + +[EMBED] + +

        Встраивание форм

        + +

        Вы можете встроить любую форму в другие формы с Gambas!

        + +

        Чтобы сделать такую мощную вещь, просто создайте экземпляр формы, +передав родительский контейнер в качестве последнего аргумента конструктора.

        + +

        Например:

        +
        Dim hForm As MyDialog
        +Dim hSuperControl As MyForm
        +' Создать диалог
        +hForm = New MyDialog
        +' Вставьте форму в этот диалог
        +' Обратите внимание, что эта форма принимает два параметра перед контейнером
        +hSuperControl = New MyForm(Param1, Param2, MyDialog)
        +' Переместить и изменить размер формы
        +hSuperControl.Move(8, 8, 128, 64)
        + +

        Будьте осторожны: форма, встроенная в другую форму, всё ещё является формой, как и её собственный наблюдатель событий.

        + + +[TAG] + +

        Свойство тега

        + +

        Каждый элемент управления имеет свойство Tag. Это свойство +предназначено для программиста и может содержать любые данные +Variant, которые вы считаете уместными.

        + +

        Это очень полезно, когда вы хотите различить элементы управления +одной и той же группы в общем обработчике событий.

        + + +[LAST] + +

        Последний

        + +

        Ключевое слово Last возвращает последний элемент управления, +который получил событие. Это очень полезно, когда вы хотите написать +обработчик событий, который не зависит от имени элемента управления.

        + +

        Например, предположим, что вы хотите написать калькулятор. +Вы определили десять кнопок, по одной для каждой цифры, каждая +в одной группе элементов управления "Digit". Tag каждого элемента +управления устанавливается на цифру, нарисованную на кнопке.

        + +

        Ваш обработчик событий может выглядеть так:

        + +
        Public Sub Digit_Click()
        +
        +  Display = Display & Last.Tag
        +  RefreshDisplay
        +END
        + + +[LEFT] + +

        Left$ / Mid$ / Right$

        + +

        Хорошо известные базовые процедуры Left$, Right$ +и Mid$ имеют полезное поведение в Gambas

        + +

        Второй параметр Left$ и Right$ является +опциональным и по умолчанию равен единице.

        + +

        Left$("Gambas") возвращает "G"
        Right$("Gambas") возвращает "s"

        + +

        Этот второй параметр может быть отрицательным, а в таком случае +указывается количество символов, которые не нужно извлекать.

        + +

        Left$("Gambas", -2) возвращает "Gamb"
        Right$("Gambas", -2) возвращает "mbas"

        + +

        Точно так же, третий аргумент Mid$ может быть +отрицательным, а в таком случае указывается количество символов +в конце строки, которые не нужно извлекать.

        + +

        Mid$("Gambas", 2, -2) возвращает "amb"

        + + +[OBSERVER] + +

        Наблюдатель

        + +

        Класс Observer позволяет вам перехватывать все события, +вызванные объектом, до того, как они действительно будут отправлены.

        + +
        MyTextBox = New TextBox(Me) As "MyTextBox"
        +MyObserver = New Observer(MyTextBox) As "MyObserver"
        +...
        +Public Sub MyObserver_KeyPress()
        +  Debug "Got it first"
        +End
        +
        +Public Sub MyTextBox_KeyPress()
        +  Debug "Got it next"
        +End
        + +

        Наблюдатель может отменить событие с помощью Stop Event, чтобы не дать объекту эффективно +поднять его.

        + + +[STRING] + +

        Строки UTF-8

        + +

        Gambas использует кодировку UTF-8 для представления строк в памяти.

        + +

        Но все стандартные строковые функции имеют дело только с ASCII: +Left, Mid, Right, UCase...

        + +

        Если вы хотите работать со строками UTF-8, вы должны использовать методы +статического класса String, которые имеют то же имя, что и их стандартные аналоги.

        + +
        Print Len("bébé");; Left$("bébé", 3)
        +→ 6 bé
        +
        +Print String.Len("bébé");; String.Left("bébé", 3)
        +→ 4 béb
        + + +[ASSIGNMENT] + +

        Присваивания

        + +

        Gambas реализует ярлыки присваивания, к которым привыкли программисты C/C ++.

        + +
        MyVariable += 2
        +MyVariable *= 4
        +MyVariable &= "Great"
        +является эквивалентом этого: +
        MyVariable = MyVariable + 2
        +MyVariable = MyVariable * 4
        +MyVariable = MyVariable & "Great"
        + +

        И так далее...

        + + +[DEBUG] + +

        Отладка

        + +

        Вы можете использовать инструкцию Debug для вывода +сообщений отладки в консоль (то есть стандартный вывод ошибок). Она +ведёт себя так же, как инструкция Print.

        + +

        Эти сообщения имеют префикс имени класса, имени метода и номера строки +инструкции Debug. Если вам не нужен этот префикс, вы можете +использовать инструкцию Error +вместо Debug.

        + +

        Сообщения отладки автоматически удаляются при создании исполняемого файла +без отладочной информации.

        + + +[TRY] + +

        Управление ошибками (1)

        + +

        Управление ошибками в Gambas осуществляется с помощью следующих инструкций: +Try, Error, Catch и Finally.

        + +

        Try пытается выполнить инструкцию, не вызывая ошибки. Ключевое слово Error +используется только для того, чтобы узнать, правильно ли был выполнен оператор.

        + +
        Try MyFile = Open "/etc/password" For Write
        +If Error Then Print "I cannot do what I want!"
        + + +[CATCH] + +

        Управление ошибками (2)

        + +

        Управление ошибками в Gambas осуществляется с помощью следующих инструкций: +Try, Error, Catch и Finally.

        + +

        Catch указывает начало части управления ошибками функции или процедуры. +Он ставится в конце кода функции.

        + +

        Часть catch выполняется при возникновении ошибки между началом +выполнения функции +и её концом.

        + +

        Если возникает ошибка во время выполнения части catch, она нормально распространяется.

        + +
        Sub ProcessFile(FileName As String)
        +  ...
        +  Open FileName For Read As #hFile
        +  ...
        +  Close #hFile
        +  
        +Catch ' Выполняется только в случае ошибки
        +
        +  Print "Cannot process file "; FileName
        +
        +End
        + + +[FINALLY] + +

        Управление ошибками (3)

        + +

        Управление ошибками в Gambas осуществляется с помощью следующих инструкций: +Try, Error, Catch и Finally.

        + +

        Finally представляет код, выполняемый в конце функции, даже если +во время её выполнения +возникла ошибка.

        + +

        Часть finally не является обязательной. Если в функции есть часть catch, то часть finally должна предшествовать ей.

        + +

        Если возникает ошибка во время выполнения части finally, она нормально распространяется.

        + +
        Sub ProcessFile(FileName As String)
        +  ...
        +  Open FileName For Read As #hFile
        +  ...
        +Finally ' Всегда выполняется, даже если возникла ошибка
        +
        +  Close #hFile
        +  
        +Catch ' Выполняется только в случае ошибки
        +  
        +  Print "Cannot print file "; FileName
        +  
        +End
        + + +[OPTIONAL] + +

        Опциональный

        + +

        Функции и процедуры в Gambas могут иметь опциональные аргументы.

        + +

        Опциональные аргументы можно сделать, просто указав ключевое слово +Optional непосредственно перед именем аргумента.

        + +

        Опциональные аргументы также могут иметь явное значение по умолчанию.

        + +
        Private Sub MyFunction(Param AS String, Optional Optim AS String = "Default")
        +  ...
        +  Print "Required: "; param; ", Optional: "; optim
        +  ...
        +End
        + + +[ARRAY] + +

        For Each

        + +

        В Gambas вы можете легко проходить через массив, коллекцию или +множество других перечисляемых классов с помощью инструкции For Each.

        + +

        Например:

        + +
        Dim Xml As New XmlDocument
        +Dim Node As XmlNode
        +Dim I As Integer
        +
        +' Открыть файл XML
        +Xml.Open("pokus.xml")
        +' Потомки индексируются через [i], так как это массив
        +For I = 0 To Xml.Root.Children.Count - 1
        +  'Атрибуты зацикливаются через For Each, так как это коллекция
        +  For Each Node In Xml.Root.Children[i].Attributes
        +    Print Node.Name;; Node.Value
        +  Next
        +Next
        + + +[ICON] + +

        Значки по умолчанию

        + +

        Вы можете использовать встроенные значки для более приятного графического +интерфейса вашего приложения, которые доступны в нескольких предопределённых +размерах («маленький/small», «средний/medium», «большой/large», ...) или абсолютных размерах (от 16x16 до 256x256).

        + +

        Например:

        + +
        Image1.Picture = Picture["icon:/32/warning"]
        +Image2.Picture = Picture["icon:/small/error"]
        + +

        Предупреждение: требуется компонент gb.form.

        + + +[SETTINGS] + +

        Параметры

        + +

        Если вам нужно сохранить конфигурацию вашей программы (например, геометрию +ваших форм), то вы счастливчик. Это очень легко и элегантно в Gambas. :-)

        + +

        Чтобы сохранить положение формы:

        +
        Settings.Write(TheForm)
        + +

        Для того, чтобы вспомнить:

        +
        Settings.Read(TheForm)
        + +Чтобы сохранить любые настройки: +
        Settings["Slot/Key"] = Value
        + +И прочитать настройки обратно: +
        Value = Settings["Slot/Key", DefaultValue]
        + +Эти настройки хранятся в файле ~/.config/gambas3/<MyApplication>.conf, +где <MyApplication> - это название вашего проекта. + +

        Предупреждение: требуется компонент gb.settings.

        + + +[EDITOR] + +

        Вот несколько советов по редактору...

        + +

        Два типа комментариев

        + +
        ' Нормальный комментарий
        +
        '' Жирный комментарий
        + +

        Жирные комментарии используются для документирования вашего кода.

        + +

        Как использовать фрагменты кода

        + +

        Давайте напечатаем main, затем нажмём клавишу TAB. Статическая +публичная функция запуска Main автоматически вставляется в ваш код.

        + +

        Давайте напечатаем ds, затем нажмём клавишу TAB. Объявление +локальной строковой переменной вставляется автоматически, и вы можете сразу же ввести имя переменной.

        + +

        Фрагменты кода полностью настраиваются в диалоговом окне «Предпочтения» меню «Инструменты» среды IDE.

        + + +[END] + +

        Это всё, друзья!

        + +

        Вы прочитали все полезные советы. Я надеюсь, что теперь вы +стали экспертом Gambas! :-)

        + +

        Если вы хотите внести свой вклад, отправьте новые советы по следующему +адресу:

        +

        user@lists.gambas-basic.org

        + +

        Заранее спасибо!

        diff --git a/app/src/gambas3/tips/tips.sl b/app/src/gambas3/tips/tips.sl new file mode 100644 index 00000000..5d2521a6 --- /dev/null +++ b/app/src/gambas3/tips/tips.sl @@ -0,0 +1,236 @@ +[WELCOME] + +

        Dobrodošli v Gambas!

        + +

        Gambas je grafično razvojno okolje +temelječe na Basic interpreterju.

        + +

        Cilj Gambasa je omogočiti uporabniku hitro in +enostavno izdelavo zmogljivih programov. Čista in lepa koda seveda +ostaja tvoja odgovornost...

        + +

        Uživaj!

        + +

        Benoît Minisini
        +gambas@users.sourceforge.net

        + + +[STARTUP] + +

        Vsak program mora imeti zagonski razred. V njem mora biti +določena javna metoda z imenom Main brez argumentov, ki bo +služila kot zagonska metoda programa.

        + +

        Zagonski razred lahko določiš z desnim klikom na razred v drevesu projekta +in nato v meniju izbereš Zagonski razred.

        + +

        Določitev metode Main v zagonski formi ni nujna, ker je ta metoda že vnaprej določena.

        + +

        Ta vnaprej določena metoda instancira in prikaže formo, prav kakor v +Visual Basicu™.

        + + +[EXEC] + +

        Iz celotnega projekta lahko izdelaš izvršljivo datoteko. V meniju +Projekt izberi Izdelaj izvršljivo datoteko.

        + +

        Gambas bo izdelal izvršlivo datoteko in jo zapisal v mapo, kjer je shranjen projekt. +Izvršljiva datoteka ima enako ime kot projekt.

        + +[PATH] +

        +Relativne poti imajo v Gambasu poseben pomen. +Vedno se nanašajo na datoteke znotraj projektov. +

        +Koncepta trenutne mape ni, kot tudi ni ključne besede CHDIR za njeno spreminjanje. +

        +Pozor: relativne poti uporabljaj samo za dostop do datotek projekta, ker absolutne poti ne bodo več delovale, ko bo izdelana izvršljiva datoteka. + + +[GLOBAL] + +V Gambasu ni globalnih spremenljivk! +

        +To lahko obideš tako, da spremenljivke najaviš v glavnem modulu kot PUBLIC. +

        +Če projekt nima glavnega modula, ima pa glavno formo, jih najavi tam kot STATIC PUBLIC. +

        +Za dostopanje do takšnih spremenljivk moraš uporabiti ime modula ali forme: MojGlavniModule.MojaGlobalnaSpremenljivka ali +MojaGlavnaForma.MojaGlobalnaSpremenljivka. + + +[OPEN] + +

        Ukaz OPEN v Gambasu ne deluje popolnoma enako kot v Visual Basicu, +ker ne vrača vrednosti tipa integer, ampak objekt tipa File.

        + +

        Tako je treba namesto

        + +
        DIM handle AS Integer
        +...
        +OPEN "mojaDatoteka" FOR READ AS #handle
        + +

        napisati

        + +
        DIM handle AS File
        +...
        +handle = OPEN "mojaDatoteka" FOR READ
        + + +[CATDIR] + +

        Ali veš, da lahko združuješ imena map z operatorjem &/? + Ta operator poskrbi za vodilne in sledilne poševnice tako, da je sestavljena pot vedno pravilna.

        + +

        Na primer:

        + +
        PRINT "/home/gambas" &/ ".bashrc"
        +/home/gambas/.bashrc
        +
        +PRINT "/home/gambas/" &/ "/tmp" &/ "foo.bar"
        +/home/gambas/tmp/foo.bar
        +
        + +

        Lepo, ne?

        + + +[EMPTY] + +

        Za ugotavljanje ali je niz prazen, ni treba uporabiti funkcije Len(). +Ali je niz prazen, lahko preveriš neposredno, saj prazen niz vrne FALSE, neprazen pa TRUE.

        + +

        Namesto

        + +
        IF Len(mojNiz) > 0 THEN ...
        +IF Len(mojNiz) = 0 THEN ...
        + +

        je tako bolje napisati

        + +
        IF mojNiz THEN ...
        +IF NOT mojNiz THEN ...
        + + +[EVENT] + +

        Vsaka kontrola in vsak objekt, ki lahko sproža dogodke ima svoj +prestreznik dogodkov (event observer) in svoje ime skupine dogodkov (event group name).

        + +

        Prestreznik dogodkov prestreže vsak dogodek, ki ga sproži objekt, ime skupine dogodkov pa je predpona procedure, ki jo kličemo za upravljanje dogodka.

        + +

        Privzeto je, da je prestreznik dogodkov objekt, ki vsebuje kontrolo, ime skupine dogodkov pa je enako imenu kontrole.

        + +

        Na ta način lahko npr. forma prestreže vse dogodke, ki jih sprožijo kontrole na njej.

        + +
        ' Gambas forma
        +DIM hButton AS Button
        +
        +PUBLIC SUB _new()
        +  hButton = NEW Button(ME) AS "MyButton"
        +END
        +
        +PUBLIC SUB MyButton_Click()
        +  PRINT "MyButton pritisnjen!"
        +END
        +
        + + +[FORM] + +

        V Gambasu predstavlja forma svoj lastni prestreznik dogodkov. Tako je možno neposredno upravljanje njenih dogodkov (kot so Resize, Activate itd.) v kodi njenega razreda.

        + +

        Tako se pribežniki iz Visual Basica ne počutijo izgubljene. :-)

        + + +[EMBED] + +

        V Gambasu je možno katerokoli formo vstaviti v druge forme. 

        + +

        Za izvedbo tega je treba instancirati formo tako, da ji podamo nadvsebnik kot zadnji argument konstruktorja.

        + +

        Na primer: 

        +

        DIM hForm AS MyDialog
        +DIM hSuperControl AS MyForm

        +' Ustvarimo pogovorno okno
        +hForm = NEW MyDialog
        +' Vstavimo formo v to pogovorno okno
        +' (Forma ima pred vsebnikom še dva druga parametra)
        +hSuperControl = NEW MyForm(Param1, Param2, MyDialog)
        +' Premaknimo in razvlečimo formo
        +hSuperControl.Move(8, 8, 128, 64)
        +

        + +

        Pozor! Forma, vstavljena v drugo formo, je še vedno forma in je zato tudi svoj lastni prestreznik dogodkov.

        + + +[GROUP] + +

        Vsaka kontrola ima lastnost (Group). Ko nastavimo to lastnost, je predpona upravljalca dogodkov ime skupine in ne več ime kontrole.

        + +

        Imejmo na primer gumb z imenom btnAction +z naslednjim upravljalcem dogodka Click:

        + +
        PUBLIC SUB btnAction_Click()
        + +

        Če postavimo lastnost (Group) kontrole btnAction na +MyGroup, bo upravljalec dogodkov, ki bo sprejemal dogodke z našega gumba naslednji:

        + +
        PUBLIC SUB MyGroup_Click()
        + +

        Ta lastnost omogoča upravljanje dogodkov z različnih kontrol v eni sami funkciji. Pri tem ni treba, da so kontrole istega tipa.

        + +

        Opomba: Izkušeni Visual Basic veteran bo omenjeno prepoznal kot koncept polja kontrol (control array), vendar v mnogo močnejši izvedbi. :-)

        + + +[TAG] + +

        Vsaka kontrola ima lastnost Tag. Ta lastnost je namenjena programerju in lahko vsebuje kakršenkoli podatek tipa VARIANT, ki je pomemben za program.

        + +

        To je zelo uporabno, kadar je treba razlikovati kontrole znotraj skupine pri uporabi skupnega upravljalca dogodkov.

        + + + +[LAST] + +

        Ključna beseda LAST vrne zadnjo kontrolo, ki je prejela dogodek. +To je zelo uporabno, kadar želimo napisati upravljalca dogodkov, ki naj bo neodvisen od imena kontrole.

        + +

        Vzemimo, da želimo izdelati kalkulator. Določimo deset gumbov, svojega za vsako številko, in jim določimo skupino "Digit". Lastnost Tag za vsak gumb je številka, napisana na njem. Upravljalec dogodka za takšno skupino gumbov je tedaj lahko videti takole:

        + +

        PUBLIC SUB Digit_Click()

        +  Display = Display & LAST.Tag
        +  RefreshDisplay

        +END

        + + +[LEFT] + +

        Dobro znane BASIC funkcije Left$, Right$ +in Mid$ imajo v Gambasu dodatno uporabnost.

        + +

        Drugi parameter pri Left$ in Right$ je neobvezen in ima privzeto vrednost 1:

        + +

        Left$("Gambas") vrne "G"
        +Right$("Gambas") vrne "s"

        + +

        Drugi parameter ima lahko negativno vrednost. Tedaj predstavlja število znakov, ki naj jih funkcija ne vrne:

        + +

        Left$("Gambas", -2) vrne "Gamb"
        +Right$("Gambas", -2) vrne "mbas"

        + +

        Negativen je lahko tudi tretji argument pri Mid$. Tedaj podaja število znakov s konca niza, ki naj jih funkcija ne vrne:

        + +

        Mid$("Gambas", 2, -2) vrne "amb" + + +[END] + +

        Tukaj se Nasveti dneva končajo. Upam, da si po njihovem branju izvedenec za Gambas! :-)

        + +

        Če želiÅ¡ prispevati, poÅ¡lji nove nasvete na naslov: 

        +

        gambas@users.sourceforge.net

        + +

        Hvala v naprej!

        + + + diff --git a/app/src/gambas3/tips/tips.sv b/app/src/gambas3/tips/tips.sv new file mode 100644 index 00000000..08c889ea --- /dev/null +++ b/app/src/gambas3/tips/tips.sv @@ -0,0 +1,401 @@ +[WELCOME] + +

        Välkommen till Gambas !

        + +

        Gambas är en grafiskt utvecklingsmiljö +grundad på en avancerad Basic interpretator.

        + +

        Gambas mål är att få dig att göra +kraftfulla program, enkelt och snabbt. Men rena strukturerade +program är ditt eget ansvar...

        + +

        Lycka till!

        + +

        Benoît Minisini
        +gambas@users.sourceforge.net

        + + +[STARTUP] + +

        Varje projekt måste ha en startup class. Denna +startup-class måste definiera en statisk publik metod kallad Main +utan argument, som kommer att fungera som uppstartmetod för +ditt program.

        + +

        Du kan definiera startup-classen genom att klicka på den med +höger musknapp i projektträdet och genom att välja +Startup class i popup-menyn.

        + +

        Det är inte nödvändigt att definiera en Main-metod i ett startupp- +formulär, ty det har redan en fördefinierad sådan.

        + +

        Denna fördefinierade uppstartmetod instansierar formuläret och visar det, +som i Visual Basic™.

        + + +[OPEN] + +

        OPEN-instruktionen i Gambas fungerar inte på +samma sätt som den i Visual Basic. Den lämnar inte filen, +som ett heltal, utan som ett File-objekt.

        + +

        Så i stället för att skriva:

        + +
        DIM handle AS Integer
        +...
        +OPEN "myfile" FOR READ AS #handle
        + +

        måste du skriva:

        + +
        DIM handle AS File
        +...
        +handle = OPEN "myfile" FOR READ
        + + +[CATDIR] + +

        Vet du att du kan slå ihop mappnamn och +filnamn med &/-operatorn? Denna operator +tar hand om avslutande snedstreck "/" så att den resulterande sökvägen +blir perfekt.

        + +

        Till exempel:

        + +
        PRINT "/home/gambas" &/ ".bashrc"
        +/home/gambas/.bashrc
        +
        +PRINT "/home/gambas/" &/ "/tmp" &/ "foo.bar"
        +/home/gambas/tmp/foo.bar
        +
        + +

        Är det inte förunderligt?

        + + +[EXEC] + +

        Du kan göra en körbar fil utgående från ditt hela projekt. Välj +Gör exekverbar i Projekt-menyn.

        + +

        När Gambas gör en körbar fil, läggs +resultatet i din projektmapp som standard. +Den körbara filen får samma namn som ditt projekt.

        + + +[PATH] +

        +Relativa sökvägar har speciell betydelse i Gambas. +De refererar alltid till filer inuti ditt projekt. +

        +Det finns ingen innebörd i current directory och inget nyckelord som +CHDIR att ändra det. +

        +Var försiktig: du måste använda relativ sökväg endast för att komma åt +projektfiler, ty absoluta sökvägar fungerar inte längre, när du gör en körbar fil. + + +[GLOBAL] + +Det finns inga globala variabler i Gambas! +

        +Ett sätt att kringgå detta är att placera dem i din huvud/main-modul +och deklarera dem som PUBLIC. +

        +Om du inte har en huvud/main-modul i ditt projekt, men ett huvud/main- +formulär, deklarera dem som STATIC PUBLIC. +

        +För att komma åt dessa variabler, måste du använda namnet på huvudmodulen +eller huvudformuläret: MinMainModul.MinGlobalaVariabel or +MinMainForm.MinGlobalaVariabel. + + +[EMPTY] + +

        För att veta om en sträng är tom, är det inte nödvändigt att använda +Len()-funktionen. Du kan testa den direkt, eftersom en tom sträng +är FALSE och en icke-tom sträng är TRUE.

        + +

        Till exempel, i stället för att göra:

        + +
        IF Len(MyString) > 0 THEN ...
        +IF Len(MyString) = 0 THEN ...
        + +

        Bör du göra:

        + +
        IF MyString THEN ...
        +IF NOT MyString THEN ...
        + + +[TRANSLATE] + +

        Gambastillämpningar är helt och hållet översättningsbara, förutsatt att du +talar om vilka strängar som skall översättas.

        +

        För att markera att en sträng är översättningsbar, så sätt den bara inom parantester:

        + +

        PRINT ("Översätt mig")
        +PRINT "Men inte mig!"
        + +[EVENT] + +

        Varje kontroll och varje objekt, som kan ge avbrott, har en +avbrottshanterare och ett avbrotts-group name.

        + +

        Avbrottshanteraren fångar varje avbrott åstadkommet av objektet och +avbrottsgruppnamnet är prefix för den procedur, som anropas för att hantera +avbrottet.

        + +

        Som standard är denna avbrottshanterare det objekt där du har +skapat kontrollen och gruppnamnet är samma som kontrollens.

        + +

        På detta sätt får ett formulär mottaga alla avbrott som åstadkommits +av de kontroller du skapade inuti.

        + +
        ' Gambas form
        +DIM hButton AS Button
        +
        +PUBLIC SUB _new()
        +  hButton = NEW Button(ME) AS "MyButton"
        +END
        +
        +PUBLIC SUB MyButton_Click()
        +  PRINT "You have clicked MyButton !"
        +END
        +
        + + +[FORM] + +

        I Gambas är ett formulär sin egen avbrottshanterare, så att +du direkt kan hantera dess avbrott (som Resize, +Activate, ...) in till dess egen klasskod.

        + +

        På detta sätt blir nybörjare, som kommer från Visual Basic inte +disorienterade :-).

        + + +[EMBED] + +

        Du kan inbädda vilket formulär som helst i andra formulär med Gambas + !

        + +

        För att åstadkomma en så kraftfull sak, bara instanciera formuläret genom att skicka +ett förälderbehållare (parent container) som sista argument hos konstruktorn (contructor).

        + +

        Till exempel :

        +

        DIM hForm AS MyDialog
        +DIM hSuperControl AS MyForm

        +' Skapa en dialog
        +hForm = NEW MyDialog
        +' Tag in ett formulär i denna dialog
        +' Notera att detta formulär tar två parametrar före behållaren (container)
        +hSuperControl = NEW MyForm(Param1, Param2, MyDialog)
        +' Flytta och justera storlek på formuläret
        +hSuperControl.Move(8, 8, 128, 64)
        +

        + +

        Var uppmärksam: ett formulär inbäddat i ett annat är fortfarande ett formulär och +dessutom sin egen avbrottshanterare.

        + + +[GROUP] + +

        Varje kontroll har en (Group)-egenskap. När denna egenskap +sätts, är prefixet för avbrottshanterarens namn, namnet på gruppen +och inte namnet på kontrollen.

        + +

        Låt oss anta att vi har en Knapp kallad btnAction +med följande Click avbrottshanterare:

        + +
        PUBLIC SUB btnAction_Click()
        + +

        Om du sätter (Group)-egenskapen hos btnAction till +MyGroup, så kommer avbrotsshanteraren att mottaga avbrott från +knappen att se ut som:

        + +
        PUBLIC SUB MyGroup_Click()
        + +

        Denna egenskap låter dig hantera avbrott från skilda kontroller med +en enkel funktion och kontrollerna i samma grupp behöver inte ha samma typ!

        + +

        Notera : Den gamle Visual Basic-veteranen kan kanske känna igen +konceptet i kontroll array, men i en kraftfullare implementering. :-)

        + + +[TAG] + +

        Varje kontroll har en Tag-egenskap. Denna är till för +programmeraren och kan innehålla vilken VARIANT-data som du tycker är relevant.

        + +

        Detta är mycket användbart, när du vill åtskilja kontroller i +samma grupp i en gemensam avbrottshanterare.

        + + + +[LAST] + +

        Nyckelordet LAST returnerar den sista kontroll, som +har mottagit ett avbrott. Detta är mycket användbart om du vill skriva en +avbrottshanterare, som är oberoende av namn på kontroller.

        + +

        Till exempel, låt oss anta du vill skriva ett kalkylatorprogram. +Du har definierat tio knappar, en för varje siffra, var och en i +samma group "Digit". Tag-en för varje kontroll sätts till +siffran ritad i knappen. Din avbrottshanterare skulle kunna se ut som:

        + +

        PUBLIC SUB Digit_Click()

        +  Display = Display & LAST.Tag
        +  RefreshDisplay

        +END

        + + +[LEFT] + +

        De välkända BASIC rutinerna Left$, Right$ +och Mid$ har användbara uppträdande i Gambas

        + +

        Andra parametern i Left$ och Right$ är +frivillig och sätts till ett som standard.

        + +

        Left$("Gambas") returnerar "G"
        +Right$("Gambas") returnerar "s"

        + +

        Andra parametern kan vara negativ och betyder då antal +tecken som ej skall tas ut.

        + +

        Left$("Gambas", -2) returnerar "Gamb"
        +Right$("Gambas", -2) returnerar "mbas"

        + +

        På samma sätt med tredje argumentet till Mid$ kan vara negativt och +ger då antal tecken från slutet på strängen som ej skall tas ut.

        + +

        Mid$("Gambas", 2, -2) returnerar "amb" + +[OBSERVER] + +

        Observer-klassen tillåter dig att fånga upp alla händelser skapade +av ett objekt innan de verkligen sänds.

        + +
        MyTextBox = NEW TextBox(ME) AS "MyTextBox"
        +MyObserver = NEW Observer(MyTextBox) AS "MyObserver"
        +...
        +PUBLIC SUB MyObserver_KeyPress()
        +  DEBUG "Got it first"
        +END
        +
        +PUBLIC SUB MyTextBox_KeyPress()
        +  DEBUG "Got it next"
        +END
        + +"Observatören" kan avbryta händelsen för att förhindra att objektet att åstadkommer den (händelsen). + + +[STRING] + +

        Gambas använder UTF-8-teckensätt för att representera strängar i minnet.

        + +

        Men alla Gambas standardsträngfunktioner hanterar ASCII: +Left, Mid, Right, UCase... + +

        Om du vill manipulera UTF-8-strängar, måste du använda metoder hörande till +String-static klass, vilka har samma namn som deras motsvarande standard. + +

        PRINT Len("bébé");; Left$("bébé", 3)
        +6 bé
        +PRINT String.Len("bébé");; String.Left("bébé", 3)
        +4 béb
        + + +[ASSIGNMENT] + +

        Gambas implementerar förenklad tilldelning, som C/C++ programmerare är vana vid. + +

        MyVariable += 2 är samma sak som MyVariable = MyVariable + 2 + +

        MyVariable &= "Great" är samma sak som MyVariable = MyVariable & "Great" + +

        och så vidare... + + +[DEBUG] + +

        Du kan använda DEBUG-instruktionen till att skriva ut avlusningsmeddelandem +till konsolen (nämligen standard error output). Den uppför sig precis som PRINT- +instruktionen. + +

        Dessa meddelanden föregås av klassnamn, metodnamn och radnummer för +DEBUG-instruktionen. + +

        Debugmeddelandena tas automatiskt bort när en exekverbar fil +utan avlusningsinformation görs. + + +[TRY] + +

        Felhantering i Gambas görs med följande instruktioner: +TRY, ERROR, CATCH och FINALLY. + +

        TRY försöker utföra en sats utan att åstadkomma ett fel. ERROR- +instruktionen används just för att ta reda på om satsen utfördes korrekt. + +

        TRY MyFile = OPEN "/etc/password" FOR WRITE
        +IF ERROR THEN PRINT "I cannot do what I want!"
        + + +[CATCH] + +

        Felhantering i Gambas görs med följande instruktioner: +TRY, ERROR, CATCH och FINALLY. + +

        CATCH utvisar början på felhanteringsdelen i en funktion eller procedur. +Den placeras i slutet på funktionskoden. + +

        Catch-delen utförs när ett fel har åstadkommits mellan början på funktionen och dess slut. + + +

        Om ett fel inträffar under utförande av catch-delen, fångas den. + +

        SUB ProcessFile(FileName AS STRING)
        +  ...
        +  OPEN FileName FOR READ AS #hFile
        +  ...
        +  CLOSE #hFile
        +CATCH ' Utförs endast om det finns ett fel
        +  PRINT "Cannot process file "; FileName
        +END
        + + +[FINALLY] + +

        Felhantering i Gambas görs med följande instruktioner: +TRY, ERROR, CATCH och FINALLY. + +

        FINALLY inleder den kod, som utförs vid slutet av funktionen, även om ett fel åstadkomms under funktionsutförandet. + +

        Finally-delen är inte obligatorisk. Om det finns en catch-del, så måste finally-delen föregå den. + +

        Om ett fel inträffar under utförande av finally-delen, fortsättes normalt. + +

        SUB ProcessFile(FileName AS STRING)
        +  ...
        +  OPEN FileName FOR READ AS #hFile
        +  ...
        +FINALLY ' Utförs alltid, även om fel inträffat
        +  CLOSE #hFile
        +CATCH ' Utförs endast om fel inträffat
        +  PRINT "Cannot print file "; FileName
        +END
        + + + +[END] + +

        Du har nu lästa alla Dagens Tips. Hoppas att du blivit +en Gambas-expert nu! :-)

        + +

        Om du vill bidraga, sänd nya tips till följande +adress :

        +

        gambas@users.sourceforge.net

        + +

        Tack på förhand!

        + + + diff --git a/app/src/gambas3/tips/tips.tr b/app/src/gambas3/tips/tips.tr new file mode 100644 index 00000000..8bb45144 --- /dev/null +++ b/app/src/gambas3/tips/tips.tr @@ -0,0 +1,278 @@ +[WELCOME] + +

        Gambas'a Hoş Geldiniz !

        + +

        Gambas gelişmiş bir Basic yorumlayıcısı +üzerine kurulu grafiksel bir geliştirme ortamıdır.

        + +

        Gambas sizin kolay ve hızlı bir şekilde +güçlü programlar yapabilmenizi amaçlar. Ama düzgün programlar +sizin kendi sorumluluğunuzda kalır...

        + +

        Eğlenmenize bakın !

        + +

        Benoît Minisini
        +gambas@users.sourceforge.net

        + + +[STARTUP] + +

        Her proje bir başlangıç sınıfı içermelidir. Bu başlangıç +sınıfı, programınızın başlangıç yöntemi olarak davranacak, parametre +almayan Main adlı durağan (static) ve genel (public) bir +yöntem tanımlamalıdır.

        + +

        Proje ağacında sağ fare tuşuyla üzerine tıklayarak ve açılan +menüden Başlangıç sınıfı'nı seçerek başlangıç sınıfını +tanımlayabilirsiniz.

        + +

        Bir başlangıç formunda Main yöntemi tanımlamanıza gerek yoktur; +çünkü formlar zaten öntanımlı bir yönteme sahiptir.

        + +

        Bu öntanımlı başlangıç yöntemi formu örnekler ve gösterir. Aynı +Visual Basic™'de olduğu gibi.

        + + +[OPEN] + +

        Gambas'ın OPEN yönergesi Visual Basic'deki +gibi çalışmaz. Dosyayı bir tamsayı (integer) yerine File +nesnesi olarak döndürür.

        + +

        Yani, şu şekilde yazmak yerine :

        + +
        DIM handle AS Integer
        +...
        +OPEN "myfile" FOR READ AS #handle
        + +

        aşağıdaki gibi yazmalısınız :

        + +
        DIM handle AS File
        +...
        +handle = OPEN "myfile" FOR READ
        + + +[CATDIR] + +

        Dizin ve dosya adlarını &/ işleciyle +birleştirebileceğinizi biliyor muydunuz ? Bu işleç eğik +çizgilerle ilgilenir. Böylece sonuçta oluşacak yol adı +kusursuz olur.

        + +

        Örneğin:

        PRINT "/home/gambas" &/ ".bashrc" +/home/gambas/.bashrc + +PRINT "/home/gambas/" &/ "/tmp" &/ "foo.bar" +/home/gambas/tmp/foo.bar + + +

        Harika değil mi ?

        + + +[EXEC] + +

        Projenizin tümünden çalışabilir bir dosya oluşturabilirsiniz. +Bunun için Proje menüsünden Çalışabilir dosyayı oluştur +seçeneğini tıklayınız.

        + +

        Gambas çalışabilir bir dosya oluşturduğunda, sonucu doğrudan +projenizin dizinine koyar. Bu dosya projenizle aynı adı alır.

        + + +[PATH] +

        +Göreceli yol adlarının Gambas'da özel bir anlamı vardır. +Bu yollar her zaman projenizdeki dosyaları gösterir. +

        +Geçerli dizin kavramı yoktur, ve değiştirmek için +CHDIR gibi anahtar bir sözcük de yoktur. +

        +Dikkatli olun: göreceli yol adlarını sadece proje dosyalarına +erişmek için kullanın, çünkü çalışabilir dosya oluştuğunda tam yollar +çalışmayacaktır. + + +[GLOBAL] + +Gambas'da global değişkenler yoktur! +

        +Mümkünse, bu değişkenleri ana modülünüze koyun ve onları +PUBLIC olarak bildirin. +

        +Eğer projenizde bir ana modül değil de bir ana form varsa, +STATIC PUBLIC olarak bildirin. +

        +Bu değişkenlere erişmek için, ana modülün veya formun adını +kullanmalısınız: MyMainModule.MyGlobalVariable veya +MyMainForm.MyGlobalVariable. + + +[EMPTY] + +

        Bir dizgenin boş olup olmadığını öğrenmek için, Len() +işlevini kullanmak zorunda değilsiniz. Doğrudan boş bir dizge +FALSE ve dolu bir dizge TRUE olarak sınanabilir.

        + +

        Örneğin, şu şekilde yapmak yerine :

        + +
        IF Len(MyString) > 0 THEN ...
        +IF Len(MyString) = 0 THEN ...
        + +

        Şöyle yapabilirsiniz :

        + +
        IF MyString THEN ...
        +IF NOT MyString THEN ...
        + + +[EVENT] + +

        Olay meydana getiren her denetim ve nesnenin, bir +olay gözlemcisi ve bir olay grup adı vardır.

        + +

        Olay gözlemcisi oluşan her olayı yakalar. Olay grup adı ise +olayı yöneten yordamın önekidir.

        + +

        Öntanımlı olarak, bu olay gözlemcisi denetimi oluşturduğunuz +nesnedir ve grup adı da o denetimin adıdır.

        + +

        Böylece bir form, üzerinde oluşturulan denetimlerden +gelen tüm olayları alır.

        + +
        ' Gambas form
        +DIM hButton AS Button
        +
        +PUBLIC SUB _new()
        +  hButton = NEW Button(ME) AS "MyButton"
        +END
        +
        +PUBLIC SUB MyButton_Click()
        +  PRINT "You have clicked MyButton !"
        +END
        +
        + + +[FORM] + +

        Gambas'da, bir form kendi olay gözlemcisidir. Böylece +tüm form olaylarını (Resize, Activate, vb...) kendi +sınıf kodundan yönetebilirsiniz.

        + +

        Bu sayede, Visual Basic'den gelen yeni kullanıcılar +yolunu şaşırmaz :-).

        + + +[EMBED] + +

        Gambas ile bir formu diğer formların içine gömebilirsiniz + !

        + +

        Böyle güçlü bir şey yapmak için, sadece yapıcı işlevin son argümanı +olarak bir sahip kap (container) vererek formu örnekleyin.

        + +

        Örneğin :

        +

        DIM hForm AS MyDialog
        +DIM hSuperControl AS MyForm

        +' Bir iletişim penceresi oluştur
        +hForm = NEW MyDialog
        +' Bu iletişim penceresine bir form yerleştir
        +' Unutmayın, bu form kaptan önce iki parametre daha alır
        +hSuperControl = NEW MyForm(Param1, Param2, MyDialog)
        +' Formu taşır ve yeniden boyutlandırır
        +hSuperControl.Move(8, 8, 128, 64)
        +

        + +

        Dikkatli olun: başka bir form içine gömülen bir form hala formdur ve +bundan dolayı kendi olay gözlemcisine sahiptir.

        + + +[GROUP] + +

        Her denetim bir (Group) özelliğine sahiptir. Bu özellik +girildiğinde, olay yöneticisinin adı denetim adı yerine grup adını +önek olarak alır.

        + +

        Diyelim ki btnAction adında bir Button nesneniz var. +Bu nesneye ait Click olayının yöneticisi de aşağıdaki gibi olsun :

        + +
        PUBLIC SUB btnAction_Click()
        + +

        Eğer btnAction nesnesinin (Group) özelliğini +MyGroup olarak değiştirirseniz, bu butondan olayları alacak +olay yöneticisi şöyle olur :

        + +
        PUBLIC SUB MyGroup_Click()
        + +

        Bu özellik tek bir işlevde değişik denetimlerin olaylarını yönetmenize +olanak sağlar. Bu denetimlerin aynı türden olmaları da gerekmez !

        + +

        Not : Eski Visual Basic emektarları +denetim dizisi (control array) kavramını hatırlayabilir, +ancak bu daha güçlü bir uygulama. :-)

        + + +[TAG] + +

        Her denetim bir Tag özelliğine sahiptir. Bu özellik +programcı içindir ve ilgili bulduğunuz herhangi bir veriyi içerebilir.

        + +

        Bu yöntem, bir olay yöneticisinde aynı grupta yer alan denetimleri +ayırt etmek için çok kullanışlıdır.

        + + + +[LAST] + +

        LAST anahtar sözcüğü bir olay algılayan en son denetimi +döndürür. Bu, herhangi bir denetim adından bağımsız bir olay yöneticisi +yazmak istediğinizde çok kullanışlıdır.

        + +

        Örneğin, diyelim ki bir hesap makinesi programı yapmak istiyorsunuz. +Her rakam için bir tane olacak şekilde on tane tuş tanımladınız ve hepsi +"Digit" grubunda yer alsın. Her denetimin Tag özelliği +tuşta yer alan rakamı içersin. Olay yöneticiniz şunun gibi olacaktır :

        + +

        PUBLIC SUB Digit_Click()

        +  Display = Display & LAST.Tag
        +  RefreshDisplay

        +END

        + + +[LEFT] + +

        Çok bilinen BASIC işlevleri Left$, Right$ ve +Mid$ Gambas'da çok kullanışlı davranışlar gösterir

        + +

        Left$ ve Right$ işlevlerinin ikinci parametreleri +seçimliktir ve biri öntanımlıdır.

        + +

        Left$("Gambas") --> "G" değerini,
        +Right$("Gambas") --> "s" değerini döndürür.

        + +

        İkinci parametre negatif olabilir ve bu ayıklanmayan +karakterlerin sayısını verir.

        + +

        Left$("Gambas", -2) --> "Gamb"
        +Right$("Gambas", -2) --> "mbas"

        + +

        Aynı şekilde, Mid$ işlevinin üçüncü parametresi negatif +olabilir ve bu değer dizge sonundan itibaren ayıklanmayan +karakter sayısını verir.

        + +

        Mid$("Gambas", 2, -2) --> "amb" + + +[END] + +

        Tüm ipuçlarını okudunuz. Umarım şimdi bir Gambas uzmanı +olmuşsunuzdur ! :-)

        + +

        Eğer katkıda bulunmak istiyorsanız, aşağıdaki adrese yeni ipuçları +gönderin :

        +

        gambas@users.sourceforge.net

        + +

        Şimdiden teşekkürler !

        + + + diff --git a/app/src/gambas3/tips/tips.zh b/app/src/gambas3/tips/tips.zh new file mode 100644 index 00000000..6c51de32 --- /dev/null +++ b/app/src/gambas3/tips/tips.zh @@ -0,0 +1,341 @@ +[WELCOME] + +

        欢迎使用Gambas!

        + +

        Gambas是一个基于高级Basic语言解释器的图形界面的开发环境。

        + +

        Gambas的目标是使你能轻易而快速地开发出功能强大的程序。但是高效而简洁的程序还得靠你自己的努力...

        + +

        希望你能喜欢!

        + +

        Benoît Minisini
        +English:gambas@users.sourceforge.net
        +中文:yizhou.he@gmail.com

        + +[STARTUP] + +

        每一个工程都需要有一个启动类,这个启动类必须定义一个名为Main的无参数的静态公用方法,它将成为你的程序的启动方法。

        + +

        定义启动类的方法是,用鼠标右键点击工程目录树中要设为启动类的类,并在弹出的右键菜单中选中启动类。

        + +

        你不需要在启动窗体中定义一个Main方法,因为Gambas己经预定义好了。

        + +

        这个预定义的启动方法创建并显示窗体就像Visual Basic™ä¸€æ ·ã€‚

        + + +[OPEN] + +

        Gambas的OPEN函数和Visual Basic的不太一样,它并不返回一个整型变量,而是返回一个文件对象。

        + +

        所以,不要使用:

        + +
        DIM handle AS Integer
        +...
        +OPEN "myfile" FOR READ AS #handle
        + +

        而应该使用:

        + +
        DIM handle AS File
        +...
        +handle = OPEN "myfile" FOR READ
        + + +[CATDIR] + +

        你知道吗?你可以使用&/操作符连结文件路径中的目录和文件,此操作符处理路径尾的斜杠以免重复。

        + +

        例如:

        + +
        PRINT "/home/gambas" &/ ".bashrc"
        +/home/gambas/.bashrc
        +
        +PRINT "/home/gambas/" &/ "/tmp" &/ "foo.bar"
        +/home/gambas/tmp/foo.bar
        +
        + +

        怎么样?好用吧!

        + + +[EXEC] + +

        可以将你的整个工程生成一个可执行文件,在工程菜单中选择生成可执行文件。

        + +

        当Gambas生成可执行文件时,默认将产生的可执行文件放到你的工程目录下,可执行文件名和你的工程名相同。

        + + +[PATH] +

        + 相对路径在Gambas中有特殊含义,它们总是指向你工程内的文件。 +

        +这里没有当前目录的概念,没有CHDIR之类的关键字来改变它。 +

        +注意:只能使用相对路径访问你的工程文件,因为绝对路径在你生成可执行文件后就不再可靠了。 + + +[GLOBAL] + + Gambas里不再有全局变量了! +

        +相应的,在你的主模块中声明它们为PUBLIC(公用类型)。 +

        +如果你的工程中没有主模块,只有主窗体,那么声明它们为STATIC PUBLIC(静态公用类型)。 +

        +要访问这些变量,你必须使用主模块名或主窗体名:MyMainModule.MyGlobalVariable或 +MyMainForm.MyGlobalVariable。 + + +[EMPTY] + +

        要知道一个字符串是否为空,没必要使用Len()函数,你可以直接测试它,因为空字符串为FALSE非空字符串为TRUE。

        + +

        例如,你不用写:

        + +
        IF Len(MyString) > 0 THEN ...
        +IF Len(MyString) = 0 THEN ...
        + +

        你只需写:

        + +
        IF MyString THEN ...
        +IF NOT MyString THEN ...
        + +[TRANSLATE] + +

        Gambas应用程序是可完全翻译的,条件是你应声明哪些字符串是必须要翻译的,哪些不必翻译。

        +

        用括号括起来就表明该字符串是可以被翻译的。

        + +

        PRINT ("我可以被翻译!")
        +PRINT "我不能被翻译!"
        + +[EVENT] + +

        每个控件和每个对象都可以产生事件,都有一个event observer(事件观察器)和一个事件 group name(组名)。

        + +

        事件观察器捕捉对象产生的每一个事件,事件组名将是你用来处理事件的类名的前缀。

        + +

        默认的事件观察器是你创建的控件的容器对象,事件组名是控件名。

        + +

        这梓,一个窗体接收你在它上面创建的所有控件发生的事件。

        + +
        ' Gambas form
        +DIM hButton AS Button
        +
        +PUBLIC SUB _new()
        +  hButton = NEW Button(ME) AS "MyButton"
        +END
        +
        +PUBLIC SUB MyButton_Click()
        +  PRINT "You have clicked MyButton !"
        +END
        +
        + + +[FORM] + +

        在Gambas中,一个窗体是它自己的事件观察器,所以你可以直接在它自己的类代码中管理它的事件(像Resize, +Activate, ...)。

        + +

        这样,从Visual Basic转来的新手们就不会迷失方向:-)。

        + + +[EMBED] + +

        在Gambas中,你可以在窗体中嵌入窗体!

        + +

        要实现如此强大的功能,只要在初始化窗体对象时将父容器做为最后一个参数传给窗体构建函数。

        + +

        例如:

        +

        DIM hForm AS MyDialog
        +DIM hSuperControl AS MyForm

        +' 创建一个对话框
        +hForm = NEW MyDialog
        +' 在此对话框中插入一个窗体
        +' 注意此窗体需要三个参数,最后一个参数是容器对象
        +hSuperControl = NEW MyForm(Param1, Param2, MyDialog)
        +' 移动并改变窗体的大小
        +hSuperControl.Move(8, 8, 128, 64)
        +

        + +

        小心:嵌入后的窗体还是个窗体,它还是它自己的事件观察器。

        + + +[GROUP] + +

        每个控件都有一个Group(组)属性,当此属性被设置,事件处理名称的前缀就将是组名而不是控件名。

        + +

        假定你有一个Button(按钮)名叫btnAction +有一个Click事件处理:

        + +
        PUBLIC SUB btnAction_Click()
        + +

        如果你将btnAction的(Group)属性设为MyGroup,那么事件处理从按钮收到的事件将是:

        + +
        PUBLIC SUB MyGroup_Click()
        + +

        此属性让你在一个函数中处理不同的控件的事件,同组中的控件不需要有相同的类型!

        + +

        注释: Visual Basic老手可以认为是控件数组,但有更为强大的用法。:-)

        + + +[TAG] + +

        每一个控件都有Tag属性,此属性是为编程者设计的,可以是任何你想要的VARIANT(变体类型)数据。

        + +

        这在使用同组的公用事件处理中区别控件时非常有用。

        + + + +[LAST] + +

        LAST关键字返回发生事件的最近控件,当你要写一个独立于控件名的事件处理类就非常有用。

        + +

        例如,假设你要写一个计算器程序。 +你定义了十个按钮,每个数字一个,它们都在一个名叫"Digit"的组,每个控件的Tag属性都被设为相应的数字。 +你的处理程序将会是:

        + +

        PUBLIC SUB Digit_Click()

        +  Display = Display & LAST.Tag
        +  RefreshDisplay

        +END

        + + +[LEFT] + +

        大名鼎鼎的BASIC函数Left$、Right$ +和Mid$在Gambas中有了新功能。

        + +

        Left$和Right$的第二个参数是可选的,默认值为1。

        + +

        Left$("Gambas") 返回"G"
        +Right$("Gambas") 返回"s"

        + +

        第二个参数可以是负数,它将指定反方向上将被切掉的字符个数。

        + +

        Left$("Gambas", -2) 返回"Gamb"
        +Right$("Gambas", -2) 返回"mbas"

        + +

        相同的,Mid$的第三个参数也可以是负数,指定字符串末端将被切掉的字符的个数。

        + +

        Mid$("Gambas", 2, -2) 返回"amb" + +[OBSERVER] + +

        Observer类允许你将对象发生的所有事件在被发送之前截获。

        + +
        MyTextBox = NEW TextBox(ME) AS "MyTextBox"
        +MyObserver = NEW Observer(MyTextBox) AS "MyObserver"
        +...
        +PUBLIC SUB MyObserver_KeyPress()
        +  DEBUG "Got it first"
        +END
        +
        +PUBLIC SUB MyTextBox_KeyPress()
        +  DEBUG "Got it next"
        +END
        + + Observer能取消事件防止对象有效的发出它。 + + +[STRING] + +

        Gambas使用UTF-8字符编码在内存中描述字符串。

        + +

        但是所有的标准Gambas字符串函数处理ASCII码: +Left、Mid、Right、UCase... + +

        如果想处理UTF-8编码的字符串,必须使用String静态类的方法,它们有和标准字符串处理函数相同的名字。 + +

        PRINT Len("bébé");; Left$("bébé", 3)
        +6 bé
        +PRINT String.Len("bébé");; String.Left("bébé", 3)
        +4 béb
        + + +[ASSIGNMENT] + +

        Gambas实现了C/C++程序员常用的快捷赋值。 + +

        MyVariable += 2 等价于 MyVariable = MyVariable + 2 + +

        MyVariable &= "Great" 等价于 MyVariable = MyVariable & "Great" + +

        诸如此类... + + +[DEBUG] + +

        可以使用DEBUG语句打印调试信息到控制台(也就是标准错误输出),用法和PRINT语句完全一样。 + +

        调试信息前缀有类名,方法名和DEBUG语句所在行号。 + +

        调试信息在生成不包含调试信息的可执行文件时被自动删除。 + + +[TRY] + +

        Gambas使用下面的语句实现错误管理: +TRY,ERROR,CATCH和FINALLY。 + +

        TRY尝试执行一个语句而不引发错误,随后使用ERROR语句检测语句执行中是否发生错误。 + +

        TRY MyFile = OPEN "/etc/password" FOR WRITE
        +IF ERROR THEN PRINT "I cannot do what I want!"
        + + +[CATCH] + +

        Gambas使用下面的语句实现错误管理: +TRY,ERROR,CATCH和FINALLY。 + +

        CATCH标明函数或者过程中错误管理部分(错误陷阱)的代码起始。 + +

        当错误发生于函数执行的起始到终止之间,执行错误陷阱部分。 + +

        如果错误发生于执行错误陷阱代码期间,会正常传送。错误陷阱不保护自己! + +

        SUB ProcessFile(FileName AS STRING)
        +  ...
        +  OPEN FileName FOR READ AS #hFile
        +  ...
        +  CLOSE #hFile
        +CATCH ' 仅仅发生错误时执行
        +  PRINT "Cannot process file "; FileName
        +END
        + + +[FINALLY] + +

        Gambas使用下面的语句实现错误管理: +TRY,ERROR,CATCH和FINALLY。 + +

        在函数的尾部,FINALLY语句引领的代码被执行,即使在其执行期间有错误发生。 + +FINALLY部分是非托管的。如果函数中有错误陷阱,FINALLY部分必须位于陷阱之前。 + + +

        FINALLY部分是非托管的。如果函数中有错误陷阱,FINALLY部分必须位于陷阱之前。 + +

        如果错误发生于FINALLY部分执行期间,错误会正常传送。 + +

        SUB ProcessFile(FileName AS STRING)
        +  ...
        +  OPEN FileName FOR READ AS #hFile
        +  ...
        +FINALLY '总是执行,即使有错误发生
        +  CLOSE #hFile
        +CATCH ' 仅当错误发生时执行
        +  PRINT "Cannot print file "; FileName
        +END
        + + +[END] + +

        你己读完所有今日提示。我希望你己经是一个Gambas的专家了!:-)

        + +

        如果你想为Gambas贡献一份力量,用电子邮件发送新提示到:

        +英文:

        gambas@users.sourceforge.net

        +中文:

        yizhou.he@gmail.com

        + +

        预先感谢!

        + + + diff --git a/app/src/gambas3/tips/tips.zh_TW b/app/src/gambas3/tips/tips.zh_TW new file mode 100644 index 00000000..d8ede37b --- /dev/null +++ b/app/src/gambas3/tips/tips.zh_TW @@ -0,0 +1,442 @@ +[WELCOME] + +

        歡迎使用Gambas!

        + +

        Gambas是一個基於高級Basic語言直譯器的圖形界面的開發環境。

        + +

        Gambas的目標是使您能輕易而快速地開發出功能強大的程式。但是高效而簡潔的程式還得靠您自己的努力...

        + +

        希望您會喜歡!

        + +

        Benoît Minisini
        +English:gambas@users.sourceforge.net
        +中文:yizhou.he@gmail.com

        + +[STARTUP] + +

        每一個專案都需要有一個啟動類別,這個啟動類別必須定義一個名爲Main的無參數靜態公用方法,它將成爲您的程式的進入點。

        + +

        定義啟動類別的方法是,用鼠標右鍵點擊工程目錄樹中要設爲啟動類別的類別,並在彈出的右鍵菜單中選中啟動類別。

        + +

        您不需要在啟動視窗中定義一個Main方法,因爲Gambas己經預定義好了。

        + +

        這個預定義的啟動方法創建並顯示視窗, 就像Visual Basic™ä¸€æ¨£ã€‚

        + + +[OPEN] + +

        Gambas的OPEN函數和Visual Basic的不太一樣,它並不回傳整數,而是回傳一個檔案物件。

        + +

        所以,不要使用:

        + +
        DIM handle AS Integer
        +...
        +OPEN "myfile" FOR READ AS #handle
        + +

        而應該使用:

        + +
        DIM handle AS File
        +...
        +handle = OPEN "myfile" FOR READ
        + + +[CATDIR] + +

        您知道嗎?您可以使用&/來連接資料夾和檔案名稱,這個運算子會自動處理路徑結尾的/以免重複。

        + +

        例如:

        + +
        PRINT "/home/gambas" &/ ".bashrc"
        +/home/gambas/.bashrc
        +
        +PRINT "/home/gambas/" &/ "/tmp" &/ "foo.bar"
        +/home/gambas/tmp/foo.bar
        +
        + +

        怎麼樣?好用吧!

        + + +[EXEC] + +

        可以將您的整個專案生成一個可執行檔,在專案選單中選擇生成可執行檔。

        + +

        當Gambas生成可執行檔時,預設會將產生的可執行檔放到您的專案目錄下,可執行檔名和您的專案名稱相同。

        + + +[PATH] +

        + 相對路徑在Gambas中有特殊含義,它們總是指向您專案內的文件。 +

        +這裏沒有當前目錄的概念,沒有CHDIR之類的關鍵字來改變它。 +

        +注意:您只能用相對路徑存取專案中的檔案,因爲絕對路徑在您生成可執行檔後就不再可靠了。 + + +[GLOBAL] + + Gambas裏不再有全域變數了! +

        +新的處理方法是,在您的主模組中宣告它們爲PUBLIC(公用類型)。 +

        +如果您的專案中沒有主模組,只有主視窗,那麼宣告它們爲STATIC PUBLIC(靜態公用類型)。 +

        +要存取這些變數,您必須使用主模組名或主視窗名:MyMainModule.MyGlobalVariable或 +MyMainForm.MyGlobalVariable。 + + +[EMPTY] + +

        要知道一個字串是否爲空,並不需要使用Len()函數,您可以直接測試它,因爲空字串爲FALSE非空字串爲TRUE。

        + +

        例如,您不需要寫:

        + +
        IF Len(MyString) > 0 THEN ...
        +IF Len(MyString) = 0 THEN ...
        + +

        您只需寫:

        + +
        IF MyString THEN ...
        +IF NOT MyString THEN ...
        + +[TRANSLATE] + +

        Gambas應用程式是可完全翻譯的,條件是您應指定哪些字串是必須要翻譯的。

        +

        用括號將字串括起來就表示該字串是可以被翻譯的。

        + +

        PRINT ("我可以被翻譯!")
        +PRINT "我不能被翻譯!"
        + +[EVENT] + +

        每個控制項和每個物件都可以產生事件,都有一個event observer(事件觀察器)和一個事件 group name(組名)。

        + +

        事件觀察器捕捉物件產生的每一個事件,事件組名將是您用來處理事件的類別名稱的前綴。

        + +

        預設的事件觀察器是您創建的控制項的容器物件,事件組名是控制項名。

        + +

        在這種狀況下,一個視窗會接收您在它上面創建的所有控制項發生的事件。

        + +
        ' Gambas form
        +DIM hButton AS Button
        +
        +PUBLIC SUB _new()
        +  hButton = NEW Button(ME) AS "MyButton"
        +END
        +
        +PUBLIC SUB MyButton_Click()
        +  PRINT "You have clicked MyButton !"
        +END
        +
        + + +[FORM] + +

        在Gambas中,一個視窗是它自己的事件觀察器,所以您可以直接在它自己的類代碼中管理它的事件(像Resize, +Activate, ...)。

        + +

        這樣,從Visual Basic轉來的新手們就不會迷失方向:-)。

        + + +[EMBED] + +

        在Gambas中,您可以在視窗中嵌入視窗!

        + +

        要實現如此強大的功能,只要在初始化視窗物件時將父容器做爲最後一個參數傳給視窗構建函數。

        + +

        例如:

        +

        DIM hForm AS MyDialog
        +DIM hSuperControl AS MyForm

        +' 創建一個對話框
        +hForm = NEW MyDialog
        +' 在此對話框中插入一個視窗
        +' 注意此視窗需要三個參數,最後一個參數是容器物件
        +hSuperControl = NEW MyForm(Param1, Param2, MyDialog)
        +' 移動並改變視窗的大小
        +hSuperControl.Move(8, 8, 128, 64)
        +

        + +

        小心:嵌入後的視窗還是個視窗,它還是它自己的事件觀察器。

        + + +[GROUP] + +

        每個控制項都有一個Group(組)屬性,當此屬性被設置,事件處理名稱的前綴就將是組名而不是控制項名。

        + +

        假定您有一個Button(按鈕)名叫btnAction +有一個Click事件處理:

        + +
        PUBLIC SUB btnAction_Click()
        + +

        如果您將btnAction的(Group)屬性設爲MyGroup,那麼事件處理從按鈕收到的事件將是:

        + +
        PUBLIC SUB MyGroup_Click()
        + +

        此屬性讓您在一個函數中處理不同的控制項的事件,同組中的控制項不需要有相同的類型!

        + +

        註釋: Visual Basic老手可能會認為這個屬性和VB中的控制項陣列相似,但更為強大。:-)

        + + +[TAG] + +

        每一個控制項都有Tag屬性,此屬性是爲編程者設計的,可以是任何您想要的VARIANT(可變類型)數據。

        + +

        這在使用同組的公用事件處理中區別控制項時非常有用。

        + + + +[LAST] + +

        LAST關鍵字回傳最近一次發生事件的控制項,當您要寫一個獨立於控制項名的事件處理函式就非常有用。

        + +

        例如,假設您要寫一個計算器程式。 +您定義了十個按鈕,每個數字一個,它們都在一個名叫"Digit"的群組,每個控制項的Tag屬性都被設爲相應的數字。 +您的處理程序將會是:

        + +

        PUBLIC SUB Digit_Click()

        +  Display = Display & LAST.Tag
        +  RefreshDisplay

        +END

        + + +[LEFT] + +

        大名鼎鼎的BASIC函數Left$、Right$ +和Mid$在Gambas中有了新功能。

        + +

        Left$和Right$的第二個參數是可選的,預設值爲1。

        + +

        Left$("Gambas") 回傳"G"
        +Right$("Gambas") 回傳"s"

        + +

        第二個參數可以是負數,它的用途是指定反方向上將被切掉的字元個數。

        + +

        Left$("Gambas", -2) 回傳"Gamb"
        +Right$("Gambas", -2) 回傳"mbas"

        + +

        相同的,Mid$的第三個參數也可以是負數,指定字串末端將被切掉的字元的個數。

        + +

        Mid$("Gambas", 2, -2) 回傳"amb" + +[OBSERVER] + +

        Observer類別允許您在物件發出事件之前先攔截它。

        + +
        MyTextBox = NEW TextBox(ME) AS "MyTextBox"
        +MyObserver = NEW Observer(MyTextBox) AS "MyObserver"
        +...
        +PUBLIC SUB MyObserver_KeyPress()
        +  DEBUG "Got it first"
        +END
        +
        +PUBLIC SUB MyTextBox_KeyPress()
        +  DEBUG "Got it next"
        +END
        + + Observer能取消事件,防止物件對外發出事件。 + + +[STRING] + +

        Gambas使用UTF-8字元編碼在記憶體中描述字串。

        + +

        但是所有的標準Gambas字串函數只處理ASCII碼: +Left、Mid、Right、UCase... + +

        如果想處理UTF-8編碼的字串,必須使用String靜態類別的方法,它們的名字和標準字串處理函數完全相同。 + +

        PRINT Len("bébé");; Left$("bébé", 3)
        +6 bé
        +PRINT String.Len("bébé");; String.Left("bébé", 3)
        +4 béb
        + + +[ASSIGNMENT] + +

        Gambas實現了C/C++程序員常用的快捷賦值。 + +

        MyVariable += 2 等價於 MyVariable = MyVariable + 2 + +

        MyVariable &= "Great" 等價於 MyVariable = MyVariable & "Great" + +

        諸如此類... + + +[DEBUG] + +

        可以使用DEBUG語句列印除錯信息到控制台(也就是stderr),用法和PRINT語句完全一樣。 + +

        除錯信息前綴有類別名稱,方法名稱和DEBUG語句所在的行號。 + +

        除錯信息在生成不包含除錯信息的可執行檔時會被自動刪除。 + + +[TRY] + +

        Gambas使用下面的語句實現錯誤管理: +TRY,ERROR,CATCH和FINALLY。 + +

        TRY嘗試執行一個語句而不引發錯誤,隨後使用ERROR語句檢測語句執行中是否發生錯誤。 + +

        TRY MyFile = OPEN "/etc/password" FOR WRITE
        +IF ERROR THEN PRINT "I cannot do what I want!"
        + + +[CATCH] + +

        Gambas使用下面的語句實現錯誤管理: +TRY,ERROR,CATCH和FINALLY。 + +

        CATCH標明函數或者過程中錯誤管理部分(錯誤處理常式)的程式碼的開頭。 + +

        當錯誤發生於函數執行的起始到終止之間時,會跳去執行錯誤處理常式的部分。 + +

        如果錯誤發生於執行錯誤處理常式期間,會繼續向下一層傳送。錯誤處理常式不保護自己! + +

        SUB ProcessFile(FileName AS STRING)
        +  ...
        +  OPEN FileName FOR READ AS #hFile
        +  ...
        +  CLOSE #hFile
        +CATCH ' 只在發生錯誤時執行
        +  PRINT "Cannot process file "; FileName
        +END
        + + +[FINALLY] + +

        Gambas使用下面的語句實現錯誤管理: +TRY,ERROR,CATCH和FINALLY。 + +

        在函數的尾部,FINALLY語句引領的代碼被執行,即使在其執行期間有錯誤發生。 + +FINALLY部分是非必要的。如果函數中有錯誤處理常式,FINALLY部分必須位於處理常式之前。 + + +

        FINALLY部分是非必要的。如果函數中有錯誤處理常式,FINALLY部分必須位於處理常式之前。 + +

        如果錯誤發生於FINALLY部分執行期間,錯誤會正常傳送。 + +

        SUB ProcessFile(FileName AS STRING)
        +  ...
        +  OPEN FileName FOR READ AS #hFile
        +  ...
        +FINALLY ' 即使有錯誤發生也會被執行
        +  CLOSE #hFile
        +CATCH ' 只在錯誤發生時執行
        +  PRINT "Cannot print file "; FileName
        +END
        + + +[OPTIONAL] + +

        Optional

        + +

        在Gambas裡面,函數和程序的參數可以含有選擇性的參數。

        + +

        定義選擇性參數的方法是在參數名稱面加上 Optional 關鍵字。

        + +

        您也可以在選擇性參數後面加上預設值,例如:

        + +
        Private Sub MyFunction(Param AS String, Optional Optim AS String = "Default")
        +  ...
        +  Print "Required: "; param; ", Optional: "; optim
        +  ...
        +End
        + + +[ARRAY] + +

        For Each

        + +

        在 Gambas 裡面,您可以輕易地用迴圈跑過陣列、集合以及其他支援 For Each 的可列舉類別。

        + +

        例如:

        + +
        Dim Xml As New XmlDocument
        +Dim Node As XmlNode
        +Dim I As Integer
        +
        +' Open XML file
        +Xml.Open("pokus.xml")
        +' Children is indexed via [i], since it's an array
        +For I = 0 To Xml.Root.Children.Count - 1
        +  'Attributes are looped via For Each, since it's a collection
        +  For Each Node In Xml.Root.Children[i].Attributes
        +    Print Node.Name;; Node.Value
        +  Next
        +Next
        + + +[ICON] + +

        預設圖示

        + +

        您可以使用內建的圖示來建構更美觀的圖形程式。這些內建圖示提供多種大小 ("small", "medium", "large",...),您也可以使用絕對大小 (從 16x16 到 256x256)。

        + +

        例如: + +

        Image1.Picture = Picture["icon:/32/warning"]
        +Image2.Picture = Picture["icon:/small/error"]
        +
        + +

        警告: 這個功能需要 gb.form 元件. + + +[SETTINGS] + +

        設定

        + +

        如果您需要在程式中儲存一些設定值 (如視窗位置、大小),您很幸運,在 Gambas +中做到這個是易如反掌。 :-) + +

        儲存視窗位置: +

        Settings.Write(TheForm)
        + +

        回復視窗位置: +

        Settings.Read(TheForm)
        + +儲存設定的方法: +
        Settings["Slot/Key"] = Value
        + +讀取設定的方法: +
        Value = Settings["Slot/Key", DefaultValue]
        + +這些設定將被儲存在 ~/.config/gambas3/<MyApplication>.conf 中, +<MyApplication> 是您的專案名稱。 + +

        警告: 這個功能需要 gb.settings 元件。 + + +[EDITOR] + +

        來點編輯器的提示...

        + +

        兩種註解類型

        + +
        ' 普通註解
        +
        '' 粗體註解
        + +

        粗體註解可以用來替程式碼撰寫文件.

        + +

        如何使用程式碼片段

        + +

        輸入 main 然後按下 TAB 鍵. 編輯器將自動插入 static public Main +到程式碼中. + +

        輸入 ds 然後按下 TAB 鍵. 編輯器將自動插入區域字串變數的宣告, 之後可以立即輸入變數名稱. + +

        程式碼片段可以在開發環境的選項中設定. + + +[END] + +

        您己讀完所有的每日提示提示。我希望您己經是 Gambas 的專家了!:-)

        + +

        如果您想爲Gambas貢獻一份力量,請用電子郵件發送新提示到:

        +英文:

        gambas@users.sourceforge.net

        +中文:

        yizhou.he@gmail.com

        + +

        預先感謝!

        + + + diff --git a/app/src/gambas3/usage b/app/src/gambas3/usage new file mode 100644 index 00000000..b3234265 --- /dev/null +++ b/app/src/gambas3/usage @@ -0,0 +1,29 @@ + +Gambas 3 Integrated Development Environment + +Usage: + +$ gambas3 [ [ ...]] + + Open the IDE with the specific project, optionally opening the specified project files. + If no argument is specified, open the IDE with a nice welcome dialog. + +$ gambas3 + + Open the IDE for editing the specified file if the IDE has an editor for it. + +$ gambas3 --cleanup + + Clean the project directory up (i.e. remove temporary, generated, and backup files). + +$ gambas3 --version | -V + + Display Gambas version. + +$ gambas3 --license | -L + + Display Gambas license. + +$ gambas3 --help + + Display this help. diff --git a/app/src/gambas3/welcome/bells.mp3 b/app/src/gambas3/welcome/bells.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..ccd6fe6b9b779c01bec33719ff0eebf710fd30ad GIT binary patch literal 139443 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

        jvn&5ARceaup(BQA^Nh! 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 bss<8yAoFiAA7Eho2Xg<=H{Yazy5R!=78rCW literal 0 HcmV?d00001 diff --git a/app/src/gambas3/welcome/border.png b/app/src/gambas3/welcome/border.png new file mode 100644 index 0000000000000000000000000000000000000000..1659c5d7531aaad5204f3895564d32c60d7469dc GIT binary patch literal 445 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 literal 0 HcmV?d00001 diff --git a/app/src/gambas3/welcome/snowflake.png b/app/src/gambas3/welcome/snowflake.png new file mode 100644 index 0000000000000000000000000000000000000000..5670ca734b493923e20847e1a7d5605088a83b4b GIT binary patch literal 5197 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 literal 0 HcmV?d00001 diff --git a/app/src/gambas3/welcome/spiritus.mp3 b/app/src/gambas3/welcome/spiritus.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..be70ba83439c06f4bd9f655419aa128c1c481ba6 GIT binary patch literal 131582 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\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +# gb-ignore +#: .project:1 +msgid "gb.wiki" +msgstr "" + +#: Admin.module:22 WHeader.webpage:165 +msgid "Administration" +msgstr "Amministrazione" + +#: Parser.module:39 +msgid "Only in &1 version" +msgstr "Solo nella versione &1" + +#: Parser.module:188 WHeader.webpage:146 +msgid "Cancel" +msgstr "Annulla" + +#: Parser.module:473 +msgid "Syntax" +msgstr "Sintassi" + +#: Parser.module:481 +msgid "Example" +msgstr "Esempio" + +#: Parser.module:500 +msgid "See also" +msgstr "Guarda anche" + +#: Parser.module:504 +msgid "Errors" +msgstr "Errori" + +#: Parser.module:507 +msgid "Description" +msgstr "Descrizione" + +#: Parser.module:507 +msgid "Message" +msgstr "Messaggio" + +#: Parser.module:1209 +msgid "Contents" +msgstr "Contenuto" + +#: Parser.module:1218 +msgid "This documentation page does not exist in version &1." +msgstr "Questa pagina di documentazione non esiste nella versione &1." + +# gb-ignore +#: WAccount.webpage:10 WAdminMain.webpage:16 WLogin.webpage:7 +msgid "Username" +msgstr "" + +# gb-ignore +#: WAccount.webpage:19 WAdminMain.webpage:17 WLogin.webpage:12 +msgid "Password" +msgstr "" + +#: WAccount.webpage:28 +msgid "Repeat your password" +msgstr "Ripeti la password" + +# gb-ignore +#: WAccount.webpage:37 WAdminMain.webpage:19 +msgid "Email" +msgstr "" + +#: WAccount.webpage:46 +msgid "Update" +msgstr "Aggiorna" + +#: WAdminMain.webpage:4 +msgid "User management" +msgstr "Gestione utenti" + +#: WAdminMain.webpage:7 +msgid "Create user" +msgstr "Crea un utente" + +#: WAdminMain.webpage:8 +msgid "Edit user" +msgstr "Modifica utente" + +#: WAdminMain.webpage:9 +msgid "Delete user" +msgstr "Elimina utente" + +#: WAdminMain.webpage:18 +msgid "Confirm" +msgstr "Conferma" + +#: WAdminMain.webpage:29 +msgid "Name" +msgstr "Nome" + +#: WAdminMain.webpage:63 +msgid "Database management" +msgstr "Gestione del database" + +#: WAdminMain.webpage:65 +msgid "Download database" +msgstr "Scarica il database" + +#: WAdminMain.webpage:69 +msgid "Purge temporary files" +msgstr "Elimina i file temporanei" + +#: WAdminMain.webpage:73 +msgid "Clear page cache" +msgstr "Cancella la cache della pagina" + +#: WEdit.webpage:8 +msgid "Save" +msgstr "Salva" + +#: WEdit.webpage:9 +msgid "Delete" +msgstr "Elimina" + +# gb-ignore +#: WHeader.class:18 +msgid "Home" +msgstr "" + +#: WHeader.webpage:45 +msgid "Gambas Documentation" +msgstr "Documentazione di Gambas" + +#: WHeader.webpage:127 +msgid "Previous" +msgstr "Precedente" + +#: WHeader.webpage:136 +msgid "Next" +msgstr "Successivo" + +#: WHeader.webpage:148 +msgid "Create" +msgstr "Crea" + +#: WHeader.webpage:148 +msgid "Edit" +msgstr "Modifica" + +#: WHeader.webpage:152 +msgid "Rename" +msgstr "Rinomina" + +#: WHeader.webpage:156 +msgid "Undo" +msgstr "Annulla" + +#: WHeader.webpage:164 +msgid "Search" +msgstr "Ricerca" + +#: WHeader.webpage:184 +msgid "Documentation" +msgstr "Documentazione" + +#: WHeader.webpage:187 +msgid "History" +msgstr "Storia" + +#: WHeader.webpage:208 +msgid "Warning!" +msgstr "Attenzione!" + +# gb-ignore +#: WLogin.webpage:17 +msgid "Login" +msgstr "" + +#: Wiki.module:40 +msgid "This page is not translated." +msgstr "Questa pagina non è tradotta." + +#: Wiki.module:45 +msgid "This page is not up to date." +msgstr "Questa pagina non è aggiornata" + diff --git a/app/src/gb.wiki/.lang/nl.po b/app/src/gb.wiki/.lang/nl.po new file mode 100644 index 00000000..497d2879 --- /dev/null +++ b/app/src/gb.wiki/.lang/nl.po @@ -0,0 +1,188 @@ +# Willy Raets < gbWilly@openmailbox.org >, 2014 +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.wiki 3.10.90\n" +"POT-Creation-Date: 2019-03-31 15:23 UTC\n" +"PO-Revision-Date: 2017-08-26 19:26 UTC\n" +"Last-Translator: Willy Raets \n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "gb.wiki" +msgstr "-" + +#: Admin.module:22 WHeader.webpage:165 +msgid "Administration" +msgstr "Administratie" + +#: Parser.module:39 +msgid "Only in &1 version" +msgstr "Enkel in &1 versie" + +#: Parser.module:188 WHeader.webpage:146 +msgid "Cancel" +msgstr "Annuleren" + +#: Parser.module:473 +msgid "Syntax" +msgstr "Syntaxis" + +#: Parser.module:481 +msgid "Example" +msgstr "Voorbeeld" + +#: Parser.module:500 +msgid "See also" +msgstr "Zie ook" + +#: Parser.module:504 +msgid "Errors" +msgstr "Fouten" + +#: Parser.module:507 +msgid "Description" +msgstr "Omschrijving" + +#: Parser.module:507 +msgid "Message" +msgstr "Boodschap" + +#: Parser.module:1209 +msgid "Contents" +msgstr "Inhoud" + +#: Parser.module:1218 +msgid "This documentation page does not exist in version &1." +msgstr "Deze documentatie pagina bestaat niet in versie &1." + +#: WAccount.webpage:10 WAdminMain.webpage:16 WLogin.webpage:7 +msgid "Username" +msgstr "Gebruikersnaam" + +#: WAccount.webpage:19 WAdminMain.webpage:17 WLogin.webpage:12 +msgid "Password" +msgstr "Wachtwoord" + +#: WAccount.webpage:28 +msgid "Repeat your password" +msgstr "Herhaal uw paswoord" + +#: WAccount.webpage:37 WAdminMain.webpage:19 +msgid "Email" +msgstr "-" + +#: WAccount.webpage:46 +msgid "Update" +msgstr "-" + +#: WAdminMain.webpage:4 +msgid "User management" +msgstr "Gebruikersbeheer" + +#: WAdminMain.webpage:7 +msgid "Create user" +msgstr "Creëer gebruiker" + +#: WAdminMain.webpage:8 +msgid "Edit user" +msgstr "Bewerk gebruiker" + +#: WAdminMain.webpage:9 +msgid "Delete user" +msgstr "Verwijder gebruiker" + +#: WAdminMain.webpage:18 +msgid "Confirm" +msgstr "Bevestigen" + +#: WAdminMain.webpage:29 +msgid "Name" +msgstr "Naam" + +#: WAdminMain.webpage:63 +msgid "Database management" +msgstr "Database beheer" + +#: WAdminMain.webpage:65 +msgid "Download database" +msgstr "Database downloaden" + +#: WAdminMain.webpage:69 +msgid "Purge temporary files" +msgstr "Tijdelijke bestanden opschonen" + +#: WAdminMain.webpage:73 +msgid "Clear page cache" +msgstr "Pagina cache opschonen" + +#: WEdit.webpage:8 +msgid "Save" +msgstr "Opslaan" + +#: WEdit.webpage:9 +msgid "Delete" +msgstr "Verwijder" + +#: WHeader.class:18 +msgid "Home" +msgstr "-" + +#: WHeader.webpage:45 +msgid "Gambas Documentation" +msgstr "Gambas documenatie" + +#: WHeader.webpage:127 +msgid "Previous" +msgstr "Vorige" + +#: WHeader.webpage:136 +msgid "Next" +msgstr "Volgende" + +#: WHeader.webpage:148 +msgid "Create" +msgstr "Creëer" + +#: WHeader.webpage:148 +msgid "Edit" +msgstr "Bewerk" + +#: WHeader.webpage:152 +msgid "Rename" +msgstr "Hernoem" + +#: WHeader.webpage:156 +msgid "Undo" +msgstr "Ongedaan maken" + +#: WHeader.webpage:164 +msgid "Search" +msgstr "Zoeken" + +#: WHeader.webpage:184 +msgid "Documentation" +msgstr "Documentatie" + +#: WHeader.webpage:187 +msgid "History" +msgstr "Geschiedenis" + +#: WHeader.webpage:208 +msgid "Warning!" +msgstr "Waarschuwing!" + +#: WLogin.webpage:17 +msgid "Login" +msgstr "-" + +#: Wiki.module:40 +msgid "This page is not translated." +msgstr "Deze pagina is niet vertaald." + +#: Wiki.module:45 +msgid "This page is not up to date." +msgstr "Deze pagina is niet up to date" diff --git a/app/src/gb.wiki/.lang/pt_BR.po b/app/src/gb.wiki/.lang/pt_BR.po new file mode 100644 index 00000000..fe27e1bd --- /dev/null +++ b/app/src/gb.wiki/.lang/pt_BR.po @@ -0,0 +1,190 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.wiki 3.14.90\n" +"PO-Revision-Date: 2020-06-12 00:11 UTC\n" +"Last-Translator: Gen Braga \n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +# gb-ignore +#: .project:1 +msgid "gb.wiki" +msgstr "" + +#: Admin.module:22 WHeader.webpage:165 +msgid "Administration" +msgstr "Administração" + +#: Parser.module:39 +msgid "Only in &1 version" +msgstr "Apenas na versão &1" + +#: Parser.module:188 WHeader.webpage:146 +msgid "Cancel" +msgstr "Cancelar" + +#: Parser.module:473 +msgid "Syntax" +msgstr "Sintaxe" + +#: Parser.module:481 +msgid "Example" +msgstr "Exemplo" + +#: Parser.module:500 +msgid "See also" +msgstr "Veja também" + +#: Parser.module:504 +msgid "Errors" +msgstr "Erros" + +#: Parser.module:507 +msgid "Message" +msgstr "Mensagem" + +#: Parser.module:507 +msgid "Description" +msgstr "Descrição" + +#: Parser.module:1209 +msgid "Contents" +msgstr "Conteúdo" + +#: Parser.module:1218 +msgid "This documentation page does not exist in version &1." +msgstr "Esta página de documentação não existe na versão &1." + +#: WAccount.webpage:10 WAdminMain.webpage:16 WLogin.webpage:7 +msgid "Username" +msgstr "Nome de usuário" + +#: WAccount.webpage:19 WAdminMain.webpage:17 WLogin.webpage:12 +msgid "Password" +msgstr "Senha" + +#: WAccount.webpage:28 +msgid "Repeat your password" +msgstr "Repita sua senha" + +# gb-ignore +#: WAccount.webpage:37 WAdminMain.webpage:19 +msgid "Email" +msgstr "" + +#: WAccount.webpage:46 +msgid "Update" +msgstr "Atualizar" + +#: WAdminMain.webpage:4 +msgid "User management" +msgstr "Gerenciamento de usuário" + +#: WAdminMain.webpage:7 +msgid "Create user" +msgstr "Criar usuário" + +#: WAdminMain.webpage:8 +msgid "Edit user" +msgstr "Editar usuário" + +#: WAdminMain.webpage:9 +msgid "Delete user" +msgstr "Excluir usuário" + +#: WAdminMain.webpage:18 +msgid "Confirm" +msgstr "Confirmar" + +#: WAdminMain.webpage:29 +msgid "Name" +msgstr "Nome" + +#: WAdminMain.webpage:63 +msgid "Database management" +msgstr "Gerenciamento do banco de dados" + +#: WAdminMain.webpage:65 +msgid "Download database" +msgstr "Baixar banco de dados" + +#: WAdminMain.webpage:69 +msgid "Purge temporary files" +msgstr "Limpar arquivos temporários" + +#: WAdminMain.webpage:73 +msgid "Clear page cache" +msgstr "Limpar cache de página" + +#: WEdit.webpage:8 +msgid "Save" +msgstr "Salvar" + +#: WEdit.webpage:9 +msgid "Delete" +msgstr "Excluir" + +#: WHeader.webpage:45 +msgid "Gambas Documentation" +msgstr "Documentação do Gambas" + +#: WHeader.webpage:127 +msgid "Previous" +msgstr "Anterior" + +#: WHeader.webpage:136 +msgid "Next" +msgstr "Próximo" + +#: WHeader.webpage:148 +msgid "Edit" +msgstr "Editar" + +#: WHeader.webpage:148 +msgid "Create" +msgstr "Criar" + +#: WHeader.webpage:152 +msgid "Rename" +msgstr "Renomear" + +#: WHeader.webpage:156 +msgid "Undo" +msgstr "Desfazer" + +#: WHeader.webpage:164 +msgid "Search" +msgstr "Buscar" + +#: WHeader.webpage:184 +msgid "Documentation" +msgstr "Documentação" + +#: WHeader.webpage:187 +msgid "History" +msgstr "Histórico" + +#: WHeader.webpage:208 +msgid "Warning!" +msgstr "Atenção!" + +#: WHeader.class:18 +msgid "Home" +msgstr "Início" + +# gb-ignore +#: WLogin.webpage:17 +msgid "Login" +msgstr "" + +#: Wiki.module:40 +msgid "This page is not translated." +msgstr "Esta página não está traduzida." + +#: Wiki.module:45 +msgid "This page is not up to date." +msgstr "Esta página não está atualizada." + diff --git a/app/src/gb.wiki/.lang/ru.po b/app/src/gb.wiki/.lang/ru.po new file mode 100644 index 00000000..509719bb --- /dev/null +++ b/app/src/gb.wiki/.lang/ru.po @@ -0,0 +1,210 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-30 08:04+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/src/gb.wiki/.project:16 +msgid "gb.wiki" +msgstr "gb.wiki" + +#: app/src/gb.wiki/.src/Parser.module:39 +msgid "Only in &1 version" +msgstr "Только в версии &1" + +#: app/src/gb.wiki/.src/Parser.module:188 app/src/gb.wiki/.src/Views/WHeader.webpage:8 +msgid "Cancel" +msgstr "Отмена" + +#: app/src/gb.wiki/.src/Parser.module:473 +msgid "Syntax" +msgstr "Синтаксис" + +#: app/src/gb.wiki/.src/Parser.module:481 +msgid "Example" +msgstr "Пример" + +#: app/src/gb.wiki/.src/Parser.module:500 +msgid "See also" +msgstr "См. также" + +#: app/src/gb.wiki/.src/Parser.module:504 +msgid "Errors" +msgstr "Ошибки" + +#: app/src/gb.wiki/.src/Parser.module:507 +msgid "Message" +msgstr "Сообщение" + +#: app/src/gb.wiki/.src/Parser.module:507 +msgid "Description" +msgstr "Описание" + +#: app/src/gb.wiki/.src/Parser.module:1209 +msgid "Contents" +msgstr "Содержания" + +#: app/src/gb.wiki/.src/Parser.module:1218 +msgid "This documentation page does not exist in version &1." +msgstr "Эта страница документации не существует в версии &1." + +#: app/src/gb.wiki/.src/Views/WHeader.webpage:1 +msgid "style.css" +msgstr "style.css" + +#: app/src/gb.wiki/.src/Views/WHeader.webpage:2 +msgid "Gambas Documentation" +msgstr "Документация Gambas" + +#: app/src/gb.wiki/.src/Views/WHeader.webpage:3 +msgid "lang/" +msgstr "язык/" + +#: app/src/gb.wiki/.src/Views/WHeader.webpage:4 app/src/gb.wiki/.src/Views/WHeader.webpage:5 +msgid "Previous" +msgstr "Назад" + +#: app/src/gb.wiki/.src/Views/WHeader.webpage:6 app/src/gb.wiki/.src/Views/WHeader.webpage:7 +msgid "Next" +msgstr "Далее" + +#: app/src/gb.wiki/.src/Views/WHeader.webpage:9 +msgid "Edit" +msgstr "Редактировать" + +#: app/src/gb.wiki/.src/Views/WHeader.webpage:10 +msgid "Create" +msgstr "Создать" + +#: app/src/gb.wiki/.src/Views/WHeader.webpage:11 +msgid "Rename" +msgstr "Переименовать" + +#: app/src/gb.wiki/.src/Views/WHeader.webpage:12 +msgid "Undo" +msgstr "Откатить" + +#: app/src/gb.wiki/.src/Views/WHeader.webpage:13 +msgid "Search" +msgstr "Поиск" + +#: app/src/gb.wiki/.src/Views/WHeader.webpage:14 app/src/gb.wiki/.src/Controllers/Admin.module:22 app/src/gb.wiki/.src/Controllers/Admin.module:51 app/src/gb.wiki/.src/Controllers/Admin.module:109 +msgid "Administration" +msgstr "Администрирование" + +#: app/src/gb.wiki/.src/Views/WHeader.webpage:15 +msgid "Documentation" +msgstr "Документация" + +#: app/src/gb.wiki/.src/Views/WHeader.webpage:16 +msgid "History" +msgstr "История" + +#: app/src/gb.wiki/.src/Views/WHeader.webpage:17 +msgid "Warning!" +msgstr "Предупреждение!" + +#: app/src/gb.wiki/.src/Views/WAccount.webpage:11 app/src/gb.wiki/.src/Views/WLogin.webpage:8 app/src/gb.wiki/.src/Views/Admin/WAdminMain.webpage:17 +msgid "Username" +msgstr "Имя пользователя" + +#: app/src/gb.wiki/.src/Views/WAccount.webpage:20 app/src/gb.wiki/.src/Views/WLogin.webpage:13 app/src/gb.wiki/.src/Views/Admin/WAdminMain.webpage:18 app/src/gb.wiki/.src/Views/Admin/WAdminMain.webpage:39 +msgid "Password" +msgstr "Пароль" + +#: app/src/gb.wiki/.src/Views/WAccount.webpage:29 +msgid "Repeat your password" +msgstr "Повторите ваш пароль" + +#: app/src/gb.wiki/.src/Views/WAccount.webpage:38 app/src/gb.wiki/.src/Views/Admin/WAdminMain.webpage:20 +msgid "Email" +msgstr "Электронная почта" + +#: app/src/gb.wiki/.src/Views/WAccount.webpage:47 +msgid "Update" +msgstr "Обновить" + +#: app/src/gb.wiki/.src/Views/WEdit.webpage:9 app/src/gb.wiki/.src/Views/WEdit.webpage:19 +msgid "Save" +msgstr "Сохранить" + +#: app/src/gb.wiki/.src/Views/WEdit.webpage:10 app/src/gb.wiki/.src/Views/WEdit.webpage:20 +msgid "Delete" +msgstr "Удалить" + +#: app/src/gb.wiki/.src/Views/WHeader.class:18 +msgid "Home" +msgstr "Дом" + +#: app/src/gb.wiki/.src/Views/WLogin.webpage:18 +msgid "Login" +msgstr "Логин" + +#: app/src/gb.wiki/.src/Views/Admin/WAdminMain.webpage:5 +msgid "User management" +msgstr "Управление пользователями" + +#: app/src/gb.wiki/.src/Views/Admin/WAdminMain.webpage:8 app/src/gb.wiki/.src/Views/Admin/WAdminMain.webpage:22 +msgid "Create user" +msgstr "Создать пользователя" + +#: app/src/gb.wiki/.src/Views/Admin/WAdminMain.webpage:9 app/src/gb.wiki/.src/Views/Admin/WAdminMain.webpage:42 +msgid "Edit user" +msgstr "Редактировать пользователя" + +#: app/src/gb.wiki/.src/Views/Admin/WAdminMain.webpage:10 app/src/gb.wiki/.src/Views/Admin/WAdminMain.webpage:59 +msgid "Delete user" +msgstr "Удалить пользователя" + +#: app/src/gb.wiki/.src/Views/Admin/WAdminMain.webpage:19 app/src/gb.wiki/.src/Views/Admin/WAdminMain.webpage:40 +msgid "Confirm" +msgstr "Подтверждение" + +#: app/src/gb.wiki/.src/Views/Admin/WAdminMain.webpage:30 app/src/gb.wiki/.src/Views/Admin/WAdminMain.webpage:49 +msgid "Name" +msgstr "Имя" + +#: app/src/gb.wiki/.src/Views/Admin/WAdminMain.webpage:64 +msgid "Database management" +msgstr "Управление базой данных" + +#: app/src/gb.wiki/.src/Views/Admin/WAdminMain.webpage:66 +msgid "Download database" +msgstr "Скачать базу данных" + +#: app/src/gb.wiki/.src/Views/Admin/WAdminMain.webpage:70 +msgid "Purge temporary files" +msgstr "Очистить временные файлы" + +#: app/src/gb.wiki/.src/Views/Admin/WAdminMain.webpage:74 +msgid "Clear page cache" +msgstr "Очистить кэш страницы" + +#: app/src/gb.wiki/.src/Controllers/Wiki.module:40 +msgid "This page is not translated." +msgstr "Эта страница не переведена." + +#: app/src/gb.wiki/.src/Controllers/Wiki.module:45 +msgid "This page is not up to date." +msgstr "Эта страница не актуальна." + diff --git a/app/src/gb.wiki/.lang/zh.po b/app/src/gb.wiki/.lang/zh.po new file mode 100644 index 00000000..c67904b8 --- /dev/null +++ b/app/src/gb.wiki/.lang/zh.po @@ -0,0 +1,188 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "gb.wiki" +msgstr "-" + +#: Admin.module:22 WHeader.webpage:165 +msgid "Administration" +msgstr "管理员" + +#: Parser.module:39 +msgid "Only in &1 version" +msgstr "仅存在于&1版中" + +#: Parser.module:188 WHeader.webpage:146 +msgid "Cancel" +msgstr "取消" + +#: Parser.module:473 +msgid "Syntax" +msgstr "语法" + +#: Parser.module:481 +msgid "Example" +msgstr "示例" + +#: Parser.module:500 +msgid "See also" +msgstr "参见" + +#: Parser.module:504 +msgid "Errors" +msgstr "错误" + +#: Parser.module:507 +msgid "Description" +msgstr "描述" + +#: Parser.module:507 +msgid "Message" +msgstr "消息" + +#: Parser.module:1209 +msgid "Contents" +msgstr "目录" + +#: Parser.module:1218 +msgid "This documentation page does not exist in version &1." +msgstr "在&1版中该文档页不存在。" + +#: WAccount.webpage:10 WAdminMain.webpage:16 WLogin.webpage:7 +msgid "Username" +msgstr "用户名" + +#: WAccount.webpage:19 WAdminMain.webpage:17 WLogin.webpage:12 +msgid "Password" +msgstr "口令" + +#: WAccount.webpage:28 +msgid "Repeat your password" +msgstr "重复口令" + +#: WAccount.webpage:37 WAdminMain.webpage:19 +msgid "Email" +msgstr "邮箱" + +#: WAccount.webpage:46 +msgid "Update" +msgstr "更新" + +#: WAdminMain.webpage:4 +msgid "User management" +msgstr "用户管理" + +#: WAdminMain.webpage:7 +msgid "Create user" +msgstr "创建用户" + +#: WAdminMain.webpage:8 +msgid "Edit user" +msgstr "编辑用户" + +#: WAdminMain.webpage:9 +msgid "Delete user" +msgstr "删除用户" + +#: WAdminMain.webpage:18 +msgid "Confirm" +msgstr "确认" + +#: WAdminMain.webpage:29 +msgid "Name" +msgstr "名称" + +#: WAdminMain.webpage:63 +msgid "Database management" +msgstr "数据库管理" + +#: WAdminMain.webpage:65 +msgid "Download database" +msgstr "下载数据库" + +#: WAdminMain.webpage:69 +msgid "Purge temporary files" +msgstr "清除临时文件" + +#: WAdminMain.webpage:73 +msgid "Clear page cache" +msgstr "清除页面缓存" + +#: WEdit.webpage:8 +msgid "Save" +msgstr "保存" + +#: WEdit.webpage:9 +msgid "Delete" +msgstr "删除" + +#: WHeader.class:18 +msgid "Home" +msgstr "主页" + +#: WHeader.webpage:45 +msgid "Gambas Documentation" +msgstr "Gambas文档" + +#: WHeader.webpage:127 +msgid "Previous" +msgstr "前一个" + +#: WHeader.webpage:136 +msgid "Next" +msgstr "后一个" + +#: WHeader.webpage:148 +msgid "Create" +msgstr "创建" + +#: WHeader.webpage:148 +msgid "Edit" +msgstr "编辑" + +#: WHeader.webpage:152 +msgid "Rename" +msgstr "重命名" + +#: WHeader.webpage:156 +msgid "Undo" +msgstr "撤销" + +#: WHeader.webpage:164 +msgid "Search" +msgstr "搜索" + +#: WHeader.webpage:184 +msgid "Documentation" +msgstr "文档" + +#: WHeader.webpage:187 +msgid "History" +msgstr "历史" + +#: WHeader.webpage:208 +msgid "Warning!" +msgstr "警告!" + +#: WLogin.webpage:17 +msgid "Login" +msgstr "登录" + +#: Wiki.module:40 +msgid "This page is not translated." +msgstr "该页面未翻译。" + +#: Wiki.module:45 +msgid "This page is not up to date." +msgstr "该页面非最新。" diff --git a/app/src/gb.wiki/.project b/app/src/gb.wiki/.project new file mode 100644 index 00000000..6e8d844a --- /dev/null +++ b/app/src/gb.wiki/.project @@ -0,0 +1,15 @@ +# Gambas Project File 3.0 +Title=gb.wiki +Startup=Main +UseHttpServer=1 +Icon=help.png +Version=3.14.90 +VersionFile=1 +Component=gb.db +Component=gb.web +Authors="sebikul " +Environment="HTTP_HOST=localhost\nPATH_INFO=/help" +TabSize=2 +Translate=1 +Language=en_US +Packager=1 diff --git a/app/src/gb.wiki/.src/Actions.module b/app/src/gb.wiki/.src/Actions.module new file mode 100644 index 00000000..bde53711 --- /dev/null +++ b/app/src/gb.wiki/.src/Actions.module @@ -0,0 +1,189 @@ +' Gambas module file + +Property Read Refresh As Boolean +Property Read Undo As Boolean +Property Read View As Boolean +Property Read Show As Boolean +Property Read Get As Boolean +Property Read OnlineHelp As Boolean +Property Read NoTitle As Boolean +Property Read NoImage As Boolean +Property Read NoCache As Boolean +Property Read Edit As Boolean +Property Read Rename As Boolean +Property Read Help As Boolean +Property Read Image As Boolean +Property Read History As Boolean + +Property Parsed As Boolean +Public $bParsed As Boolean + +Private $bRefresh As Boolean +Private $bUndo As Boolean +Private $bView As Boolean +Private $bShow As Boolean +Private $bGet As Boolean +Private $bOnlineHelp As Boolean +Private $bNoTitle As Boolean +Private $bNoImage As Boolean +Private $bNoCache As Boolean +Private $bEdit As Boolean +Private $bRename As Boolean +Private $bHelp As Boolean +Private $bHistory As Boolean + +Public Sub _init() + + Dim sField As String + + For Each sField In Request.Get.Fields + + Select Case sField + Case "refresh" + $bRefresh = True + + Case "undo" + $bUndo = True + + Case "view" + $bView = True + $bShow = True + + Case "show" + $bShow = True + + Case "wiki" + $bGet = True + + Case "help" + $bView = True + $bShow = True + $bOnlineHelp = True + + Case "notitle" + $bNoTitle = True + + Case "noimage" + $bNoImage = True + + Case "nocache" + $bNoCache = True + + Case "edit" + $bEdit = True + + Case "rename" + $bRename = True + + Case "hist" + $bHistory = True + End Select + + Next + + If Not $bShow Then $bShow = Main.IsWget Or Request.Get.Exist("show") + $bHelp = $bShow Or Request.Get.Exist("help") Or Request.Path Like "/help*" + +End + +Private Function Refresh_Read() As Boolean + + Return $bRefresh + +End + +Private Function Undo_Read() As Boolean + + Return $bUndo + +End + +Private Function View_Read() As Boolean + + Return $bView + +End + +Private Function Show_Read() As Boolean + + Return $bShow + +End + +Private Function Get_Read() As Boolean + + Return $bGet + +End + +Private Function OnlineHelp_Read() As Boolean + + Return $bOnlineHelp + +End + +Private Function NoTitle_Read() As Boolean + + Return $bNoTitle + +End + +Private Function NoImage_Read() As Boolean + + Return $bNoImage + +End + +Private Function NoCache_Read() As Boolean + + Return $bNoCache + +End + +Private Function Edit_Read() As Boolean + + Return $bEdit + +End + +Private Function Help_Read() As Boolean + + Return Request.Path Begins "/help" + +End + +Private Function Image_Read() As Boolean + + Return (Left$(File.Name(Request.Path)) = ":") + +End + +Private Function History_Read() As Boolean + + Return $bHistory + +End + +Public Sub Debug() + + 'Print WWiki.oPage.Content + +End + +Private Function Rename_Read() As Boolean + + Return $bRename + +End + +Private Function Parsed_Read() As Boolean + + Return $bParsed + +End + +Private Sub Parsed_Write(Value As Boolean) + + $bParsed = Value + +End diff --git a/app/src/gb.wiki/.src/Controllers/Admin.module b/app/src/gb.wiki/.src/Controllers/Admin.module new file mode 100644 index 00000000..cca2e576 --- /dev/null +++ b/app/src/gb.wiki/.src/Controllers/Admin.module @@ -0,0 +1,115 @@ +' Gambas module file + +Public Sub Main() + + If Not Users.Current.IsAdmin Then + UserManage.Login() + Return + Endif + + If Path.Components.Count > 1 Then + + Select Case Path.Components[1] + Case "create" + usrCreate() + + Case "delete" + usrDelete() + + End Select + + Else + WHeader.Title = ("Administration") + + WAdminMain.Render() + + Endif + +End + +Private Sub usrDelete() + + If Request.Method <> "POST" Then + Main.ThrowError("Invalid method") + Endif + + If Not Request.Post["sUsername"] Then + Error.Raise("No username!") + Endif + + If Not Users.Find(Request.Post["sUsername"]) Then + Error.Raise("Username already in use!") + Endif + + Users.Delete(Request.Post["sUsername"]) + + Response.Redirect("/admin") + Quit + +Catch + + WHeader.Title = ("Administration") + + WHeader.Warning = Error.Text + + WAdminMain.Render() + +End + +Private Sub usrCreate() + + Dim sField As String + Dim sRequired As String[] = ["sName", "sPassword", "sPasswordAgain", "sEmail"] + Dim uUser As _User + + If Request.Method <> "POST" Then + Main.ThrowError("Invalid method") + Endif + + For Each sField In sRequired + If Not Request.Post[sField] Then + Error.Raise("Missing: " & sField) + Endif + Next + + If Request.Post["sPassword"] <> Request.Post["sPasswordAgain"] Then + Error.Raise("Passwords do not match") + Endif + + If Len(Request.Post["sPassword"]) < 6 Or Not IsAscii(Request.Post["sPassword"]) Then + Error.Raise("Passwords invalid. Too short or contains invalid characters.") + Endif + + If Len(Request.Post["sName"]) < 6 Or Not IsAscii(Request.Post["sName"]) Then + Error.Raise("Username invalid. Too short or contains invalid characters.") + Endif + + If Not Request.Post["sEmail"] Then + Error.Raise("Email not set.") + Endif + + uUser = Users.Create(Request.Post["sName"]) + + If Not uUser Then + Error.Raise("Username already in use!") + Endif + + uUser.Username = Request.Post["sName"] + uUser.Password = Request.Post["sPassword"] + + uUser.Email = Request.Post["sEmail"] + + uUser.Update() + + Response.Redirect("/admin") + Quit + +Catch + + WHeader.Title = ("Administration") + + WHeader.Warning = Error.Text + + WAdminMain.Render() + +End diff --git a/app/src/gb.wiki/.src/Controllers/Image.module b/app/src/gb.wiki/.src/Controllers/Image.module new file mode 100644 index 00000000..bbd8e296 --- /dev/null +++ b/app/src/gb.wiki/.src/Controllers/Image.module @@ -0,0 +1,42 @@ +' Gambas module file + +Public Sub Send() + + Dim rPage As Result + Dim rPageDef As Result + Dim sPath As String + + sPath = Path.Page + + rPage = DB.Find(DBScheme.TABLE_PAGES, DBScheme.PAGE_PATH & "= &1 AND " & DBScheme.PAGE_LANG & "= &2", sPath, Main.Language) + rPageDef = DB.Find(DBScheme.TABLE_PAGES, DBScheme.PAGE_PATH & "= &1 AND " & DBScheme.PAGE_LANG & "= &2", sPath, Main.DEFAULT_LANG) + + If rPageDef.Available Then + If Not rPage.Available Then + ' IF sPath = $sPath THEN + ' sWarn = ("This page is not translated.") + ' $bNew = TRUE + ' ENDIF + rPage = rPageDef + Else + ' IF rPageDef!dDate > rPage!dDate THEN + ' IF sPath = $sPath THEN sWarn = ("This page is not up to date.") + ' ENDIF + Endif + Endif + + 'DEBUG DB.Tables["page"].Fields["sdata"].Type + 'PRINT #File.Err, rPage.Fields["sData"].Type; "/"; Len(rPage["sData"].Data) + 'DEBUG rPage!sData.Length + + sPath = Temp() + + File.Save(sPath, rPage["sData"].Data) + + Response.AddHeader("Last-Modified", CGI.FormatDate(rPage!dDate)) + + Response.SendFile(sPath, Mid(rPage!sHTML, InStr(rPage!sHTML, " ") + 1)) + + Quit + +End diff --git a/app/src/gb.wiki/.src/Controllers/UserManage.module b/app/src/gb.wiki/.src/Controllers/UserManage.module new file mode 100644 index 00000000..1bfafcee --- /dev/null +++ b/app/src/gb.wiki/.src/Controllers/UserManage.module @@ -0,0 +1,109 @@ +' Gambas module file + +Public Sub Login() + + If Request.Method = "POST" Then + + Users.Login(Request.Post["sUsername"], Request.Post["sPassword"]) + + If Users.Current.Type > Users.USER_GUEST Then + Response.Redirect("/help") + Quit + Endif + + Endif + + WHeader.Title = "User Login" + + WLogin.Render() + +End + +Public Sub Logout() + + Users.Logout() + + Response.Redirect("/help") + Quit + +End + +Public Sub Account() + + WHeader.Title = "Account Managment" + + If Request.Method = "POST" Then + usrEdit() + Return + Endif + + WAccount.Render() + +End + +Public Sub usrEdit() + + Dim sField As String + Dim sRequired As String[] = ["sEmail"] + Dim uUser As _User + + If Request.Method <> "POST" Then + Main.ThrowError("Invalid method") + Endif + + If Request.Post["sPassword"] Then + sRequired.Add("sPassword") + sRequired.Add("sPasswordAgain") + Endif + + For Each sField In sRequired + If Not Request.Post[sField] Then + Error.Raise("Missing: " & sField) + Endif + Next + + If Request.Post["sPassword"] Then + + If Request.Post["sPassword"] <> Request.Post["sPasswordAgain"] Then + Error.Raise("Passwords do not match") + Endif + + If Len(Request.Post["sPassword"]) < 6 Or Not IsAscii(Request.Post["sPassword"]) Then + Error.Raise("Passwords invalid. Too short or contains invalid characters.") + Endif + + Endif + + If Not Request.Post["sEmail"] Then + Error.Raise("Email not set.") + Endif + + If Request.Post["sUsername"] <> Session["username"] Then + 'TODO: + Main.ThrowError("Hacking attempt, the admin has been notified!") + Endif + + uUser = Users.Get(Session["username"], False) + + If Not uUser Then + Main.ThrowError("Username does not exist!") + Endif + + If Request.Post["sPassword"] Then + uUser.Password = Request.Post["sPassword"] + Endif + + uUser.Email = Request.Post["sEmail"] + + uUser.Update() + + Response.Redirect("/account") + Quit + +Catch + + WHeader.Warning = Error.Text + + WAccount.Render() + +End diff --git a/app/src/gb.wiki/.src/Controllers/Wiki.module b/app/src/gb.wiki/.src/Controllers/Wiki.module new file mode 100644 index 00000000..12359bf6 --- /dev/null +++ b/app/src/gb.wiki/.src/Controllers/Wiki.module @@ -0,0 +1,64 @@ +' Gambas module file + +Public Sub Page() + + If Actions.Edit Then + + WHeader.Title = Pages.Current.Title + + WEdit.Render() + + Else If Actions.Get + + Get() + + Else + + WHeader.Title = Pages.Current.Title + + WWiki.Render() + + 'Print Parser.Encode(Pages.Current.Content) + + Endif + +End + +Public Sub Get() + + Dim rPage As Result + Dim rPageDef As Result + Dim sWarn As String + Dim sPath As String + + rPage = DB.Find("page", "sPath = &1 AND sLang = &2", Path.Page, Main.Language) + rPageDef = DB.Find("page", "sPath = &1 AND sLang = &2", Path.Page, Main.DEFAULT_LANG) + + If rPageDef.Available Then + If Not rPage.Available Then + If sPath = Path.Page Then + sWarn = ("This page is not translated.") + Endif + rPage = rPageDef + Else + If rPageDef!dDate > rPage!dDate Then + If sPath = Path.Page Then sWarn = ("This page is not up to date.") + Endif + Endif + Endif + + If Not rPage.Available Then + Return + Endif + + Response.Buffered = True + + Response.ContentType = "text/plain;charset=UTF-8" + + Response.Begin() + + Print rPage!sDesc + + Response.End + +End diff --git a/app/src/gb.wiki/.src/DBScheme.class b/app/src/gb.wiki/.src/DBScheme.class new file mode 100644 index 00000000..706e2674 --- /dev/null +++ b/app/src/gb.wiki/.src/DBScheme.class @@ -0,0 +1,21 @@ +' Gambas class file + +Create Static + +Public Const TABLE_USERS As String = "users" +Public Const TABLE_PAGES As String = "page" + +Public Const PAGE_PATH As String = "sPath" +Public Const PAGE_LANG As String = "sLang" +Public Const PAGE_DATE As String = "dDate" +Public Const PAGE_TITLE As String = "sTitle" +Public Const PAGE_CONTENT As String = "sDesc" +Public Const PAGE_DATA As String = "sData" +Public Const PAGE_HTML As String = "sHTML" +Public Const PAGE_USER As String = "sUser" + +Public Const USER_ID As String = "id" +Public Const USER_USERNAME As String = "sUser" +Public Const USER_PASSWORD As String = "sPass" +Public Const USER_EMAIL As String = "sEmail" +Public Const USER_TYPE As String = "iType" diff --git a/app/src/gb.wiki/.src/Main.module b/app/src/gb.wiki/.src/Main.module new file mode 100644 index 00000000..65b7a281 --- /dev/null +++ b/app/src/gb.wiki/.src/Main.module @@ -0,0 +1,253 @@ +' Gambas module file + +Public Const DEFAULT_LANG As String = "en" +Public Const DEFAULT_VERSION As Integer = 3 + +Property Language As String +Property Version As Integer +Property Read IsWget As Boolean + +Public hConn As New Connection +Public Langs As String[] = [DEFAULT_LANG, "fr", "de", "es", "it", "nl", "pl", "pt", "pt_BR", "mk", "sq", "ca", "hu", "cs", "tr", "ar", "fa", "id", "vi", "ko", "ja", "ru", "zh", "zh_TW", "eo"] + +Private $sLanguage As String +Private $iVersion As Integer + +Public Sub Main() + + ' Request.Debug = True + 'Session.Unique = True + + 'Response.Buffered = True + + Session.CookiePath = "/" + + Session.Load() + + 'WHeader.Render() + + If Request.Path = "/favicon.ico" Then + Response.SendFile(".icon.png") + Return + Endif + + SetLang() + + SetVer() + + 'Session["username"] = "sebikul" + + 'Response.Begin() + + OpenDatabase() + + 'db.Debug = True + + 'Users.Create("asd1", "asd1", "asd2") + ' + ' Users.Edit("asd1", "jajajaj", "holaa") + + Select Case Path.Section + + Case Path.PATH_ADMIN + Response.ContentType = "text/html;charset=UTF-8" + Admin.Main() + ' Print "DEBUG: Admin.Main()
        " + + Case Path.PATH_WIKI + Response.ContentType = "text/html;charset=UTF-8" + Wiki.Page() + ' Print "DEBUG: Wiki.Page()
        " + + Case Path.PATH_ACCOUNT + Response.ContentType = "text/html;charset=UTF-8" + UserManage.Account() + ' Print "DEBUG: UserManage.Account()
        " + + Case Path.PATH_LOGIN + Response.ContentType = "text/html;charset=UTF-8" + UserManage.Login() + ' Print "DEBUG: UserManage.Login()
        " + + Case Path.PATH_LOGOUT + Response.ContentType = "text/html;charset=UTF-8" + UserManage.Logout() + ' Print "DEBUG: UserManage.Logout()
        " + + Case Path.PATH_IMAGE + Image.Send() + ' Print "DEBUG: Image.Send()
        " + + Case Path.PATH_404, Path.PATH_MAIN + Response.ContentType = "text/html;charset=UTF-8" + Response.Redirect("/help") + Return + + End Select + + Debug() + + ' Response.End() + ' + Session.Save() + +Catch + + Response.ContentType = "text/html;charset=UTF-8" + + Print "

        Unexpected error while displaying this page.

        " + Print "
        "; Error.Text, Error.Code
        +  Print ""; Error.Where; ""
        +  Print "

        "; Error.Backtrace.Join("
        "); "

        " + + Debug() + + Print "
        " + +End + +Private Sub OpenDatabase() + + hConn.Type = "mysql" + hConn.Login = "gbwiki" + hConn.Password = "" + + hConn.Name = "gambas" + + Try hConn.Open() + + If Error Then + CGI.Error(Error.Text) + Endif + +End + +''TODO: Implement +Public Function PrintTitle(sTitle As String) As String + + Return sTitle + +End + +Private Function Language_Read() As String + + Return $sLanguage + +End + +Private Sub Language_Write(Value As String) + + If Not Langs.Exist(Value) Then Return + + $sLanguage = Value + +End + +Public Function EncodeLink(sLink As String) As String + + Return Replace$(sLink, "&", "&") + +End + +Public Function GetImage(sImg As String, Optional sAdd As String, Optional sAlign As String = "center") As String + + If sAdd Then sAdd = " " & sAdd + Return "" + +End + +Private Function Version_Read() As Integer + + Return $iVersion + +End + +Private Sub Version_Write(Value As Integer) + + If Value < 2 Or Value > 3 Then Return + + $iVersion = CInt(Value) + +End + +Private Function IsWget_Read() As Boolean + + Return Application.Env["HTTP_USER_AGENT"] Like "WGet*" + +End + +Private Sub SetLang() + + If Request.Get.Exist("lang") Then + Session["lang"] = Request.Get["lang"] + Response.Redirect(Path.Path) + Quit + Endif + + If Session["lang"] Then + Me.Language = Session["lang"] + Else + Me.Language = DEFAULT_LANG + Endif + + 'System.Language = Me.Language + +End + +Private Sub SetVer() + + If Request.Get.Exist("ver") Then + Session["ver"] = Request.Get["ver"] + Response.Redirect(Path.Path) + Quit + Endif + + If Session["ver"] Then + Me.Version = Session["ver"] + Else + Me.Version = DEFAULT_VERSION + Endif + +End + +Public Sub ThrowError(sError As String) + + 'TODO: Set rendering as buffered + 'TODO: Clear buffer if executed and print Me.Error + + CGI.Error(sError) + + ' Print Me.Error + +End + +Private Sub Debug() + + Print "
        " + Print "
        " + Print "Application.Root: " & Application.Root & "
        " + Print "Application.Host: " & Application.Host & "
        " + Print "Application.Request: " & Application.Request & "
        " + Print "Request.Path: " & Request.Path & "
        " + Print "Path.Page: " & Path.Page & "
        " + Print "Language: " & Me.Language & "

        " + + Print "Users.Current.Username: " & Users.Current.Username & "
        " + Print "Users.Current.IsAdmin: " & Users.Current.IsAdmin & "
        " + Print "Users.Current.Type: " & Users.Current.Type & "

        " + + Print "Session.Username: " & Session["username"] & "
        " + Print "Session.uid: " & Session["uid"] & "

        " + + Print "Actions.Parsed: " & Actions.Parsed & "
        " + Print "Actions.Show: " & Actions.Show & "
        " + Print "Actions.View: " & Actions.View & "
        " + Print "Actions.Edit: " & Actions.Edit & "
        " + Print "Actions.Help: " & Actions.Help & "
        " + Print "Actions.OnlineHelp: " & Actions.OnlineHelp & "
        " + Print "Actions.Image: " & Actions.Image & "
        " + Print "Path.Section: " & Path.Section & "

        " + + Print "Wget: " & Main.IsWget & "
        " + +End diff --git a/app/src/gb.wiki/.src/Models/Comments.module b/app/src/gb.wiki/.src/Models/Comments.module new file mode 100644 index 00000000..034fe40f --- /dev/null +++ b/app/src/gb.wiki/.src/Models/Comments.module @@ -0,0 +1,2 @@ +' Gambas module file + diff --git a/app/src/gb.wiki/.src/Models/Pages.module b/app/src/gb.wiki/.src/Models/Pages.module new file mode 100644 index 00000000..7b0c9722 --- /dev/null +++ b/app/src/gb.wiki/.src/Models/Pages.module @@ -0,0 +1,58 @@ +' Gambas module file + +Property Read Current As _Page +Private $oPage As _Page + +Public Sub LoadCurrent() + + If $oPage Then Return + + $oPage = Get(Path.Page) + + ' If Not $oPage Then + ' $oPage = New _Page + ' Endif + +End + +Public Function Get(sPath As String, Optional bReadOnly As Boolean = True, Optional sLang As String) As _Page + + Dim rPage As Result + + Dim oTemp As _Page + + rPage = Find(sPath, bReadOnly, sLang) + + If Not rPage Then Return + + oTemp = New _Page(rPage, bReadOnly) + + Return oTemp + +End + +Public Function Find(sPath As String, Optional bReadOnly As Boolean = True, Optional sLang As String) As Result + + Dim rPage As Result + + If Not sLang Then sLang = Main.Language + + If bReadOnly Then + rPage = DB.Find(DBScheme.TABLE_PAGES, DBScheme.PAGE_PATH & " = &1 AND " & DBScheme.PAGE_LANG & "= &2", sPath, sLang) + Else + rPage = DB.Edit(DBScheme.TABLE_PAGES, DBScheme.PAGE_PATH & " = &1 AND " & DBScheme.PAGE_LANG & "= &2", sPath, sLang) + Endif + + If rPage.Available Then + Return rPage + Endif + +End + +Private Function Current_Read() As _Page + + LoadCurrent() + + Return $oPage + +End diff --git a/app/src/gb.wiki/.src/Models/Users.module b/app/src/gb.wiki/.src/Models/Users.module new file mode 100644 index 00000000..2752cf40 --- /dev/null +++ b/app/src/gb.wiki/.src/Models/Users.module @@ -0,0 +1,163 @@ +' Gambas module file + +Public Const USER_GUEST As Integer = 0 +Public Const USER_WRITER As Integer = 1 +Public Const USER_ADMIN As Integer = 2 + +Property Read Current As _User +Private $oUser As _User + +Public Function _get(sUsername As String) As _User + + Return Get(sUsername) + +End + +Public Sub LoadCurrent() + + If $oUser Then Return + + If Not Session["username"] Then + $oUser = MakeGuest() + Else + $oUser = Get(Session["username"]) + Endif + +End + +Public Function Get(sUsername As String, Optional bReadOnly As Boolean = True) As _User + + Dim rUser As Result + + Dim oTemp As _User + + rUser = Find(sUsername, bReadOnly) + + If Not rUser Then Return + + oTemp = New _User(rUser, bReadOnly) + + Return oTemp + +End + +Public Function Find(sValue As String, Optional bReadOnly As Boolean = True, Optional bEmail As Boolean) As Result + + Dim rUser As Result + + If bReadOnly Then + rUser = DB.Find(DBScheme.TABLE_USERS, IIf(bEmail, DBScheme.USER_EMAIL, DBScheme.USER_USERNAME) & "= &1", sValue) + Else + rUser = DB.Edit(DBScheme.TABLE_USERS, IIf(bEmail, DBScheme.USER_EMAIL, DBScheme.USER_USERNAME) & "= &1", sValue) + Endif + + If rUser.Available Then + Return rUser + Endif + +End + +Public Sub Login(sUsername As String, sPassword As String) + + Dim rUser As Result + + 'If Me.Current Then Return + + rUser = DB.Find(DBScheme.TABLE_USERS, DBScheme.USER_USERNAME & "= &1 AND " & DBScheme.USER_PASSWORD & "= &2", sUsername, sPassword) + + If Not rUser.Available Then Return + + Session["uid"] = rUser[DBScheme.USER_ID] + + Session["username"] = rUser[DBScheme.USER_USERNAME] + + Session["expiration"] = DateAdd(Now, 1, gb.Day) + + $oUser = New _User(rUser) + +End + +Public Function Create(sUsername As String) As _User + + Dim rUser As Result + + Dim oTemp As _User + + If Find(sUsername) Then Return + + rUser = Main.hConn.Create(DBScheme.TABLE_USERS) + + oTemp = New _User(rUser, False) + + Return oTemp + +End + +Public Sub Delete(sUsername As String) + + Dim rUser As Result + + rUser = Find(sUsername, False) + + If Not rUser Then Return + + rUser.Delete() + +End + +Public Sub Logout() + + Session.Abandon() + +End + +' Public Function Edit(sUsername As String, sPassword As String, sEmail As String) As Integer +' +' Dim rUser As Result +' +' rUser = Main.hConn.Edit(DBScheme.TABLE_USERS, "&1 = &2", DBScheme.USER_USERNAME, sUsername) +' +' rUser[DBScheme.USER_PASSWORD] = sPassword +' rUser[DBScheme.USER_EMAIL] = sEmail +' +' rUser.Update() +' +' Return rUser[DBScheme.USER_ID] +' +' End + +Public Function List() As String[] + + Dim rUser As Result + + Dim sUsers As New String[] + + rUser = DB.Exec(Subst("SELECT &1 FROM &2 ORDER BY &1 DESC", DBScheme.USER_USERNAME, DBScheme.TABLE_USERS)) + + For Each rUser + + If rUser.Available Then sUsers.Add(rUser[DBScheme.USER_USERNAME]) + + Next + + Return sUsers + +End + +Private Function MakeGuest() As _User + + Dim oTemp As _User + + oTemp = New _User(Null, Null, True) + + Return oTemp + +End + +Private Function Current_Read() As _User + + LoadCurrent() + + Return $oUser + +End diff --git a/app/src/gb.wiki/.src/Models/_Page.class b/app/src/gb.wiki/.src/Models/_Page.class new file mode 100644 index 00000000..5f1ee68b --- /dev/null +++ b/app/src/gb.wiki/.src/Models/_Page.class @@ -0,0 +1,171 @@ +' Gambas class file + +Property Title As String +Property Language As String +Property Path As String +Property {Date} As Date +Property Content As String +Property HTML As String +Property User As String +Property Read Type As Integer + +Private $rPage As Result + +Private $bReadOnly As Boolean + +Public Sub _new(rTemp As Result, Optional bReadOnly As Boolean = True) + + $rPage = rTemp + + $bReadOnly = bReadOnly + +End + +Private Function Title_Read() As String + + If Not $rPage.Available Then Return + + Return $rPage[DBScheme.PAGE_TITLE] + +End + +Private Function Language_Read() As String + + If Not $rPage.Available Then Return + + Return $rPage[DBScheme.PAGE_LANGE] + +End + +Private Function Path_Read() As String + + If Not $rPage.Available Then Return + + Return $rPage[DBScheme.PAGE_PATH] + +End + +Private Function Date_Read() As Date + + If Not $rPage.Available Then Return + + Return $rPage[DBScheme.PAGE_DATE] + +End + +Private Function Content_Read() As String + + If Not $rPage.Available Then Return + + Return $rPage[DBScheme.PAGE_CONTENT] + +End + +Private Function HTML_Read() As String + + If Not $rPage.Available Then Return + + Return $rPage[DBScheme.PAGE_HTML] + +End + +Private Function User_Read() As String + + If Not $rPage.Available Then Return + + Return $rPage[DBScheme.PAGE_USER] + +End + +Private Function Type_Read() As Integer + +End + +Private Sub Title_Write(Value As String) + + If $bReadOnly Then IsReadonly() + + If Not $rPage.Available Then Return + + $rPage[DBScheme.PAGE_TITLE] = Value + +End + +Private Sub Language_Write(Value As String) + + If $bReadOnly Then IsReadonly() + + If Not $rPage.Available Then Return + + If Not Main.Langs.Exist(Value) Then Return + + $rPage[DBScheme.PAGE_LANG] = Value + +End + +Private Sub Path_Write(Value As String) + + If $bReadOnly Then IsReadonly() + + If Not $rPage.Available Then Return + + $rPage[DBScheme.PAGE_PATH] = Value + +End + +Private Sub Date_Write(Value As Date) + + If $bReadOnly Then IsReadonly() + + If Not $rPage.Available Then Return + + $rPage[DBScheme.PAGE_DATE] = Value + +End + +Private Sub Content_Write(Value As String) + + If $bReadOnly Then IsReadonly() + + If Not $rPage.Available Then Return + + $rPage[DBScheme.PAGE_CONTENT] = Value + +End + +Private Sub HTML_Write(Value As String) + + If $bReadOnly Then IsReadonly() + + If Not $rPage.Available Then Return + + $rPage[DBScheme.PAGE_HTML] = Value + +End + +Private Sub User_Write(Value As String) + + If $bReadOnly Then IsReadonly() + + If Not $rPage.Available Then Return + + $rPage[DBScheme.PAGE_USER] = Value + +End + +Public Sub Update() + + $rPage.Update() + +End + +Private Sub IsReadonly() + + Dim sText As String + + sText = "Trying to modify a readonly page instance!

        " + sText &= System.Backtrace.Join("
        ") + + Main.ThrowError(sText) + +End diff --git a/app/src/gb.wiki/.src/Models/_User.class b/app/src/gb.wiki/.src/Models/_User.class new file mode 100644 index 00000000..708eee7f --- /dev/null +++ b/app/src/gb.wiki/.src/Models/_User.class @@ -0,0 +1,162 @@ +' Gambas class file + +Property Read IsAdmin As Boolean +Property Read IsGuest As Boolean +Property Username As String +Property Password As String +Property Email As String +Property Type As Integer + +Private $rUser As Result +Private $bReadOnly As Boolean + +Private $bIsGuest As Boolean + +Public Sub _new(Optional rTemp As Result, Optional bReadOnly As Boolean = True, Optional bIsGuest As Boolean = False) + + If rTemp Then $rUser = rTemp + + $bReadOnly = bReadOnly + + $bIsGuest = bIsGuest + +End + +Private Function Type_Read() As Integer + + If $bIsGuest Then Return Users.USER_GUEST + + If Not $rUser Then Return + + If Not $rUser.Available Then Return + + Return $rUser[DBScheme.USER_TYPE] + +End + +Private Sub Type_Write(Value As Integer) + + If $bReadOnly Or $bIsGuest Then IsReadonly() + + If Value < 1 Or Value > 3 Then Return + + If Not $rUser Then Return + + If Not $rUser.Available Then Return + + $rUser[DBScheme.USER_TYPE] = Value + +End + +Private Function Username_Read() As String + + 'If $bIsGuest Then Return "guest" + + If Not $rUser Then Return + + If Not $rUser.Available Then Return + + Return $rUser[DBScheme.USER_USERNAME] + +End + +Private Sub Username_Write(Value As String) + + If $bReadOnly Or $bIsGuest Then IsReadonly() + + If Not $rUser Then Return + + If Not $rUser.Available Then Return + + If Not Users.Find(Value) Then + $rUser[DBScheme.USER_USERNAME] = Value + Endif + +End + +Private Function Password_Read() As String + + If Not $rUser Then Return + + If Not $rUser.Available Or $bIsGuest Then Return + + Return $rUser[DBScheme.USER_PASSWORD] + +End + +Private Sub Password_Write(Value As String) + + If $bReadOnly Or $bIsGuest Then IsReadonly() + + If Not $rUser Then Return + + If Not $rUser.Available Then Return + + $rUser[DBScheme.USER_PASSWORD] = Value + +End + +Private Function Email_Read() As String + + If Not $rUser Then Return + + If Not $rUser.Available Or $bIsGuest Then Return + + Return $rUser[DBScheme.USER_EMAIL] + +End + +Private Sub Email_Write(Value As String) + + If $bReadOnly Or $bIsGuest Then IsReadonly() + + If Not $rUser Then Return + + If Not $rUser.Available Then Return + + If Not Users.Find(Value,, True) Then + $rUser[DBScheme.USER_EMAIL] = Value + Endif + +End + +Private Function IsAdmin_Read() As Boolean + + Return Me.Type = Users.USER_ADMIN + +End + +Public Sub Reload() + + If $bIsGuest Then Return + + $rUser = Users.Find(Me.Username, $bReadOnly) + +End + +Public Sub Update() + + If $bReadOnly Or $bIsGuest Then IsReadonly() + + If Not $rUser Then Return + + $rUser.Update() + +End + +Private Function IsGuest_Read() As Boolean + + Return Me.Type = Users.USER_GUEST + +End + +Private Sub IsReadonly() + + Dim sText As String + + sText = "Trying to modify a readonly or guest user instance!

        " + sText &= System.Backtrace.Join("
        ") + + Main.ThrowError(sText) + +End diff --git a/app/src/gb.wiki/.src/Parser.module b/app/src/gb.wiki/.src/Parser.module new file mode 100644 index 00000000..6ac58c84 --- /dev/null +++ b/app/src/gb.wiki/.src/Parser.module @@ -0,0 +1,1223 @@ +' Gambas module file + +Private Const LETTER_DIGIT As String = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" + +Private $sVersion As String[] +Private $iIgnore As Integer + +'Private $sLangVerSuff As String + +Private $sPath As String + +Private $bExample As Boolean + +Private $cGotSpecial As Collection + +'Private $hComp As CComponent +'Private $hClass As CClassInfo +'Private $hSym As CSymbolInfo + +Private $sSection As String +Private $aSection As String[] +Private $bVerbatim As Boolean +Private $bCode As Boolean +Private $iNoWiki As Integer +Private $sRes As String +Private $sList As String +Private $iPos As Integer +Private $bWhite As Boolean + +Private $cCompRedirect As Collection +Private $bSyntax As Boolean +Private $sTitle As String +Private $iNoEncode As Integer + +Private $sOnlyVersion As String + +Private Sub GetOnlyIn(sVer As String) As String + + Return "
        " & Subst(("Only in &1 version"), Html(sVer)) & "
        \n" + +End + +Private Sub UCaseTitle(sTitle As String) As String + + Dim iInd As Integer + Dim sRes As String + Dim sCar As String + Dim bLastLetter As Boolean + + If String.UCase(String.Left(sTitle)) = String.Left(sTitle) Then Return sTitle + + If Main.Language <> "en" Then Return String.UCase(String.Left(sTitle)) & String.Mid$(sTitle, 2) + + For iInd = 1 To String.Len(sTitle) + + sCar = String.Mid$(sTitle, iInd, 1) + If String.UCase(sCar) <> String.LCase(sCar) Then + If Not bLastLetter Then + sCar = String.UCase(sCar) + Endif + bLastLetter = True + Else + If sCar = "(" Then + bLastLetter = True + Else + bLastLetter = False + Endif + Endif + sRes &= sCar + + Next + + Return sRes + +End + +Private Function GetRealPath(sPath As String) As String + + Dim rPage As Result + Dim iInd As Integer + + For iInd = 1 To 10 + + rPage = DB.Find("page", "sPath = &1 AND sLang = &2", sPath, Main.DEFAULT_LANG) + + If rPage.Available And If Left$(rPage!sTitle) = "@" Then + sPath = GetAbsolutePath(sPath, Mid$(rPage!sTitle, 2)) + Else + Break + Endif + + Next + + Return sPath + +End + +Private Function GetAbsolutePath(sRoot As String, sPath As String) As String + + Dim sElt As String + Dim sRes As String + + If Left(sPath, 2) <> "./" And Left(sPath, 3) <> "../" Then + If Left(sPath) <> "/" Then sPath = "/" & sPath + Return sPath + Endif + + sRes = sRoot + If Right(sRes) = "/" And Len(sRes) > 1 Then sRes = Left(sRes, -1) + + For Each sElt In Split(sPath, "/") + If sElt = "." Then Continue + If sElt = ".." Then + 'IF sRes = sRoot THEN CONTINUE + sRes = File.Dir(sRes) + Continue + Endif + sRes &/= sElt + Next + + Return sRes + +End + +Private Sub EncodeLink(sLink As String) As String + + Return Replace$(sLink, "&", "&") + +End + +Private Sub GetLinkClass(sClass As String, bLTR As Boolean, sTitle As String) As String + + If System.RightToLeft And If Not bLTR And If IsAscii(sTitle) Then + sClass &= "lang=\"en\" " + bLTR = True + Endif + If bLTR Then sClass &= "dir=\"ltr\" " + Return sClass + +End + +Private Function GetLink(sPath As String, Optional sMyTitle As String, Optional bNoImage As Boolean, Optional sClass As String, Optional bLTR As Boolean) As String + + Dim sTitle As String + Dim sRelPath As String + Dim sSuff As String + Dim iPos As Integer + Dim sMoreSuff As String + + If sClass Then sClass = "class=\"" & sClass & "\" " + + If sPath Like "http://*" Or If sPath Like "https://*" Or If sPath Like "mailto:*" Then + + If Not sMyTitle Then sMyTitle = sPath + Return "
        " & Html$(sMyTitle) & "" + + Else + + iPos = RInStr(sPath, "?") + If iPos Then + sMoreSuff = Mid$(sPath, iPos + 1) + sPath = Left(sPath, iPos - 1) + Endif + + If sPath = "/" Then + Else + If sPath Like (Replace($sPath, "[", "[[]") &/ "*") Then + sRelPath = "." &/ Mid$(sPath, Len($sPath) + 1) + Else + sRelPath = sPath + Endif + + sPath = LCase(GetAbsolutePath(GetRealPath($sPath), sRelPath)) + Endif + + sTitle = GetTitle(sPath) + ' If Not sTitle Then + ' If sPath Like "/comp/gb.qt4*/*/*" Then + ' sPath2 = Replace(sPath, "/gb.qt4", "/gb.qt") + ' sTitle2 = GetTitle(sPath2) + ' If sTitle2 Then + ' sPath = sPath2 + ' sTitle = sTitle2 + ' Endif + ' Endif + ' Endif + + If sMyTitle <> ("Cancel") Then + Else + sTitle = sMyTitle + Endif + + 'sSuff = AddParam($sLangSuff, sMoreSuff) + 'If IsComponentPath(sPath) Then + + 'If InStr("?&", Left(Right$(sMoreSuff, 3))) And If Left$(Right$(sMoreSuff, 2)) = "v" And If IsDigit(Right$(sMoreSuff)) Then + If Left(Right$(sMoreSuff, 2)) = "v" And If IsDigit(Right$(sMoreSuff)) Then + Else + 'If $sVersion = "3.0" Then sSuff = AddParam(sSuff, "v3") + Endif + 'Endif + + If sTitle Then + + If Left(File.Name(sPath)) = ":" And Not bNoImage Then + + If Actions.NoImage Then Return "" + + If sMyTitle Then sTitle = sMyTitle + + sMoreSuff = "" + iPos = InStr(sTitle, "|") + If iPos Then + sMoreSuff = Mid$(sTitle, iPos + 1) + sTitle = Left(sTitle, iPos - 1) + If sMoreSuff = "<" Then + sMoreSuff = " align=\"left\"" + Else If sMoreSuff = ">" Then + sMoreSuff = " align=\"right\"" + Else + sMoreSuff = " class=\"" & sMoreSuff & "\"" + Endif + Endif + + Return "\""" + + Else + + If sMyTitle Then sTitle = sMyTitle + + Return "" & Html(sTitle) & "" + + Endif + + Else + + If Main.IsWget Then + + If sMyTitle Then + Return "" & Html(sMyTitle) & "" + Else + Return "" & Html(sRelPath) & "" + Endif + + Else + + If sMyTitle Then + Return "" & Html(sMyTitle) & "" + Else + Return "" & Html(sRelPath) & "" + Endif + + Endif + + Endif + + Endif + +End + +Private Sub AddRedirect(sSrc As String, sDest As String) + + If Not $cCompRedirect Then $cCompRedirect = New Collection + $cCompRedirect[sSrc] = sDest + +End + +Private Function AddIndexEntry(aPath As String[], iInd As Integer) As String + + Dim sRes As String + Dim aSplit As String[] + Dim sPath As String + Dim sTitle As String + Dim sDisplay As String + Dim sOldTitle As String + + aSplit = Split(aPath[iInd], "\n") + sTitle = aSplit[0] + sDisplay = aSplit[1] + sPath = aSplit[2] + If iInd Then + aSplit = Split(aPath[iInd - 1], "\n") + sOldTitle = aSplit[0] + Endif + + If String.UCase(String.Left(sTitle)) <> String.UCase(String.Left(sOldTitle)) Then + If System.RightToLeft Then + sRes = "" & String.UCase(String.Left(sTitle)) & "\n" + Else + sRes = "\n" + Endif + + sRes &= "" & GetLink(sPath, UCaseTitle(sDisplay), True, "arrow") & "\n" + Return sRes + +End + +Private Function SubstitutePath(sPath As String) As String + + If Actions.OnlineHelp Then + + If sPath Like "/comp/gb.qt4*" Then + If sPath = $sPath Then AddRedirect("/comp/gb.qt", "/comp/gb.qt4") + sPath = Replace(sPath, "/comp/gb.qt4", "/comp/gb.qt") + Else If sPath Like "/comp/gb.gtk*" Then + If sPath = $sPath Then AddRedirect("/comp/gb.qt4", "/comp/gb.gtk") + sPath = Replace(sPath, "/comp/gb.gtk", "/comp/gb.qt4") + Else If sPath Like "/comp/gb.gui*" Then + If sPath = $sPath Then AddRedirect("/comp/gb.qt4", "/comp/gb.gui") + sPath = Replace(sPath, "/comp/gb.gui", "/comp/gb.qt4") + Endif + + Endif + + Return sPath + +End + +Private Function GetTitle(sPath As String, Optional bVersion As Boolean) As String + + Dim rPage As Result + Dim sNewPath As String + Dim sTitle As String + Dim iPos As Integer + Dim sVer As String + Dim aVer As String[] + + If sPath Not Begins "/" Then sPath = "/" & sPath + + 'Print System.Backtrace.Join("\n") + + rPage = Pages.Find(sPath) + If rPage.Available Then + 'IF sPath LIKE "/comp/*/*/*" THEN + ' RETURN GetTitle(File.Dir(sPath)) & "." & rPage!sTitle + 'ELSE + sTitle = rPage!sTitle + iPos = RInStr(sTitle, "#") + If iPos > 1 Then + sVer = Mid$(sTitle, iPos + 1) + sTitle = Left(sTitle, iPos - 1) + If bVersion Then + aVer = Split(sVer, ",") + If aVer.Find($sVersion) < 0 And If aVer.Find(Left($sVersion)) < 0 Then + sTitle = "" + Endif + Endif + Endif + Return sTitle + Else + sNewPath = SubstitutePath(sPath) + If sNewPath <> sPath Then Return GetTitle(sNewPath) + 'Print "
        GetTitle: " & $sPath & " " & sPath & " ?
        " + 'ENDIF + Endif + +End + +Private Function GetIndex2(sRoot As String) As String + + Dim rPage As Result + Dim sRes As String + Dim aPath As New String[] + Dim iInd As Integer + Dim iInd2 As Integer + Dim sPath As String + Dim sTitle As String + Dim sPrefix As String + Dim aArg As String[] + Dim sDisplay As String + Dim bKeepPrefix As Boolean + + If Not sRoot Then Error.Raise("@index needs an argument") + + aArg = Split(sRoot, " ", Chr$(34)) + sRoot = aArg[0] + If aArg.Count >= 2 Then + sPrefix = aArg[1] + If Left(sPrefix) = "(" And If Right(sPrefix) = ")" Then + sPrefix = Mid$(sPrefix, 2, -1) + bKeepPrefix = True + Endif + Endif + + rPage = DB.Find("page", "sLang = &1 AND sPath LIKE &2", Main.DEFAULT_LANG, sRoot &/ "%") ' $Lang + For Each rPage + If InStr(Mid$(rPage!sPath, Len(sRoot) + 2), "/") Then Continue + 'If IsCommentPath(rPage!sPath) Then Continue + 'FIXME: + sPath = rPage!sPath + If Left(rPage!sTitle) = "@" Then + If sPath Like (Replace(sRoot, "[", "[[]") &/ "*") Then Continue + Endif + + sTitle = GetTitle(sPath, True) + If Not sTitle Then Continue + + sDisplay = sTitle + + If sPrefix Then + If sTitle Like (Replace(sPrefix, "[", "[[]") & "*") Then + sTitle = LTrim(Mid$(sTitle, Len(sPrefix) + 1)) + If Not bKeepPrefix Then sDisplay = sTitle + Endif + Endif + + aPath.Add(sTitle & "\n" & sDisplay & "\n" & rPage!sPath) + Next + + aPath.Sort(gb.IgnoreCase) + + sRes = "\n" + + For iInd = 0 To aPath.Count \ 4 + + sRes &= "\n" + + iInd2 = iInd + While iInd2 < aPath.Count + sRes &= AddIndexEntry(aPath, iInd2) + iInd2 += 1 + aPath.Count \ 4 + Wend + + sRes &= "\n" + + Next + + sRes &= "
        \n" + + Return sRes + +End + +Private Sub EnterSection(sSection As String) + + Dim sParam As String + Dim iPos As Integer + + 'IF $sSection <> "example" AND IF $sSection <> "syntax" AND IF $sSection <> "title" THEN + ' AddPara + ' ENDIF + + If sSection Then + iPos = InStr(sSection, " ") + If iPos Then + sParam = Mid$(sSection, iPos + 1) + sSection = Left$(sSection, iPos - 1) + Endif + Endif + + sSection = LCase(sSection) + + FinishList + + 'LeaveSection() + $aSection.Push($sSection) + $sSection = sSection + $bVerbatim = False + $sList = "" + + If $iIgnore > 0 And If $sSection <> "only" Then Return + + Select Case $sSection + + Case "syntax" + If sParam <> "no-title" Then + If $bSyntax Then $sRes &= "
        " & $sTitle & "
        " + Endif + sParam = ("Syntax") + '$sRes &= "
        " & sParam & "
        \n" + $sRes &= "
        "
        +      $bSyntax = True
        +
        +    Case "example"
        +      If Not $bExample Then
        +        $bExample = True
        +        $sRes &= "

        " & ("Example") & "

        \n" + Endif + $sRes &= "
        " + $bVerbatim = True + ' IF NOT sParam THEN sParam = ("Example") + ' $sRes &= "
        " & sParam & "
        \n" + ' $sRes &= "
        "
        +      $iNoWiki = 1
        +
        +    Case "code"
        +      $sRes &= "
        " + $bVerbatim = True + $iNoWiki = 1 + $bCode = True + + Case "seealso" + '$sRes &= "

        \n" + '$sRes &= "
        " & ("See also") & "
        \n" + $sRes &= "
        \n" + $sRes &= "

        " & ("See also") & "

        \n" + $iPos = Len($sRes) + + Case "error" + $sRes &= "

        " & ("Errors") & "

        \n" + '$sRes &= "
        " & ("Errors") & "
        \n" + $sRes &= "\n" + $sRes &= "
        " & ("Message") & "" & ("Description") & "
        \n" + $bWhite = True + + Case "warning", "info", "vb", "critical", "tip" + $sRes &= "
        \n" + '$sRes &= "
        " & Main.GetImage($sSection) & "\n" + + Case "title" + If Not sParam Then sParam = "gray" + $sRes &= "
        " + + Case "box" + If sParam Then $sRes &= "
        " & Html(sParam) & "
        " + $sRes &= "
        \n" + + Case "only" + ' $cGotSpecial["only"] = True + If sParam <> $sVersion Then + 'If IsComponentPath($sPath) Then + ' $sRes &= "
        " + 'Else + ' $sRes &= "" + ' '$sRes &= "" + ' $sRes &= "\n" + $sRes &= "
         " & sParam & "  
        " + ' $sRes &= "
         " & sParam & " 
        " + 'Endif + $sOnlyVersion = $sVersion + $sVersion = sParam + 'InitVersion($sVersion) + Inc $iIgnore + Endif + + Case "html" + Inc $iNoEncode + + End Select + +End + +Private Sub FinishList() + + If $sList Then + $sRes = $sRes & $sList & "\n" + $sList = "" + Endif + +End + +Private Sub RemovePara() + + If Right($sRes, 5) = "

        \n" Then + $sRes = Left$($sRes, -5) & "\n" + Endif + +End + +Private Sub LeaveSection() + + Dim sTmp As String + + FinishList + RemovePara + + If $iIgnore = 0 Or If $sSection = "only" Then + + Select Case $sSection + + Case "syntax" + $sRes = RTrim($sRes) & "

        \n" + + Case "example" + $sRes = RTrim($sRes) & "\n" + $bVerbatim = False + $iNoWiki = 0 + + Case "code" + $sRes = RTrim($sRes) & "\n" + $bVerbatim = False + $iNoWiki = 0 + $bCode = False + + Case "error" + $sRes &= "

        \n" + + Case "seealso" + sTmp = Mid$($sRes, $iPos + 1, -4) + sTmp = Replace(sTmp, "", ", ") + sTmp = Replace(sTmp, ",,", ",") + sTmp = Replace(sTmp, ", ,", ",") + $sRes = Left$($sRes, $iPos) & sTmp & Right$($sRes, 4) + '$sRes &= "
        \n" + $sRes &= "
        \n" + + Case "warning", "info", "vb", "critical", "tip" + $sRes &= "
        \n" + + Case "title" + $sRes &= "" ' no '\n' to prevent an '

        ' to be added + + Case "box" + $sRes &= "\n" + + Case "only" + If $sOnlyVersion Then + 'If IsComponentPath($sPath) Then + ' $sRes &= "" + 'Else + ' $sRes &= "

        " + 'Endif + $sVersion = $sOnlyVersion + 'InitVersion($sVersion) + $sOnlyVersion = "" + Dec $iIgnore + Endif + + Case "html" + Dec $iNoEncode + + End Select + + Endif + + Try $sSection = $aSection.Pop() + +End + +Public Function Encode(sText As String) As String + + Dim iPos As Integer + Dim iPos2 As Integer + Dim iPos3 As Integer + Dim sCar, sPrev, sNext As String + Dim bBold As Boolean + Dim bItalic As Boolean + Dim bUnderline As Boolean + Dim bTT As Boolean + Dim sTitle As String + Dim sLink As String + Dim sLinkTitle As String + Dim bLinkTitle As String + Dim bLastVoid As Boolean + Dim bHeader As Boolean + Dim sArg As String + 'Dim hSym As CSymbolInfo + Dim iLevel As Integer + Dim iLevelLen As Integer + Dim bList As Boolean + Dim sStr As String + Dim iInTable As Integer + + Dim bTitleIndex As Boolean + Dim bUseThisTitleForIndex As Boolean + Dim sTitleIndex As String + Dim sTitleIndexStamp As String + Dim iTitleIndex As Integer + Dim iTitleIndexStart As Integer + Dim iLastTitleLevel As Integer + Dim iTitleLevel As Integer + Dim bBegin, bEnd As Boolean + + Actions.Parsed = True + + $sRes = "" + $aSection = New String[] + EnterSection("") + + For Each sStr In Split(RTrim(sText), "\n") + + If Left$(sStr) = "{" And If Len(sStr) >= 2 Then + + EnterSection(Trim(Mid$(sStr, 2))) + Continue + + Endif + + If RTrim(sStr) = "}" Then + + LeaveSection() + Continue + + Endif + + If $bVerbatim Then + + If sStr = "==" Then + $bVerbatim = False + $sRes = $sRes & "

        \n" + Else If sStr = "--" Then + $sRes = $sRes & "
        " + Else + If Left(sStr, 4) = "
        " Then + $sRes &= "
        " + sStr = Mid$(sStr, 5) + Endif + If Left(sStr) = "\\" Then sStr = Mid$(sStr, 2) + If $sSection = "example" Or If $sSection = "code" Then + sStr = Html$(sStr) + iPos = Len(sStr) - Len(LTrim(sStr)) + If iPos > 0 Then + sStr = String$(iPos, " ") & Mid$(sStr, iPos + 1) + Endif + sStr = Replace(sStr, " ", "  ") + $sRes &= sStr & "
        \n" + Else + $sRes &= sStr & "\n" + Endif + Endif + Continue + + Endif + + If $iIgnore Then Continue + + If $iNoEncode Then + $sRes &= sStr & "\n" + Continue + Endif + + If $bCode Then + '$sRes &= HighlightCode(sStr) & "\n" + Endif + + If $iNoWiki = 0 Then + + sStr = RTrim(sStr) + sTitle = "" + + If Not sStr Then + ' IF bLastVoid THEN + ' $sRes = $sRes & "
        \n" + ' ELSE + ' bLastVoid = TRUE + ' $sRes = $sRes & "\n" + ' ENDIF + If Right($sRes, 5) <> "

        \n" Then + $sRes = $sRes & "

        \n" + Else + $sRes = $sRes & "\n" + Endif + Continue + Endif + + While Left(sStr) = " " + sStr = Mid$(sStr, 2) + $sRes &= " " + Wend + + bLastVoid = False + bList = False + + iPos = InStr(sStr, " ") + + If iPos >= 2 Then + If Left$(sStr, iPos - 1) = String(iPos - 1, "*") Then + + iLevel = iPos - 1 + iLevelLen = iLevel * 6 + If Len($sList) > iLevelLen Then + sCar = Mid$($sList, 1 + iLevelLen) + $sList = Left($sList, iLevelLen) + Else If Len($sList) < iLevelLen Then + sCar = String$((iLevelLen - Len($sList)) \ 6, "

          \n") + $sList &= String$((iLevelLen - Len($sList)) \ 6, "
        \n") + Else + sCar = "" + Endif + + $sRes &= sCar & "
      • " + sStr = Trim(Mid$(sStr, iPos + 1)) + bList = True + + Else If Left$(sStr, iPos - 1) = String(iPos - 1, "#") Then + + iLevel = iPos - 1 + iLevelLen = iLevel * 6 + If Len($sList) > iLevelLen Then + sCar = Mid$($sList, 1 + iLevelLen) + $sList = Left($sList, iLevelLen) + Else If Len($sList) < iLevelLen Then + sCar = String$((iLevelLen - Len($sList)) \ 6, "
          \n") + $sList &= String$((iLevelLen - Len($sList)) \ 6, "
        \n") + Else + sCar = "" + Endif + + $sRes &= sCar & "
      • " + sStr = Trim(Mid$(sStr, iPos + 1)) + bList = True + + Endif + + Endif + + If Not bList Then FinishList + + If Left$(sStr) = "@" Then + + iPos = InStr(sStr, " ") + If iPos Then + sArg = Trim(Mid$(sStr, iPos + 1)) + sStr = Left$(sStr, iPos - 1) + Endif + + sStr = Mid$(sStr, 2) + + Try $cGotSpecial[sStr] = True + + Select Case sStr + + Case "classes" + '$sRes &= GetClasses() + Continue + + Case "no-classes" + Try $cGotSpecial["classes"] = False + Continue + + Case "symbols" + '$sRes &= GetSymbols() + Continue + + Case "components" + '$sRes &= GetComponents() + Continue + + Case "redirect" + iPos = InStr(sArg, " ") + 'If iPos Then AddRedirect(Trim(Left(sArg, iPos - 1)), Trim(Mid$(sArg, iPos + 1))) + Continue + + ' @index /path prefix + Case "index" + $sRes &= GetIndex2(sArg) + Continue + + Case "title-index" + sTitleIndexStamp = "{~" & Format(Int(Rnd(1000000)), "000000") & "~}" + $sRes &= sTitleIndexStamp + bTitleIndex = True + Continue + + ' @list /path +-number + Case "list" + '$sRes = $sRes & GetList(sArg) + Continue + + ' @header /path +-number + Case "header" + '$sRes = $sRes & GetList(sArg) + Continue + + Case "syntax" + If sArg Then + 'hSym = $hClass.Symbols[Replace(sArg, ".", ":")] + 'If hSym Then EnterSection("syntax no-title") + Else + 'hSym = $hSym + 'If hSym Then EnterSection("syntax") + Endif + 'If hSym Then + '$sRes &= GetSymbolSyntax(hSym) + 'LeaveSection() + 'Endif + Continue + + Case "version" + '$sRes &= GetGambasVersion() + Continue + + Case "only-in", "only" + $sRes &= GetOnlyIn(sArg) + Continue + + Case "since" + '$sRes &= GetSince(sArg) + Continue + + Case "changes" + '$sRes &= GetLastChanges() + Continue + + Case "translate", "todo" + '$sRes &= GetTranslate() + Continue + + Case "class-stat" + '$sRes &= GetClassStat(sArg) + Continue + + Case "no-autolink" + Continue + + Case "include" + '$sRes &= GetInclude(sArg) + Continue + + Case Else + $sRes &= "
        " & sStr & " ?
        " + Continue + + End Select + + Else If Left$(sStr) = "+" Then + + $bExample = False + iPos = 1 + While Mid$(sStr, iPos, 1) = "+" + Inc iPos + Wend + sStr = LTrim(Mid$(sStr, iPos)) + If Len(sStr) Then + 'DEC iPos + If bTitleIndex And If iInTable = 0 Then + Inc iTitleIndex + iTitleLevel = iPos - 1 + $sRes &= "" + bUseThisTitleForIndex = True + Else + bUseThisTitleForIndex = False + Endif + $sRes &= "" + iTitleIndexStart = Len($sRes) + sTitle = "" + Endif + + Endif + + If Left(sStr, 2) = "[[" Then + + $sRes = $sRes & "\n" + bHeader = True + $sRes = $sRes & "\n" + bHeader = False + Else + $sRes = $sRes & "\n" + Endif + $sRes = $sRes & "
        \n" + $bWhite = True + Inc iInTable + Continue + + Else If Len(sStr) <= 2 Then + + If sStr = "]]" Then + If bHeader Then + $sRes = $sRes & "
        \n" + Dec iInTable + Continue + Else If sStr = "[]" Then + bHeader = False + Continue + Else If sStr = "--" Then + $sRes = $sRes & "
        \n" + Continue + Else If sStr = "==" Then + $bVerbatim = True + $sRes = $sRes & "
        "
        +          Continue
        +          '       ELSE IF sStr = "[" THEN
        +          '         IF bHeader THEN
        +          '           $sRes = $sRes & "\n"
        +          '         ELSE
        +          '           $sRes = $sRes & "\n"
        +          '         ENDIF
        +          '         CONTINUE
        +          '       ELSE IF sStr = "]" THEN
        +          '         IF bHeader THEN
        +          '           $sRes = $sRes & "\n"
        +          '           bHeader = FALSE
        +          '         ELSE
        +          '           $sRes = $sRes & "\n"
        +          '         ENDIF
        +          '         CONTINUE
        +        Else If sStr = "][" Then
        +          $bWhite = Not $bWhite
        +          If bHeader Then
        +            If Right($sRes, 9) = "\n" Then
        +              If $bWhite Then
        +                $sRes = Left$($sRes, -9) & "\n"
        +              Else
        +                $sRes = Left$($sRes, -9) & "\n"
        +              Endif
        +            Else
        +              If $bWhite Then
        +                $sRes = $sRes & "\n\n"
        +              Else
        +                $sRes = $sRes & "\n\n"
        +              Endif
        +            Endif
        +            bHeader = False
        +          Else
        +            If $bWhite Then
        +              $sRes = $sRes & "\n\n"
        +            Else
        +              $sRes = $sRes & "\n\n"
        +            Endif
        +          Endif
        +          Continue
        +        Else If sStr = "-" Then
        +          If bHeader Then
        +            $sRes = $sRes & "\n"
        +          Else
        +            $sRes = $sRes & "\n"
        +          Endif
        +          Continue
        +          'ELSE IF sStr = "_" THEN
        +          '  $sRes = $sRes & "

        " + ' CONTINUE + Endif + + Endif + Endif + + For iPos = 1 To Len(sStr) + + sCar = Mid$(sStr, iPos, 1) + + If sCar = "\\" Then + Inc iPos + sCar = Mid$(sStr, iPos, 1) + If sCar = "<" Then + sCar = "<" + Else If sCar = ">" Then + sCar = ">" + Else If sCar = "&" Then + sCar = "&" + Endif + Else If sCar = "\"" Then + sCar = """ + Else If sCar = "<" Then + iPos2 = InStr(sStr, ">", iPos) + If iPos2 = 0 Then iPos2 = Len(sStr) + 1 + sCar = Mid$(sStr, iPos, iPos2 - iPos + 1) + iPos = iPos2 + If sCar Like " 0 Then + + If iPos > 1 Then + sPrev = Mid$(sStr, iPos - 1, 1) + Else + sPrev = "" + Endif + + If iPos < Len(sStr) Then + sNext = Mid$(sStr, iPos + 1, 1) + Else + sNext = "" + Endif + + If InStr(LETTER_DIGIT, sPrev) And If InStr(LETTER_DIGIT, sNext) Then Goto NEXT_CAR + If Asc(sPrev) <= 32 And If Asc(sNext) <= 32 Then Goto NEXT_CAR + + ' bBegin = False + ' bEnd = False + ' + ' If Asc(sPrev) <= 32 Or If InStr("('\">", sPrev) Then bBegin = True + ' If Asc(sNext) <= 32 Or If InStr(".;:,)!?'\"<", sNext) Then bEnd = True + ' + ' If Not bEnd And If Not bBegin + ' If InStr("*/_=", sPrev) Then bBegin = True + ' If InStr("*/_=", sNext) Then bEnd = True + ' Endif + ' + ' If bBegin And bEnd And If Asc(sPrev) <= 32 And If Asc(sNext) <= 32 Then Goto NEXT_CAR + + bBegin = Asc(sNext) > 32 + bEnd = Asc(sPrev) > 32 + + If sCar = "*" Then + If Not bBold And If bBegin Then + bBold = True + sCar = "" + Else If bBold And If bEnd Then + bBold = False + sCar = "" + Endif + Else If sCar = "/" Then + If Not bItalic And If bBegin Then + bItalic = True + sCar = "" + Else If bItalic And If bEnd Then + bItalic = False + sCar = "" + Endif + Else If sCar = "_" Then + If iPos = Len(sStr) And If Not bUnderline Then + sCar = "
        " + Else If Not bUnderLine And If bBegin Then + bUnderline = True + sCar = "" + Else If bUnderLine And If bEnd Then + bUnderline = False + sCar = "" + Endif + Else If sCar = "=" Then + If Not bTT And If bBegin Then + bTT = True + sCar = "" + Else If bTT And If bEnd Then + bTT = False + sCar = "" + Endif + Endif + + Else If sCar = "[" Then + + If Mid$(sStr, iPos + 1, 1) <> " " Then + + sLink = "" + sLinkTitle = "" + bLinkTitle = False + iPos2 = iPos + 1 + + While iPos2 <= Len(sStr) + sCar = Mid$(sStr, iPos2, 1) + If sCar = "]" Then Break + If sCar = "\\" Then + Inc iPos2 + sCar = Mid$(sStr, iPos2, 1) + Endif + sLink &= sCar + Inc iPos2 + Wend + + iPos3 = InStr(sLink, "|") + If iPos3 Then + sLinkTitle = Mid$(sLink, iPos3 + 1) + sLink = Left$(sLink, iPos3 - 1) + Endif + + sCar = "[" + + If iPos2 <= Len(sStr) And If Len(Trim(sLink)) Then + + If sLink Begins "../" Then + sLink = File.Dir(Path.Page) &/ Mid(sLink, 4) + Endif + + sCar = GetLink(Trim(sLink), Trim(sLinkTitle)) + iPos = iPos2 + Endif + + Endif + + Else If sCar = "%" Then + If Mid$(sStr, iPos + 1, 1) <> " " Then + iPos2 = InStr(sStr, "%", iPos + 1) + If iPos2 Then + sLink = Mid$(sStr, iPos + 1, iPos2 - iPos - 1) + sCar = Main.GetImage(sLink) + iPos = iPos2 + Endif + Endif + 'ELSE IF Asc(sCar) > 127 THEN + 'sCar = "&#" & Asc(sCar) & ";" + + Else If sCar = "&" Then + If Not IsLetter(Mid$(sStr, iPos + 1, 1)) Then + sCar = "&" + Endif + Endif + + NEXT_CAR: + + $sRes &= sCar + + Next + + If bList Then $sRes &= "
      • " + + If sTitle Then + If bUseThisTitleForIndex Then + While iTitleLevel > iLastTitleLevel + sTitleIndex &= "
          \n" + Inc iLastTitleLevel + Wend + While iTitleLevel < iLastTitleLevel + sTitleIndex &= "
        \n" + Dec iLastTitleLevel + Wend + sTitleIndex &= "
      • " & Mid$($sRes, iTitleIndexStart + 1, Len($sRes) - iTitleIndexStart) & "
      • \n" + Endif + $sRes &= sTitle + Endif + $sRes &= "\n" + + Next + +BREAK_ALL: + + While $aSection.Count + LeaveSection() + Wend + + If bTitleIndex Then + sTitleIndex = "
        " & ("Contents") & "
        \n" & sTitleIndex & "
        " + $sRes = Replace($sRes, sTitleIndexStamp, sTitleIndex) + Endif + + While Right$($sRes) = "\n" + $sRes = Left$($sRes, -1) + Wend + + If Not $sRes And If $cGotSpecial.Exist("only") Then + Return Encode("{warning\n" & Subst(("This documentation page does not exist in version &1."), $sVersion) & "\n}\n") + Endif + + Return $sRes + +End diff --git a/app/src/gb.wiki/.src/Path.module b/app/src/gb.wiki/.src/Path.module new file mode 100644 index 00000000..00c4911b --- /dev/null +++ b/app/src/gb.wiki/.src/Path.module @@ -0,0 +1,120 @@ +' Gambas module file + +Property Read Section As Integer +Property Read Page As String +Property Read Components As String[] +Property Read Path As String + +Public Enum PATH_404, PATH_MAIN, PATH_ADMIN, PATH_WIKI, PATH_IMAGE, PATH_LOGIN, PATH_LOGOUT, PATH_ACCOUNT + +Public Function Build(Optional sPath As String[]) As String + + Dim sUrl As String + + 'sUrl = "/help" + + ' If sPath Then sUrl = sUrl &/ sPath.Join("/") + + sUrl = sPath.Join("/") + + If CGI["QUERY_STRING"] Then sUrl &= "?" & CGI["QUERY_STRING"] + + Return sUrl + +End + +Public Function Static(sPath As String) As String + + 'sPath = "static/" &/ sPath + + 'If Exist(sPath) Then Return Application.Root &/ sPath + ' + Return "http://gambasdoc.org/" & sPath + +End + +Private Function Components_Read() As String[] + + Dim sComponents As String[] + + Dim sPath As String + + sPath = Request.Path + + If Left(sPath) = "/" Then + + sPath = Mid(sPath, 2) + + Endif + + If Right(sPath) = "/" Then + + sPath = Mid(sPath, 1, -1) + + Endif + + sComponents = Split(sPath, "/") + + If sComponents[0] = "help" Then sComponents.Remove(0) + + Return sComponents + +End + +Private Function Path_Read() As String + + 'Return Application.Protocol & "://" & Application.Host &/ Application.Root &/ Request.Path + ' + Return Application.Protocol & "://" & Application.Host & IIf(Application.Port <> 80, ":" & Application.Port, "") &/ Request.Path + +End + +Private Function Section_Read() As Integer + + Select Case Request.Path + + Case Like "/admin*" + Return PATH_ADMIN + + Case Like "/help*" + Return PATH_WIKI + + Case Like "/account" + Return PATH_ACCOUNT + + Case Like "/login" + Return PATH_LOGIN + + Case Like "/logout" + Return PATH_LOGOUT + + Case Like "/image*" + Return PATH_IMAGE + + Case "/" + Return PATH_MAIN + + Case Else + Return PATH_404 + + End Select + +End + +Private Function Page_Read() As String + + Dim sPath As String + + If Request.Path Like "/image*" Then Return Mid(Request.Path, 7) + + If Request.Path Not Like "/help*" Then Return Request.Path + + sPath = Mid(Request.Path, 6) + + If Not sPath Then Return "/" + + If sPath Not Begins "/" Then sPath = "/" & sPath + + Return sPath + +End diff --git a/app/src/gb.wiki/.src/Views/Admin/WAdminMain.class b/app/src/gb.wiki/.src/Views/Admin/WAdminMain.class new file mode 100644 index 00000000..0a5fa73a --- /dev/null +++ b/app/src/gb.wiki/.src/Views/Admin/WAdminMain.class @@ -0,0 +1,2 @@ +' Gambas class file + diff --git a/app/src/gb.wiki/.src/Views/Admin/WAdminMain.webpage b/app/src/gb.wiki/.src/Views/Admin/WAdminMain.webpage new file mode 100644 index 00000000..4264bef6 --- /dev/null +++ b/app/src/gb.wiki/.src/Views/Admin/WAdminMain.webpage @@ -0,0 +1,78 @@ +<% +Dim sUser As String +%> +<> +

        <%=("User management")%>

        + + + + + + + + +
        <%=("Create user")%><%= ("Edit user")%><%=("Delete user")%>
        +
        +

        + + + + + +
        <%=("Username")%>
        <%=("Password")%>
        <%=("Confirm")%>
        <%=("Email")%>
        +

        " > +
        +
        + + +
        +

        + + + + +
        <%=("Name")%> + +
        <%=("Password")%>
        <%=("Confirm")%>
        +

        "> +
        +
        + +
        +

        + + +
        <%=("Name")%> + +
        +

        " > +
        +
        + +

        <%=("Database management")%>

        +
        +" > +
        + +
        +"> +
        + +
        +" > +
        + + +<
        > \ No newline at end of file diff --git a/app/src/gb.wiki/.src/Views/WAccount.class b/app/src/gb.wiki/.src/Views/WAccount.class new file mode 100644 index 00000000..0a5fa73a --- /dev/null +++ b/app/src/gb.wiki/.src/Views/WAccount.class @@ -0,0 +1,2 @@ +' Gambas class file + diff --git a/app/src/gb.wiki/.src/Views/WAccount.webpage b/app/src/gb.wiki/.src/Views/WAccount.webpage new file mode 100644 index 00000000..5d302db3 --- /dev/null +++ b/app/src/gb.wiki/.src/Views/WAccount.webpage @@ -0,0 +1,52 @@ +<> + +
        + +

         

        + + + + + + + + + + + + + + + + + + + + + + +
        + <%=("Username")%>:   + + +
        +<%=("Password")%>:   + + +
        +<%=("Repeat your password")%>:   + + +
        +<%=("Email")%>:   + + +
        + +

        +" /> +

        + +

         

        + +<> \ No newline at end of file diff --git a/app/src/gb.wiki/.src/Views/WEdit.class b/app/src/gb.wiki/.src/Views/WEdit.class new file mode 100644 index 00000000..0a5fa73a --- /dev/null +++ b/app/src/gb.wiki/.src/Views/WEdit.class @@ -0,0 +1,2 @@ +' Gambas class file + diff --git a/app/src/gb.wiki/.src/Views/WEdit.webpage b/app/src/gb.wiki/.src/Views/WEdit.webpage new file mode 100644 index 00000000..5e5c34b6 --- /dev/null +++ b/app/src/gb.wiki/.src/Views/WEdit.webpage @@ -0,0 +1,27 @@ +<> + +<% +If Actions.Image Then +%> + +

           + +">   +"> + +

        +

        +<% +Else +%> +
        +

           +">   +"> +

        +

        +<% +Endif +%> + +<
        > diff --git a/app/src/gb.wiki/.src/Views/WHeader.class b/app/src/gb.wiki/.src/Views/WHeader.class new file mode 100644 index 00000000..417857e5 --- /dev/null +++ b/app/src/gb.wiki/.src/Views/WHeader.class @@ -0,0 +1,190 @@ +' Gambas class file + +Property Title As String +Private $sTitle As String + +Property Warning As String +Private $sWarning As String + +Private Sub PrintPath() + + Dim sComponent As String + + Dim aComponents As New String[] + + Print "
        " + Print "" + + Print "\""" + + Print "" + + If Request.Path Like "/help/*" Then + + 'aComponents.Add("help") + Print " > "; "Home"; + + For Each sComponent In Path.Components + + If Not sComponent Then Continue + + aComponents.Add(sComponent) + + If Actions.Help Then + Print " > "; "" & sComponent & "" + Else + Print " > "; sComponent + Endif + + Next + + Else + + Print " > "; "Home"; " > "; WHeader.Title + + Endif + + Print "
        " + +End + +Private Sub PrintDivLang() + + If Main.Version Then + Print "
        "; + Else + Print "
        "; + Endif + +End + +Private Sub PrintVersion() + + If Main.IsWget Then Return + + Print "
        " + Print " +

        + +

        +<%=("Password")%>:   + +

        + +

        +" /> +

        + +

         

        + +<> \ No newline at end of file diff --git a/app/src/gb.wiki/.src/Views/WWiki.class b/app/src/gb.wiki/.src/Views/WWiki.class new file mode 100644 index 00000000..f5baf4d7 --- /dev/null +++ b/app/src/gb.wiki/.src/Views/WWiki.class @@ -0,0 +1 @@ +' Gambas class file diff --git a/app/src/gb.wiki/.src/Views/WWiki.webpage b/app/src/gb.wiki/.src/Views/WWiki.webpage new file mode 100644 index 00000000..b63bcfa6 --- /dev/null +++ b/app/src/gb.wiki/.src/Views/WWiki.webpage @@ -0,0 +1,17 @@ +<> + +<% +If Actions.Image Then +%> + +<% +Else + +Print IIf(Pages.Current.HTML, Pages.Current.HTML, Parser.Encode(Pages.Current.Content)) + +'Print IIf(Pages.Current.HTML, Pages.Current.HTML, Parser.Encode(Pages.Current.Content)) +Endif + +%> + +<> diff --git a/app/src/gb.wiki/help.png b/app/src/gb.wiki/help.png new file mode 100644 index 0000000000000000000000000000000000000000..cd8c86703fa0be37a528527a8ed47620848181ac GIT binary patch literal 1563 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 S9^vV3AW=_OKbLh*2~7Y*m(%P3 literal 0 HcmV?d00001 diff --git a/app/src/gbs3/.project b/app/src/gbs3/.project new file mode 100644 index 00000000..358c4e85 --- /dev/null +++ b/app/src/gbs3/.project @@ -0,0 +1,18 @@ +# Gambas Project File 3.0 +Title=gbs3 +Startup=MMain +Icon=icon.png +Version=3.14.90 +VersionFile=1 +Component=gb.eval +Description="Gambas Script" +Authors="Fabien Bodard, Benoit Minisini" +Arguments=[["--help"],["-e","For i as Integer To 10:Print \"Hello World\":Next"],["~/bin/who"],["-v","~/bin/mytest"]] +CurrentArgument=4 +TabSize=2 +Language=fr +Maintainer=benoit +Vendor=Princeton +Address=benoit@localhost +License=General Public Licence +Packager=1 diff --git a/app/src/gbs3/.src/CComponent.class b/app/src/gbs3/.src/CComponent.class new file mode 100644 index 00000000..d2c7b4f9 --- /dev/null +++ b/app/src/gbs3/.src/CComponent.class @@ -0,0 +1,307 @@ +' Gambas class file + +Static Public All As New Collection +Static Public Libraries As New String[] +Static Public (Classes) As Collection +Static Private $iKey As Integer + +Public Const STABLE As Integer = 0 +Public Const STABLE_NOT_FINISHED As Integer = 1 +Public Const UNSTABLE As Integer = 2 + +Public Key As String +Public Name As String +Public Authors As New String[] +'Public Type As String +Public Hiddens As New String[] +Public Controls As New String[] +'Public Containers As New String[] +'Public MultiContainers As New String[] +'Public Virtuals As New String[] +Public Require As New String[] +Public Exclude As New String[] +Public Implement As New String[] +Public Need As New String[] +Public Loaded As Boolean +Public ClassList As New String[] +Public State As Integer +Public SortKey As Integer +'Public User As Boolean +Public Version As String +Public Family As String +Public ThirdParty As Boolean +Static Public WhoImplement As New Collection +Public {Library} As Boolean +Public Path As String + +Static Public Features As New Collection + +'Static Private $hDumbClass As CClassInfo +'Static Private $hClass As CClassInfo + +Private $bCalcKey As Boolean + +Static Private Sub InitComponent(sFile As String) + + Dim hComponent As CComponent + Dim hFic As File + Dim sLig As String + Dim sKey As String + Dim sPath As String + Dim iPos As Integer + Dim sGroup As String + + sPath = Component.Path &/ sFile + + Try hFic = Open sPath + If Error Then + Error "Warning: cannot read "; sPath + Return + Endif + + Line Input #hFic, sLig + sLig = Trim(sLig) + + If sLig = "[Component]" Then + + hComponent = New CComponent + hComponent.Key = File.BaseName(sFile) + 'hComponent.ThirdParty = Not $cName.Exist(hComponent.key) + 'hComponent.Name = $cName[hComponent.Key] + If Not hComponent.Name Then hComponent.Name = " " 'Subst(("&1 component"), hComponent.Key) + + While Not Eof(hFic) + + Line Input #hFic, sLig + sLig = Trim(sLig) + + If Not sLig Then Continue + If Left(sLig) = ";" Or Left(sLig) = "'" Then Continue + + If sLig = "[Component]" Then Break + + If Left(sLig) = "[" And If Right(sLig) = "]" Then + sGroup = Mid$(sLig, 2, -1) + Continue + Endif + + iPos = InStr(sLig, "=") + If iPos = 0 Then Continue + + sKey = Left$(sLig, iPos - 1) + sLig = Mid$(sLig, iPos + 1) + + With hComponent + + If sKey = "Author" Or sKey = "Authors" Then + .Authors = Split(sLig) + 'Else If sKey = "Type" Then + ' .Type = sLig + ' Else If sKey = "Group" Then + ' sGroup = sLig + ' Else If sKey = "Hidden" Then + ' .Hiddens = Split(sLig) + ' Else If sKey = "Control" Or If sKey = "Controls" Then + ' .AddControls(sGroup, Split(sLig)) + ' Else If sKey = "Container" Then + ' .AddContainers(sGroup, Split(sLig)) + ' Else If sKey = "MultiContainer" Then + ' .AddContainers(sGroup, Split(sLig)) + ' .MultiContainers.Insert(Split(sLig)) + ' Else If sKey = "Virtual" Then + ' .AddControls(sGroup, Split(sLig)) + ' .Virtuals.Insert(Split(sLig)) + Else If sKey = "Require" Or sKey = "Requires" Then + .Require = Split(sLig) + Else If sKey = "Exclude" Or sKey = "Excludes" Then + .Exclude = Split(sLig) + Else If sKey = "Implement" Or sKey = "Implements" Then + .Implement = Split(LCase(sLig)) + Else If sKey = "Need" Or sKey = "Needs" Then + .Need = Split(LCase(sLig)) + ' Do not care with State + 'Else If sKey = "Alpha" Then + ' .State = UNSTABLE + 'Else If sKey = "State" Then + ' .State = CInt(sLig) + Else If sKey = "Version" Then + .Version = sLig + Endif + + ' Endif + + End With + + Wend + + If hComponent.Key Then + All[hComponent.Key] = hComponent + Endif + + Endif + + Close #hFic + + ' Catch + ' + ' Debug "Unable to read component file:";; sFile + +End + +Static Public Sub _init() + + Dim aComp As String[] + Dim sFile As String + + '$cName = New Collection + 'InitComponentNames + + ' sLang = System.Language + ' iPos = InStr(sLang, "_") + ' IF iPos THEN + ' sLangShort = Left$(sLang, iPos - 1) + ' ELSE + ' sLangShort = sLang + ' ENDIF + + 'OPEN Component.Path &/ "components" FOR READ AS #hFic + + aComp = Dir(Component.Path, "*.component").Sort() + For Each sFile In aComp + 'If Not $cName.Exist(File.BaseName(sFile)) Then Continue + InitComponent(sFile) + Next + + ' If Exist(Component.UserPath) Then + ' aComp = Dir(Component.UserPath, "*.component").Sort() + ' For Each sFile In aComp + ' If All.Exist(File.BaseName(sFile)) Then + ' Error "Warning: User component "; File.BaseName(sFile); " is ignored" + ' Continue + ' Endif + ' InitComponent(sFile, True) + ' Next + ' Endif + + SortComponents() + + '$cName = Null + 'Force gb.gui en premier lieu + WhoImplement["form"] = ["gb.gui"] + GetWhoImplement + + Reset + +End + +Static Private Sub GetWhoImplement() + + Dim s As String + Dim hComp As CComponent + + For Each hComp In CComponent.All + + For Each s In hComp.Implement + + If WhoImplement[s] = Null Then WhoImplement[s] = New String[] + If Not WhoImplement[s].Exist(hComp.Name) Then WhoImplement[s].Add(hComp.key) + + Next + + Next + +End + +Static Public Sub Exit() + + All = Null + +End + +Public Sub CalcSortKey() + + Dim sComp As String + Dim sNeed As String + Dim hComp As CComponent + + If SortKey = 0 Then + + If $bCalcKey Then Return + + $bCalcKey = True + + If Require.Count Or If Need.Count Then + + For Each sComp In Require + hComp = All[sComp] + If Not hComp Then Continue + If hComp <> Me Then hComp.CalcSortKey + Next + + For Each sNeed In Need + For Each hComp In All + If hComp.Implement.Find(sNeed) >= 0 Then + hComp.CalcSortKey + Endif + Next + Next + + Endif + + Inc $iKey + SortKey = $iKey + 'DEBUG Key;; "=";; SortKey + + $bCalcKey = False + + Endif + +End + +Static Private Sub SortComponents() + + Dim iMax As Integer + Dim hComponent As CComponent + Dim cNewAll As New Collection + Dim iInd As Integer + + For Each hComponent In All + hComponent.CalcSortKey + iMax = Max(iMax, hComponent.SortKey) + 'PRINT hComponent.Key;; hComponent.SortKey + Next + + For iInd = 1 To iMax + For Each hComponent In All + If hComponent.SortKey = iInd Then + cNewAll.Add(hComponent, hComponent.Key) + 'DEBUG hComponent.Key;; hComponent.SortKey + Endif + Next + Next + + All = cNewAll + +End + +Static Public Sub Reset() + + Dim hComponent As CComponent + Dim sLib As String + + For Each hComponent In All + hComponent.Loaded = False + Next + + For Each sLib In Libraries + All[sLib] = Null + Next + Libraries.Clear + + ' CModule.Reset + + Classes = New Collection(gb.IgnoreCase) + + 'All["gb"].Load + +End diff --git a/app/src/gbs3/.src/MMain.module b/app/src/gbs3/.src/MMain.module new file mode 100644 index 00000000..12b72420 --- /dev/null +++ b/app/src/gbs3/.src/MMain.module @@ -0,0 +1,662 @@ +' Gambas module file + +Private $sMd5 As String +Private $sPrjPath As String +Private $hOutFile As File +Private $sPath As String + +Private $hOutClass As File +Private $sMainScriptPath As String +Private $aIncFiles As New String[] +Private $iLevel As Integer +Private $cComponents As New Collection +Private $cLibraries As New Collection +Private $aSortKey As New Integer[] +Private $aAppArgs As New String[] +Private $bNoCache As Boolean +Private $bVerbose As Boolean +Private $bWarning As Boolean ' added to support warings to be displayed +Private $aImplemented As New String[] +Private $bExecuteFromArgs As Boolean +Private $bFast As Boolean +Private $bUnsafe As Boolean +Private $sUse As String +Private $bPrecompiler As Boolean +Private $aVarsDecl As New String[] +Private $cNativeTypes As Collection = ["i": "Integer", "s": "String", "f": "Float", "d": "Date", "b": "Boolean", "v": "Variant", "o": "Object", "l": "Long", "p": "Pointer"] + +Public Sub Main() As Integer + + Dim sName As String + Dim sCacheDir As String = File.Dir(File.Dir(Temp$())) &/ "script-cache" + Dim sRes As String + Dim bCompile As Boolean + + If Not Exist(sCacheDir) Then Mkdir sCacheDir + + $sPath = ParseArgs() + sName = File.Name($sPath) + + If IsNull($sPath) Then + + $sPath = Read Lof(File.In) + If Not $sPath Then + Error "gbs: no script file specified" + Error "Type 'gbs"; System.Version; " --help' for more information." + Return 1 + Else + $bExecuteFromArgs = True + Endif + + Endif + + If Not $bExecuteFromArgs Then + If Not Exist($sPath) Then + $sPath = Application.Dir &/ $sPath + If Not Exist($sPath) And Not $bExecuteFromArgs Then + Error "gbs: script file does not exist: " & Application.Args[1] + Return 1 + Endif + Endif + Endif + + $sMainScriptPath = File.Dir($sPath) + + If $bExecuteFromArgs Then + Shell ("echo '" & $sPath & "'|md5sum") To $sMd5 + Else + Exec ["md5sum", $sPath] To $sMd5 + Endif + + $sMd5 = Scan($sMd5, "* *")[0] + If $bFast Then $sMd5 &= "-f" + + If $bNoCache Or $bExecuteFromArgs Then + + bCompile = True + + Else + + If Not Exist(sCacheDir &/ $sMd5 &/ sName) Then + bCompile = True + Else + + bCompile = Not IsValid(sCacheDir &/ $sMd5 & ".info") + Endif + + Endif + + If bCompile Then + + If Left(File.Name(Args[0]), -1) = "gbw" Then + If $bVerbose Then Print "gbs: compiling server page" + $sPath = MServerPage.Make($sPath) + If $bVerbose Then + Print String$(20, "-") + Print File.Load($sPath) + Print String$(20, "-") + Endif + Endif + + MakeVirtualProject + + Shell (System.Path &/ "bin/gbc" & System.Version & If($bWarning, " -agw ", " -ag ") & $sPrjPath & " 2>&1") To sRes + + Dim sResLines As String[] = Split(sRes, "\n", "", True) ' added to only check the last line from compiler, ignore all others + If sResLines[sResLines.max] <> "OK" Then + Error sRes + Print File.Load($sPrjPath &/ ".project") + Print File.Load($sPrjPath &/ ".src" &/ "MMain.module") + Return 1 + Endif + + Try Mkdir sCacheDir &/ $sMd5 + Exec [System.Path &/ "bin/gba" & System.Version, "-o", sCacheDir &/ $sMd5 &/ sName, $sPrjPath] To sRes + + File.Save(sCacheDir &/ $sMd5 & ".info", $aIncFiles.Join("\n")) + + Endif + + $aAppArgs.Insert(["gbr3", sCacheDir &/ $sMd5 &/ sName], 0) + 'Print $aAppArgs.Join(" ") + Exec $aAppArgs Wait + If Process.LastState = Process.Crashed Then + Error "Segmentation fault" + Endif + Return Process.LastValue + +End + +Private Function ParseArgs() As String + + Dim I As Integer + Dim sApp As String + + For I = 1 To Args.Max + + If Args[I] = "--" Then + Inc I + Break + Else If Left(Args[I]) <> "-" Then + Break + Endif + + Select Case Args[I] + + Case "-V", "--version" + + Print Application.Version + Quit + + Case "-L", "--license" + + Print + If File.Name(Args[0]) = ("gbs" & System.Version) Then + Print "GAMBAS Scripter version " & Application.Version + Else + Print "GAMBAS Webpage Scripter version " & Application.Version + Endif + Print File.Load("license") + Quit + + Case "-h", "--help" + + If File.Name(Args[0]) = ("gbs" & System.Version) Then + Print File.Load("usage-gbs") + Else + Print File.Load("usage-gbw") + Endif + Quit + + Case "-c", "--nocache" + + $bNoCache = True + + Case "-v", "--verbose" + + $bVerbose = True + + Case "-e" + + $bExecuteFromArgs = True + + Case "-f", "--fast" + + $bFast = True + + Case "-U", "--unsafe" + + $bUnsafe = True + + Case "-u" + + If Not (Application.Args[I + 1] Begins "-") Then + $sUse = Application.Args[I + 1] + Inc I + Endif + + Case "-p" + + $bPrecompiler = True + + Case "-w", "--warnings" + + $bWarning = True + + Case Else + + Error "gbs3: Unknown option: "; Args[I] + Quit 1 + + End Select + + Next + + sApp = Args[I] + Inc I + While I < Args.Count + $aAppArgs.Add(Args[I]) + Inc I + Wend + + Return sApp + +End + +Private Sub MakeVirtualProject() + + Dim s As String + Dim sPrjFileContent As String + Dim i As Integer + + $sPrjPath = Temp("project") + + If $bVerbose Then Print "gbs: create project" + + Try Mkdir $sPrjPath + Try Mkdir $sPrjPath &/ ".src" + + sPrjFileContent = "# Gambas Project File 3.0\n" + sPrjFileContent &= "Title=Gambas Script\n" + sPrjFileContent &= "Startup=MMain\n" + + $hOutFile = Open $sPrjPath &/ ".src/MMain.module" For Write Create + Print #$hOutFile, "' Gambas module file\n" + If $bFast Then + Print #$hOutFile, "Fast"; + If $bUnsafe Then Print #$hOutFile, " Unsafe"; + Print #$hOutFile + Endif + + $iLevel = 0 + If $bExecuteFromArgs Then + GenerateFilesFromArgs($sPath) + Else + GenerateFiles($sPath) + Endif + + For Each s In $cComponents + GetNeededComp(s) + Next + + For Each s In $cComponents + GetRequiredComp(s) + Next + + CComponent.Exit + + $aSortKey.Sort + + For Each i In $aSortKey + sPrjFileContent &= "Component=" & $cComponents[i] & "\n" + + Next + + For Each ci As String In $cLibraries + sPrjFileContent &= "Library=" & ci & "\n" + + Next + + File.Save($sPrjPath &/ ".project", sPrjFileContent) + + Close $hOutFile + +End + +Private Sub CompileError(sPath As String, iLine As Integer, sMessage As String) + + Error "gbs3: "; sPath; "."; iLine; ": "; sMessage + CComponent.Exit + Quit + +End + +Private Sub GenerateFiles(Path As String) + + Dim hFile As File + Dim sLine As String + Dim sPath As String + Dim sClass As String + Dim bInClass As Boolean = False + Dim s As String + Dim sCodeBuf As String + Dim bAutoMain As Boolean = True + Dim aSym As String[] + Dim iInd As Integer + Dim iLine As Integer + + If Not Exist(Path) Then Return + + If $aIncFiles.Exist(Path) Then Return + + If $bVerbose Then Print "gbs: process file: "; Path + + Inc $iLevel + + $aIncFiles.Add(Path) + $aIncFiles.Add(Stat(Path).LastModified) + + hFile = Open Path For Read + + While Not Eof(hFile) + + Inc iLine + Line Input #hFile, sLine + If sLine Like "#!*" Then Continue + + aSym = Highlight.Analyze(sLine) + + If aSym.Count Then + If Highlight.Types[aSym.Max] = Highlight.Comment Or If Highlight.Types[aSym.Max] = Highlight.Help Then + aSym.Remove(aSym.Max) + Endif + Endif + 'Find the include keyword and add the queried files. + If aSym.Count = 2 And If aSym[0] = "INCLUDE" And If Highlight.Types[1] = Highlight.String Then + sPath = Mid$(aSym[1], 2, -1) 'Trim(Scan(sLine, "INCLUDE *")[0]) + If Not Exist(sPath) Then sPath = $sMainScriptPath &/ sPath + If $bVerbose Then Print "gbs: include script file: " & sPath + + GenerateFiles(sPath) + Continue + Endif + + 'Find the END CLASS keyword and close the class if true + If aSym.Count = 2 And If aSym[0] = "END" And If aSym[1] == "CLASS" And If bInClass Then + Close #$hOutClass + + bInClass = False + Continue + Endif + + If aSym.Count = 2 And If aSym[0] = "CLASS" And If Highlight.Types[1] = Highlight.Symbol Then + + If bInClass Then + CompileError(Path, iLine, "Unexpected CLASS declaration") + Endif + sClass = aSym[1] 'Trim(Scan(sLine, "CLASS *")[0]) + If IsNull(sClass) Then + CompileError(Path, iLine, "Class name missing") + Continue + Endif + If $bVerbose Then Print "gbs: create class: "; sClass + $hOutClass = Open $sPrjPath &/ ".src" &/ sClass & ".class" For Write Create + If $bFast Then Print #$hOutClass, "Fast" + bInClass = True + Continue + Endif + + If aSym.Count >= 2 And If aSym[0] == "USE" Then + + For iInd = 1 To aSym.Max Step 2 + If Highlight.Types[iInd] <> Highlight.String Then CompileError(Path, iLine, "Syntax error") + s = Mid$(aSym[iInd], 2, -1) + + If s Like "*:*" Or s Like "/*" Then + If $bVerbose Then Print "gbs: use library: "; s + ProcessLibrary(s, iLine, path) + + Else + If $bVerbose Then Print "gbs: use component: "; s + ProcessComponent(s, iline, path) + + Endif + + If iInd < aSym.Max Then + s = aSym[iInd + 1] + If s <> "," Then CompileError(Path, iLine, "Comma missing") + Endif + + Next + Continue + Endif + + If aSym.Count = 5 And If aSym[0] = "PUBLIC" And If (aSym[1] = "SUB" Or aSym[0] = "PROCEDURE") And If aSym[2] = "Main" And If aSym[3] = "(" And If aSym[4] = ")" Then + If $bVerbose Then Print "gbs: Main procedure already defined" + bAutoMain = False + Endif + + If bInClass Then + Print #$hOutClass, sLine + Else + sCodeBuf &= sLine & "\n" + + If aSym.Count = 1 And If aSym[0] = "END" Then + Print #$hOutFile, sCodeBuf + sCodeBuf = Null + Endif + Endif + + Wend + + If bInClass Then CompileError(Path, iLine, "END CLASS missing") + + If bAutoMain And Not IsNull(sCodeBuf) And $iLevel = 1 Then + If $bVerbose Then Print "gbs: Main procedure not defined, create it" + Print #$hOutFile, "Public Sub Main()" + Print #$hOutFile, sCodeBuf + Print #$hOutFile, "End" + Endif + + Close #hFile + + Dec $iLevel + +End + +Private Sub processComponent(CompName As String, Progline As Integer, Path As String) + + If Not CComponent.All.Exist(CompName) Then + CompileError(Path, ProgLine, Subst("Unknown component: &1", CompName)) + Else + $cComponents[CComponent.All[CompName].SortKey] = CompName + $aSortKey.Add(CComponent.All[CompName].SortKey) + $aImplemented.Insert(CComponent.All[CompName].Implement) + Endif + +End + +Private Sub ProcessLibrary(LibName As String, ProgLine As Integer, Path As String) + Dim sSplitLine As String[] = Split(LibName, ":", "", True) + Dim LibEntry As String + + sSplitLine[0] = Replace(sSplitLine[0], ".", "/") + LibEntry = sSplitLine[0] + 'We will allow major version numbers to be used of major.minor numbers + If LibEntry[0] = "/" Then + If Exist(LibEntry & ":" & sSplitLine[1] & ".gambas") Then ' we have a whole path + LibEntry = LibEntry & ":" & sSplitLine[1] & ".gambas" + Else + LibEntry = CheckLibVersions(LibEntry, sSplitLine[1]) + Endif + Else + libEntry = User.home &/ "/.local/share/gambas" & System.version &/ "lib" &/ LibEntry + If Exist(LibEntry & ":" & sSplitLine[1] & ".gambas") Then + LibEntry = LibEntry & ":" & sSplitLine[1] & ".gambas" + Else + LibEntry = CheckLibVersions(LibEntry, sSplitLine[1]) + If LibEntry = "" Then + LibEntry = "/usr/lib/gambas" & System.version &/ sSplitLine[0] & ".gambas" + If Exist(LibEntry & ":" & sSplitLine[1] & ".gambas") Then + LibEntry = LibEntry & ":" & sSplitLine[1] & ".gambas" + Else + LibEntry = CheckLibVersions(LibEntry, sSplitLine[1]) + Endif + Endif + Endif + + Endif + + If LibEntry = "" Then + CompileError(Path, ProgLine, Subst("Unknown Library: &1", LibName)) + Else + If $bVerbose Then Print "gbs: use Library Path: "; LibEntry + $cLibraries.Add(LibEntry, File.Name(LibName)) + Endif +End + +Private Sub CheckLibVersions(sPath As String, Version As String) As String + + Dim sVersion As String[] = Split(version, ".") + If sVersion.count > 0 Then + Dim sDir As String = File.Dir(sPath) + Dim sName As String = File.Name(sPath) & ":" & sVersion[0] & ".*" & ".gambas" + Dim sEntries As String[] = Dir(sDir, sName, gb.file).Sort() + If sEntries.count > 0 Then + Return sDir &/ sEntries[sEntries.max] ' return the highest level library + Else + Return "" + Endif + Else + Return "" + Endif + +End + + + +Public Function IsValid(sPath As String) As Boolean + + Dim aFileInfo As String[] + Dim i As Integer + + If Not Exist(sPath) Then Return False + + aFileInfo = Split(File.Load(sPath), "\n") + + For i = 0 To aFileInfo.Max Step 2 + If Stat(aFileInfo[i]).LastModified > CDate(aFileInfo[i + 1]) Then Return False + Next + + Return True + +Catch + Return False + +End + +Public Sub GetRequiredComp(sComp As String) + + Dim s As String + + If Not CComponent.All.Exist(sComp) Then Return + + For Each s In CComponent.All[sComp].Require + If Not $cComponents.Exist(s) Then + $cComponents.Add(s, CComponent.All[s].Sortkey) + $aSortKey.add(CComponent.All[s].SortKey) + $aImplemented.Insert(CComponent.All[s].Implement) + GetRequiredComp(s) + Endif + + Next + +End + +Private Sub GetNeededComp(sComp As String) + + Dim s, t As String + Dim bExist As Boolean + + If Not CComponent.All.Exist(sComp) Then Return + + For Each s In CComponent.All[sComp].Need + If $aImplemented.Exist(s) Then Break + + For Each t In CComponent.WhoImplement[s] + If $cComponents.Exist(t) Then + bExist = True + Break + Endif + + Next + + If Not bExist Then + t = CComponent.WhoImplement[s][0] + $cComponents.Add(t, CComponent.All[t].SortKey) + $aSortKey.add(CComponent.All[t].SortKey) + $aImplemented.Insert(CComponent.All[t].Implement) + Endif + + GetNeededComp(t) + + Next + +End + +Private Sub GenerateFilesFromArgs(sLine As String) + + Dim bCrochetOuvert As Boolean + + Dim s As String + Dim i As Integer + Dim sCode, sNew As String + + 'Use management + If $sUse + For Each s In Split($sUse) + If Not CComponent.All.Exist(s) Then CompileError(sLine, 0, Subst("Unknown component: &1", s)) + $cComponents[CComponent.All[s].SortKey] = s + $aSortKey.Add(CComponent.All[s].SortKey) + $aImplemented.Insert(CComponent.All[s].Implement) + Next + s = "" + Endif + + For i = 1 To Len(sLine) + s = Mid(sLine, i, 1) + If s = "[" Then bCrochetOuvert = True + If s = "]" Then bCrochetOuvert = False + + If s = ":" And Not bCrochetOuvert Then s = "\n" + sCode &= s + + Next + + $aVarsDecl.Clear + + If $bPrecompiler Then + For Each s In Split(sCode, "\n") + sNew &= PrecompileLine(s) & "\n" + Next + 'We look in the code if none of the insertion declaration exist already. + For i = 0 To $aVarsDecl.Max + If InStr(sNew, $aVarsDecl[i], 0, gb.IgnoreCase) Then $aVarsDecl[i] = "" + Next + sCode = sNew + Endif + + scode = "Public Sub Main()\n" & $aVarsDecl.Join("\n") & "\n" & sCode + sCode &= "\nEnd\n" + + Print #$hOutFile, sCode + +End + +Private Function PrecompileLine(sLine As String) As String + + Dim iBeg As Integer + Dim iEnd As Integer + Dim iVend As Integer + Dim sVar As String + Dim sType As String + Dim sDecl As String + + ibeg = 1 + While iBeg > 0 + 'Recherche d'une accolade ouverte + iBeg = InStr(sLine, "{", iBeg) + If iBeg Then + 'Recherche de l'acolade fermée + Inc iBeg + iEnd = InStr(sLine, "}", iBeg) + If iEnd Then + 'Vérifier l'absence d'espace après + If Mid(sLine, iEnd + 1, 1) <> " " Then + + 'Trouver le nom de la variable + iVend = InStr(sLine, "=", iEnd + 1) + If Not iVend Then iVend = InStr(sLine, " ", iEnd + 1) + If Not iVend Then iVend = Len(sLine) + 1 + If iEnd + 1 = iVend Then Continue + + + 'Stocker le nom de la variable et son type + sVar = Mid(sLine, iEnd + 1, iVend - iEnd - 1) + sType = Mid(sLine, iBeg, iEnd - iBeg) + 'Si le type est une abreviation connue alors on le remplace par le type complet + If $cNativeTypes.Exist(sType) Then sType = $cNativeTypes[sType] + 'On retire l'insert de déclaration + Mid(sline, 1, iEnd + 2) = Replace(Mid(sLine, 1, iEnd + 2), Mid(sLine, iBeg - 1, iEnd - iBeg + 2), "") + 'On génère la ligne de déclaration + sDecl = "Dim " & sVar & " As " & sType + 'et on vérifie si elle n'existe pas déja... sinon on l'ajoute + If Not $aVarsDecl.Exist(sDecl) Then $aVarsDecl.Add(sDecl) + iBeg = 1 + Endif + Endif + Endif +Wend +Return sLine + +End diff --git a/app/src/gbs3/.src/MServerPage.module b/app/src/gbs3/.src/MServerPage.module new file mode 100644 index 00000000..4733ad37 --- /dev/null +++ b/app/src/gbs3/.src/MServerPage.module @@ -0,0 +1,145 @@ +' Gambas module file + +Private $hOut As File +Private $bLastPrint As Boolean +Private $iLenPrint As Integer + +Private Sub PrintHTML(sStr As String) + + If Len(sStr) Then + $iLenPrint += Len(sStr) + If $iLenPrint > 32000 Then $bLastPrint = False + If Not $bLastPrint Then + $iLenPrint = Len(sStr) + Print #$hOut, "PRINT "; + Else + Print #$hOut, " "; + Endif + Print #$hOut, Quote(sStr); + $bLastPrint = True + Endif + +End + +Private Sub PrintSemiColon() + + If $bLastPrint Then Print #$hOut, ";" + $bLastPrint = False + +End + + + +Public Sub Make(sPath As String) As String + + Dim sData As String = File.Load(sPath) + Dim iPos As Integer + Dim iPos2 As Integer + Dim sCar As String + Dim sWait As String + + sPath = Temp$("gs") + $hOut = Open sPath For Create + + Print #$hOut, "USE \"gb.web\"" + + Print #$hOut, "PUBLIC SUB Main()\n" + " Response.Buffered = TRUE\n" + " Response.Begin\n" + " _PrintPage()\n" + " Response.End\n" + "END" + + Print #$hOut, "\nPRIVATE SUB _PrintPage()" + + If sData Like "#!/*" Then + iPos = InStr(sData, "\n") + If iPos = 0 Then iPos = Len(sData) + Endif + + Do + + iPos2 = InStr(sData, "<%", iPos + 1) + If iPos2 = 0 Then + PrintHTML(Mid$(sData, iPos + 1)) + Break + Else + PrintHTML(Mid$(sData, iPos + 1, iPos2 - iPos - 1)) + iPos = iPos2 + Endif + + 'If Mid$(sData, iPos, 2) = "<%" Then + + ' Search for closing "%>" by jumping Gambas syntax + Do + Inc iPos2 + If iPos2 > Len(sData) Then Break + sCar = Mid$(sData, iPos2, 1) + If sWait Then + If sCar = "\\" Then + Inc iPos2 + Else If sCar = sWait Then + sWait = "" + Endif + Else If sCar = Chr$(34) Then + sWait = Chr$(34) + Else If Mid$(sData, iPos2, 2) = "%>" Then + Break + Endif + Loop + + PrintSemiColon + + If Mid$(sData, iPos, 3) = "<%=" Then + If (iPos2 - iPos - 3) > 0 Then + Print #$hOut, "PRINT HTML(Str("; Trim(Mid$(sData, iPos + 3, iPos2 - iPos - 3)); "));" + Endif + Else + Print #$hOut, Trim(Mid$(sData, iPos + 2, iPos2 - iPos - 2)) + Endif + + iPos = iPos2 + 1 + + ' Else If Mid$(sData, iPos, 3) = "<--" Then + ' + ' ' Search for closing "-->" + ' iPos2 = InStr(sData, "-->", iPos + 3) + ' + ' PrintHTML(Mid$(sData, iPos, iPos2 - iPos + 3)) + ' + ' iPos = iPos2 + 2 + ' + ' Else + ' + ' ' Search for closing ">" by jumping markup syntax + ' Do + ' Inc iPos2 + ' If iPos2 > Len(sData) Then Break + ' sCar = Mid$(sData, iPos2, 1) + ' If sWait Then + ' If sCar = sWait Then sWait = "" + ' Else If sCar = ">" Then + ' Break + ' Else If sCar = Chr$(34) Then + ' sWait = Chr$(34) + ' Else If sCar = "'" Then + ' sWait = "'" + ' Endif + ' Loop + ' + ' PrintHTML(Mid$(sData, iPos, iPos2 - iPos + 1)) + ' + ' iPos = iPos2 + ' + ' Endif + + Loop + + PrintSemiColon + Print #$hOut, "END" + + Close #$hOut + Return sPath + +End + diff --git a/app/src/gbs3/icon.png b/app/src/gbs3/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8c4e29b293bf2a1e8ab8bdf564b213954cbac6c5 GIT binary patch literal 1528 zcmX|AdpOg39RB6n(Mc;ImP(3*h$G=p9G8aXTDf*AY!o6Dxoj@02f1hU=%Nx@8r^8+ zUL#C1m0=s3GnX>i%w@)I=f~+e&-3}bpZ9$~@ALWR`+T##;I120v{e8A*a$o3@N(qpP0(58pudKoG)#LhlgU75_==`vdGXuCEPZNTD3aVD3{K&q zEp9Z)q*Ad&Dw9g^z2mg=ijt){CQ5&Q+IxEJCezHuaV%WOru?WtNCdOo=0d4Nw9H{F z^bFkv6DHI^s;|hESVLoNM$lMS1|Z}jvfaQvU{U(l=0i1@Y@{+G8+$Pw~X@y zcDZc}%cALdq3z99+niR{Vq#!fw{b>8&nTBP$_*+b8K*Zy;V50qnfvXmd+p3B5FL$3i#f!?@z*+se8LvGmFdOyEG!G2E?JOK$KFvkw7yO|KM>VfmG z-^}B$hrgZk-8B8G|M6&uN;@;lajlC*~Dq-#X}#jR6iv;mc@G~K{OKoCVbc6%YcZI;C@rw=^gf{va@{hHB5sjWDAGq@`GW} zlt^;j+Fo(%#U)iUt89XFAUJDhb4^?~PG1}-WObgKc{J9hiUh;?U%1CIJmN{mE60#T2NY17N*j^7?(Nm!y9Tg;+SLq{p5!8=E_ zjI5ynF7l>dVj=~`^4TD%^{hZk1| zok*|SVOu!xL=L7+I%4_Pwdp8NZPFdjsu3NSxfUD=bFd!t^+LIC$l(|38&-=P4~A?q z+Dg^KmY+}Hm`u;#n|qC7)b{zepuH~|8@S~;H`nW=Nz?K5%|&nD_8c0d@WRPhcPl#6 z8F;ej24q@TWDQp<#xcFW1RW1N$f@*#l=J z&&c}_X*g6iAjeRNMW^5{gheGLMpayh2v%Bp&Q@2>|2%75# O48WY>PPL9_GX4d{MG}qx literal 0 HcmV?d00001 diff --git a/app/src/gbs3/license b/app/src/gbs3/license new file mode 100644 index 00000000..55b3a7b9 --- /dev/null +++ b/app/src/gbs3/license @@ -0,0 +1,6 @@ +(c) Fabien Bodard, Benoît Minisini + +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 2, or +(at your option) any later version. diff --git a/app/src/gbs3/usage-gbs b/app/src/gbs3/usage-gbs new file mode 100644 index 00000000..08693859 --- /dev/null +++ b/app/src/gbs3/usage-gbs @@ -0,0 +1,15 @@ + +Compile and execute a Gambas script. + +Usage: gbs3 [options] [", I) + If iPos = 0 Then + Highlight.Text = String.Mid$(sText, I) + GoSub READ_SCRIPT + iNextState = Highlight.State + iTagMode = Highlight.Tag + Goto END_TEXT + Else + If iPos > I Then + Highlight.Text = String.Mid$(sText, I, iPos - I) + GoSub READ_SCRIPT + Endif + Add("", Highlight.Keyword) + iTag = TAG_HTML + I = iPos + 9 + bNextLimit = True + Goto STATE_HTML + Endif + +READ_STYLE: + + sText = Highlight.Text + While sText + MeetCodeAt = 0 + HighlightCSS.Run() + If MeetCodeAt = 0 Then + $sBufferAfter &= sText + Break + Endif + $sBufferAfter &= String.Left(sText, MeetCodeAt - 1) + Highlight.AlternateState = True + Add("<%", Highlight.Keyword) + I = MeetCodeAt + 2 + GoSub READ_CODE + sText = String.Mid$(sText, I) + Highlight.Text = sText + Wend + + Return + +STATE_STYLE: + + Highlight.Tag = iTagMode + + iPos = String.InStr(sText, "", I) + If iPos = 0 Then + Highlight.Text = String.Mid$(sText, I) + GoSub READ_STYLE + iNextState = Highlight.State + iTagMode = Highlight.Tag + Goto END_TEXT + Else + If iPos > I Then + Highlight.Text = String.Mid$(sText, I, iPos - I) + GoSub READ_STYLE + Endif + Add("", Highlight.Keyword) + iTag = TAG_HTML + I = iPos + 8 + bNextLimit = True + Goto STATE_HTML + Endif + +STATE_CODE: + + 'Print "**** STATE_CODE" + GoSub READ_CODE + If I > iLenText Then + Goto END_TEXT + Else + Goto STATE_HTML + Endif + +STATE_CODE_COMMENT: + + GoSub READ_CODE_COMMENT + If I > iLenText Then + Goto END_TEXT + Else + Goto STATE_HTML + Endif + +READ_STRING: + + sQuote = sCar + Add(sQuote, Highlight.String) + Do + GoSub NEXT_CHAR + Add(sCar, Highlight.String) + If sCar = sQuote Then Break + If sCar = "\\" Then + GoSub NEXT_CHAR + Add(sCar, Highlight.String) + Endif + Loop + Return + +IGNORE_STRING: + + sQuote = sCar + 'Add(sQuote, Highlight.String) + Do + GoSub NEXT_CHAR + 'Add(sCar, Highlight.String) + If sCar = sQuote Then Break + If sCar = "\\" Then + GoSub NEXT_CHAR + 'Add(sCar, Highlight.String) + Endif + Loop + Return + +READ_CODE: + + PushHighlightState + + Highlight.AlternateState = True + Highlight.State = Highlight.Normal + Highlight.Tag = 0 + bClose = False + iStart = I + + Do + + If I > iLenText Then Break + GoSub NEXT_CHAR + + If sCar = Chr$(34) Then + GoSub IGNORE_STRING + Else If sCar = "'" Then + I = iLenText + 1 + Else If sCar = "%" And If String.Mid$(sText, I, 1) = ">" Then + bClose = True + Break + Endif + + Loop + + If bClose Then + $sBufferAfter &= AnalyzeCode(String.Mid$(sText, iStart, I - iStart - 1)) + Add("%>", Highlight.Keyword) + Highlight.AlternateState = False + iTagCode = 0 + Inc I + PopHighlightState + iNextState = Highlight.State + Else + $sBufferAfter &= AnalyzeCode(String.Mid$(sText, iStart)) + iTagCode = TAG_CODE + iTagMode = Highlight.Tag + iNextState = Highlight.State + PopHighlightState + Endif + + Return + +READ_CODE_COMMENT: + + iPos = String.InStr(sText, "--%>", I) + If iPos = 0 Then + Add(String.Mid$(sText, I), Highlight.Help) + I = iLenText + 1 + iTagCode = TAG_CODE_COMMENT + Else + Add(String.Mid$(sText, I, iPos - I + 3), Highlight.Help) + I = iPos + 3 + iTagCode = 0 + Endif + Return + +NEXT_CHAR: + + If I > iLenText Then Goto END_TEXT + sCar = String.Mid$(sText, I, 1) + Inc I + + If iStyle = STYLE_WEB And If iTagCode = 0 And If sCar = "<" And If String.Mid$(sText, I, 1) = "%" Then + + If String.Mid$(sText, I, 3) = "%--" Then + Add("<%--", Highlight.Help) + I += 3 + GoSub READ_CODE_COMMENT + Goto NEXT_CHAR + Else + Highlight.AlternateState = True + sCar = String.Mid$(sText, I + 1, 1) + If sCar = "=" Then + Add("<%=", Highlight.Keyword) + I += 2 + Else If sCar = "!" Then + iPos = String.InStr(sText, "%>", I) + If iPos = 0 Then iPos = iLenText + 1 + Add("<" & String.Mid$(sText, I, iPos - I + 2), Highlight.DataType) + I = iPos + 2 + Highlight.AlternateState = False + Goto NEXT_CHAR + Else + Add("<%", Highlight.Keyword) + Inc I + Endif + GoSub READ_CODE + Goto NEXT_CHAR + Endif + + Endif + + Return + +END_TEXT: + + Highlight.Text = $sTextAfter & $sBufferAfter + Highlight.State = iNextState + Highlight.Tag = iTag + iTagCode + Shl(iTagMode, 8) + If(bNextLimit, TAG_NEXT_LIMIT, 0) + Highlight.ShowLimit = bLimit + 'Print "--> "; Bin$(Highlight.Tag, 16);; Highlight.Text + +End diff --git a/comp/src/gb.eval.highlight/.src/OldHighlighter/HighlightJavascript.module b/comp/src/gb.eval.highlight/.src/OldHighlighter/HighlightJavascript.module new file mode 100644 index 00000000..e7a5b99f --- /dev/null +++ b/comp/src/gb.eval.highlight/.src/OldHighlighter/HighlightJavascript.module @@ -0,0 +1,287 @@ +' Gambas module file + +Private Const IDENT_CAR As String = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_$" +Private Const DIGIT_CAR As String = "0123456789.+-eE" + +Private $cKeyword As New Collection +Private $cOperator As New Collection +Private $aKeywords As String[] + +Public Sub _init() + + Dim sStr As String + + $aKeywords = New String[] + + For Each sStr In ["break", "case", "catch", "const", "continue", "debugger", "default", "delete", "do", "else", "finally", "for", + "function", "if", "in", "instanceof", "new", "return", "switch", "throw", "try", "typeof", "var", "void", "while", "with"] + $cKeyword[sStr] = 0 + $aKeywords.Add(sStr) + Next + + For Each sStr In ["false", "null", "this", "true", "undefined"] + $cKeyword[sStr] = 1 + $aKeywords.Add(sStr) + Next + + For Each sStr In ["{", "}", ".", ">=", "+", "<<", "!", "=", ">>=", ";", "==", "-", ">>", "~", "+=", ">>>=", "(", ",", "!=", "*", ">>>", "&&", "-=", "&=", ")", "<", "===", "%", "&", "||", "*=", "|=", "[", ">", "!==", "++", "|", "?", "%=", "^=", + "--", "^", ":", "<<=", "]", "<=", "/", "/="] + $cOperator[sStr] = True + Next + +End + +Public Sub GetKeywords() As String[] + + Return $aKeywords + +End + + + +Public Sub Run() + + Dim iState As Integer + Dim iTag As Integer + Dim sText As String + Dim iLenText As Integer + Dim iPos As Integer + Dim sCar As String + Dim bSingleLineComment As Boolean + Dim bSingleQuoteString As Boolean + Dim sIdent As String + Dim bTestShowLimit As Boolean + Dim bLastExpr As Boolean + + iState = Highlight.State + iTag = Highlight.Tag + sText = Highlight.Text + iLenText = String.Len(sText) + bLastExpr = True + If iState = Highlight.Operator Then bLastExpr = False + + For iPos = 1 To iLenText + + sCar = String.Mid$(sText, iPos, 1) + + If HighlightHTML.AllowCode And If sCar = "<" And String.Mid$(sText, iPos, 2) = "<%" Then + HighlightHTML.MeetCodeAt = iPos + Highlight.State = iState + Highlight.Tag = iTag + Return + Endif + + If iState = Highlight.Normal Then + + If sCar = "/" Then + sCar = String.Mid$(sText, iPos + 1, 1) + If sCar = "/" Then + iState = Highlight.Comment + bSingleLineComment = True + Else If sCar = "*" Then + sCar = String.Mid$(sText, iPos + 2, 1) + If sCar = "*" Then + iState = Highlight.Help + Else + iState = Highlight.Comment + Endif + bSingleLineComment = False + Else If Not bLastExpr And If String.Mid$(sText, iPos + 1, 1) <> " " Then ' Regular expression + + sIdent = sCar + + While iPos < iLenText + Inc iPos + sCar = String.Mid$(sText, iPos, 1) + If sCar = "\\" Then + Inc iPos + sIdent &= sCar & String.Mid$(sText, iPos, 1) + Continue + Endif + sIdent &= sCar + If sCar = "/" Then + Break + Endif + Wend + + While iPos < iLenText + Inc iPos + sCar = String.Mid$(sText, iPos, 1) + If Not IsLetter(sCar) Then + Dec iPos + Break + Endif + sIdent &= sCar + Wend + + Highlight.Add(Highlight.DataType, String.Len(sIdent)) + iState = Highlight.Normal + Continue + Else + Highlight.Add(Highlight.Operator) + Continue + Endif + + Else If sCar = "\"" Then + iState = Highlight.String + bSingleQuoteString = False + Else If sCar = "'" Then + iState = Highlight.String + bSingleQuoteString = True + Else If Asc(sCar) <= 32 Then + + Else If IsDigit(sCar) Then + + sIdent = sCar + sCar = String.Mid$(sText, iPos + 1, 1) + If sCar = "x" Or If sCar = "X" Then + sIdent &= sCar + Inc iPos + While iPos < iLenText + Inc iPos + sCar = String.Mid$(sText, iPos, 1) + If Not IsHexa(sCar) Then + Dec iPos + Break + Endif + sIdent &= sCar + Wend + Else + While iPos < iLenText + Inc iPos + sCar = String.Mid$(sText, iPos, 1) + If InStr(DIGIT_CAR, sCar) = 0 Then + Dec iPos + Break + Endif + sIdent &= sCar + Wend + Endif + + Highlight.Add(Highlight.Number, String.Len(sIdent)) + iState = Highlight.Normal + bLastExpr = True + Continue + + Else If Len(sCar) >= 2 Or If InStr(IDENT_CAR, sCar) Then + + sIdent = sCar + + While iPos < iLenText + Inc iPos + sCar = String.Mid$(sText, iPos, 1) + If Len(sCar) = 1 And If Not IsDigit(sCar) And If InStr(IDENT_CAR, sCar) = 0 Then + Dec iPos + Break + Endif + sIdent &= sCar + Wend + + If $cKeyword.Exist(sIdent) Then + iState = Highlight.Keyword + If sIdent = "function" Then bTestShowLimit = True + If $cKeyword[sIdent] = 1 Then bLastExpr = True + Else + iState = Highlight.Symbol + bLastExpr = True + Endif + + Highlight.Add(iState, String.Len(sIdent)) + iState = Highlight.Normal + Continue + + Else + + sIdent = sCar + + While iPos < iLenText + If $cOperator.Exist(sIdent) Then Break + Inc iPos + sCar = String.Mid$(sText, iPos, 1) + If IsLetter(sCar) Or If IsDigit(sCar) Or If IsBlank(sCar) Then + Dec iPos + Break + Endif + sIdent &= sCar + Wend + + bLastExpr = False + + If $cOperator.Exist(sIdent) Then + iState = Highlight.Operator + If sIdent = ")" Or If sIdent = "]" Then bLastExpr = True + Else + iState = Highlight.Error + Endif + + Highlight.Add(iState, String.Len(sIdent)) + iState = Highlight.Normal + + 'Dec iPos + Continue + + Endif + + Else If iState = Highlight.Comment Or If iState = Highlight.Help Then + + If Not bSingleLineComment Then + sCar = String.Mid$(sText, iPos, 2) + If sCar = "*/" Then + Highlight.Add(iState, 2) + Inc iPos + iState = Highlight.Normal + Continue + Endif + Endif + + Else If iState = Highlight.String Then + + If sCar = "\\" Then + sCar = String.Mid$(sText, iPos + 1, 1) + If sCar = "x" Then + Highlight.Add(iState, 3) + iPos += 2 + Continue + Else If sCar = "u" Then + Highlight.Add(iState, 5) + iPos += 4 + Continue + Else + Highlight.Add(iState, 2) + Inc iPos + Continue + Endif + Else If sCar = "\"" And If Not bSingleQuoteString Then + Highlight.Add(iState) + iState = Highlight.Normal + bLastExpr = True + Continue + Else If sCar = "'" And If bSingleQuoteString Then + Highlight.Add(iState) + iState = Highlight.Normal + bLastExpr = True + Continue + Endif + + Endif + + Highlight.Add(iState) + + Next + + If iState = Highlight.Comment And If bSingleLineComment Then + iState = Highlight.Normal + Endif + + If iState <> Highlight.Comment And If iState <> Highlight.Help Then + iState = Highlight.Normal + Endif + + If bTestShowLimit Then + Highlight.ShowLimit = LTrim(sText) Begins "function " + Endif + + Highlight.State = iState + Highlight.Tag = iTag + +End diff --git a/comp/src/gb.eval.highlight/.src/OldHighlighter/HighlightSQL.module b/comp/src/gb.eval.highlight/.src/OldHighlighter/HighlightSQL.module new file mode 100644 index 00000000..5fada04d --- /dev/null +++ b/comp/src/gb.eval.highlight/.src/OldHighlighter/HighlightSQL.module @@ -0,0 +1,159 @@ +' Gambas module file + +Private Const IDENT_CAR As String = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_" + +Private $cDatatype As Collection +Private $cFunction As Collection +Private $cKeyword As Collection +Private $cOperator As Collection + +Private Sub LoadFile(sPath As String) As Collection + + Dim sWord As String + Dim cCol As New Collection(gb.IgnoreCase) + + For Each sWord In Split(File.Load(sPath), "\n", "", True) + cCol[sWord] = True + Next + Return cCol + +End + + +Public Sub _init() + + $cDatatype = LoadFile("sql/datatypes") + $cFunction = LoadFile("sql/functions") + $cKeyword = LoadFile("sql/keywords") + $cOperator = LoadFile("sql/operators") + +End + +Private Sub CheckWord(sWord As String) As Integer + + If $cKeyword.Exist(sWord) Then Return Highlight.Keyword + If $cOperator.Exist(sWord) Then Return Highlight.Operator + If $cFunction.Exist(sWord) Then Return Highlight.Function + If $cDatatype.Exist(sWord) Then Return Highlight.DataType + Return Highlight.Normal + +End + + + +Public Sub Run() + + Dim iState As Integer + Dim iTag As Integer + Dim sText As String + Dim iLenText As Integer + Dim iPos As Integer + Dim sCar As String + Dim sWait As String + Dim iLen As Integer + + iState = Highlight.State + iTag = Highlight.Tag + sText = Highlight.Text + iLenText = String.Len(sText) + + For iPos = 1 To iLenText + + sCar = String.Mid$(sText, iPos, 1) + + Select Case iState + + Case Highlight.Normal + + If Len(sCar) > 1 Then + Highlight.Add(Highlight.Error) + Else If Asc(sCar) < 33 Then + Highlight.Add(iState) + Else If sCar = "#" Or If String.Mid$(sText, iPos, 2) = "--" Then + Highlight.Add(Highlight.Comment, iLenText - iPos + 1) + Break + Else If String.Mid$(sText, iPos, 2) = "/*" Then + iState = Highlight.Comment + Highlight.Add(iState) + Else If sCar = "'" Or If sCar = "\"" Then + iState = Highlight.String + Highlight.Add(iState) + sWait = sCar + Else If sCar = "`" Then + iState = Highlight.Symbol + Highlight.Add(iState) + sWait = sCar + Else + iLen = Helper.ReadNumber(sText, iPos) + If iLen > 0 Then + Highlight.Add(Highlight.Number, iLen) + iPos += iLen - 1 + Continue + Endif + + iLen = Helper.ReadIdentifier(sText, iPos, IDENT_CAR) + If InStr(IDENT_CAR, String.Mid$(sText, iPos, 1)) Then + iState = CheckWord(String.Mid$(sText, iPos, iLen)) + Else + While iLen > 0 + iState = CheckWord(String.Mid$(sText, iPos, iLen)) + If iState <> Highlight.Normal Then Break + Dec iLen + Wend + Endif + + If iLen > 0 Then + If iState <> Highlight.Normal Then + Highlight.Add(iState, iLen) + iPos += iLen - 1 + iState = Highlight.Normal + Continue + Else + Highlight.Add(Highlight.Symbol, iLen) + iPos += iLen - 1 + Continue + Endif + Endif + + Highlight.Add(Highlight.Error) + + Endif + + Case Highlight.Symbol + + Highlight.Add(iState) + If sCar = sWait Then + iState = Highlight.Normal + Endif + + Case Highlight.Comment + + Highlight.Add(iState) + If String.Mid$(sText, iPos, 2) = "*/" Then + Highlight.Add(iState) + Inc iPos + iState = Highlight.Normal + Endif + + Case Highlight.String + + Highlight.Add(iState) + If sCar = "\\" Then + Highlight.Add(iState) + Inc iPos + Else If sCar = sWait Then + iState = Highlight.Normal + Endif + + End Select + + Next + + 'If bTestShowLimit Then + ' Highlight.ShowLimit = LTrim(sText) Begins "function " + 'Endif + + Highlight.State = iState + Highlight.Tag = iTag + +End diff --git a/comp/src/gb.eval.highlight/.src/TextHighlighter.class b/comp/src/gb.eval.highlight/.src/TextHighlighter.class new file mode 100644 index 00000000..b2c4c003 --- /dev/null +++ b/comp/src/gb.eval.highlight/.src/TextHighlighter.class @@ -0,0 +1,789 @@ +' Gambas class file + +Export + +Create Static +Create Private + +Class Paint +Class Color + +Static Public Const Name As String = "" + +Static Property Read DefaultStyle As TextHighlighterStyle[] + +Static Public _Highlight As Byte[] +Static Public (Line) As Integer +Static Public State As Integer +Static Public Tag As Integer +Static Public TextAfter As String +Static Public Alternate As Boolean +Static Public Limit As Boolean +Static Public Comment As Boolean + +Static Private $aStyle As TextHighlighterStyle[] + +Static Public Sub Add((State) As Integer, Optional Count As Integer = 1) + + Dim iState As Integer + Dim I As Integer + + iState = State + If Alternate Then iState += 128 + + If _Highlight.Count = 0 Or If _Highlight[_Highlight.Max - 1] <> iState Or If _Highlight[_Highlight.Max] > (255 - Count) Then + For I = 1 To Count \ 255 + _Highlight.Add(iState) + _Highlight.Add(255) + Next + Count = Count % 255 + _Highlight.Add(iState) + _Highlight.Add(Count) + Else + _Highlight[_Highlight.Max] += Count + Endif + + TextHighlighter.State = State + +End + +' Static Public Sub Remove(Count As Integer) +' +' Dim N As Integer +' +' Do +' +' If Count = 0 Or If _Highlight.Count = 0 Then Return +' +' N = Min(Count, _Highlight[_Highlight.Max]) +' If N = _Highlight[_Highlight.Max] Then +' _Highlight.Delete(_Highlight.Max - 1, 2) +' Else +' _Highlight[_Highlight.Max] -= N +' Endif +' Count -= N +' +' Loop +' +' End + +Static Public Sub _get(Type As String) As TextHighlighter + + Try Return Class.Load("TextHighlighter_" & Type).AutoCreate() + Error.Raise("Cannot load highlighter: '" & Type & "'") + +End + +Public Sub Run((Text) As String) + +End + +Public Sub GetKeywords() As String[] + +End + +Public Sub ToHTML(Text As String, Optional Styles As TextHighlighterStyle[]) As String + + Dim aResult As New String[] + Dim sLine As String + Dim aHighlight As Byte[] + Dim Y As Integer + Dim I As Integer + Dim sHTML As String + Dim aText As String[] + Dim iState As Integer + Dim hStyle As TextHighlighterStyle + Dim bAlt As Boolean + Dim iLen As Integer + Dim P As Integer + Dim sLineHtml As String + Dim iColor As Integer + Dim sOldStyle As String + Dim sStyle As String + + If Not Styles Then Styles = TextHighlighter.DefaultStyle + + TextHighlighter.State = Highlight.Normal + TextHighlighter.Tag = 0 + TextHighlighter.Alternate = False + TextHighlighter.Limit = False + + aText = Split(Text, "\n") + + iColor = 0 + aResult.Add("
        ")
        +  sOldStyle = "color:#000000;"
        +  
        +  For Y = 0 To aText.Max
        +    
        +    aHighlight = New Byte[]
        +    
        +    TextHighlighter._Highlight = aHighlight
        +    TextHighlighter.TextAfter = ""
        +    TextHighlighter.Line = Y
        +    
        +    sLine = aText[Y]
        +    Me.Run(sLine)
        +    If Y = 0 Then TextHighlighter.Limit = False
        +    
        +    If TextHighlighter.TextAfter Then sLine = TextHighlighter.TextAfter
        +
        +    sLineHtml = ""
        +    P = 1
        +    
        +    For I = 0 To aHighlight.Max Step 2
        +      
        +      iState = aHighlight[I] And 31
        +      Try hStyle = Styles[iState]
        +      If Error Then hStyle = Styles[0]
        +      bAlt = aHighlight[I] >= 128
        +      iLen = aHighlight[I + 1]
        +      
        +      sHtml = Replace(Html(String.Mid$(sLine, P, iLen)), " ", " ")
        +      P += iLen
        +      
        +      If hStyle.Bold Then sHtml = "" & sHtml & ""
        +      If hStyle.Underline Then sHtml = "" & sHtml & ""
        +      
        +      sStyle = ""
        +      If bAlt Then sStyle &= "background:#" & Hex$(Styles[Highlight.Alternate], 6) & ";"
        +      If hStyle.Color Then sStyle &= "color:#" & Hex$(hStyle.Color, 6) & ";"
        +      
        +      If sStyle <> sOldStyle Then
        +        sOldStyle = sStyle
        +        sHtml = "" & sHtml
        +      Endif
        +      
        +      sLineHtml &= sHtml
        +      
        +    Next
        +    
        +    If P < String.Len(sLine) Then sLineHtml &= Html(String.Mid$(sLine, P))
        +    
        +    ' If TextHighlighter.Limit Then 
        +    '   If Y And If Not Trim(aResult[aResult.Max]) Then
        +    '     aResult.Add("
        ") + ' Else + ' aResult.Add("
        ") + ' Endif + ' Endif + + aResult.Add(sLineHtml & "\n") + + Next + + aResult.Add("
        ") + + Return aResult.Join("") + + End + + +Static Private Function DefaultStyle_Read() As TextHighlighterStyle[] + + If Not $aStyle Then + + $aStyle = New TextHighlighterStyle[32] + + $aStyle[Highlight.Background] = TextHighlighterStyle(&HFFFFFF&) + $aStyle[Highlight.Normal] = TextHighlighterStyle(&H000000&) + $aStyle[Highlight.Keyword] = TextHighlighterStyle(&H000000&, True) + $aStyle[Highlight.Datatype] = TextHighlighterStyle(&HDF6B00&, True) + $aStyle[Highlight.Function] = TextHighlighterStyle(&H3398C3&, True) + $aStyle[Highlight.Operator] = TextHighlighterStyle(&H000000&, True) + $aStyle[Highlight.Symbol] = TextHighlighterStyle(&H000000&) + $aStyle[Highlight.Number] = TextHighlighterStyle(&HFF0000&, True) + $aStyle[Highlight.String] = TextHighlighterStyle(&H7F0000&) + $aStyle[Highlight.Comment] = TextHighlighterStyle(&H888888&, False) + $aStyle[Highlight.Help] = TextHighlighterStyle(&H888888&, True) + $aStyle[Highlight.Preprocessor] = TextHighlighterStyle(&H006E28&, True) + $aStyle[Highlight.Breakpoint] = TextHighlighterStyle(&HFF5F5F&) + $aStyle[Highlight.Current] = TextHighlighterStyle(&H42C9FF&) + $aStyle[Highlight.Selection] = TextHighlighterStyle(&HC3EDFF&) + $aStyle[Highlight.Highlight] = TextHighlighterStyle(&H7FFF00&) + $aStyle[Highlight.CurrentLine] = TextHighlighterStyle(&HE7F3FF&) + $aStyle[Highlight.Error] = TextHighlighterStyle(&HBF0303&, False, True) + $aStyle[Highlight.Escape] = TextHighlighterStyle(&H7F0000&, False, True) + $aStyle[Highlight.Label] = TextHighlighterStyle(&H000000&, False, True) + $aStyle[Highlight.Constant] = TextHighlighterStyle(&HA00000&, True) + $aStyle[Highlight.Alternate] = TextHighlighterStyle(&HA00000&, True) + + Endif + + Return $aStyle.Copy() + +End + +Public Sub ToRichText(Text As String, Optional Styles As TextHighlighterStyle[]) As String + + Dim aResult As New String[] + Dim sLine As String + Dim aHighlight As Byte[] + Dim Y As Integer + Dim I As Integer + Dim sHTML As String + Dim aText As String[] + Dim iState As Integer + Dim hStyle As TextHighlighterStyle + Dim bAlt As Boolean + Dim iLen As Integer + Dim P As Integer + Dim sLineHtml As String + Dim iColor As Integer + Dim sOldStyle As String + Dim sStyle As String + + If Not Styles Then Styles = TextHighlighter.DefaultStyle + + TextHighlighter.State = Highlight.Normal + TextHighlighter.Tag = 0 + TextHighlighter.Alternate = False + TextHighlighter.Limit = False + + aText = Split(Text, "\n") + + iColor = 0 + aResult.Add("") + sOldStyle = "color=\"#000000\"" + + For Y = 0 To aText.Max + + aHighlight = New Byte[] + + TextHighlighter._Highlight = aHighlight + TextHighlighter.TextAfter = "" + TextHighlighter.Line = Y + + sLine = aText[Y] + Me.Run(sLine) + If Y = 0 Then TextHighlighter.Limit = False + + If TextHighlighter.TextAfter Then sLine = TextHighlighter.TextAfter + + sLineHtml = "" + P = 1 + + For I = 0 To aHighlight.Max Step 2 + + iState = aHighlight[I] And 31 + Try hStyle = Styles[iState] + If Error Then hStyle = Styles[0] + bAlt = aHighlight[I] >= 128 + iLen = aHighlight[I + 1] + + sHtml = Replace(Html(String.Mid$(sLine, P, iLen)), " ", " ") + P += iLen + + If hStyle.Bold Then sHtml = "" & sHtml & "" + If hStyle.Underline Then sHtml = "" & sHtml & "" + + sStyle = "" + 'If bAlt Then sStyle &= "background:#E0E0E0;" + If hStyle.Color Then sStyle &= " color=\"#" & Hex$(hStyle.Color, 6) & "\"" + + If sStyle <> sOldStyle Then + sOldStyle = sStyle + sHtml = "" & sHtml + Endif + + sLineHtml &= sHtml + + Next + + If P < String.Len(sLine) Then sLineHtml &= Html(String.Mid$(sLine, P)) + + ' If TextHighlighter.Limit Then + ' If Y And If Not Trim(aResult[aResult.Max]) Then + ' aResult.Add("
        ") + ' Else + ' aResult.Add("
        ") + ' Endif + ' Endif + + aResult.Add(sLineHtml & "\n") + + Next + + aResult.Add("
        ") + + Return aResult.Join("") + +End + +' Public Sub Paint(Text As String, X As Integer, Y As Integer, Optional Styles As TextHighlighterStyle[]) As String +' +' Dim sLine As String +' Dim aHighlight As Byte[] +' Dim Y As Integer +' Dim I As Integer +' Dim sHTML As String +' Dim aText As String[] +' Dim iState As Integer +' Dim hStyle As TextHighlighterStyle +' Dim bAlt As Boolean +' Dim iLen As Integer +' Dim P As Integer +' Dim sLineHtml As String +' Dim iColor As Integer +' Dim sOldStyle As String +' Dim sStyle As String +' Dim iLine As Integer +' +' If Not Styles Then Styles = TextHighlighter.DefaultStyle +' +' TextHighlighter.State = Highlight.Normal +' TextHighlighter.Tag = 0 +' TextHighlighter.Alternate = False +' TextHighlighter.Limit = False +' +' aText = Split(Text, "\n") +' +' iColor = 0 +' +' For iLine = 0 To aText.Max +' +' aHighlight = New Byte[] +' +' TextHighlighter._Highlight = aHighlight +' TextHighlighter.TextAfter = "" +' TextHighlighter.Line = iLine +' +' sLine = aText[iLine] +' Me.Run(sLine) +' If Y = 0 Then TextHighlighter.Limit = False +' +' If TextHighlighter.TextAfter Then sLine = TextHighlighter.TextAfter +' +' P = 1 +' +' For I = 0 To aHighlight.Max Step 2 +' +' iState = aHighlight[I] And 31 +' Try hStyle = Styles[iState] +' If Error Then hStyle = Styles[0] +' bAlt = aHighlight[I] >= 128 +' iLen = aHighlight[I + 1] +' +' sHtml = Replace(Html(String.Mid$(sLine, P, iLen)), " ", " ") +' P += iLen +' +' If hStyle.Bold Then sHtml = "" & sHtml & "" +' If hStyle.Underline Then sHtml = "" & sHtml & "" +' +' sStyle = "" +' 'If bAlt Then sStyle &= "background:#E0E0E0;" +' If hStyle.Color Then sStyle &= " color=\"#" & Hex$(hStyle.Color, 6) & "\"" +' +' If sStyle <> sOldStyle Then +' sOldStyle = sStyle +' sHtml = "" & sHtml +' Endif +' +' sLineHtml &= sHtml +' +' Next +' +' If P < String.Len(sLine) Then sLineHtml &= Html(String.Mid$(sLine, P)) +' +' ' If TextHighlighter.Limit Then +' ' If Y And If Not Trim(aResult[aResult.Max]) Then +' ' aResult.Add("
        ") +' ' Else +' ' aResult.Add("
        ") +' ' Endif +' ' Endif +' +' aResult.Add(sLineHtml & "\n") +' +' Next +' +' aResult.Add("") +' +' +' +' +' +' +' +' +' +' +' +' +' +' +' +' +' +' +' +' +' +' +' +' +' +' +' +' +' +' +' +' +' +' +' +' +' +' +' Dim I As Integer +' Dim hStyle As TextEditorStyle +' Dim bAlt As Boolean +' Dim iLen As Integer +' Dim P As Integer +' Dim sStr As String +' Dim X2 As Integer +' Dim iState As Integer +' Dim XMin As Integer +' Dim XMax As Integer +' Dim aStyle As TextEditorStyle[] +' Dim hImage As Image +' +' Dim XX, YY, XB, LB As Integer +' Dim hPos As Point +' Dim iNextBreak As Integer +' Dim iLayout As Integer +' Dim iRest As Integer +' Dim bBreak As Boolean +' Dim sKey As String +' Dim W As Integer +' Dim iLayoutCount As Integer +' Dim iCol As Integer +' Dim iBg As Integer +' +' Dim aText As String[] +' Dim iColor As Integer +' Dim iLine As Integer +' +' +' +' XMin = X + $hView.ScrollX +' XMax = XMin + $hView.ClientW +' aStyle = $hStyles._GetStyles() +' iBg = aStyle[iNextState].Background +' +' XX = X +' YY = Y +' +' If aLayout Then +' iLayoutCount = aLayout.Count +' iNextBreak = aLayout[0] +' Else +' iLayoutCount = 0 +' ' Always greater than String.Len(), and faster +' ' Add a big number in the case of an incorrect highlighting +' iNextBreak = Len(sText) + 1000000 +' Endif +' +' For I = 0 To aColor.Max Step 2 +' +' If Not aLayout Then +' If XX > XMax Then Break +' Endif +' +' iState = aColor[I] And 31 +' hStyle = aStyle[iState] +' bAlt = aColor[I] >= 128 +' If iRest Then +' iLen = iRest +' iRest = 0 +' Else +' iLen = aColor[I + 1] +' Endif +' +' If bBreak Then +' If iBg <> Color.Default Then Paint.FillRect(XX, YY, Paint.W, H, iBg) +' XX = X + LinePos(Row, P).X +' YY += H +' bBreak = False +' Endif +' +' If P + iLen >= iNextBreak Then +' +' bBreak = True +' +' iRest = P + iLen - iNextBreak +' iLen = iNextBreak - P +' +' Inc iLayout +' +' If iLayout < iLayoutCount Then +' iNextBreak += aLayout[iLayout] +' Else +' iNextBreak = Len(sText) + 1 +' Endif +' +' If iRest Then I -= 2 +' +' If iLen = 0 Then Goto NEXT_PATTERN +' +' Endif +' +' hPos = LinePos(Row, P + iLen) +' X2 = X + hPos.X 'LineWidth(Row, P + iLen) +' +' If Not aLayout Then +' If X2 < XMin Then Goto NEXT_PATTERN +' Endif +' +' iBg = hStyle.Background +' If iBg <> Color.Default Then Paint.FillRect(XX, YY, X2 - XX, H, iBg) +' If bAlt Then Paint.FillRect(XX, YY, X2 - XX, H, Color.SetAlpha(&HD0D0D0&, 192)) +' +' sStr = String.Mid$(sText, P + 1, iLen) +' ' If hStyle.Bold Then +' ' hTemp = New Image(X2 - X, H, Color.Transparent) +' ' Paint.Begin(hTemp) +' ' Paint.Font = $hFont +' ' Paint.Translate(- X, - Y) +' ' Endif +' +' 'If hStyle.Bold Then Paint.Font = $hFontBold +' If InStr(sStr, "\t") Then +' GoSub DRAW_TEXT_WITH_TAB +' Else If Trim(sStr) Then +' If Not $bRemoteDisplay And If iLen <= 16 Then +' sKey = Chr$(iState) & sStr +' hImage = $cCacheText[sKey] +' If Not hImage Then +' +' W = X2 - XX +' If W <= 0 Then W = TextWidth(sStr, 1, iLen) +' If hStyle.Bold Then W += ($BW + 1) \ 2 +' hImage = New Image(W, H, Color.Transparent) +' +' Paint.Begin(hImage) +' Paint.Font = $hFont +' Paint.Translate(- XX, - YY) +' GoSub DRAW_TEXT +' Paint.End +' +' If $cCacheText.Count > 256 Then +' For Each $cCacheText +' $cCacheText.Remove($cCacheText.Key) +' Break +' Next +' Endif +' +' Else +' +' $cCacheText.Remove(sKey) +' +' Endif +' +' $cCacheText[sKey] = hImage +' Paint.DrawImage(hImage, XX, YY) +' Else +' GoSub DRAW_TEXT +' Endif +' Endif +' 'If hStyle.Bold Then Paint.Font = $hFont +' +' ' If hStyle.Bold Then +' ' Paint.End +' ' 'hTemp.Save("~/temp.png") +' ' Paint.DrawImage(hTemp, X, Y) +' ' Paint.DrawImage(hTemp, X + 1, Y) +' ' Endif +' +' If hStyle.Underline Then +' Paint.FillRect(XX, YY + H - 1, X2 - XX, 1, Color.SetAlpha(hStyle.Color, 128)) +' Else If hStyle.Dotted Then +' Paint.Background = Color.SetAlpha(hStyle.Color, 128) +' Paint.LineWidth = 1 +' Paint.Dash = [1] +' Paint.MoveTo(XX, YY + H - 0.5) +' Paint.RelLineTo(X2 - XX, 0) +' Paint.Stroke +' Endif +' +' ' If $YM >= 0 Then +' ' If Row = $YMO And If $XMO >= P And If $XMO < (P + iLen) Then DrawMatch(SX, Y, H, $XMO, $YMO) +' ' If Row = $YM And If $XM >= P And If $XM < (P + iLen) Then DrawMatch(SX, Y, H, $XM, $YM) +' ' Endif +' +' NEXT_PATTERN: +' +' P += iLen +' XX = X2 +' +' Next +' +' sStr = String.Mid$(sText, P + 1) +' If sStr And If XX <= XMax Then +' +' Paint.Background = $iForeground +' DrawText(sStr, X, XX, YY) +' +' Endif +' +' If iBg <> Color.Default Then Paint.FillRect(XX, YY, Paint.W, H, iBg) +' +' Return +' +' DRAW_TEXT: +' +' iCol = hStyle.Color +' Paint.Background = iCol +' If hStyle.Bold Then +' LB = $BW +' XB = XX +' While LB >= 2 +' Paint.DrawText(sStr, XB, YY + $iAscent) 'DrawText(sStr, SX, X + 1, Y) +' Inc XB +' LB -= 2 +' Wend +' If LB Then +' Paint.Background = Color.SetAlpha(iCol, 128) +' Paint.DrawText(sStr, XB, YY + $iAscent) 'DrawText(sStr, SX, X + 1, Y) +' Endif +' Else +' Paint.DrawText(sStr, XX, YY + $iAscent) 'DrawText(sStr, SX, X, Y) +' Endif +' +' Return +' +' DRAW_TEXT_WITH_TAB: +' +' iCol = hStyle.Color +' Paint.Background = iCol +' If hStyle.Bold Then +' LB = $BW +' XB = 0 +' While LB >= 2 +' 'Paint.DrawText(sStr, XB, YY + $iAscent) 'DrawText(sStr, SX, X + 1, Y) +' DrawText(sStr, X + XB, XX + XB, YY) +' Inc XB +' LB -= 2 +' Wend +' If LB Then +' Paint.Background = Color.SetAlpha(iCol, 128) +' 'Paint.DrawText(sStr, XB, YY + $iAscent) 'DrawText(sStr, SX, X + 1, Y) +' DrawText(sStr, X + XB, XX + XB, YY) +' Endif +' Else +' 'Paint.DrawText(sStr, XX, YY + $iAscent) 'DrawText(sStr, SX, X, Y) +' DrawText(sStr, X, XX, YY) +' Endif +' +' ' If hStyle.Bold Then +' ' 'Paint.Background = Color.Gradient(iCol, $iBackground) +' ' DrawText(sStr, X, XX + 1, YY) +' ' Endif +' ' 'Paint.Background = iCol +' ' DrawText(sStr, X, XX, YY) +' Return +' +' +' End +' +' +' + +Public Sub Paint(Text As String, X As Float, Y As Float, Optional Styles As TextHighlighterStyle[]) As String + + Dim sLine As String + Dim aHighlight As Byte[] + Dim I As Integer + Dim aText As String[] + Dim iState As Integer + Dim hStyle As TextHighlighterStyle + Dim bAlt As Boolean + Dim iLen As Integer + Dim P As Integer + Dim iColor As Integer + Dim iLine As Integer + Dim sText As String + Dim XB As Integer + Dim fCharWidth As Float + Dim LH, BW As Integer + Dim LB As Integer + Dim X0 As Float + + fCharWidth = Paint._EstimateFixedFontCharWidth(Paint.Font) + LH = Paint.Font.Height + 1 + BW = 1 + LH \ 6 + + Y += Paint.Font.Ascent + X0 = X + + If Not Styles Then Styles = TextHighlighter.DefaultStyle + + TextHighlighter.State = Highlight.Normal + TextHighlighter.Tag = 0 + TextHighlighter.Alternate = False + TextHighlighter.Limit = False + + aText = Split(Text, "\n") + + For iLine = 0 To aText.Max + + aHighlight = New Byte[] + + TextHighlighter._Highlight = aHighlight + TextHighlighter.TextAfter = "" + TextHighlighter.Line = iLine + + sLine = aText[iLine] + Me.Run(sLine) + If Y = 0 Then TextHighlighter.Limit = False + + If TextHighlighter.TextAfter Then sLine = TextHighlighter.TextAfter + + P = 1 + + For I = 0 To aHighlight.Max Step 2 + + iState = aHighlight[I] And 31 + Try hStyle = Styles[iState] + If Error Then hStyle = Styles[0] + bAlt = aHighlight[I] >= 128 + iLen = aHighlight[I + 1] + + If fCharWidth Then + X = X0 + fCharWidth * (P - 1) + Else + X = X0 + Paint.Font.TextWidth(String.Left(sLine, P - 1)) + Endif + + sText = String.Mid$(sLine, P, iLen) + P += iLen + + iColor = hStyle.Color + Paint.Background = iColor + If hStyle.Bold Then + LB = BW + XB = X + While LB >= 2 + Paint.DrawText(sText, XB, Y) + Inc XB + LB -= 2 + Wend + If LB Then + Paint.Background = Color.SetAlpha(iColor, 128) + Paint.DrawText(sText, XB, Y) + Endif + Else + Paint.DrawText(sText, X, Y) + Endif + + Next + + If P < String.Len(sLine) Then Paint.DrawText(String.Mid$(sLine, P), X, Y) + + Y += LH + + Next + +End + diff --git a/comp/src/gb.eval.highlight/.src/TextHighlighterStyle.class b/comp/src/gb.eval.highlight/.src/TextHighlighterStyle.class new file mode 100644 index 00000000..7acbdb17 --- /dev/null +++ b/comp/src/gb.eval.highlight/.src/TextHighlighterStyle.class @@ -0,0 +1,20 @@ +' Gambas class file + +Export + +Public (Color) As Integer +Public Bold As Boolean +'Public Italic As Boolean +Public Underline As Boolean + +Static Public Sub _call((Color) As Integer, Optional (Bold) As Boolean, (Underline) As Boolean) As TextHighlighterStyle + + Dim hStyle As New TextHighlighterStyle + + hStyle.Color = Color + hStyle.Bold = Bold + hStyle.Underline = Underline + + Return hStyle + +End diff --git a/comp/src/gb.eval.highlight/.src/TextHighlighter_C.class b/comp/src/gb.eval.highlight/.src/TextHighlighter_C.class new file mode 100644 index 00000000..57e12cb3 --- /dev/null +++ b/comp/src/gb.eval.highlight/.src/TextHighlighter_C.class @@ -0,0 +1,282 @@ +' Gambas class file + +Inherits TextHighlighter + +Public Const Name As String = "c" + +Private Const IDENT_CAR As String = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_$" +Private Const DIGIT_CAR As String = "0123456789.+-eE" + +Static Private $cKeyword As New Collection +Static Private $cOperator As New Collection +Static Private $cType As New Collection +Static Private $aKeywords As String[] + +Static Public Sub _init() + + Dim sStr As String + + $aKeywords = New String[] + + For Each sStr In ["auto", "break", "case", "const", "continue", "default", "do", "else", "enum", "extern", "for", + "goto", "if", "register", "return", "sizeof", "static", "struct", "switch", "typedef", "union", "volatile", "while"] + $cKeyword[sStr] = 0 + $aKeywords.Add(sStr) + Next + + For Each sStr In ["FALSE", "NULL" "TRUE"] + $cKeyword[sStr] = 1 + $aKeywords.Add(sStr) + Next + + For Each sStr In ["{", "}", ".", ">=", "+", "<<", "!", "=", ">>=", ";", "==", "-", ">>", "~", "+=", "(", ",", "!=", "*", "&&", "-=", "&=", ")", "<", "%", "&", "||", "*=", "|=", "[", ">", "++", "|", "?", "%=", "^=", + "--", "^", ":", "<<=", "]", "<=", "/", "/="] + $cOperator[sStr] = True + Next + + For Each sStr In ["void", "signed", "unsigned", "char", "short", "int", "long", "float", "double", "int64_t", "uint64_t", "int32_t", "uint32_t", "int16_t", "uint16_t", "int8_t", "uint8_t", "uchar", "ushort", "uint", "ulong"] + $cType[sStr] = True + $aKeywords.Add(sStr) + Next + +End + +Public Sub GetKeywords() As String[] + + Return $aKeywords + +End + +Public Sub RunWith(sText As String, cKeyword As Collection, cOperator As Collection, cType As Collection) + + Dim iState As Integer + Dim iTag As Integer + Dim iLenText As Integer + Dim iPos, iSavePos As Integer + Dim sCar As String + Dim bSingleLineComment As Boolean + Dim bSingleQuoteString As Boolean + Dim sIdent As String + Dim iPosType, iPosIdent, iPosAfterIdent As Integer + Dim bLastExpr As Boolean + + iState = TextHighlighter.State + iTag = TextHighlighter.Tag + iLenText = String.Len(sText) + bLastExpr = True + If iState = Highlight.Operator Then bLastExpr = False + + If Left(LTrim(sText)) = "#" Or If iState = Highlight.Preprocessor Then + + TextHighlighter.Add(Highlight.Preprocessor, iLenText) + + If Right(RTrim(sText)) = "\\" Then + iState = Highlight.Preprocessor + Else + iState = Highlight.Normal + Endif + + Else + + For iPos = 1 To iLenText + + If iState = Highlight.Normal Then + + sCar = String.Mid$(sText, iPos, 1) + If sCar = "/" Then + sCar = String.Mid$(sText, iPos + 1, 1) + If sCar = "/" Then + iState = Highlight.Comment + bSingleLineComment = True + Else If sCar = "*" Then + sCar = String.Mid$(sText, iPos + 2, 1) + If sCar = "*" Then + iState = Highlight.Help + Else + iState = Highlight.Comment + Endif + bSingleLineComment = False + Endif + Else If sCar = "\"" Then + iState = Highlight.String + bSingleQuoteString = False + Else If sCar = "'" Then + iState = Highlight.String + bSingleQuoteString = True + Else If Asc(sCar) <= 32 Then + + Else If IsDigit(sCar) Then + + sIdent = sCar + sCar = String.Mid$(sText, iPos + 1, 1) + If sCar = "x" Or If sCar = "X" Then + sIdent &= sCar + Inc iPos + While iPos < iLenText + Inc iPos + sCar = String.Mid$(sText, iPos, 1) + If Not IsHexa(sCar) Then + Dec iPos + Break + Endif + sIdent &= sCar + Wend + Else + While iPos < iLenText + Inc iPos + sCar = String.Mid$(sText, iPos, 1) + If InStr(DIGIT_CAR, sCar) = 0 Then + Dec iPos + Break + Endif + sIdent &= sCar + Wend + Endif + + TextHighlighter.Add(Highlight.Number, String.Len(sIdent)) + iState = Highlight.Normal + bLastExpr = True + Continue + + Else If Len(sCar) >= 2 Or If InStr(IDENT_CAR, sCar) Then + + sIdent = sCar + iSavePos = iPos + + While iPos < iLenText + Inc iPos + sCar = String.Mid$(sText, iPos, 1) + If Len(sCar) = 1 And If Not IsDigit(sCar) And If InStr(IDENT_CAR, sCar) = 0 Then + Dec iPos + Break + Endif + sIdent &= sCar + Wend + + If cKeyword.Exist(sIdent) Then + iState = Highlight.Keyword + If cKeyword[sIdent] = 1 Then bLastExpr = True + Else If cType.Exist(sIdent) Then + iState = Highlight.Datatype + bLastExpr = True + If iPosType = 0 Then iPosType = iSavePos + Else + iState = Highlight.Symbol + If iPosAfterIdent = 0 Then + iPosIdent = iSavePos + iPosAfterIdent = iSavePos + String.Len(sIdent) + Endif + bLastExpr = True + Endif + + TextHighlighter.Add(iState, String.Len(sIdent)) + iState = Highlight.Normal + Continue + + Else + + sIdent = sCar + + While iPos < iLenText + If cOperator.Exist(sIdent) Then Break + Inc iPos + sCar = String.Mid$(sText, iPos, 1) + If IsLetter(sCar) Or If IsDigit(sCar) Or If IsBlank(sCar) Then + Dec iPos + Break + Endif + sIdent &= sCar + Wend + + If cOperator.Exist(sIdent) Then + iState = Highlight.Operator + Else + iState = Highlight.Error + Endif + + TextHighlighter.Add(iState, String.Len(sIdent)) + iState = Highlight.Normal + bLastExpr = False + + 'Dec iPos + Continue + + Endif + + Else If iState = Highlight.Comment Or If iState = Highlight.Help Then + + If Not bSingleLineComment Then + sCar = String.Mid$(sText, iPos, 2) + If sCar = "*/" Then + TextHighlighter.Add(iState, 2) + Inc iPos + iState = Highlight.Normal + Continue + Endif + Endif + + Else If iState = Highlight.String Then + + sCar = String.Mid$(sText, iPos, 1) + If sCar = "\\" Then + sCar = String.Mid$(sText, iPos + 1, 1) + If sCar = "x" Then + TextHighlighter.Add(iState, 3) + iPos += 2 + Continue + Else If sCar = "u" Then + TextHighlighter.Add(iState, 5) + iPos += 4 + Continue + Else + TextHighlighter.Add(iState, 2) + Inc iPos + Continue + Endif + Else If sCar = "\"" And If Not bSingleQuoteString Then + TextHighlighter.Add(iState) + iState = Highlight.Normal + bLastExpr = True + Continue + Else If sCar = "'" And If bSingleQuoteString Then + TextHighlighter.Add(iState) + iState = Highlight.Normal + bLastExpr = True + Continue + Endif + + Endif + + TextHighlighter.Add(iState) + + Next + + If iState = Highlight.Comment And If bSingleLineComment Then + iState = Highlight.Normal + Endif + + If iState <> Highlight.Comment And If iState <> Highlight.Help Then + iState = Highlight.Normal + Endif + + Endif + + TextHighlighter.Limit = False + If iPosIdent >= 1 And If Not IsSpace(Left(sText)) Then + If InStr(String.Mid$(sText, iPosAfterIdent), "(") Then + If RInStr(sText, ";") = 0 Then + TextHighlighter.Limit = True + Endif + Endif + Endif + + TextHighlighter.State = iState + TextHighlighter.Tag = iTag + +End + +Public Sub Run(Text As String) + + RunWith(Text, $cKeyword, $cOperator, $cType) + +End diff --git a/comp/src/gb.eval.highlight/.src/TextHighlighter_CPlusPlus.class b/comp/src/gb.eval.highlight/.src/TextHighlighter_CPlusPlus.class new file mode 100644 index 00000000..b0d7558a --- /dev/null +++ b/comp/src/gb.eval.highlight/.src/TextHighlighter_CPlusPlus.class @@ -0,0 +1,57 @@ +' Gambas class file + +Inherits TextHighlighter + +Public Const Name As String = "c++" + +Private Const IDENT_CAR As String = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_$" +Private Const DIGIT_CAR As String = "0123456789.+-eE" + +Static Private $cKeyword As New Collection +Static Private $cOperator As New Collection +Static Private $cType As New Collection +Static Private $aKeywords As String[] + +Static Public Sub _init() + + Dim sStr As String + + $aKeywords = New String[] + + For Each sStr In ["asm", "auto", "break", "case", "catch", "class", "const", "const_cast", "continue", "default", "delete", "do", "dynamic_cast", + "else", "enum", "explicit", "export", "extern", "for", "friend", "goto", "if", "inline", "mutable", "namespace", "new", "operator", + "private", "protected", "public", "register", "reinterpret_cast", "return", "sizeof", "static", "static_cast", "struct", "switch", + "template", "this", "throw", "try", "typedef", "typeid", "typename", "union", "using", "virtual", "volatile", "while"] + $cKeyword[sStr] = 0 + $aKeywords.Add(sStr) + Next + + For Each sStr In ["false", "null" "true", "FALSE", "TRUE", "NULL"] + $cKeyword[sStr] = 1 + $aKeywords.Add(sStr) + Next + + For Each sStr In ["{", "}", ".", ">=", "+", "<<", "!", "=", ">>=", ";", "==", "-", ">>", "~", "+=", "(", ",", "!=", "*", "&&", "-=", "&=", ")", "<", "%", "&", "||", "*=", "|=", "[", ">", "++", "|", "?", "%=", "^=", + "--", "^", ":", "<<=", "]", "<=", "/", "/="] + $cOperator[sStr] = True + Next + + For Each sStr In ["void", "bool", "signed", "unsigned", "char", "short", "int", "long", "float", "double", "int64_t", "uint64_t", "int32_t", + "uint32_t", "int16_t", "uint16_t", "int8_t", "uint8_t", "wchar_t"] + $cType[sStr] = True + $aKeywords.Add(sStr) + Next + +End + +Public Sub GetKeywords() As String[] + + Return $aKeywords + +End + +Public Sub Run(Text As String) + + TextHighlighter_C.RunWith(Text, $cKeyword, $cOperator, $cType) + +End diff --git a/comp/src/gb.eval.highlight/.src/TextHighlighter_CSS.class b/comp/src/gb.eval.highlight/.src/TextHighlighter_CSS.class new file mode 100644 index 00000000..71756d5e --- /dev/null +++ b/comp/src/gb.eval.highlight/.src/TextHighlighter_CSS.class @@ -0,0 +1,294 @@ +' Gambas class file + +Inherits TextHighlighter + +Public Const Name As String = "css" + +Static Private $cProp As New Collection +Static Private $aKeywords As String[] + +Static Public Sub _init() + + Dim sProp As String + Dim iPos As Integer + + $aKeywords = New String[] + + For Each sProp In Split(File.Load("css/properties"), ", \n", "", True) + iPos = InStr(sProp, " ") + If iPos Then sProp = Left(sProp, iPos - 1) + $cProp[sProp] = True + $aKeywords.Add(sProp) + Next + + For Each sProp In Split(File.Load("css/values"), ", \n", "", True) + sProp = Trim(sProp) + $aKeywords.Add(sProp) + Next + +End + +Public Sub GetKeywords() As String[] + + Return $aKeywords + +End + + +' Private Sub AnalyzeCode(sText As String) As String +' +' Dim iInd As Integer +' Dim iPos As Integer +' Dim iLen As Integer +' +' If Not sText Then Return +' +' Highlight.Analyze(sText, True) +' +' iPos = 0 +' For iInd = 0 To Highlight.Symbols.Max +' +' If iPos < Highlight.Positions[iInd] Then +' Highlight.Add(Highlight.Normal, Highlight.Positions[iInd] - iPos) +' iPos = Highlight.Positions[iInd] +' Endif +' +' iLen = String.Len(Highlight.Symbols[iInd]) +' Highlight.Add(Highlight.Types[iInd], iLen) +' iPos += iLen +' +' Next +' +' If iPos < String.Len(Highlight.TextAfter) Then +' Highlight.Add(Highlight.Normal, String.Len(Highlight.TextAfter) - iPos) +' Endif +' +' Return Highlight.TextAfter +' +' End + +Public Sub Run(sText As String) + + Dim iState As Integer + Dim iNextState As Integer + Dim iInd As Integer + Dim sOrgText As String + Dim sCar As String + Dim bLimit As Boolean + Dim iTag As Integer + Dim sProperty As String + Dim sWait As String + Dim iSaveState As Integer + Dim iPos, iPos2 As Integer + Dim bEscape As Boolean + Dim N As Integer + + iState = TextHighlighter.State + If iState = Highlight.Normal Then iState = Highlight.Keyword + iTag = TextHighlighter.Tag + sOrgText = sText + iNextState = iState + + For iInd = 1 To String.Len(sText) + + iNextState = iState + sCar = String.Mid$(sText, iInd, 1) + + If bEscape Then + + If IsHexa(sCar) And If N < 6 Then + Inc N + Goto NEXT_STATE + Else + bEscape = False + Goto NEXT_STATE + Endif + + Endif + + If sCar = "\\" Then + bEscape = True + N = 0 + Goto NEXT_STATE + Endif + + Select Case iState + + Case Highlight.String + If sCar = sWait Then iNextState = iSaveState + Goto NEXT_STATE + + Case Highlight.Comment + If sCar = "/" And If iInd > 1 And If String.Mid$(sText, iInd - 1, 1) = "*" Then + iNextState = iTag + Endif + Goto NEXT_STATE + + Case Highlight.Preprocessor + If sCar = "{" Then + iState = Highlight.Keyword + iNextState = Highlight.Keyword + bLimit = True + Endif + Goto NEXT_STATE + + Case Else + + If sCar = "/" And If Mid$(sText, iInd, 2) = "/*" Then + iTag = iState + iState = Highlight.Comment + iNextState = iState + Goto NEXT_STATE + Else If TextHighlighter_Html.AllowCode And If sCar = "<" And If Mid$(sText, iInd, 2) = "<%" Then + TextHighlighter_Html.MeetCodeAt = iInd + Break + Endif + + End Select + + Select Case iState + + Case Highlight.Keyword, Highlight.Datatype, Highlight.Function, Highlight.Operator + + If sCar = "." Then + + iState = Highlight.Datatype + iNextState = iState + + Else If sCar = "#" Then + + iState = Highlight.Function + iNextState = iState + + Else If InStr("():", sCar) Then + + iState = Highlight.Operator + iNextState = iState + + Else If IsSpace(sCar) Then + + iState = Highlight.Keyword + iNextState = iState + + Else If sCar = "{" Then + + iState = Highlight.Keyword + iNextState = Highlight.Symbol + iTag = Highlight.Symbol + bLimit = True + + Else If sCar = "@" Then + + iState = Highlight.Preprocessor + iNextState = iState + bLimit = True + + Endif + + Case Highlight.Symbol + + If sCar = "." Then + + iState = Highlight.Datatype + iNextState = iState + + Else If InStr(":()", sCar) Then + + iState = Highlight.Keyword + iNextState = Highlight.Number + + Else If sCar = "}" Then + + iState = Highlight.Keyword + iNextState = Highlight.Keyword + iTag = Highlight.Keyword + + Else If IsSpace(sCar) Then + + iState = Highlight.Symbol + iNextState = iState + + Else + + sProperty = String.Mid$(sText, iInd) + + iPos = String.InStr(sProperty, ":") + iPos2 = String.InStr(sProperty, "/*") + + If iPos = 0 Then iPos = String.Len(sProperty) + If iPos2 = 0 Then iPos2 = String.Len(sProperty) + iPos = Min(iPos, iPos2) + + Dec iPos + sProperty = String.Left$(sProperty, iPos) + + If Not sProperty Then Goto NEXT_STATE + + If sProperty Then + If $cProp.Exist(sProperty) Then + TextHighlighter.Add(Highlight.Symbol, iPos) + Else If sProperty Begins "-" And If sProperty Like "-*-*" Then + TextHighlighter.Add(Highlight.Symbol, iPos) + Else + TextHighlighter.Add(Highlight.Error, iPos) + Endif + Else + TextHighlighter.Add(Highlight.Symbol, iPos) + Endif + iInd += iPos - 1 + Continue + + Endif + + Case Highlight.Number + + If sCar = Chr$(34) Or If sCar = "'" Then + + iSaveState = iState + sWait = sCar + iState = Highlight.String + iNextState = iState + + Else If sCar = ";" Then + + iState = Highlight.Keyword + iNextState = Highlight.Symbol + + Else If sCar = "}" Then + + iState = Highlight.Keyword + iNextState = Highlight.Keyword + iTag = Highlight.Keyword + + ' Else If sCar = "#" Then + ' + ' iState = Highlight.Preprocessor + ' iNextState = iState + + Endif + + Case Highlight.Preprocessor + + If Not IsHexa(sCar) Then + iState = Highlight.Number + iNextState = iState + Dec iInd + Continue + Endif + + End Select + + NEXT_STATE: + + TextHighlighter.Add(iState) + iState = iNextState + + Next + + If iNextState = Highlight.String Then iNextState = iSaveState + + TextHighlighter.State = iNextState + TextHighlighter.Tag = iTag + TextHighlighter.Limit = bLimit + +End diff --git a/comp/src/gb.eval.highlight/.src/TextHighlighter_Diff.class b/comp/src/gb.eval.highlight/.src/TextHighlighter_Diff.class new file mode 100644 index 00000000..4f9802dc --- /dev/null +++ b/comp/src/gb.eval.highlight/.src/TextHighlighter_Diff.class @@ -0,0 +1,35 @@ +' Gambas class file + +Inherits TextHighlighter + +Public Const Name As String = "diff" + +Public Sub Run(sText As String) + + Dim iState As Integer + + TextHighlighter.Limit = False + + If Left$(sText, 6) = "Index:" Or Left$(sText, 4) = "diff" Then + iState = Highlight.Keyword + TextHighlighter.Limit = True + Else If Left(sText, 3) = "===" Then + iState = Highlight.Keyword + Else If Left(sText, 3) = "+++" Then + iState = Highlight.Operator + Else If Left(sText, 3) = "---" Then + iState = Highlight.Operator + Else If Left(sText) = "+" Then + iState = Highlight.Number + Else If Left(sText) = "-" Then + iState = Highlight.String + Else If Left(sText) = "@" Then + iState = Highlight.Comment + TextHighlighter.Limit = True + Else + iState = Highlight.Normal + Endif + + TextHighlighter.Add(iState, String.Len(sText)) + +End diff --git a/comp/src/gb.eval.highlight/.src/TextHighlighter_Gambas.class b/comp/src/gb.eval.highlight/.src/TextHighlighter_Gambas.class new file mode 100644 index 00000000..0f36cda7 --- /dev/null +++ b/comp/src/gb.eval.highlight/.src/TextHighlighter_Gambas.class @@ -0,0 +1,78 @@ +' Gambas class file + +Inherits TextHighlighter + +Public Const Name As String = "gambas" + +Class Highlight + +Static Public Sub _init() + + Component.Load("gb.eval") + +End + +Public Sub GetKeywords() As String[] + + Return System.Keywords + +End + +Private Sub IsProc() As Boolean + + Dim aSym As String[] + Dim I As Integer + Dim sSym As String + + aSym = Highlight.Symbols + + For I = 0 To aSym.Max + sSym = aSym[I] + If sSym == "PRIVATE" Or If sSym == "PUBLIC" Or If sSym == "STATIC" Or If sSym == "FAST" Then Continue + If sSym == "SUB" Or If sSym == "PROCEDURE" Or If sSym == "FUNCTION" Then + Return True + Else + Return False + Endif + Next + +End + +Public Sub Run(Text As String) + + Dim iState As Integer + Dim iTag As Integer + Dim iPos As Integer + Dim I As Integer + Dim iLen As Integer + + iState = TextHighlighter.State + iTag = TextHighlighter.Tag + + Highlight.Analyze(Text, True) + TextHighlighter.Limit = IsProc() + TextHighlighter.Comment = Left(LTrim(Text)) = "'" + + iPos = 0 + For I = 0 To Highlight.Symbols.Max + + If iPos < Highlight.Positions[I] Then + TextHighlighter.Add(Highlight.Normal, Highlight.Positions[I] - iPos) + iPos = Highlight.Positions[I] + Endif + + iLen = String.Len(Highlight.Symbols[I]) + TextHighlighter.Add(Highlight.Types[I], iLen) + iPos += iLen + + Next + + If iPos < String.Len(Highlight.TextAfter) Then + TextHighlighter.Add(Highlight.Normal, String.Len(Highlight.TextAfter) - iPos) + Endif + + TextHighlighter.State = iState + TextHighlighter.Tag = iTag + TextHighlighter.TextAfter = Highlight.TextAfter + +End diff --git a/comp/src/gb.eval.highlight/.src/TextHighlighter_Html.class b/comp/src/gb.eval.highlight/.src/TextHighlighter_Html.class new file mode 100644 index 00000000..2cf8e89c --- /dev/null +++ b/comp/src/gb.eval.highlight/.src/TextHighlighter_Html.class @@ -0,0 +1,562 @@ +' Gambas class file + +Inherits TextHighlighter + +Public Const Name As String = "html" + +Static Public MeetCodeAt As Integer +Static Public AllowCode As Boolean + +Public Const STYLE_HTML As Integer = 1 +Public Const STYLE_WEB As Integer = 2 + +Private Const TAG_HTML As Integer = 0 +Private Const TAG_COMMENT As Integer = 1 +Private Const TAG_SCRIPT As Integer = 2 +Private Const TAG_STYLE As Integer = 3 + +Private Const TAG_CODE As Integer = 16 +Private Const TAG_CODE_COMMENT As Integer = 32 + +Private Const TAG_NEXT_LIMIT As Integer = 64 + +Private Enum TAG_VARIABLE, TAG_CODE_MARKUP + +Static Private $sTextAfter As String +Static Private $sBufferAfter As String + +Static Private $aStateStack As Integer[] + +' TODO: call TextHighlighter_Gambas ! + +Private Sub AnalyzeCode(sText As String) As String + + Dim iInd As Integer + Dim iPos As Integer + Dim iLen As Integer + Dim iState As Integer + Dim iTag As Integer + + 'Print "AnalyzeCode: "; sText + + If Not sText Then Return + + iState = TextHighlighter.State + iTag = TextHighlighter.Tag + + Highlight.Analyze(sText, True) + + iPos = 0 + For iInd = 0 To Highlight.Symbols.Max + + If iPos < Highlight.Positions[iInd] Then + TextHighlighter.Add(Highlight.Normal, Highlight.Positions[iInd] - iPos) + iPos = Highlight.Positions[iInd] + Endif + + iLen = String.Len(Highlight.Symbols[iInd]) + TextHighlighter.Add(Highlight.Types[iInd], iLen) + iPos += iLen + + Next + + If iPos < String.Len(Highlight.TextAfter) Then + TextHighlighter.Add(Highlight.Normal, String.Len(Highlight.TextAfter) - iPos) + Endif + + TextHighlighter.State = iState + TextHighlighter.Tag = iTag + + Return Highlight.TextAfter + +End + +' Private Sub IsMarkup(sStr As String, iPos As Integer, sMarkup As String) As Boolean +' +' Dim sTest As String = String.Mid$(sStr, iPos, Len(sMarkup)) +' +' If sTest = sMarkup Or If sTest = (Left(sMarkup, -1) & " ") Then Return True +' +' End + +Private Sub Add(sText As String, iState As Integer) + + $sBufferAfter &= sText + TextHighlighter.Add(iState, String.Len(sText)) + If Len($sBufferAfter) > 1024 Then + $sTextAfter &= $sBufferAfter + $sBufferAfter = "" + Endif + +End + +Private Sub RunWith(Text As String, iStyle As Integer) + + Dim iState As Integer + Dim iTag, iTagCode, iTagMode As Integer + Dim sText As String + Dim I, iLenText As Integer + Dim sCar As String + Dim iPos As Integer + Dim iNextState As Integer + Dim bLimit, bNextLimit As Boolean + Dim sQuote As String + Dim sMarkup As String + Dim bClose As Boolean + Dim iStart As Integer + Dim bMarkup As Boolean + Dim sHighlightText As String + + 'Print " "; Bin$(Highlight.Tag, 16);; Highlight.Text + + AllowCode = iStyle = STYLE_WEB + + iState = TextHighlighter.State + + iTag = TextHighlighter.Tag And &HF + iTagCode = TextHighlighter.Tag And &H30 + bLimit = TextHighlighter.Tag And TAG_NEXT_LIMIT + iTagMode = Shr(TextHighlighter.Tag, 8) + + sText = Text + iLenText = String.Len(sText) + sHighlightText = sText + + $sTextAfter = "" + $sBufferAfter = "" + + I = 1 + + If iTagCode Then + On Shr(iTagCode, 4) Goto STATE_HTML, STATE_CODE, STATE_CODE_COMMENT + Else + iTagMode = 0 + iTagCode = 0 + TextHighlighter.Alternate = False + On iTag Goto STATE_HTML, STATE_COMMENT, STATE_SCRIPT, STATE_STYLE + Endif + +STATE_HTML: + + iTagMode = 0 + iTagCode = 0 + TextHighlighter.Alternate = False + + Do + GoSub NEXT_CHAR + + If sCar = "<" Then + If String.Mid$(sText, I, 3) = "!--" Then + Add("", I) + If iPos = 0 Then + Add(String.Mid$(sText, I), Highlight.Comment) + iNextState = Highlight.Comment + Goto END_TEXT + Else + Add(String.Mid$(sText, I, iPos - I + 3), Highlight.Comment) + I = iPos + 3 + iTag = TAG_HTML + Goto STATE_HTML + Endif + +STATE_MARKUP: + + sMarkup = "" + bClose = False + + 'If IsMarkup(sText, I, "style") Or If IsMarkup(sText, I, "script") Then + ' Highlight.AlternateState = True + 'Endif + + Add("<", Highlight.Keyword) + + iState = Highlight.Keyword + bMarkup = True + Do + + GoSub NEXT_CHAR + + If sCar = ">" Then + Add(">", Highlight.Keyword) + Break + Else If sCar = "/" And If String.Mid$(sText, I, 1) = ">" Then + bClose = True + Add("/>", Highlight.Keyword) + Inc I + Break + Else If sCar = " " Then + Add(" ", iState) + iState = Highlight.Keyword + bMarkup = False + Continue + Else If sCar = "=" Then + Add("=", Highlight.Keyword) + iState = Highlight.String + Continue + Else If sCar = Chr$(34) Or If sCar = "'" Then + GoSub READ_STRING + Continue + Endif + + If bMarkup Then sMarkup &= sCar + Add(sCar, iState) + + Loop + + If Not bClose Then + If sMarkup = "script" Then + iTag = TAG_SCRIPT + iTagMode = 0 + TextHighlighter.State = Highlight.Normal + bLimit = True + Goto STATE_SCRIPT + Else If sMarkup = "style" Then + iTag = TAG_STYLE + iTagMode = 0 + TextHighlighter.State = Highlight.Normal + bLimit = True + Goto STATE_STYLE + ' Else If sMarkup = "html" Or If sMarkup = "body" Or If sMarkup = "head" Then + ' bLimit = True + ' Else If sMarkup = "/html" Or If sMarkup = "/body" Or If sMarkup = "/head" Then + ' bNextLimit = True + Endif + Endif + Goto STATE_HTML + +STATE_DOUBLE_MARKUP: + + Add("<<", Highlight.Preprocessor) + Inc I + + iState = Highlight.Preprocessor + Do + + GoSub NEXT_CHAR + + If sCar = ">" And If String.Mid$(sText, I, 1) = ">" Then + Add(">>", Highlight.Preprocessor) + Inc I + Break + Else If sCar = " " Then + Add(" ", iState) + iState = Highlight.Preprocessor + Continue + Else If sCar = "=" Then + Add("=", Highlight.Preprocessor) + iState = Highlight.String + Continue + Else If sCar = Chr$(34) Or If sCar = "'" Then + GoSub READ_STRING + Continue + Endif + + 'If iState = Highlight.Keyword Then sMarkup &= sCar + Add(sCar, iState) + + Loop + + Goto STATE_HTML + +READ_SCRIPT: + + sText = sHighlightText + While sText + MeetCodeAt = 0 + TextHighlighter_Javascript.Run(sHighlightText) + If MeetCodeAt = 0 Then + $sBufferAfter &= sText + Break + Endif + $sBufferAfter &= String.Left(sText, MeetCodeAt - 1) + + I = MeetCodeAt + 2 + sMarkup = "<%" + GoSub READ_CODE + + sText = String.Mid$(sText, I) + sHighlightText = sText + Wend + + Return + +STATE_SCRIPT: + + TextHighlighter.Tag = iTagMode + + iPos = String.InStr(sText, "", I) + If iPos = 0 Then + sHighlightText = String.Mid$(sText, I) + GoSub READ_SCRIPT + iNextState = TextHighlighter.State + iTagMode = TextHighlighter.Tag + Goto END_TEXT + Else + If iPos > I Then + sHighlightText = String.Mid$(sText, I, iPos - I) + GoSub READ_SCRIPT + Endif + Add("", Highlight.Keyword) + iTag = TAG_HTML + I = iPos + 9 + bNextLimit = True + Goto STATE_HTML + Endif + +READ_STYLE: + + sText = sHighlightText + While sText + MeetCodeAt = 0 + TextHighlighter_CSS.Run(sHighlightText) + If MeetCodeAt = 0 Then + $sBufferAfter &= sText + Break + Endif + $sBufferAfter &= String.Left(sText, MeetCodeAt - 1) + + sMarkup = "<%" + I = MeetCodeAt + 2 + GoSub READ_CODE + + sText = String.Mid$(sText, I) + sHighlightText = sText + Wend + + Return + +STATE_STYLE: + + TextHighlighter.Tag = iTagMode + + iPos = String.InStr(sText, "", I) + If iPos = 0 Then + sHighlightText = String.Mid$(sText, I) + GoSub READ_STYLE + iNextState = TextHighlighter.State + iTagMode = TextHighlighter.Tag + Goto END_TEXT + Else + If iPos > I Then + sHighlightText = String.Mid$(sText, I, iPos - I) + GoSub READ_STYLE + Endif + Add("", Highlight.Keyword) + iTag = TAG_HTML + I = iPos + 8 + bNextLimit = True + Goto STATE_HTML + Endif + +STATE_CODE: + + 'Print "**** STATE_CODE" + sMarkup = "" + GoSub READ_CODE + + If I > iLenText Then + Goto END_TEXT + Else + Goto STATE_HTML + Endif + +STATE_CODE_COMMENT: + + GoSub READ_CODE_COMMENT + If I > iLenText Then + Goto END_TEXT + Else + Goto STATE_HTML + Endif + +READ_STRING: + + sQuote = sCar + Add(sQuote, Highlight.String) + Do + GoSub NEXT_CHAR + Add(sCar, Highlight.String) + If sCar = sQuote Then Break + If sCar = "\\" Then + GoSub NEXT_CHAR + Add(sCar, Highlight.String) + Endif + Loop + Return + +IGNORE_STRING: + + sQuote = sCar + 'Add(sQuote, Highlight.String) + Do + GoSub NEXT_CHAR + 'Add(sCar, Highlight.String) + If sCar = sQuote Then Break + If sCar = "\\" Then + GoSub NEXT_CHAR + 'Add(sCar, Highlight.String) + Endif + Loop + Return + +READ_CODE: + + GoSub PUSH_STATE + + TextHighlighter.Alternate = True + If sMarkup Then Add(sMarkup, Highlight.Keyword) + TextHighlighter.State = Highlight.Normal + TextHighlighter.Tag = 0 + bClose = False + iStart = I + + Do + + If I > iLenText Then Break + GoSub NEXT_CHAR + + If sCar = Chr$(34) Then + GoSub IGNORE_STRING + Else If sCar = "'" Then + I = iLenText + 1 + Else If sCar = "%" And If String.Mid$(sText, I, 1) = ">" Then + bClose = True + Break + Endif + + Loop + + If bClose Then + $sBufferAfter &= AnalyzeCode(String.Mid$(sText, iStart, I - iStart - 1)) + Add("%>", Highlight.Keyword) + GoSub POP_STATE + TextHighlighter.Alternate = False + iTagCode = 0 + Inc I + iNextState = TextHighlighter.State + Else + $sBufferAfter &= AnalyzeCode(String.Mid$(sText, iStart)) + GoSub POP_STATE + iTagCode = TAG_CODE + iTagMode = TextHighlighter.Tag + iNextState = TextHighlighter.State + Endif + + Return + +READ_CODE_COMMENT: + + iPos = String.InStr(sText, "--%>", I) + If iPos = 0 Then + Add(String.Mid$(sText, I), Highlight.Help) + I = iLenText + 1 + iTagCode = TAG_CODE_COMMENT + Else + Add(String.Mid$(sText, I, iPos - I + 3), Highlight.Help) + I = iPos + 3 + iTagCode = 0 + Endif + Return + +NEXT_CHAR: + + If I > iLenText Then Goto END_TEXT + sCar = String.Mid$(sText, I, 1) + Inc I + + If iStyle = STYLE_WEB And If iTagCode = 0 And If sCar = "<" And If String.Mid$(sText, I, 1) = "%" Then + + If String.Mid$(sText, I, 3) = "%--" Then + Add("<%--", Highlight.Help) + I += 3 + GoSub READ_CODE_COMMENT + Goto NEXT_CHAR + Else + sCar = String.Mid$(sText, I + 1, 1) + If sCar = "=" Then + sMarkup = "<%=" + I += 2 + Else If sCar = "!" Then + iPos = String.InStr(sText, "%>", I) + If iPos = 0 Then iPos = iLenText + 1 + Add("<" & String.Mid$(sText, I, iPos - I + 2), Highlight.DataType) + I = iPos + 2 + TextHighlighter.Alternate = False + Goto NEXT_CHAR + Else + sMarkup = "<%" + Inc I + Endif + GoSub READ_CODE + Goto NEXT_CHAR + Endif + + Endif + + Return + +PUSH_STATE: + + If Not $aStateStack Then $aStateStack = New Integer[] + + $aStateStack.Push(TextHighlighter.State) + $aStateStack.Push(TextHighlighter.Tag) + + Return + +POP_STATE: + + TextHighlighter.Tag = $aStateStack.Pop() + TextHighlighter.State = $aStateStack.Pop() + + Return + +END_TEXT: + + TextHighlighter.TextAfter = $sTextAfter & $sBufferAfter + + If bLimit And If Not Trim(TextHighlighter.TextAfter) Then + bLimit = False + bNextLimit = True + Endif + + TextHighlighter.State = iNextState + TextHighlighter.Tag = iTag + iTagCode + Shl(iTagMode, 8) + If(bNextLimit, TAG_NEXT_LIMIT, 0) + TextHighlighter.Limit = bLimit + 'Print "--> "; iNextState;; Bin$(TextHighlighter.Tag, 16);; TextHighlighter.TextAfter + +End + +Public Sub Run(sText As String) + + RunWith(sText, STYLE_HTML) + +End + +Public Sub RunWebpage(sText As String) + + RunWith(sText, STYLE_WEB) + +End diff --git a/comp/src/gb.eval.highlight/.src/TextHighlighter_Javascript.class b/comp/src/gb.eval.highlight/.src/TextHighlighter_Javascript.class new file mode 100644 index 00000000..12f27d77 --- /dev/null +++ b/comp/src/gb.eval.highlight/.src/TextHighlighter_Javascript.class @@ -0,0 +1,288 @@ +' Gambas class file + +Inherits TextHighlighter + +Public Const Name As String = "javascript" + +Private Const IDENT_CAR As String = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_$" +Private Const DIGIT_CAR As String = "0123456789.+-eE" + +Static Private $cKeyword As New Collection +Static Private $cOperator As New Collection +Static Private $aKeywords As String[] + +Static Public Sub _init() + + Dim sStr As String + + $aKeywords = New String[] + + For Each sStr In ["break", "case", "catch", "class", "const", "continue", "debugger", "default", "delete", "do", "else", "enum", "export", "extends", "finally", "for", + "function", "if", "import", "in", "instanceof", "new", "return", "super", "switch", "throw", "try", "typeof", "var", "void", "while", "with", "yield"] + $cKeyword[sStr] = 0 + $aKeywords.Add(sStr) + Next + + For Each sStr In ["false", "null", "this", "true", "undefined", "NaN", "Infinity"] + $cKeyword[sStr] = 1 + $aKeywords.Add(sStr) + Next + + For Each sStr In ["{", "}", ".", ">=", "+", "<<", "!", "=", ">>=", ";", "==", "-", ">>", "~", "+=", ">>>=", "(", ",", "!=", "*", ">>>", "&&", "-=", "&=", ")", "<", "===", "%", "&", "||", "*=", "|=", "[", ">", "!==", "++", "|", "?", "%=", "^=", + "--", "^", ":", "<<=", "]", "<=", "/", "/="] + $cOperator[sStr] = True + Next + +End + +Public Sub GetKeywords() As String[] + + Return $aKeywords + +End + +Public Sub Run(sText As String) + + Dim iState As Integer + Dim iTag As Integer + Dim iLenText As Integer + Dim iPos As Integer + Dim sCar As String + Dim bSingleLineComment As Boolean + Dim sQuoteChar As String + Dim sIdent As String + Dim bTestShowLimit As Boolean + Dim bLastExpr As Boolean + + iState = TextHighlighter.State + iTag = TextHighlighter.Tag + iLenText = String.Len(sText) + bLastExpr = True + If iState = Highlight.Operator Then + bLastExpr = False + Else If iState = Highlight.String Then + sQuoteChar = "`" + Endif + + For iPos = 1 To iLenText + + sCar = String.Mid$(sText, iPos, 1) + + If TextHighlighter_Html.AllowCode And If sCar = "<" And String.Mid$(sText, iPos, 2) = "<%" Then + TextHighlighter_Html.MeetCodeAt = iPos + TextHighlighter.State = iState + TextHighlighter.Tag = iTag + Return + Endif + + If iState = Highlight.Normal Then + + If sCar = "/" Then + sCar = String.Mid$(sText, iPos + 1, 1) + If sCar = "/" Then + iState = Highlight.Comment + bSingleLineComment = True + Else If sCar = "*" Then + sCar = String.Mid$(sText, iPos + 2, 1) + If sCar = "*" Then + iState = Highlight.Help + Else + iState = Highlight.Comment + Endif + bSingleLineComment = False + Else If Not bLastExpr And If String.Mid$(sText, iPos + 1, 1) <> " " Then ' Regular expression + + sIdent = sCar + + While iPos < iLenText + Inc iPos + sCar = String.Mid$(sText, iPos, 1) + If sCar = "\\" Then + Inc iPos + sIdent &= sCar & String.Mid$(sText, iPos, 1) + Continue + Endif + sIdent &= sCar + If sCar = "/" Then + Break + Endif + Wend + + While iPos < iLenText + Inc iPos + sCar = String.Mid$(sText, iPos, 1) + If Not IsLetter(sCar) Then + Dec iPos + Break + Endif + sIdent &= sCar + Wend + + TextHighlighter.Add(Highlight.DataType, String.Len(sIdent)) + iState = Highlight.Normal + Continue + Else + TextHighlighter.Add(Highlight.Operator) + Continue + Endif + + Else If InStr("\"'`", sCar) Then + iState = Highlight.String + sQuoteChar = sCar + Else If Asc(sCar) <= 32 Then + + Else If IsDigit(sCar) Then + + sIdent = sCar + sCar = String.Mid$(sText, iPos + 1, 1) + If sCar = "x" Or If sCar = "X" Then + sIdent &= sCar + Inc iPos + While iPos < iLenText + Inc iPos + sCar = String.Mid$(sText, iPos, 1) + If Not IsHexa(sCar) Then + Dec iPos + Break + Endif + sIdent &= sCar + Wend + Else + While iPos < iLenText + Inc iPos + sCar = String.Mid$(sText, iPos, 1) + If InStr(DIGIT_CAR, sCar) = 0 Then + Dec iPos + Break + Endif + sIdent &= sCar + Wend + Endif + + TextHighlighter.Add(Highlight.Number, String.Len(sIdent)) + iState = Highlight.Normal + bLastExpr = True + Continue + + Else If Len(sCar) >= 2 Or If InStr(IDENT_CAR, sCar) Then + + sIdent = sCar + + While iPos < iLenText + Inc iPos + sCar = String.Mid$(sText, iPos, 1) + If Len(sCar) = 1 And If Not IsDigit(sCar) And If InStr(IDENT_CAR, sCar) = 0 Then + Dec iPos + Break + Endif + sIdent &= sCar + Wend + + If $cKeyword.Exist(sIdent) Then + iState = Highlight.Keyword + If sIdent = "function" Then bTestShowLimit = True + bLastExpr = $cKeyword[sIdent] = 1 + Else + iState = Highlight.Symbol + bLastExpr = True + Endif + + TextHighlighter.Add(iState, String.Len(sIdent)) + iState = Highlight.Normal + Continue + + Else + + sIdent = sCar + + While iPos < iLenText + If $cOperator.Exist(sIdent) Then Break + Inc iPos + sCar = String.Mid$(sText, iPos, 1) + If IsLetter(sCar) Or If IsDigit(sCar) Or If IsBlank(sCar) Then + Dec iPos + Break + Endif + sIdent &= sCar + Wend + + bLastExpr = False + + If $cOperator.Exist(sIdent) Then + iState = Highlight.Operator + If sIdent = ")" Or If sIdent = "]" Then bLastExpr = True + Else + iState = Highlight.Error + Endif + + TextHighlighter.Add(iState, String.Len(sIdent)) + iState = Highlight.Normal + + 'Dec iPos + Continue + + Endif + + Else If iState = Highlight.Comment Or If iState = Highlight.Help Then + + If Not bSingleLineComment Then + sCar = String.Mid$(sText, iPos, 2) + If sCar = "*/" Then + TextHighlighter.Add(iState, 2) + Inc iPos + iState = Highlight.Normal + Continue + Endif + Endif + + Else If iState = Highlight.String Then + + If sCar = "\\" Then + sCar = String.Mid$(sText, iPos + 1, 1) + If sCar = "x" Then + TextHighlighter.Add(iState, 3) + iPos += 2 + Continue + Else If sCar = "u" Then + TextHighlighter.Add(iState, 5) + iPos += 4 + Continue + Else + TextHighlighter.Add(iState, 2) + Inc iPos + Continue + Endif + Else If sCar = sQuoteChar Then + TextHighlighter.Add(iState) + iState = Highlight.Normal + bLastExpr = True + Continue + Endif + + Endif + + TextHighlighter.Add(iState) + + Next + + If iState = Highlight.Comment And If bSingleLineComment Then + iState = Highlight.Normal + Endif + + If iState <> Highlight.Comment And If iState <> Highlight.Help Then + If iState <> Highlight.String Or If sQuoteChar <> "`" Then + iState = Highlight.Normal + Endif + Endif + + TextHighlighter.Limit = False + If bTestShowLimit Then + If LTrim(sText) Begins "function" Or If Trim(sText) Like "*: function(*" Then + TextHighlighter.Limit = True + Endif + Endif + + TextHighlighter.State = iState + TextHighlighter.Tag = iTag + +End diff --git a/comp/src/gb.eval.highlight/.src/TextHighlighter_SQL.class b/comp/src/gb.eval.highlight/.src/TextHighlighter_SQL.class new file mode 100644 index 00000000..793fac8f --- /dev/null +++ b/comp/src/gb.eval.highlight/.src/TextHighlighter_SQL.class @@ -0,0 +1,171 @@ +' Gambas class file + +Inherits TextHighlighter + +Public Const Name As String = "sql" + +Private Const IDENT_CAR As String = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789" + +Static Private $cDatatype As Collection +Static Private $cFunction As Collection +Static Private $cKeyword As Collection +Static Private $cOperator As Collection +Static Private $aKeywords As String[] + +Static Private Sub LoadFile(sPath As String, Optional bKeyword As Boolean) As Collection + + Dim sWord As String + Dim cCol As New Collection(gb.IgnoreCase) + + For Each sWord In Split(File.Load(sPath), "\n", "", True) + cCol[sWord] = True + If bKeyword Then $aKeywords.Add(sWord) + Next + Return cCol + +End + + +Static Public Sub _init() + + $aKeywords = New String[] + $cDatatype = LoadFile("sql/datatypes") + $cFunction = LoadFile("sql/functions") + $cKeyword = LoadFile("sql/keywords", True) + $cOperator = LoadFile("sql/operators") + +End + +Private Sub CheckWord(sWord As String) As Integer + + If $cKeyword.Exist(sWord) Then Return Highlight.Keyword + If $cOperator.Exist(sWord) Then Return Highlight.Operator + If $cFunction.Exist(sWord) Then Return Highlight.Function + If $cDatatype.Exist(sWord) Then Return Highlight.DataType + Return Highlight.Normal + +End + + + +Public Sub Run(sText As String) + + Dim iState As Integer + Dim iTag As Integer + Dim iLenText As Integer + Dim iPos As Integer + Dim sCar As String + Dim sWait As String + Dim iLen As Integer + + iState = TextHighlighter.State + iTag = TextHighlighter.Tag + iLenText = String.Len(sText) + + For iPos = 1 To iLenText + + sCar = String.Mid$(sText, iPos, 1) + + Select Case iState + + Case Highlight.Normal + + If Len(sCar) > 1 Then + TextHighlighter.Add(Highlight.Error) + Else If Asc(sCar) < 33 Then + TextHighlighter.Add(iState) + Else If sCar = "#" Or If String.Mid$(sText, iPos, 2) = "--" Then + TextHighlighter.Add(Highlight.Comment, iLenText - iPos + 1) + Break + Else If String.Mid$(sText, iPos, 2) = "/*" Then + iState = Highlight.Comment + TextHighlighter.Add(iState) + Else If sCar = "'" Or If sCar = "\"" Then + iState = Highlight.String + iTag = Asc(sCar) + TextHighlighter.Add(iState) + Else If sCar = "`" Then + iState = Highlight.Symbol + TextHighlighter.Add(iState) + sWait = sCar + Else + iLen = Helper.ReadNumber(sText, iPos) + If iLen > 0 Then + TextHighlighter.Add(Highlight.Number, iLen) + iPos += iLen - 1 + Continue + Endif + + iLen = Helper.ReadIdentifier(sText, iPos, IDENT_CAR) + If InStr(IDENT_CAR, String.Mid$(sText, iPos, 1)) Then + iState = CheckWord(String.Mid$(sText, iPos, iLen)) + Else + While iLen > 0 + iState = CheckWord(String.Mid$(sText, iPos, iLen)) + If iState <> Highlight.Normal Then Break + Dec iLen + Wend + Endif + + If iLen > 0 Then + If iState <> Highlight.Normal Then + TextHighlighter.Add(iState, iLen) + iPos += iLen - 1 + iState = Highlight.Normal + Continue + Else + TextHighlighter.Add(Highlight.Symbol, iLen) + iPos += iLen - 1 + iState = Highlight.Normal + Continue + Endif + Endif + + TextHighlighter.Add(Highlight.Error) + + Endif + + Case Highlight.Symbol + + TextHighlighter.Add(iState) + If sCar = sWait Then + iState = Highlight.Normal + Endif + + Case Highlight.Comment + + TextHighlighter.Add(iState) + If String.Mid$(sText, iPos, 2) = "*/" Then + TextHighlighter.Add(iState) + Inc iPos + iState = Highlight.Normal + Endif + + Case Highlight.String + + TextHighlighter.Add(iState) + If sCar = "\\" Then + TextHighlighter.Add(iState) + Inc iPos + Else If sCar = Chr$(iTag) Then + iState = Highlight.Normal + Endif + + End Select + + Next + + 'If bTestShowLimit Then + ' Highlight.ShowLimit = LTrim(sText) Begins "function " + 'Endif + + TextHighlighter.State = iState + TextHighlighter.Tag = iTag + +End + +Public Sub GetKeywords() As String[] + + Return $aKeywords + +End diff --git a/comp/src/gb.eval.highlight/.src/TextHighlighter_WebPage.class b/comp/src/gb.eval.highlight/.src/TextHighlighter_WebPage.class new file mode 100644 index 00000000..07b6824d --- /dev/null +++ b/comp/src/gb.eval.highlight/.src/TextHighlighter_WebPage.class @@ -0,0 +1,11 @@ +' Gambas class file + +Inherits TextHighlighter + +Public Const Name As String = "webpage" + +Public Sub Run(sText As String) + + TextHighlighter_Html.RunWebpage(sText) + +End diff --git a/comp/src/gb.eval.highlight/css/properties b/comp/src/gb.eval.highlight/css/properties new file mode 100644 index 00000000..426912ce --- /dev/null +++ b/comp/src/gb.eval.highlight/css/properties @@ -0,0 +1,232 @@ +@font-face font-family,src,font-stretch,font-style,font-weight,unicode-range,inherit,initial,unset +@font-feature-values inherit,initial,unset +@keyframes #animationname,#keyframes-selector,#css-styles,inherit,initial,unset +align-content stretch,center,flex-start,flex-end,space-between,space-around,initial,inherit,unset +align-items stretch,center,flex-start,flex-end,baseline,initial,inherit,unset +align-self auto,stretch,center,flex-start,flex-end,baseline,initial,inherit,unset +animation @animation-name,@animation-duration,@ animation-timing-function,@animation-delay,@ animation-iteration-count,@animation-direction,@animation-fill-mode,@animation-play-state,initial,inherit,unset +animation-delay #time,initial,inherit,unset +animation-direction normal,reverse,alternate,alternate-reverse,initial,inherit,unset +animation-duration #time,initial,inherit,unset +animation-fill-mode none,forwards,backwards,both,initial,inherit,unset +animation-iteration-count #number,infinite,initial,inherit,unset +animation-name #keyframename,none,initial,inherit,unset +animation-play-state paused,running,initial,inherit,unset +animation-timing-function linear,ease,ease-in,ease-out,ease-in-out,step-start,step-end,steps,cubic-bezier,initial,inherit,unset +backface-visibility visible,hidden,initial,inherit,unset +background @background-color,@background-image,@background-position,@background-size,@background-repeat,@background-origin,@background-clip,@background-attachment,initial,inherit,unset +background-attachment scroll,fixed,local,initial,inherit,unset +background-blend-mode normal,multiply,screen,overlay,darken,lighten,color-dodge,saturation,color,luminosity,inherit,initial,unset +background-clip border-box,padding-box,content-box,initial,inherit,unset +background-color #color,transparent,initial,inherit,unset +background-image url,none,initial,inherit,unset +background-origin padding-box,border-box,content-box,initial,inherit,unset +background-position lefttop,leftcenter,leftbottom,righttop,rightcenter,rightbottom,centertop,centercenter,centerbottom,#x%y%,#xposypos,initial,inherit,unset +background-repeat repeat,repeat-x,repeat-y,no-repeat,initial,inherit,unset +background-size auto,#length,#percentage,cover,contain,initial,inherit,unset +border @border-width,@border-style,@border-color,initial,inherit,unset +border-bottom @border-bottom-width,@border-bottom-style,@border-bottom-color,initial,inherit,unset +border-bottom-color #color,transparent,initial,inherit,unset +border-bottom-left-radius #length,#%,initial,inherit,unset +border-bottom-right-radius #length,#%,initial,inherit,unset +border-bottom-style none,hidden,dotted,dashed,solid,double,groove,ridge,inset,outset,initial,inherit,unset +border-bottom-width medium,thin,thick,#length,initial,inherit,unset +border-collapse separate,collapse,initial,inherit,unset +border-color #color,transparent,initial,inherit,unset +border-image @border-image-source,@border-image-slice,@border-image-width,@border-image-outset,@border-image-repeat,initial,inherit,unset +border-image-outset #length,#number,initial,inherit,unset +border-image-repeat stretch,repeat,round,space,initial,inherit,unset +border-image-slice #number,#%,fill,initial,inherit,unset +border-image-source none,#image,initial,inherit,unset +border-image-width #length,#number,#%,auto,initial,inherit,unset +border-left @border-left-width,@border-left-style,@border-left-color,initial,inherit,unset +border-left-color #color,transparent,initial,inherit,unset +border-left-style none,hidden,dotted,dashed,solid,double,groove,ridge,inset,outset,initial,inherit,unset +border-left-width medium,thin,thick,#length,initial,inherit,unset +border-radius #length,#%,initial,inherit,unset +border-right @border-right-width,@border-right-style,@border-right-color,initial,inherit,unset +border-right-color #color,transparent,initial,inherit,unset +border-right-style none,hidden,dotted,dashed,solid,double,groove,ridge,inset,outset,initial,inherit,unset +border-right-width medium,thin,thick,#length,initial,inherit,unset +border-spacing #lengthlength,initial,inherit,unset +border-style none,hidden,dotted,dashed,solid,double,groove,ridge,inset,outset,initial,inherit,unset +border-top @border-top-width,@border-top-style,@border-top-color,initial,inherit,unset +border-top-color #color,transparent,initial,inherit,unset +border-top-left-radius #length,#%,initial,inherit,unset +border-top-right-radius #length,#%,initial,inherit,unset +border-top-style none,hidden,dotted,dashed,solid,double,groove,ridge,inset,outset,initial,inherit,unset +border-top-width medium,thin,thick,#length,initial,inherit,unset +border-width medium,thin,thick,#length,initial,inherit,unset +bottom auto,#length,#%,initial,inherit,unset +box-decoration-break inherit,initial,unset +box-shadow none,#h-shadow,#v-shadow,#blur,#spread,#color,inset,initial,inherit,unset +box-sizing content-box,border-box,initial,inherit,unset +break-after inherit,initial,unset +break-before inherit,initial,unset +break-inside inherit,initial,unset +caption-side top,bottom,initial,inherit,unset +clear none,left,right,both,initial,inherit,unset +clip auto,#shape,initial,inherit,unset +color #color,initial,inherit,unset +column-count #number,auto,initial,inherit,unset +column-fill balance,auto,initial,inherit,unset +column-gap #length,normal,initial,inherit,unset +column-rule @column-rule-width,@column-rule-style,@column-rule-color,initial,inherit,unset +column-rule-color #color,initial,inherit,unset +column-rule-style none,hidden,dotted,dashed,solid,double,groove,ridge,inset,outset,initial,inherit,unset +column-rule-width medium,thin,thick,#length,initial,inherit,unset +column-span none,all,initial,inherit,unset +column-width auto,#length,initial,inherit,unset +columns auto,@column-width,@column-count,initial,inherit,unset +content normal,none,counter,attr,#string,open-quote,close-quote,no-open-quote,no-close-quote,url,initial,inherit,unset +counter-increment none,#idnumber,initial,inherit,unset +counter-reset none,#name,#number,initial,inherit,unset +cursor alias,all-scroll,auto,cell,context-menu,col-resize,copy,crosshair,default,e-resize,ew-resize,grab,grabbing,help,move,n-resize,ne-resize,nesw-resize,ns-resize,nw-resize,nwse-resize,no-drop,none,not-allowed,pointer,progress,row-resize,s-resize,se-resize,sw-resize,text,#URL,vertical-text,w-resize,wait,zoom-in,zoom-out,initial,inherit,unset +direction ltr,rtl,initial,inherit,unset +display inline,block,flex,inline-block,inline-flex,inline-table,list-item,run-in,table,table-caption,table-column-group,table-header-group,table-footer-group,table-row-group,table-cell,table-column,table-row,none,initial,inherit,unset +empty-cells show,hide,initial,inherit,unset +filter none,blur,brightness,contrast,drop-shadow,grayscale,hue-rotate,invert,opacity,saturate,sepia,url,initial,inherit,unset +flex @flex-grow,@flex-shrink,@flex-basis,auto,initial,none,inherit,unset +flex-basis #number,auto,initial,inherit,unset +flex-direction row,row-reverse,column,column-reverse,initial,inherit,unset +flex-flow #flex-direction,#flex-wrap,initial,inherit,unset +flex-grow #number,initial,inherit,unset +flex-shrink #number,initial,inherit,unset +flex-wrap nowrap,wrap,wrap-reverse,initial,inherit,unset +float none,left,right,initial,inherit,unset +font #font-style,#font-variant,#font-weight,#font-size/line-height,#font-family,caption,icon,menu,message-box,small-caption,status-bar,initial,inherit,unset +font-family #family-name,generic-family,initial,inherit,unset +font-feature-settings inherit,initial,unset +font-kerning inherit,initial,unset +font-language-override inherit,initial,unset +font-size medium,xx-small,x-small,small,large,x-large,xx-large,smaller,larger,#length,#%,initial,inherit,unset +font-size-adjust #number,none,initial,inherit,unset +font-stretch ultra-condensed,extra-condensed,condensed,semi-condensed,normal,semi-expanded,expanded,extra-expanded,ultra-expanded,initial,inherit,unset +font-style normal,italic,oblique,initial,inherit,unset +font-synthesis inherit,initial,unset +font-variant normal,small-caps,initial,inherit,unset +font-variant-alternates inherit,initial,unset +font-variant-caps inherit,initial,unset +font-variant-east-asian inherit,initial,unset +font-variant-ligatures inherit,initial,unset +font-variant-numeric inherit,initial,unset +font-variant-position inherit,initial,unset +font-weight normal,bold,bolder,lighter,initial,inherit,unset +hanging-punctuation none,first,last,allow-end,force-end,initial,inherit,unset +height auto,#length,#%,initial,inherit,unset +hyphens inherit,initial,unset +image-orientation inherit,initial,unset +image-rendering inherit,initial,unset +image-resolution inherit,initial,unset +ime-mode inherit,initial,unset +justify-content flex-start,flex-end,center,space-between,space-around,initial,inherit,unset +left auto,#length,#%,initial,inherit,unset +letter-spacing normal,#length,initial,inherit,unset +line-break inherit,initial,unset +line-height normal,#number,#length,#%,initial,inherit,unset +list-style #list-style-type,#list-style-position,#list-style-image,initial,inherit,unset +list-style-image none,url,initial,inherit,unset +list-style-position inside,outside,initial,inherit,unset +list-style-type disc,armenian,circle,cjk-ideographic,decimal,decimal-leading-zero,georgian,hebrew,hiragana,hiragana-iroha,katakana,katakana-iroha,lower-alpha,lower-greek,lower-latin,lower-roman,none,square,upper-alpha,upper-greek,upper-latin,upper-roman,initial,inherit,unset +margin #length,#%,auto,initial,inherit,unset +margin-bottom #length,#%,auto,initial,inherit,unset +margin-left #length,#%,auto,initial,inherit,unset +margin-right #length,#%,auto,initial,inherit,unset +margin-top #length,#%,auto,initial,inherit,unset +mark inherit,initial,unset +mark-after inherit,initial,unset +mark-before inherit,initial,unset +marks inherit,initial,unset +marquee-direction inherit,initial,unset +marquee-play-count inherit,initial,unset +marquee-speed inherit,initial,unset +marquee-style inherit,initial,unset +mask inherit,initial,unset +mask-type inherit,initial,unset +max-height none,#length,#%,initial,inherit,unset +max-width none,#length,#%,initial,inherit,unset +min-height #length,#%,initial,inherit,unset +min-width #length,#%,initial,inherit,unset +nav-down auto,#id,#target-name,initial,inherit,unset +nav-index auto,#number,initial,inherit,unset +nav-left auto,#id,#target-name,initial,inherit,unset +nav-right auto,#id,#target-name,initial,inherit,unset +nav-up auto,#id,#target-name,initial,inherit,unset +object-fit inherit,initial,unset +object-position inherit,initial,unset +opacity #number,initial,inherit,unset +order #number,initial,inherit,unset +orphans inherit,initial,unset +outline @outline-color,@outline-style,@outline-width,initial,inherit,unset +outline-color invert,#color,initial,inherit,unset +outline-offset #length,initial,inherit,unset +outline-style none,hidden,dotted,dashed,solid,double,groove,ridge,inset,outset,initial,inherit,unset +outline-width medium,thin,thick,#length,initial,inherit,unset +overflow visible,hidden,scroll,auto,initial,inherit,unset +overflow-wrap inherit,initial,unset +overflow-x visible,hidden,scroll,auto,initial,inherit,unset +overflow-y visible,hidden,scroll,auto,initial,inherit,unset +padding #length,#%,initial,inherit,unset +padding-bottom #length,#%,initial,inherit,unset +padding-left #length,#%,initial,inherit,unset +padding-right #length,#%,initial,inherit,unset +padding-top #length,#%,initial,inherit,unset +page-break-after auto,always,avoid,left,right,initial,inherit,unset +page-break-before auto,always,avoid,left,right,initial,inherit,unset +page-break-inside auto,avoid,initial,inherit,unset +perspective #length,none,initial,inherit,unset +perspective-origin #x-axis,#y-axis,initial,inherit,unset +phonemes inherit,initial,unset +pointer-events auto,none,inherit,initial,unset +position static,absolute,fixed,relative,sticky,initial,inherit,unset +quotes none,#stringstringstringstring,initial,inherit,unset +resize none,both,horizontal,vertical,initial,inherit,unset +rest inherit,initial,unset +rest-after inherit,initial,unset +rest-before inherit,initial,unset +right auto,#length,#%,initial,inherit,unset +tab-size #number,#length,initial,inherit,unset +table-layout auto,fixed,initial,inherit,unset +text-align left,right,center,justify,initial,inherit,unset +text-align-last auto,left,right,center,justify,start,end,initial,inherit,unset +text-combine-upright inherit,initial,unset +text-combine-upright inherit,initial,unset +text-decoration none,underline,overline,line-through,initial,inherit,unset +text-decoration-color #color,initial,inherit,unset +text-decoration-line none,underline,overline,line-through,initial,inherit,unset +text-decoration-style solid,double,dotted,dashed,wavy,initial,inherit,unset +text-indent #length,#%,initial,inherit,unset +text-justify auto,inter-word,inter-ideograph,inter-cluster,distribute,kashida,trim,none,initial,inherit,unset +text-orientation inherit,initial,unset +text-overflow clip,ellipsis,#string,initial,inherit,unset +text-shadow #h-shadow,#v-shadow,#blur-radius,#color,none,initial,inherit,unset +text-transform none,capitalize,uppercase,lowercase,initial,inherit,unset +text-underline-position inherit,initial,unset +top auto,#length,#%,initial,inherit,unset +transform none,matrix,matrix3d,,translate,translate3d,translateX,translateY,translateZ,scale,scale3d,scaleX,scaleY,scaleZ,rotate,rotate3d,rotateX,rotateY,rotateZ,skew,skewX,skewY,perspective,initial,inherit,unset +transform-origin #x-axis,#y-axis,#z-axis,initial,inherit,unset +transform-style flat,preserve-3d,initial,inherit,unset +transition @transition-property,@transition-duration,@transition-timing-function,@transition-delay,initial,inherit,unset +transition-delay #time,initial,inherit,unset +transition-duration #time,initial,inherit,unset +transition-property none,all,#property,initial,inherit,unset +transition-timing-function ease,linear,ease-in,ease-out,ease-in-out,step-start,step-end,steps,cubic-bezier,initial,inherit,unset +unicode-bidi normal,embed,bidi-override,initial,inherit,unset +user-select auto,none,text,all,inherit,initial,unset +vertical-align baseline,#length,%,sub,super,top,text-top,middle,bottom,text-bottom,initial,inherit,unset +visibility visible,hidden,collapse,initial,inherit,unset +voice-balance inherit,initial,unset +voice-duration inherit,initial,unset +voice-pitch inherit,initial,unset +voice-pitch-range inherit,initial,unset +voice-rate inherit,initial,unset +voice-stress inherit,initial,unset +voice-volume inherit,initial,unset +white-space normal,nowrap,pre,pre-line,pre-wrap,initial,inherit,unset +widows inherit,initial,unset +width auto,#length,#%,initial,inherit,unset +word-break normal,break-all,keep-all,initial,inherit,unset +word-spacing normal,#length,initial,inherit,unset +word-wrap normal,break-word,initial,inherit,unset +writing-mode inherit,initial,unset +z-index auto,#number,initial,inherit,unset \ No newline at end of file diff --git a/comp/src/gb.eval.highlight/css/values b/comp/src/gb.eval.highlight/css/values new file mode 100644 index 00000000..f0a0ea4f --- /dev/null +++ b/comp/src/gb.eval.highlight/css/values @@ -0,0 +1,289 @@ +absolute +alias +all +all-scroll +allow-end +alternate +alternate-reverse +always +armenian +attr +auto +avoid +backwards +balance +baseline +bidi-override +block +blur +bold +bolder +border-box +both +bottom +break-all +break-word +brightness +capitalize +caption +cell +center +centerbottom +centercenter +centertop +circle +cjk-ideographic +clip +close-quote +col-resize +collapse +color +color-dodge +column +column-reverse +condensed +contain +content-box +context-menu +contrast +copy +counter +cover +crosshair +cubic-bezier +darken +dashed +decimal +decimal-leading-zero +default +disc +distribute +dotted +double +drop-shadow +e-resize +ease +ease-in +ease-in-out +ease-out +ellipsis +embed +end +ew-resize +expanded +extra-condensed +extra-expanded +fill +first +fixed +flat +flex +flex-end +flex-start +font-family +font-stretch +font-style +font-weight +force-end +forwards +generic-family +georgian +grab +grabbing +grayscale +groove +hebrew +help +hidden +hide +hiragana +hiragana-iroha +horizontal +hue-rotate +icon +infinite +inherit +initial +inline +inline-block +inline-flex +inline-table +inset +inside +inter-cluster +inter-ideograph +inter-word +invert +italic +justify +kashida +katakana +katakana-iroha +keep-all +large +larger +last +left +leftbottom +leftcenter +lefttop +lighten +lighter +line-through +linear +list-item +local +lower-alpha +lower-greek +lower-latin +lower-roman +lowercase +ltr +luminosity +matrix +matrix3d +medium +menu +message-box +middle +move +multiply +n-resize +ne-resize +nesw-resize +no-close-quote +no-drop +no-open-quote +no-repeat +none +normal +not-allowed +nowrap +ns-resize +nw-resize +nwse-resize +oblique +opacity +open-quote +outset +outside +overlay +overline +padding-box +paused +perspective +pointer +pre +pre-line +pre-wrap +preserve-3d +progress +relative +repeat +repeat-x +repeat-y +reverse +ridge +right +rightbottom +rightcenter +righttop +rotate +rotate3d +rotateX +rotateY +rotateZ +round +row +row-resize +row-reverse +rtl +run-in +running +s-resize +saturate +saturation +scale +scale3d +scaleX +scaleY +scaleZ +screen +scroll +se-resize +semi-condensed +semi-expanded +separate +sepia +show +skew +skewX +skewY +small +small-caps +small-caption +smaller +solid +space +space-around +space-between +square +src +start +static +status-bar +step-end +step-start +steps +sticky +stretch +sub +super +sw-resize +table +table-caption +table-cell +table-column +table-column-group +table-footer-group +table-header-group +table-row +table-row-group +text +text-bottom +text-top +thick +thin +top +translate +translate3d +translateX +translateY +translateZ +transparent +trim +ultra-condensed +ultra-expanded +underline +unicode-range +unset +upper-alpha +upper-greek +upper-latin +upper-roman +uppercase +url +vertical +vertical-text +visible +w-resize +wait +wavy +wrap +wrap-reverse +x-large +x-small +xx-large +xx-small +zoom-in +zoom-out \ No newline at end of file diff --git a/comp/src/gb.eval.highlight/sql/datatypes b/comp/src/gb.eval.highlight/sql/datatypes new file mode 100644 index 00000000..f9b9101b --- /dev/null +++ b/comp/src/gb.eval.highlight/sql/datatypes @@ -0,0 +1,67 @@ +:: +BIGINT +BIGSERIAL +BINARY +BIT +BLOB +BOOL +BOOLEAN +BOX +BYTEA +CHAR +CHARACTER +CIDR +CIRCLE +DATE +DATETIME +DEC +DECIMAL +DOUBLE +DOUBLE +ENUM +FIXED +FLOAT +FLOAT8 +INET +INT +INT2 +INT4 +INT8 +INTEGER +INTERVAL +LINE +LONG +LONGBLOB +LONGTEXT +LSEG +LZTEXT +MACADDR +MEDIUMBLOB +MEDIUMINT +MEDIUMTEXT +MIDDLEINT +MONEY +NUMERIC +OID +PATH +POINT +POLYGON +PRECISION +REAL +SERIAL +SERIAL8 +SMALLINT +TEXT +TIME +TIMESTAMP +TIMESTAMPTZ +TIMESTAMP WITH TIMEZONE +TIMETZ +TINYBLOB +TINYINT +TINYTEXT +VARBINARY +VARBIT +VARCHAR +VARYING +YEAR diff --git a/comp/src/gb.eval.highlight/sql/functions b/comp/src/gb.eval.highlight/sql/functions new file mode 100644 index 00000000..2284f74d --- /dev/null +++ b/comp/src/gb.eval.highlight/sql/functions @@ -0,0 +1,206 @@ +ABBREV +ABS +ACOS +ADDDATE +AES_DECRYPT +AES_ENCRYPT +AGE +AREA +ASCII +ASIN +ATAN +ATAN2 +AVG +BENCHMARK +BIN +BIT_AND +BIT_COUNT +BIT_LENGTH +BIT_OR +BOX +BROADCAST +BTRIM +CAST +CBRT +CEIL +CEILING +CENTER +CHAR +CHARACTER_LENGTH +CHAR_LENGTH +CHR +CIRCLE +COALESCE +COL_DESCRIPTION +CONCAT +CONCAT_WS +CONNECTION_ID +CONV +CONVERT +COS +COT +COUNT +CURDATE +CURRENT_DATE +CURRENT_TIME +CURRENT_TIMESTAMP +CURRVAL +CURTIME +DATABASE +DATE_ADD +DATE_FORMAT +DATE_PART +DATE_SUB +DATE_TRUNC +DAYNAME +DAYOFMONTH +DAYOFWEEK +DAYOFYEAR +DECODE +DEGREES +DES_DECRYPT +DES_ENCRYPT +DIAMETER +ELT +ENCODE +ENCRYPT +EXP +EXPORT_SET +EXTRACT +FIELD +FIND_IN_SET +FLOOR +FORMAT +FOUND_ROWS +FROM_DAYS +FROM_UNIXTIME +GET_LOCK +GREATEST +HAS_TABLE_PRIVILEGE +HEIGHT +HEX +HOST +HOUR +INET_ATON +INET_NTOA +INITCAP +INSERT +INSTR +ISCLOSED +ISFINITE +IS_FREE_LOCK +ISOPEN +LAST_INSERT_ID +LCASE +LEAST +LEFT +LENGTH +LN +LOAD_FILE +LOCATE +LOG +LOG10 +LOG2 +LOWER +LPAD +LSEG +LTRIM +MAKE_SET +MASKLEN +MASTER_POS_WAIT +MAX +MD5 +MID +MIN +MINUTE +MOD +MONTH +MONTHNAME +NETMASK +NETWORK +NEXTVAL +NOW +NPOINT +NULLIF +OBJ_DESCRIPTION +OCT +OCTET_LENGTH +ORD +PASSWORD +PATH +PCLOSE +PERIOD_ADD +PERIOD_DIFF +PG_CLIENT_ENCODING +PG_GET_INDEXDEF +PG_GET_RULEDEF +PG_GET_USERBYID +PG_GET_VIEWDEF +PI +POINT +POLYGON +POPEN +POSITION +POW +POWER +QUARTER +QUOTE +RADIANS +RADIUS +RAND +RANDOM +RELEASE_LOCK +REPEAT +REPLACE +REVERSE +RIGHT +ROUND +RPAD +RTRIM +SECOND +SEC_TO_TIME +SESSION_USER +SET_MASKLEN +SETVAL +SHA +SHA1 +SIGN +SIN +SOUNDEX +SPACE +SQRT +STD +STDDEV +STRPOS +SUBDATE +SUBSTR +SUBSTRING +SUBSTRING_INDEX +SUM +SYSDATE +SYSTEM_USER +TAN +TIME_FORMAT +TIMEOFDAY +TIMESTAMP +TIME_TO_SEC +TO_ASCII +TO_CHAR +TO_DATE +TO_DAYS +TO_NUMBER +TO_TIMESTAMP +TRANSLATE +TRIM +TRUNC +UCASE +UNIX_TIMESTAMP +UPPER +USER +VARIANCE +VERSION +WEEK +WEEKDAY +WIDTH +YEAR +YEARWEEK diff --git a/comp/src/gb.eval.highlight/sql/keywords b/comp/src/gb.eval.highlight/sql/keywords new file mode 100644 index 00000000..51d7eb56 --- /dev/null +++ b/comp/src/gb.eval.highlight/sql/keywords @@ -0,0 +1,543 @@ +ABORT +ACCESS +ACTION +ADD +ADMIN +AFTER +AGGREGATE +ALIAS +ALL +ALLOCATE +ALTER +ANALYSE +ANALYZE +AND +ANY +ARE +AS +ASC +ASENSITIVE +ASSERTION +ASSIGNMENT +ASYMMETRIC +AT +ATOMIC +AUTHORIZATION +AUTO_INCREMENT +BACKWARD +BDB +BEFORE +BEGIN +BERKELEYDB +BETWEEN +BINARY +BOTH +BREADTH +BY +CACHE +CALL +CALLED +CARDINALITY +CASCADE +CASCADED +CASE +CAST +CATALOG +CATALOG_NAME +CHAIN +CHANGE +CHARACTERISTICS +CHARACTER_LENGTH +CHARACTER_SET_CATALOG +CHARACTER_SET_NAME +CHARACTER_SET_SCHEMA +CHAR_LENGTH +CHARSET +CHECK +CHECKED +CHECKPOINT +CLASS +CLASS_ORIGIN +CLOB +CLOSE +CLUSTER +COALESCE +COBOL +COLLATE +COLLATION +COLLATION_CATALOG +COLLATION_NAME +COLLATION_SCHEMA +COLUMN +COLUMN_NAME +COLUMNS +COMMAND_FUNCTION +COMMAND_FUNCTION_CODE +COMMENT +COMMIT +COMMITTED +COMPLETION +CONDITION_NUMBER +CONNECT +CONNECTION +CONNECTION_NAME +CONSTRAINT +CONSTRAINT_CATALOG +CONSTRAINT_NAME +CONSTRAINTS +CONSTRAINT_SCHEMA +CONSTRUCTOR +CONTAINS +CONTINUE +CONVERT +COPY +CORRESPONDING +COUNT +CREATE +CREATEDB +CREATEUSER +CROSS +CUBE +CURRENT +CURRENT_DATE +CURRENT_PATH +CURRENT_ROLE +CURRENT_TIME +CURRENT_TIMESTAMP +CURRENT_USER +CURSOR +CURSOR_NAME +CYCLE +DATA +DATABASE +DATABASES +DATE +DATETIME_INTERVAL_CODE +DATETIME_INTERVAL_PRECISION +DAY +DAY_HOUR +DAY_MINUTE +DAY_SECOND +DEALLOCATE +DEC +DECIMAL +DECLARE +DEFAULT +DEFERRABLE +DEFERRED +DEFINED +DEFINER +DELAYED +DELETE +DELIMITERS +DEPTH +DEREF +DESC +DESCRIBE +DESCRIPTOR +DESTROY +DESTRUCTOR +DETERMINISTIC +DIAGNOSTICS +DICTIONARY +DISCONNECT +DISPATCH +DISTINCT +DISTINCTROW +DO +DOMAIN +DOUBLE +DROP +DYNAMIC +DYNAMIC_FUNCTION +DYNAMIC_FUNCTION_CODE +EACH +ELSE +ENCLOSED +ENCODING +ENCRYPTED +END +END-EXEC +EQUALS +ESCAPE +ESCAPED +EVERY +EXCEPT +EXCEPTION +EXCLUSIVE +EXEC +EXECUTE +EXISTING +EXISTS +EXPLAIN +EXTERNAL +FALSE +FETCH +FIELDS +FINAL +FIRST +FOR +FORCE +FOREIGN +FORTRAN +FORWARD +FOUND +FREE +FREEZE +FROM +FULL +FULLTEXT +FUNCTION +GENERAL +GENERATED +GET +GLOBAL +GO +GOTO +GRANT +GRANTED +GROUP +GROUPING +HANDLER +HAVING +HIERARCHY +HIGH_PRIORITY +HOLD +HOST +HOUR +IDENTITY +IF +IGNORE +ILIKE +IMMEDIATE +IMMUTABLE +IMPLEMENTATION +IN +INCREMENT +INDEX +INDICATOR +INFILE +INFIX +INHERITS +INITIALIZE +INITIALLY +INNER +INNODB +INOUT +INPUT +INSENSITIVE +INSERT +INSTANCE +INSTANTIABLE +INSTEAD +INTERSECT +INTERVAL +INTO +INVOKER +IS +ISNULL +ISOLATION +ITERATE +JOIN +KEY +KEY_MEMBER +KEYS +KEY_TYPE +KILL +LANCOMPILER +LANGUAGE +LARGE +LAST +LATERAL +LEADING +LEFT +LENGTH +LESS +LEVEL +LIKE +LIMIT +LINES +LISTEN +LOAD +LOCAL +LOCALTIME +LOCALTIMESTAMP +LOCATION +LOCATOR +LOCK +LOWER +LOW_PRIORITY +MAP +MASTER_SERVER_ID +MATCH +MAX +MAXVALUE +MESSAGE_LENGTH +MESSAGE_OCTET_LENGTH +MESSAGE_TEXT +METHOD +MIN +MINUTE +MINVALUE +MOD +MODE +MODIFIES +MODIFY +MODULE +MONTH +MORE +MOVE +MRG_MYISAM +MUMPS +NAME +NAMES +NATIONAL +NATURAL +NEW +NEXT +NO +NOCREATEDB +NOCREATEUSER +NONE +NOT +NOTHING +NOTIFY +NOTNULL +NULL +NULLABLE +NULLIF +NUMBER +NUMERIC +OBJECT +OCTET_LENGTH +OF +OFF +OFFSET +OIDS +OLD +ON +ONLY +OPEN +OPERATION +OPERATOR +OPTIMIZE +OPTION +OPTIONALLY +OPTIONS +OR +ORDER +ORDINALITY +OUT +OUTER +OUTFILE +OUTPUT +OVERLAPS +OVERLAY +OVERRIDING +OWNER +PAD +PARAMETER +PARAMETER_MODE +PARAMETER_NAME +PARAMETER_ORDINAL_POSITION +PARAMETERS +PARAMETER_SPECIFIC_CATALOG +PARAMETER_SPECIFIC_NAME +PARAMETER_SPECIFIC_SCHEMA +PARTIAL +PASCAL +PASSWORD +PATH +PENDANT +PLI +POSITION +POSTFIX +PRECISION +PREFIX +PREORDER +PREPARE +PRESERVE +PRIMARY +PRIOR +PRIVILEGES +PROCEDURAL +PROCEDURE +PUBLIC +PURGE +READ +READS +REAL +RECURSIVE +REF +REFERENCES +REFERENCING +REGEXP +REINDEX +RELATIVE +RENAME +REPEATABLE +REPLACE +REQUIRE +RESET +RESTRICT +RESULT +RETURN +RETURNED_LENGTH +RETURNED_OCTET_LENGTH +RETURNED_SQLSTATE +RETURNS +REVOKE +RIGHT +RLIKE +ROLE +ROLLBACK +ROLLUP +ROUTINE +ROUTINE_CATALOG +ROUTINE_NAME +ROUTINE_SCHEMA +ROW +ROW_COUNT +ROWS +RULE +SAVEPOINT +SCALE +SCHEMA +SCHEMA_NAME +SCOPE +SCROLL +SEARCH +SECOND +SECTION +SECURITY +SELECT +SELF +SENSITIVE +SEQUENCE +SERIALIZABLE +SERVER_NAME +SESSION +SESSION_USER +SET +SETOF +SETS +SHARE +SHOW +SIMILAR +SIMPLE +SIZE +SOME +SONAME +SOURCE +SPACE +SPECIFIC +SPECIFIC_NAME +SPECIFICTYPE +SQL +SQL_BIG_RESULT +SQL_CALC_FOUND_ROWS +SQLCODE +SQLERROR +SQLEXCEPTION +SQL_SMALL_RESULT +SQLSTATE +SQLWARNING +SSL +STABLE +START +STARTING +STATE +STATEMENT +STATIC +STATISTICS +STDIN +STDOUT +STRAIGHT_JOIN +STRIPED +STRUCTURE +STYLE +SUBCLASS_ORIGIN +SUBLIST +SUBSTRING +SUM +SYMMETRIC +SYSID +SYSTEM +SYSTEM_USER +TABLE +TABLE_NAME +TABLES +TEMP +TEMPLATE +TEMPORARY +TERMINATE +TERMINATED +THAN +THEN +TIMEZONE_HOUR +TIMEZONE_MINUTE +TO +TOAST +TRAILING +TRANSACTION +TRANSACTION_ACTIVE +TRANSACTIONS_COMMITTED +TRANSACTIONS_ROLLED_BACK +TRANSFORM +TRANSFORMS +TRANSLATE +TRANSLATION +TREAT +TRIGGER +TRIGGER_CATALOG +TRIGGER_NAME +TRIGGER_SCHEMA +TRIM +TRUE +TRUNCATE +TRUSTED +TYPE +UNCOMMITTED +UNDER +UNENCRYPTED +UNION +UNIQUE +UNKNOWN +UNLISTEN +UNLOCK +UNNAMED +UNNEST +UNSIGNED +UNTIL +UPDATE +UPPER +USAGE +USE +USER +USER_DEFINED_TYPE_CATALOG +USER_DEFINED_TYPE_NAME +USER_DEFINED_TYPE_SCHEMA +USER_RESOURCES +USING +VACUUM +VALID +VALUE +VALUES +VARIABLE +VARYING +VERBOSE +VERSION +VIEW +VOLATILE +WHEN +WHENEVER +WHERE +WITH +WITHOUT +WORK +WRITE +XOR +YEAR +YEAR_MONTH +ZEROFILL +ZONE diff --git a/comp/src/gb.eval.highlight/sql/operators b/comp/src/gb.eval.highlight/sql/operators new file mode 100644 index 00000000..154c7b46 --- /dev/null +++ b/comp/src/gb.eval.highlight/sql/operators @@ -0,0 +1,58 @@ +^ +^= +~ +~= +~* +< +<^ +<< +<<= +<= +<> +<-> += +=> +> +>^ +>= +>> +>>= +| +|| +||/ +|/ +- +, +; +:= +! +!~ +!~* +!= +!! +?| +?|| +?- +?-| +?# +/ +. +.. +( +) +@ +@-@ +@@ +* +** +& +&< +&> +&& +# +## +% ++ +AND +NOT +OR diff --git a/comp/src/gb.form.dialog/.component b/comp/src/gb.form.dialog/.component new file mode 100644 index 00000000..5c1170d4 --- /dev/null +++ b/comp/src/gb.form.dialog/.component @@ -0,0 +1,6 @@ +[Component] +Key=gb.form.dialog +Version=3.14.90 +Authors=Benoît Minisini,David Villalobos Cambronero +Needs=Form +Requires=gb.form diff --git a/comp/src/gb.form.dialog/.directory b/comp/src/gb.form.dialog/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/comp/src/gb.form.dialog/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/comp/src/gb.form.dialog/.icon.png b/comp/src/gb.form.dialog/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a9254f949f86671b58a744a6a93623576acc5217 GIT binary patch literal 10569 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, 2007-2010. +# +# +msgid "" +msgstr "" +"Project-Id-Version: gb.form.dialog\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2010-12-16 23:29+0100\n" +"Last-Translator: Jordi Sayol \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: FFileDialog.form:22 +msgid "Automatic extension" +msgstr "Extensió automàtica" + +#: FDirDialog.form:38 FFileDialog.class:90 FInputDate.form:47 +msgid "Cancel" +msgstr "Canceŀla" + +#: .project:1 +msgid "Enhanced standard dialogs" +msgstr "Diàlegs estàndards millorats" + +#: FDirDialog.form:32 FInputDate.form:41 +msgid "OK" +msgstr "D'acord" + +#: FFileDialog.class:90 +msgid "&Overwrite" +msgstr "&Sobreescriu" + +#: FFileDialog.class:90 +msgid "This file already exists.\n\nDo you want to overwrite it?" +msgstr "Aquest fitxer ja existeix.\n\nEl voleu sobreescriure?" + diff --git a/comp/src/gb.form.dialog/.lang/cs.po b/comp/src/gb.form.dialog/.lang/cs.po new file mode 100644 index 00000000..80e110e3 --- /dev/null +++ b/comp/src/gb.form.dialog/.lang/cs.po @@ -0,0 +1,42 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Enhanced standard dialogs" +msgstr "Rozšířené standardní dialogy" + +#: FDirDialog.form:32 FInputDate.form:41 +msgid "OK" +msgstr "-" + +#: FDirDialog.form:38 FFileDialog.class:92 FInputDate.form:47 +msgid "Cancel" +msgstr "Zrušit" + +#: FFileDialog.class:92 +msgid "&Overwrite" +msgstr "&Přepsat" + +#: FFileDialog.class:92 +msgid "" +"This file already exists.\n" +"\n" +"Do you want to overwrite it?" +msgstr "" +"Tento soubor již existuje.\n" +"\n" +"Chcete jej přepsat?" + +#: FFileDialog.form:22 +msgid "Automatic extension" +msgstr "Automatické rozšíření" diff --git a/comp/src/gb.form.dialog/.lang/de.po b/comp/src/gb.form.dialog/.lang/de.po new file mode 100644 index 00000000..90de2c11 --- /dev/null +++ b/comp/src/gb.form.dialog/.lang/de.po @@ -0,0 +1,42 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Enhanced standard dialogs" +msgstr "Erweiterte Standarddialoge" + +#: FDirDialog.form:32 FInputDate.form:41 +msgid "OK" +msgstr "-" + +#: FDirDialog.form:38 FFileDialog.class:93 FInputDate.form:47 +msgid "Cancel" +msgstr "Abbrechen" + +#: FFileDialog.class:93 +msgid "&Overwrite" +msgstr "&Überschreiben" + +#: FFileDialog.class:93 +msgid "" +"This file already exists.\n" +"\n" +"Do you want to overwrite it?" +msgstr "" +"Diese Datei existiert bereits.\n" +"\n" +"Wollen Sie sie überschreiben?" + +#: FFileDialog.form:22 +msgid "Automatic extension" +msgstr "Automatische Erweiterung" diff --git a/comp/src/gb.form.dialog/.lang/es.po b/comp/src/gb.form.dialog/.lang/es.po new file mode 100644 index 00000000..5a4465a9 --- /dev/null +++ b/comp/src/gb.form.dialog/.lang/es.po @@ -0,0 +1,46 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.form.dialog 3.6.0\n" +"POT-Creation-Date: 2015-09-20 17:52 UTC\n" +"PO-Revision-Date: 2014-10-13 17:28 UTC\n" +"Last-Translator: jesus \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Enhanced standard dialogs" +msgstr "Diálogos estándar mejorados" + +#: FDirDialog.form:32 FFontDialog.form:35 FInputDate.form:41 +msgid "OK" +msgstr "OK" + +#: FDirDialog.form:38 FFileDialog.class:101 FFontDialog.form:41 +#: FInputDate.form:47 +msgid "Cancel" +msgstr "Cancelar" + +#: FFileDialog.class:101 +msgid "&Overwrite" +msgstr "&Sobrescribir" + +#: FFileDialog.class:101 +msgid "" +"This file already exists.\n" +"\n" +"Do you want to overwrite it?" +msgstr "" +"Este archivo ya existe\n" +"\n" +"¿Quiere sobrescribirlo?" + +#: FFileDialog.form:22 +msgid "Automatic extension" +msgstr "Extensión automática" + +#: FFontDialog.form:12 +msgid "Select a font" +msgstr "Seleccionar fuente" diff --git a/comp/src/gb.form.dialog/.lang/es_ES.po b/comp/src/gb.form.dialog/.lang/es_ES.po new file mode 100644 index 00000000..d1bff62c --- /dev/null +++ b/comp/src/gb.form.dialog/.lang/es_ES.po @@ -0,0 +1,46 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.form.dialog 3.6.0\n" +"POT-Creation-Date: 2015-09-20 17:52 UTC\n" +"PO-Revision-Date: 2014-10-13 17:28 UTC\n" +"Last-Translator: jesus \n" +"Language: es_ES\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Enhanced standard dialogs" +msgstr "Diálogos estándar mejorados" + +#: FDirDialog.form:32 FFontDialog.form:35 FInputDate.form:41 +msgid "OK" +msgstr "-" + +#: FDirDialog.form:38 FFileDialog.class:101 FFontDialog.form:41 +#: FInputDate.form:47 +msgid "Cancel" +msgstr "Cancelar" + +#: FFileDialog.class:101 +msgid "&Overwrite" +msgstr "&Sobrescribir" + +#: FFileDialog.class:101 +msgid "" +"This file already exists.\n" +"\n" +"Do you want to overwrite it?" +msgstr "" +"El archivo ya existe.\n" +"\n" +"¿Deseas sobrescribirlo?" + +#: FFileDialog.form:22 +msgid "Automatic extension" +msgstr "Extensión automática" + +#: FFontDialog.form:12 +msgid "Select a font" +msgstr "Seleccionar fuente" diff --git a/comp/src/gb.form.dialog/.lang/fr.po b/comp/src/gb.form.dialog/.lang/fr.po new file mode 100644 index 00000000..8496ef66 --- /dev/null +++ b/comp/src/gb.form.dialog/.lang/fr.po @@ -0,0 +1,63 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.form.dialog 3.10.90\n" +"POT-Creation-Date: 2017-10-09 23:09 UTC\n" +"PO-Revision-Date: 2017-10-09 23:08 UTC\n" +"Last-Translator: benoit \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Enhanced standard dialogs" +msgstr "-" + +#: FAskPassword.form:22 +msgid "Authentication" +msgstr "Identification" + +#: FAskPassword.form:51 +msgid "User" +msgstr "Utilisateur" + +#: FAskPassword.form:65 +msgid "Password" +msgstr "Mot de passe" + +#: FAskPassword.form:78 +msgid "Remember password" +msgstr "Se souvenir du mot de passe" + +#: FAskPassword.form:98 FDirDialog.form:32 FFontDialog.form:35 +#: FInputDate.form:41 +msgid "OK" +msgstr "OK" + +#: FAskPassword.form:104 FDirDialog.form:38 FFileDialog.class:107 +#: FFontDialog.form:41 FInputDate.form:47 +msgid "Cancel" +msgstr "Annuler" + +#: FFileDialog.class:107 +msgid "&Overwrite" +msgstr "&Remplacer" + +#: FFileDialog.class:107 +msgid "" +"This file already exists.\n" +"\n" +"Do you want to overwrite it?" +msgstr "" +"Ce fichier existe déjà.\n" +"\n" +"Désirez-vous le remplacer ?" + +#: FFileDialog.form:22 +msgid "Automatic extension" +msgstr "Extension automatique" + +#: FFontDialog.form:12 +msgid "Select a font" +msgstr "Sélectionnez une police" diff --git a/comp/src/gb.form.dialog/.lang/it.po b/comp/src/gb.form.dialog/.lang/it.po new file mode 100644 index 00000000..46da21e7 --- /dev/null +++ b/comp/src/gb.form.dialog/.lang/it.po @@ -0,0 +1,55 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.form.dialog 3.12.90\n" +"PO-Revision-Date: 2019-01-15 14:36 UTC\n" +"Last-Translator: gian \n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Enhanced standard dialogs" +msgstr "Dialoghi standard avanzati" + +#: FAskPassword.form:22 +msgid "Authentication" +msgstr "Autenticazione" + +#: FAskPassword.form:51 +msgid "User" +msgstr "Utente" + +#: FAskPassword.form:65 +msgid "Password" +msgstr "-" + +#: FAskPassword.form:78 +msgid "Remember password" +msgstr "Ricorda la password" + +#: FAskPassword.form:98 FDirDialog.form:32 FFontDialog.form:35 FInputDate.form:41 +msgid "OK" +msgstr "-" + +#: FAskPassword.form:104 FDirDialog.form:38 FFileDialog.class:107 FFontDialog.form:41 FInputDate.form:47 +msgid "Cancel" +msgstr "Annulla" + +#: FFileDialog.class:107 +msgid "&Overwrite" +msgstr "&Sovrascrivi" + +#: FFileDialog.class:107 +msgid "This file already exists.\n\nDo you want to overwrite it?" +msgstr "Questo file esiste già.\n\nVuoi sovrascriverlo?" + +#: FFileDialog.form:22 +msgid "Automatic extension" +msgstr "Estensione automatica" + +#: FFontDialog.form:12 +msgid "Select a font" +msgstr "Seleziona un font" + diff --git a/comp/src/gb.form.dialog/.lang/ja.po b/comp/src/gb.form.dialog/.lang/ja.po new file mode 100644 index 00000000..9822634a --- /dev/null +++ b/comp/src/gb.form.dialog/.lang/ja.po @@ -0,0 +1,33 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: FDirDialog.class:83 FFileDialog.class:102 FInputDate.class:84 +msgid "OK" +msgstr "-" + +#: FDirDialog.class:89 FFileDialog.class:47 FInputDate.class:90 +msgid "Cancel" +msgstr "キャンセル" + +#: FFileDialog.class:47 +msgid "" +"This file already exists.\n" +"\n" +"Do you want to overwrite it?" +msgstr "" +"ファイルが既に存在します。\n" +"\n" +"上書きしますか?" + +#: FFileDialog.class:47 +msgid "&Overwrite" +msgstr "上書き(&O)" diff --git a/comp/src/gb.form.dialog/.lang/nl.po b/comp/src/gb.form.dialog/.lang/nl.po new file mode 100644 index 00000000..1d21eb69 --- /dev/null +++ b/comp/src/gb.form.dialog/.lang/nl.po @@ -0,0 +1,56 @@ +# Willy Raets < gbWilly@openmailbox.org >, 2014 +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.form.dialog 3.12.2\n" +"PO-Revision-Date: 2019-04-06 18:33 UTC\n" +"Last-Translator: gbWilly \n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Enhanced standard dialogs" +msgstr "Verbeterde standaard dialoog" + +#: FAskPassword.form:22 +msgid "Authentication" +msgstr "Authenticatie" + +#: FAskPassword.form:51 +msgid "User" +msgstr "Gebruiker" + +#: FAskPassword.form:65 +msgid "Password" +msgstr "Wachtwoord" + +#: FAskPassword.form:78 +msgid "Remember password" +msgstr "Wachtwoord onthouden" + +#: FAskPassword.form:98 FDirDialog.form:32 FFontDialog.form:35 FInputDate.form:41 +msgid "OK" +msgstr "OK" + +#: FAskPassword.form:104 FDirDialog.form:38 FFileDialog.class:107 FFontDialog.form:41 FInputDate.form:47 +msgid "Cancel" +msgstr "Annuleren" + +#: FFileDialog.class:107 +msgid "&Overwrite" +msgstr "&Overschrijven" + +#: FFileDialog.class:107 +msgid "This file already exists.\n\nDo you want to overwrite it?" +msgstr "Dit bestand bestaat reeds.\n\nWil je het overschrijven?" + +#: FFileDialog.form:22 +msgid "Automatic extension" +msgstr "Automatische extentie" + +#: FFontDialog.form:12 +msgid "Select a font" +msgstr "Selecteer een lettertype" + diff --git a/comp/src/gb.form.dialog/.lang/pt_BR.po b/comp/src/gb.form.dialog/.lang/pt_BR.po new file mode 100644 index 00000000..60d67ad7 --- /dev/null +++ b/comp/src/gb.form.dialog/.lang/pt_BR.po @@ -0,0 +1,55 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.form.dialog 3.14.90\n" +"PO-Revision-Date: 2020-06-12 00:22 UTC\n" +"Last-Translator: Gen Braga \n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Enhanced standard dialogs" +msgstr "Diálogos padrão melhorados" + +#: FAskPassword.form:22 +msgid "Authentication" +msgstr "Autenticação" + +#: FAskPassword.form:51 +msgid "User" +msgstr "Usuário" + +#: FAskPassword.form:65 +msgid "Password" +msgstr "Senha" + +#: FAskPassword.form:78 +msgid "Remember password" +msgstr "Lembrar senha" + +#: FAskPassword.form:98 FDirDialog.form:32 FFontDialog.form:35 FInputDate.form:41 +msgid "OK" +msgstr "OK" + +#: FAskPassword.form:104 FDirDialog.form:38 FFileDialog.class:107 FFontDialog.form:41 FInputDate.form:47 +msgid "Cancel" +msgstr "Cancelar" + +#: FFileDialog.class:107 +msgid "&Overwrite" +msgstr "&Sobrescrever" + +#: FFileDialog.class:107 +msgid "This file already exists.\n\nDo you want to overwrite it?" +msgstr "O arquivo já existe.\n\nDeseja sobrescreve-lo?" + +#: FFileDialog.form:22 +msgid "Automatic extension" +msgstr "Extensão automática" + +#: FFontDialog.form:12 +msgid "Select a font" +msgstr "Selecione uma fonte" + diff --git a/comp/src/gb.form.dialog/.lang/ru.po b/comp/src/gb.form.dialog/.lang/ru.po new file mode 100644 index 00000000..f71f272b --- /dev/null +++ b/comp/src/gb.form.dialog/.lang/ru.po @@ -0,0 +1,76 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: comp/src/gb.form.dialog/.project:21 +msgid "Enhanced standard dialogs" +msgstr "Расширенные стандартные диалоги" + +#: comp/src/gb.form.dialog/.src/FAskPassword.form:5 +msgid "Authentication" +msgstr "Аутентификация" + +#: comp/src/gb.form.dialog/.src/FAskPassword.form:29 +msgid "User" +msgstr "Пользователь" + +#: comp/src/gb.form.dialog/.src/FAskPassword.form:40 +msgid "Password" +msgstr "Пароль" + +#: comp/src/gb.form.dialog/.src/FAskPassword.form:51 +msgid "Remember password" +msgstr "Запомнить пароль" + +#: comp/src/gb.form.dialog/.src/FAskPassword.form:67 comp/src/gb.form.dialog/.src/FDirDialog.form:21 comp/src/gb.form.dialog/.src/FFontDialog.form:24 comp/src/gb.form.dialog/.src/FInputDate.form:28 +msgid "OK" +msgstr "ОК" + +#: comp/src/gb.form.dialog/.src/FAskPassword.form:72 comp/src/gb.form.dialog/.src/FDirDialog.form:26 comp/src/gb.form.dialog/.src/FFileDialog.class:107 comp/src/gb.form.dialog/.src/FFontDialog.form:29 comp/src/gb.form.dialog/.src/FInputDate.form:33 +msgid "Cancel" +msgstr "Отмена" + +#: comp/src/gb.form.dialog/.src/FFileDialog.class:107 +msgid "" +"This file already exists.\n" +"\n" +"Do you want to overwrite it?" +msgstr "" +"Этот файл уже существует.\n" +"\n" +"Хотите перезаписать его?" + +#: comp/src/gb.form.dialog/.src/FFileDialog.class:107 +msgid "&Overwrite" +msgstr "Перезаписать" + +#: comp/src/gb.form.dialog/.src/FFileDialog.form:16 +msgid "Automatic extension" +msgstr "Автоматическое расширение" + +#: comp/src/gb.form.dialog/.src/FFontDialog.form:5 +msgid "Select a font" +msgstr "Выбрать шрифт" + diff --git a/comp/src/gb.form.dialog/.lang/sv.po b/comp/src/gb.form.dialog/.lang/sv.po new file mode 100644 index 00000000..6a7588a6 --- /dev/null +++ b/comp/src/gb.form.dialog/.lang/sv.po @@ -0,0 +1,32 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: FFileDialog.class:133 +msgid "Automatic extension" +msgstr "Automatisk ifyllnad" + +#: FDirDialog.class:89 FFileDialog.class:85 FInputDate.class:90 +msgid "Cancel" +msgstr "Avbryt" + +#: FDirDialog.class:83 FFileDialog.class:147 FInputDate.class:84 +msgid "OK" +msgstr "OK" + +#: FFileDialog.class:85 +msgid "&Overwrite" +msgstr "&Skriv över" + +#: FFileDialog.class:85 +msgid "This file already exists.\n\nDo you want to overwrite it?" +msgstr "Denna fil finns redan.\n\nVill du skriva över den?" + diff --git a/comp/src/gb.form.dialog/.lang/zh.po b/comp/src/gb.form.dialog/.lang/zh.po new file mode 100644 index 00000000..113690a7 --- /dev/null +++ b/comp/src/gb.form.dialog/.lang/zh.po @@ -0,0 +1,39 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.form.dialog 3.6.90\n" +"PO-Revision-Date: 2014-12-16 11:06 UTC\n" +"Last-Translator: Benoît Minisini \n" +"Language: zh\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Enhanced standard dialogs" +msgstr "增强标准对话框" + +#: FDirDialog.form:32 FFontDialog.form:35 FInputDate.form:41 +msgid "OK" +msgstr "确定" + +#: FInputDate.form:47 +msgid "Cancel" +msgstr "取消" + +#: FFileDialog.class:101 +msgid "&Overwrite" +msgstr "(&O)覆盖" + +#: FFileDialog.class:101 +msgid "This file already exists.\n\nDo you want to overwrite it?" +msgstr "这个文件已经存在。\n\n是否确定覆盖它?" + +#: FFileDialog.form:22 +msgid "Automatic extension" +msgstr "自动添加扩展名" + +#: FFontDialog.form:12 +msgid "Select a font" +msgstr "选择字体" + diff --git a/comp/src/gb.form.dialog/.project b/comp/src/gb.form.dialog/.project new file mode 100644 index 00000000..49355cc4 --- /dev/null +++ b/comp/src/gb.form.dialog/.project @@ -0,0 +1,20 @@ +# Gambas Project File 3.0 +Title=Enhanced standard dialogs +Startup=Main +Version=3.14.90 +VersionFile=1 +Component=gb.image +Component=gb.gui +Component=gb.form +Component=gb.settings +Authors="Benoît Minisini\nDavid Villalobos Cambronero" +Environment="GB_GUI=gb.qt5" +TabSize=2 +Translate=1 +Language=en +Type=Component +Maintainer=David Villalobos Cambronero +Vendor=Princeton +Address=david_villalobos_c@yahoo.com +License=General Public Licence +Packager=1 diff --git a/comp/src/gb.form.dialog/.src/Dialog.class b/comp/src/gb.form.dialog/.src/Dialog.class new file mode 100644 index 00000000..450b1352 --- /dev/null +++ b/comp/src/gb.form.dialog/.src/Dialog.class @@ -0,0 +1,142 @@ +' Gambas class file + +Export + +Static Property Read Paths As String[] +Static Property AutoExt As Boolean + +Static Property {Date} As Date + +Static Property FixedOnly As Boolean + +Static Property Key As String + +Static Property User As String +Static Property Read Password As String +Static Property NoUser As Boolean + +Static Private $sKey As String + +Static Public Function OpenFile(Optional Multi As Boolean) As Boolean + + Return FFileDialog.OpenFile(Multi) + +End + +Static Public Function SaveFile() As Boolean + + Return FFileDialog.SaveFile() + +End + +Static Public Function SelectDirectory() As Boolean + + Return FDirDialog.SelectDirectory() + +End + + +Static Private Function Paths_Read() As String[] + + Return FFileDialog.Paths + +End + + +Static Public Function SelectDate() As Boolean + + Return FInputDate.SelectDate() + +End + + +Static Private Function Date_Read() As Date + + Return FInputDate.Date + +End + +Static Private Sub Date_Write(Value As Date) + + FInputDate.Date = Value + +End + +Static Private Function AutoExt_Read() As Boolean + + Return FFileDialog.AutoExt + +End + +Static Private Sub AutoExt_Write(Value As Boolean) + + FFileDialog.AutoExt = Value + +End + +Static Public Function SelectFont() As Boolean + + Return FFontDialog.SelectFont() + +End + + +Static Private Function FixedOnly_Read() As Boolean + + Return FFontDialog.FixedOnly + +End + +Static Private Sub FixedOnly_Write(Value As Boolean) + + FFontDialog.FixedOnly = Value + +End + +Static Private Function Key_Read() As String + + Return $sKey + +End + +Static Private Sub Key_Write(Value As String) + + $sKey = Value + +End + +Static Public Sub AskPassword() As Boolean + + Return FAskPassword.Run() + +End + +Static Private Function Password_Read() As String + + Return FAskPassword.Password + +End + +Static Private Function NoUser_Read() As Boolean + + Return FAskPassword.NoUser + +End + +Static Private Sub NoUser_Write(Value As Boolean) + + FAskPassword.NoUser = Value + +End + +Static Private Function User_Read() As String + + Return FAskPassword.User + +End + +Static Private Sub User_Write(Value As String) + + FAskPassword.User = Value + +End diff --git a/comp/src/gb.form.dialog/.src/FAskPassword.class b/comp/src/gb.form.dialog/.src/FAskPassword.class new file mode 100644 index 00000000..bd1a1743 --- /dev/null +++ b/comp/src/gb.form.dialog/.src/FAskPassword.class @@ -0,0 +1,102 @@ +' Gambas class file + +Class Desktop + +Static Public NoUser As Boolean +Static Public (User) As String +Static Public Password As String + +Private $bHasDesktop As Boolean +Private $bHasSettings As Boolean +Private $sKey As String + +Public Sub Run() As Boolean + + ' Dim hWindow As Window + Dim bRet As Integer + Dim iBusy As Integer + + ' hWindow = New Window + ' hWindow.Move(0, 0, Screen.Width, Screen.Height) + ' hWindow.Background = Color.Black + ' hWindow.Opacity = 40 + ' hWindow.Border = False + ' hWindow.SkipTaskbar = True + ' hWindow.Show + + iBusy = Application.Busy + Application.Busy = 0 + + bRet = Not Me.ShowModal() + + Application.Busy = iBusy + + Return bRet + +End + +Public Sub btnOK_Click() + + {User} = txtUser.Text + Password = txtPassword.Text + + If $sKey Then + Settings[$sKey &/ "User"] = txtUser.Text + Settings[$sKey &/ "Remember"] = chkRemember.Value + If $bHasDesktop And If chkRemember.Value Then + Desktop.Passwords[Dialog.Key] = txtPassword.Text + Endif + Endif + + Me.Close(True) + +End + +Public Sub btnCancel_Click() + + Me.Close + +End + + +Public Sub Form_Open() + + $bHasSettings = Component.IsLoaded("gb.settings") + $bHasDesktop = Component.IsLoaded("gb.desktop") + + If Dialog.Title Then Me.Title = Dialog.Title + + If $bHasSettings And If Dialog.Key Then $sKey = "gb.form.dialog" &/ Dialog.Key + + If NoUser Then + txtUser.Enabled = False + Else If $sKey Then + txtUser.Text = Settings[$sKey &/ "User"] + Else + txtUser.Text = {User} + Endif + + If $bHasDesktop And If $sKey Then + chkRemember.Show + chkRemember.Value = Settings[$sKey &/ "Remember", False] + If chkRemember.Value Then + txtPassword.Text = Desktop.Passwords[Dialog.Key] + Endif + Else + panPassword.H -= chkRemember.H + Endif + + If txtUser.Length Or If NoUser Then + txtPassword.SetFocus + Else + txtUser.SetFocus + Endif + +End + +Public Sub Form_Close() + + NoUser = False + Dialog.Key = "" + +End diff --git a/comp/src/gb.form.dialog/.src/FAskPassword.form b/comp/src/gb.form.dialog/.src/FAskPassword.form new file mode 100644 index 00000000..ea23cb12 --- /dev/null +++ b/comp/src/gb.form.dialog/.src/FAskPassword.form @@ -0,0 +1,76 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,57,21) + Text = ("Authentication") + Icon = Picture["icon:/small/security"] + Resizable = False + Stacking = Window.Above + Arrangement = Arrange.Vertical + AutoResize = True + Spacing = True + Margin = True + { panPassword HBox + MoveScaled(1,1,52,13) + Spacing = True + { PictureBox1 PictureBox + MoveScaled(1,1,8,11) + Picture = Picture["icon:/huge/security"] + AutoResize = True + } + { Panel4 VBox + MoveScaled(9,0,41,13) + Expand = True + Spacing = True + { HBox2 HBox + MoveScaled(0,0,39,4) + { Label1 Label + MoveScaled(0,0,13,4) + Text = ("User") + } + { txtUser TextBox + MoveScaled(21,0,17,4) + Expand = True + } + } + { HBox3 HBox + MoveScaled(0,5,40,4) + { Label2 Label + MoveScaled(0,0,13,4) + Text = ("Password") + } + { txtPassword TextBox + MoveScaled(21,0,17,4) + Expand = True + Password = True + } + } + { chkRemember CheckBox + MoveScaled(0,9,23,4) + Visible = False + Text = ("Remember password") + } + } + } + { Panel2 Panel + MoveScaled(20,15,3,1) + } + { HBox1 HBox + MoveScaled(1,16,51,4) + Spacing = True + { Panel1 Panel + MoveScaled(3,0,2,4) + Expand = True + } + { btnOK Button + MoveScaled(11,0,16,4) + Text = ("OK") + Default = True + } + { btnCancel Button + MoveScaled(30,0,16,4) + Text = ("Cancel") + Cancel = True + } + } +} diff --git a/comp/src/gb.form.dialog/.src/FDirDialog.class b/comp/src/gb.form.dialog/.src/FDirDialog.class new file mode 100644 index 00000000..02eb9219 --- /dev/null +++ b/comp/src/gb.form.dialog/.src/FDirDialog.class @@ -0,0 +1,61 @@ +' Gambas class file + +Public Sub SelectDirectory() As Boolean + + Return Not Me.ShowModal() + +End + +Public Sub Form_Open() + + ' DEBUG "Dialog.Title:";; Dialog.Title + ' DEBUG "Dialog.Path:";; Dialog.Path + + Me.Title = Dialog.Title + dchChoose.Root = "/" + dchChoose.ShowHidden = Dialog.ShowHidden + + If Component.IsLoaded("gb.settings") And If Dialog.Key Then + Settings.Read(Me, "gb.form.dialog" &/ Dialog.Key) + Settings.Read(dchChoose, "/gb.form.dialog" &/ Dialog.Key &/ "dchChoose") + Endif + + If Not Dialog.Path Then + dchChoose.SelectedPath = "~" + Else + dchChoose.SelectedPath = Dialog.Path + Endif + + If Component.IsLoaded("gb.settings") Then Settings.Read(Me, "gb.form.dialog/FDirDialog") + +End + +Public Sub btnOK_Click() + + Dialog.Path = dchChoose.SelectedPath + Me.Close(True) + +End + +Public Sub btnCancel_Click() + + Me.Close + +End + +Public Sub dchChoose_Activate() + + btnOK.Value = True + +End + +Public Sub Form_Close() + + If Component.IsLoaded("gb.settings") And If Dialog.Key Then + Settings.Write(Me, "gb.form.dialog" &/ Dialog.Key) + Settings.Write(dchChoose, "/gb.form.dialog" &/ Dialog.Key &/ "dchChoose") + Endif + + Dialog.Key = "" + +End diff --git a/comp/src/gb.form.dialog/.src/FDirDialog.form b/comp/src/gb.form.dialog/.src/FDirDialog.form new file mode 100644 index 00000000..eb0e17c9 --- /dev/null +++ b/comp/src/gb.form.dialog/.src/FDirDialog.form @@ -0,0 +1,30 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,64,52) + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + { dchChoose DirChooser + MoveScaled(2,1,56,36) + Expand = True + } + { HBox1 HBox + MoveScaled(1,43,56,4) + Spacing = True + { Panel1 Panel + MoveScaled(3,0,4,4) + Expand = True + } + { btnOK Button + MoveScaled(22,0,16,4) + Text = ("OK") + Default = True + } + { btnCancel Button + MoveScaled(39,0,16,4) + Text = ("Cancel") + Cancel = True + } + } +} diff --git a/comp/src/gb.form.dialog/.src/FFileDialog.class b/comp/src/gb.form.dialog/.src/FFileDialog.class new file mode 100644 index 00000000..e251afef --- /dev/null +++ b/comp/src/gb.form.dialog/.src/FFileDialog.class @@ -0,0 +1,132 @@ +' Gambas class file + +Static Public Paths As String[] +Static Public AutoExt As Boolean + +Private $bMulti As Boolean +Private $bReadOnly As Boolean +Private $bAutoExt As Boolean + +Public Sub OpenFile(bMulti As Boolean) As Boolean + + $bMulti = bMulti + $bReadOnly = True + $bAutoExt = False + Return Not Me.ShowModal() + +End + +Public Sub SaveFile() As Boolean + + $bMulti = False + $bReadOnly = False + $bAutoExt = True + Return Not Me.ShowModal() + +End + +Public Sub Form_Open() + + ' DEBUG "Dialog.Title:";; Dialog.Title + ' DEBUG "Dialog.Path:";; Dialog.Path + + Me.Title = Dialog.Title + fchChoose.ReadOnly = $bReadOnly + fchChoose.Multi = $bMulti + 'fchChoose.Root = "/" + fchChoose.Filter = Dialog.Filter + fchChoose.ShowHidden = Dialog.ShowHidden + + If Component.IsLoaded("gb.settings") And If Dialog.Key Then + Settings.Read(Me, "gb.form.dialog" &/ Dialog.Key) + Settings.Read(fchChoose, "/gb.form.dialog" &/ Dialog.Key &/ "fchChoose") + Endif + + If Dialog.Path Then fchChoose.SelectedPath = Dialog.Path + + If fchChoose.Filter.Count > 1 Then + chkAutoExt.Visible = $bAutoExt + chkAutoExt.Value = AutoExt + Endif + + If Component.IsLoaded("gb.settings") Then Settings.Read(Me, "gb.form.dialog/FFileDialog") + + fchChoose.SetFocus + +End + +Private Sub SetExtension(sPath As String) As String + + Dim aFilter As String[] + Dim iInd As Integer + Dim sExt As String + Dim bGotIt As Boolean + + aFilter = Dialog.Filter + For iInd = 0 To aFilter.Max Step 2 + Try sExt = Scan(Split(aFilter[iInd], ";")[0], "\\*.*")[0] + If Not sExt Then Continue + If sExt = "*" Then Continue + If sPath Ends "." & sExt Then + sPath = Left$(sPath, -Len(sExt) - 1) + bGotIt = True + Break + Endif + Next + + If Not bGotIt Then sPath = File.SetExt(sPath, "") + + Try sExt = Scan(Split(aFilter[fchChoose.FilterIndex * 2], ";")[0], "[*].*")[0] + If sExt Then sPath &= "." & sExt + Return sPath + +End + +Public Sub fchChoose_Activate() + + Dim sPath As String + Dim aPath As String[] + + If fchChoose.Multi Then + + aPath = fchChoose.SelectedPaths + If aPath.Count = 0 Then Return + + Paths = aPath + + Else + + sPath = fchChoose.SelectedPath + If Not sPath Or If IsDir(sPath) Then Return + + Dialog.AutoExt = chkAutoExt.Value + If Dialog.AutoExt Then sPath = SetExtension(sPath) + Dialog.Path = sPath + If Not fchChoose.ReadOnly Then + If Exist(sPath) Then + If Message.Warning(("This file already exists.\n\nDo you want to overwrite it?"), ("&Overwrite"), ("Cancel")) = 2 Then Return + Endif + Endif + + Endif + + Me.Close(True) + +End + +Public Sub fchChoose_Cancel() + + Me.Close + +End + +Public Sub Form_Close() + + If Component.IsLoaded("gb.settings") And If Dialog.Key Then + Settings.Write(Me, "gb.form.dialog" &/ Dialog.Key) + Settings.Write(fchChoose, "/gb.form.dialog" &/ Dialog.Key &/ "fchChoose") + Endif + + Dialog.Key = "" + +End diff --git a/comp/src/gb.form.dialog/.src/FFileDialog.form b/comp/src/gb.form.dialog/.src/FFileDialog.form new file mode 100644 index 00000000..b880b42c --- /dev/null +++ b/comp/src/gb.form.dialog/.src/FFileDialog.form @@ -0,0 +1,18 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,81,62) + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + { fchChoose FileChooser + MoveScaled(3,1,72,48) + Expand = True + ShowButton = True + } + { chkAutoExt CheckBox + MoveScaled(3,54,53,4) + Visible = False + Text = ("Automatic extension") + } +} diff --git a/comp/src/gb.form.dialog/.src/FFontDialog.class b/comp/src/gb.form.dialog/.src/FFontDialog.class new file mode 100644 index 00000000..d0cb8d14 --- /dev/null +++ b/comp/src/gb.form.dialog/.src/FFontDialog.class @@ -0,0 +1,60 @@ +' Gambas class file + +Static Public FixedOnly As Boolean + +Static Public Function SelectFont() As Boolean + + Return Not FFontDialog.ShowModal() + +End + + +Public Sub btnOK_Click() + + If dlgFont.SelectedFont Then + Dialog.Font = Font[dlgFont.SelectedFont] + Else + Dialog.Font = Null + Endif + Me.Close(True) + +End + +Public Sub btnCancel_Click() + + Me.Close + +End + +Public Sub Form_Open() + + Me.Title = Dialog.Title + dlgFont.FixedOnly = FixedOnly + + If Component.IsLoaded("gb.settings") And If Dialog.Key Then + Settings.Read(Me, "gb.form.dialog" &/ Dialog.Key) + Endif + + If Dialog.Font Then + dlgFont.SelectedFont = Dialog.Font.ToString() + Else + dlgFont.SelectedFont = Null + Endif + +End + +Public Sub dlgFont_Activate() + + btnOK.Value = True + +End + +Public Sub Form_Close() + + If Component.IsLoaded("gb.settings") And If Dialog.Key Then + Settings.Write(Me, "gb.form.dialog" &/ Dialog.Key) + Endif + + Dialog.Key = "" + +End diff --git a/comp/src/gb.form.dialog/.src/FFontDialog.form b/comp/src/gb.form.dialog/.src/FFontDialog.form new file mode 100644 index 00000000..9c5528a9 --- /dev/null +++ b/comp/src/gb.form.dialog/.src/FFontDialog.form @@ -0,0 +1,33 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,75,56) + Text = ("Select a font") + Persistent = True + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + { dlgFont FontChooser + MoveScaled(2,2,66,48) + Expand = True + ShowRelative = False + } + { Panel2 HBox + MoveScaled(6,51,49,4) + Spacing = True + { Panel1 Panel + MoveScaled(0,0,8,4) + Expand = True + } + { btnOK Button + MoveScaled(11,0,15,4) + Text = ("OK") + Default = True + } + { btnCancel Button + MoveScaled(27,0,15,4) + Text = ("Cancel") + Cancel = True + } + } +} diff --git a/comp/src/gb.form.dialog/.src/FInputDate.class b/comp/src/gb.form.dialog/.src/FInputDate.class new file mode 100644 index 00000000..4677c700 --- /dev/null +++ b/comp/src/gb.form.dialog/.src/FInputDate.class @@ -0,0 +1,43 @@ +' Gambas class file + +Static Public {Date} As Date + +Public Function SelectDate() As Boolean + + Return Not Me.ShowModal() + +End + +Public Sub Form_Open() + + Me.Center + lblMessage.Text = Dialog.Title + Me.Title = lblMessage.Text + dlgDate.Value = {Date} + +End + +Public Sub btnCancel_Click() + + Me.Close(False) + +End + +Public Sub btnOK_Click() + + {Date} = dlgDate.Value + Me.Close(True) + +End + +Public Sub dlgDate_Activate() + + btnOK.Value = True + +End + +Public Sub Form_Close() + + Dialog.Key = "" + +End diff --git a/comp/src/gb.form.dialog/.src/FInputDate.form b/comp/src/gb.form.dialog/.src/FInputDate.form new file mode 100644 index 00000000..6ddfd05f --- /dev/null +++ b/comp/src/gb.form.dialog/.src/FInputDate.form @@ -0,0 +1,37 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,59,43) + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + { lblMessage TextLabel + MoveScaled(1,1,48,4) + Visible = False + Font = Font["+1"] + AutoResize = True + Alignment = Align.Center + } + { dlgDate DateChooser + MoveScaled(1,6,48,31) + Expand = True + } + { HBox1 HBox + MoveScaled(1,38,48,4) + Spacing = True + { Panel1 Panel + MoveScaled(7,0,2,4) + Expand = True + } + { btnOK Button + MoveScaled(15,0,16,4) + Text = ("OK") + Default = True + } + { btnCancel Button + MoveScaled(32,0,16,4) + Text = ("Cancel") + Cancel = True + } + } +} diff --git a/comp/src/gb.form.dialog/.src/Main.module b/comp/src/gb.form.dialog/.src/Main.module new file mode 100644 index 00000000..37ff46a8 --- /dev/null +++ b/comp/src/gb.form.dialog/.src/Main.module @@ -0,0 +1,15 @@ +' Gambas module file + +Public Sub Main() + + Dialog.Title = "Commit" + ' Dialog.Filter = ["*.tar.gz", "Archive files", "*.png", "PNG files", "*.jpg;*.jpeg", "JPEG files", "*.bmp", "BMP files"] + ' Dialog.AutoExt = True + ' If Dialog.SaveFile() Then Return + ' Print Dialog.Path + Dialog.Key = "test" + Dialog.NoUser = True + Dialog.AskPassword() + +End + diff --git a/comp/src/gb.form.editor/.component b/comp/src/gb.form.editor/.component new file mode 100644 index 00000000..d82d6490 --- /dev/null +++ b/comp/src/gb.form.editor/.component @@ -0,0 +1,5 @@ +[Component] +Key=gb.form.editor +Version=3.15.90 +Needs=Form +Requires=gb.eval.highlight,gb.util,gb.form diff --git a/comp/src/gb.form.editor/.directory b/comp/src/gb.form.editor/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/comp/src/gb.form.editor/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/comp/src/gb.form.editor/.hidden/CHANGELOG b/comp/src/gb.form.editor/.hidden/CHANGELOG new file mode 100644 index 00000000..f87d8ed0 --- /dev/null +++ b/comp/src/gb.form.editor/.hidden/CHANGELOG @@ -0,0 +1,3 @@ +* Sat Jun 13 2020 Benoît Minisini 3.14.90 +- Version initiale + diff --git a/comp/src/gb.form.editor/.hidden/control/texteditor.png b/comp/src/gb.form.editor/.hidden/control/texteditor.png new file mode 100644 index 0000000000000000000000000000000000000000..e415f82da0bd161d895b9167e1d1858d73e633b2 GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv(Ey(i*M^3M|Ns9VIB?*90|P_- zf1vQQXU|+TPQC=PTs>VJLp07OCpfV8G-)_6ggSV1W-ulSvAV>twD$6{x;isI)RJj! z%wn1tvVhZqOGtD}@4m!C791Tj+vJ4EY-_>?^$9D+=4P@|i^>bP0l+XkK DD0(jN literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.editor/.icon.png b/comp/src/gb.form.editor/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8ed9712e2dc11b98a5e0cea1f97901e16cbda995 GIT binary patch literal 6146 zcmb7Ic|26#`@dtxQr1vJHAqs{LW?kykPuR2-^$L6O0v#ONM-Ut2+5wMBwLIOh9o{s zvP{T2vdc2IF~*pg-{{r%`}+R-JFk0R=brPN`#kq~KhJsI=XIZ2nqL;&E43E@0KqH9 z237z7;yi)?J|0fzc(=rp)9nc~wz~%aLZ5eUP^yxUGyq6^xMFbeM#!tB(W}pnUa{vH zKPy)~f=IxB)t$^ZQF&}`KUnH@k5v?ysH`vb5W-a%?pD|sI3zvs$KPFCnp-O^Kj zV?NnCv6IHpiI(?(8XNl?Ln^UDK3&h=+{ZfwYe!wWZD15jg8AUT!dCUH-qtS$X**@n z+az2Jia>JzzgDm2P7;iu;1j3`Y>SWNWLNBIwo?p@nZT|*)OrYu6%EE zvukJYGI}is-4tE--So>L!upbfb;oz_o1wW0eXM zw9tb2pT2+q#i-_nerU;e;H^39>%h~yN;=h7pIF6?vtQ9(_J+gZ9fQ>-${{WUsv69h z*);P&?N&N1qI-?8VC-hjGR%Opr-h+e!S!ec6utWE!uo*R=`%urN#=BCHDr|Jeh+Jo zQu@a8X&^%)V}H=f%S0O>1?RlgpvrrQu)n|Ca&PJmjY=M_?ble~wKMWT*F-we>F$w& zWoum%{c71X4U8diAt!=v3)5xRZHw*OU;7+ni_AV2!Z1_SrMKGjeTa3RnUWBlx&6lb zX&RNyq}Hfz(>{gwqAwiWIX2UGGOpd@V@)<`jlp=6=Vea~jBJiTIfX`uLZ8i&Q=Ifq6lrN1kX>UO(&C=y7w~C4#yspp;2p(?_*Y&Oj?H+_7M|J zqqtr;Qxd~KXv73gwUklNl1O~pw)>gziVOB6q6Iop{z_bRF=eN<{T*-jA%`wt@ov9r z6vknICC*yFCYM*$S@+FKv_yvzks7g9Y(4K(?kMG>6t>^7+*HD?d`&A$-TYirhH!JA zs2R7*OL9#R#rg(goyvRxZ6kLvrPtYCurJi~7_vnqfdq%*E2XVrfHgi%pjq4Rc*xL; z{e7&qR5bqkryLZS-1G(7P9qchLH04F-uV_3h4zSyxn;uV9tjWcG!7*vox2Bu@qjIf# z2sn!Mv-a?X(DJ?(8~;kxZ}MOFN7_jhKj`xD$zI

        Q+OJupu>M9?(laUSWiFsfpN} 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�TlbG|HiyU!ar0obtUITn9&ItX)(Y!E z4n^ApYAD-4$$ekq!~y#1x7x>w?g9X3dkVTt z%u*rnd)@tY%etVY>E=$MK$M-M(1_mIi?TZrbVJzY8RyNr<0wMHY*!94==_TFsF?a) zWv=%p8dzj=NL6dteFd%naRAe|yvG~K=dQ*MxR1?zsLTgoKE|gt${G{M?R|ZHLuVnC z!^4??2*;CB&;Z9aI?|!332k@QbD7*p73&@D!dlR>)5G z{<|yL`H7D}fI4&QPN&k79W|ao830g-Cr@E7N&=g_Sd4=eEgO@!Qu@jBW(OFfGGRUP z#g8*=@!jjkm5I{&IkuY}JQc^RwH}sLMQ*($&sD2fYk{;QUhOd!KQ$)$OiqHf`b~gS zzjh-!sR;ZjY`Zii2|SVe0>H&jISU$J!*V?R8-3OPmGN*YU?rdN9qg_Z&f4Aae=DLg zm(>VoqlKEP$2pF)Yv6Yc^kKwne(qM=zt#ORND;xQW8Zd-QFvZQ%f`T;%Nvu#N%KL! z>V00yT@mHmM^h)C765`oVnjHCcq4EE6lU~Xo__$TDdnvxWlT!B=nCQiwE3(|B!HKl zGrd6I-MbT9n3To&@2zq&has7)vr>YJg`C-{z)1XZF9JT*uAu>FOIn%8Ux`XiPA)79 z;~0G&Q^pqES@>Jd|0MWdmrFq>d@G?{i(DMp14#ZZ9sHppEJhsnhdTa;s{RYxKU|i( z-e-XRN8x|mKL9$h>-8UnyWH`|*e==q)%c&d>|(t&$|1}c5fOd3$;VzAbC9~YP$IR< z$&96D`%H7ZmG7_Z&4tfts0)Ep9G;AJBOJEn`^D9wqvXZ^2iZB9pJHLD$z-%39>AUg zrc$gV6WS$(9@jNCj#8JqUyP28xt}}au5(0fN$+#aP4G;Wa;vL4ynFx*e6TM&OxYJe z3Or{}KCnCa!ee>$mTvaVHUSwgFaSI=I;trZ|7S^v&KFnp^gTf3Eudo%P?w7DrqFIm z`R2FgrRcx#K*&ZH0O!lJ6q5HSB>(&V!J{L+Nk_U$-8C+YSI*%9bjY>^evCUm%k4i& z#7QdgQ~%A9-7{5)srsK>`;(C3r~3bcursorGoto(cy, cx, false); +' if (sx >= 0) +' { +' //qDebug("select %d %d %d %d", sx, sy, sx2, sy2); +' doc->startSelection(view, sy, sx); +' doc->endSelection(sy2, sx2); +' } +' } +' +' void GCommandDocument::print() const +' { +' qDebug("- %d %d [%d %d %d %d]", cx, cy, sx, sy, sx2, sy2); +' } +' + +' Public Sub Equals(hOther As CCommand) As Boolean +' +' If hOther.X = X And If hOther.Y = Y And If hOther.SX = SX And If hOther.SY = SY Then Return True +' +' End + + +' bool GCommandDocument::equals(GCommandDocument *o) const +' { +' return view == o->view && cx == o->cx && cy == o->cy +' && sx == o->sx && sy == o->sy && sx2 == o->sx2 && sy2 == o->sy2; +' } +' +' class GCommand +' { +' public: +' enum Type +' { +' None, Begin, End, Move, Insert, Delete, Indent, Unindent +' }; +' GCommandDocument info; +' +' virtual ~GCommand() { } +' virtual Type type() const { return None; } +' virtual int nest() const { return 0; } +' virtual void print() const { } +' virtual bool merge(GCommand *) const { return false; } +' virtual void process(GDocument *doc, bool undo) const { } +' virtual bool linked() const { return false; } +' virtual bool remove(GCommand *) const { return false; } +' }; +' +' class GBeginCommand: public GCommand +' { +' public: +' bool _linked; +' +' GBeginCommand(GCommandDocument *info, bool linked = false) { _linked = linked; this->info = *info; } +' Type type() const { return Begin; } +' void print() const { qDebug("Begin"); info.print(); } +' int nest() const { return 1; } +' bool linked() const { return _linked; } +' void process(GDocument *doc, bool undo) const { info.process(doc); } +' }; +' +' class GEndCommand: public GCommand +' { +' public: +' bool _linked; +' +' GEndCommand(bool linked = false) { _linked = linked; } +' Type type() const { return End; } +' void print() const { qDebug("End"); } +' int nest() const { return -1; } +' bool linked() const { return _linked; } +' bool remove(GCommand *o) const { return (o->type() == Begin); } +' }; +' +' class GDeleteCommand: public GCommand +' { +' public: +' int x, y, x2, y2; +' GString str; +' +' GDeleteCommand(GCommandDocument *info, int y, int x, int y2, int x2, const GString &str) +' { +' this->x = x; this->y = y; this->x2 = x2; this->y2 = y2; this->str = str; +' this->info = *info; +' } +' +' Type type() const { return Delete; } +' void print() const { qDebug("Delete: (%d %d)-(%d %d): '%s'", x, y, x2, y2, TO_UTF8(str.getString())); info.print(); } +' +' bool merge(GCommand *c) const +' { +' if (c->type() != type()) +' return false; +' +' GDeleteCommand *o = (GDeleteCommand *)c; +' +' if (info.view != o->info.view) +' return false; +' +' if (x2 != o->x || y2 != o->y || o->y != o->y2) +' return false; +' +' o->str.prepend(str); +' o->x = x; +' o->y = y; +' //o->info = info; +' return true; +' } +' +' void process(GDocument *doc, bool undo) const +' { +' if (undo) +' doc->insert(y, x, str); +' else +' doc->remove(y, x, y2, x2); +' +' info.process(doc); +' } +' }; +' +' class GInsertCommand: public GDeleteCommand +' { +' public: +' GInsertCommand(GCommandDocument *info, int y, int x, int y2, int x2, const GString &str): +' GDeleteCommand(info, y, x, y2, x2, str) {} +' Type type() const { return Insert; } +' void print() const { qDebug("Insert: (%d %d)-(%d %d): '%s'", x, y, x2, y2, TO_UTF8(str.getString())); info.print(); } +' +' bool merge(GCommand *c) const +' { +' if (c->type() != type()) +' return false; +' +' if (str.length() && str.isNewLine(0)) +' return false; +' +' GInsertCommand *o = (GInsertCommand *)c; +' +' if (o->info.view != info.view) +' return false; +' +' if (o->str.length() && o->str.isNewLine(str.length() - 1)) +' return false; +' +' if (x != o->x2 || y != o->y2) +' return false; +' +' o->str += str; +' o->x2 = x2; +' o->y2 = y2; +' return true; +' } +' +' void process(GDocument *doc, bool undo) const +' { +' GDeleteCommand::process(doc, !undo); +' } +' }; +' + +Private Function Length_Read() As Integer + + Return Abs(X - XA) + +End diff --git a/comp/src/gb.form.editor/.src/CCommandBefore.class b/comp/src/gb.form.editor/.src/CCommandBefore.class new file mode 100644 index 00000000..85cb4827 --- /dev/null +++ b/comp/src/gb.form.editor/.src/CCommandBefore.class @@ -0,0 +1,7 @@ +' Gambas class file + +Public BreakpointBefore As Collection +Public BreakpointAfter As Collection + +Public BookmarkBefore As Collection +Public BookmarkAfter As Collection diff --git a/comp/src/gb.form.editor/.src/CDocument.class b/comp/src/gb.form.editor/.src/CDocument.class new file mode 100644 index 00000000..1cc026f1 --- /dev/null +++ b/comp/src/gb.form.editor/.src/CDocument.class @@ -0,0 +1,1889 @@ +' Gambas class file + +Event _Fake + +Property Text As String +Property Read Count As Integer +Property Read Max As Integer +Property Read Current As TextEditor +Property Highlight As String +Property Mode As String +Property Read Length As Integer +Property Read Keywords As String[] +Property Breakpoints As Integer[] +Property DisabledBreakpoints As Integer[] +Property Bookmarks As Integer[] +Property EndOfLine As Integer +Property CloseBraces As Boolean +Property CloseStrings As Boolean +Property Read DiffMode As Boolean + +Public Const ROW_NOT_FOUND As Integer = -2 + +Public Lines As String[] +Public LinesInfo As CLineInfo[] +Public LineLength As Integer[] + +Public XAfter As Integer +Public YAfter As Integer + +Public DiffAdded As Integer[] +Public DiffRemoved As Collection + +Private $aUndo As New CCommand[] +Private $aRedo As New CCommand[] +Private $iNoUndo As Integer + +Private $hDefaultInfo As New CLineInfo + +Private $hHighlight As TextHighlighter + +Private $bHighlighting As Boolean +Private $cHighlightLater As Collection +Private $iNoHighlight As Integer +Private $iBegin As Integer + +Public _Mode As TextEditorMode +Private $sMode As String +Private $bCloseBraces As Boolean +Private $bCloseStrings As Boolean + +Private $iEndOfLine As Integer = gb.Unix +Private $sEndOfLine As String = "\n" + +Private $cBreakpoint As Collection +Private $cBookmark As Collection +Private $hCommandBefore As CCommandBefore + +Public Sub _new() + + _Mode = New TextEditorMode + Clear + +End + +Public Sub Clear() + + Dim hView As TextEditor + Dim aViews As TextEditor[] + + Lines = New String[1] + LinesInfo = New CLineInfo[1] + LineLength = New Integer[1] + $aUndo.Clear + $aRedo.Clear + $iBegin = 0 + $iNoHighlight = 0 + $cHighlightLater = Null + $cBreakpoint = New Collection + $cBookmark = New Collection + + Try aViews = GetAllViews() + If aViews Then + For Each hView In aViews + hView.Goto(0, 0) + Next + Endif + +End + +Private Function Text_Read() As String + + Return Lines.Join($sEndOfLine) + +End + +Private Sub UpdateLineLength() + + Dim I As Integer + + LineLength = New Integer[Lines.Count] + For I = 0 To Lines.Max + LineLength[I] = String.Len(Lines[I]) + Next + +End + +Private Sub Text_Write(Value As String) + + Clear + + If Value Then + Lines = Split(Value, "\n") + LinesInfo = New CLineInfo[Lines.Count] + UpdateLineLength + HighlightFrom(0) + LayoutLines + Endif + +End + +Private Sub LayoutLines() + + Dim hView As TextEditor + + For Each hView In GetAllViews() + hView._UpdateAllHeight + Next + +End + +Public Sub Load(sPath As String, bAddNewLine As Boolean) + + Dim hFile As File + Dim sLine As String + + hFile = Open sPath + + Clear + Lines.Clear + + For Each sLine In hFile.Lines + Lines.Add(sLine) + Next + + If Not hFile.EndOfFile Then + Lines.Add("") + Else If bAddNewLine And If Trim(sLine) Then + Lines.Add("") + Endif + + LinesInfo = New CLineInfo[Lines.Count] + UpdateLineLength + HighlightFrom(0) + LayoutLines + +End + +Public Sub Save(sPath As String) + + Dim hFile As File + Dim I As Integer + + hFile = Open sPath For Create + hFile.EndOfLine = $iEndOfLine + For I = 0 To Lines.Max - 1 + Print #hFile, Lines[I] + Next + Print #hFile, Lines[Lines.Max]; + + Close #hFile + + Reset(True) + +End + + +Private Function Count_Read() As Integer + + Return Lines.Count + +End + +Private Function Max_Read() As Integer + + Return Lines.Max + +End + +Public Sub Begin() + + If $iNoUndo Then Return + Inc $iBegin + AddUndo(CCommand(Me, CCommand.BEGIN,, Me.Current.Column, Me.Current.Line)) + DisableHighlight + +End + +Public Sub End() + + If $iNoUndo Then Return + If $iBegin = 0 Then Error.Raise("Missing call to Begin") + Dec $iBegin + EnableHighlight + AddUndo(CCommand(Me, CCommand.END,, Me.Current.Column, Me.Current.Line)) + + CheckUnlock + +End + +Private Function Current_Read() As TextEditor + + Return Object.Parent(Me) + +End + +Private Sub GetAllViews() As TextEditor[] + + Return Me.Current._GetViews() + +End + +Public Sub Refresh(Optional Y As Integer = -1) + + Dim hView As TextEditor + + If Y < 0 Then + For Each hView In GetAllViews() + hView.Refresh + Next + Else + For Each hView In GetAllViews() + hView._RefreshLine(Y) + Next + Endif + +End + +Private Sub RemoveCollection(cCol As Collection, Y As Integer, N As Integer) As Collection + + Dim cNew As Collection + Dim bValue As Boolean + Dim iLine As Integer + + If cCol.Count = 0 Then Return cCol + + cNew = New Collection + For Each bValue In cCol + iLine = CInt(cCol.Key) + If iLine < Y Then + Else If iLine >= (Y + N) Then + iLine -= N + Else + Continue + Endif + cNew[iLine] = bValue + Next + + Return cNew + +End + + +Private Sub RemoveLines(Y As Integer, N As Integer) + + Lines.Remove(Y, N) + LinesInfo.Remove(Y, N) + LineLength.Remove(Y, N) + + StartBefore() + $cBookmark = RemoveCollection($cBookmark, Y, N) + $cBreakpoint = RemoveCollection($cBreakpoint, Y, N) + +End + +Private Sub InsertCollection(cCol As Collection, Y As Integer) As Collection + + Dim bValue As Boolean + Dim iLine As Integer + Dim cNew As Collection + + If cCol.Count = 0 Then Return cCol + + cNew = New Collection + For Each bValue In cCol + iLine = CInt(cCol.Key) + If iLine >= Y Then Inc iLine + cNew[iLine] = bValue + Next + + Return cNew + +End + +Private Sub SameCollection(cCol1 As Collection, cCol2 As Collection) As Boolean + + Dim vVal As Variant + + If cCol1.Count <> cCol2.Count Then Return + If cCol1.Count = 0 Then Return True + + If cCol1.Count > cCol2.Count Then Swap cCol1, cCol2 + + For Each vVal In cCol1 + If cCol2[cCol1.Key] <> vVal Then Return + Next + + Return True + +End + + +Private Sub StartBefore() + + If $iNoUndo Then Return + + If Not $hCommandBefore Then + $hCommandBefore = New CCommandBefore + With $hCommandBefore + .BreakpointBefore = $cBreakpoint.Copy() + .BookmarkBefore = $cBookmark.Copy() + End With + Endif + +End + +Private Sub EndBefore() As CCommandBefore + + Dim hCommandBefore As CCommandBefore = $hCommandBefore + + If $iNoUndo Then Return + + $hCommandBefore = Null + If Not hCommandBefore Then Return + + With hCommandBefore + If SameCollection(.BreakpointBefore, $cBreakpoint) Then + .BreakpointBefore = Null + Else + .BreakpointAfter = $cBreakpoint.Copy() + Endif + If SameCollection(.BookmarkBefore, $cBookmark) Then + .BookmarkBefore = Null + Else + .BookmarkAfter = $cBookmark.Copy() + Endif + + If Not .BookmarkBefore And If Not .BreakpointBefore Then Return + + End With + + Return hCommandBefore + +End + + +Private Sub InsertLine(Y As Integer) + + Lines.Add("", Y) + LineLength.Add(0, Y) + LinesInfo.Add(CLineInfo(), Y) + LinesInfo[Y].Modified = True + + StartBefore() + $cBookmark = InsertCollection($cBookmark, Y) + $cBreakpoint = InsertCollection($cBreakpoint, Y) + +End + +' void GDocument::insertLine(int y) +' { +' lines.insert(y, new GLine()); +' modifyLine(lines.at(y), y); +' FOR_EACH_VIEW(v) { v->lineInserted(y); } +' } + +Public Sub SetLine(Y As Integer, sLine As String, Optional bNoRefresh As Boolean) + + Dim hView As TextEditor + + If Info(Y).Colors Then SetInfo(Y).ClearHighlight + If sLine = Lines[Y] Then Return + + Lines[Y] = sLine + LineLength[Y] = String.Len(sLine) + SetInfo(Y).Modified = True + + For Each hView In GetAllViews() + hView._ClearCachePos(Y) + hView._UpdateLineHeight(Y) + hView._RaiseChange + Next + + If Not bNoRefresh Then Refresh(Y) + +End + +Public Sub Insert(sText As String, X As Integer, Y As Integer) + + Dim iLen As Integer + Dim sRest As String + Dim aText As String[] + Dim I, N As Integer + Dim sLine As String + Dim hView As TextEditor + Dim XO, YO As Integer + Dim bHighlight As Boolean + Dim YA As Integer + Dim XA As Integer + + If Not sText Then Return + + 'Debug X;; Y;; Quote(sText);; System.Backtrace.Join(" ") + + XO = X + YO = Y + + ' While Y >= Lines.Count + ' InsertLine(Lines.Count) + ' Inc N + ' Wend + + iLen = LineLength[Y] + If X > iLen Then SetLine(Y, Lines[Y] & Space$(X - iLen), True) + + sRest = String.Mid$(Lines[Y], X + 1) + aText = Split(sText, "\n") + + N = aText.Max + + If N > 0 Then + For Each hView In GetAllViews() + hView._BeforeInsert(YO, N) + Next + Endif + + For I = 0 To aText.Max - 1 + + SetLine(Y, String.Left(Lines[Y], X) & aText[I], True) + X = 0 + Inc Y + InsertLine(Y) + bHighlight = True + + Next + + sLine = String.Left(Lines[Y], X) & aText[aText.Max] + XA = String.Len(sLine) + YA = Y + SetLine(Y, sLine & sRest, True) + + XAfter = XA + YAfter = YA + + If $iNoUndo = 0 Then + AddUndo(CCommand(Me, CCommand.INSERT, sText, XO, YO, XA, YA, EndBefore())) + Endif + + For Each hView In GetAllViews() + If N > 0 Then + hView._ClearCachePos + hView._RaiseChange + hView.Refresh + Else + hView._RefreshLine(YO) + Endif + hView._AfterInsert(YO, YAfter, N) + Next + + If bHighlight Then HighlightFrom(YO) + + XAfter = XA + YAfter = YA + +End + +' +' void GDocument::insert(int y, int x, const GString &text, bool doNotMove) +' { +' int pos; +' int len; +' int pos2; +' int xs, ys; +' GLine *l; +' int n = 1; +' int nl = 0; +' GString rest; +' int yy; +' int i, ns; +' GCommandDocument info(this); +' +' if (readOnly || text.length() == 0) +' { +' xAfter = x; +' yAfter = y; +' return; +' } +' +' FOR_EACH_VIEW(v) +' { +' v->nx = v->x; +' v->ny = v->y; +' } +' +' disableColorize(); +' +' while (y >= (int)lines.count()) +' { +' yy = (int)lines.count(); +' insertLine(yy); +' nl++; +' } +' +' l = lines.at(y); +' +' ns = x - (int)l->s.length(); +' if (ns > 0) +' { +' GString str; +' +' for (i = 0; i < ns; i++) +' str.append(' '); +' +' insert(y, x - ns, str, doNotMove); +' } +' +' xs = x; +' ys = y; +' pos = 0; +' +' for(;;) +' { +' pos2 = text.findNextLine(pos, len); +' +' l = lines.at(y); +' +' if (len > 0) +' { +' l->insert(x, text.mid(pos, len)); +' modifyLine(l, y); +' +' //maxLength = GMAX(maxLength, (int)l->s.length()); +' //updateLineWidth(y); +' +' FOR_EACH_VIEW(v) +' { +' if (v->ny == y && v->nx >= x) +' v->nx += len; +' } +' +' x += len; +' } +' +' pos = pos2; +' +' if (pos == 0) +' break; +' +' if (x < (int)l->s.length()) +' { +' rest = l->s.mid(x); +' +' l->s.remove(x, rest.length()); +' modifyLine(l, y); +' } +' +' FOR_EACH_VIEW(v) +' { +' if (v->ny >= y) +' v->ny++; +' } +' +' y++; +' +' insertLine(y); +' nl++; +' +' n = -1; +' x = 0; +' +' } +' +' if (n < 0 && rest.length()) +' { +' l->insert(x, rest); +' modifyLine(l, y); +' //maxLength = GMAX(maxLength, (int)l->s.length()); +' //updateLineWidth(y); +' } +' +' FOR_EACH_VIEW(v) +' { +' v->foldInsert(ys, nl); +' } +' +' begin(); +' addUndo(new GInsertCommand(&info, ys, xs, y, x, text)); +' enableColorize(); +' end(); +' +' updateViews(ys, n); +' +' yAfter = y; +' xAfter = x; +' +' emitTextChanged(); +' +' if (!doNotMove) +' { +' FOR_EACH_VIEW(v) +' { +' v->cursorGoto(v->ny, v->nx, FALSE); +' } +' } +' } +' + +' Private Sub RemoveLine(Y As Integer) +' +' Lines.Remove(Y) +' LinesInfo.Remove(Y) +' +' End + + +' void GDocument::removeLine(int y) +' { +' lines.remove(y); +' COLORIZE_FROM(y); +' FOR_EACH_VIEW(v) { v->lineRemoved(y); } +' } +' + +Public Sub Remove(X1 As Integer, Y1 As Integer, X2 As Integer, Y2 As Integer, Optional bRight As Boolean) + + Dim sText As String + Dim hView As TextEditor + Dim bHighlight As Boolean + + sText = GetText(X1, Y1, X2, Y2) + + If Y1 > Y2 Then + Swap X1, X2 + Swap Y1, Y2 + Endif + + If Y1 = Y2 Then + + If X1 > X2 Then + Swap X1, X2 + Endif + + If X2 > X1 And If X1 < LineLength[Y1] Then + + SetLine(Y1, String.Left(Lines[Y1], X1) & String.Mid$(Lines[Y1], X2 + 1)) + + Endif + + Else If Y1 < Y2 Then + + bHighlight = True + + SetLine(Y1, String.Left(Lines[Y1], X1) & String.Mid$(Lines[Y2], X2 + 1), True) + + RemoveLines(Y1 + 1, Y2 - Y1) + + RaiseChange + + Refresh + + Endif + + XAfter = X1 + YAfter = Y1 + + If $iNoUndo = 0 Then + AddUndo(CCommand(Me, CCommand.DELETE, sText, X1, Y1, X2, Y2, EndBefore(), bRight)) + Endif + + For Each hView In GetAllViews() + hView._AfterRemove(Y1, Y2) + If Y2 > Y1 Then hView._ClearCachePos + Next + + If bHighlight Then + HighlightFrom(Y1) + XAfter = X1 + YAfter = Y1 + Endif + +End + + +' void GDocument::remove(int y1, int x1, int y2, int x2) +' { +' GLine *l, *l2; +' GString text, rest; +' int y; +' GCommandDocument info(this); +' +' yAfter = y1; +' xAfter = x1; +' +' if (readOnly) +' return; +' +' FOR_EACH_VIEW(v) +' { +' v->nx = v->x; +' v->ny = v->y; +' } +' +' disableColorize(); +' +' l = lines.at(y1); +' +' if (y1 == y2) +' { +' if (x2 >= x1 && x1 < lineLength(y1)) +' { +' text = l->s.mid(x1, x2 - x1); +' +' l->s.remove(x1, x2 - x1); +' if (text.hasUnicode()) +' l->unicode = l->s.hasUnicode(); +' +' modifyLine(l, y1); +' +' FOR_EACH_VIEW(v) +' { +' v->foldRemove(y1); +' if (v->ny == y1 && v->nx > x1) +' v->nx = GMAX(x1, v->nx - (x2 - x1)); +' } +' +' updateViews(y1); +' } +' } +' else +' { +' l2 = lines.at(y2); +' text = l->s.mid(x1) + _eol; +' rest = l2->s.left(x2); +' +' if (x1 < (int)l->s.length() || x2 < (int)l2->s.length()) +' { +' l->s = l->s.left(x1) + lines.at(y2)->s.mid(x2); +' l->state = 0; // force highlighting of next line. +' modifyLine(l, y1); +' } +' else +' updateLineWidth(y1); +' +' for (y = y1 + 1; y < y2; y++) +' text += lines.at(y)->s + _eol; +' text += rest; +' +' for (y = y1 + 1; y <= y2; y++) +' { +' removeLine(y1 + 1); +' } +' +' FOR_EACH_VIEW(v) +' { +' v->foldRemove(y1 + 1, y2); +' if (v->ny > y1) +' { +' v->ny = GMAX(y1, v->ny - (y2 - y1)); +' if (v->ny == y1) +' v->nx = x1; +' } +' else if (v->ny == y1 && v->nx > x1) +' v->nx = x1; +' } +' +' updateViews(y1, -1); +' } +' +' begin(); +' addUndo(new GDeleteCommand(&info, y1, x1, y2, x2, text)); +' enableColorize(); +' end(); +' +' FOR_EACH_VIEW(v) +' { +' v->cursorGoto(v->ny, v->nx, false); +' } +' +' emitTextChanged(); +' } + +Public Sub Info(Y As Integer) As CLineInfo + + Dim hInfo As CLineInfo + + hInfo = LinesInfo[Y] + If Not hInfo Then + hInfo = $hDefaultInfo + Endif + Return hInfo + +End + +Public Sub SetInfo(Y As Integer) As CLineInfo + + Dim hInfo As CLineInfo + + hInfo = LinesInfo[Y] + If Not hInfo Then + hInfo = CLineInfo() + LinesInfo[Y] = hInfo + Endif + + Return hInfo + +End + +Public Sub GetText(X1 As Integer, Y1 As Integer, X2 As Integer, Y2 As Integer) As String + + Dim sText As String + + If Y1 > Y2 Or If Y1 = Y2 And X1 > X2 Then + Swap X1, X2 + Swap Y1, Y2 + Endif + + If Y1 = Y2 Then Return String.Mid$(Lines[Y1], X1 + 1, X2 - X1) + + sText = String.Mid$(Lines[Y1], X1 + 1) & "\n" + If (Y2 - Y1 - 1) > 0 Then sText &= Lines.Copy(Y1 + 1, Y2 - Y1 - 1).Join("\n") & "\n" + sText &= String.Left(Lines[Y2], X2) + + Return sText + +End + + +Private Sub AddUndo(hCmd As CCommand) + + Dim hLast As CCommand + Dim hPrevious As CCommand + + If $iNoUndo Then Return + + 'hCmd.Print("AddUndo: ") + + If hCmd.Type = CCommand.END And If $aUndo.Count And If $aUndo[$aUndo.Max].Type = CCommand.BEGIN Then + $aUndo.Pop + ' Else If hCmd.Type = CCommand.END And If $aUndo.Count >= 2 And If $aUndo[$aUndo.Max - 1].Type = CCommand.BEGIN Then + ' $aUndo.Remove($aUndo.Max - 1) + Else + $aUndo.Add(hCmd) + Endif + + $aRedo.Clear + + If $aUndo.Count >= 2 Then + + hLast = $aUndo.Last + hPrevious = $aUndo[$aUndo.Max - 1] + + If hLast.Type = hPrevious.Type Then + If hLast.Length = 1 And If hLast.Text <> "\n" And If hPrevious.Text <> "\n" And If hLast.Y = hPrevious.Y Then + If hLast.Type = CCommand.INSERT Then + If hLast.XA = hPrevious.X Then + hPrevious.Text = hLast.Text & hPrevious.Text + hPrevious.X = hLast.X + $aUndo.Pop + Else If hLast.X = hPrevious.XA Then + hPrevious.Text &= hLast.Text + hPrevious.XA = hLast.XA + $aUndo.Pop + Endif + Else If hLast.Type = CCommand.DELETE Then + + If hPrevious.X = hLast.XA Then + hPrevious.Text = hLast.Text & hPrevious.Text + hPrevious.X = hLast.X + $aUndo.Pop + Else If hPrevious.X = hLast.X Then + Inc hPrevious.XA + hPrevious.Text &= hLast.Text + $aUndo.Pop + Endif + + Endif + Endif + Endif + + Endif + +End + +Public Sub Undo() + + Dim hCmd As CCommand + Dim L As Integer + Dim bOverwrite As Boolean + Dim hCommandBefore As CCommandBefore + + If $aUndo.Count = 0 Then Return + + DisableUndo + DisableHighlight + + bOverwrite = Me.Current.Overwrite + Me.Current.Overwrite = False + + Repeat + + hCmd = $aUndo.Pop() + + 'Print "Undo: "; + 'hCmd.Print + + With hCmd + + Select Case .Type + + Case CCommand.BEGIN + .MoveCursor(Me) + Dec L + + Case CCommand.END + Inc L + + Case CCommand.INSERT + Me.Current.Remove(.X, .Y, .XA, .YA) + + Case CCommand.DELETE + Me.Current.Goto(.X, .Y) + Me.Current.Insert(.Text) + If .SX <> .X Or If .SY <> .Y Then + Me.Current.Goto(.SX, .SY) + Me.Current.Goto(.XA, .YA, True) + Else If .Right Then + Me.Current.Goto(.X, .Y) + Endif + + End Select + + hCommandBefore = .State + If hCommandBefore Then + With hCommandBefore + If .BreakpointBefore Then $cBreakpoint = .BreakpointBefore.Copy() + If .BookmarkBefore Then $cBookmark = .BookmarkBefore.Copy() + If .BookmarkBefore Or If .BreakpointBefore Then + Refresh + RaiseChange + Endif + End With + Endif + + End With + + $aRedo.Add(hCmd) + + Until L = 0 + + Me.Current.Overwrite = bOverwrite + + EnableUndo + EnableHighlight + +End + +Public Sub Redo() + + Dim hCmd As CCommand + Dim L As Integer + Dim bOverwrite As Boolean + Dim hCommandBefore As CCommandBefore + + If $aRedo.Count = 0 Then Return + + DisableUndo + DisableHighlight + + bOverwrite = Me.Current.Overwrite + Me.Current.Overwrite = False + + Repeat + + hCmd = $aRedo.Pop() + + 'Print "Redo: "; + 'hCmd.Print + + With hCmd + + Select Case .Type + + Case CCommand.BEGIN + Inc L + + Case CCommand.END + .MoveCursor(Me) + Dec L + + Case CCommand.DELETE + ' If .SX <> .X Or If .SY <> .Y Then + ' Me.Current.Goto(.SX, .SY) + ' Me.Current.Goto(.X, .Y, True) + ' Else + ' Me.Current.Goto(.X, .Y) + ' Endif + Me.Current.Remove(.X, .Y, .XA, .YA) + + Case CCommand.INSERT + .MoveCursor(Me) + Me.Current.Insert(.Text) + + End Select + + hCommandBefore = .State + If hCommandBefore Then + With hCommandBefore + If .BreakpointAfter Then $cBreakpoint = .BreakpointAfter.Copy() + If .BookmarkAfter Then $cBookmark = .BookmarkAfter.Copy() + If .BookmarkAfter Or If .BreakpointAfter Then + Refresh + RaiseChange + Endif + End With + Endif + + End With + + $aUndo.Add(hCmd) + + Until L = 0 + + Me.Current.Overwrite = bOverwrite + + EnableUndo + EnableHighlight + +End + +Private Function Highlight_Read() As String + + If $hHighlight Then Return $hHighlight.Name + +End + +Private Sub Highlight_Write(Value As String) + + Dim Y As Integer + + Value = LCase(Value) + If Value And If Value <> "none" And If Value <> "custom" Then + If Value == "c++" Then Value = "cplusplus" + $hHighlight = TextHighlighter[Value] + Else + $hHighlight = Null + Endif + + For Y = 0 To LinesInfo.Max + If LinesInfo[Y] Then LinesInfo[Y].ClearHighlight() + Next + HighlightFrom(0) + +End + +Public Sub HasHighlight() As Boolean + + If $hHighlight Then Return True + If Object.CanRaise(Me.Current, "Highlight") Then Return True + +End + +Public Sub HighlightFrom(Y As Integer) + + Dim aHighlight As Byte[] + Dim bCustom As Boolean + Dim bRefresh As Boolean + Dim bBegin As Boolean + Dim bEndOfLine As Boolean + Dim PY As Integer + + If $bHighlighting Then Return + + If $iNoHighlight Then + $cHighlightLater[Y] = True + Return + Endif + + If Not $hHighlight Then + If Object.CanRaise(Me.Current, "Highlight") Then + bCustom = True + Else + Return + Endif + Endif + + $bHighlighting = True + + Do + + If Y < 0 Or If Y > Lines.Max Then Break + If Info(Y).Colors Then Break + + bRefresh = True + + If Y = 0 Then + + TextHighlighter.State = Highlight.Normal + TextHighlighter.Tag = 0 + TextHighlighter.Alternate = False + + Else + + PY = Y - 1 + With Info(PY) + TextHighlighter.State = .State + TextHighlighter.Tag = .Tag + End With + + Endif + + TextHighlighter.Limit = False + + With SetInfo(Y) + + aHighlight = New Byte[] + .Colors = aHighlight + TextHighlighter._Highlight = aHighlight + TextHighlighter.TextAfter = "" + TextHighlighter.Line = Y + + 'Debug "Before: State = "; .State;; "Tag = "; .Tag;; "Alternate = "; .Alternate;; "Limit = "; .Limit + + '$hHighlight.Run(Lines[Y]) + + If bCustom Then + + Me.Current._RaiseHighlight(Lines[Y]) + + Else + + $hHighlight.Run(Lines[Y]) + If Y = 0 Then TextHighlighter.Limit = True + + Endif + + If TextHighlighter.TextAfter And If Lines[Y] <> TextHighlighter.TextAfter Then + If Not bBegin Then + bBegin = True + bEndOfLine = Me.Current.Column >= LineLength[Me.Current.Line] + Me.Current.SaveCursor + Begin() + Endif + Me.Current.Goto(0, Y) + Me.Current.Remove(0, Y, LineLength[Y], Y) + Me.Current.Insert(TextHighlighter.TextAfter) + .Colors = aHighlight + Endif + + If .Alternate <> TextHighlighter.Alternate Or If .State <> TextHighlighter.State Or If .Tag <> TextHighlighter.Tag Or If .Limit <> TextHighlighter.Limit Or If .Comment <> TextHighlighter.Comment Then + .Alternate = TextHighlighter.Alternate + .State = TextHighlighter.State + .Tag = TextHighlighter.Tag + .Limit = TextHighlighter.Limit + .Comment = TextHighlighter.Comment + 'Debug "Update: State = "; .State;; "Tag = "; .Tag;; "Alternate = "; .Alternate;; "Limit = "; .Limit + If Y < Lines.Max Then SetInfo(Y + 1).ClearHighlight() + Endif + + Inc Y + + End With + + Loop + + If bBegin Then + Me.Current.RestoreCursor + If bEndOfLine Then Me.Current.Goto(-1, Me.Current.Line) + End() + Endif + + If bRefresh Then Refresh + + $bHighlighting = False + +End + +Private Function Length_Read() As Integer + + Dim Y As Integer + Dim L As Integer + + For Y = 0 To Lines.Max + L += LineLength[Y] + Next + + L += Lines.Max * Len($sEndOfLine) + Return L + +End + +Private Function Keywords_Read() As String[] + + Try Return $hHighlight.GetKeywords() + +End + +Public Sub HasBreakpoint(iLine As Integer) As Boolean + + Return $cBreakpoint.Exist(iLine) + +End + +Public Sub IsBreakpointDisabled(iLine As Integer) As Boolean + + If $cBreakpoint.Exist(iLine) Then Return Not CBool($cBreakpoint[iLine]) + +End + +Public Sub SetBreakpoint(iLine As Integer, bOn As Boolean, Optional bDisable As Boolean) + + If bOn Then + If $cBreakpoint.Exist(iLine) And If $cBreakpoint[iLine] = Not bDisable Then Return + StartBefore + $cBreakpoint[iLine] = Not bDisable + Else + If Not $cBreakpoint.Exist(iLine) Then Return + StartBefore + $cBreakpoint.Remove(iLine) + Endif + + If $iNoUndo = 0 Then + AddUndo(CCommand(Me, CCommand.CHANGE,,,,,, EndBefore())) + Endif + + RaiseChange + +End + +Private Function Breakpoints_Read() As Integer[] + + Dim aRes As New Integer[] + + For Each $cBreakpoint + aRes.Add(CInt($cBreakpoint.Key)) + Next + + Return aRes + +End + +Private Sub Breakpoints_Write(Value As Integer[]) + + Dim Y As Integer + + If $iBegin Then StartBefore + + $cBreakpoint.Clear + + If Value Then + For Each Y In Value + $cBreakpoint[Y] = True + Next + Endif + + If $iBegin And If $iNoUndo = 0 Then + AddUndo(CCommand(Me, CCommand.CHANGE,,,,,, EndBefore())) + Endif + + Refresh + +End + +Public Sub HasBookmark(iLine As Integer) As Boolean + + Return $cBookmark.Exist(iLine) + +End + +Public Sub SetBookmark(iLine As Integer, bOn As Boolean) + + If bOn Then + If $cBookmark.Exist(iLine) Then Return + StartBefore + $cBookmark[iLine] = True + Else + If Not $cBookmark.Exist(iLine) Then Return + StartBefore + $cBookmark.Remove(iLine) + Endif + + If $iNoUndo = 0 Then + AddUndo(CCommand(Me, CCommand.CHANGE,,,,,, EndBefore())) + Endif + + RaiseChange + +End + +Private Function Bookmarks_Read() As Integer[] + + Dim aRes As New Integer[] + + For Each $cBookmark + aRes.Add(CInt($cBookmark.Key)) + Next + aRes.Sort + Return aRes + +End + +Private Sub Bookmarks_Write(Value As Integer[]) + + Dim Y As Integer + + If $iBegin Then StartBefore + + $cBookmark.Clear + + If Value Then + For Each Y In Value + $cBookmark[Y] = True + Next + Endif + + If $iBegin And If $iNoUndo = 0 Then + AddUndo(CCommand(Me, CCommand.CHANGE,,,,,, EndBefore())) + Endif + + Refresh + +End + +Private Function EndOfLine_Read() As Integer + + Return $iEndOfLine + +End + +Private Sub EndOfLine_Write(Value As Integer) + + Select Case Value + Case gb.Unix + $sEndOfLine = "\n" + Case gb.Windows + $sEndOfLine = "\r" + Case gb.Mac + $sEndOfLine = "\r\n" + Case Else + Return + End Select + + $iEndOfLine = Value + +End + +Private Sub IsWordChar(sCar As String) As Boolean + + If IsSpace(sCar) Then Return + If IsPunct(sCar) And If InStr("_$", sCar) = 0 Then Return + If String.Code(sCar) = 160 Then Return + Return True + +End + + +Public Sub WordLeft(X As Integer, Y As Integer, Optional bWord As Boolean) As Integer + + Dim sLine As String = Lines[Y] + Dim X2 As Integer + Dim sCar As String + + X2 = X + + If Not bWord Then + While X2 > 0 + If Not IsSpace(String.Mid$(sLine, X2, 1)) Then Break + Dec X2 + Wend + Endif + + If X2 > 0 Then + If IsWordChar(String.Mid$(sLine, X2, 1)) Then + Do + Dec X2 + If X2 <= 0 Or If Not IsWordChar(String.Mid$(sLine, X2, 1)) Then Break + Loop + Else If Not bWord Then + Do + Dec X2 + If X2 <= 0 Then Break + sCar = String.Mid$(sLine, X2, 1) + If IsWordChar(sCar) Or If IsSpace(sCar) Then Break + Loop + Endif + Endif + + Return X2 + +End + +' int GDocument::wordLeft(int y, int x, bool word) +' { +' int xw = x; +' GString s = lines.at(y)->s; +' +' if (!word) +' { +' while (xw > 0 && s.isSpace(xw - 1)) +' xw--; +' } +' +' if (xw > 0) +' { +' if (s.isWordChar(xw - 1)) +' { +' for(;;) +' { +' xw--; +' if (xw <= 0 || !s.isWordChar(xw - 1)) +' break; +' } +' } +' else if (!word) +' { +' for(;;) +' { +' xw--; +' if (xw <= 0 || s.isWordChar(xw - 1) || s.isSpace(xw - 1)) +' break; +' } +' } +' } +' +' return xw; +' } +' + +Public Sub WordRight(X As Integer, Y As Integer, Optional bWord As Boolean) As Integer + + Dim sLine As String = Lines[Y] + Dim iLen As Integer = LineLength[Y] + Dim X2 As Integer + Dim sCar As String + + X2 = X + + If X2 < iLen Then + + If IsWordChar(String.Mid$(sLine, X2 + 1, 1)) Then + Do + Inc X2 + If X2 >= iLen Or If Not IsWordChar(String.Mid$(sLine, X2 + 1, 1)) Then Break + Loop + Else If Not bWord Then + Do + Inc X2 + If X2 >= iLen Then Break + sCar = String.Mid$(sLine, X2 + 1, 1) + If IsWordChar(sCar) Or If IsSpace(sCar) Then Break + Loop + Endif + + If Not bWord Then + While X2 < iLen + If Not IsSpace(String.Mid$(sLine, X2 + 1, 1)) Then Break + Inc X2 + Wend + Endif + + Endif + + Return X2 + +End + + +' int GDocument::wordRight(int y, int x, bool word) +' { +' int xw = x; +' GString s = lines.at(y)->s; +' int len = s.length(); +' +' if (xw < len) +' { +' if (s.isWordChar(xw)) +' { +' for(;;) +' { +' xw++; +' if (xw >= len || !s.isWordChar(xw)) +' break; +' } +' } +' else if (!word) +' { +' for(;;) +' { +' xw++; +' if (xw >= len || s.isWordChar(xw) || s.isSpace(xw)) +' break; +' } +' } +' } +' +' if (!word) +' { +' while (xw < len && s.isSpace(xw)) +' xw++; +' } +' +' return xw; +' } +' + +Public Sub Reset(Optional bSave As Boolean) + + Dim I As Integer + + For I = 0 To Lines.Max + If Info(I).Modified Then + With SetInfo(I) + .Modified = False + .Saved = bSave + End With + Endif + Next + + Refresh + +End + +Public Sub DisableHighlight() + + Inc $iNoHighlight + If $iNoHighlight = 1 Then $cHighlightLater = New Collection + +End + +Public Sub EnableHighlight() + + Dim cHighlightLater As Collection + + Dec $iNoHighlight + If $iNoHighlight = 0 Then + cHighlightLater = $cHighlightLater + For Each cHighlightLater + HighlightFrom(cHighlightLater.Key) + Next + $cHighlightLater = Null + Endif + +End + +Public Sub DisableUndo() + + Inc $iNoUndo + +End + +Public Sub EnableUndo() + + Dec $iNoUndo + CheckUnlock + +End + +Public Sub IsLocked() As Boolean + + Return $iBegin + $iNoUndo + +End + +Private Sub CheckUnlock() + + Dim hView As TextEditor + + If IsLocked() Then Return + For Each hView In GetAllViews() + hView._RaiseCursor + Next + + +End + +Public Sub HasLimit(Y As Integer) As Boolean + + Dim hInfo As CLineInfo + Dim YS As Integer + + If Y = 0 Then Return True + If Not Trim(Lines[Y]) Then Return False + + hInfo = Info(Y) + If hInfo.Comment Then + + YS = Y + Do + Dec Y + If Y < 0 Then Break + hInfo = Info(Y) + If hInfo.Comment Or If hInfo.Limit Then Return False + If Trim(Lines[Y]) Then Break + Loop + + Y = YS + Do + Inc Y + If Y >= Lines.Count Then Return False + If Trim(Lines[Y]) Then + hInfo = Info(Y) + If Not hInfo.Comment Then Return hInfo.Limit + Endif + Loop + + Else + + If Not hInfo.Limit Then Return + + Do + Dec Y + If Y <= 0 Then Return True + hInfo = Info(Y) + If hInfo.Comment Then Return False + If hInfo.Limit Then Return True + If Trim(Lines[Y]) Then Return True + Loop + + Endif + +End + + +Private Function Mode_Read() As String + + Return $sMode + +End + +Private Sub Mode_Write(Value As String) + + Value = LCase(Value) + If Value And If Value <> "none" Then + If Value == "c++" Then Value = "cplusplus" + _Mode = TextEditorMode[Value] + Else + _Mode = New TextEditorMode + Endif + + Highlight_Write(Value) + + _Mode.CloseBraces = $bCloseBraces + _Mode.CloseStrings = $bCloseStrings + $sMode = Value + +End + +Private Function CloseBraces_Read() As Boolean + + Return $bCloseBraces + +End + +Private Sub CloseBraces_Write(Value As Boolean) + + $bCloseBraces = Value + _Mode.CloseBraces = Value + +End + +Public Sub GetIndentText(iStart As Integer, iEnd As Integer) As String + + Dim iLine As Integer + Dim sLine As String + Dim sIndent As String + Dim sResult As String + + For iLine = iStart To iEnd - 1 + sLine = Lines[iLine] + If LTrim(sLine) Then + sIndent = Left(sLine, Len(sLine) - Len(LTrim(sLine))) + If Not sResult Then + sResult = sIndent + Else If sIndent Begins sResult Then + Else + Return + Endif + Endif + Next + + Return sResult + +End + +Private Function DisabledBreakpoints_Read() As Integer[] + + Dim aRes As New Integer[] + Dim bOn As Boolean + + For Each bOn In $cBreakpoint + If Not bOn Then aRes.Add(CInt($cBreakpoint.Key)) + Next + + Return aRes + +End + +Private Sub DisabledBreakpoints_Write(Value As Integer[]) + + Dim Y As Integer + + If $iBegin Then StartBefore + + If Value Then + For Each Y In Value + If $cBreakpoint.Exist(Y) Then $cBreakpoint[Y] = False + Next + Endif + + If $iBegin And If $iNoUndo = 0 Then + AddUndo(CCommand(Me, CCommand.CHANGE,,,,,, EndBefore())) + Endif + + Refresh + +End + +Private Sub RaiseChange() + + Dim hView As TextEditor + + For Each hView In GetAllViews() + hView._RaiseChange + Next + +End + +Private Function CloseStrings_Read() As Boolean + + Return $bCloseStrings + +End + +Private Sub CloseStrings_Write(Value As Boolean) + + $bCloseStrings = Value + _Mode.CloseStrings = Value + +End + +Public Sub IsDiffAdded(iRow As Integer) As Boolean + + Dim iMin As Integer + Dim iMax As Integer + Dim I As Integer + Dim R As Integer + Dim L As Integer + + If Not DiffAdded Then Return + + iMin = 0 + iMax = DiffAdded.Count \ 2 + + While iMax > iMin + + I = (iMin + iMax) \ 2 + + R = DiffAdded[I * 2] + L = DiffAdded[I * 2 + 1] + + If iRow < R Then + iMax = I + Else If iRow >= (R + L) Then + iMin = I + 1 + Else + Return True + Endif + + Wend + +End + +Public Sub IsDiffRemoved(iRow As Integer) As Boolean + + If Not DiffRemoved Then Return + Return DiffRemoved.Exist(iRow) + +End + +Public Sub EnterDiffMode(Added As Integer[], Removed As Collection) + + Dim aText As String[] + Dim hView As TextEditor + + If DiffRemoved Then LeaveDiffMode + + If Added Then DiffAdded = Added.Copy() + DiffRemoved = New Collection + If Removed Then + For Each aText In Removed + DiffRemoved[CInt(Removed.Key) - 1] = aText + Next + Endif + + For Each hView In GetAllViews() + hView._EnterDiffMode() + Next + +End + +Public Sub LeaveDiffMode() + + Dim hView As TextEditor + + DiffAdded = Null + DiffRemoved = Null + + For Each hView In GetAllViews() + hView._LeaveDiffMode() + Next + +End + +Public Sub FindPreviousDiff(Y As Integer) As Integer + + If Me.DiffMode Then + + If IsDiffAdded(Y) Then + While Y > 0 + Dec Y + If DiffRemoved[Y] Then Return Y + If Not IsDiffAdded(Y) Then Break + Wend + Endif + + While Y > 0 + Dec Y + If DiffRemoved[Y] Then Return Y + If IsDiffAdded(Y) Then + While Y > 0 + Dec Y + If Not IsDiffAdded(Y) Then Return Y + 1 + Wend + Return Y + Endif + + Wend + + If DiffRemoved[-1] Then Return 0 + + Endif + + Return -1 + +End + +Public Sub FindNextDiff(Y As Integer) As Integer + + If Me.DiffMode Then + + If IsDiffAdded(Y) Then + While Y < Lines.Max + Inc Y + If DiffRemoved[Y] Then Return Y + If Not IsDiffAdded(Y) Then Break + Wend + Endif + + While Y < Lines.Max + Inc Y + If DiffRemoved[Y] Then Return Y + If IsDiffAdded(Y) Then + While Y < Lines.Max + Inc Y + If Not IsDiffAdded(Y) Then Return Y - 1 + Wend + Return Y + Endif + Wend + + Endif + + Return -1 + +End + +Private Function DiffMode_Read() As Boolean + + Return DiffRemoved + +End diff --git a/comp/src/gb.form.editor/.src/CLineInfo.class b/comp/src/gb.form.editor/.src/CLineInfo.class new file mode 100644 index 00000000..6fdca9e9 --- /dev/null +++ b/comp/src/gb.form.editor/.src/CLineInfo.class @@ -0,0 +1,105 @@ +' Gambas class file + +Property Modified As Boolean +Property Saved As Boolean +Property Alternate As Boolean +Property Limit As Boolean +Property Comment As Boolean + +Private Enum FLAG_MODIFIED, FLAG_SAVED, FLAG_ALTERNATE, FLAG_LIMIT, FLAG_COMMENT + +Public Colors As Byte[] +Public Tag As Short +Public State As Byte '= Highlight.Normal + +Private $iFlag As Byte + + +Static Public Sub _call() As CLineInfo + + Dim hInfo As CLineInfo + + hInfo = New CLineInfo + Return hInfo + +End + +Private Sub SetFlag(iFlag As Integer, Value As Boolean) + + If Value Then + $iFlag = BSet($iFlag, iFlag) + Else + $iFlag = BClr($iFlag, iFlag) + Endif + +End + +Private Function Modified_Read() As Boolean + + Return BTst($iFlag, FLAG_MODIFIED) + +End + +Private Sub Modified_Write(Value As Boolean) + + SetFlag(FLAG_MODIFIED, Value) + +End + +Private Function Saved_Read() As Boolean + + Return BTst($iFlag, FLAG_SAVED) + +End + +Private Sub Saved_Write(Value As Boolean) + + SetFlag(FLAG_SAVED, Value) + +End + +Private Function Alternate_Read() As Boolean + + Return BTst($iFlag, FLAG_ALTERNATE) + +End + +Private Sub Alternate_Write(Value As Boolean) + + SetFlag(FLAG_ALTERNATE, Value) + +End + +Public Sub ClearHighlight() + + Colors = Null + 'Tag = 0 + 'State = Highlight.Normal + 'SetFlag(FLAG_ALTERNATE, False) + 'SetFlag(FLAG_LIMIT, False) + +End + +Private Function Limit_Read() As Boolean + + Return BTst($iFlag, FLAG_LIMIT) + +End + +Private Sub Limit_Write(Value As Boolean) + + SetFlag(FLAG_LIMIT, Value) + +End + +Private Function Comment_Read() As Boolean + + Return BTst($iFlag, FLAG_COMMENT) + +End + +Private Sub Comment_Write(Value As Boolean) + + SetFlag(FLAG_COMMENT, Value) + +End diff --git a/comp/src/gb.form.editor/.src/FFind.class b/comp/src/gb.form.editor/.src/FFind.class new file mode 100644 index 00000000..5bf3b1f7 --- /dev/null +++ b/comp/src/gb.form.editor/.src/FFind.class @@ -0,0 +1,108 @@ +' Gambas class file + +Private $hTimer As Timer + +Private Sub GetEditor() As TextEditor + + Return Me.Parent.Parent + +End + +Public Sub Form_KeyPress() + + Select Case Key.Code + + Case Key.Escape + + btnClose_Click + Stop Event + ' Case Key.PageDown, Key.PageUp + ' If Key.Normal Then GetEditor().View_KeyPress + + Case Key.Home, Key.End + + If Key.Control And If Not Key.Shift Then GetEditor().View_KeyPress + + Case Key.Enter, Key.Return + + If Key.Shift Then + btnPrevious_Click + Else + btnNext_Click + Endif + Stop Event + + Case Key.F3 + + If Key.Shift Then + btnPrevious_Click + Else + btnNext_Click + Endif + Stop Event + + End Select + +End + +Public Sub Form_GotFocus() + + txtFind.SetFocus + txtFind_Change + +End + +Public Sub btnClose_Click() + + Dim hEditor As TextEditor = GetEditor() + Me.Hide + hEditor.HighlightString("") + hEditor.SetFocus + +End + +Public Sub txtFind_Change() + + GetEditor()._Search(txtFind.Text) + +End + + +Public Sub btnNext_Click() + + If GetEditor()._Search(txtFind.Text, True) Then Blink + +End + +Public Sub btnPrevious_Click() + + If GetEditor()._Search(txtFind.Text, False) Then Blink + +End + +Private Sub Blink() + + panFind.Background = Color.LightBackground + txtFind.Background = Color.LightBackground + + If $hTimer Then + $hTimer.Restart() + Else + $hTimer = New Timer(100) As "Blink" + Endif + +End + +Public Sub Blink_Timer() + + panFind.Background = Color.TextBackground + txtFind.Background = Color.Default + $hTimer = Null + +End + +Public Sub btnClear_Click() + + txtFind.Clear + +End diff --git a/comp/src/gb.form.editor/.src/FFind.form b/comp/src/gb.form.editor/.src/FFind.form new file mode 100644 index 00000000..3a738c7f --- /dev/null +++ b/comp/src/gb.form.editor/.src/FFind.form @@ -0,0 +1,41 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,62,9) + Arrangement = Arrange.Vertical + { Separator1 Separator + MoveScaled(8,1,16,0) + } + { panFind HBox + MoveScaled(1,2,57,5) + Background = Color.TextBackground + Expand = True + { PictureBox1 PictureBox + MoveScaled(1,1,3,3) + Picture = Picture["icon:/small/find"] + Alignment = Align.Center + } + { txtFind TextBox + MoveScaled(6,0,25,4) + Expand = True + Border = False + } + { btnClear ToolButton + MoveScaled(33,1,3,3) + Picture = Picture["icon:/small/clear"] + } + { btnNext ToolButton + MoveScaled(38,1,3,3) + Picture = Picture["icon:/small/down"] + } + { btnPrevious ToolButton + MoveScaled(43,1,3,3) + Picture = Picture["icon:/small/up"] + } + { btnClose ToolButton + MoveScaled(52,0,4,4) + Visible = False + Picture = Picture["icon:/small/close"] + } + } +} diff --git a/comp/src/gb.form.editor/.src/Helper.module b/comp/src/gb.form.editor/.src/Helper.module new file mode 100644 index 00000000..47607567 --- /dev/null +++ b/comp/src/gb.form.editor/.src/Helper.module @@ -0,0 +1,71 @@ +' Gambas module file + +Public Sub ReadNumber(sText As String, iPos As Integer) As Integer + + sText = String.Mid$(sText, iPos) + iPos = 1 + + If IsDigit(Left(sText)) Then + Inc iPos + Else If InStr("+-", Left(sText)) And If IsDigit(Mid$(sText, 2, 1)) Then + iPos += 2 + Else + Return 0 + Endif + + While IsDigit(Mid$(sText, iPos, 1)) + Inc iPos + Wend + + If Mid$(sText, iPos, 1) = "." Then + Inc iPos + Else + Return iPos - 1 + Endif + + While IsDigit(Mid$(sText, iPos, 1)) + Inc iPos + Wend + + If InStr("eE", Mid$(sText, iPos, 1)) Then + Inc iPos + Else + Return iPos - 1 + Endif + + If InStr("+-", Mid$(sText, iPos, 1)) And If IsDigit(Mid$(sText, iPos + 1, 1)) Then + iPos += 2 + Else If IsDigit(Mid$(sText, iPos, 1)) Then + Inc iPos + Else + Return iPos - 1 + Endif + + While IsDigit(Mid$(sText, iPos, 1)) + Inc iPos + Wend + + Return iPos - 1 + +End + +Public Sub ReadIdentifier(sText As String, iPos As Integer, sIdentCar As String) As Integer + + sText = String.Mid$(sText, iPos) + iPos = 1 + + If InStr(sIdentCar, Left(sText)) Then + While InStr(sIdentCar, Mid$(sText, iPos, 1)) > 0 And Asc(Mid$(sText, iPos, 1)) > 32 + Inc iPos + Wend + Else + While InStr(sIdentCar, Mid$(sText, iPos, 1)) = 0 And Asc(Mid$(sText, iPos, 1)) > 32 + Inc iPos + Wend + Endif + + Return iPos - 1 + +End + + diff --git a/comp/src/gb.form.editor/.src/Main.module b/comp/src/gb.form.editor/.src/Main.module new file mode 100644 index 00000000..e224026c --- /dev/null +++ b/comp/src/gb.form.editor/.src/Main.module @@ -0,0 +1,16 @@ +' Gambas module file + +Public Sub Main() + + Dim hFile As File + Dim I As Integer + + hFile = Open "~/test.txt" For Create + + For I = 1 To 40000 + Print #hFile, String$(80, CStr(I) & " ") + Next + + hFile.Close + +End diff --git a/comp/src/gb.form.editor/.src/TextEditor.class b/comp/src/gb.form.editor/.src/TextEditor.class new file mode 100644 index 00000000..ea2ffba2 --- /dev/null +++ b/comp/src/gb.form.editor/.src/TextEditor.class @@ -0,0 +1,6219 @@ +' Gambas class file + +Export + +Inherits UserControl + +Public Const _Properties As String = "*,Border=True,ShowPreview,ScrollBar{Scroll.*}=Both,Highlight{None;Custom;C;CPlusPlus;CSS;Diff;Gambas;HTML;JavaScript;SQL;WebPage}=None,Mode{None;Custom;C;CPlusPlus;CSS;Diff;Gambas;HTML;JavaScript;SQL;WebPage}=None,ReadOnly,TabSize{Range:2;64}=2,TabIndent,Wrap,ShowPosition,ShowLimit,ShowCurrent,ShowLineNumber,ShowModified,ShowBraces,ShowIcon,ShowExpand,ShowCursor=True,ShowSpaces,ShowIndent,CloseBraces,CloseStrings" +Public Const _DrawWith As String = "-" +Public Const _DefaultEvent As String = "Change" +Public Const _Similar As String = "TextArea" + +Public Enum Normal, Added, Removed + +Event Cursor +Event Scroll +Event Change +Event Margin +Event KeyPress +Event Highlight(Text As String) + +Property Text As String +Property Read Count As Integer +Property Read Max As Integer +Property Read Line As Integer +Property Read Column As Integer +Property Read SelectionLine As Integer +Property Read SelectionColumn As Integer +Property Read LastLine As Integer +Property Read LastColumn As Integer +Property Read Selected As Boolean +Property Read SelectedText As String +Property ReadOnly As Boolean +Property ShowPreview As Boolean +Property Mode As String +Property Highlight As String +Property LineNumberOffset As Integer +Property TabSize As Integer +Property TabIndent As Boolean +Property Read Length As Integer +Property Border As Boolean +Property ScrollBar As Integer +Property Overwrite As Boolean +Property Read LineHeight As Integer +Property Read Current As _TextEditor_Line +Property Font As Font +Property StopLine As Integer +Property EndOfLine As Integer +Property Breakpoints As Integer[] +Property DisabledBreakpoints As Integer[] +Property Bookmarks As Integer[] +Property Read Styles As _TextEditor_Styles +Property View As TextEditor +Property Read Keywords As String[] +Property Wrap As Boolean +Property Read DiffMode As Boolean + +Property ScrollX As Integer +Property ScrollY As Integer +Property Read ScrollWidth, ScrollW As Integer +Property Read ScrollHeight, ScrollH As Integer + +Property ShowLimit As Boolean +Property ShowCurrent As Boolean +Property ShowLineNumber As Boolean +Property ShowModified As Boolean +Property ShowPosition As Boolean +Property ShowIcon As Boolean +Property ShowBraces As Boolean +Property ShowCursor As Boolean +Property ShowExpand As Boolean +Property ShowSpaces As Boolean +Property ShowIndent As Boolean +Property CloseBraces As Boolean +Property CloseStrings As Boolean + +Private Const MATCH_STRING As String = "()[]{}" + +Static Private $cShortcut As Collection +Static Private $bRemoteDisplayChecked As Boolean +Static Private $bRemoteDisplay As Boolean + +Public _Views As TextEditor[] + +Private $hVPanel As Panel +Private $hPanel As Panel +Private $hView As ScrollArea +Private $hSideBar As DrawingArea +Private $hImageSideBar As Image +Private $hLabelFrame As Panel +Private $hLabel As Label +Private $hFind As FFind + +Private $hDoc As CDocument +Private $hRows As _TextEditor_Rows + +Private $hStyles As _TextEditor_Styles +Private $bStyleChanged As Boolean + +Private $iLargestLine As Integer +Private $iWidth As Integer +Private $LH As Integer +Private $BW As Integer ' bold width +Private $MW As Integer +Private $iWidthLineNumber As Integer +Private $iWidthModified As Integer +Private $iPosIcon As Integer + +Private $iTabSize As Integer = 2 +Private $iTabWidth As Integer +Private $fTabSymbolSize As Float +Private $iSpaceWidth As Integer +Private $bTabIndent As Boolean + +Private $X As Integer +Private $X0 As Integer +Private $Y As Integer +Private $XY As Point +Private $bShowCursor As Boolean +Private $bHideCursor As Boolean +Private $LX As Integer +Private $LY As Integer + +Private $hTimerCursor As Timer +Private $hTimerChange As Timer +Private $hTimerEnsureVisible As Timer + +Private $SX As Integer +Private $SY As Integer +Private $SXY As Point +Private $bMouseDown As Boolean + +Private $hTimerScroll As Timer + +Private $XM As Integer +Private $YM As Integer = -1 +Private $XMO As Integer +Private $YMO As Integer + +Private $IY1 As Integer +Private $IY2 As Integer +Private $IP As Integer + +Private $bReadOnly As Boolean +Private $bOverwrite As Boolean +'Private $bTerminal As Boolean + +Private $iBackground As Integer +Private $iForeground As Integer +Private $iSelectedBackground As Integer +Private $iLimitColor As Integer +Private $iIndentColor As Integer +Private $iMatchColor As Integer + +Private $iLineNumberOffset As Integer +Private $hTabImage As Image +Private $hFont As Font +'Private $hFontBold As Font +Private $iAscent As Integer + +Private $fCharWidth As Float +Private $cCachePos As New Collection +Private $cCacheView As New Collection + +Private $iStopLine As Integer = -1 + +Private $bShowLimit As Boolean +Private $bShowCurrent As Boolean +Private $bShowLineNumber As Boolean +Private $bShowModified As Boolean +Private $bShowPosition As Boolean +Private $bShowIcon As Boolean +Private $bShowBraces As Boolean +Private $bShowExpand As Boolean +Private $bShowSpaces As Boolean +Private $bShowIndent As Boolean + +Private $bFirstFocus As Boolean + +Private $aFold As Integer[] + +Private $iSaveCursor As Integer +Private $aSaveCursor As Integer[] +Private $hFontNumber As Font + +Private $cLineLayout As Collection +Private $hTimerHeight As Timer +Private $bNoResizeContents As Boolean + +Static Private $cGlobalCacheText As New Collection +Private $cCacheText As Collection +Private $sCacheTextKey As String + +Private $cCacheLine As New Collection +Private $iLastScrollX As Integer +Private $hTimerCacheLine As Timer +Private $iCacheLineH As Integer + +Private $bUpdateHeightAllowed As Boolean + +Private $bPrint As Boolean +Private $sPrintBuffer As String +Private $iMarginColor As Integer + +Private $hTimerSideBarMouse As Timer +Private $hTimerSideBarRefresh As Timer +Private $hRectSideBar As Rect +Private $fBarLineHeight As Float +Private $bShowPreview As Float +Private $hSideBarViewer As TextEditor + +'Private $hTimerSideBarViewer As Timer +Private $iScrollBar As Integer +Private $iMD As Integer +Private $iMY As Integer = -1 +Private $bSideBarLockViewer As Boolean +Private $iSideBarWhere As Integer +Private $iSideBarClick As Integer +Private Enum SIDEBAR_NONE, SIDEBAR_VIEW, SIDEBAR_UP, SIDEBAR_DOWN + +Private $sHighlightString As String +Private $iHighlightStringMode As Integer +Private $iHighlightStringLen As Integer +Private $bHighlightWordOnly As Boolean + +Private $bDiffReadOnly As Boolean +Private $cDiffLayout As Collection + +Public _TopHeight As Integer + +Public Sub _new() + + Dim sDisplay As String + + If Not $cShortcut Then + $cShortcut = [ + "CTRL+A": "SelectAll", + "CTRL+C": "Copy", + "CTRL+INS": "Copy", + "CTRL+V": "Paste", + "SHIFT+INS": "Paste", + "CTRL+X": "Cut", + "SHIFT+DEL": "Cut", + "CTRL+Y": "Redo", + "CTRL+Z": "Undo", + "CTRL+F": "Find"] + Endif + + If Not $bRemoteDisplayChecked Then + If Env["XDG_SESSION_TYPE"] <> "wayland" Then + sDisplay = Env["DISPLAY"] + If sDisplay And If Left(sDisplay) <> ":" Then $bRemoteDisplay = True + Endif + $bRemoteDisplayChecked = True + Endif + + $hVPanel = New Panel(Me) + $hVPanel.Arrangement = Arrange.Vertical + $hVPanel.Border = Border.Plain + + $hPanel = New Panel($hVPanel) As "ViewPanel" + $hPanel.Arrangement = Arrange.Horizontal + $hPanel.Expand = True + + $hView = New ScrollArea($hPanel) As "View" + $hView.Border = False + $hView.Focus = True + $hView.Tracking = True + $hView.Mouse = Mouse.Text + $hView.Expand = True + + Me.Proxy = $hView + $iScrollBar = $hView.ScrollBar + $hTimerCursor = New Timer As "TimerCursor" + $hTimerCursor.Delay = 500 + + $hTimerCacheLine = New Timer As "TimerCacheLine" + $hTimerCacheLine.Delay = 5000 + + $hRows = New _TextEditor_Rows As "Rows" + $hStyles = New _TextEditor_Styles As "Styles" + + '$hPanel.Background = $hStyles[Highlight.Background].Color + + _SetDocument(Null) + +End + +Private Function Text_Read() As String + + Return $hDoc.Text + +End + +Private Sub CalcBoldWidth() + + If Color[$hStyles[Highlight.Background].Color].Luminance < Color[$hStyles[Highlight.Normal].Color].Luminance Then + $BW = 1 + $LH \ 4 + Else + $BW = 1 + $LH \ 6 + Endif + +End + + +Private Sub CalcSizes() + + Dim hParent As Control + + $hFont = $hView.Font + + '$hFontBold = $hView.Font.Copy() + '$hFontBold.Bold = True + + $LH = $hFont.Height + 2 + CalcBoldWidth + $hRows.Height = $LH + + hParent = Me + Do + hParent = hParent.Parent + If Not hParent Is TextEditor Then + $hFontNumber = hParent.Font.Copy() + Break + Endif + Loop + + $hFontNumber.Size *= $LH / $hFontNumber.Height + + $iAscent = $hFont.Ascent + 1 + $iLargestLine = -1 + $iSpaceWidth = $hFont.TextWidth(" ") + $iTabWidth = $hFont.TextWidth("m") * $iTabSize + $fTabSymbolSize = Max(1, $hRows.H / 5) + $hTabImage = Null + + $fCharWidth = Paint._EstimateFixedFontCharWidth($hFont) + ' $fCharWidth = $iSpaceWidth + ' For I = 33 To 255 + ' If I > 126 And If I < 160 Then Continue + ' If I = 173 Then Continue + ' If $hFont.TextWidth(String.Chr$(I)) <> $iSpaceWidth Then + ' $fCharWidth = 0 + ' Break + ' Endif + ' Next + ' + ' If $fCharWidth Then + ' sText = String$(4, "AbCdEfGh01#@WwmM") + ' $fCharWidth = $hFont.TextWidth(sText) / Len(sText) + ' Endif + + If Not $bRemoteDisplay Then + $sCacheTextKey = $hFont.ToString() + $cCacheText = $cGlobalCacheText[$sCacheTextKey] + If Not $cCacheText Then + $cCacheText = New Collection + $cGlobalCacheText[$sCacheTextKey] = $cCacheText + Endif + Endif + + _ClearCachePos + UpdateMargin + UpdateWidth + Refresh + +End + +Private Sub Init() + + $bStyleChanged = True + $X = 0 + $Y = 0 + $XY = New Point + $X0 = 0 + $SX = 0 + $SY = 0 + $SXY = New Point + $YM = -1 + + $hRows.Clear + $hRows.Count = $hDoc.Count + + CalcSizes + + $cCachePos.Clear + $cCacheView.Clear + + If Not $bRemoteDisplay Then + ClearCacheText + ClearCacheLine + Endif + + $bShowCursor = True + GotoCenter(0, 0) + + Refresh + +End + +Private Sub Text_Write(Value As String) + + $hDoc.Text = Value + Init + If $bShowPreview Then $hTimerSideBarRefresh.Trigger + +End + +Public Sub Load(Path As String, Optional AddNewLine As Boolean) + + 'Inc Application.Busy + Goto(0, 0) + $hDoc.Load(Path, AddNewLine) + Init + If $bShowPreview Then $hTimerSideBarRefresh.Trigger + 'Dec Application.Busy + +' Catch +' +' Dec Application.Busy +' Error.Propagate + +End + +Public Sub Save(Path As String) + + 'Inc Application.Busy + $hDoc.HighlightFrom($Y) + $hDoc.Save(Path) + $hTimerChange = Null + 'Dec Application.Busy + +' Catch +' +' 'Dec Application.Busy +' Error.Propagate + +End + +Public Sub Clear() + + Me.Text = "" + +End + +Private Sub HasWidthLayout() As Boolean + + If Not $cLineLayout Then Return + If $cLineLayout.Count Then Return True + If $cDiffLayout And If $cDiffLayout.Count Then Return True + +End + +Private Sub UpdateMargin() + + Dim MW As Integer + + MW = 0 + $iWidthLineNumber = 0 + $iPosIcon = 0 + + If $bShowLineNumber Then + $iWidthLineNumber = (CInt(Log10($hDoc.Count + $iLineNumberOffset)) + 1) * Me.Parent.Font.TextWidth("9") * $LH / Me.Parent.Font.Height + 8 + MW += $iWidthLineNumber + Endif + If $bShowIcon Or If $bShowExpand And $hDoc.HasHighlight() Then + $iPosIcon = MW + MW += $LH + Endif + If $bShowModified Then + $iWidthModified = $hFont.H \ 2 + Else + $iWidthModified = 2 + Endif + MW += $iWidthModified + + If MW <> $MW Then + $MW = MW + '$hView._SetShadowOffset(0, 0, $MW - $iWidthModified, 0) + If $cLineLayout Then + _UpdateAllHeight + UpdateWidth + Endif + Endif + +End + +Public Sub View_Font() + + CalcSizes + UpdateSideBarFont + +End + +Private Sub HasSelection() As Boolean + + If $X <> $SX Or If $Y <> $SY Then Return True + +End + +Private Sub DrawText(sText As String, SX As Integer, X As Integer, Y As Integer) + + Dim iTab, iTab2, iLen As Integer + Dim YT As Integer + Dim XX, YY As Float + + YT = Y + $iAscent + + Do + + iTab2 = InStr(sText, "\t", iTab + 1) + If iTab2 = 0 Then + Paint.DrawText(Mid$(sText, iTab + 1), X, YT) + Return + Endif + + iLen = iTab2 - iTab - 1 + If iLen > 0 Then + Paint.DrawText(Mid$(sText, iTab + 1, iLen), X, YT) + X += $hFont.TextWidth(Mid$(sText, iTab + 1, iTab2 - iTab - 1)) + Endif + + If Not $hTabImage Then + + $hTabImage = New Image($fTabSymbolSize * 2.5, $hFont.Height, Color.Transparent) + Paint.Begin($hTabImage) + + XX = $hTabImage.W / 2 + YY = $hTabImage.H / 2 + + Paint.LineWidth = $fTabSymbolSize / 4 + Paint.Background = $iMarginColor + Paint.MoveTo(XX - $fTabSymbolSize, YY - $fTabSymbolSize) + Paint.LineTo(XX, YY) + Paint.LineTo(XX - $fTabSymbolSize, YY + $fTabSymbolSize) + Paint.MoveTo(XX, YY - $fTabSymbolSize) + Paint.LineTo(XX + $fTabSymbolSize, YY) + Paint.LineTo(XX, YY + $fTabSymbolSize) + Paint.Stroke + + Paint.End + + Endif + + Paint.DrawImage($hTabImage, X, Y) + + X = SX + (((X - SX) + $iTabWidth) \ $iTabWidth) * $iTabWidth + iTab = iTab2 + + Loop + +End + +Private Sub DrawMatch(X As Integer, Y As Integer, H As Integer, XM As Integer, YM As Integer) + + 'Dim sCar As String + Dim XY As Point + Dim WW As Integer + + If Not $bShowCursor Then Return + XY = LinePos(YM, XM) + WW = TextWidth($hDoc.Lines[YM], XM + 1, 1) + 'Paint.FillRect(X + XY.X, Y + XY.Y + H - 1, WW, 1, $iForeground) + Paint.FillRect(X + XY.X, Y + XY.Y, WW, H, $iMatchColor) + +End + +' Public Sub PrintCache() +' +' Dim hImage As Image +' Dim iSize As Integer +' Dim cCache As Collection +' +' For Each cCache In $cGlobalCacheText +' For Each hImage In cCache +' iSize += hImage.W * hImage.H +' 'Debug Mid$($cCacheText.Key, 2) +' Next +' Next +' Debug iSize +' +' End +' + +Private Sub DrawHighlightedText(Row As Integer, sText As String, aColor As Byte[], X As Integer, Y As Integer, H As Integer, aLayout As Integer[], iNextState As Integer) + + Dim I As Integer + Dim hStyle As TextEditorStyle + Dim bAlt As Boolean + Dim iLen As Integer + Dim P As Integer + Dim sStr As String + Dim X2 As Integer + Dim iState As Integer + Dim XMin As Integer + Dim XMax As Integer + Dim aStyle As TextEditorStyle[] + Dim hImage As Image + + Dim XX, YY, XB, LB, DB As Integer + Dim hPos As Point + Dim iNextBreak As Integer + Dim iLayout As Integer + Dim iRest As Integer + Dim bBreak As Boolean + Dim sKey As String + Dim W As Integer + Dim iLayoutCount As Integer + Dim iCol As Integer + Dim iBg As Integer + + 'Dim hTemp As Image + + XMin = X + $hView.ScrollX + XMax = XMin + $hView.ClientW + aStyle = $hStyles._GetStyles() + iBg = aStyle[iNextState].Background + + XX = X + YY = Y + + If aLayout Then + iLayoutCount = aLayout.Count + iNextBreak = aLayout[0] + Else + iLayoutCount = 0 + ' Always greater than String.Len(), and faster + ' Add a big number in the case of an incorrect highlighting + iNextBreak = Len(sText) + 1000000 + Endif + + For I = 0 To aColor.Max Step 2 + + If Not aLayout Then + If XX > XMax Then Break + Endif + + iState = aColor[I] And 31 + hStyle = aStyle[iState] + bAlt = aColor[I] >= 128 + If iRest Then + iLen = iRest + iRest = 0 + Else + iLen = aColor[I + 1] + Endif + + If bBreak Then + If iBg <> Color.Default Then Paint.FillRect(XX, YY, Paint.W, H, iBg) + PaintMultiLine(X, YY, Paint.W - $MW, H, iLayout = 1, False) + XX = X + LinePos(Row, P).X + YY += H + bBreak = False + Endif + + If P + iLen >= iNextBreak Then + + bBreak = True + + iRest = P + iLen - iNextBreak + iLen = iNextBreak - P + + Inc iLayout + + If iLayout < iLayoutCount Then + iNextBreak += aLayout[iLayout] + Else + iNextBreak = Len(sText) + 1 + Endif + + If iRest Then I -= 2 + + If iLen = 0 Then Goto NEXT_PATTERN + + Endif + + hPos = LinePos(Row, P + iLen) + X2 = X + hPos.X 'LineWidth(Row, P + iLen) + + If Not aLayout Then + If X2 < XMin Then Goto NEXT_PATTERN + Endif + + iBg = hStyle.Background + If iBg <> Color.Default Then Paint.FillRect(XX, YY, X2 - XX, H, iBg) + If bAlt Then Paint.FillRect(XX, YY, X2 - XX, H, Color.SetAlpha(aStyle[Highlight.Alternate].Color, 192)) + + sStr = String.Mid$(sText, P + 1, iLen) + ' If hStyle.Bold Then + ' hTemp = New Image(X2 - X, H, Color.Transparent) + ' Paint.Begin(hTemp) + ' Paint.Font = $hFont + ' Paint.Translate(- X, - Y) + ' Endif + + 'If hStyle.Bold Then Paint.Font = $hFontBold + If InStr(sStr, "\t") Then + GoSub DRAW_TEXT_WITH_TAB + Else If Trim(sStr) Then + If Not $bRemoteDisplay And If iLen <= 16 Then + sKey = Chr$(iState) & sStr + hImage = $cCacheText[sKey] + If Not hImage Then + + W = X2 - XX + If W <= 0 Then W = TextWidth(sStr, 1, iLen) + If hStyle.Bold Then W += ($BW + 1) \ 2 + hImage = New Image(W, H, Color.Transparent) + + Paint.Begin(hImage) + Paint.Font = $hFont + Paint.Translate(-XX, -YY) + GoSub DRAW_TEXT + Paint.End + + If $cCacheText.Count > 256 Then + For Each $cCacheText + $cCacheText.Remove($cCacheText.Key) + Break + Next + Endif + + Else + + $cCacheText.Remove(sKey) + + Endif + + $cCacheText[sKey] = hImage + Paint.DrawImage(hImage, XX, YY) + Else + GoSub DRAW_TEXT + Endif + Endif + 'If hStyle.Bold Then Paint.Font = $hFont + + ' If hStyle.Bold Then + ' Paint.End + ' 'hTemp.Save("~/temp.png") + ' Paint.DrawImage(hTemp, X, Y) + ' Paint.DrawImage(hTemp, X + 1, Y) + ' Endif + + If hStyle.Underline Then + Paint.FillRect(XX, YY + H - 1, X2 - XX, 1, Color.SetAlpha(hStyle.Color, 128)) + Else If hStyle.Dotted Then + Paint.Background = Color.SetAlpha(hStyle.Color, 128) + Paint.LineWidth = 1 + Paint.Dash = [1] + Paint.MoveTo(XX, YY + H - 0.5) + Paint.RelLineTo(X2 - XX, 0) + Paint.Stroke + Paint.Dash = Null + Endif + + ' If $YM >= 0 Then + ' If Row = $YMO And If $XMO >= P And If $XMO < (P + iLen) Then DrawMatch(SX, Y, H, $XMO, $YMO) + ' If Row = $YM And If $XM >= P And If $XM < (P + iLen) Then DrawMatch(SX, Y, H, $XM, $YM) + ' Endif + + NEXT_PATTERN: + + P += iLen + XX = X2 + + Next + + sStr = String.Mid$(sText, P + 1) + If sStr And If XX <= XMax Then + + Paint.Background = $iForeground + DrawText(sStr, X, XX, YY) + + Endif + + If aLayout Then PaintMultiLine(X, YY, Paint.W - $MW, H, False, True) + + If iBg <> Color.Default Then Paint.FillRect(XX, YY, Paint.W, H, iBg) + + Return + +DRAW_TEXT: + + iCol = hStyle.Color + Paint.Background = iCol + If hStyle.Bold Then + LB = $BW + XB = XX + DB = 2 * Max(1, LB \ 4) + While LB >= DB + Paint.DrawText(sStr, XB, YY + $iAscent) 'DrawText(sStr, SX, X + 1, Y) + XB += DB \ 2 + LB -= DB + Wend + If LB Then + If DB < 4 Then + Paint.Background = Color.SetAlpha(iCol, 128) + Else + XB -= DB \ 4 + Endif + Paint.DrawText(sStr, XB, YY + $iAscent) 'DrawText(sStr, SX, X + 1, Y) + Endif + Else + Paint.DrawText(sStr, XX, YY + $iAscent) 'DrawText(sStr, SX, X, Y) + Endif + + Return + +DRAW_TEXT_WITH_TAB: + + iCol = hStyle.Color + Paint.Background = iCol + If hStyle.Bold Then + LB = $BW + XB = 0 + While LB >= 2 + 'Paint.DrawText(sStr, XB, YY + $iAscent) 'DrawText(sStr, SX, X + 1, Y) + DrawText(sStr, X + XB, XX + XB, YY) + Inc XB + LB -= 2 + Wend + If LB Then + Paint.Background = Color.SetAlpha(iCol, 128) + 'Paint.DrawText(sStr, XB, YY + $iAscent) 'DrawText(sStr, SX, X + 1, Y) + DrawText(sStr, X + XB, XX + XB, YY) + Endif + Else + 'Paint.DrawText(sStr, XX, YY + $iAscent) 'DrawText(sStr, SX, X, Y) + DrawText(sStr, X, XX, YY) + Endif + + ' If hStyle.Bold Then + ' 'Paint.Background = Color.Gradient(iCol, $iBackground) + ' DrawText(sStr, X, XX + 1, YY) + ' Endif + ' 'Paint.Background = iCol + ' DrawText(sStr, X, XX, YY) + Return + +End + +Private Sub GetTabSizeAround(Row As Integer) As Integer + + Dim iBefore As Integer + Dim Y As Integer + Dim iAfter As Integer + + Y = Row + While Y > 0 + Dec Y + iBefore = GetLineIndent(Y, True) + If iBefore >= 0 Then Break + Wend + + Y = Row + Do + Inc Y + If Y >= $hDoc.Count Then Break + iAfter = GetLineIndent(Y, True) + If iAfter >= 0 Then Break + Loop + + If iBefore = iAfter Then Return iAfter - 1 + Return Min(iBefore, iAfter) + +End + +Private Sub PaintMultiLine(X As Integer, Y As Integer, Width As Integer, Height As Integer, (bStart) As Boolean, bEnd As Boolean) + + ' Dim D As Float + ' Dim LW As Integer + + If Not Wrap_Read() Then Return + + If Not bEnd Then + X += Width - Height \ 2 + Paint.Arrow(X, Y, Height \ 3, Height, Align.Right) + Paint.Background = $iForeground + Paint.LineWidth = $LH / 24 + Paint.Stroke + Endif + + ' Paint.Save + ' Paint.AntiAlias = False + ' + ' D = Height / 3 + ' LW = CInt((Height + 23) / 24) + ' + ' If bStart Then + ' Paint.MoveTo(X, Y + LW * 2) + ' Paint.RelLineTo(D, 0) + ' Paint.RelLineTo(0, Height - LW * 2) + ' Else If bEnd Then + ' Paint.MoveTo(X, Y + Height - LW * 2 - 1) + ' Paint.RelLineTo(D, 0) + ' Paint.RelLineTo(0, -Height + LW * 2 - 1) + ' Else + ' Paint.MoveTo(X + D, Y) + ' Paint.RelLineTo(0, Height) + ' Endif + ' + ' Paint.LineWidth = LW + ' Paint.Background = Color.SetAlpha(Color.TextForeground, 128) + ' Paint.LineJoin = Paint.LineJoinMiter + ' Paint.Stroke + ' + ' Paint.Restore + +End + +Private Sub DrawLine(X As Integer, Y As Integer, Width As Integer, Height As Integer, Row As Integer) + + Dim X1 As Integer + Dim Y1 As Integer + Dim X2 As Integer + Dim Y2 As Integer + Dim iCol As Integer + Dim hInfo As CLineInfo + Dim WC As Integer + Dim sCar As String + Dim aLayout As Integer[] + Dim I As Integer + Dim P, L As Integer + Dim D As Float + Dim sText As String + Dim YY As Integer + Dim H As Integer + Dim XY1X As Integer + Dim XY2X As Integer + Dim XY1Y As Integer + Dim XY2Y As Integer + Dim XS As Integer + Dim XX As Integer + Dim hPos As Point + Dim iEndingSpaceLimit As Integer + Dim XP, IP As Integer + Dim XY As Point + Dim HH As Integer + Dim aDiffLayout As Integer[][] + Dim aText As String[] + + H = $LH + + If Row < 0 Then + Paint.FillRect(X, Y, Width, Height, Color.SetAlpha($hStyles[Highlight.Removed].Color, 224)) + Paint.Rectangle($MW, Y, Width - $MW, Height) + Paint.Clip + Paint.Translate($MW, 0) + Goto TOP_DIFF + Endif + + ' Diff background and initial diff + + ' Current line or stop line + + Try aLayout = $cLineLayout[Row] + + HH = H + If aLayout Then HH += aLayout.Count * H + + If $hDoc.IsDiffRemoved(Row) Then Paint.FillRect(X, Y + HH, Width, Height - HH, Color.SetAlpha($hStyles[Highlight.Removed].Color, 224)) + + ' If Row = $Y And If aLayout Then + ' Paint.FillRect(X, Y, Width, Height, $iMarginColor) + ' Endif + + If Row = $iStopLine Then + Paint.FillRect(X, Y, Width, HH, $hStyles[Highlight.Current].Color) + Endif + + If $hDoc.DiffAdded And If $hDoc.IsDiffAdded(Row) Then Paint.FillRect(X, Y, Width, HH, Color.SetAlpha($hStyles[Highlight.Added].Color, 224)) + + Paint.Rectangle($MW, Y, Width - $MW, Height) + Paint.Clip + Paint.Translate($MW, 0) + + hInfo = $hDoc.Info(Row) + sText = $hDoc.Lines[Row] + + ' Highlighted string + + If $sHighlightString Then + + P = 0 + L = $hDoc.LineLength[Row] + + Do + + P = String.InStr(sText, $sHighlightString, P + 1, $iHighlightStringMode) + If P = 0 Then Break + + If $bHighlightWordOnly Then + If P > 1 And If Not IsWordLimit(String.Mid$(sText, P - 1, 1)) Then Goto NEXT_SEARCH + If (P + $iHighlightStringLen) < L And If Not IsWordLimit(String.Mid$(sText, P + $iHighlightStringLen, 1)) Then Goto NEXT_SEARCH + Endif + + XY = LinePos(Row, P - 1) + Paint.FillRect(X + XY.X, Y + XY.Y, TextWidth(sText, P, $iHighlightStringLen), H, $iMatchColor) + + NEXT_SEARCH: + + P += $iHighlightStringLen + + Loop + + Endif + + ' Selection + + If HasSelection() Then + + X1 = $X + Y1 = $Y + XY1X = $XY.X + XY1Y = $XY.Y + + X2 = $SX + Y2 = $SY + XY2X = $SXY.X + XY2Y = $SXY.Y + + If Y1 > Y2 Or If Y1 = Y2 And X1 > X2 Then + Swap X1, X2 + Swap Y1, Y2 + Swap XY1X, XY2X + Swap XY1Y, XY2Y + Endif + + If Row >= Y1 And If Row <= Y2 Then + + iCol = Color.SetAlpha($iSelectedBackground, 32) + + ' If Y1 = Y2 Then + ' Paint.FillRect(X + X1X, Y, X2X - X1X, Height, iCol) + ' Else If Row = Y1 Then + ' Paint.FillRect(X + X1X, Y, Width - X1X, Height, iCol) + ' Else If Row = Y2 Then + ' Paint.FillRect(X, Y, X2X, Height, iCol) + ' Else + ' Paint.FillRect(X, Y, Width, Height, iCol) + ' Endif + + If Y1 < Row Then + XY1X = 0 + XY1Y = 0 + Endif + + If Y2 > Row Then + XY2X = 0 + XY2Y = HH + Endif + + If XY2Y = XY1Y Then + Paint.FillRect(X + XY1X, Y + XY1Y, XY2X - XY1X, H, iCol) + Else + Paint.FillRect(X + XY1X, Y + XY1Y, Width, H, iCol) + Paint.FillRect(X, Y + XY1Y + H, Width, XY2Y - XY1Y - H, iCol) + If XY2Y < HH Then Paint.FillRect(X, Y + XY2Y, XY2X, H, iCol) + Endif + + Endif + + Endif + + ' Matching characters + + If $YM >= 0 Then + If Row = $YMO Then DrawMatch(X, Y, H, $XMO, $YMO) + If Row = $YM Then DrawMatch(X, Y, H, $XM, $YM) + Endif + + ' Text + + If hInfo.Colors Then + + DrawHighlightedText(Row, sText, hInfo.Colors, X, Y, H, aLayout, hInfo.State) + + Else + + Paint.Background = $iForeground + + If aLayout Then + + P = 1 + YY = Y + XX = X + XS = X + LineStartPos(Row) + For I = 0 To aLayout.Max + DrawText(String.Mid$(sText, P, aLayout[I]), X, XX, YY) + PaintMultiLine(X, YY, Width - $MW, H, I = 0, False) + YY += H + XX = XS + P += aLayout[I] + Next + DrawText(String.Mid$(sText, P), X, XX, YY) + PaintMultiLine(X, YY, Width - $MW, H, False, True) + + Else + + DrawText(sText, X, X, Y) + + Endif + + Endif + + ' Ending spaces + + If $bShowSpaces And If sText Ends " " Then + + XX = X + $iSpaceWidth \ 2 - 1 + YY = Y + H \ 2 - 1 + For P = String.Len(sText) DownTo 1 + If String.Mid$(sText, P, 1) <> " " Then Break + hPos = LinePos(Row, P - 1) + If (XX + hPos.X) <= iEndingSpaceLimit Then Break + Paint.FillRect(XX + hPos.X, YY + hPos.Y, 2, 2, $iLimitColor) + Next + + Endif + + ' Indent vertical lines + + If $bShowIndent Then + + P = GetLineIndentMark(Row, sText) + D = $iSpaceWidth / 4 + If $IP And If Row >= $IY1 And If Row <= $IY2 Then IP = X + $IP + + Paint.Translate($iSpaceWidth \ 2, 0) + + XP = 0 + Do + + If $bTabIndent Then + Inc XP + XX = X + XP * $iTabWidth + Else + XP += $iTabSize + If $fCharWidth Then + XX = X + CInt($fCharWidth * XP) + Else + XX = X + $hFont.TextWidth(String$(XP, " ")) + Endif + Endif + + If XX >= P Then Break + + If IP And If XX = IP Then + IP = 0 + Paint.Rectangle(XX, Y, D, HH) + Paint.Background = Color.SetAlpha($iMatchColor, 64) + Paint.Fill + 'Paint.FillRect(XX + D, Y, D, Height, $iMatchColor) + Else + Paint.Rectangle(XX, Y, D / 2, HH) + Paint.Background = $iIndentColor + Paint.Fill + Endif + iEndingSpaceLimit = XX + + Loop + + Paint.Translate(-$iSpaceWidth \ 2, 0) + + ' If IP Then + ' If Row = $IY1 Then + ' Paint.FillRect(IP - D * 3, Y + H \ 2, D, Height - H \ 2, $iMatchColor) + ' Paint.FillRect(IP - D * 3, Y + H \ 2, D * 2, D, $iMatchColor) + ' Else If Row = $IY2 Then + ' Paint.FillRect(IP - D * 3, Y, D, Height - H \ 2, $iMatchColor) + ' Paint.FillRect(IP - D * 3, Y + Height - H \ 2 - D, D * 2, D, $iMatchColor) + ' Endif + ' Endif + + Endif + + ' Cursor + + If Row = $Y And If $bShowCursor And If Me.HasFocus And If Not $bHideCursor Then + If $bOverwrite Then + sCar = String.Mid$($hDoc.Lines[$Y], $X + 1, 1) + If sCar = "\t" Then + WC = $iTabWidth + Else + WC = Max($iSpaceWidth, $hFont.TextWidth(sCar)) + Endif + Else + WC = 2 + Endif + Paint.FillRect(X + $XY.X, Y + $XY.Y, WC, H, Color.SetAlpha($iForeground, 128)) + Endif + + ' Diff text + +TOP_DIFF: + + If $hDoc.IsDiffRemoved(Row) Then + + Paint.Background = $hStyles[Highlight.Removed].Color + + aDiffLayout = $cDiffLayout[Row] + aText = $hDoc.DiffRemoved[Row] + + YY = Y + HH + + For L = 0 To aText.Max + + sText = aText[L] + If aDiffLayout Then aLayout = aDiffLayout[L] + + If aLayout Then + + P = 1 + XX = X + XS = X + GetTextStartPos(sText) + + For I = 0 To aLayout.Max + If YY > -H Then + DrawText(RTrim(String.Mid$(sText, P, aLayout[I])), X, XX, YY) + PaintMultiLine(X, YY, Width - $MW, H, I = 0, False) + Endif + YY += H + If YY >= Height Then Break + XX = XS + P += aLayout[I] + Next + If YY > -H And If YY < Height Then + DrawText(String.Mid$(sText, P), X, XX, YY) + PaintMultiLine(X, YY, Width - $MW, H, False, True) + Endif + YY += H + + Else + + DrawText(sText, X, X, YY) + YY += H + + Endif + + Next + + Endif + +End + +Public Sub _PaintRow(Row As Integer, X As Integer, Y As Integer) + + Dim H As Integer + Dim hInfo As CLineInfo + Dim sText As String + Dim aLayout As Integer[] + Dim P As Integer + Dim YY As Integer + Dim XX As Integer + Dim XS As Integer + Dim I As Integer + Dim bRemoteDisplay As Boolean + Dim iSaveMW As Integer + + H = $LH + + Try aLayout = $cLineLayout[Row] + sText = $hDoc.Lines[Row] + hInfo = $hDoc.Info(Row) + + If hInfo.Colors Then + + bRemoteDisplay = $bRemoteDisplay + $bRemoteDisplay = True + iSaveMW = $MW + $MW = 0 + DrawHighlightedText(Row, sText, hInfo.Colors, X, Y, H, aLayout, hInfo.State) + $MW = iSaveMW + $bRemoteDisplay = bRemoteDisplay + + Else + + Paint.Background = $iForeground + + If aLayout Then + + P = 1 + YY = Y + XX = X + XS = X + LineStartPos(Row) + For I = 0 To aLayout.Max + DrawText(String.Mid$(sText, P, aLayout[I]), X, XX, YY) + PaintMultiLine(X, YY, Paint.W - X, H, I = 0, False) + YY += H + XX = XS + P += aLayout[I] + Next + DrawText(String.Mid$(sText, P), X, XX, YY) + PaintMultiLine(X, YY, Paint.W - X, H, False, True) + + Else + + DrawText(sText, X, X, Y) + + Endif + + Endif + +End + + +Private Sub DrawMargin(X As Integer, Y As Integer, Width As Integer, Height As Integer, Row As Integer) + + Dim iCol As Integer + Dim hInfo As CLineInfo + Dim YL As Integer + Dim S, SS As Float + Dim H As Integer + Dim sStr As String + Dim bLimit As Boolean + Dim X1 As Float + Dim X2 As Integer + + hInfo = $hDoc.Info(Row) + bLimit = $hDoc.HasLimit(Row) + X += $hView.ScrollX + H = $hRows.H + + ' Limit + + YL = -1 + + If $bShowLimit And If Row > 0 Then + If Not RTrim($hDoc.Lines[Row]) And If Row < $hDoc.Max Then + If $hDoc.HasLimit(_ViewToReal(_RealToView(Row) + 1)) Then YL = Y + Height \ 2 + Else + If bLimit And If RTrim($hDoc.Lines[_ViewToReal(_RealToView(Row) - 1)]) Then YL = Y + Endif + Endif + + ' Margin + + 'Paint.FillRect(X, Y, $MW, Height, $iBackground) + + If $bShowIcon Or If $bShowExpand Then + + If $hDoc.HasBreakpoint(Row) Or If $hDoc.HasBookmark(Row) Or If hInfo.Limit Then + + If $hDoc.HasBookmark(Row) Then + ' SS = S / 3 + ' Paint.MoveTo(0, SS) + ' Paint.RelLineTo(SS, SS) + ' Paint.RelLineTo(2 * SS, - SS * 2) + ' Paint.LineWidth = SS / 2 + ' Paint.Background = $hStyles[Highlight.Current].Color + ' Paint.Stroke + X1 = X + $MW - $LH / 2 - $iWidthModified + X2 = X + $MW - $iWidthModified + Paint.MoveTo(X, Y + 2) + Paint.LineTo(X1, Y + 2) + Paint.LineTo(X2, Y + Height / 2) + Paint.LineTo(X1, Y + Height - 2) + Paint.LineTo(X, Y + Height - 2) + Paint.LineTo(X, Y + 2) + Paint.Background = $hStyles[Highlight.Selection].Color + Paint.Fill + Endif + + Paint.Save + Paint.Translate(X + $iPosIcon + H / 4, Y + H / 4) + S = H / 2 + Paint.LineWidth = S / 6 + + If $hDoc.HasBreakpoint(Row) Then + Paint.Ellipse(0, 0, S, S) + If $hDoc.IsBreakpointDisabled(Row) Then + Paint.Background = Color.SetAlpha($hStyles[Highlight.Normal].Color, 228) + Else + Paint.Background = Color.SetAlpha($hStyles[Highlight.Breakpoint].Color, 128) + Endif + Paint.Fill(True) + Paint.Stroke + Endif + + If $bShowExpand Then + If hInfo.Limit Then + SS = S / 2 + Paint.Background = $iForeground + 'Style.PaintArrow(0, 0, S, S, If(_IsRowExpanded(Row), Align.Bottom, Align.Right)) + 'Style.PaintArrow(X + $iPosIcon + 3, Y + 3, S, S, If(_IsRowExpanded(Row), Align.Bottom, Align.Right)) + Paint.MoveTo(0, SS) + Paint.RelLineTo(S, 0) + If Not _IsRowExpanded(Row) Then + Paint.MoveTo(SS, 0) + Paint.RelLineTo(0, S) + Endif + Paint.LineCap = Paint.LineCapRound + Paint.Stroke + Endif + Endif + + Paint.Restore + + Endif + + Endif + + If $bShowModified Then + If hInfo.Modified Or If hInfo.Saved Then + If hInfo.Modified Then + iCol = Color.Merge($iBackground, Color.Red, 0.2) + Else If hInfo.Saved Then + iCol = Color.Merge($iBackground, Color.Green, 0.2) + Endif + Paint.FillRect(X + $MW - $iWidthModified, Y, $iWidthModified - 1, Height, iCol) + Endif + Endif + + If YL >= 0 Then Paint.FillRect(X, YL, Width, 1, Color.SetAlpha($iMatchColor, 64)) + + If YL < 0 Or If YL = Y Then + If $bShowLineNumber Then + If (Row + 1) Mod 10 = 0 Then + iCol = $iForeground + Else + iCol = $iLimitColor + Endif + Paint.Background = iCol + sStr = CStr(Row + 1 + $iLineNumberOffset) + Paint.DrawText(sStr, X, Y, $iWidthLineNumber - 4, H, Align.Right) + ' If Row = $Y Then + ' Paint.Background = Color.SetAlpha(iCol, 128) + ' Paint.DrawText(sStr, X + 1, Y, $iWidthLineNumber - 4, H, Align.Right) + ' Endif + Endif + Endif + +End + +Fast Private Sub TextWidth(sText As String, iStart As Integer, iLength As Integer) As Integer + + Dim aText As String[] + Dim I As Integer + Dim W As Float + + I = InStr(sText, "\t", iStart) - iStart + + If I < 0 Or If I >= iLength Then + If $fCharWidth Then + Return $fCharWidth * iLength + Else + Return $hFont.TextWidth(String.Mid$(sText, iStart, iLength)) + Endif + Endif + + If iLength <= 0 Then Return 0 + aText = Split(String.Mid$(sText, iStart, iLength), "\t") + + If $fCharWidth Then + + For I = 0 To aText.Max - 1 + W += $fCharWidth * String.Len(aText[I]) + W = (CInt(W + $iTabWidth) \ $iTabWidth) * $iTabWidth + Next + W += $fCharWidth * String.Len(aText[aText.Max]) + + Else + + For I = 0 To aText.Max - 1 + W += $hFont.TextWidth(aText[I]) + W = (CInt(W + $iTabWidth) \ $iTabWidth) * $iTabWidth + Next + W += $hFont.TextWidth(aText[aText.Max]) + + Endif + + Return Ceil(W) + +End + +Private Sub LinePos(Y As Integer, Optional X As Integer = -1) As Point + + Dim aLayout As Integer[] + Dim I As Integer + Dim P As Integer + Dim hPos As Point + Dim cCache As Collection + Dim XO As Integer + Dim XX As Integer + + XO = X + Try hPos = $cCachePos[Y][XO] + If hPos Then Goto RETURN_POS + + If $cLineLayout Then + aLayout = $cLineLayout[Y] + If aLayout Then + For I = 0 To aLayout.Max + If X < aLayout[I] Then Break + P += aLayout[I] + X -= aLayout[I] + Next + XX = TextWidth($hDoc.Lines[Y], P + 1, X) + If I Then XX += LineStartPos(Y) + hPos = Point(XX, I * $LH) + Goto CACHE_POS + Endif + Endif + + hPos = New Point + If X < 0 Then + hPos.X = TextWidth($hDoc.Lines[Y], 1, $hDoc.LineLength[Y]) + Else + hPos.X = TextWidth($hDoc.Lines[Y], 1, X) + Endif + +CACHE_POS: + + cCache = $cCachePos[Y] + If Not cCache Then + If $cCachePos.Count > 80 Then + For Each $cCachePos + $cCachePos.Remove($cCachePos.Key) + Break + Next + Endif + cCache = New Collection + $cCachePos[Y] = cCache + Endif + cCache[XO] = hPos + + 'If Y = 28 Then Debug "calc";; X;; Y;; "->";; hPos;; hPos.X;; hPos.Y + +RETURN_POS: + + Return hPos + +End + +Private Sub GetTextStartPos(sText As String, Optional aLayout As Integer[]) As Integer + + Dim S As Integer + + S = Len(sText) - Len(LTrim(sText)) + If aLayout And If S >= aLayout[0] Then S = aLayout[0] - 1 + Return TextWidth(sText, 1, S) + +End + +Private Sub LineStartPos(Y As Integer) As Integer + + Dim S As Integer + Dim aLayout As Integer[] + + S = Len($hDoc.Lines[Y]) - Len(LTrim($hDoc.Lines[Y])) + Try aLayout = $cLineLayout[Y] + If aLayout And If S >= aLayout[0] Then S = aLayout[0] - 1 + Return LinePos(Y, S).X + +End + +Private Sub FindLargestLine() As Integer + + Dim I As Integer + Dim W As Integer + Dim WM As Integer = -1 + + If $hDoc.Count >= 10000 Then Inc Application.Busy + + For I = 0 To $hDoc.Count - 1 + W = LinePos(I).X + If W > WM Then + WM = W + $iLargestLine = I + Endif + Next + + If $hDoc.Count >= 10000 Then Dec Application.Busy + + Return WM + +End + +Private Sub UpdateWidth(Optional Y As Integer = -1) + + Dim W As Integer + + If Wrap_Read() Then + If $iWidth <> $hView.ClientWidth Then + $iWidth = $hView.ClientWidth + _ResizeContents + Endif + Return + Endif + + If $iLargestLine < 0 Or If $iLargestLine > $hDoc.Max Then + FindLargestLine + Y = -1 + Endif + + If Y < 0 Then + W = LinePos($iLargestLine).X + $MW + 2 + Goto UPDATE_WIDTH + Endif + + W = LinePos(Y).X + $MW + 2 + If W > $iWidth Then + $iLargestLine = Y + Goto UPDATE_WIDTH + Else If W < $iWidth And If Y = $iLargestLine Then + W = FindLargestLine() + $MW + 2 + Goto UPDATE_WIDTH + Endif + + Return + +UPDATE_WIDTH: + + $iWidth = Max($hView.ClientWidth, W) + _ResizeContents + +End + +Public Sub TimerCursor_Timer() + + If $bMouseDown Then Return + $bShowCursor = Not $bShowCursor + _RefreshLine($Y) + If $YM >= 0 Then + If $YM <> $Y Then _RefreshLine($YM) + If $YMO <> $Y Then _RefreshLine($YMO) + Endif + +End + +Public Sub View_KeyPress() + + Dim Y As Integer + Dim sAction As String + Dim sTab As String + Dim bCancel As Boolean + Dim aLayout As Integer[] + Dim I, P As Integer + Dim bSaveOverwrite As Boolean = $bOverwrite + Dim X As Integer + + bCancel = Raise KeyPress + If bCancel Then Goto STOP_EVENT + + Try sAction = $cShortcut[String.UCase(Shortcut.FromKey())] + If sAction Then + Select Case sAction + Case "Copy" + Copy() + Case "Paste" + If $bReadOnly Then Goto STOP_EVENT + Paste() + Case "Undo" + If $bReadOnly Then Goto STOP_EVENT + Undo() + Case "Redo" + If $bReadOnly Then Goto STOP_EVENT + Redo() + Case "Cut" + If $bReadOnly Then Goto STOP_EVENT + Cut() + Case "SelectAll" + SelectAll + Case "Find" + ShowFind + End Select + Goto STOP_EVENT + Endif + + If Key.Text And If Asc(Key.Text) >= 32 And If Asc(Key.Text) <> 127 Then + If $bReadOnly Then Goto STOP_EVENT + If $hDoc._Mode And If $hDoc._Mode.OnKeyPress(Me) Then Goto STOP_EVENT + Insert(Key.Text) + Goto STOP_EVENT + Endif + + Select Case Key.Code + + Case Key.Right + If Key.Control Then + If $X >= $hDoc.LineLength[$Y] Then + Goto(0, _ViewToReal(_RealToView($Y) + 1), Key.Shift) + Else + Goto($hDoc.WordRight($X, $Y), $Y, Key.Shift) + Endif + Else If Key.Normal Or If Key.Shift Then + If $X >= $hDoc.LineLength[$Y] Then + Goto(0, _ViewToReal(_RealToView($Y) + 1), Key.Shift) + Else + Goto($X + 1, $Y, Key.Shift) + Endif + Endif + + Case Key.Left + '$X = NormalizeColumn($X, $Y) + If Key.Control Then + If $X = 0 Then + Goto(-1, _ViewToReal(_RealToView($Y) - 1), Key.Shift) + Else + Goto($hDoc.WordLeft($X, $Y), $Y, Key.Shift) + Endif + Else If Key.Normal Or If Key.Shift Then + If $X = 0 Then + Goto(-1, _ViewToReal(_RealToView($Y) - 1), Key.Shift) + Else + Goto($X - 1, $Y, Key.Shift) + Endif + Endif + + Case Key.Up + If Key.Alt Then + If Me.DiffMode Then + Y = $hDoc.FindPreviousDiff($Y) + If Y >= 0 Then Goto($X, Y, Key.Shift) + Else + If $bReadOnly Then Goto STOP_EVENT + MoveSelection(True) + Endif + Else If Key.Control Then + Y = FindPreviousLimit($Y) + If Y >= 0 Then + Goto($X, Y, Key.Shift) + Else + Goto(0, 0, Key.Shift) + Endif + Else + GotoXY($X0 + $MW - $hView.ScrollX, $hRows._GetRowY($Y) - $hView.ScrollY + $XY.Y - $hRows.H, Key.Shift) + Endif + + Case Key.Down + If Key.Alt Then + If Me.DiffMode Then + Y = $hDoc.FindNextDiff($Y) + If Y >= 0 Then Goto($X, Y, Key.Shift) + Else + If $bReadOnly Then Goto STOP_EVENT + MoveSelection(False) + Endif + Else If Key.Control Then + Y = FindNextLimit($Y) + If Y >= 0 Then + Goto($X, Y, Key.Shift) + Else + Goto(-1, $hDoc.Max, Key.Shift) + Endif + Else + X = $X0 + $MW - $hView.ScrollX + Y = $Y + GotoXY(X, $hRows._GetRowY($Y) - $hView.ScrollY + $XY.Y + $hRows.H, Key.Shift) + ' ?? If $Y = Y Then GotoXY(X, $hRows._GetRowY($Y + 1) - $hView.ScrollY, Key.Shift) + Endif + + Case Key.Home + If Key.Control Then + Goto(0, 0, Key.Shift) + Else + Try aLayout = $cLineLayout[$Y] + If Not aLayout Or If $X < aLayout[0] Then + P = GetLineIndent($Y) + If P = $X Then P = 0 + Goto(P, $Y, Key.Shift) + Else + P = aLayout[0] + For I = 1 To aLayout.Max + If $X < P + aLayout[I] Then Break + P += aLayout[I] + Next + If P = $X Then P = GetLineIndent($Y) + Goto(P, $Y, Key.Shift) + Endif + Endif + + Case Key.End + If Key.Control Then + Goto(-1, $hDoc.Max, Key.Shift) + Else + Try aLayout = $cLineLayout[$Y] + If Not aLayout Then + Goto(-1, $Y, Key.Shift) + Else + P = 0 + For I = 0 To aLayout.Max + P += aLayout[I] + If $X < P Then + Dec P + Break + Endif + Next + If P = $X Or If I = aLayout.Count Then P = -1 + Goto(P, $Y, Key.Shift) + Endif + Endif + + Case Key.PageUp + 'Y = RealToView($Y) + 'Y = $hRows._FindRowFromPos($hRows._GetRowY($Y) + $hRows._GetRowHeight($Y) - $hView.ClientH) + 'Y = ViewToReal(Y) + 'Goto($X, Max(0, Y), Key.Shift) + If Not Key.Control And If Not Key.Alt And If Not Key.Meta Then + If GotoXY($X0 + $MW - $hView.ScrollX, $hRows._GetRowY($Y) + $XY.Y - $hView.ClientH - $hView.ScrollY, Key.Shift) Then + Goto(0, 0, Key.Shift) + Endif + Endif + + Case Key.PageDown + 'Y = RealToView($Y) + 'Y = $hRows._FindRowFromPos($hRows._GetRowY($Y) + $hView.ClientH) + 'Y = ViewToReal(Y) + 'If Y >= 0 Then + 'Goto($X, Y, Key.Shift) + 'Else + 'Goto($X, $hDoc.Max, Key.Shift) + 'Endif + If Not Key.Control And If Not Key.Alt And If Not Key.Meta Then + If GotoXY($X0 + $MW - $hView.ScrollX, $hRows._GetRowY($Y) + $XY.Y + $hView.ClientH - $hView.ScrollY, Key.Shift) Then + Goto(-1, $hDoc.Max, Key.Shift) + Endif + Endif + + Case Key.Enter, Key.Return + + If $bShowExpand Then + If Key.Control Then + Y = FindPreviousLimit($Y + 1) + If Y >= 0 Then + If Key.Alt Then + If _IsRowExpanded(Y) Then + CollapseAll + Else + ExpandAll + Endif + Else + ToggleRow(Y) + Endif + Endif + Goto STOP_EVENT + Endif + Endif + + If $bReadOnly Then Goto STOP_EVENT + + If Not $bPrint Then $bOverwrite = False + sTab = GetLineIndentText($Y) + If $hDoc._Mode.BetweenBraces(Me) Then + Insert("\n" & String.Left(sTab, $X) & GetTab() & "\n" & String.Left(sTab, $X)) + Goto(-1, $Y - 1) + Else + Insert("\n" & String.Left(sTab, $X)) + Endif + 'If Not $bPrint Then $bOverwrite = True + $bOverwrite = bSaveOverwrite + + Case Key.BackSpace + If Key.Control Then + If $bReadOnly Then Goto STOP_EVENT + DeleteWordLeft + Else If Key.Normal Then + If $bReadOnly Then Goto STOP_EVENT + If $hDoc._Mode And If $hDoc._Mode.OnKeyPress(Me) Then Goto STOP_EVENT + DeleteLeft + Endif + + Case Key.Delete + If Key.Control Then + If $bReadOnly Then Goto STOP_EVENT + DeleteWordRight + Else If Key.Normal Then + If $bReadOnly Then Goto STOP_EVENT + DeleteRight + Endif + + Case Key.Tab + If Key.Control Then + If $bReadOnly Then Goto STOP_EVENT + Insert("\t") + Else + DoIndent(Key.Shift) + Endif + + Case Key.BackTab + DoIndent(True) + + Case Key.Insert + Me.Overwrite = Not $bOverwrite + + End Select + +STOP_EVENT: + + Stop Event + +End + +Public Sub HideSelection() + + If HasSelection() Then Refresh + $SX = $X + $SY = $Y + $SXY = $XY.Copy() + +End + +Public Sub _RaiseCursor() + + If $iSaveCursor Then Return + If $X = $LX And If $Y = $LY Then Return + If $hDoc.IsLocked() Then Return + + EnsureVisible + If $bShowPosition Then UpdatePosition + + TimerChange_Timer + Raise Cursor + $LX = $X + $LY = $Y + +End + +Public Sub Goto(NX As Integer, NY As Integer, Optional Mark As Boolean) + + Dim SX As Integer + Dim SY As Integer + Dim SXY As Point + Dim iLen As Integer + + If NY < 0 Then Return + If NY > $hDoc.Max Then + NY = $hDoc.Max + NX = -1 + Endif + + NY = CheckFolded(NY) + + If NY <> $Y Then + SX = $SX + SY = $SY + SXY = $SXY + $hDoc.HighlightFrom($Y) + If Mark Then + If $SX <> SX Or If $SY <> SY Then + $SX = SX + $SY = SY + $SXY = LinePos($SY, $SX) + Endif + Endif + Endif + + iLen = $hDoc.LineLength[NY] + If NX < 0 Or If NX > iLen Then NX = iLen + + If Not Mark Then HideSelection + + _RefreshLine($Y) + + 'Debug "$XY.X =";; $XY.X + If NX <> $X Or If NY <> $Y Then + + If Not Mark Then + _RefreshLine(NY) + Else + _RefreshLine(Min(NY, $Y), Max(NY, $Y) - Min(NY, $Y) + 1) + Endif + + $X = NX + $Y = NY + $XY = LinePos($Y, $X) + '$XM = 0 + '$YM = -1 + Endif + + $X0 = $XY.X + + If Not Mark Then + $SX = $X + $SY = $Y + $SXY = $XY + Else + Clipboard.Current = Clipboard.Selection + Copy() + Clipboard.Current = Clipboard.Default + Endif + + $bShowCursor = True + $hTimerCursor.Restart + If Not $bReadOnly Then $hTimerCursor.Start + + CheckMatch + CheckIndentMark + _RaiseCursor + +End + +Private Sub EnsureVisible(Optional bCenter As Boolean) + + Dim Y As Integer + Dim H As Integer + + 'Y = RealToView($Y) + + If Me.DiffMode Then + Y = $hRows._GetRowY($Y) + $XY.Y + H = $hRows._GetRowHeight($Y) + If $Y = 0 And If _TopHeight Then + Y = 0 + H += _TopHeight * $LH + Endif + Else + H = $hRows.H '_GetRowHeight(Y) + Y = $hRows._GetRowY($Y) + $XY.Y + Endif + + If bCenter Then + Y = Y - $hView.ClientH \ 2 + H \ 2 + H = $hView.ClientH + Endif + + If $bMouseDown Or If $XY.X > ($hView.ClientW - $MW) Then + $hView.EnsureVisible($XY.X, Y, $iSpaceWidth + $MW, H) + Else + $hView.EnsureVisible(0, Y, $hView.ClientW, H) + Endif + +End + +Public Sub GotoCenter(NX As Integer, NY As Integer) + + Goto(NX, NY) + EnsureVisible(True) + ' If Not $hTimerEnsureVisible Then + ' $hTimerEnsureVisible = New Timer As "EnsureVisible" + ' $hTimerEnsureVisible.Trigger + ' Endif + +End + +Public Sub EnsureVisible_Timer() + + EnsureVisible(True) + $hTimerEnsureVisible.Stop + $hTimerEnsureVisible = Null + +End + +Private Sub PosToColumn(Y As Integer, PX As Integer, RY As Integer, Optional bIgnoreMargin As Boolean) As Integer + + Dim I As Integer + Dim iLen As Integer + Dim D As Integer + Dim F As Integer + Dim sStr As String + Dim LP As Point + Dim J As Integer + + sStr = $hDoc.Lines[Y] + iLen = $hDoc.LineLength[Y] + + If Not bIgnoreMargin Then + If PX < $MW Then Return 0 + Endif + + ' if (px < margin || px >= visibleWidth()) + ' _posOutside = true; + ' + If iLen = 0 Then Return PX \ $hFont.TextWidth("m") + + PX += $hView.ScrollX - $MW + RY = (RY \ $hRows.H) * $hRows.H + + ' px += contentsX(); + ' + D = 0 + F = iLen + J = -1 + + Do + + I = (D + F) \ 2 + If I = J Then Break + J = I + + LP = LinePos(Y, I) + + If RY < LP.Y Or If RY = LP.Y And PX < LP.X Then + F = I + Else If RY > LP.Y Or If PX > LP.X Then + D = I + 1 + Else + D = I + Break + Endif + + ' 'LP = LinePos(Y, I + 1) + ' If RY > LP.Y Or If PX >= LP.X Then + ' D = I '+ 1 + ' Continue + ' Endif + ' + ' D = I + ' Break + + Loop + + If LP Then + If LP.Y < RY Then + D = Min(iLen, D + 1) + Else If LP.Y > RY Then + D = Max(0, D - 1) + Endif + Endif + ' _posOutside = d > len; + Return D + +End + +Private Sub PosToLine(PY As Integer) As Integer + + Return $hRows._FindRowFromPos(PY + $hView.ScrollY) + +End + +Public Sub View_MouseDown() + + Dim Y As Integer + Dim X As Integer + Dim RY As Integer + Dim MW As Integer + + $bFirstFocus = True + + If Mouse.Right Then Return + + Y = PosToLine(Mouse.Y) + RY = $hRows.RelativeY + + If Y >= 0 Then + MW = $MW + MW -= $iWidthModified + If Mouse.X < MW And If Mouse.X >= $iPosIcon Then + If Mouse.Left Then + Goto(0, Y, Mouse.Shift) + If Mouse.Normal And If $bShowExpand And If $hDoc.Info(Y).Limit Then + ToggleRow(Y) + Endif + Endif + Else + 'X = NormalizeColumn(PosToColumn(Y, Mouse.X, RY), Y) + X = PosToColumn(Y, Mouse.X - $iSpaceWidth \ 2, RY) + Goto(X, Y, Mouse.Shift) + Endif + Endif + + $bMouseDown = True + +End + +Public Sub View_DblClick() + + Dim X, Y As Integer + + If Mouse.Right Then Return + + If $bShowIcon Or If $bShowExpand Then + Y = PosToLine(Mouse.Y) + If Mouse.X < $MW And If Mouse.X >= $iPosIcon Then + If $bShowExpand And If $hDoc.Info(Y).Limit Then + If _IsRowExpanded(Y) Then + ExpandAll + Else + CollapseAll + Endif + Else + Goto(0, Y) + Raise Margin + Stop Event + Endif + Endif + Endif + + If Mouse.X >= $MW Then + X = $X + If $X >= 0 Then Goto($hDoc.WordLeft($X, $Y, True), $Y) + If $X < $hDoc.LineLength[$Y] Then X = $hDoc.WordRight($X, $Y, True) + Goto(X, $Y, True) + Endif + +End + +Public Sub View_MouseDrag() + + If Mouse.Right Then Return + + If Not $hTimerScroll Then + $hTimerScroll = New Timer As "TimerScroll" + $hTimerScroll.Delay = 50 + $hTimerScroll.Start + Endif + +End + +Public Sub View_MouseMove() + + Dim Y, RY As Integer + Dim X As Integer + Dim PX As Integer + + PX = Mouse.ScreenX - $hView.ScreenX + + If PX < $MW Then + $hView.Mouse = Mouse.Default + Else + $hView.Mouse = Mouse.Text + Endif + + If $bMouseDown Then + + Y = PosToLine(Mouse.ScreenY - $hView.ScreenY) + RY = $hRows.RelativeY + If Y >= 0 Then + 'X = NormalizeColumn(PosToColumn(Y, Mouse.ScreenX - $hView.ScreenX, RY), Y) + X = PosToColumn(Y, PX, RY, True) + Goto(X, Y, True) + Endif + + Endif + +End + +Public Sub View_MouseUp() + + If $hTimerScroll Then + $hTimerScroll.Stop + $hTimerScroll = Null + Endif + + If Mouse.Middle Then + Clipboard.Current = Clipboard.Selection + Paste + Clipboard.Current = Clipboard.Default + Endif + + $bMouseDown = False + +End + +Public Sub TimerScroll_Timer() + + View_MouseMove + +End + +Private Function Line_Read() As Integer + + Return $Y + +End + +Private Function Column_Read() As Integer + + Return $X + +End + +Private Function SelectionLine_Read() As Integer + + Return $SY + +End + +Private Function SelectionColumn_Read() As Integer + + Return $SX + +End + +Private Function Selected_Read() As Boolean + + Return HasSelection() + +End + +Private Sub DeleteSelection() As Boolean + + If HasSelection() Then + Remove($SX, $SY, $X, $Y) + Return True + Endif + +End + +' Private Sub NormalizeColumn(X As Integer, Y As Integer) As Integer +' +' Return Min(String.Len($hDoc.Lines[Y]), X) +' +' End + +Public Sub Insert(Text As String) + + Dim aText As String[] + Dim I As Integer + + If Len(Text) = 1 And If Text <> "\n" And If Not HasSelection() And If Not $bOverwrite Then + $hDoc.Insert(Text, $X, $Y) + Goto($hDoc.XAfter, $hDoc.YAfter) + Return + Endif + + $hDoc.Begin + + DeleteSelection + If Text Then + + '$X = NormalizeColumn($X, $Y) + + If $bOverwrite Then + + aText = Split(Text, "\n") + + For I = 0 To aText.Max - 1 + Remove($X, $Y, $X + String.Len(aText[I]), $Y) + If $Y = $hDoc.Max Then + $hDoc.Insert(aText[I] & "\n", $X, $Y) + Else + $hDoc.Insert(aText[I], $X, $Y) + Endif + Goto(0, $Y + 1) + Next + + Remove($X, $Y, $X + String.Len(aText[aText.Max]), $Y) + $hDoc.Insert(aText[aText.Max], $X, $Y) + + Else + + $hDoc.Insert(Text, $X, $Y) + + Endif + + Goto($hDoc.XAfter, $hDoc.YAfter) + + Endif + + $hDoc.End + +End + +Public Sub _BeforeInsert(Y1 As Integer, N As Integer) + + $hRows._BeforeInsert(Y1, N, $cLineLayout) + +End + +Public Sub _AfterInsert(Y1 As Integer, Y2 As Integer, N As Integer) + + Dim Y As Integer + + _ExpandInsert(Y1, N) + + If Not Wrap_Read() Then + + If $iLargestLine >= Y1 Then $iLargestLine += N + + For Y = Y1 To Y2 + UpdateWidth(Y) + Next + + Endif + + ' If $cLineLayout Then + ' + ' 'If N > 0 Then _UpdateAllHeight(True) + ' + ' Endif + + UpdateMargin + UpdateCount + +End + +Private Function SelectedText_Read() As String + + If Not HasSelection() Then Return + Return $hDoc.GetText($X, $Y, $SX, $SY) + +End + +Public Sub Copy() + + If Not HasSelection() Then Return + Clipboard.Copy(Me.SelectedText) + +End + +Public Sub Paste() + + Dim sText As String + + If Clipboard.Type <> Clipboard.Text Then Return + sText = Clipboard.Paste("text/plain") + If Not sText Then Return + + Insert(sText) + +End + +Public Sub SelectAll() + + Goto(0, 0) + Goto(-1, $hDoc.Max, True) + +End + +Public Sub Remove(X1 As Integer, Y1 As Integer, X2 As Integer, Y2 As Integer, Optional bRight As Boolean) + + 'Goto(X1, Y1) + + If Y1 = Y2 And If Abs(X1 - X2) = 1 Then + $hDoc.Remove(X1, Y1, X2, Y2, bRight) + Goto($hDoc.XAfter, $hDoc.YAfter) + Return + Endif + + $hDoc.Begin + $hDoc.Remove(X1, Y1, X2, Y2, bRight) + + Goto($hDoc.XAfter, $hDoc.YAfter) + $hDoc.End + +End + +Public Sub _AfterRemove(Y1 As Integer, Y2 As Integer) + + Dim X As Integer + Dim Y As Integer + + If Y1 > Y2 Then Swap Y1, Y2 + + _ClearCachePos + + If Y2 > Y1 Then + $hRows._AfterRemove(Y1, Y2, $cLineLayout) + Endif + + _ExpandRemove(Y1, Y2) + + Y = Min($Y, $hDoc.Max) + X = Min($X, $hDoc.LineLength[Y]) + If X <> $X Or If Y <> $Y Then Goto(X, Y) + + $SX = $X + $SY = $Y + + If Not Wrap_Read() Then + + If $iLargestLine >= Y1 Then + If $iLargestLine <= Y2 Then + $iLargestLine = -1 + UpdateWidth + Else + $iLargestLine -= Y2 - Y1 + Endif + Endif + + Else + + 'If Y2 > Y1 Then _UpdateAllHeight(True) + + Endif + + UpdateMargin + UpdateCount + +End + +Private Sub DeleteLeft() + + Dim sTab As String + + If DeleteSelection() Then Return + + '$X = NormalizeColumn($X, $Y) + + If $X = 0 Then + If $Y > 0 Then + Remove($hDoc.LineLength[$Y - 1], $Y - 1, 0, $Y) + Endif + Else + sTab = GetLineIndentText($Y) + If Len(sTab) = Len($hDoc.Lines[$Y]) Then + If Right(sTab) = "\t" Then + Remove($X - 1, $Y, $X, $Y) + Else If Not $bTabIndent Then + Remove((($X - 1) \ $iTabSize) * $iTabSize, $Y, $X, $Y) + Else + Remove($X - 1, $Y, $X, $Y) + Endif + Else + Remove($X - 1, $Y, $X, $Y) + Endif + Endif + +End + +Private Sub DeleteWordLeft() + + Dim X As Integer + + If DeleteSelection() Then Return + + If $X = 0 Then + DeleteLeft + Return + Endif + + X = $hDoc.WordLeft($X, $Y) + If X = $X Then Return + + Begin() + Goto(X, $Y, True) + DeleteSelection() + End() + +End + +Private Sub DeleteWordRight() + + Dim X As Integer + + If DeleteSelection() Then Return + + If $X >= $hDoc.LineLength[$Y] Then + DeleteRight + Return + Endif + + X = $hDoc.WordRight($X, $Y) + If X = $X Then Return + + Begin() + Goto(X, $Y, True) + DeleteSelection() + End() + +End + +Private Sub DeleteRight() + + If DeleteSelection() Then Return + + If $X >= $hDoc.LineLength[$Y] Then + If $Y < $hDoc.Max Then + Remove($X, $Y, 0, $Y + 1, True) + Endif + Else + Remove($X, $Y, $X + 1, $Y, True) + Endif + +End + +Private Sub GetLineIndent(Y As Integer, Optional bIgnoreEmpty As Boolean) As Integer + + Dim sText As String + Dim I As Integer + Dim sCar As String + + sText = $hDoc.Lines[Y] + For I = 1 To Len(sText) + sCar = Mid$(sText, I, 1) + If sCar <> " " And If sCar <> "\t" Then Break + Next + + If bIgnoreEmpty And If I > Len(sText) Then Return -1 + Return I - 1 + +End + +Private Sub GetLineIndentText(Y As Integer) As String + + Return String.Left($hDoc.Lines[Y], GetLineIndent(Y)) + +End + +' Private Sub IsVisible(Y As Integer) As Boolean +' +' If Y < $hView.RowAt(0) Then Return +' If Y > $hView.RowAt($hView.ClientH - 1) Then Return +' Return True +' +' End + +Private Sub CheckMatch() + + Dim sCar As String + Dim X, Y As Integer + Dim iMatch As Integer + Dim N, L As Integer + Dim sOther As String + Dim sLine As String + Dim iLen As Integer + Dim iOldXM, iOldYM As Integer + + iOldXM = $XM + iOldYM = $YM + + $XM = 0 + $YM = -1 + + If $bShowBraces Then + + Y = $Y + X = Min($hDoc.LineLength[Y], $X) + + If X > 0 Then + sCar = String.Mid$($hDoc.Lines[Y], X, 1) + iMatch = InStr(MATCH_STRING, sCar) + If iMatch Then Goto FIND_MATCH + Endif + + Inc X + sCar = String.Mid$($hDoc.Lines[Y], X, 1) + iMatch = InStr(MATCH_STRING, sCar) + If iMatch Then Goto FIND_MATCH + + Endif + + Goto FOUND + +FIND_MATCH: + + If Odd(iMatch) Then + sOther = Mid$(MATCH_STRING, iMatch + 1, 1) + Else + sOther = Mid$(MATCH_STRING, iMatch - 1, 1) + Endif + + L = 1 + Dec X + $XMO = X + $YMO = Y + + sLine = $hDoc.Lines[Y] + iLen = $hDoc.LineLength[Y] + + Do + + If Odd(iMatch) Then + + Inc X + + While X >= iLen + + X = 0 + Inc Y + If Y > $hDoc.Max Then Goto FOUND + Inc N + If N > 1000 Then Goto FOUND + + sLine = $hDoc.Lines[Y] + iLen = $hDoc.LineLength[Y] + + Wend + + Else + + Dec X + + While X < 0 + + Dec Y + If Y < 0 Then Goto FOUND + Inc N + If N > 1000 Then Goto FOUND + + sLine = $hDoc.Lines[Y] + X = $hDoc.LineLength[Y] - 1 + + Wend + + Endif + + Select Case String.Mid$(sLine, X + 1, 1) + + Case sOther + Dec L + If L = 0 Then + $XM = X + $YM = Y + Goto FOUND + Endif + + Case sCar + Inc L + + End Select + + Loop + +FOUND: + + If $XM <> iOldXM Or If $YM <> iOldYM Then + _RefreshLine(iOldYM) + _RefreshLine($Y) + _RefreshLine($YM) + Endif + +End + +Private Sub GetLineIndentMark(Y As Integer, Optional sText As String) As Integer + + Dim P As Integer + + If IsMissing(sText) Then sText = $hDoc.Lines[Y] + + P = Len(LTrim(sText)) + + If P = 0 Then + + P = GetTabSizeAround(Y) + 1 + P = LinePos(Y, String.Len(sText)).X + (P - String.Len(sText)) * $iSpaceWidth + + Else + + P = Len(sText) - P + P = LinePos(Y, P).X + + Endif + + Return P + +End + +Private Sub CheckIndentMark() + + Dim Y1, Y2 As Integer + Dim IM1, IM2 As Integer + Dim IY1 As Integer + Dim IY2 As Integer + Dim IP As Integer + Dim IM0 As Integer + Dim bStop As Boolean + Dim bLimit1 As Boolean + Dim bLimit2 As Boolean + Dim bEqual2 As Boolean + Dim bEqual1 As Boolean + + 'If $Y = 501 Then Stop + + IM0 = GetLineIndentMark($Y) + If IM0 = 0 Then Goto SET_RESULT + + bStop = False + Y1 = $Y + While Y1 > 0 + Dec Y1 + If Not Trim($hDoc.Lines[Y1]) Then Continue + IM1 = GetLineIndentMark(Y1) + If IM1 < IM0 Then + bLimit1 = True + Break + Else If IM1 > IM0 Then + If Not bEqual1 Then bStop = True + Else + If bStop Then + bLimit1 = True + Break + Endif + bEqual1 = True + Endif + Wend + + bStop = False + Y2 = $Y + While Y2 < $hDoc.Max + Inc Y2 + If Not Trim($hDoc.Lines[Y2]) Then Continue + IM2 = GetLineIndentMark(Y2) + If IM2 < IM0 Then + bLimit2 = True + Break + Else If IM2 > IM0 Then + If Not bEqual2 Then bStop = True + Else + If bStop Then + bLimit2 = True + Break + Endif + bEqual2 = True + Endif + Wend + + 'Debug "----" + 'Debug "Y1=";; Y1 + 1;; "Y2=";; Y2 + 1;; "bLimit1=";; bLimit1;; "bLimit2=";; bLimit2;; "bEqual1=";; bEqual1;; "bEqual2=";; bEqual2 + + If bLimit1 And If bLimit2 Then + IM1 = GetLineIndentMark(Y1) + IM2 = GetLineIndentMark(Y2) + If IM1 < IM2 Then + If IM2 = IM0 Then Y1 = $Y + Else If IM1 > IM2 Then + If IM1 = IM0 Then Y2 = $Y + Endif + Else If bLimit1 Then + Y2 = $Y + Else If bLimit2 Then + Y1 = $Y + Endif + + 'If bEqual1 Or If bEqual2 Then + IP = Max(GetLineIndentMark(Y1), GetLineIndentMark(Y2)) + 'Else + 'IP = Min(GetLineIndentMark(Y1), GetLineIndentMark(Y2)) + 'Endif + + If IP = 0 Then + IY1 = 0 + IY2 = 0 + Else + IY1 = Y1 + IY2 = Y2 + Endif + + 'Debug "=> "; IY1 + 1;; IY2 + 1;; IP + +SET_RESULT: + + If IP <> $IP Or If IY1 <> $IY1 Or If IY2 <> $IY2 Then + If $IP Then _RefreshLine($IY1, $IY2 - $IY1 + 1) + $IP = IP + $IY1 = IY1 + $IY2 = IY2 + If $IP Then _RefreshLine($IY1, $IY2 - $IY1 + 1) + Endif + +End + + +Public Sub _RefreshLine(Y As Integer, Optional N As Integer = 1) + + Dim I As Integer + Dim hPict As Picture + + If Y < 0 Or If Y > $hDoc.Max Or If N <= 0 Then Return + + N = Min(N, $hDoc.Count - Y) + + If Not $bRemoteDisplay Then + For I = Y To Y + N - 1 + hPict = $cCacheLine[I] + If hPict Then + $iCacheLineH -= hPict.H + $cCacheLine.Remove(I) + Endif + Next + Endif + + If N = 1 Then + $hView.RefreshRect(0, $hRows._GetRowY(Y), $hView.ScrollW, $hRows._GetRowHeight(Y)) + Else + $hView.RefreshRect(0, $hRows._GetRowY(Y), $hView.ScrollW, $hRows._GetRowY(Y + N) - $hRows._GetRowY(Y)) + Endif + +End + +Private Function ReadOnly_Read() As Boolean + + Return $bReadOnly + +End + +Private Sub ReadOnly_Write(Value As Boolean) + + If Me.DiffMode And Not Value Then Return + $bReadOnly = Value + $hTimerCursor.Enabled = Not Value + $hView.Mouse = If($bReadOnly, Mouse.Default, Mouse.Text) + +End + +Private Function Highlight_Read() As String + + Return $hDoc.Highlight + +End + +Private Sub Highlight_Write(Value As String) + + $hDoc.Highlight = Value + If $bShowPreview Then $hSideBarViewer.Highlight = Value + +End + +Private Function LineNumberOffset_Read() As Integer + + Return $iLineNumberOffset + +End + +Private Sub LineNumberOffset_Write(Value As Integer) + + $iLineNumberOffset = Value + UpdateMargin + Refresh + +End + +Private Function TabSize_Read() As Integer + + Return $iTabSize + +End + +Private Sub TabSize_Write(Value As Integer) + + $iTabSize = Max(1, Value) + CalcSizes + +End + +Private Sub GetSelection(ByRef X1 As Integer, ByRef Y1 As Integer, ByRef X2 As Integer, ByRef Y2 As Integer) + + X1 = $X + Y1 = $Y + X2 = $SX + Y2 = $SY + + If Y1 > Y2 Then + Swap X1, X2 + Swap Y1, Y2 + Endif + + If X1 > X2 Then + Swap X1, X2 + Endif + +End + +Private Sub GetTab(Optional X As Integer) As String + + If $bTabIndent Then + Return "\t" + Else + Return Space$($iTabSize - X Mod $iTabSize) + Endif + +End + + + +Private Sub DoIndent(bBack As Boolean) + + Dim X1, Y1, X2, Y2 As Integer + Dim Y As Integer + Dim iInd As Integer + Dim sTab As String + Dim I As Integer + + If Not HasSelection() Then + + If Not bBack Then + Insert(GetTab($X)) + Return + Endif + + Goto(0, $Y) + Goto(-1, $Y, True) + + Endif + + GetSelection(ByRef X1, ByRef Y1, ByRef X2, ByRef Y2) + If X2 = 0 Then Dec Y2 + + iInd = 1024 + For Y = Y1 To Y2 + I = GetLineIndent(Y, True) + If I >= 0 Then iInd = Min(iInd, I) + If iInd = 0 Then Break + Next + + If bBack And iInd = 0 Then Return + + $hDoc.Begin + + If Not bBack Then + + sTab = GetTab(iInd) + + For Y = Y1 To Y2 + Goto(0, Y) + Insert(sTab) + Next + + Else + + If $bTabIndent Then + sTab = "\t" + Else + sTab = Space$(Min(iInd, $iTabSize)) + Endif + + For Y = Y1 To Y2 + If $hDoc.Lines[Y] Begins sTab Then Remove(0, Y, Len(sTab), Y) + Next + + Endif + + Goto(0, Y1) + Goto(0, Y2 + 1, True) + + $hDoc.End + +End + +Public Sub Begin() + + $hDoc.Begin + +End + +Public Sub End() + + $hDoc.End + +End + +Private Function Length_Read() As Integer + + Return $hDoc.Length + +End + +Private Function Border_Read() As Boolean + + Return $hVPanel.Border <> Border.None + +End + +Private Sub Border_Write(Value As Boolean) + + $hVPanel.Border = If(Value, Border.Plain, Border.None) + +End + +Private Function ScrollBar_Read() As Integer + + Return $iScrollBar '$hView.ScrollBar + +End + +Private Sub ScrollBar_Write(Value As Integer) + + $iScrollBar = Value + Select Case $iScrollBar + + Case Scroll.None, Scroll.Horizontal + $hView.ScrollBar = $iScrollBar + If $bShowPreview Then $hSideBar.Hide + Case Scroll.Vertical + If $bShowPreview Then + $hView.ScrollBar = Scroll.None + $hSideBar.Show + Else + $hView.ScrollBar = $iScrollBar + Endif + Case Scroll.Both + If $bShowPreview Then + $hView.ScrollBar = Scroll.Horizontal + $hSideBar.Show + Else + $hView.ScrollBar = $iScrollBar + Endif + + End Select + +End + +Public Sub _ClearCachePos(Optional Y As Integer = -1) + + If Y >= 0 Then + Try $cCachePos.Remove(Y) + Else + $cCachePos.Clear + Endif + +End + +Public Sub _ResizeContents() + + If $bNoResizeContents Then Return + + If $iWidth < $hView.ScrollWidth Then + _UpdateAllHeight + Else If $iWidth > $hView.ScrollWidth And If HasWidthLayout() Then + _UpdateAllHeight + Endif + + ClearCacheLine + $hView.ResizeContents($iWidth, $hRows._GetHeight()) + +End + +Public Sub View_Draw() + + Dim I As Integer + Dim XO, YO, XX, YY, X, Y, H As Integer + Dim iRow, iRow2 As Integer + Dim hClip As Rect + Dim hRect As Rect + Dim aRow As Integer[] + Dim iMaxRow As Integer + Dim W, NL As Integer + 'Dim hImage As Image + Dim hPict As Picture + Dim iCount As Integer + Dim YR As Integer + Dim HR As Integer + + If Not $bUpdateHeightAllowed Then + $bUpdateHeightAllowed = True + _UpdateAllHeight(True) + Endif + + If $bStyleChanged Then + $iBackground = $hStyles[Highlight.Background].Color + $iForeground = $hStyles[Highlight.Normal].Color + $iSelectedBackground = $hStyles[Highlight.Selection].Color + $iLimitColor = Color.Gradient($iBackground, $hStyles[Highlight.Comment].Color) + $iIndentColor = Color.SetAlpha($iLimitColor, 160) + $iMatchColor = $hStyles[Highlight.Highlight].Color + '$iIndentColor = Color.Gradient($iBackground, $iForeground) + $iMarginColor = Color.SetAlpha($iForeground, 192) + CalcBoldWidth + $bStyleChanged = False + Endif + + 'Debug Me.Font.ToString();; Draw.Font.ToString() + + iCount = $hDoc.Count + NL = $hView.ClientH \ $hRows.H + 1 + + hClip = Paint.ClipRect + If iCount < NL Then Paint.FillRect(hClip.X, hClip.Y, hClip.W, hClip.H, $iBackground) + + iRow = $hRows._FindRowFromPos($hView.ScrollY + hClip.Y) + iRow2 = $hRows._FindRowFromPos($hView.ScrollY + hClip.Y + hClip.H - 1) + If iRow2 = CDocument.ROW_NOT_FOUND Then iRow2 = $hRows.Count - 1 + + XO = -$hView.ScrollX + XX = XO + YO = -$hView.ScrollY + YY = YO + $hRows._GetRowY(iRow) + + hClip = Paint.ClipRect + + Y = YY + If System.RightToLeft Then + X = $hView.ClientW + Else + X = 0 + Endif + + ' Cells + + hRect = New Rect($hView.ClientX - $hView.Proxy.X, $hView.ClientY, $hView.ClientW, $hView.ClientH) + hClip = hClip.Intersection(hRect) + If Not hClip Then Return + + iRow = _RealToView(iRow) + iRow2 = _RealToView(iRow2) + + iMaxRow = iRow2 - iRow + aRow = New Integer[iMaxRow + 1] + For I = 0 To iMaxRow + aRow[I] = _ViewToReal(iRow + I) + Next + + Y = YY + For I = 0 To iMaxRow + iRow = aRow[I] + If iRow >= iCount Then Break + + H = $hRows._GetRowHeight(iRow) + + If $bShowCurrent And If iRow = $Y Then + YR = Y + HR = H + Endif + + If H >= $hView.ClientH Or If $bRemoteDisplay Then + Paint.Save + DrawLine(XX, Y, $iWidth, H, iRow) ',Y) + Paint.Restore + Else + hPict = $cCacheLine[iRow] + If Not hPict Then + hPict = New Picture($iWidth, H) + hPict.Fill($iBackground) + Paint.Begin(hPict) + Paint.Font = $hFont + DrawLine(0, 0, $iWidth, H, iRow) ', Y) + Paint.End + $cCacheLine[iRow] = hPict + $iCacheLineH += H + Paint.DrawPicture(hPict, XX, Y) + + While $iCacheLineH > $hView.ClientH + For Each hPict In $cCacheLine + $iCacheLineH -= hPict.H + $cCacheLine.Remove($cCacheLine.Key) + Break + Next + Wend + + Else + Paint.DrawPicture(hPict, XX, Y) + Endif + Endif + Y += H + Next + + W = $MW + W -= $iWidthModified + 'If W > 0 Then Paint.FillRect(XX + $hView.ScrollX, hClip.Y, W, hClip.H, $iMarginColor) + + If $MW Then + + Paint.Font = $hFontNumber + + Y = YY + For I = 0 To iMaxRow + + iRow = aRow[I] + + If iRow < 0 Then + Y += $hRows._GetRowHeight(iRow) + Continue + Endif + + If iRow >= iCount Then Break + + Paint.Save + H = $hRows._GetRowHeight(iRow) + DrawMargin(XX, Y, $iWidth, H, iRow) + Paint.Restore + + Y += H + + Next + + Paint.FillRect(XX + $hView.ScrollX + W - 1, hClip.Y, 1, hClip.H, $iMarginColor) + + Endif + + If HR Then + XX += $MW - $iWidthModified + Paint.FillRect(XX, YR, $iWidth, 1, $iMarginColor) + Paint.FillRect(XX, YR + HR - 1, $iWidth, 1, $iMarginColor) + Endif + + $hTimerCacheLine.Stop + $hTimerCacheLine.Start + + 'PrintCache + +End + +Public Sub View_Resize() + + UpdateWidth + +End + +Private Function ShowLimit_Read() As Boolean + + Return $bShowLimit + +End + +Private Sub ShowLimit_Write(Value As Boolean) + + $bShowLimit = Value + Refresh + +End + +Private Function ShowCurrent_Read() As Boolean + + Return $bShowCurrent + +End + +Private Sub ShowCurrent_Write(Value As Boolean) + + $bShowCurrent = Value + Refresh + +End + +Private Function ShowLineNumber_Read() As Boolean + + Return $bShowLineNumber + +End + +Private Sub ShowLineNumber_Write(Value As Boolean) + + $bShowLineNumber = Value + UpdateMargin + Refresh + +End + +Private Function ShowModified_Read() As Boolean + + Return $bShowModified + +End + +Private Sub ShowModified_Write(Value As Boolean) + + $bShowModified = Value + Refresh + +End + +Public Sub _get(({Line}) As Integer) As _TextEditor_Line + + Dim hLine As _TextEditor_Line + + hLine = New _TextEditor_Line + Object.Attach(hLine, Me, "Line") + hLine._Line = {Line} + Return hLine + +End + +Private Function Count_Read() As Integer + + Try Return $hDoc.Count + +End + +Public Sub View_Scroll() + + If $hView.ScrollX <> $iLastScrollX Then + ClearCacheLine + $iLastScrollX = $hView.ScrollX + Endif + If $bShowPreview Then $hSideBar.Refresh + Raise Scroll + +End + +Public Sub _RaiseChange() + + If $hTimerChange Then Return + $hTimerChange = New Timer As "TimerChange" + RefreshSideBar + $hTimerChange.Trigger + +End + +Public Sub TimerChange_Timer() + + If Not $hTimerChange Then Return + $hTimerChange = Null + Raise Change + +End + +Private Function ShowPosition_Read() As Boolean + + Return $bShowPosition + +End + +Private Sub UpdatePosition() + + Dim sText As String + + If $hLabel And If $hLabel.Visible Then + + If $bOverwrite Then sText &= " Overwrite" + sText &= " " & CStr($X + 1) & " : " & CStr($Y + 1) + $hLabel.Text = " " & Trim(sText) & " " + $hLabelFrame.Move($hView.ClientW - $hLabel.W, $hView.ClientH - $hLabel.H, $hLabel.W, $hLabel.H) + $hLabel.Move(0, 0) + + Endif + +End + +Private Sub ShowPosition_Write(Value As Boolean) + + Dim hSave As Container + + $bShowPosition = Value + If $bShowPosition Then + If Not $hLabel Then + hSave = $hView._Container + $hView._Container = Null + $hLabelFrame = New Panel($hView) + $hView._Container = hSave + $hLabelFrame.Background = Color.SetAlpha($hStyles[Highlight.Background].Color, 64) + $hLabelFrame.Ignore = True + $hLabel = New Label($hLabelFrame) ' TODO: NULL + gb.gtk => crash! + $hLabel.AutoResize = True + $hLabel.Font = Font[Me.Parent.Font.ToString()] ' TODO: Setting font directly sets nothing + $hLabel.Foreground = $hStyles[Highlight.Normal].Color + $hLabel.Show + Endif + UpdatePosition + Else + If $hLabel Then + $hLabelFrame.Delete + $hLabel = Null + $hLabelFrame = Null + Endif + Endif + +End + +Public Sub View_Arrange() + + UpdatePosition + If $cLineLayout Then UpdateWidth + +End + +Private Function Overwrite_Read() As Boolean + + Return $bOverwrite + +End + +Private Sub Overwrite_Write(Value As Boolean) + + $bOverwrite = Value + UpdatePosition + _RefreshLine($Y) + +End + +Private Function ShowIcon_Read() As Boolean + + Return $bShowIcon + +End + +Private Sub ShowIcon_Write(Value As Boolean) + + $bShowIcon = Value + UpdateMargin + Refresh + +End + +Private Function LineHeight_Read() As Integer + + Return $LH + +End + +Private Function Font_Read() As Font + + Return $hView.Font + +End + +Private Sub Font_Write(Value As Font) + + $hView.Font = Value + +End + +Private Function Current_Read() As _TextEditor_Line + + Return _get($Y) + +End + +Private Function StopLine_Read() As Integer + + Return $iStopLine + +End + +Private Sub StopLine_Write(Value As Integer) + + $iStopLine = Value + Refresh + +End + +Private Function EndOfLine_Read() As Integer + + Return $hDoc.EndOfLine + +End + +Private Sub EndOfLine_Write(Value As Integer) + + $hDoc.EndOfLine = Value + +End + +Private Function Breakpoints_Read() As Integer[] + + Return $hDoc.Breakpoints + +End + +Private Sub Breakpoints_Write(Value As Integer[]) + + $hDoc.Breakpoints = Value + +End + +Private Function Bookmarks_Read() As Integer[] + + Return $hDoc.Bookmarks + +End + +Private Sub Bookmarks_Write(Value As Integer[]) + + $hDoc.Bookmarks = Value + +End + +Public Sub Select(Column As Integer, ({Line}) As Integer, Column2 As Integer, Line2 As Integer) + + Goto(Column, {Line}) + Goto(Column2, {Line2}, True) + +End + +Private Function ShowBraces_Read() As Boolean + + Return $bShowBraces + +End + +Private Sub ShowBraces_Write(Value As Boolean) + + $bShowBraces = Value + CheckMatch + Refresh + +End + +Private Function Styles_Read() As _TextEditor_Styles + + Return $hStyles + +End + +Public Sub FindPreviousLimit(Y As Integer) As Integer + + Do + Dec Y + If Y < 0 Then Return -1 + If $hDoc.Info(Y).Limit Then Return Y + Loop + +End + +Public Sub FindNextLimit(Y As Integer) As Integer + + Do + Inc Y + If Y > $hDoc.Max Then Return -1 + If $hDoc.Info(Y).Limit Then Return Y + Loop + +End + +Private Function View_Read() As TextEditor + + Return Object.Parent($hDoc) + +End + +Private Sub View_Write(Value As TextEditor) + + Me.View._RemoveView(Me) + + If Value Then + Value._AddView(Me) + GotoCenter(Value.Column, Value.Line) + Endif + +End + +Public Sub _GetDocument() As CDocument + + Return $hDoc + +End + +Public Sub _SetDocument(hDoc As CDocument) + + If hDoc Then + If hDoc = $hDoc Then Return + $hDoc = hDoc + Else + $hDoc = New CDocument + Object.Attach($hDoc, Me, "Document") + Endif + Init + If $hDoc.DiffMode Then _EnterDiffMode + +End + +Public Sub _AddView(hOther As TextEditor) + + If hOther = Me Then Return + + If Not _Views Then _Views = New TextEditor[] + _Views.Add(hOther) + + hOther._SetDocument($hDoc) + +End + +Public Sub _RemoveView(hOther As TextEditor) + + If Not _Views Then Return + Try _Views.Remove(_Views.FindByRef(hOther)) + If _Views.Count = 0 Then _Views = Null + +End + +Public Sub View_GotFocus() + + $hTimerCursor.Start + + If Not $bFirstFocus Then + $bFirstFocus = True + EnsureVisible(True) + Endif + + If Object.Parent($hDoc) <> Me Then + + _Views = Me.View._Views + _RemoveView(Me) + _AddView(Me.View) + Me.View._Views = Null + Object.Attach($hDoc, Me, "Document") + + Endif + +End + +Public Sub View_LostFocus() + + $hTimerCursor.Stop + $hDoc.HighlightFrom($Y) + $hTimerCacheLine.Trigger + +End + +Public Sub _GetViews() As TextEditor[] + + Dim aView As New TextEditor[] + Dim hView As TextEditor + + If Object.IsValid(Me) Then aView.Add(Me) + + If _Views Then + For Each hView In _Views + If Object.IsValid(hView) Then aView.Add(hView) + Next + Endif + + Return aView + +End + +Public Sub ToPosX(Optional Column As Integer = $X, ({Line}) As Integer = $Y) As Integer + + Return LinePos({Line}, Column).X - $hView.ScrollX + $MW + +End + +Public Sub ToPosY(Optional ({Line}) As Integer = $Y) As Integer + + Return $hRows._GetRowY({Line}) - $hView.ScrollY + +End + +Public Sub ToPos(Optional ({Line}) As Integer, Column As Integer) As Point + + Dim hPoint As Point + + If IsMissing({Line}) Then + {Line} = $Y + If IsMissing(Column) Then Column = $X + Endif + + hPoint = LinePos({Line}, Column).Copy() + hPoint.X += $MW - $hView.ScrollX + hPoint.Y += $hRows._GetRowY({Line}) - $hView.ScrollY + Return hPoint + +End + +Public Sub CursorAt(Optional ({Line}) As Integer, Column As Integer) As Point + + If IsMissing({Line}) Then + {Line} = $Y + If IsMissing(Column) Then Column = $X + Endif + + Return ToPos({Line}, Column) + +End + +Public Sub ToColumn(X As Integer, Y As Integer) As Integer + + Dim L As Integer + Dim RY As Integer + + L = PosToLine(Y) + RY = $hRows.RelativeY + + If L < 0 Then Return L + Return PosToColumn(L, X, RY) + +End + +Public Sub ToLine(Y As Integer) As Integer + + Return PosToLine(Y) + +End + +Private Sub GotoXY(X As Integer, Y As Integer, bMark As Boolean) As Boolean + + Dim L As Integer + Dim RY As Integer + Dim X0 As Integer + + L = PosToLine(Y) + If L < 0 Then Return True + + RY = $hRows.RelativeY + X0 = $X0 + Goto(PosToColumn(L, X, RY), L, bMark) + $X0 = X0 + +End + +Public Sub Indent() + + DoIndent(False) + +End + +Public Sub Unindent() + + DoIndent(True) + +End + +Private Function Keywords_Read() As String[] + + Return $hDoc.Keywords + +End + +Public Sub Undo() + + $hDoc.Undo + +End + +Public Sub Redo() + + $hDoc.Redo + +End + +Public Sub UpperCase() + + Dim X As Integer + Dim Y As Integer + + If Not HasSelection() Then Return + + X = $SX + Y = $SY + Insert(String.UCase($hDoc.GetText($X, $Y, $SX, $SY))) + Goto($SX, $SY) + Goto(X, Y, True) + +End + +Public Sub LowerCase() + + Dim X As Integer + Dim Y As Integer + + If Not HasSelection() Then Return + + X = $SX + Y = $SY + Insert(String.LCase($hDoc.GetText($X, $Y, $SX, $SY))) + Goto($SX, $SY) + Goto(X, Y, True) + +End + +Private Sub PrintNewLine() + + 'Dim X As Integer = $X + Goto(-1, $Y) + Insert("\n") + 'If $bTerminal Then Goto(X, $Y) + +End + +' static void print_text(void *_object, const char *str, int lstr, bool esc = false) +' { +' QString s = QString::fromUtf8(str, lstr); +' int line, col; +' uint i, len; +' +' //fprintf(stderr, "-> %.*s\n", lstr, str); +' +' WIDGET->getCursor(&line, &col); +' /*if (col == 0) +' { +' DOC->remove(line, 0, line, DOC->lineLength(line)); +' WIDGET->cursorGoto(line, 0, false); +' }*/ +' +' // if (col < DOC->lineLength(line)) +' // { +' // end = col + s.length(); +' // if (end > DOC->lineLength(line)) +' // end = DOC->lineLength(line); +' // DOC->remove(line, col, line, end); +' // } +' +' if (!esc) +' { +' i = 0; +' for (;;) +' { +' if (col == MAX_CONSOLE_WIDTH) +' { +' print_newline(THIS); +' col = 0; +' } +' len = s.length() - i; +' if ((col + len) >= MAX_CONSOLE_WIDTH) +' len = MAX_CONSOLE_WIDTH - col; +' DOC->remove(WIDGET->getLine(), col, WIDGET->getLine(), col + len); +' WIDGET->insert(s.mid(i, len)); +' i += len; +' if (i >= (uint)s.length()) +' break; +' col += len; +' } +' } +' else +' { +' if (col >= MAX_CONSOLE_WIDTH) +' print_newline(THIS); +' DOC->remove(WIDGET->getLine(), col, WIDGET->getLine(), col + s.length()); +' WIDGET->insert(s); +' } +' +' //qApp->processEvents(QEventLoop::ExcludeUserInputEvents, 0); +' //BREAKPOINT(); +' } +' +' static int ansi_read_integer(const char *str, int len, int def, int *pos) +' { +' int value = 0; +' int n = 0; +' uchar c; +' +' str += *pos; +' len -= *pos; +' +' while (len > 0) +' { +' c = str[n]; +' if (c < '0' || c > '9') +' break; +' value = value * 10 + c - '0'; +' len--; +' n++; +' if (n > 6) +' { +' value = -1; +' break; +' } +' } +' +' if (n == 0) +' value = def; +' +' while (len > 0) +' { +' c = str[n]; +' len--; +' n++; +' if (c == ';' || c < '0' || c > '9') +' break; +' } +' +' *pos += n; +' return value; +' } +' + +' Private Sub PrintAnsi(Text As String, I As Integer) As Integer +' +' Dim C As String +' Dim L As Integer +' +' If I > Len(Text) Then Return 0 +' +' C = Mid$(Text, I, 1) +' If InStr("[]()", C) Then +' For L = I + 1 To Len(Text) +' If IsLetter(Mid$(Text, L, 1)) Then Break +' Next +' L -= I +' Endif +' +' End + +' static int ansi_process(void *_object, const char *str, int len) +' { +' uchar c; +' int n, m, l, pos; +' bool print; +' +' if (len == 0) +' return 0; +' +' c = *str; +' if (c == '[' || c == ']' || c == '(' || c == ')') +' { +' for (l = 0; l < len; l++) +' { +' c = str[l]; +' if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) +' break; +' } +' } +' else +' l = 0; +' +' if (l >= len) +' return 0; +' +' print = false; +' +' if (*str == '[') +' { +' pos = 1; +' +' switch(str[l]) +' { +' case 'A': +' n = ansi_read_integer(str, l, 1, &pos); +' if (n > 0) WIDGET->cursorRelGoto(-n, 0, false); +' break; +' +' case 'B': +' n = ansi_read_integer(str, l, 1, &pos); +' if (n > 0) WIDGET->cursorRelGoto(n, 0, false); +' break; +' +' case 'C': +' n = ansi_read_integer(str, l, 1, &pos); +' if (n > 0) WIDGET->cursorRelGoto(0, n, false); +' break; +' +' case 'D': +' n = ansi_read_integer(str, l, 1, &pos); +' if (n > 0) WIDGET->cursorRelGoto(0, -n, false); +' break; +' +' case 'G': +' n = ansi_read_integer(str, l, 1, &pos); +' if (n > 0) WIDGET->cursorGoto(WIDGET->getLine(), n - 1, false); +' break; +' +' case 'd': +' n = ansi_read_integer(str, l, 1, &pos); +' if (n > 0) WIDGET->cursorGoto(n - 1, WIDGET->getColumn(), false); +' break; +' +' case 'H': case 'f': +' n = ansi_read_integer(str, l, 1, &pos); +' m = ansi_read_integer(str, l, 1, &pos); +' +' while (DOC->numLines() < n) +' DOC->insertLine(DOC->numLines()); +' +' WIDGET->cursorGoto(n - 1, m - 1, false); +' THIS->terminal = TRUE; +' //qApp->processEvents(QEventLoop::ExcludeUserInputEvents, 0); +' break; +' +' case 'J': +' n = ansi_read_integer(str, l, 1, &pos); +' switch(n) +' { +' case 0: WIDGET->clearDocument(false, true); break; +' case 1: WIDGET->clearDocument(true, false); break; +' case 2: WIDGET->clearDocument(true, true); break; +' } +' +' case 'K': +' n = ansi_read_integer(str, l, 0, &pos); +' switch (n) +' { +' case 0: WIDGET->clearLine(false, true); break; +' case 1: WIDGET->clearLine(true, false); break; +' case 2: WIDGET->clearLine(true, true); break; +' } +' break; +' +' case 's': +' WIDGET->saveCursor(); +' break; +' +' case 'u': +' WIDGET->restoreCursor(); +' break; +' +' case 'X': +' n = ansi_read_integer(str, l, 1, &pos); +' WIDGET->clearAfter(n); +' break; +' +' default: +' print = FALSE; +' } +' } +' +' if (print) +' { +' fprintf(stderr, "ESC "); +' for (n = 0; n <= l; n++) +' { +' uchar c = str[n]; +' +' if (c < 32) +' fprintf(stderr, "\\x%02X", c); +' else +' fputc(c, stderr); +' } +' fputc('\n', stderr); +' +' //qApp->processEvents(QEventLoop::ExcludeUserInputEvents, 0); +' //BREAKPOINT(); +' } +' +' return l; +' } +' + +Private Sub PrintAnsi(Text As String, I As Integer) As Integer + + Dim C As String + Dim N As Integer + Dim aParam As New Integer[] + Dim bDigit As Boolean + + C = Mid$(Text, I, 1) + + If C = "[" Then ' [ + + N = 1 + Inc I + While I <= Len(Text) + Inc N + C = Mid$(Text, I, 1) + If IsDigit(C) Then + If Not bDigit Then + aParam.Add(0) + bDigit = True + Endif + aParam[aParam.Max] = aParam[aParam.Max] * 10 + Asc(C) - 48 + Else If C = ";" Then + bDigit = False + Else + Break + Endif + Inc I + Wend + + If I > Len(Text) Then + $sPrintBuffer = Chr$(27) & Mid$(Text, I, N) + Return N + Endif + + Select Case C + + Case "A" + If aParam.Count Then + RelGoto(0, -aParam[0]) + Else + RelGoto(0, -1) + Endif + + Case "B" + If aParam.Count Then + RelGoto(0, aParam[0]) + Else + RelGoto(0, 1) + Endif + + Case "C" + If aParam.Count Then + RelGoto(aParam[0], 0) + Else + RelGoto(1, 0) + Endif + + Case "D" + If aParam.Count Then + RelGoto(-aParam[0], 0) + Else + RelGoto(-1, 0) + Endif + + Case "K" + aParam.Resize(1) + Select Case aParam[0] + Case 0 + ClearLine(False, True) + Case 1 + ClearLine(True, False) + Case 2 + ClearLine(True, True) + End Select + + End Select + + Endif + + Return N + +End + +Public Sub Print(Text As String) + + Dim I, J, C As Integer + Dim bSaveOverwrite As Boolean + + $hDoc.DisableUndo + bSaveOverwrite = $bOverwrite + $bOverwrite = True + $bPrint = True + + If $sPrintBuffer Then + Text = $sPrintBuffer & Text + $sPrintBuffer = "" + Endif + + J = 1 + For I = 1 To Len(Text) + + C = Asc(Text, I) + + If C < 32 Then + + If I > J Then Insert(Mid$(Text, J, I - J)) + + J = I + 1 + + If C = 9 Then + Insert("\t") + Else If C = 13 Then + Goto(0, $Y) + Else If C = 10 Then + PrintNewLine + Else If C = 12 Then + Clear + Else If C = 7 Then + ' Flash + Else If C = 8 Then + If $X > 0 Then Goto($X - 1, $Y) + Else If C = 27 Then + I += PrintAnsi(Text, I + 1) + J = I + 1 + Else + Insert("^" & Chr$(64 + C)) + Endif + + Endif + + Next + + If I > J Then Insert(Mid$(Text, J, I - J)) + + $bOverwrite = bSaveOverwrite + $bPrint = False + $hDoc.EnableUndo + +End + +' else if (c == 27) +' { +' i++; +' i += ansi_process(THIS, &str[i], len - i); +' j = i + 1; +' i--; +' } +' else +' { +' QString tmp; +' tmp.sprintf("^%c", c + 64); +' print_text(THIS, tmp, 2, true); +' } +' } +' } +' +' if (i > j) +' print_text(THIS, &str[j], i - j); +' +' DOC->end(); +' +' END_METHOD +' + +Public Sub FindPreviousString(Search As String, Start As Integer) As Integer + + If IsAscii(Search) Then + Do + If Start < 0 Then Return -1 + If InStr($hDoc.Lines[Start], Search, 1, gb.IgnoreCase) Then Return Start + Dec Start + Loop + Else + Do + If Start < 0 Then Return -1 + If String.InStr($hDoc.Lines[Start], Search, 1, gb.IgnoreCase) Then Return Start + Dec Start + Loop + Endif + +End + +Public Sub FindNextString(Search As String, Start As Integer) As Integer + + If IsAscii(Search) Then + Do + If Start >= $hDoc.Count Then Return -1 + If InStr($hDoc.Lines[Start], Search, 1, gb.IgnoreCase) Then Return Start + Inc Start + Loop + Else + Do + If Start >= $hDoc.Count Then Return -1 + If String.InStr($hDoc.Lines[Start], Search, 1, gb.IgnoreCase) Then Return Start + Inc Start + Loop + Endif + +End + +Private Function ScrollX_Read() As Integer + + Return $hView.ScrollX + +End + +Private Sub ScrollX_Write(Value As Integer) + + $hView.ScrollX = Value + +End + +Private Function ScrollY_Read() As Integer + + Return $hView.ScrollY + +End + +Private Sub ScrollY_Write(Value As Integer) + + $hView.ScrollY = Value + +End + +Private Function ScrollWidth_Read() As Integer + + Return $hView.ScrollWidth + +End + +Private Function ScrollHeight_Read() As Integer + + Return $hView.ScrollHeight + +End + +Public Sub Scroll(X As Integer, Y As Integer) + + $hView.Scroll(X, Y) + +End + +Private Function ShowCursor_Read() As Boolean + + Return Not $bHideCursor + +End + +Private Sub ShowCursor_Write(Value As Boolean) + + $bHideCursor = Not Value + Refresh + +End + +Public Sub Cut() + + If Not HasSelection() Then + Goto(0, $Y) + If $Y < $hDoc.Max Then + Goto(0, $Y + 1, True) + Else + Goto(-1, $Y, True) + Endif + Endif + Copy() + DeleteSelection() + +End + +Public Sub Refresh() + + ClearCacheLine + $hView.Refresh + RefreshSideBar + +End + +Public Sub Reset() + + $hTimerChange = Null + $hDoc.Reset + +End + +Public Sub _RaiseHighlight(sText As String) + + Raise Highlight(sText) + +End + +Public Sub _ViewToReal(Y As Integer) As Integer + + Dim I As Integer + Dim M As Integer + Dim J As Integer + Dim YO As Integer + + If Y <= 0 Then Return Y + + YO = Y + + If $aFold Then + + Try Y = $cCacheView[Y] + If Error Then + + M = $hDoc.Max + + For I = 0 To $aFold.Max Step 2 + If Y <= $aFold[I] Then Break + J = I + 1 + If $aFold[J] < M Then + Y += $aFold[J] - $aFold[I] + Else + Y = M + 1 + Endif + Next + + $cCacheView[YO] = Y + + Endif + + Endif + + Return Y + +End + +Public Sub _RealToView(Y As Integer) As Integer + + Dim I As Integer + Dim YY As Integer + Dim J As Integer + Dim YO As Integer + + If Y <= 0 Then Return Y + + YO = Y + + If $aFold Then + + Try Y = $cCacheView[-Y] + If Error Then + + YY = Y + + For I = 0 To $aFold.Max Step 2 + If Y < $aFold[I] Then Continue + J = I + 1 + If Y <= $aFold[J] Then + YY -= Y - $aFold[I] + Else + YY -= $aFold[J] - $aFold[I] + Endif + Next + + Y = YY + $cCacheView[-YO] = Y + + Endif + + Endif + + Return Y + +End + +' int GEditor::realToView(int row) const +' { +' uint i; +' GFoldedProc *fp; +' int y; +' +' //fprintf(stderr, "realToView: %d -> ", row); +' +' y = row; +' +' for (i = 0; i < fold.count(); i++) +' { +' fp = fold.at(i); +' if (row < fp->start) +' continue; +' if (row <= fp->end) +' y -= row - fp->start; +' else +' y -= fp->end - fp->start; +' } +' +' //fprintf(stderr, "%d\n", y); +' +' return y; +' } +' + +Private Sub UpdateCount() + + Dim Y As Integer + 'Dim X As Integer + + _ClearCachePos + $hRows.Count = _RealToView($hDoc.Max) + 1 + + Y = _ViewToReal(_RealToView($Y)) + 'X = NormalizeColumn($X, Y) + Goto($X, Y) + + $hView.Refresh + RefreshSideBar + +End + +Public Sub _CheckRowWithFolding(Y As Integer) As Integer + + Dim NY As Integer + Dim I As Integer + + If Not $aFold Then Return Y + + NY = Y + For I = 0 To $aFold.Max Step 2 + If Y > $aFold[I] And If Y <= $aFold[I + 1] Then + NY = $aFold[I] + Break + Endif + Next + + Return NY + + ' int GEditor::checkCursor(int y) + ' { + ' uint i; + ' GFoldedProc *fp; + ' int ny; + ' + ' ny = y; + ' for (i = 0; i < fold.count(); i++) + ' { + ' fp = fold.at(i); + ' if (y > fp->start && y <= fp->end) + ' { + ' ny = fp->start; + ' break; + ' } + ' } + ' + ' return ny; + ' } + ' + +End + +Public Sub _CollapseRow(Y As Integer, Optional bNoRefresh As Boolean) + + Dim iStart As Integer + Dim iEnd As Integer + Dim iPos As Integer + Dim I As Integer + Dim NY As Integer + + If Not $hDoc.Info(Y).Limit Then + Y = FindPreviousLimit(Y) + Endif + + If Y < 0 Or If Y >= $hDoc.Count Then Return + + iStart = Y + iEnd = FindNextLimit(iStart) + If iEnd < 0 Then + iEnd = $hDoc.Max + Else + Dec iEnd + Endif + + iPos = -1 + + If Not $aFold Then $aFold = New Integer[] + + For I = 0 To $aFold.Max Step 2 + If iEnd >= $aFold[I] And If iStart <= $aFold[I + 1] Then Return + If iPos < 0 And If iStart < $aFold[I] Then + iPos = I + Endif + Next + + If iPos < 0 Then + $aFold.Add(iStart) + $aFold.Add(iEnd) + Else + $aFold.Add(iStart, iPos) + $aFold.Add(iEnd, iPos + 1) + Endif + + NY = _CheckRowWithFolding(Y) + If NY <> Y Then Goto($X, NY) + + If Not bNoRefresh Then + $cCacheView.Clear + UpdateCount + Endif + +End + +Public Sub _ExpandRow(Y As Integer) + + Dim I As Integer + + For I = 0 To $aFold.Max Step 2 + If Y >= $aFold[I] And If Y <= $aFold[I + 1] Then + $aFold.Remove(I, 2) + $cCacheView.Clear + UpdateCount + Break + Endif + Next + +End + +Private Function ShowExpand_Read() As Boolean + + Return $bShowExpand + +End + +Private Sub ShowExpand_Write(Value As Boolean) + + If Not Value Then ExpandAll + $bShowExpand = Value + UpdateMargin + +End + +Public Sub _IsRowExpanded(Y As Integer) As Boolean + + Dim D As Integer + Dim F As Integer + Dim I As Integer + + If Not $aFold Then Return True + If Y < 0 Then Return True + + D = 0 + F = $aFold.Count + + While F > D + + I = ((F + D) \ 4) * 2 + If $aFold[I] = Y Then Return + If $aFold[I] < Y Then + D = I + 2 + Else + F = I + Endif + + Wend + + Return True + +End + +Fast Public Sub _IsRowVisible(Y As Integer) As Boolean + + Dim D As Integer + Dim F As Integer + Dim I As Integer + + If Not $aFold Then Return True + If Y <= 0 Then Return True + + D = 0 + F = $aFold.Count + + While F > D + + I = ((F + D) \ 4) * 2 + If $aFold[I] = Y Then Return True + If $aFold[I] < Y Then + If Y <= $aFold[I + 1] Then Return False + D = I + 2 + Else + F = I + Endif + + Wend + + Return True + +End + +Public Sub _GetLastVisibleRow() As Integer + + Dim N As Integer + + N = $hDoc.Max + If _IsRowVisible(N) Then Return N + Return $aFold[$aFold.Max - 1] + +End + +Public Sub _IsFirstLineVisible() As Boolean + + Return $hRows._FindRowFromPos($hView.ScrollY) <= 0 + +End + +Private Sub ToggleRow(Y As Integer) + + If _IsRowExpanded(Y) Then + _CollapseRow(Y) + Else + _ExpandRow(Y) + Endif + + RefreshSideBar + +End + +' bool GEditor::isFolded(int row) +' { +' uint i; +' GFoldedProc *fp; +' int d, f; +' +' d = 0; +' f = fold.count(); +' +' while (f > d) +' { +' i = (f + d) / 2; +' fp = fold.at(i); +' if (fp->start == row) +' return true; +' else if (fp->start < row) +' d = i + 1; +' else +' f = i; +' } +' +' return false; +' } +' +' + +Private Sub CheckFolded(Y As Integer) As Integer + + Dim I As Integer + + If Not $aFold Then Return Y + + For I = 0 To $aFold.Max Step 2 + If Y <= $aFold[I + 1] Then + If Y > $aFold[I] Then Return $aFold[I] + Break + Endif + Next + + Return Y + +End + +' int GEditor::checkFolded(int row) +' { +' uint i; +' GFoldedProc *fp; +' +' for (i = 0; i < fold.count(); i++) +' { +' fp = fold.at(i); +' if (row <= fp->end) +' { +' if (row > fp->start) +' return fp->start; +' else +' break; +' } +' } +' +' return row; +' } +' + +Public Sub CollapseAll() + + Dim Y As Integer + + Y = 0 + Do + _CollapseRow(Y, True) + Y = FindNextLimit(Y) + If Y < 0 Then Break + Loop + + $cCacheView.Clear + UpdateCount + EnsureVisible(True) + + RefreshSideBar + +End + +' void GEditor::foldAll() +' { +' int row; +' +' if (getFlag(NoFolding)) +' return; +' +' row = 0; +' for(;;) +' { +' foldLine(row, true); +' row = doc->getNextLimit(row); +' if (row < 0) +' break; +' } +' +' setNumRows(numLines()); +' //updateContents(); +' } +' + +Public Sub ExpandAll() + + $aFold = Null + UpdateCount + $cCacheView.Clear + EnsureVisible(True) + + RefreshSideBar + +End + +' void GEditor::unfoldAll() +' { +' foldClear(); +' setNumRows(numLines()); +' ensureCursorVisible(); +' //redrawContents(); +' } +' +' + +Private Sub _ExpandRemove(Y1 As Integer, Y2 As Integer) + + Dim N As Integer + Dim I As Integer + + If Not $aFold Then Return + + If Y2 <= Y1 Then + _ExpandRow(Y1) + Return + Endif + + N = Y2 - Y1 + + While I < $aFold.Count + If Y2 < $aFold[I] Then + $aFold[I] -= N + $aFold[I + 1] -= N + I += 2 + Else If Y1 > $aFold[I + 1] Then + I += 2 + Else + $aFold.Remove(I, 2) + Endif + Wend + + $cCacheView.Clear + +End + +' void GEditor::foldRemove(int y1, int y2) +' { +' uint i; +' GFoldedProc *fp; +' int n; +' +' if (getFlag(NoFolding)) +' return; +' +' if (y2 < 0) +' { +' unfoldLine(y1); +' return; +' } +' +' n = y2 - y1 + 1; +' +' for (i = 0; i < fold.count(); i++) +' { +' fp = fold.at(i); +' if (y2 < fp->start) +' { +' fp->start -= n; +' fp->end -= n; +' } +' else if (y1 > fp->end) +' continue; +' else +' { +' fold.remove(i); +' i--; +' } +' } +' } +' + +Private Sub _ExpandInsert(Y As Integer, N As Integer) + + Dim I As Integer + + If Not $aFold Then Return + + If N = 0 Then + _ExpandRow(Y) + Return + Endif + + While I < $aFold.Count + If $aFold[I] > Y Then + $aFold[I] += N + $aFold[I + 1] += N + I += 2 + Else If $aFold[I + 1] >= Y Then + '$aFold[I + 1] += N + $aFold.Remove(I, 2) + Else + I += 2 + Endif + Wend + + $cCacheView.Clear + +End +' +' void GEditor::foldInsert(int y, int n) +' { +' uint i; +' GFoldedProc *fp; +' +' if (getFlag(NoFolding)) +' return; +' +' if (n == 0) +' { +' unfoldLine(y); +' return; +' } +' +' for (i = 0; i < fold.count(); i++) +' { +' fp = fold.at(i); +' if (fp->start > y) +' { +' fp->start += n; +' fp->end += n; +' } +' else if (fp->end >= y) +' { +' fp->end += n; +' fold.remove(i); //unfoldLine(fp->start); +' i--; +' } +' } +' } +' + +Private Sub MoveSelection(bUp As Boolean) + + Dim X, Y As Integer + Dim X1, Y1, X2, Y2 As Integer + Dim sText As String + Dim bSelect As Boolean + + X = $X + Y = $Y + + If Not HasSelection() Then + X1 = 0 + Y1 = $Y + If $Y < $hDoc.Max Then + X2 = 0 + Y2 = $Y + 1 + Else + X2 = $hDoc.LineLength[$Y] + Y2 = $Y + Endif + Else + bSelect = True + GetSelection(ByRef X1, ByRef Y1, ByRef X2, ByRef Y2) + X1 = 0 + If X2 > 0 And If Y2 < $hDoc.Max Then + Inc Y2 + X2 = 0 + Endif + Endif + + If bUp Then + If Y1 = 0 Then Return + Else + If Y2 = $hDoc.Max Then Return + Endif + + Goto(X1, Y1) + Goto(X2, Y2, True) + + $hDoc.Begin + + sText = $hDoc.GetText(X1, Y1, X2, Y2) + Remove(X1, Y1, X2, Y2) + If bUp Then + Dec Y1 + Dec Y2 + Else + Inc Y1 + Inc Y2 + Endif + Goto(X1, Y1) + Insert(sText) + + If bSelect Then + Goto(X1, Y1) + Goto(X2, Y2, True) + Else + If bUp Then + Goto(X, Y - 1) + Else + Goto(X, Y + 1) + Endif + Endif + + $hDoc.HighlightFrom($Y) + + $hDoc.End + +End + +Public Sub SaveCursor() + + If $iSaveCursor = 0 Then $aSaveCursor = [$X, $Y, $SX, $SY] + Inc $iSaveCursor + +End + +Public Sub RestoreCursor() + + Dim X, Y, SX, SY As Integer + + Dec $iSaveCursor + If $iSaveCursor Then Return + + X = $aSaveCursor[0] + Y = $aSaveCursor[1] + SX = $aSaveCursor[2] + SY = $aSaveCursor[3] + + Goto(SX, SY) + If X <> SX Or If Y <> SY Then Goto(X, Y, True) + +End + +Private Sub LayoutText(sText As String, iLen As Integer, iWMax As Integer) As Integer[] + + Dim aLayout As Integer[] + Dim S As Integer + Dim L As Integer + Dim D As Integer + Dim F As Integer + Dim P As Integer + Dim W As Integer + + aLayout = New Integer[] + 'iWMax = Max(iWMax, 64) + + S = 1 + L = iLen + + Do + + D = S + F = L + 1 + + While F > D + 1 + + P = (D + F) \ 2 + W = TextWidth(sText, S, P - S + 1) + If W > iWMax Then + F = P + Else + D = P + Endif + + Wend + + If D >= L Then Break + + If String.Code(sText, D) > 32 Then + ' For P = D - 1 DownTo S + ' If InStr(" ,.;:-([])", String.Mid$(sText, P, 1)) Then + ' Inc P + ' Break + ' Endif + ' Next + P = String.RInStr(sText, " ", D - 1) + If P >= S And If Trim(String.Mid(sText, S, P - S + 1)) Then D = P + Endif + + If aLayout.Count = 0 Then iWMax -= GetTextStartPos(sText) + aLayout.Add(D - S + 1) + S = D + 1 + + 'sText = String.Mid$(sText, D + 1) + 'If Not sText Then Break + + Loop + + Return aLayout + +End + +Private Sub LayoutDiff(Y As Integer, WMax As Integer) As Integer + + Dim aText As String[] + Dim aDiffLayout As Integer[][] + Dim sText As String + Dim H As Integer + Dim aLayout As Integer[] + + aText = $hDoc.DiffRemoved[Y] + If aText Then + + aDiffLayout = New Integer[][] + If Wrap_Read() Then + For Each sText In aText + aLayout = LayoutText(sText, String.Len(sText), WMax) + If aLayout.Count = 0 Then + aDiffLayout.Add(Null) + Inc H + Else + aDiffLayout.Add(aLayout) + H += aLayout.Count + 1 + Endif + Next + Else + H = aText.Count + aDiffLayout.Resize(H) + Endif + + If H > 1 Then + $cDiffLayout[Y] = aDiffLayout + Else + $cDiffLayout[Y] = Null + Endif + + Endif + + Return H + +End + + +Public Sub _UpdateLineHeight(Y As Integer) + + Dim aLayout As Integer[] + Dim H As Integer + Dim WMax As Integer + + If Y = 0 Then _TopHeight = 0 + + If Not $cLineLayout And If Not $cDiffLayout Then Return + + H = 1 + WMax = $hView.ClientW - $MW - $LH \ 2 + + If $cLineLayout Then + + aLayout = LayoutText($hDoc.Lines[Y], $hDoc.LineLength[Y], WMax) + + If aLayout.Count >= 1 Then + $cLineLayout[Y] = aLayout + H += aLayout.Count + ' Print " -> [ "; + ' For D = 0 To aLayout.Max + ' Print aLayout[D];; + ' Next + ' Print "]" + Else + $cLineLayout[Y] = Null + 'Print + Endif + + Endif + + If $hDoc.DiffRemoved Then + + H += LayoutDiff(Y, WMax) + If Y = 0 Then _TopHeight = LayoutDiff(-1, WMax) + + Endif + + $hRows._SetRowHeight(Y, H) + If Y = 0 Then $hRows._SetRowHeight(-1, _TopHeight) + + If Y = $Y Then $XY = LinePos($Y, $X) + If Y = $SY Then $SXY = LinePos($Y, $X) + + Try $cCachePos.Remove(Y) + +End + +Public Sub _UpdateAllHeight(Optional bNow As Boolean) + + Dim TY As Integer + + If Not $bUpdateHeightAllowed Then Return + + If Not $cLineLayout And If Not $cDiffLayout Then + + TY = $hRows._GetRowY($Y) - $hView.ScrollY + $hRows.Clear + _ClearCachePos + $XY = LinePos($Y, $X) + $SXY = LinePos($SY, $SX) + $hView.ScrollY = $hRows._GetRowY($Y) - TY + Return + + Endif + + If Not $hTimerHeight Then + $hTimerHeight = New Timer As "TimerHeight" + $hTimerHeight.Delay = 50 + Endif + + If bNow Then + TimerHeight_Timer + Else + $hTimerHeight.Start + Endif + +End + +Public Sub TimerHeight_Timer() + + Dim Y As Integer + Dim CY, TY As Integer + + 'Debug Me.Window.Title;; $iWidth;; $hView.ClientW + + If $hView.Scrolling Then Return + + Y = $hRows._GetRowY($Y) + If Y < $hView.ScrollY Then + TY = 0 + CY = PosToLine(TY) + Else If Y + $LH >= $hView.ScrollY + $hView.ClientH Then + TY = $hView.ClientH + CY = PosToLine(TY) + Else + TY = Y - $hView.ScrollY + CY = $Y + Endif + + If $hDoc.Count >= 10000 Then Inc Application.Busy + + $bNoResizeContents = True + For Y = 0 To $hDoc.Max + _UpdateLineHeight(Y) + Next + $bNoResizeContents = False + _ClearCachePos + _ResizeContents + + $hView.ScrollY = $hRows._GetRowY(CY) - TY + + 'EnsureVisible + $hView.Refresh + + $XY = LinePos($Y, $X) + $SXY = LinePos($SY, $SX) + + If $hTimerHeight Then + $hTimerHeight.Stop + $hTimerHeight = Null + Endif + + If $hDoc.Count >= 10000 Then Dec Application.Busy + +End + +Private Function Wrap_Read() As Boolean + + Return $cLineLayout + +End + +Private Sub Wrap_Write(Value As Boolean) + + If Value Then + If $cLineLayout Then Return + $cLineLayout = New Collection + Else + If Not $cLineLayout Then Return + $cLineLayout = Null + Endif + + _UpdateAllHeight(True) + CalcSizes + EnsureVisible + +End + +' Public Sub Test() +' +' Dim Y As Integer +' Dim RY As Integer +' Dim ORY As Integer = -1 +' +' For Y = 0 To 2500 +' RY = $hRows._GetRowY(Y) +' If _IsRowVisible(Y) Then +' Print Y; ": "; RY / $LH +' 'ORY = RY +' Endif +' Next +' +' End + +Public Sub _GetRowHeight(Y As Integer) As Integer + + Return $hRows._GetRowHeight(Y) + +End + +' Public Sub _Lock() +' +' Inc $iLock +' +' End +' +' Public Sub _Unlock() +' +' Dec $iLock +' If $iLock = 0 Then +' +' Endif +' +' End +' +Public Sub Styles_Change() + + If $bStyleChanged Then Return + + $bStyleChanged = True + ClearCacheText + If $hLabelFrame Then + $hLabelFrame.Background = $hStyles[Highlight.Background].Color + $hLabel.Foreground = $hStyles[Highlight.Normal].Color + Endif + If $bShowPreview Then + $hSideBar.Background = $hStyles[Highlight.Background].Color + SyncSideBarViewerStyles + $hTimerSideBarRefresh.Trigger + Endif + +End + +Private Function ShowSpaces_Read() As Boolean + + Return $bShowSpaces + +End + +Private Sub ShowSpaces_Write(Value As Boolean) + + $bShowSpaces = Value + $hView.Refresh + +End + +Private Function ShowIndent_Read() As Boolean + + Return $bShowIndent + +End + +Private Sub ShowIndent_Write(Value As Boolean) + + $bShowIndent = Value + $hView.Refresh + +End + +' void GEditor::clearLine(bool before, bool after) +' { +' int ox = x; +' +' doc->begin(); +' +' if (before) +' { +' QString ins; +' +' doc->remove(y, 0, y, x + 1); +' ins.fill(' ', ox + 1); +' doc->insert(y, 0, ins); +' x = ox; +' } +' +' if (after) +' { +' doc->remove(y, x, y, doc->lineLength(y) -1); +' } +' +' doc->end(); +' } +' +' + +Private Sub ClearLine(bBefore As Boolean, bAfter As Boolean) + + Dim OX As Integer + + OX = $X + + $hDoc.Begin() + + If bBefore Then + $hDoc.Remove(0, $Y, $X + 1, 0) + $hDoc.Insert(Space$(OX + 1), 0, $Y) + $X = OX + Endif + + If bAfter Then + $hDoc.Remove($X, $Y, $hDoc.LineLength[$Y], $Y) + Endif + + $hDoc.End() + +End + +Private Sub RelGoto(DX As Integer, DY As Integer) + + Goto(Max(0, $X + DX), Max(0, $Y + DY)) + +End + +Public Sub TimerCacheLine_Timer() + + ClearCacheLine + $hTimerCacheLine.Stop + +End + +Private Sub ClearCacheLine() + + If $bRemoteDisplay Then Return + $cCacheLine.Clear + $iCacheLineH = 0 + +End + +Private Sub ClearCacheText() + + If $bRemoteDisplay Then Return + $cCacheText.Clear + +End + +Public Sub _HasFolding() As Boolean + + If $aFold And If $aFold.Count Then Return True + +End + +Private Sub DrawBarImage3() + + Dim aLines As String[] + Dim H, F As Integer + Dim I As Integer + Dim N As Integer + Dim iRow As Integer + Dim aLineLength As Integer[] + Dim iLen As Integer + Dim Y As Integer + Dim X As Integer + Dim sLine As String + Dim sIndent As String + Dim aLinesInfo As CLineInfo[] + Dim hInfo As CLineInfo + Dim iCol As Integer + Dim J As Integer + Dim FX As Float + Dim bModified As Boolean + Dim bSaved As Boolean + Dim iAlpha As Integer + Dim iColComment As Integer + Dim iColNormal As Integer + Dim iColModified As Integer + Dim iColSaved As Integer + + aLines = $hDoc.Lines + aLineLength = $hDoc.LineLength + aLinesInfo = $hDoc.LinesInfo + + N = _RealToView(aLines.Max) + + If N <= Paint.H Then + F = 1 + H = Max(N, CInt(Paint.H / 2)) + Else + F = CInt(N / Paint.H) + H = (N + F - 1) \ F + Endif + + FX = (Paint.w - 4) / 100 'Max(4, Min(8, F)) + + iAlpha = 255 - 128 \ F + iColComment = Color.SetAlpha($hStyles[Highlight.Comment].Color, iAlpha) + iColNormal = Color.SetAlpha($hStyles[Highlight.Normal].Color, iAlpha) + iColModified = Color.SetAlpha(Color.Merge($iBackground, Color.Red, 0.4), 128) + iColSaved = Color.SetAlpha(Color.Merge($iBackground, Color.Green, 0.4), 128) + + $hImageSideBar = New Image(Paint.Width - 1, H, $hStyles[Highlight.Background].Color) + Paint.Begin($hImageSideBar) + + For I = 0 To N Step F + + bModified = False + bSaved = False + + 'Paint.FillRect(0, Y, 4, 1, $iMarginColor) + + For J = I To Min(N, I + F - 1) + + iRow = _ViewToReal(J) + sLine = RTrim(aLines[iRow]) + iLen = Min(String.Len(sLine), 100) + + If sLine Then + + sLine = RTrim(aLines[iRow]) + hInfo = aLinesInfo[iRow] + + X = 0 + + If IsSpace(Left(sLine)) Then + sIndent = GetLineIndentText(iRow) + sIndent = Replace(sIndent, "\t", Space$($iTabSize)) + X = Len(sIndent) + Endif + + If hInfo And If hInfo.Comment Then + iCol = iColComment + Else + iCol = iColNormal + Endif + + Paint.FillRect(X * FX + 5, Y, (iLen - X) * FX, 1, iCol) + + Endif + + If $bShowModified Then + If Not bModified Then + If hInfo Then + If hInfo.Modified Then + bModified = True + Paint.FillRect(0, Y, Paint.W, 1, iColModified) + Else If hInfo.Saved And If Not bSaved Then + bSaved = True + Paint.FillRect(0, Y, Paint.W, 1, iColSaved) + Endif + Endif + Endif + Endif + + Next + + Inc Y + + Next + + Paint.End + +End + +Public Sub SideBar_Draw() + + Dim D As Integer = Desktop.Scale * 2 + Dim NL, Row As Integer + Dim X, Y, W, H As Integer + Dim iBorder As Integer = IIf(System.RightToLeft, 0, 1) + Dim iCount As Integer = $hRows.Max '_RealToView($hDoc.Max) + + NL = $hView.ClientH \ $hRows.H + 1 + Row = _RealToView($hRows._FindRowFromPos($hView.ScrollY)) + $fBarLineHeight = Min(2, Paint.Height / (iCount + 1)) + + Paint.AntiAlias = False + 'Barre Cache + If Not $hImageSideBar Then DrawBarImage3() + Paint.DrawImage($hImageSideBar, iBorder, 0, Paint.W - 1, Paint.H) + + 'Border Line + Paint.FillRect(If(System.RightToLeft, Paint.W - 1, 0), 0, 1, Paint.H, $iLimitColor) + + 'Arrow Buttons + If $iSideBarClick <> SIDEBAR_VIEW And If $hSideBar.Hovered Then + If $hView.ScrollY > 0 Then + Paint.FillRect(iBorder, 0, Paint.W - 1, D, Color.Background) + Style.PaintArrow((Paint.W - D) / 2, 0, D, D, Align.Top) ' If($iSideBarStyle = 1, Style.Hovered, 0)) + Endif + If $hView.ScrollY < $hView.ScrollHeight - $hView.ClientHeight Then + Paint.FillRect(iBorder, Paint.H - D, Paint.W - 1, D, Color.Background) + Style.PaintArrow((Paint.W - D) / 2, Paint.H - D, D, D, Align.Bottom) ', If($iSideBarStyle = 2, Style.Hovered, 0)) + Endif + Endif + + 'ViewPort Rectangle + $hRectSideBar = Rect(iBorder, $fBarLineHeight * Row, Paint.Width - 1, Max($fBarLineHeight * NL, 10)) + Paint.Rectangle(iBorder, $fBarLineHeight * Row, Paint.Width - 1, $hRectSideBar.Height) + Paint.Background = Color.SetAlpha(Color.SelectedBackground, 128) + Paint.Fill() + + 'Draw the Tooltip + If $iSideBarClick Then + Paint.AntiAlias = True + Paint.Background = Color.TooltipBackground + W = Paint.Font.TextWidth(CStr(Row) & "00") + H = Paint.Font.H * 2.8 + + Y = $iMY + D + If Y + H > Paint.H Then Y = Max(0, $iMY - H - D) + + 'Y = Max(0, IIf(Paint.Height - ($iMY + (Paint.Font.H * 3 + 6)) < 0, $iMY - ((Paint.Font.H * 3 + 6)), $iMY - H)) + X = IIf(System.RightToLeft, Paint.Width - W - 3, 3) + Paint.Rectangle(X, Y, W, H, Paint.Font.H / 4) + Paint.Fill + 'Paint.Font.Grade = - 1 + Paint.Background = Color.TooltipForeground + 'Paint.DrawText(_ViewToReal((Row + 1)) & "\n-\n" & _ViewToReal(Min((Row + NL), iCount)), X + 3, y + 3, W - 6, H - 6, Align.Center) + Paint.DrawText(CStr(PosToLine(0) + 1), X, Y, W, H \ 2, Align.Center) + Paint.DrawText(CStr(PosToLine($hView.ClientH - $LH \ 2) + 1), X, Y + H - H \ 2, W, H \ 2, Align.Center) + Paint.FillRect(X + D / 4, Y + H \ 2, W - D / 2, 1, Color.SetAlpha(Color.TooltipForeground, 128)) + Endif + +End + +Private Sub SideBarClick(Y As Integer) + + $iMY = Y + Y = Min(Max(0, Floor(((Y - $iMD)) / $fBarLineHeight)), $hRows.Max) '_RealToView($hDoc.Max)) + Me.GotoCenter(0, _ViewToReal(Y)) + +End + +Public Sub SideBar_MouseMove() + + Dim iCurLine As Integer + Dim X As Integer + Dim D As Integer = Desktop.Scale * 2 + Dim iCount As Integer = $hRows.Max '_RealToView($hDoc.Max) + Dim iWhere As Integer + + If Mouse.Y < D Then + iWhere = SIDEBAR_UP + Else If Mouse.Y > Last.ClientH - D Then + iWhere = SIDEBAR_DOWN + Else + iWhere = SIDEBAR_VIEW + Endif + + If iWhere <> $iSideBarWhere Then + $iSideBarWhere = iWhere + $hSideBar.Refresh + Endif + + Select Case $iSideBarClick + + Case SIDEBAR_VIEW + $hSideBarViewer.Hide + SideBarClick(Mouse.Y) + + Case SIDEBAR_UP, SIDEBAR_DOWN + $hSideBarViewer.Hide + + Case Else + + If Not $hSideBarViewer.Visible Then UpdatePreviewViewer + iCurLine = _ViewToReal(Min(Max(0, Floor((Mouse.Y - $iMD) / $fBarLineHeight)), iCount)) + $hSideBarViewer.GotoCenter(0, iCurLine) + X = IIf(System.RightToLeft, $hSideBar.Left + $hSideBar.Width, $hSideBar.Left - $hView.Width / 2) + $hSideBarViewer.Move(X, Min(Max(1, Mouse.Y - ($hView.Height / 5) / 2), $hSideBar.Height - $hSideBarViewer.Height)) + $hSideBarViewer.Raise + $hSideBarViewer.Show + + End Select + + ' If Mouse.Y > $fBarLineHeight * iCount Then + ' If Not $bSideBarLockViewer Then $hSideBarViewer.Hide + ' Else + ' If $iMD > 0 Then + ' If Not $bSideBarLockViewer Then $hSideBarViewer.Hide + ' Else + ' If Not $bSideBarLockViewer Then + ' If $hSideBarViewer.Visible Then + ' X = IIf(System.RightToLeft, $hSideBar.Left + $hSideBar.Width, $hSideBar.Left - $hView.Width / 2) + ' $hSideBarViewer.Move(X, Min(Max(1, Mouse.Y - ($hView.Height / 5) / 2), $hSideBar.Height - $hSideBarViewer.Height)) + ' $hSideBarViewer.Raise + ' 'iCurLine = Min(Max(0, Floor(((Mouse.y - $iMD)) / $fBarLineHeight)), iCount) + ' iCurLine = _ViewToReal(Min(Max(0, Floor((Mouse.Y - $iMD) / $fBarLineHeight)), iCount)) + ' 'If $hSideBarViewer.Line <> iCurLine Then + ' $hSideBarViewer.GotoCenter(0, iCurLine) + ' '$hSideBarViewer.Tag = iCurLine + ' 'Endif + ' Endif + ' Endif + ' Endif + ' + ' $iMY = Mouse.Y + ' If Mouse.Left Then + ' $bSideBarMouseDown = True + ' If $iMD = 0 Then + ' If $hRectSideBar.Contains(Mouse.x, Mouse.y) Then + ' If Not $bSideBarLockViewer Then $hSideBarViewer.Hide + ' $iMD = Mouse.y - $hRectSideBar.Top + ' Endif + ' Endif + ' Endif + ' + ' Endif + +End + +Public Sub SideBar_Enter() + + $hSideBar.Refresh + +End + + +Public Sub SideBar_Leave() + + $iSideBarWhere = SIDEBAR_NONE + $iSideBarClick = SIDEBAR_NONE + $hSideBar.Refresh + '$hTimerSideBarViewer.Stop + If Not $bSideBarLockViewer Then $hSideBarViewer.Hide + +End + +Public Sub TimerSideBarMouse_Timer() + + Dim DY As Integer + + DY = If($iSideBarClick = SIDEBAR_DOWN, $LH, -$LH) + + If $hView.ScrollY + DY < 0 Or If $hView.ScrollY + DY >= $hView.ScrollH Then + Try $hTimerSideBarMouse.Stop + $hTimerSideBarMouse = Null + Else + $hView.ScrollY += DY + If Not $hTimerSideBarMouse Then + $hTimerSideBarMouse = New Timer As "TimerSideBarMouse" + $hTimerSideBarMouse.Delay = 250 + $hTimerSideBarMouse.Start + Else If $hTimerSideBarMouse.Delay <> 10 Then + $hTimerSideBarMouse.Delay = 10 + $hTimerSideBarMouse.Restart + Endif + Endif + +End + +Public Sub SideBar_MouseDown() + + If Mouse.Left Then + + SideBar_MouseMove + $iSideBarClick = $iSideBarWhere + + Select Case $iSideBarClick + + Case SIDEBAR_UP, SIDEBAR_DOWN + TimerSideBarMouse_Timer + + Case Else + SideBarClick(Mouse.Y) + + End Select + + ' If $iSideBarStyle > 0 Then + ' If Not $bSideBarLockViewer Then $hSideBarViewer.Hide + ' Select Case $iSideBarStyle + ' Case 1 + ' $hView.ScrollY -= $LH + ' Case 2 + ' $hView.ScrollY += $LH + ' End Select + ' Else + ' + ' If $hRectSideBar.Contains(Mouse.x, Mouse.y) Then + ' If Not $bSideBarLockViewer Then $hSideBarViewer.Hide + ' $iMD = Mouse.y - $hRectSideBar.Top + ' Else + ' SideBarClick(Mouse.Y) + ' $bSideBarMouseDown = True + ' $iMY = Mouse.Y + ' Endif + ' + ' Endif + Endif + + ' If Mouse.Middle Then + ' If $iSideBarStyle > 0 Then + ' If $iSideBarStyle = 1 Then + ' Me.GotoCenter($SX, 0) + ' Else + ' Me.GotoCenter($SX, $hDoc.Count) + ' Endif + ' Else + ' If $hSideBarViewer.Visible Then $bSideBarLockViewer = Not $bSideBarLockViewer + ' Endif + ' Endif + +End + +Public Sub SideBar_MouseUp() + + $iSideBarClick = SIDEBAR_NONE + $iMD = 0 + '$iMY = -1 + Try $hTimerSideBarMouse.Stop + $hTimerSideBarMouse = Null + $hSideBar.Refresh + +End + +Public Sub SideBar_MouseWheel() + 'C'est po bien !!!! Mais bon. + + $hView.DrawingArea_MouseWheel + +End + +Public Sub TimerRefreshBar_Timer() + + $hImageSideBar = Null + If $bShowPreview Then + $hTimerSideBarRefresh.Stop + $hSideBar.Refresh + UpdatePreviewViewer + Endif + +End + +Public Sub SideBar_Arrange() + + $hTimerSideBarRefresh.Restart + +End + +Private Function ShowPreview_Read() As Boolean + + Return $bShowPreview + +End + +Private Sub UpdateSideBarFont() + + Dim hFont As Font + + If Not $hSideBarViewer Then Return + + hFont = Me.Font.Copy() + hFont.Grade -= 2 + $hSideBarViewer.Font = hFont + +End + +Private Sub ShowPreview_Write(Value As Boolean) + + If $bShowPreview = Value Then Return + + $bShowPreview = Value + + If Value Then + + $hTimerSideBarRefresh = New Timer As "TimerRefreshBar" + $hTimerSideBarRefresh.Delay = 250 + ' $hTimerSideBarViewer = New Timer As "TimerShowPreviewViewer" + ' $hTimerSideBarViewer.Delay = 100 + + $hSideBarViewer = New TextEditor(Me) As "SideBarViewer" + $hSideBarViewer.Hide + $hSideBarViewer.ReadOnly = True + SyncSideBarViewerStyles + $hSideBarViewer.ShowCursor = False + $hSideBarViewer.Ignore = True + $hSideBarViewer.Enabled = False + $hSideBarViewer.ScrollBar = Scroll.None + ScrollArea($hSideBarViewer.Proxy).NoShadow = True + + $hSideBar = New DrawingArea($hPanel) As "SideBar" + $hSideBar.Width = Desktop.Scale * 8 + $hSideBar.Background = $hStyles[Highlight.Background].Color + $hSideBar.Tracking = True + + UpdateSideBarFont + + ScrollBar_Write($iScrollBar) + + Else + + If $hSideBar Then + '$hSideBar.Hide + $hSideBar.Delete + $hSideBar = Null + $hTimerSideBarRefresh.Stop + $hTimerSideBarRefresh = Null + $hSideBarViewer.Delete + $hSideBarViewer = Null + '$hTimerSideBarViewer.Stop + '$hTimerSideBarViewer = Null + ScrollBar_Write($iScrollBar) + Endif + + Endif + +End + +Private Sub SyncSideBarViewerStyles() + + Dim i As Integer + + For i = 0 To 31 + If IsNull($hSideBarViewer.Styles[i]) Or If IsNull($hStyles[i]) Then Continue + $hSideBarViewer.Styles[i].Underline = $hStyles[i].Underline + $hSideBarViewer.Styles[i].Bold = $hStyles[i].Bold + $hSideBarViewer.Styles[i].Color = $hStyles[i].Color + Next + + With $hSideBarViewer + .ShowExpand = Me.ShowExpand + .ShowIcon = Me.ShowIcon + .ShowIndent = Me.ShowIndent + .ShowLimit = Me.ShowLimit + .ShowLineNumber = Me.ShowLineNumber + .ShowModified = Me.ShowModified + .ShowSpaces = Me.ShowSpaces + .Highlight = Me.Highlight + End With + +End + +' Public Sub TimerShowPreviewViewer_Timer() +' +' $hSideBarViewer.Move($hSideBar.Left - $hView.Width / 2, Min(Max(1, $iMY - ($hView.Height / 5) / 2), $hSideBar.Height - $hSideBarViewer.Height), $hView.Width / 2, $hView.Height / 5) +' $iSideBarNBLines = Ceil(($hSideBarViewer.ClientH / $hSideBarViewer.LineHeight) / 2) +' $hSideBarViewer.View = Me +' $hSideBarViewer._SyncFolding() +' $hSideBarViewer.Show +' '$hSideBarViewer.ShowExpand = True +' $hSideBarViewer.Raise +' $hTimerSideBarViewer.Stop +' +' End + +Public Sub UpdatePreviewViewer() + + $hSideBarViewer.Resize($hView.Width / 2, $hView.Height / 5) + $hSideBarViewer.View = Me + $hSideBarViewer._SyncFolding() + ' $hSideBarViewer.Show + ' '$hSideBarViewer.ShowExpand = True + ' $hSideBarViewer.Raise + ' '$hTimerSideBarViewer.Stop + +End + +Public Sub SideBarViewer_MouseDown() + + $hSideBarViewer.Hide + $bSideBarLockViewer = False + +End + +Public Sub SideBar_Menu() + + Stop Event + +End + +Public Sub _SyncFolding() + + Dim I As Integer + Dim hSrc As TextEditor + + hSrc = Me.View + If hSrc = Me Then Return + + ExpandAll + Repeat + If Not hSrc[I].Expanded Then + _CollapseRow(I) + Endif + I = hSrc.FindNextLimit(I) + Until I < 0 + +End + +Private Function Mode_Read() As String + + Return $hDoc.Mode + +End + +Private Sub Mode_Write(Value As String) + + $hDoc.Mode = Value + +End + +Private Function CloseBraces_Read() As Boolean + + Return $hDoc.CloseBraces + +End + +Private Sub CloseBraces_Write(Value As Boolean) + + $hDoc.CloseBraces = Value + +End + +Private Function TabIndent_Read() As Boolean + + Return $bTabIndent + +End + +Private Sub TabIndent_Write(Value As Boolean) + + $bTabIndent = Value + +End + +Private Sub RefreshSideBar() + + If $bShowPreview Then $hTimerSideBarRefresh.Restart + +End + +Public Sub GetIndent(StartLine As Integer, Optional EndLine As Integer) As String + + If EndLine = 0 Then EndLine = StartLine + 1 + Return $hDoc.GetIndentText(StartLine, EndLine) + +End + +Public Sub GetHighlight(Y As Integer, ByRef Symbols As String[], ByRef Types As Integer[]) + + Dim aColors As Byte[] + Dim sLine As String + Dim I As Integer + Dim P As Integer + + $hDoc.HighlightFrom(Y) + Try aColors = $hDoc.LinesInfo[Y].Colors + If Not aColors Then Return + + Symbols = New String[] + Types = New Integer[] + + sLine = $hDoc.Lines[Y] + P = 1 + For I = 0 To aColors.Max Step 2 + Types.Add(aColors[I]) + Symbols.Add(String.Mid$(sLine, P, aColors[I + 1])) + P += aColors[I + 1] + Next + +End + +Private Function DisabledBreakpoints_Read() As Integer[] + + Return $hDoc.DisabledBreakpoints + +End + +Private Sub DisabledBreakpoints_Write(Value As Integer[]) + + $hDoc.DisabledBreakpoints = Value + +End + +Public Sub HighlightString(Text As String, Optional IgnoreCase As Boolean, Optional WordOnly As Boolean) + + $sHighlightString = Text + $iHighlightStringLen = String.Len(Text) + $iHighlightStringMode = If(IgnoreCase, gb.IgnoreCase, gb.Binary) + $bHighlightWordOnly = WordOnly + + ClearCacheLine + $hView.Refresh + +End + +Private Sub IsWordLimit(sCar As String) As Boolean + + sCar = String.RemoveDiacritics(sCar) + If IsLetter(sCar) Or IsDigit(sCar) Or If InStr("_$", sCar) Then Return + Return True + +End + + +Private Function LastLine_Read() As Integer + + Return $LY + +End + +Private Function LastColumn_Read() As Integer + + Return $LX + +End + +Private Function CloseStrings_Read() As Boolean + + Return $hDoc.CloseStrings + +End + +Private Sub CloseStrings_Write(Value As Boolean) + + $hDoc.CloseStrings = Value + +End + +Private Function Max_Read() As Integer + + Return Count_Read() - 1 + +End + +Public Sub EnterDiffMode((Added) As Integer[], (Removed) As Collection) + + $hDoc.EnterDiffMode(Added, Removed) + +End + +Public Sub _EnterDiffMode() + + Dim bEnsureVisible As Boolean + + $cDiffLayout = New Collection + + $bDiffReadOnly = Me.ReadOnly + Me.ReadOnly = True + + bEnsureVisible = _IsFirstLineVisible() + _UpdateAllHeight(True) + If bEnsureVisible Then $hView.EnsureVisible(0, 0, Me.ClientW, $LH) + +End + +Public Sub LeaveDiffMode() + + $hDoc.LeaveDiffMode() + +End + +Public Sub _LeaveDiffMode() + + $cDiffLayout = Null + Me.ReadOnly = $bDiffReadOnly + _UpdateAllHeight(True) + +End + + +Private Function DiffMode_Read() As Boolean + + Return $hDoc.DiffMode + +End + +Public Sub FindPreviousDiff(Y As Integer) As Integer + + Return $hDoc.FindPreviousDiff(Y) + +End + +Public Sub FindNextDiff(Y As Integer) As Integer + + Return $hDoc.FindNextDiff(Y) + +End + +Private Sub ShowFind() + + If Not $hFind Then $hFind = New FFind($hVPanel) + $hFind.H = Desktop.Scale * 3 + $hFind.Show + $hFind.SetFocus() + +End + +Public Sub _Search(sText As String, Optional bMoveNext As Boolean) As Boolean + + Dim HH As Integer + Dim Y As Integer + Dim X As Integer + Dim YY As Integer + + HighlightString(sText, True) + If Not sText Then + EnsureVisible + Return + Endif + + If IsMissing(bMoveNext) Then + Y = FindNextString(sText, $Y) + Else If bMoveNext Then + Y = FindNextString(sText, $Y + 1) + Else + Y = FindPreviousString(sText, $Y - 1) + Endif + + If Y < 0 Then Return True + + X = String.InStr($hDoc.Lines[Y], sText) - 1 + + If IsMissing(bMoveNext) Then + HH = $hRows.H + YY = $hRows._GetRowY(Y) + LinePos(Y, X).Y + $hView.EnsureVisible(0, YY, $hView.ClientW, HH) + Else + Goto(X, Y) + Endif + +End + +Public Sub IsVoid() As Boolean + + If $hDoc.Count > 1 Then Return + If $hDoc.Length Then Return + Return True + +End diff --git a/comp/src/gb.form.editor/.src/TextEditorMode.class b/comp/src/gb.form.editor/.src/TextEditorMode.class new file mode 100644 index 00000000..acee7b4d --- /dev/null +++ b/comp/src/gb.form.editor/.src/TextEditorMode.class @@ -0,0 +1,299 @@ +' Gambas class file + +Static Public Const Name As String = "" + +Static Public Const BRACES_OPEN As String = "([{" +Static Public Const BRACES_CLOSE As String = ")]}" +Static Public Const STRING_DELIM As String = "\"" +Static Public Const ESCAPE_CHAR As String = "\\" + +Public CloseBraces As Boolean +Public CloseStrings As Boolean +Public InsideStringEscape As Boolean + +Static Public Sub _init() + + Try Component.Load("gb.util") + +End + +Static Public Sub _get(Type As String) As TextEditorMode + + Try Return Object.New("TextEditorMode_" & Type) + 'Error.Raise("Cannot load highlighter: '" & Type & "'") + Return New TextEditorMode + +End + +Public Sub IsIdentCar(sCar As String) As Boolean + + If IsLetter(sCar) Or If IsDigit(sCar) Then Return True + +End + +Private Sub IsSpacePunctCar(sText As String, iPos As Integer) As Boolean + + Dim sCar As String + + Try sCar = String.Mid$(sText, iPos, 1) + + If Not sCar Then Return True + If Len(sCar) > 1 Then Return + If IsPunct(sCar) Then Return True + If IsSpace(sCar) Then Return True + +End + + +Public Sub InsideString(hEditor As TextEditor) As Boolean + + Dim iLen As Integer + Dim I As Integer + Dim sInside As String + Dim sLine As String + Dim sCar As String + Dim sDelim As String + Dim iCol As Integer + + InsideStringEscape = False + + iCol = hEditor.Column + If iCol = 0 Then Return + + sLine = hEditor.Current.Text + iLen = hEditor.Current.Length + sDelim = Me.STRING_DELIM + + For I = 1 To iCol + + sCar = String.Mid$(sLine, I, 1) + + If sCar = sInside Then + sInside = "" + Else If InStr(sDelim, sCar) Then + If Not sInside Then sInside = sCar + Else If sCar = ESCAPE_CHAR Then + If sInside Then + If I = iCol Then InsideStringEscape = True + Inc I + Endif + Endif + + Next + + If sInside Then + I = InStr(sLine, sInside, iCol + 1) + If I = 0 Then + InsideStringEscape = True + Endif + Endif + + Return sInside + + ' If Not sInside Then Return + ' + ' For I = I To iLen + ' + ' sCar = String.Mid$(sLine, I, 1) + ' If sCar = sInside Then Return True + ' If sCar = ESCAPE_CHAR Then Inc I + ' + ' Next + ' + ' Return False + +End + +Public Sub BetweenBraces(hEditor As TextEditor) As Boolean + + Dim sLine As String + Dim X As Integer + Dim iLen As Integer + Dim iPos As Integer + + If InsideString(hEditor) Then Return + + sLine = hEditor.Current.Text + iLen = hEditor.Current.Length + X = hEditor.Column + + If X = 0 Or If X = iLen Then Return + + iPos = InStr(Me.BRACES_OPEN, String.Mid$(sLine, X, 1)) + If iPos = 0 Then Return + + Return String.Mid$(sLine, X + 1, 1) = Mid$(Me.BRACES_CLOSE, iPos, 1) + +End + +Public Sub CanCloseBraces(hEditor As TextEditor) As Boolean + + Dim sLine As String + Dim X As Integer + Dim iLen As Integer + Dim sCar As String + + If Not CloseBraces Then Return + + sLine = hEditor.Current.Text + iLen = hEditor.Current.Length + X = hEditor.Column + + If X >= iLen Then Return True + + sCar = String.RemoveDiacritics(String.Mid$(sLine, X + 1, 1)) + If IsLetter(sCar) Or If IsNumber(sCar) Then Return False + + 'If InsideString(hEditor) Then Return + + Return True + +End + +Public Sub OnKeyPress(hEditor As TextEditor) As Boolean + + Dim sLine As String + Dim X As Integer + Dim sCar As String + Dim iPos As Integer + Dim sText As String + Dim sSearch As String + + sText = Key.Text + + If Key.Code = Key.BackSpace Then + + If Not CloseBraces And If Not CloseStrings Then Return + + If hEditor.Selected Then Return + + X = hEditor.Column + If X = 0 Then Return + + sLine = hEditor.Current.Text + sCar = String.Mid$(sLine, X, 1) + + sSearch = "" + If CloseBraces Then sSearch = Me.BRACES_OPEN + If CloseStrings Then sSearch &= Me.STRING_DELIM + + iPos = InStr(sSearch, sCar) + If iPos = 0 Then Return + + sSearch = "" + If CloseBraces Then sSearch = Me.BRACES_CLOSE + If CloseStrings Then sSearch &= Me.STRING_DELIM + + sCar = String.Mid$(sLine, X + 1, 1) + If sCar <> Mid$(sSearch, iPos, 1) Then Return + + hEditor.SaveCursor() + hEditor.Select(X - 1, hEditor.Line, X + 1, hEditor.Line) + hEditor.Insert("") + hEditor.RestoreCursor() + hEditor.Goto(X - 1, hEditor.Line) + Return True + + Endif + + InsideStringEscape = False + + If CloseBraces Then + + iPos = InStr(Me.BRACES_OPEN, sText) + If iPos Then + + If hEditor.Selected Then + If hEditor.SelectionLine = hEditor.Line Then + hEditor.Insert(sText & hEditor.SelectedText & Mid$(Me.BRACES_CLOSE, iPos, 1)) + Return True + Endif + Endif + + If CanCloseBraces(hEditor) Then + + hEditor.Begin + hEditor.SaveCursor() + hEditor.Insert(sText) + hEditor.Insert(Mid$(Me.BRACES_CLOSE, iPos, 1)) + hEditor.RestoreCursor() + hEditor.Goto(hEditor.Column + 1, hEditor.Line) + hEditor.End + '$bCanCloseBracesComputed = False + Return True + + Endif + + Return + + Endif + + iPos = InStr(Me.BRACES_CLOSE, sText) + If iPos Then + + If String.Mid$(hEditor.Current.Text, hEditor.Column + 1, 1) = sText Then + hEditor.Goto(hEditor.Column + 1, hEditor.Line) + Return True + Endif + + Return + + Endif + + Endif + + If CloseStrings Then + + iPos = InStr(Me.STRING_DELIM, sText) + If iPos Then + + ' If hEditor.Selected Then + ' If hEditor.SelectionLine = hEditor.Line Then + ' hEditor.Insert(sText & hEditor.SelectedText & sText) + ' Return True + ' Endif + ' Endif + + If Not InsideString(hEditor) Then + + If IsSpacePunctCar(hEditor.Current.Text, hEditor.Column) And If IsSpacePunctCar(hEditor.Current.Text, hEditor.Column + 1) Then + GoSub INSERT_STRING + Return True + Endif + + Else If hEditor.Column < hEditor.Current.Length Then + + If Not InsideStringEscape Then + + If String.Mid$(hEditor.Current.Text, hEditor.Column + 1, 1) = sText Then + hEditor.Goto(hEditor.Column + 1, hEditor.Line) + Return True + Endif + + If IsSpacePunctCar(hEditor.Current.Text, hEditor.Column) And If IsSpacePunctCar(hEditor.Current.Text, hEditor.Column + 1) Then + GoSub INSERT_STRING + Return True + Endif + + Endif + + Endif + + Endif + + Endif + + Return + +INSERT_STRING: + + hEditor.SaveCursor() + hEditor.Insert(sText & sText) + hEditor.RestoreCursor() + hEditor.Goto(hEditor.Column + 1, hEditor.Line) + Return + + + '$bCanCloseBracesComputed = False + +End diff --git a/comp/src/gb.form.editor/.src/TextEditorMode_CSS.class b/comp/src/gb.form.editor/.src/TextEditorMode_CSS.class new file mode 100644 index 00000000..fa3de102 --- /dev/null +++ b/comp/src/gb.form.editor/.src/TextEditorMode_CSS.class @@ -0,0 +1,5 @@ +' Gambas class file + +Inherits TextEditorMode + +Static Public Const STRING_DELIM As String = "\"'" diff --git a/comp/src/gb.form.editor/.src/TextEditorMode_Gambas.class b/comp/src/gb.form.editor/.src/TextEditorMode_Gambas.class new file mode 100644 index 00000000..e32e565d --- /dev/null +++ b/comp/src/gb.form.editor/.src/TextEditorMode_Gambas.class @@ -0,0 +1,71 @@ +' Gambas class file + +Inherits TextEditorMode + +Static Public Const Name As String = "gambas" + +Public Sub IsIdentCar(sCar As String) As Boolean + + If IsLetter(sCar) Then Return True + If IsDigit(sCar) Then Return True + If sCar = "_" Or If sCar = "$" Then Return True + +End + + +Private Sub ToggleAroundCurrentWord(hEditor As TextEditor, sBraces As String) + + Dim sLine As String + Dim X1, X2 As Integer + Dim iLen As Integer + + sLine = hEditor.Current.Text + iLen = hEditor.Current.Length + + X1 = hEditor.Column + While X1 > 0 + If Not IsIdentCar(String.Mid$(sLine, X1, 1)) Then Break + Dec X1 + Wend + + X2 = hEditor.Column + While X2 < iLen + If Not IsIdentCar(String.Mid$(sLine, X2 + 1, 1)) Then Break + Inc X2 + Wend + + If X1 = X2 Then Return + + If X1 >= 1 And If String.Mid$(sLine, X1, 1) = Left(sBraces) And If X2 < iLen And If String.Mid$(sLine, X2 + 1, 1) = Right(sBraces) Then + sLine = String.Left(sLine, X1 - 1) & String.Mid$(sLine, X1 + 1, X2 - X1) & String.Mid$(sLine, X2 + 2) + X1 = hEditor.Column - 1 + Else + sLine = String.Left(sLine, X1) & Left(sBraces) & String.Mid$(sLine, X1 + 1, X2 - X1) & Right$(sBraces) & String.Mid$(sLine, X2 + 1) + X1 = hEditor.Column + 1 + Endif + + hEditor[hEditor.Line].Text = sLine + hEditor.Goto(X1, hEditor.Line) + +End + +Public Sub OnKeyPress(hEditor As TextEditor) As Boolean + + Dim sBraces As String + + If Key.Alt Then + + For Each sBraces In ["()", "{}", "[]"] + If InStr(sBraces, Key.Text) Then + ToggleAroundCurrentWord(hEditor, sBraces) + Return True + Endif + Next + + Endif + + If Key.Text = "'" Then Return + + Return Super.OnKeyPress(hEditor) + +End diff --git a/comp/src/gb.form.editor/.src/TextEditorMode_HTML.class b/comp/src/gb.form.editor/.src/TextEditorMode_HTML.class new file mode 100644 index 00000000..d35d707f --- /dev/null +++ b/comp/src/gb.form.editor/.src/TextEditorMode_HTML.class @@ -0,0 +1,82 @@ +' Gambas class file + +Inherits TextEditorMode + +Static Public Const Name As String = "html" + +Static Public Const STRING_DELIM As String = "\"'" + +Static Private $aDoNotClose As String[] = ["area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "meta", "param", "source", "track", "wbr"] + +Private Sub InsertClosingMarkup(hEditor As TextEditor) + + Dim sLine As String + Dim X, X1, X2 As Integer + Dim iLen As Integer + Dim sCar As String + Dim sMarkup As String + + sLine = hEditor.Current.Text + iLen = hEditor.Current.Length + + X = hEditor.Column + + X1 = X + While X1 > 0 + If String.Mid$(sLine, X1, 1) = "<" Then Break + Dec X1 + Wend + + If X1 = 0 Then Return + + X2 = X1 + Do + Inc X2 + If X2 > iLen Then Break + sCar = String.Mid$(sLine, X2, 1) + If sCar = " " Or If sCar = ">" Then Break + Loop + + sMarkup = String.Mid$(sLine, X1 + 1, X2 - X1 - 1) + + If Not sMarkup Then Return + If sMarkup Begins "/" Then Return + If sMarkup Begins "%" Then Return + If $aDoNotClose.Exist(sMarkup, gb.IgnoreCase) Then Return + + hEditor.Insert("") + hEditor.Goto(X, hEditor.Line) + +End + +Public Sub BetweenBraces(hEditor As TextEditor) As Boolean + + Dim sLine As String + Dim X As Integer + Dim iLen As Integer + + If Me.InsideString(hEditor) Then Return + + sLine = hEditor.Current.Text + iLen = hEditor.Current.Length + X = hEditor.Column + + If X = 0 Or If X = iLen Then Return + + If String.Mid$(sLine, X, 1) = ">" And If String.Mid$(sLine, X + 1, 2) = "" Then + hEditor.Insert(">") + If Not Me.InsideString(hEditor) Then InsertClosingMarkup(hEditor) + Return True + Endif + + Return Super.OnKeyPress(hEditor) + +End diff --git a/comp/src/gb.form.editor/.src/TextEditorMode_Javascript.class b/comp/src/gb.form.editor/.src/TextEditorMode_Javascript.class new file mode 100644 index 00000000..0d6f0027 --- /dev/null +++ b/comp/src/gb.form.editor/.src/TextEditorMode_Javascript.class @@ -0,0 +1,7 @@ +' Gambas class file + +Inherits TextEditorMode + +Static Public Const BRACES_OPEN As String = "([{" +Static Public Const BRACES_CLOSE As String = ")]}" +Static Public Const STRING_DELIM As String = "\"'`" diff --git a/comp/src/gb.form.editor/.src/TextEditorMode_SQL.class b/comp/src/gb.form.editor/.src/TextEditorMode_SQL.class new file mode 100644 index 00000000..fa3de102 --- /dev/null +++ b/comp/src/gb.form.editor/.src/TextEditorMode_SQL.class @@ -0,0 +1,5 @@ +' Gambas class file + +Inherits TextEditorMode + +Static Public Const STRING_DELIM As String = "\"'" diff --git a/comp/src/gb.form.editor/.src/TextEditorMode_WebPage.class b/comp/src/gb.form.editor/.src/TextEditorMode_WebPage.class new file mode 100644 index 00000000..1d90d66b --- /dev/null +++ b/comp/src/gb.form.editor/.src/TextEditorMode_WebPage.class @@ -0,0 +1,3 @@ +' Gambas class file + +Inherits TextEditorMode_HTML diff --git a/comp/src/gb.form.editor/.src/TextEditorStyle.class b/comp/src/gb.form.editor/.src/TextEditorStyle.class new file mode 100644 index 00000000..9d69fdac --- /dev/null +++ b/comp/src/gb.form.editor/.src/TextEditorStyle.class @@ -0,0 +1,110 @@ +' Gambas class file + +Event Change + +Property Color As Integer +Property Background As Integer +Property Bold As Boolean +Property Underline As Boolean +Property Dotted As Boolean + +Private $iColor As Integer +Private $iBg As Integer = Color.Default +Private $bBold As Boolean +Private $bUnderline As Boolean +Private $bDotted As Boolean + +Public Sub _new(Optional (Color) As Integer, Optional Bold As Boolean, Underline As Boolean, Dotted As Boolean) + + $iColor = Color + $bBold = Bold + $bUnderline = Underline + $bDotted = Dotted + +End + +Public Sub Copy() As TextEditorStyle + + Dim hStyle As TextEditorStyle + + hStyle = New TextEditorStyle + With hStyle + .Background = $iBg + .Bold = $bBold + .Color = $iColor + .Underline = $bUnderline + .Dotted = $bDotted + End With + +End + + +Private Function Color_Read() As Integer + + Return $iColor + +End + +Private Sub Color_Write(Value As Integer) + + If $iColor = Value Then Return + $iColor = Value + Raise Change + +End + +Private Function Bold_Read() As Boolean + + Return $bBold + +End + +Private Sub Bold_Write(Value As Boolean) + + If $bBold = Value Then Return + $bBold = Value + Raise Change + +End + +Private Function Underline_Read() As Boolean + + Return $bUnderline + +End + +Private Sub Underline_Write(Value As Boolean) + + If $bUnderline = Value Then Return + $bUnderline = Value + Raise Change + +End + +Private Function Background_Read() As Integer + + Return $iBg + +End + +Private Sub Background_Write(Value As Integer) + + If $iBg = Value Then Return + $iBg = Value + Raise Change + +End + +Private Function Dotted_Read() As Boolean + + Return $bDotted + +End + +Private Sub Dotted_Write(Value As Boolean) + + If $bDotted = Value Then Return + $bDotted = Value + Raise Change + +End diff --git a/comp/src/gb.form.editor/.src/_TextEditor_Line.class b/comp/src/gb.form.editor/.src/_TextEditor_Line.class new file mode 100644 index 00000000..5d6a5173 --- /dev/null +++ b/comp/src/gb.form.editor/.src/_TextEditor_Line.class @@ -0,0 +1,199 @@ +' Gambas class file + +Export + +Event _Fake + +Public _Line As Integer + +Property Text As String +Property Read Length As Integer +Property Read Limit As Boolean +Property Read InitialState As _TextEditor_State +Property Read Height, H As Integer +Property Expanded As Boolean +Property Breakpoint As Boolean +Property Disabled As Boolean +Property Bookmark As Boolean +Property Read Added As Boolean + +Private Sub GetView() As TextEditor + + Return Object.Parent(Me) + +End + + +Private Sub GetDoc() As CDocument + + Return GetView()._GetDocument() + +End + +Private Function Text_Read() As String + + Return GetDoc().Lines[_Line] + +End + +Private Function Length_Read() As Integer + + Return GetDoc().LineLength[_Line] + +End + +Private Sub Text_Write(Value As String) + + With GetView() + If ._GetDocument().Lines[_Line] <> Value Then + .SaveCursor + .Begin + .Remove(0, _Line, String.Len(._GetDocument().Lines[_Line]), _Line) + .Insert(Value) + .End + .RestoreCursor + Endif + End With + +End + +Public Sub Refresh() + + With GetDoc() + .Info(_Line).ClearHighlight + .HighlightFrom(_Line) + .Refresh(_Line) + End With + +End + + +Private Function Limit_Read() As Boolean + + Return GetDoc().Info(_Line).Limit + +End + +Private Function Breakpoint_Read() As Boolean + + Return GetDoc().HasBreakpoint(_Line) + +End + +Private Sub Breakpoint_Write(Value As Boolean) + + GetDoc().SetBreakpoint(_Line, Value, GetDoc().IsBreakpointDisabled(_Line)) + Refresh + +End + +Private Function Bookmark_Read() As Boolean + + Return GetDoc().HasBookmark(_Line) + +End + +Private Sub Bookmark_Write(Value As Boolean) + + GetDoc().SetBookmark(_Line, Value) + Refresh + +End + +Private Function InitialState_Read() As _TextEditor_State + + Dim hState As _TextEditor_State + + hState = New _TextEditor_State + If _Line > 0 Then hState._State = GetDoc().Info(_Line - 1) + Return hState + +End + +Public Sub Purge(Optional KeepComment As Boolean, KeepString As Boolean, Replace As String = " ") As String + + Dim hDoc As CDocument = GetDoc() + Dim aColor As Byte[] + Dim sPurge As String + Dim I As Integer + Dim iState As Byte + Dim sText As String + Dim X As Integer + Dim bReplace As Boolean + + sText = hDoc.Lines[_Line] + aColor = GetDoc().Info(_Line).Colors + If Not aColor Then Return sText + + X = 1 + For I = 0 To aColor.Max Step 2 + iState = aColor[I] + bReplace = False + If Not KeepComment Then + If iState = Highlight.Comment Or If iState = Highlight.Help Then + bReplace = True + Endif + Endif + If Not KeepString And If iState = Highlight.String Then + bReplace = True + Endif + If bReplace Then + sPurge &= String$(aColor[I + 1], Replace) + Else + sPurge &= String.Mid$(sText, X, aColor[I + 1]) + Endif + X += aColor[I + 1] + Next + + Return sPurge + +End + +Private Function Expanded_Read() As Boolean + + Return GetView()._IsRowExpanded(_Line) + +End + +Private Sub Expanded_Write(Value As Boolean) + + With GetView() + If Value Then + ._ExpandRow(_Line) + Else + ._CollapseRow(_Line) + Endif + End With + +End + +Private Function Height_Read() As Integer + + Return GetView()._GetRowHeight(_Line) + +End + +Private Function Disabled_Read() As Boolean + + Return GetDoc().IsBreakpointDisabled(_Line) + +End + +Private Sub Disabled_Write(Value As Boolean) + + GetDoc().SetBreakpoint(_Line, GetDoc().HasBreakpoint(_Line), Value) + Refresh + +End + +Public Sub Paint(X As Integer, Y As Integer) + + GetView()._PaintRow(_Line, X, Y) + +End + +Private Function Added_Read() As Boolean + + Return GetView()._IsAdded(_Line) + +End diff --git a/comp/src/gb.form.editor/.src/_TextEditor_Rows.class b/comp/src/gb.form.editor/.src/_TextEditor_Rows.class new file mode 100644 index 00000000..8f9f2282 --- /dev/null +++ b/comp/src/gb.form.editor/.src/_TextEditor_Rows.class @@ -0,0 +1,394 @@ +' Gambas class file + +Property Count As Integer +Property Read Max As Integer +Property Height, H As Integer + +Public RelativeY As Integer + +Event _Fake + +Private $nRows As Integer +Private $cHeight As Collection +Private $aHeight As Integer[] +Private $iHeight As Integer + +Private $cCacheRowY As New Collection +Private $cCacheRowFromPos As New Collection +Private $iLastRow As Integer + +Private Sub GetView() As TextEditor + + Return Object.Parent(Me) + +End + +Private Function Count_Read() As Integer + + Return $nRows + +End + +Private Sub ClearCache() + + $iLastRow = 0 + $cCacheRowY.Clear + $cCacheRowFromPos.Clear + +End + +Private Sub Count_Write(Value As Integer) + + Dim hView As TextEditor = GetView() + + ClearCache + + If Value = $nRows Then Return + + $nRows = Value + hView._ResizeContents + +End + +Private Sub StripCache(cCol As Collection) + + If cCol.Count < 256 Then Return + For Each cCol + cCol.Remove(cCol.Key) + Break + Next + +End + +Public Sub _GetRowY(iRow As Integer) As Integer + + Dim hView As TextEditor = GetView() + Dim Y As Integer + Dim DH As Integer = $iHeight + Dim I As Integer + Dim iViewRow As Integer + + If iRow < 0 Then Return + + iViewRow = hView._RealToView(iRow) + + If Not $cHeight Then Return (iViewRow + hView._TopHeight) * DH + + Try Return $cCacheRowY[iRow] + + If $cCacheRowY.Exist($iLastRow) And If Abs(iRow - $iLastRow) < iRow Then + + If $iLastRow < iRow Then + + I = $iLastRow + While I < iRow + If hView._IsRowVisible(I) Then Y += CInt($cHeight[I]) - 1 + Inc I + Wend + + Else + + I = $iLastRow + While I > iRow + Dec I + If hView._IsRowVisible(I) Then Y -= CInt($cHeight[I]) - 1 + Wend + + Endif + + Y += iViewRow - hView._RealToView($iLastRow) + Y *= DH + Y += $cCacheRowY[$iLastRow] + + Else + + Y = iViewRow + + For Each I In $aHeight + If I >= iRow Then Break + If hView._IsRowVisible(I) Then + Y += CInt($cHeight[I]) - 1 + Endif + Next + + If hView._TopHeight Then Inc Y + 'Y += hView._TopHeight + Y *= DH + + Endif + + $cCacheRowY[iRow] = Y + StripCache($cCacheRowY) + + $iLastRow = iRow + + Return Y + +End + +Public Sub _GetRowHeight(iRow As Integer) As Integer + + 'Debug iRow;; System.Backtrace.Join("|") + Try Return $cHeight[iRow] * $iHeight + Return $iHeight + +End + +Private Sub AddSorted(iRow As Integer) + + Dim I, J As Integer + + 'If iRow >= GetView().Count Then Stop + + I = 0 + J = $aHeight.Max + + If J < 0 Or If iRow > $aHeight[J] Then + $aHeight.Add(iRow) + Return + Endif + + '' TODO: Binary search + $aHeight.Add(iRow) + $aHeight.Sort + +End + +Public Sub _SetRowHeight(iRow As Integer, H As Integer) + + Dim hView As TextEditor = GetView() + 'Dim DH As Integer = $iHeight + Dim OH As Integer + 'Dim bCancel As Boolean + + ClearCache + + If Not $cHeight Then + $cHeight = New Collection + $cHeight.Default = 1 + $aHeight = New Integer[] + Endif + + ' If H < 0 Then + ' bCancel = hView._RaiseRowSize(iRow) + ' If Not bCancel Then Return + ' H = hView._GetPreferredHeight(iRow) + ' Endif + + If H <= 1 Then + If $cHeight.Exist(iRow) Then + $cHeight.Remove(iRow) + $aHeight.Remove($aHeight.Find(iRow)) + hView._ResizeContents() + Endif + Else + If $cHeight.Exist(iRow) Then + OH = $cHeight[iRow] + Else + OH = -1 + Endif + If H <> OH Then + If OH < 0 Then AddSorted(iRow) + $cHeight[iRow] = H + hView._ResizeContents() + 'hView._RaiseRowResize(iRow) + Endif + Endif + +End + +Public Sub _GetHeight() As Integer + + Dim N As Integer + + N = GetView()._GetLastVisibleRow() + Return _GetRowY(N) + _GetRowHeight(N) + + ' Dim hView As TextEditor = GetView() + ' Dim H, DH As Integer + ' Dim I As Integer + ' + ' DH = $iHeight + ' H = $nRows + ' If $cHeight Then + ' For Each I In $aHeight + ' If hView._IsRowVisible(I) Then H += CInt($cHeight[I]) - 1 + ' Next + ' Endif + ' + ' Return H * DH + +End + +Public Sub _FindRowFromPos(Y As Integer) As Integer + + Dim hView As TextEditor = GetView() + Dim DH As Integer = $iHeight + Dim iCache As Long + Dim D As Integer + Dim F As Integer + Dim I As Integer + Dim RY As Integer + Dim RH As Integer + Dim J As Integer + + 'If Y = 0 Then Stop + + If Not $cHeight Then + I = Min($nRows - 1, Y \ DH) - hView._TopHeight + If I < 0 Then Return -1 + RelativeY = Y - I * DH + Return hView._ViewToReal(I) + Endif + + If hView._TopHeight And If Y < (hView._TopHeight * DH) Then Return -1 + + Try iCache = $cCacheRowFromPos[Y] + If Not Error Then + If iCache < 0 Then Return CDocument.ROW_NOT_FOUND + RelativeY = iCache And &HFFFFFFFF& + Return Lsr(iCache, 32) + Endif + + D = 0 + F = $nRows + While F > D + I = (F + D) \ 2 + J = hView._ViewToReal(I) + RY = _GetRowY(J) + RH = _GetRowHeight(J) + If Y < RY Then + F = I + Else If Y >= RY + RH Then + D = I + 1 + Else + Break + Endif + Wend + + I = J + RelativeY = Y - RY + + If I >= hView.Count Then + I = CDocument.ROW_NOT_FOUND + iCache = CDocument.ROW_NOT_FOUND + Else + iCache = Shl(CLong(I), 32) + RelativeY + Endif + + $cCacheRowFromPos[Y] = iCache + StripCache($cCacheRowFromPos) + + Return I + +End + +Private Sub Height_Read() As Integer + + Return $iHeight + +End + +Private Sub Height_Write(Value As Integer) + + $iHeight = Value + ClearCache + +End + +Private Function Max_Read() As Integer + + Return $nRows - 1 + +End + +' Public Sub Remove(Start As Integer, Optional Length As Integer = 1) +' +' GetView()._RemoveRows(Start, Length) +' +' End +' +' Public Sub Insert(Start As Integer, Optional Length As Integer = 1) +' +' GetView()._InsertRows(Start, Length) +' +' End + +Public Sub Clear() + + If $cHeight Then + $cHeight.Clear + $aHeight.Clear + Endif + + ClearCache + +End + +Public Sub _AfterRemove(Y1 As Integer, Y2 As Integer, cLineLayout As Collection) + + Dim Y As Integer + Dim I As Integer + Dim YY As Integer + + If Not $aHeight Then Return + + While I < $aHeight.Count + If $aHeight[I] > Y1 Then Break + Inc I + Wend + + While I < $aHeight.Count + Y = $aHeight[I] + If Y > Y2 Then Break + $aHeight.Remove(I) + $cHeight.Remove(Y) + cLineLayout.Remove(Y) + If $cHeight.Count <> $aHeight.Count Then Stop + Wend + + While I < $aHeight.Count + Y = $aHeight[I] + YY = Y - (Y2 - Y1) + $aHeight[I] = YY + $cHeight[YY] = $cHeight[Y] + $cHeight.Remove(Y) + cLineLayout[YY] = cLineLayout[Y] + cLineLayout.Remove(Y) + If $cHeight.Count <> $aHeight.Count Then Stop + Inc I + Wend + + ClearCache + + 'If $aHeight.Count And If $aHeight[$aHeight.Max] >= GetView().Count Then Stop + 'If _GetHeight() <> _GetRowY($nRows - 1) + _GetRowHeight($nRows - 1) Then Stop + +End + +Public Sub _BeforeInsert(Y1 As Integer, N As Integer, cLineLayout As Collection) + + Dim I As Integer + Dim Y As Integer + + If Not $aHeight Then Return + + For I = $aHeight.Max DownTo 0 + Y = $aHeight[I] + If Y <= Y1 Then Break + $aHeight[I] = Y + N + $cHeight[Y + N] = $cHeight[Y] + $cHeight.Remove(Y) + cLineLayout[Y + N] = cLineLayout[Y] + cLineLayout.Remove(Y) + Next + + 'If $cHeight.Count <> $aHeight.Count Then Stop + + ClearCache + + 'If $aHeight And If $aHeight.Count And If $aHeight[$aHeight.Max] >= GetView().Count Then Stop + 'If _GetHeight() <> _GetRowY($nRows - 1) + _GetRowHeight($nRows - 1) Then Stop + +End + diff --git a/comp/src/gb.form.editor/.src/_TextEditor_State.class b/comp/src/gb.form.editor/.src/_TextEditor_State.class new file mode 100644 index 00000000..fcc6e08d --- /dev/null +++ b/comp/src/gb.form.editor/.src/_TextEditor_State.class @@ -0,0 +1,32 @@ +' Gambas class file + +Export + +Public _State As CLineInfo + +Property Read State As Byte +Property Read Tag As Short +Property Read Alternate As Boolean + + +Private Function State_Read() As Byte + + If _State Then + Return _State.State + Else + Return Highlight.Normal + Endif + +End + +Private Function Tag_Read() As Short + + If _State Then Return _State.Tag + +End + +Private Function Alternate_Read() As Boolean + + If _State Then Return _State.Alternate + +End diff --git a/comp/src/gb.form.editor/.src/_TextEditor_Styles.class b/comp/src/gb.form.editor/.src/_TextEditor_Styles.class new file mode 100644 index 00000000..e99c00db --- /dev/null +++ b/comp/src/gb.form.editor/.src/_TextEditor_Styles.class @@ -0,0 +1,73 @@ +' Gambas class file + +Export + +Event Change + +Private $aStyle As TextEditorStyle[] + +Public Sub _new() + + Dim I As Integer + + $aStyle = New TextEditorStyle[32] + + $aStyle[Highlight.Background] = New TextEditorStyle(Color.White) As "Style" + $aStyle[Highlight.Normal] = New TextEditorStyle(Color.Black) As "Style" + $aStyle[Highlight.Keyword] = New TextEditorStyle(Color.Black, True) As "Style" + $aStyle[Highlight.Datatype] = New TextEditorStyle(&HDF6B00&, True) As "Style" + $aStyle[Highlight.Function] = New TextEditorStyle(&H3398C3&, True) As "Style" + $aStyle[Highlight.Operator] = New TextEditorStyle(Color.Black, True) As "Style" + $aStyle[Highlight.Symbol] = New TextEditorStyle(Color.Black) As "Style" + $aStyle[Highlight.Number] = New TextEditorStyle(&HFF0000&, True) As "Style" + $aStyle[Highlight.String] = New TextEditorStyle(&H7F0000&) As "Style" + $aStyle[Highlight.Comment] = New TextEditorStyle(&H888888&, False) As "Style" + $aStyle[Highlight.Help] = New TextEditorStyle(&H888888&, True) As "Style" + $aStyle[Highlight.Preprocessor] = New TextEditorStyle(&H006E28&, True) As "Style" + $aStyle[Highlight.Breakpoint] = New TextEditorStyle(&HFF5F5F&) As "Style" + $aStyle[Highlight.Current] = New TextEditorStyle(&H42C9FF&) As "Style" + $aStyle[Highlight.Selection] = New TextEditorStyle(&HC3EDFF&) As "Style" + $aStyle[Highlight.Highlight] = New TextEditorStyle(&H7FFF00&) As "Style" + $aStyle[Highlight.CurrentLine] = New TextEditorStyle(&HE7F3FF&) As "Style" + $aStyle[Highlight.Error] = New TextEditorStyle(&HBF0303&, False, True) As "Style" + $aStyle[Highlight.Escape] = New TextEditorStyle(&H7F0000&, True, False, True) As "Style" + $aStyle[Highlight.Label] = New TextEditorStyle(Color.Black, False, False, True) As "Style" + $aStyle[Highlight.Constant] = New TextEditorStyle(&HA00000&, True) As "Style" + $aStyle[Highlight.Alternate] = New TextEditorStyle(&HE0E0E0&) As "Style" + $aStyle[Highlight.Added] = New TextEditorStyle(&00FF00) As "Style" + $aStyle[Highlight.Removed] = New TextEditorStyle(&FF8080) As "Style" + + For I = Highlight.Custom To $aStyle.Max + $aStyle[I] = New TextEditorStyle As "Style" + Next + +End + +Public Sub _GetStyles() As TextEditorStyle[] + + Return $aStyle + +End + + +Public Sub _get((Style) As Integer) As TextEditorStyle + + Dim hStyle As TextEditorStyle + + Try hStyle = $aStyle[Style] + If Error Then Error.Raise("Invalid argument") + If Not hStyle Then + hStyle = $aStyle[Highlight.Normal].Copy() + Object.Attach(hStyle, Me, "Style") + $aStyle[Style] = hStyle + Endif + + Return hStyle + +End + +Public Sub Style_Change() + + Raise Change + +End diff --git a/comp/src/gb.form.editor/.src/test/FTest.class b/comp/src/gb.form.editor/.src/test/FTest.class new file mode 100644 index 00000000..f841a530 --- /dev/null +++ b/comp/src/gb.form.editor/.src/test/FTest.class @@ -0,0 +1,10 @@ +' Gambas class file + + +Public Sub DrawingArea1_Draw() + + 'Paint.Font = Font["Liberation Mono,20"] + 'Debug Paint.Font.ToString() + Paint.DrawText("Gambas", 20, 20) + +End diff --git a/comp/src/gb.form.editor/.src/test/FTest.form b/comp/src/gb.form.editor/.src/test/FTest.form new file mode 100644 index 00000000..ebbfbec9 --- /dev/null +++ b/comp/src/gb.form.editor/.src/test/FTest.form @@ -0,0 +1,13 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,109,86) + { Panel1 Panel + MoveScaled(5,8,56,40) + Font = Font["Monospace,Italic"] + Border = Border.Plain + { DrawingArea1 DrawingArea + MoveScaled(3,2,46,30) + } + } +} diff --git a/comp/src/gb.form.editor/.src/test/FTestEditor.class b/comp/src/gb.form.editor/.src/test/FTestEditor.class new file mode 100644 index 00000000..19baf2e0 --- /dev/null +++ b/comp/src/gb.form.editor/.src/test/FTestEditor.class @@ -0,0 +1,222 @@ +' Gambas class file + +Private Sub Reload() + + 'Dim I As Integer + + ' System.Profile = False + ' 'TextEditor1.Load("~/test.txt") + ' For I = 1 To 100 + ' TextEditor1.Insert(String$(80, CStr(I) & " ") & "\n") + ' Next + ' System.Profile = True + + 'TextEditor1.Mode = "gambas" + 'TextEditor1.Load("~/gambas/3.0/test/test-git/CHANGELOG", True) + 'Dim I As Integer + + TextEditor1.Load("~/gambas/git/master/comp/src/gb.form.editor/.src/TextEditor.class", True) + + 'TextEditor1.Load("~/Fichier texte") + 'TextEditor1.Mode = "C" + 'TextEditor1.Load("~/gambas/git/master/main/lib/jit/gb.jit/gambas.h") + 'TextEditor1.Styles[Highlight.Custom].Background = Color.SetAlpha(Color.Red, 224) + 'TextEditor1.Styles[Highlight.Custom + 1].Background = Color.SetAlpha(Color.Green, 224) + + 'Button5_Click + +End + +Public Sub Form_Open() + + Application.Animations = True + Application.Shadows = True + + 'TextEditor1.LineNumberOffset = 10000 + + 'Image.Debug = True + + Reload + 'TextEditor1.Mode = "gambas" + 'TextEditor1.Load("~/asap/omogen/git/master/gambas/guygle.cgi/.src/GuygleObject.class") + + 'TextEditor1.Load("~/asap/guygle/trunk/gambas/guygle.cgi/.src/Site/Dialog.class") + 'TextEditor1.Load("~/gambas/3.0/issues/754/test/.src/Main.module") + 'TextEditor1.Load("~/gambas/3.0/trunk/comp/src/gb.form.editor/.src/TextEditor.class", True) + 'TextEditor1.Load("/var/log/thttpd/debug.log.old") + 'TextEditor1.Load("~/cosme/style.css") + 'TextEditor1.Load("~/gambas/3.0/trunk/app/src/gambas3/.src/Project.module") + 'TextEditor1.Load("~/gambas/3.0/trunk/gb.qt4/src/CWidget.cpp") + 'TextEditor1.Load("~/gambas/3.0/trunk/main/share/gb_reserved_temp.h") + 'TextEditor1.Goto(0, TextEditor1.Count - 1) + + 'TextEditor1.Highlight = "webpage" + 'TextEditor1.Load("test.html") + + ' For Each sLine In Split(File.Load("/proc/self/maps"), "\n") + ' If InStr(sLine, "[heap]") Then + ' aScan = Scan(sLine, "*-* *") + ' Print "------------ Heap size is " & Format(Val("&H" & aScan[1] & "&") - Val("&H" & aScan[0] & "&"), "#,##0") & " bytes." + ' Break + ' Endif + ' Next + + 'TextEditor2.View = TextEditor1 + + 'TextEditor1.Text = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz" + + 'TextEditor1.Text = "If sType = \"class\" And If Dir(File.Dir(sPath), File.BaseName(sPath) &/ \".*\").Count >= 2 Then Dec iCount\n'titi\n'tata" + + TextEditor1.SetFocus + +End + +Public Sub TextEditor1_Margin() + + TextEditor1[TextEditor1.Line].Breakpoint = Not TextEditor1[TextEditor1.Line].Breakpoint + +End + +Public Sub txtPrint_Activate() + + 'TextEditor1.Print(UnQuote(txtPrint.Text)) + TextEditor1.HighlightString(txtPrint.Text, True) + +End + +Public Sub Button1_Click() + + TextEditor1.Wrap = Not TextEditor1.Wrap + TextEditor1.SetFocus + +End + +Public Sub Button2_Click() + + TextEditor1.PrintCache + +End + +Public Sub txtPrint_KeyPress() + + Debug Key.Code;; Quote(Key.Text) + +End + +Public Sub Button3_Click() + + TextEditor1.Clear + +End + +Public Sub Button4_Click() + + Reload + +End + +' Public Sub Button5_Click() +' +' Dim sText As String +' Dim N As Integer +' Dim I As Integer +' Dim J As Integer +' +' TextEditor1.Mode = "javascript" +' +' sText = File.Load("~/asap/omogen/git/master/gambas/guygle.exec/.hidden/Uncompressed/planning.js") +' +' Do +' Inc N +' lblCount.Text = CStr(N) +' +' TextEditor1.Text = sText +' Wait +' +' For I = 1 To 100 +' TextEditor1.Goto(Rand(0, 255), Rand(0, TextEditor1.Count - 1)) +' Wait +' +' TextEditor1.Begin +' For J = 1 To 100 +' If Rnd < 0.1 Then +' TextEditor1.Insert("\n") +' Else +' TextEditor1.Insert("Gambas") +' Endif +' Next +' TextEditor1.End +' Wait 0.1 +' +' TextEditor1.Undo +' Wait +' +' Next +' +' TextEditor1.Text = MCompressFile.Javascript(sText) +' Wait +' +' For I = 1 To 100 +' TextEditor1.Goto(Rand(0, 255), Rand(0, TextEditor1.Count - 1)) +' Wait +' Next +' +' Loop +' +' End + +' Public Sub TextEditor1_Highlight(Text As String) +' +' If Text Begins "<<<<<<" Then +' TextHighlighter.Add(Highlight.Keyword, String.Len(Text)) +' TextHighlighter.State = Highlight.Custom +' Else If Text Begins "======" Then +' TextHighlighter.Add(Highlight.Help, String.Len(Text)) +' TextHighlighter.State = Highlight.Normal +' TextHighlighter.Tag = 1 +' Else If Text Begins ">>>>>>" Then +' TextHighlighter.Add(Highlight.Keyword, String.Len(Text)) +' TextHighlighter.State = Highlight.Custom + 1 +' TextHighlighter.Tag = 2 +' Else +' If TextHighlighter.Tag = 1 Then +' TextHighlighter.State = Highlight.Custom + 1 +' TextHighlighter.Tag = 0 +' Else If TextHighlighter.Tag = 2 Then +' TextHighlighter.State = Highlight.Normal +' TextHighlighter.Tag = 0 +' Endif +' TextHighlighter.Add(TextHighlighter.State, String.Len(Text)) +' Endif +' +' End + +Public Sub Button6_Click() + + TextEditor1[TextEditor1.Line].Bookmark = Not TextEditor1[TextEditor1.Line].Bookmark + +End + +Public Sub Button5_Click() + + Dim aText As String[] + Dim I As Integer + + If TextEditor1.DiffMode Then + TextEditor1.LeaveDiffMode() + Else + aText = New String[] + For I = 1 To 100 + aText.Add(String$(80, CStr(I) & ".")) + Next + TextEditor1.EnterDiffMode([3, 4, 12, 2, 20, 6], ["0": aText, "3": ["Différence", "sur plusieurs lignes", "c'est possible ?"]]) + Endif + +End + +Public Sub Button7_Click() + + TextEditor1.ShowPreview = Not TextEditor1.ShowPreview + Dec Me.W + +End diff --git a/comp/src/gb.form.editor/.src/test/FTestEditor.form b/comp/src/gb.form.editor/.src/test/FTestEditor.form new file mode 100644 index 00000000..81589294 --- /dev/null +++ b/comp/src/gb.form.editor/.src/test/FTestEditor.form @@ -0,0 +1,69 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,122,78) + Stacking = Window.Above + Arrangement = Arrange.Vertical + { Panel2 HBox + MoveScaled(2,2,105,4) + Spacing = True + { txtPrint TextBox + MoveScaled(0,0,24,4) + } + { Button1 Button + MoveScaled(25,0,9,4) + Text = ("Wrap") + } + { Button2 Button + MoveScaled(34,0,9,4) + Text = ("Cache") + } + { Button3 Button + MoveScaled(43,0,9,4) + Text = ("Clear") + } + { Button4 Button + MoveScaled(52,0,9,4) + Text = ("Reload") + } + { Button5 Button + MoveScaled(61,0,9,4) + Text = ("Diff") + } + { Button6 Button + MoveScaled(71,0,12,4) + Text = ("Bookmark") + } + { Button7 Button + MoveScaled(84,0,10,4) + Text = ("Preview") + } + } + { Panel1 VSplit + MoveScaled(8,11,76,52) + Expand = True + { TextEditor1 TextEditor + MoveScaled(14,5,47,33) + Font = Font["Gambas,10"] + Background = Color.TextBackground + Border = False + Mode = "Gambas" + ReadOnly = True + Wrap = True + ShowPosition = True + ShowLimit = True + ShowCurrent = True + ShowLineNumber = True + ShowBraces = True + ShowIcon = True + ShowExpand = True + ShowSpaces = True + ShowIndent = True + CloseBraces = True + CloseStrings = True + } + } + { Timer1 #Timer + #MoveScaled(48,67) + } +} diff --git a/comp/src/gb.form.editor/Text1 b/comp/src/gb.form.editor/Text1 new file mode 100644 index 00000000..15702b4a --- /dev/null +++ b/comp/src/gb.form.editor/Text1 @@ -0,0 +1,19 @@ + background: white; + margin: 0; + padding: 0; +} + +@page { + <%_PageLayout%> +} + +TR.light:hover { + background: none; +} + +TR.dark:hover { + background: #E5EAEE; +} + +#print { + display: none; \ No newline at end of file diff --git a/comp/src/gb.form.editor/test.html b/comp/src/gb.form.editor/test.html new file mode 100644 index 00000000..df374c3f --- /dev/null +++ b/comp/src/gb.form.editor/test.html @@ -0,0 +1,89 @@ +<> + +<%If Not Request.Exist("show")%> + + + + + + +

        +<%_Print()%> +
        +<%Else + _Show() +Endif%> + +<> + +?toto +?titi + + diff --git a/comp/src/gb.form.mdi/.component b/comp/src/gb.form.mdi/.component new file mode 100644 index 00000000..7fd6ad15 --- /dev/null +++ b/comp/src/gb.form.mdi/.component @@ -0,0 +1,6 @@ +[Component] +Key=gb.form.mdi +Version=3.15.90 +Authors=Benoît Minisini +Needs=Form +Requires=gb.form,gb.settings diff --git a/comp/src/gb.form.mdi/.directory b/comp/src/gb.form.mdi/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/comp/src/gb.form.mdi/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/comp/src/gb.form.mdi/.hidden/control/toolbar.png b/comp/src/gb.form.mdi/.hidden/control/toolbar.png new file mode 100644 index 0000000000000000000000000000000000000000..e4f9429826136ad20749d60cef365e5ca563d483 GIT binary patch literal 539 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyX99deT!HifFwkk)snxJk6O1$( zp$wIVZ4eR7hFw|>J2XLPr$WPi2m>YsQmoOi3(nPO*r5Ruftdzjv;y_+0t@cagqaW2 z0;XDMw|$FJ$8L?r-4MeeW&-U3>H=%r0d!$QLj%wUKn0nW z+G0TeIF!dWhZQK7!?tkf( zdF1BVS7DY978Nl-wir0cF2H-+xIkw z^r3sH`5M*1U;h7R*&<^h!Q_5H_1xxpYtmNS%G}U;vjb? zhIQv;UIICs1s;*bK&3}Om~pB$pEOXAC%`Af)hDy?|NsB>_4Nl19N1%RAP>@6666=m z;PC858jxe=>Eak7aXC3+Yt~huItd90DTx^p5)~ckYnT`nn0aOh^r&q(vP!LOS%87W i8J-!zhP4~HxESOw2J_F_=%fHNfx*+&&t;ucLK6VnF*m{h literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.mdi/.icon.png b/comp/src/gb.form.mdi/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7cc9a42767deb7feaf265ebfc6b9364a0e45d920 GIT binary patch literal 5376 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 R>_3~pN$ay#)yI62{s;KLK?nc< literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.mdi/.lang/ca.po b/comp/src/gb.form.mdi/.lang/ca.po new file mode 100644 index 00000000..276eb992 --- /dev/null +++ b/comp/src/gb.form.mdi/.lang/ca.po @@ -0,0 +1,160 @@ +# Catalan translation of gb.form.mdi +# Copyright (C) 2000-2010 Benoît Minisini. +# This file is distributed under the same license as gb.form.mdi package. +# Jordi Sayol , 2007-2010. +# +# +msgid "" +msgstr "" +"Project-Id-Version: gb.form.mdi\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2011-03-20 15:17+0100\n" +"Last-Translator: Jordi Sayol \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: FToolBarConfig.class:43 +msgid "'&1' toolbar configuration" +msgstr "Configuració barra d'eines '&1'" + +#: FShortcut.class:37 +msgid "Action" +msgstr "Acció" + +#: FMain.form:49 Form2.form:16 +msgid "Button1" +msgstr "Botó 1" + +#: FShortcut.form:60 FToolBarConfig.form:61 +msgid "Cancel" +msgstr "Canceŀla" + +#: FToolBarConfig.form:126 +msgid "&Close" +msgstr "&Tanca" + +#: FWorkspace.class:607 +msgid "Close &all other tabs" +msgstr "Tanca totes les &altres pestanyes" + +#: FWorkspace.class:602 +msgid "&Close current tab" +msgstr "&Tanta la pestanya actual" + +#: FToolBarConfig.form:81 +msgid "ComboBox1" +msgstr "Quadre combinat 1" + +#: FToolBarConfig.form:34 +msgid "Configure..." +msgstr "Configuració..." + +#: FToolBar.class:977 +msgid "Configure &1 toolbar" +msgstr "Configura la barra d'eines &1" + +#: FToolBar.class:979 +msgid "Configure main toolbar" +msgstr "Configura la barra d'eines principal" + +#: FShortcut.form:15 +msgid "Configure shortcuts" +msgstr "Configura les dreceres" + +#: FToolBarConfig.class:375 +msgid "Do you really want to reset the toolbar?" +msgstr "Voleu reinicialitzar la barra d'eines?" + +#: FToolBarConfig.class:162 +msgid "Expander" +msgstr "Extensor" + +#: FShortcut.form:37 +msgid "Find shortcut" +msgstr "Cerca drecera" + +#: FShortcut.class:161 +msgid "Go back" +msgstr "Enrere" + +#: FToolBarConfig.form:39 +msgid "Icon size" +msgstr "Mida de l'icona" + +#: FToolBarConfig.form:52 +msgid "Large" +msgstr "Gran" + +#: FToolBarConfig.form:47 +msgid "Medium" +msgstr "Mitjà" + +#: .project:1 +msgid "Multiple document interface management" +msgstr "Gestió de la interfície de documents múltiples" + +#: FWorkspace.form:35 +msgid "Next tab" +msgstr "Pestanya següent" + +#: FShortcut.form:54 +msgid "OK" +msgstr "D'acord" + +#: FMain.form:64 +msgid "Orientation" +msgstr "Orientació" + +#: FWorkspace.form:29 +msgid "Previous tab" +msgstr "Pestanya anterior" + +#: FShortcut.form:43 FToolBarConfig.class:375 +msgid "Reset" +msgstr "Reinicialitza" + +#: FToolBarConfig.form:113 +msgid "&Reset" +msgstr "&Reinicialitza" + +#: FToolBarConfig.class:159 +msgid "Separator" +msgstr "Separador" + +#: FShortcut.class:38 +msgid "Shortcut" +msgstr "Drecera" + +#: FToolBarConfig.form:42 +msgid "Small" +msgstr "Petit" + +#: FWorkspace.class:594 +msgid "&Sort tabs" +msgstr "&Ordena les pestanyes" + +#: FShortcutEditor.class:75 +msgid "This shortcut is already used by the following action:" +msgstr "Aquesta drecera encara la fa servir la següen acció:" + +#: FToolBarConfig.class:45 +msgid "Toolbar configuration" +msgstr "Configuració de barra d'eines" + +#: FToolBarConfig.form:120 +msgid "&Undo" +msgstr "&Desfés" + +#: FMain.form:59 +msgid "Window" +msgstr "Finestra" + +#: FShortcut.class:161 +msgid "You are going back to the default shortcuts." +msgstr "Esteu tornat a les dreceres predeterminades" + diff --git a/comp/src/gb.form.mdi/.lang/cs.po b/comp/src/gb.form.mdi/.lang/cs.po new file mode 100644 index 00000000..f1ed8096 --- /dev/null +++ b/comp/src/gb.form.mdi/.lang/cs.po @@ -0,0 +1,160 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Multiple document interface management" +msgstr "MDI rozhranní" + +#: FMain.form:49 FMain1.form:58 +msgid "Button1" +msgstr "-" + +#: FMain.form:59 +msgid "Window" +msgstr "Okno" + +#: FMain.form:64 +msgid "Orientation" +msgstr "Orientace" + +#: FMain1.form:44 +msgid "Help" +msgstr "Nápověda" + +#: FMain1.form:79 +msgid "Reparent" +msgstr "-" + +#: FShortcut.class:40 +msgid "Action" +msgstr "Akce" + +#: FShortcut.class:42 +msgid "Shortcut" +msgstr "Zkratka" + +#: FShortcut.class:170 +msgid "Go back" +msgstr "Vtátit se" + +#: FShortcut.class:170 +msgid "You are going back to the default shortcuts." +msgstr "Jděte zpět na výchozí zkratky." + +#: FShortcut.form:15 +msgid "Configure shortcuts" +msgstr "Nastavení zkratek" + +#: FShortcut.form:38 +msgid "Find shortcut" +msgstr "Najdi zkratku" + +#: FShortcut.form:44 FToolBarConfig.class:382 +msgid "Reset" +msgstr "Obnovit" + +#: FShortcut.form:55 +msgid "OK" +msgstr "-" + +#: FShortcut.form:61 FToolBarConfig.form:63 +msgid "Cancel" +msgstr "Zrušit" + +#: FShortcutEditor.class:75 +msgid "This shortcut is already used by the following action:" +msgstr "Zkratka se již používá na následující akci:" + +#: FToolBar.class:1105 +msgid "Configure &1 toolbar" +msgstr "Nastavit &1 panel nástrojů" + +#: FToolBar.class:1107 +msgid "Configure main toolbar" +msgstr "Nastavit hlavní panel nástrojů" + +#: FToolBarConfig.class:47 +msgid "'&1' toolbar configuration" +msgstr "'&1' nastaveni panelu nástrojů" + +#: FToolBarConfig.class:49 +msgid "Toolbar configuration" +msgstr "Nastavní panelu nástrojů" + +#: FToolBarConfig.class:141 +msgid "Separator" +msgstr "Oddělovač" + +#: FToolBarConfig.class:143 +msgid "Expander" +msgstr "-" + +#: FToolBarConfig.class:145 +msgid "Space" +msgstr "Mezera" + +#: FToolBarConfig.class:382 +msgid "Do you really want to reset the toolbar?" +msgstr "Opravdu chcete obnovit panel nástrojů?" + +#: FToolBarConfig.form:36 +msgid "Configure..." +msgstr "Nastavit..." + +#: FToolBarConfig.form:41 +msgid "Icon size" +msgstr "Velikost ikony" + +#: FToolBarConfig.form:44 +msgid "Small" +msgstr "Malé" + +#: FToolBarConfig.form:49 +msgid "Medium" +msgstr "Střední" + +#: FToolBarConfig.form:54 +msgid "Large" +msgstr "Velké" + +#: FToolBarConfig.form:129 +msgid "&Reset" +msgstr "O&bnovit" + +#: FToolBarConfig.form:136 +msgid "&Undo" +msgstr "&Zpět" + +#: FToolBarConfig.form:142 +msgid "&Close" +msgstr "Za&vřít" + +#: FWorkspace.class:587 +msgid "&Sort tabs" +msgstr "&Seřaď záložky" + +#: FWorkspace.class:595 +msgid "&Close current tab" +msgstr "&Zavři aktuální záložku" + +#: FWorkspace.class:600 +msgid "Close &all other tabs" +msgstr "Zavři &všechny ostatní záložky" + +#: FWorkspace.form:30 +msgid "Previous tab" +msgstr "Předchozí záložka" + +#: FWorkspace.form:36 +msgid "Next tab" +msgstr "Další záložka" diff --git a/comp/src/gb.form.mdi/.lang/de.po b/comp/src/gb.form.mdi/.lang/de.po new file mode 100644 index 00000000..4c611b6a --- /dev/null +++ b/comp/src/gb.form.mdi/.lang/de.po @@ -0,0 +1,270 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2018-06-16 14:02 UTC\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Multiple document interface management" +msgstr "MDI-Management" + +#: FMain.form:65 +msgid "Hello" +msgstr "" + +#: FMain.form:106 +msgid "Border" +msgstr "" + +#: FMain.form:111 +msgid "Window" +msgstr "Fenster" + +#: FMain.form:116 +msgid "Orientation" +msgstr "Orientierung" + +#: FMain1.form:44 +msgid "Help" +msgstr "Hilfe" + +#: FMain1.form:58 +msgid "Button1" +msgstr "-" + +#: FMain1.form:79 +msgid "Reparent" +msgstr "Neu zuordnen" + +#: FMain2.form:25 +msgid "Agnostic Scan Tool" +msgstr "" + +#: FMain2.form:30 +msgid "Menu1" +msgstr "" + +#: FMain2.form:35 +msgid "Save" +msgstr "" + +#: FMain2.form:41 +msgid "Save as" +msgstr "" + +#: FMain2.form:50 +msgid "Properties" +msgstr "" + +#: FMain2.form:59 +msgid "Quit" +msgstr "" + +#: FMain2.form:95 +msgid "Numériser Texte" +msgstr "" + +#: FShortcut.class:65 +msgid "Action" +msgstr "Aktion" + +#: FShortcut.class:67 +msgid "Shortcut" +msgstr "Kurzbefehl" + +#: FShortcut.class:178 +msgid "Go back" +msgstr "Zurück" + +#: FShortcut.class:178 +msgid "You are going back to the default shortcuts." +msgstr "Zurück zu den Standard-Kurzbefehlen." + +#: FShortcut.class:264 +msgid "Unable to export shortcut files." +msgstr "" + +#: FShortcut.class:281 +msgid "This file is not a Gambas shortcuts file." +msgstr "" + +#: FShortcut.class:305 +msgid "Unable to import shortcut files." +msgstr "" + +#: FShortcut.class:313 +msgid "Gambas shortcuts files" +msgstr "" + +#: FShortcut.class:314 +#, fuzzy +msgid "Export shortcuts" +msgstr "Kurzbefehle einrichten" + +#: FShortcut.class:327 +#, fuzzy +msgid "Import shortcuts" +msgstr "Kurzbefehle einrichten" + +#: FShortcut.form:17 +msgid "Configure shortcuts" +msgstr "Kurzbefehle einrichten" + +#: FShortcut.form:42 +msgid "Find shortcut" +msgstr "Kurzbefehl suchen" + +#: FShortcut.form:49 FToolBarConfig.form:127 +msgid "Reset" +msgstr "Zurücksetzen" + +#: FShortcut.form:55 +msgid "Import" +msgstr "" + +#: FShortcut.form:61 +msgid "Export" +msgstr "" + +#: FShortcut.form:72 +msgid "OK" +msgstr "-" + +#: FShortcut.form:78 FToolBarConfig.form:72 +msgid "Cancel" +msgstr "Abbrechen" + +#: FShortcutEditor.class:75 +msgid "This shortcut is already used by the following action:" +msgstr "Dieser Kurzbefehl ist bereits mit der folgenen Aktion belegt:" + +#: FToolBar.class:1215 +msgid "Configure &1 toolbar" +msgstr "Werkzeugleiste &1 einrichten" + +#: FToolBar.class:1217 +msgid "Configure main toolbar" +msgstr "Hauptwerkzeugleiste einrichten" + +#: FToolBarConfig.class:47 +msgid "'&1' toolbar configuration" +msgstr "Werkzeugleiste '&1' einrichten" + +#: FToolBarConfig.class:49 +msgid "Toolbar configuration" +msgstr "Werkzeugleiste einrichten" + +#: FToolBarConfig.class:146 +msgid "Separator" +msgstr "Trenner" + +#: FToolBarConfig.class:148 +msgid "Expander" +msgstr "Erweiterer" + +#: FToolBarConfig.class:150 +msgid "Space" +msgstr "Leerstelle" + +#: FToolBarConfig.class:387 +msgid "Do you really want to reset the toolbar?" +msgstr "Wollen Sie die Werkzeugleiste wirklich zurücksetzen?" + +#: FToolBarConfig.form:35 +#, fuzzy +msgid "Configure" +msgstr "Einrichten..." + +#: FToolBarConfig.form:40 +msgid "Icon size" +msgstr "Icon-Größe" + +#: FToolBarConfig.form:43 +msgid "Tiny" +msgstr "" + +#: FToolBarConfig.form:48 +msgid "Small" +msgstr "Klein" + +#: FToolBarConfig.form:53 +msgid "Medium" +msgstr "Mittel" + +#: FToolBarConfig.form:58 +msgid "Large" +msgstr "Groß" + +#: FToolBarConfig.form:63 +msgid "Huge" +msgstr "" + +#: FToolBarConfig.form:105 +msgid "Size" +msgstr "" + +#: FToolBarConfig.form:121 +#, fuzzy +msgid "Undo" +msgstr "&Rückgängig" + +#: FToolBarConfig.form:133 +#, fuzzy +msgid "Close" +msgstr "&Schließen" + +#: FWorkspace.form:36 +msgid "Show" +msgstr "" + +#: FWorkspace.form:41 +#, fuzzy +msgid "Sort tabs" +msgstr "Tabs &sortieren" + +#: FWorkspace.form:50 +#, fuzzy +msgid "Close tabs on the right" +msgstr "Schließe &alle anderen Tabs" + +#: FWorkspace.form:55 +#, fuzzy +msgid "Close other tabs" +msgstr "Schließe &alle anderen Tabs" + +#: FWorkspace.form:60 +#, fuzzy +msgid "Close all tabs" +msgstr "Schließe &alle anderen Tabs" + +#: FWorkspace.form:67 +msgid "Attach tab" +msgstr "" + +#: FWorkspace.form:71 +#, fuzzy +msgid "Detach tab" +msgstr "Nächster Tab" + +#: FWorkspace.form:76 +#, fuzzy +msgid "Close tab" +msgstr "Schließe aktuellen &Tab" + +#: FWorkspace.form:85 +msgid "Previous tab" +msgstr "Vorheriger Tab" + +#: FWorkspace.form:91 +msgid "Next tab" +msgstr "Nächster Tab" + +#~ msgid "&Reset" +#~ msgstr "Zu&rücksetzen" diff --git a/comp/src/gb.form.mdi/.lang/es.po b/comp/src/gb.form.mdi/.lang/es.po new file mode 100644 index 00000000..bb0c3940 --- /dev/null +++ b/comp/src/gb.form.mdi/.lang/es.po @@ -0,0 +1,215 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.form.mdi 3.8.90\n" +"PO-Revision-Date: 2015-09-20 17:53 UTC\n" +"Last-Translator: Jesus \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Multiple document interface management" +msgstr "Interfaz de administración de múltiples documentos" + +#: FMain.form:97 +msgid "Border" +msgstr "Borde" + +#: FMain.form:102 +msgid "Window" +msgstr "Ventana" + +#: FMain.form:107 +msgid "Orientation" +msgstr "Orientación" + +#: FMain1.form:44 +msgid "Help" +msgstr "Ayuda" + +#: FMain1.form:58 +msgid "Button1" +msgstr "-" + +#: FMain1.form:79 +msgid "Reparent" +msgstr "Cambiar padre" + +#: FShortcut.class:65 +msgid "Action" +msgstr "Acción" + +#: FShortcut.class:67 +msgid "Shortcut" +msgstr "Acceso directo" + +#: FShortcut.class:178 +msgid "Go back" +msgstr "Ir atrás" + +#: FShortcut.class:178 +msgid "You are going back to the default shortcuts." +msgstr "Esta restaurando los accesos directos a sus valores predeterminados." + +#: FShortcut.class:264 +msgid "Unable to export shortcut files." +msgstr "Imposible exportar archivo de atajos." + +#: FShortcut.class:281 +msgid "This file is not a Gambas shortcuts file." +msgstr "Este archivo no es un archivo de atajos de Gambas." + +#: FShortcut.class:305 +msgid "Unable to import shortcut files." +msgstr "Imposible importar archivo de atajos." + +#: FShortcut.class:313 +msgid "Gambas shortcuts files" +msgstr "Archivos de atajos Gambas" + +#: FShortcut.class:314 +msgid "Export shortcuts" +msgstr "Exportar atajos" + +#: FShortcut.class:327 +msgid "Import shortcuts" +msgstr "Importar atajos" + +#: FShortcut.form:17 +msgid "Configure shortcuts" +msgstr "Configurar accesos directos" + +#: FShortcut.form:42 +msgid "Find shortcut" +msgstr "Buscar acceso directo" + +#: FShortcut.form:49 FToolBarConfig.form:135 +msgid "Reset" +msgstr "Reiniciar" + +#: FShortcut.form:55 +msgid "Import" +msgstr "Importar" + +#: FShortcut.form:61 +msgid "Export" +msgstr "Exportar" + +#: FShortcut.form:72 +msgid "OK" +msgstr "OK" + +#: FShortcut.form:78 FToolBarConfig.form:69 +msgid "Cancel" +msgstr "Cancelar" + +#: FShortcutEditor.class:75 +msgid "This shortcut is already used by the following action:" +msgstr "Este acceso directo ya está usado por la siguiente acción:" + +#: FToolBar.class:1195 +msgid "Configure &1 toolbar" +msgstr "Configurar la barra de herramientas &1" + +#: FToolBar.class:1197 +msgid "Configure main toolbar" +msgstr "Configurar la barra de herramientas principal" + +#: FToolBarConfig.class:47 +msgid "'&1' toolbar configuration" +msgstr "Configuración de la barra de herramientas '&1' " + +#: FToolBarConfig.class:49 +msgid "Toolbar configuration" +msgstr "Configuración de la barra de herramientas" + +#: FToolBarConfig.class:142 +msgid "Separator" +msgstr "Separador" + +#: FToolBarConfig.class:144 +msgid "Expander" +msgstr "Expansor" + +#: FToolBarConfig.class:146 +msgid "Space" +msgstr "Espacio" + +#: FToolBarConfig.class:382 +msgid "Do you really want to reset the toolbar?" +msgstr "¿Realmente desea restaurar la barra de herramientas?" + +#: FToolBarConfig.form:37 +msgid "Configure" +msgstr "Configurar" + +#: FToolBarConfig.form:42 +msgid "Icon size" +msgstr "Tamaño del icono" + +#: FToolBarConfig.form:45 +msgid "Small" +msgstr "Pequeño" + +#: FToolBarConfig.form:50 +msgid "Medium" +msgstr "Medio" + +#: FToolBarConfig.form:55 +msgid "Large" +msgstr "Largo" + +#: FToolBarConfig.form:60 +msgid "Huge" +msgstr "Muy grande" + +#: FToolBarConfig.form:142 +msgid "Undo" +msgstr "Deshacer" + +#: FToolBarConfig.form:148 +msgid "Close" +msgstr "Cerrar" + +#: FWorkspace.form:36 +msgid "Show" +msgstr "Mostrar" + +#: FWorkspace.form:41 +msgid "Sort tabs" +msgstr "Ordenar pestañas" + +#: FWorkspace.form:50 +msgid "Close tabs on the right" +msgstr "Cerrar las pestañas de la derecha" + +#: FWorkspace.form:55 +msgid "Close other tabs" +msgstr "Cerrar las otras pestañas" + +#: FWorkspace.form:60 +msgid "Close all tabs" +msgstr "Cerrar todas las pestañas" + +#: FWorkspace.form:67 +msgid "Attach tab" +msgstr "Anclar pestaña" + +#: FWorkspace.form:71 +msgid "Detach tab" +msgstr "Desanclar pestaña" + +#: FWorkspace.form:76 +msgid "Close tab" +msgstr "Cerrar pestaña" + +#: FWorkspace.form:85 +msgid "Previous tab" +msgstr "Pestaña anterior" + +#: FWorkspace.form:91 +msgid "Next tab" +msgstr "Pestaña siguiente" + diff --git a/comp/src/gb.form.mdi/.lang/es_ES.po b/comp/src/gb.form.mdi/.lang/es_ES.po new file mode 100644 index 00000000..fa874176 --- /dev/null +++ b/comp/src/gb.form.mdi/.lang/es_ES.po @@ -0,0 +1,215 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.form.mdi 3.8.90\n" +"PO-Revision-Date: 2015-09-20 17:52 UTC\n" +"Last-Translator: Jesus \n" +"Language: es_ES\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Multiple document interface management" +msgstr "Interfaz de administración de múltiples documentos" + +#: FMain.form:97 +msgid "Border" +msgstr "Borde" + +#: FMain.form:102 +msgid "Window" +msgstr "Ventana" + +#: FMain.form:107 +msgid "Orientation" +msgstr "Orientación" + +#: FMain1.form:44 +msgid "Help" +msgstr "Ayuda" + +#: FMain1.form:58 +msgid "Button1" +msgstr "-" + +#: FMain1.form:79 +msgid "Reparent" +msgstr "Cambiar padre" + +#: FShortcut.class:65 +msgid "Action" +msgstr "Acción" + +#: FShortcut.class:67 +msgid "Shortcut" +msgstr "Acceso directo" + +#: FShortcut.class:178 +msgid "Go back" +msgstr "Ir atrás" + +#: FShortcut.class:178 +msgid "You are going back to the default shortcuts." +msgstr "Esta restaurando los accesos directos a sus valores predeterminados." + +#: FShortcut.class:264 +msgid "Unable to export shortcut files." +msgstr "Imposible exportar archivo de atajos." + +#: FShortcut.class:281 +msgid "This file is not a Gambas shortcuts file." +msgstr "Este archivo no es un archivo de atajos de Gambas." + +#: FShortcut.class:305 +msgid "Unable to import shortcut files." +msgstr "Imposible importar archivo de atajos." + +#: FShortcut.class:313 +msgid "Gambas shortcuts files" +msgstr "Archivos de atajos Gambas" + +#: FShortcut.class:314 +msgid "Export shortcuts" +msgstr "Exportar atajos" + +#: FShortcut.class:327 +msgid "Import shortcuts" +msgstr "Importar atajos" + +#: FShortcut.form:17 +msgid "Configure shortcuts" +msgstr "Configurar accesos directos" + +#: FShortcut.form:42 +msgid "Find shortcut" +msgstr "Buscar atajo" + +#: FShortcut.form:49 FToolBarConfig.form:135 +msgid "Reset" +msgstr "Reiniciar" + +#: FShortcut.form:55 +msgid "Import" +msgstr "Importar" + +#: FShortcut.form:61 +msgid "Export" +msgstr "Exportar" + +#: FShortcut.form:72 +msgid "OK" +msgstr "OK" + +#: FShortcut.form:78 FToolBarConfig.form:69 +msgid "Cancel" +msgstr "Cancelar" + +#: FShortcutEditor.class:75 +msgid "This shortcut is already used by the following action:" +msgstr "Este acceso directo ya está usado por la siguiente acción:" + +#: FToolBar.class:1195 +msgid "Configure &1 toolbar" +msgstr "Configurar la barra de herramientas &1" + +#: FToolBar.class:1197 +msgid "Configure main toolbar" +msgstr "Configurar la barra de herramientas principal" + +#: FToolBarConfig.class:47 +msgid "'&1' toolbar configuration" +msgstr "Configuración de la barra de herramientas '&1' " + +#: FToolBarConfig.class:49 +msgid "Toolbar configuration" +msgstr "Configuración de la barra de herramientas" + +#: FToolBarConfig.class:142 +msgid "Separator" +msgstr "Separador" + +#: FToolBarConfig.class:144 +msgid "Expander" +msgstr "Expansor" + +#: FToolBarConfig.class:146 +msgid "Space" +msgstr "Espacio" + +#: FToolBarConfig.class:382 +msgid "Do you really want to reset the toolbar?" +msgstr "¿Realmente desea restaurar la barra de herramientas?" + +#: FToolBarConfig.form:37 +msgid "Configure" +msgstr "Configurar" + +#: FToolBarConfig.form:42 +msgid "Icon size" +msgstr "Tamaño del icono" + +#: FToolBarConfig.form:45 +msgid "Small" +msgstr "Pequeño" + +#: FToolBarConfig.form:50 +msgid "Medium" +msgstr "Mediano" + +#: FToolBarConfig.form:55 +msgid "Large" +msgstr "Grande" + +#: FToolBarConfig.form:60 +msgid "Huge" +msgstr "Muy grande" + +#: FToolBarConfig.form:142 +msgid "Undo" +msgstr "Deshacer" + +#: FToolBarConfig.form:148 +msgid "Close" +msgstr "Cerrar" + +#: FWorkspace.form:36 +msgid "Show" +msgstr "Mostrar" + +#: FWorkspace.form:41 +msgid "Sort tabs" +msgstr "Ordenar pestañas" + +#: FWorkspace.form:50 +msgid "Close tabs on the right" +msgstr "Cerrar las pestañas de la derecha" + +#: FWorkspace.form:55 +msgid "Close other tabs" +msgstr "Cerrar las otras pestañas" + +#: FWorkspace.form:60 +msgid "Close all tabs" +msgstr "Cerrar todas las pestañas" + +#: FWorkspace.form:67 +msgid "Attach tab" +msgstr "Anclar pestaña" + +#: FWorkspace.form:71 +msgid "Detach tab" +msgstr "Desanclar pestaña" + +#: FWorkspace.form:76 +msgid "Close tab" +msgstr "Cerrar pestaña" + +#: FWorkspace.form:85 +msgid "Previous tab" +msgstr "Pestaña anterior" + +#: FWorkspace.form:91 +msgid "Next tab" +msgstr "Pestaña siguiente" + diff --git a/comp/src/gb.form.mdi/.lang/fr.po b/comp/src/gb.form.mdi/.lang/fr.po new file mode 100644 index 00000000..6cab6ffb --- /dev/null +++ b/comp/src/gb.form.mdi/.lang/fr.po @@ -0,0 +1,255 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.form.mdi 3.10.90\n" +"POT-Creation-Date: 2018-06-16 14:05 UTC\n" +"PO-Revision-Date: 2018-03-17 10:03 UTC\n" +"Last-Translator: benoit \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Multiple document interface management" +msgstr "Interface de gestion multi document." + +#: FMain.form:65 +msgid "Hello" +msgstr "" + +#: FMain.form:106 +msgid "Border" +msgstr "" + +#: FMain.form:111 +msgid "Window" +msgstr "" + +#: FMain.form:116 +msgid "Orientation" +msgstr "" + +#: FMain1.form:44 +msgid "Help" +msgstr "" + +#: FMain1.form:58 +msgid "Button1" +msgstr "" + +#: FMain1.form:79 +msgid "Reparent" +msgstr "" + +#: FMain2.form:25 +msgid "Agnostic Scan Tool" +msgstr "" + +#: FMain2.form:30 +msgid "Menu1" +msgstr "" + +#: FMain2.form:35 +msgid "Save" +msgstr "" + +#: FMain2.form:41 +msgid "Save as" +msgstr "" + +#: FMain2.form:50 +msgid "Properties" +msgstr "" + +#: FMain2.form:59 +msgid "Quit" +msgstr "" + +#: FMain2.form:95 +msgid "Numériser Texte" +msgstr "" + +#: FShortcut.class:65 +msgid "Action" +msgstr "Action" + +#: FShortcut.class:67 +msgid "Shortcut" +msgstr "Raccourci" + +#: FShortcut.class:178 +msgid "Go back" +msgstr "Revenir" + +#: FShortcut.class:178 +msgid "You are going back to the default shortcuts." +msgstr "Vous allez revenir aux raccourcis initiaux." + +#: FShortcut.class:264 +msgid "Unable to export shortcut files." +msgstr "Impossible d'exporter les fichiers de raccourcis." + +#: FShortcut.class:281 +msgid "This file is not a Gambas shortcuts file." +msgstr "Ce fichier n'est pas un fichier de raccourcis Gambas." + +#: FShortcut.class:305 +msgid "Unable to import shortcut files." +msgstr "Impossible d'importer les fichiers de raccourcis." + +#: FShortcut.class:313 +msgid "Gambas shortcuts files" +msgstr "Fichiers de raccourcis Gambas" + +#: FShortcut.class:314 +msgid "Export shortcuts" +msgstr "Exporter les raccourcis" + +#: FShortcut.class:327 +msgid "Import shortcuts" +msgstr "Importer des raccourcis" + +#: FShortcut.form:17 +msgid "Configure shortcuts" +msgstr "Configurer les raccourcis" + +#: FShortcut.form:42 +msgid "Find shortcut" +msgstr "Trouver un raccourci" + +#: FShortcut.form:49 FToolBarConfig.form:127 +msgid "Reset" +msgstr "Réinitialiser" + +#: FShortcut.form:55 +msgid "Import" +msgstr "Importer" + +#: FShortcut.form:61 +msgid "Export" +msgstr "Exporter" + +#: FShortcut.form:72 +msgid "OK" +msgstr "OK" + +#: FShortcut.form:78 FToolBarConfig.form:72 +msgid "Cancel" +msgstr "Annuler" + +#: FShortcutEditor.class:75 +msgid "This shortcut is already used by the following action:" +msgstr "Ce raccourci est déjà utilisé par l'action suivante:" + +#: FToolBar.class:1215 +msgid "Configure &1 toolbar" +msgstr "Configurer la barre d'outils &1" + +#: FToolBar.class:1217 +msgid "Configure main toolbar" +msgstr "Configurer la barre d'outils principale" + +#: FToolBarConfig.class:47 +msgid "'&1' toolbar configuration" +msgstr "Configuration de la barre d'outils « &1 »" + +#: FToolBarConfig.class:49 +msgid "Toolbar configuration" +msgstr "Configuration de la barre d'outils" + +#: FToolBarConfig.class:146 +msgid "Separator" +msgstr "Séparateur" + +#: FToolBarConfig.class:148 +msgid "Expander" +msgstr "Extenseur" + +#: FToolBarConfig.class:150 +msgid "Space" +msgstr "Espace" + +#: FToolBarConfig.class:387 +msgid "Do you really want to reset the toolbar?" +msgstr "Désirez-vous vraiment réinitialiser la barre d'outils ?" + +#: FToolBarConfig.form:35 +msgid "Configure" +msgstr "Configurer" + +#: FToolBarConfig.form:40 +msgid "Icon size" +msgstr "Taille des icônes" + +#: FToolBarConfig.form:43 +msgid "Tiny" +msgstr "Minuscule" + +#: FToolBarConfig.form:48 +msgid "Small" +msgstr "Petite" + +#: FToolBarConfig.form:53 +msgid "Medium" +msgstr "Moyenne" + +#: FToolBarConfig.form:58 +msgid "Large" +msgstr "Grande" + +#: FToolBarConfig.form:63 +msgid "Huge" +msgstr "Enorme" + +#: FToolBarConfig.form:105 +msgid "Size" +msgstr "Taille" + +#: FToolBarConfig.form:121 +msgid "Undo" +msgstr "Annuler" + +#: FToolBarConfig.form:133 +msgid "Close" +msgstr "Fermer" + +#: FWorkspace.form:36 +msgid "Show" +msgstr "Afficher" + +#: FWorkspace.form:41 +msgid "Sort tabs" +msgstr "Trier les onglets" + +#: FWorkspace.form:50 +msgid "Close tabs on the right" +msgstr "Fermer les onglets à droite" + +#: FWorkspace.form:55 +msgid "Close other tabs" +msgstr "Fermer les autres onglets" + +#: FWorkspace.form:60 +msgid "Close all tabs" +msgstr "Fermer tous les onglets" + +#: FWorkspace.form:67 +msgid "Attach tab" +msgstr "Attacher l'onglet" + +#: FWorkspace.form:71 +msgid "Detach tab" +msgstr "Détacher l'onglet" + +#: FWorkspace.form:76 +msgid "Close tab" +msgstr "Fermer l'onglet" + +#: FWorkspace.form:85 +msgid "Previous tab" +msgstr "Onglet précédent" + +#: FWorkspace.form:91 +msgid "Next tab" +msgstr "Onglet suivant" diff --git a/comp/src/gb.form.mdi/.lang/it.po b/comp/src/gb.form.mdi/.lang/it.po new file mode 100644 index 00000000..7fd18baa --- /dev/null +++ b/comp/src/gb.form.mdi/.lang/it.po @@ -0,0 +1,199 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.form.mdi 3.12.90\n" +"PO-Revision-Date: 2019-01-15 14:39 UTC\n" +"Last-Translator: gian \n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Multiple document interface management" +msgstr "Interfaccia di gestione multi documento" + +#: FShortcut.class:65 +msgid "Action" +msgstr "Action" + +#: FShortcut.class:67 +msgid "Shortcut" +msgstr "Scorciatoia da tastiera" + +#: FShortcut.class:178 +msgid "Go back" +msgstr "Torna indietro" + +#: FShortcut.class:178 +msgid "You are going back to the default shortcuts." +msgstr "Stai ritornando alle scorciatoie da tastiera predefinite." + +#: FShortcut.class:264 +msgid "Unable to export shortcut files." +msgstr "Impossibile esportare i file delle scorciatoie da tastiera." + +#: FShortcut.class:281 +msgid "This file is not a Gambas shortcuts file." +msgstr "Questo file non è un file di scorciatoie da tastiera Gambas" + +#: FShortcut.class:305 +msgid "Unable to import shortcut files." +msgstr "Impossibile importare i file delle scorciatoie da tastiera." + +#: FShortcut.class:313 +msgid "Gambas shortcuts files" +msgstr "File delle scorciatoie da tastiera di Gambas" + +#: FShortcut.class:314 +msgid "Export shortcuts" +msgstr "Esporta le scorciatoie da tastiera" + +#: FShortcut.class:327 +msgid "Import shortcuts" +msgstr "Importa le scorciatoie da tastiera" + +#: FShortcut.form:17 +msgid "Configure shortcuts" +msgstr "Configura le scorciatoie da tastiera" + +#: FShortcut.form:42 +msgid "Find shortcut" +msgstr "Trova la scorciatoia da tastiera" + +#: FShortcut.form:49 FToolBarConfig.form:127 +msgid "Reset" +msgstr "Resetta" + +#: FShortcut.form:55 +msgid "Import" +msgstr "Importa" + +#: FShortcut.form:61 +msgid "Export" +msgstr "Esporta" + +#: FShortcut.form:72 +msgid "OK" +msgstr "OK" + +#: FShortcut.form:78 FToolBarConfig.form:72 +msgid "Cancel" +msgstr "Annulla" + +#: FShortcutEditor.class:75 +msgid "This shortcut is already used by the following action:" +msgstr "Questa scorciatoia da tastiera è già in uso dalla seguente azione:" + +#: FToolBar.class:1215 +msgid "Configure &1 toolbar" +msgstr "Configura la barra degli strumenti &1" + +#: FToolBar.class:1217 +msgid "Configure main toolbar" +msgstr "Configura la barra degli strumenti principale" + +#: FToolBarConfig.class:47 +msgid "'&1' toolbar configuration" +msgstr "Configurazione della barra degli strumenti '&1'" + +#: FToolBarConfig.class:49 +msgid "Toolbar configuration" +msgstr "Configurazione della barra degli strumenti" + +#: FToolBarConfig.class:146 +msgid "Separator" +msgstr "Separatore" + +#: FToolBarConfig.class:148 +msgid "Expander" +msgstr "Espandi" + +#: FToolBarConfig.class:150 +msgid "Space" +msgstr "Spazio" + +#: FToolBarConfig.class:387 +msgid "Do you really want to reset the toolbar?" +msgstr "Vuoi veramente resettare la barra degli strumenti?" + +#: FToolBarConfig.form:35 +msgid "Configure" +msgstr "Configura" + +#: FToolBarConfig.form:40 +msgid "Icon size" +msgstr "Misura dell'icona" + +#: FToolBarConfig.form:43 +msgid "Tiny" +msgstr "Molto piccolo" + +#: FToolBarConfig.form:48 +msgid "Small" +msgstr "Piccolo" + +#: FToolBarConfig.form:53 +msgid "Medium" +msgstr "Medio" + +#: FToolBarConfig.form:58 +msgid "Large" +msgstr "Grande" + +#: FToolBarConfig.form:63 +msgid "Huge" +msgstr "Molto grande" + +#: FToolBarConfig.form:105 +msgid "Size" +msgstr "Misura" + +#: FToolBarConfig.form:121 +msgid "Undo" +msgstr "Annulla" + +#: FToolBarConfig.form:133 +msgid "Close" +msgstr "Chiudi" + +#: FWorkspace.form:36 +msgid "Show" +msgstr "Mostra" + +#: FWorkspace.form:41 +msgid "Sort tabs" +msgstr "Ordina le chede" + +#: FWorkspace.form:50 +msgid "Close tabs on the right" +msgstr "Chiudi le schede sulla destra" + +#: FWorkspace.form:55 +msgid "Close other tabs" +msgstr "Chiudi le altre schede" + +#: FWorkspace.form:60 +msgid "Close all tabs" +msgstr "Chiudi tutte le schede" + +#: FWorkspace.form:67 +msgid "Attach tab" +msgstr "Aggiungi scheda" + +#: FWorkspace.form:71 +msgid "Detach tab" +msgstr "Rimuovi scheda" + +#: FWorkspace.form:76 +msgid "Close tab" +msgstr "Chiudi scheda" + +#: FWorkspace.form:85 +msgid "Previous tab" +msgstr "Scheda precedente" + +#: FWorkspace.form:91 +msgid "Next tab" +msgstr "Scheda successiva" + diff --git a/comp/src/gb.form.mdi/.lang/ja.po b/comp/src/gb.form.mdi/.lang/ja.po new file mode 100644 index 00000000..88cc65aa --- /dev/null +++ b/comp/src/gb.form.mdi/.lang/ja.po @@ -0,0 +1,39 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: FMain.class:49 +msgid "Button4" +msgstr "" + +#: FMain.class:65 Form2.class:22 +msgid "Button1" +msgstr "" + +#: FMain.class:70 +msgid "Button2" +msgstr "" + +#: FMain.class:75 +msgid "Button3" +msgstr "" + +#: FWorkspace.class:617 +msgid "&Close current tab" +msgstr "現在のタブを閉じる(&C)" + +#: FWorkspace.class:622 +msgid "Close &all other tabs" +msgstr "その他の全てのタブを閉じる(&A)" + +#: FWorkspace.class:772 +msgid "Close current tab" +msgstr "現在のタブを閉じる" diff --git a/comp/src/gb.form.mdi/.lang/nl.po b/comp/src/gb.form.mdi/.lang/nl.po new file mode 100644 index 00000000..a2e0dc2c --- /dev/null +++ b/comp/src/gb.form.mdi/.lang/nl.po @@ -0,0 +1,200 @@ +# Willy Raets < gbWilly@openmailbox.org >, 2014 +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.form.mdi 3.12.2\n" +"PO-Revision-Date: 2019-04-06 18:36 UTC\n" +"Last-Translator: gbWilly \n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Multiple document interface management" +msgstr "Multiple document interface beheer" + +#: FShortcut.class:65 +msgid "Action" +msgstr "Actie" + +#: FShortcut.class:67 +msgid "Shortcut" +msgstr "Snelkoppeling" + +#: FShortcut.class:178 +msgid "Go back" +msgstr "Ga terug" + +#: FShortcut.class:178 +msgid "You are going back to the default shortcuts." +msgstr "Je gaat terug naar de standaard snelkoppelingen." + +#: FShortcut.class:264 +msgid "Unable to export shortcut files." +msgstr "Niet in staat om snelkoppeling bestanden te exporteren." + +#: FShortcut.class:281 +msgid "This file is not a Gambas shortcuts file." +msgstr "Dit bestand is geen Gambas snelkoppeling bestand." + +#: FShortcut.class:305 +msgid "Unable to import shortcut files." +msgstr "Niet in staat om snelkoppeling bestanden te importeren." + +#: FShortcut.class:313 +msgid "Gambas shortcuts files" +msgstr "Gambas snelkoppeling bestanden" + +#: FShortcut.class:314 +msgid "Export shortcuts" +msgstr "Exporteer snelkoppeling" + +#: FShortcut.class:327 +msgid "Import shortcuts" +msgstr "Importeer snelkoppelingen" + +#: FShortcut.form:17 +msgid "Configure shortcuts" +msgstr "Snelkoppelingen configureren" + +#: FShortcut.form:42 +msgid "Find shortcut" +msgstr "Vind snelkoppeling" + +#: FShortcut.form:49 FToolBarConfig.form:127 +msgid "Reset" +msgstr "Opnieuw instellen" + +#: FShortcut.form:55 +msgid "Import" +msgstr "Importeer" + +#: FShortcut.form:61 +msgid "Export" +msgstr "Exporteer" + +#: FShortcut.form:72 +msgid "OK" +msgstr "OK" + +#: FShortcut.form:78 FToolBarConfig.form:72 +msgid "Cancel" +msgstr "Annuleren" + +#: FShortcutEditor.class:75 +msgid "This shortcut is already used by the following action:" +msgstr "Deze snelkoppeling is reeds gebruikt door de volgende actie:" + +#: FToolBar.class:1215 +msgid "Configure &1 toolbar" +msgstr "Configureer &1 werkbalk" + +#: FToolBar.class:1217 +msgid "Configure main toolbar" +msgstr "Configureer hoofdwerkbalk" + +#: FToolBarConfig.class:47 +msgid "'&1' toolbar configuration" +msgstr "'&1' werkbalk configuratie" + +#: FToolBarConfig.class:49 +msgid "Toolbar configuration" +msgstr "Werkbalk configuratie" + +#: FToolBarConfig.class:146 +msgid "Separator" +msgstr "Scheiding" + +#: FToolBarConfig.class:148 +msgid "Expander" +msgstr "Expander" + +#: FToolBarConfig.class:150 +msgid "Space" +msgstr "Spatie" + +#: FToolBarConfig.class:387 +msgid "Do you really want to reset the toolbar?" +msgstr "Wil je werkelijk de werkbalk resetten?" + +#: FToolBarConfig.form:35 +msgid "Configure" +msgstr "Configureer" + +#: FToolBarConfig.form:40 +msgid "Icon size" +msgstr "Afmeting icoon" + +#: FToolBarConfig.form:43 +msgid "Tiny" +msgstr "Klein" + +#: FToolBarConfig.form:48 +msgid "Small" +msgstr "Klein" + +#: FToolBarConfig.form:53 +msgid "Medium" +msgstr "Middel" + +#: FToolBarConfig.form:58 +msgid "Large" +msgstr "Groot" + +#: FToolBarConfig.form:63 +msgid "Huge" +msgstr "Reusachtig" + +#: FToolBarConfig.form:105 +msgid "Size" +msgstr "Grootte" + +#: FToolBarConfig.form:121 +msgid "Undo" +msgstr "Ongedaan maken" + +#: FToolBarConfig.form:133 +msgid "Close" +msgstr "Sluiten" + +#: FWorkspace.form:36 +msgid "Show" +msgstr "Toon" + +#: FWorkspace.form:41 +msgid "Sort tabs" +msgstr "Sorteer tabs" + +#: FWorkspace.form:50 +msgid "Close tabs on the right" +msgstr "Sluit tabs aan de rechterkant" + +#: FWorkspace.form:55 +msgid "Close other tabs" +msgstr "Sluit overige tabs" + +#: FWorkspace.form:60 +msgid "Close all tabs" +msgstr "Sluit alle tabs" + +#: FWorkspace.form:67 +msgid "Attach tab" +msgstr "Tab bevestigen" + +#: FWorkspace.form:71 +msgid "Detach tab" +msgstr "Tab loskoppelen" + +#: FWorkspace.form:76 +msgid "Close tab" +msgstr "Sluit tab" + +#: FWorkspace.form:85 +msgid "Previous tab" +msgstr "Vorige tab" + +#: FWorkspace.form:91 +msgid "Next tab" +msgstr "Volgende tab" + diff --git a/comp/src/gb.form.mdi/.lang/pt_BR.po b/comp/src/gb.form.mdi/.lang/pt_BR.po new file mode 100644 index 00000000..fc98b042 --- /dev/null +++ b/comp/src/gb.form.mdi/.lang/pt_BR.po @@ -0,0 +1,199 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.form.mdi 3.14.90\n" +"PO-Revision-Date: 2020-06-12 05:15 UTC\n" +"Last-Translator: Gen Braga \n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Multiple document interface management" +msgstr "Gerenciamento de interface de múltiplos documentos (MDI)" + +#: FShortcut.class:65 +msgid "Action" +msgstr "Ação" + +#: FShortcut.class:67 +msgid "Shortcut" +msgstr "Tecla de atalho" + +#: FShortcut.class:178 +msgid "Go back" +msgstr "Voltar" + +#: FShortcut.class:178 +msgid "You are going back to the default shortcuts." +msgstr "Você está revertendo para as teclas de talhos padrão." + +#: FShortcut.class:264 +msgid "Unable to export shortcut files." +msgstr "Não foi possível exportar arquivos de teclas de atalho." + +#: FShortcut.class:281 +msgid "This file is not a Gambas shortcuts file." +msgstr "Este arquivo não é um arquivo de teclas de atalho do Gambas." + +#: FShortcut.class:305 +msgid "Unable to import shortcut files." +msgstr "Não foi possível importar arquivos de teclas de atalho." + +#: FShortcut.class:313 +msgid "Gambas shortcuts files" +msgstr "Arquivos de teclas de atalho do Gambas" + +#: FShortcut.class:314 +msgid "Export shortcuts" +msgstr "Exportar teclas de atalho" + +#: FShortcut.class:327 +msgid "Import shortcuts" +msgstr "Importar teclas de atalho" + +#: FShortcut.form:17 +msgid "Configure shortcuts" +msgstr "Configurar teclas de atalhos" + +#: FShortcut.form:42 +msgid "Find shortcut" +msgstr "Procurar teclas de atalho" + +#: FShortcut.form:49 FToolBarConfig.form:127 +msgid "Reset" +msgstr "Redefinir" + +#: FShortcut.form:55 +msgid "Import" +msgstr "Importar" + +#: FShortcut.form:61 +msgid "Export" +msgstr "Exportar" + +#: FShortcut.form:72 +msgid "OK" +msgstr "OK" + +#: FShortcut.form:78 FToolBarConfig.form:72 +msgid "Cancel" +msgstr "Cancelar" + +#: FShortcutEditor.class:75 +msgid "This shortcut is already used by the following action:" +msgstr "Esta tecla de atalho já está sendo usada para a seguinte ação:" + +#: FToolBar.class:1215 +msgid "Configure &1 toolbar" +msgstr "Configurar barra &1" + +#: FToolBar.class:1217 +msgid "Configure main toolbar" +msgstr "Configurar barra principal" + +#: FToolBarConfig.class:47 +msgid "'&1' toolbar configuration" +msgstr "Configuração da barra '&1'" + +#: FToolBarConfig.class:49 +msgid "Toolbar configuration" +msgstr "Configuração da barra" + +#: FToolBarConfig.class:146 +msgid "Separator" +msgstr "Separador" + +#: FToolBarConfig.class:148 +msgid "Expander" +msgstr "Expansor" + +#: FToolBarConfig.class:150 +msgid "Space" +msgstr "Espaço" + +#: FToolBarConfig.class:387 +msgid "Do you really want to reset the toolbar?" +msgstr "Você realmente deseja redefinir a barra?" + +#: FToolBarConfig.form:35 +msgid "Configure" +msgstr "Configurar" + +#: FToolBarConfig.form:40 +msgid "Icon size" +msgstr "Tamanho do ícone" + +#: FToolBarConfig.form:43 +msgid "Tiny" +msgstr "Minúsculo" + +#: FToolBarConfig.form:48 +msgid "Small" +msgstr "Pequeno" + +#: FToolBarConfig.form:53 +msgid "Medium" +msgstr "Médio" + +#: FToolBarConfig.form:58 +msgid "Large" +msgstr "Grande" + +#: FToolBarConfig.form:63 +msgid "Huge" +msgstr "Imenso" + +#: FToolBarConfig.form:105 +msgid "Size" +msgstr "Tamanho" + +#: FToolBarConfig.form:121 +msgid "Undo" +msgstr "Desfazer" + +#: FToolBarConfig.form:133 +msgid "Close" +msgstr "Cancelar" + +#: FWorkspace.form:36 +msgid "Show" +msgstr "Exibir" + +#: FWorkspace.form:41 +msgid "Sort tabs" +msgstr "Ordenar abas" + +#: FWorkspace.form:50 +msgid "Close tabs on the right" +msgstr "Fechar abas à direita" + +#: FWorkspace.form:55 +msgid "Close other tabs" +msgstr "Fechar outras abas" + +#: FWorkspace.form:60 +msgid "Close all tabs" +msgstr "Fechar todas as abas" + +#: FWorkspace.form:67 +msgid "Attach tab" +msgstr "Anexar aba" + +#: FWorkspace.form:71 +msgid "Detach tab" +msgstr "Destacar aba" + +#: FWorkspace.form:76 +msgid "Close tab" +msgstr "Fechar aba" + +#: FWorkspace.form:85 +msgid "Previous tab" +msgstr "Aba anterior" + +#: FWorkspace.form:91 +msgid "Next tab" +msgstr "Próxima aba" + diff --git a/comp/src/gb.form.mdi/.lang/ru.po b/comp/src/gb.form.mdi/.lang/ru.po new file mode 100644 index 00000000..316d7265 --- /dev/null +++ b/comp/src/gb.form.mdi/.lang/ru.po @@ -0,0 +1,278 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: comp/src/gb.form.mdi/.project:31 +msgid "Multiple document interface management" +msgstr "Управление многооконным интерфейсом" + +#: comp/src/gb.form.mdi/.src/Workspace/FWorkspace.form:9 +msgid "Show" +msgstr "Показать" + +#: comp/src/gb.form.mdi/.src/Workspace/FWorkspace.form:13 +msgid "Sort tabs" +msgstr "Сортировать вкладки" + +#: comp/src/gb.form.mdi/.src/Workspace/FWorkspace.form:20 +msgid "Close tabs on the right" +msgstr "Закрыть вкладки справа" + +#: comp/src/gb.form.mdi/.src/Workspace/FWorkspace.form:24 +msgid "Close other tabs" +msgstr "Закрыть другие вкладки" + +#: comp/src/gb.form.mdi/.src/Workspace/FWorkspace.form:28 +msgid "Close all tabs" +msgstr "Закрыть все вкладки" + +#: comp/src/gb.form.mdi/.src/Workspace/FWorkspace.form:33 +msgid "Attach tab" +msgstr "Присоединить вкладку" + +#: comp/src/gb.form.mdi/.src/Workspace/FWorkspace.form:36 +msgid "Detach tab" +msgstr "Отсоединить вкладку" + +#: comp/src/gb.form.mdi/.src/Workspace/FWorkspace.form:40 +msgid "Close tab" +msgstr "Закрыть вкладку" + +#: comp/src/gb.form.mdi/.src/Workspace/FWorkspace.form:47 +msgid "Previous tab" +msgstr "Предыдущая вкладка" + +#: comp/src/gb.form.mdi/.src/Workspace/FWorkspace.form:52 +msgid "Next tab" +msgstr "Следующая вкладка" + +#: comp/src/gb.form.mdi/.src/ToolBar/FToolBar.class:607 comp/src/gb.form.mdi/.src/ToolBar/FToolBar.class:613 +msgid "." +msgstr "." + +#: comp/src/gb.form.mdi/.src/ToolBar/FToolBar.class:1215 +msgid "Configure &1 toolbar" +msgstr "Настроить &1 панель инструментов" + +#: comp/src/gb.form.mdi/.src/ToolBar/FToolBar.class:1217 +msgid "Configure main toolbar" +msgstr "Настроить главную панель инструментов" + +#: comp/src/gb.form.mdi/.src/ToolBar/FToolBarConfig.class:47 +msgid "'&1' toolbar configuration" +msgstr "Конфигурация панели инструментов '&1'" + +#: comp/src/gb.form.mdi/.src/ToolBar/FToolBarConfig.class:49 +msgid "Toolbar configuration" +msgstr "Конфигурация панели инструментов" + +#: comp/src/gb.form.mdi/.src/ToolBar/FToolBarConfig.class:146 +msgid "Separator" +msgstr "Разделитель" + +#: comp/src/gb.form.mdi/.src/ToolBar/FToolBarConfig.class:148 +msgid "Expander" +msgstr "Расширитель" + +#: comp/src/gb.form.mdi/.src/ToolBar/FToolBarConfig.class:150 +msgid "Space" +msgstr "Пробел" + +#: comp/src/gb.form.mdi/.src/ToolBar/FToolBarConfig.class:387 +msgid "Do you really want to reset the toolbar?" +msgstr "Вы действительно хотите сбросить панель инструментов?" + +#: comp/src/gb.form.mdi/.src/ToolBar/FToolBarConfig.class:387 comp/src/gb.form.mdi/.src/ToolBar/FToolBarConfig.form:85 comp/src/gb.form.mdi/.src/Shortcut/FShortcut.form:33 +msgid "Reset" +msgstr "Сброс" + +#: comp/src/gb.form.mdi/.src/ToolBar/FToolBarConfig.class:387 comp/src/gb.form.mdi/.src/ToolBar/FToolBarConfig.form:39 comp/src/gb.form.mdi/.src/Shortcut/FShortcut.class:178 comp/src/gb.form.mdi/.src/Shortcut/FShortcut.form:57 +msgid "Cancel" +msgstr "Отмена" + +#: comp/src/gb.form.mdi/.src/ToolBar/FToolBarConfig.class:421 +msgid "Configure '&1' toolbar..." +msgstr "Настроить '&1' панель инструментов..." + +#: comp/src/gb.form.mdi/.src/ToolBar/FToolBarConfig.form:10 +msgid "Configure" +msgstr "Настроить" + +#: comp/src/gb.form.mdi/.src/ToolBar/FToolBarConfig.form:14 +msgid "Icon size" +msgstr "Размер иконки" + +#: comp/src/gb.form.mdi/.src/ToolBar/FToolBarConfig.form:16 comp/src/gb.form.mdi/.src/ToolBar/FToolBarConfig.form:72 +msgid "Tiny" +msgstr "Крошечный" + +#: comp/src/gb.form.mdi/.src/ToolBar/FToolBarConfig.form:20 comp/src/gb.form.mdi/.src/ToolBar/FToolBarConfig.form:72 +msgid "Small" +msgstr "Маленький" + +#: comp/src/gb.form.mdi/.src/ToolBar/FToolBarConfig.form:24 comp/src/gb.form.mdi/.src/ToolBar/FToolBarConfig.form:72 +msgid "Medium" +msgstr "Средний" + +#: comp/src/gb.form.mdi/.src/ToolBar/FToolBarConfig.form:28 comp/src/gb.form.mdi/.src/ToolBar/FToolBarConfig.form:72 +msgid "Large" +msgstr "Большой" + +#: comp/src/gb.form.mdi/.src/ToolBar/FToolBarConfig.form:32 comp/src/gb.form.mdi/.src/ToolBar/FToolBarConfig.form:72 +msgid "Huge" +msgstr "Огромный" + +#: comp/src/gb.form.mdi/.src/ToolBar/FToolBarConfig.form:67 +msgid "Size" +msgstr "Размер" + +#: comp/src/gb.form.mdi/.src/ToolBar/FToolBarConfig.form:80 +msgid "Undo" +msgstr "Откатить" + +#: comp/src/gb.form.mdi/.src/ToolBar/FToolBarConfig.form:90 +msgid "Close" +msgstr "Закрыть" + +#: comp/src/gb.form.mdi/.src/Tests/FMain.form:39 +msgid "Hello" +msgstr "Привет" + +#: comp/src/gb.form.mdi/.src/Tests/FMain.form:72 +msgid "Border" +msgstr "Граница" + +#: comp/src/gb.form.mdi/.src/Tests/FMain.form:76 +msgid "Window" +msgstr "Окно" + +#: comp/src/gb.form.mdi/.src/Tests/FMain.form:80 +msgid "Orientation" +msgstr "Ориентация" + +#: comp/src/gb.form.mdi/.src/Tests/FMain1.form:24 +msgid "Help" +msgstr "Справка" + +#: comp/src/gb.form.mdi/.src/Tests/FMain1.form:36 +msgid "Button1" +msgstr "Кнопка1" + +#: comp/src/gb.form.mdi/.src/Tests/FMain1.form:53 +msgid "Reparent" +msgstr "Ремонт" + +#: comp/src/gb.form.mdi/.src/Tests/FMain2.form:5 +msgid "Agnostic Scan Tool" +msgstr "Агностический сканер" + +#: comp/src/gb.form.mdi/.src/Tests/FMain2.form:9 +msgid "Menu1" +msgstr "Меню1" + +#: comp/src/gb.form.mdi/.src/Tests/FMain2.form:13 +msgid "Save" +msgstr "Сохранить" + +#: comp/src/gb.form.mdi/.src/Tests/FMain2.form:18 +msgid "Save as" +msgstr "Сохранить как" + +#: comp/src/gb.form.mdi/.src/Tests/FMain2.form:25 +msgid "Properties" +msgstr "Свойства" + +#: comp/src/gb.form.mdi/.src/Tests/FMain2.form:32 +msgid "Quit" +msgstr "Выход" + +#: comp/src/gb.form.mdi/.src/Tests/FMain2.form:62 +msgid "Numériser Texte" +msgstr "Сканирование текста" + +#: comp/src/gb.form.mdi/.src/Shortcut/FShortcut.class:65 +msgid "Action" +msgstr "Действие" + +#: comp/src/gb.form.mdi/.src/Shortcut/FShortcut.class:67 +msgid "Shortcut" +msgstr "Комбинация клавиш" + +#: comp/src/gb.form.mdi/.src/Shortcut/FShortcut.class:178 +msgid "You are going back to the default shortcuts." +msgstr "Вы возвращаетесь к комбинациям клавишам по умолчанию." + +#: comp/src/gb.form.mdi/.src/Shortcut/FShortcut.class:178 +msgid "Go back" +msgstr "Назад" + +#: comp/src/gb.form.mdi/.src/Shortcut/FShortcut.class:264 +msgid "Unable to export shortcut files." +msgstr "Невозможно экспортировать файлы комбинаций клавиш." + +#: comp/src/gb.form.mdi/.src/Shortcut/FShortcut.class:281 +msgid "This file is not a Gambas shortcuts file." +msgstr "Этот файл не является файлом комбинаций клавиш Gambas." + +#: comp/src/gb.form.mdi/.src/Shortcut/FShortcut.class:305 +msgid "Unable to import shortcut files." +msgstr "Невозможно импортировать файлы комбинаций клавиш." + +#: comp/src/gb.form.mdi/.src/Shortcut/FShortcut.class:313 comp/src/gb.form.mdi/.src/Shortcut/FShortcut.class:326 +msgid "Gambas shortcuts files" +msgstr "Файл комбинаций клавиш Gambas" + +#: comp/src/gb.form.mdi/.src/Shortcut/FShortcut.class:314 +msgid "Export shortcuts" +msgstr "Экспорт комбинаций клавиш" + +#: comp/src/gb.form.mdi/.src/Shortcut/FShortcut.class:327 +msgid "Import shortcuts" +msgstr "Импорт комбинаций клавиш" + +#: comp/src/gb.form.mdi/.src/Shortcut/FShortcut.form:5 +msgid "Configure shortcuts" +msgstr "Настройка комбинаций клавиш" + +#: comp/src/gb.form.mdi/.src/Shortcut/FShortcut.form:27 +msgid "Find shortcut" +msgstr "Найти комбинацию клавиш" + +#: comp/src/gb.form.mdi/.src/Shortcut/FShortcut.form:38 +msgid "Import" +msgstr "Импорт" + +#: comp/src/gb.form.mdi/.src/Shortcut/FShortcut.form:43 +msgid "Export" +msgstr "Экспорт" + +#: comp/src/gb.form.mdi/.src/Shortcut/FShortcut.form:52 +msgid "OK" +msgstr "ОК" + +#: comp/src/gb.form.mdi/.src/Shortcut/FShortcutEditor.class:75 +msgid "This shortcut is already used by the following action:" +msgstr "Эта комбинация клавиш уже используется следующим действием:" + diff --git a/comp/src/gb.form.mdi/.lang/sv.po b/comp/src/gb.form.mdi/.lang/sv.po new file mode 100644 index 00000000..d3dc893a --- /dev/null +++ b/comp/src/gb.form.mdi/.lang/sv.po @@ -0,0 +1,148 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: FToolBarConfig.class:34 +msgid "&1 toolbar" +msgstr "&1verktygsrad" + +#: FShortcut.class:28 +msgid "Action" +msgstr "Åtgärd" + +#: FMain.class:65 Form2.class:22 +msgid "Button1" +msgstr "Knapp1" + +#: FMain.class:70 +msgid "Button2" +msgstr "Knapp2" + +#: FMain.class:75 +msgid "Button3" +msgstr "Knapp3" + +#: FMain.class:49 +msgid "Button4" +msgstr "Knapp4" + +#: FShortcut.class:153 FToolBarConfig.class:338 +msgid "Cancel" +msgstr "Avbryt" + +#: FToolBarConfig.class:452 +msgid "&Close" +msgstr "&Stäng" + +#: FWorkspace.class:670 +msgid "Close &all other tabs" +msgstr "Stäng &alla andra flikar" + +#: FWorkspace.class:665 +msgid "&Close current tab" +msgstr "&Stäng aktuell flik" + +#: FWorkspace.class:947 +msgid "Close current tab" +msgstr "Stäng aktuell flik" + +#: FToolBar.class:859 +msgid "Configure &1 toolbar" +msgstr "Konfigurera &1 verktygsrad" + +#: FToolBar.class:861 +msgid "Configure main toolbar" +msgstr "Konfigurera huvudverktygsrad" + +#: FShortcut.class:231 +msgid "Configure shortcuts" +msgstr "Konfigurera genvägar" + +#: FToolBarConfig.class:338 +msgid "Do you really want to reset the toolbar?" +msgstr "Vill du verkligen återställa verktygsraden?" + +#: FShortcut.class:253 +msgid "Find shortcut" +msgstr "Leta genväg" + +#: FShortcut.class:153 +msgid "Go back" +msgstr "Gå bakåt" + +#: FToolBarConfig.class:398 +msgid "Icon size" +msgstr "Ikonstorlek" + +#: FToolBarConfig.class:410 +msgid "Large" +msgstr "Stor" + +#: FToolBarConfig.class:36 +msgid "Main toolbar" +msgstr "Huvudverktygsrad" + +#: FToolBarConfig.class:410 +msgid "Medium" +msgstr "Medium" + +#: FWorkspace.class:857 +msgid "Next tab" +msgstr "Nästa flik" + +#: FShortcut.class:270 +msgid "OK" +msgstr "OK" + +#: FWorkspace.class:851 +msgid "Previous tab" +msgstr "Föregående flik" + +#: FShortcut.class:259 FToolBarConfig.class:338 +msgid "Reset" +msgstr "Återställ" + +#: FToolBarConfig.class:439 +msgid "&Reset" +msgstr "&Återställ" + +#: FToolBarConfig.class:141 +msgid "Separator" +msgstr "Skillnadstecken" + +#: FShortcut.class:29 +msgid "Shortcut" +msgstr "Genväg" + +#: FToolBarConfig.class:410 +msgid "Small" +msgstr "Liten" + +#: FWorkspace.class:657 +msgid "&Sort tabs" +msgstr "&Sortera flikar" + +#: FShortcutEditor.class:75 +msgid "This shortcut is already used by the following action:" +msgstr "Denne genväg används redan av följande åtgärd:" + +#: FToolBarConfig.class:380 +msgid "Toolbars configuration" +msgstr "Verktygsradskonfiguration" + +#: FToolBarConfig.class:446 +msgid "&Undo" +msgstr "&Ångra" + +#: FShortcut.class:153 +msgid "You are going back to the default shortcuts." +msgstr "Du kommer att ta tillbaka standardgenvägarna." + diff --git a/comp/src/gb.form.mdi/.lang/zh.po b/comp/src/gb.form.mdi/.lang/zh.po new file mode 100644 index 00000000..12d77c96 --- /dev/null +++ b/comp/src/gb.form.mdi/.lang/zh.po @@ -0,0 +1,161 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Multiple document interface management" +msgstr "多文档界面管理" + +#: FMain.form:49 FMain1.form:58 +msgid "Button1" +msgstr "-" + +#: FMain.form:59 +msgid "Window" +msgstr "-" + +#: FMain.form:64 +msgid "Orientation" +msgstr "-" + +#: FMain1.form:44 +msgid "Help" +msgstr "-" + +#: FMain1.form:79 +msgid "Reparent" +msgstr "-" + +#: FShortcut.class:40 +msgid "Action" +msgstr "动作" + +#: FShortcut.class:42 +msgid "Shortcut" +msgstr "快捷键" + +#: FShortcut.class:170 +msgid "Go back" +msgstr "回溯" + +#: FShortcut.class:170 +msgid "You are going back to the default shortcuts." +msgstr "将恢复到缺省快捷键。" + +#: FShortcut.form:15 +msgid "Configure shortcuts" +msgstr "配置快捷键" + +#: FShortcut.form:38 +msgid "Find shortcut" +msgstr "查找快捷键" + +#: FShortcut.form:44 FToolBarConfig.class:382 +msgid "Reset" +msgstr "重置" + +#: FShortcut.form:55 +msgid "OK" +msgstr "确定" + +#: FShortcut.form:61 FToolBarConfig.form:63 +msgid "Cancel" +msgstr "取消" + +#: FShortcutEditor.class:75 +msgid "This shortcut is already used by the following action:" +msgstr "这个快捷键已经被下面的动作使用:" + +#: FToolBar.class:1179 +msgid "Configure &1 toolbar" +msgstr "配置&1工具条" + +#: FToolBar.class:1181 +msgid "Configure main toolbar" +msgstr "配置主工具条" + +#: FToolBarConfig.class:47 +msgid "'&1' toolbar configuration" +msgstr "'&1'工具条设置" + +#: FToolBarConfig.class:49 +msgid "Toolbar configuration" +msgstr "工具条设置" + +#: FToolBarConfig.class:141 +msgid "Separator" +msgstr "分隔符" + +#: FToolBarConfig.class:143 +msgid "Expander" +msgstr "扩展" + +#: FToolBarConfig.class:145 +msgid "Space" +msgstr "空白" + +#: FToolBarConfig.class:382 +msgid "Do you really want to reset the toolbar?" +msgstr "你确定要重置工具条吗?" + +#: FToolBarConfig.form:36 +msgid "Configure..." +msgstr "设置..." + +#: FToolBarConfig.form:41 +msgid "Icon size" +msgstr "图标大小" + +#: FToolBarConfig.form:44 +msgid "Small" +msgstr "小" + +#: FToolBarConfig.form:49 +msgid "Medium" +msgstr "中等" + +#: FToolBarConfig.form:54 +msgid "Large" +msgstr "巨大" + +#: FToolBarConfig.form:129 +msgid "&Reset" +msgstr "(&R)重置" + +#: FToolBarConfig.form:136 +msgid "&Undo" +msgstr "(&U)撤销" + +#: FToolBarConfig.form:142 +msgid "&Close" +msgstr "(&C)关闭" + +#: FWorkspace.class:597 +msgid "&Sort tabs" +msgstr "(&S)标签页排序" + +#: FWorkspace.class:605 +msgid "&Close current tab" +msgstr "(&C)关闭当前标签页" + +#: FWorkspace.class:610 +msgid "Close &all other tabs" +msgstr "(&a)关闭所有其他标签页" + +#: FWorkspace.form:30 +msgid "Previous tab" +msgstr "前一个标签" + +#: FWorkspace.form:36 +msgid "Next tab" +msgstr "下一个标签" + diff --git a/comp/src/gb.form.mdi/.project b/comp/src/gb.form.mdi/.project new file mode 100644 index 00000000..d1852280 --- /dev/null +++ b/comp/src/gb.form.mdi/.project @@ -0,0 +1,23 @@ +# Gambas Project File 3.0 +Title=Multiple document interface management +Startup=FMain +Icon=.hidden/control/workspace.png +Version=3.15.90 +VersionFile=1 +Component=gb.image +Component=gb.gui +Component=gb.form +Component=gb.settings +Component=gb.form.mdi +Authors="Benoît Minisini" +Environment="GB_GUI=gb.gtk3" +TabSize=2 +Translate=1 +Language=en +Type=Component +Maintainer=benoit +Address=benoit@localhost +License=General Public Licence +Prefix=1 +Packager=1 +DoNotTranslate=".src/Tests" diff --git a/comp/src/gb.form.mdi/.src/Action/Action.class b/comp/src/gb.form.mdi/.src/Action/Action.class new file mode 100644 index 00000000..41277f94 --- /dev/null +++ b/comp/src/gb.form.mdi/.src/Action/Action.class @@ -0,0 +1,112 @@ +' Gambas class file + +Export + +Static Property Read List As String[] + +Static Private $aWindow As New Window[] +Static Private $iId As Integer + + +Static Public Sub Configure() As Boolean + + MAction.InitAction + Return FShortcut.Run() + +End + +Static Public Sub _ConfigureToolbar(hToolbar As ToolBar) + + MAction.InitAction + FToolBarConfig.Run(hToolbar) + +End + + +Static Private Function List_Read() As String[] + + Return MAction.GetList() + +End + +Static Public Sub _Register(Control As Object, Old As String, (Key) As String) + + Dim hObs As Observer + Dim hWin As Window + + Super._Register(Control, Old, Key) + + If Key Then + + If Control Is Menu Then + hWin = Control.Window + If Not $aWindow.Exist(hWin) Then + $aWindow.Add(hWin) + Inc $iId + hObs = New Observer(hWin) As "Window" + Endif + Endif + + Endif + +End + +Static Private Sub SetShortcut(hMenu As Menu) + + Dim sShortcut As String + + If hMenu.Action Then + sShortcut = MAction.GetShortcut(hMenu.Action) + If sShortcut Then hMenu.Shortcut = sShortcut + Endif + + For Each hMenu In hMenu.Children + SetShortcut(hMenu) + Next + +End + + +Static Public Sub Window_Open() + + Dim hWin As Window = Last + Dim hMenu As Menu + + For Each hMenu In hWin.Menus + SetShortcut(hMenu) + Next + +End + +Static Public Sub Window_Close() + + Try $aWindow.Remove($aWindow.Find(Last)) + +End + + +Static Public Sub Add(Action As String, Text As String, Optional (Picture) As String, Optional HasShortcut As Boolean, DefaultShortcut As String) + + MAction.Add(Action, Text, Picture, HasShortcut, DefaultShortcut) + +End + +Static Public Sub AddFrom(Control As Object) + + Dim sAction As String + Dim sText As String + Dim sShortcut As String + Dim bHasShortcut As Boolean + + sAction = Control.Action + If Not sAction Then Return + + Try sText = Control.Text + Try sShortcut = Control.Shortcut + + If sShortcut Or If Control Is Menu Then bHasShortcut = True + + Add(sAction, sText,, bHasShortcut, sShortcut) + +End + diff --git a/comp/src/gb.form.mdi/.src/Action/CAction.class b/comp/src/gb.form.mdi/.src/Action/CAction.class new file mode 100644 index 00000000..6fbe8f26 --- /dev/null +++ b/comp/src/gb.form.mdi/.src/Action/CAction.class @@ -0,0 +1,128 @@ +' Gambas class file + +Public (Key) As String +Public Text As String +Public Display As String +Public DefaultShortcut As String +Public (Shortcut) As String +Public Icon As Picture +Public IconPath As String +Public HasShortcut As Boolean + +Private $sOldShortcut As String + +Private Sub UnquoteShortcut(sStr As String) As String + + sStr = Replace(sStr, "&&", Chr$(1)) + sStr = Replace(sStr, "&", "") + sStr = Replace(sStr, Chr$(1), "&") + + Return sStr + +End + +Public Sub _new(sKey As String, bHasShortcut As Boolean, cSlot As Collection, Optional hMerge As CAction) + + Dim sPicture As String + Dim aControl As Object[] + + 'Debug sKey;; bHasShortcut;; cSlot["Picture"] + + Key = sKey + + Text = Tr$(cSlot["Text"]) + If hMerge And If Not Text Then Text = hMerge.Text + Display = UnquoteShortcut(Text) + + DefaultShortcut = cSlot["Shortcut"] + If hMerge And If Not DefaultShortcut Then DefaultShortcut = hMerge.DefaultShortcut + + HasShortcut = bHasShortcut + If hMerge And If Not HasShortcut Then HasShortcut = hMerge.HasShortcut + + Shortcut = MAction.GetShortcut(Key) + If Not Shortcut Then Shortcut = DefaultShortcut + $sOldShortcut = Shortcut + + sPicture = cSlot["Picture"] + + If Not sPicture Then + aControl = Action[sKey].Controls + If aControl.Count = 1 And If Object.Type(aControl[0]) = "MenuButton" Then + sPicture = "icon:/small/menu" + Endif + Endif + + If Left(sPicture) = "$" Then + Else If sPicture Then + If sPicture Not Begins "icon:/" Then sPicture = ".." &/ sPicture + IconPath = sPicture + Try Icon = Picture[IconPath] + Endif + + If hMerge Then + If Not sPicture Or If Left(sPicture) = "$" And hMerge.IconPath Then + IconPath = hMerge.IconPath + Icon = hMerge.Icon + Endif + Endif + +End + +Public Sub Save() + + Dim hAction As Object + + If Not HasShortcut Then Return + If Shortcut = $sOldShortcut Then Return + + If Shortcut = DefaultShortcut Then + MAction.SetShortcut(Key, "") + Else + MAction.SetShortcut(Key, Shortcut) + Endif + + hAction = Action[Key] + + hAction.Shortcut = Shortcut + Action["." & Key].Shortcut = Shortcut + + $sOldShortcut = Shortcut + +End + +Public Sub _compare(hAction As CAction) As Integer + + Return String.Comp(Display, hAction.Display) + +End + +Public Sub GetConfigIcon(Optional W As Integer) As Picture + + Dim aIcon As String[] + Dim aControl As Object[] + Dim sType As String + + If Icon Then + If W = 0 Then Return Icon + If IconPath Begins "icon:/" Then + aIcon = Split(IconPath, "/") + aIcon[1] = W + Return Picture[aIcon.Join("/")] + Else + Return Icon.Image.Stretch(W, W).Picture + Endif + Endif + + aControl = Action[Key].Controls + If aControl.Count = 0 Then Return + + If W = 0 Then W = Stock.GetSize("small") + + sType = Object.Type(aControl[0]) + If sType = "MenuButton" Then Return Picture["icon:/small/menu"] + + IconPath = "./control" &/ LCase(sType) & ".png" + Try Return Picture[IconPath].Image.Stretch(W, W).Picture + +End diff --git a/comp/src/gb.form.mdi/.src/Action/MAction.module b/comp/src/gb.form.mdi/.src/Action/MAction.module new file mode 100644 index 00000000..19f39ade --- /dev/null +++ b/comp/src/gb.form.mdi/.src/Action/MAction.module @@ -0,0 +1,170 @@ +' Gambas module file + +Public Const MIME As String = "text/x-gambas-action" + +Public Actions As Collection +Public Toolbars As Collection + +Private $cShortcut As Collection + +Public Sub SetShortcut(sAction As String, sShortcut As String) + + If Left(sAction) = "." Then sAction = Mid$(sAction, 2) + Settings["gb.form.mdi/Shortcuts" &/ sAction] = sShortcut + +End + +Public Sub GetShortcut(sAction As String) As String + + If Left(sAction) = "." Then sAction = Mid$(sAction, 2) + Return Settings["gb.form.mdi/Shortcuts" &/ sAction] + +End + +Private Sub InitShortcut() + + Dim iInd As Integer + Dim sKey As String + Dim sList As String + + $cShortcut = New Collection + + sList = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+-*/." + + For iInd = 1 To Len(sList) + sKey = Mid$(sList, iInd, 1) + $cShortcut[Key[sKey]] = sKey + Next + + For iInd = 1 To 12 + sKey = "F" & CStr(iInd) + $cShortcut[Key[sKey]] = sKey + Next + + For Each sKey In ["Backspace", "Del", "Down", "End", "Enter", "Esc", "Home", "Ins", "Left", "Pause", "PgDown", "PgUp", "Return", "Space", "Right", "Up"] + $cShortcut[Key[sKey]] = sKey + Next + +End + + +Public Sub FindShortcut() As String + + Dim sShortcut As String + Dim sMod As String + + If Not $cShortcut Then InitShortcut + + sShortcut = $cShortcut[Key.Code] + + If sShortcut Then + + If Len(sShortcut) > 1 Or If Not Key.Normal Then + + If Key.Control Then sMod &= "Ctrl+" + If Key.Meta Then sMod &= "Meta+" + If Key.Alt Then sMod &= "Alt+" + If Key.Shift Then sMod &= "Shift+" + + Return sMod & sShortcut + + Endif + + Endif + +End + +Private Sub LoadAction(sFile As String) + + Dim hFile As File + Dim sAction As String + Dim sToolbar As String + Dim sLine As String + Dim aLine As String[] + Dim hAction As CAction + Dim hToolbar As CToolbar + Dim cSlot As New Collection + Dim bHasShortcut As Boolean + + hFile = Open sFile + While Not Eof(hFile) + Line Input #hFile, sLine + sLine = Trim(sLine) + If Not sLine Then Continue + If Left(sLine) = "#" Then Continue + + If sLine Begins "{ Action " Then + cSlot.Clear + bHasShortcut = False + sAction = Trim(Mid$(sLine, 10)) + Else If sLine Begins "{ Toolbar " Then + cSlot.Clear + sToolbar = File.BaseName(sFile) & "." & Trim(Mid$(sLine, 10)) + Else If sLine = "}" Then + If sAction Then + hAction = New CAction(sAction, bHasShortcut, cSlot, Actions[sAction]) + Actions[hAction.Key] = hAction + sAction = "" + Else If sToolbar Then + hToolbar = New CToolbar(sToolbar, cSlot) + Toolbars[hToolbar.Key] = hToolbar + sToolbar = "" + Endif + Else + aLine = Scan(sLine, "* = *") + If aLine.Count <> 2 Then Continue + cSlot[aLine[0]] = UnQuote(aLine[1]) + If aLine[0] = "Shortcut" Then bHasShortcut = True + Endif + Wend + Close #hFile + +End + + +Public Sub InitAction() + + Dim sFile As String + + If Actions Then Return + + 'Debug "Loading actions..." + + Actions = New Collection + Toolbars = New Collection + + ' Why loading gb.form.mdi actions?? + ' For Each sFile In Dir(".action", "*.action") + ' LoadAction(".action" &/ sFile) + ' Next + + For Each sFile In Dir("../.action", "*.action") + LoadAction("../.action" &/ sFile) + Next + +End + +Public Sub Add(sKey As String, sText As String, sPicture As String, bHasShortcut As Boolean, sDefaultShortcut As String) + + Dim hAction As CAction + + InitAction + + hAction = New CAction(sKey, bHasShortcut, ["Text": sText, "Picture": sPicture, "Shortcut": sDefaultShortcut], Actions[sKey]) + Actions[hAction.Key] = hAction + +End + +Public Sub GetList() As String[] + + Dim aList As New String[] + + InitAction + + For Each Actions + aList.Add(Actions.Key) + Next + + Return aList.Sort() + +End diff --git a/comp/src/gb.form.mdi/.src/MMain.module b/comp/src/gb.form.mdi/.src/MMain.module new file mode 100644 index 00000000..8a0766b3 --- /dev/null +++ b/comp/src/gb.form.mdi/.src/MMain.module @@ -0,0 +1,7 @@ +' Gambas module file + +Public Sub Main() + + Action.Configure + +End diff --git a/comp/src/gb.form.mdi/.src/Shortcut/FShortcut.class b/comp/src/gb.form.mdi/.src/Shortcut/FShortcut.class new file mode 100644 index 00000000..3d3e4506 --- /dev/null +++ b/comp/src/gb.form.mdi/.src/Shortcut/FShortcut.class @@ -0,0 +1,336 @@ +' Gambas class file + +Private SHORTCUTS_MAGIC As String = "# Gambas shortcuts file 1.0" + +Private $aAction As CAction[] +Private $hEditor As FShortcutEditor +Private $hVoid As Picture + +Public Sub Run() As Boolean + + Return Not Me.ShowModal() + +End + +Public Sub _new() + + $hEditor = New FShortcutEditor(Me) + $hEditor.Hide + $hEditor.Ignore = True + +End + +Private Sub RefreshTable() + + Dim iInd As Integer + Dim hAction As CAction + Dim hIcon As Picture + + For iInd = 0 To $aAction.Max + + hAction = $aAction[iInd] + + tvwShortcut[iInd, 0].Text = hAction.Display + tvwShortcut[iInd, 0].Padding = 4 + hIcon = hAction.GetConfigIcon(Desktop.Scale * 2) + If Not hIcon Then hIcon = $hVoid + tvwShortcut[iInd, 0].Picture = hIcon + tvwShortcut[iInd, 1].Text = hAction.Shortcut + tvwShortcut[iInd, 1].Padding = 4 + + Next + + tvwShortcut.Columns[1].Width = -1 'tvwShortcut.Width - Desktop.Scale * 24 + tvwShortcut.Columns[1].Width += 12 * Desktop.Scale + tvwShortcut.Rows.Height = tvwShortcut.Font.Height + 8 + +End + +Public Sub Form_Open() + + Dim hAction As CAction + Dim hImage As Image + + $aAction = New CAction[] + For Each hAction In MAction.Actions + If hAction.HasShortcut Then $aAction.Add(hAction) + Next + $aAction.Sort + + 'Debug tvwShortcut.Row;; tvwShortcut.Column + tvwShortcut.Rows.Count = $aAction.Count + 'Debug tvwShortcut.Row;; tvwShortcut.Column + tvwShortcut.Columns.Count = 2 + 'Debug tvwShortcut.Row;; tvwShortcut.Column + tvwShortcut.Columns[0].Text = ("Action") + tvwShortcut.Columns[0].Expand = True + tvwShortcut.Columns[1].Text = ("Shortcut") + + hImage = New Image(16, 16, Color.Transparent) + $hVoid = hImage.Picture + + RefreshTable + + Settings.Read(Me, "gb.form.mdi/FShortcut") + +End + +Public Sub btnCancel_Click() + + Me.Close + +End + +Public Sub btnOK_Click() + + tvwShortcut.Save + SaveShortcut + Me.Close(True) + +End + +Public Sub tvwShortcut_Click() + + Dim hAction As CAction + + If btnFind.Value Then Return + If tvwShortcut.Row < 0 Then Return + + hAction = $aAction[tvwShortcut.Row] + 'If tvwShortcut.Editor And If $hEditor.Define(hAction) Then Return + + Object.Lock(tvwShortcut) + tvwShortcut.Column = 1 + Object.Unlock(tvwShortcut) + + tvwShortcut.EditWith($hEditor) + +End + +Private Sub SaveShortcut() + + Dim hAction As CAction + + For Each hAction In MAction.Actions + hAction.Save + Next + Settings.Save + +End + +Public Sub Form_Close() + + Settings.Write(Me, "gb.form.mdi/FShortcut") + +End + +Public Sub tvwShortcut_Save(Row As Integer, (Column) As Integer, Value As String) + + If $hEditor.BadShortcut Then Return + + tvwShortcut[Row, 1].Text = Value + $aAction[Row].Shortcut = Value + +End + +Public Sub btnFind_Click() + + If btnFind.Value Then + tvwShortcut.Cancel + btnFind.SetFocus + Else + tvwShortcut_Click + Endif + +End + +Public Sub btnFind_KeyPress() + + Dim sShortcut As String + Dim iRow As Integer + + If btnFind.Value Then + sShortcut = Shortcut.FromKey() 'MAction.FindShortcut() + If sShortcut Then + For iRow = 0 To tvwShortcut.Rows.Count - 1 + If tvwShortcut[iRow, 1].Text = sShortcut Then + tvwShortcut.Row = iRow + Break + Endif + Next + Endif + Stop Event + Endif + +End + +Public Sub btnFind_LostFocus() + + btnFind.Value = False + +End + +Public Sub btnDefault_Click() + + Dim hAction As CAction + Dim iRow As Integer + + If Message.Warning(("You are going back to the default shortcuts."), ("Go back"), ("Cancel")) = 2 Then Return + + tvwShortcut.Cancel + For iRow = 0 To tvwShortcut.Rows.Count - 1 + hAction = $aAction[iRow] + hAction.Shortcut = hAction.DefaultShortcut + tvwShortcut[iRow, 1].Text = hAction.Shortcut + Next + + SaveShortcut + +End + +Public Sub HandleKey() As Boolean + + Dim iRow As Integer = tvwShortcut.Row + + If Not Key.Normal Then Return + + Select Case Key.Code + Case Key.Up + Dec iRow + Case Key.Down + Inc iRow + Case Key.Home + iRow = 0 + Case Key.End + iRow = tvwShortcut.Rows.Count - 1 + Case Key.PageUp + iRow -= Max(1, tvwShortcut.ClientH \ tvwShortcut.Rows.H - 1) + Case Key.PageDown + iRow += Max(1, tvwShortcut.ClientH \ tvwShortcut.Rows.H - 1) + Default + Return False + End Select + + If iRow >= 0 And If iRow < tvwShortcut.Rows.Count Then + tvwShortcut.Row = iRow + timAfter.Trigger + Endif + + Return True + +End + +Public Sub timAfter_Timer() + + tvwShortcut_Click + +End + +' Public Sub tvwShortcut_MouseDown() +' +' tvwShortcut_Select +' +' End +' +' Public Sub tvwShortcut_MouseUp() +' +' tvwShortcut_Select +' +' End + +Private Sub Export(sPath As String) + + Dim hFile As File + Dim hAction As CAction + Dim aKey As New String[] + Dim sKey As String + + hFile = Open sPath For Create + Print #hFile, SHORTCUTS_MAGIC + + For Each hAction In $aAction + aKey.Add(hAction.Key) + Next + aKey.Sort + + For Each sKey In aKey + Print #hFile, sKey; "="; MAction.Actions[sKey].Shortcut + Next + + hFile.Close + +Catch + + Message.Error(("Unable to export shortcut files.") & "\n\n" & Error.Text) + Try hFile.Close + +End + +Private Sub Import(sPath As String) + + Dim hFile As File + Dim sMagic As String + Dim sLine As String + Dim iPos As Integer + Dim sShortcut As String + Dim hAction As CAction + + hFile = Open sPath + Line Input #hFile, sMagic + If sMagic <> SHORTCUTS_MAGIC Then + Message.Error(("This file is not a Gambas shortcuts file.")) + Close #hFile + Return + Endif + + While Not Eof(hFile) + Line Input #hFile, sLine + sLine = Trim(sLine) + If Not sLine Or If Left(sLine) = "#" Or If Left(sLine) = ";" Then Continue + iPos = InStr(sLine, "=") + If iPos = 0 Then Continue + sShortcut = Trim(Mid$(sLine, iPos + 1)) + sLine = Trim(Left$(sLine, iPos - 1)) + hAction = MAction.Actions[sLine] + If Not hAction Then Continue + hAction.Shortcut = sShortcut + Wend + + hFile.Close + + RefreshTable + +Catch + + Message.Error(("Unable to import shortcut files.") & "\n\n" & Error.Text) + Try Close #hFile + +End + +Public Sub btnSave_Click() + + Dialog.Path = Settings["gb.form.mdi/FShortcut/Path", User.Home &/ Application.Name & ".gambas.shortcuts"] + Dialog.Filter = ["*.gambas.shortcuts", ("Gambas shortcuts files")] + Dialog.Title = ("Export shortcuts") + Try Dialog.AutoExt = True + If Dialog.SaveFile() Then Return + Settings["gb.form.mdi/FShortcut/Path"] = Dialog.Path + + Export(Dialog.Path) + +End + +Public Sub btnLoad_Click() + + Dialog.Path = Settings["gb.form.mdi/FShortcut/Path", User.Home] + Dialog.Filter = ["*.gambas.shortcuts", ("Gambas shortcuts files")] + Dialog.Title = ("Import shortcuts") + If Dialog.OpenFile() Then Return + + 'Enhanced Dialog.OpenFile() is buggy + If Not Dialog.Path Or If IsDir(Dialog.Path) Then Return + Settings["gb.form.mdi/FShortcut/Path"] = Dialog.Path + + Import(Dialog.Path) + +End diff --git a/comp/src/gb.form.mdi/.src/Shortcut/FShortcut.form b/comp/src/gb.form.mdi/.src/Shortcut/FShortcut.form new file mode 100644 index 00000000..442d3941 --- /dev/null +++ b/comp/src/gb.form.mdi/.src/Shortcut/FShortcut.form @@ -0,0 +1,61 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,91,84) + Text = ("Configure shortcuts") + Icon = Picture["icon:/small/shortcut"] + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + { tvwShortcut TableView + MoveScaled(3,1,76,70) + Expand = True + Mode = Select.Single + Header = GridView.Horizontal + ScrollBar = Scroll.Vertical + Resizable = False + } + { timAfter #Timer + #MoveScaled(63.4286,29.1429) + } + { HBox2 HBox + MoveScaled(1,77,89,4) + Spacing = True + { btnFind ToggleButton + MoveScaled(0,0,22,4) + AutoResize = True + Text = ("Find shortcut") + Picture = Picture["icon:/small/find"] + } + { btnDefault Button + MoveScaled(23,0,19,4) + AutoResize = True + Text = ("Reset") + Picture = Picture["icon:/small/refresh"] + } + { btnLoad Button + MoveScaled(43,0,4,4) + ToolTip = ("Import") + Picture = Picture["icon:/small/open"] + } + { btnSave Button + MoveScaled(48,0,4,4) + ToolTip = ("Export") + Picture = Picture["icon:/small/save"] + } + { Panel1 Panel + MoveScaled(53,0,2,3) + Expand = True + } + { btnOK Button + MoveScaled(56,0,16,4) + Text = ("OK") + Default = True + } + { btnCancel Button + MoveScaled(73,0,16,4) + Text = ("Cancel") + Cancel = True + } + } +} diff --git a/comp/src/gb.form.mdi/.src/Shortcut/FShortcutEditor.class b/comp/src/gb.form.mdi/.src/Shortcut/FShortcutEditor.class new file mode 100644 index 00000000..633d3b28 --- /dev/null +++ b/comp/src/gb.form.mdi/.src/Shortcut/FShortcutEditor.class @@ -0,0 +1,100 @@ +' Gambas class file + +Property Text As String +Property Read BadShortcut As Boolean + +Private $hAction As CAction +Private $bBadShortcut As Boolean + +Public Sub Define(hAction As CAction) As Boolean + + If $hAction = hAction Then Return True + $hAction = hAction + +End + +Private Function Text_Read() As String + + Return lblShortcut.Text + +End + +Private Sub Text_Write(Value As String) + + If Not lblShortcut Then Return + + 'Object.Lock(txtShortcut) + lblShortcut.Text = Value + 'Object.Unlock(txtShortcut) + +End + +Public Sub btnClear_Click() + + lblShortcut.Text = "" + CheckShortcut + +End + +Public Sub Form_KeyPress() + + Dim sShortcut As String + + If Not FShortcut.HandleKey() Then + sShortcut = Shortcut.FromKey() 'MAction.FindShortcut() + If sShortcut Then + lblShortcut.Text = sShortcut + CheckShortcut + Endif + Endif + + Stop Event + +End + +Private Sub CheckShortcut() + + Dim hAction As CAction + Dim hSame As CAction + Dim sShortcut As String = lblShortcut.Text + + If sShortcut Then + + For Each hAction In MAction.Actions + If hAction = $hAction Then Continue + If hAction.Shortcut = sShortcut Then + hSame = hAction + Break + Endif + Next + + Endif + + If hSame Then + $bBadShortcut = True + Balloon.Warning(("This shortcut is already used by the following action:") & "

        " & hSame.Display & "", lblShortcut) + Else + $bBadShortcut = False + Balloon.Hide + Endif + +End + +' Public Sub txtShortcut_Change() +' +' CheckShortcut +' +' End + + +Private Function BadShortcut_Read() As Boolean + + Return $bBadShortcut + +End + +' Public Sub Form_Open() +' +' panSpace.Width = 2 +' +' End diff --git a/comp/src/gb.form.mdi/.src/Shortcut/FShortcutEditor.form b/comp/src/gb.form.mdi/.src/Shortcut/FShortcutEditor.form new file mode 100644 index 00000000..cde76e23 --- /dev/null +++ b/comp/src/gb.form.mdi/.src/Shortcut/FShortcutEditor.form @@ -0,0 +1,22 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,29,9) + Background = Color.TextBackground + Arrangement = Arrange.Fill + { Panel1 Panel + MoveScaled(1,1,26,6) + Background = Color.TextBackground + Arrangement = Arrange.Horizontal + Padding = 2 + { lblShortcut Label + MoveScaled(3,1,17,4) + Background = Color.TextBackground + Expand = True + } + { btnClear ToolButton + MoveScaled(21,1,4,4) + Picture = Picture["icon:/small/clear"] + } + } +} diff --git a/comp/src/gb.form.mdi/.src/Tests/FMain.class b/comp/src/gb.form.mdi/.src/Tests/FMain.class new file mode 100644 index 00000000..af120fc0 --- /dev/null +++ b/comp/src/gb.form.mdi/.src/Tests/FMain.class @@ -0,0 +1,66 @@ +' Gambas class file + +Private $hWatcher As Watcher + +Public Sub Button1_Click() + + Workspace1.Border = Not Workspace1.Border + +End + +Public Sub Form_Open() + + Application.MainWindow = Me + + Workspace1.CloseWithMouse = True + + $hWatcher = New Watcher(ToolButton1) As "Watcher" + + Workspace1.Lock + Button2_Click + Button2_Click + Button2_Click + Button2_Click + Workspace1.Unlock + + Button3.Action = "orientation" + Action.AddFrom(Button3) + +End + +Public Sub Watcher_Move() + + ' Toto + 'Debug ToolButton1.X;; ToolButton1.Y + +End + + +Public Sub Button2_Click() + + Dim hForm As Form = New Form1 + Workspace1.Add(hForm) + +End + +Public Sub Button3_Click() + + If Workspace1.Orientation = Align.Top Then + Workspace1.Orientation = Align.Bottom + Else + Workspace1.Orientation = Align.Top + Endif + +End + +Public Sub Workspace1_Activate() + + 'Try Debug Workspace1.ActiveWindow.Title + +End + +Public Sub ToolButton1_Click() + + Action.Configure + +End diff --git a/comp/src/gb.form.mdi/.src/Tests/FMain.form b/comp/src/gb.form.mdi/.src/Tests/FMain.form new file mode 100644 index 00000000..62f61a98 --- /dev/null +++ b/comp/src/gb.form.mdi/.src/Tests/FMain.form @@ -0,0 +1,116 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,77,74) + Arrangement = Arrange.Vertical + { ToolBar1 ToolBar + MoveScaled(0,0,45,5) + Key = "test" + Separator = True + { ToolButton1 ToolButton + MoveScaled(0,0,5,4) + Action = "a" + Picture = Picture["icon:/22/bookmark"] + } + { ToolButton2 ToolButton + MoveScaled(5,0,4,4) + Visible = False + Action = "b" + Picture = Picture["icon:/22/computer"] + } + { Separator1 Separator + MoveScaled(10,0,1,4) + } + { ToolButton3 ToolButton + MoveScaled(13,0,4,4) + Visible = False + Action = "c" + Picture = Picture["icon:/22/edit"] + } + { ToolButton4 ToolButton + MoveScaled(18,0,4,4) + Action = "d" + Picture = Picture["icon:/small/save"] + } + { ToolButton5 ToolButton + MoveScaled(23,0,11,4) + Enabled = False + Action = "e" + Text = ("Hello") + Picture = Picture["icon:/small/save"] + } + } + { Panel2 HBox + MoveScaled(2,8,72,51) + Expand = True + { SidePanel2 SidePanel + MoveScaled(1,4,15,46) + Arrangement = Arrange.Fill + Orientation = Align.Left + { TreeView2 TreeView + MoveScaled(1,11,12,16) + } + } + { Workspace1 Workspace + MoveScaled(24,0,28,50) + Expand = True + Border = False + } + { SidePanel1 SidePanel + MoveScaled(54,2,15,46) + Arrangement = Arrange.Fill + Orientation = Align.Right + { TreeView1 TreeView + MoveScaled(0,11,15,21) + } + } + } + { Panel1 HBox + MoveScaled(2,61,70,4) + { Button1 Button + MoveScaled(0,0,16,4) + Text = ("Border") + } + { Button2 Button + MoveScaled(17,0,16,4) + Text = ("Window") + } + { Button3 Button + MoveScaled(34,0,16,4) + Text = ("Orientation") + } + } +} + +# Gambas Action File 3.0 + +{ Actions + { Action a + Text = "" + Picture = "icon:/22/bookmark" + } + { Action b + Text = "" + Picture = "icon:/22/computer" + } + { Action c + Text = "" + Picture = "icon:/22/edit" + } + { Action d + Text = "" + Picture = "icon:/small/save" + } + { Action e + Text = "Hello" + Picture = "icon:/small/save" + } +} + +{ Toolbars + { Toolbar test + Text = "" + List = "a,b,c,d,e" + Default = "a,|,d,e" + } +} diff --git a/comp/src/gb.form.mdi/.src/Tests/FMain1.class b/comp/src/gb.form.mdi/.src/Tests/FMain1.class new file mode 100644 index 00000000..6550b1bb --- /dev/null +++ b/comp/src/gb.form.mdi/.src/Tests/FMain1.class @@ -0,0 +1,48 @@ +' Gambas class file + +Public Sub _new() + +End + +Public Sub Form_Open() + + Application.MainWindow = Me + +End + +Public Sub Button1_Click() + + Label1.H = tlbrMain.Children[0].H + Print tlbrMain.H;; tlbrMain.Children[0].H;; ToolButton1.H + +End + +Public Sub Button2_Click() + + If Panel2.Parent = Panel1 Then + Panel2.Reparent(Me) + Else + Panel2.Reparent(Panel1) + Panel2.Next = ToolButton6 + Endif + +End + +Public Sub Panel2_MouseDrag() + + Drag(Panel2, "Coucou") + +End + +Public Sub Label1_DragMove() + + Debug + +End + +Public Sub Label1_Drop() + + Debug Drag.Data + +End + diff --git a/comp/src/gb.form.mdi/.src/Tests/FMain1.form b/comp/src/gb.form.mdi/.src/Tests/FMain1.form new file mode 100644 index 00000000..ef3571fd --- /dev/null +++ b/comp/src/gb.form.mdi/.src/Tests/FMain1.form @@ -0,0 +1,105 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,55,50) + Drop = True + { tlbrMain ToolBar + MoveScaled(1,1,45,6) + Key = "tb_main" + Separator = True + { ToolButton1 ToolButton + MoveScaled(0,0,4,4) + Action = "a1" + Picture = Picture["70a017.png"] + } + { ToolButton2 ToolButton + MoveScaled(4,0,4,4) + Action = "a2" + Picture = Picture["70a017.png"] + } + { ToolButton3 ToolButton + MoveScaled(8,0,4,4) + Action = "a3" + AutoResize = True + Text = ("Help") + Picture = Picture["70a017.png"] + } + { ToolButton4 ToolButton + MoveScaled(13,0,4,4) + Visible = False + Action = "a4" + Picture = Picture["icon:/small/add"] + } + } + { Button1 Button + MoveScaled(2,10,16,4) + Text = ("Button1") + } + { Panel1 Panel + MoveScaled(5,18,46,6) + Arrangement = Arrange.Horizontal + Border = Border.Plain + { ToolButton5 ToolButton + MoveScaled(2,1,5,4) + Border = True + } + { ToolButton6 ToolButton + MoveScaled(7,1,5,4) + Border = True + } + } + { Button2 Button + MoveScaled(9,28,16,4) + Text = ("Reparent") + } + { Panel2 Panel + MoveScaled(45,27,4,4) + Background = Color.LightBackground + Border = Border.Plain + } + { Label1 Label + MoveScaled(8,36,11,6) + Drop = True + Border = Border.Plain + } + { Panel3 Panel Label1 + Name = "Panel3" + MoveScaled(29,40,8,6) + Drop = True + Border = Border.Plain + } + { Separator1 Separator Label1 + Name = "Separator1" + MoveScaled(40,40,0,7) + Drop = True + } +} + +# Gambas Action File 3.0 + +{ Actions + { Action a1 + Text = "" + Picture = "70a017.png" + } + { Action a2 + Text = "" + Picture = "70a017.png" + } + { Action a3 + Text = "Help" + Picture = "70a017.png" + } + { Action a4 + Text = "" + Picture = "icon:/small/add" + } +} + +{ Toolbars + { Toolbar tb_main + Text = "" + List = "a1,a2,a3,a4" + Default = "a1,a2,a3" + } +} diff --git a/comp/src/gb.form.mdi/.src/Tests/FMain2.class b/comp/src/gb.form.mdi/.src/Tests/FMain2.class new file mode 100644 index 00000000..f5baf4d7 --- /dev/null +++ b/comp/src/gb.form.mdi/.src/Tests/FMain2.class @@ -0,0 +1 @@ +' Gambas class file diff --git a/comp/src/gb.form.mdi/.src/Tests/FMain2.form b/comp/src/gb.form.mdi/.src/Tests/FMain2.form new file mode 100644 index 00000000..a4813903 --- /dev/null +++ b/comp/src/gb.form.mdi/.src/Tests/FMain2.form @@ -0,0 +1,121 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,136,100) + Text = ("Agnostic Scan Tool") + Icon = Picture["scanner.png"] + Arrangement = Arrange.Vertical + { Menu1 Menu + Text = ("Menu1") + Visible = False + { mnuSave Menu + Action = "save" + Text = Shortcut(("Save"), "S") + Picture = Picture["icon:/small/save"] + } + { mnuSaveAs Menu + Action = "saveas" + Text = ("Save as") & "..." + Picture = Picture["icon:/small/save-as"] + } + { Menu2 Menu + } + { Properties Menu + Action = "properties" + Text = Shortcut(("Properties"), "P") + Picture = Picture["icon:/small/properties"] + } + { Menu3 Menu + } + { mnuQuit Menu + Action = "quit" + Text = Shortcut(("Quit"), "Q") + Picture = Picture["icon:/small/quit"] + } + } + { ToolBar1 ToolBar + MoveScaled(0,1,131,8) + Key = "toolbar" + { btnNew ToolButton + MoveScaled(2,0,8,7) + Action = "open" + Picture = Picture["icon:/small/new"] + } + { btnProperties ToolButton + MoveScaled(10,0,7,6) + Action = "properties" + Picture = Picture["icon:/small/properties"] + } + { btnSaveAs ToolButton + MoveScaled(77,0,5,5) + Action = "saveas" + Picture = Picture["icon:/small/save-as"] + } + { btnQuit ToolButton + MoveScaled(89,0,6,6) + Action = "quit" + Picture = Picture["icon:/small/quit"] + } + { MenuButton1 MenuButton + MoveScaled(25,2,27,4) + PopupMenu = "Menu1" + Text = ("Numériser Texte") + Picture = Picture["icon:/small/text"] + } + { btnSave ToolButton + MoveScaled(62,2,5,5) + Action = "save" + Picture = Picture["icon:/small/save"] + } + { Button1 Button + MoveScaled(99,2,18,3) + } + } + { Separator1 Separator + MoveScaled(2,8,124,0) + } + { MessageView1 MessageView + MoveScaled(3,10,126,4) + } + { View DocumentView + MoveScaled(3,16,52,42) + Expand = True + } +} + +# Gambas Action File 3.0 + +{ Actions + { Action open + Text = "" + Picture = "icon:/small/new" + } + { Action properties + Text = "Properties" + Shortcut = "" + Picture = "icon:/small/properties" + } + { Action quit + Text = "Quit" + Shortcut = "" + Picture = "icon:/small/quit" + } + { Action save + Text = "Save" + Shortcut = "" + Picture = "icon:/small/save" + } + { Action saveas + Text = "Save as" + Shortcut = "" + Picture = "icon:/small/save-as" + } +} + +{ Toolbars + { Toolbar toolbar + Text = "" + List = "open,properties,saveas,quit,save" + Default = "open,properties,saveas,quit,$MenuButton1,save,$Button1" + } +} diff --git a/comp/src/gb.form.mdi/.src/Tests/FTestSidePanel.class b/comp/src/gb.form.mdi/.src/Tests/FTestSidePanel.class new file mode 100644 index 00000000..2b52387a --- /dev/null +++ b/comp/src/gb.form.mdi/.src/Tests/FTestSidePanel.class @@ -0,0 +1,12 @@ +' Gambas class file + + +Public Sub Form_Open() + + Dim hForm As Form + + hForm = New Form1 + + Workspace1.Add(hForm) + +End diff --git a/comp/src/gb.form.mdi/.src/Tests/FTestSidePanel.form b/comp/src/gb.form.mdi/.src/Tests/FTestSidePanel.form new file mode 100644 index 00000000..3951e2fa --- /dev/null +++ b/comp/src/gb.form.mdi/.src/Tests/FTestSidePanel.form @@ -0,0 +1,19 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,104,64) + Background = &HFFFF00& + Arrangement = Arrange.Horizontal + { SidePanel1 SidePanel + MoveScaled(1,2,20,57) + Visible = False + Background = &HFFFFFF& + Orientation = Align.Left + Separator = True + Transparent = True + } + { Workspace1 Workspace + MoveScaled(44,7,48,52) + Expand = True + } +} diff --git a/comp/src/gb.form.mdi/.src/Tests/Form1.class b/comp/src/gb.form.mdi/.src/Tests/Form1.class new file mode 100644 index 00000000..92e57faa --- /dev/null +++ b/comp/src/gb.form.mdi/.src/Tests/Form1.class @@ -0,0 +1,17 @@ +' Gambas class file + +Static $iCpt As Integer + +Public Sub Form_Close() + + 'Message.Info("Hello") + +End + +Public Sub Form_Open() + + Inc $iCpt + Me.Title = "#" & $iCpt + Label1.Text = Me.Title + +End diff --git a/comp/src/gb.form.mdi/.src/Tests/Form1.form b/comp/src/gb.form.mdi/.src/Tests/Form1.form new file mode 100644 index 00000000..276edf08 --- /dev/null +++ b/comp/src/gb.form.mdi/.src/Tests/Form1.form @@ -0,0 +1,17 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,39,36) + Background = Color.LightBackground + Arrangement = Arrange.Vertical + { Panel1 Panel + MoveScaled(6,2,16,6) + } + { Label1 Label + MoveScaled(5,13,17,8) + Font = Font["+3"] + Padding = 4 + AutoResize = True + Border = Border.Sunken + } +} diff --git a/comp/src/gb.form.mdi/.src/Tests/Form2.class b/comp/src/gb.form.mdi/.src/Tests/Form2.class new file mode 100644 index 00000000..48869168 --- /dev/null +++ b/comp/src/gb.form.mdi/.src/Tests/Form2.class @@ -0,0 +1,17 @@ +' Gambas class file + + +Public Sub Panel_Draw() + + Draw.Style.Button(0, 0, Draw.W, Draw.H, False) + Draw.Rect(0, 0, Draw.W, Draw.H) + Draw.Text(Last.Name, 0, 0, Draw.W, Draw.H, Align.Left) + +End + +Public Sub Panel_Drop() + + Print Drag.Formats.Join(" ") + Print Drag.Data + +End diff --git a/comp/src/gb.form.mdi/.src/Tests/Form2.form b/comp/src/gb.form.mdi/.src/Tests/Form2.form new file mode 100644 index 00000000..7e3bfd94 --- /dev/null +++ b/comp/src/gb.form.mdi/.src/Tests/Form2.form @@ -0,0 +1,22 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,91,58) + { DrawingArea3 DrawingArea Panel + Name = "DrawingArea3" + MoveScaled(1,17,32,7) + } + { DrawingArea4 DrawingArea Panel + Name = "DrawingArea4" + MoveScaled(1,25,32,7) + } + { DrawingArea1 DrawingArea Panel + Name = "DrawingArea1" + MoveScaled(1,1,32,7) + Drop = True + } + { DrawingArea2 DrawingArea Panel + Name = "DrawingArea2" + MoveScaled(1,9,32,7) + } +} diff --git a/comp/src/gb.form.mdi/.src/ToolBar/CToolbar.class b/comp/src/gb.form.mdi/.src/ToolBar/CToolbar.class new file mode 100644 index 00000000..ab7b7446 --- /dev/null +++ b/comp/src/gb.form.mdi/.src/ToolBar/CToolbar.class @@ -0,0 +1,18 @@ +' Gambas class file + +Public (Key) As String +Public Text As String +Public DefaultConfig As String[] +Public List As String[] + +Public Sub _new(sKey As String, cSlot As Collection) + + Key = sKey + + If cSlot Then + Text = cSlot["Text"] + DefaultConfig = Split(cSlot["Default"], ",") + List = Split(cSlot["List"], ",") + Endif + +End diff --git a/comp/src/gb.form.mdi/.src/ToolBar/FToolBar.class b/comp/src/gb.form.mdi/.src/ToolBar/FToolBar.class new file mode 100644 index 00000000..538777d9 --- /dev/null +++ b/comp/src/gb.form.mdi/.src/ToolBar/FToolBar.class @@ -0,0 +1,1793 @@ +' Gambas class file + +Public Enum ICON_TINY, ICON_SMALL, ICON_MEDIUM, ICON_LARGE, ICON_HUGE + +Public ToolbarKey As String +Public $bDesign As Boolean + +Static Private $cRegister As New Collection +Static Private $hExpanderBg As Picture +Static Private $hConfigureImage As Image + +Private Const SEPARATOR_SIZE As Integer = 5 + +Private $hObserverParent As Observer +Private $bLock As Boolean +Private $bHidden As Boolean +Private $bVertical As Boolean = False +Private $bReallyVertical As Boolean +Private $bAutoResize As Boolean +Private $bConfigure As Boolean +Private $bInside As Boolean +Private $bPressed As Boolean +Private $sDropAction As String +Private $iIconSize As Integer +Private $iButtonWidth As Integer +Private $nRow As Integer + +Private $bOpened As Boolean + +Private $iHandleSize As Integer + +Private $iLock As Integer + +Private $aHidden As Control[] +Private $aDisabled As Control[] + +Public Sub _new() + + $iHandleSize = 1 'Max(4, Desktop.Scale) + $iButtonWidth = Desktop.Scale * 2 + GetRealIconSize() + dwgHandle.Width = $iHandleSize + $hObserverParent = New Observer(Me.Parent.Parent) As "Container" + $bAutoResize = True + UpdateHandle + + panWhere.Background = Color.SetAlpha(Color.TextForeground, 192) + +End + +Private Sub GetToolBar() As ToolBar + + Return Me.Parent + +End + +Public Sub IsVertical() As Boolean + + Return $bReallyVertical + +End + +Public Sub SetVertical(bVertical As Boolean) + + $bReallyVertical = bVertical + Update + +End + +Public Function GetContainer() As Container + + Return panToolBar + +End + +Private Function GetToolBarWidth(Optional (bPadding) As Boolean) As Integer + + Dim hCtrl As Control + Dim W As Integer + Dim WH As Integer + + If $bReallyVertical Then + + ' For Each hCtrl In panToolBar.Children + ' If Not hCtrl.Visible Then Continue + ' W = Max(W, hCtrl.W) + ' Next + ' + ' W = Max(W, $iButtonWidth) + + W = $iButtonWidth + + Else + + If dwgHandle.Visible Then WH = dwgHandle.W + + For Each hCtrl In panToolBar.Children + If hCtrl.Visible Then + If hCtrl.Expand Then Return GetFreeWidth() - WH + W += hCtrl.W + Endif + Next + + Endif + + 'If bPadding Then W += panToolBar.Padding * 2 + Return W + +End + +Private Sub GetToolBarHeight(Optional WW As Integer, (bPadding) As Boolean) As Integer + + Dim hCtrl As Control + Dim X, W, H As Integer + Dim SH As Integer + + If $bReallyVertical Then + + If dwgHandle.Visible Then SH = dwgHandle.H + + For Each hCtrl In panToolBar.Children + If hCtrl.Visible Then + If hCtrl.Expand Then Return GetFreeHeight() - SH + H += hCtrl.H + Endif + Next + + Else + + If dwgHandle.Visible Then SH = dwgHandle.W + + 'If ToolBarKey = "image" Then Debug ToolBarKey;; "WW =";; WW + + $nRow = 1 + X = SH + For Each hCtrl In panToolBar.Children + If hCtrl.Visible Then + 'If ToolBarKey = "image" Then Debug ToolbarKey;; $nRow;; hCtrl.Name;; X;; hCtrl.W;; If(hCtrl.Expand, "E", "") + W = hCtrl.W + If hCtrl.Expand Then W = Desktop.Scale + If (X + W) > WW Then + X = SH + Inc $nRow + Endif + X += W + Endif + Next + + H = $iButtonWidth * $nRow + 'If ToolBarKey = "image" Then Debug ToolBarKey;; $nRow + + Endif + + 'If bPadding Then H += panToolBar.Padding * 2 + + 'If ToolBarKey = "image" Then Debug ToolBarKey;; "H = "; H + Return H + +End + +' Private Sub GetMaxWidth() As Integer +' +' Dim W As Integer = Me.Parent.Width +' If sepToolbar.Visible Then Dec W +' Return W +' +' End + + +Private Function GetFreeWidth() As Integer + + Return Me.Parent.Parent.ClientW + +End + +Private Function GetFreeHeight() As Integer + + Return Me.Parent.Parent.ClientH + +End + +Private Sub GetParentArrangement() As Integer + + Dim hObject As Object = GetToolBar().Parent + Dim iArrange As Integer + + Try iArrange = hObject.Arrangement + If Not Error Then Return iArrange + If hObject Is VBox Then + Return Arrange.Vertical + Else If hObject Is HBox Then + Return Arrange.Horizontal + Endif + +End + +Private Sub SetArrangement() + + Dim hToolbar As ToolBar = GetToolBar() + Dim SH As Integer + Dim X, Y, W, NX, WT As Integer + Dim hCtrl As Control + + If $bDesign Then Return + 'If $bInSetArrangement Then Return + + 'If ToolbarKey = "image" Then Debug ToolBarKey;; panToolBar.W; " x "; panToolBar.H;; "["; hToolbar.Arrangement; "]" + + If Not $bReallyVertical Then + + If dwgHandle.Visible Then SH = dwgHandle.W + + If $nRow = 1 Then + For Each hCtrl In panToolBar.Children + If hCtrl.Visible Then + If hCtrl.Expand Then + 'Debug ToolbarKey;; "Expand";; hCtrl.Name + Inc NX + Else + WT += hCtrl.W + Endif + Endif + Next + WT = Max(0, panToolBar.W - WT) + 'Debug ToolBarKey;; "WT = "; WT;; NX + Endif + + X = If(System.RightToLeft, panToolBar.W - SH, SH) + For Each hCtrl In panToolBar.Children + If Not hCtrl.Visible Then Continue + + W = hCtrl.W + If hCtrl.Expand Then + If $nRow = 1 Then + If NX And If WT > 0 Then + W = WT \ NX + WT -= W + Dec NX + Else + W = Desktop.Scale + Endif + Else + If hCtrl.Next Then + W = Desktop.Scale + Else + W = Max(Desktop.Scale, panToolBar.W - X) + Endif + Endif + Endif + + If System.RightToLeft Then + + X -= W + If X < 0 Then + X = panToolBar.W - SH + Y += $iButtonWidth + If hCtrl.Expand And If Not hCtrl.Next Then W = X 'panToolBar.W - X + Endif + 'If ToolbarKey = "editor" Then Debug ToolBarKey;; hCtrl.Name;; X;; Y;; W + hCtrl.Move(X, Y, W, $iButtonWidth) + + Else + + If (X + W) > panToolBar.W Then + X = SH + Y += $iButtonWidth + If hCtrl.Expand And If Not hCtrl.Next Then W = panToolBar.W - X + Endif + 'If ToolbarKey = "editor" Then Debug ToolBarKey;; hCtrl.Name;; X;; Y;; W + hCtrl.Move(X, Y, W, $iButtonWidth) + X += W + + Endif + + Next + + Else + + If $nRow = 1 Then + hToolbar.Arrangement = If($bReallyVertical, Arrange.Vertical, Arrange.Horizontal) + Else + hToolbar.Arrangement = If($bReallyVertical, Arrange.Vertical, Arrange.Row) 'Arrange.Row 'If($bVertical, Arrange.Column, Arrange.Row) + Endif + + Endif + + 'If ToolbarKey = "image" Then Debug "==>";; ToolBarKey;; panToolBar.W; " x "; panToolBar.H;; "["; hToolbar.Arrangement; "]" + +End + +Private Sub Update() + + Dim W, H As Integer + Dim XH, YH, WH, HH As Integer + Dim XP, YP As Integer + Dim hToolbar As ToolBar = GetToolBar() + + If Not Object.IsValid(hToolbar) Then Return + If Not Object.IsValid(hToolbar.Parent) Then Return + If $iLock Then Return + If $bLock Then Return + $bLock = True + + 'If ToolBarKey = "image" Then Debug System.Backtrace.Join(" ") + + 'hToolbar.Arrangement = Arrange.None + CheckSeparators + + If Not $bReallyVertical Then + + If System.RightToLeft Then + XH = Me.W - $iHandleSize + YH = 0 + XP = 0 + Else + XH = 0 + YH = 0 + XP = $iHandleSize + Endif + YP = 0 + WH = $iHandleSize + HH = Me.H + + Else + + XH = 0 + YH = 0 + WH = Me.W + HH = $iHandleSize + XP = 0 + YP = $iHandleSize + + Endif + + If Not dwgHandle.Visible Then + WH = 0 + HH = 0 + XP = 0 + YP = 0 + Endif + + If $bDesign Then + + If dwgHandle.Visible Then + dwgHandle.Move(XH, YH, WH, HH) + If Not $bReallyVertical Then + panToolBar.Move(XP, YP, Me.W - WH, Me.H) + Else + panToolBar.Move(XP, YP, Me.W, Me.H - HH) + Endif + Else + panToolBar.Move(XP, YP, Me.W, Me.H) + Endif + + Else + + panToolBar.Show + + If Not $bReallyVertical Then + If $bAutoResize Then + W = Max($iHandleSize, Min(GetToolBarWidth() + WH, GetFreeWidth())) + 'H = Max(GetToolBarHeight(True), panToolBar.H) + Else + W = Max($iHandleSize, GetToolBarWidth() + WH) + Endif + If GetParentArrangement() = Arrange.Vertical Then W = Max(W, GetToolBar().Parent.ClientW) + H = GetToolBarHeight(W, True) + Else + If $bAutoResize Then + 'W = Max(GetToolBarWidth(True), GetMaxWidth()) + H = Max($iHandleSize, Min(GetToolBarHeight() + HH, GetFreeHeight())) + Else + 'W = GetToolBarWidth(True) + H = Max($iHandleSize, GetToolBarHeight() + HH) + Endif + W = GetToolBarWidth(True) + Endif + 'W += $iHandleSize + + If dwgHandle.Visible Then dwgHandle.Move(XH, YH, WH, HH) + If Not $bReallyVertical Then + panToolBar.Move(XP, YP, W - WH, H) + Else + panToolBar.Move(XP, YP, panToolBar.W, H - HH) + Endif + 'If ToolBarKey = "image" Then Debug ToolBarKey;; panToolBar.W; " x "; panToolBar.H;; "(";; H;; HH; ")" + + Endif + + If Not $bReallyVertical Then + sepToolbar.Move(0, Me.H - 1, Me.W, 1) + Else + sepToolbar.Move(Me.W - 1, 0, 1, Me.H) + Endif + + 'dwgHandle.Refresh + + $bLock = False + + If sepToolbar.Visible Then + If $bReallyVertical Then + Inc W + Else + Inc H + Endif + Endif + + 'Debug panToolBar.X;; panToolBar.Y;; panToolBar.W;; panToolBar.H;; "/";; W;; H + 'If panToolBar.Children.Count Then Debug "=>";; panToolBar.Children[0].X;; panToolBar.Children[0].Y;; panToolBar.Children[0].W;; panToolBar.Children[0].H + + If Not $bDesign Then + Me.Resize(W, H) + Me.Parent.Resize(W, H) + Endif + + SetArrangement + +End + +Public Sub Form_Resize() + + Update + +End + + +Public Sub Container_Arrange() + + Update + +End + + +Public Sub panToolbar_BeforeArrange() + + If $bDesign Then Return + + 'If ToolbarKey = "image" And If panToolBar.H = 630 Then Debug System.Backtrace.Join(" ") + + Update + SetArrangement + +End + +Public Function IsHidden() As Boolean + + Return $bHidden + +End + +Public Sub SetHidden(bHidden As Boolean) + + If bHidden = $bHidden Then Return + $bHidden = bHidden + Update + Action.Raise(Me.Parent) + +End + +' PUBLIC SUB dwgHandle_DblClick() +' < +' SetHidden(NOT $bHidden) +' +' END + +Public Sub dwgHandle_Draw() + + Dim iFlag As Integer + + If $bInside Then iFlag += Draw.Hover + If Not Me.Enabled Then iFlag += Draw.Disabled + + 'Draw.Style.Button(1, 1, dwgHandle.W - 2, dwgHandle.H - 2, $bPressed And $bInside, Not Me.Enabled) + 'Draw.Style.Handle(1, 1, dwgHandle.W - 2, dwgHandle.H - 2, Not $bVertical, iFlag) + 'If $bInside Then + If $bInside Or If $bConfigure Then + Draw.FillRect(0, 0, dwgHandle.W, dwgHandle.H, Color.Merge(Color.LightForeground, Color.TextBackground, 0.3)) + Else + Draw.FillRect(0, 0, dwgHandle.W, dwgHandle.H, Color.LightForeground) + Endif + 'Endif + 'Draw.Style.Separator(0, 0, dwgHandle.W, dwgHandle.H, $bVertical, Not Me.Enabled) + 'Draw.FillX = 0 + 'Draw.FillY = 0 + 'Draw.Style.Separator(1, 1, dwgHandle.W - 2, dwgHandle.H - 2, $bVertical, Not Me.Enabled) + +End + +Private Sub UpdateHandle() + + 'If $bInside Or If $bConfigure Then + ' dwgHandle.Background = Color.Merge(Color.Background, Color.Foreground, 0.3) + 'Else + ' dwgHandle.Background = Color.Default + 'Endif + dwgHandle.Refresh + +End + + +Public Sub dwgHandle_Enter() + + If $bDesign Then Return + $bInside = True + UpdateHandle + +End + +Public Sub dwgHandle_Leave() + + If $bDesign Then Return + $bInside = False + UpdateHandle + +End + +Public Sub dwgHandle_MouseDown() + + If $bDesign Then Return + $bPressed = True + dwgHandle.Refresh + 'SetHidden(NOT $bHidden) + +End + +Public Sub dwgHandle_MouseUp() + + If $bDesign Then Return + $bPressed = False + If $bInside Then + dwgHandle.Refresh + If ToolbarKey Then Action._ConfigureToolbar(Me.Parent) + Endif + 'SetHidden(NOT $bHidden) + +End + +Public Sub IsAutoResize() As Boolean + + Return $bAutoResize + +End + +Public Sub SetAutoResize(bAutoResize As Boolean) + + $bAutoResize = bAutoResize + Update + +End + +Private Sub SetObserverOn(hCtrl As Control) + + Dim hObs As Observer + Dim hCont As Container + + hObs = New Observer(hCtrl) As "Item" + If Not hCtrl Is Container Then Return + + hCont = hCtrl + For Each hCtrl In hCont.Children + SetObserverOn(hCtrl) + Next + +End + + +Private Sub InitToolbar() + + Dim hCtrl As Control + Dim sAction As String + Dim aList As String[] + Dim aReparent As Control[] + + If Not ToolBarKey Then Return + + aList = GetDefaultConfig() + If Not aList Then Return + + ' Debug panToolBar.Children.Count + ' Debug System.Backtrace.Join("\n") + + aReparent = New Control[] + For Each hCtrl In panToolBar.Children + If hCtrl.Action Or If hCtrl Is Separator Then + SetObserverOn(hCtrl) + sAction = hCtrl.Action + If sAction Then + If Left(sAction) = "." Then sAction = Mid$(sAction, 2) + If Not aList.Exist(sAction) Then aReparent.Add(hCtrl) + Endif + Endif + Next + + For Each hCtrl In aReparent + hCtrl.Reparent(panHide) + hCtrl.Show + Next + +End + +Public Sub FindControl(sAction As String, Optional bHiddenOnly As Boolean) As Control + + Dim hCtrl As Control + + If Not bHiddenOnly Then + + For Each hCtrl In panToolBar.Children + If hCtrl.Action = sAction Or If hCtrl.Action = ("." & sAction) Then Return hCtrl + Next + + Endif + + For Each hCtrl In panHide.Children + If hCtrl.Action = sAction Or If hCtrl.Action = ("." & sAction) Then Return hCtrl + Next + +End + + +Public Sub Form_Open() + + 'Debug panToolBar.Children.Count + + If Not $bDesign Then + $bOpened = True + InitToolbar + RegisterToolbar + 'If ToolBarKey = "main" Then System._Breakpoint() + LoadConfig(True) + Endif + +End + +' Public Sub panToolBar_Menu() +' +' Debug "Toolbar menu" +' +' End +' +' Public Sub Item_Menu() +' +' Debug "Item menu" +' +' End + +Private Sub FindToolbar() As CToolbar + + Dim hToolbar As CToolbar + + MAction.InitAction + + hToolbar = MAction.Toolbars[ToolbarKey] + + If Not hToolbar Then + hToolbar = New CToolbar(ToolbarKey, Null) + hToolbar.DefaultConfig = GetCurrentConfig() + MAction.Toolbars[ToolbarKey] = hToolbar + Endif + + Return hToolbar + +End + +Private Sub GetCurrentConfig() As String[] + + Dim aConfig As New String[] + Dim hCtrl As Control + Dim sAction As String + + For Each hCtrl In panToolBar.Children + If hCtrl.Action Then + sAction = hCtrl.Action + If Left(sAction) = "." Then sAction = Mid$(sAction, 2) + aConfig.Add(sAction) + Else If hCtrl Is Separator + aConfig.Add("|") + Else If hCtrl Is ToolBarExpander Then + aConfig.Add("~") + Else If hCtrl Is Panel And If Panel(hCtrl).Children.Count = 0 Then + If hCtrl.Expand Then + aConfig.Add("~") + Else + aConfig.Add("-") + Endif + Else If hCtrl.Visible Then + aConfig.Add("$" & hCtrl.Name) + Endif + Next + + Return aConfig + +End + + +Private Sub GetDefaultConfig() As String[] + + Dim aConfig As String[] + + aConfig = FindToolbar().DefaultConfig + If aConfig Then Return aConfig + +End + + + +Public Sub SetConfigureMode(bConfigure As Boolean) + + Dim hChild As Control + + If $bConfigure = bConfigure Then Return + + $bConfigure = bConfigure + + ' For Each hChild In panToolBar.Children + ' hChild.Drop = $bConfigure + ' Next + ' For Each hChild In panHide.Children + ' hChild.Drop = $bConfigure + ' Next + Me.Drop = $bConfigure + + 'panToolBar.Enabled = Not $bConfigure + 'Me.Parent.Enabled = Not $bConfigure + If $bConfigure Then + 'hColor = Color[Color.LightBackground] + 'hColor.Saturation /= 2 + 'Me.Background = dwgHandle.Background 'hColor.Color + Else + 'Me.Background = Color.Default + Endif + UpdateHandle + 'dwgHandle.Enabled = Not $bConfigure + + Lock() + If $bConfigure Then + + $aHidden = New Control[] + $aDisabled = New Control[] + + For Each hChild In panToolBar.Children + If hChild Is Separator Then Continue + If Not hChild.Visible Then + $aHidden.Add(hChild) + hChild.Show + Endif + If Not hChild.Enabled Then + $aDisabled.Add(hChild) + hChild.Enabled = True + Endif + Next + For Each hChild In panHide.Children + If hChild Is Separator Then Continue + If Not hChild.Enabled Then + $aDisabled.Add(hChild) + hChild.Enabled = True + Endif + Next + Else + + For Each hChild In $aHidden + hChild.Hide + Next + $aHidden = Null + + For Each hChild In $aDisabled + hChild.Enabled = False + Next + $aDisabled = Null + + SaveConfig + 'panToolBar.Refresh + + Endif + Unlock() + + panToolBar.Refresh + +End + +Public Sub Form_Drag() + + If Not $bConfigure Or If Drag.Format <> MAction.MIME Then + HideWhere(True) + Stop Event + Return + Endif + +End + +Private Sub WaitALittle(iCount As Integer) + + Dim eTime As Float + Dim eWait As Float + + eTime = Timer + 'Wait + eWait = (0.01 / iCount) - (eTime - Timer) + If eWait > 0 Then Sleep eWait + +End + + +Private Sub HideWhere(bAnim As Boolean) + + Dim D As Integer + + If Not panWhere.Visible Then Return + + If $bVertical Then + D = panWhere.H + Else + D = panWhere.W + Endif + + 'panWhere.Border = Border.None + If bAnim Then + For D = D - 1 To 1 Step -2 + If $bVertical Then + panWhere.H = D + Else + panWhere.W = D + Endif + WaitALittle(D) + Next + Endif + panWhere.Hide + +End + +Private Sub ShowWhere(sAction As String, bAnim As Boolean, Optional hCtrl As Control) + + Dim D As Integer + Dim DM As Integer + Dim W, H As Integer + + If Not hCtrl Then + If sAction And If Not FToolBarConfig.IsSpecialAction(sAction) Then + hCtrl = FindControl(sAction) + If Not hCtrl Then Return + Endif + Endif + + If hCtrl Then + W = hCtrl.W + H = hCtrl.H + panWhere.Move(hCtrl.X, hCtrl.Y) + Else + If $bVertical Then + W = GetToolBarHeight() + H = If(sAction = "-", Desktop.Scale, SEPARATOR_SIZE) + Else + W = If(sAction = "-", Desktop.Scale, SEPARATOR_SIZE) + H = GetToolBarHeight() + Endif + Endif + + If $bVertical Then + DM = H + panWhere.W = W + Else + DM = W + panWhere.H = H + Endif + + panWhere.Show + If bAnim Then + For D = 1 To DM - 1 Step 2 + 'For D = DM To DM + If $bVertical Then + panWhere.H = D + Else + panWhere.W = D + Endif + WaitALittle(DM) + Next + Endif + If $bVertical Then + panWhere.H = DM + Else + panWhere.W = DM + Endif + 'panWhere.Border = Border.Plain + + 'Debug panWhere.X;; panWhere.Y;; panWhere.W;; panWhere.H;; panWhere.Visible;; panWhere.Parent.Name + +End + +Public Sub Form_DragMove() + + Dim hCtrl As Control + Dim bBefore As Boolean + Dim bAnim As Boolean + Dim X, Y As Integer + + If Not $bConfigure Or If Drag.Format <> MAction.MIME Then + HideWhere(True) + Stop Event + Return + Endif + + hCtrl = panToolBar.FindChild(Drag.X - panToolBar.X, Drag.Y - panToolBar.Y) + If Not hCtrl Then + Stop Event + Return + Endif + + While hCtrl._Parent <> panToolBar + hCtrl = hCtrl._Parent + Wend + + If hCtrl = panWhere Then Return + + X = Drag.X - panToolBar.X - hCtrl.X + Y = Drag.Y - panToolBar.Y - hCtrl.Y + + If $bVertical Then + + bBefore = Y <= (hCtrl.H \ 2) + 'If Not bBefore And If Drag.Y > ((hCtrl.H * 2) \ 3) Then Return + + Else + + bBefore = X <= (hCtrl.W \ 2) + 'If Not bBefore And If Drag.X > ((hCtrl.W * 2) \ 3) Then Return + + Endif + + If bBefore Then + If panWhere.Next = hCtrl Then Return + Else + If hCtrl.Next = panWhere Then Return + Endif + + bAnim = Not panWhere.Visible + 'panWhere.Hide + 'HideWhere(False) + + If bBefore Then + panWhere.Next = hCtrl + Else + panWhere.Next = hCtrl.Next + hCtrl.Next = panWhere + Endif + + ShowWhere(Drag.Paste(MAction.MIME), bAnim) + +End + +Private Sub GetControlAction(hCtrl As Control) As String + + Dim sAction As String + + sAction = hCtrl.Action + If Left(sAction) = "." Then sAction = Mid$(sAction, 2) + If Not sAction Then + If hCtrl Is ToolBarExpander Then + sAction = "~" + Else If hCtrl Is Separator + sAction = "|" + Else If hCtrl Is Panel And If Panel(hCtrl).Children.Count = 0 Then + sAction = "-" + Endif + Endif + + Return sAction + +End + + +Private Sub OnMouseDrag(hCtrl As Control) + + Dim sAction As String + + While hCtrl._Parent <> panToolBar + hCtrl = hCtrl._Parent + 'Debug "-> "; hCtrl + Wend + + If Not $bConfigure Then Return + + sAction = GetControlAction(hCtrl) + If Not sAction Then Return + + $bLock = True + 'Lock() + DragStart(True) + panWhere.Next = hCtrl.Next + hCtrl.Next = panWhere + ShowWhere(sAction, False, hCtrl) + hCtrl.Hide + 'Unlock() + + ' Debug "----------------" + ' ' Debug System.Backtrace.Join(" ") + ' For Each hCtrl In panToolBar.Children + ' Debug hCtrl.Name;; hCtrl.Visible;; hCtrl.X;; hCtrl.Y;; hCtrl.W;; hCtrl.H + ' Next + ' ' Debug "----------------" + + FToolBarConfig.DragAction(hCtrl, sAction) + $bLock = False + +End + +Public Sub Item_KeyPress() + + If $bConfigure Then Stop Event + +End + + +Public Sub Item_MouseDown() + + If $bConfigure Then Stop Event + +End + +' Public Sub Item_Enter() +' +' $iBackground = Last.Background +' +' If $bConfigure Then +' Last.Background = panWhere.Background +' Stop Event +' Endif +' +' End +' +' Public Sub Item_Leave() +' +' If $bConfigure Then +' 'If InStr("~-|", GetControlAction(Last)) Then +' Last.Background = $iBackground +' 'Endif +' Stop Event +' Endif +' +' End + +Public Sub Item_Menu() + + If $bConfigure Then + Stop Event + Else + If Not Application.ActiveControl Is TextBox Then + FToolBarConfig.OpenMenu(Me.Parent) + Stop Event + Endif + Endif + +End + +Public Sub Item_MouseDrag() + + OnMouseDrag(Last) + +End + +Public Sub Form_Drop() + + panWhere_Drop + +End + +Public Sub DragStart(bOutside As Boolean) + + $sDropAction = "" + If bOutside Then + panWhere.Resize(SEPARATOR_SIZE, SEPARATOR_SIZE) + 'Debug + panWhere.Reparent(panToolBar) + Endif + +End + + +Public Sub DragEnd(bAnim As Boolean) + + Dim hCtrl As Control + + If $sDropAction Then + + If $sDropAction = "|" Then + AddSeparator(panWhere) + Else If $sDropAction = "~" Then + AddExpander(panWhere) + Else If $sDropAction = "-" Then + AddSpace(panWhere) + Else + hCtrl = FindControl($sDropAction) + If hCtrl Then + ShowControl(hCtrl) + hCtrl.Show + hCtrl.Enabled = True + hCtrl.Next = panWhere.Next + Endif + Endif + Update + + Endif + + HideWhere(bAnim) + 'Debug + panWhere.Reparent(Me) + +End + +Public Sub panWhere_Drag() + + If Not $bConfigure Or If Drag.Format <> MAction.MIME Then + Stop Event + Return + Endif + +End + +Private Sub AddSeparator(Optional hNext As Control) + + Dim hSep As Separator + Dim hObs As Observer + Dim W, H As Integer + + Lock() + + If $bVertical Then + W = GetToolBarHeight() + H = SEPARATOR_SIZE + Else + W = SEPARATOR_SIZE + H = GetToolBarHeight() + Endif + + hSep = New Separator(panToolBar) + hSep.Next = hNext + + hSep.Resize(W, H) + hSep.Drop = True + hObs = New Observer(hSep) As "Item" + + Unlock() + +End + +Private Sub AddSpace(Optional hNext As Control) + + Dim hSpace As Panel + Dim hObs As Observer + Dim W, H As Integer + + Lock() + + If $bVertical Then + W = GetToolBarHeight() + H = Desktop.Scale + Else + W = Desktop.Scale + H = GetToolBarHeight() + Endif + + hSpace = New Panel(panToolBar) + hSpace.Next = hNext + + hSpace.Resize(W, H) + hSpace.Drop = True + hObs = New Observer(hSpace) As "Item" + + Unlock() + +End + +Public Sub ToolBarExpander_Draw() + + If $bConfigure Then + If Not $hExpanderBg Then $hExpanderBg = Picture["img/expander.png"] + Draw.Tile($hExpanderBg, 0, (Last.H - $hExpanderBg.H) / 2, Last.W, $hExpanderBg.H) + Endif + +End + + +Private Sub AddExpander(Optional hNext As Control) + + Dim hExp As ToolBarExpander + Dim hObs As Observer + Dim W, H As Integer + + Lock() + + If $bVertical Then + W = GetToolBarHeight() + H = SEPARATOR_SIZE + Else + W = SEPARATOR_SIZE + H = GetToolBarHeight() + Endif + + hExp = New ToolBarExpander(panToolBar) As "ToolBarExpander" + hExp.Next = hNext + hExp.Resize(W, H) + hExp.Drop = True + hObs = New Observer(hExp) As "Item" + + Unlock() + +End + + +Public Sub panWhere_Drop() + + 'Debug + $sDropAction = Drag.Paste(MAction.MIME) + +End + +Public Sub SetText(sText As String) + + Me.Text = sText + If $bDesign Then Return + If sText Then + dwgHandle.ToolTip = Subst$(("Configure &1 toolbar"), sText) + Else + dwgHandle.ToolTip = ("Configure main toolbar") + Endif + +End + +Private Sub RegisterToolbar() + + Dim aSlot As FToolBar[] + + If Not ToolbarKey Then Return + + 'Debug ToolbarKey + + If Not $cRegister.Exist(ToolbarKey) Then + $cRegister[ToolbarKey] = New FToolbar[] + Endif + + aSlot = $cRegister[ToolbarKey] + If Not aSlot.Exist(Me) Then + aSlot.Add(Me) + Endif + +End + +Private Sub UnregisterToolbar() + + Dim aSlot As FToolBar[] + Dim iInd As Integer + + If Not ToolbarKey Then Return + + 'Debug ToolbarKey + + aSlot = $cRegister[ToolbarKey] + If aSlot Then + iInd = aSlot.Find(Me) + If iInd >= 0 Then + aSlot.Remove(iInd) + Endif + Endif + +End + + +Public Sub SetKey(sKey As String) + + If ToolbarKey = sKey Then Return + + If $bOpened Then UnregisterToolbar + ToolbarKey = Object.Type(GetToolBar().Window) & "." & sKey + + If $bOpened Then + InitToolbar + RegisterToolbar + Endif + 'dwgHandle.Visible = ToolbarKey + Update + +End + +Public Sub GetKey() As String + + Dim iPos As Integer + + If Not ToolBarKey Then Return + iPos = InStr(ToolBarKey, ".") + Return Mid$(ToolBarKey, iPos + 1) + +End + + + +Public Sub Form_Close() + + UnregisterToolbar + +End + +Private Sub ToolbarToStockSize(iSize As Integer) As String + + Select Case iSize + Case ICON_HUGE + Return "huge" + Case ICON_MEDIUM + Return "medium" + Case ICON_LARGE + Return "large" + Case ICON_TINY + Return "tiny" + Default + Return "small" + End Select + +End + +Private Sub CalcIconSize(iIconSize As Integer) As Integer + + Return Stock.GetSize(ToolbarToStockSize(iIconSize)) + +End + +Private Sub GetIcon(hAction As CAction) As Picture + + Dim aIcon As String[] + Dim hIcon As Picture + Dim iSize As Integer + Dim sIcon As String + + iSize = CalcIconSize($iIconSize) + + sIcon = hAction.IconPath + + If sIcon Begins "icon:/" Then + aIcon = Split(sIcon, "/") + aIcon[1] = iSize + hIcon = Picture[aIcon.Join("/")] + Else + hIcon = hAction.Icon + If hIcon Then + hIcon = hIcon.Image.Stretch(iSize, iSize).Picture + Endif + Endif + + Return hIcon + +End + +Private Sub ResizeControl(hCtrl As Control, iDim As Integer) + + Dim hToolButton As Object + Dim sAction As String + Dim hAction As CAction + + If $bReallyVertical Then + hCtrl.W = iDim + Else + hCtrl.H = iDim + Endif + + If hCtrl Is ToolButton Or If hCtrl Is MenuButton + If hCtrl.Action Then + hToolButton = hCtrl + If Not hToolButton.Text Then + If hCtrl Is ToolButton Then + hCtrl.Resize(iDim, iDim) + Else + hCtrl.Resize(iDim + Desktop.Scale * 2, iDim) + Endif + Endif + sAction = hCtrl.Action + If Left$(sAction) = "." Then sAction = Mid$(sAction, 2) + hAction = MAction.Actions[sAction] + If hAction And If hAction.IconPath Then + hToolButton.Picture = GetIcon(hAction) + Endif + Endif + Endif + +End + +Private Sub CheckSeparators() + + Dim hLast As Control + Dim hChild As Control + + If $bDesign Then Return + + For Each hChild In panToolBar.Children + If hChild Is Separator Then + hChild.Resize(SEPARATOR_SIZE, SEPARATOR_SIZE) + If FToolBarConfig.WillBeDeleted(hChild) Then Continue + hChild.Show + Endif + Next + + If $bConfigure Then Return + + For Each hChild In panToolBar.Children + + If Not hChild.Visible Then Continue + If Not hLast Or If hLast Is Separator Then + If hChild Is Separator Then + hChild.Hide + Continue + Else If hLast And If hChild.Expand Then + hLast.Hide + Endif + Endif + hLast = hChild + + Next + + If hLast And If hLast Is Separator Then hLast.Hide + +End + +Private Sub StockToToolbarSize(sSize As String) As Integer + + Select Case LCase(sSize) + Case "medium" + Return ICON_MEDIUM + Case "large" + Return ICON_LARGE + Case "huge" + Return ICON_HUGE + Case "tiny" + Return ICON_TINY + Case Else + Return ICON_SMALL + End Select + +End + + +Public Sub GetLayout(Optional bReset As Boolean) As Variant + + Dim sSize As String + Dim aConfig As String[] + Dim aDefaultConfig As String[] + + If Not bReset Then + aConfig = GetCurrentConfig() + aDefaultConfig = GetDefaultConfig() + If aConfig.Join(",") = aDefaultConfig.Join(",") Then aConfig = Null + Endif + + sSize = Choose($iIconSize + 1, "Tiny", "", "Medium", "Large", "Huge") + + Return [sSize, aConfig] + +End + +Public Sub SetLayout(vLayout As Variant, Optional bInit As Boolean) + + Dim sSize As String + Dim aConfig As String[] + Dim bEnabled As Boolean + Dim iInd As Integer + Dim hCtrl As Control + Dim sAction As String + + MAction.InitAction + + sSize = vLayout[0] + aConfig = vLayout[1] + + $iIconSize = StockToToolbarSize(sSize) + $iButtonWidth = 12 + Max(Me.Font.Height * 0.8, GetRealIconSize()) + + If Not aConfig Then + 'If $iIconSize = ICON_SMALL Then + ' If bInit Then Goto RAISE_CONFIGURE + 'Endif + aConfig = GetDefaultConfig() + If Not aConfig Then Goto RAISE_CONFIGURE + Endif + + bEnabled = panToolBar.Enabled + panToolBar.Enabled = True + panToolBar.Hide + Lock() + + iInd = 0 + While iInd < panToolBar.Children.Count + hCtrl = panToolBar.Children[iInd] + ResizeControl(hCtrl, $iButtonWidth) + If hCtrl.Action Then + hCtrl.Reparent(panHide) + Else If FToolBarConfig.IsSpecialAction(GetControlAction(hCtrl)) Then + hCtrl.Delete + Else + Inc iInd + Endif + Wend + + For Each hCtrl In panHide.Children + ResizeControl(hCtrl, $iButtonWidth) + Next + + For Each sAction In aConfig + + 'Print "Action "; sAction + If sAction = "|" Then + 'Print "--> AddSeparator()" + AddSeparator() + Else If sAction = "~" Then + AddExpander() + Else If sAction = "-" Then + AddSpace() + Else If Left(sAction) = "$" Then + hCtrl = Me[Mid$(sAction, 2)] + If hCtrl And If Object.IsValid(hCtrl) Then + 'Print "--> Reparent to panToolbar" + hCtrl.Reparent(panToolBar) + hCtrl.Raise + Endif + Else + hCtrl = FindControl(sAction) + If hCtrl Then + 'Print "--> Reparent to panToolbar" + 'bVisible = hCtrl.Visible + hCtrl.Reparent(panToolBar) + hCtrl.Raise + If bInit Then hCtrl.Show + 'If hCtrl.Visible <> bVisible Then Debug "**** VISIBLE CHANGED FOR "; sAction + Endif + Endif + + Next + + ' For Each hCtrl In panToolBar.Children + ' If hCtrl Is Separator Then Continue + ' If hCtrl.Action Then Continue + ' hCtrl.Raise + ' Next + + panToolBar.Enabled = bEnabled + panToolBar.Show + + Unlock() + +RAISE_CONFIGURE: + + If Not $bConfigure Then GetToolBar()._RaiseConfigure + +End + +Static Public Sub LoadLayout(sKey As String) As Variant + + Dim sSize As String + Dim aConfig As String[] + + sSize = Settings["/gb.form.mdi/Toolbars/" &/ sKey &/ "Size"] + aConfig = Settings["/gb.form.mdi/Toolbars/" &/ sKey &/ "Layout"] + + Return [sSize, aConfig] + +End + +Public Sub LoadConfig(Optional bInit As Boolean) + + Dim vLayout As Variant + + If Not ToolbarKey Then Return + If $bDesign Then Return + + vLayout = LoadLayout(ToolbarKey) + If Not vLayout[0] And If Not vLayout[1] Then vLayout = LoadLayout(GetKey()) + + SetLayout(vLayout, bInit) + +End + +Static Public Sub SaveLayout(sKey As String, vLayout As Variant, Optional hIgnore As FToolBar) + + Dim hForm As FToolBar + Dim sSize As String + Dim aConfig As String[] + + If Not vLayout Then + Settings["/gb.form.mdi/Toolbars/" &/ sKey &/ "Size"] = Null + Settings["/gb.form.mdi/Toolbars/" &/ sKey &/ "Layout"] = Null + Return + Endif + + sSize = vLayout[0] + aConfig = vLayout[1] + + Settings["/gb.form.mdi/Toolbars/" &/ sKey &/ "Size"] = sSize + Settings["/gb.form.mdi/Toolbars/" &/ sKey &/ "Layout"] = aConfig + Settings.Save + + If $cRegister.Exist(sKey) Then + For Each hForm In $cRegister[sKey] + + If hForm = hIgnore Then Continue + hForm.LoadConfig() + + Next + Endif + +End + +Public Sub SaveConfig(Optional bReset As Boolean) + + Dim aConfig As String[] + Dim aOldConfig As String[] + Dim bChange As Boolean + Dim sSize As String + Dim aLayout As Variant + + If Not ToolbarKey Then Return + If $bDesign Then Return + If Not Object.IsValid(Me.Parent.Parent) Then Return + + aLayout = GetLayout(bReset) + + ' Print Me; ": Saving config for "; ToolbarKey; ": "; + ' If aConfig Then + ' Print aConfig.Join(",") + ' Else + ' Print "NULL" + ' Endif + 'Print "Default config is ";; FindToolbar().DefaultConfig.Join(",") + + sSize = aLayout[0] + aConfig = aLayout[1] + + If sSize <> Settings["/gb.form.mdi/Toolbars/" &/ ToolbarKey &/ "Size"] Then + 'Settings["/gb.form.mdi/Toolbars/" &/ ToolbarKey &/ "Size"] = sVal + bChange = True + Endif + + If Not bChange Then + bChange = True + aOldConfig = Settings["/gb.form.mdi/Toolbars/" &/ ToolbarKey &/ "Layout"] + ' If aOldConfig Then + ' Debug "old config = "; aOldConfig.Join() + ' Else + ' Debug "old config = NULL" + ' Endif + ' If aConfig Then + ' Debug "new config = "; aConfig.Join() + ' Else + ' Debug "new config = NULL" + ' Endif + If Not aOldConfig And If Not aConfig Then + bChange = False + Else If aOldConfig And If aConfig And If aOldConfig.Join(",") = aConfig.Join(",") Then + bChange = False + Endif + Endif + + If Not bChange Then Return + + SaveLayout(GetKey(), Null) + SaveLayout(ToolbarKey, aLayout, If(bReset, Null, Me)) + +End + +Private Sub Lock() + + Inc $iLock + +End + +Private Sub Unlock() + + If $iLock <= 0 Then Return + Dec $iLock + If $iLock = 0 Then + Update + Endif + +End + +Public Sub HideControl(hCtrl As Control) + + 'panToolBar.Enabled = True + hCtrl.Reparent(panHide) + 'panToolBar.Enabled = False + +End + +Public Sub ShowControl(hCtrl As Control) + + 'panToolBar.Enabled = True + hCtrl.Reparent(panToolBar) + 'panToolBar.Enabled = False + +End + +Public Sub SetDesign() + + $bDesign = True + dwgHandle.ToolTip = "" + dwgHandle.Mouse = Mouse.Default + +End + +Public Sub GetIconSize() As Integer + + Return $iIconSize + +End + +Public Sub GetStockIconSize() As String + + Return ToolbarToStockSize($iIconSize) + +End + + +Public Sub GetRealIconSize() As Integer + + Return CalcIconSize(GetIconSize()) + +End + + +Public Sub SetIconSize(iSize As Integer) + + If $iIconSize = iSize Then Return + $iIconSize = iSize + UpdateSize + +End + +Public Sub SetStockIconSize(sSize As String) + + SetIconSize(StockToToolbarSize(sSize)) + +End + + +Private Sub UpdateSize() + + Inc Application.Busy + SaveConfig + LoadConfig + Dec Application.Busy + +End + + +Public Sub HasSeparator() As Boolean + + Return sepToolbar.Visible + +End + +Public Sub SetSeparator(bVisible As Boolean) + + If sepToolbar.Visible = bVisible Then Return + sepToolbar.Visible = bVisible + Update + +End + + +Public Sub Form_Menu() + + FToolBarConfig.OpenMenu(Me.Parent) + +End + +Public Sub panToolbar_Draw() + + If $bConfigure Then + If Not $hConfigureImage Then + If Color[Color.Background].Luminance > 127 Then + $hConfigureImage = Image.Load("img/configure.png") + Else + $hConfigureImage = Image.Load("img/configure_dark.png") + Endif + Endif + Paint.Brush = Paint.Image($hConfigureImage) + Paint.Rectangle(0, 0, panToolBar.W, panToolBar.H) + Paint.Fill + Else If GetToolBar().Design Then + Paint.Rectangle(0.5, 0.5, Paint.W - 1, Paint.H - 1) + Paint.LineWidth = 1 + Paint.Background = Color.LightBackground + Paint.Stroke + Endif + +End + +Public Sub Form_Font() + + If $bOpened Then UpdateSize + +End diff --git a/comp/src/gb.form.mdi/.src/ToolBar/FToolBar.form b/comp/src/gb.form.mdi/.src/ToolBar/FToolBar.form new file mode 100644 index 00000000..b7d7a8a7 --- /dev/null +++ b/comp/src/gb.form.mdi/.src/ToolBar/FToolBar.form @@ -0,0 +1,27 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,81,7) + { dwgHandle DrawingArea + MoveScaled(1,1,3,3) + Visible = False + Mouse = Mouse.Pointing + } + { panWhere Panel + MoveScaled(30,5,3,1) + Visible = False + Drop = True + } + { panHide Panel + MoveScaled(46,9,24,5) + Visible = False + } + { sepToolbar Separator + MoveScaled(54,4,9,1) + Visible = False + Ignore = True + } + { panToolbar DrawingArea + MoveScaled(6,1,45,3) + } +} diff --git a/comp/src/gb.form.mdi/.src/ToolBar/FToolBarConfig.class b/comp/src/gb.form.mdi/.src/ToolBar/FToolBarConfig.class new file mode 100644 index 00000000..3cff64ce --- /dev/null +++ b/comp/src/gb.form.mdi/.src/ToolBar/FToolBarConfig.class @@ -0,0 +1,500 @@ +' Gambas class file + +Private $hToolbar As ToolBar +Private $hForm As FToolBar +Private $hInside As DrawingArea +Private $hPopupToolbar As ToolBar +Static Private $aDeleteLater As New Control[] + +Public Sub _new() + +End + + +Public Sub Run(hToolbar As ToolBar) + + Me.Load + SetCurrentToolbar(hToolbar) + Me.Show + +End + +Private Sub GetForm(hToolbar As ToolBar) As FToolBar + + Return hToolbar._Container.Parent + +End + + +Private Sub SetCurrentToolbar(hToolbar As ToolBar) + + 'Debug hToolbar;; "-";; $hToolbar + + If hToolbar = $hToolbar Then Return + + If $hToolbar Then + Try $hForm.SetConfigureMode(False) + $hToolbar = Null + $hForm = Null + Endif + + If Not hToolbar Then Return + + $hToolbar = hToolbar + $hForm = GetForm(hToolbar) + + If $hToolbar.Text Then + Me.Title = Subst(("'&1' toolbar configuration"), $hToolbar.Text) + Else + Me.Title = ("Toolbar configuration") + Endif + + cmbSize.Index = $hForm.GetIconSize() + + InitAction + $hForm.SetConfigureMode(True) + +End + + +Public Sub btnClose_Click() + + Me.Close + +End + +Public Sub AddAction(sAction As String) + + Dim hItem As Control + Dim W As Integer + Dim sText As String + + 'Debug sAction + + If Left(sAction) = "." Then sAction = Mid$(sAction, 2) + + For Each hItem In svwAction.Children + If hItem.Tag = sAction Then + hItem.Show + Return + Endif + Next + + hItem = New DrawingArea(svwAction) As "Item" + hItem.Tag = sAction + hItem.Mouse = Mouse.Pointing + + W = Stock.GetSize("small") + Desktop.Scale * 2 + + sText = GetActionText(sAction) + If sText Then W += hItem.Font.TextWidth(sText) + Desktop.Scale + hItem.Resize(W, Desktop.Scale * 4) + +End + + +Private Sub InitAction() + + Dim hCtrl As Control + Dim sAction As String + Dim aAction As String[] + + svwAction.Children.Clear + svwAction.Arrangement = Arrange.None + + AddAction("|") + AddAction("-") + AddAction("~") + + 'Print $hToolbar.Children.Count;; $hToolbar._Container.Children.Count + aAction = MAction.Toolbars[$hForm.ToolbarKey].List + If aAction Then + For Each sAction In aAction + + If Not MAction.Actions.Exist(sAction) Then Continue + hCtrl = $hForm.FindControl(sAction, True) + If Not hCtrl Then Continue + + AddAction(sAction) + + Next + Endif + + svwAction.Arrangement = Arrange.Row + +End + + +Public Sub Item_Enter() + + $hInside = Last + $hInside.Refresh + +End + +Public Sub Item_Leave() + + $hInside = Null + Last.Refresh + +End + +Private Sub GetActionText(sAction As String) As String + + Select Case sAction + Case "|" + Return ("Separator") + Case "~" + Return ("Expander") + Case "-" + Return ("Space") + Case Else + Return MAction.Actions[sAction].Text + End Select + +End + + +Private Sub DrawItem(hCtrl As Control, sAction As String, bScreenshot As Boolean) + + Dim hAction As CAction + Dim hIcon As Picture + Dim sText As String + Dim W As Integer + Dim bText As Boolean + Dim H As Integer + + 'If hItem.Tag Then hAction = MAction.Actions[hItem.Tag] + bText = Draw.W > Draw.H + + Paint.FillRect(2, 2, Paint.W - 4, Paint.H - 4, Color.TextBackground) + Paint.DrawRect(1, 1, Paint.W - 2, Paint.H - 2, Color.LightForeground) + + If hCtrl.Hovered Then + Paint.DrawRect(0, 0, Paint.W, Paint.H, Color.LightBackground) + Endif + + Draw.Foreground = hCtrl.Foreground + Draw.Font = hCtrl.Font + + hAction = MAction.Actions[sAction] + + If hAction Then + + hIcon = hAction.GetConfigIcon(If(bScreenshot, $hForm.GetRealIconSize(), 0)) + If hIcon Then + H = Stock.GetSize("small") + If bText Then + Draw.Picture(hIcon, 8, (Draw.H - H) / 2, H, H) + Else + Draw.Picture(hIcon, (Draw.W - H) / 2, (Draw.H - H) / 2, H, H) + Endif + W = H + Else + W = $hForm.GetIconSize() + Endif + If bText Then Draw.Text(hAction.Display, W + 12, 0, Draw.W - W - 16, Draw.H, Align.Normal) + + Else + + Select Case sAction + Case "|" + hIcon = Picture["img/separator.png"] + Case "~" + hIcon = Picture["img/expander.png"] + Case "-" + hIcon = Picture["img/space.png"] + End Select + + sText = GetActionText(sAction) + + If bText Then + Draw.Picture(hIcon, 8, (Draw.H - hIcon.H) / 2) + Else + Draw.Picture(hIcon, (Draw.W - hIcon.W) / 2, (Draw.H - hIcon.H) / 2) + Endif + W = hIcon.W + If bText Then Draw.Text(sText, W + 12, 0, Draw.W - W - 16, Draw.H, Align.Normal) + 'Draw.Style.Separator(8, (hItem.H - W) / 2, W - 4, W, False) + Endif + +End + + +Public Sub Item_Draw() + + DrawItem(Last, Last.Tag, False) + +End + +Private Sub GetItemScreenshot(hAction As CAction) As Picture + + Dim hPict As Picture + Dim hItem As Control + + hItem = $hForm.FindControl(hAction.Key) + hPict = New Picture(hItem.W, hItem.H) + Draw.Begin(hPict) + Draw.FillRect(0, 0, Draw.W, Draw.H, Color.Background) + DrawItem(hItem, hAction.Key, True) + Draw.End + + Return hPict + +End + +Static Public Sub IsSpecialAction(sAction As String) As Boolean + + Return InStr("~|-", sAction) + +End + + +Public Sub DragAction(hCtrl As Control, sAction As String) + + Dim hAction As CAction + Dim bOutside As Boolean + Dim hDest As Control + Dim bAnim As Boolean + + If Not sAction Then Return + + bOutside = hCtrl.Window = Me + ' If bOutside Then + ' If sAction <> "|" Then hCtrl.Hide + ' Else + ' hCtrl.Hide + ' Endif + + If sAction Then hAction = MAction.Actions[sAction] + + 'hItem = $hForm.FindControl(sAction) + + $hForm.DragStart(bOutside) + + 'If hItem Then + ' Drag.Icon = GetItemScreenshot(hItem) + If hAction Then + Drag.Icon = GetItemScreenshot(hAction) + Else If sAction = "~" Then + Drag.Icon = Picture["img/expander.png"] + Else If sAction = "|" Then + Drag.Icon = Picture["img/separator.png"] + Else If sAction = "-" Then + Drag.Icon = Picture["img/space.png"] + Else + Drag.Icon = Null + Endif + + 'Debug "START DRAG";; sAction + hDest = Drag(hCtrl, sAction, MAction.MIME) + 'Debug "END DRAG" + + If hDest Then + + If bOutside Then + + If hDest = panAction Then + Else + If Not IsSpecialAction(hCtrl.Tag) Then + hCtrl.Hide + Endif + Endif + + Else + + If hDest = panAction Then + If hCtrl.Action Then + $hForm.HideControl(hCtrl) + Else + $aDeleteLater.Add(hCtrl) + hCtrl.Hide + Endif + bAnim = True + Else + If Not hCtrl.Action Then + $aDeleteLater.Add(hCtrl) + hCtrl.Hide + Endif + Endif + + Endif + + Else + + If Not bOutside Then + hCtrl.Show + Else + bAnim = True + Endif + + Endif + + $hForm.DragEnd(bAnim) + + If $aDeleteLater.Count Then timDeleteLater.Trigger + +End + +Public Sub Item_MouseDrag() + + Dim hItem As DrawingArea = Last + + '$hInside = Null + 'hItem.Refresh + DragAction(hItem, hItem.Tag) + +End + +Public Sub Form_Close() + + SetCurrentToolbar(Null) + Settings.Write(Me, "/gb.form.mdi/FToolbarConfig") + +End + + +Public Sub Form_Open() + + Me.Center + Settings.Read(Me, "/gb.form.mdi/FToolbarConfig") + +End + + +Public Sub panAction_Drag() + + If Drag.Format <> MAction.MIME Or If Drag.Source.Parent = svwAction Then + Stop Event + Return + Endif + + Drag.Show(panAction) + +End + +Public Sub panAction_Drop() + + Dim sAction As String = Drag.Paste(MAction.MIME) + + If Not IsSpecialAction(sAction) Then AddAction(sAction) + +End + + +Public Sub btnReset_Click() + + If Message.Question(("Do you really want to reset the toolbar?"), ("Reset"), ("Cancel")) = 1 Then + $hForm.SaveConfig(True) + InitAction + Endif + +End + +' Public Sub btnUndo_Click() +' +' $hForm.LoadConfig +' InitAction +' +' End + +' Public Sub cmbSize_Click() +' +' $hForm.SetIconSize(cmbSize.Index) +' +' End + + +Public Sub cmbSize_Click() + + $hForm.SetIconSize(cmbSize.Index) + +End + +Public Sub OpenMenu(hToolbar As ToolBar) + + If $hForm Then Return + If Not hToolbar.Key Then Return + + $hPopupToolbar = hToolbar + + 'mnuConfigure.Text = Me.Title & "..." 'Subst(("Configure '&1' toolbar..."), hToolbar.Key) + mnuVerySmallSize.Checked = False + mnuSmallSize.Checked = False + mnuMediumSize.Checked = False + mnuLargeSize.Checked = False + mnuHugeSize.Checked = False + + Select Case GetForm(hToolbar).GetIconSize() + Case FToolBar.ICON_HUGE + mnuHugeSize.Checked = True + Case FToolBar.ICON_LARGE + mnuLargeSize.Checked = True + Case FToolBar.ICON_MEDIUM + mnuMediumSize.Checked = True + Case FToolBar.ICON_TINY + mnuVerySmallSize.Checked = True + Case Else + mnuSmallSize.Checked = True + End Select + + mnuToolbar.Popup + + 'If Not Me.Visible Then SetCurrentToolbar(Null) + +End + +Public Sub mnuSmallSize_Click() + + GetForm($hPopupToolbar).SetIconSize(FToolBar.ICON_SMALL) + +End + +Public Sub mnuMediumSize_Click() + + GetForm($hPopupToolbar).SetIconSize(FToolBar.ICON_MEDIUM) + +End + +Public Sub mnuLargeSize_Click() + + GetForm($hPopupToolbar).SetIconSize(FToolBar.ICON_LARGE) + +End + +Public Sub mnuHugeSize_Click() + + GetForm($hPopupToolbar).SetIconSize(FToolBar.ICON_HUGE) + +End + +Public Sub mnuVerySmallSize_Click() + + GetForm($hPopupToolbar).SetIconSize(FToolBar.ICON_TINY) + +End + + +Public Sub mnuConfigure_Click() + + SetCurrentToolbar($hPopupToolbar) + Me.Show + +End + +Static Public Sub WillBeDeleted(hCtrl As Control) As Boolean + + Return $aDeleteLater.Exist(hCtrl) + +End + +Public Sub timDeleteLater_Timer() + + Dim hCtrl As Control + For Each hCtrl In $aDeleteLater + hCtrl.Delete + Next + $aDeleteLater.Clear + +End + diff --git a/comp/src/gb.form.mdi/.src/ToolBar/FToolBarConfig.form b/comp/src/gb.form.mdi/.src/ToolBar/FToolBarConfig.form new file mode 100644 index 00000000..08f4256c --- /dev/null +++ b/comp/src/gb.form.mdi/.src/ToolBar/FToolBarConfig.form @@ -0,0 +1,98 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,71,30) + Visible = False + Utility = True + Arrangement = Arrange.Vertical + { mnuToolbar Menu + { mnuConfigure Menu + Text = ("Configure") & "..." + Picture = Picture["icon:/small/options"] + } + { Menu2 Menu + Text = ("Icon size") + { mnuVerySmallSize Menu + Text = ("Tiny") + Toggle = True + } + { mnuSmallSize Menu + Text = ("Small") + Toggle = True + } + { mnuMediumSize Menu + Text = ("Medium") + Toggle = True + } + { mnuLargeSize Menu + Text = ("Large") + Toggle = True + } + { mnuHugeSize Menu + Text = ("Huge") + Toggle = True + } + } + { Menu1 Menu + } + { Menu3 Menu + Text = ("Cancel") + Picture = Picture["icon:/small/close"] + } + } + { panAction Panel + MoveScaled(1,3,53,16) + Background = Color.TextBackground + Drop = True + Expand = True + Arrangement = Arrange.Fill + { svwAction ScrollView + MoveScaled(1,2,45,11) + Spacing = True + Margin = True + Border = False + ScrollBar = Scroll.Vertical + } + } + { Separator2 Separator + MoveScaled(20,22,10,0) + } + { HBox2 HBox + MoveScaled(1,23,69,6) + Spacing = True + Margin = True + { Label2 Label + MoveScaled(0,0,5,4) + AutoResize = True + Text = ("Size") + } + { cmbSize ComboBox + MoveScaled(7,0,24,4) + ReadOnly = True + List = [("Tiny"), ("Small"), ("Medium"), ("Large"), ("Huge")] + } + { Spring1 Spring + MoveScaled(32,0,2,4) + } + { btnUndo Button + MoveScaled(35,0,16,4) + Visible = False + Text = Shortcut(("Undo"), "U") + Picture = Picture["icon:/small/undo"] + } + { btnReset Button + MoveScaled(36,0,16,4) + Text = Shortcut(("Reset"), "R") + Picture = Picture["icon:/small/refresh"] + } + { btnClose Button + MoveScaled(53,0,16,4) + Text = Shortcut(("Close"), "C") + Default = True + Cancel = True + } + } + { timDeleteLater #Timer + #MoveScaled(43,1) + } +} diff --git a/comp/src/gb.form.mdi/.src/ToolBar/ToolBar.class b/comp/src/gb.form.mdi/.src/ToolBar/ToolBar.class new file mode 100644 index 00000000..d9f25fc1 --- /dev/null +++ b/comp/src/gb.form.mdi/.src/ToolBar/ToolBar.class @@ -0,0 +1,205 @@ +' Gambas class file + +Export + +Inherits UserContainer + +Public Const _Properties As String = "*,-Arrangement,-Padding,-Spacing,-Indent,-Invert,Key,Text,Action,Orientation{ToolBar.Horizontal;Vertical},Size{Tiny;Small;Medium;Large;Huge}=Small,AutoResize=True,Separator" +Public Const _DefaultArrangement As String = "R" +Public Const _DefaultSize As String = "36,4" + +Public Enum Horizontal, Vertical + +Event Configure + +Property Design As Boolean +Property Orientation As Integer +Property AutoResize As Boolean +Property Key As String +Property Text As String +Property Separator As Boolean +Property Size As String +Property Settings As String + +Private $hForm As FToolBar + +Public Sub _new() + + $hForm = New FToolBar(Me) + Me._Container = $hForm.GetContainer() + 'Super.AutoResize = True + +End + +Public Sub Configure() + + If Not Me.Key Then Error.Raise("The Key property must be defined") + Action._ConfigureToolbar(Me) + +End + +Private Function Design_Read() As Boolean + + Return Super.Design + +End + +Private Sub Design_Write(Value As Boolean) + + Super.Design = Value + If Value Then $hForm.SetDesign() + +End + +' Private Function Hidden_Read() As Boolean +' +' Return $hForm.IsHidden() +' +' End +' +' Private Sub Hidden_Write(Value As Boolean) +' +' $hForm.SetHidden(Value) +' +' End + +' Private Function Action_Read() As String +' +' Return Action.Get(Me) +' +' End +' +' Private Sub Action_Write(Value As String) +' +' Action.Register(Me, Value) +' +' End + +Private Function Orientation_Read() As Integer + + Return If($hForm.IsVertical(), 1, 0) + +End + +Private Sub Orientation_Write(Value As Integer) + + $hForm.SetVertical(Value) + +End + +Private Function AutoResize_Read() As Boolean + + Return $hForm.IsAutoResize() + +End + +Private Sub AutoResize_Write(Value As Boolean) + + $hForm.SetAutoResize(Value) + +End + +Private Function Key_Read() As String + + Return $hForm.GetKey() + +End + +Private Sub Key_Write(Value As String) + + $hForm.SetKey(Value) + +End + +Private Function Text_Read() As String + + Return $hForm.Text + +End + +Private Sub Text_Write(Value As String) + + $hForm.SetText(Value) + +End + +Public Sub _RaiseConfigure() + + Raise Configure + +End + +Private Function Separator_Read() As Boolean + + Return $hForm.HasSeparator() + +End + +Private Sub Separator_Write(Value As Boolean) + + $hForm.SetSeparator(Value) + +End + +Private Function Size_Read() As String + + Return $hForm.GetStockIconSize() + +End + +Private Sub Size_Write(Value As String) + + $hForm.SetStockIconSize(Value) + +End + +Static Private Sub LayoutToString(vLayout As Variant) As String + + Dim aSettings As New String[] + + aSettings.Add(vLayout[0]) + If vLayout[1] Then aSettings.Insert(vLayout[1]) + Return aSettings.Join() + +End + +Static Private Sub LayoutFromString(sLayout As String) As Variant + + Dim aSettings As String[] + Dim sSize As String + + aSettings = Split(sLayout) + If aSettings.Count = 0 Then Return + + sSize = aSettings[0] + aSettings.Remove(0) + If aSettings.Count = 0 Then aSettings = Null + + Return [sSize, aSettings] + +End + +Private Function Settings_Read() As String + + Return LayoutToString($hForm.GetLayout()) + +End + +Private Sub Settings_Write(Value As String) + + $hForm.SetLayout(LayoutFromString(Value)) + +End + +Static Public Sub GetLayout((Key) As String) As String + + Return LayoutToString(FToolBar.LoadLayout(Key)) + +End + +Static Public Sub SetLayout((Key) As String, sLayout As String) + + FToolBar.SaveLayout(Key, LayoutFromString(sLayout)) + +End + diff --git a/comp/src/gb.form.mdi/.src/ToolBar/ToolBarExpander.class b/comp/src/gb.form.mdi/.src/ToolBar/ToolBarExpander.class new file mode 100644 index 00000000..cfdc80aa --- /dev/null +++ b/comp/src/gb.form.mdi/.src/ToolBar/ToolBarExpander.class @@ -0,0 +1,9 @@ +' Gambas class file + +Inherits DrawingArea + +Public Sub _new() + + Super.Expand = True + +End diff --git a/comp/src/gb.form.mdi/.src/Workspace/CWindow.class b/comp/src/gb.form.mdi/.src/Workspace/CWindow.class new file mode 100644 index 00000000..1c9f7515 --- /dev/null +++ b/comp/src/gb.form.mdi/.src/Workspace/CWindow.class @@ -0,0 +1,9 @@ +' Gambas class file + +Public (Window) As Window +'PUBLIC Watcher AS Watcher +Public Observer As Observer +Public Resizable As Boolean +Public Grid As Integer +Public Detached As Boolean +Public Text As String diff --git a/comp/src/gb.form.mdi/.src/Workspace/FWorkspace.class b/comp/src/gb.form.mdi/.src/Workspace/FWorkspace.class new file mode 100644 index 00000000..e37f3cb5 --- /dev/null +++ b/comp/src/gb.form.mdi/.src/Workspace/FWorkspace.class @@ -0,0 +1,1046 @@ +' Gambas class file + +Public CloseButton As Boolean + +Private $aWindow As New CWindow[] +Private $hCurrent As CWindow +Private $hLast As CWindow +Private $bMove As Boolean +Private $X As Integer +Private $Y As Integer +Private $W As Integer +Private $H As Integer +Private $iNoWait As Integer +Private $iBackground As Integer = Color.Default +Private $bNoClose As Boolean +Private $iLock As Integer +Private $bBorder As Boolean = True +Private $nDetach As Integer + +Private Enum CLOSE_ALL, CLOSE_OTHER, CLOSE_RIGHT +Private $hImage As Image + +' Public Sub _new() +' +' If Not $hTile Then $hTile = Picture["img/hash.png"] +' '$hWatcher = NEW Watcher(panChild) AS "panChild" +' 'TitleBar = tabWorkspace +' '$bLogo = Application.Name = "gambas" & System.Version +' ' If $bLogo Then +' ' picLogo.Picture = Picture.Load("img/logo.png") +' ' picLogo.Resize(picLogo.Picture.W, picLogo.Picture.H) +' ' Endif +' +' End + +Public Sub Form_Open() + + UpdateSize + +End + + +Public Function GetActiveWindow() As Window + + If $hCurrent Then Return $hCurrent.Window + +End + +Private Function GetIndex(hWin As Window) As Integer + + Dim iInd As Integer + + For iInd = 0 To $aWindow.Max + If $aWindow[iInd].Window = hWin Then + 'DEBUG $aWindow[iInd];; "=>";; iInd + Return iInd + Endif + Next + + Return -1 + +End + +Private Sub GetWorkspace(hWindow As Window) As Workspace + + Dim hCtrl As Control = hWindow + + While hCtrl + If hCtrl Is Workspace Then Return hCtrl + hCtrl = hCtrl.Parent + Wend + +End + +Public Sub Add(hWin As Window, Optional bResize As Boolean, Optional iGrid As Integer) + + Dim iInd As Integer + Dim hWindow As CWindow + Dim hPrev As Workspace + Dim hObserver As Observer + Dim hTabButton As Container + + If GetIndex(hWin) >= 0 Then Return + + hPrev = GetWorkspace(hWin) + If hPrev Then RemoveWindow(hWin) + + If bResize Then + hWin.Reparent(dwgBorder) + Else + hWin.Reparent(panWorkspace) + Endif + + ' We must be sure that the window is opened, otherwise CheckWindow() will remove it. + hWin.Show + hWin.Hide + + hWindow = New CWindow + hWindow.Window = hWin + hWindow.Resizable = bResize + hWindow.Grid = iGrid + + $aWindow.Add(hWindow) + + If $aWindow.Count > 1 Then + + iInd = tabWorkspace.Count + Object.Lock(tabWorkspace) + + Inc tabWorkspace.Count + tabWorkspace.Index = iInd + tabWorkspace.Current.Text = "" + + Object.Unlock(tabWorkspace) + + UpdateSize + + Else + + If $iLock <= 0 Then ShowTabStrip + + Endif + + 'DEBUG "ADD "; hWin + + hTabButton = tabWorkspace._GetButton(tabWorkspace.Count - 1) + hObserver = New Observer(hTabButton.Children[0]) As "Button" + + hWindow.Observer = New Observer(hWin, True) As "Watcher" + UpdateTitle(hWin) + ActivateWindow() + +End + +' Private Sub GetTopLevelWindow(hCtrl As Control) As Window +' +' Dim hWin As Window +' +' Do +' hWin = hCtrl.Window +' If hWin.TopLevel Then Return hWin +' hCtrl = hWin.Parent +' Loop +' +' End + +Public Sub Detach(hWin As Window) + + Dim iInd As Integer = GetIndex(hWin) + Dim hWindow As CWindow + + If iInd < 0 Then Error.Raise("Unknown window") + If $nDetach = $aWindow.Max Then Error.Raise("Cannot detach the last window") + + hWindow = $aWindow[iInd] + If hWindow.Detached Then Return + + tabWorkspace[iInd].Visible = False + 'hWin.Utility = True + hWin.Reparent(Null) + hWin.Show + + hWindow.Detached = True + Inc $nDetach + + GetParent()._RaiseDetach(hWin) + +End + +Public Sub Attach(hWin As Window) + + Dim iInd As Integer = GetIndex(hWin) + Dim hWindow As CWindow + + If iInd < 0 Then Error.Raise("Unknown window") + + hWindow = $aWindow[iInd] + If Not hWindow.Detached Then Return + + tabWorkspace[iInd].Visible = True + 'hWin.Utility = False + hWin.Reparent(panWorkspace) + If tabWorkspace.Index = iInd Then hWin.Show + + hWindow.Detached = False + Dec $nDetach + + ActivateWindow() + + GetParent()._RaiseAttach(hWin) + +End + + +Public Sub SetResizable(hWin As Window, bResize As Boolean, Optional iGrid As Integer) + + Dim iInd As Integer = GetIndex(hWin) + Dim hWindow As CWindow + + If iInd < 0 Then Return + + hWindow = $aWindow[iInd] + + hWindow.Resizable = bResize + hWindow.Grid = iGrid + + If bResize Then + hWin.Reparent(dwgBorder) + Else + hWin.Reparent(panWorkspace) + Endif + + If hWindow = $hCurrent Then ActivateWindow() + +End + +Public Sub Exist(hWin As Window) As Boolean + + Return GetIndex(hWin) >= 0 + +End + + +Private Sub RemoveWindow(hWin As Window, Optional bClose As Boolean) + + Dim hWindow As CWindow + Dim iInd As Integer = GetIndex(hWin) + + If iInd < 0 Then Return + + If bClose Then + If Object.IsValid(hWin) And If Not hWin.Closed Then + If hWin.Close() Then Return + Endif + Endif + + Inc $iNoWait + + hWindow = $aWindow[iInd] + If hWindow.Detached Then Dec $nDetach + + If $hCurrent = hWindow Then $hCurrent = Null + If $hLast = hWindow Then $hLast = Null + + $aWindow.Remove(iInd) + + If $aWindow.Count Then + If iInd = 0 Then + Object.Lock(tabWorkspace) + tabWorkspace.Index = 1 + 'panChild.Reparent(tabWorkspace) + tabWorkspace.Index = 0 + Object.Unlock(tabWorkspace) + Endif + tabWorkspace[iInd].Delete + Else + HideTabStrip + Endif + + If $hCurrent Then + ActivateWindow($hCurrent.Window) + Else + ActivateWindow + Endif + + Dec $iNoWait + +End + +Public Sub Remove((Window) As Window) + + RemoveWindow(Window) + +End + +Private Sub UpdateTitleFromIndex(iInd As Integer) + + Dim hObject As Object + Dim sRichText As String + + With $aWindow[iInd].Window + + hObject = $aWindow[iInd].Window + $aWindow[iInd].Text = .Text + Try sRichText = hObject.RichText + If sRichText Then + tabWorkspace[iInd].RichText = sRichText + Else + tabWorkspace[iInd].Text = .Text + Endif + + tabWorkspace[iInd].Picture = .Icon + ' If $hCurrent And If $hCurrent.Window = hWin Then + ' lblTitle.Text = " " & .Text + ' imgIcon.Picture = .Icon + ' Endif + + End With + +End + + +Private Sub UpdateTitle(Optional hWin As Window) + + Dim iInd As Integer + + If Not hWin Then + If Not $hCurrent Then Return + hWin = $hCurrent.Window + Endif + + iInd = GetIndex(hWin) + If iInd < 0 Then Return + + UpdateTitleFromIndex(iInd) + +End + + +Public Sub Watcher_Title() + + 'DEBUG LAST.Name;; LAST.Title + 'IF NOT $hCurrent THEN RETURN + 'IF LAST.Control <> $hCurrent.Window THEN RETURN + UpdateTitle(Last) + +End + +Public Sub Watcher_Resize() + + 'DEBUG LAST;; LAST.Control + If Not $hCurrent Then Return + 'IF LAST.Control <> $hCurrent.Window THEN RETURN + MoveHandle + +End + +Public Sub Watcher_Icon() + + 'DEBUG LAST;; LAST.Control + Watcher_Title + +End + +Public Sub Watcher_Activate() + + ActivateWindow(Last) + +End + + +Public Sub Watcher_Close() + + Dim hWin As Window = Last + RemoveWindow(hWin) + +End + +Private Sub CheckWindow() + + Dim hWindow As CWindow + Dim iInd As Integer + + While iInd < $aWindow.Count + hWindow = $aWindow[iInd] + If Object.IsValid(hWindow.Window) And If Not hWindow.Window.Closed Then + Inc iInd + Continue + Endif + RemoveWindow(hWindow.Window) + Wend + +End + + +Private Sub MoveHandle() + + ' Dim hWin As Window = $hCurrent.Window + ' + ' panRight.Move(hWin.Width, Max(0, (hWin.Height - panRight.Height) / 2)) + ' panDown.Move(Max(0, (hWin.Width - panRight.Width) / 2), hWin.Height) + ' panRightDown.Move(hWin.Width, hWin.Height) + ' dwgBorder.Move(0, 0, hWin.Width + 4, hWin.Height + 4) + ' + ' dwgBorder.Lower + ' panRight.Raise + ' panDown.Raise + ' panRightDown.Raise + +End + +Private Sub GetParent() As Workspace + + Return Me.Parent + +End + +' Private Sub IsDetached(hWindow As Window) As Boolean +' +' Dim iInd As Integer +' +' iInd = GetIndex(hWindow) +' If iInd < 0 Then Return +' Return Not tabWorkspace[iInd].Visible +' +' End + + +Public Sub ActivateWindow(Optional hWindow As Window) + + Dim hWin As CWindow + Dim iInd As Integer + + 'IF $iLock > 0 THEN RETURN + + If $aWindow.Count Then + + 'DEBUG "ACTIVATE "; $hCurrent;; "->";; + ' IF hWindow THEN + ' ERROR hWindow + ' ELSE + ' ERROR $aWindow[tabWorkspace.Index].Window + ' ENDIF + + If hWindow Then + iInd = GetIndex(hWindow) + If Not $aWindow[iInd].Detached Then + Try tabWorkspace.Index = iInd + Return + Endif + Else + iInd = tabWorkspace.Index + Endif + + hWin = $aWindow[iInd] + If Not Object.IsValid(hWin.Window) Then Return + + $hCurrent = hWin + + 'WITH tabWorkspace + ' $hCurrent.Move(.X + .ClientX, .Y + .ClientY, .ClientW, .ClientH) + 'END WITH + + If $iLock = 0 Then + + If $hCurrent.Resizable Then + $hCurrent.Window.Move(0, 0) + MoveHandle + svwWorkspace.Raise + Else + panWorkspace.Raise + Endif + + With $hCurrent.Window + If $hCurrent.Detached Then + .Raise + Else + .Show + Endif + '.Raise + If Not Application.ActiveControl Or If Application.ActiveControl.Window <> $hCurrent.Window Then + .SetFocus + Endif + End With + + If Not $hCurrent.Detached And If $hCurrent <> $hLast Then + + If $hLast Then + $bNoClose = True + $hLast.Window.Hide + $bNoClose = False + Endif + $hLast = $hCurrent + + Endif + + UpdateTitle + + Endif + + Endif + + If $iLock = 0 Then GetParent()._Activate + +End + +Public Sub tabWorkspace_Click() + + ActivateWindow() + +End + + +Public Sub UpdateSize() + + Dim Y, H As Integer + Dim W As Integer + Dim X As Integer + + If tabWorkspace.Visible Then + + If imgBackground.Visible Then + Me.Background = Color.Default + imgBackground.Hide + panWorkspace.Background = Color.Background + 'panWorkspace.Border = If($bBorder, Border.Plain, Border.None) + Endif + 'If $bLogo Then picLogo.Hide + + With tabWorkspace + + X = .ClientX + Y = .ClientY + H = .ClientH + W = .ClientW + + panWorkspace.Move(X, Y, W, H) + svwWorkspace.Move(X, Y, W, H) + + End With + + + Else + + svwWorkspace.Move(0, 0, Me.ClientW, Me.ClientH) + panWorkspace.Move(0, 0, Me.ClientW, Me.ClientH) + + Me.Background = If($iBackground = Color.Default, Color.Merge(Color.Background, Color.Foreground), $iBackground) + imgBackground.Background = Me.Background + If Not imgBackground.Visible Then + imgBackground.Show + panWorkspace.Border = Border.None + panWorkspace.Raise + Endif + + Endif + + If CloseButton Then + tabWorkspace.CloseButton = $aWindow.Count >= 1 + Else + tabWorkspace.CloseButton = False + Endif + + 'DEBUG tabWorkspace.Visible;; "Index =";; tabWorkspace.Index;; "ClientY =";; tabWorkspace.ClientY + + ' WITH tabWorkspace + ' DEBUG ME.W;; ME.H;; "/";; tabWorkspace.W;; tabWorkspace.H;; "/";; .ClientW;; .ClientH;; .ClientX;; .ClientY + ' END WITH + +End + +Public Sub mnuClose_Click() + + $aWindow[tabWorkspace.Index].Window.Close + 'CheckWindow + +End + +Private Sub CloseWindows(iMode As Integer) + + Dim hWindow As CWindow + Dim hCurrent As CWindow + Dim bClose As Boolean + + hCurrent = $aWindow[tabWorkspace.Index] + + {Lock} + + For Each hWindow In $aWindow.Copy() + + Select Case iMode + Case CLOSE_OTHER + If hWindow = hCurrent Then Continue + Case CLOSE_RIGHT + If hWindow = hCurrent Then + bClose = True + Continue + Else If Not bClose Or If hWindow.Detached Then + Continue + Endif + End Select + + If hWindow.Window.Close() Then Break + + Next + + 'CheckWindow + {Unlock} + + If iMode = CLOSE_ALL Then GetParent()._RaiseCloseAll() + +End + +Public Sub mnuCloseOther_Click() + + CloseWindows(CLOSE_OTHER) + +End + +Public Sub mnuCloseAll_Click() + + CloseWindows(CLOSE_ALL) + +End + +Public Sub mnuCloseRight_Click() + + CloseWindows(CLOSE_RIGHT) + +End + + +Public Sub Handle_MouseDown() + + $bMove = True + $X = Mouse.ScreenX + $Y = Mouse.ScreenY + $W = $hCurrent.Window.W + $H = $hCurrent.Window.H + + 'DEBUG Mouse.ScreenX;; Mouse.ScreenY + 'DEBUG $X;; $Y + +End + +Public Sub Handle_MouseMove() + + Dim W, H, G As Integer + Dim hPanel As Panel + + If Not $bMove Then Return + + hPanel = Last + + With $hCurrent.Window + + W = .W + H = .H + + 'DEBUG "(";; W;; H;; ") + (";; Mouse.ScreenX;; Mouse.ScreenY;; ") -> "; + + If hPanel <> panRight Then H = $H + Mouse.ScreenY - $Y + If hPanel <> panDown Then W = $W + Mouse.ScreenX - $X + + W = Max(1, W) + H = Max(1, H) + + If Not Mouse.Shift Then + G = $hCurrent.Grid + If G Then + W = Max(1, Int(W / G + 0.5)) * G + H = Max(1, Int(H / G + 0.5)) * G + Endif + Endif + + 'PRINT #File.Err, "(";; W;; H;; ")" + + .Resize(W, H) + + End With + + $bMove = False + MoveHandle + $bMove = True + +End + +Public Sub Handle_MouseUp() + + $bMove = False + +End + +Public Function GetCountWindows() As Integer + + Return $aWindow.Count + +End + + +Public Function GetWindows() As Window[] + + Dim aWin As New Window[] + Dim hWindow As CWindow + + For Each hWindow In $aWindow + aWin.Add(hWindow.Window) + Next + + Return aWin + +End + +Public Sub dwgBorder_Draw() + + Return + Draw.LineStyle = Line.Solid + Draw.LineWidth = 4 + Draw.Foreground = Color.SelectedBackground + Draw.Line(dwgBorder.W - 2, 0, dwgBorder.W - 2, dwgBorder.H) + Draw.Line(0, dwgBorder.H - 2, dwgBorder.W, dwgBorder.H - 2) + 'Draw.Tile($hTile, dwgBorder.W - 8, 0, 8, dwgBorder.H) + 'Draw.Tile($hTile, 0, dwgBorder.H - 8, dwgBorder.W, 8) + +End + +Public Sub imgIcon_DblClick() + + mnuClose_Click + +End + +Public Sub lblTitle_MouseDown() + + ActivateWindow() + +End + +Public Sub tabWorkspace_MouseUp() + + ActivateWindow() + +End + +' Private Sub FindTabFromTitle(sTitle As String) As Integer +' +' Dim iInd As Integer +' +' For iInd = 0 To tabWorkspace.Count - 1 +' If tabWorkspace[iInd].Text = sTitle Then Return iInd +' Next +' +' Return -1 +' +' End + + +Public Sub tabWorkspace_Menu() + + Dim iInd As Integer + Dim hMenu As Menu + Dim aTitle As New String[] + Dim sTitle As String + Dim hWin As CWindow + Dim sText As String + + 'GetParent()._Menu + + mnuShow.Children.Clear + + For iInd = 0 To tabWorkspace.Count - 1 + aTitle.Add(tabWorkspace[iInd].Text & "\t" & Format(iInd, "000")) + Next + aTitle.Sort + + For Each sTitle In aTitle + iInd = CInt(Mid$(sTitle, InStr(sTitle, "\t") + 1)) + With tabWorkspace[iInd] + hMenu = New Menu(mnuShow) As "mnuWindow" + sText = $aWindow[iInd].Text + If Not sText Then sText = " " + hMenu.Text = sText + hMenu.Picture = .Picture + hMenu.Checked = iInd = tabWorkspace.Index + hMenu.Tag = iInd + End With + Next + + mnuSort.Enabled = $aWindow.Count >= 2 + mnuDetach.Enabled = $nDetach < $aWindow.Max + + mnuAttach.Children.Clear + + For Each sTitle In aTitle + iInd = CInt(Mid$(sTitle, InStr(sTitle, "\t") + 1)) + hWin = $aWindow[iInd] + If Not hWin.Detached Then Continue + With tabWorkspace[iInd] + hMenu = New Menu(mnuAttach) As "mnuAttach" + If .Text Then + hMenu.Text = .Text + Else + hMenu.Text = " " + Endif + hMenu.Picture = .Picture + hMenu.Checked = iInd = tabWorkspace.Index + hMenu.Tag = iInd + End With + Next + + mnuAttach.Enabled = mnuAttach.Children.Count > 0 + + mnuCloseRight.Enabled = tabWorkspace.Index < (tabWorkspace.Count - 1) + mnuCloseOther.Enabled = $aWindow.Count >= 2 + + mnuWindow.Popup + +End + +Public Sub mnuWindow_Click() + + ActivateWindow($aWindow[Last.Tag].Window) + +End + + +Public Sub SetBackground(iColor As Integer) + + $iBackground = iColor + UpdateSize + 'panWorkspace.Refresh + +End + +Public Sub GetBackground() As Integer + + Return $iBackground + +End + +Private Sub HideTabStrip() + + tabWorkspace.Hide + UpdateSize + +End + + +Private Sub ShowTabStrip() + + If $aWindow.Count Then + tabWorkspace.Show + UpdateSize + Endif + +End + +Public Sub Lock() + + Inc $iLock + If $iLock = 1 Then + panWorkspace.Hide + HideTabStrip + Endif + +End + +Public Sub UnLock() + + If $iLock <= 0 Then Return + + Dec $iLock + + If $iLock = 0 Then + CheckWindow + ActivateWindow + ShowTabStrip + panWorkspace.Show + Endif + +End + +Public Sub GetOrientation() As Integer + + Return tabWorkspace.Orientation + +End + +Public Sub SetOrientation(iOrientation As Integer) + + tabWorkspace.Orientation = iOrientation + UpdateSize + +End + +Public Sub mnuSort_Click() + + Dim iInd As Integer + Dim aTitle As New String[] + Dim aWindow As CWindow[] + Dim hWin As Window + Dim sTitle As String + + hWin = GetActiveWindow() + + For iInd = 0 To tabWorkspace.Count - 1 + aTitle.Add(tabWorkspace[iInd].Text & "\t" & Format(iInd, "000")) + Next + aTitle.Sort + + aWindow = New CWindow[$aWindow.Count] + + For iInd = 0 To aWindow.Max + sTitle = aTitle[iInd] + aWindow[iInd] = $aWindow[CInt(Mid$(sTitle, InStr(sTitle, "\t") + 1))] + Next + + $aWindow = aWindow + + For iInd = 0 To $aWindow.Max + UpdateTitleFromIndex(iInd) + Next + + ActivateWindow(hWin) + +End + +Public Sub mnuPreviousTab_Click() + + Try Dec tabWorkspace.Index + +End + +Public Sub mnuNextTab_Click() + + Try Inc tabWorkspace.Index + +End + +Public Sub tabWorkspace_Close(Index As Integer) + + If GetParent()._RaiseClose($aWindow[Index].Window) Then + Stop Event + Return + Endif + + $aWindow[Index].Window.Close + +End + +Public Sub tabWorkspace_Arrange() + + UpdateSize + +End + +Public Sub Form_Resize() + + UpdateSize + +End + +Public Sub SetBorder(bBorder As Boolean) + + $bBorder = bBorder + tabWorkspace.Border = bBorder + UpdateSize + +End + +Public Sub HasBorder() As Boolean + + Return $bBorder + +End + +Public Sub imgBackground_Draw() + + If Not $hImage Then Return + + Paint.Brush = Paint.Image($hImage) + Paint.Rectangle(0, 0, Paint.W, Paint.H) + Paint.Fill + +End + +Public Sub GetImage() As Image + + Return $hImage + +End + +Public Sub SetImage(hImage As Image) + + $hImage = hImage + panWorkspace.Refresh + +End + +Public Sub GetTabPanel() As TabPanel + + Return tabWorkspace + +End + +Public Sub tabWorkspace_Move(Source As Integer, Target As Integer) + + Dim hWindow As CWindow + Dim I As Integer + + hWindow = $aWindow[Source] + $aWindow.Remove(Source) + $aWindow.Add(hWindow, Target) + + For I = 0 To $aWindow.Max + UpdateTitleFromIndex(I) + Next + +End + +Public Sub mnuDetach_Click() + + Detach($aWindow[tabWorkspace.Index].Window) + +End + +Public Sub mnuAttach_Click() + + Attach($aWindow[Last.Tag].Window) + +End + +Public Sub CloseAll() + + CloseWindows(CLOSE_ALL) + +End + +Public Sub tabWorkspace_CloseAll() + + CloseWindows(CLOSE_ALL) + +End + +Public Sub Button_MouseDown() + + If Mouse.Middle And If Not tabWorkspace.Closable Then + tabWorkspace_Close(tabWorkspace._GetIndex(Last.Parent)) + Stop Event ' BUG: Needed, as sometimes the MouseDown event is raised twice + Endif + +End + +Public Sub SetCloseWithMouse(bVal As Boolean) + + tabWorkspace.Closable = Not bVal + +End + +Public Sub IsCloseWithMouse() As Boolean + + Return Not tabWorkspace.Closable + +End + + diff --git a/comp/src/gb.form.mdi/.src/Workspace/FWorkspace.form b/comp/src/gb.form.mdi/.src/Workspace/FWorkspace.form new file mode 100644 index 00000000..a95b1a2c --- /dev/null +++ b/comp/src/gb.form.mdi/.src/Workspace/FWorkspace.form @@ -0,0 +1,146 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,69,74) + Arrangement = Arrange.Fill + { mnuWindow Menu + Visible = False + { mnuShow Menu + Text = ("Show") + } + { mnuSort Menu + Action = "workspace-sort-tab" + Text = ("Sort tabs") + Picture = Picture["icon:/small/sort-ascent"] + } + { Menu1 Menu + } + { mnuCloseRight Menu + Action = "workspace-close-right" + Text = ("Close tabs on the right") + } + { mnuCloseOther Menu + Action = "workspace-close-other" + Text = ("Close other tabs") + } + { mnuCloseAll Menu + Action = "workspace-close-all" + Text = ("Close all tabs") + } + { Menu2 Menu + } + { mnuAttach Menu + Text = ("Attach tab") + } + { mnuDetach Menu + Text = ("Detach tab") + } + { mnuClose Menu + Action = "workspace-close" + Text = ("Close tab") + Picture = Picture["icon:/small/close"] + } + } + { mnuMove Menu + { mnuPreviousTab Menu + Action = "workspace-previous-tab" + Text = ("Previous tab") + Shortcut = "Ctrl+PgUp" + } + { mnuNextTab Menu + Action = "workspace-next-tab" + Text = ("Next tab") + Shortcut = "Ctrl+PgDown" + } + } + { tabWorkspace TabPanel + MoveScaled(3,8,40,32) + Visible = False + Expand = True + Closable = True + Moveable = True + Highlight = True + Index = 0 + Text = ("") + Index = 0 + } + { svwWorkspace ScrollView + MoveScaled(2,45,35,23) + Visible = False + { panRight Panel Handle + Name = "panRight" + MoveScaled(8,5,1,1) + Background = Color.TextBackground + Mouse = Mouse.SizeE + Border = Border.Plain + } + { panDown Panel Handle + Name = "panDown" + MoveScaled(6,7,1,1) + Background = Color.TextBackground + Mouse = Mouse.SizeS + Border = Border.Plain + } + { panRightDown Panel Handle + Name = "panRightDown" + MoveScaled(8,7,1,1) + Background = Color.TextBackground + Mouse = Mouse.SizeSE + Border = Border.Plain + } + { dwgBorder DrawingArea + MoveScaled(16,6,15,11) + Background = Color.Background + Border = Border.Raised + } + } + { panWorkspace Panel + MoveScaled(40,43,28,25) + Ignore = True + Arrangement = Arrange.Fill + { imgBackground DrawingArea + MoveScaled(3,4,16,17) + Visible = False + NoBackground = True + } + } + { timCheck #Timer + #MoveScaled(59,18) + Delay = 0 + } +} + +# Gambas Action File 3.0 + +{ Actions + { Action workspace-close + Text = "Close tab" + Shortcut = "" + Picture = "icon:/small/close" + } + { Action workspace-close-all + Text = "Close all tabs" + Shortcut = "" + } + { Action workspace-close-other + Text = "Close other tabs" + Shortcut = "" + } + { Action workspace-close-right + Text = "Close tabs on the right" + Shortcut = "" + } + { Action workspace-next-tab + Text = "Next tab" + Shortcut = "Ctrl+PgDown" + } + { Action workspace-previous-tab + Text = "Previous tab" + Shortcut = "Ctrl+PgUp" + } + { Action workspace-sort-tab + Text = "Sort tabs" + Shortcut = "" + Picture = "icon:/small/sort-ascent" + } +} diff --git a/comp/src/gb.form.mdi/.src/Workspace/Workspace.class b/comp/src/gb.form.mdi/.src/Workspace/Workspace.class new file mode 100644 index 00000000..e8411976 --- /dev/null +++ b/comp/src/gb.form.mdi/.src/Workspace/Workspace.class @@ -0,0 +1,283 @@ +' Gambas class file + +Export + +Inherits UserControl + +Public Const _Properties As String = "*,Orientation{Align.Top;Bottom}=Top,Image,Border=True,CloseButton=True" +Public Const _DefaultEvent As String = "Activate" +Public Const _Group As String = "Special" + +Event Activate +Event Close({Window} As Window) +Event Attach({Window} As Window) +Event Detach({Window} As Window) +Event CloseAll + +Property ActiveWindow As Window +Property Read Windows As Window[] +Property Read Count As Integer +Property Font As Font +Property Background As Integer +Property Orientation As Integer +Property Border As Boolean +Property Image As Image +Property Picture As Picture +Property CloseWithMouse As Boolean +Property CloseButton As Boolean ''if false the close all tabs button is not shown +Property Read TabPanel As TabPanel + +Static Private $bPictureWarning As Boolean + +Private $hWorkspace As FWorkspace +Private $hPicture As Picture + +Public Sub _new() + + 'SUPER.Background = Color.Yellow + $hWorkspace = New FWorkspace(Me) + $hWorkspace.CloseButton = True + 'ME.Container = $hWorkspace.Container + +End + +Public Sub Add(hWindow As Window, Optional Resizable As Boolean) + + $hWorkspace.Add(hWindow, Resizable) + +End + +Public Sub Remove(hWindow As Window) + + $hWorkspace.Remove(hWindow) + +End + +Public Sub Exist(hWindow As Window) As Boolean + + Return $hWorkspace.Exist(hWindow) + +End + + +Public Sub Detach(hWindow As Window) + + $hWorkspace.Detach(hWindow) + +End + +Public Sub Attach(hWindow As Window) + + $hWorkspace.Attach(hWindow) + +End + + + +Public Sub Lock() + + $hWorkspace.Lock + +End + +Public Sub Unlock() + + $hWorkspace.UnLock + +End + +' PUBLIC SUB SetResizable(Window AS Window, Resizable AS Boolean, OPTIONAL Grid AS Integer) +' +' $hWorkspace.SetResizable(Window, Resizable, Grid) +' +' END + + +Private Function ActiveWindow_Read() As Window + + Return $hWorkspace.GetActiveWindow() + +End + +Private Sub ActiveWindow_Write(Value As Window) + + $hWorkspace.ActivateWindow(Value) + +End + +Private Function Windows_Read() As Window[] + + Return $hWorkspace.GetWindows() + +End + +Public Sub _Activate() + + Raise Activate + +End + +Public Sub _RaiseClose(hWindow As Window) As Boolean + + Dim bCancel As Boolean + + bCancel = Raise Close(hWindow) + Return bCancel + +End + +Public Sub _RaiseAttach(hWindow As Window) + + Raise Attach(hWindow) + +End + +Public Sub _RaiseDetach(hWindow As Window) + + Raise Detach(hWindow) + +End + +Public Sub _RaiseCloseAll() + + Raise CloseAll + +End + + + +' Private Function ShowTitle_Read() As Boolean +' +' Return $hWorkspace.IsShowTitle() +' +' End +' +' Private Sub ShowTitle_Write(Value As Boolean) +' +' $hWorkspace.SetShowTitle(Value) +' +' End + +Private Function Font_Read() As Font + + Return $hWorkspace.GetTabPanel().Font + +End + +Private Sub Font_Write(Value As Font) + + $hWorkspace.GetTabPanel().Font = Value + +End + +Private Function Background_Read() As Integer + + Return $hWorkspace.GetBackground() + +End + +Private Sub Background_Write(Value As Integer) + + $hWorkspace.SetBackground(Value) + +End + +Private Function Orientation_Read() As Integer + + Return $hWorkspace.GetOrientation() + +End + +Private Sub Orientation_Write(Value As Integer) + + If Value = Align.Top Or If Value = Align.Bottom Then $hWorkspace.SetOrientation(Value) + +End + +Private Function Border_Read() As Boolean + + Return $hWorkspace.HasBorder() + +End + +Private Sub Border_Write(Value As Boolean) + + $hWorkspace.SetBorder(Value) + +End + +Private Function Picture_Read() As Picture + + Return $hPicture + +End + +Private Sub Picture_Write(Value As Picture) + + If Not $bPictureWarning Then + $bPictureWarning = True + Error "gb.form.mdi: warning: Workspace.Picture property is deprecated. Use Workspace.Image instead" + Endif + + $hPicture = Value + If Value Then + $hWorkspace.SetImage($hPicture.Image) + Else + $hWorkspace.SetImage(Null) + Endif + +End + +Private Function Count_Read() As Integer + + Return $hWorkspace.GetCountWindows() + +End + +Private Function Image_Read() As Image + + Return $hWorkspace.GetImage() + +End + +Private Sub Image_Write(Value As Image) + + $hWorkspace.SetImage(Value) + +End + +Public Sub CloseAll() + + $hWorkspace.CloseAll + +End + +Private Function CloseWithMouse_Read() As Boolean + + Return $hWorkspace.IsCloseWithMouse() + +End + +Private Sub CloseWithMouse_Write(Value As Boolean) + + $hWorkspace.SetCloseWithMouse(Value) + +End + +Private Function CloseButton_Read() As Boolean + + Return $hWorkspace.CloseButton + +End + +Private Sub CloseButton_Write(Value As Boolean) + + $hWorkspace.CloseButton = Value + +End + +Private Function TabPanel_Read() As TabPanel + + Return $hWorkspace.GetTabPanel() + +End diff --git a/comp/src/gb.form.mdi/70a017.png b/comp/src/gb.form.mdi/70a017.png new file mode 100644 index 0000000000000000000000000000000000000000..3419451d289b4dcc6832281d3d47414b63bdad28 GIT binary patch literal 1542 zcmV+h2Ko7kP)l)M;FF%}gHQtU$@Vq3fv8!A%NRz$6#iXezV z`l6vC0VT!TqoxW)Bv7RwmI_j-muRN3b3f5P+*6c>DF?X%X}>;GHd zw{9E$&q-Zp`+2}_Dbv8KZ#3wK0ogZ$%xg*AST>$zT>d!p;R9EKr?NM3Y!{%*_F&G2J!fl6|hF?4R z=G$V73reZo`rMT4F7+zQa@jlESI%o{FXS%LYJ1AE#+C(=Je?fA^28%*|1Ez!`0!)r zR%qtRHMwFp06J|;Z>Ep+nmj=50-5t=8T34Wi+guh4m#CFa3#-P`wUzT=D{N*A03g$F>G&G3XdES-`jwV_Rrr z`NyS-5EAOZ)ATxu!L0Dk+u;izg|B}9ri8#k)<=sWvk`4Q+LjnQ#u&{z4hygR@(6Xk zL^)cf7_CxyxOjQDp070oSq8Qb7?6Z9HQE$tZBa_lL=+CKDu^W#$7t>8v~CiBRtmBK zD1(v&sY0a|xzSjYu*zdpg`vRE!AJ|MZVtd6;NgG$dx5(@@-0At2#`R+#5^f^Bso&_ zr06CFp^5%mfOi2Gb`sfcD{ce70^WV^u{qvzq|f}U1vO!v2qQI!gH%DPNzoA#!~`ip zQ6Vp1ME&eJxV+2)@LAxQ-2iR}UjFjQx67%=Kd8v(AZSDcC7}^b1;jBDhe%i_`88s_ zf_E$UY6b5dAwr0a!>oZ{{{eaEo2c4xdIGX7KnEy(eEPj|{KWkV+Mqk2G9V$zp;Cdw zA<3_i+$zy66WlVfUdC5TxN?cQTEe@E7@9DI(7+^tV<%x;aWC+T?dHIvcOMCdM{V83IB`5g$E1I$W%&T}f3`8(s)$k_R~bD171@{Cs-g z(eZ z4CbIe3ry{f(;ny@zU!@|;U!WSA!-Rx9Z;5(gp@of6ht>7xK(_;imO%{E7qyY5mhmw z92You)%DYs67<@zw8mijWw`z~%3&K(U6N`eDvUbK8}n=B_Wm@G4!$7T(*npR?#bByNT`yaOd%6^H7r=LQQohTU18+#klud;-EB|Arv%j$%tpD|xm-_Rw$^I}&-?}!R~w$K0Otp@eBi!g zD6K&2t1oTjdg{M!I)7dH4)1CWy$<~7JOF>+@Z=Q0(LEi0_xm5faJ*S`6M%rW29tHL zb_SjGFt&@aZIsE;+Mtw1BS1h=HwTs!eCLN3n$j003uiJ;aF%XHcW@)JSNa zbv}n}4KVEknAUzwK0xOKblyj2b11tPWxFUW5Fr()xQ=1SPk(Yw?tA2U1>6E$+z9~S zd)*eF{M-rTvHMZoRx`#lLHoj#sAglzwbLC6;b?5;Q#;t07*qoM6N<$f|Taio&W#< literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.mdi/control/buttonbox.png b/comp/src/gb.form.mdi/control/buttonbox.png new file mode 100644 index 0000000000000000000000000000000000000000..3eb394a964547f9959cfd810dfce211adf548da3 GIT binary patch literal 290 zcmV+-0p0$IP)kdg0002#NklPi6vpvChQiLm8YnC-=NdLn;0P8vkChYX4i@fUFcdbpf`tut7NCOQJ0&s3#IJbC zal9Xd7Y_dMwj{PqqXI8sik}d)dUArY$^$=O{IC^sb~N`G080RT8rt`yLVJkjz@S*w zfV_P!01H6hR(}14lo=-hn6Q=sutnZMG{*^qtQZNvhEM{!Xka4%A)4qpFeFBo{`aOt^zXot oI`K-Ds2otm;rMRyWBnh13&XTl^3oy!9{>OV07*qoM6N<$g2Oa-ZvX%Q literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.mdi/control/combobox.png b/comp/src/gb.form.mdi/control/combobox.png new file mode 100644 index 0000000000000000000000000000000000000000..ab650adceb354d42e4cc3668d41fe5e1c58133d2 GIT binary patch literal 287 zcmV+)0pR|LP)kdg0002yNkl(R87JVwIHWp-ieYr=Tg9;pkT(f1HBIz$~vF2VuCEe##OILWPqFl z0%@?c6wO4`)qCIs7;av?Dna@ETfh>=L75f-KVBgL2jUl l2%(xpK%&0|K%$vH6?Z=Jsw$1KnPmU~002ovPDHLkV1mALbISk# literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.mdi/control/datebox.png b/comp/src/gb.form.mdi/control/datebox.png new file mode 100644 index 0000000000000000000000000000000000000000..7544f69b9dda248ba774e0c4599a59c9c75aa246 GIT binary patch literal 568 zcmV-80>}M{P)+9=iXlQoQLUPeP*VotS>FM6y-stG) z`1ttL)YRwa=luNqSXfwDSy|TB*82MT)6>)D=H`BWe$vv?_V)HxR#wo^(1L=3(b3V_ z+1Y1jXH`{IS65g4{r%Y3*k)#C^z`)V>gxXf{?E_P;o;%z?CkmZ`QP8)mzS4dU|?Tg zU(3tO$;rvYdA~jY000DZQchC<00029lV+L#009U|L_t(I%gxeVTY@kc#_>tk!&?{| zghA`YMj2F=rKBWAS^51xQM2O8@x;}s|AU?IyLK>cLN=gQySeR_Mu@i4oD_s?!B4tT z%LHg^zd$!ETgj4Q9mwyyN>Zr6b~;L?T?czEWuE6TCQn9PAA$X#d*C=u7>4rb1`z^> zlph^eae9KlX>T3$bOg>A7uBNxXE6fjCKng|OMoPmz`R1>+Lt#teSn)4@COKVA_;Eq zV0ga*(E|eRXe>ZvY4(_c9Js!ITQXlPkX`r$KXHqy2aG8_*}n@h=|-P*2wY0000kdg0003!NkltwJWMFwQ5R5R}1(Z=SN-Zwaz#HQr)z4*} HQ$iB}MRg;G literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.mdi/img/configure.png b/comp/src/gb.form.mdi/img/configure.png new file mode 100644 index 0000000000000000000000000000000000000000..26118fbbaa56c0a54a264ba47e10ec6451505131 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6LOfj@Lp09UUO33fV93FG@gkQ_ zqW8uxQ&KoBQzByw?oa-}#-c0FkR_UH)UkQzGhq(4>pW~-nwR%f85CL@eipy;gZCZJ pGD#of9nW~KpV60?|87!Zc^_y#gQu&X%Q~loCID4=Funi) literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.mdi/img/configure_dark.png b/comp/src/gb.form.mdi/img/configure_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..5c369b95ee081d3e36465303c9d58af3b8cf2639 GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6f;?RuLp08}UO32kz=6Z%qJ3DB z=F9zD)`so8iOlbgO#WcUu}Yu8>!{h>C$|oL=HhX#U~5eFvfslloUfi%*DP#*aHiut m$9al2L%lp};DHKt Q6QBkLPgg&ebxsLQ06oMn>Hq)$ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.mdi/img/handle-v.png b/comp/src/gb.form.mdi/img/handle-v.png new file mode 100644 index 0000000000000000000000000000000000000000..3f3e90861b00b11c2be1538c7404a66b8703b498 GIT binary patch literal 100 zcmeAS@N?(olHy`uVBq!ia0vp^93afW0wnX;%77$;wx^3@2*>rMCk(k56nIz;dfLg= x*NG|J*nRdu*GZLiysMu?H7@8&x7qrCBjehK0{;SArbvSHdAjrMJ%)S?1{^I5mdKI;Vst0ME!1`~Uy| literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.mdi/img/roll.png b/comp/src/gb.form.mdi/img/roll.png new file mode 100644 index 0000000000000000000000000000000000000000..ab1fced65ba0e8d13e87b500a4a9ce57558768ad GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^93adHBpBY5G^+tArjj7PUue!C>jet}bybQ5&Sm)78&qol`;+04nT;bfULbv*u6{1-oD!M7` z9`bhC4iw4vba4#PIG>!Lz;>pEc@ERl0EcZ1lMC2oB(xYkvfvYmm|>cO4R)t9V3a5FHLF^V+!9$3Wu@C)CBtwJZ5dJ~qP*J)?r4`6swq9)kV qu$bv0Bg^Hc=!ON7EXjQK3=Dr}E!8?ZV`DAQY6eeNKbLh*2~7Yn8(E(K literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.print/.icon.png b/comp/src/gb.form.print/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4a11a32a9efa8933caaabda86ebe89bce7f4305e GIT binary patch literal 6301 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 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.print/.lang/es.po b/comp/src/gb.form.print/.lang/es.po new file mode 100644 index 00000000..0eac78df --- /dev/null +++ b/comp/src/gb.form.print/.lang/es.po @@ -0,0 +1,215 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.form.print 3.13.90\n" +"PO-Revision-Date: 2019-07-05 03:31 UTC\n" +"Last-Translator: benoit \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Generic preview and print form" +msgstr "" + +#: FPreview.form:79 +msgid "Print preview" +msgstr "" + +#: FPreview.form:87 +msgid "Print to file" +msgstr "" + +#: FPreview.form:113 +msgid "Printing" +msgstr "" + +#: FPreview.form:138 +msgid "One page" +msgstr "Una página" + +#: FPreview.form:146 +msgid "Two pages" +msgstr "Dos páginas" + +#: FPreview.form:154 +msgid "Full width" +msgstr "Ajustar ancho" + +#: FPreview.form:162 +msgid "Real size" +msgstr "Tamaño real" + +#: FPreview.form:172 +msgid "Zoom out" +msgstr "" + +#: FPreview.form:185 +msgid "100 %" +msgstr "" + +#: FPreview.form:191 +msgid "Zoom in" +msgstr "" + +#: FPreview.form:200 +msgid "Print" +msgstr "Imprimir" + +#: FPreview.form:208 +msgid "Show options" +msgstr "" + +#: FPreview.form:231 +msgid "Printer" +msgstr "Impresora" + +#: FPreview.form:256 +msgid "Two-sided" +msgstr "" + +#: FPreview.form:263 +msgid "None" +msgstr "Ninguno" + +#: FPreview.form:263 +msgid "Short side" +msgstr "Lado corto" + +#: FPreview.form:263 +msgid "Long side" +msgstr "Lado largo" + +#: FPreview.form:267 +msgid "File" +msgstr "Archivo" + +#: FPreview.form:293 +msgid "Resolution" +msgstr "" + +#: FPreview.form:305 +msgid "dpi" +msgstr "" + +#: FPreview.form:328 +msgid "Range" +msgstr "Rango" + +#: FPreview.form:344 +msgid "Copies" +msgstr "Copias" + +#: FPreview.form:366 +msgid "Orientation" +msgstr "Orientación" + +#: FPreview.form:373 +msgid "Portrait" +msgstr "Retrato" + +#: FPreview.form:373 +msgid "Landscape" +msgstr "Paisaje" + +#: FPreview.form:383 +msgid "Paper" +msgstr "Papel" + +#: FPreview.form:390 +msgid "Custom" +msgstr "" + +# gb-ignore +#: FPreview.form:390 +msgid "A3" +msgstr "" + +# gb-ignore +#: FPreview.form:390 +msgid "A4" +msgstr "" + +# gb-ignore +#: FPreview.form:390 +msgid "A5" +msgstr "" + +# gb-ignore +#: FPreview.form:390 +msgid "B5" +msgstr "" + +# gb-ignore +#: FPreview.form:390 +msgid "Letter" +msgstr "" + +# gb-ignore +#: FPreview.form:390 +msgid "Executive" +msgstr "" + +# gb-ignore +#: FPreview.form:390 +msgid "Legal" +msgstr "" + +#: FPreview.form:405 +msgid "Width" +msgstr "Ancho" + +# gb-ignore +#: FPreview.form:416 +msgid "mm" +msgstr "" + +#: FPreview.form:426 +msgid "Height" +msgstr "Altura" + +#: FPreview.form:449 +msgid "Grayscale" +msgstr "" + +#: FPreview.form:455 +msgid "Full page" +msgstr "" + +#: FPreview.form:460 +msgid "Collate copies" +msgstr "" + +#: FPreview.form:465 +msgid "Reverse order" +msgstr "Orden inverso" + +#: FPreview.class:265 +msgid "PDF files" +msgstr "" + +#: FPreview.class:265 +msgid "Postscript files" +msgstr "" + +#: FPreview.class:280 +msgid "Cancel" +msgstr "Cancelar" + +#: FPreview.class:364 +msgid "This file already exists.\nDo you want to replace it?" +msgstr "" + +#: FPreview.class:364 +msgid "Replace" +msgstr "" + +#: FPreview.class:389 +msgid "Layout..." +msgstr "Disposición..." + +#: FPreview.class:401 +msgid "Printing..." +msgstr "Impresión..." + diff --git a/comp/src/gb.form.print/.lang/es_ES.po b/comp/src/gb.form.print/.lang/es_ES.po new file mode 100644 index 00000000..008a72f2 --- /dev/null +++ b/comp/src/gb.form.print/.lang/es_ES.po @@ -0,0 +1,215 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.form.print 3.13.90\n" +"PO-Revision-Date: 2019-07-05 03:31 UTC\n" +"Last-Translator: benoit \n" +"Language: es_ES\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Generic preview and print form" +msgstr "" + +#: FPreview.form:79 +msgid "Print preview" +msgstr "" + +#: FPreview.form:87 +msgid "Print to file" +msgstr "" + +#: FPreview.form:113 +msgid "Printing" +msgstr "" + +#: FPreview.form:138 +msgid "One page" +msgstr "Una página" + +#: FPreview.form:146 +msgid "Two pages" +msgstr "Dos páginas" + +#: FPreview.form:154 +msgid "Full width" +msgstr "Ajustar ancho" + +#: FPreview.form:162 +msgid "Real size" +msgstr "Tamaño real" + +#: FPreview.form:172 +msgid "Zoom out" +msgstr "" + +#: FPreview.form:185 +msgid "100 %" +msgstr "" + +#: FPreview.form:191 +msgid "Zoom in" +msgstr "" + +#: FPreview.form:200 +msgid "Print" +msgstr "Imprimir" + +#: FPreview.form:208 +msgid "Show options" +msgstr "" + +#: FPreview.form:231 +msgid "Printer" +msgstr "Impresora" + +#: FPreview.form:256 +msgid "Two-sided" +msgstr "" + +#: FPreview.form:263 +msgid "None" +msgstr "Ninguno" + +#: FPreview.form:263 +msgid "Short side" +msgstr "Lado corto" + +#: FPreview.form:263 +msgid "Long side" +msgstr "Lado largo" + +#: FPreview.form:267 +msgid "File" +msgstr "Archivo" + +#: FPreview.form:293 +msgid "Resolution" +msgstr "" + +#: FPreview.form:305 +msgid "dpi" +msgstr "" + +#: FPreview.form:328 +msgid "Range" +msgstr "Rango" + +#: FPreview.form:344 +msgid "Copies" +msgstr "Copias" + +#: FPreview.form:366 +msgid "Orientation" +msgstr "Orientación" + +#: FPreview.form:373 +msgid "Portrait" +msgstr "Retrato" + +#: FPreview.form:373 +msgid "Landscape" +msgstr "Paisaje" + +#: FPreview.form:383 +msgid "Paper" +msgstr "Papel" + +#: FPreview.form:390 +msgid "Custom" +msgstr "" + +# gb-ignore +#: FPreview.form:390 +msgid "A3" +msgstr "" + +# gb-ignore +#: FPreview.form:390 +msgid "A4" +msgstr "" + +# gb-ignore +#: FPreview.form:390 +msgid "A5" +msgstr "" + +# gb-ignore +#: FPreview.form:390 +msgid "B5" +msgstr "" + +# gb-ignore +#: FPreview.form:390 +msgid "Letter" +msgstr "" + +# gb-ignore +#: FPreview.form:390 +msgid "Executive" +msgstr "" + +# gb-ignore +#: FPreview.form:390 +msgid "Legal" +msgstr "" + +#: FPreview.form:405 +msgid "Width" +msgstr "Ancho" + +# gb-ignore +#: FPreview.form:416 +msgid "mm" +msgstr "" + +#: FPreview.form:426 +msgid "Height" +msgstr "Altura" + +#: FPreview.form:449 +msgid "Grayscale" +msgstr "" + +#: FPreview.form:455 +msgid "Full page" +msgstr "" + +#: FPreview.form:460 +msgid "Collate copies" +msgstr "" + +#: FPreview.form:465 +msgid "Reverse order" +msgstr "Orden inverso" + +#: FPreview.class:265 +msgid "PDF files" +msgstr "" + +#: FPreview.class:265 +msgid "Postscript files" +msgstr "" + +#: FPreview.class:280 +msgid "Cancel" +msgstr "Cancelar" + +#: FPreview.class:364 +msgid "This file already exists.\nDo you want to replace it?" +msgstr "" + +#: FPreview.class:364 +msgid "Replace" +msgstr "" + +#: FPreview.class:389 +msgid "Layout..." +msgstr "Disposición..." + +#: FPreview.class:401 +msgid "Printing..." +msgstr "Impresión..." + diff --git a/comp/src/gb.form.print/.lang/fr.po b/comp/src/gb.form.print/.lang/fr.po new file mode 100644 index 00000000..e564bea2 --- /dev/null +++ b/comp/src/gb.form.print/.lang/fr.po @@ -0,0 +1,194 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.form.print 3.13.90\n" +"PO-Revision-Date: 2019-07-08 00:03 UTC\n" +"Last-Translator: benoit \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Generic preview and print form" +msgstr "Formulaire de prévisualisation et d'impression générique" + +#: FPreview.class:273 +msgid "PDF files" +msgstr "Fichiers PDF" + +#: FPreview.class:273 +msgid "Postscript files" +msgstr "Fichiers Postscript" + +#: FPreview.class:288 +msgid "Cancel" +msgstr "Annuler" + +#: FPreview.class:371 +msgid "Replace" +msgstr "Remplacer" + +#: FPreview.class:371 +msgid "This file already exists.\nDo you want to replace it?" +msgstr "Ce fichier existe déjà.\nVoules-vous le remplacer ?" + +#: FPreview.class:407 +msgid "Layout..." +msgstr "Mise en page..." + +#: FPreview.form:89 +msgid "Print preview" +msgstr "Prévisualisation de l'impression" + +#: FPreview.form:97 +msgid "Print to file" +msgstr "Imprimer dans un fichier" + +#: FPreview.form:124 +msgid "Printing" +msgstr "Impression en cours" + +#: FPreview.form:149 +msgid "One page" +msgstr "Une page" + +#: FPreview.form:157 +msgid "Two pages" +msgstr "Deux pages" + +#: FPreview.form:165 +msgid "Full width" +msgstr "Pleine largeur" + +#: FPreview.form:173 +msgid "Real size" +msgstr "Taille réelle" + +#: FPreview.form:183 +msgid "Zoom out" +msgstr "Réduire" + +# gb-ignore +#: FPreview.form:196 +msgid "100 %" +msgstr "" + +#: FPreview.form:202 +msgid "Zoom in" +msgstr "Agrandir" + +#: FPreview.form:211 +msgid "Print" +msgstr "Imprimer" + +#: FPreview.form:219 +msgid "Show options" +msgstr "Afficher les options" + +#: FPreview.form:238 +msgid "Printer" +msgstr "Imprimante" + +#: FPreview.form:263 +msgid "Two-sided" +msgstr "Recto-verso" + +#: FPreview.form:270 +msgid "Long side" +msgstr "Côté long" + +#: FPreview.form:270 +msgid "None" +msgstr "Aucun" + +#: FPreview.form:270 +msgid "Short side" +msgstr "Côté court" + +#: FPreview.form:274 +msgid "File" +msgstr "Fichier" + +#: FPreview.form:300 +msgid "Resolution" +msgstr "Résolution" + +# gb-ignore +#: FPreview.form:312 +msgid "DPI" +msgstr "" + +#: FPreview.form:329 +msgid "Copies" +msgstr "Copies" + +#: FPreview.form:345 +msgid "Orientation" +msgstr "Orientation" + +#: FPreview.form:352 +msgid "Landscape" +msgstr "Paysage" + +#: FPreview.form:352 +msgid "Portrait" +msgstr "Portrait" + +#: FPreview.form:362 +msgid "Paper" +msgstr "Papier" + +#: FPreview.form:383 +msgid "Width" +msgstr "Largeur" + +# gb-ignore +#: FPreview.form:393 +msgid "mm" +msgstr "" + +#: FPreview.form:403 +msgid "Height" +msgstr "Hauteur" + +#: FPreview.form:420 +msgid "Grayscale" +msgstr "Niveaux de gris" + +#: FPreview.form:426 +msgid "Full page" +msgstr "Pleine page" + +#: FPreview.form:431 +msgid "Collate copies" +msgstr "Assembler les copies" + +#: FPreview.form:436 +msgid "Reverse order" +msgstr "Inverser" + +#: FPreview.form:444 +msgid "Margins" +msgstr "Marges" + +#: FPreview.form:453 +msgid "Left" +msgstr "Gauche" + +#: FPreview.form:474 +msgid "Right" +msgstr "Droite" + +#: FPreview.form:495 +msgid "Top" +msgstr "Haute" + +#: FPreview.form:516 +msgid "Bottom" +msgstr "Basse" + +#: FPreview.form:556 +msgid "Close" +msgstr "Fermer" + diff --git a/comp/src/gb.form.print/.lang/it.po b/comp/src/gb.form.print/.lang/it.po new file mode 100644 index 00000000..ee3528f8 --- /dev/null +++ b/comp/src/gb.form.print/.lang/it.po @@ -0,0 +1,174 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.form.print 3.13.90\n" +"PO-Revision-Date: 2019-07-13 13:52 UTC\n" +"Last-Translator: gian \n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Generic preview and print form" +msgstr "Finestra generica anteprima e stampa" + +#: FPreview.class:298 +msgid "PDF files" +msgstr "File PDF" + +#: FPreview.class:298 +msgid "Postscript files" +msgstr "File Postscript" + +#: FPreview.class:358 FPrinting.form:30 +msgid "Cancel" +msgstr "Annulla" + +#: FPreview.class:358 +msgid "Replace" +msgstr "Sostituisci" + +#: FPreview.class:358 +msgid "This file already exists.\nDo you want to replace it?" +msgstr "Questo file già esiste.\nDesideri sostituirlo?" + +#: FPreview.form:79 +msgid "Print preview" +msgstr "Anteprima di stampa" + +#: FPreview.form:87 +msgid "Print to file" +msgstr "Stampa su file" + +#: FPreview.form:99 +msgid "Toggle option panel" +msgstr "Attiva o disattiva il pannello delle opzioni" + +#: FPreview.form:114 +msgid "One page" +msgstr "Una pagina" + +#: FPreview.form:122 +msgid "Two pages" +msgstr "Due pagine" + +#: FPreview.form:130 +msgid "Full width" +msgstr "Intera larghezza" + +#: FPreview.form:138 +msgid "Real size" +msgstr "Dimensione reale" + +#: FPreview.form:151 +msgid "Print" +msgstr "Stampa" + +#: FPreview.form:165 +msgid "Zoom out" +msgstr "Rimpicciolisci" + +# gb-ignore +#: FPreview.form:172 +msgid "100 %" +msgstr "" + +#: FPreview.form:178 +msgid "Zoom in" +msgstr "Ingrandisci" + +#: FPreview.form:209 +msgid "Resolution" +msgstr "Risoluzione" + +# gb-ignore +#: FPreview.form:221 +msgid "DPI" +msgstr "" + +#: FPreview.form:231 +msgid "Two-sided" +msgstr "Fronte retro" + +#: FPreview.form:238 +msgid "Long side" +msgstr "Lato lungo" + +#: FPreview.form:238 +msgid "None" +msgstr "Nessuno" + +#: FPreview.form:238 +msgid "Short side" +msgstr "Lato corto" + +#: FPreview.form:248 +msgid "Copies" +msgstr "Copie" + +#: FPreview.form:264 +msgid "Orientation" +msgstr "Orientamento" + +#: FPreview.form:271 +msgid "Landscape" +msgstr "Orizzontale" + +#: FPreview.form:271 +msgid "Portrait" +msgstr "Verticale" + +#: FPreview.form:281 +msgid "Paper" +msgstr "Carta" + +#: FPreview.form:302 +msgid "Width" +msgstr "Larghezza" + +# gb-ignore +#: FPreview.form:312 +msgid "mm" +msgstr "" + +#: FPreview.form:322 +msgid "Height" +msgstr "Altezza" + +#: FPreview.form:339 +msgid "Grayscale" +msgstr "Scala di grigi" + +#: FPreview.form:344 +msgid "Collate copies" +msgstr "Assembla le copie" + +#: FPreview.form:349 +msgid "Reverse order" +msgstr "Ordine inverso" + +#: FPreview.form:357 +msgid "Margins" +msgstr "Margini" + +#: FPreview.form:366 +msgid "Left" +msgstr "Sinistra" + +#: FPreview.form:387 +msgid "Right" +msgstr "Destra" + +#: FPreview.form:408 +msgid "Top" +msgstr "Superiore" + +#: FPreview.form:429 +msgid "Bottom" +msgstr "Inferiore" + +#: FPrinting.form:11 +msgid "Printing" +msgstr "Stampa" + diff --git a/comp/src/gb.form.print/.lang/nl.po b/comp/src/gb.form.print/.lang/nl.po new file mode 100644 index 00000000..3caaaa0f --- /dev/null +++ b/comp/src/gb.form.print/.lang/nl.po @@ -0,0 +1,219 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.form.print 3.13.90\n" +"PO-Revision-Date: 2019-07-05 03:31 UTC\n" +"Last-Translator: benoit \n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Generic preview and print form" +msgstr "" + +#: FPreview.form:79 +msgid "Print preview" +msgstr "" + +#: FPreview.form:87 +msgid "Print to file" +msgstr "Afdrukken naar bestand" + +#: FPreview.form:113 +msgid "Printing" +msgstr "Afdrukken" + +#: FPreview.form:138 +msgid "One page" +msgstr "Een pagina" + +#: FPreview.form:146 +msgid "Two pages" +msgstr "Twee pagina's" + +#: FPreview.form:154 +msgid "Full width" +msgstr "Volledige breedte" + +#: FPreview.form:162 +msgid "Real size" +msgstr "Echte afmeting" + +#: FPreview.form:172 +msgid "Zoom out" +msgstr "Zoom uit" + +# gb-ignore +#: FPreview.form:185 +msgid "100 %" +msgstr "" + +# gb-ignore +#: FPreview.form:191 +msgid "Zoom in" +msgstr "" + +#: FPreview.form:200 +msgid "Print" +msgstr "Afdrukken" + +#: FPreview.form:208 +msgid "Show options" +msgstr "Opties weergeven" + +#: FPreview.form:231 +msgid "Printer" +msgstr "Printer" + +#: FPreview.form:256 +msgid "Two-sided" +msgstr "Dubbelzijdig" + +#: FPreview.form:263 +msgid "None" +msgstr "Geen" + +#: FPreview.form:263 +msgid "Short side" +msgstr "Korte zijde" + +#: FPreview.form:263 +msgid "Long side" +msgstr "Lange zijde" + +#: FPreview.form:267 +msgid "File" +msgstr "Bestand" + +#: FPreview.form:293 +msgid "Resolution" +msgstr "Resolutie" + +# gb-ignore +#: FPreview.form:305 +msgid "dpi" +msgstr "" + +#: FPreview.form:328 +msgid "Range" +msgstr "Bereik" + +#: FPreview.form:344 +msgid "Copies" +msgstr "Kopieën" + +#: FPreview.form:366 +msgid "Orientation" +msgstr "Oriëntatie" + +#: FPreview.form:373 +msgid "Portrait" +msgstr "Portret" + +#: FPreview.form:373 +msgid "Landscape" +msgstr "Landschap" + +#: FPreview.form:383 +msgid "Paper" +msgstr "Papier" + +#: FPreview.form:390 +msgid "Custom" +msgstr "Aangepast" + +# gb-ignore +#: FPreview.form:390 +msgid "A3" +msgstr "" + +# gb-ignore +#: FPreview.form:390 +msgid "A4" +msgstr "" + +# gb-ignore +#: FPreview.form:390 +msgid "A5" +msgstr "" + +# gb-ignore +#: FPreview.form:390 +msgid "B5" +msgstr "" + +# gb-ignore +#: FPreview.form:390 +msgid "Letter" +msgstr "" + +# gb-ignore +#: FPreview.form:390 +msgid "Executive" +msgstr "" + +# gb-ignore +#: FPreview.form:390 +msgid "Legal" +msgstr "" + +#: FPreview.form:405 +msgid "Width" +msgstr "Breedte" + +# gb-ignore +#: FPreview.form:416 +msgid "mm" +msgstr "" + +#: FPreview.form:426 +msgid "Height" +msgstr "Hoogte" + +#: FPreview.form:449 +msgid "Grayscale" +msgstr "Grijswaarden" + +#: FPreview.form:455 +msgid "Full page" +msgstr "Volledige pagina" + +#: FPreview.form:460 +msgid "Collate copies" +msgstr "Sorteer kopieën" + +#: FPreview.form:465 +msgid "Reverse order" +msgstr "Omgekeerde volgorde" + +#: FPreview.class:265 +msgid "PDF files" +msgstr "PDF bestanden" + +#: FPreview.class:265 +msgid "Postscript files" +msgstr "Postscript bestanden" + +#: FPreview.class:280 +msgid "Cancel" +msgstr "Annuleer" + +#: FPreview.class:364 +msgid "This file already exists.\nDo you want to replace it?" +msgstr "Dit bestand bestaat reeds.\nWil je het vervangen?" + +#: FPreview.class:364 +msgid "Replace" +msgstr "Vervangen" + +# gb-ignore +#: FPreview.class:389 +msgid "Layout..." +msgstr "" + +#: FPreview.class:401 +msgid "Printing..." +msgstr "Afdrukken..." + diff --git a/comp/src/gb.form.print/.lang/pt_BR.po b/comp/src/gb.form.print/.lang/pt_BR.po new file mode 100644 index 00000000..f058235a --- /dev/null +++ b/comp/src/gb.form.print/.lang/pt_BR.po @@ -0,0 +1,174 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.form.print 3.14.90\n" +"PO-Revision-Date: 2020-06-12 05:29 UTC\n" +"Last-Translator: Gen Braga \n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Generic preview and print form" +msgstr "Formulário genérico de visualização e impressão" + +#: FPreview.class:305 +msgid "PDF files" +msgstr "Arquivos PDF" + +#: FPreview.class:305 +msgid "Postscript files" +msgstr "Arquivos postscript" + +#: FPreview.class:365 FPrinting.form:30 +msgid "Cancel" +msgstr "Cancelar" + +#: FPreview.class:365 +msgid "Replace" +msgstr "Substituir" + +#: FPreview.class:365 +msgid "This file already exists.\nDo you want to replace it?" +msgstr "Este arquivo já existe. Sobrescrever?" + +#: FPreview.form:79 +msgid "Print preview" +msgstr "Visualizar Impressão" + +#: FPreview.form:87 +msgid "Print to file" +msgstr "Imprimir para arquivo" + +#: FPreview.form:106 +msgid "Toggle option panel" +msgstr "Alternar painel de opções" + +#: FPreview.form:118 +msgid "Print" +msgstr "Imprimir" + +#: FPreview.form:132 +msgid "Zoom out" +msgstr "Menos zoom" + +# gb-ignore +#: FPreview.form:138 +msgid "100 %" +msgstr "" + +#: FPreview.form:144 +msgid "Zoom in" +msgstr "Mais zoom" + +#: FPreview.form:152 +msgid "One page" +msgstr "Uma página" + +#: FPreview.form:160 +msgid "Two pages" +msgstr "Duas páginas" + +#: FPreview.form:168 +msgid "Full width" +msgstr "Largura total" + +#: FPreview.form:176 +msgid "Real size" +msgstr "Tamanho real" + +#: FPreview.form:208 +msgid "Resolution" +msgstr "Resolução" + +# gb-ignore +#: FPreview.form:220 +msgid "DPI" +msgstr "" + +#: FPreview.form:230 +msgid "Two-sided" +msgstr "Dois lados" + +#: FPreview.form:237 +msgid "Long side" +msgstr "Lado longo" + +#: FPreview.form:237 +msgid "None" +msgstr "Nenhum" + +#: FPreview.form:237 +msgid "Short side" +msgstr "Lado curto" + +#: FPreview.form:247 +msgid "Copies" +msgstr "Cópias" + +#: FPreview.form:263 +msgid "Orientation" +msgstr "Orientação" + +#: FPreview.form:270 +msgid "Landscape" +msgstr "Paisagem" + +#: FPreview.form:270 +msgid "Portrait" +msgstr "Retrato" + +#: FPreview.form:280 +msgid "Paper" +msgstr "Papel" + +#: FPreview.form:301 +msgid "Width" +msgstr "Largura" + +# gb-ignore +#: FPreview.form:311 +msgid "mm" +msgstr "" + +#: FPreview.form:321 +msgid "Height" +msgstr "Altura" + +#: FPreview.form:338 +msgid "Grayscale" +msgstr "Escala de cinza" + +#: FPreview.form:343 +msgid "Collate copies" +msgstr "Agrupar cópias" + +#: FPreview.form:348 +msgid "Reverse order" +msgstr "Ordem inversa" + +#: FPreview.form:356 +msgid "Margins" +msgstr "Margens" + +#: FPreview.form:365 +msgid "Left" +msgstr "Esquerda" + +#: FPreview.form:386 +msgid "Right" +msgstr "Direita" + +#: FPreview.form:407 +msgid "Top" +msgstr "Topo" + +#: FPreview.form:428 +msgid "Bottom" +msgstr "Inferior" + +#: FPrinting.form:11 +msgid "Printing" +msgstr "Imprimindo" + diff --git a/comp/src/gb.form.print/.lang/ru.po b/comp/src/gb.form.print/.lang/ru.po new file mode 100644 index 00000000..7d83ed19 --- /dev/null +++ b/comp/src/gb.form.print/.lang/ru.po @@ -0,0 +1,190 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-07-16 08:59+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: comp/src/gb.form.print/.project:17 +msgid "Generic preview and print form" +msgstr "Общий предпросмотр и форма печати" + +#: comp/src/gb.form.print/.src/FPreview.class:298 +msgid "PDF files" +msgstr "Файлы PDF" + +#: comp/src/gb.form.print/.src/FPreview.class:298 +msgid "Postscript files" +msgstr "Файлы Postscript" + +#: comp/src/gb.form.print/.src/FPreview.class:358 +msgid "" +"This file already exists.\n" +"Do you want to replace it?" +msgstr "" +"Этот файл уже существует.\n" +"Вы хотите заменить его?" + +#: comp/src/gb.form.print/.src/FPreview.class:358 +msgid "Replace" +msgstr "Заменить" + +#: comp/src/gb.form.print/.src/FPreview.class:358 comp/src/gb.form.print/.src/FPrinting.form:20 +msgid "Cancel" +msgstr "Отмена" + +#: comp/src/gb.form.print/.src/FPreview.form:5 +msgid "Print preview" +msgstr "Предпросмотр печати" + +#: comp/src/gb.form.print/.src/FPreview.form:11 +msgid "Print to file" +msgstr "Печать в файл" + +#: comp/src/gb.form.print/.src/FPreview.form:20 +msgid "Toggle option panel" +msgstr "Переключить панель опций" + +#: comp/src/gb.form.print/.src/FPreview.form:33 +msgid "One page" +msgstr "Одна страница" + +#: comp/src/gb.form.print/.src/FPreview.form:40 +msgid "Two pages" +msgstr "Две страницы" + +#: comp/src/gb.form.print/.src/FPreview.form:47 +msgid "Full width" +msgstr "Полная ширина" + +#: comp/src/gb.form.print/.src/FPreview.form:54 +msgid "Real size" +msgstr "Реальный размер" + +#: comp/src/gb.form.print/.src/FPreview.form:65 comp/src/gb.form.print/.src/FPreview.form:318 +msgid "Print" +msgstr "Печать" + +#: comp/src/gb.form.print/.src/FPreview.form:76 +msgid "Zoom out" +msgstr "Уменьшить" + +#: comp/src/gb.form.print/.src/FPreview.form:82 +msgid "100 %" +msgstr "100%" + +#: comp/src/gb.form.print/.src/FPreview.form:87 +msgid "Zoom in" +msgstr "Увеличить" + +#: comp/src/gb.form.print/.src/FPreview.form:112 +msgid "Resolution" +msgstr "Разрешение" + +#: comp/src/gb.form.print/.src/FPreview.form:123 +msgid "DPI" +msgstr "DPI" + +#: comp/src/gb.form.print/.src/FPreview.form:131 +msgid "Two-sided" +msgstr "Двусторонний" + +#: comp/src/gb.form.print/.src/FPreview.form:137 +msgid "None" +msgstr "Нет" + +#: comp/src/gb.form.print/.src/FPreview.form:137 +msgid "Short side" +msgstr "Короткая сторона" + +#: comp/src/gb.form.print/.src/FPreview.form:137 +msgid "Long side" +msgstr "Длинная сторона" + +#: comp/src/gb.form.print/.src/FPreview.form:145 +msgid "Copies" +msgstr "Копии" + +#: comp/src/gb.form.print/.src/FPreview.form:158 +msgid "Orientation" +msgstr "Ориентация" + +#: comp/src/gb.form.print/.src/FPreview.form:164 +msgid "Portrait" +msgstr "Книжная" + +#: comp/src/gb.form.print/.src/FPreview.form:164 +msgid "Landscape" +msgstr "Альбомная" + +#: comp/src/gb.form.print/.src/FPreview.form:172 +msgid "Paper" +msgstr "Бумага" + +#: comp/src/gb.form.print/.src/FPreview.form:190 +msgid "Width" +msgstr "Ширина" + +#: comp/src/gb.form.print/.src/FPreview.form:198 comp/src/gb.form.print/.src/FPreview.form:214 comp/src/gb.form.print/.src/FPreview.form:251 comp/src/gb.form.print/.src/FPreview.form:268 comp/src/gb.form.print/.src/FPreview.form:285 comp/src/gb.form.print/.src/FPreview.form:302 +msgid "mm" +msgstr "мм" + +#: comp/src/gb.form.print/.src/FPreview.form:206 +msgid "Height" +msgstr "Высота" + +#: comp/src/gb.form.print/.src/FPreview.form:220 +msgid "Grayscale" +msgstr "Оттенки серого" + +#: comp/src/gb.form.print/.src/FPreview.form:224 +msgid "Collate copies" +msgstr "Собрать по копиям" + +#: comp/src/gb.form.print/.src/FPreview.form:228 +msgid "Reverse order" +msgstr "Обратный порядок" + +#: comp/src/gb.form.print/.src/FPreview.form:235 +msgid "Margins" +msgstr "Поля" + +#: comp/src/gb.form.print/.src/FPreview.form:242 +msgid "Left" +msgstr "Слева" + +#: comp/src/gb.form.print/.src/FPreview.form:259 +msgid "Right" +msgstr "Справа" + +#: comp/src/gb.form.print/.src/FPreview.form:276 +msgid "Top" +msgstr "Сверху" + +#: comp/src/gb.form.print/.src/FPreview.form:293 +msgid "Bottom" +msgstr "Низ" + +#: comp/src/gb.form.print/.src/FPrinting.form:5 +msgid "Printing" +msgstr "Печать" + diff --git a/comp/src/gb.form.print/.project b/comp/src/gb.form.print/.project new file mode 100644 index 00000000..b04edd4b --- /dev/null +++ b/comp/src/gb.form.print/.project @@ -0,0 +1,17 @@ +# Gambas Project File 3.0 +Title=Generic preview and print form +Startup=MTest +Icon=.hidden/printer.png +Version=3.14.90 +VersionFile=1 +Component=gb.image +Component=gb.gui +Component=gb.form +Component=gb.settings +Authors="Benoît Minisini" +Environment="GB_GUI=gb.qt5" +TabSize=2 +Translate=1 +Language=en_US +Type=Component +Packager=1 diff --git a/comp/src/gb.form.print/.src/FPreview.class b/comp/src/gb.form.print/.src/FPreview.class new file mode 100644 index 00000000..ad0a2e84 --- /dev/null +++ b/comp/src/gb.form.print/.src/FPreview.class @@ -0,0 +1,694 @@ +' Gambas class file + +Private Const SCALE As Float = 0.1 ' 0.1 mm + +Private $bPrintToFile As Boolean +Private $aModeButtons As New ToolButton[] +Private $hPrinter As Printer 'As "Printer" +Private $bVerif As Boolean +Private $bPrinting As Boolean +Private $iFileRes As Integer = 150 +Private $hObs As Observer + +Private $iScaleMode As Integer + +Private Enum MODE_CUSTOM, MODE_PAGE, MODE_DUAL_PAGE, MODE_FULL_WIDTH, MODE_REAL_SIZE + +Private $hTimerPaginate As Timer + +Private $bPaginate As Boolean +Private $hTimerPaginateLater As Timer + +Public Sub Run(hPrinter As Printer) As Boolean + + $hPrinter = hPrinter + $hObs = New Observer($hPrinter) As "Printer" + + Return Not Me.ShowModal() + +End + +Public Sub _new() + + $hTimerPaginate = New Timer As "TimerPaginate" + $hTimerPaginateLater = New Timer As "TimerPaginateLater" + $hTimerPaginateLater.Delay = 100 + +End + +Public Sub Form_Open() + + 'Dim hButton As ToolButton + + Dim s As String + Dim hMenu As Menu + + SetPicture(btnOnePage, "img/print-one-page.png") + SetPicture(btnTwoPages, "img/print-two-pages.png") + SetPicture(btnFullWidth, "img/print-full-width.png") + 'SetPicture(btnRealSize, "img/print-real-size.png") + + For Each s In Printer.List + hMenu = New Menu(mnuPrint) As "mnuPrintPrinter" + hMenu.Tag = s + hMenu.Text = s + Next + + $aModeButtons = [btnOnePage, btnTwoPages, btnFullWidth, btnRealSize] + + If Component.IsLoaded("gb.settings") Then + + Settings.Read(Me, "/Printing/Window") + Settings.Read(dvwPrint, "Printing/Preview") + txtFile.Text = Settings["/Printing/OutputFile"] + ' 'Settings.Read(Me, "FPreview") + ' Settings.Read(dvwPrint, "View") + ' + ' If dvwPrint.ScaleMode = dvwPrint.Custom Then + ' sldZoom.Value = dvwPrint.Zoom + ' Else + ' For Each hButton In $aModeButtons + ' hButton.Value = False + ' Next + ' $aModeButtons[dvwPrint.ScaleMode - 1].Value = True + ' + ' Endif + ' + ' txtFile.Text = Settings["FPreview/OutputFile", User.Home &/ "report.pdf"] + ' $hPrinter.OutputFile = txtFile.Text + ' $hPrinter.Name = Settings["FPreview/Printer"] + ' If Settings["FPreview/PrintToFile"] = True Then + ' tabPrint.Index = 1 + ' Endif + ' + ' Try $hPrinter.Duplex = Settings["FPreview/Duplex"] + ' Try $hPrinter.GrayScale = Settings["FPreview/GrayScale"] + ' Try $hPrinter.ReverseOrder = Settings["FPreview/ReverseOrder"] + ' Try $hPrinter.CollateCopies = Settings["FPreview/CollateCopies"] + ' Try $iFileRes = Settings["FPreview/FileResolution", 150] + ' Try $hPrinter.Duplex = Settings["FPreview/Duplex", Printer.Simplex] = cmbDuplex.Index + Endif + + SelectPrinter($hPrinter.Name) + $bPrinting = False + + cmbPaper.Text = "A4" + SetZoom(MODE_PAGE) + + Paginate + + dvwPrint.SetFocus + +End + +Private Sub SelectPrinter(Optional sName As String) + + Dim hMenu As Menu + + If sName Then + $hPrinter.Name = sName + $hPrinter.OutputFile = "" + $hPrinter.Resolution = 1200 + $bPrintToFile = False + Else + If Not txtFile.Text Then txtFile.Text = User.Home &/ "print.pdf" + $hPrinter.OutputFile = txtFile.Text + $hPrinter.Resolution = $iFileRes + $bPrintToFile = True + Endif + + mnuPrintToFile.Checked = $bPrintToFile + For Each hMenu In mnuPrint.Children + If Not hMenu.Tag Then Continue + If $bPrintToFile Then + hMenu.Checked = False + Else + hMenu.Checked = hMenu.Text = sName + Endif + Next + + $hPrinter.FullPage = True + $hPrinter.Duplex = cmbDuplex.Index + + chkGrayScale.Value = $hPrinter.GrayScale + 'chkFullPage.Value = $hPrinter.FullPage + chkReverseCopies.Value = $hPrinter.ReverseOrder + chkCollateCopies.Value = $hPrinter.CollateCopies + + 'txtFile.Text = User.Home &/ "print.pdf" + + With $hPrinter + txtMarginLeft.Value = .MarginLeft + txtMarginRight.Value = .MarginRight + txtMarginTop.Value = .MarginTop + txtMarginBottom.Value = .MarginBottom + End With + + If $bPrintToFile Then + Object.Lock(cmbResolution) + Try cmbResolution.Index = Max(cmbResolution.Find(Str($iFileRes)), 0) + Object.Unlock(cmbResolution) + txtFile.Show + panResolution.Show + panRectoVerso.Hide + btnPrinter.Picture = Picture["icon:/small/pdf"] + btnPrinter.Text = mnuPrintToFile.Text + Else + txtFile.Hide + panResolution.Hide + panRectoVerso.Show + btnPrinter.Picture = Picture["icon:/small/print"] + btnPrinter.Text = sName + Endif + + RefreshPrintButton + +End + +' Public Sub SetReport(hReport As Report) +' +' View.Report = hReport +' GetValuesFromReport() +' +' End + +' Private Sub GetValuesFromReport() +' +' cmbPaper.Index = View.Report.Paper +' $hPrinter.Orientation = View.Report.Orientation +' +' If View.Report.Paper = Printer.Custom Then +' pnlCustom.Enabled = True +' $hPrinter.PaperWidth = TSizeParse[View.Report.Width].ToInch() * 10 +' $hPrinter.PaperHeight = TSizeParse[View.Report.Height].ToInch() * 10 +' Else +' $hPrinter.Paper = View.Report.Paper +' Endif +' +' cmbOrientation.Index = $hPrinter.Orientation +' cmbDuplex.Index = $hPrinter.Duplex +' cmbPaper.Index = $hPrinter.Paper +' View.Refresh +' +' Object.Lock(spWidth) +' spWidth.Value = $hPrinter.PaperWidth +' Object.Unlock(spWidth) +' Object.Lock(spHeight) +' spHeight.Value = $hPrinter.PaperHeight +' Object.Unlock(spHeight) +' +' End + + +' Public Sub dvwPrint_Zoom() +' +' Object.Lock(sldZoom) +' sldZoom.Value = dvwPrint.Zoom * 100 +' SetScaleMode(MODE_CUSTOM) +' Object.Unlock(sldZoom) +' +' End + +Public Sub btnMode_Click() + + If Last.Value Then SetZoom(Last.Tag) + +End + +Public Sub chkGrayScale_Click() + + 'Last.Background = IIf(Last.Value, Color.Gray, Color.Default) + $hPrinter.GrayScale = Last.Value + dvwPrint.Desaturate = $hPrinter.GrayScale + 'dvwPrint._GrayScale = Last.Value + +End + +' Public Sub chkFullPage_Click() +' +' 'Last.Background = IIf(Last.Value, Color.Gray, Color.Default) +' $hPrinter.FullPage = Last.Value +' +' End + +Public Sub chkReverseCopies_Click() + + 'Last.Background = IIf(Last.Value, Color.Gray, Color.Default) + $hPrinter.ReverseOrder = Last.value + +End + +Public Sub chkCollateCopies_Click() + + 'Last.Background = IIf(Last.Value, Color.Gray, Color.Default) + $hPrinter.CollateCopies = Last.Value + +End + +Public Sub cmbOrientation_Click() + + Select Last.Index + Case 0 + $hPrinter.Orientation = Printer.Portrait + Case 1 + $hPrinter.Orientation = Printer.Landscape + End Select + + txtWidth.Value = $hPrinter.PaperWidth + txtHeight.Value = $hPrinter.PaperHeight + + Paginate + +End + +Public Sub cmbPaper_Click() + + Dim iPage As Integer + + Select Case Last.Text + Case "Custom" + iPage = Printer.Custom + Case "A3" + iPage = Printer.A3 + Case "A4" + iPage = Printer.A4 + Case "A5" + iPage = Printer.A5 + Case "B5" + iPage = Printer.B5 + Case "Letter" + iPage = Printer.Letter + Case "Legal" + iPage = Printer.Legal + Case "Executive" + iPage = Printer.Executive + End Select + + $hPrinter.Paper = iPage + txtWidth.Value = $hPrinter.PaperWidth + txtHeight.Value = $hPrinter.PaperHeight + pnlCustom.Enabled = iPage = Printer.Custom + + Paginate + +End + +Public Sub cmbDuplex_Click() + + $hPrinter.Duplex = Last.index + +End + +Public Sub txtFile_Click() + + Dialog.Path = txtFile.Text + Dialog.Filter = ["*.pdf", ("PDF files"), "*.ps", ("Postscript files")] + + If Dialog.SaveFile() Then Return + + txtFile.Text = Dialog.Path + $bVerif = True + $hPrinter.OutputFile = Dialog.Path + +End + +Private Sub RefreshPrintButton() + + btnPrint.Picture = Picture[If($bPrintToFile, "icon:/small/pdf", "icon:/small/printer")] + btnPrint2.Picture = btnPrint.Picture + +End + +' Public Sub txtRange_Change() +' +' SetRange(txtRange.Text) +' +' End +' +' Public Sub txtRange_Click() +' +' Last.Text = "" +' 'TextBox1_Change +' +' End + +Public Sub txtWidth_Change() + + $hPrinter.PaperWidth = Last.Value + Paginate + +End + +Public Sub txtHeight_Change() + + $hPrinter.PaperHeight = Last.Value + Paginate + +End + +Public Sub cmbPrinter_Click() + + SelectPrinter(Last.Text) + +End + +Public Sub btnPrint_Click() + + Dim iReturn As Integer + + If $bPrintToFile Then + + If Not $hPrinter.OutputFile Then txtFile_Click + If Not $hPrinter.OutputFile Then Return + + If Exist($hPrinter.OutputFile) And Not $bVerif Then + iReturn = Message.Warning("" & $hPrinter.OutputFile & "\n\n" & ("This file already exists.\nDo you want to replace it?"), ("Replace"), ("Cancel")) + If iReturn = 2 Then Return + Try Kill $hPrinter.OutputFile + $bVerif = False + Endif + + Endif + + $bPrinting = True + RefreshPrintButton + + $hPrinter.Print + +End + +Private Sub BeginPaint(fZoom As Float, Optional hDevice As Object) + + 'Debug "fZoom = "; fZoom + If Not hDevice Then hDevice = Paint.Device + Paint.Begin(hDevice, RectF(0, 0, ($hPrinter.PaperWidth - txtMarginLeft.Value - txtMarginRight.Value) / SCALE, ($hPrinter.PaperHeight - txtMarginTop.Value - txtMarginBottom.Value) / SCALE)) + Paint.Scale(fZoom) + Paint.Translate(txtMarginLeft.Value * 10, txtMarginTop.Value * 10) + +End + + +Public Sub Printer_Begin() + + If $bPrinting Then + Me.Enabled = False + FPrinting.Show() + BeginPaint(Paint.W / $hPrinter.PaperWidth * SCALE) + Paint.FontScale = 25.4 / 72 / SCALE * 72 / 96 * 96 / $hPrinter.Resolution + Endif + +End + + +' Public Sub Printer_Paginate() +' +' If dvwPrint.Report._LayoutNotFinished Then +' dvwPrint.LockLayout +' dvwPrint.Report.Layout(dvwPrint.Report.PageCount) +' Else +' $hPrinter.Count = dvwPrint.PageCount +' ProgressBar1.Pulse = False +' lblPrint.Text = ("Printing...") +' dvwPrint.UnlockLayout +' Endif +' +' End + +Public Sub Printer_Draw() + + If Not $bPrinting Then Return + + Paint.FontScale = 25.4 / 72 / SCALE * 72 / 96 * 96 / $hPrinter.Resolution + FPrinting.SetProgress($hPrinter.Page / dvwPrint.Count) + +End + +Public Sub Printer_End() + + If Not $bPrinting Then Return + + Paint.End + FPrinting.Close + $bPrinting = False + RefreshPrintButton + Me.Enabled = True + +End + +Public Sub txtCopies_Change() + + $hPrinter.NumCopies = Last.Value + +End + +Public Sub Form_Close() + + If Component.IsLoaded("gb.settings") Then + Settings.Write(Me, "/Printing/Window") + Settings.Write(dvwPrint, "Printing/Preview") + Settings["/Printing/OutputFile"] = txtFile.Text + + ' ' 'Settings.Write(Me, "FPreview") + ' ' Settings.Write(dvwPrint, "View") + ' ' Settings["FPreview/OutputFile"] = txtFile.Text + ' ' Settings["FPreview/Printer"] = $hPrinter.Name + ' ' Settings["FPreview/PrintToFile"] = tabPrint.Index = 1 + ' ' Settings["FPreview/Duplex"] = cmbDuplex.Index + ' ' Settings["FPreview/GrayScale"] = tgbGrayScale.Value + ' ' Settings["FPreview/ReverseOrder"] = tgbReverseCopies.Value + ' ' Settings["FPreview/CollateCopies"] = tgbCollateCopies.Value + ' ' Settings["FPreview/FileResolution"] = $iFileRes + ' ' Settings.Save() + Endif + +End + +Private Sub SetPicture(hCtrl As ToolButton, sImage As String) + + Dim S As Integer + + S = Stock.GetSize("small") + hCtrl.Picture = Image.Load(sImage).Stretch(S, S).Picture + +End + +Public Sub btnZoomIn_Click() + + SetZoom(MODE_CUSTOM, 2 ^ (Int(Log2(dvwPrint.Zoom) * 2 + 1) / 2)) + +End + +Public Sub btnZoomOut_Click() + + SetZoom(MODE_CUSTOM, 2 ^ (Int(Log2(dvwPrint.Zoom) * 2 - 1) / 2)) + +End + +Public Sub btnShowSide_Click() + + If panSide.Visible Then + panSide.Hide + btnShowSide.Picture = Picture["icon:/small/options"] + btnPrint.Show + Else + panSide.Show + btnShowSide.Picture = Picture["icon:/small/close"] + btnPrint.Hide + Endif + + dvwPrint_Arrange + +End + +Public Sub mnuPrintToFile_Click() + + SelectPrinter() + If Not panSide.Visible Then txtFile_Click + +End + +Public Sub mnuPrintPrinter_Click() + + SelectPrinter(Last.Text) + +End + +Public Sub cmbResolution_Click() + + If $bPrintToFile Then + $iFileRes = cmbResolution.Text + $hPrinter.Resolution = $iFileRes + Else + $hPrinter.Resolution = 1200 + Endif + +End + +Private Sub SetZoom(iMode As Integer, Optional fZoom As Float) + + Dim hButton As ToolButton + + $iScaleMode = iMode + + dvwPrint.AutoCenter = False + + For Each hButton In $aModeButtons + Object.Lock(hButton) + hButton.Value = hButton.Tag = $iScaleMode + Object.Unlock(hButton) + Next + + Select Case $iScaleMode + Case MODE_CUSTOM + dvwPrint.Column = 0 + dvwPrint.Arrangement = Arrange.Row + If fZoom Then dvwPrint.Zoom = fZoom + Case MODE_PAGE + dvwPrint.AutoCenter = True + dvwPrint.Column = 0 + dvwPrint.Arrangement = Arrange.Fill + Case MODE_DUAL_PAGE + dvwPrint.AutoCenter = True + dvwPrint.Column = 2 + dvwPrint.Arrangement = Arrange.Row + Case MODE_FULL_WIDTH + dvwPrint.Column = 0 + dvwPrint.Arrangement = Arrange.Vertical + Case MODE_REAL_SIZE + dvwPrint.Column = 0 + dvwPrint.Arrangement = Arrange.Row + dvwPrint.Zoom = 1 + End Select + +End + +Public Sub dvwPrint_Draw(Page As Integer, (Width) As Integer, (Height) As Integer) + + If $bPaginate Then Return + + 'Paint.FontScale = dvwPrint.Zoom '* $hPrinter.Resolution / Paint.ResolutionY + 'Paint.Font.Size *= dvwPrint.Zoom + BeginPaint(Paint.W / $hPrinter.PaperWidth * SCALE) + ' printer : Paint.FontScale = 25.4 / 72 / SCALE * 72 / 96 * 96 / $hPrinter.Resolution + Paint.FontScale = 25.4 / 72 / SCALE * 72 / 96 + + ' => Paint.FontScale = 25.4 * Paint.W / $hPrinter.PaperWidth / $hPrinter.Resolution (or 96 for screen) + ' => Paint.FontScale = Paint.W / ($hPrinter.Resolution * $hPrinter.PaperWidth / 25.4) (or 96 for screen) + + $hPrinter._SetPage(Page + 1) + Object.Raise($hPrinter, "Draw") + Paint.End + +End + +Private Sub EndPaginate() + + Object.Raise($hPrinter, "End") + Paint.End + + dvwPrint.Count = $hPrinter.Count + dvwPrint.Reset + + $bPaginate = False + +End + + +Private Sub Paginate() + + Dim hImage As Image + + $hTimerPaginateLater.Stop + + If $bPaginate Then EndPaginate + + $bPaginate = True + + dvwPrint.DocWidth = $hPrinter.PaperWidth / 25.4 * Desktop.Resolution + dvwPrint.DocHeight = $hPrinter.PaperHeight / 25.4 * Desktop.Resolution + + ' Debug dvwPrint.DocWidth;; dvwPrint.DocHeight + + hImage = New Image(16, 16) + 'BeginPaint(dvwPrint.DocWidth / $hPrinter.PaperWidth * SCALE, hImage) + BeginPaint(dvwPrint.DocWidth / $hPrinter.PaperWidth * SCALE, hImage) + Paint.FontScale = 25.4 / 72 / SCALE * 72 / 96 + Object.Raise($hPrinter, "Begin") + + If $hPrinter._IsCountSet() Then + EndPaginate + Else + $hTimerPaginate.Trigger + Endif + +End + +Public Sub TimerPaginate_Timer() + + Object.Raise($hPrinter, "Paginate") + If $hPrinter._IsCountSet() Then + EndPaginate + Else + $hTimerPaginate.Trigger + Endif + +End + +Public Sub dvwPrint_Arrange() + + panZoom.Move(dvwPrint.X + (dvwPrint.W - panZoom.W) \ 2, 0) + SetZoom($iScaleMode) + +End + +Public Sub TimerPaginateLater_Timer() + + Paginate + +End + + +Public Sub txtMargin_Change() + + $hTimerPaginateLater.Restart + +End + +Public Sub btnClose_Click() + + Me.Close + +End + +' Public Sub dvwPrint_Zoom() +' +' lblZoom.Text = Format(dvwPrint.Zoom, "0 %") +' SetZoom(MODE_CUSTOM) +' +' End + +Public Sub Cancel() + + $hPrinter.Cancel + +End + +' Public Sub panSide_Arrange() +' +' btnCloseSide.Move(panSide.W - Desktop.Scale * 4, 0, Desktop.Scale * 4, Desktop.Scale * 4) +' +' End + +Public Sub btnPrinter_Click() + + btnPrint_Click + +End + + +Public Sub dvwPrint_Zoom() + + lblZoom.Text = " " & Format(dvwPrint.Zoom, "0 %") & " " + btnRealSize.Value = Round(dvwPrint.Zoom, -4) = 1 + +End diff --git a/comp/src/gb.form.print/.src/FPreview.form b/comp/src/gb.form.print/.src/FPreview.form new file mode 100644 index 00000000..bbeb98f2 --- /dev/null +++ b/comp/src/gb.form.print/.src/FPreview.form @@ -0,0 +1,331 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,123,101) + Text = ("Print preview") + Icon = Picture["icon:/small/preview"] + Arrangement = Arrange.Vertical + { mnuPrint Menu + Visible = False + { mnuPrintToFile Menu + Text = ("Print to file") & "..." + } + { Menu1 Menu + } + } + { panPreview HBox + MoveScaled(1,1,120,4) + { btnPrinter MenuButton + MoveScaled(0,0,34,4) + Border = False + Menu = "mnuPrint" + MenuOnly = True + } + { btnShowSide ToolButton + MoveScaled(34,0,4,4) + ToolTip = ("Toggle option panel") + Picture = Picture["icon:/small/close"] + } + { Spring1 Spring + MoveScaled(57,0,3,4) + } + { btnPrint ToolButton + MoveScaled(104,0,12,4) + Visible = False + AutoResize = True + Text = ("Print") + Picture = Picture["icon:/small/print"] + } + { panZoom HBox + MoveScaled(62,0,38,4) + Ignore = True + { Spring2 Spring + MoveScaled(0,0,2,4) + } + { btnZoomOut ToolButton + MoveScaled(2,0,4,4) + ToolTip = ("Zoom out") + Picture = Picture["icon:/small/zoom-out"] + } + { lblZoom Label + MoveScaled(6,0,7,4) + Text = ("100 %") + Alignment = Align.Center + } + { btnZoomIn ToolButton + MoveScaled(13,0,4,4) + ToolTip = ("Zoom in") + Picture = Picture["icon:/small/zoom-in"] + } + { btnOnePage ToolButton btnMode + Name = "btnOnePage" + MoveScaled(17,0,4,4) + Tag = "1" + ToolTip = ("One page") + Toggle = True + } + { btnTwoPages ToolButton btnMode + Name = "btnTwoPages" + MoveScaled(21,0,4,4) + Tag = "2" + ToolTip = ("Two pages") + Toggle = True + } + { btnFullWidth ToolButton btnMode + Name = "btnFullWidth" + MoveScaled(25,0,4,4) + Tag = "3" + ToolTip = ("Full width") + Toggle = True + } + { btnRealSize ToolButton btnMode + Name = "btnRealSize" + MoveScaled(29,0,4,4) + Tag = "4" + ToolTip = ("Real size") + Picture = Picture["icon:/small/zoom-normal"] + Toggle = True + } + { Spring3 Spring + MoveScaled(35,1,2,2) + } + } + } + { Panel1 HBox + MoveScaled(1,7,84,88) + Expand = True + { panSide VBox + MoveScaled(0,0,38,86) + Spacing = True + Margin = True + { txtFile ButtonBox + MoveScaled(1,1,29,4) + Picture = Picture["icon:/16/open"] + ReadOnly = True + } + { panResolution HBox + MoveScaled(1,6,35,4) + Spacing = True + { TextLabel1 TextLabel + MoveScaled(1,1,18,3) + Text = ("Resolution") + Alignment = Align.Normal + } + { cmbResolution ComboBox + MoveScaled(20,0,9,4) + #Translate = False + ReadOnly = True + List = ["75", "150", "300", "600", "1200"] + } + { Label11 Label + MoveScaled(30,0,4,4) + Text = ("DPI") + } + } + { panRectoVerso HBox + MoveScaled(1,11,38,4) + Spacing = True + { Label2 Label + MoveScaled(0,0,18,4) + Text = ("Two-sided") + } + { cmbDuplex ComboBox + MoveScaled(18,0,18,4) + Expand = True + ReadOnly = True + List = [("None"), ("Short side"), ("Long side")] + } + } + { HBox1 HBox + MoveScaled(2,16,34,4) + Spacing = True + { Label4 Label + MoveScaled(0,0,18,4) + Text = ("Copies") + } + { txtCopies SpinBox + MoveScaled(13,0,9,4) + MinValue = 1 + Value = 1 + } + } + { Panel14 HBox + MoveScaled(2,21,36,4) + Spacing = True + { Label10 Label + MoveScaled(0,0,18,4) + Text = ("Orientation") + } + { cmbOrientation ComboBox + MoveScaled(19,0,15,4) + Expand = True + ReadOnly = True + List = [("Portrait"), ("Landscape")] + } + } + { Panel8 HBox + MoveScaled(2,26,36,4) + Spacing = True + { Label3 Label + MoveScaled(0,0,18,4) + Text = ("Paper") + } + { cmbPaper ComboBox + MoveScaled(19,0,15,4) + #Translate = False + Expand = True + ReadOnly = True + List = ["Custom", "A3", "A4", "A5", "B5", "Letter", "Executive", "Legal"] + } + } + { pnlCustom VBox + MoveScaled(2,31,36,9) + Spacing = True + { Panel3 HBox + MoveScaled(1,0,32,4) + Spacing = True + { Label5 Label + MoveScaled(0,0,18,4) + Text = ("Width") + } + { txtWidth SpinBox + MoveScaled(14,0,9,4) + MaxValue = 1000 + } + { Label7 Label + MoveScaled(27,0,4,4) + Text = ("mm") + } + } + { Panel17 HBox + MoveScaled(1,5,31,4) + Spacing = True + { Label6 Label + MoveScaled(0,0,18,4) + Text = ("Height") + } + { txtHeight SpinBox + MoveScaled(14,0,9,4) + MaxValue = 1000 + } + { Label8 Label + MoveScaled(27,0,4,4) + Text = ("mm") + } + } + } + { chkGrayScale CheckBox + MoveScaled(2,41,34,3) + Text = ("Grayscale") + } + { chkCollateCopies CheckBox + MoveScaled(2,44,35,3) + Text = ("Collate copies") + } + { chkReverseCopies CheckBox + MoveScaled(2,47,36,3) + Text = ("Reverse order") + } + { Expander1 Expander + MoveScaled(1,51,37,23) + Arrangement = Arrange.Vertical + Spacing = True + Border = False + Text = ("Margins") + TextFont = Font["Bold"] + { Panel2 HBox + MoveScaled(0,0,32,4) + Spacing = True + { Label1 Label + MoveScaled(0,0,16,4) + Text = ("Left") + } + { txtMarginLeft SpinBox txtMargin + Name = "txtMarginLeft" + MoveScaled(14,0,9,4) + MaxValue = 1000 + } + { Label9 Label + MoveScaled(27,0,4,4) + Text = ("mm") + } + } + { Panel4 HBox + MoveScaled(0,5,32,4) + Spacing = True + { Label12 Label + MoveScaled(0,0,16,4) + Text = ("Right") + } + { txtMarginRight SpinBox txtMargin + Name = "txtMarginRight" + MoveScaled(14,0,9,4) + MaxValue = 1000 + } + { Label13 Label + MoveScaled(27,0,4,4) + Text = ("mm") + } + } + { Panel5 HBox + MoveScaled(0,10,32,4) + Spacing = True + { Label14 Label + MoveScaled(0,0,16,4) + Text = ("Top") + } + { txtMarginTop SpinBox txtMargin + Name = "txtMarginTop" + MoveScaled(14,0,9,4) + MaxValue = 1000 + } + { Label15 Label + MoveScaled(27,0,4,4) + Text = ("mm") + } + } + { Panel6 HBox + MoveScaled(0,15,32,4) + Spacing = True + { Label16 Label + MoveScaled(0,0,16,4) + Text = ("Bottom") + } + { txtMarginBottom SpinBox txtMargin + Name = "txtMarginBottom" + MoveScaled(14,0,9,4) + MaxValue = 1000 + } + { Label17 Label + MoveScaled(27,0,4,4) + Text = ("mm") + } + } + } + { Spring6 Spring + MoveScaled(17,75,1,3) + } + { HBox2 HBox + MoveScaled(3,80,30,4) + { Spring4 Spring + MoveScaled(2,1,3,2) + } + { btnPrint2 Button btnPrint + Name = "btnPrint2" + MoveScaled(7,0,12,4) + AutoResize = True + Text = ("Print") + Picture = Picture["icon:/small/print"] + } + { Spring5 Spring + MoveScaled(20,2,5,1) + } + } + } + { dvwPrint DocumentView + MoveScaled(43,10,40,43) + Expand = True + ShowPage = True + } + } +} diff --git a/comp/src/gb.form.print/.src/FPrinting.class b/comp/src/gb.form.print/.src/FPrinting.class new file mode 100644 index 00000000..1067e050 --- /dev/null +++ b/comp/src/gb.form.print/.src/FPrinting.class @@ -0,0 +1,13 @@ +' Gambas class file + +Public Sub SetProgress(fVal As Float) + + pgbPrinting.Value = fVal + +End + +Public Sub btnCancel_Click() + + FPrinting.Cancel() + +End diff --git a/comp/src/gb.form.print/.src/FPrinting.form b/comp/src/gb.form.print/.src/FPrinting.form new file mode 100644 index 00000000..a8db9c36 --- /dev/null +++ b/comp/src/gb.form.print/.src/FPrinting.form @@ -0,0 +1,24 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,56,13) + Text = ("Printing") & "..." + Resizable = False + Arrangement = Arrange.Vertical + Margin = True + { pgbPrinting ProgressBar + MoveScaled(1,1,53,3) + } + { Spring1 Spring + MoveScaled(27,5,2,2) + } + { Panel1 HBox + MoveScaled(11,8,42,4) + Invert = True + { btnCancel Button + MoveScaled(24,0,16,4) + Text = ("Cancel") + Picture = Picture["icon:/small/cancel"] + } + } +} diff --git a/comp/src/gb.form.print/.src/MTest.module b/comp/src/gb.form.print/.src/MTest.module new file mode 100644 index 00000000..66bebd9b --- /dev/null +++ b/comp/src/gb.form.print/.src/MTest.module @@ -0,0 +1,48 @@ +' Gambas module file + +Private $hPrinter As Printer + +Public Sub Main() + + $hPrinter = New Printer As "Printer" + + $hPrinter.MarginTop = 15 + $hPrinter.Preview() + +End + +Public Sub Printer_Begin() + + Debug + $hPrinter.Count = 3 + +End + +Public Sub Printer_Draw() + + Dim H As Float + + Debug $hPrinter.Page;; "/";; Paint.W;; Paint.H + + Paint.Font = Font["Liberation Sans,10"] + + Debug "Paint.Width = "; Paint.Width + Debug "Printer.Resolution = "; $hPrinter.Resolution + Debug "Paint.ResolutionX = "; Paint.ResolutionX + Debug "Paint.FontScale = "; Paint.FontScale + Debug "Paint.Font.Size = "; Paint.Font.Size + + H = Paint.TextSize(" ").H + Debug H;; Paint.TextHeight;; Paint.Font.H + Paint.Font = Font["Liberation Sans,10"] + Paint.DrawText(CStr($hPrinter.Page) & " WÊyg_", 0, 0, Paint.W, H, Align.Center) + Paint.LineWidth = 1 + Paint.Rectangle(0, 0, Paint.W, H) + Paint.Stroke + + Paint.DrawRichText(File.Load("molly-malone.txt"), 0, 100, Paint.W, Paint.H) + + 'Paint.DrawText("ABCD",10,) + +End + diff --git a/comp/src/gb.form.print/.src/Printer.class b/comp/src/gb.form.print/.src/Printer.class new file mode 100644 index 00000000..e374d6ee --- /dev/null +++ b/comp/src/gb.form.print/.src/Printer.class @@ -0,0 +1,31 @@ +' Gambas class file + +''' This class allows to print documents on printers, or save them in a file. + +Export + +'' Return or set the default top margin in millimeters. +Property MarginTop As Integer Use $iMarginTop +'' Return or set the default right margin in millimeters. +Property MarginRight As Integer Use $iMarginRight +'' Return or set the default bottom margin in millimeters. +Property MarginBottom As Integer Use $iMarginBottom +'' Return or set the default left margin in millimeters. +Property MarginLeft As Integer Use $iMarginLeft + +Public Sub _new() + + $iMarginTop = 10 + $iMarginRight = 10 + $iMarginBottom = 10 + $iMarginLeft = 10 + +End + +'' Open the print preview as a modal form. + +Public Sub Preview() + + FPreview.Run(Me) + +End diff --git a/comp/src/gb.form.print/img/print-full-width.png b/comp/src/gb.form.print/img/print-full-width.png new file mode 100644 index 0000000000000000000000000000000000000000..9a5eae7b6ffb2768c49e8ebd9a1a7b28e14b4e9b GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5C@31> z6XNP#;1e4g8y_E^l9G~;kdT;|2qf9=cz6O8u$2V)1v7|U7Qb>$Eo=7Q%R6tFhj#^Z9fSh&(_n$F+}5ha)JVz#zDpq zhno^yJ#MTTLJVvxmAV=>6?QPJYFMevyowgTe~DWM4fjUX}_ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.print/img/print-real-size.png b/comp/src/gb.form.print/img/print-real-size.png new file mode 100644 index 0000000000000000000000000000000000000000..60717f2cc072de626aaf88f9cb48862bfd3ddf9a GIT binary patch literal 568 zcmV-80>}M{P)b&{{H^Y&(C^# zdSzv0wzjrzZf>-+w03rO_4W1R>cbdwYAewY6YiVAIpn&CSiu&d#~HxnyKy z`1ts2Y;1gde8t7Z+uPe}YHEOhfOB(m!otGz^z^2trr+P+ot>SmtgO4cyOflahK7dN z*x1q0(bCe=>gwv8oScV;hx+>Zv$M18?CjUq*ZceX?d|RS{QPHUXMKHr=;-KZXlRy} zmS$#V#KgqR%*?~X!|Cbi$H&KOYir2J$iczEt*x#7{r$?y%DlY1-rnACZ*Ppw@4)~7 z00DGTPE!Ct=GbNc0087kL_t(I%e~Ua4#F@D08m;ILOR)d@4ffl8~*=uNGl-@xD^t^ zQfwcdA}g`Q@`bRQ#JhkP#4iAK9le~CmNy1~syp#=O{y7X3j!LBsaCDY=7Q%R6tFhj#^Z9fSh&%@KjF+}5ha)N}y0v0wd z9|0+i1vxxSTs{e>GG1_NXmU2N^h^<1$h4}DC!tY*aYaKHgUf-5j9LsKoMHkEtO64l fxfER67?~NQyfm6WC{FYOn#thl>gTe~DWM4fc5yR; literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.print/molly-malone.txt b/comp/src/gb.form.print/molly-malone.txt new file mode 100644 index 00000000..500189a3 --- /dev/null +++ b/comp/src/gb.form.print/molly-malone.txt @@ -0,0 +1,35 @@ +

        Molly Malone

        +

        +1. +In Dublin's fair city,
        +Where girls are so pretty,
        +I first set my eyes on sweet Molly Malone,
        +As she pushed her wheelbarrow
        +Through streets broad and narrow,
        +Crying, "Cockles and mussels, alive, alive oh"! +

        +

        Chorus

        +

        +Alive, alive oh! alive, alive oh!
        +Crying, "Cockles and mussels, alive, alive oh"! +

        +

        +2. +Now she was a fishmonger,
        +And sure t'was no wonder,
        +For so were her mother and father before,
        +And they each wheeled their barrow,
        +Through streets broad and narrow,
        +Crying, "Cockles and mussels, alive, alive oh"! +

        +

        Chorus

        +

        +3. +She died of a fever,
        +And no one could save her,
        +And that was the end of sweet Molly Malone.
        +Now her ghost wheels her barrow,
        +Through streets broad and narrow,
        +Crying, "Cockles and mussels, alive, alive oh"! +

        +

        Chorus

        diff --git a/comp/src/gb.form.stock/.component b/comp/src/gb.form.stock/.component new file mode 100644 index 00000000..cde956bd --- /dev/null +++ b/comp/src/gb.form.stock/.component @@ -0,0 +1,4 @@ +[Component] +Key=gb.form.stock +Version=3.14.90 +Requires=gb.form diff --git a/comp/src/gb.form.stock/.directory b/comp/src/gb.form.stock/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/comp/src/gb.form.stock/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/comp/src/gb.form.stock/.hidden/CHANGELOG b/comp/src/gb.form.stock/.hidden/CHANGELOG new file mode 100644 index 00000000..f87d8ed0 --- /dev/null +++ b/comp/src/gb.form.stock/.hidden/CHANGELOG @@ -0,0 +1,3 @@ +* Sat Jun 13 2020 Benoît Minisini 3.14.90 +- Version initiale + diff --git a/comp/src/gb.form.stock/.hidden/earth.png b/comp/src/gb.form.stock/.hidden/earth.png new file mode 100644 index 0000000000000000000000000000000000000000..14220d25ee77c0415c99cff9b08ae700f5f1d06b GIT binary patch literal 6367 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 "; sDest +' +' End +' +' Private Sub MakeStock() +' +' Dim hFile As File +' Dim sLine As String +' Dim aLine As String[] +' Dim sIcon As String +' Dim sPath As String +' Dim sPathOrg As String +' Dim sTheme As String +' Dim sSize As String +' Dim sTemplate As String +' Dim sExt As String +' 'Dim sSrc As String +' Dim sFullPath As String +' Dim hImage As Image +' Dim hSvgImage As SvgImage +' Dim bOK As Boolean +' Dim bFound As Boolean +' Dim sTest As String +' Dim aPath As String[] +' Dim sOther As String +' Dim iPos As Integer +' Dim sCheck As String +' +' hFile = Open "~/gambas/3.0/trunk/comp/src/gb.form/map/icon.map" +' +' Try Mkdir "~/gambas/3.0/trunk/comp/src/gb.form.stock/stock/16" +' Try Mkdir "~/gambas/3.0/trunk/comp/src/gb.form.stock/stock/22" +' Try Mkdir "~/gambas/3.0/trunk/comp/src/gb.form.stock/stock/32" +' Try Mkdir "~/gambas/3.0/trunk/comp/src/gb.form.stock/stock/scalable" +' +' While Not Eof(hFile) +' +' Line Input #hFile, sLine +' aLine = Scan(sLine, "* *") +' If aLine.Count < 2 Then Continue +' sIcon = aLine[0] +' If Left(sIcon) = ";" Then Continue +' sPath = Trim(aLine[1]) +' If Not sPath Then Continue +' +' ' aPath = Split(sPath, ";") +' ' For I = 0 To aPath.Max +' ' sPath = aPath[I] +' ' If sPath Begins "[elementary]" Then Break +' ' If Left(sPath) <> "[" Then Break +' ' Next +' +' Print sIcon;; sPath +' aPath = Split(sPath, ";") +' +' For Each sSize In ["scalable", "16", "22", "32"] +' +' 'Try Kill "~/gambas/3.0/trunk/comp/src/gb.form.stock/stock" &/ sSize &/ sIcon & ".png" +' 'Try Kill "~/gambas/3.0/trunk/comp/src/gb.form.stock/stock" &/ sSize &/ sIcon & ".svg" +' +' bOK = False +' +' For Each sTheme In ["elementary/&2/&1", "Tango/&1/&2", "Humanity/&2/&1", "gnome/&1/&2", "hicolor/&1/&2", "oxygen/base/&1/&2"] +' +' 'If sIcon = "favorite" And If sTheme Begins "elementary/" Then Continue +' +' sTemplate = "/usr/share/icons" &/ sTheme +' 'If Not Exist(sTemplate) Then Continue +' +' For Each sPathOrg In aPath +' +' If sPathOrg Begins "[" Then +' iPos = InStr(sPathOrg, "]") +' sCheck = Mid$(sPathOrg, 2, iPos - 2) +' If Left(sCheck) = "-" Then +' If sSize = "scalable" Or If CInt(sSize) > 32 Then Continue +' If sTheme Not Like Mid$(sCheck, 2) Then Continue +' Else If Left(sCheck) = "+" Then +' If sSize = "scalable" Or If CInt(sSize) <= 32 Then Continue +' If sTheme Not Like Mid$(sCheck, 2) Then Continue +' Else +' If sTheme Not Like sCheck Then Continue +' Endif +' sPathOrg = Mid$(sPathOrg, iPos + 1) +' Endif +' +' If sPathOrg = "#" Then Continue +' +' If sPathOrg Begins "$(mime)/" Then +' +' bFound = False +' +' For Each sTest In ["mimetypes", "mimes"] +' sPath = Subst(sTemplate, sSize, sTest) +' If Exist(sPath) Then +' sPathOrg = Replace(sPathOrg, "$(mime)", sTest) +' bFound = True +' Break +' Endif +' sPath = Subst(sTemplate, "32", sTest) +' If Exist(sPath) Then +' sPathOrg = Replace(sPathOrg, "$(mime)", sTest) +' bFound = True +' Break +' Endif +' Next +' +' If Not bFound Then Goto NEXT_ICON +' +' Endif +' +' sPath = sPathOrg +' +' If sSize = "scalable" Then +' sExt = ".svg" +' bOK = True +' If Copy(Subst(sTemplate, sSize, File.Dir(sPath)) &/ File.SetExt(File.Name(sPath), sExt), "~/gambas/3.0/trunk/comp/src/gb.form.stock/stock" &/ sSize &/ sIcon & sExt) Then +' bOK = False +' For Each sOther In ["64", "48", "32", "24", "16"] +' If Not Copy(Subst(sTemplate, sOther, File.Dir(sPath)) &/ File.SetExt(File.Name(sPath), sExt), "~/gambas/3.0/trunk/comp/src/gb.form.stock/stock" &/ sSize &/ sIcon & sExt) Then +' bOK = True +' Break +' Endif +' Next +' Endif +' Else +' sExt = ".png" +' bOK = True +' If Copy(Subst(sTemplate, sSize, File.Dir(sPath)) &/ File.SetExt(File.Name(sPath), sExt), "~/gambas/3.0/trunk/comp/src/gb.form.stock/stock" &/ sSize &/ sIcon & sExt) Then +' If Copy(Subst(sTemplate, sSize & "x" & sSize, File.Dir(sPath)) &/ File.SetExt(File.Name(sPath), sExt), "~/gambas/3.0/trunk/comp/src/gb.form.stock/stock" &/ sSize &/ sIcon & sExt) Then +' sFullPath = Subst(sTemplate, sSize, File.Dir(sPath)) &/ File.SetExt(File.Name(sPath), ".svg") +' If Not Exist(sFullPath) Then sFullPath = Subst(sTemplate, "24", File.Dir(sPath)) &/ File.SetExt(File.Name(sPath), ".svg") +' If Not Exist(sFullPath) Then sFullPath = Subst(sTemplate, "16", File.Dir(sPath)) &/ File.SetExt(File.Name(sPath), ".svg") +' If Not Exist(sFullPath) Then sFullPath = Subst(sTemplate, "32", File.Dir(sPath)) &/ File.SetExt(File.Name(sPath), ".svg") +' If Not Exist(sFullPath) Then sFullPath = Subst(sTemplate, "48", File.Dir(sPath)) &/ File.SetExt(File.Name(sPath), ".svg") +' If Not Exist(sFullPath) Then sFullPath = Subst(sTemplate, "64", File.Dir(sPath)) &/ File.SetExt(File.Name(sPath), ".svg") +' If Exist(sFullPath) Then +' hSvgImage = SvgImage.Load(sFullPath) +' hImage = New Image(CInt(sSize), CInt(sSize), Color.Transparent) +' Paint.Begin(hImage) +' hSvgImage.Resize(CInt(sSize), CInt(sSize)) +' hSvgImage.Paint +' Paint.End +' sPath = "~/gambas/3.0/trunk/comp/src/gb.form.stock/stock" &/ sSize &/ sIcon & sExt +' hImage.Save(sPath) +' Print sFullPath; " => "; sPath +' Else +' bOK = False +' Endif +' Endif +' Endif +' Endif +' +' If bOK Then Break +' +' Next +' +' If bOK Then Break +' +' Next +' +' NEXT_ICON: +' +' If Not bOK Then Print sIcon;; "("; sSize; "): *NOT FOUND*" +' +' Next +' +' +' Wend +' +' Close #hFile +' +' End +' +Public Sub Main() + + Dim sFile As String + Dim sDir As String + Dim sPngQuant As String + + Quit + sPngQuant = System.Find("pngquant") + sDir = "/home/benoit/gambas/git/master/comp/src/gb.form.stock" + For Each sFile In RDir(sDir) + If File.Ext(sFile) <> "png" Then Continue + Print sFile + Kill sDir &/ File.Dir(sFile) &/ File.BaseName(sFile) & "png" + Exec [sPngQuant, "-f", "--ext", ".png", sDir &/ sFile] Wait + Next + +End + diff --git a/comp/src/gb.form.stock/.src/_DefaultStock.class b/comp/src/gb.form.stock/.src/_DefaultStock.class new file mode 100644 index 00000000..330eebde --- /dev/null +++ b/comp/src/gb.form.stock/.src/_DefaultStock.class @@ -0,0 +1,112 @@ +' Gambas class file + +Export + +Class Image +Class SvgImage + +Static Private $cSynonymous As New Collection + +Static Private $bDebug As Boolean + +Static Public Sub _init() + + Dim hFile As File + Dim sLine As String + Dim iPos As Integer + + hFile = Open "links" For Input + For Each sLine In hFile.Lines + sLine = Trim(sLine) + iPos = InStr(sLine, " -> ") + If iPos < 2 Then Continue + $cSynonymous[Trim(Left(sLine, iPos - 1))] = Trim(Mid$(sLine, iPos + 4)) + Next + + $bDebug = Env["GB_STOCK_DEBUG"] = "1" + +End + +' Static Private Sub MakeDark(hImage As Image) As Image +' +' Dim X As Integer +' Dim Y As Integer +' Dim hColor As ColorInfo +' Dim iLum As Integer +' Dim iFg As Integer +' Dim iBg As Integer +' +' iFg = Color[Color.Foreground].Luminance +' iBg = Color[Color.Background].Luminance +' hImage = hImage.Copy() +' +' For X = 0 To hImage.W +' For Y = 0 To hImage.H +' hColor = Color[hImage[X, Y]] +' iLum = hColor.Luminance +' hColor.Luminance = iFg - (hColor.Luminance - iBg) +' hImage[X, Y] = hColor.Color +' Next +' Next +' +' Return hImage +' +' End +' +' + +Static Private Sub Stretch(hImage As Image, iSize As Integer) As Image + + If hImage.W = iSize And If hImage.H = iSize Then Return hImage + Return hImage.Stretch(iSize, iSize) + +End + +Static Private Sub LoadIcon(sKey As String, iSize As Integer, sStock As String) As Image + + Dim sPath As String + + sPath = sStock &/ CStr(iSize) &/ sKey + If System.RightToLeft And If Exist(sPath & "-rtl.png") Then sPath &= "-rtl" + If $bDebug And If iSize = 32 And If Not Exist(sPath & ".png") Then Error "gb.form.stock: unknown icon: " & sKey + Return Image.Load(sPath & ".png") + +End + + +Static Public Sub LoadImage(sKey As String, iSize As Integer, Optional sStock As String) As Image + + Dim hImage As Image + + If $cSynonymous.Exist(sKey) Then sKey = $cSynonymous[sKey] + If Not sStock Or If Not IsDir(sStock) Then sStock = "gambas" + + 'If sKey = "tools" Then Debug sPath + + If iSize > 32 Then + Try hImage = LoadIcon(sKey, 128, sStock) + If Not Error Then Goto RETURN_IMAGE + Endif + + hImage = LoadIcon(sKey, 32, sStock) + +RETURN_IMAGE: + + hImage = Stretch(hImage, iSize) + If Application.DarkTheme And If hImage Then hImage = hImage.Invert(True) 'Color.Background, Color.Foreground) + Return hImage + +End + +Static Public Sub LoadSvgImage(sKey As String, Optional sStock As String) As SvgImage + + Dim sPath As String + + If $cSynonymous.Exist(sKey) Then sKey = $cSynonymous[sKey] + If Not sStock Or If Not IsDir(sStock) Then sStock = "gambas" + sPath = sStock &/ "scalable" &/ sKey + If System.RightToLeft And If Exist(sPath & "-rtl.svg") Then sPath &= "-rtl" + 'If sKey = "tools" Then Debug sPath + Return SvgImage.Load(sPath & ".svg") + +End diff --git a/comp/src/gb.form.stock/gambas-mono/128/delete.png b/comp/src/gb.form.stock/gambas-mono/128/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..6a3f20e57f7bd72e79d1b25ddcb4de112c52621d GIT binary patch literal 1879 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 E0A58XV*mgE literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/128/gambas.png b/comp/src/gb.form.stock/gambas-mono/128/gambas.png new file mode 100644 index 0000000000000000000000000000000000000000..d98dd358ef19de4fd892aca6697d3a4fc7f09e0a GIT binary patch literal 2729 zcmZ9N2{e>z7{|vnWXUc?y0#WXLfI3Et%Y z9`0>Ge+?w9ffvHn;H&`*_9B6g>BtG@96pxDC|FUm)DIX8o@s%$I)!%ga`=B-ym%1; z7Z(=@fFA%Bi-o2H0s(-NlM~x%Z*NZ|5`mvgCjagMjKkr8f?6aJ32a~h1`64L{vWe< zbaVt@V`Bp%pg*((lm!eejmP5wL&`2^JE20LwzjtHEE|9gjNjM&BL&)mEZ7FHffS?w z*d^>ZhyVuXf>O}IA!b*xoBsh|6)3`XLWRGV+u7NHEQmk~UGg7(XrI6XfZgzS55z#h z05&iHur~vyY=+`sQ4bFfC>*{>EFyT5VKQEn5LMsidwnj;`1D8Zc^9X4??ZQeBuT>CU-#q1D`x`?k9ksLQ^OuzkG$uM1vJji^bk z|IqZp4JU4qYLtWIPh57-P?NluZKnU4(7LD5T5&qK_Mnn|9t_4+YieX*71%pt>uiWK z727N0W~rc(hzJPatt*U98>%zIQyDM)0>1TjGb$L9-Hg{$v$MJ^XTuVw?_WYR?wrsY z4JMYa+`p4?JYZUOBxcXm^1=V4IyU{*fqR7l+-j1BaQ8^hnf^hia_i{llmqdSF?$^q z@B?!QR+J0J@Y)Q|-J8j7;mOQTDzbglV)RNCdIZ0cJlHQ3q2-;)Rp&$$s#}cVU1V(v zek=^md!0_i23yEBuw<$xyK0?-)DS*0$Bl2$eDYMn0=-%4W08Y?9HBHd%?C@9X@=&6 zt5VV*8l`F3^~79V*5wN@)uGi@O3$*cSpG6gR5@zc?vCTuBfSl+E_C`ugWy^WreLF~ zt9>k6L4R4V;C>iQ@NRuop6JOa&VgK4C1zM{ugx4~s^42VJiscn6HOZCf9SCz4W%Qd zQP@>Y75%a^X!C)jeOlU<@0l8R&+fNEb@6W+y)16GC6a%-pY%M81=go*_$9 z)3H4tQ5TUM{&soR*19P9pTg*0H@xPO(^L)MA2Feo9xID!1}c1-9gTA)(SwrtTuLkY z_%#MgL3%(RGdG$l`b?}OU3{K&?(v`!5}Ex$x4O83q29`JjiJZf%qG7)_wHGaFIHHF zkaCgPLhr5NvYjL;8>WVPCbfO!!qmGTk|Fo8hEl0xycNtj2KQ-&Z2`j7;+z(1xM1=o zO^$=qy{`O4zUugQN4@tgCiFJscCn<7cSyZ68afmmg!Z??ok?}izj+G^9f^G&_MXJL zSV6sj6N%p&`RG?OGwURthCnFGUa29`mzHn8cqAE7r6M&E6I@2^rNRq{fEhDo2k~?=N5{0d$2y2-lfG$_U429ik(_?An&v6OtsFe_gdO1_ihotzvEm86C%A6_F3*!x zXD#u0#fB0EyQV?@PCy$*sf%gQ=XZM~3tihQCe*B8l)@idorzZ6hu9YZZ+Nv_Mt5=6 zj*FP{iGuGJ5UQLv_1{HQo3v4?*%*&dV}_SGmKtr3i)<0Ji5o3f-Pv?IH7LY+IPlgC z_l%&`3*Ypt`xMo*5Bu z@x;H7s@QV8$ys)Gzpd+fKF^JPCuVbgk%p$_yQBQaGp!ZZ60R3`y5}}JbW_W4QReTT zj8m6pukO_9#a)@ECYLqgSJ2V^4d$Dmn}HuTGXu_R=+=9A<{mzYeU|Q?rEla z?AS_wi%Y_m-|6!cYVIz@#~%u1Rxg&^JGZ=NG=wy5jeAy5Sw6G6`Zu zDfy3I+D`ja^qn{r_1;d=s{CPer8Z0E?#C3$Mz8MDxyt6QBi-X6*&W(9MV^k8-0Wy6 zi*x>2Wxjy=nI-bXSz_MpMhjxhl4(WUFbJGuqUP zoPC<@e|R_76%5*&$(>p%H>R?tJiZm*H!;zt%Nj}X2>US39U`1uXJDO$D#}V3GY*i< z8h6Nw%|aGDDP`{8*`PShb1hz98?F;eJ#%nkNwMMjbdq%R*P|o6xy9)@TK4g%qUw7R z>deOu@;#4&%M?N^(Nf;~l~K~-L`Ht#hM0GCJ%F d{cl8=g7tn3!M7$~d%=$zW_rrps0c-f_!l&8@}d9$ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/128/info.png b/comp/src/gb.form.stock/gambas-mono/128/info.png new file mode 100644 index 0000000000000000000000000000000000000000..6390f11d073b39d0d9af5f4d918b4ed22a5ae1d2 GIT binary patch literal 302 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?I3?vN&YJLDI&H|6fVg?4jBOuH;Rhv&5D5x0V z6XNP#;Pe0g|M>X$1q&8Ddh{qMDe33WpY!L>FDol6FE4LvYs+rTYz8W3ED7=pW^j0R zBMrz|=IP=Xl5y|t&Aq(M4m@oSqZ`?(>bNung(vU^sj7;a@-izJGI6I|YMArLr9D>R z==n+a literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/128/question.png b/comp/src/gb.form.stock/gambas-mono/128/question.png new file mode 100644 index 0000000000000000000000000000000000000000..c14bd836845e0d3c01d473f65afdc117a750edc7 GIT binary patch literal 2723 zcmZWqcQ71U7hgmK5jFTkqKi(*i$^3%^dMG=L|DBGR_}cgHEYEZ;VCQjMI?CGsH?5A zQ8%LZ9=)#>yZh}MGyeF#J9F;&o!|MLbMM@_Gv|%5kq#3B4+8)IVA9joG@Ye0`TL1vH zpRs|NmVq1C#>U3n+?=vsE=t8E27y4fwziIrj`sHU7cxp{ZEa2AFEkW<0VvD`PZ3-) zmwhh5W#J{Dq%JU}@Df}$xoma8Txck=i;!}w|53hv{rZyme?TUa&(F_EBoZYRA0NN8 zw3MEn9v2rkH8qu$mG%4g?++h7z~OK(80_xu?%?3i)6+vaVtRU-Kp-3(9IUUeLm&`O zPtVrY*6i$T7Z;bLq@?5HHVg(+P*AY5v(wnvSYKZs78XW%;j*%_`T2Q&e}5PZwzai2J3E_~ zmp42-JTx@a)zx)+div?pCnyw}oSfX<-JP48o05`pc6R3K>S||amzI`xbab@2x#{cc z>*eKz!{M5mn(FH6c6WCJ0|R4XVvtBA9*@t-$?@~^D=jT8E-oG$8$+Yf8yg!XB_+|( z(bd(}<>lptg@uEIgG3^+xw)D0k`WOR-rn8|3k&1p<3&Y9@87=<2nguw>pMI=3=Iu! zX=#a!j6|VOK|w)2K0YfeD{gLXBO@c>;o)!Jz6}lz#$vJU?d=^M9U&nh%gf6(H8ma{ z9zb4T0p*81^EWXv1rTZQeP_E=9sLSG6E4}S!`zI%bH8=`QVaw{ulF`-(o&J008JfdYbBH z!IRss@UJ*@xV203`HKtfy=`^WfIx?ouAI=u#O0kou>$(+teTqYS}Zqdfh;$HCF1U$ zznby0Bn1D~)CqUccS1rY+ts&gc-dJS(eRJgYYMbGZisGHxqu78{>$vWtGs zdADI%EiW!(x8=b0SoE<|o0uY12`8d6gTD4CZBRByp(=cJWJr$>UWb*AHg{Xn5P0M~ zu|e;pu37PtbE)Q3>5Z4T@Br8Zk`o|Qa`5EhKJ#z?6fJ?+5 z(oCNwhfJ0pzT(=uqlo9Z7uFO(V2ACym7mv^nPaXT`&XbDcJt0t4flUI+bU%9ZTDFq zdv=vA)0uMa^{1bULwg+Soz%@2)R?kYiW9-G0K%Ylhr+v&HF1p|#;n$*2L^Q#QEUgt zw2d5gTM}x|1$rk3$s8)(vnpB)bollXu9tH3LVqQQiYb5AUGibQ-_{Pr9iY@Yo^1oA zYzHGw zWZ|w4yz!=f#EcgEB;hIfyOxL-Wv+kqi^@U9E=&$nsY>hk9nQC<6rVetp^9e>FlIcG z88*GLjRq6ASk^q<$?#xeq?vkys7k_B=qm_^+|FM#h+X`2d9i%7&5g{_)^SL^2L3CU zr2BiWDi5QsPYRh+K}`MmhMo2_F_LT}l285(;pI7!u^S8Ah|45gcWU;E(j`ZAzm{S3 z5T2l!5$s<*P|c5mZrL1rP@C;Bx3^m6mx6=sQwLO^K?le*tTLAV5IGYxm;HojNd9BS zUnGLCMG_MV<|Rt>>a&%J_M+Csf9;mk?oOe*7ANWN&}td0q)g@qNs9s@#O*Xx3ns0& zG5x-!i`afDEr4Vp10^@bq%hwg`&v-Hh=cb)TS+1~xNWXite!%!QL+7bLjD;+9$WB6 z(N)BC03lJyGp-;=R*Au)Cjqt1kUH8o1~+|H{xBo+oz5M1N>)-6v5iR;jq&$e3_k$2 z%s8YY-*%}`>E9MCNvm#o^6kk9SF897eITGy727jSZN19qy7W-jK_nzWz9K|fgw!#u zuB8O&`4$89L4XxQ5u}&&ThEY7nzP z$ChCa?vd!UgDipbH;P+bvOv~_G~xx^Uu&(gsA2#X1}eoc1M*UY#NM{Qd@LHNX(;d$ zdg5^#N6#QNH0fR;=5q%cg?q9&#_)nlfOLHkT_)W_=BVw&BX8%aTTSpz7y0!dJ=RvRgT^6H4`!#WxkUHvCr5E!~ z>On{Q%~YiINmZz#d$X?rgVeC)fIb#IkuY4u;EWft{3->bj!r*YUPjs8?~O>GnJWwM z%jMAhY3YtwjymQNMdLc|7?&L9xtQ2ykKzP{$o*qrR*v78wb zP%46P>xsrBMNK{T4DO5~asn=)$29&MJ(KVE)oSl#;4?!r?*{SgmedyZqBb@-^eAAO zS(5+5K%q@HF8)fo1#zDBw$@!?T-N6gJ7N;g#d4*@k2x4mspJu6+1YSk8n(P) z^pZZ-qoHL}LH){gPgscbIbU)gt(jdnSQ{w_lezjaY=FslobIk#74Xd9dn|kL0`1>h zaqNgi$S=>hTOXIMNW6}_geGpf5vSK9%h|jde z?BG4Tg)VFFZj3Oi?%XXfN716P5f#m<1Ji=yb4TrMn51n|4rj0U0{6!iLiQvQrYnb&2 zn~&fTPwROloXcxLeF@oz+bEj>lx0hykAM}YiGVDcI$fYyOghSki&M!0N64&|@UB7D zntVjo;$n(Nbxr`%n@lgHHX|n5+E+o5c7C$Y$D8`K?GERg<+xPfyu$0#{%tpvCsMo5z=ciZ zUR9r9M>csuX_ft)^>s;D@Pv-cemeS}UMqHy^S-rugE9ZT7prQ7o9-QDCWnna z&$^?neu40fQVjbN&Y?GB#{S2W25HX?_wfUrhf{g(_A+A1|g$Xbaj|y^gbAd9bV(|_R4iJ&J zxHx2~*w|RO2#_5b8VZq3OiTna{{R19Q&aQj&!7GK_wU=cFEusw#*G^J65@&A`A^ zpq01~Z2DsyDZT+o<}b*KQN_X5hOP!imK!V&7#DDAs2$K^U}p$*P-HA)yuti}sf%L+&jA?+$pD9jT!w25 zw-`(ruQ5t6zerEzULZe-v4o|9WdhFv#RKXMDGZj3af}hnIc4p;?B19iV+m^b`|Z5g zop-vNOBjAXudn`5neU;%dSl)_mS}4x%>&Q==-rwj=)qX_oY7jF>7#Oi1;0gb5^elqhqX-58y zjPg>9?~|GB%$c5TWc=)Qz{o7&CdZCW-WjG$YTYM3i_6dMeqd&_;O*fRUu*CDoF8S+ z8|~j**Lw8J?N;%olQ}Q{nVg%xdChs|mdKI;Vst E0B+)M1^@s6 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/access.png b/comp/src/gb.form.stock/gambas-mono/32/access.png new file mode 100644 index 0000000000000000000000000000000000000000..56666c65dc0299eb939fe76b5bc202d7ca13ed21 GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5C@3A^ z6XNP#;FFM$@c;k+`1tsqo}SgKSAYHbH8C-9?b@}w9(!p6l`)nC`2{mLJiCzwD5ICl;AUCZ`OJUKHCml)(3zuB!h-cj;`Qlwb6Vn~0W5?XQ syiRGhng9R* literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/add.png b/comp/src/gb.form.stock/gambas-mono/32/add.png new file mode 100644 index 0000000000000000000000000000000000000000..2447afe95bce3552f2bdad20a339fdb7856a1d8e GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?slj7I;J!GcfQS0b$0e+I-SLLAC&&5Lchf!ua@jYwx3ZAU!2Pe!&b5&u*jv zIZ~c3jv*Y^lM@cG&ETKl@!|jf|BQ1L?uzIzFccR^8%j)eGX<(*@O1TaS?83{1ONwx BD#ZW* literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/align-bottom.png b/comp/src/gb.form.stock/gambas-mono/32/align-bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..153ff773283795753323742eadf56cbc17e9954e GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~q2Ka=y zx)=B)BqaR*|9_9^f~i13#*!evU?WGdBO=f~WP$h$>tDnm{r-UW|q_!k4 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/align-center.png b/comp/src/gb.form.stock/gambas-mono/32/align-center.png new file mode 100644 index 0000000000000000000000000000000000000000..fa062473c076d16f15924c78a05a686680be6306 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~q2Ka=y zx)=B)BqaR*|9_9^f~i13#*!evUxp@emToP?xm$3slBY666=m@Ha-UAv!8DV?p&+pjf=8i(`n! z`Q(HJmIe-wjXM``YLrJ_OAp=F_r}R1v5B2yO9Ru=z6+1hG?8mPEg=s31kRk zR8?{CW=t2>XyTOMau)PsgTe~DWM4f Dl29w6 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/attach.png b/comp/src/gb.form.stock/gambas-mono/32/attach.png new file mode 100644 index 0000000000000000000000000000000000000000..78ef14bf97df8bc345a64cc56a9a5e89a856c1e2 GIT binary patch literal 751 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fA0|TQ% zfKQ04dx1|vLPBCD3A@&1y-Jrl#~P%f#?D%1}ezS&4oz8bs?*VNFkFzWe`Jvf)Fif zX=!l1Kr?}|5cLoz0j+>AAcAniAzFY^a0WzyCX>Q5U~t5j1o;IsEVcU4@|lJ4Pv{hP zCJ)!YtqU6!45z0|o-d&D^>^nIC)whEzc{M{SFOKm@>+gH3>$mUlQQ2_z1~Atzg0bK zicMI?JNupXOOd+v_wiC6RC64dU2eVFtG3|4?YSY&MK!Z}7<85cqlL@U#WBR<^w!JQ z{g@2}STAtzJ~BJyWZRb(l`r?I-|zh%_wN6H)_W3i0*_st4(ZRkxN+^ow~YT1Q@WjP zm78V5-sh($tJK_lEXUqf?fzRPEoWX>;)GZ0%1*u067JimeaZ0nHV^lQ&zti5e9xV* z%iPp`;B?o#n7h22pNYwJ-FtPx^j^uzDK9uvZI<0(6@B}qXn)0@)64B%Z~nRG@{an| z$rEo+ocH+Lv^v|>$*q+M|F68#*vKIB`P#D;#j+O9_nr-WEESOW^=)X`nIg~m^Z4wu zVvBryik(~}E7@pP4QZJf@2@#`@khkG`!`fhqh-dY)Cb;&eN le#%?fm-FXL{eR_@{F^TG*oAkhOMwx<;OXk;vd$@?2>`5yK5zg4 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/audio.png b/comp/src/gb.form.stock/gambas-mono/32/audio.png new file mode 100644 index 0000000000000000000000000000000000000000..d28e168ed2c3245e44a0fd0b2b52a2c7ac134d57 GIT binary patch literal 475 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaOE1AIbUeKHH<h<`SXD!97IG!z}cy(sj;!KadB}#k;KHrgoFej z1IP^u3PKivtA{Xv3V;Bp7)Zi(L8KriKuDm-c0KE_Kqu*x1o;IsBr}FH-Mif|os;Fv z18&WwpY6PUzhpfm-Sv3F4Gx`Orc?C~y0!iJ@!h`LyGJK|!#SY7U7jwEAr`0CPJS-b zWFXMeEFw4|P5;L3-~Z01cUdVvd3Ht7e%gUL#WJ7zNm)xhr=A9 zeQZ{FO?$TdHn?5a_W10p$6w1_=iT~au3&Uz;?e64H-eX|6zJ^JEMCqb-uRN;ZrU#+ z=M`BW0|gvPkA>Os%@Assk*r+WZ^*i4;{>aN6PTt&c*-VzFh3x7@NY_K(y2A3UAbS& zryq?kw>9|gmLN4zyPjWHzPhep-s13zT))rE4ZDrQlNNg(1p0!()78&qol`;+08(?h AMF0Q* literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/battery.png b/comp/src/gb.form.stock/gambas-mono/32/battery.png new file mode 100644 index 0000000000000000000000000000000000000000..f4ce7fcaa97f9dacbd56a8db36a303d6252ab45f GIT binary patch literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wFKADC8|NoDVkIz3-E(cOk666=m;PC858jz#u>Eak7aXC5R0Mm}J zwNVZYj7t=CSd>LLG7fh{ZOzg&m6)NH{DVoBfnkY^t6;~sxrIPY44$rjF6*2UngA($ BEJ6SP literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/blue.png b/comp/src/gb.form.stock/gambas-mono/32/blue.png new file mode 100644 index 0000000000000000000000000000000000000000..977984b6007a261b2e95a787a036cce74f00f002 GIT binary patch literal 602 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAQ1EN7fKn9RZOiTnS0kVMrA_!!}#l^w75O#fiJwybk9;hrgH#apk z6)2LFlmsOI|NlR4-n^qnj}{jfFJ8PjFE6jBr{~C#BVWIMO-V_qtgPI#XV0~3*A5>( zJZsjhg$oyc`SNAaqD8xR@7}g;+wb4MfByUlH1O=%v&qTHCr_U2@9&>8XHI&0`mbNV z-n@D9^5x6v)2C0FGUeE@V;3%5Shj50v}x0_Pfg_jx?8R!$S;`T&cfrGpB;X?GagX5 zyXb^Z!j}aPdf8OZp6g>*i;WZVd;XPyfsx(Q#WBR<^xDbc#fJ<8S_%)d3Pn}j?B(9Z zIpJRQ!~g%)o;VpPbN_Cwy>zC|>h9Y)QEPoyU(RIs^_MNdB8S0kan*j_E!m9xA6{|0 z1m<$`Z;p)Z40cIrnOyqsBSUae*TH$W?5z%nw(4!zznX>5FmWAcSx6m!W)OpCSKL)| z-6J}phmBJ2-*xkt*MEHeM_tK71*!)e71qs5+*eV%N153|XalP~`w4lQ33er%FPbbr zeEc_cU#GAM=LTQ8^Q<+C?9nW$*tc&<))}Q0 zQ$-w81Ka=CnPzRw6Kh(-|BF%Q>8+V;UXshIl4IPj=R{wYEnmF9l5>`b%6qpNEM36B OWAJqKb6Mw<&;$Ty*$$on literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/blur.png b/comp/src/gb.form.stock/gambas-mono/32/blur.png new file mode 100644 index 0000000000000000000000000000000000000000..46a1d4b1e11866cf85ea9c7e06c62ccf462938f3 GIT binary patch literal 1699 zcmZ8i2~bm46b))BMu;Fg6a{1x5QPDkq8KzRftV(N00{{sL1M9iVgNOw9a(Lx*u)UQ zjS>Nsf=g>zl!0o>A_hbYDA1sQ6sCd*6+r}@UVJkd$2;@SKli?K&wVd1nMkOVKz*Dg z4uiqylY)qJc-t&Ix{CpcCC8iKwJa%!nT)~U8x|fNg)80)gIQEeC5QP3CXpEo2A9i? ziHQLrfj|%l1VA955)cpoNFtF~EEdT4d_IT60Rk8m6$KPzs31f+8jc+5wp#1C0hNFo!@&SOJ2jKoRMo1&W~j)QZRB z!7Q{@q(=@g8dB&*dq6FKs0aia>2x~sM5|hVFoZ@(0nr(Oqq)!y0eTvZ1_%LlsDJ2` zs=Zc3K6WhZ0UUr+sZ`*wPvB@e>VgyqRN!>T5Kw!+u&OP>g+dAedMKieX%Sk`lGexB z(Ygb^j?Yr)lu*nUy7P;dV09LKSpI&g;Yxkm6`Sx@8L>{sai;%y`_FKCb@kld&ED*^ z9NXFWVD2JiV%l@q*mC0RbKcjvUS8vAM|#o?Mp6h@jW)7s)<62K_Og()>gm>?gO0DZu8B`9zkfTS zWnXi_KYHyVx=om3lyjqV==bZ?vB3#Vo<{EBF=bEv*Koexwr;!0v92mY4%6V3>xmr> z?3cHmR5P7hpRkF^vO5h$4kg7GQcpJkl2T3u8Bb7H@XM?v5&gn8t7ExEcH9vzFLsDG z$lD#qYj$i?Ij@ZrT3zKCHmlnk?x(xA-@Vu9G`KrH%r1}iy{0u>Dp6Q7eB?zrH78Ej zkNVBh=X!Ix;~m+;dpS2YOwLwF`xx>{?>3rUHNnlhyYui$E0rGJ-&aTJJ#f*zOA&Xh z+U%B3)4gxk2D;u&;O#N?GCG@RVq7zjb?Bt31()Eno#xTAVJ*qD0L!*?H6x!<3hG+l zO4I!WD!bHkM<3?3m5VKUlwV9p)HzGbc2PD;JK}}~;i-jX24(p#749nRKBr?PKeT#0 zB8(E_O%fl>&8$xHtd0LFj58`r7>>*Aw$W7m(G=Hls?kNWVmuS$bdy(4xqKyGcFV3C zUo}|wj@k9NNkkPF;rdLo$7}glQ`ubXiK>8WKCWHfjLon9#8lsGeiLQQN|@&cPBf^` z_a5j}#%*JN@V%^QczP~;<}B70=M_9;trqDO$V|)+^wlIs9o|Gt7auCi>XVWCmg-`2 zB=5(M6q;q<#dTNZ{XJsJs9e(iHniTR6(?~E=l$Hzyr?6?&!(O4)996Y7pDxb%hjcwre|HUz&jd+uKSf*=VFch zNz&Bv=0)%8{HR@u$>BZO4(8$R%j0_Tg!vD~U)OQok91Di+l^%}IVkRzoV<{`-M8Xl zW#H79LY?nUmVOhAlNt8M^8JE4gu!%*MPW4Gde61#O7-ZRYuam1 z6XNP#;FFM$@c;jRAPHe?*s$SM+{=$Z1uP{&e!&dy8yb#_y~+XdZ9H8ZLp07OCnzu( z>{4Ky(7-W^VX=3XhD-yC%N?gc)(NH)^cl=2GBIZDNEYC-Sj;W4fRn{=0jGw5@K=WO X71?qPUF?iNa~M2b{an^LB{Ts5?8!F& literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/bookmark.png b/comp/src/gb.form.stock/gambas-mono/32/bookmark.png new file mode 100644 index 0000000000000000000000000000000000000000..3530ccb735c2bdc9232873ea293a81f2f39350cf GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5C@2x& z6XNP#;FFM$5EmB*Bq1O^J|4*Uot1kZsD`a1$S;_oq5k6}4$*COEkKc0PZ!4!jq|-1 z&+;}X@UR6GF!{}~-PypdZlL#osUm^VHzNLba&*-q@k#pq+dQ2m)XSL*F-#2H9<8-VL%o4$5c5r55^Dvdf;ft}zW|pZ3U6icw8rLA-=UqJql- xe-;D7h7Lv#D~2V^6-%$&*A=fnVN&-+e9J4P{8P#c&H)|7;OXk;vd$@?2>=}6RK)-Q literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/bottom.png b/comp/src/gb.form.stock/gambas-mono/32/bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..7cfbab14937855d6d3b9638e4488ba40f45f4726 GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~q2Ka=y zx)=B)BqYSg$IH%n^aUu$R1)MD%+N4f+fM?>bMbU>43W5;oN$0`hZqkN+hZ+-0)~y7 z!q!G{icN~zn#DQe;I^!*EHjkYJJzk48t^vAdjZcj&H%Q>%*zopr02kvki2wiq literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/brightness.png b/comp/src/gb.form.stock/gambas-mono/32/brightness.png new file mode 100644 index 0000000000000000000000000000000000000000..2e9421722d6530b9e680e95487ea35ebf9bbfd98 GIT binary patch literal 337 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP|z&E zC&bmgz$ZRFJ~lQs6b$0x;*ye*5)u+JGBSYTxw*MO637LTa0ZYY?0fDX&;-GfAirRS znKqovH}rprT^5}-^Kx zA|)u*?#3U1HbVw~?m&i)e=O4~SRWmFB=N`4=-G?f1M@l>{T}rMchn@VX3&dtnJwdR z_eYys$b~MuAgM0-Pgk^Sx4x1W54_^pTj=hS#~{T1i6MgT#=ZGw=GC`3559RTq9A8D zb4i8o$AwFlPdk%UHhr3V-R-%ze?Cpx9$}DlveWhVf&DZ7SAGA=6rn4q_<-|f9MHWC Mp00i_>zopr0JtTCF#rGn literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/c.png b/comp/src/gb.form.stock/gambas-mono/32/c.png new file mode 100644 index 0000000000000000000000000000000000000000..51e99fde5ada106f4e0bf5d486cb7453969bd2a7 GIT binary patch literal 424 zcmV;Z0ayNsP)Px#s8CE)MNDaN`}_L_1_ti#?*9J%l$4ZIR8;@}|6gBU z0000sHa2i@aH683O-)VS-ri+pWwf-kq@<+u^z<||H2wYk;o;#^Q&V_&c&VwWFE1}? zX=zGIO5)<;j*gBhDk`R?rcqH*k&%(VzrWSh)z{b84h|08-Q9F_bl>0K(b3UaSy>Vi z5@={>%*@Qi#l;g76ZiM`1qB7x*479J20d!JMQvg8b z*k%9#0Fg;VK~y-)V_={H;J^cjRltq|3{eGYiVAYl5+XPi=&Evp00#>W1xDJO>YB{* zOq_x^6mWBzg7k`W^5Rgy#i<9Pg!ph+VPMF~jMo>8#+)Yjy~)LC2BJjSSQ)V^(Baeq z*)GK?jKc&CeNJv=8CfPy9$W#XWDX7}eiocTt-{JCDJH-jlI1(fD23IPC`p&Hc0 SS*L9P0000y(a2M8q1fSurs5esTKRSSfZGsENVT)z4*}Q$iB}peQOp literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/calendar.png b/comp/src/gb.form.stock/gambas-mono/32/calendar.png new file mode 100644 index 0000000000000000000000000000000000000000..622e402f6ab8476c59f45773ed985d4dd5cd6954 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICy0X`wFKADB_@$qqSaX|9_|NlU8-@bhc2K`nb-6cVO!3?hg-^l*@xC+QO z^K@|x(Kw%+puncV#kf(BrMWRffvMRsLxU+mYx3G}AxKJ@X!R4kC b2Ll7!n}Q2wq8DcZObP0l+XkKN&_{+ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/call.png b/comp/src/gb.form.stock/gambas-mono/32/call.png new file mode 100644 index 0000000000000000000000000000000000000000..b87b63b8256899b65bf2c248a6b8ae8a5d989fb4 GIT binary patch literal 419 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP_QV# zC&bmgz$YFC5)u-C%(S#Lhya8e7Z(TQMny%zrGO$3!IYE~pkQcdXi`!VL<>Y5$WBa5 z1dEak-aeD9NlR`}f0;CA*Vu6t)J;8TbKv*v8snbsynBxY?HL;MNS%G}U;vjb? zhIQv;UIIBP0X`wFKADC8|NoDVk55ZW`}gnPmMvTI^YefF`0?}S&qt3Qm6es1mXDZ3b&hb?W$vTRnqT(`xfx96 ZXGl=g{?gRUeigQu&X%Q~loCIE;APGkT8 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/cancel.png b/comp/src/gb.form.stock/gambas-mono/32/cancel.png new file mode 100644 index 0000000000000000000000000000000000000000..95ed8eb0a40704ed93032ca02610ab3b1180ee62 GIT binary patch literal 337 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIC~0X`wFKADB_V33fI0AT>h*x1;lq$Eu7yA?bxK#hDQL4Lsuzr&+Ke*Mwa zs;~aj{BOBc!hN933Qrfu5RLQ62@CiV+6}oDd~syuIIF|Cu<{!lvI6;x#X;^) z4C~IxyaaNh0(?STeKHH<2X~IG;FGa3b z`Lhm-KRH+bVfzcum7ePlzTGT8wf}iwWY6YwDQ$te{ipN0js_m$$`a2MT_Afk^5BC- zYxnJvF1|nQWMHf454E?^ybU+Q-M8-Nydd;Kb?@1)sl~Q8T%?Z*ExGz4`QiCqJ|4x? xoF}L1+r;Fn|2%&4H^U`-OYX(aw%DIb<*N@HSSF;Nc?$F!gQu&X%Q~loCIC&(xa9x< literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/clear-rtl.png b/comp/src/gb.form.stock/gambas-mono/32/clear-rtl.png new file mode 100644 index 0000000000000000000000000000000000000000..ae57407541bcb6892d8de7facbb0ae918a17c278 GIT binary patch literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICy0X`wFKAD9H2?_uI|BsK4U$kh^f&~i}E?oG2*OP-l1xzJDe!&b4v$g#s zfV^5y7sn8d^IIoe+b{kb&Y zbS86{w4XHZ!)TG6X*wcZT1+alHf+?I#M?E6*O9@0r;~I`lZb-=hftN6U0Cj%S0|Ti ze%}+9EPPfqhW}Y+y6vLJ0y{r`XXoCuSoME^dCE>h)7*oli9m-ic)I$ztaD0e0sw7H BSlj>r literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/clear.png b/comp/src/gb.form.stock/gambas-mono/32/clear.png new file mode 100644 index 0000000000000000000000000000000000000000..14dbf8ee2afbb20ad1599ed014d8297b199e80f2 GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICy0X`wFKAD9H2?_uI|BsK4U$kh^f&~i}E?oG2*OP-l1xzJDe!&b4v$g#s zfV?_S7sn8d^IIoeZM+P!=;v< zs&+_zacl=e$bn|nhNY_9Ocqj$d89L&ls~Dsb#0iUmC~%NG>PGgtPXSeV~5K|4=Yz3 z$upfMZhT|)#Blx@OI4M%BlPdT=esh0gY~E5rA(WW^)+T+x-AcM34^DrpUXO@geCw$ CBwIQF literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/clock.png b/comp/src/gb.form.stock/gambas-mono/32/clock.png new file mode 100644 index 0000000000000000000000000000000000000000..1db9c72a334d3030f28e141a03c5835bb8160ce9 GIT binary patch literal 493 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP%uBh zC&bmgz$YFC92^{g%-Go2`uh5~xHy}O+-5nW z$<&qn`{f}!doS<9ukIY1I(#QCps_LB9)jl8bXl{$_e>T&nDYpH>R__;lcc$mxKDcYrZ(o~j^{NMcGA}#zXvd2m)(5P2YzmV1{mr?B z_s`z{(q8{KKL~v@>t_iqWD^m6B$}||r{sa`4WcIu<}x!c5!!zIRx1Wf#Jcx;OXk; Jvd$@?2>|NS%G}U;vjb? zhIQv;UIIC~0X`wFKADB_V33fI0AT>h*x1;lq$Eu7yA?bxK#hDQL4Lsuzr&+Ke*Mwa zs;~aj{BOBc!hN933Qrfu5RLQ62@CiV+6}oDd~syuIIF|Cu<{NS%G}U;vjb? zhIQv;UIICy0X`wFKADB_@$m@>3CQI9zfZJ)3Rp{m{DK+k>l*Bp_PT`w1+qL{978nD zZ#{pJv%!Fet<8 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/color.png b/comp/src/gb.form.stock/gambas-mono/32/color.png new file mode 100644 index 0000000000000000000000000000000000000000..7a86cc3c606abe56aa70f85be22cf0d32e5d718d GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIA=0X`wFKAD9F4jgD`XaJHx0Aw^aHpa)t$Hm0~Ng(&&!GjP6kOV5&*x#-R z)XQ5EQd%8G=a9mGLXkdP3|Bd|u kC(DNa|Nry<<*;C2aGLLTUy*zB51=vzPgg&ebxsLQ0JX*_sQ>@~ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/computer.png b/comp/src/gb.form.stock/gambas-mono/32/computer.png new file mode 100644 index 0000000000000000000000000000000000000000..83bd654f57efc17983686969c1d44872dfccd49c GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5D5w(P z6XNP#;FFY;l#q}RA0H1S;UF zP&C!k#W6(Vd~$*U(;6ox3zo9OjCG6)*t%FbZad9naJ(Vu`gf{-qgSt&>$M=%@p9k6`7zIkRaxC{8jAfMyA*kOx_JlQ759rm{}K1V4WuT bP?%x;k9)?B!jpdiEoAU?^>bP0l+XkK0)0(6 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/connect.png b/comp/src/gb.form.stock/gambas-mono/32/connect.png new file mode 100644 index 0000000000000000000000000000000000000000..b89c18b965e10e3b1a43f5f7fca07d4c35dfe6a1 GIT binary patch literal 276 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs1s;*b3=DinK$vl=HlH+5&>+Ak#MLLWFdhaH5)vRx2qQE!6fP1M7nhrx z3zX%4nvn+7%U=@Y7tHYZPuSGxha78|qgGFOz<$Kxur5$4$kW9!MB{vN!UFAtevhOd z|Nq-N9S}I-C^qAhyzc>d--e&|vm6w6IoRxSu;0YcF}GiDfq#I4{Q89vYmXL4v|To| qIc~rn%b?sK@gpqWNpyiG14EkgOx literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/contrast.png b/comp/src/gb.form.stock/gambas-mono/32/contrast.png new file mode 100644 index 0000000000000000000000000000000000000000..fea2398ddee27042eae0a9253d11416d12bd4a69 GIT binary patch literal 390 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP%t6D zC&bmgz$XC-#K*@2d5MXMv9Ym0Msjj8L8co;`bj%4W=%k&=?Kd-v|sUP|kMb_taP`2{olda`px^w&zofAYVd?oufE zQam?w>uaFwI!_nJ5R21iC*2e~q`>3i?Y;2A)rGrn|Np;KZtWH)k=jd@b7wnD>Rj|c zNbR)J`R<^!C9#FAu3g#p{aK%_e1FSYDd_t8#zKQ|+g(@uZ278_w=vAC3SsKr&$Q?k zgUsSW#t&y}vgB$U)?W7VImWJ_8?b13!x1J{E3OXR35%C9e6tj&QTlQ6!Hk2htl_em zk0N@@&ehhH=P4OjD-|tY+#55wPX1Q(o5?daT2u=DzWNS%G}U;vjb? zhIQv;UIICs1s;*bK&3}Om~pB$pEO7?z$e7jC$sSX|Nrsv@%d-Ug8YIR9G=}s z19HqgT^vIsE+;1(V2D}mz|bnl#S+*ek#LoJf~2?Oq!x+5)nN~lCM>8GwQ6o;T*ao( g{3=9+O^Sixzkb+t#r}u!KqDADUHx3vIVCg!0KM!rqW}N^ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/cpp.png b/comp/src/gb.form.stock/gambas-mono/32/cpp.png new file mode 100644 index 0000000000000000000000000000000000000000..1576c606229861dee97ff001c9e6eb0f8f7a76bc GIT binary patch literal 493 zcmVPx#&rnQMMNDaNCnqQV{{H{}|6gBU z0000N7Z*D_I|&I1OG`^4A|fOtB&4LI0|Nt4P*CLL+1yt1-Q7lh=_>n?Cksd`<|Yj^78VVo0~~VNz2R2i;IhPc6MQ5VN6U+I5;>*M@O=< zvVnntt*xzme0+a@f5XGWgM)+k`1se?*V59`YinzXiHWgyjTh!Fl z2L}g|l9Cx28QR*~x3{-3F)>I;NCE-^l<2?700001bW%=J06^y0W&i*HuSrBfR5;7k z)5i+KFboFZ)QzpG8BNl?_uhN&zW+1Tj1mO>Spo9~v=SY(?oss+00000NkvXXu0mjfCBfod literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/crop.png b/comp/src/gb.form.stock/gambas-mono/32/crop.png new file mode 100644 index 0000000000000000000000000000000000000000..efae087446f89b0c5234b553b4d0f203aa622710 GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5C@2)* z6XNP#;1d@Y7aJQJA0MBPkN{*qw@wTM$}*P(`2{ol`@7k-%?HR0_H=O!(Kw%+pup4A z+si94L(wHeV^+gPLl1^XOAiH+*aI_67_%6}6~ffcMv1pHba!)i98go}3Ft{w>||Pz trx>UpaW}w+G2o5GYy}pli>w@s3}$Hp&po=gmI94u@O1TaS?83{1OT|YIgkJV literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/css.png b/comp/src/gb.form.stock/gambas-mono/32/css.png new file mode 100644 index 0000000000000000000000000000000000000000..ee8a2430e86086fbaaf1d4cc636c13d4c0ac998d GIT binary patch literal 666 zcmV;L0%iS)P)Px$GEhuZMNDaNmX?Qc_aK$HyinCXkSj2L}fsAtBt{ z+`+-Y#>U1~RaKLdldY|-7#JAI$;l)nBn1TpLPA1QQ&Sro8%IY+ot>SLk&z%EAOiyf z1_lP>GzFsOoVJ{fOfsCZoZ=7? zJ*b5(tVLMZ#UvzoxS%9PWU*q9Lo3NqnzJYb05B~oi)9R$@c;k-07*qoM6N<$f{nfl AVgLXD literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/cut.png b/comp/src/gb.form.stock/gambas-mono/32/cut.png new file mode 100644 index 0000000000000000000000000000000000000000..a2f68090bb653732bfab56a3ed64236f3265fdb2 GIT binary patch literal 441 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaMM3p^r=85sDEfH31!Z9ZwBpkIJbh^tR#VQ6S*JQ&2r#>U0P0htXA4L}me zg@{80;q2t(WFQ+N2v-A>H1~gf+B*-tAf%D2f#iE}~U&Jz>WvxGR)<=H7+cW&SGS6BZ(x*}@(zzpOiG#@ z8%i7tylS4XEMKBwp{m+A-R91}&429{u2^wI<*CZGij$@VqTj{qa*m|S3Gb76Zkh0f znNco_V^d0Wtgwh(;-<}kD=+fR{=J6x<`0(4^e)5H_PZbZbS|^ZOkQPRxoo*o|0wsFKk|gTe~DWM4fTqCC} literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/database.png b/comp/src/gb.form.stock/gambas-mono/32/database.png new file mode 100644 index 0000000000000000000000000000000000000000..55ed27c312fbd90fc87e0b37578e83e27fddbd62 GIT binary patch literal 362 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaNb0(?STeKHFh8XDqZATBNr$c&AR1(FU94habfFc}05k%jR8|NsB<#M~sH zX(A;-e!&b(XKsJ)`lFf5;`P$*@b5$3_OI@2{cyMpD8J0p#WBR<^xDZcg$^n3xGog% zisbJ7|9^GX6)jOUtINL+IiH*G)~!QWmHSARPj5hq`kouS<(j)?9)E7>UAD7#y%hhY zb)C|GCPmu+yMANhz0EpP{ySCe-)#{9qe$_}>A0t;9Y6c`FL6cqXzeH>($ ze_)wmIH8XDhDgrDoY`*{EJ<=ZtJfWGo-LsmbH3=E{N+#Ep7TGq>u0#R{E0D3_G{kJbPH literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/delete.png b/comp/src/gb.form.stock/gambas-mono/32/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..4b15e60013e4bdd7673035a1cdacf46b85fca96a GIT binary patch literal 526 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaNJ0(?STeKHH<;proV(C>0kM2UH0p6B84GTp$}F z2w_9GKsE#bl>q^q4P;EQwTJ`Su38f07tHXdiz!Nz<#)(0h2+m?WY})M^jc|m$otjO zANIlD4==fs`#0zKQ4^zXpmP~HJzX3_EKaYT{Bly00Z)T-phLg}Z@t9pSNHwb&bw5! zBr$!?T*LZV&$4H4W{?-zAD;ZU^6ZML|NJs4@l{i^g*@u^WVq|OPrrXI>cq~19q!wH zn;eN0|XEQ{CCq|Zt|c1toN$7!#{cZ+pW$Sk0X?PGqyjEQZN2DC0_H#OV^vX zs=kQCYgJ4s+YxeXQNU~!_Kd>NVmdKI;Vst09gLvp#T5? literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/desktop.png b/comp/src/gb.form.stock/gambas-mono/32/desktop.png new file mode 100644 index 0000000000000000000000000000000000000000..657deb51f4cb54e738f85cc2db8fdb2f619f8cbd GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBh0X`wFKADC8|NoDVk6*uj{jzqW^&mwhL4Lsu4$p3+0Xe0fE{-7*ms8Jg zBH literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/development.png b/comp/src/gb.form.stock/gambas-mono/32/development.png new file mode 100644 index 0000000000000000000000000000000000000000..0d5c9a3e5e9f576d5934366cec34672122017f89 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICa0X`wFKADB_Fc1?H6Bic;qyX7Be;o`3D&{H)@(X5YsDCEu>$7>2 z)J~RAL7-@)r;B5V#`)v~1u27dNeMHyW^p<>aA^o^&64amxrK|#p{d(}DXO4xRjBp^ z5eC*ZVY+TX4B`=6xqP`NFJz;Gt#{vr;l?EUFDGWF6dVF~xdVrhZlxA^m TMvGN3&=LkuS3j3^P6e%ced+Q~Ukf`?~~!t%-IICxnl8;&?IGjKlgZf<<9k_R+} N!PC{xWt~$(697aUF%JL$ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/directory.png b/comp/src/gb.form.stock/gambas-mono/32/directory.png new file mode 100644 index 0000000000000000000000000000000000000000..73c6150554cc667e134f70ec4a924c38fa2101c5 GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wFKADC8|NoDVkIz3-E(cOk666=m;PC858jvIJ>Eak7aXC5R07J~` ru(e8Uj4a#}Bo-zZY>|-IcYuLG>#zS!!6+vQpi%};S3j3^P6%FWFMawB~0w16fEmIV0)Gfa(s_$O?Q=(@)o z%ux?kPhmf%bwnO0neFM~7-Dhy?j%pH1_K_~%Z9RZivFM0a_ZiCX@9}eeDO~T$`|K* z+>(xFT6twp_w^0Jo3j4;1sI9VF`46(z~}1m(J?_uuSrayf>G7S{OelJ-%$;!36l$a tc4+L#s?j;6E%4y5OwMJa{_&3VPyaS literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/down.png b/comp/src/gb.form.stock/gambas-mono/32/down.png new file mode 100644 index 0000000000000000000000000000000000000000..175510cf2217f8a1a40bbd19c012a0e86f937679 GIT binary patch literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs1s;*bK&3}Om~pB$pEO7?z$e7jC$lgiAt63K-n4VlZlEAjNswPKL&I!s zKM5eu*3-o?MB;LCf&yQGt^^Cuu~3Hx3`wbLqqYj^sBF!;DrC@{dvz73fh(UtY^3(W oTT7=oNahGH;BjMD`pe7k=#O~A?k(l(fCe#my85}Sb4q9e07#}b!2kdN literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/download.png b/comp/src/gb.form.stock/gambas-mono/32/download.png new file mode 100644 index 0000000000000000000000000000000000000000..429aa88dc6c568456f18bcf6f1a8c161b14721ba GIT binary patch literal 357 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP|zd5 zC&bmgz$YOgAt@;-IXM}~fP>J`P#`-oF%cpX7Z(SY0y1J_W8=Z#|Ns9$?uHE;Zpv+X z2{co*B*-tAVTQhZ(a$ptoL6T4x)u2S?4g5l-KU$NRIm6Rm~mmr-Q*X)_1{&hK5EWn zitj(Z!Lp6#LW#v0)@_Da^I2cK-ZAgXV;QAu=?q>BiH!b|H&`VkXJjw<(e-G;(cDYT zNeA|CU(A*rl%VrL|D8oa`~H_)Gmg#BWbZifefNZ4`zQPko%6L&``w$golf@L<==C| Z>?iHkD6Y!*{{`q;22WQ%mvv4FO#sq9mizz! literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/draw-circle.png b/comp/src/gb.form.stock/gambas-mono/32/draw-circle.png new file mode 100644 index 0000000000000000000000000000000000000000..5bbb204ef6e55135bc58e5eee54b1971a11ab339 GIT binary patch literal 458 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP%tyV zC&bmgz$ZRF9>_~fOawCO>+2H|5*!>HfFzI`7Z(R4W5EEz267=FEiDbG1_+Xpk|0t* zModgha&j`zD4;k@A&3TYwS-@N0$QU~666=mkjxm~#&nOR>(7HTn%ql2-~RoQ_0=IM z>BDZWcJ^N0ce;CyJ-Dk3RDILa#WBR<^xEK?e9Zo&c>gXa#{zz@9O%z>T``l>+v7TZV#+ppDkoQ z@>o%C;o`r}OBCgI|4%;ie2(!WUGDG;*H@WdiCWpKu#0IC!?*4KIrWZqcRx9NoZ
        vh?9#9?b;#IwT5 zO_lFhk|UK>cYc(=xNcMaYn%1aUf-S_t^9nk+sOO!8WG#w#Y^MozY*TADdFM{^dy6) LtDnm{r-UW|n2NcI literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/draw-line.png b/comp/src/gb.form.stock/gambas-mono/32/draw-line.png new file mode 100644 index 0000000000000000000000000000000000000000..962020bb45d22157019c99e5f353e0c48b689c56 GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5C@2x& z6XNP#;FFk`n2?YFA>+XS$d#XKeHEyNy(Gvlm_bzH+NJEw%v~pU0EIL>T^vI+&L<}* z@EWi#;MADDP}88?B{)FIU{ykbh(XI@&4dJD1;c%e)*k$7EE8NCfqED`UHx3vIVCg! E0M+U(R{#J2 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/draw-path.png b/comp/src/gb.form.stock/gambas-mono/32/draw-path.png new file mode 100644 index 0000000000000000000000000000000000000000..c93d237f9b14084ab5082a666494c9516294acd1 GIT binary patch literal 391 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP%tyV zC&bmgz$ZRFJ~1&d0Sq9F(9qDNq$Hp?P!&WRNXEv-0!4rT$c8iEvi0@#xw*LzaUhwN zmIfq&<|HR4L)2{g@dsp_Qb~|sFvAu9>$>hmoV>potDY~{{Ct<==b1$(1RR+77T) zEIN7pDoa_o{~z6E(=1Tu)p|^TbGy)j$1JVaCMtMxs9kkDqw_BNulB2bb7w!acDemF z)HYP((+bNgrlMZ1HL1*}ginhu4lt?cpJN`b{D`IZ*hB@d4z=7f#;P5zdsjcRwmY75 lJ}>P}@>hfDtJ7H6brh-vZWhH{I1F?lgQu&X%Q~loCIDXal<@!n literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/draw-rectangle.png b/comp/src/gb.form.stock/gambas-mono/32/draw-rectangle.png new file mode 100644 index 0000000000000000000000000000000000000000..8028ecac90d81b98c6817ad4e449df4b9b56ff0a GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;I14-?iy0XBj({-ZRBb+Kpded- zPl&5~floq0!v9UKeLxY$k|4ie28U-i(tsRkPZ!4!j_b(@4a~p)|Nrm6!OX@suTeoj cuYsB2)LEg{zYGqOfyx*>UHx3vIVCg!06F?3C;$Ke literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/draw-text.png b/comp/src/gb.form.stock/gambas-mono/32/draw-text.png new file mode 100644 index 0000000000000000000000000000000000000000..cd61e2ee9cf251a52b11a83e9b4797447cb083f8 GIT binary patch literal 547 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAQ1DWK zPl&5~flp#$Vmu50*>G-XXedNDGBPp_3?SUJv@{4KDJcoAxW2wVAt50nBO^IE87K=8 z2Z{gzP%BUb!UmEMy>Jp}2oM0d(b3V!%76yKxp32BVq%a@11gA(jRler22dH${JU>0 z_5pq8S`y?J%#eQP;+bp5p1k1s>@9M^bIxpjO zeEVvcdW}rsy{V7bqD!mNp3acWx%saAu1?}ZZdubc3Q<4iz$49rbx)PgNK6XevV$<}TdU@8e6RW0( b)I8y=?^8Nmt;*vIbTNactDnm{r-UW|2cg_g literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/earth.png b/comp/src/gb.form.stock/gambas-mono/32/earth.png new file mode 100644 index 0000000000000000000000000000000000000000..f12228eadef75b374282893d574a4520594194b1 GIT binary patch literal 1017 zcmVPx$gHTLVMNDaNUteEeUteEeUqC=WUteEcU0q&YUVwmr zUteEeUteEeUteEeUteEfU|?NcU0+{cUteEeUteEeUteEe|NsB~{{CWOVqjok`T6-} zWo2PuVf_63wzjsDlau%N_s`GI(b3WI@$v2L?PO$R-{0TV)YPo3tax~MXlQ6`Y;5P} z=hoKNbaZr*l9Joo+rGZOt*xztgM(&fX5ir9>gwv(*VoO>&HerTfPjFHkB_mjv6hyW zg@uK6b#lSo-PP6Ad3kw) zf`aJi=y7pz+1c5dnVI(X_Vo1hcXxNm$;pk4jmpZ(a&mI|`uerCwP$B%>+9>m!NKtG z@WR5vn3$O9>FM?L^?iMP@9*!ctE=wr?um(sz`(#`V`F=Jd#I?W*x1;Jh=_rKf!^NU zySuxGhlj(%!;X%Q^Yio2(9pTLxoc}{w6wHpYHIuY`{Lr_c6N52o}RC-uk!Np%*PY> z0000KbW%=J0Q3CY1k5Rl0%Pg>!ahnr!|F@iIpYmC0005>Nkltp9h_B|SnX08l|D-5fL_xd=_=jA=tOJuWc z3Xl%>(jowp%{;D8SRhrx<*&Kz&tPGh7}Y0@`15x?MhIy&MP!nI(LJJb=*`BeArkcO zR>aQv`KADFawxwM7YSPYxiGWbUV+f1&|Y?APS)O(ltxO2qw& z9$CsjJ;IB%PwdA+njzKj;`N&hn7#oxwQGv6*(QH?1-$9gRl#*kqQ1~-R7sINnq%K)5v%(QD5iBZ!kwjYUc+iMR;k4qj7 n>xYYX+8qwNlXqFK@=5;(aC=h^%D@!+00000NkvXXu0mjfKPMLF literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/edit.png b/comp/src/gb.form.stock/gambas-mono/32/edit.png new file mode 100644 index 0000000000000000000000000000000000000000..32d6761f5a895af6b94ca48d2b76ae9e31652b6a GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5C@31> z6XNP#;FACb|NsBruwldc_3N)+zrN_mbZ4Lfrjj7PV1|a-+I|v1UY)0lV~EE2-isG` z8x(k418+FoY-qD+IKU(%enId~J$qx6rVI05o1O2SMHbaNeCHQ?&;5-3lR{I=N;cMA zvre24W*2qbFWh{XiLuewhLwe#wK6GUg5m}SbsdKU#zSFEJkzxuneu}U-AitLAZ1Xt oUa{7j*PDB}Y}MC`_Sbhyr`PF!+w(G|6zCELPgg&ebxsLQ0P6QucmMzZ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/eject.png b/comp/src/gb.form.stock/gambas-mono/32/eject.png new file mode 100644 index 0000000000000000000000000000000000000000..d4943dd5239faa5a487875359dba2cff2c92a093 GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wFKADB_VBkIHK{8N~sU*lRn4w{|wx0x$=j!R=7$R|b>N!Kv0|q?I z7fTE~7I4Zf=Iqe3n^L)wWx=(Q!}2C>#pjETl%2UgF_p=Q(Mh;P=#+~_UXI|xJ%RT3 dKdhDRmEFmsf3aeINe9qC22WQ%mvv4FO#rM6IRO9w literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/end.png b/comp/src/gb.form.stock/gambas-mono/32/end.png new file mode 100644 index 0000000000000000000000000000000000000000..81b5096eee04fa42254d8a850b45b08d1d54e088 GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wFKADB_VBkIHK{8N~sU*lRn4w{|wx0x$=j7?)7$R}G_xwW90|6Y) zfo`Wecm$o7y)j?^Ncq+ZZ3}@_|6D>n`J^OxIvkjr83i*E47lSC?-H+)y&8LF^`GD8 a%H`gB`{aK)pwkUBjlt8^&t;ucLK6TA_c&ny literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/erase.png b/comp/src/gb.form.stock/gambas-mono/32/erase.png new file mode 100644 index 0000000000000000000000000000000000000000..baaa4705cc8cc343952d474c46adbed1d63190fb GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIID%0X`wFKADB_NZ{q!eINr_N`m}?85-&xdhSMU2J#a;T^vI+&L<}<&`J<- z5EdwO34ZXXX_d>7qelgO8CMAjPH0e`#gxLhfk{PoiMD}b@PPv@%MLU+vR-9TpCBZn zEz;l>u!cd)vACJ(f{X~GI#0j!18%7^2M%+@o#9v@z`$_ipv3C)GhID_b}@Lm`njxg HN@xNA3(rJP literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/error.png b/comp/src/gb.form.stock/gambas-mono/32/error.png new file mode 100644 index 0000000000000000000000000000000000000000..a7ce8a462d23bc025c30ee47645c7ae349e60b85 GIT binary patch literal 357 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaNb0(?STeKHH<Uc_J{3$AM$>6N79vf15kdUr;B5V#p$(^Z}S~e z;BnYlb|-PozyIr{0>vFYOm9{yePOv3B(YmSP$6t-R*QmKVlJP}M7REry~*tNfBncS zJn&0z-3RWi^>gwIn{4wh$}Im-zKl(LM)=?3UK7sOvBXT8#gNT7OW?Xwrc>_g+YYx& zd;_u-|Eo<1pWrzubyBa;qzu!a5nqZYGasHYzjx06^o*Aqm)oCPEYI0>`lhJIqf`2| Z?6t!Bj@b=0#X!e0c)I$ztaD0e0sx$qi!T5G literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/exclusive.png b/comp/src/gb.form.stock/gambas-mono/32/exclusive.png new file mode 100644 index 0000000000000000000000000000000000000000..50e4d5d0f0bbd20fc0c97b9ab5c378b68bb1ef36 GIT binary patch literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~q2Ka=y zx)=B)BqSU-aG-V(d u;&DhbFmPGBXbz(hU#sIbX~REVYz+3Fy}4_(CWQd?F?hQAxvX!lvI6;x#X;^) z4C~IxyaaNL1AIbUeKHG6N=n|ndskjwo|Kd{d-m*;Cr|$W|35xHe%7p6%a_!@pQ{w637-Dhy=;TPg1_c4#KEYw{&s=+mT3?vlIgLE=?h4_tB?^4G|0X!z2=a!kfR!)@D#mX&s_8FvJH z8DyEQViW)DWN4YMmpgTe~DWM4fTPScN literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/file-manager.png b/comp/src/gb.form.stock/gambas-mono/32/file-manager.png new file mode 100644 index 0000000000000000000000000000000000000000..86164bce71553de89453a0dcd0586f675a74e98a GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?smO1^9%x`eYWy$H!ZHAI$?vmjw9*GdMiEkp|?5d%8G=a9mGLXkh;Re+J8@ gH~;OwC_i9eSn}5U{)YML@jxXEp00i_>zopr06kDB!2kdN literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/file.png b/comp/src/gb.form.stock/gambas-mono/32/file.png new file mode 100644 index 0000000000000000000000000000000000000000..d05fbf1b04342c6f0f912fc4b26fc9dcbe72e6f3 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wFKADC8|NoDVkIz3-E(cOk666=m;PC858jvIH>Eak7aXC5R07J~` m0||^m$|5{%^2~>qO917b1w~$|Uk6mhz~JfX=d#Wzp$P!LH75W7 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/fill.png b/comp/src/gb.form.stock/gambas-mono/32/fill.png new file mode 100644 index 0000000000000000000000000000000000000000..48231184df3f9879cac0cfb619dfe013e62773a0 GIT binary patch literal 313 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIC~0X`wFKAD9H2?_i6?>}_t&;b|#at|In2;)KN`1tt62l8Bi8hJ~C{DK)8 z8niZj`KYns)7ST(pDes*3Y3`W>EaloaXvXgLCAn>0p|%@m*5ZYWLF98EPpSzNYf!y ziCw7T#DS9UE{sl$9-Z&*zU5#QP&J<*(lGT7(EWi;YZ%lR!Wqm&V~@w07$0OhvCWBP z!W~w@hMjXB>iIA{GvC2*<~s*t#t#LS1&SRi44la-j2sF&8@|1}yIO;3U-|nuM?r(# l)#j3}4L41XG<0OJGb9+zWB9=@?+bJsgQu&X%Q~loCIAjLcu4>N literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/filter.png b/comp/src/gb.form.stock/gambas-mono/32/filter.png new file mode 100644 index 0000000000000000000000000000000000000000..00be9c46aed88afae583f5fa929732c4662acc99 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wFKADB_VBkIHK{8N~sU*lRn4w{|wx0x$=i=$&7$R{wIYEJG!&;_h zPM#itHfCmLv5q*-DU+EDryUUSWiXOh=yjkgtciC*lLn*qEQT}#r>P90Yg=wD+M2{5 c(ZaxRMMU%Lj^AHHfaWoHy85}Sb4q9e084T+k^lez literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/find.png b/comp/src/gb.form.stock/gambas-mono/32/find.png new file mode 100644 index 0000000000000000000000000000000000000000..472ad9f4579bf79f5a06b2b76f7aeee5287afafc GIT binary patch literal 402 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaN>1AIbUeKHHaYHBK+y}oYBGoTeRB|(0{3`?K#Xfsy)4tLl5d}kp$+ucPc9ICZ${W;G4@0sGc zS1dqv8$DedLo80;oqUt8SwX-xRaQ{+`_jGt|IfWzGEw2G$;Xx7J7-%S(3z>S)8o_? z(ZEn?(f)MaxU5YPd$vA^vQjr~&sF}ed*hD{7u)V?XVZk)$ukbw@ch_gc`%V_LEE>r zZh{P=OY&7eF(_EvpSB>r@v^?(9B{?E*)W_YR}AYW6lDJ3)b+|}>=mZ$k0Y()1kDrr|RyM#$J w>vJnH&P`~sT&eFSA>1H%h12cA(!G_8d%uh4ZBOF|I*ftA)78&qol`;+0Cq7yM*si- literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/flag.png b/comp/src/gb.form.stock/gambas-mono/32/flag.png new file mode 100644 index 0000000000000000000000000000000000000000..329bffd78efaaf917f75ccff262343fb5cf45998 GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wFKADB_VBkIHK{8N~sU*lRn4x}~=EA8!o`t82V~E7%T+Vob2GaNS%G}U;vjb? zhIQv;UIICs0X`wFKADB_VBkIHK{8N~sU*lRn4w{|wx0x$=k4j@7$R{wIbng6Kte(S zqp^^LgoUHYVJ$8j=-Xk*@QalFS1d>$)PHGtxBqTH&s3}MkXzoaADcjLl ip#5N)(i}%o28NsrSxYsBTib!gGI+ZBxvXNS%G}U;vjb? zhIQv;UIICs0X`wFKADB_VBkIHK{8N~sU*lRn4w{|wx0x$=i%w%7$R{wIpF}CgzN&I zZJYsZSA;Z_vsFV*t_l@!%~>7hDB`&`iZyV`)-2Hw!Rt(HRfZ3y9h%EnE^%jN!Exn1 g%-NS%G}U;vjb? zhIQv;UIIBh0X`wFKADAaadH3u|BsK4fAuZr2vD4ji-xah{WaO zgaZtJ{yQFEJhp=&X-(ADtiR$CkM&zN*4qXMPAOzO_M@SBBUdjY+Yib8VT~b|r!*#N bvN14hid-NVduDzf&>RL&S3j3^P6(HvXH(M&rd3T%E10x|TvtS0IdbvLfq=$Dwl>`o4#OrxcMb*y Y0bRRH*^Z0@K*Je4UHx3vIVCg!0MzSIl>h($ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/forward.png b/comp/src/gb.form.stock/gambas-mono/32/forward.png new file mode 100644 index 0000000000000000000000000000000000000000..dc412e50f673683c2ec569085d83ebfd9b0a6f1f GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wFKADB_VBkIHK{8N~sU*lRn4w{|wx0x$7vkyS7$R}GxBnpT0RtW; z<5})s1b#kQw#Jd`)q2v^q~6BloH>sp$1>bdp(Dh4kGOWUOx632k%GkCiCxvXpCgZ7ib%Ur>mdK II;Vst0NpQ2YybcN literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/gambas.png b/comp/src/gb.form.stock/gambas-mono/32/gambas.png new file mode 100644 index 0000000000000000000000000000000000000000..fa37b3d8cb01f79bac6802b69e81d0dbbd9aa6f1 GIT binary patch literal 935 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~Ixyacji0(?STeKHH<)oxK4rSc`u@v=>(6%m^tk=i=+5Ul z_A5Rg{(UUSd-v(>56>{c(16Fmwl;jci%w-k?Cfq>@{qY}h3NK;7vv7~sHAG?EZ6>% zG`T5#ecSQ;c*&cV=a=o3PwRa(ed4rz=XSTR<|?@w)o1lw_(r%;zX{KF6JRuFdAc}; zSe!l^99n(IL12%AlT*WjR;R))@s+zl;NJiL``)#7UwpQf|89FqS=zgAn{GP4kZ&yz zoVsL1^+|`k)hpgkI$rc)^_*qvt3&^Ct$tXn^@i_#-~-ERt+OYsWVsjgYVzM)`S|rW zbsC;l9_pOUV7}s@?-zfz$J1+s9`FPNUryO{eU;~cXUg2-lUKE_T;SU= zS;9b#U-Qv|<1?4G?Z`>s_`1eEFJ=iFze?&6!!qm7OU!$MY$r54+3WEjy8YgT+ZWoS zpPmU@b)B2-?s+pFu^getTb!oPJm|!$tM+TcRH-JlHn}C)!B&eoE#qH_#qoXJ|K4%i z`FS!s4c_nFSH0ri;u-QQW>|@}Pnaw8V2SHz%LK8lJ2f4o?5=$>iF}`6+N9iTbt5$G zaoe23TNlXt?hHgU&IV#v}XZY=N*p#hhW$bl(&Cgw0 kpf0oJD=$ZVo$7wZcRri^?F>qQnTvtJ)78&qol`;+0RJM96#xJL literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/game.png b/comp/src/gb.form.stock/gambas-mono/32/game.png new file mode 100644 index 0000000000000000000000000000000000000000..35de1a8b3d8a73abeac7d416278a53d27db0acfc GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5C@2x& z6XNP#;1d@YmjDCt@$o?B|NsAIa4wYts$nY$@(X4N{9b>kdrdz7U!X{|r;B5V#`)v~ z1t9~gl^hE=T9z(dx=6!=nJGn8M}d)Dg;8xn1Ct#ikFG>pQbhMlgSIUuY*O3?%N-jT zLk{q$P3T$1uFVdQ&MBb@ E0B+bnZU6uP literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/gamma.png b/comp/src/gb.form.stock/gambas-mono/32/gamma.png new file mode 100644 index 0000000000000000000000000000000000000000..76cf80ca38a35d3364e285de22e26dee6acf3888 GIT binary patch literal 368 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP_QV# zC&bmgz$Y{`G$A1&EiElJHnzUL9>|T0ivx-{I5^RCIJS z&@hM^pcI?|QI?#XoRpLVVMEmayi@TDs6n+P$S;_I=NqdI8*`2Yiz3r6?Q53Hf=?Q2 zCCM(BMl?9M`bCCvcI(DCu*wK5Yg(lv#(IW>mFLo=M>DuACW?5h-1I11;n<!lvI6;x#X;^) z4C~Ixyack}1o(uw`eYWSrKQEgKvGgtMn(pZH-G;8l9G~ygajZvE-ns8CMG5VNuUUX z8yg!7aOyPz1<@n~$jgVj!|na5h9Snihyfa5X^RL9Bp#A7VR17f>185Qs*I zEKnTIfUqI55M$A#;EEyQKm#FWLKH*77Q#j&k<9^0K>`y+?}zWVfQevnNswPKgOG&? zhd3V#6I)e=uYf#{x9K0%?1JuTUcVX)^(OQcav7IQD)z`yPS+8$i}7FUmTM67O7gX9 zXn9C@{QJh(vi`^ui+|gvN?%Hey6|*U&y3S&7i^pT>G`?!Z8obupImZ%=FT^}o+&!- zmHjrw@tygVb@MuwU3`19W_seGfcl3=Hy&F)_wbR;Kku#FQ9C)QYq!P*t;a8#4_v;p zrTycIC;uK;RpzxEUv_s39|HqZtfz}(h{fr(lS9j;4Fy_{cSji;8wbm%9WQ)j0AxAe zo-%Xh$@(p`ORM|*7x>Q<&n&U`EM8*G5H7Um$AX=?3pUMJvQtEGhJ!``U*!Lnc6Hak zX8$$MyLr{AWR~`nU!7Mnj{8nkTCTooH+S3Aqf0+dC~J&fV6d=EZ=Iz5L+>4Xdg3i2 zotZ9lF^CliKACVv!R^3}Gpuj*_%?iSpR~N)cD?++YeN4FZEyZr_)3)__=B{MxpfllHVn}O^)cC@+kS~vE=6ZM5m(4s#7u#7!Ix8xBjvyW6BY`U}xW+3;pj6 z7p2{e+BE0n-YYo)e;+9FABa%D)}GoBv)`9ROFlQ|=zlxYN0L>i1TK87Sx_LBB4ys? zC^F?z<^8WGPSiCzpE@^VLBOFk(sg0sRi8`dN7fKn9RZOiTnS0kVMrA_!!}#l^w7aCUutJy1bzZZ1#?s4F!! z705_RN&=Gq|NmdSc=6GrM~jP#^YZepUAuPV$dQzkl&@dER#sLnTD0iUp+kocA8u%9 z`2G9$vSrH_ELbpg>ePh`7oI&4GBSYHy?pud z&Ye5!)~)O4=s0`!?97=nCrz4ER#tZA%$c5^o~EXzef#!3di3bPfdi9bPMiUHL#`yq zFPP!Z!sD8s9e%qr9#FWu=!8$gmjw@c&$9KgtDaMfjT4w`;Ksnf$m8ka7-DgH?c}R@ zhaE&*lDiahol|ERvffIVIrIPj_N-M}xp{A=pSkQ+TvA?EvOO$%n^Z5?f~%_-tmbkp zxUKvBwZmSK4-D&T97Lw}eK3%k+H2w9;&$Wz`TN<*YROy5Q|hb5+kHxUdVK|N9GWn* zEn@l~wO`FL5??OHeDUSB6?=8iDD-}8^ZbbE{o6D71KgtmJ%%+j%+pN6*2OuOpbBC io)djpwtVIOpX^gUsvfnISkMj(K?YA(KbLh*2~7ZRB^l5F literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/grid.png b/comp/src/gb.form.stock/gambas-mono/32/grid.png new file mode 100644 index 0000000000000000000000000000000000000000..ad8f97cf2ce0f635bc192c71b72d9c84b8130be6 GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?smO1^9%x`eYWy$H!ZHAI$?vmjw9*GdMiEkp|?5dAc};a9mGLIKcE{CV!2C e`UmD&Ky58nqLK#33siwB7(8A5T-G@yGywp;C?t0P literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/group.png b/comp/src/gb.form.stock/gambas-mono/32/group.png new file mode 100644 index 0000000000000000000000000000000000000000..474680a19de4db1aea2994329d1d0fdff63f3cac GIT binary patch literal 830 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~Ixyackt0(?STeKHH<;^HDAB7o$90|#PbV=8X5`|Ie73OkPQ@s zkPya^BS(N-Ac&8Thma5k(2#_L1R&ek*chl1$c3l}ssXa2qM|^04jcd)3j{z0#2la+ zAb0QHy+Doo_U(hHOiD@uT7Bls8K5$tI8edWt5<;}#6XBeAhTd@05T#YBOz`Es)1+$ zk`Mq?pOcdVQ~-1yL@!Vrs3kEm5h#+DmIkza%a$#3=FG{>&E39zdwP0$YHDhEdHIG7 z8=9J$CQX`DP*4DLQeR)+^y$+lOqj5K{rcYC-s0lo9XocEmX=mlR<2#UHYFux^PMmA zfx#VG666=ma8K&nyPBInYQ+Ds{VV^j@u!93qTIr^pC5mGIJrOS7HdNFif_NO4Gz72 zzH+gihKKCy?84wS1$4HPutt?EnhVx7INq*_^JS- zP}S4LF~s8Z+RLuxha5!O5>+NJ99{bE-MhFIyYDQya`)^1e6GneAKpuwR&)EiW#WuE zJ7QAflxBIpsxlJxT~V#IZe~uD&C*wmB}blgFJa~q=$l!zal_{Pb+a;NeHLu~xGo=N`-V2m($y85}Sb4q9e0CL=!1poj5 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/h.png b/comp/src/gb.form.stock/gambas-mono/32/h.png new file mode 100644 index 0000000000000000000000000000000000000000..f499b0bbed62511baa86574535c896f0badb75bb GIT binary patch literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaO00(?STeKHG^laqskgBLGeTwPsVUS7U^`}Y6;|HsG21C=aWwrt6gCI0^Y z3l}cb)z#J4*AER1jfjYd{}<2&GOi@ZFPOpM*^M+H$HUXbF~s6@a>4?p2M3rtLJ#yY z^LVoEvAN?RBF4IAj*f>&uL#E`#zqD?)_{g+Mtfy}4;QaYoT8PG_Q+{bTUOJ-wGEf% cxGFL*{Pq;H*s$I)5@;rar>mdKI;Vst06i;CYybcN literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/halt.png b/comp/src/gb.form.stock/gambas-mono/32/halt.png new file mode 100644 index 0000000000000000000000000000000000000000..b7cbacb6d4b97995e0ab04c1440a5de682deeef2 GIT binary patch literal 381 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP|z>H zC&bmgz$ZRFJ^>6MjM&)N#Kc6PKyq?2L>x}SRYF97T%a0=Vu;kEj}@PQCQFtC`2{mX zui!AApji1&=j*ShPZS>i*!6wqZ~2lh#mmn8?*uB^;OXKRVsZLx&`Ggo1%Y5O!8;BC zr~m)YxIa6yQAzjfm1om@BA7B~{dZD7^Wsj1OSsJWCExkKq*$Miek#1eZ2o(@!}HdD zSKsr-aP?-#vz?6#wiUT)K9-X7{PggzcxQ;-4Ao_#JL2qi#yAQbOlbJLLzVp?n;ld7 z#RCpAn92`ingj^6z308EylVQ98CJ)xM4ox&96Ep3O|JQ+IpOQTpRrR{zE?D8S;`7=TFW9x}Cw()z4*}Q$iB}l?R?x literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/harddisk.png b/comp/src/gb.form.stock/gambas-mono/32/harddisk.png new file mode 100644 index 0000000000000000000000000000000000000000..93a369fcc3bb8dfcd7b42ecae563ea6ccf0063aa GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~q2Ka=y zx)=ET|NlQeKHmK%dmvDdu_VYZn8D%MjWi%f+0(@_MB;LCf&zEJTBc@J7D?~L7bK6o kP&&fF%ACR`xa$NHgMx8HupH9?GoW$?Pgg&ebxsLQ046acSO5S3 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/hardware.png b/comp/src/gb.form.stock/gambas-mono/32/hardware.png new file mode 100644 index 0000000000000000000000000000000000000000..039b2f0ea02540edb0e03a34c8c544fe598c8c14 GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wFKADB_@$vuv|9@q=hzX>kB*-tA!Qt7BG$2Rc)5S4F;&O7r0fse4 z44e)sFxV^STwOI)z%3&~rB}j0yQ6@gxy3DwrGY_+8ECEN1#{b~J1gaZS{XcD{an^L HB{Ts5DfKNQ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/help.png b/comp/src/gb.form.stock/gambas-mono/32/help.png new file mode 100644 index 0000000000000000000000000000000000000000..9af5e040850373e7ad1a0fd0ca627befe8134b07 GIT binary patch literal 607 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAQ1EFIy} z{{8*?_wnP$fByWrbm`J_=g!@@abxk~#X!A4GiT49y>sWz>C>mbfB(L#t84P)$zQ*I zee~$j)~#E!va;^qzu(c(aq{HJva+()*47OhHavUwY}vA9t5&T_PEKxbZ}0E#KXvNV zym|B1uV24#;liGto*g@Oyn6Mjw6ruOCFR746VIPNf8xI}4(K(Jk|4iehORTWKQsMd z(M*2j_0rD%@Ne%!cQi9ON*EXz#XMacLo80O4ZdD<$UtBV!|ff?&&8b7_kO?k`hR_J z$BD?J^Ae2?+g0odFLBjA9;tXIBxT|A)|no6rMAnj3G7UJaQk0bGmpuwW&1BHaj!k` zp*p1T`o(kMKkr(XxO{t-msRV_4gWJ8&k;0IFg|Y0&i7;g1jdCA>m?H2w|MF>_o&A5 zHU6FSbZWytYXe1X2mOysHJK*sOn$Q2WNtAyKId_z+3yQ048%i^CI#jNN5<`6K7ZDR znAe*+mK~Ux)L47hWq14XT2<@)eg+}R6307Vsfhn|-*P&2|DT6{-YE;Z&Us#_C{#Yx b{}+3oiwR4G%5G0!2r_uO`njxgN@xNACSxba literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/home.png b/comp/src/gb.form.stock/gambas-mono/32/home.png new file mode 100644 index 0000000000000000000000000000000000000000..c080e428c674c81d44040a64f837eeca9a9cf802 GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIID%0X`wFKADB_@$vuv{|A!$_wU~>dC~wV#Z(gH7tGKwTiZ_p$cyoGaSYKo zpPZl|X27+8lS6uurh%DTs8Y_OoQ_ooJXu{kH*`)C+9b4qNmVsPRe|+{*8#2xQyoMU zrZ|WyOyQ8$c5K|Jcx7S%;|8I`6vhrs4#pL_&XEj!1)LAq8LpeCuE^QDWIE6u22WQ% Jmvv4FO#n7@Kp6l4 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/html.png b/comp/src/gb.form.stock/gambas-mono/32/html.png new file mode 100644 index 0000000000000000000000000000000000000000..a1e57dc6a9fca84ed5de0ec266042a3fd3b50302 GIT binary patch literal 488 zcmVP)UY%*@Qe!NJSR%bc8?&d$z`j*j{H`DA2dkB^UccX!s-)~Ttf;^N}l z+uLGdVw9AW^78VQmX?>7m;C(vx3{;{)YOualAD{G$jHc_pP%61;9y{2tE;Qt-ri+p zWss1NiHV8z_4Rdiby|gh6aWAK0d!JMQvg8b*k%9#0JTX(K~y-)-P1=7gD?;UP$0(h zodD^*_uhMN_rFshI}$*V$R_!cI&?L@|`wK0J$&hfa^G1!i-4n5-q~U7&^BB6*%6kE&@U8?CAhd zZGbH`oI`u6BSSQr1)wSHrAZ#VV?&{eS+>xtafe&5t-?w5q# literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/hue.png b/comp/src/gb.form.stock/gambas-mono/32/hue.png new file mode 100644 index 0000000000000000000000000000000000000000..336aae159182f5e083e832cb746f59eb63c53ff9 GIT binary patch literal 515 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP;gOz zPl&5~floXbBqSsxCME)zKt^nAERX?I0%QXLL=c%B2L?cqq@<+O)KrKXp!VF{Tp+u? zz8<3G|Ns9B7Ayd&`TO^8W@hG(A3x^KojY;j#M;_gpyGM+=GD~Hq@|@*RaNEW*?YcVsU!yY@V4bMVfy?483%4C|p7&a-jl+Mr zKy&=h72Uka(j~`V)tDX4Ivug+P|8A)X&%C5>Yj$-Pwl#7t2b#sIBi+F;r_ms3jX%4 zowpDDl-jd%PU6lchY7Mx{Ovq00#+K#eL`&tCWTL0m3>|`d3;$S^56?G0DD9Z&rMLx%^dkVQ1p4ZJ7e!*RTJ{RxhtC{Vm<^ Q5YVFxp00i_>zopr0Gu-5ApigX literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/identity.png b/comp/src/gb.form.stock/gambas-mono/32/identity.png new file mode 100644 index 0000000000000000000000000000000000000000..487fc1aa6a60668d239de8891037e7bd5fa37de8 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIDN0X`wFKADC8|NoDVkH2*3(&EL78yg$9Y}xYo@#7~?o_L#XDFW#!3GxeO zaCmkj4ao8Fba4#PIG>!Lz%wO);U-g8lhX>OrluwhCM^d>^%Ta^1rEZS8l(agIM+*_ za$r?f7ps}f8fr1l%8DrLuFaf>-&I`wRoS0e|7z{HF%;wjeS`9Rp!PC{xWt~$( F698ggMQi{7 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/image.png b/comp/src/gb.form.stock/gambas-mono/32/image.png new file mode 100644 index 0000000000000000000000000000000000000000..8b90229021d30b364b77c73e0c3ef9fe51c4cc4d GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBn0X`wFKADC8|NoDVkKea%UuI_J#*G{29y)6PQd$z^7tG-B>_!@pli=y% z7@~1LIYEJEN&rI`qoayLFk|3!hmb}E)zA<|byZO&CW$Bm9#-Z=XA?%{)D{Mhpa{>C z0(uOSOoD=f+Bh3jS{)BE3p031DROcgW){#&Xwh5X63~#)A=qQ-#K2JVR-^Tu@xGID=o_J+JsHK9Pn)~d#&sB&#%A6xrbkP z8Tz_5`g%h9)LpAt@7Vple~ov;daZpI<@?>7FCVX8KJVu%K?9bzvCo$OR68K-Tm4O0 z>8}5Sxrf%MXq=L1;O7eU?9klIyiH`8s^ao9TsMLxrm&d3WWNzGgX56?1`(EN5zO^Y zO|xSd?l1C``Wmibv?PJD)w}897cE7O(W$s|EBwgQu&X%Q~loCIAv7?8yKC literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/indent.png b/comp/src/gb.form.stock/gambas-mono/32/indent.png new file mode 100644 index 0000000000000000000000000000000000000000..e51a1ccb3b8730e67268a30c307fa152a388ab39 GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~r@&x#V zxVjhkB!EGDd^~%7)JmW@Q%R6tFhj#^Z9fSh&)(C;F+}2Wa>4?Mg0)dwvlyAVdk%67 zKQC`E)H@&%pU|`4;8;Do#A7BGYoWu8u^+{Gm=nVe=(bunGj=*MGB7w*$UMEZe$yPF OQ4F50elF{r5}E)X<1hyR literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/info.png b/comp/src/gb.form.stock/gambas-mono/32/info.png new file mode 100644 index 0000000000000000000000000000000000000000..f1697b64d74434b05cbd9df1710b6c41d9829b33 GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5D99h+ z6XNP#;Pe0g|M>X$oSd99XU<%mx_%B&im@cfFPOpM*^M+H$IR2kF+}5ha)JWSlmLb> zMn@Hgi4B`MXEjVTQe@=OWyxiZ{NPm%*>4&H%gu^RRt9}fmVZftBUkO^c!M1Zonxw$|#P%%Ub$c~GPOG-)t zia^vrM1X=04i3@L(QsvOSs(+b9;g5!0$~6h2;@Q(Lqrl26OpyRxj@GN6~LVYQ4AsB zCO~8%THsP}(;z0mxo`y#^*}cO6#!ihQ~(qK%EIjeia@v!5g>`|U|`_D%>**wx{{NV zfx3VIq8+Zr>tgsuptoyEg8YIR*tkwGGyVP7!2O(K^-WIpH>^6hj?CiaziK^g?gbV; z`}co-{XYImU2orOwV#Yn&5aE&T0Q*nVWQ}H?HTP33;kBjzG1iC=27cnr)!p{f*YOR zT0Gcv@{G%q>qc`l4P?$~2~R!ic6hI?#4`cKJ7zC|n)VG@*x9(Hs*UruVy+8bi**>RWiJq~ zyWeUvX+K9pd}1>gpMBzudVBBTF|o^!oF?)t-zsk2HSf4>$jTK3MV-aE z<#C#?IFdy-+kBUQz4X!7?{Ym^(E+n6*A+hfHCd$daNm13<@o!8uJ5+5Ph&`5^p1zw z+w{Ktu73+TL%;nrp1t$fiS(zhm;dcwx@Wz-zQodK!$OW)4?z1~Clz~$e`(za(* z=S9E#b*)rsR?+X6YoAzq9{Q}{YyBSfEbyu?M}k*u)THORyf-?oitg{>xwKh$I*-=7 zS3jO@TfxFMA?_)ITI1O_@7QgmUh}87NgNQE-I@IV(AQb==XjXC*x2(Jytc@svzd3r zP3-U$6k*po$0PcMWA<;i7m4epuCg$ma51L7M$U9P?>4=kYBPE(W6UPFxb8Q8u|`V$ fr_8@c?*G`@PIOF)P}-gWOeGASu6{1-oD!M<`c$LH literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/insert-text.png b/comp/src/gb.form.stock/gambas-mono/32/insert-text.png new file mode 100644 index 0000000000000000000000000000000000000000..23db48b0d1d539f5f9bcbcc5ff6b9bddf66369f7 GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5C@2)* z6XNP#;FFM$@c;k+xVX6Z_;?_Ltz&)xV8ye7!IfbN v7)LU!VE|#xMRN{vO<>_Uz!lTcQO!`_RB&V0zh4GGOBg&|{an^LB{Ts5Ohi3- literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/internet.png b/comp/src/gb.form.stock/gambas-mono/32/internet.png new file mode 100644 index 0000000000000000000000000000000000000000..6e479762e5cbb71c45547c471a3d1b3f84622730 GIT binary patch literal 839 zcmV-N1GxN&P)Px$2vAH^MNDaNySux)ySux)ySux)yu7@-ySxAY|G&S# zyu7@*xw*Q!y1Kf$ySux)ySuu&y1To(ySux)ySux)ySux)|NsAAUth1Uum1l2y}iBh z@$tXEzx(_9jg5`g*4F&|{N?54`1ttr^z`!b^7Hfaz`(%y`T4`c!}ay`$;rw0_xJDb z@4mjiyzcJq&CSi&*x3F3{qXSc&d$!&)z#$WU3i*Vp0U;nC62+S=O4$jI&O?a$B8$H&LY%F4{l%*DmU;^N}2uCCC~(3X~#>FMd7 zo}S#?+~?=#%gf8#+uPLC)WN~Q=H}+$;NZf-!qiF&5dZ)H6m(KfQvm#m+bPWR0t90| zNfHOn=_xEl0RR92y-7qtR5;76lh=0QPz*(}2^a%`By;4rjT^m(UQ$T!ZDx|0 z|NoP@u3)b`MsIhWy(C@fD3$ug5Q==M%yH!sUlhKObK)ML-QTvrA}!{U`c4Mgweiqt zxBs{VGCOg7H;c>PXA2^dCqS(WWD7B!!%SUh7Rht<8mp_THwE18R{kt{b*g?`tcTN6 zC_N&*(nB_?lFMLLC#q_S!m2MVn^mIv44JS~5v>Zz`n%WNEt$5iGosRh82o>)+mp@C z($n$F?wnr?nmWnH-LyZCBBqXMb$$Kk^Gkc)IUk%f$(bVW0Xz)-vk~Z$bm*pcMinv* z@E%ao9ws-D?h{_DwF3_*-!Cj>qen#F82|79?%&8>jW>Egm?sMMeE=(+)H@~81LCL= z0A(zj?ENZ9F~U5q!7oulHqS2L|lWg R%9{WH002ovPDHLkV1mys)|>zU literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/intersection.png b/comp/src/gb.form.stock/gambas-mono/32/intersection.png new file mode 100644 index 0000000000000000000000000000000000000000..ac3a6ae8181b94acba94e3cb5e96d2caa0e90066 GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~r@&x#V zxVjhkELgB0AtB+wfdiSUX%m3rj3q&S!3+-1ZlnP@hMq2tArhC96Amz}S?D0paEO6( z^1%mDTeCDTFr*y&|DRhzBfZ6KZB*+ah1Px#_E1bzMNDaNq@<+c;^Nxc+6M;*@9*#a{{H{}|6gBU z0002!=;#m-5G5rgK|w+M{QReFMc)hKA$gwqapmF)=YCBO_8$Qkt5Y%F4>Uy}f{dfNpMXH8nM8XlV8I z^+-raK0ZG9`1opSYH@LKgoK1tR8+^u$FHxi)z#G&78Z<*jQRQbdwY8b2nY)c3)k1z zv$L~LPfso`E?{6_O-)Vh?d{Ui(%akHh=_<@US6M{pSZZV4h|0X_Vxq>1b%*g!otEW zEiJsfyzcJq0|Ntnf6{OO0004WQchCIxtYAtXnqjmhkOf&k^cnsv7KnNo`_Z5d!UDbj*ugy zS>Sp*NUp^cB^Eg0{1{wTM}YzM4%k*pvh&Oim))a+xn^Mknr~(UpcqsD-eh`$t#e4! zZMKn8fH3k@M&IH@PkyTczXC*H)=98Y1J+JU%L(u(fG;lZCrNzfxhS|_N@}CA1Sb!n lte6XU|M*f002ovPDHLkV1hKJ{MY~h literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/jump.png b/comp/src/gb.form.stock/gambas-mono/32/jump.png new file mode 100644 index 0000000000000000000000000000000000000000..32140f457a58372daa1ae93ec9e03624bbef5d41 GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIB10X`wFKADB_@$pGXNk9?^;=lmNIBTa~3sl2i666=m(4e*H%g3**$xh)w zp-fK~#}JM4Q!gImY%t(yefWSya-q1nfb0R@n1jvF7kyZt&${rF%VJBreamu_zAcPt zUc=}W&?Gcv0gI}JBd2=iFUzY7CWtMQ5-~bZ#kom$!(P^^C)d90*d~4X^I@A`bKIFf hWt@=HJ@q#Jt)QXB@19$GPXR4u@O1TaS?83{1OT91SU>;( literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/key.png b/comp/src/gb.form.stock/gambas-mono/32/key.png new file mode 100644 index 0000000000000000000000000000000000000000..c882374645170ea9f2e2090a4ef03b706f423e79 GIT binary patch literal 287 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5D5w?S z6XNP#;FACbiHV7!p`k!#Qc@C-4HtwkfaJG`&V@i-yd^Ym%@NAPq9vuY?Ty4!WH{@0o0bRr3>FVdQ I&MBb@05XeWBLDyZ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/keyboard.png b/comp/src/gb.form.stock/gambas-mono/32/keyboard.png new file mode 100644 index 0000000000000000000000000000000000000000..b00920ac9349eca3ca2938393be9d68a63122665 GIT binary patch literal 439 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP_QMy zC&bmgz$XC=;^X6^qoW~gAQ=}I2P6{{6H`)BAPgW0R0AY|03rxfQ(s>X5rLCQNl8F) zpvutDP>3KzS5{UQP#h==6a*RzSO5S2{{{nh9-w=)N`m}?8J?zg^W}d19(YJgd{gJa z-~&N2UD7NLUn>61;nkbXT>kg+dLBppOY1g#{BK*91k|8ShIF7M6b V;J5aXr8>~L44$rjF6*2UngAg-r9l7y literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/lamp.png b/comp/src/gb.form.stock/gambas-mono/32/lamp.png new file mode 100644 index 0000000000000000000000000000000000000000..c2df7eb09bd71ff0caa7f08fae5b1161ab53c7be GIT binary patch literal 372 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaMW0(?STeKHFZ5)$I#;(%mqY-~IjgocI!xk*V$4Gj%Ifs~XKh#DX}CME_* zrlq9;wSd)vM1U%R>`$LQ{r~@e(xgcU9fe0F302L0Dler?ffO-^Ak`gljS(T~NpF^+|~ saW{t>)8btk@_s*6E#8a%Z;1cIFfUnZOQVbm(2)!bp00i_>zopr0Lv$j4FCWD literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/language.png b/comp/src/gb.form.stock/gambas-mono/32/language.png new file mode 100644 index 0000000000000000000000000000000000000000..5cb2f6300dd4f506a90aff1edc71b4dee6bf8f4a GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wFKADB_VBkIHK{8N~sU*lRn4w{|wx0x$r|;?F7$R{wIpF|9%<2OP z2LqBA4z8LS@O^z0Q?gHkq09oF8A5Cj#Ll*cf#KE1$W$<+Mb6Mw<&;$Vb Cr7n~J literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/last.png b/comp/src/gb.form.stock/gambas-mono/32/last.png new file mode 100644 index 0000000000000000000000000000000000000000..accea5db8beef9f01a4856d8efdce1f6f73ec02b GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5D99h+ z6XNP#;1d@YmynPU6B833AFs7;(nFvWOG%JlFvGuw`tKjkECcdGJzX3_G|nd{NJJdq zQDYTk>S0s3#Hx5esYmZYMuXY|Ak7feq{I-!BvjDIyg(>~aea)D)r#08cY+zf7sV#Y4H8-D^VVDNPHb6Mw<&;$SuaXOs< literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/layout.png b/comp/src/gb.form.stock/gambas-mono/32/layout.png new file mode 100644 index 0000000000000000000000000000000000000000..3b252443a447deb144b4862f3538c60c58bf39ef GIT binary patch literal 410 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP_Q?^ zC&bmgz$XC={{R0U6%_?!#>K?}$@=>G`1tt0fB){?yLZu|MOUw0{qp5YQc}|M=g$)p z6T7;)va_?-u3cMEQE~U~-L$kcp!&&^C%=35?&r^+uV25ub?a7se*WRZhm(_&b8>Q~ zOqr6Bl5*n2iGqTH+}zw7H*Tz4x$^k&FL+aJD$8zriRT(X(Yc;3jv*GO*Io|iJ7gf@a?!w-_F`*I!%4Zree7o} zWf$KsX+GSvne$eu`hhA}>rmDMn$K=}TswEv+*b^hS#@{6Z3>Y;5!C$mYGT|q`D!LpcHRpXOBtkq4rTCk^>bP0l+XkKO#Zqr literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/left.png b/comp/src/gb.form.stock/gambas-mono/32/left.png new file mode 100644 index 0000000000000000000000000000000000000000..c1108290eee061b5a6b8ac57240f63e4099ff7d5 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs1s;*b3=DinK$vl=HlH+5P$Q1F1}1q29MazNUte4K)mpIWS@ItCl;Ar$M%8C) z7srM7&Wg4z`1d;O`I)5M(d!ofx)EFW?^{ZFS;8je>9V)j?;ZWS{QK^E%wGiGZ7FO& P1M-chtDnm{r-UW|N++TT literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/link.png b/comp/src/gb.form.stock/gambas-mono/32/link.png new file mode 100644 index 0000000000000000000000000000000000000000..d7e670e9f5cba9bcabfa765a65f80cbbe551aa34 GIT binary patch literal 984 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fA0|R4u zfKQ04dx1|{T3SLvLVSFDeSJNU3=IthlCiO|Kn6q{BAA<-3uFKl1EqirAc%{LOG-)t zia@v!5ul)hgF|$5G+Y^67RUgq2P%MwKo~&R0l5&x5Rt^hL}V>+F3>SR1#l-p6hlb3 z2@qL`7Pu7LG@vXHAdAD<5G_Dw02Kfo57Yt_0m=foaP1H-LsybBCMt)$S;_I>%?=Wzij`wnK@S9O(fO@K z!-GvH&$v9fZZt>JK<1p5@YJ(zhxgh_JQGm7WA=jQYtQFTUiaFBx&jmHCui=OSF8g} z3iX~Yjv*GOw+4q+A94`zQSg`$bZ2iw;o99Gu>JSr-Rv#;6F!`@d||wq0IeWpZej|Iwa+eC|aGuah;){1_92{@w4W zQt(xn&2WL^k$Vk8Ty5(LMloso1uqw0p1YSTEzCtJrY%p-VoytX!IhP7j_SU9I$tOC z+S}tgVn24hjtTUO`6vzJ**eY6xS+k%NEDKPOQjiH)ZC$o5Nq?|0<=-tYT9?^Q68;xRUd zZ4d;(P!lLjSn(ew+7c|~7HjTrP(f@87?#si_$m8G#!-9`Eh#O`%Z0f)9-7=;-k9@RpXAuC6Yy9UUF5 zt*woXjZ&!;Ha$H(dq=o$Z*OmCXn>e7V6(UH@9!TT9u^1${{H?00|Ri0!{MBqoJvbe z@7%e=U@#mV9giG2QdLz2!r=bGg$qiha%gDi-o1M?8Z9j?jY_44goL=cxq-r?M~`}V zcpN)+%+u4;%gYOnzP`SY0-w(Z&3=Ay`uh6dccam0GMRwJ>guXquLlVbq_eXVNSe)NNDYX=r#hVuK+Vj| zXtmn^(*Z1?4M44|tY|bEK$Mu6*xTFN)YJqrfFwWwQ1$iogM)*!v$IepcX#*D(9q1x z%&Dmg43)qN1WV zZ{DP*r_ayNXJ=RTe4!{wM#n2K93k#EzlPnhN*|TS3V`FqWy`Z4r;>C+Xp%C+Tl@tn= zcb=KVLR{4-D}p7;!a4+l-j+B}up6eG%9Q6fenN-!J-TJ1&C{C>f2HJBeE!+n^FRJ! z;BPa0+x6rfwt3s;>BsvPmG&!a?%Ss|7G9-KaOR;L*H?O<2=mn!RB43i)#6`<3?u#a zF1dekH`&W%cFnmy@iT&0j8Q4kCxRblox&e%V^6*2&u{Yf+stJtJ#>nc{ir2HFV=wm zvn2X3+146`iOScUExm!awWd~@+{Cr{1`)_QkbE`RWlz#)q(G9=TtbqSekymN%>gsiO`$|Co=bthrnTPm>U z(m6ici}L5Y(>pDWYj#EFvfA+-TZ}Upd!qKAAI7^}O1AX8Z_v4sZPJND8Is8E(*FP^;CT#@0Mn@*=X9q3XoYtBXs7b=#TGdKq<3oAp((`?3fS9F}(6vR^b$-sbE z%fMPu)TwNSm1XC=N_<9L`s>Kkp8U7NOn3Lm;VfN}Lz2ta*`#ur>`)p(5EV7v9iEtz znu_;$-1eb8MYH@Ai;vP|bm@%03UO9D^X*W6fsdMhvnrvV#@DGXGn`M_p^S->o(?7W z?=kF4!=dRC)*$YHEKo&iB(i5&0l(XzvGxa(6Ru#n3QdSeg_+3vHZPAv6bR$ax`?W4 ze|aMCSYF>auey4T2JItot$+NQn;QE?JZnF0@G4D4lj95>?hRoMt1lc8;z`9U@5@U> P=p}?2n?z}iImP`K{n%=a literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/lock.png b/comp/src/gb.form.stock/gambas-mono/32/lock.png new file mode 100644 index 0000000000000000000000000000000000000000..c3410f46efb0d5f14a64523d3a401844048df6a6 GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIA=0X`wFKAD9H2??R0p^1r!v9Ym9NlEcAkd~Gf2L?b!Zf-767AUh!BsvkO zm%k*)FPLElr~gd-Yrk%B9lXiU$IbM*;2TgX#?!?yMB{vNf`Smsw(t(6&!PXA8-<(B zZ;?~^;LWIa;FCO$%mb#6|My4wo%{b^R8Qf*{q)9%H~#k*H2(X~#=~>wfBj+BSO5JJ t5+3~iFRSNS%G}U;vjb? zhIQv;UIICs0X`wFKADC8|NoDVkIz3-E(cOk666=m;PC858jz#x>Eak7aXC5R07J~` vh6Ki`5(;WY$|4*Y2N-U-$uS?kn!&(e@*sR=;wmFvpmGLJS3j3^P6NS%G}U;vjb? zhIQv;UIICs0X`wFKADC8|NoDVkIz3-E(cOk666=m;PC858jxe)>Eak7aXC3bfvI3E zQ!}eaPk@0#`kE*&E#<7MtCp_d@tM5Xp-j&;ZNhT4!{ROs3=L(W%`4MOJ^=MHc)I$z JtaD0e0sxPCFj4>j literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/make-all.png b/comp/src/gb.form.stock/gambas-mono/32/make-all.png new file mode 100644 index 0000000000000000000000000000000000000000..14ea21bc1cfe180d8a5481c93466586ff270f978 GIT binary patch literal 192 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5D99h+ z6XNP#;FFM$5C;bF@$n}rrMrMqEG0pH!3+)m>Lrx#wgCC=o-U3d8t0P}7H}B^H8H1d zU|7s8!{IQcpudK;V;Xt8OPZ!4!jq}L~3%CUI z+nb#>Fep1YF!*{ZhVU!TV%jmuX~)K%46X%UToZHBT!INS%G}U;vjb? zhIQv;UIID%0X`wFKADC8|NoDVkH3EXdV72Og|8L|KC7=jnNswPKgTu2MX+Vycr;B3<$Mxid1KczI|F>sQ>|oduz{8-T WCeU7~S9cbug2B_(&t;ucLK6TiCLnbH literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/microphone.png b/comp/src/gb.form.stock/gambas-mono/32/microphone.png new file mode 100644 index 0000000000000000000000000000000000000000..f5997bbb4ffe675d25b84b18739606342974e5c5 GIT binary patch literal 451 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaNR1AIbUeKHGUV`Jmv34AQ*u*|L+{C8dqu;E# zKYZnwxLRYaLQyg=d#m)eM5QZfS3~mmK3KSOdk)LbLx_%7q8hqQ6+J v_CC1HNc+&iescx8U&Z&9Jyd?6ZOb@ewbnIrv*)Hj-!XW)`njxgN@xNAoeH;9 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/monitor.png b/comp/src/gb.form.stock/gambas-mono/32/monitor.png new file mode 100644 index 0000000000000000000000000000000000000000..dce0dd8661eccf86f570bdbd6d83ceb6f313e86e GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5C@2x& z6XNP#;Pe0ge+LJLj~_o)S63$_B<$V0H!m-*KGCTasD`m5$S;_|;n|HeASc1o#W6(V zd~$*U&y)a$Fh)lehhWA;XA?%@^bp3x>jKUqjFUeErKd0^hNlZp5PImcf?)!?2(uPX zGuM(P3jxQD1_=*K7wJid71)$H9oD#&S=}f+!Ibd)vf&YqV={^i43}?f>D)I@`3tm* N!PC{xWt~$(69BEWLlFP~ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/mouse.png b/comp/src/gb.form.stock/gambas-mono/32/mouse.png new file mode 100644 index 0000000000000000000000000000000000000000..4ac17daa57b0d00a510e56be8963f36e62c5028d GIT binary patch literal 273 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5D5w?S z6XNP#;1dr6X=!Ppp`kEdd_+V<92fva{{R2qVf|1KsEem0$S;`T`=wK?%xR~yrKEEh z7U*6AikEu2IEHAPPfk$aY7w1hd7#+MM)cV8E0)Yc7R4D%Aqp>eTpsjjg($GA74T>U zFsIz#%dNua%$kzG#J-RzJ%K4*Lzp4jyOANWfQ>IhQ-S%hybG6;K?CbUxfusIS2PIw uIIwCRSjzlRK8m4uce`ST{vD?|{){H)c4_eiRi6YpfWgz%&t;ucLK6UThf$pX literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/multimedia.png b/comp/src/gb.form.stock/gambas-mono/32/multimedia.png new file mode 100644 index 0000000000000000000000000000000000000000..75140d15851c5c78e3366bfe891688798cdf6898 GIT binary patch literal 276 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaO00(?STeKHFpA|m4B;}a4RfFy(gWXsFTgLx=KTwGjCObk%y;thFypb3H{ zL4LsuoKws<>W#1d~dzLo0>wjE2DCN)fAnZb;+M%}!R<{JqSt3#tCVQ89UYfAb wPk~o*{ZZG<6WbmMl^ph4miq13wzbTXxe|inMxLJofL1Yhy85}Sb4q9e0Ny8IBme*a literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/muted.png b/comp/src/gb.form.stock/gambas-mono/32/muted.png new file mode 100644 index 0000000000000000000000000000000000000000..f0a9bb2449cf14bed1fbd5f86d57cfea3b34f1ed GIT binary patch literal 340 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaMM3p^r=85sDEfH31!Z9ZwBpjm)Vh^tR#VSIdiTwENGOiWBnNJs!OfMjfJ zERX?V14*C)pddsUkjvj)s|z$iuq4PYnBiJ_wy4CV2C*xdxwmfIxc2XA<^>y|WS6Il zV~EA+wUfR18Web3J~oRv7QU;G%obNuGjZ;T-SA-V65%MPAG^bj9kh^Of1DuG(_Cn9 zPw2y{-)g68kDU}Ynj}?t;2FoHD*^k?#BrPUefrQQ@Py&jn|7X!47-0ceOtd+AhDQrm1dC(F)wC52?My9cS?xO~Gxj=qFg!Ed f!Orf{Ai%(&o)q(%ZEnO)pn(jYu6{1-oD!M<Yp`8|mrd7@~1LIYEJ^N3lVQ ziKEbmQC!8qfvN2U6H^A0A5R7o7nI`Z(O`05Jp>{&-Z5x82m-MfgEkloHE1|+r7&(_ iYH3h(X*3ip=n7+olx3g-eDlWRQSJ5^kc@4^|7(JF>}`foy6ej>gTe~DWM4fUiMl( literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/new-window.png b/comp/src/gb.form.stock/gambas-mono/32/new-window.png new file mode 100644 index 0000000000000000000000000000000000000000..b0fd9cdd0bfd95069037afe71d63af7b51c5d037 GIT binary patch literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5C@31> z6XNP#;Pe0g{{$F_kBUl38;XjB*-tAp}wJBoPDn#ke}h{;uxZFe(uGKybTIG zt{0DSN*rRm(b(s}{^0mucLANS%G}U;vjb? zhIQv;UIIBh0X`wFKADC8|NoDVkKea%UlZ34kZFu1L4Lsu4$p3+0XasVE{-7*my;6? zu&h47Fmt1c2*)Be$;Dj9Dp*rn4$qNdPYyXKv3@~M!Hn`p0k$0J3z!+QrMwTXE12L0 P)Xm`O>gTe~DWM4f9qlvI literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/next.png b/comp/src/gb.form.stock/gambas-mono/32/next.png new file mode 100644 index 0000000000000000000000000000000000000000..28ed5c12ae094c62ebe3475bb652071f3bdcf976 GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wFKADB_VBkIHK{8N~sU*lRn4w{|wx0x$=jrL<7$R{w_xx&61_d7H zi+u+KBxW=T8oT(;6k<8Q#U*y)<^G%Myd?$)VjK=QHtcO^Xl7VnqWFOI)Kd-Ssngvo heSZE3l*{>co-w#q=651r%~_zK44$rjF6*2UngFR}J9+>B literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/office-calc.png b/comp/src/gb.form.stock/gambas-mono/32/office-calc.png new file mode 100644 index 0000000000000000000000000000000000000000..5c8bf9bf4839e7bf6a9716ee9799ffc4721ad2a5 GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wFKADC8|NoDVkIz3-E(cOk666=m;PC858jz#r>Eak7aXC5R07J~` z0||_A$1VjZbT}ohiJG~!OCZ^yRPdob4+F!J=eal4RV~|rIv6}%{an^LB{Ts5`JpX< literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/office-draw.png b/comp/src/gb.form.stock/gambas-mono/32/office-draw.png new file mode 100644 index 0000000000000000000000000000000000000000..035eefc3c78754d3f9b430e122a387ae8fcbf1be GIT binary patch literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBn0X`wFKADC8|NoDVkKez4|Gs_u`uqD2MhLwIDJ==|3ubV5b|VeQ$?yce+^hBMcf2GO)D>3h1%596GRI`Qaw^A|Kahufyj^`7*ftcc^lSceu9b e?^oWIyLT3K8qMh2U$qHnFN3G6pUXO@geCxS{a2v? literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/office.png b/comp/src/gb.form.stock/gambas-mono/32/office.png new file mode 100644 index 0000000000000000000000000000000000000000..e44d7c1533c2bb35b452337b1b07f063958620b9 GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wFKADC8|NoDVkIz3-E(cOk666=m;PC858jz#y>Eak7aXC5R07J~` z0||_A$1Yt6UAQnXgJ*|`9NR3tM{l@VUve$osK>*=P?uP8cCE_yTR?3Lp00i_>zopr E02`PwU;qFB literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/ok.png b/comp/src/gb.form.stock/gambas-mono/32/ok.png new file mode 100644 index 0000000000000000000000000000000000000000..f34eda89ae20597efe0d7b95057158c9c11add74 GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIDN0X`wFKADAaadGirkd%}Jq!SVnAR^}d0-``=93?@1!3=+68uX&0BDt7N zN`PYVo-U3d8t0P}7FZTIJT~TB%&Ac(u|R9W3jxRA3o9CyIdpii>b&6M5e*PEaF*a; z?Mo1wBr2e`NmRkCOWHvu#9X6{p;2Jf6^ul;L{r literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/opacity.png b/comp/src/gb.form.stock/gambas-mono/32/opacity.png new file mode 100644 index 0000000000000000000000000000000000000000..29bd8291fde00f1be5fc8879df3fe74cc097f163 GIT binary patch literal 472 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP_QMy zC&bmgz$YOgAuTN}IXO8#J{~9xO?7YRTFTm6CW!d7|dbW#(m)MQ^dW&<8R2!-SwH@|!aSX9IeRguDw6g(EL-V3{ zvUzFWXa4{HKTYCl=-b6LrzYt`%Jjzv~msTt)6baaAkMZ4yXeW33E4>ArSqQ)=d&UCcLkG0y9F>!i-N ztS|5$V~|y4QK_ut0nef>@|JD$qUZl@)O%ySkMY@jtzThpj@$%#hr!d;&t;ucLK6Vl Cfw{l{ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/open-recent.png b/comp/src/gb.form.stock/gambas-mono/32/open-recent.png new file mode 100644 index 0000000000000000000000000000000000000000..9ad74dd69869cba6d599d7b8ea0b3cf2f5c9c579 GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5D5x0V z6XNP#;FFM$@c;k+`1tq*3l{wR`Sa1EN6E>_?d|R5<>eI>6<2urGk}U2OM?7@862M7 zNCR@JJzX3_G|nd{DDdd~g zlLDio`VI#r7Y81_2ONR|jodyh93BT*xf+?gyqX^EU{&L4Y82VDP(h(7N0*~R(VB;4 y&V;#qEFONxKgeA8eR}ns59|V63NS%G}U;vjb? zhIQv;UIIBh0X`wFKADC8|NoDVkKea%UlZ34kZFu1L4Lsu4$p3+0XbftE{-7*m#3cJ zD99in;1am;UyqOCD#3c?kS?{5gLAmg#2o66+i=n<{nG*NvZqcH{t31#mAdA2Me-~0 nI5z2>xWFR(O49j9TV-NYV@0%b4M*1kps5U=u6{1-oD!M<9V0)B literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/options.png b/comp/src/gb.form.stock/gambas-mono/32/options.png new file mode 100644 index 0000000000000000000000000000000000000000..352b097c81a30f607033db762da5cca645a76abd GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIC~0X`wFKAD9H2?_D>@evUbaWIgWmQ)ByEA5f{f7lq`qehTU^YT51Xa9 ze`hr?*q~H>?mYuDvv?dMkFG?Ulx=s^Ecd$;7#NZp+SC89yjl&klEKr}&t;ucLK6Tq CDp$q; literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/package.png b/comp/src/gb.form.stock/gambas-mono/32/package.png new file mode 100644 index 0000000000000000000000000000000000000000..d9c97e79ce04b626660626da8163fd35429161b4 GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBh0X`wFKADC8|NoDVkKez4|Jy5*Ux5^r1o;IsI6S+N2ITm9x;TbNTux3n zz!0NS%G}U;vjb? zhIQv;UIICs1s;*bK&3}Om~pB$pEO7?z$e7jC$lgL^-~uDVuZ3o% UR`Px#u~1A@MNDaN`uh53XJ=tyVg3F6`}_O+{QO^EU;qFA z{{H^<_V)Gl^_iKO^78V!y1J~atdx|L%gf7}nwt3d_@JPmdU|@p!^6VD!uk36Wo2d4 z)6<5AhQ!3g?Ck95=;)W1mynQ+9>Yv$Jh&ZRzRh@bK`ZrKQ~5+=qvU*4EaKkB`3w^kD!1 z00DGTPE!Ct=GbNc007NNL_t(I%f-^y5`r)g1yBPC*$|2q5U}^&>;He4D~~AqqNDe9 z&)i9Nwp98;B#~bNv#PnhB0!Ua0^J}0s8p+cF<3AVTc{9km;q)^{USziN(f*sEdV<_ z5PJx)L$x-=;0%!f;Jc}mjj}U(1s>e47lp)inPrJ#9vCsCQu-ET;lT1>eN_Ivg$-b5 z$j*bLrr2{Zc8va@T<`Sqz{#rJiTVB)hR<=V>qUz)DmZ3d@v1$Xi!N~w5rQ^#Q8g^6 jQXt?W{P)?D;KMus>1G?F2W(n@00000NkvXXu0mjfK{@)P literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/pen.png b/comp/src/gb.form.stock/gambas-mono/32/pen.png new file mode 100644 index 0000000000000000000000000000000000000000..f2bc4a32c63c1e79f8ed3f508f38aaad8651344b GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5C@2)* z6XNP#;FFM$5EmB*B;(`bfn;qBLm*I=r6kBNn4zJ*-fDMAACRBy>EaloaXvX=fmVWu zgRnrMOYnn7O{-jv96c)N%eYENa6*IfET$C34NNM!B>@K(G%agr!lvI6;x#X;^) z4C~Ixyackt0(?STeKHH<;^HDAB7o$90|#PbV=8X5`|Ie73OkPQ@s zkPya^BS(N-Ac&8Thma5k(2#_L1R&ek*chl1$c3l}ssXa2qM|^04jcd)3j{z0#2la+ zAb0QHy+Doo_U(hHOiD@uT7Bls8K5$tI8edWt5<;}#6XBeAhTd@05T#YBOz`Es)1+$ zk`Mq?pOcdVQ~-1yL@!Vrs3kEm5h#+DmIkza%a$#3=FG{>&E39zdwP0$YHDhEdHIG7 z8=9J$CQX`DP*4DLQeR)+^y$+lOqj5K{rcYC-s0lo9XocEmX=mlR<2#UHYFux^PMmA zfx#VG666=ma8K&nyPBInYQ+Ds{VV^j@u!93qTIr^pC5mGIJrOS7HdNFif_NO4Gz72 zzH+gihKKCy?84wS1$4HPutt?EnhVx7INq*_^JS- zP}S4LF~s8Z+RLuxha5!O5>+NJ99{bE-MhFIyYDQya`)^1e6GneAKpuwR&)EiW#WuE zJ7QAflxBIpsxlJxT~V#IZe~uD&C*wmB}blgFJa~q=$l!zal_{Pb+a;NeHLu~xGo=N`-V2m($y85}Sb4q9e0CL=!1poj5 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/phone.png b/comp/src/gb.form.stock/gambas-mono/32/phone.png new file mode 100644 index 0000000000000000000000000000000000000000..0602aebaa7b7e0b3f4ec466b60cc66d4faebfc20 GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~r@&x#V zxVjhk{Qv(yK0ZDnA;Ib8f?Ysy#*!evUNS%G}U;vjb? zhIQv;UIIBh0X`wFKADB_FtC~7$pxS|b4ie2Fv9@{_W+QY4A!15jv*44d(Um;Wia4i zc69stk9kS$D*Z=XTCZCU7*FqfC^-QR{!NJUllQUr75AQgeoi{$8v*aLp$qf_K<0S5 L`njxgN@xNA#~?T< literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/plugin.png b/comp/src/gb.form.stock/gambas-mono/32/plugin.png new file mode 100644 index 0000000000000000000000000000000000000000..ef54dc725633acc6af27b33c4bf1f93e872b645c GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5C}-d%HBO4zpH%C>Bz6(&Q$kW9!MB{vNf&!n!H15S8Woj`>lsrR%N8^+ z$1#TJ{ugYR$7Ff@OCr;wRsnfirxi1K#1fo2YFM}n6j}Bqh#$Dnl$LSLXvbEiKDHe( zt8NLlD1FFeX5MbM=|H%GXur+}W{-KHTBV>M?Zi5EH5u_Z*NadPOhk^NZPU-Tat=+22UjZeyc)B=-Se#xvIZ~*}K)}Uu8q3zrjuBUX%L{uQ>1cL5_^-~?*4tm; zkE6mbSpnl*=4Fp=H!hdD99iABncpFMS&&ZD27$M%Th~olRni#j!l20GWjSqIfe zfYT>^uASgWSP;8i%5dY0080gTrv~jQ%p!b8l0-j5t}**5vAG~wj63<9xM&gAo$$HZ zQ~6iRojX{2oGZR#d-44>zK?p0-F4jaRBC3*bR@sx)lGkSedWF1k=9q47t1Kg|0wra Q19U%wr>mdKI;Vst03n;46aWAK literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/previous.png b/comp/src/gb.form.stock/gambas-mono/32/previous.png new file mode 100644 index 0000000000000000000000000000000000000000..2c32bc81a340a872571c0c8690d1a6bccb118e83 GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wFKADB_VBkIHK{8N~sU*lRn4w{|wx0x$7vSmQ7$R{w_rgI=21Op1 zK;}tO(?WJc+)SEUJ@cpK3UPUtvqucyWlQyc%`g9H2nYo literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/printer.png b/comp/src/gb.form.stock/gambas-mono/32/printer.png new file mode 100644 index 0000000000000000000000000000000000000000..4c6b1655d0926ab2f3e30a012893f94a9fba5240 GIT binary patch literal 237 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5C@3A^ z6XNP#;FFk`7>^46|NozmkRbIv&IPE9tt7}Vm_cjP$FE;ZH}=>AMbbQ7978nDCnqSd zEjh^O*I1;X5Zw^Cl$mc1O9RuPOpZnq=LHQ>QbHa~TssuGmn^d2&d8FgYuv(D(rBW@ zdgqdWAA9ubHk}D9WmQp@S8kbXxGWhe$mGc6!Y<&$oyXXeCeUN~hk;>Ibl09q7GYO_ PHZpj+`njxgN@xNAPl-p? literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/program.png b/comp/src/gb.form.stock/gambas-mono/32/program.png new file mode 100644 index 0000000000000000000000000000000000000000..bff09947528d366f0c6fda1bbe994ebb3a3f5818 GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIID%0X`wFKADC8|NoDVkMHa2d-v|$e$~R^1TzYkFscIa3=Ss-ttJ%)K}Ru$?gydNS%G}U;vjb? zhIQv;UIICs0X`wFKADC8|NoDVkIz3-E(cOk666=m;PC858jz#v>Eak7aXC5R07J~` x0||^m$|hPO93AOvqFT>MtO`CT3@Zsy%uO}xbpFe+o z=FFM9ckga*Z@+Ni!q1;SckbM|c=6(U_wIfB_N}_Q`sU4>K*wy`wk;zgBQY^?%a$!k zNl8Cx}y!HIBo#&_1KfAk6$%|U#FfcF% zdb&7e99*MJB8fk)ls2Z z|2t+qo!Pcba#{LSuT!fQIXi@3N!t60!Q_pa|?UU%_UqK|NqNf-*9wyfX2!? zS;6Y9{5Jh={s(xym0#4zi)qZS7vG`!gvH|d2wbaRvKiK^~Q$+OoFa%yMN322E`W>;0Em%v(~(@LfD{DX;z#hY8VVHtU|yeWJL( zVWY<;#nv;T_r$yNC#D!3UBo5OEwnoB;p4ZZ6OJZb{h28EiBslj)09Vr!bP>eHcXaM zatqcq=Fv1flXg1SEH~|UoH~cqUZdOj`z+qPGW9uJ%DXwR>g&HA`T4&M|9yH}JP8=` N44$rjF6*2UngHilN>u;= literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/quit.png b/comp/src/gb.form.stock/gambas-mono/32/quit.png new file mode 100644 index 0000000000000000000000000000000000000000..3d327195f411f11516b2c8c2f40b8fc85fac0991 GIT binary patch literal 382 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaNb0(?STeKHFZ5)$H(Ktn@AY-}u0z`?;GE-nrzo0yo0Bp;ugoDApw|Nnnu zMeGTnX(A;-e!&b~XKsJ~!=#za^3u!x@b5$3cCYSy@=xgi%J1@YaSX9Iy>{|VzE%Yu z7hSGR8XedE|GzrBTUt~q`H_v}^Nd7^Sy$wa}IrwS+En(3AJ=~C*} ylBpY(R0rRBe#<_7PQ9F9)7N`!9j{Jn|7F(Ms4rS^@=+NS%G}U;vjb? zhIQv;UIICs0X`wFKADC8|NoDVkIz3-E(cOk666=m;PC858jz#r>Eak7aXC5R07J~` yh6F|~Wf6`O2`-L23+$4wYMHQwg-<@}z|5dl99JJIT)GOVgTd3)&t;ucLK6Umjw)aP literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/recent.png b/comp/src/gb.form.stock/gambas-mono/32/recent.png new file mode 100644 index 0000000000000000000000000000000000000000..aa4b9802ab35a7f0608d057a7fd728c65f6a1cd3 GIT binary patch literal 348 zcmV-i0i*tjP)Px#S5Qn;MNDaN%*@PpcXw%NX<=bul9H0BsHp${|6gBU zU|?W>e}7|RW4XDxtE;Ql*4Dwn!QbECpP!$Yn3%)E!@Rt__4W09e0=Wi?qXtMmX?-t zb90xMmvnS=no1^(00001bW%=J06^y0W&i*HmPtfGR5;7E(#H;jFbo7xO27#%bhiEf zcdk~{u>%KS=VC?kPO&}jhUkOb4oniaZJd}L@W^ROu3RAKXh|1H(2teY!lvI6;x#X;^) z4C~IxyaaMA1AIbUeKHHhzoSIL)R=XoC_fU+H)E{-7qkmi{ESj`WQZu|;~fbT+J6vt0k)vYm1=r8^9+g-b=We>N%H;k+}lV3n{AW6t&Y z?oIc1o3a@CUWn-M)rgqjdm>`RbJlO1-zMkGezV|4U^mOOtxL6Evo%)!?Y|?ouKkU@g; literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/red.png b/comp/src/gb.form.stock/gambas-mono/32/red.png new file mode 100644 index 0000000000000000000000000000000000000000..3531c98563289804a9d8b793fa3a8c3204a6054e GIT binary patch literal 604 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAQ1EN7fKn9RZOiTnS0kVMrA_!!}#l^w7aCUutJx~y+9;hrgH#apk z7069WN&=Gq|Nn1jXgGTGXmN4z;>C;e^768?vwM1al9Q8DQc@}_D~}vG^7ZT2YuBzV zUApw};lm3TE({US`}a?sI(5N<1yiO>Nl#Bdb?Vf|j~^dDems5p z^uE5nB}$phUjR}$nG%y4Jnam~*Tzug%RDBN9i z!YAR&f(N~4*;LQFMGaVsU!yS|hgpT9q%^f-HoTnR zxT(W<>#fj&%YnZ`7p!8jIS_2# zp_Izazj@}Wqr6IsIIjQy8LsQop_VcC^S`I8?>sX4E*p!zNb-p0Ej;v-m*<$If!urdR_20qjsDsZMpFFOP7HPaItY4w>uJi8%?K{QJY1w|$UABK@-kv6Q zW&Vr>msT9!8{ZQ(XLhT?+~z+FV%25K8e`f{#`nB_F)KHF*JHUa=Kq;)y;hZb{$#u6{1-oD!M!lvI6;x#X;^) z4C~IxyaaOm0(?STeKHHN zX=#axi9o^1iudL~lO;=n{DK*-Jld?il&gWK;@dA_cBPz_r_XcQTAv9iKj~pT1XMK3 z)5S5w;`G+ZxA~e4c${|zOFZ7hIQ##9_v=1Px>2ue9&TT?JU3~1WZA?h{s#90$`1rT zaQqQIyjdsj!Y{>HYugu2mMCsue9wMAf8X=z>!O5R&uv=eyy>jttJR%>lkdoPTuo)M z5(^V->^iFZ@9xa^dI`1*Q$$y)!lvI6;x#X;^) z4C~IxyaaM`0(?STeKHH<;^KmWf`B9t#K*_S#>N6kAV>fM2pcE`5l>7^gowb!Au53i zfXX3kpc;r#$ZCKhPHt~Pf%Ynu1o;Isd}Xct_pQDmI!*n;znzLJY3Qcs@1(-(RVgl>f~T@<`4 zImexmf6?pj2i}QBs2ujnoajBb_fJ%QUaQ>FdjWhufnH?rboFyt=akR{ E05w;)YybcN literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/remove.png b/comp/src/gb.form.stock/gambas-mono/32/remove.png new file mode 100644 index 0000000000000000000000000000000000000000..4d81b9534199c72fc9b1d2439403f45754f72ee2 GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?slj7I;J!GcfQS0b$0e+I-SLLAC&&5Lchf!ua@jYwx3ZAU!2Pe!&b5&u*jv vIU=4ejv*Y^lM@zjJ^26sKeLsiC=g}QZRzd3AR@6?OOTCAVxgu(pc0RmfJ1PC#Q`p-Kv9F)yI7R96B5h{3tht) z1O*&KIo!ey9Oy}6bvZDh@m9l42|k_;+yV>?`q7fvc{8i|fp#!>y85}Sb4q9e01rbs A(*OVf literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/replace.png b/comp/src/gb.form.stock/gambas-mono/32/replace.png new file mode 100644 index 0000000000000000000000000000000000000000..6c531b8a3de1e3e7b1193a40f83fe1e6717b5eb3 GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP%tXM zC&bmgz$Xq2LPJC2=L? z`7)~W3NuG*cJYPv2VM#bP0l+XkKLgJrX literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/resize.png b/comp/src/gb.form.stock/gambas-mono/32/resize.png new file mode 100644 index 0000000000000000000000000000000000000000..69dfe3964e04ae070dfd76d4ad1d8a76c7cde989 GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~q2Ka=y zx)=B)fWaMM_XwaMQ%R6tFhj#^Z9fSh&(G7vF+}2Wa>4S-R1BI~1OvR<6GHA}Qbku`b4L5Us-9y6Y!1#esCc0CN{ aVPH6~ZJNjPy@ds6GJ~h9pUXO@geCxA+B8G} literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/revert.png b/comp/src/gb.form.stock/gambas-mono/32/revert.png new file mode 100644 index 0000000000000000000000000000000000000000..134aeae06d624264dd9ebb7b9a9057f88f8c16c4 GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIB<0X`wFKADC8|NoDVk6*ujeR6X0&!0cHZ{NOi=gz9Cs;^(a*4Nj+dGqG_ z_3L$Yb-ON|JP$IWB*-tA!Qt7BG$1F*)5S4F<9u?00?!nM1}P?vLLWv)m4;vkiP!@i zz77$bz6Ur`_T_8EIItxxKIRr8>gBa|MVe1}kn`rH9^7YTCx={!=~8T1<0^1BV1x3+ rHLV;9mOMOrfNS%G}U;vjb? zhIQv;UIICs0X`wFKADB_VBkIHK{8N~sU*lRn4w{|wx0x$7v$;U7$R}GxBnpT0RtYU z$^LC0I^^CiTl3KIN_h9X#uTB)TmNOwzG%4EXt9~GyGBz0%R&w(K{j^_GuG707xE_u r9;%$j|GrDdw^w9$Xt3S$nwN~N(Q2vJD$;9!rZafD`njxgN@xNAs|G;h literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/right.png b/comp/src/gb.form.stock/gambas-mono/32/right.png new file mode 100644 index 0000000000000000000000000000000000000000..728ba96e75d3b8b5528523f5b3f70a61f035dae8 GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs1s;*b3=DinK$vl=HlH+5kUzjD#MLLWFeWA@At50yE-pSkKG0+PLy%!5 zL4Lsu^$q`ecknF-^1VG>978nDAHC=;$e_T%5E#NF(a06%@GJe(qx@|QGWXvs=uNS%G}U;vjb? zhIQv;UIICs0X`wFKADB_VBkIHK{8N~sU*lRn4w{|wx0x$=j7?)7$R{wIYB|t!Xfh* zn?^J5u?bCvn-=gK3k_hqt)&pb7}RvI!Mjn!cx^*gyTOtK9y5t%!D9?o%%>6*COfJy ZFa({JO_fNS%G}U;vjb? zhIQv;UIICs0X`wFKADB_VBkIHK{8N~sU*lRn4w{|wx0x$=j7?)7$R{wIYB|x;E;q5 zpTRK}iDb^6jY7vFSc8^q<>F8~AmMEwk+70&#v`^BWdcAsL&jqT4Mqy*7>p!5(kC!5 Ygf>W@4GClZ1T>Ao)78&qol`;+0NolfPXGV_ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/rotate.png b/comp/src/gb.form.stock/gambas-mono/32/rotate.png new file mode 100644 index 0000000000000000000000000000000000000000..14c72093b48ddb193d3eb97bf6dde512adbcca2e GIT binary patch literal 358 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP|z>H zC&bmgz$ZRFJ^>7plaqlooC{$<$i&1%h#DX_G&B^h3}_6Hotv8rQFgi_EEp&xSrX(I z%+R;yyUw4m29C#5qaPYYJy^~B!*~i~J$qqf=`AgwqM4p9jv*GO&rb3bV^ZXCS;)%s z&F1E{zxrA)n!b5X>gCR!Sra!&tLNv=by5ty4Q>v~3j_r?vSy!aR(Eo_Xl{6)LGZ#a z#p(Ln)R*~J)|LF3nOpasW$~<#?USy?GF54=dBg8nDE?q+ti-_;Iwv*e@3dgla8ups zu6t_xRqcye;&-%rGXvbV(PRKeHEOSoQ;n&>Y zw!Kx1ZeL^k0#=(lD3~e)tn_DC*l2jl?t`g8(<|mhjO&>H=@)D(h`aRD=lOzLf!DVM z-oM_vP-}jJjEvj076zVNhSPPeKg56}|~p00i_>zopr09DPx# literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/save-as.png b/comp/src/gb.form.stock/gambas-mono/32/save-as.png new file mode 100644 index 0000000000000000000000000000000000000000..3118881012d5596d47ec4de2e67ac5c29d72a4bb GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~r@&x#V zxVjhk{Qv(yK0bcmzJ0s()*k|jGnNGT1v5B2yO9Ru1bVtShDcmaPB_32v-&^+qmZ&m z$<n-;P*YOC0pj_9pf+A{?AWnB&Jcoe>R;jUHJoFogQ7xsKu9l*vR lkkAm*bxOfWyv^T`fx)*Z!CP5V73dTO22WQ%mvv4FO#mC9KO_JE literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/save.png b/comp/src/gb.form.stock/gambas-mono/32/save.png new file mode 100644 index 0000000000000000000000000000000000000000..de509169e646c47ad96ccc27d85f6fcfc27dc5ee GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBh0X`wFKADC8|NoDVkKea%UlZ34kZFu1L4Lsu4$p3+0Xg2DE{-7*my;6? zFvP4rkiaOUY*KP{)rEjblIz3PM)9VFtc}_#cBUhGYnJv5!F^d*LpvUYuU@!o)io!{ p!svxPA65sjaa?F>d>G8bz))r#yI4mT%Zh){Qv*|q=NUsK#ja5L4LsuzoWvnHhum0?`Pzf zANO`&hzClI8|Ktv$q|Ns9B3JQMw_%UO~j13z$Y}vAf zOM3#yN}-Y8 z*-q&PbOR$~W~>w0()b|v5W9gC_p0^;ex@y4oJ@1hHs-z@5Tqx&{Wq}CZU8J&|9 kz1^ItBFUzd|MRLoW4zkc8M{`y1D(#`>FVdQ&MBb@0Np&1a{vGU literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/screen.png b/comp/src/gb.form.stock/gambas-mono/32/screen.png new file mode 100644 index 0000000000000000000000000000000000000000..cc9896a1190065f25498b779fbeb77fe8b0e5734 GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5D99h+ z6XNP#;FACb@$vEh|NmdP!(ld1im4>XFPNcWwzi)HkZ11c;uxZFJ~=^wrzemhj8Rp^ z!Q(*df`&^U!~>idZ?JSQ_b6Ot@?dgOV01NMJ>k`&z|?hQCO<>@OoO>o^b02fjbQL} L^>bP0l+XkKRh2KH literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/script.png b/comp/src/gb.form.stock/gambas-mono/32/script.png new file mode 100644 index 0000000000000000000000000000000000000000..bd86bffa6549731a1ca580075a05b5c3036cc717 GIT binary patch literal 427 zcmV;c0aX5pP)Px#oKQ?uMNDaNl9G~wf`Wg4f5O7Tj*gCqh=~9H|6gBU zqobpCc6PP3wcXv_U|?XJoSbxYbc~FQxVX66+uOapz2xNNv$M0`-`|v!l$Ms3u&}V@ z<>lw+=iJ=ffq{Y8*w~nun3I!}@bK`zzrU-itB;S5i;IhdgoJ*6es_0wX=!PAczEOE z<8pFxb8~Z-mzQQ{W|^6pV`F1vWMupM`z=FFhyVZp0d!JMQvg8b*k%9#0H8@kK~y-) z#go?#!axiJQ!ck_5_+$p_s;+S8wxK76eC2Cvd<%Hw6-1R58;P=3qVOefc1A6_!S)> zZ!lvI6;x#X;^) z4C~IxyaaL%2l#}z`eYWy#l@whq$DIHgocL3V*@}1Kw+RPPz{6)WB>tB5W;}4fl@#a z9UTo3hnNJEYG`PHuz|8b282XrBqk=p1%cuaGl7C|H9*SH^9b@|0lSSQoAw{xukcfI6>ACtan^=-cKC)(LB)KcyFFDBJ( W%~NeFWoH0=$l&Sf=d#Wzp$PyKjp!`^ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/select-all.png b/comp/src/gb.form.stock/gambas-mono/32/select-all.png new file mode 100644 index 0000000000000000000000000000000000000000..f857003d86e01b17077eff727f3488cc6ab5c5d3 GIT binary patch literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5C@2)* z6XNP#;1d@Y7aJR!kdP1`9}i?_C3HLh$}*P(`2{ol`@7k-%?HR0@N{tu(Kw%+pupo4 z6C)!Lq2Q9CF{`1Q+k+v}(nCQc_CRY1qe6li8#D6`i189ZJ6T-G@yGywo>FEv>J literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/select.png b/comp/src/gb.form.stock/gambas-mono/32/select.png new file mode 100644 index 0000000000000000000000000000000000000000..540100dde1b1b3567350352fad8cb8444b193593 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5D99h+ z6XNP#;1d@Y7aJQJA0H27%=`RX3n;~0666=m@bB+t*ESy@*TvJtF+}5ha)JWSoZenu zi5ZG5-Q2SpHX3>`L|S?rV2wR6ql7VwAysP!v$MktF+J78vKkBD_2^2?5iDfs)DSOW bbYft5a*yxsm(&hTpm_|Qu6{1-oD!MNS%G}U;vjb? zhIQv;UIICs0X`wFKADB_@$vuv|9@q=hzX>kB*-tA!Qt7BG$2RO)5S4F;&O7r0hWac s4l_1#H4A$29@A2ANWI|4%f>7Vw3)#nySw2XFHkXqr>mdKI;Vst0HQc2>;M1& literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/share.png b/comp/src/gb.form.stock/gambas-mono/32/share.png new file mode 100644 index 0000000000000000000000000000000000000000..f9fe235f1ccbde1a146b9d7fe4c58bcb75cdd106 GIT binary patch literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5D5x0V z6XNP#;FACbadB~>p`k!#JQzR(f#mulnJhrXTqQw%!3^II1#&*i>;AR(;`F1FfTC5N zE{-7@=aUl@SS2{M7Js-IzBVefK_`J#B%()W0g!CbQ2>%1N77$9i6(f)wk~2lbP0l+XkKjkH@2 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/shortcut.png b/comp/src/gb.form.stock/gambas-mono/32/shortcut.png new file mode 100644 index 0000000000000000000000000000000000000000..3232f350279d41c6f75d0afac6dc0d69a1d46168 GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5D5x0V z6XNP#;FFM$@c;k+^XJc3RaO1``7IJ_@x8z@<%;Y@mMJ`eXD0+@xfq9d3idY?3!LC- zY4DgRw5nl)(5!|PmrO#8Tc!wcawKFNG!Qu)<@j99gz;9pl_CSf^g~L&RyG$40L^Fc MboFyt=akR{0E1UdT>t<8 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/sort-ascent.png b/comp/src/gb.form.stock/gambas-mono/32/sort-ascent.png new file mode 100644 index 0000000000000000000000000000000000000000..60e8b5cf6b9fb285bf3f2c8b313df76d1c6001be GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~q2Ka=y zx)=B)fWaMM_XwaMQ%R6tFhj#^Z9fSh&&t!qF+}2Wa>4-?A8n1aHBnm`dL7kcb5@6~ zWjSrIE@~^wBDL(REF8{RQ<+;1ZWCHHw~+J9c}AWaj0~bH6hA+|oXra~g~8L+&t;uc GLK6VZ6E4&M literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/sort-descent.png b/comp/src/gb.form.stock/gambas-mono/32/sort-descent.png new file mode 100644 index 0000000000000000000000000000000000000000..36dd46b4b25c9b8b5eeede491eeadf40f898ed15 GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~q2Ka=y zx)=B)fWaMM_XwaMQ%R6tFhj#^Z9fSh&(_n$F+}2Wa>4;7rUfRCg*2LTRi`L!J;iwF zM3gDxqLiyz9ZK6mS1;(A5oTbpCTc4~FXQw>hZii@li?|0U{If;_*uI~h7)KIgQu&X J%Q~loCIEsOFM|L8 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/spell-check.png b/comp/src/gb.form.stock/gambas-mono/32/spell-check.png new file mode 100644 index 0000000000000000000000000000000000000000..eaedeca9a86e83d3f5bd24adbbdc400d6147b97e GIT binary patch literal 287 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5C}+6P(U;b_U^7-$2 zF~c2ee*mSbJY5_^G|nd{C`f&%U*OU3|G#)D+duz*4nk@l{?BHdz%a?cwC5w&pLo^= zm6+)@jQ`yQI#X0m1gJCzviAJ>|KD9K;oSdztpi^|8A7>FyR)rfatKOd+%#=HQ_XkL z3A}&*|37ZH;&SgRN2d9&>iyFeNIhVWWORMP6~M#5b1P-ar}JKhKvyt$y85}Sb4q9e E0N&|p)c^nh literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/star.png b/comp/src/gb.form.stock/gambas-mono/32/star.png new file mode 100644 index 0000000000000000000000000000000000000000..a91ae1a1a598f0854c75589a2ff13dd8040cd5d3 GIT binary patch literal 897 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaclI0(?STeKHG;jg8~t;^M&o&H(bFqoX0**w|PgBPJ#W$bhhcTp$3d0dgT4 zfn;K0B7_Z;0*WUjBse%Y07mUk%44?>*1nLD# zLJ5d0L@|(rI1Hi~B8co%s2-TZAW}f-y3^sfYA_B666=mz^d06_xsnMAAC(egJ!9l zdwG8T_PyG9Te8;tu*(?%EE+N^zFy&NyZClq?fUB<+ABJQ^8(Jk*555DHTR3zKeq$3 zm#yoYq#|APS7&wjy^lL=LOGoLJ(QU)`2~81$fn=D42)qc-rFVdQ&MBb@00ae$p#T5? literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/start.png b/comp/src/gb.form.stock/gambas-mono/32/start.png new file mode 100644 index 0000000000000000000000000000000000000000..bcea96392900dbe46e2335c7073f442ea7ebad28 GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wFKADB_VBkIHK{8N~sU*lRn4w{|wx0x$=jQ3+7$R}G_xx%>1_KV} z00W+b9X-=DvprtOE^@U!s6OMb2!pYDlgA>dJ~si+ki!=_lscnMTwPPBJ4e`Rl?0br e;N!aIvFulNI5QW1nsyjyB7>)^pUXO@geCxwGdNZN literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/stop.png b/comp/src/gb.form.stock/gambas-mono/32/stop.png new file mode 100644 index 0000000000000000000000000000000000000000..70d6e17f679a6db21f466ab9847033ef9540dadc GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?smO1^9%x`eYWy$H!ZHAI$?vmjw9*GdMiEkp|?5c)B=-a9mGLIKcGd|Ns96 d0xV(-4Bp4wcb-qXy%#9Y;OXk;vd$@?2>_p;CNTg2 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/sun.png b/comp/src/gb.form.stock/gambas-mono/32/sun.png new file mode 100644 index 0000000000000000000000000000000000000000..853a7e14779d579fd866d9d6cce99b92870f0f62 GIT binary patch literal 420 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL*0(?STeKHH<xRlZ@sDEF-(LuA6FAGIuC&fb)A(p-S7f~cR}#}= zmc>S&?wu^!vh3n6L)#)T36}+{zxal-Km2ZaYoon@?hbYhiN8}CKQ-{2Wx3)ZTfVkd z=$Gq+{$ElFAG@aZKY6j-@b`fk-EMc+u515&IPCb+-D{LSeJb4c+Ha}P+ggTe~DWM4f@)9oN literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/table.png b/comp/src/gb.form.stock/gambas-mono/32/table.png new file mode 100644 index 0000000000000000000000000000000000000000..437911f6dee6c0fab6393aa6caaccf187b1b7a16 GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wFKADC8|NoDVkIz3-E(cOk666=m;PC858jvIJ>Eak7aXC5R07J~` s0||^fdoEnquyWx-7bCWrWjqWF^KWN}c|Qt_0V-wiboFyt=akR{0M$_|!2kdN literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/tablet.png b/comp/src/gb.form.stock/gambas-mono/32/tablet.png new file mode 100644 index 0000000000000000000000000000000000000000..d420a34ddda2c30a08b7df04e27658b8478a982c GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5C}n1%j&@7A`PY)$qXDG2}d_)K M>FVdQ&MBb@0Pl2UzW@LL literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/tag.png b/comp/src/gb.form.stock/gambas-mono/32/tag.png new file mode 100644 index 0000000000000000000000000000000000000000..6d42cc06a09a5f16d98f619ed615c8d68cf136e7 GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5C@2)* z6XNP#;FFM$5FH&2Bq4xjOVWIxENe-SUob-hU+(v7YVWTC1*$z=978nD_fE7HYEa;D z5#H;d^Fr1?;UTZhL9w0xLuDF2-0UjZQ>ijRG;-aOowp+AIw%P=^&hIXDTCL04owo&f#w;_QCfSMURUHx3vIVCg!0Pn9Y A1ONa4 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/text-baseline.png b/comp/src/gb.form.stock/gambas-mono/32/text-baseline.png new file mode 100644 index 0000000000000000000000000000000000000000..5f12f365ed5acdb90a0ee4815c056899e4a20581 GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~r@&x#V zxVjhkB!EGDd^~%7)JmW@Q%R6tFhj#^Z9fSh&&AWlF+}2Wa>4<&ANB#Q2mk&5&uY;8 z@qaygN5J3s6;eO-1K57EYBXPLWVC+}#mdGl!1IS8PvH*Nj->|a2V~jGwWJsr+LtQr UwppO)2{ezv)78&qol`;+04nD+$p8QV literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/text-bold.png b/comp/src/gb.form.stock/gambas-mono/32/text-bold.png new file mode 100644 index 0000000000000000000000000000000000000000..0a9a01e0014a8bf70691165a3a28170da669f6e0 GIT binary patch literal 568 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaNN1^9%x`eYU+B_+j!K~PW-gn>-LW#NJ`F)=`P92g`dBqSy#0!fGnkj%-+ z0m{V2#==E_3Te^Wj{GAV?YpN=ix~<^xF}h>nhi$N(J%|ZtUUm)y+8@^E}&U?TRxWbb5b! zGoAkX(D7@+@!Rj&{002<1=qdS>wER=DT^`Cu*04%jv*GOpH4U`cE~`$^|eFmwjH~7 z?|%BfzU#10ugcv`5A)RW@7YH7DEtvq=9DPht0%Z%?QxFaM-%%6ed0AfRtJ7O5|0QTyP$L3Kr3f`%EFD84OChMvwnQfYTkUB!}i8|(OgFU$?r^U z4qe++_94L3OGBtjM)ky&3xD3}w>s5ddf>*PCp#Jod=-p)LiOjh{C~*nx7pQWmcOSp&^rvCu6{1-oD!M4<&AND+2Y`_2i7eByr z?EimR1*fm|3$vc=caVG|zJSM#olS}Hx|TsiLqY-r!zTvCAFN4xrT`6K@O1TaS?83{ F1OVg!FA@L% literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/text-center.png b/comp/src/gb.form.stock/gambas-mono/32/text-center.png new file mode 100644 index 0000000000000000000000000000000000000000..f1736a9653e472e2d4914027c37e24ce1426027e GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;I14-?iy0XBj({-ZRBb+Kpded- zPl&5~flqvVyq)a>C7=jnNswPKgTu2MX+Vyer;B3<$Mxg{2i8CT|JOGNur&OYmuM6> l0CE_d1Q`DRKg=P*z;MAw@I9YLMl4VVgQu&X%Q~loCIG~)C<*`o literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/text-fill.png b/comp/src/gb.form.stock/gambas-mono/32/text-fill.png new file mode 100644 index 0000000000000000000000000000000000000000..554642e1a710fdf3fe9e9113f20929811676fcea GIT binary patch literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;I14-?iy0XBj({-ZRBb+Kpded- zPl&5~flqvVyq)a>C7=jnNswPKgTu2MX+Vycr;B3<$Mxg{2i8CT|JOGN{9xRBg^?le XulUP{)+&>LDi}On{an^LB{Ts5ZKWe$ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/text-italic.png b/comp/src/gb.form.stock/gambas-mono/32/text-italic.png new file mode 100644 index 0000000000000000000000000000000000000000..30c8d54edf4ac3c906559f693c9f373dcedcbe63 GIT binary patch literal 686 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaOo2l#}z`eYWy$HxZ+1!ZJp$ji&mpFbbSMFVkhaX^vO)KrLgLP7$Nk(ihW zBq368aR?Vq0vQlCP(f^LEJP!a4QD_!0;S-}Vq#)|f zo0J-w*LZPktf{*rl=&;;?J`^Drw&45q8&i<-+H<@hFF|_Iw?H-kb{KFbSXx`4U9@& z!2&uBK_OisjvLSa|F7%wV9tX{vGKJDa+Bu1zh}GB>5uy+zV`3>b(O3vbE@9$V-&v5 z&9CO}cRG4*YrrKgTLl@WS62T-7}S^*DwYWzJMjCo+4{nD&zu*Te>{~OchWsr;frdW zMvO*l`XqnFvI?zLKavH07~Bt)_)sn4G~0TA?U|nLC3D|DELSpnXEmW^itmYnTlb@u zoK7v7d;fQ1Q}s?W`NtW5^;XM7{r8-us`fd$@7jJoQ4Eq0^lOy)Q4CY{@V3#C7=jnNswPKgTu2MX+VyWr;B3<$Mxg{2i8CT|JOGN{9ycFFX8BM hw_XECuxm7OF~s@`=pHe0bp)zr@O1TaS?83{1OOP|CBgsz literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/text-lower.png b/comp/src/gb.form.stock/gambas-mono/32/text-lower.png new file mode 100644 index 0000000000000000000000000000000000000000..1cca4ab9942b293b400aab772aa3dc7c23bff7ef GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP|z&E zC&bmgz$XC-Bqk;Tc_}F=5Jo%_h>eYni;Dxw0>u*jj`9Fa5GV=q3uf5=%S8B^?m= zC-tbzk^Rj7X0DFirTwmGj+u3c?#rayx>v7eu6rZh`^8r;Vgird?RQsy0o}mh>FVdQ I&MBb@0OmVuFaQ7m literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/text-middle.png b/comp/src/gb.form.stock/gambas-mono/32/text-middle.png new file mode 100644 index 0000000000000000000000000000000000000000..5cf9a377134ac9fa5ee5ecb1acf5aa86c0c7299e GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~r@&x#V zxVjhkB!EGDd^~%7)JmW@Q%R6tFhj#^Z9fSh&&|`tF+}2Wa>4<&ANB$%8~*>VXFQYe z=l^|1rI7#PtK9x^PdQk}cq*YJ;Q;@Ru*QQ-EX?)|(j42F@-)v#7PKFn>(#UW0s}+s X8KvFbZdd;RO=R$N^>bP0l+XkK>_$0W literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/text-right.png b/comp/src/gb.form.stock/gambas-mono/32/text-right.png new file mode 100644 index 0000000000000000000000000000000000000000..dbf47c414a0c3b5638f0cd843ae44eb3c8d51cb6 GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;I14-?iy0XBj({-ZRBb+Kpded- zPl&5~flqvVyq)a>C7=jnNswPKgTu2MX+VyWr;B3<$Mxg{2i8CT|JOGNv@k?)CYB~F j?l9<=U(zD)EX$C!LU?1~o*UbMsu?_8{an^LB{Ts56SF4Y literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/text-strike.png b/comp/src/gb.form.stock/gambas-mono/32/text-strike.png new file mode 100644 index 0000000000000000000000000000000000000000..ec20e0c1e8eb2fbb4cca446f2f9ece21e30ab5c5 GIT binary patch literal 622 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAQ1D)W zPl&5~flpLaRD67VQc@C7EH*aQ!NDORAt4S7fZ`C4l9B>s0L6e(5RvHUXrN-CNJd6R zT3Q-VFc}PhA`k^Yl|TSgQ(s>X5dli&=H^1g;c5~S6JugxfLyr7(9lpI7bp%VXWPy+AT(>6|-2UwM`U`2{lwuG43iBCBHQatKiLC1)~6LHN&d53?Z^Dc=~~J5_CwFqX7A;h8}~WAM&Z-* z&6BxPAGjO`8v4-F#WBR<^wWuv!G|0KT9Wyk&M<0mEn3u|&@Qgj-lU+E@c+Mk%JD-j zGPAYfDi+3F0Yupx2T~=XZCAx!wOCEYmK{IS_2((zA_uMftZdoBDl?)BVnHFf(yC7e&|{ zfAcc;^Upew9UOoDU+7~ny1n_!d^Mf-hkigTe~DWM4f{*Cp+ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/text-top.png b/comp/src/gb.form.stock/gambas-mono/32/text-top.png new file mode 100644 index 0000000000000000000000000000000000000000..9e6919f2311163434ced259ed2db8ee0016b530f GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~r@&x#V zxVjhkB!EGDd^~%7)JmW@Q%R6tFhj#^Z9fSh&&1QkF+}2Wa>4i_@FA{+nz=MO#dzcDeuFo2OkXNuyF=Zq1pK>ZA!u6{1-oD!M< D!%{G7 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/text-underline.png b/comp/src/gb.form.stock/gambas-mono/32/text-underline.png new file mode 100644 index 0000000000000000000000000000000000000000..631bacbdd817f292f57ead6913d6451bd308355a GIT binary patch literal 661 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAQ1ESl zPl&5~fsccOLsV2$OiT<=EH*YaK0ZDnAt4S7fNVHONlAgQb8~Z(l9Cb=6M8I^=z?6dwHI1YL6=Z{8}yHXWZO?tLeI|hhr5! z?F-uca_ZaQ=aac-v2_b&sNVSxH2I6Ci(`nz>AjO*`W*@oX<6^Ea*eJiYsy65kOQs0 zsiA>lfzSWSA3vyZp-8`z)1bcUSxx+8HFeRX^OhG(bhmn1Fh2O6BXCYbVd1mH_c0!; zS|80hT(WYuWqNZPJ|o-v2;qj8aVSj2{w{oqdXybA?Tc6ZZ?ZT;!hZ)bRS-L;rV{a@Idt z->3XJ_f8<7+oC0U-_*a_q0^*~&y{O@_Na?rq^ivExz>h^yW!XRd}kDX-n3@^ntZc^ rmrDO8NA8bUtNUMI!jt+#dY^d(2cJ`k%qm)z4*}Q$iB}63how literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/text-upper.png b/comp/src/gb.form.stock/gambas-mono/32/text-upper.png new file mode 100644 index 0000000000000000000000000000000000000000..8756e7c87fc3846f6906584bf17d0d65c660948a GIT binary patch literal 481 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP_Qe& zC&bmgz$ZRFJ~1&dAt50pB?U+V0gww}1EqjmAPEGqv9VxDkZfpZC`1c{glK_~K$XZ0 zAR8hAAt78K8v;^OQz0TibLQ7r9|yWhyCldjn4#}$sLZb?TH>3&Y~S`zjHCA$TgZ>k z7RRmnWy4Ms7Oz?LxM=nMKl^@vK5IH>&++F#ZO1%a978NlKb@Q@bVz~6?V#S3ySuI~ z&0G7s{rmoTf&qtlY#l#08$9G~Ij-QcI*D1q%=pHRIaAqlR+>F#*zlplG*m6V;n*7f z63c)f+w_JL4J~W?g;$+l&hsNxTKfT?&g@3p4-930Iu^b&e8AxG;0L=K^Zt_}6-?@7 zzP){)OqR-Pq{+p}DEMw&v3Au0_Ddn1r&e)QY24jbdDyg9%_3B>!9;Wl*J7@_S(n=@nJ-AGww|!8Vgve!!PC{xWt~$(699jD ByvP6m literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/text.png b/comp/src/gb.form.stock/gambas-mono/32/text.png new file mode 100644 index 0000000000000000000000000000000000000000..49c799998f1c8b14813a658ab6c924b3a1b0dd21 GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wFKADC8|NoDVkIz3-E(cOk666=m;PC858jz#v>Eak7aXC5R07J~` w0||^m$|5`-X)bG{wu($OROl)+HmK=hWGEAe2wo#`5M(Wbr>mdKI;Vst0AXV(`2YX_ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/tools.png b/comp/src/gb.form.stock/gambas-mono/32/tools.png new file mode 100644 index 0000000000000000000000000000000000000000..8dbd84f7d0dd2d6a06b05b7a0b7fdd59efa4ecdb GIT binary patch literal 311 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5D5x9Y z6XNP#;FEv^LPJ9n6B8iGJhJjeI3Re!&b4^}l9t&b)O~|KRimKF>e5 zoB_&A^K@|x(Kw%+pdja?X|})N41e|acY;RqOYiP3=Q_cZlffnNY@uethh~ijt=v}} zMKTVszB$0;(?5~LA?k~qawelzV%2x1lK~5a_LloUVETP;Z}svo@9ug_%>O9MqH=)c ziNc?7#tg2YiK01~+djCMJyhJ}evXlqWx@{$t|uLV1q~v?4on(c4pA%ti+$cHM#&g) c8BAbdxG9q8-F@L{0?>sFp00i_>zopr0ExeCXaE2J literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/top.png b/comp/src/gb.form.stock/gambas-mono/32/top.png new file mode 100644 index 0000000000000000000000000000000000000000..c1b80ee5fbc5b5b79421884ad4e6e5994fd74783 GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~q2Ka=y zx)=B)BqYSg$IH%n^aUu$R1)MD%+N4f+fM?>bMka?43W5;oN$1}XLZ8@#+i-0238J| zIl>EgR;mWLUGrKoDRi|$*Nw2XO&XJ;wsI}f$iBL2YJjSNYYg{-TkO*sxfnce%3g8r S;%5Y!#^CAd=d#Wzp$P!QlrlH~ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/transparency.png b/comp/src/gb.form.stock/gambas-mono/32/transparency.png new file mode 100644 index 0000000000000000000000000000000000000000..2602d3cbced43ad5364de3122a5dafa62bf27791 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~q2Ka=y zx)=B?Sg;@=At7jSydhAKu_VYZn8D%MjWi&~z|+MsMB;LC!U5hHVU3Q=LW>!7`p#tV ylqT?$Dowq3KtYPhw4H@*XW7Etl857WFfu&)VsZVbAKy2iUItHBKbLh*2~7Y;W-KTG literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/trash.png b/comp/src/gb.form.stock/gambas-mono/32/trash.png new file mode 100644 index 0000000000000000000000000000000000000000..cadace73a6101f42aed006281c138be3bbc7b63b GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5C@2x& z6XNP#;FFk`n1BlY|Nqb3bZrw*4O>Z&UoeB#rmr8rgk5>~94KPt>EaloaXvXgfyqE? zxntu*h6o20UOt(FOj#U_DjOOkofJfm_&YN`;WSwA`J}Lie)FP41&7KC0R{$>E1lsA TVWo0FQy4s5{an^LB{Ts5v$i+7 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/undo.png b/comp/src/gb.form.stock/gambas-mono/32/undo.png new file mode 100644 index 0000000000000000000000000000000000000000..180eb862106bc914e66faa43ec1c7e8869ae62c9 GIT binary patch literal 360 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaOm0(?STeKHHN zX=#axi9o^1iudL~lO;=n{DK*-Jld?il&gWK;@dA_cBPz_r_XcQTAv9iKj~pT1XMKH z)5S5w;`G|d-h2%TJT8Kwf*=3C{j0AvL4tYNTc@;_(o5zBDt=n|(4s)bf=`CMkNJ3f z>82RngUx5wWiUG!7W6$m)OKf88Q=SWAG3CS^HJ0+=d z)&ITm-_(TlKX_(($e*0G(kVc_&aT&L-v8*ZHOt>QPH1C#dN4t)RsVtAt&7ioFVB~{ WD}0${Z?ZGcc?_PeelF{r5}E*JYl`0h literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/unindent.png b/comp/src/gb.form.stock/gambas-mono/32/unindent.png new file mode 100644 index 0000000000000000000000000000000000000000..0623d4e0982153ec84c108f49986c1580d3ac9fc GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~r@&x#V zxVjhkB!EGDd^~%7)JmW@Q%R6tFhj#^Z9fSh&)(C;F+}2Wa>4?hg0)dwvlxY(8Poz9 zmP*v*`)sPc``WpW))UzB3Kp3$@%b+NC+RGi7Mrkt}ErWMkN#q}Unq#qBH5 OC!lvI6;x#X;^) z4C~IxyaaM=0(?STeKHHS?IFJowq^70<89;d;J0l|_IXM}~ z=xv+!189zLNswPK!;D*8{`$XWa$ehikca!Gy$BzFuh30@pmd6-i(`nz>Ewh3S_!Es zNy*7cDMuC09@OJueIpa`bZ6_s2I<*cWr->W`ZUiUW)*p!l9-nEkY(k8XMA;fevSgV zEI|i5uFhl<=we;bz&}5~vXSe?hc@;Tf?vWEdYF5(BxZ7HFfq74SMp$L$@u`ZkHOQ` K&t;ucLK6T9Ct*hb literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/unselect.png b/comp/src/gb.form.stock/gambas-mono/32/unselect.png new file mode 100644 index 0000000000000000000000000000000000000000..180369b3100dfd20d9eb7b059f40a69bad329f01 GIT binary patch literal 526 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP;g^_ zPl&5~flqvVyq}+6TwGj4L1_GcsknP~$5EByv5dm_eqM{&D5D|zP2niPf zGD1T`fux(88;}IbCL|;PNeBRnzzqai2N8r=3K0jAKtYH`pgBM;5J0#<@`|W1t-`wwRscsHFayWl(2%~o1 zho6%7y#IVV%jOsS#KEcK2hfmxo-U3d7N^%ve$IEufTv}5(1Py0-|tn&-TQygLtClK zBS@uczs}F#r1`nN-i{&@4}DNxeA+#~9 zFH`W&dZh&|+xd=%+Dz^D+E}_^Cg)d+$0fogffwRUcU)uLy>)@_?lawY@&!9;G{SzY zm*%*5VVmfww>G{xL&-_NS%G}U;vjb? zhIQv;UIICs1s;*bK&3}Om~pB$pEO7?z$e7jC$lgiAt63K-n4VlZlEAjNswPKL&I!s zKM5eu+SA1`MB;LCf&!m`m4jrC@B*HdssV1-yjDyKU9He{BW!Jx#-ymNT#GcaudbRJ mplaY6!@b}Z`!q)m28Mb+@doA{H=BXRFnGH9xvX1@2cFnnRXr-IROfpTB_$Ez!TS%BFBX*>QvOvzVXwJO38j`P}xWgs1&iDQeSv$q#fTgQu&X J%Q~loCIIyWi~Rrq literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/user.png b/comp/src/gb.form.stock/gambas-mono/32/user.png new file mode 100644 index 0000000000000000000000000000000000000000..ad88670d1393d8d4000c96bae27f1433c262f0b0 GIT binary patch literal 414 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaO60(?STeKHHkU&O8Mh1{9DJg-A%%49W zq6{LEn3xFBj!fGAmbeGBQL!Y*FPI^kV~ytLhkqW2P4#{imAsmrg}Lj@1E!Z=_J{4J z{JwMOcI~8hM}Ue~db&7nts_VS2)bg&rV#~OKeaGaV0;;!yc1Y}CW)ku!!lvI6;x#X;^) z4C~IxyaaNL1AIbUeKHIG{rmU*`}b9=RwXAVCnO}~=jZ?b|35xH{>6(IM~@!8ckf`wHsf>VPw53)F4#q0&nrIcc$Q^x+@8dUS3A~9r{2kWohrGNdBtS0#U=bf R_kdP2c)I$ztaD0e0swLkZPEY$ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/video.png b/comp/src/gb.form.stock/gambas-mono/32/video.png new file mode 100644 index 0000000000000000000000000000000000000000..2dff5bb2a257967977b11ce1325b580defe151d8 GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICy0X`wFKAD9H2?;?#L9wy1@$vC-adALWepeI7ShkWNzhH(UR@v*VbL|5n zfFd5AE{-7@=aUl@crFDnTx8-@*qdX}=;At~VS+@2LMNx%f(31{tZkAh5#5RtgqVa2 xN}0J;j1RN$oY}ygkfE4!I)P6?gwctCVdbBKdf(YERshXp@O1TaS?83{1OR0LI%EI< literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/view-detail.png b/comp/src/gb.form.stock/gambas-mono/32/view-detail.png new file mode 100644 index 0000000000000000000000000000000000000000..d66380b597942fb4bbe3e0d3538e41a7f93de8ae GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;I14-?iy0XBj({-ZRBb+Kpded- zPl&5~flqvVyq)a>C7=jnNswPKgTu2MX+Vyor;B3<$Mxid1KczIFA)63pTN?^vi0jB aMut=sk=$?gTWf)e7(8A5T-G@yGywp*Ya=uO literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/view-icon.png b/comp/src/gb.form.stock/gambas-mono/32/view-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1b9d59f238992f62d28e40d6077d1be675b97621 GIT binary patch literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;I14-?iy0XBj({-ZRBb+Kpded- zPl&5~flqvVyq)a>C7=jnNswPKgTu2MX+Vycr;B3<$Mxid1KczI-;h^mTd*z8f`Q?6 XxcozhrQ4nYRWNwE`njxgN@xNAT=^pQ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/view-normal.png b/comp/src/gb.form.stock/gambas-mono/32/view-normal.png new file mode 100644 index 0000000000000000000000000000000000000000..7cad22b15ace98f040e956f9c85a40e6965d9508 GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5D99h+ z6XNP#;FFM$uzvme|NsBT$H!lK^Y}SXim@cfFPOpM*^M+HC*IS=F+}5ha)JU+OaMa| zW3r0FzJ`fL9n4A#nYx@57zH?m1z5bKIF(oqV6&H7%|tQ3aMB zmV;a$I2L3dG!VHP#nYZ>A$z!3;@)x_AI@VkiVO@)%zl!mO|0U8RxxNS%G}U;vjb? zhIQv;UIICs0X`wFKADC8|NoDVkIz3-E(cOk666=m;PC858jvIJ>Eak7aXC5R07J~` q0||^m$|fc`Ss5=rBq#h30b0{GKca9-KoTQRDTAl0pUXO@geCxw9VwCk literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/view-split-v.png b/comp/src/gb.form.stock/gambas-mono/32/view-split-v.png new file mode 100644 index 0000000000000000000000000000000000000000..fbd06b262033543f67747fbbc2b0f46f080fc814 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wFKADC8|NoDVkIz3-E(cOk666=m;PC858jvIH>Eak7aXC5R07J~` n0||^m$|5`&rzB*iB{48W9tjJr44RngTe~DWM4f!wDxG literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/view-tree.png b/comp/src/gb.form.stock/gambas-mono/32/view-tree.png new file mode 100644 index 0000000000000000000000000000000000000000..47de24fdfa5512238bc6e1f8d37bfb9a1931843f GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;I14-?iy0XBj({-ZRBb+Kpded- zPl&5~flqvVyq)a>C7=jnNswPKgTu2MX+Vymr;B3<$Mxid157g}a{OjKaYWvtQLS+u i@BBD6HWMa(1_sL)B2u3|XMF-HX7F_Nb6Mw<&;$UzRwU^F literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/volume.png b/comp/src/gb.form.stock/gambas-mono/32/volume.png new file mode 100644 index 0000000000000000000000000000000000000000..d28e168ed2c3245e44a0fd0b2b52a2c7ac134d57 GIT binary patch literal 475 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaOE1AIbUeKHH<h<`SXD!97IG!z}cy(sj;!KadB}#k;KHrgoFej z1IP^u3PKivtA{Xv3V;Bp7)Zi(L8KriKuDm-c0KE_Kqu*x1o;IsBr}FH-Mif|os;Fv z18&WwpY6PUzhpfm-Sv3F4Gx`Orc?C~y0!iJ@!h`LyGJK|!#SY7U7jwEAr`0CPJS-b zWFXMeEFw4|P5;L3-~Z01cUdVvd3Ht7e%gUL#WJ7zNm)xhr=A9 zeQZ{FO?$TdHn?5a_W10p$6w1_=iT~au3&Uz;?e64H-eX|6zJ^JEMCqb-uRN;ZrU#+ z=M`BW0|gvPkA>Os%@Assk*r+WZ^*i4;{>aN6PTt&c*-VzFh3x7@NY_K(y2A3UAbS& zryq?kw>9|gmLN4zyPjWHzPhep-s13zT))rE4ZDrQlNNg(1p0!()78&qol`;+08(?h AMF0Q* literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/vpn.png b/comp/src/gb.form.stock/gambas-mono/32/vpn.png new file mode 100644 index 0000000000000000000000000000000000000000..afc398f64ac1c0d28b21f6144decb82df3c0b960 GIT binary patch literal 320 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaMW0(?STeKHGUVq)Ur;$mZCfh15ENJ2n-d_0T^rGYAef(Z!;Kt4oQbaZrN zWMpV)C{P3_1qA>9{}bP0l+XkK7A$Lz literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/warning.png b/comp/src/gb.form.stock/gambas-mono/32/warning.png new file mode 100644 index 0000000000000000000000000000000000000000..27f25be80c377b5cf27ceb06db9979d72c3f855b GIT binary patch literal 336 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs1s;*b3=DinK$vl=HlH+5P(8pW#MLLWFgiLq9tPs#;(*N9*jR|b|Ns9# ze*8Fb;zZ>Q^)euHN`m}?8Te}6KKK9P`*bGjly;!tTu&Fr5RLP_7dP@Y8wj)}PU4)f zhe7x0RLKS<+rue*>Rn&L8h8byH;CBnzp-y}P{G{#lk?9NU5}l6{mJ?5$G4Y1!lvI6;x#X;^) z4C~IxyaaM)2Ka=y`eYWy#Ka^eCB=e4JQy@IG$bS>gocJfxIi*FIT z!MM0MAPF=tF)zq6{wh|NsBGy1FM%o;-c}w5O-1q@*MzCFP~i zUqhgw+9g4L!3?%acPHj;W8z@`?0imWLD?VIv}h@f2Rj&@eq~9&Uwq-s@5q1m|4zCW z(b8-g$@vbb?VzWNV~EA+x0BPQnhbc_7#qb>G@WlgxF#a-uHNF|!LYVD4*Tm*&Nf^9 zbjNop%i%$3ZzORO5+2%LzkH_3N=wh9Cf?w;*l6!V{mYiFpvP5S^YLJ|f zpGW9*(Qc0FbJ15W&Z}p#@y?2_IsUP8scMS}18-uVb{_MW3QL7+yR~y7yco;kkEE{j z_;|N9sV4uj!xsONcKxaa2Q|!BYsTdsJAGi1`H^`o>AzjF1G%jvG9F3k+Hk5C-Szl+ c^!x{=go);+e!=z+fu3RTboFyt=akR{0JMtAC;$Ke literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/webcam.png b/comp/src/gb.form.stock/gambas-mono/32/webcam.png new file mode 100644 index 0000000000000000000000000000000000000000..a54edf8ec3114869b7645e51b62705d134687428 GIT binary patch literal 440 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaNR1AIbUeKHH3)_Fh)3S7g+#fB(a0xvU8& zI3`*9(Jpq9Ge_g$hts_#Yv^@ZcwI`^b>_yhHD4|*pJREdKX2c<8-Ag0-z=|LeJu2K zX^5_18Skq5r;mAj+hG^|_hHq`S-y9hCWbG+QJ?>`@qpCLvU;0%vp$t?ALqC;#hF@b za@^w)Xq4BqDpvgAQ`Yd{D1+gTsf%Q)AE&4ngfojgFm+{RYFfhGCf&eoCsjb{Ba@p(^=if4ZNNn?bomo*cgW(&*uB2${bzV$#Sio$gQu&X J%Q~loCIFuZy!lvI6;x#X;^) z4C~IxyaaM~1^9%x`eYWSrKQEi#U&;thK7a$+3{eIkdTm+lmt`-U-0x&-hzj$l$}Tm)DPP37;hGm3;5A&Fh2gubRU6Tx*WJko$gT5%Y;F?~S(o z`#bxip_%~y@|D6jkH#bd4SM70;uvCa`fN}-f0Kd8l#55*3iDZHc6_h;|36<+RYRlE zCHafpmiJZH%`ZJG`p@F`VC^2g(^dB#vA%P?w=P}aV9ws&led@>ERVV_E1Gkvt6~>R zL`J#fL(!ZUdR58p<{J)aC|u%9Sz~wICRwsCNI-jXWzhA{okDGoZ{J!sg=<;jjMku~ zvX*=s-j~%6TS1jDo9Qt_Ase6^YCqKF$ zet4pMNlNU;Ly9)47Y!6@rz;-0V<)My{6f{id&%*CLX}iox-{9U<~A;qIC0g%&M;-# fiJVX7I~W+&%N+djX6p^0zZpDT{an^LB{Ts5`||M> literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/wizard.png b/comp/src/gb.form.stock/gambas-mono/32/wizard.png new file mode 100644 index 0000000000000000000000000000000000000000..5a3ecc5bf90c8ac407d286cd43d48ad874b2afdf GIT binary patch literal 302 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5C}Lq>HjiC zvn8%wioaqR3Y6*cba4#PIG>!LAorpEfcAkT2B8OW4B{X7*(O%k9bol2?eOH+>;lGT zECMGD8E;Csv6@6bkz4pl^8Q}uP^Ith?kcnW`_I9+xBR`_A`XMS)#?pdt@oTwv}dpw ztY!Gcag%FCzXI1i+m_!Pix_fPkGONNp6IJ-Ph)N6Qn=^BmT`|ov$8{Mh7S{u3M0d_ XjrKPS+Zg8qUB%$(>gTe~DWM4fxT0oI literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/zoom-fit.png b/comp/src/gb.form.stock/gambas-mono/32/zoom-fit.png new file mode 100644 index 0000000000000000000000000000000000000000..9b54e5d4cdfb4cd1c51c28332367938b5d618e5e GIT binary patch literal 554 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaM41o(uw`eYWy$HylnB>_nY$jQlpF+p@(TwF;>2}A_QPE1ThmIZ2zjg5tf zBqSt27!eT>Kn74TkOT_OpFck%BO^667069aPL7F*0ZIYIfqH>tT3Q-hBT#|m{uMw6 zGw7ED`2{n46aM#TGuQ9%UoE-JIV`QpS9UzF){?DI`1z-SbH&v)aZK!D0ZNh=uc~Pa z&C{8`N;G&bQ0re$7sn8b(_1G!4?1ih(BeNa^?1>C=c@OdsrUcC72xzN5qglw_O9L5 z`nP9ziA%lATo=|tnH5VuFO?Nzny=V(;d{C0vB`;kQ~1@B&v;+gm)3cA{1B^DJBM~g zboQA_v0h1gL+699#20H`bg$k1zC`6soDok4vx!3zBiCQ`Y*I4bvm!lvI6;x#X;^) z4C~IxyaaL*0(?STeKHH<w_lG~euw|t!E;SGPKhfgH@0QJh541%=ha$Qg>26# zuL3H);pyTSVsU!wq}P1S3OucXqOO8_?wgh0`>%U^QSgD>l#^w3TYvgRd3m4c553|j z<60OXu3u=`dPBtT>CDxFHrXP{t4>;oy(+SD<~g4tFhkbea?$C2llL2L#71@8IaAzt zva0?B`|gzU&c)NXZi+ERPgrQi!zguKK~SPi;*@E?kv2u9=$EV9&j{2ef7tfH?vnMh zv)=>ntyi10`?S>B)TNzreqX9<_vV#8ijnVG(i6CnKW&Nnyc6Fnc7BVo_xyTk_16sT v-x=lq-0bSU7C7nsF}}{ne?9hud@1{5UlF##_nE(deq``;^>bP0l+XkK3Ouzk literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas-mono/32/zoom-normal.png b/comp/src/gb.form.stock/gambas-mono/32/zoom-normal.png new file mode 100644 index 0000000000000000000000000000000000000000..cf8117c643ccde307bfb2d89a79a31e9b2bbb009 GIT binary patch literal 503 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaOc1AIbUeKHH^e9H2cr<0%Hc}5{3+GHXknb55Y5(WDn?H+P0IaZgzZGz>`9Y z6_*2rPi{Z`YENpckgemzSsSjt4zr&7x_ROhL#?j|OG=ijZ;JC@ckloFm@k*Qe`aw1 w&sh7fdG5>g!gD8>|Bt!lvI6;x#X;^) z4C~IxyaaL*0(?STeKHH<w_lG~euw|t!E;SGPKhfgH@0QJh541%=ha$Qg>26# zuL3H)>gnPbVsU!wq?>%r3IeWzqOO`d@?+oq|DS5O_SB_mCYjG!^UkG|Io0JXSM!>z z(mU(2cg$JCd1B|Mp1;Zxx24PQs+dgptD;>FJ+mcP#f~qYbzyqDPIb&%9a)#mS3wEe zUiJUXXqTzT`4+Uepj+#LgqG85D-V}8uZ4TIO_0)JjGmtx@Or-D&tr-+lp<0#oQ=*1 zI2b5=@@}f{wN0OV%+=d$_r-1hWO1EcSu;80RrAah$Bl2ws$c*4adV9R-a47wT=}=> s?niXQGtHS`{Qt~W_lDOxPx{N)BNBuriEaBM3G^U?r>mdKI;Vst00b_yp8x;= literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/access.png b/comp/src/gb.form.stock/gambas/128/access.png new file mode 100644 index 0000000000000000000000000000000000000000..364971129e17e4f681683892ea144e54255ac1e1 GIT binary patch literal 354 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?I3?vN&YJLDI&H|6fVg?4jBOuH;Rhv&5C}mkW=+ z7OuD-QMru=sF$%M$S;_|;n|HeAm_BFi(^Q}z2pQ5*2N55EGJnOv-QX@xA3xGVm)Ng z_AtYQZvo?_(qQHJ`AZHoh^Z=kP`KZa@0BpYe;cEx0P~d-rVdV=Tv8`Z61dMW$Q$u$ zG)XS->tj6d=QBrIgWgOwA0Xd#nRrtI+X}uZj3U*In;e!{NUfYWLBsEqNV?jo&BjMr zyB7Goy|m&ryL-)5x1z7>To`(!42*aV_>_VbEMi=oaD-5*mpf!<>9boFyt=akR{05NZhBLDyZ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/archive.png b/comp/src/gb.form.stock/gambas/128/archive.png new file mode 100644 index 0000000000000000000000000000000000000000..125992b823885a1d67cd23aedb5408473376166e GIT binary patch literal 309 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?I3?vN&YJLDI&H|6fVg?4jBOuH;Rhv&5D5x0V z6XNP#;Im-Cg88NX|Ns9_NJx0}=uvWV^3R_?%gf6vDk|FB+xIo^H3uqYED7=pW^j0R zBMrz|>*?Ycl5y|t4Qsw82NAc2H=6>T-t%>|nsUx?aDODEv%nV(0tS^??d7tH~2rJ$>Pqg6gkE3NFn_0SE zT@O4fw4?oK)L9{m)}ujZg(_N)x&g_SqqArI=boW|utxZ7|HVH_GviY~C(i1BTYVzP w_`VCszy_8B_96^Q_bXEwZZmaQa5K1U)Yn-SaytCL>_s4XPgg&ebxsLQ0K|=ZG5`Po literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/audio.png b/comp/src/gb.form.stock/gambas/128/audio.png new file mode 100644 index 0000000000000000000000000000000000000000..62dddccb183b82638c234f1cccf0086101225602 GIT binary patch literal 1560 zcmXw(2|QF=9LMj_V5YQ4ObdpWWXq^mk$oR2YlAS0lp)5GRBqUEb(f5qEenn*4Hra4&LW;&pH45yT9{2zkAN--b{B_Cq?8gBme-4&RBa- zXrxJ-f-Ka}j^r*u10oW8IvM~rKbAJwRsGGo0RWcbe&UpaQ{)K-kynMQx{3p-R4RiA zN-q*90VGshRpuEUleDT3c#ydMln643e5lT&G(kO+$YYT}CLW{{c?=?-F17I)Bz|^) zfPrt3DiDyc4#^5?X5x7)LK~9^(xu}6{xyS?0Es*Xfd?5fNMN2nv;+?#FiFw?5FA>L zPHevt{AkU&3W0QfdZ2*19+l68(h}NOXLwnp4#>s|>|hZ1EC`El$vN8waUl3=Few=- zGV$vPnIt~sq(igT^FS{mHA~a3XM+mq6lhyA@f}c2hw3#miN9)FchUpfS2qV_;H4SX z(n9c65n6)JJPqx$^wzO3CqjB)F`lkoz_RQn8R5S)n4C_<=(T6%UuG|K%YQv&VqVsZ z>0s^L*jGoMp({DuQ0Vu_J78qkrB>sr zqRM%_^y~G~pTigMjoO2sCL=1Wd)#$ne*b0oTy&w=(7|`VX)?s#rtkl>P>wZA zbwdGwY@M^c&8bU6lm29%VT^KY@QtllJ6mjsuI@{Kvj1g4LuXmOYwN=8_^G#F${%X% z9qx@R_I**85tQ&67d4fs_Sy1tCq|&s#7XNR4yX6HahBjPY6QH?NCAC!CX`4ME5TCt zJ^;IKE#8w^X)L)Ij1lX>QpdHJkyAN>wWYifCkSS57oai9p@mP)CDMx)-9Mh zHae9q;tNLckJNqgYG4vVI2D0yrJB5xMXktXg)|D)m*i5xTy4f=W5xlS z>7%o$y79+Rl1+TkAls1wUrJ6)+)`_D&MFPDEGC3s?oQlZJ+x%e2L}%oSdG8xnX18j zCIk!1W4_1VXFf3~^nTrKq%fZCLOvIU#}>scIk**JU3~V1QHuMzjEwKKY z@+$EQJzhIoGs2V|S|g6~FFEOKuJpq`yE32Xq53y_e?@&ZJ7%UDncuLe{8zU=Id(>0 z{|@2XM7l1U{Z%7J<@!wgV~GGEXShKNt@B(SfyANV+~K~K>0RBJ5CwNysQ$QWF|0bk z2!_PmRz<~J%zJvkYs~mA5Hw>Ubi5prtNBS2j?&BCu*{yK`rS!Lo#4oB^3&Qgk*Kw2 zm#qOlF(qNpSRJ(4r&h`>G7;aP;oAJgk`+H*&9Elr!AN|~VbR$Jv<8aJ} zTh`W|>K8^U?f)3m&Paz0Sx5tYWzC-e`l5$s^3gsgL1|#9a}K1IyBHjFL33 YYWb|V6J~XT1^q? z6XNP#;B&vA;Q#;s4<0^BlUPi38ASo_oz z*juCp@*H+BK4b$jem9(c`#AK0WI;Z2kpt_K2BsH`tQVM#E^wT1P*z}m#mLCO@W-y8 z${6T{|BMyFKrRgIW0@11FzbN!0!|;{8!TTMGMR2Sh#B}ku<}Wm>A;u4aGJ%dflo(x g1*6f1A5p2P{Hffzi$yD@u!Hn_y85}Sb4q9e0HQ}`RR910 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/bookmark.png b/comp/src/gb.form.stock/gambas/128/bookmark.png new file mode 100644 index 0000000000000000000000000000000000000000..3f9920c6938443c093c51b55ef74f9274e82da3c GIT binary patch literal 669 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&aTa()7BevL9RXp+soH$fKtY=T zpAc8~0-v-^PYagcuiw8vZ`r;4<@Xu>{|9n`j65)zHuFsGihG5t9_KH+m$Up)!SV+s zi(cff0I6gPo%8}|j&MnkUoZpL1C}M>j1BkN?z6f{yGnI)_dMgfB*ehL_`=i0F{I+w z+w0l+hYWaHABw%`wf_A7|N7a>a+^#iSlFGLsrI~h@pD&)M`f{VA~q%^UQ;=B^jqs& z?%U$q^mF2G?AuVA`1=s5z{hXTpVr*W(|?}&jq}8h--&{sE)p z|6jj_Wqx@Aubl|5Bac@b0_)5;NW%4R8ME`@EG(4{`YRC-Ty7u>gmE zf2^0A%Na7VK7X&e_cIHphUNe5FW0iWI9&YuSR$b8|Ib?1*6-_Y_iy;}@B1%lvGekN z>=Tpz6%P`Q~`<=4;eg(|xx-8aqpDQ!6=?A-s) zMK-d0%NJMbY~NQO5$|)S2GvvlMCyJ#Y?lWT|1IxZCn)tN2v>5QWgmtk-JzCCZu*AItE4Dl6ZY~*tj@8C00009a7bBm000ie z000ie0hKEb8vp0KWkD{r5D? zG^OaJ2EhhR(oI>_SpmNRAIBeZ+;aN<`t%j;fK!i&f50c zjpB{e^wbx{7i8FE^8E5}+i)bvB=h|92f+ta)Kq5KX07V2x$U_Q!wwq88lvc;G|pV{`)@9J~+)ddEI%b>8Uf!GkV^7KhHmsZ>oyFLvE_Dak3Z>#;k|JAB@J!|=ns?!8CRM~>r; zLC-;m;fPbzQ`8D;+5o;-1gk=`|hFVq3HSOY}#yo-+p-Ac)#zzL(oG#&OOEO#ZS{u0>1*5<(81+ zkkRwe6vPx;)>~E7Rh;IWVb@`(>8QHyx^3ERwCuF?{Plm|f5!2~!0*6H(n>_oM2q5! z()7~I^2`ar376%Uk>ior_1GK68)DdE6~qaH4`i9S!!aiZK@cRBNgf9P008)R0U_o90000000000000000RI(0T!@|@ ztZDqY{eE=6_kd(q%`>SprRjw55|B7oEz>jWx9|!ercRblIoa(EpyY;hNvqEbKr&yt zCU+)3;Lw1~km7^f01=QG;}0_fhOFHNM%u35T+_MOy4J)C_>!kvMV>l76&pDLBBC4p z3hMQqLcP9(6YzoBv~-Osl*Xv?Vh1DO47KS`s|1%*=^7uPBCeYJuzl?|tJ2w{e1K{6 zDu->g(t^Ls4ZSOxYZ*TSJLze6C|2Gr^96aoio^5_el~L;@zG!4wi&=W)jwWu2JoED zKZeePv=2=;1n5?{efjTe8@VSF0)LbYui(cwS~EQHNZTcTc%JMKlLuUs{h#fua>ojDrP{UFY^V( z2KFnOtsR;A2LwAHbR^>5|5JU49}r6JaqEAXc{Zer!l8>!?OP6%cy?9$X7EvZ`@H!J zJiV;$z7m*gxuEn{W_d;#&+Gc|obP3IvDm`dPkguViwOV#00000000000000megOQ3 j1poj{TmXU~6E=SU!HTe`O>f%(00000NkvXXu0mjf1$T4s literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/calculator.png b/comp/src/gb.form.stock/gambas/128/calculator.png new file mode 100644 index 0000000000000000000000000000000000000000..663ebf831ac1e34a0a5f1f0f17a6e4539c06cbe0 GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?I3?vN&YJLDI&H|6fVg?4jBOuH;Rhv&5D99h+ z6XNP#;FFM$@c;k+{r~qLIB-Boowo)k#aI&L7tG-B>_!@p6YlBa7?N@C?bVH<3<3f! zj=C9++))?meTA49`>&ks*PB(KubQc8&+bP0l+XkKlzlxJ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/calendar.png b/comp/src/gb.form.stock/gambas/128/calendar.png new file mode 100644 index 0000000000000000000000000000000000000000..37704c38b93471cc8ab643cc25437665381d5430 GIT binary patch literal 429 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&aTa()7BevL9RXp+soH$fKtY=T zpAc8~0-pphIB?)VQc_Z4Vj_eKBtt_(f#m)C{Qv*|PfklqN=UesmvUYuJ|(3n zDQV5>bsvD{aFqo41v4DH`CotLtzR=ZeX`E3W?*1s^mK6yskrs_)@i;b0|B?hiPhPs zkAANYj}<6!kQH9$DSYnczlC)zEgL=*DJuO6ylR?zyCif~?8^0bgYGWBarM6bov4eq z-)C*DUcK%9)#vYBrhZ*_?Ig3+>)5pu*<;q0Zw-^X5cNJQZ}L|@pkMzm)Ls6@@LCq= znxD*z_Si+e*LtAGKVwa~sK67(gH_>-i)|9N+zV~k(|VUz=3eOmgZ=B~v*+)9&0xRg zyMW!C`jY?5A8Ps%y9&7$|GzXb_Ai4c$f!@Ocgm)En{fk~AfQn1Fw+7^KjDAi%K;W) tV0h3CV(sB%g!2D1Gch!LX6ksc#g^f6-87BvrhUIbQl74UF6*2UngCLDtXcp7 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/camera.png b/comp/src/gb.form.stock/gambas/128/camera.png new file mode 100644 index 0000000000000000000000000000000000000000..961786aa6600d7c22a84dd25f33f79144ec14154 GIT binary patch literal 575 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&aTa()7BevL9RXp+soH$fK*5jz zpAc8~0-x>Mw|94U_w@8ETefWf{{3_2%sFu2Ktn@Ab93{eMT`3S`gZQz+1S{)X3d(V zOP6+bb~ZIN?cTk6;>3yDwr$(HcW+Be%Z3dbR<2w*d-m*At5)sVvnTre%4b0H8B2ov zf*Bm1-ADtnTRdGHLn>~)y?L>ySwVpHf<$9k=#&mA)BpeH&-F{c#ks^QD#7~Oy>K}T zVbL=4<-$!098C%*_&@(j0h$B`4g2{kPRhV|4;mWM;?^jxJ$WNFuZTG>wl<#O>fITF z7qmZR8wAy=HLQ72DCsfv45P-W_u3bWJoqy*SBot(Gj(_~^|6w!!y9uJCDjGInVz>w z8k(FKLY6R{Fj}LnovP#@dP_Vklfkx?X@x&iz{9m0y%=`{S~MJEX?QpDrNeZFfZw<0 zxGJV9p8Mw|D}SM4c8uM5o5GJ`vtKmay#4>z){3tz*(C=yRX*#!`~JaohSzrgf2V%8 z-EfgH?f0ePdM07n2lJTD^%`584lZdZD=W~Gd8zaIG2;z+#^2s2{z-0 z4=cGPGDfk-|FCjadmf9M@@e|hH@%$o*XRSO5S3 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/cdrom.png b/comp/src/gb.form.stock/gambas/128/cdrom.png new file mode 100644 index 0000000000000000000000000000000000000000..e4a54ab0548d659e714aaca6682efeea275999a5 GIT binary patch literal 1516 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 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/computer.png b/comp/src/gb.form.stock/gambas/128/computer.png new file mode 100644 index 0000000000000000000000000000000000000000..3eeb747effa2cc5983c07bd254e4837afb97fc94 GIT binary patch literal 667 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&aTa()7BevL9RXp+soH$fK*7lY zJ|V8|1wQk^V8Ma~3l}bglXK_JUA%bl%$YNR3RkUKRbO8}b?Q`z%6aqV&6zU?C;|jP z1wg?`lO_R0W`hAxBTxYl02x3jhyox9VF1N}DuEGjE#{wuLi%ah@^zSe29a$ zimR9Zwqw5-7#K@ET^vIyZoR#EGU$+lNNb`HlkB0Mt_2$BgpKz6zr1tNs+Wp)L!RE5 z@??(e?);C}d0WD|A6uNeA!ozHq43~8!#2@=1}2UjH3tqF0|gp@Y=s4u40Xy%U?zlU zIL-V)UYLm^L$BfSj$``w8?SRS2$?8wGX$9|kY?C&vB8gF!3BoU;^u{1!Zr%4w;v2> zUCt|49}@D_a*O-Z{vy0H{u_D@Ol>cW^IARwCoF!55Ib>b4+hF7v9M>SM;9WSGLu54$sov zTOY^d3-A_%MAW?CJ;Yenx>$a%qs4)B9}3r+bFkkKwX=O)F2J`zd(N6K)*${lxi8io z>=B~-?wr00H0`qfPU{zI3U*Gc606p#`F*y0k+Jrf`@)e8kq_^tYjGQB*Zj>p&2)w< rom&;i(RpUNf4+=Jjr-}s(zpEg%gvGnHpX29#vFsEtDnm{r-UW|;Nuu< literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/cpp.png b/comp/src/gb.form.stock/gambas/128/cpp.png new file mode 100644 index 0000000000000000000000000000000000000000..56bdbaf5fb86856ceabcbcaefadc0b45b32a9da7 GIT binary patch literal 1251 zcmV<91RVQ`P)C00009a7bBm000ie z000ie0hKEb8vppa8!B|NsA2)mQWU z^JCa!{r>&C?z_+P&wJi`{{Q{~zXALH`}h6#3&INpzyPY6hvA1z(o9&@SfA&g=K1Cw#vL!qFM{BLn&z4w z#~#Y^${EEO==tca>aFzr^nTxd%ks+z!3dV+me=*y6vPyq=A7O3-5|#xXW3`z`RQ%i zZT0;1IL$Z%zypioi`ezpo#vfx+irB+bo~DOKhHma-+&6j3Kqo{>-y{E_~kCkF1_x( zK+ixC!x5R~nPk{xrRb&X`s{Yyc5vHp`2F}b%r(RC!-(OC48jae(oNO$)u!pD;rHPx z$|`HxYc|a`cinfm?YIZQ2T0LK(DTp}#1jp|4dVFXmE@J&_S|6CU@OWiv+T2Y-FUg} zxrE?^(eu%$>8S7f?{nO9y6(C@&pvtGdBE?$M9@Ui^wNdkh0OBI55o^o(@+(}73%ux zfB|D5 zw9rEdp_kA*>Am;fdk>`d{&yqoNw$zYe2}BP%<%4~yB(ePF|tml(~y>iKp+ritYr=W z007|s1!z780000000000000000N@!A9-axR19V)g%@N|#m$LySfKAnUbs6Qe3IH{A zA`t~!*#XTx!X5=R%z$8(SQ?qdynqJbjLoconOqm(WPlS;ZxJR zNROuu2v5tJuUp;*p1wB$MfM|B8JTofolGOWI(5K^Ecv6EdVBJymp8x%I8PPNSr>nX z^c1oI!X;F&AwDN|Qh$;SFi-WiB(D4qt{;KFfSXkBQ6ll&=x?uP0~8V9aUv1Q6+O3S z`L2RS`ogWYOyvW|HSa4ROt;~>WoI^D0mtYJyi^B>5TIWjpo;)y>HuE}@GWWKiZwD~ zv`Ud}o%+X2)1*Bu+hd*qhnKnkuNUsvsA(ILq_aH(+GzZ7b$~G%-=YrCPvd{81MH*m zrRo5aG`>q6V2H+FQ3u#Y1Zl-IE^l#aYcm|XbpjX{Yc!&T; z?WtXnAS0lU0N3rQhhngh4-kA|d`v9gwj!F+6Hl7hRzwG#tMEINC>iGhWK+E}&gfaKs$=T;ev(xgNUy!}P4*8(m#|NmCU-^5K>hCu9 zNEn}vqvrm^+^+-0pR&xkeTWgD?YHhIu_>$7zGy#SG)s?rt~zZ-`tm;jocQdzxxL}t zq7%D6WwyE~WEp9ryU)ebk>>JR2C*sOjv5wCwL)%qT{>no}j^y(LT zn-spVh<3bF_`(A3i~s-t00000000000Du#K|F8f6fRzhCAP_4y{sL%U%l+vj N002ovPDHLkV1hj_g7yFa literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/css.png b/comp/src/gb.form.stock/gambas/128/css.png new file mode 100644 index 0000000000000000000000000000000000000000..a9a8383bb943fa4273cef9ad98422108a66b86a7 GIT binary patch literal 2205 zcmV;O2x9k%P)C00009a7bBm000ie z000ie0hKEb8vp-)jKtqhRKV zG~jRu;BE!<%clG8;^cuQ;dT@J@aE{0NBZj8{`~stpj+#pT=K$}>!f4z$e`eF2mST# z;BgA|&#e3G-{5cw^va~@mP+4k1pDmX<%KNaat!aafBf<1>6lLDjXU(ssNr-E_SCia z+``{&1ONT}{`&U)_VDekaqX&X?y-62kwWN|N&fox=a4|{tZ??zwDZQD;&>PP>)q*^ zQTW}&=Z`-8@8sZd3*vbg^vf7t2V(FPr=Z-w>t8e0X7X0$*?4@M#!YZ2h(y{25OZVBn>YiBWlSSo- zGVr*C@xYS&@a6sY^6H;i@VSQUre^7zQ}Mu){q^nn;?4EXt?sUL;(HtO$f5b;&hWa3 z?5Akse!w!ee0oJYrNp;L7yNrS#0F@VSTg+rj(m z-1phN=8HG<&Z_+L>fv<}@VJEb)wk=SUgLZo@xPJpw0`~f@#c&;@VtxcscZP*%l6i| z{PXMSn^NbHKlt6n>!M%jmrUl2Iq|%V=#)nN^z8cS+4k1C_0zNBdK%<{C+@O(?5Ahv zkwN(0$M3d*`|jcL#hc=H73!Q-{PO7f=hfwgFZI!{@3VaQ|(il|gUL<|U0C89C*Zj3EcIM8#!(rGkRa8+$6;iJGmx}^W01Dv0 z3*h>Pivmyp3P1rU00p1`6o3Ly01DuL3NWERe?!fx)fRn3`QlGsDy;G~>(iT7`W-Bd zoaZHgkD{`5R03LJ1wHs_AJFxYk2!cftm7!wvzI;R4S<_Q>a+yS;q-*POxHt-4L#=u zLm$6Q9^iv(jsEnhpD}&)OitIsHL7cVyuM|MEWoXA^Zn_svB?e>bp0IF%S3&gEI^dl zpZ+n?8;6VfEo3EXD@+e8lml35>P|mF=6bEUArR|h&H9aU03qi7^jgrJbY-xKn2R5H z&;0v#e1Z8;DQb?*tG*6DkR$_8fcrRv z>`{2x2jrs4I@ssW!jD4nZ1lj7z?|j;cQg(vr4j%R>;hWJ#*cwo7P6-y%a8o*X3#s3 zc`rDoHN=B}ULpao0DAbAy4o73ZbxP>Ke_m|^O2c}te5HYcca=}5&-+4=drXpB?VQ} zS=Y_9p^eSQDrB`#Js%c_W*;CO-oVM~{-}N%v$j%wIok$Z;Fzg?J-k4-eSkLpOMA*J zUH`rbc#2RBhRdHP{OPPgxf+ z3r3g=o>?aZM9Zn}uK8ISU>E9W{@`y?VtD(#8@X`g0Cx(kA0-J;z;>OrB=HB%{;!Sr zfsbF@k(v}h3+m*)!2xnc3rAigYj{XF3)6FD0G6RHCJ(Wk`(lKVexZ8j7lM99lK_~D zdbne#4fR$EKhPK!ug-f%AoxiF0FKl5hx93#KKwupMz*ks*YE7K5AZzdAYEA?sbuvqjmOT!X4F~V&FWSLW&Bt7Q0JY>Z7brh7;85@tr-@bpH|D(6wcp$?F5qr08|gN z<@qLUc!G{wJY4)X$*9_EAD|C9_9q+M5yakaftdJ4L-nG^Isrixy&QVI0unX*0KOIc zM#jTrqix`XkD-$o*|8sL2_6$)k9;M};Exi?>2d60zJ$ylAHOd^19rfV!gBL{L}#&E zB+l8(;YaslM>I(S;4HZWhzJY}ck_qatK@g{&W*^A2BL_W$koL_7ZKTO4oF5yyul|uQe+KWbj7s5yR zb2tKbHJ33oaO2O?yl`0^N-lqo%ogsXUERNuote@QDl`NhrQd&vTxP^dV}I-McjJpK zdS3LdwGpXX6D$!*_2W?+X6(+=)L%>#fC5ke3P1rU00p1`6o3Ly05$;Be^@901#tBO fsG^E0S8e$ly`d^Cgu$5M00000NkvXXu0mjflLxU^ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/delete.png b/comp/src/gb.form.stock/gambas/128/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..fdd94defe9b523acbf2483e938a2e4d24c05bd77 GIT binary patch literal 1876 zcmX|B3pms3AOE3?O+`4T5Q~L`LeCMIDbeOEw`r2woRgd|yP)Z@naVA>h2v8GHBWU8 zol>YQDf^2Ku`HK#Mw_ur#F?|@GPj-IwtxTUdEf8*eLwH#^Z9J^63LFkZ6zS>Uc8o|AlF5VV z=|UnA6oR>$qqGHcm6d=(;ZrCeq8=g&Ma|)Z640DN8HH@l#Sj`8a_v269wFHB<0S0-h?Xs3Mq1%ep+k*I^`M z{epl4=5LqV7dy6UaIWu{oY3yup|exIt`(`db}(^M;5BT;sBCxrio1PMkjRAc7XszG zUC%17bf^;YqNOH)X!t(Cpq%%q#34T$okD-Yo+aF9?Yc^PJV)xRg;^I=<@`X#rBN4@M13%o*| zo%&aN^L0$C{C0m8(6nzR_tPY~3|dqPJ+L{<=S#GeXzg5Z>b5Dr;fR--d&79$!OjNv z7ti)*e7V#tUn?(PlQ;i&IqI5QV%Jl% z%xAiXv#{^rbtwBSvArSjna23qpF@Lj)%46RJ}}Vq8Ono)L!IC{krr)Cc3|h0I^xs| zcXrLC(;@Bd7`g@5&YoF6wsMCveA`#NDu5o3V%hr2XY;%IV_*vV<1sy(Ft1)$<-dCv zIVko>mNZb@+yZ%2L@AoHi-q%xW|{EUU~$N!9kYs*<1D&Ot9Li+hv{bpmjrgTlWgb8 znNv@vF`MGwOEliBz^=aLhy8iR95+HOkl_2geOudGD4hWXw_Q`+=WK_VF&>R+k6)y1 zY)tcPm3!L4oTN0dA0~ec!(q9aqZfv<%#o}8q5YWuT}FA#i5qir3Y

        dOsKbOp_6WG^vm4Ci42NvDZEGFdzD#*4xy-7T-r zEdh?}2U70x=jI;`J6j+-do0c9uW#;Rq ztyVmPPvuI^{aUE&Fz)_xewEee-IWuIY}dCPLADye%wgZZq;bh+cx)ye{SR;DnXp8R zXtI$5CbuZPyC;h+CytfNLiG?su0;?mau=CMyNo(=uwqE0W0Zbmu2O^;M$7dkOHJF( z+>*IiO&l|rJZ*?ra4j;zB2P$PL)$WnHXGcf?-ZvPS8a9>!p#7WjaKvy!)m-I964^; z!N`uGcl>fC{K^*jl`L(RVU=_{#xd@olNjy{=THf~C_*RwNPp$+PjF3r$u-X9BFGy= z2G#^=wRaxcQ@2!E{}JxkAiAS(@L`ZsScG}|u_OqC-0ynchnpaO_BA}Bx_;t}j-h9+ z)!@gOTyYMvE}C2fztvq&14nG0pmA8|<)KgI=&KSyY=6%EZ7HS`l95pN;46w6gl z@@iZls5f4AtiD&RKbB?2X`73hVM&Cu2uppZ*xcptyWwNeOeY08JNIt5+0RYIQ{I7` zCKq?ly)m+KSwggKs>rvry}i`;A3?@UcFun!XneqhGVHsZ17c?HD<@M$%k}ORSY9Z1 zNXz)Ngy!H3{Ye(2^OJ0<)giuznFdf}tcePOEzu({pqw+YrnN!JSeo3itG7J!yNn9Q z;bW;idunKJEKv;Z?=((Z|IH%);1Yg5gKx8i5y#rI<0gYQ@%~uK^4LxN$ob_6f6mN? zi3PirAp&(`d%*N+ezbgz1oPo~RCl@N7eqo%o4dbmJT7lFuBjs`0Qa1P_ O27J8zydHW+UH%t1FTKkE literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/development.png b/comp/src/gb.form.stock/gambas/128/development.png new file mode 100644 index 0000000000000000000000000000000000000000..a3b533e81e5a75cad456564bee4519371f7f90f1 GIT binary patch literal 460 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?I3?vN&YJLDI&H|6fVg?4jBOuH;Rhv&5D5xIb z6XNP#;FFM$kd%}ZA0H2706}76BAmTo!2+Pj{rvodwc9TMwQ!XL`2{mHNcs70Y25t$ zS-}MR?+gr#rk*a2AsP4HUfaui$bpA7p^jzIlKpM-1T$_l3ubI$=Pka#s;KxxRD!EZ zV)AC;cddN$tYyADWu3EIx;J9YCaKe#U5-Mcb4_{T9J zCgyG1%nTBW&ob0hpJ({fFp>F#pgQ{l=V{CrlIJlWc+J8gpy1HJ&=}ABF5mQt6(bW& f;66)4eI&o?C#9JMx^r#;gO$P4)z4*}Q$iB}_rIic literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/directory.png b/comp/src/gb.form.stock/gambas/128/directory.png new file mode 100644 index 0000000000000000000000000000000000000000..1cb343bde906434ecc1a5316837531502aedf6db GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?K3?%mjbVdLv&H|6fVg?4jBOuH;Rhv&5BpBcm z;_6=DlfV4_jw|ndL;3iDf{Z0We!&b5&u*jvIYyo?jv*0;-(FkD%izFqz+qa7=dvRS x0xIwSugY(5%Qz*jm(7_O6AzC2f$;rtOZvOK7wvzYv0I0MDgFB&r99@ z_4X5+*s;j+U1bxleYslEp0VM|VG~BRXXY(Ye7l$TPLiAL|F}(H>&b?5(c#Bed|+8N zeHvFpPV0`odX?>Qt_fBQ3{3kxT^vIyZoQqwUUb_)z;&hD1d*$rqN`79O?#qJcIVNg z8!v5N|DLbrr#89p44c4#b?S%f8TPp|aqAeE^yoxxN}1^MJmvqhM_1N_oxR*W`|o5v zt(yE&vnF=Qxof{o_~2U2v~cDPSDrsh`6qtVpPzMXx(t8PV@uV!f9?ngZ9enzalH() z`?2*Uwg1*1nCYx~IN+Aw^X~Z4eKY*Gm;2|)GnDh)y7Xi5&1e6F%{RY)t}vn4v-#X^ ztrJhzUeVa|#lfom<;S?20!|4bKes0uMHy1Ji54y{T=t1f&Ubrq+pyNz>E5J?=1afiTK+u9 z@;0OFYumSiSL@~9f4pNL^OvdbiD>T~-Cz8kf2skeXuo z-b>rrdvAm38jd?+;&0bQHLm+nui88BcK$5g$i`_m-|XJow(Gw5B$h4zZ6|Z4FwJDx z#jtxSm$F&Hk^2pT{Y=X9*n29}j2=ZL9JzX;<2rNNg>@c2$Cb`>{A6PDx$btPbP0l+XkK D)Yk8s literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/earth.png b/comp/src/gb.form.stock/gambas/128/earth.png new file mode 100644 index 0000000000000000000000000000000000000000..0ab5d6ee1c640446f19ab1cd525b678921cf8a4d GIT binary patch literal 4351 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 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/edit.png b/comp/src/gb.form.stock/gambas/128/edit.png new file mode 100644 index 0000000000000000000000000000000000000000..78ae5b38dd99ef7c6e7b246665ca79d28ed9f0a4 GIT binary patch literal 585 zcmV-P0=E5$P)O~5um z2e>WZQ6LJ~B&Yxv10DlNz&b$#I0|^pA|1o?pVkO0;rVZ?`3i}EQ3}WaO91i#Y2X+R zQ3yx_O8|s`BoG2dDIf`ifKdvN7U?7fNWeu35CAzq0OWu?pa{qVihwMj3CIGP0B(_v zNB{>cNB{$10StfzPyh^|02n|3G=KnTKx&cH0VzNokO1@n2|ypf13&-|00At31h4=S zzyenwfCbJ#0Dp*AeE<)f^#O@Rx~c;bz*!wYfYXg8c;xDP>1o0N0Pagj5(eb*eP2S7 zFayBjEr=2Z0iGY(Bn%A>Y!YSzuud2n3$RL)5eEs|Z XE(x_i*2hRD00000NkvXXu0mjf3bD`} literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/error.png b/comp/src/gb.form.stock/gambas/128/error.png new file mode 100644 index 0000000000000000000000000000000000000000..6c3b296b34fb74f98fdd5c52c846c58c70c62cf1 GIT binary patch literal 1212 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&v7|ftIx;Y9?C1WI$O_~$76-XI zF|0c$^AgD6EbxddW?X?_wfUrhf}aC?LR@_^3-9OW-^LxJKC^YVb?gS@<}4Gj+p3P9|F0-#0^BR~IcQPG2(9H7Wuph!Z(y+V+& z5JP~B`(X7T2E-7EMj$&c53UAi6p#%u5N<5Q5TLOjE5LREMS!yRfEvL@K@A6TfoA6B z-Ud1ttQh0~AOmhM%;f+7|2sFA9S3^fza+>nnBk&0_nBYs84sV;mtg*D{5_B@=zh^} z_hL20ZXXWY50kGg54bx0=95W1Z63kX%4;4UDco{n)`_m_%{IqZsQ1opf2UC9>BheD zwC_ysie>j&^VQitFfcHE_jGX#skrrac4qJ+2Z1)n$rBcM@U%B6wBI>Vds<6w^}D;j z|JR@O+PQUWsAqzj@#Vc+r#?4!wV#@7bosNNiVz62T;4HPuXkR;%B0ejR)W7bB(WF$?rRtpuYLu&RwtE{~8$typvzKLQZ>~@qvyw&0{Ik-@7$- zXM`_vdUKK~Z%dy^tFSOr;ye${`ij{N4JuLXkG^i!6j1mYxS?htThkRTrLV<%!IfGAG;o zuP;9K@n5shjN{F77P=icVc7RyOv9-n_mZw|utvC|PWVX)Xs_KMqKcD(L*8D4bBBb$<%OsX5Ii_)` z_klyA8)BGBV;VcX7c^=c6mZ5o;*!v7*;)`%ItOC;Ty0k?%Osp7g0-@aOXx zHBL@;s><`HO!7bdQe5qcxACW=nm<3y+2`nZZ;@ht(8cX9Pe@OFvNq~hnrY?kc{PWd z>Q1-ST<)s7-B_2tNoi?EvB?ayqnovE1tz-kyPu| z7XIIT!xZzv6{Xg4Cpy2@E#x)Z z&&4wP{yy&OhwjgR-XW3n@Z0-E55K+TSt@FCZ~k*YQVw7{!)&4rA^KkWv zqZ8}SrG;LcdHw$VuuZ4;f9Dqq_xao3I;q+3{haT4-@fdZ6P5e=>#qNn=gZRLEi=#M zK5f7IPv-mTzFFScMg}E!C4APT7KgZ6zY`Y{`n3Ne_npoQrz+&S#DTes!PC{xWt~$( F69AjbPfY*- literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/exec.png b/comp/src/gb.form.stock/gambas/128/exec.png new file mode 100644 index 0000000000000000000000000000000000000000..999e4f9d283b65cbbdc1da164c16bdeb551ec696 GIT binary patch literal 1166 zcmV;91abR`P)C00009a7bBm000ie z000ie0hKEb8vpEHxMMrQUteEnXlUEp z+w}DGyu7@3cXx=0h~?$wdwYAdw6t_|bbNe#i;Iis=;*({zj%0fYHDio^73S4WY5pf z?Ck9O`}<~QW@l$-+S=O8%*?*NzPPx!adC0;^Yi@t{C0MBsHmu6VPTq@nzy&N@$vEM z>gt@FoNaAw-{0Sgii+9U*|xT}@9*!gudj@ZjN;&CQLCjrjQZe}8|~)zyH2 zfaK)l`uh5Fb8~ELY}eP6Da|hK7dY_?(TJUb*`?iZfJiBRHNvPS8Q>}l@J=#7lLaVB2AE<2rX&O0WC3nV2FS1g z8My!vodwV%f&oSow1-*Z(JalE7=;F~2q|gFzi*O1O)o%n<)HVmRwBfL1*k;3K89x! z-LKc=xOWhW-J6t{ae{QT0t#UCoaC)^f%xh|+RFD{8;}4SF*2~GF9HHAk^oA<0gRDA z8iN8DnG6Py+XMp0l7Py>0Gu;}0yLIE0Om+w%|QSxg!_1?m+X3^z8sEiQu>rEB!<zaZImCFII$enGM;uq4Z^9Q1hUoxJs@QWOZMsr6{k~tDuJ|u0 zzYy1`EJl6e?gyu*d&_B5mfHebwFfI4g!1Eiy`yr+_8(w~YgX4>&FYuZ+w~3A1B-{M zM>bDY53Sy+9@~9ZJ-Ga$dUU(2czA8f9$v?nbhYDq`~?L9AOHd&00JPuDF(oQSReob goLvAE3Uy}n8(QtAZ5!e?6951J07*qoM6N<$f)H|2CjbBd literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/file.png b/comp/src/gb.form.stock/gambas/128/file.png new file mode 100644 index 0000000000000000000000000000000000000000..179fca1b599b762852a588f507b954e39621b52f GIT binary patch literal 161 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 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/h.png b/comp/src/gb.form.stock/gambas/128/h.png new file mode 100644 index 0000000000000000000000000000000000000000..f6916a343d752a26e3a170282ac9ce70f3849012 GIT binary patch literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?I3?vN&YJLDI&H|6fVg?4jBOuH;Rhv&5D5xIb z6XNP#;Im-C0*3tz|NsBL{N-}>y=wM@?2msuW z666=m;PC858j#cA>EalYaqsQTg}e<00&Wl29pGx= zI}_(QY@1Yl{_nG5^;vBWBHBjGKjZ_{*?>kcJm8cld%5N6t6P&A_Dyk%?p+7+hJyT# zX*XtZ)-ZqID)0fR%0I4hcbiqLalRUe*TB+XFUC-GpE+jFSK(4sQ*V%mdKI;Vst E07(B{nE(I) literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/harddisk.png b/comp/src/gb.form.stock/gambas/128/harddisk.png new file mode 100644 index 0000000000000000000000000000000000000000..8ce11d4251bb8c8e0e6a4dc3372c95d5f8e4d0fc GIT binary patch literal 192 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?I3?vN&YJLDI&H|6fVg?4jBOuH;Rhv&5D99h+ z6XNP#;M361Fn|912M-=BKYU;6!RvKEDaMi@zhDN3XE)M-94}87$B>MBZ*M4yGAIbR zIBEqna)m6YSL11Fw|;Whr{VpzoNR^MqXP&m2uon&e8O|1 fse#{>fk97NHeGyve9g>0ps5U=u6{1-oD!M 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 QU;_oSr>mdKI;Vst0Bo2J^8f$< literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/info.png b/comp/src/gb.form.stock/gambas/128/info.png new file mode 100644 index 0000000000000000000000000000000000000000..2f1c418913d5889a0018d6590db51fb0f92b57cc GIT binary patch literal 283 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?I3?vN&YJLDI&H|6fVg?4jBOuH;Rhv&5C@2@; z6XNP#;FG`n{{R2~OIAJj^Y`D;JD-l;{?xVo>8nq_?!5ZG=H6K*pi0J)AirP+hi5m^ zfShTbE{-7?_ugJx&D&rg(C~1b0|&QBOS{Vk1}^U#49)Ha42eu?&jMYV_Xv0V{?E8? z$=j_fi(T?N4S;$X7_txS`o5VhWq5&A z;Xi+XzT@7`SIHs#ld7g%o$gsbw^H~lvmMs~JppB~ISl`V8+;q~8v!{Du?=U+nRbeu UQp)-0vK%Dq>FVdQ&MBb@0K{2nTL1t6 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/internet.png b/comp/src/gb.form.stock/gambas/128/internet.png new file mode 100644 index 0000000000000000000000000000000000000000..1b64ccc2480b0a7baedbf05c812c012f746d81fb GIT binary patch literal 3722 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 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/js.png b/comp/src/gb.form.stock/gambas/128/js.png new file mode 100644 index 0000000000000000000000000000000000000000..1464d8ade7df70f803fd4df2cdf939e0d2625bb1 GIT binary patch literal 1453 zcmV;e1ycHnP)C00009a7bBm000ie z000ie0hKEb8vpYZ2Yr)U5E{^yWC>!M%jnNOggp#T5>-)jKspIPp) zdEaaS;BE!^<~?4@M&(y{25OXP$r`|RHI&a3+9*!khi z^T?q6`19az2ldab;&&AO{QCa+^y!#R_Sn1UkwV~b3G>FB`|I4}eHhlm|Ni~` z_wwLy2r_~6RnbrJgL*Y?%7=Z`+%aSP&k82I7K?51VtlSS~j zh5q~a@xYSpt#b3npYgnm@VSQUre^;9`RSWe?W%3$f+zj;?fUB4^vtLD-pA#JF5zY!Wsf89=$m^tH`sdZ-dmQhxeCwcG{r2zh zyNTaz1L~bt?yq+H@8jTc3hA3t<%KQt#+~MiH{y5~^v^624o5BAix<%Tc!+`|6(_4U!O@xG7kt8e6kDdKn*=aNJ7%A@bM zgX4T1>6uXLp<{90d!JMQvg8b*k%9#12#!SK~#9! z?c4QJ8$lEYaA*R(ONfx*E`=h&3KWVIiWPU4BBe;(y`}E%?ymo0GbH=&_Jqz{a!aSY z?{9foc0a=ku{7|*|9y8rxOy~%Meg3U4Ajn1Xh5$ z5MD7^Rwe+$HeM}*u`B?ac=c?V(I3#db_oD~TYo^Ku$rYZBdyh%G-VVC()0$jSYWNd z9`dP(`2xkudIKKAQv03?!-nCy*ot%p)WFX3Og!!(xH5DGOq0SqHEweuso&KZu#pt5 z(F3DMeL`oz1ROvPYG7TUH}yILgl%w$Nk1S1v;m+nX;}cNWgytvH)3E9;GE)}H#FYP z98fe!ZT`vT9>xIfjiei}MgB}-3g8wJrDtHdIg=%T3(Jz9!|7=(n^Jq#tej9;z_2Uk zW=sn0P$@%z`#MZpWQ0*WLjcER?_MVr%sE&B+^x`IQywj-VGD3)^4w`^Q?RlIxDz`n z65Lz{0LPtpDcmDwF9(3LLqo*Z`WNtx2IQ_HiKEB$1K^itfH~NkDNzwxz+lfK3HZ?0 zOQaXc8;zO)YseHkL`C?fhkIVnlh-B*0DgLdW&m^=A4J_Y>~>~PVUE0xk^l~oH}bV# z0=SIP3U|UWp2BY^9HSO;B}#r(8UQa~?ysbDFd6#4N$&{&gYu}4VFT1ZYX+nWea7DE z#Y*ORUUp^STJt*(Ziz>wnAF#QblkV& zIQzZQtg|unC`Xgp`k_aC?T88*;2G{GB}UDK|Z+Ry!x3>~eNP6VPmmPw?k`LCV;xi2e6Q&iw7>H#NFF;#0)+ z{#^Wv2?7v+00bZa0SG_<0uX=z?Ew4_3j`ow+I8qC*Zm zt{WM{ySSHq7ZXz0oBsd*?oTrucbm3$2H>N*alCO9C@zR^~ zTa14%I%^%cU5n#t-j$sJzfV=EPFZtps`nQ8tFBsKFXkS68@pc3Xk}&I#J|zZg;N|? z@Azjv&4Tgux)ta5i>hzZPm!Fn&0^-ZV2A&`Cl0pVJ&@ZSV^gsHP}q}{^Lzfg=0%)$ zI(+v4%> zZ>QDF6ZaL81YUT(w)gM0^Zxyy+tDG4QQ0=zW3$oWKl*d`E7;0-ED!wu|4`4gIcZDp zXZ&)FR#@^qe$Ldsm#amyxP3fa?XBNke&`duz+X#m)8l@Xe=BtpCUqTt^TW1t_ARE< zHMeKU%~H>8G+bGca;MbePjqy{JneTjED8*a91aXj0z2#)=QlMn!1)aXnAi0g7=D!h aVKSW}Ca`0!%4uM7VDNPHb6Mw<&;$S;T8f+i literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/monitor.png b/comp/src/gb.form.stock/gambas/128/monitor.png new file mode 100644 index 0000000000000000000000000000000000000000..eef8c376253f12265be063255ae02bc54e0114a5 GIT binary patch literal 461 zcmV;;0W$uHP)yaaRw1uzS!3Nm04=$edz3<#ZpV+YKQ z83hqA_X!G@3}Dd)6y-kCS`vk6{VD^ZjznRx z4gp$2ybb{;tPCFsKf-`s8h)u5P@-+a+bV41kRBZ2UR&`d*@ z5s=0{Yt&7GrxlPyU;bVofB*srAmGaZ{EvkI*5B71^56kGrX~F000000NkvXXu0mjf DMV+j} literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/mouse.png b/comp/src/gb.form.stock/gambas/128/mouse.png new file mode 100644 index 0000000000000000000000000000000000000000..55ec080db4e157e6e70468e869435276195c60c8 GIT binary patch literal 744 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&aTa()7BevL9RXp+soH$fK*6E_ zpAc8~0-vO$r1<#ww6wIixVXf`#FUhj1Q-B{1DQYtKv|#^L>M9nWCKOe1mRK;l|Ta_ z%IfRufs6$U7Bn<8oc5c`2((?fB*-tALFzVZ;6(AS|8hT{SLaXv6}9{Qq+^lgyUHf~ zKK>y?K<(2xmS)*Q_6!V+Z#`WcLn>~)z5UYfkb?+og2t3Q9o<%@+}Qqo|FyXaIRh`v ztbQ)VJnwUG@8{N;db5h%mD>^}?)RMD)%8m({pX)+Kd;}iTlK0aXYa4tYY)@)80{{l zavy%0UdVKU!9nPJ&$Rg_)2Ej+^tGfVZTz=~p@d;U1xI}SEN6ZPJKos;dafJ{FO3Rn z6?hm}IG1HwDDd8Bt?Vmc__XuaFYN?IhlP8kq;D{62*3AVNZVo2ZuMgum>w*s`lnLX z;PN@;R06xhGKP}F`#(L6ZmX|aT=Bm_mEn{5luKe8M47Y9AAHr$bI@T6+14;uLf~ee zqYB%XZ4Fx`F5JpH=*82Z%dnquLe9Zlrhhfu6>Kp0&(h&rJ0~NHfCB@NDClJX`cbwbI9JkZ_j}Xx0#-Z_MH$@(BBxcjiIu4`8L)Q-9Afo9pau!-DVOg{e7;e z)^+argTe~DWM4fjbb`` literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/new.png b/comp/src/gb.form.stock/gambas/128/new.png new file mode 100644 index 0000000000000000000000000000000000000000..bdb285a3c28f9c7b41f82f19ec685cf1fbeea960 GIT binary patch literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?K3?%mjbVdLv&H|6fVg?4jBOuH;Rhv&5D997w z6XNP#;FFM$@c;k+_3PI={=Z)f6lW|6@(X5gcy=QV$SLr2aSVw#{Py}r-opV5Oc(br zna;B)MdVxIbggTeTNlXK N22WQ%mvv4FO#olAP1^tf literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/office.png b/comp/src/gb.form.stock/gambas/128/office.png new file mode 100644 index 0000000000000000000000000000000000000000..4ce58156729f73643bfddfe81a8c155ae96a55c9 GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?K3?%mjbVdLv&H|6fVg?4jBOuH;Rhv&5BpBcm z;_6=D6Td(H|NsB5zKBi&3Nn@i`2{mLJiCzwC00009a7bBm000ie z000ie0hKEb8vpEK3+5Z0i!NI}#`T3xrpl_$&|NsB}{r&g% z_wexW;^N}X&CRN+s?N^Nq@<+m?ChnbrL?rPrlzLK%F4F3wy?0U`uh6c-`}C3p`xOq zz`(%P*4EF@&)3)2(9qDlyu9At-nX~62^AqL00001bW%=J06^y0W&i*J2T4RhRCwC$ z+Us(HFc1ac0)egEuZkBGweSCoy-eHbC`mB80jqod;tZdILUNXu7Y>KR`Od3h7{CAq zFn|FJU;qQi;0#~@1MUW}up9<3fB}yKh?2akvu3+(vbxKYXj(v-I&cvuEvEtm`xXY% z?t=*c!Jz_as>9kcKzJ@F<9fm-AYOqstJogkT)>DF8%qGOgppYa8-UQiI?>Oes{?*W z4+u{%9ssA18X$bQ1pvMv1`J+*1pt<`fHT|*fDI)eE^Y@DF&#ii?mtQZtOOar0}}vv zRDi%W1GsAJ01gJ=-~ka} z01%-82@a5;0XYtkqX8Wb;G+Tc2*BT5e56JLG8`a70~#ElK?Alp!0!J8X1@fp{|IOQ z8+L$-Z}nC@BDvLv(TF5gAIBpSSzVCm66-BlCBHJvh~HJzlWR2J4# zRJE#w2z6CESXRqJUsey+_44m;p{}2QVDXX7yd#@C7+TFgw)=cIA60|PqwT@v7onGp zZu==lw|6kS{vF@@b=K^5O;-DpkMH>n3I;IXp#l6xB?B1nyZ{b|^R#&fYrA@IA0Tbs P00000NkvXXu0mjfw9-om literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/open.png b/comp/src/gb.form.stock/gambas/128/open.png new file mode 100644 index 0000000000000000000000000000000000000000..08d1154d5c7c3cb5c13139a9a8f66662b319e801 GIT binary patch literal 349 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?I3?vN&YJLDI&H|6fVg?4jBOuH;Rhv&5D99h+ z6XNP#;Im-Cg8b$8|NsAg{`~m`o&|A0DaMi@zhDN3XE)M-oade{jv*QM-rm?Lc-Vl) zC2;G4nQIT|M(`$FsrTQPGMk;DDJ3P_{P}Eo#Rr=T?riKfW@6zG=;%4{pYi%RK?R2f zhQ?r~+jg8B&l+-LziT>N6E!|yd%&xM@e_jqpABtX&OO3t2rl7x1rOTGhg)VA>$(z^Nfz<6y#2 z=)kKX6ys3B5O{#&gs_c+4ujzVo)bbc4mk{h2RJ>1a~y0Kau4u&2>CeFFg$Dy+V^Ik o2hf=c4iA literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/options.png b/comp/src/gb.form.stock/gambas/128/options.png new file mode 100644 index 0000000000000000000000000000000000000000..8090b9967c6ed5699aadf6d185078479b5a1fbf0 GIT binary patch literal 1234 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 Z*gtV`U&fiirwR-(22WQ%mvv4FO#qjykiGx_ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/phone.png b/comp/src/gb.form.stock/gambas/128/phone.png new file mode 100644 index 0000000000000000000000000000000000000000..ffb5b84c2a7f872273f21ef642f14780057c1f82 GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?K3?%mjbVdLv&H|6fVg?4jBOuH;Rhv&5D997w z6XNP#;Im-Cg8ldZ1A$E$^GBdKV@Z%-FoVOh8)-m}xu=U`NW|f{*A@ygC??F0IGbrJnziRw0lbnZ!gKczbya3vi$%1>mdqmY%IIID)-?Ekl~M)6h2sye}8Gg z{S|rlfXbE^0J%WL50*nsyR)bSsBEfzz(1f14NHRjf*D?OD*ySmf>|W|j>>JWudgyp zr_Y{~oO0?Us~KPVCzg-Dc|~XZ(mii*Nw2%KtK{NKv8coUb}%q7se8IOhE&{oJM((k zAp@SalM2j-?nyh{xcvTq(c4h(=nsN@DY7g6?T-1`oqGDxdM8H}q0V`iG~&L^`FZE1 z?qk8jpPrTl)~>vv7ag~6)Ay_VKYw?f{knJUuf=QA^Z)w#-VMx6e*6FZy8oUDnfzMO zUmen|pC_!BdzJC@-_L%=8tLsD*P3KSo~U<~btrV?6VP6pRMfCkZh6`P3I^LVYg4J4S^*vwC8wU9<=}=){Qb0%RSq!+3^=4T0N&XGI0XKD(%aQSUDf0#B6)Wpt5jd ze+%;kL;bsf3~B2sKQ}Q6Jju8pz;Mh`Dng{etxrsjRpC@((gFsb;u{w48DV}vgmED! gyMv0*-{@KfE#|}9w(RF?0j4(wPgg&ebxsLQ08dbeY5)KL literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/printer.png b/comp/src/gb.form.stock/gambas/128/printer.png new file mode 100644 index 0000000000000000000000000000000000000000..b948829f85cc6ba16b595fb730f48af91368d7b6 GIT binary patch literal 659 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&aTa()7BevL9RXp+soH$fK*9U~ zpAc8~0-t&qXlQ7FFq@m3fsDq+Mz{!s0p|i`f$YxCP9O;f3l=Q+|NlRbd*Hx<`v3Kl zCr_R;XAaPi*4Ebf^XJc)F=NuCNjeshtw5_KOM?7@8D6Pedd>Am`CE8*7vJw0zYOM_ zn$A1>PQB@u<2EH; zHpz9`j}28pb}{Zdo!4;t_510koTpX4e*Qh^zk9+?_QVA?Pp{bXT{{&$ z>E6%p692ES%3Jc-q_nj5OzXaz6&J$wr>c0BUNr5R_tk&B{q)%?r+v8}EoKyu3imt| zva8F0!TRrC?@KQVCrCG(InF!b)4ge$ybRgvuWV`9rF)pC;oslf3`XB*HB*MFk{zqQ zTt|Pl7i`HpZ_8Lz z-F%4O;YPGc9D}XyEceN$*cV9TU7pCS^lwk#P1ZkO8(SS6j24A@b8gs@Rd2qUlQG?H zS*$<1#d~+zhzX2-H6Ko>b!IRI3fWn2(Mqy%i1{G+Jk5RLbe&ROkI0$b%6@)8=QMCO ztmGC1y5qw?hBYk=3j$H&LFx3^!ve*MFD9zSi}Qf44t*B7FP6+%*oy`70ZEB`l6?$o2em`kw*gKmH#RI0Y0O8W`R) zE?|mZ;oz*%5VfKqNTbnfMWa&&L-s;uomR08LRANxGMI`Na{IKJ83_M6;G)p5@c@H! zBa<5wI}eM{4sM+S;fx1b9}c)yFw9|PXZWmiXwSq1J0Amnks0k;XT-VBOxHfc>b%w> z>ts;&yeN~at5#3T-TChMSrL%cjGvARDOA?-HPrpRzB};HN}xv=JYD@<);T3K0RVJa Ba@YU> literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/question.png b/comp/src/gb.form.stock/gambas/128/question.png new file mode 100644 index 0000000000000000000000000000000000000000..26086b58fbd5f4963efc7598daa2f77d318f6684 GIT binary patch literal 2316 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 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/rename.png b/comp/src/gb.form.stock/gambas/128/rename.png new file mode 100644 index 0000000000000000000000000000000000000000..309e9be890fd45d192e60e2d00f761c65821790c GIT binary patch literal 384 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?I3?vN&YJLDI&H|6fVg?4jBOuH;Rhv&5C@2)* z6XNP#;FACb@%!Wd|Np;X!-k-DHX%S+rjj7PV1|a-+I|uY42*1^E{-7?_uk&P$jM|V z(DHC=^9I?R16(-#=UFVr4zXy{+Cx}lMQ z-|;#lGvje)d4_iTMg}Ghg$5Auz?$z)m(ugkQLJO3l6rc4Ken0+!AyHkUm z08>e$!~*Uk3{9~=e>*TSH`+%BG%R3nWNcz$VJ(n3p1a%P*n#(KJM8btP7bp?#MX0& Q5g0xUp00i_>zopr06Wry761SM literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/scanner.png b/comp/src/gb.form.stock/gambas/128/scanner.png new file mode 100644 index 0000000000000000000000000000000000000000..4c801ac2cd93f7271b5996e9335217ef23508740 GIT binary patch literal 649 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&aTa()7BevL9RXp+soH$fK*6p6 zpAc8~0-vhyz)2B}dnwgrKI&a>*+S=O6%F3>;E}-_gbLZyd+ST;pk@OR*I==QOS^wh%2<&4a@qg?)mD9%8>h9b{1o@9;5`2v zVWx+!91ILE=4%wanQm0{rabDy+wzDHkITafK3Hq5_&Ha^UGbW#O$*j zSI^&g;6XZfgM8hOhwa#i{o!fb)e)?PatRckw&-(fUG6vydpN{?V zWJ>GQU9jfW`S~gb!o#|L{hQ3<^Oljn$x2}Z`<;pGN4_=8uu<5;ekUe`f%AC|Bj@uy zEh;57ZT(LeW!WeC%O%)%O;-OUdFPjLRoV`g8+FI;&3G(z$#%k*lkeS(ZZSL#*mZf5 z`T>J!@3&3TUhp+()3S*Dnhrg2m)5P8%xw^`(zn)IeuOb7>}cKOrJ37qicg)w$5i2P xz<}vqp92GvfWaPyIV~I@)(3lFs%m~LJpEMA{hN6k%778Z;OXk;vd$@?2>_SxCQ$$Y literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/science.png b/comp/src/gb.form.stock/gambas/128/science.png new file mode 100644 index 0000000000000000000000000000000000000000..4e83a9ce9be5f89fccac45fe19f4b28e6a9e7403 GIT binary patch literal 1663 zcmZWp2{hDO9RAOOtS!o}ls08cyToutQnC~&OGJa{q$K~!EY3{2`)6>S8;WI8*z+S)N4$Yk=VQ>P$=001{P zHx&FgP!bI(^M4iP7gZ_t_V)Jk^OO3e5}H3SFi^@+C=`@L^PnV~&0e&jTPa4tB9=0X zGkOqBF5QwyBor(5}c(_hKGlzrly95hM+I}_3IZX0}EYL!0_;JkOb=L z>b`vW0@wiFgsmFbobv%Z+E2Zem zj?7Q{_8&jMXpt}e74hSp#=f7I8@de@Ud#?m6v#DRSH6Wa$M)6Dy!{@(uGN&+bK;Rv z)0Op0Zm8J$WYly0)R`G`>{keaH?b#LyN0z7rBAwlGF|rSwkRovfF-|s?63LY0j@lb z`$QvZ*+gdrfplncwS)z_uJtswrTO$e7 z5u(GvF*z@m5?U|eIkneuOhkpZD9i%HiS>2Cl7#HZM=~^JsF4}|GD+^DdL6{7x>HQ zZ5j9pk3Ve~RQKHwPe-uzlHG+yr2cVyMCE!Op74>qE6qpAC~)(>6^b0Q4fA%Ihpm=J zRdiSq^xGwy)O;L_?mZGQij|!?tzAzO@`rGJZcv?f>224^bi$K{+%}r3-o<%#`a!DI zl6D+3lt0IaQi7P_OZ$yUhzgY}jG0#0f9@$#z!Uo?uY}9*IFy`04s{f(>IqMms;9Ig zBYZLYf)14VCg-J%T;K(-Ki0RMX`CrX-HJ^!(&C)um1Re3iOfxjlbANx@vZ|OGYrgNiecS@8_*~wRvs$VH}fg zwbt6;qns8;cg8@|1D||)bgFx~ti8b@p=u8zuSVNjeq->_wOYWg{!01V^UcL9cBBuetcF{lc#xqpe%<_cz6Z-`pGC8gGNt_>O^+%+dQIv>1;y=-%*io z;F=j+X!u^25@gpMXDDR#+w`t&)ronby=n{jN_umxQ-6qE_t8KFZ{3W{l-jzaGnvc6 z=8q^omRlWX8sDOxCgIP7JUG#jrQK&~N-RNKMoJZPJ=uQc`WM*Q_2Xy9x<6yn!i{(q zVV~)rA2YMH)P%QUzw@WR7164(frE`KRlU6q9=p6kg??7a6K6G?21&*Apbxn2*AG`n zSh5y*jBNoPdv_ek6}&ApKFrnqN!)Q{D=2pvwiYYhjNY7JQldZ%tPu3H^&Jcg4GP+6 zVP?Kdvx@dfK037T^6x$`voiJDc1!z-QQ4Cz5`FqG?Wuul9&4q|^+yEY%~B&2xnqr7g`bxE@ip{(cbx%}ZIn%5OJ{s+ zeNJ#<);~E#_xPj^>z>Z9)M15ii+crrc3fUfP0e`Rd5reej7~K|wk7%*A@;V8!~z@m F*T20p_sswR literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/screen.png b/comp/src/gb.form.stock/gambas/128/screen.png new file mode 100644 index 0000000000000000000000000000000000000000..57c1fb724f180b04b25aadbc6447b889171ee497 GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?I3?vN&YJLDI&H|6fVg?4jBOuH;Rhv&5D99h+ z6XNP#;FACb2M!$g|NsBzzf0|aQcNX5e!&b4v$g#sfV_537srr{dv9-S6l_osa0z^S z;3nTSv7CedvM(LrXneTG=bzYzXY39KHW_@&`ESwipV7U5p_uu(Ed#?lCZKi*I8eh- zuK{HClx~~Wp2p3j#i-7_h_i~>kL`$12=g4C4wV&r7Lo?@7KlAaIgrtGt6?%@GUqEs jKeir~75p=%_gyVx6kzQ?7u*$62Qtvp)z4*}Q$iB}*q2ju literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/script.png b/comp/src/gb.form.stock/gambas/128/script.png new file mode 100644 index 0000000000000000000000000000000000000000..0d45945fdc872332c0d7b379428135320f1c5b80 GIT binary patch literal 1129 zcmV-v1eW`WP)C00009a7bBm000ie z000ie0hKEb8vpUteEgVPXFM z{$^%ofPjF{&(C0BU}9oo`}_NXf`VsfXZQE_z`($kmX_n=+9>QtE=7J-E(tuY;0`a-rkp&mynQ{r$JMxAOAx^Yim=Zf=>GnfCVfsHmuDXlTB^zVPtyzrVk@xVU(DcG;P3D6)6>&_etw&qoB8?qWMpK+!@~lv zjtBq%00DGTPE!Ct=GbNc00OB=L_t(|+U=XiQX5eaMUf?fkR_1?A_yZ)&R`obCK!x! z&N=7o|6h19r?qG{l0C1B5`A~KYpU+4snP46o>D`D%jI&RW@9;k1319p1!xH@2XFuf zZ~zBz00*cefcM8D5P0^yAi;10G9E$@CmD*;aLI~@%QjORsgRF9K^5SSBwDK+oHUa zQs@C7X9Q3n@0=786iyidERolw?nr0G2;ejTPw~_E4y$H#g1|HQd3>)Gz{4mnKY(8V zV9E&K5_w}%n4^$10+=B$C577*E*Jq^C2th}8Q&LlB6{0YQI^1ucsZE&D_0Z)0JNrS zP|^V$pdJCrjUq`ApU1aWu4sH0@*q0Ud#jyB;sPk>-us}+X(TRy3DtY6o<`yVm{h&D zQ0+7l7eGoq=}Xm4BXI$YsopE|*)t=6fxPOyGM_y$0$3++M+&PH_KW~F$&+13S6aQK zga#NV@DF|nKVk*2L*Q3@w|Yql4$#L){tG`0KzB%hLaL$-=|oc4mvcx8JpllcwY1{n z4&VUw2(X?IaSEjG;BU%2Sh*sR4SEob61amW=?U z_pW8sG_q&}aG>|Ds+DPI0O`HM|1yol0ib*Dj9!_B1{fi52!FknX(SGSH3GZvck!D> z0E6UhN#VX)nT7_KC2vE%)I3%z)6f7n0GPyo(<{@^03`w^@Za^yG&F#0C|}}t)ygz9 z!1*#0@iv8@0DLe4D3bR@3O^{kF#_l(@1oq1-|CKp2FUS^UOt)c;V-vXJ%s-)2XFuf vZ~zBz00%hy0R9gP2XKI+3*d6Oj;#Iyy&j$hlYrQ?00000NkvXXu0mjfbRRYL literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/server.png b/comp/src/gb.form.stock/gambas/128/server.png new file mode 100644 index 0000000000000000000000000000000000000000..25267e809a09cc25f4ad42b34031c1f9810d83ca GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?I3?vN&YJLDI&H|6fVg?4jBOuH;Rhv&5D99h+ z6XNP#;FFM$@c;k+`Sa)3|F6H;`PLLD#aI&L7tG-B>_!@p6X5CM7?N@C?M+2S1_c3@ zgXGhJ@Mc9TxN5UtSux TB!T-2&?E*=S3j3^P6C00009a7bBm000ie z000ie0hKEb8vpQj}u&{it z;B~6tro-UZ+u+~e;Ht&o+}_~Z-r#hp;Md&Xq{85vzTnQ+;F-MOmb>7*&fu}g;IGHv zd#&Kz-{9EX;LO(G$JF4Jy5PUh;EJ{2y3OE+v*3iX;C!v%bE)9I&)~k!;Iql#vdQ3i ztl)U7;C8Fvr^DdP)!@j~;Fh}Jz|i1|wBWnV;D)o{g|gs%uHbh)k6Hi#00DGTPE!Ct z=GbNc00J{fL_t(|+U?udcH%G;1<-)G3MSZ;K2G19gSNYwt{ z@7lMO>VqG40UdSyzuY~*FVwuyu?kQfFlg)sG}K5;Yyt$IVx_d`DwlHUm9Pld@NSKY zXPOb${;~*I^4Ojh1Ezew+}Q&NzW-{P%=S&bOB2=r3+~m(1Q2octu?@y=RdPszTdKZ zYz@$tEq2WSU0L3@23X4$hh~7GEPt>D*vb~?W`Liv{I4|tUx#OAfK-;>SOf43WBBYN zc;2!G;PWcj!zlot5kM3cK-DUR1kiIU6b?ZDnxRkt;&vzufc`IwQ3wF(3v=WjK-r~1 z@(rNZi<9IRKyQ~v$tQsF7HG*Ifby4!$s0i1XsxDw2mq*6Dz%V+r|s(k?|_%>YXWZz z7X15)3;^F3@Hzkh00000d_DmFQ3(J5-xuKO{e<8zNB{r;00000004NA5W%;a002ovPDHLkV1nyWs1^VK literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/tag.png b/comp/src/gb.form.stock/gambas/128/tag.png new file mode 100644 index 0000000000000000000000000000000000000000..fbe2159f0aa61fa40358048f0a7a84325fb167ce GIT binary patch literal 669 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&aTa()7BevL9RXp+soH$fKtY=T zpAc8~0-v_Al%S4)4C(FEQiY(eUPfzRz1J@eqe^e`a3(ofhEm@6YY!=JO00S)aex z-20h{Q^WHA_LpnjT^ug{eJl}B_Wx%sYwP#*xBEAI`S<;owAguhKlX`9{|YU;Og~>& zE0nxzwvFNLpZ5KITR%U~QmEX_tMcpT_d=E3lJ1*k{gk$x5_azY>6(2q{nIyB>TKUv z9}(|!rv}wi|3vD3JZzT-68|mlTPG;>CkR(^%sa7OQTV58!7Hn*#zWVqy^@E0@rD$LsZH`KBCe>mg8dW{7?%2`$ZFK>8OFDmf&JkzTGfezo2k9K|S bzh<4`@N1ge%O+i5l3?(3^>bP0l+XkKjA%9a literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/text.png b/comp/src/gb.form.stock/gambas/128/text.png new file mode 100644 index 0000000000000000000000000000000000000000..20c482ad552684b3a648552c7eb8389f94360e82 GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?K3?%mjbVdLv&H|6fVg?4jBOuH;Rhv&5D997w z6XNP#;Pe0g{{sgO#K*_qRDQ4-D9%_Ck{w&jLK?a6OQ^_06zPD5oCYy0G)ILaGX(jpZDUV&iC4HbF N44$rjF6*2UngFuHG`s)+ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/tools.png b/comp/src/gb.form.stock/gambas/128/tools.png new file mode 100644 index 0000000000000000000000000000000000000000..ecdbbdc6f7e31e577506f047d1e09c1998845470 GIT binary patch literal 1026 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&aTa()7BevL9RXp+soH$fK*5s% zJ|V8|1wQrl^|7(B2?+^_U=SZ44`kmjD40Kgep*^uQc@C7El>mwfFeLOK(#;-h+>G; zsrq`LAY3FgG!!BZ6pW6JhA5snb0$O(q6}gbTm)h!kb6Hrf5CzU2Rb^Elao_YQp(E8 zy1KgZ^Yh!<+8P=f=FOWoefsn{bLPyQJGZvBwx*`0sHo`E^{QP!hZ>dy`2{mDi7mg@ z^0>aCf!~Dj*ZVJ5)&2b6wVizX=|KAL))Q=ckLFUjr7mnnBNFb)25RfMB9 z-Hg#|e>vxpf3EFU%JUko*sl`${d~(l=Re<#A3Z;>*YQ{G?eF7r%D33f7W~b7>+AfD z+DZEjmwvrzxbc2TX06zY9}>@xOl*peR$$q|Ww(RldA+E-!{2=d0iPDGmwBN1^MNM& znkh9awAg!2v*y%9XtDoTDt9nmzUFB|*-ZI|*V-2r9oTau`^WkAX?+cQnq=h_7wGO4 zee;W>|G@OSJ>P3usfeY3BzK1r-j^4B!Pn>X+N z!?e*pH{nNV9e*XOY47#xR?qG2pNcH`FNPx`Ds8MYc5lw!Yq`FVbI(YbvFGcBWP&&j_to_Bal*&&nP7w4=EKId`Q^wPii zwqKw3U+;c${IzRC(Lb$6|99$t+575}{I)3P`pB=pGUmVU{2PT~G*EM*yTtwnaE2~?rV`HLyV8We#QGp-TtSbNf7$@%6RrqYq+Vanv zaizSd!0(3-wZHSP$*+C=e|ueALz(^Z0}b;d6ONqMFnF?DOyYAe7tgOlOpEs|IIv;9 zhQYhzTpWM)G6~f$Z#Z#ZY{JjkOiuroHeBiF>Zr9Yd$VUzCDWVwJ;gWd*WUpqbp}sY KKbLh*2~7Y6q2qY~ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/trash.png b/comp/src/gb.form.stock/gambas/128/trash.png new file mode 100644 index 0000000000000000000000000000000000000000..4692826f56adbcea3816a9e6959b77346f4bb398 GIT binary patch literal 435 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&aTa()7BevL9RXp+soH$fK*7KO zpAc8~0-sGjKKuRr_6G#)4G7rp?+;=FNmR7W(-SHMR&&7Lf1khq5kEg51ETVNem;=# z|NsA%rHaWw!zD_B{DK*{R8A?seii=bTlb~kd^6@4%s$!0d-2!w@6-PN0;+l9>Eakt zaqI2PlYC7EB5sMxE=^l$QC<6={c5Y8XLkW_Tk*7Ejr3dv({{P&a{e*NI!M( zTl^XEgQv582Ar95URr(ivspFg>aL!8wKeqDzld(9uQO`?Y5mrBd}MkeI`Gw`GI^6l z*EC=LEUsdh{>g+b@Xdq||31%RsPAK1vm$MAgQIvsHT@1pkCA%74KiTld z0_ZppIPi^O{<~AI`#T_928P)zHurRG`CwcO`bRuNy$?jRp_Z{DquiD;zEQ~XYIu(Z ONYvBS&t;ucLK6U}Pp8BH literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/unlock.png b/comp/src/gb.form.stock/gambas/128/unlock.png new file mode 100644 index 0000000000000000000000000000000000000000..3d0964c8c006af0a2a0c6b26bf56a28a51fd5399 GIT binary patch literal 837 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&aTa()7BevL9RXp+soH$fK*3i5 zJ|V8|1wQxh=ij>rLO{m<{|sQV{?46}D_838-Yo}m@88dR@Bk!>jDR9%&ZOPDmv{GW z;fog~K&gB8av_Rg>hmD#Z{N;^7!D!t-!DMrg3Je+10=zQKy>Bay$i9f0H_{f4p0}+ z3W(mjcY%fgbwTvzU%8S6R09+Ql24vw1IdRELG1tkLxJS}{qaEZxBe12ps#&Og8YIR zzN?FWVZ6sA#>T(A>~Z?4x1a7FW^FOyzNUXQqV4m^cU$>#!duN7ey>RFyXfDW@jmyT zh3T?PgDXG$N{_5}Nt;?9!*e2Op73#{U(8RvS8SZiz`(fD)5S5Q;?~<6&;1S?h_F7` z;yHUswf-)RyR-LdR^R_#FRRibv5na`HCo}^&uZ2C>pLgEzG5K2;uzLreD3?}kCE%m zyRZNLxpDE<$`t{+f|G-`3S7EkXS9BT!PH6@_uqN5Y$m^3r=6Ft9`q$Qh%-9%f5Nmn zAF~zf{?BstK5{Fd^k@5)6g98BX6dC%g-b=h6O^k01MJ?mkMWXAScjIL!_PfP1Js@^<2Gw*;N^NvfrH(P!K2!WP;^EL}+MeY-}u0 z4G=&CA+m5TTqRr1tOlDoDAjek58D8u*9!*AJ7GUB|(0{4F3Ytnck~^&E;pEDE|BNd8ymK-hN^e zI~G~Kt8BuxFIOwtGd5f~Y{IDa%)BLvZ};-vNpiFOAGZl?J=t(BI{f&G4=l^3PveTn zY2DFRud?0zq-{F`1Jfo?7srr_TW@ED7het#a8o|LDd%+TySs&*Zy7i4{GDfNm0oiC-QLA}ZF}7oCoZcktEeu0H|6xXpI6^LjI3V%q50}j zj(?|KB$aMZu2Hmayx{YxHTJ>!*#a}4ef>P;W904j8$Zg-eCzT!J0qW6dTigrIPv4` zEq4FI9iBy`NNl?OvgTv;T>WR4->x^`*2ge+v6ytd(d|D!kDYz)Q zCVADL7gWBptMdjj{%{eUaq?55)0<11q!SqfNXR=T9P1<~Ah`6jk^n%qw+7QQ`As z9+_JzCJ)plu6Ull&>^3HVR?>A+n)&L{tcqipC9w=`jK?x!EuQz7oN^I+Hdk=hPjHT z%jY(ho0B>@TDGN}SQg@va3bThDvQ#sqB{p&oDvRL&f?^_v*)pl-%qBqrmri`iET*I z_k8n(HRqWqZ}5RlJEw=(G^VxH`W_eB5xH1Ti#^YZ>D_{kJ=(gwv6YPF5lVNQVK zHuC-5KPl?^>+5sb!WTTe@;h$3+V|g1lN?^vpI_0yg#{h37r&5UBGv2m`TkS&x~UtO U^gsM&0p<$^Pgg&ebxsLQ0JX~YyZ`_I literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/user.png b/comp/src/gb.form.stock/gambas/128/user.png new file mode 100644 index 0000000000000000000000000000000000000000..5d0f2dcf764d0273e19b915ebe348602f7fb6206 GIT binary patch literal 1675 zcmXw32~d(-6#hj?!Zgw_mrQNZ%;mY%n{r%mNks_(5x1JO%-5udTVhEfWol{VPA&y* zK$NNJl;tb6D9y>T%v@5T%(5nzu=mtlc=xAyGxwf*{_lL}JLjIc^Isqly*1GWXb6Hd z@jjjuaHhi>r3&m%S^gq8*2ejSBtnpu1l}semRg1ogg}!B)cxLZ1b-&qpUER8U-xH% z#RCgZFMt#Z2vQJID`6xB#z{=rXNaW#)A(LVRRAFXJefyIfkl7~6e|Kx!F+~LN`md! z0cCn1v(!HYRN=*lWgryJlQIM{B|-K(7o^12ejvrc4J1`f(nVvyVT<1aGU$*YkTOK0 zfow4ViOlQqf-!){3Z-!(8H^7NTK>s(5Q42ycVhWET z7$YY0l?pIFP9PSC&gaf1wN z@KnwxQHTN1_=lKxKl;^GR18;x=dtfCqVP-$NpnQIb>vlsgk@D8N%x9C}HTf55XRfetpr7^0 zL{czKD`_5L;+>rcKJfwOgURDvIc5tBsYB|%ouZ4gP4CPv?cnTYL6B+*-qVemGCWm! zEXdGpW2Q$D2GQZHW?^H!(N|LhSr@rmkeEy+w-hx!O`2g_O;uV)G7GN_wK`-a%2{n+ z&e$g~qpDu3p)e+pk>U6@`|+O^`DAjw#jlnZ*$eA3KL{H1s*$M?cF!_OgKNtBv~L9? zqTS0vCKis5;=k)Wvn4s2+5v^{?mnZXFK z%FD(!2E{8n(B#2<_jSI=br&Dp*|*+OK)QfaS%d4i_qyghruPjSOR+;aewzz&%xxDq z7a<(iNp!od`B~b%eb>1L;6_u{Pb)><}{2AgQn!qpqox6s;stnv_+7*8tdgl z)+}4*%&Q_5<_6POsLQ;sEv{5KTRgEEtT}s-9sf`fQF(unieD|{qQ?{OkcEXV(nXzP zUv@r!m0*%FVl&L*rrsZkFL7ZDHCLi8ziHnyFI;|18(u!xe75|AZpC!lKmF7n9oR|Z zYpz{$ZAq*3^=PwK{$jVAdd53?jExQ-l2&+D9KP~SPA}P>_HS#@Dd$SJI8Av}f?L|^ z;~M_or7^m@@=$Y!&Egq-U3T0NV%2IK zIh411#i7rS^3|`;Va3Il9%8@LX0-UM&%w#|gOQ7!?a26#fXNh7KNG{};qkYa$0K|D zM+XL`3^wb3GYTsTIEg2w=}_{`6pK41PN0jp3)qEh>crKy<&VB6k-KtMnq{mS`^86L z@;x<<_gGr#ht8;E)tk1Q)9al)3WbKCntj)IoRnl379i?}P@B2k4AIeTy<;Y(aRzoD zOEcP2X$YZYZf0wglP`g-HG>dz^97XC5sO(bPuXTa4l5!p z#M+NDY|p`29Pzz@<6o+4-@w7`3FEv+aCBmjFE!L`ny@M6n1&{7gNEAe25gHtX73Z4 tjDwR|hpCj~_?PQ&t!B7%NQJh5T*%XD$)H`o1AZA0em~LkwtM*5{{Rg`E*by; literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/vector.png b/comp/src/gb.form.stock/gambas/128/vector.png new file mode 100644 index 0000000000000000000000000000000000000000..483655a17e647647502099013c22ee924f920c72 GIT binary patch literal 499 zcmVC00009a7bBm000ie z000ie0hKEb8vpm9{=mS%%gf8e#KfSWpl_$&|NsB@_xI}R z>c_{&&(F{L`ug+p^TNWy-{0T;{r%O|)#T*l)YR1F<>mbR{Jg_{egFUf0d!JMQvg8b z*k%9#0YpheK~#9!?c3W5f#n;GY3b~3?RJWy zD4(2GjsOA(5HFxuI06VDz_tMAi3lKo0OuCdlq1J z$Y6k3U%~)u+KvU7)fEh|xs?n8s2#z)N(LEBy0&oyb1E5VGAeubBKTJ_*l3m=T!L>U z!_9{K;phlFD;aV)z2@#ksC^ExVW;EU#SyFzD2l3v0Zt_mz;7iXz*tEP@U0{V_*9Yv zyesK*j9+p~R?&b$faC%2mk_QYd?TW7#qh(ZyrYlfCww4*k7V$n6h4;Ig9$vEjnzYj z)93$q{#a-{#}^dQu4v*}QqgNVcu@(jYUfmM`|EoAg++9)Z1mPlfb;T&cDC7;K9mDgV_1^PhZ))7o@!;$S;_oSDWpdk@16v zlQw3Z1q!b9ba4#Hxc7FNA)kYTfU9_C)I$a?_6rw^nL3p%T9qvtcdT6#*mvgGs*3%y zJnP~%Wgn}1F0gBhy$A!tefE~zGwh6iuS_#@DE8bPdTwbqYe4KJzI|(S8(vM?_8~Qi zF=YCd#rnnE3wABZt(h6gaP_N@!Y_`C(}+e5dZ)H literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/warning.png b/comp/src/gb.form.stock/gambas/128/warning.png new file mode 100644 index 0000000000000000000000000000000000000000..f190d0d987fdda4a5d0c0099572d5e95a02ce93d GIT binary patch literal 919 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&v7|ftIx;Y9?C1WI$O_~$76-XI zF|0c$^AgD6EbxddW?X?_wfUrhf^`8tA+A1|h4+`|-&>J?e^~*L0YrC~6y9Hv z_i$<6?QOXb5fHg7|K75^tE(FBFV6!bkje+k@*k|qc>tBozrP~?&I+I`NNWH7h6gL4 z1_HVN|NsB>>D8y(NB{l(^Xbmf2dhe+Ztwd3>W*@q!7QLl6ib5qf*Gz)o$%$K?j~dQ ziPQe>>t$;@`R+=v;^j|z{W>4_vKaMk?^ALYV_;w^^>lFzskrs__RXT%4gwB=i{E

        I9_loNGdcn`~!0Sa7u6~NFJEo@DRwU z;hexSf#-o|gHA&VgFVv{Mi+)ZHHM5VCzv^Yuzz9OA+Uh+z<*3ii(AWg@lBJ%F4>-=4O9?|A`sV=NVBzKmZPhBNB-|K0XZ% z4RkvFN!vhlbhMwJAB{%i^ZAjHk=fbV>FMd!)zuLZ5j{OU&`C0x%*T%({}z>BUS3Y2 zPznkP1_uX8Boedz#oM=Uo0^(ZQ&Xp>r*m?09z1wJrBZ8ZYPNAxLZF9X9qR1h0%V#L zhLZNc`w&P~=lQjtgg?s*~fH)!Al#YS5LU zmJfFmd2WLzT`d=CPnG;=6xGE8K*rA2(!w?Tujz;5?%QpZ5`Nq#2Z!sT4BGd7xF2?j z@8s(pImA}kzWrXk;Z(csv2i_JuI5j}>lrB0o|(^wcYE*19$)&}P&kpL2whdwh|PuI zPSv#g4sNsp8bg2F`-->sxPBp>L37Q#ojU6ov6336Zxxri649Nx^vLl79UnqFZbFL0=}|5eGEqH|Bx0~y0|CWPDln=hx{FV z8jGd*T*d*C@XtKy0K?w2%<>+8U0QrT%x*0-<&|*$h<#mMy>Cf)S&HgOoy00}U}H?6 ziBZk>dc9&+2$va#pg1c;8=e%y0<&oQ{ zb@HH1C#Pg#IkKrw$?=sx$(8(ik5!$_h#JpBTzFzVn$-D=U_3q+9W|G0 zQ%+7iB+*g@Tk%@ty-Xxm%o6ybxpw7ofu(6U*#^mae4g0rL=O{Lk0B3W(Iq$D(hLRJ zUSgBOp?8h05JL{^mCdn3_` zJMj$lVCtUWeCH+FQ3WyJ0=u8m}f1FN8-n9|fu5lBXt7 z`BmOtI9vfkBwM%ZQCUnc3{86-r*{0|MQL$^rv>h^B-2I8i7d(RUpmj4G@oE~1q|JB z$G>vjKWFl+x0=))_gS&(>VCz!1KVawKG|z9Jwdy zMzD|yy8RZaNhn4Aq)5LR+m7t%I$wFeU)hvxwEtKqFPe?);he9moZn>1R@!gg&1;pe z!ZlZwG*|UbEZ}$kVXrO!Gpq}@EvY*lWaMS^!|}$XX6?pZcZ^})xT@U(BiJQ^o}M{% zubw-Ga%Pk^Re?EG+l!>IJdMY3FI}&E*j$>YpPX=I%X&ByEP8WPq z9(Bpyo#rOErv%<+T^su=AOLWHc3xC)M7FmMJP)8pI4}L>HX+z#*YPi_T8qL@CvG7e zKYl22_~gWD9R|C=^3xgAmJDqa1-@kVK~CEiq;C;vRfO7^;WpXF8iLyn=gfrjEK--y zJiMzT%I5HK`7gjosd`e!B?!0zEVfrmS`}uY08VyXU*38*)&O8+7uHew7Q4YSM!7T? zX$pXb)9$aVfMPT3-WI$5`6SyuTq zig|a=)xhAFDJxA+1F$C7(r%%{CO(l53JSS+xoWAkw$%%7y$fI?0u!37WWtu{Wn~1Q zxux@zS7h24IqZ04>`lxkSo4dCLEiFN!jYX(bK2^e3U}@Z{K}GI{1KE#A3-qXD0_0V g(r*`n*AFgkRq^9)j@@KUhJI>bYvo{B{wp^2A2wbxZ2$lO literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/128/wizard.png b/comp/src/gb.form.stock/gambas/128/wizard.png new file mode 100644 index 0000000000000000000000000000000000000000..5df1eeaeb80ae76f86133e52930a87c128e8ad7e GIT binary patch literal 619 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&aTa()7BevL9RXp+soH$fKtZzr zpAc8~0-yc+84ev{ICzlZzyTiUXP;P!i-9%wS{I{IU99 zLxW}g`%k5n<%iEEWic=??)P+Y45_&F_U6T+CIf-iM4hAqVZHDFZ*pbyR^*J_b@OuO z`Fp3%eDBt^y1D96frZS`kBez2*+;eGYq zre7;r-aDqu+ZW|%yYKv;riwot0+=KhR>)vP= z+j3ZVIqUBYP1E_cX8fGclyA2n;o)rYH8qc$8uFtAzVLD@{o9rBZ&vGmEe+ubAEvXq zGEMro=s`Z)0ehxD@{0fN3;b6&WZ(5M-mPJM^79S$9(Vq}n_z#k%04pTkvdn;pNz(t z@|p%;npv0CEjVx^UOeLWOjh6UGv~EdxTe2$vR}MFY~DNWzh{|#);Ye&7di2rJIOv$ z;lBQx55cUD{vOh^FXay5s(ax5o%`3mlKl(bV=}@;Ykz%td3m}2d^-?B+`3_drh#Q& zNkaX9!9q!wcH2n+7JJ9 b|I9hLZNZOo%Z+n@(ahlK>gTe~DWM4f?KCH- literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/access.png b/comp/src/gb.form.stock/gambas/32/access.png new file mode 100644 index 0000000000000000000000000000000000000000..6394ea9834d9d26227b5068151f79d5c7a173183 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5C@2x& z6XNP#;FG`n{{R2~H(z)+egBJZKmQgizrXd;`wdJlLV;=+OM?7@862M7NCR^0JY5_^ zG|nd{DDbcZGO#iwEjze^Ny*ErPlM@^msjhL(1aO{Y289155xpSM1q2XTnwAdn7W)w f1Qr;?aWFDm|1K}DzqRK-&?E*=S3j3^P6)TBc^!E9nC4F3!%* d8HW`(7@jY;v{v}e2vo+v;OXk;vd$@?2>{onAzlCg literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/align-height.png b/comp/src/gb.form.stock/gambas/32/align-height.png new file mode 100644 index 0000000000000000000000000000000000000000..8955f7e987d5c1e93ec0faee608bbcfe39b09f1f GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~q2Ka=y zx)=B?Sg;@=At7jSydhAKu_VYZn8D%MjWi%f%+tj&MB;LC!U2|r3mIcphxPifSurr2 Xe&D$9kFt3JPz8ghtDnm{r-UW|Kk^}i literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/align-left.png b/comp/src/gb.form.stock/gambas/32/align-left.png new file mode 100644 index 0000000000000000000000000000000000000000..5a545e3846e396695c37ca6542cf056a9abf1741 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~q2Ka=y zx)=B?Sg;@=At7jSydhAKu_VYZn8D%MjWi%f*3-o?MB;LCf&x>)TBc^!E9nBv5zfxe enTHja7#L1BSuFivy68VpA%mx@pUXO@geCwE5FYT)sb b>E~m}IOyO!v!E;rsEWbU)z4*}Q$iB}y=fvW literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/align-right.png b/comp/src/gb.form.stock/gambas/32/align-right.png new file mode 100644 index 0000000000000000000000000000000000000000..83a3a701898f1ec770ee93fed223a2442c3d934b GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~q2Ka=y zx)=B?Sg;@=At7jSydhAKu_VYZn8D%MjWi%f#?!?yMB;LCf`U*>TN~SjHb;(vwM@;d dSJDL-8RV?2C!dN{>;kG|@O1TaS?83{1OV<0A{zhz literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/align-top.png b/comp/src/gb.form.stock/gambas/32/align-top.png new file mode 100644 index 0000000000000000000000000000000000000000..a41c696096350f1e79a994a6e4e570bcac6cf5fb GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~q2Ka=y zx)=B?Sg;@=At7jSydhAKu_VYZn8D%MjWi%f%G1R$MB;LC!U2}mVY&&tys{2#cO<{0 bFJNXkeAdBvzKtsfP!)rxtDnm{r-UW|udX4) literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/align-width.png b/comp/src/gb.form.stock/gambas/32/align-width.png new file mode 100644 index 0000000000000000000000000000000000000000..8c51d70728454daa2724a2a8c10641a612a0d658 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~q2Ka=y zx)=B?Sg;@=At7jSydhAKu_VYZn8D%MjWi%f*3-o?MB;LCf&$ZqwkAi0uaZX?)`cc) eX!ymW#K4fU%5}G;TH!gMLIzJ)KbLh*2~7YxR3sh% literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/apply.png b/comp/src/gb.form.stock/gambas/32/apply.png new file mode 100644 index 0000000000000000000000000000000000000000..fc012e4ff536865895f4be3fd72e5279ecb5ae40 GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIDN0X`wFKADC2_w)1bfl$Hyf`SJHKr;V9K2UJ+kyjwYIZA^3f*JnC=ru$~ zM%`+uJOdPq_jGX#(Kw%+u)xy5;jwY&0#1!Giv?N}UI@4aUs%zw%%Q`B^~?({8PNdI z4Gt0 z6XNP#;Im-Cg88NX|NsBb&CNY?=1f9D!k$Sl<^UBimIV0)GdMiEkp|=#db&7D3A@&1y-Jrl#~P%f#?D%1}ezS&4oz8bs?*VNFkFzWe`Jvf)Fif zX=!l1Kr?}|5cLoz0j+>AAcAniAzFY^a0WzyCX>Q5U~t5j1o;IsEVcU4@|lJ4Pv{hP zCJ)!YtqU6!45z0|o-d&D^>^nIC)whEzc{M{SFOKm@>+gH3>$mUlQQ2_z1~Atzg0bK zicMI?JNupXOOd+v_wiC6RC64dU2eVFtG3|4?YSY&MK!Z}7<85cqlL@U#WBR<^w!JQ z{g@2}STAtzJ~BJyWZRb(l`r?I-|zh%_wN6H)_W3i0*_st4(ZRkxN+^ow~YT1Q@WjP zm78V5-sh($tJK_lEXUqf?fzRPEoWX>;)GZ0%1*u067JimeaZ0nHV^lQ&zti5e9xV* z%iPp`;B?o#n7h22pNYwJ-FtPx^j^uzDK9uvZI<0(6@B}qXn)0@)64B%Z~nRG@{an| z$rEo+ocH+Lv^v|>$*q+M|F68#*vKIB`P#D;#j+O9_nr-WEESOW^=)X`nIg~m^Z4wu zVvBryik(~}E7@pP4QZJf@2@#`@khkG`!`fhqh-dY)Cb;&eN le#%?fm-FXL{eR_@{F^TG*oAkhOMwx<;OXk;vd$@?2>`5yK5zg4 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/audio.png b/comp/src/gb.form.stock/gambas/32/audio.png new file mode 100644 index 0000000000000000000000000000000000000000..e417fb3a2da118bb0382b55f5984c4d0344b0015 GIT binary patch literal 475 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaOE1AIbUeKHHX+`zoDT4$OfT={ax|<`$CU3IPC9^1B=A&?2J7K zl8QUf6Ti1BVINrKfthJ%fQ-Jlz1?wOk=Xq`2?u~8T?rtK4L~yCKyMOI>Ofcg-tKsa zE|7s;u@Lq?phZA#7{fIdpp$e;g8YIRk{QF9Zr^K|&dKuN47cXzrFLGwU$P#O?)s%; z`gp<(j;ZA_-^0r-BY~Y0_4wKo-U3d7N^%velFBxAkfk*A~+%K_`Tcv{(qji z=p4sR%hD75svGY6>^MD7Ab0(`N!{+h1Gw&YYQ!@$PFT{izOheQS^KTsnQikQS8V=O zu{U<&QnUZO9WtINA58_mUC}g@>CQiONApl?{;$UVrTcUQRz)$1umsHAIJKX78H>WS z8yhE*6$v0Q3cer>mdKI;Vst0B;u6Pyhe` literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/battery.png b/comp/src/gb.form.stock/gambas/32/battery.png new file mode 100644 index 0000000000000000000000000000000000000000..babe727a6c791abbcc6efe6949882df9e65dfc89 GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBh0X`wFKADC2%kTgH|35xHUiN2L5lB%Z6| zOh16C92yvxDC)2ziwaz5+h}59(j~>?Gug1Fk&mJ6PQuqrwnLkNdKf%i{an^LB{Ts5 DOwKU< literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/blue.png b/comp/src/gb.form.stock/gambas/32/blue.png new file mode 100644 index 0000000000000000000000000000000000000000..e514bd8b41f5dc409bb6fb5555cd085b52077e28 GIT binary patch literal 510 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 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/bookmark.png b/comp/src/gb.form.stock/gambas/32/bookmark.png new file mode 100644 index 0000000000000000000000000000000000000000..b9dfb7a9ffb15679fa95fedb06f0b90324253187 GIT binary patch literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs1s;*b3=DinK$vl=HlH+5P$`&To&sU_*TgaN9<@6UXt)Xw1#QY z6D^JZzn>_mZ>rgLtB+aLpyiZP@1fv4_W1=T4IO6}oU&^adLj7GtN+8o|I%q|ggTlw zHi#-RJq~y>pI=d9!BdI#{96(pa|w7~)G=Y*X>O_~^m^(3IvtnRsU7Pl1MO$bMbU>43W5;oN$0`hZqkN+hZ+-0)~y7 z!q!G{icN~zn#DQe;I^!*EHjkYJJzk48t^vAdjZcj&H%Q>%*zopr02kvki2wiq literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/brightness.png b/comp/src/gb.form.stock/gambas/32/brightness.png new file mode 100644 index 0000000000000000000000000000000000000000..2e9421722d6530b9e680e95487ea35ebf9bbfd98 GIT binary patch literal 337 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP|z&E zC&bmgz$ZRFJ~lQs6b$0x;*ye*5)u+JGBSYTxw*MO637LTa0ZYY?0fDX&;-GfAirRS znKqovH}rprT^5}-^Kx zA|)u*?#3U1HbVw~?m&i)e=O4~SRWmFB=N`4=-G?f1M@l>{T}rMchn@VX3&dtnJwdR z_eYys$b~MuAgM0-Pgk^Sx4x1W54_^pTj=hS#~{T1i6MgT#=ZGw=GC`3559RTq9A8D zb4i8o$AwFlPdk%UHhr3V-R-%ze?Cpx9$}DlveWhVf&DZ7SAGA=6rn4q_<-|f9MHWC Mp00i_>zopr0JtTCF#rGn literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/c.png b/comp/src/gb.form.stock/gambas/32/c.png new file mode 100644 index 0000000000000000000000000000000000000000..48d1fc5e1c8652cfe4bc0d41f2075ef471c34e6b GIT binary patch literal 419 zcmV;U0bKrxP)0KWim+i*6` zHciq^-uK>R*k$zm^rGmZwCuE`=%h5vH2wblQ`A#m*I(iH;dtG6sp+XN%P)@Oj^g;@ zO43Sc*=eTfrYg!RQPWY?^wq!bzt{EGk>ioy_uu#Z_q^`B1;7PZ)mY~F<`TpbS=CwA z_0|)_6UFew4#N%z!3fdw(cSjl1Hc2!^2})2Xms3kdCGiq00001bW%=J06^y0W&i*H zkx4{BR5;6HV4wnE#{-B}z<~n{Q3WQdiVCulA~+S88FGSv7z+*sdODmI#?10eoI*Gh zaB*sZ^h$8@;84KLX#k@5d2v{wuF1)a*B5L?oZ9%k$<3(&qQn_l*{~}x=hOw+F2^a1 z!vr;bPA(-GX(mnqTmhwQ3Jxef7Mww?!pbNmD#$X#6AUf|l;$i70RV16936HunzjG{ N002ovPDHLkV1nPk!Mp$f literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/calculator.png b/comp/src/gb.form.stock/gambas/32/calculator.png new file mode 100644 index 0000000000000000000000000000000000000000..b0589d61a9b89ee1697f79ac4143a03695fbae66 GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5D99h+ z6XNP#;FFM$@c;k+{r~qLIB-Boowo)k#aI&L7tG-B>_!@pqwDG77@~1LIYEKRfa_2r z10Q2zvW9_5e8UFa8BAVY0WNzQy17MqeWEY0a4;~uT&R#a&G*?+phgByS3j3^P6r2?^V>vYLKs)d3Z=lmz(&GrS6XBm3*) zDj?tA)5S4F<9u?00-FXG<3>T2=Ee#|re?=VOQvMuf}_CpDv4Yj{pOMX+yvFQHjeBfJQTTy85}Sb4q9e E0MW%mPyhe` literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/call.png b/comp/src/gb.form.stock/gambas/32/call.png new file mode 100644 index 0000000000000000000000000000000000000000..b0773bc39dc6c9671ccadfdef43ef87247805cbd GIT binary patch literal 418 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP_QV# zC&bmgz$gEHe!~5P{CoNNck}b^=cPSO1Bw7q-rYP1qwsMdgaIUTALOQ;Nz1yDmHz;w z7$Tl`56rlmU+|y+WDZd8gS^a#nFaR?a_{AW)ZEL@dzc53y`L|U%JUUyyJ|_0UogWh zjya|uxC)=Bp8qTTBK@r)D^J&<=Vx2)_&ELkx?3AmDn@fJJnsyCmzD|Nq5ZrB{no?mc{OUbLc$=+d&;r>5;azcnVpB`NT-O;y9Y zn0btnYFt5&I2-Pt_r8!@{YKBv?#96%d`=%aRic}ia*MJoG#=K=#owzsp&a+1>(3Ex znSbv#D*rw!D|~Qn$-enHL4qGm#eDo?e%u`+L<5oB91rbM7Y?Z2$1@ j%!1E{7k&9wafE-_75UQ{e^34ZI+(%J)z4*}Q$iB}<$SNS%G}U;vjb? zhIQv;UIIBP0X`wFKAD9F4jgD`XxO)J-{QrKySloXnwoa)+SSw3vvcRp-rn9RQ>O6x z-}(>IToU9L%;50sMjDV4;_2cTqH#VsVS!u#6LS$OOCWNS%G}U;vjb? zhIQv;UIIB<0X`wFKADC0^7HS5(S!W_dj$nR_T9q5hq<};^YVZq55OWo!P%RuKt}ME z1o;Is{0{#W74k<{tG>DVU+#s|OMnu~JzX3_G|nd{EZ|FMH{@FI#fg>UtP4|BISKl1M7?wMK786aeNILp)A^rS_Z9BT!Bpi41rBc7#6WaGJ2fc z8l%FRpsK+oA#vs1Jzv+4eYfxK_B>IuKs4aF(SaI9lMoKq#+6E&geFKQ*fnW3{On+S z=-VPRL;ryn*TOy)t%(fW1&3-DR-`kx7)rk4R?A$mP{!c3)C!UH42f4A`rf)&vjCmU N;OXk;vd$@?2>@2-d9wfj literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/cdrom.png b/comp/src/gb.form.stock/gambas/32/cdrom.png new file mode 100644 index 0000000000000000000000000000000000000000..b68b6c4c9564312eed7334d4d4e2cfe7dba76939 GIT binary patch literal 408 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaLr1AIbUeKHGY&z?PZ?%a9v=FOi!zoDT4NCMdo4h}%Z(xpr1%$Wn^0>Pq1 ziy#c3VxSZd{Qv(SNPhbCY2(I?TefUjvSbNRy$rkHFQDNfB|(0{44TQeyO_>=X8B|1 zefYQip;s@x?o{2ovJ)tO)YHW=#NzbY$v1_X6?j|)Bag&pJN*7He`^|>h`0LNp65qB z--&u~^u%_&akZ8*-nMAE4w{30+dP_+iUD;kyUemsze^uh`tTJA`Y~ zih>}%_y-a7Yu@KgS1;?ny6^YJ_KMgErYTwZ0uTSI79F4Rp-oJAx3tbOwtNZ0Pm_xO zHLpA=edgc;hC2r@{7qBXuD~yO>Q33=X;VDSyr#LVK6!f4`q?rP$DZ9earQrtuI;xk phbzA>7CU^U^s+)$<wD`1*61to&!C^;OXk;vd$@?2>{dNS%G}U;vjb? zhIQv;UIICy0X`wFKAD9H2?_uI|BsK4U$kh^f&~i}E?oG2*OP-l1xzJDe!&b4v$g#s zfV^5y7sn8d^IIoe+b{kb&Y zbS86{w4XHZ!)TG6X*wcZT1+alHf+?I#M?E6*O9@0r;~I`lZb-=hftN6U0Cj%S0|Ti ze%}+9EPPfqhW}Y+y6vLJ0y{r`XXoCuSoME^dCE>h)7*oli9m-ic)I$ztaD0e0sw7H BSlj>r literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/clear.png b/comp/src/gb.form.stock/gambas/32/clear.png new file mode 100644 index 0000000000000000000000000000000000000000..14dbf8ee2afbb20ad1599ed014d8297b199e80f2 GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICy0X`wFKAD9H2?_uI|BsK4U$kh^f&~i}E?oG2*OP-l1xzJDe!&b4v$g#s zfV?_S7sn8d^IIoeZM+P!=;v< zs&+_zacl=e$bn|nhNY_9Ocqj$d89L&ls~Dsb#0iUmC~%NG>PGgtPXSeV~5K|4=Yz3 z$upfMZhT|)#Blx@OI4M%BlPdT=esh0gY~E5rA(WW^)+T+x-AcM34^DrpUXO@geCw$ CBwIQF literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/clock.png b/comp/src/gb.form.stock/gambas/32/clock.png new file mode 100644 index 0000000000000000000000000000000000000000..186a8418cc864713441b781fcc90f5a08a3f9704 GIT binary patch literal 510 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP_QDv zC&bmgz^A#nxd9C7Q9)y4BSaiRHZ?T?89*gKaUcm1{Qv*|{rmU#@8AD^`}X_!`G5cZ z{q*V6o;`aeOqg)x%9Z~9{$Ia-tzEnJ&Ye4V@7~?DYuEGBr_WEHzH{f!U_18RKsSh# z1o;IsXnwxUa^??HSMu+dhwSVRzw-9Fv#{(*BLf2?kEe@ch{fr(lV9c?G7xBS<~zRA zS;Bet?*&i)-k)&fU>fhVRbFT2pO~fpt*ZQug?z}2&x=yl=v2r><=9&}p6>n={$GG0 zcDG6CU7cKZ7WT{byCkX>Uga;)KAb+|*jdYXz2|SO{Sw?a?eBj5Z#7fPjzd?M|6o-6 z$koBwxXR>^!9M244KE7+3zyWg2-xn~D{pC)$n4VY!z8m-HshdbK*C05;~>r{85$ox zt8UekQV~j6!TI6$-t5>b9rqcZ1~xrpILFJ?@BMzab-(;GLf<^s{kB>6TfP09wephwlP&y$=C#hR axm3P`-(*U_BMVTxGI+ZBxvXNS%G}U;vjb? zhIQv;UIIC~0X`wFKADB_V33fI0AT>h*x1;lq$Eu7yA?bxK#hDQL4Lsuzr&+Ke*Mwa zs;~aj{BOBc!hN933Qrfu5RLQ62@CiV+6}oDd~syuIIF|Cu<{ z6XNP#;8R~;pRhjxf*Kkc;`hfpf14c*RKQviMj54exPJp^ntlgwl~gSzC32f%c|$1pUyO=bhB># zzZ+hGPPwkptTa2FX41r8RQpuSz_X RcLdtV;OXk;vd$@?2>@>MOojje literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/color.png b/comp/src/gb.form.stock/gambas/32/color.png new file mode 100644 index 0000000000000000000000000000000000000000..db7ab245b5b87f7f5521e4d884a8af928dfed45e GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIA=0X`wFKADB_`{VPM-@l)q{~#|f?m!%ndp|EPZ~6VagLg8YIR4t@U~82J6rp}_9$?zO*uRRAR_JzX3_G|nd{ERcGTb7@9{ z(uVKv?%vkmddI}LNr-QP1M?&XVGjq!`3!AhJkEw|j+RJtHY~kyhtXwomnvHW>$(5` z|FgTSum1i{G~!^r0)tj!Ejx>X>KlbdCN?&=2@MPZ4U#Ge2M!!y6Y@Bq*07NEZ~#xX ep{!di14D{)3iHB?#nXX~VDNPHb6Mw<&;$T)>1?0? literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/component.png b/comp/src/gb.form.stock/gambas/32/component.png new file mode 100644 index 0000000000000000000000000000000000000000..015a8bff6223b1c5989631ed94643e8e2e2a076a GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wFKADC0m*&qe^>_Ke_X?zzopr0Ge1SX8-^I literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/computer.png b/comp/src/gb.form.stock/gambas/32/computer.png new file mode 100644 index 0000000000000000000000000000000000000000..a78f8b1dcdee57bde04a0bb66355712485105901 GIT binary patch literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5D5w?S z6XNP#;In-B^7-@UFF*ni?%cU^fno^>3IG59uiyXwW5aZy5e!@9hTuE+$%fCMq8!lvI6;x#X;^) z4C~IxyaaMM3p^r=85sDEfH31!Z9ZwBpmBgth^tR#VZwog_yh5wt3u=V$0zJh0Fv?h z;z8v8__+OXx!ZCR_JIX~B0#V|KH5TNI#4@*NswPK!_Q@veEGbLj|KkR>Bm?#!pfo9=qR@6V~HeCsi-DQ&t;ucLK6V{|7Oqt literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/contrast.png b/comp/src/gb.form.stock/gambas/32/contrast.png new file mode 100644 index 0000000000000000000000000000000000000000..fea2398ddee27042eae0a9253d11416d12bd4a69 GIT binary patch literal 390 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP%t6D zC&bmgz$XC-#K*@2d5MXMv9Ym0Msjj8L8co;`bj%4W=%k&=?Kd-v|sUP|kMb_taP`2{olda`px^w&zofAYVd?oufE zQam?w>uaFwI!_nJ5R21iC*2e~q`>3i?Y;2A)rGrn|Np;KZtWH)k=jd@b7wnD>Rj|c zNbR)J`R<^!C9#FAu3g#p{aK%_e1FSYDd_t8#zKQ|+g(@uZ278_w=vAC3SsKr&$Q?k zgUsSW#t&y}vgB$U)?W7VImWJ_8?b13!x1J{E3OXR35%C9e6tj&QTlQ6!Hk2htl_em zk0N@@&ehhH=P4OjD-|tY+#55wPX1Q(o5?daT2u=DzWcr& zRm>A40~I`-dX_F+n88zYrRC6)1RgfF6(VtLS5|uPm@qJuU5cvQx38!RXa<9)tDnm{ Hr-UW|%VaT2 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/cpp.png b/comp/src/gb.form.stock/gambas/32/cpp.png new file mode 100644 index 0000000000000000000000000000000000000000..a10f151587b5814bc260fa5aeac2da17c06eb83a GIT binary patch literal 482 zcmV<80UiE{P)0KWjM>Z=C9 z2JidtB*-M^`R4<`1A*UxljM^{&_(9?=KB8n@%!;Z&_n$G{2s?1>iX&hzy+k}q_*w0 zAIBg0{rQREiRk(0H_bOn(n_A^p0Vq(q35AJ&OJKLI!4h(N6|;&_u)3pHe1$Py6(De z+irm0fWhy<)AZ9((^0DGs(aphhvA2a;fP4lNYV4r_Wky6+iz6VR8`bfV%TER^wI>t z1i9_G0>1*?_T4SYEt$O>+yDRo0d!JMQvg8b*k%9#0Ix|zK~y-))zilc!!Qg6;KWH> zsY$cCXS(;^d%piW)#O$en?icYe-H>hkP)(?{2>WRegz;%{D9@{)&~jDd_+7;KnFL* z1+M_7IqQl!n+MG||Pz trx>UpaW}w+G2o5GYy}pli>w@s3}$Hp&po=gmI94u@O1TaS?83{1OT|YIgkJV literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/css.png b/comp/src/gb.form.stock/gambas/32/css.png new file mode 100644 index 0000000000000000000000000000000000000000..3e5dd1e5cd40d3b32b7d99438c1ef06e560c096c GIT binary patch literal 677 zcmV;W0$TlvP)-)jKhZ3O=N z_~CUD@x6}q&#mHj75@GE@xYS#UcNaNm>Zb_B#WA(gi*{1&B?fwp)ZEI>5nbLFlGk*R z-K{Xt6#_QGX(NxPo7Am|y$}OYKM+${DoBB6x|4#>(AHj?`;_QW;f-k9WFXv81G#gT zUXim8sK`L)ATYbSc&u183GpFHbYj=ar-5lj%fU9Y$qhUCmGM zMRk)wj=4Zyvejm_{e0E3XJklVs%))k2$Za(_UFfH_%B!QW!0H?B{M7n$xt@@00000 LNkvXXu0mjfc-MDT literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/cut.png b/comp/src/gb.form.stock/gambas/32/cut.png new file mode 100644 index 0000000000000000000000000000000000000000..0c296a62000929844a0984d26d241f2304c29a58 GIT binary patch literal 429 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP%t6D zC&bmgz~@0hK}}6feSQ7?{QSp-g+K;`eW#?PuCDH0etttkLv3v>P!@=QD(_`y1G#te z@_@2HDWKw}+S-=-`m04nJvB8Gs;lo56znW3gBW6XViyz8F1eB*zhH(U#eG*ezcBq2 z%RKWe>+E_T`TcVD@9o_5t>MXv+Xud^TTlvAdD7FxF~s8Z+6mXiniY5)4zg;LmYo0b zzg}|zPv(l}Th4OFaO_lU`J-8-`P<(|#bIjY87&4$b%%308*PtpZnbK>bt%vF^K6+t zF5FF3`R#53Wg^pES+qH|I8-yoANA=*oBXZ?#TAftRLzo;Gcp z=jm^C8g9Zzll^u?%T4>vy?S!D+?B5{E7m!>i*Gkh{(0KilymK^Qm2xvOarx;w=9ZI zx-yU7w)nF4&g!!Klh#>iu!8wq)fL|7z4Ezd_8(<=)35SgZ2S2)Kui6%jum2AgxnBSjUwJQo`Tg8w_w$wl)d1NK@|NER ziU867|Nr+-n(`WGnn+2IUogX&uG^pgXtFRRzw)+wY47#>@S!{H-LI;E@=HBk978Nl zubq5T=#T=BYi5I(M)l+W|5r(E^=j=r_hsLQ3C1bA1s}Q0FVdQ&MBb@0MzNBM*si- literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/delete.png b/comp/src/gb.form.stock/gambas/32/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..4139e89eb8cfc8bab841e765b3a1fad14f191cf0 GIT binary patch literal 526 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaNJ0(?STeKHIGH#FSO&wl_$`x_b_6cpUc&%akt02G9a-!CY*ott|VC<|1U zmj_e>kp-%}pO*)ey`P&4l!6KZMZl&3$$MZnNEr-$x4g6lXuE1jkY6wZ)1R&=7R}!w zzs@9oR*+%4?dARIrQM;G_Q5}vF8O}=PVV2FqsN)m92Nqd>pm7-DgH?c|q}nhbav zm_;201$Oe^EZzG4f7k3SGMP6d)6>t)U-t9XGo1tMN3*Yn{HQZrdF?kd`^V{VPo>x= z$)CS9@${5lUxg<8KYqUKp};MR zX&%Y9-tN5iagP1d>l}4eLEE;;=^mZVCAZX8Z|X*kD{dzl*0n6 zsx=>H)>6ZuiJN5Gd9DV?JeVUJ5oKI43AiVEb^3z~IZL;l z75X#V^z^pq5A6BhZ4A!mCP6 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/desktop.png b/comp/src/gb.form.stock/gambas/32/desktop.png new file mode 100644 index 0000000000000000000000000000000000000000..0c8871742047ffbd4a3e6a77d7d0d6204f536989 GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBn0X`wFKADC2%kTgH|35xHe*OCOJFdLnSG1-Qq_iZ+FPOpM*^M+Hr_R&G zF+}5h>&4r=4GKICfngsGvxbOmn0vra;WvM>x4hGZ3+E?ubE+==sdM+wfn8U3GIu$Z zZCIct+T|R!;lU0S!3_-oLX6xD7MTqU8(8_O9xSj;@?QX%l5(V2zMdJ-F>dZs{v xxr7MYm+$81uk+UGWyCz(@Z_Vkn!WjKc84Y-*0OcKs(~(H@O1TaS?83{1OPpxS$O~e literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/development.png b/comp/src/gb.form.stock/gambas/32/development.png new file mode 100644 index 0000000000000000000000000000000000000000..a852291c27492658b709a49333ecdcd5bd508683 GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5D5xIb z6XNP#;1d@YmynPUA0HnR6B8R73*-XXNl8gSa>0THK=OWme$WMmc|a{(B|(0{4D}7q zBz=80OKr-y?9>hvjq-GH4AD5BoS-0O@HQ>s#l5|(iVJu}I_~Y|J(6;Vmr>zhuL5J{ z4u`Mr=6Y~7FkRbiuB_R>{pMcpGFDH9EDdJn>#JB#TytUxkYN*YSjO)4;LJ>8jV}*G b4{$TYayA%Boxb)RXbXde%ced+Q~Ukf`?~~!t%-IICxnl8;&?IGjKlgZf<<9k_R+} N!PC{xWt~$(697aUF%JL$ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/directory.png b/comp/src/gb.form.stock/gambas/32/directory.png new file mode 100644 index 0000000000000000000000000000000000000000..8f499aae7d370de5c6e048c99bc4587507f3cd25 GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wFKADC2%kS^F@;=p}&H<#NB*-tA!Qt7BG$2Rb)5S4F;&O7r0fsdT s7cM+v(4fH3xsi*fO^o@lxC8?OlVkG6zZJ*zfJzxWUHx3vIVCg!0EQ|lUH||9 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/disconnect.png b/comp/src/gb.form.stock/gambas/32/disconnect.png new file mode 100644 index 0000000000000000000000000000000000000000..a006da29ae551603e5c80ebed84bff59914337f3 GIT binary patch literal 298 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP|zvB zC&bmgz^A^xzOS!u!h{JECr*ryk52@H{{DWTAcS1CYE^G<@1#kSAR<7)goFg3N+4sw zf(6^QAL;;_CR7sS7tFx%aBA4Pb)t{|M6Y3=}o#bm! z;BnzzwC3H{|Mj6x4U-Mn{eR`9#9g{H?S((b^QF4|%0+5f>v-H}IZ4de?R0K-(<#gN zP8FZ1epi8Kju%{Zar8Alkeo6hG{Yn_o_hmJj!>O2A6K80e)l0BmI{N3sdu;EJ6StN YdO@yCZ_3L8HlW=Mp00i_>zopr05z?0-T(jq literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/down.png b/comp/src/gb.form.stock/gambas/32/down.png new file mode 100644 index 0000000000000000000000000000000000000000..175510cf2217f8a1a40bbd19c012a0e86f937679 GIT binary patch literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs1s;*bK&3}Om~pB$pEO7?z$e7jC$lgiAt63K-n4VlZlEAjNswPKL&I!s zKM5eu*3-o?MB;LCf&yQGt^^Cuu~3Hx3`wbLqqYj^sBF!;DrC@{dvz73fh(UtY^3(W oTT7=oNahGH;BjMD`pe7k=#O~A?k(l(fCe#my85}Sb4q9e07#}b!2kdN literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/download.png b/comp/src/gb.form.stock/gambas/32/download.png new file mode 100644 index 0000000000000000000000000000000000000000..50a99328c6eaf64bf0c1fc49ea6c3fc1a06e42cc GIT binary patch literal 351 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP|!8N zC&bmgz$YOgAt@;-IXM}~fPjMK_d`QNf$YS@M2JXSTpUymOvT2=#)Cor^7}vm;dc%o z%S20p{DK)~=*t)VJk!8=W#+G2f#1&_Iw;qDx+(o@8c@M}PZ!4!i_>c-pB8IY;BjeY z65Mjl?#%!CtZJR3LYyxT-8|^m${l!++!EQ$W^=Q{J&XKI{o>*g&fM5*BL!9KX9_)H-EtV0OwWr@30?j zC^)}(+r7dAmDM*me=t2dWXc%Bz0hgFCFX^Hxx5quKMFUlJ?(U~Uby0$>0$2lHEJJE TOp)3JbSi_VtDnm{r-UW|${mQ2 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/draw-circle.png b/comp/src/gb.form.stock/gambas/32/draw-circle.png new file mode 100644 index 0000000000000000000000000000000000000000..5bbb204ef6e55135bc58e5eee54b1971a11ab339 GIT binary patch literal 458 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP%tyV zC&bmgz$ZRF9>_~fOawCO>+2H|5*!>HfFzI`7Z(R4W5EEz267=FEiDbG1_+Xpk|0t* zModgha&j`zD4;k@A&3TYwS-@N0$QU~666=mkjxm~#&nOR>(7HTn%ql2-~RoQ_0=IM z>BDZWcJ^N0ce;CyJ-Dk3RDILa#WBR<^xEK?e9Zo&c>gXa#{zz@9O%z>T``l>+v7TZV#+ppDkoQ z@>o%C;o`r}OBCgI|4%;ie2(!WUGDG;*H@WdiCWpKu#0IC!?*4KIrWZqcRx9NoZ

        vh?9#9?b;#IwT5 zO_lFhk|UK>cYc(=xNcMaYn%1aUf-S_t^9nk+sOO!8WG#w#Y^MozY*TADdFM{^dy6) LtDnm{r-UW|n2NcI literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/draw-line.png b/comp/src/gb.form.stock/gambas/32/draw-line.png new file mode 100644 index 0000000000000000000000000000000000000000..962020bb45d22157019c99e5f353e0c48b689c56 GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5C@2x& z6XNP#;FFk`n2?YFA>+XS$d#XKeHEyNy(Gvlm_bzH+NJEw%v~pU0EIL>T^vI+&L<}* z@EWi#;MADDP}88?B{)FIU{ykbh(XI@&4dJD1;c%e)*k$7EE8NCfqED`UHx3vIVCg! E0M+U(R{#J2 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/draw-path.png b/comp/src/gb.form.stock/gambas/32/draw-path.png new file mode 100644 index 0000000000000000000000000000000000000000..c93d237f9b14084ab5082a666494c9516294acd1 GIT binary patch literal 391 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP%tyV zC&bmgz$ZRFJ~1&d0Sq9F(9qDNq$Hp?P!&WRNXEv-0!4rT$c8iEvi0@#xw*LzaUhwN zmIfq&<|HR4L)2{g@dsp_Qb~|sFvAu9>$>hmoV>potDY~{{Ct<==b1$(1RR+77T) zEIN7pDoa_o{~z6E(=1Tu)p|^TbGy)j$1JVaCMtMxs9kkDqw_BNulB2bb7w!acDemF z)HYP((+bNgrlMZ1HL1*}ginhu4lt?cpJN`b{D`IZ*hB@d4z=7f#;P5zdsjcRwmY75 lJ}>P}@>hfDtJ7H6brh-vZWhH{I1F?lgQu&X%Q~loCIDXal<@!n literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/draw-rectangle.png b/comp/src/gb.form.stock/gambas/32/draw-rectangle.png new file mode 100644 index 0000000000000000000000000000000000000000..8028ecac90d81b98c6817ad4e449df4b9b56ff0a GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;I14-?iy0XBj({-ZRBb+Kpded- zPl&5~floq0!v9UKeLxY$k|4ie28U-i(tsRkPZ!4!j_b(@4a~p)|Nrm6!OX@suTeoj cuYsB2)LEg{zYGqOfyx*>UHx3vIVCg!06F?3C;$Ke literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/draw-text.png b/comp/src/gb.form.stock/gambas/32/draw-text.png new file mode 100644 index 0000000000000000000000000000000000000000..cd61e2ee9cf251a52b11a83e9b4797447cb083f8 GIT binary patch literal 547 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAQ1DWK zPl&5~flp#$Vmu50*>G-XXedNDGBPp_3?SUJv@{4KDJcoAxW2wVAt50nBO^IE87K=8 z2Z{gzP%BUb!UmEMy>Jp}2oM0d(b3V!%76yKxp32BVq%a@11gA(jRler22dH${JU>0 z_5pq8S`y?J%#eQP;+bp5p1k1s>@9M^bIxpjO zeEVvcdW}rsy{V7bqD!mNp3acWx%saAu1?}ZZdubc3Q<4iz$49rbx)PgNK6XevV$<}TdU@8e6RW0( b)I8y=?^8Nmt;*vIbTNactDnm{r-UW|2cg_g literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/earth.png b/comp/src/gb.form.stock/gambas/32/earth.png new file mode 100644 index 0000000000000000000000000000000000000000..66a7fd2ed1dab2c0723f3f61c3cdf0d689c28715 GIT binary patch literal 1090 zcmV-I1ikx-P)Px$zfeq6MNDaNZ>QjIr{8a<;DEosZ>ZmJsNip=;DCVt zZ>QjIr{8a<-fpMgZ>ipHrQmI*-*2bjZ>QgIr{Hg=-*2bi|NsB~|Nn8Q-*l?r{QdsD z*YI+w;Qs#q`1}3&{QjQA>2<2$hPC8yr{C}O`{M2S`uzU1(e8Jw;hn?j)aCW0$Ls3y z`qkz3wbJkG^ZVoO`E{${^7s7P>G%Eq|8S_^k-X>H==a&^_JgzIg0kbf)$oC`ZZx-&*Jph=k~nT@PM)7{r>)syXKX?=zFf>?ezP0tKr`3 z_{ZJz@%Q|m#OlS{^2pxvsmtu5#_D^o;_LJKv(fJH_Wbbn{Py|%in!&KzURi=@`$(P z=<)io&+gpn_tfO|l)dN4-t*z@_=mORjk@N1ui~c2>%rOalfCEk`2Eu3^_s!y=kfZM zzvz0d;q&+WyVmf6v*WK@<>gDhGg|y_S%Ix#_{J7Nbx6|+1>G!J3 z?4ZT!5l|SL0000KbW%=J0Q3CY1k5Rl0%Pg>!ahnr!|F@iIpYmC00063NkluCOv)*aN#*eS-gpm5nBr*bE z^_g@A|Ng93!bFVDEHoB3H~)sfbZ$G}ir*=I`b)m&&D0R26`A~8{sn9E7P|vmDW0Dc zBnfEDhkKQqd)(^H-GBPI zT$RN^!KT&2k599!VL{Vz{pRiHz32JyZ{*<=yehyVTm3kq>&Nye36Q(9bIT+W1FHgo zN@?PQuA@Yn!C#JhR3Nxid@mV5u?1YshFmJZyqzn&3h6+tsb3qH;MM>vz92KB8WL`u zaB4&cf|xHW^YbbZPp7I;RgVm2pj{EblLvGmpP)!3wr_to1r8hnJo+<}cj!_y*Qez% zTu^4+2bB@47Yd`3bdT7h0sXWV$B!x_tx!%ILN{oG4(q_sUZn^pPbkK68qGp{nkOWE zL<0sCKs>7qxK_K96LtR51*2N$Wd3vlt#(tx42)grH*}mSr(@V=7>mWnARBJ#2=!$E z#@A-ri!g=Rw5sh*(QbSF;~25S$D#G`vL2V)?eef*=Wc%K|7NXPI}mgEZ~y=R07*qo IM6N<$f=(%rSO5S3 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/edit.png b/comp/src/gb.form.stock/gambas/32/edit.png new file mode 100644 index 0000000000000000000000000000000000000000..2f72df96f2bdc05074edfef504bcd09ffcc861f2 GIT binary patch literal 269 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5C@2@; z6XNP#;FFM$uwcOgAo>6Q|MlzFZ`iP*p`qczg$viOU!QNW_bpH*Q%R6tFhj#^Z9fSh zuiewdF+}5h@5O_>4h{mXiB<|$1rN3K70bP0l+XkK)E;H5 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/eject.png b/comp/src/gb.form.stock/gambas/32/eject.png new file mode 100644 index 0000000000000000000000000000000000000000..d4943dd5239faa5a487875359dba2cff2c92a093 GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wFKADB_VBkIHK{8N~sU*lRn4w{|wx0x$=j!R=7$R|b>N!Kv0|q?I z7fTE~7I4Zf=Iqe3n^L)wWx=(Q!}2C>#pjETl%2UgF_p=Q(Mh;P=#+~_UXI|xJ%RT3 dKdhDRmEFmsf3aeINe9qC22WQ%mvv4FO#rM6IRO9w literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/end.png b/comp/src/gb.form.stock/gambas/32/end.png new file mode 100644 index 0000000000000000000000000000000000000000..81b5096eee04fa42254d8a850b45b08d1d54e088 GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wFKADB_VBkIHK{8N~sU*lRn4w{|wx0x$=j7?)7$R}G_xwW90|6Y) zfo`Wecm$o7y)j?^Ncq+ZZ3}@_|6D>n`J^OxIvkjr83i*E47lSC?-H+)y&8LF^`GD8 a%H`gB`{aK)pwkUBjlt8^&t;ucLK6TA_c&ny literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/erase.png b/comp/src/gb.form.stock/gambas/32/erase.png new file mode 100644 index 0000000000000000000000000000000000000000..63e0395772d77162df7c5d7266dbb02e6d1b3ad3 GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5C@2)* z6XNP#;B&vAAR!?ENZ!xS2Qs{4Po4$JvXlh*1v4}>ILQB8auCSR^mK6y(Kx^M;zr&B z1{^F7$Ay<9Fqpp!PGMA0+i>LHYL-dQe(FuqjQ=jwbZy(Y!XO2&18al~gPEp!uz4{w zi#t5E-@#eqlr#H7!r6axKZPbBZtS{e9#21@=3iCC%o3 Ss}=`Z%HZkh=d#Wzp$P!c2217u literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/error.png b/comp/src/gb.form.stock/gambas/32/error.png new file mode 100644 index 0000000000000000000000000000000000000000..7f5ec8df71b3cee40f041db38a2b125524e60798 GIT binary patch literal 357 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaNb0(?STeKHFl6cjwj&xfG@4Gs76^MPo8LjzFces1oAygZ-+h~Pc2vio^? zKn6tQ|NsB{kD4d}O%o{z@(X6r?7ID#>CYLKWP2~~S1;`jANqag&A}rkK>3B9E{-7< zr`Jx7(d u;&DhbFmPGBXbz(hU#sIbX~REVYz+3Fy}4_(CWQd?F?hQAxvX{M31s+%J%kS2lx%WRc zSTkUYzOGF@TT#O8(Am$J+qma(SuE^xXsdB#Tq_!t;K^xxvQK925<@Ww)(svnoEP>- z`+SRGI21NlYSMe@8HXk+XY4=P^4qdMfm{(!;-h&_czQ}j|VDY@O1TaS?83{1OS~ODn0-J literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/file.png b/comp/src/gb.form.stock/gambas/32/file.png new file mode 100644 index 0000000000000000000000000000000000000000..572500cdb4ecf7b18e2ce0c028e696221b55085b GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~q2Ka=y zx)=B?Sg_##|Nlmnb{PdQzaCj*r+c)I$ztaD0e0syvXCLRC) literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/fill.png b/comp/src/gb.form.stock/gambas/32/fill.png new file mode 100644 index 0000000000000000000000000000000000000000..859215f0cbb829b81761c99a4e892bf5398a4503 GIT binary patch literal 290 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5D5xIb z6XNP#;FFb=Re!O*!lvI6;x#X;^) z4C~IxyaaN>1AIbUeKHH%!yQ`f|6J{sRIAp`~V~^#*M5YC8 z-`2VbGKen8SN+7GU~zxig80VE`hJsRPKm_L{2n_qaWR`{_SPR;q>_K7Mx^fK%NBgw znN!tYE%CU;$klI(xZ6?@b+f9B{?E*)W_YR}AYW6lDJ3)b+|}>=mZ$k0Y()1kDrr|RyM#$J w>vJnH&P`~sT&eFSA>1H%h12cA(!G_8d%uh4ZBOF|I*ftA)78&qol`;+0Cq7yM*si- literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/flag.png b/comp/src/gb.form.stock/gambas/32/flag.png new file mode 100644 index 0000000000000000000000000000000000000000..43eb931a74210fd275c1c607b7ae62098faaf0e5 GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBh0X`wFKADAE^788K?eFL3e`K2H0u*N|3GxeOc<-iWbP>q2@N{tuk+__k zaDX9(`(N_`R*A!mr+#ox{>79W(_kpGpl3hN3!WV!PKGhocN}(zCU`$QC&9qR#=wvp W6IQLgd?O3c3NS%G}U;vjb? zhIQv;UIICs0X`wFKADB_VBkIHK{8N~sU*lRn4w{|wx0x$=k4j@7$R{wIbng6Kte(S zqp^^LgoUHYVJ$8j=-Xk*@QalFS1d>$)PHGtxBqTH&s3}MkXzoaADcjLl ip#5N)(i}%o28NsrSxYsBTib!gGI+ZBxvXNS%G}U;vjb? zhIQv;UIICs0X`wFKADB_VBkIHK{8N~sU*lRn4w{|wx0x$=i%w%7$R{wIpF}CgzN&I zZJYsZSA;Z_vsFV*t_l@!%~>7hDB`&`iZyV`)-2Hw!Rt(HRfZ3y9h%EnE^%jN!Exn1 g%-NS%G}U;vjb? zhIQv;UIIBh0X`wFKAD9974!Ye=l}ozzif)=AD}o>NswPKL&I!sKM5eu#?!?yMB;LC z!U2Yu)eZ+3kIi66`U6yaT}UEXwdLb0@c_XohK$D|8k#@K_cF5mkbM2WIpp$`#zajv a1_l|kIsS!;=iPzkFnGH9xvX@%QiF+qZB3`0?Y@r%xwLn2?^Ho|&1MmX4+SMJn zHKOiTPuj61hclSmPMu&<^z`yN!L-cFYXy^<)X^1DXRcg4b0DBGk*!U)gu}4O(4B*U Z;qrZ_*OMeB0G-Uh;OXk;vd$@?2>>aAQ)mDH literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/forward.png b/comp/src/gb.form.stock/gambas/32/forward.png new file mode 100644 index 0000000000000000000000000000000000000000..dc412e50f673683c2ec569085d83ebfd9b0a6f1f GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wFKADB_VBkIHK{8N~sU*lRn4w{|wx0x$7vkyS7$R}GxBnpT0RtW; z<5})s1b#kQw#Jd`)q2v^q~6BloH>sp$1>bdp(Dh4kGOWUOx632k%GkCiCxvXpCgZ7ib%Ur>mdK II;Vst0NpQ2YybcN literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/gambas.png b/comp/src/gb.form.stock/gambas/32/gambas.png new file mode 100644 index 0000000000000000000000000000000000000000..436f4422b8d93e3ab70e94223aae4c36ad7a196f GIT binary patch literal 946 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyacjS1AIbUeKHF*8+K_lY;n2v@sd2bcjN!MYlDs7%@h6x2W{Luk=z+^GfDqT9Yjs}X4FPL0MLT1`8&8+NNS zY*X*t2-XM^2QnB|tx{>*2DA>zC?IkXAjpL~G+RLy0Ye5T0y3cYHyAzw{p}lquc4_|lxlnBc&}n(a>?Jj*+wY5$JI8pYPw?DMhJuMwDvRokB=)E2G4wH*8v2?=FKw$n;CduEM$eXM zj?=Zkz;$6u+T0GDJF6SRkNw``!|L!{?4_} wclFCo&wg;d`mt6?^&!RT>gkWquYY3xx@+5qluBtuV6-!My85}Sb4q9e0O#Jd3;+NC literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/game.png b/comp/src/gb.form.stock/gambas/32/game.png new file mode 100644 index 0000000000000000000000000000000000000000..c2d10da1d76d5a151d228644d2d3708423ff2af0 GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5C@3A^ z6XNP#;B!AefByXW5AyQv=jA;pC`d?1fQU4dJv|Rp##R#K7tHXzKJZYtr`d$BK#^!q z7sn8d^T`PcLI&1d5(_w5rca-~NJE32DMeLBfstK>(QQHlgB>G}u0&f>ME6UBwk;-X zQrrfm4vkD94$Nv7T9z>^b759w2)xwDvVnVvBI6sTma_^v4nVUba-w)klh_o2Oa@O^ KKbLh*2~7Y?U_w&> literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/gamma.png b/comp/src/gb.form.stock/gambas/32/gamma.png new file mode 100644 index 0000000000000000000000000000000000000000..76cf80ca38a35d3364e285de22e26dee6acf3888 GIT binary patch literal 368 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP_QV# zC&bmgz$Y{`G$A1&EiElJHnzUL9>|T0ivx-{I5^RCIJS z&@hM^pcI?|QI?#XoRpLVVMEmayi@TDs6n+P$S;_I=NqdI8*`2Yiz3r6?Q53Hf=?Q2 zCCM(BMl?9M`bCCvcI(DCu*wK5Yg(lv#(IW>mFLo=M>DuACW?5h-1I11;n<!lvI6;x#X;^) z4C~Ixyack}1o(uw`eYWSrKQEgKvGgtMn(pZH-G;8l9G~ygajZvE-ns8CMG5VNuUUX z8yg!7aOyPz1<@n~$jgVj!|na5h9Snihyfa5X^RL9Bp#A7VR17f>185Qs*I zEKnTIfUqI55M$A#;EEyQKm#FWLKH*77Q#j&k<9^0K>`y+?}zWVfQevnNswPKgOG&? zhd3V#6I)e=uYf#{x9K0%?1JuTUcVX)^(OQcav7IQD)z`yPS+8$i}7FUmTM67O7gX9 zXn9C@{QJh(vi`^ui+|gvN?%Hey6|*U&y3S&7i^pT>G`?!Z8obupImZ%=FT^}o+&!- zmHjrw@tygVb@MuwU3`19W_seGfcl3=Hy&F)_wbR;Kku#FQ9C)QYq!P*t;a8#4_v;p zrTycIC;uK;RpzxEUv_s39|HqZtfz}(h{fr(lS9j;4Fy_{cSji;8wbm%9WQ)j0AxAe zo-%Xh$@(p`ORM|*7x>Q<&n&U`EM8*G5H7Um$AX=?3pUMJvQtEGhJ!``U*!Lnc6Hak zX8$$MyLr{AWR~`nU!7Mnj{8nkTCTooH+S3Aqf0+dC~J&fV6d=EZ=Iz5L+>4Xdg3i2 zotZ9lF^CliKACVv!R^3}Gpuj*_%?iSpR~N)cD?++YeN4FZEyZr_)3)__=B{MxpfllHVn}O^)cC@+kS~vE=6ZM5m(4s#7u#7!Ix8xBjvyW6BY`U}xW+3;pj6 z7p2{e+BE0n-YYo)e;+9FABa%D)}GoBv)`9ROFlQ|=zlxYN0L>i1TK87Sx_LBB4ys? zC^F?z<^8WGPSiCzpE@^VLBOFk(sg0sRi8`dL zPl&5~floXbBqSun#>N7fKn9RZOiTnSfv|xj1jNO~0T~cA5H^HcUtbSY4;0VM%>|02 zrluw(CDs402ePZ4R26I~NG?dO`%#xYBfI{0eNs+R-S4{W+1Uw+i8XI)3N{tgeXmQ( zOe#K5oS2zde6Tp9J0r6vvv_}T(f*=GQWdX(?vN`9@(X6Tv+%g)XNTYJj0f&6QaIt0 z@MXb+Ue&W~=la-V)#B6@Io|+PUh{Nu46!)9c5*s@lYxk9>d69y9pUgDdqB!!X)EW(m zY4<;cHdrf~vm_VpoAJ=gOK*lx>mixtwW@FUB|3}bcNc^T~?Y%%A8tB=%?3ziF;S7^FiusC>ZnP$p{deJHF8u}}1mK6nDU6FZr zV$i`Ar%N|aI1)I`wUEhsN7=GQsly`qJ+EKP%FW*O_}^D^dxq)$N_)JUtIq;`$l&Sf K=d#Wzp$PyPw9at= literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/grid.png b/comp/src/gb.form.stock/gambas/32/grid.png new file mode 100644 index 0000000000000000000000000000000000000000..ad8f97cf2ce0f635bc192c71b72d9c84b8130be6 GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?smO1^9%x`eYWy$H!ZHAI$?vmjw9*GdMiEkp|?5dAc};a9mGLIKcE{CV!2C e`UmD&Ky58nqLK#33siwB7(8A5T-G@yGywp;C?t0P literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/group.png b/comp/src/gb.form.stock/gambas/32/group.png new file mode 100644 index 0000000000000000000000000000000000000000..59634eea28f1287c0d083236f58424a73e2617f6 GIT binary patch literal 917 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~Ixyaci*1^9%x`eYW~U!0%6{63HbqP*qz^1$qSi}LR+%fG)Y2PD2E@BaJ*hyoya z7bvwTFMs(x|MGc2_4gO$0R+ zwDRTGmQLxoy)ZwxVqW{=L*2`cTwGjRU&EdSjH<|zAirRSf8Q>?yZP@&jkw0bHjeV| zf8<(ze)w_nT=reJ}s>^=+BH1t>Y#c)B=-Se#yaIkdRhL8A4c#gV1& z-o3kbQjFX6n1EYt`}5CErcEpNnQT`(wR`7o zH3jx>H>dJW)G6E8?`Y04J9^Qs+p#=c4)ON{55D7131B+V;PKYrruHj_jKv3+Ug55O zsGD->fd|uKXIBQF3lA(RIcxKBxlArR@Y&~Cdwc;`T1G+F{LAO3YcANz|E=Bslb&|_ z)!-?9%YWT#|F!qi)VMn_qCr(JzW#P)tXwj^Kl)L4;+@0&ACLSNW_-Kjx=Eyf(?t&h z0S>oCml7X67iac+_f?neOMcr)!w=I|o%JyOEW$9iV`Ck|u80Jd205_|7KLWkO_#n~ b|7VQevUBUQ=pU1S0mgTe~DWM4f1P|BL literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/h.png b/comp/src/gb.form.stock/gambas/32/h.png new file mode 100644 index 0000000000000000000000000000000000000000..2b71d3fc139958193666e6374d2f7e524607a904 GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5D5w(P z6XNP#;Im-Cg8%>jGwf&3KBc|*#o~{@KmPpt^ZoDl;a9`W&zfi4%=mG5T_;dIV@Z%- zFoVOh8)-m}i>HfYh{pNk1O*H zC&bmgz~_HM!~gpF|1~ur5{PPR|JT)l5QGaPtE)k5h%$&EkPYWT7-0486(ZU|lO;=n z{DK+&O;F^}F^;ZW@%6X-(_c>%9{r zaS8mO@&Etgxi@nUGU?d6C;GpGcB$R_srHUvU)Fr* z{Fbu!{D)1)*Az9+@@MP3- zSf@;2U}O{*cVcQeyI^I5q0j+6hZ{Uiif;T24Cc0ql^K(?Wr4aFJYD@<);T3K0RWnF BE7t%3 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/hardware.png b/comp/src/gb.form.stock/gambas/32/hardware.png new file mode 100644 index 0000000000000000000000000000000000000000..ef3b373d74c393cdbd31f4e37b72d860ded8a75b GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5C@2)* z6XNP#;FFM$5WheE{{8&<^XDHpaA4i9T?c`(j3q&S!3+-1ZlnP@#-1*YAsXkC6BKx2 zRwyoL;W;55z{}dGpu*@VAR)x`!f&~Sjf6x`B7@kg8B7Hop$!5I44LKza|<8J-T`W7 N@O1TaS?83{1OV}dF$Mqt literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/help.png b/comp/src/gb.form.stock/gambas/32/help.png new file mode 100644 index 0000000000000000000000000000000000000000..4ef3043d105b25a44c5083ccbd0a8c6b9b9044ca GIT binary patch literal 610 zcmV-o0-gPdP)QdGrr>X<;BTkkZ>QgIsNjFUzkh%KZ>QjIr{8d= z;BTqkZ>QgFrr&O*;BTkiZ>QjHr{8a<-*2bi|NsASsNa~t=(^SLb*tdN*zvB-?fU%w z%;5BLso>k`_tNC`tjz6;xaDxD-=xRuc&*{~`Te2A>f-JBmA>cY@A;Fx=jieJug>kA z!|Afn?zq(N@b>)u{{H;^{`>v@yw>oV!Rh_}|AVvS&*JpX;q;Qc=aIbU?DYGWzv$`m z`nS{Xs>|$xvg4=8>&@Zx1Nwt;0000KbW%=J0L+Tp^ZY3U0%Ph+KIuP7`@_QAhl}cZ z0003QNkl3;PGD36|F35 zjgX;8JlpmX5y~33<8Dxnrt6gb?FJcWv`v4fMJ2Q%!*5dsc1JtE$nTDeGx919*WcYc zxw|Km-qs{H5yc!%vQC~ zXljm`;d3&XYgCwvs$#h)*(@v{v*}n9mMmQs(G)l>m|MPXqQiruejz)jPB2s>7|V+4 wBp3Zhw5w&m`r-WU!xw1~$3ZH5xy~p31F?HF1dfs`k^lez07*qoM6N<$f;>@9W&i*H literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/home.png b/comp/src/gb.form.stock/gambas/32/home.png new file mode 100644 index 0000000000000000000000000000000000000000..ec7001a6b611f23661fcd66d0211b91bd06a0c8c GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wFKAD9D%kSqezi)f?yAn{4sU*lRn4w{|wx0x$=i}+(7$R}`=&6l@ z2NZam126A5!QnHx(uP-g$%2i`RP0thdJ(ud-e&XVTdO}Td=V_D$s}OuaD{OZLr}{J qZ8pxpkR=|9>3?3V{QoBCO>|nize$$<>=!_D89ZJ6T-G@yGywqm{6RMW literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/html.png b/comp/src/gb.form.stock/gambas/32/html.png new file mode 100644 index 0000000000000000000000000000000000000000..6afe1985dec4130b76b5ce6620c7bfa7da69f4e4 GIT binary patch literal 374 zcmV-+0g3*JP)-)jKsp-EyI|Ni~#s%`Vgq3WPq;BgG+lt=vX=YrQp;?DNjzWM0b?y-65pj+dDDE<2Oo(fZ|00001bW%=J06^y0 zW&i*Hlu1NER5;6HV4wnE#{-B}z<~n{T?I^>y!aLHapEz78;CiDIK*%$P~l_&DUje` ziq<{x#11pfJgsuQ6rmg{`83loatQ?Swp+FgIDkndflE+XW1Jt9&!66Lx zgCdY4j^RjEkQ)R*3V?2q6vgIEDHaY+E|3Bd+yTYOhCis8IfqGt!K#4LoJAo301o0A Uw}B}NH~;_u07*qoM6N<$f}lySeEN7fKn9RZOiTnSfv|xj1jNO~0T~cA5H^HcUtbSY4;0VM%>|02 zrluw(CDs402eRw;|NmcKU$y>8!K5v9yMJUi&d5nhO3o~(-}}4jNmc#t`nunB1zQS| z3zF-8)Md}eo}HbYkeK+krsjKH-KK(qbfR2IkY6yvorT9WKRf((XFPCsk-`a|gf9yo^s1g^JJ-h^s}`rO$oU4S@`I;~ zV~EA+wUeLc9WoGUJ*ni^u<6t?nK_)g)$8~D&o*7q5wWc>r1SmzpC!5SvEp3smj#^^ z%-Slm@Zt%uQTl|)&+_dUp~~eY)!(&} OXYh3Ob6Mw<&;$TgOYJ8B literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/identity.png b/comp/src/gb.form.stock/gambas/32/identity.png new file mode 100644 index 0000000000000000000000000000000000000000..03783ca60cf5f06563e2528376a5ef90d3437c4c GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBP0X`wFKADB_{rms_|Nr>)m*hzYr)|CZ_!@p=M1N`U|X literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/image.png b/comp/src/gb.form.stock/gambas/32/image.png new file mode 100644 index 0000000000000000000000000000000000000000..23ca2b0036c8f1210a87c2cf92286a12c70f6784 GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5C@2@; z6XNP#;Im-Cg8%>j=ikrY{(k%Y`wR~s^1XeV`|scPqo0ocynV9~sFJZH$S;_|;n|He zASc1o#W6(Vd~$*U4@)3J7^A9+LvZ7_EnFdumo5~9G+w!2z{DgGWx&JAEUIq8m@eGH z;1P86#tlwAhDjx6W@e3?4JwT{Zb+yxOq$c9!Z6LmO=w1sUV=|RLqdmOkEIg>!}FEq V2OCWtvw?Ooc)I$ztaD0e0s!yFOyK|k literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/important.png b/comp/src/gb.form.stock/gambas/32/important.png new file mode 100644 index 0000000000000000000000000000000000000000..21bd26086784c24c8b0254a5a991113051d24ec3 GIT binary patch literal 532 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP;hC0 zPl&5~fzN}2f(QBeK=i-99!TEL&%c+SzaPTR&3%xU2UGwQgouL_eRRE*1cK1`t{PK zFQ!j_m%_Lh=wOkOAirP+&92)_pZ}a;Nw)X$e)ZDs@S)##41|7d2g-l-ba4!^IK4Lb zdeI>V9+URmn1ZL%{1oQ4OuF#t|9mlnmT2Yk6-I~mc}7()oqBH5I}YoB%qP17S268g z^ya5*t?T9Qd9Qn?=`Fmfas77RzDD6`uhxkb-2PJU9)4iwstULIJMX{y$k)&P^=vi! z0f8;`Gv_~h%_KbQ+Z%U>UGfKd4lPm8IJKtHvUQchk|{SCy}33w2?Rcqz7ZfH&SI9y z|0iGu_aX5OqAb%Q7_=1+`pPx8fn}Fd=EdJzb|@?ETA_IC zMxD6t2^KOZO0UcHq_&2ti~oC`@%sF}e-G#U@dy!nUO8vwk$ul6|6{%X!?103Y!xti P85lfW{an^LB{Ts5P-PIn literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/indent.png b/comp/src/gb.form.stock/gambas/32/indent.png new file mode 100644 index 0000000000000000000000000000000000000000..90e026021b55ef47689fb5357e25ca717215f8ea GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~r@&x#V zxVjhkBqSs(Sg;^IKECt3(*dA3Q%R6tFhj#^Z9fSh&)(C;F+}2Wa>4?Mg0)dwvlyAV zdk%67KQC`E)H@&%pU|`4;8;Do#A7BGYoWu8u^+{Gm=nVe=(bunGj=*MGB7w*$UMEZ Se$yPFQ4F50elF{r5}E+Vw=tLi literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/info.png b/comp/src/gb.form.stock/gambas/32/info.png new file mode 100644 index 0000000000000000000000000000000000000000..162eae26fa341e5d501bf44cdf03ac0910a032f7 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5D99h+ z6XNP#;FG`n{{R2~KmYhM_wdV?Hg7Hgr5HEH>hVI@4z2fJxz`sH|)(TL9w( z6@hXSLjxxkhe`GgOk6yZ5*R0>u)7@e*>He=1w#O%3xg+P7lX$^AC-2|W)TH$i3X7~ pE-oQj5sZ@@7$Oe(C_R#6s9Uvp*=-#spvxE-JYD@<);T3K0RS9DXlDQb literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/insert-link.png b/comp/src/gb.form.stock/gambas/32/insert-link.png new file mode 100644 index 0000000000000000000000000000000000000000..2f5a0eea8d4cc82df18b9c682e0d32e228ce8e5f GIT binary patch literal 1003 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fA0|R4u zfKQ04dx1}AXlPnmT0%kskWpV>9}fmVZftBUkO^c!M1Zonxw$|#P%%Ub$c~GPOG-)t zia^vrM1X=04i3@L(QsvOSs(+b9;g5!0$~6h2;@Q(Lqrl26OpyRxj@GN6~LVYQ4AsB zCO~8%THsP}(;z0mxo`y#^*}cO6#!ihQ~(qK%EIjeia@v!5g>`|U|`_D%>**wx{{NV zfx3VIq8+Zr>tgsuptoyEg8YIR*tkwGGyVP7!2O(K^-WIpH>^6hj?CiaziK^g?gbV; z`}co-{XYImU2orOwV#Yn&5aE&T0Q*nVWQ}H?HTP33;kBjzG1iC=27cnr)!p{f*YOR zT0Gcv@{G%q>qc`l4P?$~2~R!ic6hI?#4`cKJ7zC|n)VG@*x9(Hs*UruVy+8bi**>RWiJq~ zyWeUvX+K9pd}1>gpMBzudVBBTF|o^!oF?)t-zsk2HSf4>$jTK3MV-aE z<#C#?IFdy-+kBUQz4X!7?{Ym^(E+n6*A+hfHCd$daNm13<@o!8uJ5+5Ph&`5^p1zw z+w{Ktu73+TL%;nrp1t$fiS(zhm;dcwx@Wz-zQodK!$OW)4?z1~Clz~$e`(za(* z=S9E#b*)rsR?+X6YoAzq9{Q}{YyBSfEbyu?M}k*u)THORyf-?oitg{>xwKh$I*-=7 zS3jO@TfxFMA?_)ITI1O_@7QgmUh}87NgNQE-I@IV(AQb==XjXC*x2(Jytc@svzd3r zP3-U$6k*po$0PcMWA<;i7m4epuCg$ma51L7M$U9P?>4=kYBPE(W6UPFxb8Q8u|`V$ fr_8@c?*G`@PIOF)P}-gWOeGASu6{1-oD!M<`c$LH literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/insert-text.png b/comp/src/gb.form.stock/gambas/32/insert-text.png new file mode 100644 index 0000000000000000000000000000000000000000..c9ee7aa57baef707016caf170be73edc51b6a671 GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5C@31> z6XNP#;FFM$@c;k+g$oxhSg;^IJ|4&x%T1C4DqtxI@(X5YsIRx$UD5~SM|iq8hG?8m zPEg>931A3oG*NK~ZVWIupzaXuEPH`vlEeiT5s84a9!Uu79 xg1}gZA*=z21-d#k(l;=vFfwmw3Q&3^$IuejyhSoux&>$lgQu&X%Q~loCIEFbJ(&Oi literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/internet.png b/comp/src/gb.form.stock/gambas/32/internet.png new file mode 100644 index 0000000000000000000000000000000000000000..23c8e892662c28b781079ff0285aa3e4e19cfb46 GIT binary patch literal 838 zcmV-M1G)T(P)Px$2vAH^MNDaNySux)ySux)ySux)yu7@-ySxAY|G&S# zyu7@*xw*Q!y1Kf$ySux)ySuu&y1To(ySux)ySux)yKkr8ySuyp|Npns@BaS&y}iBh z@$tXEzx(_9m9fp%*4F&|{N?54`1ttr^z`!b^7Hfaz`(%y`T4`c!^z3X_4W1l_xJDb z@4mjiyv@zc*x1U3i*Vp0U;nC62+S=O4$jI&O?a$B8$H&LY%F4{l%*DmU;^N}A((cgE(4M;1ro!Io z>FMX^=iJ=f%gf8#+uPLC)WN~Q=H}+$;NZf-!uO&3(*OVf6m(KfQvm#m+bPWR0t90| zNfHOn=_xEl0RR92yh%hsR5;76lUG;jP!NSl5JCXKl0BxGM(@$(e>gMLJ0&aIJe-^zuRsUVBhm&(C zJtDo*LpG|C%V1h3s%nbDsxK{@RigS7nXpq4%?io-AFsQ6GHqRFM5PHa`2SwFC!3w6 zr{l%$TwV=YI?1Qqv_Fp`CXQ)!ef{|7@AkZNIXG*PGeO=1co_QsMxaa5k(=HbRme2J zdq7Ehn%zaZPk6D`4m_azxUiIs9ua+GeCPq($H-odH+n#rXA1Ux04tr;2PM)2;-nD( zWh`6l{Y#Q!gn3$nU!sJ@3DJ=x#R>HsI0(Lp_jy8>q-TqD#Rr4JL)9%Rhob84V#ol0 zP(m8xp`8S(HD)X!ToyDpg|h|7BbGqitQ#|#>_G^yp8L$3(Yjs3+_n4H2!V^1V_?fL zsZ@c3!MY9sX%9|MxM_YWrmzBn9r9{CW+3*ULtpZRw~^`R7T QVE_OC07*qoM6N<$f@-(kQ~&?~ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/intersection.png b/comp/src/gb.form.stock/gambas/32/intersection.png new file mode 100644 index 0000000000000000000000000000000000000000..ac3a6ae8181b94acba94e3cb5e96d2caa0e90066 GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~r@&x#V zxVjhkELgB0AtB+wfdiSUX%m3rj3q&S!3+-1ZlnP@hMq2tArhC96Amz}S?D0paEO6( z^1%mDTeCDTFr*y&|DRhzBfZ6KZB*+ah1o{r2zw{{En#p#T5>-)jK;^624o z5afU*=aE7G{rvRIr{Hb|<%Tc*`Sjp%3h%ap{POAWxrX-Ex%=R&P_0zNInNRDZ zVCk4m<%TZ(_3i7TUiszH^T(g?x`_Jf+xFJD;d2h(Z3OSMe&vNN{q^qm+`{+Ryx(mD z{`&U+s%Rtt0004WQchCIFEc0eh#Z(^}wF0AEbrPl~wAb5U@=l+;DTNv%ADvV1P!`Qs16 d1Zpo!W$sXnB4f5-3+4a-002ovPDHLkV1hTpDVhKP literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/jump.png b/comp/src/gb.form.stock/gambas/32/jump.png new file mode 100644 index 0000000000000000000000000000000000000000..cf1a5675374cf61806ac21082429fc774558b2b7 GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5C@2x& z6XNP#;FFM$keHYlj|$E*oVgEF!(I~P7tGM0wdu>pudK;V;Xt7TPZ!4!jq}L~3%CRv z#5G*RHQd94`qnLxiS@MHHL0jX_2~<*QwzOjoS7v0fJs4h)zhbr1&kAfK7aa@)WQ(p zSyfrdDaTl%E78`p*0eC}z)J&0r+LB(A`VO~Opy(Zw-^|huIpSpu<*lopj`}}u6{1- HoD!Mn literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/key.png b/comp/src/gb.form.stock/gambas/32/key.png new file mode 100644 index 0000000000000000000000000000000000000000..e81933175b73ad43975d8ebe1b9c26ee170f63cc GIT binary patch literal 287 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5D5w?S z6XNP#;In^!!hr+vhYlqkI~KZcUlN216hT8v<}}^}>f$X4@(X5Y_$A7zKV#<2Tk8&P zzj9HZ2`JIz>EaloaXvXgf%C+@z1@e>_jIc%bgMB06^O?kj4fdmzbMLa!O!uA%Gu2) zxbD1nV(?)+9k&8VTF+u?i!fp3*(vZ(c1LfqB9r+8rd(U$}4~gt27F5(s<$ z{{294pdbVQ*{fEq0AEV5Wr3T|NlRbT~?GY3UrlrNswPK!_#gp zzTDLBfrrF5eLZ+UIygwCtCOYT%fC5)nP)rlmapfzd`WMe{#S<$9}6}fa{y{v?&;zf zVsU!w<(qtm6a-iUvc%skD$TsReb?)ffB(PtaO|;Q?mX>VF-ur)g2IviN|)D3D4mi%D}&#DtXa!N4Hywt?V+a}h- zcPx#R8UM*MNDaN=H`(9|G(nmeCX(zZt1ONa46m(KfQvm7&{MPzD5>?gG)w{{!o|!O2sasQ86N0hjkGjwNS%G}U;vjb? zhIQv;UIICs0X`wFKAD9D%kSqezi)f?yAn{4sU*lRn4w{|wx0x$r|;?F7$R{wIpF|9 z%<2OP2LqBA4z8LS@O^z0Q?gHkq09oF8A5Cj#Ll*cf#KE1$W$<+Mb6Mw< G&;$UKKrlW4 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/last.png b/comp/src/gb.form.stock/gambas/32/last.png new file mode 100644 index 0000000000000000000000000000000000000000..accea5db8beef9f01a4856d8efdce1f6f73ec02b GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5D99h+ z6XNP#;1d@YmynPU6B833AFs7;(nFvWOG%JlFvGuw`tKjkECcdGJzX3_G|nd{NJJdq zQDYTk>S0s3#Hx5esYmZYMuXY|Ak7feq{I-!BvjDIyg(>~aea)D)r#08cY+zf7sV#Y4H8-D^VVDNPHb6Mw<&;$SuaXOs< literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/layout.png b/comp/src/gb.form.stock/gambas/32/layout.png new file mode 100644 index 0000000000000000000000000000000000000000..82fa13ff38c2fded12c91de44af6fd095e0ab112 GIT binary patch literal 423 zcmV;Y0a*TtP)exadKrlwo2u4$s8P^P9*)6;0ItW~wOTG`ob z-Q8~3*lW?zXvoN8p`lNppo+D%S)ia%qM}p2zFx}8WT2parKM5d-*3suWV5qa-Q8{I z=+vvLRHvt1rKM8I$zuXFLcst4019+cPE!CT|Njx$?v(_)kN$v>0001%!@dP!$pKK#I{*q9 z2S9NlgC$lw5l{oDRwO{%9$GaC(4dcQQvg#M57DXH!9J$R2<^xUFrSf`ssdnhpd(Aw zz#6ABPu0NXhAU6iKk?d~r5b>zst2X)@lLgXG&Q|$b4jWMl2mVhwV#*u$DXRE6d{IQ R>@ENR002ovPDHLkV1jB6$PfSk literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/left.png b/comp/src/gb.form.stock/gambas/32/left.png new file mode 100644 index 0000000000000000000000000000000000000000..c1108290eee061b5a6b8ac57240f63e4099ff7d5 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs1s;*b3=DinK$vl=HlH+5P$Q1F1}1q29MazNUte4K)mpIWS@ItCl;Ar$M%8C) z7srM7&Wg4z`1d;O`I)5M(d!ofx)EFW?^{ZFS;8je>9V)j?;ZWS{QK^E%wGiGZ7FO& P1M-chtDnm{r-UW|N++TT literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/link.png b/comp/src/gb.form.stock/gambas/32/link.png new file mode 100644 index 0000000000000000000000000000000000000000..d7e670e9f5cba9bcabfa765a65f80cbbe551aa34 GIT binary patch literal 984 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 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/lower.png b/comp/src/gb.form.stock/gambas/32/lower.png new file mode 100644 index 0000000000000000000000000000000000000000..2a470a882fa5130b497fb2e9578fb62bcc28bada GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~q2Ka=y zx)=B?Sg;@=At7jSydhAKu_VYZn8D%MjWi%f!PCVtMB;LC!U2Yu)eQ-ZrV`%HjS3BN hJZx-XT80-G7+mbVx5oT^V+~Zx;OXk;vd$@?2>@yIBP##^ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/mail.png b/comp/src/gb.form.stock/gambas/32/mail.png new file mode 100644 index 0000000000000000000000000000000000000000..3c79b59ddbf8b30d3af27bc1e5efd38b70f8fa42 GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5D99h+ z6XNP#;Im-Cg8%>jA2@IzfBAir7~4NUDaMi@zhDN3XE)M-99>Tr#}JM4$q5VC1Y8&+ zSf@;2sACit7mwnSXlAryJfvsZ#vH>`V%VIpBAAb1lc>(qZePoCphgByS3j3^P6Lrx#wgCC=o-U3d8t0P}7H}B^H8H1d zU|7s8!{IQcpudK;V;Xt8OPZ!4!jq}L~3%CUI z+nb#>Fep1YF!*{ZhVU!TV%jmuX~)K%46X%UToZHBT!INS%G}U;vjb? zhIQv;UIIBn0X`wFKADC4@Bg1afBygf|DQj9zJ2?4N8#u{Af+Wie!&b5&u*jvIYyo? zjv*T7lM@u!G!z;17#$@f*qB;sy;~ZzC*<<96fh=-moP5iU}P-Om1qlk7X&mw`J3{= UFPkFQ0d+HYy85}Sb4q9e0D#Um^Z)<= literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/menu.png b/comp/src/gb.form.stock/gambas/32/menu.png new file mode 100644 index 0000000000000000000000000000000000000000..64e749c1e4734ae5579799c53e86701f5e6f6679 GIT binary patch literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;I14-?iy0XBj({-ZRBb+Kpded- zPl&5~floq0!v9UKeLxY$k|4ie28U-i(tsQ>PZ!4!j_b(@2e@ba|8LKr*uk(RfQLav WO`yF}ukI{R1%s!npUXO@geCxOA0dAL literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/microphone.png b/comp/src/gb.form.stock/gambas/32/microphone.png new file mode 100644 index 0000000000000000000000000000000000000000..4a0a9ddf4f9971502fb9c3d8f7e9dfb1ee89266e GIT binary patch literal 526 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaN31AIbUeKHG6{pT;uzYj!n=gyrE2J`04n>~B>f&~jo{N@8?m*qd0IdkUX z#fyQGKq;X3(xppF1Aw|7EL^y-Fm%=Yg!>RFpb0<#RFLL76KEii0pu>qzgrwM2ciI| z9SCNoohc2UIluJ$qLPbc{va!Wih&BgR96-O9i~$fOwW>x=o zAx-}5=`2o;FO_e<+HsvJ-YF-qP_iqNOIelsjA4LhGEm=hPZ!4!i_=#ppA>2`5O84^ zVB+A=&{BA}+ww#^j^xAbQ}RpoE~&E2j5vln+_H1W|olx0|_K!gY`gB`EtnEg7*rS(5?hVg5@ z)tqc)$pV?09WJ+AzMS4-spUVX>v*I{TcFtfp6hbYCYEn`nRiHg_SZ|l?_E7umh$$- n%CfoZSnlkbuFNRG!*fYkn%Tyv=8iZI(8~;-u6{1-oD!Mi22AmL%@B0cG_0-G|Y!y30Ts~d$Um=c~}Hax;{Oh%D`Aw^GX%Q05- Rn?So5JYD@<);T3K0RXP`MMD4p literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/mouse.png b/comp/src/gb.form.stock/gambas/32/mouse.png new file mode 100644 index 0000000000000000000000000000000000000000..099a7c7fce127f2ffc31210479c960985a0bca86 GIT binary patch literal 273 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5D5w?S z6XNP#;1dr6X=!Ppp`kEdd_+V<92fva7A#nxsnZ$@)WuU0(F+>8U9D;k7- u99XpuEM!lvI6;x#X;^) z4C~IxyaaMM3p^r=85sDEfH31!Z9ZwBpjm)Vh^tR#VSIc%ke8U42xI_30vG@pp`oEb zGB!3AC;*ZGOF@*a>{Ph{)FW6D&Hz}g8+ zzAd*KKWFVdQ&MBb@0Fe!7`2YX_ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/muted.png b/comp/src/gb.form.stock/gambas/32/muted.png new file mode 100644 index 0000000000000000000000000000000000000000..6cf470286b8a00972cad1bce86768d6aba7d915f GIT binary patch literal 340 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaMM3p^r=85sDEfH31!Z9ZwBpjm)Vh^tR#;r;x45Gp9RpOtkxHy6lGNJzL- zQUYW=C@8p>mv;}W07Ayc#{FFY?0$Q`e^v6Yn7#)Igx*#S0|g6% Mr>mdKI;Vst0OeYRPXGV_ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/network.png b/comp/src/gb.form.stock/gambas/32/network.png new file mode 100644 index 0000000000000000000000000000000000000000..c1788c48eb014c6a775a4a7174440d7846aea25f GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5C@2@; z6XNP#;B(*r!=611hYm3S83zx7NFYi`NC1-A7q&bGs^lmM@(X6zB(C*!!^baScHb`n z#oRny978nDCnqTIl{6eYz-?eq;O9^*wUp_MlJUU<7a6n?%!IinEo7SHC=gYu6mlS# u(aG4io$E}BL$ZKSLnY6 z6XNP#;Is4U`-Fsqyyf@vm*3xU1;q9$Da{5dU?~am3udTqs26A7D+uIAdAc};Xq-<@ zP~eGCXpmy!DD-IzP%&^|I`@K!ErY3%CxeLzO7Zw;FgdVhfr!i#ObV z6XNP#;1d@Y_y7O@`1p7rdEmf-hK2@{2R+F^1yCdI7n~o-U3d8t0P} z6nJ_R6?j<+ICeBN6lw?rXfd$vU|rCl#??-(>4 z1c6wLK^u&P8Z->tT&6HYFghI&Sae`U#}0M|UHgdpPiNFVdQ&MBb@09Wlk Ar2qf` literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/new-tag.png b/comp/src/gb.form.stock/gambas/32/new-tag.png new file mode 100644 index 0000000000000000000000000000000000000000..7c9c277a8076ad91808c70bd14428656f7be5623 GIT binary patch literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5C@2)* z6XKeXkl=n7+olx3g-eDlWRQSJ5^kc@4^|7(JF>}`foy6ej>gTe~DWM4fUiMl( literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/new-window.png b/comp/src/gb.form.stock/gambas/32/new-window.png new file mode 100644 index 0000000000000000000000000000000000000000..6635429469038ed90f3e8ca1a6933f39d1d0823a GIT binary patch literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5C@2x& z6XNP#;Pe0g{{$F_kB6eXk&ppW*4^7@~20?!}9| z4GKK27msmD9AdoD*yq6h;J9c^yhhe7ao^tepP#5rn4&RnhwY)XZ%n@}C;k`MpA;r& z(b6=5QHoKe!HuC)jNLXu_RE34$t-+s369L%QW7&58bg=d#Wzp$PyMlu-Qu literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/new.png b/comp/src/gb.form.stock/gambas/32/new.png new file mode 100644 index 0000000000000000000000000000000000000000..8373cb71d8b1d6f35ce1f9f13f62e7316e4c5211 GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBh0X`wFKADC8|NoDVkKea%UlZ34kZFu1L4Lsu4$p3+0XasVE{-7*my;6? zu&h47Fmt1c2*)Be$;Dj9Dp*rn4$qNdPYyXKv3@~M!Hn`p0k$0J3z!+QrMwTXE12L0 P)Xm`O>gTe~DWM4f9qlvI literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/next.png b/comp/src/gb.form.stock/gambas/32/next.png new file mode 100644 index 0000000000000000000000000000000000000000..28ed5c12ae094c62ebe3475bb652071f3bdcf976 GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wFKADB_VBkIHK{8N~sU*lRn4w{|wx0x$=jrL<7$R{w_xx&61_d7H zi+u+KBxW=T8oT(;6k<8Q#U*y)<^G%Myd?$)VjK=QHtcO^Xl7VnqWFOI)Kd-Ssngvo heSZE3l*{>co-w#q=651r%~_zK44$rjF6*2UngFR}J9+>B literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/office-calc.png b/comp/src/gb.form.stock/gambas/32/office-calc.png new file mode 100644 index 0000000000000000000000000000000000000000..58f9f87844449e9bb454fc670f5be8c71fee56d5 GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wFKADB_`{V!r|9|LV>RphEk|4ie28U-i(tsRQPZ!4!iOb0e2N>2Y yOb}?8F1VG8W7;AEr^CzIgpznx=qdeaWn{ST9h!Q?VL|~=1B0ilpUXO@geCwU`7Tlb literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/office-draw.png b/comp/src/gb.form.stock/gambas/32/office-draw.png new file mode 100644 index 0000000000000000000000000000000000000000..ed44c30d3c008e5fe36e9b7ff9363e1064473f86 GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIID%0X`wFKADB_`{V!r|G)nJ`u6kf^Q#y92B|9v@(X5gcy=QV$Vu^ZaSYKo zzxLum-UA98t%>0Vc?`l2*h>B{?CN}Qn7e&i#jii6hTFpY{XYw~#TZx~R+z*xxkFIr zM1rH$ree4nANS%G}U;vjb? zhIQv;UIICs0X`wFKADB_`{V!r|9|LV>RphEk|4ie28U-i(tsRoPZ!4!iOb0e2N>2Y zOb}?8F1S^zNS%G}U;vjb? zhIQv;UIIDN0X`wFKADB_@$qqBkdTl7WJ5?GV;fu1B%m^mk|4iehQBd-4bf4N84Ien z0>$DzT^vI+&L<}|ULM{NKA literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/opacity.png b/comp/src/gb.form.stock/gambas/32/opacity.png new file mode 100644 index 0000000000000000000000000000000000000000..29bd8291fde00f1be5fc8879df3fe74cc097f163 GIT binary patch literal 472 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP_QMy zC&bmgz$YOgAuTN}IXO8#J{~9xO?7YRTFTm6CW!d7|dbW#(m)MQ^dW&<8R2!-SwH@|!aSX9IeRguDw6g(EL-V3{ zvUzFWXa4{HKTYCl=-b6LrzYt`%Jjzv~msTt)6baaAkMZ4yXeW33E4>ArSqQ)=d&UCcLkG0y9F>!i-N ztS|5$V~|y4QK_ut0nef>@|JD$qUZl@)O%ySkMY@jtzThpj@$%#hr!d;&t;ucLK6Vl Cfw{l{ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/open-recent.png b/comp/src/gb.form.stock/gambas/32/open-recent.png new file mode 100644 index 0000000000000000000000000000000000000000..85d46283bbcf5df99a48aeae7d68be2ea7599956 GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5C@2@; z6XNP#;Im-Cg8b$8|NsAg?AWnCfBw9E`*z*Bb&D1)+P-~z?z603pi0J)AirP+hi5m^ zfSfW<7sn8d^T`PcJW~`Jq?kAgeHfEf8ln}JF1pJbso)~O5hKX7OqjKmmsPd-A(L8@ z0;6O44hJO{2Ohl#9D)Lk+#*gaM;x`4sc)z4*}Q$iB}iDOSp literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/open.png b/comp/src/gb.form.stock/gambas/32/open.png new file mode 100644 index 0000000000000000000000000000000000000000..12ef8e8453806bdfca5c5a6f895846c05a1138ce GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5D99h+ z6XNP#;Im-Cg8b$8|NsAg{`~m`o&|A0DaMi@zhDN3XE)M-oB&T3#}JM4$q5QPQxqDc zm^cc37?V{Tk{N~5O&Hw;Ll}h}9n(b^-5nhTQy3R8bqLL9Q1)bP0l+XkKY0Nby literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/options.png b/comp/src/gb.form.stock/gambas/32/options.png new file mode 100644 index 0000000000000000000000000000000000000000..beafe2c6455c992b091a22db8fa4e67e34ecf559 GIT binary patch literal 275 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5C}dRx&v5Z^%k9<^16h^t>EaloaXvXgL5gE*g@)4Sn{WUB{~yz!qVPwa zgJ&Yk7e}V~2hNlye30k4w^!Mp;c$S=wINS%G}U;vjb? zhIQv;UIIBh0X`wFKADC2%kTgH|9}7f{a*Rg-9U;;g8YIR9G=}s19E&lT^vIsE+;1( zU|6#-LBOG5W0q*HMB(a&1nmied`U5^o_nLVW|>C#UR@QMeUN9tqO}QZ0T)9%zJ;$| q_$*{?tI?xvPLdD9Ijh+Z9bjM(c^EWHsg(!hW(H4JKbLh*2~7Ykpg~Lk literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/paste.png b/comp/src/gb.form.stock/gambas/32/paste.png new file mode 100644 index 0000000000000000000000000000000000000000..206aaad08fb743d99de060ad68cb3305ceb89dd3 GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~r@&x#V zxVjhk|iIaiij3q&S!3+-1ZlnP@I-V|$ArhC96ArNb`|qCG!uIF? yd8w{b2?-9#4UD1^fvdxGT~jakiL)`wGBB9#wm#~k)UOBB$KdJe=d#Wzp$Py$W-U?x literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/pause.png b/comp/src/gb.form.stock/gambas/32/pause.png new file mode 100644 index 0000000000000000000000000000000000000000..aec0206ccb3d3ccae5fa9ad40542fa344e1823ce GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?smO1^9%x`eYWy$H!ZHAI$?vmjw9*GdMiEkp|?5c)B=-a9mGLIKcGd|BZSH d4km5}hPfw93-6s3)Bwsec)I$ztaD0e0swwgByIoz literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/pda.png b/comp/src/gb.form.stock/gambas/32/pda.png new file mode 100644 index 0000000000000000000000000000000000000000..fb73a32352babbbeaa978fc0129983d32db1632c GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~r@&x#V zxVjhk?7#ni{`~p>|NrlvZRZaZXDkWw3ubV5b|VeQ(eQL}43W5;oN$08W_3dXBbTxW vhk-=Ap~S-G&c>JBp{wH;8eh1&fSI9XvWxcBwR@U@dKf%i{an^LB{Ts5nszP5 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/pdf.png b/comp/src/gb.form.stock/gambas/32/pdf.png new file mode 100644 index 0000000000000000000000000000000000000000..d9eb7b404ecfd23c05f7072c7b329d4c65ace85b GIT binary patch literal 505 zcmVPx#y--Y4MNDaN;dOQ2adH0o`v3m^{`>p?{r%r>Z~y=Q z{`~y?_xJtw_Ufaf>Y$+Y(9r(*`RuBy<%o#kcX#v1$o%v3^U2BXwYBlUz~_>Z_Se_* z%F6rh?)vKL@xj6CrKRbco9d#Xl^!)Pj?y<4=+1c>E zzU{HG>!YLe&d%R+bMLpe`Q+sAySw3gd;9I}*$%8_~798+S=!nll<}V z?zFV+uC7e>QMdpA00DGTPE!Ct=GbNc007NNL_t(I%f-^i7J@(w1yF%0Zve$!z}|cB z?f*Z^!6iyIdh~5`PiB&nMB)pPM1Bd(nIr5e0SpEPCqn=*-(l-`u&|(3ND+USKxa%% zQPJR9CV)9tfSubAdnkmj1j~4Ehozf{?MTW@((S#163&+s(S={3p z0Uiar1G^mq-2t`=i5&%H4?HXkU8CLYr<<)PaG$O7N%Q>_Mp5Xpla5EaloaXvX=fmVWu zgRnrMOYnn7O{-jv96c)N%eYENa6*IfET$C34NNM!B>@K(G%agr!lvI6;x#X;^) z4C~Ixyackt0(?STeKHH<;^HDAB7o$90|#PbV=8X5`|Ie73OkPQ@s zkPya^BS(N-Ac&8Thma5k(2#_L1R&ek*chl1$c3l}ssXa2qM|^04jcd)3j{z0#2la+ zAb0QHy+Doo_U(hHOiD@uT7Bls8K5$tI8edWt5<;}#6XBeAhTd@05T#YBOz`Es)1+$ zk`Mq?pOcdVQ~-1yL@!Vrs3kEm5h#+DmIkza%a$#3=FG{>&E39zdwP0$YHDhEdHIG7 z8=9J$CQX`DP*4DLQeR)+^y$+lOqj5K{rcYC-s0lo9XocEmX=mlR<2#UHYFux^PMmA zfx#VG666=ma8K&nyPBInYQ+Ds{VV^j@u!93qTIr^pC5mGIJrOS7HdNFif_NO4Gz72 zzH+gihKKCy?84wS1$4HPutt?EnhVx7INq*_^JS- zP}S4LF~s8Z+RLuxha5!O5>+NJ99{bE-MhFIyYDQya`)^1e6GneAKpuwR&)EiW#WuE zJ7QAflxBIpsxlJxT~V#IZe~uD&C*wmB}blgFJa~q=$l!zal_{Pb+a;NeHLu~xGo=N`-V2m($y85}Sb4q9e0CL=!1poj5 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/phone.png b/comp/src/gb.form.stock/gambas/32/phone.png new file mode 100644 index 0000000000000000000000000000000000000000..218fc50a812c8afc239be736433ae7d7386dd9c0 GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~r@&x#V zxVjhkELgB$|NZ|!U{l8Y5h%`B666=m;PC858jz#m>Eak7aXC5R0Lz+%4gw8_B3M}@ tdg3K|LYq4qUv^*ku=)j0iRlXlhB+_2Hoj<|V*%8|;OXk;vd$@?2>|cqFed;2 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/play.png b/comp/src/gb.form.stock/gambas/32/play.png new file mode 100644 index 0000000000000000000000000000000000000000..06ef709013f6fe6ee1bb6b67d5cb369777dcf21d GIT binary patch literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBh0X`wFKAD9HU=SZ4Zx_v*2oz^73GxeOa5ykA+cO);weoav43W6pdrpy$ z!GVL>@!$GicZ0j53PTsn;%qz@qt=%0-~crX=&trAT^E13NrK=xk O3WKMspUXO@geCyMk~9DS literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/plugin.png b/comp/src/gb.form.stock/gambas/32/plugin.png new file mode 100644 index 0000000000000000000000000000000000000000..d073d9c430bc53986122faf1985b35862a2988f4 GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5C}VGQQpI4g+RuYRrOD2rU4oE=hwejRPz5!+HJ5J;du*=0rm2i z1o;IsY|^^=#nJaG8`nn;ZdShO;U<%TQbnFFjv*T7lM@v9G^TMc{4n#{|Nl!HbPoLZ z|G%Cwg|Tcw19Kc>i0*&EhIvdI!`~({J!%z@&vjc7$s(5E%2C6@U7*0SFG2jkg{HI& z7wtPyg6^y_dZx2y_9%V$$;dq4cGCfKg{l2IAA~*T9@lPI)hYn=_x-oVhKmmD1lrEv M>FVdQ&MBb@0Fgmyr2qf` literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/preview.png b/comp/src/gb.form.stock/gambas/32/preview.png new file mode 100644 index 0000000000000000000000000000000000000000..04a34f9aa59b513f0f400ecbc0bf9eadf59fede9 GIT binary patch literal 389 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP%t*Y zC&bmgz$YOgAu%yAG&B^*0D}1Vcpw)jpOlmY5do457A*Mx|38rNY0rC{|?^LnxWGSl-TO&;uvCadhO)bVoeGHEoY@8E;3|kg}whjBj}Z4tn=w-`uA_% zJT1UdKSAM_+zy{F(gtGj%w`cLi%g%%q{}y~KA<2L$o;#{eQDO(?5U4M&NeQ$=DIn3 z605}4jDV9DeZo#~C@hHC&SkhUBhY$*i&KO27G@K^BT1qkBG;H%_RQRE__@_^c{i6O zYuswRt$J@)y|vu&KH{OYq4oE}GgQu56dx&iQgvv$r?*USeukyD`SPmw=Wng#^K?+E UiQU5}0rUWar>mdKI;Vst0L-SIkN^Mx literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/previous.png b/comp/src/gb.form.stock/gambas/32/previous.png new file mode 100644 index 0000000000000000000000000000000000000000..2c32bc81a340a872571c0c8690d1a6bccb118e83 GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wFKADB_VBkIHK{8N~sU*lRn4w{|wx0x$7vSmQ7$R{w_rgI=21Op1 zK;}tO(?WJc+)SEUJ@cpK3UPUtvqucyWlQyc%`g9H2nYo literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/printer.png b/comp/src/gb.form.stock/gambas/32/printer.png new file mode 100644 index 0000000000000000000000000000000000000000..bb5ea5d649a4b8a176ec04ce8f48b8b57bfbfc85 GIT binary patch literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5D5xIb z6XNP#;M361P+wmUCl@SO@c;jRAosw51NHyw=gphf)zy^~vimtu3tLH$UogWat*>7` z9`bhC4iw4vba4#PIG>!Lz;>pEc@ERl0EcZ1lMC2oB(xYkvfvYmm|>cO4R)t9V3a5FHLF^V+!9$3Wu@C)CBtwJZ5dJ~qP*J)?r4`6swq9)kV qu$bv0Bg^Hc=!ON7EXjQK3=Dr}E!8?ZV`DAQY6eeNKbLh*2~7Yn8(E(K literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/program.png b/comp/src/gb.form.stock/gambas/32/program.png new file mode 100644 index 0000000000000000000000000000000000000000..8cdfa67d17558974753d21adfd964496c83523cf GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5C@2)* z6XNP#;Im-Cg8%>j$H&L__4U1b_wM^!t!+SA#*!evU#x8Fx(R` VIBoo@^DxjL22WQ%mvv4FO#lmuG!g&+ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/properties.png b/comp/src/gb.form.stock/gambas/32/properties.png new file mode 100644 index 0000000000000000000000000000000000000000..3a02acce565006cbf809836b2ecc5ce622e7aca9 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIBh0X`wFKADC8|NlR5;6QwQ`~&vw)gVPBL4Lsu4$p3+0XeFkE{-7*my;6? zFvP4rkiaOUY@#K?(UJb=fB!j&oLve$JoA$n7%tz7I?4R^bP-SkgQu&X%Q~loCIGT& BFX#XO literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/question.png b/comp/src/gb.form.stock/gambas/32/question.png new file mode 100644 index 0000000000000000000000000000000000000000..dcd7ef434bafeffe99b9622e6432f634d638fbbf GIT binary patch literal 686 zcmV;f0#W^mP)O1_WSm8$8%x8VVTyM?)dKg{{8Fs>u|*zee#*qyxO zyvyp#l+={^{rcYW-uwOg@A&V>=*Q;u=G5-g`ThBe(TnZ)?a%DbzvaK`_UhK|)|1qe zgm$1Z0000KbW%=J0Q`#EWAg&cDFjPOKEglh>BIZnkpue30003&Nklj!}D>3SGPN<+wx|K9?~L88#IDhAeHh75f? zM|x5ft3ER3ZvSYLeYS8%<^5xSohN|dfYO~NKyw4TML!&r_o67ej~A;fMGN<=L_lN* z+A9EuA+AXx@Fl);&JyhLz)l3N$PeBazrD*NFA*pLAAT|ZWGxMY8A0sDYm3SPvBWRH z`#2B1nL~~MUWCvtwi$j-r+q;{M5D@pM(I_t4Uy+orF11bOtLc~D|^74QRAR_<&|8JS| z`vcH4k&+<4Uu+f1MToMB0}_ws)A((dq~-**gzer*TJ@A7nU46!)9cJfWWRs|lH ztxB`Gn!f(8|N88aTkEkI7XHU9qa@mv{R}vC$i~z1Y=Z02YiS3A=Uyz|AL_9r>Q%q( zy(|1jrXT-ZYCG@AjKBYX{bSl-zx+i`9oqt{u&fPy3vPbjU*NF)Y2rlY3+fCN3_=E< z9Xt*kVb)`u#Gb?%aI}bJsNS%G}U;vjb? zhIQv;UIIC~0X`wFKADB_`{V!r|3CHW)W84!zWM&qV&D}iZeK%=Vxqwk6X$}<}HLKHaE7I29c zFmZBlX=$!}AjA>W#1yLHe9(dYWR$@Lmm&#?CrXyGJUoS!e3ySqFsf)+s~`FL#P!r7 dM%M-b1_pjNLoplEzaY0Uc)I$ztaD0e0sw*pVpRYD literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/record.png b/comp/src/gb.form.stock/gambas/32/record.png new file mode 100644 index 0000000000000000000000000000000000000000..c181f18494714c16094066adef121251c054b031 GIT binary patch literal 321 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaMA1AIbUeKHI0=jTJvgPa^FqoCkE5JAMj?0fn7_p-C^<>dhdAArTXC+gn@ z8X{B@**846(s{ rUe`Y{E4SS;|3N7fKn9RZOiTnSfv|xj1jNO~0T~cA5H^HcUtbT=lAD_g6iH1@ zO-f4oUtbSo*QKQ;B_!Ocs7Ognd|h4Lkd~I6l(eU)=umO-)`Eh6_4R-2>wnbM-L9xe zOH8a!OG`*h{8?95o|5vbu5Ni=-h$lRH`UdBnVG$rnQv-pmgeOx&CUH*Tl>APZdqR5 zvfNyM*_UNNhsu=%`2{oFS$JIYv%_z9#sha17M<`(__E+Zuj*O0zH{ucYH?dzd!GPR z{`Pcn46!)9_VUfLCIb=HfSD=_!V2G&@N=B|oU=Oj|Nr%;R^^`bN~-v{XWm|>J270X z)yrefF>a0GTXDVEVe!KE-421=H3zQC3mm_tT=VApF6B5uc|OB=`Cs)J%UrBkbW8t# z={P$rW3S`x#VoNdwqBRJFNAyzU9<0n`h4w>r}xSP^42HF9@=>HUiE=b&2`0*hd!|! z*x>QP{v?wRgXo;j)7CzWQw*LTlxbs#Ia6WKtlg-|zf4HuVJ~~V&-J&*aOR)40)QMah+mAJ)seeOht3w76i;y=R<#MQ?MsCBFP-KCtPk^kc)z1+j-y e?#2FpmLG9aC2?)4!&_i5FnGH9xvX!lvI6;x#X;^) z4C~IxyaaOm0(?STeKHHN zX=#axi9o^1iudL~lO;=n{DK*-Jld?il&gWK;@dA_cBPz_r_XcQTAv9iKj~pT1XMK3 z)5S5w;`G+ZxA~e4c${|zOFZ7hIQ##9_v=1Px>2ue9&TT?JU3~1WZA?h{s#90$`1rT zaQqQIyjdsj!Y{>HYugu2mMCsue9wMAf8X=z>!O5R&uv=eyy>jttJR%>lkdoPTuo)M z5(^V->^iFZ@9xa^dI`1*Q$$y)!lvI6;x#X;^) z4C~IxyaaM`0(?STeKHH<;^KmWf`B9t#K*_S#>N6kAV>fM2pcE`5l>7^gowb!Au53i zfXX3kpc;r#$ZCKhPHt~Pf%Ynu1o;Isd}Xct_pQDmI!*n;znzLJY3Qcs@1(-(RVgl>f~T@<`4 zImexmf6?pj2i}QBs2ujnoajBb_fJ%QUaQ>FdjWhufnH?rboFyt=akR{ E05w;)YybcN literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/remove.png b/comp/src/gb.form.stock/gambas/32/remove.png new file mode 100644 index 0000000000000000000000000000000000000000..1bd625a45821514e2604dd6e65c9feec746df654 GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?slj7I;J!GcfQS0b$0e+I-SLLAC&&5Lchf!u$F8$`5aB1nDUW@(X5gcy=QV v$Pw{$aSY+Oo}93N>%ss3|Cy~EMHv{jALst+COgTe~DWM4fVp=NB literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/rename.png b/comp/src/gb.form.stock/gambas/32/rename.png new file mode 100644 index 0000000000000000000000000000000000000000..9436f1f60d918d11c1c3a9f90bd7fe00dc2f0e86 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5C@31> z6XNP#;FFM$5EmC04+Q(;|NsBLfB*gk{#%N516W&ndoPGcEY=car#NI!R%HwW$lCnGhSZj zFa|*Z2T>2VumcBrl2~01OlZ8-aFmr#W&^hX1H;dJ>6$Mk{8NB-FnGH9xvX>dLd8tcgT8K|#(&hhxZ_6Lm%|5(*`P7I{?haStzO0S!*A=`ivr23d(ESXau6{1- HoD!MNQArqm53SsFM=3g1u&T0PCfQDlA8OxBC@wq}X8D6%GRI4IF0!DGgAwBT*a f+^&bgJPZt(-fo-TI=CqTO=j?P^>bP0l+XkKK-4&D literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/revert.png b/comp/src/gb.form.stock/gambas/32/revert.png new file mode 100644 index 0000000000000000000000000000000000000000..45a8323161855d8142bc3db7e0f5981baeec1fbb GIT binary patch literal 246 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5D5x9Y z6XNP#;Im-Cg8b$8|NsAg{`~nxix&O)^Jl|`4Og#T-Mo48&!0c9UAy-D`SZ`8KY#i1 z#X8B`3aF8>B*-tA!Qt7BG$1F*)5S4F<9u?00?!nM1}P?vLLbItm4@I0EU^a!eGj+@ z_#Oxp;842#fXS>WL7`4Ev~@v(uX(NS%G}U;vjb? zhIQv;UIICs0X`wFKADB_VBkIHK{8N~sU*lRn4w{|wx0x$7v$;U7$R}GxBnpT0RtYU z$^LC0I^^CiTl3KIN_h9X#uTB)TmNOwzG%4EXt9~GyGBz0%R&w(K{j^_GuG707xE_u r9;%$j|GrDdw^w9$Xt3S$nwN~N(Q2vJD$;9!rZafD`njxgN@xNAs|G;h literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/right.png b/comp/src/gb.form.stock/gambas/32/right.png new file mode 100644 index 0000000000000000000000000000000000000000..728ba96e75d3b8b5528523f5b3f70a61f035dae8 GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs1s;*b3=DinK$vl=HlH+5kUzjD#MLLWFeWA@At50yE-pSkKG0+PLy%!5 zL4Lsu^$q`ecknF-^1VG>978nDAHC=;$e_T%5E#NF(a06%@GJe(qx@|QGWXvs=uNS%G}U;vjb? zhIQv;UIICs0X`wFKADB_VBkIHK{8N~sU*lRn4w{|wx0x$=j7?)7$R{wIYB|t!Xfh* zn?^J5u?bCvn-=gK3k_hqt)&pb7}RvI!Mjn!cx^*gyTOtK9y5t%!D9?o%%>6*COfJy ZFa({JO_fNS%G}U;vjb? zhIQv;UIICs0X`wFKADB_VBkIHK{8N~sU*lRn4w{|wx0x$=j7?)7$R{wIYB|x;E;q5 zpTRK}iDb^6jY7vFSc8^q<>F8~AmMEwk+70&#v`^BWdcAsL&jqT4Mqy*7>p!5(kC!5 Ygf>W@4GClZ1T>Ao)78&qol`;+0NolfPXGV_ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/rotate.png b/comp/src/gb.form.stock/gambas/32/rotate.png new file mode 100644 index 0000000000000000000000000000000000000000..14c72093b48ddb193d3eb97bf6dde512adbcca2e GIT binary patch literal 358 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP|z>H zC&bmgz$ZRFJ^>7plaqlooC{$<$i&1%h#DX_G&B^h3}_6Hotv8rQFgi_EEp&xSrX(I z%+R;yyUw4m29C#5qaPYYJy^~B!*~i~J$qqf=`AgwqM4p9jv*GO&rb3bV^ZXCS;)%s z&F1E{zxrA)n!b5X>gCR!Sra!&tLNv=by5ty4Q>v~3j_r?vSy!aR(Eo_Xl{6)LGZ#a z#p(Ln)R*~J)|LF3nOpasW$~<#?USy?GF54=dBg8nDE?q+ti-_;Iwv*e@3dgla8ups zu6t_xRqcye;&-%rGXvbV(PRKeHEOSoQ;n&>Y zw!Kx1ZeL^k0#=(lD3~e)tn_DC*l2jl?t`g8(<|mhjO&>H=@)D(h`aRD=lOzLf!DVM z-oM_vP-}jJjEvj076zVNhSPPeKg56}|~p00i_>zopr09DPx# literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/save-as.png b/comp/src/gb.form.stock/gambas/32/save-as.png new file mode 100644 index 0000000000000000000000000000000000000000..ae097b9398e2610e6b8be92360798e942995e787 GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~r@&x#V zxVjhk#P5&)|NsB``|IW6B$|QZj3q&S!3+-1ZlnP@L7py-ArhC96Amz}S(qTua3o@@ zmPyG~EiHp}ZEbDMlF`o2j}P>0UAQnb;n=GS7s3UOh96$IYuhnL$?Vk&dakZtz$4(0 n*bvio>Oe^I!2=&O*%%o9ilxrJV5j>YXgY(ZtDnm{r-UW|$TLK0 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/save.png b/comp/src/gb.form.stock/gambas/32/save.png new file mode 100644 index 0000000000000000000000000000000000000000..81cf953535e4a50d3e97ff34aa377e3b6860e41e GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~r@&x#V zxVjhk#P5&)|NsB``|IW6B$|QZj3q&S!3+-1ZlnP@UY;(FArhC96Amz}S(qTua3o@@ zmPyG~EiHp}ZEbDMlF`o2j}P>0UAQnb;n=GS7s3UOh96$IYuhnL$?Vk&dakZtz$36= fPUFL19tMUhz8TKTUS)OwO=a+O^>bP0l+XkKlTJWq literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/scanner.png b/comp/src/gb.form.stock/gambas/32/scanner.png new file mode 100644 index 0000000000000000000000000000000000000000..d465887be4b935f71e6ed842287288b16a1b5cc5 GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP|!ZW zC&bmgz$YOgp{S?`NG2vG0!biPuwcRb`STYpTnJH;uIk~vF zI3*=z)uhTjK%;m|g8YIRKK}cuwdw2csPM=yKfDe1PXJ0}c)B=-Se$;_@5$Goz{8+@ z>QRu$hyVFgGi)bZC{nmL=e5r+hMJ~g-u$;p)h^bjR|Nns#oU*->e0o0a z^R-x*nr6_G&ua7h>3WBKE=>AQ_c!Hqviy<#@%(^sc|ukCfwGJJ+7i_}w(;4B=T5i3 zytTkq^oQE5KOWr&!WkUzb6)tWz~y1^JSeS&Ye&P~B?c~B3p7#!8tS<2$xU1^&2eq) zq=XemKEGO5`|Q$+poXCQE4N-v+P_$9dszI%l*r}?p6nHofg7qG9NuJLdY0w2MEQpI zl^c3*dtO&6J#uJ*!6Fkb&UlH#8z0>$+V?5ko?(N%7OSgSyei0lp00i_>zopr0Dh3T A?EnA( literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/screen.png b/comp/src/gb.form.stock/gambas/32/screen.png new file mode 100644 index 0000000000000000000000000000000000000000..83d8ab876ba26434e4b5ae9ca9d3dff14d2c8501 GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5C@2)* z6XNP#;FACb2M!#FkB|TV|Nm39G)bT=Q%R6tFhj#^Z9fSh&&JcmF+}5ha)JU+OaMa| zW3q~ahr*Nv4Id|n2RJcBuuchJFk^hgpzN`gVN!#Dhl8Lm<0c`+js~T|XFzA%be!vu SDd+?=hr!d;&t;ucLK6VhGBB+G literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/script.png b/comp/src/gb.form.stock/gambas/32/script.png new file mode 100644 index 0000000000000000000000000000000000000000..313fb2f627d4df5f99f648ff0324fe9e63ce2895 GIT binary patch literal 421 zcmV;W0b2fvP)UteE;e}8s% zcHQ0GwY9ZiU|^h_oOE<_jEs!9xVYQf+r7QL|T-l$4Z~mX_t^<>%+; zlarJ1@bJICzues1tE;PzkB@!lvI6;x#X;^) z4C~IxyaclO0(?STeKHI8?Mv9dKYsuII3RiKSm?onAO-~O+XrL-WfNAd3I&QBH~^K} zvnK^v&7M6VaiBQ|4gl4FOgnfmp`oDxtQ~3;SPE*w|NjhN?I4wV_a=gs#Q_!U-yaRJ z?%=`Ly?cRXCO~BG-_HlCoIl_H?%ljYhY~Ja$N<`M=T7diW68H~=ia)NbM|c7`Sa=L z&ZVC@lXmZ3{_*3<=gy^_KAm>*WXjE(IX7e?^wp}&bgdYcU%9-rHlmf71Z zroFgU%^<7pL*9fRw|~f)*Ih`wFWTvB=c8}H%Xep?=f{_<_DgJ5T7~~8YR;b$od2%x zV(do4QoY)PXHs5%pHsKq-|TV!yH2<3jImp~KNc((y;Ziqcha<@_OrGuzo;lVRsKZe zJjbO*3iTo-PCJdJxmt?Xq+D0ki2YmMcGPL1#H@n9OgFDqG0JZ#_z4Vd22WQ%mvv4F FO#rrBYcT)- literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/select-all.png b/comp/src/gb.form.stock/gambas/32/select-all.png new file mode 100644 index 0000000000000000000000000000000000000000..cee57f330db7b3b5d022d2b61294202df5af2a2e GIT binary patch literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5C@2)* z6XNP#;1d@Y7aJS9V8Md;_;?^YMJ8ATD9cUHXk52z|+MsMB{vNf&!0I zOpJ^~gn~6Y|P9%ELJjUonQ)x)({hL6kpKheUd|A qN&x>sF|i3=Dn2>fD|4V`L|S?rV2wR6ql7VwAysP!v$MktF+J78vKkBD_2^2?5iDfs)DSOW bbYft5a*yxsm(&hTpm_|Qu6{1-oD!MWati5{C}<8#*Xp`k!#JQzR(LEQcE@zdhtcf}_pC)nn$bOUPSDhcunX83+6kn>qy z_piMdryrdJ6m9l&aSYKopPZn;D#59>_`}WcwNarBIti>I5j{E!fMkn~0+8%DlK#?3 zG{G~rbrI_!cL}aX?uXW}?qWZ}U)*5D^JLyi1-m=8`S0dAKQqpldv7oM%<~GR)!*-l z^6^x#7;H(9=t|UWJ8Uqw?`rXkd&hYc&L|w=N$JTr(4o<@;s_%He@o2P@}nM`fX-p? MboFyt=akR{0HA_oaR2}S literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/shortcut.png b/comp/src/gb.form.stock/gambas/32/shortcut.png new file mode 100644 index 0000000000000000000000000000000000000000..3232f350279d41c6f75d0afac6dc0d69a1d46168 GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5D5x0V z6XNP#;FFM$@c;k+^XJc3RaO1``7IJ_@x8z@<%;Y@mMJ`eXD0+@xfq9d3idY?3!LC- zY4DgRw5nl)(5!|PmrO#8Tc!wcawKFNG!Qu)<@j99gz;9pl_CSf^g~L&RyG$40L^Fc MboFyt=akR{0E1UdT>t<8 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/sort-ascent.png b/comp/src/gb.form.stock/gambas/32/sort-ascent.png new file mode 100644 index 0000000000000000000000000000000000000000..60e8b5cf6b9fb285bf3f2c8b313df76d1c6001be GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~q2Ka=y zx)=B)fWaMM_XwaMQ%R6tFhj#^Z9fSh&&t!qF+}2Wa>4-?A8n1aHBnm`dL7kcb5@6~ zWjSrIE@~^wBDL(REF8{RQ<+;1ZWCHHw~+J9c}AWaj0~bH6hA+|oXra~g~8L+&t;uc GLK6VZ6E4&M literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/sort-descent.png b/comp/src/gb.form.stock/gambas/32/sort-descent.png new file mode 100644 index 0000000000000000000000000000000000000000..36dd46b4b25c9b8b5eeede491eeadf40f898ed15 GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~q2Ka=y zx)=B)fWaMM_XwaMQ%R6tFhj#^Z9fSh&(_n$F+}2Wa>4;7rUfRCg*2LTRi`L!J;iwF zM3gDxqLiyz9ZK6mS1;(A5oTbpCTc4~FXQw>hZii@li?|0U{If;_*uI~h7)KIgQu&X J%Q~loCIEsOFM|L8 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/spell-check.png b/comp/src/gb.form.stock/gambas/32/spell-check.png new file mode 100644 index 0000000000000000000000000000000000000000..933f87b192011bad6666d4ea031dcca681b4056a GIT binary patch literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP|!HQ zC&bmgz$YOgAs!5X3KR-s#6l64iNswPK!zi#*_ zzDeuL=fCU48Y66%0;Q@wT^vI!PM@9N&DWs7!^$WaRsZ$h@~KX%91rd=coaP$(&tb^ z(EI)sQymh;41^*cPIh<_pz$$tpL)W=?}x;jO}OixCoOOhOMcB%WVv2x!Q^jU3>*JE z4$&PsWCn#e#?@n2s1JypyVt~$I N@O1TaS?83{1ONk2Z#Vz| literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/star.png b/comp/src/gb.form.stock/gambas/32/star.png new file mode 100644 index 0000000000000000000000000000000000000000..7b699bc4185bffe91bf0ca14ecc1c286d9b78f67 GIT binary patch literal 600 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaNt2Ka=y`eYW~zn_2iZa$EF@Sx!S{ai4&@ZP;bAot!qpkU6OJ0UN)S$H!?Nr+PGVXYHD+m9yPkHrWIuFU*{@ zRpEuE$?;U%gB{k5fdZC?*PU9>;t4eIyr+v}h{fr(laGou8wj{=WNO{D8wk$)uMe77 zYbf;smym;K||%Q3s1L1b9~`-x2zay=}PPB%r0O75{~^R5!u-l`PZ zkiX}Kn$-mDz60+O!SKSxnyqxqAKQ&VDoV`s|%mA2;sqlsf61 zFK_V88sVLus)3C%OS`z9q+fPz6;s?3_|S<%No$SfdMiP{+pPV?cW=Fu2u*x= z^Vr=RljX~FWqMj0IL#|w?!Vf}&MCY_eV3hH?eE$46WpT@>aVT60rVP!r>mdKI;Vst E042dPVgLXD literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/start.png b/comp/src/gb.form.stock/gambas/32/start.png new file mode 100644 index 0000000000000000000000000000000000000000..bcea96392900dbe46e2335c7073f442ea7ebad28 GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wFKADB_VBkIHK{8N~sU*lRn4w{|wx0x$=jQ3+7$R}G_xx%>1_KV} z00W+b9X-=DvprtOE^@U!s6OMb2!pYDlgA>dJ~si+ki!=_lscnMTwPPBJ4e`Rl?0br e;N!aIvFulNI5QW1nsyjyB7>)^pUXO@geCxwGdNZN literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/stop.png b/comp/src/gb.form.stock/gambas/32/stop.png new file mode 100644 index 0000000000000000000000000000000000000000..7998f0864f871c72346415ada3b6a3293458d395 GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;SkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?smO1^9%x`eYW~&(BwWcw-|-x+KUin8D%MjWi%f#M8wwgyVX0!U3iq|Ns9t d5MU8wVDLWXzVm$A?Y%&G22WQ%mvv4FO#t|AC#3)Y literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/sun.png b/comp/src/gb.form.stock/gambas/32/sun.png new file mode 100644 index 0000000000000000000000000000000000000000..52acea89d8a74c70e719a9062b7ddc70851c24bb GIT binary patch literal 339 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaM=0(?STeKHFlJYcwgpW)6OhI{uwjK_}|Zr%hjfavyZCuu4r7xY10vN z=8UD)qAO44yDWN;I+=fpRcQK*CrdSDOddV;je9<~VGffLQy`;cBh$OE-x7@X9;Y*W z?wss8D|eP#WLWg!TgPK(c*}lYbp7GyLo>9?w`_U5-~OC<6yu&`VW;!cSbc#mWbkzL Kb6Mw<&;$T)1&@UQ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/system.png b/comp/src/gb.form.stock/gambas/32/system.png new file mode 100644 index 0000000000000000000000000000000000000000..f6e05cc88687b49bebfa625cf163004c80fb115b GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5D99h+ z6XNP#;FACb|NsAwkB`@JoZ1eQVk!yp3ub7Tt?efPgTe~DWM4f@)9oN literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/table.png b/comp/src/gb.form.stock/gambas/32/table.png new file mode 100644 index 0000000000000000000000000000000000000000..cee24c9c2b7128805b80a0bed90f589487a8fdf6 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~r@&x#V zxVjhkELgB0fBF6Y|Npz+kbVagXDkWw3ubV5b|VeQQS)?h43W5;oN$0)&B6qMh9eQI rY!Q+(x`4`~|Npn2*yFfN7HH9p)zzl)mljI_buf6k`njxgN@xNAl3Fg@ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/tablet.png b/comp/src/gb.form.stock/gambas/32/tablet.png new file mode 100644 index 0000000000000000000000000000000000000000..9f5da0d4bd7d9d2a66f82c5af19120f2a02d0da0 GIT binary patch literal 295 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP|!ZW zC&bmgz^7^BgCz$aT)FiifBAz23l>zYc>n|n2?_D>@kcH_n6%@;jx!GmS3J0V@4@P$ z4@y@(C|UJj!-ft2|Np=L;DO~i_gtV+j3q&S!3+-1ZlnP@jh-%!Ar_~PUcAlKq9D@x z@Jj01z|(x6|DCrgXzopr0CGHjlK=n! literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/tag.png b/comp/src/gb.form.stock/gambas/32/tag.png new file mode 100644 index 0000000000000000000000000000000000000000..6d42cc06a09a5f16d98f619ed615c8d68cf136e7 GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5C@2)* z6XNP#;FFM$5FH&2Bq4xjOVWIxENe-SUob-hU+(v7YVWTC1*$z=978nD_fE7HYEa;D z5#H;d^Fr1?;UTZhL9w0xLuDF2-0UjZQ>ijRG;-aOowp+AIw%P=^&hIXjo7+SifgGliAirRH20h>BEI^*Ar;B5V#N}j;RwgzJZSv6rA2i)E7#JG&*?j!c*)|Pm0E4HipUXO@geCyo CR4JnX literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/text-baseline.png b/comp/src/gb.form.stock/gambas/32/text-baseline.png new file mode 100644 index 0000000000000000000000000000000000000000..ee1cea0e7f07d8feaf600c094b82f05732644458 GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~r@&x#V zxVjhkBqSs(Sg;^IKECt3(*dA3Q%R6tFhj#^Z9fSh&&AWlF+}2Wa>4<&ANB#Q2mk&5 z&uY;8@qaygN5J3s6;eO-1K57EYBXPLWVC+}#mdGl!1IS8PvH*Nj->|a2V~jGwWJsr Y+LtQrwppO)2{ezv)78&qol`;+0NRi?S^xk5 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/text-bold.png b/comp/src/gb.form.stock/gambas/32/text-bold.png new file mode 100644 index 0000000000000000000000000000000000000000..0a9a01e0014a8bf70691165a3a28170da669f6e0 GIT binary patch literal 568 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaNN1^9%x`eYU+B_+j!K~PW-gn>-LW#NJ`F)=`P92g`dBqSy#0!fGnkj%-+ z0m{V2#==E_3Te^Wj{GAV?YpN=ix~<^xF}h>nhi$N(J%|ZtUUm)y+8@^E}&U?TRxWbb5b! zGoAkX(D7@+@!Rj&{002<1=qdS>wER=DT^`Cu*04%jv*GOpH4U`cE~`$^|eFmwjH~7 z?|%BfzU#10ugcv`5A)RW@7YH7DEtvq=9DPht0%Z%?QxFaM-%%6ed0AfRtJ7O5|0QTyP$L3Kr3f`%EFD84OChMvwnQfYTkUB!}i8|(OgFU$?r^U z4qe++_94L3OGBtjM)ky&3xD3}w>s5ddf>*PCp#Jod=-p)LiOjh{C~*nx7pQWmcOSp&^rvCu6{1-oD!M4<&AND+2Y`_2i z7eByr?EimR1*fm|3$vc=caVG|zJSM#olS}Hx|TsiLqY-r!zTvCAFN4xrT`6K@O1Ta JS?83{1OR+FFrxqf literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/text-center.png b/comp/src/gb.form.stock/gambas/32/text-center.png new file mode 100644 index 0000000000000000000000000000000000000000..f1736a9653e472e2d4914027c37e24ce1426027e GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;I14-?iy0XBj({-ZRBb+Kpded- zPl&5~flqvVyq)a>C7=jnNswPKgTu2MX+Vyer;B3<$Mxg{2i8CT|JOGNur&OYmuM6> l0CE_d1Q`DRKg=P*z;MAw@I9YLMl4VVgQu&X%Q~loCIG~)C<*`o literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/text-fill.png b/comp/src/gb.form.stock/gambas/32/text-fill.png new file mode 100644 index 0000000000000000000000000000000000000000..554642e1a710fdf3fe9e9113f20929811676fcea GIT binary patch literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;I14-?iy0XBj({-ZRBb+Kpded- zPl&5~flqvVyq)a>C7=jnNswPKgTu2MX+Vycr;B3<$Mxg{2i8CT|JOGN{9xRBg^?le XulUP{)+&>LDi}On{an^LB{Ts5ZKWe$ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/text-italic.png b/comp/src/gb.form.stock/gambas/32/text-italic.png new file mode 100644 index 0000000000000000000000000000000000000000..30c8d54edf4ac3c906559f693c9f373dcedcbe63 GIT binary patch literal 686 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaOo2l#}z`eYWy$HxZ+1!ZJp$ji&mpFbbSMFVkhaX^vO)KrLgLP7$Nk(ihW zBq368aR?Vq0vQlCP(f^LEJP!a4QD_!0;S-}Vq#)|f zo0J-w*LZPktf{*rl=&;;?J`^Drw&45q8&i<-+H<@hFF|_Iw?H-kb{KFbSXx`4U9@& z!2&uBK_OisjvLSa|F7%wV9tX{vGKJDa+Bu1zh}GB>5uy+zV`3>b(O3vbE@9$V-&v5 z&9CO}cRG4*YrrKgTLl@WS62T-7}S^*DwYWzJMjCo+4{nD&zu*Te>{~OchWsr;frdW zMvO*l`XqnFvI?zLKavH07~Bt)_)sn4G~0TA?U|nLC3D|DELSpnXEmW^itmYnTlb@u zoK7v7d;fQ1Q}s?W`NtW5^;XM7{r8-us`fd$@7jJoQ4Eq0^lOy)Q4CY{@V3#C7=jnNswPKgTu2MX+VyWr;B3<$Mxg{2i8CT|JOGN{9ycFFX8BM hw_XECuxm7OF~s@`=pHe0bp)zr@O1TaS?83{1OOP|CBgsz literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/text-lower.png b/comp/src/gb.form.stock/gambas/32/text-lower.png new file mode 100644 index 0000000000000000000000000000000000000000..1cca4ab9942b293b400aab772aa3dc7c23bff7ef GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP|z&E zC&bmgz$XC-Bqk;Tc_}F=5Jo%_h>eYni;Dxw0>u*jj`9Fa5GV=q3uf5=%S8B^?m= zC-tbzk^Rj7X0DFirTwmGj+u3c?#rayx>v7eu6rZh`^8r;Vgird?RQsy0o}mh>FVdQ I&MBb@0OmVuFaQ7m literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/text-middle.png b/comp/src/gb.form.stock/gambas/32/text-middle.png new file mode 100644 index 0000000000000000000000000000000000000000..dc64c9fdfebad185a1c6a2eb3efb6bc695746590 GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~r@&x#V zxVjhkBqSs(Sg;^IKECt3(*dA3Q%R6tFhj#^Z9fSh&&|`tF+}2Wa>4<&ANB$%8~*>V zXFQYe=l^|1rI7#PtK9x^PdQk}cq*YJ;Q;@Ru*QQ-EX?)|(j42F@-)v#7PKFn>(#UW b0s}+s8KvFbZdd;RO=R$N^>bP0l+XkKpCCH# literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/text-right.png b/comp/src/gb.form.stock/gambas/32/text-right.png new file mode 100644 index 0000000000000000000000000000000000000000..dbf47c414a0c3b5638f0cd843ae44eb3c8d51cb6 GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;I14-?iy0XBj({-ZRBb+Kpded- zPl&5~flqvVyq)a>C7=jnNswPKgTu2MX+VyWr;B3<$Mxg{2i8CT|JOGNv@k?)CYB~F j?l9<=U(zD)EX$C!LU?1~o*UbMsu?_8{an^LB{Ts56SF4Y literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/text-strike.png b/comp/src/gb.form.stock/gambas/32/text-strike.png new file mode 100644 index 0000000000000000000000000000000000000000..2a5ad35f09303f79ee3ac6d03cdf830213e63ff1 GIT binary patch literal 621 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAQ1D@Z zPl&5~fzJUj*uQ`O|NsAiSxIp%qGiQM8Lx&Cl*>FJ!7h(la9LNA#1eb+~0J%W0YSk*B6kH{; zA#g#UGKdx+2?RhcP-^GSoj`VceEj8#pKpPl^(+bU3uajNn}yLv-y-IQ;MqUo-+iaf z>ORaK6dX<**M=AZ^_Gcx2?aXQgkFHrd?On|?`*Yl< zn&+D*D{yz*;8Fw{de_s%F~s8Z(}~xEm>fl1rf*o|EuxYxz;e7<3%So#q45jVfb;!yg`d`%F)ULl`K+85B|hRR6umz=a7vJ8-z_-qtU)|Jl->lCj)vM+|pC#|%>g&+DJx))}d9v}>DePQP z-Gxm4ZVnGmE!_FYIQJ4m%g)Z1W=_8|7;L&0rIgNI@YUnL=l)^|lUb>qD_VdaW$<+M Kb6Mw<&;$T^w@Z%z literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/text-top.png b/comp/src/gb.form.stock/gambas/32/text-top.png new file mode 100644 index 0000000000000000000000000000000000000000..23678fae412b5e9ceaedaec292aa805836dee439 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~r@&x#V zxVjhkBqSspIB+07K3-Y>>=mFmQ%R6tFhj#^Z9fSh&&1QkF+}2Wa>4i_@FA{+nz=MO#dzcDeuFo2OkXNuyF=Zq1pK>ZA!u6{1- HoD!M}kPYEN7<=~Y0W!92+qQ4tKDhX*RjVM1 z4<0-S6a<|44@XcVjvfy9Z13jAtDf|GiS~K84xy*#55e} zJfQlWJ9h$QuUxqTWFI?r49Jd;k3ZVnTmtUU z-`8h8bH{eYe`ZR4>kHDHO0HQx+WSmw6VK||Y6-8Seinaj511R5e)X^}>!*D|n-yZG zzI^*Ucry1awr-(7*E|)V$)7!4978Nl@16Y8?@)k9%X+7kZ>+hLnlv^kcPK4T>ON() z=l^X3iEY!WJ$;V+ylnjZ_be03l>-0g2>V`M)ZU`N(Ehby!h!~G)9<&YIYsE+(Xp&q zu9fG@EGcze>*2Hw4;kL9I)hx51MM$@G)}Y{UED74zTvErsLg@p@f~uu z(|e|KwAJ+8YuMf4vLg7$CSyCk@JZHplhwt4J7r8)7P~JzCuaYgzfWd9-Z?Y9QvH0^ zwjGUK_f@X^2rG&$(&1lbZQA(iS(m>^l$+!8Q#&))Ghf^0C{cX*<~7ai`wA>2vGa3Y m_n3Y-Zhs_Z(tXb3XPD}**;uXqR#ph~K7*&LpUXO@geCwyI%oX= literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/text-upper.png b/comp/src/gb.form.stock/gambas/32/text-upper.png new file mode 100644 index 0000000000000000000000000000000000000000..8756e7c87fc3846f6906584bf17d0d65c660948a GIT binary patch literal 481 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP_Qe& zC&bmgz$ZRFJ~1&dAt50pB?U+V0gww}1EqjmAPEGqv9VxDkZfpZC`1c{glK_~K$XZ0 zAR8hAAt78K8v;^OQz0TibLQ7r9|yWhyCldjn4#}$sLZb?TH>3&Y~S`zjHCA$TgZ>k z7RRmnWy4Ms7Oz?LxM=nMKl^@vK5IH>&++F#ZO1%a978NlKb@Q@bVz~6?V#S3ySuI~ z&0G7s{rmoTf&qtlY#l#08$9G~Ij-QcI*D1q%=pHRIaAqlR+>F#*zlplG*m6V;n*7f z63c)f+w_JL4J~W?g;$+l&hsNxTKfT?&g@3p4-930Iu^b&e8AxG;0L=K^Zt_}6-?@7 zzP){)OqR-Pq{+p}DEMw&v3Au0_Ddn1r&e)QY24jbdDyg9%_3B>!9;Wl*J7@_S(n=@nJ-AGww|!8Vgve!!PC{xWt~$(699jD ByvP6m literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/text.png b/comp/src/gb.form.stock/gambas/32/text.png new file mode 100644 index 0000000000000000000000000000000000000000..6969dcc560b28536aa0729ed5eadc3db28939b2e GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~r@&x#V zxVjhkELgDM|NsB-@$tcKDL;VXj3q&S!3+-1ZlnP@s-7;6ArhC96Amz}S(qTua3q42 qO~v>cPy_c=LxrwFV}qJ5MutPJW%t(>Hg^IwFnGH9xvX4}Sr1BvJ7FIcePKu1SaRn^?N za|;RzHoplE2AalS666=mF!R>UUo$xC8yfTvPG8`Yv#u=QpySi|B#mv>eE|dwZW7oI1vG}?A zRrYcV@Vst`nVhK@k!40{W)P}#GG8Qozopr007j9a{vGU literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/top.png b/comp/src/gb.form.stock/gambas/32/top.png new file mode 100644 index 0000000000000000000000000000000000000000..c1b80ee5fbc5b5b79421884ad4e6e5994fd74783 GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~q2Ka=y zx)=B)BqYSg$IH%n^aUu$R1)MD%+N4f+fM?>bMka?43W5;oN$1}XLZ8@#+i-0238J| zIl>EgR;mWLUGrKoDRi|$*Nw2XO&XJ;wsI}f$iBL2YJjSNYYg{-TkO*sxfnce%3g8r S;%5Y!#^CAd=d#Wzp$P!QlrlH~ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/transparency.png b/comp/src/gb.form.stock/gambas/32/transparency.png new file mode 100644 index 0000000000000000000000000000000000000000..d650389d9bc4a79d3ed96d6456c796a22751232f GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~q2Ka=y zx)=B?Sg;@=At7jSydhAKu_VYZn8D%MjWi&~z|+MsMB;LCf&!DlTBc?;6*uMxnVA!lvI6;x#X;^) z4C~IxyaaOm0(?STeKHH<PWTp*d7n+p^K z3&bTSCxey5H#9T=8AUGlq=6<&mIV0)Gd$wiTyce~L3`=9UrIT`El=5>=e7zdKVvJu zUbq*iXo{zcV~EA+wUfR18Web37zIT||Ifeoe-TrsVZtrFl4<)KZ%K+ivJaJE?_)mR z`1nBKgCC2-#JZI$ro{5*GH6(zGkkwzLi*a{Klqy0ublNEWkC}c-|LPQp*xl?KXvI| zKtSpBdkQP-mQ8r6&Rl&o`-IP{6W7j&HsAX2x$?@(KkqjM-7PI|GMS>$&t@%A!}$N= ew|D#Ne=*6+3twjH{k8(=J_b)$KbLh*2~7Z&z>gsS literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/unindent.png b/comp/src/gb.form.stock/gambas/32/unindent.png new file mode 100644 index 0000000000000000000000000000000000000000..343f430fddb6fe0cb5d18a3eaecf040d39923c55 GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~r@&x#V zxVjhkBqSs(Sg;^IKECt3(*dA3Q%R6tFhj#^Z9fSh&)(C;F+}2Wa>4?hg0)dwvlxY( z8Poz9mP*v*`)sPc``WpW))UzB3Kp3$@%b+NC+RGi7Mrkt}ErWMkN#q}Unq S#qBH5Cs1BoIA*TnH4rbEgEzxO1oI_U&AtRDFFtkbLkU|L)y1 zh%z9#e}8;r*Q9ko14T=M{DK)oKK%L-di9!6o0zmLUk+32YyS5?yX+g;feMm5T^vI! zPA4ZU&`L;6786ZPOFpW2_MjdY>l>Mfr!!q1HgL}7DhpIO(5HF+yt;1_GcsknP~$5EByv5dm_eqM{&D5D|zP2niPf zGD1T`fux(88;}IbCL|;PNeBRnzzqai2N8r=3K0jAKtYH`pgBM;5J0#<@`|W1t-`wwRscsHFayWl(2%~o1 zho6%7y#IVV%jOsS#KEcK2hfmxo-U3d7N^%ve$IEufTv}5(1Py0-|tn&-TQygLtClK zBS@uczs}F#r1`nN-i{&@4}DNxeA+#~9 zFH`W&dZh&|+xd=%+Dz^D+E}_^Cg)d+$0fogffwRUcU)uLy>)@_?lawY@&!9;G{SzY zm*%*5VVmfww>G{xL&-_NS%G}U;vjb? zhIQv;UIICs1s;*bK&3}Om~pB$pEO7?z$e7jC$lgiAt63K-n4VlZlEAjNswPKL&I!s zKM5eu+SA1`MB;LCf&!m`m4jrC@B*HdssV1-yjDyKU9He{BW!Jx#-ymNT#GcaudbRJ mplaY6!@b}Z`!q)m28Mb+@doA{H=BXRFnGH9xvX7U0GdGjNSm>*9xytnTB@fmWb z*%et#^Y zZk<%*D{{*8=|TsO@87P-aIkXK{19HpwOsz4e~bK6R(U%Wl{}VyKcFKSJYD@<);T3K F0RWG}fW80# literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/user.png b/comp/src/gb.form.stock/gambas/32/user.png new file mode 100644 index 0000000000000000000000000000000000000000..9f2e1f417aadccfc61835ee15434035feed5fce6 GIT binary patch literal 474 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP_Q?^ zC&bmgz{kIQe*W?Y1uGsn)XxX9{mK>qN&oT%0p$w{mOsc}e&4@he*OOa_4WUO42a^; z&{dwflk%6}11ig3237+$B!A^Sp!(cp_w$wl1wm|}$$87~M|EzC>evP{s(gM>&9d0; zU8&Pg1=TLkTYA^OVnI~#(9!CFp9OnIJDhtzt zsAOjLGpoB^O}TCN(%$R$ox_J-y}EDXmY*we)^#NzbY%g_0m6+~DQjxwGL%YJ+B z!L{%8d$wIMi<>w>ZC?G8nukoBv&_d!G6*Eklf&Fr8l>T#xJ@*MPcD&&n7vSkV!8tw~I^OXqAy! xX;RG>Wa(kKZ1JosoTNoIYA9JpBddJ2Ow2Q&h)z4*}Q$iB}ZR=rU literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/video.png b/comp/src/gb.form.stock/gambas/32/video.png new file mode 100644 index 0000000000000000000000000000000000000000..37f5f08f872f3b6104b34971bd7c47f1f46f9064 GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICy0X`wFKAD9x)6Og|c(Ap00i_>zopr0KLXN A!~g&Q literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/view-detail.png b/comp/src/gb.form.stock/gambas/32/view-detail.png new file mode 100644 index 0000000000000000000000000000000000000000..5dedaf070b253e545331dc57b897186ef103d7e5 GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~q2Ka=y zx)=Dw$Hy;Nuprrdn;lS)u_VYZn8D%MjWi%f#?!?yMB;LCf&%}BHnsC7=jnNswPKgTu2MX+Vycr;B3<$Mxid1KczI-;h^mTd*z8f`Q?6 XxcozhrQ4nYRWNwE`njxgN@xNAT=^pQ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/view-normal.png b/comp/src/gb.form.stock/gambas/32/view-normal.png new file mode 100644 index 0000000000000000000000000000000000000000..890d72252e32545ce5854f7f0d123847fa48875f GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv&H|6fVg?4jBOuH;Rhv&5D99h+ z6XNP#;B!Ae|NZvu|NsAwkB^@`qmUCQ#aI&L7tG-B>_!@p6YuHb7@~1LIYEIZCV(M~ zF8d)@ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/view-split-h.png b/comp/src/gb.form.stock/gambas/32/view-split-h.png new file mode 100644 index 0000000000000000000000000000000000000000..4c66818fb23afc4dc7507677b9cfb9188485a6ea GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wFKADC8|NoDVkIz3-E(cOk666=m;PC858jvIJ>Eak7aXC5R07J~` q0||^m$|fc`Ss5=rBq#h30b0{GKca9-KoTQRDTAl0pUXO@geCxw9VwCk literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/view-split-v.png b/comp/src/gb.form.stock/gambas/32/view-split-v.png new file mode 100644 index 0000000000000000000000000000000000000000..fbd06b262033543f67747fbbc2b0f46f080fc814 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs0X`wFKADC8|NoDVkIz3-E(cOk666=m;PC858jvIH>Eak7aXC5R07J~` n0||^m$|5`&rzB*iB{48W9tjJr44RngTe~DWM4f!wDxG literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/view-tree.png b/comp/src/gb.form.stock/gambas/32/view-tree.png new file mode 100644 index 0000000000000000000000000000000000000000..b7cf31ddcfd1ed4dab2326822440c59890b9586e GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~q2Ka=y zx)=B?Sg;^IK7O*!uem@$#*!evU!lvI6;x#X;^) z4C~IxyaaOE1AIbUeKHH<VxHKRBbwz4Wu4*YB6ChorkqZ#>qS@QY)r{z134KR>?PcYF63Pc*y-)VIsi z#WBR<^xDbKg_;ZmTAD>BDji*SWB0q?_VYDg^-P!@-2Nwm>G#=|-ETNAetV_0vtkSX zQVyBvpG+SxdwTtldf{UD>C(HyIlm?Q%vbkczb#ss_4$6oi3vNz;+Yfu=L#L(_+#0b zxk^eb%jADVygJRaaMe+FM~17C(LXH`ycm)?d#~6Y6EQd(^NPipDEak-aXL9+fmTB5v(yxk^t7WZ9entBS_)2nHaxk} zlXKHaL(T^Q2lUmI&KywCR6O46%-B9hL!6meykExJk5xyZYjO;$kw!uYqaSNC%LymO tm0U|6I)sT$NlQ%?RQeL+uv1@yg~8yqBA?+8kzk;e44$rjF6*2UngA!oiAVqd literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/warning.png b/comp/src/gb.form.stock/gambas/32/warning.png new file mode 100644 index 0000000000000000000000000000000000000000..2b70ddc6e7fb3e37c759910821eda31b7e764c37 GIT binary patch literal 336 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs1s;*b3=DinK$vl=HlH+5P(8pW#MLLW@ZR$L+e>oqFVDZfJn#O}y!*@Y z?=1sz^ME4%|NsB<{nN`sbGlBgd<-(DB*-tAp@#46bN?^CPkGu8X8;A~db&77!lvI6;x#X;^) z4C~IxyaaOQ1o(uw`eYW?)zvkCL2Yd7(fyTAhtl%07;;-|NsBbn>R0i`TeF%kEb7aQL^g6i;usafBcmz zdT1ulIPH=kzhH*wvOg2gNi%UU+d8HF(s;1L^}SM-P~Nt?&Yu~j7A(H-`%O!8rtZaf|4S-?Mk}&q!=g z_!p%y?edxvpOw6yR`@EP+02jr)!lvI6;x#X;^) z4C~IxyaaN31AIbUeKHI8@85p_3=SSV2&5rg2>TcqoH=s_SwVb!{Qv*|fg=9p^CRn) z{Q2|e)TvV+KYpCG@x-M|mtMSh@$cWi)vH&}nlPjYf{MMcG`Rja;z z`!;dn#O2GEZ{NPXsHi9{Ep6YveJfV1*s)_rVPWC+*T=R39VS>3jJH){0 zG&S_rezm*uho3~~*sYwp^5wLp+0U|!?n(IRCw~@sKdo=k)9JJFub=aHz4lY>Z27}2 z8&zz!wcK(3^1WvElj^0(T+_Ip7Aq^t)E#C%Muf4loz$0>HE(3 zD=c@OwXNaMc)l%C=)xJhh1Y9@Q*F$VV>ajC4uW0SCv7a7Gpu@ zF@L>X4LlA~t1IU;aWSO)6nGx_T9d&cIPB}!sPNRwmdXzz*E79;$vA1AahJxyEi%Ax OWAJqKb6Mw<&;$S-2MwSA literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/wifi.png b/comp/src/gb.form.stock/gambas/32/wifi.png new file mode 100644 index 0000000000000000000000000000000000000000..456111230afcfbabc341a7e0f23d9fbcd641ae0b GIT binary patch literal 605 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAQ1DoQ zPl&5~fzQmDGw08rzi82-O`A3?Sg;@=At63KJ}xe9@#4imRZEvH1q!ZOwF;HYpuIqGplc5qgae(*;7}6e7tFv~@5I%| z@o|zqqx^3ngI^zBZn=Iue3JB$gH1K;$@jj$@Un5eEXVeS@6M~&i^7<%oOo~aPwlVa z?2p@e1(x%#6#lBacNNgAkDe}$Ar`042Bq^i8Hl88af;OH;${^U{m%5g>fe9+rwSSx z2VIiC*ll@Vb=~|@&=vc}G)dFRla_?IrAGYnoTslQa3IBy|KusI1CoioCrosOdHZD= zrWQ>WoOiJ3EnEJM*Q#d>K6Pwh=RDnS${*3R_QBCd6;fBfmgxL?_+i(y?43DQGkwyF zw-!CPaeUd8-TW7|-^zXF-NnG$c6NJI<+MzO681z{$$&NYGxu_^aant)p3#0X_qxEE zy5lC+wcZ`qjyBo5IQE#Byj|rdpj34=&uw|Yt$X*>;{Swl&U^gBrKiz;-ofJ%JGvWx hANjE9$Z56uW?{MGatE3wd|3$!Nl#Zlmvv4FO#sj#AtC?( literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/wizard.png b/comp/src/gb.form.stock/gambas/32/wizard.png new file mode 100644 index 0000000000000000000000000000000000000000..68b8061de67e027c3c63fd5b3865a7f18ed6e7ef GIT binary patch literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP|z&E zC&bmgz~{gLhJyzgfaL!D3`dWG7zqgpadB}F!9#~YvOp=II1t6h#{V~EA+tCLRhH7M}7Xm>YsUHbn&vbU61 zS4B!lvI6;x#X;^) z4C~IxyaaM41o(uw`eYWy$HylnB>_nY$jQlpF+p@(TwF;>2}A_QPE1ThmIZ2zjg5tf zBqSt27!eT>Kn74TkOT_OpFck%BO^667069aPL7F*0ZIYIfqH>tT3Q-hBT#|m{uMw6 zGw7ED`2{n46aM#TGuQ9%UoE-JIV`QpS9UzF){?DI`1z-SbH&v)aZK!D0ZNh=uc~Pa z&C{8`N;G&bQ0re$7sn8b(_1G!4?1ih(BeNa^?1>C=c@OdsrUcC72xzN5qglw_O9L5 z`nP9ziA%lATo=|tnH5VuFO?Nzny=V(;d{C0vB`;kQ~1@B&v;+gm)3cA{1B^DJBM~g zboQA_v0h1gL+699#20H`bg$k1zC`6soDok4vx!3zBiCQ`Y*I4bvm!lvI6;x#X;^) z4C~IxyaaL*0(?STeKHH<w_lG~euw|t!E;SGPKhfgH@0QJh541%=ha$Qg>26# zuL3H);pyTSVsU!wq}P1S3OucXqOO8_?wgh0`>%U^QSgD>l#^w3TYvgRd3m4c553|j z<60OXu3u=`dPBtT>CDxFHrXP{t4>;oy(+SD<~g4tFhkbea?$C2llL2L#71@8IaAzt zva0?B`|gzU&c)NXZi+ERPgrQi!zguKK~SPi;*@E?kv2u9=$EV9&j{2ef7tfH?vnMh zv)=>ntyi10`?S>B)TNzreqX9<_vV#8ijnVG(i6CnKW&Nnyc6Fnc7BVo_xyTk_16sT v-x=lq-0bSU7C7nsF}}{ne?9hud@1{5UlF##_nE(deq``;^>bP0l+XkK3Ouzk literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/gambas/32/zoom-normal.png b/comp/src/gb.form.stock/gambas/32/zoom-normal.png new file mode 100644 index 0000000000000000000000000000000000000000..cf8117c643ccde307bfb2d89a79a31e9b2bbb009 GIT binary patch literal 503 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaOc1AIbUeKHH^e9H2cr<0%Hc}5{3+GHXknb55Y5(WDn?H+P0IaZgzZGz>`9Y z6_*2rPi{Z`YENpckgemzSsSjt4zr&7x_ROhL#?j|OG=ijZ;JC@ckloFm@k*Qe`aw1 w&sh7fdG5>g!gD8>|Bt!lvI6;x#X;^) z4C~IxyaaL*0(?STeKHH<w_lG~euw|t!E;SGPKhfgH@0QJh541%=ha$Qg>26# zuL3H)>gnPbVsU!wq?>%r3IeWzqOO`d@?+oq|DS5O_SB_mCYjG!^UkG|Io0JXSM!>z z(mU(2cg$JCd1B|Mp1;Zxx24PQs+dgptD;>FJ+mcP#f~qYbzyqDPIb&%9a)#mS3wEe zUiJUXXqTzT`4+Uepj+#LgqG85D-V}8uZ4TIO_0)JjGmtx@Or-D&tr-+lp<0#oQ=*1 zI2b5=@@}f{wN0OV%+=d$_r-1hWO1EcSu;80RrAah$Bl2ws$c*4adV9R-a47wT=}=> s?niXQGtHS`{Qt~W_lDOxPx{N)BNBuriEaBM3G^U?r>mdKI;Vst00b_yp8x;= literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.stock/links b/comp/src/gb.form.stock/links new file mode 100644 index 00000000..b33d977b --- /dev/null +++ b/comp/src/gb.form.stock/links @@ -0,0 +1,44 @@ +application-javascript -> js +application-msword -> office +application-pdf -> pdf +application-vnd.debian.binary-package -> package +application-vnd.google-earth.kml+xml -> html +application-vnd.ms-excel -> office-calc +application-vnd.oasis.opendocument.graphics -> office-draw +application-vnd.stardivision.calc -> office-calc +application-vnd.stardivision.writer -> office +application-vnd.sun.xml.calc -> office-calc +application-vnd.sun.xml.writer -> office +application-x-bzip-compressed-tar -> archive +application-x-cd-image -> cdrom +application-x-compressed-tar -> archive +application-x-deb -> package +application-x-desktop -> desktop +application-x-extension-html -> html +application-x-font-ttf -> font +application-x-gambas3 -> gambas +application-x-generic -> file +application-x-generic -> program +application-x-raw-disk-image -> harddisk +application-x-rpm -> package +application-x-sharedlib -> exec +application-x-trash -> trash +application-x-wine-extension-ini -> text +application-x-xz-compressed-tar -> archive +application-xml -> html +application-zip -> archive +audio-x-generic -> audio +image-svg+xml -> vector +image-svg+xml-compressed -> vector +image-x-generic -> image +package-x-generic -> archive +text-calendar -> calendar +text-css -> css +text-csv -> table +text-html -> html +text-plain -> text +text-x-c++src -> cpp +text-x-chdr -> h +text-x-csrc -> c +text-x-generic -> text +video-x-generic -> video diff --git a/comp/src/gb.form.terminal/.component b/comp/src/gb.form.terminal/.component new file mode 100644 index 00000000..223dcceb --- /dev/null +++ b/comp/src/gb.form.terminal/.component @@ -0,0 +1,7 @@ +[Component] +Key=gb.form.terminal +Version=3.15.90 +State=1 +Authors=Benoît Minisini,Fabien Bodard +Needs=Form +Requires=gb.term diff --git a/comp/src/gb.form.terminal/.directory b/comp/src/gb.form.terminal/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/comp/src/gb.form.terminal/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/comp/src/gb.form.terminal/.hidden/Konsole keys README.txt b/comp/src/gb.form.terminal/.hidden/Konsole keys README.txt new file mode 100644 index 00000000..90112d2c --- /dev/null +++ b/comp/src/gb.form.terminal/.hidden/Konsole keys README.txt @@ -0,0 +1,73 @@ +[README.KeyTab] + +The keytabs offered in the Options/Keyboard menu +are taken from configurations files with a *.keytab +pattern either located in $KDEDIR/share/apps/konsole +or ~/.kde/share/apps/konsole. + +Keytabs allow to configure the behavior of konsole +on keyboard events, especially for functions keys. +Please have a look into the README.keyboard file, too. + +The syntax is that each entry has the form : + + "key" Keyname { ("+"|"-") Modename } ":" (String|Operation) + +Keynames are those defined in with the +"Qt::Key_" prefix removed. + +Mode names are: + + - Shift : Shift Key pressed + - Alt : Alt Key pressed + - Control : Control Key pressed + + ( The VT100 emulation has modes that can affect the + sequences emitted by certain keys. These modes are + under control of the client program. + + - Newline : effects Return and Enter key. + - Application : effects Up and Down key. + - Ansi : effects Up and Down key (This is for VT52, really). + + Since sending a state to a program that has set the state + itself is positivly wrong and obsolete design, better forget + about this nasty detail. I may well remove this "feature" + in a future clean up round. ) + + A "+" preceeding a Modename means the Key is pressed. + A "-" preceeding a Modename means the Key is not pressed. + If no mode is given it means don't care. + + Note that the combination of Key and Modes (set/reset) + has to be unique. This means, that + + key A + Shift : "A" + key A : "a" + + will not accept the small letter "a" rule as expected, + one has to add a "- Shift" to the last clause. Use + the stdout/stderr dianostics of konsole when modifying + keytabs to find problems like this. + +Operations are + +- scrollUpLine : scroll up one line in the history log +- scrollUpPage : scroll up one page in the history log +- scrollDownLine : scroll down one line in the history log +- scrollDownPage : scroll down one page in the history log +- scrollUpToTop : scroll up to the begining of the history log +- scrollDownToBottom : scroll down to the end of the history log + + +Strings have the syntax of C strings, +one may use the following escapes: + + - \E - escape + - \\ - backslash + - \" - double quote + - \t - tab + - \r - return + - \n - newline + - \b - backspace + - \xHH - where HH are two hex digits diff --git a/comp/src/gb.form.terminal/.hidden/Konsole keys.txt b/comp/src/gb.form.terminal/.hidden/Konsole keys.txt new file mode 100644 index 00000000..c52ebd6e --- /dev/null +++ b/comp/src/gb.form.terminal/.hidden/Konsole keys.txt @@ -0,0 +1,175 @@ +# [README.default.Keytab] Default Keyboard Table +# +# To customize your keyboard, copy this file to something +# ending with .keytab and change it to meet you needs. +# Please read the README.KeyTab and the README.keyboard +# in this case. +# +# -------------------------------------------------------------- + +keyboard "Default (XFree 4)" + +# -------------------------------------------------------------- +# +# Note that this particular table is a "risc" version made to +# ease customization without bothering with obsolete details. +# See VT100.keytab for the more hairy stuff. +# +# -------------------------------------------------------------- + +# common keys + +key Escape : "\E" + +key Tab -Shift : "\t" +key Tab +Shift+Ansi : "\E[Z" +key Tab +Shift-Ansi : "\t" +key Backtab +Ansi : "\E[Z" +key Backtab -Ansi : "\t" + +key Return-Shift-NewLine : "\r" +key Return-Shift+NewLine : "\r\n" + +key Return+Shift : "\EOM" + +# Backspace and Delete codes are preserving CTRL-H. + +key Backspace : "\x7f" + +# Arrow keys in VT52 mode +# shift up/down are reserved for scrolling. +# shift left/right are reserved for switching between tabs (this is hardcoded). + +key Up -Shift-Ansi : "\EA" +key Down -Shift-Ansi : "\EB" +key Right-Shift-Ansi : "\EC" +key Left -Shift-Ansi : "\ED" + +# Arrow keys in ANSI mode with Application - and Normal Cursor Mode) + +key Up -Shift-AnyMod+Ansi+AppCuKeys : "\EOA" +key Down -Shift-AnyMod+Ansi+AppCuKeys : "\EOB" +key Right -Shift-AnyMod+Ansi+AppCuKeys : "\EOC" +key Left -Shift-AnyMod+Ansi+AppCuKeys : "\EOD" + +key Up -Shift-AnyMod+Ansi-AppCuKeys : "\E[A" +key Down -Shift-AnyMod+Ansi-AppCuKeys : "\E[B" +key Right -Shift-AnyMod+Ansi-AppCuKeys : "\E[C" +key Left -Shift-AnyMod+Ansi-AppCuKeys : "\E[D" + +key Up -Shift+AnyMod+Ansi : "\E[1;*A" +key Down -Shift+AnyMod+Ansi : "\E[1;*B" +key Right -Shift+AnyMod+Ansi : "\E[1;*C" +key Left -Shift+AnyMod+Ansi : "\E[1;*D" + +key Up +Shift+AppScreen : "\E[1;*A" +key Down +Shift+AppScreen : "\E[1;*B" +key Left +Shift+AppScreen : "\E[1;*D" +key Right +Shift+AppScreen : "\E[1;*C" + +# Keypad keys with NumLock ON +# (see "Numeric Keypad" section at http://www.nw.com/nw/WWW/products/wizcon/vt100.html ) +# +# Not enabled for now because it breaks the keypad in Vim. +# +#key 0 +KeyPad+AppKeyPad : "\EOp" +#key 1 +KeyPad+AppKeyPad : "\EOq" +#key 2 +KeyPad+AppKeyPad : "\EOr" +#key 3 +KeyPad+AppKeyPad : "\EOs" +#key 4 +KeyPad+AppKeyPad : "\EOt" +#key 5 +KeyPad+AppKeyPad : "\EOu" +#key 6 +KeyPad+AppKeyPad : "\EOv" +#key 7 +KeyPad+AppKeyPad : "\EOw" +#key 8 +KeyPad+AppKeyPad : "\EOx" +#key 9 +KeyPad+AppKeyPad : "\EOy" +#key + +KeyPad+AppKeyPad : "\EOl" +#key - +KeyPad+AppKeyPad : "\EOm" +#key . +KeyPad+AppKeyPad : "\EOn" +#key * +KeyPad+AppKeyPad : "\EOM" +#key Enter +KeyPad+AppKeyPad : "\r" + +# Keypad keys with NumLock Off +key Up -Shift+Ansi+AppCuKeys+KeyPad : "\EOA" +key Down -Shift+Ansi+AppCuKeys+KeyPad : "\EOB" +key Right -Shift+Ansi+AppCuKeys+KeyPad : "\EOC" +key Left -Shift+Ansi+AppCuKeys+KeyPad : "\EOD" + +key Up -Shift+Ansi-AppCuKeys+KeyPad : "\E[A" +key Down -Shift+Ansi-AppCuKeys+KeyPad : "\E[B" +key Right -Shift+Ansi-AppCuKeys+KeyPad : "\E[C" +key Left -Shift+Ansi-AppCuKeys+KeyPad : "\E[D" + +key Home +AppCuKeys+KeyPad : "\EOH" +key End +AppCuKeys+KeyPad : "\EOF" +key Home -AppCuKeys+KeyPad : "\E[H" +key End -AppCuKeys+KeyPad : "\E[F" + +key Insert +KeyPad : "\E[2~" +key Delete +KeyPad : "\E[3~" +key PgUp -Shift+KeyPad : "\E[5~" +key PgDown -Shift+KeyPad : "\E[6~" + +# other grey PC keys + +key Enter+NewLine : "\r\n" +key Enter-NewLine : "\r" + +key Home -AnyMod-AppCuKeys : "\E[H" +key End -AnyMod-AppCuKeys : "\E[F" +key Home -AnyMod+AppCuKeys : "\EOH" +key End -AnyMod+AppCuKeys : "\EOF" +key Home +AnyMod : "\E[1;*H" +key End +AnyMod : "\E[1;*F" + +key Insert -AnyMod : "\E[2~" +key Delete -AnyMod : "\E[3~" +key Insert +AnyMod : "\E[2;*~" +key Delete +AnyMod : "\E[3;*~" + +key PgUp -Shift-AnyMod : "\E[5~" +key PgDown -Shift-AnyMod : "\E[6~" +key PgUp -Shift+AnyMod : "\E[5;*~" +key PgDown -Shift+AnyMod : "\E[6;*~" + +# Function keys +key F1 -AnyMod : "\EOP" +key F2 -AnyMod : "\EOQ" +key F3 -AnyMod : "\EOR" +key F4 -AnyMod : "\EOS" +key F5 -AnyMod : "\E[15~" +key F6 -AnyMod : "\E[17~" +key F7 -AnyMod : "\E[18~" +key F8 -AnyMod : "\E[19~" +key F9 -AnyMod : "\E[20~" +key F10 -AnyMod : "\E[21~" +key F11 -AnyMod : "\E[23~" +key F12 -AnyMod : "\E[24~" + +key F1 +AnyMod : "\EO*P" +key F2 +AnyMod : "\EO*Q" +key F3 +AnyMod : "\EO*R" +key F4 +AnyMod : "\EO*S" +key F5 +AnyMod : "\E[15;*~" +key F6 +AnyMod : "\E[17;*~" +key F7 +AnyMod : "\E[18;*~" +key F8 +AnyMod : "\E[19;*~" +key F9 +AnyMod : "\E[20;*~" +key F10 +AnyMod : "\E[21;*~" +key F11 +AnyMod : "\E[23;*~" +key F12 +AnyMod : "\E[24;*~" + +# Work around dead keys + +key Space +Control : "\x00" + +# Some keys are used by konsole to cause operations. +# The scroll* operations refer to the history buffer. + +key Up +Shift-AppScreen : scrollLineUp +key PgUp +Shift-AppScreen : scrollPageUp +key Home +Shift-AppScreen : scrollUpToTop +key Down +Shift-AppScreen : scrollLineDown +key PgDown +Shift-AppScreen : scrollPageDown +key End +Shift-AppScreen : scrollDownToBottom + + diff --git a/comp/src/gb.form.terminal/.hidden/XTerm control sequences.txt b/comp/src/gb.form.terminal/.hidden/XTerm control sequences.txt new file mode 100644 index 00000000..00887aee --- /dev/null +++ b/comp/src/gb.form.terminal/.hidden/XTerm control sequences.txt @@ -0,0 +1,1849 @@ + +http://invisible-island.net/xterm/ + + + XTerm Control Sequences + + Edward Moy + University of California, Berkeley + + Revised by + + Stephen Gildea + X Consortium (1994) + + Thomas Dickey + XFree86 Project (1996-2006) + invisible-island.net (2006-2016) + updated for XTerm Patch #328 (2016/12/20) + +Definitions +c The literal character c. + +C A single (required) character. + +Ps A single (usually optional) numeric parameter, composed of one of + more digits. + +Pm A multiple numeric parameter composed of any number of single + numeric parameters, separated by ; character(s). Individual val- + ues for the parameters are listed with Ps . + +Pt A text parameter composed of printable characters. + +Control Bytes, Characters, and Sequences +ECMA-48 (aka "ISO 6429") documents C1 (8-bit) and C0 (7-bit) codes. +Those are respectively codes 128 to 159 and 0 to 31. ECMA-48 avoids +referring to these codes as characters, because that term is associated +with graphic characters. Instead, it uses "bytes" and "codes", with +occasional lapses to "characters" where the meaning cannot be mistaken. + +Controls (including the escape code 27) are processed once: + +o This means that a C1 control can be mistaken for badly-formed UTF-8 + when the terminal runs in UTF-8 mode because C1 controls are valid + continuation bytes of a UTF-8 encoded (multibyte) value. + +o It is not possible to use a C1 control obtained from decoding the + UTF-8 text, because that would require reprocessing the data. Conse- + quently there is no ambiguity in the way this document uses the term + "character" to refer to bytes in a control sequence. + +The order of processing is a necessary consequence of the way ECMA-48 is +designed: + +o Each byte sent to the terminal can be unambiguously determined to fall + into one of a few categories (C0, C1 and graphic characters). + +o ECMA-48 is modal; once it starts processing a control sequence, the + terminal continues until the sequence is complete, or some byte is + found which is not allowed in the sequence. + +o Intermediate, parameter and final bytes may use the same codes as + graphic characters, but they are processed as part of a control + sequence and are not actually graphic characters. + +o Eight-bit controls can have intermediate, etc., bytes in the range 160 + to 255. Those can be treated as their counterparts in the range 32 to + 127. + +o Single-byte controls can be handled separately from multi-byte control + sequences because ECMA-48's rules are unambiguous. + + As a special case, ECMA-48 (section 9) mentions that the control func- + tions shift-in and shift-out are allowed to occur within a 7-bit + multibyte control sequence because those cannot alter the meaning of + the control sequence. + +o Some controls (such as OSC ) introduce a string mode, which is ended + on a ST (string terminator). + + Again, the terminal should accept single-byte controls within the + string. However, xterm has a resource setting brokenLinuxOSC to allow + recovery from applications which rely upon malformed palette sequences + used by the Linux console. + +C1 (8-Bit) Control Characters +The xterm program recognizes both 8-bit and 7-bit control characters. +It generates 7-bit controls (by default) or 8-bit if S8C1T is enabled. +The following pairs of 7-bit and 8-bit control characters are equiva- +lent: + +ESC D + Index (IND is 0x84). +ESC E + Next Line (NEL is 0x85). +ESC H + Tab Set (HTS is 0x88). +ESC M + Reverse Index (RI is 0x8d). +ESC N + Single Shift Select of G2 Character Set (SS2 is 0x8e). This + affects next character only. +ESC O + Single Shift Select of G3 Character Set (SS3 is 0x8f). This + affects next character only. +ESC P + Device Control String (DCS is 0x90). +ESC V + Start of Guarded Area (SPA is 0x96). +ESC W + End of Guarded Area (EPA is 0x97). +ESC X + Start of String (SOS is 0x98). +ESC Z + Return Terminal ID (DECID is 0x9a). Obsolete form of CSI c (DA). +ESC [ + Control Sequence Introducer (CSI is 0x9b). +ESC \ + String Terminator (ST is 0x9c). +ESC ] + Operating System Command (OSC is 0x9d). +ESC ^ + Privacy Message (PM is 0x9e). +ESC _ + Application Program Command (APC is 0x9f). + +These control characters are used in the vtXXX emulation. + +VT100 Mode +Most of these control sequences are standard VT102 control sequences, +but there is support for later DEC VT terminals (i.e., VT220, VT320, +VT420, VT510), as well as ISO 6429 and aixterm color controls. The only +VT102 feature not supported is auto-repeat, since the only way X pro- +vides for this will affect all windows. +There are additional control sequences to provide xterm-dependent func- +tions, such as the scrollbar or window size. Where the function is +specified by DEC or ISO 6429, the code assigned to it is given in paren- +theses. +The escape codes to designate and invoke character sets are specified by +ISO 2022 (see that document for a discussion of character sets). +Many of the features are optional; xterm can be configured and built +without support for them. + +Single-character functions +BEL Bell (Ctrl-G). +BS Backspace (Ctrl-H). +CR Carriage Return (Ctrl-M). +ENQ Return Terminal Status (Ctrl-E). Default response is an empty + string, but may be overridden by a resource answerbackString. +FF Form Feed or New Page (NP). (FF is Ctrl-L). FF is treated + the same as LF . +LF Line Feed or New Line (NL). (LF is Ctrl-J). +SI Shift In (Ctrl-O) -> Switch to Standard Character Set. This + invokes the G0 character set (the default). +SO Shift Out (Ctrl-N) -> Switch to Alternate Character Set. This + invokes the G1 character set. +SP Space. +TAB Horizontal Tab (HT) (Ctrl-I). +VT Vertical Tab (Ctrl-K). This is treated the same as LF. + +Controls beginning with ESC +This excludes controls where ESC is part of a 7-bit equivalent to 8-bit +C1 controls, ordered by the final character(s). +ESC SP F 7-bit controls (S7C1T). +ESC SP G 8-bit controls (S8C1T). +ESC SP L Set ANSI conformance level 1 (dpANS X3.134.1). +ESC SP M Set ANSI conformance level 2 (dpANS X3.134.1). +ESC SP N Set ANSI conformance level 3 (dpANS X3.134.1). +ESC # 3 DEC double-height line, top half (DECDHL). +ESC # 4 DEC double-height line, bottom half (DECDHL). +ESC # 5 DEC single-width line (DECSWL). +ESC # 6 DEC double-width line (DECDWL). +ESC # 8 DEC Screen Alignment Test (DECALN). +ESC % @ Select default character set. That is ISO 8859-1 (ISO 2022). +ESC % G Select UTF-8 character set (ISO 2022). +ESC ( C Designate G0 Character Set (ISO 2022, VT100). + Final character C for designating 94-character sets. In this + list, 0 , A and B apply to VT100 and up, the remainder to + VT220 and up. The VT220 character sets, together with the + Portuguese character set are activated by the National + Replacement Character controls. The A is a special case, + since it is also activated by the VT300-control for British + Latin-1 separately from the National Replacement Character + controls. + C = 0 -> DEC Special Character and Line Drawing Set. + C = < -> DEC Supplementary (VT200). + C = % 5 -> DEC Supplementary Graphics (VT300). + C = > -> DEC Technical (VT300). + C = A -> United Kingdom (UK). + C = B -> United States (USASCII). + C = 4 -> Dutch. + C = C or 5 -> Finnish. + C = R or f -> French. + C = Q or 9 -> French Canadian (VT200, VT300). + C = K -> German. + C = Y -> Italian. + C = ` , E or 6 -> Norwegian/Danish. + C = % 6 -> Portuguese (VT300). + C = Z -> Spanish. + C = H or 7 -> Swedish. + C = = -> Swiss. +ESC ) C Designate G1 Character Set (ISO 2022, VT100). + The same character sets apply as for ESC ( C. +ESC * C Designate G2 Character Set (ISO 2022, VT220). + The same character sets apply as for ESC ( C. +ESC + C Designate G3 Character Set (ISO 2022, VT220). + The same character sets apply as for ESC ( C. +ESC - C Designate G1 Character Set (VT300). + The same character sets apply as for ESC ( C. +ESC . C Designate G2 Character Set (VT300). + The same character sets apply as for ESC ( C. +ESC / C Designate G3 Character Set (VT300). + These work for 96-character sets only. + C = A -> ISO Latin-1 Supplemental. +ESC 6 Back Index (DECBI), VT420 and up. +ESC 7 Save Cursor (DECSC). +ESC 8 Restore Cursor (DECRC). +ESC 9 Forward Index (DECFI), VT420 and up. +ESC = Application Keypad (DECKPAM). +ESC > Normal Keypad (DECKPNM). +ESC F Cursor to lower left corner of screen. This is enabled by the + hpLowerleftBugCompat resource. +ESC c Full Reset (RIS). +ESC l Memory Lock (per HP terminals). Locks memory above the cur- + sor. +ESC m Memory Unlock (per HP terminals). +ESC n Invoke the G2 Character Set as GL (LS2). +ESC o Invoke the G3 Character Set as GL (LS3). +ESC | Invoke the G3 Character Set as GR (LS3R). +ESC } Invoke the G2 Character Set as GR (LS2R). +ESC ~ Invoke the G1 Character Set as GR (LS1R). + +Application Program-Command functions +APC Pt ST None. xterm implements no APC functions; Pt is ignored. Pt + need not be printable characters. + +Device-Control functions +DCS Ps; Ps| Pt ST + User-Defined Keys (DECUDK). The first parameter: + Ps = 0 -> Clear all UDK definitions before starting + (default). + Ps = 1 -> Erase Below (default). + The second parameter: + Ps = 0 <- Lock the keys (default). + Ps = 1 <- Do not lock. + The third parameter is a ';'-separated list of strings denot- + ing the key-code separated by a '/' from the hex-encoded key + value. The key codes correspond to the DEC function-key codes + (e.g., F6=17). +DCS $ q Pt ST + Request Status String (DECRQSS). The string following the "q" + is one of the following: + " q -> DECSCA + " p -> DECSCL + r -> DECSTBM + s -> DECSLRM + m -> SGR + SP q -> DECSCUSR + xterm responds with DCS 1 $ r Pt ST for valid requests, + replacing the Pt with the corresponding CSI string, or DCS 0 $ + r Pt ST for invalid requests. +DCS + p Pt ST + Set Termcap/Terminfo Data (xterm, experimental). The string + following the "p" is a name to use for retrieving data from + the terminal database. The data will be used for the "tcap" + keyboard configuration's function- and special-keys, as well + as by the Request Termcap/Terminfo String control. +DCS + q Pt ST + Request Termcap/Terminfo String (xterm, experimental). The + string following the "q" is a list of names encoded in hexa- + decimal (2 digits per character) separated by ; which corre- + spond to termcap or terminfo key names. + Two special features are also recognized, which are not key + names: Co for termcap colors (or colors for terminfo colors), + and TN for termcap name (or name for terminfo name). + xterm responds with DCS 1 + r Pt ST for valid requests, adding + to Pt an = , and the value of the corresponding string that + xterm would send, or DCS 0 + r Pt ST for invalid requests. + The strings are encoded in hexadecimal (2 digits per charac- + ter). + +Functions using CSI , ordered by the final character(s) +CSI Ps @ Insert Ps (Blank) Character(s) (default = 1) (ICH). +CSI Ps A Cursor Up Ps Times (default = 1) (CUU). +CSI Ps B Cursor Down Ps Times (default = 1) (CUD). +CSI Ps C Cursor Forward Ps Times (default = 1) (CUF). +CSI Ps D Cursor Backward Ps Times (default = 1) (CUB). +CSI Ps E Cursor Next Line Ps Times (default = 1) (CNL). +CSI Ps F Cursor Preceding Line Ps Times (default = 1) (CPL). +CSI Ps G Cursor Character Absolute [column] (default = [row,1]) (CHA). +CSI Ps ; Ps H + Cursor Position [row;column] (default = [1,1]) (CUP). +CSI Ps I Cursor Forward Tabulation Ps tab stops (default = 1) (CHT). +CSI Ps J Erase in Display (ED). + Ps = 0 -> Erase Below (default). + Ps = 1 -> Erase Above. + Ps = 2 -> Erase All. + Ps = 3 -> Erase Saved Lines (xterm). +CSI ? Ps J + Erase in Display (DECSED). + Ps = 0 -> Selective Erase Below (default). + Ps = 1 -> Selective Erase Above. + Ps = 2 -> Selective Erase All. +CSI Ps K Erase in Line (EL). + Ps = 0 -> Erase to Right (default). + Ps = 1 -> Erase to Left. + Ps = 2 -> Erase All. +CSI ? Ps K + Erase in Line (DECSEL). + Ps = 0 -> Selective Erase to Right (default). + Ps = 1 -> Selective Erase to Left. + Ps = 2 -> Selective Erase All. +CSI Ps L Insert Ps Line(s) (default = 1) (IL). +CSI Ps M Delete Ps Line(s) (default = 1) (DL). +CSI Ps P Delete Ps Character(s) (default = 1) (DCH). +CSI Ps S Scroll up Ps lines (default = 1) (SU). +CSI ? Pi; Pa; Pv S + If configured to support either Sixel Graphics or ReGIS Graph- + ics, xterm accepts a three-parameter control sequence, where + Pi, Pa and Pv are the item, action and value: + Pi = 1 -> item (color registers). + Pa = 1 -> read the number of color registers. + Pa = 2 -> reset the number of color registers. + Pa = 3 -> set the number of color registers to the value + Pv. + The control sequence returns a response using the same form: + + CSI ? Pi; Ps; Pv S + + where Ps is the status: + Ps = 0 -> success. + Ps = 3 -> failure. +CSI Ps T Scroll down Ps lines (default = 1) (SD). +CSI Ps ; Ps ; Ps ; Ps ; Ps T + Initiate highlight mouse tracking. Parameters are + [func;startx;starty;firstrow;lastrow]. See the section Mouse + Tracking. +CSI > Ps; Ps T + Reset one or more features of the title modes to the default + value. Normally, "reset" disables the feature. It is possi- + ble to disable the ability to reset features by compiling a + different default for the title modes into xterm. + Ps = 0 -> Do not set window/icon labels using hexadecimal. + Ps = 1 -> Do not query window/icon labels using hexadeci- + mal. + Ps = 2 -> Do not set window/icon labels using UTF-8. + Ps = 3 -> Do not query window/icon labels using UTF-8. + (See discussion of "Title Modes"). +CSI Ps X Erase Ps Character(s) (default = 1) (ECH). +CSI Ps Z Cursor Backward Tabulation Ps tab stops (default = 1) (CBT). +CSI Pm ` Character Position Absolute [column] (default = [row,1]) + (HPA). +CSI Pm a Character Position Relative [columns] (default = [row,col+1]) + (HPR). +CSI Ps b Repeat the preceding graphic character Ps times (REP). +CSI Ps c Send Device Attributes (Primary DA). + Ps = 0 or omitted -> request attributes from terminal. The + response depends on the decTerminalID resource setting. + -> CSI ? 1 ; 2 c ("VT100 with Advanced Video Option") + -> CSI ? 1 ; 0 c ("VT101 with No Options") + -> CSI ? 6 c ("VT102") + -> CSI ? 6 2 ; Psc ("VT220") + -> CSI ? 6 3 ; Psc ("VT320") + -> CSI ? 6 4 ; Psc ("VT420") + The VT100-style response parameters do not mean anything by + themselves. VT220 (and higher) parameters do, telling the + host what features the terminal supports: + Ps = 1 -> 132-columns. + Ps = 2 -> Printer. + Ps = 3 -> ReGIS graphics. + Ps = 4 -> Sixel graphics. + Ps = 6 -> Selective erase. + Ps = 8 -> User-defined keys. + Ps = 9 -> National Replacement Character sets. + Ps = 1 5 -> Technical characters. + Ps = 1 8 -> User windows. + Ps = 2 1 -> Horizontal scrolling. + Ps = 2 2 -> ANSI color, e.g., VT525. + Ps = 2 9 -> ANSI text locator (i.e., DEC Locator mode). +CSI > Ps c + Send Device Attributes (Secondary DA). + Ps = 0 or omitted -> request the terminal's identification + code. The response depends on the decTerminalID resource set- + ting. It should apply only to VT220 and up, but xterm extends + this to VT100. + -> CSI > Pp ; Pv ; Pc c + where Pp denotes the terminal type + Pp = 0 -> "VT100". + Pp = 1 -> "VT220". + Pp = 2 -> "VT240". + Pp = 1 8 -> "VT330". + Pp = 1 9 -> "VT340". + Pp = 2 4 -> "VT320". + Pp = 4 1 -> "VT420". + Pp = 6 1 -> "VT510". + Pp = 6 4 -> "VT520". + Pp = 6 5 -> "VT525". + and Pv is the firmware version (for xterm, this was originally + the XFree86 patch number, starting with 95). In a DEC termi- + nal, Pc indicates the ROM cartridge registration number and is + always zero. +CSI Pm d Line Position Absolute [row] (default = [1,column]) (VPA). +CSI Pm e Line Position Relative [rows] (default = [row+1,column]) + (VPR). +CSI Ps ; Ps f + Horizontal and Vertical Position [row;column] (default = + [1,1]) (HVP). +CSI Ps g Tab Clear (TBC). + Ps = 0 -> Clear Current Column (default). + Ps = 3 -> Clear All. +CSI Pm h Set Mode (SM). + Ps = 2 -> Keyboard Action Mode (AM). + Ps = 4 -> Insert Mode (IRM). + Ps = 1 2 -> Send/receive (SRM). + Ps = 2 0 -> Automatic Newline (LNM). +CSI ? Pm h + DEC Private Mode Set (DECSET). + Ps = 1 -> Application Cursor Keys (DECCKM). + Ps = 2 -> Designate USASCII for character sets G0-G3 + (DECANM), and set VT100 mode. + Ps = 3 -> 132 Column Mode (DECCOLM). + Ps = 4 -> Smooth (Slow) Scroll (DECSCLM). + Ps = 5 -> Reverse Video (DECSCNM). + Ps = 6 -> Origin Mode (DECOM). + Ps = 7 -> Wraparound Mode (DECAWM). + Ps = 8 -> Auto-repeat Keys (DECARM). + Ps = 9 -> Send Mouse X & Y on button press. See the sec- + tion Mouse Tracking. This is the X10 xterm mouse protocol. + Ps = 1 0 -> Show toolbar (rxvt). + Ps = 1 2 -> Start Blinking Cursor (att610). + Ps = 1 8 -> Print form feed (DECPFF). + Ps = 1 9 -> Set print extent to full screen (DECPEX). + Ps = 2 5 -> Show Cursor (DECTCEM). + Ps = 3 0 -> Show scrollbar (rxvt). + Ps = 3 5 -> Enable font-shifting functions (rxvt). + Ps = 3 8 -> Enter Tektronix Mode (DECTEK). + Ps = 4 0 -> Allow 80 -> 132 Mode. + Ps = 4 1 -> more(1) fix (see curses resource). + Ps = 4 2 -> Enable National Replacement Character sets + (DECNRCM). + Ps = 4 4 -> Turn On Margin Bell. + Ps = 4 5 -> Reverse-wraparound Mode. + Ps = 4 6 -> Start Logging. This is normally disabled by a + compile-time option. + Ps = 4 7 -> Use Alternate Screen Buffer. (This may be dis- + abled by the titeInhibit resource). + Ps = 6 6 -> Application keypad (DECNKM). + Ps = 6 7 -> Backarrow key sends backspace (DECBKM). + Ps = 6 9 -> Enable left and right margin mode (DECLRMM), + VT420 and up. + Ps = 9 5 -> Do not clear screen when DECCOLM is set/reset + (DECNCSM), VT510 and up. + Ps = 1 0 0 0 -> Send Mouse X & Y on button press and + release. See the section Mouse Tracking. This is the X11 + xterm mouse protocol. + Ps = 1 0 0 1 -> Use Hilite Mouse Tracking. + Ps = 1 0 0 2 -> Use Cell Motion Mouse Tracking. + Ps = 1 0 0 3 -> Use All Motion Mouse Tracking. + Ps = 1 0 0 4 -> Send FocusIn/FocusOut events. + Ps = 1 0 0 5 -> Enable UTF-8 Mouse Mode. + Ps = 1 0 0 6 -> Enable SGR Mouse Mode. + Ps = 1 0 0 7 -> Enable Alternate Scroll Mode. + Ps = 1 0 1 0 -> Scroll to bottom on tty output (rxvt). + Ps = 1 0 1 1 -> Scroll to bottom on key press (rxvt). + Ps = 1 0 1 5 -> Enable urxvt Mouse Mode. + Ps = 1 0 3 4 -> Interpret "meta" key, sets eighth bit. + (enables the eightBitInput resource). + Ps = 1 0 3 5 -> Enable special modifiers for Alt and Num- + Lock keys. (This enables the numLock resource). + Ps = 1 0 3 6 -> Send ESC when Meta modifies a key. (This + enables the metaSendsEscape resource). + Ps = 1 0 3 7 -> Send DEL from the editing-keypad Delete + key. + Ps = 1 0 3 9 -> Send ESC when Alt modifies a key. (This + enables the altSendsEscape resource). + Ps = 1 0 4 0 -> Keep selection even if not highlighted. + (This enables the keepSelection resource). + Ps = 1 0 4 1 -> Use the CLIPBOARD selection. (This enables + the selectToClipboard resource). + Ps = 1 0 4 2 -> Enable Urgency window manager hint when + Control-G is received. (This enables the bellIsUrgent + resource). + Ps = 1 0 4 3 -> Enable raising of the window when Control-G + is received. (enables the popOnBell resource). + Ps = 1 0 4 4 -> Reuse the most recent data copied to CLIP- + BOARD. (This enables the keepClipboard resource). + Ps = 1 0 4 7 -> Use Alternate Screen Buffer. (This may be + disabled by the titeInhibit resource). + Ps = 1 0 4 8 -> Save cursor as in DECSC. (This may be dis- + abled by the titeInhibit resource). + Ps = 1 0 4 9 -> Save cursor as in DECSC and use Alternate + Screen Buffer, clearing it first. (This may be disabled by + the titeInhibit resource). This combines the effects of the 1 + 0 4 7 and 1 0 4 8 modes. Use this with terminfo-based + applications rather than the 4 7 mode. + Ps = 1 0 5 0 -> Set terminfo/termcap function-key mode. + Ps = 1 0 5 1 -> Set Sun function-key mode. + Ps = 1 0 5 2 -> Set HP function-key mode. + Ps = 1 0 5 3 -> Set SCO function-key mode. + Ps = 1 0 6 0 -> Set legacy keyboard emulation (X11R6). + Ps = 1 0 6 1 -> Set VT220 keyboard emulation. + Ps = 2 0 0 4 -> Set bracketed paste mode. +CSI Pm i Media Copy (MC). + Ps = 0 -> Print screen (default). + Ps = 4 -> Turn off printer controller mode. + Ps = 5 -> Turn on printer controller mode. + Ps = 1 0 -> HTML screen dump. + Ps = 1 1 -> SVG screen dump. +CSI ? Pm i + Media Copy (MC, DEC-specific). + Ps = 1 -> Print line containing cursor. + Ps = 4 -> Turn off autoprint mode. + Ps = 5 -> Turn on autoprint mode. + Ps = 1 0 -> Print composed display, ignores DECPEX. + Ps = 1 1 -> Print all pages. +CSI Pm l Reset Mode (RM). + Ps = 2 -> Keyboard Action Mode (AM). + Ps = 4 -> Replace Mode (IRM). + Ps = 1 2 -> Send/receive (SRM). + Ps = 2 0 -> Normal Linefeed (LNM). +CSI ? Pm l + DEC Private Mode Reset (DECRST). + Ps = 1 -> Normal Cursor Keys (DECCKM). + Ps = 2 -> Designate VT52 mode (DECANM). + Ps = 3 -> 80 Column Mode (DECCOLM). + Ps = 4 -> Jump (Fast) Scroll (DECSCLM). + Ps = 5 -> Normal Video (DECSCNM). + Ps = 6 -> Normal Cursor Mode (DECOM). + Ps = 7 -> No Wraparound Mode (DECAWM). + Ps = 8 -> No Auto-repeat Keys (DECARM). + Ps = 9 -> Don't send Mouse X & Y on button press. + Ps = 1 0 -> Hide toolbar (rxvt). + Ps = 1 2 -> Stop Blinking Cursor (att610). + Ps = 1 8 -> Don't print form feed (DECPFF). + Ps = 1 9 -> Limit print to scrolling region (DECPEX). + Ps = 2 5 -> Hide Cursor (DECTCEM). + Ps = 3 0 -> Don't show scrollbar (rxvt). + Ps = 3 5 -> Disable font-shifting functions (rxvt). + Ps = 4 0 -> Disallow 80 -> 132 Mode. + Ps = 4 1 -> No more(1) fix (see curses resource). + Ps = 4 2 -> Disable National Replacement Character sets + (DECNRCM). + Ps = 4 4 -> Turn Off Margin Bell. + Ps = 4 5 -> No Reverse-wraparound Mode. + Ps = 4 6 -> Stop Logging. (This is normally disabled by a + compile-time option). + Ps = 4 7 -> Use Normal Screen Buffer. + Ps = 6 6 -> Numeric keypad (DECNKM). + Ps = 6 7 -> Backarrow key sends delete (DECBKM). + Ps = 6 9 -> Disable left and right margin mode (DECLRMM), + VT420 and up. + Ps = 9 5 -> Clear screen when DECCOLM is set/reset (DEC- + NCSM), VT510 and up. + Ps = 1 0 0 0 -> Don't send Mouse X & Y on button press and + release. See the section Mouse Tracking. + Ps = 1 0 0 1 -> Don't use Hilite Mouse Tracking. + Ps = 1 0 0 2 -> Don't use Cell Motion Mouse Tracking. + Ps = 1 0 0 3 -> Don't use All Motion Mouse Tracking. + Ps = 1 0 0 4 -> Don't send FocusIn/FocusOut events. + Ps = 1 0 0 5 -> Disable UTF-8 Mouse Mode. + Ps = 1 0 0 6 -> Disable SGR Mouse Mode. + Ps = 1 0 0 7 -> Disable Alternate Scroll Mode. + Ps = 1 0 1 0 -> Don't scroll to bottom on tty output + (rxvt). + Ps = 1 0 1 1 -> Don't scroll to bottom on key press (rxvt). + Ps = 1 0 1 5 -> Disable urxvt Mouse Mode. + Ps = 1 0 3 4 -> Don't interpret "meta" key. (This disables + the eightBitInput resource). + Ps = 1 0 3 5 -> Disable special modifiers for Alt and Num- + Lock keys. (This disables the numLock resource). + Ps = 1 0 3 6 -> Don't send ESC when Meta modifies a key. + (This disables the metaSendsEscape resource). + Ps = 1 0 3 7 -> Send VT220 Remove from the editing-keypad + Delete key. + Ps = 1 0 3 9 -> Don't send ESC when Alt modifies a key. + (This disables the altSendsEscape resource). + Ps = 1 0 4 0 -> Do not keep selection when not highlighted. + (This disables the keepSelection resource). + Ps = 1 0 4 1 -> Use the PRIMARY selection. (This disables + the selectToClipboard resource). + Ps = 1 0 4 2 -> Disable Urgency window manager hint when + Control-G is received. (This disables the bellIsUrgent + resource). + Ps = 1 0 4 3 -> Disable raising of the window when Control- + G is received. (This disables the popOnBell resource). + Ps = 1 0 4 7 -> Use Normal Screen Buffer, clearing screen + first if in the Alternate Screen. (This may be disabled by + the titeInhibit resource). + Ps = 1 0 4 8 -> Restore cursor as in DECRC. (This may be + disabled by the titeInhibit resource). + Ps = 1 0 4 9 -> Use Normal Screen Buffer and restore cursor + as in DECRC. (This may be disabled by the titeInhibit + resource). This combines the effects of the 1 0 4 7 and 1 0 + 4 8 modes. Use this with terminfo-based applications rather + than the 4 7 mode. + Ps = 1 0 5 0 -> Reset terminfo/termcap function-key mode. + Ps = 1 0 5 1 -> Reset Sun function-key mode. + Ps = 1 0 5 2 -> Reset HP function-key mode. + Ps = 1 0 5 3 -> Reset SCO function-key mode. + Ps = 1 0 6 0 -> Reset legacy keyboard emulation (X11R6). + Ps = 1 0 6 1 -> Reset keyboard emulation to Sun/PC style. + Ps = 2 0 0 4 -> Reset bracketed paste mode. +CSI Pm m Character Attributes (SGR). + Ps = 0 -> Normal (default). + Ps = 1 -> Bold. + Ps = 2 -> Faint, decreased intensity (ISO 6429). + Ps = 3 -> Italicized (ISO 6429). + Ps = 4 -> Underlined. + Ps = 5 -> Blink (appears as Bold). + Ps = 7 -> Inverse. + Ps = 8 -> Invisible, i.e., hidden (VT300). + Ps = 9 -> Crossed-out characters (ISO 6429). + Ps = 2 1 -> Doubly-underlined (ISO 6429). + Ps = 2 2 -> Normal (neither bold nor faint). + Ps = 2 3 -> Not italicized (ISO 6429). + Ps = 2 4 -> Not underlined. + Ps = 2 5 -> Steady (not blinking). + Ps = 2 7 -> Positive (not inverse). + Ps = 2 8 -> Visible, i.e., not hidden (VT300). + Ps = 2 9 -> Not crossed-out (ISO 6429). + Ps = 3 0 -> Set foreground color to Black. + Ps = 3 1 -> Set foreground color to Red. + Ps = 3 2 -> Set foreground color to Green. + Ps = 3 3 -> Set foreground color to Yellow. + Ps = 3 4 -> Set foreground color to Blue. + Ps = 3 5 -> Set foreground color to Magenta. + Ps = 3 6 -> Set foreground color to Cyan. + Ps = 3 7 -> Set foreground color to White. + Ps = 3 9 -> Set foreground color to default (original). + Ps = 4 0 -> Set background color to Black. + Ps = 4 1 -> Set background color to Red. + Ps = 4 2 -> Set background color to Green. + Ps = 4 3 -> Set background color to Yellow. + Ps = 4 4 -> Set background color to Blue. + Ps = 4 5 -> Set background color to Magenta. + Ps = 4 6 -> Set background color to Cyan. + Ps = 4 7 -> Set background color to White. + Ps = 4 9 -> Set background color to default (original). + + If 16-color support is compiled, the following apply. Assume + that xterm's resources are set so that the ISO color codes are + the first 8 of a set of 16. Then the aixterm colors are the + bright versions of the ISO colors: + Ps = 9 0 -> Set foreground color to Black. + Ps = 9 1 -> Set foreground color to Red. + Ps = 9 2 -> Set foreground color to Green. + Ps = 9 3 -> Set foreground color to Yellow. + Ps = 9 4 -> Set foreground color to Blue. + Ps = 9 5 -> Set foreground color to Magenta. + Ps = 9 6 -> Set foreground color to Cyan. + Ps = 9 7 -> Set foreground color to White. + Ps = 1 0 0 -> Set background color to Black. + Ps = 1 0 1 -> Set background color to Red. + Ps = 1 0 2 -> Set background color to Green. + Ps = 1 0 3 -> Set background color to Yellow. + Ps = 1 0 4 -> Set background color to Blue. + Ps = 1 0 5 -> Set background color to Magenta. + Ps = 1 0 6 -> Set background color to Cyan. + Ps = 1 0 7 -> Set background color to White. + + If xterm is compiled with the 16-color support disabled, it + supports the following, from rxvt: + Ps = 1 0 0 -> Set foreground and background color to + default. + + Xterm maintains a color palette whose entries are identified + by an index beginning with zero. If 88- or 256-color support + is compiled, the following apply: + o All parameters are decimal integers. + o RGB values range from zero (0) to 255. + o ISO-8613-3 can be interpreted in more than one way; xterm + allows the semicolons in this control to be replaced by + colons (but after the first colon, colons must be used). + + These ISO-8613-3 controls are supported: + Pm = 3 8 ; 2 ; Pr; Pg; Pb -> Set foreground color to the + closest match in xterm's palette for the given RGB Pr/Pg/Pb. + Pm = 3 8 ; 5 ; Ps -> Set foreground color to Ps. + Pm = 4 8 ; 2 ; Pr; Pg; Pb -> Set background color to the + closest match in xterm's palette for the given RGB Pr/Pg/Pb. + Pm = 4 8 ; 5 ; Ps -> Set background color to Ps. + +CSI > Ps; Ps m + Set or reset resource-values used by xterm to decide whether + to construct escape sequences holding information about the + modifiers pressed with a given key. The first parameter iden- + tifies the resource to set/reset. The second parameter is the + value to assign to the resource. If the second parameter is + omitted, the resource is reset to its initial value. + Ps = 0 -> modifyKeyboard. + Ps = 1 -> modifyCursorKeys. + Ps = 2 -> modifyFunctionKeys. + Ps = 4 -> modifyOtherKeys. + If no parameters are given, all resources are reset to their + initial values. +CSI Ps n Device Status Report (DSR). + Ps = 5 -> Status Report. + Result ("OK") is CSI 0 n + Ps = 6 -> Report Cursor Position (CPR) [row;column]. + Result is CSI r ; c R + + Note: it is possible for this sequence to be sent by a func- + tion key. For example, with the default keyboard configura- + tion the shifted F1 key may send (with shift-, control-, alt- + modifiers) + CSI 1 ; 2 R , or + CSI 1 ; 5 R , or + CSI 1 ; 6 R , etc. + The second parameter encodes the modifiers; values range from + 2 to 16. See the section PC-Style Function Keys for the + codes. The modifyFunctionKeys and modifyKeyboard resources + can change the form of the string sent from the modified F1 + key. + +CSI > Ps n + Disable modifiers which may be enabled via the CSI > Ps; Ps m + sequence. This corresponds to a resource value of "-1", which + cannot be set with the other sequence. The parameter identi- + fies the resource to be disabled: + Ps = 0 -> modifyKeyboard. + Ps = 1 -> modifyCursorKeys. + Ps = 2 -> modifyFunctionKeys. + Ps = 4 -> modifyOtherKeys. + If the parameter is omitted, modifyFunctionKeys is disabled. + When modifyFunctionKeys is disabled, xterm uses the modifier + keys to make an extended sequence of functions rather than + adding a parameter to each function key to denote the modi- + fiers. +CSI ? Ps n + Device Status Report (DSR, DEC-specific). + Ps = 6 -> Report Cursor Position (DECXCPR) [row;column] as + CSI ? r ; c R (assumes the default page, i.e., "1"). + Ps = 1 5 -> Report Printer status as CSI ? 1 0 n (ready). + or CSI ? 1 1 n (not ready). + Ps = 2 5 -> Report UDK status as CSI ? 2 0 n (unlocked) or + CSI ? 2 1 n (locked). + Ps = 2 6 -> Report Keyboard status as + CSI ? 2 7 ; 1 ; 0 ; 0 n (North American). + The last two parameters apply to VT400 & up, and denote key- + board ready and LK01 respectively. + Ps = 5 3 -> Report Locator status as CSI ? 5 3 n Locator + available, if compiled-in, or CSI ? 5 0 n No Locator, if not. + Ps = 5 5 -> Report Locator status as CSI ? 5 3 n Locator + available, if compiled-in, or CSI ? 5 0 n No Locator, if not. + Ps = 5 6 -> Report Locator type as CSI ? 5 7 ; 1 n Mouse, + if compiled-in, or CSI ? 5 7 ; 0 n Cannot identify, if not. + Ps = 6 2 -> Report macro space (DECMSR) as CSI Pn \* { . + Ps = 6 3 -> Report memory checksum (DECCKSR) as DCS Pt ! x + x x x ST . + Pt is the request id (from an optional parameter to the + request). + The x's are hexadecimal digits 0-9 and A-F. + Ps = 7 5 -> Report data integrity as CSI ? 7 0 n (ready, + no errors). + Ps = 8 5 -> Report multi-session configuration as CSI ? 8 3 + n (not configured for multiple-session operation). +CSI > Ps p + Set resource value pointerMode. This is used by xterm to + decide whether to hide the pointer cursor as the user types. + Valid values for the parameter: + Ps = 0 -> never hide the pointer. + Ps = 1 -> hide if the mouse tracking mode is not enabled. + Ps = 2 -> always hide the pointer, except when leaving the + window. + Ps = 3 -> always hide the pointer, even if leaving/entering + the window. If no parameter is given, xterm uses the default, + which is 1 . +CSI ! p Soft terminal reset (DECSTR). +CSI Ps ; Ps " p + Set conformance level (DECSCL). Valid values for the first + parameter: + Ps = 6 1 -> VT100. + Ps = 6 2 -> VT200. + Ps = 6 3 -> VT300. + Valid values for the second parameter: + Ps = 0 -> 8-bit controls. + Ps = 1 -> 7-bit controls (always set for VT100). + Ps = 2 -> 8-bit controls. +CSI Ps $ p + Request ANSI mode (DECRQM). For VT300 and up, reply is + CSI Ps; Pm$ y + where Ps is the mode number as in RM, and Pm is the mode + value: + 0 - not recognized + 1 - set + 2 - reset + 3 - permanently set + 4 - permanently reset +CSI ? Ps$ p + Request DEC private mode (DECRQM). For VT300 and up, reply is + CSI ? Ps; Pm$ y + where Ps is the mode number as in DECSET, Pm is the mode value + as in the ANSI DECRQM. +CSI Ps q Load LEDs (DECLL). + Ps = 0 -> Clear all LEDS (default). + Ps = 1 -> Light Num Lock. + Ps = 2 -> Light Caps Lock. + Ps = 3 -> Light Scroll Lock. + Ps = 2 1 -> Extinguish Num Lock. + Ps = 2 2 -> Extinguish Caps Lock. + Ps = 2 3 -> Extinguish Scroll Lock. +CSI Ps SP q + Set cursor style (DECSCUSR, VT520). + Ps = 0 -> blinking block. + Ps = 1 -> blinking block (default). + Ps = 2 -> steady block. + Ps = 3 -> blinking underline. + Ps = 4 -> steady underline. + Ps = 5 -> blinking bar (xterm). + Ps = 6 -> steady bar (xterm). +CSI Ps " q + Select character protection attribute (DECSCA). Valid values + for the parameter: + Ps = 0 -> DECSED and DECSEL can erase (default). + Ps = 1 -> DECSED and DECSEL cannot erase. + Ps = 2 -> DECSED and DECSEL can erase. +CSI Ps ; Ps r + Set Scrolling Region [top;bottom] (default = full size of win- + dow) (DECSTBM). +CSI ? Pm r + Restore DEC Private Mode Values. The value of Ps previously + saved is restored. Ps values are the same as for DECSET. +CSI Pt; Pl; Pb; Pr; Ps$ r + Change Attributes in Rectangular Area (DECCARA), VT400 and up. + Pt; Pl; Pb; Pr denotes the rectangle. + Ps denotes the SGR attributes to change: 0, 1, 4, 5, 7. +CSI s Save cursor (ANSI.SYS), available only when DECLRMM is dis- + abled. +CSI Pl; Pr s + Set left and right margins (DECSLRM), available only when + DECLRMM is enabled (VT420 and up). +CSI ? Pm s + Save DEC Private Mode Values. Ps values are the same as for + DECSET. +CSI Ps ; Ps ; Ps t + Window manipulation (from dtterm, as well as extensions). + These controls may be disabled using the allowWindowOps + resource. Valid values for the first (and any additional + parameters) are: + Ps = 1 -> De-iconify window. + Ps = 2 -> Iconify window. + Ps = 3 ; x ; y -> Move window to [x, y]. + Ps = 4 ; height ; width -> Resize the xterm window to + given height and width in pixels. Omitted parameters reuse + the current height or width. Zero parameters use the dis- + play's height or width. + Ps = 5 -> Raise the xterm window to the front of the stack- + ing order. + Ps = 6 -> Lower the xterm window to the bottom of the + stacking order. + Ps = 7 -> Refresh the xterm window. + Ps = 8 ; height ; width -> Resize the text area to given + height and width in characters. Omitted parameters reuse the + current height or width. Zero parameters use the display's + height or width. + Ps = 9 ; 0 -> Restore maximized window. + Ps = 9 ; 1 -> Maximize window (i.e., resize to screen + size). + Ps = 9 ; 2 -> Maximize window vertically. + Ps = 9 ; 3 -> Maximize window horizontally. + Ps = 1 0 ; 0 -> Undo full-screen mode. + Ps = 1 0 ; 1 -> Change to full-screen. + Ps = 1 0 ; 2 -> Toggle full-screen. + Ps = 1 1 -> Report xterm window state. If the xterm window + is open (non-iconified), it returns CSI 1 t . If the xterm + window is iconified, it returns CSI 2 t . + Ps = 1 3 -> Report xterm window position. + Result is CSI 3 ; x ; y t + Ps = 1 4 -> Report xterm window in pixels. + Result is CSI 4 ; height ; width t + Ps = 1 8 -> Report the size of the text area in characters. + Result is CSI 8 ; height ; width t + Ps = 1 9 -> Report the size of the screen in characters. + Result is CSI 9 ; height ; width t + Ps = 2 0 -> Report xterm window's icon label. + Result is OSC L label ST + Ps = 2 1 -> Report xterm window's title. + Result is OSC l label ST + Ps = 2 2 ; 0 -> Save xterm icon and window title on + stack. + Ps = 2 2 ; 1 -> Save xterm icon title on stack. + Ps = 2 2 ; 2 -> Save xterm window title on stack. + Ps = 2 3 ; 0 -> Restore xterm icon and window title from + stack. + Ps = 2 3 ; 1 -> Restore xterm icon title from stack. + Ps = 2 3 ; 2 -> Restore xterm window title from stack. + Ps >= 2 4 -> Resize to Ps lines (DECSLPP). +CSI > Ps; Ps t + Set one or more features of the title modes. Each parameter + enables a single feature. + Ps = 0 -> Set window/icon labels using hexadecimal. + Ps = 1 -> Query window/icon labels using hexadecimal. + Ps = 2 -> Set window/icon labels using UTF-8. + Ps = 3 -> Query window/icon labels using UTF-8. (See dis- + cussion of "Title Modes") +CSI Ps SP t + Set warning-bell volume (DECSWBV, VT520). + Ps = 0 or 1 -> off. + Ps = 2 , 3 or 4 -> low. + Ps = 5 , 6 , 7 , or 8 -> high. +CSI Pt; Pl; Pb; Pr; Ps$ t + Reverse Attributes in Rectangular Area (DECRARA), VT400 and + up. + Pt; Pl; Pb; Pr denotes the rectangle. + Ps denotes the attributes to reverse, i.e., 1, 4, 5, 7. +CSI u Restore cursor (ANSI.SYS). +CSI Ps SP u + Set margin-bell volume (DECSMBV, VT520). + Ps = 1 -> off. + Ps = 2 , 3 or 4 -> low. + Ps = 0 , 5 , 6 , 7 , or 8 -> high. +CSI Pt; Pl; Pb; Pr; Pp; Pt; Pl; Pp$ v + Copy Rectangular Area (DECCRA, VT400 and up). + Pt; Pl; Pb; Pr denotes the rectangle. + Pp denotes the source page. + Pt; Pl denotes the target location. + Pp denotes the target page. +CSI Pt ; Pl ; Pb ; Pr ' w + Enable Filter Rectangle (DECEFR), VT420 and up. + Parameters are [top;left;bottom;right]. + Defines the coordinates of a filter rectangle and activates + it. Anytime the locator is detected outside of the filter + rectangle, an outside rectangle event is generated and the + rectangle is disabled. Filter rectangles are always treated + as "one-shot" events. Any parameters that are omitted default + to the current locator position. If all parameters are omit- + ted, any locator motion will be reported. DECELR always can- + cels any prevous rectangle definition. +CSI Ps x Request Terminal Parameters (DECREQTPARM). + if Ps is a "0" (default) or "1", and xterm is emulating VT100, + the control sequence elicits a response of the same form whose + parameters describe the terminal: + Ps -> the given Ps incremented by 2. + Pn = 1 <- no parity. + Pn = 1 <- eight bits. + Pn = 1 <- 2 8 transmit 38.4k baud. + Pn = 1 <- 2 8 receive 38.4k baud. + Pn = 1 <- clock multiplier. + Pn = 0 <- STP flags. +CSI Ps * x + Select Attribute Change Extent (DECSACE). + Ps = 0 -> from start to end position, wrapped. + Ps = 1 -> from start to end position, wrapped. + Ps = 2 -> rectangle (exact). +CSI Pc ; Pt ; Pl ; Pb ; Pr $ x + Fill Rectangular Area (DECFRA), VT420 and up. + Pc is the character to use. + Pt; Pl; Pb; Pr denotes the rectangle. +CSI Pi ; Pg ; Pt; Pl; Pb; Pr * y + Request Checksum of Rectangular Area (DECRQCRA), VT420 and up. + Response is + DCS Pi ! x x x x ST + Pi is the request id. + Pg is the page number. + Pt; Pl; Pb; Pr denotes the rectangle. + The x's are hexadecimal digits 0-9 and A-F. +CSI Ps ; Pu ' z + Enable Locator Reporting (DECELR). + Valid values for the first parameter: + Ps = 0 -> Locator disabled (default). + Ps = 1 -> Locator enabled. + Ps = 2 -> Locator enabled for one report, then disabled. + The second parameter specifies the coordinate unit for locator + reports. + Valid values for the second parameter: + Pu = 0 <- or omitted -> default to character cells. + Pu = 1 <- device physical pixels. + Pu = 2 <- character cells. +CSI Pt; Pl; Pb; Pr$ z + Erase Rectangular Area (DECERA), VT400 and up. + Pt; Pl; Pb; Pr denotes the rectangle. +CSI Pm ' { + Select Locator Events (DECSLE). + Valid values for the first (and any additional parameters) + are: + Ps = 0 -> only respond to explicit host requests (DECRQLP). + (This is default). It also cancels any filter + rectangle. + Ps = 1 -> report button down transitions. + Ps = 2 -> do not report button down transitions. + Ps = 3 -> report button up transitions. + Ps = 4 -> do not report button up transitions. +CSI Pt; Pl; Pb; Pr $ { + Selective Erase Rectangular Area (DECSERA), VT400 and up. + Pt; Pl; Pb; Pr denotes the rectangle. +CSI Ps ' | + Request Locator Position (DECRQLP). + Valid values for the parameter are: + Ps = 0 , 1 or omitted -> transmit a single DECLRP locator + report. + + If Locator Reporting has been enabled by a DECELR, xterm will + respond with a DECLRP Locator Report. This report is also + generated on button up and down events if they have been + enabled with a DECSLE, or when the locator is detected outside + of a filter rectangle, if filter rectangles have been enabled + with a DECEFR. + + -> CSI Pe ; Pb ; Pr ; Pc ; Pp & w + + Parameters are [event;button;row;column;page]. + Valid values for the event: + Pe = 0 -> locator unavailable - no other parameters sent. + Pe = 1 -> request - xterm received a DECRQLP. + Pe = 2 -> left button down. + Pe = 3 -> left button up. + Pe = 4 -> middle button down. + Pe = 5 -> middle button up. + Pe = 6 -> right button down. + Pe = 7 -> right button up. + Pe = 8 -> M4 button down. + Pe = 9 -> M4 button up. + Pe = 1 0 -> locator outside filter rectangle. + The "button" parameter is a bitmask indicating which buttons + are pressed: + Pb = 0 <- no buttons down. + Pb & 1 <- right button down. + Pb & 2 <- middle button down. + Pb & 4 <- left button down. + Pb & 8 <- M4 button down. + The "row" and "column" parameters are the coordinates of the + locator position in the xterm window, encoded as ASCII deci- + mal. + The "page" parameter is not used by xterm. +CSI Pm ' } + Insert Ps Column(s) (default = 1) (DECIC), VT420 and up. +CSI Pm ' ~ + Delete Ps Column(s) (default = 1) (DECDC), VT420 and up. + +Operating System Commands +OSC Ps ; Pt BEL +OSC Ps ; Pt ST + Set Text Parameters. For colors and font, if Pt is a "?", the + control sequence elicits a response which consists of the con- + trol sequence which would set the corresponding value. The + dtterm control sequences allow you to determine the icon name + and window title. + Ps = 0 -> Change Icon Name and Window Title to Pt. + Ps = 1 -> Change Icon Name to Pt. + Ps = 2 -> Change Window Title to Pt. + Ps = 3 -> Set X property on top-level window. Pt should be + in the form "prop=value", or just "prop" to delete the prop- + erty + Ps = 4 ; c; spec -> Change Color Number c to the color spec- + ified by spec. This can be a name or RGB specification as per + XParseColor. Any number of c/spec pairs may be given. The + color numbers correspond to the ANSI colors 0-7, their bright + versions 8-15, and if supported, the remainder of the 88-color + or 256-color table. + + If a "?" is given rather than a name or RGB specification, + xterm replies with a control sequence of the same form which + can be used to set the corresponding color. Because more than + one pair of color number and specification can be given in one + control sequence, xterm can make more than one reply. + + Ps = 5 ; c; spec -> Change Special Color Number c to the + color specified by spec. This can be a name or RGB specifica- + tion as per XParseColor. Any number of c/spec pairs may be + given. The special colors can also be set by adding the maxi- + mum number of colors to these codes in an OSC 4 control: + + Pc = 0 <- resource colorBD (BOLD). + Pc = 1 <- resource colorUL (UNDERLINE). + Pc = 2 <- resource colorBL (BLINK). + Pc = 3 <- resource colorRV (REVERSE). + Pc = 4 <- resource colorIT (ITALIC). + + Ps = 6 ; c; f -> Enable/disable Special Color Number c. OSC + 6 is the same as OSC 1 0 6 . + + The 10 colors (below) which may be set or queried using 1 0 + through 1 9 are denoted dynamic colors, since the correspond- + ing control sequences were the first means for setting xterm's + colors dynamically, i.e., after it was started. They are not + the same as the ANSI colors. These controls may be disabled + using the allowColorOps resource. At least one parameter is + expected for Pt. Each successive parameter changes the next + color in the list. The value of Ps tells the starting point + in the list. The colors are specified by name or RGB specifi- + cation as per XParseColor. + + If a "?" is given rather than a name or RGB specification, + xterm replies with a control sequence of the same form which + can be used to set the corresponding dynamic color. Because + more than one pair of color number and specification can be + given in one control sequence, xterm can make more than one + reply. + + Ps = 1 0 -> Change VT100 text foreground color to Pt. + Ps = 1 1 -> Change VT100 text background color to Pt. + Ps = 1 2 -> Change text cursor color to Pt. + Ps = 1 3 -> Change mouse foreground color to Pt. + Ps = 1 4 -> Change mouse background color to Pt. + Ps = 1 5 -> Change Tektronix foreground color to Pt. + Ps = 1 6 -> Change Tektronix background color to Pt. + Ps = 1 7 -> Change highlight background color to Pt. + Ps = 1 8 -> Change Tektronix cursor color to Pt. + Ps = 1 9 -> Change highlight foreground color to Pt. + + Ps = 4 6 -> Change Log File to Pt. (This is normally dis- + abled by a compile-time option). + + Ps = 5 0 -> Set Font to Pt. These controls may be disabled + using the allowFontOps resource. If Pt begins with a "#", + index in the font menu, relative (if the next character is a + plus or minus sign) or absolute. A number is expected but not + required after the sign (the default is the current entry for + relative, zero for absolute indexing). + The same rule (plus or minus sign, optional number) is used + when querying the font. The remainder of Pt is ignored. + A font can be specified after a "#" index expression, by + adding a space and then the font specifier. + If the "TrueType Fonts" menu entry is set (the renderFont + resource), then this control sets/queries the faceName + resource. + + Ps = 5 1 -> reserved for Emacs shell. + + Ps = 5 2 -> Manipulate Selection Data. These controls may + be disabled using the allowWindowOps resource. The parameter + Pt is parsed as + Pc; Pd + The first, Pc, may contain zero or more characters from the + set c p s 0 1 2 3 4 5 6 7 . It is used to construct + a list of selection parameters for clipboard, primary, select, + or cut buffers 0 through 7 respectively, in the order given. + If the parameter is empty, xterm uses s 0 , to specify the + configurable primary/clipboard selection and cut buffer 0. + The second parameter, Pd, gives the selection data. Normally + this is a string encoded in base64. The data becomes the new + selection, which is then available for pasting by other appli- + cations. + If the second parameter is a ? , xterm replies to the host + with the selection data encoded using the same protocol. + If the second parameter is neither a base64 string nor ? , + then the selection is cleared. + + Ps = 1 0 4 ; c -> Reset Color Number c. It is reset to the + color specified by the corresponding X resource. Any number + of c parameters may be given. These parameters correspond to + the ANSI colors 0-7, their bright versions 8-15, and if sup- + ported, the remainder of the 88-color or 256-color table. If + no parameters are given, the entire table will be reset. + + Ps = 1 0 5 ; c -> Reset Special Color Number c. It is reset + to the color specified by the corresponding X resource. Any + number of c parameters may be given. These parameters corre- + spond to the special colors which can be set using an OSC 5 + control (or by adding the maximum number of colors using an + OSC 4 control). + + Ps = 1 0 6 ; c; f -> Enable/disable Special Color Number c. + The second parameter tells xterm to enable the corresponding + color mode if nonzero, disable it if zero. + + Pc = 0 <- resource colorBDMode (BOLD). + Pc = 1 <- resource colorULMode (UNDERLINE). + Pc = 2 <- resource colorBLMode (BLINK). + Pc = 3 <- resource colorRVMode (REVERSE). + Pc = 4 <- resource colorITMode (ITALIC). + Pc = 5 <- resource colorAttrMode (Override ANSI). + + The dynamic colors can also be reset to their default + (resource) values: + Ps = 1 1 0 -> Reset VT100 text foreground color. + Ps = 1 1 1 -> Reset VT100 text background color. + Ps = 1 1 2 -> Reset text cursor color. + Ps = 1 1 3 -> Reset mouse foreground color. + Ps = 1 1 4 -> Reset mouse background color. + Ps = 1 1 5 -> Reset Tektronix foreground color. + Ps = 1 1 6 -> Reset Tektronix background color. + Ps = 1 1 7 -> Reset highlight color. + Ps = 1 1 8 -> Reset Tektronix cursor color. + Ps = 1 1 9 -> Reset highlight foreground color. + +Privacy Message +PM Pt ST xterm implements no PM functions; Pt is ignored. Pt need not + be printable characters. + +Alt and Meta Keys +Many keyboards have keys labeled "Alt". Few have keys labeled "Meta". +However, xterm's default translations use the Meta modifier. Common +keyboard configurations assign the Meta modifier to an "Alt" key. By +using xmodmap one may have the modifier assigned to a different key, and +have "real" alt and meta keys. Here is an example: + + ! put meta on mod3 to distinguish it from alt + keycode 64 = Alt_L + clear mod1 + add mod1 = Alt_L + keycode 115 = Meta_L + clear mod3 + add mod3 = Meta_L + +The metaSendsEscape resource (and altSendsEscape if altIsNotMeta is set) +can be used to control the way the Meta modifier applies to ordinary +keys unless the modifyOtherKeys resource is set: + - prefix a key with the ESC character. + - shift the key from codes 0-127 to 128-255 by adding 128. + +The table shows the result for a given character "x" with modifiers +according to the default translations with the resources set on or off. +This assumes altIsNotMeta is set: + + ----------------------------------------------------------- + key altSendsEscape metaSendsEscape result + -----------+----------------+-----------------+------------ + x | off | off | x + Meta-x | off | off | shift + Alt-x | off | off | shift + Alt+Meta-x | off | off | shift + x | ON | off | x + Meta-x | ON | off | shift + Alt-x | ON | off | ESC x + Alt+Meta-x | ON | off | ESC shift + x | off | ON | x + Meta-x | off | ON | ESC x + Alt-x | off | ON | shift + Alt+Meta-x | off | ON | ESC shift + x | ON | ON | x + Meta-x | ON | ON | ESC x + Alt-x | ON | ON | ESC x + Alt+Meta-x | ON | ON | ESC x + -----------+----------------+-----------------+------------ + +PC-Style Function Keys +If xterm does minimal translation of the function keys, it usually does +this with a PC-style keyboard, so PC-style function keys result. Sun +keyboards are similar to PC keyboards. Both have cursor and scrolling +operations printed on the keypad, which duplicate the smaller cursor and +scrolling keypads. + +X does not predefine NumLock (used for VT220 keyboards) or Alt (used as +an extension for the Sun/PC keyboards) as modifiers. These keys are +recognized as modifiers when enabled by the numLock resource, or by the +"DECSET 1 0 3 5 " control sequence. + +The cursor keys transmit the following escape sequences depending on the +mode specified via the DECCKM escape sequence. + + Key Normal Application + -------------+----------+------------- + Cursor Up | CSI A | SS3 A + Cursor Down | CSI B | SS3 B + Cursor Right | CSI C | SS3 C + Cursor Left | CSI D | SS3 D + -------------+----------+------------- + +The home- and end-keys (unlike PageUp and other keys also on the 6-key +editing keypad) are considered "cursor keys" by xterm. Their mode is +also controlled by the DECCKM escape sequence: + + Key Normal Application + ---------+----------+------------- + Home | CSI H | SS3 H + End | CSI F | SS3 F + ---------+----------+------------- + +The application keypad transmits the following escape sequences depend- +ing on the mode specified via the DECKPNM and DECKPAM escape sequences. +Use the NumLock key to override the application mode. + +Not all keys are present on the Sun/PC keypad (e.g., PF1, Tab), but are +supported by the program. + + Key Numeric Application Terminfo Termcap + ---------------+----------+-------------+----------+---------- + Space | SP | SS3 SP | - | - + Tab | TAB | SS3 I | - | - + Enter | CR | SS3 M | kent | @8 + PF1 | SS3 P | SS3 P | kf1 | k1 + PF2 | SS3 Q | SS3 Q | kf2 | k2 + PF3 | SS3 R | SS3 R | kf3 | k3 + PF4 | SS3 S | SS3 S | kf4 | k4 + * (multiply) | * | SS3 j | - | - + + (add) | + | SS3 k | - | - + , (comma) | , | SS3 l | - | - + - (minus) | - | SS3 m | - | - + . (Delete) | . | CSI 3 ~ | - | - + / (divide) | / | SS3 o | - | - + 0 (Insert) | 0 | CSI 2 ~ | - | - + 1 (End) | 1 | SS3 F | kc1 | K4 + 2 (DownArrow) | 2 | CSI B | - | - + 3 (PageDown) | 3 | CSI 6 ~ | kc3 | K5 + 4 (LeftArrow) | 4 | CSI D | - | - + 5 (Begin) | 5 | CSI E | kb2 | K2 + 6 (RightArrow) | 6 | CSI C | - | - + 7 (Home) | 7 | SS3 H | ka1 | K1 + 8 (UpArrow) | 8 | CSI A | - | - + 9 (PageUp) | 9 | CSI 5 ~ | ka3 | K3 + = (equal) | = | SS3 X | - | - + ---------------+----------+-------------+----------+---------- + +They also provide 12 function keys, as well as a few other special-pur- +pose keys: + + Key Escape Sequence + ---------+----------------- + F1 | SS3 P + F2 | SS3 Q + F3 | SS3 R + F4 | SS3 S + F5 | CSI 1 5 ~ + F6 | CSI 1 7 ~ + F7 | CSI 1 8 ~ + F8 | CSI 1 9 ~ + F9 | CSI 2 0 ~ + F10 | CSI 2 1 ~ + F11 | CSI 2 3 ~ + F12 | CSI 2 4 ~ + ---------+----------------- + +Note that F1 through F4 are prefixed with SS3 , while the other keys are +prefixed with CSI . Older versions of xterm implement different escape +sequences for F1 through F4, with a CSI prefix. These can be activated +by setting the oldXtermFKeys resource. However, since they do not cor- +respond to any hardware terminal, they have been deprecated. (The DEC +VT220 reserves F1 through F5 for local functions such as Setup). + + Key Escape Sequence + ---------+----------------- + F1 | CSI 1 1 ~ + F2 | CSI 1 2 ~ + F3 | CSI 1 3 ~ + F4 | CSI 1 4 ~ + ---------+----------------- + +In normal mode, i.e., a Sun/PC keyboard when the sunKeyboard resource is +false (and none of the other keyboard resources such as oldXtermFKeys +resource is set), xterm encodes function key modifiers as parameters +appended before the final character of the control sequence. As a spe- +cial case, the SS3 sent before F1 through F4 is altered to CSI when +sending a function key modifier as a parameter. + + Code Modifiers + ---------+--------------------------- + 2 | Shift + 3 | Alt + 4 | Shift + Alt + 5 | Control + 6 | Shift + Control + 7 | Alt + Control + 8 | Shift + Alt + Control + 9 | Meta + 10 | Meta + Shift + 11 | Meta + Alt + 12 | Meta + Alt + Shift + 13 | Meta + Ctrl + 14 | Meta + Ctrl + Shift + 15 | Meta + Ctrl + Alt + 16 | Meta + Ctrl + Alt + Shift + ---------+--------------------------- + +For example, shift-F5 would be sent as CSI 1 5 ; 2 ~ + +If the alwaysUseMods resource is set, the Meta modifier also is recog- +nized, making parameters 9 through 16. + +VT220-Style Function Keys +However, xterm is most useful as a DEC VT102 or VT220 emulator. Set the +sunKeyboard resource to true to force a Sun/PC keyboard to act like a +VT220 keyboard. + +The VT102/VT220 application keypad transmits unique escape sequences in +application mode, which are distinct from the cursor and scrolling key- +pad: + + Key Numeric Application + -------------+----------+------------- + Space | SP | SS3 SP + Tab | TAB | SS3 I + Enter | CR | SS3 M + PF1 | SS3 P | SS3 P + PF2 | SS3 Q | SS3 Q + PF3 | SS3 R | SS3 R + PF4 | SS3 S | SS3 S + * (multiply) | * | SS3 j + + (add) | + | SS3 k + , (comma) | , | SS3 l + - (minus) | - | SS3 m + . (period) | . | SS3 n + / (divide) | / | SS3 o + 0 | 0 | SS3 p + 1 | 1 | SS3 q + 2 | 2 | SS3 r + 3 | 3 | SS3 s + 4 | 4 | SS3 t + 5 | 5 | SS3 u + 6 | 6 | SS3 v + 7 | 7 | SS3 w + 8 | 8 | SS3 x + 9 | 9 | SS3 y + = (equal) | = | SS3 X + -------------+----------+------------- + +The VT220 provides a 6-key editing keypad, which is analogous to that on +the PC keyboard. It is not affected by DECCKM or DECKPNM/DECKPAM: + + Key Normal Application + ---------+----------+------------- + Insert | CSI 2 ~ | CSI 2 ~ + Delete | CSI 3 ~ | CSI 3 ~ + Home | CSI 1 ~ | CSI 1 ~ + End | CSI 4 ~ | CSI 4 ~ + PageUp | CSI 5 ~ | CSI 5 ~ + PageDown | CSI 6 ~ | CSI 6 ~ + ---------+----------+------------- + +The VT220 provides 8 additional function keys. With a Sun/PC keyboard, +access these keys by Control/F1 for F13, etc. + + Key Escape Sequence + ---------+----------------- + F13 | CSI 2 5 ~ + F14 | CSI 2 6 ~ + F15 | CSI 2 8 ~ + F16 | CSI 2 9 ~ + F17 | CSI 3 1 ~ + F18 | CSI 3 2 ~ + F19 | CSI 3 3 ~ + F20 | CSI 3 4 ~ + ---------+----------------- + +VT52-Style Function Keys +A VT52 does not have function keys, but it does have a numeric keypad +and cursor keys. They differ from the other emulations by the prefix. +Also, the cursor keys do not change: + + Key Normal/Application + -------------+-------------------- + Cursor Up | ESC A + Cursor Down | ESC B + Cursor Right | ESC C + Cursor Left | ESC D + -------------+-------------------- + +The keypad is similar: + + Key Numeric Application + -------------+----------+------------- + Space | SP | ESC ? SP + Tab | TAB | ESC ? I + Enter | CR | ESC ? M + PF1 | ESC P | ESC P + PF2 | ESC Q | ESC Q + PF3 | ESC R | ESC R + PF4 | ESC S | ESC S + * (multiply) | * | ESC ? j + + (add) | + | ESC ? k + , (comma) | , | ESC ? l + - (minus) | - | ESC ? m + . (period) | . | ESC ? n + / (divide) | / | ESC ? o + 0 | 0 | ESC ? p + 1 | 1 | ESC ? q + 2 | 2 | ESC ? r + 3 | 3 | ESC ? s + 4 | 4 | ESC ? t + 5 | 5 | ESC ? u + 6 | 6 | ESC ? v + 7 | 7 | ESC ? w + 8 | 8 | ESC ? x + 9 | 9 | ESC ? y + = (equal) | = | ESC ? X + -------------+----------+------------- + +Sun-Style Function Keys +The xterm program provides support for Sun keyboards more directly, by a +menu toggle that causes it to send Sun-style function key codes rather +than VT220. Note, however, that the sun and VT100 emulations are not +really compatible. For example, their wrap-margin behavior differs. + +Only function keys are altered; keypad and cursor keys are the same. +The emulation responds identically. See the xterm-sun terminfo entry +for details. + +HP-Style Function Keys +Similarly, xterm can be compiled to support HP keyboards. See the +xterm-hp terminfo entry for details. + +The Alternate Screen Buffer +Xterm maintains two screen buffers. The normal screen buffer allows you +to scroll back to view saved lines of output up to the maximum set by +the saveLines resource. The alternate screen buffer is exactly as large +as the display, contains no additional saved lines. When the alternate +screen buffer is active, you cannot scroll back to view saved lines. +Xterm provides control sequences and menu entries for switching between +the two. + +Most full-screen applications use terminfo or termcap to obtain strings +used to start/stop full-screen mode, i.e., smcup and rmcup for terminfo, +or the corresponding ti and te for termcap. The titeInhibit resource +removes the ti and te strings from the TERMCAP string which is set in +the environment for some platforms. That is not done when xterm is +built with terminfo libraries because terminfo does not provide the +whole text of the termcap data in one piece. It would not work for ter- +minfo anyway, since terminfo data is not passed in environment vari- +ables; setting an environment variable in this manner would have no +effect on the application's ability to switch between normal and alter- +nate screen buffers. Instead, the newer private mode controls (such as +1 0 4 9 ) for switching between normal and alternate screen buffers sim- +ply disable the switching. They add other features such as clearing the +display for the same reason: to make the details of switching indepen- +dent of the application that requests the switch. + +Bracketed Paste Mode +When bracketed paste mode is set, pasted text is bracketed with control +sequences so that the program can differentiate pasted text from typed- +in text. When bracketed paste mode is set, the program will receive: + ESC [ 2 0 0 ~ , +followed by the pasted text, followed by + ESC [ 2 0 1 ~ . + +Title Modes +The window- and icon-labels can be set or queried using control +sequences. As a VT220-emulator, xterm "should" limit the character +encoding for the corresponding strings to ISO-8859-1. Indeed, it used +to be the case (and was documented) that window titles had to be +ISO-8859-1. This is no longer the case. However, there are many appli- +cations which still assume that titles are set using ISO-8859-1. So +that is the default behavior. + +If xterm is running with UTF-8 encoding, it is possible to use window- +and icon-labels encoded using UTF-8. That is because the underlying X +libraries (and many, but not all) window managers support this feature. + +The utf8Title X resource setting tells xterm to disable a reconversion +of the title string back to ISO-8859-1, allowing the title strings to be +interpreted as UTF-8. The same feature can be enabled using the title +mode control sequence described in this summary. + +Separate from the ability to set the titles, xterm provides the ability +to query the titles, returning them either in ISO-8859-1 or UTF-8. This +choice is available only while xterm is using UTF-8 encoding. + +Finally, the characters sent to, or returned by a title control are less +constrained than the rest of the control sequences. To make them more +manageable (and constrained), for use in shell scripts, xterm has an +optional feature which decodes the string from hexadecimal (for setting +titles) or for encoding the title into hexadecimal when querying the +value. + +Mouse Tracking +The VT widget can be set to send the mouse position and other informa- +tion on button presses. These modes are typically used by editors and +other full-screen applications that want to make use of the mouse. + +There are two sets of mutually exclusive modes: +o mouse protocol +o protocol encoding + +The mouse protocols include DEC Locator mode, enabled by the DECELR CSI +Ps ; Ps ' z control sequence, and is not described here (control +sequences are summarized above). The remaining five modes of the mouse +protocols are each enabled (or disabled) by a different parameter in the +"DECSET CSI ? Pm h " or "DECRST CSI ? Pm l " control sequence. + +Manifest constants for the parameter values are defined in xcharmouse.h +as follows: + + #define SET_X10_MOUSE 9 + #define SET_VT200_MOUSE 1000 + #define SET_VT200_HIGHLIGHT_MOUSE 1001 + #define SET_BTN_EVENT_MOUSE 1002 + #define SET_ANY_EVENT_MOUSE 1003 + + #define SET_FOCUS_EVENT_MOUSE 1004 + + #define SET_EXT_MODE_MOUSE 1005 + #define SET_SGR_EXT_MODE_MOUSE 1006 + #define SET_URXVT_EXT_MODE_MOUSE 1015 + + #define SET_ALTERNATE_SCROLL 1007 + +The motion reporting modes are strictly xterm extensions, and are not +part of any standard, though they are analogous to the DEC VT200 DECELR +locator reports. + +Normally, parameters (such as pointer position and button number) for +all mouse tracking escape sequences generated by xterm encode numeric +parameters in a single character as value+32. For example, ! specifies +the value 1. The upper left character position on the terminal is +denoted as 1,1. This scheme dates back to X10, though the normal mouse- +tracking (from X11) is more elaborate. +X10 compatbility mode +X10 compatibility mode sends an escape sequence only on button press, +encoding the location and the mouse button pressed. It is enabled by +specifying parameter 9 to DECSET. On button press, xterm sends CSI M +CbCxCy (6 characters). +o Cb is button-1. +o Cx and Cy are the x and y coordinates of the mouse when the button was + pressed. +Normal tracking mode +Normal tracking mode sends an escape sequence on both button press and +release. Modifier key (shift, ctrl, meta) information is also sent. It +is enabled by specifying parameter 1000 to DECSET. On button press or +release, xterm sends CSI M CbCxCy. +o The low two bits of Cb encode button information: 0=MB1 pressed, 1=MB2 + pressed, 2=MB3 pressed, 3=release. +o The next three bits encode the modifiers which were down when the but- + ton was pressed and are added together: 4=Shift, 8=Meta, 16=Control. + Note however that the shift and control bits are normally unavailable + because xterm uses the control modifier with mouse for popup menus, + and the shift modifier is used in the default translations for button + events. The Meta modifier recognized by xterm is the mod1 mask, and + is not necessarily the "Meta" key (see xmodmap). +o Cx and Cy are the x and y coordinates of the mouse event, encoded as + in X10 mode. +Wheel mice +Wheel mice may return buttons 4 and 5. Those buttons are represented by +the same event codes as buttons 1 and 2 respectively, except that 64 is +added to the event code. Release events for the wheel buttons are not +reported. By default, the wheel mouse events are translated to scroll- +back and scroll-forw actions. Those actions normally scroll the whole +window, as if the scrollbar was used. However if Alternate Scroll mode +is set, then cursor up/down controls are sent when the terminal is dis- +playing the alternate screen. The initial state of Alternate Scroll +mode is set using the alternateScroll resource. +Highlight tracking +Mouse highlight tracking notifies a program of a button press, receives +a range of lines from the program, highlights the region covered by the +mouse within that range until button release, and then sends the program +the release coordinates. It is enabled by specifying parameter 1001 to +DECSET. Highlighting is performed only for button 1, though other but- +ton events can be received. + +Warning: use of this mode requires a cooperating program or it will hang +xterm. + +On button press, the same information as for normal tracking is gener- +ated; xterm then waits for the program to send mouse tracking informa- +tion. All X events are ignored until the proper escape sequence is +received from the pty: CSI Ps ; Ps ; Ps ; Ps ; Ps T . The parameters +are func, startx, starty, firstrow, and lastrow. func is non-zero to +initiate highlight tracking and zero to abort. startx and starty give +the starting x and y location for the highlighted region. The ending +location tracks the mouse, but will never be above row firstrow and will +always be above row lastrow. (The top of the screen is row 1.) When +the button is released, xterm reports the ending position one of two +ways: +o if the start and end coordinates are the same locations: + CSI t CxCy. +o otherwise: + CSI T CxCyCxCyCxCy. + The parameters are startx, starty, endx, endy, mousex, and mousey. + - startx, starty, endx, and endy give the starting and ending charac- + ter positions of the region. + - mousex and mousey give the location of the mouse at button up, which + may not be over a character. +Button-event tracking +Button-event tracking is essentially the same as normal tracking, but +xterm also reports button-motion events. Motion events are reported +only if the mouse pointer has moved to a different character cell. It +is enabled by specifying parameter 1002 to DECSET. On button press or +release, xterm sends the same codes used by normal tracking mode. +o On button-motion events, xterm adds 32 to the event code (the third + character, Cb). +o The other bits of the event code specify button and modifier keys as + in normal mode. For example, motion into cell x,y with button 1 down + is reported as CSI M @ CxCy. ( @ = 32 + 0 (button 1) + 32 (motion + indicator) ). Similarly, motion with button 3 down is reported as CSI + M B CxCy. ( B = 32 + 2 (button 3) + 32 (motion indicator) ). +Any-event tracking +Any-event mode is the same as button-event mode, except that all motion +events are reported, even if no mouse button is down. It is enabled by +specifying 1003 to DECSET. +FocusIn/FocusOut +FocusIn/FocusOut can be combined with any of the mouse events since it +uses a different protocol. When set, it causes xterm to send CSI I +when the terminal gains focus, and CSI O when it loses focus. +Extended coordinates +The original X10 mouse protocol limits the Cx and Cy ordinates to 223 +(=255 - 32). Xterm supports more than one scheme for extending this +range, by changing the protocol encoding: +UTF-8 (1005) + This enables UTF-8 encoding for Cx and Cy under all tracking + modes, expanding the maximum encodable position from 223 to + 2015. For positions less than 95, the resulting output is + identical under both modes. Under extended mouse mode, posi- + tions greater than 95 generate "extra" bytes which will con- + fuse applications which do not treat their input as a UTF-8 + stream. Likewise, Cb will be UTF-8 encoded, to reduce confu- + sion with wheel mouse events. + Under normal mouse mode, positions outside (160,94) result in + byte pairs which can be interpreted as a single UTF-8 charac- + ter; applications which do treat their input as UTF-8 will + almost certainly be confused unless extended mouse mode is + active. + This scheme has the drawback that the encoded coordinates will + not pass through luit unchanged, e.g., for locales using non- + UTF-8 encoding. +SGR (1006) + The normal mouse response is altered to use CSI < followed by + semicolon-separated encoded button value, the Cx and Cy ordi- + nates and a final character which is M for button press and m + for button release. + o The encoded button value in this case does not add 32 since + that was useful only in the X10 scheme for ensuring that the + byte containing the button value is a printable code. + o The modifiers are encoded in the same way. + o A different final character is used for button release to + resolve the X10 ambiguity regarding which button was + released. + The highlight tracking responses are also modified to an SGR- + like format, using the same SGR-style scheme and button-encod- + ings. +URXVT (1015) + The normal mouse response is altered to use CSI followed by + semicolon-separated encoded button value, the Cx and Cy ordi- + nates and final character M . + This uses the same button encoding as X10, but printing it as + a decimal integer rather than as a single byte. + However, CSI M can be mistaken for DL (delete lines), while + the highlight tracking CSI T can be mistaken for SD (scroll + down), and the Window manipulation controls. For these rea- + sons, the 1015 control is not recommended; it is not an + improvement over 1005. + +Sixel Graphics +If xterm is configured as VT240, VT241, VT330, VT340 or VT382 using the +decTerminalID resource, it supports Sixel Graphics controls, a palleted +bitmap graphics system using sets of six vertical pixels as the basic +element. + +CSI Ps c xterm responds to Send Device Attributes (Primary DA) with + these additional codes: + Ps = 4 -> Sixel graphics. +CSI ? Pm h + xterm has these additional private Set Mode values: + Ps = 8 0 -> Sixel scrolling. + Ps = 1 0 7 0 -> use private color registers for each + graphic. + Ps = 8 4 5 2 -> Sixel scrolling leaves cursor to right of + graphic. +DCS Pa; Pb; Ph q Ps..Ps ST + See: + + http://vt100.net/docs/vt3xx-gp/chapter14.html + + The sixel data device control string has three positional + parameters, following the q with sixel data. + Pa -> pixel aspect ratio + Pb -> background color option + Ph -> horizontal grid size (ignored). + Ps -> sixel data + +ReGIS Graphics +If xterm is configured as VT125, VT240, VT241, VT330 or VT340 using the +decTerminalID resource, it supports Remote Graphic Instruction Set, a +graphics description language. + +CSI Ps c xterm responds to Send Device Attributes (Primary DA) with + these additional codes: + Ps = 3 -> ReGIS graphics. +CSI ? Pm h + xterm has these additional private Set Mode values: + Ps = 1 0 7 0 -> use private color registers for each + graphic. +DCS Pm p Pr..Pr ST + See: + + http://vt100.net/docs/vt3xx-gp/chapter1.html + + The ReGIS data device control string has one positional param- + eter with four possible values: + Pm = 0 -> resume command, use fullscreen mode. + Pm = 1 -> start new command, use fullscreen mode. + Pm = 2 -> resume command, use command display mode. + Pm = 3 -> start new command, use command display mode. + +Tektronix 4014 Mode +Most of these sequences are standard Tektronix 4014 control sequences. +Graph mode supports the 12-bit addressing of the Tektronix 4014. The +major features missing are the write-through and defocused modes. This +document does not describe the commands used in the various Tektronix +plotting modes but does describe the commands to switch modes. + +BEL Bell (Ctrl-G). +BS Backspace (Ctrl-H). +TAB Horizontal Tab (Ctrl-I). +LF Line Feed or New Line (Ctrl-J). +VT Cursor up (Ctrl-K). +FF Form Feed or New Page (Ctrl-L). +CR Carriage Return (Ctrl-M). +ESC ETX Switch to VT100 Mode (ESC Ctrl-C). +ESC ENQ Return Terminal Status (ESC Ctrl-E). +ESC FF PAGE (Clear Screen) (ESC Ctrl-L). +ESC SO Begin 4015 APL mode (ESC Ctrl-N). (This is ignored by + xterm). +ESC SI End 4015 APL mode (ESC Ctrl-O). (This is ignored by xterm). +ESC ETB COPY (Save Tektronix Codes to file COPYyyyy-mm-dd.hh:mm:ss). + ETB (end transmission block) is the same as Ctrl-W. +ESC CAN Bypass Condition (ESC Ctrl-X). +ESC SUB GIN mode (ESC Ctrl-Z). +ESC FS Special Point Plot Mode (ESC Ctrl-\). +ESC 8 Select Large Character Set. +ESC 9 Select #2 Character Set. +ESC : Select #3 Character Set. +ESC ; Select Small Character Set. +OSC Ps ; Pt BEL + Set Text Parameters of VT window. + Ps = 0 -> Change Icon Name and Window Title to Pt. + Ps = 1 -> Change Icon Name to Pt. + Ps = 2 -> Change Window Title to Pt. + Ps = 4 6 -> Change Log File to Pt. (This is normally dis- + abled by a compile-time option). +ESC ` Normal Z Axis and Normal (solid) Vectors. +ESC a Normal Z Axis and Dotted Line Vectors. +ESC b Normal Z Axis and Dot-Dashed Vectors. +ESC c Normal Z Axis and Short-Dashed Vectors. +ESC d Normal Z Axis and Long-Dashed Vectors. +ESC h Defocused Z Axis and Normal (solid) Vectors. +ESC i Defocused Z Axis and Dotted Line Vectors. +ESC j Defocused Z Axis and Dot-Dashed Vectors. +ESC k Defocused Z Axis and Short-Dashed Vectors. +ESC l Defocused Z Axis and Long-Dashed Vectors. +ESC p Write-Thru Mode and Normal (solid) Vectors. +ESC q Write-Thru Mode and Dotted Line Vectors. +ESC r Write-Thru Mode and Dot-Dashed Vectors. +ESC s Write-Thru Mode and Short-Dashed Vectors. +ESC t Write-Thru Mode and Long-Dashed Vectors. +FS Point Plot Mode (Ctrl-\). +GS Graph Mode (Ctrl-]). +RS Incremental Plot Mode (Ctrl-^). +US Alpha Mode (Ctrl-_). + +VT52 Mode +Parameters for cursor movement are at the end of the ESC Y escape +sequence. Each ordinate is encoded in a single character as value+32. +For example, ! is 1. The screen coordinate system is 0-based. + +ESC < Exit VT52 mode (Enter VT100 mode). +ESC = Enter alternate keypad mode. +ESC > Exit alternate keypad mode. +ESC A Cursor up. +ESC B Cursor down. +ESC C Cursor right. +ESC D Cursor left. +ESC F Enter graphics mode. +ESC G Exit graphics mode. +ESC H Move the cursor to the home position. +ESC I Reverse line feed. +ESC J Erase from the cursor to the end of the screen. +ESC K Erase from the cursor to the end of the line. +ESC Y Ps Ps + Move the cursor to given row and column. +ESC Z Identify. + -> ESC / Z ("I am a VT52."). \ No newline at end of file diff --git a/comp/src/gb.form.terminal/.hidden/XtermTests/16colors.sh b/comp/src/gb.form.terminal/.hidden/XtermTests/16colors.sh new file mode 100644 index 00000000..7d3e2467 --- /dev/null +++ b/comp/src/gb.form.terminal/.hidden/XtermTests/16colors.sh @@ -0,0 +1,119 @@ +#!/bin/sh +# $XTermId: 16colors.sh,v 1.14 2011/12/11 16:21:22 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 1999-2003,2011 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# Show a simple 16-color test pattern. It is a little more confusing than +# 8colors.sh, since everything is abbreviated to fit on an 80-column line. +# The high (8-15) combinations for foreground or background are marked with +# a '+' sign. + +ESC="" +CMD='/bin/echo' +OPT='-n' +SUF='' +TMP=/tmp/xterm$$ +eval '$CMD $OPT >$TMP || echo fail >$TMP' 2>/dev/null +( test ! -f $TMP || test -s $TMP ) && +for verb in printf print ; do + rm -f $TMP + eval '$verb "\c" >$TMP || echo fail >$TMP' 2>/dev/null + if test -f $TMP ; then + if test ! -s $TMP ; then + CMD="$verb" + OPT= + SUF='\c' + break + fi + fi +done +rm -f $TMP + +if ( trap "echo exit" EXIT 2>/dev/null ) >/dev/null +then + trap '$CMD ""; exit' EXIT HUP INT TRAP TERM +else + trap '$CMD ""; exit' 0 1 2 5 15 +fi + +echo "" +while true +do + for AT in 0 1 4 7 + do + case $AT in + 0) attr=" ";; + 1) attr="BO ";; + 4) attr="UN ";; + 7) attr="RV ";; + esac + for FG in 0 1 2 3 4 5 6 7 + do + case $FG in + 0) fcolor="BLK ";; + 1) fcolor="RED ";; + 2) fcolor="GRN ";; + 3) fcolor="YEL ";; + 4) fcolor="BLU ";; + 5) fcolor="MAG ";; + 6) fcolor="CYN ";; + 7) fcolor="WHT ";; + esac + for HI in 3 9 + do + if test $HI = 3 ; then + color=" $fcolor" + else + color="+$fcolor" + fi + $CMD $OPT "[0;${AT}m$attr$SUF" + $CMD $OPT "[${HI}${FG}m$color$SUF" + for BG in 1 2 3 4 5 6 7 + do + case $BG in + 0) bcolor="BLK ";; + 1) bcolor="RED ";; + 2) bcolor="GRN ";; + 3) bcolor="YEL ";; + 4) bcolor="BLU ";; + 5) bcolor="MAG ";; + 6) bcolor="CYN ";; + 7) bcolor="WHT ";; + esac + $CMD $OPT "[4${BG}m$bcolor$SUF" + $CMD $OPT "[10${BG}m+$bcolor$SUF" + done + echo "" + done + done + sleep 1 + done +done diff --git a/comp/src/gb.form.terminal/.hidden/XtermTests/256colors.pl b/comp/src/gb.form.terminal/.hidden/XtermTests/256colors.pl new file mode 100644 index 00000000..a0373681 --- /dev/null +++ b/comp/src/gb.form.terminal/.hidden/XtermTests/256colors.pl @@ -0,0 +1,51 @@ +#!/usr/bin/env perl +# $XTermId: 256colors.pl,v 1.5 2014/02/26 20:16:12 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 1999-2006,2014 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- + +use strict; +use warnings; + +# This uses 33 print-lines on an 80-column display. Printing the numbers in +# hexadecimal would make it compact enough for 24x80, but less readable. + +our ($bg, $fg); + +for ($bg = 0; $bg < 256; $bg++) { + # print "\x1b[9;1H\x1b[2J"; + for ($fg = 0; $fg < 256; $fg++) { + print "\x1b[48;5;${bg}m\x1b[38;5;${fg}m"; + printf "%03.3d/%03.3d ", $fg, $bg; + } + print "\n"; + sleep 1; +} diff --git a/comp/src/gb.form.terminal/.hidden/XtermTests/256colors2.pl b/comp/src/gb.form.terminal/.hidden/XtermTests/256colors2.pl new file mode 100644 index 00000000..f0360ecc --- /dev/null +++ b/comp/src/gb.form.terminal/.hidden/XtermTests/256colors2.pl @@ -0,0 +1,180 @@ +#!/usr/bin/env perl +# $XTermId: 256colors2.pl,v 1.16 2014/02/26 20:21:48 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 1999-2012,2014 by Thomas E. Dickey +# Copyright 2002 by Steve Wall +# Copyright 1999 by Todd Larason +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# +# use the resources for colors 0-15 - usually more-or-less a +# reproduction of the standard ANSI colors, but possibly more +# pleasing shades + +use strict; +use warnings; + +use Getopt::Std; +use Encode 'encode_utf8'; + +our ($opt_8, $opt_c, $opt_d, $opt_h, $opt_q, $opt_r, $opt_u); +&getopts('8cdhqru') || die("Usage: $0 [options]"); +die("Usage: $0 [options]\n +Options: + -8 use 8-bit controls + -c use colons for separating parameter values in SGR 38/48 + -d use rgb values rather than palette index + -h display this message + -q quieter output by merging all palette initialization + -r display the reverse of the usual palette + -u use UTF-8 when emitting 8-bit controls +") if ( $opt_h); + +our $cube = 6; +our (@steps); +our ($red, $green, $blue); +our ($gray, $level, $color); +our ($csi, $osc, $sep, $st); + +our @rgb; + +sub map_cube($) { + my $value = $_[0]; + $value = (5 - $value) if defined($opt_r); + return $value; +} + +sub map_gray($) { + my $value = $_[0]; + $value = (23 - $value) if defined($opt_r); + return $value; +} + +sub define_color($$$$) { + my $index = $_[0]; + my $r = $_[1]; + my $g = $_[2]; + my $b = $_[3]; + + printf("%s4", $osc) unless ($opt_q); + printf(";%d;rgb:%2.2x/%2.2x/%2.2x", $index, $r, $g, $b); + printf("%s", $st) unless ($opt_q); + + $rgb[$index] = sprintf "%d%s%d%s%d", $r, $sep, $g, $sep, $b; +} + +sub select_color($) { + my $index = $_[0]; + if ( $opt_d and defined($rgb[$index]) ) { + printf "%s48;2%s%sm ", $csi, $sep, $rgb[$index]; + } else { + printf "%s48;5%s%sm ", $csi, $sep, $index; + } +} + +if ( $opt_8 ) { + $csi = "\x9b"; + $osc = "\x9d"; + $st = "\x9c"; +} else { + $csi = "\x1b["; + $osc = "\x1b]"; + $st = "\x1b\\"; +} + +if ( $opt_c ) { + $sep = ":"; +} else { + $sep = ";"; +} + +if ( $opt_8 and $opt_u ) { + my $lc_ctype=`locale 2>/dev/null | fgrep LC_CTYPE | sed -e 's/^.*=//'`; + if ( $lc_ctype =~ /utf.?8/i ) { + binmode(STDOUT, ":utf8"); + } +} +@steps=(0,95,135,175,215,255); +# colors 16-231 are a 6x6x6 color cube +printf("%s4", $osc) if ($opt_q); +for ($red = 0; $red < $cube; $red++) { + for ($green = 0; $green < $cube; $green++) { + for ($blue = 0; $blue < $cube; $blue++) { + &define_color( + 16 + (map_cube($red) * $cube * $cube) + (map_cube($green) * $cube) + map_cube($blue), + int ($steps[$red]), + int ($steps[$green]), + int ($steps[$blue])); + } + } +} + +# colors 232-255 are a grayscale ramp, intentionally leaving out +# black and white +for ($gray = 0; $gray < 24; $gray++) { + $level = (map_gray($gray) * 10) + 8; + &define_color(232 + $gray, $level, $level, $level); +} +printf("%s", $st) if ($opt_q); + + +# display the colors + +# first the system ones: +print "System colors:\n"; +for ($color = 0; $color < 8; $color++) { + &select_color($color); +} +printf "%s0m\n", $csi; +for ($color = 8; $color < 16; $color++) { + &select_color($color); +} +printf "%s0m\n\n", $csi; + +# now the color cube +print "Color cube, ${cube}x${cube}x${cube}:\n"; +for ($green = 0; $green < $cube; $green++) { + for ($red = 0; $red < $cube; $red++) { + for ($blue = 0; $blue < $cube; $blue++) { + $color = 16 + ($red * $cube * $cube) + ($green * $cube) + $blue; + &select_color($color); + } + printf "%s0m ", $csi; + } + print "\n"; +} + + +# now the grayscale ramp +print "Grayscale ramp:\n"; +for ($color = 232; $color < 256; $color++) { + &select_color($color); +} +printf "%s0m\n", $csi; diff --git a/comp/src/gb.form.terminal/.hidden/XtermTests/88colors.pl b/comp/src/gb.form.terminal/.hidden/XtermTests/88colors.pl new file mode 100644 index 00000000..efade569 --- /dev/null +++ b/comp/src/gb.form.terminal/.hidden/XtermTests/88colors.pl @@ -0,0 +1,49 @@ +#!/usr/bin/env perl +# $XTermId: 88colors.pl,v 1.4 2014/02/26 20:16:26 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 1999,2014 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# Made from 256colors.pl + +use strict; +use warnings; + +our ($bg, $fg); + +for ($bg = 0; $bg < 88; $bg++) { + print "\x1b[9;1H\x1b[48;5;${bg}m\x1b[2J"; + for ($fg = 0; $fg < 88; $fg++) { + print "\x1b[38;5;${fg}m"; + printf "%03.3d/%03.3d ", $fg, $bg; + } + sleep 1; + print "\n"; +} diff --git a/comp/src/gb.form.terminal/.hidden/XtermTests/88colors2.pl b/comp/src/gb.form.terminal/.hidden/XtermTests/88colors2.pl new file mode 100644 index 00000000..eb0d9b1f --- /dev/null +++ b/comp/src/gb.form.terminal/.hidden/XtermTests/88colors2.pl @@ -0,0 +1,182 @@ +#!/usr/bin/env perl +# $XTermId: 88colors2.pl,v 1.12 2014/02/26 20:16:53 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 1999-2012,2014 by Thomas E. Dickey +# Copyright 1999 by Steve Wall +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# +# Adapted from 256colors2.pl + +# use the resources for colors 0-15 - usually more-or-less a +# reproduction of the standard ANSI colors, but possibly more +# pleasing shades + +use strict; +use warnings; + +use Getopt::Std; +use Encode 'encode_utf8'; + +our ($opt_8, $opt_c, $opt_d, $opt_h, $opt_q, $opt_r, $opt_u); +&getopts('8cdhqru') || die("Usage: $0 [options]"); +die("Usage: $0 [options]\n +Options: + -8 use 8-bit controls + -c use colons for separating parameter values in SGR 38/48 + -d use rgb values rather than palette index + -h display this message + -q quieter output by merging all palette initialization + -r display the reverse of the usual palette + -u use UTF-8 when emitting 8-bit controls +") if ( $opt_h); + +our $cube = 4; +our (@steps); +our ($red, $green, $blue); +our ($gray, $level, $color); +our ($csi, $osc, $sep, $st); + +our @rgb; + +sub map_cube($) { + my $value = $_[0]; + $value = (3 - $value) if defined($opt_r); + return $value; +} + +sub map_gray($) { + my $value = $_[0]; + $value = (7 - $value) if defined($opt_r); + return $value; +} + +sub define_color($$$$) { + my $index = $_[0]; + my $r = $_[1]; + my $g = $_[2]; + my $b = $_[3]; + + printf("%s4", $osc) unless ($opt_q); + printf(";%d;rgb:%2.2x/%2.2x/%2.2x", $index, $r, $g, $b); + printf("%s", $st) unless ($opt_q); + + $rgb[$index] = sprintf "%d%s%d%s%d", $r, $sep, $g, $sep, $b; +} + +sub select_color($) { + my $index = $_[0]; + if ( $opt_d and defined($rgb[$index]) ) { + printf "%s48;2%s%sm ", $csi, $sep, $rgb[$index]; + } else { + printf "%s48;5%s%sm ", $csi, $sep, $index; + } +} + +if ( $opt_8 ) { + $csi = "\x9b"; + $osc = "\x9d"; + $st = "\x9c"; +} else { + $csi = "\x1b["; + $osc = "\x1b]"; + $st = "\x1b\\"; +} + +if ( $opt_c ) { + $sep = ":"; +} else { + $sep = ";"; +} + +if ( $opt_8 and $opt_u ) { + my $lc_ctype=`locale 2>/dev/null | fgrep LC_CTYPE | sed -e 's/^.*=//'`; + if ( $lc_ctype =~ /utf.?8/i ) { + binmode(STDOUT, ":utf8"); + } +} +# colors 16-79 are a 4x4x4 color cube +@steps=(0,139,205,255); +printf("%s4", $osc) if ($opt_q); +for ($red = 0; $red < $cube; $red++) { + for ($green = 0; $green < $cube; $green++) { + for ($blue = 0; $blue < $cube; $blue++) { + &define_color( + 16 + (map_cube($red) * $cube * $cube) + (map_cube($green) * $cube) + map_cube($blue), + int ($steps[$red]), + int ($steps[$green]), + int ($steps[$blue])); + } + } +} + +# colors 80-87 are a grayscale ramp, intentionally leaving out +# black and white +for ($gray = 0; $gray < 8; $gray++) { + $level = (map_gray($gray) * 23.18181818) + 46.36363636; + if( $gray > 0 ) { $level += 23.18181818; } + &define_color(80 + $gray, int($level), int($level), int($level)); +} +printf("%s", $st) if ($opt_q); + + +# display the colors + +# first the system ones: +print "System colors:\n"; +for ($color = 0; $color < 8; $color++) { + &select_color($color); +} +printf "%s0m\n", $csi; +for ($color = 8; $color < 16; $color++) { + &select_color($color); +} +printf "%s0m\n\n", $csi; + +# now the color cube +print "Color cube, ${cube}x${cube}x${cube}:\n"; +for ($green = 0; $green < $cube; $green++) { + for ($red = 0; $red < $cube; $red++) { + for ($blue = 0; $blue < $cube; $blue++) { + $color = 16 + ($red * $cube * $cube) + ($green * $cube) + $blue; + &select_color($color); + } + printf "%s0m ", $csi; + } + print "\n"; +} + + +# now the grayscale ramp +print "Grayscale ramp:\n"; +for ($color = 80; $color < 88; $color++) { + &select_color($color); +} +printf "%s0m\n", $csi; diff --git a/comp/src/gb.form.terminal/.hidden/XtermTests/8colors.sh b/comp/src/gb.form.terminal/.hidden/XtermTests/8colors.sh new file mode 100644 index 00000000..0bb53c00 --- /dev/null +++ b/comp/src/gb.form.terminal/.hidden/XtermTests/8colors.sh @@ -0,0 +1,107 @@ +#!/bin/sh +# $XTermId: 8colors.sh,v 1.14 2011/12/11 16:21:22 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 1999-2003,2011 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# Show a simple 8-color test pattern + +ESC="" +CMD='/bin/echo' +OPT='-n' +SUF='' +TMP=/tmp/xterm$$ +eval '$CMD $OPT >$TMP || echo fail >$TMP' 2>/dev/null +( test ! -f $TMP || test -s $TMP ) && +for verb in printf print ; do + rm -f $TMP + eval '$verb "\c" >$TMP || echo fail >$TMP' 2>/dev/null + if test -f $TMP ; then + if test ! -s $TMP ; then + CMD="$verb" + OPT= + SUF='\c' + break + fi + fi +done +rm -f $TMP + +if ( trap "echo exit" EXIT 2>/dev/null ) >/dev/null +then + trap '$CMD $OPT ""; exit' EXIT HUP INT TRAP TERM +else + trap '$CMD $OPT ""; exit' 0 1 2 5 15 +fi + +echo "" +while true +do + for AT in 0 1 4 7 + do + case $AT in + 0) attr="normal ";; + 1) attr="bold ";; + 4) attr="under ";; + 7) attr="reverse ";; + esac + for FG in 0 1 2 3 4 5 6 7 + do + case $FG in + 0) fcolor="black ";; + 1) fcolor="red ";; + 2) fcolor="green ";; + 3) fcolor="yellow ";; + 4) fcolor="blue ";; + 5) fcolor="magenta ";; + 6) fcolor="cyan ";; + 7) fcolor="white ";; + esac + $CMD $OPT "[0;${AT}m$attr" + $CMD $OPT "[3${FG}m$fcolor" + for BG in 1 2 3 4 5 6 7 + do + case $BG in + 0) bcolor="black ";; + 1) bcolor="red ";; + 2) bcolor="green ";; + 3) bcolor="yellow ";; + 4) bcolor="blue ";; + 5) bcolor="magenta ";; + 6) bcolor="cyan ";; + 7) bcolor="white ";; + esac + $CMD $OPT "[4${BG}m$bcolor" + done + echo "" + done + sleep 1 + done +done diff --git a/comp/src/gb.form.terminal/.hidden/XtermTests/acolors.sh b/comp/src/gb.form.terminal/.hidden/XtermTests/acolors.sh new file mode 100644 index 00000000..ff3900c3 --- /dev/null +++ b/comp/src/gb.form.terminal/.hidden/XtermTests/acolors.sh @@ -0,0 +1,93 @@ +#!/bin/sh +# $XTermId: acolors.sh,v 1.7 2011/12/11 16:21:22 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 2002-2003,2011 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# Demonstrate the use of the control sequence for changing ANSI colors. + +ESC="" +CMD='/bin/echo' +OPT='-n' +SUF='' +TMP=/tmp/xterm$$ +eval '$CMD $OPT >$TMP || echo fail >$TMP' 2>/dev/null +( test ! -f $TMP || test -s $TMP ) && +for verb in printf print ; do + rm -f $TMP + eval '$verb "\c" >$TMP || echo fail >$TMP' 2>/dev/null + if test -f $TMP ; then + if test ! -s $TMP ; then + CMD="$verb" + OPT= + SUF='\c' + break + fi + fi +done +rm -f $TMP + +LIST="00 30 80 d0 ff" + +exec /dev/tty +read original +stty $old +original=${original}${SUF} + +if ( trap "echo exit" EXIT 2>/dev/null ) >/dev/null +then + trap '$CMD $OPT "$original" >/dev/tty; exit' EXIT HUP INT TRAP TERM +else + trap '$CMD $OPT "$original" >/dev/tty; exit' 0 1 2 5 15 +fi + +$CMD "${ESC}[0;1;34mThis message is BLUE" +$CMD "${ESC}[0;1;31mThis message is RED ${ESC}[0;31m(sometimes)" +$CMD "${ESC}[0;1;32mThis message is GREEN${ESC}[0m" +while true +do + for R in $LIST + do + for G in $LIST + do + for B in $LIST + do + # color "9" is bold-red + test $R != 00 && test $G = 00 && test $B = 00 && $CMD $OPT "" >/dev/tty + $CMD $OPT "${ESC}]4;9;rgb:$R/$G/$B${SUF}" >/dev/tty + sleep 1 + done + done + done +done diff --git a/comp/src/gb.form.terminal/.hidden/XtermTests/doublechars.sh b/comp/src/gb.form.terminal/.hidden/XtermTests/doublechars.sh new file mode 100644 index 00000000..249da160 --- /dev/null +++ b/comp/src/gb.form.terminal/.hidden/XtermTests/doublechars.sh @@ -0,0 +1,116 @@ +#!/bin/sh +# $XTermId: doublechars.sh,v 1.17 2011/12/11 16:21:22 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 1999-2003,2011 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# Illustrate the use of double-size characters by drawing successive lines in +# the commonly used video attributes. +# +# Use the -w option to force the output to wrap. It will look ugly, because +# the double-high lines will be split. + +ESC="" +CMD='/bin/echo' +OPT='-n' +SUF='' +TMP=/tmp/xterm$$ +eval '$CMD $OPT >$TMP || echo fail >$TMP' 2>/dev/null +( test ! -f $TMP || test -s $TMP ) && +for verb in printf print ; do + rm -f $TMP + eval '$verb "\c" >$TMP || echo fail >$TMP' 2>/dev/null + if test -f $TMP ; then + if test ! -s $TMP ; then + CMD="$verb" + OPT= + SUF='\c' + break + fi + fi +done +rm -f $TMP + +SAVE=yes +WRAP=no +if test $# != 0 ; then + while test $# != 0 + do + case $1 in + -n) SAVE=no ;; + -w) WRAP=yes ;; + esac + shift + done +fi + +if test $SAVE = yes ; then + exec /dev/tty + IFS=';' read junk high wide + + stty $old + + wide=`echo $wide|sed -e 's/t.*//'` + original=${ESC}[8\;${high}\;${wide}t${SUF} + + if ( trap "echo exit" EXIT 2>/dev/null ) >/dev/null + then + trap '$CMD $OPT "$original" >/dev/tty; exit' EXIT HUP INT TRAP TERM + else + trap '$CMD $OPT "$original" >/dev/tty; exit' 0 1 2 5 15 + fi + +fi + +if test $WRAP = yes ; then + # turn on wrapping and force the screen to 80 columns + $CMD $OPT "${ESC}[?7h" >/dev/tty + $CMD $OPT "${ESC}[?40l" >/dev/tty +else + # force the screen to 132 columns + $CMD $OPT "${ESC}[?40h" >/dev/tty + $CMD $OPT "${ESC}[?3h" >/dev/tty +fi + +for SGR in 0 1 4 5 7 +do + $CMD $OPT "${ESC}[0;${SGR}m" >/dev/tty + for DBL in 5 3 4 6 5 + do + $CMD $OPT "${ESC}#${DBL}" >/dev/tty + echo "The quick brown fox jumps over the lazy dog" >/dev/tty + done + echo +done +$CMD $OPT "${ESC}[0m" >/dev/tty diff --git a/comp/src/gb.form.terminal/.hidden/XtermTests/dynamic.pl b/comp/src/gb.form.terminal/.hidden/XtermTests/dynamic.pl new file mode 100644 index 00000000..5932abf4 --- /dev/null +++ b/comp/src/gb.form.terminal/.hidden/XtermTests/dynamic.pl @@ -0,0 +1,132 @@ +#!/usr/bin/env perl +# $XTermId: dynamic.pl,v 1.3 2014/02/26 20:17:07 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 2011,2014 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# Test the dynamic-color query option of xterm. +# The programs xtermcontrol and xtermset provide more options. + +use strict; +use warnings; + +use Getopt::Std; +use IO::Handle; + +our @color_names = ( + "VT100 text foreground", + "VT100 text background", + "text cursor", + "mouse foreground", + "mouse background", + "Tektronix foreground", + "Tektronix background", + "highlight background", + "Tektronix cursor", + "highlight foreground" +); + +our ($opt_c, $opt_r); +&getopts('c:r') || die("Usage: $0 [options]\n +Options:\n + -c XXX set cursor-color + -r reset colors +"); + +sub no_reply($) { + open TTY, "+; + close TTY; + system "stty $old"; + if ( defined $reply ) { + die("^C received\n") if ( "$reply" eq "\003" ); + } + return $reply; +} + +sub query_color($) { + my $code = $_[0]; + my $param1 = $code + 10; + my $reply; + + $reply=get_reply("\x1b]$param1;?\007"); + + return unless defined $reply; + if ( $reply =~ /\x1b]$param1;.*\007/ ) { + my $value = $reply; + + $value =~ s/^\x1b]$param1;//; + $value =~ s/\007//; + + printf "%24s = %s\n", $color_names[$code], $value; + } +} + +sub query_colors() { + my $n; + + for ( $n = 0; $n <= 9; ++$n) { + &query_color($n); + } +} + +sub reset_colors() { + my $n; + + for ( $n = 0; $n <= 9; ++$n) { + my $code = 110 + $n; + &no_reply("\x1b]$code\007"); + } +} + +if ( defined ($opt_c) ) { + &no_reply("\x1b]12;$opt_c\007"); +} +if ( defined ($opt_r) ) { + &reset_colors(); +} + +&query_colors(); diff --git a/comp/src/gb.form.terminal/.hidden/XtermTests/dynamic.sh b/comp/src/gb.form.terminal/.hidden/XtermTests/dynamic.sh new file mode 100644 index 00000000..7f561c9b --- /dev/null +++ b/comp/src/gb.form.terminal/.hidden/XtermTests/dynamic.sh @@ -0,0 +1,89 @@ +#!/bin/sh +# $XTermId: dynamic.sh,v 1.17 2011/12/11 16:21:22 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 1999-2003,2011 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# Demonstrate the use of dynamic colors by setting the background successively +# to different values. + +ESC="" +CMD='/bin/echo' +OPT='-n' +SUF='' +TMP=/tmp/xterm$$ +eval '$CMD $OPT >$TMP || echo fail >$TMP' 2>/dev/null +( test ! -f $TMP || test -s $TMP ) && +for verb in printf print ; do + rm -f $TMP + eval '$verb "\c" >$TMP || echo fail >$TMP' 2>/dev/null + if test -f $TMP ; then + if test ! -s $TMP ; then + CMD="$verb" + OPT= + SUF='\c' + break + fi + fi +done +rm -f $TMP + +LIST="00 30 80 d0 ff" + +exec /dev/tty +read original +stty $old +original=${original}${SUF} + +if ( trap "echo exit" EXIT 2>/dev/null ) >/dev/null +then + trap '$CMD $OPT "$original" >/dev/tty; exit' EXIT HUP INT TRAP TERM +else + trap '$CMD $OPT "$original" >/dev/tty; exit' 0 1 2 5 15 +fi + +while true +do + for R in $LIST + do + for G in $LIST + do + for B in $LIST + do + $CMD $OPT "${ESC}]11;rgb:$R/$G/$B${SUF}" >/dev/tty + sleep 1 + done + done + done +done diff --git a/comp/src/gb.form.terminal/.hidden/XtermTests/dynamic2.sh b/comp/src/gb.form.terminal/.hidden/XtermTests/dynamic2.sh new file mode 100644 index 00000000..36748a60 --- /dev/null +++ b/comp/src/gb.form.terminal/.hidden/XtermTests/dynamic2.sh @@ -0,0 +1,114 @@ +#!/bin/sh +# $XTermId: dynamic2.sh,v 1.3 2011/12/11 16:21:22 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 2006,2011 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# Demonstrate the use of dynamic colors by setting each dynamic color +# successively to different values. + +ESC="" +CMD='/bin/echo' +OPT='-n' +SUF='' +TMP=/tmp/xterm$$ +eval '$CMD $OPT >$TMP || echo fail >$TMP' 2>/dev/null +( test ! -f $TMP || test -s $TMP ) && +for verb in printf print ; do + rm -f $TMP + eval '$verb "\c" >$TMP || echo fail >$TMP' 2>/dev/null + if test -f $TMP ; then + if test ! -s $TMP ; then + CMD="$verb" + OPT= + SUF='\c' + break + fi + fi +done +rm -f $TMP + +LIST="00 30 80 d0 ff" +FULL="10 11 12 13 14 15 16 17 18" + +echo "reading current color settings" + +exec /dev/tty + read reply + eval original$N='${reply}${SUF}' + original=${original}${reply}${SUF} +done +stty $old + +if ( trap "echo exit" EXIT 2>/dev/null ) >/dev/null +then + trap '$CMD $OPT "$original" >/dev/tty; exit' EXIT HUP INT TRAP TERM +else + trap '$CMD $OPT "$original" >/dev/tty; exit' 0 1 2 5 15 +fi + +while true +do + for N in $FULL + do + case $N in + 10) echo "coloring text foreground";; + 11) echo "coloring text background";; + 12) echo "coloring text cursor";; + 13) echo "coloring mouse foreground";; + 14) echo "coloring mouse background";; + 15) echo "coloring tektronix foreground";; + 16) echo "coloring tektronix background";; + 17) echo "coloring highlight background";; + 18) echo "coloring tektronix cursor";; + esac + for R in $LIST + do + for G in $LIST + do + for B in $LIST + do + $CMD $OPT "${ESC}]$N;rgb:$R/$G/$B${SUF}" >/dev/tty + sleep 1 + done + done + done + eval 'restore=$'original$N + $CMD $OPT "$restore" >/dev/tty + sleep 1 + done +done diff --git a/comp/src/gb.form.terminal/.hidden/XtermTests/fonts.sh b/comp/src/gb.form.terminal/.hidden/XtermTests/fonts.sh new file mode 100644 index 00000000..c9e7657a --- /dev/null +++ b/comp/src/gb.form.terminal/.hidden/XtermTests/fonts.sh @@ -0,0 +1,88 @@ +#!/bin/sh +# $XTermId: fonts.sh,v 1.11 2011/12/11 16:21:22 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 1999-2003,2011 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# Demonstrate the use of dynamic colors by setting the background successively +# to different values. + +ESC="" +CMD='/bin/echo' +OPT='-n' +SUF='' +TMP=/tmp/xterm$$ +eval '$CMD $OPT >$TMP || echo fail >$TMP' 2>/dev/null +( test ! -f $TMP || test -s $TMP ) && +for verb in printf print ; do + rm -f $TMP + eval '$verb "\c" >$TMP || echo fail >$TMP' 2>/dev/null + if test -f $TMP ; then + if test ! -s $TMP ; then + CMD="$verb" + OPT= + SUF='\c' + break + fi + fi +done +rm -f $TMP + +exec /dev/tty +read original + +stty $old +original="${original}${SUF}" + +if ( trap "echo exit" EXIT 2>/dev/null ) >/dev/null +then + trap '$CMD $OPT "$original" >/dev/tty; exit' EXIT HUP INT TRAP TERM +else + trap '$CMD $OPT "$original" >/dev/tty; exit' 0 1 2 5 15 +fi + +F=1 +D=1 +T=6 +while true +do + $CMD $OPT "${ESC}]50;#$F${SUF}" >/dev/tty + #sleep 1 + if test .$D = .1 ; then + test $F = $T && D=-1 + else + test $F = 1 && D=1 + fi + F=`expr $F + $D` +done diff --git a/comp/src/gb.form.terminal/.hidden/XtermTests/paste64.pl b/comp/src/gb.form.terminal/.hidden/XtermTests/paste64.pl new file mode 100644 index 00000000..6eeeeedc --- /dev/null +++ b/comp/src/gb.form.terminal/.hidden/XtermTests/paste64.pl @@ -0,0 +1,190 @@ +#!/usr/bin/env perl +# $XTermId: paste64.pl,v 1.13 2014/12/28 21:16:36 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 2006,2014 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# Test the paste64 option of xterm. + +use strict; +use warnings; + +use Term::ReadKey; +use IO::Handle; +use MIME::Base64; + +our $target = ""; + +sub to_hex($) { + my $value = $_[0]; + my $result = ""; + my $n; + + for ( $n = 0 ; $n < length($value) ; ++$n ) { + $result .= sprintf( "%02X", ord substr( $value, $n, 1 ) ); + } + return $result; +} + +sub show_string($) { + my $value = $_[0]; + my $n; + + my $result = ""; + for ( $n = 0 ; $n < length($value) ; $n += 1 ) { + my $c = ord substr( $value, $n, 1 ); + if ( $c == ord '\\' ) { + $result .= "\\\\"; + } + elsif ( $c == 0x1b ) { + $result .= "\\E"; + } + elsif ( $c == 0x7f ) { + $result .= "^?"; + } + elsif ( $c == 32 ) { + $result .= "\\s"; + } + elsif ( $c < 32 ) { + $result .= sprintf( "^%c", $c + 64 ); + } + elsif ( $c > 128 ) { + $result .= sprintf( "\\%03o", $c ); + } + else { + $result .= chr($c); + } + } + + printf "%s\r\n", $result; +} + +sub get_reply($) { + my $command = $_[0]; + my $reply = ""; + + printf "send: "; + show_string($command); + + print STDOUT $command; + autoflush STDOUT 1; + while (1) { + my $test = ReadKey 1; + last if not defined $test; + + #printf "%d:%s\r\n", length($reply), to_hex($test); + $reply .= $test; + } + return $reply; +} + +sub get_paste() { + my $reply = get_reply( "\x1b]52;" . $target . ";?\x1b\\" ); + + printf "read: "; + show_string($reply); + + my $data = $reply; + $data =~ s/^\x1b]52;[[:alnum:]]*;//; + $data =~ s/\x1b\\$//; + printf "chop: "; + show_string($data); + + $data = decode_base64($data); + printf "data: "; + show_string($data); +} + +sub put_paste() { + ReadMode 1; + + printf "data: "; + my $data = ReadLine 0; + chomp $data; + ReadMode 5; + + $data = encode_base64($data); + chomp $data; + printf "data: "; + show_string($data); + + my $send = "\x1b]52;" . $target . ";" . $data . "\x1b\\"; + + printf "send: "; + show_string($send); + print STDOUT $send; + autoflush STDOUT 1; +} + +sub set_target() { + ReadMode 1; + + printf "target: "; + $target = ReadLine 0; + $target =~ s/[^[:alnum:]]//g; + ReadMode 5; + printf "result: %s\r\n", $target; +} + +ReadMode 5, 'STDIN'; # allow single-character inputs +while (1) { + my $cmd; + + printf "\r\nCommand (? for help):"; + $cmd = ReadKey 0; + if ( $cmd eq "?" ) { + printf "\r\np=put selection," + . " g=get selection," + . " q=quit," + . " r=reset target," + . " s=set target\r\n"; + } + elsif ( $cmd eq "p" ) { + printf " ...put selection\r\n"; + put_paste(); + } + elsif ( $cmd eq "g" ) { + printf " ...get selection\r\n"; + get_paste(); + } + elsif ( $cmd eq "q" ) { + printf " ...quit\r\n"; + last; + } + elsif ( $cmd eq "r" ) { + printf " ...reset\r\n"; + $target = ""; + } + elsif ( $cmd eq "s" ) { + printf " ...set target\r\n"; + set_target(); + } +} +ReadMode 0, 'STDIN'; # Reset tty mode before exiting diff --git a/comp/src/gb.form.terminal/.hidden/XtermTests/query-color.pl b/comp/src/gb.form.terminal/.hidden/XtermTests/query-color.pl new file mode 100644 index 00000000..38e9a350 --- /dev/null +++ b/comp/src/gb.form.terminal/.hidden/XtermTests/query-color.pl @@ -0,0 +1,169 @@ +#!/usr/bin/env perl +# $XTermId: query-color.pl,v 1.4 2014/02/26 20:14:40 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 2012,2014 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# Test the color-query features of xterm using OSC 4. + +# TODO: extend to the OSC 5 colors +# TODO: show result in #rrggbb format. + +use strict; +use warnings; + +use Getopt::Std; +use IO::Handle; + +our ( $opt_s ); +&getopts('s') || die( + "Usage: $0 [options] [color1[-color2]]\n +Options:\n + -s use ^G rather than ST +" +); + +our $ST = $opt_s ? "\007" : "\x1b\\"; + +sub no_reply($) { + open TTY, "+; + close TTY; + system "stty $old"; + if ( defined $reply ) { + die("^C received\n") if ( "$reply" eq "\003" ); + } + return $reply; +} + +sub visible($) { + my $reply = $_[0]; + my $n; + my $result = ""; + for ( $n = 0 ; $n < length($reply) ; ) { + my $c = substr( $reply, $n, 1 ); + if ( $c =~ /[[:print:]]/ ) { + $result .= $c; + } + else { + my $k = ord substr( $reply, $n, 1 ); + if ( ord $k == 0x1b ) { + $result .= "\\E"; + } + elsif ( $k == 0x7f ) { + $result .= "^?"; + } + elsif ( $k == 32 ) { + $result .= "\\s"; + } + elsif ( $k < 32 ) { + $result .= sprintf( "^%c", $k + 64 ); + } + elsif ( $k > 128 ) { + $result .= sprintf( "\\%03o", $k ); + } + else { + $result .= chr($k); + } + } + $n += 1; + } + + return $result; +} + +sub query_color($) { + my $param = $_[0]; + my $reply; + my $n; + my $st = $opt_s ? qr/\007/ : qr/\x1b\\/; + my $op = 4; + my $osc = qr/\x1b]$op/; + my $match = qr/${osc}.*${st}/; + + $reply = get_reply( "\x1b]$op;" . $param . ";?" . $ST ); + + printf "query{%s}%*s", &visible($param), 3 - length($param), " "; + + if ( defined $reply ) { + printf "%2d ", length($reply); + if ( $reply =~ /${match}/ ) { + + $reply =~ s/^${osc}//; + $reply =~ s/^;//; + $reply =~ s/${st}$//; + } + else { + printf "? "; + } + + printf "{%s}", visible($reply); + } + printf "\n"; +} + +sub query_colors($$) { + my $lo = $_[0]; + my $hi = $_[1]; + my $n; + for ( $n = $lo ; $n <= $hi ; ++$n ) { + query_color($n); + } +} + +if ( $#ARGV >= 0 ) { + while ( $#ARGV >= 0 ) { + if ( $ARGV[0] =~ /-/ ) { + my @args = split /-/, $ARGV[0]; + &query_colors ( $args[0], $args[1] ); + } else { + &query_colors ( $ARGV[0], $ARGV[0] ); + } + shift @ARGV; + } +} else { + &query_colors(0,7); +} diff --git a/comp/src/gb.form.terminal/.hidden/XtermTests/query-fonts.pl b/comp/src/gb.form.terminal/.hidden/XtermTests/query-fonts.pl new file mode 100644 index 00000000..526055cd --- /dev/null +++ b/comp/src/gb.form.terminal/.hidden/XtermTests/query-fonts.pl @@ -0,0 +1,167 @@ +#!/usr/bin/env perl +# $XTermId: query-fonts.pl,v 1.6 2014/02/26 20:14:50 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 2010,2014 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# Test the font-query features of xterm. + +# TODO: +# test relative vs absolute font numbering +# test all font-slots +# test selection +# test bold / wide / widebold +# test actual fontname vs nominal +# extend "CSI > Ps; Ps T" to query fontname in hex + +use strict; +use warnings; + +use Getopt::Std; +use IO::Handle; + +our ( $opt_a, $opt_r, $opt_s ); +&getopts('ars') || die( + "Usage: $0 [options]\n +Options:\n + -a test using absolute numbers + -r test using relative numbers + -s use ^G rather than ST +" +); + +our $ST = $opt_s ? "\007" : "\x1b\\"; + +sub no_reply($) { + open TTY, "+; + close TTY; + system "stty $old"; + if ( defined $reply ) { + die("^C received\n") if ( "$reply" eq "\003" ); + } + return $reply; +} + +sub query_font($) { + my $param = $_[0]; + my $reply; + my $n; + my $st = $opt_s ? qr/\007/ : qr/\x1b\\/; + my $osc = qr/\x1b]50/; + my $match = qr/${osc}.*${st}/; + + $reply = get_reply( "\x1b]50;?" . $param . $ST ); + + printf "query{%s}%*s", $param, 3 - length($param), " "; + + if ( defined $reply ) { + printf "%2d ", length($reply); + if ( $reply =~ /${match}/ ) { + + $reply =~ s/^${osc}//; + $reply =~ s/^;//; + $reply =~ s/${st}$//; + } + else { + printf "? "; + } + + my $result = ""; + for ( $n = 0 ; $n < length($reply) ; ) { + my $c = substr( $reply, $n, 1 ); + if ( $c =~ /[[:print:]]/ ) { + $result .= $c; + } + else { + my $k = ord substr( $reply, $n, 1 ); + if ( ord $k == 0x1b ) { + $result .= "\\E"; + } + elsif ( $k == 0x7f ) { + $result .= "^?"; + } + elsif ( $k == 32 ) { + $result .= "\\s"; + } + elsif ( $k < 32 ) { + $result .= sprintf( "^%c", $k + 64 ); + } + elsif ( $k > 128 ) { + $result .= sprintf( "\\%03o", $k ); + } + else { + $result .= chr($k); + } + } + $n += 1; + } + + printf "{%s}", $result; + } + printf "\n"; +} + +if ($opt_r) { + my $n; + query_font("-"); + foreach $n ( 0 .. 5 ) { + query_font( sprintf "-%d", $n ); + } + query_font("+"); + foreach $n ( 0 .. 5 ) { + query_font( sprintf "+%d", $n ); + } +} +if ($opt_a) { + my $n; + foreach $n ( 0 .. 5 ) { + query_font( sprintf "%d", $n ); + } +} +if ( not $opt_a and not $opt_r ) { + query_font(""); +} diff --git a/comp/src/gb.form.terminal/.hidden/XtermTests/resize.pl b/comp/src/gb.form.terminal/.hidden/XtermTests/resize.pl new file mode 100644 index 00000000..f1407754 --- /dev/null +++ b/comp/src/gb.form.terminal/.hidden/XtermTests/resize.pl @@ -0,0 +1,141 @@ +#!/usr/bin/env perl +# $XTermId: resize.pl,v 1.5 2014/10/07 21:10:15 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 2004,2014 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# resize.sh rewritten into Perl for comparison. +# See also Term::ReadKey. + +use strict; +use warnings; + +use IO::Handle; + +sub write_tty { + open TTY, "+; + close TTY; + system "stty $old"; + return $reply; +} + +sub csi_field { + my $first = $_[0]; + my $second = $_[1]; + $first =~ s/^[^0-9]+//; + while ( --$second > 0 ) { + $first =~ s/^[\d]+//; + $first =~ s/^[^\d]+//; + } + $first =~ s/[^\d]+.*$//; + return $first; +} + +our $original=get_reply("\x1b[18t"); +our $high; +our $wide; + +if ( defined($original) and ( $original =~ /\x1b\[8;\d+;\d+t/ ) ) { + $high=csi_field($original,2); + $wide=csi_field($original,3); + printf "parsed terminal size $high,$wide\n"; +} else { + die "Cannot get current terminal size via escape sequence\n"; +} +# +our $maximize=get_reply("\x1b[19t"); +our $maxhigh; +our $maxwide; + +if ( defined($maximize) and ( $maximize =~ /^\x1b\[9;\d+;\d+t/ ) ) { + $maxhigh=csi_field($maximize,2); + $maxwide=csi_field($maximize,3); + $maxhigh != 0 or $maxhigh = $high * 2; + $maxwide != 0 or $maxwide = $wide * 2; + printf "parsed terminal maxsize $maxhigh,$maxwide\n"; +} else { + die "Cannot get maximum terminal size via escape sequence\n"; +} + +our $zapped; +our ( $w, $h, $a ); + +sub catch_zap { + $zapped++; +} +$SIG{INT} = \&catch_zap; +$SIG{QUIT} = \&catch_zap; +$SIG{KILL} = \&catch_zap; +$SIG{HUP} = \&catch_zap; +$SIG{TERM} = \&catch_zap; + +$w=$wide; +$h=$high; +$a=1; +$zapped=0; +while ( $zapped == 0 ) +{ +# sleep 1 + printf "resizing to $h by $w\n"; + write_tty("\x1b[8;$h;$w" . "t"); + if ( $a == 1 ) { + if ( $w == $maxwide ) { + $h += $a; + if ( $h = $maxhigh ) { + $a = -1; + } + } else { + $w += $a; + } + } else { + if ( $w == $wide ) { + $h += $a; + if ( $h = $high ) { + $a=1; + } + } else { + $w += $a; + } + } +} +write_tty($original); diff --git a/comp/src/gb.form.terminal/.hidden/XtermTests/resize.sh b/comp/src/gb.form.terminal/.hidden/XtermTests/resize.sh new file mode 100644 index 00000000..30ff2845 --- /dev/null +++ b/comp/src/gb.form.terminal/.hidden/XtermTests/resize.sh @@ -0,0 +1,111 @@ +#!/bin/sh +# $XTermId: resize.sh,v 1.17 2011/12/11 16:21:22 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 1999-2003,2011 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# Obtain the current screen size, then resize the terminal to the nominal +# screen width/height, and restore the size. + +ESC="" +CMD='/bin/echo' +OPT='-n' +SUF='' +TMP=/tmp/xterm$$ +eval '$CMD $OPT >$TMP || echo fail >$TMP' 2>/dev/null +( test ! -f $TMP || test -s $TMP ) && +for verb in printf print ; do + rm -f $TMP + eval '$verb "\c" >$TMP || echo fail >$TMP' 2>/dev/null + if test -f $TMP ; then + if test ! -s $TMP ; then + CMD="$verb" + OPT= + SUF='\c' + break + fi + fi +done +rm -f $TMP + +exec /dev/tty +IFS=';' read junk high wide + +$CMD $OPT "${ESC}[19t${SUF}" > /dev/tty +IFS=';' read junk maxhigh maxwide + +stty $old + +wide=`echo $wide|sed -e 's/t.*//'` +maxwide=`echo $maxwide|sed -e 's/t.*//'` +original=${ESC}[8\;${high}\;${wide}t${SUF} + +test $maxwide = 0 && maxwide=`expr $wide \* 2` +test $maxhigh = 0 && maxhigh=`expr $high \* 2` + +if ( trap "echo exit" EXIT 2>/dev/null ) >/dev/null +then + trap '$CMD $OPT "$original" >/dev/tty; exit' EXIT HUP INT TRAP TERM +else + trap '$CMD $OPT "$original" >/dev/tty; exit' 0 1 2 5 15 +fi + +w=$wide +h=$high +a=1 +while true +do +# sleep 1 + echo resizing to $h by $w + $CMD $OPT "${ESC}[8;${h};${w}t" >/dev/tty + if test $a = 1 ; then + if test $w = $maxwide ; then + h=`expr $h + $a` + if test $h = $maxhigh ; then + a=-1 + fi + else + w=`expr $w + $a` + fi + else + if test $w = $wide ; then + h=`expr $h + $a` + if test $h = $high ; then + a=1 + fi + else + w=`expr $w + $a` + fi + fi +done diff --git a/comp/src/gb.form.terminal/.hidden/XtermTests/tcapquery.pl b/comp/src/gb.form.terminal/.hidden/XtermTests/tcapquery.pl new file mode 100644 index 00000000..dce8b098 --- /dev/null +++ b/comp/src/gb.form.terminal/.hidden/XtermTests/tcapquery.pl @@ -0,0 +1,325 @@ +#!/usr/bin/env perl +# $XTermId: tcapquery.pl,v 1.19 2014/02/26 20:15:12 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 2004-2010,2014 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# Test the tcap-query option of xterm. + +use strict; +use warnings; + +use Getopt::Std; +use IO::Handle; + +our ($opt_a, $opt_b, $opt_c, $opt_e, $opt_f, $opt_i, $opt_k, $opt_m, $opt_t, $opt_x, $opt_X); +&getopts('abcefikmt:x:X') || die("Usage: $0 [options]\n +Options:\n + -a (same as -c -e -f -k -m) + -b use both terminfo and termcap (default is termcap) + -c cursor-keys + -e editing keypad-keys + -f function-keys + -i use terminfo rather than termcap names + -k numeric keypad-keys + -m miscellaneous (none of -c, -e, -f, -k) + -t NAME use given NAME for \$TERM, set that in xterm's tcap keyboard + -x KEY extended cursor/editing key (terminfo only) + -X test all extended cursor- and/or editing-keys (terminfo) +"); + +if ( not ( defined($opt_c) + or defined($opt_e) + or defined($opt_f) + or defined($opt_k) + or defined($opt_m) + or defined($opt_x) ) ) { + $opt_a=1; +} + +sub no_reply($) { + open TTY, "+; + close TTY; + system "stty $old"; + if ( defined $reply ) { + die("^C received\n") if ( "$reply" eq "\003" ); + } + return $reply; +} + +sub hexified($) { + my $value = $_[0]; + my $result = ""; + my $n; + + for ( $n = 0; $n < length($value); ++$n) { + $result .= sprintf("%02X", ord substr($value,$n,1)); + } + return $result; +} + +sub modify_tcap($) { + my $name = $_[0]; + my $param = hexified($name); + no_reply("\x1bP+p" . $param . "\x1b\\"); +} + +sub query_tcap($$) { + my $tcap = $_[0]; + my $tinfo = $_[1]; + my $param1 = hexified($tcap); + my $param2 = hexified($tinfo); + my $reply; + + # uncomment one of the following lines + if ( defined($opt_b) ) { + $reply=get_reply("\x1bP+q" . $param1 . ";" . $param2 . "\x1b\\"); + } elsif ( defined($opt_i) ) { + $reply=get_reply("\x1bP+q" . $param2 . "\x1b\\"); + } else { + $reply=get_reply("\x1bP+q" . $param1 . "\x1b\\"); + } + + return unless defined $reply; + if ( $reply =~ /\x1bP1\+r[[:xdigit:]]+=[[:xdigit:]]*.*/ ) { + my $value = $reply; + my $n; + + $value =~ s/^\x1bP1\+r//; + $value =~ s/\x1b\\//; + + my $result = ""; + for ( $n = 0; $n < length($value); ) { + my $c = substr($value,$n,1); + # handle semicolon and equals + if ( $c =~ /[[:punct:]]/ ) { + $n += 1; + $result .= $c; + } else { + # handle hex-data + my $k = hex substr($value,$n,2); + if ( $k == 0x1b ) { + $result .= "\\E"; + } elsif ( $k == 0x7f ) { + $result .= "^?"; + } elsif ( $k == 32 ) { + $result .= "\\s"; + } elsif ( $k < 32 ) { + $result .= sprintf("^%c", $k + 64); + } elsif ( $k > 128 ) { + $result .= sprintf("\\%03o", $k); + } else { + $result .= chr($k); + } + $n += 2; + } + } + + printf "%s\n", $result; + } +} + +# extended-keys are a feature of ncurses 5.0 and later +sub query_extended($) { + my $name = $_[0]; + my $n; + + $name = "k" . $name if ( $name !~ /^k/ ); + + for ( $n = 2; $n <= 7; ++$n) { + my $test = $name; + $test = $test . $n if ( $n > 2 ); + query_tcap( $name, $test ); + } +} + +query_tcap( "TN", "name"); +if ( defined($opt_t) ) { + printf "Setting TERM=%s\n", $opt_t; + modify_tcap($opt_t); +} + +# See xtermcapKeycode() +if ( defined($opt_a) || defined($opt_c) ) { +query_tcap( "ku", "kcuu1"); +query_tcap( "kd", "kcud1"); +query_tcap( "kr", "kcuf1"); +query_tcap( "kl", "kcub1"); + +query_tcap( "kF", "kind"); +query_tcap( "kR", "kri"); +query_tcap( "%i", "kRIT"); +query_tcap( "#4", "kLFT"); +} + +if ( defined($opt_a) || defined($opt_e) ) { +query_tcap( "kD", "kdch1"); +query_tcap( "kI", "kich1"); + +query_tcap( "kh", "khome"); +query_tcap( "\@7", "kend"); +query_tcap( "#2", "kHOM"); +query_tcap( "*7", "kEND"); + +query_tcap( "*6", "kslt"); +query_tcap( "#6", "kSLT"); +query_tcap( "\@0", "kfnd"); +query_tcap( "*0", "kFND"); + +query_tcap( "kN", "knp"); +query_tcap( "kP", "kpp"); + +query_tcap( "%c", "kNXT"); +query_tcap( "%e", "kPRV"); +} + +if ( defined($opt_a) || defined($opt_f) ) { +query_tcap( "k1", "kf1"); +query_tcap( "k2", "kf2"); +query_tcap( "k3", "kf3"); +query_tcap( "k4", "kf4"); +query_tcap( "k5", "kf5"); +query_tcap( "k6", "kf6"); +query_tcap( "k7", "kf7"); +query_tcap( "k8", "kf8"); +query_tcap( "k9", "kf9"); +query_tcap( "k;", "kf10"); +query_tcap( "F1", "kf11"); +query_tcap( "F2", "kf12"); +query_tcap( "F3", "kf13"); +query_tcap( "F4", "kf14"); +query_tcap( "F5", "kf15"); +query_tcap( "F6", "kf16"); +query_tcap( "F7", "kf17"); +query_tcap( "F8", "kf18"); +query_tcap( "F9", "kf19"); +query_tcap( "FA", "kf20"); +query_tcap( "FB", "kf21"); +query_tcap( "FC", "kf22"); +query_tcap( "FD", "kf23"); +query_tcap( "FE", "kf24"); +query_tcap( "FF", "kf25"); +query_tcap( "FG", "kf26"); +query_tcap( "FH", "kf27"); +query_tcap( "FI", "kf28"); +query_tcap( "FJ", "kf29"); +query_tcap( "FK", "kf30"); +query_tcap( "FL", "kf31"); +query_tcap( "FM", "kf32"); +query_tcap( "FN", "kf33"); +query_tcap( "FO", "kf34"); +query_tcap( "FP", "kf35"); +query_tcap( "FQ", "kf36"); +query_tcap( "FR", "kf37"); +query_tcap( "FS", "kf38"); +query_tcap( "FT", "kf39"); +query_tcap( "FU", "kf40"); +query_tcap( "FV", "kf41"); +query_tcap( "FW", "kf42"); +query_tcap( "FX", "kf43"); +query_tcap( "FY", "kf44"); +query_tcap( "FZ", "kf45"); +query_tcap( "Fa", "kf46"); +query_tcap( "Fb", "kf47"); +query_tcap( "Fc", "kf48"); +query_tcap( "Fd", "kf49"); +query_tcap( "Fe", "kf50"); +query_tcap( "Ff", "kf51"); +query_tcap( "Fg", "kf52"); +query_tcap( "Fh", "kf53"); +query_tcap( "Fi", "kf54"); +query_tcap( "Fj", "kf55"); +query_tcap( "Fk", "kf56"); +query_tcap( "Fl", "kf57"); +query_tcap( "Fm", "kf58"); +query_tcap( "Fn", "kf59"); +query_tcap( "Fo", "kf60"); +query_tcap( "Fp", "kf61"); +query_tcap( "Fq", "kf62"); +query_tcap( "Fr", "kf63"); +} + +if ( defined($opt_a) || defined($opt_k) ) { +query_tcap( "K1", "ka1"); +query_tcap( "K3", "ka3"); +query_tcap( "K4", "kc1"); +query_tcap( "K5", "kc3"); +} + +if ( defined($opt_a) || defined($opt_m) ) { +query_tcap( "kB", "kcbt"); +query_tcap( "kC", "kclr"); +query_tcap( "&8", "kund"); + +query_tcap( "kb", "kbs"); + +query_tcap( "%1", "khlp"); +query_tcap( "#1", "kHLP"); + +query_tcap( "Co", "colors"); +} + +if ( defined ($opt_x) ) { + query_extended($opt_x); +} + +if ( defined ($opt_X) ) { + if ( defined($opt_c) ) { + query_extended("DN"); + query_extended("UP"); + query_extended("LFT"); + query_extended("RIT"); + } + if ( defined($opt_e) ) { + query_extended("DC"); + query_extended("END"); + query_extended("HOM"); + query_extended("IC"); + query_extended("NXT"); + query_extended("PRV"); + } +} diff --git a/comp/src/gb.form.terminal/.hidden/XtermTests/title.sh b/comp/src/gb.form.terminal/.hidden/XtermTests/title.sh new file mode 100644 index 00000000..cc35ac02 --- /dev/null +++ b/comp/src/gb.form.terminal/.hidden/XtermTests/title.sh @@ -0,0 +1,84 @@ +#!/bin/sh +# $XTermId: title.sh,v 1.18 2011/12/11 16:21:22 tom Exp $ +# ----------------------------------------------------------------------------- +# this file is part of xterm +# +# Copyright 1999-2003,2011 by Thomas E. Dickey +# +# All Rights Reserved +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY +# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name(s) of the above copyright +# holders shall not be used in advertising or otherwise to promote the +# sale, use or other dealings in this Software without prior written +# authorization. +# ----------------------------------------------------------------------------- +# Obtain the current title of the window, set up a simple clock which runs +# until this script is interrupted, then restore the title. + +ESC="" +CMD='/bin/echo' +OPT='-n' +SUF='' +TMP=/tmp/xterm$$ +eval '$CMD $OPT >$TMP || echo fail >$TMP' 2>/dev/null +( test ! -f $TMP || test -s $TMP ) && +for verb in printf print ; do + rm -f $TMP + eval '$verb "\c" >$TMP || echo fail >$TMP' 2>/dev/null + if test -f $TMP ; then + if test ! -s $TMP ; then + CMD="$verb" + OPT= + SUF='\c' + break + fi + fi +done +rm -f $TMP + +exec /dev/tty +read original + +stty $old + +# We actually get this terminated by an backslash, but the backslash +# is lost. We may lose doublequote characters when restoring the title, +# depending on the shell. +original=`echo "$original" |sed -e 's/^...//' -e 's/.$//'` +original=${ESC}]2\;"${original}"${SUF} + +if ( trap "echo exit" EXIT 2>/dev/null ) >/dev/null +then + trap '$CMD $OPT "$original" >/dev/tty; exit' EXIT HUP INT TRAP TERM +else + trap '$CMD $OPT "$original" >/dev/tty; exit' 0 1 2 5 15 +fi + +while true +do + sleep 1 + $CMD $OPT "${ESC}]2;`date`" >/dev/tty +done diff --git a/comp/src/gb.form.terminal/.hidden/XtermVT100 b/comp/src/gb.form.terminal/.hidden/XtermVT100 new file mode 100644 index 00000000..23950c49 --- /dev/null +++ b/comp/src/gb.form.terminal/.hidden/XtermVT100 @@ -0,0 +1,457 @@ +# Definitions +c The literal character c +C A single (required) character. +Ps A single (usually optional) numeric parameter, composed of one of more digits. +Pm A multiple numeric parameter composed of any number of single numeric parameters, separated by ; character(s). Individual values for the parameters are listed with Ps . +Pt A text parameter composed of printable characters. +ESC = 27 +CSI = ESC + "[" +OSC = ESC + "]" + + + +# C1 (8-Bit) Control Characters +ESC D IND 0x84 Index +ESC E NEL 0x85 Next Line +ESC H HTS 0x88 Tab Set +ESC M RI 0x8d Reverse Index +ESC N SS2 0x8e Single Shift Select of G2 Character Set: affects next character only +ESC O SS3 0x8f Single Shift Select of G3 Character Set: affects next character only +ESC P DCS 0x90 Device Control String +ESC V SPA 0x96 Start of Guarded Area +ESC W EPA 0x97 End of Guarded Area +ESC X SOS 0x98 Start of String +ESC Z DECID 0x9a Return Terminal ID Obsolete form of CSI c (DA). +ESC [ CSI 0x9b Control Sequence Introducer +ESC \ ST 0x9c String Terminator +ESC ] OSC 0x9d Operating System Command +ESC ^ PM 0x9e Privacy Message +ESC _ APC 0x9f Application Program Command + + +# VT100 Mode +## Single-character functions +BEL Ctrl-G Bell +BS Ctrl-H Backspace +CR Ctrl-M Carriage Return +ENQ Ctrl-E Return Terminal Status . Default response is the terminal name, e.g., "xterm", but may be overridden by a resource answerbackString. +FF Ctrl-L Form Feed or New Page (NP) same as LF +LF Ctrl-J Line Feed or New Line (NL) +SO Ctrl-N Shift Out -> Switch to Alternate Character Set: invokes the G1 character set. +SP Space. +TAB Ctrl-I Horizontal Tab (HT) +VT Ctrl-K Vertical Tab same as LF +SI Ctrl-O Shift In -> Switch to Standard Character Set: invokes the G0 character set (the default). + +## Controls beginning with ESC +Other than those where ESC is part of a 7-bit equivalent to 8-bit C1 controls), ordered by the final character(s). +ESC SP F S7C1T 7-bit controls . +ESC SP G S8C1T 8-bit controls . +ESC SP L Set ANSI conformance level 1 (vt100, 7-bit controls). +ESC SP M Set ANSI conformance level 2 (vt200). +ESC SP N Set ANSI conformance level 3 (vt300). +ESC # 3 DECDHL DEC double-height line, top half +ESC # 4 DECDHL DEC double-height line, bottom half +ESC # 5 DECSWL DEC single-width line +ESC # 6 DECDWL DEC double-width line +ESC # 8 DECALN DEC Screen Alignment Test +ESC % @ ISO 8859-1 Select default character set, (ISO 2022) +ESC % G UTF-8 Select UTF-8 character set (ISO 2022) +ESC ( C Designate G0 Designate G0 Character Set (ISO 2022) +ESC ) C Designate G1 Designate G1 Character Set (ISO 2022) +ESC * C Designate G2 Designate G2 Character Set (ISO 2022) +ESC + C Designate G3 Designate G3 Character Set (ISO 2022) + + ### Final character C for designating character sets (0 , A and B apply to VT100 and up, the remainder to VT220 and up): + 0 DEC Special Character and Line Drawing Set + A United Kingdom (UK) + B United States (USASCII) + 4 Dutch + C Finnish + 5 Finnish + R French + Q French Canadian + K German + Y Italian + E Norwegian/Danish + 6 Norwegian/Danish + Z Spanish + H Swedish + 7 Swedish + = Swiss + + + + +ESC 7 DECSC Save Cursor +ESC 8 DECRC Restore Cursor +ESC = DECPAM Application Keypad () +ESC > DECPNM Normal Keypad () +ESC F Cursor to lower left corner of screen (if enabled by the hpLowerleftBugCompat resource). +ESC c RIS Full Reset () +ESC l Memory Lock (per HP terminals). Locks memory above the cursor. +ESC m Memory Unlock (per HP terminals) +ESC n LS2 Invoke the G2 Character Set () +ESC o LS3 Invoke the G3 Character Set () +ESC | LS3R Invoke the G3 Character Set as GR (). Has no visible effect in xterm. +ESC } LS2R Invoke the G2 Character Set as GR (). Has no visible effect in xterm. +ESC ~ LS1R Invoke the G1 Character Set as GR (). Has no visible effect in xterm. + + +# Application Program-Control functions + +# Functions usingCSI, ordered by the final character(s) +CSI Ps @ ICH Insert Ps (Blank) Character(s) (default = 1)) +CSI Ps A CUU Cursor Up Ps Times (default = 1)) +CSI Ps B CUD Cursor Down Ps Times (default = 1)) +CSI Ps C CUF Cursor Forward Ps Times (default = 1)) +CSI Ps D CUB Cursor Backward Ps Times (default = 1)) +CSI Ps E CNL Cursor Next Line Ps Times (default = 1)) +CSI Ps F CPL Cursor Preceding Line Ps Times (default = 1)) +CSI Ps G CHA Cursor Character Absolute [column] (default = [row,1])) +CSI Ps ; Ps H CUP Cursor Position [row;column] (default = [1,1])) +CSI Ps I CHT Cursor Forward Tabulation Ps tab stops (default = 1)) +CSI Ps J ED Erase in Display) + 0 Erase Below (default) + 1 Erase Above + 2 Erase All + 3 Erase Saved Lines (xterm) + +CSI ? Ps J DECSED Erase in Display) + 0 Erase to Right (default) + 1 Erase to Left + 2 Erase All + +CSI Ps K EL Erase in Line) + 0 Erase to Right (default) + 1 Erase to Left + 2 Erase All +CSI ? Ps K DECSEL Erase in Line + 0 Selective Erase to Right (default) + 1 Selective Erase to Left + 2 Selective Erase All + +CSI Ps L IL Insert Ps Line(s) (default = 1)) +CSI Ps M DL Delete Ps Line(s) (default = 1)) +CSI Ps P DCH Delete Ps Character(s) (default = 1)) +CSI Ps S SU Scroll up Ps lines (default = 1)) +CSI Ps T SD Scroll down Ps lines (default = 1)) +CSI Ps ; Ps ; Ps ; Ps ; Ps T Initiate hilite mouse tracking. Parameters are [func;startx;starty;firstrow;lastrow]. See Mouse Tracking +CSI Ps X ECH Erase Ps Character(s) (default = 1)) +CSI Ps Z CBT Cursor Backward Tabulation Ps tab stops (default = 1)) +CSI Pm ` HPA Character Position Absolute [column] (default = [row,1])) +CSI Ps b REP Repeat the preceding graphic character Ps times) +CSI Ps c Primary DA Send Device Attributes + + 0 , 1 or omitted request attributes from terminal. The response depends on the decTerminalId resource setting + -> CSI ? 1 ; 2 c (``VT100 with Advanced Video Option'') + -> CSI ? 1 ; 0 c (``VT101 with No Options'') + -> CSI ? 6 c (``VT102'') + -> CSI ? 6 0 ; 1 ; 2 ; 6 ; 8 ; 9 ; 1 5 ; c (``VT220'') + The VT100-style response parameters do not mean anything + by themselves. VT220 parameters do, telling the host + what features the terminal supports: + -> 1 132-columns + -> 2 Printer + -> 6 Selective erase + -> 8 User-defined keys + -> 9 National replacement character sets + -> 1 5 Technical characters + +CSI > Ps c Secondary DA Send Device Attributes + 0 , 1 or omitted request the terminal's identification code. The response depends on the decTerminalId resource setting. It should apply only to VT220 and up but xterm extends this to VT100. + -> CSI Pp ; Pv ; Pc c + where Pp denotes the terminal type + -> 0 (``VT100'') + -> 1 (``VT220'') + and Pv is the firmware version (for xterm, this is the + XFree86 patch number, starting with 95). In a DEC terminal, + Pc indicates the ROM cartridge registration number + and is always zero. + + +CSI Pm d VPA Line Position Absolute [row] (default = [1,column])) +CSI Ps ; Ps f HVP Horizontal and Vertical Position [row;column] (default = [1,1])) +CSI Ps g TBC Tab Clear) + 0 Clear Current Column (default) + 3 Clear All + +CSI Pm h SM Set Mode) + 2 Keyboard Action Mode (AM) + 4 Insert Mode (IRM) + 1 2 Send/receive (SRM) + 2 0 Automatic Newline (LNM) + +CSI Pm l RM Reset Mode) + 2 Keyboard Action Mode (AM) + 4 Replace Mode (IRM) + 1 2 Send/receive (SRM) + 2 0 Normal Linefeed (LNM) + +CSI ? Pm h DECSET DEC Private Mode Set + 1 Application Cursor Keys DECCKM + 2 Designate USASCII for character sets G0-G3 (DECANM), and set VT100 mode. + 3 132 Column Mode (DECCOLM) + 4 Smooth (Slow) Scroll (DECSCLM) + 5 Reverse Video (DECSCNM) + 6 Origin Mode (DECOM) + 7 Wraparound Mode (DECAWM) + 8 Auto-repeat Keys (DECARM) + 9 Send Mouse X & Y on button press. See the section Mouse Tracking. + 1 8 Print form feed (DECPFF) + 1 9 Set print extent to full screen (DECPEX) + 2 5 Show Cursor (DECTCEM) + 3 0 Show scrollbar [rxvt]. + 3 5 Enable shifted key-functions [rxvt]. + 3 8 Enter Tektronix Mode (DECTEK) + 4 0 Allow 80 <-> 132 Mode + 4 1 more(1) fix (see curses resource) + 4 2 Enable Nation Replacement Character sets (DECNRCM) + 4 4 Turn On Margin Bell + 4 5 Reverse-wraparound Mode + 4 6 Start Logging (normally disabled by a compile-time option) + 4 7 Use Alternate Screen Buffer (unless disabled by the titleInhibit resource + 6 6 Application keypad (DECNKM) + 6 7 Backarrow key sends delete (DECBKM) + 1 0 0 0 Send Mouse X & Y on button press and release. See the section Mouse Tracking. + 1 0 0 1 Use Hilite Mouse Tracking. + 1 0 0 2 Use Cell Motion Mouse Tracking. + 1 0 0 3 Use All Motion Mouse Tracking. + 1 0 1 0 Scroll to bottom on tty output [rxvt]. + 1 0 1 1 Scroll to bottom on key press [rxvt]. + 1 0 3 5 Enable special modifiers for Alt and NumLock keys. + 1 0 3 6 Send ESC when Meta modifies a key (enables the metaSendsEscaperesource). + 1 0 3 7 Send DEL from the editing-keypad Delete key + 1 0 4 7 Use Alternate Screen Buffer (unless disabled by the titleInhibit resource) + 1 0 4 8 Save cursor as in DECSC (unless disabled by the titleinhibit resource) + 1 0 4 9 Save cursor as in DECSC and use Alternate Screen Buffer, clearing it first (unless disabled by the titleinhibit resource) + 1 0 5 1 Set Sun function-key mode. + 1 0 5 2 Set HP function-key mode. + 1 0 6 0 Set legacy keyboard emulation (X11R6). + 1 0 6 1 Set Sun/PC keyboard emulation of VT220 keyboard. + +CSI ? Pm l DECRST DEC Private Mode Reset) + 1 Normal Cursor Keys DECCKM + 2 Designate VT52 mode (DECANM). + 3 80 Column Mode (DECCOLM) + 4 Jump (Fast) Scroll (DECSCLM) + 5 Normal Video (DECSCNM) + 6 Normal Cursor Mode (DECOM) + 7 No Wraparound Mode (DECAWM) + 8 No Auto-repeat Keys (DECARM) + 9 Don't Send Mouse X & Y on button press + 1 8 Don't print form feed (DECPFF) + 1 9 Limit print to scrolling region (DECPEX) + 2 5 Hide Cursor (DECTCEM) + 3 0 Don't show scrollbar (rxvt). + 3 5 Disable shifted key-functions (rxvt). + 4 0 Disallow 80 <-> 132 Mode + 4 1 No more(1) fix (see curses resource) + 4 2 Disable Nation Replacement Character sets (DECNRCM) + 4 4 Turn Off Margin Bell + 4 5 No Reverse-wraparound Mode + 4 6 Stop Logging (normally disabled by a compile-time option) + 4 7 Use Normal Screen Buffer + 6 6 Numeric keypad (DECNKM) + 6 7 Backarrow key sends backspace (DECBKM) + 1 0 0 0 Don't Send Mouse X & Y on button press and release. See the section Mouse Tracking. + 1 0 0 1 Don't Use Hilite Mouse Tracking + 1 0 0 2 Don't Use Cell Motion Mouse Tracking + 1 0 0 3 Don't Use All Motion Mouse Tracking + 1 0 1 0 Don't scroll to bottom on tty output (rxvt). + 1 0 1 1 Don't scroll to bottom on key press (rxvt). + 1 0 3 5 Disable special modifiers for Alt and NumLock keys. + 1 0 3 6 Don't send ESC when Meta modifies a key (disables the metaSendsEscape resource). + 1 0 3 7 Send VT220 Remove from the editing- keypad Delete key + 1 0 4 7 Use Normal Screen Buffer, clearing screen first if in the Alternate Screen (unless disabled by the titleinhibit resource) + 1 0 4 8 Restore cursor as in DECRC (unless disabled by the titleinhibit resource) + 1 0 4 9 Use Normal Screen Buffer and restore cursor as in DECRC (unless disabled by the titleinhibit resource) + 1 0 5 1 Reset Sun function-key mode. + 1 0 5 2 Reset HP function-key mode. + 1 0 6 0 Reset legacy keyboard emulation (X11R6). + 1 0 6 1 Reset Sun/PC keyboard emulation of VT220 keyboard. + + +CSI Pm i MC Media Copy) + + 0 Print screen (default) + 4 Turn off printer controller mode + 5 Turn on printer controller mode + +CSI ? Pm i MC, DEC-specific Media Copy) + 1 Print line containing cursor + 4 Turn off autoprint mode + 5 Turn on autoprint mode + 1 0 Print composed display, ignores DECPEX + 1 1 Print all pages + + +CSI Pm m SGR Character Attributes) + + 0 Normal (default) + 1 Bold + 4 Underlined + 5 Blink (appears as Bold) + 7 Inverse + 8 Invisible (hidden) + 2 2 Normal (neither bold nor faint) + 2 4 Not underlined + 2 5 Steady (not blinking) + 2 7 Positive (not inverse) + 2 8 Visible (not hidden) + 3 0 Set foreground color to Black + 3 1 Set foreground color to Red + 3 2 Set foreground color to Green + 3 3 Set foreground color to Yellow + 3 4 Set foreground color to Blue + 3 5 Set foreground color to Magenta + 3 6 Set foreground color to Cyan + 3 7 Set foreground color to White + 3 9 Set foreground color to default (original) + 4 0 Set background color to Black + 4 1 Set background color to Red + 4 2 Set background color to Green + 4 3 Set background color to Yellow + 4 4 Set background color to Blue + 4 5 Set background color to Magenta + 4 6 Set background color to Cyan + 4 7 Set background color to White + 4 9 Set background color to default (original). + 9 0 Set foreground color to Black + 9 1 Set foreground color to Red + 9 2 Set foreground color to Green + 9 3 Set foreground color to Yellow + 9 4 Set foreground color to Blue + 9 5 Set foreground color to Magenta + 9 6 Set foreground color to Cyan + 9 7 Set foreground color to White + 1 0 0 Set background color to Black + 1 0 1 Set background color to Red + 1 0 2 Set background color to Green + 1 0 3 Set background color to Yellow + 1 0 4 Set background color to Blue + 1 0 5 Set background color to Magenta + 1 0 6 Set background color to Cyan + 1 0 7 Set background color to White + If 88- or 256-color support is compiled, the following apply. + 3 8 ; 5 ; Ps Set background color to Ps + 4 8 ; 5 ; Ps Set foreground color to Ps + +CSI Ps n DSR Device Status Report) + 5 Status Report CSI 0 n (``OK'') + 6 Report Cursor Position (CPR) [row;column] as CSI r ; c R + +CSI ? Ps n DSR, DEC-specific Device Status Report + 6 Report Cursor Position (CPR) [row;column] as CSI ? r ; c R (assumes page is zero). + 1 5 Report Printer status as CSI ? 1 0 n (ready) or CSI ? 1 1 n (not ready) + 2 5 Report UDK status as CSI ? 2 0 n (unlocked) or CSI ? 2 1 n (locked) + 2 6 Report Keyboard status as: + CSI ? 2 7 ; 1 ; 0 ; 0 n (North American) + CSI ? 5 3 n Locator available, if compiled-in, or + CSI ? 5 0 n No Locator, if not. +CSI ! p DECSTR Soft terminal reset +CSI Ps ; Ps " p Set conformance level DECSCL + Valid values for the first parameter + 6 1 VT100 + 6 2 VT200 + 6 3 VT300 + + Valid values for the second parameter + 0 8-bit controls + 1 7-bit controls (always set for VT100) + 2 8-bit controls + +CSI Pt ; Pl ; Pb ; Pr ` w DECEFR Enable Filter Rectangle + Parameters are [top;left;bottom;right]. Defines the coordinates of a filter rectangle and acti- vates it. Anytime the locator is detected outside of the filter rectangle, an outside rectangle event is generated and the rectangle is disabled. Filter rectangles are always treated as "one-shot" events. Any parameters that are omitted default to the current locator position. If all parameters are omitted, any locator motion will be reported. DECELR always cancels any prevous rectangle definition. + +CSI Ps x DECREQTPARM Request Terminal Parameters) +CSI Ps ; Pu ` z DECELR Enable Locator Reporting + The first parameter + 0 Locator disabled (default) + 1 Locator enabled + 2 Locator enabled for one report, then disabled + The second parameter specifies the coordinate unit for locator reports. + 0 or omitted default to character cells + 1 device physical pixels + 2 character cells + +CSI Pm ` { DECSLE Select Locator Events + Valid values for the first (and any additional parameters) are: + 0 only respond to explicit host requests DECRQLP (default) also cancels any filter rectangle + 1 report button down transitions + 2 do not report button down transitions + 3 report button up transitions + 4 do not report button up transitions + +CSI Ps ` | DECRQLP Request Locator Position + Valid values for the parameter are: + 0 , 1 or omitted transmit a single DECLRP locator report + If Locator Reporting has been enabled by a DECELR, xterm will respond with a DECLRP Locator Report. This report is also generated on button up and down events if they have been enabled with a DECSLE, or when the locator is detected outside of a filter rectangle, if filter rectangles have been enabled with a DECEFR. + +CSI Pe ; Pb ; Pr ; Pc ; Pp & w DECLRP Locator Report + Parameters are [event;button;row;column;page]. + Valid values for the event (Pe): + 0 locator unavailable - no other parameters sent + 1 request - xterm received a DECRQLP + 2 left button down + 3 left button up + 4 middle button down + 5 middle button up + 6 right button down + 7 right button up + 8 M4 button down + 9 M4 button up + 1 0 locator outside filter rectangle + ``button'' parameter (Pb) is a bitmask indicating which buttons are pressed: + == 0 no buttons down + & 1 right button down + & 2 middle button down + & 4 left button down + & 8 M4 button down + ``row'' and ``column'' parameters (Pr, Pc) are the coordinates of the locator position in the xterm window, encoded as ASCII decimal. + The ``page'' parameter (Pp) is not used by xterm, and will be omitted. + +# Operating System Controls +OSC Ps ; Pt ST Set Text Parameters. For colors and font, if Pt is a "?", the control sequence elicits a response which consists of the control sequence which would set the corresponding value. The dtterm control sequences allow you to determine the icon name and window title. +OSC Ps ; Pt BEL + 0 Change Icon Name and Window Title to Pt + 1 Change Icon Name to Pt + 2 Change Window Title to Pt + 3 Set X property on top-level window. Pt should be in the form "prop=value", or just "prop" to delete the property + 4 ; c ; name Change Color #c to cname. Any number of c name pairs may be given. + 1 0 Change color names starting with text foreground to Pt (a list of one or more color names or RGB specifications, separated by semicolon, up to eight, as per XParseColor). + 1 1 Change colors starting with text background to Pt + 1 2 Change colors starting with text cursor to Pt + 1 3 Change colors starting with mouse foreground to Pt + 1 4 Change colors starting with mouse background to Pt + 1 5 Change colors starting with Tek foreground to Pt + 1 6 Change colors starting with Tek background to Pt + 1 7 Change colors starting with highlight to Pt + 4 6 Change Log File to Pt (normally disabled by a compile-time option) + 5 0 Set Font to Pt If Pt begins with a "#", index in the font menu, relative (if the next character is a plus or minus sign) or absolute. A number is expected but not required after the sign (the default is the current entry for relative, zero for absolute indexing). + + + +======================================================= Mouse ================ +Mouse Tracking + +The VT widget can be set to send the mouse position and other informa- tion on button presses. These modes are typically used by editors and other full-screen applications that want to make use of the mouse. +There are six mutually exclusive modes. One is DEC Locator mode, enabled by the DECELR CSI Ps ; Ps 'z control sequence, and is not described here. The remaining five modes are each enabled (or disabled) by a different parameter in DECSET CSI ? Pm h or DECRST CSI ? Pm l con- trol sequence. + +Manifest constants for the parameter values are defined in xcharmouse.h as follows: +#define SET_X10_MOUSE 9 +#define SET_VT200_MOUSE 1000 +#define SET_VT200_HIGHLIGHT_MOUSE 1001 +#define SET_BTN_EVENT_MOUSE 1002 +#define SET_ANY_EVENT_MOUSE 1003 +The motion reporting modes are strictly xterm extensions, and are not part of any standard, though they are analogous to the DEC VT200 DECELR locator reports. + +Parameters (such as pointer position and button number) for all mouse tracking escape sequences generated by xterm encode numeric parameters in a single character as value+32. For example, ! specifies the value 1. The upper left character position on the terminal is denoted as 1,1. +X10 compatibility mode sends an escape sequence only on button press, encoding the location and the mouse button pressed. It is enabled by specifying parameter 9 to DECSET. On button press, xterm sends CSI M CbCxCy (6 characters). Cb is button-1. Cx and Cy are the x and y coor- dinates of the mouse when the button was pressed. +Normal tracking mode sends an escape sequence on both button press and release. Modifier key (shift, ctrl, meta) information is also sent. It is enabled by specifying parameter 1000 to DECSET. On button press or release, xterm sends CSI M CbCxCy. The low two bits of Cb encode button information: 0=MB1 pressed, 1=MB2 pressed, 2=MB3 pressed, 3=release. The next three bits encode the modifiers which were down when the button was pressed and are added together: 4=Shift, 8=Meta, 16=Control. Note however that the shift and control bits are normally unavailable because xterm uses the control modifier with mouse for popup menus, and the shift modifier is used in the default translations for button events. The Meta modifier recognized by xterm is the mod1 mask, and is not nec- essarily the "Meta" key (see xmodmap). Cx and Cy are the x and y coor- dinates of the mouse event, encoded as in X10 mode. +Wheel mice may return buttons 4 and 5. Those buttons are represented by adding 64 to the event code. +Mouse hilite tracking notifies a program of a button press, receives a range of lines from the program, highlights the region covered by the mouse within that range until button release, and then sends the program the release coordinates. It is enabled by specifying parameter 1001 to DECSET. Highlighting is performed only for button 1, though other but- ton events can be received. Warning: use of this mode requires a coop- erating program or it will hang xterm. On button press, the same infor- mation as for normal tracking is generated; xterm then waits for the program to send mouse tracking information. All X events are ignored until the proper escape sequence is received from the pty: CSI Ps ; Ps ; Ps ; Ps ; Ps T . The parameters are func, startx, starty, firstrow, and lastrow. func is non-zero to initiate hilite tracking and zero to abort. startx and starty give the starting x and y location for the highlighted region. The ending location tracks the mouse, but will never be above row firstrow and will always be above row lastrow. (The top of the screen is row 1.) When the button is released, xterm reports the ending position one of two ways: if the start and end coordinates are valid text locations: CSI t CxCy. If either coordinate is past the end of the line: CSI T CxCyCxCyCxCy. The parameters are startx, starty, endx, endy, mousex, and mousey. startx, starty, endx, and endy give the starting and ending character positions of the region. mousex and mousey give the location of the mouse at button up, which may not be over a character. +Button-event tracking is essentially the same as normal tracking, but xterm also reports button-motion events. Motion events are reported only if the mouse pointer has moved to a different character cell. It is enabled by specifying parameter 1002 to DECSET. On button press or release, xterm sends the same codes used by normal tracking mode. On button-motion events, xterm adds 32 to the event code (the third charac- ter, Cb). The other bits of the event code specify button and modifier keys as in normal mode. For example, motion into cell x,y with button 1 down is reported as CSI M @ CxCy. ( @ = 32 + 0 (button 1) + 32 (motion indicator) ). Similarly, motion with button 3 down is reported as CSI M B CxCy. ( B = 32 + 2 (button 3) + 32 (motion indicator) ). +Any-event mode is the same as button-event mode, except that all motion events are reported instead of just those that enter a new character cell. It is enabled by specifying 1003 to DECSET. + + diff --git a/comp/src/gb.form.terminal/.hidden/control/terminalview.png b/comp/src/gb.form.terminal/.hidden/control/terminalview.png new file mode 100644 index 0000000000000000000000000000000000000000..c4c545529a5505dbda08a4e3f36ed73f94c872ff GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^3Lwk@BpAX3RW*QAjHioZh{fr*ldXjs95|de^L_s! ztLwh?L-5*#f!dl6eK`zzLM^@eO1+e>tX=x@gUSQ84R2T^97A5%Jg^pC&ZJbeqkmVM w38%xe8?3d8w>Lb3FXA8!HAPK?p$jT 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 N%^7=(m#2Kw{spL{yypM_ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.terminal/.lang/fr.po b/comp/src/gb.form.terminal/.lang/fr.po new file mode 100644 index 00000000..3dfa3ff2 --- /dev/null +++ b/comp/src/gb.form.terminal/.lang/fr.po @@ -0,0 +1,31 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.form.terminal 3.14.90\n" +"PO-Revision-Date: 2020-03-03 00:58 UTC\n" +"Last-Translator: Benoît Minisini \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Gambas Terminal control" +msgstr "Contrôle de terminal pour Gambas" + +#: TerminalView.class:1390 +msgid "Copy" +msgstr "Copier" + +#: TerminalView.class:1395 +msgid "Paste" +msgstr "Coller" + +#: TerminalView.class:1402 +msgid "Select all" +msgstr "Tout sélectionner" + +#: TerminalView.class:1406 +msgid "Clear" +msgstr "Effacer" + diff --git a/comp/src/gb.form.terminal/.lang/it.po b/comp/src/gb.form.terminal/.lang/it.po new file mode 100644 index 00000000..c30aec67 --- /dev/null +++ b/comp/src/gb.form.terminal/.lang/it.po @@ -0,0 +1,32 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.form.terminal 3.14.90\n" +"PO-Revision-Date: 2020-03-03 00:59 UTC\n" +"Last-Translator: Benoît Minisini \n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +# gb-ignore +#: .project:1 +msgid "Gambas Terminal control" +msgstr "" + +#: TerminalView.class:1390 +msgid "Copy" +msgstr "Copia" + +#: TerminalView.class:1395 +msgid "Paste" +msgstr "Incolla" + +#: TerminalView.class:1402 +msgid "Select all" +msgstr "Seleziona tutto" + +#: TerminalView.class:1406 +msgid "Clear" +msgstr "Pulisci" + diff --git a/comp/src/gb.form.terminal/.lang/pt_BR.po b/comp/src/gb.form.terminal/.lang/pt_BR.po new file mode 100644 index 00000000..1ab52e22 --- /dev/null +++ b/comp/src/gb.form.terminal/.lang/pt_BR.po @@ -0,0 +1,112 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.form.terminal 3.14.90\n" +"POT-Creation-Date: 2020-06-12 00:40 UTC\n" +"PO-Revision-Date: 2020-06-12 00:38 UTC\n" +"Last-Translator: Gen Braga \n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +# gb-ignore +#: .project:1 +msgid "Gambas Terminal control" +msgstr "" + +#: FTestTerminalView.form:42 +msgid "B" +msgstr "" + +#: FTestTerminalView.form:47 +msgid "U" +msgstr "" + +#: FTestTerminalView.form:52 +msgid "R" +msgstr "" + +#: FTestTerminalView.form:57 +msgid "D" +msgstr "" + +#: FTestTerminalView.form:62 +msgid "b" +msgstr "" + +#: FTestTerminalView.form:67 +msgid "ReadOnly" +msgstr "" + +#: FTestTerminalView.form:72 +msgid "Test" +msgstr "" + +#: PipeTest.form:32 +msgid "Send data" +msgstr "" + +#: PipeTest.form:37 +msgid "Test Data to the terminal" +msgstr "" + +#: PipeTest.form:46 +msgid "Data From Terminal" +msgstr "" + +#: PipeTest.form:51 +msgid "kill Session" +msgstr "" + +#: PipeTest.form:56 +msgid "Task Testing" +msgstr "" + +#: PipeTest.form:61 +msgid "Task Stop" +msgstr "" + +#: PipeTest.form:74 +msgid "Start Session" +msgstr "" + +#: PipeTest.form:79 +msgid "Start Rs232" +msgstr "" + +#: PipeTest.form:84 +msgid "Stop Rs232" +msgstr "" + +#: PipeTest.form:89 +msgid "Telnet Start" +msgstr "" + +#: PipeTest.form:98 +msgid "telNet Stop" +msgstr "" + +#: PipeTest.form:103 +msgid "127.0.0.1" +msgstr "" + +#: PipeTest.form:108 +msgid "23" +msgstr "" + +#: TerminalView.class:1422 +msgid "Copy" +msgstr "Copiar" + +#: TerminalView.class:1427 +msgid "Paste" +msgstr "Colar" + +#: TerminalView.class:1434 +msgid "Select all" +msgstr "Selecionar tudo" + +#: TerminalView.class:1439 +msgid "Clear" +msgstr "Limpar" diff --git a/comp/src/gb.form.terminal/.lang/ru.po b/comp/src/gb.form.terminal/.lang/ru.po new file mode 100644 index 00000000..9f4091ec --- /dev/null +++ b/comp/src/gb.form.terminal/.lang/ru.po @@ -0,0 +1,42 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.form.terminal 3.14.90\n" +"PO-Revision-Date: 2020-03-03 00:59 UTC\n" +"Last-Translator: Benoît Minisini \n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Gambas Terminal control" +msgstr "Элемент управления терминалом Gambas" + +#: TerminalView.class:1390 +msgid "Copy" +msgstr "Копировать" + +#: TerminalView.class:1395 +msgid "Paste" +msgstr "Вставить" + +#: TerminalView.class:1402 +msgid "Select all" +msgstr "Выбрать все" + +#: TerminalView.class:1406 +msgid "Clear" +msgstr "Очистить" + diff --git a/comp/src/gb.form.terminal/.project b/comp/src/gb.form.terminal/.project new file mode 100644 index 00000000..f6de0c89 --- /dev/null +++ b/comp/src/gb.form.terminal/.project @@ -0,0 +1,19 @@ +# Gambas Project File 3.0 +Title=Gambas Terminal control +Startup=FTestTerminalView +Icon=.hidden/control/terminalview.png +Version=3.15.90 +VersionFile=1 +Component=gb.image +Component=gb.gui +Component=gb.form +Component=gb.net +Component=gb.term +Authors="Benoît Minisini\nFabien Bodard" +Environment="GB_JIT_DEBUG=1\nGB_NO_JIT=0" +TabSize=2 +Translate=1 +Language=en_US +Type=Component +Packager=1 +DoNotTranslate=".src/TerminalView/test" diff --git a/comp/src/gb.form.terminal/.src/TerminalView/CTerminalLine.class b/comp/src/gb.form.terminal/.src/TerminalView/CTerminalLine.class new file mode 100644 index 00000000..4fe36029 --- /dev/null +++ b/comp/src/gb.form.terminal/.src/TerminalView/CTerminalLine.class @@ -0,0 +1,144 @@ +' Gambas class file + +Fast + +Public Text As String +Public Length As Integer + +Private Attr As New Integer[] + +Private $bCompressed As Boolean + +Private Enum FLAG_BG, FLAG_FG, FLAG_BOLD, FLAG_DIM, FLAG_REV, FLAG_UND, FLAG_BLK + +Private Sub Uncompress() + + Dim I As Integer + Dim iAttr As Integer + Dim iCount As Integer + Dim aAttr As New Integer[] + Dim aTemp As Integer[] + + For I = 0 To Attr.Max + iAttr = Attr[I] + iCount = (Lsr(iAttr, 8) And 255) + 1 + iAttr = iAttr And &HFFFF00FF + aTemp = New Integer[iCount] + aTemp.Fill(iAttr) + aAttr.Insert(aTemp) + Next + + 'If aAttr.Count > String.Len(Text) Then Stop + + Attr = aAttr + $bCompressed = False + +End + +Private Sub Compress() + + Dim I As Integer + Dim iAttr As Integer + Dim iOldAttr As Integer + Dim iCount As Integer + Dim aAttr As New Integer[] + + For I = 0 To Attr.Max + + iAttr = Attr[I] + If iAttr = iOldAttr And If iCount < 256 Then + Inc iCount + Continue + Endif + + If iCount Then aAttr.Add(iOldAttr Or Lsl(iCount - 1, 8)) + iCount = 1 + iOldAttr = iAttr + + Next + + If iCount Then aAttr.Add(iOldAttr Or Lsl(iCount - 1, 8)) + + Attr = aAttr + $bCompressed = True + +End + + +' Public Sub GetAttr(hAttr As TerminalAttr, X As Integer) +' +' Dim iAttr As Integer +' +' Try iAttr = Attr[X] +' +' If BTst(iAttr, FLAG_BG) Then +' hAttr.Background = Lsr(iAttr, 16) And 255 +' Else +' hAttr.Background = Color.Default +' Endif +' +' If BTst(iAttr, FLAG_FG) Then +' hAttr.Foreground = Lsr(iAttr, 24) And 255 +' Else +' hAttr.Foreground = Color.Default +' Endif +' +' hAttr.Bold = BTst(iAttr, FLAG_BOLD) +' hAttr.Dim = BTst(iAttr, FLAG_DIM) +' hAttr.Reverse = BTst(iAttr, FLAG_REV) +' hAttr.Underscore = BTst(iAttr, FLAG_UND) +' hAttr.Blink = BTst(iAttr, FLAG_BLK) +' +' End +' +Public Sub SetAttr(hAttr As TerminalAttr, X As Integer, L As Integer, bInsert As Boolean) + + Dim iAttr As Integer + Dim aAttr As Integer[] + Dim aTemp As Integer[] + + If hAttr.Background <> Color.Default Then iAttr = BSet(iAttr, FLAG_BG) + Lsl(hAttr.Background And 255, 16) + If hAttr.Foreground <> Color.Default Then iAttr = BSet(iAttr, FLAG_FG) + Lsl(hAttr.Foreground And 255, 24) + + If hAttr.Bold Then iAttr = BSet(iAttr, FLAG_BOLD) + If hAttr.Dim Then iAttr = BSet(iAttr, FLAG_DIM) + If hAttr.Reverse Then iAttr = BSet(iAttr, FLAG_REV) + If hAttr.Underscore Then iAttr = BSet(iAttr, FLAG_UND) + If hAttr.Blink Then iAttr = BSet(iAttr, FLAG_BLK) + + If $bCompressed Then Uncompress() + + aAttr = Attr + + If iAttr = 0 And If X >= aAttr.Count Then + 'aAttr.Resize(X) + Else + If bInsert Then + If aAttr.Count < X Then aAttr.Resize(X) + aTemp = New Integer[L] + aTemp.Fill(iAttr) + aAttr.Insert(aTemp, X) + Else + If aAttr.Count < X + L Then aAttr.Resize(X + L) + aAttr.Fill(iAttr, X, L) + Endif + Endif + +End + +Public Sub GetAttr() As Integer[] + + If Not $bCompressed Then Compress() + Return Attr + +End + + +Public Sub Clear() + + Text = "" + Length = 0 + Attr.Clear + $bCompressed = False + +End diff --git a/comp/src/gb.form.terminal/.src/TerminalView/TerminalAttr.class b/comp/src/gb.form.terminal/.src/TerminalView/TerminalAttr.class new file mode 100644 index 00000000..1c403aaa --- /dev/null +++ b/comp/src/gb.form.terminal/.src/TerminalView/TerminalAttr.class @@ -0,0 +1,70 @@ +' Gambas class file + +''' This class represents the attributes of a terminal character. + +Export +Fast + +Private Enum FLAG_BG, FLAG_FG, FLAG_BOLD, FLAG_DIM, FLAG_REV, FLAG_UND, FLAG_BLK + +'' Return or set the character foreground color. +Public Foreground As Integer = -1 +'' Return or set the character background color. +Public Background As Integer = -1 +'' Return or set the character "bold" attribute. +Public Bold As Boolean +'' Return or set the character "dim" attribute. +Public Dim As Boolean +'' Return or set the character "underscore" attribute. +Public Underscore As Boolean +'' Return or set the character "reverse" attribute. +Public Reverse As Boolean +'' Return or set the character "blink" attribute. +Public Blink As Boolean + +'' Reset the character flags. + +Public Sub Reset() + + Foreground = -1 + Background = -1 + Bold = False + {Dim} = False + Underscore = False + Reverse = False + Blink = False + +End + +'' Return if the character attributes are the default ones. + +Public Sub IsVoid() As Boolean + + If Foreground >= 0 Then Return + If Background >= 0 Then Return + If Bold Or If {Dim} Or If Underscore Or If Reverse Or If Blink Then Return + Return True + +End + +Public Sub _FillFrom(iAttr As Integer) + + If BTst(iAttr, FLAG_BG) Then + Background = Lsr(iAttr, 16) And 255 + Else + Background = Color.Default + Endif + + If BTst(iAttr, FLAG_FG) Then + Foreground = Lsr(iAttr, 24) And 255 + Else + Foreground = Color.Default + Endif + + Bold = BTst(iAttr, FLAG_BOLD) + {Dim} = BTst(iAttr, FLAG_DIM) + Reverse = BTst(iAttr, FLAG_REV) + Underscore = BTst(iAttr, FLAG_UND) + Blink = BTst(iAttr, FLAG_BLK) + +End diff --git a/comp/src/gb.form.terminal/.src/TerminalView/TerminalFilter.class b/comp/src/gb.form.terminal/.src/TerminalView/TerminalFilter.class new file mode 100644 index 00000000..902d62f4 --- /dev/null +++ b/comp/src/gb.form.terminal/.src/TerminalView/TerminalFilter.class @@ -0,0 +1,25 @@ +' Gambas class file + +Public Enum MouseDown, MouseUp, MouseMove + +Public BracketedPasteActive As Boolean + +Public Sub Reset() + +End + +Public Sub Clear() + +End + +Public Sub OutputTo((hView) As TerminalView, (hScreen) As TerminalScreen, (hProcess) As Stream, (sData) As String) + +End + +Public Sub InputTo((hView) As TerminalView, (hScreen) As TerminalScreen, (hProcess) As Stream, (iKeyCode) As Integer, (sText) As String, Optional (bNormal) As Boolean = True, (bShift) As Boolean, (bControl) As Boolean) As Boolean + +End + +Public Sub SendMouseEvent((hProcess) As Process, (X) As Integer, (Y) As Integer, (iEvent) As Integer) + +End diff --git a/comp/src/gb.form.terminal/.src/TerminalView/TerminalFilter_VT100.class b/comp/src/gb.form.terminal/.src/TerminalView/TerminalFilter_VT100.class new file mode 100644 index 00000000..7ab62f7f --- /dev/null +++ b/comp/src/gb.form.terminal/.src/TerminalView/TerminalFilter_VT100.class @@ -0,0 +1,874 @@ +' Gambas class file + +Inherits TerminalFilter + +Private Enum SCAN_NORMAL, SCAN_TITLE, SCAN_SET_CHARSET + +Private Enum MODE_AppScreen, MODE_AppCuKeys, MODE_AppKeyPad, MODE_Mouse1000, MODE_Mouse1001, MODE_Mouse1002, MODE_Mouse1003, MODE_Mouse1005, MODE_Mouse1006, MODE_Mouse1015, MODE_AnsiMODE_132Columns, MODE_Allow132Columns, MODE_BracketedPaste + +Private $aMode As New Boolean[13] +'Private $aSavedMode As New Boolean[13] +Private $sLeft As String + +Private $sLastChar As String + +'Private $iCpt As Integer + +Public Sub Reset() + + $aMode.Fill(False) + $sLastChar = "" + +End + + +Public Sub OutputTo(hView As TerminalView, hScreen As TerminalScreen, hOutput As Stream, sData As String) + + Dim iPos As Integer + Dim iPos2 As Integer + Dim iCode As Integer + Dim iMode As Integer + Dim sTitle As String + Dim sCmd As String + Dim sStr As String + Dim iNum As Integer + 'Dim iPosEraseScreen As Integer + + If hView._DisableFilter Then + $sLeft &= sData + Return + Endif + + If $sLeft Then + sData = $sLeft & sData + $sLeft = "" + Endif + + If Not String.IsValid(sData) Then + For iPos = Len(sData) DownTo 1 + If Asc(sData, iPos) >= 192 Then Break + Next + If TerminalScreen.DEBUG_FILTER Then + Debug "not valid";; iPos; " / "; Len(sData) + Debug Quote(Right(sData, 256)) + Endif + If iPos = 0 Then Return + $sLeft = Mid$(sData, iPos) + sData = Left(sData, iPos - 1) + If Not sData Then Return + iPos = 0 + Endif + + 'Debug If(hProcess.Term.GetAttr().ONLCR, "+", "-"); "ONLCR" + + 'If Len(sData) >= 4096 Then + 'iPosEraseScreen = RInStr(sData, "\e[2J") + 'If iPosEraseScreen > 0 Then Debug "erase screen at "; iPosEraseScreen + 'Endif + + Do + + hScreen = hView._GetCurrentScreen() + + Inc iPos + + iPos2 = InStr(sData, Chr$(27), iPos) + If iPos2 = 0 Then + hScreen.Print(Mid$(sData, iPos)) + $sLastChar = String.Right(sData) + Break + Endif + + 'If iPos2 > iPos And If iPos > iPosEraseScreen Then hScreen.Print(Mid$(sData, iPos, iPos2 - iPos)) + If iPos2 > iPos Then + hScreen.Print(Mid$(sData, iPos, iPos2 - iPos)) + $sLastChar = String.Right(Mid$(sData, iPos, iPos2 - iPos)) + Endif + + iPos = iPos2 + Inc iPos + + If iPos > Len(sData) Then + $sLeft = Mid$(sData, iPos2) + Return + Endif + + If Mid$(sData, iPos, 1) = "[" Then + + Inc iPos + + Do + + If iPos > Len(sData) Then + $sLeft = Mid$(sData, iPos2) + Return + Endif + + iCode = Asc(sData, iPos) + If iCode >= 64 And If iCode <= 126 Then Break + + Inc iPos + + Loop + + Endif + + iMode = Escape(hView, hScreen, hOutput, sData, iPos2 + 1, iPos - iPos2) + + If iMode = SCAN_TITLE Then + + Inc iPos + iPos2 = InStr(sData, Chr$(7), iPos) + If iPos2 = 0 Then + $sLeft = Mid$(sData, iPos) + Return + Endif + + sStr = Mid$(sData, iPos, iPos2 - iPos) + + iPos = InStr(sStr, ";") + If iPos Then + + sCmd = Left(sStr, iPos - 1) + sTitle = Mid$(sStr, iPos + 1) + + If sCmd = "0" Or If sCmd = "2" Then + hView.Title = sTitle + Else If IsInteger(sCmd) Then + ' ignore, mostly XTerm specific commands + Else + sStr = "]" & sStr + GoSub NOT_IMPLEMENTED + Endif + + Endif + + iPos = iPos2 + iMode = SCAN_NORMAL + + Else If iMode = SCAN_SET_CHARSET Then + + iNum = InStr("()*+", Mid$(sData, iPos, 1)) - 1 + If iNum >= 0 Then hScreen.SetCharset(iNum, Mid$(sData, iPos + 1, 1)) + + Inc iPos + iMode = SCAN_NORMAL + + Endif + + 'Debug "[";; hScreen.Column;; ":";; hScreen.Line + hScreen.ScreenTop();; "]" + + Loop + + Return + +NOT_IMPLEMENTED: + + Error "gb.form.terminal: warning: not implemented: "; Quote(sStr) + Return + +End + +' Escape sequence without the initial 27 character. + +Private Sub Escape(hView As TerminalView, hScreen As TerminalScreen, hOutput As Stream, sData As String, iPos As Integer, iLen As Integer) As Integer + + Dim Y As Integer + Dim X As Integer + Dim aArg As String[] + Dim sArg As String + Dim iArg As Integer + Dim sStr As String + Dim iMode As Integer + Dim N As Integer + Dim I As Integer + Dim sOutput As String + + sStr = Mid$(sData, iPos, iLen) + + ' If 'hScreen.DEBUG_FILTER Then + ' Inc $iCpt + ' Error Format($iCpt, "######0"); " | "; + ' Error "ESC"; + ' For I = 1 To Len(sStr) + ' Error " "; Mid$(sStr, I, 1); + ' Next + ' Error + ' If $iCpt > 5120 Then + ' hScreen.DebugRefresh + ' hView.Suspended = True + ' Stop + ' hView.Suspended = False + ' Endif + ' Endif + + Select Case Left(sStr) + + Case "[" ' CSI, the most frequent + + Select Case Right(sStr) + + Case "m" ' Set attribute (frequent, so test it first) + + GoSub GET_ARGS + If aArg Then + For I = 0 To aArg.Max + sArg = aArg[i] + 'For Each sArg In aArg + + Try iArg = CInt(sArg) + If Error Then Continue + + Select Case iArg + Case 0 + hScreen.Attr.Reset() + Case 30 To 37 + hScreen.Attr.Foreground = iArg - 30 + Case 90 To 97 + hScreen.Attr.Foreground = iArg - 90 + 8 + Case 39 + hScreen.Attr.Foreground = -1 + Case 40 To 47 + hScreen.Attr.Background = iArg - 40 + Case 100 To 107 + hScreen.Attr.Background = iArg - 40 + 8 + Case 49 + hScreen.Attr.Background = -1 + Case 1 + hScreen.Attr.Bold = True + 'hScreen.Attr.Reverse = True + Case 2 + hScreen.Attr.Dim = True + Case 4 + hScreen.Attr.Underscore = True + Case 5 + hScreen.Attr.Blink = True + Case 7 + hScreen.Attr.Reverse = True + Case 21 + hScreen.Attr.Bold = False + Case 22 + hScreen.Attr.Dim = False + Case 24 + hScreen.Attr.Underscore = False + Case 25 + hScreen.Attr.Blink = False + Case 27 + hScreen.Attr.Reverse = False + Case 90 To 97 + hScreen.Attr.Foreground = iArg - 90 + Case 100 To 107 + hScreen.Attr.Background = iArg - 100 + Case 38 + If (aArg.max - i) >= 2 And If aArg[I + 1] = "5" Then + Try hScreen.Attr.Foreground = CInt(aArg[I + 2]) + I += 2 + Endif + 'TODO: Implement support for RGB Colors + ' If (aArg.max - i) >= 4 And If aArg[i + 1] = "2" Then + ' Try hScreen.Attr.Background = Color.RGB(CInt(aArg[i + 2]), CInt(aArg[i + 3]), CInt(aArg[i + 4)) + ' i += 4 + ' Endif + Case 48 + If (aArg.max - I) >= 2 And If aArg[I + 1] = "5" Then + Try hScreen.Attr.Background = CInt(aArg[I + 2]) + I += 2 + Endif + 'TODO: Implement support for RGB Colors + ' If (aArg.max - i) >= 4 And If aArg[i + 1] = "2" Then + ' Try hScreen.Attr.ForeGround = Color.RGB(CInt(aArg[i + 2]), CInt(aArg[i + 3]), CInt(aArg[i + 4)) + ' i += 4 + ' Endif + + Case 3 + ' Italic on + Case 6 + ' Fast blink on + Case 20 + ' Fraktur on + Case 23 + ' Italic & Fraktur off + Default + Goto NOT_IMPLEMENTED + End Select + Next + Else + hScreen.Attr.Reset + Endif + + Case "@" + + GoSub GET_COUNT + hScreen.InsertSpace(N) + + Case "A" + + GoSub GET_COUNT + hScreen.CursorUp(N) + + Case "B" + + GoSub GET_COUNT + hScreen.CursorDown(N) + + Case "C" + + GoSub GET_COUNT + hScreen.CursorRight(N) + + Case "D" + + GoSub GET_COUNT + hScreen.CursorLeft(N) + + Case "G" + + GoSub GET_ARGS + Try hScreen.CursorGoto(CInt(aArg[0]) - 1, hScreen.Line) + + ' TODO: must take Origin into account + Case "H", "f" ' Cursor goto + + GoSub GET_ARGS + + If aArg Then + Try Y = CInt(aArg[0]) - 1 + Try X = CInt(aArg[1]) - 1 + Endif + hScreen.CursorGoto(X, Y) + + Case "K" ' Erase line + + GoSub GET_ARGS + If Not aArg Or If aArg[0] = "0" Then + hScreen.EraseEndOfLine + Else If aArg[0] = "1" Then + hScreen.EraseStartOfLine + Else If aArg[0] = "2" Then + hScreen.EraseLine + Else + Goto NOT_IMPLEMENTED + Endif + + Case "c" 'Report terminal type + + If hOutput Then Print #hOutput, "\e[?1;2c" + + Case "d" 'Set Cursor Y + + GoSub GET_ARGS + + If aArg Then + Try Y = CInt(aArg[0]) - 1 + hScreen.CursorGoto(hScreen.Column, Y) + Endif + + Case "J" ' Erase screen + + GoSub GET_ARGS + If Not aArg Or If aArg[0] = "0" Then + hScreen.EraseDown + Else If aArg[0] = "1" Then + hScreen.EraseUp + Else If aArg[0] = "2" Then + hScreen.EraseScreen + Else + Goto NOT_IMPLEMENTED + Endif + + Case "L" ' Insert lines + + GoSub GET_COUNT + hScreen.InsertLine(N) + + Case "M" ' Delete lines + + GoSub GET_COUNT + hScreen.DeleteLine(N) + + Case "P" ' Delete characters + + GoSub GET_COUNT + hScreen.DeleteChar(N) + + Case "S" ' Scroll up + + GoSub GET_COUNT + hScreen.ScrollUp(N) + + Case "T" ' Scroll down + + GoSub GET_COUNT + hScreen.ScrollDown(N) + + Case "X" ' Erase char + + GoSub GET_COUNT + hScreen.EraseChar(N) + + ' Case "d" + ' + ' GoSub GET_ARGS + ' If aArg Then + ' Try Y = CInt(aArg[0]) - 1 + ' Endif + ' hScreen.CursorGoto(hScreen.Column, Y) + + Case "h" + + If sStr Begins "[?" Then 'DEC Private Mode Set + sStr = Replace(sStr, "?", "") 'remove the ? + GoSub GET_ARGS + If aArg Then + For Each sArg In aArg + Select sArg + Case "1" ' Application cursor keys + hScreen.AppCursorKey = True + Case "6" ' Origin + hScreen.Origin = True + Case "7" ' Wrap mode + hScreen.WrapMode = True + Case "12" + 'Ignored + Case "25" ' Hide cursor + hScreen.HideCursor = False + Case "47", "1047" + $aMode[MODE_AppScreen] = False + hView.AlternateScreen = True + Case "1000" + $aMode[MODE_Mouse1000] = True + UpdateMouseActive(hView) + Case "1001" + $aMode[MODE_Mouse1001] = True + UpdateMouseActive(hView) + Case "1002" + $aMode[MODE_Mouse1002] = True + UpdateMouseActive(hView) + Case "1003" + $aMode[MODE_Mouse1003] = True + UpdateMouseActive(hView) + Case "1005" + $aMode[MODE_Mouse1005] = True + Case "1006" + $aMode[MODE_Mouse1006] = True + Case "1034" + ' ignore + Case "1048" + hScreen.SaveCursor + Case "1049" + hScreen.SaveCursor + hView.AlternateScreen = True + hView._GetCurrentScreen().Clear() + Case "2004" + Me.BracketedPasteActive = True + Default + Goto NOT_IMPLEMENTED + End Select + Next + Endif + Else 'Set Mode + GoSub GET_ARGS + If aArg Then + For Each sArg In aArg + Select Case sArg + Case "4" ' Insert mode + hScreen.InsertMode = True + Case "20" ' Newline mode + hScreen.NewLineMode = True + Default + Goto NOT_IMPLEMENTED + End Select + Next + Endif + Endif + + Case "l" + + If sStr Begins "[?" Then 'DEC Private Mode Set + sStr = Replace(sStr, "?", "") 'remove the ? + GoSub GET_ARGS + If aArg Then + For Each sArg In aArg + Select sArg + Case "1" ' Normal cursor keys + hScreen.AppCursorKey = False + Case "6" ' Origin + hScreen.Origin = False + Case "7" ' Wrap mode + hScreen.WrapMode = False + Case "12" + 'Ignored + Case "25" ' Hide cursor + If Not hScreen.DEBUG_FILTER Then hScreen.HideCursor = True + Case "47" + $aMode[MODE_AppScreen] = False + hView.AlternateScreen = False + Case "1000" + $aMode[MODE_Mouse1000] = False + UpdateMouseActive(hView) + Case "1001" + $aMode[MODE_Mouse1001] = False + UpdateMouseActive(hView) + Case "1002" + $aMode[MODE_Mouse1002] = False + UpdateMouseActive(hView) + Case "1003" + $aMode[MODE_Mouse1003] = False + UpdateMouseActive(hView) + Case "1005" + $aMode[MODE_Mouse1005] = False + Case "1006" + $aMode[MODE_Mouse1006] = False + Case "1034" + ' ignore + Case "1047" + hScreen.Clear + $aMode[MODE_AppScreen] = False + hView.AlternateScreen = False + $aMode[MODE_Mouse1000] = False + $aMode[MODE_Mouse1001] = False + $aMode[MODE_Mouse1002] = False + $aMode[MODE_Mouse1003] = False + UpdateMouseActive(hView) + Case "1048" + hScreen.RestoreCursor + Case "1049" + hView.AlternateScreen = False + hScreen.RestoreCursor + Case "2004" + Me.BracketedPasteActive = False + Default + Goto NOT_IMPLEMENTED + End Select + Next + Endif + Else 'Set Mode + GoSub GET_ARGS + If aArg Then + For Each sArg In aArg + Select Case sArg + Case "4" ' Insert mode + hScreen.InsertMode = False + Case "20" ' Newline mode + hScreen.NewLineMode = False + Default + Goto NOT_IMPLEMENTED + End Select + Next + Endif + Endif + + Case "n" ' Device Status Report + + Select Case Mid(sStr, 2, -1) + Case "5" + sOutput = "\e[0n" 'Report Status OK + Case "6" + sOutput = Subst("\e[&1;&2R", hScreen.Line, hScreen.Column) 'Report Cursor Position + Case "?6" + sOutput = Subst("\e[?&1;&2R", hScreen.Line, hScreen.Column) 'Report Cursor Position + Case "?15" + sOutput = "\0[?11n" 'Printer not ready (10 for ready)" + Case "?25" 'Report UDK statu + sOutput = "\0[?20n" 'UDK status as CSI ? 2 0 n (unlocked) or CSI ? 2 1 n (locked) + Case "?26" 'Report Keyboard status as + sOutput = "\0[?50n" 'No Locator, if not. + Default + Goto NOT_IMPLEMENTED + End Select + + If hOutput Then Print #hOutput, sOutput; + + Case "r" ' Scroll screen + + GoSub GET_ARGS + If Not aArg Then + hScreen.ScrollScreen() + Else + Try hScreen.ScrollScreen(CInt(aArg[0]) - 1, CInt(aArg[1]) - 1) + Endif + + Case "s" ' Save cursor + + hScreen.SaveCursor + + Case "u" ' Restore cursor + + hScreen.RestoreCursor + + Case "b" + + GoSub GET_COUNT + If $sLastChar Then hScreen.Print(String$(N, $sLastChar)) + + Case "t" ' window manipulations, ignore. + + Default + + Goto NOT_IMPLEMENTED + + End Select + + Case "(", ")", "*", "+" + + iMode = SCAN_SET_CHARSET + + Case "]" '>>>>> OSC + + iMode = SCAN_TITLE + + Case "7" ' Save cursor + + hScreen.SaveCursor() + + Case "8" ' Restore cursor + + hScreen.RestoreCursor() + + Case "D" ' Index + + hScreen.Index + + Case "M" ' Reverse index + + hScreen.ReverseIndex + + Case "n" + + ' TODO: Must apply it to both screens apparently + hScreen.UseCharset(2) + + Case "o" + + ' TODO: Must apply it to both screens apparently + hScreen.UseCharset(3) + + Case "=" + + hScreen.AppKeypad = True + + Case ">" + + hScreen.AppKeypad = False + + Default + + Goto NOT_IMPLEMENTED + + End Select + + Return iMode + +GET_COUNT: + + N = 1 + If Len(sStr) > 2 Then Try N = CInt(Mid$(sStr, 2, -1)) + + Return + +GET_ARGS: + + If Len(sStr) > 2 Then + aArg = Split(Mid$(sStr, 2, -1), ";") + Else + aArg = Null + Endif + + Return + +NOT_IMPLEMENTED: + + Error "gb.form.terminal: warning: not implemented: "; Quote(sStr) + +End + +Public Sub InputTo(hView As TerminalView, hScreen As TerminalScreen, hProcess As Stream, iCode As Integer, sText As String, Optional bNormal As Boolean = True, bShift As Boolean, bControl As Boolean) As Boolean + + If bNormal Then + + Select Case iCode + + Case Key.Up + sText = If(hScreen.AppCursorKey, "\eOA", "\e[A") + + Case Key.Down + sText = If(hScreen.AppCursorKey, "\eOB", "\e[B") + + Case Key.Right + sText = If(hScreen.AppCursorKey, "\eOC", "\e[C") + + Case Key.Left + sText = If(hScreen.AppCursorKey, "\eOD", "\e[D") + + Case Key.Enter, Key.Return + 'Debug If(hProcess.Term.GetAttr().ICRNL, "+", "-"); "ICRNL";; If(hProcess.Term.GetAttr().INLCR, "+", "-"); "INLCR" + sText = If(hScreen.NewlineMode, "\r\n", "\r") + + Case Key.Insert + sText = "\e[2~" + + Case Key.Delete + sText = "\e[3~" + + Case Key.Home + 'sText="\e[1~" + sText = If(hScreen.AppCursorKey, "\eOH", "\e[H") + + Case Key.End + 'sText = "\e[4~" + sText = If(hScreen.AppCursorKey, "\eOF", "\e[F") + + Case Key.PageDown + sText = "\e[6~" + + Case Key.PageUp + sText = "\e[5~" + + Case Key.F1 + sText = "\eOP" + + Case Key.F2 + sText = "\eOQ" + + Case Key.F3 + sText = "\eOR" + + Case Key.F4 + sText = "\eOS" + + Case Key.F5 + sText = "\e[15~" + + Case Key.F6 + sText = "\e[17~" + + Case Key.F7 + sText = "\e[18~" + + Case Key.F8 + sText = "\e[19~" + + Case Key.F9 + sText = "\e[20~" + + Case Key.F10 + sText = "\e[21~" + + Case Key.F11 + sText = "\e[23~" + + Case Key.F12 + sText = "\e[24~" + + Case Key.BackSpace + sText = Chr$(127) + + Case Key.Tab + sText = "\t" + + Case Key.BackTab + sText = "\e[Z" + + End Select + + Else If bShift Then + + Select iCode + + Case Key.Return, Key.Enter + sText = "\eOM" + + Case Key.BackTab + sText = "\e[Z" + + End Select + + Else If bControl Then + + Select iCode + + Case Key["S"] + + hView._Suspend(True) + + Case Key["Q"], Key["C"] + + hView._Suspend(False) + + End Select + + Endif + + If sText Then + Print #hProcess, sText; + Return True + Endif + +End + +'iButton indicates the button pressed or released (0-2) or scroll event (4-5). + +'iEvent represents the kind of mouse action that occurred: +' 0 = Mouse button press +' 1 = Mouse drag +' 2 = Mouse button release + + + +Public Sub SendMouseEvent(hProcess As Process, X As Integer, Y As Integer, iEvent As Integer) + + Dim sCommand As String + Dim iButton As Integer = 3 + + If Mouse.left Then + iButton = 0 + Else If Mouse.Right Then + iButton = 2 + Else If Mouse.Middle Then + iButton = 1 + Else If Mouse.Delta = -1 Then + iButton = 5 + Else If Mouse.Delta = 1 Then + iButton = 4 + Endif + + If X < 0 Or Y < 0 Then Return + + X += 1 + Y += 1 + + ' With the exception Of the 1006 mode, button release Is Encoded In cb. + 'Note that If multiple extensions are enabled, the 1006 Is Used, so it 's okay to check for only that. + If iEvent = Me.MouseMove And If Not $aMode[MODE_Mouse1006] Then iButton = 3 + + 'normal buttons are passed As 0 x20 + button, + 'mouse wheel(buttons 4, 5) As 0 x5c + button + If iButton >= 4 Then iButton += &H3c + + 'Mouse motion handling + If ($aMode[MODE_Mouse1002] Or $aMode[MODE_Mouse1003]) And iEvent = Me.MouseMove Then iButton += &H20 'add 32 To signify motion Event + + + + If $aMode[MODE_Mouse1006] Then + sCommand &= Subst("\e[<&1;&2;&3&4", iButton, x, y, IIf(iEvent = Me.MouseUp, "m", "M")) + Else If $aMode[MODE_Mouse1015] Then + sCommand &= Subst("\e[<&1;&2;&3M", iButton + &H20, x, y) + ' Else If $aMode[MODE_Mouse1005] Then + ' If X <= 2015 And y <= 2015 Then + ' sMouse = Conv(Chr(X + &H20) & Chr(Y + &H20), "ASCII", "UTF-8") + ' sCommand = Subst("\e[M&1&2", iButton + &H20, sMouse) + ' Endif + Else If X <= 223 And Y <= 223 Then + sCommand = Subst("\e[M&1&2&3", iButton + &H20, X + &H20, Y + &H20) + Endif + 'Print sCommand + Print #hProcess, sCommand; + +End + +Private Sub UpdateMouseActive(hView As TerminalView) + + hView._UseMouse($aMode[MODE_Mouse1000] Or $aMode[MODE_Mouse1001] Or $aMode[MODE_Mouse1002] Or $aMode[MODE_Mouse1003]) + +End diff --git a/comp/src/gb.form.terminal/.src/TerminalView/TerminalScreen.class b/comp/src/gb.form.terminal/.src/TerminalView/TerminalScreen.class new file mode 100644 index 00000000..5d785870 --- /dev/null +++ b/comp/src/gb.form.terminal/.src/TerminalView/TerminalScreen.class @@ -0,0 +1,2257 @@ +' Gambas class file + +Event _Foo + +Public Const DEBUG_FILTER As Boolean = False + +Property Read Attr As TerminalAttr +Property Read Column As Integer +Property Read Line As Integer +Property Read Width As Integer +Property Read Height As Integer +Property Read Geometry As Rect +Property Read X As Integer +Property Read Y As Integer +Property Read Count As Integer + +Property Read HasMode As Boolean + +Public AppCursorKey As Boolean +Public AppKeypad As Boolean +Public Origin As Boolean +Public InsertMode As Boolean +Public NewlineMode As Boolean +Public WrapMode As Boolean +Public HideCursor As Boolean + +Static Private $aDarkColor As Integer[] = [ + &H404040, &HC00000, &H00C000, &HD0C000, &H005090, &H900090, &H009090, &HC0C0C0, + &HA0A0A0, &HFF0000, &H00FF00, &HFFFF00, &H0080FF, &HFF00FF, &H00FFFF, &HFFFFFF] + '&H808080, &HC00000, &H00C000, &HD0C000, &H0060C0, &H800080, &H008080, &HFFFFFF, + '&H000000, &HFF0000, &H00FF00, &HFFFF00, &H0080FF, &HFF00FF, &H00FFFF, &HC0C0C0] + +Static Private $aColor As Integer[] = [ + &H000000, &HC00000, &H00C000, &HD0C000, &H0060C0, &H900090, &H009090, &HC0C0C0, + &H808080, &H800000, &H008000, &H606000, &H004080, &H600060, &H006060, &HF0F0F0, + &H000000, &H00005F, &H000087, &H0000AF, &H0000D7, &H0000FF, + &H005F00, &H005F5F, &H005F87, &H005FAF, &H005FD7, &H005FFF, + &H008700, &H00875F, &H008787, &H0087AF, &H0087D7, &H0087FF, + &H00AF00, &H00AF5F, &H00AF87, &H00AFAF, &H00AFD7, &H00AFFF, + &H00D700, &H00D75F, &H00D787, &H00D7AF, &H00D7D7, &H00D7FF, + &H00FF00, &H00FF5F, &H00FF87, &H00FFAF, &H00FFD7, &H00FFFF, + &H5F0000, &H5F005F, &H5F0087, &H5F00AF, &H5F00D7, &H5F00FF, + &H5F5F00, &H5F5F5F, &H5F5F87, &H5F5FAF, &H5F5FD7, &H5F5FFF, + &H5F8700, &H5F875F, &H5F8787, &H5F87AF, &H5F87D7, &H5F87FF, + &H5FAF00, &H5FAF5F, &H5FAF87, &H5FAFAF, &H5FAFD7, &H5FAFFF, + &H5FD700, &H5FD75F, &H5FD787, &H5FD7AF, &H5FD7D7, &H5FD7FF, + &H5FFF00, &H5FFF5F, &H5FFF87, &H5FFFAF, &H5FFFD7, &H5FFFFF, + &H870000, &H87005F, &H870087, &H8700AF, &H8700D7, &H8700FF, + &H875F00, &H875F5F, &H875F87, &H875FAF, &H875FD7, &H875FFF, + &H878700, &H87875F, &H878787, &H8787AF, &H8787D7, &H8787FF, + &H87AF00, &H87AF5F, &H87AF87, &H87AFAF, &H87AFD7, &H87AFFF, + &H87D700, &H87D75F, &H87D787, &H87D7AF, &H87D7D7, &H87D7FF, + &H87FF00, &H87FF5F, &H87FF87, &H87FFAF, &H87FFD7, &H87FFFF, + &HAF0000, &HAF005F, &HAF0087, &HAF00AF, &HAF00D7, &HAF00FF, + &HAF5F00, &HAF5F5F, &HAF5F87, &HAF5FAF, &HAF5FD7, &HAF5FFF, + &HAF8700, &HAF875F, &HAF8787, &HAF87AF, &HAF87D7, &HAF87FF, + &HAFAF00, &HAFAF5F, &HAFAF87, &HAFAFAF, &HAFAFD7, &HAFAFFF, + &HAFD700, &HAFD75F, &HAFD787, &HAFD7AF, &HAFD7D7, &HAFD7FF, + &HAFFF00, &HAFFF5F, &HAFFF87, &HAFFFAF, &HAFFFD7, &HAFFFFF, + &HD70000, &HD7005F, &HD70087, &HD700AF, &HD700D7, &HD700FF, + &HD75F00, &HD75F5F, &HD75F87, &HD75FAF, &HD75FD7, &HD75FFF, + &HD78700, &HD7875F, &HD78787, &HD787AF, &HD787D7, &HD787FF, + &HD7AF00, &HD7AF5F, &HD7AF87, &HD7AFAF, &HD7AFD7, &HD7AFFF, + &HD7D700, &HD7D75F, &HD7D787, &HD7D7AF, &HD7D7D7, &HD7D7FF, + &HD7FF00, &HD7FF5F, &HD7FF87, &HD7FFAF, &HD7FFD7, &HD7FFFF, + &HFF0000, &HFF005F, &HFF0087, &HFF00AF, &HFF00D7, &HFF00FF, + &HFF5F00, &HFF5F5F, &HFF5F87, &HFF5FAF, &HFF5FD7, &HFF5FFF, + &HFF8700, &HFF875F, &HFF8787, &HFF87AF, &HFF87D7, &HFF87FF, + &HFFAF00, &HFFAF5F, &HFFAF87, &HFFAFAF, &HFFAFD7, &HFFAFFF, + &HFFD700, &HFFD75F, &HFFD787, &HFFD7AF, &HFFD7D7, &HFFD7FF, + &HFFFF00, &HFFFF5F, &HFFFF87, &HFFFFAF, &HFFFFD7, &HFFFFFF, + &H080808, &H121212, &H1C1C1C, &H262626, &H303030, &H3A3A3A, + &H444444, &H4E4E4E, &H585858, &H606060, &H666666, &H767676, + &H808080, &H8A8A8A, &H949494, &H9E9E9E, &HA8A8A8, &HB2B2B2, + &HBCBCBC, &HC6C6C6, &HD0D0D0, &HDADADA, &HE4E4E4, &HEEEEEE] + +Static Private $aGraphicCharset As Integer[] = [&H0020&, &H25C6&, &H2592&, &H2409&, &H240C&, &H240D&, &H240A&, &H00B0&, + &H00B1&, &H2424&, &H240B&, &H2518&, &H2510&, &H250C&, &H2514&, &H253C&, + &HF800&, &HF801&, &H2500&, &HF803&, &HF804&, &H251C&, &H2524&, &H2534&, + &H252C&, &H2502&, &H2264&, &H2265&, &H03C0&, &H2260&, &H00A3&, &H00B7&] + +Static Private $sControlChar As String + +Static Private $hBrushLight As Image +Static Private $hBrushMedium As Image +Static Private $hBrushDark As Image + +Public Lines As New CTerminalLine[] + +' Screen size +Private $W As Integer +Private $H As Integer + +' Cursor position +Private $X As Integer +Private $Y As Integer + +' Saved cursor +Private $SX As Integer +Private $SY As Integer + +' Current attributes +Private $hAttr As New TerminalAttr + +' Selection +Private $X1 As Integer +Private $Y1 As Integer +Private $X2 As Integer +Private $Y2 As Integer + +' Scroll area +Private $iScrollStart As Integer = -1 +Private $iScrollEnd As Integer = -1 + +' Drawing cache +Private $hLineCache As Image +Private $cCharCache As New Collection + +' Charsets +Private $aCharset As New Byte[4] +Private $iCurrentCharset As Integer +Private $bGraphicCharset As Boolean + +Public Sub _new() + + Dim I As Integer + + If Not $sControlChar Then + For I = 0 To 31 + $sControlChar &= Chr$(I) + Next + Endif + + Reset + +End + +Private Sub GetView() As TerminalView + + Return Object.Parent(Me) + +End + +Public Sub Clear() + + Lines.Clear + GetView()._UpdateSize + +End + +Public Sub Resize(W As Integer, H As Integer) As Boolean + + If W <> $W Or If H <> $H Then + $W = W + $H = H + $X = Min($X, $W - 1) + $Y = ScreenTop() + Max(0, Min($Y - ScreenTop(), $H - 1)) + $X1 = 0 + $Y1 = 0 + $X2 = 0 + $Y2 = 0 + 'Debug "$Y = "; $Y + $iScrollStart = -1 + $iScrollEnd = -1 + If GetView().AlternateScreen Then + If Lines.Count > $H Then + Lines.Resize($H) + 'GetView()._UpdateSize + Endif + Endif + $hLineCache = Null + Return True + Endif + +End + +Public Sub GetLine(Y As Integer) As CTerminalLine + + Dim hLine As CTerminalLine + + If Y > Lines.Max Then + Lines.Resize(Y + 1) + GetView()._UpdateSize() + Endif + hLine = Lines[Y] + If Not hLine Then + hLine = New CTerminalLine + Lines[Y] = hLine + Endif + + Return hLine + +End + +Private Sub ClearLine(Y As Integer) + + Dim hLine As CTerminalLine + + If Y > Lines.Max Then Return + hLine = Lines[Y] + If Not hLine Then Return + + hLine.Clear() + +End + +Private Sub Insert(sText As String, Optional X As Integer = $X) + + Dim hLine As CTerminalLine + Dim iLen As Integer = String.Len(sText) + Dim sLeft As String + + If iLen = 0 Then Return + + 'Debug Quote(sText);; $Y;; iLen;; X;; $W + + If (X + iLen) > $W Then + If X >= $W Then + If Not WrapMode Then Return + Index() + $X = 0 + Insert(sText) + Return + Endif + iLen = Max(0, $W - X) + If iLen Then + sLeft = String.Left(sText, iLen) + If String.Len(sLeft) <> iLen Then + Error "gb.form.terminal: warning: String.Left() failed: "; String.Len(sLeft);; iLen + Return + Endif + Insert(sLeft, X) + sText = String.Mid$(sText, iLen + 1) + Endif + If WrapMode Then + Index() + $X = 0 + Insert(sText) + Endif + Return + Endif + + hLine = GetLine($Y) + + If hLine.Length <= X Then + hLine.Text &= Space$(X - hLine.Length) & sText '& String.Mid(hLine.Text, X + iLen) + hLine.Length = X + iLen 'String.Len(hLine.Text) + hLine.SetAttr($hAttr, X, iLen, False) + Else + If InsertMode Then + hLine.Text = String.Left(hLine.Text, X) & sText & String.Mid(hLine.Text, X + 1) + hLine.Length += iLen 'Min(hLine.Length + iLen, $W) + hLine.SetAttr($hAttr, X, iLen, True) + Else + hLine.Text = String.Left(hLine.Text, X) & sText & String.Mid(hLine.Text, X + iLen + 1) + hLine.Length = Max(hLine.Length, X + iLen) + hLine.SetAttr($hAttr, X, iLen, False) + Endif + Endif + + GetView()._RefreshLine($Y) + + If IsMissing(X) Then $X += iLen + +End + +Public Sub Print(sText As String) + + Dim aText As String[] + Dim sElt As String + Dim iLen As Integer + Dim iCode As Integer + + aText = Split(sText, $sControlChar) + + For Each sElt In aText + + If sElt Then + + If DEBUG_FILTER Then + Error Quote(sElt) + DebugRefresh + Endif + + If $bGraphicCharset Then sElt = ApplyGraphicCharset(sElt) + Insert(sElt) + + Endif + + iLen += Len(sElt) + If iLen >= Len(sText) Then Break + iCode = Asc(sText, iLen + 1) + + If DEBUG_FILTER Then + Error "^" & Chr$(64 + iCode) + DebugRefresh + Endif + + Select Case iCode + Case 7 + Case 8 + CursorLeft + Case 9 + Tab() + Case 10, 11, 12 + NewLine() + 'Goto(0, $Y) + Case 13 + Goto(0, $Y) + Case 14 + UseCharset(0) + Case 15 + UseCharset(1) + Case Else + Insert("^" & Chr$(64 + iCode)) + End Select + Inc iLen + Next + + 'Debug "[";; $X;; ":";; $Y;; "]" + +End + +Private Sub NewLine() + + If NewlineMode Then $X = 0 + Index() + +End + +Private Sub Tab() + + Goto($X + 8 - $X Mod 8, $Y) + +End + +Public Sub Goto(X As Integer, Y As Integer) + + If X >= $W Then + X = 0 + Inc Y + Else If X < 0 Then + X = $W - 1 + Dec Y + Endif + + If Y < 0 Then Y = 0 + + With GetView() + + ._ShowCursor() + ._RefreshLine($Y) + + $X = X + If Y <> $Y Then + $Y = Y + 'Debug "$Y = "; Y + ._RefreshLine($Y) + Endif + + '.EnsureVisible + + End With + +End + +Private Function Column_Read() As Integer + + Return $X + +End + +Private Function Line_Read() As Integer + + Return Max(0, $Y - ScreenTop()) + +End + +Public Sub ApplyLimit(iLimit As Integer) + + Dim iDel As Integer + + iDel = Lines.Count - iLimit + If iDel <= 0 Then Return + + Lines.Remove(0, iDel) + $Y = Max(0, $Y - iDel) + 'Debug "$Y = "; $Y + + GetView()._UpdateSize() + +End + +Public Sub ScreenTop() As Integer + + Return Max(0, Lines.Count - $H) + +End + +' Terminal VT100 commands + +Public Sub CursorGoto(X As Integer, Y As Integer) + + 'Debug X;; Y + + ' If X >= $W Then + ' X = 0 + ' Inc Y + ' Else If X < 0 Then + ' X = $W - 1 + ' Dec Y + ' Endif + + If X < 0 Then + X = 0 + Else If X >= $W + X = $W - 1 + Endif + + If Y < 0 Then + Y = 0 + Else If Y >= $H + Y = $H - 1 + Endif + + With GetView() + + ._ShowCursor() + ._RefreshLine($Y) + + $X = X + Y += ScreenTop() + + If Y <> $Y Then + $Y = Y + 'Debug "$Y = "; $Y + 'If $Y = 50 Then Stop + ._RefreshLine($Y) + Endif + '.EnsureVisible + + End With + +End + +Public Sub CursorUp(Optional Count As Integer = 1) + + CursorGoto($X, Me.Line - Count) + +End + +Public Sub CursorDown(Optional Count As Integer = 1) + + CursorGoto($X, Me.Line + Count) + +End + +Public Sub CursorLeft(Optional Count As Integer = 1) + + CursorGoto($X - Count, Me.Line) + +End + +Public Sub CursorRight(Optional Count As Integer = 1) + + CursorGoto($X + Count, Me.Line) + +End + +Public Sub CursorHome() + + Dim P As Integer + + If Origin And If $iScrollStart >= 0 Then P = $iScrollStart + CursorGoto(0, P) + +End + +Public Sub InsertSpace(N As Integer) + + Dim hLine As CTerminalLine + + hLine = GetLine($Y) + If $X < hLine.Length Then + hLine.Text = String.Left(String.Left(hLine.Text, $X) & Space$(N) & String.Mid$(hLine.Text, $X + 1), $W) + hLine.Length = String.Len(hLine.Text) + Endif + If Not $hAttr.IsVoid() Then + hLine.SetAttr($hAttr, $X, N, True) + Endif + GetView()._RefreshLine($Y) + +End + +Public Sub DeleteChar(Optional N As Integer = 1) + + Dim hLine As CTerminalLine + + hLine = GetLine($Y) + If $X < hLine.Length Then + hLine.Text = String.Left(hLine.Text, $X) & String.Mid$(hLine.Text, $X + N + 1) + hLine.Length = String.Len(hLine.Text) + Endif + If Not $hAttr.IsVoid() Then + Insert(Space$(N), hLine.Length) + Endif + GetView()._RefreshLine($Y) + +End + +Public Sub EraseChar(Optional N As Integer = 1) + + Dim hLine As CTerminalLine + + hLine = GetLine($Y) + If $X < hLine.Length Then + hLine.Text = String.Left(hLine.Text, $X) & Space$(N) & String.Mid$(hLine.Text, $X + N + 1) + hLine.Length = String.Len(hLine.Text) + Endif + hLine.SetAttr($hAttr, $X, N, False) + GetView()._RefreshLine($Y) + +End + +Public Sub EraseEndOfLine() + + Dim hLine As CTerminalLine + + hLine = GetLine($Y) + If hLine.Length <= $X Then + If $hAttr.IsVoid() Then Return + hLine.Text &= Space($X - hLine.Length) + Else + hLine.Text = String.Left(hLine.Text, $X) + Endif + hLine.Length = $X + If Not $hAttr.IsVoid() Then Insert(Space$($W - $X), $X) + GetView()._RefreshLine($Y) + +End + +Public Sub EraseStartOfLine() + + Dim hLine As CTerminalLine + + hLine = GetLine($Y) + If hLine.Length <= $X Then + hLine.Clear() + Else + hLine.Text = Space$($X + 1) & String.Mid$(hLine.Text, $X + 2) + Endif + GetView()._RefreshLine($Y) + +End + +Public Sub EraseLine() + + Dim hLine As CTerminalLine + + hLine = GetLine($Y) + If $hAttr.IsVoid() Then + hLine.Clear() + Else + Insert(Space$($W), 0) + Endif + + GetView()._RefreshLine($Y) + +End + +Public Sub EraseScreen() + + Dim Y As Integer + + For Y = ScreenTop() To Lines.Max + ClearLine(Y) + Next + + CursorHome + GetView()._ShowScreen() + +End + +Public Sub EraseDown() + + Dim Y As Integer + + EraseEndOfLine + + For Y = Max(ScreenTop(), $Y + 1) To Lines.Max + ClearLine(Y) + Next + + GetView().Refresh + +End + +Public Sub EraseUp() + + Dim Y As Integer + + EraseStartOfLine + + For Y = ScreenTop() To Max(ScreenTop() - 1, $Y + 1) + ClearLine(Y) + Next + + GetView().Refresh + +End + +Public Sub ScrollScreen(Optional Start As Integer, {End} As Integer) + + If IsMissing(Start) Or IsMissing({End}) Then + $iScrollStart = -1 + $iScrollEnd = -1 + Else + $iScrollStart = Start + $iScrollEnd = {End} + Endif + CursorHome() + +End + +Private Sub GetScreen(ByRef Y1 As Integer, ByRef Y2 As Integer) + + If $iScrollStart < 0 Or $iScrollEnd < 0 Then + Y1 = ScreenTop() + Y2 = Y1 + $H - 1 + Else + Y1 = ScreenTop() + $iScrollStart + Y2 = ScreenTop() + Min($H - 1, $iScrollEnd) + Endif + + If Y2 < Y1 Then Y2 = Y1 + +End + +Private Sub Scroll(bUp As Boolean, Optional iFrom As Integer) + + Dim hView As TerminalView = GetView() + Dim Y1, Y2 As Integer + + GetScreen(ByRef Y1, ByRef Y2) + If Not IsMissing(iFrom) Then Y1 = iFrom + + If bUp Then + If $iScrollStart >= 0 Or If hView.AlternateScreen Then + Try Lines.Remove(Y1) + Try Lines.Add(Null, Y2) + Else + Lines.Add(Null) + Inc $Y + hView._UpdateSize() + 'hView.EnsureVisible + Endif + Else + Try Lines.Remove(Y2) + Try Lines.Add(Null, Y1) + Endif + + hView.Refresh + +End + +Public Sub ScrollUp(Optional N As Integer) + + Repeat + Scroll(True) + Dec N + Until N <= 0 + +End + +Public Sub ScrollDown(Optional N As Integer) + + Repeat + Scroll(False) + Dec N + Until N <= 0 + +End + +Public Sub InsertLine(N As Integer) + + While N > 0 + Scroll(False, $Y) + Dec N + Wend + +End + +Public Sub DeleteLine(N As Integer) + + While N > 0 + Scroll(True, $Y) + Dec N + Wend + +End + +Public Sub Index() + + Dim Y1, Y2 As Integer + + GetScreen(ByRef Y1, ByRef Y2) + + If $Y >= Y2 Then + Scroll(True) + Else + CursorDown + Endif + +End + +Public Sub ReverseIndex() + + Dim Y1, Y2 As Integer + + GetScreen(ByRef Y1, ByRef Y2) + + If $Y <= Y1 Then + ScrollDown + Else + CursorUp + Endif + +End + +Private Function Attr_Read() As TerminalAttr + + Return $hAttr + +End + +Private Function Geometry_Read() As Rect + + Return Rect(0, ScreenTop(), $W, $H) + +End + +Private Function Width_Read() As Integer + + Return $W + +End + +Private Function Height_Read() As Integer + + Return $H + +End + +Private Sub DrawLine(hView As TerminalView, L As Integer, X As Integer, Y As Integer, LH As Integer, CW As Integer, (LA) As Integer, hFontCache As Image, bDarkBackground As Boolean) + + Dim hLine As CTerminalLine + Dim I, J, K As Integer + 'Dim sText As String + Dim aAttr As Integer[] + Dim hAttr As New TerminalAttr + Dim iFg As Integer = hView.Foreground + Dim iBg As Integer = hView.Background + 'Dim hRect As Rect + Dim P, iLen As Integer + Dim XT As Integer + Dim C, OC As Integer + Dim hFont As Font + Dim HC As Integer + Dim hRect As Rect + Dim W As Integer + Dim YC As Integer + Dim XC As Integer + Dim bNoText As Boolean + Dim XB, WB As Integer + Dim iMaxLen As Integer + + hLine = Lines[L] + If Not hLine Then + Paint.FillRect(X, Y, Paint.W, LH, iBg) + Return + Endif + + iMaxLen = Min($W, hLine.Length) + + hFont = Paint.Font + aAttr = hLine.GetAttr() + + P = 1 + + For I = 0 To aAttr.Max + + If P > iMaxLen Then Break + + hAttr._FillFrom(aAttr[I]) + iLen = Min((Lsr(aAttr[I], 8) And 255), iMaxLen - P) + 1 + + iBg = hAttr.Background + If iBg >= 0 Then + If iBg < 16 And If bDarkBackground Then + iBg = $aDarkColor[iBg] + Else + iBg = $aColor[iBg] + Endif + Else + iBg = hView.Background + Endif + + iFg = hAttr.Foreground + If iFg >= 0 Then + If iFg < 16 And If bDarkBackground Then + iFg = $aDarkColor[iFg] + Else + iFg = $aColor[iFg] + Endif + Else + iFg = hView.Foreground + Endif + + If hAttr.Reverse Then Swap iBg, iFg + + bNoText = False + + If hAttr.Blink Then + hView._HasBlink = True + If hView._Blink Then + GoSub DRAW_NO_TEXT + Continue + Endif + Endif + + If hAttr.Dim Then iFg = Color.Merge(iFg, hView.Background) + + 'Paint.Background = Color.White + + If hAttr.Bold Then + HC = LH + Else + HC = 0 + Endif + + GoSub DRAW_TEXT + + Next + + iLen = iMaxLen - P + 1 + If iLen > 0 Then + iFg = hView.Foreground + iBg = hView.Background + HC = 0 + hAttr._FillFrom(0) + GoSub DRAW_TEXT + Endif + + If Paint.W > X Then Paint.FillRect(X, Y, Paint.W - X, LH, hView.Background) + + Return + +DRAW_TEXT: + + If iLen <= 0 Then Return + + W = iLen * CW + + If IsSpace(String.Mid$(hLine.Text, P, iLen)) Then + + Paint.FillRect(X, Y, W, LH, iBg) + + Else + + Paint.Begin($hLineCache) + Paint.Font = hFont + + Paint.FillRect(0, 0, $hLineCache.W, LH, iFg) + + XT = 0 + + hRect = Rect(0, 0, CW, LH) + + Paint.Operator = Paint.OperatorDestATop + For J = P To Min(P + iLen - 1, $W) + 'sCar = String.Mid$(hLine.Text, J, 1) + + C = String.Code(hLine.Text, J) + + If C <= 255 Then + + hRect.Move(C * CW, HC) + Paint.DrawImage(hFontCache, XT, 0, CW, LH,, hRect) + + Else If C >= &H2500 And If C <= &H259F Then + + If C >= &H2591 And If C <= &H2593 Then + DrawLineChar(C, XT, 0, CW, LH, XT, Y, hAttr.Bold) + Else + hRect.Move((C - &H2500 + 256) * CW, HC) + Paint.DrawImage(hFontCache, XT, 0, CW, LH,, hRect) + Endif + + Else + + If $cCharCache.Exist(C) Then + + C = $cCharCache[C] + hRect.Move(C * CW, HC) + Paint.DrawImage(hFontCache, XT, 0, CW, LH,, hRect) + + Else + + If $cCharCache.Count = 32 Then + For Each OC In $cCharCache + $cCharCache.Remove($cCharCache.Key) + Break + Next + Else + OC = $cCharCache.Count + Endif + + If True '$cCharCache.Count < 32 Then + + XC = OC * CW + YC = 0 + + Paint.Begin(hFontCache) + Paint.Font = hFont + + Paint.Operator = Paint.OperatorSource + Paint.FillRect(XC, YC, CW, LH * 2, Color.Transparent) + Paint.Operator = Paint.OperatorOver + + Paint.ClipRect = Rect(XC, YC, CW, LH) + 'Paint.Background = Color.White + GoSub DRAW_CHAR + + YC += LH + + Paint.ClipRect = Rect(XC, YC, CW, LH) + GoSub DRAW_BOLD_CHAR + + ' 'Paint.DrawText(String.Chr(C), XC, YC, CW, LH, Align.Center) + ' GoSub DRAW_CHAR + ' Paint.Background = Color.SetAlpha(Color.White, 64) + ' 'Paint.DrawText(String.Chr(C), XC + 1, YC, CW, LH, Align.Center) + ' Inc XC + ' GoSub DRAW_CHAR + ' Dec XC + + Paint.End + + hRect.Move(XC, HC) + Paint.DrawImage(hFontCache, XT, 0, CW, LH,, hRect) + + $cCharCache[C] = OC + + Else + + 'Paint.DrawText(String.Chr(C), XT, 0, CW, LH, Align.Center) + XC = XT + YC = 0 + 'Paint.Background = Color.White + Paint.Operator = Paint.OperatorDestATop + If hAttr.Bold Then + GoSub DRAW_BOLD_CHAR + Else + GoSub DRAW_CHAR + Endif + + Endif + + Endif + Endif + + XT += CW + + Next + + Paint.End + + XT = X + + Paint.FillRect(XT, Y, W, LH, iBg) + Paint.DrawImage($hLineCache, XT, Y, W, LH,, Rect(0, 0, W, LH)) + + Endif + + If hAttr.Underscore Then Paint.FillRect(X, Y + LH - 1, W, 1, Color.SetAlpha(iFg, 64)) + + X += W + P += iLen + Return + +DRAW_NO_TEXT: + + W = iLen * CW + Paint.FillRect(X, Y, W, LH, iBg) + X += W + P += iLen + Return + +DRAW_CHAR: + + Paint.DrawText(String.Chr(C), XC, YC, CW, LH, Align.Center) + Return + +DRAW_BOLD_CHAR: + + GoSub DRAW_CHAR + + XB = XC + WB = CW \ 8 + 1 + + For K = 1 To WB \ 2 + Inc XC + GoSub DRAW_CHAR + Next + If Odd(WB) Then + Paint.Background = Color.SetAlpha(Color.White, 64) + Inc XC + GoSub DRAW_CHAR + Endif + + XC = XB + Return + +End + +Private Sub GetSelection(ByRef X1 As Integer, ByRef Y1 As Integer, ByRef X2 As Integer, ByRef Y2 As Integer) As Boolean + + Y1 = $Y1 + Y2 = $Y2 + X1 = $X1 + X2 = $X2 + + If Y1 > Y2 Then + Swap Y1, Y2 + Swap X1, X2 + Else If Y1 = Y2 Then + If X1 > X2 Then Swap X1, X2 + Endif + + If Y1 < 0 Then + Y1 = 0 + X1 = 0 + Endif + + If Y2 >= Max($H, Lines.Count) Then + Y2 = Max($H, Lines.Count) - 1 + X2 = $W + Endif + + If Y2 > Y1 Or If X2 > X1 Then Return True + +End + +Public Sub Paint(SY As Integer, LH As Integer, CW As Float, LA As Integer, bHideCursor As Boolean, hFont As Image, bDarkBackground As Boolean) + + Dim hView As TerminalView = GetView() + Dim L, L1, L2 As Integer + Dim Y As Integer + Dim X1 As Integer + Dim X2 As Integer + Dim Y1 As Integer + Dim Y2 As Integer + + If Not $hLineCache Then $hLineCache = New Image($W * CW, LH) + $cCharCache.Clear + + L1 = (SY + Paint.ClipRect.Y) \ LH + L2 = (SY + Paint.ClipRect.Y + Paint.ClipRect.H - 1) \ LH + + 'Debug L1;; L2 + + Y = L1 * LH - SY + SY Mod LH + + For L = L1 To L2 + + If L < Lines.Count Then DrawLine(hView, L, 0, Y, LH, CW, LA, hFont, bDarkBackground) + + ' Cursor + + If L = $Y And If Not bHideCursor And If Not HideCursor Then + Paint.FillRect($X * CW, Y, CW, LH, Color.SetAlpha(Color.Merge(Color.SelectedBackground, hView.Foreground), 64)) + Endif + + ' Selection + + If GetSelection(ByRef X1, ByRef Y1, ByRef X2, ByRef Y2) Then + + If L >= Y1 And If L <= Y2 Then + If L = Y1 Then + X1 *= CW + Else + X1 = 0 + Endif + If L = Y2 Then + X2 *= CW + Else + X2 = Paint.W + Endif + If X2 > X1 Then Paint.FillRect(X1, Y, X2 - X1, LH, Color.SetAlpha(Color.SelectedBackground, 128)) + Endif + + Endif + + Y += LH + + Next + +End + +Private Function X_Read() As Integer + + Return $X + +End + +Private Function Y_Read() As Integer + + Return $Y + +End + +Public Sub GotoMouse(X As Integer, Y As Integer, bStart As Boolean) + + X = Max(0, Min($W, X)) + Y = Max(0, Min(Max(Lines.Count, $H), Y)) + + If bStart Then + $X1 = X + $Y1 = Y + Endif + $X2 = X + $Y2 = Y + + If Not bStart Then + With GetView() + .Refresh + ._EnsureVisibleAt(X, Y) + End With + Endif + +End + +Public Sub SaveCursor() + + $SX = $X + $SY = $Y + +End + +Public Sub RestoreCursor() + + Goto($SX, $SY) + +End + +Public Sub Reset() + + $X = 0 + $Y = 0 + $SX = 0 + $SY = 0 + $X1 = 0 + $Y1 = 0 + $X2 = 0 + $Y2 = 0 + + $iScrollStart = -1 + $iScrollEnd = -1 + + $hAttr.Reset + + AppCursorKey = False + AppKeypad = False + Origin = False + InsertMode = False + NewlineMode = False + WrapMode = True + HideCursor = False + + $iCurrentCharset = 0 + $bGraphicCharset = False + +End + +Public Sub DebugRefresh() + + If DEBUG_FILTER Then + If GetView()._DisableFilter Then Return + GetView().Refresh + Inc GetView()._DisableFilter + Wait + Dec GetView()._DisableFilter + 'Stop + Endif + +End + +Private Function HasMode_Read() As Boolean + + If AppCursorKey Or If AppKeypad Or If Origin Or If InsertMode Or If NewlineMode Or If WrapMode Or If HideCursor Then Return True + +End + +Public Sub GetSelectedText() As String + + Dim X1 As Integer + Dim X2 As Integer + Dim Y1 As Integer + Dim Y2 As Integer + Dim sText As String + Dim Y As Integer + + If Not GetSelection(ByRef X1, ByRef Y1, ByRef X2, ByRef Y2) Then Return + + If Y2 = Y1 Then + sText = String.Mid$(GetLine(Y1).Text, X1 + 1, X2 - X1) + Else + sText = String.Mid$(GetLine(Y1).Text, X1 + 1) & "\n" + For Y = Y1 + 1 To Y2 - 1 + sText &= GetLine(Y).Text & "\n" + Next + sText &= String.Left$(GetLine(Y2).Text, X2) + Endif + + Return sText + +End + +Public Sub UseCharset(iNum As Integer) + + $iCurrentCharset = iNum + $bGraphicCharset = Chr$($aCharset[iNum]) = "0" + +End + +Public Sub SetCharset(iNum As Integer, sCharset As String) + + $aCharset[iNum] = Asc(sCharset) + UseCharset($iCurrentCharset) + +End + +Private Sub ApplyGraphicCharset(sStr As String) As String + + Dim sResult As String + Dim I As Integer + Dim C As Integer + + For I = 1 To Len(sStr) + C = Asc(sStr, I) + If C >= &5F And If C <= &7E Then + sResult &= String.Chr($aGraphicCharset[C - &5F]) + Else + sResult &= Chr$(C) + Endif + Next + + Return sResult + +End + +Static Public Sub DrawLineChar(C As Integer, X As Integer, Y As Integer, W As Integer, H As Integer, XB As Integer, YB As Integer, bBold As Boolean) + + Dim L, DL As Integer + Dim XC As Integer + Dim YC As Integer + Dim L3, DL3 As Integer + Dim hChar As Image + Dim iBg As Integer + Dim P, D As Float + Dim hBold As Image + Dim hFont As Font + + iBg = Paint.Background + hFont = Paint.Font + + hChar = New Image(W, H, Color.Transparent) + Paint.Begin(hChar) + Paint.Background = iBg + + L = Min(W, H) + If L < 4 Then + L = 0 + Else If L < 11 + L = 1 + Else + L \= 6 + Endif + DL = L \ 2 + L3 = L * 3 + DL3 = L3 \ 2 + XC = W \ 2 + YC = H \ 2 + + If C <= &H256F Then + + On C - &H2500 GoSub _2500, _2501, _2502, _2503, _2504, _2505, _2506, _2507, _2508, _2509, _250A, _250B, _250C, _250D, _250E, _250F, _2510, _2511, _2512, _2513, _2514, _2515, _2516, _2517, _2518, _2519, _251A, _251B, _251C, _251D, _251E, _251F, _2520, _2521, _2522, _2523, _2524, _2525, _2526, _2527, _2528, _2529, _252A, _252B, _252C, _252D, _252E, _252F, _2530, _2531, _2532, _2533, _2534, _2535, _2536, _2537, _2538, _2539, _253A, _253B, _253C, _253D, _253E, _253F, _2540, _2541, _2542, _2543, _2544, _2545, _2546, _2547, _2548, _2549, _254A, _254B, _254C, _254D, _254E, _254F, _2550, _2551, _2552, _2553, _2554, _2555, _2556, _2557, _2558, _2559, _255A, _255B, _255C, _255D, _255E, _255F, _2560, _2561, _2562, _2563, _2564, _2565, _2566, _2567, _2568, _2569, _256A, _256B, _256C, _256D, _256E, _256F + + Else + + On C - &H2570 GoSub _2570, _2571, _2572, _2573, _2574, _2575, _2576, _2577, _2578, _2579, _257A, _257B, _257C, _257D, _257E, _257F, _2580, _2581, _2582, _2583, _2584, _2585, _2586, _2587, _2588, _2589, _258A, _258B, _258C, _258D, _258E, _258F, _2590, _2591, _2592, _2593, _2594, _2595, _2596, _2597, _2598, _2599, _259A, _259B, _259C, _259D, _259E, _259F + + Endif + + Paint.End + + If bBold And If C <= &H2580 Then + hBold = hChar.Copy() + Paint.Begin(hChar) + If L >= 2 Then Paint.DrawImage(hBold, DL, 0) + If Odd(L) Then Paint.DrawImage(hBold, DL + 1, 0,,, 0.75) + Paint.End + Endif + + Paint.DrawImage(hChar, X, Y) + Return + +_2500: + GoSub _LEFT_S + Goto _RIGHT_S + +_2501: + GoSub _LEFT_H + Goto _RIGHT_H + +_2502: + GoSub _TOP_S + Goto _BOTTOM_S + +_2503: + GoSub _TOP_H + Goto _BOTTOM_H + +_2504: +_2505: +_2508: +_2509: +_254C: +_254D: + + If C = &H2504 Or If C = &H2505 Then + D = W / 6 + Else If C = &H2508 Or If C = &H2509 Then + D = W / 8 + Else + D = W / 4 + Endif + + P = 0 + While P < W + If Odd(C) Then + Paint.Rectangle(P, YC - DL3, D, L3) + Else + Paint.Rectangle(P, YC - DL, D, L) + Endif + P += D * 2 + Wend + Paint.Background = iBg + Paint.Fill + + Return + +_2506: +_2507: +_250A: +_250B: +_254E: +_254F: + + If C = &H2506 Or If C = &H2507 Then + D = H / 6 + Else If C = &H250A Or If C = &H250B Then + D = H / 8 + Else + D = H / 4 + Endif + + P = 0 + While P < H + If Odd(C) Then + Paint.Rectangle(XC - DL3, P, L3, D) + Else + Paint.Rectangle(XC - DL, P, L, D) + Endif + P += D * 2 + Wend + Paint.Background = iBg + Paint.Fill + + Return + +_250C: + GoSub _RIGHT_S + Goto _BOTTOM_S + +_250D: + GoSub _CENTER_SV + GoSub _RIGHT_H + Goto _BOTTOM_S + +_250E: + GoSub _CENTER_SH + GoSub _RIGHT_S + Goto _BOTTOM_H + +_250F: + GoSub _RIGHT_H + GoSub _BOTTOM_H + Goto _CENTER_H + +_2510: + GoSub _LEFT_S + Goto _BOTTOM_S + +_2511: + GoSub _CENTER_SV + GoSub _LEFT_H + Goto _BOTTOM_S + +_2512: + GoSub _CENTER_SH + GoSub _LEFT_S + Goto _BOTTOM_H + +_2513: + GoSub _LEFT_H + GoSub _BOTTOM_H + Goto _CENTER_H + +_2514: + GoSub _RIGHT_S + Goto _TOP_S + +_2515: + GoSub _CENTER_SV + GoSub _RIGHT_H + Goto _TOP_S + +_2516: + GoSub _CENTER_SH + GoSub _RIGHT_S + Goto _TOP_H + +_2517: + GoSub _RIGHT_H + GoSub _TOP_H + Goto _CENTER_H + +_2518: + GoSub _LEFT_S + Goto _TOP_S + +_2519: + GoSub _CENTER_SV + GoSub _LEFT_H + Goto _TOP_S + +_251A: + GoSub _CENTER_SH + GoSub _LEFT_S + Goto _TOP_H + +_251B: + GoSub _LEFT_H + GoSub _TOP_H + Goto _CENTER_H + +_251C: + GoSub _TOP_S + GoSub _BOTTOM_S + Goto _RIGHT_S + +_251D: + GoSub _TOP_S + GoSub _BOTTOM_S + Goto _RIGHT_H + +_251E: + GoSub _TOP_H + GoSub _BOTTOM_S + Goto _RIGHT_S + +_251F: + GoSub _TOP_S + GoSub _BOTTOM_H + Goto _RIGHT_S + +_2520: + GoSub _TOP_H + GoSub _BOTTOM_H + Goto _RIGHT_S + +_2521: + GoSub _TOP_H + GoSub _BOTTOM_S + GoSub _RIGHT_H + Goto _CENTER_H + +_2522: + GoSub _TOP_S + GoSub _BOTTOM_H + GoSub _RIGHT_H + Goto _CENTER_H + +_2523: + GoSub _TOP_H + GoSub _BOTTOM_H + Goto _RIGHT_H + +_2524: + GoSub _TOP_S + GoSub _BOTTOM_S + Goto _LEFT_S + +_2525: + GoSub _TOP_S + GoSub _BOTTOM_S + Goto _LEFT_H + +_2526: + GoSub _TOP_H + GoSub _BOTTOM_S + Goto _LEFT_S + +_2527: + GoSub _TOP_S + GoSub _BOTTOM_H + Goto _LEFT_S + +_2528: + GoSub _TOP_H + GoSub _BOTTOM_H + Goto _LEFT_S + +_2529: + GoSub _TOP_H + GoSub _BOTTOM_S + GoSub _LEFT_H + Goto _CENTER_H + +_252A: + GoSub _TOP_S + GoSub _BOTTOM_H + GoSub _LEFT_H + Goto _CENTER_H + +_252B: + GoSub _TOP_H + GoSub _BOTTOM_H + Goto _LEFT_H + +_252C: + GoSub _LEFT_S + GoSub _RIGHT_S + Goto _BOTTOM_S + +_252D: + GoSub _LEFT_H + GoSub _RIGHT_S + Goto _BOTTOM_S + +_252E: + GoSub _LEFT_S + GoSub _RIGHT_H + Goto _BOTTOM_S + +_252F: + GoSub _LEFT_H + GoSub _RIGHT_H + Goto _BOTTOM_S + +_2530: + GoSub _LEFT_S + GoSub _RIGHT_S + Goto _BOTTOM_H + +_2531: + GoSub _LEFT_H + GoSub _RIGHT_S + GoSub _BOTTOM_H + Goto _CENTER_H + +_2532: + GoSub _LEFT_S + GoSub _RIGHT_H + GoSub _BOTTOM_H + Goto _CENTER_H + +_2533: + GoSub _LEFT_H + GoSub _RIGHT_H + Goto _BOTTOM_H + +_2534: + GoSub _LEFT_S + GoSub _RIGHT_S + Goto _BOTTOM_S + +_2535: + GoSub _LEFT_H + GoSub _RIGHT_S + Goto _BOTTOM_S + +_2536: + GoSub _LEFT_S + GoSub _RIGHT_H + Goto _BOTTOM_S + +_2537: + GoSub _LEFT_H + GoSub _RIGHT_H + Goto _BOTTOM_S + +_2538: + GoSub _LEFT_S + GoSub _RIGHT_S + Goto _BOTTOM_H + +_2539: + GoSub _LEFT_H + GoSub _RIGHT_S + GoSub _BOTTOM_H + Goto _CENTER_H + +_253A: + GoSub _LEFT_S + GoSub _RIGHT_H + GoSub _BOTTOM_H + Goto _CENTER_H + +_253B: + GoSub _LEFT_H + GoSub _RIGHT_H + Goto _BOTTOM_H + +_253C: + GoSub _LEFT_S + GoSub _RIGHT_S + GoSub _TOP_S + Goto _BOTTOM_S + +_253D: + GoSub _LEFT_H + GoSub _RIGHT_S + GoSub _TOP_S + Goto _BOTTOM_S + +_253E: + GoSub _LEFT_S + GoSub _RIGHT_H + GoSub _TOP_S + Goto _BOTTOM_S + +_253F: + GoSub _LEFT_H + GoSub _RIGHT_H + GoSub _TOP_S + Goto _BOTTOM_S + +_2540: + GoSub _LEFT_S + GoSub _RIGHT_S + GoSub _TOP_H + Goto _BOTTOM_S + +_2541: + GoSub _LEFT_S + GoSub _RIGHT_S + GoSub _TOP_S + Goto _BOTTOM_H + +_2542: + GoSub _LEFT_S + GoSub _RIGHT_S + GoSub _TOP_H + Goto _BOTTOM_H + +_2543: + GoSub _LEFT_H + GoSub _RIGHT_S + GoSub _TOP_H + GoSub _CENTER_H + Goto _BOTTOM_S + +_2544: + GoSub _LEFT_S + GoSub _RIGHT_H + GoSub _TOP_H + GoSub _CENTER_H + Goto _BOTTOM_S + +_2545: + GoSub _LEFT_H + GoSub _RIGHT_S + GoSub _TOP_S + GoSub _CENTER_H + Goto _BOTTOM_H + +_2546: + GoSub _LEFT_S + GoSub _RIGHT_H + GoSub _TOP_S + GoSub _CENTER_H + Goto _BOTTOM_H + +_2547: + GoSub _LEFT_H + GoSub _RIGHT_H + GoSub _TOP_H + Goto _BOTTOM_S + +_2548: + GoSub _LEFT_H + GoSub _RIGHT_H + GoSub _TOP_S + Goto _BOTTOM_H + +_2549: + GoSub _LEFT_H + GoSub _RIGHT_S + GoSub _TOP_H + GoSub _CENTER_H + Goto _BOTTOM_H + +_254A: + GoSub _LEFT_S + GoSub _RIGHT_H + GoSub _TOP_H + Goto _BOTTOM_H + +_254B: + GoSub _LEFT_H + GoSub _RIGHT_H + GoSub _TOP_H + Goto _BOTTOM_H + +_2550: + GoSub _LEFT_H + GoSub _RIGHT_H + Paint.Operator = Paint.OperatorClear + GoSub _LEFT_S + Goto _RIGHT_S + +_2551: + GoSub _TOP_H + GoSub _BOTTOM_H + Paint.Operator = Paint.OperatorClear + GoSub _TOP_S + Goto _BOTTOM_S + +_2552: + GoSub _RIGHT_H + Paint.Operator = Paint.OperatorClear + GoSub _RIGHT_S + Paint.Operator = Paint.OperatorOver + Goto _BOTTOM_S + +_2553: + GoSub _BOTTOM_H + Paint.Operator = Paint.OperatorClear + GoSub _BOTTOM_S + Paint.Operator = Paint.OperatorOver + Goto _RIGHT_S + +_2554: + GoSub _CENTER_H + GoSub _RIGHT_H + GoSub _BOTTOM_H + Paint.Operator = Paint.OperatorClear + GoSub _RIGHT_S + Goto _BOTTOM_S + +_2555: + GoSub _LEFT_H + Paint.Operator = Paint.OperatorClear + GoSub _LEFT_S + Paint.Operator = Paint.OperatorOver + Goto _BOTTOM_S + +_2556: + GoSub _BOTTOM_H + Paint.Operator = Paint.OperatorClear + GoSub _BOTTOM_S + Paint.Operator = Paint.OperatorOver + Goto _LEFT_S + +_2557: + GoSub _CENTER_H + GoSub _LEFT_H + GoSub _BOTTOM_H + Paint.Operator = Paint.OperatorClear + GoSub _LEFT_S + Goto _BOTTOM_S + +_2558: + GoSub _RIGHT_H + Paint.Operator = Paint.OperatorClear + GoSub _RIGHT_S + Paint.Operator = Paint.OperatorOver + Goto _TOP_S + +_2559: + GoSub _TOP_H + Paint.Operator = Paint.OperatorClear + GoSub _TOP_S + Paint.Operator = Paint.OperatorOver + Goto _RIGHT_S + +_255A: + GoSub _CENTER_H + GoSub _RIGHT_H + GoSub _TOP_H + Paint.Operator = Paint.OperatorClear + GoSub _RIGHT_S + Goto _TOP_S + +_255B: + GoSub _LEFT_H + Paint.Operator = Paint.OperatorClear + GoSub _LEFT_S + Paint.Operator = Paint.OperatorOver + Goto _TOP_S + +_255C: + GoSub _TOP_H + Paint.Operator = Paint.OperatorClear + GoSub _TOP_S + Paint.Operator = Paint.OperatorOver + Goto _LEFT_S + +_255D: + GoSub _CENTER_H + GoSub _LEFT_H + GoSub _TOP_H + Paint.Operator = Paint.OperatorClear + GoSub _LEFT_S + Goto _TOP_S + +_255E: + GoSub _RIGHT_H + Paint.Operator = Paint.OperatorClear + GoSub _RIGHT_S + Paint.Operator = Paint.OperatorOver + GoSub _TOP_S + Goto _BOTTOM_S + +_255F: + GoSub _RIGHT_S + GoSub _TOP_H + GoSub _BOTTOM_H + Paint.Operator = Paint.OperatorClear + GoSub _TOP_S + Goto _BOTTOM_S + +_2560: + GoSub _TOP_H + GoSub _BOTTOM_H + GoSub _RIGHT_H + Paint.Operator = Paint.OperatorClear + GoSub _TOP_S + GoSub _BOTTOM_S + Goto _RIGHT_S + +_2561: + GoSub _LEFT_H + Paint.Operator = Paint.OperatorClear + GoSub _LEFT_S + Paint.Operator = Paint.OperatorOver + GoSub _TOP_S + Goto _BOTTOM_S + +_2562: + GoSub _LEFT_S + GoSub _TOP_H + GoSub _BOTTOM_H + Paint.Operator = Paint.OperatorClear + GoSub _TOP_S + Goto _BOTTOM_S + +_2563: + GoSub _TOP_H + GoSub _BOTTOM_H + GoSub _LEFT_H + Paint.Operator = Paint.OperatorClear + GoSub _TOP_S + GoSub _BOTTOM_S + Goto _LEFT_S + +_2564: + GoSub _BOTTOM_S + GoSub _LEFT_H + GoSub _RIGHT_H + Paint.Operator = Paint.OperatorClear + GoSub _LEFT_S + Goto _RIGHT_S + +_2565: + GoSub _BOTTOM_H + Paint.Operator = Paint.OperatorClear + GoSub _BOTTOM_S + Paint.Operator = Paint.OperatorOver + GoSub _LEFT_S + Goto _RIGHT_S + +_2566: + GoSub _LEFT_H + GoSub _RIGHT_H + GoSub _BOTTOM_H + Paint.Operator = Paint.OperatorClear + GoSub _LEFT_S + GoSub _RIGHT_S + Goto _BOTTOM_S + +_2567: + GoSub _TOP_S + GoSub _LEFT_H + GoSub _RIGHT_H + Paint.Operator = Paint.OperatorClear + GoSub _LEFT_S + Goto _RIGHT_S + +_2568: + GoSub _TOP_H + Paint.Operator = Paint.OperatorClear + GoSub _TOP_S + Paint.Operator = Paint.OperatorOver + GoSub _LEFT_S + Goto _RIGHT_S + +_2569: + GoSub _LEFT_H + GoSub _RIGHT_H + GoSub _TOP_H + Paint.Operator = Paint.OperatorClear + GoSub _LEFT_S + GoSub _RIGHT_S + Goto _TOP_S + +_256A: + GoSub _TOP_S + GoSub _BOTTOM_S + GoSub _LEFT_H + GoSub _RIGHT_H + Paint.Operator = Paint.OperatorClear + GoSub _LEFT_S + Goto _RIGHT_S + +_256B: + GoSub _LEFT_S + GoSub _RIGHT_S + GoSub _TOP_H + GoSub _BOTTOM_H + Paint.Operator = Paint.OperatorClear + GoSub _TOP_S + Goto _BOTTOM_S + +_256C: + GoSub _LEFT_H + GoSub _RIGHT_H + GoSub _TOP_H + GoSub _BOTTOM_H + Paint.Operator = Paint.OperatorClear + GoSub _LEFT_S + GoSub _RIGHT_S + GoSub _TOP_S + Goto _BOTTOM_S + +_256D: +_256E: +_256F: +_2570: + Goto _DRAW_CHAR + +_2571: + Paint.AntiAlias = False + Paint.LineWidth = L + Paint.MoveTo(0, H) + Paint.LineTo(W, 0) + Paint.Stroke + Return + +_2572: + Paint.AntiAlias = False + Paint.LineWidth = L + Paint.MoveTo(0, 0) + Paint.LineTo(W, H) + Paint.Stroke + Return + +_2573: + GoSub _2571 + Goto _2572 + +_2574: + Goto _LEFT_S + +_2575: + Goto _TOP_S + +_2576: + Goto _RIGHT_S + +_2577: + Goto _BOTTOM_S + +_2578: + Goto _LEFT_H + +_2579: + Goto _TOP_H + +_257A: + Goto _RIGHT_H + +_257B: + Goto _BOTTOM_H + +_257C: + GoSub _LEFT_S + Goto _RIGHT_H + +_257D: + GoSub _TOP_S + Goto _BOTTOM_H + +_257E: + GoSub _RIGHT_S + Goto _LEFT_H + +_257F: + GoSub _BOTTOM_S + Goto _TOP_H + +_2580: + Paint.FillRect(0, 0, W, H / 2, iBg) + Return + +_2581: +_2582: +_2583: +_2584: +_2585: +_2586: +_2587: +_2588: + Paint.FillRect(0, H, W, -Max(1, (C - &H2580) * H / 8), iBg) + Return + +_2589: +_258A: +_258B: +_258C: +_258D: +_258E: +_258F: + Paint.FillRect(0, 0, Max(1, W - (C - &H2588) * W / 8), H, iBg) + Return + +_2590: + Paint.FillRect(W, 0, -W / 2, H, iBg) + Return + +_2591: + + If Not $hBrushLight Then $hBrushLight = Image.Load("brush_light.png") + Paint.Brush = Paint.Image($hBrushLight, -XB, -YB) + Goto _DRAW_BRUSH + +_2592: + + If Not $hBrushMedium Then $hBrushMedium = Image.Load("brush_medium.png") + Paint.Brush = Paint.Image($hBrushMedium, -XB, -YB) + Goto _DRAW_BRUSH + +_2593: + + If Not $hBrushDark Then $hBrushDark = Image.Load("brush_dark.png") + Paint.Brush = Paint.Image($hBrushDark, -XB, -YB) + Goto _DRAW_BRUSH + +_2594: + Paint.FillRect(0, 0, W, H / 8, iBg) + Return + +_2595: + Paint.FillRect(W * 7 / 8, 0, W / 8, H, iBg) + Return + +_2596: + Paint.FillRect(0, H / 2, W / 2, H / 2, iBg) + Return + +_2597: + Paint.FillRect(W / 2, H / 2, W / 2, H / 2, iBg) + Return + +_2598: + Paint.FillRect(0, 0, W / 2, H / 2, iBg) + Return + +_2599: + Paint.FillRect(0, 0, W / 2, H, iBg) + Paint.FillRect(0, H, W, -H / 2, iBg) + Return + +_259A: + GoSub _2598 + Goto _2597 + +_259B: + Paint.FillRect(0, 0, W, H / 2, iBg) + Paint.FillRect(0, 0, W / 2, H, iBg) + Return + +_259C: + GoSub _2580 + Goto _2590 + +_259D: + Paint.FillRect(W / 2, 0, W / 2, H / 2, iBg) + Return + +_259E: + GoSub _259D + Goto _2596 + +_259F: + Paint.FillRect(W, 0, -W / 2, H, iBg) + Paint.FillRect(0, H, W, -H / 2, iBg) + Return + +_DRAW_BRUSH: + + Paint.Rectangle(0, 0, W, H) + Paint.Fill + Return + +_LEFT_S: + + Paint.FillRect(0, YC - DL, XC + L - DL, L, iBg) + Return + +_RIGHT_S: + + Paint.FillRect(XC - DL, YC - DL, W - XC + DL, L, iBg) + Return + +_TOP_S: + + Paint.FillRect(XC - DL, 0, L, YC + L - DL, iBg) + Return + +_BOTTOM_S: + + Paint.FillRect(XC - DL, YC - DL, L, H - YC + DL, iBg) + Return + +_LEFT_H: + + Paint.FillRect(0, YC - DL3, XC + L - DL, L3, iBg) + Return + +_RIGHT_H: + + Paint.FillRect(XC - DL, YC - DL3, W - XC + DL, L3, iBg) + Return + +_TOP_H: + + Paint.FillRect(XC - DL3, 0, L3, YC + L - DL, iBg) + Return + +_BOTTOM_H: + + Paint.FillRect(XC - DL3, YC - DL, L3, H - YC + DL, iBg) + Return + +_CENTER_H: + + Paint.FillRect(XC - DL3, YC - DL3, L3, L3, iBg) + Return + +_CENTER_SH: + + Paint.FillRect(XC - DL3, YC - DL, L3, L, iBg) + Return + +_CENTER_SV: + + Paint.FillRect(XC - DL, YC - DL3, L, L3, iBg) + Return + +_DRAW_CHAR: + + Paint.Font = hFont + Paint.DrawText(String.Chr$(C), 0, 0, W, H, Align.Center) + Return + +End + +Private Sub IsWordChar(C As String) As Boolean + + If Len(C) = 1 Then + If IsLetter(C) Or If IsDigit(C) Then Return True + If InStr(":@-./_~?&=%+#", C) Then Return True + Else + Return True + Endif + +End + +Public Sub SelectCurrentWord(X As Integer, Y As Integer) + + Dim hLine As CTerminalLine + Dim XR As Integer + Dim C As String + Dim XL As Integer + Dim bCheck As Boolean + + Try hLine = Lines[Y] + If Error Then Return + If X < 0 Or If X >= $W Or If X >= hLine.Length Then Return + + C = String.Mid$(hLine.Text, X, 1) + bCheck = Not IsWordChar(C) + + XR = X + 1 + While XR <= hLine.Length + C = String.Mid$(hLine.Text, XR, 1) + If IsWordChar(C) = bCheck Then Break + Inc XR + Wend + + XL = X - 1 + While XL > 0 + C = String.Mid$(hLine.Text, XL, 1) + If IsWordChar(C) = bCheck Then Break + Dec XL + Wend + + GotoMouse(XL, Y, True) + GotoMouse(XR - 1, Y, False) + +End + +Public Sub SelectAll() + + GotoMouse(0, 0, True) + GotoMouse(0, Lines.Count, False) + +End + +Private Function Count_Read() As Integer + + Return Lines.Count + +End diff --git a/comp/src/gb.form.terminal/.src/TerminalView/TerminalView.class b/comp/src/gb.form.terminal/.src/TerminalView/TerminalView.class new file mode 100644 index 00000000..036ffae8 --- /dev/null +++ b/comp/src/gb.form.terminal/.src/TerminalView/TerminalView.class @@ -0,0 +1,1491 @@ +' Gambas class file + +Inherits UserControl + +Export + +Public Const _Properties As String = "*,Border=True,AutoResize=True,Limit=1000,Blink,ShowScrollBar,ReadOnly" +Public Const _DrawWith As String = "-" +Public Const _Group As String = "View" + +'' This event is raised when the process running in the terminal terminates. +Event Kill +'' This event is raised when the terminal wants to change its title. +Event Title(Title As String) +'' This event is raised when the terminal size has changed. +Event Resize(W As Integer, H As Integer) + +'' Return or set if the terminal view has a border. +Property Border As Boolean +'' Return the current terminal screen attributes. +Property Read Attr As TerminalAttr +'Property Foreground As Integer +'' Return the column position of the terminal cursor. +Property Read Column As Integer +'' Return the line position of the terminal cursor. +Property Read Line As Integer +'' Return or set the maximum size of the terminal screen buffer. +'' +'' [[ warning +'' The actual buffer size will not be lower than the screen lines count. +'' ]] +Property Limit As Integer +'' Return or set the terminal type. +'' +'' `"VT100"` is then only type that is supported at the moment. +Property Type As String +'' Return or set if the terminal displays its main screen or its alternate screen. +Property AlternateScreen As Boolean +'' Return or set if the terminal cursor blinks. +Property Blink As Boolean +'' Return the contents of the terminal. +Property Read Text As String +'' Return or set if the terminal view shows its scrollbar. +Property ShowScrollBar As Boolean +'' Return or set the terminal view background color. +Property Background As Integer +'' Return or set the terminal view foreground color. +Property Foreground As Integer +'' Return the terminal view lines count. +Property Read Count As Integer +'' Return or set the terminal title. +Property Title As String +'' Return of set if the terminal output is suspended. +Property Suspended As Boolean +'' Return or set if the terminal width automatically fits the terminal view. +Property AutoResize As Boolean +'' Return or set the terminal screen width in characters. +'' +'' [[ warning +'' If the [../autoresize] property is set, then the return value is the effective width, which may be different of what you have set. +'' ]] +Property ScreenWidth As Integer +'' Return the terminal character width in pixels. +Property Read CharWidth As Integer +'' Return the terminal line height in pixels. +Property Read LineHeight As Integer +'' Return or set if the terminal is read-only. +Property ReadOnly As Boolean + +Static Private $cShortcut As Collection + +Private $hPanel As Panel +Private $hView As DrawingArea +Private $hScroll As ScrollBar + +Private $aScreen As New TerminalScreen[2] +Private $hScreen As TerminalScreen +Private $H As Integer +Private $W As Integer = 80 +Private $bAutoResize As Boolean = True + +Private $LH As Integer +Private $iAscent As Integer +Private $CW As Integer +Private $hCacheFont As Image + +Private $bMouseDown As Boolean +Private $iLimit As Integer = 1000 +Private $bHideCursor As Boolean +Private $hMouseTimer As Timer +Private $bTermUseMouse As Boolean + +Private $hProcess As Process +Private $hPipeIn As Stream ' Added this BG to support pipe io to and from the ScreenTop +Private $hPipeOut As Stream ' added this BG to support pipe io to and from the screen +Private $oPreprocess As Object ' Added to allow call back to handle data before the terminal does + +Private $fStart As Float + +Private $hFilter As TerminalFilter +Public _DisableFilter As Integer + +Private $sType As String + +Private $hCursorTimer As Timer +Private $bBlink As Boolean + +Private $sBuffer As String +Private $hOutputTimer As Timer + +Public _HasBlink As Boolean +Public _Blink As Boolean +Private $hBlinkTimer As Timer + +Private $bSuspend As Boolean + +Private $iMouseX As Integer +Private $iMouseY As Integer +Private $bShowScrollBar As Boolean +Private $hResizeTimer As Timer +Private $sTitle As String +Private $fLastMouseDownTime As Float +Private $nClick As Integer +Private $fLastMouseDownX As Integer +Private $fLastMouseDownY As Integer + +Private mnuPopup As Menu + +Private $iScrollY As Integer +Private $iTargetY As Integer +Private $hTimerScroll As Timer +Private $bIgnoreNextAnimation As Boolean +Private $bReadOnly As Boolean + +Private Const PADDING As Integer = 2 + +'Private $bDoubleFont As Boolean = True + +'' Create a new TerminalView control + +Public Sub _new() + + If Not $cShortcut Then + $cShortcut = [ + "CTRL+SHIFT+A": "SelectAll", + "CTRL+SHIFT+C": "Copy", + "CTRL+SHIFT+V": "Paste"] + Endif + + Me.Font = Font["monospace"] + + $hPanel = New Panel(Me) As "Panel" + '$hPanel.Arrangement = Arrange.Fill + $hPanel.Border = Border.Plain + + $hView = New DrawingArea($hPanel) As "View" + $hView.Border = False + $hView.Focus = True + $hView.Tracking = True + $hView.Mouse = Mouse.Text + '$hView.NoBackground = True + + Me.Background = Color.TextForeground + Me.Foreground = Color.TextBackground + + $hScroll = New ScrollBar($hPanel) As "ScrollBar" + $hScroll.Ignore = True + $hScroll.Mouse = Mouse.Arrow + $hScroll.Hide + + Me.Proxy = $hView + + Me.Type = "VT100" + + $aScreen[0] = New TerminalScreen As "TerminalScreen" + $aScreen[1] = New TerminalScreen As "TerminalScreen" + $hScreen = $aScreen[0] + + UpdateFont + UpdateScreen + + '$hRefreshTimer = New Timer As "RefreshTimer" + '$hRefreshTimer.Delay = 50 + + $hOutputTimer = New Timer As "OutputTimer" + $hOutputTimer.Delay = 50 + + $hBlinkTimer = New Timer As "BlinkTimer" + $hBlinkTimer.Delay = 500 + + $hResizeTimer = New Timer As "ResizeTimer" + $hResizeTimer.Delay = 100 + +End + +'' Reset the terminal. +'' +'' - The terminal output is resumed if it was suspended. +'' - The mouse mode is disabled. +'' - All terminal modes are reset to their defaults. +'' - The cursor position is reset, unless the ~KeepCursor~ argument is TRUE. +'' - The terminal attributes are reset to their defaults. + +Public Sub Reset(Optional KeepCursor As Boolean) + + Dim X As Integer + Dim Y As Integer + + If KeepCursor Then + X = $hScreen.Column + Y = $hScreen.Line + $hScreen.ScreenTop() + Endif + + _Suspend(False) + _UseMouse(False) + $hFilter.Reset + $hScreen.Reset + UpdateFont + + If KeepCursor Then + $hScreen.Goto(X, Y) + Endif + + Refresh + +End + +'' Clear the terminal screen contents, and reset the terminal. + +Public Sub Clear() + + $hScreen.Clear + Reset() + +End + +'' Refresh the terminal contents. + +Public Sub Refresh() + + _HasBlink = False + $hView.Refresh + +End + +Public Sub _RefreshLine(Y As Integer) + + Y -= $hScroll.Value + If Y >= 0 And If Y < $H Then + $hView.Refresh(0, Y * $LH, $hView.ClientW, $LH) + Endif + +End + +Public Sub _UpdateSize() + + $hScroll.MinValue = 0 + $hScroll.MaxValue = Max(0, $hScreen.Lines.Count - $H) + $hScroll.PageStep = $H + +End + +Private Sub UpdateScreen() + + Dim W, H As Integer + + H = Me.H + If Me.Border Then H -= 2 + H = Max(2, H \ $LH) + + If $bAutoResize Then + + W = Me.W + If Me.Border Then W -= 2 + If $bShowScrollBar Then W -= $hScroll.W + W = Max(2, W \ $CW) + + Else + + W = $W + + Endif + + If $hScreen.Resize(W, H) Then + $H = H + _UpdateSize + Refresh + 'If $hProcess Then $hProcess.Term.Resize($hScreen.Width, $hScreen.Height) + If $hProcess Then $hResizeTimer.Restart + Raise Resize(W, H) + Endif + +End + +Public Sub ResizeTimer_Timer() + + If $hProcess Then $hProcess.Term.Resize($hScreen.Width, $hScreen.Height) + $hResizeTimer.Stop + +End + +Private Sub UpdateFont() + + Dim sText As String + Dim I As Integer + Dim L As Integer + Dim W As Integer + ' Dim hZoom As Image + Dim X As Integer + Dim C As Integer + + With $hView.Font + + $LH = .Height + $iAscent = .Ascent + + sText = String$(8, "mM0_@$#W") + $CW = CInt(.TextWidth(sText) / Len(sText) + 0.5) + + W = $CW \ 8 + $CW += W \ 2 + + $hCacheFont = New Image($CW * 416, $LH * 2, Color.Transparent) + Paint.Begin($hCacheFont) + Paint.Font = $hView.Font + For I = 33 To 126 + C = I + GoSub DRAW_CHAR + Next + For I = 160 To 255 + C = I + GoSub DRAW_CHAR + Next + For I = 256 To 415 + C = &H2500 + I - 256 + GoSub DRAW_CHAR + Next + Paint.End + + ' If $bDoubleFont Then + ' hZoom = New Image($hCacheFont.W * 2, $hCacheFont.H * 2, Color.Transparent) + ' Paint.Begin(hZoom) + ' Paint.ZoomImage($hCacheFont, 2, 0, 0) + ' Paint.End + ' $hCacheFont = hZoom + ' $CW *= 2 + ' $LH *= 2 + ' Endif + + ' Make bold font + + Paint.Begin($hCacheFont) + + For I = 33 To 126 + GoSub DRAW_BOLD_CHAR + Next + For I = 160 To 415 + GoSub DRAW_BOLD_CHAR + Next + + Paint.End + + '$hCacheFont.Save("~/cache.png") + + End With + + UpdateScreen + Return + +DRAW_CHAR: + + Paint.Operator = Paint.OperatorSource + Paint.FillRect(I * $CW, 0, $CW, $LH * 2, Color.Transparent) + Paint.Operator = Paint.OperatorOver + + Paint.ClipRect = Rect(I * $CW, 0, $CW, $LH) + If C < 256 Then + Paint.Background = Color.White + Paint.DrawText(String.Chr(C), I * $CW, 0, $CW, $LH, Align.Center) + Else + TerminalScreen.DrawLineChar(C, I * $CW, 0, $CW, $LH, 0, 0, False) + Endif + + Return + +DRAW_BOLD_CHAR: + + X = I * $CW + + Paint.ClipRect = Rect(X, $LH, $CW, $LH) + + Paint.DrawImage($hCacheFont, X, $LH, $CW, $LH,, Rect(X, 0, $CW, $LH)) + + W = $CW \ 8 + 1 + For L = 1 To W \ 2 + Paint.DrawImage($hCacheFont, X + L, $LH, $CW, $LH,, Rect(X, 0, $CW, $LH)) + Next + If Odd(W) Then + Paint.Background = Color.SetAlpha(Color.White, 64) + Paint.DrawImage($hCacheFont, X + L, $LH, $CW, $LH,, Rect(X, 0, $CW, $LH)) + Endif + + Return + +End + +Public Sub View_Font() + + UpdateFont + +End + +Public Sub Panel_Arrange() + + If System.RightToLeft Then + $hScroll.Move(0, 0, Style.ScrollbarSize, $hPanel.ClientH) + Else + $hScroll.Move($hPanel.ClientW - Style.ScrollbarSize, 0, Style.ScrollbarSize, $hPanel.ClientH) + Endif + + If $bShowScrollBar Then + If System.RightToLeft Then + $hView.Move($hScroll.W + PADDING, PADDING, $hPanel.ClientW - $hScroll.W - PADDING * 2, $hPanel.ClientH - PADDING * 2) + Else + $hView.Move(PADDING, PADDING, $hPanel.ClientW - $hScroll.W - PADDING * 2, $hPanel.ClientH - PADDING * 2) + Endif + Else + $hView.Move(PADDING, PADDING, $hPanel.ClientW - PADDING * 2, $hPanel.ClientH - PADDING * 2) + Endif + + UpdateScreen + +End + +Private Sub GetScrollY() As Integer + + Return $iScrollY '$hScroll.Value + +End + +Public Sub BlinkTimer_Timer() + + _Blink = Not _Blink + Refresh + +End + +Public Sub View_Draw() + + Dim bDarkBackground As Boolean + + If $sBuffer Then OutputTimer_Timer + + ApplyLimit + + bDarkBackground = Color[Style.BackgroundOf($hView)].Luminance < Color[Style.ForegroundOf($hView)].Luminance + 'Debug bInvertColor + $hScreen.Paint(GetScrollY(), $LH, $CW, $iAscent, $bHideCursor, $hCacheFont, bDarkBackground) + + If $bTermUseMouse Then + Paint.FillRect($iMouseX * $CW, $iMouseY * $LH, $CW, $LH, Color.SetAlpha(Color.SelectedBackground, 64)) + Endif + + If _HasBlink Then + If Not $hBlinkTimer.Enabled Then $hBlinkTimer.Start + Else + $hBlinkTimer.Stop + Endif + + If $bSuspend Then Paint.FillRect(0, 0, Paint.W, Paint.H, Color.SetAlpha($hView.Background, 128)) + +End + +'' Move the cursor to the specified position. + +Public Sub Goto(X As Integer, Y As Integer) + + $hScreen.Goto(X, Y) + EnsureVisible + +End + +Private Function Border_Read() As Boolean + + Return $hPanel.Border <> Border.None + +End + +Private Sub Border_Write(Value As Boolean) + + $hPanel.Border = If(Value, Border.Plain, Border.None) + +End + +Private Function Attr_Read() As TerminalAttr + + Return $hScreen.Attr + +End + +Public Sub _EnsureVisibleAt((X) As Integer, Y As Integer) + + Dim H As Integer + + H = $hView.ClientH \ $LH + + If $hScroll.Value < (Y - H + 1) Then + $hScroll.Value = Y - H + 1 + Else If $hScroll.Value > Y Then + $hScroll.Value = Y + Endif + +End + +'' Ensure that the cursor position is visible, by scrolling the screen if necessary. + +Public Sub EnsureVisible() + + _EnsureVisibleAt($hScreen.X, $hScreen.Y) + +End + +' Private Function Foreground_Read() As Integer +' +' Return Super.Foreground +' +' End +' +' Private Sub Foreground_Write(Value As Integer) +' +' Super.Foreground = Value +' UpdateFont +' +' End + +Private Sub GotoMouse(bStart As Boolean) + + Dim X As Integer + Dim Y As Integer + + X = CInt((Mouse.ScreenX - $hView.ScreenX) / $CW + 0.4) + Y = (GetScrollY() + Mouse.ScreenY - $hView.ScreenY) \ $LH + 'Print x, y + $hScreen.GotoMouse(X, Y, bStart) + +End + +Private Sub SelectCurrentLine() + + Dim Y As Integer + + Y = (GetScrollY() + Mouse.ScreenY - $hView.ScreenY) \ $LH + 'Print x, y + $hScreen.GotoMouse(0, Y, True) + $hScreen.GotoMouse(0, Y + 1, False) + +End + +Private Sub SelectCurrentWord() + + Dim X As Integer + Dim Y As Integer + + X = CInt((Mouse.ScreenX - $hView.ScreenX) / $CW + 0.4) + Y = CInt((GetScrollY() + Mouse.ScreenY - $hView.ScreenY) / $LH) + 'Print x, y + $hScreen.SelectCurrentWord(X, Y) + +End + + +Private Sub UpdateMouse() As Boolean + + Dim X As Integer + Dim Y As Integer + + X = (Mouse.ScreenX - $hView.ScreenX) \ $CW + Y = (Mouse.ScreenY - $hView.ScreenY) \ $LH + + If X = $iMouseX And If Y = $iMouseY Then Return + + _RefreshLine($iMouseY + $hScroll.Value) + _RefreshLine(Y + $hScroll.Value) + + $iMouseX = X + $iMouseY = Y + + Return True + +End + +Private Sub SendMouseEvent(iType As Integer, Optional bIfMove As Boolean) + + Dim bHasMoved As Boolean + + If $hOutputTimer.Enabled Then $hOutputTimer.Trigger + bHasMoved = UpdateMouse() + If bIfMove And If Not bHasMoved Then Return + If $hProcess Then $hFilter.SendMouseEvent($hProcess, $iMouseX, $iMouseY, iType) + $fStart = 0 + +End + +Public Sub View_MouseDown() + + If $fLastMouseDownTime And If (Timer - $fLastMouseDownTime) * 1000 <= Application.DblClickTime And If Mouse.ScreenX = $fLastMouseDownX And If Mouse.ScreenY = $fLastMouseDownY Then + Inc $nClick + Else + $nClick = 1 + Endif + + $fLastMouseDownTime = Timer + $fLastMouseDownX = Mouse.ScreenX + $fLastMouseDownY = Mouse.ScreenY + + If $bTermUseMouse Then + + SendMouseEvent($hFilter.MouseDown) + + Else If $nClick = 2 Then + + If Mouse.Left Then + SelectCurrentWord + $bMouseDown = True + Endif + + Else If $nClick = 3 Then + + If Mouse.Left Then + SelectCurrentLine + $bMouseDown = True + Endif + + Else + + If Mouse.Left Then + $bMouseDown = True + GotoMouse(True) + GotoMouse(False) + Else If Mouse.Middle Then + Clipboard.Current = Clipboard.Selection + Paste() + Clipboard.Current = Clipboard.Default + Endif + + Endif + 'Print "MouseDown" + +End + +Public Sub View_MouseMove() + + If $bTermUseMouse Then + + SendMouseEvent($hFilter.MouseMove, True) + + Else + + If $bMouseDown Then + If Not $hMouseTimer Then $hMouseTimer = New Timer(50) As "MouseTimer" + GotoMouse(False) + Else If Not $bShowScrollBar Then + If System.RightToLeft Then + If Mouse.X < $hScroll.W And If $hScroll.MaxValue Then + $hScroll.Raise + $hScroll.Show + Else + $hScroll.Hide + Endif + Else + If Mouse.X >= ($hView.ClientW - $hScroll.W) And If $hScroll.MaxValue Then + $hScroll.Raise + $hScroll.Show + Else + $hScroll.Hide + Endif + Endif + Endif + + Endif + +End + +Public Sub ScrollBar_Leave() + + If Not $bShowScrollBar Then $hScroll.Hide + +End + + +Public Sub View_MouseUp() + + Dim sText As String + + If $bTermUseMouse Then + + SendMouseEvent($hFilter.MouseUp) + + Else + + If $hMouseTimer Then + $hMouseTimer.Stop + $hMouseTimer = Null + Endif + + If $bMouseDown Then + sText = $hScreen.GetSelectedText() + If sText Then + Clipboard.Current = Clipboard.Selection + Clipboard.Copy(sText, "text/plain") + Clipboard.Current = Clipboard.Default + Endif + Endif + + Endif + + $bMouseDown = False + +End + +Public Sub View_MouseWheel() + + Dim hOutput As Stream + Dim I As Integer + + If Mouse.Control Then + + If Mouse.Forward Then + $hView.Font.Size = Min(32, $hView.Font.Size * Sqr(Sqr(2))) + Else + $hView.Font.Size = Max(6, $hView.Font.Size / Sqr(Sqr(2))) + Endif + + Else + + If $bTermUseMouse Then + + SendMouseEvent($hFilter.MouseDown) + + Else If $hScroll.MaxValue = 0 Then + + hOutput = GetOutputStream() + If hOutput Then + For I = 1 To Abs(Mouse.Delta) + $hFilter.InputTo(Me, $hScreen, hOutput, If(Mouse.Forward, Key.Up, Key.Down), "") + Next + EnsureVisible + Endif + + Else + + If Mouse.Forward Then + $hScroll.Value -= 3 + Else + $hScroll.Value += 3 + Endif + + Endif + + Endif + + Stop Event + +End + +Private Sub GetOutputStream() As Stream + + If $hPipeOut Then Return $hPipeOut + If $hProcess Then Return $hProcess + +End + +Public Sub View_KeyPress() + + Dim hOutput As Stream + Dim sAction As String + + Try sAction = $cShortcut[String.UCase(Shortcut.FromKey())] + If sAction Then + Select Case sAction + Case "Copy" + Copy() + Case "Paste" + If $bReadOnly Then Goto STOP_EVENT + Paste() + Case "SelectAll" + SelectAll + End Select + Goto STOP_EVENT + Endif + + If $bReadOnly Then Goto STOP_EVENT + + hOutput = GetOutputStream() + If Not hOutput Then Return + + If $hOutputTimer.Enabled Then $hOutputTimer.Trigger + + $hScroll.Value = $hScroll.MaxValue + + If $hFilter.InputTo(Me, $hScreen, hOutput, Key.Code, Key.Text, Key.Normal, Key.Shift, Key.Control) Then + EnsureVisible + $fStart = 0 + Stop Event + Endif + + Return + +STOP_EVENT: + + Stop Event + +End + +Private Function Column_Read() As Integer + + Return $hScreen.Column + +End + +Private Function Line_Read() As Integer + + Return $hScreen.Line + +End + +Private Sub ApplyLimit() + + Dim iLimit As Integer + + iLimit = $iLimit + If iLimit <= 0 Then Return + If iLimit <= ($hView.ClientH \ $LH) Then Return + + $hScreen.ApplyLimit(iLimit) + +End + +Private Function Limit_Read() As Integer + + Return $iLimit + +End + +Private Sub Limit_Write(Value As Integer) + + $iLimit = Value + ApplyLimit + +End + +Private Sub UpdateCursorTimer() + + If $hView.HasFocus And If $bBlink And If Not $bReadOnly Then + $bHideCursor = False + If Not $hCursorTimer Then $hCursorTimer = New Timer(500) As "CursorTimer" + Else + If $hCursorTimer Then + $hCursorTimer.Stop + $hCursorTimer = Null + Endif + $bHideCursor = $bReadOnly + Endif + $hView.Refresh + +End + +Public Sub View_GotFocus() + + UpdateCursorTimer + +End + +Public Sub View_LostFocus() + + UpdateCursorTimer + +End + +Public Sub _ShowCursor() + + If $bReadOnly Then Return + $bHideCursor = False + +End + +Public Sub CursorTimer_Timer() + + $bHideCursor = Not $bHideCursor + _RefreshLine($hScreen.Y) + +End + +Public Sub MouseTimer_Timer() + + GotoMouse(False) + +End + +Private Function Type_Read() As String + + Return $sType + +End + +Private Sub Type_Write(Value As String) + + Try $hFilter = Object.New("TerminalFilter_" & Value) + If Error Then Error.Raise("Unknown terminal type: " & Value & ". " & Error.Text) + $sType = UCase(Value) + +End + +Private Sub InitProcess() + + '$hProcess.Term.Resize($hScreen.Width, $hScreen.Height) + $hResizeTimer.Trigger + +End + +'' Execute a command inside the terminal view using the [/lang/exec] instruction and a virtual terminal. +'' +'' - ~Command~ is the command string array passed to the EXEC instruction. +'' - ~Environment~ is the command optional environment. +'' +'' The [/comp/gb/process] object is returned. + +Public Sub Exec(Command As String[], Optional Environment As String[]) As Process + + Dim aEnv As String[] + + If GetOutputStream() Then Error.Raise("Terminal already in use") + + aEnv = ["TERM=xterm"] + If Environment Then aEnv.Insert(Environment) + + $fStart = Timer + + $hProcess = Exec Command With aEnv For Input Output As "Process" + InitProcess + Return $hProcess + +End + +'' Execute a command inside the terminal view using the [/lang/shell] instruction and a virtual terminal. +'' +'' - ~Command~ is the command string passed to the SHELL instruction. +'' - ~Environment~ is the command optional environment. +'' +'' The [/comp/gb/process] object is returned. + +Public Sub Shell(Command As String, Optional Environment As String[]) As Process + + Dim aEnv As String[] + + If GetOutputStream() Then Error.Raise("Terminal already in use") + + aEnv = ["TERM=xterm"] + If Environment Then aEnv.Insert(Environment) + + $fStart = Timer + + $hProcess = Shell Command With aEnv For Input Output As "Process" + InitProcess + + Return $hProcess + +End + +' allow a connection to a filter or other task +' Output is the Pipe on which the connect Task or process will receive input +' the input stream I the one this process will use to receive input +' if a callBack is passed then the preprocess method is executed before recieved data is handled by the terminal +' Preprocess may return true to have the terminal process the data, or false to have the terminal ignore the data +' This allows the implementation of a state machine or filter to hande extended terminal functions on the stream + +Public Sub ConnectTo($hOutputStream As Stream, $hInputStream As Stream, ByRef Preprocess As Object) As Boolean ' added BG this function to use as a piped terminal + + Dim TheClass As Class + Dim TheObject As Object + + If GetOutputStream() Then Error.Raise("Terminal already in use") + + TheObject = $hInputStream + TheClass = Object.Class(TheObject) + + $hPipeOut = $hOutputStream + $hPipeIn = $hInputStream + + If TheClass.Name <> "Socket" Then ' it seems that a socket has a watch always doing this screws it up + $hPipeIn.Watch(gb.Read, True) + Endif + + Object.Attach($hPipeIn, Me, "Process") + + If Preprocess Then $oPreprocess = Preprocess ' set the call back to handle connection state messages etc + + $fStart = Timer + + Return True + +End + +Public Sub Process_Kill() + + If $sBuffer Then OutputTimer_Timer + $hProcess = Null + Raise Kill + +End + +Public Sub Process_Read() + + Dim sData As String + Dim len As Integer + + If $hPipeIn Then + len = Lof($hPipeIn) + Read #$hPipeIn, sData, len + Stop Event + If $oPreprocess Then + If $oPreprocess.Preprocess(ByRef sData, ByRef len) Then ' if it returns true then we should process the data + $sBuffer &= sData + Endif + Else + $sBuffer &= sData + Endif + Else + sData = Read #$hProcess, Lof($hProcess) + 'Stop Event + 'Debug Quote(sData) + $sBuffer &= sData + Endif + + If TerminalScreen.DEBUG_FILTER Then + If _DisableFilter = 0 Then $hOutputTimer.Trigger + Else + If (Timer - $fStart) >= 0.05 Then + $hOutputTimer.Trigger + Else + $hOutputTimer.Restart + Endif + Endif + +End + +'' Print something in the terminal output. +'' +'' ## See also +'' [../input] + +Public Sub Print(Text As String) + + UpdateScreen + $sBuffer &= Text + + OutputTimer_Timer + '$hFilter.OutputTo(Me, $hScreen, File.Out, Text) + 'EnsureVisible + +End + +Public Sub OutputTimer_Timer() + + Dim hOutput As Stream + Dim sBuffer As String + Dim bEnsureVisible As Boolean + + $fStart = Timer + + $hOutputTimer.Stop + + If Not Me.Visible Then Return + + hOutput = GetOutputStream() + sBuffer = $sBuffer + $sBuffer = "" + + If (($iTargetY + $hView.H) \ $LH) >= $hScreen.Count Then + bEnsureVisible = True + Endif + + $hFilter.OutputTo(Me, $hScreen, hOutput, sBuffer) + + If bEnsureVisible Then + $bIgnoreNextAnimation = True + EnsureVisible + Endif + +End + +Public Sub _GetCurrentScreen() As TerminalScreen + + Return $hScreen + +End + +Private Function AlternateScreen_Read() As Boolean + + Return $hScreen = $aScreen[1] + +End + +Private Sub AlternateScreen_Write(Value As Boolean) + + Dim hScreen As TerminalScreen + + If Value Then + hScreen = $aScreen[1] + 'Debug "1" + Else + hScreen = $aScreen[0] + 'Debug "0" + Endif + + If hScreen = $hScreen Then Return + + $hScreen = hScreen + UpdateScreen + _UpdateSize + _ShowScreen + +End + +Public Sub ScrollBar_Change() + + $iTargetY = $hScroll.Value * $LH + If $iTargetY <> $iScrollY Then + If Application.Animations And If Not $bIgnoreNextAnimation Then + If Not $hTimerScroll Then + $hTimerScroll = New Timer As "TimerScroll" + $hTimerScroll.Delay = 20 + Endif + $hTimerScroll.Start + Else + $bIgnoreNextAnimation = False + $iScrollY = $iTargetY + $hView.Refresh + Endif + Endif + +End + +Public Sub TimerScroll_Timer() + + $iScrollY += ($iTargetY - $iScrollY + Sgn($iTargetY - $iScrollY)) \ 2 + $hView.Refresh + + If $iScrollY = $iTargetY Then $hTimerScroll.Stop + +End + +'' Kill the current process running inside the terminal. +'' +'' It's the process run by the [../exec] or [../shell] command. + +Public Sub Kill() + + If $hProcess Then + Try $hProcess.Kill + Else If $hPipeIn Then + Process_Read() ' Get the last data in stream and display it + + If Object.Class($hPipeIn).name <> "Socket" Then + $hPipeIn.Watch(gb.Read, False) + Endif + + Object.Detach(Me) + + $oPreprocess = Null + $hPipeIn = Null ' dont close the pipes its the owners problem + $hPipeOut = Null + Endif + +End + +Private Function Blink_Read() As Boolean + + Return $bBlink + +End + +Private Sub Blink_Write(Value As Boolean) + + If Value = $bBlink Then Return + + If $hView.HasFocus Then + $bBlink = Value + View_GotFocus + Else + View_LostFocus + $bBlink = Value + Endif + _RefreshLine($hScreen.Line) + +End + +'' Copy the selected text of the terminal into the clipboard. + +Public Sub Copy() + + Dim sText As String + + sText = $hScreen.GetSelectedText() + If sText Then Clipboard.Copy(sText) + +End + +'' Paste the clipboard contents into the terminal, as if it has been entered through the keyboard. + +Public Sub Paste() + + Dim sText As String + + sText = Clipboard.Paste("text/plain") + If Not sText Then Return + + If $hFilter.BracketedPasteActive Then sText = "\e[200~" & sText & "\e[200~" + Input(sText) + +End + +'' Send text to the terminal input. +'' +'' ## See also +'' [../print] + +Public Sub Input(Text As String) + + Dim hOutput As Stream + + hOutput = GetOutputStream() + If hOutput Then + $hFilter.InputTo(Me, $hScreen, hOutput, 0, Text) + EnsureVisible + Endif + +End + +Public Sub _ShowScreen() + + $bIgnoreNextAnimation = True + $hScroll.Value = $hScreen.ScreenTop() + Refresh + +End + +Public Sub _Suspend(bSuspend As Boolean) + + If Not $hProcess Then Return + If Not $hProcess.Term.FlowControl Then Return + + $bSuspend = bSuspend + Refresh + +End + +Public Sub _UseMouse(bUse As Boolean) + + If $bTermUseMouse = bUse Then Return + + $bTermUseMouse = bUse + $hView.Mouse = If($bTermUseMouse, Mouse.Blank, Mouse.Text) + + If $bTermUseMouse Then + UpdateMouse + _RefreshLine($iMouseY) + Endif + +End + +Private Function Text_Read() As String + + Dim hLine As CTerminalLine + Dim aLine As New String[] + + For Each hLine In $hScreen.Lines + If Not hLine Then + aLine.Add("") + Else + aLine.Add(hLine.Text) + Endif + Next + + Return aLine.Join("\n") + +End + +Private Function ShowScrollBar_Read() As Boolean + + Return $bShowScrollBar + +End + +Private Sub ShowScrollBar_Write(Value As Boolean) + + $bShowScrollBar = Value + $hScroll.Visible = $bShowScrollBar + Panel_Arrange + UpdateScreen + +End + +Private Function Background_Read() As Integer + + Return $hView.Background + +End + +Private Sub Background_Write(Value As Integer) + + $hPanel.Background = Value + $hView.Background = Value + +End + +Private Function Foreground_Read() As Integer + + Return $hView.Foreground + +End + +Private Sub Foreground_Write(Value As Integer) + + $hPanel.Foreground = Value + $hView.Foreground = Value + +End + +Private Function Count_Read() As Integer + + Return $hScreen.Lines.Count + +End + +Private Function Title_Read() As String + + Return $sTitle + +End + +Private Sub Title_Write(Value As String) + + $sTitle = Value + Raise Title($sTitle) + +End + +Private Function Suspended_Read() As Boolean + + Return $bSuspend + +End + +Private Sub Suspended_Write(Value As Boolean) + + If $bSuspend = Value Then Return + + _Suspend(Value) + + If $hProcess Then + If $bSuspend Then + Print #$hProcess, Chr$(19); + Else + Print #$hProcess, Chr$(17); + Endif + Endif + +End + +Private Function AutoResize_Read() As Boolean + + Return $bAutoResize + +End + +Private Sub AutoResize_Write(Value As Boolean) + + If $bAutoResize = Value Then Return + $bAutoResize = Value + UpdateScreen + +End + +Private Function ScreenWidth_Read() As Integer + + Return $hScreen.Width + +End + +Private Sub ScreenWidth_Write(Value As Integer) + + If $W = Value Then Return + $W = Value + UpdateScreen + +End + +Private Function CharWidth_Read() As Integer + + Return $CW + +End + +Private Function LineHeight_Read() As Integer + + Return $LH + +End + +Public Sub View_Menu() + + Dim hMenu As Menu + + If Me.PopupMenu Then Return + + If Not mnuPopup Then + + mnuPopup = New Menu(Me.Window, True) + + hMenu = New Menu(mnuPopup) As "mnuCopy" + hMenu.Text = ("Copy") + hMenu.Picture = Picture["icon:/small/copy"] + hMenu.Shortcut = "CTRL+SHIFT+C" + + hMenu = New Menu(mnuPopup) As "mnuPaste" + hMenu.Text = ("Paste") + hMenu.Picture = Picture["icon:/small/paste"] + hMenu.Shortcut = "CTRL+SHIFT+V" + + hMenu = New Menu(mnuPopup) + + hMenu = New Menu(mnuPopup) As "mnuSelectAll" + hMenu.Text = ("Select all") + hMenu.Picture = Picture["icon:/small/select-all"] + hMenu.Shortcut = "CTRL+SHIFT+A" + + hMenu = New Menu(mnuPopup) As "mnuClear" + hMenu.Text = ("Clear") + hMenu.Picture = Picture["icon:/small/clear"] + + Endif + + mnuPopup.Popup + +End + + +Public Sub mnuCopy_Click() + + Copy() + +End + +Public Sub mnuPaste_Click() + + Paste() + +End + +Public Sub mnuClear_Click() + + Clear() + +End + +Public Sub mnuSelectAll_Click() + + SelectAll() + +End + +Private Function ReadOnly_Read() As Boolean + + Return $bReadOnly + +End + +Private Sub ReadOnly_Write(Value As Boolean) + + If $bReadOnly = Value Then Return + $bReadOnly = Value + UpdateCursorTimer + +End + +Private Sub SelectAll() + + $hScreen.SelectAll() + +End diff --git a/comp/src/gb.form.terminal/.src/TerminalView/test/FOtherTest.class b/comp/src/gb.form.terminal/.src/TerminalView/test/FOtherTest.class new file mode 100644 index 00000000..1d758a2e --- /dev/null +++ b/comp/src/gb.form.terminal/.src/TerminalView/test/FOtherTest.class @@ -0,0 +1,11 @@ +' Gambas class file + +Private $hProcess As Process + +Public Sub Form_Open() + + $hProcess = TerminalView1.Shell("sh") + + + +End diff --git a/comp/src/gb.form.terminal/.src/TerminalView/test/FOtherTest.form b/comp/src/gb.form.terminal/.src/TerminalView/test/FOtherTest.form new file mode 100644 index 00000000..669bfc1e --- /dev/null +++ b/comp/src/gb.form.terminal/.src/TerminalView/test/FOtherTest.form @@ -0,0 +1,8 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,64,64) + { TerminalView1 TerminalView + MoveScaled(5,15,49,41) + } +} diff --git a/comp/src/gb.form.terminal/.src/TerminalView/test/FTestTerminalView.class b/comp/src/gb.form.terminal/.src/TerminalView/test/FTestTerminalView.class new file mode 100644 index 00000000..ec61ed07 --- /dev/null +++ b/comp/src/gb.form.terminal/.src/TerminalView/test/FTestTerminalView.class @@ -0,0 +1,128 @@ +' Gambas class file + +Public Sub TextBox1_Activate() + + Try TerminalView1.Exec(Split(TextBox1.Text, " ", Chr$(34))) + If Error Then + Debug Error.Text + Else + TerminalView1.SetFocus + Endif + +End + +Public Sub Timer1_Timer() + + TerminalView1.Insert(CStr(Int(Timer * 10))) + TerminalView1.NewLine + +End + +Public Sub Button1_Click() + + TerminalView1.Attr.Bold = Last.Value + +End + +Public Sub Form_Open() + + 'Exec ["stty", "onlcr"] Wait + Application.Animations = True + TerminalView1.Exec(["bash"], ["PWD=/home/benoit/gambas/git/master/comp/src/gb.form.terminal"]) + +End + +Public Sub Button2_Click() + + TerminalView1.Attr.Underscore = Last.Value + +End + +Public Sub Button3_Click() + + TerminalView1.Attr.Reverse = Last.Value + +End + +Public Sub Button5_Click() + + TerminalView1.Attr.Blink = Last.Value + +End + +Public Sub Form_Close() + + TerminalView1.Kill + +End + +Public Sub TerminalView1_Kill() + + 'Me.Close + +End + +Public Sub TerminalView1_Title(Title As String) + + If Title Then Title &= " - " + Me.Title = Title & "Gambas Terminal Emulator" + +End + +' Public Sub Form_Activate() +' +' Dim I As Integer +' Dim J As Integer +' Dim B As Integer +' +' For B = 0 To 1 +' If B = 0 Then +' TerminalView1.Print("\e[m") +' Else +' TerminalView1.Print("\e[1m") +' Endif +' For I = &H2500 To &H259F Step 16 +' TerminalView1.Print(Hex$(I, 4) & ": ") +' For J = I To I + 15 +' TerminalView1.Print(String.Chr$(J) & " ") +' Next +' TerminalView1.Print("\n\n") +' Next +' Next +' +' TerminalView1.Print("\e[m") +' TerminalView1.Print(String$(4, String$(20, String.Chr$(&H2572)) & "\n")) +' +' For B = 0 To 1 +' If B = 0 Then +' TerminalView1.Print("\e[m") +' Else +' TerminalView1.Print("\e[1m") +' Endif +' For I = 256 To 1024 +' TerminalView1.Print(String.Chr$(I)) +' Next +' TerminalView1.Print("\n\n") +' Next +' +' TerminalView1.Print("\e[m") +' +' End + +Public Sub Button6_Click() + + Swap TerminalView1.Background, TerminalView1.Foreground + +End + +' Public Sub TerminalView1_Resize(W As Integer, H As Integer) +' +' Debug W;; H +' +' End + +Public Sub Button7_Click() + + TerminalView1.ReadOnly = Not TerminalView1.ReadOnly + +End diff --git a/comp/src/gb.form.terminal/.src/TerminalView/test/FTestTerminalView.form b/comp/src/gb.form.terminal/.src/TerminalView/test/FTestTerminalView.form new file mode 100644 index 00000000..9c1cfbcc --- /dev/null +++ b/comp/src/gb.form.terminal/.src/TerminalView/test/FTestTerminalView.form @@ -0,0 +1,56 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,140,98) + Icon = Picture["terminalview.png"] + Arrangement = Arrange.Vertical + { TerminalView1 TerminalView + MoveScaled(4,3,63,35) + Font = Font["Gambas,11"] + Background = Color.White + Foreground = Color.Black + Expand = True + Border = False + Limit = 0 + Blink = True + } + { Panel1 HBox + MoveScaled(2,45,120,5) + { TextBox1 TextBox + MoveScaled(1,0,43,5) + Expand = True + } + { Button1 ToggleButton + MoveScaled(49,0,5,5) + Text = ("B") + } + { Button2 ToggleButton + MoveScaled(54,0,5,5) + Text = ("U") + } + { Button3 ToggleButton + MoveScaled(59,0,5,5) + Text = ("R") + } + { Button4 ToggleButton + MoveScaled(64,0,5,5) + Text = ("D") + } + { Button5 ToggleButton + MoveScaled(69,0,5,5) + Text = ("b") + } + { Button7 Button + MoveScaled(75,1,16,4) + Text = ("ReadOnly") + } + { Button6 Button + MoveScaled(91,1,16,4) + Text = ("Test") + } + } + { Timer1 #Timer + #MoveScaled(87,14) + Delay = 50 + } +} diff --git a/comp/src/gb.form.terminal/.src/TerminalView/test/Form1.class b/comp/src/gb.form.terminal/.src/TerminalView/test/Form1.class new file mode 100644 index 00000000..95ece263 --- /dev/null +++ b/comp/src/gb.form.terminal/.src/TerminalView/test/Form1.class @@ -0,0 +1,44 @@ +' Gambas class file + + +Public Sub Form_MouseUp() + + Print "MouseUp" + +End + +Public Sub Form_MouseDown() + + Print "MouseDown" + +End + +Public Sub Form_DblClick() + + Print "DblClick" + +End + +Public Sub Form_Open() + + + +End + +Public Sub DrawingArea1_Draw() + + + +End + +Public Sub DrawingArea1_MouseDown() + + Print "MouseDown" + +End + +Public Sub DrawingArea1_MouseUp() + + Print "MouseUp" + +End diff --git a/comp/src/gb.form.terminal/.src/TerminalView/test/Form1.form b/comp/src/gb.form.terminal/.src/TerminalView/test/Form1.form new file mode 100644 index 00000000..8c32de2b --- /dev/null +++ b/comp/src/gb.form.terminal/.src/TerminalView/test/Form1.form @@ -0,0 +1,9 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,64,64) + { DrawingArea1 DrawingArea + MoveScaled(20,6,34,37) + Background = Color.DarkGray + } +} diff --git a/comp/src/gb.form.terminal/.src/TerminalView/test/MTest.module b/comp/src/gb.form.terminal/.src/TerminalView/test/MTest.module new file mode 100644 index 00000000..3bc41511 --- /dev/null +++ b/comp/src/gb.form.terminal/.src/TerminalView/test/MTest.module @@ -0,0 +1,8 @@ +' Gambas module file + +Public Sub Main() + + Print "\e[38;5;10mGambas\e[m" + Print "\e[48;5;10mGambas\e[m" + +End diff --git a/comp/src/gb.form.terminal/.src/TerminalView/test/PipeTest.class b/comp/src/gb.form.terminal/.src/TerminalView/test/PipeTest.class new file mode 100644 index 00000000..b32c7634 --- /dev/null +++ b/comp/src/gb.form.terminal/.src/TerminalView/test/PipeTest.class @@ -0,0 +1,224 @@ +' Gambas class file + +Private $hPipeIn As File +Private $hPipeOut As File +Private InPipe As File +Private OutPipe As File +Private $hMySock As Socket +Private $oTelnet As TelNetProtocol + +Public TheTask As PipedTask + + + +Public Sub Form_Open() + + OutPipe = Pipe "/tmp/MyPipeIn" For Write ' providers output pipe + $hPipeIn = Pipe "/tmp/MyPipeIn" For Read Watch + + $hPipeOut = Pipe "/tmp/MyPipeOut" For Write ' open this first so other side never blocks + InPipe = Pipe "/tmp/MyPipeOut" For Read ' providers in pipe + + + If Not trmTest.ConnectTo(OutPipe, InPipe, Null) Then + + Close $hPipeOut + Close InPipe + Close OutPipe + Close $hPipeIn + $hPipeIn = Null + $hPipeOut = Null + InPipe = Null + OutPipe = Null + + Endif + +End + +Public Sub file_read() + + If Not Lof($hPipeIn) Then Return + + DataFromTerminal.Text &= Read #$hPipeIn, Lof($hPipeIn) + +End + +Public Sub sndTxt_Click() + + If TheTask Then + TaskStop_Click() + Endif + + If Not $hPipeIn Then + Form_Open() + Endif + + Write #$hPipeOut, dataToSend.Text + +End + +Public Sub KillSession_Click() + + trmTest.Kill() + + If $hPipeIn Then Close #$hPipeIn + If $hPipeOut Then Close #$hPipeOut + If InPipe Then Close InPipe + If OutPipe Then Close OutPipe + + $hPipeIn = Null + $hPipeOut = Null + InPipe = Null + OutPipe = Null + + +End + + + +Public Sub TaskTest_Click() + + If TheTask Then Return + + PipedTask.$sInputFileName = "/tmp/MyPipeIn" + PipedTask.$sOutputFileName = "/tmp/MyPipeOut" + + TheTask = New PipedTask As "TheBestTask" ' Start the task which should wait on the input stream until opened by the terminal + + Wait 1 + + If TheTask Then + + InPipe = Pipe PipedTask.$sInputFileName For Write + OutPipe = Pipe PipedTask.$sOutputFileName For Read + + trmTest.ConnectTo(InPipe, OutPipe, Null) ' tell the terminal about the remote task + + Endif + +End + + + +Public Sub TaskStop_Click() + + If Not Thetask Then Return + + trmTest.Kill() + + TheTask.Stop() + + Close InPipe + Close OutPipe + + Thetask = Null + InPipe = Null + OutPipe = Null + +End + +Public Sub TheBestTask_Read(buffer As String) + + DataFromTerminal.text &= "Task stdout -> " & buffer ' display from task stdout + +End + +Public Sub TheBestTask_kill() + DataFromTerminal.text &= "Task Killed" +End + + + +Public Sub StartRs232_Click() + + $hPipeIn = SerialPort1.Open() + $hPipeOut = $hPipeIn() + + If Not trmTest.ConnectTo($hPipeIn, $hPipeOut, Null) Then + + Close $hPipeOut + Close $hPipeIn + $hPipeIn = Null + $hPipeOut = Null + + + Endif + +End + +Public Sub Stoprs232_Click() + + KillSession_Click ' should be same as this + +End + +Public Sub TelnetTest_Click() +Dim Port As Integer +Dim host As String + + + $hMySock = New Socket As "Socket1" + Port = Val(PortNumber.text) + host = HostName.text + + $hMySock.Connect(Host, port) + + DataFromTerminal.text &= "Opening Socket host = " & Host & ", Port = " & Str$(Port) & "\n" + +End + +Public Sub Socket1_Found() + + DataFromTerminal.text &= "Found Socket\n" +End + + + +Public Sub Socket1_Ready() + + + DataFromTerminal.text &= "Ready to send receive on socket\n" + + $oTelnet = New TelNetProtocol($hMySock) + + trmTest.ConnectTo($hMySock, $hMySock, ByRef $oTelnet) + +End + + + +Public Sub TelNetStop_Click() + + If Not $hMySock Then Return + trmTest.Kill + Close #$hMySock + $hMySock = Null + DataFromTerminal.text &= "Closed for send receive on socket\n" + +End + +Public Sub Socket1_Error() + + DataFromTerminal.text &= "Error on socket(" & Str$($hMySock.Status) & ")\n" + $hMySock = Null + +End + +Public Sub Socket1_Closed() + + DataFromTerminal.text &= "Event Closed for send receive on socket\n" + + +End + +Public Sub Socket1_Read() + + Return + +End + +Public Sub Socket1_Write() + + Return + +End diff --git a/comp/src/gb.form.terminal/.src/TerminalView/test/PipeTest.form b/comp/src/gb.form.terminal/.src/TerminalView/test/PipeTest.form new file mode 100644 index 00000000..8fc6c681 --- /dev/null +++ b/comp/src/gb.form.terminal/.src/TerminalView/test/PipeTest.form @@ -0,0 +1,75 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,147,69) + { trmTest TerminalView + MoveScaled(2,4,58,56) + } + { sndTxt Button + MoveScaled(132,4,13,4) + Text = ("Send data") + } + { dataToSend TextBox + MoveScaled(66,3,61,6) + Text = ("Test Data to the terminal") + } + { DataFromTerminal TextArea + MoveScaled(66,15,65,41) + } + { Label1 Label + MoveScaled(67,11,44,4) + Text = ("Data From Terminal") + } + { KillSession Button + MoveScaled(132,20,14,6) + Text = ("kill Session") + } + { TaskTest Button + MoveScaled(132,27,14,6) + Text = ("Task Testing") + } + { TaskStop Button + MoveScaled(132,33,14,5) + Text = ("Task Stop") + } + { Timer1 #Timer + #MoveScaled(29,61) + } + { SerialPort1 #SerialPort + #MoveScaled(43,61) + FlowControl = SerialPort.None + PortName = "/dev/ttyS0" + } + { StartSession Button + MoveScaled(132,14,14,6) + Text = ("Start Session") + } + { StartRs232 Button + MoveScaled(132,40,14,6) + Text = ("Start Rs232") + } + { Stoprs232 Button + MoveScaled(132,46,14,5) + Text = ("Stop Rs232") + } + { TelnetTest Button + MoveScaled(132,57,14,5) + Text = ("Telnet Start") + } + { Socket1 #Socket + #MoveScaled(54,61) + Host = "localhost" + } + { TelNetStop Button + MoveScaled(132,62,14,5) + Text = ("telNet Stop") + } + { HostName TextBox + MoveScaled(67,57,63,5) + Text = ("127.0.0.1") + } + { PortNumber TextBox + MoveScaled(67,62,63,5) + Text = ("23") + } +} diff --git a/comp/src/gb.form.terminal/.src/TerminalView/test/PipedTask.class b/comp/src/gb.form.terminal/.src/TerminalView/test/PipedTask.class new file mode 100644 index 00000000..58fb39c5 --- /dev/null +++ b/comp/src/gb.form.terminal/.src/TerminalView/test/PipedTask.class @@ -0,0 +1,73 @@ +' Gambas class file + +Inherits Task + +Private $hPipeIn As File +Private $hPipeOut As File + +Static Public $sInputFileName As String +Static Public $sOutputFileName As String + + +Public Sub Main() + Dim i As Integer = 1 + + Print "Task is up and running" + + $hPipeOut = Pipe $sOutputFileName For Write + + Print "Task has opened output file : " & $sOutputFileName + Wait 2 + Print "Waited 2 Seconds" + + $hPipeIn = Pipe $sInputFileName For Read Watch ' we should hang on this till the other side starts + + Print "Task IO in " & $sInputFilename + + Do + + Wait 5 + + Print " Task Is alive " & i + Inc i + If $hPipeIn.EndOfFile Then + Print " Task Pipe Closed on other end" + Wait 1 + Break + Endif + + Loop + + +End + +Public Sub file_read() + + Dim $sBuffer As String + Dim $sChar As String + + + Print "Got read message" + + If Lof($hPipeIn) Then + + $sBuffer = "Term Key Rx .. Echoed back ---->" + + $sChar = Read #$hPipeIn, Lof($hPipeIn) + + Write #$hPipeOut, $sChar + + Print $sBuffer & $sChar + + Endif + +End + +Public Sub _kill() + + Print "Exit task" + + Close #$hPipeIn + Close #$hPipeOut + +End diff --git a/comp/src/gb.form.terminal/.src/TerminalView/test/TelNetProtocol.class b/comp/src/gb.form.terminal/.src/TerminalView/test/TelNetProtocol.class new file mode 100644 index 00000000..59e85961 --- /dev/null +++ b/comp/src/gb.form.terminal/.src/TerminalView/test/TelNetProtocol.class @@ -0,0 +1,139 @@ +' Gambas class file + +Private $hOutput As Stream + +Private state As Integer + +Const t_Will As Byte = &hfb +Const t_DO As Byte = &hfd +Const t_dont As Byte = &hfe +Const t_wont As Byte = &hfc +Const t_IAC As Byte = &hff +Const t_sb As Byte = &hfa +Const t_se As Byte = &hf0 +Const t_nop As Byte = &hf1 +Const t_GoAhead As Byte = &hf9 + +Public Enum c_BinaryTx, + c_EchoData, + C_reconnect, + c_SuppressGA, + c_MsgSize, + c_OptStatus, + c_TimingMark, + c_RCXmtEcho, + c_LineWidth, + c_PageLength, + c_CrUsage, + c_SetHTabs, + c_HorTabUse, + c_FFUse, + c_SetVTab, + c_vtabUse, + c_LfUse, + c_ExtAsc, + c_LogOut, + c_ByteMacro, + c_DataTerm, + c_SUPDUP, + c_SUPDUPOutput, + c_SendLocate, + c_TermType, + c_EndRecord, + c_TACACSId, + c_OutputMark, + c_TermLocNum, + c_3270Emulate, + c_X3pad, + c_WinSize, + c_TermSpeed, + c_RemoteFlow, + c_LineMode, + c_xdispLocation, + c_NewEnvOption = &h27, + c_Extend = &hff + + + + + + +Public Sub Preprocess(ByRef DataIn As String, ByRef Len As Integer) As Boolean ' Use byref to allow the process to edit the data as needed +Dim MyBuff As String +Dim Cchar As Byte +Dim myOutBuf As String + + + If Len <= 0 Then Return True + + Cchar = Byte@(DataIn) + + Print Hex$(Cchar, 2) + + While Cchar = t_iac + If len <= 2 Then Break + Print "Got Command" + MyBuff = Mid$(DataIn, 2, 2) + len -= 3 + dataIn = Mid$(dataIn, 4, len) + + Cchar = Byte@(MyBuff) + + If Cchar = T_do Then + + MyBuff = Mid$(MyBuff, 2, 1) + Cchar = Byte@(MyBuff) + + Print Hex$(c_TermSpeed) + + Select Case Cchar + Case c_TermSpeed + MyOutBuf &= Chr$(t_IAC) & Chr$(t_will) & Chr$(c_TermSpeed) & Chr$(t_IAC) & Chr$(t_sb) & Chr$(c_TermSpeed) & Chr$(&h00) & "38400,38400" & Chr$(&hff) & Chr$(&f0) + + Case c_TermType + MyOutBuf &= Chr$(t_IAC) & Chr$(t_will) & Chr$(c_TermType) & Chr$(t_IAC) & Chr$(t_sb) & Chr$(c_TermType) & Chr$(&h00) & "VT100" & Chr$(&hff) & Chr$(&hf0) + + Case c_xdispLocation + MyOutBuf &= Chr$(t_IAC) & Chr$(t_wont) & Chr$(c_xdispLocation) + + Case c_NewEnvOption + MyOutBuf &= Chr$(t_IAC) & Chr$(t_wont) & Chr$(c_NewEnvOption) + + Case c_EchoData + MyOutBuf &= Chr$(t_IAC) & Chr$(t_wont) & Chr$(c_EchoData) + state += 1 + Case Else + Print "Unknown or Unprocessed command " & Hex$(Cchar) + End Select + Endif + If len > 0 Then + Cchar = Byte@(DataIn) + Print Hex$(Cchar, 2) + Endif + Wend + + If state = 0 Then + MyOutBuf &= Chr$(t_iac) & Chr$(t_DO) & Chr$(c_EchoData) + state += 1 + Endif + + If Len(MyOutBuf) > 0 Then + Write #$hOutput, MyOutBuf, Len(myOutBuf) + Endif + + +If Len > 0 Then + Return True ' default to allowing the terminal to process the data +Else + Return False +Endif + +End + +Public Sub _new(StreamOut As Stream) + + $hOutput = StreamOut + + +End + diff --git a/comp/src/gb.form.terminal/.src/TerminalView/test/VT100/Attr.class b/comp/src/gb.form.terminal/.src/TerminalView/test/VT100/Attr.class new file mode 100644 index 00000000..5d5a3240 --- /dev/null +++ b/comp/src/gb.form.terminal/.src/TerminalView/test/VT100/Attr.class @@ -0,0 +1,220 @@ +' Gambas class file + +' Gambas class file + +Public Enum Color8, Color256, ColorRGB + +Private CSI As String = Chr(27) & "[" +Property Read Modified As Boolean + +Property ColorMode As Integer +Property Foreground As Integer +Property Background As Integer +Property Bold As Boolean +Property Hidden As Boolean +Property Underline As Boolean +Property Reverse As Boolean +Property Blink As Boolean + +Private Enum CH_BOLD, CH_HIDDEN, CH_UNDERLINE, CH_REVERSE, CH_BLINK, CH_FOREGROUND, CH_BACKGROUND + +Private $aModified As New Boolean[8] +Private $aValues As New Boolean[8] + +Private $iColorMode As Integer = Color8 +Private $iForeground As Integer +Private $iBackGround As Integer + +Public Enum Black, Red, Green, Yellow, Blue, Magenta, Cyan, White + + +Private Function Modified_Read() As Boolean + + Dim b As Boolean + + For Each b In $aModified + If b Then Return True + Next + +End + + + +Private Function Foreground_Read() As Integer + + Return $iForeground + +End + +Private Sub Foreground_Write(Value As Integer) + + $iForeground = Value + $aModified[CH_FOREGROUND] = True + +End + +Private Function Background_Read() As Integer + + Return $iBackGround + +End + +Private Sub Background_Write(Value As Integer) + + $iBackGround = Value + $aModified[CH_BACKGROUND] = True +End + +Private Function Bold_Read() As Boolean + + Return $aValues[CH_BOLD] + +End + +Private Sub Bold_Write(Value As Boolean) + + $aValues[CH_BOLD] = Value + $aModified[CH_BOLD] = True + +End + +Private Function Hidden_Read() As Boolean + + Return $aValues[CH_HIDDEN] + +End + +Private Sub Hidden_Write(Value As Boolean) + + $aValues[CH_HIDDEN] = Value + $aModified[CH_HIDDEN] = True + +End + +Private Function Underline_Read() As Boolean + + Return $aValues[CH_UNDERLINE] + +End + +Private Sub Underline_Write(Value As Boolean) + + $aValues[CH_UNDERLINE] = Value + $aModified[CH_UNDERLINE] = True + +End + +Private Function Reverse_Read() As Boolean + + Return $aValues[CH_REVERSE] + +End + +Private Sub Reverse_Write(Value As Boolean) + + $aValues[CH_REVERSE] = Value + $aModified[CH_REVERSE] = True + +End + +Private Function Blink_Read() As Boolean + + Return $aValues[CH_BLINK] + +End + +Private Sub Blink_Write(Value As Boolean) + + $aValues[CH_BLINK] = Value + $aModified[CH_BLINK] = True + +End + +Public Sub Reset() + + + $aValues = New Boolean[8] + $aModified = New Boolean[8] + Print CSI & "0m"; + +End + + +Private Function ColorMode_Read() As Integer + + Return $iColorMode + +End + +Private Sub ColorMode_Write(Value As Integer) + + $iColorMode = Value + '$bModified = True + +End + +Public Sub Send() + + Dim sValue As String + If $aModified[CH_BOLD] Then sValue &= IIf($aValues[CH_BOLD], "1;", "22;") + If $aModified[CH_HIDDEN] Then sValue &= IIf($aValues[CH_HIDDEN], "8;", "28;") + If $aModified[CH_BLINK] Then sValue &= IIf($aValues[CH_BLINK], "5;", "25;") + If $aModified[CH_UNDERLINE] Then sValue &= IIf($aValues[CH_UNDERLINE], "4;", "24;") + If $aModified[CH_REVERSE] Then sValue &= IIf($aValues[CH_REVERSE], "7;", "27;") + + If $aModified[CH_FOREGROUND] Then + Select Case $iColorMode + Case Color8 + sValue &= (30 + Max(Min($iForeground, 8), 0)) & ";" + Case Color256 + sValue &= "38;5;" & Max(Min($iForeground, 255), 0) & ";" + Case ColorRGB + sValue &= "38;2;" & Subst("&1;&2;&3;", GetRed($iForeGround), GetGreen($iForeground), GetBlue($iForeground)) + End Select + Endif + + If $aModified[CH_BACKGROUND] Then + Select Case $iColorMode + Case Color8 + sValue &= (40 + Max(Min($iBackGround, 8), 0)) & ";" + Case Color256 + sValue &= "48;5;" & Max(Min($iBackGround, 255), 0) & ";" + Case ColorRGB + sValue &= "48;2;" & Subst("&1;&2;&3;", GetRed($iBackGround), GetGreen($iBackGround), GetBlue($iBackGround)) + End Select + Endif + + + + + + If Not sValue Then Return + + If sValue Ends ";" Then sValue = Left(sValue, -1) + + sValue = CSI & sValue & "m" + + $aModified = New Boolean[8] + + Print sValue; + +End + +Private Function GetRed(iValue As Integer) As Integer + + Return Lsr(iValue, 16) And 255 + +End + +Private Function GetGreen(iValue As Integer) As Integer + + Return Lsr(iValue, 8) And 255 + +End + +Private Function GetBlue(iValue As Integer) As Integer + + Return iValue And 255 + +End + diff --git a/comp/src/gb.form.terminal/.src/TerminalView/test/VT100/Console.class b/comp/src/gb.form.terminal/.src/TerminalView/test/VT100/Console.class new file mode 100644 index 00000000..71b65534 --- /dev/null +++ b/comp/src/gb.form.terminal/.src/TerminalView/test/VT100/Console.class @@ -0,0 +1,63 @@ +' Gambas class file + +Create Static +'Private $sBuffer As String +Private $bBuffered As Boolean +Private ESC As String = Chr(27) +Private CSI As String = Chr(27) & "[" +Property Read Attr As Attr +Private $hAttr As New Attr + +Public Sub Begin() + + $bBuffered = True + +End + +Public Sub End() + + $bBuffered = False + +End + + +Public Sub Print(sValue As String) + + If $hAttr.Modified Then + $hAttr.Send + Endif + + Print sValue; + +End + +Private Function Attr_Read() As Attr + + Return $hAttr + +End + +Public Sub SetTitle(sText As String) + + Print ESC & "]2;" & sText & Chr(7) + +End + +Public Sub Goto(Row As Integer, Column As Integer) + + Print CSI & Row & ";" & Column & "H"; + +End + +Public Sub Info() + + Print CSI & "?6n;" + +End + +Public Sub Reset() + + Print CSI & "!p"; + +End + diff --git a/comp/src/gb.form.terminal/.src/TerminalView/test/VT100/Main.module b/comp/src/gb.form.terminal/.src/TerminalView/test/VT100/Main.module new file mode 100644 index 00000000..0f2151ed --- /dev/null +++ b/comp/src/gb.form.terminal/.src/TerminalView/test/VT100/Main.module @@ -0,0 +1,38 @@ +' Gambas module file + +' Gambas module file + +Public Sub Main() + + Dim i As Integer + Dim j As Integer + console.SetTitle("C'est mon test") +Console.Attr.ColorMode = Attr.Color256 +For i = 0 To 255 + For j = 0 To 255 + Console.Attr.Foreground = i + Console.Attr.Background = j + Console.Print(i & "/" & j) + Next + Console.Attr.Reset + console.Print("\n\n") +Next + + + +Console.Attr.Bold = True +Console.Attr.Reverse = True +Console.Print("C'est Finit !!!!\n") +console.Attr.Reverse = False + +console.Attr.ColorMode = Attr.ColorRGB + +Console.Attr.Background = &HFFF505 + +console.Print("Sans reverse") + + + +Console.Goto(8, 25) +Console.Reset +End diff --git a/comp/src/gb.form.terminal/brush_dark.png b/comp/src/gb.form.terminal/brush_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..9a5b3ff88a25fce01047ba3375a30d0a73db5d08 GIT binary patch literal 85 zcmeAS@N?(olHy`uVBq!ia0vp^93adHBpBY5G^+tArjj7PUbP0l+XkKxcU>I literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.terminal/brush_light.png b/comp/src/gb.form.terminal/brush_light.png new file mode 100644 index 0000000000000000000000000000000000000000..c0290fce0fad7722ba7a15ed1de12a3ff926fabb GIT binary patch literal 85 zcmeAS@N?(olHy`uVBq!ia0vp^93adHBpBY5G^+tArjj7PUFVdQ&MBb@0KTge=l}o! literal 0 HcmV?d00001 diff --git a/comp/src/gb.form.terminal/brush_medium.png b/comp/src/gb.form.terminal/brush_medium.png new file mode 100644 index 0000000000000000000000000000000000000000..b1305b86a8fd7e889191ee01e24a16a3e2e5d401 GIT binary patch literal 85 zcmeAS@N?(olHy`uVBq!ia0vp^93adHBpBY5G^+tArjj7PU 3.14.90 + +* Tue Aug 18 2015 Benoit Minisini 3.8.0 + +* Sat Aug 01 2015 Benoit Minisini 3.8.0 + +* Thu Mar 19 2015 Benoit Minisini 3.7.90 +- Version initiale + diff --git a/comp/src/gb.form/.hidden/control/buttonbox.png b/comp/src/gb.form/.hidden/control/buttonbox.png new file mode 100644 index 0000000000000000000000000000000000000000..1eb6ad698b2cd1337545ce34e12decd19f22efff GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UnVv3=As)xyPT9!YV8FxDe}GF) zbFu+P;_NpQCfYD_@uqg2aBDhrz2>X<&1p;rzw0br+_7=(i8i@wRwq`T{PSzE$358= z1(wTAr~G7}Y*|ovk?0+I@0JN0B M)78&qol`;+0IJHq)$ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form/.hidden/control/colorbutton.png b/comp/src/gb.form/.hidden/control/colorbutton.png new file mode 100644 index 0000000000000000000000000000000000000000..79cadaa274ab050e9e68fce12bc792fd79934750 GIT binary patch literal 504 zcmV`}_O(`T4oi?Rl-@d9C5P)b989_tWC>Z>QhU;PCbJ^|jFJw9o4E^YhT( z?#|xr^78Vv&*^up;CQUyw9e`9@bK>L?(O8{=(o4$x3}!$etzoV;o#`tZ^Un3zh7|0aO>;q=C-!xwY9IFMd@w6x{4w5`^yt=FyR z=jZ3%-r#+G-+X-L-QC^f-EPBf+~nNl<>lqv+~TpZ;j+uPgX+p5&6tJSO8;@acm zGy-P z;DpYEgUy5A^56B+(&2Y^_0iGH>&$4wXlKG_ z;Bs=`adGs`&B*Dh|io(hXPqShyr;9910Yb zltJ>!EQ+|isiLYTEv=@ijys?@*9c`GXp1y&Bz8{b#=A%qy_Z= bDbHYE)a{O7-00000NkvXXu0mjf!zi*a literal 0 HcmV?d00001 diff --git a/comp/src/gb.form/.hidden/control/colorpalette.png b/comp/src/gb.form/.hidden/control/colorpalette.png new file mode 100644 index 0000000000000000000000000000000000000000..c99851687c4067f214e87a31b40e6621e7e64665 GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvi2$Dv*M^3M|Ns9VetvlU{q^zt z<7Z!=egFRb0|ySo)M{SFVdQ&MBb@0OIRcL;wH) literal 0 HcmV?d00001 diff --git a/comp/src/gb.form/.hidden/control/datebox.png b/comp/src/gb.form/.hidden/control/datebox.png new file mode 100644 index 0000000000000000000000000000000000000000..71b6cb1efefd4e9d60609fb86887fafbc756481c GIT binary patch literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyegQrqu0Xn>q2b@ZfB*mgpFe+o zc6N42Nl8vl&b)c^Ud)=+Sy&h!AKzY3a6dnPd3t(9Vq#Zva%E!Tvh?)6zP_HGp8ERw z^XJe1`0?Z1xpVvX@4qemEe>cRV@Z%-FoVOh8)-mJs;7%%h{frKog-$%TWJ{yVGqwq9L^7f_i0z7F%5!M{-s8t$a`uU> zt~Mt_WHHAcLobH14naPFgFnAKZ`)q9{YTTA!%yPYb?I4fbA8vfwh#nb$l&Sf=d#Wz Gp$PyxV{7#Q literal 0 HcmV?d00001 diff --git a/comp/src/gb.form/.hidden/control/datechooser.png b/comp/src/gb.form/.hidden/control/datechooser.png new file mode 100644 index 0000000000000000000000000000000000000000..4c439e54b50752207156ccdbc0313b8685b9775f GIT binary patch literal 547 zcmV+;0^I$HP)`t$b#-;|@$r_HmTGEhZfkk;1L#l^+R$;pwCk(rs9>gwvt%gfQx(aOronwpwJ<#uulGuW<&rh*AMNfPf%EQABzC z|6k-RT(qg$7zt-_(%gJ$&SrAC%+RmdD)4r81(Dp_mqZ7LM_vl#;U5#76bh$AXFl>N za1LA$T>^^e3eZVlj41*oW6D6;m=aKQrx;-73UJL_1**(9x2U*N64ZjbI&-6W-(aqX zK`jZawXJqDw6+rj9c#mfcFUb&09~znzOS|Zs-D(e#DSaMe;l~4;n3CKsZXRf3`WnX zj1pihmdKI;Vst05k$Fwg3PC literal 0 HcmV?d00001 diff --git a/comp/src/gb.form/.hidden/control/dirchooser.png b/comp/src/gb.form/.hidden/control/dirchooser.png new file mode 100644 index 0000000000000000000000000000000000000000..bac38c7b1523c88da6c70a52a4777bc8d5c754d9 GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvp#Yx{*M^3M|Ns9#c<|uBfdl!= z@9((sem9G%2vFA7)5S4F<9u?01A9-ChC_n}W2&R0xO)mCqqC#9xOj^0nWl9M6@Rca zL9`a%81 zM?E{A?zr;4YTZMglO3)=HMX8Ejv*T7lM@`+dzv&H8f+L9RRt8B4@j`^C^D((1w2^8 zA;{s~+;l}yGeC-q^FVdQ&MBb@0B%1p AVE_OC literal 0 HcmV?d00001 diff --git a/comp/src/gb.form/.hidden/control/documentview.png b/comp/src/gb.form/.hidden/control/documentview.png new file mode 100644 index 0000000000000000000000000000000000000000..b067f2e1f8b3814d344e8a97838095b6baede58d GIT binary patch literal 620 zcmV-y0+aoTP)w+1bU##m>&o>FMdBqM~(mb!lm7d3kxPtgPgwukZEay;VPIfjm6et7@bLZp{g022l9G~~oSgFV@|KpC z>+9?M{QUFt^O>2M?Ck8An3!v8YxMN=wzjsWsX7|~009I^L_t(I%VS_52pI7K`YB+- z0L*9#SXfa38@d8kG?Uq}D&XMc;^yJy!=->mUaCCCU8V+nOuDWi~6i6uf>Y1CE zJNfy0`3D3BVT%iG{b17&8)t8SFR#!rJhAB$;N|5X9)YTWjU5RDh5~Kz)<#yqi~=H~ z!hyC#^W#aAF(6ww@g-XASbwiLys0{#GcJLYWKUxS1ONc$ASt*$uN(gW0000*p(_LOfr1cmR#t|FhK5(3oezPcswF{w z!4QoM46<@E^0SXB99f`ycBio5HhsrSE0$h%iM$e9Qpsd|<7nz8pu!cNE{-73G6(M|Hu(rX+0?A8P})+_e#g3oQHX)FfyIGIf$@SpL#x@u{}zlQTBiR0 iUbimXI`hy4E?Y+CHOg9?8Ml{%Jm=}^=d#Wzp$PzhMSUy) literal 0 HcmV?d00001 diff --git a/comp/src/gb.form/.hidden/control/filechooser.png b/comp/src/gb.form/.hidden/control/filechooser.png new file mode 100644 index 0000000000000000000000000000000000000000..8ce2155342715d047e38b2c77d12ca6c34b09e97 GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvp#Yx{*M^3M|Ns9VIB?*>g9rJ` z@9((s{@%IOO+Z-}PZ!4!jq}L~4(vTm0tze(SvrIaghUD%IXN^nHJeyjL|kKHWLh1v z6quTPlol?mU~PyBV0CC~I@=&=^~zwDHIFOV6f+>a-+)MkJ6JkdH!Sp<>L3RP}JPp^pmUsZjlS*p42IPk`sJPK!EDD9NI_s;6aUXYVLUHx3vIVCg!02>}i AzyJUM literal 0 HcmV?d00001 diff --git a/comp/src/gb.form/.hidden/control/fileview.png b/comp/src/gb.form/.hidden/control/fileview.png new file mode 100644 index 0000000000000000000000000000000000000000..cd6f33030bf16e2855523f05270d7e04ce02cc1f GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^3Lwk@BpAX3RW*QAr>Bc!h{fsToP-1X5fZOHo-#KQ zG-zlnV%6aR0rrijZYqly6nsqfsQ=TJ!o<8^s;w#d{)#6aO0|rP-18hHjW}Ki1`$*{{L1 nul8_$ldZ0-XN$hnM{Nd%mJqSlNxtTBAjf&S`njxgN@xNAvw%O! literal 0 HcmV?d00001 diff --git a/comp/src/gb.form/.hidden/control/fontbox.png b/comp/src/gb.form/.hidden/control/fontbox.png new file mode 100644 index 0000000000000000000000000000000000000000..f5ff63da97d715e2b996a3ec0db41cda0397dc61 GIT binary patch literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^3Lwk@BpAX3RW*PVQ%R6tFatx`hw4$Jc0-)FGF=+FJL2R?AObKdFtt{?uV?)abY%IgYF1f^G; zobvX}=MVhM%+81Fa~}Lo*I3NB+g#Fu!%b{b)Bhh!{u^&FFcCCL2Kqwie(>qF(nXmd OUwXRwxvXBFT$k zPvCH`4e;_&7AL!HOTO=%yMfj|AR=iw2z2spi&Gs~O+sh=8SdObDq637CV{~P z1q@R-0U=2-0PVU4n9U)NG5Jt0s*T@!C?8e7=jes+0ZI;lak*9S1d2IeDwUWZUjT#) zr~tzoA>j3gg(XZCNQ40D04-M-0aThm=?uVdT8QaOFtSU5;w=Dgk~2f*%7ljlU{nVh zlTM4-OV literal 0 HcmV?d00001 diff --git a/comp/src/gb.form/.hidden/control/imageview.png b/comp/src/gb.form/.hidden/control/imageview.png new file mode 100644 index 0000000000000000000000000000000000000000..5e161d0f42dd5c81575592a62308a4e2a83a41dc GIT binary patch literal 363 zcmV-x0hIoUP)grnf_|f(J z^{wo!(DTsz{`}$i;p+P8oamfy-*1ECgV6NQ+4k9n!@|$b>sNshvbKQ;d^@FdP?RP(f|MenMp)JR5;7U(#aBn zFbsfUlnPoAw4yZPh8u#*`#+woCz#YkFZdsN$v2(pG@i%SBkKiO$$vMa|e?dQ4yOfR4l5XDCju@L|O002ov JPDHLkV1n#A!@K|h literal 0 HcmV?d00001 diff --git a/comp/src/gb.form/.hidden/control/lcdlabel.png b/comp/src/gb.form/.hidden/control/lcdlabel.png new file mode 100644 index 0000000000000000000000000000000000000000..2b1d807ff0833f6b9d8aaebdb37042977718bc36 GIT binary patch literal 492 zcmVkdg0005ANklh=OH%|Ej#(aJu+cfB_? z2Lw)Xvq9gRxtv4b)U*kMCQgd`{Zh`R$W4nR%a&Vs9B;OFel%|$a&x>2l~#kmdwc+n zX1ph%^V4kc62Gpdz)(RbQ3Vt$o8`eN`m8!AMz!eGv{-`Pz=b>To&wggivDHz=$ybu z3L!@HKk^>j6q5PsAjAm%r#11W?HD3QRDC#*g^#z6XQmf*I_FD+Xv;TA#zB89~=Mp zQ^PtRo%bTDIlH-tmK|^3gMjOo$Eudj*Q(at&aHg+v*1HN7u3Nokdtw47~x#7JJ|th zeAq0%{1U*gw^^CeT1Qyw2s}r75WzXxtJ1F$p1eLu;PJP75Bj(X?f4jRf8)#Mi2YCe i%NIxU0Q=*9<^KT?KIy${ymsOM0000Q$Za$dY)V1REw!#^UJNM3$%x;TbdoPK-iE?<)YPus(M=ZOa$ zQm5LxhFtl*-z8Pq&`?%o&a3JRW-ps-)SjemTH3(pYRR}_)$GSBRpl2Ho3A-N)n>t~ zyuG5j{431%3V)x(>YD8Ku_CHreM?P$f+#~aqk+Pm1d)kJjE|0R&TV49d5vo?w=F~D up6Nzj?e_c(s#}Vtv)BA;j%POB%U~ZS%f30|`Bk917(8A5T-G@yGywqf(w7_n literal 0 HcmV?d00001 diff --git a/comp/src/gb.form/.hidden/control/listeditor.png b/comp/src/gb.form/.hidden/control/listeditor.png new file mode 100644 index 0000000000000000000000000000000000000000..e7d53c2c2fe73544c4675bae4afb25badf0fea10 GIT binary patch literal 329 zcmV-P0k-~$P)$`uh4`UtiVL)$Hu-=;-L~?(U(Xp?G+BIyyS}`T12< zRaaM6hK7cDd3jJ!P*gtFI2LJ#7cS%G+R5;6HU?2z> z@q&?~fC(=cRWPU&5CjmF%*+I=U}43hfQ_AliIa;P$mQY1s(_DQK#)^NScFMbOdP8M z2}vmlPF5yqZW-)W$jZr!DR8nXDk-aAS0E^-Dy_iDucpqVp(%pZ3N39NW-VQyHx%`B bNDn9gQdJ8FkLfyp00000NkvXXu0mjf8ONC2 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form/.hidden/control/maskbox.png b/comp/src/gb.form/.hidden/control/maskbox.png new file mode 100644 index 0000000000000000000000000000000000000000..4600e347a101adb42e6ed70dee337e1328639d9f GIT binary patch literal 338 zcmeAS@N?(olHy`uVBq!ia0vp^3Lwk@BpAX3RW*PVQ%R6tFatx`4gHZX~`S-II<`agSy#D|l{21W*gMa)-4{+vp;Fz;_{Ogyx&@;^ilCO4e{n&d*+Yrzh9QB`GK5(tY!Y*~b)TCwww;XuCVF@%!|>Cui4Gw&iaU z3tz*#U|r6S|NsBj+ltAW>ixZZRB2OHPE_vgsg+-kE}8oeDD%Ib+2x?_<^RIcK=%6Y zA6C8t(zC1nN8kIyAIMO6nAN$hxQ&O$KK|r9+8Se~waF6*2UngCiOkoo`s literal 0 HcmV?d00001 diff --git a/comp/src/gb.form/.hidden/control/menubutton.png b/comp/src/gb.form/.hidden/control/menubutton.png new file mode 100644 index 0000000000000000000000000000000000000000..2eeba751b5bbfea607f16764af7cfb74996c6f3c GIT binary patch literal 600 zcmV-e0;m0nP)`}_O(`T6(v_xASpu+HL?zS;Hm_UP~P@$~ie_4Qt!$SHuiV4unF^7CAs z$lB)Z^Yinr%-?~s(q*E`tIFQ!?eJKd#^UMjxVX4`dwcTo@|(fhWTDDXmc%lJyXfuj zdU|>Q008jt@N}xqjJVW%uh4t0(0O@z?(Xi~ zoyR?kzGtGzHHW-MkimC%ckAox+2Q7sy42g_=gZmR)86Fd=jm{#%<1XrcB;&lyw%6o z;iJRXIf%We#@XlS=;!C>-s0tTsmoQE#J0`b<>uz)<>k}c;Lh3K)7;_T;^gDw_=}kSxYzDX5cu^!69Nt$0tstF6&(J$iQ{oQ=IX4quDxl6P}b_ zGBNOd{{oj+?dzLcwEdLlr2~V2I=H)k=;ASW3WhKUsrSqyUS7kua2SJr?ET~OtN#xM m-%1RAlo7%dQSoj0jI^Zy0000>rwEeHSr literal 0 HcmV?d00001 diff --git a/comp/src/gb.form/.hidden/control/sidepanel.png b/comp/src/gb.form/.hidden/control/sidepanel.png new file mode 100644 index 0000000000000000000000000000000000000000..3f09424907b91af721313e33a86d2d5faa7d8d85 GIT binary patch literal 927 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0V6+JE32~h@Yu5Jd+pk`|diLzu zJ9q9ZUb3{ct@GW-uWvtmdGz$HX^TQ`Ej-NXF`rW4okDuSTb??TV2iI=gxqj>3`HNRyyncW6`t55s@1DDG$lIGyL9^O#ZzZ4Jb(4h)Xeh|47Z{EE5|NlQwBOEX?f|$(A3=js8 z&BO!}0dgUNaB(;TDBIA`0OVSmn>__`(n^B-fUt z@b`Ygs#VQj=6sWRKY!oy&!x*>m6fmg)|<37;*Yl}a>lysqy#hPwp|+fe}8H_Y;xi9 zG|>r{jEK}_e0KV2=GX2TiA-G{+f{jctCNelFRTwq6M1mG@vVVQK&kc3Q}5&+)Cru? zOxVxI;^;7)hrcVOL_s%RRxmatfbDXh@p=YthVU;h8Fa751~lxwBfy+g^58;t2cu!b zmUU9H+v`+U3JNN$)xN^NTJfG^Pt4sH4>Q~uc{)1h-4nFG_gG)mz2Zp!cj>>(mVrI2 T7uVg}1WF;Eu6{1-oD!M<7Ga{b literal 0 HcmV?d00001 diff --git a/comp/src/gb.form/.hidden/control/sliderbox.png b/comp/src/gb.form/.hidden/control/sliderbox.png new file mode 100644 index 0000000000000000000000000000000000000000..7046b71830501efa3d91f7e6413070b52052c16b GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyP60k4u0Xo6v9SROAh_H9A2@KJ zySux&rRD$s|4@}%|2Oo^>+kOeN;NdKG&MDSm7A>tl;bH0@(X4NJoLT$sxKE`VRyM;`!dqZ8rI{ z_n3UEbf3M6Exasm&bn7uuK91)cZkS4pu+r!mdKI;Vst0L4~AOaK4? literal 0 HcmV?d00001 diff --git a/comp/src/gb.form/.hidden/control/spinner.png b/comp/src/gb.form/.hidden/control/spinner.png new file mode 100644 index 0000000000000000000000000000000000000000..b9af12fd8f5ff4f0e5a34165ad9f8f2b7de842f0 GIT binary patch literal 518 zcmV+h0{Q)kP)kdg0005aNklcGqKsu$HcN#=>4P&XR*=@^nC<+)Yo`wu;SJlXQ4nau}^9Gp( zCb{{LbKU<(z_S(W-no1@L7tJ~BM4p4`v3)%+$|7PvLADHVFdeXQpY)seN^_-=jA4o zg;I7MD!SLnnL}`?X-8Ysn>RBj*wI!Mo%taudZ#yAA7vk08#;HZW!oEl{bho-hQyUq zDR`@_E7jK2Rq;y01qMz8ElqoW-8!AY*sX5@qF`IujXNfbrLU{*iJpj49q(0^74+OJ z^m`=n1-uYk;M$?4vl-&b_jS)0?1|Ikh3FXD&pIJX5WQ4zx$+KCN8%v+I$44PBPThY z3%*JnZ6+ug_?6>>=-Oa9x_M+xd%RM%7@soejsL#e$NVkdg0003rNklR=QaLT%vdzOsd8C3~FcCo^)8s#q0&wY;y53iQpE-5ij?#ICc1G`;TRY|69C+kt4Ia* tImT1U*&Z4P!~)m@MSIvpn3)A5`57wi8{KWbyhan`Cr?*Dmvv4FO#sHiT@nBQ literal 0 HcmV?d00001 diff --git a/comp/src/gb.form/.hidden/control/tabpanel.png b/comp/src/gb.form/.hidden/control/tabpanel.png new file mode 100644 index 0000000000000000000000000000000000000000..ef1949d31b9393d4d3f298748711d5a9846c6b14 GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^3Lwk@BpAX3RW*PVQ%R6tFatx`FNH;VTU?>SV&~(OeM^U}4nB$rSbp}6@LJqEAveHganV>Jh X5TVazn!&qwHOOdBS3j3^P6NS%G}U;vjb? zhIQv;UIICs1s;*b3=DinK$vl=HlH+5P&dFQ#MLLW@c;k+4Gj(Nw{O3G{rc3YQ|HZ_ zck|}WmX?-ZzkdDu_ixv(T|a*O_4@c04HXis3wgB!DgjZ4FaA_N|L#K8cfmJ%iWc^JC1Nj%ayta322L$iTJw+O_-ta z=f);MSBGm7t`2Jg0t8&UJ$e=>bS;#)mSokFaXyhnz)j#1&?5>(YBx1r-D?9{#o+1c K=d#Wzp$PzIdSER8 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form/.hidden/control/toolpanel.png b/comp/src/gb.form/.hidden/control/toolpanel.png new file mode 100644 index 0000000000000000000000000000000000000000..5b152c4642734754dd9739fc96e39541c6b0f1bc GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^3Lwk@BpAX3RW*PVQ%R6tFatx`9{1FmDA5Q5fB>r$d!E#FUkJ6F^VMW%J6;IPQ8~jkdg0003+NkllAS5nwP0%NeUJF;7DTn5)d!fR28Sf3+l2Plk zMLWhYkdg0003GNkloG5|h}JMYdZcB%@I&D}MuB$83?sicR^EK}i{uNLY-@V5KA_Cm+L| zTsY3%z~DW8KRr*+_xbku^3U&+$VP1j4NOZ^DGoVxs+Jd&b+vZz#|&;vctBXxYupZ4 zHlWYEGS8KbS2m+F#9c((#YCLOUZmqTBDUf%PNFTg<0IK%0Kojb+5b&lEq literal 0 HcmV?d00001 diff --git a/comp/src/gb.form/.hidden/control/wizard.png b/comp/src/gb.form/.hidden/control/wizard.png new file mode 100644 index 0000000000000000000000000000000000000000..94ea3020199f3c37e875ee35524a4c9037513cb0 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^3Lwk@BpAX3RW*PVQ%R6tFatx``-e2h?6Y^eGt6_m* tn$!QxzDZ09E#CPHY|WQ1d9h|fvuN#Of$92xB?~|f^mO%eS?83{1OO4ILhJwl literal 0 HcmV?d00001 diff --git a/comp/src/gb.form/.icon.png b/comp/src/gb.form/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..eedc7d8863854cb8646b25127e14db92ddf35ed5 GIT binary patch literal 10933 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

        \n" +"Language: ar\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "More controls for graphical components" +msgstr "" + +#: CBookmarkList.class:51 +msgid "Home" +msgstr "صَّفحة الإنترنت الرئيسية" + +#: CBookmarkList.class:53 +msgid "Desktop" +msgstr "سطح المكتب" + +#: CBookmarkList.class:55 +msgid "System" +msgstr "النظام" + +#: ColorPalette.class:143 +msgid "Last colors" +msgstr "" + +#: ColorPalette.class:244 +msgid "Remove color" +msgstr "" + +#: ColorPalette.class:248 +msgid "Remove all colors" +msgstr "" + +#: ColorPalette.class:252 +msgid "Sort colors" +msgstr "" + +#: DirView.class:531 +msgid "Cannot rename directory." +msgstr "" + +#: DirView.class:562 +msgid "New folder" +msgstr "مجلد جديد" + +#: DirView.class:581 +msgid "Cannot create directory." +msgstr "" + +#: FBugFileView.form:32 +msgid "Toggle Fileview Detailed View" +msgstr "" + +#: FBugFileView.form:37 +msgid "Toggle Filechooser Detailed View" +msgstr "" + +#: FCalendar.form:47 +msgid "Today" +msgstr "اليوم" + +#: FCalendar.form:53 +msgid "Previous month" +msgstr "الشهر الماضي" + +#: FCalendar.form:59 +msgid "Next month" +msgstr "الشهر التالي" + +#: FCalendar.form:143 +msgid "Apply" +msgstr "" + +#: FColorChooser.form:81 +msgid "Follow color grid" +msgstr "" + +#: FDirChooser.class:428 +msgid "Directory not found." +msgstr "" + +#: FDirChooser.class:534 +msgid "All files (*)" +msgstr "" + +#: FDirChooser.class:974 +msgid "&Bookmark current directory" +msgstr "" + +#: FDirChooser.class:982 +msgid "&Edit bookmarks..." +msgstr "" + +#: FDirChooser.class:991 +msgid "Show &details" +msgstr "" + +#: FDirChooser.class:997 +msgid "Show &hidden files" +msgstr "" + +#: FDirChooser.class:1003 +msgid "Show &image preview" +msgstr "" + +#: FDirChooser.class:1011 +msgid "&Rename" +msgstr "" + +#: FDirChooser.class:1016 +msgid "Copy" +msgstr "انسخ" + +#: FDirChooser.class:1021 +msgid "&Delete" +msgstr "" + +#: FDirChooser.class:1033 +msgid "&Uncompress file" +msgstr "" + +#: FDirChooser.class:1038 +msgid "&Create directory" +msgstr "" + +#: FDirChooser.class:1043 +msgid "Open in &file manager..." +msgstr "" + +#: FDirChooser.class:1048 +msgid "&Refresh" +msgstr "" + +#: FDirChooser.class:1056 +msgid "&Properties" +msgstr "" + +#: FDirChooser.class:1272 +msgid "Overwrite" +msgstr "" + +#: FDirChooser.class:1272 +msgid "Overwrite all" +msgstr "" + +#: FDirChooser.class:1272 +msgid "This file or directory already exists." +msgstr "" + +#: FDirChooser.class:1291 +msgid "Cannot list archive contents" +msgstr "" + +#: FDirChooser.class:1325 +msgid "Cannot uncompress file." +msgstr "" + +#: FDirChooser.class:1325 +msgid "Unknown archive." +msgstr "" + +#: FDirChooser.class:1386 +msgid "Delete file" +msgstr "" + +#: FDirChooser.class:1387 +msgid "Do you really want to delete that file?" +msgstr "" + +#: FDirChooser.class:1394 +msgid "Unable to delete file." +msgstr "" + +#: FDirChooser.class:1404 +msgid "Delete directory" +msgstr "" + +#: FDirChooser.class:1405 +msgid "Do you really want to delete that directory?" +msgstr "" + +#: FDirChooser.class:1412 +msgid "Unable to delete directory." +msgstr "" + +#: FDirChooser.form:66 +msgid "Parent directory" +msgstr "" + +#: FDirChooser.form:72 +msgid "Root directory" +msgstr "" + +#: FDirChooser.form:133 +msgid "Image preview" +msgstr "" + +#: FDirChooser.form:141 +msgid "Detailed view" +msgstr "" + +#: FDirChooser.form:149 +msgid "File properties" +msgstr "" + +#: FDirChooser.form:155 +msgid "Show files" +msgstr "" + +#: FDirChooser.form:174 +msgid "Bookmarks" +msgstr "" + +#: FDirChooser.form:236 FInputBox.form:45 FWizard.class:76 +msgid "OK" +msgstr "موافق" + +#: FDirChooser.form:242 FEditBookmark.class:119 FInputBox.form:51 +#: FSidePanel.class:1149 FWizard.form:53 +msgid "Cancel" +msgstr "إلغاء" + +#: FDocumentView.form:51 +msgid "Zoom :" +msgstr "" + +#: FDocumentView.form:56 +msgid "Show Shadow" +msgstr "" + +#: FDocumentView.form:66 FTestTabPanel.form:64 +msgid "Padding" +msgstr "" + +#: FDocumentView.form:71 +msgid "Spacing" +msgstr "" + +#: FDocumentView.form:80 +msgid "Scale Mode" +msgstr "" + +#: FDocumentView.form:89 +msgid "Goto :" +msgstr "" + +#: FDocumentView.form:95 +msgid "Column" +msgstr "" + +#: FDocumentView.form:95 +msgid "Fill" +msgstr "" + +#: FDocumentView.form:95 +msgid "Horizontal" +msgstr "" + +#: FDocumentView.form:95 +msgid "None" +msgstr "" + +#: FDocumentView.form:95 +msgid "Row" +msgstr "" + +#: FDocumentView.form:95 +msgid "Vertical" +msgstr "" + +#: FDocumentView.form:96 FMain.form:69 +msgid "ComboBox1" +msgstr "" + +#: FDocumentView.form:101 FMain.form:85 FTestBalloon.form:18 +#: FTestCompletion.form:23 FTestMessageView.form:26 FTestWizard.form:22 +msgid "Button1" +msgstr "" + +#: FDocumentView.form:110 +msgid "Columns" +msgstr "" + +#: FDocumentView.form:120 +msgid "Autocenter" +msgstr "" + +#: FEditBookmark.class:23 FileView.class:138 +msgid "Name" +msgstr "الإسم" + +#: FEditBookmark.class:24 +msgid "Path" +msgstr "المسار" + +#: FEditBookmark.class:119 +msgid "Do you really want to remove this bookmark?" +msgstr "" + +#: FEditBookmark.form:15 +msgid "Edit bookmarks" +msgstr "" + +#: FEditBookmark.form:34 +msgid "Up" +msgstr "أعلى" + +#: FEditBookmark.form:40 +msgid "Down" +msgstr "أسفل" + +#: FEditBookmark.form:46 FListEditor.class:263 +msgid "Remove" +msgstr "أزل" + +#: FEditBookmark.form:57 FFileProperties.form:270 MessageView.class:51 +msgid "Close" +msgstr " اغلق" + +#: FFileProperties.class:117 +msgid "Image" +msgstr "صورة" + +#: FFileProperties.class:122 +msgid "Audio" +msgstr "" + +#: FFileProperties.class:126 +msgid "Video" +msgstr "مرئي" + +#: FFileProperties.class:185 +msgid "&1 properties" +msgstr "" + +#: FFileProperties.class:216 Main.module:50 +msgid "&1 B" +msgstr "" + +#: FFileProperties.class:221 +msgid "no file" +msgstr "" + +#: FFileProperties.class:223 +msgid "one file" +msgstr "" + +#: FFileProperties.class:225 +msgid "files" +msgstr "" + +#: FFileProperties.class:229 +msgid "no directory" +msgstr "" + +#: FFileProperties.class:231 +msgid "one directory" +msgstr "" + +#: FFileProperties.class:233 +msgid "directories" +msgstr "" + +#: FFileProperties.form:52 +msgid "General" +msgstr "عام" + +#: FFileProperties.form:81 +msgid "Type" +msgstr " النّوع" + +#: FFileProperties.form:94 +msgid "Link" +msgstr "" + +#: FFileProperties.form:108 +msgid "Directory" +msgstr " الدّليل" + +#: FFileProperties.form:120 FileView.class:140 +msgid "Size" +msgstr "القياس" + +#: FFileProperties.form:132 FileView.class:142 +msgid "Last modified" +msgstr "" + +#: FFileProperties.form:144 +msgid "Permissions" +msgstr "" + +#: FFileProperties.form:157 +msgid "Owner" +msgstr "" + +#: FFileProperties.form:169 +msgid "Group" +msgstr "" + +#: FFileProperties.form:180 +msgid "Preview" +msgstr "معاينة" + +#: FFileProperties.form:245 +msgid "Errors" +msgstr "أخطاء" + +#: FFontChooser.class:297 +msgid "How quickly daft jumping zebras vex" +msgstr "" + +#: FFontChooser.form:55 +msgid "Bold" +msgstr "عريض" + +#: FFontChooser.form:62 +msgid "Italic" +msgstr "مائل" + +#: FFontChooser.form:69 +msgid "Underline" +msgstr "تسطير" + +#: FFontChooser.form:76 +msgid "Strikeout" +msgstr "مشطّب" + +#: FFontChooser.form:85 +msgid "Relative" +msgstr "" + +#: FIconPanel.form:18 +msgid "Item 0" +msgstr "" + +#: FIconPanel.form:23 +msgid "Toto" +msgstr "" + +#: FIconPanel.form:26 +msgid "Item 1" +msgstr "" + +#: FIconPanel.form:28 +msgid "Item 2" +msgstr "" + +#: FIconPanel.form:35 +msgid "Item 3" +msgstr "" + +#: FLCDLabel.form:15 +msgid "12:34" +msgstr "" + +#: FListEditor.class:262 +msgid "Add" +msgstr "أضف" + +#: FListEditor.form:45 +msgid "Add item" +msgstr "" + +#: FListEditor.form:52 +msgid "Remove item" +msgstr "" + +#: FListEditor.form:59 +msgid "Move item up" +msgstr "" + +#: FListEditor.form:66 +msgid "Move item down" +msgstr "" + +#: FMain.form:29 FTestFileChooser.form:31 FTestMenuButton.form:39 FWiki.form:20 +msgid "Menu2" +msgstr "" + +#: FMain.form:33 FTestFileChooser.form:36 FTestMenuButton.form:43 FWiki.form:24 +msgid "Menu3" +msgstr "" + +#: FMain.form:68 +msgid "Élément 1" +msgstr "" + +#: FMain.form:68 +msgid "Élément 2" +msgstr "" + +#: FMain.form:68 +msgid "Élément 3" +msgstr "" + +#: FMain.form:68 +msgid "Élément 4" +msgstr "" + +#: FMain.form:74 +msgid "ComboBox2" +msgstr "" + +#: FMain.form:80 FSwitchButton.form:35 FTestBalloon.form:12 +#: FTestFileChooser.form:86 +msgid "TextBox1" +msgstr "" + +#: FMain.form:90 Form2.form:121 +msgid "MenuButton1" +msgstr "" + +#: FMessage.form:39 +msgid "Do not display this message again" +msgstr "" + +#: FSidePanel.class:1139 +msgid "Hidden" +msgstr "" + +#: FSidePanel.class:1143 +msgid "Transparent" +msgstr "" + +#: FSpinBar.form:24 +msgid "Test" +msgstr "" + +#: FSwitchButton.form:51 FTestFileChooser.form:81 +msgid "Label1" +msgstr "" + +#: FSwitchButton.form:58 +msgid "Label2" +msgstr "" + +#: FTestBalloon.form:17 +msgid "Ceci est une bulle d'aide" +msgstr "" + +#: FTestColorChooser.form:20 +msgid "Resizable" +msgstr "" + +#: FTestCompletion.form:28 +msgid "Button2" +msgstr "" + +#: FTestDateChooser.form:47 +msgid "Enable" +msgstr "" + +#: FTestExpander.form:16 +msgid "Expander" +msgstr "" + +#: FTestFileChooser.form:28 FTestMenuButton.form:35 +msgid "Menu1" +msgstr "" + +#: FTestFileChooser.form:41 FTestMenuButton.form:69 +msgid "Menu7" +msgstr "" + +#: FTestFileChooser.form:49 FTestMenuButton.form:52 FWiki.form:28 +msgid "Menu4" +msgstr "" + +#: FTestFileChooser.form:54 FTestMenuButton.form:56 FWiki.form:32 +msgid "Menu5" +msgstr "" + +#: FTestFileChooser.form:76 +msgid "Balloon" +msgstr "" + +#: FTestMenuButton.form:31 +msgid "Project" +msgstr "" + +#: FTestMenuButton.form:48 +msgid "View" +msgstr "" + +#: FTestMenuButton.form:60 +msgid "Menu6" +msgstr "" + +#: FTestMenuButton.form:65 +msgid "Tools" +msgstr "" + +#: FTestMenuButton.form:73 +msgid "Menu8" +msgstr "" + +#: FTestMenuButton.form:77 +msgid "Menu9" +msgstr "" + +#: FTestMenuButton.form:80 +msgid "Menu10" +msgstr "" + +#: FTestMenuButton.form:84 +msgid "Menu11" +msgstr "" + +#: FTestMenuButton.form:124 +msgid "Menu button" +msgstr "" + +#: FTestTabPanel.form:41 +msgid "Text" +msgstr "" + +#: FTestTabPanel.form:54 +msgid "Border" +msgstr "" + +#: FTestTabPanel.form:59 +msgid "Orientation" +msgstr "" + +#: FTestToolPanel.form:13 +msgid "Toolbar &0" +msgstr "" + +#: FTestToolPanel.form:15 +msgid "Toolbar &1" +msgstr "" + +#: FTestToolPanel.form:17 +msgid "Toolbar &2" +msgstr "" + +#: FTestValueBox.form:15 +msgid "Hello world!" +msgstr "" + +#: FTestWizard.form:18 +msgid "Étape n°1" +msgstr "" + +#: FTestWizard.form:25 +msgid "Étape n°2" +msgstr "" + +#: FTestWizard.form:29 +msgid "LCDLabel1" +msgstr "" + +#: FTestWizard.form:32 +msgid "Étape n°3" +msgstr "" + +#: FTestWizard.form:34 +msgid "Étape n°4" +msgstr "" + +#: FWizard.class:88 +msgid "&Next" +msgstr "ال&تالي" + +#: FWizard.form:59 MessageView.class:48 +msgid "Next" +msgstr "تالي" + +#: FWizard.form:65 +msgid "Previous" +msgstr "السابق" + +#: FileView.class:1081 +msgid "Cannot rename file." +msgstr "" + +#: Form2.form:126 +msgid "ButtonBox2" +msgstr "" + +#: Help.module:71 +msgid "A file or directory name cannot be void." +msgstr "" + +#: Help.module:72 +msgid "The '/' character is forbidden inside file or directory names." +msgstr "" + +#: Main.module:52 +msgid "&1 KiB" +msgstr "" + +#: Main.module:54 +msgid "&1 MiB" +msgstr "" + +#: Main.module:56 +msgid "&1 GiB" +msgstr "" + +#: Wizard.class:86 +msgid "Step #&1" +msgstr "" diff --git a/comp/src/gb.form/.lang/ca.po b/comp/src/gb.form/.lang/ca.po new file mode 100644 index 00000000..8abf3ff9 --- /dev/null +++ b/comp/src/gb.form/.lang/ca.po @@ -0,0 +1,716 @@ +# Catalan translation of gb.form +# Copyright (C) 2000-2010 Benoît Minisini. +# This file is distributed under the same license as gb.form package. +# Jordi Sayol , 2007-2010. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.form 3.14.90\n" +"POT-Creation-Date: 2020-06-06 18:12 UTC\n" +"PO-Revision-Date: 2020-06-06 18:12 UTC\n" +"Last-Translator: Benoît Minisini \n" +"Language: ca\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "More controls for graphical components" +msgstr "Més controls per als components gràfics" + +#: CBookmarkList.class:51 +msgid "Home" +msgstr "Inici" + +#: CBookmarkList.class:53 +msgid "Desktop" +msgstr "Escriptori" + +#: CBookmarkList.class:55 +msgid "System" +msgstr "Sistema" + +#: ColorPalette.class:143 +msgid "Last colors" +msgstr "" + +#: ColorPalette.class:244 +msgid "Remove color" +msgstr "" + +#: ColorPalette.class:248 +msgid "Remove all colors" +msgstr "" + +#: ColorPalette.class:252 +msgid "Sort colors" +msgstr "" + +#: DirView.class:531 +msgid "Cannot rename directory." +msgstr "No es pot canviar el nom del directori." + +#: DirView.class:562 +msgid "New folder" +msgstr "Nova carpeta" + +#: DirView.class:581 +msgid "Cannot create directory." +msgstr "No es pot crear el directori." + +#: FBugFileView.form:32 +msgid "Toggle Fileview Detailed View" +msgstr "" + +#: FBugFileView.form:37 +msgid "Toggle Filechooser Detailed View" +msgstr "" + +#: FCalendar.form:47 +msgid "Today" +msgstr "Avui" + +#: FCalendar.form:53 +msgid "Previous month" +msgstr "Mes anterior" + +#: FCalendar.form:59 +msgid "Next month" +msgstr "Mes següent" + +#: FCalendar.form:143 +msgid "Apply" +msgstr "" + +#: FColorChooser.form:81 +msgid "Follow color grid" +msgstr "Seguiu la graella de color" + +#: FDirChooser.class:428 +msgid "Directory not found." +msgstr "" + +#: FDirChooser.class:534 +msgid "All files (*)" +msgstr "Tots els fitxers (*)" + +#: FDirChooser.class:974 +msgid "&Bookmark current directory" +msgstr "Crea adreça d'&interès del directori actual" + +#: FDirChooser.class:982 +msgid "&Edit bookmarks..." +msgstr "&Edita les adreces d'interès..." + +#: FDirChooser.class:991 +msgid "Show &details" +msgstr "Mostra els &detalls" + +#: FDirChooser.class:997 +msgid "Show &hidden files" +msgstr "Mostra els fitxers &ocults" + +#: FDirChooser.class:1003 +msgid "Show &image preview" +msgstr "" + +#: FDirChooser.class:1011 +msgid "&Rename" +msgstr "" + +#: FDirChooser.class:1016 +msgid "Copy" +msgstr "Copia" + +#: FDirChooser.class:1021 +msgid "&Delete" +msgstr "" + +#: FDirChooser.class:1033 +msgid "&Uncompress file" +msgstr "&Descomprimeix el fitxer" + +#: FDirChooser.class:1038 +msgid "&Create directory" +msgstr "&Crea un directori" + +#: FDirChooser.class:1043 +msgid "Open in &file manager..." +msgstr "Obre amb el gestor de &fitxers..." + +#: FDirChooser.class:1048 +msgid "&Refresh" +msgstr "&Actualitza" + +#: FDirChooser.class:1056 +msgid "&Properties" +msgstr "" + +#: FDirChooser.class:1272 +msgid "Overwrite" +msgstr "Sobreescriure" + +#: FDirChooser.class:1272 +msgid "Overwrite all" +msgstr "Sobreescriure-ho tot" + +#: FDirChooser.class:1272 +msgid "This file or directory already exists." +msgstr "Aquest fitxer o directori ja existeix." + +#: FDirChooser.class:1291 +msgid "Cannot list archive contents" +msgstr "" + +#: FDirChooser.class:1325 +msgid "Cannot uncompress file." +msgstr "No es pot descomprimir el fitxer." + +#: FDirChooser.class:1325 +msgid "Unknown archive." +msgstr "Fitxer desconegut." + +#: FDirChooser.class:1386 +msgid "Delete file" +msgstr "" + +#: FDirChooser.class:1387 +msgid "Do you really want to delete that file?" +msgstr "" + +#: FDirChooser.class:1394 +msgid "Unable to delete file." +msgstr "" + +#: FDirChooser.class:1404 +msgid "Delete directory" +msgstr "" + +#: FDirChooser.class:1405 +msgid "Do you really want to delete that directory?" +msgstr "" + +#: FDirChooser.class:1412 +msgid "Unable to delete directory." +msgstr "" + +#: FDirChooser.form:66 +msgid "Parent directory" +msgstr "" + +#: FDirChooser.form:72 +msgid "Root directory" +msgstr "" + +#: FDirChooser.form:133 +msgid "Image preview" +msgstr "" + +#: FDirChooser.form:141 +msgid "Detailed view" +msgstr "" + +#: FDirChooser.form:149 +msgid "File properties" +msgstr "" + +#: FDirChooser.form:155 +msgid "Show files" +msgstr "Mostra els fitxers" + +#: FDirChooser.form:174 +msgid "Bookmarks" +msgstr "Adreces d'interès" + +#: FDirChooser.form:236 FInputBox.form:45 FWizard.class:76 +msgid "OK" +msgstr "D'acord" + +#: FDirChooser.form:242 FEditBookmark.class:119 FInputBox.form:51 +#: FSidePanel.class:1149 FWizard.form:53 +msgid "Cancel" +msgstr "Canceŀla" + +#: FDocumentView.form:51 +msgid "Zoom :" +msgstr "" + +#: FDocumentView.form:56 +msgid "Show Shadow" +msgstr "" + +#: FDocumentView.form:66 FTestTabPanel.form:64 +msgid "Padding" +msgstr "" + +#: FDocumentView.form:71 +msgid "Spacing" +msgstr "" + +#: FDocumentView.form:80 +msgid "Scale Mode" +msgstr "" + +#: FDocumentView.form:89 +msgid "Goto :" +msgstr "" + +#: FDocumentView.form:95 +msgid "Column" +msgstr "" + +#: FDocumentView.form:95 +msgid "Fill" +msgstr "" + +#: FDocumentView.form:95 +msgid "Horizontal" +msgstr "" + +#: FDocumentView.form:95 +msgid "None" +msgstr "" + +#: FDocumentView.form:95 +msgid "Row" +msgstr "" + +#: FDocumentView.form:95 +msgid "Vertical" +msgstr "" + +#: FDocumentView.form:96 FMain.form:69 +msgid "ComboBox1" +msgstr "" + +#: FDocumentView.form:101 FMain.form:85 FTestBalloon.form:18 +#: FTestCompletion.form:23 FTestMessageView.form:26 FTestWizard.form:22 +msgid "Button1" +msgstr "" + +#: FDocumentView.form:110 +msgid "Columns" +msgstr "" + +#: FDocumentView.form:120 +msgid "Autocenter" +msgstr "" + +#: FEditBookmark.class:23 FileView.class:138 +msgid "Name" +msgstr "Nom" + +#: FEditBookmark.class:24 +msgid "Path" +msgstr "Camí" + +#: FEditBookmark.class:119 +msgid "Do you really want to remove this bookmark?" +msgstr "Segur que voleu esborrar aquest adreça d'interès?" + +#: FEditBookmark.form:15 +msgid "Edit bookmarks" +msgstr "Edita les adreces d'interès" + +#: FEditBookmark.form:34 +msgid "Up" +msgstr "Puja" + +#: FEditBookmark.form:40 +msgid "Down" +msgstr "Avall" + +#: FEditBookmark.form:46 FListEditor.class:263 +msgid "Remove" +msgstr "Suprimeix" + +#: FEditBookmark.form:57 FFileProperties.form:270 MessageView.class:51 +msgid "Close" +msgstr "Tanca" + +#: FFileProperties.class:117 +msgid "Image" +msgstr "Imatge" + +#: FFileProperties.class:122 +msgid "Audio" +msgstr "" + +#: FFileProperties.class:126 +msgid "Video" +msgstr "Vídeo" + +#: FFileProperties.class:185 +msgid "&1 properties" +msgstr "" + +#: FFileProperties.class:216 Main.module:50 +msgid "&1 B" +msgstr "" + +#: FFileProperties.class:221 +msgid "no file" +msgstr "" + +#: FFileProperties.class:223 +msgid "one file" +msgstr "" + +#: FFileProperties.class:225 +msgid "files" +msgstr "" + +#: FFileProperties.class:229 +msgid "no directory" +msgstr "" + +#: FFileProperties.class:231 +msgid "one directory" +msgstr "" + +#: FFileProperties.class:233 +msgid "directories" +msgstr "" + +#: FFileProperties.form:52 +msgid "General" +msgstr "General" + +#: FFileProperties.form:81 +msgid "Type" +msgstr "Tipus" + +#: FFileProperties.form:94 +msgid "Link" +msgstr "" + +#: FFileProperties.form:108 +msgid "Directory" +msgstr "Directori" + +#: FFileProperties.form:120 FileView.class:140 +msgid "Size" +msgstr "Mida" + +#: FFileProperties.form:132 FileView.class:142 +msgid "Last modified" +msgstr "Última modificació" + +#: FFileProperties.form:144 +msgid "Permissions" +msgstr "" + +#: FFileProperties.form:157 +msgid "Owner" +msgstr "" + +#: FFileProperties.form:169 +msgid "Group" +msgstr "" + +#: FFileProperties.form:180 +msgid "Preview" +msgstr "Vista prèvia" + +# gb-ignore +#: FFileProperties.form:245 +msgid "Errors" +msgstr "" + +#: FFontChooser.class:297 +msgid "How quickly daft jumping zebras vex" +msgstr "Jove xef, porti whisky amb quinze glaçons d'hidrogen, coi!" + +#: FFontChooser.form:55 +msgid "Bold" +msgstr "Negreta" + +#: FFontChooser.form:62 +msgid "Italic" +msgstr "Cursiva" + +#: FFontChooser.form:69 +msgid "Underline" +msgstr "Subratllat" + +#: FFontChooser.form:76 +msgid "Strikeout" +msgstr "Barrat" + +#: FFontChooser.form:85 +msgid "Relative" +msgstr "" + +#: FIconPanel.form:18 +msgid "Item 0" +msgstr "" + +#: FIconPanel.form:23 +msgid "Toto" +msgstr "" + +#: FIconPanel.form:26 +msgid "Item 1" +msgstr "" + +#: FIconPanel.form:28 +msgid "Item 2" +msgstr "" + +#: FIconPanel.form:35 +msgid "Item 3" +msgstr "" + +#: FLCDLabel.form:15 +msgid "12:34" +msgstr "" + +#: FListEditor.class:262 +msgid "Add" +msgstr "Afegeix" + +#: FListEditor.form:45 +msgid "Add item" +msgstr "" + +#: FListEditor.form:52 +msgid "Remove item" +msgstr "" + +#: FListEditor.form:59 +msgid "Move item up" +msgstr "" + +#: FListEditor.form:66 +msgid "Move item down" +msgstr "" + +#: FMain.form:29 FTestFileChooser.form:31 FTestMenuButton.form:39 FWiki.form:20 +msgid "Menu2" +msgstr "" + +#: FMain.form:33 FTestFileChooser.form:36 FTestMenuButton.form:43 FWiki.form:24 +msgid "Menu3" +msgstr "" + +#: FMain.form:68 +msgid "Élément 1" +msgstr "" + +#: FMain.form:68 +msgid "Élément 2" +msgstr "" + +#: FMain.form:68 +msgid "Élément 3" +msgstr "" + +#: FMain.form:68 +msgid "Élément 4" +msgstr "" + +#: FMain.form:74 +msgid "ComboBox2" +msgstr "" + +#: FMain.form:80 FSwitchButton.form:35 FTestBalloon.form:12 +#: FTestFileChooser.form:86 +msgid "TextBox1" +msgstr "" + +#: FMain.form:90 Form2.form:121 +msgid "MenuButton1" +msgstr "" + +#: FMessage.form:39 +msgid "Do not display this message again" +msgstr "No tornis a mostrar aquest missatge" + +#: FSidePanel.class:1139 +msgid "Hidden" +msgstr "" + +#: FSidePanel.class:1143 +msgid "Transparent" +msgstr "" + +#: FSpinBar.form:24 +msgid "Test" +msgstr "" + +#: FSwitchButton.form:51 FTestFileChooser.form:81 +msgid "Label1" +msgstr "" + +#: FSwitchButton.form:58 +msgid "Label2" +msgstr "" + +#: FTestBalloon.form:17 +msgid "Ceci est une bulle d'aide" +msgstr "" + +#: FTestColorChooser.form:20 +msgid "Resizable" +msgstr "" + +#: FTestCompletion.form:28 +msgid "Button2" +msgstr "" + +#: FTestDateChooser.form:47 +msgid "Enable" +msgstr "" + +#: FTestExpander.form:16 +msgid "Expander" +msgstr "" + +#: FTestFileChooser.form:28 FTestMenuButton.form:35 +msgid "Menu1" +msgstr "" + +#: FTestFileChooser.form:41 FTestMenuButton.form:69 +msgid "Menu7" +msgstr "" + +#: FTestFileChooser.form:49 FTestMenuButton.form:52 FWiki.form:28 +msgid "Menu4" +msgstr "" + +#: FTestFileChooser.form:54 FTestMenuButton.form:56 FWiki.form:32 +msgid "Menu5" +msgstr "" + +#: FTestFileChooser.form:76 +msgid "Balloon" +msgstr "" + +#: FTestMenuButton.form:31 +msgid "Project" +msgstr "" + +#: FTestMenuButton.form:48 +msgid "View" +msgstr "" + +#: FTestMenuButton.form:60 +msgid "Menu6" +msgstr "" + +#: FTestMenuButton.form:65 +msgid "Tools" +msgstr "" + +#: FTestMenuButton.form:73 +msgid "Menu8" +msgstr "" + +#: FTestMenuButton.form:77 +msgid "Menu9" +msgstr "" + +#: FTestMenuButton.form:80 +msgid "Menu10" +msgstr "" + +#: FTestMenuButton.form:84 +msgid "Menu11" +msgstr "" + +#: FTestMenuButton.form:124 +msgid "Menu button" +msgstr "" + +#: FTestTabPanel.form:41 +msgid "Text" +msgstr "" + +#: FTestTabPanel.form:54 +msgid "Border" +msgstr "" + +#: FTestTabPanel.form:59 +msgid "Orientation" +msgstr "" + +#: FTestToolPanel.form:13 +msgid "Toolbar &0" +msgstr "" + +#: FTestToolPanel.form:15 +msgid "Toolbar &1" +msgstr "" + +#: FTestToolPanel.form:17 +msgid "Toolbar &2" +msgstr "" + +#: FTestValueBox.form:15 +msgid "Hello world!" +msgstr "" + +#: FTestWizard.form:18 +msgid "Étape n°1" +msgstr "" + +#: FTestWizard.form:25 +msgid "Étape n°2" +msgstr "" + +#: FTestWizard.form:29 +msgid "LCDLabel1" +msgstr "" + +#: FTestWizard.form:32 +msgid "Étape n°3" +msgstr "" + +#: FTestWizard.form:34 +msgid "Étape n°4" +msgstr "" + +#: FWizard.class:88 +msgid "&Next" +msgstr "&Següent" + +#: FWizard.form:59 MessageView.class:48 +msgid "Next" +msgstr "Següent" + +#: FWizard.form:65 +msgid "Previous" +msgstr "Previ" + +#: FileView.class:1081 +msgid "Cannot rename file." +msgstr "" + +#: Form2.form:126 +msgid "ButtonBox2" +msgstr "" + +#: Help.module:71 +msgid "A file or directory name cannot be void." +msgstr "" + +#: Help.module:72 +msgid "The '/' character is forbidden inside file or directory names." +msgstr "El caràcter '/' no està permès dins el nom de fitxers o directoris." + +#: Main.module:52 +msgid "&1 KiB" +msgstr "" + +#: Main.module:54 +msgid "&1 MiB" +msgstr "" + +#: Main.module:56 +msgid "&1 GiB" +msgstr "" + +#: Wizard.class:86 +msgid "Step #&1" +msgstr "Pas número &1" diff --git a/comp/src/gb.form/.lang/cs.po b/comp/src/gb.form/.lang/cs.po new file mode 100644 index 00000000..630282b4 --- /dev/null +++ b/comp/src/gb.form/.lang/cs.po @@ -0,0 +1,716 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.form 3.14.90\n" +"POT-Creation-Date: 2020-06-06 18:08 UTC\n" +"PO-Revision-Date: 2020-06-06 18:06 UTC\n" +"Last-Translator: Benoît Minisini \n" +"Language: cs\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "More controls for graphical components" +msgstr "Další ovládací prvky pro grafické komponenty" + +#: CBookmarkList.class:51 +msgid "Home" +msgstr "Domů" + +#: CBookmarkList.class:53 +msgid "Desktop" +msgstr "Pracovní plocha" + +#: CBookmarkList.class:55 +msgid "System" +msgstr "Systém" + +#: ColorPalette.class:143 +msgid "Last colors" +msgstr "" + +#: ColorPalette.class:244 +msgid "Remove color" +msgstr "" + +#: ColorPalette.class:248 +msgid "Remove all colors" +msgstr "" + +#: ColorPalette.class:252 +msgid "Sort colors" +msgstr "" + +#: DirView.class:531 +msgid "Cannot rename directory." +msgstr "Nelze přejmenovat adresář." + +#: DirView.class:562 +msgid "New folder" +msgstr "Nová složka" + +#: DirView.class:581 +msgid "Cannot create directory." +msgstr "Nelze vytvořit adresář." + +#: FBugFileView.form:32 +msgid "Toggle Fileview Detailed View" +msgstr "" + +#: FBugFileView.form:37 +msgid "Toggle Filechooser Detailed View" +msgstr "" + +#: FCalendar.form:47 +msgid "Today" +msgstr "Dnes" + +#: FCalendar.form:53 +msgid "Previous month" +msgstr "Předchozí měsíc" + +#: FCalendar.form:59 +msgid "Next month" +msgstr "Následující měsíc" + +#: FCalendar.form:143 +msgid "Apply" +msgstr "Aplikovat" + +#: FColorChooser.form:81 +msgid "Follow color grid" +msgstr "Následuj barvu mřížky" + +#: FDirChooser.class:428 +msgid "Directory not found." +msgstr "" + +#: FDirChooser.class:534 +msgid "All files (*)" +msgstr "Všechny soubory (*)" + +#: FDirChooser.class:974 +msgid "&Bookmark current directory" +msgstr "Přidat adresář do &záložek" + +#: FDirChooser.class:982 +msgid "&Edit bookmarks..." +msgstr "Upravit &záložky..." + +#: FDirChooser.class:991 +msgid "Show &details" +msgstr "Zobrazit &detaily" + +#: FDirChooser.class:997 +msgid "Show &hidden files" +msgstr "Zobrazit &skryté soubory" + +#: FDirChooser.class:1003 +msgid "Show &image preview" +msgstr "Zobrazit &náhled obrázku" + +#: FDirChooser.class:1011 +msgid "&Rename" +msgstr "Pře&jmenovat" + +#: FDirChooser.class:1016 +msgid "Copy" +msgstr "Kopírovat" + +#: FDirChooser.class:1021 +msgid "&Delete" +msgstr "S&mazat" + +#: FDirChooser.class:1033 +msgid "&Uncompress file" +msgstr "&Rozbalit soubor" + +#: FDirChooser.class:1038 +msgid "&Create directory" +msgstr "Vy&tvořit adresář" + +#: FDirChooser.class:1043 +msgid "Open in &file manager..." +msgstr "Otevřít v &souborevém manageru..." + +#: FDirChooser.class:1048 +msgid "&Refresh" +msgstr "&Obnovit" + +#: FDirChooser.class:1056 +msgid "&Properties" +msgstr "&Vlastnosti" + +#: FDirChooser.class:1272 +msgid "Overwrite" +msgstr "Přepsat" + +#: FDirChooser.class:1272 +msgid "Overwrite all" +msgstr "Vše přepsat" + +#: FDirChooser.class:1272 +msgid "This file or directory already exists." +msgstr "Tento soubor nebo adresář již existuje." + +#: FDirChooser.class:1291 +msgid "Cannot list archive contents" +msgstr "" + +#: FDirChooser.class:1325 +msgid "Cannot uncompress file." +msgstr "Nelze rozbalit soubor." + +#: FDirChooser.class:1325 +msgid "Unknown archive." +msgstr "Neznámí archív." + +#: FDirChooser.class:1386 +msgid "Delete file" +msgstr "Smazat soubor" + +#: FDirChooser.class:1387 +msgid "Do you really want to delete that file?" +msgstr "Opravdu chcete smazat tento soubor?" + +#: FDirChooser.class:1394 +msgid "Unable to delete file." +msgstr "Soubor nelze odstranit." + +#: FDirChooser.class:1404 +msgid "Delete directory" +msgstr "" + +#: FDirChooser.class:1405 +msgid "Do you really want to delete that directory?" +msgstr "" + +#: FDirChooser.class:1412 +msgid "Unable to delete directory." +msgstr "" + +#: FDirChooser.form:66 +msgid "Parent directory" +msgstr "Rodičovský adresář" + +#: FDirChooser.form:72 +msgid "Root directory" +msgstr "" + +#: FDirChooser.form:133 +msgid "Image preview" +msgstr "Náhled obrázku" + +#: FDirChooser.form:141 +msgid "Detailed view" +msgstr "" + +#: FDirChooser.form:149 +msgid "File properties" +msgstr "" + +#: FDirChooser.form:155 +msgid "Show files" +msgstr "Zobrazit soubory" + +#: FDirChooser.form:174 +msgid "Bookmarks" +msgstr "Záložky" + +# gb-ignore +#: FDirChooser.form:236 FInputBox.form:45 FWizard.class:76 +msgid "OK" +msgstr "" + +#: FDirChooser.form:242 FEditBookmark.class:119 FInputBox.form:51 +#: FSidePanel.class:1149 FWizard.form:53 +msgid "Cancel" +msgstr "Zrušit" + +#: FDocumentView.form:51 +msgid "Zoom :" +msgstr "" + +#: FDocumentView.form:56 +msgid "Show Shadow" +msgstr "" + +#: FDocumentView.form:66 FTestTabPanel.form:64 +msgid "Padding" +msgstr "" + +#: FDocumentView.form:71 +msgid "Spacing" +msgstr "" + +#: FDocumentView.form:80 +msgid "Scale Mode" +msgstr "" + +#: FDocumentView.form:89 +msgid "Goto :" +msgstr "" + +#: FDocumentView.form:95 +msgid "Column" +msgstr "" + +#: FDocumentView.form:95 +msgid "Fill" +msgstr "" + +#: FDocumentView.form:95 +msgid "Horizontal" +msgstr "" + +#: FDocumentView.form:95 +msgid "None" +msgstr "" + +#: FDocumentView.form:95 +msgid "Row" +msgstr "" + +#: FDocumentView.form:95 +msgid "Vertical" +msgstr "" + +#: FDocumentView.form:96 FMain.form:69 +msgid "ComboBox1" +msgstr "" + +#: FDocumentView.form:101 FMain.form:85 FTestBalloon.form:18 +#: FTestCompletion.form:23 FTestMessageView.form:26 FTestWizard.form:22 +msgid "Button1" +msgstr "" + +#: FDocumentView.form:110 +msgid "Columns" +msgstr "" + +#: FDocumentView.form:120 +msgid "Autocenter" +msgstr "" + +#: FEditBookmark.class:23 FileView.class:138 +msgid "Name" +msgstr "Název" + +#: FEditBookmark.class:24 +msgid "Path" +msgstr "Cesta" + +#: FEditBookmark.class:119 +msgid "Do you really want to remove this bookmark?" +msgstr "Opravdu chcete odstranit tuto záložku?" + +#: FEditBookmark.form:15 +msgid "Edit bookmarks" +msgstr "Upravit záložky" + +#: FEditBookmark.form:34 +msgid "Up" +msgstr "Nahoru" + +#: FEditBookmark.form:40 +msgid "Down" +msgstr "Dolů" + +#: FEditBookmark.form:46 FListEditor.class:263 +msgid "Remove" +msgstr "Odebrat" + +#: FEditBookmark.form:57 FFileProperties.form:270 MessageView.class:51 +msgid "Close" +msgstr "Zavřít" + +#: FFileProperties.class:117 +msgid "Image" +msgstr "Obrázek" + +#: FFileProperties.class:122 +msgid "Audio" +msgstr "" + +# gb-ignore +#: FFileProperties.class:126 +msgid "Video" +msgstr "" + +#: FFileProperties.class:185 +msgid "&1 properties" +msgstr "&1 vlastnosti" + +# gb-ignore +#: FFileProperties.class:216 Main.module:50 +msgid "&1 B" +msgstr "" + +#: FFileProperties.class:221 +msgid "no file" +msgstr "" + +#: FFileProperties.class:223 +msgid "one file" +msgstr "" + +#: FFileProperties.class:225 +msgid "files" +msgstr "" + +#: FFileProperties.class:229 +msgid "no directory" +msgstr "" + +#: FFileProperties.class:231 +msgid "one directory" +msgstr "" + +#: FFileProperties.class:233 +msgid "directories" +msgstr "" + +#: FFileProperties.form:52 +msgid "General" +msgstr "Obecně" + +#: FFileProperties.form:81 +msgid "Type" +msgstr "Typ" + +#: FFileProperties.form:94 +msgid "Link" +msgstr "" + +#: FFileProperties.form:108 +msgid "Directory" +msgstr "Adresář" + +#: FFileProperties.form:120 FileView.class:140 +msgid "Size" +msgstr "Velikost" + +#: FFileProperties.form:132 FileView.class:142 +msgid "Last modified" +msgstr "Poslední změna" + +#: FFileProperties.form:144 +msgid "Permissions" +msgstr "Oprávnění" + +#: FFileProperties.form:157 +msgid "Owner" +msgstr "Vlastník" + +#: FFileProperties.form:169 +msgid "Group" +msgstr "Skupina" + +#: FFileProperties.form:180 +msgid "Preview" +msgstr "Náhled" + +#: FFileProperties.form:245 +msgid "Errors" +msgstr "Chyby" + +#: FFontChooser.class:297 +msgid "How quickly daft jumping zebras vex" +msgstr "Příliš žluťoučký kůň úpěl ďábelské ódy" + +#: FFontChooser.form:55 +msgid "Bold" +msgstr "Tučné" + +#: FFontChooser.form:62 +msgid "Italic" +msgstr "Kurzíva" + +#: FFontChooser.form:69 +msgid "Underline" +msgstr "Podtržené" + +#: FFontChooser.form:76 +msgid "Strikeout" +msgstr "Přeškrknuté" + +#: FFontChooser.form:85 +msgid "Relative" +msgstr "Relativní" + +#: FIconPanel.form:18 +msgid "Item 0" +msgstr "" + +#: FIconPanel.form:23 +msgid "Toto" +msgstr "" + +#: FIconPanel.form:26 +msgid "Item 1" +msgstr "" + +#: FIconPanel.form:28 +msgid "Item 2" +msgstr "" + +#: FIconPanel.form:35 +msgid "Item 3" +msgstr "" + +#: FLCDLabel.form:15 +msgid "12:34" +msgstr "" + +#: FListEditor.class:262 +msgid "Add" +msgstr "Přidat" + +#: FListEditor.form:45 +msgid "Add item" +msgstr "" + +#: FListEditor.form:52 +msgid "Remove item" +msgstr "" + +#: FListEditor.form:59 +msgid "Move item up" +msgstr "" + +#: FListEditor.form:66 +msgid "Move item down" +msgstr "" + +#: FMain.form:29 FTestFileChooser.form:31 FTestMenuButton.form:39 FWiki.form:20 +msgid "Menu2" +msgstr "" + +#: FMain.form:33 FTestFileChooser.form:36 FTestMenuButton.form:43 FWiki.form:24 +msgid "Menu3" +msgstr "" + +#: FMain.form:68 +msgid "Élément 1" +msgstr "" + +#: FMain.form:68 +msgid "Élément 2" +msgstr "" + +#: FMain.form:68 +msgid "Élément 3" +msgstr "" + +#: FMain.form:68 +msgid "Élément 4" +msgstr "" + +#: FMain.form:74 +msgid "ComboBox2" +msgstr "" + +#: FMain.form:80 FSwitchButton.form:35 FTestBalloon.form:12 +#: FTestFileChooser.form:86 +msgid "TextBox1" +msgstr "" + +#: FMain.form:90 Form2.form:121 +msgid "MenuButton1" +msgstr "" + +#: FMessage.form:39 +msgid "Do not display this message again" +msgstr "Již nezobrazovat" + +#: FSidePanel.class:1139 +msgid "Hidden" +msgstr "Skryté" + +#: FSidePanel.class:1143 +msgid "Transparent" +msgstr "Průhlednost" + +#: FSpinBar.form:24 +msgid "Test" +msgstr "" + +#: FSwitchButton.form:51 FTestFileChooser.form:81 +msgid "Label1" +msgstr "" + +#: FSwitchButton.form:58 +msgid "Label2" +msgstr "" + +#: FTestBalloon.form:17 +msgid "Ceci est une bulle d'aide" +msgstr "" + +#: FTestColorChooser.form:20 +msgid "Resizable" +msgstr "" + +#: FTestCompletion.form:28 +msgid "Button2" +msgstr "" + +#: FTestDateChooser.form:47 +msgid "Enable" +msgstr "" + +#: FTestExpander.form:16 +msgid "Expander" +msgstr "" + +#: FTestFileChooser.form:28 FTestMenuButton.form:35 +msgid "Menu1" +msgstr "" + +#: FTestFileChooser.form:41 FTestMenuButton.form:69 +msgid "Menu7" +msgstr "" + +#: FTestFileChooser.form:49 FTestMenuButton.form:52 FWiki.form:28 +msgid "Menu4" +msgstr "" + +#: FTestFileChooser.form:54 FTestMenuButton.form:56 FWiki.form:32 +msgid "Menu5" +msgstr "" + +#: FTestFileChooser.form:76 +msgid "Balloon" +msgstr "" + +#: FTestMenuButton.form:31 +msgid "Project" +msgstr "" + +#: FTestMenuButton.form:48 +msgid "View" +msgstr "" + +#: FTestMenuButton.form:60 +msgid "Menu6" +msgstr "" + +#: FTestMenuButton.form:65 +msgid "Tools" +msgstr "" + +#: FTestMenuButton.form:73 +msgid "Menu8" +msgstr "" + +#: FTestMenuButton.form:77 +msgid "Menu9" +msgstr "" + +#: FTestMenuButton.form:80 +msgid "Menu10" +msgstr "" + +#: FTestMenuButton.form:84 +msgid "Menu11" +msgstr "" + +#: FTestMenuButton.form:124 +msgid "Menu button" +msgstr "" + +#: FTestTabPanel.form:41 +msgid "Text" +msgstr "" + +#: FTestTabPanel.form:54 +msgid "Border" +msgstr "" + +#: FTestTabPanel.form:59 +msgid "Orientation" +msgstr "" + +#: FTestToolPanel.form:13 +msgid "Toolbar &0" +msgstr "" + +#: FTestToolPanel.form:15 +msgid "Toolbar &1" +msgstr "" + +#: FTestToolPanel.form:17 +msgid "Toolbar &2" +msgstr "" + +#: FTestValueBox.form:15 +msgid "Hello world!" +msgstr "" + +#: FTestWizard.form:18 +msgid "Étape n°1" +msgstr "" + +#: FTestWizard.form:25 +msgid "Étape n°2" +msgstr "" + +#: FTestWizard.form:29 +msgid "LCDLabel1" +msgstr "" + +#: FTestWizard.form:32 +msgid "Étape n°3" +msgstr "" + +#: FTestWizard.form:34 +msgid "Étape n°4" +msgstr "" + +#: FWizard.class:88 +msgid "&Next" +msgstr "&Další" + +#: FWizard.form:59 MessageView.class:48 +msgid "Next" +msgstr "Další" + +#: FWizard.form:65 +msgid "Previous" +msgstr "Předchozí" + +#: FileView.class:1081 +msgid "Cannot rename file." +msgstr "Nelze přejmonovat soubor." + +#: Form2.form:126 +msgid "ButtonBox2" +msgstr "" + +#: Help.module:71 +msgid "A file or directory name cannot be void." +msgstr "Název souboru nebo adresáře nemůže být neplatný." + +#: Help.module:72 +msgid "The '/' character is forbidden inside file or directory names." +msgstr "Uvnitř názvu souboru nebo adresáře je znak '/' zakázán." + +# gb-ignore +#: Main.module:52 +msgid "&1 KiB" +msgstr "" + +# gb-ignore +#: Main.module:54 +msgid "&1 MiB" +msgstr "" + +# gb-ignore +#: Main.module:56 +msgid "&1 GiB" +msgstr "" + +#: Wizard.class:86 +msgid "Step #&1" +msgstr "Krok #&1" diff --git a/comp/src/gb.form/.lang/de.po b/comp/src/gb.form/.lang/de.po new file mode 100644 index 00000000..e40e4bb6 --- /dev/null +++ b/comp/src/gb.form/.lang/de.po @@ -0,0 +1,720 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.form 3.14.90\n" +"POT-Creation-Date: 2020-06-06 18:08 UTC\n" +"PO-Revision-Date: 2020-06-06 18:02 UTC\n" +"Last-Translator: Benoît Minisini \n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "More controls for graphical components" +msgstr "Mehr Steuerelemente für grafische Komponenten" + +#: CBookmarkList.class:51 +msgid "Home" +msgstr "Startseite" + +# gb-ignore +#: CBookmarkList.class:53 +msgid "Desktop" +msgstr "" + +# gb-ignore +#: CBookmarkList.class:55 +msgid "System" +msgstr "" + +#: ColorPalette.class:143 +msgid "Last colors" +msgstr "Letzte Farben" + +#: ColorPalette.class:244 +msgid "Remove color" +msgstr "Farbe entfernen" + +#: ColorPalette.class:248 +msgid "Remove all colors" +msgstr "All Farben entfernen" + +#: ColorPalette.class:252 +msgid "Sort colors" +msgstr "Farben sortieren" + +#: DirView.class:531 +msgid "Cannot rename directory." +msgstr "Verzeichnis kann nicht umbenannt werden." + +#: DirView.class:562 +msgid "New folder" +msgstr "Neuer Ordner" + +#: DirView.class:581 +msgid "Cannot create directory." +msgstr "Verzeichnis kann nicht erstellt werden." + +#: FBugFileView.form:32 +msgid "Toggle Fileview Detailed View" +msgstr "" + +#: FBugFileView.form:37 +msgid "Toggle Filechooser Detailed View" +msgstr "" + +#: FCalendar.form:47 +msgid "Today" +msgstr "Heute" + +#: FCalendar.form:53 +msgid "Previous month" +msgstr "Voriger Monat" + +#: FCalendar.form:59 +msgid "Next month" +msgstr "Nächster Monat" + +#: FCalendar.form:143 +msgid "Apply" +msgstr "Anwenden" + +#: FColorChooser.form:81 +msgid "Follow color grid" +msgstr "Farb-Raster folgen" + +#: FDirChooser.class:428 +msgid "Directory not found." +msgstr "Verzeichnis nicht gefunden." + +#: FDirChooser.class:534 +msgid "All files (*)" +msgstr "Alle Dateien (*)" + +#: FDirChooser.class:974 +msgid "&Bookmark current directory" +msgstr "Lesezeichen für aktuelles Verzeichnis er&stellen" + +#: FDirChooser.class:982 +msgid "&Edit bookmarks..." +msgstr "&Lesezeichen bearbeiten..." + +#: FDirChooser.class:991 +msgid "Show &details" +msgstr "Details an&zeigen" + +#: FDirChooser.class:997 +msgid "Show &hidden files" +msgstr "&Versteckte Dateien anzeigen" + +#: FDirChooser.class:1003 +msgid "Show &image preview" +msgstr "&Bildvorschau anzeigen" + +#: FDirChooser.class:1011 +msgid "&Rename" +msgstr "&Umbenennen" + +#: FDirChooser.class:1016 +msgid "Copy" +msgstr "Kopieren" + +#: FDirChooser.class:1021 +msgid "&Delete" +msgstr "&Löschen" + +#: FDirChooser.class:1033 +msgid "&Uncompress file" +msgstr "Datei ent&komprimieren" + +#: FDirChooser.class:1038 +msgid "&Create directory" +msgstr "&Verzeichnis erstellen" + +#: FDirChooser.class:1043 +msgid "Open in &file manager..." +msgstr "Im &Dateimanager öffnen..." + +#: FDirChooser.class:1048 +msgid "&Refresh" +msgstr "&Aktualisieren" + +#: FDirChooser.class:1056 +msgid "&Properties" +msgstr "&Eigenschaften" + +#: FDirChooser.class:1272 +msgid "Overwrite" +msgstr "Überschreiben" + +#: FDirChooser.class:1272 +msgid "Overwrite all" +msgstr "Alle überschreiben" + +#: FDirChooser.class:1272 +msgid "This file or directory already exists." +msgstr "Datei oder Verzeichnis existiert bereits." + +#: FDirChooser.class:1291 +msgid "Cannot list archive contents" +msgstr "Archivinhalt kann nicht aufgelistet werden" + +#: FDirChooser.class:1325 +msgid "Cannot uncompress file." +msgstr "Datei kann nicht entkomprimiert werden." + +#: FDirChooser.class:1325 +msgid "Unknown archive." +msgstr "Unbekanntes Archiv." + +#: FDirChooser.class:1386 +msgid "Delete file" +msgstr "Datei löschen" + +#: FDirChooser.class:1387 +msgid "Do you really want to delete that file?" +msgstr "Wollen Sie diese Datei wirklich löschen?" + +#: FDirChooser.class:1394 +msgid "Unable to delete file." +msgstr "Datei konnte nicht gelöscht werden." + +#: FDirChooser.class:1404 +msgid "Delete directory" +msgstr "Verzeichnis löschen" + +#: FDirChooser.class:1405 +msgid "Do you really want to delete that directory?" +msgstr "Wollen Sie dieses Verzeichnis wirklich löschen?" + +#: FDirChooser.class:1412 +msgid "Unable to delete directory." +msgstr "Nicht in der Lage, Verzeichnis zu löschen." + +#: FDirChooser.form:66 +msgid "Parent directory" +msgstr "Übergeordnetes Verzeichnis" + +#: FDirChooser.form:72 +msgid "Root directory" +msgstr "Wurzelverzeichnis" + +#: FDirChooser.form:133 +msgid "Image preview" +msgstr "Bildvorschau" + +#: FDirChooser.form:141 +msgid "Detailed view" +msgstr "Detaillierte Anzeige" + +#: FDirChooser.form:149 +msgid "File properties" +msgstr "Datei-Eigenschaften" + +#: FDirChooser.form:155 +msgid "Show files" +msgstr "Dateien anzeigen" + +#: FDirChooser.form:174 +msgid "Bookmarks" +msgstr "Lesezeichen" + +# gb-ignore +#: FDirChooser.form:236 FInputBox.form:45 FWizard.class:76 +msgid "OK" +msgstr "" + +#: FDirChooser.form:242 FEditBookmark.class:119 FInputBox.form:51 +#: FSidePanel.class:1149 FWizard.form:53 +msgid "Cancel" +msgstr "Abbrechen" + +#: FDocumentView.form:51 +msgid "Zoom :" +msgstr "" + +#: FDocumentView.form:56 +msgid "Show Shadow" +msgstr "" + +#: FDocumentView.form:66 FTestTabPanel.form:64 +msgid "Padding" +msgstr "" + +#: FDocumentView.form:71 +msgid "Spacing" +msgstr "" + +#: FDocumentView.form:80 +msgid "Scale Mode" +msgstr "" + +#: FDocumentView.form:89 +msgid "Goto :" +msgstr "" + +#: FDocumentView.form:95 +msgid "Column" +msgstr "" + +#: FDocumentView.form:95 +msgid "Fill" +msgstr "" + +#: FDocumentView.form:95 +msgid "Horizontal" +msgstr "" + +#: FDocumentView.form:95 +msgid "None" +msgstr "" + +#: FDocumentView.form:95 +msgid "Row" +msgstr "" + +#: FDocumentView.form:95 +msgid "Vertical" +msgstr "" + +# gb-ignore +#: FDocumentView.form:96 FMain.form:69 +msgid "ComboBox1" +msgstr "" + +#: FDocumentView.form:101 FMain.form:85 FTestBalloon.form:18 +#: FTestCompletion.form:23 FTestMessageView.form:26 FTestWizard.form:22 +msgid "Button1" +msgstr "" + +#: FDocumentView.form:110 +msgid "Columns" +msgstr "" + +#: FDocumentView.form:120 +msgid "Autocenter" +msgstr "" + +# gb-ignore +#: FEditBookmark.class:23 FileView.class:138 +msgid "Name" +msgstr "" + +#: FEditBookmark.class:24 +msgid "Path" +msgstr "Pfad" + +#: FEditBookmark.class:119 +msgid "Do you really want to remove this bookmark?" +msgstr "Wollen Sie dieses Lesezeichen wirklich entfernen?" + +#: FEditBookmark.form:15 +msgid "Edit bookmarks" +msgstr "Lesezeichen bearbeiten" + +#: FEditBookmark.form:34 +msgid "Up" +msgstr "Herauf" + +#: FEditBookmark.form:40 +msgid "Down" +msgstr "Herunter" + +#: FEditBookmark.form:46 FListEditor.class:263 +msgid "Remove" +msgstr "Entfernen" + +#: FEditBookmark.form:57 FFileProperties.form:270 MessageView.class:51 +msgid "Close" +msgstr "Schließen" + +#: FFileProperties.class:117 +msgid "Image" +msgstr "Bild" + +#: FFileProperties.class:122 +msgid "Audio" +msgstr "Audio" + +#: FFileProperties.class:126 +msgid "Video" +msgstr "Video" + +#: FFileProperties.class:185 +msgid "&1 properties" +msgstr "&1 Eigenschaften" + +# gb-ignore +#: FFileProperties.class:216 Main.module:50 +msgid "&1 B" +msgstr "" + +#: FFileProperties.class:221 +msgid "no file" +msgstr "keine Datei" + +#: FFileProperties.class:223 +msgid "one file" +msgstr "eine Datei" + +#: FFileProperties.class:225 +msgid "files" +msgstr "Dateien" + +#: FFileProperties.class:229 +msgid "no directory" +msgstr "kein Verzeichnis" + +#: FFileProperties.class:231 +msgid "one directory" +msgstr "ein Verzeichnis" + +#: FFileProperties.class:233 +msgid "directories" +msgstr "Verzeichnisse" + +#: FFileProperties.form:52 +msgid "General" +msgstr "Allgemein" + +#: FFileProperties.form:81 +msgid "Type" +msgstr "Typ" + +#: FFileProperties.form:94 +msgid "Link" +msgstr "Verbinden" + +#: FFileProperties.form:108 +msgid "Directory" +msgstr "Verzeichnis" + +#: FFileProperties.form:120 FileView.class:140 +msgid "Size" +msgstr "Größe" + +#: FFileProperties.form:132 FileView.class:142 +msgid "Last modified" +msgstr "Zuletzt verändert" + +#: FFileProperties.form:144 +msgid "Permissions" +msgstr "Rechte" + +#: FFileProperties.form:157 +msgid "Owner" +msgstr "Besitzer" + +#: FFileProperties.form:169 +msgid "Group" +msgstr "Gruppe" + +#: FFileProperties.form:180 +msgid "Preview" +msgstr "Vorschau" + +#: FFileProperties.form:245 +msgid "Errors" +msgstr "Fehler" + +#: FFontChooser.class:297 +msgid "How quickly daft jumping zebras vex" +msgstr "Franz jagt im verwahrlosten Taxi quer durch Bayern" + +#: FFontChooser.form:55 +msgid "Bold" +msgstr "Fett" + +#: FFontChooser.form:62 +msgid "Italic" +msgstr "Kursiv" + +#: FFontChooser.form:69 +msgid "Underline" +msgstr "Unterstrichen" + +#: FFontChooser.form:76 +msgid "Strikeout" +msgstr "Durchgestrichen" + +#: FFontChooser.form:85 +msgid "Relative" +msgstr "Relativ" + +#: FIconPanel.form:18 +msgid "Item 0" +msgstr "" + +#: FIconPanel.form:23 +msgid "Toto" +msgstr "" + +#: FIconPanel.form:26 +msgid "Item 1" +msgstr "" + +#: FIconPanel.form:28 +msgid "Item 2" +msgstr "" + +#: FIconPanel.form:35 +msgid "Item 3" +msgstr "" + +#: FLCDLabel.form:15 +msgid "12:34" +msgstr "" + +#: FListEditor.class:262 +msgid "Add" +msgstr "Hinzufügen" + +#: FListEditor.form:45 +msgid "Add item" +msgstr "Element hinzufügen" + +#: FListEditor.form:52 +msgid "Remove item" +msgstr "Element entfernen" + +#: FListEditor.form:59 +msgid "Move item up" +msgstr "Element herauf bewegen" + +#: FListEditor.form:66 +msgid "Move item down" +msgstr "Element herunter bewegen" + +#: FMain.form:29 FTestFileChooser.form:31 FTestMenuButton.form:39 FWiki.form:20 +msgid "Menu2" +msgstr "" + +#: FMain.form:33 FTestFileChooser.form:36 FTestMenuButton.form:43 FWiki.form:24 +msgid "Menu3" +msgstr "" + +#: FMain.form:68 +msgid "Élément 1" +msgstr "" + +#: FMain.form:68 +msgid "Élément 2" +msgstr "" + +#: FMain.form:68 +msgid "Élément 3" +msgstr "" + +#: FMain.form:68 +msgid "Élément 4" +msgstr "" + +#: FMain.form:74 +msgid "ComboBox2" +msgstr "" + +#: FMain.form:80 FSwitchButton.form:35 FTestBalloon.form:12 +#: FTestFileChooser.form:86 +msgid "TextBox1" +msgstr "" + +#: FMain.form:90 Form2.form:121 +msgid "MenuButton1" +msgstr "" + +#: FMessage.form:39 +msgid "Do not display this message again" +msgstr "Diese Meldung nicht mehr anzeigen" + +#: FSidePanel.class:1139 +msgid "Hidden" +msgstr "Versteckt" + +# gb-ignore +#: FSidePanel.class:1143 +msgid "Transparent" +msgstr "" + +#: FSpinBar.form:24 +msgid "Test" +msgstr "" + +#: FSwitchButton.form:51 FTestFileChooser.form:81 +msgid "Label1" +msgstr "" + +#: FSwitchButton.form:58 +msgid "Label2" +msgstr "" + +#: FTestBalloon.form:17 +msgid "Ceci est une bulle d'aide" +msgstr "" + +#: FTestColorChooser.form:20 +msgid "Resizable" +msgstr "" + +#: FTestCompletion.form:28 +msgid "Button2" +msgstr "" + +#: FTestDateChooser.form:47 +msgid "Enable" +msgstr "" + +#: FTestExpander.form:16 +msgid "Expander" +msgstr "" + +#: FTestFileChooser.form:28 FTestMenuButton.form:35 +msgid "Menu1" +msgstr "" + +#: FTestFileChooser.form:41 FTestMenuButton.form:69 +msgid "Menu7" +msgstr "" + +#: FTestFileChooser.form:49 FTestMenuButton.form:52 FWiki.form:28 +msgid "Menu4" +msgstr "" + +#: FTestFileChooser.form:54 FTestMenuButton.form:56 FWiki.form:32 +msgid "Menu5" +msgstr "" + +#: FTestFileChooser.form:76 +msgid "Balloon" +msgstr "" + +#: FTestMenuButton.form:31 +msgid "Project" +msgstr "" + +#: FTestMenuButton.form:48 +msgid "View" +msgstr "" + +#: FTestMenuButton.form:60 +msgid "Menu6" +msgstr "" + +#: FTestMenuButton.form:65 +msgid "Tools" +msgstr "" + +#: FTestMenuButton.form:73 +msgid "Menu8" +msgstr "" + +#: FTestMenuButton.form:77 +msgid "Menu9" +msgstr "" + +#: FTestMenuButton.form:80 +msgid "Menu10" +msgstr "" + +#: FTestMenuButton.form:84 +msgid "Menu11" +msgstr "" + +#: FTestMenuButton.form:124 +msgid "Menu button" +msgstr "" + +#: FTestTabPanel.form:41 +msgid "Text" +msgstr "" + +#: FTestTabPanel.form:54 +msgid "Border" +msgstr "" + +#: FTestTabPanel.form:59 +msgid "Orientation" +msgstr "" + +#: FTestToolPanel.form:13 +msgid "Toolbar &0" +msgstr "" + +#: FTestToolPanel.form:15 +msgid "Toolbar &1" +msgstr "" + +#: FTestToolPanel.form:17 +msgid "Toolbar &2" +msgstr "" + +#: FTestValueBox.form:15 +msgid "Hello world!" +msgstr "" + +#: FTestWizard.form:18 +msgid "Étape n°1" +msgstr "" + +#: FTestWizard.form:25 +msgid "Étape n°2" +msgstr "" + +#: FTestWizard.form:29 +msgid "LCDLabel1" +msgstr "" + +#: FTestWizard.form:32 +msgid "Étape n°3" +msgstr "" + +#: FTestWizard.form:34 +msgid "Étape n°4" +msgstr "" + +#: FWizard.class:88 +msgid "&Next" +msgstr "&Weiter" + +#: FWizard.form:59 MessageView.class:48 +msgid "Next" +msgstr "Weiter" + +#: FWizard.form:65 +msgid "Previous" +msgstr "Zurück" + +#: FileView.class:1081 +msgid "Cannot rename file." +msgstr "Datei kann nicht umbenannt werden." + +#: Form2.form:126 +msgid "ButtonBox2" +msgstr "" + +#: Help.module:71 +msgid "A file or directory name cannot be void." +msgstr "Eine Datei oder ein Verzeichnisname kann nicht ungültig sein." + +#: Help.module:72 +msgid "The '/' character is forbidden inside file or directory names." +msgstr "Das Zeichen '/' ist in Datei- oder Verzeichnisnamen nicht erlaubt." + +# gb-ignore +#: Main.module:52 +msgid "&1 KiB" +msgstr "" + +# gb-ignore +#: Main.module:54 +msgid "&1 MiB" +msgstr "" + +# gb-ignore +#: Main.module:56 +msgid "&1 GiB" +msgstr "" + +#: Wizard.class:86 +msgid "Step #&1" +msgstr "Schritt #&1" diff --git a/comp/src/gb.form/.lang/es.po b/comp/src/gb.form/.lang/es.po new file mode 100644 index 00000000..f1cc724e --- /dev/null +++ b/comp/src/gb.form/.lang/es.po @@ -0,0 +1,718 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.form 3.14.90\n" +"POT-Creation-Date: 2020-06-06 18:08 UTC\n" +"PO-Revision-Date: 2020-06-06 18:04 UTC\n" +"Last-Translator: Benoît Minisini \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "More controls for graphical components" +msgstr "Más controles para los componentes gráficos" + +#: CBookmarkList.class:51 +msgid "Home" +msgstr "Home" + +#: CBookmarkList.class:53 +msgid "Desktop" +msgstr "Escritorio" + +#: CBookmarkList.class:55 +msgid "System" +msgstr "Sistema" + +#: ColorPalette.class:143 +msgid "Last colors" +msgstr "Colores recientes" + +#: ColorPalette.class:244 +msgid "Remove color" +msgstr "Eliminar color" + +#: ColorPalette.class:248 +msgid "Remove all colors" +msgstr "Eliminar todos los colores" + +#: ColorPalette.class:252 +msgid "Sort colors" +msgstr "Ordenar colores" + +#: DirView.class:531 +msgid "Cannot rename directory." +msgstr "No se puede renombrar el directorio." + +#: DirView.class:562 +msgid "New folder" +msgstr "Nueva carpeta" + +#: DirView.class:581 +msgid "Cannot create directory." +msgstr "No se puede crear el directorio." + +#: FBugFileView.form:32 +msgid "Toggle Fileview Detailed View" +msgstr "" + +#: FBugFileView.form:37 +msgid "Toggle Filechooser Detailed View" +msgstr "" + +#: FCalendar.form:47 +msgid "Today" +msgstr "Hoy" + +#: FCalendar.form:53 +msgid "Previous month" +msgstr "Mes anterior" + +#: FCalendar.form:59 +msgid "Next month" +msgstr "Próximo mes" + +#: FCalendar.form:143 +msgid "Apply" +msgstr "Aplicar" + +#: FColorChooser.form:81 +msgid "Follow color grid" +msgstr "Seguir el color de la rejilla" + +#: FDirChooser.class:428 +msgid "Directory not found." +msgstr "Directorio no encontrado." + +#: FDirChooser.class:534 +msgid "All files (*)" +msgstr "Todos los archivos (*)" + +#: FDirChooser.class:974 +msgid "&Bookmark current directory" +msgstr "Crear &marcador para este directorio" + +#: FDirChooser.class:982 +msgid "&Edit bookmarks..." +msgstr "&Editar marcadores" + +#: FDirChooser.class:991 +msgid "Show &details" +msgstr "Mostrar &detalles" + +#: FDirChooser.class:997 +msgid "Show &hidden files" +msgstr "Mostrar archivos &ocultos" + +#: FDirChooser.class:1003 +msgid "Show &image preview" +msgstr "Mostrar vista previa de &imagen" + +#: FDirChooser.class:1011 +msgid "&Rename" +msgstr "&Renombrar" + +#: FDirChooser.class:1016 +msgid "Copy" +msgstr "Copiar" + +#: FDirChooser.class:1021 +msgid "&Delete" +msgstr "&Borrar" + +#: FDirChooser.class:1033 +msgid "&Uncompress file" +msgstr "&Descomprimir archivo" + +#: FDirChooser.class:1038 +msgid "&Create directory" +msgstr "&Crear directorio" + +#: FDirChooser.class:1043 +msgid "Open in &file manager..." +msgstr "&Abrir en el administrador de archivos" + +#: FDirChooser.class:1048 +msgid "&Refresh" +msgstr "&Refrescar" + +#: FDirChooser.class:1056 +msgid "&Properties" +msgstr "&Propiedades" + +#: FDirChooser.class:1272 +msgid "Overwrite" +msgstr "Sobrescribir" + +#: FDirChooser.class:1272 +msgid "Overwrite all" +msgstr "Sobrescribir todos" + +#: FDirChooser.class:1272 +msgid "This file or directory already exists." +msgstr "El fichero o directorio ya existe." + +#: FDirChooser.class:1291 +msgid "Cannot list archive contents" +msgstr "No se puede listar el contenido del archivo" + +#: FDirChooser.class:1325 +msgid "Cannot uncompress file." +msgstr "No se puede descomprimir el archivo." + +#: FDirChooser.class:1325 +msgid "Unknown archive." +msgstr "Archivo desconocido." + +#: FDirChooser.class:1386 +msgid "Delete file" +msgstr "Borrar archivo" + +#: FDirChooser.class:1387 +msgid "Do you really want to delete that file?" +msgstr "¿Seguro que quieres borrar este archivo?" + +#: FDirChooser.class:1394 +msgid "Unable to delete file." +msgstr "Imposible borrar archivo." + +#: FDirChooser.class:1404 +msgid "Delete directory" +msgstr "Eliminar directorio" + +#: FDirChooser.class:1405 +msgid "Do you really want to delete that directory?" +msgstr "¿Realmente quieres borrar ese directorio?" + +#: FDirChooser.class:1412 +msgid "Unable to delete directory." +msgstr "No se puede eliminar el directorio." + +#: FDirChooser.form:66 +msgid "Parent directory" +msgstr "Directorio padre" + +#: FDirChooser.form:72 +msgid "Root directory" +msgstr "Directorio raíz" + +#: FDirChooser.form:133 +msgid "Image preview" +msgstr "Vista preliminar" + +#: FDirChooser.form:141 +msgid "Detailed view" +msgstr "Vista detallada" + +#: FDirChooser.form:149 +msgid "File properties" +msgstr "Propiedades de archivo" + +#: FDirChooser.form:155 +msgid "Show files" +msgstr "Mostrar archivos" + +#: FDirChooser.form:174 +msgid "Bookmarks" +msgstr "Marcadores" + +# gb-ignore +#: FDirChooser.form:236 FInputBox.form:45 FWizard.class:76 +msgid "OK" +msgstr "" + +#: FDirChooser.form:242 FEditBookmark.class:119 FInputBox.form:51 +#: FSidePanel.class:1149 FWizard.form:53 +msgid "Cancel" +msgstr "Cancelar" + +#: FDocumentView.form:51 +msgid "Zoom :" +msgstr "" + +#: FDocumentView.form:56 +msgid "Show Shadow" +msgstr "" + +#: FDocumentView.form:66 FTestTabPanel.form:64 +msgid "Padding" +msgstr "" + +#: FDocumentView.form:71 +msgid "Spacing" +msgstr "" + +#: FDocumentView.form:80 +msgid "Scale Mode" +msgstr "" + +#: FDocumentView.form:89 +msgid "Goto :" +msgstr "" + +#: FDocumentView.form:95 +msgid "Column" +msgstr "" + +#: FDocumentView.form:95 +msgid "Fill" +msgstr "" + +#: FDocumentView.form:95 +msgid "Horizontal" +msgstr "" + +#: FDocumentView.form:95 +msgid "None" +msgstr "" + +#: FDocumentView.form:95 +msgid "Row" +msgstr "" + +#: FDocumentView.form:95 +msgid "Vertical" +msgstr "" + +# gb-ignore +#: FDocumentView.form:96 FMain.form:69 +msgid "ComboBox1" +msgstr "" + +#: FDocumentView.form:101 FMain.form:85 FTestBalloon.form:18 +#: FTestCompletion.form:23 FTestMessageView.form:26 FTestWizard.form:22 +msgid "Button1" +msgstr "" + +#: FDocumentView.form:110 +msgid "Columns" +msgstr "" + +#: FDocumentView.form:120 +msgid "Autocenter" +msgstr "" + +#: FEditBookmark.class:23 FileView.class:138 +msgid "Name" +msgstr "Nombre" + +#: FEditBookmark.class:24 +msgid "Path" +msgstr "Ruta" + +#: FEditBookmark.class:119 +msgid "Do you really want to remove this bookmark?" +msgstr "¿Seguro que quieres borrar este marcador?" + +#: FEditBookmark.form:15 +msgid "Edit bookmarks" +msgstr "Editar marcadores" + +#: FEditBookmark.form:34 +msgid "Up" +msgstr "Arriba" + +#: FEditBookmark.form:40 +msgid "Down" +msgstr "Abajo" + +#: FEditBookmark.form:46 FListEditor.class:263 +msgid "Remove" +msgstr "Eliminar" + +#: FEditBookmark.form:57 FFileProperties.form:270 MessageView.class:51 +msgid "Close" +msgstr "Cerrar" + +#: FFileProperties.class:117 +msgid "Image" +msgstr "Imagen" + +# gb-ignore +#: FFileProperties.class:122 +msgid "Audio" +msgstr "" + +#: FFileProperties.class:126 +msgid "Video" +msgstr "Video" + +#: FFileProperties.class:185 +msgid "&1 properties" +msgstr "Propiedades de &1" + +# gb-ignore +#: FFileProperties.class:216 Main.module:50 +msgid "&1 B" +msgstr "" + +#: FFileProperties.class:221 +msgid "no file" +msgstr "no hay archivo" + +#: FFileProperties.class:223 +msgid "one file" +msgstr "un archivo" + +#: FFileProperties.class:225 +msgid "files" +msgstr "archivos" + +#: FFileProperties.class:229 +msgid "no directory" +msgstr "no hay directorio" + +#: FFileProperties.class:231 +msgid "one directory" +msgstr "un directorio" + +#: FFileProperties.class:233 +msgid "directories" +msgstr "directorios" + +# gb-ignore +#: FFileProperties.form:52 +msgid "General" +msgstr "" + +#: FFileProperties.form:81 +msgid "Type" +msgstr "Tipo" + +#: FFileProperties.form:94 +msgid "Link" +msgstr "Enlazar" + +#: FFileProperties.form:108 +msgid "Directory" +msgstr "Directorio" + +#: FFileProperties.form:120 FileView.class:140 +msgid "Size" +msgstr "Tamaño" + +#: FFileProperties.form:132 FileView.class:142 +msgid "Last modified" +msgstr "Última modificación" + +#: FFileProperties.form:144 +msgid "Permissions" +msgstr "Permisos" + +#: FFileProperties.form:157 +msgid "Owner" +msgstr "Propietario" + +#: FFileProperties.form:169 +msgid "Group" +msgstr "Grupo" + +#: FFileProperties.form:180 +msgid "Preview" +msgstr "Vista preliminar" + +#: FFileProperties.form:245 +msgid "Errors" +msgstr "Errores" + +#: FFontChooser.class:297 +msgid "How quickly daft jumping zebras vex" +msgstr "How quickly daft jumping zebras vex" + +#: FFontChooser.form:55 +msgid "Bold" +msgstr "Negrita" + +#: FFontChooser.form:62 +msgid "Italic" +msgstr "Cursiva" + +#: FFontChooser.form:69 +msgid "Underline" +msgstr "Subrayado" + +#: FFontChooser.form:76 +msgid "Strikeout" +msgstr "Tachado" + +#: FFontChooser.form:85 +msgid "Relative" +msgstr "Relativo" + +#: FIconPanel.form:18 +msgid "Item 0" +msgstr "" + +#: FIconPanel.form:23 +msgid "Toto" +msgstr "" + +#: FIconPanel.form:26 +msgid "Item 1" +msgstr "" + +#: FIconPanel.form:28 +msgid "Item 2" +msgstr "" + +#: FIconPanel.form:35 +msgid "Item 3" +msgstr "" + +#: FLCDLabel.form:15 +msgid "12:34" +msgstr "" + +#: FListEditor.class:262 +msgid "Add" +msgstr "Añadir" + +#: FListEditor.form:45 +msgid "Add item" +msgstr "Añadir item" + +#: FListEditor.form:52 +msgid "Remove item" +msgstr "Eliminar item" + +#: FListEditor.form:59 +msgid "Move item up" +msgstr "Mover item arriba" + +#: FListEditor.form:66 +msgid "Move item down" +msgstr "Mover item abajo" + +#: FMain.form:29 FTestFileChooser.form:31 FTestMenuButton.form:39 FWiki.form:20 +msgid "Menu2" +msgstr "" + +#: FMain.form:33 FTestFileChooser.form:36 FTestMenuButton.form:43 FWiki.form:24 +msgid "Menu3" +msgstr "" + +#: FMain.form:68 +msgid "Élément 1" +msgstr "" + +#: FMain.form:68 +msgid "Élément 2" +msgstr "" + +#: FMain.form:68 +msgid "Élément 3" +msgstr "" + +#: FMain.form:68 +msgid "Élément 4" +msgstr "" + +#: FMain.form:74 +msgid "ComboBox2" +msgstr "" + +#: FMain.form:80 FSwitchButton.form:35 FTestBalloon.form:12 +#: FTestFileChooser.form:86 +msgid "TextBox1" +msgstr "" + +#: FMain.form:90 Form2.form:121 +msgid "MenuButton1" +msgstr "" + +#: FMessage.form:39 +msgid "Do not display this message again" +msgstr "No mostrar este mensaje de nuevo" + +#: FSidePanel.class:1139 +msgid "Hidden" +msgstr "Oculto" + +#: FSidePanel.class:1143 +msgid "Transparent" +msgstr "Transparente" + +#: FSpinBar.form:24 +msgid "Test" +msgstr "" + +#: FSwitchButton.form:51 FTestFileChooser.form:81 +msgid "Label1" +msgstr "" + +#: FSwitchButton.form:58 +msgid "Label2" +msgstr "" + +#: FTestBalloon.form:17 +msgid "Ceci est une bulle d'aide" +msgstr "" + +#: FTestColorChooser.form:20 +msgid "Resizable" +msgstr "" + +#: FTestCompletion.form:28 +msgid "Button2" +msgstr "" + +#: FTestDateChooser.form:47 +msgid "Enable" +msgstr "" + +#: FTestExpander.form:16 +msgid "Expander" +msgstr "" + +#: FTestFileChooser.form:28 FTestMenuButton.form:35 +msgid "Menu1" +msgstr "" + +#: FTestFileChooser.form:41 FTestMenuButton.form:69 +msgid "Menu7" +msgstr "" + +#: FTestFileChooser.form:49 FTestMenuButton.form:52 FWiki.form:28 +msgid "Menu4" +msgstr "" + +#: FTestFileChooser.form:54 FTestMenuButton.form:56 FWiki.form:32 +msgid "Menu5" +msgstr "" + +#: FTestFileChooser.form:76 +msgid "Balloon" +msgstr "" + +#: FTestMenuButton.form:31 +msgid "Project" +msgstr "" + +#: FTestMenuButton.form:48 +msgid "View" +msgstr "" + +#: FTestMenuButton.form:60 +msgid "Menu6" +msgstr "" + +#: FTestMenuButton.form:65 +msgid "Tools" +msgstr "" + +#: FTestMenuButton.form:73 +msgid "Menu8" +msgstr "" + +#: FTestMenuButton.form:77 +msgid "Menu9" +msgstr "" + +#: FTestMenuButton.form:80 +msgid "Menu10" +msgstr "" + +#: FTestMenuButton.form:84 +msgid "Menu11" +msgstr "" + +#: FTestMenuButton.form:124 +msgid "Menu button" +msgstr "" + +#: FTestTabPanel.form:41 +msgid "Text" +msgstr "" + +#: FTestTabPanel.form:54 +msgid "Border" +msgstr "" + +#: FTestTabPanel.form:59 +msgid "Orientation" +msgstr "" + +#: FTestToolPanel.form:13 +msgid "Toolbar &0" +msgstr "" + +#: FTestToolPanel.form:15 +msgid "Toolbar &1" +msgstr "" + +#: FTestToolPanel.form:17 +msgid "Toolbar &2" +msgstr "" + +#: FTestValueBox.form:15 +msgid "Hello world!" +msgstr "" + +#: FTestWizard.form:18 +msgid "Étape n°1" +msgstr "" + +#: FTestWizard.form:25 +msgid "Étape n°2" +msgstr "" + +#: FTestWizard.form:29 +msgid "LCDLabel1" +msgstr "" + +#: FTestWizard.form:32 +msgid "Étape n°3" +msgstr "" + +#: FTestWizard.form:34 +msgid "Étape n°4" +msgstr "" + +#: FWizard.class:88 +msgid "&Next" +msgstr "&Siguiente" + +#: FWizard.form:59 MessageView.class:48 +msgid "Next" +msgstr "Siguiente" + +#: FWizard.form:65 +msgid "Previous" +msgstr "Anterior" + +#: FileView.class:1081 +msgid "Cannot rename file." +msgstr "No se puede renombrar el archivo." + +#: Form2.form:126 +msgid "ButtonBox2" +msgstr "" + +#: Help.module:71 +msgid "A file or directory name cannot be void." +msgstr "Un nombre de archivo o directorio no puede ser anulado." + +#: Help.module:72 +msgid "The '/' character is forbidden inside file or directory names." +msgstr "El caracter '/' esta prohibido dentro de los nombre de directorios o archivos" + +# gb-ignore +#: Main.module:52 +msgid "&1 KiB" +msgstr "" + +# gb-ignore +#: Main.module:54 +msgid "&1 MiB" +msgstr "" + +# gb-ignore +#: Main.module:56 +msgid "&1 GiB" +msgstr "" + +#: Wizard.class:86 +msgid "Step #&1" +msgstr "Paso #&1" diff --git a/comp/src/gb.form/.lang/es_ES.po b/comp/src/gb.form/.lang/es_ES.po new file mode 100644 index 00000000..9855d39a --- /dev/null +++ b/comp/src/gb.form/.lang/es_ES.po @@ -0,0 +1,718 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.form 3.14.90\n" +"POT-Creation-Date: 2020-06-06 18:08 UTC\n" +"PO-Revision-Date: 2020-06-06 18:03 UTC\n" +"Last-Translator: Benoît Minisini \n" +"Language: es_ES\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "More controls for graphical components" +msgstr "Más controles para los componentes gráficos" + +#: CBookmarkList.class:51 +msgid "Home" +msgstr "Home" + +#: CBookmarkList.class:53 +msgid "Desktop" +msgstr "Escritorio" + +#: CBookmarkList.class:55 +msgid "System" +msgstr "Sistema" + +#: ColorPalette.class:143 +msgid "Last colors" +msgstr "Colores recientes" + +#: ColorPalette.class:244 +msgid "Remove color" +msgstr "Eliminar color" + +#: ColorPalette.class:248 +msgid "Remove all colors" +msgstr "Eliminar todos los colores" + +#: ColorPalette.class:252 +msgid "Sort colors" +msgstr "Ordenar colores" + +#: DirView.class:531 +msgid "Cannot rename directory." +msgstr "No se puede renombrar el directorio." + +#: DirView.class:562 +msgid "New folder" +msgstr "Nueva carpeta" + +#: DirView.class:581 +msgid "Cannot create directory." +msgstr "No se puede crear el directorio." + +#: FBugFileView.form:32 +msgid "Toggle Fileview Detailed View" +msgstr "" + +#: FBugFileView.form:37 +msgid "Toggle Filechooser Detailed View" +msgstr "" + +#: FCalendar.form:47 +msgid "Today" +msgstr "Hoy" + +#: FCalendar.form:53 +msgid "Previous month" +msgstr "Mes anterior" + +#: FCalendar.form:59 +msgid "Next month" +msgstr "Próximo mes" + +#: FCalendar.form:143 +msgid "Apply" +msgstr "Aplicar" + +#: FColorChooser.form:81 +msgid "Follow color grid" +msgstr "Seguir el color de la rejilla" + +#: FDirChooser.class:428 +msgid "Directory not found." +msgstr "Directorio no encontrado." + +#: FDirChooser.class:534 +msgid "All files (*)" +msgstr "Todos los archivos (*)" + +#: FDirChooser.class:974 +msgid "&Bookmark current directory" +msgstr "Crear &marcador para este directorio" + +#: FDirChooser.class:982 +msgid "&Edit bookmarks..." +msgstr "&Editar marcadores" + +#: FDirChooser.class:991 +msgid "Show &details" +msgstr "Mostrar &detalles" + +#: FDirChooser.class:997 +msgid "Show &hidden files" +msgstr "Mostrar archivos &ocultos" + +#: FDirChooser.class:1003 +msgid "Show &image preview" +msgstr "Mostrar vista previa de &imagen" + +#: FDirChooser.class:1011 +msgid "&Rename" +msgstr "&Renombrar" + +#: FDirChooser.class:1016 +msgid "Copy" +msgstr "Copiar" + +#: FDirChooser.class:1021 +msgid "&Delete" +msgstr "&Borrar" + +#: FDirChooser.class:1033 +msgid "&Uncompress file" +msgstr "&Descomprimir archivo" + +#: FDirChooser.class:1038 +msgid "&Create directory" +msgstr "&Crear directorio" + +#: FDirChooser.class:1043 +msgid "Open in &file manager..." +msgstr "&Abrir en el administrador de archivos" + +#: FDirChooser.class:1048 +msgid "&Refresh" +msgstr "&Refrescar" + +#: FDirChooser.class:1056 +msgid "&Properties" +msgstr "&Propiedades" + +#: FDirChooser.class:1272 +msgid "Overwrite" +msgstr "Sobrescribir" + +#: FDirChooser.class:1272 +msgid "Overwrite all" +msgstr "Sobrescribir todos" + +#: FDirChooser.class:1272 +msgid "This file or directory already exists." +msgstr "El fichero o directorio ya existe." + +#: FDirChooser.class:1291 +msgid "Cannot list archive contents" +msgstr "No se puede listar el contenido del archivo" + +#: FDirChooser.class:1325 +msgid "Cannot uncompress file." +msgstr "No se puede descomprimir el archivo." + +#: FDirChooser.class:1325 +msgid "Unknown archive." +msgstr "Archivo desconocido." + +#: FDirChooser.class:1386 +msgid "Delete file" +msgstr "Borrar archivo" + +#: FDirChooser.class:1387 +msgid "Do you really want to delete that file?" +msgstr "¿Seguro que quieres borrar este archivo?" + +#: FDirChooser.class:1394 +msgid "Unable to delete file." +msgstr "Imposible borrar archivo." + +#: FDirChooser.class:1404 +msgid "Delete directory" +msgstr "Eliminar directorio" + +#: FDirChooser.class:1405 +msgid "Do you really want to delete that directory?" +msgstr "¿Realmente desea eliminar ese directorio?" + +#: FDirChooser.class:1412 +msgid "Unable to delete directory." +msgstr "No se puede eliminar el directorio." + +#: FDirChooser.form:66 +msgid "Parent directory" +msgstr "Directorio padre" + +#: FDirChooser.form:72 +msgid "Root directory" +msgstr "Directorio raíz" + +#: FDirChooser.form:133 +msgid "Image preview" +msgstr "Vista preliminar" + +#: FDirChooser.form:141 +msgid "Detailed view" +msgstr "Vista detallada" + +#: FDirChooser.form:149 +msgid "File properties" +msgstr "Propiedades de archivo" + +#: FDirChooser.form:155 +msgid "Show files" +msgstr "Mostrar archivos" + +#: FDirChooser.form:174 +msgid "Bookmarks" +msgstr "Marcadores" + +# gb-ignore +#: FDirChooser.form:236 FInputBox.form:45 FWizard.class:76 +msgid "OK" +msgstr "" + +#: FDirChooser.form:242 FEditBookmark.class:119 FInputBox.form:51 +#: FSidePanel.class:1149 FWizard.form:53 +msgid "Cancel" +msgstr "Cancelar" + +#: FDocumentView.form:51 +msgid "Zoom :" +msgstr "" + +#: FDocumentView.form:56 +msgid "Show Shadow" +msgstr "" + +#: FDocumentView.form:66 FTestTabPanel.form:64 +msgid "Padding" +msgstr "" + +#: FDocumentView.form:71 +msgid "Spacing" +msgstr "" + +#: FDocumentView.form:80 +msgid "Scale Mode" +msgstr "" + +#: FDocumentView.form:89 +msgid "Goto :" +msgstr "" + +#: FDocumentView.form:95 +msgid "Column" +msgstr "" + +#: FDocumentView.form:95 +msgid "Fill" +msgstr "" + +#: FDocumentView.form:95 +msgid "Horizontal" +msgstr "" + +#: FDocumentView.form:95 +msgid "None" +msgstr "" + +#: FDocumentView.form:95 +msgid "Row" +msgstr "" + +#: FDocumentView.form:95 +msgid "Vertical" +msgstr "" + +# gb-ignore +#: FDocumentView.form:96 FMain.form:69 +msgid "ComboBox1" +msgstr "" + +#: FDocumentView.form:101 FMain.form:85 FTestBalloon.form:18 +#: FTestCompletion.form:23 FTestMessageView.form:26 FTestWizard.form:22 +msgid "Button1" +msgstr "" + +#: FDocumentView.form:110 +msgid "Columns" +msgstr "" + +#: FDocumentView.form:120 +msgid "Autocenter" +msgstr "" + +#: FEditBookmark.class:23 FileView.class:138 +msgid "Name" +msgstr "Nombre" + +#: FEditBookmark.class:24 +msgid "Path" +msgstr "Ruta" + +#: FEditBookmark.class:119 +msgid "Do you really want to remove this bookmark?" +msgstr "¿Seguro que quieres borrar este marcador?" + +#: FEditBookmark.form:15 +msgid "Edit bookmarks" +msgstr "Editar marcadores" + +#: FEditBookmark.form:34 +msgid "Up" +msgstr "Arriba" + +#: FEditBookmark.form:40 +msgid "Down" +msgstr "Abajo" + +#: FEditBookmark.form:46 FListEditor.class:263 +msgid "Remove" +msgstr "Eliminar" + +#: FEditBookmark.form:57 FFileProperties.form:270 MessageView.class:51 +msgid "Close" +msgstr "Cerrar" + +#: FFileProperties.class:117 +msgid "Image" +msgstr "Imagen" + +# gb-ignore +#: FFileProperties.class:122 +msgid "Audio" +msgstr "" + +#: FFileProperties.class:126 +msgid "Video" +msgstr "Video" + +#: FFileProperties.class:185 +msgid "&1 properties" +msgstr "Propiedades de &1" + +# gb-ignore +#: FFileProperties.class:216 Main.module:50 +msgid "&1 B" +msgstr "" + +#: FFileProperties.class:221 +msgid "no file" +msgstr "no hay archivo" + +#: FFileProperties.class:223 +msgid "one file" +msgstr "un archivo" + +#: FFileProperties.class:225 +msgid "files" +msgstr "archivos" + +#: FFileProperties.class:229 +msgid "no directory" +msgstr "no hay directorio" + +#: FFileProperties.class:231 +msgid "one directory" +msgstr "un directorio" + +#: FFileProperties.class:233 +msgid "directories" +msgstr "directorios" + +# gb-ignore +#: FFileProperties.form:52 +msgid "General" +msgstr "" + +#: FFileProperties.form:81 +msgid "Type" +msgstr "Tipo" + +#: FFileProperties.form:94 +msgid "Link" +msgstr "Enlace" + +#: FFileProperties.form:108 +msgid "Directory" +msgstr "Directorio" + +#: FFileProperties.form:120 FileView.class:140 +msgid "Size" +msgstr "Tamaño" + +#: FFileProperties.form:132 FileView.class:142 +msgid "Last modified" +msgstr "Última modificación" + +#: FFileProperties.form:144 +msgid "Permissions" +msgstr "Permisos" + +#: FFileProperties.form:157 +msgid "Owner" +msgstr "Propietario" + +#: FFileProperties.form:169 +msgid "Group" +msgstr "Grupo" + +#: FFileProperties.form:180 +msgid "Preview" +msgstr "Vista preliminar" + +#: FFileProperties.form:245 +msgid "Errors" +msgstr "Errores" + +#: FFontChooser.class:297 +msgid "How quickly daft jumping zebras vex" +msgstr "How quickly daft jumping zebras vex" + +#: FFontChooser.form:55 +msgid "Bold" +msgstr "Negrita" + +#: FFontChooser.form:62 +msgid "Italic" +msgstr "Cursiva" + +#: FFontChooser.form:69 +msgid "Underline" +msgstr "Subrayado" + +#: FFontChooser.form:76 +msgid "Strikeout" +msgstr "Tachado" + +#: FFontChooser.form:85 +msgid "Relative" +msgstr "Relativo" + +#: FIconPanel.form:18 +msgid "Item 0" +msgstr "" + +#: FIconPanel.form:23 +msgid "Toto" +msgstr "" + +#: FIconPanel.form:26 +msgid "Item 1" +msgstr "" + +#: FIconPanel.form:28 +msgid "Item 2" +msgstr "" + +#: FIconPanel.form:35 +msgid "Item 3" +msgstr "" + +#: FLCDLabel.form:15 +msgid "12:34" +msgstr "" + +#: FListEditor.class:262 +msgid "Add" +msgstr "Añadir" + +#: FListEditor.form:45 +msgid "Add item" +msgstr "Añadir item" + +#: FListEditor.form:52 +msgid "Remove item" +msgstr "Eliminar item" + +#: FListEditor.form:59 +msgid "Move item up" +msgstr "Mover item arriba" + +#: FListEditor.form:66 +msgid "Move item down" +msgstr "Mover item abajo" + +#: FMain.form:29 FTestFileChooser.form:31 FTestMenuButton.form:39 FWiki.form:20 +msgid "Menu2" +msgstr "" + +#: FMain.form:33 FTestFileChooser.form:36 FTestMenuButton.form:43 FWiki.form:24 +msgid "Menu3" +msgstr "" + +#: FMain.form:68 +msgid "Élément 1" +msgstr "" + +#: FMain.form:68 +msgid "Élément 2" +msgstr "" + +#: FMain.form:68 +msgid "Élément 3" +msgstr "" + +#: FMain.form:68 +msgid "Élément 4" +msgstr "" + +#: FMain.form:74 +msgid "ComboBox2" +msgstr "" + +#: FMain.form:80 FSwitchButton.form:35 FTestBalloon.form:12 +#: FTestFileChooser.form:86 +msgid "TextBox1" +msgstr "" + +#: FMain.form:90 Form2.form:121 +msgid "MenuButton1" +msgstr "" + +#: FMessage.form:39 +msgid "Do not display this message again" +msgstr "No mostrar este mensaje de nuevo" + +#: FSidePanel.class:1139 +msgid "Hidden" +msgstr "Oculto" + +#: FSidePanel.class:1143 +msgid "Transparent" +msgstr "Transparente" + +#: FSpinBar.form:24 +msgid "Test" +msgstr "" + +#: FSwitchButton.form:51 FTestFileChooser.form:81 +msgid "Label1" +msgstr "" + +#: FSwitchButton.form:58 +msgid "Label2" +msgstr "" + +#: FTestBalloon.form:17 +msgid "Ceci est une bulle d'aide" +msgstr "" + +#: FTestColorChooser.form:20 +msgid "Resizable" +msgstr "" + +#: FTestCompletion.form:28 +msgid "Button2" +msgstr "" + +#: FTestDateChooser.form:47 +msgid "Enable" +msgstr "" + +#: FTestExpander.form:16 +msgid "Expander" +msgstr "" + +#: FTestFileChooser.form:28 FTestMenuButton.form:35 +msgid "Menu1" +msgstr "" + +#: FTestFileChooser.form:41 FTestMenuButton.form:69 +msgid "Menu7" +msgstr "" + +#: FTestFileChooser.form:49 FTestMenuButton.form:52 FWiki.form:28 +msgid "Menu4" +msgstr "" + +#: FTestFileChooser.form:54 FTestMenuButton.form:56 FWiki.form:32 +msgid "Menu5" +msgstr "" + +#: FTestFileChooser.form:76 +msgid "Balloon" +msgstr "" + +#: FTestMenuButton.form:31 +msgid "Project" +msgstr "" + +#: FTestMenuButton.form:48 +msgid "View" +msgstr "" + +#: FTestMenuButton.form:60 +msgid "Menu6" +msgstr "" + +#: FTestMenuButton.form:65 +msgid "Tools" +msgstr "" + +#: FTestMenuButton.form:73 +msgid "Menu8" +msgstr "" + +#: FTestMenuButton.form:77 +msgid "Menu9" +msgstr "" + +#: FTestMenuButton.form:80 +msgid "Menu10" +msgstr "" + +#: FTestMenuButton.form:84 +msgid "Menu11" +msgstr "" + +#: FTestMenuButton.form:124 +msgid "Menu button" +msgstr "" + +#: FTestTabPanel.form:41 +msgid "Text" +msgstr "" + +#: FTestTabPanel.form:54 +msgid "Border" +msgstr "" + +#: FTestTabPanel.form:59 +msgid "Orientation" +msgstr "" + +#: FTestToolPanel.form:13 +msgid "Toolbar &0" +msgstr "" + +#: FTestToolPanel.form:15 +msgid "Toolbar &1" +msgstr "" + +#: FTestToolPanel.form:17 +msgid "Toolbar &2" +msgstr "" + +#: FTestValueBox.form:15 +msgid "Hello world!" +msgstr "" + +#: FTestWizard.form:18 +msgid "Étape n°1" +msgstr "" + +#: FTestWizard.form:25 +msgid "Étape n°2" +msgstr "" + +#: FTestWizard.form:29 +msgid "LCDLabel1" +msgstr "" + +#: FTestWizard.form:32 +msgid "Étape n°3" +msgstr "" + +#: FTestWizard.form:34 +msgid "Étape n°4" +msgstr "" + +#: FWizard.class:88 +msgid "&Next" +msgstr "&Siguiente" + +#: FWizard.form:59 MessageView.class:48 +msgid "Next" +msgstr "Siguiente" + +#: FWizard.form:65 +msgid "Previous" +msgstr "Anterior" + +#: FileView.class:1081 +msgid "Cannot rename file." +msgstr "No se puede renombrar el archivo." + +#: Form2.form:126 +msgid "ButtonBox2" +msgstr "" + +#: Help.module:71 +msgid "A file or directory name cannot be void." +msgstr "No se puede anular un nombre de archivo o directorio." + +#: Help.module:72 +msgid "The '/' character is forbidden inside file or directory names." +msgstr "El caracter '/' esta prohibido dentro de los nombre de directorios o archivos" + +# gb-ignore +#: Main.module:52 +msgid "&1 KiB" +msgstr "" + +# gb-ignore +#: Main.module:54 +msgid "&1 MiB" +msgstr "" + +# gb-ignore +#: Main.module:56 +msgid "&1 GiB" +msgstr "" + +#: Wizard.class:86 +msgid "Step #&1" +msgstr "Paso #&1" diff --git a/comp/src/gb.form/.lang/fa.po b/comp/src/gb.form/.lang/fa.po new file mode 100644 index 00000000..374c198b --- /dev/null +++ b/comp/src/gb.form/.lang/fa.po @@ -0,0 +1,710 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.form 3.14.90\n" +"POT-Creation-Date: 2020-06-06 18:08 UTC\n" +"PO-Revision-Date: 2020-06-06 18:08 UTC\n" +"Last-Translator: Benoît Minisini \n" +"Language: fa\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "More controls for graphical components" +msgstr "" + +#: CBookmarkList.class:51 +msgid "Home" +msgstr "آغازه" + +#: CBookmarkList.class:53 +msgid "Desktop" +msgstr "رومیزی" + +#: CBookmarkList.class:55 +msgid "System" +msgstr "سیستم" + +#: ColorPalette.class:143 +msgid "Last colors" +msgstr "" + +#: ColorPalette.class:244 +msgid "Remove color" +msgstr "" + +#: ColorPalette.class:248 +msgid "Remove all colors" +msgstr "" + +#: ColorPalette.class:252 +msgid "Sort colors" +msgstr "" + +#: DirView.class:531 +msgid "Cannot rename directory." +msgstr "" + +#: DirView.class:562 +msgid "New folder" +msgstr "" + +#: DirView.class:581 +msgid "Cannot create directory." +msgstr "" + +#: FBugFileView.form:32 +msgid "Toggle Fileview Detailed View" +msgstr "" + +#: FBugFileView.form:37 +msgid "Toggle Filechooser Detailed View" +msgstr "" + +#: FCalendar.form:47 +msgid "Today" +msgstr "امروز" + +#: FCalendar.form:53 +msgid "Previous month" +msgstr "ماه قبل" + +#: FCalendar.form:59 +msgid "Next month" +msgstr "ماه بعد" + +#: FCalendar.form:143 +msgid "Apply" +msgstr "" + +#: FColorChooser.form:81 +msgid "Follow color grid" +msgstr "" + +#: FDirChooser.class:428 +msgid "Directory not found." +msgstr "" + +#: FDirChooser.class:534 +msgid "All files (*)" +msgstr "" + +#: FDirChooser.class:974 +msgid "&Bookmark current directory" +msgstr "" + +#: FDirChooser.class:982 +msgid "&Edit bookmarks..." +msgstr "" + +#: FDirChooser.class:991 +msgid "Show &details" +msgstr "" + +#: FDirChooser.class:997 +msgid "Show &hidden files" +msgstr "" + +#: FDirChooser.class:1003 +msgid "Show &image preview" +msgstr "" + +#: FDirChooser.class:1011 +msgid "&Rename" +msgstr "" + +#: FDirChooser.class:1016 +msgid "Copy" +msgstr "کپی" + +#: FDirChooser.class:1021 +msgid "&Delete" +msgstr "" + +#: FDirChooser.class:1033 +msgid "&Uncompress file" +msgstr "" + +#: FDirChooser.class:1038 +msgid "&Create directory" +msgstr "" + +#: FDirChooser.class:1043 +msgid "Open in &file manager..." +msgstr "" + +#: FDirChooser.class:1048 +msgid "&Refresh" +msgstr "" + +#: FDirChooser.class:1056 +msgid "&Properties" +msgstr "" + +#: FDirChooser.class:1272 +msgid "Overwrite" +msgstr "" + +#: FDirChooser.class:1272 +msgid "Overwrite all" +msgstr "" + +#: FDirChooser.class:1272 +msgid "This file or directory already exists." +msgstr "" + +#: FDirChooser.class:1291 +msgid "Cannot list archive contents" +msgstr "" + +#: FDirChooser.class:1325 +msgid "Cannot uncompress file." +msgstr "" + +#: FDirChooser.class:1325 +msgid "Unknown archive." +msgstr "" + +#: FDirChooser.class:1386 +msgid "Delete file" +msgstr "" + +#: FDirChooser.class:1387 +msgid "Do you really want to delete that file?" +msgstr "" + +#: FDirChooser.class:1394 +msgid "Unable to delete file." +msgstr "" + +#: FDirChooser.class:1404 +msgid "Delete directory" +msgstr "" + +#: FDirChooser.class:1405 +msgid "Do you really want to delete that directory?" +msgstr "" + +#: FDirChooser.class:1412 +msgid "Unable to delete directory." +msgstr "" + +#: FDirChooser.form:66 +msgid "Parent directory" +msgstr "" + +#: FDirChooser.form:72 +msgid "Root directory" +msgstr "" + +#: FDirChooser.form:133 +msgid "Image preview" +msgstr "" + +#: FDirChooser.form:141 +msgid "Detailed view" +msgstr "" + +#: FDirChooser.form:149 +msgid "File properties" +msgstr "" + +#: FDirChooser.form:155 +msgid "Show files" +msgstr "" + +#: FDirChooser.form:174 +msgid "Bookmarks" +msgstr "" + +#: FDirChooser.form:236 FInputBox.form:45 FWizard.class:76 +msgid "OK" +msgstr "تائید" + +#: FDirChooser.form:242 FEditBookmark.class:119 FInputBox.form:51 +#: FSidePanel.class:1149 FWizard.form:53 +msgid "Cancel" +msgstr "لغو" + +#: FDocumentView.form:51 +msgid "Zoom :" +msgstr "" + +#: FDocumentView.form:56 +msgid "Show Shadow" +msgstr "" + +#: FDocumentView.form:66 FTestTabPanel.form:64 +msgid "Padding" +msgstr "" + +#: FDocumentView.form:71 +msgid "Spacing" +msgstr "" + +#: FDocumentView.form:80 +msgid "Scale Mode" +msgstr "" + +#: FDocumentView.form:89 +msgid "Goto :" +msgstr "" + +#: FDocumentView.form:95 +msgid "Column" +msgstr "" + +#: FDocumentView.form:95 +msgid "Fill" +msgstr "" + +#: FDocumentView.form:95 +msgid "Horizontal" +msgstr "" + +#: FDocumentView.form:95 +msgid "None" +msgstr "" + +#: FDocumentView.form:95 +msgid "Row" +msgstr "" + +#: FDocumentView.form:95 +msgid "Vertical" +msgstr "" + +#: FDocumentView.form:96 FMain.form:69 +msgid "ComboBox1" +msgstr "" + +#: FDocumentView.form:101 FMain.form:85 FTestBalloon.form:18 +#: FTestCompletion.form:23 FTestMessageView.form:26 FTestWizard.form:22 +msgid "Button1" +msgstr "" + +#: FDocumentView.form:110 +msgid "Columns" +msgstr "" + +#: FDocumentView.form:120 +msgid "Autocenter" +msgstr "" + +#: FEditBookmark.class:23 FileView.class:138 +msgid "Name" +msgstr "نام" + +#: FEditBookmark.class:24 +msgid "Path" +msgstr "" + +#: FEditBookmark.class:119 +msgid "Do you really want to remove this bookmark?" +msgstr "" + +#: FEditBookmark.form:15 +msgid "Edit bookmarks" +msgstr "" + +#: FEditBookmark.form:34 +msgid "Up" +msgstr "بالا" + +#: FEditBookmark.form:40 +msgid "Down" +msgstr "_پایین" + +#: FEditBookmark.form:46 FListEditor.class:263 +msgid "Remove" +msgstr "حذف‌" + +#: FEditBookmark.form:57 FFileProperties.form:270 MessageView.class:51 +msgid "Close" +msgstr "بستن" + +#: FFileProperties.class:117 +msgid "Image" +msgstr "تصویر" + +#: FFileProperties.class:122 +msgid "Audio" +msgstr "" + +#: FFileProperties.class:126 +msgid "Video" +msgstr "ویدیو" + +#: FFileProperties.class:185 +msgid "&1 properties" +msgstr "" + +#: FFileProperties.class:216 Main.module:50 +msgid "&1 B" +msgstr "" + +#: FFileProperties.class:221 +msgid "no file" +msgstr "" + +#: FFileProperties.class:223 +msgid "one file" +msgstr "" + +#: FFileProperties.class:225 +msgid "files" +msgstr "" + +#: FFileProperties.class:229 +msgid "no directory" +msgstr "" + +#: FFileProperties.class:231 +msgid "one directory" +msgstr "" + +#: FFileProperties.class:233 +msgid "directories" +msgstr "" + +#: FFileProperties.form:52 +msgid "General" +msgstr "عمومی" + +#: FFileProperties.form:81 +msgid "Type" +msgstr "نوع" + +#: FFileProperties.form:94 +msgid "Link" +msgstr "" + +#: FFileProperties.form:108 +msgid "Directory" +msgstr "پوشه" + +#: FFileProperties.form:120 FileView.class:140 +msgid "Size" +msgstr "اندازه" + +#: FFileProperties.form:132 FileView.class:142 +msgid "Last modified" +msgstr "" + +#: FFileProperties.form:144 +msgid "Permissions" +msgstr "" + +#: FFileProperties.form:157 +msgid "Owner" +msgstr "" + +#: FFileProperties.form:169 +msgid "Group" +msgstr "" + +#: FFileProperties.form:180 +msgid "Preview" +msgstr "" + +#: FFileProperties.form:245 +msgid "Errors" +msgstr "خطاها" + +#: FFontChooser.class:297 +msgid "How quickly daft jumping zebras vex" +msgstr "" + +#: FFontChooser.form:55 +msgid "Bold" +msgstr "" + +#: FFontChooser.form:62 +msgid "Italic" +msgstr "کج" + +#: FFontChooser.form:69 +msgid "Underline" +msgstr "خط زیر" + +#: FFontChooser.form:76 +msgid "Strikeout" +msgstr "باطل کردن" + +#: FFontChooser.form:85 +msgid "Relative" +msgstr "" + +#: FIconPanel.form:18 +msgid "Item 0" +msgstr "" + +#: FIconPanel.form:23 +msgid "Toto" +msgstr "" + +#: FIconPanel.form:26 +msgid "Item 1" +msgstr "" + +#: FIconPanel.form:28 +msgid "Item 2" +msgstr "" + +#: FIconPanel.form:35 +msgid "Item 3" +msgstr "" + +#: FLCDLabel.form:15 +msgid "12:34" +msgstr "" + +#: FListEditor.class:262 +msgid "Add" +msgstr "افزودن‌" + +#: FListEditor.form:45 +msgid "Add item" +msgstr "" + +#: FListEditor.form:52 +msgid "Remove item" +msgstr "" + +#: FListEditor.form:59 +msgid "Move item up" +msgstr "" + +#: FListEditor.form:66 +msgid "Move item down" +msgstr "" + +#: FMain.form:29 FTestFileChooser.form:31 FTestMenuButton.form:39 FWiki.form:20 +msgid "Menu2" +msgstr "" + +#: FMain.form:33 FTestFileChooser.form:36 FTestMenuButton.form:43 FWiki.form:24 +msgid "Menu3" +msgstr "" + +#: FMain.form:68 +msgid "Élément 1" +msgstr "" + +#: FMain.form:68 +msgid "Élément 2" +msgstr "" + +#: FMain.form:68 +msgid "Élément 3" +msgstr "" + +#: FMain.form:68 +msgid "Élément 4" +msgstr "" + +#: FMain.form:74 +msgid "ComboBox2" +msgstr "" + +#: FMain.form:80 FSwitchButton.form:35 FTestBalloon.form:12 +#: FTestFileChooser.form:86 +msgid "TextBox1" +msgstr "" + +#: FMain.form:90 Form2.form:121 +msgid "MenuButton1" +msgstr "" + +#: FMessage.form:39 +msgid "Do not display this message again" +msgstr "" + +#: FSidePanel.class:1139 +msgid "Hidden" +msgstr "" + +#: FSidePanel.class:1143 +msgid "Transparent" +msgstr "" + +#: FSpinBar.form:24 +msgid "Test" +msgstr "" + +#: FSwitchButton.form:51 FTestFileChooser.form:81 +msgid "Label1" +msgstr "" + +#: FSwitchButton.form:58 +msgid "Label2" +msgstr "" + +#: FTestBalloon.form:17 +msgid "Ceci est une bulle d'aide" +msgstr "" + +#: FTestColorChooser.form:20 +msgid "Resizable" +msgstr "" + +#: FTestCompletion.form:28 +msgid "Button2" +msgstr "" + +#: FTestDateChooser.form:47 +msgid "Enable" +msgstr "" + +#: FTestExpander.form:16 +msgid "Expander" +msgstr "" + +#: FTestFileChooser.form:28 FTestMenuButton.form:35 +msgid "Menu1" +msgstr "" + +#: FTestFileChooser.form:41 FTestMenuButton.form:69 +msgid "Menu7" +msgstr "" + +#: FTestFileChooser.form:49 FTestMenuButton.form:52 FWiki.form:28 +msgid "Menu4" +msgstr "" + +#: FTestFileChooser.form:54 FTestMenuButton.form:56 FWiki.form:32 +msgid "Menu5" +msgstr "" + +#: FTestFileChooser.form:76 +msgid "Balloon" +msgstr "" + +#: FTestMenuButton.form:31 +msgid "Project" +msgstr "" + +#: FTestMenuButton.form:48 +msgid "View" +msgstr "" + +#: FTestMenuButton.form:60 +msgid "Menu6" +msgstr "" + +#: FTestMenuButton.form:65 +msgid "Tools" +msgstr "" + +#: FTestMenuButton.form:73 +msgid "Menu8" +msgstr "" + +#: FTestMenuButton.form:77 +msgid "Menu9" +msgstr "" + +#: FTestMenuButton.form:80 +msgid "Menu10" +msgstr "" + +#: FTestMenuButton.form:84 +msgid "Menu11" +msgstr "" + +#: FTestMenuButton.form:124 +msgid "Menu button" +msgstr "" + +#: FTestTabPanel.form:41 +msgid "Text" +msgstr "" + +#: FTestTabPanel.form:54 +msgid "Border" +msgstr "" + +#: FTestTabPanel.form:59 +msgid "Orientation" +msgstr "" + +#: FTestToolPanel.form:13 +msgid "Toolbar &0" +msgstr "" + +#: FTestToolPanel.form:15 +msgid "Toolbar &1" +msgstr "" + +#: FTestToolPanel.form:17 +msgid "Toolbar &2" +msgstr "" + +#: FTestValueBox.form:15 +msgid "Hello world!" +msgstr "" + +#: FTestWizard.form:18 +msgid "Étape n°1" +msgstr "" + +#: FTestWizard.form:25 +msgid "Étape n°2" +msgstr "" + +#: FTestWizard.form:29 +msgid "LCDLabel1" +msgstr "" + +#: FTestWizard.form:32 +msgid "Étape n°3" +msgstr "" + +#: FTestWizard.form:34 +msgid "Étape n°4" +msgstr "" + +#: FWizard.class:88 +msgid "&Next" +msgstr "&بعدی‌" + +#: FWizard.form:59 MessageView.class:48 +msgid "Next" +msgstr "بعدی" + +#: FWizard.form:65 +msgid "Previous" +msgstr "قبلی" + +#: FileView.class:1081 +msgid "Cannot rename file." +msgstr "" + +#: Form2.form:126 +msgid "ButtonBox2" +msgstr "" + +#: Help.module:71 +msgid "A file or directory name cannot be void." +msgstr "" + +#: Help.module:72 +msgid "The '/' character is forbidden inside file or directory names." +msgstr "" + +#: Main.module:52 +msgid "&1 KiB" +msgstr "" + +#: Main.module:54 +msgid "&1 MiB" +msgstr "" + +#: Main.module:56 +msgid "&1 GiB" +msgstr "" + +#: Wizard.class:86 +msgid "Step #&1" +msgstr "" diff --git a/comp/src/gb.form/.lang/fr.po b/comp/src/gb.form/.lang/fr.po new file mode 100644 index 00000000..115241b5 --- /dev/null +++ b/comp/src/gb.form/.lang/fr.po @@ -0,0 +1,464 @@ +# #-#-#-#-# FFontChooser.pot (PACKAGE VERSION) #-#-#-#-# +# /home/benoit/gambas/2.0/src/gb.qt/src/gb.qt/FFontChooser.class +# Generated by Gambas compiler +# FIRST AUTHOR , YEAR. +# +# #-#-#-#-# FMain.pot (PACKAGE VERSION) #-#-#-#-# +# /home/benoit/gambas/2.0/src/gb.qt/src/gb.qt/FMain.class +# Generated by Gambas compiler +# FIRST AUTHOR , YEAR. +# +# #-#-#-#-# FontChooser.pot (PACKAGE VERSION) #-#-#-#-# +# /home/benoit/gambas/2.0/src/gb.qt/src/gb.qt/FontChooser.class +# Generated by Gambas compiler +# FIRST AUTHOR , YEAR. +# +# #-#-#-#-# #project.pot (PACKAGE VERSION) #-#-#-#-# +# /home/benoit/gambas/2.0/src/gb.qt/src/gb.qt/.project +# Generated by Gambas compiler +# FIRST AUTHOR , YEAR. +# +# #-#-#-#-# ValueBox.pot (PACKAGE VERSION) #-#-#-#-# +# /home/benoit/gambas/2.0/src/gb.qt/src/gb.qt/ValueBox.class +# Generated by Gambas compiler +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.form 3.14.90\n" +"PO-Revision-Date: 2020-06-25 01:21 UTC\n" +"Last-Translator: Benoît Minisini \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "More controls for graphical components" +msgstr "Contrôles graphiques supplémentaires" + +#: CBookmarkList.class:51 +msgid "Home" +msgstr "Dossier personnel" + +#: CBookmarkList.class:53 +msgid "Desktop" +msgstr "Bureau" + +#: CBookmarkList.class:55 +msgid "System" +msgstr "Système" + +#: ColorPalette.class:143 +msgid "Last colors" +msgstr "Dernières couleurs" + +#: ColorPalette.class:244 +msgid "Remove color" +msgstr "Retirer la couleur" + +#: ColorPalette.class:248 +msgid "Remove all colors" +msgstr "Retirer toutes les couleurs" + +#: ColorPalette.class:252 +msgid "Sort colors" +msgstr "Trier les couleurs" + +#: DirView.class:535 +msgid "Cannot rename directory." +msgstr "Impossible de renommer le répertoire." + +#: DirView.class:566 +msgid "New folder" +msgstr "Nouveau répertoire" + +#: DirView.class:585 +msgid "Cannot create directory." +msgstr "Impossible de créer le répertoire." + +#: FCalendar.form:47 +msgid "Today" +msgstr "Aujourd'hui" + +#: FCalendar.form:53 +msgid "Previous month" +msgstr "Mois précédent" + +#: FCalendar.form:59 +msgid "Next month" +msgstr "Mois suivant" + +#: FCalendar.form:143 +msgid "Apply" +msgstr "Appliquer" + +#: FColorChooser.form:81 +msgid "Follow color grid" +msgstr "Suivre la grille de couleurs" + +#: FDirChooser.class:428 +msgid "Directory not found." +msgstr "Répertoire introuvable." + +#: FDirChooser.class:534 +msgid "All files (*)" +msgstr "Tous les fichiers (*)" + +#: FDirChooser.class:976 +msgid "&Bookmark current directory" +msgstr "&Marquer le répertoire courant" + +#: FDirChooser.class:984 +msgid "&Edit bookmarks..." +msgstr "&Editer les signets..." + +#: FDirChooser.class:993 +msgid "Show &details" +msgstr "Vue &détaillée" + +#: FDirChooser.class:999 +msgid "Show &hidden files" +msgstr "Afficher les fichiers &cachés" + +#: FDirChooser.class:1005 +msgid "Show &image preview" +msgstr "Prévisualisation des &images" + +#: FDirChooser.class:1013 +msgid "&Rename" +msgstr "&Renommer" + +#: FDirChooser.class:1018 +msgid "Copy" +msgstr "Copier" + +#: FDirChooser.class:1023 +msgid "&Delete" +msgstr "&Supprimer" + +#: FDirChooser.class:1035 +msgid "&Uncompress file" +msgstr "&Décompresser le fichier" + +#: FDirChooser.class:1040 +msgid "&Create directory" +msgstr "&Créer un répertoire" + +#: FDirChooser.class:1045 +msgid "Open in &file manager..." +msgstr "Ouvrir dans le gestionnaire de &fichiers..." + +#: FDirChooser.class:1050 +msgid "&Refresh" +msgstr "&Actualiser" + +#: FDirChooser.class:1058 +msgid "&Properties" +msgstr "&Propriétés" + +#: FDirChooser.class:1274 +msgid "Overwrite" +msgstr "Ecraser" + +#: FDirChooser.class:1274 +msgid "Overwrite all" +msgstr "Tout écraser" + +#: FDirChooser.class:1274 +msgid "This file or directory already exists." +msgstr "Ce fichier ou ce répertoire existe déjà." + +#: FDirChooser.class:1293 +msgid "Cannot list archive contents" +msgstr "Impossible de lister le contenu de l'archive" + +#: FDirChooser.class:1327 +msgid "Cannot uncompress file." +msgstr "Impossible de décompresser le fichier." + +#: FDirChooser.class:1327 +msgid "Unknown archive." +msgstr "Archive inconnue." + +#: FDirChooser.class:1388 +msgid "Delete file" +msgstr "Supprimer le fichier" + +#: FDirChooser.class:1389 +msgid "Do you really want to delete that file?" +msgstr "Désirez-vous réellement supprimer ce fichier ?" + +#: FDirChooser.class:1396 +msgid "Unable to delete file." +msgstr "Impossible de supprimer le fichier." + +#: FDirChooser.class:1406 +msgid "Delete directory" +msgstr "Supprimer le répertoire" + +#: FDirChooser.class:1407 +msgid "Do you really want to delete that directory?" +msgstr "Désirez-vous vraiment supprimer ce répertoire ?" + +#: FDirChooser.class:1414 +msgid "Unable to delete directory." +msgstr "Impossible de supprimer le répertoire." + +#: FDirChooser.form:67 +msgid "Parent directory" +msgstr "Répertoire parent" + +#: FDirChooser.form:73 +msgid "Root directory" +msgstr "Répertoire racine" + +#: FDirChooser.form:134 +msgid "Image preview" +msgstr "Prévisualisation des images" + +#: FDirChooser.form:142 +msgid "Detailed view" +msgstr "Vue détaillée" + +#: FDirChooser.form:150 +msgid "File properties" +msgstr "Propriétés du fichier" + +#: FDirChooser.form:156 +msgid "Show files" +msgstr "Afficher les fichiers" + +#: FDirChooser.form:175 +msgid "Bookmarks" +msgstr "Signets" + +#: FDirChooser.form:242 FInputBox.form:45 FWizard.class:76 +msgid "OK" +msgstr "OK" + +#: FDirChooser.form:248 FEditBookmark.class:119 FInputBox.form:51 FSidePanel.class:1149 FWizard.form:53 +msgid "Cancel" +msgstr "Annuler" + +#: FEditBookmark.class:23 FileView.class:142 +msgid "Name" +msgstr "Nom" + +#: FEditBookmark.class:24 +msgid "Path" +msgstr "Emplacement" + +#: FEditBookmark.class:119 +msgid "Do you really want to remove this bookmark?" +msgstr "Désirez-vous réellement supprimer ce signet ?" + +#: FEditBookmark.form:15 +msgid "Edit bookmarks" +msgstr "Edition des signets" + +#: FEditBookmark.form:34 +msgid "Up" +msgstr "Haut" + +#: FEditBookmark.form:40 +msgid "Down" +msgstr "Bas" + +#: FEditBookmark.form:46 FListEditor.class:263 +msgid "Remove" +msgstr "Supprimer" + +#: FEditBookmark.form:57 FFileProperties.form:270 MessageView.class:51 +msgid "Close" +msgstr "Fermer" + +#: FFileProperties.class:117 +msgid "Image" +msgstr "Image" + +#: FFileProperties.class:122 +msgid "Audio" +msgstr "Audio" + +#: FFileProperties.class:126 +msgid "Video" +msgstr "Vidéo" + +#: FFileProperties.class:185 +msgid "&1 properties" +msgstr "Propriétés de &1" + +#: FFileProperties.class:216 Main.module:50 +msgid "&1 B" +msgstr "&1 o" + +#: FFileProperties.class:221 +msgid "no file" +msgstr "aucun fichier" + +#: FFileProperties.class:223 +msgid "one file" +msgstr "un fichier" + +#: FFileProperties.class:225 +msgid "files" +msgstr "fichiers" + +#: FFileProperties.class:229 +msgid "no directory" +msgstr "aucun répertoire" + +#: FFileProperties.class:231 +msgid "one directory" +msgstr "un répertoire" + +#: FFileProperties.class:233 +msgid "directories" +msgstr "répertoires" + +#: FFileProperties.form:52 +msgid "General" +msgstr "Général" + +#: FFileProperties.form:81 +msgid "Type" +msgstr "Type" + +#: FFileProperties.form:94 +msgid "Link" +msgstr "Lien" + +#: FFileProperties.form:108 +msgid "Directory" +msgstr "Répertoire" + +#: FFileProperties.form:120 FileView.class:144 +msgid "Size" +msgstr "Taille" + +#: FFileProperties.form:132 FileView.class:146 +msgid "Last modified" +msgstr "Modifié le" + +#: FFileProperties.form:144 +msgid "Permissions" +msgstr "Permissions" + +#: FFileProperties.form:157 +msgid "Owner" +msgstr "Propriétaire" + +#: FFileProperties.form:169 +msgid "Group" +msgstr "Groupe" + +#: FFileProperties.form:180 +msgid "Preview" +msgstr "Aperçu" + +#: FFileProperties.form:245 +msgid "Errors" +msgstr "Erreurs" + +#: FFontChooser.class:297 +msgid "How quickly daft jumping zebras vex" +msgstr "Portez ce vieux whisky au juge blond qui fume" + +#: FFontChooser.form:55 +msgid "Bold" +msgstr "Gras" + +#: FFontChooser.form:62 +msgid "Italic" +msgstr "Italique" + +#: FFontChooser.form:69 +msgid "Underline" +msgstr "Souligné" + +#: FFontChooser.form:76 +msgid "Strikeout" +msgstr "Barré" + +#: FFontChooser.form:85 +msgid "Relative" +msgstr "Relatif" + +#: FListEditor.class:262 +msgid "Add" +msgstr "Ajouter" + +#: FListEditor.form:45 +msgid "Add item" +msgstr "Ajouter un élément" + +#: FListEditor.form:52 +msgid "Remove item" +msgstr "Supprimer l'élément" + +#: FListEditor.form:59 +msgid "Move item up" +msgstr "Déplacer l'élément vers le haut" + +#: FListEditor.form:66 +msgid "Move item down" +msgstr "Déplacer l'élément vers le bas" + +#: FMessage.form:39 +msgid "Do not display this message again" +msgstr "Ne plus afficher ce message" + +#: FSidePanel.class:1139 +msgid "Hidden" +msgstr "Masqué" + +#: FSidePanel.class:1143 +msgid "Transparent" +msgstr "Transparent" + +#: FWizard.class:88 +msgid "&Next" +msgstr "&Suivant" + +#: FWizard.form:59 MessageView.class:48 +msgid "Next" +msgstr "Suivant" + +#: FWizard.form:65 +msgid "Previous" +msgstr "Précédent" + +#: FileView.class:158 +msgid "No file in this folder." +msgstr "Aucun fichier dans ce répertoire." + +#: FileView.class:1133 +msgid "Cannot rename file." +msgstr "Impossible de renommer le fichier." + +#: Help.module:71 +msgid "A file or directory name cannot be void." +msgstr "Le nom d'un fichier ou d'un répertoire ne peut être vide." + +#: Help.module:72 +msgid "The '/' character is forbidden inside file or directory names." +msgstr "Le caractère '/' est interdit dans les noms de fichiers ou de répertoires." + +#: Main.module:52 +msgid "&1 KiB" +msgstr "&1 Kio" + +#: Main.module:54 +msgid "&1 MiB" +msgstr "&1 Mio" + +#: Main.module:56 +msgid "&1 GiB" +msgstr "&1 Gio" + +#: Wizard.class:86 +msgid "Step #&1" +msgstr "Étape n°&1" + diff --git a/comp/src/gb.form/.lang/it.po b/comp/src/gb.form/.lang/it.po new file mode 100644 index 00000000..e654e765 --- /dev/null +++ b/comp/src/gb.form/.lang/it.po @@ -0,0 +1,716 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.form 3.14.90\n" +"POT-Creation-Date: 2020-06-06 18:08 UTC\n" +"PO-Revision-Date: 2020-06-06 18:05 UTC\n" +"Last-Translator: Benoît Minisini \n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "More controls for graphical components" +msgstr "Ulteriori controlli per i componenti grafici" + +# gb-ignore +#: CBookmarkList.class:51 +msgid "Home" +msgstr "" + +# gb-ignore +#: CBookmarkList.class:53 +msgid "Desktop" +msgstr "" + +#: CBookmarkList.class:55 +msgid "System" +msgstr "Sistema" + +#: ColorPalette.class:143 +msgid "Last colors" +msgstr "Ultimi colori" + +#: ColorPalette.class:244 +msgid "Remove color" +msgstr "Rimuovi il colore" + +#: ColorPalette.class:248 +msgid "Remove all colors" +msgstr "Rimuovi tutti i colori" + +#: ColorPalette.class:252 +msgid "Sort colors" +msgstr "Ordina i colori" + +#: DirView.class:531 +msgid "Cannot rename directory." +msgstr "Impossibile rinominare la cartella." + +#: DirView.class:562 +msgid "New folder" +msgstr "Nuova cartella" + +#: DirView.class:581 +msgid "Cannot create directory." +msgstr "Impossibile creare la cartella." + +#: FBugFileView.form:32 +msgid "Toggle Fileview Detailed View" +msgstr "" + +#: FBugFileView.form:37 +msgid "Toggle Filechooser Detailed View" +msgstr "" + +#: FCalendar.form:47 +msgid "Today" +msgstr "Oggi" + +#: FCalendar.form:53 +msgid "Previous month" +msgstr "Mese precedente" + +#: FCalendar.form:59 +msgid "Next month" +msgstr "Prossimo mese" + +#: FCalendar.form:143 +msgid "Apply" +msgstr "Applica" + +#: FColorChooser.form:81 +msgid "Follow color grid" +msgstr "Segui la tabella dei colori" + +#: FDirChooser.class:428 +msgid "Directory not found." +msgstr "Directory non trovata." + +#: FDirChooser.class:534 +msgid "All files (*)" +msgstr "Tutti i file (*)" + +#: FDirChooser.class:974 +msgid "&Bookmark current directory" +msgstr "&Marca la directory corrente" + +#: FDirChooser.class:982 +msgid "&Edit bookmarks..." +msgstr "Modifica i s&egnalibri..." + +#: FDirChooser.class:991 +msgid "Show &details" +msgstr "Mostra &dettagli" + +#: FDirChooser.class:997 +msgid "Show &hidden files" +msgstr "Mostra i file &nascosti" + +#: FDirChooser.class:1003 +msgid "Show &image preview" +msgstr "Mostra anteprima &immagine" + +#: FDirChooser.class:1011 +msgid "&Rename" +msgstr "&Rinomina" + +#: FDirChooser.class:1016 +msgid "Copy" +msgstr "Copia" + +#: FDirChooser.class:1021 +msgid "&Delete" +msgstr "&Cancella" + +#: FDirChooser.class:1033 +msgid "&Uncompress file" +msgstr "&Decomprimi il file" + +#: FDirChooser.class:1038 +msgid "&Create directory" +msgstr "&Crea la directory" + +#: FDirChooser.class:1043 +msgid "Open in &file manager..." +msgstr "Apri nel &file manager..." + +#: FDirChooser.class:1048 +msgid "&Refresh" +msgstr "&Ricarica" + +#: FDirChooser.class:1056 +msgid "&Properties" +msgstr "&Proprietà" + +#: FDirChooser.class:1272 +msgid "Overwrite" +msgstr "Sovrascrivi" + +#: FDirChooser.class:1272 +msgid "Overwrite all" +msgstr "Sovrascrivi tutto" + +#: FDirChooser.class:1272 +msgid "This file or directory already exists." +msgstr "Questo file o directory già esiste." + +#: FDirChooser.class:1291 +msgid "Cannot list archive contents" +msgstr "Impossibile elencare il contenuto dell'archivio" + +#: FDirChooser.class:1325 +msgid "Cannot uncompress file." +msgstr "Impossibile decomprimere il file." + +#: FDirChooser.class:1325 +msgid "Unknown archive." +msgstr "Archivio sconosciuto." + +#: FDirChooser.class:1386 +msgid "Delete file" +msgstr "Elimina il file" + +#: FDirChooser.class:1387 +msgid "Do you really want to delete that file?" +msgstr "Vuoi veramente eliminare questo file?" + +#: FDirChooser.class:1394 +msgid "Unable to delete file." +msgstr "Impossibile eliminare il file." + +#: FDirChooser.class:1404 +msgid "Delete directory" +msgstr "Elimina la directory" + +#: FDirChooser.class:1405 +msgid "Do you really want to delete that directory?" +msgstr "Vuoi veramente eliminare questa directory?" + +#: FDirChooser.class:1412 +msgid "Unable to delete directory." +msgstr "Impossibile eliminare la directory." + +#: FDirChooser.form:66 +msgid "Parent directory" +msgstr "Cartella superiore" + +#: FDirChooser.form:72 +msgid "Root directory" +msgstr "Directory principale" + +#: FDirChooser.form:133 +msgid "Image preview" +msgstr "Anteprima immagine" + +#: FDirChooser.form:141 +msgid "Detailed view" +msgstr "Vista dettagliata" + +#: FDirChooser.form:149 +msgid "File properties" +msgstr "Proprietà del file" + +#: FDirChooser.form:155 +msgid "Show files" +msgstr "Mostra i file" + +#: FDirChooser.form:174 +msgid "Bookmarks" +msgstr "Segnalibri" + +# gb-ignore +#: FDirChooser.form:236 FInputBox.form:45 FWizard.class:76 +msgid "OK" +msgstr "" + +#: FDirChooser.form:242 FEditBookmark.class:119 FInputBox.form:51 +#: FSidePanel.class:1149 FWizard.form:53 +msgid "Cancel" +msgstr "Annulla" + +#: FDocumentView.form:51 +msgid "Zoom :" +msgstr "" + +#: FDocumentView.form:56 +msgid "Show Shadow" +msgstr "" + +#: FDocumentView.form:66 FTestTabPanel.form:64 +msgid "Padding" +msgstr "" + +#: FDocumentView.form:71 +msgid "Spacing" +msgstr "" + +#: FDocumentView.form:80 +msgid "Scale Mode" +msgstr "" + +#: FDocumentView.form:89 +msgid "Goto :" +msgstr "" + +#: FDocumentView.form:95 +msgid "Column" +msgstr "" + +#: FDocumentView.form:95 +msgid "Fill" +msgstr "" + +#: FDocumentView.form:95 +msgid "Horizontal" +msgstr "" + +#: FDocumentView.form:95 +msgid "None" +msgstr "" + +#: FDocumentView.form:95 +msgid "Row" +msgstr "" + +#: FDocumentView.form:95 +msgid "Vertical" +msgstr "" + +# gb-ignore +#: FDocumentView.form:96 FMain.form:69 +msgid "ComboBox1" +msgstr "" + +#: FDocumentView.form:101 FMain.form:85 FTestBalloon.form:18 +#: FTestCompletion.form:23 FTestMessageView.form:26 FTestWizard.form:22 +msgid "Button1" +msgstr "" + +#: FDocumentView.form:110 +msgid "Columns" +msgstr "" + +#: FDocumentView.form:120 +msgid "Autocenter" +msgstr "" + +#: FEditBookmark.class:23 FileView.class:138 +msgid "Name" +msgstr "Nome" + +#: FEditBookmark.class:24 +msgid "Path" +msgstr "Percorso" + +#: FEditBookmark.class:119 +msgid "Do you really want to remove this bookmark?" +msgstr "Vuoi veramente eliminare questo segnalibro?" + +#: FEditBookmark.form:15 +msgid "Edit bookmarks" +msgstr "Modifica segnalibri" + +#: FEditBookmark.form:34 +msgid "Up" +msgstr "Su" + +#: FEditBookmark.form:40 +msgid "Down" +msgstr "Giù" + +#: FEditBookmark.form:46 FListEditor.class:263 +msgid "Remove" +msgstr "Rimuovi" + +#: FEditBookmark.form:57 FFileProperties.form:270 MessageView.class:51 +msgid "Close" +msgstr "Chiudi" + +#: FFileProperties.class:117 +msgid "Image" +msgstr "Immagine" + +# gb-ignore +#: FFileProperties.class:122 +msgid "Audio" +msgstr "" + +# gb-ignore +#: FFileProperties.class:126 +msgid "Video" +msgstr "" + +#: FFileProperties.class:185 +msgid "&1 properties" +msgstr "Proprietà di &1" + +#: FFileProperties.class:216 Main.module:50 +msgid "&1 B" +msgstr "&1 B" + +#: FFileProperties.class:221 +msgid "no file" +msgstr "nessun file" + +#: FFileProperties.class:223 +msgid "one file" +msgstr "un file" + +#: FFileProperties.class:225 +msgid "files" +msgstr "file" + +#: FFileProperties.class:229 +msgid "no directory" +msgstr "nessuna directory" + +#: FFileProperties.class:231 +msgid "one directory" +msgstr "una directory" + +#: FFileProperties.class:233 +msgid "directories" +msgstr "directory" + +#: FFileProperties.form:52 +msgid "General" +msgstr "Generale" + +#: FFileProperties.form:81 +msgid "Type" +msgstr "Tipo" + +#: FFileProperties.form:94 +msgid "Link" +msgstr "Collegamento" + +#: FFileProperties.form:108 +msgid "Directory" +msgstr "Directory" + +#: FFileProperties.form:120 FileView.class:140 +msgid "Size" +msgstr "Dimensione" + +#: FFileProperties.form:132 FileView.class:142 +msgid "Last modified" +msgstr "Ultima modifica" + +#: FFileProperties.form:144 +msgid "Permissions" +msgstr "Permessi" + +#: FFileProperties.form:157 +msgid "Owner" +msgstr "Proprietario" + +#: FFileProperties.form:169 +msgid "Group" +msgstr "Gruppo" + +#: FFileProperties.form:180 +msgid "Preview" +msgstr "Anteprima" + +#: FFileProperties.form:245 +msgid "Errors" +msgstr "Errori" + +#: FFontChooser.class:297 +msgid "How quickly daft jumping zebras vex" +msgstr "Quel vituperabile xenofobo zelante assaggia il whisky ed esclama: alleluja!" + +#: FFontChooser.form:55 +msgid "Bold" +msgstr "Grassetto" + +#: FFontChooser.form:62 +msgid "Italic" +msgstr "Italico" + +#: FFontChooser.form:69 +msgid "Underline" +msgstr "Sottolineato" + +#: FFontChooser.form:76 +msgid "Strikeout" +msgstr "Barrato" + +#: FFontChooser.form:85 +msgid "Relative" +msgstr "Relativo" + +#: FIconPanel.form:18 +msgid "Item 0" +msgstr "" + +#: FIconPanel.form:23 +msgid "Toto" +msgstr "" + +#: FIconPanel.form:26 +msgid "Item 1" +msgstr "" + +#: FIconPanel.form:28 +msgid "Item 2" +msgstr "" + +#: FIconPanel.form:35 +msgid "Item 3" +msgstr "" + +#: FLCDLabel.form:15 +msgid "12:34" +msgstr "" + +#: FListEditor.class:262 +msgid "Add" +msgstr "Aggiungi" + +#: FListEditor.form:45 +msgid "Add item" +msgstr "Aggiungi un elemento" + +#: FListEditor.form:52 +msgid "Remove item" +msgstr "Rimuovi l'elemento" + +#: FListEditor.form:59 +msgid "Move item up" +msgstr "Sposta l'elemento verso l'alto" + +#: FListEditor.form:66 +msgid "Move item down" +msgstr "Sposta l'elemento verso il basso" + +#: FMain.form:29 FTestFileChooser.form:31 FTestMenuButton.form:39 FWiki.form:20 +msgid "Menu2" +msgstr "" + +#: FMain.form:33 FTestFileChooser.form:36 FTestMenuButton.form:43 FWiki.form:24 +msgid "Menu3" +msgstr "" + +#: FMain.form:68 +msgid "Élément 1" +msgstr "" + +#: FMain.form:68 +msgid "Élément 2" +msgstr "" + +#: FMain.form:68 +msgid "Élément 3" +msgstr "" + +#: FMain.form:68 +msgid "Élément 4" +msgstr "" + +#: FMain.form:74 +msgid "ComboBox2" +msgstr "" + +#: FMain.form:80 FSwitchButton.form:35 FTestBalloon.form:12 +#: FTestFileChooser.form:86 +msgid "TextBox1" +msgstr "" + +#: FMain.form:90 Form2.form:121 +msgid "MenuButton1" +msgstr "" + +#: FMessage.form:39 +msgid "Do not display this message again" +msgstr "Non mostrare più questo messaggio." + +#: FSidePanel.class:1139 +msgid "Hidden" +msgstr "Nascosto" + +#: FSidePanel.class:1143 +msgid "Transparent" +msgstr "Trasparente" + +#: FSpinBar.form:24 +msgid "Test" +msgstr "" + +#: FSwitchButton.form:51 FTestFileChooser.form:81 +msgid "Label1" +msgstr "" + +#: FSwitchButton.form:58 +msgid "Label2" +msgstr "" + +#: FTestBalloon.form:17 +msgid "Ceci est une bulle d'aide" +msgstr "" + +#: FTestColorChooser.form:20 +msgid "Resizable" +msgstr "" + +#: FTestCompletion.form:28 +msgid "Button2" +msgstr "" + +#: FTestDateChooser.form:47 +msgid "Enable" +msgstr "" + +#: FTestExpander.form:16 +msgid "Expander" +msgstr "" + +#: FTestFileChooser.form:28 FTestMenuButton.form:35 +msgid "Menu1" +msgstr "" + +#: FTestFileChooser.form:41 FTestMenuButton.form:69 +msgid "Menu7" +msgstr "" + +#: FTestFileChooser.form:49 FTestMenuButton.form:52 FWiki.form:28 +msgid "Menu4" +msgstr "" + +#: FTestFileChooser.form:54 FTestMenuButton.form:56 FWiki.form:32 +msgid "Menu5" +msgstr "" + +#: FTestFileChooser.form:76 +msgid "Balloon" +msgstr "" + +#: FTestMenuButton.form:31 +msgid "Project" +msgstr "" + +#: FTestMenuButton.form:48 +msgid "View" +msgstr "" + +#: FTestMenuButton.form:60 +msgid "Menu6" +msgstr "" + +#: FTestMenuButton.form:65 +msgid "Tools" +msgstr "" + +#: FTestMenuButton.form:73 +msgid "Menu8" +msgstr "" + +#: FTestMenuButton.form:77 +msgid "Menu9" +msgstr "" + +#: FTestMenuButton.form:80 +msgid "Menu10" +msgstr "" + +#: FTestMenuButton.form:84 +msgid "Menu11" +msgstr "" + +#: FTestMenuButton.form:124 +msgid "Menu button" +msgstr "" + +#: FTestTabPanel.form:41 +msgid "Text" +msgstr "" + +#: FTestTabPanel.form:54 +msgid "Border" +msgstr "" + +#: FTestTabPanel.form:59 +msgid "Orientation" +msgstr "" + +#: FTestToolPanel.form:13 +msgid "Toolbar &0" +msgstr "" + +#: FTestToolPanel.form:15 +msgid "Toolbar &1" +msgstr "" + +#: FTestToolPanel.form:17 +msgid "Toolbar &2" +msgstr "" + +#: FTestValueBox.form:15 +msgid "Hello world!" +msgstr "" + +#: FTestWizard.form:18 +msgid "Étape n°1" +msgstr "" + +#: FTestWizard.form:25 +msgid "Étape n°2" +msgstr "" + +#: FTestWizard.form:29 +msgid "LCDLabel1" +msgstr "" + +#: FTestWizard.form:32 +msgid "Étape n°3" +msgstr "" + +#: FTestWizard.form:34 +msgid "Étape n°4" +msgstr "" + +#: FWizard.class:88 +msgid "&Next" +msgstr "Segue&nte" + +#: FWizard.form:59 MessageView.class:48 +msgid "Next" +msgstr "Prossimo" + +#: FWizard.form:65 +msgid "Previous" +msgstr "Precedente" + +#: FileView.class:1081 +msgid "Cannot rename file." +msgstr "Impossibile rinominare il file." + +#: Form2.form:126 +msgid "ButtonBox2" +msgstr "" + +#: Help.module:71 +msgid "A file or directory name cannot be void." +msgstr "Il nome di un file o di una directory non può essere vuoto." + +#: Help.module:72 +msgid "The '/' character is forbidden inside file or directory names." +msgstr "Nel nome dei file o delle directory è vietato il carattere '/' " + +#: Main.module:52 +msgid "&1 KiB" +msgstr "&1 KiB" + +#: Main.module:54 +msgid "&1 MiB" +msgstr "&1 MiB" + +#: Main.module:56 +msgid "&1 GiB" +msgstr "&1 GiB" + +#: Wizard.class:86 +msgid "Step #&1" +msgstr "Passo #&1" diff --git a/comp/src/gb.form/.lang/ja.po b/comp/src/gb.form/.lang/ja.po new file mode 100644 index 00000000..196178b1 --- /dev/null +++ b/comp/src/gb.form/.lang/ja.po @@ -0,0 +1,712 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.form 3.14.90\n" +"POT-Creation-Date: 2020-06-06 18:08 UTC\n" +"PO-Revision-Date: 2020-06-06 18:09 UTC\n" +"Last-Translator: Benoît Minisini \n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "More controls for graphical components" +msgstr "グラフィカルコンポーネント用の追加コントロール" + +#: CBookmarkList.class:51 +msgid "Home" +msgstr "ホーム" + +#: CBookmarkList.class:53 +msgid "Desktop" +msgstr "デスクトップ" + +#: CBookmarkList.class:55 +msgid "System" +msgstr "システム" + +#: ColorPalette.class:143 +msgid "Last colors" +msgstr "" + +#: ColorPalette.class:244 +msgid "Remove color" +msgstr "" + +#: ColorPalette.class:248 +msgid "Remove all colors" +msgstr "" + +#: ColorPalette.class:252 +msgid "Sort colors" +msgstr "" + +#: DirView.class:531 +msgid "Cannot rename directory." +msgstr "フォルダ名を変更できません。" + +#: DirView.class:562 +msgid "New folder" +msgstr "新しいフォルダ" + +#: DirView.class:581 +msgid "Cannot create directory." +msgstr "フォルダを作成できません。" + +#: FBugFileView.form:32 +msgid "Toggle Fileview Detailed View" +msgstr "" + +#: FBugFileView.form:37 +msgid "Toggle Filechooser Detailed View" +msgstr "" + +#: FCalendar.form:47 +msgid "Today" +msgstr "今日" + +#: FCalendar.form:53 +msgid "Previous month" +msgstr "前月" + +#: FCalendar.form:59 +msgid "Next month" +msgstr "来月" + +#: FCalendar.form:143 +msgid "Apply" +msgstr "" + +#: FColorChooser.form:81 +msgid "Follow color grid" +msgstr "" + +#: FDirChooser.class:428 +msgid "Directory not found." +msgstr "" + +#: FDirChooser.class:534 +msgid "All files (*)" +msgstr "すべてのファイル(*)" + +#: FDirChooser.class:974 +msgid "&Bookmark current directory" +msgstr "" + +#: FDirChooser.class:982 +msgid "&Edit bookmarks..." +msgstr "" + +#: FDirChooser.class:991 +msgid "Show &details" +msgstr "" + +#: FDirChooser.class:997 +msgid "Show &hidden files" +msgstr "" + +#: FDirChooser.class:1003 +msgid "Show &image preview" +msgstr "" + +#: FDirChooser.class:1011 +msgid "&Rename" +msgstr "" + +#: FDirChooser.class:1016 +msgid "Copy" +msgstr "クリップボードにコピーします" + +#: FDirChooser.class:1021 +msgid "&Delete" +msgstr "" + +#: FDirChooser.class:1033 +msgid "&Uncompress file" +msgstr "" + +#: FDirChooser.class:1038 +msgid "&Create directory" +msgstr "" + +#: FDirChooser.class:1043 +msgid "Open in &file manager..." +msgstr "" + +#: FDirChooser.class:1048 +msgid "&Refresh" +msgstr "" + +#: FDirChooser.class:1056 +msgid "&Properties" +msgstr "" + +#: FDirChooser.class:1272 +msgid "Overwrite" +msgstr "" + +#: FDirChooser.class:1272 +msgid "Overwrite all" +msgstr "" + +#: FDirChooser.class:1272 +msgid "This file or directory already exists." +msgstr "" + +#: FDirChooser.class:1291 +msgid "Cannot list archive contents" +msgstr "" + +#: FDirChooser.class:1325 +msgid "Cannot uncompress file." +msgstr "" + +#: FDirChooser.class:1325 +msgid "Unknown archive." +msgstr "" + +#: FDirChooser.class:1386 +msgid "Delete file" +msgstr "" + +#: FDirChooser.class:1387 +msgid "Do you really want to delete that file?" +msgstr "" + +#: FDirChooser.class:1394 +msgid "Unable to delete file." +msgstr "" + +#: FDirChooser.class:1404 +msgid "Delete directory" +msgstr "" + +#: FDirChooser.class:1405 +msgid "Do you really want to delete that directory?" +msgstr "" + +#: FDirChooser.class:1412 +msgid "Unable to delete directory." +msgstr "" + +#: FDirChooser.form:66 +msgid "Parent directory" +msgstr "親フォルダ" + +#: FDirChooser.form:72 +msgid "Root directory" +msgstr "" + +#: FDirChooser.form:133 +msgid "Image preview" +msgstr "" + +#: FDirChooser.form:141 +msgid "Detailed view" +msgstr "" + +#: FDirChooser.form:149 +msgid "File properties" +msgstr "" + +#: FDirChooser.form:155 +msgid "Show files" +msgstr "ファイルを表示" + +#: FDirChooser.form:174 +msgid "Bookmarks" +msgstr "" + +# gb-ignore +#: FDirChooser.form:236 FInputBox.form:45 FWizard.class:76 +msgid "OK" +msgstr "" + +#: FDirChooser.form:242 FEditBookmark.class:119 FInputBox.form:51 +#: FSidePanel.class:1149 FWizard.form:53 +msgid "Cancel" +msgstr "キャンセル" + +#: FDocumentView.form:51 +msgid "Zoom :" +msgstr "" + +#: FDocumentView.form:56 +msgid "Show Shadow" +msgstr "" + +#: FDocumentView.form:66 FTestTabPanel.form:64 +msgid "Padding" +msgstr "" + +#: FDocumentView.form:71 +msgid "Spacing" +msgstr "" + +#: FDocumentView.form:80 +msgid "Scale Mode" +msgstr "" + +#: FDocumentView.form:89 +msgid "Goto :" +msgstr "" + +#: FDocumentView.form:95 +msgid "Column" +msgstr "" + +#: FDocumentView.form:95 +msgid "Fill" +msgstr "" + +#: FDocumentView.form:95 +msgid "Horizontal" +msgstr "" + +#: FDocumentView.form:95 +msgid "None" +msgstr "" + +#: FDocumentView.form:95 +msgid "Row" +msgstr "" + +#: FDocumentView.form:95 +msgid "Vertical" +msgstr "" + +#: FDocumentView.form:96 FMain.form:69 +msgid "ComboBox1" +msgstr "" + +#: FDocumentView.form:101 FMain.form:85 FTestBalloon.form:18 +#: FTestCompletion.form:23 FTestMessageView.form:26 FTestWizard.form:22 +msgid "Button1" +msgstr "" + +#: FDocumentView.form:110 +msgid "Columns" +msgstr "" + +#: FDocumentView.form:120 +msgid "Autocenter" +msgstr "" + +#: FEditBookmark.class:23 FileView.class:138 +msgid "Name" +msgstr "名前" + +#: FEditBookmark.class:24 +msgid "Path" +msgstr "パス" + +#: FEditBookmark.class:119 +msgid "Do you really want to remove this bookmark?" +msgstr "" + +#: FEditBookmark.form:15 +msgid "Edit bookmarks" +msgstr "" + +#: FEditBookmark.form:34 +msgid "Up" +msgstr "上へ" + +#: FEditBookmark.form:40 +msgid "Down" +msgstr "下へ" + +#: FEditBookmark.form:46 FListEditor.class:263 +msgid "Remove" +msgstr "削除" + +#: FEditBookmark.form:57 FFileProperties.form:270 MessageView.class:51 +msgid "Close" +msgstr "閉じる" + +#: FFileProperties.class:117 +msgid "Image" +msgstr "イメージ" + +#: FFileProperties.class:122 +msgid "Audio" +msgstr "" + +#: FFileProperties.class:126 +msgid "Video" +msgstr "ビデオ" + +#: FFileProperties.class:185 +msgid "&1 properties" +msgstr "" + +#: FFileProperties.class:216 Main.module:50 +msgid "&1 B" +msgstr "" + +#: FFileProperties.class:221 +msgid "no file" +msgstr "" + +#: FFileProperties.class:223 +msgid "one file" +msgstr "" + +#: FFileProperties.class:225 +msgid "files" +msgstr "" + +#: FFileProperties.class:229 +msgid "no directory" +msgstr "" + +#: FFileProperties.class:231 +msgid "one directory" +msgstr "" + +#: FFileProperties.class:233 +msgid "directories" +msgstr "" + +#: FFileProperties.form:52 +msgid "General" +msgstr "一般" + +#: FFileProperties.form:81 +msgid "Type" +msgstr "種類" + +#: FFileProperties.form:94 +msgid "Link" +msgstr "" + +#: FFileProperties.form:108 +msgid "Directory" +msgstr "フォルダ" + +#: FFileProperties.form:120 FileView.class:140 +msgid "Size" +msgstr "サイズ" + +#: FFileProperties.form:132 FileView.class:142 +msgid "Last modified" +msgstr "最終更新" + +#: FFileProperties.form:144 +msgid "Permissions" +msgstr "" + +#: FFileProperties.form:157 +msgid "Owner" +msgstr "" + +#: FFileProperties.form:169 +msgid "Group" +msgstr "" + +#: FFileProperties.form:180 +msgid "Preview" +msgstr "プレビュー" + +#: FFileProperties.form:245 +msgid "Errors" +msgstr "エラー" + +# gb-ignore +#: FFontChooser.class:297 +msgid "How quickly daft jumping zebras vex" +msgstr "" + +#: FFontChooser.form:55 +msgid "Bold" +msgstr "ボールド" + +#: FFontChooser.form:62 +msgid "Italic" +msgstr "イタリック" + +#: FFontChooser.form:69 +msgid "Underline" +msgstr "下線" + +#: FFontChooser.form:76 +msgid "Strikeout" +msgstr "取り消し線" + +#: FFontChooser.form:85 +msgid "Relative" +msgstr "" + +#: FIconPanel.form:18 +msgid "Item 0" +msgstr "" + +#: FIconPanel.form:23 +msgid "Toto" +msgstr "" + +#: FIconPanel.form:26 +msgid "Item 1" +msgstr "" + +#: FIconPanel.form:28 +msgid "Item 2" +msgstr "" + +#: FIconPanel.form:35 +msgid "Item 3" +msgstr "" + +#: FLCDLabel.form:15 +msgid "12:34" +msgstr "" + +#: FListEditor.class:262 +msgid "Add" +msgstr "追加" + +#: FListEditor.form:45 +msgid "Add item" +msgstr "" + +#: FListEditor.form:52 +msgid "Remove item" +msgstr "" + +#: FListEditor.form:59 +msgid "Move item up" +msgstr "" + +#: FListEditor.form:66 +msgid "Move item down" +msgstr "" + +#: FMain.form:29 FTestFileChooser.form:31 FTestMenuButton.form:39 FWiki.form:20 +msgid "Menu2" +msgstr "" + +#: FMain.form:33 FTestFileChooser.form:36 FTestMenuButton.form:43 FWiki.form:24 +msgid "Menu3" +msgstr "" + +#: FMain.form:68 +msgid "Élément 1" +msgstr "" + +#: FMain.form:68 +msgid "Élément 2" +msgstr "" + +#: FMain.form:68 +msgid "Élément 3" +msgstr "" + +#: FMain.form:68 +msgid "Élément 4" +msgstr "" + +#: FMain.form:74 +msgid "ComboBox2" +msgstr "" + +#: FMain.form:80 FSwitchButton.form:35 FTestBalloon.form:12 +#: FTestFileChooser.form:86 +msgid "TextBox1" +msgstr "" + +#: FMain.form:90 Form2.form:121 +msgid "MenuButton1" +msgstr "" + +#: FMessage.form:39 +msgid "Do not display this message again" +msgstr "" + +#: FSidePanel.class:1139 +msgid "Hidden" +msgstr "" + +#: FSidePanel.class:1143 +msgid "Transparent" +msgstr "" + +#: FSpinBar.form:24 +msgid "Test" +msgstr "" + +#: FSwitchButton.form:51 FTestFileChooser.form:81 +msgid "Label1" +msgstr "" + +#: FSwitchButton.form:58 +msgid "Label2" +msgstr "" + +#: FTestBalloon.form:17 +msgid "Ceci est une bulle d'aide" +msgstr "" + +#: FTestColorChooser.form:20 +msgid "Resizable" +msgstr "" + +#: FTestCompletion.form:28 +msgid "Button2" +msgstr "" + +#: FTestDateChooser.form:47 +msgid "Enable" +msgstr "" + +#: FTestExpander.form:16 +msgid "Expander" +msgstr "" + +#: FTestFileChooser.form:28 FTestMenuButton.form:35 +msgid "Menu1" +msgstr "" + +#: FTestFileChooser.form:41 FTestMenuButton.form:69 +msgid "Menu7" +msgstr "" + +#: FTestFileChooser.form:49 FTestMenuButton.form:52 FWiki.form:28 +msgid "Menu4" +msgstr "" + +#: FTestFileChooser.form:54 FTestMenuButton.form:56 FWiki.form:32 +msgid "Menu5" +msgstr "" + +#: FTestFileChooser.form:76 +msgid "Balloon" +msgstr "" + +#: FTestMenuButton.form:31 +msgid "Project" +msgstr "" + +#: FTestMenuButton.form:48 +msgid "View" +msgstr "" + +#: FTestMenuButton.form:60 +msgid "Menu6" +msgstr "" + +#: FTestMenuButton.form:65 +msgid "Tools" +msgstr "" + +#: FTestMenuButton.form:73 +msgid "Menu8" +msgstr "" + +#: FTestMenuButton.form:77 +msgid "Menu9" +msgstr "" + +#: FTestMenuButton.form:80 +msgid "Menu10" +msgstr "" + +#: FTestMenuButton.form:84 +msgid "Menu11" +msgstr "" + +#: FTestMenuButton.form:124 +msgid "Menu button" +msgstr "" + +#: FTestTabPanel.form:41 +msgid "Text" +msgstr "" + +#: FTestTabPanel.form:54 +msgid "Border" +msgstr "" + +#: FTestTabPanel.form:59 +msgid "Orientation" +msgstr "" + +#: FTestToolPanel.form:13 +msgid "Toolbar &0" +msgstr "" + +#: FTestToolPanel.form:15 +msgid "Toolbar &1" +msgstr "" + +#: FTestToolPanel.form:17 +msgid "Toolbar &2" +msgstr "" + +#: FTestValueBox.form:15 +msgid "Hello world!" +msgstr "" + +#: FTestWizard.form:18 +msgid "Étape n°1" +msgstr "" + +#: FTestWizard.form:25 +msgid "Étape n°2" +msgstr "" + +#: FTestWizard.form:29 +msgid "LCDLabel1" +msgstr "" + +#: FTestWizard.form:32 +msgid "Étape n°3" +msgstr "" + +#: FTestWizard.form:34 +msgid "Étape n°4" +msgstr "" + +#: FWizard.class:88 +msgid "&Next" +msgstr "次へ(&N)" + +#: FWizard.form:59 MessageView.class:48 +msgid "Next" +msgstr "次へ(N)" + +#: FWizard.form:65 +msgid "Previous" +msgstr "前へ(P)" + +#: FileView.class:1081 +msgid "Cannot rename file." +msgstr "" + +#: Form2.form:126 +msgid "ButtonBox2" +msgstr "" + +#: Help.module:71 +msgid "A file or directory name cannot be void." +msgstr "" + +#: Help.module:72 +msgid "The '/' character is forbidden inside file or directory names." +msgstr "" + +#: Main.module:52 +msgid "&1 KiB" +msgstr "" + +#: Main.module:54 +msgid "&1 MiB" +msgstr "" + +#: Main.module:56 +msgid "&1 GiB" +msgstr "" + +#: Wizard.class:86 +msgid "Step #&1" +msgstr "ステップ #&1" diff --git a/comp/src/gb.form/.lang/nl.po b/comp/src/gb.form/.lang/nl.po new file mode 100644 index 00000000..ada6e2df --- /dev/null +++ b/comp/src/gb.form/.lang/nl.po @@ -0,0 +1,719 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.form 3.14.90\n" +"POT-Creation-Date: 2020-06-06 18:08 UTC\n" +"PO-Revision-Date: 2020-06-06 18:04 UTC\n" +"Last-Translator: Benoît Minisini \n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "More controls for graphical components" +msgstr "Meer controls voor grafische componenten" + +# gb-ignore +#: CBookmarkList.class:51 +msgid "Home" +msgstr "" + +# gb-ignore +#: CBookmarkList.class:53 +msgid "Desktop" +msgstr "" + +#: CBookmarkList.class:55 +msgid "System" +msgstr "Syteem" + +#: ColorPalette.class:143 +msgid "Last colors" +msgstr "Laatste kleuren" + +#: ColorPalette.class:244 +msgid "Remove color" +msgstr "Verwijder kleur" + +#: ColorPalette.class:248 +msgid "Remove all colors" +msgstr "Verwijder alle kleuren" + +#: ColorPalette.class:252 +msgid "Sort colors" +msgstr "Kleuren sorteren" + +#: DirView.class:531 +msgid "Cannot rename directory." +msgstr "Kan folder niet hernoemen" + +#: DirView.class:562 +msgid "New folder" +msgstr "Nieuwe folder" + +#: DirView.class:581 +msgid "Cannot create directory." +msgstr "Kan folder niet creeëren" + +#: FBugFileView.form:32 +msgid "Toggle Fileview Detailed View" +msgstr "" + +#: FBugFileView.form:37 +msgid "Toggle Filechooser Detailed View" +msgstr "" + +#: FCalendar.form:47 +msgid "Today" +msgstr "Vandaag" + +#: FCalendar.form:53 +msgid "Previous month" +msgstr "Vorige maand" + +#: FCalendar.form:59 +msgid "Next month" +msgstr "Volgende maand" + +#: FCalendar.form:143 +msgid "Apply" +msgstr "Toepassen" + +#: FColorChooser.form:81 +msgid "Follow color grid" +msgstr "Volg kleurenrooster" + +#: FDirChooser.class:428 +msgid "Directory not found." +msgstr "Folder niet gevonden" + +#: FDirChooser.class:534 +msgid "All files (*)" +msgstr "Alle bestanden (*)" + +#: FDirChooser.class:974 +msgid "&Bookmark current directory" +msgstr "&Huidige folder als bladwijzer" + +#: FDirChooser.class:982 +msgid "&Edit bookmarks..." +msgstr "&Bladwijzers bewerken" + +#: FDirChooser.class:991 +msgid "Show &details" +msgstr "Details &weergeven" + +#: FDirChooser.class:997 +msgid "Show &hidden files" +msgstr "Verbor&gen bestanden weergeven" + +#: FDirChooser.class:1003 +msgid "Show &image preview" +msgstr "&Afbeeldingsvoorbeeld weergeven" + +#: FDirChooser.class:1011 +msgid "&Rename" +msgstr "&Hernoem" + +#: FDirChooser.class:1016 +msgid "Copy" +msgstr "Kopiëren" + +#: FDirChooser.class:1021 +msgid "&Delete" +msgstr "&Verwijder" + +#: FDirChooser.class:1033 +msgid "&Uncompress file" +msgstr "Bestand &decomprimeren" + +#: FDirChooser.class:1038 +msgid "&Create directory" +msgstr "&Creeëer folder" + +#: FDirChooser.class:1043 +msgid "Open in &file manager..." +msgstr "Openen in bes&tandsbeheer..." + +#: FDirChooser.class:1048 +msgid "&Refresh" +msgstr "Ve&rvers" + +#: FDirChooser.class:1056 +msgid "&Properties" +msgstr "&Eigenschappen" + +#: FDirChooser.class:1272 +msgid "Overwrite" +msgstr "Overschrijven" + +#: FDirChooser.class:1272 +msgid "Overwrite all" +msgstr "Alles overschrijven" + +#: FDirChooser.class:1272 +msgid "This file or directory already exists." +msgstr "Dit bestand of deze folder bestaat reeds." + +#: FDirChooser.class:1291 +msgid "Cannot list archive contents" +msgstr "Kan archiefinhoud niet weergeven" + +#: FDirChooser.class:1325 +msgid "Cannot uncompress file." +msgstr "Kan bestand niet decomprimeren" + +#: FDirChooser.class:1325 +msgid "Unknown archive." +msgstr "Onbekend archief" + +#: FDirChooser.class:1386 +msgid "Delete file" +msgstr "Bestand verwijderen" + +#: FDirChooser.class:1387 +msgid "Do you really want to delete that file?" +msgstr "Weet je zeker dat je dit bestand wil verwijderen?" + +#: FDirChooser.class:1394 +msgid "Unable to delete file." +msgstr "Kan bestand niet verwijderen" + +#: FDirChooser.class:1404 +msgid "Delete directory" +msgstr "Folder verwijderen" + +#: FDirChooser.class:1405 +msgid "Do you really want to delete that directory?" +msgstr "Weet je zeker dat je deze folder wil verwijderen?" + +#: FDirChooser.class:1412 +msgid "Unable to delete directory." +msgstr "Kan folder niet verwijderen." + +#: FDirChooser.form:66 +msgid "Parent directory" +msgstr "Bovenliggende folder" + +#: FDirChooser.form:72 +msgid "Root directory" +msgstr "Root folder" + +#: FDirChooser.form:133 +msgid "Image preview" +msgstr "Afbeeldingsvoorbeeld" + +#: FDirChooser.form:141 +msgid "Detailed view" +msgstr "Gedetaileerde weergave" + +#: FDirChooser.form:149 +msgid "File properties" +msgstr "Betstandseigenschappen" + +#: FDirChooser.form:155 +msgid "Show files" +msgstr "Bestanden weergeven" + +#: FDirChooser.form:174 +msgid "Bookmarks" +msgstr "Bladwijzers" + +# gb-ignore +#: FDirChooser.form:236 FInputBox.form:45 FWizard.class:76 +msgid "OK" +msgstr "" + +#: FDirChooser.form:242 FEditBookmark.class:119 FInputBox.form:51 +#: FSidePanel.class:1149 FWizard.form:53 +msgid "Cancel" +msgstr "Annuleren" + +#: FDocumentView.form:51 +msgid "Zoom :" +msgstr "" + +#: FDocumentView.form:56 +msgid "Show Shadow" +msgstr "" + +#: FDocumentView.form:66 FTestTabPanel.form:64 +msgid "Padding" +msgstr "" + +#: FDocumentView.form:71 +msgid "Spacing" +msgstr "" + +#: FDocumentView.form:80 +msgid "Scale Mode" +msgstr "" + +#: FDocumentView.form:89 +msgid "Goto :" +msgstr "" + +#: FDocumentView.form:95 +msgid "Column" +msgstr "" + +#: FDocumentView.form:95 +msgid "Fill" +msgstr "" + +#: FDocumentView.form:95 +msgid "Horizontal" +msgstr "" + +#: FDocumentView.form:95 +msgid "None" +msgstr "" + +#: FDocumentView.form:95 +msgid "Row" +msgstr "" + +#: FDocumentView.form:95 +msgid "Vertical" +msgstr "" + +# gb-ignore +#: FDocumentView.form:96 FMain.form:69 +msgid "ComboBox1" +msgstr "" + +#: FDocumentView.form:101 FMain.form:85 FTestBalloon.form:18 +#: FTestCompletion.form:23 FTestMessageView.form:26 FTestWizard.form:22 +msgid "Button1" +msgstr "" + +#: FDocumentView.form:110 +msgid "Columns" +msgstr "" + +#: FDocumentView.form:120 +msgid "Autocenter" +msgstr "" + +#: FEditBookmark.class:23 FileView.class:138 +msgid "Name" +msgstr "Naam" + +#: FEditBookmark.class:24 +msgid "Path" +msgstr "Pad" + +#: FEditBookmark.class:119 +msgid "Do you really want to remove this bookmark?" +msgstr "Weet je zeker dat je deze bladwijzer wil verwijderen?" + +#: FEditBookmark.form:15 +msgid "Edit bookmarks" +msgstr "Bladwijzers bewerken" + +#: FEditBookmark.form:34 +msgid "Up" +msgstr "Omhoog" + +#: FEditBookmark.form:40 +msgid "Down" +msgstr "Naar beneden" + +#: FEditBookmark.form:46 FListEditor.class:263 +msgid "Remove" +msgstr "Verwijderen" + +#: FEditBookmark.form:57 FFileProperties.form:270 MessageView.class:51 +msgid "Close" +msgstr "Sluiten" + +#: FFileProperties.class:117 +msgid "Image" +msgstr "Afbeelding" + +# gb-ignore +#: FFileProperties.class:122 +msgid "Audio" +msgstr "" + +# gb-ignore +#: FFileProperties.class:126 +msgid "Video" +msgstr "" + +#: FFileProperties.class:185 +msgid "&1 properties" +msgstr "&1 eigenschappen" + +#: FFileProperties.class:216 Main.module:50 +msgid "&1 B" +msgstr "&1 B" + +#: FFileProperties.class:221 +msgid "no file" +msgstr "geen bestand" + +#: FFileProperties.class:223 +msgid "one file" +msgstr "een bestand" + +#: FFileProperties.class:225 +msgid "files" +msgstr "bestanden" + +#: FFileProperties.class:229 +msgid "no directory" +msgstr "geen folder" + +#: FFileProperties.class:231 +msgid "one directory" +msgstr "een folder" + +#: FFileProperties.class:233 +msgid "directories" +msgstr "folders" + +#: FFileProperties.form:52 +msgid "General" +msgstr "Algemeen" + +# gb-ignore +#: FFileProperties.form:81 +msgid "Type" +msgstr "" + +# gb-ignore +#: FFileProperties.form:94 +msgid "Link" +msgstr "" + +#: FFileProperties.form:108 +msgid "Directory" +msgstr "Folder" + +#: FFileProperties.form:120 FileView.class:140 +msgid "Size" +msgstr "Formaat" + +#: FFileProperties.form:132 FileView.class:142 +msgid "Last modified" +msgstr "Laatste wijziging" + +#: FFileProperties.form:144 +msgid "Permissions" +msgstr "Toestemmingen" + +#: FFileProperties.form:157 +msgid "Owner" +msgstr "Eigenaar" + +#: FFileProperties.form:169 +msgid "Group" +msgstr "Groep" + +#: FFileProperties.form:180 +msgid "Preview" +msgstr "Voorbeeld" + +#: FFileProperties.form:245 +msgid "Errors" +msgstr "Fouten" + +# gb-ignore +#: FFontChooser.class:297 +msgid "How quickly daft jumping zebras vex" +msgstr "" + +#: FFontChooser.form:55 +msgid "Bold" +msgstr "Vet" + +#: FFontChooser.form:62 +msgid "Italic" +msgstr "Schuin" + +#: FFontChooser.form:69 +msgid "Underline" +msgstr "Onderlijn" + +#: FFontChooser.form:76 +msgid "Strikeout" +msgstr "Doorstrepen" + +#: FFontChooser.form:85 +msgid "Relative" +msgstr "Relatief" + +#: FIconPanel.form:18 +msgid "Item 0" +msgstr "" + +#: FIconPanel.form:23 +msgid "Toto" +msgstr "" + +#: FIconPanel.form:26 +msgid "Item 1" +msgstr "" + +#: FIconPanel.form:28 +msgid "Item 2" +msgstr "" + +#: FIconPanel.form:35 +msgid "Item 3" +msgstr "" + +#: FLCDLabel.form:15 +msgid "12:34" +msgstr "" + +#: FListEditor.class:262 +msgid "Add" +msgstr "Toevoegen" + +#: FListEditor.form:45 +msgid "Add item" +msgstr "Item toevoegen" + +#: FListEditor.form:52 +msgid "Remove item" +msgstr "Verwijder item" + +#: FListEditor.form:59 +msgid "Move item up" +msgstr "Verplaats item naar boven" + +#: FListEditor.form:66 +msgid "Move item down" +msgstr "Verplaats item naar beneden" + +#: FMain.form:29 FTestFileChooser.form:31 FTestMenuButton.form:39 FWiki.form:20 +msgid "Menu2" +msgstr "" + +#: FMain.form:33 FTestFileChooser.form:36 FTestMenuButton.form:43 FWiki.form:24 +msgid "Menu3" +msgstr "" + +#: FMain.form:68 +msgid "Élément 1" +msgstr "" + +#: FMain.form:68 +msgid "Élément 2" +msgstr "" + +#: FMain.form:68 +msgid "Élément 3" +msgstr "" + +#: FMain.form:68 +msgid "Élément 4" +msgstr "" + +#: FMain.form:74 +msgid "ComboBox2" +msgstr "" + +#: FMain.form:80 FSwitchButton.form:35 FTestBalloon.form:12 +#: FTestFileChooser.form:86 +msgid "TextBox1" +msgstr "" + +#: FMain.form:90 Form2.form:121 +msgid "MenuButton1" +msgstr "" + +#: FMessage.form:39 +msgid "Do not display this message again" +msgstr "Dit bericht niet meer weergeven" + +#: FSidePanel.class:1139 +msgid "Hidden" +msgstr "Verborgen" + +#: FSidePanel.class:1143 +msgid "Transparent" +msgstr "Transparant" + +#: FSpinBar.form:24 +msgid "Test" +msgstr "" + +#: FSwitchButton.form:51 FTestFileChooser.form:81 +msgid "Label1" +msgstr "" + +#: FSwitchButton.form:58 +msgid "Label2" +msgstr "" + +#: FTestBalloon.form:17 +msgid "Ceci est une bulle d'aide" +msgstr "" + +#: FTestColorChooser.form:20 +msgid "Resizable" +msgstr "" + +#: FTestCompletion.form:28 +msgid "Button2" +msgstr "" + +#: FTestDateChooser.form:47 +msgid "Enable" +msgstr "" + +#: FTestExpander.form:16 +msgid "Expander" +msgstr "" + +#: FTestFileChooser.form:28 FTestMenuButton.form:35 +msgid "Menu1" +msgstr "" + +#: FTestFileChooser.form:41 FTestMenuButton.form:69 +msgid "Menu7" +msgstr "" + +#: FTestFileChooser.form:49 FTestMenuButton.form:52 FWiki.form:28 +msgid "Menu4" +msgstr "" + +#: FTestFileChooser.form:54 FTestMenuButton.form:56 FWiki.form:32 +msgid "Menu5" +msgstr "" + +#: FTestFileChooser.form:76 +msgid "Balloon" +msgstr "" + +#: FTestMenuButton.form:31 +msgid "Project" +msgstr "" + +#: FTestMenuButton.form:48 +msgid "View" +msgstr "" + +#: FTestMenuButton.form:60 +msgid "Menu6" +msgstr "" + +#: FTestMenuButton.form:65 +msgid "Tools" +msgstr "" + +#: FTestMenuButton.form:73 +msgid "Menu8" +msgstr "" + +#: FTestMenuButton.form:77 +msgid "Menu9" +msgstr "" + +#: FTestMenuButton.form:80 +msgid "Menu10" +msgstr "" + +#: FTestMenuButton.form:84 +msgid "Menu11" +msgstr "" + +#: FTestMenuButton.form:124 +msgid "Menu button" +msgstr "" + +#: FTestTabPanel.form:41 +msgid "Text" +msgstr "" + +#: FTestTabPanel.form:54 +msgid "Border" +msgstr "" + +#: FTestTabPanel.form:59 +msgid "Orientation" +msgstr "" + +#: FTestToolPanel.form:13 +msgid "Toolbar &0" +msgstr "" + +#: FTestToolPanel.form:15 +msgid "Toolbar &1" +msgstr "" + +#: FTestToolPanel.form:17 +msgid "Toolbar &2" +msgstr "" + +#: FTestValueBox.form:15 +msgid "Hello world!" +msgstr "" + +#: FTestWizard.form:18 +msgid "Étape n°1" +msgstr "" + +#: FTestWizard.form:25 +msgid "Étape n°2" +msgstr "" + +#: FTestWizard.form:29 +msgid "LCDLabel1" +msgstr "" + +#: FTestWizard.form:32 +msgid "Étape n°3" +msgstr "" + +#: FTestWizard.form:34 +msgid "Étape n°4" +msgstr "" + +#: FWizard.class:88 +msgid "&Next" +msgstr "V&olgende" + +#: FWizard.form:59 MessageView.class:48 +msgid "Next" +msgstr "Volgende" + +#: FWizard.form:65 +msgid "Previous" +msgstr "Vorige" + +#: FileView.class:1081 +msgid "Cannot rename file." +msgstr "Kan bestand niet hernoemen" + +#: Form2.form:126 +msgid "ButtonBox2" +msgstr "" + +#: Help.module:71 +msgid "A file or directory name cannot be void." +msgstr "Een bestand of foldernaamkan niet leeg zijn." + +#: Help.module:72 +msgid "The '/' character is forbidden inside file or directory names." +msgstr "Het '/' caracter is verboden in bestands- of foldernamen." + +#: Main.module:52 +msgid "&1 KiB" +msgstr "&1 KiB" + +#: Main.module:54 +msgid "&1 MiB" +msgstr "&1 MiB" + +#: Main.module:56 +msgid "&1 GiB" +msgstr "&1 GiB" + +#: Wizard.class:86 +msgid "Step #&1" +msgstr "Stap #&1" diff --git a/comp/src/gb.form/.lang/pt_BR.po b/comp/src/gb.form/.lang/pt_BR.po new file mode 100644 index 00000000..31ac7ada --- /dev/null +++ b/comp/src/gb.form/.lang/pt_BR.po @@ -0,0 +1,441 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.form 3.14.90\n" +"PO-Revision-Date: 2020-06-12 00:26 UTC\n" +"Last-Translator: Gen Braga \n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "More controls for graphical components" +msgstr "Mais controles para componentes gráficos" + +#: CBookmarkList.class:51 +msgid "Home" +msgstr "Início" + +#: CBookmarkList.class:53 +msgid "Desktop" +msgstr "Área de trabalho" + +#: CBookmarkList.class:55 +msgid "System" +msgstr "Sistema" + +#: ColorPalette.class:143 +msgid "Last colors" +msgstr "Últimas cores" + +#: ColorPalette.class:244 +msgid "Remove color" +msgstr "Remover cor" + +#: ColorPalette.class:248 +msgid "Remove all colors" +msgstr "Remover todas as cores" + +#: ColorPalette.class:252 +msgid "Sort colors" +msgstr "Ordenar cores" + +#: DirView.class:535 +msgid "Cannot rename directory." +msgstr "Não foi possível renomear o diretório." + +#: DirView.class:566 +msgid "New folder" +msgstr "Nova pasta" + +#: DirView.class:585 +msgid "Cannot create directory." +msgstr "Não foi possível criar o diretório." + +#: FCalendar.form:47 +msgid "Today" +msgstr "Hoje" + +#: FCalendar.form:53 +msgid "Previous month" +msgstr "Mês anterior" + +#: FCalendar.form:59 +msgid "Next month" +msgstr "Próximo mês" + +#: FCalendar.form:143 +msgid "Apply" +msgstr "Aplicar" + +#: FColorChooser.form:81 +msgid "Follow color grid" +msgstr "Seguir cor da grade" + +#: FDirChooser.class:428 +msgid "Directory not found." +msgstr "Diretório não encontrado." + +#: FDirChooser.class:534 +msgid "All files (*)" +msgstr "Todos os arquivos (*)" + +#: FDirChooser.class:974 +msgid "&Bookmark current directory" +msgstr "&Diretório corrente como favorito" + +#: FDirChooser.class:982 +msgid "&Edit bookmarks..." +msgstr "&Editar favoritos..." + +#: FDirChooser.class:991 +msgid "Show &details" +msgstr "Exibir &detalhes" + +#: FDirChooser.class:997 +msgid "Show &hidden files" +msgstr "Exibir arquivos &ocultos" + +#: FDirChooser.class:1003 +msgid "Show &image preview" +msgstr "Exibir visualização de &imagem" + +#: FDirChooser.class:1011 +msgid "&Rename" +msgstr "&Renomear" + +#: FDirChooser.class:1016 +msgid "Copy" +msgstr "Copiar" + +#: FDirChooser.class:1021 +msgid "&Delete" +msgstr "&Excluir" + +#: FDirChooser.class:1033 +msgid "&Uncompress file" +msgstr "&Descomprimir arquivo" + +#: FDirChooser.class:1038 +msgid "&Create directory" +msgstr "&Criar diretório" + +#: FDirChooser.class:1043 +msgid "Open in &file manager..." +msgstr "Abrir no gerenciador de &arquivos" + +#: FDirChooser.class:1048 +msgid "&Refresh" +msgstr "&Atualizar" + +#: FDirChooser.class:1056 +msgid "&Properties" +msgstr "&Propriedades" + +#: FDirChooser.class:1272 +msgid "Overwrite" +msgstr "Sobrescrever" + +#: FDirChooser.class:1272 +msgid "Overwrite all" +msgstr "Sobrescrever tudo" + +#: FDirChooser.class:1272 +msgid "This file or directory already exists." +msgstr "Este arquivo ou diretório já existe." + +#: FDirChooser.class:1291 +msgid "Cannot list archive contents" +msgstr "Não foi possível listar o conteúdo do arquivo" + +#: FDirChooser.class:1325 +msgid "Cannot uncompress file." +msgstr "Não foi possível descomprimir o arquivo." + +#: FDirChooser.class:1325 +msgid "Unknown archive." +msgstr "Arquivo desconhecido." + +#: FDirChooser.class:1386 +msgid "Delete file" +msgstr "Excluir arquivo" + +#: FDirChooser.class:1387 +msgid "Do you really want to delete that file?" +msgstr "Você realmente deseja excluir aquele arquivo?" + +#: FDirChooser.class:1394 +msgid "Unable to delete file." +msgstr "Não foi possível excluir o arquivo." + +#: FDirChooser.class:1404 +msgid "Delete directory" +msgstr "Excluir diretório" + +#: FDirChooser.class:1405 +msgid "Do you really want to delete that directory?" +msgstr "Você realmente deseja excluir aquele diretório?" + +#: FDirChooser.class:1412 +msgid "Unable to delete directory." +msgstr "Não foi possível excluir o diretório." + +#: FDirChooser.form:66 +msgid "Parent directory" +msgstr "Diretório pai" + +#: FDirChooser.form:72 +msgid "Root directory" +msgstr "Diretório raiz" + +#: FDirChooser.form:133 +msgid "Image preview" +msgstr "Pré-visualização de imagem" + +#: FDirChooser.form:141 +msgid "Detailed view" +msgstr "Visão detalhada" + +#: FDirChooser.form:149 +msgid "File properties" +msgstr "Propriedades do arquivo" + +#: FDirChooser.form:155 +msgid "Show files" +msgstr "Exibir arquivos" + +#: FDirChooser.form:174 +msgid "Bookmarks" +msgstr "Favoritos" + +#: FDirChooser.form:236 FInputBox.form:45 FWizard.class:76 +msgid "OK" +msgstr "OK" + +#: FDirChooser.form:242 FEditBookmark.class:119 FInputBox.form:51 FSidePanel.class:1149 FWizard.form:53 +msgid "Cancel" +msgstr "Cancelar" + +#: FEditBookmark.class:23 FileView.class:140 +msgid "Name" +msgstr "Nome" + +#: FEditBookmark.class:24 +msgid "Path" +msgstr "Caminho" + +#: FEditBookmark.class:119 +msgid "Do you really want to remove this bookmark?" +msgstr "Você realmente deseja excluir esse favorito?" + +#: FEditBookmark.form:15 +msgid "Edit bookmarks" +msgstr "Editar favoritos" + +#: FEditBookmark.form:34 +msgid "Up" +msgstr "Para cima" + +#: FEditBookmark.form:40 +msgid "Down" +msgstr "Para baixo" + +#: FEditBookmark.form:46 FListEditor.class:263 +msgid "Remove" +msgstr "Remover" + +#: FEditBookmark.form:57 FFileProperties.form:270 MessageView.class:51 +msgid "Close" +msgstr "Fechar" + +#: FFileProperties.class:117 +msgid "Image" +msgstr "Imagem" + +#: FFileProperties.class:122 +msgid "Audio" +msgstr "Audio" + +#: FFileProperties.class:126 +msgid "Video" +msgstr "Vídeo" + +#: FFileProperties.class:185 +msgid "&1 properties" +msgstr "&1 propriedades" + +# gb-ignore +#: FFileProperties.class:216 Main.module:50 +msgid "&1 B" +msgstr "" + +#: FFileProperties.class:221 +msgid "no file" +msgstr "nenhum arquivo" + +#: FFileProperties.class:223 +msgid "one file" +msgstr "um arquivo" + +#: FFileProperties.class:225 +msgid "files" +msgstr "arquivos" + +#: FFileProperties.class:229 +msgid "no directory" +msgstr "nenhum diretório" + +#: FFileProperties.class:231 +msgid "one directory" +msgstr "um diretório" + +#: FFileProperties.class:233 +msgid "directories" +msgstr "diretórios" + +#: FFileProperties.form:52 +msgid "General" +msgstr "Geral" + +#: FFileProperties.form:81 +msgid "Type" +msgstr "Tipo" + +# gb-ignore +#: FFileProperties.form:94 +msgid "Link" +msgstr "" + +#: FFileProperties.form:108 +msgid "Directory" +msgstr "Diretório" + +#: FFileProperties.form:120 FileView.class:142 +msgid "Size" +msgstr "Tamanho" + +#: FFileProperties.form:132 FileView.class:144 +msgid "Last modified" +msgstr "Última modificação" + +#: FFileProperties.form:144 +msgid "Permissions" +msgstr "Permissões" + +#: FFileProperties.form:157 +msgid "Owner" +msgstr "Proprietário" + +#: FFileProperties.form:169 +msgid "Group" +msgstr "Grupo" + +#: FFileProperties.form:180 +msgid "Preview" +msgstr "Visualização" + +#: FFileProperties.form:245 +msgid "Errors" +msgstr "Erros" + +# gb-ignore +#: FFontChooser.class:297 +msgid "How quickly daft jumping zebras vex" +msgstr "" + +#: FFontChooser.form:55 +msgid "Bold" +msgstr "Negrito" + +#: FFontChooser.form:62 +msgid "Italic" +msgstr "Itálico" + +#: FFontChooser.form:69 +msgid "Underline" +msgstr "Sublinhado" + +#: FFontChooser.form:76 +msgid "Strikeout" +msgstr "Tachado" + +#: FFontChooser.form:85 +msgid "Relative" +msgstr "Relativo" + +#: FListEditor.class:262 +msgid "Add" +msgstr "Adicionar" + +#: FListEditor.form:45 +msgid "Add item" +msgstr "Adicionar item" + +#: FListEditor.form:52 +msgid "Remove item" +msgstr "Remover item" + +#: FListEditor.form:59 +msgid "Move item up" +msgstr "Mover item para cima" + +#: FListEditor.form:66 +msgid "Move item down" +msgstr "Mover item para baixo" + +#: FMessage.form:39 +msgid "Do not display this message again" +msgstr "Não exibir essa mensagem novamente" + +#: FSidePanel.class:1139 +msgid "Hidden" +msgstr "Oculto" + +#: FSidePanel.class:1143 +msgid "Transparent" +msgstr "Transparente" + +#: FWizard.class:88 +msgid "&Next" +msgstr "&Próximo" + +#: FWizard.form:59 MessageView.class:48 +msgid "Next" +msgstr "Próximo" + +#: FWizard.form:65 +msgid "Previous" +msgstr "Anterior" + +#: FileView.class:1114 +msgid "Cannot rename file." +msgstr "Não foi possível renomear o arquivo." + +#: Help.module:71 +msgid "A file or directory name cannot be void." +msgstr "O nome de um arquivo ou diretório não pode ser nulo." + +#: Help.module:72 +msgid "The '/' character is forbidden inside file or directory names." +msgstr "O caractere '/' é proibido em nome de arquivos ou diretórios." + +# gb-ignore +#: Main.module:52 +msgid "&1 KiB" +msgstr "" + +# gb-ignore +#: Main.module:54 +msgid "&1 MiB" +msgstr "" + +# gb-ignore +#: Main.module:56 +msgid "&1 GiB" +msgstr "" + +#: Wizard.class:86 +msgid "Step #&1" +msgstr "Passo #&1" + diff --git a/comp/src/gb.form/.lang/ru.po b/comp/src/gb.form/.lang/ru.po new file mode 100644 index 00000000..29aa6bb7 --- /dev/null +++ b/comp/src/gb.form/.lang/ru.po @@ -0,0 +1,722 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.form 3.14.90\n" +"POT-Creation-Date: 2020-06-06 18:08 UTC\n" +"PO-Revision-Date: 2020-06-06 18:05 UTC\n" +"Last-Translator: Benoît Minisini \n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "More controls for graphical components" +msgstr "Больше элементов управления для графических компонентов" + +#: CBookmarkList.class:51 +msgid "Home" +msgstr "Дом" + +#: CBookmarkList.class:53 +msgid "Desktop" +msgstr "Рабочий стол" + +#: CBookmarkList.class:55 +msgid "System" +msgstr "Система" + +#: ColorPalette.class:143 +msgid "Last colors" +msgstr "Последние цвета" + +#: ColorPalette.class:244 +msgid "Remove color" +msgstr "Удалить цвет" + +#: ColorPalette.class:248 +msgid "Remove all colors" +msgstr "Удалить все цвета" + +#: ColorPalette.class:252 +msgid "Sort colors" +msgstr "Сортировать цвета" + +#: DirView.class:531 +msgid "Cannot rename directory." +msgstr "Невозможно переименовать директорию." + +#: DirView.class:562 +msgid "New folder" +msgstr "Новая директория" + +#: DirView.class:581 +msgid "Cannot create directory." +msgstr "Невозможно создать директорию." + +#: FBugFileView.form:32 +msgid "Toggle Fileview Detailed View" +msgstr "" + +#: FBugFileView.form:37 +msgid "Toggle Filechooser Detailed View" +msgstr "" + +#: FCalendar.form:47 +msgid "Today" +msgstr "Сегодня" + +#: FCalendar.form:53 +msgid "Previous month" +msgstr "Прошлый месяц" + +#: FCalendar.form:59 +msgid "Next month" +msgstr "Следующий месяц" + +#: FCalendar.form:143 +msgid "Apply" +msgstr "Применить" + +#: FColorChooser.form:81 +msgid "Follow color grid" +msgstr "Следовать цветовой сетке" + +#: FDirChooser.class:428 +msgid "Directory not found." +msgstr "Директория не найдена." + +#: FDirChooser.class:534 +msgid "All files (*)" +msgstr "Все файлы (*)" + +#: FDirChooser.class:974 +msgid "&Bookmark current directory" +msgstr "Добавить текущую директорию в закладки" + +#: FDirChooser.class:982 +msgid "&Edit bookmarks..." +msgstr "Редактировать закладки..." + +#: FDirChooser.class:991 +msgid "Show &details" +msgstr "Показать детали" + +#: FDirChooser.class:997 +msgid "Show &hidden files" +msgstr "Показать скрытые файлы" + +#: FDirChooser.class:1003 +msgid "Show &image preview" +msgstr "Показать предпросмотр изображения" + +#: FDirChooser.class:1011 +msgid "&Rename" +msgstr "Переименовать" + +#: FDirChooser.class:1016 +msgid "Copy" +msgstr "Копировать" + +#: FDirChooser.class:1021 +msgid "&Delete" +msgstr "Удалить" + +#: FDirChooser.class:1033 +msgid "&Uncompress file" +msgstr "Распаковка файла" + +#: FDirChooser.class:1038 +msgid "&Create directory" +msgstr "Создать директорию" + +#: FDirChooser.class:1043 +msgid "Open in &file manager..." +msgstr "Открыть в файловом менеджере..." + +#: FDirChooser.class:1048 +msgid "&Refresh" +msgstr "Освежить" + +#: FDirChooser.class:1056 +msgid "&Properties" +msgstr "Свойства" + +#: FDirChooser.class:1272 +msgid "Overwrite" +msgstr "Перезаписать" + +#: FDirChooser.class:1272 +msgid "Overwrite all" +msgstr "Перезаписать все" + +#: FDirChooser.class:1272 +msgid "This file or directory already exists." +msgstr "Этот файл или директория уже существует." + +#: FDirChooser.class:1291 +msgid "Cannot list archive contents" +msgstr "Невозможно перечислить содержимое архива" + +#: FDirChooser.class:1325 +msgid "Cannot uncompress file." +msgstr "Невозможно распаковать файл." + +#: FDirChooser.class:1325 +msgid "Unknown archive." +msgstr "Неизвестный архив." + +#: FDirChooser.class:1386 +msgid "Delete file" +msgstr "Удалить файл" + +#: FDirChooser.class:1387 +msgid "Do you really want to delete that file?" +msgstr "Вы действительно хотите удалить этот файл?" + +#: FDirChooser.class:1394 +msgid "Unable to delete file." +msgstr "Невозможно удалить файл." + +#: FDirChooser.class:1404 +msgid "Delete directory" +msgstr "Удалить директорию" + +#: FDirChooser.class:1405 +msgid "Do you really want to delete that directory?" +msgstr "Вы действительно хотите удалить эту директорию?" + +#: FDirChooser.class:1412 +msgid "Unable to delete directory." +msgstr "Невозможно удалить директорию." + +#: FDirChooser.form:66 +msgid "Parent directory" +msgstr "Родительская директория" + +#: FDirChooser.form:72 +msgid "Root directory" +msgstr "Корневая директория" + +#: FDirChooser.form:133 +msgid "Image preview" +msgstr "Предпросмотр изображения" + +#: FDirChooser.form:141 +msgid "Detailed view" +msgstr "Детальный вид" + +#: FDirChooser.form:149 +msgid "File properties" +msgstr "Свойства файла" + +#: FDirChooser.form:155 +msgid "Show files" +msgstr "Показать файлы" + +#: FDirChooser.form:174 +msgid "Bookmarks" +msgstr "Закладки" + +#: FDirChooser.form:236 FInputBox.form:45 FWizard.class:76 +msgid "OK" +msgstr "ОК" + +#: FDirChooser.form:242 FEditBookmark.class:119 FInputBox.form:51 +#: FSidePanel.class:1149 FWizard.form:53 +msgid "Cancel" +msgstr "Отмена" + +#: FDocumentView.form:51 +msgid "Zoom :" +msgstr "" + +#: FDocumentView.form:56 +msgid "Show Shadow" +msgstr "" + +#: FDocumentView.form:66 FTestTabPanel.form:64 +msgid "Padding" +msgstr "" + +#: FDocumentView.form:71 +msgid "Spacing" +msgstr "" + +#: FDocumentView.form:80 +msgid "Scale Mode" +msgstr "" + +#: FDocumentView.form:89 +msgid "Goto :" +msgstr "" + +#: FDocumentView.form:95 +msgid "Column" +msgstr "" + +#: FDocumentView.form:95 +msgid "Fill" +msgstr "" + +#: FDocumentView.form:95 +msgid "Horizontal" +msgstr "" + +#: FDocumentView.form:95 +msgid "None" +msgstr "" + +#: FDocumentView.form:95 +msgid "Row" +msgstr "" + +#: FDocumentView.form:95 +msgid "Vertical" +msgstr "" + +#: FDocumentView.form:96 FMain.form:69 +msgid "ComboBox1" +msgstr "Комбинированный_список_1" + +#: FDocumentView.form:101 FMain.form:85 FTestBalloon.form:18 +#: FTestCompletion.form:23 FTestMessageView.form:26 FTestWizard.form:22 +msgid "Button1" +msgstr "" + +#: FDocumentView.form:110 +msgid "Columns" +msgstr "" + +#: FDocumentView.form:120 +msgid "Autocenter" +msgstr "" + +#: FEditBookmark.class:23 FileView.class:138 +msgid "Name" +msgstr "Имя" + +#: FEditBookmark.class:24 +msgid "Path" +msgstr "Путь" + +#: FEditBookmark.class:119 +msgid "Do you really want to remove this bookmark?" +msgstr "Вы действительно хотите удалить эту закладку?" + +#: FEditBookmark.form:15 +msgid "Edit bookmarks" +msgstr "Редактировать закладки" + +#: FEditBookmark.form:34 +msgid "Up" +msgstr "Вверх" + +#: FEditBookmark.form:40 +msgid "Down" +msgstr "Вниз" + +#: FEditBookmark.form:46 FListEditor.class:263 +msgid "Remove" +msgstr "Удалить" + +#: FEditBookmark.form:57 FFileProperties.form:270 MessageView.class:51 +msgid "Close" +msgstr "Закрыть" + +#: FFileProperties.class:117 +msgid "Image" +msgstr "Изображение" + +#: FFileProperties.class:122 +msgid "Audio" +msgstr "Аудио" + +#: FFileProperties.class:126 +msgid "Video" +msgstr "Видео" + +#: FFileProperties.class:185 +msgid "&1 properties" +msgstr "Свойства &1" + +#: FFileProperties.class:216 Main.module:50 +msgid "&1 B" +msgstr "&1 Б" + +#: FFileProperties.class:221 +msgid "no file" +msgstr "нет файла" + +#: FFileProperties.class:223 +msgid "one file" +msgstr "один файл" + +#: FFileProperties.class:225 +msgid "files" +msgstr "файлы" + +#: FFileProperties.class:229 +msgid "no directory" +msgstr "нет директории" + +#: FFileProperties.class:231 +msgid "one directory" +msgstr "одна директория" + +#: FFileProperties.class:233 +msgid "directories" +msgstr "директории" + +#: FFileProperties.form:52 +msgid "General" +msgstr "Основное" + +#: FFileProperties.form:81 +msgid "Type" +msgstr "Тип" + +#: FFileProperties.form:94 +msgid "Link" +msgstr "Связь" + +#: FFileProperties.form:108 +msgid "Directory" +msgstr "Директория" + +#: FFileProperties.form:120 FileView.class:140 +msgid "Size" +msgstr "Размер" + +#: FFileProperties.form:132 FileView.class:142 +msgid "Last modified" +msgstr "Последняя модификация" + +#: FFileProperties.form:144 +msgid "Permissions" +msgstr "Права" + +#: FFileProperties.form:157 +msgid "Owner" +msgstr "Владелец" + +#: FFileProperties.form:169 +msgid "Group" +msgstr "Группа" + +#: FFileProperties.form:180 +msgid "Preview" +msgstr "Предпросмотр" + +#: FFileProperties.form:245 +msgid "Errors" +msgstr "Ошибки" + +#: FFontChooser.class:297 +msgid "How quickly daft jumping zebras vex" +msgstr "Как быстро сумасшедшие прыжки сердитой зебры" + +#: FFontChooser.form:55 +msgid "Bold" +msgstr "Полужирный" + +#: FFontChooser.form:62 +msgid "Italic" +msgstr "Курсив" + +#: FFontChooser.form:69 +msgid "Underline" +msgstr "Подчёркнутый" + +#: FFontChooser.form:76 +msgid "Strikeout" +msgstr "Зачёркнутый" + +#: FFontChooser.form:85 +msgid "Relative" +msgstr "Относительный" + +#: FIconPanel.form:18 +msgid "Item 0" +msgstr "" + +#: FIconPanel.form:23 +msgid "Toto" +msgstr "" + +#: FIconPanel.form:26 +msgid "Item 1" +msgstr "" + +#: FIconPanel.form:28 +msgid "Item 2" +msgstr "" + +#: FIconPanel.form:35 +msgid "Item 3" +msgstr "" + +#: FLCDLabel.form:15 +msgid "12:34" +msgstr "" + +#: FListEditor.class:262 +msgid "Add" +msgstr "Добавить" + +#: FListEditor.form:45 +msgid "Add item" +msgstr "Добавить элемент" + +#: FListEditor.form:52 +msgid "Remove item" +msgstr "Удалить элемент" + +#: FListEditor.form:59 +msgid "Move item up" +msgstr "Переместить элемент вверх" + +#: FListEditor.form:66 +msgid "Move item down" +msgstr "Переместить элемент вниз" + +#: FMain.form:29 FTestFileChooser.form:31 FTestMenuButton.form:39 FWiki.form:20 +msgid "Menu2" +msgstr "" + +#: FMain.form:33 FTestFileChooser.form:36 FTestMenuButton.form:43 FWiki.form:24 +msgid "Menu3" +msgstr "" + +#: FMain.form:68 +msgid "Élément 1" +msgstr "" + +#: FMain.form:68 +msgid "Élément 2" +msgstr "" + +#: FMain.form:68 +msgid "Élément 3" +msgstr "" + +#: FMain.form:68 +msgid "Élément 4" +msgstr "" + +#: FMain.form:74 +#, fuzzy +msgid "ComboBox2" +msgstr "Комбинированный_список_1" + +#: FMain.form:80 FSwitchButton.form:35 FTestBalloon.form:12 +#: FTestFileChooser.form:86 +msgid "TextBox1" +msgstr "" + +#: FMain.form:90 Form2.form:121 +msgid "MenuButton1" +msgstr "" + +#: FMessage.form:39 +msgid "Do not display this message again" +msgstr "Не отображать это сообщение снова" + +#: FSidePanel.class:1139 +msgid "Hidden" +msgstr "Скрытый" + +#: FSidePanel.class:1143 +msgid "Transparent" +msgstr "Прозрачный" + +#: FSpinBar.form:24 +msgid "Test" +msgstr "" + +#: FSwitchButton.form:51 FTestFileChooser.form:81 +msgid "Label1" +msgstr "" + +#: FSwitchButton.form:58 +msgid "Label2" +msgstr "" + +#: FTestBalloon.form:17 +msgid "Ceci est une bulle d'aide" +msgstr "" + +#: FTestColorChooser.form:20 +msgid "Resizable" +msgstr "" + +#: FTestCompletion.form:28 +msgid "Button2" +msgstr "" + +#: FTestDateChooser.form:47 +msgid "Enable" +msgstr "" + +#: FTestExpander.form:16 +msgid "Expander" +msgstr "" + +#: FTestFileChooser.form:28 FTestMenuButton.form:35 +msgid "Menu1" +msgstr "" + +#: FTestFileChooser.form:41 FTestMenuButton.form:69 +msgid "Menu7" +msgstr "" + +#: FTestFileChooser.form:49 FTestMenuButton.form:52 FWiki.form:28 +msgid "Menu4" +msgstr "" + +#: FTestFileChooser.form:54 FTestMenuButton.form:56 FWiki.form:32 +msgid "Menu5" +msgstr "" + +#: FTestFileChooser.form:76 +msgid "Balloon" +msgstr "" + +#: FTestMenuButton.form:31 +msgid "Project" +msgstr "" + +#: FTestMenuButton.form:48 +msgid "View" +msgstr "" + +#: FTestMenuButton.form:60 +msgid "Menu6" +msgstr "" + +#: FTestMenuButton.form:65 +msgid "Tools" +msgstr "" + +#: FTestMenuButton.form:73 +msgid "Menu8" +msgstr "" + +#: FTestMenuButton.form:77 +msgid "Menu9" +msgstr "" + +#: FTestMenuButton.form:80 +msgid "Menu10" +msgstr "" + +#: FTestMenuButton.form:84 +msgid "Menu11" +msgstr "" + +#: FTestMenuButton.form:124 +msgid "Menu button" +msgstr "" + +#: FTestTabPanel.form:41 +msgid "Text" +msgstr "" + +#: FTestTabPanel.form:54 +msgid "Border" +msgstr "" + +#: FTestTabPanel.form:59 +msgid "Orientation" +msgstr "" + +#: FTestToolPanel.form:13 +msgid "Toolbar &0" +msgstr "" + +#: FTestToolPanel.form:15 +msgid "Toolbar &1" +msgstr "" + +#: FTestToolPanel.form:17 +msgid "Toolbar &2" +msgstr "" + +#: FTestValueBox.form:15 +msgid "Hello world!" +msgstr "" + +#: FTestWizard.form:18 +msgid "Étape n°1" +msgstr "" + +#: FTestWizard.form:25 +msgid "Étape n°2" +msgstr "" + +#: FTestWizard.form:29 +msgid "LCDLabel1" +msgstr "" + +#: FTestWizard.form:32 +msgid "Étape n°3" +msgstr "" + +#: FTestWizard.form:34 +msgid "Étape n°4" +msgstr "" + +#: FWizard.class:88 +msgid "&Next" +msgstr "Далее" + +#: FWizard.form:59 MessageView.class:48 +msgid "Next" +msgstr "Далее" + +#: FWizard.form:65 +msgid "Previous" +msgstr "Назад" + +#: FileView.class:1081 +msgid "Cannot rename file." +msgstr "Невозможно переименовать файл." + +#: Form2.form:126 +msgid "ButtonBox2" +msgstr "" + +#: Help.module:71 +msgid "A file or directory name cannot be void." +msgstr "Имя файла или директории не может быть пустым." + +#: Help.module:72 +msgid "The '/' character is forbidden inside file or directory names." +msgstr "Символ '/' запрещён внутри имён файлов или директорий." + +#: Main.module:52 +msgid "&1 KiB" +msgstr "&1 кБ" + +#: Main.module:54 +msgid "&1 MiB" +msgstr "&1 МБ" + +#: Main.module:56 +msgid "&1 GiB" +msgstr "&1 ГБ" + +#: Wizard.class:86 +msgid "Step #&1" +msgstr "Шаг #&1" diff --git a/comp/src/gb.form/.lang/sv.po b/comp/src/gb.form/.lang/sv.po new file mode 100644 index 00000000..f8983134 --- /dev/null +++ b/comp/src/gb.form/.lang/sv.po @@ -0,0 +1,710 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.form 3.14.90\n" +"POT-Creation-Date: 2020-06-06 18:08 UTC\n" +"PO-Revision-Date: 2020-06-06 18:09 UTC\n" +"Last-Translator: Benoît Minisini \n" +"Language: sv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "More controls for graphical components" +msgstr "Flera kontroller för grafiska komponenter" + +#: CBookmarkList.class:51 +msgid "Home" +msgstr "Hem" + +#: CBookmarkList.class:53 +msgid "Desktop" +msgstr "Skrivbord" + +#: CBookmarkList.class:55 +msgid "System" +msgstr "System" + +#: ColorPalette.class:143 +msgid "Last colors" +msgstr "" + +#: ColorPalette.class:244 +msgid "Remove color" +msgstr "" + +#: ColorPalette.class:248 +msgid "Remove all colors" +msgstr "" + +#: ColorPalette.class:252 +msgid "Sort colors" +msgstr "" + +#: DirView.class:531 +msgid "Cannot rename directory." +msgstr "kan ej döpa om mapp." + +#: DirView.class:562 +msgid "New folder" +msgstr "Ny mapp" + +#: DirView.class:581 +msgid "Cannot create directory." +msgstr "Kan ej skapa mapp." + +#: FBugFileView.form:32 +msgid "Toggle Fileview Detailed View" +msgstr "" + +#: FBugFileView.form:37 +msgid "Toggle Filechooser Detailed View" +msgstr "" + +#: FCalendar.form:47 +msgid "Today" +msgstr "Idag" + +#: FCalendar.form:53 +msgid "Previous month" +msgstr "Föregående månad" + +#: FCalendar.form:59 +msgid "Next month" +msgstr "Nästa månad" + +#: FCalendar.form:143 +msgid "Apply" +msgstr "" + +#: FColorChooser.form:81 +msgid "Follow color grid" +msgstr "Följ färgrutnät" + +#: FDirChooser.class:428 +msgid "Directory not found." +msgstr "" + +#: FDirChooser.class:534 +msgid "All files (*)" +msgstr "Alla filer (*)" + +#: FDirChooser.class:974 +msgid "&Bookmark current directory" +msgstr "" + +#: FDirChooser.class:982 +msgid "&Edit bookmarks..." +msgstr "" + +#: FDirChooser.class:991 +msgid "Show &details" +msgstr "" + +#: FDirChooser.class:997 +msgid "Show &hidden files" +msgstr "" + +#: FDirChooser.class:1003 +msgid "Show &image preview" +msgstr "" + +#: FDirChooser.class:1011 +msgid "&Rename" +msgstr "" + +#: FDirChooser.class:1016 +msgid "Copy" +msgstr "Kopiera" + +#: FDirChooser.class:1021 +msgid "&Delete" +msgstr "" + +#: FDirChooser.class:1033 +msgid "&Uncompress file" +msgstr "" + +#: FDirChooser.class:1038 +msgid "&Create directory" +msgstr "" + +#: FDirChooser.class:1043 +msgid "Open in &file manager..." +msgstr "" + +#: FDirChooser.class:1048 +msgid "&Refresh" +msgstr "" + +#: FDirChooser.class:1056 +msgid "&Properties" +msgstr "" + +#: FDirChooser.class:1272 +msgid "Overwrite" +msgstr "Skriv över" + +#: FDirChooser.class:1272 +msgid "Overwrite all" +msgstr "" + +#: FDirChooser.class:1272 +msgid "This file or directory already exists." +msgstr "" + +#: FDirChooser.class:1291 +msgid "Cannot list archive contents" +msgstr "" + +#: FDirChooser.class:1325 +msgid "Cannot uncompress file." +msgstr "" + +#: FDirChooser.class:1325 +msgid "Unknown archive." +msgstr "" + +#: FDirChooser.class:1386 +msgid "Delete file" +msgstr "" + +#: FDirChooser.class:1387 +msgid "Do you really want to delete that file?" +msgstr "" + +#: FDirChooser.class:1394 +msgid "Unable to delete file." +msgstr "" + +#: FDirChooser.class:1404 +msgid "Delete directory" +msgstr "" + +#: FDirChooser.class:1405 +msgid "Do you really want to delete that directory?" +msgstr "" + +#: FDirChooser.class:1412 +msgid "Unable to delete directory." +msgstr "" + +#: FDirChooser.form:66 +msgid "Parent directory" +msgstr "Överordnad mapp" + +#: FDirChooser.form:72 +msgid "Root directory" +msgstr "" + +#: FDirChooser.form:133 +msgid "Image preview" +msgstr "" + +#: FDirChooser.form:141 +msgid "Detailed view" +msgstr "" + +#: FDirChooser.form:149 +msgid "File properties" +msgstr "" + +#: FDirChooser.form:155 +msgid "Show files" +msgstr "Visa filer" + +#: FDirChooser.form:174 +msgid "Bookmarks" +msgstr "" + +#: FDirChooser.form:236 FInputBox.form:45 FWizard.class:76 +msgid "OK" +msgstr "OK" + +#: FDirChooser.form:242 FEditBookmark.class:119 FInputBox.form:51 +#: FSidePanel.class:1149 FWizard.form:53 +msgid "Cancel" +msgstr "Avbryt" + +#: FDocumentView.form:51 +msgid "Zoom :" +msgstr "" + +#: FDocumentView.form:56 +msgid "Show Shadow" +msgstr "" + +#: FDocumentView.form:66 FTestTabPanel.form:64 +msgid "Padding" +msgstr "" + +#: FDocumentView.form:71 +msgid "Spacing" +msgstr "" + +#: FDocumentView.form:80 +msgid "Scale Mode" +msgstr "" + +#: FDocumentView.form:89 +msgid "Goto :" +msgstr "" + +#: FDocumentView.form:95 +msgid "Column" +msgstr "" + +#: FDocumentView.form:95 +msgid "Fill" +msgstr "" + +#: FDocumentView.form:95 +msgid "Horizontal" +msgstr "" + +#: FDocumentView.form:95 +msgid "None" +msgstr "" + +#: FDocumentView.form:95 +msgid "Row" +msgstr "" + +#: FDocumentView.form:95 +msgid "Vertical" +msgstr "" + +#: FDocumentView.form:96 FMain.form:69 +msgid "ComboBox1" +msgstr "" + +#: FDocumentView.form:101 FMain.form:85 FTestBalloon.form:18 +#: FTestCompletion.form:23 FTestMessageView.form:26 FTestWizard.form:22 +msgid "Button1" +msgstr "" + +#: FDocumentView.form:110 +msgid "Columns" +msgstr "" + +#: FDocumentView.form:120 +msgid "Autocenter" +msgstr "" + +#: FEditBookmark.class:23 FileView.class:138 +msgid "Name" +msgstr "Namn" + +#: FEditBookmark.class:24 +msgid "Path" +msgstr "Sökväg" + +#: FEditBookmark.class:119 +msgid "Do you really want to remove this bookmark?" +msgstr "" + +#: FEditBookmark.form:15 +msgid "Edit bookmarks" +msgstr "" + +#: FEditBookmark.form:34 +msgid "Up" +msgstr "Upp" + +#: FEditBookmark.form:40 +msgid "Down" +msgstr "Ner" + +#: FEditBookmark.form:46 FListEditor.class:263 +msgid "Remove" +msgstr "Tag bort" + +#: FEditBookmark.form:57 FFileProperties.form:270 MessageView.class:51 +msgid "Close" +msgstr "Stäng" + +#: FFileProperties.class:117 +msgid "Image" +msgstr "Bild" + +#: FFileProperties.class:122 +msgid "Audio" +msgstr "" + +#: FFileProperties.class:126 +msgid "Video" +msgstr "Video" + +#: FFileProperties.class:185 +msgid "&1 properties" +msgstr "" + +#: FFileProperties.class:216 Main.module:50 +msgid "&1 B" +msgstr "" + +#: FFileProperties.class:221 +msgid "no file" +msgstr "" + +#: FFileProperties.class:223 +msgid "one file" +msgstr "" + +#: FFileProperties.class:225 +msgid "files" +msgstr "" + +#: FFileProperties.class:229 +msgid "no directory" +msgstr "" + +#: FFileProperties.class:231 +msgid "one directory" +msgstr "" + +#: FFileProperties.class:233 +msgid "directories" +msgstr "" + +#: FFileProperties.form:52 +msgid "General" +msgstr "Allmänt" + +#: FFileProperties.form:81 +msgid "Type" +msgstr "Typ" + +#: FFileProperties.form:94 +msgid "Link" +msgstr "" + +#: FFileProperties.form:108 +msgid "Directory" +msgstr "Katalog" + +#: FFileProperties.form:120 FileView.class:140 +msgid "Size" +msgstr "Storlek" + +#: FFileProperties.form:132 FileView.class:142 +msgid "Last modified" +msgstr "Senast ändrad" + +#: FFileProperties.form:144 +msgid "Permissions" +msgstr "" + +#: FFileProperties.form:157 +msgid "Owner" +msgstr "" + +#: FFileProperties.form:169 +msgid "Group" +msgstr "" + +#: FFileProperties.form:180 +msgid "Preview" +msgstr "Förhandsgranskning" + +#: FFileProperties.form:245 +msgid "Errors" +msgstr "Fel" + +#: FFontChooser.class:297 +msgid "How quickly daft jumping zebras vex" +msgstr "Flygande bäckasiner söka hwila på mjuka tuvor" + +#: FFontChooser.form:55 +msgid "Bold" +msgstr "Fetstil" + +#: FFontChooser.form:62 +msgid "Italic" +msgstr "Kursiv" + +#: FFontChooser.form:69 +msgid "Underline" +msgstr "Understrykning" + +#: FFontChooser.form:76 +msgid "Strikeout" +msgstr "Genomstrykning" + +#: FFontChooser.form:85 +msgid "Relative" +msgstr "" + +#: FIconPanel.form:18 +msgid "Item 0" +msgstr "" + +#: FIconPanel.form:23 +msgid "Toto" +msgstr "" + +#: FIconPanel.form:26 +msgid "Item 1" +msgstr "" + +#: FIconPanel.form:28 +msgid "Item 2" +msgstr "" + +#: FIconPanel.form:35 +msgid "Item 3" +msgstr "" + +#: FLCDLabel.form:15 +msgid "12:34" +msgstr "" + +#: FListEditor.class:262 +msgid "Add" +msgstr "Lägg till" + +#: FListEditor.form:45 +msgid "Add item" +msgstr "" + +#: FListEditor.form:52 +msgid "Remove item" +msgstr "" + +#: FListEditor.form:59 +msgid "Move item up" +msgstr "" + +#: FListEditor.form:66 +msgid "Move item down" +msgstr "" + +#: FMain.form:29 FTestFileChooser.form:31 FTestMenuButton.form:39 FWiki.form:20 +msgid "Menu2" +msgstr "" + +#: FMain.form:33 FTestFileChooser.form:36 FTestMenuButton.form:43 FWiki.form:24 +msgid "Menu3" +msgstr "" + +#: FMain.form:68 +msgid "Élément 1" +msgstr "" + +#: FMain.form:68 +msgid "Élément 2" +msgstr "" + +#: FMain.form:68 +msgid "Élément 3" +msgstr "" + +#: FMain.form:68 +msgid "Élément 4" +msgstr "" + +#: FMain.form:74 +msgid "ComboBox2" +msgstr "" + +#: FMain.form:80 FSwitchButton.form:35 FTestBalloon.form:12 +#: FTestFileChooser.form:86 +msgid "TextBox1" +msgstr "" + +#: FMain.form:90 Form2.form:121 +msgid "MenuButton1" +msgstr "" + +#: FMessage.form:39 +msgid "Do not display this message again" +msgstr "" + +#: FSidePanel.class:1139 +msgid "Hidden" +msgstr "" + +#: FSidePanel.class:1143 +msgid "Transparent" +msgstr "" + +#: FSpinBar.form:24 +msgid "Test" +msgstr "" + +#: FSwitchButton.form:51 FTestFileChooser.form:81 +msgid "Label1" +msgstr "" + +#: FSwitchButton.form:58 +msgid "Label2" +msgstr "" + +#: FTestBalloon.form:17 +msgid "Ceci est une bulle d'aide" +msgstr "" + +#: FTestColorChooser.form:20 +msgid "Resizable" +msgstr "" + +#: FTestCompletion.form:28 +msgid "Button2" +msgstr "" + +#: FTestDateChooser.form:47 +msgid "Enable" +msgstr "" + +#: FTestExpander.form:16 +msgid "Expander" +msgstr "" + +#: FTestFileChooser.form:28 FTestMenuButton.form:35 +msgid "Menu1" +msgstr "" + +#: FTestFileChooser.form:41 FTestMenuButton.form:69 +msgid "Menu7" +msgstr "" + +#: FTestFileChooser.form:49 FTestMenuButton.form:52 FWiki.form:28 +msgid "Menu4" +msgstr "" + +#: FTestFileChooser.form:54 FTestMenuButton.form:56 FWiki.form:32 +msgid "Menu5" +msgstr "" + +#: FTestFileChooser.form:76 +msgid "Balloon" +msgstr "" + +#: FTestMenuButton.form:31 +msgid "Project" +msgstr "" + +#: FTestMenuButton.form:48 +msgid "View" +msgstr "" + +#: FTestMenuButton.form:60 +msgid "Menu6" +msgstr "" + +#: FTestMenuButton.form:65 +msgid "Tools" +msgstr "" + +#: FTestMenuButton.form:73 +msgid "Menu8" +msgstr "" + +#: FTestMenuButton.form:77 +msgid "Menu9" +msgstr "" + +#: FTestMenuButton.form:80 +msgid "Menu10" +msgstr "" + +#: FTestMenuButton.form:84 +msgid "Menu11" +msgstr "" + +#: FTestMenuButton.form:124 +msgid "Menu button" +msgstr "" + +#: FTestTabPanel.form:41 +msgid "Text" +msgstr "" + +#: FTestTabPanel.form:54 +msgid "Border" +msgstr "" + +#: FTestTabPanel.form:59 +msgid "Orientation" +msgstr "" + +#: FTestToolPanel.form:13 +msgid "Toolbar &0" +msgstr "" + +#: FTestToolPanel.form:15 +msgid "Toolbar &1" +msgstr "" + +#: FTestToolPanel.form:17 +msgid "Toolbar &2" +msgstr "" + +#: FTestValueBox.form:15 +msgid "Hello world!" +msgstr "" + +#: FTestWizard.form:18 +msgid "Étape n°1" +msgstr "" + +#: FTestWizard.form:25 +msgid "Étape n°2" +msgstr "" + +#: FTestWizard.form:29 +msgid "LCDLabel1" +msgstr "" + +#: FTestWizard.form:32 +msgid "Étape n°3" +msgstr "" + +#: FTestWizard.form:34 +msgid "Étape n°4" +msgstr "" + +#: FWizard.class:88 +msgid "&Next" +msgstr "&Nästa" + +#: FWizard.form:59 MessageView.class:48 +msgid "Next" +msgstr "Nästa" + +#: FWizard.form:65 +msgid "Previous" +msgstr "Föregående" + +#: FileView.class:1081 +msgid "Cannot rename file." +msgstr "" + +#: Form2.form:126 +msgid "ButtonBox2" +msgstr "" + +#: Help.module:71 +msgid "A file or directory name cannot be void." +msgstr "" + +#: Help.module:72 +msgid "The '/' character is forbidden inside file or directory names." +msgstr "Tecknet '/' är ej tillåtet inuti fil- och mappnamn." + +#: Main.module:52 +msgid "&1 KiB" +msgstr "" + +#: Main.module:54 +msgid "&1 MiB" +msgstr "" + +#: Main.module:56 +msgid "&1 GiB" +msgstr "" + +#: Wizard.class:86 +msgid "Step #&1" +msgstr "Steg #&1" diff --git a/comp/src/gb.form/.lang/zh.po b/comp/src/gb.form/.lang/zh.po new file mode 100644 index 00000000..be5f4dd7 --- /dev/null +++ b/comp/src/gb.form/.lang/zh.po @@ -0,0 +1,716 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.form 3.14.90\n" +"POT-Creation-Date: 2020-06-06 18:10 UTC\n" +"PO-Revision-Date: 2020-06-06 18:03 UTC\n" +"Last-Translator: Benoît Minisini \n" +"Language: zh\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "More controls for graphical components" +msgstr "用于图形组件的更多控件" + +#: CBookmarkList.class:51 +msgid "Home" +msgstr "居家" + +#: CBookmarkList.class:53 +msgid "Desktop" +msgstr "桌面" + +#: CBookmarkList.class:55 +msgid "System" +msgstr "系统" + +#: ColorPalette.class:143 +msgid "Last colors" +msgstr "最近颜色" + +#: ColorPalette.class:244 +msgid "Remove color" +msgstr "移除颜色" + +#: ColorPalette.class:248 +msgid "Remove all colors" +msgstr "移除全部颜色" + +#: ColorPalette.class:252 +msgid "Sort colors" +msgstr "颜色排序" + +#: DirView.class:531 +msgid "Cannot rename directory." +msgstr "不能重命名目录。" + +#: DirView.class:562 +msgid "New folder" +msgstr "新建文件夹" + +#: DirView.class:581 +msgid "Cannot create directory." +msgstr "不能创建目录。" + +#: FBugFileView.form:32 +msgid "Toggle Fileview Detailed View" +msgstr "" + +#: FBugFileView.form:37 +msgid "Toggle Filechooser Detailed View" +msgstr "" + +#: FCalendar.form:47 +msgid "Today" +msgstr "今天" + +#: FCalendar.form:53 +msgid "Previous month" +msgstr "上一月" + +#: FCalendar.form:59 +msgid "Next month" +msgstr "下一月" + +#: FCalendar.form:143 +msgid "Apply" +msgstr "应用" + +#: FColorChooser.form:81 +msgid "Follow color grid" +msgstr "追随网格内颜色" + +#: FDirChooser.class:428 +msgid "Directory not found." +msgstr "目录未找到。" + +#: FDirChooser.class:534 +msgid "All files (*)" +msgstr "所有文件(*)" + +#: FDirChooser.class:974 +msgid "&Bookmark current directory" +msgstr "将当前目录加入书签(&B)" + +#: FDirChooser.class:982 +msgid "&Edit bookmarks..." +msgstr "编辑书签...(&E)" + +#: FDirChooser.class:991 +msgid "Show &details" +msgstr "显示细节(&d)" + +#: FDirChooser.class:997 +msgid "Show &hidden files" +msgstr "显示隐藏文件(&h)" + +#: FDirChooser.class:1003 +msgid "Show &image preview" +msgstr "显示图像预览(&i)" + +#: FDirChooser.class:1011 +msgid "&Rename" +msgstr "重命名(&R)" + +#: FDirChooser.class:1016 +msgid "Copy" +msgstr "复制" + +#: FDirChooser.class:1021 +msgid "&Delete" +msgstr "删除(&D)" + +#: FDirChooser.class:1033 +msgid "&Uncompress file" +msgstr "解压缩文件(&U)" + +#: FDirChooser.class:1038 +msgid "&Create directory" +msgstr "创建目录(&C)" + +#: FDirChooser.class:1043 +msgid "Open in &file manager..." +msgstr "用文件管理器打开...(&f)" + +#: FDirChooser.class:1048 +msgid "&Refresh" +msgstr "更新(&R)" + +#: FDirChooser.class:1056 +msgid "&Properties" +msgstr "属性(&P)" + +#: FDirChooser.class:1272 +msgid "Overwrite" +msgstr "覆盖" + +#: FDirChooser.class:1272 +msgid "Overwrite all" +msgstr "全部覆盖" + +#: FDirChooser.class:1272 +msgid "This file or directory already exists." +msgstr "该文件或目录已经存在。" + +#: FDirChooser.class:1291 +msgid "Cannot list archive contents" +msgstr "不能列出文档内容。" + +#: FDirChooser.class:1325 +msgid "Cannot uncompress file." +msgstr "不能解压缩文件。" + +#: FDirChooser.class:1325 +msgid "Unknown archive." +msgstr "未知文档。" + +#: FDirChooser.class:1386 +msgid "Delete file" +msgstr "删除文件" + +#: FDirChooser.class:1387 +msgid "Do you really want to delete that file?" +msgstr "确定要删除文件吗?" + +#: FDirChooser.class:1394 +msgid "Unable to delete file." +msgstr "不能删除文件。" + +#: FDirChooser.class:1404 +msgid "Delete directory" +msgstr "删除目录" + +#: FDirChooser.class:1405 +msgid "Do you really want to delete that directory?" +msgstr "是否确实要删除该目录?" + +#: FDirChooser.class:1412 +msgid "Unable to delete directory." +msgstr "无法删除目录。" + +#: FDirChooser.form:66 +msgid "Parent directory" +msgstr "上级目录" + +#: FDirChooser.form:72 +msgid "Root directory" +msgstr "根目录" + +#: FDirChooser.form:133 +msgid "Image preview" +msgstr "图像预览" + +#: FDirChooser.form:141 +msgid "Detailed view" +msgstr "查看细节" + +#: FDirChooser.form:149 +msgid "File properties" +msgstr "文件属性" + +#: FDirChooser.form:155 +msgid "Show files" +msgstr "显示文件" + +#: FDirChooser.form:174 +msgid "Bookmarks" +msgstr "书签" + +#: FDirChooser.form:236 FInputBox.form:45 FWizard.class:76 +msgid "OK" +msgstr "确定" + +#: FDirChooser.form:242 FEditBookmark.class:119 FInputBox.form:51 +#: FSidePanel.class:1149 FWizard.form:53 +msgid "Cancel" +msgstr "取消" + +#: FDocumentView.form:51 +msgid "Zoom :" +msgstr "" + +#: FDocumentView.form:56 +msgid "Show Shadow" +msgstr "" + +#: FDocumentView.form:66 FTestTabPanel.form:64 +msgid "Padding" +msgstr "" + +#: FDocumentView.form:71 +msgid "Spacing" +msgstr "" + +#: FDocumentView.form:80 +msgid "Scale Mode" +msgstr "" + +#: FDocumentView.form:89 +msgid "Goto :" +msgstr "" + +#: FDocumentView.form:95 +msgid "Column" +msgstr "" + +#: FDocumentView.form:95 +msgid "Fill" +msgstr "" + +#: FDocumentView.form:95 +msgid "Horizontal" +msgstr "" + +#: FDocumentView.form:95 +msgid "None" +msgstr "" + +#: FDocumentView.form:95 +msgid "Row" +msgstr "" + +#: FDocumentView.form:95 +msgid "Vertical" +msgstr "" + +# gb-ignore +#: FDocumentView.form:96 FMain.form:69 +msgid "ComboBox1" +msgstr "" + +#: FDocumentView.form:101 FMain.form:85 FTestBalloon.form:18 +#: FTestCompletion.form:23 FTestMessageView.form:26 FTestWizard.form:22 +msgid "Button1" +msgstr "" + +#: FDocumentView.form:110 +msgid "Columns" +msgstr "" + +#: FDocumentView.form:120 +msgid "Autocenter" +msgstr "" + +#: FEditBookmark.class:23 FileView.class:138 +msgid "Name" +msgstr "名称" + +#: FEditBookmark.class:24 +msgid "Path" +msgstr "路径" + +#: FEditBookmark.class:119 +msgid "Do you really want to remove this bookmark?" +msgstr "确定要移除该书签吗?" + +#: FEditBookmark.form:15 +msgid "Edit bookmarks" +msgstr "编辑书签" + +#: FEditBookmark.form:34 +msgid "Up" +msgstr "上移" + +#: FEditBookmark.form:40 +msgid "Down" +msgstr "下移" + +#: FEditBookmark.form:46 FListEditor.class:263 +msgid "Remove" +msgstr "移除" + +#: FEditBookmark.form:57 FFileProperties.form:270 MessageView.class:51 +msgid "Close" +msgstr "关闭" + +#: FFileProperties.class:117 +msgid "Image" +msgstr "图像" + +#: FFileProperties.class:122 +msgid "Audio" +msgstr "音频" + +#: FFileProperties.class:126 +msgid "Video" +msgstr "视频" + +#: FFileProperties.class:185 +msgid "&1 properties" +msgstr "&1属性" + +# gb-ignore +#: FFileProperties.class:216 Main.module:50 +msgid "&1 B" +msgstr "" + +# gb-ignore +#: FFileProperties.class:221 +msgid "no file" +msgstr "" + +# gb-ignore +#: FFileProperties.class:223 +msgid "one file" +msgstr "" + +#: FFileProperties.class:225 +msgid "files" +msgstr "文件" + +# gb-ignore +#: FFileProperties.class:229 +msgid "no directory" +msgstr "" + +# gb-ignore +#: FFileProperties.class:231 +msgid "one directory" +msgstr "" + +#: FFileProperties.class:233 +msgid "directories" +msgstr "目录" + +#: FFileProperties.form:52 +msgid "General" +msgstr "常规" + +#: FFileProperties.form:81 +msgid "Type" +msgstr "类型" + +#: FFileProperties.form:94 +msgid "Link" +msgstr "链接" + +#: FFileProperties.form:108 +msgid "Directory" +msgstr "目录" + +#: FFileProperties.form:120 FileView.class:140 +msgid "Size" +msgstr "大小" + +#: FFileProperties.form:132 FileView.class:142 +msgid "Last modified" +msgstr "最近修改" + +#: FFileProperties.form:144 +msgid "Permissions" +msgstr "许可权限" + +#: FFileProperties.form:157 +msgid "Owner" +msgstr "属主" + +#: FFileProperties.form:169 +msgid "Group" +msgstr "属组" + +#: FFileProperties.form:180 +msgid "Preview" +msgstr "预览" + +#: FFileProperties.form:245 +msgid "Errors" +msgstr "错误" + +#: FFontChooser.class:297 +msgid "How quickly daft jumping zebras vex" +msgstr "One CHINA, One family. 一个中国,一个家。" + +#: FFontChooser.form:55 +msgid "Bold" +msgstr "粗体" + +#: FFontChooser.form:62 +msgid "Italic" +msgstr "斜体" + +#: FFontChooser.form:69 +msgid "Underline" +msgstr "下划线" + +#: FFontChooser.form:76 +msgid "Strikeout" +msgstr "删除线" + +#: FFontChooser.form:85 +msgid "Relative" +msgstr "相对尺寸" + +#: FIconPanel.form:18 +msgid "Item 0" +msgstr "" + +#: FIconPanel.form:23 +msgid "Toto" +msgstr "" + +#: FIconPanel.form:26 +msgid "Item 1" +msgstr "" + +#: FIconPanel.form:28 +msgid "Item 2" +msgstr "" + +#: FIconPanel.form:35 +msgid "Item 3" +msgstr "" + +#: FLCDLabel.form:15 +msgid "12:34" +msgstr "" + +#: FListEditor.class:262 +msgid "Add" +msgstr "添加" + +#: FListEditor.form:45 +msgid "Add item" +msgstr "添加条目" + +#: FListEditor.form:52 +msgid "Remove item" +msgstr "移除条目" + +#: FListEditor.form:59 +msgid "Move item up" +msgstr "上移条目" + +#: FListEditor.form:66 +msgid "Move item down" +msgstr "下移条目" + +#: FMain.form:29 FTestFileChooser.form:31 FTestMenuButton.form:39 FWiki.form:20 +msgid "Menu2" +msgstr "" + +#: FMain.form:33 FTestFileChooser.form:36 FTestMenuButton.form:43 FWiki.form:24 +msgid "Menu3" +msgstr "" + +#: FMain.form:68 +msgid "Élément 1" +msgstr "" + +#: FMain.form:68 +msgid "Élément 2" +msgstr "" + +#: FMain.form:68 +msgid "Élément 3" +msgstr "" + +#: FMain.form:68 +msgid "Élément 4" +msgstr "" + +#: FMain.form:74 +msgid "ComboBox2" +msgstr "" + +#: FMain.form:80 FSwitchButton.form:35 FTestBalloon.form:12 +#: FTestFileChooser.form:86 +msgid "TextBox1" +msgstr "" + +#: FMain.form:90 Form2.form:121 +msgid "MenuButton1" +msgstr "" + +#: FMessage.form:39 +msgid "Do not display this message again" +msgstr "不再显示该信息" + +#: FSidePanel.class:1139 +msgid "Hidden" +msgstr "隐藏" + +#: FSidePanel.class:1143 +msgid "Transparent" +msgstr "透明" + +#: FSpinBar.form:24 +msgid "Test" +msgstr "" + +#: FSwitchButton.form:51 FTestFileChooser.form:81 +msgid "Label1" +msgstr "" + +#: FSwitchButton.form:58 +msgid "Label2" +msgstr "" + +#: FTestBalloon.form:17 +msgid "Ceci est une bulle d'aide" +msgstr "" + +#: FTestColorChooser.form:20 +msgid "Resizable" +msgstr "" + +#: FTestCompletion.form:28 +msgid "Button2" +msgstr "" + +#: FTestDateChooser.form:47 +msgid "Enable" +msgstr "" + +#: FTestExpander.form:16 +msgid "Expander" +msgstr "" + +#: FTestFileChooser.form:28 FTestMenuButton.form:35 +msgid "Menu1" +msgstr "" + +#: FTestFileChooser.form:41 FTestMenuButton.form:69 +msgid "Menu7" +msgstr "" + +#: FTestFileChooser.form:49 FTestMenuButton.form:52 FWiki.form:28 +msgid "Menu4" +msgstr "" + +#: FTestFileChooser.form:54 FTestMenuButton.form:56 FWiki.form:32 +msgid "Menu5" +msgstr "" + +#: FTestFileChooser.form:76 +msgid "Balloon" +msgstr "" + +#: FTestMenuButton.form:31 +msgid "Project" +msgstr "" + +#: FTestMenuButton.form:48 +msgid "View" +msgstr "" + +#: FTestMenuButton.form:60 +msgid "Menu6" +msgstr "" + +#: FTestMenuButton.form:65 +msgid "Tools" +msgstr "" + +#: FTestMenuButton.form:73 +msgid "Menu8" +msgstr "" + +#: FTestMenuButton.form:77 +msgid "Menu9" +msgstr "" + +#: FTestMenuButton.form:80 +msgid "Menu10" +msgstr "" + +#: FTestMenuButton.form:84 +msgid "Menu11" +msgstr "" + +#: FTestMenuButton.form:124 +msgid "Menu button" +msgstr "" + +#: FTestTabPanel.form:41 +msgid "Text" +msgstr "" + +#: FTestTabPanel.form:54 +msgid "Border" +msgstr "" + +#: FTestTabPanel.form:59 +msgid "Orientation" +msgstr "" + +#: FTestToolPanel.form:13 +msgid "Toolbar &0" +msgstr "" + +#: FTestToolPanel.form:15 +msgid "Toolbar &1" +msgstr "" + +#: FTestToolPanel.form:17 +msgid "Toolbar &2" +msgstr "" + +#: FTestValueBox.form:15 +msgid "Hello world!" +msgstr "" + +#: FTestWizard.form:18 +msgid "Étape n°1" +msgstr "" + +#: FTestWizard.form:25 +msgid "Étape n°2" +msgstr "" + +#: FTestWizard.form:29 +msgid "LCDLabel1" +msgstr "" + +#: FTestWizard.form:32 +msgid "Étape n°3" +msgstr "" + +#: FTestWizard.form:34 +msgid "Étape n°4" +msgstr "" + +#: FWizard.class:88 +msgid "&Next" +msgstr "下一个(&N)" + +#: FWizard.form:59 MessageView.class:48 +msgid "Next" +msgstr "下一步" + +#: FWizard.form:65 +msgid "Previous" +msgstr "上一步" + +#: FileView.class:1081 +msgid "Cannot rename file." +msgstr "不能重命名文件。" + +#: Form2.form:126 +msgid "ButtonBox2" +msgstr "" + +#: Help.module:71 +msgid "A file or directory name cannot be void." +msgstr "文件或目录名称不能无效。" + +#: Help.module:72 +msgid "The '/' character is forbidden inside file or directory names." +msgstr "文件或目录名称中禁止出现'/'字符。" + +#: Main.module:52 +msgid "&1 KiB" +msgstr "&1 KB" + +#: Main.module:54 +msgid "&1 MiB" +msgstr "&1 MB" + +#: Main.module:56 +msgid "&1 GiB" +msgstr "&1 GB" + +#: Wizard.class:86 +msgid "Step #&1" +msgstr "步骤#&1" diff --git a/comp/src/gb.form/.lang/zh_TW.po b/comp/src/gb.form/.lang/zh_TW.po new file mode 100644 index 00000000..fde08c4e --- /dev/null +++ b/comp/src/gb.form/.lang/zh_TW.po @@ -0,0 +1,710 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.form 3.14.90\n" +"POT-Creation-Date: 2020-06-06 18:08 UTC\n" +"PO-Revision-Date: 2020-06-06 18:09 UTC\n" +"Last-Translator: Benoît Minisini \n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "More controls for graphical components" +msgstr "更多圖形元件控制" + +#: CBookmarkList.class:51 +msgid "Home" +msgstr "家" + +#: CBookmarkList.class:53 +msgid "Desktop" +msgstr "桌面" + +#: CBookmarkList.class:55 +msgid "System" +msgstr "系統" + +#: ColorPalette.class:143 +msgid "Last colors" +msgstr "" + +#: ColorPalette.class:244 +msgid "Remove color" +msgstr "" + +#: ColorPalette.class:248 +msgid "Remove all colors" +msgstr "" + +#: ColorPalette.class:252 +msgid "Sort colors" +msgstr "" + +#: DirView.class:531 +msgid "Cannot rename directory." +msgstr "" + +#: DirView.class:562 +msgid "New folder" +msgstr "新增資料夾" + +#: DirView.class:581 +msgid "Cannot create directory." +msgstr "" + +#: FBugFileView.form:32 +msgid "Toggle Fileview Detailed View" +msgstr "" + +#: FBugFileView.form:37 +msgid "Toggle Filechooser Detailed View" +msgstr "" + +#: FCalendar.form:47 +msgid "Today" +msgstr "今天" + +#: FCalendar.form:53 +msgid "Previous month" +msgstr "上一個月" + +#: FCalendar.form:59 +msgid "Next month" +msgstr "下一個月" + +#: FCalendar.form:143 +msgid "Apply" +msgstr "" + +#: FColorChooser.form:81 +msgid "Follow color grid" +msgstr "" + +#: FDirChooser.class:428 +msgid "Directory not found." +msgstr "" + +#: FDirChooser.class:534 +msgid "All files (*)" +msgstr "" + +#: FDirChooser.class:974 +msgid "&Bookmark current directory" +msgstr "" + +#: FDirChooser.class:982 +msgid "&Edit bookmarks..." +msgstr "" + +#: FDirChooser.class:991 +msgid "Show &details" +msgstr "" + +#: FDirChooser.class:997 +msgid "Show &hidden files" +msgstr "" + +#: FDirChooser.class:1003 +msgid "Show &image preview" +msgstr "" + +#: FDirChooser.class:1011 +msgid "&Rename" +msgstr "" + +#: FDirChooser.class:1016 +msgid "Copy" +msgstr "複製" + +#: FDirChooser.class:1021 +msgid "&Delete" +msgstr "" + +#: FDirChooser.class:1033 +msgid "&Uncompress file" +msgstr "" + +#: FDirChooser.class:1038 +msgid "&Create directory" +msgstr "" + +#: FDirChooser.class:1043 +msgid "Open in &file manager..." +msgstr "" + +#: FDirChooser.class:1048 +msgid "&Refresh" +msgstr "" + +#: FDirChooser.class:1056 +msgid "&Properties" +msgstr "" + +#: FDirChooser.class:1272 +msgid "Overwrite" +msgstr "覆寫(O)" + +#: FDirChooser.class:1272 +msgid "Overwrite all" +msgstr "" + +#: FDirChooser.class:1272 +msgid "This file or directory already exists." +msgstr "" + +#: FDirChooser.class:1291 +msgid "Cannot list archive contents" +msgstr "" + +#: FDirChooser.class:1325 +msgid "Cannot uncompress file." +msgstr "" + +#: FDirChooser.class:1325 +msgid "Unknown archive." +msgstr "" + +#: FDirChooser.class:1386 +msgid "Delete file" +msgstr "" + +#: FDirChooser.class:1387 +msgid "Do you really want to delete that file?" +msgstr "" + +#: FDirChooser.class:1394 +msgid "Unable to delete file." +msgstr "" + +#: FDirChooser.class:1404 +msgid "Delete directory" +msgstr "" + +#: FDirChooser.class:1405 +msgid "Do you really want to delete that directory?" +msgstr "" + +#: FDirChooser.class:1412 +msgid "Unable to delete directory." +msgstr "" + +#: FDirChooser.form:66 +msgid "Parent directory" +msgstr "" + +#: FDirChooser.form:72 +msgid "Root directory" +msgstr "" + +#: FDirChooser.form:133 +msgid "Image preview" +msgstr "" + +#: FDirChooser.form:141 +msgid "Detailed view" +msgstr "" + +#: FDirChooser.form:149 +msgid "File properties" +msgstr "" + +#: FDirChooser.form:155 +msgid "Show files" +msgstr "" + +#: FDirChooser.form:174 +msgid "Bookmarks" +msgstr "" + +#: FDirChooser.form:236 FInputBox.form:45 FWizard.class:76 +msgid "OK" +msgstr "確定" + +#: FDirChooser.form:242 FEditBookmark.class:119 FInputBox.form:51 +#: FSidePanel.class:1149 FWizard.form:53 +msgid "Cancel" +msgstr "取消" + +#: FDocumentView.form:51 +msgid "Zoom :" +msgstr "" + +#: FDocumentView.form:56 +msgid "Show Shadow" +msgstr "" + +#: FDocumentView.form:66 FTestTabPanel.form:64 +msgid "Padding" +msgstr "" + +#: FDocumentView.form:71 +msgid "Spacing" +msgstr "" + +#: FDocumentView.form:80 +msgid "Scale Mode" +msgstr "" + +#: FDocumentView.form:89 +msgid "Goto :" +msgstr "" + +#: FDocumentView.form:95 +msgid "Column" +msgstr "" + +#: FDocumentView.form:95 +msgid "Fill" +msgstr "" + +#: FDocumentView.form:95 +msgid "Horizontal" +msgstr "" + +#: FDocumentView.form:95 +msgid "None" +msgstr "" + +#: FDocumentView.form:95 +msgid "Row" +msgstr "" + +#: FDocumentView.form:95 +msgid "Vertical" +msgstr "" + +#: FDocumentView.form:96 FMain.form:69 +msgid "ComboBox1" +msgstr "" + +#: FDocumentView.form:101 FMain.form:85 FTestBalloon.form:18 +#: FTestCompletion.form:23 FTestMessageView.form:26 FTestWizard.form:22 +msgid "Button1" +msgstr "" + +#: FDocumentView.form:110 +msgid "Columns" +msgstr "" + +#: FDocumentView.form:120 +msgid "Autocenter" +msgstr "" + +#: FEditBookmark.class:23 FileView.class:138 +msgid "Name" +msgstr "名稱" + +#: FEditBookmark.class:24 +msgid "Path" +msgstr "路徑" + +#: FEditBookmark.class:119 +msgid "Do you really want to remove this bookmark?" +msgstr "" + +#: FEditBookmark.form:15 +msgid "Edit bookmarks" +msgstr "" + +#: FEditBookmark.form:34 +msgid "Up" +msgstr "上" + +#: FEditBookmark.form:40 +msgid "Down" +msgstr "下" + +#: FEditBookmark.form:46 FListEditor.class:263 +msgid "Remove" +msgstr "移除" + +#: FEditBookmark.form:57 FFileProperties.form:270 MessageView.class:51 +msgid "Close" +msgstr "關閉" + +#: FFileProperties.class:117 +msgid "Image" +msgstr "影像" + +#: FFileProperties.class:122 +msgid "Audio" +msgstr "" + +#: FFileProperties.class:126 +msgid "Video" +msgstr "視訊" + +#: FFileProperties.class:185 +msgid "&1 properties" +msgstr "" + +#: FFileProperties.class:216 Main.module:50 +msgid "&1 B" +msgstr "" + +#: FFileProperties.class:221 +msgid "no file" +msgstr "" + +#: FFileProperties.class:223 +msgid "one file" +msgstr "" + +#: FFileProperties.class:225 +msgid "files" +msgstr "" + +#: FFileProperties.class:229 +msgid "no directory" +msgstr "" + +#: FFileProperties.class:231 +msgid "one directory" +msgstr "" + +#: FFileProperties.class:233 +msgid "directories" +msgstr "" + +#: FFileProperties.form:52 +msgid "General" +msgstr "一般的" + +#: FFileProperties.form:81 +msgid "Type" +msgstr "類型" + +#: FFileProperties.form:94 +msgid "Link" +msgstr "" + +#: FFileProperties.form:108 +msgid "Directory" +msgstr "目錄" + +#: FFileProperties.form:120 FileView.class:140 +msgid "Size" +msgstr "大小" + +#: FFileProperties.form:132 FileView.class:142 +msgid "Last modified" +msgstr "" + +#: FFileProperties.form:144 +msgid "Permissions" +msgstr "" + +#: FFileProperties.form:157 +msgid "Owner" +msgstr "" + +#: FFileProperties.form:169 +msgid "Group" +msgstr "" + +#: FFileProperties.form:180 +msgid "Preview" +msgstr "預覽" + +#: FFileProperties.form:245 +msgid "Errors" +msgstr "錯誤" + +#: FFontChooser.class:297 +msgid "How quickly daft jumping zebras vex" +msgstr "" + +#: FFontChooser.form:55 +msgid "Bold" +msgstr "粗體" + +#: FFontChooser.form:62 +msgid "Italic" +msgstr "斜體" + +#: FFontChooser.form:69 +msgid "Underline" +msgstr "底線" + +#: FFontChooser.form:76 +msgid "Strikeout" +msgstr "刪除線" + +#: FFontChooser.form:85 +msgid "Relative" +msgstr "" + +#: FIconPanel.form:18 +msgid "Item 0" +msgstr "" + +#: FIconPanel.form:23 +msgid "Toto" +msgstr "" + +#: FIconPanel.form:26 +msgid "Item 1" +msgstr "" + +#: FIconPanel.form:28 +msgid "Item 2" +msgstr "" + +#: FIconPanel.form:35 +msgid "Item 3" +msgstr "" + +#: FLCDLabel.form:15 +msgid "12:34" +msgstr "" + +#: FListEditor.class:262 +msgid "Add" +msgstr "新增" + +#: FListEditor.form:45 +msgid "Add item" +msgstr "" + +#: FListEditor.form:52 +msgid "Remove item" +msgstr "" + +#: FListEditor.form:59 +msgid "Move item up" +msgstr "" + +#: FListEditor.form:66 +msgid "Move item down" +msgstr "" + +#: FMain.form:29 FTestFileChooser.form:31 FTestMenuButton.form:39 FWiki.form:20 +msgid "Menu2" +msgstr "" + +#: FMain.form:33 FTestFileChooser.form:36 FTestMenuButton.form:43 FWiki.form:24 +msgid "Menu3" +msgstr "" + +#: FMain.form:68 +msgid "Élément 1" +msgstr "" + +#: FMain.form:68 +msgid "Élément 2" +msgstr "" + +#: FMain.form:68 +msgid "Élément 3" +msgstr "" + +#: FMain.form:68 +msgid "Élément 4" +msgstr "" + +#: FMain.form:74 +msgid "ComboBox2" +msgstr "" + +#: FMain.form:80 FSwitchButton.form:35 FTestBalloon.form:12 +#: FTestFileChooser.form:86 +msgid "TextBox1" +msgstr "" + +#: FMain.form:90 Form2.form:121 +msgid "MenuButton1" +msgstr "" + +#: FMessage.form:39 +msgid "Do not display this message again" +msgstr "" + +#: FSidePanel.class:1139 +msgid "Hidden" +msgstr "" + +#: FSidePanel.class:1143 +msgid "Transparent" +msgstr "" + +#: FSpinBar.form:24 +msgid "Test" +msgstr "" + +#: FSwitchButton.form:51 FTestFileChooser.form:81 +msgid "Label1" +msgstr "" + +#: FSwitchButton.form:58 +msgid "Label2" +msgstr "" + +#: FTestBalloon.form:17 +msgid "Ceci est une bulle d'aide" +msgstr "" + +#: FTestColorChooser.form:20 +msgid "Resizable" +msgstr "" + +#: FTestCompletion.form:28 +msgid "Button2" +msgstr "" + +#: FTestDateChooser.form:47 +msgid "Enable" +msgstr "" + +#: FTestExpander.form:16 +msgid "Expander" +msgstr "" + +#: FTestFileChooser.form:28 FTestMenuButton.form:35 +msgid "Menu1" +msgstr "" + +#: FTestFileChooser.form:41 FTestMenuButton.form:69 +msgid "Menu7" +msgstr "" + +#: FTestFileChooser.form:49 FTestMenuButton.form:52 FWiki.form:28 +msgid "Menu4" +msgstr "" + +#: FTestFileChooser.form:54 FTestMenuButton.form:56 FWiki.form:32 +msgid "Menu5" +msgstr "" + +#: FTestFileChooser.form:76 +msgid "Balloon" +msgstr "" + +#: FTestMenuButton.form:31 +msgid "Project" +msgstr "" + +#: FTestMenuButton.form:48 +msgid "View" +msgstr "" + +#: FTestMenuButton.form:60 +msgid "Menu6" +msgstr "" + +#: FTestMenuButton.form:65 +msgid "Tools" +msgstr "" + +#: FTestMenuButton.form:73 +msgid "Menu8" +msgstr "" + +#: FTestMenuButton.form:77 +msgid "Menu9" +msgstr "" + +#: FTestMenuButton.form:80 +msgid "Menu10" +msgstr "" + +#: FTestMenuButton.form:84 +msgid "Menu11" +msgstr "" + +#: FTestMenuButton.form:124 +msgid "Menu button" +msgstr "" + +#: FTestTabPanel.form:41 +msgid "Text" +msgstr "" + +#: FTestTabPanel.form:54 +msgid "Border" +msgstr "" + +#: FTestTabPanel.form:59 +msgid "Orientation" +msgstr "" + +#: FTestToolPanel.form:13 +msgid "Toolbar &0" +msgstr "" + +#: FTestToolPanel.form:15 +msgid "Toolbar &1" +msgstr "" + +#: FTestToolPanel.form:17 +msgid "Toolbar &2" +msgstr "" + +#: FTestValueBox.form:15 +msgid "Hello world!" +msgstr "" + +#: FTestWizard.form:18 +msgid "Étape n°1" +msgstr "" + +#: FTestWizard.form:25 +msgid "Étape n°2" +msgstr "" + +#: FTestWizard.form:29 +msgid "LCDLabel1" +msgstr "" + +#: FTestWizard.form:32 +msgid "Étape n°3" +msgstr "" + +#: FTestWizard.form:34 +msgid "Étape n°4" +msgstr "" + +#: FWizard.class:88 +msgid "&Next" +msgstr "下一頁(&N)" + +#: FWizard.form:59 MessageView.class:48 +msgid "Next" +msgstr "下一個(N)" + +#: FWizard.form:65 +msgid "Previous" +msgstr "上一頁(P)" + +#: FileView.class:1081 +msgid "Cannot rename file." +msgstr "" + +#: Form2.form:126 +msgid "ButtonBox2" +msgstr "" + +#: Help.module:71 +msgid "A file or directory name cannot be void." +msgstr "" + +#: Help.module:72 +msgid "The '/' character is forbidden inside file or directory names." +msgstr "" + +#: Main.module:52 +msgid "&1 KiB" +msgstr "" + +#: Main.module:54 +msgid "&1 MiB" +msgstr "" + +#: Main.module:56 +msgid "&1 GiB" +msgstr "" + +#: Wizard.class:86 +msgid "Step #&1" +msgstr "" diff --git a/comp/src/gb.form/.project b/comp/src/gb.form/.project new file mode 100644 index 00000000..e0d0effc --- /dev/null +++ b/comp/src/gb.form/.project @@ -0,0 +1,30 @@ +# Gambas Project File 3.0 +Title=More controls for graphical components +Startup=FTestFileChooser +Version=3.14.90 +VersionFile=1 +Component=gb.image +Component=gb.gui +Component=gb.form +Component=gb.settings +Component=gb.form.stock +Authors="Benoît Minisini" +Environment="GB_GUI=gb.qt5\nGB_STOCK_DEBUG=1" +TabSize=2 +Translate=1 +Language=en +Type=Component +Maintainer=Benoit Minisini +Address=benoit@minisini.fr +Url=www.endoftheinternet.com +License=General Public Licence +Prefix=1 +PackageName=gambas3-gb-form-3.14.90 +CreateEachDirectory=1 +Packager=1 +Systems=autotools +Groups=debian:"embedded" +Groups=slackware:"Applications/Emulators" +ExtraFiles=slackware:"control/colorpalette.png\t" +Groups=ubuntu:"electronics" +DoNotTranslate=".src/Test" diff --git a/comp/src/gb.form/.src/Balloon/Balloon.class b/comp/src/gb.form/.src/Balloon/Balloon.class new file mode 100644 index 00000000..f95cdd29 --- /dev/null +++ b/comp/src/gb.form/.src/Balloon/Balloon.class @@ -0,0 +1,89 @@ +' Gambas class file + +Export + +Static Property Read Control As Control +Static Property Delay As Integer +Static Property Font As Font +Static Property Read Visible As Boolean + +Static Public Sub _call((Message) As String, (Control) As Control, Optional Icon As Picture, Optional X As Integer = -1, Optional Y As Integer = -1) + + FBalloon.Run(Message, Control, Icon, X, Y) + +End + +Static Public Sub Info((Message) As String, (Control) As Control, Optional X As Integer = -1, Optional Y As Integer = -1) + + FBalloon.Run(Message, Control, Picture["icon:/32/info"], X, Y) + +End + +Static Public Sub Warning((Message) As String, (Control) As Control, Optional X As Integer = -1, Optional Y As Integer = -1) + + FBalloon.Run(Message, Control, Picture["icon:/32/warning"], X, Y) + +End + +Static Public Sub Error((Message) As String, (Control) As Control, Optional X As Integer = -1, Optional Y As Integer = -1) + + FBalloon.Run(Message, Control, Picture["icon:/32/error"], X, Y) + +End + +Static Public Sub Question((Message) As String, (Control) As Control, Optional X As Integer = -1, Optional Y As Integer = -1) + + FBalloon.Run(Message, Control, Picture["icon:/32/question"], X, Y) + +End + +Static Public Sub Delete((Message) As String, (Control) As Control, Optional X As Integer = -1, Optional Y As Integer = -1) + + FBalloon.Run(Message, Control, Picture["icon:/32/delete"], X, Y) + +End + +Static Public Sub Hide(Optional (Control) As Control) + + If Control And If FBalloon.GetControl() <> Control Then Return + 'Debug + FBalloon.Hide + 'Try Wait + +End + +Static Private Function Control_Read() As Control + + Return FBalloon.GetControl() + +End + +Static Private Function Delay_Read() As Integer + + Return FBalloon.GetDelay() + +End + +Static Private Sub Delay_Write(Value As Integer) + + FBalloon.SetDelay(Value) + +End + +Static Private Function Font_Read() As Font + + Return FBalloon.Font + +End + +Static Private Sub Font_Write(Value As Font) + + FBalloon.Font = Value + +End + +Static Private Function Visible_Read() As Boolean + + Return FBalloon.Visible + +End diff --git a/comp/src/gb.form/.src/Balloon/FBalloon.class b/comp/src/gb.form/.src/Balloon/FBalloon.class new file mode 100644 index 00000000..22b31b8b --- /dev/null +++ b/comp/src/gb.form/.src/Balloon/FBalloon.class @@ -0,0 +1,421 @@ +' Gambas class file + +Private Const ROUND_SIZE As Integer = 8 +Private Const PADDING As Integer = 8 +Private Const BACKGROUND_COLOR As Integer = &HFFFFDF& +Private Const BACKGROUND_COLOR2 As Integer = &HBFBFA7& + +Static Private $iDelay As Integer = 5000 + +Private ARROW_HEIGHT As Integer + +Private $hObs As Observer +Private $hWatcher2 As Watcher +Private $hCtrl As Control + +Private $X As Integer +Private $Y As Integer +Private $W As Integer +Private $H As Integer +Private $DX As Integer +Private $DY As Integer +Private $fShow As Float +Private $sOld As String + +' Private Sub DrawRoundRect(X As Integer, Y As Integer, W As Integer, H As Integer) +' +' Dim hRound As Image +' +' If Not $hRound Then $hRound = Image.Load("img/round.png") +' +' hRound = $hRound.Copy() +' Draw.Image(hRound, X, Y) +' hRound.Mirror(True, False) +' Draw.Image(hRound, X + W - ROUND_SIZE, Y) +' hRound.Mirror(False, True) +' Draw.Image(hRound, X + W - ROUND_SIZE, Y + H - ROUND_SIZE) +' hRound.Mirror(True, False) +' Draw.Image(hRound, X, Y + H - ROUND_SIZE) +' +' Draw.FillStyle = Fill.Solid +' Draw.LineStyle = Line.None +' +' Draw.FillColor = BACKGROUND_COLOR +' Draw.Rect(X + ROUND_SIZE, Y, W - ROUND_SIZE * 2, ROUND_SIZE) +' Draw.Rect(X, Y + ROUND_SIZE, W, H - ROUND_SIZE * 2) +' Draw.Rect(X + ROUND_SIZE, Y + H - ROUND_SIZE, W - ROUND_SIZE * 2, ROUND_SIZE) +' Draw.LineStyle = Line.Solid +' Draw.Foreground = &H808080& '&H808070& +' Draw.Line(X + ROUND_SIZE, Y, X + W - ROUND_SIZE - 1, Y) +' Draw.Line(X + ROUND_SIZE, Y + H - 1, X + W - ROUND_SIZE, Y + H - 1) +' Draw.Line(X, Y + ROUND_SIZE, X, Y + H - ROUND_SIZE - 1) +' Draw.Line(X + W - 1, Y + ROUND_SIZE, X + W - 1, Y + H - ROUND_SIZE - 1) +' +' End + +Private Sub GetTopLevel(hCtrl As Control) As Window + + Dim hWin As Window + + If Not hCtrl Then Return + hWin = hCtrl.Window + Do + If hWin.TopLevel Then Return hWin + hWin = hWin.Parent.Window + Loop + +End + +Private Sub MakeBorder(Optional W As Integer, H As Integer) + + Dim hImage As Image + Dim DX, DY, DW, DH As Integer 'Current screen's dimensions + Dim SX, SY, CX, CY As Integer + Dim X, Y, X1, Y1, X2, Y2, X3, Y3, Y4 As Integer + Dim hWin As Window + Dim sNew As String + Dim hCtrl As Control + + $X = $hCtrl.ScreenX + $Y = $hCtrl.ScreenY + + If $DX < 0 Then + SX = $X + $hCtrl.W \ 2 + Else + SX = $X + $DX + Endif + If $DY < 0 Then + SY = $Y + $hCtrl.H \ 2 + Else + SY = $Y + $DY + Endif + + 'DEBUG $hCtrl;; "SX =";; SX;; "SY =";; SY + + hWin = GetTopLevel($hCtrl) + 'DEBUG hWin + + CX = hWin.ScreenX + hWin.W \ 2 + CY = hWin.ScreenY + hWin.H \ 2 + + With Screens[hWin.Screen] + DX = .X + DY = .Y + DH = .H + DW = .W + End With + + + 'DEBUG "CX =";; CX;; "CY =";; CY +' IF SX < (DW \ 2) THEN +' X = Max(0, SX - ME.W \ 2 - 32) +' ELSE +' X = Min(DW - ME.W, SX - ME.W \ 2 + 32) +' ENDIF +' + If W <= 0 Then + W = $W + H = $H + Endif + + If SX < CX And SX >= W Then + X = SX - W \ 2 - ARROW_HEIGHT + Else + X = SX - W \ 2 + ARROW_HEIGHT + Endif + + 'X = DX + Max(4, Min(DW - W - 4, X)) + X = Min(X, DX + DW - W - 4) + X = Max(X, DX) + + 'IF SY < (DH \ 2) THEN + + 'DEBUG SY;; CY;; ME.H + + If (SY >= CY And SY < (DY + DH - H)) Or SY < (DY + H) Then + Y1 = 1 + 'Y4 = ARROW_HEIGHT + Y2 = ARROW_HEIGHT + 1 + Y = SY + Y4 = Y2 + Else + Y1 = H - 1 + 'Y4 = H - ARROW_HEIGHT + Y2 = H - ARROW_HEIGHT - 1 + Y = SY - H + Y4 = Y2 + Endif + + Y3 = Y2 + + 'Y = DY + Max(4, Min(DH - H - 4, Y)) + Y = Min(Y, DY + DH - H - 4) + Y = Max(Y, DY) + + 'Debug "X =";; X;; "Y =";; Y;; "W =";; W;; "H =";; H + + X1 = Min(Max(16, SX - X), W - 16) + 'X2 = W \ 2 - 12 + 'X3 = X2 + 24 + If X1 < (W \ 2) Then + X2 = X1 + X3 = X1 + ARROW_HEIGHT + Else + X2 = X1 - ARROW_HEIGHT + X3 = X1 + Endif + X2 = Max(X2, 16) + + 'Debug "X1="; X1;; "X2="; X2;; "X3="; X3 + + Me.Move(X, Y, W, H) + + sNew = ARROW_HEIGHT & " " & Me.W & " " & Me.H & " " & X1 & " " & Y1 & " " & X2 & " " & Y2 & " " & X3 & " " & Y3 + If sNew <> $sOld Then + + 'DEBUG sNew + 'ME.Hide + ' + ' hImage = New Image(Me.W, Me.H, Color.Transparent) + ' Paint.Begin(hImage) + ' + ' PaintRoundRect(0, ARROW_HEIGHT, Paint.W, Paint.H - ARROW_HEIGHT * 2, 12) + ' Paint.Brush = Paint.Color(Me.Background) + ' Paint.Fill + ' PaintRoundRect(0.5, ARROW_HEIGHT + 0.5, Paint.W - 1, Paint.H - ARROW_HEIGHT * 2 - 1, 12) + ' iColor = Color.Black 'Color.Merge(&H808080, Me.Background) + ' Paint.Brush = Paint.Color(iColor) + ' Paint.LineWidth = 1 + ' Paint.Stroke + ' + ' Paint.End + ' + ' hPict = hImage.Picture + ' + + hImage = New Image(Me.W, Me.H, Color.Transparent) + + ' Draw.Begin(hImage) + ' + ' 'Draw.FillRect(0, 0, Draw.W, Draw.H, Color.White) + ' DrawRoundRect(0, ARROW_HEIGHT, Me.W, Me.H - ARROW_HEIGHT * 2) + ' + ' Draw.FillStyle = Fill.Solid + ' Draw.LineStyle = Line.None + ' + ' Draw.FillColor = iColor + ' 'DrawInternalRect(0, ARROW_HEIGHT, ME.W, ME.H - ARROW_HEIGHT * 2) + ' Draw.Polygon([X1, Y1, X2, Y2, X3, Y3]) + ' + ' Draw.FillColor = BACKGROUND_COLOR 'Me.Background + ' 'DrawInternalRect(1, ARROW_HEIGHT + 1, ME.W - 2, ME.H - (ARROW_HEIGHT + 1) * 2) + ' Draw.Polygon([X1, Y1, X2, Y2, X3, Y3]) + ' Draw.End + + Paint.Begin(hImage) + + Paint.Background = Color.Merge(Color.TooltipBackground, Color.TooltipForeground) + Paint.LineWidth = 2 + 'Paint.Translate(0.5, 0.5) + Paint.Rectangle(1, ARROW_HEIGHT, hImage.W - 2, hImage.H - ARROW_HEIGHT * 2, 6) + Paint.MoveTo(X2, Y4) + Paint.LineTo(X3, Y4) + Paint.MoveTo(X2, Y2) + Paint.LineTo(X1, Y1) + Paint.LineTo(X3, Y3) + Paint.Stroke + 'Paint.Translate(-0.5, -0.5) + + Paint.Background = Color.TooltipBackground + Paint.Rectangle(1, ARROW_HEIGHT, hImage.W - 2, hImage.H - ARROW_HEIGHT * 2, 6) + Paint.Fill + Paint.Polygon([X1, Y1, X2, Y2, X3, Y3]) + Paint.Fill + + 'Paint.Translate(0.5, 0.5) + + Paint.End + + 'hImage.Save("~/balloon.png") + 'hImage.Erase(Color.White) + + Me.Picture = hImage.Picture + + $sOld = sNew + + Endif + + hCtrl = Application.ActiveControl + + Try GetTopLevel(hCtrl).Show + Try hCtrl.SetFocus + + If Not Me.Visible Then + hWin = Application.ActiveWindow + Me.Show + ' If hWin Then + ' Debug hWin + ' hWin.Show + ' Wait + ' hWin.Show + ' Endif + Else + Form_Show + Me.Raise + Endif + + $fShow = Timer + +End + +Public Sub Run(sMsg As String, hCtrl As Control, hIcon As Picture, DX As Integer, DY As Integer) + + Dim hWin As Window + + 'IF hCtrl <> $hCtrl THEN + ' DEBUG + ' ME.Hide + 'ELSE + Form_Hide + 'ENDIF + + txtMessage.W = Max(hCtrl.W / 2, 768) + txtMessage.Text = Replace(sMsg, "\n", "
        ") + txtMessage.Adjust + If txtMessage.W < 64 Then txtMessage.W = 64 + + $W = txtMessage.W + 2 + $H = txtMessage.Font.RichTextHeight(txtMessage.Text, $W) + txtMessage.Resize($W, $H) + + $hCtrl = hCtrl + ARROW_HEIGHT = Min(16, $hCtrl.H \ 4 + 8) + $DX = DX + $DY = DY + + hWin = GetTopLevel($hCtrl) + If Not hWin.Modal Then hWin.Show + + $hObs = New Observer(hWin) As "Window" + $hWatcher2 = New Watcher($hCtrl) As "Watcher" + + If hIcon Then + imgIcon.Picture = hIcon + imgIcon.Resize(hIcon.Width, hIcon.Height) + imgIcon.Show + $W += imgIcon.W + 8 + PADDING * 2 + $H = Max($H, imgIcon.H) + PADDING * 2 + ARROW_HEIGHT * 2 + imgIcon.Move(PADDING, PADDING + ARROW_HEIGHT) + txtMessage.Move(imgIcon.X + imgIcon.W + 8, PADDING + ARROW_HEIGHT) ', ME.W - 32 - imgIcon.W - 8) + Else + imgIcon.Hide + $W += PADDING * 2 + $H += PADDING * 2 + ARROW_HEIGHT * 2 + txtMessage.Move(PADDING, PADDING + ARROW_HEIGHT) ', ME.W - 32) + Endif + + MakeBorder($W, $H) + + 'Debug Me.SkipTaskbar + 'Me.SkipTaskbar = True + +End + + +Public Sub Form_Show() + + 'timCheck.Enabled = FALSE + 'GetTopLevel($hCtrl).Show + timCheck.Start + +End + +Public Sub Form_Hide() + + timCheck.Stop + $hObs = Null + $hWatcher2 = Null + +End + +Public Sub Watcher_Hide() + + 'Debug + Me.Close + +End + +' PUBLIC SUB Form_Deactivate() +' +' ME.Hide +' +' END + +Public Sub txtMessage_MouseDown() + + 'Debug + Me.Close + +End + +Public Sub Form_MouseDown() + + 'Debug + Me.Close + +End + +Public Sub Window_Move() + + If Not Me.Visible Then Return + + If Abs($hCtrl.ScreenX - $X) >= 4 Or Abs($hCtrl.ScreenY - $Y) >= 4 Then + MakeBorder + Endif + +End + +Public Sub Window_Hide() + + 'Debug + Me.Close + +End + +Public Sub timCheck_Timer() + + If Not Object.IsValid($hCtrl) Or If (Timer - $fShow) > ($iDelay / 1000) Then + Me.Close + Return + Endif + + If Abs($hCtrl.ScreenX - $X) >= 4 Or Abs($hCtrl.ScreenY - $Y) >= 4 Then + MakeBorder + Endif + +End + +Public Sub GetControl() As Control + + If Me.Visible Then Return $hCtrl + +End + + +Static Public Sub GetDelay() As Integer + + Return $iDelay + +End + +Static Public Sub SetDelay(iDelay As Integer) + + $iDelay = iDelay + +End + +Public Sub Form_Open() + + txtMessage.Foreground = Color.TooltipForeground + +End diff --git a/comp/src/gb.form/.src/Balloon/FBalloon.form b/comp/src/gb.form/.src/Balloon/FBalloon.form new file mode 100644 index 00000000..e4a90fc8 --- /dev/null +++ b/comp/src/gb.form/.src/Balloon/FBalloon.form @@ -0,0 +1,26 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,35,23) + Visible = False + Foreground = Color.TextForeground + Mask = True + Persistent = True + Border = False + TakeFocus = False + Stacking = Window.Above + SkipTaskbar = True + Transparent = True + { txtMessage TextLabel + MoveScaled(8,3,24,10) + } + { timCheck #Timer + #MoveScaled(24,15) + Delay = 250 + } + { imgIcon PictureBox txtMessage + Name = "imgIcon" + MoveScaled(2,4,5,5) + Visible = False + } +} diff --git a/comp/src/gb.form/.src/Button/ButtonBox.class b/comp/src/gb.form/.src/Button/ButtonBox.class new file mode 100644 index 00000000..122d32cd --- /dev/null +++ b/comp/src/gb.form/.src/Button/ButtonBox.class @@ -0,0 +1,382 @@ +' Gambas class file + +Export + +Inherits UserControl + +Public Const _Properties As String = "*,Action,Text,Alignment{Align.Normal;Left;Center;Right}=Normal,Picture,ReadOnly,Border=True,Button=True,ClearButton,Filter,FilterMenu{Menu}" +Public Const _DefaultEvent As String = "Click" +Public Const _DefaultSize As String = "24,4" +Public Const _Similar As String = "TextBox" + +Event Click +Event Change +Event Activate +Event Clear +Event Filter + +Property Picture As Picture +Property Text As String +Property Pos As Integer +Property Read Length As Integer +Property ReadOnly As Boolean +Property Border As Boolean +Property Read Editor As MaskBox +Property Button As Boolean +Property Alignment As Integer +Property ClearButton As Boolean +Property Filter As Boolean +Property FilterMenu As String + +'Private $hPanel As Panel +Private $hBackground As DrawingArea +Private $bBorder As Boolean +Private $hTextBox As MaskBox +Private $hButton As ToolButton +Private $hClearButton As ToolButton +Private $sMenu As String +Private $bFilter As Boolean +Private $hFilter As PictureBox +Private $hTimer As Timer +'Private $hObserver As Observer + +Public Sub _new() + + $hBackground = New DrawingArea(Me) As "Background" + '$hBackground.Arrangement = Arrange.Horizontal + + $hTextBox = New MaskBox($hBackground) As "TextBox" + $hTextBox.Border = False + $hTextBox.Expand = True + + Me.Proxy = $hTextBox + + $hButton = New ToolButton($hBackground) As "Button" + $hButton.W = Desktop.Scale * 3 + $hButton.Picture = Picture["./img/select.png"] + '$hButton.Hide + + Border_Write(True) + +End + +Private Function Picture_Read() As Picture + + Return $hButton.Picture + +End + +Private Sub Picture_Write(Value As Picture) + + If Not Value Then Value = Picture["./img/select.png"] + $hButton.Picture = Value + +End + +Private Function Text_Read() As String + + Return $hTextBox.Text + +End + +Private Sub Text_Write(Value As String) + + $hTextBox.Text = Value + +End + +Public Sub Button_Click() + + $hTextBox.SetFocus + Raise Click + +End + +Private Function ReadOnly_Read() As Boolean + + Return $hTextBox.ReadOnly + +End + +Private Sub ReadOnly_Write(Value As Boolean) + + $hTextBox.ReadOnly = Value + +End + +Public Sub Background_GotFocus() + + $hTextBox.SetFocus + +End + +Public Sub Clear() + + $hTextBox.Clear + +End + +Private Function Length_Read() As Integer + + Return $hTextBox.Length + +End + +Private Function Border_Read() As Boolean + + Return $bBorder + +End + +Private Sub Border_Write(Value As Boolean) + + $bBorder = Value + '$hBackground.Padding = If(Value, Style.TextBoxFrameWidth, 0) + '$hBackground.Margin = Value + 'Debug $hBackground.Padding + Background_Arrange + $hBackground.Refresh + +End + +Public Sub Background_Draw() + + 'Dim FW, FH As Integer + Dim iBg As Integer = Color.TextBackground + + If Me.Background <> Color.Default Then iBg = Me.Background + + If $bBorder Then + Style.PaintBox(0, 0, Me.W, Me.H, Style.StateOf($hTextBox), iBg) + Else + Paint.FillRect(0, 0, Me.W, Me.H, iBg) + Endif + +End + +Private Function Editor_Read() As MaskBox + + Return $hTextBox + +End + + +Private Function Button_Read() As Boolean + + Return $hButton.Visible + +End + +Private Sub Button_Write(Value As Boolean) + + $hButton.Visible = Value + +End + +Private Function Alignment_Read() As Integer + + Return $hTextBox.Alignment + +End + +Private Sub Alignment_Write(Value As Integer) + + $hTextBox.Alignment = Value + +End + +Public Sub TextBox_GotFocus() + + $hBackground.Refresh + +End + +Public Sub TextBox_LostFocus() + + $hBackground.Refresh + +End + + +Public Sub TextBox_Activate() + + Raise Activate + +End + +Public Sub TextBox_Change() + + If $bFilter Then $hTimer.Start + Raise Change + +End + +Public Sub Background_Arrange() + + Dim FW, FH As Integer + Dim hCtrl As Control + Dim aCtrl As New Control[] + Dim X, H As Integer + + FW = If($bBorder, Style.FrameWidth, 0) + FH = If($bBorder, Style.FrameWidth, 0) + + For Each hCtrl In $hBackground.Children + If hCtrl Is ToolButton And If hCtrl.Visible Then aCtrl.Add(hCtrl) + Next + + H = Me.H - FH * 2 + + If System.RightToLeft Then + X = FW + For Each hCtrl In aCtrl + hCtrl.W = Desktop.Scale * 3 + hCtrl.Move(X, FH, H, H) + X += H + Next + If $hFilter Then + $hTextBox.Move(X, FH, Me.W - FW - X - H, H) + $hFilter.Move(Me.W - H - FW, FH, H, H) + Else + $hTextBox.Move(X, FH, Me.W - Style.BoxFrameWidth - X, H) + Endif + Else + X = Me.W - FW + For Each hCtrl In aCtrl + hCtrl.W = Desktop.Scale * 3 + X -= H + hCtrl.Move(X, FH, H, H) + Next + If $hFilter Then + $hFilter.Move(FW, FH, H, H) + $hTextBox.Move(FW + H, FH, X - Style.BoxFrameWidth - H, H) + Else + $hTextBox.Move(Style.BoxFrameWidth, FH, X - Style.BoxFrameWidth, H) + Endif + Endif + +End + +Public Sub _AddButton(hButton As ToolButton) + + hButton.Reparent($hBackground) + hButton.Raise + If $hClearButton Then $hClearButton.Raise + $hButton.Lower + +End + +Private Function Pos_Read() As Integer + + Return $hTextBox.Pos + +End + +Private Sub Pos_Write(Value As Integer) + + $hTextBox.Pos = Value + +End + +Private Function ClearButton_Read() As Boolean + + If $hClearButton Then Return True + +End + +Private Sub ClearButton_Write(Value As Boolean) + + If Value = ClearButton_Read() Then Return + + If Not Value Then + $hClearButton.Delete + $hClearButton = Null + Else + $hClearButton = New ToolButton($hBackground) As "ClearButton" + $hClearButton.Picture = Picture["icon:/small/clear"] + Endif + + Background_Arrange + +End + +Public Sub ClearButton_Click() + + $hTextBox.Clear + Raise Clear + +End + +Private Function Filter_Read() As Boolean + + Return $bFilter + +End + +Private Sub UpdateFilterPicture() + + $hFilter.Picture = Picture[If($sMenu, "img/32/filter-menu.png", "img/32/filter.png")] + $hFilter.Mouse = If($sMenu, Mouse.Pointing, Mouse.Default) + +End + +Private Sub Filter_Write(Value As Boolean) + + If $bFilter = Value Then Return + + $bFilter = Value + + If $bFilter Then + $hFilter = New PictureBox($hBackground) As "FilterPictureBox" + $hFilter.Stretch = True + $hFilter.Padding = 2 + UpdateFilterPicture + $hTimer = New Timer As "FilterTimer" + $hTimer.Delay = 500 + Else + $hFilter.Delete + $hFilter = Null + Endif + + Background_Arrange + +End + +Private Function FilterMenu_Read() As String + + Return $sMenu + +End + +Private Sub FilterMenu_Write(Value As String) + + $sMenu = Value + UpdateFilterPicture + +End + +Public Sub FilterTimer_Timer() + + $hTimer.Stop + Raise Filter + +End + +Public Sub FilterPictureBox_MouseDown() + + Dim hMenu As Menu + + If Not $sMenu Then Return + + hMenu = Main.FindMenu(Me, $sMenu) + If hMenu Then hMenu.Popup($hFilter.ScreenX, $hFilter.ScreenY + $hFilter.H) + +End + +Public Sub FilterNow() + + If Not $bFilter Then Return + 'If Not $hTimer.Enabled Then Return + FilterTimer_Timer + +End diff --git a/comp/src/gb.form/.src/Button/MenuButton.class b/comp/src/gb.form/.src/Button/MenuButton.class new file mode 100644 index 00000000..1539a905 --- /dev/null +++ b/comp/src/gb.form/.src/Button/MenuButton.class @@ -0,0 +1,574 @@ +' Gambas class file + +Export + +Inherits UserControl + +'Public Const _Properties As String = "*,AutoResize,Text,Picture,Border,Radio,Toggle,Value" +Public Const _Properties As String = "*,Action,AutoResize,Text,Picture,Arrow=True,Border=True,Menu,MenuOnly" +Public Const _DefaultSize As String = "6,4" +Public Const _Similar As String = "Button" +Public Const _DefaultEvent As String = "Click" + +Event Click +' Event MouseDown +' Event MouseUp +' Event MouseWheel +' Event MouseDrag + +Property Picture As Picture +Property Text As String +Property Menu As String +Property Arrow As Boolean +Property MenuOnly As Boolean +'Property Action As String +Property Value As Boolean +Property AutoResize As Boolean +Property Border As Boolean + +Private $hDrawingArea As DrawingArea +Private $hPicture As Picture +Private $sText As String +Private $sActualText As String +Private $bBorder As Boolean +Private $sMenu As String +Private $hButton As Button +Private $iShortcutPos As Integer + +Private $bInside As Boolean +Private $bInsideArrow As Boolean +Private $bPressed As Boolean +Private $bArrow As Boolean +Private $bAutoResize As Boolean +Private $bMenuOnly As Boolean +Private $hLastFocus As Control + +Static Private $hCurrent As MenuButton +Static Private $hCurrentMenu As Menu + +Public Sub _new() + + $hDrawingArea = New DrawingArea(Me) As "DrawingArea" + $hDrawingArea.Focus = True + + $bBorder = True + $bArrow = True + + Me.Proxy = $hDrawingArea + +End + +Private Function Picture_Read() As Picture + + Return $hPicture + +End + +Private Sub Picture_Write(Value As Picture) + + $hPicture = Value + UpdateSize + +End + +Private Function Text_Read() As String + + Return $sText + +End + +Private Sub Text_Write(Value As String) + + Dim iPos As Integer + + $sText = Value + $sActualText = $sText + + $iShortcutPos = 0 + + Do + iPos = String.InStr($sText, "&", iPos + 1) + If iPos = 0 Then Break + If String.Mid$($sText, iPos + 1, 1) = "&" Then + Inc iPos + Continue + Endif + If Not $hButton Then + $hButton = New Button(Me) As "Button" + $hButton.Ignore = True + $hButton.Move(-16, -16, 8, 8) + Endif + $hButton.Text = String.Mid$($sText, iPos, 2) + $iShortcutPos = iPos + $sActualText = String.Left($sText, iPos - 1) & String.Mid($sText, iPos + 1) + Break + Loop + + $sActualText = Replace($sActualText, "&&", "&") + + UpdateSize + +End + +Private Function Menu_Read() As String + + Return $sMenu + +End + +Private Sub Menu_Write(Value As String) + + $sMenu = Value + +End + +Public Sub Button_GotFocus() + + _SetLastFocus + $hDrawingArea.SetFocus + 'Button_Click + +End + + +Public Sub Button_Click() + + If Not $bMenuOnly Then + Action.Raise(Me) + Raise Click + Else + Arrow_Click + Endif + +End + +Public Sub WatchTimer_Timer() + + Dim hMenuButton As MenuButton + Dim X As Integer + Dim Y As Integer + + If Not $hCurrentMenu Or If $hCurrentMenu.Closed Then + Last.Stop + Return + Endif + + X = Mouse.ScreenX - Me.Parent.ScreenX + Y = Mouse.ScreenY - Me.Parent.ScreenY + + If X < 0 Or If Y < 0 Or If X >= Me.Parent.W Or If Y >= Me.Parent.H Then Return + + Try hMenuButton = Me.Parent.FindChild(X, Y) + If hMenuButton And If hMenuButton <> $hCurrent And If hMenuButton.Enabled And If Not hMenuButton.Arrow Then + If Main.FindMenu(hMenuButton, hMenuButton.Menu) Then + $hCurrentMenu.Close + $hCurrent.Refresh + $hCurrent = hMenuButton + Endif + Endif + +End + +Static Private Sub HandleMenu(hCurrent As MenuButton) + + Dim hMenu As Menu + Dim hWatch As Timer + + hWatch = New Timer As "WatchTimer" + hWatch.Delay = 50 + hWatch.Start + + While hCurrent + + hMenu = Null + If hCurrent.Menu Then hMenu = Main.FindMenu(hCurrent, hCurrent.Menu) + If Not hMenu Then Break + + $hCurrent = hCurrent + $hCurrentMenu = hMenu + + hCurrent._SetLastFocus() + hCurrent.SetFocus ' Should refresh old and new menus + + hMenu.Popup(hCurrent.ScreenX, hCurrent.ScreenY + hCurrent.H) + + If $hCurrent = hCurrent Then Break + hCurrent = $hCurrent + + Wend + + hWatch.Stop + hWatch = Null + + If Object.IsValid($hCurrent) Then + $hCurrent.Refresh + $hCurrent._RestoreLastFocus() + Endif + + $hCurrent = Null + $hCurrentMenu = Null + + +End + + + +Private Sub Arrow_Click() + + If Not $sMenu Or If Not Main.FindMenu(Me, $sMenu) Then + $hCurrent = Me + $hCurrentMenu = Null + Me.SetFocus + Me.Refresh + Raise Click + $hCurrent = Null + Return + Endif + + HandleMenu(Me) + +End + +' Public Sub ShowMenu() +' +' $hTimer = New Timer As "ShowMenuTimer" +' $hTimer.Trigger +' +' End +' +' Public Sub ShowMenuTimer_Timer() +' +' Arrow_Click +' $hTimer = Null +' +' End + +Private Function Value_Read() As Boolean + + Return False + +End + +Private Sub Value_Write(Value As Boolean) + + If Value Then Print "Click" + +End + +Private Function Arrow_Read() As Boolean + + Return $bArrow + +End + +Private Sub Arrow_Write(Value As Boolean) + + $bArrow = Value + UpdateSize + +End + +Private Sub UpdateSize() + + Dim W As Integer + + If $bAutoResize Then + If $sActualText Then W = Me.Font.TextWidth($sActualText) + Desktop.Scale + If $hPicture Then W += $hPicture.W + Desktop.Scale + If $bArrow Then W += Desktop.Scale * 2 + W += Desktop.Scale + Me.W = W + Endif + + $hDrawingArea.Refresh + +End + + +Private Function AutoResize_Read() As Boolean + + Return $bAutoResize + +End + +Private Sub AutoResize_Write(Value As Boolean) + + $bAutoResize = Value + UpdateSize + +End + +Private Function Border_Read() As Boolean + + Return $bBorder + +End + +Private Sub Border_Write(Value As Boolean) + + $bBorder = Value + UpdateSize + +End + +Public Sub DrawingArea_GotFocus() + + _SetLastFocus + $hDrawingArea.Refresh + +End + +Public Sub DrawingArea_LostFocus() + + $hDrawingArea.Refresh + +End + +Public Sub DrawingArea_Enter() + + If Me.Design Then Return + $bInside = True + $hDrawingArea.Refresh + +End + +Public Sub DrawingArea_Leave() + + If Me.Design Then Return + $bInside = False + $hDrawingArea.Refresh + +End + +Public Sub DrawingArea_MouseDown() + + If Me.Design Then Return + If Not Mouse.Left Then Return + If Not Me.Enabled Then Return + + $bPressed = True + If $bArrow Then + $bInsideArrow = Mouse.X > (Me.W - Desktop.Scale * 3 + 3) + Else + $bInsideArrow = $sMenu ' if the arrow is hidden, the all button will popup the menu + Endif + + $hDrawingArea.SetFocus + $hDrawingArea.Refresh + + If $bInsideArrow Or $bMenuOnly Then + Arrow_Click + DrawingArea_MouseUp + 'If Not Mouse.Inside($hDrawingArea) Then DrawingArea_Leave + Endif + +End + +Public Sub DrawingArea_MouseMove() + + Dim bPressed As Boolean + + If Me.Design Then Return + If Not Me.Enabled Then Return + bPressed = Mouse.Inside($hDrawingArea) + + If $bPressed <> bPressed Then + $bPressed = bPressed + $hDrawingArea.Refresh + Endif + +End + + +Public Sub DrawingArea_MouseUp() + + If Not Mouse.Left Then Return + If Me.Design Then Return + If Not Me.Enabled Then Return + If Not $bPressed Then Return + + $bPressed = False + $hDrawingArea.Refresh + + If Not ($bInsideArrow Or $bMenuOnly) Then Button_Click + +End + +Public Sub DrawingArea_Draw() + + Dim X, X2, Y, W As Integer + Dim iFlag As Integer + Dim sText As String + Dim bFlat As Boolean + Dim bDrawArrow As Boolean + Dim iFg As Integer + Dim hFont As Font + Dim bMenu As Boolean + Dim iAlign As Integer + Dim DS As Integer = Desktop.Scale + + iFlag = Style.StateOf($hDrawingArea) + + If $hCurrent Then + If $hCurrent = Me Then iFlag = iFlag Or Draw.Hover + Else + If $bInside Then iFlag = iFlag Or Draw.Hover + Endif + 'If $bInside And If Me.Enabled And If Not Me.Design Then iFlag += Draw.Hover + 'If Not Me.Enabled Then iFlag += Draw.Disabled + If $hDrawingArea.HasFocus Then iFlag += Draw.Hover + + bDrawArrow = $bArrow And (Me.W > DS * 4) + + '' TODO: System.RightToLeft + + bFlat = Not $bBorder 'And Not $bInside + If Me = $hCurrent Then bMenu = True + + If bMenu Then + Paint.FillRect(1, 1, Me.W - 2, Me.H - 2, Color.SelectedBackground) + Else If $bInsideArrow Or If $bMenuOnly Then + Style.PaintButton(0, 0, Me.W, Me.H, False, iFlag, bFlat) + Else + Style.PaintButton(0, 0, Me.W, Me.H, $bPressed, iFlag, bFlat) + Endif + + If $hPicture Then + + If System.RightToLeft Then + X = Paint.W - DS - $hPicture.W + Else + X = DS + Endif + + If Me.Enabled Then + Paint.DrawPicture($hPicture, X, (Me.H - $hPicture.H) / 2) + Else + Paint.DrawImage($hPicture.Image.Desaturate(), X, (Me.H - $hPicture.H) / 2) + Endif + + Endif + + If bDrawArrow Then + If System.RightToLeft Then + Style.PaintArrow(DS, 0, DS, Me.H, Align.Bottom, iFlag) + Else + Style.PaintArrow(Me.W - DS * 2, 0, DS, Me.H, Align.Bottom, iFlag) + Endif + Endif + + If $sActualText Then + + iFg = Style.ForegroundOf(Me) + If Not Me.Enabled Then iFg = Color.Merge(Color.ButtonBackground, iFg) + If bMenu Then iFg = Color.SelectedForeground + Paint.Background = iFg + + sText = $sActualText + + X = DS + W = Me.W - DS * 2 + + If Not $hPicture And If Not bDrawArrow Then + iAlign = Align.Center + Else + iAlign = Align.Normal + If $hPicture Then + W -= $hPicture.W + DS + If Not System.RightToLeft Then X += $hPicture.W + DS + Endif + If bDrawArrow Then + If System.RightToLeft Then X += DS * 2 + W -= DS * 2 + Endif + Endif + + Paint.ClipRect = Rect(X, 0, W, Me.H) + Paint.DrawText(sText, X, 0, W, Me.H, iAlign) + + If $iShortcutPos Then + hFont = Paint.Font + If iAlign = Align.Center Then X += (W - hFont.TextWidth(sText)) \ 2 + X2 = X + hFont.TextWidth(String.Left(sText, $iShortcutPos)) + X += hFont.TextWidth(String.Left(sText, $iShortcutPos - 1)) + Y = (Me.H - hFont.Height) / 2 + hFont.Ascent + 1 + If System.RightToLeft Then + Paint.FillRect(Paint.W - X, Y, X2 - X, 1, iFg) + Else + Paint.FillRect(X, Y, X2 - X, 1, iFg) + Endif + Endif + Endif + +End + +Public Sub DrawingArea_KeyPress() + + If Key.Code = Key.Space Then + $bPressed = True + $hDrawingArea.Refresh + Else If Key.Code = Key.Tab Then + If $hButton Then + Try Me.Next.SetFocus + Stop Event + Endif + Endif + +End + +Public Sub DrawingArea_KeyRelease() + + If Key.Code = Key.Space Then + $bPressed = False + $hDrawingArea.Refresh + Wait + Button_Click + Endif + +End + +Private Function MenuOnly_Read() As Boolean + + Return $bMenuOnly + +End + +Private Sub MenuOnly_Write(Value As Boolean) + + $bMenuOnly = Value + +End + +Public Sub DrawingArea_Font() + + UpdateSize + +End + +Public Sub _SetLastFocus() + + If $hLastFocus Then + 'Debug " already set" + Return + Endif + $hLastFocus = Application.PreviousControl + ' If $hLastFocus Then + ' Debug $hLastFocus.Name + ' Else + ' Debug "NULL" + ' Endif + +End + + +Public Sub _RestoreLastFocus() + + If $hLastFocus Then + 'Debug $hLastFocus.Name + If $hDrawingArea.HasFocus Then Try $hLastFocus.SetFocus + $hLastFocus = Null + ' Else + ' Debug "NULL" + Endif + +End diff --git a/comp/src/gb.form/.src/Button/SwitchButton.class b/comp/src/gb.form/.src/Button/SwitchButton.class new file mode 100644 index 00000000..d0ff55e7 --- /dev/null +++ b/comp/src/gb.form/.src/Button/SwitchButton.class @@ -0,0 +1,251 @@ +' Gambas class file + +Export + +Inherits UserControl + +Public Const _Properties As String = "*,Action,Value,Animated" +Public Const _DefaultEvent As String = "Click" +Public Const _DefaultSize As String = "16,4" +Public Const _Similar As String = "Button" + +Event Click + +Property Value As Boolean +Property Animated As Boolean +Property Background As Integer + +Private $hDrawingArea As DrawingArea +Private $fValue As Float +Private $fTargetValue As Float +Private $hTimer As Timer +Private $bPressed As Boolean +Private $iBg As Integer = Color.Default +Private $bAnimated As Boolean + +Public Sub _new() + + $hDrawingArea = New DrawingArea(Me) As "DrawingArea" + $hDrawingArea.Focus = True + +End + + +Private Function Animated_Read() As Boolean + + Return $bAnimated + +End + +Private Sub Animated_Write(Value As Boolean) + + $bAnimated = Value + +End + +Private Function Value_Read() As Boolean + + Return $fValue >= 0.5 + +End + +Private Sub Value_Write(Value As Boolean) + + Dim fValue As Float + + If $hTimer Then $hTimer.Stop + fValue = IIf(Value, 1, 0) + If fValue <> $fValue Then + $fValue = fValue + $hDrawingArea.Refresh + Raise Click + Endif + +End + +Public Sub DrawingArea_Draw() + + Dim iCol As Integer + Dim iFlag As Integer = Style.StateOf($hDrawingArea) + Dim X As Float + Dim Y As Integer + Dim DS As Integer + + iCol = Color.Merge(Color.Merge(Color.TextForeground, Color.SelectedBackground, $fValue), Color.Background) + If iFlag And Style.Disabled Then iCol = Color.Merge(iCol, Color.Background, 0.75) + + DS = Desktop.Scale + Paint.Rectangle(DS, (Paint.H - DS * 1.5) / 2, Paint.W - DS * 2, DS * 1.5, DS) + Paint.Background = iCol + Paint.Fill + + X = (Paint.W - DS * 4) * $fValue + DS / 2 + Y = (Paint.H - DS * 3) / 2 + + Paint.Ellipse(X, Y, DS * 3, DS * 3) + Paint.Background = iCol + Paint.Fill() + + iCol = Color.Merge(Color.ButtonBackground, Color.SelectedBackground, $fValue) + If iFlag And Style.Disabled Then iCol = Color.Merge(iCol, Color.Background, 0.75) + + Paint.Ellipse(X + 2, Y + 2, DS * 3 - 4, DS * 3 - 4) + Paint.Background = iCol + Paint.Fill() + + If iFlag And Style.HasFocus Then + Paint.Ellipse(X - DS / 2, Y - DS / 2, DS * 4, DS * 4) + Paint.Background = Color.SetAlpha(Color.SelectedBackground, 200) + Paint.Fill + Endif + + + +End + +Public Sub DrawingArea_Enter() + + $hDrawingArea.Refresh + +End + +Public Sub DrawingArea_Leave() + + $hDrawingArea.Refresh + +End + +Public Sub DrawingArea_GotFocus() + + $hDrawingArea.Refresh + +End + +Public Sub DrawingArea_LostFocus() + + $hDrawingArea.Refresh + +End + + +Public Sub DrawingArea_MouseDown() + + Dim hRect As Rect + + If Not Me.Enabled Then Return + If Me.Design Then Return + If $hTimer And If $hTimer.Enabled Then Return + + If $fValue = 0 Then + hRect = New Rect(0, 0, $hDrawingArea.W / 2, $hDrawingArea.H) + Else If $fValue = 1 Then + hRect = New Rect($hDrawingArea.W / 2, 0, $hDrawingArea.W / 2, $hDrawingArea.H) + Endif + + If Not hRect Then Return + + hRect.Adjust(Style.FrameWidth) + + If Not hRect.Contains(Mouse.X, Mouse.Y) Then Return + + $bPressed = True + $hDrawingArea.Refresh + +End + +Private Sub ToggleAnimate() + + If $bAnimated And If Application.Animations Then + If $fValue < 0.5 Then + $fTargetValue = 1 + Else + $fTargetValue = 0 + Endif + If Not $hTimer Then + $hTimer = New Timer As "Timer" + $hTimer.Delay = 20 + Endif + $hTimer.Start + Else + $hTimer = Null + Me.Value = Not Me.Value + Endif + +End + + +Public Sub DrawingArea_MouseUp() + + If Not Me.Enabled Then Return + If Me.Design Then Return + + If $bPressed Then + $bPressed = False + $hDrawingArea.Refresh + Endif + + ToggleAnimate + +End + +Public Sub Timer_Timer() + + Dim fInc As Float + + fInc = ($fTargetValue - $fValue) / 2 + If Abs(fInc) < 0.01 Then fInc = 0.05 * Sgn(fInc) + $fValue += fInc + + If $fValue < 0 Then + $fValue = 0 + $hTimer.Stop + Raise Click + Else If $fValue > 1 Then + $fValue = 1 + $hTimer.Stop + Raise Click + Endif + + $hDrawingArea.Refresh + +End + +Private Function Background_Read() As Integer + + Return $iBg + +End + +Private Sub Background_Write(Value As Integer) + + $iBg = Value + $hDrawingArea.Refresh + +End + +Public Sub DrawingArea_MouseWheel() + + 'If Not Me.Enabled Then Return + If Not Mouse.Forward Xor Me.Value Then + ToggleAnimate + Endif + +End + +Public Sub DrawingArea_KeyPress() + + Select Key.Code + + Case Key.Left + If Me.Value Then ToggleAnimate + + Case Key.Right + If Not Me.Value Then ToggleAnimate + + Case Key.Space + ToggleAnimate + + + End Select + +End diff --git a/comp/src/gb.form/.src/Color/ColorButton.class b/comp/src/gb.form/.src/Color/ColorButton.class new file mode 100644 index 00000000..2c14b80c --- /dev/null +++ b/comp/src/gb.form/.src/Color/ColorButton.class @@ -0,0 +1,148 @@ +' Gambas class file + +Export +Inherits UserControl + +Event Change +Event Click + +Property Color, Value As Integer +Property Border As Boolean + +Public Const _Properties As String = "*,Value{Color},Border=True" +Public Const _DefaultEvent As String = "Click" +Public Const _DefaultSize As String = "8,4" + +Private $iColor As Integer +Private $hDrawingArea As DrawingArea +Private $bBorder As Boolean = True +Private $bPressed As Boolean +Private $bInside As Boolean + +Public Sub _new() + + $hDrawingArea = New DrawingArea(Me) As "DrawingArea" + + $hDrawingArea.Focus = True + + $bBorder = True + + Me.Proxy = $hDrawingArea + +End + +Public Sub DrawingArea_Draw() + + Dim W, H As Integer + Dim F As Integer = If($bBorder, Style.FrameWidth, 0) + Dim bPressed As Boolean + + bPressed = $bPressed And $bInside + + Style.PaintButton(0, 0, Paint.W, Paint.H, bPressed, Style.StateOf(Last), Not $bBorder) + + F = F * 2 + 4 + + W = Paint.W - F * 2 + H = Paint.H - F * 2 + If W <= 0 Or If H <= 0 Then Return + + 'Paint.FillRect(F, F, W, H, $iColor) + If bPressed Then Inc F + Style.PaintBox(F, F, W, H, Style.Normal, $iColor) + +End + +Private Function Color_Read() As Integer + + Return $iColor + +End + +Private Sub Color_Write(iColor As Integer) + + If iColor = $iColor Then Return + $iColor = iColor + Me.Refresh + Raise Change + +End + +Public Sub DrawingArea_MouseDown() + + $bPressed = True + $bInside = True + $hDrawingArea.Refresh + +End + +Public Sub DrawingArea_MouseMove() + + Dim bInside As Boolean + + If Mouse.X >= 0 And If Mouse.X < $hDrawingArea.W And If Mouse.Y >= 0 And If Mouse.Y < $hDrawingArea.H Then + bInside = True + Else + bInside = False + Endif + + If bInside <> $bInside Then + $bInside = bInside + Me.Refresh + Endif + +End + +Public Sub DrawingArea_MouseUp() + + If $bPressed And $bInside Then + Dialog.Color = $iColor + If Not Dialog.SelectColor() Then + Color_Write(Dialog.Color) + Raise Click + Endif + Endif + + $bPressed = False + $bInside = False + Me.Refresh + +End + +Public Sub DrawingArea_Enter() + + Me.Refresh + +End + +Public Sub DrawingArea_Leave() + + Me.Refresh + +End + +Public Sub DrawingArea_GotFocus() + + Me.Refresh + +End + +Public Sub DrawingArea_LostFocus() + + Me.Refresh + +End + + +Private Function Border_Read() As Boolean + + Return $bBorder + +End + +Private Sub Border_Write(Value As Boolean) + + $bBorder = Value + Me.Refresh + +End diff --git a/comp/src/gb.form/.src/Color/ColorChooser.class b/comp/src/gb.form/.src/Color/ColorChooser.class new file mode 100644 index 00000000..48c681c8 --- /dev/null +++ b/comp/src/gb.form/.src/Color/ColorChooser.class @@ -0,0 +1,113 @@ +' Gambas class file + +Export +Inherits UserControl + +Event Change +Event Activate + +Public Const _Properties As String = "*,Border=True,ShowAlpha,ShowColorMap=True,ShowCustom" +Public Const _DefaultEvent As String = "Change" +Public Const _DefaultSize As String = "36,36" +Public Const _Group As String = "Chooser" +'PUBLIC CONST _DrawWith AS String = "-" + +Property SelectedColor As Integer +Property Value As Integer +Property ShowAlpha As Boolean +Property ShowColorMap As Boolean +Property ShowCustom As Boolean +Property Border As Boolean + +Private frmChooser As FColorChooser + +Public Sub _new() + + frmChooser = New FColorChooser(Me) 'As "frmChooser" + 'Object.Attach(frmChooser, Me, "frmChooser") + +End + +Public Sub _RaiseChange() + + Raise Change + +End + +Private Function SelectedColor_Read() As Integer + + Return frmChooser.GetColor() + +End + +Private Sub SelectedColor_Write(iColor As Integer) + + frmChooser.SetColor(iColor) + +End + +Public Sub _RaiseActivate() + + Raise Activate + +End + +Private Function Value_Read() As Integer + + Return frmChooser.GetColor() + +End + +Private Sub Value_Write(Value As Integer) + + frmChooser.SetColor(Value) + +End + +Private Function ShowAlpha_Read() As Boolean + + Return frmChooser.GetAlpha() + +End + +Private Sub ShowAlpha_Write(Value As Boolean) + + frmChooser.SetAlpha(Value) + +End + +Private Function ShowColorMap_Read() As Boolean + + Return frmChooser.GetColorMap() + +End + +Private Sub ShowColorMap_Write(Value As Boolean) + + frmChooser.SetColorMap(Value) + +End + +Private Function Border_Read() As Boolean + + Return frmChooser.HasBorder() + +End + +Private Sub Border_Write(Value As Boolean) + + frmChooser.SetBorder(Value) + +End + +Private Function ShowCustom_Read() As Boolean + + Return frmChooser.GetCustom() + +End + +Private Sub ShowCustom_Write(Value As Boolean) + + frmChooser.SetCustom(Value) + +End diff --git a/comp/src/gb.form/.src/Color/ColorPalette.class b/comp/src/gb.form/.src/Color/ColorPalette.class new file mode 100644 index 00000000..4a6b3619 --- /dev/null +++ b/comp/src/gb.form/.src/Color/ColorPalette.class @@ -0,0 +1,389 @@ +' Gambas class file + +Export + +Inherits UserControl + +Public Const _Properties As String = "*,Border=True,ReadOnly" +Public Const _DefaultEvent As String = "Click" +Public Const _DefaultSize As String = "36,4" +Public Const _Group As String = "Chooser" + +Event Click +Event Activate + +Property Border As Boolean +Property Colors As Integer[] +Property Index As Integer +Property Current As Integer +Property ReadOnly As Boolean + +Private mnuPopup As Menu +Private mnuRemove As Menu +Private mnuRemoveAll As Menu +Private mnuSort As Menu + +Private $aColors As Integer[] = [Color.Blue, Color.Green, Color.Red, &H808080&, Color.Black, Color.White] + +Private $hView As ScrollArea +Private Const CUSTOM_D As Integer = 6 +Private CUSTOM_W As Integer +Private $iIndex As Integer = -1 +Private $iCurrent As Integer = -1 +Private $bReadOnly As Boolean +Private $iLastIndex As Integer + +Public Sub _new() + + $hView = New ScrollArea(Me) As "View" + $hView.ScrollBar = Scroll.None + $hView.Tracking = True + $hView.Mouse = Mouse.Pointing + 'Me.Background = Color.TextBackground + +End + +Private Function Border_Read() As Boolean + + Return $hView.Border + +End + +Private Sub Border_Write(Value As Boolean) + + $hView.Border = If(Value, Border.Plain, Border.None) + UpdateColors + +End + +Private Sub UpdateColors() + + $hView.ResizeContents($aColors.Count * (CUSTOM_W + CUSTOM_D) + CUSTOM_D, $hView.ClientH) + $hView.Refresh + +End + +Private Function Colors_Read() As Integer[] + + Return $aColors.Copy() + +End + +Private Sub Colors_Write(Value As Integer[]) + + If Not Value Then + $aColors.Clear + Else + $aColors = Value.Copy() + Endif + UpdateColors + +End + +Public Sub Clear() + + $aColors.Clear + UpdateColors + +End + +Public Sub Add((Color) As Integer) + + Dim iPos As Integer + + Do + iPos = $aColors.Find(Color) + If iPos < 0 Then Break + $aColors.Remove(iPos) + Loop + + $aColors.Add(Color) + If $aColors.Count > 32 Then $aColors.Remove(0, $aColors.Count - 32) + + UpdateColors + +End + +Public Sub AddFirst((Color) As Integer) + + Dim iPos As Integer + + Do + iPos = $aColors.Find(Color) + If iPos < 0 Then Break + $aColors.Remove(iPos) + Loop + + $aColors.Add(Color, 0) + If $aColors.Count > 32 Then $aColors.Remove(32, $aColors.Count - 32) + + UpdateColors + +End + +Public Sub Exist((Color) As Integer) As Boolean + + Return $aColors.Exist(Color) + +End + + +Public Sub View_Draw() + + Dim X, Y, W, H As Integer + Dim I As Integer + Dim iColor As Integer + Dim iCurrent As Integer + + 'If Me.Background <> Color.Default Then Paint.FillRect(0, 0, Paint.W, Paint.H, Me.Background) + + If $aColors.Count = 0 Then + Paint.Background = Color.SetAlpha(Color.TextForeground, 192) + Paint.Font.Grade = 5 + Paint.DrawText(("Last colors"), Desktop.Scale, 0, Paint.W, Paint.H, Align.Left) + Return + Endif + + Paint.LineWidth = 0.5 + Paint.LineJoin = Paint.LineJoinMiter + Paint.LineCap = Paint.LineCapButt + + X = CUSTOM_D + Y = CUSTOM_D + W = CUSTOM_W + H = W + + 'Paint.Rectangle(X - 1, Y - 3, Paint.W - X * 2 + 2, Paint.H - Y * 2 + 5) + 'Paint.Clip + + X -= $hView.ScrollX + + iCurrent = $iCurrent + + For I = 0 To $aColors.Max + iColor = $aColors[I] + + Main.PaintColor(X + 2, Y + 2, W - 4, H - 4, iColor) + + If I = iCurrent Or If I = $iIndex And Me.Enabled Then + Paint.Rectangle(X - 0.5, Y - 0.5, W + 1, H + 1) + Paint.LineWidth = 3 + Else + Paint.Rectangle(X + 0.5, Y + 0.5, W - 1, H - 1) + Paint.LineWidth = 1 + Endif + Paint.Background = If(I = iCurrent, Color.TextForeground, Color.LightForeground) + Paint.Stroke + + X += W + CUSTOM_D + If X >= Paint.W Then Break + + Next + +End + +Public Sub View_MouseDown() + + 'Debug Mouse.Left;; $iIndex + If Not Me.Enabled Or If Not Mouse.Left Or If $iIndex < 0 Then Return + + SetCurrent($iIndex) + + Raise Click + +End + +Public Sub View_MouseMove() + + Dim I As Integer + Dim sColor As String + Dim Y As Integer + + 'Debug + + Y = Mouse.ScreenY - $hView.ScreenY + If Y < 0 Or If Y >= $hView.H Then Return + + I = ((Mouse.ScreenX - $hView.ScreenX + $hView.ScrollX - (CUSTOM_D \ 2)) \ (CUSTOM_W + CUSTOM_D)) + If I < 0 Or If I > $aColors.Max Then I = -1 + + If I = $iIndex Then Return + + $iIndex = I + 'Debug I + $iLastIndex = $iIndex + + If I >= 0 Then + sColor = Hex$($aColors[I], 8) + If sColor Begins "00" Then sColor = Mid$(sColor, 3) + $hView.Tooltip = "#" & sColor + Else + $hView.Tooltip = "" + Endif + + $hView.Refresh + +End + +' mnuCustom,0,"",,,,T,,,,T,,,,"","","" +' mnuRemove,1,"Remove color",,,T,T,,,,T,,,,"","icon:/small/delete","" +' mnuRemoveAll,1,"Remove all colors",,,T,T,,,,T,,,,"","icon:/small/clear","" +' mnuSort,1,"Sort colors",,,T,T,,,,T,,,,"","icon:/small/sort-ascent","" +' + + +Public Sub View_Menu() + + If $bReadOnly Then Return + + If Not mnuPopup Then + + mnuPopup = New Menu(Me.Window, True) + + mnuRemove = New Menu(mnuPopup) As "mnuRemove" + mnuRemove.Text = ("Remove color") + mnuRemove.Picture = Picture["icon:/small/delete"] + + mnuRemoveAll = New Menu(mnuPopup) As "mnuRemoveAll" + mnuRemoveAll.Text = ("Remove all colors") + mnuRemoveAll.Picture = Picture["icon:/small/clear"] + + mnuSort = New Menu(mnuPopup) As "mnuSort" + mnuSort.Text = ("Sort colors") + mnuSort.Picture = Picture["icon:/small/sort-ascent"] + + Endif + + mnuPopup.Popup + +End + + +Public Sub View_DblClick() + + If Me.Enabled Then Raise Activate + +End + +Public Sub View_Leave() + + If $iIndex >= 0 Then + $iIndex = -1 + 'Debug -1 + $hView.Refresh + Endif + +End + +Public Sub View_Scroll() + + View_MouseMove + +End + +Public Sub View_Arrange() + + CUSTOM_W = Max(CUSTOM_D, $hView.ClientH - CUSTOM_D * 2) + UpdateColors + +End + +Private Sub SetCurrent(iCurrent As Integer) + + If $iCurrent = iCurrent Then Return + $iCurrent = iCurrent + If $iCurrent >= 0 Then $hView.EnsureVisible(CUSTOM_D + (CUSTOM_W + CUSTOM_D) * $iCurrent - CUSTOM_D, 0, CUSTOM_W + CUSTOM_D * 2, $hView.ClientH) + $hView.Refresh + +End + +Private Function Index_Read() As Integer + + Return $iCurrent + +End + +Private Sub Index_Write(Value As Integer) + + If Value < 0 Or If Value > $aColors.Max Then + Value = -1 + Endif + + SetCurrent(Value) + +End + +Private Function Current_Read() As Integer + + If $iCurrent < 0 Then + Return Color.Transparent + Else + Return $aColors[$iCurrent] + Endif + +End + +Private Sub Current_Write(Value As Integer) + + SetCurrent($aColors.Find(Value)) + +End + +Private Function ReadOnly_Read() As Boolean + + Return $bReadOnly + +End + +Private Sub ReadOnly_Write(Value As Boolean) + + $bReadOnly = Value + $hView.Refresh + +End + +Public Sub mnuRemove_Click() + + If $iLastIndex >= 0 Then + $aColors.Remove($iLastIndex) + UpdateColors + Endif + +End + +Public Sub mnuRemoveAll_Click() + + $aColors.Clear + UpdateColors + +End + +Public Sub mnuSort_Click() + + Dim aSort As New String[] + Dim iColor As Integer + Dim sColor As String + + If $aColors.Count <= 1 Then Return + + For Each iColor In $aColors + With Color[iColor] + aSort.Add(Format(.Alpha, "000") & Format(.Hue, "000") & Format(.Saturation, "000") & Format(.Value, "000") & ":" & CStr(iColor)) + End With + Next + + aSort.Sort(gb.Descent) + $aColors.Clear + For Each sColor In aSort + $aColors.Add(CInt(Mid$(sColor, InStr(sColor, ":") + 1))) + Next + + UpdateColors + +End + +Public Sub View_MouseWheel() + + Stop Event + +End diff --git a/comp/src/gb.form/.src/Color/FColorChooser.class b/comp/src/gb.form/.src/Color/FColorChooser.class new file mode 100644 index 00000000..87de447f --- /dev/null +++ b/comp/src/gb.form/.src/Color/FColorChooser.class @@ -0,0 +1,609 @@ +' Gambas class file + +Private $iColor As Integer +Private $iOldColor As Integer + +'PRIVATE $sSystem AS String + +Private $iHue As Integer +Private $iSat As Integer +Private $iVal As Integer + +Private $bLock As Boolean + +Static Private $hImage As Image +Static Private $hCross As Image +Static Private $hValue As Image + +Private $hMap As Picture +Private $hValueMap As Image + +Private $bHide As Boolean +Private $X As Integer +Private $Y As Integer + +Private $nStdColor As Integer + +Private $hZoom As Picture +Private Const ZOOM_FACTOR As Integer = 6 + +Private $bSnap As Boolean + +Private $bNormal As Boolean + +Private $iNoCustomColor As Integer + +Public Sub _new() + + If Not $hImage Then + $hImage = Image.Load("img/colormap.png") + $hCross = Image.Load("img/cross.png") + $hValue = Image.Load("img/valuemap.png") + Endif + + SetAlpha(False) + +End + +Private Sub GetParent() As ColorChooser + + Return Me.Parent + +End + + +Private Sub MoveCross() + + $bHide = True + dwgColorMap.Refresh($X - 7, $Y - 7, 16, 16) + $bHide = False + If $iHue = 0 Then + $X = 0 + Else + $X = (360 - $iHue) * dwgColorMap.ClientW / 360 + Endif + $Y = (256 - $iSat) * dwgColorMap.ClientH / 256 + dwgColorMap.Refresh($X - 7, $Y - 7, 16, 16) + +End + + +Private Sub RefreshColor(Optional bRGB As Boolean = True, Optional bHSV As Boolean = True) + + $bLock = True + + If bHSV Then + $iHue = Color[$iColor].Hue + $iSat = Color[$iColor].Saturation + $iVal = Color[$iColor].Value + txtH.Value = $iHue + txtS.Value = $iSat + txtV.Value = $iVal + Else + $iHue = txtH.Value + $iSat = txtS.Value + $iVal = txtV.Value + Endif + + If bRGB Then + txtR.Value = Color[$iColor].Red + txtG.Value = Color[$iColor].Green + txtB.Value = Color[$iColor].Blue + txtA.Value = Color[$iColor].Alpha + Endif + + MoveCross + + 'sldValue.Value = $iVal + dwgValue.Refresh + If panAlpha.Visible Then + sldAlpha.Value = txtA.Value + txtHexa.Text = Hex$($iColor, 8) + Else + txtHexa.Text = Hex$($iColor, 6) + Endif + + 'panColor.Background = $iColor + panColor.Refresh + dwgValue.Refresh + + palColor.Current = $iColor + + $bLock = False + + If $iColor <> $iOldColor Then + $iOldColor = $iColor + Inc $iNoCustomColor + GetParent()._RaiseChange() + Dec $iNoCustomColor + Endif + +End + +Public Sub SetColor(iColor As Integer) + + If iColor = $iColor Then Return + + $iColor = iColor + RefreshColor + +End + +Public Function GetColor() As Integer + + If $iNoCustomColor = 0 Then + If GetCustom() Then AddCustomColor($iColor) + Endif + + Return $iColor + +End + +Public Sub Form_Arrange() + + $hMap = $hImage.Stretch(dwgColorMap.Width, dwgColorMap.Height).Picture + $hValueMap = $hValue.Stretch(dwgValue.W - 6, dwgValue.H - 2) + MoveCross + + $nStdColor = 24 + Repeat + If (dwgStdColor.W \ $nStdColor) >= Desktop.Scale * 3 Then Break + $nStdColor \= 2 + Until $nStdColor = 3 + dwgStdColor.Refresh + +End + + +Public Sub txtRGB_Change() + + If $bLock Then Return + $iColor = Color.RGB(txtR.Value, txtG.Value, txtB.Value, txtA.Value) + RefreshColor(False, True) + +End + +Public Sub txtHSV_Change() + + If $bLock Then Return + $iColor = Color.HSV(txtH.Value, txtS.Value, txtV.Value, txtA.Value) + RefreshColor(True, False) + +End + +Public Sub dwgColorMap_Draw() + + If Not $hMap Then Return + + Draw.Picture($hMap, 0, 0) + If $bHide Then Return + Draw.Image($hCross, $X - 7, $Y - 7) + +End + +Public Sub dwgColorMap_MouseMove() + + Dim H, S As Integer + Dim bChange As Boolean + + If Not GetParent().Enabled Then Return + + $bLock = True + H = 359 - (Mouse.ScreenX - Last.ScreenX) * 360 / dwgColorMap.ClientW + S = 255 - (Mouse.ScreenY - Last.ScreenY) * 256 / dwgColorMap.ClientH + If Not (Mouse.Shift Xor $bSnap) Then + + 'iCol = Color.HSV($aHue[I], 192 - (J - 5) * 32, 255, iAlpha) + ' iMax = $aHue.Count - 2 + ' For I = 0 To iMax + ' If I = 0 Then + ' If H < (($aHue[0] + $aHue[1]) / 2) Or If H > (($aHue[iMax] + $aHue[iMax + 1]) / 2) Then Break + ' 'Else If I = iMax Then + ' ' Break + ' Else + ' If H >= (($aHue[I] + $aHue[I - 1]) / 2) And If H < (($aHue[I] + $aHue[I + 1]) / 2) Then Break + ' Endif + ' Next + 'H = $aHue[I] + 'If H = 360 Then H = 0 + + H = ((H + 7) \ 15) * 15 + If H = 360 Then H = 0 + S = ((S + 15) \ 32) * 32 + + Endif + If H <> txtH.Value Or If S <> txtS.Value Then + txtH.Value = H + txtS.Value = S + bChange = True + Endif + $bLock = False + + If bChange Then txtHSV_Change + +End + +Private Sub ChangeSliderValue(hSlider As Slider, hSpinBox As SpinBox) + + Dim iVal As Integer + + iVal = hSlider.Value + If $bNormal Then + If hSlider.Value < 255 Then + iVal = (hSlider.Value \ hSlider.PageStep) * hSlider.PageStep + Endif + $bNormal = False + Endif + + hSpinBox.Value = iVal + If hSlider.Value <> iVal Then hSlider.Value = iVal + +End + + + +' Public Sub sldValue_Change() +' +' ChangeSliderValue(sldValue, txtV) +' +' End + +Private Sub RaiseActivate() + + With GetParent() + If .Enabled Then ._RaiseActivate() + End With + +End + +Public Sub dwgColorMap_DblClick() + + RaiseActivate + +End + +Public Sub dwgColorMap_MouseDown() + + dwgColorMap_MouseMove + +End + +Private Sub LoadCustomColors() + + palColor.Colors = Settings["gb.form/CustomColors"] + +End + +Private Sub SaveCustomColors() + + Settings["gb.form/CustomColors"] = palColor.Colors + Settings.Save + +End + +Private Sub AddCustomColor(iColor As Integer) + + palColor.AddFirst(iColor) + SaveCustomColors + +End + + +Public Sub Form_Open() + + RefreshColor + 'txtHexa.SetFocus + +End + + +' PUBLIC SUB lstSystem_DblClick() +' +' RAISE Confirm +' +' END +' +' PUBLIC SUB lstSystem_Click() +' +' $sSystem = lstSystem.Text +' +' END +' +' PUBLIC SUB tabColor_Click() +' +' IF tabColor.Index = 0 THEN Form_Resize +' +' END + +Public Sub panColor_DblClick() + + RaiseActivate + +End + + + +Public Sub panColor_Draw() + + Dim X, Y As Integer + Dim W, H As Integer + + If $hZoom Then + + W = (panColor.W + 3) \ ZOOM_FACTOR + H = (panColor.H + 3) \ ZOOM_FACTOR + + Draw.LineStyle = Line.None + Draw.Zoom($hZoom.Image, ZOOM_FACTOR, 0, 0) + Draw.LineStyle = Line.Solid + X = ((W \ 2)) * ZOOM_FACTOR + Y = ((H \ 2)) * ZOOM_FACTOR + Draw.Foreground = Color.LightForeground + Draw.Rect(X - 2, Y - 2, ZOOM_FACTOR + 4, ZOOM_FACTOR + 4) + Draw.Foreground = Color.Background + Draw.Rect(X - 1, Y - 1, ZOOM_FACTOR + 2, ZOOM_FACTOR + 2) + 'Draw.Rect(X, Y, ZOOM_FACTOR, ZOOM_FACTOR) + Return + + Endif + + Main.PaintColor(0, 0, Paint.W, Paint.H, $iColor) + +End + +Public Sub GetAlpha() As Boolean + + Return panAlpha.Visible + +End + +Public Sub SetAlpha(Value As Boolean) + + Dim H As Integer + + panAlpha.Visible = Value + If Not Value Then txtA.Value = 0 + + H = panAlpha.H * 3 + Desktop.Scale * 2 + If panAlpha.Visible Then H += panAlpha.H + Desktop.Scale + panInfo.H = H + + RefreshColor(False, False) + +End + +Public Sub txtHexa_Change() + + Dim iColor As Integer + + If $bLock Then Return + If panAlpha.Visible Then + If txtHexa.Length <> 8 Then Return + Else + If txtHexa.Length <> 6 Then Return + Endif + Try iColor = Val("&H" & txtHexa.Text & "&") + If Error Then Return + If iColor = $iColor Then Return + $iColor = iColor + RefreshColor(True, True) + +End + +Public Sub sldAlpha_Change() + + ChangeSliderValue(sldAlpha, txtA) + +End + +' Public Sub panInfoColor_Arrange() +' +' panColor.H = Min(panInfoColor.W, panInfoColor.H - txtHexa.Y - txtHexa.H - Desktop.Scale) +' +' End + +' Public Sub sldValue_MouseMove() +' +' If Mouse.Normal Then +' sldValue.Step = 16 +' Else +' sldValue.Step = 1 +' Endif +' +' End + +' Public Sub sldValue_MouseMove() +' +' $bNormal = Mouse.Normal +' +' End + +Public Sub sldAlpha_MouseMove() + + $bNormal = Mouse.Normal + +End + +Public Sub dwgStdColor_Draw() + + Dim X, H, W, iStep As Integer + + If $nStdColor = 0 Then Return + iStep = 360 \ $nStdColor + Draw.Foreground = Color.Gray + For H = 0 To 359 Step iStep + X = dwgStdColor.W * H / 360 + W = Min(dwgStdColor.W * (H + iStep) / 360, dwgStdColor.W - 1) - X + Draw.FillRect(X + 1, 1, W, dwgStdColor.H - 2, Color.HSV(360 - H, 255, 255)) + Draw.Line(X, 0, X, dwgStdColor.H - 1) + Next + +End + +Public Sub dwgStdColor_MouseMove() + + Dim iStep As Integer + + If Not GetParent().Enabled Then Return + + iStep = 360 \ $nStdColor + SetColor(Color.HSV(360 - Int(Max(0, Min(dwgStdColor.W - 1, Mouse.X)) / dwgStdColor.W * 360 / iStep) * iStep, 255, 255)) + +End + +Public Sub dwgStdColor_MouseDown() + + dwgStdColor_MouseMove + +End + +Public Sub dwgValue_Draw() + + Dim Y As Integer + Dim hImage As Image + + hImage = $hValueMap.Copy() + hImage.Colorize(Color.HSV($iHue, $iSat, 255)) + Draw.Image(hImage, 3, 1) + Draw.Foreground = Color.LightForeground + Draw.Rect(2, 0, dwgValue.W - 4, dwgValue.H) + Y = (256 - $iVal) / 256 * dwgValue.H + Y = Max(0, Min(dwgValue.H - 15, Y - 8)) + Draw.Rect(0, Y, dwgValue.W, 15) + Draw.Rect(1, Y + 1, dwgValue.W - 2, 13) + Draw.Rect(2, Y + 2, dwgValue.W - 4, 11) + +End + +Public Sub dwgValue_MouseDown() + + dwgValue_MouseMove + +End + +Public Sub dwgValue_MouseMove() + + Dim V As Integer + + If Not GetParent().Enabled Then Return + + V = Mouse.Y / dwgValue.H * 256 + If Not (Mouse.Shift Xor $bSnap) Then V = ((V + 16) \ 32) * 32 + V = Min(255, Max(0, 256 - V)) + If V = $iVal Then Return + txtV.Value = V + +End + +Public Sub txtHexa_Click() + + panGrab.Mouse = Mouse.Cross + 'panGrab.Cursor = New Cursor(txtHexa.Picture, 0, txtHexa.Picture.H - 1) + panGrab.Show + panGrab_MouseMove + panGrab.Grab + $hZoom = Null + panColor.Refresh 'SetColor(hPict.Image[0, 0]) + panGrab.Hide + +End + +Public Sub panGrab_MouseMove() + + Dim W, H As Integer + + W = (panColor.W + 3) \ ZOOM_FACTOR + H = (panColor.H + 3) \ ZOOM_FACTOR + + $hZoom = Desktop.Screenshot(Mouse.ScreenX - W \ 2, Mouse.ScreenY - H \ 2, W, H) + panColor.Refresh 'SetColor(hPict.Image[0, 0]) + +End + +Public Sub panGrab_MouseUp() + + Dim hPict As Picture = Desktop.Screenshot(Mouse.ScreenX, Mouse.ScreenY, 1, 1) + SetColor(hPict.Image[0, 0]) + +End + +Public Sub btnSnap_Click() + + $bSnap = Not btnSnap.Value + +End + +Public Sub GetColorMap() As Boolean + + Return dwgColorMap.Visible + +End + + +Public Sub SetColorMap(bShow As Boolean) + + dwgColorMap.Visible = bShow + panColorMapSide.Visible = bShow + +End + +Public Sub dwgStdColor_DblClick() + + RaiseActivate + +End + +Public Sub HasBorder() As Boolean + + Return panBorder.Border <> Border.None + +End + +Public Sub SetBorder(bBorder As Boolean) + + panBorder.Border = If(bBorder, Border.Plain, Border.None) + panBorder.Margin = bBorder + +End + +Public Sub GetCustom() As Boolean + + Return palColor.Visible + +End + +Public Sub SetCustom(bCustom As Boolean) + + If bCustom Then LoadCustomColors + palColor.Visible = bCustom + +End + + +Public Sub palColor_Click() + + SetColor(palColor.Current) + +End + +Public Sub palColor_Activate() + + GetParent()._RaiseActivate() + +End + +Public Sub panValue_Arrange() + + txtA.W = txtR.W + +End + +Public Sub dwgValue_MouseWheel() + + If Mouse.Delta > 0 Then + txtV.Value = Min(255, (txtV.Value + 16) And Not 15) + Else + txtV.Value = Max(0, (txtV.Value - 1) And Not 15) + Endif + +End diff --git a/comp/src/gb.form/.src/Color/FColorChooser.form b/comp/src/gb.form/.src/Color/FColorChooser.form new file mode 100644 index 00000000..6117d77a --- /dev/null +++ b/comp/src/gb.form/.src/Color/FColorChooser.form @@ -0,0 +1,192 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(9.125,8,70,70) + Arrangement = Arrange.Fill + { panBorder Panel + MoveScaled(3,3,66,66) + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + Border = Border.Plain + { HBox1 HBox + MoveScaled(0,0,57,32) + Expand = True + Spacing = True + { VBox3 VBox + MoveScaled(1,1,39,27) + Expand = True + Spacing = True + { dwgStdColor DrawingArea + MoveScaled(1,1,33,4) + Mouse = Mouse.Pointing + Border = Border.Plain + } + { dwgColorMap DrawingArea + MoveScaled(3,6,25,20) + Mouse = Mouse.Cross + Expand = True + Border = Border.Plain + } + } + { panColorMapSide VBox + MoveScaled(49,2,4,26) + Spacing = True + { btnSnap ToolButton + MoveScaled(0,0,4,4) + ToolTip = ("Follow color grid") + Picture = Picture["icon:/small/grid"] + Toggle = True + Value = True + } + { dwgValue DrawingArea + MoveScaled(0,6,4,20) + Mouse = Mouse.Pointing + Expand = True + } + } + } + { panInfo HBox + MoveScaled(0,34,62,20) + Spacing = True + { panValue VBox + MoveScaled(1,1,31,19) + Expand = True + Spacing = True + { Panel1 HBox + MoveScaled(0,0,29,4) + Spacing = True + { PictureBox1 PictureBox + MoveScaled(0,0,3,4) + Picture = Picture["icon:/small/red"] + Alignment = Align.Center + Mode = PictureBox.Contain + } + { txtR SpinBox txtRGB + Name = "txtR" + MoveScaled(4,0,7,4) + Expand = True + MaxValue = 255 + } + { PictureBox5 PictureBox + MoveScaled(14,0,3,4) + Picture = Picture["icon:/small/hue"] + Alignment = Align.Center + Mode = PictureBox.Contain + } + { txtH SpinBox txtHSV + Name = "txtH" + MoveScaled(19,0,7,4) + Expand = True + MaxValue = 359 + } + } + { Panel3 HBox + MoveScaled(0,5,29,4) + Spacing = True + { PictureBox2 PictureBox + MoveScaled(0,0,3,4) + Picture = Picture["icon:/small/green"] + Alignment = Align.Center + Mode = PictureBox.Contain + } + { txtG SpinBox txtRGB + Name = "txtG" + MoveScaled(4,0,7,4) + Expand = True + MaxValue = 255 + } + { PictureBox6 PictureBox + MoveScaled(14,0,3,4) + Picture = Picture["icon:/small/saturation"] + Alignment = Align.Center + Mode = PictureBox.Contain + } + { txtS SpinBox txtHSV + Name = "txtS" + MoveScaled(19,0,7,4) + Expand = True + MaxValue = 255 + } + } + { Panel4 HBox + MoveScaled(0,10,29,4) + Spacing = True + { PictureBox3 PictureBox + MoveScaled(0,0,3,4) + Picture = Picture["icon:/small/blue"] + Alignment = Align.Center + Mode = PictureBox.Contain + } + { txtB SpinBox txtRGB + Name = "txtB" + MoveScaled(4,0,7,4) + Expand = True + MaxValue = 255 + } + { PictureBox7 PictureBox + MoveScaled(14,0,3,4) + Picture = Picture["icon:/small/lightness"] + Alignment = Align.Center + Mode = PictureBox.Contain + } + { txtV SpinBox txtHSV + Name = "txtV" + MoveScaled(19,0,7,4) + Expand = True + MaxValue = 255 + } + } + { panAlpha HBox + MoveScaled(0,15,29,4) + Visible = False + Spacing = True + { PictureBox4 PictureBox + MoveScaled(0,0,3,4) + Picture = Picture["icon:/small/transparency"] + Alignment = Align.Center + Mode = PictureBox.Contain + } + { txtA SpinBox txtRGB + Name = "txtA" + MoveScaled(4,0,7,4) + MaxValue = 255 + } + { sldAlpha Slider + MoveScaled(15,0,12,4) + Expand = True + MaxValue = 255 + PageStep = 32 + } + } + } + { Panel2 Panel + MoveScaled(32,11,1,3) + } + { VBox1 VBox + MoveScaled(34,1,15,19) + Spacing = True + { panColor DrawingArea + MoveScaled(0,0,11,6) + Expand = True + Border = Border.Plain + } + { txtHexa ButtonBox + MoveScaled(0,9,13,4) + Picture = Picture["icon:/small/color-picker"] + } + { panGrab Panel + MoveScaled(4,15,3,3) + Visible = False + Tracking = True + Mouse = Mouse.Cross + Ignore = True + } + } + } + { palColor ColorPalette + MoveScaled(2,56,61,6) + Visible = False + } + } +} diff --git a/comp/src/gb.form/.src/Completion.class b/comp/src/gb.form/.src/Completion.class new file mode 100644 index 00000000..f7d8e624 --- /dev/null +++ b/comp/src/gb.form/.src/Completion.class @@ -0,0 +1,342 @@ +' Gambas class file + +Export + +Event Activate + +Public List As String[] +Public Icons As String[] +Public Start As Integer + +Property Delay As Integer +Property Editor As Control + +Private $hObserver As Observer +Private $hTimer As Timer +Private $hPopup As Window +Private $hList As GridView +Private $hWatcher As Watcher +Private $bExplicit As Boolean +Private $hObsWindow As Observer +Private $iHeight As Integer + +Private Sub FindEditor(hCtrl As Control) As Control + + If hCtrl Is Container Then + For Each hCtrl In Container(hCtrl).Children + If hCtrl Is TextBox Or If hCtrl Is TextArea Then Return hCtrl + Next + Else If hCtrl Is TextBox Or If hCtrl Is TextArea Then + Return hCtrl + Endif + +End + +Private Sub GetEditor() As Object + + Return $hObserver.Object + +End + +Public Sub _new(hCtrl As Control) + + $hTimer = New Timer As "Timer" + $hTimer.Delay = 350 + + Attach(hCtrl) + +End + +Private Sub Attach(hCtrl As Control) + + hCtrl = FindEditor(hCtrl) + If Not hCtrl Then Error.Raise("Unable to find TextBox or TextArea") + + HideList + + $hObserver = New Observer(hCtrl) As "TextBox" + $hWatcher = New Watcher(hCtrl) As "TextBox" + +End + + +Public Sub Open() + + HideList + $bExplicit = True + Timer_Timer + +End + +Public Sub Close() + + HideList + +End + + +Public Sub TextBox_Change() + + If Last.Length = 0 Then HideList + $hTimer.Start + +End + +Private Sub HideList() + + If $hPopup And If $hPopup.Visible Then + 'Debug System.Backtrace.Join(" ") + $hPopup.Hide + $hObsWindow = Null + Endif + $hTimer.Stop + +End + +Public Sub TextBox_KeyPress() + + Dim iRow As Integer + + If $hPopup And If $hPopup.Visible Then + + Select Case Key.Code + + Case Key.Down, Key.PageDown + iRow = Min($hList.Rows.Max, $hList.Row + If(Key.Code = Key.Down, 1, $hList.ClientH \ $hList.Rows.H)) + $hList.Row = iRow + Stop Event + Return + + Case Key.Up, Key.PageUp + iRow = Max(0, $hList.Row - If(Key.Code = Key.Up, 1, $hList.ClientH \ $hList.Rows.H)) + $hList.Row = iRow + Stop Event + Return + + Case Key.Left, Key.Right + HideList + Return + + Case Key.Home + $hList.Row = 0 + Stop Event + Return + + Case Key.End + $hList.Row = $hList.Rows.Count - 1 + Stop Event + Return + + Case Key.Enter, Key.Return + GridView_MouseUp + Stop Event + Return + + Case Key.Escape + HideList + Stop Event + Return + + End Select + + Else + + If Key.Code = Key.Space And If Key.Control Then + Me.Open + Stop Event + Endif + + Endif + +End + +Private Sub MovePopup() + + Dim hCtrl As Object + Dim hPos As Point + + If Not $hPopup Then Return + + hCtrl = GetEditor() + hPos = hCtrl.CursorAt(Start) + + 'X = hCtrl.Font.TextWidth(String.Left(hCtrl.Text, Start)) + 'Y = hCtrl.ScreenY + hCtrl.H + + $hPopup.Move(hCtrl.ScreenX + hPos.X, hCtrl.ScreenY + hPos.Y, Desktop.Scale * 48, $iHeight) + +End + +Public Sub Timer_Timer() + + Dim aList As String[] + Dim hCtrl As Control + Dim hPanel As Panel + Dim hEditor As Object + + $hTimer.Stop + + List = Null + hEditor = GetEditor() + Me.Fill(String.Left(hEditor.Text, hEditor.Pos), $bExplicit) + aList = List + + $bExplicit = False + If Not aList Or If aList.Count = 0 Then Return + + hCtrl = GetEditor() + Object.Lock(hCtrl) + + If Not $hPopup Then + + $hPopup = New Window As "Popup" + $hPopup.Arrangement = Arrange.Fill + $hPopup.Border = False + $hPopup.SkipTaskbar = True + $hPopup.Stacking = Window.Above + $hPopup.Persistent = True + $hPopup.TakeFocus = False + + hPanel = New Panel($hPopup) + hPanel.Arrangement = Arrange.Fill + HPanel.Foreground = Color.Black + hPanel.Border = Border.Plain + + $hList = New GridView(hPanel) As "GridView" + $hList.Border = False + $hList.Grid = False + $hList.Mode = Select.Single + $hList.ScrollBar = Scroll.Vertical + $hList.Columns.Count = 1 + $hList.Padding = 0 + + Endif + + $hList.Rows.Count = aList.Count + $hList.Row = 0 'Me.GetIndex() + + $iHeight = $hList.Rows.Height * Min(8, aList.Count) + 2 + + MovePopup + $hPopup.Show + '$hPopup.Raise + $hObsWindow = New Observer(hCtrl.Window) As "Window" + + Object.Unlock(hCtrl) + +End + +' Public Sub Popup_Activate() +' +' With GetEditor() +' .Window.Show +' .SetFocus +' End With +' +' End + +Public Sub TextBox_Hide() + + HideList + +End + +Public Sub TextBox_Move() + + MovePopup + +End + +Public Sub TextBox_Resize() + + MovePopup + +End + +Private Sub DeletePopup() + + If $hPopup Then + $hPopup.Delete + $hPopup = Null + Endif + +End + +Public Sub TextBox_LostFocus() + + If Not $hPopup Then Return + If $hList.HasFocus Then Return + + HideList + DeletePopup + +End + +Public Sub GridView_GotFocus() + + GetEditor().Window.Activate + GetEditor().SetFocus + +End + +Private Function Delay_Read() As Integer + + Return $hTimer.Delay + +End + +Private Sub Delay_Write(Value As Integer) + + $hTimer.Delay = Value + +End + +Public Sub GridView_MouseUp() + + Dim hCtrl As Object + Dim sElt As String + + Try sElt = List[$hList.Row] + If Error Then Return + + hCtrl = GetEditor() + + Try hCtrl.Text = String.Left(hCtrl.Text, Start) & sElt & String.Mid(hCtrl.Text, hCtrl.Pos + 1) + Try hCtrl.Pos = Start + String.Len(sElt) + HideList + 'hCtrl.SetFocus + Raise Activate + +End + +Public Sub GridView_Data(Row As Integer, (Column) As Integer) + + Try $hList.Data.Text = List[Row] + If Icons Then Try $hList.Data.Picture = Picture[Icons[Row]] + +End + +Public Sub Fill(Text As String, Explicit As Boolean) + + If Len(Text) < 3 Or If Explicit Then Return + List = ["Gambas", "Almost", "Means", "Basic!", Text] + +End + +Private Function Editor_Read() As Control + + Return $hObserver.Object + +End + +Public Sub Window_Move() + + MovePopup + +End + +Private Sub Editor_Write(Value As Control) + + Attach(Value) + +End diff --git a/comp/src/gb.form/.src/Date/DateBox.class b/comp/src/gb.form/.src/Date/DateBox.class new file mode 100644 index 00000000..0c2ae9d2 --- /dev/null +++ b/comp/src/gb.form/.src/Date/DateBox.class @@ -0,0 +1,286 @@ +' Gambas class file + +Export +Inherits UserControl + +Public Const _Properties As String = "*,Action,Value,ReadOnly,Border=True,Mode{DateChooser.*}=DateOnly" +'Public Const _DefaultEvent As String = "Click" +Public Const _DefaultSize As String = "24,4" +Public Const _Similar As String = "TextBox" +Public Const _Group As String = "Chooser" + +Event Activate +Event Click +Event Change + +Property Value As Date +Property ReadOnly As Boolean +Property Border As Boolean +Property Mode As Integer +Property Read Text As String + +Private $hButtonBox As ButtonBox +Private $hPopup As Window +Private $hChooser As DateChooser +Private $bShowDate As Boolean = True +Private $bShowTime As Boolean + +Private Sub GetDateFormat() As String + + Dim sFormat As String + + If $bShowDate Then + sFormat = Format(Date(3333, 11, 22), gb.ShortDate) + sFormat = Replace(sFormat, "3333", "yyyy") + sFormat = Replace(sFormat, "22", "dd") + sFormat = Replace(sFormat, "11", "mm") + Endif + + If $bShowTime Then + sFormat &= " " & Format(Time(11, 22, 33), gb.ShortTime) + sFormat = Replace(sFormat, "11", "hh") + sFormat = Replace(sFormat, "22", "nn") + sFormat = Replace(sFormat, "33", "ss") + Endif + + Return LTrim(sFormat) + +End + +Private Sub GetNullDate() As String + + Dim sFormat As String + + If $bShowDate Then + sFormat = Format(Date(1111, 11, 11), gb.ShortDate) + sFormat = Replace(sFormat, "1", "0") + Endif + + If $bShowTime Then + sFormat &= " " & Format(Time(11, 11, 11), gb.ShortTime) + sFormat = Replace(sFormat, "1", "0") + Endif + + Return LTrim(sFormat) + +End + + +Private Sub UpdateMask() + + Dim sMask As String + Dim vVal As Date + + vVal = Value_Read() + + If $bShowDate Then sMask = Format(Date(1111, 11, 11), gb.ShortDate) + If $bShowTime Then sMask = LTrim(sMask & " " & Format(Time(11, 11, 11), gb.ShortTime)) + + If $bShowDate Then + $hButtonBox.Picture = Picture["icon:/16/calendar"] + Else + $hButtonBox.Picture = Picture["icon:/16/clock"] + Endif + + $hButtonBox.Editor.Mask = Replace(sMask, "1", "0") + + Value_Write(vVal) + +End + + +Public Sub _new() + + Dim (hPanel) As Panel + + $hButtonBox = New ButtonBox(Me) As "ButtonBox" + $hButtonBox.Picture = Picture["icon:/small/calendar"] + $hButtonBox.Alignment = Align.Right + + $hPopup = New Window As "PopupWindow" + $hPopup.Persistent = True + $hPopup.Arrangement = Arrange.Fill + + hPanel = New Panel($hPopup) + hPanel.Arrangement = Arrange.Horizontal + hPanel.Border = Border.Plain + + $hChooser = New DateChooser(hPanel) As "DateChooser" + $hChooser.Expand = True + $hChooser.Border = False + + Me.Proxy = $hButtonBox + + UpdateMask + Value_Write(Null) + +End + +Private Function Value_Read() As Date + + Dim vVal As Variant + + If Not $bShowDate Then + vVal = Time(Val(Format(Date(1, 1, 1), "dd/mm/yyyy") & " " & $hButtonBox.Text)) + Else + vVal = Val($hButtonBox.Text) + Endif + + If vVal And If TypeOf(vVal) = gb.Date Then Return vVal + +End + +Private Sub Value_Write(Value As Date) + + If IsNull(Value) Then + $hButtonBox.Text = GetNullDate() + Else + $hButtonBox.Text = Format(Value, GetDateFormat()) + Endif +End + +Public Sub ButtonBox_Click() + + Dim X, Y, iPad As Integer + Dim dDate As Date + + If $bShowTime And $bShowDate Then + $hPopup.Resize(Desktop.Scale * 48 + 2, ((Desktop.Scale * 24) \ 12) * 12 + 2) + Else If $bShowDate + $hPopup.Resize(Desktop.Scale * 32 + 2, Desktop.Scale * 24) + Else + $hPopup.Resize(Desktop.Scale * 16 + 2, ((Desktop.Scale * 24) \ 12) * 12 + 2) + Endif + + iPad = If($hButtonBox.Border, 3, 0) + X = $hButtonBox.ScreenX + $hButtonBox.W - $hPopup.W - iPad + Y = $hButtonBox.ScreenY + $hButtonBox.H - iPad + + If (Y + $hPopup.H) > Desktop.H Then + Y = $hButtonBox.ScreenY - $hPopup.H + Endif + + dDate = Me.Value + If dDate Then + $hChooser.Value = dDate + Else + $hChooser.Value = Now + Endif + + $hPopup.ShowPopup(X, Y) + '$hPopup.ShowModal + +End + +Public Sub ButtonBox_KeyPress() + + If Key.Code = Key.Space Then + ButtonBox_Click + Stop Event + ' Else If Key.Code = Key.BackSpace Or If Key.Code = Key.Delete Then + ' Debug + ' If $hButtonBox.Editor.Selection.Length = $hButtonBox.Editor.Length Then + ' Me.Value = Null + ' Stop Event + ' Endif + Endif + +End + +Public Sub ButtonBox_Activate() + + Raise Activate + +End + +Public Sub ButtonBox_Change() + + Raise Change + +End + +Public Sub PopupWindow_Open() + + $hChooser.SetFocus + +End + +Private Function ReadOnly_Read() As Boolean + + Return $hButtonBox.ReadOnly + +End + +Private Sub ReadOnly_Write(Value As Boolean) + + $hButtonBox.ReadOnly = Value + +End + +Private Function Border_Read() As Boolean + + Return $hButtonBox.Border + +End + +Private Sub Border_Write(Value As Boolean) + + $hButtonBox.Border = Value + +End + +Public Sub DateChooser_Click() + + Me.Value = $hChooser.Value + $hPopup.Close + Raise Click + +End + +Public Sub DateChooser_Cancel() + + $hPopup.Close + +End + +Private Function Mode_Read() As Integer + + If $bShowDate Then + If $bShowTime Then + Return DateChooser.DateTime + Else + Return DateChooser.DateOnly + Endif + Else + Return DateChooser.TimeOnly + Endif + +End + +Private Sub Mode_Write(Value As Integer) + + Select Case Value + Case DateChooser.DateOnly + $bShowDate = True + $bShowTime = False + Case DateChooser.DateTime + $bShowDate = True + $bShowTime = True + Case DateChooser.TimeOnly + $bShowDate = False + $bShowTime = True + Default + Return + End Select + + $hChooser.Mode = Value + + UpdateMask + +End + +Private Function Text_Read() As String + + Return $hButtonBox.Text + +End diff --git a/comp/src/gb.form/.src/Date/DateChooser.class b/comp/src/gb.form/.src/Date/DateChooser.class new file mode 100644 index 00000000..a8910700 --- /dev/null +++ b/comp/src/gb.form/.src/Date/DateChooser.class @@ -0,0 +1,265 @@ +' Gambas class file + +Export +Inherits UserControl + +Property Value As Date +Property Year As Integer +Property Month As Integer +Property Day As Integer +Property Font As Font +Property Read Colors As _DateChooser_Colors +Property Mode As Integer +Property Read Data As _DateChooser_Data +Property Border As Boolean +Property MinValue As Date +Property MaxValue As Date + +Public Const DateOnly As Integer = 0 +Public Const DateTime As Integer = 1 +Public Const TimeOnly As Integer = 2 + +Event Change +Event Click +Event Activate +Event Cancel +Event Data({Date} As Date) + +Public Const _Properties As String = "*,Border=True,Mode{DateChooser.*}=DateOnly" +Public Const _DefaultEvent As String = "Change" +Public Const _DefaultSize As String = "40,28" +Public Const _Group As String = "Chooser" + +Private $hCal As FCalendar +Private $cData As New Collection +Private $hData As _DateChooser_Data +Private $dDateMin As Date +Private $dDateMax As Date + +Public Sub _new() + + $hCal = New FCalendar(Me) + +End + +Private Function Value_Read() As Date + + Return $hCal.GetValue() + +End + +Private Sub Value_Write(Value As Date) + + $hCal.SetValue(Value) + +End + +Public Sub _Change() + + Raise Change + +End + +Public Sub _Click() + + Raise Click + +End + +Public Sub _Activate() + + Raise Activate + +End + +Public Sub _Cancel() + + Raise Cancel + +End + +Private Function Year_Read() As Integer + + Return Year(Value_Read()) + +End + +Private Sub Year_Write(Value As Integer) + + Dim dDate As Date = Value_Read() + + dDate = Date(Value, Month(dDate), Day(dDate)) + Value_Write(dDate) + +End + +Private Function Month_Read() As Integer + + Return Month(Value_Read()) + +End + +Private Sub Month_Write(Value As Integer) + + Dim dDate As Date = Value_Read() + + dDate = Date(Year(dDate), Value, Day(dDate)) + Value_Write(dDate) + +End + +Private Function Day_Read() As Integer + + Return Day(Value_Read()) + +End + +Private Sub Day_Write(Value As Integer) + + Dim dDate As Date = Value_Read() + + dDate = Date(Year(dDate), Month(dDate), Value) + Value_Write(dDate) + +End + +Private Function Font_Read() As Font + + Return Super.Font + +End + +Private Sub Font_Write(Value As Font) + + Super.Font = Value + $hCal.UpdateFont + +End + +Private Function Colors_Read() As _DateChooser_Colors + + _DateChooser_Colors._Calendar = $hCal + Return _DateChooser_Colors + +End + + +Public Sub SetFocus() + + $hCal.SetFocus + +End + +Private Function Mode_Read() As Integer + + If $hCal.GetShowDate() Then + If $hCal.GetShowTime() Then + Return DateTime + Else + Return DateOnly + Endif + Else + Return TimeOnly + Endif + +End + +Private Sub Mode_Write(Value As Integer) + + Select Case Value + Case DateOnly + $hCal.SetShowDate(True) + $hCal.SetShowTime(False) + Case DateTime + $hCal.SetShowDate(True) + $hCal.SetShowTime(True) + Case TimeOnly + $hCal.SetShowTime(True) + $hCal.SetShowDate(False) + End Select + +End + +Public Sub _get({Date} As Date) As _DateChooser_Date + + Dim hDate As _DateChooser_Date + + hDate = New _DateChooser_Date + hDate._Date = {Date} + hDate._View = Me + Return hDate + +End + +Private Sub GetKey(dDate As Date) As String + + Return CStr(Date(dDate)) + +End + + +Public Sub _GetData(dDate As Date, Optional bCreate As Boolean) As _DateChooser_Data + + Dim hData As _DateChooser_Data + + hData = $cData[GetKey(dDate)] + If Not hData Then + If bCreate Then + hData = New _DateChooser_Data + hData.Font = Me.Font + $cData[GetKey(dDate)] = hData + Else + $hData = New _DateChooser_Data + $hData.Font = Me.Font + Raise Data(dDate) + hData = $hData + Endif + Endif + + Return hData + +End + +Private Function Data_Read() As _DateChooser_Data + + Return $hData + +End + +Private Function Border_Read() As Boolean + + Return $hCal.HasBorder() + +End + +Private Sub Border_Write(Value As Boolean) + + $hCal.SetBorder(Value) + +End + +Private Function MinValue_Read() As Date + + Return $dDateMin + +End + +Private Sub MinValue_Write(Value As Date) + + $dDateMin = Value + $hCal.UpdateValue() + +End + +Private Function MaxValue_Read() As Date + + Return $dDateMax + +End + +Private Sub MaxValue_Write(Value As Date) + + $dDateMax = Value + $hCal.UpdateValue() + +End diff --git a/comp/src/gb.form/.src/Date/FCalendar.class b/comp/src/gb.form/.src/Date/FCalendar.class new file mode 100644 index 00000000..3d8f9830 --- /dev/null +++ b/comp/src/gb.form/.src/Date/FCalendar.class @@ -0,0 +1,917 @@ +' Gambas class file + +Private $dDate As Date +Private $dTime As Date +Private $dStart As Date +Private $dMonth As Date +Private $dLast As Date +Private $iDisabledColor As Integer +Private $cDateColor As New Collection +Private $bShort As Boolean + +Private $iCurrentTime As Integer = -1 +Private $dCurrentDate As Date +Private $iMonthWidth As Integer + +'Private mnuMonth As Menu + +Private Sub CalcMonthWidth() + + Dim W As Integer + Dim iMonth As Integer + + For iMonth = 1 To 12 + W = Max(W, cmbMonth.Font.TextWidth(DConv(Format(Date(1972, iMonth, 1), "mmmm")))) + Next + + $iMonthWidth = W + cmbMonth.Height + +End + +Private Sub FillMonth(bShort As Boolean) + + Dim iMonth As Integer + Dim sFormat As String + Dim iIndex As Integer + + If bShort = $bShort And If cmbMonth.Count Then Return + + sFormat = If(bShort, "mmm", "mmmm") + + iIndex = cmbMonth.Index + Object.Lock(cmbMonth) + cmbMonth.Clear + For iMonth = 1 To 12 + cmbMonth.Add(String.UCaseFirst(DConv(Format(Date(1972, iMonth, 1), sFormat)))) + Next + cmbMonth.Index = iIndex + Object.Unlock(cmbMonth) + + $bShort = bShort + +End + +Private Sub GetTimeFormat() As String + + Dim sFormat As String + + sFormat = Format(Time(11, 22, 33), gb.ShortTime) + sFormat = Replace(sFormat, "11", "hh") + sFormat = Replace(sFormat, "22", "nn") + + Return sFormat + +End + + +Public Sub _new() + + panTime.W = Desktop.Scale * 16 + + FillMonth(False) + + $dDate = Now + SetDate() + SetTime(Time($dDate)) + + $iDisabledColor = GetDisabledColor() + + UpdateFont + +End + +Private Sub GetDisabledColor() As Integer + + Dim H, S, V As Integer + + H = Color[Color.Foreground].Hue + S = 0 'Color[Color.Foreground].Saturation + V = Color[Color.Foreground].Value + + If V < 128 Then + V = 255 - (255 - Color[Color.Foreground].Value) / 4 + Else + V /= 4 + Endif + + Return Color.HSV(H, S, V) + +End + + + +Private Sub GetParent() As DateChooser + + Return Me.Parent + +End + +Private Sub CheckDate(dDate As Date) As Date + + Dim dMin, dMax As Date + + With GetParent() + dMin = .MinValue + dMax = .MaxValue + End With + + If dMin And If dDate < dMin Then Return dMin + If dMax And If dDate > dMax Then Return dMax + + Return dDate + +End + + +Private Sub SetDate(Optional iYear As Integer, Optional iMonth As Integer, Optional iDay As Integer) + + Dim dMonth As Date + Dim dDate As Date + + If iYear = 0 And If iMonth = 0 And If iDay = 0 Then + $dDate = CheckDate($dDate) + Endif + + If iYear <= 0 Then iYear = Year($dDate) + If iMonth <= 0 Then iMonth = Month($dDate) + If iDay <= 0 Then iDay = Day($dDate) + + Do + Try dDate = Date(iYear, iMonth, iDay) + If Not Error Then Break + Dec iDay + If iDay < 28 Then + dDate = Null + Break + Endif + Loop + + If dDate And If CheckDate(dDate) <> dDate Then dDate = Null + + If dDate Then + $dDate = dDate + dMonth = Date(Year(dDate), Month(dDate), 1) + Else + dMonth = $dMonth + $dMonth = Null + Endif + + If dMonth <> $dMonth Then + + $dMonth = dMonth + + cmbMonth.Index = Month($dMonth) - 1 + txtYear.Value = Year($dMonth) + + Endif + + iDay = WeekDay($dMonth) - System.FirstDayOfWeek + If iDay < 1 Then iDay += 7 + $dStart = $dMonth - iDay + + dwgMonth.Refresh + + If $dDate <> $dLast Then + $dLast = $dDate + GetParent()._Change + Endif + + dwgMonth.SetFocus + +End + +Public Sub UpdateValue() + + SetDate() + +End + + +Public Sub SetValue(dDate As Date) + + SetTime(Time(dDate)) + SetDate(Year(dDate), Month(dDate), Day(dDate)) + +End + +Public Sub GetValue() As Date + + If panTime.Visible Then + Return Date($dDate) + $dTime + Else + Return Date($dDate) + Endif + +End + + +Public Sub dwgMonth_Draw() + + Dim I, J As Integer + Dim X, Y, W, H As Integer + Dim XD, YD As Integer + Dim dDate As Date + Dim iForeground As Integer + Dim iBackground As Integer + Dim sKey As String + Dim bToday As Boolean + Dim hDate As _DateChooser_Date + Dim fSize As Float + + iForeground = dwgMonth.Foreground 'Draw.Foreground + iBackground = dwgMonth.Background 'Draw.Background + + W = dwgMonth.ClientW / 7 + H = dwgMonth.ClientH / 7 + + If W = 0 Or H = 0 Then Return + + XD = 0 '(Draw.W - W * 7) / 2 + YD = dwgMonth.ClientH - H * 6 + + Draw.FillStyle = Fill.Solid + Draw.LineStyle = Line.None + + Draw.Font = dwgMonth.Font + fSize = Draw.Font.Size * H / Draw.Font.Height * 0.7 + Draw.Font.Size = fSize + Draw.Font.Bold = True + + X = XD + Y = 0 + For I = 0 To 6 + Select Case WeekDay($dStart + I) + Case 0, 6 + Draw.FillColor = iBackground + Draw.Foreground = Color.SelectedBackground + Default + Draw.FillColor = Color.SelectedBackground + Draw.Foreground = Color.SelectedForeground + End Select + If Not Me.Enabled Then Draw.Foreground = Color.Merge(Draw.Foreground, Draw.FillColor) + Draw.Rect(X, Y, W, YD) + Draw.Text(Format(CDate($dStart + I), "ddd"), X, Y, W, YD, Align.Center) + X += W + Next + + Draw.LineStyle = Line.Solid + Draw.Foreground = Color.LightForeground + Draw.Line(XD, YD - 1, XD + Draw.W - 1, YD - 1) + Draw.LineStyle = Line.None + + dDate = $dStart + Y = YD + For J = 0 To 5 + X = XD + For I = 0 To 6 + + If CheckDate(dDate) <> dDate Then + Draw.FillRect(X, Y, W, H, Color.Merge(Color.LightForeground, dwgMonth.Background)) + Goto NEXT_DATE + Endif + + hDate = GetParent()[dDate] + + iForeground = hDate.Foreground + If iForeground = Color.Default Then iForeground = dwgMonth.Foreground + iBackground = hDate.Background + If iBackground = Color.Default Then iBackground = dwgMonth.Background + + If Not Me.Enabled Then iForeground = Color.Merge(iForeground, iBackground) + + Draw.Font = hDate.Font + Draw.Font.Size = fSize + + If CInt(dDate) = CInt($dDate) Then + Draw.FillColor = If(dwgMonth.HasFocus, Color.SelectedBackground, Color.LightForeground) + Draw.Foreground = Color.SelectedForeground + Else + If Month(dDate) <> Month($dMonth) Then + Draw.FillColor = iBackground + Draw.Foreground = Color.Merge(iForeground, dwgMonth.Background) + Else + Draw.FillColor = iBackground + Draw.Foreground = iForeground + Endif + sKey = CStr(Date(dDate)) + If $cDateColor.Exist(sKey) Then + If Draw.Foreground = $iDisabledColor Then + Draw.FillColor = Color.Merge(Draw.Foreground, $cDateColor[sKey]) + Else + Draw.FillColor = $cDateColor[sKey] + Endif + Endif + Endif + + Draw.Rect(X + 1, Y + 1, W - 2, H - 2) + + bToday = CInt(Date(Now)) = CInt(Date(dDate)) + Draw.Font.Bold = bToday + Draw.Font.Underline = hDate.Text + + Draw.Text(Day(dDate), X, Y, W, H, Align.Center) + + If dDate = $dCurrentDate Then + Draw.LineStyle = Line.Solid + Draw.FillStyle = Fill.None + Draw.Foreground = Color.LightForeground + Draw.Rect(X, Y, W, H) + Draw.FillStyle = Fill.Solid + Draw.LineStyle = Line.None + Else If bToday Then + Draw.LineStyle = Line.Solid + Draw.FillStyle = Fill.None + Draw.Foreground = iForeground + Draw.Rect(X, Y, W, H) + Draw.FillStyle = Fill.Solid + Draw.LineStyle = Line.None + Endif + + NEXT_DATE: + + X += W + Inc dDate + + Next + Y += H + Next + +End + +Public Sub cmbMonth_Click() + + SetDate(0, cmbMonth.Index + 1) + +End + +Public Sub btnPrevMonth_Click() + + If Month($dMonth) = 1 Then + SetDate(Year($dMonth) - 1, 12) + Else + SetDate(0, Month($dMonth) - 1) + Endif + +End + +Public Sub btnNextMonth_Click() + + If Month($dMonth) = 12 Then + SetDate(Year($dMonth) + 1, 1) + Else + SetDate(0, Month($dMonth) + 1) + Endif + +End + +Public Sub txtYear_Change() + + SetDate(txtYear.Value) + +End + +Public Sub btnPrevYear_Click() + + SetDate(Year($dMonth) - 1) + +End + +Public Sub btnNextYear_Click() + + SetDate(Year($dMonth) + 1) + +End + +Public Sub dwgMonth_KeyPress() + + Select Case Key.Code + + Case Key.Left + Dec $dDate + SetDate + Stop Event + + Case Key.Right + Inc $dDate + SetDate + Stop Event + + Case Key.Up + $dDate -= 7 + SetDate + Stop Event + + Case Key.Down + $dDate += 7 + SetDate + Stop Event + + Case Key.Space, Key.Enter, Key.Return + dwgMonth_DblClick + + End Select + +End + +Private Sub CalcCurrentDate() As Boolean + + Dim hDate As _DateChooser_Date + Dim W, H As Integer + Dim XD, YD As Integer + Dim dDate As Date + + $dCurrentDate = Null + + W = dwgMonth.ClientW / 7 + H = dwgMonth.ClientH / 7 + + If W = 0 Or H = 0 Then Return True + + XD = 0 '(Draw.W - W * 7) / 2 + YD = dwgMonth.ClientH - H * 6 + + If Mouse.Y < YD Then Return True + + dDate = $dStart + Min(6, Mouse.X \ W) + ((Mouse.Y - YD) \ H) * 7 + If CheckDate(dDate) <> dDate Then Return True + $dCurrentDate = dDate + + hDate = GetParent()[$dCurrentDate] + dwgMonth.Tooltip = hDate.Text + +End + + +Public Sub dwgMonth_MouseDown() + + CalcCurrentDate + If Not $dCurrentDate Then Return + + $dDate = $dCurrentDate + SetDate + + GetParent()._Click + +End + +Public Sub btnReload_Click() + + $dDate = Now + SetDate + +End + +Public Sub dwgMonth_DblClick() + + GetParent()._Activate + +End + +Public Sub UpdateFont() + + cmbMonth.Height = Desktop.Scale * 4 + panToolbar.H = cmbMonth.Height + CalcMonthWidth + Form_Resize + +End + +Public Sub ClearColors() + + $cDateColor.Clear + dwgMonth.Refresh + +End + + +Public Sub SetColor(dDate As Date, iColor As Integer) + + Dim sKey As String = CStr(Date(dDate)) + + If iColor = Color.Default Then + $cDateColor.Remove(sKey) + Else + $cDateColor[sKey] = iColor + Endif + dwgMonth.Refresh + +End + +Public Sub GetColor(dDate As Date) As Integer + + Dim sKey As String = CStr(Date(dDate)) + Dim iColor As Integer + + Try iColor = $cDateColor[sKey] + If Error Then iColor = Color.Default + Return iColor + +End + + +Public Sub Form_Resize() + + If panDate.Width < (Desktop.Scale * 36) Then + btnNextMonth.Hide + btnPrevMonth.Hide + If panDate.Width < (Desktop.Scale * 24) Then + panSepMonth.Hide + btnReload.Hide + Else + panSepMonth.Show + btnReload.Show + Endif + Else + btnNextMonth.Show + btnPrevMonth.Show + Endif + + FillMonth(cmbMonth.Width < $iMonthWidth) + +End + +Public Sub Form_KeyPress() + + If Key.Code = Key.Escape Then GetParent()._Cancel + +End + +Public Sub SetFocus() + + dwgMonth.SetFocus + +End + +Public Sub dwgTime_Draw() + + Dim dTime, dNextTime As Date + Dim iInd As Integer + Dim X, Y, DX, DY, DW, DH As Integer + Dim SW, SH As Float + Dim sFormat As String = GetTimeFormat() + Dim sTime As String + + DW = dwgTime.W \ 4 + DH = dwgTime.H \ 12 + DX = (dwgTime.W - DW * 4) \ 2 + DY = (dwgTime.H - DH * 12) \ 2 + + SH = (DH - 2) / Draw.Font.Height + sTime = GetTimeFormat() + sTime = Replace(sTime, "h", "0") + sTime = Replace(sTime, "n", "0") + SW = (DW - 6) / Draw.Font.TextWidth(sTime) + Draw.Font.Size *= Min(SH, SW) + + Draw.FillColor = Color.ButtonBackground + Draw.FillStyle = Fill.Solid + Draw.LineStyle = Line.None + Draw.Rect(dwgTime.W \ 2, 0, dwgTime.W - dwgTime.W \ 2, dwgTime.H) + + dTime = Time(0, 0, 0) + + X = DX + Y = DY + + For iInd = 0 To 47 + + dNextTime = TimeAdd(dTime, 30) + If IsNull(dNextTime) Then dNextTime = 1 + + If $dTime >= dTime And If $dTime < dNextTime Then + If $dTime = dTime Then + Draw.FillColor = Color.SelectedBackground + Else + Draw.FillColor = Color.LightBackground + Endif + If Not dwgTime.HasFocus Then + Draw.FillColor = Color.LightForeground + Endif + Draw.Foreground = Color.SelectedForeground + Draw.FillStyle = Fill.Solid + Draw.Rect(X, Y, DW, DH) + Else + Draw.FillColor = dwgTime.Background + Draw.Foreground = dwgTime.Foreground + Endif + + Draw.Text(Format$(dTime, sFormat), X, Y, DW, DH, Align.Center) + + If iInd = $iCurrentTime Then + Draw.Foreground = Color.LightForeground + Draw.FillStyle = Fill.None + Draw.LineStyle = Line.Solid + Draw.Rect(X, Y, DW, DH) + Endif + + Y += DH + If (Y + DH) > dwgTime.H Then + X += DW + Y = DY + Endif + + dTime = dNextTime + + Next + +End + +Private Sub CalcCurrentTime() + + Dim X, Y, DX, DY, DW, DH As Integer + + DW = dwgTime.W \ 4 + DH = dwgTime.H \ 12 + DX = (dwgTime.W - DW * 4) \ 2 + DY = (dwgTime.H - DH * 12) \ 2 + + $iCurrentTime = -1 + + X = Mouse.X - DX + If X < 0 Then Return + Y = Mouse.Y - DY + If Y < 0 Then Return + + X = (X - DX) \ DW + Y = (Y - DY) \ DH + + If X > 3 Or If Y > 11 Then Return + + $iCurrentTime = 6 * X * 2 + Y + +End + + +Public Sub dwgTime_MouseDown() + + CalcCurrentTime + If $iCurrentTime >= 0 Then + SetTime(Time($iCurrentTime \ 2, 30 * ($iCurrentTime Mod 2), 0)) + Endif + GetParent()._Click + +End + +Public Sub dwgTime_DblClick() + + GetParent()._Activate + +End + +Private Sub TimeAdd(dTime As Date, iAdd As Integer) As Date + + dTime = Date(1972, 9, 6, Hour(dTime), If(Minute(dTime) < 30, 0, 30)) + dTime = DateAdd(dTime, gb.Minute, iAdd) + Return Time(dTime) + +End + +Private Sub SetTime(dTime As Date) + + $dTime = dTime + dwgTime.Refresh + + txtHour.Text = Format(Hour($dTime), "00") + txtMinute.Text = Format(Minute($dTime), "00") + +End + + +Public Sub dwgTime_KeyPress() + + Select Case Key.Code + + Case Key.Up + If Time($dTime) < Time(0, 30, 0) Then + Dec $dDate + SetDate + Endif + SetTime(TimeAdd($dTime, -30)) + Stop Event + + Case Key.Down + If Time($dTime) >= Time(23, 30, 0) Then + Inc $dDate + SetDate + Endif + SetTime(TimeAdd($dTime, 30)) + Stop Event + + Case Key.Left + If Time($dTime) < Time(6, 0, 0) Then + Dec $dDate + SetDate + Endif + SetTime(TimeAdd($dTime, -30 * 12)) + Stop Event + + Case Key.Right + If Time($dTime) >= Time(18, 0, 0) Then + Inc $dDate + SetDate + Endif + SetTime(TimeAdd($dTime, 30 * 12)) + Stop Event + + Case Key.Space, Key.Enter, Key.Return + dwgTime_DblClick + + End Select + +End + +Public Sub SetShowTime(bShowTime As Boolean) + + If Not GetShowDate() And Not bShowTime Then Error.Raise("Bad argument") + panTime.Visible = bShowTime + sepTime.Visible = GetShowTime() And GetShowDate() + +End + +Public Sub GetShowTime() As Boolean + + Return dwgTime.Visible + +End + +Public Sub SetShowDate(bShowDate As Boolean) + + If Not GetShowTime() And Not bShowDate Then Error.Raise("Bad argument") + panDate.Visible = bShowDate + sepTime.Visible = GetShowTime() And GetShowDate() + +End + +Public Sub GetShowDate() As Boolean + + Return panDate.Visible + +End + +Public Sub dwgTime_MouseMove() + + Dim iLast As Integer = $iCurrentTime + + CalcCurrentTime + + If $iCurrentTime < 0 Then + dwgTime.Mouse = Mouse.Default + Else + dwgTime.Mouse = Mouse.Pointing + Endif + + If $iCurrentTime <> iLast Then + dwgTime.Refresh + Endif + +End + +Public Sub dwgMonth_MouseMove() + + If CalcCurrentDate() Then + dwgMonth.Mouse = Mouse.Default + Else + dwgMonth.Mouse = Mouse.Pointing + Endif + + dwgMonth.Refresh + +End + +Public Sub dwgMonth_Leave() + + $dCurrentDate = Null + dwgMonth.Tooltip = "" + dwgMonth.Refresh + +End + +Public Sub dwgTime_Leave() + + $iCurrentTime = -1 + dwgTime.Refresh + +End + +Public Sub HasBorder() As Boolean + + Return panBorder.Border <> Border.None + +End + +Public Sub SetBorder(bBorder As Boolean) + + panBorder.Border = If(bBorder, Border.Plain, Border.None) + +End + + +Public Sub txtHour_GotFocus() + + txtHour.SelectAll + +End + +Public Sub txtMinute_GotFocus() + + txtMinute.SelectAll + +End + +Public Sub txtHour_MouseWheel() + + Dim iHour As Integer = Hour($dTime) + + If Mouse.Forward Then + iHour = Min(iHour + 1, 23) + Else + iHour = Max(iHour - 1, 0) + Endif + + SetTime(Time(iHour, Minute($dTime), 0)) + +End + +Public Sub txtMinute_MouseWheel() + + Dim iMinute As Integer = Minute($dTime) + + If Mouse.Forward Then + Inc iMinute + If iMinute > 59 Then iMinute = 0 + Else + Dec iMinute + If iMinute < 0 Then iMinute = 59 + Endif + + SetTime(Time(Hour($dTime), iMinute, 0)) + +End + +Public Sub txtHour_LostFocus() + + Dim iHour As Integer + 'Dim iPos As Integer + + Try iHour = CInt(Trim(txtHour.Text)) + If Not Error And If iHour >= 0 And If iHour <= 23 Then + SetTime(Time(iHour, Minute($dTime), 0)) + Endif + +End + +Public Sub txtMinute_LostFocus() + + Dim iMinute As Integer + + Try iMinute = CInt(Trim(txtMinute.Text)) + If Not Error And If iMinute >= 0 And If iMinute <= 59 Then + SetTime(Time(Hour($dTime), iMinute, 0)) + Endif + +End + +Public Sub txtHour_Activate() + + txtMinute.SetFocus + +End + +Public Sub txtMinute_Activate() + + txtMinute_LostFocus + btnOK_Click + +End + +Public Sub btnOK_Click() + + GetParent()._Click() + 'GetParent()._Activate() + +End + + +Public Sub btnMonth_MouseWheel() + + If Mouse.Forward Then + btnPrevMonth_Click + Else + btnNextMonth_Click + Endif + +End + +Public Sub dwgMonth_MouseWheel() + + Dim dDate As Date + + If Mouse.Forward Then + dDate = DateAdd($dDate, gb.Day, -1) + Else + dDate = DateAdd($dDate, gb.Day, 1) + Endif + + SetDate(Year(dDate), Month(dDate), Day(dDate)) + +End diff --git a/comp/src/gb.form/.src/Date/FCalendar.form b/comp/src/gb.form/.src/Date/FCalendar.form new file mode 100644 index 00000000..2a1e01da --- /dev/null +++ b/comp/src/gb.form/.src/Date/FCalendar.form @@ -0,0 +1,116 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,83,43) + Resizable = False + Arrangement = Arrange.Fill + { panBorder Panel + MoveScaled(1,1,76,37) + Arrangement = Arrange.Horizontal + Border = Border.Plain + { panDate VBox + MoveScaled(0,0,57,35) + Expand = True + { panToolbar HBox + MoveScaled(0,0,55,4) + Background = Color.TextBackground + { btnReload ToolButton + MoveScaled(0,0,4,4) + ToolTip = ("Today") + Picture = Picture["icon:/small/calendar"] + } + { btnPrevMonth ToolButton + MoveScaled(4,0,4,4) + ToolTip = ("Previous month") + Picture = Picture["icon:/small/left"] + } + { btnNextMonth ToolButton + MoveScaled(8,0,4,4) + ToolTip = ("Next month") + Picture = Picture["icon:/small/right"] + } + { panSepMonth Panel + MoveScaled(14,0,1,4) + Visible = False + } + { cmbMonth ComboBox + MoveScaled(18,0,18,4) + Expand = True + ReadOnly = True + Border = False + } + { txtYear SpinBox + MoveScaled(39,0,9,4) + MinValue = 1600 + MaxValue = 9999 + Value = 1600 + Border = False + } + } + { Panel1 Panel + MoveScaled(29,5,3,1) + Visible = False + } + { Separator1 Separator + MoveScaled(9,7,30,0) + } + { dwgMonth DrawingArea + MoveScaled(0,8,56,27) + Background = Color.TextBackground + Foreground = Color.TextForeground + Tracking = True + Expand = True + Focus = True + } + } + { sepTime Separator + MoveScaled(58,0,0,35) + Visible = False + } + { panTime VBox + MoveScaled(58,0,17,35) + Visible = False + { HBox1 HBox + MoveScaled(0,0,17,4) + Background = Color.TextBackground + { PictureBox1 PictureBox + MoveScaled(0,0,4,4) + Visible = False + Picture = Picture["icon:/small/clock"] + Alignment = Align.Center + } + { Panel3 Panel + MoveScaled(2,0,10,4) + Background = Color.TextBackground + Expand = True + { txtHour TextBox + MoveScaled(0,0,4,4) + Alignment = Align.Right + Border = False + } + { txtMinute TextBox + MoveScaled(4,0,4,4) + Alignment = Align.Right + Border = False + } + } + { btnOK ToolButton + MoveScaled(13,0,4,4) + ToolTip = ("Apply") + Picture = Picture["icon:/small/ok"] + } + } + { Separator2 Separator + MoveScaled(2,6,12,0) + } + { dwgTime DrawingArea + MoveScaled(1,14,14,20) + Background = Color.TextBackground + Foreground = Color.TextForeground + Tracking = True + Expand = True + Focus = True + } + } + } +} diff --git a/comp/src/gb.form/.src/Date/TimeBox.class b/comp/src/gb.form/.src/Date/TimeBox.class new file mode 100644 index 00000000..79e83d87 --- /dev/null +++ b/comp/src/gb.form/.src/Date/TimeBox.class @@ -0,0 +1,218 @@ +' Gambas class file + +Export + +Inherits UserControl + +Public Const _Properties As String = "*,Action,Value,ReadOnly,Border=True,ShowHour=true" +'Public Const _DefaultEvent As String = "Click" +Public Const _DefaultSize As String = "24,4" +Public Const _Similar As String = "TextBox" + +Property Value As Date +Property ReadOnly As Boolean +Property Border As Boolean +Property ShowHour As Boolean + +Private $hBorder As DrawingArea +Private $hHour As SpinBox +Private $hMinute As SpinBox +Private $hSecond As SpinBox +Private $bBorder As Boolean = True +Private $hLabelHour As Label + +Private Sub CreateSpinBox(sName As String) As SpinBox + + Dim hSpinBox As SpinBox + + hSpinBox = New SpinBox($hBorder) + Object.Attach(hSpinBox, Me, sName) + + hSpinBox.Expand = True + hSpinBox.Border = False + hSpinBox.Alignment = Align.Right + hSpinBox.ShowZero = True + + Return hSpinBox + +End + +Public Sub _new() + + Dim hLabel As Label + + $hBorder = New DrawingArea(Me) As "Border" + $hBorder.Arrangement = Arrange.Horizontal + $hBorder.Padding = Style.FrameWidth + $hBorder.Margin = True + + $hHour = CreateSpinBox("HourBox") + $hHour.MinValue = 0 + $hHour.MaxValue = 24 + GoSub CREATE_LABEL + $hLabelHour = hLabel + $hMinute = CreateSpinBox("MinuteBox") + $hMinute.MinValue = 0 + $hMinute.MaxValue = 59 + GoSub CREATE_LABEL + $hSecond = CreateSpinBox("SecondBox") + $hSecond.MinValue = 0 + $hSecond.MaxValue = 59 + Return + +CREATE_LABEL: + + hLabel = New Label($hBorder) + hLabel.Text = " :" + hLabel.AutoResize = True + Return + +End + +Private Function Value_Read() As Date + + Try Return Time($hHour.Value, $hMinute.Value, $hSecond.Value) + +End + +Private Sub Value_Write(Value As Date) + + $hHour.Value = Hour(Value) + $hMinute.Value = Minute(Value) + $hSecond.Value = Second(Value) + +End + +Private Function ReadOnly_Read() As Boolean + + Return $hMinute.ReadOnly + +End + +Private Sub ReadOnly_Write(Value As Boolean) + + $hHour.ReadOnly = Value + $hMinute.ReadOnly = Value + $hSecond.ReadOnly = Value + +End + +Private Function Border_Read() As Boolean + + Return $bBorder + +End + +Private Sub Border_Write(Value As Boolean) + + $bBorder = Value + $hBorder.Padding = If($bBorder, Max(Style.BoxFrameWidth, Style.BoxFrameHeight), 0) + $hBorder.Margin = $bBorder + +End + +Public Sub HourBox_GotFocus() + + $hBorder.Refresh + '$hHour.SelectAll + +End + +Public Sub MinuteBox_GotFocus() + + $hBorder.Refresh + '$hMinute.SelectAll + +End + +Public Sub SecondBox_GotFocus() + + $hBorder.Refresh + '$hSecond.SelectAll + +End + +Public Sub HourBox_LostFocus() + + $hBorder.Refresh + +End + +Public Sub MinuteBox_LostFocus() + + $hBorder.Refresh + +End + +Public Sub SecondBox_LostFocus() + + $hBorder.Refresh + +End + +Public Sub SecondBox_Limit() + + If $hSecond.Value = $hSecond.MaxValue Then + Try Me.Value = DateAdd(Me.Value, gb.Second, 1) + Else If $hSecond.Value = $hSecond.MinValue Then + Try Me.Value = DateAdd(Me.Value, gb.Second, -1) + Endif + $hSecond.SetFocus + $hSecond.SelectAll + +End + +Public Sub MinuteBox_Limit() + + If $hMinute.Value = $hMinute.MaxValue Then + Try Me.Value = DateAdd(Me.Value, gb.Minute, 1) + Else If $hMinute.Value = $hMinute.MinValue Then + Try Me.Value = DateAdd(Me.Value, gb.Minute, -1) + Endif + $hMinute.SetFocus + +End + +' Public Sub MinuteBox_MouseWheel() +' +' $hMinute.Text = Format(Max(0, Min(59, CInt($hMinute.Text) + If(Mouse.Forward, 1, -1))), "00") +' +' End +' +' Public Sub SecondBox_MouseWheel() +' +' Dim dVal As Date +' +' dVal = Value_Read() +' Try dVal = DateAdd(dVal, gb.Second, If(Mouse.Forward, 10, -10)) +' If Not Error Then Value_Write(dVal) +' +' End + +Public Sub Border_Draw() + + Dim iBg As Integer = Color.TextBackground + + If Me.Background <> Color.Default Then iBg = Me.Background + + If $bBorder Then + Style.PaintBox(0, 0, Me.W, Me.H, Style.StateOf($hMinute) Or Style.StateOf($hSecond) Or Style.StateOf($hHour), iBg) + Else + Paint.FillRect(0, 0, Me.W, Me.H, iBg) + Endif + +End + +Private Function ShowHour_Read() As Boolean + + Return $hHour.Visible + +End + +Private Sub ShowHour_Write(Value As Boolean) + + $hHour.Visible = Value + $hLabelHour.Visible = Value + If Not Value Then $hHour.Value = 0 + +End diff --git a/comp/src/gb.form/.src/Date/_DateChooser_Colors.class b/comp/src/gb.form/.src/Date/_DateChooser_Colors.class new file mode 100644 index 00000000..f5fe7896 --- /dev/null +++ b/comp/src/gb.form/.src/Date/_DateChooser_Colors.class @@ -0,0 +1,26 @@ +' Gambas class file + +Export +Create Static + +Public _Calendar As FCalendar + +Public Sub Clear() + + _Calendar.ClearColors() + +End + +Public Sub _put((Color) As Integer, {Date} As Date) + + _Calendar.SetColor({Date}, Color) + +End + + +Public Sub _get({Date} As Date) As Integer + + Return _Calendar.GetColor({Date}) + +End + diff --git a/comp/src/gb.form/.src/Date/_DateChooser_Data.class b/comp/src/gb.form/.src/Date/_DateChooser_Data.class new file mode 100644 index 00000000..272da83b --- /dev/null +++ b/comp/src/gb.form/.src/Date/_DateChooser_Data.class @@ -0,0 +1,27 @@ +' Gambas class file + +Export + +'Public Picture As Picture +'Public Alignment As Integer = Align.Normal +'Public Padding As Integer = 2 +'Public WordWrap As Boolean +Public Foreground As Integer = Color.Default +Public Background As Integer = Color.Default +Public Text As String + +Property Font As Font + +Private $hFont As Font + +Private Function Font_Read() As Font + + Return $hFont + +End + +Private Sub Font_Write(Value As Font) + + $hFont = Value.Copy() + +End diff --git a/comp/src/gb.form/.src/Date/_DateChooser_Date.class b/comp/src/gb.form/.src/Date/_DateChooser_Date.class new file mode 100644 index 00000000..90c583ee --- /dev/null +++ b/comp/src/gb.form/.src/Date/_DateChooser_Date.class @@ -0,0 +1,68 @@ +' Gambas class file + +Export + +Property Background As Integer +Property Foreground As Integer +Property Text As String +Property Font As Font + +Public _Date As Date +Public _View As DateChooser + +Private Sub GetData(bCreate As Boolean) As _DateChooser_Data + + '_View._CheckCell(_Row, _Column) + If bCreate Then _View.Refresh + Return _View._GetData(_Date, bCreate) + +End + + +Private Function Background_Read() As Integer + + Return GetData(False).Background + +End + +Private Sub Background_Write(Value As Integer) + + GetData(True).Background = Value + +End + +Private Function Foreground_Read() As Integer + + Return GetData(False).Foreground + +End + +Private Sub Foreground_Write(Value As Integer) + + GetData(True).Foreground = Value + +End + +Private Function Font_Read() As Font + + Return GetData(False).Font + +End + +Private Sub Font_Write(Value As Font) + + GetData(True).Font = Value + +End + +Private Function Text_Read() As String + + Return GetData(False).Text + +End + +Private Sub Text_Write(Value As String) + + GetData(True).Text = Value + +End diff --git a/comp/src/gb.form/.src/DocumentView/DocumentView.class b/comp/src/gb.form/.src/DocumentView/DocumentView.class new file mode 100644 index 00000000..b77250c4 --- /dev/null +++ b/comp/src/gb.form/.src/DocumentView/DocumentView.class @@ -0,0 +1,1048 @@ +' Gambas class file + +Export +Inherits UserControl + +Public Const _Properties As String = "*,Border,Arrangement{Arrange.Row;Column;Vertical;Horizontal;Fill}=Row,Padding=10,Spacing=10,Column,AutoCenter,ShowShadow,ShowPage" +Public Const _Group As String = "View" +Public Const _Similar As String = "GridView" + +'Public Enum Portrait, Paysage +'Public Enum None, PagesWidth, PageHeight +Property DocWidth, PageWidth As Integer +Property DocHeight, PageHeight As Integer +Property Count As Integer +Property Read Max As Integer +Property Read Layout As _DocumentLayout +Property Zoom, Scale As Float +Property Column, Row As Integer +Property Arrangement As Integer +Property Padding As Integer +Property Spacing As Integer +Property ShowShadow As Boolean +Property ShowPage As Boolean +Property Read Item As _DocumentItem +Property Read FirstVisibleDocument As Integer +Property Read LastVisibleDocument As Integer +Property AutoCenter As Boolean +Property Border As Boolean +Property Desaturate As Boolean + +Private $bAutoCenter As Boolean +Private $iColumn As Integer +Private $bShowShadow As Boolean = True +Private $iPadding As Integer = 10 +Private $fScaledPadding As Integer +Private $iArrangement As Integer +Private $hView As ScrollArea +Private $iDocWidth As Integer = 210 +Private $iDocHeight As Integer = 297 +Private $hLayout As New _DocumentLayout +'Info du layout +Private $iFirstVisibleColumn As Integer +Private $iLastVisibleColumn As Integer +Private $iFirstVisibleLine As Integer +Private $iFirstVisibleDocument As Integer +Private $iLastVisibleDocument As Integer +Private $iLastVisibleLine As Integer +Private $colLayout As New Collection +Private $colImage As New Collection +Private $iCount As Integer = 0 + +Private $fScaledDocWidth As Float ''Largeur reelle du doc a l'affichage (zoom) +Private $fScaledDocHeight As Float ''Hauteur reelle du doc a l'affichage (zoom) +Private $fScaledSpace As Float '' Taille reelle de l'espacement a l'affichage(zoom) +Private $fMaxPageHeight As Float ''Hauteur du plus grand doc +Private $fMaxPageWidth As Float ''Largeur du plus grand doc +Private $iMaxPageHeight As Integer +Private $iMaxPageWidth As Integer +Private $iSpacing As Integer = 10 ''Taille de l'espacement +Private $iNbreLines As Integer ''Nombre de ligne totale +Private $tmrLoad As New Timer As "tmrLoad" +Private $tmrRefresh As New Timer As "tmrRefresh" +Private $aImageToLoad As New Integer[] +Private $aImageLoaded As New Integer[] +Private $iNbreDocByLine As Integer +Private $hDocItem As _DocumentItem +Private $iIntern As Integer +Private $iCurrent As Integer +Private $fZoom As Float = 1.0 +Private $aSelected As New Integer[] +Private $fCenter As Float +Private $iSX As Integer +Private $iSY As Integer +Private $MX As Integer +Private $MY As Integer +Private $bShowPage As Boolean +Private $hObs As Observer + +Event Layout(Page As Integer) +Event Draw(Page As Integer, Width As Integer, Height As Integer) +Event Finished +Event Zoom + +Private $bDesaturate As Boolean + +Public Sub _new() + + $hView = New ScrollArea(Me) As "View" + $hView.Background = Color.LightForeground + $hView.Border = False + '$tmrLoad.Delay = 100 + Me.Proxy = $hView + $hDocItem = New _DocumentItem As "Doc" + $hObs = New Observer($hView.View) As "Obs" +End + +Public Sub tmrLoad_Timer() + + Dim hImg As Image + Dim iPage As Integer + Dim iDocWidth, iDocHeight As Integer + + If $aImageToLoad.Count = 0 Then + '$tmrLoad.Stop + Raise Finished + Return + Endif + + iPage = $aImageToLoad.pop() + + If $colLayout.Exist(iPage) Then + iDocWidth = $colLayout[iPage].Width + iDocHeight = $colLayout[iPage].Height + Else + iDocWidth = $iDocWidth + iDocHeight = $iDocHeight + Endif + + 'Raise Layout(iPage) + + hImg = New Image(iDocWidth * $fZoom, iDocHeight * $fZoom, Color.White) + Paint.Begin(hImg) + 'Paint.Scale($fZoom, $fZoom) + Raise Draw(iPage, iDocWidth * $fZoom, iDocHeight * $fZoom) + Paint.End + If $bDesaturate Then hImg.Desaturate() + $colImage[iPage] = hImg + $aImageLoaded.Add(iPage) + $tmrLoad.Trigger + $tmrRefresh.Trigger + +End + +Public Sub View_Draw() + + Dim i, j, k As Integer + Dim sText As String + Dim W As Integer + Dim D As Integer + + If $iCount = 0 Then Return + + Select Case $iArrangement + Case Arrange.Horizontal + k = $iFirstVisibleDocument + i = 0 + For j = $iFirstVisibleDocument To $iLastVisibleDocument + DrawDoc(j, i, j) + + Next + Case Arrange.None, Arrange.Row, Arrange.LeftRight + k = $iFirstVisibleDocument + For i = $iFirstVisibleLine To $iLastVisibleLine + For j = 0 To $iNbreDocByLine - 1 + + DrawDoc(k, i, j) + + Inc k + If k > $iLastVisibleDocument Then Goto SHOW_PAGE + If k >= $iCount Then Goto SHOW_PAGE + Next + Next + + Case Arrange.Column, Arrange.TopBottom + k = $iFirstVisibleDocument + For j = $iFirstVisibleColumn To $iLastVisibleColumn + 'Print "ilastviscol : " & $iLastVisibleColumn + For i = 0 To $iNbreLines - 1 + DrawDoc(k, i, j) + Inc k + If K > $iLastVisibleDocument Then Goto SHOW_PAGE + If K >= $iCount Then Goto SHOW_PAGE + Next + Next + + Case Arrange.Vertical + j = 0 + For i = $iFirstVisibleDocument To $iLastVisibleDocument + DrawDoc(i, i, j) + Next + Case Arrange.Fill + 'DrawDoc($iFirstVisibleDocument, 0, 0) + i = 0 + For j = $iFirstVisibleDocument To $iLastVisibleDocument + DrawDoc(j, 0, i) + Inc i + + Next + End Select + +SHOW_PAGE: + + If $bShowPage Then + + D = Desktop.Scale + sText = CStr($iFirstVisibleDocument + 1) & " / " & CStr($iCount) + W = Paint.Font.TextWidth(sText) + D * 2 + Paint.FillRect(Paint.W - W - D, D, W, Paint.Font.H + D, Color.SetAlpha(Color.TextForeground, 128)) + Paint.Background = Color.SetAlpha(Color.TextBackground, 128) + Paint.DrawText(sText, Paint.W - W - D + 1, D, W, Paint.Font.H + D, Align.Center) + Paint.Background = Color.TextBackground + Paint.DrawText(sText, Paint.W - W - D, D, W, Paint.Font.H + D, Align.Center) + + Endif + +End + +Private Sub DrawDoc(Page As Integer, iRow As Integer, iCol As Integer) + + Dim iDocX, iDocY As Integer + Dim fShad As Float = $fZoom * ($iSpacing / 4) + Dim hImage As Image + + 'Dim fFullContentWidth As Float + + If $colLayout.Exist(Page) Then + $fScaledDocWidth = $colLayout[Page].Width * $fZoom + $fScaledDocHeight = $colLayout[Page].Height * $fZoom + Else + $fScaledDocWidth = $iDocWidth * $fZoom + $fScaledDocHeight = $iDocHeight * $fZoom + Endif + + 'Define the doc position + If System.RightToLeft Then + iDocX = $hView.ClientW - $fScaledPadding - (iCol * ($fMaxPageWidth + $fScaledSpace)) - $fMaxPageWidth + $hView.ScrollX + Else + iDocX = $fScaledPadding + iCol * ($fMaxPageWidth + $fScaledSpace) + ($fMaxPageWidth - $fScaledDocWidth) / 2 - $hView.ScrollX + Endif + iDocY = $fScaledPadding + iRow * ($fMaxPageHeight + $fScaledSpace) + ($fMaxPageHeight - $fScaledDocHeight) / 2 - $hView.ScrollY + + If $bAutoCenter Then + If $iArrangement = Arrange.Column Then + iDocY -= $fCenter + Else + If System.RightToLeft Then + iDocX -= $fCenter + Else + iDocX += $fCenter + Endif + Endif + Endif + + 'Draw the doc + If $bShowShadow Then + Paint.Save + Paint.Translate(fShad, fShad) + Paint.Rectangle(iDocX + $fScaledDocWidth - fShad, iDocY, fShad, $fScaledDocHeight) + Paint.Rectangle(iDocX, iDocY + $fScaledDocHeight - fShad, $fScaledDocWidth, fShad) + Paint.Brush = Paint.Color(Color.SetAlpha(Color.Black, 192)) + Paint.Fill + Paint.Restore + Endif + + If $colImage.Exist(Page) Then + + hImage = $colImage[Page] + Paint.DrawImage(hImage, iDocX, iDocY, $fScaledDocWidth, $fScaledDocHeight) + Paint.Rectangle(iDocX, iDocY, $fScaledDocWidth, $fScaledDocHeight) + Paint.Brush = Paint.Color(Color.Black) + Paint.Stroke + + Else + + Paint.Rectangle(iDocX, iDocY, $fScaledDocWidth, $fScaledDocHeight) + Paint.Brush = Paint.Color(Color.White) + Paint.Fill(True) + Paint.Brush = Paint.Color(Color.Black) + Paint.Stroke + + Endif + + If $aSelected.Find(page) > -1 Then + Paint.Rectangle(iDocX, iDocY, $fScaledDocWidth, $fScaledDocHeight) + Paint.Brush = Paint.Color(Color.SetAlpha(Color.SelectedBackground, 192)) + Paint.Fill() + Endif + +End + +Private Sub RefreshLayoutNeeds() + + Dim i As Integer + + For i = 0 To $iCount - 1 + Raise Layout(i) + + If $hLayout.Width <> 0 Or If $hLayout.Height <> 0 Or If $hLayout.Orientation <> 1 Then + $colLayout[i] = $hLayout + $hLayout = New _DocumentLayout + Endif + Next + DoLayout + +End + +Private Sub DoLayout() + + Dim hLayout As _DocumentLayout + Dim i As Integer + Dim atmp As New Integer[] + 'Dim fOldZoom As Float = $fZoom + + If $iCount = 0 Then Return + $fCenter = 0 + + 'TODO: go + '$tmrLoad.Stop + 'Found the maxPage Size + $iMaxPageHeight = $iDocHeight + $iMaxPageWidth = $iDocWidth + + For Each hLayout In $colLayout + $iMaxPageWidth = Max($iMaxPageWidth, hLayout.Width) + $iMaxPageHeight = Max($iMaxPageHeight, hLayout.Height) + Next + ' If $iVisibleCount > 0 Then + ' $iNbreDocByLine = $iVisibleCount + ' Endif + + Select Case $iArrangement + Case Arrange.Row, Arrange.None, Arrange.LeftRight + + If $iColumn Then + SetZoom($hView.ClientW / (($iMaxPageWidth + $iSpacing) * $iColumn - $iSpacing + $iPadding * 2)) + Endif + + $fMaxPageWidth = $iMaxPageWidth * $fZoom + $fMaxPageHeight = $iMaxPageHeight * $fZoom + $fScaledSpace = $iSpacing * $fZoom + $fScaledPadding = $iPadding * $fZoom + $iNbreDocByLine = Max(($hView.ClientW - $fScaledPadding) / ($fMaxPageWidth + $fScaledSpace), 1) + 'Calculate the first visible line + $iFirstVisibleLine = Floor($hView.ScrollY / ($fMaxPageHeight + $fScaledSpace)) + $iFirstVisibleDocument = $iFirstVisibleLine * $iNbreDocByLine + + ''Debug "Premier doc visible : " & $iFirstVisibleDocument + 'Calculate how many doc are visibles + $iLastVisibleColumn = Floor(($hView.ScrollX + $hView.ClientWidth) / ($fMaxPageWidth + $fScaledSpace)) + $iLastVisibleLine = Ceil(($hView.ScrollY + $hView.ClientH) / ($fMaxPageHeight + $fScaledSpace)) + $iLastVisibleDocument = Min($iLastVisibleLine * $iNbreDocByLine, $iCount - 1) + + 'If $bAutoCenter Then $fCenter = (($hView.ClientW - (($iMaxPageWidth + $iSpacing) * $iNbreDocByLine - $iSpacing + $iPadding * 2)) / 2) * $fZoom + + Case Arrange.Column, Arrange.TopBottom + + If $iColumn Then + SetZoom($hView.ClientH / (($iMaxPageHeight + $iSpacing) * $iColumn - $iSpacing + $iPadding * 2)) + Endif + + $fMaxPageWidth = $iMaxPageWidth * $fZoom + $fMaxPageHeight = $iMaxPageHeight * $fZoom + $fScaledSpace = $iSpacing * $fZoom + $fScaledPadding = $iPadding * $fZoom + + $iNbreLines = Max(($hView.ClientHeight - $fScaledPadding) / ($fMaxPageHeight + $fScaledSpace), 1) + + $iNbreDocByLine = Ceil($iCount / $iNbreLines) + $iFirstVisibleColumn = Floor($hView.ScrollX / ($fMaxPageWidth + $fScaledSpace)) + $iFirstVisibleDocument = $iFirstVisibleColumn * $iNbreLines + $iLastVisibleColumn = Floor(($hView.ScrollX + $hView.ClientWidth) / ($fMaxPageWidth + $fScaledSpace)) + $iLastVisibleDocument = Min($iLastVisibleColumn * $iNbreLines + 1, $iCount - 1) + + 'If $bAutoCenter Then $fCenter = Max((($hView.ClientH - (($iMaxPageHeight + $iSpacing) * $iNbreLines - $iSpacing + $iPadding * 2)) / 2), 0) * $fZoom + + Case Arrange.Horizontal + SetZoom($hView.ClientH / ($iMaxPageHeight + 2 * $iPadding)) + + $fMaxPageWidth = $iMaxPageWidth * $fZoom + $fMaxPageHeight = $iMaxPageHeight * $fZoom + $fScaledSpace = $iSpacing * $fZoom + $fScaledPadding = $iPadding * $fZoom + + $iNbreDocByLine = $iCount + $iFirstVisibleLine = 0 + $iLastVisibleLine = 0 + + $iLastVisibleColumn = Floor(($hView.ScrollX + $hView.ClientWidth) / ($fMaxPageWidth + $fScaledSpace)) + $iFirstVisibleDocument = Floor($hView.ScrollX / ($fMaxPageWidth + $fScaledSpace)) + $iFirstVisibleColumn = $iFirstVisibleDocument + $iLastVisibleDocument = Min(Floor(($hView.ScrollX + $hView.ClientWidth) / ($fMaxPageWidth + $fScaledSpace)), $iCount - 1) + + Case Arrange.Vertical + + SetZoom($hView.ClientW / ($iMaxPageWidth + 2 * $iPadding)) + + $fMaxPageWidth = $iMaxPageWidth * $fZoom + $fMaxPageHeight = $iMaxPageHeight * $fZoom + $fScaledSpace = $iSpacing * $fZoom + $fScaledPadding = $iPadding * $fZoom + $iNbreDocByLine = 1 + + 'Calculate the first visible line + $iFirstVisibleLine = Floor($hView.ScrollY / ($fMaxPageHeight + $fScaledSpace)) + $iFirstVisibleDocument = $iFirstVisibleLine * $iNbreDocByLine + 'Debug "Premier doc visible : " & $iFirstVisibleDocument + 'Calculate how many doc are visibles + $iLastVisibleLine = Ceil(($hView.ScrollY + $hView.ClientH) / ($fMaxPageHeight + $fScaledSpace)) + $iLastVisibleDocument = Min($iLastVisibleLine * $iNbreDocByLine, $iCount - 1) + + Case Arrange.Fill + '$hView.ScrollBar = Scroll.None + + If $iDocHeight > $iDocWidth * Max($iColumn, 1) Then + SetZoom($hView.ClientH / ($iDocHeight + $iPadding * 2)) + Else + SetZoom($hView.ClientW / (($iDocWidth + $iPadding * 2) + ($iDocWidth + $iSpacing) * $iColumn)) + If ($iDocHeight + 2 * $iPadding) * $fZoom > $hView.ClientH Then + SetZoom($hView.ClientH / ($iDocHeight + $iPadding * 2)) + Endif + Endif + + $fMaxPageWidth = $iMaxPageWidth * $fZoom + $fMaxPageHeight = $iMaxPageHeight * $fZoom + $fScaledSpace = $iSpacing * $fZoom + $fScaledPadding = $iPadding * $fZoom + $iFirstVisibleDocument = $iCurrent + $iNbreDocByLine = Max($iColumn, 1) + $iLastVisibleDocument = Min($iCurrent + $iNbreDocByLine - 1, $iCount - 1) + If $bAutoCenter Then + $fCenter = Max(($hView.ClientW - (($fMaxPageWidth + $fScaledSpace) * $iNbreDocByLine - $fScaledSpace + $fScaledPadding * 2)) / 2, 0) + 'Print $fCenter + Endif + + $hView.Scroll(0, 0) + + End Select + + 'Calculate the Max doc per line (mini 1 doc) + + 'If $iVisibleCount = 0 Then + + 'Endif + + 'Calculate the full Layout height + $iNbreLines = Ceil($iCount / $iNbreDocByLine) + + 'Debug "Nombre de doc par lignes : " & $iNbreDocByLine + 'Debug "Nombre de lignes : " & $iNbreLines + 'Debug "Première colonne : " & $iFirstVisibleColumn + 'Debug "Dernière colonne : " & $iLastVisibleColumn + 'Debug "Premier Doc : " & $iFirstVisibleDocument1 + 'Debug "Dernier doc : " & $iLastVisibleDocument + ' Object.Lock($hView) + ' $hView.ScrollX = $hView.ScrollX / fOldZoom * $fZoom + ' $hView.ScrollY = $hView.ScrollY / fOldZoom * $fZoom + ' Object.Unlock($hView) + 'Setup the virtual space + $hView.ResizeContents($fScaledPadding * 2 + ($fMaxPageWidth + $fScaledSpace) * $iNbreDocByLine - $fScaledSpace, $fScaledPadding * 2 + ($fMaxPageHeight + $fScaledSpace) * $iNbreLines - $fScaledSpace) + + 'Remove all unused image from the buffer + For i = 0 To $aImageLoaded.Max + If $aImageLoaded[i] < $iFirstVisibleDocument Or If $aImageLoaded[i] > $iLastVisibleDocument Then + $colImage[$aImageLoaded[i]] = Null + 'Debug "Remove image : " & $aImageLoaded[i] + Else + atmp.Add($aImageLoaded[i]) + Endif + Next + $aImageLoaded = atmp + + 'Setup the images to load + + For i = $iFirstVisibleDocument To $iLastVisibleDocument + If Not $aImageLoaded.Exist(i) Then + If Not $aImageToLoad.Exist(i) Then $aImageToLoad.push(i) + Endif + Next + $aImageToLoad.Sort + $aImageToLoad = $aImageToLoad.Reverse() + 'If $aImageToLoad.Count > 0 Then + $tmrLoad.Trigger + +End + +Private Function DocWidth_Read() As Integer + + Return $iDocWidth + +End + +Private Sub DocWidth_Write(Value As Integer) + + If $iDocWidth = Value Then Return + $iDocWidth = value + DoLayout + $tmrRefresh.Trigger + +End + +Private Function DocHeight_Read() As Integer + + Return $iDocHeight + +End + +Private Sub DocHeight_Write(Value As Integer) + + If $iDocHeight = Value Then Return + $iDocHeight = Value + DoLayout + $tmrRefresh.Trigger + +End + +Private Function Count_Read() As Integer + + Return $iCount + +End + +Private Sub Count_Write(Value As Integer) + + $iCount = Value + '$aImageLoaded.Clear + ' $aImageToLoad.Clear + '$colImage.Clear + RefreshLayoutNeeds + '$tmrRefresh.Trigger + +End + +Private Function Max_Read() As Integer + + Return $iCount - 1 + +End + +Private Function Layout_Read() As _DocumentLayout + + Return $hLayout + +End + +Public Sub View_Arrange() + + DoLayout + $tmrRefresh.Trigger + +End + +Public Sub View_Scroll() + + $iSX = $hView.ScrollX + $iSY = $hView.ScrollY + '$tmrLoad.Stop + $aImageToLoad.Clear + DoLayout + +End + +Private Function Zoom_Read() As Float + + Return $fZoom + +End + +Private Sub SetZoom(fValue As Float) + + If fValue = $fZoom Then Return + $fZoom = fValue + $aImageLoaded.Clear + $aImageToLoad.Clear + Raise Zoom + +End + +Private Sub Zoom_Write(Value As Float) + + Select Case $iArrangement + Case Arrange.None, Arrange.Row, Arrange.Column, Arrange.LeftRight, Arrange.TopBottom + SetZoom(Min(Max(Value, 1 / 8), 8)) + DoLayout + $tmrRefresh.Trigger + End Select + +End + +Public Sub Refresh() + + $aImageLoaded.Clear + $aImageToLoad.Clear + $colImage.Clear + DoLayout + $tmrRefresh.Trigger + +End + +Public Sub Reset() + + $aImageLoaded.Clear + $aImageToLoad.Clear + $colImage.Clear + RefreshLayoutNeeds + 'DoLayout + $tmrRefresh.Trigger + +End + +Public Sub tmrRefresh_Timer() + + $hView.Refresh + +End + +Private Function Arrangement_Read() As Integer + + Return $iArrangement + +End + +Private Sub Arrangement_Write(Value As Integer) + + If Value = $iArrangement Then Return + If Value = Arrange.Fill Then + $hView.ScrollBar = Scroll.None + Else + $hView.ScrollBar = Scroll.Both + Endif + + $iArrangement = Value + 'SetAutoScale + '$aImageLoaded.Clear + '$colImage.Clear + DoLayout + $tmrRefresh.Trigger + 'Raise Zoom + +End + +' Private Function VisibleCount_Read() As Integer +' +' Return $iVisibleCount +' +' End +' +' Private Sub VisibleCount_Write(Value As Integer) +' +' $iVisibleCount = Value +' DoLayout +' +' End + +Private Function Padding_Read() As Integer + + Return $iPadding + +End + +Private Sub Padding_Write(Value As Integer) + + If Value = $iPadding Then Return + $iPadding = Value + DoLayout + +End + +Private Function ShowShadow_Read() As Boolean + + Return $bShowShadow + +End + +Private Sub ShowShadow_Write(Value As Boolean) + + $bShowShadow = Value + $tmrRefresh.Trigger + +End + +Private Function Spacing_Read() As Integer + + Return $iSpacing + +End + +Private Sub Spacing_Write(Value As Integer) + + If value = $iSpacing Then Return + $iSpacing = Value + DoLayout + +End + +Public Sub Goto(Page As Integer) + + Dim iPageCol, iPageRow As Integer + + Page = Max(Min(Page, $iCount - 1), 0) + + Select Case $iArrangement + Case Arrange.None, Arrange.Row, Arrange.LeftRight + iPageRow = Floor(Page / $iNbreDocByLine) + $hView.ScrollY = iPageRow * ($fMaxPageHeight + $fScaledSpace) + + Case Arrange.Column, Arrange.TopBottom + iPageCol = Floor(page / $iNbreLines) + $hView.ScrollX = iPageCol * ($fMaxPageWidth + $fScaledSpace) + + Case Arrange.Vertical + $hView.ScrollY = Page * ($fMaxPageHeight + $fScaledSpace) + + Case Arrange.Horizontal + $hView.ScrollX = Page * ($fMaxPageWidth + $fScaledSpace) + + Case Arrange.Fill + $iCurrent = Page + DoLayout + $tmrRefresh.Trigger + End Select + +End + +Public Sub View_MouseWheel() + + If $iArrangement = Arrange.Fill Then + $iCurrent = Max(0, Min($iCurrent - (Mouse.Delta * Max($iColumn, 1)), $iCount - 1)) + $hView.Scroll(0, 0) + View_Scroll + Stop Event + Else + If Mouse.Control Then + Me.Zoom = $fZoom * 2 ^ (Mouse.Delta / 4) + $hView.Scroll($iSX, $iSY) + Endif + Stop Event + Endif + $iSX = $hView.ScrollX + $iSY = $hView.ScrollY + +End + +'WorkAround to lock Scrolling when contol key is pressed +Public Sub Obs_MouseWheel() + + If Mouse.Control Then + $hView.UseMouse = False + Else + $hView.UseMouse = True + Endif + +End + + +Public Function Find(X As Integer, Y As Integer) As Integer + + Dim iRow, iCol As Integer + Dim iPage As Integer + + iRow = GetPageRow(Y) + iCol = GetPageCol(X) + + If iRow = -1 Or If iCol = -1 Then Return -1 + + Select Case $iArrangement + Case Arrange.None, Arrange.Row + iPage = iRow * $iNbreDocByLine + iCol + If iPage < $iCount - 1 Then + Return iPage + Else + Return -1 + Endif + + Case Arrange.Column + iPage = iCol * $iNbreDocByLine + iRow + If iPage < $iCount - 1 Then + Return iPage + Else + Return -1 + Endif + + Case Arrange.Horizontal + Return iCol + + Case Arrange.Vertical + Return iRow + + End Select + +End + +Private Function GetPageRow(Y As Integer) As Integer + + Dim iStart, iMiddle As Integer + Dim iEnd As Integer = $iLastVisibleLine + Dim iRow As Integer = -1 + Dim iDocPos As Integer + + Y += $hView.ScrollY + iStart = $iFirstVisibleLine + + Repeat + iMiddle = Int(iStart + (iEnd - iStart) / 2) + iDocPos = ($fScaledPadding + (iMiddle * ($fMaxPageHeight + $fScaledSpace))) + ' Print Y + ' Print "DocY : " & (iDocPos - 1) + ' Print "DocY + Width : " & (iDocPos + $fMaxPageHeight) + If Y > iDocPos - 1 And If Y < iDocPos + $fMaxPageHeight Then + 'trouvé + iRow = iMiddle + Else + If Y < iDocPos Then + iEnd = iMiddle - 1 + Else + iStart = iMiddle + 1 + Endif + + Endif + Until iRow <> -1 Or iMiddle > iEnd + 1 Or iStart > iEnd + 'Print "iRow : " & iRow + Return iRow + +End + +Private Function GetPageCol(X As Integer) As Integer + + Dim iStart, iMiddle As Integer + Dim iEnd As Integer = $iLastVisibleColumn - 1 + Dim iCol As Integer = -1 + Dim iDocPos As Integer + ' Print "X=" & X + X += $hView.ScrollX + iStart = $iFirstVisibleColumn + + Repeat + iMiddle = Int(iStart + (iEnd - iStart) / 2) + iDocPos = ($fScaledPadding + (iMiddle * ($fMaxPageWidth + $fScaledSpace))) + 'Print X + 'Print "DocX : " & (iDocPos - 1) + ' Print "DocX + Width : " & (iDocPos + $fMaxPageWidth) + If X > iDocPos - 1 And If X < iDocPos + $fMaxPageWidth Then + 'Print "trouvé" + iCol = iMiddle + Else + If X < iDocPos Then + iEnd = iMiddle - 1 + Else + iStart = iMiddle + 1 + Endif + + Endif + Until iCol <> -1 Or iMiddle > iEnd + 1 Or iStart > iEnd + 'Print "iCol : " & iCol + Return iCol + +End + +Public Function _GetItemWidth(Index As Integer) As Integer + + If $colLayout.Exist(Index) Then Return $colLayout[Index].Width + Return $iDocWidth + +End + +Public Function _GetItemHeight(Index As Integer) As Integer + + If $colLayout.Exist(Index) Then Return $colLayout[Index].Height + Return $iDocHeight + +End + +' Public Function _SetItemVisible(Index As Integer) As Integer +' +' Me.Goto(Index) +' +' End + +Public Sub _Get(Index As Integer) As _DocumentItem + + If Index > $iCount - 1 Then Return Null + $hDocItem._Index = Index + Return $hDocItem + +End + +Public Function MoveTo(Index As Integer) As Boolean + + If Index < 0 Or index > $iCount + 1 Then Return True + $iIntern = Index + +End + +Public Function MoveFirst() As Boolean + + If $iCount = 0 Then Return True + $iIntern = 0 + +End + +Public Function MoveNext() As Boolean + + If $iIntern + 1 >= $iCount Then Return True + Inc $iIntern + +End + +Public Function MovePrevious() As Boolean + + If $iIntern = 0 Then Return True + Dec $iIntern + +End + +Private Function Item_Read() As _DocumentItem + + $hDocItem._Index = $iIntern + Return $hDocItem + +End + +' Private Function Current_Read() As _DocumentItem +' +' $hDocItem._Index = $iCurrent +' Return $hDocItem +' +' End + +Public Sub View_MouseDown() + + $MX = Mouse.X + $MY = Mouse.Y + If Me.Arrangement = Arrange.Fill Or If Me.Arrangement = Arrange.None Then Return + $hView.Mouse = Mouse.Pointing + 'Try $iCurrent = Find(Mouse.x, Mouse.Y) + '$aSelected.Clear + '$aSelected.Add($iCurrent) + '$tmrRefresh.Trigger + +End + +Public Sub View_MouseMove() + + If Mouse.Left Then + + If Me.Arrangement = Arrange.Fill Or If Me.Arrangement = Arrange.None Then Return + 'Print $MX - Mouse.X + $hView.ScrollX += $MX - Mouse.X + $MX = Mouse.X + + $hView.ScrollY += $MY - Mouse.Y + $MY = Mouse.Y + + $tmrRefresh.Trigger + + Endif + +End + +Public Sub View_MouseUp() + + $hView.Mouse = Mouse.Normal + +End + + +Public Function _IsVisible(Index As Integer) As Boolean + + Return (Index >= $iFirstVisibleDocument And index <= $iLastVisibleDocument) + +End + +' Public Function _GetX(Index As Integer) As Integer +' +' End +' +' Public Function _GetY(Index As Integer) As Integer +' +' End + +Private Function FirstVisibleDocument_Read() As Integer + + Return $iFirstVisibleDocument + +End + +Private Function LastVisibleDocument_Read() As Integer + + Return $iLastVisibleDocument + +End + +Private Function Column_Read() As Integer + + Return $iColumn + +End + +Private Sub Column_Write(Value As Integer) + + If Value = $iColumn Then Return + $iColumn = Value + DoLayout + +End + +Private Function AutoCenter_Read() As Boolean + + Return $bAutoCenter + +End + +Private Sub AutoCenter_Write(Value As Boolean) + + If value = $bAutoCenter Then Return + $bAutoCenter = Value + $tmrRefresh.Trigger + +End + +Private Function Border_Read() As Boolean + + Return $hView.Border + +End + +Private Sub Border_Write(Value As Boolean) + + $hView.Border = Value + +End + +Private Function ShowPage_Read() As Boolean + + Return $bShowPage + +End + +Private Sub ShowPage_Write(Value As Boolean) + + If $bShowPage = Value Then Return + $bShowPage = Value + $hView.Refresh + +End + +Private Function Desaturate_Read() As Boolean + + Return $bDesaturate + +End + +Private Sub Desaturate_Write(Value As Boolean) + + If $bDesaturate = Value Then Return + $bDesaturate = Value + Reset + +End diff --git a/comp/src/gb.form/.src/DocumentView/_DocumentItem.class b/comp/src/gb.form/.src/DocumentView/_DocumentItem.class new file mode 100644 index 00000000..a7eb13d2 --- /dev/null +++ b/comp/src/gb.form/.src/DocumentView/_DocumentItem.class @@ -0,0 +1,40 @@ +' Gambas class file + +Export +Property Read Height As Integer +Property Read Width As Integer +Public _Index As Integer +Event Foo +Private Function Height_Read() As Integer + + Return GetParent()._GetItemHeight(_Index) + +End + +Private Function Width_Read() As Integer + + Return GetParent().GetItemWidth(_Index) + +End + + +Private Function GetParent() As DocumentView + + Return Object.Parent(Me) + +End + + +Public Sub EnsureVisible() + + GetParent().Goto(_Index) + +End + + +Public Function IsVisible() As Boolean + + Return GetParent()._IsVisible(_Index) + +End + diff --git a/comp/src/gb.form/.src/DocumentView/_DocumentLayout.class b/comp/src/gb.form/.src/DocumentView/_DocumentLayout.class new file mode 100644 index 00000000..b5076ed7 --- /dev/null +++ b/comp/src/gb.form/.src/DocumentView/_DocumentLayout.class @@ -0,0 +1,8 @@ +' Gambas class file + +Export +Public Width As Integer +Public Height As Integer +Public Orientation As Integer = 1 + + diff --git a/comp/src/gb.form/.src/Expander/Expander.class b/comp/src/gb.form/.src/Expander/Expander.class new file mode 100644 index 00000000..6caf0b19 --- /dev/null +++ b/comp/src/gb.form/.src/Expander/Expander.class @@ -0,0 +1,100 @@ +' Gambas class file + +Export + +Inherits UserContainer + +Public Const _Properties As String = "*,Border=True,Text,TextFont,Animated,Hidden" +Public Const _DefaultEvent As String = "Show" +Public Const _Similar As String = "Panel" + +Event Show +Event Hide + +Property Hidden As Boolean +Property Text As String +Property TextFont As Font +Property Animated As Boolean +Property Border As Boolean + +Private frmExpander As FExpander + +Public Sub _new() + + frmExpander = New FExpander(Me) + Me._Container = frmExpander.GetContainer() + +End + +Public Sub _Show() + + Raise Show + +End + +Public Sub _Hide() + + Raise Hide + +End + +Private Function Hidden_Read() As Boolean + + Return frmExpander.GetHidden() + +End + +Private Sub Hidden_Write(Value As Boolean) + + frmExpander.SetHidden(Value) + +End + +Private Function Text_Read() As String + + Return frmExpander.GetText() + +End + +Private Sub Text_Write(Value As String) + + frmExpander.SetText(Value) + +End + +Private Function TextFont_Read() As Font + + Return frmExpander.GetFont() + +End + +Private Sub TextFont_Write(Value As Font) + + frmExpander.SetFont(Value) + +End + +Private Function Animated_Read() As Boolean + + Return frmExpander.GetAnimated() + +End + +Private Sub Animated_Write(Value As Boolean) + + frmExpander.SetAnimated(Value) + + +End + +Private Function Border_Read() As Boolean + + Return frmExpander.GetBorder() + +End + +Private Sub Border_Write(Value As Boolean) + + frmExpander.SetBorder(Value) + +End diff --git a/comp/src/gb.form/.src/Expander/FExpander.class b/comp/src/gb.form/.src/Expander/FExpander.class new file mode 100644 index 00000000..27179a1a --- /dev/null +++ b/comp/src/gb.form/.src/Expander/FExpander.class @@ -0,0 +1,218 @@ +' Gambas class file + +Private $bHidden As Boolean +Private $H As Integer +Private $bInside As Boolean +Private $bAnim As Boolean + +Private Const HIDE_TIME As Float = 0.1 +Private $sText As String + +Public Sub _new() + + 'dwgTitle_Font + +End + + +Private Sub GetParent() As Expander + + Return Me.Parent + +End + + +Public Sub GetContainer() As Container + + Return panContainer + +End + +Public Sub GetHidden() As Boolean + + Return Not panContainer.Visible + +End + +' Private Sub UpdatePicture() +' +' If $bHidden Then +' $hIcon = Picture["img/8/side-right.png"] +' $hIconVoid = Picture["img/8/side-right-void.png"] +' Else +' $hIcon = Picture["img/8/side-bottom.png"] +' $hIconVoid = Picture["img/8/side-bottom-void.png"] +' Endif +' +' 'If $bInside Then +' btnExpand.Picture = $hIcon +' 'Else +' ' btnExpand.Picture = $hIconVoid +' 'Endif +' +' End + + +Public Sub SetHidden(bHidden As Boolean) + + Dim DY As Integer + Dim eTime As Float + + If Me.Parent.Design Then Return + If bHidden = $bHidden Then Return + + $bHidden = bHidden + dwgTitle.Refresh + + If $bHidden Then + + $H = Me.Parent.H + + If $bAnim Then + eTime = Timer + DY = $H - dwgTitle.H + While Timer < (eTime + HIDE_TIME) + Me.Parent.H = $H - ((Timer - eTime) / HIDE_TIME) * DY + Wait + Wend + Endif + + Me.Parent.H = dwgTitle.H + + panContainer.Hide + GetParent()._Hide() + + Else + + GetParent()._Show() + panContainer.Show + + If $bAnim Then + eTime = Timer + DY = $H - dwgTitle.H + While Timer < (eTime + HIDE_TIME) + Me.Parent.H = dwgTitle.H + ((Timer - eTime) / HIDE_TIME) * DY + Wait + Wend + Endif + + Me.Parent.H = $H + Endif + +End + + +Public Sub GetText() As String + + Return $sText + +End + +Public Sub SetText(sText As String) + + $sText = sText + dwgTitle.Refresh + +End + +Public Sub GetFont() As Font + + Return dwgTitle.Font + +End + +Public Sub SetFont(hFont As Font) + + dwgTitle.Font = hFont + dwgTitle.Refresh + +End + + + +Public Sub btnExpand_MouseDown() + + If Not Me.Enabled Then Return + SetHidden(Not $bHidden) + +End + +Public Sub GetAnimated() As Boolean + + Return $bAnim + +End + +Public Sub SetAnimated(bAnim As Boolean) + + $bAnim = bAnim + +End + +Public Sub dwgTitle_Font() + + dwgTitle.H = Desktop.Scale + Max(Desktop.Scale * 2, ((dwgTitle.Font.Height + Desktop.Scale - 1) \ Desktop.Scale) * Desktop.Scale) + +End + +Public Sub dwgTitle_MouseDown() + + SetHidden(Not $bHidden) + +End + +Public Sub GetBorder() As Boolean + + Return panContainer.Border <> Border.None + +End + +Public Sub SetBorder(bBorder As Boolean) + + panContainer.Border = If(bBorder, Border.Plain, Border.None) + +End + + +Public Sub dwgTitle_Draw() + + Dim iFlag As Integer + Dim Y, W As Integer + Dim D As Integer + + D = Desktop.Scale + W = D * 3 / 2 + Y = (Paint.H - W) / 2 + + If Not Me.Enabled Then iFlag += Draw.Disabled + If $bInside And If Me.Enabled Then iFlag += Draw.Hover + + If System.RightToLeft Then + Style.PaintArrow(Paint.W - W, Y, W, W, If($bHidden, Align.Left, Align.Bottom), iFlag) + If $bInside Then Paint.DrawTextShadow($sText, 0, 0, Paint.W - W - D, Paint.H, Align.Normal) + Paint.DrawText($sText, 0, 0, Paint.W - W - D, Paint.H, Align.Normal) + Else + Style.PaintArrow(0, Y, W, W, If($bHidden, Align.Right, Align.Bottom), iFlag) + If $bInside Then Paint.DrawTextShadow($sText, W + D, 0, Paint.W, Paint.H, Align.Normal) + Paint.DrawText($sText, W + D, 0, Paint.W, Paint.H, Align.Normal) + Endif + +End + +Public Sub dwgTitle_Enter() + + If Me.Enabled Then + $bInside = True + dwgTitle.Mouse = Mouse.Pointing + dwgTitle.Refresh + Endif + +End + +Public Sub dwgTitle_Leave() + + $bInside = False + dwgTitle.Mouse = Mouse.Default + dwgTitle.Refresh + +End diff --git a/comp/src/gb.form/.src/Expander/FExpander.form b/comp/src/gb.form/.src/Expander/FExpander.form new file mode 100644 index 00000000..ee6a721c --- /dev/null +++ b/comp/src/gb.form/.src/Expander/FExpander.form @@ -0,0 +1,22 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,65,59) + Resizable = False + Arrangement = Arrange.Vertical + { dwgTitle DrawingArea + MoveScaled(1,2,58,4) + } + { HBox1 HBox + MoveScaled(2,9,49,41) + Expand = True + { Panel1 Panel + MoveScaled(2,8,2,3) + } + { panContainer Panel + MoveScaled(9,5,34,26) + Expand = True + Border = Border.Plain + } + } +} diff --git a/comp/src/gb.form/.src/FInputBox.class b/comp/src/gb.form/.src/FInputBox.class new file mode 100644 index 00000000..144cce3a --- /dev/null +++ b/comp/src/gb.form/.src/FInputBox.class @@ -0,0 +1,56 @@ +' Gambas class file + +Private $sPrompt As String +Private $sTitle As String +Private $sValue As String + +Public Sub Run(sPrompt As String, Optional sTitle As String, sDefault As String) As String + + If Not sTitle Then + Try sTitle = Application.ActiveWindow.Title + If Error Then sTitle = Application.Name + Endif + + $sPrompt = sPrompt + $sTitle = sTitle + $sValue = sDefault + + If Me.ShowModal() Then Return $sValue + +End + + +Public Sub Form_Open() + + lblMessage.Text = $sPrompt + txtValue.Text = $sValue + txtValue.H = txtValue.Font.H + Desktop.Scale * 2 + + Me.Title = $sTitle + + panBox.W = Max(Desktop.Scale * 48, lblMessage.W) + panBox.Arrangement = Arrange.Vertical + + txtValue.SelectAll + txtValue.SetFocus + +End + +Public Sub btnCancel_Click() + + Me.Close + +End + +Public Sub btnOK_Click() + + $sValue = txtValue.Text + Me.Close(True) + +End + +' Public Sub Form_Arrange() +' +' Me.Resize(btnOK.Parent.X + btnOK.W + Desktop.Scale, Max(btnOK.Parent.Y + btnCancel.Y + btnCancel.H, txtValue.Parent.Y + txtValue.Y + txtValue.H) + Desktop.Scale) +' +' End diff --git a/comp/src/gb.form/.src/FInputBox.form b/comp/src/gb.form/.src/FInputBox.form new file mode 100644 index 00000000..9b38c0d4 --- /dev/null +++ b/comp/src/gb.form/.src/FInputBox.form @@ -0,0 +1,39 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,68,16) + Resizable = False + Arrangement = Arrange.Horizontal + AutoResize = True + Spacing = True + Margin = True + { panBox Panel + MoveScaled(1,1,48,12) + AutoResize = True + Spacing = True + { lblMessage TextLabel + MoveScaled(0,0,48,7) + AutoResize = True + } + { txtValue TextBox + MoveScaled(0,8,15,4) + } + } + { Panel1 Panel + MoveScaled(50,1,2,10) + } + { VBox2 VBox + MoveScaled(53,1,14,9) + Spacing = True + { btnOK Button + MoveScaled(0,0,14,4) + Text = ("OK") + Default = True + } + { btnCancel Button + MoveScaled(0,5,14,4) + Text = ("Cancel") + Cancel = True + } + } +} diff --git a/comp/src/gb.form/.src/File/Bookmark.class b/comp/src/gb.form/.src/File/Bookmark.class new file mode 100644 index 00000000..8da74260 --- /dev/null +++ b/comp/src/gb.form/.src/File/Bookmark.class @@ -0,0 +1,11 @@ +' Gambas class file + +Property Name As String Use $sName +Property Path As String Use $sPath +Property Icon As String Use $sIcon + +Private Sub Path_Write(Value As String) + + $sPath = Main.NormalizePath(Value) + +End diff --git a/comp/src/gb.form/.src/File/Bookmark/CBookmark.class b/comp/src/gb.form/.src/File/Bookmark/CBookmark.class new file mode 100644 index 00000000..6dda7a37 --- /dev/null +++ b/comp/src/gb.form/.src/File/Bookmark/CBookmark.class @@ -0,0 +1,54 @@ +' Gambas class file + +Public Name As String +Public Link As String +Public Icon As String +Public Index As Integer + +Property Read Path As String + + +Public Sub _new(sLink As String, Optional sName As String, sIcon As String) + + {Link} = sLink + + SetName(sName) + SetIcon(sIcon) + +End + +Private Function Path_Read() As String + + Dim sLink As String = {Link} + + If Left(sLink) <> "/" Then sLink = Mid$(sLink, 2) + If Len(sLink) > 1 And If Right(sLink) = "/" Then sLink = Left(sLink, -1) + Return sLink + +End + +Public Sub SetName(sName As String) + + If Not sName Then sName = File.Name({Link}) + Name = sName + +End + +Public Sub SetIcon(sIcon As String) + + If Not sIcon Then sIcon = "icon:/small/bookmark" + Icon = sIcon + +End + +Public Sub IsEditable() As Boolean + + Return Left({Link}) = "/" + +End + +Public Sub Exist() As Boolean + + Return IsDir(Me.Path) + +End diff --git a/comp/src/gb.form/.src/File/Bookmark/CBookmarkList.class b/comp/src/gb.form/.src/File/Bookmark/CBookmarkList.class new file mode 100644 index 00000000..97e3ba14 --- /dev/null +++ b/comp/src/gb.form/.src/File/Bookmark/CBookmarkList.class @@ -0,0 +1,190 @@ +' Gambas class file + +Inherits CBookmark[] + +Property Private As Collection[] + +Private $aPrivate As Collection[] +Private $iBookmarkAge As Integer + +Public Sub _new() + + Load + +End + +Public Sub AddBookmark(sLink As String, Optional sName As String, sIcon As String) + + Dim hBookmark As CBookmark + + hBookmark = New CBookmark(sLink, sName, sIcon) + Me.Add(hBookmark) + +End + +Public Sub RemoveBookmark(sLink As String) + + Dim hBookmark As CBookmark + Dim iInd As Integer + + hBookmark = FindBookmark(sLink) + If Not hBookmark Then Return + iInd = Me.Find(hBookmark) + Me.Remove(iInd) + +End + + +Public Sub Load() + + Dim iInd As Integer + Dim hSettings As Settings + Dim aBookmark As String[] + Dim cPrivate As Collection + Dim hBookmark As Bookmark + + If $iBookmarkAge = Bookmarks._Age Then Return + $iBookmarkAge = Bookmarks._Age + + Me.Clear() + + AddBookmark("$" & System.User.Home, ("Home"), "icon:/small/home") + If Component.IsLoaded("gb.desktop") Then + AddBookmark("$" & Desktop.Path, ("Desktop"), "icon:/small/desktop") + Endif + AddBookmark("$/", ("System"), "icon:/small/system") + + For Each hBookmark In Bookmarks._GetAll() + Try AddBookmark("#" & hBookmark.Path, hBookmark.Name, hBookmark.Icon) + Next + + If $aPrivate Then + For Each cPrivate In $aPrivate + If cPrivate["Path"] Then Try AddBookmark("#" & cPrivate["Path"], cPrivate["Name"], cPrivate["Icon"]) + Next + Endif + + If Component.IsLoaded("gb.settings") Then + + hSettings = New Settings("gb.form") + + For iInd = 1 To hSettings["/Bookmarks/Count", 0] + aBookmark = hSettings["/Bookmarks/Bookmark" & CStr(iInd)] + AddBookmark(aBookmark[0], aBookmark[1]) + Next + + Endif + +End + +Public Sub Save() + + Dim hSettings As Settings + Dim iInd As Integer + Dim hBookmark As CBookmark + + If Not Component.IsLoaded("gb.settings") Then Return + + hSettings = New Settings("gb.form") + + hSettings.Clear("/Bookmarks") + + For Each hBookmark In Me + If Left(hBookmark.Link) <> "/" Then Continue + Inc iInd + hSettings["/Bookmarks/Bookmark" & CStr(iInd)] = [hBookmark.Link, hBookmark.Name] + Next + + hSettings["/Bookmarks/Count"] = iInd + + hSettings.Save + +End + + +Private Function Private_Read() As Collection[] + + Return $aPrivate + +End + +Private Sub Private_Write(Value As Collection[]) + + $aPrivate = Value + Load + +End + +Public Sub FindBookmark({Link} As String) As CBookmark + + Dim hBookmark As CBookmark + + For Each hBookmark In Me + If Not hBookmark.Exist() Then Continue + If hBookmark.Link = {Link} Then Return hBookmark + Next + + If Left({Link}) = "/" Then + For Each hBookmark In Me + If Not hBookmark.Exist() Then Continue + If hBookmark.Path = {Link} Then Return hBookmark + Next + Endif + +End + +Public Sub FindBest(sDir As String) As CBookmark + + Dim hBookmark As CBookmark + Dim sBest As String + Dim iScore As Integer + Dim aBook As String[] + Dim aDir As String[] + Dim iInd As Integer + + aDir = Split(sDir, "/") + + For Each hBookmark In Me + If Not hBookmark.Exist() Then Continue + aBook = Split(hBookmark.Path, "/") + For iInd = 0 To Min(aDir.Max, aBook.Max) + If aBook[iInd] <> aDir[iInd] Then Break + Next + 'DEBUG "Comp:";; aBook.Join("|");; aDir.Join("|");; "=";; iInd + If iInd > iScore And If iInd > aBook.Max Then + iScore = iInd + sBest = hBookmark.Link + Endif + Next + + If iScore <= 1 Then sBest = "$/" + + Return FindBookmark(sBest) + +End + +Public Sub GetEditableCount() As Integer + + Dim hBookmark As CBookmark + Dim iCount As Integer + + For Each hBookmark In Me + If hBookmark.IsEditable() Then Inc iCount + Next + + Return iCount + +End + +Public Sub GetEditableBookmarks() As CBookmark[] + + Dim hBookmark As CBookmark + Dim hBookmarks As New CBookmark[] + + For Each hBookmark In Me + If hBookmark.IsEditable() Then hBookmarks.Add(hBookmark) + Next + + Return hBookmarks + +End diff --git a/comp/src/gb.form/.src/File/Bookmark/FEditBookmark.class b/comp/src/gb.form/.src/File/Bookmark/FEditBookmark.class new file mode 100644 index 00000000..d694fdef --- /dev/null +++ b/comp/src/gb.form/.src/File/Bookmark/FEditBookmark.class @@ -0,0 +1,140 @@ +' Gambas class file + +Private $hBookmarkList As CBookmarkList +Private $hBookmarks As CBookmark[] +Private $hCompletion As FileCompletion + +Public Sub Run(hBookmarkList As CBookmarkList) + + $hBookmarkList = hBookmarkList + FEditBookmark.ShowModal() + +End + + +Public Sub Form_Open() + + $hCompletion = New FileCompletion(txtPath) + + $hBookmarks = $hBookmarkList.GetEditableBookmarks() + + With tvwBookmark + .Columns.Count = 2 + .Columns[0].Text = ("Name") + .Columns[1].Text = ("Path") + .Columns[0].Width = Desktop.Scale * 24 + .Rows.Count = $hBookmarkList.GetEditableCount() + .Rows.Height = -1 + End With + +End + +' Public Sub txtPath_Click() +' +' Dialog.Path = txtPath.Text +' If Dialog.SelectDirectory() Then Return +' txtPath.Text = Dialog.Path +' +' End + +Public Sub btnClose_Click() + + Me.Close + +End + +Public Sub tvwBookmark_Data(Row As Integer, Column As Integer) + + Select Case Column + Case 0 + tvwBookmark.Data.Text = $hBookmarks[Row].Name + Case 1 + tvwBookmark.Data.Text = $hBookmarks[Row].Link + End Select + tvwBookmark.Data.Padding = 4 + +End + +Public Sub tvwBookmark_Click() + + Dim hBookmark As CBookmark = $hBookmarks[tvwBookmark.Row] + + If Not hBookmark.IsEditable() Then Return + + If tvwBookmark.Column = 0 Then + tvwBookmark.Edit + Else + tvwBookmark.EditWith(txtPath) + $hCompletion.Close + Endif + +End + +Public Sub btnUp_Click() + + Dim iRow As Integer = tvwBookmark.Row + Dim iOther As Integer + + If iRow <= 0 Then Return + + tvwBookmark.Save + + iOther = $hBookmarkList.Find($hBookmarks[iRow - 1]) + iRow = $hBookmarkList.Find($hBookmarks[iRow]) + + Swap $hBookmarkList[iRow], $hBookmarkList[iOther] + $hBookmarks = $hBookmarkList.GetEditableBookmarks() + + tvwBookmark.Refresh + Dec tvwBookmark.Row + +End + +Public Sub btnDown_Click() + + Dim iRow As Integer = tvwBookmark.Row + Dim iOther As Integer + + If iRow < 0 Or If iRow = $hBookmarks.Max Then Return + + tvwBookmark.Save + + iOther = $hBookmarkList.Find($hBookmarks[iRow + 1]) + iRow = $hBookmarkList.Find($hBookmarks[iRow]) + + Swap $hBookmarkList[iRow], $hBookmarkList[iOther] + $hBookmarks = $hBookmarkList.GetEditableBookmarks() + + tvwBookmark.Refresh + Inc tvwBookmark.Row + +End + +Public Sub btnDelete_Click() + + Dim iRow As Integer = tvwBookmark.Row + + If iRow < 0 Then Return + + If Message.Delete(("Do you really want to remove this bookmark?"), ("Remove"), ("Cancel")) = 2 Then Return + + iRow = $hBookmarkList.Find($hBookmarks[iRow]) + + $hBookmarkList.Remove(iRow) + $hBookmarks = $hBookmarkList.GetEditableBookmarks() + + Dec tvwBookmark.Rows.Count + tvwBookmark.Refresh + tvwBookmark.Row = -1 + +End + +Public Sub tvwBookmark_Save(Row As Integer, Column As Integer, Value As String) + + If Column = 0 Then + If Value Then $hBookmarks[Row].SetName(Trim(Value)) + Else + If Value Then $hBookmarks[Row].Link = Value + Endif + +End diff --git a/comp/src/gb.form/.src/File/Bookmark/FEditBookmark.form b/comp/src/gb.form/.src/File/Bookmark/FEditBookmark.form new file mode 100644 index 00000000..2e30f24d --- /dev/null +++ b/comp/src/gb.form/.src/File/Bookmark/FEditBookmark.form @@ -0,0 +1,50 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,90,47) + Text = ("Edit bookmarks") + Icon = Picture["icon:/small/bookmark"] + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + { tvwBookmark TableView + MoveScaled(1,1,88,38) + Expand = True + Mode = Select.Single + Header = GridView.Horizontal + } + { HBox1 HBox + MoveScaled(2,41,87,4) + Spacing = True + { btnUp Button + MoveScaled(0,0,18,4) + Text = Shortcut(("Up"), "U") + Picture = Picture["icon:/small/up"] + } + { btnDown Button + MoveScaled(19,0,18,4) + Text = Shortcut(("Down"), "D") + Picture = Picture["icon:/small/down"] + } + { btnDelete Button + MoveScaled(38,0,18,4) + Text = Shortcut(("Remove"), "R") + Picture = Picture["icon:/small/delete"] + } + { Panel1 Panel + MoveScaled(64,0,1,4) + Expand = True + } + { btnClose Button + MoveScaled(68,0,18,4) + Text = ("Close") + Cancel = True + } + } + { txtPath TextBox + MoveScaled(47.25,26.75,24,4) + Visible = False + Ignore = True + Border = False + } +} diff --git a/comp/src/gb.form/.src/File/Bookmarks.class b/comp/src/gb.form/.src/File/Bookmarks.class new file mode 100644 index 00000000..afccc6df --- /dev/null +++ b/comp/src/gb.form/.src/File/Bookmarks.class @@ -0,0 +1,63 @@ +' Gambas class file + +Export + +Static Property Read Count As Integer + +Static Private $aBookmark As New Bookmark[] + +Static Public _Age As Integer = 1 + +Static Public Sub Add(Path As String, Optional Name As String, Icon As String) + + Dim hBookmark As Bookmark + + hBookmark = New Bookmark + With hBookmark + .Name = Name + .Path = Main.NormalizePath(Path) + .Icon = Icon + End With + + $aBookmark.Add(hBookmark) + Inc _Age + +End + +Static Public Sub Remove(Path As String) + + Dim I As Integer + + Path = Main.NormalizePath(Path) + + While I < $aBookmark.Count + If $aBookmark[I].Path = Path Then + $aBookmark.Remove(I) + Else + Inc I + Endif + Wend + + Inc _Age + +End + +Static Private Function Count_Read() As Integer + + Return $aBookmark.Count + +End + +Static Public Sub Clear() + + $aBookmark.Clear + Inc _Age + +End + +Static Public Sub _GetAll() As Bookmark[] + + Return $aBookmark + +End + diff --git a/comp/src/gb.form/.src/File/CTaskPreview.class b/comp/src/gb.form/.src/File/CTaskPreview.class new file mode 100644 index 00000000..271a590f --- /dev/null +++ b/comp/src/gb.form/.src/File/CTaskPreview.class @@ -0,0 +1,98 @@ +' Gambas class file + +Inherits Task + +Private $sDir As String +Private $iSize As Integer +Private $aPreview As String[] + +Public Sub _new(sDir As String, iSize As Integer, aPreview As String[]) + + $sDir = sDir + $iSize = iSize + $aPreview = aPreview + +End + +Private Sub PrintIcon(sFile As String, hImage As Image) + + Dim hIcon As Image + Dim sTemp As String + + hIcon = New Image(hImage.W + 4, hImage.H + 4, Color.Transparent) + Paint.Begin(hIcon) + Paint.AntiAlias = False + Paint.LineWidth = 2 + Paint.Rectangle(0, 0, hIcon.W, hIcon.H) + Paint.Background = Color.Gray + Paint.Stroke + Paint.End + hIcon.DrawImage(hImage, 2, 2) + + sTemp = File.SetExt(Temp$(), "png") + hIcon.Save(sTemp) + Print sFile; "\t"; sTemp + +End + +Public Sub Main() + + Dim sFile As String + Dim sExt As String + Dim sPath As String + Dim hImage As Image + Dim hSvgImage As SvgImage + + Application.Priority += 10 + + For Each sFile In $aPreview + + sPath = $sDir &/ sFile + sExt = LCase(File.Ext(sFile)) + + If sExt = "jpg" Or If sExt = "jpeg" Or If sExt = "png" Or If sExt = "gif" Or If sExt = "bmp" Or If sExt = "xpm" Then + + If Stat(sPath).Size > 4194304 Then Continue + + Try hImage = Image.Load(sPath) + If Error Then Continue + + If Not (hImage.Width = $iSize And hImage.Height = $iSize) Then + If hImage.Width > hImage.Height Then + hImage = hImage.Stretch($iSize, ($iSize * hImage.Height) \ hImage.Width) + Else + hImage = hImage.Stretch(($iSize * hImage.Width) \ hImage.Height, $iSize) + Endif + Endif + + PrintIcon(sFile, hImage) + + Else If sExt = "svg" Or If sExt = "svgz" Then + + Try hSvgImage = SvgImage.Load(sPath) + If Error Then Continue + + If hSvgImage.Width > hSvgImage.Height Then + hSvgImage.Resize($iSize, $iSize * hSvgImage.Height / hSvgImage.Width) + Else + hSvgImage.Resize($iSize * hSvgImage.Width / hSvgImage.Height, $iSize) + Endif + + hImage = New Image(hSvgImage.Width, hSvgImage.Height, Color.Transparent) + Paint.Begin(hImage) + hSvgImage.Paint() + Paint.End + + PrintIcon(sFile, hImage) + + Endif + + Next + + Print "." + + Do + Sleep 3600 + Loop + +End diff --git a/comp/src/gb.form/.src/File/Chooser/DirButton.class b/comp/src/gb.form/.src/File/Chooser/DirButton.class new file mode 100644 index 00000000..83c84052 --- /dev/null +++ b/comp/src/gb.form/.src/File/Chooser/DirButton.class @@ -0,0 +1,134 @@ +' Gambas class file + +Inherits DrawingArea + +Event Click + +Property Path As String +Property Label As String + +Private $hObs As Observer +Private $sPath As String +Private $sText As String +Private $sLabel As String + +Public Sub _new() + + $hObs = New Observer(Me) As "DirButton" + Me.Mouse = Mouse.Pointing + +End + +Private Sub Ellipsize(sText As String, hFont As Font, W As Integer) As String + + Dim sCar As String = "…" + Dim iPos As Integer + + If Not sText Then Return + If hFont.TextWidth(sText) <= W Then Return sText + + For iPos = 1 To String.Len(sText) + If hFont.TextWidth(String.Left(sText, iPos) & sCar) > W Then Break + Next + + Return String.Left(sText, iPos - 1) & sCar + +End + +Public Sub DirButton_Draw() + + Paint.Background = Color.LightForeground + + Paint.LineWidth = 1.5 + Paint.MoveTo(Desktop.Scale / 2, Paint.H / 2 - Desktop.Scale / 2) + Paint.LineTo(Desktop.Scale, Paint.H / 2) + Paint.LineTo(Desktop.Scale / 2, Paint.H / 2 + Desktop.Scale / 2) + Paint.LineCap = Paint.LineCapRound + Paint.Stroke + + Paint.Background = Style.ForegroundOf(Me) + + If Me.Hovered Then + 'Paint.Background = Color.SetAlpha(Paint.Background, 128) + Paint.DrawTextShadow($sText, Desktop.Scale * 1.75, 0, Paint.W - Desktop.Scale, Paint.H, Align.Left) + 'Paint.Background = Color.SetAlpha(Paint.Background, 0) + Endif + Paint.DrawText($sText, Desktop.Scale * 1.75, 0, Paint.W - Desktop.Scale, Paint.H, Align.Left) + +End + +Public Sub DirButton_Enter() + + Me.Refresh + +End + +Public Sub DirButton_Leave() + + Me.Refresh + +End + +Public Sub DirButton_Font() + + UpdateSize + +End + +Private Sub GetText() As String + + If $sLabel Then Return $sLabel + Return File.Name($sPath) + +End + +Private Sub UpdateSize() + + Dim W As Integer + Dim sText As String + + sText = GetText() + + W = Min(Desktop.Scale * 2 + Me.Font.TextWidth(sText), Desktop.Scale * 20) + + $sText = Ellipsize(sText, Me.Font, W - Desktop.Scale * 2) + If $sText <> sText Then + Me.Tooltip = sText + Else + Me.Tooltip = "" + Endif + + Me.W = W + +End + +Public Sub DirButton_MouseDown() + + Raise Click + +End + +Private Function Path_Read() As String + + Return $sPath + +End + +Private Sub Path_Write(Value As String) + + $sPath = Value + UpdateSize + +End + +Private Function Label_Read() As String + + Return $sLabel + +End + +Private Sub Label_Write(Value As String) + + $sLabel = Value + +End diff --git a/comp/src/gb.form/.src/File/Chooser/DirChooser.class b/comp/src/gb.form/.src/File/Chooser/DirChooser.class new file mode 100644 index 00000000..a3c80b8a --- /dev/null +++ b/comp/src/gb.form/.src/File/Chooser/DirChooser.class @@ -0,0 +1,272 @@ +' Gambas class file + +Inherits UserControl +Export + +Public Const _Properties As String = "*,Border=True,Root,Picture,ShowHidden,ShowFile,ShowDetailed,ShowPreview,ShowBookmark=True,ShowSplitter=True,ShowToolbar=True" +Public Const _DefaultEvent As String = "Change" +Public Const _DefaultSize As String = "36,36" +Public Const _Group As String = "Chooser" + +Property Root As String +Property Picture As Picture +Property SelectedPath As String +Property Value As String +Property ShowFile As Boolean +Property ShowHidden As Boolean +Property ShowDetailed As Boolean +Property ShowBookmark As Boolean +Property ShowSplitter As Boolean +Property ShowPreview As Boolean +Property ShowToolbar As Boolean +Property Bookmarks As Collection[] +Property Icon As Picture +Property Settings As Variant[] +Property Read DirView As DirView +Property Read FileView As FileView +Property Border As Boolean + +Event Change +Event Activate +Event Icon(Path As String) +'EVENT ShowHidden + +Private frmChooser As FDirChooser + +Public Sub _new() + + frmChooser = New FDirChooser(Me, False) As "frmChooser" + Object.Attach(frmChooser, Me, "frmChooser") + 'Object.Delegate(frmChooser, ME) + +End + +Public Sub frmChooser_Open() + + Last.Form_Open + +End + +Public Sub frmChooser_Change() + + Raise Change + +End + +Public Sub frmChooser_Select() + + Raise Activate + +End + +Public Sub frmChooser_GetIcon(Path As String) + + Raise Icon(Path) + +End + +Private Function SelectedPath_Read() As String + + Return frmChooser.GetDir() + +End + +Private Sub SelectedPath_Write(sDir As String) + + frmChooser.SetDir(sDir) + +End + +Private Function ShowFile_Read() As Boolean + + Return frmChooser.GetFileVisible() + +End + +Private Sub ShowFile_Write(bShowFile As Boolean) + + frmChooser.SetFileVisible(bShowFile) + +End + +Private Function ShowHidden_Read() As Boolean + + Return frmChooser.GetShowHidden() + +End + +Private Sub ShowHidden_Write(bShowHidden As Boolean) + + frmChooser.SetShowHidden(bShowHidden) + +End + +Private Function ShowDetailed_Read() As Boolean + + Return frmChooser.GetShowDetailed() + +End + +Private Sub ShowDetailed_Write(bShowDetailed As Boolean) + + frmChooser.SetShowDetailed(bShowDetailed) + +End + +Private Function Root_Read() As String + + Return frmChooser.GetRoot() + +End + +Private Sub Root_Write(Value As String) + + frmChooser.SetRoot(Value) + +End + +Private Function Picture_Read() As Picture + + Return frmChooser.GetPicture() + +End + +Private Sub Picture_Write(Value As Picture) + + frmChooser.SetPicture(Value) + +End + +Private Function Value_Read() As String + + Return frmChooser.GetDir() + +End + +Private Sub Value_Write(Value As String) + + frmChooser.SetDir(Value) + +End + +Private Function ShowBookmark_Read() As Boolean + + Return frmChooser.IsBookmarkVisible() + +End + +Private Sub ShowBookmark_Write(Value As Boolean) + + frmChooser.ShowBookmark(Value) + +End + +Private Function Bookmarks_Read() As Collection[] + + Return frmChooser.GetPrivateBookmarks() + +End + +Private Sub Bookmarks_Write(Value As Collection[]) + + frmChooser.SetPrivateBookmarks(Value) + +End + +Private Function Icon_Read() As Picture + + Return frmChooser.FileView.Icon + +End + +Private Sub Icon_Write(Value As Picture) + + frmChooser.FileView.Icon = Value + frmChooser.DirView.Icon = Value + +End + + +Private Function Settings_Read() As Variant[] + + Return frmChooser.GetSettings() + +End + +Private Sub Settings_Write(Value As Variant[]) + + frmChooser.SetSettings(Value) + +End + +Private Function ShowSplitter_Read() As Boolean + + Return frmChooser.GetSplitter() + +End + +Private Sub ShowSplitter_Write(Value As Boolean) + + frmChooser.SetSplitter(Value) + +End + +' PUBLIC SUB frmChooser_ShowHidden() +' +' RAISE ShowHidden +' +' END + +Public Sub Reload() + + frmChooser.Reload + +End + +Private Function FileView_Read() As FileView + + Return frmChooser.FileView + +End + +Private Function DirView_Read() As DirView + + Return frmChooser.DirView + +End + +Private Function Border_Read() As Boolean + + Return frmChooser.HasBorder() + +End + +Private Sub Border_Write(Value As Boolean) + + frmChooser.SetBorder(Value) + +End + +Private Function ShowPreview_Read() As Boolean + + Return frmChooser.GetShowPreview() + +End + +Private Sub ShowPreview_Write(Value As Boolean) + + frmChooser.SetShowPreview(Value) + +End + +Private Function ShowToolbar_Read() As Boolean + + Return frmChooser.GetShowToolbar() + +End + +Private Sub ShowToolbar_Write(Value As Boolean) + + frmChooser.SetShowToolbar(Value) + +End diff --git a/comp/src/gb.form/.src/File/Chooser/FDirChooser.class b/comp/src/gb.form/.src/File/Chooser/FDirChooser.class new file mode 100644 index 00000000..ba284d0f --- /dev/null +++ b/comp/src/gb.form/.src/File/Chooser/FDirChooser.class @@ -0,0 +1,1676 @@ +' Gambas class file + +Class Desktop + +Public (DirView) As DirView +Public (FileView) As FileView + +Event Change +Event {Select} +Event GetIcon(Path As String) +Event ShowHidden +Event Cancel + +Private mnuBookmark As Menu +Private mnuEditBookmark As Menu +Private mnuShowHiddenFiles As Menu +Private mnuShowDetailed As Menu +Private mnuShowPreview As Menu +Private mnuUncompress As Menu +Private mnuRename As Menu +Private mnuCopy As Menu +Private mnuDelete As Menu +Private mnuDeleteDir As Menu +Private mnuProperty As Menu + +Private $bView As Boolean +Private $aFilter As String[] +Private $bFile As Boolean +Private $hBookmarkList As CBookmarkList +Private $hCurrentBookmark As CBookmark +Private $bShowBookmark As Boolean +Private $hWatch As Watcher +'Private $bPressed As Boolean + +Private $sLast As String +Private $aHistory As New String[] +Private $iHistory As Integer = -1 +Private $bNoSaveHistory As Boolean + +Static Private $aIconSize As Integer[] = [16, 22, 32, 48, 64, 96, 128, 192, 256] +Static Private $hGradient As Image + + +Public Sub _new(Optional bFile As Boolean) + + Dim hChild As Control + Dim iCol As Integer + + DirView = dvwChoose + FileView = fvwChoose + + $hGradient = New Image(dwgGradient.W, dwgGradient.H, Color.Transparent) + + Paint.Begin($hGradient) + + iCol = Style.BackgroundOf(Me) + + Paint.Brush = Paint.LinearGradient(0, 0, Paint.W, 0, [Color.SetAlpha(iCol, 255), iCol], [0, 1]) + Paint.Rectangle(0, 0, Paint.W, Paint.H) + Paint.Fill + + Paint.End + + ScrollArea(DirView.Proxy.Proxy.Proxy).Shadow = True + + For Each hChild In FileView.Children + Do + If hChild Is ScrollArea Then + ScrollArea(hChild).Shadow = True + Break + Endif + hChild = hChild.Proxy + If Not hChild Then Break + Loop + + Next + + $bShowBookmark = True + $hBookmarkList = New CBookmarkList + + sldIconSize.Value = $aIconSize.Find(32) + + 'btnParent.Picture = Main.GetArrow(Align.Left, 16).Picture + + $hWatch = New Watcher(fvwChoose) As "FileView" + + FillMenu + + SetRoot() + + $bFile = bFile + + If Not bFile Then + UpdateFilterPanel + UpdateView + Else + btnView_Click + btnView.Visible = False + txtFile.Visible = True + cmbFilter.Visible = True + SetMulti(False) + 'SetFont(Me.Font) + SetFilter() + Endif + + SetBookmark($hBookmarkList.FindBest(System.User.Home)) + $sLast = dvwChoose.Current + SaveToHistory + +End + + +' Public Sub txtDir_Change() +' +' $sActivate = txtDir.Text +' dvwChoose.Current = txtDir.Text +' +' End + +' Public Sub txtDir_Click() +' +' 'cmbDir_Activate +' +' End + +Private Sub UpdateLabelDir() + + Dim sDir As String + Dim sName As String + Dim sPath As String + Dim hDirButton As DirButton + Dim hCtrl As Control + Dim aCtrl As New Control[] + + For Each hCtrl In panDir.Children + If hCtrl Is DirButton Then aCtrl.Add(hCtrl) + Next + For Each hCtrl In aCtrl + hCtrl.Delete + Next + + sDir = dvwChoose.Current + + sPath = "/" + For Each sName In Split(Mid$(sDir, 2), "/") + + sPath &/= sName + + If Not IsBookmarkVisible() Then + If dvwChoose.Root Begins sPath Then Continue + Endif + + hDirButton = New DirButton(panDir) As "DirButton" + hDirButton.Path = sPath + + Next + + btnParent.Enabled = sDir <> "/" + + dwgGradient.Raise + +End + +Public Sub DirButton_Click() + + Dim sDir As String = Last.Path + + If sDir = dvwChoose.Current Then + ' Just refresh the file view + DirCache[dvwChoose.Current].Clear + fvwChoose.Reload + Else + SetDir(sDir) + Endif + +End + + + +Public Sub dvwChoose_Click() + + If dvwChoose.Current = $sLast Then Return + + SaveToHistory + $sLast = dvwChoose.Current + + If panView.Visible Then + fvwChoose.Dir = dvwChoose.Current + fvwChoose.Reload + Endif + + UpdateLabelDir + + ' IF $sActivate THEN + ' IF $sActivate = dvwChoose.Current THEN + ' IF cmbDir.Find($sActivate) = 0 THEN cmbDir.Add($sActivate) + ' ENDIF + ' $sActivate = "" + ' ENDIF + + If txtFile.ReadOnly Then + txtFile.Text = "" + Else + txtFile_Change + Endif + + Raise Change + +End + + +Public Sub Form_Open() + + 'DirView = dvwChoose + 'FileView = fvwChoose + + btnProperty.Visible = Component.IsLoaded("gb.desktop") + + UpdateLabelDir + 'If $bFile Then txtFile.SetFocus + Raise Change + +End + +Private Sub UpdateZoom() + + panIconSize.Visible = Not fvwChoose.ShowDetailed And $bView And fvwChoose.Visible + +End + +Private Sub UpdateView() + + panView.Visible = $bView + mnuShowDetailed.Visible = $bView + mnuShowPreview.Visible = $bView + btnDetail.Visible = $bView + btnPreview.Visible = $bView + +End + +Public Sub btnView_Click() + + $bView = Not $bView + UpdateView + If $bView Then + fvwChoose.Dir = dvwChoose.Current + splChoose.Layout = [1, 2] + Endif + UpdateZoom + +End + +Public Sub mnuShowDetailed_Click() + + fvwChoose.ShowDetailed = Not fvwChoose.ShowDetailed + mnuShowDetailed.Checked = fvwChoose.ShowDetailed + Object.Lock(btnDetail) + btnDetail.Value = fvwChoose.ShowDetailed + Object.Unlock(btnDetail) + UpdateZoom + ' If fvwChoose.ShowDetailed Then + ' btnDetailed.Picture = Picture["icon:/small/view-icon"] + ' Else + ' btnDetailed.Picture = Picture["icon:/small/view-detail"] + ' Endif + +End + +' Private Sub AddToHistory(sDir As String) +' +' Dim iInd As Integer +' +' iInd = $aHistory.Find(sDir) +' If iInd >= 0 Then $aHistory.Remove(iInd) +' $aHistory.Add(sDir) +' While $aHistory.Count > 16 +' $aHistory.Remove(0) +' Wend +' +' Object.Lock(txtDir) +' txtDir.List = $aHistory +' Object.Unlock(txtDir) +' +' End + +Private Sub UpdateBookmarkButton() + + If IsBookmarkVisible() And If $hCurrentBookmark Then + btnBookmark.Text = Replace($hCurrentBookmark.Name, "&", "&&") + btnBookmark.Picture = Picture[$hCurrentBookmark.Icon] + btnRoot.Picture = Picture["icon:/small/system"] + mnuEditBookmark.Enabled = $hBookmarkList.GetEditableCount() > 0 + btnBookmark.Show + dvwChoose.HideRoot = True + Else + 'btnBookmark.Text = File.Name(dvwChoose.Root) + btnRoot.Picture = dvwChoose.Picture 'Picture["icon:/small/directory"] + dvwChoose.HideRoot = False + btnBookmark.Hide + Endif + + btnBookmark.Tooltip = dvwChoose.Root + +End + + +Private Sub SetBookmark(hBookmark As CBookmark) + + 'If Not hBookmark Then Return + + $hCurrentBookmark = hBookmark + + If hBookmark Then + SetRoot(hBookmark.Path) + dvwChoose.Picture = Picture[hBookmark.Icon] + Endif + + UpdateBookmarkButton + +End + + +Public Sub SetDir(sDir As String) + + If sDir = dvwChoose.Current Then Return + + If IsBookmarkVisible() Then + SetBookmark($hBookmarkList.FindBest(sDir)) + Endif + + dvwChoose.Current = sDir + +End + +Public Function GetDir() As String + + Return dvwChoose.Current + +End + +Public Function GetShowDetailed() As Boolean + + Return fvwChoose.ShowDetailed + +End + +Public Sub SetShowDetailed(bShowDetailed As Boolean) + + If fvwChoose.ShowDetailed <> bShowDetailed Then mnuShowDetailed_Click + +End + +Public Function GetFileVisible() As Boolean + + Return panView.Visible + +End + +Public Sub SetFileVisible(bVisible As Boolean) + + If panView.Visible <> bVisible Then btnView_Click + +End + +Public Function GetShowHidden() As Boolean + + Return fvwChoose.ShowHidden + +End + +Private Sub UpdateShowHidden() + + dvwChoose.ShowHidden = fvwChoose.ShowHidden + mnuShowHiddenFiles.Checked = fvwChoose.ShowHidden + +End + + +Public Sub mnuShowHiddenFiles_Click() + + fvwChoose.ShowHidden = Not fvwChoose.ShowHidden + UpdateShowHidden + Raise ShowHidden + +End + +Public Sub mnuShowPreview_Click() + + btnPreview.Value = Not btnPreview.Value + +End + + +Public Sub SetShowHidden(bShowHidden As Boolean) + + If bShowHidden = fvwChoose.ShowHidden Then Return + mnuShowHiddenFiles_Click + +End + +Public Function GetMulti() As Boolean + + Return fvwChoose.Mode = Select.Multiple + +End + +Public Sub SetMulti(bMulti As Boolean) + + fvwChoose.Mode = If(bMulti, Select.Multiple, Select.Single) + +End + +Public Function GetPath() As String + + If GetMulti() Then Return + + 'CheckFile() + If txtFile.Text Then + Return dvwChoose.Current &/ txtFile.Text + Endif + +End + +Public Sub SetPath(sPath As String) + + Dim sMsg As String + + If Not IsDir(File.Dir(sPath)) Then sMsg = ("Directory not found.") + + If File.IsHidden(sPath) Then SetShowHidden(True) + + SetDir(File.Dir(sPath)) + + If Not GetMulti() Then + + fvwChoose.Current = File.Name(sPath) + If txtFile.ReadOnly Then + txtFile.Text = fvwChoose.Current + Else + txtFile.Text = File.Name(sPath) + Endif + + Endif + + If sMsg Then Message.Error(sMsg & "\n\n" & sPath) + +End + + +Public Function GetPaths() As String[] + + Dim aPath As New String[] + Dim sFile As String + Dim sPath As String + + If GetMulti() Then + + For Each sFile In fvwChoose.Selection + aPath.Add(dvwChoose.Current &/ sFile) + Next + + Else + + sPath = GetPath() + If sPath Then aPath.Add(sPath) + + Endif + + Return aPath + +End + + +Public Sub fvwChoose_Select() + + If fvwChoose.Current Or If txtFile.ReadOnly Then + txtFile.Text = fvwChoose.Current + Endif + + If $bFile Then Raise Change + +End + +Public Sub SetShowDirectory(bShow As Boolean) + + fvwChoose.ShowDirectory = bShow + +End + +Public Function GetShowDirectory() As Boolean + + Return fvwChoose.ShowDirectory + +End + + +' Public Sub SetFont(hFont As Font) +' +' 'fvwChoose.Font = hFont +' ' DEC fvwChoose.Font.Grade +' +' End + +Public Sub fvwChoose_Activate() + + If IsDir(dvwChoose.Current &/ fvwChoose.Current) Then + dvwChoose.Current &/= fvwChoose.Current + Else + Raise {Select} + Endif + +End + +Public Sub SetFilter(Optional aFilter As String[]) + + Dim iInd As Integer + + cmbFilter.Clear + $aFilter = New String[] + + If aFilter Then + + If Odd(aFilter.Count) Then aFilter.Remove(aFilter.Max) + + For iInd = 0 To aFilter.Max Step 2 + If aFilter[iInd] = "*" Then Continue + $aFilter.Add(aFilter[iInd]) + cmbFilter.Add(aFilter[iInd + 1] & " (" & aFilter[iInd] & ")") + Next + + Endif + + $aFilter.Add("*") + cmbFilter.Add(("All files (*)")) + + cmbFilter.Index = 0 + UpdateFilterPanel + +End + +Public Sub SetFilterIndex(iInd As Integer) + + If iInd < 0 Then iInd = cmbFilter.Count - 1 + Try cmbFilter.Index = iInd + +End + +Public Sub GetFilterIndex() As Integer + + Return cmbFilter.Index + +End + + +Public Function GetFilter() As String[] + + Dim iInd As Integer + Dim aFilter As New String[] + + For iInd = 0 To $aFilter.Max + aFilter.Add($aFilter[iInd]) + aFilter.Add(cmbFilter[iInd].Text) + Next + + Return aFilter + +End + + +Public Sub cmbFilter_Click() + + fvwChoose.Filter = Split($aFilter[cmbFilter.Index], ";", Chr$(34), True) + +End + +Public Sub dvwChoose_Activate() + + If Not $bFile Then Raise {Select} + +End + +Public Sub fvwChoose_Icon(Path As String) + + Raise GetIcon(Path) + +End + +Public Sub dvwChoose_Icon(Path As String) + + Raise GetIcon(Path) + +End + + +Public Sub SetReadOnly(bReadOnly As Boolean) + + If Not $bFile Then Return + txtFile.ReadOnly = bReadOnly + +End + +Public Sub GetReadOnly() As Boolean + + If Not $bFile Then Return + Return txtFile.ReadOnly + +End + +Public Sub SetPicture(hPict As Picture) + + dvwChoose.Picture = hPict + If Not IsBookmarkVisible() Then UpdateBookmarkButton + +End + +Public Sub GetPicture() As Picture + + Return dvwChoose.Picture + +End + +Public Sub txtFile_GotFocus() + + If Not txtFile.ReadOnly Then txtFile.SelectAll + +End + +' Private Sub GetRealLink(sLink As String) As String +' +' If Left(sLink) <> "/" Then sLink = Mid$(sLink, 2) +' Return sLink +' +' End + +Public Sub mnuBookmark_Click() + + Dim hMenu As Menu = Last + Dim sLink As String = hMenu.Tag + Dim hBookmark As CBookmark = $hBookmarkList.FindBookmark(sLink) + + SetBookmark(hBookmark) + btnBookmark_DblClick + +End + + +Public Sub SetRoot(Optional sRoot As String) + + Dim hBookmark As CBookmark + + If sRoot <> "/" And If Right(sRoot) = "/" Then sRoot = Left(sRoot, -1) + + If sRoot = dvwChoose.Root Then Return + + Try dvwChoose.Root = sRoot + + hBookmark = $hBookmarkList.FindBookmark(sRoot) + SetBookmark(hBookmark) + +End + +Public Sub GetRoot() As String + + Return dvwChoose.Root + +End + +Public Sub SetPrivateBookmarks(aBookmark As Collection[]) + + $hBookmarkList.Private = aBookmark + FillMenu + +End + +Public Sub GetPrivateBookmarks() As Collection[] + + Return $hBookmarkList.Private + +End + +Public Sub mnuAddBookmark_Click() + + Dim sLink As String = dvwChoose.Current + + If $hBookmarkList.FindBookmark(sLink) Then Return + + Inc Application.Busy + $hBookmarkList.AddBookmark(sLink) + $hBookmarkList.Save + FillMenu + SetRoot(sLink) + +Finally + Dec Application.Busy + +End + +Public Sub mnuRemoveBookmark_Click() + + Inc Application.Busy + $hBookmarkList.RemoveBookmark(dvwChoose.Root) + $hBookmarkList.Save + FillMenu + SetDir(dvwChoose.Current) + +Finally + Dec Application.Busy + +End + +Public Sub GetSettings() As Variant[] + + If Not $bFile Then + Return [1, CVariant(dvwChoose.Root), dvwChoose.Current, Null, $bView, splChoose.Layout, fvwChoose.Settings, GetFilterIndex()] + Else + Return [1, CVariant(dvwChoose.Root), dvwChoose.Current, fvwChoose.Current, $bView, splChoose.Layout, fvwChoose.Settings, GetFilterIndex()] + Endif + +End + +Public Sub SetSettings(aVar As Variant[]) + + 'Dim bBookmark As Boolean = True + Dim iZoom As Integer = -1 + + If TypeOf(aVar[0]) = gb.Integer Then + + Try SetRoot(aVar[1]) + Try fvwChoose.Settings = aVar[6] + UpdateShowHidden + Try SetDir(aVar[2]) + If $bFile Then Try fvwChoose.Current = aVar[3] + Try $bView = Not aVar[4] + If Not Error Then btnView_Click + splChoose.Layout = aVar[5] + Try SetFilterIndex(aVar[7]) + + Try iZoom = $aIconSize.Find(fvwChoose.IconSize) + If iZoom >= 0 Then sldIconSize.Value = iZoom + + Else + + If Not $bFile Then + + 'Try bBookmark = aVar[6] + Try SetRoot(aVar[0]) + Try SetDir(aVar[1]) + Try $bView = Not aVar[2] + If Not Error Then btnView_Click + splChoose.Layout = aVar[3] + Try fvwChoose.Settings = aVar[5] + Try iZoom = $aIconSize.Find(aVar[6]) + If iZoom >= 0 Then sldIconSize.Value = iZoom + + Else + + 'Try bBookmark = aVar[8] + Try SetRoot(aVar[0]) + Try SetDir(aVar[1]) + Try fvwChoose.Current = aVar[2] + Try $bView = Not aVar[3] + If Not Error Then btnView_Click + Try splChoose.Layout = aVar[4] + Try fvwChoose.Settings = aVar[6] + Try SetFilterIndex(aVar[7]) + Try iZoom = $aIconSize.Find(aVar[8]) + If iZoom >= 0 Then sldIconSize.Value = iZoom + + Endif + + Endif + + btnPreview.Value = fvwChoose.ShowPreview + btnDetail.Value = fvwChoose.ShowDetailed + + UpdateShowHidden + ShowBookmark($bShowBookmark) + +End + +Public Sub mnuCreateDirectory_Click() + + dvwChoose.NewFolder + +End + + +Public Sub mnuRefresh_Click() + + DirCache[dvwChoose.Current].Clear + dvwChoose.Reload + fvwChoose.Reload + +End + +Public Sub splChoose_Resize() + + 'DEBUG splChoose.Layout + +End + +Public Sub SetSplitter(bOn As Boolean) + + btnView.Visible = bOn + +End + +Public Sub GetSplitter() As Boolean + + Return btnView.Visible + +End + +Public Sub Reload() + + mnuRefresh_Click + +End + +Public Sub SetDialogButtonVisible(bVisible As Boolean) + + panButton.Visible = bVisible + UpdateFilterPanel + +End + +Public Sub IsDialogButtonVisible() As Boolean + + Return panButton.Visible + +End + + +' Public Sub ShowAutomaticExtension(bShow As Boolean) +' +' chkExt.Visible = bShow +' +' End +' +' Public Sub SetAutomaticExtension(bVal As Boolean) +' +' chkExt.Value = bVal +' +' End + + Private Sub CheckFile() As Boolean ' FIXME: If 'As Boolean' is forgotten, and 'Return True' is removed, we can get an interpreter crash + + Dim sPath As String + + If Not txtFile.Visible Then Return + If txtFile.ReadOnly Then Return + + sPath = txtFile.Text + If InStr(sPath, "/") = 0 Then Return + + txtFile.Text = File.Name(sPath) + SetDir(File.Dir(sPath)) + Return True + +End + + +Public Sub btnOK_Click() + + If CheckFile() Then Return + Raise Select + +End + +Public Sub btnCancel_Click() + + Raise Cancel + +End + +Private Sub GetHeight(hCont As Container) As Integer + + Dim H As Integer + Dim hChild As Control + + For Each hChild In hCont.Children + If hChild.Visible Then H = Max(H, hChild.Y + hChild.H) + Next + + Return H + +End + + +Public Sub UpdateFilterPanel() + + Dim H As Integer + Dim M As Integer + + Object.Lock(panFilter) + + cmbFilter.Enabled = cmbFilter.Count > 1 + cmbFilter.Show 'Visible = txtFile.Visible + If Not cmbFilter.Enabled And If Not panButton.Visible Then cmbFilter.Hide + + If panFilter.Margin Then M = Desktop.Scale * 2 + + If panButton.Visible Then + panFilter.H = Max(panButton.H, GetHeight(panExtension)) + M + panFilter.Show + Else + H = GetHeight(panExtension) + If H Then + panFilter.H = H + M + panFilter.Show + Else + panFilter.Hide + Endif + Endif + + UpdateSeparator + + Object.Unlock(panFilter) + +End + +Public Sub GetExtensionContainer() As Container + + Return panExtension + +End + +Public Sub panExtension_Arrange() + + UpdateFilterPanel + +End + +Private Sub AddBookmarkMenu(hBookmark As CBookmark) + + Dim hMenu As Menu + + hMenu = New Menu(mnuBookmark) As "mnuBookmark" + hMenu.Tag = hBookmark.Link + hMenu.Text = Replace(hBookmark.Name, "&", "&&") + hMenu.Picture = Picture[hBookmark.Icon] + hMenu.Enabled = hBookmark.Exist() + +End + + +Private Sub FillMenu() + + Dim hBookmark As CBookmark + Dim hMenu As Menu + Dim sType As String + Dim sOldType As String + + mnuPopup.Children.Clear + + If IsBookmarkVisible() Then + + $hBookmarkList.Load() + + mnuBookmark = New Menu(mnuPopup) + mnuBookmark.Name = "mnuBookmark" + mnuBookmark.Text = ("Bookmarks") + mnuBookmark.Picture = Picture["icon:/small/bookmark"] + + For Each hBookmark In $hBookmarkList + sType = Left(hBookmark.Link) + If sOldType And If sType <> sOldType Then hMenu = New Menu(mnuBookmark) + sOldType = sType + AddBookmarkMenu(hBookmark) + Next + btnBookmark.Menu = "mnuBookmark" + + hMenu = New Menu(mnuBookmark) + + hMenu = New Menu(mnuBookmark) As "mnuAddBookmark" + hMenu.Text = ("&Bookmark current directory") + hMenu.Picture = Picture["icon:/small/add"] + + 'hMenu = New Menu(mnuBookmark) As "mnuRemoveBookmark" + 'hMenu.Text = ("&Remove bookmark") + 'hMenu.Picture = Picture["icon:/small/remove"] + + hMenu = New Menu(mnuBookmark) As "mnuEditBookmark" + hMenu.Text = ("&Edit bookmarks...") + hMenu.Picture = Picture["icon:/small/edit"] + mnuEditBookmark = hMenu + + hMenu = New Menu(mnuBookmark) + + Endif + + hMenu = New Menu(mnuPopup) As "mnuShowDetailed" + hMenu.Text = ("Show &details") + hMenu.Checked = fvwChoose.ShowDetailed + hMenu.Visible = fvwChoose.Visible + mnuShowDetailed = hMenu + + hMenu = New Menu(mnuPopup) As "mnuShowHiddenFiles" + hMenu.Text = ("Show &hidden files") + hMenu.Checked = fvwChoose.ShowHidden + 'hMenu.Visible = fvwChoose.Visible + mnuShowHiddenFiles = hMenu + + hMenu = New Menu(mnuPopup) As "mnuShowPreview" + hMenu.Text = ("Show &image preview") + hMenu.Checked = fvwChoose.ShowPreview + hMenu.Visible = fvwChoose.Visible + mnuShowPreview = hMenu + + hMenu = New Menu(mnuPopup) + + hMenu = New Menu(mnuPopup) As "mnuRename" + hMenu.Text = ("&Rename") + 'hMenu.Picture = Picture["icon:/small/archive"] + mnuRename = hMenu + + hMenu = New Menu(mnuPopup) As "mnuCopy" + hMenu.Text = ("Copy") + hMenu.Picture = Picture["icon:/small/copy"] + mnuCopy = hMenu + + hMenu = New Menu(mnuPopup) As "mnuDelete" + hMenu.Text = ("&Delete") + hMenu.Picture = Picture["icon:/small/delete"] + mnuDelete = hMenu + + hMenu = New Menu(mnuPopup) As "mnuDeleteDir" + hMenu.Text = ("&Delete") + hMenu.Picture = Picture["icon:/small/delete"] + mnuDeleteDir = hMenu + + hMenu = New Menu(mnuPopup) + + hMenu = New Menu(mnuPopup) As "mnuUncompress" + hMenu.Text = ("&Uncompress file") + hMenu.Picture = Picture["icon:/small/archive"] + mnuUncompress = hMenu + + hMenu = New Menu(mnuPopup) As "mnuCreateDirectory" + hMenu.Text = ("&Create directory") + hMenu.Picture = Picture["icon:/small/new-dir"] + + If Component.IsLoaded("gb.desktop") Then + hMenu = New Menu(mnuPopup) As "mnuOpenFolder" + hMenu.Text = ("Open in &file manager...") + hMenu.Picture = Picture["icon:/small/file-manager"] + Endif + + hMenu = New Menu(mnuPopup) As "mnuRefresh" + hMenu.Text = ("&Refresh") + hMenu.Picture = Picture["icon:/small/refresh"] + + If Component.IsLoaded("gb.desktop") Then + + hMenu = New Menu(mnuPopup) + + hMenu = New Menu(mnuPopup) As "mnuProperty" + hMenu.Text = ("&Properties") + hMenu.Picture = Picture["icon:/small/info"] + mnuProperty = hMenu + + Endif + +End + +Public Sub IsBookmarkVisible() As Boolean + + Return $bShowBookmark 'btnBookmark.Enabled + +End + +Public Sub ShowBookmark(bShow As Boolean) + + 'If $bShowBookmark = bShow Then Return + $bShowBookmark = bShow + FillMenu + UpdateBookmarkButton + +End + +Public Sub mnuEditBookmark_Click() + + 'If Not $hCurrentBookmark Then Return + 'If Not $hCurrentBookmark.IsEditable() Then Return + FEditBookmark.Run($hBookmarkList) + + $hBookmarkList.Save + FillMenu + UpdateBookmarkButton + +End + +Public Sub btnBookmark_DblClick() + + If $hCurrentBookmark Then dvwChoose.Current = $hCurrentBookmark.Path + dvwChoose.Reload + +End + +Public Sub dvwChoose_KeyPress() + + If dvwChoose.Renaming Then Return + + Select Case Key.Code + Case Key.F5 + mnuRefresh_Click + Case Key.F4 + mnuShowHiddenFiles_Click + Case Key.F6 + mnuShowDetailed_Click + Case Key.BackSpace + btnParent_Click + End Select + +End + +Public Sub fvwChoose_KeyPress() + + dvwChoose_KeyPress + +End + +Public Sub dvwChoose_Menu() + + mnuUncompress.Hide + mnuShowDetailed.Hide + mnuShowPreview.Hide + mnuRename.Show + mnuDelete.Hide + mnuDeleteDir.Hide + Try mnuDeleteDir.Visible = Dir(dvwChoose.Current).Count = 0 + + dvwChoose.SetFocus + mnuPopup.Popup + +End + +Public Sub fvwChoose_Menu() + + Dim sFile As String = fvwChoose.Current + + If sFile Like "*.tar.gz" Or If sFile Like "*.tar.bz2" Or If sFile Like "*.tgz" Or If sFile Like "*.tar" Or If sFile Like "*.zip" Then + mnuUncompress.Show + Else + mnuUncompress.Hide + Endif + + mnuShowDetailed.Show + mnuShowPreview.Show + mnuRename.Visible = sFile + mnuDelete.Visible = sFile + mnuDeleteDir.Hide + + mnuPopup.Popup + +End + +Public Sub sldIconSize_Change() + + fvwChoose.IconSize = $aIconSize[sldIconSize.Value] + sldIconSize.Tooltip = fvwChoose.IconSize + +End + +Public Sub btnZoomOut_Click() + + Dec sldIconSize.Value + +End + +Public Sub btnZoomIn_Click() + + Inc sldIconSize.Value + +End + +Public Sub FileView_Show() + + FillMenu + UpdateZoom + +End + +Public Sub FileView_Hide() + + FileView_Show + +End + +Public Sub mnuRename_Click() + + If dvwChoose.HasFocus Then + dvwChoose.Rename + Else + fvwChoose.Rename + Endif + +End + +Private Sub URLQuote(Path As String) As String + + Dim iInd As Integer + Dim sRes As String + Dim sCar As String + + For iInd = 1 To Len(Path) + sCar = Mid$(Path, iInd, 1) + If sCar = " " Then + sCar = "+" + Else If IsLetter(sCar) Or If IsDigit(sCar) Or If InStr("-._~,$!/", sCar) Then + Else + sCar = "%" & Hex$(Asc(sCar), 2) + Endif + sRes &= sCar + Next + + Return sRes + +End + +Public Sub mnuCopy_Click() + + Dim aPath As String[] + Dim I As Integer + + If dvwChoose.HasFocus Then + aPath = [dvwChoose.Current] + Else + aPath = GetPaths() + Endif + + If aPath.Count = 0 Then Return + + For I = 0 To aPath.Max + aPath[I] = "file://" & URLQuote(aPath[I]) + Next + + Clipboard.Copy(aPath.Join(gb.CrLf) & gb.CrLf, "text/uri-list") + +End + + +Public Sub mnuUncompress_Click() + + 'Dim sResult As String + Dim sOutput As String + Dim iMsg As Integer + Dim sPath As String + Dim sShow As String + Dim hTreeView As TreeView + Dim aOutput As String[] + Dim iPos As Integer + + Inc Application.Busy + + Select Case File.Name(fvwChoose.Current) + + Case Like "*.tar.gz", "*.tar.bz2", "*.tgz", "*.tar" + + Shell "cd " & Shell(fvwChoose.Dir) & ";tar tf " & Shell$(fvwChoose.Current) To sOutput + + For Each sOutput In Split(Trim(sOutput), "\n") + + If Right(sOutput) = "/" Then + sOutput = Left$(sOutput, -1) + If Not sShow Then sShow = sOutput + Endif + sPath = fvwChoose.Dir &/ sOutput + + If Exist(sPath) Then + + If iMsg <> 1 Then + Application.Busy = 0 + iMsg = Message.Warning("" & sOutput & "

        " & ("This file or directory already exists."), ("Overwrite all"), ("Overwrite"), ("Cancel")) + If iMsg = 3 Then Return + Inc Application.Busy + Endif + + Shell "rm -rf " & Shell$(fvwChoose.Dir &/ sOutput) Wait + + Endif + + Next + + Case Like "*.zip" + + Shell "cd " & Shell(fvwChoose.Dir) & ";unzip -l " & Shell$(fvwChoose.Current) To sOutput + + aOutput = Split(sOutput, "\n") + If aOutput.Count > 2 Then iPos = InStr(aOutput[1], "Name") + If iPos = 0 Then + Application.Busy = 0 + Message.Warning(("Cannot list archive contents")) + Return + Endif + + aOutput.Remove(0, 2) + Try aOutput.Remove(aOutput.Max - 1, 2) + + For Each sOutput In aOutput + + sOutput = Trim(Mid$(sOutput, iPos)) + + If Right(sOutput) = "/" Then + sOutput = Left$(sOutput, -1) + If Not sShow Then sShow = sOutput + Endif + sPath = fvwChoose.Dir &/ sOutput + + If Exist(sPath) Then + + If iMsg <> 1 Then + Application.Busy = 0 + iMsg = Message.Warning("" & sOutput & "

        " & ("This file or directory already exists."), ("Overwrite all"), ("Overwrite"), ("Cancel")) + If iMsg = 3 Then Return + Inc Application.Busy + Endif + + Shell "rm -rf " & Shell$(fvwChoose.Dir &/ sOutput) Wait + + Endif + + Next + + Case Else + Application.Busy = 0 + Message.Error(("Cannot uncompress file.") & "\n\n" & ("Unknown archive.")) + Return + + End Select + + If Process.LastValue Then Goto _CANNOT_UNCOMPRESS + + Select Case File.Name(fvwChoose.Current) + + Case Like "*.tar.gz", "*.tgz" + Shell "cd " & Shell(fvwChoose.Dir) & ";tar xfz " & Shell$(fvwChoose.Current) Wait + 'Exec ["/bin/tar", "xfz", "-C", fvwChoose.Dir, sPath] To sResult + + Case Like "*.tar.bz2" + Shell "cd " & Shell(fvwChoose.Dir) & ";tar xfj " & Shell$(fvwChoose.Current) Wait + 'Exec ["/bin/tar", "xfj", "-C", fvwChoose.Dir, sPath] To sResult + ' + Case Like "*.tar" + Shell "cd " & Shell(fvwChoose.Dir) & ";tar xf " & Shell$(fvwChoose.Current) Wait + + Case Like "*.zip" + Shell "cd " & Shell(fvwChoose.Dir) & ";unzip -q " & Shell$(fvwChoose.Current) Wait + + End Select + + If Process.LastValue Then Goto _CANNOT_UNCOMPRESS + + Wait ' Let watch events proceed + + Dec Application.Busy + + Reload + + hTreeView = dvwChoose.Proxy + If sShow Then + Try hTreeView[fvwChoose.Dir &/ sShow].EnsureVisible + Try hTreeView[fvwChoose.Dir &/ sShow].Selected = True + Endif + + Return + +_CANNOT_UNCOMPRESS: + + Application.Busy = 0 + Message.Error(("Cannot uncompress file.")) + Return + +Catch + + Application.Busy = 0 + Message.Error(("Cannot uncompress file.") & "\n\n" & Error.Text) + +End + +Public Sub mnuDelete_Click() + + Dim sPath As String = fvwChoose.Current + + If Not sPath Then Return + sPath = fvwChoose.Dir &/ sPath + + Message.Title = ("Delete file") + If Message.Warning("" & File.Name(sPath) & "

        " & ("Do you really want to delete that file?"), ("&Delete"), ("Cancel")) = 2 Then Return + + Kill sPath + mnuRefresh_Click + +Catch + + Message.Error(("Unable to delete file.") & "\n\n" & Error.Text) + +End + +Public Sub mnuDeleteDir_Click() + + Dim sPath As String = dvwChoose.Current + + If Not sPath Then Return + + Message.Title = ("Delete directory") + If Message.Warning("" & File.Name(sPath) & "

        " & ("Do you really want to delete that directory?"), ("&Delete"), ("Cancel")) = 2 Then Return + + Rmdir sPath + mnuRefresh_Click + +Catch + + Message.Error(("Unable to delete directory.") & "\n\n" & Error.Text) + +End + + +Public Sub SetFocus() + + txtFile.SetFocus + +End + +Public Sub mnuOpenFolder_Click() + + Desktop.Open(dvwChoose.Current) + +End + + +Public Sub mnuProperty_Click() + + If dvwChoose.HasFocus Or If Not fvwChoose.Current Then + If Not dvwChoose.Current Then Return + FFileProperties.Run(dvwChoose.Current) + Else + FFileProperties.Run(fvwChoose.Dir &/ fvwChoose.Current) + Endif + +End + +Public Sub btnParent_Click() + + Dim hBookmark As CBookmark + Dim sDir As String = dvwChoose.Current + + If sDir = dvwChoose.Root And sDir <> "/" Then + + hBookmark = $hBookmarkList.FindBest(File.Dir(sDir)) + If hBookmark Then + SetBookmark(hBookmark) + Else + dvwChoose.Root = File.Dir(sDir) + SetBookmark(Null) + Endif + + Endif + + dvwChoose.Current = File.Dir(sDir) + +End + +Public Sub btnParent_Draw() + + Dim iFlag As Integer + + If btnParent.Hovered And If btnParent.Enabled Then iFlag += Draw.Hover + If Not btnParent.Enabled Then iFlag += Draw.Disabled + If btnParent.HasFocus Then iFlag += Draw.Focus + + If btnParent.Hovered Then Draw.Style.Button(0, 0, btnParent.W, btnParent.H, False, iFlag, True) + Draw.Style.Arrow((btnParent.W - 8) \ 2, (btnParent.H - 8) \ 2, 8, 8, Align.Left, iFlag) + +End + +' Public Sub btnParent_Enter() +' +' btnParent.Refresh +' +' End +' +' Public Sub btnParent_Leave() +' +' btnParent.Refresh +' +' End + +' Public Sub btnParent_MouseDown() +' +' $bPressed = True +' btnParent.Refresh +' +' End +' +' Public Sub btnParent_MouseUp() +' +' $bPressed = False +' btnParent.Refresh +' If btnParent.Hovered Then btnParent_Click +' +' End + +Private Sub UpdateSeparator() + + sepNoBorder.Visible = Not HasBorder() And panFilter.Visible + +End + +Public Sub SetBorder(bBorder As Boolean) + + panBorder.Border = If(bBorder, Border.Plain, Border.None) + UpdateSeparator + +End + +Public Sub HasBorder() As Boolean + + Return panBorder.Border <> Border.None + +End + +Public Sub SetShowFile(bShow As Boolean) + + txtFile.Visible = bShow + UpdateFilterPanel + +End + +Public Function GetShowFile() As Boolean + + Return txtFile.Visible + +End + +Public Sub HasMargin() As Boolean + + Return panFilter.Margin + +End + +Public Sub SetMargin(bMargin As Boolean) + + panFilter.Margin = bMargin + Me.Spacing = Not bMargin + +End + + +Public Sub btnPreview_Click() + + fvwChoose.ShowPreview = btnPreview.Value + mnuShowPreview.Checked = btnPreview.Value + +End + +Public Sub GetShowPreview() As Boolean + + Return fvwChoose.ShowPreview + +End + +Public Sub SetShowPreview(bPreview As Boolean) + + btnPreview.Value = bPreview + +End + + +' Private Sub UpdateDirText() +' +' txtDir.Text = Ellipsize($sDirText, txtDir.Font, txtDir.W) +' +' End + + +' Public Sub panToolbar_Arrange() +' +' UpdateDirText +' +' End + +Public Sub txtFile_Change() + + If Not GetMulti() Then Try fvwChoose.Current = txtFile.Text + +End + +Public Sub btnBookmark_Click() + + dvwChoose.Current = dvwChoose.Root + +End + +Private Sub UpdateHistoryButtons() + + btnBack.Enabled = $iHistory > 0 + btnForward.Enabled = $iHistory < $aHistory.Max + If btnBack.Enabled Then btnBack.Tooltip = $aHistory[$iHistory - 1] + If btnForward.Enabled Then btnForward.Tooltip = $aHistory[$iHistory + 1] + +End + +Private Sub SaveToHistory() + + If $bNoSaveHistory Then Return + + $aHistory.Resize($iHistory + 1) + $aHistory.Add(dvwChoose.Current) + Inc $iHistory + UpdateHistoryButtons + +End + +Public Sub btnBack_Click() + + If $iHistory = 0 Then Return + $bNoSaveHistory = True + Dec $iHistory + SetDir($aHistory[$iHistory]) + $bNoSaveHistory = False + UpdateHistoryButtons + +End + +Public Sub btnForward_Click() + + If $iHistory = $aHistory.Max Then Return + $bNoSaveHistory = True + Inc $iHistory + SetDir($aHistory[$iHistory]) + $bNoSaveHistory = False + UpdateHistoryButtons + +End + +Public Sub btnRoot_Click() + + If IsBookmarkVisible() Then + SetDir("/") + Else + SetDir(dvwChoose.Root) + Endif + +End + +Public Sub dwgGradient_Draw() + + Paint.DrawImage($hGradient, 0, 0) + +End + +Public Sub panDir_Arrange() + + dwgGradient.Move(panDir.W - dwgGradient.W, 0, dwgGradient.W, panDir.H) + +End + +Public Sub btnBookmark_Menu() + + dvwChoose.Current = dvwChoose.Root + dvwChoose_Menu + +End + +Public Sub GetShowToolbar() As Boolean + + Return panTool.Visible + +End + +Public Sub SetShowToolbar(bShow As Boolean) + + panTool.Visible = bShow + +End diff --git a/comp/src/gb.form/.src/File/Chooser/FDirChooser.form b/comp/src/gb.form/.src/File/Chooser/FDirChooser.form new file mode 100644 index 00000000..49a6370f --- /dev/null +++ b/comp/src/gb.form/.src/File/Chooser/FDirChooser.form @@ -0,0 +1,183 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(23,39,107,86) + Resizable = False + Arrangement = Arrange.Vertical + Spacing = True + { mnuPopup Menu + } + { panBorder Panel + MoveScaled(0,0,90,59) + Expand = True + Arrangement = Arrange.Horizontal + Border = Border.Plain + { VBox1 VBox + MoveScaled(2,3,82,53) + Expand = True + { panToolbar HBox + MoveScaled(2.25,1.875,74,4) + AutoResize = True + { btnParent ToolButton + MoveScaled(1,0,4,4) + Visible = False + ToolTip = ("Parent directory") + Picture = Picture["icon:/small/up"] + } + { btnRoot ToolButton + MoveScaled(5,0,4,4) + ToolTip = ("Root directory") + Picture = Picture["icon:/small/computer"] + } + { Panel2 Panel + MoveScaled(9,0,1,4) + Visible = False + } + { panDir HBox + MoveScaled(11,0,8,4) + Expand = True + { dwgGradient DrawingArea + MoveScaled(6,0,2,4) + Ignore = True + } + } + { Separator3 Separator + MoveScaled(20,0,0,4) + Visible = False + } + { panTool HBox + MoveScaled(23,0,46,4) + AutoResize = True + { btnBack ToolButton + MoveScaled(0,0,4,4) + Enabled = False + ToolTip = ("Parent directory") + Picture = Picture["icon:/small/left"] + } + { btnForward ToolButton + MoveScaled(4,0,4,4) + Enabled = False + Picture = Picture["icon:/small/right"] + } + { panIconSize HBox + MoveScaled(8,0,23,4) + Visible = False + { btnZoomOut ToolButton + MoveScaled(0,0,4,4) + Picture = Picture["icon:/small/zoom-out"] + } + { sldIconSize Slider + MoveScaled(4,0,14,4) + Expand = True + MaxValue = 8 + PageStep = 1 + } + { btnZoomIn ToolButton + MoveScaled(18,0,4,4) + Picture = Picture["icon:/small/zoom-in"] + } + } + { btnPreview ToolButton + MoveScaled(31,0,4,4) + ToolTip = ("Image preview") + Picture = Picture["icon:/small/image"] + Toggle = True + } + { btnDetail ToolButton mnuShowDetailed + Name = "btnDetail" + MoveScaled(35,0,4,4) + ToolTip = ("Detailed view") + Picture = Picture["icon:/small/view-detail"] + Toggle = True + } + { btnProperty ToolButton mnuProperty + Name = "btnProperty" + MoveScaled(38,0,4,4) + ToolTip = ("File properties") + Picture = Picture["icon:/small/info"] + } + { btnView ToolButton + MoveScaled(42,0,4,4) + ToolTip = ("Show files") + Picture = Picture["icon:/small/view-split-h"] + } + } + } + { Separator2 Separator + MoveScaled(30,6,39,0) + } + { splChoose HSplit + MoveScaled(6,7,67,43) + Expand = True + { panDirectory Panel + MoveScaled(2,4,27,38) + Arrangement = Arrange.Vertical + { btnBookmark MenuButton + MoveScaled(3,2,18,4) + ToolTip = ("Bookmarks") + AutoResize = True + Picture = Picture["icon:/small/home"] + Border = False + MenuOnly = True + } + { Separator1 Separator + MoveScaled(6,7,12,0) + } + { dvwChoose DirView + MoveScaled(0,9,26,28) + Expand = True + Border = False + Picture = Picture["icon:/small/home"] + HideRoot = True + } + } + { panView Panel + MoveScaled(38,5,25,33) + Visible = False + Arrangement = Arrange.Fill + { fvwChoose FileView + MoveScaled(1,1,23,31) + Border = False + } + } + } + } + } + { sepNoBorder Separator + MoveScaled(39,60,26,0) + Visible = False + } + { panFilter HBox + MoveScaled(2,63,84,11) + Spacing = True + { panExtension VBox + MoveScaled(1,1,62,9) + Expand = True + Spacing = True + { txtFile TextBox + MoveScaled(0,0,57,4) + Visible = False + } + { cmbFilter ComboBox + MoveScaled(0,5,57,4) + Visible = False + ReadOnly = True + } + } + { panButton VBox + MoveScaled(68,1,15,9) + Visible = False + Spacing = True + { btnOK Button + MoveScaled(0,0,15,4) + Text = ("OK") + Default = True + } + { btnCancel Button + MoveScaled(0,5,15,4) + Text = ("Cancel") + Cancel = True + } + } + } +} diff --git a/comp/src/gb.form/.src/File/Chooser/FileChooser.class b/comp/src/gb.form/.src/File/Chooser/FileChooser.class new file mode 100644 index 00000000..ac1e6b13 --- /dev/null +++ b/comp/src/gb.form/.src/File/Chooser/FileChooser.class @@ -0,0 +1,414 @@ +' Gambas class file + +Inherits UserControl +Export + +Public Const _Properties As String = "*,Border=True,Root,Picture,Multi,Filter,ShowHidden,ShowDirectory,ShowDetailed,ShowPreview,ShowBookmark=True,ShowFile=True,ShowButton,ShowToolbar=True,Margin,ReadOnly" +Public Const _DefaultEvent As String = "Change" +Public Const _DefaultSize As String = "36,36" +Public Const _Group As String = "Chooser" + +Property Root As String +Property Picture As Picture +Property {Dir} As String +Property SelectedPath As String +Property Read SelectedPaths As String[] +Property Value As Variant +Property Multi As Boolean +Property ShowDirectory As Boolean +Property ShowHidden As Boolean +Property ShowDetailed As Boolean +Property ShowBookmark As Boolean +Property ShowFile As Boolean +Property ShowPreview As Boolean +Property ShowToolbar As Boolean +Property Bookmarks As Collection[] +Property Settings As Variant[] +Property Read DirView As DirView +Property Read FileView As FileView +Property ShowButton As Boolean +Property Read Extension As Container +Property Border As Boolean +Property Margin As Boolean + +Property ReadOnly As Boolean +Property Filter As String[] +Property FilterIndex As Integer +Property Icon As Picture + +Event Change +Event Activate +Event Icon(Path As String) +Event Cancel + +'EVENT ShowHidden + +Private frmChooser As FDirChooser + +Public Sub _new() + + frmChooser = New FDirChooser(Me, True) 'AS "frmChooser" + Object.Attach(frmChooser, Me, "frmChooser") + 'Object.Delegate(frmChooser, ME) + +End + +Public Sub frmChooser_Open() + + Last.Form_Open + +End + +Public Sub frmChooser_Change() + + Raise Change + +End + + +Public Sub frmChooser_Select() + + Raise Activate + +End + +Public Sub frmChooser_GetIcon(Path As String) + + Raise Icon(Path) + +End + +Private Function Dir_Read() As String + + Return frmChooser.GetDir() + +End + +Private Sub Dir_Write(sDir As String) + + frmChooser.SetDir(sDir) + +End + +Private Function ShowDirectory_Read() As Boolean + + Return frmChooser.GetShowDirectory() + +End + +Private Sub ShowDirectory_Write(bShowDir As Boolean) + + frmChooser.SetShowDirectory(bShowDir) + +End + +Private Function ShowHidden_Read() As Boolean + + Return frmChooser.GetShowHidden() + +End + +Private Sub ShowHidden_Write(bShowHidden As Boolean) + + frmChooser.SetShowHidden(bShowHidden) + +End + +Private Function ShowDetailed_Read() As Boolean + + Return frmChooser.GetShowDetailed() + +End + +Private Sub ShowDetailed_Write(bShowDetailed As Boolean) + + frmChooser.SetShowDetailed(bShowDetailed) + +End + +Private Function Multi_Read() As Boolean + + Return frmChooser.GetMulti() + +End + +Private Sub Multi_Write(bMulti As Boolean) + + frmChooser.SetMulti(bMulti) + +End + +Private Function SelectedPath_Read() As String + + Try Return frmChooser.GetPath() + +End + +Private Sub SelectedPath_Write(Value As String) + + frmChooser.SetPath(Value) + +End + +Private Function SelectedPaths_Read() As String[] + + Return frmChooser.GetPaths() + +End + +' PRIVATE FUNCTION Font_Read() AS Font +' +' RETURN SUPER.Font +' +' END +' +' PRIVATE SUB Font_Write(hFont AS Font) +' +' SUPER.Font = hFont +' frmChooser.SetFont(SUPER.Font) +' +' END + +Private Function Filter_Read() As String[] + + Return frmChooser.GetFilter() + +End + +Private Sub Filter_Write(aFilter As String[]) + + frmChooser.SetFilter(aFilter) + +End + +Private Function Root_Read() As String + + Return frmChooser.GetRoot() + +End + +Private Sub Root_Write(Value As String) + + frmChooser.SetRoot(Value) + +End + +Private Function Icon_Read() As Picture + + Return frmChooser.FileView.Icon + +End + +Private Sub Icon_Write(Value As Picture) + + frmChooser.FileView.Icon = Value + frmChooser.DirView.Icon = Value + +End + +Private Function ReadOnly_Read() As Boolean + + Return frmChooser.GetReadOnly() + +End + +Private Sub ReadOnly_Write(Value As Boolean) + + frmChooser.SetReadOnly(Value) + +End + +Private Function Picture_Read() As Picture + + Return frmChooser.GetPicture() + +End + +Private Sub Picture_Write(Value As Picture) + + frmChooser.SetPicture(Value) + +End + +Private Function Value_Read() As Variant + + If frmChooser.GetMulti() Then + Return SelectedPaths_Read() + Else + Return SelectedPath_Read() + Endif + +End + +Private Sub Value_Write(Value As Variant) + + If Not frmChooser.GetMulti() Then + SelectedPath_Write(Value) + Endif + +End + +Private Function FilterIndex_Read() As Integer + + Return frmChooser.GetFilterIndex() + +End + +Private Sub FilterIndex_Write(Value As Integer) + + frmChooser.SetFilterIndex(Value) + +End + +Private Function ShowBookmark_Read() As Boolean + + Return frmChooser.IsBookmarkVisible() + +End + +Private Sub ShowBookmark_Write(Value As Boolean) + + frmChooser.ShowBookmark(Value) + +End + +Private Function Bookmarks_Read() As Collection[] + + Return frmChooser.GetPrivateBookmarks() + +End + +Private Sub Bookmarks_Write(Value As Collection[]) + + frmChooser.SetPrivateBookmarks(Value) + +End + + +Private Function Settings_Read() As Variant[] + + Return frmChooser.GetSettings() + +End + +Private Sub Settings_Write(Value As Variant[]) + + frmChooser.SetSettings(Value) + +End + +' PUBLIC SUB frmChooser_ShowHidden() +' +' RAISE ShowHidden +' +' END + +Public Sub Reload() + + frmChooser.Reload + +End + + +Private Function FileView_Read() As FileView + + Return frmChooser.FileView + +End + +Private Function DirView_Read() As DirView + + Return frmChooser.DirView + +End + +Private Function ShowButton_Read() As Boolean + + Return frmChooser.IsDialogButtonVisible() + +End + +Private Sub ShowButton_Write(Value As Boolean) + + frmChooser.SetDialogButtonVisible(Value) + +End + +Public Sub frmChooser_Cancel() + + Raise Cancel + +End + + +Private Function Extension_Read() As Container + + Return frmChooser.GetExtensionContainer() + +End + +Public Sub SetFocus() + + frmChooser.SetFocus + +End + +Private Function Border_Read() As Boolean + + Return frmChooser.HasBorder() + +End + +Private Sub Border_Write(Value As Boolean) + + frmChooser.SetBorder(Value) + +End + +Private Function ShowFile_Read() As Boolean + + Return frmChooser.GetShowFile() + +End + +Private Sub ShowFile_Write(Value As Boolean) + + frmChooser.SetShowFile(Value) + +End + +Private Function Margin_Read() As Boolean + + Return frmChooser.HasMargin() + +End + +Private Sub Margin_Write(Value As Boolean) + + frmChooser.SetMargin(Value) + +End + +Private Function ShowPreview_Read() As Boolean + + Return frmChooser.GetShowPreview() + +End + +Private Sub ShowPreview_Write(Value As Boolean) + + frmChooser.SetShowPreview(Value) + +End + +Private Function ShowToolbar_Read() As Boolean + + Return frmChooser.GetShowToolbar() + +End + +Private Sub ShowToolbar_Write(Value As Boolean) + + frmChooser.SetShowToolbar(Value) + +End diff --git a/comp/src/gb.form/.src/File/DirBox.class b/comp/src/gb.form/.src/File/DirBox.class new file mode 100644 index 00000000..91c854a2 --- /dev/null +++ b/comp/src/gb.form/.src/File/DirBox.class @@ -0,0 +1,65 @@ +' Gambas class file + +Export +Inherits UserControl + +Public Const _Properties As String = "*,Action,Border=True" +Public Const _DefaultEvent As String = "Click" +Public Const _DefaultSize As String = "32,4" +Public Const _Similar As String = "TextBox" +Public Const _Group As String = "Chooser" + +Event Click +Event Change + +Property Value As String +Property Border As Boolean + +Private $hButtonBox As ButtonBox + +Public Sub _new() + + $hButtonBox = New ButtonBox(Me) As "Button" + Me.Proxy = $hButtonBox + $hButtonBox.Picture = Picture["icon:/small/directory"] + $hButtonBox.ReadOnly = True + $hButtonBox.ClearButton = True + +End + +Private Function Border_Read() As Boolean + + Return $hButtonBox.Border + +End + +Private Sub Border_Write(Value As Boolean) + + $hButtonBox.Border = Value + +End + +Private Function Value_Read() As String + + Return $hButtonBox.Text + +End + +Private Sub Value_Write(Value As String) + + $hButtonBox.Text = Value + +End + +Public Sub Button_Click() + + Dialog.Path = $hButtonBox.Text + If Dialog.SelectDirectory() Then Return + + $hButtonBox.Text = Dialog.Path + '$hButtonBox.Foreground = Color.Foreground + + Raise Click + Raise Change + +End diff --git a/comp/src/gb.form/.src/File/DirCache.class b/comp/src/gb.form/.src/File/DirCache.class new file mode 100644 index 00000000..09063adb --- /dev/null +++ b/comp/src/gb.form/.src/File/DirCache.class @@ -0,0 +1,159 @@ +' Gambas class file + +Class DesktopMime + +Static Private $cCache As New Collection + +Private $sDir As String +Private $aList As String[] + +Private $dDate As Date +Private $dLastModified As Date + +Private $cStat As New Collection +Private $cIcon As New Collection +Private $cIsDir As New Collection +Private $iLock As Integer + +Static Public Sub _get(sDir As String) As DirCache + + Dim hCache As DirCache + + If Right(sDir) <> "/" Then sDir &= "/" + + hCache = $cCache[sDir] + If Not hCache Then + hCache = New DirCache(sDir) + $cCache[sDir] = hCache + Endif + + Return hCache + +End + +Static Public Sub Exit() + + $cCache = Null + +End + + +Public Sub _new(sDir As String) + + $sDir = sDir + +End + +Public Sub Clear() + + $dDate = Null + +End + + +Private Sub CheckValid() As Boolean + + Dim dLastModified As Date + + If $iLock Then Return + + dLastModified = Stat($sDir).LastModified + + If IsNull($dLastModified) Or If dLastModified > $dLastModified Or If Now >= DateAdd($dDate, gb.Second, 5) Then + $dDate = Now + $dLastModified = dLastModified + $cStat.Clear + $aList = Null + Endif + +End + +Public Sub Invalidate() + + $dLastModified = Null + $dDate = Null + +End + + +Public Sub GetInfo(sFile As String) As Stat + + Dim hInfo As Stat + + If CheckValid() Then Return + + If sFile = "" Then sFile = "/" + hInfo = $cStat[sFile] + If Not hInfo Then + + 'Debug sFile + hInfo = Stat($sDir &/ sFile) + $cStat[sFile] = hInfo + + Endif + + Return hInfo + +End + +Public Sub IsDir(sFile As String) As Boolean + + If CheckValid() Then Return + + If sFile = "" Then sFile = "/" + + If Not $cIsDir.Exist(sFile) Then + + $cIsDir[sFile] = IsDir($sDir &/ sFile) + + Endif + + Return $cIsDir[sFile] + +End + + +Public Sub GetMimeIcon(sFile As String, iSize As Integer) As Image + + Dim hIcon As Image + + If CheckValid() Then Return + + hIcon = $cIcon[sFile & ":" & CStr(iSize)] + If Not hIcon Then + Try hIcon = DesktopMime.FromFile($sDir &/ sFile).GetIcon(iSize) + $cIcon[sFile & ":" & CStr(iSize)] = hIcon + Endif + + Return hIcon + +End + + +Public Sub GetFiles() As String[] + + If CheckValid() Then Return New String[] + + If Not $aList Then + 'Debug + $aList = Dir($sDir).Sort(gb.Natural) + Endif + + Return $aList + +End + + +Public Sub Lock() + + If $iLock = 0 Then CheckValid + Inc $iLock + +End + +Public Sub Unlock() + + Dec $iLock + +End + diff --git a/comp/src/gb.form/.src/File/DirView.class b/comp/src/gb.form/.src/File/DirView.class new file mode 100644 index 00000000..a320c5d5 --- /dev/null +++ b/comp/src/gb.form/.src/File/DirView.class @@ -0,0 +1,725 @@ +' Gambas class file + +Export +Inherits UserControl + +Class Watch + +Public Const _Properties As String = "*,Border=True,Root,Picture,ShowHidden,HideRoot" +Public Const _DefaultEvent As String = "Click" +Public Const _Group As String = "View" + +Event {Select} +Event Click +Event Activate +Event Menu +Event Icon(Path As String) + +Property Root As String +Property Current As String +Property ShowHidden As Boolean +Property Picture As Picture +Property Border As Boolean +Property Icon As Picture +Property Read Renaming As Boolean +Property Settings As Variant[] +Property HideRoot As Boolean + +Private $sRoot As String +Private $hTreeView As TreeView +Private $bShowHidden As Boolean +Private $hRootPict As Picture +Private $hPict As Picture +Private $bDeleteOnCancel As Boolean +Private $bNoExpand As Boolean +Private $bNoEvent As Boolean +Private $hTimerExpand As Timer +Private $bInRename As Boolean +Private $bHideRoot As Boolean + +Private $cWatch As Collection +Private $bWatch As Boolean +Private $hRefreshTimer As Timer +Private $bRefreshTimerTriggered As Boolean +Private $hWatcher As Watcher +Private $bRefreshAfterRename As Boolean + +Public Sub _new() + + $bWatch = Component.IsLoaded("gb.inotify") + If $bWatch Then $hWatcher = New Watcher(Me) As "Watcher" + + $hTreeView = New TreeView(Me) As "TreeView" + $hTreeView.Editable = True + $hTimerExpand = New Timer As "TimerExpand" + Me.Proxy = $hTreeView + $hRootPict = Picture["icon:/small/directory"] 'open + ClearView + $hRefreshTimer = New Timer As "Refresh" + +End + +Private Function GetRoot() As String + + If Trim($sRoot) Then Return $sRoot + Return User.Home + +End + +Private Sub UpdateHideRoot() + + Dim hGridView As GridView + + hGridView = $hTreeView.Children[0] + hGridView.Rows[0].H = If($bHideRoot, 0, -1) + +End + +Private Sub AddWatch(sDir As String) + + If Not $cWatch Then Return + $cWatch[sDir] = New Watch(sDir) As "Watch" + +End + +Private Sub RemoveWatch(sDir As String) + + If Not $cWatch Then Return + $cWatch.Remove(sDir) + +End + +Private Sub ClearView() + + Dim sRoot As String = GetRoot() + + $bNoEvent = True + $hTreeView.Clear + + If $bWatch Then + If $cWatch Then $cWatch.Clear + Endif + + AddDir(File.Dir(sRoot), File.Name(sRoot), True) + '$hTreeView.Add(sRoot, sRoot, $hRootPict) + '$hTreeView.Add(sRoot & "/", "",, sRoot) + + 'IF NOT $hRootPict THEN Picture_Write(Picture["icon:/small/directory"]) 'open + + If $hTreeView.Count Then + $hTreeView.MoveFirst + $hTreeView.Item.Expanded = True + TreeView_Expand + Endif + $bNoEvent = False + + UpdateHideRoot + +End + + +Private Function Root_Read() As String + + Return $sRoot + +End + +Private Sub Root_Write(sRoot As String) + + sRoot = Trim(sRoot) + While Right(sRoot) = "/" And Len(sRoot) > 1 + sRoot = Left(sRoot, -1) + Wend + If sRoot = $sRoot Then Return + + If Not IsDir(sRoot) Then Error.Raise("Unknown directory") + + $sRoot = sRoot + RefreshView + Raise Click + +End + +Private Sub AddDir(sDir As String, sFile As String, Optional bIgnoreHidden As Boolean) + + Dim sParent As String + Dim hPict As Picture + Dim bNoEdit As Boolean + Dim sAfter As String + Dim sName As String + Dim hStat As Stat + Dim bRichText As Boolean + Dim sText As String + + If Not $bShowHidden And If Left(sFile) = "." And If Not bIgnoreHidden Then Return + If Not Exist(sDir) Then Return + + sParent = sDir + If GetRoot() = (sDir &/ sFile) Then + sParent = "" + hPict = $hRootPict + If Not hPict Then hPict = Picture["icon:/small/directory"] + sName = sDir &/ sFile + bNoEdit = True + Else + hPict = GetIcon(sDir &/ sFile) + sName = sFile + Endif + + sAfter = FindAfter($hTreeView, sName, sParent) + + With $hTreeView.Add(sDir &/ sFile, sName, hPict, sParent) + .Editable = Not bNoEdit + .MoveAfter(sAfter) + + 'hStat = Stat(sDir &/ sFile) + hStat = DirCache[sDir].GetInfo(sFile) + + bRichText = False + + sText = sFile + If hStat.Link Then + sText = "" & sText & "" + bRichText = True + Endif + If hStat.Hidden Then + sText = "" & sText & "" + bRichText = True + Endif + + If bRichText Then .RichText = sText + + End With + + $hTreeView.Add((sDir &/ sFile) & "/", "",, sDir &/ sFile).Expanded = False + +End + +Public Sub TreeView_Expand() + + Dim sFile As String + Dim sDir As String + Dim sDelete As String + Dim hCache As DirCache + Dim aDir As String[] + + If Not $hTreeView.Item Then Stop + + $hTreeView.Item.Selected = True + + sDir = $hTreeView.Item.Key + + If $bWatch Then AddWatch(sDir) + + If sDir = GetRoot() Then + $hTreeView.Item.Picture = $hRootPict + Else + $hTreeView.Item.Picture = GetIcon($hTreeView.Item.key) 'open + Endif + + If $hTreeView.MoveChild() Then Return + If $hTreeView.Item.Text Then Return + sDelete = $hTreeView.Item.Key + + Inc Application.Busy + + $hTreeView[sDelete].Delete + + hCache = DirCache[sDir] + hCache.Lock + Try aDir = hCache.GetFiles().Sort(gb.Natural + gb.IgnoreCase) + If Not Error Then + For Each sFile In aDir + If Not hCache.IsDir(sFile) Then Continue + AddDir(sDir, sFile) + Next + Endif + hCache.Unlock + + If $hTreeView[sDir].Children = 0 Then + $hTreeView[sDir].Picture = GetIcon(sDir) + Else + '$hTreeView[sDir].Expanded = TRUE + Endif + +Finally + + Dec Application.Busy + +Catch + + Debug Error.Where; ": "; Error.Text + +End + +Public Sub TreeView_Collapse() + + '$hTreeView.Item.Selected = TRUE + 'IF $hTreeView.Item.Key = GetRoot() THEN RETURN + ' $hTreeView.Item.Picture = GetIcon( + + $bNoExpand = True + Last.Item.Selected = True + $bNoExpand = False + + If $bWatch Then RemoveWatch(Last.Item.Key) + +End + +Public Sub TreeView_Select() + + If Not $bNoExpand And If Not $bInRename Then + If $hTreeView.Current And If Not $hTreeView.Current.Expanded Then + $hTimerExpand.Trigger + Endif + Endif + If $bNoEvent Then Return + Raise {Select} + Raise Click + +End + +Public Sub TimerExpand_Timer() + + Try $hTreeView.Current.Expanded = True + +End + +' Public Sub TreeView_MouseUp() +' +' 'If $bExpandOnMouseUp Then +' Try Last.Current.Expanded = True +' $bExpandOnMouseUp = False +' 'Endif +' +' End + + +Public Sub TreeView_Activate() + + Raise Activate + +End + +' Public Sub TreeView_Click() +' +' If $bNoEvent Then Return +' Raise Click +' +' End + + +Public Sub TreeView_Menu() + + Raise Menu + +End + + +Private Function Current_Read() As String + + Try Return $hTreeView.Current.Key + If Error Then Return GetRoot() + +End + +Private Sub MoveToLastChild() + + $hTreeView.MoveChild + Repeat + Until $hTreeView.MoveNext() + $hTreeView.MoveBack + $hTreeView.Item.EnsureVisible + +Catch + +End + + +Private Sub Current_Write(sDir As String) + + Dim sElt As String + Dim sSubDir As String + + sDir = Trim(sDir) + 'IF Right(sDir) = "/" THEN sDir = Left(sDir, - 1) + If sDir = Current_Read() Then Return + + 'ClearView + + $bNoEvent = True + sSubDir = "/" + For Each sElt In Split(File.Dir(sDir), "/", "", True) + sSubDir &/= sElt + Try $hTreeView[sSubDir].Expanded = True + Next + $bNoEvent = False + + Try $hTreeView[sDir].Selected = True + If Not Error Then + $hTreeView.MoveTo(sDir) + $hTreeView.Item.Expanded = True + MoveToLastChild + 'TRY $hTreeView.MoveNext + 'TRY $hTreeView.Item.EnsureVisible + Endif + Try $hTreeView.Current.EnsureVisible + Raise Click + + 'RAISE Refresh + +End + + +Private Sub RefreshView() + + Dim sDir As String + Dim SX As Integer + Dim SY As Integer + + If $bInRename Then + $bRefreshAfterRename = True + Return + Endif + + SX = $hTreeView.ScrollX + SY = $hTreeView.ScrollY + + sDir = Current_Read() + ClearView + Current_Write(sDir) + + $hTreeView.Scroll(SX, SY) + + $bRefreshTimerTriggered = False + +End + +Private Sub RefreshViewLater() + + If $bRefreshTimerTriggered Then Return + + $bRefreshTimerTriggered = True + $hRefreshTimer.Trigger + +End + +Public Sub Refresh_Timer() + + If Not $bRefreshTimerTriggered Then Return + 'Debug + RefreshView + +End + + + +Private Function ShowHidden_Read() As Boolean + + Return $bShowHidden + +End + +Private Sub ShowHidden_Write(bShowHidden As Boolean) + + If bShowHidden <> $bShowHidden Then + $bShowHidden = bShowHidden + RefreshView + Endif + +End + +Private Function Picture_Read() As Picture + + Dim hPict As Picture + + hPict = $hTreeView[GetRoot()].Picture + If hPict <> Picture["icon:/small/directory"] Then Return hPict 'open + +End + +Private Sub Picture_Write(hPict As Picture) + + If hPict Then + $hRootPict = hPict + Else + $hRootPict = Picture["icon:/small/directory"] 'open + Endif + + $hTreeView[GetRoot()].Picture = $hRootPict + UpdateHideRoot + +End + + +Private Sub Border_Write(bBorder As Boolean) + + $hTreeView.Border = bBorder + +End + +Private Function Border_Read() As Boolean + + Return $hTreeView.Border + +End + +Private Function GetIcon(sPath As String) As Picture + + If sPath = GetRoot() Then Return $hRootPict + $hPict = Null + Try Raise Icon(sPath) + If $hPict Then Return $hPict + Return Picture["icon:/small/directory"] + +End + + +Private Function Icon_Read() As Picture + + Return $hPict + +End + +Private Sub Icon_Write(Value As Picture) + + If Value.Height <> 16 Then + Value = Value.Image.Stretch(Value.Width * 16 / Value.Height, 16).Picture + Endif + $hPict = Value + +End + +Public Sub TreeView_Rename() + + Dim sKey As String = $hTreeView.Item.Key + Dim sParent As String + Dim sNewName As String = $hTreeView.Item.Text + Dim sMsg As String + + $bInRename = False + + If $hTreeView.MoveParent() Then Return + $hTreeView.MoveTo(sKey) + + If sNewName = File.Name(sKey) Then Return + + sMsg = Help.CheckFileName(sNewName) + If sMsg Then + Balloon.Warning(sMsg, $hTreeView, $hTreeView.Item.X + Min(32 + Desktop.Scale * 8, $hTreeView.Item.W) / 2, $hTreeView.Item.Y + $hTreeView.Item.H / 2) + Stop Event + Return + Endif + + Move sKey To File.SetName(sKey, sNewName) + + sParent = File.Dir(sKey) + + ' TODO: Optimization + + Object.Lock($hTreeView) + $hTreeView.Remove(sKey) + sKey = File.SetName(sKey, sNewName) + AddDir(File.Dir(sKey), File.Name(sKey)) + Object.Unlock($hTreeView) + + $hTreeView[sKey].Selected = True + + $bDeleteOnCancel = False + + If $bRefreshAfterRename Then RefreshViewLater + +Catch + + $hTreeView[sKey].Text = File.Name(sKey) + Message.Error(("Cannot rename directory.") & "\n\n" & Error.Text) + +End + +Public Sub TreeView_Cancel() + + Dim sParent As String + + $bInRename = False + + If Not $bDeleteOnCancel Then Return + + sParent = $hTreeView.Item.ParentKey + + Try Rmdir $hTreeView.Item.Key + $hTreeView.Item.Delete + + $hTreeView[sParent].Selected = True + + $bDeleteOnCancel = False + If $bRefreshAfterRename Then RefreshViewLater + +End + + +Public Sub NewFolder() + + Dim sDir As String + Dim sPath As String + Dim iInd As Integer + + sDir = ("New folder") + iInd = 1 + + Do + If Not Exist(Current_Read() &/ sDir) Then Break + Inc iInd + sDir = ("New folder") & " (" & CStr(iInd) & ")" + Loop + + sPath = Current_Read() &/ sDir + Mkdir sPath + AddDir(Current_Read(), sDir) + $bDeleteOnCancel = True + $bInRename = True + $bRefreshAfterRename = False + $hTreeView[sPath].Rename + +Catch + + Message.Error(("Cannot create directory.") & "\n\n" & Error.Text) + +End + +Public Sub Rename() + + Dim sPath As String + + Try sPath = $hTreeView.Current.Key + If sPath Then + $bInRename = True + $hTreeView[sPath].Rename + Endif + +End + + +Private Sub FindAfter(hView As TreeView, sText As String, Optional sParent As String) As String + + Dim sAfter As String + 'Dim iConv As Integer + + With hView + If sParent Then + .MoveTo(sParent) + .MoveChild + Else + .MoveFirst + Endif + While .Available + If Comp(File.Name(.Item.Key), sText, gb.Natural + gb.IgnoreCase) > 0 Then Break + 'If iConv > 0 Then Break + sAfter = .Item.Key + .MoveNext + Wend + End With + + Return sAfter + +End + +Public Sub Reload() + + RefreshView + +End + +Private Function Renaming_Read() As Boolean + + Return $hTreeView.Renaming + +End + +Private Function Settings_Read() As Variant[] + + Return [1, CVariant(ShowHidden_Read())] + + 'Return IIf(ShowDetailed_Read(), "1", "0") & "," & IIf(ShowHidden_Read(), "1", "0") & "," & $hColumnView.Settings + +End + +Private Sub Settings_Write(Value As Variant[]) + + ShowHidden_Write(Value[1]) + +Catch + + Debug Error.Where; ": "; Error.Text + +End + +Private Function HideRoot_Read() As Boolean + + Return $bHideRoot + +End + +Private Sub HideRoot_Write(Value As Boolean) + + $bHideRoot = Value + UpdateHideRoot + +End + +Public Sub Watch_Create() + + 'Debug Last.Path;; Watch.Name + DirCache[Last.Path].Invalidate + RefreshViewLater + +End + +Public Sub Watch_Delete() + + 'Debug Last.Path;; Watch.Name + DirCache[Last.Path].Invalidate + Try $hTreeView.Remove(Last.Path &/ Watch.Name) + 'If Not Error Then RefreshView + +End + +Public Sub Watch_MoveFrom() + + 'Debug Last.Path;; Watch.Name + DirCache[Last.Path].Invalidate + Try $hTreeView.Remove(Last.Path &/ Watch.Name) + +End + +Public Sub Watch_MoveTo() + + 'Debug Last.Path;; Watch.Name + DirCache[Last.Path].Invalidate + RefreshViewLater + +End + +Public Sub Watch_Move() + + 'Debug Last.Path;; Watch.Name + DirCache[Last.Path].Invalidate + RefreshViewLater + +End + +Public Sub Watcher_Show() + + 'Debug + If $bWatch And If Not $cWatch Then + $cWatch = New Collection + RefreshView + Endif + +End + +Public Sub Watcher_Hide() + + 'Debug + $cWatch = Null + +End diff --git a/comp/src/gb.form/.src/File/FileView.class b/comp/src/gb.form/.src/File/FileView.class new file mode 100644 index 00000000..d10f9ab4 --- /dev/null +++ b/comp/src/gb.form/.src/File/FileView.class @@ -0,0 +1,1258 @@ +' Gambas class file + +Export +Inherits UserControl + +Class Watch + +Public Const _Properties As String = "*,Border=True,Mode{Select.*}=Single,Dir,ShowDetailed,ShowHidden,ShowDirectory,ShowPreview" +Public Const _DefaultEvent As String = "Click" +Public Const _Group As String = "View" + +Event {Select} +Event Click +Event Activate +Event Menu +Event Icon(Path As String) + +Property {Dir} As String +Property ShowHidden As Boolean +Property ShowDirectory As Boolean +Property Current As String +Property Mode As Integer +Property ShowDetailed As Boolean +Property ShowPreview As Boolean +Property Selection As String[] +Property Filter As String[] +Property Icon As Picture +Property IconSize As Integer +Property Border As Boolean +Property Settings As Variant[] +Property Read Count As Integer +Property Background As Integer +Property Foreground As Integer + +Static Private $cExt As New Collection(gb.IgnoreCase) + +Private Const PREFIX_DIR As String = "0" +Private Const PREFIX_FILE As String = "1" + +Private $sDir As String +Private $bShowHidden As Boolean +Private $bShowDir As Boolean +Private $bShowPreview As Boolean + +Private $hIconView As IconView +Private $hInfoFont As Font + +Private $hColumnView As ColumnView +Private $sSortDir As String +Private $iSort As Integer +Private $bAsc As Boolean = True + +Private $hVoidView As TextLabel + +Private $aFilter As String[] +Private $hPict As Picture +Private $hRefresh As Timer +Private $bRefreshTriggered As Boolean +Private $iIconSize As Integer = 32 +Private $bDesktopIsLoaded As Boolean + +Private $hPreview As CTaskPreview +Private $hEnsureVisible As Timer +Private $hWatch As Watch +Private $bWatch As Boolean +Private $bRefreshIcon As Boolean +Private $bRefreshAll As Boolean +Private $hWatcher As Watcher +Private $bVisible As Boolean +Private $bInvalidate As Boolean + +Static Private $iIconExecSize As Integer +Static Private $hIconExec As Picture + +Private picLock As PictureBox + +Static Public Sub _init() + + $cExt["html"] = "html" + $cExt["htm"] = "html" + $cExt["css"] = "html" + $cExt["tar"] = "archive" + $cExt["gz"] = "archive" + $cExt["tgz"] = "archive" + $cExt["bz2"] = "archive" + $cExt["z"] = "archive" + $cExt["zip"] = "archive" + $cExt["txt"] = "text" + $cExt["json"] = "text" + $cExt["mp3"] = "audio" + $cExt["aac"] = "audio" + $cExt["ogg"] = "audio" + $cExt["wav"] = "audio" + $cExt["mpg"] = "video" + $cExt["mpeg"] = "video" + $cExt["avi"] = "video" + $cExt["wmv"] = "video" + $cExt["mov"] = "video" + $cExt["gambas"] = "gambas" + $cExt["c"] = "text" + $cExt["cpp"] = "text" + $cExt["h"] = "text" + $cExt["deb"] = "package" + $cExt["rpm"] = "package" + $cExt["iso"] = "cdrom" + $cExt["jpg"] = "image" + $cExt["jpeg"] = "image" + $cExt["png"] = "image" + $cExt["gif"] = "image" + $cExt["xpm"] = "image" + $cExt["bmp"] = "image" + $cExt["ico"] = "image" + $cExt["xcf"] = "image" + $cExt["svg"] = "image" + $cExt["pdf"] = "pdf" + $cExt["ttf"] = "font" + $cExt["otf"] = "font" + $cExt["bdf"] = "font" + +End + +Static Public Sub _exit() + + Try DirCache.Exit + +End + + +Public Sub _new() + + $bDesktopIsLoaded = Component.IsLoaded("gb.desktop") + $bWatch = Component.IsLoaded("gb.inotify") + If $bWatch Then $hWatcher = New Watcher(Me) As "Watcher" + + With $hIconView = New IconView(Me) As "View" + .Sorted = True + .IconLines = 3 + End With + + With $hColumnView = New ColumnView(Me) As "View" + .Columns.Count = 3 + .Columns[0].Text = ("Name") + .Columns[0].Expand = False + .Columns[1].Text = ("Size") + .Columns[1].Alignment = Align.Right + .Columns[2].Text = ("Last modified") + '.Columns[2].Alignment = Align.Right + '.Columns[0].Width = 64 + '.Columns[1].Width = 64 + '.Columns[2].Width = 96 + .Visible = False + .Sorted = True + .Resizable = True + End With + + $hVoidView = New TextLabel(Me) + $hVoidView.Alignment = Align.Center + $hVoidView.Text = ("No file in this folder.") + $hVoidView.Font.Grade = 2 + $hVoidView.Foreground = Color.LightForeground + $hVoidView.Visible = False + + Me.Proxy = GetView() + + $hRefresh = New Timer As "Refresh" + $hEnsureVisible = New Timer As "EnsureVisible" + + RefreshViewLater + +End + +Private Function CheckFilter(sFile As String) As Boolean + + Dim sFilter As String + + For Each sFilter In $aFilter + If sFile Like sFilter Then Return + Next + + Return True + +End + +Private Sub GetMimeIcon(sPath As String, iSize As Integer) As Picture + + Try Return DirCache[File.Dir(sPath)].GetMimeIcon(File.Name(sPath), iSize).Picture + +End + +Private Sub GetIcon(sPath As String, iSize As Integer) As Picture + + Dim sIcon As String + Dim hPict As Picture + + $hPict = Null + Try Raise Icon(sPath) + If $hPict Then Return $hPict + + If IsDir(sPath) Then Return + + 'If $bShowPreview And If $cPreview.Exist(sPath) Then Return $cPreview[sPath].Picture + + ' If $bShowPreview And If $aImgExt.Exist(File.Ext(sPath), gb.IgnoreCase) < 0 Then + ' If Stat(sPath).Size <= 65536 Then + ' + ' Try hImage = Image.Load(sPath) + ' If Not Error Then + ' If Not (hImage.Width = iSize And hImage.Height = iSize) Then + ' If hImage.Width > hImage.Height Then + ' hImage = hImage.Stretch(iSize, (iSize * hImage.Height) \ hImage.Width) + ' Else + ' hImage = hImage.Stretch((iSize * hImage.Width) \ hImage.Height, iSize) + ' Endif + ' Endif + ' + ' hIcon = New Image(hImage.W + 4, hImage.H + 4, Color.Transparent) + ' Paint.Begin(hIcon) + ' Paint.AntiAlias = False + ' Paint.LineWidth = 2 + ' Paint.Rectangle(0, 0, hIcon.W, hIcon.H) + ' Paint.Background = Color.Merge(GetView().Background, Color.Gray) + ' Paint.Stroke + ' Paint.End + ' hIcon.DrawImage(hImage, 2, 2) + ' + ' Return hIcon.Picture + ' Else + ' Return Picture["icon:/" & iSize & "/image"] + ' Endif + ' + ' Endif + ' + ' Endif + + If $bDesktopIsLoaded Then + + hPict = GetMimeIcon(sPath, iSize) + If hPict Then Return hPict + + Endif + + Try sIcon = $cExt[File.Ext(sPath)] + If sIcon Then Return Picture["icon:/" & CStr(iSize) &/ sIcon] + + With DirCache[File.Dir(sPath)].GetInfo(File.Name(sPath)) + + If InStr(.Perm[System.User.Name], "x") Then + If Not $hIconExec Or If $iIconExecSize <> iSize Then + $iIconExecSize = iSize + $hIconExec = Picture["icon:/" & CStr(iSize) &/ "exec"] + Endif + Return $hIconExec + Endif + + End With + +Catch + + Error "gb.form: unable to get icon for file: "; File.Name(sPath); ": "; Error.Text + +End + +Private Sub GetSelection() As String[] + + Dim hView As Object + Dim aSel As New String[] + + If $hIconView.Visible Then + hView = $hIconView + Else + hView = $hColumnView + Endif + + hView.MoveFirst + While hView.Available + If hView.Item.Selected Then + aSel.Add(hView.Item.Key) + Endif + hView.MoveNext + Wend + + Return aSel + +End + +Private Sub GetIconSize() As Integer + + If $hColumnView.Visible Then + Return Stock.GetSize("small") + Else + Return $iIconSize + Endif + +End + +Private Sub GetCurrentDir() As String + + If $sDir Then + Return $sDir + Else + Return User.Home + Endif + +End + +Static Public Sub _GetHiddenColor() As Integer + + Return Color.Merge(Color.TextBackground, Color.TextForeground, 0.66) + +End + +Private Sub ShowLock() + + If Not picLock Then + picLock = New PictureBox(Me) + picLock.Picture = Picture["img/lock.png"] + picLock.Ignore = True + picLock.Mode = PictureBox.Cover + picLock.ResizeScaled(8, 8) + Watcher_Resize + Endif + picLock.Show + picLock.Raise + +End + +Private Sub HideLock() + + If picLock Then picLock.Hide + +End + +Private Sub RefreshView() + + Dim sFile As String + Dim sDir As String + Dim hPictFile As Picture + Dim hPictFolder As Picture + Dim hPict As Picture + Dim sPrefix As String + Dim iSize As Integer + Dim aSel As String[] + Dim aDir As New String[] + Dim I As Integer + Dim sText As String + Dim bRichText As Boolean + Dim hCache As DirCache + Dim iHiddenFg As Integer + Dim SX As Integer + Dim SY As Integer + Dim sKey As String + Dim aPreview As New String[] + Dim sExt As String + Dim bVoid As Boolean + + Inc Application.Busy + + $bRefreshTriggered = False + + iHiddenFg = _GetHiddenColor() + + aSel = GetSelection() + + If $hColumnView.Visible Then + SX = $hColumnView.ScrollX + SY = $hColumnView.ScrollY + If Not $bWatch Or If $bRefreshAll Then + $hColumnView.Clear + $hColumnView._Begin() + Endif + $hColumnView.Sorted = False + hPictFile = Picture["icon:/small/file"] + hPictFolder = Picture["icon:/small/directory"] + Else + SX = $hIconView.ScrollX + SY = $hIconView.ScrollY + If Not $bWatch Or If $bRefreshAll Then $hIconView.Clear + $hIconView._Begin + hPictFile = Picture["icon:/" & $iIconSize & "/file"] + hPictFolder = Picture["icon:/" & $iIconSize & "/directory"] + $hInfoFont = $hIconView.Font.Copy() + $hInfoFont.Size *= 0.7 + Endif + + iSize = GetIconSize() + + sDir = GetCurrentDir() + + If $bWatch And If $bVisible Then + If Not $hWatch Or If $hWatch.Path <> sDir Then + $hWatch = New Watch(sDir) As "Watch" + Endif + Endif + + hCache = DirCache[sDir] + If $bInvalidate Then + hCache.Invalidate + $bInvalidate = False + Endif + + 'Try aDir = Dir(sDir, "*").Sort() + Try aDir = hCache.GetFiles() + If Error Then + + ShowLock() + + Else + + HideLock() + + hCache.Lock + For Each sFile In aDir + If Not $bShowHidden And If Left(sFile) = "." Or Right(sFile) = "~" Then Continue + 'With Stat(sDir &/ sFile) + With hCache.GetInfo(sFile) + If hCache.IsDir(sFile) Then + If Not $bShowDir Then Continue + sPrefix = PREFIX_DIR + Else + If $aFilter And If CheckFilter(sFile) Then Continue + sPrefix = PREFIX_FILE + Endif + + sKey = sPrefix & sFile + + hPict = GetIcon(sDir &/ sFile, iSize) + If Not hPict Then + If hCache.IsDir(sFile) Then + hPict = hPictFolder + Else + hPict = hPictFile + Endif + Endif + + bRichText = False + + sText = sFile + If .Link Then + sText = "" & sText & "" + bRichText = True + Endif + If .Hidden Then + sText = "" & sText & "" + bRichText = True + Endif + + If $hColumnView.Visible Then + If Not $hColumnView.Exist(sKey) Then + $hColumnView.Add(sKey, sFile, hPict).Editable = Access(sDir, gb.Write) + GoSub ADD_PREVIEW + Else + $hColumnView[sKey].Editable = Access(sDir, gb.Write) + If $bRefreshIcon Then + $hColumnView[sKey].Picture = hPict + GoSub ADD_PREVIEW + Endif + Endif + $hColumnView[sKey][1] = " " & Main.GetFileSize(.Size) + $hColumnView[sKey][2] = " " & Str(.Time) + If bRichText Then $hColumnView[sPrefix & sFile].RichText = sText + Else + If Not $hIconView.Exist(sKey) Then + $hIconView.Add(sKey, sFile, hPict).Editable = Access(sDir, gb.Write) + GoSub ADD_PREVIEW + Else + $hIconView[sKey].Editable = Access(sDir, gb.Write) + If $bRefreshIcon Then + $hIconView[sKey].Picture = hPict + GoSub ADD_PREVIEW + Endif + Endif + If bRichText Then $hIconView[sKey].RichText = sText + Endif + + End With + Next + bVoid = aDir.Count = 0 + + hCache.Unlock + + If $hColumnView.Visible Then + For I = 1 To $hColumnView.Columns.Max + $hColumnView.Columns[I].W = -1 + Next + Endif + + For Each sFile In aSel + Try GetView()[sFile].Selected = True + Next + + If aPreview.Count Then RunPreview(aPreview) + + Endif + +Finally + + $bRefreshIcon = False + $bRefreshAll = False + If $hColumnView.Visible Then + $hColumnView._End + $hColumnView.Sorted = True + Else + $hIconView._End + Endif + Try GetView().Scroll(SX, SY) + + If bVoid Then + $hVoidView.Show + $hVoidView.Raise + Else + $hVoidView.Hide + Endif + + Dec Application.Busy + +Catch + + Error "gb.form: "; Error.Where; ": "; Error.Text + Return + +ADD_PREVIEW: + + If Not $bShowPreview Then Return + sExt = LCase(File.Ext(sFile)) + If Not sExt Then Return + If $cExt[sExt] <> "image" Then Return + aPreview.Add(sFile) + Return + +End + +Private Sub RunPreview(aPreview As String[]) + + If $hPreview Then $hPreview.Stop + $hPreview = New CTaskPreview(GetCurrentDir(), GetIconSize(), aPreview) As "TaskPreview" + +End + +Public Sub TaskPreview_Read(Data As String) + + Dim iPos As Integer + Dim sPath As String + Dim sPreview As String + Dim sLine As String + + If Not $bShowPreview Then Return + + For Each sLine In Split(Data, "\n", "", True) + + If sLine = "." Then + Try $hPreview.Stop + Return + Endif + + iPos = InStr(sLine, "\t") + sPath = Left(sLine, iPos - 1) + sPreview = Mid$(sLine, iPos + 1) + + Try GetView()[PREFIX_FILE & sPath].Picture = Image.Load(sPreview).Picture + + Next + +End + +Public Sub TaskPreview_Kill() + + If $hPreview = Last Then $hPreview = Null + +End + + +Private Sub RefreshViewLater(Optional bClear As Boolean) + + If $bRefreshTriggered Then + If bClear Then $bRefreshAll = True + Return + Endif + + If $hRefresh.Enabled Then $hRefresh.Stop + + $bRefreshAll = bClear + $bRefreshTriggered = True + $hRefresh.Trigger + +End + +Public Sub _RefreshViewAfter() + + If $bRefreshTriggered Then Return + If $hRefresh.Enabled Then Return + + $hRefresh.Delay = 100 + $hRefresh.Start + +End + + +Public Sub Refresh_Timer() + + If Not $bRefreshTriggered And Not $hRefresh.Enabled Then Return + RefreshView + $hRefresh.Stop + +End + +Public Sub Reload() + + $bInvalidate = True + RefreshViewLater(True) + +End + +Private Function Dir_Read() As String + + Return $sDir + +End + +Private Sub Dir_Write(sDir As String) + + $sDir = sDir + RefreshViewLater(True) + +End + +Private Function ShowHidden_Read() As Boolean + + Return $bShowHidden + +End + +Private Sub ShowHidden_Write(bShowHidden As Boolean) + + If bShowHidden = $bShowHidden Then Return + $bShowHidden = bShowHidden + RefreshViewLater(True) + +End + +Private Function ShowDirectory_Read() As Boolean + + Return $bShowDir + +End + +Private Sub ShowDirectory_Write(bShow As Boolean) + + If $bShowDir = bShow Then Return + $bShowDir = bShow + RefreshViewLater(True) + +End + +Private Function GetView() As Object + + If $hIconView.Visible Then + Return $hIconView + Else + Return $hColumnView + Endif + +End + +Private Function Current_Read() As String + + If GetView().Current.Selected Then Return Mid$(GetView().Current.Key, 2) + +Catch + +End + +Private Sub EnsureRefresh() + + Refresh_Timer + +End + +Public Sub EnsureVisible_Timer() + + Dim hItem As Object + + hItem = GetView().Current + If Not hItem Then Return + + With hItem + If Not .Selected Then Return + .EnsureVisible + End With + +End + + +Private Sub Current_Write(sFile As String) + + Dim sKey As String + + 'Debug sFile + + If sFile = Current_Read() Then Return + + EnsureRefresh + + GetView().UnselectAll + sKey = PREFIX_DIR & sFile + If Not GetView().Exist(sKey) Then sKey = PREFIX_FILE & sFile + If Not GetView().Exist(sKey) Then Return + + GetView()[sKey].Selected = True + $hEnsureVisible.Trigger + +End + +' Private Function Font_Read() As Font +' +' Return Super.Font +' +' End +' +' Private Sub Font_Write(hFont As Font) +' +' Super.Font = hFont +' RefreshGrid +' +' End + +Private Function ShowDetailed_Read() As Boolean + + Return $hColumnView.Visible + +End + +Private Sub ShowDetailed_Write(bDetailed As Boolean) + + Dim hOld As Control + + If bDetailed = ShowDetailed_Read() Then Return + + If bDetailed Then + + hOld = $hIconView + $hColumnView.Show + + Else + + hOld = $hColumnView + $hIconView.Show + + Endif + + hOld.Hide + Me.Proxy = GetView() + Me.Background = hOld.Background + Me.Foreground = hOld.Foreground + $bRefreshAll = True + RefreshView + TakeSelection + +End + +Public Sub View_Select() + + Raise {Select} + +End + +Public Sub View_Click() + + Raise Click + +End + +Public Sub View_Activate() + + Raise Activate + +End + +Public Sub View_Menu() + + Raise Menu + +End + +Public Sub View_BeforeSort() + + $sSortDir = GetCurrentDir() + + If $hColumnView.Visible Then + $iSort = $hColumnView.Columns.Sort + $bAsc = $hColumnView.Columns.Ascending + Else + $hIconView.Ascending = $bAsc + Endif + +End + + +Public Sub View_Compare((Key) As String, OtherKey As String) + + Dim hStat As Stat + Dim hStat2 As Stat + Dim iComp As Integer + + iComp = Comp(Asc(Key), Asc(OtherKey)) + + If iComp = 0 Then + + If $iSort Then + hStat = DirCache[$sSortDir].GetInfo(Mid$(Key, 2)) + hStat2 = DirCache[$sSortDir].GetInfo(Mid$(OtherKey, 2)) + Endif + + Select $iSort + + Case 1 + iComp = Sgn(hStat.Size - hStat2.Size) + + Case 2 + iComp = Sgn(hStat.Time - hStat2.Time) + + End Select + + If iComp = 0 Then iComp = Comp(Key, OtherKey, gb.IgnoreCase + gb.Natural) + + 'IF NOT $bAsc THEN iComp = (- iComp) + + Endif + + Last.Compare = iComp + +Catch + +End + +Private Sub Mode_Write(iMode As Integer) + + $hIconView.Mode = iMode + $hColumnView.Mode = iMode + +End + +Private Function Mode_Read() As Integer + + Return $hIconView.Mode + +End + +Private Function Selection_Read() As String[] + + Dim hView As Object + Dim aSel As New String[] + + EnsureRefresh + + hView = GetView() + hView.MoveFirst + While hView.Available + If hView.Item.Selected Then + aSel.Add(hView.Item.Text) + Endif + hView.MoveNext + Wend + + Return aSel + +End + +Private Sub Selection_Write(Value As String[]) + + Dim hView As Object + Dim sFile As String + Dim hCache As DirCache + + If $hIconView.Mode = Select.None Then Return + + EnsureRefresh + + hCache = DirCache[GetCurrentDir()] + + hView = GetView() + hView.UnselectAll + For Each sFile In Value + sFile = If(hCache.IsDir(sFile), PREFIX_DIR, PREFIX_FILE) & sFile + Try hView[sFile].Selected = True + Next + +End + +Private Sub TakeSelection() + + Dim hSrc As Object + Dim hDst As Object + + If $hIconView.Mode = Select.None Then Return + + hSrc = $hIconView + hDst = $hColumnView + If $hIconView.Visible Then Swap hSrc, hDst + + If $hIconView.Mode = Select.Single Then + If hSrc.Current And If hSrc.Current.Selected Then + Object.Lock(hDst) + hDst[hSrc.Key].Selected = True + hDst[hSrc.Key].EnsureVisible + Object.Unlock(hDst) + Endif + Return + Endif + + hDst.UnselectAll + hSrc.MoveFirst + While hSrc.Available + If hSrc.Item.Selected Then + Object.Lock(hDst) + hDst[hSrc.Item.Key].Selected = True + Object.Unlock(hDst) + Endif + hSrc.MoveNext + Wend + +End + +Private Function Filter_Read() As String[] + + Return $aFilter + +End + +Private Sub Filter_Write(aFilter As String[]) + + $aFilter = aFilter.Copy() + RefreshViewLater(True) + +End + +Private Function Icon_Read() As Picture + + Return $hPict + +End + +Private Sub Icon_Write(Value As Picture) + + $hPict = Value + +End + +Private Function Border_Read() As Boolean + + Return $hColumnView.Border + +End + +Private Sub Border_Write(Value As Boolean) + + $hColumnView.Border = Value + $hIconView.Border = Value + +End + +Private Function Settings_Read() As Variant[] + + Return [1, CVariant(ShowDetailed_Read()), ShowHidden_Read(), $hColumnView.Settings, $iIconSize, ShowPreview_Read()] + + 'Return IIf(ShowDetailed_Read(), "1", "0") & "," & IIf(ShowHidden_Read(), "1", "0") & "," & $hColumnView.Settings + +End + +Private Sub Settings_Write(Value As Variant[]) + + If TypeOf(Value[0]) = gb.Integer Then + ShowDetailed_Write(Value[1]) + ShowHidden_Write(Value[2]) + $hColumnView.Settings = Value[3] + IconSize_Write(Value[4]) + If Value.Count >= 6 Then ShowPreview_Write(Value[5]) + Else + ShowDetailed_Write(Value[0]) + ShowHidden_Write(Value[1]) + $hColumnView.Settings = Value[2] + Endif + +Catch + + Error "gb.form :"; Error.Where; ": "; Error.Text + +End + +Private Function Count_Read() As Integer + + If $hIconView.Visible Then + Return $hIconView.Count + Else + Return $hColumnView.Count + Endif + +End + +' PUBLIC SUB View_MouseMove() +' +' IF $hIconView.Visible THEN RETURN +' +' IF $hColumnView.Find(Mouse.X, Mouse.Y) THEN RETURN +' DEBUG $hColumnView.Item.Text +' +' END + +Private Function IconSize_Read() As Integer + + Return $iIconSize + +End + +Private Sub IconSize_Write(Value As Integer) + + $iIconSize = Value + $bRefreshIcon = True + RefreshViewLater + $hIconView.GridSize = Min(40, (Value + 8) \ 3) + +End + +Public Sub SelectAll() + + If $hIconView.Mode <> Select.Multiple Then Return + EnsureRefresh + GetView().SelectAll() + +End + +Public Sub UnselectAll() + + If $hIconView.Mode <> Select.Multiple Then Return + GetView().UnselectAll() + +End + +Private Function Background_Read() As Integer + + Return $hColumnView.Background + +End + +Private Sub Background_Write(Value As Integer) + + $hIconView.Background = Value + $hColumnView.Background = Value + +End + +Private Function Foreground_Read() As Integer + + Return $hColumnView.Foreground + +End + +Private Sub Foreground_Write(Value As Integer) + + $hIconView.Foreground = Value + $hColumnView.Foreground = Value + +End + +Private Function ShowPreview_Read() As Boolean + + Return $bShowPreview + +End + +Private Sub ShowPreview_Write(Value As Boolean) + + If $bShowPreview = Value Then Return + $bShowPreview = Value + $bRefreshIcon = True + RefreshViewLater + +End + +Public Sub Rename() + + Dim hView As Object = GetView() + Dim sPath As String + + Try sPath = hView.Current.Key + If sPath Then + hView[sPath].Rename + Endif + +End + +Public Sub View_Cancel() + + Reload + +End + + +Public Sub View_Rename() + + Dim hView As Object = GetView() + Dim sKey As String = hView.Item.Key + Dim sOldPath As String = GetCurrentDir() &/ Mid$(sKey, 2) + Dim sNewName As String = hView.Item.Text + Dim sMsg As String + + If sNewName = File.Name(sOldPath) Then Return + + sMsg = Help.CheckFileName(sNewName) + If sMsg Then + Balloon.Warning(sMsg, hView, hView.Item.X + Min(32 + Desktop.Scale * 8, hView.Item.W) / 2, hView.Item.Y + hView.Item.H / 2) + Stop Event + Return + Endif + + Move sOldPath To File.SetName(sOldPath, sNewName) + + 'sParent = File.Dir(sKey) + + ' TODO: Optimization + + Object.Lock(hView) + hView.Remove(sKey) + Mid$(sKey, 2) = sNewName + 'AddDir(File.Dir(sKey), File.Name(sKey)) + RefreshView + Object.Unlock(hView) + + Try hView.Key = sKey + +Catch + + hView[sKey].Text = File.Name(sOldPath) + Message.Error(("Cannot rename file.") & "\n\n" & Error.Text) + +End + +Private Sub GetWatchKey() As String + + If Watch.IsDir Then + Return PREFIX_DIR & Watch.Name + Else + Return PREFIX_FILE & Watch.Name + Endif + +End + +Public Sub Watch_Create() + + DirCache[GetCurrentDir()].Invalidate + RefreshViewLater + +End + +Public Sub Watch_Delete() + + DirCache[GetCurrentDir()].Invalidate + Try GetView().Remove(GetWatchKey()) + If Not Error Then RefreshViewLater + +End + +Public Sub Watch_MoveFrom() + + DirCache[GetCurrentDir()].Invalidate + Try GetView().Remove(GetWatchKey()) + If Not Error Then RefreshViewLater + +End + +Public Sub Watch_MoveTo() + + DirCache[GetCurrentDir()].Invalidate + RefreshViewLater + +End + +Public Sub Watch_Stat() + + RefreshViewLater + +End + +Public Sub Watcher_Hide() + + 'Debug + $hWatch = Null + $bVisible = False + +End + +Public Sub Watcher_Show() + + 'Debug + $bVisible = True + RefreshViewLater + +End + +Public Sub Watcher_Resize() + + If picLock And If picLock.Visible Then + picLock.Move((Me.W - picLock.W) \ 2, (Me.H - picLock.H) \ 2) + Endif + +End + + +Public Sub View_Draw(X As Integer, Y As Integer, Width As Integer, Height As Integer, (Key) As String) + + 'Dim iSize As Long + 'Dim hFont As Font + Dim H As Integer + Dim hStat As Stat + Dim dDate As Date + Dim sDate As String + Dim sAuth As String + + H = $hInfoFont.H + + If $iIconSize < (H * 4) Then Return + + Try hStat = Stat($sDir &/ Mid$(Key, 2)) + If Error Then Return + + Paint.Background = Color.Merge(Style.ForegroundOf(Last), Style.BackgroundOf(Last), 0.3) + + If System.RightToLeft Then + Width = (Width - $iIconSize - H) \ 2 + Else + X += (Width + $iIconSize + H) \ 2 + Endif + 'Paint.Save + Paint.Font = $hInfoFont + + Y += Desktop.Scale + Paint.DrawText(Main.GetFileSize(hStat.Size, 0), X, Y, Width, Height, Align.TopNormal) + + If $iIconSize < (H * 5) Then Return + + dDate = hStat.LastModified + If Date(dDate) = Date(Now) Then + sDate = Format(dDate, gb.LongTime) + Else + sDate = Format(dDate, gb.MediumDate) + Endif + + Y += H * 1.25 + Paint.DrawText(sDate, X, Y, Width, Height, Align.TopNormal) + + If $iIconSize < (H * 6) Then Return + + sAuth = hStat.Auth + sAuth = Left(sAuth, 3) & " " & Mid$(sAuth, 4, 3) & " " & Mid$(sAuth, 7) + + Y += H * 1.25 + Paint.DrawText(sAuth, X, Y, Width, Height, Align.TopNormal) + +End diff --git a/comp/src/gb.form/.src/File/Properties/CTaskDirSize.class b/comp/src/gb.form/.src/File/Properties/CTaskDirSize.class new file mode 100644 index 00000000..cdd9844e --- /dev/null +++ b/comp/src/gb.form/.src/File/Properties/CTaskDirSize.class @@ -0,0 +1,71 @@ +' Gambas class file + +Inherits Task + +Private $sDir As String +Private $fTime As Float +Private $nTime As Integer +Private $nFile As Integer +Private $nDir As Integer +Private $iSize As Long + +Public Sub _new(sDir As String) + + $sDir = sDir + +End + +Private Sub ScanDir(sDir As String) + + Dim sFile As String + Dim sPath As String + Dim hStat As Stat + Dim aDir As String[] + + Try aDir = Dir(sDir) + If Error Then + Error Error.Text & ": " & sDir + Return + Endif + + For Each sFile In aDir + + sPath = sDir &/ sFile + Try hStat = Stat(sPath) + If Error Then + Error Error.Where & ": " & Error.Text & ": " & sPath + Continue + Endif + + With hStat + If .Type = gb.Directory Then + Inc $nDir + ScanDir(sPath) + Else If IsDir(sPath) Then + Inc $nDir + Else + Inc $nFile + Endif + Try $iSize += .Size + End With + + If (Timer - $fTime) >= ($nTime / 5) Then + $nTime = CInt((Timer - $fTime) * 5) + 1 + Print $iSize;; $nFile;; $nDir + Endif + + Next + +End + + +Public Sub Main() As String + + $fTime = Timer + $nTime = 1 + + ScanDir($sDir) + + Return CStr($iSize) & " " & CStr($nFile) & " " & CStr($nDir) + +End diff --git a/comp/src/gb.form/.src/File/Properties/FFileProperties.class b/comp/src/gb.form/.src/File/Properties/FFileProperties.class new file mode 100644 index 00000000..2255ce60 --- /dev/null +++ b/comp/src/gb.form/.src/File/Properties/FFileProperties.class @@ -0,0 +1,467 @@ +' Gambas class file + +Class DesktopMime +Class MediaView + +Static Private $aImgExt As String[] = ["png", "jpg", "jpeg", "gif", "bmp", "xpm"] +Static Private $aAudioExt As String[] = ["wav", "mp3", "ogg", "flac"] +Static Private $aVideoExt As String[] = ["mp4", "mov", "avi", "mpg", "mpeg", "flv", "wmv", "mkv"] + +Private $sPath As String + +Private $iSize As Long +Private $hTask As Task +Private $sError As String +Private $bPreview As Boolean +Private $hPreview As Image + +Private $hViewer As MediaView + +Private TAB_IMAGE_PREVIEW As Integer = 1 +Private TAB_MEDIA_PREVIEW As Integer = 2 +Private TAB_ERROR As Integer = 3 + +Private $bMedia As Boolean +Private $bIgnoreNextTaskError As Boolean + +Public Sub Run(sPath As String) As Boolean + + SetPath(sPath) + btnClose.Show + panMediaClose.Show + 'tabInfo.Border = False + Me.Margin = True + Return Not FFileProperties.ShowModal() + +End + +Private Sub FormatPath(sPath As String) As String + + If sPath Begins System.User.Home & "/" Then + sPath = "~" &/ Mid$(sPath, Len(System.User.Home) + 2) + Endif + + Return sPath + +End + +Public Sub GetPath() As String + + Return $sPath + +End + +Public Sub SetPath(sPath As String) + + $bIgnoreNextTaskError = True + Try $hTask.Stop + $sPath = sPath + $bPreview = False + RefreshPath + tabInfo_Click + +End + +Private Sub RefreshPath() + + Dim hParent As FileProperties = Me.Parent + Dim hData As _FilePropertiesData + + Dim hMime As DesktopMime + Dim hLabel As Label + Dim W As Integer + Dim sAuth As String + Dim bShowImagePreview As Boolean + Dim bShowMediaPreview As Boolean + + If hParent Then hData = hParent._RaiseData() + + lblDir.Text = FormatPath(File.Dir($sPath)) + If String.Len(lblDir.Text) >= 32 Then lblDir.Tooltip = lblDir.Text + + If Exist($sPath) Then + + With DirCache[File.Dir($sPath)].GetInfo(File.Name($sPath)) + + If hData Then + + lblType.Text = hData.Type + picIcon.Picture = hData.Icon + + Else + + If .Link Then + lblType.Text = ("Link") + 'lblType.Font.Italic = True + hMime = DesktopMime.FromFile($sPath) + Try picIcon.Picture = hMime.GetIcon(64).Picture + Else If IsDir($sPath) Then + picIcon.Picture = Picture["icon:/64/directory"] + lblType.Text = ("Directory") + Else If Component.IsLoaded("gb.desktop") Then + hMime = DesktopMime.FromFile($sPath) + If hMime Then + lblType.Text = String.UCaseFirst(hMime.GetComment()) + Try picIcon.Picture = hMime.GetIcon(64).Picture + If Error Then Error "gb.form: unable to find icon for mimetype: "; hMime.GenericIcon + If hMime.Type Like "image/*" Then + bShowImagePreview = True + Else If $bMedia And If hMime.Type Like "{video,audio}/*" Then + bShowMediaPreview = True + Else If $bMedia And If hMime.Type Like "audio/*" Then + bShowMediaPreview = True + Endif + Endif + Else If $aImgExt.Exist(File.Ext($sPath), gb.IgnoreCase) Then + picIcon.Picture = Picture["icon:/64/image"] + lblType.Text = ("Image") + bShowImagePreview = True + Else If $bMedia Then + If $aAudioExt.Exist(File.Ext($sPath), gb.IgnoreCase) Then + picIcon.Picture = Picture["icon:/64/audio"] + lblType.Text = ("Audio") + bShowMediaPreview = True + Else If $aVideoExt.Exist(File.Ext($sPath), gb.IgnoreCase) Then + picIcon.Picture = Picture["icon:/64/video"] + lblType.Text = ("Video") + bShowMediaPreview = True + Endif + Endif + + Endif + + + If .Link Then + lblLabelLink.Show + lblLink.Show + lblLink.Text = .Link + Else + lblLabelLink.Hide + lblLink.Hide + Endif + + If IsDir($sPath) Then $hTask = New CTaskDirSize($sPath) As "Task" + + $iSize = .Size + UpdateSize() + + lblLastModified.Text = Format(.LastModified, gb.GeneralDate) + + sAuth = .Auth + 'sAuth = Left$(sAuth, 3) & " " & Mid$(sAuth, 4, 3) & " " & Right$(sAuth, 3) + lblAuth.Text = sAuth + lblUser.Text = .User + lblGroup.Text = .Group + + End With + + Else + + lblLabelType.Text = ("Type") + lblType.Text = "" + lblLastModified.Text = "" + lblAuth.Text = "" + lblUser.Text = "" + lblGroup.Text = "" + lblSize.Text = "" + + Endif + + tabInfo[TAB_IMAGE_PREVIEW].Visible = bShowImagePreview + tabInfo[TAB_MEDIA_PREVIEW].Visible = bShowMediaPreview + + For Each hLabel In panProperty.Children + If hLabel.Expand Then Continue + hLabel.Foreground = Color.Merge(Color.Foreground, Color.LightForeground) + W = Max(W, hLabel.Font.TextWidth(hLabel.Text)) + Next + + For Each hLabel In panProperty.Children + If hLabel.Expand Then Continue + hLabel.W = W + Desktop.Scale * 3 + Next + + lblName.Text = File.Name($sPath) + If Me Is Window Then Me.Title = Subst(("&1 properties"), lblName.Text) + +End + +' Public Sub Form_Open() +' +' Me.Title = Subst(("&1 properties"), File.Name($sPath)) +' +' End + +Public Sub btnOK_Click() + + Me.Close + +End + +Private Sub UpdateSize(Optional sDirSize As String) + + Dim sSize As String + Dim aDirSize As String[] + Dim nDir, nFile As Integer + + If sDirSize Then + aDirSize = Split(sDirSize, " ") + Try $iSize = CLong(aDirSize[0]) + If Error Then Return + Try nFile = CInt(aDirSize[1]) + Try nDir = CInt(aDirSize[2]) + Endif + + sSize = Main.GetFileSize($iSize) + If $iSize >= 1000 Then sSize &= " (" & Subst(("&1 B"), Format($iSize, "#,###")) & ")" + + If sDirSize Then + sSize &= "\n" + If nFile = 0 Then + sSize &= ("no file") + Else If nFile = 1 + sSize &= ("one file") + Else + sSize &= Format(nFile, ",#") & " " & ("files") + Endif + sSize &= ", " + If nDir = 0 Then + sSize &= ("no directory") + Else If nDir = 1 + sSize &= ("one directory") + Else + sSize &= Format(nDir, ",#") & " " & ("directories") + Endif + lblSize.H = Desktop.Scale * 6 + Endif + + lblSize.Text = sSize + +End + +Public Sub Form_Close() + + $bIgnoreNextTaskError = True + Try $hTask.Stop + +End + +Public Sub Task_Read(sData As String) + + UpdateSize(Trim(sData)) + lblSize.Foreground = Color.LightForeground + +End + +Private Sub ShowError(Optional sErr As String) + + If $bIgnoreNextTaskError Then + $bIgnoreNextTaskError = False + Return + Endif + If sErr Then $sError &= sErr & "\n" + tabInfo[TAB_ERROR].Visible = True + txtError.Text = $sError + +End + +Public Sub Task_Error(Data As String) + + ShowError(RTrim(Data)) + +End + + +Public Sub Task_Kill() + + Try UpdateSize(Last.Value) + If Error Then ShowError(Error.Text) + lblSize.Foreground = Color.Default + +End + +Public Sub Add(hPanel As Control, sTitle As String) As Integer + + Dim I As Integer = tabInfo.Index + Dim N As Integer = tabInfo.Count + + Object.Lock(tabInfo) + Inc tabInfo.Count + tabInfo[N].Text = sTitle + tabInfo.Index = N + hPanel.Reparent(tabInfo) + HPanel.Expand = True + hPanel.Show + tabInfo.Index = I + Object.Unlock(tabInfo) + Return tabInfo.Count - 1 + +End + +Public Sub Form_Arrange() + + Dim D As Integer + + If btnClose.Visible Then + D = Desktop.Scale + If Me.Margin Then D += Desktop.Scale + btnClose.Move(Me.ClientW - btnClose.W - D, Me.ClientH - btnClose.H - D) + Endif + +End + +Public Sub btnClose_Click() + + Me.Close + +End + +Public Sub GetBorder() As Boolean + + Return tabInfo.Border + +End + +Public Sub SetBorder(bBorder As Boolean) + + tabInfo.Border = bBorder + +End + + +Public Sub _new() + + panIcon.H = 64 + Desktop.Scale * 2 + picIcon.Resize(64, 64) + tabInfo[TAB_IMAGE_PREVIEW].Visible = False + tabInfo[TAB_MEDIA_PREVIEW].Visible = False + tabInfo[TAB_ERROR].Visible = False + $bMedia = Component.IsLoaded("gb.media") + +End + +Public Sub tabInfo_Click() + + Dim hParent As FileProperties = Me.Parent + + If tabInfo.Index = TAB_IMAGE_PREVIEW Then + + If Not $bPreview Then + + $bPreview = True + + $hPreview = Image.Load($sPath) + imvPreview.Image = $hPreview + If Not btnZoomFit.Value Then + btnZoomFit.Value = True + Else + btnZoomFit_Click + Endif + + Endif + + Else If tabInfo.Index = TAB_MEDIA_PREVIEW Then + + If Not $bPreview Then + + $bPreview = True + + If Not $hViewer Then + Component.Load("gb.media.form") + $hViewer = New MediaView(tabInfo) + $hViewer.Expand = True + $hViewer.Border = False + $hViewer.Lower + Endif + + $hViewer.URL = $sPath + $hViewer.Play + + panMediaClose.Raise + + Endif + + Endif + + If hParent Then hParent._RaiseClick() + +Catch + + ShowError(Error.Text) + +End + +Private Sub UpdateLabel() + + lblSizePreview.Text = CStr($hPreview.W) & " × " & CStr($hPreview.H) & " (" & Format(imvPreview.Zoom, "0%") & ")" + +End + +Public Sub sldZoom_Change() + + imvPreview.Zoom = 2 ^ (sldZoom.Value / 4) + UpdateLabel + +End + +Public Sub btnZoomNormal_Click() + + btnZoomFit.Value = False + sldZoom.Value = 0 + imvPreview.Zoom = 1 + UpdateLabel + +End + +Public Sub btnZoomIn_Click() + + If Not sldZoom.Enabled Then + btnZoomNormal_Click + Else + sldZoom.Value += 4 + Endif + +End + +Public Sub btnZoomOut_Click() + + If Not sldZoom.Enabled Then + btnZoomNormal_Click + Else + sldZoom.Value -= 4 + Endif + +End + +Public Sub btnZoomFit_Click() + + If btnZoomFit.Value Then + imvPreview.ZoomFit + UpdateLabel + sldZoom.Enabled = False + Else + sldZoom.Enabled = True + sldZoom_Change + Endif + +End + +Public Sub imvPreview_Arrange() + + If tabInfo.Index = TAB_IMAGE_PREVIEW Then + If btnZoomFit.Value Then btnZoomFit_Click + Endif + +End + +Public Sub GetIndex() As Integer + + Return tabInfo.Index + +End + +Public Sub SetIndex(Value As Integer) As Integer + + tabInfo.Index = Value + +End diff --git a/comp/src/gb.form/.src/File/Properties/FFileProperties.form b/comp/src/gb.form/.src/File/Properties/FFileProperties.form new file mode 100644 index 00000000..28b9beff --- /dev/null +++ b/comp/src/gb.form/.src/File/Properties/FFileProperties.form @@ -0,0 +1,198 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,55,56) + Arrangement = Arrange.Vertical + { tabInfo TabPanel + MoveScaled(1,1,52,51) + Expand = True + Arrangement = Arrange.Vertical + Count = 4 + Index = 0 + Text = ("General") + { panIcon HBox + MoveScaled(0,0,48,10) + Spacing = True + Margin = True + { picIcon PictureBox + MoveScaled(3,1,10,8) + AutoResize = True + Picture = Picture["icon:/64/file"] + } + { lblName TextLabel + MoveScaled(19,1,26,4) + Font = Font["Bold"] + Expand = True + Alignment = Align.Normal + } + } + { panProperty Panel + MoveScaled(0,12,50,34) + Expand = True + Arrangement = Arrange.Row + Margin = True + { lblLabelType Label + MoveScaled(1,1,18,4) + Text = ("Type") + Alignment = Align.TopNormal + } + { lblType Label + MoveScaled(22,1,26,4) + Expand = True + Alignment = Align.TopNormal + } + { lblLabelLink Label + MoveScaled(1,5,18,4) + Visible = False + Text = ("Link") + Alignment = Align.TopNormal + } + { lblLink Label + MoveScaled(22,5,26,4) + Visible = False + Font = Font["Italic"] + Expand = True + Alignment = Align.TopNormal + } + { Label3 Label + MoveScaled(1,9,18,4) + Text = ("Directory") + Alignment = Align.TopNormal + } + { lblDir Label + MoveScaled(22,9,26,4) + Expand = True + Alignment = Align.TopNormal + } + { Label4 Label + MoveScaled(1,13,18,4) + Text = ("Size") + Alignment = Align.TopNormal + } + { lblSize Label + MoveScaled(22,13,26,4) + Expand = True + Alignment = Align.TopNormal + } + { Label5 Label + MoveScaled(1,17,18,4) + Text = ("Last modified") + Alignment = Align.TopNormal + } + { lblLastModified Label + MoveScaled(22,17,26,4) + Expand = True + Alignment = Align.TopNormal + } + { Label6 Label + MoveScaled(1,21,18,4) + Text = ("Permissions") + Alignment = Align.TopNormal + } + { lblAuth Label + MoveScaled(22,21,26,4) + Font = Font["Monospace"] + Expand = True + Alignment = Align.TopNormal + } + { Label7 Label + MoveScaled(1,25,18,4) + Text = ("Owner") + Alignment = Align.TopNormal + } + { lblUser Label + MoveScaled(22,25,26,4) + Expand = True + Alignment = Align.TopNormal + } + { Label8 Label + MoveScaled(1,29,18,4) + Text = ("Group") + Alignment = Align.TopNormal + } + { lblGroup Label + MoveScaled(22,29,26,4) + Expand = True + Alignment = Align.TopNormal + } + } + Index = 1 + Text = ("Preview") + { HBox2 HBox + MoveScaled(1,1,49,4) + { sldZoom Slider + MoveScaled(0,0,8,4) + Expand = True + MinValue = -16 + MaxValue = 16 + Step = 10 + } + { btnZoomNormal ToolButton + MoveScaled(28,0,4,4) + Picture = Picture["icon:/small/zoom-normal"] + } + { btnZoomIn ToolButton + MoveScaled(32,0,4,4) + Picture = Picture["icon:/small/zoom-in"] + } + { btnZoomOut ToolButton + MoveScaled(36,0,4,4) + Picture = Picture["icon:/small/zoom-out"] + } + { btnZoomFit ToolButton + MoveScaled(40,0,4,4) + Picture = Picture["icon:/small/zoom-fit"] + Toggle = True + } + } + { Separator4 Separator + MoveScaled(21,6,17,0) + } + { imvPreview ImageView + MoveScaled(7,7,38,26) + Expand = True + Border = False + } + { HBox1 HBox + MoveScaled(1,36,50,6) + Margin = True + { lblSizePreview Label + MoveScaled(1,1,21,3) + } + } + Index = 2 + Text = ("Preview") + { panMediaClose VBox + MoveScaled(12,35,37,6) + Visible = False + { Separator3 Separator + MoveScaled(12,1,21,0) + } + } + Index = 3 + Text = ("Errors") + Picture = Picture["icon:/small/warning"] + { txtError TextArea + MoveScaled(3,6,16,16) + Font = Font["Monospace,-1"] + Expand = True + ReadOnly = True + Border = False + } + { Separator2 Separator + MoveScaled(15,30,15,0) + } + { Panel1 Panel + MoveScaled(10,33,4,6) + } + Index = 0 + } + { btnClose Button + MoveScaled(39,1,17,4) + Visible = False + Ignore = True + Text = ("Close") + Default = True + Cancel = True + } +} diff --git a/comp/src/gb.form/.src/File/Properties/FileProperties.class b/comp/src/gb.form/.src/File/Properties/FileProperties.class new file mode 100644 index 00000000..d953597a --- /dev/null +++ b/comp/src/gb.form/.src/File/Properties/FileProperties.class @@ -0,0 +1,98 @@ +' Gambas class file + +Export +Inherits UserControl + +Public Const _Properties As String = "*,Border=True" +Public Const _DefaultSize As String = "36,36" +Public Const _Group As String = "View" + +Event Data +Event Click + +Property Path As String +Property Border As Boolean +Property Read Data As _FilePropertiesData + +Property Index As Integer + + +Private frmDialog As FFileProperties +Private $hData As _FilePropertiesData + +Public Sub _new() + + frmDialog = New FFileProperties(Me) + 'Object.Attach(frmDialog, Me, "frmDialog") + +End + +Private Function Path_Read() As String + + Return frmDialog.GetPath() + +End + +Private Sub Path_Write(Value As String) + + frmDialog.SetPath(Value) + +End + +Public Sub Add((Panel) As Control, Title As String) As Integer + + Return frmDialog.Add(Panel, Title) + +End + + +Private Function Border_Read() As Boolean + + Return frmDialog.GetBorder() + +End + +Private Sub Border_Write(Value As Boolean) + + frmDialog.SetBorder(Value) + +End + +Private Function Data_Read() As _FilePropertiesData + + If Not $hData Then Error.Raise("Data property unavailable") + Return $hData + +End + +Public Sub _RaiseData() As _FilePropertiesData + + Dim bCancel As Boolean + + If Not Object.CanRaise(Me, "Data") Then Return + + $hData = New _FilePropertiesData + bCancel = Raise Data + If bCancel Then Return + + Return $hData + +End + +Public Sub _RaiseClick() + + Raise Click + +End + +Private Function Index_Read() As Integer + + Return frmDialog.GetIndex() + +End + +Private Sub Index_Write(Value As Integer) + + frmDialog.SetIndex(Value) + +End diff --git a/comp/src/gb.form/.src/File/Properties/_FilePropertiesData.class b/comp/src/gb.form/.src/File/Properties/_FilePropertiesData.class new file mode 100644 index 00000000..3c8eefe1 --- /dev/null +++ b/comp/src/gb.form/.src/File/Properties/_FilePropertiesData.class @@ -0,0 +1,6 @@ +' Gambas class file + +Export + +Public Type As String +Public Icon As Picture diff --git a/comp/src/gb.form/.src/FileCompletion.class b/comp/src/gb.form/.src/FileCompletion.class new file mode 100644 index 00000000..1110e9a0 --- /dev/null +++ b/comp/src/gb.form/.src/FileCompletion.class @@ -0,0 +1,42 @@ +' Gambas class file + +Export +Inherits Completion + +Public Sub _new() + + Me.Delay = 50 + +End + + +Public Sub Fill(Text As String, (Explicit) As Boolean) + + Dim sDir As String + Dim iPos As Integer + Dim sStart As String + Dim I As Integer + + sDir = Text + + If sDir And If Left(sDir) <> "/" And If sDir Not Begins "~/" Then Return + + iPos = RInStr(sDir, "/") + sStart = Mid$(sDir, iPos + 1) + sDir = Left(sDir, iPos) + If Not IsDir(sDir) Then Return + + Me.List = Dir(sDir, sStart & "*").Sort(gb.IgnoreCase + gb.Natural) + Me.Start = String.Len(sDir) + + Me.Icons = New String[Me.List.Count] + For I = 0 To Me.List.Max + If IsDir(sDir &/ Me.List[I]) Then + Me.Icons[I] = "icon:/16/directory" + Else + Me.Icons[I] = "icon:/16/file" + Endif + Next + +End + diff --git a/comp/src/gb.form/.src/Font/FFontChooser.class b/comp/src/gb.form/.src/Font/FFontChooser.class new file mode 100644 index 00000000..c15c3f68 --- /dev/null +++ b/comp/src/gb.form/.src/Font/FFontChooser.class @@ -0,0 +1,574 @@ +' Gambas class file + +Public Family As String +Public Bold As Boolean +Public Italic As Boolean +Public Underline As Boolean +Public Strikeout As Boolean +Public Size As Integer +Public Grade As Integer +Public ShowFixed As Boolean + +Public StylePanel As Container +Public Preview As Control + +Private $iNoChange As Integer +Private $bNoRefresh As Boolean +Private $sLast As String +Private $bShowLabel As Boolean + +Private $sSplitFont As String +Private $aSplitFont As String[] + +Public Sub _new() + + Inc $iNoChange + $bNoRefresh = True + + 'lstSize.List = ["6", "7", "8", "9", "10", "11", "12", "13", "14", "16", "18", "20", "24", "28", "32", "36", "40", "48", "56", "64", "72", "80", "96", "112", "128"] + + StylePanel = panStyle + Preview = txtExample + + SetFont("") + +End + + +Public Sub Form_Open() + + $bNoRefresh = False + RefreshFamily + UpdateRelative + txtSize_Change + Dec $iNoChange + +End + +' Private Sub RefreshGrade() +' +' Dim iInd As Integer +' Dim H As Integer +' Dim hFont As Font +' Dim sGrade As String +' +' If $bNoRefresh Then Return +' If chkSize.Value Then Return +' +' Inc Application.Busy +' +' For iInd = 0 To NBR_GRADE - 1 +' sGrade = Trim(Format(FIRST_GRADE + iInd, "+#")) +' hFont = Font[GetFont(sGrade)] +' H = hFont.Height + 4 +' With $hGrade[iInd] +' .Font = hFont +' .Height = H +' .Text = " " & sGrade & " " & Family +' .Tag = FIRST_GRADE + iInd +' If .Tag = Grade Then +' lstGrade.Select($hGrade[iInd]) +' Endif +' End With +' Next +' +' Dec Application.Busy +' +' End + +Private Sub SplitFont(sFont As String, N As Integer) As String + + Dim I As Integer + Dim sCar As String + + If sFont <> $sSplitFont Then + $sSplitFont = sFont + $aSplitFont = New String[] + + sFont = " " & sFont & " " + While Len(sFont) > 1 + For I = 2 To Len(sFont) + sCar = Mid$(sFont, I, 1) + If IsPunct(sCar) Or If IsSpace(sCar) Then Goto SPLIT_FONT + If IsUCase(sCar) Then + sCar = Mid$(sFont, I - 1, 1) + If IsPunct(sCar) Or If IsSpace(sCar) Or IsUCase(sCar) Then Continue + If Not IsLetter(Mid(sFont, I + 1, 1)) Then Continue + Goto SPLIT_FONT + Endif + Continue + + SPLIT_FONT: + $aSplitFont.Add(Left$(sFont, I - 1)) + sFont = Mid$(sFont, I) + Break + + Next + Wend + + Endif + + If N <= $aSplitFont.Count Then Return Trim($aSplitFont.Copy(0, N - 1).Join("")) + + ' For I = 1 To Len(sFont) + ' sCar = Mid$(sFont, I, 1) + ' If IsUCase(sCar) Or If IsPunct(sCar) Or If sCar = " " Then + ' If S Then + ' If (I - S) >= 2 Or If sCar = " " Or If IsPunct(sCar) Then + ' Dec N + ' If N = 0 Then Return RTrim(Left$(sFont, I - 1)) + ' Endif + ' Endif + ' S = I + ' Endif + ' Next + +End + +Private Sub FillFamily() + + Dim sFont As String + Dim cFont As Collection + Dim aFont As String[] + Dim I As Integer + Dim sParentFont As String + Dim hParent As Menu + Dim iCount As Variant + Dim cParent As New Collection + + tvwFamily.Clear + + cFont = New Collection + aFont = New String[] + + For Each sFont In Fonts + + If ShowFixed Then + If Not Font[sFont].Fixed Then Continue + Endif + + For I = 16 DownTo 1 + sParentFont = SplitFont(sFont, I) + If Not sParentFont Then Continue + If Not cFont.Exist(sParentFont) Then + cFont[sParentFont] = 0 + aFont.Add(sParentFont) + Else + Inc cFont[sParentFont] + Break + Endif + Next + + cFont[sFont] = 1000 + aFont.Add(sFont) + + Next + + aFont.Sort(gb.Natural + gb.IgnoreCase) + ' For Each sFont In aFont + ' Print cFont[sFont];; sFont + ' Next + + For Each sFont In aFont + + iCount = cFont[sFont] + If iCount = 0 Then Continue + + hParent = Null + For I = 16 DownTo 1 + sParentFont = SplitFont(sFont, I) + If Not sParentFont Then Continue + If cParent.Exist(sParentFont) Then Break + sParentFont = "" + Next + + If sParentFont And If tvwFamily[sParentFont].Children = 0 Then + tvwFamily[sParentFont].Foreground = Color.LightForeground + If cFont[sParentFont] >= 1000 Then + tvwFamily.Add("." & sParentFont, sParentFont,, sParentFont) + Endif + Endif + + tvwFamily.Add(sFont, sFont,, sParentFont) + cParent[sFont] = True + + Next + +End + + +Public Sub RefreshFamily() + + Dim hFont As Font + Dim sFamily As String + Dim sKey As String + Dim bExist As Boolean + + If $bNoRefresh Then Return + + sKey = Family 'lstFamily.Current.Key + + Inc $iNoChange + + If tvwFamily.Visible Then + + FillFamily + + Try tvwFamily[sKey].Selected = True + If Error Then + tvwFamily.MoveFirst + tvwFamily.Item.Selected = True + Endif + + Family = tvwFamily.Key + Try tvwFamily.Current.EnsureVisible + + Else + + cmbFamily.Clear + + For Each sFamily In Fonts + hFont = Font[sFamily] + If ShowFixed And Not hFont.Fixed Then Continue + cmbFamily.Add(sFamily) + If sFamily = sKey Then bExist = True + Next + + If bExist Then + cmbFamily.Text = sKey + Else + cmbFamily.Index = 0 + Endif + + Family = cmbFamily.Text + + Endif + + Dec $iNoChange + + RefreshExample + +End + + +Public Sub SetFont(sFont As String) + + Dim hFont As Font = Font[sFont] + Dim bRelative As Boolean + Dim sElt As String + + bRelative = True + + For Each sElt In Split(sFont, ",") + sElt = Trim(sElt) + If InStr("0+-", Left(sElt)) = 0 And If IsDigit(Left(sElt)) Then + bRelative = False + Break + Endif + Next + + Family = hFont.Name + Bold = hFont.Bold + Italic = hFont.Italic + Underline = hFont.Underline + StrikeOut = hFont.StrikeOut + Size = hFont.Size + Grade = hFont.Grade + + btnRelative.Value = bRelative + + Try tvwFamily[Family].Selected = True + Try tvwFamily[Family].EnsureVisible + + btnBold.Value = Bold + btnItalic.Value = Italic + btnUnderline.Value = Underline + btnStrikeout.Value = StrikeOut + + 'chkUnderline.Value = UnderLine + 'chkStrikeout.Value = StrikeOut + + If bRelative Then + txtSize.Value = Grade + Else + txtSize.Value = Size + Endif + + txtExample.Text = ("How quickly daft jumping zebras vex") & "\n0123456789 àéîöùÀÉÎÖÙ" + + RefreshExample + +End + +Public Function GetFont() As String + + Dim sFont As String + + sFont = Family + If Bold Then sFont &= ",Bold" + If Italic Then sFont &= ",Italic" + If Underline Then sFont &= ",Underline" + If Strikeout Then sFont &= ",Strikeout" + If btnRelative.Value Then + If Grade Then sFont &= "," & Trim(Format(Grade, "+#")) + Else + sFont &= "," & Size + Endif + + Return sFont + +End + + +Private Sub GetParent() As Object + + Return Me.Parent + +End + + +Private Sub RefreshExample() + + Dim sFont As String = GetFont() + + If $bNoRefresh Then Return + + If sFont = $sLast And If txtExample.Expand = cmbFamily.Visible Then Return + + If txtExample.Visible Then + txtExample.Font = Font[GetFont()] + txtExample.H = Max(Desktop.Scale * 4, Min(Desktop.Scale * 16, txtExample.Font.Size * 5)) + txtExample.Expand = cmbFamily.Visible + Endif + + Size = Font[sFont].Size + Grade = Font[sFont].Grade + + sldSize.Value = txtSize.Value + + If $iNoChange = 0 Then GetParent()._Change + If Not txtExample.Visible Then GetParent()._Activate + + $sLast = sFont + + lblFont.Text = sFont + +End + +Public Sub tvwFamily_Click() + + If Not tvwFamily.Current Then Return + + If tvwFamily.Current.Children Then + Return + Endif + + Family = tvwFamily.Key + If Family Begins "." Then Family = Mid$(Family, 2) + RefreshExample + +End + +Public Sub cmbFamily_Click() + + Family = cmbFamily.Text + RefreshExample + +End + +Public Sub btnBold_Click() + + Bold = btnBold.Value + RefreshExample + +End + +Public Sub btnItalic_Click() + + Italic = btnItalic.Value + RefreshExample + +End + + +Public Sub txtSize_Change() + + If btnRelative.Value Then + Grade = txtSize.Value + Else + Size = txtSize.Value + Endif + sldSize.Value = txtSize.Value + RefreshExample + +End + + +Public Sub lstFamily_DblClick() + + GetParent()._Activate + +End + +Private Sub UpdateRelative() + + Object.Lock(txtSize) + Object.Lock(sldSize) + If btnRelative.Value Then + txtSize.MinValue = -8 + txtSize.MaxValue = 24 + txtSize.Value = Grade + sldSize.PageStep = 1 + Else + txtSize.MinValue = 1 + txtSize.MaxValue = 256 + txtSize.Value = Size + sldSize.PageStep = 4 + Endif + + sldSize.MinValue = txtSize.MinValue + sldSize.MaxValue = txtSize.MaxValue + + Object.Unlock(txtSize) + Object.Unlock(sldSize) + txtSize_Change + +End + +Public Sub btnRelative_Click() + + UpdateRelative + txtSize.SetFocus + +End + + +' Public Sub chkUnderline_Click() +' +' Underline = chkUnderline.Value +' RefreshExample +' +' End +' +' +' Public Sub chkStrikeout_Click() +' +' Strikeout = chkStrikeout.Value +' RefreshExample +' +' End + + +Public Sub SetShowLabel(bVisible As Boolean) + + ' lblFamily.Visible = bVisible + ' lblSize.Visible = bVisible + ' lblStyle.Visible = bVisible + $bShowLabel = bVisible + +End + +Public Sub IsShowLabel() As Boolean + + Return $bShowLabel + +End + + +Public Sub sldSize_Change() + + txtSize.Value = sldSize.Value + +End + +Public Sub panFont_Arrange() + + If (panFont.W - txtSize.W - txtSize.X) < 64 Then + sldSize.Hide + Else + sldSize.Show + Endif + +End + +Public Sub HasBorder() As Boolean + + Return panBorder.Border + +End + +Public Sub SetBorder(bBorder As Boolean) + + panBorder.Border = If(bBorder, Border.Plain, Border.None) + +End + + +Public Sub btnUnderline_Click() + + Underline = btnUnderline.Value + RefreshExample + +End + +Public Sub btnStrikeout_Click() + + Strikeout = btnStrikeout.Value + RefreshExample + +End + +Public Sub panBorder_BeforeArrange() + + If panBorder.H < (Desktop.Scale * 20) Then + + If txtExample.Visible Then + tvwFamily.Hide + sepFamily.Hide + lblFont.Hide + sepToolbar.Hide + cmbFamily.Show + cmbFamily.Lower + RefreshFamily + Endif + + If panBorder.H < (Desktop.Scale * 14) Then + txtExample.Hide + sepExample.Hide + Else + txtExample.Show + sepExample.Show + Endif + + Else + + If cmbFamily.Visible Then + cmbFamily.Hide + txtExample.Show + sepExample.Show + tvwFamily.Show + sepFamily.Show + lblFont.Show + sepToolbar.Show + lblFont.Lower + RefreshFamily + Endif + + Endif + + RefreshExample + +End + +Public Sub SetShowRelative(bRelative As Boolean) + + btnRelative.Visible = bRelative + If Not bRelative Then btnRelative.Value = False + +End + +Public Sub GetShowRelative() As Boolean + + Return btnRelative.Visible + +End diff --git a/comp/src/gb.form/.src/Font/FFontChooser.form b/comp/src/gb.form/.src/Font/FFontChooser.form new file mode 100644 index 00000000..e0d6ad5a --- /dev/null +++ b/comp/src/gb.form/.src/Font/FFontChooser.form @@ -0,0 +1,88 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,80,65) + Arrangement = Arrange.Fill + { panBorder Panel + MoveScaled(1,3,77,58) + Arrangement = Arrange.Vertical + Border = Border.Plain + { cmbFamily ComboBox + MoveScaled(40,1,27,4) + Visible = False + ReadOnly = True + } + { lblFont Label + MoveScaled(3,1,32,4) + Padding = 4 + } + { sepToolbar Separator + MoveScaled(3,7,35,0) + } + { panFont HBox + MoveScaled(3,8,71,4) + { panStyle HBox + MoveScaled(0,0,16,4) + { btnBold ToolButton + MoveScaled(0,0,4,4) + ToolTip = ("Bold") + Picture = Picture["icon:/small/text-bold"] + Toggle = True + } + { btnItalic ToolButton + MoveScaled(4,0,4,4) + ToolTip = ("Italic") + Picture = Picture["icon:/small/text-italic"] + Toggle = True + } + { btnUnderline ToolButton + MoveScaled(8,0,4,4) + ToolTip = ("Underline") + Picture = Picture["icon:/small/text-underline"] + Toggle = True + } + { btnStrikeout ToolButton + MoveScaled(12,0,4,4) + ToolTip = ("Strikeout") + Picture = Picture["icon:/small/text-strike"] + Toggle = True + } + } + { btnRelative CheckBox + MoveScaled(17,0,11,4) + AutoResize = True + Text = ("Relative") + } + { Panel1 Panel + MoveScaled(29,0,1,4) + } + { txtSize SpinBox + MoveScaled(31,0,7,4) + Background = Color.Background + Border = False + } + { sldSize Slider + MoveScaled(42,0,28,4) + Expand = True + } + } + { sepFamily Separator + MoveScaled(17,14,35,0) + } + { tvwFamily TreeView + MoveScaled(5,16,66,14) + Expand = True + Border = False + ScrollBar = Scroll.Vertical + } + { sepExample Separator + MoveScaled(16,34,35,0) + } + { txtExample Label + MoveScaled(6,37,62,8) + Background = Color.TextBackground + Foreground = Color.TextForeground + Alignment = Align.Center + } + } +} diff --git a/comp/src/gb.form/.src/Font/FontBox.class b/comp/src/gb.form/.src/Font/FontBox.class new file mode 100644 index 00000000..ac9ca841 --- /dev/null +++ b/comp/src/gb.form/.src/Font/FontBox.class @@ -0,0 +1,114 @@ +' Gambas class file + +Export +Inherits UserControl + +Public Const _Properties As String = "*,Action,Border=True" +Public Const _DefaultEvent As String = "Click" +Public Const _DefaultSize As String = "32,4" +Public Const _Similar As String = "TextBox" +Public Const _Group As String = "Chooser" + +Event Click +Event Change + +Property Value As String +Property Border As Boolean +Property Default As String + +Private $hButtonBox As ButtonBox +Private $bDefault As Boolean +Private $sDefault As String + +Public Sub _new() + + $sDefault = Application.Font.ToString() + + $hButtonBox = New ButtonBox(Me) As "ButtonBox" + Me.Proxy = $hButtonBox + $hButtonBox.Picture = Picture["icon:/small/font"] + $hButtonBox.ReadOnly = True + $hButtonBox.ClearButton = True + + UpdateFont("", True) + +End + +Private Function Border_Read() As Boolean + + Return $hButtonBox.Border + +End + +Private Sub Border_Write(Value As Boolean) + + $hButtonBox.Border = Value + +End + +Private Function Value_Read() As String + + If $bDefault Then Return + Return $hButtonBox.Text + +End + +Private Sub UpdateFont(sFont As String, Optional bForce As Boolean) + + If sFont = Value_Read() And If Not bForce Then Return + If Not sFont Then + $hButtonBox.Text = $sDefault + $hButtonBox.Foreground = Color.LightForeground + $bDefault = True + Else + $hButtonBox.Text = sFont + $hButtonBox.Foreground = Color.Foreground + $bDefault = False + Endif + Raise Change + +End + +Private Sub Value_Write(Value As String) + + UpdateFont(Value) + +End + +Public Sub ButtonBox_Click() + + Dialog.Font = Font[$hButtonBox.Text] + If Dialog.SelectFont() Then Return + + UpdateFont(Dialog.Font.ToString()) + Raise Click + +End + +Public Sub ButtonBox_Clear() + + UpdateFont("", True) + Raise Click + +End + +Public Sub ButtonBox_KeyPress() + + If Key.Code = Key.Delete Or Key.Code = Key.Backspace Then + UpdateFont("") + Endif + +End + +Private Function Default_Read() As String + + Return $sDefault + +End + +Private Sub Default_Write(Value As String) + + $sDefault = Value + If $bDefault Then $hButtonBox.Text = $sDefault + +End diff --git a/comp/src/gb.form/.src/Font/FontChooser.class b/comp/src/gb.form/.src/Font/FontChooser.class new file mode 100644 index 00000000..c28edda5 --- /dev/null +++ b/comp/src/gb.form/.src/Font/FontChooser.class @@ -0,0 +1,153 @@ +' Gambas class file + +Export +Inherits UserControl + +Event Change +Event Activate + +Public Const _Properties As String = "*,Border=True,FixedOnly,ShowStyle=True,ShowPreview=True,ShowRelative=True" +Public Const _DefaultEvent As String = "Change" +Public Const _DefaultSize As String = "36,36" +Public Const _Group As String = "Chooser" + +Property SelectedFont As String +Property Value As String +Property FixedOnly As Boolean +Property ShowStyle As Boolean +Property ShowPreview As Boolean +Property ShowLabel As Boolean '' Deprecated +Property ShowRelative As Boolean +Property Border As Boolean + +Private frmChooser As FFontChooser + +Public Sub _new() + + frmChooser = New FFontChooser(Me) + 'Object.Attach(frmChooser, ME, "frmChooser") + +End + +Public Sub _Change() + + Raise Change + +End + +' PUBLIC SUB frmChooser_Open() +' +' frmChooser.Form_Open +' +' END +' +' PUBLIC SUB frmChooser_Resize() +' +' frmChooser.Form_Resize +' +' END + + +Private Function SelectedFont_Read() As String + + Return frmChooser.GetFont() + +End + +Private Sub SelectedFont_Write(sFont As String) + + frmChooser.SetFont(sFont) + +End + +Public Sub _Activate() + + Raise Activate + +End + + +Private Function FixedOnly_Read() As Boolean + + Return frmChooser.ShowFixed + +End + +Private Sub FixedOnly_Write(bFixedOnly As Boolean) + + frmChooser.ShowFixed = bFixedOnly + frmChooser.RefreshFamily + +End + +Private Function ShowStyle_Read() As Boolean + + Return frmChooser.StylePanel.Visible + +End + +Private Sub ShowStyle_Write(Value As Boolean) + + frmChooser.StylePanel.Visible = Value + +End + +Private Function Value_Read() As String + + Return frmChooser.GetFont() + +End + +Private Sub Value_Write(Value As String) + + frmChooser.SetFont(Value) + +End + +Private Function ShowPreview_Read() As Boolean + + Return frmChooser.Preview.Visible + +End + +Private Sub ShowPreview_Write(Value As Boolean) + + frmChooser.Preview.Visible = Value + +End + +Private Function ShowLabel_Read() As Boolean + + Return frmChooser.IsShowLabel() + +End + +Private Sub ShowLabel_Write(Value As Boolean) + + frmChooser.SetShowLabel(Value) + +End + +Private Function Border_Read() As Boolean + + Return frmChooser.HasBorder() + +End + +Private Sub Border_Write(Value As Boolean) + + frmChooser.SetBorder(Value) + +End + +Private Function ShowRelative_Read() As Boolean + + Return frmChooser.GetShowRelative() + +End + +Private Sub ShowRelative_Write(Value As Boolean) + + frmChooser.SetShowRelative(Value) + +End diff --git a/comp/src/gb.form/.src/Help.module b/comp/src/gb.form/.src/Help.module new file mode 100644 index 00000000..bb2022b7 --- /dev/null +++ b/comp/src/gb.form/.src/Help.module @@ -0,0 +1,74 @@ +' Gambas module file + + +Public Sub GotoNext(hCtrl As Control, Optional bSelect As Boolean) + + Dim hTextBox As TextBox + + hCtrl = hCtrl.Next + If hCtrl And If Object.Type(hCtrl) <> "TextBox" Then + hCtrl = hCtrl.Next + Endif + + If hCtrl Then + hTextBox = hCtrl + hCtrl.SetFocus + hCtrl.Pos = 0 + If bSelect Then hCtrl.SelectAll + Endif + +End + + +Public Sub GotoPrevious(hCtrl As Control, Optional bSelect As Boolean) + + Dim hTextBox As TextBox + + hCtrl = hCtrl.Previous + If hCtrl And If Object.Type(hCtrl) <> "TextBox" Then + hCtrl = hCtrl.Previous + Endif + + If hCtrl Then + hTextBox = hCtrl + hCtrl.SetFocus + hCtrl.Pos = hCtrl.Length + If bSelect Then hCtrl.SelectAll + Endif + +End + +Public Sub ManageKeyPress(sCar As String, aTextBox As Object[]) + + Dim hLast As TextBox = Last + + If Asc(Key.Text) >= 32 And Asc(Key.Text) < 127 Then + If Not IsDigit(Key.Text) Then + If InStr(sCar, Key.Text) Then + Help.GotoNext(Last) + Endif + Stop Event + Return + Endif + Else If Key.Code = Key.Home Then + aTextBox[0].SelectAll + aTextBox[0].SetFocus + Stop Event + Else If Key.Code = Key.End Then + aTextBox[2].SelectAll + aTextBox[2].SetFocus + Stop Event + Else If Key.Code = Key.Left Then + If hLast.Pos = 0 Then GotoPrevious(Last) + Else If Key.Code = Key.Right Then + If hLast.Pos = hLast.Length Then GotoNext(Last) + Endif + +End + +Public Sub CheckFileName(sName As String) As String + + If Not sName Then Return ("A file or directory name cannot be void.") + If InStr(sName, "/") Then Return ("The '/' character is forbidden inside file or directory names.") + +End diff --git a/comp/src/gb.form/.src/IconPanel/IconPanel.class b/comp/src/gb.form/.src/IconPanel/IconPanel.class new file mode 100644 index 00000000..5c4fcbdf --- /dev/null +++ b/comp/src/gb.form/.src/IconPanel/IconPanel.class @@ -0,0 +1,383 @@ +' Gambas class file + +Export +Inherits UserContainer + +Public Const _Properties As String = "*,Count{Range:1;256}=1,Index,Text,TextFont,Picture,Border" +Public Const _Similar As String = "TabStrip" +Public Const _IsMultiContainer As Boolean = True +Public Const _DefaultEvent As String = "Click" + +Event Click + +Property Count As Integer +Property Index As Integer +Property Text As String +Property Picture As Picture +Property TextFont As Font +Property Border As Boolean + +Private $hView As GridView +Private $aCont As New _IconPanelContainer[] + +Private $iCurrent As Integer = -1 +Private $hPanel As Panel +Private $hBorder As Panel +Private $hSep As Separator + +Private Const MIN_WIDTH_PANEL As Integer = 16 +Private $iIconSize As Integer + +Public Sub _new() + + Me.Spacing = True + + $hBorder = New Panel(Me) + $hBorder.Arrangement = Arrange.Horizontal + + $hView = New GridView($hBorder) As "View" + '$hView.Orientation = Arrange.Horizontal + '$hView.IconLines = 2 + $hView.Width = Desktop.Scale * MIN_WIDTH_PANEL + $hView.Mouse = Mouse.Pointing + $hView.Columns.Count = 1 + $hView.Mode = Select.Single + $hView.Grid = False + $hView.Border = False + '$hView.ScrollBar = Scroll.None + + $hSep = New Separator($hBorder) + $hSep.W = 1 + + 'hSpace = New Panel($hBorder) + 'hSpace.W = Desktop.Scale + + $hPanel = New Panel($hBorder) As "Panel" + $hPanel.Expand = True + $hPanel.Arrangement = Arrange.Fill + + Border_Write(False) + 'Me._Container = $hPanel + Me.Count = 1 + 'Me.Index = 0 + 'Me.Border = True + Me.Arrangement = Arrange.None + Me.Spacing = False + +End + +Private Function Count_Read() As Integer + + Return $aCont.Count + +End + +Public Sub _UpdateIconViewWidth() + + Dim iInd As Integer + Dim W, H, WC As Integer + Dim hPict As Picture + Dim hCont As _IconPanelContainer + + $iIconSize = ((($hView.Font.Height * 3) \ 2 + 7) \ 8) * 8 + + W = Desktop.Scale * MIN_WIDTH_PANEL + + For iInd = 0 To $aCont.Max + + hCont = $aCont[iInd] + + WC = $hView.Font.TextWidth(hCont.Text) + Desktop.Scale * 4 + hPict = hCont.Picture + + If hPict Then WC += $iIconSize * Max(1, hPict.Width / hPict.Height) + Desktop.Scale + W = Max(W, WC) + + H = Max(H, $hView.Font.TextHeight(hCont.Text)) + If hPict Then H = Max(H, $iIconSize) + + Next + + $hView.Rows.H = H + Desktop.Scale * 2 + + If $hView.ScrollH > ($hView.ClientH + Style.FrameWidth * 2) Then W += Style.ScrollbarSize + Style.ScrollbarSpacing + + $hView.W = Min(W, Me.Width / 2) + +End + +Public Sub Panel_Arrange() + + _UpdateIconViewWidth() + +End + + +Private Sub Count_Write(iCount As Integer) + + Dim iInd As Integer + Dim hToolbar As _IconPanelContainer + Dim iCurrent As Integer + + If iCount < 1 Then Error.Raise("Bad argument") + If iCount = $aCont.Count Then Return + + If iCount < $aCont.Count Then + + For iInd = $aCont.Max To iCount Step -1 + hToolbar = $aCont[iInd] + If hToolbar.Children.Count Then Error.Raise("IconPanel container is not empty") + Next + + iCurrent = $iCurrent + + Object.Lock(Me) '' FIXME: Interpreter crash if this is removed! + For iInd = $aCont.Max To iCount Step -1 + $aCont[iInd].Delete + $hView.Rows.Remove(iInd) + If iInd <= iCurrent Then Dec iCurrent + Next + Object.Unlock(Me) + + $aCont.Remove(iCount, -1) + + $iCurrent = -1 + Index_Write(iCurrent) + + Else + + $hView.Rows.Count = iCount + + For iInd = $aCont.Count To iCount - 1 + hToolbar = New _IconPanelContainer($hPanel) As "_IconPanelContainer" + hToolbar.Resize(1, 1) + 'hToolbar.Text = "Toolbar " & CInt(iInd) + $aCont.Add(hToolbar) + '$hView.Add(iInd, "Item " & CStr(iInd)) + hToolbar.Text = "Item " & CStr(iInd) + Next + 'ME.Container = hCont + + 'ME.Index = iCount - 1 + Index_Write(iCount - 1) + + Endif + + _UpdateIconViewWidth + +End + +Private Function Index_Read() As Integer + + Return $iCurrent + +End + +Private Sub Index_Write(iIndex As Integer) + + If iIndex < 0 Or iIndex >= $aCont.Count Then Error.Raise("Bad index") + + If iIndex = $iCurrent Then Return + + Me._Container = $aCont[iIndex] + $iCurrent = iIndex + $hView.Rows[$iCurrent].Selected = True + + UpdateContainer + Raise Click + +End + +Private Sub UpdateContainer() + + Dim iInd As Integer + + For iInd = 0 To $aCont.Max + + If iInd = $iCurrent + $aCont[iInd].Show + Else + $aCont[iInd].Hide + Endif + + Next + +End + +Private Function Text_Read() As String + + Return $aCont[$iCurrent].Text + +End + +Private Sub Text_Write(sText As String) + + $aCont[$iCurrent].Text = sText + +End + +Private Function Picture_Read() As Picture + + Return $aCont[$iCurrent].Picture + +End + +Private Sub Picture_Write(hPict As Picture) + + $aCont[$iCurrent].Picture = hPict + +End + +Public Function _get(Index As Integer) As _IconPanelContainer + + If Index < 0 Or Index >= $aCont.Count Then Error.Raise("Bad index") + Return $aCont[Index] + +End + +Public Sub View_Font() + + _UpdateIconViewWidth + +End + +Private Function Border_Read() As Boolean + + Return $hView.Border <> Border.None + +End + +Private Sub Border_Write(bBorder As Boolean) + + $hView.Border = If(bBorder, Border.Plain, Border.None) + $hSep.Visible = Not bBorder + $hBorder.Spacing = bBorder + +End + +Private Function TextFont_Read() As Font + + Return $hView.Font + +End + +Private Sub TextFont_Write(Value As Font) + + $hView.Font = Value + +End + +Public Sub _GetView() As GridView + + Return $hView + +End + +Public Sub _GetIndex(hCont As _IconPanelContainer) As Integer + + Return $aCont.Find(hCont) + +End + +Public Sub View_Select() + + Index_Write($hView.Row) + +End + +Private Sub GotoIndex(iInc As Integer) + + Dim iIndex As Integer + + iIndex = $iCurrent + Do + iIndex += iInc + If iIndex < 0 Or If iIndex > $aCont.Max Then Break + If $aCont[iIndex].Visible Then + Index_Write(iIndex) + Break + Endif + Loop + +End + + +Public Sub View_MouseWheel() + + GotoIndex(-Sgn(Mouse.Delta)) + +End + +Public Sub View_KeyPress() + + If $aCont.Count = 0 Then Return + + Select Case Key.Code + Case Key.Up + GotoIndex(-1) + Stop Event + Case Key.Down + GotoIndex(1) + Stop Event + Case Key.Home + $iCurrent = -1 + GotoIndex(1) + Stop Event + Case Key.End + $iCurrent = $aCont.Count + GotoIndex(-1) + Stop Event + End Select + +End + + +Public Sub _SetVisible(hCont As _IconPanelContainer, bVisible As Boolean) + + Dim iIndex As Integer = _GetIndex(hCont) + Dim bBackward As Boolean + + If bVisible Then + $hView.Rows[iIndex].H = -1 + Else + $hView.Rows[iIndex].H = 0 + Endif + + If Not bVisible And If iIndex = $iCurrent Then + + While Not $aCont[iIndex].Visible + If bBackward Then + Dec iIndex + If iIndex < 0 Then Return + Else + Inc iIndex + If iIndex > $aCont.Max Then + bBackward = True + Endif + Endif + Wend + + Me.Index = iIndex + + Endif + +End + +Public Sub View_Draw(X As Integer, Y As Integer, Width As Integer, Height As Integer, Row As Integer, (Column) As Integer) + + Dim hCont As _IconPanelContainer + + hCont = $aCont[Row] + + X += Desktop.Scale + Width -= Desktop.Scale * 2 + + If hCont.Picture Then + Paint.DrawPicture(hCont.Picture, X, Y + (Height - $iIconSize) \ 2, $iIconSize, $iIconSize) + X += $iIconSize + Desktop.Scale + Width -= $iIconSize + Desktop.Scale + Endif + + Paint.DrawText(hCont.Text, X, Y, Width, Height, Align.Normal) + +End diff --git a/comp/src/gb.form/.src/IconPanel/_IconPanelContainer.class b/comp/src/gb.form/.src/IconPanel/_IconPanelContainer.class new file mode 100644 index 00000000..b5e4adbb --- /dev/null +++ b/comp/src/gb.form/.src/IconPanel/_IconPanelContainer.class @@ -0,0 +1,84 @@ +' Gambas class file + +Export + +Inherits UserControl + +Property Text As String +Property Picture As Picture +Property Read Container As Container +Property Visible As Boolean + +Private $sText As String +Private $hPict As Picture + +Private Sub GetIconPanel() As IconPanel + + Return Me.Parent.Parent.Parent + +End + +Private Sub GetView() As GridView + + Return GetIconPanel()._GetView() + +End + +Private Sub GetIndex() As Integer + + Return GetIconPanel()._GetIndex(Me) + +End + + +Public Sub _new() + +End + + +Private Function Text_Read() As String + + Return $sText + 'Try Return GetView()[GetIndex(), 0].Text + +End + +Private Sub Text_Write(sText As String) + + $sText = sText + GetIconPanel()._UpdateIconViewWidth + GetView()[GetIndex(), 0].Refresh + +End + +Private Function Picture_Read() As Picture + + Return $hPict + +End + +Private Sub Picture_Write(hPict As Picture) + + $hPict = hPict + GetIconPanel()._UpdateIconViewWidth + GetView()[GetIndex(), 0].Refresh + +End + +Private Function Container_Read() As Container + + Return Me + +End + +Private Function Visible_Read() As Boolean + + Return GetView().Rows[GetIndex()].H > 0 + +End + +Private Sub Visible_Write(Value As Boolean) + + GetIconPanel()._SetVisible(Me, Value) + +End diff --git a/comp/src/gb.form/.src/ImageView/ImageView.class b/comp/src/gb.form/.src/ImageView/ImageView.class new file mode 100644 index 00000000..faa4e859 --- /dev/null +++ b/comp/src/gb.form/.src/ImageView/ImageView.class @@ -0,0 +1,415 @@ +' Gambas class file + +Export +Inherits UserControl + +Public Const _Properties As String = "*,Border=True,Alignment{Align.*}=Center,Grid,UseMouse=True" +Public Const _DefaultSize As String = "36,36" +Public Const _Group As String = "View" +Public Const _DrawWith As String = "DrawingArea" + +Event Draw(View As Image) +Event Scroll + +Property Border As Boolean +Property Image As Image +Property Zoom As Float +Property Design As Boolean +Property Grid As Boolean +Property UseMouse As Boolean +Property Alignment As Integer + +Property ScrollX As Integer +Property ScrollY As Integer +Property Read ScrollWidth, ScrollW As Integer +Property Read ScrollHeight, ScrollH As Integer + +Private $hImage As Image +Private $hZoom As Image +Private $hBorder As Panel +Private $hView As ScrollArea +Private $SX As Integer +Private $SY As Integer + +Private $bUseMouse As Boolean = True +Private $fZoom As Float = 1 +Private $bZoom As Boolean +Private $bFastZoom As Boolean +Private $bGrid As Boolean +Private $iAlign As Integer = Align.Center + +' Private $fBrightness As Float +' Private $fContrast As Float + +Public Sub _new() + + $hBorder = New Panel(Me) + $hBorder.Border = Border.Plain + $hBorder.Arrangement = Arrange.Fill + + $hView = New ScrollArea($hBorder) As "View" + $hView.Border = False + $hView.Shadow = True + $hView.Focus = True + + Me.Proxy = $hView + +End + + +Private Function Image_Read() As Image + + Return $hImage + +End + +Private Sub Image_Write(Value As Image) + + $hImage = Value + $fZoom = 1 + UpdateZoom + View_Arrange + +End + +Public Sub View_Arrange() + + Dim iScrollBar As Integer + Dim W, H As Integer + + If Not $hZoom Then + $hView.ResizeContents(1, 1) + Return + Endif + + W = $hZoom.W + H = $hZoom.H + If $bZoom Then + W *= $fZoom + H *= $fZoom + Endif + + If W > $hView.W Then iScrollBar += Scroll.Horizontal + If H > $hView.H Then iScrollBar += Scroll.Vertical + If $bUseMouse Then $hView.Mouse = If(iScrollBar, Mouse.SizeAll, Mouse.Default) + $hView.ResizeContents(Max($hView.W, W), Max($hView.H, H)) + $hView.ScrollBar = iScrollBar + +End + +Private Sub GetViewRect() As Rect + + Dim X, Y As Integer + Dim W As Integer + Dim H As Integer + + If Not $hZoom Then Return + + W = $hZoom.W + H = $hZoom.H + If $bZoom Then + W *= $fZoom + H *= $fZoom + Endif + + If W <= $hView.W Then + If Align.IsLeft($iAlign) Then + X = 0 + Else If Align.IsRight($iAlign) Then + X = $hView.W - W + Else + X = ($hView.W - W) \ 2 + Endif + Else + X = -$hView.ScrollX + Endif + + If H <= $hView.H Then + If Align.IsTop($iAlign) Then + Y = 0 + Else If Align.IsBottom($iAlign) Then + Y = $hView.H - H + Else + Y = ($hView.H - H) \ 2 + Endif + Else + Y = -$hView.ScrollY + Endif + + Return Rect(X, Y, W, H) + +End + +Public Sub ViewToImage(ViewPoint As Point) As Point + + Dim hRect As Rect = GetViewRect() + Dim hResult As Point + + If hRect Then + + hResult = New Point + hResult.X = Floor((ViewPoint.X - hRect.X) / $fZoom) + hResult.Y = Floor((ViewPoint.Y - hRect.Y) / $fZoom) + Return hResult + + Endif + +End + +Public Sub ImageToView(ImagePoint As Point) As Point + + Dim hRect As Rect = GetViewRect() + Dim hResult As Point + + If hRect Then + + hResult = New Point + hResult.X = hRect.X + ImagePoint.X * $fZoom + hResult.Y = hRect.Y + ImagePoint.Y * $fZoom + Return hResult + + Endif + +End + +Public Sub _Paint(hImage As Image, X As Float, Y As Float, Optional hRect As Rect) ', fOpacity As Float = 1.0) + + If Not hImage Then Return + + If hRect Then + X += hRect.X * $fZoom + Y += hRect.Y * $fZoom + Else + hRect = Rect(0, 0, hImage.W, hImage.H) + Endif + + If $bFastZoom Then + Paint.ZoomImage(hImage, $fZoom, X, Y, If($bGrid, Color.SetAlpha(Color.Black, 128), Color.Default), hRect) + Else + Paint.DrawImage(hImage, X, Y, hImage.W * $fZoom, hImage.H * $fZoom,, hRect) + Endif + +End + + +Public Sub View_Draw() + + Dim hRect As Rect + + If Not Object.CanRaise(Me, "Draw") Then + hRect = GetViewRect() + If hRect Then _Paint($hZoom, hRect.X, hRect.Y) + Else + Raise Draw($hZoom) + Endif + +End + +Private Function Border_Read() As Boolean + + Return $hBorder.Border + +End + +Private Sub Border_Write(Value As Boolean) + + $hBorder.Border = If(Value, Border.Plain, Border.None) + +End + +Public Sub View_MouseDown() + + If Not $bUseMouse Then Return + + $SX = $hView.ScrollX + $SY = $hView.ScrollY + +End + +Public Sub View_MouseMove() + + If Not $bUseMouse Then Return + + If Mouse.Left Then $hView.Scroll($SX - (Mouse.X - Mouse.StartX), $SY - (Mouse.Y - Mouse.StartY)) + +End + +Private Function Zoom_Read() As Float + + Return $fZoom + +End + +Private Sub Zoom_Write(Value As Float) + + Dim X, Y As Float + + Value = Max(0.05, Min(32, Value)) + + If $fZoom = Value Then Return + + X = ($hView.ScrollX + $hView.ClientW / 2) / $fZoom + Y = ($hView.ScrollY + $hView.ClientH / 2) / $fZoom + + $fZoom = Value + UpdateZoom + + $hView.Scroll(X * $fZoom - $hView.ClientW / 2, Y * $fZoom - $hView.ClientH / 2) + +End + +Private Sub UpdateZoom() + + $bZoom = False + $bFastZoom = False + + If Not $hImage Then + $hZoom = Null + Else + + $hZoom = $hImage + + If $fZoom <> 1 Then + $bZoom = True + If Int($fZoom) = $fZoom Then $bFastZoom = True + Endif + + ' If $fContrast Or If $fBrightness Then + ' $hZoom = $hZoom.Copy() + ' $hZoom.BrightnessContrast($fBrightness, $fContrast) + ' Endif + Endif + + View_Arrange + $hView.Refresh + +End + +Public Sub Update(Optional (Image) As Image) + + If {Image} Then $hImage = Image + UpdateZoom + +End + + +Private Function Design_Read() As Boolean + + Return Super.Design + +End + +Private Sub Design_Write(Value As Boolean) + + If Value Then + $hImage = Image.Load("stock/32/gambas.png") + $fZoom = 4 + UpdateZoom + Endif + Super.Design = Value + +End + +Public Sub ZoomFit(Optional Margin As Integer) + + If Not $hImage Then Return + 'If IsMissing(Margin) Then Margin = Desktop.Scale + Zoom_Write(Min(($hView.W - Margin * 2) / $hImage.W, ($hView.H - Margin * 2) / $hImage.H)) + +End + + +Private Function Grid_Read() As Boolean + + Return $bGrid + +End + +Private Sub Grid_Write(Value As Boolean) + + If Value = $bGrid Then Return + $bGrid = Value + $hView.Refresh + +End + + +Private Function ScrollX_Read() As Integer + + Return $hView.ScrollX + +End + +Private Sub ScrollX_Write(Value As Integer) + + $hView.ScrollX = Value + +End + +Private Function ScrollY_Read() As Integer + + Return $hView.ScrollY + +End + +Private Sub ScrollY_Write(Value As Integer) + + $hView.ScrollY = Value + +End + +Private Function ScrollWidth_Read() As Integer + + Return $hView.ScrollWidth + +End + +Private Function ScrollHeight_Read() As Integer + + Return $hView.ScrollHeight + +End + +Public Sub Scroll(X As Integer, Y As Integer) + + $hView.Scroll(X, Y) + +End + +Public Sub View_Scroll() + + Raise Scroll + +End + +Private Function UseMouse_Read() As Boolean + + Return $bUseMouse + +End + +Private Sub UseMouse_Write(Value As Boolean) + + $bUseMouse = Value + If Not Value Then $hView.Mouse = Mouse.Default + +End + +Public Sub EnsureVisible(X As Integer, Y As Integer, W As Integer, H As Integer) + + $hView.EnsureVisible(X, Y, W, H) + +End + +Private Function Alignment_Read() As Integer + + Return $iAlign + +End + +Private Sub Alignment_Write(Value As Integer) + + $iAlign = Value + $hView.Refresh + +End diff --git a/comp/src/gb.form/.src/InputBox.class b/comp/src/gb.form/.src/InputBox.class new file mode 100644 index 00000000..b278193c --- /dev/null +++ b/comp/src/gb.form/.src/InputBox.class @@ -0,0 +1,9 @@ +' Gambas class file + +Export + +Static Public Sub _call(Prompt As String, Optional Title As String, Optional {Default} As String) As String + + Return FInputBox.Run(Prompt, Title, {Default}) + +End diff --git a/comp/src/gb.form/.src/LCDLabel.class b/comp/src/gb.form/.src/LCDLabel.class new file mode 100644 index 00000000..f6f74c05 --- /dev/null +++ b/comp/src/gb.form/.src/LCDLabel.class @@ -0,0 +1,455 @@ +' Gambas class file + +Export +Inherits UserControl + +Public Const _Properties As String = "*,Text,Alignment{Align.Normal;Left;Center;Right}=Normal,Sheared,Padding{Range:0;63},Border,HighlightColor{Color}" +Public Const _DefaultSize As String = "24,4" +Public Const _Similar As String = "Label" + +Property Text As String +Property Alignment As Integer +Property Sheared As Boolean +Property Padding As Integer +Property Border As Boolean +Property HighlightColor As Integer +Property Value As Float + +Private $hView As DrawingArea +Private $sText As String +Private $iAlign As Integer = Align.Normal +Private $iFg As Integer +Private $iLightBg As Integer +Private $iBg As Integer +Private $bSheared As Boolean +Private $iPadding As Integer +Private $bBorder As Boolean +Private $iHighlightColor As Integer = Color.Default + +Static Private $aSegment As Float[][] +Static Private $cCar As Collection + +Static Private Sub Init() + + $aSegment = New Float[][19] + + $aSegment[0] = [0.5, 0.5, 1, 0, 4, 0, 4.5, 0.5, 4, 1, 1, 1] + $aSegment[1] = [4.5, 0.5, 5, 0, 8, 0, 8.5, 0.5, 8, 1, 5, 1] + $aSegment[2] = [0.5, 0.5, 1, 1, 1, 8, 0.5, 8.5, 0, 8, 0, 1] + $aSegment[3] = [1, 1, 4, 7, 4, 8, 3.5, 8, 1, 3] + $aSegment[4] = [4.5, 0.5, 5, 1, 5, 8, 4.5, 8.5, 4, 8, 4, 1] + $aSegment[5] = [8, 1, 5, 7, 5, 8, 5.5, 8, 8, 3] + $aSegment[6] = [8.5, 0.5, 9, 1, 9, 8, 8.5, 8.5, 8, 8, 8, 1] + $aSegment[7] = [0.5, 8.5, 1, 8, 4, 8, 4.5, 8.5, 4, 9, 1, 9] + $aSegment[8] = [4.5, 8.5, 5, 8, 8, 8, 8.5, 8.5, 8, 9, 5, 9] + $aSegment[9] = [0.5, 8.5, 1, 9, 1, 16, 0.5, 16.5, 0, 16, 0, 9] + $aSegment[10] = [3.5, 9, 4, 9, 4, 10, 1, 16, 1, 14] + $aSegment[11] = [4.5, 8.5, 5, 9, 5, 16, 4.5, 16.5, 4, 16, 4, 9] + $aSegment[12] = [5, 9, 5.5, 9, 8, 14, 8, 16, 5, 10] + $aSegment[13] = [8.5, 8.5, 9, 9, 9, 16, 8.5, 16.5, 8, 16, 8, 9] + $aSegment[14] = [0.5, 16.5, 1, 16, 4, 16, 4.5, 16.5, 4, 17, 1, 17] + $aSegment[15] = [4.5, 16.5, 5, 16, 8, 16, 8.5, 16.5, 8, 17, 5, 17] + + $aSegment[16] = [10, 16, 11, 16, 11, 17, 10, 17] + $aSegment[17] = [10, 4, 11, 4, 11, 5, 10, 5] + $aSegment[18] = [10, 12, 11, 12, 11, 13, 10, 13] + + $cCar = New Collection + + $cCar["0"] = [0, 1, 2, 5, 6, 9, 10, 13, 14, 15] + $cCar["1"] = [6, 13] + $cCar["2"] = [0, 1, 6, 7, 8, 9, 14, 15] + $cCar["3"] = [0, 1, 6, 7, 8, 13, 14, 15] + $cCar["4"] = [2, 6, 7, 8, 13] + $cCar["5"] = [0, 1, 2, 7, 8, 13, 14, 15] + $cCar["6"] = [0, 1, 2, 7, 8, 9, 13, 14, 15] + $cCar["7"] = [0, 1, 6, 13] + $cCar["8"] = [0, 1, 2, 6, 7, 8, 9, 13, 14, 15] + $cCar["9"] = [0, 1, 2, 6, 7, 8, 13, 14, 15] + $cCar["A"] = [0, 1, 2, 6, 7, 8, 9, 13] + $cCar["B"] = [0, 1, 4, 6, 8, 11, 13, 14, 15] + $cCar["C"] = [0, 1, 2, 9, 14, 15] + $cCar["D"] = [0, 1, 4, 6, 11, 13, 14, 15] + $cCar["E"] = [0, 1, 2, 7, 8, 9, 14, 15] + $cCar["F"] = [0, 1, 2, 7, 8, 9] + $cCar["G"] = [0, 1, 2, 8, 9, 13, 14, 15] + $cCar["H"] = [2, 6, 7, 8, 9, 13] + $cCar["I"] = [0, 1, 4, 11, 14, 15] + $cCar["J"] = [6, 9, 13, 14, 15] + $cCar["K"] = [2, 5, 7, 9, 12] + $cCar["L"] = [2, 9, 14, 15] + $cCar["M"] = [2, 3, 5, 6, 9, 13] + $cCar["N"] = [2, 3, 6, 9, 12, 13] + $cCar["O"] = [0, 1, 2, 6, 9, 13, 14, 15] + $cCar["P"] = [0, 1, 2, 6, 7, 8, 9] + $cCar["Q"] = [0, 1, 2, 6, 9, 12, 13, 14, 15] + $cCar["R"] = [0, 1, 2, 6, 7, 8, 9, 12] + $cCar["S"] = [0, 1, 2, 7, 12, 14, 15] + $cCar["T"] = [0, 1, 4, 11] + $cCar["U"] = [2, 6, 9, 13, 14, 15] + $cCar["V"] = [2, 5, 9, 10] + $cCar["W"] = [2, 6, 9, 10, 12, 13] + $cCar["X"] = [3, 5, 10, 12] + $cCar["Y"] = [3, 5, 11] + $cCar["Z"] = [0, 1, 5, 10, 14, 15] + $cCar["_"] = [14, 15] + $cCar["["] = [1, 4, 11, 15] + $cCar["]"] = [0, 4, 11, 14] + $cCar["("] = [1, 4, 11, 15] + $cCar[")"] = [0, 4, 11, 14] + $cCar["{"] = [1, 4, 7, 11, 15] + $cCar["}"] = [0, 4, 8, 11, 14] + $cCar["-"] = [7, 8] + $cCar["+"] = [4, 7, 8, 11] + $cCar["|"] = [4, 11] + $cCar["\\"] = [3, 12] + $cCar["/"] = [5, 10] + $cCar["="] = [7, 8, 14, 15] + $cCar["*"] = [3, 5, 7, 8, 10, 12] + $cCar["<"] = [5, 12] + $cCar[">"] = [3, 10] + $cCar["@"] = [0, 1, 2, 4, 6, 8, 9, 14, 15] + $cCar["'"] = [4] + $cCar["\""] = [4, 6] + $cCar["`"] = [3] + $cCar["°"] = [0, 2, 4, 7] + $cCar["~"] = [0, 2, 4, 6, 8] + $cCar["$"] = [0, 1, 2, 4, 7, 8, 11, 13, 14, 15] + $cCar["%"] = [0, 2, 4, 5, 7, 8, 10, 11, 13, 15] + $cCar["#"] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] + $cCar["^"] = [10, 12] + $cCar[" "] = [] + +End + + +Public Sub _new() + + If Not $cCar Then Init + + $hView = New DrawingArea(Me) As "View" + Me.Proxy = $hView + + 'GetRealForeground() + 'GetRealForeground() + +End + +Private Function Text_Read() As String + + Return $sText + +End + +Private Sub Text_Write(Value As String) + + $sText = Value + $hView.Refresh + +End + +Private Function Alignment_Read() As Integer + + Return $iAlign + +End + +Private Sub Alignment_Write(Value As Integer) + + $iAlign = Value + $hView.Refresh + +End + +Public Sub View_Draw() + + Dim nCar As Integer + Dim I As Integer + Dim sCar As String + Dim CW, X, Y As Float + Dim W, H As Integer + Dim bPoint As Boolean + Dim iPad As Integer + Dim bColon As Boolean + Dim iLen As Integer + + iPad = $iPadding + If $bBorder Then Inc iPad + + W = $hView.W - iPad * 2 + H = $hView.H - iPad * 2 + + If W < 16 Or If H < 8 Or If Not $sText Then Goto DRAW_BORDER + + For I = 1 To String.Len($sText) + sCar = String.Mid$($sText, I, 1) + If sCar = "." Or If sCar = ":" Then + If I = 1 Or If String.Mid$($sText, I - 1, 1) = sCar Then + Inc nCar + Endif + Else + Inc nCar + Endif + Next + + CW = W / nCar + If (CW * 2) > H Then CW = H / 2 + + If Align.IsCenter($iAlign) Then + X = (W - (CW * nCar)) / 2 + Else If Align.IsRight($iAlign) Then + X = W - (CW * nCar) + Else + X = 0 + Endif + + Y = H / 2 - CW + + X += iPad + Y += iPad + + $iFg = GetRealForeground() + $iBg = GetRealBackground() + $iLightBg = Color.Merge($iFg, $iBg, 0.9) + + Paint.ResetClip + + iLen = String.Len($sText) + For I = 1 To iLen + sCar = String.Mid$($sText, I, 1) + bPoint = False + bColon = False + If I < iLen Then + If String.Mid$($sText, I + 1, 1) = "." Then + bPoint = True + Inc I + Else If String.Mid$($sText, I + 1, 1) = ":" Then + bColon = True + Inc I + Endif + Endif + DrawCharacter(sCar, bPoint, bColon, X, Y, CW) + X += CW + Next + +DRAW_BORDER: + + If $bBorder Then + Draw.Rect(0, 0, $hView.W, $hView.H) + Endif + +End + +Private Sub GetRealBackground() As Integer + + Dim hCtrl As Control = Me + + Repeat + If hCtrl.Background <> Color.Default Then Return hCtrl.Background + hCtrl = hCtrl.Parent + Until IsNull(hCtrl) + + Return Color.Background + +End + +Private Sub GetRealForeground() As Integer + + Dim hCtrl As Control = Me + + Repeat + If hCtrl.Foreground <> Color.Default Then Return hCtrl.Foreground + hCtrl = hCtrl.Parent + Until IsNull(hCtrl) + + Return Color.Foreground + +End + + +Private Sub DrawCharacter(sCar As String, bPoint As Boolean, bColon As Boolean, X As Float, Y As Float, W As Float) + + Dim U As Float = W / 12 + Dim aCar As Integer[] + Dim iSegment As Integer + Dim aOn As Boolean[] + Dim hShear As PaintMatrix + Dim bOutline As Boolean + Dim hImage As Image + Dim hMatrix As PaintMatrix + + aCar = $cCar[UCase(sCar)] + If Not aCar And If Not bPoint And If Not bColon Then Return + + Paint.Save + + Paint.Translate(X, Y) + Paint.Scale(U, U) + + If $bSheared Then + Paint.Translate(3, 3.5) + hShear = PaintMatrix(1.0, 0.0, -0.2, 1.0, 0.0, 0.0) + Paint.Matrix = hShear.Multiply(Paint.Matrix) + Else + Paint.Translate(0, 3.5) + Endif + + If U >= 1 Then + bOutLine = True + Paint.LineWidth = 0.1 + Endif + + aOn = New Boolean[$aSegment.Count] + + If aCar Then + For Each iSegment In aCar + aOn[iSegment] = True + Next + Endif + + If bPoint Then aOn[16] = True + If bColon Then + aOn[17] = True + aOn[18] = True + Endif + + For iSegment = 0 To $aSegment.Max + If Not aOn[iSegment] Then Paint.Polygon($aSegment[iSegment]) + Next + Paint.Background = $iLightBg + Paint.Fill + + If $iHighlightColor <> Color.Default Then + + hImage = New Image(W * 1.2, W * 2, Color.Transparent) + + Paint.Begin(hImage) + + Paint.Translate(W * 0.1, 0) + Paint.Scale(U, U) + + If $bSheared Then + Paint.Translate(3, 3.5) + hShear = PaintMatrix(1.0, 0.0, -0.2, 1.0, 0.0, 0.0) + Paint.Matrix = hShear.Multiply(Paint.Matrix) + Else + Paint.Translate(0, 3.5) + Endif + + For iSegment = 0 To $aSegment.Max + If aOn[iSegment] Then Paint.Polygon($aSegment[iSegment]) + Next + + Paint.LineWidth = 0.1 + + Paint.Background = $iHighlightColor + Paint.Fill + + Paint.End + + hImage.Fuzzy(W * 0.15) + + hMatrix = Paint.Matrix + Paint.Restore + Paint.Save + Paint.DrawImage(hImage, X - W * 0.1, Y) + Paint.DrawImage(hImage, X - W * 0.1, Y) + Paint.Matrix = hMatrix + + Endif + + + For iSegment = 0 To $aSegment.Max + If aOn[iSegment] Then Paint.Polygon($aSegment[iSegment]) + Next + + ' If $iHighlightColor <> Color.Default Then + ' If U >= 1.5 Then + ' Paint.LineCap = Paint.LineCapRound + ' Paint.LineJoin = Paint.LineJoinRound + ' Paint.Background = Color.SetAlpha($iHighlightColor, 220) + ' Paint.LineWidth = 0.8 + ' For I = 1 To 5 + ' Paint.Stroke(True) + ' Paint.LineWidth *= 1.5 + ' Next + ' Endif + ' Endif + + Paint.LineWidth = 0.1 + Paint.Background = $iFg + If bOutline Then + Paint.Fill(True) + Paint.Background = $iBg + Paint.Stroke + Else + Paint.Fill + Endif + + Paint.Restore + +End + +Private Function Sheared_Read() As Boolean + + Return $bSheared + +End + +Private Sub Sheared_Write(Value As Boolean) + + $bSheared = Value + $hView.Refresh + +End + +Private Function Padding_Read() As Integer + + Return $iPadding + +End + +Private Sub Padding_Write(Value As Integer) + + $iPadding = Value + $hView.Refresh + +End + +Private Function Border_Read() As Boolean + + Return $bBorder + +End + +Private Sub Border_Write(Value As Boolean) + + $bBorder = Value + $hView.Refresh + +End + +Private Function HighlightColor_Read() As Integer + + Return $iHighlightColor + +End + +Private Sub HighlightColor_Write(Value As Integer) + + $iHighlightColor = Value + $hView.Refresh + +End + +Private Function Value_Read() As Float + + Return CFloat($sText) + +End + +Private Sub Value_Write(Value As Float) + + Try Me.Text = CStr(Value) + +End diff --git a/comp/src/gb.form/.src/ListContainer.class b/comp/src/gb.form/.src/ListContainer.class new file mode 100644 index 00000000..db6d8d77 --- /dev/null +++ b/comp/src/gb.form/.src/ListContainer.class @@ -0,0 +1,413 @@ +' Gambas class file + +Export +Inherits UserContainer + +Public Const _Properties As String = "*,-Padding,-Spacing,-Arrangement,-AutoResize,-Indent,Border=True" +Public Const _DefaultArrangement As String = "V" +Public Const _DefaultEvent As String = "Click" +Public Const _Group As String = "Deprecated" + +Event Click +Event Activate +Event Scroll + +Property Read Count As Integer +Property Index As Integer +Property Current As Control +Property Background As Integer +Property Border As Boolean + +Private $hScrollView As ScrollView +Private $hLast As Control +Private $hSelected As Control +Private $bNoMouse As Boolean +Private $hTimer As Timer +Private $iSaveBackground As Integer +Private $iSaveForeground As Integer +Private $iLastX As Integer +Private $iLastY As Integer +Private $iLock As Integer +Private $bMouseDown As Boolean + +Public Sub _new() + + $hScrollView = New ScrollView(Me) As "ScrollView" + $hScrollView.Resize(80, 60) + $hScrollView.Name = Me.Name & ".ScrollView" + + $hTimer = New Timer As "Child" + $hTimer.Delay = 80 + + With $hScrollView + .Border = True + .ScrollBar = Scroll.Vertical + .Background = Color.TextBackground + .Arrangement = Arrange.Vertical + $iSaveBackground = .Background + $iSaveForeground = Color.TextForeground + End With + + Me._Container = $hScrollView + Me.Arrangement = Arrange.Vertical + +End + +Private Sub AttachRec(hItem As Control) + + Dim hCont As Container + Dim hObs As Observer + + If Not hItem.Enabled Then Return + 'Object.Attach(hItem, ME, "Child") + hObs = New Observer(hItem) As "Child" + + Try hCont = hItem + If Not hCont Then Return + If hCont Is UserControl Then Return + + For Each hItem In hCont.Children + AttachRec(hItem) + Next + +End + +Private Function GetReal(hCtrl As Control) As Control + + If Not hCtrl Then Return + While hCtrl.Parent <> $hScrollView + hCtrl = hCtrl.Parent + Wend + Return hCtrl + +End + +Public Sub ScrollView_NewChild(Child As Control) + + If Me.Design Then Return + AttachRec(Child) + +End + +Public Sub Child_NewChild(Child As Control) + + If Me.Design Then Return + AttachRec(Child) + +End + +Public Sub ScrollView_Scroll() + + 'Debug $hScrollView.ScrollY + Raise Scroll + +End + +Public Sub Child_Insert(Child As Control) + + 'Debug Me.Name + If Me.Design Then Return + AttachRec(Child) + +End + +Private Function Count_Read() As Integer + + Return $hScrollView.Children.Count + +End + +Private Sub ChildFromIndex(Index As Integer) As Control + + Dim hChild As Control + Dim iInd As Integer + + For Each hChild In $hScrollView.Children + If Index = iInd Then Return hChild + Inc iInd + Next + +End + +Private Sub IndexFromChild(Child As Control) As Integer + + Dim hChild As Control + Dim iInd As Integer + + For Each hChild In $hScrollView.Children + If hChild = Child Then Return iInd + Inc iInd + Next + + Return -1 + +End + + +Private Sub GetSelected() As Control + + Return $hSelected + + ' DIM hChild AS Control + ' + ' FOR EACH hChild IN $hScrollView.Children + ' 'IF NOT hChild.Visible THEN CONTINUE + ' IF hChild.Background = Color.SelectedBackground THEN RETURN hChild + ' NEXT + +End + + +Private Function Index_Read() As Integer + + Return IndexFromChild(GetSelected()) + +End + +Private Sub SetSelected(Child As Control) + + Dim hChild As Control + Dim hOld As Control + Dim iSaveBackground As Integer + Dim iSaveForeground As Integer + 'DIM bNoEvent AS Boolean + + If Child Then + If Child.Parent <> $hScrollView Then Return + If Not Child.Enabled Then Return + If Not Child.Visible Then Return + If Child Is Label Or If Child Is Separator Then Return + Endif + + hOld = GetSelected() + If hOld = Child Then Return + + For Each hChild In $hScrollView.Children + If Not Object.IsValid(hChild) Then Continue + If Not hChild.Enabled Then Continue + If hChild = Child Then + iSaveBackground = hChild.Background + iSaveForeground = hChild.Foreground + hChild.Background = Color.SelectedBackground + hChild.Foreground = Color.SelectedForeground + Else If hChild = hOld Then + hChild.Background = $iSaveBackground + hChild.Foreground = $iSaveForeground + Endif + Next + + $hSelected = Child + If $hSelected Then + $iSaveBackground = iSaveBackground + $iSaveForeground = iSaveForeground + Endif + + 'Wait + If Child Then Raise Click + +End + + +Private Sub Index_Write(Value As Integer) + + SetSelected(ChildFromIndex(Value)) + EnsureVisible + +End + +Private Function Current_Read() As Control + + Return GetSelected() + +End + +Private Sub Current_Write(Value As Control) + + SetSelected(Value) + +End + +Private Sub DoMouse() + + Dim hChild As Control + Dim Y As Integer + + If $bNoMouse Then Return + + Y = Mouse.ScreenY - $hScrollView.ScreenY + $hScrollView.ScrollY + Y = Max(0, Min($hScrollView.ScrollH, Y)) + + hChild = $hScrollView.FindChild(Mouse.ScreenX - $hScrollView.ScreenX + $hScrollView.ScrollX, Y) + hChild = GetReal(hChild) + If hChild Then + $bNoMouse = True + If hChild.Enabled And If hChild <> $hLast Then + SetSelected(hChild) + $hLast = hChild + Endif + $hScrollView.EnsureVisible(hChild.X, hChild.Y, hChild.W, hChild.H) + $bNoMouse = False + Endif + +End + + +Public Sub Child_MouseDown() + + $hLast = Null + DoMouse + $iLastX = Mouse.ScreenX + $iLastY = Mouse.ScreenY + $bMouseDown = True + +End + + +Public Sub Child_MouseMove() + + If Not $bMouseDown Then Return + 'IF LAST.Parent <> $hScrollView THEN RETURN + If $iLastX = Mouse.ScreenX And If $iLastY = Mouse.ScreenY Then Return + If Not $hTimer.Enabled Then $hTimer.Enabled = True + 'DoMouse + $iLastX = Mouse.ScreenX + $iLastY = Mouse.ScreenY + +End + +Public Sub Child_MouseUp() + + $hTimer.Enabled = False + $bMouseDown = False + +End + +Public Sub Child_Timer() + + DoMouse + +End + +Public Sub Child_DblClick() + + Raise Activate + +End + +Public Sub EnsureVisible() + + If $hSelected Then $hScrollView.EnsureVisible($hSelected.X, $hSelected.Y, $hSelected.W, $hSelected.H) + +End + + +Public Sub Select(hChild As Control) + + SetSelected(hChild) + EnsureVisible + +End + +Public Sub Clear() + + Lock() + $hScrollView.Children.Clear + $hSelected = Null + Unlock() + 'Wait + +End + + +Private Function Background_Read() As Integer + + Return $hScrollView.Background + +End + +Private Sub Background_Write(Value As Integer) + + If Value = Color.Default Then Value = Color.TextBackground + $hScrollView.Background = Value + +End + +Public Sub Lock() + + If $iLock = 0 Then Me.Arrangement = Arrange.None + Inc $iLock + +End + + +Public Sub Unlock() + + If $iLock <= 0 Then Return + Dec $iLock + If $iLock = 0 Then Me.Arrangement = Arrange.Vertical + +End + +Public Sub ScrollView_KeyPress() + + Dim iIndex As Integer + + If Not Key.Normal Then Return + + iIndex = Index_Read() + + If Key.Code = Key.Up Then + While iIndex > 0 + Dec iIndex + Index_Write(iIndex) + If Index_Read() = iIndex Then + Stop Event + Return + Endif + Wend + Else If Key.Code = Key.Down Then + While iIndex < (Count_Read() - 1) + Inc iIndex + Index_Write(iIndex) + If Index_Read() = iIndex Then + Stop Event + Return + Endif + Wend + Else If Key.Code = Key.Home Then + iIndex = 0 + While iIndex < Count_Read() + Index_Write(iIndex) + If Index_Read() = iIndex Then + Stop Event + Return + Endif + Inc iIndex + Wend + Else If Key.Code = Key.End Then + iIndex = Count_Read() - 1 + While iIndex > 0 + Index_Write(iIndex) + If Index_Read() = iIndex Then + Stop Event + Return + Endif + Dec iIndex + Wend + Else If Key.Code = Key.Space Then + If GetSelected() Then Raise Activate + Endif + +End + +Private Function Border_Read() As Boolean + + Return $hScrollView.Border + +End + +Private Sub Border_Write(Value As Boolean) + + $hScrollView.Border = Value + +End diff --git a/comp/src/gb.form/.src/ListEditor/FListEditor.class b/comp/src/gb.form/.src/ListEditor/FListEditor.class new file mode 100644 index 00000000..4e5f993f --- /dev/null +++ b/comp/src/gb.form/.src/ListEditor/FListEditor.class @@ -0,0 +1,341 @@ +' Gambas class file + +Private $bUnique As Boolean + +Private Sub GetParent() As ListEditor + + Return Me.Parent + +End + +Public Sub GetBorder() As Boolean + + Return panData.Border <> Border.None + +End + +Public Sub SetBorder(bBorder As Boolean) + + panData.Border = If(bBorder, Border.Plain, Border.None) + +End + +Public Sub GetList() As String[] + + Return lstData.List + +End + +Private Sub UnSelect() + + If lstData.Index < 0 Then Return + lstData.Index = -1 + GetParent()._RaiseSelect + +End + +Public Sub SetList(aList As String[]) + + UnSelect + txtData.Clear + lstData.List = aList + CheckUnique + GetParent()._RaiseChange + +End + +Public Sub Add(sText As String) As Boolean + + Dim iPos As Integer + + If Not sText Then Return + If $bUnique Then + iPos = lstData.Find(sText) + If iPos >= 0 Then + lstData.Index = iPos + Return True + Endif + Endif + lstData.Add(sText) + GetParent()._RaiseChange + lstData.Index = -1 + +End + + +Public Sub btnAdd_Click() + + GetParent()._RaiseAdd + If txtData.ReadOnly Then Return + + If lstData.Index < 0 Then + If Add(txtData.Text) Then Return + Endif + + UnSelect + txtData.Clear + txtData.SetFocus + +End + +Public Sub lstData_Select() + + If lstData.Index >= 0 Then + txtData.Text = lstData.Text + txtData.SetFocus + Endif + + GetParent()._RaiseSelect + +End + +Public Sub txtData_Change() + + If lstData.Index < 0 Then Return + lstData.Current.Text = txtData.Text + If Not txtData.Text Then + btnRemove_Click + Else + GetParent()._RaiseChange + Endif + +End + +Public Sub btnRemove_Click() + + Dim aList As String[] + + If lstData.Index >= 0 Then + aList = lstData.List + aList.Remove(lstData.Index) + UnSelect + lstData.List = aList + GetParent()._RaiseChange + Endif + + txtData.Clear + txtData.SetFocus + +End + +Public Sub txtData_Activate() + + btnAdd.Value = True + +End + +Public Sub btnUp_Click() + + If lstData.Index < 1 Then Return + Swap lstData[lstData.Index - 1].Text, lstData[lstData.Index].Text + Dec lstData.Index + GetParent()._RaiseChange + +End + +Public Sub btnDown_Click() + + If lstData.Index < 0 Or If lstData.Index = lstData.Count - 1 Then Return + Swap lstData[lstData.Index].Text, lstData[lstData.Index + 1].Text + Inc lstData.Index + GetParent()._RaiseChange + +End + +' Public Sub btnUp_DblClick() +' +' Dim aList As String[] +' Dim sElt As String +' +' If lstData.Index < 1 Then Return +' +' aList = lstData.List +' sElt = aList[lstData.Index] +' aList.Remove(lstData.Index) +' aList.Add(sElt, 0) +' lstData.List = aList +' lstData.Index = 0 +' +' End +' +' Public Sub btnDown_DblClick() +' +' Dim aList As String[] +' Dim sElt As String +' +' If lstData.Index < 0 Or If lstData.Index = lstData.Count - 1 Then Return +' +' aList = lstData.List +' sElt = aList[lstData.Index] +' aList.Remove(lstData.Index) +' aList.Add(sElt) +' lstData.List = aList +' lstData.Index = lstData.Count - 1 +' +' End +' +Public Sub GetText() As String + + Return txtData.Text + +End + +Public Sub SetText(sText As String) + + txtData.Text = sText + +End + +Public Sub GetMoveable() As Boolean + + Return btnUp.Visible + +End + +Public Sub SetMoveable(bShow As Boolean) + + btnUp.Visible = bShow + btnDown.Visible = bShow + +End + +Public Sub GetEditor() As TextBox + + Return txtData + +End + +Public Sub _new() + + Me.Parent.Proxy = txtData + +End + +Public Sub txtData_KeyPress() + + If lstData.Count = 0 Then Return + + If Key.Normal Then + + If Key.Code = Key.Up Then + If lstData.Index < 0 Then + lstData.Index = lstData.Count - 1 + Else If lstData.Index > 0 Then + Dec lstData.Index + Endif + Stop Event + Else If Key.Code = Key.Down Then + If lstData.Index < 0 Then + lstData.Index = 0 + Else + Inc lstData.Index + Endif + Stop Event + Endif + + Else If Key.Control Then + + If Key.Code = Key.Home Then + lstData.Index = 0 + Stop Event + Else If Key.Code = Key.End Then + lstData.Index = lstData.Count - 1 + Stop Event + Endif + + Endif + +End + +Public Sub IsReadOnly() As Boolean + + Return txtData.ReadOnly + +End + +Public Sub SetReadOnly(bReadOnly As Boolean) + + txtData.ReadOnly = bReadOnly + txtData.Visible = Not bReadOnly + + If bReadOnly Then + btnAdd.Text = ("Add") & "..." + btnRemove.Text = ("Remove") + Else + btnAdd.Text = "" + btnRemove.Text = "" + Endif + +End + +Public Sub lstData_Activate() + + GetParent()._RaiseActivate + +End + +Public Sub Clear() + + lstData.Clear + txtData.Clear + +End + +Public Sub IsUnique() As Boolean + + Return $bUnique + +End + +Private Sub CheckUnique() + + Dim I As Integer + Dim iPos As Integer + + If Not $bUnique Then Return + + I = 1 + While I < lstData.Count + iPos = lstData.Find(lstData[I]) + If iPos <> I Then + lstData.Remove(I) + Else + Inc I + Endif + Wend + +End + +Public Sub SetUnique(bUnique As Boolean) + + If $bUnique = bUnique Then Return + $bUnique = bUnique + CheckUnique + +End + +Public Sub GetIndex() As Integer + + Return lstData.Index + +End + +Public Sub SetIndex(Value As Integer) + + lstData.Index = Value + +End + +Public Sub Find(Text As String, Mode As Integer) As Integer + + Return lstData.Find(Text, Mode) + +End + +Public Sub Remove(Index As Integer, Length As Integer) + + lstData.Remove(Index, Length) + lstData.Index = -1 + txtData.Clear + +End diff --git a/comp/src/gb.form/.src/ListEditor/FListEditor.form b/comp/src/gb.form/.src/ListEditor/FListEditor.form new file mode 100644 index 00000000..eb122875 --- /dev/null +++ b/comp/src/gb.form/.src/ListEditor/FListEditor.form @@ -0,0 +1,52 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,64,37) + Arrangement = Arrange.Fill + { panData Panel + MoveScaled(2,2,55,33) + Arrangement = Arrange.Vertical + Border = Border.Plain + { lstData ListBox + MoveScaled(1,1,52,24) + Expand = True + Border = False + } + { Separator1 Separator + MoveScaled(7,26,13,0) + } + { HBox1 HBox + MoveScaled(1,28,52,4) + Background = Color.TextBackground + { txtData TextBox + MoveScaled(0,0,32,4) + Expand = True + Border = False + } + { btnAdd ToolButton + MoveScaled(33,0,4,4) + ToolTip = ("Add item") + AutoResize = True + Picture = Picture["icon:/small/add"] + } + { btnRemove ToolButton + MoveScaled(37,0,4,4) + ToolTip = ("Remove item") + AutoResize = True + Picture = Picture["icon:/small/remove"] + } + { btnUp ToolButton + MoveScaled(41,0,4,4) + ToolTip = ("Move item up") + AutoResize = True + Picture = Picture["icon:/small/up"] + } + { btnDown ToolButton + MoveScaled(45,0,4,4) + ToolTip = ("Move item down") + AutoResize = True + Picture = Picture["icon:/small/down"] + } + } + } +} diff --git a/comp/src/gb.form/.src/ListEditor/ListEditor.class b/comp/src/gb.form/.src/ListEditor/ListEditor.class new file mode 100644 index 00000000..c0a9a09b --- /dev/null +++ b/comp/src/gb.form/.src/ListEditor/ListEditor.class @@ -0,0 +1,170 @@ +' Gambas class file + +Export + +Inherits UserControl + +Public Const _Properties As String = "*,List,Border=True,Moveable=True,ReadOnly,Unique" +Public Const _DefaultSize As String = "24,32" +Public Const _Similar As String = "ListBox" +Public Const _Group As String = "View" + +Property List As String[] +Property Border As Boolean +Property Text As String +Property Moveable As Boolean +Property ReadOnly As Boolean +Property Read Editor As Control +Property Unique As Boolean +Property Index As Integer + +Event Select +Event Change +Event Add +Event Activate + +Private $hForm As FListEditor + +Public Sub _new() + + $hForm = New FListEditor(Me) + +End + +Private Function Border_Read() As Boolean + + Return $hForm.GetBorder() + +End + +Private Sub Border_Write(Value As Boolean) + + $hForm.SetBorder(Value) + +End + +Private Function List_Read() As String[] + + Return $hForm.GetList() + +End + +Private Sub List_Write(Value As String[]) + + $hForm.SetList(Value) + +End + +Public Sub _RaiseSelect() + + Raise Select + +End + +Public Sub _RaiseChange() + + Raise Change + +End + +Private Function Text_Read() As String + + Return $hForm.GetText() + +End + +Private Sub Text_Write(Value As String) + + $hForm.SetText(Value) + +End + +Private Function Moveable_Read() As Boolean + + Return $hForm.GetMoveable() + +End + +Private Sub Moveable_Write(Value As Boolean) + + $hForm.SetMoveable(Value) + +End + +Private Function Editor_Read() As Control + + Return $hForm.GetEditor() + +End + +Private Function ReadOnly_Read() As Boolean + + Return $hForm.IsReadOnly() + +End + +Private Sub ReadOnly_Write(Value As Boolean) + + $hForm.SetReadOnly(Value) + +End + +Public Sub _RaiseAdd() + + Raise Add + +End + +Public Sub Add(Text As String) + + $hForm.Add(Text) + +End + +Public Sub Remove(Index As Integer, Optional Length As Integer = 1) + + $hForm.Remove(Index, Length) + +End + +Public Sub _RaiseActivate() + + Raise Activate + +End + +Public Sub Clear() + + $hForm.Clear + +End + +Private Function Unique_Read() As Boolean + + Return $hForm.IsUnique() + +End + +Private Sub Unique_Write(Value As Boolean) + + $hForm.SetUnique(Value) + +End + +Private Function Index_Read() As Integer + + Return $hForm.GetIndex() + +End + +Private Sub Index_Write(Value As Integer) + + $hForm.SetIndex(Value) + +End + +Public Sub Find(Text As String, Optional Mode As Integer) As Integer + + Return $hForm.Find(Text, Mode) + +End diff --git a/comp/src/gb.form/.src/Main.module b/comp/src/gb.form/.src/Main.module new file mode 100644 index 00000000..6748d9c1 --- /dev/null +++ b/comp/src/gb.form/.src/Main.module @@ -0,0 +1,251 @@ +' Gambas module file + +'Class DesktopMime + +Private $cArrow As New Collection + +Public Sub GetArrow(iType As Integer, iSize As Integer) As Image + + Dim sKey As String + Dim hPict As Picture + Dim hImage As Image + + Select Case iType + Case Align.Top + sKey = "top" + Case Align.Bottom + sKey = "bottom" + Case Align.Left + sKey = "left" + Case Align.Right + sKey = "right" + End Select + + sKey = sKey & "-" & iSize + + hImage = $cArrow[sKey] + If Not hImage Then + hPict = New Picture(16, 16) + hPict.Fill(Color.White) + Draw.Begin(hPict) + Draw.Style.Arrow(0, 0, 16, 16, iType) + Draw.End + hImage = hPict.Image + hImage.Erase() + hImage = hImage.Stretch(iSize, iSize) + 'hPict = hImage.Picture + $cArrow[sKey] = hImage + Endif + Return hImage + +End + +Public Sub GetFileSize(iSize As Long, Optional nDigit As Integer = 1) As String + + Dim sFormat As String + + sFormat = "0." & String$(nDigit, "#") + + If iSize < 1024 Then + Return Subst(("&1 B"), CStr(iSize)) + Else If iSize < 1048576 Then + Return Subst(("&1 KiB"), Format(iSize / 1024, sFormat)) + Else If iSize < 1073741824 Then + Return Subst(("&1 MiB"), Format(iSize / 1048576, sFormat)) + Else + Return Subst(("&1 GiB"), Format(iSize / 1073741824, sFormat)) + Endif + +End + +Private Sub FindMenuChild(hMenu As Menu, sMenu As String) As Menu + + For Each hMenu In hMenu.Children + If hMenu.Name == sMenu Then Return hMenu + hMenu = FindMenuChild(hMenu, sMenu) + If hMenu Then Return hMenu + Next + +End + +Private Sub FindMenuWindow(hWindow As Window, sMenu As String) As Menu + + Dim hMenu As Menu + + For Each hMenu In hWindow.Menus + If hMenu.Name == sMenu Then Return hMenu + hMenu = FindMenuChild(hMenu, sMenu) + If hMenu Then Return hMenu + Next + +End + +Public Sub FindMenu(hCtrl As Control, sMenu As String) As Menu + + Dim hWindow As Window + Dim hMenu As Menu + + hWindow = hCtrl.Window + Do + hMenu = FindMenuWindow(hWindow, sMenu) + If hMenu Then Break + Try hWindow = hWindow.Parent.Window + If Error Then Return + Loop + + Return hMenu + +End + +Public Sub PaintColor(X As Integer, Y As Integer, W As Integer, H As Integer, iColor As Integer) + + Dim I, J, C As Integer + + If iColor And &HFF000000 Then + + Paint.Save + Paint.Rectangle(X, Y, W, H) + Paint.Clip + + For J = 0 To W + 7 Step 8 + For I = 0 To H + 7 Step 8 + + If ((I + J) \ 8) And 1 Then + C = Color.Blend(iColor, &H808080) + Else + C = Color.Blend(iColor, &HC0C0C0) + Endif + + Paint.FillRect(X + I, Y + J, 8, 8, C) + + Next + Next + + Paint.Restore + + Else + + Paint.FillRect(X, Y, W, H, iColor) + + Endif + +End + +Public Sub NormalizePath(sPath As String) As String + + Dim iLen As Integer + + Do + iLen = Len(sPath) + sPath = Replace(sPath, "//", "/") + If Len(sPath) = iLen Then Break + Loop + + If Len(sPath) > 1 And If Right(sPath) = "/" Then sPath = Left(sPath, -1) + + If Not sPath Then Error.Raise("Void path") + + Return sPath + +End + +#If False +Private Sub AddUnique(aStr As String[], sVal As String) + + If Not aStr.Exist(sVal) Then aStr.Add(sVal) + +End + +Private Sub MakeMap() + + Dim aKey As New String[] + Dim sPath As String + Dim sLine As String + Dim hFile As File + Dim aLine As String[] + Dim sKey As String + Dim sIcon As String + Dim aIcon As String[] + Dim cIcon As New Collection + + For Each sPath In ["map/gnome.map", "map/kde4.map"] + + hFile = Open sPath + For Each sLine In hFile.Lines + + If Left(sLine) = ";" Then Continue + + aLine = Split(sLine, " ", "", True) + sKey = Trim(aLine[0]) + AddUnique(aKey, sKey) + + If Not cIcon.Exist(sKey) Then cIcon[sKey] = New String[] + If aLine.Count >= 2 Then + aIcon = cIcon[sKey] + For Each sIcon In Split(Trim(aLine[1]), ";") + AddUnique(aIcon, sIcon) + Next + Endif + + Next + + Next + + hFile = Open Application.Path &/ "map/icon.map" For Create + aKey.Sort + For Each sKey In aKey + Print #hFile, sKey; Space$(Max(1, 24 - Len(sKey))); cIcon[sKey].Join(";") + Next + Close #hFile + +End +#Endif + +Public Sub MkDir(Path As String) + + Dim sElt As String + Dim sMake As String = "/" + + For Each sElt In Split(Path, "/") + sMake &/= sElt + If IsDir(sMake) Then Continue + Try Mkdir sMake + Next + +End + +Public Sub Main() + + Dim hPicture As Picture + + Application.Theme = "Elementary" + hPicture = Picture["icon:/32/align-top"] + Print hPicture + +End + +Public Sub Task_Read(sData As String) + + Debug sData + +End + +Public Sub Task_Error(Data As String) + + Debug Data + +End + + +Public Sub Task_Kill() + + Dim sStr As String + Try sStr = Last.Value + If Error Then + Debug Error.Text + Else + Debug "->";; sStr + Endif + + +End diff --git a/comp/src/gb.form/.src/MaskBox.class b/comp/src/gb.form/.src/MaskBox.class new file mode 100644 index 00000000..02ee2e94 --- /dev/null +++ b/comp/src/gb.form/.src/MaskBox.class @@ -0,0 +1,748 @@ +' Gambas class file + +Export + +Inherits TextBox + +Public Const _Properties As String = "*,-Password,-MaxLength,Action,Filter,Mask,ShowDefault" +'Public Const _DefaultEvent As String = "Click" +'Public Const _DefaultSize As String = "24,4" +Public Const _Similar As String = "TextBox" +Public Const _DrawWith As String = "TextBox" + +Event Filter(Char As String) + +Property Mask As String +Property Filter As String +Property ShowDefault As Boolean +'Property Text As String + +Private $hObserver As Observer + +Private Const MASK_CHARACTER As String = "90A6?" +Private Const MASK_DEFAULT As String = "_0___" +Private Const UNMASKED_CHAR As String = "\xFF" + +Private $sMaskOrg As String + +Private $aMask As New String[] +Private $sDefault As String +Private $sSeparator As String +Private $sAlign As String + +Private $iPosFocus As Integer +Private $bShowDefault As Boolean + +Private $sFilter As String + +Public Sub _new() + + $hObserver = New Observer(Me) As "TextBox" + +End + +Private Function Mask_Read() As String + + Return $sMaskOrg + +End + +Private Sub GetDefaultCharacter(iPos As Integer) As String + + Dim sCar As String = String.Mid$($sDefault, iPos + 1, 1) + If sCar = "." Then sCar = String.Mid$($sSeparator, iPos + 1, 1) + Return sCar + +End + + +Private Sub MakeDefault() As String + + Dim sDefault As String + Dim iInd As Integer + + For iInd = 0 To $aMask.Max + sDefault &= GetDefaultCharacter(iInd) + Next + + Return RTrim(sDefault) + +End + +Private Sub GetFirstCharacterPos() As Integer + + Dim iPos As Integer + + For iPos = 0 To $aMask.Max + If $aMask[iPos] Then Return iPos + Next + +End + +Private Sub GetLastCharacterPos() As Integer + + Dim iPos As Integer + + For iPos = $aMask.Max DownTo 0 + If $aMask[iPos] Then Return iPos + 1 + Next + +End + +Private Sub UpdateMaskAndSeparator(sMask As String) + + Dim iPos, iPos2 As Integer + Dim sCar As String + Dim iLen As Integer + Dim aMask As New String[] + Dim sSeparator As String + Dim sAlign As String + Dim sDefault As String + Dim iPosFocus As Integer + + iLen = String.Len(sMask) + + For iPos = 1 To iLen + sCar = String.Mid$(sMask, iPos, 1) + If sCar = "[" Then + iPos2 = String.InStr(sMask, "]", iPos) + If iPos2 = 0 Then Error.Raise("Bad mask") + aMask.Add(String.Mid$(sMask, iPos, iPos2 - iPos + 1)) + iPos = iPos2 + sSeparator &= String.Chr(&H2007) + sDefault &= " " + Continue + Else If sCar = "<" Then + If aMask.Count And If aMask[aMask.Max] Then + sAlign &= Space$(aMask.Count - 1 - Len(sAlign)) & "<" + Endif + Else If sCar = "!" Then + iPosFocus = aMask.Count + Else If sCar = "?" Then + aMask.Add(sCar) + sSeparator &= String.Chr(&H2007) + sDefault &= " " + ' Else If sCar = "0" Then + ' aMask.Add("[0-9]") + ' sSeparator &= " " + ' sDefault &= "0" + Else If sCar = "0" Then + aMask.Add("[0-9]") + sSeparator &= String.Chr(&H2007) + sDefault &= "0" + Else If sCar = "#" Or If sCar = "9" Then + aMask.Add("[0-9]") + sSeparator &= String.Chr(&H2007) + sDefault &= " " + Else If sCar = "A" Then + aMask.Add("[A-Za-z]") + sSeparator &= String.Chr(&H2007) + sDefault &= " " + Else If sCar = "\\" And If iPos < iLen Then + aMask.Add("") + Inc iPos + sSeparator &= String.Mid$(sMask, iPos, 1) + sDefault &= "." + Else + aMask.Add("") + sSeparator &= sCar + sDefault &= "." + Endif + Next + + $sMaskOrg = sMask + $aMask = aMask + $sSeparator = sSeparator + $sAlign = sAlign + $sDefault = sDefault + $iPosFocus = iPosFocus + 'If $sMaskChar Then $sDefault = Replace($sDefault, "_", $sMaskChar) + +End + + +Private Sub Mask_Write(Value As String) + + UpdateMaskAndSeparator(Value) + + If Not $sMaskOrg Then Return + + If Not IsValid(Me.Text) Then + Clear() + Endif + + Me.Pos = GetFirstCharacterPos() + +End + +' Private Sub IsMaskCharacter(sCar As String) As Boolean +' +' Return InStr(MASK_CHARACTER, sCar) +' +' End + +Private Sub GetPreviousSeparator(iPos As Integer, Optional sSep As String) As Integer + + Dim sCar As String + + If iPos < 0 Then Return -1 + + While iPos >= 0 + sCar = $aMask[iPos] + If Not sCar Then + If Not sSep Then Break + If sSep = String.Mid$($sSeparator, iPos + 1, 1) Then Break + Endif + Dec iPos + Wend + + Return iPos + +End + +Private Sub GetNextSeparator(iPos As Integer, Optional sSep As String) As Integer + + Dim sCar As String + + If iPos < 0 Then Return 0 + + While iPos < $aMask.Count + sCar = $aMask[iPos] + If Not sCar Then + If Not sSep Then Break + If sSep = String.Mid$($sSeparator, iPos + 1, 1) Then Break + Endif + Inc iPos + Wend + + Return iPos + +End + +Private Sub GetNextCharacter(sText As String, iPos As Integer) As Integer + + Dim iLen As Integer = String.Len(sText) + + If iPos < 0 Then Return 0 + + While iPos < iLen + If $aMask[iPos] Then Break + Inc iPos + Wend + + Return iPos + +End + +Private Sub IsRightAlign(iPos As Integer) As Boolean + + iPos = GetNextSeparator(iPos) + If iPos = 0 Then Return + Return Mid$($sAlign, iPos, 1) = "<" + +End + +Private Sub UnmaskText(sText As String) As String + + Dim iPos As Integer + Dim sResult As String + Dim sCar As String + + For iPos = 1 To String.Len(sText) + sCar = String.Mid$(sText, iPos, 1) + If $aMask[iPos - 1] And If sCar = GetDefaultCharacter(iPos - 1) Then sCar = UNMASKED_CHAR + sResult &= sCar + Next + + Return sResult + +End + +Private Sub MaskText(sText As String) As String + + Dim iPos As Integer + Dim sResult As String + Dim sCar As String + Dim sMask As String + Dim bNumber As Boolean + + For iPos = 1 To String.Len(sText) + sCar = String.Mid$(sText, iPos, 1) + If sCar = UNMASKED_CHAR Then sCar = GetDefaultCharacter(iPos - 1) + + sMask = $aMask[iPos - 1] + If sMask = "" Then + bNumber = False + Else If sMask = "[0-9]" Then + If iPos < String.Len(sText) And If $aMask[iPos] Then + If sCar = "0" Or If sCar = " " Then + If Not bNumber Then + sCar = GetDefaultCharacter(iPos - 1) + Else + sCar = "0" + Endif + Else + bNumber = True + Endif + Else + bNumber = True + Endif + Endif + sResult &= sCar + Next + + Return sResult + +End + +Private Sub GotoCursor(iPos As Integer) As Boolean + + Dim sText As String = Me.Text + Dim sCar As String + + If IsRightAlign(iPos) Then + While iPos < Me.Length + sCar = String.Mid$(sText, iPos + 1, 1) + If sCar <> " " And If sCar <> "0" Then + Break + Endif + Inc iPos + Wend + Endif + + If Me.Pos <> iPos Then + Me.Pos = iPos + Return True + Endif + +End + + +Public Sub TextBox_KeyPress() + + Dim sText, sTextOrg As String + Dim iOldPos, iPos, iPosPrev, iPosNext As Integer + Dim iMove As Integer + Dim sCar As String + Dim sInsert As String + Dim bDelete As Boolean + Dim bBefore As Boolean + Dim bChange As Boolean + + If Not $sMaskOrg Then Return + If Me.ReadOnly Then + Return + Endif + + sText = UnmaskText(Me.Text) + sTextOrg = sText + + If Me.Selected Then + iPos = GetNextCharacter(sText, Me.Selection.Start) + Else + iPos = Me.Pos + Endif + + Select Key.Code + + Case Key.Left + iMove = -1 + + Case Key.Right + iMove = 1 + + Case Key.Home + iPos = GetFirstCharacterPos() + + Case Key.End + iPos = GetLastCharacterPos() + + Case Key.Delete + If iPos < Me.Length + iMove = 0 + bDelete = True + bBefore = IsRightAlign(iPos + 1) + Endif + + Case Key.BackSpace + If iPos > 0 Then + iMove = -1 + bDelete = True + bBefore = IsRightAlign(iPos) + Endif + + Case Key.Tab, Key.BackTab, Key.Up, Key.Down, Key.Enter, Key.Return + Return + + Case Else + + If Key.Code = Key["A"] And If Key.Control Then + Me.SelectAll + Stop Event + Return + Endif + + If Key.Text Then + + bBefore = IsRightAlign(iPos) + + If bBefore Then + If iPos > 0 Then + sCar = $aMask[iPos - 1] + Else + sCar = "" + Endif + If sCar And If Key.Text Like sCar Then + sInsert = Key.Text + iMove = 0 + Endif + Else If iPos < $aMask.Count Then + sCar = $aMask[iPos] + If sCar And If Key.Text Like sCar Then + sInsert = Key.Text + iMove = 1 + Endif + Endif + + If Not sInsert Then + iPosNext = GetNextSeparator(iPos, Key.Text) + While iPosNext < Me.Length + If iPosNext < $aMask.Max And If $aMask[iPosNext + 1] Then Break + Inc iPosNext + Wend + If iPosNext >= Me.Length Then Goto DO_NOTHING + iPos = iPosNext + iMove = 1 + Endif + + Endif + + End Select + + If sInsert Or If Key.Code = Key.Delete Or If Key.Code = Key.BackSpace Then + If Me.Selected Then + If Me.Selection.Length = Me.Length Then sText = MakeDefault() + 'sText = String.Left$(sText, Me.Selection.Start) & String.Mid$(sDefault, Me.Selection.Start + 1, Me.Selection.Length) & String.Mid$(sText, Me.Selection.Start + Me.Selection.Length + 1) + iPos = GetNextCharacter(sText, Me.Selection.Start) + Me.Selection.Hide + Endif + Endif + + If sInsert Then + If Not bBefore Then + sText = String.Left(sText, iPos) & sInsert & String.Mid$(sText, iPos + 2) + Else + iPosNext = iPos + While iPos > 0 + If Not $aMask[iPos - 1] Then Break + Dec iPos + Wend + If String.Mid$(sText, iPos + 1, 1) = UNMASKED_CHAR Then + sText = String.Left(sText, iPos) & String.Mid$(sText, iPos + 2, iPosNext - iPos - 1) & sInsert & String.Mid$(sText, iPosNext + 1) + Endif + iPos = iPosNext + Endif + Endif + + If iMove Then + + iOldPos = iPos + Do + iPos += iMove + If iPos < 0 Then + iPos = GetFirstCharacterPos() + Break + Endif + If iPos >= Me.Length Then + iPos = GetLastCharacterPos() + Break + Endif + If $aMask[iPos] Then Break + Loop + + If IsRightAlign(iPos) Then + Do + If (iPos + iMove) < 0 Then Break + If (iPos + iMove) > Me.Length Then Break + sCar = String.Mid$(sText, iPos + 1, 1) + If sCar <> UNMASKED_CHAR And If sCar <> "0" Then Break + iPos += iMove + Loop + Endif + + Endif + + If bDelete Then + iPosNext = GetNextSeparator(iPos) + If iPosNext > iPos Then + If bBefore Then + iPosPrev = GetPreviousSeparator(iPos) + sText = String.Left(sText, iPosPrev + 1) & UNMASKED_CHAR & String.Mid$(sText, iPosPrev + 2, iPos - iPosPrev - 1) & String.Mid$(sText, iPos + 2) + Inc iPos + Else + sText = RTrim(String.Left(sText, iPos) & String.Mid$(sText, iPos + 2, iPosNext - iPos - 1) & UNMASKED_CHAR & String.Mid$(sText, iPosNext + 1)) + Endif + Endif + Endif + + Object.Lock(Me) + If sText <> sTextOrg Then + sText = MaskText(sText) + If Me.Text <> sText Then + Me.Text = sText + bChange = True + Endif + + If IsRightAlign(iPos) Then + While iPos < Me.Length + If String.Mid$(sText, iPos + 1, 1) <> " " Then Break + Inc iPos + Wend + Endif + Endif + Object.Unlock(Me) + + GotoCursor(iPos) + + If bChange Then Raise Change + + 'Me.Select(iPos, 1) + +DO_NOTHING: + + Stop Event + +End + +' Private Function MaskChar_Read() As String +' +' Return $sMaskChar +' +' End +' +' Private Sub MaskChar_Write(Value As String) +' +' Dim sText As String +' Dim iPos As Integer +' Dim sCar As String +' Dim aPos As New Integer[] +' +' Value = String.Left(Value) +' sText = Me.Text +' +' For iPos = 0 To $aMask.Max +' sCar = $aMask[iPos] +' If Not sCar Or If String.Mid$($sDefault, iPos + 1, 1) <> "_" Then Continue +' If String.Mid$(sText, iPos + 1, 1) = GetDefaultCharacter(iPos) Then aPos.Add(iPos) +' Next +' +' $sMaskChar = Value +' UpdateMaskAndSeparator($sMaskOrg) +' +' For Each iPos In aPos +' sText = String.Left(sText, iPos) & GetDefaultCharacter(iPos) & String.Mid$(sText, iPos + 2) +' Next +' +' Me.Text = RTrim(sText) +' Me.Pos = GetFirstCharacterPos() +' +' End + +Public Sub TextBox_GotFocus() + + If Not $sMaskOrg Then Return + TextBox_Change + GotoCursor($iPosFocus) + +End + +Public Sub TextBox_LostFocus() + + If Not $sMaskOrg Then Return + TextBox_Change + GotoCursor($iPosFocus) + +End + +Public Sub TextBox_Menu() + + If Not $sMaskOrg Then Return + Stop Event + +End + +Public Sub TextBox_Change() + + Dim I As Integer + Dim sText As String + Dim sCar As String + Dim sNewText As String + Dim iPos As Integer + Dim iDec As Integer + Dim bStop As Boolean + Dim bCanRaise As Boolean + + bCanRaise = Object.CanRaise(Me, "Filter") + + If $sFilter Or If bCanRaise Then + + sText = Me.Text + iPos = Me.Pos + For I = 1 To String.Len(sText) + sCar = String.Mid$(sText, I, 1) + If $sFilter And If sCar Like $sFilter Then + sNewText &= sCar + Continue + Endif + If bCanRaise Then + bStop = Raise Filter(sCar) + If Not bStop Then + sNewText &= sCar + Continue + Endif + Endif + + If I <= iPos Then Inc iDec + + Next + + If sNewText <> sText Then + Object.Lock(Me) + Me.Text = sNewText + Me.Pos = iPos - iDec + Object.Unlock(Me) + Endif + + Endif + + If $sMaskOrg Then + + Object.Lock(Me) + If Me.HasFocus Or If $bShowDefault Then + If Me.Text = "" Then Me.Text = MakeDefault() + Else + If Me.Text = MakeDefault() Then Me.Text = "" + Endif + Object.Unlock(Me) + + Endif + +End + +Private Function ShowDefault_Read() As Boolean + + Return $bShowDefault + +End + +Private Sub ShowDefault_Write(Value As Boolean) + + $bShowDefault = Value + TextBox_Change + +End + +Private Sub IsValid(sText As String) As Boolean + + Dim I As Integer + Dim sMask As String + Dim sCar As String + Dim bStop As Boolean + Dim bCanRaise As Boolean + + bCanRaise = Object.CanRaise(Me, "Filter") + + If $sFilter Or If bCanRaise Then + + For I = 1 To String.Len(sText) + + sCar = String.Mid$(sText, I, 1) + + If $sFilter And If sCar Like $sFilter Then Continue + If bCanRaise Then + bStop = Raise Filter(sCar) + If Not bStop Then Continue + Endif + + Return False + + Next + + Endif + + If $sMaskOrg Then + + If String.Len(sText) > $aMask.Count Then Return False + + For I = 1 To String.Len(sText) + + sCar = String.Mid$(sText, I, 1) + sMask = $aMask[I - 1] + If sMask Then + If sCar Not Like sMask Then Return False + Else + If sCar <> String.Mid$($sSeparator, I, 1) Then Return False + Endif + + Next + + Endif + + Return True + +End + + +Public Sub Clear() + + If Me.HasFocus Then + Me.Text = MakeDefault() + Else + Me.Text = "" + Endif + +End + +Private Function Filter_Read() As String + + Return $sFilter + +End + +' Private Sub MakeFilter() +' +' Dim aFilter As New String[] +' Dim sFilter As String +' Dim iPos As Integer +' +' sFilter = $sFilterOrg +' $sFilter = "" +' +' While sFilter +' +' If Left(sFilter) = "[" Then +' iPos = InStr(sFilter, "]") +' If iPos Then +' aFilter.Add(Mid$(sFilter, 2, iPos - 2)) +' sFilter = Mid$(sFilter, iPos + 1) +' Continue +' Endif +' Endif +' +' $sFilter &= String.Left(sFilter) +' sFilter = String.Mid$(sFilter, 2) +' +' Wend +' +' $sFilterLike = "[" & aFilter.Join("") & "]" +' +' End + +Private Sub Filter_Write(Value As String) + + $sFilter = Value + If Not IsValid(Me.Text) Then + Clear() + Endif + +End diff --git a/comp/src/gb.form/.src/Message/FMessage.class b/comp/src/gb.form/.src/Message/FMessage.class new file mode 100644 index 00000000..a75bf7cc --- /dev/null +++ b/comp/src/gb.form/.src/Message/FMessage.class @@ -0,0 +1,87 @@ +' Gambas class file + +Static Private $sIcon As String +Static Private $aButtons As String[] +Static Private $sKey As String +Static Private $sText As String + + +Static Public Sub Run(sIcon As String, sText As String, aButtons As String[], Optional sKey As String, Optional Force As Boolean) As Integer + + If sKey And If Settings["/HiddenMessage" &/ sKey, False] And If Not Force Then Return + + $sIcon = sIcon + $aButtons = aButtons + $sKey = sKey + $sText = sText + + Return Me.ShowModal() + +End + +Public Sub _new() + + Dim hButton As Button + Dim iTag As Integer + Dim W, H As Integer + + If Message.Title Then Me.Title = Message.Title + + If Not $sIcon Then $sIcon = "info" + Try picIcon.Picture = Picture["icon:/64/" &/ $sIcon] + If Error Then picIcon.Picture = Picture["icon:/64/info"] + picIcon.W = 64 + + chkDoNotDisplayAnymore.Visible = $sKey + If $sKey Then chkDoNotDisplayAnymore.Value = Settings["/HiddenMessage" &/ $sKey, False] + + panButton.Children.Clear + + W = Desktop.Scale * 12 + For iTag = 0 To $aButtons.Max + hButton = New Button(panButton) As "Button" + hButton.Text = $aButtons[iTag] + hButton.Tag = iTag + W = Max(W, hButton.Font.TextWidth($aButtons[iTag]) + Desktop.Scale * 4) + If iTag = 0 Then + hButton.Default = True + hButton.SetFocus + Else If iTag = $aButtons.Max Then + hButton.Cancel = True + Endif + Next + + For Each hButton In panButton.Children + hButton.Resize(W, Desktop.Scale * 4) + Next + + W = Max(Desktop.Scale * 48, W * $aButtons.Count + Desktop.Scale * ($aButtons.Count + 2)) + + 'panMessage.Arrangement = Arrange.None + txtMessage.Ignore = True + txtMessage.W = W - picIcon.W - Desktop.Scale * 3 + txtMessage.Text = $sText + H = Max(64, txtMessage.H) + 'Print "-->";; txtMessage.W;; txtMessage.H + txtMessage.Ignore = False + 'panMessage.Arrangement = Arrange.Horizontal + + H += panButton.H + Desktop.Scale * 5 + If chkDoNotDisplayAnymore.Visible Then H += Desktop.Scale + chkDoNotDisplayAnymore.H + + Me.Resize(W, H) + +End + +Public Sub Button_Click() + + 'Debug txtMessage.W;; txtMessage.H + Me.Close(Last.Tag) + +End + +Public Sub chkDoNotDisplayAnymore_Click() + + If $sKey Then Settings["/HiddenMessage" &/ $sKey] = chkDoNotDisplayAnymore.Value <> 0 + +End diff --git a/comp/src/gb.form/.src/Message/FMessage.form b/comp/src/gb.form/.src/Message/FMessage.form new file mode 100644 index 00000000..e36d2688 --- /dev/null +++ b/comp/src/gb.form/.src/Message/FMessage.form @@ -0,0 +1,43 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,65,23) + Resizable = False + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + { panMessage Panel + MoveScaled(1,1,62,7) + Expand = True + Arrangement = Arrange.Horizontal + Spacing = True + { picIcon PictureBox + MoveScaled(1,1,6,5) + } + { txtMessage TextLabel + MoveScaled(11,1,49,3) + Expand = True + AutoResize = True + } + } + { chkDoNotDisplayAnymore CheckBox + MoveScaled(1,14,62,3) + Text = ("Do not display this message again") + } + { HBox2 HBox + MoveScaled(2,18,62,4) + { Panel2 Panel + MoveScaled(4,0,1,3) + Expand = True + } + { panButton HBox + MoveScaled(13,0,39,4) + AutoResize = True + Spacing = True + } + { Panel3 Panel + MoveScaled(56,0,3,4) + Expand = True + } + } +} diff --git a/comp/src/gb.form/.src/Message/Message.module b/comp/src/gb.form/.src/Message/Message.module new file mode 100644 index 00000000..9483bb34 --- /dev/null +++ b/comp/src/gb.form/.src/Message/Message.module @@ -0,0 +1,9 @@ +' Gambas module file + +Export + +Public Sub Optional((Message) As String, (Button) As String, (Key) As String, Optional Icon As String, Optional Force As Boolean) As Integer + + Return FMessage.Run(Icon, Message, [Button], Key, Force) + +End diff --git a/comp/src/gb.form/.src/Message/MessageView.class b/comp/src/gb.form/.src/Message/MessageView.class new file mode 100644 index 00000000..aa99c0a7 --- /dev/null +++ b/comp/src/gb.form/.src/Message/MessageView.class @@ -0,0 +1,235 @@ +' Gambas class file + +Export +Inherits UserControl + +Public Const _Properties As String = "*,Border,Animated,Separator" +Public Const _DefaultSize As String = "32,6" +Public Const _Group As String = "View" +Public Const _DrawWith As String = "DrawingArea" + +Event Open +Event Close + +Property Animated As Boolean +Property Separator As Boolean +Property Border As Boolean + +Private $sText As String +Private $hIcon As Picture +Private $hView As DrawingArea +Private $hClose As Button +Private $bAnimate As Boolean +Private $bSeparator As Boolean +Private $H As Integer + +Private $aText As New String[] +Private $aIcon As New Picture[] + +Public Sub _new() + + $hView = New DrawingArea(Me) As "View" + $hView.Background = Color.TextBackground + $hView.Foreground = Color.TextForeground + + $hClose = New Button($hView) As "CloseButton" + $hClose.H = Desktop.Scale * 4 + $hClose.AutoResize = True + + Me.Proxy = $hView + + Me.Hide + +End + +Private Sub UpdateButton() + + If $aText.Count Then + $hClose.Text = ("Next") + Try $hClose.Picture = Picture["icon:/small/forward"] + Else + $hClose.Text = ("Close") + Try $hClose.Picture = Picture["icon:/small/close"] + Endif + +End + +Private Sub GetTextWidth() As Integer + + Return Max(16, Me.Parent.ClientW - $hIcon.W - $hClose.W - Desktop.Scale * 6) + +End + + +Private Sub DoOpen() + + Dim fTime As Float + + UpdateButton + Me.H = 1 + Me.Show + + $H = Max($hIcon.H + Desktop.Scale * 2, Me.Font.RichTextHeight($sText, GetTextWidth()) + Desktop.Scale * 4) + + If $bAnimate And If Application.Animations Then + + fTime = Timer + + While Me.H < $H + Me.H = $H * Min(1, (Timer - fTime) * 8) + Try Wait + Wend + + Endif + + Me.H = $H + + Raise Open + +End + + +Public Sub Open(Text As String, Optional Icon As Picture) + + If $sText = Text Then Return + + If Me.Visible Then + + $aText.Add(Text) + $aIcon.Add(Icon) + UpdateButton + Return + + Endif + + $sText = Text + $hIcon = Icon + If Not Icon Then + Try $hIcon = Picture["icon:/32/warning"] + If Error Then $hIcon = Picture["img/32/warning.png"] + Endif + + DoOpen + +End + +Public Sub Close() + + Dim fTime As Float + Dim H As Integer + + If $bAnimate And If Application.Animations Then + + H = Me.H + fTime = Timer + While Me.H > 1 + Me.H = H * (1 - Min(1, (Timer - fTime) * 8)) + Wait + Wend + + Endif + + Me.Hide + + Raise Close + + If $aText.Count Then + $sText = $aText[0] + $hIcon = $aIcon[0] + $aText.Remove(0) + $aIcon.Remove(0) + DoOpen + Else + $sText = "" + $hIcon = Null + Endif + +End + + +Public Sub View_Arrange() + + $hClose.Move($hView.W - $hClose.W - Desktop.Scale, ($H - $hClose.H) \ 2) + +End + +Public Sub View_DblClick() + + Close() + +End + + +Public Sub CloseButton_Click() + + Close() + +End + +Public Sub View_Draw() + + Dim X, W As Integer + + W = Me.W - Desktop.Scale * 2 + + If $hIcon Then + Paint.DrawPicture($hIcon, Desktop.Scale, Desktop.Scale) + X += $hIcon.W + Desktop.Scale * 3 + W -= $hIcon.W - Desktop.Scale * 2 + Endif + + W = GetTextWidth() + + Paint.DrawRichText($sText, X, Desktop.Scale * 2, W, Me.H - Desktop.Scale * 2, Align.TopLeft) + + If $bSeparator Then + If Me.Y > 0 Then + If IsNull(Me.Previous) Or If Not Me.Previous Is Separator Then + Paint.FillRect(0, 0, Me.W, 1, Color.LightForeground) + Endif + Endif + If Me.Y + Me.H < Me.Parent.ClientH Then + If IsNull(Me.Next) Or If Not Me.Next Is Separator Then + Paint.FillRect(0, Me.H - 1, Me.W, 1, Color.LightForeground) + Endif + Endif + Endif + +End + +Private Function Animated_Read() As Boolean + + Return $bAnimate + +End + +Private Sub Animated_Write(Value As Boolean) + + $bAnimate = Value + +End + +Private Function Separator_Read() As Boolean + + Return $bSeparator + +End + +Private Sub Separator_Write(Value As Boolean) + + $bSeparator = Value + $hView.Refresh + +End + +Private Function Border_Read() As Boolean + + Return $hView.Border + +End + +Private Sub Border_Write(Value As Boolean) + + $hView.Border = If(Value, Border.Plain, Border.None) + +End diff --git a/comp/src/gb.form/.src/MessageLabel.class b/comp/src/gb.form/.src/MessageLabel.class new file mode 100644 index 00000000..b3675259 --- /dev/null +++ b/comp/src/gb.form/.src/MessageLabel.class @@ -0,0 +1,151 @@ +' Gambas class file + +'Export +Inherits TextLabel + +Event Change + +Private $ErrorColor As Integer = Color.Red +Private $InfoColor As Integer = Color.Green +Private $WarningColor As Integer = Color.Yellow +Private $CustomColor As Integer = Color.Background +Private $iBackground As Integer = Color.Default +Private $hTimer As Timer +Private $bGetColor As Boolean = True + +Public Const _Properties As String = "*,Background{Color},Delay=500,InfoColor{Color},ErrorColor{Color},WarningColor{Color},CustomColor{Color}" +Public Const _DefaultEvent As String = "Change" +Public Const _DefaultSize As String = "24,3" +Public Const _DrawWith As String = "TextLabel" + +Public Const Info As Integer = 0 +Public Const {Error} As Integer = 1 +Public Const Warning As Integer = 2 +Public Const Custom As Integer = 3 + +Property Delay As Integer +Property ErrorColor As Integer +Property InfoColor As Integer +Property WarningColor As Integer +Property CustomColor As Integer +Property Background As Integer + +Public Sub _new() + + $hTimer = New Timer As "hTimer" + $hTimer.Enabled = False + +End + +Public Sub hTimer_Timer() + + Me.Background = $iBackground + $hTimer.Enabled = False + +End + +Public Procedure Message((Message) As String, Optional State As Integer) + + $bGetColor = False + Me.Text = Message + Select State + Case 2 + Me.Background = $ErrorColor + Case 3 + Me.Background = $WarningColor + Case 4 + Me.Background = $CustomColor + Default + Me.Background = $InfoColor + End Select + $hTimer.Start() + Raise Change + +End + +Public Procedure Clear() + + Me.Text = "" + Me.Background = $iBackground + +End + +Private Function Delay_Read() As Integer + + Return $hTimer.Delay + +End + +Private Sub Delay_Write(Value As Integer) + + $hTimer.Delay = Value + +End + +Private Function ErrorColor_Read() As Integer + + Return $ErrorColor + +End + +Private Sub ErrorColor_Write(Value As Integer) + + $ErrorColor = Value + +End + +Private Function InfoColor_Read() As Integer + + Return $InfoColor + +End + +Private Sub InfoColor_Write(Value As Integer) + + $InfoColor = Value + +End + +Private Function WarningColor_Read() As Integer + + Return $WarningColor + +End + +Private Sub WarningColor_Write(Value As Integer) + + $WarningColor = Value + +End + +Private Function CustomColor_Read() As Integer + + Return $CustomColor + +End + +Private Sub CustomColor_Write(Value As Integer) + + $CustomColor = Value + +End + +' Private Function Text_Read() As String +' +' Return Super.Text +' +' End + +Private Function Background_Read() As Integer + + Return Super.Background + +End + +Private Sub Background_Write(Value As Integer) + + Super.Background = Value + If $bGetColor Then $iBackground = Value + $bGetColor = True + +End diff --git a/comp/src/gb.form/.src/MultiContainer/_MultiContainer.class b/comp/src/gb.form/.src/MultiContainer/_MultiContainer.class new file mode 100644 index 00000000..4cfa970d --- /dev/null +++ b/comp/src/gb.form/.src/MultiContainer/_MultiContainer.class @@ -0,0 +1,237 @@ +' Gambas class file + +Export +Create Private + +Inherits UserContainer + +'Public Const _Properties As String = "*,Count{Range:1;256}=1,Index,Text,Picture" +'Public Const _Similar As String = "TabStrip" +'Public Const _IsMultiContainer As Boolean = True +'Public Const _DefaultEvent As String = "Click" + +Event Click + +Property Count As Integer +Property Index As Integer +Property Text As String +Property Picture As Picture +Property Read Current As _MultiContainerTab + +Private $aCont As New _MultiContainerTab[] +Private $iCurrent As Integer = -1 + +' Public Sub _new() +' +' Me.Count = 1 +' Me.Arrangement = Arrange.None +' +' End + +Private Function Count_Read() As Integer + + Return $aCont.Count + +End + +Public Sub _SetCount((iCount) As Integer) + +End + + +Private Sub Count_Write(iCount As Integer) + + Dim iCurrent As Integer + + If iCount < 1 Then Error.Raise("Bad argument") + If iCount = $aCont.Count Then Return + + iCurrent = $iCurrent + + Object.Lock(Me) + + Me._SetCount(iCount) + + $iCurrent = -1 + If iCurrent < 0 Then iCurrent = $aCont.Max + + Object.Unlock(Me) + + Try Index_Write(iCurrent) + +End + +Private Function Index_Read() As Integer + + Return $iCurrent + +End + +Public Sub _SetIndex((iIndex) As Integer) + + + +End + + +Private Sub Index_Write(iIndex As Integer) + + If iIndex < 0 Or iIndex >= $aCont.Count Then Error.Raise("Bad index") + + If iIndex = $iCurrent Then Return + + Me._SetIndex(iIndex) + $iCurrent = iIndex + + UpdateContainer + + Me._Container = $aCont[$iCurrent] + + Raise Click + +End + +Public Sub _UpdateContainer((hCont) As Container) + + + +End + + +Private Sub UpdateContainer() + + Dim iInd As Integer + + For iInd = 0 To $aCont.Max + + With $aCont[iInd] + If iInd = $iCurrent Then + Me._UpdateContainer($aCont[iInd]) + .Show + '.Raise + Else If .Visible Then + .Hide + '.Move(0, - $hPanel.H) + Endif + End With + + Next + +End + +Private Function Text_Read() As String + + Return $aCont[$iCurrent].Text + +End + +Private Sub Text_Write(sText As String) + + $aCont[$iCurrent].Text = sText + +End + +Private Function Picture_Read() As Picture + + Return $aCont[$iCurrent].Picture + +End + +Private Sub Picture_Write(hPict As Picture) + + $aCont[$iCurrent].Picture = hPict + +End + +Public Function _get(Index As Integer) As Container + + If Index < 0 Or Index >= $aCont.Count Then Error.Raise("Bad index") + Return $aCont[Index] + +End + +Private Function Current_Read() As _MultiContainerTab + + Try Return $aCont[$iCurrent] + +End + +Public Sub _Remove((iIndex) As Integer) + + + +End + +Public Sub Remove(Index As Integer) + + Dim iCurrent As Integer + Dim hTab As _MultiContainerTab + + If Index < 0 Or Index > $aCont.Max Then Error.Raise("Bad index") + If $aCont.Count = 1 Then Return + + hTab = $aCont[Index] + If hTab.Children.Count Then Error.Raise("TabPanel container is not empty") + + Me._Remove(Index) + + $aCont.Remove(Index) + If $iCurrent = Index Then + $iCurrent = -1 + iCurrent = Min($aCont.Max, Index) + Index_Write(iCurrent) + Else If $iCurrent > Index Then + Dec $iCurrent + Endif + + hTab._Delete() + +End + +' Private Sub GetPreviousIndex(iIndex As Integer) As Integer +' +' Dim I As Integer +' +' For I = iIndex - 1 DownTo 0 +' If $aButton[I].Visible Then Return I +' Next +' Return -1 +' +' End +' +' Private Sub GetNextIndex(iIndex As Integer) As Integer +' +' Dim I As Integer +' +' For I = iIndex + 1 To $aButton.Max +' If $aButton[I].Visible Then Return I +' Next +' Return -1 +' +' End +' +' Public Sub _GetFirstIndex() As Integer +' +' Return GetNextIndex(-1) +' +' End +' +' Private Sub GetLastIndex() As Integer +' +' Return GetPreviousIndex($aButton.Count) +' +' End +' +' Public Sub _MovePrevious() +' +' Me.Index = GetPreviousIndex($iCurrent) +' +' End +' +' Public Sub _MoveNext() +' +' Me.Index = GetNextIndex($iCurrent) +' +' End + + diff --git a/comp/src/gb.form/.src/MultiContainer/_MultiContainerTab.class b/comp/src/gb.form/.src/MultiContainer/_MultiContainerTab.class new file mode 100644 index 00000000..0dec413f --- /dev/null +++ b/comp/src/gb.form/.src/MultiContainer/_MultiContainerTab.class @@ -0,0 +1,67 @@ +' Gambas class file + +Export +Create Private + +Inherits UserControl + +Property Text As String +Property RichText As String +Property Picture As Picture +Property Visible As Boolean +Property Read Container As Container + + +Private Function Text_Read() As String + + + +End + +Private Sub Text_Write((Value) As String) + + + +End + +Private Function RichText_Read() As String + + + +End + +Private Sub RichText_Write((Value) As String) + + + +End + +Private Function Picture_Read() As Picture + + + +End + +Private Sub Picture_Write((Value) As Picture) + + + +End + +Private Function Visible_Read() As Boolean + + + +End + +Private Sub Visible_Write((Value) As Boolean) + + + +End + +Private Function Container_Read() As Container + + Return Me + +End diff --git a/comp/src/gb.form/.src/SidePanel/FSidePanel.class b/comp/src/gb.form/.src/SidePanel/FSidePanel.class new file mode 100644 index 00000000..7c932471 --- /dev/null +++ b/comp/src/gb.form/.src/SidePanel/FSidePanel.class @@ -0,0 +1,1179 @@ +' Gambas class file + +'Static Private $hHandleH As Picture +'Static Private $hHandleV As Picture + +Private $iOrientation As Integer +Private $iArrowType As Integer +Private $bFixed As Boolean +Private $X As Integer +Private $Y As Integer +Private $W As Integer +Private $H As Integer +Private $bVisible As Boolean +Private $MX As Integer +Private $MY As Integer +Private $iMax As Integer +Private $bOpened As Boolean +Private $hArrow As Image +Private $bSeparator As Boolean +Private $bCanMove As Boolean +Private $bInside As Boolean +Private $bDblClick As Boolean +Private $bTransparent As Boolean +Private $iMinSize As Integer + +Private BUTTON_H As Integer +Private TRANS_H As Integer +Private BUTTON_W As Integer + +Private $hShowPanel As Panel +Private $hShowButtonLeft As DrawingArea +Private $hShowButtonRight As DrawingArea + +Private $hTimerAnim As Timer +Private $iTarget As Integer +Private $bLockRefresh As Boolean + +' Static Public Sub _init() +' +' $hHandleH = Picture["img/handle-h.png"] +' $hHandleV = Picture["img/handle-v.png"] +' +' End + + +Public Sub _new() + + $bVisible = True + $iOrientation = Align.Top + $iMinSize = Desktop.Scale * 8 + + BUTTON_H = Desktop.Scale * 0.75 + BUTTON_W = BUTTON_H * 4 + TRANS_H = Max(2, BUTTON_H * 0.5) + +End + + +Public Sub Form_Open() + + $bOpened = True + RefreshAll + +End + +Private Sub GetLangOrientation(iOrientation As Integer) As Integer + + If System.RightToLeft Then + If iOrientation = Align.Left Then + Return Align.Right + Else If iOrientation = Align.Right Then + Return Align.Left + Endif + Endif + + Return iOrientation + +End + + +Public Function GetOrientation() As Integer + + Return GetLangOrientation($iOrientation) + +End + +Public Sub SetOrientation(iOrientation As Integer) + + Select Case iOrientation + Case Align.Top, Align.Bottom + Case Align.Left, Align.Right + Case Else + Return + End Select + + $iOrientation = GetLangOrientation(iOrientation) + RefreshArrow + RefreshPanel + +End + +Private Sub RefreshPanel() + + Dim W As Integer + Dim W2 As Integer + Dim Y As Integer + Dim D As Integer + + 'IF NOT $bVisible THEN panSide.Hide + If Not $bOpened Then Return + + 'If $bSeparator Then S = 1 + + Select Case $iOrientation + + Case Align.Top, Align.Bottom + D = Me.ClientW + + Case Else + D = Me.ClientH + + End Select + + 'D = Max(0, D - 8) + + If D < (BUTTON_W * 2 + 16) Then + W = Min(BUTTON_W, D - 16) + W2 = 0 + Else + W = Min(BUTTON_W, D / 2) + W2 = Min(BUTTON_W, D - W) + Endif + + Select Case $iOrientation + + Case Align.Bottom, Align.Right + Y = 0 + + Case Align.Top + Y = Me.ClientH - BUTTON_H + + Case Align.Left + Y = Me.ClientW - BUTTON_H + + End Select + + Select Case $iOrientation + + Case Align.Top, Align.Bottom + + panMove.Move(0, Y, Me.ClientW, BUTTON_H) + + If Not $bTransparent Or If $bVisible Then + If W2 Then + btnSide.Move(0, 0, W, BUTTON_H) + btnSide2.Move(Me.ClientW - W2, 0, W2, BUTTON_H) + btnSide2.Show + Else + btnSide.Move(0, 0, W, BUTTON_H) + 'btnSide.Move((D - W) / 2, Y, W, BUTTON_H) + btnSide2.Hide + Endif + Endif + + ' W2 = ME.ClientW - W - W2 + ' IF W2 > 0 THEN + ' panMove.Move(W, Y, W2, BUTTON_H) + ' panMove.Show + ' ELSE + ' panMove.Hide + ' ENDIF + + Case Else + + panMove.Move(Y, 0, BUTTON_H, Me.ClientH) + + If Not $bTransparent Or If $bVisible Then + If W2 Then + btnSide.Move(0, 0, BUTTON_H, W) + btnSide2.Move(0, Me.ClientH - W2, BUTTON_H, W2) + btnSide2.Show + Else + btnSide.Move(0, 0, BUTTON_H, W) + 'btnSide.Move(Y, (D - W) / 2, BUTTON_H, W) + btnSide2.Hide + Endif + Endif + + ' W2 = ME.ClientH - W - W2 + ' IF W2 > 0 THEN + ' panMove.Move(Y, W, BUTTON_H, W2) + ' panMove.Show + ' ELSE + ' panMove.Hide + ' ENDIF + + End Select + + 'If $bTransparent Then panSide.Move(0, 0, Me.ClientW, Me.ClientH) + + If $bTransparent Then + D = 0 + Else + D = BUTTON_H + Endif + + Select Case $iOrientation + + Case Align.Bottom + sepSide.Move(0, 0, Me.ClientW, 1) + panSide.Move(0, D, Me.ClientW, Me.ClientH - D) + + Case Align.Top + sepSide.Move(0, Me.ClientH - 1, Me.ClientW, 1) + panSide.Move(0, 0, Me.ClientW, Me.ClientH - D) + + Case Align.Right + sepSide.Move(0, 0, 1, Me.ClientH) + panSide.Move(D, 0, Me.ClientW - D, Me.ClientH) + + Case Align.Left + sepSide.Move(Me.ClientW - 1, 0, 1, Me.ClientH) + panSide.Move(0, 0, Me.ClientW - D, Me.ClientH) + + End Select + + sepSide.Visible = $bSeparator And $bVisible + + 'IF $bVisible THEN panSide.Show + + 'DEBUG $bVisible;; "(";; ME.X;; ME.Y;; ME.W;; ME.H;; ") (";; btnSide.X;; btnSide.Y;; btnSide.W;; btnSide.H;; btnSide.Visible;; ") (";; panSide.X;; panSide.Y;; panSide.W;; panSide.H;; panSide.Visible;; ")" + 'STOP + +End + +Public Function GetContainer() As Panel + + Return panSide + +End + +Private Sub GetParent() As SidePanel + + Return Me.Parent + +End + + +Public Sub Form_Resize() + + RefreshPanel + MoveShowButton + GetParent()._Resize + +End + +Private Sub RefreshArrow() + + Dim iType As Integer + + If Not $bOpened Then Return + + Select Case $iOrientation + Case Align.Top, Align.Bottom + If $bVisible Xor ($iOrientation = Align.Bottom) Then + iType = Align.Top + 'hPict = Picture["img/8/side-top.png"] + Else + iType = Align.Bottom + 'hPict = Picture["img/8/side-bottom.png"] + Endif + Case Align.Left, Align.Right + If $bVisible Xor ($iOrientation = Align.Right) Then + iType = Align.Left + 'hPict = Picture["img/8/side-left.png"] + Else + iType = Align.Right + 'hPict = Picture["img/8/side-right.png"] + Endif + End Select + + If Not Component.IsLoaded("gb.gtk") Then $hArrow = Main.GetArrow(iType, Desktop.Scale * 2) + $iArrowType = iType + btnSide.Refresh + btnSide2.Refresh + + If Not $bFixed And Not Me.Parent.Design Then + If $bVisible Then + panMove.Mouse = If(IsVertical(), Mouse.SplitV, Mouse.SplitH) + Else + panMove.Mouse = Mouse.Pointing + Endif + Else + panMove.Mouse = Mouse.Default + Endif + +End + +Private Sub CreateShowButton(hParent As Container) As DrawingArea + + Dim hCtrl As DrawingArea + + hCtrl = New DrawingArea(hParent) As "ShowButton" + hCtrl.Ignore = True + hCtrl.Resize(Desktop.Scale, Desktop.Scale) + hCtrl.Mouse = Mouse.Pointing + hCtrl.Tooltip = Me.Parent.Tooltip + + Return hCtrl + +End + +Private Sub MoveShowButton() + + Dim D As Integer + Dim PH As Integer + Dim X, Y, W, H As Integer + + If $bVisible Then Return + If Not $bTransparent Then Return + If Not $hShowPanel Then Return + If Not Me.Parent.Visible Then Return + + D = If($bTransparent, TRANS_H, 0) + PH = If($bTransparent, TRANS_H, BUTTON_H) + + With Me.Parent + X = .X + Y = .Y + W = .W + H = .H + End With + + ' If Not $bVisible And If $bTransparent Then + ' If Me.Parent.Parent. + ' Select Case $iOrientation + ' Case Align.Top + ' Y = 0 + ' Case Align.Bottom + ' + ' End Select + ' Endif + + With Me.Parent + + Select Case $iOrientation + Case Align.Top + $hShowPanel.Move(.X, .Y, .W, PH) + If $hShowButtonLeft Then + $hShowButtonLeft.Move($hShowPanel.X, $hShowPanel.Y, BUTTON_W, BUTTON_H) + $hShowButtonRight.Move($hShowPanel.X + .W - BUTTON_W, $hShowPanel.Y, BUTTON_W, BUTTON_H) + Endif + Case Align.Bottom + $hShowPanel.Move(.X, .Y - D, .W, PH) + If $hShowButtonLeft Then + $hShowButtonLeft.Move($hShowPanel.X, .Y - BUTTON_H, BUTTON_W, BUTTON_H) + $hShowButtonRight.Move($hShowPanel.X + .W - BUTTON_W, .Y - BUTTON_H, BUTTON_W, BUTTON_H) + Endif + Case Align.Left + $hShowPanel.Move(.X, .Y, PH, .H) + If $hShowButtonLeft Then + $hShowButtonLeft.Move($hShowPanel.X, $hShowPanel.Y, BUTTON_H, BUTTON_W) + $hShowButtonRight.Move($hShowPanel.X, $hShowPanel.Y + .H - BUTTON_W, BUTTON_H, BUTTON_W) + Endif + Case Align.Right + $hShowPanel.Move(.X - D, .Y, PH, .H) + If $hShowButtonLeft Then + $hShowButtonLeft.Move(.X - BUTTON_H, $hShowPanel.Y, BUTTON_H, BUTTON_W) + $hShowButtonRight.Move(.X - BUTTON_H, $hShowPanel.Y + .H - BUTTON_W, BUTTON_H, BUTTON_W) + Endif + End Select + + End With + + '$hShowPanel.Move($hShowPanel.X - 2, $hShowPanel.Y - 2, $hShowPanel.W + 4, $hShowPanel.H + 4) + + $hShowPanel.Show + $hShowPanel.Raise + If $hShowButtonLeft Then + $hShowButtonLeft.Show + $hShowButtonLeft.Raise + $hShowButtonRight.Show + $hShowButtonRight.Raise + Endif + +End + +Private Sub UpdatePanelSize(D As Integer, Optional bAnimate As Boolean) As Boolean + + Dim DD As Integer + + Select Case $iOrientation + + Case Align.Top, Align.Bottom + + If Me.Parent.H = D Then Return True + + Case Align.Left, Align.Right + + If Me.Parent.W = D Then Return True + + End Select + + 'bParentIgnore = Me.Parent.Ignore + 'Me.Parent.Ignore = True + + Select Case $iOrientation + + Case Align.Top, Align.Bottom + + If bAnimate Then + DD = (D - Me.Parent.H + Sgn(D - Me.Parent.H)) \ 2 + Else + DD = D - Me.Parent.H + Endif + + Me.Parent.H += DD + If $iOrientation = Align.Bottom Then Me.Parent.Y -= DD + + Case Align.Left, Align.Right + + If bAnimate Then + DD = (D - Me.Parent.W + Sgn(D - Me.Parent.W)) \ 2 + Else + DD = D - Me.Parent.W + Endif + + Me.Parent.W += DD + If $iOrientation = Align.Right Then Me.Parent.X -= DD + + End Select + + 'Me.Parent.Ignore = bParentIgnore + +End + + +Public Sub RefreshAll() + + Dim hParent As SidePanel + Dim hTabStrip As TabStrip + Dim iIndex As Integer + Dim D As Integer + Dim hCont As Container + + If Not $bOpened Then Return + + If $bLockRefresh Then Return + $bLockRefresh = True + + hParent = GetParent() + + btnSide.Visible = Not $bTransparent Or $bVisible + btnSide2.Visible = btnSide.Visible + + If $bVisible Then + + 'panSide.Show 'Enabled = TRUE + + If $hShowPanel Then $hShowPanel.Hide + If $hShowButtonLeft Then + $hShowButtonLeft.Hide + $hShowButtonRight.Hide + Endif + + Else + + 'DEBUG ME.Parent.W;; ME.CLientW + 'panSide.Hide 'Enabled = FALSE + + If Not $hShowPanel And If $bTransparent Then + + hCont = Me.Parent.Parent + + If hCont Is TabStrip Then + hTabStrip = hCont + iIndex = hTabStrip.Index + hTabStrip.Index = hTabStrip.FindIndex(Me.Parent) + Endif + + $hShowButtonLeft = CreateShowButton(hCont) + $hShowButtonRight = CreateShowButton(hCont) + + $hShowPanel = New Panel(hCont) As "panMove" + $hShowPanel.Ignore = True + $hShowPanel.Mouse = Mouse.Pointing + $hShowPanel.Tooltip = GetParent().Tooltip + + If hTabStrip Then hTabStrip.Index = iIndex + + Endif + + If Not $hTimerAnim Then + D = If($bTransparent, 0, BUTTON_H) + UpdatePanelSize(D) + Endif + MoveShowButton + + Endif + + RefreshArrow + RefreshPanel + RefreshButtons + + sepSide.Raise + panMove.Raise + + $bLockRefresh = False + +End + +Private Sub AfterTogglePanel() + + Dim W, H As Integer + + If Not $bVisible Then + + RefreshAll + + Else + + If $W And If $H Then + W = $W + H = $H + If IsVertical() Then + W = Me.Parent.W + Else + H = Me.Parent.H + Endif + Me.Parent.Move($X, $Y, W, H) + $W = 0 + $H = 0 + Endif + + RefreshAll + + Endif + +End + + +Private Sub TogglePanel() + + If Me.Parent.Design Then Return + + If $bVisible Then + + With Me.Parent + $X = .X + $Y = .Y + $W = .Width + $H = .Height + End With + + If $hTimerAnim Then + If $iOrientation = Align.Top Or If $iOrientation = Align.Bottom Then + $H = $iTarget + Else + $W = $iTarget + Endif + $hTimerAnim.Stop + $hTimerAnim = Null + Endif + + 'Debug "HidePanel:";; $X;; $Y;; $W;; $H + + $bVisible = False + + If Application.Animations Then + + $iTarget = If($bTransparent, 0, BUTTON_H) + + $hTimerAnim = New Timer As "TimerAnim" + $hTimerAnim.Delay = 20 + $hTimerAnim.Start + + Else + + AfterTogglePanel + + Endif + + Action.Raise(Me.Parent) + + GetParent()._Hide + + Else + + 'Debug "ShowPanel:";; $X;; $Y;; $W;; $H + + $bVisible = True + + If $hTimerAnim Then + $hTimerAnim.Stop + $hTimerAnim = Null + Endif + + If Application.Animations Then + + panSide.Show + sepSide.Visible = $bSeparator + + If $iOrientation = Align.Top Or If $iOrientation = Align.Bottom Then + $iTarget = $H + Else + $iTarget = $W + Endif + + $hTimerAnim = New Timer As "TimerAnim" + $hTimerAnim.Delay = 20 + $hTimerAnim.Start + + Else + + AfterTogglePanel + + Endif + + Action.Raise(Me.Parent) + + GetParent()._Show + + Endif + +End + +Public Sub TimerAnim_Timer() + + If UpdatePanelSize($iTarget, True) Then + $hTimerAnim.Stop + $hTimerAnim = Null + AfterTogglePanel + Endif + +End + + +Public Sub btnSide_MouseUp() + + If Me.Parent.Design Then Return + If Not Me.Parent.Enabled Then Return + + 'Last.Tag = 1 + 'Last.Refresh + + $bInside = False + TogglePanel + +End + +Private Function IsVertical() As Boolean + + Return $iOrientation = Align.Top Or $iOrientation = Align.Bottom + +End + + +Public Sub panMove_MouseDown() + + $bCanMove = False + + If Me.Parent.Design Then Return + If Not Me.Parent.Enabled Then Return + If $bFixed Then Return + If Not $bVisible Then Return + + '$MX = Mouse.ScreenX - Me.Parent.W + + Select Case $iOrientation + Case Align.Top + $MY = Mouse.ScreenY - Me.Parent.H + $iMax = Me.Parent.Parent.ClientH - Me.Parent.Y '- Desktop.Scale * 8 + Case Align.Bottom + $MY = Mouse.ScreenY + Me.H + $iMax = Me.Parent.Y + Me.Parent.H '+ Desktop.Scale * 8 + Case Align.Left + $MX = Mouse.ScreenX - Me.Parent.W + $iMax = Me.Parent.Parent.ClientW - Me.Parent.X '- Desktop.Scale * 8 + Case Align.Right + $MX = Mouse.ScreenX + Me.W + $iMax = Me.Parent.X + Me.Parent.W '+ Desktop.Scale * 8 + End Select + + $bCanMove = True + $bInside = True + +End + +Public Sub panMove_MouseUp() + + $bInside = False + If Not $bDblClick And If Not $bVisible Then TogglePanel + $bDblClick = False + +End + + +Private Function GetDim(H As Integer) As Integer + + Dim iMin As Integer + + iMin = Min($iMax, Max(BUTTON_H, $iMinSize)) + + If H < BUTTON_H Then + H = If($bTransparent, 1, BUTTON_H) + Else If H < iMin Then + H = iMin + Endif + + Return H + +End + + +Public Sub panMove_MouseMove() + + Dim H As Integer + Dim iMax As Integer + + If Not $bCanMove Then Return + + If Not Mouse.Left Then Return + If Me.Parent.Design Then Return + If Not Me.Parent.Enabled Then Return + If $bFixed Then Return + + iMax = Max(0, $iMax - $iMinSize) + + Select Case $iOrientation + Case Align.Top + H = GetDim(Min(iMax, Mouse.ScreenY - $MY)) + Case Align.Bottom + H = GetDim(Min(iMax, $MY - Mouse.ScreenY)) + Case Align.Left + H = GetDim(Min(iMax, Mouse.ScreenX - $MX)) + Case Align.Right + H = GetDim(Min(iMax, $MX - Mouse.ScreenX)) + End Select + + If H <= BUTTON_H Then + If $bVisible Then + TogglePanel + $bDblClick = True + Return + Endif + Else + If Not $bVisible Then + TogglePanel + Endif + Endif + + Select Case $iOrientation + Case Align.Top + Me.Parent.H = H + Case Align.Bottom + Me.Parent.Move(Me.Parent.X, $iMax - H, Me.Parent.W, H) + Case Align.Left + Me.Parent.W = H + Case Align.Right + Me.Parent.Move($iMax - H, Me.Parent.Y, H, Me.Parent.H) + End Select + + RefreshPanel + +End + +Public Function IsHidden() As Boolean + + Return Not $bVisible + +End + +Public Sub SetHidden(bHidden As Boolean) + + If bHidden = $bVisible Then TogglePanel + +End + +Public Function GetDimension() As Integer + + If IsVertical() Then + If Not $bVisible Then + Return $H + Else + Return Me.Parent.Height + Endif + Else + If Not $bVisible Then + Return $W + Else + Return Me.Parent.Width + Endif + Endif + +End + +Public Sub SetDimension(iDim As Integer) + + If IsVertical() Then + If Not $bVisible Then + $H = iDim + Else + Me.Parent.Height = iDim + Endif + Else + If Not $bVisible Then + $W = iDim + Else + Me.Parent.Width = iDim + Endif + Endif + +End + + +Public Function IsFixed() As Boolean + + Return $bFixed + +End + +Public Sub SetFixed(bFixed As Boolean) + + $bFixed = bFixed + RefreshArrow + +End + +Public Sub panMove_DblClick() + + If Not Me.Parent.Enabled Then Return + TogglePanel + $bDblClick = True + +End + +Public Function GetTooltip() As String + + Return btnSide.ToolTip + +End + +Public Sub SetTooltip(Value As String) + + btnSide.ToolTip = Value + btnSide2.ToolTip = Value + panMove.ToolTip = Value + If $hShowButtonLeft Then + $hShowButtonLeft.Tooltip = Value + $hShowButtonRight.Tooltip = Value + $hShowPanel.Tooltip = Value + Endif + +End + +Public Sub SetDesign() + + RefreshArrow + RefreshPanel + +End + + +' PUBLIC SUB panMove_Draw() +' +' IF IsVertical() THEN +' Draw.FillX = 0 +' Draw.FillY = panMove.H / 2 - 2 +' Draw.Tile($hHandleH, panMove.W * 0.1, panMove.H / 2 - 3, panMove.W * 0.8, 4) +' ELSE +' Draw.FillX = panMove.W / 2 - 2 +' Draw.FillY = 0 +' Draw.Tile($hHandleV, panMove.W / 2 - 3, panMove.H * 0.1, 4, panMove.H * 0.8) +' ENDIF +' +' END + +' Public Sub panMove_Enter() +' +' $iColor = panMove.Background +' +' If Not $bVisible Then Return +' If $bFixed Then Return +' If Me.Parent.Design Then Return +' +' 'panMove.Background = Color.ButtonBackground +' 'btnSide.Background = Color.ButtonBackground +' 'btnSide2.Background = Color.ButtonBackground +' +' End +' +' Public Sub panMove_Leave() +' +' 'panMove.Background = $iColor +' 'btnSide.Background = $iColor +' 'btnSide2.Background = $iColor +' +' End + +Public Sub btnSide_Draw() + + Dim iOrientation As Integer + + If Me.Parent.Design Or If Not $bTransparent Or If $bInside Then + + iOrientation = $iOrientation + If Not $bVisible Then iOrientation = InvertOrientation(iOrientation) + + DrawArrow(Last, iOrientation) + + ' If $hArrow Then + ' Draw.Image($hArrow, (Last.W - $hArrow.W) / 2, (Last.H - $hArrow.H) / 2) + ' Else + ' S = Min(btnSide.W, btnSide.H) + ' Draw.Style.Arrow((btnSide.W - S) \ 2, (btnSide.H - S) \ 2, S, S, $iArrowType) + ' Endif + + Endif + +End + +Public Sub btnSide_Enter() + + Last.Refresh + +End + +Public Sub btnSide_Leave() + + Last.Refresh + +End + +Public Sub btnSide_MouseDown() + + 'Last.Tag = 2 + 'Last.Refresh + +End + +Public Sub HasSeparator() As Boolean + + Return $bSeparator + +End + +Public Sub SetSeparator(bVisible As Boolean) + + If $bSeparator = bVisible Then Return + + $bSeparator = bVisible + RefreshAll + 'RefreshPanel + +End + +' Private Sub UpdateBackground() +' +' ' If $bInside And If Not $bVisible Then +' ' panMove.Background = Color.SelectedBackground +' ' Else +' ' panMove.Background = Color.Default +' 'Endif +' +' End + +Private Sub RefreshButtons() + + If $bTransparent Then + If $bVisible Then + btnSide.Refresh + btnSide2.Refresh + Else If $hShowButtonLeft Then + $hShowButtonLeft.Refresh + $hShowButtonRight.Refresh + Endif + Endif + +End + + +Public Sub panMove_Enter() + + 'Debug + $bInside = True + 'UpdateBackground + RefreshButtons + +End + +Public Sub panMove_Leave() + + 'Debug + $bInside = False + 'UpdateBackground + RefreshButtons + +End + +Private Sub InvertOrientation(iOrient As Integer) As Integer + + Select Case iOrient + Case Align.Left + iOrient = Align.Right + Case Align.Right + iOrient = Align.Left + Case Align.Top + iOrient = Align.Bottom + Case Align.Bottom + iOrient = Align.Top + End Select + + Return iOrient + +End + + +Public Sub ShowButton_Draw() + + If $bTransparent And If Not $bInside And If Not Last.Hovered Then Return + + DrawArrow(Last, InvertOrientation($iOrientation)) + +End + +Public Sub ShowButton_Enter() + + Last.Refresh + panMove_Enter + +End + +Public Sub ShowButton_Leave() + + Last.Refresh + panMove_Leave + +End + + +Private Sub DrawArrow(hCtrl As Control, iOrient As Integer) + + Dim X, Y, W, H As Float + + X = hCtrl.W / 2 + Y = hCtrl.H / 2 + + If hCtrl.W > hCtrl.H Then + W = Desktop.Scale * 2 - 4 + H = Desktop.Scale - 2 + Else + W = Desktop.Scale - 2 + H = Desktop.Scale * 2 - 4 + Endif + + X -= W / 2 + Y -= H / 2 + + X += 1 + Y += 1 + W -= 2 + H -= 2 + + If iOrient = Align.Left Or If iOrient = Align.Right Then + Y += 1 + H -= 2 + Else + X += 1 + W -= 2 + Endif + + Select Case iOrient + + Case Align.Right + + Paint.MoveTo(X, Y) + Paint.LineTo(X + W, Y + H / 2) + Paint.LineTo(X, Y + H) + + Case Align.Left + + Paint.MoveTo(X + W, Y) + Paint.LineTo(X, Y + H / 2) + Paint.LineTo(X + W, Y + H) + + Case Align.Bottom + + Paint.MoveTo(X, Y) + Paint.LineTo(X + W / 2, Y + H) + Paint.LineTo(X + W, Y) + + Case Align.Top + + Paint.MoveTo(X, Y + H) + Paint.LineTo(X + W / 2, Y) + Paint.LineTo(X + W, Y + H) + + End Select + + 'Paint.Brush = Paint.Color(Color.SetAlpha(Color.TextBackground, 0)) + 'Paint.LineWidth = 3 + 'Paint.Stroke(True) + Paint.Brush = Paint.Color(Color.SetAlpha(Color.TextForeground, 64)) + Paint.LineCap = Paint.LineCapRound + Paint.LineJoin = Paint.LineJoinRound + Paint.LineWidth = 2 + Paint.Stroke + +End + +Public Sub ShowButton_MouseDown() + + TogglePanel + +End + +Public Sub IsTransparent() As Boolean + + Return $bTransparent + +End + +Public Sub SetTransparent(bTransparent As Boolean) + + If $bTransparent = bTransparent Then Return + $bTransparent = bTransparent + RefreshAll + +End + + +Public Sub panMove_Menu() + + Dim hPopup, hMenu As Menu + + hPopup = New Menu(Me) + + hMenu = New Menu(hPopup) As "mnuHidden" + hMenu.Text = ("Hidden") + hMenu.Checked = IsHidden() + + hMenu = New Menu(hPopup) As "mnuTransparent" + hMenu.Text = ("Transparent") + hMenu.Checked = IsTransparent() + + hMenu = New Menu(hPopup) + + hMenu = New Menu(hPopup) + hMenu.Text = ("Cancel") + hMenu.Picture = Picture["icon:/small/close"] + + hPopup.Popup + hPopup.Delete + +End + +Public Sub mnuHidden_Click() + + SetHidden(Not IsHidden()) + +End + +Public Sub mnuTransparent_Click() + + SetTransparent(Not IsTransparent()) + +End + +Public Sub GetMinSize() As Integer + + Return $iMinSize + +End + +Public Sub SetMinSize(iMinSize As Integer) + + $iMinSize = Max(Desktop.Scale, iMinSize) + +End diff --git a/comp/src/gb.form/.src/SidePanel/FSidePanel.form b/comp/src/gb.form/.src/SidePanel/FSidePanel.form new file mode 100644 index 00000000..9faae300 --- /dev/null +++ b/comp/src/gb.form/.src/SidePanel/FSidePanel.form @@ -0,0 +1,25 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(8,16,50,50) + Resizable = False + { panSide Panel + MoveScaled(7,10,35,33) + } + { panMove Panel + MoveScaled(1,4,46,4) + { btnSide DrawingArea + MoveScaled(10,0,6,4) + Mouse = Mouse.Pointing + } + { btnSide2 DrawingArea btnSide + Name = "btnSide2" + MoveScaled(18,0,6,4) + Mouse = Mouse.Pointing + } + } + { sepSide Separator + MoveScaled(0,0,6,3) + Visible = False + } +} diff --git a/comp/src/gb.form/.src/SidePanel/SidePanel.class b/comp/src/gb.form/.src/SidePanel/SidePanel.class new file mode 100644 index 00000000..af09058f --- /dev/null +++ b/comp/src/gb.form/.src/SidePanel/SidePanel.class @@ -0,0 +1,228 @@ +' Gambas class file + +Export +Inherits UserContainer + +Public Const _Properties As String = "*,Action,Orientation{Align.Top;Bottom;Left;Right}=Top,Resizable=True,Border,Separator,Transparent,Hidden" +Public Const _Similar As String = "Panel" + +Event Show +Event Hide +Event Resize + +Property Orientation As Integer +Property Border As Boolean +Property Separator As Boolean +Property Hidden As Boolean +Property Resizable As Boolean +Property Dimension As Integer +Property Tooltip As String +Property Value As Boolean +Property Action As String +Property Design As Boolean +Property Settings As Variant[] +Property Transparent As Boolean +Property MinSize As Integer +Private $hObs As Observer + +Private $hForm As FSidePanel + +Public Sub _new() + + $hForm = New FSidePanel(Me) + $hForm.Move(0, 0) + $hObs = New Observer(Me.Parent) As "Observer" + 'Object.Attach($hForm, ME, "Form") + Me._Container = $hForm.GetContainer() + +End + +Public Sub Observer_Arrange() + + $hForm.RefreshAll + +End + + +Private Function Orientation_Read() As Integer + + Return $hForm.GetOrientation() + +End + + +Private Sub Orientation_Write(iOrientation As Integer) + + $hForm.SetOrientation(iOrientation) + +End + + +Private Function Border_Read() As Boolean + + Return $hForm.GetContainer().Border <> Border.None + +End + +Private Sub Border_Write(bBorder As Boolean) + + $hForm.GetContainer().Border = If(bBorder, Border.Sunken, Border.None) + +End + +Private Function Hidden_Read() As Boolean + + Return $hForm.IsHidden() + +End + +Private Sub Hidden_Write(bHidden As Boolean) + + $hForm.SetHidden(bHidden) + +End + +Private Function Dimension_Read() As Integer + + Return $hForm.GetDimension() + +End + + +Private Function Resizable_Read() As Boolean + + Return Not $hForm.IsFixed() + +End + +Private Sub Resizable_Write(bResizable As Boolean) + + $hForm.SetFixed(Not bResizable) + +End + +Public Sub _Show() + + Raise Show + +End + +Public Sub _Hide() + + Raise Hide + +End + + +Public Sub _Resize() + + Raise Resize + +End + + +Private Sub Dimension_Write(Value As Integer) + + $hForm.SetDimension(Value) + +End + +Private Function Tooltip_Read() As String + + Return $hForm.GetTooltip() + +End + +Private Sub Tooltip_Write(Value As String) + + $hForm.SetTooltip(Value) + +End + +Private Function Action_Read() As String + + Return Super.Action + +End + +Private Sub Action_Write(Value As String) + + Super.Action = Value + +End + +Private Function Value_Read() As Boolean + + Return Not Hidden_Read() + +End + +Private Sub Value_Write(Value As Boolean) + + Hidden_Write(Not Value) + +End + +Private Function Design_Read() As Boolean + + Return Super.Design + +End + +Private Sub Design_Write(Value As Boolean) + + Super.Design = Value + $hForm.SetDesign + +End + + +Private Function Settings_Read() As Variant[] + + Return [CVariant(Hidden_Read()), Dimension_Read(), Transparent_Read()] + +End + +Private Sub Settings_Write(Value As Variant[]) + + Try Transparent_Write(Value[2]) + Try Hidden_Write(Value[0]) + Try Dimension_Write(Value[1]) + +End + +Private Function Separator_Read() As Boolean + + Return $hForm.HasSeparator() + +End + +Private Sub Separator_Write(Value As Boolean) + + $hForm.SetSeparator(Value) + +End + +Private Function Transparent_Read() As Boolean + + Return $hForm.IsTransparent() + +End + +Private Sub Transparent_Write(Value As Boolean) + + $hForm.SetTransparent(Value) + +End + +Private Function MinSize_Read() As Integer + + Return $hForm.GetMinSize() + +End + +Private Sub MinSize_Write(Value As Integer) + + $hForm.SetMinSize(Value) + +End diff --git a/comp/src/gb.form/.src/SliderBox.class b/comp/src/gb.form/.src/SliderBox.class new file mode 100644 index 00000000..2fd4303a --- /dev/null +++ b/comp/src/gb.form/.src/SliderBox.class @@ -0,0 +1,190 @@ +' Gambas class file + +Export +Inherits UserControl + +Public Const _Properties As String = "*,Picture,MinValue=0,MaxValue=100,Step=1,DefaultValue,Value" +Public Const _DefaultEvent As String = "Change" +Public Const _DefaultSize As String = "32,4" +Public Const _Similar As String = "Slider" + +Event Change + +Property Value As Integer +Property MinValue As Integer +Property MaxValue As Integer +Property Step As Integer +Property DefaultValue As Integer +Property Font As Font +Property Picture As Picture + +Private $hSlider As Slider +Private $hSpinBox As SpinBox +Private $iStep As Integer = 1 +Private $iDefault As Integer +Private $hPictureBox As PictureBox + +Public Sub _new() + + Me._Arrangement = Arrange.Horizontal + Me._Spacing = True + + $hSlider = New Slider(Me) As "Slider" + $hSlider.Expand = True + $hSlider.PageStep = 1 + + $hSpinBox = New SpinBox(Me) As "SpinBox" + UpdateSpinBoxWidth + +End + + +Private Function Value_Read() As Integer + + Return $hSlider.Value + +End + +Private Sub Value_Write(Value As Integer) + + $hSlider.Value = Value + +End + +Private Function MinValue_Read() As Integer + + Return $hSlider.MinValue + +End + +Private Sub UpdateSpinBoxWidth() + + Dim N As Integer + + N = Max(Abs($hSpinBox.MinValue), Abs($hSpinBox.MaxValue)) + 'If $hSpinBox.MinValue < 0 Then N *= 10 + + $hSpinBox.W = Max(Desktop.Scale * 8, (2 + Len(CStr(N))) * $hSpinBox.Font.TextWidth("0") + $hSpinBox.Font.TextWidth("-") + Desktop.Scale * 2) + +End + +Private Sub MinValue_Write(Value As Integer) + + $hSlider.MinValue = Value + $hSpinBox.MinValue = Value + UpdateSpinBoxWidth + +End + +Private Function MaxValue_Read() As Integer + + Return $hSlider.MaxValue + +End + +Private Sub MaxValue_Write(Value As Integer) + + $hSlider.MaxValue = Value + $hSpinBox.MaxValue = Value + UpdateSpinBoxWidth + +End + +Public Sub Slider_Change() + + $hSpinBox.Value = $hSlider.Value + Raise Change + +End + +Public Sub SpinBox_Change() + + $hSlider.Value = $hSpinBox.Value + +End + +Private Function Step_Read() As Integer + + Return $iStep + +End + +Private Sub Step_Write(Value As Integer) + + $iStep = Value + $hSlider.PageStep = Value + +End + +Public Sub SpinBox_MouseWheel() + + If Not Me.Enabled Then Return + $hSpinBox.Value += If(Mouse.Forward, $iStep, -$iStep) + Stop Event + +End + +Private Function DefaultValue_Read() As Integer + + Return $iDefault + +End + +Private Sub DefaultValue_Write(Value As Integer) + + $iDefault = Value + +End + +Public Sub SpinBox_DblClick() + + $hSlider.Value = $iDefault + Stop Event + +End + + +Private Function Font_Read() As Font + + Return Super.Font + +End + +Private Sub Font_Write(Value As Font) + + Super.Font = Value + UpdateSpinBoxWidth + +End + +Public Sub SpinBox_KeyPress() + + If Key.Code = Key.Esc Then + $hSlider.Value = $iDefault + Stop Event + Endif + +End + +Private Function Picture_Read() As Picture + + If $hPictureBox Then Return $hPictureBox.Picture + +End + +Private Sub Picture_Write(Value As Picture) + + If Value Then + If Not $hPictureBox Then + $hPictureBox = New PictureBox(Me) + $hPictureBox.Lower + $hPictureBox.Mode = PictureBox.Contain + $hPictureBox.W = Desktop.Scale * 4 + $hPictureBox.Padding = Desktop.Scale \ 2 + Endif + $hPictureBox.Picture = Value + Else + If $hPictureBox Then $hPictureBox.Delete + Endif + +End diff --git a/comp/src/gb.form/.src/SpinBar/SpinBar.class b/comp/src/gb.form/.src/SpinBar/SpinBar.class new file mode 100644 index 00000000..39d24123 --- /dev/null +++ b/comp/src/gb.form/.src/SpinBar/SpinBar.class @@ -0,0 +1,433 @@ +' Gambas class file + +Export +Inherits UserControl + +Public Const _Properties As String = "*,Border=True,Value,MaxValue=1.0,MinValue,Text,Step=0.1" +Public Const _DefaultEvent As String = "Change" +Public Const _DefaultSize As String = "32,4" +Public Const _Similar As String = "Slider" + +Event Change + +'Properties +Property Value As Float +Property MaxValue As Float +Property MinValue As Float +Property Text As String +Property Step As Float +Property Background As Integer +Property Border As Boolean + +'Properties Var +Private $hView As DrawingArea +Private $fValue As Float +Private $fMaxValue As Float = 1 +Private $fMinValue As Float = 0 +Private $sText As String +Private $fStep As Float = 0.1 +'Internal Var +Private $fInternalPos As Float +Private $bInButDown As Boolean +Private $bInButUp As Boolean +Private $bInText As Boolean +Private $hRectButUp As Rect ''Define the zone of the top arrow button +Private $hRectButDown As Rect ''Define the zone of the Bottom arrow button +Private $hRectText As New Rect ''Define the zone of the spin text +Private $iLoop As Integer +Private $byDecimal As Integer +Private $sFormatPattern As String +Private $hText As TextBox +Private $iMX As Integer +Private $iMY As Integer +Private $byMode As Byte +Private $iBg As Integer = Color.Default +Private $bBorder As Boolean = True + +Private $hTimer As New Timer As "Timer" + +Public Sub _new() + + $hView = New DrawingArea(Me) As "View" + '$hView.Border = Border.No + $hView.Tracking = True + '$hView.Background = Color.TextBackground + $hView.Focus = True + + $hText = New TextBox($hView) As "Text" + $hText.Visible = False + $hText.Border = False + $hText.Alignment = Align.Right + + $hTimer.Delay = 500 + + SetValue(Me.Value) + 'Me.MaxValue = 3 + GetDecimals + +End + +Public Sub View_MouseMove() + + Dim $bPrev As Boolean + Dim $bChange As Boolean + Dim iWidth As Integer = $hView.Width - 4 - $hRectButDown.Width - 1 + Dim iMov As Integer + + If Me.Design Or If Not Me.Enabled Then Return + + If Mouse.y <= $hView.ClientH / 2 Then + If Not ($byMode = 2) Then $hView.Mouse = Mouse.Pointing + Else + If Not ($byMode = 1) Then $hView.Mouse = Mouse.SizeH + Endif + $bPrev = $bInButUp + $bInButUp = False + If $hRectButUp.Contains(Mouse.x, Mouse.y) Then + $hView.Mouse = Mouse.Arrow + $bInButUp = True + $bChange = $bChange Or ($bPrev <> $bInButUp) + Endif + + $bPrev = $bInButDown + $bInButDown = False + If $hRectButDown.Contains(Mouse.x, Mouse.Y) Then + $hView.Mouse = Mouse.Arrow + $bInButDown = True + $bChange = $bChange Or ($bPrev <> $bInButUp) + Endif + + $bPrev = $bInText + $bInText = False + If $hRectText.Contains(Mouse.x, Mouse.Y) Then + $bInText = True + $bChange = $bChange Or ($bPrev <> $bInText) + Endif + + If Mouse.Left And If $hView.Mouse = Mouse.Pointing And If Not ($byMode = 2) Then + $byMode = 1 + SetValue((Mouse.x / iWidth) * ($fMaxValue - $fMinValue) + $fMinValue) + Endif + + If Mouse.Left And If $hView.Mouse = Mouse.SizeH And If Not ($byMode = 1) Then + $byMode = 2 + iMov = Mouse.x - $iMX + SetValue($fValue + (1 * 10 ^ (-1 * $byDecimal)) * iMov) + $iMX = Mouse.X + Endif + +Fin: + If $bChange Then $hView.Refresh + +End + +Public Sub View_MouseDown() + + Dim iWidth As Integer = $hView.Width - 4 - $hRectButDown.Width - 1 + + If Me.Design Or If Not Me.Enabled Then Return + + If $bInButUp Then + Me.Value += $fStep + $hTimer.Start + Return + Endif + If $bInButDown Then + Me.Value -= $fStep + $hTimer.Start + Return + Endif + + If Mouse.Y <= $hView.ClientH / 2 Then + SetValue((Mouse.x / iWidth) * ($fMaxValue - $fMinValue) + $fMinValue) + Endif + + If Mouse.Y > $hView.ClientH / 2 Then + $iMX = Mouse.X + $iMY = Mouse.Y + Endif + +End + +Public Sub View_MouseUp() + + If Me.Design Or If Not Me.Enabled Then Return + + $hTimer.Stop + $iLoop = 0 + $hTimer.Delay = 500 + $byMode = 0 + +End + +Public Sub Timer_Timer() + + $hTimer.Delay = 50 + + If $bInButUp Then Me.Value += $fStep + If $bInButDown Then Me.Value -= $fStep + +End + +Public Sub View_MouseWheel() + + If Me.Design Or If Not Me.Enabled Then Return + + Me.Value += $fStep * Mouse.Delta + Stop Event + +End + +Public Sub View_DblClick() + + If Me.Design Or If Not Me.Enabled Then Return + + If Not $bInText Then Return + $hText.Move($hRectText.X, $hRectText.Y, $hRectText.Width, $hRectText.Height) + $hText.Show + $hText.Text = $fValue + $hText.SetFocus + $hText.Select + +End + +Private Sub GetFrameWidth() As Integer + + If $bBorder Then Return Style.FrameWidth + +End + +Public Sub View_Draw() + + Dim F As Integer = GetFrameWidth() + Dim iWidth As Integer = Paint.Width - F * 2 '- $hRectButDown.Width - Desktop.Scale + 1 + Dim iHeight As Integer = Paint.Height - F * 2 + Dim iButH As Integer + Dim iCol As Integer + Dim iBg As Integer + Dim iState As Integer + + iBg = $iBg + If iBg = Color.Default Then iBg = Color.TextBackground + + If $bBorder Then + iState = Style.StateOf(Me) + If $hText.HasFocus Then iState += Style.HasFocus + Style.PaintBox(0, 0, Paint.W, Paint.H, iState, iBg) + Else + Paint.FillRect(0, 0, Paint.W, Paint.H, iBg) + Endif + + iCol = Color.SelectedBackground + If Not Me.Enabled Then iCol = Color.Merge(iCol, iBg) + Paint.FillRect(F, F, iWidth * $fInternalPos, iHeight, iCol) + + Paint.DrawText(Paint.TrimText($sText, iWidth / 2), 8, 2, iWidth / 2, iHeight, Align.Left) + + iButH = Paint.H + 'Draw.Foreground = Color.ButtonBackground + 'Draw.FillRect(Paint.W - 16, 2, 16 - 2, iButH - 4, Color.Background) + + 'Draw.rect(Paint.w - iPadding - 16, iPadding + iButH + 2, 16, iButH) + iButH = Paint.H / 2 - F + 'Debug $hRectButUp.X;; $hRectButUp.Y;; $hRectButUp.W;; $hRectButUp.H + Style.PaintArrow($hRectButUp.X, $hRectButUp.Y, $hRectButUp.W, $hRectButUp.H, Align.Top, IIf($bInButUp, Style.Hovered, Style.Normal)) + Style.PaintArrow($hRectButDown.X, $hRectButDown.Y, $hRectButDown.W, $hRectButDown.H, Align.Bottom, IIf($bInButDown, Style.Hovered, Style.Normal)) + + iCol = Color.Foreground + If Not Me.Enabled Then iCol = Color.Merge(iCol, iBg) + + Paint.Background = iCol + Paint.DrawText(Format($fValue, $sFormatPattern), $hRectText.X, $hRectText.Y, $hRectText.W - 4, $hRectText.H, Align.Right) + + If $bInText Then + Draw.Foreground = Color.ButtonBackground + Draw.Rect($hRectText.x, $hRectText.Y, $hRectText.Width, $hRectText.Height) + Endif + +End + +Private Sub SetValue(fValue As Float) + + Dim F As Integer = GetFrameWidth() + Dim iWidth As Integer + + fValue = Round(Max(Min(fValue, $fMaxValue), $fMinValue), $byDecimal * -1) + If fValue <> $fValue Then + $fValue = fValue + Raise Change + Endif + $fInternalPos = ($fValue - $fMinValue) / ($fMaxValue - $fMinValue) + iWidth = $hView.Font.TextWidth(Format($fValue, $sFormatPattern) & "000") + 4 + Try $hRectText.Move($hView.W - iWidth - $hRectButDown.Width - F - Desktop.Scale, ($hView.H - ($hView.Font.Height + Style.BoxFrameHeight)) / 2, iWidth, $hView.Font.Height + 4) + $hView.Refresh + +End + +Private Function Value_Read() As Float + + Return $fValue + +End + +Private Sub Value_Write(Value As Float) + + SetValue(Value) + +End + +Private Function MaxValue_Read() As Float + + Return $fMaxValue + +End + +Private Sub MaxValue_Write(Value As Float) + + $fMaxValue = Max($fMinValue, Value) + GetDecimals + SetValue(Me.Value) + +End + +Private Function MinValue_Read() As Float + + Return $fMinValue + +End + +Private Sub MinValue_Write(Value As Float) + + $fMinValue = Min(Value, $fMaxValue) + GetDecimals + SetValue(Me.Value) + +End + +Public Sub View_Arrange() + + Dim F As Integer = GetFrameWidth() + + $hRectButUp = New Rect($hView.W - 16 - F * 2, F * 2, 16, $hView.H / 2 - F * 2) + $hRectButDown = New Rect($hView.W - 16 - F * 2, $hView.H / 2, 16, $hRectButUp.Height) + $hRectButUp.Adjust(2) + $hRectButDown.Adjust(2) + SetValue(Me.Value) + +End + +Public Sub View_Leave() + + $byMode = 0 + $bInButDown = False + $bInButUp = False + $bInText = False + $hTimer.Stop + $hTimer.Delay = 500 + $iLoop = 0 + $hView.Refresh + +End + +Private Function Text_Read() As String + + Return $sText + +End + +Private Sub Text_Write(Value As String) + + $sText = Value + $hView.Refresh + +End + +Private Sub GetDecimals() + + $byDecimal = Max(Max(Len(Right(Str(Frac($fMaxValue)), -2)), Len(Right(Str(Frac($fMinValue)), -2))), Len(Right(Str(Frac($fStep)), -2))) + $sFormatPattern = "0." & String($byDecimal, "0") + +End + +Private Function Step_Read() As Float + + Return $fStep + +End + +Private Sub Step_Write(Value As Float) + + $fStep = Min($fMaxValue / 2, Value) + GetDecimals + +End + +Public Sub Text_LostFocus() + + $hText.Hide + +End + +Public Sub Text_GotFocus() + + $hText.Select() + +End + +Public Sub Text_KeyPress() + + If Key.Code = Key.Esc Then $hView.SetFocus + If key.Code = Key.Enter Or If Key.code = Key.Return Then + If Not IsFloat(Last.Text) Then + $hText.Text = $fValue + $hView.SetFocus + Return + Endif + Try SetValue(Val($hText.Text)) + $hView.SetFocus + Endif + +End + +Public Sub Text_MouseWheel() + + View_MouseWheel + Last.Text = $fValue + +End + + + +Private Function Background_Read() As Integer + + Return $iBg + +End + +Private Sub Background_Write(Value As Integer) + + $iBg = Value + $hView.Refresh + +End + +Private Function Border_Read() As Boolean + + Return $bBorder + +End + +Private Sub Border_Write(Value As Boolean) + + If $bBorder = Value Then Return + $bBorder = Value + View_Arrange + $hView.Refresh + +End + +Public Sub View_Font() + + View_Arrange + +End diff --git a/comp/src/gb.form/.src/Spinner.class b/comp/src/gb.form/.src/Spinner.class new file mode 100644 index 00000000..d1df3f73 --- /dev/null +++ b/comp/src/gb.form/.src/Spinner.class @@ -0,0 +1,200 @@ +' Gambas class file + +Export + +Inherits UserControl + +Public Const _Properties As String = "*,Border,Label,Padding{Range:0;63}" +Public Const _DefaultSize As String = "8,8" + +Property Border As Boolean +Property Label As Boolean +Property Value As Float +Property Enabled As Boolean +Property Padding As Integer + +Private $hDrawingArea As DrawingArea +Private $fStartTime As Float +Private $hTimer As Timer +Private $bBorder As Boolean +Private $bLabel As Boolean +Private $fValue As Float +Private $fLastWait As Float +Private $iPadding As Integer + +Public Sub _new() + + $hDrawingArea = New DrawingArea(Me) As "DrawingArea" + +End + +Public Sub Start() + + $fStartTime = Timer + $hTimer = New Timer As "Timer" + $hTimer.Delay = 50 + $hDrawingArea.Refresh + +End + +Public Sub Stop() + + $fStartTime = 0 + $hTimer = Null + +End + +Public Sub Wait() + + If $fLastWait = 0 Or If (Timer - $fLastWait) >= 0.2 Then + Wait 0.05 + $fLastWait = Timer + Else + Wait + Endif + +End + + +Public Sub DrawingArea_Draw() + + 'Dim iFlag As Integer + Dim A As Float + Dim X As Float + Dim Y As Float + Dim R As Variant + Dim D As Float + Dim I As Integer + Dim C As Float + Dim W As Float + Dim H As Float + Dim HL As Integer + Dim iFg As Integer + + If Not Me.Design Then + If $fStartTime = 0 Then Goto DRAW_BORDER + D = Frac(Timer - $fStartTime) * Pi(2) + Endif + + iFg = Style.ForegroundOf(Me) + + W = Paint.W + H = Paint.H + + If $bLabel Then + HL = Paint.Font.Height + Desktop.Scale + H -= HL + Desktop.Scale + Endif + + If H > 0 Then + + X = W / 2 + Y = H / 2 + R = Min(W, H) / 2 * 7 / 8 - $iPadding + + Paint.LineWidth = R / 8 + Paint.LineCap = Paint.LineCapRound + + For I = 0 To 11 + + A = Pi(2) * I / 12 + C = Frac(1 + (D - A) / Pi(2)) + + 'Paint.Background = Color.Merge(Color.Background, Color.Foreground, C / 4) + Paint.Background = Color.SetAlpha(iFg, 255 * (1 - C / 2)) + Paint.MoveTo(X + Cos(A) * R / 2, Y + Sin(A) * R / 2) + Paint.LineTo(X + Cos(A) * R, Y + Sin(A) * R) + Paint.Stroke + + Next + + Endif + + If $bLabel Then + Paint.Background = iFg + Paint.DrawText(Format($fValue, "0 %"), 0, Paint.H - HL, Paint.W, HL - Desktop.Scale, Align.Center) + Endif + +DRAW_BORDER: + + If $bBorder Then Style.PaintPanel(0, 0, Paint.W, Paint.H, Border.Plain) ', iFlag) + + If $hTimer And If Not $hTimer.Enabled And If Me.Enabled Then + $hTimer.Start + Endif + +End + +Public Sub Timer_Timer() + + $hDrawingArea.Refresh + $hTimer.Stop + +End + +Private Function Border_Read() As Boolean + + Return $bBorder + +End + +Private Sub Border_Write(Value As Boolean) + + $bBorder = Value + $hDrawingArea.Refresh + +End + +Private Function Label_Read() As Boolean + + Return $bLabel + +End + +Private Sub Label_Write(Value As Boolean) + + $bLabel = Value + $hDrawingArea.Refresh + +End + +Private Function Value_Read() As Float + + Return $fValue + +End + +Private Sub Value_Write(Value As Float) + + $fValue = Max(0, Min(1, Value)) + $hDrawingArea.Refresh + +End + +Private Function Enabled_Read() As Boolean + + Return Super.Enabled + +End + +Private Sub Enabled_Write(Value As Boolean) + + If Value = Me.Enabled Then Return + Super.Enabled = Value + $hDrawingArea.Refresh + +End + +Private Function Padding_Read() As Integer + + Return $iPadding + +End + +Private Sub Padding_Write(Value As Integer) + + If $iPadding = Value Then Return + $iPadding = Value + $hDrawingArea.Refresh + +End diff --git a/comp/src/gb.form/.src/Stock.class b/comp/src/gb.form/.src/Stock.class new file mode 100644 index 00000000..eed51cb4 --- /dev/null +++ b/comp/src/gb.form/.src/Stock.class @@ -0,0 +1,836 @@ +' Gambas class file + +Export + +Static Property Debug As Boolean +Static Property Read List As String[] +Static Property Read Themes As String[] +Static Property Read Icons As String[] +Static Property Read Sizes As String[] + +Static Private $bInit As Boolean +'Static Private $sTheme As String +Static Private $aIconPath As String[] +Static Private $cIconMap As Collection +Static Private $aList As String[] +Static Private $aSizeDec As Integer[] = [256, 128, 64, 48, 32, 24, 22, 16] +Static Private $aSizeInc As Integer[] = [16, 22, 24, 32, 48, 64, 128, 256] +Static Private $bDebug As Boolean +'Static Private $bDebugLoad As Boolean +Static Private $aRoots As String[] = ["~/.icons", "~/.local/share/icons", "/usr/share/icons"] + +Class _DefaultStock + +' Static Private Sub GetDesktop() As String +' +' Dim sOutput As String +' +' If Env["KDE_FULL_SESSION"] Then +' If Env["KDE_SESSION_VERSION"] = "4" Then +' Return "KDE4" +' Else If Env["KDE_SESSION_VERSION"] = "5" Then +' Return "KDE5" +' Else +' Return "KDE" +' Endif +' Else If Env["GNOME_DESKTOP_SESSION_ID"] Then +' Return "GNOME" +' Else If Env["MATE_DESKTOP_SESSION_ID"] Or If Env["MATECORBA_SOCKETDIR"] Then +' Return "MATE" +' Else If Env["E_BIN_DIR"] And If Env["E_LIB_DIR"] Then +' Return "ENLIGHTENMENT" +' Else If Env["WMAKER_BIN_NAME"] Then +' Return "WINDOWMAKER" +' Else If Env["DESKTOP_SESSION"] = "LXDE" Then +' Return "LXDE" +' Else +' Shell "xprop -root XFCE_DESKTOP_WINDOW" To sOutput +' If sOutput Then Return "XFCE" +' Endif +' +' Select Case Env["XDG_CURRENT_DESKTOP"] +' Case "LXDE" +' Return "LXDE" +' End Select +' +' Return "" +' +' Catch +' +' End + +Static Private Sub SearchDesktop() + + Dim sDesktop As String + If Application.Theme Then Return + sDesktop = Desktop.Type + If $bDebug Then Error "gb.form: desktop is " & sDesktop + Application.Theme = LCase(sDesktop) + +End + +Static Private Sub LoadMap() + + Dim hFile As File + Dim sLig As String + Dim iPos As Integer + Dim sKey As String + Dim sIcon As String + + $cIconMap = New Collection + $aList = New String[] + + hFile = Open "map" &/ "icon.map" + For Each sLig In hFile.Lines + sLig = Trim(sLig) + If InStr("';#", Left(sLig)) Then Continue + + iPos = InStr(sLig, " ") + If iPos Then + sIcon = Trim(Mid$(sLig, iPos + 1)) + sKey = Left(sLig, iPos - 1) + Else + sIcon = "" + sKey = sLig + Endif + + $cIconMap[sKey] = sIcon + $aList.Add(sKey) + + Next + + $aList.Sort + +End + +Static Private Sub AddPath(sMap As String, sPath As String, Optional sPattern As String) + + Dim aDir As String[] + Dim iPos As Integer + + If Not Exist(sPath) Then Return + + If Not sPattern Then + + sPattern = "*" + + aDir = Dir(sPath, "*", gb.Directory).Sort() + + If aDir.Count Then + If aDir[0] Like "*[1-9]x[1-9]*" Then + sPattern = "&1x&1!&2" + Else If IsDigit(aDir[0]) Or If Exist(sPath &/ "scalable") Then + sPattern = "&1!&2" + Else + aDir = Dir(sPath &/ aDir[0], "*", gb.Directory).Sort() + If aDir.Count Then + If aDir[0] Like "*[1-9]x[1-9]*" Then + sPattern = "&2!&1x&1" + Else If IsDigit(aDir[0]) Or If Exist(sPath &/ "scalable") Then + sPattern = "&2!&1" + Endif + Endif + Endif + Endif + Endif + + sPath &/= sPattern + + If sMap Then sPath = sMap & ":" & sPath + If Not $aIconPath.Exist(sPath) Then + $aIconPath.Add(sPath) + If $bDebug Then + iPos = InStr(sPath, ":") + If iPos Then sPath = Mid$(sPath, iPos + 1) + Error "gb.form: add icon path: "; sPath + Endif + Endif + +End + +Static Private Sub FindInConfigFile(aPath As String[], sPattern As String, Optional sFindFirst As String) As String[] + + Dim hFile As File + Dim sLine As String + Dim sPath As String + + For Each sPath In aPath + + If Not Exist(sPath) Then Continue + + hFile = Open sPath + For Each sLine In hFile.Lines + If sFindFirst Then + If sLine = sFindFirst Then + sFindFirst = "" + Else + Continue + Endif + Endif + If sLine Like sPattern Then Return Scan(sLine, sPattern) + Next + + Next + +End + +' TODO: Vérifier les thèmes +' FIXME: Mettre à jour + + + +Static Private Sub SearchTheme(sDesktop As String) + + 'Dim hFile As File + 'Dim sLig As String + Dim sIconPath As String + Dim sPath As String + Dim sTheme As String + Dim aFind As String[] + Dim sDefaultTheme As String + Dim sProg As String + + sDesktop = LCase(sDesktop) + + Select sDesktop + + Case "gnome" + + If Not sTheme Then Try Exec ["gconftool-2", "-g", "/desktop/gnome/interface/icon_theme"] To sTheme + + If sTheme Then + sTheme = Trim(sTheme) + GetAllThemePath("gnome", $aRoots, sTheme) + Endif + + AddPath("gnome", "/usr/share/icons/gnome") + AddPath("gnome", "/usr/share/icons/hicolor") + 'AddPath("gnome", "/usr/X11R6/share/icons/hicolor") + + Case "mate" + + If Not sTheme Then Try Exec ["mateconftool-2", "-g", "/desktop/mate/interface/icon_theme"] To sTheme + + If sTheme Then + sTheme = Trim(sTheme) + GetAllThemePath("gnome", $aRoots, sTheme) + Endif + + AddPath("gnome", "/usr/share/icons/mate") + AddPath("gnome", "/usr/share/icons/gnome") + AddPath("gnome", "/usr/share/icons/hicolor") + 'AddPath("gnome", "/usr/X11R6/share/icons/hicolor") + + Case "kde", "kde4", "kde5", "trinity" + + Select Case sDesktop + Case "kde" + sProg = "kde-config" + Case "trinity" + sProg = "tde-config" + Case "kde4" + sProg = "kde4-config" + Case "kde5" ' ??? How do you get KDE5 paths ??? + sProg = "" + End Select + + If sProg Then + Try Exec [sProg, "--path", "icon"] To sIconPath + sIconPath = Trim(sIconPath) + Endif + + If Not sIconPath Then sIconPath = $aRoots.Join(":") + + If Not sTheme Then + + aFind = FindInConfigFile(["~/." & sDesktop & "/share/config/kdeglobals", "~/.kde/share/config/kdeglobals", "~/.config/kdeglobals"], "Theme=*", "[Icons]") + If aFind Then sTheme = aFind[0] + + Endif + + If sTheme Then GetAllThemePath(sDesktop, Split(sIconPath, ":"), sTheme) + + Select Case sDesktop + Case "kde", "trinity" + sDefaultTheme = "crystalsvg" + Case "kde4" + sDefaultTheme = "oxygen" + Case "kde5" + sDefaultTheme = "breeze" + End Select + + For Each sPath In Split(sIconPath, ":") + AddPath(sDesktop, sPath &/ sDesktop) + Next + + Case "xfce" + + If Not sTheme Then + aFind = FindInConfigFile(["~/.config/xfce4/xfconf/xfce-perchannel-xml/xsettings.xml", "~/.config/xfce4/mcs_settings/gtk.xml"], "**") + If aFind Then sTheme = Trim(aFind[1]) + Endif + + If sTheme Then GetAllThemePath("gnome", $aRoots, sTheme) + 'GetAllThemePath("gnome", "/usr/X11R6/share/icons", sTheme) + + AddPath("gnome", "/usr/share/icons/gnome") + + Case "lxde" + + If Not sTheme Then + aFind = FindInConfigFile(["~/.config/lxsession/LXDE/desktop.conf", "/etc/xdg/lxsession/LXDE/desktop.conf", "~/.config/lxde/config", "/usr/share/lxde/config"], "sNet/IconThemeName=*") + If aFind Then sTheme = Trim(aFind[0]) + Endif + + If sTheme Then GetAllThemePath("gnome", $aRoots, sTheme) + + AddPath("gnome", "/usr/share/icons/gnome") + + Case "gambas", "gambas-mono" + + $aIconPath.Add("#" & sDesktop) + AddPath("", "stock", "&1") + Return + + Case Else + + If sDesktop <> "gambas" Then + GetAllThemePath("gnome", $aRoots, Application.Theme) + Endif + + End Select + + AddPath("", "stock", "&1") + $aIconPath.Add("#") + +End + + +Static Private Sub InitTheme() + + If Not $bDebug Then + If Env["GB_STOCK_DEBUG"] = "1" Or If Env["GB_STOCK"] Then $bDebug = True + Endif + + $aIconPath = New String[] + LoadMap + + If $bDebug Then Error "gb.form: init stock with application theme: '"; Application.Theme; "'" + + SearchDesktop + + SearchTheme(Application.Theme) + + ' If Color[Color.Background].Luminance < 128 Or If Env["GB_GUI_DARK_THEME"] = "1" Then + ' If InStr(LCase(Application.Theme), "dark") = 0 Then $bDarkTheme = True + ' Endif + + $bInit = True + +End + +Static Public Function GetSize(Size As String) As Integer + + Dim iSize As Integer + + Select Case LCase(Size) + Case "tiny" + iSize = (CInt(Desktop.Scale * 2) \ 4) * 4 '16 'CInt(Desktop.Scale * 5 / 8 + 0.5) * 4 + Case "small" + iSize = (CInt(Desktop.Scale * 2.5) \ 4) * 4 '16 'CInt(Desktop.Scale * 5 / 8 + 0.5) * 4 + Case "medium" + iSize = (CInt(Desktop.Scale * 2.5) \ 4) * 5.5 '22 'CInt(Desktop.Scale * 5 / 8 * 1.5 + 0.5) * 4 + Case "large" + iSize = (CInt(Desktop.Scale * 2.5) \ 4) * 8 '32 'CInt(Desktop.Scale * 5 / 8 + 0.5) * 8 + Case "huge" + iSize = (CInt(Desktop.Scale * 2.5) \ 4) * 12 '48 'CInt(Desktop.Scale * 5 / 8 * 1.5 + 0.5) * 8 + Case Else + Try iSize = CInt(Size) + End Select + + Return iSize + +End + +Static Private Sub GetScalablePath(sPath As String) As String + + If InStr(sPath, "&1x&1") Then Return Replace(sPath, "&1x&1", "scalable") + If InStr(sPath, "&1") Then Return Replace(sPath, "&1", "scalable") + +End + +Static Private Sub DoLoadIcon(sPath As String, iSize As Integer, iRealSize As Integer) As Picture + + Dim sName As String + Dim sDir As String + Dim hPict As Picture + Dim hImage As Image + Dim sFullName As String + Dim sExt As String + Dim aExt As String[] + Dim sSym As String + + sName = File.Name(sPath) + sDir = File.Dir(sPath) + + 'Error "{";; sPath + + 'If $bDebugLoad Then Error "-> "; sDir &/ sName + + If iRealSize Then + + aExt = [".svg", ".svgz", ".png"] + + Else + + aExt = [".png", ".svg", ".svgz"] + iRealSize = iSize + + Endif + + For Each sSym In ["", "-symbolic", ".symbolic", "-symbolic.symbolic"] + For Each sExt In aExt + + sFullName = sName & sSym & sExt + If sExt = ".png" Then + Try hImage = Image.Load(sDir &/ sFullName) + If Not Error Then + 'If Application.DarkTheme Then hImage.Invert(Color.Background, Color.Foreground) + hPict = hImage.Stretch(iRealSize, iRealSize).Picture + Goto RETURN_PICT + Endif + Else + Try hPict = PictureFromSvg(SvgImage.Load(sDir &/ sFullName), iRealSize) + If Not Error Then Goto RETURN_PICT + Endif + + Next + Next + + hPict = Null + +RETURN_PICT: + + 'Error "}" + Return hPict + +End + + +Static Private Sub LoadIcon(sTemplate As String, sFile As String, iSize As Integer, Optional iRealSize As Integer) As Picture + + Dim hPict As Picture + Dim sPath As String + Dim sTest As String + Dim iPos As Integer + Dim sTheme As String + Dim sDir As String + Dim sSubDir As String + Dim sMime As String + Dim bBreak As Boolean + Dim iPos2 As Integer + Dim sSize As String + + sSize = CStr(iSize) + + For Each sFile In Split(sFile, ";") + + If Left(sFile) = "[" Then + iPos = InStr(sFile, "]") + If iPos Then + + sTheme = LCase(Mid$(sFile, 2, iPos - 2)) + + iPos2 = InStr(sTheme, "!") + If iPos2 Then + sSize = Mid$(sTheme, iPos2 + 1) + sTheme = Left(sTheme, iPos2 - 1) + Endif + + If sTheme Begins "+" Then + If iSize <= 32 Then Continue + sTheme = Mid$(sTheme, 2) + Else If sTheme Begins "-" Then + If iSize > 32 Then Continue + sTheme = Mid$(sTheme, 2) + Endif + + If File.Dir(sTemplate) Not Like "*/" & sTheme & "/*" Then Continue + sFile = Mid$(sFile, iPos + 1) + + bBreak = True + + Endif + Endif + + If System.RightToLeft Then + If sFile Ends "-ltr" Then + sFile = Left(sFile, -4) & "-rtl" + Else If sFile Ends "-rtl" Then + sFile = Left(sFile, -4) & "-ltr" + Endif + Endif + + If sFile Begins "$(mime)/" Then + + 'Debug sTemplate;; sFile;; iSize;; iRealSize + + If Not sMime Then + + For Each sTest In ["mimetypes", "mimes"] + If sTemplate Ends "/*" Then + sPath = File.Dir(sTemplate) &/ sTest + Else + sPath = Subst(sTemplate, sSize, sTest) + Endif + If IsDir(sPath) Then + sMime = sTest + Break + Endif + Next + + If Not sMime Then Return + + Endif + + sFile = sMime &/ Mid$(sFile, 9) + + Endif + + If sTemplate Ends "/*" Then + sDir = File.Dir(sTemplate) &/ File.Dir(sFile) + If IsDir(sDir) Then + For Each sSubDir In Dir(sDir, "*", gb.Directory).Sort() + sPath = sDir &/ sSubDir &/ File.Name(sFile) + hPict = DoLoadIcon(sPath, iSize, iRealSize) + If hPict Then Return hPict + Next + sPath = sDir &/ File.Name(sFile) + hPict = DoLoadIcon(sPath, iSize, iRealSize) + If hPict Then Return hPict + Endif + Else + sPath = Subst(sTemplate, sSize, File.Dir(sFile)) &/ File.Name(sFile) + hPict = DoLoadIcon(sPath, iSize, iRealSize) + If hPict Then Return hPict + Endif + + If bBreak Then Break + + Next + +End + +Static Public Function _get((Key) As String, Optional {Default} As String) As Picture + + Dim sPath As String + Dim hPict As Picture + Dim iPos As Integer + Dim iSize As Integer + Dim sSize As String + Dim iTry As Integer + Dim sTemplate As String + Dim sFile As String + Dim sMap As String + Dim sDirPattern As String + 'Dim sCache As String + + If Not $bInit Then + InitTheme + Endif + + If $bDebug Then Error "gb.form: load stock icon: "; Key + + iSize = 16 + iPos = InStr(Key, "/") + If iPos Then + sSize = Left$(Key, iPos - 1) + Key = Mid$(Key, iPos + 1) + iSize = GetSize(sSize) + Endif + + 'hPict = Picture[CStr(iSize) &/ Key] + 'If hPict Then Return hPict + + ' sCache = User.Home &/ ".cache/gambas3/gb.form/theme/" &/ LCase(Application.Theme) &/ CStr(iSize) &/ Key & ".png" + ' If Exist(sCache) Then + ' Try hPict = Picture.Load(sCache) + ' If hPict Then Goto __RETURN + ' Endif + + For Each sPath In $aIconPath + + If sPath Begins "#" Then + + If Key Begins "$(mime)/" Then + Key = Mid$(Key, 9) + Else If Not Stock.Icons.Exist(Key) Then + Break + Endif + + Try Component.Load("gb.form.stock") + If Error Then + Error "gb.form: warning: unable to load gb.form.stock component" + Goto __RETURN + Endif + + sFile = Key + + 'If Key = "tools" Then Error "Using default stock" + + Try hPict = _DefaultStock.LoadImage(Key, iSize, Mid$(sPath, 2)).Picture + If Not Error Then Goto __RETURN + + 'If Key = "tools" Then Error "...failed" + + Else + + iPos = InStr(sPath, ":") + If iPos Then + sMap = Left$(sPath, iPos - 1) + If Left(Key) <> "." Then + sFile = $cIconMap[Key] + If Not sFile Then sFile = Key + Else + sFile = Mid$(Key, 2) + Endif + sPath = Mid$(sPath, iPos + 1) + Else + sFile = Key + If Left(sFile) = "." Then sFile = Mid$(sFile, 2) + Endif + + ' If Key = "tools" Then + ' $bDebugLoad = True + ' Else + ' $bDebugLoad = False + ' Endif + + If sFile = "#" Then Continue + + sDirPattern = Replace(File.Name(sPath), "!", "/") + + sPath = File.Dir(sPath) + If sPath Begins "~/" Then sPath = User.Home &/ Mid$(sPath, 3) + If Not Exist(sPath) Then Continue + + If Left(sPath) = "/" Then + sTemplate = sPath &/ sDirPattern + Else + sTemplate = sPath &/ "&1" + Endif + + hPict = LoadIcon(sTemplate, sFile, iSize) + If hPict Then Goto __RETURN + + hPict = LoadIcon(GetScalablePath(sTemplate), sFile, iSize) + If hPict Then Goto __RETURN + + If sFile Ends ";#" Then Continue + + For Each iTry In $aSizeInc + If iTry < iSize Then Continue + hPict = LoadIcon(sTemplate, sFile, iTry, iSize) + If hPict Then Goto __RETURN + Next + + For Each iTry In $aSizeDec + If iTry >= iSize Then Continue + hPict = LoadIcon(sTemplate, sFile, iTry, iSize) + If hPict Then Goto __RETURN + Next + + Endif + + Next + +__RETURN: + + If Not hPict Then + + If {Default} Then Return _get({Default}) + + If $bDebug Then + Error "gb.form: warning: unable to load "; CStr(iSize) &/ Key + 'hPict = PictureFromSvg(SvgImage.Load("img/unknown.svg"), iSize) + Endif + + Endif + + If hPict Then + ' Main.MkDir(File.Dir(sCache)) + ' Try hPict.Save(sCache) + 'Picture[CStr(iSize) &/ Key] = hPict + Return hPict + Endif + +End + +Static Private Function List_Read() As String[] + + Error "gb.form: warning: Stock.List is deprecated. Use Stock.Icons instead" + Return Icons_Read() + +End + +Static Private Sub GetInheritance(aPath As String[], sTheme As String) As String[] + + Dim aInheritance As New String[] + Dim sLine As String + Dim sChildTheme As String + Dim sName As String + Dim sDir As String + + For Each sDir In aPath + + If Not IsDir(sDir) Then Continue + + For Each sName In Dir(sDir, "*", gb.Directory) + + If LCase(sName) <> sTheme Then Continue + + If Exist(sDir &/ sName &/ "index.theme") Then + + aInheritance.Add(sName) + + For Each sLine In Split(File.Load(sDir &/ sName &/ "index.theme"), "\n") + + If InStr(sLine, "Inherits") Then + + For Each sChildTheme In Split(Scan(sLine, "*=*")[1]) + If LCase(sChildTheme) = sTheme Then Continue + If aInheritance.Exist(sChildTheme) Then Continue + aInheritance.Insert(GetInheritance(aPath, sChildTheme)) + Next + + Break + + Endif + + Next + + Return aInheritance + + Endif + + Next + + Next + + Return aInheritance + +End + +Static Private Sub GetAllThemePath(sMap As String, aPath As String[], sTheme As String) + + Dim sPath As String + + For Each sTheme In GetInheritance(aPath, LCase(sTheme)) + For Each sPath In aPath + AddPath(sMap, sPath &/ sTheme) + Next + Next + +End + +Static Private Function PictureFromSvg(hSvg As SvgImage, iSize As Integer) As Picture + + Dim hImage As Image + + hImage = New Image(iSize, iSize, Color.Transparent) + Paint.Begin(hImage) + Paint.Scale(iSize / hSvg.Width, iSize / hSvg.Height) + hSvg.Paint() + Paint.End + + 'If $bDarkTheme Then hImage.Invert(Color.Background, Color.Foreground) + + Return hImage.Picture + +End + +Static Private Function Debug_Read() As Boolean + + Return $bDebug + +End + +Static Private Sub Debug_Write(Value As Boolean) + + $bDebug = Value + +End + +Static Public Sub Refresh() + + InitTheme + Picture.Flush + +End + +Static Private Function Themes_Read() As String[] + + Dim aTheme As New String[] + Dim sDir As String + Dim sPath As String + Dim sTheme As String + Dim sRoot As String + Dim I As Integer + Dim sName As String + Dim sCar As String + Dim aDir As String[] + + For Each sRoot In ["~/.icons", "~/.local/share/icons", "/usr/share/icons"] + If Not IsDir(sRoot) Then Continue + For Each sDir In Dir(sRoot, "*", gb.Directory) + sPath = sRoot &/ sDir + GoSub ADD_THEME + Next + Next + + aTheme.Insert(["Gambas", "Gambas-Mono"]) + aTheme.Sort(gb.IgnoreCase) + Return aTheme + +ADD_THEME: + + If Stat(sPath).Type = gb.Link Then Return + + aDir = Dir(sPath, "*", gb.Directory) + If aDir.Count = 0 Then Return + If aDir.Count = 1 And If aDir[0] = "cursors" Then Return + + sPath &/= "index.theme" + If Not Exist(sPath) Then Return + If Stat(sPath).Type = gb.Link Then Return + + Try sTheme = File.Load(sPath) + If Error Then Return + If InStr(sTheme, "\nHidden=True") Then Return + + sName = "" + For I = 1 To Len(sDir) + sCar = Mid$(sDir, I, 1) + If I = 1 Or If InStr(" -", Mid$(sDir, I - 1, 1)) Then + sCar = UCase(sCar) + Endif + sName &= sCar + Next + + If Not aTheme.Exist(sName) Then aTheme.Add(sName) + Return + +End + +Static Private Function Icons_Read() As String[] + + If Not $aList Then LoadMap + Return $aList + +End + +Static Private Function Sizes_Read() As String[] + + Return ["tiny", "small", "medium", "large", "huge"] + +End diff --git a/comp/src/gb.form/.src/TabPanel/TabPanel.class b/comp/src/gb.form/.src/TabPanel/TabPanel.class new file mode 100644 index 00000000..06a62b63 --- /dev/null +++ b/comp/src/gb.form/.src/TabPanel/TabPanel.class @@ -0,0 +1,1083 @@ +' Gambas class file + +Export +Inherits UserContainer + +Public Const _Properties As String = "*,Border=True,Count{Range:1;256}=1,Index,Text,TextFont,Picture,Orientation{Align.Top;Bottom}=Top,Closable,CloseButton,Moveable,Highlight" +Public Const _Similar As String = "TabStrip" +Public Const _IsMultiContainer As Boolean = True +Public Const _DefaultEvent As String = "Click" + +Event Click +Event Close(Index As Integer) +Event Move(Source As Integer, Target As Integer) +Event CloseAll + +Property Count As Integer +Property Index As Integer +Property Text As String +Property Picture As Picture +Property Font As Font +Property TextFont As Font +Property Border As Boolean +Property Orientation As Integer +Property Highlight As Boolean +Property Closable As Boolean +Property Read Current As _TabPanelContainer +Property Background As Integer +Property Moveable As Boolean +Property CloseButton As Boolean +Property Read TabBarSize As Integer +Property TabBarPaddingStart As Integer +Property TabBarPaddingEnd As Integer + +Private $hTabBar As DrawingArea +Private $hTabBarContainer As DrawingArea +'Private $hLeftArrow As DrawingArea +'Private $hRightArrow As DrawingArea +Private $X As Integer +'Private $bArrow As Boolean + +Private $aCont As New _TabPanelContainer[] +Private $aButton As New _TabPanelButton[] +Private $iOrientation As Integer = Align.Top +Private $bBorder As Boolean = True +Private $bHighlight As Boolean +Private $bClosable As Boolean +Private $iCurrent As Integer = -1 +Private $hPanel As DrawingArea + +Private $hTimerEnsureVisible As Timer +Private $hTimerRepeat As Timer +Private $iRepeatInc As Integer +Private $iRepeatStart As Integer + +Private Const ARROW_WIDTH As Integer = 12 + +Private $hRightArrow As DrawingArea +Private $hLeftArrow As DrawingArea +Private $bMoveable As Boolean +Private $hCloseAll As ToolButton +Private $hClosePanel As DrawingArea +Private $hObserver As Observer +Private $iTabBarContainerH As Integer + +Private $hTabBarLeft As DrawingArea +Private $hTabBarRight As DrawingArea +Private $bUpdateLayout As Boolean + +Public Sub _new() + + $hTabBar = New DrawingArea(Me) As "TabBar" + '$hTabBar.Arrangement = Arrange.Fill + + ' $hLeftArrow = New DrawingArea($hTabBar) As "Arrow" + ' $hLeftArrow.Ignore = True + ' $hLeftArrow.Hide + ' + ' $hRightArrow = New DrawingArea($hTabBar) As "Arrow" + ' $hRightArrow.Ignore = True + ' $hRightArrow.Hide + + $hTabBarContainer = New DrawingArea($hTabBar) As "TabBarContainer" + $hTabBarContainer.Name = Me.Name & "_TabBarContainer" + $hTabBarContainer.Focus = True + + $hRightArrow = New DrawingArea($hTabBar) As "Arrow" + $hRightArrow.Ignore = True + $hRightArrow.Mouse = Mouse.Pointing + $hRightArrow.Name = Me.Name & "_RightArrow" + $hLeftArrow = New DrawingArea($hTabBar) As "Arrow" + $hLeftArrow.Ignore = True + $hLeftArrow.Mouse = Mouse.Pointing + $hLeftArrow.Name = Me.Name & "_LeftArrow" + + $hPanel = New DrawingArea(Me) As "Panel" + $hPanel.Expand = True + $hPanel.Name = Me.Name & "_Panel" + '$hPanel.Arrangement = Arrange.Fill + '$hPanel.Padding = 1 + + $hObserver = New Observer(Me) As "TabPanel" + + Me.Count = 1 + Me.Arrangement = Arrange.None + + UpdateLayout + +End + +Public Sub _EnsureCurrentVisible() + + If $hTimerEnsureVisible Then Return + $hTimerEnsureVisible = New Timer As "EnsureCurrentVisible" + $hTimerEnsureVisible.Trigger + +End + + +Public Sub EnsureCurrentVisible_Timer() + + Dim X, W As Integer + Dim iLeftIndex, iRightIndex As Integer + + $hTimerEnsureVisible = Null + + If $iCurrent < 0 Or If $iCurrent > $aButton.Max Then Return + If Not $aButton[$iCurrent].Visible Then Return + + If System.RightToLeft Then + + $X = 0 + + If $iCurrent = 0 Then + W = Me.W + Else + With $aButton[$iCurrent] + + X = .X + W = $hTabBarContainer.W + + If X < ARROW_WIDTH Then + W += ARROW_WIDTH - X + Else If X >= ($hTabBar.W - .W - ARROW_WIDTH) Then + W -= X - ($hTabBar.W - .W - ARROW_WIDTH) + Endif + + 'M = .X + W - $hTabBar.W + ARROW_WIDTH + 'If $iCurrent < $aButton.Max Then M += ARROW_WIDTH + '$X = Max($X, - M) + + End With + Endif + + W = Max(Me.W, W) + + '$X = Max($hTabBar.W - $hTabBarContainer.W, $X) + '$X = Min(ARROW_WIDTH, $X) + + Else + + If Me.W <= ($aButton[$iCurrent].W + ARROW_WIDTH) Then + + $X = -$aButton[$iCurrent].X + + Else + + If $iCurrent = 0 Then + $X = 0 + Else + With $aButton[$iCurrent] + + X = $hTabBarContainer.X + .X + W = .W + + If X < ARROW_WIDTH Then + $X = $X + ARROW_WIDTH - X + X = $X + .X + Endif + + If X >= ($hTabBar.W - W - ARROW_WIDTH) Then + $X = $X - (X - ($hTabBar.W - W)) + 'If $iCurrent < $aButton.Max Then + $X -= ARROW_WIDTH + Endif + + End With + + Endif + + $X = Max($hTabBar.W - ($aButton[$aButton.Max].X + $aButton[$aButton.Max].W), $X) + $X = Min(0, $X) + + Endif + + W = Me.W - $X + + Endif + + '$bArrow = False + + ' If $bArrow Then + ' W -= ARROW_WIDTH + ' If System.RightToLeft Then $X += ARROW_WIDTH + ' Endif + + $hTabBarContainer.Move($X, 0, W, $hTabBar.H) + + If $hTabBar.W >= (ARROW_WIDTH * 3) And If $aButton.Count Then + If System.RightToLeft Then + iLeftIndex = GetLastIndex() + iRightIndex = _GetFirstIndex() + Else + iLeftIndex = _GetFirstIndex() + iRightIndex = GetLastIndex() + Endif + $hLeftArrow.Visible = $X < (-$aButton[iLeftIndex].X) '+ $aButton[iIndex].X + $aButton[iIndex].W) > $hTabBar.W + $hRightArrow.Visible = ($X + $aButton[iRightIndex].X + $aButton[iRightIndex].W) > $hTabBar.W + Else + $hLeftArrow.Hide + $hRightArrow.Hide + Endif + + CheckMouse + +End + +Private Sub CheckMouse() + + Dim hButton As _TabPanelButton + + If Not $bClosable Then Return + + For Each hButton In $aButton + hButton.Update + Next + +End + + +Private Sub UpdateLayout() + + Dim hCtrl As _TabPanelButton + Dim W As Integer + Dim H As Integer + Dim X As Integer + Dim PL, PR As Integer + Dim Y As Integer + + If $bUpdateLayout Then Return + $bUpdateLayout = True + + W = Me.W + H = TabBarSize_Read() + $hTabBar.Height = H + 1 + + + Y = If(Align.Top, 0, $hTabBar.Y) + + If $hClosePanel Then + If W >= H Then + W -= H + If System.RightToLeft Then + $hClosePanel.Move(X, Y, H, H + 1) + X += H + Else + $hClosePanel.Move(X + W, Y, H, H + 1) + Endif + $hCloseAll.Move(0, 0, H, H) + $hClosePanel.Show + $hClosePanel.Raise + Else + $hClosePanel.Hide + Endif + Endif + + PL = TabBarPaddingStart_Read() + PR = TabBarPaddingEnd_Read() + + If System.RightToLeft Then + If $hTabBarLeft Then $hTabBarLeft.Move(W - PL, Y, PL, H + 1) + If $hTabBarRight Then $hTabBarRight.Move(0, Y, PR, H + 1) + Swap PL, PR + Else + If $hTabBarLeft Then $hTabBarLeft.Move(0, Y, PL, H + 1) + If $hTabBarRight Then $hTabBarRight.Move(W - PR, Y, PR, H + 1) + Endif + + X += PL + W -= PL + PR + W = Max(W, 0) + + Me._Arrangement = Arrange.None + + Select Case $iOrientation + Case Align.Top + $hTabBar.Move(X, 0, W, $hTabBar.H) + $hPanel.Move(0, $hTabBar.H, Me.W, Me.H - $hTabBar.H) + '$hTabBar.Next = $hPanel + Case Align.Bottom + $hTabBar.Move(X, Me.H - $hTabBar.H, W, $hTabBar.H) + $hPanel.Move(0, 0, Me.W, Me.H - $hTabBar.H) + 'Me._Arrangement = Arrange.Vertical + '$hPanel.Next = $hTabBar + End Select + + $hTabBarContainer.Arrangement = Arrange.None + + For Each hCtrl In $aButton + If hCtrl.Visible Then + hCtrl.Orientation = $iOrientation + hCtrl.UpdateLayout + hCtrl.Refresh + hCtrl.Raise + Endif + Next + + $hTabBarContainer.Arrangement = Arrange.Horizontal + _EnsureCurrentVisible + + $bUpdateLayout = False + +End + +Public Sub TabBar_Arrange() + + _EnsureCurrentVisible + + $hRightArrow.Move($hTabBar.W - ARROW_WIDTH, 0, ARROW_WIDTH, $hTabBar.H) + $hLeftArrow.Move(0, 0, ARROW_WIDTH, $hTabBar.H) + + If $hTabBarContainer.H <> $iTabBarContainerH Then + $iTabBarContainerH = $hTabBarContainer.H + UpdateLayout + Endif + +End + +Public Sub Arrow_Enter() + + Last.Refresh + +End + +Public Sub Arrow_Leave() + + Last.Refresh + $hTimerRepeat = Null + +End + +Public Sub Arrow_Draw() + + If $iOrientation = Align.Top Then + Paint.FillRect(0, 0, Paint.W, Paint.H - 1, _GetBackground()) + Else + Paint.FillRect(0, 1, Paint.W, Paint.H - 1, _GetBackground()) + Endif + Style.PaintArrow(0, 0, Paint.W, Paint.H, If(Last = $hLeftArrow, Align.Left, Align.Right), Style.StateOf(Last)) + +End + +Public Sub Arrow_MouseDown() + + If Mouse.Left Then + + If Last = $hRightArrow Xor System.RightToLeft Then + Try _MoveNext() + $iRepeatInc = 1 + Else + Try _MovePrevious() + $iRepeatInc = -1 + Endif + + $hTimerRepeat = New Timer As "TimerRepeat" + $hTimerRepeat.Delay = 100 + $hTimerRepeat.Start + $iRepeatStart = 0 + + Endif + +End + +Public Sub Arrow_MouseUp() + + $hTimerRepeat = Null + +End + +Public Sub TimerRepeat_Timer() + + If $iRepeatStart < 3 Then + Inc $iRepeatStart + Else + If $iRepeatInc > 0 Then + Try _MoveNext() + Else + Try _MovePrevious() + Endif + If Error Then $hTimerRepeat = Null + Endif + +End + + +Public Sub Arrow_DblClick() + + If Mouse.Left Then + If Last = $hRightArrow Then + Try Me.Index = GetLastIndex() + Else + Try Me.Index = _GetFirstIndex() + Endif + Endif + +End + + + +Private Function Count_Read() As Integer + + Return $aCont.Count + +End + + +Private Sub Count_Write(iCount As Integer) + + Dim iInd As Integer + Dim hTab As _TabPanelContainer + Dim hButton As _TabPanelButton + Dim iCurrent As Integer + Dim bLocked As Boolean + + If iCount < 1 Then Error.Raise("Bad argument") + If iCount = $aCont.Count Then Return + + iCurrent = $iCurrent + + bLocked = Object.IsLocked(Me) + If Not bLocked Then Object.Lock(Me) + + If iCount < $aCont.Count Then + + For iInd = $aCont.Max To iCount Step -1 + hTab = $aCont[iInd] + If hTab.Children.Count Then Error.Raise("TabPanel container is not empty") + Next + + For iInd = $aCont.Max To iCount Step -1 + $aCont[iInd]._Delete + $aButton[iInd].Delete + If iInd <= iCurrent Then Dec iCurrent + Next + + $aCont.Remove(iCount, -1) + $aButton.Remove(iCount, -1) + + Else + + For iInd = $aCont.Count To iCount - 1 + hTab = New _TabPanelContainer($hPanel) As "_TabPanelContainer" + $aCont.Add(hTab) + hButton = New _TabPanelButton($hTabBarContainer) As "_TabPanelButton" + $aButton.Add(hButton) + hButton.Orientation = $iOrientation + Next + 'ME.Container = hCont + + Endif + + UpdateLayout + + $iCurrent = -1 + If iCurrent < 0 Then iCurrent = $aCont.Max + + If Not bLocked Then Object.Unlock(Me) + + Try Index_Write(iCurrent) + +End + +Private Function Index_Read() As Integer + + Return $iCurrent + +End + +Private Sub Index_Write(iIndex As Integer) + + If iIndex < 0 Or iIndex >= $aCont.Count Then Error.Raise("Bad index") + + If iIndex = $iCurrent Then Return + + If $iCurrent >= 0 Then $aButton[$iCurrent].Selected = False + $iCurrent = iIndex + If $iCurrent >= 0 Then $aButton[$iCurrent].Selected = True + + UpdateContainer + + Me._Container = $aCont[$iCurrent] + _EnsureCurrentVisible + + Raise Click + +End + +Private Sub UpdateCurrentContainer() + + If $iCurrent < 0 Then Return + + If $bBorder Then + If $iOrientation = Align.Top Then + $aCont[$iCurrent].Move(1, 0, $hPanel.W - 2, $hPanel.H - 1) + Else + $aCont[$iCurrent].Move(1, 1, $hPanel.W - 2, $hPanel.H - 1) + Endif + Else + $aCont[$iCurrent].Move(0, 0, $hPanel.W, $hPanel.H) + Endif + +End + + +Private Sub UpdateContainer() + + Dim iInd As Integer + + For iInd = 0 To $aCont.Max + + With $aCont[iInd] + If iInd = $iCurrent Then + UpdateCurrentContainer + .Show + '.Raise + Else If .Visible Then + .Hide + '.Move(0, - $hPanel.H) + Endif + End With + + Next + +End + +Private Function Text_Read() As String + + Return $aCont[$iCurrent].Text + +End + +Private Sub Text_Write(sText As String) + + $aCont[$iCurrent].Text = sText + +End + +Private Function Picture_Read() As Picture + + Return $aCont[$iCurrent].Picture + +End + +Private Sub Picture_Write(hPict As Picture) + + $aCont[$iCurrent].Picture = hPict + +End + +Public Function _get(Index As Integer) As _TabPanelContainer + + If Index < 0 Or Index >= $aCont.Count Then Error.Raise("Bad index") + Return $aCont[Index] + +End + +Private Function Font_Read() As Font + + Return Super.Font + +End + +Private Sub Font_Write(hFont As Font) + + Super.Font = hFont + UpdateLayout + +End + +Private Function Border_Read() As Boolean + + Return $bBorder + +End + +Private Sub Border_Write(bBorder As Boolean) + + Dim hButton As _TabPanelButton + + $bBorder = bBorder + + 'Panel_Arrange + UpdateCurrentContainer + + $hPanel.Refresh + + For Each hButton In $aButton + hButton.Refresh + Next + +End + +Private Function TextFont_Read() As Font + + Return $hTabBar.Font + +End + +Private Sub TextFont_Write(Value As Font) + + $hTabBar.Font = Value + UpdateLayout + +End + +' Public Sub _GetIconView() As IconView +' +' Return $hIconView +' +' End + +Public Sub _GetIndex(hCont As Control) As Integer + + If hCont Is _TabPanelContainer Then Return $aCont.Find(hCont) + If hCont Is _TabPanelButton Then Return $aButton.Find(hCont) + Return -1 + +End + +' Public Sub IconView_Select() +' +' If Not $hIconView.Key Then Return +' Index_Write(CInt($hIconView.Key)) +' +' End + +' Public Sub IconView_MouseWheel() +' +' If Mouse.Delta < 0 And If $iCurrent < $aCont.Max Then +' Index_Write($iCurrent + 1) +' Else If Mouse.Delta > 0 And If $iCurrent > 0 Then +' Index_Write($iCurrent - 1) +' Endif +' +' End + +Public Sub _GetButton(iIndex As Integer) As _TabPanelButton + + Return $aButton[iIndex] + +End + +Public Sub TabBarContainer_Draw() + + Dim hLast As _TabPanelButton + + Try hLast = $aButton[GetLastIndex()] + If Error Then Return + + Draw.Foreground = Color.LightForeground + Select Case $iOrientation + Case Align.Top + If System.RightToLeft Then + Draw.Line(0, $hTabBarContainer.H - 1, hLast.X - 1, $hTabBar.H - 1) + Else + Draw.Line(hLast.X + hLast.W, $hTabBarContainer.H - 1, $hTabBarContainer.W, $hTabBar.H - 1) + Endif + Case Align.Bottom + If System.RightToLeft Then + Draw.Line(0, 0, hLast.X - 1, 0) + Else + Draw.Line(hLast.X + hLast.W, 0, $hTabBarContainer.W, 0) + Endif + End Select + +End + +Public Sub Panel_Draw() + + If $bBorder Then + Draw.Foreground = Color.LightForeground + Select Case $iOrientation + Case Align.Top + Draw.Line(0, 0, 0, $hPanel.H - 1) + Draw.Line(0, $hPanel.H - 1, $hPanel.W - 1, $hPanel.H - 1) + Draw.Line($hPanel.W - 1, $hPanel.H - 1, $hPanel.W - 1, 0) + Case Align.Bottom + Draw.Line(0, $hPanel.H - 1, 0, 0) + Draw.Line(0, 0, $hPanel.W - 1, 0) + Draw.Line($hPanel.W - 1, 0, $hPanel.W - 1, $hPanel.H - 1) + End Select + Endif + +End + +Public Sub Panel_Arrange() + + UpdateCurrentContainer + +End + + + +Private Function Orientation_Read() As Integer + + Return $iOrientation + +End + +Private Sub Orientation_Write(Value As Integer) + + $iOrientation = Value + UpdateLayout + +End + +Private Function Current_Read() As _TabPanelContainer + + Try Return $aCont[$iCurrent] + +End + +Public Sub Remove(Index As Integer) + + Dim iCurrent As Integer + Dim hTab As _TabPanelContainer + + If Index < 0 Or Index > $aCont.Max Then Error.Raise("Bad index") + If $aCont.Count = 1 Then Return + + hTab = $aCont[Index] + If hTab.Children.Count Then Error.Raise("TabPanel container is not empty") + $aButton[Index].Delete + $aButton.Remove(Index) + $aCont.Remove(Index) + If $iCurrent = Index Then + $iCurrent = -1 + iCurrent = Min($aCont.Max, Index) + Index_Write(iCurrent) + Else If $iCurrent > Index Then + Dec $iCurrent + Endif + UpdateLayout + hTab._Delete() + +End + +Public Sub _SetVisible(Index As Integer, bVisible As Boolean) + + If Not bVisible And If Index = $iCurrent Then + Try _MoveNext() + If Error Then Try _MovePrevious() + Endif + $aButton[Index].Visible = bVisible + UpdateLayout + +End + +Public Sub _IsVisible(Index As Integer) As Boolean + + Return $aButton[Index].Visible + +End + +Private Sub GetPreviousIndex(iIndex As Integer) As Integer + + Dim I As Integer + + For I = iIndex - 1 DownTo 0 + If $aButton[I].Visible Then Return I + Next + Return -1 + +End + +Private Sub GetNextIndex(iIndex As Integer) As Integer + + Dim I As Integer + + For I = iIndex + 1 To $aButton.Max + If $aButton[I].Visible Then Return I + Next + Return -1 + +End + +Public Sub _GetFirstIndex() As Integer + + Return GetNextIndex(-1) + +End + +Private Sub GetLastIndex() As Integer + + Return GetPreviousIndex($aButton.Count) + +End + +Public Sub _MovePrevious() + + Me.Index = GetPreviousIndex($iCurrent) + +End + +Public Sub _MoveNext() + + Me.Index = GetNextIndex($iCurrent) + +End + +Private Sub _MoveFirst() + + Me.Index = GetNextIndex(-1) + +End + +Private Sub _MoveLast() + + Me.Index = GetPreviousIndex($aCont.Count) + +End + + + +Private Function Highlight_Read() As Boolean + + Return $bHighlight + +End + +Private Sub Highlight_Write(Value As Boolean) + + $bHighlight = Value + UpdateLayout + +End + +Private Function Closable_Read() As Boolean + + Return $bClosable + +End + +Private Sub Closable_Write(Value As Boolean) + + $bClosable = Value + UpdateLayout + +End + +Public Sub _Close(Index As Integer) + + Raise Close(Index) + +End + +Public Sub _GetBackground() As Integer + + Return Color.Gradient(If(Me.Background = Color.Default, Color.Background, Me.Background), Color.LightForeground) + +End + +Public Sub TabBarContainer_KeyPress() + + If $aCont.Count = 0 Then Return + + Select Case Key.Code + + Case Key.Left, Key.PageUp + If System.RightToLeft Then + Try _MoveNext + Else + Try _MovePrevious + Endif + Stop Event + + Case Key.Right, Key.PageDown + If System.RightToLeft Then + Try _MovePrevious + Else + Try _MoveNext + Endif + Stop Event + + Case Key.Home + Try _MoveFirst + Stop Event + + Case Key.End + Try _MoveLast + Stop Event + + End Select + +End + +Private Function Background_Read() As Integer + + Return Super.Background + +End + +Private Sub Background_Write(Value As Integer) + + Super.Background = Value + $hTabBar.Refresh + +End + +Public Sub _MoveTab(hSrc As _TabPanelButton, hDst As _TabPanelButton, bAfter As Boolean) + + Dim S, T As Integer + Dim hSrcPanel As Control + Dim bLocked As Boolean + + If hSrc = hDst Then Return + + bLocked = Object.IsLocked(Me) + If Not bLocked Then Object.Lock(Me) + + S = _GetIndex(hSrc) + $aButton.Remove(S) + hSrcPanel = $aCont[S] + $aCont.Remove(S) + + T = _GetIndex(hDst) + If bAfter Then Inc T + $aButton.Add(hSrc, T) + $aCont.Add(hSrcPanel, T) + + UpdateLayout + + If Not bLocked Then Object.Unlock(Me) + + Raise Move(S, T) + + Index_Write(T) + +End + +Private Function Moveable_Read() As Boolean + + Return $bMoveable + +End + +Private Sub Moveable_Write(Value As Boolean) + + $bMoveable = Value + +End + +Private Function CloseButton_Read() As Boolean + + Return $hClosePanel + +End + +Private Sub CloseButton_Write(Value As Boolean) + + Dim hSave As Container + + If Value = CloseButton_Read() Then Return + + If Value Then + + hSave = Me._Container + Me._Container = Null + + $hClosePanel = New DrawingArea(Me) As "ClosePanel" + $hCloseAll = New ToolButton($hClosePanel) As "CloseAll" + $hCloseAll.Picture = Picture["icon:/small/close"] + $hCloseAll.Show + + Me._Container = hSave + + Else + $hClosePanel.Delete + $hClosePanel = Null + $hCloseAll = Null + Endif + + TabBar_Arrange + +End + +Public Sub TabPanel_Arrange() + + UpdateLayout + +End + +Public Sub ClosePanel_Draw() + + Select Case $iOrientation + Case Align.Top + Paint.FillRect(0, Paint.H - 1, Paint.W, 1, Color.LightForeground) + Case Align.Bottom + Paint.FillRect(0, 0, Paint.W, 1, Color.LightForeground) + End Select + +End + +Public Sub CloseAll_Click() + + Raise CloseAll + +End + +Private Function TabBarPaddingStart_Read() As Integer + + If $hTabBarLeft Then Return $hTabBarLeft.W + +End + +Private Sub TabBarPaddingStart_Write(Value As Integer) + + Dim hSave As Container + + If TabBarPaddingStart_Read() = Value Then Return + If Value > 0 Then + If Not $hTabBarLeft Then + hSave = Me._Container + Me._Container = Null + $hTabBarLeft = New DrawingArea(Me) As "ClosePanel" + Me._Container = hSave + $hTabBarLeft.Ignore = True + Endif + $hTabBarLeft.W = Value + Else + If $hTabBarLeft Then + $hTabBarLeft.Delete + $hTabBarLeft = Null + Endif + Endif + UpdateLayout + +End + +Private Function TabBarPaddingEnd_Read() As Integer + + If $hTabBarRight Then Return $hTabBarRight.W + +End + +Private Sub TabBarPaddingEnd_Write(Value As Integer) + + Dim hSave As Container + + If TabBarPaddingEnd_Read() = Value Then Return + If Value > 0 Then + If Not $hTabBarRight Then + hSave = Me._Container + Me._Container = Null + $hTabBarRight = New DrawingArea(Me) As "ClosePanel" + Me._Container = hSave + $hTabBarRight.Ignore = True + Endif + $hTabBarRight.W = Value + Else + If $hTabBarRight Then + $hTabBarRight.Delete + $hTabBarRight = Null + Endif + Endif + UpdateLayout + +End + +Private Function TabBarSize_Read() As Integer + + Return $hTabBar.Font.Height + Desktop.Scale * 1.75 + +End diff --git a/comp/src/gb.form/.src/TabPanel/_TabPanelButton.class b/comp/src/gb.form/.src/TabPanel/_TabPanelButton.class new file mode 100644 index 00000000..77f480a6 --- /dev/null +++ b/comp/src/gb.form/.src/TabPanel/_TabPanelButton.class @@ -0,0 +1,580 @@ +' Gambas class file + +Inherits UserControl + +Private $hDrawingArea As DrawingArea + +Property Text As String +Property RichText As String +Property Selected As Boolean +Property Orientation As Integer +Property Picture As Picture +Property Closable As Boolean +'Property Visible As Boolean + +Private $sText As String +Private $bRichText As Boolean +Private $bSelected As Boolean +Private $iOrientation As Integer = Align.Top +Private $hPicture As Picture +Private $bShowClose As Boolean +Private $bInClose As Boolean + +Static Private BUTTON_SIZE As Integer + +Static Private $bDragging As Boolean +Private $bDrag As Boolean +Private $hDragImage As Image +Private $hDragWindow As Window +Private $DX As Integer +Private $SX As Integer +Private $hTimerDrag As Timer +Private $bClosable As Boolean +Private $bInside As Boolean + +Public Sub _new() + + If BUTTON_SIZE = 0 Then BUTTON_SIZE = Desktop.Scale * 2 + + $hDrawingArea = New DrawingArea(Me) As "DrawingArea" + $hDrawingArea.Mouse = Mouse.Pointing + $hDrawingArea.Name = Me.Name & "_DrawingArea" + +End + +Private Sub GetParent() As TabPanel + + Return Me.Parent.Parent.Parent + +End + +Private Sub GetIndex() As Integer + + Return GetParent()._GetIndex(Me) + +End + +Private Sub IsClosable() As Boolean + + If $bClosable Then Return True + If GetParent().Closable Then Return True + +End + +Private Sub GetPictureSize(ByRef WP As Integer, ByRef HP As Integer) + + HP = Min($hPicture.H, Me.H - Desktop.Scale) + WP = $hPicture.W * HP / $hPicture.H + +End + + +Public Sub DrawingArea_Draw() + + Dim iFg As Integer + Dim X, W As Integer + Dim bBorder As Boolean + Dim hTabPanel As TabPanel + Dim bClosable As Boolean + Dim bHighlight As Boolean + Dim bFirst As Boolean + Dim iIndex As Integer + Dim iBg As Integer + Dim hFont As Font + Dim S As Float + Dim HP As Integer + Dim WP As Float + + hTabPanel = GetParent() + + ' If $bDrag Then + ' + ' Draw.FillRect(0, 0, Me.W, Me.H, hTabPanel._GetBackground()) + ' + ' Draw.Foreground = Color.LightForeground + ' + ' Select Case $iOrientation + ' + ' Case Align.Top + ' Draw.Line(0, Me.H - 1, Me.W - 1, Me.H - 1) + ' + ' Case Align.Bottom + ' Draw.Line(0, 0, Me.W - 1, 0) + ' + ' End Select + ' + ' Return + ' + ' Endif + + iIndex = GetIndex() + bHighlight = hTabPanel.Highlight And Not $bSelected + bClosable = IsClosable() + + If bHighlight Then + Paint.FillRect(0, 0, Me.W, Me.H, hTabPanel._GetBackground()) + Else + iBg = hTabPanel.Background + If iBg <> Color.Default Then Paint.FillRect(0, 0, Me.W, Me.H, iBg) + Endif + + iFg = Me.Foreground + If iFg = Color.Default Then + iFg = hTabPanel.Foreground + If iFg = Color.Default Then iFg = Style.ForegroundOf(hTabPanel) + Endif + + X = 0 + W = Me.W + + If $bSelected And If Me.Parent.HasFocus Then + Draw.Foreground = Color.LightBackground + If $iOrientation = Align.Bottom Then Draw.Translate(0, -2) + If hTabPanel.Border Then + 'Draw.Rect(2, 2, Draw.W - 4, Draw.H - 2) + Style.PaintButton(2, 2, Draw.W - 4, Draw.H - 2, False, Draw.Hover, True) + Else If iIndex = 0 Then + If System.RightToLeft Then + Style.PaintButton(2, 1, Draw.W - 3, Draw.H - 1, False, Draw.Hover, True) + Else + Style.PaintButton(1, 1, Draw.W - 3, Draw.H - 1, False, Draw.Hover, True) + Endif + Else + Style.PaintButton(2, 1, Draw.W - 4, Draw.H - 1, False, Draw.Hover, True) + Endif + Endif + + If $hPicture Then + GetPictureSize(ByRef WP, ByRef HP) + If System.RightToLeft Then + W -= WP + Desktop.Scale * 1.5 + Paint.DrawPicture($hPicture, Me.W - WP - Desktop.Scale, (Me.H - HP) / 2, WP, HP) + Else + X += WP + Desktop.Scale * 1.5 + W = Me.W - X + Paint.DrawPicture($hPicture, Desktop.Scale, (Me.H - HP) / 2, WP, HP) + Endif + Else + X += Desktop.Scale + W -= Desktop.Scale * 2 + Endif + + If bClosable Then + W -= BUTTON_SIZE + If System.RightToLeft Then X += BUTTON_SIZE + Endif + + Paint.Background = iFg + hFont = hTabPanel.TextFont + If Not hFont Then hFont = hTabPanel.Font + Paint.Font = hFont + + If Not $bSelected And If $bInside Then + If $bRichText Then + Paint.DrawRichTextShadow($sText, X, 0, W, Me.Height, Align.Normal) + Else + Paint.DrawTextShadow($sText, X, 0, W, Me.Height, Align.Normal, -1) + Endif + Endif + + If $bRichText Then + Paint.DrawRichText($sText, X, 0, W, Me.Height, Align.Normal) + Else + Paint.DrawText($sText, X, 0, W, Me.Height, Align.Normal) + Endif + + Draw.Foreground = Color.LightForeground + + bBorder = hTabPanel.Border + bFirst = iIndex = hTabPanel._GetFirstIndex() + + Select Case $iOrientation + + Case Align.Top + If $bSelected Then + If Not bFirst Or If bBorder Or If System.RightToLeft Or If hTabPanel.TabBarPaddingStart Then Draw.Line(0, Me.H - 1, 0, 0) + If Not bFirst Or If bBorder Or If Not System.RightToLeft Then Draw.Line(Me.W - 1, 0, Me.W - 1, Me.H - 1) + If bBorder Then Draw.Line(0, 0, Me.W - 1, 0) + Else + Draw.Line(0, Me.H - 1, Me.W - 1, Me.H - 1) + Endif + + Case Align.Bottom + If $bSelected Then + If Not bFirst Or If bBorder Or If System.RightToLeft Or If hTabPanel.TabBarPaddingStart Then Draw.Line(0, 0, 0, Me.H - 1) + If Not bFirst Or If bBorder Or If Not System.RightToLeft Then Draw.Line(Me.W - 1, Me.H - 1, Me.W - 1, 0) + If bBorder Then Draw.Line(0, Me.H - 1, Me.W - 1, Me.H - 1) + Else + Draw.Line(0, 0, Me.W - 1, 0) + Endif + + End Select + + If $bShowClose And If Not $bDragging Then + + Paint.Save + + If System.RightToLeft Then + Paint.Translate(4, (Me.H - BUTTON_SIZE) \ 2) + Else + Paint.Translate(Me.W - BUTTON_SIZE - 4, (Me.H - BUTTON_SIZE) \ 2) + Endif + + S = BUTTON_SIZE / 4 + Paint.MoveTo(S, S) + Paint.RelLineTo(S * 2, S * 2) + Paint.MoveTo(S * 3, S) + Paint.RelLineTo(-S * 2, S * 2) + + Paint.LineWidth = Desktop.Scale / 4 + Paint.LineCap = Paint.LineCapRound + Paint.Background = If($bInClose, Color.TextForeground, Color.LightForeground) + + Paint.Stroke + + Paint.Restore + + Endif + +End + +Private Function Text_Read() As String + + If Not $bRichText Then Return $sText + +End + +Public Sub UpdateLayout() + + Dim hTabPanel As TabPanel = GetParent() + Dim S As Integer + Dim bClosable As Boolean = IsClosable() + Dim hFont As Font + Dim WP, HP As Integer + + hFont = hTabPanel.TextFont + If Not hFont Then hFont = hTabPanel.Font + + If $bRichText Then + S = hFont.RichTextWidth($sText) + Desktop.Scale * 2.5 + Else + S = hFont.TextWidth($sText) + Desktop.Scale * 2.5 + Endif + + ' Select Case $iOrientation + ' Case Align.Left, Align.Right + ' If $hPicture Then S += $hPicture.H '- 4 + ' If bClosable Then S += BUTTON_SIZE + ' Me.H = S + ' Case Else + If $hPicture Then + GetPictureSize(ByRef WP, ByRef HP) + S += WP '- 4 + Endif + If bClosable Then S += BUTTON_SIZE + Me.W = S + + 'End Select + + GetParent().TabBar_Arrange + +End + +Private Sub Text_Write(Value As String) + + $sText = Value + $bRichText = False + UpdateLayout + $hDrawingArea.Refresh + +End + +Private Function Selected_Read() As Boolean + + Return $bSelected + +End + +Private Sub Selected_Write(Value As Boolean) + + $bSelected = Value + SetMouse + DrawingArea_MouseMove + $hDrawingArea.Refresh + +End + +Private Function Orientation_Read() As Integer + + Return $iOrientation + +End + +Private Sub Orientation_Write(Value As Integer) + + $iOrientation = Value + UpdateLayout + +End + +Public Sub DrawingArea_MouseDown() + + Dim hTabPanel As TabPanel + If Mouse.Left Then + hTabPanel = GetParent() + If $bInClose And If IsClosable() Then + hTabPanel._Close(GetIndex()) + Else + If $bSelected Then Return + 'Me.Parent.SetFocus() + hTabPanel.Index = GetIndex() + Endif + ' Else If Mouse.Middle Then + ' If IsClosable() Then + ' hTabPanel = GetParent() + ' hTabPanel._Close(GetIndex()) + ' Endif + Endif + +End + +Public Sub DrawingArea_MouseDrag() + + StartDrag + +End + +Public Sub DrawingArea_MouseUp() + + StopDrag + +End + +Public Sub DrawingArea_MouseWheel() + + Try Application.PreviousControl.SetFocus + + If Mouse.Delta > 0 Xor System.RightToLeft Then + Try GetParent()._MovePrevious() + Else + Try GetParent()._MoveNext() + Endif + + Stop Event + +End + +Private Function Picture_Read() As Picture + + Return $hPicture + +End + +Private Sub Picture_Write(Value As Picture) + + $hPicture = Value + UpdateLayout + $hDrawingArea.Refresh + +End + +Public Sub DrawingArea_Enter() + + 'Debug ">";; Me.Text + $bInside = True + $hDrawingArea.Tracking = True + $bShowClose = IsClosable() + $hDrawingArea.Refresh + +End + +Private Sub SetMouse() + + $hDrawingArea.Mouse = If($bSelected And Not $bInClose, Mouse.Default, Mouse.Pointing) + +End + + +Public Sub DrawingArea_Leave() + + 'Debug "<";; Me.Text + $bInside = False + $bShowClose = False + $bInClose = False + SetMouse + $hDrawingArea.Tracking = False + $hDrawingArea.Refresh + +End + +Public Sub DrawingArea_MouseMove() + + Dim bInClose As Boolean + Dim X As Integer + Dim bShowClose As Boolean + Dim bShift As Boolean + Dim Y As Integer + + If $bDrag Then TimerDrag_Timer + + X = Mouse.ScreenX - Me.ScreenX + Y = Mouse.ScreenY - Me.ScreenY + Try bShift = Mouse.Shift And Mouse.Control + 'If Not Error And If bShift Then Debug X + + If X >= 0 And If X < Me.W And If Y >= 0 And If Y < Me.H Then + bShowClose = IsClosable() + + If bShowClose Then + If System.RightToLeft Then + bInClose = (X >= 0) And (X < BUTTON_SIZE) + Else + bInClose = (X >= (Me.W - BUTTON_SIZE)) And (X < Me.W) + Endif + Endif + $bInside = True + Else + $bInside = False + Endif + + If bInClose <> $bInClose Or If bShowClose <> $bShowClose Then + $bInClose = bInClose + $bShowClose = bShowClose + SetMouse + $hDrawingArea.Refresh + Endif + +End + +Public Sub Update() + + If $bDrag Then Return + DrawingArea_MouseMove + +End + + +Private Function RichText_Read() As String + + If $bRichText Then Return $sText + +End + +Private Sub RichText_Write(Value As String) + + $sText = Value + $bRichText = True + UpdateLayout + $hDrawingArea.Refresh + +End + + +Private Sub StartDrag() + + Dim hTabPanel As TabPanel = GetParent() + + If $bDrag Then Return + If Not hTabPanel.Moveable Then Return + If Me.Parent.Children.Count <= 1 Then Return + + $hDragImage = New Image($hDrawingArea.W, $hDrawingArea.H, Color.Background) + Paint.Begin($hDragImage) + ' TODO: How to get the actual font of the control ??? + Paint.Font = hTabPanel.TextFont + DrawingArea_Draw + Paint.End + + $bDrag = True + $bDragging = True + $hDrawingArea.Tracking = True + 'Me.Parent.SetFocus + + $DX = Me.ScreenX + $SX = Mouse.ScreenX + + $hDragWindow = New Window + $hDragWindow.TopOnly = True + $hDragWindow.Border = False + $hDragWindow.Utility = True + $hDragWindow.SkipTaskbar = True + $hDragWindow.Move(Me.ScreenX, Me.ScreenY, $hDragImage.W, $hDragImage.H) + $hDragWindow.Picture = $hDragImage.Picture + $hDragWindow.Show + + $hTimerDrag = New Timer As "TimerDrag" + $hTimerDrag.Delay = 1000 + $hTimerDrag.Start + + $hDrawingArea.Grab() + +End + +Public Sub TimerDrag_Timer() + + Dim hTabPanel As TabPanel = GetParent() + Dim hButton As _TabPanelButton + Dim DX, W As Integer + Dim bAfter As Boolean + Dim hTarget As _TabPanelButton + + $hDragWindow.X = $DX + Mouse.ScreenX - $SX + DX = Mouse.ScreenX '$hDragWindow.ScreenX + $hDrawingArea.W \ 2 + + W = Desktop.Scale * 3 + + For Each hButton In Me.Parent.Children + + If Not hButton.Visible Then Continue + + If hButton = Me Then + If $hDragWindow.X < (hButton.ScreenX + hButton.W) Then Break + bAfter = True + Continue + Endif + + If bAfter Then + + 'Debug "After";; $hDragWindow.X; " >= "; hButton.ScreenX + If $hDragWindow.X >= hButton.ScreenX Then hTarget = hButton + + Else + + 'Debug "Before";; $hDragWindow.X; " <= "; hButton.ScreenX + If $hDragWindow.X <= hButton.ScreenX Then hTarget = hButton + + Endif + + Next + + 'Debug "----> "; hTabPanel._GetIndex(hTarget) + + If hTarget Then hTabPanel._MoveTab(Me, hTarget, bAfter) + +End + +Private Sub StopDrag() + + If Not $bDrag Then Return + $hDragWindow.Delete + $hTimerDrag.Stop + $hTimerDrag = Null + $hDrawingArea.Tracking = False + $bDrag = False + $bDragging = False + +End + +Private Function Closable_Read() As Boolean + + Return $bClosable + +End + +Private Sub Closable_Write(Value As Boolean) + + $bClosable = Value + UpdateLayout + $hDrawingArea.Refresh + +End diff --git a/comp/src/gb.form/.src/TabPanel/_TabPanelContainer.class b/comp/src/gb.form/.src/TabPanel/_TabPanelContainer.class new file mode 100644 index 00000000..0d8f2c9a --- /dev/null +++ b/comp/src/gb.form/.src/TabPanel/_TabPanelContainer.class @@ -0,0 +1,108 @@ +' Gambas class file + +Export + +Inherits UserControl + +Property Text As String +Property RichText As String +Property Picture As Picture +Property Visible As Boolean +Property Closable As Boolean + +Private Sub GetParent() As TabPanel + + Return Me.Parent.Parent + +End + +Private Sub GetIndex() As Integer + + Return GetParent()._GetIndex(Me) + +End + +Private Sub GetButton() As _TabPanelButton + + Return GetParent()._GetButton(GetIndex()) + +End + + +Public Sub _new() + +End + + +Private Function Text_Read() As String + + Return GetButton().Text + +End + +Private Sub Text_Write(sText As String) + + GetButton().Text = sText + +End + +Private Function Picture_Read() As Picture + + Return GetButton().Picture + +End + +Private Sub Picture_Write(hPict As Picture) + + GetButton().Picture = hPict + +End + +Public Sub _Delete() + + Super.Delete + +End + + +Public Sub Delete() + + GetParent().Remove(GetIndex()) + +End + +Private Function Visible_Read() As Boolean + + Return GetParent()._IsVisible(GetIndex()) + +End + +Private Sub Visible_Write(Value As Boolean) + + GetParent()._SetVisible(GetIndex(), Value) + +End + +Private Function RichText_Read() As String + + Return GetButton().RichText + +End + +Private Sub RichText_Write(Value As String) + + GetButton().RichText = Value + +End + +Private Function Closable_Read() As Boolean + + Return GetButton().Closable + +End + +Private Sub Closable_Write(Value As Boolean) + + GetButton().Closable = Value + +End diff --git a/comp/src/gb.form/.src/TableView.class b/comp/src/gb.form/.src/TableView.class new file mode 100644 index 00000000..dc1fa6f2 --- /dev/null +++ b/comp/src/gb.form/.src/TableView.class @@ -0,0 +1,558 @@ +' Gambas class file + +Inherits GridView +Export + +Public Const _Properties As String = "*,NoKeyboard" +Public Const _Group As String = "View" +Public Const _Similar As String = "GridView" + +Event Save(Row As Integer, Column As Integer, Value As String) +Event Insert +Event Click +Event Hide + +Property Read Editor As Control +Property NoKeyboard As Boolean +'Property ShowCursor As Boolean + +Private $hTextBox As TextBox +Private $hComboBox As ComboBox +Private $hEditor As Object +Private $hPanel As Panel +Private $bTextBox As Boolean + +Private $iCol As Integer +Private $iRow As Integer +Private $hWatcher As Watcher +Private $bNoKeyboard As Boolean +Private $hTimer As Timer +Private $bDoNotHideEditor As Boolean +'Private $bShowCursor As Boolean + +Public Sub _new() + + Dim hObs As Observer + + hObs = New Observer(Me) As "GridView" + $hWatcher = New Watcher(Me) As "Watcher" + + $hPanel = New Panel(Me.Window) + $hPanel.Background = Color.TextBackground + $hPanel.Ignore = True + '$hPanel.Arrangement = Arrange.Fill + $hPanel.Hide + + $hComboBox = New ComboBox($hPanel) As "Editor" + '$hComboBox.Ignore = True + '$hComboBox.Background = Color.TextBackground + $hComboBox.Hide + $hComboBox.Border = False + + $hTextBox = New TextBox($hPanel) As "Editor" + '$hTextBox.Ignore = True + $hTextBox.Border = False + '$hTextBox.Background = Color.TextBackground + $hTextBox.Hide + + $hTimer = New Timer As "Timer" + +End + +Private Sub SaveEditor() As Boolean + + Dim sText As String + Dim sCurrent As String + Dim bCancel As Boolean + + If Not $hEditor Then Return + + Try sCurrent = Me[$iRow, $iCol].Text + If Error Then Return + + Try sText = $hEditor.Text + + If sText = sCurrent Then Return + + bCancel = Raise Save($iRow, $iCol, sText) + Me[$iRow, $iCol].Refresh + Return bCancel + +End + +Public Sub Save() As Boolean + + If SaveEditor() Then Return True + HideEditor(True) + +End + +Public Sub Cancel() + + HideEditor(True) + +End + +Private Sub HideEditor(Optional bNoSave As Boolean) As Boolean + + Dim bCancel As Boolean + + 'Error "------------------------\n"; System.Backtrace.Join("\n") + + If $hEditor And If Not $bDoNotHideEditor Then + If Not bNoSave Then + bCancel = SaveEditor() + Endif + If $hEditor Then + $hPanel.Hide + $hEditor.Hide + $hEditor = Null + Raise Hide + Endif + Endif + + 'UpdateShowCursor + + Return bCancel + +End + +Private Sub MoveEditor() + + Dim X, Y, W, H As Integer + Dim MX, MY As Integer + Dim hEditor As Object + Dim P As Integer + + If Not $hEditor Then Return + + $bDoNotHideEditor = True + + ' $bDoNotHideEditor can be set to FALSE during the WAIT instruction + hEditor = $hEditor + Me[$iRow, $iCol].EnsureVisible + Wait + If Not $hEditor Then $hEditor = hEditor + + X = Me.ScreenX - Me.Window.ScreenX - Me.Window.ClientX + Me.Rows.Width - Me.ScrollX + Me.ClientX + Y = Me.ScreenY - Me.Window.ScreenY - Me.Window.ClientY + Me.Columns.Height - Me.ScrollY + Me.ClientY + + MX = Me.ScreenX - Me.Window.ScreenX - Me.Window.ClientX + Me.Rows.Width - Me.ScrollX + Me.ClientX + MY = Me.ScreenY - Me.Window.ScreenY - Me.Window.ClientY + Me.Columns.Height - Me.ScrollY + Me.ClientY + + $bDoNotHideEditor = False + + With Me[$iRow, $iCol] + + X += .X + 1 + Y += .Y + 1 + W = Min(Me.ClientW - Me.Rows.W, .Width) - 2 + H = Min(Me.ClientH - Me.Columns.H, .Height) - 2 + + If Not Me.Grid Then + Dec W + Dec H + Endif + + P = Max(Me.Padding, .Padding) + P = Max(0, P - 1) + + If (W - P * 2) < 4 Or If H < 4 Then + HideEditor + Return + Endif + + If $hEditor.Background = Color.Default Then + If Me.Background = Color.Default Then + $hPanel.Background = Color.TextBackground + Else + $hPanel.Background = Me.Background + Endif + Else + $hPanel.Background = $hEditor.Background + Endif + + 'UpdateShowCursor + + $hPanel.Move(X, Y, W, H) + $hEditor.Move(P, P, W - P * 2, H - P * 2) + $hEditor.Show + $hPanel.Show + $hPanel.Raise + $hEditor.Raise + + End With + +End + +Public Sub GridView_MouseDown() + + HideEditor + +End + +Public Sub GridView_RowResize((Row) As Integer) + + HideEditor + +End + +Public Sub GridView_ColumnResize((Column) As Integer) + + HideEditor + +End + +Public Sub GridView_Scroll() + + If $bDoNotHideEditor Then + MoveEditor + Else + HideEditor + Endif + +End + +Public Sub GridView_Arrange() + + If $bDoNotHideEditor Then + MoveEditor + Else + HideEditor + Endif + +End + +Public Sub Watcher_Resize() + + HideEditor + +End + +Public Sub Watcher_Hide() + + HideEditor + +End + +Public Sub GridView_Change() + + HideEditor + +End + +Private Sub InitEditor() + + With Me[$iRow, $iCol] + Try $hEditor.Text = .Text + If Error Then + $hEditor = Null + Error.Raise("The TableView editor must have a Text public property") + Endif + $hEditor.Font = .Font + $hEditor.Foreground = .Foreground + $hEditor.Background = .Background + Try $hEditor.Alignment = .Alignment + Try $hEditor.WordWrap = .WordWrap + End With + +End + +Public Sub Edit(Optional List As String[], Optional ReadOnly As Boolean) + + 'DEBUG + HideEditor + + $iCol = Me.Column + $iRow = Me.Row + + If $iCol < 0 Or $iRow < 0 Then Return + + If List Then + $hComboBox.List = List + $hComboBox.ReadOnly = ReadOnly + $hEditor = $hComboBox + $bTextBox = Not ReadOnly + Else + $hEditor = $hTextBox + $bTextBox = True + Endif + + InitEditor + If $bTextBox Then $hEditor.SelectAll + MoveEditor + Try $hEditor.SetFocus + Try $hEditor.Pos = $hEditor.Length + + If Not $bDoNotHideEditor Then + $bDoNotHideEditor = True + $hTimer.Trigger + Endif + +End + +Public Sub EditWith(Editor As Control) + + Dim hObs As Observer + + HideEditor + + $iCol = Me.Column + $iRow = Me.Row + + If $iCol < 0 Or $iRow < 0 Then Return + + Editor.Reparent($hPanel) + + $hEditor = Editor + $hEditor.Ignore = False + + $bTextBox = False + If Editor Is TextArea Or If Editor Is TextBox Or If Editor Is ButtonBox Then + $bTextBox = True + Endif + + InitEditor + hObs = New Observer($hEditor) As "Editor" + + Try $hEditor.SelectAll + MoveEditor + Try $hEditor.SetFocus + +End + +Public Sub Editor_Activate() + + SaveEditor + +End + +Public Sub Editor_Click() + + SaveEditor + +End + +Private Sub RaiseClickOrActivate() + + If Object.CanRaise(Me, "Click") Then + Raise Click + Else + Raise Activate + Endif + +End + +Public Sub Editor_KeyPress() + + Dim hEditor As Control = Last + + If Not $hEditor Then + Stop Event + Return + Endif + + Select Case Key.Code + + Case Key.Escape + If $hEditor.Text = Me[$iRow, $iCol].Text Then + HideEditor(True) + Else + $hEditor.Text = Me[$iRow, $iCol].Text + Endif + Stop Event + + Case Key.Up + If $bNoKeyboard Then Return + If Not Key.Normal Then Return + If $hEditor Is TextArea And If $hEditor.Line > 0 Then Return + + If SaveEditor() Then + Stop Event + Return + Endif + + While Me.Row > 0 + Dec Me.Row + RaiseClickOrActivate + If $hEditor Then + Stop Event + Break + Endif + Break + Wend + + Case Key.Down + If $bNoKeyboard Then Return + If Not Key.Normal Then Return + If $hEditor Is TextArea And If $hEditor.Line < $hEditor.ToLine($hEditor.Length) Then Return + + If SaveEditor() Then + Stop Event + Return + Endif + + While Me.Row < (Me.Rows.Count - 1) + Inc Me.Row + RaiseClickOrActivate + If $hEditor Then + Stop Event + Break + Endif + Break + Wend + + Case Key.Left + If $bNoKeyboard Then Return + If Not Key.Normal Then Return + If $bTextBox And If Not $hEditor.ReadOnly And If $hEditor.Pos > 0 Then Return + + If SaveEditor() Then + Stop Event + Return + Endif + + Do + If Me.Column > 0 Then + Dec Me.Column + RaiseClickOrActivate + Else If Me.Row > 0 Then + Me.MoveTo(Me.Row - 1, Me.Columns.Count - 1) + RaiseClickOrActivate + Else + Break + Endif + If $hEditor Then + Try $hEditor.Pos = $hEditor.Length + Stop Event + Break + Endif + Loop + + Case Key.Right + If $bNoKeyboard Then Return + If Not Key.Normal Then Return + If $bTextBox And If Not $hEditor.ReadOnly And If $hEditor.Pos < $hEditor.Length Then Return + + If SaveEditor() Then + Stop Event + Return + Endif + + Do + If Me.Column < (Me.Columns.Count - 1) Then + Inc Me.Column + RaiseClickOrActivate + Else If Me.Row < (Me.Rows.Count - 1) Then + Me.MoveTo(Me.Row + 1, 0) + RaiseClickOrActivate + Else + Break + Endif + If $hEditor Then + Try $hEditor.Pos = 0 + Stop Event + Break + Endif + Loop + + Case Key.Enter, Key.Return + + If Not Key.Normal Then Return + + If $bNoKeyboard Then + If $hEditor Then + HideEditor + Stop Event + Endif + Return + Endif + + If SaveEditor() Then + Stop Event + Return + Endif + + Do + If Me.Column < (Me.Columns.Count - 1) Then + Inc Me.Column + RaiseClickOrActivate + Else If Me.Row < (Me.Rows.Count - 1) Then + Me.MoveTo(Me.Row + 1, 0) + RaiseClickOrActivate + Else + Raise Insert + Stop Event + Break + Endif + If $hEditor Then + Try $hEditor.Pos = 0 + Stop Event + Break + Endif + Loop + + End Select + + If Not $bDoNotHideEditor Then + $bDoNotHideEditor = Not IsNull($hEditor) + If $bDoNotHideEditor Then $hTimer.Trigger + Endif + + If Not $hEditor Then + Me.SetFocus + Else If $hEditor <> hEditor Then + Stop Event + Endif + +End + +Public Sub Timer_Timer() + + $bDoNotHideEditor = False + +End + +Private Function Editor_Read() As Control + + Return $hEditor + +End + +Private Function NoKeyboard_Read() As Boolean + + Return $bNoKeyboard + +End + +Private Sub NoKeyboard_Write(Value As Boolean) + + $bNoKeyboard = Value + +End + +Public Sub Clear() + + Cancel + Super.Clear + +End + +' Private Function ShowCursor_Read() As Boolean +' +' Return $bShowCursor +' +' End +' +' Private Sub UpdateShowCursor() +' +' Super.ShowCursor = $bShowCursor 'And IsNull($hEditor) +' +' End +' +' Private Sub ShowCursor_Write(Value As Boolean) +' +' $bShowCursor = Value +' UpdateShowCursor +' +' End diff --git a/comp/src/gb.form/.src/Test/FBugFileView.class b/comp/src/gb.form/.src/Test/FBugFileView.class new file mode 100644 index 00000000..b6383e7b --- /dev/null +++ b/comp/src/gb.form/.src/Test/FBugFileView.class @@ -0,0 +1,22 @@ +' Gambas class file + + +Public Sub Button1_Click() + + FileView1.ShowDetailed = Not FileView1.ShowDetailed + +End + +Public Sub Form_Open() + + FileView1.Dir = "/usr/bin/" + FileChooser1.Dir = "/usr/bin/" + +End + +Public Sub Button2_Click() + + FileChooser1.ShowDetailed = Not FileChooser1.ShowDetailed + + +End diff --git a/comp/src/gb.form/.src/Test/FBugFileView.form b/comp/src/gb.form/.src/Test/FBugFileView.form new file mode 100644 index 00000000..44f993f6 --- /dev/null +++ b/comp/src/gb.form/.src/Test/FBugFileView.form @@ -0,0 +1,27 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,133,64) + Expand = True + Arrangement = Arrange.Vertical + { HSplit1 HSplit + MoveScaled(2,6,98,47) + Expand = True + { FileChooser1 FileChooser + MoveScaled(6,7,36,36) + Expand = True + } + { FileView1 FileView + MoveScaled(59,13,16,16) + Expand = True + } + } + { Button1 Button + MoveScaled(27,54,16,4) + Text = ("Toggle Fileview Detailed View") + } + { Button2 Button + MoveScaled(28,58,16,4) + Text = ("Toggle Filechooser Detailed View") + } +} diff --git a/comp/src/gb.form/.src/Test/FDocumentView.class b/comp/src/gb.form/.src/Test/FDocumentView.class new file mode 100644 index 00000000..d0948665 --- /dev/null +++ b/comp/src/gb.form/.src/Test/FDocumentView.class @@ -0,0 +1,137 @@ +' Gambas class file + +Class PdfDocument + +Private hpdf As New PdfDocument + +Static Public Sub _init() + + Component.Load("gb.pdf") + +End + + +Public Sub Form_Open() + + hpdf.Open("/home/fabien/Downloads/cerfa_14952-01.pdf") + 'hpdf.Open("~/René Guénon - 1945 - Caïn et Abel (Le Règne de la Quantité et les Signes des Temps).pdf") + DV.Count = hpdf.Count + DV2.Count = 0 + DV2.DocHeight = hpdf[1].Height / 0.72 + DV2.DocWidth = hpdf[1].Width / 0.72 + DV.DocWidth = hpdf[1].Width / 0.72 + DV.DocHeight = hpdf[1].Height / 0.72 + 'DocumentView31.Arrangement = Arrange.Horizontal + ComboBox1.Index = 5 +End + +Public Sub DV_Layout(Page As Integer) + + Last.Layout.Height = hpdf[Page + 1].Height / 0.72 + Last.Layout.Width = hpdf[Page + 1].Width / 0.72 + +' Catch +' Last.Layout.Height = hpdf[1].Height / 0.72 +' Last.Layout.Width = hpdf[1].Width / 0.72 +End + +Public Sub SpinBox3_Change() + + DV.Spacing = Last.Value + +End + +Public Sub SpinBox2_Change() + + DV.Padding = Last.Value + +End + +Public Sub CheckBox1_Click() + + DV.ShowShadow = Last.Value + +End + +Public Sub DV_Draw(Page As Integer, (Width) As Integer, (Height) As Integer) + + 'Debug "Load image : " & Page & " | " & Width & " | " & height + 'Print Last.Zoom + + If Page > hpdf.Count - 1 Then Return + + hpdf.Zoom = Last.Zoom / 0.72 + Draw.Image(hpdf[Page + 1].Image, 0, 0) + 'Catch +End + +Public Sub DV_Zoom() + 'Print Last.Zoom + ' hpdf.Zoom = Last.Zoom / 0.72 + 'Print "Zoom_Change " & Last.Zoom + Object.Lock(SliderBox1) + SliderBox1.Value = Last.Zoom * 100 + Object.Unlock(SliderBox1) +End + +Public Sub SliderBox1_Change() + + DV.Zoom = Last.Value / 100 + +End + +Public Sub ComboBox1_Click() + + DV.Arrangement = Last.index + +End + +Public Sub TextBox1_Activate() + + DV.Goto(Last.Text) + +End + +Public Sub DV2_Zoom() + + + +End + +Public Sub DV2_Draw(Page As Integer, (Width) As Integer, (Height) As Integer) + + hpdf.Zoom = Last.Zoom / 0.72 + 'Print Last.Zoom + Draw.Image(hpdf[Page + 1].Image, 0, 0) + +End + +Public Sub DV_MouseDown() + + Print dv.Find(Mouse.x, Mouse.y) + +End + +Public Sub Button1_Click() + + dv[30].EnsureVisible + +End + +' Public Sub Timer1_Timer() +' +' Inc dv.Count +' +' End + +Public Sub SpinBox1_Change() + + dv.Column = Last.Value + dv.Refresh +End + +Public Sub CheckBox2_Click() + + DV.AutoCenter = Last.Value + +End diff --git a/comp/src/gb.form/.src/Test/FDocumentView.form b/comp/src/gb.form/.src/Test/FDocumentView.form new file mode 100644 index 00000000..fa2054bd --- /dev/null +++ b/comp/src/gb.form/.src/Test/FDocumentView.form @@ -0,0 +1,84 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,121,68) + Arrangement = Arrange.Horizontal + { DV2 DocumentView + MoveScaled(1,1,13,66) + Arrangement = Arrange.Vertical + } + { DV DocumentView + MoveScaled(14,1,58,66) + Background = &HC0C0C0& + Expand = True + Arrangement = Arrange.Horizontal + } + { Panel1 Panel + MoveScaled(72,1,39,66) + { SliderBox1 SliderBox + MoveScaled(10,10,25,4) + MaxValue = 200 + Value = 50 + } + { Label2 Label + MoveScaled(2,10,8,4) + Text = ("Zoom :") + } + { CheckBox1 CheckBox + MoveScaled(2,41,26,3) + Text = ("Show Shadow") + Value = CheckBox.True + } + { SpinBox2 SpinBox + MoveScaled(17,24,19,4) + } + { Label3 Label + MoveScaled(1,24,14,4) + Text = ("Padding") + } + { Label4 Label + MoveScaled(1,30,14,4) + Text = ("Spacing") + } + { SpinBox3 SpinBox + MoveScaled(17,30,19,4) + } + { Label5 Label + MoveScaled(1,36,11,4) + Text = ("Scale Mode") + } + { TextBox1 TextBox + MoveScaled(8,49,19,4) + } + { Label6 Label + MoveScaled(2,49,7,4) + Text = ("Goto :") + } + { ComboBox1 ComboBox + MoveScaled(17,36,18,4) + ReadOnly = True + List = [("None"), ("Horizontal"), ("Vertical"), ("Row"), ("Column"), ("Fill")] + Text = ("ComboBox1") + } + { Button1 Button + MoveScaled(32,49,5,5) + Text = ("Button1") + } + { Timer1 #Timer + #MoveScaled(11,2) + Enabled = True + } + { Label1 Label + MoveScaled(2,20,10,3) + Text = ("Columns") + } + { SpinBox1 SpinBox + MoveScaled(17,19,19,4) + MaxValue = 200 + } + { CheckBox2 CheckBox + MoveScaled(2,45,22,2) + Text = ("Autocenter") + } + } +} diff --git a/comp/src/gb.form/.src/Test/FFont.class b/comp/src/gb.form/.src/Test/FFont.class new file mode 100644 index 00000000..0a5fa73a --- /dev/null +++ b/comp/src/gb.form/.src/Test/FFont.class @@ -0,0 +1,2 @@ +' Gambas class file + diff --git a/comp/src/gb.form/.src/Test/FFont.form b/comp/src/gb.form/.src/Test/FFont.form new file mode 100644 index 00000000..17d3121b --- /dev/null +++ b/comp/src/gb.form/.src/Test/FFont.form @@ -0,0 +1,10 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,74,64) + Arrangement = Arrange.Fill + { FontChooser1 FontChooser + MoveScaled(1,1,72,62) + Border = False + } +} diff --git a/comp/src/gb.form/.src/Test/FIconPanel.class b/comp/src/gb.form/.src/Test/FIconPanel.class new file mode 100644 index 00000000..6cc78331 --- /dev/null +++ b/comp/src/gb.form/.src/Test/FIconPanel.class @@ -0,0 +1,3 @@ +' Gambas class file + + diff --git a/comp/src/gb.form/.src/Test/FIconPanel.form b/comp/src/gb.form/.src/Test/FIconPanel.form new file mode 100644 index 00000000..8ff1bb92 --- /dev/null +++ b/comp/src/gb.form/.src/Test/FIconPanel.form @@ -0,0 +1,32 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,85,64) + { IconPanel1 IconPanel + MoveScaled(5,4,67,56) + Foreground = Color.Red + Count = 4 + Border = True + Index = 0 + Text = ("Item 0") + Picture = Picture["img/32/warning.png"] + { Label1 Label + MoveScaled(8,13,24,4) + Text = ("Toto") + } + Index = 1 + Text = ("Item 1") + Index = 2 + Text = ("Item 2") + Picture = Picture["img/8/new/side-top.png"] + { Button1 Button + MoveScaled(8,20,16,4) + } + Index = 3 + Text = ("Item 3") + { ToggleButton1 ToggleButton + MoveScaled(12,25,16,4) + } + Index = 0 + } +} diff --git a/comp/src/gb.form/.src/Test/FIconView.class b/comp/src/gb.form/.src/Test/FIconView.class new file mode 100644 index 00000000..c02833e5 --- /dev/null +++ b/comp/src/gb.form/.src/Test/FIconView.class @@ -0,0 +1,30 @@ +' Gambas class file + + +Public Sub Form_Open() + + ' Dim sPath As String + ' Dim sDir As String = "/home/guygle/guygle/bin" '/gambas/3.0/trunk" + ' + ' For Each sPath In Dir(sDir).Sort(gb.Language + gb.IgnoreCase) + ' If IsDir(sDir &/ sPath) Then + ' IconView1.Add(sPath, sPath, Picture["icon:/64/directory"]) + ' Else + ' IconView1.Add(sPath, sPath, Picture["icon:/64/file"]) + ' Endif + ' Next + ' + ' 'IconView1.Picture = Picture["img/colormap.png"] + ' + ' IconView1.SetFocus + + FileView1.Dir = "~" + +End + + +Public Sub Button1_Click() + + FileView1.Enabled = Not FileView1.Enabled + +End diff --git a/comp/src/gb.form/.src/Test/FIconView.form b/comp/src/gb.form/.src/Test/FIconView.form new file mode 100644 index 00000000..5c76c444 --- /dev/null +++ b/comp/src/gb.form/.src/Test/FIconView.form @@ -0,0 +1,20 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,115,80) + Icon = Picture["icon:/medium/color"] + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + { Button1 Button + MoveScaled(4,1,16,4) + #Translate = False + Text = "Enabled" + } + { FileView1 FileView + MoveScaled(3,8,104,55) + Expand = True + ShowDetailed = True + ShowDirectory = True + } +} diff --git a/comp/src/gb.form/.src/Test/FLCDLabel.class b/comp/src/gb.form/.src/Test/FLCDLabel.class new file mode 100644 index 00000000..4bb09497 --- /dev/null +++ b/comp/src/gb.form/.src/Test/FLCDLabel.class @@ -0,0 +1,17 @@ +' Gambas class file + +Private $bColon As Boolean + +Public Sub Timer1_Timer() + + $bColon = Not $bColon + + LCDLabel2.Text = ";" & Format(Now, "hh" & If($bColon, ":", "") & "nn" & If($bColon, ":", "") & "ss") & ";" + +End + +Public Sub Form_Open() + + Timer1_Timer + +End diff --git a/comp/src/gb.form/.src/Test/FLCDLabel.form b/comp/src/gb.form/.src/Test/FLCDLabel.form new file mode 100644 index 00000000..eab50ac3 --- /dev/null +++ b/comp/src/gb.form/.src/Test/FLCDLabel.form @@ -0,0 +1,19 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,44,19) + Background = &H000000& + Arrangement = Arrange.Fill + { LCDLabel2 LCDLabel + MoveScaled(5,3,29,11) + Foreground = &HFFFFFF& + Text = ("12:34") + Alignment = Align.Center + Padding = 8 + } + { Timer1 #Timer + #MoveScaled(36,11) + Enabled = True + Delay = 500 + } +} diff --git a/comp/src/gb.form/.src/Test/FMain.class b/comp/src/gb.form/.src/Test/FMain.class new file mode 100644 index 00000000..fd158399 --- /dev/null +++ b/comp/src/gb.form/.src/Test/FMain.class @@ -0,0 +1,20 @@ +' Gambas class file + + +Public Sub TreeView1_Menu() + + Debug + +End + +Public Sub Form_Open() + + Debug Style.Name + +End + +Public Sub Button1_Click() + + Print DateBox1.Text;; DateBox1.Value + +End diff --git a/comp/src/gb.form/.src/Test/FMain.form b/comp/src/gb.form/.src/Test/FMain.form new file mode 100644 index 00000000..b49e1987 --- /dev/null +++ b/comp/src/gb.form/.src/Test/FMain.form @@ -0,0 +1,70 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,100,82) + { Menu1 Menu + { Menu2 Menu + Text = ("Menu2") + } + { Menu3 Menu + Text = ("Menu3") + } + } + { SidePanel1 SidePanel + MoveScaled(0,3,29,61) + Orientation = Align.Left + { DirView1 DirView + MoveScaled(2,2,25,32) + PopupMenu = "Menu1" + } + { TreeView1 TreeView + MoveScaled(2,41,20,16) + PopupMenu = "Menu1" + } + } + { DirView2 DirView + MoveScaled(38,15,16,16) + PopupMenu = "Menu1" + } + { TreeView2 TreeView + MoveScaled(34,36,21,26) + PopupMenu = "Menu1" + } + { ColorButton1 ColorButton + MoveScaled(62,5,19,5) + } + { ComboBox1 ComboBox + MoveScaled(61,23,32,3) + List = [("Élément 1"), ("Élément 2"), ("Élément 3"), ("Élément 4")] + Text = ("ComboBox1") + } + { ComboBox2 ComboBox + MoveScaled(61,30,32,5) + Text = ("ComboBox2") + } + { TextBox1 TextBox + MoveScaled(61,37,32,4) + Background = &HBFBF8F& + Text = ("TextBox1") + } + { Button1 Button + MoveScaled(61,45,19,4) + Text = ("Button1") + } + { MenuButton1 MenuButton + MoveScaled(62,14,23,6) + Text = ("MenuButton1") + } + { DateBox1 DateBox + MoveScaled(62,53,28,5) + } + { ColorButton2 ColorButton + MoveScaled(63,61,17,6) + } + { ButtonBox1 ButtonBox + MoveScaled(34,5,24,4) + } + { SliderBox1 SliderBox + MoveScaled(9,70,32,4) + } +} diff --git a/comp/src/gb.form/.src/Test/FSpinBar.class b/comp/src/gb.form/.src/Test/FSpinBar.class new file mode 100644 index 00000000..f5baf4d7 --- /dev/null +++ b/comp/src/gb.form/.src/Test/FSpinBar.class @@ -0,0 +1 @@ +' Gambas class file diff --git a/comp/src/gb.form/.src/Test/FSpinBar.form b/comp/src/gb.form/.src/Test/FSpinBar.form new file mode 100644 index 00000000..009b77ce --- /dev/null +++ b/comp/src/gb.form/.src/Test/FSpinBar.form @@ -0,0 +1,27 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,64,64) + { SpinBox1 SpinBox + MoveScaled(23,39,9,4) + } + { Panel1 ScrollView + MoveScaled(3,3,61,15) + ScrollBar = Scroll.Vertical + { SpinBar3 SpinBar + MoveScaled(0,7,56,5) + Border = False + Text = ("Test") + } + { SpinBar1 SpinBar + MoveScaled(0,0,56,5) + Text = ("Test") + } + { SpinBar2 SpinBar + MoveScaled(3,14,32,4) + Enabled = False + Value = 0.5 + Text = ("Test") + } + } +} diff --git a/comp/src/gb.form/.src/Test/FSpinner.class b/comp/src/gb.form/.src/Test/FSpinner.class new file mode 100644 index 00000000..d790b1a6 --- /dev/null +++ b/comp/src/gb.form/.src/Test/FSpinner.class @@ -0,0 +1,15 @@ +' Gambas class file + + +Public Sub Form_Open() + + Spinner1.Start + +End + +Public Sub Timer1_Timer() + + Spinner1.Value += 0.005 + 'Print Spinner1.Value + +End diff --git a/comp/src/gb.form/.src/Test/FSpinner.form b/comp/src/gb.form/.src/Test/FSpinner.form new file mode 100644 index 00000000..f6f8ef09 --- /dev/null +++ b/comp/src/gb.form/.src/Test/FSpinner.form @@ -0,0 +1,17 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,64,64) + Background = &HFFFFFF& + Arrangement = Arrange.Fill + { Spinner1 Spinner + MoveScaled(17,19,18.25,18.25) + Foreground = Color.Red + Label = True + } + { Timer1 #Timer + #MoveScaled(46,8) + Enabled = True + Delay = 70 + } +} diff --git a/comp/src/gb.form/.src/Test/FSwitchButton.class b/comp/src/gb.form/.src/Test/FSwitchButton.class new file mode 100644 index 00000000..9b0f2a33 --- /dev/null +++ b/comp/src/gb.form/.src/Test/FSwitchButton.class @@ -0,0 +1,13 @@ +' Gambas class file + +Public Sub Form_Open() + + Application.Animations = True + +End + +Public Sub URLLabel1_Click() + + + +End diff --git a/comp/src/gb.form/.src/Test/FSwitchButton.form b/comp/src/gb.form/.src/Test/FSwitchButton.form new file mode 100644 index 00000000..f56e5e75 --- /dev/null +++ b/comp/src/gb.form/.src/Test/FSwitchButton.form @@ -0,0 +1,43 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,77,54) + { SwitchButton1 SwitchButton + MoveScaled(5,6,17,5) + Value = True + Animated = True + } + { SwitchButton3 SwitchButton + MoveScaled(3,13,16,4) + Animated = True + } + { SwitchButton2 SwitchButton + MoveScaled(10,20,16,4) + Enabled = False + Animated = True + } + { TextBox1 TextBox + MoveScaled(15,33,24,4) + Text = ("TextBox1") + } + { URLLabel1 URLLabel + MoveScaled(39,11,27,6) + Alignment = Align.TopNormal + Link = "http://gambaswiki.org" + } + { ValueBox1 ValueBox + MoveScaled(44,23,24,6) + } + { Label1 Label + MoveScaled(44,33,11,5) + Background = Color.LinkForeground + Text = ("Label1") + Border = Border.Plain + } + { Label2 Label + MoveScaled(44,40,11,5) + Background = Color.VisitedForeground + Text = ("Label2") + Border = Border.Plain + } +} diff --git a/comp/src/gb.form/.src/Test/FTableView.class b/comp/src/gb.form/.src/Test/FTableView.class new file mode 100644 index 00000000..25f73a78 --- /dev/null +++ b/comp/src/gb.form/.src/Test/FTableView.class @@ -0,0 +1,51 @@ +' Gambas class file + +Public Sub Form_Open() + + Dim aDir As String[] + Dim Y As Integer + + aDir = RDir("~/Musique", "*.mp3").Sort() + + With tvwMain + .Columns.Count = 4 + .Rows.Count = aDir.Count + .Rows.H = 24 + End With + + tvwMain.Columns[0].Title = "Name" + tvwMain.Columns[0].Width = 400 + tvwMain.Columns[1].Title = "Size" + tvwMain.Columns[2].Title = "Done" + tvwMain.Columns[3].Title = "Error" + + For Y = 0 To aDir.Max + tvwMain[Y, 0].Text = String.UCaseFirst(File.BaseName(aDir[Y])) + tvwMain[Y, 0].Padding = 4 + tvwMain[Y, 1].Text = Stat("~/Musique" &/ aDir[Y]).Size + tvwMain[Y, 1].Padding = 4 + tvwMain[Y, 1].Background = Color.Yellow + Next + + tvwMain.Rows.H = -1 + +End + +Public Sub tvwMain_Click() + + Select Case tvwMain.Column + Case 0 + tvwMain.Edit + Case 1 + tvwMain.Edit + Case 2, 3 + tvwMain.Edit(["True", "False", ""], True) + End Select + +End + +Public Sub tvwMain_Save(r As Integer, c As Integer, v As String) + + tvwMain[r, c].Text = v + +End diff --git a/comp/src/gb.form/.src/Test/FTableView.form b/comp/src/gb.form/.src/Test/FTableView.form new file mode 100644 index 00000000..42fea385 --- /dev/null +++ b/comp/src/gb.form/.src/Test/FTableView.form @@ -0,0 +1,17 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,88,69) + Arrangement = Arrange.Fill + Margin = True + { Panel1 HSplit + MoveScaled(5,16,68,34) + { tvwMain TableView + MoveScaled(0,0,29,27) + Expand = True + Mode = Select.Single + ShowCursor = True + Header = GridView.Horizontal + } + } +} diff --git a/comp/src/gb.form/.src/Test/FTestArrangement.class b/comp/src/gb.form/.src/Test/FTestArrangement.class new file mode 100644 index 00000000..7ef81b9b --- /dev/null +++ b/comp/src/gb.form/.src/Test/FTestArrangement.class @@ -0,0 +1,14 @@ +' Gambas class file + + +Public Sub Form_Open() + + 'Panel2.H = 0 + +End + +Public Sub Form_Arrange() + + Debug Panel2.Y + +End diff --git a/comp/src/gb.form/.src/Test/FTestArrangement.form b/comp/src/gb.form/.src/Test/FTestArrangement.form new file mode 100644 index 00000000..e74c3abf --- /dev/null +++ b/comp/src/gb.form/.src/Test/FTestArrangement.form @@ -0,0 +1,18 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,64,64) + Arrangement = Arrange.Vertical + { Panel1 Panel + MoveScaled(6,5,47,13) + Expand = True + Border = Border.Plain + } + { Panel2 Panel + MoveScaled(6,23,47,13) + Mouse = Mouse.SplitV + } + { Expander1 Expander + MoveScaled(3,42,55,19) + } +} diff --git a/comp/src/gb.form/.src/Test/FTestBalloon.class b/comp/src/gb.form/.src/Test/FTestBalloon.class new file mode 100644 index 00000000..b2b61f53 --- /dev/null +++ b/comp/src/gb.form/.src/Test/FTestBalloon.class @@ -0,0 +1,19 @@ +' Gambas class file + +Public Sub Form_Move() + + Debug Me.X;; Me.Y + +End + +Public Sub Button1_Click() + + Balloon("Ceci est un message\nsur deux lignes.", TextBox1) + +End + +Public Sub Form_Open() + + Me.Center + +End diff --git a/comp/src/gb.form/.src/Test/FTestBalloon.form b/comp/src/gb.form/.src/Test/FTestBalloon.form new file mode 100644 index 00000000..e2eda928 --- /dev/null +++ b/comp/src/gb.form/.src/Test/FTestBalloon.form @@ -0,0 +1,14 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,-1,64,64) + { TextBox1 TextBox + MoveScaled(0,0,41,4) + Text = ("TextBox1") + } + { Button1 Button + MoveScaled(0,6,16,4) + ToolTip = ("Ceci est une bulle d'aide") + Text = ("Button1") + } +} diff --git a/comp/src/gb.form/.src/Test/FTestColorChooser.class b/comp/src/gb.form/.src/Test/FTestColorChooser.class new file mode 100644 index 00000000..ee3eabef --- /dev/null +++ b/comp/src/gb.form/.src/Test/FTestColorChooser.class @@ -0,0 +1,26 @@ +' Gambas class file + +Public Sub Form_Resize() + + Debug Me.W;; Me.H + 'Sleep 2 + +End + +Public Sub Form_Open() + + ' Dim hCtrl As TestControl + ' + ' hCtrl = New TestControl(Me) + ' hCtrl.ResizeScaled(40, 40) + ' hCtrl.Background = Color.Yellow + + 'Me.Resizable = False + +End + +Public Sub Button1_Click() + + Me.Resizable = Not Me.Resizable + +End diff --git a/comp/src/gb.form/.src/Test/FTestColorChooser.form b/comp/src/gb.form/.src/Test/FTestColorChooser.form new file mode 100644 index 00000000..13547de7 --- /dev/null +++ b/comp/src/gb.form/.src/Test/FTestColorChooser.form @@ -0,0 +1,16 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,61,58) + Expand = True + Arrangement = Arrange.Vertical + { ColorChooser1 ColorChooser + MoveScaled(0,0,36,36) + Expand = True + ShowCustom = True + } + { Button1 Button + MoveScaled(3,50,16,4) + Text = ("Resizable") + } +} diff --git a/comp/src/gb.form/.src/Test/FTestCompletion.class b/comp/src/gb.form/.src/Test/FTestCompletion.class new file mode 100644 index 00000000..5653ef65 --- /dev/null +++ b/comp/src/gb.form/.src/Test/FTestCompletion.class @@ -0,0 +1,24 @@ +' Gambas class file + +Private $hCompletion As FileCompletion + +Public Sub Form_Open() + + TableView1.Rows.Count = 10 + TableView1.Columns.Count = 1 + +End + +Public Sub TableView1_Click() + + TableView1.Edit + + If Not $hCompletion Then $hCompletion = New FileCompletion(TableView1.Editor) + +End + +Public Sub Button1_Click() + + + +End diff --git a/comp/src/gb.form/.src/Test/FTestCompletion.form b/comp/src/gb.form/.src/Test/FTestCompletion.form new file mode 100644 index 00000000..6ce55ec2 --- /dev/null +++ b/comp/src/gb.form/.src/Test/FTestCompletion.form @@ -0,0 +1,21 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(28.625,28.625,62,53) + Arrangement = Arrange.Vertical + { TableView1 TableView + MoveScaled(2,4,53,36) + Expand = True + } + { HBox1 HBox + MoveScaled(2,46,56,4) + { Button1 Button + MoveScaled(0,0,16,4) + Text = ("Button1") + } + { Button2 Button + MoveScaled(17,0,16,4) + Text = ("Button2") + } + } +} diff --git a/comp/src/gb.form/.src/Test/FTestDateChooser.class b/comp/src/gb.form/.src/Test/FTestDateChooser.class new file mode 100644 index 00000000..182c3528 --- /dev/null +++ b/comp/src/gb.form/.src/Test/FTestDateChooser.class @@ -0,0 +1,26 @@ +' Gambas class file + +Public Sub DateBox1_Change() + + Debug DateBox1.Value + +End + +Public Sub txtYear_Change() + + Debug txtYear.Value + +End + +Public Sub DateBox2_Change() + + Debug DateBox2.Value + +End + +Public Sub Button1_Click() + + DateBox1.Enabled = Not DateBox1.Enabled + DateBox2.Enabled = Not DateBox2.Enabled + +End diff --git a/comp/src/gb.form/.src/Test/FTestDateChooser.form b/comp/src/gb.form/.src/Test/FTestDateChooser.form new file mode 100644 index 00000000..85f467cc --- /dev/null +++ b/comp/src/gb.form/.src/Test/FTestDateChooser.form @@ -0,0 +1,39 @@ +# Gambas Form File 3.0 + +{ Form Form + Move(0,0,651,336) + #Scaled = False + Spacing = True + Margin = True + { DateBox1 DateBox + Move(112,63,126,35) + Mode = DateChooser.TimeOnly + } + { DateChooser1 DateChooser + Move(287,42,357,238) + Enabled = False + } + { DateBox2 DateBox + Move(63,140,168,28) + } + { txtYear SpinBox + Move(216,296,64,24) + Enabled = False + MinValue = 1600 + MaxValue = 9999 + Value = 2015 + Border = False + } + { SliderBox1 SliderBox + Move(21,203,238,28) + Enabled = False + } + { Button1 Button + Move(32,8,128,32) + Text = ("Enable") + } + { TextBox1 TextBox + Move(64,256,136,32) + Enabled = False + } +} diff --git a/comp/src/gb.form/.src/Test/FTestExpander.class b/comp/src/gb.form/.src/Test/FTestExpander.class new file mode 100644 index 00000000..0a5fa73a --- /dev/null +++ b/comp/src/gb.form/.src/Test/FTestExpander.class @@ -0,0 +1,2 @@ +' Gambas class file + diff --git a/comp/src/gb.form/.src/Test/FTestExpander.form b/comp/src/gb.form/.src/Test/FTestExpander.form new file mode 100644 index 00000000..718936dd --- /dev/null +++ b/comp/src/gb.form/.src/Test/FTestExpander.form @@ -0,0 +1,22 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,64,64) + Arrangement = Arrange.Fill + { Expander1 Expander + MoveScaled(7,7,47,34) + Arrangement = Arrange.Vertical + Border = False + Text = ("Expander") + { Panel1 Panel + MoveScaled(3,4,27,4) + Background = &HFFFF00& + Border = Border.Plain + } + { Panel2 Panel + MoveScaled(4,11,26,8) + Background = &HFF7F00& + Border = Border.Plain + } + } +} diff --git a/comp/src/gb.form/.src/Test/FTestFileChooser.class b/comp/src/gb.form/.src/Test/FTestFileChooser.class new file mode 100644 index 00000000..b071d77a --- /dev/null +++ b/comp/src/gb.form/.src/Test/FTestFileChooser.class @@ -0,0 +1,51 @@ +' Gambas class file + +Public Sub Button2_Click() + + FTestDateChooser.ShowDialog + +End + +Public Sub _new() + + Component.Load("gb.desktop") + +End + +Public Sub Button3_Click() + + Balloon("Ceci n'est pas un ballon.\nMais une bulle !", Last) + +End + +Public Sub Button1_Click() + + FileChooser1.Background = Color.Default + +End + +Public Sub FileChooser1_Change() + + ' If FileChooser1.SelectedPath Then + ' FileProperties1.Path = FileChooser1.SelectedPath + ' Else + ' FileProperties1.Path = FileChooser1.Dir + ' Endif + +End + +Static Public Sub _init() + + 'Application.Theme = "gambas" + Print Application.Theme + Component.Load("gb.inotify") + +End + + +Public Sub Form_Open() + + FileChooser1.Dir = "/usr/bin" + 'FileChooser1.SelectedPath = "/home/benoit/gambas/git/master/app/src/gambas3/img/broken.svg" + +End diff --git a/comp/src/gb.form/.src/Test/FTestFileChooser.form b/comp/src/gb.form/.src/Test/FTestFileChooser.form new file mode 100644 index 00000000..b89b593c --- /dev/null +++ b/comp/src/gb.form/.src/Test/FTestFileChooser.form @@ -0,0 +1,77 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,142,84) + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + { Menu1 Menu + Text = ("Menu1") + { Menu2 Menu + Text = ("Menu2") + Picture = Picture["img/16/cross.png"] + } + { Menu3 Menu + Text = ("Menu3") + Picture = Picture["stock/16/gambas.png"] + } + { Menu7 Menu + Text = ("Menu7") + Shortcut = "Ctrl+B" + } + { Menu6 Menu + } + { Menu4 Menu + Text = ("Menu4") + Picture = Picture["stock/16/gnu.png"] + } + { Menu5 Menu + Text = ("Menu5") + Picture = Picture["stock/16/linux.png"] + Shortcut = "Ctrl+Shift+Alt+Backspace" + } + } + { HBox1 HBox + MoveScaled(8,2,95,5) + #Translate = False + Spacing = True + { Button1 Button + MoveScaled(0,0,16,4) + #Translate = False + Text = "Transparent" + } + { Button2 Button + MoveScaled(18,0,16,4) + #Translate = False + Text = "Button2" + } + { Button3 Button + MoveScaled(36,0,16,4) + Text = ("Balloon") + } + { Label1 Label + MoveScaled(56,0,19,4) + Text = ("Label1") + } + { TextBox1 TextBox + MoveScaled(67,0,24,4) + Text = ("TextBox1") + Border = False + } + } + { Panel1 HBox + MoveScaled(2,12,133,64) + #Translate = False + Expand = True + Spacing = True + { FileChooser1 FileChooser + MoveScaled(10,4,77,56) + Expand = True + ReadOnly = True + } + { FileProperties1 FileProperties + MoveScaled(97,2,28,36) + Visible = False + } + } +} diff --git a/comp/src/gb.form/.src/Test/FTestFileView.class b/comp/src/gb.form/.src/Test/FTestFileView.class new file mode 100644 index 00000000..0a5fa73a --- /dev/null +++ b/comp/src/gb.form/.src/Test/FTestFileView.class @@ -0,0 +1,2 @@ +' Gambas class file + diff --git a/comp/src/gb.form/.src/Test/FTestFileView.form b/comp/src/gb.form/.src/Test/FTestFileView.form new file mode 100644 index 00000000..5a167d14 --- /dev/null +++ b/comp/src/gb.form/.src/Test/FTestFileView.form @@ -0,0 +1,12 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,64,64) + Arrangement = Arrange.Fill + { FileView1 FileView + MoveScaled(2,5,58,53) + Mode = Select.Multiple + ShowDetailed = True + ShowDirectory = True + } +} diff --git a/comp/src/gb.form/.src/Test/FTestImageView.class b/comp/src/gb.form/.src/Test/FTestImageView.class new file mode 100644 index 00000000..cd670e6e --- /dev/null +++ b/comp/src/gb.form/.src/Test/FTestImageView.class @@ -0,0 +1,52 @@ +' Gambas class file + +Private myButton As New Button(Me) As "mBEvent" +Private myText As New TextLabel(Me) +Private myIView As New ImageView(Me) +Public Sub form_Open() + + With myButton + .H = 35 + .w = 100 + .x = 20 + .y = 50 + End With + + With myText + .H = 30 + .W = 180 + .X = 7 + .Y = 105 + End With + + With myIView + .H = 130 + .W = 200 + .X = 190 + .Y = 50 + End With + +End + +Public Sub mbevent_Click() + Select Case myIView.Border + Case False + myText.Text = conBool(myIView.Border) + myIView.Border = True + Case True + myIView.Border = False + myText.Text = conBool(myIView.Border) + End Select +End +Static Public Sub conBool(myVar As Variant) As String + Select Case TypeOf(myVar) + Case 1 + Select Case myVar + Case True + Return "True" + Case False + Return "False" + End Select + End Select + +End \ No newline at end of file diff --git a/comp/src/gb.form/.src/Test/FTestImageView.form b/comp/src/gb.form/.src/Test/FTestImageView.form new file mode 100644 index 00000000..85439985 --- /dev/null +++ b/comp/src/gb.form/.src/Test/FTestImageView.form @@ -0,0 +1,5 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,64,64) +} diff --git a/comp/src/gb.form/.src/Test/FTestListEditor.class b/comp/src/gb.form/.src/Test/FTestListEditor.class new file mode 100644 index 00000000..d1a0767d --- /dev/null +++ b/comp/src/gb.form/.src/Test/FTestListEditor.class @@ -0,0 +1,8 @@ +' Gambas class file + + +Public Sub ListEditor1_Select() + + Debug + +End diff --git a/comp/src/gb.form/.src/Test/FTestListEditor.form b/comp/src/gb.form/.src/Test/FTestListEditor.form new file mode 100644 index 00000000..63bdac1a --- /dev/null +++ b/comp/src/gb.form/.src/Test/FTestListEditor.form @@ -0,0 +1,9 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,64,64) + { ListEditor1 ListEditor + MoveScaled(5,6,48,34) + Unique = True + } +} diff --git a/comp/src/gb.form/.src/Test/FTestMaskBox.class b/comp/src/gb.form/.src/Test/FTestMaskBox.class new file mode 100644 index 00000000..3cf95aec --- /dev/null +++ b/comp/src/gb.form/.src/Test/FTestMaskBox.class @@ -0,0 +1,14 @@ +' Gambas class file + + +Public Sub TextBox1_Change() + + Debug Last.Text + +End + +Public Sub MaskBox1_Change() + + Debug Last.Text + +End diff --git a/comp/src/gb.form/.src/Test/FTestMaskBox.form b/comp/src/gb.form/.src/Test/FTestMaskBox.form new file mode 100644 index 00000000..7cf820cc --- /dev/null +++ b/comp/src/gb.form/.src/Test/FTestMaskBox.form @@ -0,0 +1,10 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,64,64) + { MaskBox1 MaskBox + MoveScaled(6,15,24,4) + Alignment = Align.Right + Mask = "9999" + } +} diff --git a/comp/src/gb.form/.src/Test/FTestMenuButton.class b/comp/src/gb.form/.src/Test/FTestMenuButton.class new file mode 100644 index 00000000..0a5fa73a --- /dev/null +++ b/comp/src/gb.form/.src/Test/FTestMenuButton.class @@ -0,0 +1,2 @@ +' Gambas class file + diff --git a/comp/src/gb.form/.src/Test/FTestMenuButton.form b/comp/src/gb.form/.src/Test/FTestMenuButton.form new file mode 100644 index 00000000..4b738666 --- /dev/null +++ b/comp/src/gb.form/.src/Test/FTestMenuButton.form @@ -0,0 +1,99 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,64,64) + { mnuProject Menu + Text = ("Project") + Visible = False + { Menu1 Menu + Text = ("Menu1") + } + { Menu2 Menu + Text = ("Menu2") + } + { Menu3 Menu + Text = ("Menu3") + } + } + { mnuView Menu + Text = ("View") + Visible = False + { Menu4 Menu + Text = ("Menu4") + } + { Menu5 Menu + Text = ("Menu5") + } + { Menu6 Menu + Text = ("Menu6") + } + } + { mnuTools Menu + Text = ("Tools") + Visible = False + { Menu7 Menu + Text = ("Menu7") + } + { Menu8 Menu + Text = ("Menu8") + } + { Menu9 Menu + Text = ("Menu9") + { Menu10 Menu + Text = ("Menu10") + } + { Menu11 Menu + Text = ("Menu11") + } + } + } + { HBox1 HBox + MoveScaled(3,14,56,5) + Visible = False + { MenuButton1 MenuButton + MoveScaled(0,0,17,4) + AutoResize = True + Text = ("Project") + Arrow = False + Border = False + Menu = "mnuProject" + } + { MenuButton2 MenuButton + MoveScaled(18,0,16,4) + Enabled = False + AutoResize = True + Text = ("View") + Arrow = False + Border = False + Menu = "mnuView" + } + { MenuButton3 MenuButton + MoveScaled(35,0,16,4) + AutoResize = True + Text = ("Tools") + Arrow = False + Border = False + Menu = "mnuTools" + } + } + { MenuButton4 MenuButton + MoveScaled(9,31,20,4) + Text = ("Menu button") + Picture = Picture["img/32/filter-menu.png"] + } + { MenuButton5 MenuButton + MoveScaled(9,37,20,4) + Text = ("Menu button") + } + { MenuButton6 MenuButton + MoveScaled(9,43,20,4) + Text = ("Menu button") + Picture = Picture["img/32/filter-menu.png"] + Arrow = False + } + { MenuButton7 MenuButton + MoveScaled(9,49,20,4) + Text = ("Menu button") + Arrow = False + } +} diff --git a/comp/src/gb.form/.src/Test/FTestMessageView.class b/comp/src/gb.form/.src/Test/FTestMessageView.class new file mode 100644 index 00000000..5a6c23b6 --- /dev/null +++ b/comp/src/gb.form/.src/Test/FTestMessageView.class @@ -0,0 +1,8 @@ +' Gambas class file + + +Public Sub Button1_Click() + + MessageView1.Open("Impossible d'afficher le message d'erreur.

        Que faire maintenant ?", Picture["icon:/32/warning"]) + +End diff --git a/comp/src/gb.form/.src/Test/FTestMessageView.form b/comp/src/gb.form/.src/Test/FTestMessageView.form new file mode 100644 index 00000000..5da3d9ab --- /dev/null +++ b/comp/src/gb.form/.src/Test/FTestMessageView.form @@ -0,0 +1,25 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,80,64) + Arrangement = Arrange.Vertical + { MessageView1 MessageView + MoveScaled(1,2,72,14) + Animated = True + Separator = True + } + { Panel1 Panel + MoveScaled(2,19,72,39) + Expand = True + Arrangement = Arrange.Vertical + { Button1 Button + MoveScaled(12,11,15,5) + Text = ("Button1") + } + { Panel2 Panel + MoveScaled(36,9,12,19) + Expand = True + Arrangement = Arrange.Fill + } + } +} diff --git a/comp/src/gb.form/.src/Test/FTestSidePanel.class b/comp/src/gb.form/.src/Test/FTestSidePanel.class new file mode 100644 index 00000000..725ddd30 --- /dev/null +++ b/comp/src/gb.form/.src/Test/FTestSidePanel.class @@ -0,0 +1,21 @@ +' Gambas class file + + +Public Sub Form_Open() + + Debug + Application.Animations = True + +End + +Public Sub Form_Arrange() + + 'Debug SidePanelBottom.W;; SidePanelBottom._Container.W + +End + +Public Sub Panel1_Arrange() + + 'Debug Panel1.W - Desktop.Scale * 2;; SidePanelBottom.W + +End diff --git a/comp/src/gb.form/.src/Test/FTestSidePanel.form b/comp/src/gb.form/.src/Test/FTestSidePanel.form new file mode 100644 index 00000000..54b6c36d --- /dev/null +++ b/comp/src/gb.form/.src/Test/FTestSidePanel.form @@ -0,0 +1,40 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,104,64) + Background = &HFFFF00& + Arrangement = Arrange.Horizontal + { SidePanelLeft SidePanel + MoveScaled(1,2,20,57) + Background = &HFFFFFF& + Orientation = Align.Left + Separator = True + } + { Panel2 Panel + MoveScaled(22,13,4,11) + Background = &HFF7F00& + } + { Panel1 VBox + MoveScaled(28,3,52,56) + Background = &H00FF7F& + Expand = True + { DrawingArea1 DrawingArea + MoveScaled(0,0,51,35) + Expand = True + } + { SidePanelBottom SidePanel + MoveScaled(2,41,48,14) + Background = Color.White + Orientation = Align.Bottom + Separator = True + Transparent = True + Hidden = True + } + } + { SidePanelRight SidePanel + MoveScaled(87,7,12,48) + Orientation = Align.Right + Separator = True + Transparent = True + } +} diff --git a/comp/src/gb.form/.src/Test/FTestTabPanel.class b/comp/src/gb.form/.src/Test/FTestTabPanel.class new file mode 100644 index 00000000..de21c139 --- /dev/null +++ b/comp/src/gb.form/.src/Test/FTestTabPanel.class @@ -0,0 +1,85 @@ +' Gambas class file + +Private $hCtrl As Control + + +Public Sub TabPanel2_GotFocus() + + Debug + +End + +Public Sub TabPanel2_LostFocus() + + Debug + +End + +Public Sub Form_Open() + + Dim I As Integer + Dim hLabel As Label + + TabPanel2.Count = 6 + For I = 0 To TabPanel2.Count - 1 + TabPanel2.Index = I + TabPanel2.Text = "Tab " & (I + 1) & " " & String$(CInt(Rnd(1, 10)), "-") + TabPanel2.Picture = Picture["icon:/32/bookmark"] + hLabel = New Label(TabPanel2) + hLabel.Move(8, 8, 8, 8) + hLabel.AutoResize = True + hLabel.Text = " " & CStr(I + 1) & " " + hLabel.Font.Grade = 6 + hLabel.Border = Border.Plain + Next + + TabPanel2[1].Closable = True + +End + +Public Sub Form_DblClick() + + + +End + +Public Sub Timer1_Timer() + + Dim hCtrl As Control + + hCtrl = Application.ActiveControl + If hCtrl <> $hCtrl Then + $hCtrl = hCtrl + If $hCtrl Then + Print "Active: "; $hCtrl.Name + Else + Print "Active: NULL" + Endif + Endif + +End + +Public Sub TabPanel2_Close(Index As Integer) + + Debug Index + +End + +Public Sub Button1_Click() + + TabPanel2.Border = Not TabPanel2.Border + +End + +Public Sub Button2_Click() + + TabPanel2.Orientation = If(TabPanel2.Orientation = Align.Top, Align.Bottom, Align.Top) + +End + +Public Sub Button3_Click() + + TabPanel2.TabBarPaddingStart = 16 - TabPanel2.TabBarPaddingStart + TabPanel2.TabBarPaddingEnd = 16 - TabPanel2.TabBarPaddingEnd + +End diff --git a/comp/src/gb.form/.src/Test/FTestTabPanel.form b/comp/src/gb.form/.src/Test/FTestTabPanel.form new file mode 100644 index 00000000..cd22d0b0 --- /dev/null +++ b/comp/src/gb.form/.src/Test/FTestTabPanel.form @@ -0,0 +1,56 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,105,62) + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + { TabPanel2 TabPanel + MoveScaled(1,2,78,26) + #Translate = False + Foreground = Color.Orange + Expand = True + Border = False + Closable = True + CloseButton = True + Moveable = True + Index = 0 + Text = "Yop" + { Label1 Label + MoveScaled(8,5,19,4) + } + Index = 0 + } + { TabStrip1 TabStrip + MoveScaled(2,30,51,15) + Foreground = Color.Red + Count = 3 + Index = 0 + Text = ("Text") + Index = 1 + Text = ("") + Index = 2 + Text = ("") + Index = 0 + } + { Panel1 HBox + MoveScaled(7,47,66,4) + { Button1 Button + MoveScaled(0,0,16,4) + Text = ("Border") + } + { Button2 Button + MoveScaled(17,0,16,4) + Text = ("Orientation") + } + { Button3 Button + MoveScaled(34,0,16,4) + Text = ("Padding") + } + } + { Timer1 #Timer + #MoveScaled(75,45) + Enabled = True + Delay = 100 + } +} diff --git a/comp/src/gb.form/.src/Test/FTestTimeBox.class b/comp/src/gb.form/.src/Test/FTestTimeBox.class new file mode 100644 index 00000000..0a5fa73a --- /dev/null +++ b/comp/src/gb.form/.src/Test/FTestTimeBox.class @@ -0,0 +1,2 @@ +' Gambas class file + diff --git a/comp/src/gb.form/.src/Test/FTestTimeBox.form b/comp/src/gb.form/.src/Test/FTestTimeBox.form new file mode 100644 index 00000000..93d9e6d7 --- /dev/null +++ b/comp/src/gb.form/.src/Test/FTestTimeBox.form @@ -0,0 +1,12 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,64,64) + { TimeBox1 TimeBox + MoveScaled(8,6,21,4) + ReadOnly = True + } + { SpinBox1 SpinBox + MoveScaled(9,13,9,4) + } +} diff --git a/comp/src/gb.form/.src/Test/FTestToolPanel.class b/comp/src/gb.form/.src/Test/FTestToolPanel.class new file mode 100644 index 00000000..0a5fa73a --- /dev/null +++ b/comp/src/gb.form/.src/Test/FTestToolPanel.class @@ -0,0 +1,2 @@ +' Gambas class file + diff --git a/comp/src/gb.form/.src/Test/FTestToolPanel.form b/comp/src/gb.form/.src/Test/FTestToolPanel.form new file mode 100644 index 00000000..1e1622e8 --- /dev/null +++ b/comp/src/gb.form/.src/Test/FTestToolPanel.form @@ -0,0 +1,16 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,64,64) + { ToolPanel1 ToolPanel + MoveScaled(4,6,24,24) + Count = 3 + Index = 0 + Text = ("Toolbar &0") + Index = 1 + Text = ("Toolbar &1") + Index = 2 + Text = ("Toolbar &2") + Index = 0 + } +} diff --git a/comp/src/gb.form/.src/Test/FTestValueBox.class b/comp/src/gb.form/.src/Test/FTestValueBox.class new file mode 100644 index 00000000..533aaf63 --- /dev/null +++ b/comp/src/gb.form/.src/Test/FTestValueBox.class @@ -0,0 +1,8 @@ +' Gambas class file + + +Public Sub Form_Open() + + DateBox1.Value = Date(30, 1, 1) + +End diff --git a/comp/src/gb.form/.src/Test/FTestValueBox.form b/comp/src/gb.form/.src/Test/FTestValueBox.form new file mode 100644 index 00000000..73529b81 --- /dev/null +++ b/comp/src/gb.form/.src/Test/FTestValueBox.form @@ -0,0 +1,22 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,58,61) + { TextBox1 TextBox + MoveScaled(11,26,24,4) + Text = ("Hello world!") + } + { Spring1 Spring + MoveScaled(25,32,4,6) + } + { Button1 Button + MoveScaled(19,42,16,4) + } + { DateBox1 DateBox + MoveScaled(12,4,24,4) + } + { ValueBox1 ValueBox + MoveScaled(9,13,24,4) + Type = ValueBox.Date + } +} diff --git a/comp/src/gb.form/.src/Test/FTestWizard.class b/comp/src/gb.form/.src/Test/FTestWizard.class new file mode 100644 index 00000000..0ec054ab --- /dev/null +++ b/comp/src/gb.form/.src/Test/FTestWizard.class @@ -0,0 +1,8 @@ +' Gambas class file + + +Public Sub Wizard1_Cancel() + + Me.Close + +End diff --git a/comp/src/gb.form/.src/Test/FTestWizard.form b/comp/src/gb.form/.src/Test/FTestWizard.form new file mode 100644 index 00000000..421fbd9c --- /dev/null +++ b/comp/src/gb.form/.src/Test/FTestWizard.form @@ -0,0 +1,29 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,71,64) + Arrangement = Arrange.Fill + Margin = True + { Wizard1 Wizard + MoveScaled(4,4,64,54) + Count = 4 + Border = False + Index = 0 + Text = ("Étape n°1") + { Button1 Button + MoveScaled(19,22,17,6) + Text = ("Button1") + } + Index = 1 + Text = ("Étape n°2") + { LCDLabel1 LCDLabel + MoveScaled(8,9,44,16) + Text = ("LCDLabel1") + } + Index = 2 + Text = ("Étape n°3") + Index = 3 + Text = ("Étape n°4") + Index = 0 + } +} diff --git a/comp/src/gb.form/.src/Test/FWiki.class b/comp/src/gb.form/.src/Test/FWiki.class new file mode 100644 index 00000000..9b6c5f91 --- /dev/null +++ b/comp/src/gb.form/.src/Test/FWiki.class @@ -0,0 +1,10 @@ +' Gambas class file + + +Public Sub Form_Activate() + + Wait 5 + Desktop.Screenshot(Me.ScreenX, Me.ScreenY, Me.W, Me.H).Save("~/gambas/img/wiki/control/" &/ LCase(Object.Type(Me.Children[0])) & ".png") + Me.Close + +End diff --git a/comp/src/gb.form/.src/Test/FWiki.form b/comp/src/gb.form/.src/Test/FWiki.form new file mode 100644 index 00000000..e64046df --- /dev/null +++ b/comp/src/gb.form/.src/Test/FWiki.form @@ -0,0 +1,27 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,30,6) + TakeFocus = False + SkipTaskbar = True + Margin = True + { Menu1 Menu + { Menu2 Menu + Text = ("Menu2") + } + { Menu3 Menu + Text = ("Menu3") + } + { Menu4 Menu + Text = ("Menu4") + } + { Menu5 Menu + Text = ("Menu5") + } + } + { SpinBar1 SpinBar + MoveScaled(1,1,28,4) + MaxValue = 100 + Step = 1 + } +} diff --git a/comp/src/gb.form/.src/Test/Form1.class b/comp/src/gb.form/.src/Test/Form1.class new file mode 100644 index 00000000..28e4bf59 --- /dev/null +++ b/comp/src/gb.form/.src/Test/Form1.class @@ -0,0 +1,33 @@ +' Gambas class file + +Public Sub Run() As Boolean + + Return Not Me.ShowModal() + +End + +Public Sub btnOK_Click() + + Me.Close(True) + +End + +Public Sub btnCancel_Click() + + Me.Close + +End + + +Public Sub Form_Open() + + Me.Center + +End + + +Public Sub DateBox1_Change() + + Message.Question("does it pass, on debug?") + +End diff --git a/comp/src/gb.form/.src/Test/Form1.form b/comp/src/gb.form/.src/Test/Form1.form new file mode 100644 index 00000000..15607992 --- /dev/null +++ b/comp/src/gb.form/.src/Test/Form1.form @@ -0,0 +1,30 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,64,64) + Resizable = False + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + { DateBox1 DateBox + MoveScaled(17,17,24,4) + } + { HBox1 HBox + MoveScaled(1,59,62,4) + Spacing = True + { Panel1 Panel + MoveScaled(4,0,4,4) + Expand = True + } + { btnOK Button + MoveScaled(29,0,16,4) + Text = ("OK") + Default = True + } + { btnCancel Button + MoveScaled(46,0,16,4) + Text = ("Cancel") + Cancel = True + } + } +} diff --git a/comp/src/gb.form/.src/Test/Form2.class b/comp/src/gb.form/.src/Test/Form2.class new file mode 100644 index 00000000..3d104a8a --- /dev/null +++ b/comp/src/gb.form/.src/Test/Form2.class @@ -0,0 +1,87 @@ +' Gambas class file + + +Public Sub ButtonBox1_Click() + + Debug + +End + +Public Sub HSplit1_Resize() + + Debug Panel1.X;; Panel1.Y;; Panel1.W;; Panel1.H + +End + +Public Sub PictureBox1_Enter() + + Debug + +End + +Public Sub Button1_Enter() + + Debug + +End + +Public Sub Button1_Leave() + + Debug + +End + +Public Sub DrawingArea1_Enter() + + Debug + +End + +Public Sub panSelect_Enter() + + Debug + +End + +Public Sub panSelect_Leave() + + Debug + +End + + +Public Sub Form_Open() + + Print Style.Name + ButtonBox1._AddButton(ToolButton1) + FileProperties1.Path = "/home/benoit" + MenuButton1.SetFocus + DateChooser1.MinValue = Date(Now) + 5 + DateChooser1.MaxValue = Date(Now) + 200 + +End + +Public Sub Button2_Click() + + ButtonBox1.Border = Not ButtonBox1.Border + +End + +Public Sub Button3_Click() + + ComboBox1.ReadOnly = Not ComboBox1.ReadOnly + +End + +Public Sub Button1_Click() + + + +End + +Public Sub DateChooser1_Data({Date} As Date) + + If WeekDay({Date}) = gb.Sunday Then DateChooser1.Data.Foreground = Color.Red + If Day({Date}) = 24 Then DateChooser1.Data.Font = Font["serif,italic"] + +End diff --git a/comp/src/gb.form/.src/Test/Form2.form b/comp/src/gb.form/.src/Test/Form2.form new file mode 100644 index 00000000..41df7a34 --- /dev/null +++ b/comp/src/gb.form/.src/Test/Form2.form @@ -0,0 +1,100 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,138,77) + { Panel1 Panel + MoveScaled(2,2,50,32) + #Translate = False + Border = Border.Plain + { ComboBox1 ComboBox + MoveScaled(4,6,23,4) + #Translate = False + ReadOnly = True + List = ["Élément 1", "Élément 2", "Élément 3"] + } + { Label1 Label + MoveScaled(28,4,19,7) + #Translate = False + } + { Button1 Button + MoveScaled(7,18,13,11) + #Translate = False + Picture = Picture["img/colormap.png"] + } + { Panel3 Panel + MoveScaled(24,16,22,7) + #Translate = False + Arrangement = Arrange.Fill + Margin = True + { ButtonBox1 ButtonBox + MoveScaled(0,0,21,5) + #Translate = False + } + } + { ToolButton1 ToolButton + MoveScaled(39,8,4,4) + } + { DateBox2 DateBox + MoveScaled(23,26,24,4) + ReadOnly = True + } + } + { Button2 Button + MoveScaled(5,0,16,4) + #Translate = False + Text = "toto" + } + { ScrollArea1 ScrollArea + MoveScaled(57,2,20,11) + #Translate = False + Background = Color.TextBackground + } + { Button3 Button + MoveScaled(24,0,16,4) + #Translate = False + } + { Panel2 Panel + MoveScaled(57,19,19,6) + #Translate = False + Background = &HFFDFDF& + Arrangement = Arrange.Fill + Margin = True + { TextBox1 TextBox + MoveScaled(0,0,18,5) + } + } + { Panel4 Panel + MoveScaled(60,27,19,6) + #Translate = False + Background = &HFFDFDF& + Arrangement = Arrange.Fill + Margin = True + { TextBox2 TextBox + MoveScaled(0,0,18,5) + Border = False + } + } + { DateBox1 DateBox + MoveScaled(61,14,24,4) + Mode = DateChooser.DateTime + } + { DateChooser1 DateChooser + MoveScaled(6,40,66,32) + Mode = DateChooser.DateTime + } + { FileProperties1 FileProperties + MoveScaled(88,7,45,51) + } + { MenuButton1 MenuButton + MoveScaled(93,68,18,4) + Text = ("MenuButton1") + } + { ButtonBox2 ButtonBox + MoveScaled(95,59,21,7) + Text = ("ButtonBox2") + } + { MaskBox1 MaskBox + MoveScaled(88,2,24,4) + Mask = "990!.0000" + } +} diff --git a/comp/src/gb.form/.src/Test/Form4.class b/comp/src/gb.form/.src/Test/Form4.class new file mode 100644 index 00000000..6a4ec5a9 --- /dev/null +++ b/comp/src/gb.form/.src/Test/Form4.class @@ -0,0 +1,10 @@ +' Gambas class file + + + +Public Sub SpinBox1_MouseWheel() + + Debug + 'Stop Event + +End diff --git a/comp/src/gb.form/.src/Test/Form4.form b/comp/src/gb.form/.src/Test/Form4.form new file mode 100644 index 00000000..bc9dbace --- /dev/null +++ b/comp/src/gb.form/.src/Test/Form4.form @@ -0,0 +1,15 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,74,74) + Background = Color.Yellow + Margin = True + { SliderBox1 SliderBox + MoveScaled(4,12,48,4) + Step = 10 + } + { SpinBox1 SpinBox + MoveScaled(21,24,9,4) + Step = 10 + } +} diff --git a/comp/src/gb.form/.src/TestControl.class b/comp/src/gb.form/.src/TestControl.class new file mode 100644 index 00000000..7a53de3a --- /dev/null +++ b/comp/src/gb.form/.src/TestControl.class @@ -0,0 +1,11 @@ +' Gambas class file + +Inherits UserControl + +Private $hCal As Form4 + +Public Sub _new() + + $hCal = New Form4(Me) + +End diff --git a/comp/src/gb.form/.src/ToolPanel/FToolBar.class b/comp/src/gb.form/.src/ToolPanel/FToolBar.class new file mode 100644 index 00000000..af491d20 --- /dev/null +++ b/comp/src/gb.form/.src/ToolPanel/FToolBar.class @@ -0,0 +1,73 @@ +' Gambas class file + +Public Function GetContainer() As Container + + Return panToolBar + +End + + +Public Sub SetTitle(sTitle As String) + + btnTitle.Text = sTitle + btnTitle.Height = Me.Font.Height + 4 + Style.FrameWidth * 2 + 'IF ME.Parent.Parent.Parent.Design THEN panToolBar.Move(0, btnTitle.H, panToolBar.W, ME.CLientH - btnTitle.H) + +End + +Public Function GetTitle() As String + + Return btnTitle.Text + +End + +Public Sub SetPicture(hPict As Picture) + + btnTitle.Picture = hPict + +End + +Public Function GetPicture() As Picture + + Return btnTitle.Picture + +End + +Public Function GetButtonHeight() As Integer + + Return btnTitle.Height + +End + +Public Sub btnTitle_Click() + + Dim hParent As ToolPanelContainer = Me._Parent + hParent._Change + +End + +Public Sub SetTextFont(hFont As Font) + + btnTitle.Font = hFont + SetTitle(btnTitle.Text) + +End + +Public Sub GetTextFont() As Font + + Return btnTitle.Font + +End + +' Public Sub Form_MouseWheel() +' +' Dim hToolPanel As ToolPanel = Me.Parent.Parent.Parent +' +' If Mouse.Delta < 0 Then +' Try Inc hToolPanel.Index +' Else +' Try Dec hToolPanel.Index +' Endif +' +' End +' diff --git a/comp/src/gb.form/.src/ToolPanel/FToolBar.form b/comp/src/gb.form/.src/ToolPanel/FToolBar.form new file mode 100644 index 00000000..236f7738 --- /dev/null +++ b/comp/src/gb.form/.src/ToolPanel/FToolBar.form @@ -0,0 +1,15 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(17.125,31,50,50) + Resizable = False + Arrangement = Arrange.Vertical + { btnTitle Button + MoveScaled(1,1,48,4) + Border = False + } + { panToolbar Panel + MoveScaled(1,5,47,43) + Expand = True + } +} diff --git a/comp/src/gb.form/.src/ToolPanel/ToolPanel.class b/comp/src/gb.form/.src/ToolPanel/ToolPanel.class new file mode 100644 index 00000000..ce15682e --- /dev/null +++ b/comp/src/gb.form/.src/ToolPanel/ToolPanel.class @@ -0,0 +1,270 @@ +' Gambas class file + +Export +Inherits UserContainer + +Public Const _Properties As String = "*,Count{Range:1;256}=1,Index,Text,TextFont,Picture,Animated,Border" +Public Const _Similar As String = "TabStrip" +Public Const _IsMultiContainer As Boolean = True + +Event Click + +Property Count As Integer +Property Index As Integer +Property Text As String +Property Picture As Picture +Property Animated As Boolean +Property Font As Font +Property TextFont As Font +Property Border As Boolean + +Private $hWatcher As Watcher +Private $aToolBar As New ToolPanelContainer[] +Private $iCurrent As Integer +Private $bAnimate As Boolean +Private $hPanel As Panel + +Public Sub _new() + + $hPanel = New Panel(Me) + $hWatcher = New Watcher($hPanel) As "ToolPanel" + + Me._Container = $hPanel + Me.Count = 1 + Me.Index = 0 + +End + +Private Function Count_Read() As Integer + + Return $aToolBar.Count + +End + +Private Sub Count_Write(iCount As Integer) + + Dim iInd As Integer + Dim hToolbar As ToolPanelContainer + Dim hFont As Font + + If iCount < 1 Then Error.Raise("Bad argument") + If iCount = $aToolbar.Count Then Return + + If iCount < $aToolBar.Count Then + + For iInd = $aToolBar.Max To iCount Step -1 + hToolbar = $aToolBar[iInd] + If hToolbar._Container.Children.Count Then Error.Raise("ToolPanel container is not empty") + Next + + For iInd = $aToolBar.Max To iCount Step -1 + $aToolBar[iInd].Delete + Next + + $aToolBar.Remove(iCount, -1) + Index_Write(Min($iCurrent, iCount - 1)) + + Else + + 'hCont = ME.Container + 'ME.Container = $hPanel + Try hFont = $aToolBar[0].TextFont + + For iInd = $aToolBar.Count To iCount - 1 + hToolbar = New ToolPanelContainer($hPanel) As "ToolPanelContainer" + hToolbar.Width = Me.Width + hToolbar.Text = "Toolbar " & CInt(iInd) + hToolBar.Tag = iInd + hToolBar.TextFont = hFont + $aToolBar.Add(hToolbar) + Next + 'ME.Container = hCont + + 'ME.Index = iCount - 1 + Index_Write(iCount - 1) + + Endif + +End + +Private Function Index_Read() As Integer + + Return $iCurrent + +End + +Private Sub Index_Write(iIndex As Integer) + + If iIndex < 0 Or iIndex >= $aToolBar.Count Then Error.Raise("Bad index") + + Me._Container = $aToolBar[iIndex] + $iCurrent = iIndex + + MoveToolbar(Me.Visible) + +End + +Private Sub MoveToolbar(Optional bAnim As Boolean) + + Dim hToolBar As ToolPanelContainer + Dim Y As Integer + Dim YY As Integer + Dim iInd As Integer + Dim iRest As Integer + Dim bCurrent As Boolean + + Y = $hPanel.ClientY + + For iInd = 0 To $aToolBar.Max + + hToolBar = $aToolBar[iInd] + If Not hToolbar.Visible Then Continue + + bCurrent = iInd = $iCurrent + hToolBar._Container.Visible = True + + If bAnim And $bAnimate Then + If ((hToolBar.Y < Y) And iInd = $aToolBar.Max) Or ((hToolBar.Y > Y) And bCurrent) Then + For YY = hToolBar.Y To Y Step 8 * Sgn(Y - hToolBar.Y) + hToolBar.Y = YY + Wait + Next + Endif + Endif + + 'hToolBar.ShowToolBar(bCurrent) + + If iInd = $iCurrent Then + YY = $hPanel.ClientY + $hPanel.ClientH + For iRest = iInd + 1 To $aToolBar.Max + If Not $aToolBar[iRest].Visible Then Continue + YY -= $aToolBar[iRest].GetButtonHeight() + Next + Else + YY = Y + hToolbar.GetButtonHeight() + Endif + + 'hToolBar.Move($hPanel.ClientX, Y, $hPanel.ClientW, YY - Y) + hToolBar.Move($hPanel.ClientX, Y, $hPanel.ClientW, YY - Y) + Y = YY + + Next + + For iInd = 0 To $aToolBar.Max + + hToolBar = $aToolBar[iInd] + bCurrent = iInd = $iCurrent + hToolBar._Container.Visible = bCurrent + + Next + +End + +Private Function Text_Read() As String + + Return $aToolBar[$iCurrent].Text + +End + +Private Sub Text_Write(sText As String) + + $aToolBar[$iCurrent].Text = sText + +End + +Private Function Picture_Read() As Picture + + Return $aToolBar[$iCurrent].Picture + +End + +Private Sub Picture_Write(hPict As Picture) + + $aToolBar[$iCurrent].Picture = hPict + +End + +Public Sub ToolPanelContainer_Change() + + Index_Write(Last.Tag) + Raise Click + +End + +Public Sub ToolPanel_Resize() + + MoveToolbar + +End + +Private Function Animated_Read() As Boolean + + Return $bAnimate + +End + +Private Sub Animated_Write(bAnim As Boolean) + + $bAnimate = bAnim + +End + +Public Function _get(Index As Integer) As ToolPanelContainer + + If Index < 0 Or Index >= $aToolBar.Count Then Error.Raise("Bad index") + Return $aToolBar[Index] + +End + +Private Function Font_Read() As Font + + Return Super.Font + +End + +Private Sub Font_Write(hFont As Font) + + Dim hToolbar As ToolPanelContainer + + Super.Font = hFont + + For Each hToolbar In $aToolbar + hToolBar.Text = hToolBar.Text + Next + + MoveToolBar(False) + +End + +Private Function Border_Read() As Boolean + + Return $hPanel.Border <> Border.None + +End + +Private Sub Border_Write(bBorder As Boolean) + + $hPanel.Border = If(bBorder, Border.Sunken, Border.None) + MoveToolbar(False) + +End + +Private Function TextFont_Read() As Font + + Dim hToolbar As ToolPanelContainer = $aToolBar[0] + + Return hToolBar.GetTextFont() + +End + +Private Sub TextFont_Write(Value As Font) + + Dim hToolbar As ToolPanelContainer + + For Each hToolbar In $aToolbar + hToolBar.TextFont = Value + Next + + MoveToolBar(False) + +End diff --git a/comp/src/gb.form/.src/ToolPanel/ToolPanelContainer.class b/comp/src/gb.form/.src/ToolPanel/ToolPanelContainer.class new file mode 100644 index 00000000..45fc9b45 --- /dev/null +++ b/comp/src/gb.form/.src/ToolPanel/ToolPanelContainer.class @@ -0,0 +1,97 @@ +' Gambas class file + +Inherits UserControl + +Event Change + +Property Text As String +Property TextFont As Font +Property Picture As Picture +'PROPERTY Enabled AS Boolean +Property Visible As Boolean +Property Read Container As Container + +Private frmContainer As FToolBar + +Public Sub _new() + + frmContainer = New FToolBar(Me) + Me._Container = frmContainer.GetContainer() + 'Object.Attach(frmContainer, ME, "ToolBar") + +End + + +Public Function GetButtonHeight() As Integer + + Return frmContainer.GetButtonHeight() + +End + + +Private Function Text_Read() As String + + Return frmContainer.GetTitle() + +End + +Private Sub Text_Write(sText As String) + + frmContainer.SetTitle(sText) + +End + +Private Function Picture_Read() As Picture + + Return frmContainer.GetPicture() + +End + +Private Sub Picture_Write(hPict As Picture) + + frmContainer.SetPicture(hPict) + +End + +Public Sub _Change() + + Raise Change + +End + +Private Function Visible_Read() As Boolean + + Return Super.Visible + +End + +Private Sub Visible_Write(Value As Boolean) + + Dim hToolPanel As ToolPanel + + If Value = Super.Visible Then Return + + Super.Visible = Value + hToolPanel = Me.Parent.Parent + hToolPanel.ToolPanel_Resize + +End + + +Private Function TextFont_Read() As Font + + Return frmContainer.GetTextFont() + +End + +Private Sub TextFont_Write(Value As Font) + + frmContainer.SetTextFont(Value) + +End + +Private Function Container_Read() As Container + + Return frmContainer.GetContainer() + +End diff --git a/comp/src/gb.form/.src/URLLabel.class b/comp/src/gb.form/.src/URLLabel.class new file mode 100644 index 00000000..d9a0f0f4 --- /dev/null +++ b/comp/src/gb.form/.src/URLLabel.class @@ -0,0 +1,131 @@ +' Gambas class file + +Export + +Inherits Label + +Public Const _Properties As String = "*,Link" +'Public Const _DefaultSize As String = "24,4" +Public Const _DefaultEvent As String = "Click" + +Event Click + +Property Link As String +Property Visited As Boolean +Property Foreground As Integer +Property Text As String + +Private $bVisited As Boolean +Private $sText As String +Private $sLink As String +Private $iMouse As Integer + +Private $hObs As Observer + +Public Sub _new() + + $hObs = New Observer(Me) As "Label" + UpdateLabel + +End + +Private Function Visited_Read() As Boolean + + Return $bVisited + +End + +Private Sub UpdateLabel() + + Super.Foreground = If($bVisited, Color.VisitedForeground, Color.LinkForeground) + If $sText Then + Super.Text = $sText + Else + Super.Text = $sLink + Endif + +End + +Private Sub Visited_Write(Value As Boolean) + + $bVisited = Value + UpdateLabel + +End + +Public Sub Label_Enter() + + $iMouse = Me.Mouse + + If Not Me.Design And If Me.Enabled Then Me.Mouse = Mouse.Pointing + +End + +Public Sub Label_Leave() + + Me.Mouse = $iMouse + +End + +Public Sub Label_MouseDown() + + Dim bStop As Boolean + Dim sLink As String + + If Me.Design Then Return + If Not Me.Enabled Then Return + + bStop = Raise Click + If bStop Then Return + + $bVisited = True + UpdateLabel + + sLink = $sLink + If Not sLink Then sLink = $sText + + If sLink Like "*://*" And If Component.IsLoaded("gb.desktop") Then + Desktop.Open(sLink) + Endif + +End + +Private Function Link_Read() As String + + Return $sLink + +End + +Private Sub Link_Write(Value As String) + + If Me.Tooltip = $sLink Then Me.Tooltip = Value + $sLink = Value + UpdateLabel + +End + + +Private Function Foreground_Read() As Integer + + Return Super.Foreground + +End + +Private Sub Foreground_Write((Value) As Integer) + + ' Ignore explicit foreground + +End + +Private Function Text_Read() As String + + Return $sText + +End + +Private Sub Text_Write(Value As String) + + $sText = Value + UpdateLabel + +End diff --git a/comp/src/gb.form/.src/ValueBox.class b/comp/src/gb.form/.src/ValueBox.class new file mode 100644 index 00000000..d35e61ea --- /dev/null +++ b/comp/src/gb.form/.src/ValueBox.class @@ -0,0 +1,392 @@ +' Gambas class file + +Export + +Inherits UserControl + +Public Const _Properties As String = "*,Action,Text,Alignment{Align.Normal;Left;Center;Right}=Normal,Type{ValueBox.*}=Number,ReadOnly,Border=True" +Public Const _DefaultSize As String = "24,4" +Public Const _Similar As String = "TextBox" + +Event Change + +Property Type As Integer +Property Value As Variant +Property Border As Boolean +Property ReadOnly As Boolean +Property Text As String +Property Alignment As Integer + +Public Enum {Number}, {Date}, {Time}, Currency, DateTime, IPAddress + +Private $iType As Integer +Private $hCtrl As Control +Private $hTextBox As TextBox +Private $hDateBox As DateBox +Private $hMaskBox As MaskBox + +Private $sDecimalSep As String +Private $sLastText As String + +Public Sub _new() + + UpdateType + +End + +Private Function Type_Read() As Integer + + Return $iType + +End + +Private Sub Type_Write(Value As Integer) + + If Value = $iType Then Return + + $iType = Value + UpdateType + +End + +Private Sub UpdateType() + + Dim sMask As String + Dim bBorder As Boolean = True + Dim bReadOnly As Boolean + + If $hCtrl Then + bBorder = Border_Read() + bReadOnly = ReadOnly_Read() + Me.Proxy = Null + $hCtrl.Delete + $hCtrl = Null + $hTextBox = Null + $hDateBox = Null + $hMaskBox = Null + Endif + + Select Case $iType + + Case {Number} + $hTextBox = New TextBox(Me) As "NumberBox" + $hCtrl = $hTextBox + $hTextBox.Text = "0" + $sDecimalSep = Left$(Format$(0, ".0")) + + Case {Date} + $hDateBox = New DateBox(Me) As "DateBox" + $hCtrl = $hDateBox + + Case {Time} + $hDateBox = New DateBox(Me) As "DateBox" + $hDateBox.Mode = DateChooser.TimeOnly + $hCtrl = $hDateBox + + Case Currency + $hMaskBox = New MaskBox(Me) As "CurrencyBox" + $hCtrl = $hMaskBox + $sDecimalSep = Left$(Format$(0, ".0")) + sMask = Replace(Format(10, "$#0.00"), "1", "########") + $hMaskBox.Mask = Replace(sMask, $sDecimalSep, " $hTextBox.Text Then + $hTextBox.Text = sText + Endif + $hTextBox.Pos = Max(If(bNeg, 1, 0), iPos) + Object.Unlock($hTextBox) + + If $hTextBox.Text <> $sLastText Then + $sLastText = $hTextBox.Text + Raise Change + Endif + +End + +Private Function Value_Read() As Variant + + Select Case $iType + + Case {Number} + Return Val($hTextBox.Text) + + Case {Date}, {DateTime}, {Time} + Return $hDateBox.Value + + Case {Currency} + Return Val(Trim(Replace($hMaskBox.Text, GetCurrency(), ""))) + + Case IpAddress + Return Replace($hMaskBox.Text, " ", "") + + End Select + +End + +Private Sub Value_Write(Value As Variant) + + Dim sText As String + Dim sVal As String + Dim iVal As Integer + Dim aText As String[] + + Select Case $iType + + Case {Number} + If TypeOf(Value) = gb.String Then + Try Value = CFloat(Value) + Endif + If TypeOf(Value) > gb.Boolean And If TypeOf(Value) <= gb.Float Then + Value = CFloat(Value) + $hTextBox.Text = Str(Value) + $hTextBox.Pos = $hTextBox.Length + Else + $hTextBox.Text = "" + Endif + + Case {Date}, {DateTime}, {Time} + $hDateBox.Value = Value + + Case {Currency} + If TypeOf(Value) = gb.String Then + Try Value = CFloat(Value) + Endif + If TypeOf(Value) > gb.Boolean And If TypeOf(Value) <= gb.Float Then + Value = CFloat(Value) + Else + Value = 0 + Endif + $hMaskBox.Text = Format(Value, "$########0.00") + $hMaskBox.Pos = $hMaskBox.Length - 2 + + Case IpAddress + If TypeOf(Value) = gb.String Or If IsNull(Value) Then + aText = Split(Value, ".") + While aText.Count < 4 + aText.Add("0") + Wend + aText.Resize(4) + For Each sVal In aText + Try iVal = CInt(sVal) + If Error Then Return + If iVal < 0 Or If iVal > 255 Then Return + If sText Then sText &= "." + sText &= Format(iVal, "##0") + Next + $hMaskBox.Text = sText + Endif + + End Select + +End + +Private Function Border_Read() As Boolean + + Dim hCtrl As Object = $hCtrl + Try Return hCtrl.Border + +End + +Private Sub Border_Write(Value As Boolean) + + Dim hCtrl As Object = $hCtrl + Try hCtrl.Border = Value + +End + +Private Function ReadOnly_Read() As Boolean + + Dim hCtrl As Object = $hCtrl + Try Return hCtrl.ReadOnly + +End + +Private Sub ReadOnly_Write(Value As Boolean) + + Dim hCtrl As Object = $hCtrl + Try hCtrl.ReadOnly = Value + +End + +Private Function Text_Read() As String + + Dim hCtrl As Object = $hCtrl + Return hCtrl.Text + +End + +Private Sub GetCurrency() As String + + Return Trim(Replace(Format(1, "$#"), "1", "")) + +End + +Private Sub Text_Write(Value As String) + + Select Case $iType + + Case {Number} + If IsNumber(Value) Then + Value_Write(Val(Value)) + Else + Value_Write(0) + Endif + + Case {Date}, {Time}, DateTime + If IsDate(Value) Then + Value_Write(Val(Value)) + Else + Value_Write(Null) + Endif + + Case Currency + Value = Trim(Replace(Value, GetCurrency(), "")) + If IsNumber(Value) Then + Value_Write(Val(Value)) + Else + Value_Write(0) + Endif + + Case IPAddress + Value_Write(Value) + + End Select + +End + +Public Sub DateBox_Change() + + Raise Change + +End + +Public Sub CurrencyBox_Change() + + Raise Change + +End + +Public Sub IpAddressBox_Change() + + Raise Change + +End + +Private Function Alignment_Read() As Integer + + Dim hCtrl As Object = $hCtrl + Try Return hCtrl.Alignment + Return Align.Normal + +End + +Private Sub Alignment_Write(Value As Integer) + + Dim hCtrl As Object = $hCtrl + Try hCtrl.Alignment = Value + +End diff --git a/comp/src/gb.form/.src/Wizard/FWizard.class b/comp/src/gb.form/.src/Wizard/FWizard.class new file mode 100644 index 00000000..fb0bb774 --- /dev/null +++ b/comp/src/gb.form/.src/Wizard/FWizard.class @@ -0,0 +1,150 @@ +' Gambas class file + +Event Previous +Event {Next} +Event Cancel + +Public Sub btnPrevious_Click() + + Raise Previous + +End + +Public Sub btnNext_Click() + + Raise {Next} + +End + +Public Sub btnCancel_Click() + + Raise Cancel + +End + +Public Function GetContainer() As Container + + Return panWizard + +End + +Private Sub UpdateTitle() + + Dim H As Integer + Dim hPict As Picture + + H = panTitle.Font.Height + hPict = picTitle.Picture + + If hPict Then + H = Max(H, hPict.Height) + picTitle.Width = hPict.Width + panTitle.Indent = False + Else + panTitle.Indent = True + Endif + + H += panTitle.Padding * 2 + 4 + panTitle.Height = H + +End + + +Public Sub SetTitle(sText As String, hPict As Picture) + + lblTitle.Text = sText + picTitle.Picture = hPict + picTitle.Visible = hPict + + UpdateTitle + +End + +Public Sub UpdateActionButton() + + Dim hWizard As Wizard = Me.Parent + + If hWizard.ActionPicture Then + btnNext.Picture = hWizard.ActionPicture + Else + btnNext.Picture = Null + Endif + + If hWizard.ActionText Then + btnNext.Text = hWizard.ActionText + Else + btnNext.Text = ("OK") + Endif + + btnNext.Default = True + +End + + +Public Sub SetPosition((iPos) As Integer, bPrevious As Boolean, bNext As Boolean) + + btnPrevious.Enabled = bPrevious + If bNext Then + btnNext.Text = ("&Next") + btnNext.Picture = Picture["icon:/small/forward"] + btnNext.Default = False + Else + UpdateActionButton + Endif + + btnNext.AutoResize = True + btnNext.AutoResize = False + btnNext.W = Max(btnNext.W, btnCancel.W) + +End + +Public Sub SetShowTitle(bShow As Boolean) + + panTitle.Visible = bShow + +End + +Public Sub GetShowTitle() As Boolean + + Return panTitle.Visible + +End + +Public Sub SetBorder(bOn As Boolean) + + panWizard.Border = If(bOn, Border.Plain, Border.None) + 'panWizard.Padding = If(bOn, 2, 0) + +End + +Public Sub GetBorder() As Boolean + + Return panWizard.Border <> Border.None + +End + +Public Sub GetTextFont() As Font + + Return panTitle.Font + +End + +Public Sub SetTextFont(hFont As Font) + + panTitle.Font = hFont + UpdateTitle + +End + +Public Sub SetShowButton(bShow As Boolean) + + panButton.Visible = bShow + +End + +Public Sub GetShowButton() As Boolean + + Return panButton.Visible + +End + diff --git a/comp/src/gb.form/.src/Wizard/FWizard.form b/comp/src/gb.form/.src/Wizard/FWizard.form new file mode 100644 index 00000000..9d1373b3 --- /dev/null +++ b/comp/src/gb.form/.src/Wizard/FWizard.form @@ -0,0 +1,51 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(48.125,29,66,50) + Resizable = False + Arrangement = Arrange.Vertical + Spacing = True + { panTitle Panel + MoveScaled(1,1,61,6) + Arrangement = Arrange.Horizontal + Spacing = True + Margin = True + Padding = 4 + Border = Border.Plain + { picTitle PictureBox + MoveScaled(1,1,4,4) + Alignment = Align.Center + } + { lblTitle Label + MoveScaled(9,1,37,4) + Expand = True + AutoResize = True + } + } + { panWizard Panel + MoveScaled(1,8,61,30) + Expand = True + Arrangement = Arrange.Fill + Border = Border.Plain + } + { panButton HBox + MoveScaled(1,40,59,4) + Spacing = True + Invert = True + { btnCancel Button + MoveScaled(40,0,17,4) + Text = ("Cancel") + Cancel = True + } + { btnNext Button + MoveScaled(22,0,17,4) + Text = Shortcut(("Next"), "N") + Picture = Picture["icon:/small/forward"] + } + { btnPrevious Button + MoveScaled(4,0,17,4) + Text = Shortcut(("Previous"), "P") + Picture = Picture["icon:/small/rewind"] + } + } +} diff --git a/comp/src/gb.form/.src/Wizard/Wizard.class b/comp/src/gb.form/.src/Wizard/Wizard.class new file mode 100644 index 00000000..29ccc413 --- /dev/null +++ b/comp/src/gb.form/.src/Wizard/Wizard.class @@ -0,0 +1,452 @@ +' Gambas class file + +Export +Inherits UserContainer + +Public Const _Properties As String = "*,Count{Range:1;256}=1,Index,Text,TextFont,Picture,ShowTitle=True,ShowIndex=False,ShowButton=True,Border=True,ActionText,ActionPicture" +Public Const _DefaultEvent As String = "Change" +Public Const _Similar As String = "TabStrip" +Public Const _IsMultiContainer As Boolean = True + +Event BeforeChange +Event Change +Event Cancel +Event Click +Event {Close} + +Property Count As Integer +Property Index As Integer +Property Read LastIndex As Integer +Property Text As String +Property Picture As Picture +Property ShowTitle As Boolean +Property ShowIndex As Boolean +Property Border As Boolean +Property TextFont As Font +Property ActionText As String +Property ActionPicture As Picture +Property Animated As Boolean +Property ShowButton As Boolean + +Private $hWizard As FWizard +Private $aStep As New _WizardContainer[] +Private $iCurrent As Integer = -1 +Private $iLast As Integer = -1 +Private $bShowIndex As Boolean +Private $sActionText As String +Private $hActionPicture As Picture +Private $iAllowAnimation As Integer + +Static Private $bDeprecated As Boolean + +Public Sub _new() + + $hWizard = New FWizard(Me) As "Wizard" + 'Object.Attach($hWizard, Me, "Wizard") + + Me.Count = 1 + 'ME.Index = 0 + +End + +Private Function Count_Read() As Integer + + Return $aStep.Count + +End + +Private Sub Count_Write(iCount As Integer) + + Dim iInd As Integer + Dim hStep As _WizardContainer + + If iCount < 1 Then Error.Raise("Bad argument") + If iCount = $aStep.Count Then Return + + If iCount < $aStep.Count Then + + For iInd = $aStep.Max To iCount Step -1 + hStep = $aStep[iInd] + If hStep.Children.Count Then Error.Raise("Wizard step is not empty") + Next + + For iInd = $aStep.Max To iCount Step -1 + $aStep[iInd].Delete + Next + + $aStep.Remove(iCount, -1) + Index_Write(Min($iCurrent, $aStep.Max)) + + Else + + For iInd = $aStep.Count To iCount - 1 + hStep = New _WizardContainer($hWizard.GetContainer()) As "WizardContainer" + hStep.Tag = iInd + $aStep.Add(hStep) + hStep.Text = Subst(("Step #&1"), CInt(iInd + 1)) + Next + 'ME.Index = iCount - 1 + Index_Write(0) + + Endif + +End + +Private Sub GetNext(iInd As Integer) As Integer + + Do + Inc iInd + If iInd >= $aStep.Count Then Return -1 + If $aStep[iInd].Enabled Then Return iInd + Loop + +End + +Private Sub GetPrevious(iInd As Integer) As Integer + + Do + Dec iInd + If iInd < 0 Then Return -1 + If $aStep[iInd].Enabled Then Return iInd + Loop + +End + + +Private Function Index_Read() As Integer + + Return $iCurrent + +End + +Private Sub DoAnimate(iSrc As Integer, iDest As Integer) + + Dim fTime As Float + Dim hCont As Container + Dim hSrc As _WizardContainer + Dim hDest As _WizardContainer + Dim Y As Integer + + Y = If($hWizard.GetBorder(), 1, 0) + + hCont = $hWizard.GetContainer() + hSrc = $aStep[iSrc] + hDest = $aStep[iDest] + + hSrc.Show + hDest.Show + hSrc.Ignore = True + hDest.Ignore = True + + If iDest > iSrc Then + + hDest.Move(hCont.W, Y) + + fTime = Timer + While hDest.X > 0 + hDest.X = Max(0, hCont.W * (1 - (Timer - fTime) * 8)) + hSrc.X = hDest.X - hCont.W + Wait + Wend + + Else + + hDest.Move(-hCont.W, Y) + + fTime = Timer + While hDest.X < 0 + hDest.X = Min(0, -hCont.W * (1 - (Timer - fTime) * 8)) + hSrc.X = hDest.X + hCont.W + Wait + Wend + + Endif + + hDest.Raise + hSrc.Ignore = False + hDest.Ignore = False + +End + +Private Sub Index_Write(iIndex As Integer) + + Dim bCancel As Boolean + Dim bWasNext As Boolean + + If iIndex < 0 Or iIndex >= $aStep.Count Then Error.Raise("Bad index") + + If iIndex = $iCurrent Then Return + + If Not $aStep[iIndex].Enabled Then Return + + If iIndex > $iCurrent Then + + bWasNext = iIndex = GetNext($iCurrent) + + bCancel = Raise BeforeChange + If bCancel Then Return + + If bWasNext Then + iIndex = GetNext($iCurrent) + If iIndex < 0 Then Return + Endif + + Endif + + If Application.Animations And If $iAllowAnimation Then DoAnimate($iCurrent, iIndex) + + Me._Container = $aStep[iIndex] + + $iLast = $iCurrent + $iCurrent = iIndex + + RefreshWizard + + Raise Change + Raise Click + +End + +Private Sub GetEnabledIndex(iCurrent As Integer) As Integer + + Dim iCount As Integer + Dim iIndex As Integer + + iIndex = -1 + Do + iIndex = GetNext(iIndex) + If iIndex > iCurrent Then Return + Inc iCount + If iIndex = iCurrent Then Return iCount + Loop + +End + +Public Sub Update() + + RefreshWizard() + +End + +Private Sub RefreshWizard() + + Dim hCurrent As _WizardContainer + Dim iIndex As Integer + Dim sText As String + + If $iCurrent >= 0 Then + + hCurrent = $aStep[$iCurrent] + hCurrent.Show + hCurrent.Raise + + sText = hCurrent.Text + If $bShowIndex Then + iIndex = GetEnabledIndex($iCurrent) + If iIndex Then sText = CStr(iIndex) & ". " & sText + Endif + $hWizard.SetTitle(sText, hCurrent.Picture) + $hWizard.SetPosition($iCurrent, GetPrevious($iCurrent) >= 0, GetNext($iCurrent) >= 0) + + 'Wait + + Endif + + If $iLast >= 0 And $iLast <= $aStep.Max Then + $aStep[$iLast].Lower + $aStep[$iLast].Hide + Endif + +End + + +Private Function Text_Read() As String + + Return $aStep[$iCurrent].Text + +End + +Private Sub Text_Write(sText As String) + + $aStep[$iCurrent].Text = sText + +End + +Private Function Picture_Read() As Picture + + Return $aStep[$iCurrent].Picture + +End + +Private Sub Picture_Write(hPict As Picture) + + $aStep[$iCurrent].Picture = hPict + +End + +Public Sub WizardContainer__Refresh() + + RefreshWizard + +End + +Public Function _get(Index As Integer) As _WizardContainer + + If Index < 0 Or Index >= $aStep.Count Then Error.Raise("Bad index") + Return $aStep[Index] + +End + +Public Sub Wizard_Previous() + + Dim iInd As Integer = GetPrevious($iCurrent) + If iInd >= 0 Then + Inc $iAllowAnimation + Index_Write(iInd) + Dec $iAllowAnimation + Endif + +End + +Public Sub MovePrevious() + + Wizard_Previous + +End + +Public Sub Wizard_Next() + + Dim iInd As Integer = GetNext($iCurrent) + Dim bCancel As Boolean + + If iInd >= 0 Then + Inc $iAllowAnimation + Index_Write(iInd) + Dec $iAllowAnimation + Else + bCancel = Raise BeforeChange + If bCancel Then Return + Raise {Close} + Endif + +End + +Public Sub MoveNext() + + Wizard_Next + +End + + +Public Sub Wizard_Cancel() + + Raise Cancel + +End + +Private Function ShowTitle_Read() As Boolean + + Return $hWizard.GetShowTitle() + +End + +Private Sub ShowTitle_Write(Value As Boolean) + + $hWizard.SetShowTitle(Value) + +End + +Private Function Border_Read() As Boolean + + Return $hWizard.GetBorder() + +End + +Private Sub Border_Write(Value As Boolean) + + $hWizard.SetBorder(Value) + +End + +Private Function LastIndex_Read() As Integer + + Return $iLast + +End + +Private Function ShowIndex_Read() As Boolean + + Return $bShowIndex + +End + +Private Sub ShowIndex_Write(Value As Boolean) + + $bShowIndex = Value + RefreshWizard + +End + +Private Function TextFont_Read() As Font + + Return $hWizard.GetTextFont() + +End + +Private Sub TextFont_Write(Value As Font) + + $hWizard.SetTextFont(Value) + +End + +Private Function ActionText_Read() As String + + Return $sActionText + +End + +Private Sub ActionText_Write(Value As String) + + $sActionText = Value + If GetNext($iCurrent) < 0 Then $hWizard.UpdateActionButton + +End + +Private Function ActionPicture_Read() As Picture + + Return $hActionPicture + +End + +Private Sub ActionPicture_Write(Value As Picture) + + $hActionPicture = Value + If GetNext($iCurrent) < 0 Then $hWizard.UpdateActionButton + +End + +Private Function Animated_Read() As Boolean + + Return False + +End + +Private Sub Animated_Write((Value) As Boolean) + + If $bDeprecated Then Return + Error "gb.form: Wizard.Animated is deprecated" + $bDeprecated = True + +End + +Private Function ShowButton_Read() As Boolean + + Return $hWizard.GetShowButton() + +End + +Private Sub ShowButton_Write(Value As Boolean) + + $hWizard.SetShowButton(Value) + +End diff --git a/comp/src/gb.form/.src/Wizard/_WizardContainer.class b/comp/src/gb.form/.src/Wizard/_WizardContainer.class new file mode 100644 index 00000000..794434a0 --- /dev/null +++ b/comp/src/gb.form/.src/Wizard/_WizardContainer.class @@ -0,0 +1,56 @@ +' Gambas class file + +Export + +Inherits UserControl + +Event _Refresh + +Property Text As String +Property Picture As Picture +Property Read Container As Container + +Private $sText As String +Private $hPict As Picture + +Private $hPanel As Panel + +Public Sub _new() + + $hPanel = New Panel(Me) + Me._Container = $hPanel + +End + + +Private Function Text_Read() As String + + Return $sText + +End + +Private Sub Text_Write(sText As String) + + $sText = sText + Raise _Refresh + +End + +Private Function Picture_Read() As Picture + + Return $hPict + +End + +Private Sub Picture_Write(hPict As Picture) + + $hPict = hPict + Raise _Refresh + +End + +Private Function Container_Read() As Container + + Return $hPanel + +End diff --git a/comp/src/gb.form/img/16/cross.png b/comp/src/gb.form/img/16/cross.png new file mode 100644 index 0000000000000000000000000000000000000000..067412e481b34698711e633955a4973589d8cc8b GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx?BpA#)4xIr~OeH~n!3>OyQ~s_4@^n01978y+ zC;#|ApRuFQKFy+L#=`{T!^~xE{C{}tpEz=yU?^&Aa?o7Bw84u(y;$rvLu%PJkZGQ- KelF{r5}E*NYauNF literal 0 HcmV?d00001 diff --git a/comp/src/gb.form/img/32/filter-menu.png b/comp/src/gb.form/img/32/filter-menu.png new file mode 100644 index 0000000000000000000000000000000000000000..cff02f2b29afc498f6f2de91aba7dd771f70187d GIT binary patch literal 533 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyoCO|{#S9F5M?jcysy3fAP;h2| zPl&5~fzO2t7tWkHbN>8!APHo{0Z;@8&Ye4V@!~}w2^0r%FI~C>5xjEc3Q!QphUf({ zjvYJp|Ns9JU;vZ?iUUcY$l0@JPn|jiB!MRE-@hMX&d!}XfeeTVKoSUmT!=*wm2c1Z z`~o`Cs3gcQn4$1p3D^4%b&UxEf0EzqFB3d`N9a(&ztq>#jN&qp{99S~N!(56NW9H` z|84cA<{kC1F$z30{{nSC@pN$vu{eEp^36$24m=F*tc>}w?|;W#zy0rjf3Zl`5reL$ zm!D}av~KY<^!mI1$I5G;bGOf2z4w9RJcB!%r^;6xIeBgU{Qv9N|5mPCxY@gCU)}$@ zQvbP}DcnITUi}N5V$FTRVBnz!`L=Na*22WQ%mvv4FO#pe=Af5mK literal 0 HcmV?d00001 diff --git a/comp/src/gb.form/img/32/filter.png b/comp/src/gb.form/img/32/filter.png new file mode 100644 index 0000000000000000000000000000000000000000..a42251c54fc1672ffe1da59cd9feb39ce2ecd994 GIT binary patch literal 518 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 S-Effr0000tG)ME9YJ$x3 MboFyt=akR{0MW4`hyVZp literal 0 HcmV?d00001 diff --git a/comp/src/gb.form/img/8/new/side-bottom.png b/comp/src/gb.form/img/8/new/side-bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..32d76fa1bf2d0f46518aa6edf4dc24fb7692ba0d GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^93TuL7#^lP3 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form/img/8/new/side-right-void.png b/comp/src/gb.form/img/8/new/side-right-void.png new file mode 100644 index 0000000000000000000000000000000000000000..36273180a7f1b0a103681f256514033284493e12 GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^93TuL7#^lP3~2^kp$B|bhL9-bb9w+zAc9KMXcwecX+JYD@< J);T3K0RV1t8XW)t literal 0 HcmV?d00001 diff --git a/comp/src/gb.form/img/8/new/side-right.png b/comp/src/gb.form/img/8/new/side-right.png new file mode 100644 index 0000000000000000000000000000000000000000..3f7dc8bde06bcf11870df02215df99432e460442 GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^93TuL7#^lP3OHQ}&X>ToywkktYlbE@;_lPt(7+>gHc2jlYt)RyXG@0~zJ%>gTe~ HDWM4f^+O>4 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form/img/8/new/side-top.png b/comp/src/gb.form/img/8/new/side-top.png new file mode 100644 index 0000000000000000000000000000000000000000..b07e035030eba2d9a94af23433cc0158ac97064a GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^93TuL7#^lP3XjCngN*WY^>bP0 Hl+XkKQh*`v literal 0 HcmV?d00001 diff --git a/comp/src/gb.form/img/8/side-bottom-void.png b/comp/src/gb.form/img/8/side-bottom-void.png new file mode 100644 index 0000000000000000000000000000000000000000..99dad4e4df1715e573c183b9ce9eda9f1d572fda GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^93TuL7#^lP3<{9 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form/img/8/side-bottom.png b/comp/src/gb.form/img/8/side-bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..5655a7c21438f5ff39d0648288996424e947ba7d GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^93TuL7#^lP3gTe~ HDWM4fBLyM< literal 0 HcmV?d00001 diff --git a/comp/src/gb.form/img/8/side-left.png b/comp/src/gb.form/img/8/side-left.png new file mode 100644 index 0000000000000000000000000000000000000000..64553493d7143c1050fe8a2de9d77cf910b752bc GIT binary patch literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^93TuL7#^lP3C`5^MYU06b`(87gOX6{|otT^gGR@P~ K&t;ucLK6UqCn9kG literal 0 HcmV?d00001 diff --git a/comp/src/gb.form/img/colormap.png b/comp/src/gb.form/img/colormap.png new file mode 100644 index 0000000000000000000000000000000000000000..aa5e880c2c1cb63661d81da1846fa1e2db7e2ff6 GIT binary patch literal 1440 zcmV;R1z-A!P)G*{&&qoYCR5HM7UpRkAVMt4i2$(wyB|3ohWoV6W zHZTmvZO9UCO04hzjf_NyM_=?QBXBU$2p3+JI6a;jp#d&IJSft!evFaGY6qZ|FOnu! z`cC%46rSiMBh4$((Pmn3W6ETYqErj3$x<@n#1%QLQfRHr7dMPRN{qqC-T`5mnsS5( zcx0qZc#GM*A|1{8SBNp10wb|9OS6kdASe87NR=a3>7Dr^=SW8;R#H${j1>TNr(+~G zL>rh5OJHQ&>5j+HYO`d&8L{#mHdW6YX@xPD7M7hHS}aErE6kf$vac*Iyjxk-vQo70 zy{cM=CJV`tvLOm`wW&uGB$(LBtV6T|QW-##-D`6&k~5W($`t9ev*&sdLq0eI+5maQ z2zRM9gcW~fzL+x-NzJS@f}^(lru?YF>qZ%&wGaq8Ntj;Jgk) zIwpk9NsWxK@>{b?87W6s1cbZpEhI-?4F*26W+VK3jCVOQowa67AomeErZ7KvL)M@{ zE`F1SdNa}sEvPXbAu>|#W=siRwN^YOI%78FNa@O%Ho1?`&{BBS1XXBRclusZ&#lMl zLhIFr=(F`TBM3e)oq4iY&2z-;{Xi#%e4vjkp^wlCK6`PnCPSoxq0{p)2!j#kgR-;R z&}!(Ad5SS_)_tUt2j+h7i|5HmoOE0tVR2zYYjwr{kx(*3pE(lOnY?tzG`;lJ(~y{A zujcRrMM7tPm1aCgp5Nz`8@C=|CCr_42G1RBpgoz~8n?3)YjXbctSIr46duUNUNRw*upCUFSfMa#(l7b9gq z9ZImU$ct4E>iUKVWMevj9l-W_`sGJp~F>CIJH-R&9AAg>)j(FDS4Z@kSXbn}AbckZ|eA8g^;K9*jAzSAk89Y3JYVzD~yYvNbzn+#LeW20dCp z+yE@8HK2kRA*&wZEWfrM0kcFOY;5PX9e_q6r|wjERRw}QiPD!+gV6Yln-N=b>oI=# z^XebNI09UUmLvqh?wo}nez6|6MDzFAN0ONHpb&P3$%=`nlhPn*1(b@?iZ!6rK&fMd u9e!wJcPS>~?yfn?OalcV5-wg3KaStWE4Q8JNC(&e0000O*3_{6@@}D#03#)f zd&6Q>7TVjG`yOkSJ{KB-R~eD`?IFsWSxO64{rDKypT~AmRK(q4lsB>L2=;f&&O}}@ zin|r0D9|jM*?07@)Zcez$}|fJkfoNhW^l?lSj$n%Cct^6*fQM+X`Q~U(1z(Y0ags> xs?t4e+-j$LRda?bF2}rF)D=}rMCpPjPFc4riJTrMXBIL7We#uXJ8d!d te4Fg7Qyr)7WZ4|&iefpL;J|tRI8$~4f9t}l7x#lSdAjEP3gbEkrl87#QmZO)?z~*#vJlo}No^x(vxLmx8hdpoH`mB?HdA{OwVFh? zkKu6)42g)gi@3sruB-?S?A?W43=c_L= z=Hyh>7H|M9{IQ)OJwN}G!p*$N3ioeRr$;yxN=%$`aiIiPg6{PtXR9)K88(z9@0$7X z-7WJ2a|4pq^42$0xUP*n`j^pb{=1I&Z>$!V=30Jb5|Fzq>;HlI$V{Fhu{R9;J&y{R z`%-2I>n~7wJY`P94RiJ%hRP3S|C=Bxe_*No(WguizyANXD9v`~SY8(V_ovBDBgV2_ zFT1sV=cZhBx?cI5F=E#9*}hBdduN<8d4D2_QRnK(&jD*&i?@D1#uShjU(#8!_r;=n z6D=58fBl)bPjcn^1qlo?Q{KzpTh(^TYJ()hDe)Qi-uX@4T~yw%_|5*d$zdA1FTUit zaawuxvNF}}_SVcfmHFwuZ_k*=vaD_BH8IRxw|trSW4vO_f5^j2L>J(R9GGGKF7Y%;pF*g2B_( K&t;ucLK6VHdLqaG literal 0 HcmV?d00001 diff --git a/comp/src/gb.form/img/select.png b/comp/src/gb.form/img/select.png new file mode 100644 index 0000000000000000000000000000000000000000..64726d8e664abc5b7f2132dc40734d3c2e08a174 GIT binary patch literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6EInNuLp07OCrGefVLZbF1iX9s zqGee4-Z(9nl#q~^0mKp#MUoMcMH?>^uuhh&Gxj;=beWxjp<$v(=Eu)TD}jbEc)I$z JtaD0e0syXs9pV50 literal 0 HcmV?d00001 diff --git a/comp/src/gb.form/img/unknown.svg b/comp/src/gb.form/img/unknown.svg new file mode 100644 index 00000000..00fd4ef8 --- /dev/null +++ b/comp/src/gb.form/img/unknown.svg @@ -0,0 +1,72 @@ + + +image/svg+xml + + + + + + + + + + + + + + \ No newline at end of file diff --git a/comp/src/gb.form/img/valuemap.png b/comp/src/gb.form/img/valuemap.png new file mode 100644 index 0000000000000000000000000000000000000000..fe18d6f5f1a7c0b61bfba305972f3a4d6a8edbe8 GIT binary patch literal 897 zcmV-{1AhF8P)Nkl)fF%489F$y81jz_NHC}`5KC!6?6Du} z-WLuh`RJUq!G$tFdQr=U+Y^M*{2cS{);1k;u5^)Wc+?59cga&11Yoz*ZWBm{+X5U) z^-^$BRR%$bfMg&;7m^y80YnW;$DWw_;wgVd5(Que%M^KTzU={kTzWTK{A~|hCM%Lm zDqzySA4~z?*CY8rO>tL?tGV-~!tc2s^b{>o_kh<9R;tn~KT<&9$mO6q}Wgv*Hk^Kifu_Rw8 zMf$m-GKDVDxC4gtw%KW*DQ!8zzO%wzs{eM2Xw&VXX%E2idf=pW{8=^>6DMO|#DIFu zH{LJnzbrw+_~hdr5_l|0kfxPqyU}KeS1n&3gHNaz%C%kV z=R+Nz;x-MH9h7Se%0lHx?&^XhT*P@IMup5^ME!d8sF7_|-Omgu`>v?+)-6f^b~gtfKf zNM8vkOw^QPj4yv5XUcKW@-I|Pr2NZibGdi_xzA&F_pT(n9=UjTQqq0W#&rRR#VUYo zW=rzTM`GFTA0P}ZC}n2Ig%V`Roe}p3stlw_qC_jOi4=V?=mI?z$sh8~oA-uzKg9eK X(W6thuIVgD00000NkvXXu0mjf8ega! literal 0 HcmV?d00001 diff --git a/comp/src/gb.form/map/icon.map b/comp/src/gb.form/map/icon.map new file mode 100644 index 00000000..dc0c6ac5 --- /dev/null +++ b/comp/src/gb.form/map/icon.map @@ -0,0 +1,243 @@ +access preferences/preferences-desktop-accessibility;apps/preferences-desktop-accessibility +add actions/list-add +align-bottom actions/align-vertical-bottom +align-center actions/align-horizontal-center +align-height actions/object-columns +align-left actions/align-horizontal-left +align-middle actions/align-vertical-center +align-right actions/align-horizontal-right +align-top actions/align-vertical-top +align-width actions/object-rows +apply actions/dialog-apply;actions/dialog-ok-apply +archive $(mime)/package-x-generic;apps/utilities-file-archiver +attach status/mail-attachment;actions/mail-attachment +audio $(mime)/audio-x-generic +battery devices/battery +brightness # +blue # +blur # +book [-breeze*]actions/address-book-new;apps/accessories-dictionary +bookmark places/bookmarks;actions/bookmark-new;places/user-bookmarks +bottom actions/go-bottom +c $(mime)/text-x-csrc +calculator apps/accessories-calculator +calendar actions/office-calendar;apps/evolution-calendar;actions/view-pim-calendar +call actions/call-start +camera devices/camera-photo +cancel actions/dialog-cancel +cdrom devices/media-optical +clear actions/edit-clear-locationbar-rtl;actions/edit-clear +clock apps/clock;actions/chronometer +close actions/window-close +color [-breeze*]actions/color-picker-grey;[breeze*]apps/preferences-desktop-color;categories/applications-graphics +color-picker actions/color-picker +component [-breeze*]actions/document-share;categories/applications-utilities;apps/nepomuk +computer devices/computer +connect actions/network-connect +contrast # +copy actions/edit-copy +cpp $(mime)/text-x-c++src +crop actions/image-crop;actions/transform-crop +css $(mime)/text-css +cut actions/edit-cut +database [breeze*]places/network-server-database;apps/office-database +delete actions/edit-delete +desktop places/user-desktop +development categories/applications-development +difference # +directory places/folder +disconnect actions/network-disconnect +down actions/go-down +download [elementary]actions/media-import-audio-cd;emblems/emblem-downloads;actions/edit-download;actions/download +draw-circle actions/draw-circle;tools/draw-ellipse +draw-line actions/draw-line +draw-path actions/draw-path;tools/draw-freehand +draw-rectangle actions/draw-rectangle;tools/draw-rectangle +draw-text actions/draw-text;tools/draw-text +edit actions/document-edit;apps/accessories-text-editor +eject actions/media-eject +end actions/media-skip-forward +erase actions/draw-eraser +error status/dialog-error +exclusive # +exec [breeze*]actions/run-build;actions/system-run +file [-breeze*]actions/document-new;$(mime)/empty;$(mime)/application-x-zerosize +file-manager [-breeze*]apps/toolbar/system-file-manager;apps/system-file-manager +fill actions/color-fill;tools/color-fill +filter actions/view-filter +find actions/edit-find +first actions/go-first +flag actions/flag-red +flip-h actions/object-flip-horizontal +flip-v actions/object-flip-vertical +floppy devices/media-floppy +font [-breeze*]actions/format-text-superscript;apps/preferences-desktop-font +forward actions/media-seek-forward +fullscreen actions/view-fullscreen +gambas # +game categories/applications-games;apps/preferences-desktop-gaming +gamma # +gnu # +green # +grid actions/view-grid;actions/games-config-board +group [-breeze*]actions/user-group-new;apps/system-users +h $(mime)/text-x-chdr +halt actions/process-stop +harddisk devices/drive-harddisk +hardware devices/audio-card +help [breeze*]apps/system-help;apps/help-browser +home actions/go-home +html $(mime)/text-html +hue # +identity apps/user-info;preferences/preferences-desktop-user;apps/preferences-desktop-user +image $(mime)/image-x-generic +important emblems/emblem-important +indent actions/format-indent-more +info status/dialog-information +insert-image actions/insert-image +insert-link actions/insert-link +insert-text actions/insert-text +internet [-breeze*]places/folder-html;categories/applications-internet +intersection # +js $(mime)/application-javascript +jump actions/go-jump +key [breeze*]$(mime)/application-pgp-keys;apps/password-manager;apps/keyring-manager;actions/pgp-keys +keyboard preferences/preferences-desktop-keyboard;apps/preferences-desktop-keyboard +lamp actions/help-hint +language [-breeze*]actions/im-google-talk;apps/preferences-desktop-locale +last actions/go-last +layout actions/document-page-setup +left actions/go-previous +lightness # +link emblems/emblem-symbolic-link +linux # +lock actions/object-locked;status/object-locked +lower actions/object-ordre-lower +mail apps/evolution-mail;actions/mail-mark-unread +make actions/arrow-down +make-all actions/arrow-down-double +media-player devices/multimedia-player +menu apps/alacarte;apps/kmenuedit;actions/application-menu +microphone devices/audio-input-microphone +monitor [-breeze*]actions/view-statistics;apps/utilities-system-monitor +mouse devices/input-mouse +multimedia categories/applications-multimedia +muted status/audio-volume-muted +network status/network-connect;places/network-workgroup +new actions/document-new +new-dir actions/folder-new +new-tab actions/tab-new +new-tag actions/tag-new +new-window actions/window-new +next actions/go-next;actions/go-next-view +office [elementary]categories/applications-other;categories/applications-office +ok actions/dialog-ok +opacity # +open actions/document-open +open-recent actions/document-open-recent +options [breeze*]actions/configure-shortcuts;categories/preferences-system;actions/configure +package apps/system-software-install;apps/preferences-desktop-default-applications +paste actions/edit-paste +pause actions/media-playback-pause +pda devices/pda +pdf $(mime)/application-pdf +pen actions/draw-freehand +people [breeze*]actions/user-group-new;apps/system-users +phone [-breeze*]devices/smartphone;devices/phone +play actions/media-playback-start +plugin [breeze*]preferences/preferences-plugin;[breeze*]apps/preferences-plugin;categories/applications-puzzles;apps/preferences-system-sharing +preview actions/document-print-preview +previous actions/go-previous;actions/go-previous-view +print actions/document-print +printer devices/printer +program $(mime)/application-x-executable +properties actions/document-properties +question status/dialog-question;actions/svn-status +quit actions/application-exit +raise actions/object-ordre-raise +recent [breeze*]actions/appointment-new;actions/document-open-recent +record actions/media-record +red # +redo actions/edit-redo +refresh actions/view-refresh +remove actions/list-remove +rename actions/edit-rename +replace actions/edit-find-replace +resize actions/transform-scale +revert actions/document-revert +rewind actions/media-seek-backward +right actions/go-next +rotate actions/transform-rotate +rotate-left actions/object-rotate-left +rotate-right actions/object-rotate-right +saturation # +save actions/document-save +save-as actions/document-save-as +scanner [breeze*]devices/scanner;devices/scanner +science categories/applications-science +screen devices/video-display +script $(mime)/text-x-script +security status/security-medium +select actions/select-rectangular +select-all actions/edit-select-all +server [breeze*!16]places/server-database;places/network-server +share actions/document-share;actions/send-to +shortcut apps/accessories-character-map +sort-ascent actions/view-sort-ascending +sort-descent actions/view-sort-descending +spell-check actions/tools-check-spelling +star [breeze*]actions/draw-star;status/starred +start actions/media-skip-backward +stop actions/media-playback-stop +sun status/weather-clear +system devices/computer +table [breeze*]actions/table +tablet devices/input-tablet +tag actions/tag +terminal apps/utilities-terminal +text $(mime)/text-x-generic;$(mime)/text-plain +text-baseline actions/format-align-vertical-baseline +text-bold actions/format-text-bold +text-bottom actions/format-align-vertical-bottom +text-center actions/format-justify-center +text-fill actions/format-justify-fill +text-italic actions/format-text-italic +text-left actions/format-justify-left +text-lower actions/format-text-lowercase +text-middle actions/format-align-vertical-center +text-right actions/format-justify-right +text-strike actions/format-text-strikethrough +text-top actions/format-align-vertical-top +text-underline actions/format-text-underline +text-upper actions/format-text-uppercase +tools [elementary]categories/applications-developmenent;[breeze*]categories/applications-system;actions/applications-system;categories/applications-system +top actions/go-top +transparency # +trash [breeze*!16]places/user-trash;places/user-trash +undo actions/edit-undo +unindent actions/format-indent-less +union # +unlock actions/object-unlocked +unselect actions/edit-select-none +up actions/go-up +upload [breeze*]actions/cloud-upload +user [breeze*]actions/user-identity;stock/stock_person;status/avatar-default +vector $(mime)/image-x-svg+xml;$(mime)/x-office-drawing +video $(mime)/video-x-generic +view-detail actions/view-list-details +view-icon actions/view-list-icons +view-normal actions/view-close +view-split-h actions/view-split-left-right +view-split-v actions/view-split-top-bottom +view-tree actions/view-list-tree +volume status/audio-volume-high +vpn devices/network-vpn +warning status/dialog-warning +watch [breeze*]actions/visibility;apps/strigi +webcam devices/camera-web +wifi devices/network-wireless +wizard actions/tools-wizard +zoom-fit actions/zoom-fit-best +zoom-in actions/zoom-in +zoom-normal actions/zoom-original +zoom-out actions/zoom-out diff --git a/comp/src/gb.form/stock/16/gambas.png b/comp/src/gb.form/stock/16/gambas.png new file mode 100644 index 0000000000000000000000000000000000000000..4e0e18e82e5a729e39e6fae281953dc1436cd644 GIT binary patch literal 489 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMffdHQnS0Js^vQw*JrzRL_G(s6F z4cj0hnhm?O8g^)c&`yPh{SXFB3Zz)0VHcdM(Xc}UBmy%H!e|BR-31ohr3o`1s0Czc zBS7rHRpr|^GR@DoOg?*_W6J5zm(F}hxHk7=>!dWhZQK7!?tkf(dFp^>mA(4+UExP;&Y3HQk_d(Mk@Ok;6c^J0y;^7WWo7-lng5>tx;g1iN=>~@y-qFTN_O#ztk2z2Ku0ooy85}Sb4q9e02Ke% ALI3~& literal 0 HcmV?d00001 diff --git a/comp/src/gb.form/stock/16/gnu.png b/comp/src/gb.form/stock/16/gnu.png new file mode 100644 index 0000000000000000000000000000000000000000..b8ff1b85b7436f3f2af50beb0658721b9390a972 GIT binary patch literal 360 zcmV-u0hj)XP)14YOaQxMc!6d_145Olcla&c&qh6HV@21h61+*K&uomv9H z2BF{}5eI1zJMt~`e%Jx0-{U(S?cxum~TFo|<90)YY`Oh%YU;v>pv8y4x4$8=BRFKuH?4eV) z3}Vg;4Ew0T9T5+-`Xz2$(mkS*c2zC>dj)r*F75KRZ_dB;l}?o@Kc=|=0000MoRSc_4fDo`1twq^Yr$oF7Wa4`msFv`ucl( zeY(55!N9)q^Yi+)MER~bl9QA#F*DuX-?)rSeSUxWt~dC)QYtGf($m!4-QD!{_VTMe z*riU~*V6gYq3!PP_rZbps4v2=oc5?Pnu~qvs8qDHv+C*S^sio+0#R zuduhcxIaTjLPbf}#<)jHP3Egt;HFmMUX@S)001|1QchC<76P9XBlifT7v;WD{#@rr z@d7&U0Zl%sQ~n?Gb;17e%l=B3xltPe3-zO%DwG1NkjZiZk=GK;`rH5j0HaAnK~xyi zV_<*)6MY60plhaOpouJ?my(`pj4YrXmz-pXETEH-8E=X#V3ZJ>CWpiqlTVBZkrIIO zIr)8UY;0V)7-0e&_D)t-R_<=hP(C}GgSol6zqzL%6GVW8*U`=@7$;XHW_RP#3G<# zh!zm3+rCAkZ4bm3469ZFMSu=gY1pO(R-@Db^x$@|EXWrS1eAg}45Sz&xI?1}qz0@E zW^7h(=bW6M?$*$T20hM?wvRRXo|P-)wy0rn|S0mKS{zkzzdfG#Tu@(X6r zop|NT1nqqGX@4iPr9a!Zi#7iG^n!oKABFcnfBW{27E{}Lp$;q0k3Dh+nyv;vwXuD7 zfhG0*C*HbyDj)g+qE>j^5EOnK!F(r_FYG6O(Dp^QAAZfqd-tRLre)gRbE`|Ze3tbt z|15uAa<|Saqoj}BT^mJDE!o-N{xW$fFv<%(T^vI!PM;0F?sUjOz@{ZaNlEbFjX>qF zt|So`k&S^(tb)52B^`}>_xmpQ^tNYb*}p5!oI7*(-kfg&zuXg7ZoZWhw(OpR*@_h# zJC7D^I9ukMU$~-5JM8dD%^d01K?&B^Se-q$vzKdpJ^8ODJ-pmszhPh9p-OfJz944j zFN%zh6Yp~z2wZUN*vT~ED+Zi5`k5ryor4*c2UfUES^aZmqSyx+!vr6>Z5~tP(&tGf zZE{q&()4eKp}y%3g-+$&0vsIORfmPH3d?y+o6NFq%`4vQ(Arw(b3a0?<{G|;T$yzu zaq^8NqT9~!SZ3WYyI6kc$^>)6H%hUyxvFOcl@o+GV+DY z)J+akuWa1W@MaQ2pV(K?#+{d*sWE5%j5^JoQX6uK!#eZI*|kQ}Sybs z<$3bciz(@!H8bYCcs`52BqYo2-tVLf@%QWQb?vxz?)#DT-`l)vcbuyH_xW_wKdXI= Yb5i#46nJi{07gH9r>mdKI;Vst0C8xm?*IS* literal 0 HcmV?d00001 diff --git a/comp/src/gb.form/stock/32/gnu.png b/comp/src/gb.form/stock/32/gnu.png new file mode 100644 index 0000000000000000000000000000000000000000..a51c90c0299112d15874fdf8b6b125319e9e82a7 GIT binary patch literal 1022 zcmVkdg000BUNkl5P}v!)%Y9lrGTPFYEv9wZ664dwt(d0aBGI z@{(kvO;{bfoe*h+fqv9q!5=n87om zE1j{P6w*vTc|fCU^|MDH9CR>NmrSoUT!n7kaz>h|-aYomrwlg3V>+GbI;VtVSLvzb z&M-}$v&t;x$!u%2TkdnOM`Y8gO|;h`l`5@NZnC`&IpXKomQ@Tf)l;Uc$?MizolajD z+iQ$=#A1`|^0gc#9T4BA4q>qFoWrK+wk0-a?fo=p^p-{i13lydSJ`Hh zA@25q;b}njQojYKx7w*yUrr(k0d_H_QEYT3|EjL*z~Llw4jfYyEDn#pyEDu2E%Dw2>CL zJtmWG(du#=jL@pp^WM})ADyP^vd$=GsPdlhu7$R1*DC}q7PwxmDS8{PkAhG1H#r!q z+cqCL;A;&o5X>{lmqIw~{16lj4U%(R;Yy9l6g=bxqeAeyaL9U%t`0qGG20N&`^?+L zRXH=5Wx4GJ28CdSEvAHEx*y!GPP3}eQ$EP`E;7w^MS^QWFwR(KWJtY7HD&pOnhcc> z89@l@ELD-^Rh}#2WyP$?9VUmMQu9$XcT_B~-8ZoxQZmnLMf`A@n5L!E@V;R-rl!4w=U#c$}!@LDS^ z(W*V28yj?_(N6EtLr-J`X{0*0Ipl*_lSULZnX}(ZlHb)i7#l#n&q{2nMCTWq5Zq{J z5os_o%L*a5!kkiX$d#~ltH2v(7m;>jvOxz(XBq0FQlBg(_`*5FFY;-A*4CvXO@&lQ z!{z;IN-079_(SYUOX@qsF>4KFw2ak4}UA5^w$u0d}UE*nzE@Q)}#lXw%m7 z3`QuN;Prp8%Q81**<4HIR0d^QtkC8@vrb~LCjg@}&DDCrix$ddc#Bg{>d+^F2B{A6 zp0U+;MJb)F;a?Jj;u;M1&07*qoM6N<$g59kA?EnA( literal 0 HcmV?d00001 diff --git a/comp/src/gb.form/stock/32/linux.png b/comp/src/gb.form/stock/32/linux.png new file mode 100644 index 0000000000000000000000000000000000000000..4817bf274906f838a97240ce4f96f30c017b8ce4 GIT binary patch literal 1446 zcmV;X1zGxuP)f3NBFu_9v&VX z9v&bd9v>ec9UUF|x=z-OB2iIM&4(pBz+7@! zHYzGL9632IF*GJADk&>0D=jZ7EG_xGRV^D-H#$8)L^wM;Jv~9gl2SQ7J~uu-I6FSGw6pc~_V)Jo^Yrxi`1tzz z`uX|!_xJep^!4-e^YQZY_N6QLsWAGpKl!ja@bU6ML`e9oHTkbOLPkkHLPqzhGW+}c zEiW+d@bUGbCibQ*^Yird_4WL?NGvWeDl9H3D=aZHHTkbQ?(gvG>g!5OPWGiN^`a*H zxkja?r~157Iy*ckDJn8AE8gGW^7Hh0dV8Ckor;Q!?CtL9>g$7qh4-m3#>U57TwEa{ zBJ-*`_^LC{&(EfGE$zUJl7Mgasy6eWCg0%T`rg6cnKI+v*xk2|`s2v)y?OeyKVnry z`n5%SUNhUFM(?;;`0CjwC@A;#^!NAoyu7_YG&VTo<>o|2M}~-r>+9^>+}$!Y zH@>^LVPa(Jz?s;WIO5vV<=)slK0x!MH#a&w*Vx*-yu3?JQR?UAo0N^ezrgdPJo&Oh zhKGlWZAjbO+T`Tq?!}?^s4rb#VPa4}=(1yceSVUYlxJyb`msFhzJj-zbJW$<_oy)Q zwr}mQVe~)SssI20Z*)>lQvf9b&nE)~0RaR#2>cBj0-h8^_4)``Jfw^Lg6z3skax`1 zZW{0k`o-`f<%v6X$udxrO8l|?bPD_U2UrFC(-;X@=`c^ysEhYQ@1X@&r0005eNklh03S zAHIp;QjnSV`|GcF?|+Eo;82i~_2y^Ig#TZ1vvDX$xW8n{-%tNuKFPo?&mVi|-s9IF zUp#%3hTWe5fwvYucsOa|qRENz*yII+FI{V!cynUg!n?Qqc(GUz*?*(077XV1_j_Vm z62)`%as>p;xppWfQ);ee(fq^I>tXCV~Knc36hiYm_?)O&qV z85neRb#*T2?RDcswIQr;USU2AlpXHtb8$pb;Nv@c{<#7eI5>0GEN5;M1zz44&Yw9@ z3IY31?mKqe-WExkiOapa`}CnnMG&y})QKZ|>}-$}=veNou0FbJad` + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + diff --git a/comp/src/gb.form/stock/scalable/gnu.svg b/comp/src/gb.form/stock/scalable/gnu.svg new file mode 100644 index 00000000..06403cb7 --- /dev/null +++ b/comp/src/gb.form/stock/scalable/gnu.svg @@ -0,0 +1,94 @@ + + + + + + + + + image/svg+xml + + + + + Aurelio A. Hecker <aurium@gmail.com> + + + GNU Head + + + + + + + + + + + + + + + + + + + + + diff --git a/comp/src/gb.form/stock/scalable/linux.svg b/comp/src/gb.form/stock/scalable/linux.svg new file mode 100644 index 00000000..c5b6c74f --- /dev/null +++ b/comp/src/gb.form/stock/scalable/linux.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/comp/src/gb.gui.base/.component b/comp/src/gb.gui.base/.component new file mode 100644 index 00000000..dc5c666c --- /dev/null +++ b/comp/src/gb.gui.base/.component @@ -0,0 +1,5 @@ +[Component] +Key=gb.gui.base +Version=3.15.90 +Hidden=True +Needs=Form diff --git a/comp/src/gb.gui.base/.directory b/comp/src/gb.gui.base/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/comp/src/gb.gui.base/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/comp/src/gb.gui.base/.icon.png b/comp/src/gb.gui.base/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..eedc7d8863854cb8646b25127e14db92ddf35ed5 GIT binary patch literal 10933 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

        \n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Common controls and classes for GUI components" +msgstr "" + +#: FMessage.form:48 +msgid "Copy message" +msgstr "Nachricht kopieren" + +#: FMessage.class:23 Message.class:33 +msgid "OK" +msgstr "OK" + +#: Main.module:55 +msgid "&1 B" +msgstr "" + +#: Main.module:57 +msgid "&1 KiB" +msgstr "" + +#: Main.module:59 +msgid "&1 MiB" +msgstr "" + +#: Main.module:61 +msgid "&1 GiB" +msgstr "" + diff --git a/comp/src/gb.gui.base/.lang/es.po b/comp/src/gb.gui.base/.lang/es.po new file mode 100644 index 00000000..6cb0c361 --- /dev/null +++ b/comp/src/gb.gui.base/.lang/es.po @@ -0,0 +1,40 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.gui.base 3.14.90\n" +"PO-Revision-Date: 2020-06-06 17:05 UTC\n" +"Last-Translator: Benoît Minisini \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Common controls and classes for GUI components" +msgstr "" + +# gb-ignore +#: FMessage.class:23 Message.class:33 +msgid "OK" +msgstr "" + +#: FMessage.form:48 +msgid "Copy message" +msgstr "Copiar mensaje" + +#: Main.module:55 +msgid "&1 B" +msgstr "" + +#: Main.module:57 +msgid "&1 KiB" +msgstr "" + +#: Main.module:59 +msgid "&1 MiB" +msgstr "" + +#: Main.module:61 +msgid "&1 GiB" +msgstr "" + diff --git a/comp/src/gb.gui.base/.lang/fr.po b/comp/src/gb.gui.base/.lang/fr.po new file mode 100644 index 00000000..f25099e0 --- /dev/null +++ b/comp/src/gb.gui.base/.lang/fr.po @@ -0,0 +1,224 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.gui.base 3.14.90\n" +"POT-Creation-Date: 2020-06-06 17:05 UTC\n" +"PO-Revision-Date: 2020-06-06 17:03 UTC\n" +"Last-Translator: Benoît Minisini \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Common controls and classes for GUI components" +msgstr "" + +#: FGridView.form:34 FListBox.form:28 FTreeView.form:57 +msgid "Border" +msgstr "" + +#: FGridView.form:40 +msgid "Drag me" +msgstr "" + +#: FGridView.form:46 +msgid "Selection" +msgstr "" + +#: FGridView.form:69 FTestCombo.form:101 +msgid "TextBox1" +msgstr "" + +#: FGridView.form:76 +msgid "TextArea1" +msgstr "" + +#: FListBox.form:16 FTestCombo.form:33 +msgid "Élément 1" +msgstr "" + +#: FListBox.form:16 FTestCombo.form:33 +msgid "Élément 2" +msgstr "" + +#: FListBox.form:16 FTestCombo.form:33 +msgid "Élément 3" +msgstr "" + +#: FListBox.form:16 FTestCombo.form:33 +msgid "Élément 4" +msgstr "" + +#: FListBox.form:16 FTestCombo.form:33 +msgid "Élément 5" +msgstr "" + +#: FListBox.form:16 +msgid "Élément 6" +msgstr "" + +#: FListBox.form:16 +msgid "Élément 7" +msgstr "" + +#: FListBox.form:23 FProgressBar.form:20 FTestCombo.form:27 +msgid "Button1" +msgstr "" + +#: FMessage.class:23 Message.class:33 +msgid "OK" +msgstr "OK" + +#: FMessage.form:48 +msgid "Copy message" +msgstr "Copier le message" + +#: FScrollArea.form:71 +msgid "Button" +msgstr "" + +#: FTestCombo.form:34 +msgid "dhdgfhdfghdf" +msgstr "" + +#: FTestCombo.form:44 +msgid "fdsgsdg" +msgstr "" + +#: FTestCombo.form:49 +msgid "trytryertyter" +msgstr "" + +#: FTestCombo.form:64 +msgid "2" +msgstr "" + +#: FTestCombo.form:71 +msgid "bxvcbxcbc" +msgstr "" + +#: FTestCombo.form:83 +msgid "Frame" +msgstr "" + +#: FTestCombo.form:87 +msgid "tyrtyrty" +msgstr "" + +#: FTestCombo.form:96 +msgid "1" +msgstr "" + +#: FTestCombo.form:106 +msgid "Normal quoi" +msgstr "" + +#: FTestCombo.form:111 +msgid "3" +msgstr "" + +#: FTestCombo.form:117 +msgid "Index" +msgstr "" + +#: FTestFileView.form:22 +msgid "Toggle view" +msgstr "" + +#: FTestMouseWheel.form:29 +msgid "" +"vfdg\n" +"df\n" +"gd\n" +"fsgsdfgsdf\n" +"gd\n" +"fg\n" +"dsfg\n" +"dsf\n" +"gs\n" +"dfg\n" +"sdf\n" +"g\n" +"sdf" +msgstr "" + +#: FTreeView.form:27 +msgid "Menu1" +msgstr "" + +#: FTreeView.form:31 +msgid "Menu2" +msgstr "" + +#: FTreeView.form:35 +msgid "Menu3" +msgstr "" + +#: FTreeView.form:39 +msgid "Menu4" +msgstr "" + +#: FTreeView.form:43 +msgid "Menu5" +msgstr "" + +#: FTreeView.form:52 +msgid "Delete" +msgstr "" + +#: FTreeView.form:62 +msgid "Drag" +msgstr "" + +#: FTreeView.form:67 +msgid "Reparent" +msgstr "" + +#: FTreeView.form:72 +msgid "Rename" +msgstr "" + +#: FTreeView.form:77 +msgid "Check" +msgstr "" + +#: FileView.class:131 +msgid "Name" +msgstr "" + +#: FileView.class:133 +msgid "Size" +msgstr "" + +#: FileView.class:135 +msgid "Last modified" +msgstr "" + +#: FileView.class:1062 +msgid "Cannot rename file." +msgstr "" + +#: Help.module:71 +msgid "A file or directory name cannot be void." +msgstr "" + +#: Help.module:72 +msgid "The '/' character is forbidden inside file or directory names." +msgstr "" + +#: Main.module:55 +msgid "&1 B" +msgstr "" + +#: Main.module:57 +msgid "&1 KiB" +msgstr "" + +#: Main.module:59 +msgid "&1 MiB" +msgstr "" + +#: Main.module:61 +msgid "&1 GiB" +msgstr "" diff --git a/comp/src/gb.gui.base/.project b/comp/src/gb.gui.base/.project new file mode 100644 index 00000000..211195c8 --- /dev/null +++ b/comp/src/gb.gui.base/.project @@ -0,0 +1,15 @@ +# Gambas Project File 3.0 +Title=Common controls and classes for GUI components +Startup=TestMessage +Version=3.15.90 +VersionFile=1 +Component=gb.image +Component=gb.gui +Arguments=[["-style=oxygen"],["-style=qtcurve"]] +Environment="GB_JIT_DEBUG=1\nGB_GUI=gb.gtk3\nLIBOVERLAY_SCROLLBAR=0" +TabSize=2 +Translate=1 +Language=en +Type=Component +Packager=1 +DoNotTranslate=".src/Test" diff --git a/comp/src/gb.gui.base/.src/Action.class b/comp/src/gb.gui.base/.src/Action.class new file mode 100644 index 00000000..8810d101 --- /dev/null +++ b/comp/src/gb.gui.base/.src/Action.class @@ -0,0 +1,549 @@ +' Gambas class file + +Export + +Static Private $aVoid As New Object[] +Static Private $cControls As New Collection(gb.IgnoreCase) +Static Private $cLock As New Collection +Static Private $iGlobalLock As Integer + +Static Property Read Keys As String[] + +Property Enabled As Boolean +Property Visible As Boolean +Property Tooltip As String +Property Text As String +Property Picture As Picture +Property Value As Boolean +Property Shortcut As String +Property Read HasShortcut As Boolean +Property Read Controls As Object[] +'Property Icon As Picture + +Private $sKey As String +Private $aKey As String[] +Private $hParent As Control + +Static Private Sub IsToggle(hCtrl As Object) As Boolean + + If hCtrl Is Menu And If hCtrl.Toggle Then Return True + If hCtrl Is ToggleButton Then Return True + If hCtrl Is ToolButton And If hCtrl.Toggle Then Return True + If hCtrl Is Window Then Return True + If hCtrl Is CheckBox Then Return True + If Object.Type(hCtrl) = "SidePanel" Then Return True + If Object.Type(hCtrl) = "ToolBar" Then Return True + +End + +Static Private Sub GetToggle(hCtrl As Object) As Boolean + + If hCtrl Is Menu And If hCtrl.Toggle Then Return hCtrl.Checked + If hCtrl Is ToggleButton Then Return hCtrl.Value + If hCtrl Is ToolButton And If hCtrl.Toggle Then Return hCtrl.Value + If hCtrl Is Window Then Return hCtrl.Visible + If hCtrl Is CheckBox Then Return hCtrl.Value = CheckBox.True + If Object.Type(hCtrl) = "SidePanel" Then Return Not hCtrl.Hidden + If Object.Type(hCtrl) = "ToolBar" Then Return Not hCtrl.Hidden + +End + +Static Private Sub SetToggle(hCtrl As Object, bVal As Boolean) + + If hCtrl Is Menu And If hCtrl.Toggle Then + hCtrl.Checked = bVal + Else If hCtrl Is ToggleButton Then + hCtrl.Value = bVal + Else If hCtrl Is ToolButton And If hCtrl.Toggle Then + hCtrl.Value = bVal + Else If hCtrl Is Window Then + hCtrl.Visible = bVal + Else If hCtrl Is CheckBox Then + hCtrl.Value = bVal + Else If Object.Type(hCtrl) = "SidePanel" Then + hCtrl.Hidden = Not bVal + Else If Object.Type(hCtrl) = "ToolBar" Then + hCtrl.Hidden = Not bVal + Endif + +End + +Static Private Sub HasHandler(hForm As Object) As Boolean + + Dim bHasHandler As Boolean + + Try bHasHandler = Object.Class(hForm)["Action_Activate"].Type + Return bHasHandler + +End + +Static Private Sub GetHandleWindow(hCtrl As Object) As Window + + Dim hCtrlWin As Window = hCtrl.Window + + 'RETURN hForm + + Do + If HasHandler(hCtrlWin) Then Break + Try hCtrlWin = hCtrlWin.Parent.Window + If Error Then Break + Loop + + Return hCtrlWin + +End + +Static Private Sub GetActiveWindow(hCtrl As Object) As Window + + Dim hForm As Window = Application.ActiveWindow + Dim hCtrlWin As Window + + 'RETURN hForm + + hCtrlWin = GetHandleWindow(hCtrl) + + While hForm + If hForm = hCtrlWin Then Return Application.ActiveWindow + Try hForm = hForm.Parent.Window + If Error Then Break + Wend + + Return hCtrl.Window + +End + +Static Public Sub _Register(Control As Object, Old As String, (Key) As String) + + Dim aCtrl As Object[] + + If Not $cControls Then Return + If Old = Key Then Return + + If Old Then + aCtrl = $cControls[Old] + aCtrl.Remove(aCtrl.Find(Control)) + Endif + + If Key Then + + If Not $cControls.Exist(Key) Then + $cControls[Key] = New Object[] + Endif + + aCtrl = $cControls[Key] + aCtrl.Add(Control) + + Endif + +End + +Static Public Sub Lock() + + Inc $iGlobalLock + +End + +Static Public Sub Unlock() + + $iGlobalLock = Max(0, $iGlobalLock - 1) + +End + +Static Public Sub IsLocked() As Boolean + + Return $iGlobalLock + +End + + +Static Public Sub Raise(Control As Object) + + Dim hForm As Control + Dim hObject As Object + Dim sKey As String + Dim bCont As Boolean + Dim hLock As Integer[] + + If $iGlobalLock Then Return + If Not Object.IsValid(Control) Then + Error "gb.gui: warning: cannot raise action: invalid control: "; Control + Error "gb.gui: "; System.Backtrace.Join("\n") + Return + Endif + + sKey = Control.Action + 'DEBUG Control;; sKey + If Not sKey Then Return + + If $cLock.Exist(sKey) Then + If Object.Count($cLock[sKey]) = 2 Then + 'DEBUG sKey;; "is locked" + Return + Endif + 'DEBUG sKey;; Object.Count($cLock[sKey]) + Endif + + hLock = New Integer[] + $cLock[sKey] = hLock + + If IsToggle(Control) Then + If Left(sKey) = "." Then + Action[sKey, Object.Parent(Control)].Value = GetToggle(Control) + Else + Action[sKey].Value = GetToggle(Control) + Endif + Endif + + hForm = GetActiveWindow(Control) + 'DEBUG "Active: ";; hForm;; Application.ActiveWindow + + If hForm Then + + While hForm + + If Not Object.IsValid(hForm) Then Break + If Object.IsLocked(hForm) Then Break + + If hForm Is Window Then + hObject = hForm + If HasHandler(hObject) Then + bCont = False + bCont = hObject.Action_Activate(sKey) + If Not bCont Then Break + Endif + Endif + + hForm = hForm.Parent + Wend + + Endif + + $cLock[sKey] = Null + +' FINALLY +' +' $cLock[sKey] = NULL +' +' CATCH +' +' DEBUG "******* "; Error.Where; ": "; Error.Text +' Error.Propagate + +End + +Static Public Sub _get((Key) As String, Optional Parent As Control) As Action ', OPTIONAL Window AS Window) AS Action + + Dim hAction As Action + + 'IF Left(Key) = "." AND IF NOT Parent THEN Error.Raise("Parent must be specified for a local action") + + hAction = New Action(Key, Parent) + Return hAction + +End + +' Static Private Sub IsChildOfWindow(hWindow As Window, hMain As Window) As Boolean +' +' Do +' If hWindow = hMain Then Return True +' Try hWindow = hWindow.Parent.Window +' If Error Then Return +' Loop +' +' End + +Static Private Sub FindKey(sPattern As String) As String[] + + Dim aKey As New String[] + Dim aCtrl As Object[] + Dim sKey As String + + For Each aCtrl In $cControls + sKey = $cControls.Key + If sKey Like sPattern Then aKey.Add(sKey) + Next + + Return aKey + +End + +Private Function GetControls() As Object[] + + Dim aObj As Object[] + Dim aObj2 As Object[] + Dim hCtrl As Object + Dim iInd As Integer + Dim sKey As String + + If $aKey Then + + aObj2 = New Object[] + + For Each sKey In $aKey + + Try aObj = $cControls[sKey] + If Not aObj Then Continue + + If Not $hParent Then + aObj2.Insert(aObj) + Else + For Each hCtrl In aObj + If Object.Parent(hCtrl) = $hParent Then + aObj2.Add(hCtrl) + Endif + Next + Endif + + Next + + aObj = aObj2 + + Else If $sKey Then + + Try aObj = $cControls[$sKey] + If Not aObj Then Return $aVoid + + If $hParent Then + + aObj2 = New Object[] + For Each hCtrl In aObj + If Object.Parent(hCtrl) = $hParent Then + aObj2.Add(hCtrl) + Endif + Next + + aObj = aObj2 + + Endif + + Else + + Return $aVoid + + Endif + + iInd = 0 + While iInd < aObj.Count + If Object.IsValid(aObj[iInd]) Then + Inc iInd + Else + aObj.Remove(iInd) + Endif + Wend + + Return aObj + +End + +Public Sub _new((Key) As String, Parent As Control) + + Dim sKey As String + + If InStr(Key, ",") = 0 And InStr(Key, "*") = 0 Then + $sKey = Key + Else + $aKey = New String[] + For Each sKey In Split(Key, ",") + If Right(sKey) = "*" Then + $aKey.Insert(FindKey(sKey)) + Else + $aKey.Add(sKey) + Endif + Next + Endif + + $hParent = Parent + +End + +Private Function Enabled_Read() As Boolean + + Dim hCtrl As Object + + For Each hCtrl In GetControls() + If Not hCtrl.Enabled Then Return False + Next + Return True + +End + +Private Sub Enabled_Write(Value As Boolean) + + Dim hCtrl As Object + + For Each hCtrl In GetControls() + hCtrl.Enabled = Value + Next + +End + +Private Function Visible_Read() As Boolean + + Dim hCtrl As Object + + For Each hCtrl In GetControls() + If Not hCtrl.Visible Then Return False + Next + Return True + +End + +Private Sub Visible_Write(Value As Boolean) + + Dim hCtrl As Object + + For Each hCtrl In GetControls() + hCtrl.Visible = Value + Next + +End + +Private Function Tooltip_Read() As String + + Dim hCtrl As Object + + For Each hCtrl In GetControls() + If hCtrl.Tooltip Then Return hCtrl.Tooltip + Next + +End + +Private Sub Tooltip_Write(Value As String) + + Dim hCtrl As Object + + For Each hCtrl In GetControls() + Try hCtrl.Tooltip = Value + Next + +End + +Private Function Text_Read() As String + + Dim hCtrl As Object + Dim sText As String + + For Each hCtrl In GetControls() + Try sText = hCtrl.Text + If sText Then Return sText + Next + +End + +Private Sub Text_Write(Value As String) + + Dim hCtrl As Object + + For Each hCtrl In GetControls() + Try hCtrl.Text = Value + Next + +End + +Private Function Picture_Read() As Picture + + Dim hCtrl As Object + Dim hPict As Picture + + For Each hCtrl In GetControls() + Try hPict = hCtrl.Picture + If hPict Then Return hPict + Next + +End + +Private Sub Picture_Write(Value As Picture) + + Dim hCtrl As Object + + For Each hCtrl In GetControls() + Try hCtrl.Picture = Value + Next + +End + +Private Function Value_Read() As Boolean + + Dim hCtrl As Object + + 'Debug $sKey + + For Each hCtrl In GetControls() + 'Debug hCtrl.Name;; Object.Type(hCtrl) + If IsToggle(hCtrl) Then + 'Debug "-->";; GetToggle(hCtrl) + Return GetToggle(hCtrl) + Endif + Next + +End + +Private Sub Value_Write(Value As Boolean) + + Dim hCtrl As Object + Dim aCtrl As Object[] = GetControls() + Dim cKey As New Collection + + For Each hCtrl In aCtrl + 'Debug hCtrl;; Value + If IsToggle(hCtrl) Then + SetToggle(hCtrl, Value) + Else + cKey[hCtrl.Action] = hCtrl + Endif + Next + + For Each hCtrl In cKey + Action.Raise(hCtrl) + Next + +End + +Private Function Shortcut_Read() As String + + Dim hCtrl As Object + + For Each hCtrl In GetControls() + If hCtrl Is Menu Then Return hCtrl.Shortcut + Next + + +End + +Private Sub Shortcut_Write(Value As String) + + Dim hCtrl As Object + + For Each hCtrl In GetControls() + If hCtrl Is Menu Then hCtrl.Shortcut = Value + Next + +End + +Private Function Controls_Read() As Object[] + + Return GetControls() + +End + +Static Private Function Keys_Read() As String[] + + Dim aKeys As New String[] + + For Each $cControls + aKeys.Add($cControls.Key) + Next + + Return aKeys + +End + +Private Function HasShortcut_Read() As Boolean + + Dim hCtrl As Object + + For Each hCtrl In GetControls() + If hCtrl Is Menu Then Return True + Next + +End diff --git a/comp/src/gb.gui.base/.src/Border.class b/comp/src/gb.gui.base/.src/Border.class new file mode 100644 index 00000000..889b64ba --- /dev/null +++ b/comp/src/gb.gui.base/.src/Border.class @@ -0,0 +1,861 @@ +' Gambas class file + +Export + +Public Enum Solid = 1, Dotted = 2, Dashed = 3, Double = 16 + +Property Width As Single +Property Radius As Single +Property Style As Integer +Property Color As Integer +Property Padding As Single +Property Margin As Single + +Public LeftStyle As Byte = Solid +Public RightStyle As Byte = Solid +Public TopStyle As Byte = Solid +Public BottomStyle As Byte = Solid + +Public LeftWidth As Single = 1 +Public RightWidth As Single = 1 +Public TopWidth As Single = 1 +Public BottomWidth As Single = 1 + +Public LeftColor As Integer +Public RightColor As Integer +Public TopColor As Integer +Public BottomColor As Integer + +Public TopLeftRadius As Single +Public TopRightRadius As Single +Public BottomLeftRadius As Single +Public BottomRightRadius As Single + +Public LeftPadding As Single +Public RightPadding As Single +Public TopPadding As Single +Public BottomPadding As Single + +Public LeftMargin As Single +Public RightMargin As Single +Public TopMargin As Single +Public BottomMargin As Single + +Public SlashStyle As Byte +Public BackslashStyle As Byte +Public SlashColor As Integer +Public BackslashColor As Integer +Public SlashWidth As Single +Public BackslashWidth As Single + +Static Private $aProp As String[] = ["width", "color", "radius", "style", "padding", "margin", "slash"] + +Private Const CURVE_MUL As Single = 0.44771525 + +Private Function Width_Read() As Single + + Return LeftWidth + +End + +Private Sub Width_Write(Value As Single) + + LeftWidth = Value + RightWidth = Value + TopWidth = Value + BottomWidth = Value + +End + +Private Function Radius_Read() As Single + + Return TopLeftRadius + +End + +Private Sub Radius_Write(Value As Single) + + TopLeftRadius = Value + TopRightRadius = Value + BottomLeftRadius = Value + BottomRightRadius = Value + +End + +Private Function Style_Read() As Integer + + Return LeftStyle + +End + +Private Sub Style_Write(Value As Integer) + + LeftStyle = Value + RightStyle = Value + TopStyle = Value + BottomStyle = value + +End + +Private Function Color_Read() As Integer + + Return LeftColor + +End + +Private Sub Color_Write(Value As Integer) + + LeftColor = Value + RightColor = value + TopColor = Value + BottomColor = value + +End + +Private Sub GetRectF(hRect As RectF, bPadding As Boolean, TopBorder As Border, BottomBorder As Border, LeftBorder As Border, RightBorder As Border) As RectF + + Dim LM, RM, TM, BM As Single + + LM = LeftMargin + If LeftBorder Then LM = Max(LM, LeftBorder.RightMargin) / 2 + RM = RightMargin + If RightBorder Then RM = Max(RM, RightBorder.LeftMargin) / 2 + TM = TopMargin + If TopBorder Then TM = Max(TM, TopBorder.BottomMargin) / 2 + BM = BottomMargin + If BottomBorder Then BM = Max(BM, BottomBorder.TopMargin) / 2 + + hRect = hRect.Copy() + hRect.Adjust(LM, TM, RM, BM) + If bPadding Then hRect.Adjust(LeftPadding + LeftWidth, TopPadding + TopWidth, RightPadding + RightWidth, BottomPadding + BottomWidth) + + Return hRect + +End + + +Public Sub Paint((Rect) As RectF, Optional TopBorder As Border, BottomBorder As Border, LeftBorder As Border, RightBorder As Border) + + Dim fWidth As Single + Dim iStyle As Integer + Dim iColor As Integer + Dim F As Single + Dim F2 As Single + Dim bTop As Boolean + Dim bRight As Boolean + Dim bLeft As Boolean + Dim bBottom As Boolean + Dim bSlash As Boolean + Dim bBackslash As Boolean + Dim X, Y, Width, Height As Single + Dim X1, Y1, X2, Y2 As Single + Dim iClip As Integer + + Rect = GetRectF(Rect, False, TopBorder, BottomBorder, LeftBorder, RightBorder) + If Rect.IsVoid() Then Return + + X = Rect.X + Y = Rect.Y + Width = Rect.W + Height = Rect.H + + Paint.Save + Paint.LineCap = Paint.LineCapSquare + + If TopStyle And If TopWidth Then bTop = True + If BottomStyle And If BottomWidth Then bBottom = True + If RightStyle And If RightWidth Then bRight = True + If LeftStyle And If LeftWidth Then bLeft = True + If SlashStyle And If SlashWidth Then bSlash = True + If BackslashStyle And If BackslashWidth Then bBackslash = True + + If bTop Then + + If TopStyle = LeftStyle And If TopStyle = RightStyle And If TopStyle = BottomStyle Then + If TopColor = LeftColor And If TopColor = RightColor And If TopColor = BottomColor Then + If TopWidth = LeftWidth And If TopWidth = RightWidth And If TopWidth = BottomWidth Then + + iStyle = TopStyle + fWidth = TopWidth + iColor = TopColor + + GoSub DRAW_BORDER + + Paint.Restore + Return + + Endif + Endif + Endif + + Paint.Save + + iClip = 0 + If bLeft And If TopLeftRadius > TopWidth Then iClip += 1 + If bRight And If TopRightRadius > TopWidth Then iClip += 2 + + Select Case iClip + + Case 0 + Paint.Rectangle(X, Y, Width, TopWidth) + + Case 1 + Paint.MoveTo(X, Y) + 'Print "MoveTo:";; X;; Y + Paint.LineTo(X + Width / 2, Y + Width / 2) + 'Print "LineTo:";; X + Width / 2;; Y + Width / 2 + Paint.LineTo(X + Width / 2, Y + TopWidth) + 'Print "LineTo:";; X + Width / 2;; Y + TopWidth + Paint.LineTo(X + Width, Y + TopWidth) + 'Print "LineTo:";; X + Width;; Y + TopWidth + Paint.LineTo(X + Width, Y) + 'Print "LineTo:";; X + Width;; Y + Paint.LineTo(X, Y) + 'Print "LineTo:";; X;; Y + + Case 2 + Paint.MoveTo(X, Y) + Paint.LineTo(X + Width, Y) + Paint.LineTo(X + Width / 2, Y + Width / 2) + Paint.LineTo(X + Width / 2, Y + TopWidth) + Paint.LineTo(X, Y + TopWidth) + Paint.ClosePath + + Case 3 + Paint.MoveTo(X, Y) + Paint.LineTo(X + Width, Y) + Paint.LineTo(X + Width / 2, Y + Width / 2) + Paint.ClosePath + + End Select + + Paint.Clip + + Paint.Rectangle(X, Y, Width, Height - TopWidth) + Paint.Clip + + GoSub CLIP_BORDER + + iStyle = TopStyle + fWidth = TopWidth + iColor = TopColor + + GoSub DRAW_BORDER + + Paint.Restore + + Endif + + If bRight Then + + Paint.Save + + iClip = 0 + If bTop And If TopRightRadius > RightWidth Then iClip += 1 + If bBottom And If BottomRightRadius > RightWidth Then iClip += 2 + + Select Case iClip + + Case 0 + Paint.Rectangle(X + Width - RightWidth, Y, RightWidth, Height) + + Case 1 + Paint.MoveTo(X + Width, Y) + Paint.LineTo(X + Width - Height / 2, Y + Height / 2) + Paint.LineTo(X + Width - RightWidth, Y + Height / 2) + Paint.LineTo(X + Width - RightWidth, Y + Height) + Paint.LineTo(X + Width, Y + Height) + Paint.ClosePath + + Case 2 + Paint.MoveTo(X + Width, Y) + Paint.LineTo(X + Width, Y + Height) + Paint.LineTo(X + Width - Height / 2, Y + Height / 2) + Paint.LineTo(X + Width - RightWidth, Y + Height / 2) + Paint.LineTo(X + Width - RightWidth, Y) + Paint.ClosePath + + Case 3 + Paint.MoveTo(X + Width, Y) + Paint.LineTo(X + Width - Height / 2, Y + Height / 2) + Paint.LineTo(X + Width, Y + Height) + Paint.ClosePath + + End Select + + ' If bTop And If TopRightRadius > RightWidth Then + ' Paint.MoveTo(X + Width - Height / 2, Y + Height / 2) + ' Paint.LineTo(X + Width, Y) + ' Paint.LineTo(X + Width, Y + Height / 2) + ' Paint.ClosePath + ' Else + ' Paint.Rectangle(X + Width - RightWidth, Y, RightWidth, Height / 2) + ' Endif + ' + ' If bBottom And If BottomRightRadius > RightWidth Then + ' Paint.MoveTo(X + Width - Height / 2, Y + Height / 2) + ' Paint.LineTo(X + Width, Y + Height) + ' Paint.LineTo(X + Width, Y + Height / 2) + ' Paint.ClosePath + ' Else + ' Paint.Rectangle(X + Width - RightWidth, Y + Height / 2, RightWidth, Height / 2) + ' Endif + + Paint.Clip + + Paint.Rectangle(X + RightWidth, Y, Width - RightWidth, Height) + Paint.Clip + + GoSub CLIP_BORDER + + iStyle = RightStyle + fWidth = RightWidth + iColor = RightColor + + GoSub DRAW_BORDER + + Paint.Restore + + Endif + + If bBottom Then + + Paint.Save + + iClip = 0 + If bLeft And If BottomLeftRadius > BottomWidth Then Inc iClip + If bRight And If BottomRightRadius > BottomWidth Then iClip += 2 + + Select Case iClip + + Case 0 + Paint.Rectangle(X, Y + Height - BottomWidth, Width, BottomWidth) + + Case 1 + Paint.MoveTo(X, Y + Height) + Paint.LineTo(X + Width / 2, Y + Height - Width / 2) + Paint.LineTo(X + Width / 2, Y + Height - BottomWidth) + Paint.LineTo(X + Width, Y + Height - BottomWidth) + Paint.LineTo(X + Width, Y + Height) + Paint.ClosePath + + Case 2 + Paint.MoveTo(X, Y + Height) + Paint.LineTo(X + Width, Y + Height) + Paint.LineTo(X + Width / 2, Y + Height - Width / 2) + Paint.LineTo(X + Width / 2, Y + Height - BottomWidth) + Paint.LineTo(X, Y + Height - BottomWidth) + Paint.ClosePath + + Case 3 + Paint.MoveTo(X, Y + Height) + Paint.LineTo(X + Width / 2, Y + Height - Width / 2) + Paint.LineTo(X + Width, Y + Height) + Paint.ClosePath + + End Select + + ' If bLeft And If BottomLeftRadius > BottomWidth Then + ' Paint.MoveTo(X + Width / 2, Y + Height - Width / 2) + ' Paint.LineTo(X + Width / 2, Y + Height) + ' Paint.LineTo(X, Y + Height) + ' Paint.ClosePath + ' Else + ' Paint.Rectangle(X, Y + Height - BottomWidth, Width / 2, BottomWidth) + ' Endif + ' + ' If bRight And If BottomRightRadius > BottomWidth Then + ' Paint.MoveTo(X + Width / 2, Y + Height - Width / 2) + ' Paint.LineTo(X + Width / 2, Y + Height) + ' Paint.LineTo(X + Width, Y + Height) + ' Paint.ClosePath + ' Else + ' Paint.Rectangle(X + Width / 2, Y + Height - BottomWidth, Width / 2, BottomWidth) + ' Endif + + Paint.Clip + + Paint.Rectangle(X, Y + BottomWidth, Width, Height - BottomWidth) + Paint.Clip + + GoSub CLIP_BORDER + + iStyle = BottomStyle + fWidth = BottomWidth + iColor = BottomColor + + GoSub DRAW_BORDER + + Paint.Restore + + Endif + + If bLeft Then + + Paint.Save + + iClip = 0 + If bTop And If TopLeftRadius > LeftWidth Then Inc iClip + If bBottom And If BottomLeftRadius > LeftWidth Then iClip += 2 + + Select Case iClip + + Case 0 + Paint.Rectangle(X, Y, LeftWidth, Height) + + Case 1 + Paint.MoveTo(X, Y) + Paint.LineTo(X + Height / 2, Y + Height / 2) + Paint.LineTo(X + LeftWidth, Y + Height / 2) + Paint.LineTo(X + LeftWidth, Y + Height) + Paint.LineTo(X, Y + Height) + Paint.ClosePath + + Case 2 + Paint.MoveTo(X, Y) + Paint.LineTo(X, Y + Height) + Paint.LineTo(X + LeftWidth, Y + Height) + Paint.LineTo(X + LeftWidth, Y + Height / 2) + Paint.LineTo(X + Height / 2, Y + Height / 2) + Paint.ClosePath + + Case 3 + Paint.MoveTo(X, Y) + Paint.LineTo(X + Height / 2, Y + Height / 2) + Paint.LineTo(X, Y + Height) + Paint.ClosePath + + End Select + + ' If bTop And If TopLeftRadius > LeftWidth Then + ' Paint.MoveTo(X + Height / 2, Y + Height / 2) + ' Paint.LineTo(X, Y) + ' Paint.LineTo(X, Y + Height / 2) + ' Paint.ClosePath + ' Else + ' Paint.Rectangle(X, Y, LeftWidth, Height / 2) + ' Endif + ' + ' If bBottom And If BottomLeftRadius > LeftWidth Then + ' Paint.MoveTo(X + Height / 2, Y + Height / 2) + ' Paint.LineTo(X, Y + Height) + ' Paint.LineTo(X, Y + Height / 2) + ' Paint.ClosePath + ' Else + ' Paint.Rectangle(X, Y + Height / 2, LeftWidth, Height / 2) + ' Endif + + Paint.Clip + + Paint.Rectangle(X, Y, Width - LeftWidth, Height) + Paint.Clip + + GoSub CLIP_BORDER + + iStyle = LeftStyle + fWidth = LeftWidth + iColor = LeftColor + + GoSub DRAW_BORDER + + Paint.Restore + + Endif + + If bSlash Or If bBackslash Then + + Paint.Save + + PaintRoundRectangle(X, Y, Width, Height, TopLeftRadius, TopRightRadius, BottomLeftRadius, BottomRightRadius, True) + + If bSlash Then + + X1 = X + Y1 = Y + Height + X2 = X + Width + Y2 = Y + + iStyle = SlashStyle + fWidth = SlashWidth + iColor = SlashColor + + GoSub DRAW_LINE + + Endif + + If bBackslash Then + + X1 = X + Y1 = Y + X2 = X + Width + Y2 = Y + Height + + iStyle = BackslashStyle + fWidth = BackslashWidth + iColor = BackslashColor + + GoSub DRAW_LINE + + Endif + + Paint.Restore + + Endif + + Paint.Restore + Return + +CLIP_BORDER: + + PaintRoundRectangle(X, Y, Width, Height, TopLeftRadius, TopRightRadius, BottomLeftRadius, BottomRightRadius, True) + Return + +INIT_STYLE: + + Paint.Background = iColor + + Select Case iStyle And 15 + Case Dotted + Paint.Dash = [0, 2] + Case Dashed + Paint.Dash = [3, 2] + Case Else + Paint.Dash = Null + End Select + + If iStyle And Double Then + + F = fWidth / 3 + F2 = F / 2 + + Else + + F = fWidth + F2 = F / 2 + + Endif + + Paint.LineWidth = F + + Return + +DRAW_BORDER: + + GoSub INIT_STYLE + + If iStyle And Double Then + + PaintRoundRectangle(X + F2, Y + F2, Width - F, Height - F, TopLeftRadius - F2, TopRightRadius - F2, BottomLeftRadius - F2, BottomRightRadius - F2) + Paint.Stroke + + PaintRoundRectangle(X + F * 2 + F2, Y + F * 2 + F2, Width - F * 5, Height - F * 5, TopLeftRadius - F2 - F * 2, TopRightRadius - F2 - F * 2, BottomLeftRadius - F2 - F * 2, BottomRightRadius - F2 - F * 2) + Paint.Stroke + + Else + + PaintRoundRectangle(X + F2, Y + F2, Width - F, Height - F, TopLeftRadius - F2, TopRightRadius - F2, BottomLeftRadius - F2, BottomRightRadius - F2) + Paint.Stroke + + Endif + + Return + +DRAW_LINE: + + GoSub INIT_STYLE + + If iStyle And Double Then + + Paint.MoveTo(X1 - F - F2, Y1) + Paint.LineTo(X2 - F - F2, Y2) + Paint.Stroke + + Paint.MoveTo(X1, Y1 - F - F2) + Paint.LineTo(X2, Y2 - F - F2) + Paint.Stroke + + Else + + Paint.MoveTo(X1, Y1) + Paint.LineTo(X2, Y2) + Paint.Stroke + + Endif + + Return + +End + +Private Sub ConvertToRect(hRect As RectF) As Rect + + Dim X, Y, W, H As Integer + + X = CInt(Ceil(hRect.X)) + Y = CInt(Ceil(hRect.Y)) + W = CInt(Floor(hRect.Right)) - X + H = CInt(Floor(hRect.Bottom)) - Y + + If W <= 0 Or If H <= 0 Then Return + + Return Rect(X, Y, W, H) + +End + + +Public Sub GetRect((Rect) As RectF, Optional WithPadding As Boolean, Optional TopBorder As Border, BottomBorder As Border, LeftBorder As Border, RightBorder As Border) As Rect + + Rect = GetRectF({Rect}, WithPadding, TopBorder, BottomBorder, LeftBorder, RightBorder) + If Rect.IsVoid() Then Return + + Return ConvertToRect(Rect) + +End + + +Public Sub Clip((Rect) As RectF, Optional TopBorder As Border, BottomBorder As Border, LeftBorder As Border, RightBorder As Border) As Rect + + Rect = GetRectF(Rect, False, TopBorder, BottomBorder, LeftBorder, RightBorder) + If Rect.IsVoid() Then Return Null + + PaintRoundRectangle(Rect.X, Rect.Y, Rect.Width, Rect.Height, TopLeftRadius, TopRightRadius, BottomLeftRadius, BottomRightRadius, True) + + Return ConvertToRect(Rect) + +End + + +Private Sub PaintRoundRectangle(X As Single, Y As Single, W As Single, H As Single, TL As Single, TR As Single, BL As Single, BR As Single, Optional bClip As Boolean) + + 'Paint.Debug = True + + If W <= 0 Or If H <= 0 Then + If bClip Then + Paint.Rectangle(X, Y, 0, 0) + Paint.Clip + Endif + 'Paint.Debug = False + Return + Endif + + TL = Max(0, Min(TL, Min(W, H) / 2)) + TR = Max(0, Min(TR, Min(W, H) / 2)) + BL = Max(0, Min(BL, Min(W, H) / 2)) + BR = Max(0, Min(BR, Min(W, H) / 2)) + + If TL <= 0 And If TR <= 0 And If BL <= 0 And If BR <= 0 Then + If bClip Then + Paint.Rectangle(X, Y, W, H) + Else + Paint.MoveTo(X, Y) + Paint.LineTo(X + W, Y) + Paint.MoveTo(X, Y) + Paint.LineTo(X, Y + H) + Paint.MoveTo(X + W, Y) + Paint.LineTo(X + W, Y + H) + Paint.MoveTo(X, Y + H) + Paint.LineTo(X + W, Y + H) + Endif + Else + ' PAINT->MoveTo(THIS, x + r, y); + ' PAINT->LineTo(THIS, x + w - r, y); + ' PAINT->CurveTo(THIS, x + w - r2, y, x + w, y + r2, x + w, y + r); + ' PAINT->LineTo(THIS, x + w, y + h - r); + ' PAINT->CurveTo(THIS, x + w, y + h - r2, x + w - r2, y + h, x + w - r, y + h); + ' PAINT->LineTo(THIS, x + r, y + h); + ' PAINT->CurveTo(THIS, x + r2, y + h, x, y + h - r2, x, y + h - r); + ' PAINT->LineTo(THIS, x, y + r); + ' PAINT->CurveTo(THIS, x, y + r2, x + r2, y, x + r, y); + ' + + Paint.MoveTo(X + TL, Y) + Paint.LineTo(X + W - TR, Y) + If TR > 0 Then Paint.CurveTo(X + W - TR * CURVE_MUL, Y, X + W, Y + TR * CURVE_MUL, X + W, Y + TR) + Paint.LineTo(X + W, Y + H - BR) + If BR > 0 Then Paint.CurveTo(X + W, Y + H - BR * CURVE_MUL, X + W - BR * CURVE_MUL, Y + H, X + W - BR, Y + H) + Paint.LineTo(X + BL, Y + H) + If BL > 0 Then Paint.CurveTo(X + BL * CURVE_MUL, Y + H, X, Y + H - BL * CURVE_MUL, X, Y + H - BL) + Paint.LineTo(X, Y + TL) + If TL > 0 Then Paint.CurveTo(X, Y + TL * CURVE_MUL, X + TL * CURVE_MUL, Y, X + TL, Y) + Paint.LineTo(X + TL, Y) + Endif + + If bClip Then Paint.Clip + + 'Paint.Debug = False + +End + +Private Function Padding_Read() As Single + + Return LeftPadding + +End + +Private Sub Padding_Write(Value As Single) + + LeftPadding = Value + RightPadding = Value + TopPadding = Value + BottomPadding = Value + +End + +Private Sub SetProperty(sProp As String, sValue As String) + + Dim vValue As Variant + Dim aValue As String[] + + aValue = Split(sValue, " ") + If aValue.Count >= 2 Then + If Not $aProp.Exist(sProp) Then Return + If aValue.Count < 3 Then aValue.Add(aValue[0]) + If aValue.Count < 4 Then aValue.Add(aValue[1]) + SetProperty("top" & sProp, aValue[0]) + SetProperty("right" & sProp, aValue[1]) + SetProperty("bottom" & sProp, aValue[2]) + SetProperty("left" & sProp, aValue[3]) + Return + Endif + + If sProp Ends "style" Then + Try vValue = Classes["Border"][Replace(sValue, "-", "")].Value + Else If sProp Ends "color" Then + Try vValue = Object.GetProperty(Classes["Color"], Replace(sValue, "-", "")) + If Left(sValue) = "#" Then + Try vValue = Val("&H" & Mid$(sValue, 2) & "&") + Endif + Else + Try vValue = CSingle(sValue) + Endif + If Error Then Return + + Try Object.SetProperty(Me, sProp, vValue) + +End + +Private Sub NormalyzeOneStyle(ByRef iStyle As Byte, ByRef fWidth As Single) + + If iStyle Then + If fWidth = 0 Then fWidth = 1 + Else + fWidth = 0 + Endif + +End + + +Private Sub NormalizeStyle() + + NormalyzeOneStyle(ByRef LeftStyle, ByRef LeftWidth) + NormalyzeOneStyle(ByRef RightStyle, ByRef RightWidth) + NormalyzeOneStyle(ByRef TopStyle, ByRef TopWidth) + NormalyzeOneStyle(ByRef BottomStyle, ByRef BottomWidth) + NormalyzeOneStyle(ByRef SlashStyle, ByRef SlashWidth) + NormalyzeOneStyle(ByRef BackslashStyle, ByRef BackslashWidth) + +End + +Static Public Sub _call(Optional (Style) As String) As Border + + Return New Border(Style) + +End + + +Public Sub _new(Optional (Style) As String) + + Dim aStyle As String[] + Dim sStyle As String + Dim iPos As Integer + Dim sProp As String + Dim sValue As String + + If Style Then + + aStyle = Split(Style, ";", "", True) + + For Each sStyle In aStyle + + iPos = InStr(sStyle, ":") + If iPos = 0 Then Continue + sProp = Replace(LCase(Trim(Left(sStyle, iPos - 1))), "-", "") + sValue = Trim(Mid$(sStyle, iPos + 1)) + If Not sProp Then Continue + If Not sValue Then Continue + + SetProperty(sProp, sValue) + + Next + + NormalizeStyle + + Endif + +End + +Private Function Margin_Read() As Single + + Return LeftMargin + +End + +Private Sub Margin_Write(Value As Single) + + LeftMargin = Value + RightMargin = Value + TopMargin = Value + BottomMargin = Value + +End + +Public Sub Copy() As Border + + Dim hBorder As New Border + + With hBorder + .BottomColor = BottomColor + .BottomLeftRadius = BottomLeftRadius + .BottomMargin = BottomMargin + .BottomPadding = BottomPadding + .BottomRightRadius = BottomRightRadius + .BottomStyle = BottomStyle + .BottomWidth = BottomWidth + .LeftColor = LeftColor + .LeftMargin = LeftMargin + .LeftPadding = LeftPadding + .LeftStyle = LeftStyle + .LeftWidth = LeftWidth + .RightColor = RightColor + .RightMargin = RightMargin + .RightPadding = RightPadding + .RightStyle = RightStyle + .RightWidth = RightWidth + .TopColor = TopColor + .TopLeftRadius = TopLeftRadius + .TopMargin = TopMargin + .TopPadding = TopPadding + .TopRightRadius = TopRightRadius + .TopStyle = TopStyle + .TopWidth = TopWidth + .SlashColor = SlashColor + .SlashStyle = SlashStyle + .SlashWidth = SlashWidth + .BackslashColor = BackslashColor + .BackslashStyle = BackslashStyle + .BackslashWidth = BackslashWidth + End With + + Return hBorder + +End + +Public Sub IsVoid() As Boolean + + If TopStyle And If TopWidth Then Return + If BottomStyle And If BottomWidth Then Return + If LeftStyle And If LeftWidth Then Return + If RightStyle And If RightWidth Then Return + + Return True + +End diff --git a/comp/src/gb.gui.base/.src/Draw.module b/comp/src/gb.gui.base/.src/Draw.module new file mode 100644 index 00000000..419c3933 --- /dev/null +++ b/comp/src/gb.gui.base/.src/Draw.module @@ -0,0 +1,674 @@ +' Gambas module file + +Export + +' +' GB_STATIC_METHOD("Push", NULL, CDRAW_push, NULL), +' GB_STATIC_METHOD("Pop", NULL, CDRAW_pop, NULL), +' + +Public Const Normal As Integer = 0 +Public Const Disabled As Integer = 1 +Public Const Focus As Integer = 2 +Public Const Hover As Integer = 4 + +Property Read Clip As _Draw_Clip +Property Read Style As _Draw_Style + +Property Read Device As Object +Property Read Width, W As Integer +Property Read Height, H As Integer +Property ClipRect As Rect +Property Background As Integer +Property Foreground As Integer +Property Invert As Boolean +Property Transparent As Boolean +Property Font As Font +Property LineWidth As Integer +Property LineStyle As Integer +Property FillColor As Integer +Property FillStyle As Integer +Property FillX As Integer +Property FillY As Integer + +Public Struct DrawInfo + Foreground As Integer + Background As Integer + Transparent As Boolean + LineStyle As Integer + Stack As DrawInfo[] + FillColor As Integer + FillStyle As Integer + ClipRect As Rect +End Struct + +Private Enum DRAW_CIRCLE, DRAW_ELLIPSE, DRAW_ARC + +Private $hPattern As New Image[15] + +Public Sub _GetInfo() As DrawInfo + + Dim hInfo As DrawInfo = Paint._Tag + + If Not hInfo Then + hInfo = New DrawInfo + hInfo.Foreground = Color.Foreground + Try hInfo.Foreground = Paint.Device.Foreground + hInfo.LineStyle = Line.Solid + hInfo.FillStyle = Fill.None + hInfo.ClipRect = Paint.ClipRect + Paint._Tag = hInfo + Endif + + Return hInfo + +End + +Private Sub GetStrokeOffset() As Float + + 'Paint.Antialias = False + Return If(Paint.AntiAlias, 0, -0.5) + +End + + +Public Sub Begin(Device As Object) + + Paint.Begin(Device) + Paint.LineWidth = 1 + Paint.AntiAlias = False + Paint.LineCap = Paint.LineCapButt + Paint.LineJoin = Paint.LineJoinRound + +End + +Public Sub End() + + Paint.AntiAlias = True + Paint.End + +End + +Public Sub Save() + + Dim hInfo As DrawInfo = _GetInfo() + Dim hSave As DrawInfo + + Paint.Save + + If Not hInfo.Stack Then hInfo.Stack = New DrawInfo[] + hSave = New DrawInfo + hSave.Foreground = hInfo.Foreground + hSave.Background = hInfo.Background + hSave.Transparent = hInfo.Transparent + hSave.LineStyle = hInfo.LineStyle + hSave.FillColor = hInfo.FillColor + hSave.FillStyle = hInfo.FillStyle + If hInfo.ClipRect Then hSave.ClipRect = hInfo.ClipRect.Copy() + hInfo.Stack.Push(hSave) + +End + +Public Sub Restore() + + Dim hInfo As DrawInfo = _GetInfo() + Dim hSave As DrawInfo + + Paint.Restore + + hSave = hInfo.Stack.Pop() + Draw.Foreground = hSave.Foreground + Draw.Background = hSave.Background + Draw.Transparent = hSave.Transparent + Draw.LineStyle = hSave.LineStyle + Draw.FillColor = hSave.FillColor + Draw.FillStyle = hSave.FillStyle + Draw.ClipRect = hSave.ClipRect + +End + +Private Function Device_Read() As Object + + Return Paint.Device + +End + +Private Function Width_Read() As Integer + + Return Paint.Width + +End + +Private Function Height_Read() As Integer + + Return Paint.Height + +End + + +Private Function ClipRect_Read() As Rect + + Try Return _GetInfo().ClipRect.Copy() + +End + +Private Sub ClipRect_Write(Value As Rect) + + If Value Then + _GetInfo().ClipRect = Value.Copy() + Else + _GetInfo().ClipRect = Null + Endif + + Paint.ClipRect = Value + +End + + +Private Function Background_Read() As Integer + + Return _GetInfo().Background + +End + +Private Sub Background_Write(Value As Integer) + + _GetInfo().Background = Value + Paint.Background = Value + +End + +Private Function Foreground_Read() As Integer + + Return _GetInfo().Foreground + +End + +Private Sub Foreground_Write(Value As Integer) + + _GetInfo().Foreground = Value + +End + + +Private Function Invert_Read() As Boolean + + Return Paint._Invert + +End + +Private Sub Invert_Write(Value As Boolean) + + Paint._Invert = Value + +End + +Private Function Transparent_Read() As Boolean + + Return _GetInfo().Transparent + +End + +Private Sub Transparent_Write(Value As Boolean) + + _GetInfo().Transparent = Value + +End + +Private Function Font_Read() As Font + + Return Paint.Font + +End + +Private Sub Font_Write(Value As Font) + + Paint.Font = Value + +End + +Private Function LineWidth_Read() As Integer + + Return Paint.LineWidth + +End + +Private Sub LineWidth_Write(Value As Integer) + + Paint.LineWidth = Value + +End + +Private Function LineStyle_Read() As Integer + + Return _GetInfo().LineStyle + +End + +Private Sub LineStyle_Write(Value As Integer) + + Select Case Value + Case Line.None + + Case Line.Solid + Paint.Dash = Null + Case Line.Dash + Paint.Dash = [3, 2] + Case Line.Dot + Paint.Dash = [1, 2] + Case Line.DashDot + Paint.Dash = [3, 2, 1, 2] + Case Line.DashDotDot + Paint.Dash = [3, 2, 1, 2, 1, 2] + Default + Return + End Select + + _GetInfo().LineStyle = Value + +End + +Private Function FillColor_Read() As Integer + + Return _GetInfo().FillColor + +End + +Private Sub FillColor_Write(Value As Integer) + + _GetInfo().FillColor = Value + +End + +Public Sub Clear() + + Dim iColor As Integer + + Try iColor = Paint.Device.Background + If Error Then iColor = Color.White + Paint.FillRect(0, 0, Paint.W, Paint.H, iColor) + +End + +' Private Sub GetBackground() As Integer +' +' Dim iBg As Integer = _GetInfo().Background +' +' If iBg = Color.Default Then +' Try iBg = Paint.Device.Background +' If Error Then iBg = Color.White +' Endif +' +' Return iBg +' +' End + +Private Sub GetForeground() As Integer + + Dim iFg As Integer = _GetInfo().Foreground + + If iFg = Color.Default Then + Try iFg = Paint.Device.Foreground + If iFg = Color.Default Then iFg = Color.TextForeground + Endif + + Return iFg + +End + +Public Sub Point(X As Integer, Y As Integer) + + Paint.FillRect(X, Y, 1, 1, GetForeground()) + +End + +Public Sub Line(X1 As Integer, Y1 As Integer, X2 As Integer, Y2 As Integer) + + Dim fOffset As Float + Dim hBrush As PaintBrush + Dim LW As Float + Dim iStyle As Integer = LineStyle_Read() + + If iStyle = Line.None Then Return + + If iStyle = Line.Solid Then + If X1 = X2 Then + LW = Paint.LineWidth + If Y2 < Y1 Then Swap Y1, Y2 + Paint.FillRect(X1 - Int(LW / 2), Y1, LW, Y2 - Y1 + 1, GetForeground()) + Return + Else If Y1 = Y2 Then + LW = Paint.LineWidth + If X2 < X1 Then Swap X1, X2 + Paint.FillRect(X1, Y1 - Int(LW / 2), X2 - X1 + 1, LW, GetForeground()) + Return + Endif + Endif + + hBrush = Paint.Brush + Paint.Background = GetForeground() + fOffset = GetStrokeOffset() + Paint.MoveTo(X1 + fOffset, Y1 + fOffset) + Paint.LineTo(X2 + fOffset, Y2 + fOffset) + Paint.Stroke + Paint.Brush = hBrush + +End + +Private Sub HasFillStyle(hInfo As DrawInfo) As Boolean + + Dim hImage As Image + + Select Case hInfo.FillStyle + + Case Fill.None + Return False + + Case Fill.Solid + Paint.Background = hInfo.FillColor + + Case Fill.Dense94 To Fill.CrossDiagonal + If IsNull($hPattern[hInfo.FillStyle]) Then $hPattern[hInfo.FillStyle] = Image.Load("pattern/" & hInfo.FillStyle & ".png") + hImage = $hPattern[hInfo.FillStyle].Copy() + If hInfo.Transparent Then hImage.Replace(Color.White, Color.Transparent) + hImage.Replace(Color.Black, hInfo.FillColor) + Paint.Brush = Paint.Image(hImage) + + Default + Return + + End Select + + Return True + +End + +Public Sub Rect(X As Integer, Y As Integer, Width As Integer, Height As Integer) + + Dim hInfo As DrawInfo = _GetInfo() + Dim iBg As Integer + + If HasFillStyle(hInfo) Then + Paint.Rectangle(X, Y, Width, Height) + Paint.Fill + Endif + + If hInfo.LineStyle Then + iBg = GetForeground() + Paint.FillRect(X, Y, Width, 1, iBg) + Paint.FillRect(X, Y + Height - 1, Width, 1, iBg) + If Height > 2 Then + Paint.FillRect(X, Y + 1, 1, Height - 2, iBg) + Paint.FillRect(X + Width - 1, Y + 1, 1, Height - 2, iBg) + Endif + Endif + +End + +Public Sub FillRect(X As Integer, Y As Integer, Width As Integer, Height As Integer, (Color) As Integer) + + Dim hBrush As PaintBrush = Paint.Brush + Paint.Background = Color + Paint.Rectangle(X, Y, Width, Height) + Paint.Fill + Paint.Brush = hBrush + 'Paint.FillRect(X, Y, Width, Height, Color) + +End + +Private Function FillStyle_Read() As Integer + + Return _GetInfo().FillStyle + +End + +Private Sub FillStyle_Write(Value As Integer) + + _GetInfo().FillStyle = Value + +End + +Private Function FillX_Read() As Integer + + Return Paint.BrushOrigin.X + +End + +Private Sub FillX_Write(Value As Integer) + + Dim hPoint As PointF = Paint.BrushOrigin + + hPoint.X = Value + Paint.BrushOrigin = hPoint + +End + +Private Function FillY_Read() As Integer + + Return Paint.BrushOrigin.Y + +End + +Private Sub FillY_Write(Value As Integer) + + Dim hPoint As PointF = Paint.BrushOrigin + + hPoint.Y = Value + Paint.BrushOrigin = hPoint + +End + +Private Sub DrawEllipse(iAction As Integer, X As Float, Y As Float, W As Float, H As Float, Start As Float, ({End}) As Float) + + Dim hInfo As DrawInfo + 'Dim Angle As Float + Dim fOffset As Float + + If W <= 0 Or If H <= 0 Then Return + + hInfo = _GetInfo() + + If Start = 0 And If {End} = 0 Then + Paint.Ellipse(X, Y, W - 1, H - 1, 0, Pi(2), False) + Else + Paint.Ellipse(X, Y, W - 1, H - 1, Start, {End} - Start, True) + Endif + + If iAction <> DRAW_ARC And If HasFillStyle(hInfo) Then + Paint.Fill(hInfo.LineStyle) + Endif + + If hInfo.LineStyle Then + Paint.Background = GetForeground() + fOffset = GetStrokeOffset() + Paint.Translate(fOffset, fOffset) + Paint.Stroke + Paint.Translate(-fOffset, -fOffset) + Endif + +End + + +Public Sub Circle(X As Integer, Y As Integer, Radius As Integer, Optional Start As Float, ({End}) As Float) + + DrawEllipse(DRAW_CIRCLE, X - Radius, Y - Radius, Radius * 2, Radius * 2, Start, {End}) + +End + +Public Sub Arc(X As Integer, Y As Integer, Width As Integer, Height As Integer, Optional Start As Float, ({End}) As Float) + + DrawEllipse(DRAW_ARC, X, Y, Width, Height, Start, {End}) + +End + +Public Sub Ellipse(X As Integer, Y As Integer, Width As Integer, Height As Integer, Optional Start As Float, ({End}) As Float) + + DrawEllipse(DRAW_ELLIPSE, X, Y, Width, Height, Start, {End}) + +End + +Public Sub Text((Text) As String, X As Integer, Y As Integer, Optional Width As Integer = -1, Height As Integer = -1, Alignment As Integer = -1) + + Paint.Background = GetForeground() + If Width < 0 And If Height < 0 Then Y += Paint.Font.Ascent + Paint.DrawText(Text, X, Y, Width, Height, Alignment) + +End + +Public Sub TextWidth((Text) As String) As Integer + + Return Ceil(Paint.TextSize(Text).Width) + +End + +Public Sub TextHeight((Text) As String) As Integer + + Return Ceil(Paint.TextSize((Text)).Height) + +End + +Public Sub RichText((Text) As String, X As Integer, Y As Integer, Optional Width As Integer = -1, Height As Integer = -1, Alignment As Integer = -1) + + Paint.Background = GetForeground() + If Width < 0 And If Height < 0 Then Y += Paint.Font.Ascent + Paint.DrawRichText(Text, X, Y, Width, Height, Alignment) + +End + +Public Sub RichTextWidth((Text) As String) As Integer + + Return Ceil(Paint.RichTextSize(Text).Width) + +End + +Public Sub RichTextHeight((Text) As String, Optional Width As Integer = -1) As Integer + + Return Ceil(Paint.RichTextSize(Text, Width).Height) + +End + +Public Sub PolyLine(Points As Integer[]) + + Dim hInfo As DrawInfo + Dim I As Integer + Dim fOffset As Float + + If Not Points Or If Points.Count < 4 Then Return + + hInfo = _GetInfo() + + If hInfo.LineStyle = Line.None Then Return + + Paint.Background = hInfo.Foreground + + Paint.MoveTo(Points[0], Points[1]) + + For I = 2 To Points.Max Step 2 + Paint.LineTo(Points[I], Points[I + 1]) + Next + + fOffset = GetStrokeOffset() + Paint.Translate(fOffset, fOffset) + Paint.Stroke + Paint.Translate(-fOffset, -fOffset) + +End + +Public Sub Polygon(Points As Integer[]) + + Dim hInfo As DrawInfo + Dim fOffset As Float + + If Not Points Or If Points.Count < 4 Then Return + + hInfo = _GetInfo() + + Paint.Polygon(Points) + + fOffset = GetStrokeOffset() + + If HasFillStyle(hInfo) Then + + Paint.Fill(hInfo.LineStyle <> Line.None) + + Endif + + If hInfo.LineStyle Then + + Paint.Background = GetForeground() + Paint.Translate(fOffset, fOffset) + Paint.Stroke + Paint.Translate(-fOffset, -fOffset) + + Endif + +End + +Public Sub Reset() + + Paint.Reset + +End + +Public Sub Translate(DX As Float, DY As Float) + + Paint.Translate(DX, DY) + +End + +Public Sub Scale(SX As Float, SY As Float) + + Paint.Scale(SX, SY) + +End + +Public Sub Zoom((Image) As Image, (Zoom) As Integer, X As Integer, Y As Integer, Optional SrcX As Integer, SrcY As Integer, SrcWidth As Integer, SrcHeight As Integer) + + Dim hInfo As DrawInfo = _GetInfo() + Dim hRect As Rect + + If SrcWidth > 0 And If SrcHeight > 0 Then hRect = New Rect(SrcX, SrcY, SrcWidth, SrcHeight) + Paint.ZoomImage(Image, Zoom, X, Y, If(hInfo.LineStyle = Line.None, Color.Default, GetForeground()), hRect) + +End + +Public Sub Image((Image) As Image, X As Integer, Y As Integer, Optional Width As Integer = -1, Height As Integer = -1, SrcX As Integer, SrcY As Integer, SrcWidth As Integer, SrcHeight As Integer) + + Dim hRect As Rect + If SrcWidth > 0 And If SrcHeight > 0 Then hRect = New Rect(SrcX, SrcY, SrcWidth, SrcHeight) + Paint.DrawImage(Image, X, Y, Width, Height, 1.0, hRect) + +End + +Public Sub Picture((Picture) As Picture, X As Integer, Y As Integer, Optional Width As Integer = -1, Height As Integer = -1, SrcX As Integer, SrcY As Integer, SrcWidth As Integer, SrcHeight As Integer) + + Dim hRect As Rect + If SrcWidth > 0 And If SrcHeight > 0 Then hRect = New Rect(SrcX, SrcY, SrcWidth, SrcHeight) + Paint.DrawPicture(Picture, X, Y, Width, Height, hRect) + +End + +Public Sub Tile((Picture) As Picture, X As Integer, Y As Integer, W As Integer, H As Integer) + + Dim hBrush As PaintBrush = Paint.Brush + + Paint.Brush = Paint.Image(Picture.Image, X, Y) + Paint.Rectangle(X, Y, W, H) + Paint.Fill + + Paint.Brush = hBrush + +End + + +Private Function Clip_Read() As _Draw_Clip + + Return _Draw_Clip + +End + +Private Function Style_Read() As _Draw_Style + + Return _Draw_Style + +End diff --git a/comp/src/gb.gui.base/.src/Fill.class b/comp/src/gb.gui.base/.src/Fill.class new file mode 100644 index 00000000..6d6c1c12 --- /dev/null +++ b/comp/src/gb.gui.base/.src/Fill.class @@ -0,0 +1,5 @@ +' Gambas class file + +Export + +Public Enum None, Solid, Dense94, Dense88, Dense63, Dense50, Dense37, Dense12, Dense6, Horizontal, Vertical, Cross, Diagonal, BackDiagonal, CrossDiagonal diff --git a/comp/src/gb.gui.base/.src/GridView/GridView.class b/comp/src/gb.gui.base/.src/GridView/GridView.class new file mode 100644 index 00000000..c44e2291 --- /dev/null +++ b/comp/src/gb.gui.base/.src/GridView/GridView.class @@ -0,0 +1,2455 @@ +' Gambas class file + +Export + +Inherits UserControl + +Class TableView + +Public Const _Properties As String = "*,Border=True,Mode{Select.None;Single;Multiple}=None,Grid=True,Padding{Range:0;63}=2,ShowCursor=False,Header{GridView.None;Horizontal;Vertical;Both}=None,ScrollBar{Scroll.*}=Both,AutoResize=True,Resizable=True,Sorted" +Public Const _Group As String = "View" +Public Const _DefaultEvent As String = "Click" + +Public Enum None, Horizontal, Vertical, Both + +Property Background As Integer +Property Read Rows As _GridView_Rows +Property Read Columns As _GridView_Columns +Property Border As Boolean +Property Grid As Boolean +Property Mode As Integer +Property Read Data As _GridView_Data +Property Row As Integer +Property Column As Integer +Property Resizable As Boolean +Property ScrollBar As Integer +Property AutoResize As Boolean +Property Header As Integer +Property ShowCursor As Boolean +Property Read Current As _GridView_Cell +Property Sorted As Boolean +Property Padding As Integer + +Property ScrollX As Integer +Property ScrollY As Integer +Property Read ScrollW, ScrollWidth As Integer +Property Read ScrollH, ScrollHeight As Integer + +Property Read ClientX As Integer +Property Read ClientY As Integer +Property Read ClientW, ClientWidth As Integer +Property Read ClientH, ClientHeight As Integer + +Event Data(Row As Integer, Column As Integer) +Event Change +Event Select +Event Click +Event Activate +Event Scroll +Event Font + +Event ColumnClick(Column As Integer) +Event ColumnResize(Column As Integer) +Event ColumnSize(Column As Integer) + +Event RowClick(Row As Integer) +Event RowResize(Row As Integer) +Event RowSize(Row As Integer) + +'Event MouseDown +Event Sort +Event Draw(X As Integer, Y As Integer, Width As Integer, Height As Integer, Row As Integer, Column As Integer) + +Public _DoNotDrawSelection As Boolean +Public _NoMouse As Boolean +Public _ToggleSelection As Boolean + +Private $hView As ScrollArea +Private $bGrid As Boolean = True +Private $iMode As Integer +Private $iHeader As Integer +Private $bShowCursor As Boolean +Private $bAutoResize As Boolean = True +Private $iDefaultMouse As Integer '= Mouse.Default +Private $iBg As Integer = Color.Default + +Private $iRow As Integer +Private $iCol As Integer + +Private $hRows As _GridView_Rows +Private $hColumns As _GridView_Columns + +Private $iFirstRow As Integer +Private $aRowY As New Integer[] + +Private $cCells As New Collection +Private $hData As _GridView_Data + +Private $cSpan As New Collection + +Private $bResize As Boolean +Private $iRowResize As Integer = -1 +Private $iColResize As Integer = -1 +Private $iDimResize As Integer + +Private $bMoveSelect As Boolean +Private $bMoveUnSelect As Boolean +Private $iMoveSelectRow As Integer = -1 +Private $vMoveOldSelection As Variant +Private $bKeyEvent As Boolean +Private $bIgnoreMove As Boolean + +Private $MX As Integer +Private $MY As Integer +Private $SX As Integer +Private $SY As Integer +Private $hTimerScroll As Timer + +Private $bInCell As Boolean +Private $bInRow As Boolean + +Private $hTimerEnsureVisible As Timer +Private $iRowEV As Integer = -1 +Private $iColEV As Integer = -1 + +Private $bSorted As Boolean + +Private $bHasDrawEvent As Boolean + +Private $iPadding As Integer = 2 +Private $iTextHeight As Integer +Private $bDoNotRaiseSelect As Boolean + +Private $hTimerClick As Timer +Private $bMoveRaiseSelect As Boolean + +Public Sub _new() + + $hRows = New _GridView_Rows As "Rows" + $hColumns = New _GridView_Columns As "Columns" + + $hView = New ScrollArea(Me) As "ScrollArea" + $hView.Background = Color.TextBackground + $hView.Focus = True + $hView.Tracking = True + $hView.ScrollBar = Scroll.Both + + $bGrid = True + $iRow = -1 + $iCol = 0 + + Me.Proxy = $hView + + $hTimerClick = New Timer As "GridViewClick" + +End + +' Public Sub _attach(Parent As Object, EventName As String) +' +' If Parent Then +' $bHasDrawEvent = Object.CanRaise(Me, "Draw") +' Endif +' +' End + + +Private Sub GetCellKey(iRow As Integer, iCol As Integer) As String + + If iRow >= iCol Then + Return CLong(iRow) * iRow + iCol * 2 + Else + Return CLong(iCol) * iCol + iRow * 2 + 1 + Endif + +End + + +Private Function Rows_Read() As _GridView_Rows + + Return $hRows + +End + +Private Function Columns_Read() As _GridView_Columns + + Return $hColumns + +End + +Public Sub _IsRowSelected(iRow As Integer) As Boolean + + Select Case $iMode + Case Select.None + Return + Case Select.Single + Return iRow = $iRow + Case Select.Multiple + Return $hRows._IsSelected(iRow) + End Select + +End + +Private Sub DrawAlignedPicture(hPict As Picture, X As Integer, Y As Integer, W As Integer, H As Integer, A As Integer) + + If Align.IsBottom(A) Then + Y += H - hPict.H + Else If Align.IsMiddle(A) Then + Y += (H - hPict.H) / 2 + Endif + + If Align.IsRight(A) Then + X += W - hPict.W + Else If Align.IsCenter(A) Then + X += (W - hPict.W) / 2 + Endif + + Paint.DrawPicture(hPict, X, Y) + +End + + +Private Sub DrawCell(X As Integer, Y As Integer, W As Integer, H As Integer, iRow As Integer, iCol As Integer, hData As _GridView_Data, hRowBorder As Border) + + Dim hRect As Rect = Rect(X, Y, W, H) + Dim hRectDraw As Rect + Dim hPict As Picture + Dim A As Integer + Dim iColor As Integer + Dim bCancel As Boolean + Dim iPadding As Integer + + Paint.Save + + With hData + + If W <= 0 Or If H <= 0 Then Goto DRAW_GRID + + iColor = .Background + If iColor = Color.Default Then + iColor = $hColumns[iCol].Background + If iColor = Color.Default Then + iColor = Me.Background + If iColor = Color.Default Then + iColor = Color.TextBackground + Endif + Endif + Endif + + Paint.FillRect(X, Y, W, H, iColor) + + If .Border Then + hRectDraw = .Border.GetRect(RectF(X, Y, W, H), True) + If hRectDraw Then + With hRectDraw + X = .X + Y = .Y + W = .W + H = .H + End With + Endif + Endif + + If hRowBorder Then + With hRowBorder + Y += .TopPadding + .TopWidth + H -= .TopPadding + .TopWidth + .BottomPadding + .BottomWidth + If iCol = 0 Then + X += .LeftPadding + .LeftWidth + W -= .LeftPadding + .LeftWidth + Endif + If iCol = $hColumns.Max Then + W -= .RightPadding + .RightWidth + Endif + End With + Endif + + iPadding = Max($iPadding, .Padding) + + If iPadding Then + X += iPadding + Y += iPadding + W -= iPadding * 2 + H -= iPadding * 2 + Endif + + If W <= 0 Or If H <= 0 Then Goto DRAW_GRID + + 'Paint.FillRect(X, Y, W, H, Color.SetAlpha(Color.Red, 240)) + + iColor = .Foreground + If iColor = Color.Default Then + iColor = Me.Foreground + If iColor = Color.Default Then + iColor = Style.ForegroundOf(Me) + Endif + Endif + + Paint.Background = iColor + + If .Font And If .Font.Modified Then Paint.Font = .Font + + If $bHasDrawEvent Then + bCancel = Raise Draw(X, Y, W, H, iRow, iCol) + If bCancel Then Goto DRAW_GRID + Endif + + hPict = .Picture + + If hPict Then + + If Not .Text And If Not .RichText Then + + DrawAlignedPicture(hPict, X, Y, W, H, .Alignment) + + Else + + A = .Alignment + If Align.IsMiddle(A) Then + A = Align.Normal + Else If Align.IsTop(A) Then + A = Align.TopNormal + Else If Align.IsBottom(A) Then + A = Align.BottomNormal + End If + + DrawAlignedPicture(hPict, X, Y, W, H, A) + + W -= hPict.W + iPadding + If Not System.RightToLeft Then X += hPict.W + iPadding + + Endif + + If W <= 0 Then Goto DRAW_GRID + + Endif + + Inc X + W -= 2 + + If .Text Then + If .WordWrap Then + Paint.DrawRichText(Replace(Html(.Text), "\n", "
        "), X, Y, W, H, .Alignment) + Else + Paint.DrawText(.Text, X, Y, W, H, .Alignment) + Endif + Else If .RichText Then + If .WordWrap Then + Paint.DrawRichText(.RichText, X, Y, W, H, .Alignment) + Else + A = .Alignment + If Align.IsLeft(A) Then + Paint.DrawRichText(.RichText, X, Y, 4096, H, .Alignment) + Else If Align.IsRight(A) Then + Paint.DrawRichText(.RichText, X + W - 4096, Y, 4096, H, .Alignment) + Else + Paint.DrawRichText(.RichText, X + W \ 2 - 4096, Y, 8192, H, .Alignment) + Endif + Endif + Endif + + End With + +DRAW_GRID: + + iColor = Color.Merge(Color.LightForeground, $hView.Background) + If $bGrid Then + If System.RightToLeft Then + If iCol > 0 Then Paint.FillRect(hRect.X, hRect.Y, 1, hRect.H, iColor) + Else + If iCol < $hColumns.Max Or If hRect.X + hRect.W < $hView.ClientW Then Paint.FillRect(hRect.X + hRect.W - 1, hRect.Y, 1, hRect.H, iColor) + Endif + If iRow < $hRows.Max Or If hRect.Y + hRect.H < $hView.ClientH Then Paint.FillRect(hRect.X, hRect.Y + hRect.H - 1, hRect.W, 1, iColor) + Else If Me Is TableView Then + If iRow = $hRows.Max Then + If hRect.Y + hRect.H < $hView.ClientH Then Paint.FillRect(hRect.X, hRect.Y + hRect.H - 1, hRect.W, 1, iColor) + Endif + If System.RightToLeft Then + If iCol = 0 Then + Paint.FillRect(hRect.X, hRect.Y, 1, hRect.H, iColor) + Endif + Else + If iCol = $hColumns.Max Then + If hRect.X + hRect.W < $hView.ClientW Then Paint.FillRect(hRect.X + hRect.W - 1, hRect.Y, 1, hRect.H, iColor) + Endif + Endif + Endif + + Paint.Restore + +End + +Private Sub DrawText(sText As String, X As Integer, Y As Integer, W As Integer, H As Integer, iAlign As Integer, iPadding As Integer) + + X += iPadding + Y += iPadding + W -= iPadding * 2 + H -= iPadding * 2 + If W <= 0 Or If H <= 0 Then Return + Paint.DrawText(sText, X, Y, W, H, iAlign) + +End + + +Public Sub ScrollArea_Draw() + + Dim I, J, R, C, WA As Integer + Dim XO, YO, XX, YY, X, Y, W, H As Integer + Dim iRow, iRow2, iCol, iCol2 As Integer + Dim hClip, hSaveClip As Rect + Dim hRect As Rect + Dim hData As _GridView_Data + Dim F As Integer = _GetFrameWidth() + Dim iGrid As Integer + Dim aSpan As Short[] + Dim bHasSpan As Boolean + Dim iRowSpan, iColSpan As Integer + Dim hSpan, hCursor As Rect + Dim XS, YS As Integer + Dim iSort As Integer + Dim bAscent As Boolean + Dim iStepCol As Integer + Dim iBg As Integer + Dim hRowBorder As Border + Dim hTopRowBorder As Border + Dim hBottomRowBorder As Border + Dim hRowBorderRect As Rect + Dim hRectF As RectF + Dim iBgSel As Integer + Dim iPadding As Integer + + 'Debug Me.Font.ToString();; Draw.Font.ToString() + + If $iBg <> Color.Transparent Then + If $iBg = Color.Default Then + iBg = Color.TextBackground + Else + iBg = $iBg + Endif + Paint.FillRect(0, 0, Paint.W, Paint.H, iBg) + Endif + + If $hView.HasFocus Then + iBgSel = Color.SetAlpha(Color.SelectedBackground, &HA0) + Else + iBgSel = Color.SetAlpha(Color.SelectedBackground, &HC0) + Endif + + If $hColumns.Count = 0 And If $hRows.Count = 0 Then Return + + iCol = $hColumns._FindColumnFromPos($hView.ScrollX) + If iCol < 0 Then iCol = $hColumns.Max + 'Debug "iCol = "; iCol + + iRow = $hRows._FindRowFromPos($hView.ScrollY) + iCol2 = -1 + iRow2 = -1 + + iStepCol = If(System.RightToLeft, -1, 1) + + If System.RightToLeft Then + XO = -$hView.ScrollX + F + Else + XO = $hRows.Width - $hView.ScrollX + F + Endif + XX = XO + $hColumns[iCol].X + YO = $hColumns.Height - $hView.ScrollY + F + YY = YO + $hRows._GetRowY(iRow) + + If $bGrid Then + iGrid = Color.Merge(Color.LightForeground, Color.TextBackground) + Else + iGrid = Color.Merge(Color.LightForeground, Color.ButtonBackground) + Endif + + hClip = Paint.ClipRect + + ' Headers use button colors + + Paint.Background = Color.ButtonForeground + iBg = Color.ButtonBackground + If Color.Distance(iBg, Color.TextBackground) < 0.1 Then + iBg = Color.Background + Endif + + iPadding = Max(Desktop.Scale \ 2, $iPadding) + + ' Column headers + + iSort = $hColumns.Sort + bAscent = $hColumns.Ascending + + H = $hColumns.Height + F + If $iHeader And Horizontal Then Paint.FillRect(0, 0, Paint.W, H, iBg) + X = XX + + If iCol >= 0 Then + I = iCol + Do + If I < 0 Or If I >= $hColumns.Count Then Break + If X >= $hView.ClientW Then Break + iCol2 = I + With $hColumns[I] + If .W > 0 And If $iHeader And Horizontal Then + + ''If $bGrid Then Draw.FillRect(X - 1, F, 1, H - F, iGrid) + If System.RightToLeft Then + Paint.FillRect(X, F, 1, H - F, iGrid) + Else + Paint.FillRect(X - 1, F, 1, H - F, iGrid) + Endif + + Paint.Save + + If iSort = I Then + WA = Min(12, H - F) + If WA < .Width Then Style.PaintArrow(X + .Width - WA - iPadding, F, WA, H - F, If(bAscent, Align.Bottom, Align.Top)) + 'Draw.ClipRect = hClip.Intersection(Rect(X, F, Max(0, .Width - WA - 2), H - F)) + 'If Draw.ClipRect Then Draw.Text(.Text, X + 4, F, .Width - WA - 8, H - F, .Alignment) + Paint.Rectangle(X, F, Max(0, .Width - WA - 2), H - F) + Paint.Clip + DrawText(.Text, X + 1, F, .Width - WA - iPadding - 2, H - F - 2, .Alignment, iPadding) + Else + Paint.Rectangle(X + 1, F, .Width - 2, H - F) + Paint.Clip + DrawText(.Text, X + 1, F, .Width - 2, H - F - 2, .Alignment, iPadding) + Endif + + Paint.Restore + + Endif + X += .Width + End With + I += iStepCol + Loop + Endif + + If $iHeader And Horizontal Then + 'Draw.ClipRect = hClip + If $bGrid Then + If System.RightToLeft Then + If X > 0 Then Paint.FillRect(X, F, 1, H - F, iGrid) + Else + If X < $hView.ClientW Then Paint.FillRect(X - 1, F, 1, H - F, iGrid) + Endif + Endif + Endif + + ' Row headers + + $iFirstRow = iRow + $aRowY.Clear + + W = $hRows.Width + F + If $iHeader And Vertical Then + If System.RightToLeft Then + Paint.FillRect($hView.ClientW - W, 0, W, Paint.H, iBg) + Else + Paint.FillRect(0, 0, W, Paint.H, iBg) + Endif + Endif + Y = YY + If System.RightToLeft Then + X = $hView.ClientW - $hRows.Width - F + Else + X = F + Endif + + If iRow >= 0 Then + For I = iRow To $hRows.Count - 1 + + If Y >= $hView.ClientH Then Break + $aRowY.Add(Y - F) + iRow2 = I + With $hRows[I] + 'Draw.Style.Separator(F, Y, W - F, 2) + H = .Height '$hRows._GetRowHeight(I) + If H > 0 And If $iHeader And Vertical Then + Paint.FillRect(X, Y - 1, W - F, 1, iGrid) + Paint.Save + Paint.Rectangle(X, Y + 1, W - F, H - 3) + Paint.Clip + If I = $iRow Then Paint.Font.Bold = True + DrawText(.Text, X, Y + 2, W - F - 1, H - 3, .TextAlignment, iPadding) + If I = $iRow Then Paint.Font.Bold = False + Paint.Restore + Endif + End With + + 'Draw.Style.Handle(W - 2, Y, 2, H, True) + Y += H + Next + Endif + + $aRowY.Add(Y - F) + + If $iHeader And Vertical Then + 'Draw.ClipRect = hClip + If $bGrid Then + If Y < $hView.ClientH Then Paint.FillRect(F, Y - 1, W - F, 1, iGrid) + Endif + Endif + + ' Top-left frame + + If $iHeader = Both Then + If System.RightToLeft Then + Paint.FillRect($hView.ClientW - $hRows.Width - F, 0, $hRows.Width + F, $hColumns.Height + F, iBg) + Else + Paint.FillRect(0, 0, $hRows.Width + F, $hColumns.Height + F, iBg) + Endif + Endif + + ' Header limits + + If $iHeader And Horizontal Then Paint.FillRect(0, $hColumns.Height + F - 1, $hView.ClientW, 1, Color.Merge(Color.LightForeground, Color.ButtonBackground)) + If $iHeader And Vertical Then + If System.RightToLeft Then + Paint.FillRect($hView.ClientW - $hRows.Width - F, 0, 1, $hView.ClientH, Color.Merge(Color.LightForeground, Color.ButtonBackground)) + Else + Paint.FillRect($hRows.Width + F - 1, 0, 1, $hView.ClientH, Color.Merge(Color.LightForeground, Color.ButtonBackground)) + Endif + Endif + + If $hColumns.Count = 0 Or If $hRows.Count = 0 Then Return + If iRow < 0 Or If iRow2 < 0 Then Return + + ' Cells + + hRect = New Rect(0, 0, $hView.ClientW, $hView.ClientH) + hRect.Adjust(F) + If System.RightToLeft Then + hRect.Adjust(0, $hColumns.Height, $hRows.Width, 0) + Else + hRect.Adjust($hRows.Width, $hColumns.Height, 0, 0) + Endif + hClip = hRect.Intersection(Paint.ClipRect) + If Not hClip Then Return + + Paint.Save + Paint.ResetClip + Paint.Rectangle(hClip.X, hClip.Y, hClip.W, hClip.H) + Paint.Clip + + $bHasDrawEvent = Object.CanRaise(Me, "Draw") + + hSaveClip = hClip.Copy() + 'Draw.ClipRect = hClip + + Y = YY + + For I = iRow To iRow2 + + H = $aRowY[I - iRow + 1] + F - Y + X = XX + + ' Row border + + hRowBorder = $hRows._GetRowBorder(I) + + If hRowBorder Then + + If I > 0 Then + hTopRowBorder = $hRows._GetRowBorder(I - 1) + Else + hTopRowBorder = Null + Endif + + If I < $hRows.Max Then + hBottomRowBorder = $hRows._GetRowBorder(I + 1) + Else + hBottomRowBorder = Null + Endif + + Paint.Save + hRectF = RectF(XO + $hColumns[0].X, Y, $hColumns[$hColumns.Max].X + $hColumns[$hColumns.Max].W - $hColumns[0].X, H) + hRowBorder.Clip(hRectF, hTopRowBorder, hBottomRowBorder) + hRowBorderRect = hRowBorder.GetRect(hRectF, False, hTopRowBorder, hBottomRowBorder) + + If Not hRowBorderRect Then + Paint.Restore + Goto NEXT_ROW + Endif + + Else + + hRowBorderRect = Null + + Endif + + For J = iCol To iCol2 Step iStepCol + + W = $hColumns[J].Width + + R = I + C = J + + bHasSpan = HasSpan(I, J) + + If bHasSpan Then + + aSpan = _GetSpan(I, J) + iRowSpan = aSpan[0] + iColSpan = aSpan[1] + + 'Draw.ClipRect = hClip + 'Draw.Foreground = Color.Green + 'Draw.Text(iRowSpan & " / " & iColSpan, X, Y, $hColumns[J].Width, H, Align.Center) + + If iRowSpan < 0 Then R += iRowSpan + If iColSpan < 0 Then C += iColSpan + + If (iRowSpan < 0 Or iColSpan < 0) And If R >= iRow And If C >= iCol Then Goto NEXT_CELL + + aSpan = _GetSpan(R, C) + iRowSpan = aSpan[0] + iColSpan = aSpan[1] + + ' Else + ' + ' iRowSpan = 0 + ' iColSpan = 0 + + ' Draw.ClipRect = hClip + ' Draw.Foreground = Color.Green + ' Draw.Text(iRowSpan & " / " & iColSpan, X, Y, $hColumns[J].Width, H, Align.Center) + + Endif + + If bHasSpan Then + + XS = XO + $hColumns[C].X + YS = YO + $hRows._GetRowY(R) + hSpan = Rect(XS, YS, XO + $hColumns[C + iColSpan].X + $hColumns[C + iColSpan].W - XS, YO + $hRows._GetRowY(R + iRowSpan) + $hRows._GetRowHeight(R + iRowSpan) - YS) + + Else + + hSpan = Rect(X, Y, W, H) + + Endif + + If hRowBorderRect Then + hSpan = hSpan.Intersection(hRowBorderRect) + If Not hSpan Then Goto NEXT_CELL + Endif + + If Not hClip.Intersection(hSpan) Then Goto NEXT_CELL + + hData = _GetCellData(R, C) + + Paint.Save + + If hData.Border Then 'hSpan = hData.Border.GetRect(RectF(hSpan.X, hSpan.Y, hSpan.W, hSpan.H), True) + hData.Border.Clip(RectF(hSpan.X, hSpan.Y, hSpan.W, hSpan.H)) + Endif + + Paint.Rectangle(hSpan.X, hSpan.Y, hSpan.W, hSpan.H) + Paint.Clip + + DrawCell(hSpan.X, hSpan.Y, hSpan.W, hSpan.H, R, C, hData, hRowBorder) + + If hData.Border Then + hData.Border.Paint(RectF(hSpan.X, hSpan.Y, hSpan.W, hSpan.H)) + Endif + + If Not hRowBorder And If $iMode Then + If _DoNotDrawSelection Then + If I = $iRow And If $iMode = Select.Multiple Then Paint.FillRect(0, Y, Paint.W, H, iBgSel) + Else + If _IsRowSelected(I) Then Paint.FillRect(0, Y, Paint.W, H, iBgSel) + Endif + Endif + + Paint.Restore + + NEXT_CELL: + + If I = $iRow And If J = $iCol Then + If System.RightToLeft Then + hCursor = Rect(X + 1, Y, Max(0, W - 1), Max(0, H - 1)) + If J = 0 Then Inc hCursor.Left + Else + hCursor = Rect(X, Y, Max(0, W - 1), Max(0, H - 1)) + If J = $hColumns.Max Then Inc hCursor.Right + Endif + 'If I = $hRows.Max Then Dec hCursor.Bottom + ' Paint.Begin(Draw.Device) + ' Paint.ClipRect = hClip + ' Paint.Brush = Paint.Color(Color.SetAlpha(Color.SelectedBackground, 192)) + ' Paint.Rectangle(X, Y, W, H) + ' Paint.Stroke + ' Paint.End + Endif + + X += W + + Next + + If hRowBorder Then + + If $iMode And If Not _DoNotDrawSelection Then + If _IsRowSelected(I) Then + Paint.FillRect(0, Y, Paint.W, H, Color.SetAlpha(Color.SelectedBackground, 192)) + Endif + Endif + + Paint.Restore + hRowBorder.Paint(RectF(XO + $hColumns[0].X, Y, $hColumns[$hColumns.Max].X + $hColumns[$hColumns.Max].W - $hColumns[0].X, H), hTopRowBorder, hBottomRowBorder) + Endif + + NEXT_ROW: + + Y += H + + Next + + If hCursor Then + If $bShowCursor Then + 'Paint.FillRect(hSpan.X, hSpan.Y, hSpan.W, hSpan.H, Color.SetAlpha(Color.SelectedBackground, 192)) + 'Draw.ClipRect = hClip + ' Paint.Background = Color.LightBackground 'iGrid 'Color.LightForeground + ' Paint.LineCap = Paint.LineCapSquare + ' Paint.LineWidth = 1.5 + Paint.DrawRect(hCursor.X, hCursor.Y, hCursor.W, hCursor.H, Color.LightBackground, 1.5) + Paint.Stroke + Endif + Endif + + $hData = Null + + ' Sorted column + + If $bSorted And If $hColumns.Count > 1 And If iSort >= 0 And If iSort < $hColumns.Count Then + + 'Paint.Begin(Draw.Device) + Paint.ClipRect = hClip + With $hColumns[iSort] + Paint.FillRect(XO + .X, $hColumns.H + F, .W, $hView.ClientH - $hColumns.H - F * 2, Color.SetAlpha(Style.ForegroundOf(Me), 252)) + End With + + 'Paint.End + + Endif + + ' Row selection + + ' If $iMode And If Not _DoNotDrawSelection Then + ' + ' Y = YY + ' X = XX + ' + ' 'Paint.Begin(Draw.Device) + ' 'Paint.ClipRect = hSaveClip + ' Paint.Brush = Paint.Color(Color.SetAlpha(Color.SelectedBackground, 192)) + ' + ' For I = iRow To iRow2 + ' + ' H = $aRowY[I - iRow + 1] + F - Y + ' + ' If _IsRowSelected(I) Then + ' 'Paint.Rectangle(X, Y, $hColumns._GetWidth(), H) + ' Paint.Rectangle(F, Y, $hView.ClientW - F * 2, H - If($bGrid, 1, 0)) + ' Paint.Fill + ' Endif + ' + ' Y += H + ' + ' Next + ' + ' 'Paint.End + ' + ' Endif + + Paint.Restore + + ' If Me.HasFocus And If Not $hView.Border Then + ' Draw.ClipRect = Null + ' Draw.Foreground = Color.LightBackground 'Color.LightForeground + ' Draw.Rect($hView.ClientX, $hView.ClientY, $hView.ClientW, $hView.ClientH) + ' Endif + +End + +Private Function Border_Read() As Boolean + + Return $hView.Border + +End + +Private Sub Border_Write(Value As Boolean) + + If $hView.Border = Value Then Return + $hView.Border = Value + ScrollArea_Arrange + +End + +Public Sub _GetFrameWidth() As Integer + + 'If $hView.Border Then Return 1 'Return Style.FrameWidth + +End + + +Public Sub _ResizeContents() + + Dim F As Integer = _GetFrameWidth() + + ' Debug $hRows._GetHeight(); " / "; $hRows.Count;; + ' If $hRows.Count Then Error $hRows[0].H * $hRows.Count; + ' Error + + $hView.ResizeContents($hColumns._GetWidth() + $hRows.Width + F * 2, $hRows._GetHeight() + $hColumns.Height + F * 2) + $hView._SetShadowOffset($hColumns.H, 0, If(System.RightToLeft, 0, $hRows.W), If(System.RightToLeft, $hRows.W, 0)) + +End + +Private Function Grid_Read() As Boolean + + Return $bGrid + +End + +Private Sub Grid_Write(Value As Boolean) + + $bGrid = Value + $hView.Refresh + +End + +Private Function Mode_Read() As Integer + + Return $iMode + +End + +Private Sub Mode_Write(Value As Integer) + + If Value = $iMode Then Return + + Select Case Value + Case Select.None, Select.Multiple, Select.Single + $hRows.UnSelectAll + $iMode = Value + End Select + + $hView.Refresh + +End + +Public Sub ScrollArea_Enter() + + $iDefaultMouse = Me.Mouse + +End + +Public Sub ScrollArea_Leave() + + Me.Mouse = $iDefaultMouse + +End + +Private Sub InRowHeader(X As Integer) As Boolean + + If $hRows.Width = 0 Then Return + + If System.RightToLeft Then + Return X >= $hView.ClientW - $hRows.Width + Else + Return X < $hRows.Width + Endif + +End + +Private Sub StartScrollTimer() + + Dim F As Integer = _GetFrameWidth() + + $SX = Mouse.X - F + $SY = Mouse.Y - F + + If $hTimerScroll Then Return + + $hTimerScroll = New Timer(50) As "TimerScroll" + +End + + +Public Sub ScrollArea_MouseMove() + + Dim I, MX, MY, X, Y, iRow, iCol As Integer + Dim iMouse As Integer + Dim F As Integer = _GetFrameWidth() + Dim bInRowHeader As Boolean + Dim HW As Integer + + If Me.Design Then Return + If Not Me.Enabled Then Return + If $bIgnoreMove Then Return + If _NoMouse Then Return + + If $hRows.Count = 0 And If $hColumns.Count = 0 Then Return + + If $bInCell And If Mouse.Left Then StartScrollTimer + + MX = Mouse.X - F + MY = Mouse.Y - F + + $bInCell = False + $bInRow = False + + If $bResize Then + If $iRowResize >= 0 Then + $hRows._SetRowHeight($iRowResize, Max(1, $iDimResize + MY - $MY)) + Else If $iColResize >= 0 Then + 'Debug "Resize "; $iColResize; ": "; $hColumns[$iColResize].Width;; "->";; Max(1, $iDimResize + MX - $MX) + If System.RightToLeft Then + $hColumns[$iColResize].Width = Max(1, $iDimResize + $MX - MX) + Else + $hColumns[$iColResize].Width = Max(1, $iDimResize + MX - $MX) + Endif + 'Debug "ScrollX = "; Me.ScrollX + Endif + Return + Endif + + iMouse = $iDefaultMouse 'Mouse.Default + + $iRowResize = -1 + $iColResize = -1 + HW = (Desktop.Scale * 3) \ 4 + + bInRowHeader = InRowHeader(MX) + + If bInRowHeader Then + + If $hRows.Resizable Then + For I = 0 To $aRowY.Max + If MY >= ($aRowY[I] - HW) And If MY <= ($aRowY[I] + HW) Then + If I + $iFirstRow Then + iMouse = Mouse.SizeS + $iRowResize = I + $iFirstRow - 1 + $iDimResize = $hRows._GetRowHeight($iRowResize) + Endif + Break + Endif + Next + Endif + + Else If MY < $hColumns.Height Then + + If $hColumns.Resizable Then + + X = MX + $hView.ScrollX + If Not System.RightToLeft Then X -= $hRows.Width + + If System.RightToLeft Then + ' For I = $hColumns.Count - 2 DownTo 0 + ' With $hColumns[I] + ' If $hColumns[I + 1].Resizable And If X >= (.X - 1) And If X <= (.X + 2) Then + ' iMouse = Mouse.SizeE + ' $iColResize = I + 1 + ' $iDimResize = $hColumns[$iColResize].Width + ' Break + ' Endif + ' End With + ' Next + For I = 1 To $hColumns.Count - 1 + With $hColumns[I] + If $hColumns[I].Resizable And If X >= (.X - HW) And If X <= (.X + HW) Then + iMouse = Mouse.SizeE + $iColResize = I + $iDimResize = $hColumns[$iColResize].Width + Break + Endif + End With + Next + Else + For I = 1 To $hColumns.Count - 1 + With $hColumns[I] + If $hColumns[I - 1].Resizable And If X >= (.X - HW) And If X <= (.X + HW) Then + iMouse = Mouse.SizeE + $iColResize = I - 1 + $iDimResize = $hColumns[$iColResize].Width + Break + Endif + End With + Next + Endif + + If System.RightToLeft Then + If $iColResize < 0 And If $hColumns[0].Resizable And If X >= ($hColumns._GetWidth() - HW) And If X <= ($hColumns._GetWidth() + HW) Then + iMouse = Mouse.SizeE + $iColResize = 0 + $iDimResize = $hColumns[$iColResize].Width + Endif + Else + If $iColResize < 0 And If $hColumns[$hColumns.Count - 1].Resizable And If X >= ($hColumns._GetWidth() - HW) And If X <= ($hColumns._GetWidth() + HW) Then + iMouse = Mouse.SizeE + $iColResize = $hColumns.Count - 1 + $iDimResize = $hColumns[$iColResize].Width + Endif + Endif + + Endif + + Endif + + If Mouse.Button = 0 And If $hView.Mouse <> iMouse Then $hView.Mouse = iMouse + + 'If $iColResize >= 0 Then Debug "Resize?";; $iColResize + + If $iRowResize >= 0 Or If $iColResize >= 0 Then Return + + iRow = -1 + iCol = -1 + + X = MX + Y = MY + + If Not System.RightToLeft Then X -= $hRows.W + + If Mouse.Left Or If Mouse.Right Then + + If Y >= $hColumns.Height Then + For I = 1 To $aRowY.Max + If Y < $aRowY[I] Then + iRow = I + $iFirstRow - 1 + Break + Endif + Next + Endif + + If Y < 0 Or If Y >= $hColumns.Height Then + If iRow < 0 Then + iRow = $hRows._FindRowFromPos(Y - $hColumns.Height + $hView.ScrollY) + Endif + Endif + + If Not bInRowHeader Then + + X += $hView.ScrollX + iCol = $hColumns._FindColumnFromPos(X) + + Endif + + Endif + + If iRow >= 0 Then + + $bInRow = True + + If iCol >= 0 Then $bInCell = True + + MoveTo(iRow, iCol) + + Endif + +End + +Public Sub TimerScroll_Timer() + + Dim X As Integer + Dim Y As Integer + Dim iCol As Integer + Dim iRow As Integer + + If Drag.Pending Then + $hTimerScroll.Stop + Return + Endif + + X = $SX - If(System.RightToLeft, 0, $hRows.W) + $hView.ScrollX + Y = $SY - $hColumns.Height + $hView.ScrollY + + If InRowHeader($SX) Then + iCol = -1 + Else + iCol = $hColumns._FindColumnFromPos(X) + If iCol < 0 Then iCol = If(System.RightToLeft, 0, $hColumns.Count - 1) + Endif + + If Y < 0 Then + iRow = 0 + Else + iRow = $hRows._FindRowFromPos(Y) + If iRow < 0 Then iRow = $hRows.Count - 1 + Endif + + MoveTo(iRow, iCol) + +End + +Public Sub _EnsureVisibleScroll(X As Integer, Y As Integer) + + $hView.EnsureVisible($hView.ScrollX + X - 16 - $hColumns.W, $hView.ScrollY + Y - 16 - $hRows.H, 32, 32) + +End + +Public Sub ScrollArea_MouseDrag() + + If Me.Design Then Return + If Not Me.Enabled Then Return + If _NoMouse Then Return + + $bIgnoreMove = False + If $bResize Or If $bMoveSelect Or If $bMoveUnselect Then + Stop Event + Return + Endif + + StartScrollTimer + +End + +Public Sub ScrollArea_MouseDown() + + Dim I, iOldRow As Integer + Dim bCancel As Boolean + Dim F As Integer = _GetFrameWidth() + + $MX = Mouse.X - F + $MY = Mouse.Y - F + + If Me.Design Then Return + If Not Me.Enabled Then Return + If _NoMouse Then Return + If Mouse.Click > 1 Then Return + + Me.SetFocus + + $hTimerClick.Trigger + + bCancel = Raise MouseDown + If bCancel Then + Stop Event + Return + Endif + + iOldRow = $iRow + + $bIgnoreMove = False + + ScrollArea_MouseMove + + $bIgnoreMove = True + + If $iRowResize >= 0 Or If $iColResize >= 0 Then + $bResize = True + Return + Endif + + If $iMode = Select.Multiple Then + If $bInRow Then + If Mouse.Control Then + If $hRows._IsSelected($iRow) Then + $hRows.UnSelect($iRow, 1) + $iMoveSelectRow = $iRow + $vMoveOldSelection = $hRows._SaveSelection() + $bMoveUnSelect = True + Else + $hRows.Select($iRow, 1) + $iMoveSelectRow = $iRow + $vMoveOldSelection = $hRows._SaveSelection() + $bMoveSelect = True + Endif + Else If Mouse.Shift And If iOldRow >= 0 Then + $hRows._GetSelection().UnSelectAll + $hRows.Select(iOldRow, 1) + $iMoveSelectRow = iOldRow + $vMoveOldSelection = $hRows._SaveSelection() + $bMoveSelect = True + Dec $iRow + MoveTo($iRow + 1, -1) + Else If Not _IsRowSelected($iRow) Then + If Not _ToggleSelection Then $hRows._GetSelection().UnSelectAll() + $hRows.Select($iRow, 1) + $iMoveSelectRow = $iRow + $vMoveOldSelection = $hRows._SaveSelection() + $bMoveSelect = True + Else + If _ToggleSelection Then + $hRows.UnSelect($iRow, 1) + $vMoveOldSelection = $hRows._SaveSelection() + $bMoveUnSelect = True + Endif + $iMoveSelectRow = $iRow + Endif + Endif + Endif + + If $bInCell Then + + Else If Mouse.X < $hRows.Width And If Mouse.Y > $hColumns.H Then + I = $hRows._FindRowFromPos(Mouse.Y - $hColumns.Height + $hView.ScrollY) + If I >= 0 Then + 'bCancel = Raise MouseDown + 'If Not bCancel Then Raise RowClick(I) + + Raise RowClick(I) + 'Stop Event + Endif + Else If Mouse.Y < $hColumns.Height And If Mouse.X > $hRows.W Then + I = $hColumns._FindColumnFromPos(Mouse.X - $hRows.Width + $hView.ScrollX) + If I >= 0 Then + 'bCancel = Raise MouseDown + 'If Not bCancel Then + bCancel = Raise ColumnClick(I) + If Not bCancel Then + If $bSorted Then + If $hColumns.Sort = I Then + $hColumns.Ascending = Not $hColumns.Ascending + Else + $hColumns.Sort = I + $hColumns.Ascending = True + Endif + Endif + Endif + 'Endif + 'Stop Event + Endif + Endif + +End + +' Public Sub ScrollArea_Menu() +' +' Debug +' +' End + +Private Sub AfterMouseUp() + + If Me.Design Then Return + + If $hTimerScroll Then + $hTimerScroll.Stop + $hTimerScroll = Null + Endif + + If $bMoveSelect Or If $bMoveUnselect Then + $bDoNotRaiseSelect = False + If $bMoveRaiseSelect Then + $bMoveRaiseSelect = False + _RaiseSelect + Endif + Endif + + If _NoMouse Then Return + + $bResize = False + $bMoveSelect = False + $bMoveUnSelect = False + $vMoveOldSelection = Null + $iMoveSelectRow = -1 + $bIgnoreMove = False + +End + + +Public Sub ScrollArea_MouseUp() + + AfterMouseUp + +End + +Public Sub ScrollArea_DragLeave() + + AfterMouseUp + +End + + +Public Sub ScrollArea_GotFocus() + + $hView.Refresh + +End + +Public Sub ScrollArea_LostFocus() + + AfterMouseUp + $hView.Refresh + +End + + +Public Sub ScrollArea_DblClick() + + 'Debug $bInCell + + If Me.Design Then Return + If _NoMouse Then Return + + If $bInCell Then + Raise Activate + Else If $iColResize >= 0 Then + $hColumns[$iColResize].Width = -1 + Else If $iRowResize >= 0 Then + $hRows[$iRowResize].Height = -1 + Endif + +End + + +Private Function Data_Read() As _GridView_Data + + Return $hData + +End + +Public Sub _CheckCell(iRow As Integer, iColumn As Integer) + + If iRow < 0 Or If iRow >= $hRows.Count Then Error.Raise("Bad row index") + If iColumn < 0 Or If iColumn >= $hColumns.Count Then Error.Raise("Bad column index") + +End + +Public Sub _CheckCurrent() + + MoveTo(Min($iRow, $hRows.Count - 1), Min($iCol, $hColumns.Count - 1)) + +End + + +Public Sub _GetCellData(iRow As Integer, iColumn As Integer, Optional bCreate As Boolean) As _GridView_Data + + Dim hData As _GridView_Data + + hData = $cCells[GetCellKey(iRow, iColumn)] + If Not hData Then + If bCreate Then + hData = New _GridView_Data As "GridViewData" + hData.Font = Me.Font.Copy() + hData.Font.Modified = False + hData.Alignment = $hColumns[iColumn].Alignment + $cCells[GetCellKey(iRow, iColumn)] = hData + Else + $hData = New _GridView_Data As "GridViewData" + $hData.Font = Me.Font.Copy() + $hData.Font.Modified = False + $hData.Alignment = $hColumns[iColumn].Alignment + Raise Data(iRow, iColumn) + hData = $hData + Endif + Endif + + Return hData + +End + + +Public Sub _get(Row As Integer, Column As Integer) As _GridView_Cell + + Dim hCell As _GridView_Cell + + hCell = New _GridView_Cell + hCell._Row = Row + hCell._Column = Column + hCell._View = Me + Return hCell + +End + +Public Sub MoveTo(Row As Integer, Column As Integer) + + Dim S, L As Integer + + If Column < 0 Then Column = $iCol + + If Row < 0 Then + If $iRow < 0 Then Return + Row = -1 + Else If Row = $iRow And If Column = $iCol Then + Return + Else If Row >= $hRows.Count Or If Column < 0 Or If Column >= $hColumns.Count Then + Return + Endif + + $iRow = Row + $iCol = Column + + If $iRow >= 0 And If $iCol < 0 Then $iCol = 0 + + If $iRow >= 0 And If $iCol >= 0 Then _EnsureVisible($iRow, $iCol) + $hView.Refresh + + Raise Change + If $iMode = Select.Single Then + Raise Select + Else If $bMoveSelect Or If $bMoveUnSelect Then + If $vMoveOldSelection Then + $bDoNotRaiseSelect = True + $hRows._RestoreSelection($vMoveOldSelection) + S = Min($iRow, $iMoveSelectRow) + L = Max($iRow, $iMoveSelectRow) - Min($iRow, $iMoveSelectRow) + 1 + If $bMoveSelect Then + $hRows.Select(S, L) + Else + $hRows.UnSelect(S, L) + Endif + $bDoNotRaiseSelect = False + $bMoveRaiseSelect = True + Endif + Else If $bKeyEvent And If $iMode = Select.Multiple And If Not _NoMouse Then + $hRows._GetSelection().UnSelectAll + $hRows.Select($iRow, 1) + Endif + +End + +Private Function Row_Read() As Integer + + Return $iRow + +End + +Private Sub Row_Write(Value As Integer) + + MoveTo(Value, $iCol) + +End + +Private Function Column_Read() As Integer + + If $iRow < 0 Then Return -1 + Return $iCol + +End + +Private Sub Column_Write(Value As Integer) + + MoveTo($iRow, Value) + +End + + +' Private Sub EnsureRowVisible(iRow As Integer) +' +' 'Debug iRow; ": "; $hView.ScrollX, $hRows._GetRowY(iRow), $hView.ClientW, $hRows._GetRowHeight(iRow) +' Dim F As Integer = GetFrameWidth() +' +' $hView.EnsureVisible($hView.ScrollX - F, $hRows._GetRowY(iRow) - F, $hView.ClientW + F * 2, $hRows._GetRowHeight(iRow) + $hColumns.Height + F * 2) +' +' End + +Public Sub _EnsureVisible(iRow As Integer, iCol As Integer) + + If Not $hTimerEnsureVisible Then $hTimerEnsureVisible = New Timer As "TimerEnsureVisible" + If $iRowEV < 0 Then $hTimerEnsureVisible.Trigger + + $iRowEV = iRow + $iColEV = iCol + + 'Debug iRow;; iCol + +End + +Public Sub TimerEnsureVisible_Timer() + + Dim iRowEV As Integer = $iRowEV + Dim F As Integer = _GetFrameWidth() + + $iRowEV = -1 + + With $hColumns[$iColEV] + $hView.EnsureVisible(.X, $hRows._GetRowY(iRowEV) + F, Min($hView.ClientW - $hRows.W, .Width + $hRows.Width), $hRows._GetRowHeight(iRowEV) + $hColumns.Height + F) + End With + +Catch + +End + +Public Sub _SelectRow(iRow As Integer, bSelect As Boolean) + + If $iMode = Select.Single Then + If bSelect Then + If $iRow <> iRow Then + Row_Write(iRow) + Endif + Else If $iRow >= 0 Then + Row_Write(-1) + Endif + Endif + +End + +Public Sub Clear() + + $cCells.Clear + $hRows._Clear + $iRow = -1 + $iCol = 0 + _ResizeContents + $hView.Refresh + +End + +Public Sub _ClearCell(iRow As Integer, iCol As Integer) + + $cCells.Remove(GetCellKey(iRow, iCol)) + +End + +Private Function Resizable_Read() As Boolean + + Return $hColumns.Resizable + +End + +Private Sub Resizable_Write(Value As Boolean) + + $hColumns.Resizable = Value + +End + +Private Function ScrollX_Read() As Integer + + Return $hView.ScrollX + +End + +Private Sub ScrollX_Write(Value As Integer) + + $hView.ScrollX = Value + +End + +Private Function ScrollY_Read() As Integer + + Return $hView.ScrollY + +End + +Private Sub ScrollY_Write(Value As Integer) + + $hView.ScrollY = Value + +End + + +Private Function ScrollW_Read() As Integer + + Return $hView.ScrollW + +End + +Private Function ScrollH_Read() As Integer + + Return $hView.ScrollH + +End + +Private Function ClientX_Read() As Integer + + Return $hView.ClientX + _GetFrameWidth() + +End + +Private Function ClientY_Read() As Integer + + Return $hView.ClientY + _GetFrameWidth() + +End + +Private Function ClientW_Read() As Integer + + Return $hView.ClientW - _GetFrameWidth() * 2 + +End + +Private Function ClientH_Read() As Integer + + Return $hView.ClientH - _GetFrameWidth() * 2 + +End + +Public Sub ScrollArea_Scroll() + + Raise Scroll + +End + +Public Sub _RaiseSelect() + + If $bDoNotRaiseSelect Then Return + $hView.Refresh + Raise Select + +End + +Public Sub Select(Optional Start As Integer = 0, Optional Length As Integer = 1) + + $hRows.Select(Start, Length) + +End + +Public Sub SelectAll() + + $hRows.SelectAll + +End + +Public Sub UnselectAll() + + $hRows.UnSelectAll + +End + +Private Function Scrollbar_Read() As Integer + + Return $hView.ScrollBar + +End + +Private Sub Scrollbar_Write(Value As Integer) + + $hView.ScrollBar = Value + +End + +Private Function AutoResize_Read() As Boolean + + Return $bAutoResize + +End + +Private Sub AutoResize_Write(Value As Boolean) + + $bAutoResize = Value + $hColumns._Layout + +End + +Private Function Header_Read() As Integer + + Return $iHeader + +End + +Private Sub Header_Write(Value As Integer) + + Value = Value And 3 + + $iHeader = Value + $hColumns._Layout + $hView.Refresh + +End + +Public Sub ScrollArea_KeyPress() + + Dim iRow As Integer + Dim bStop As Boolean + Dim iCode As Integer + + $bKeyEvent = True + + iCode = Key.Code + If System.RightToLeft Then + If iCode = Key.Left Then + iCode = Key.Right + Else If iCode = Key.Right Then + iCode = Key.Left + Endif + Endif + + Select iCode + + Case Key.Up, Key.Down, Key.Left, Key.Right, Key.Home, Key.End, Key.PageUp, Key.PageDown, Key.Space + + bStop = Raise KeyPress + If bStop Then + Stop Event + Goto _RETURN + Endif + + If $iMode = Select.Multiple Then + $bMoveSelect = Key.Shift + If $bMoveSelect And If $iMoveSelectRow < 0 Then + $iMoveSelectRow = $iRow + $vMoveOldSelection = $hRows._SaveSelection() + Endif + Endif + + End Select + + Select iCode + + Case Key.Up + If $iRow > 0 Then MoveTo($iRow - 1, $iCol) + Stop Event + + Case Key.Down + If $iRow < ($hRows.Count - 1) Then MoveTo($iRow + 1, $iCol) + Stop Event + + Case Key.Left + If $iRow >= 0 Then + If $iCol > 0 Then + MoveTo($iRow, $iCol - 1) + Else If $iRow > 0 Then + MoveTo($iRow - 1, $hColumns.Count - 1) + Endif + Endif + Stop Event + + Case Key.Right + If $iRow >= 0 Then + If $iCol < ($hColumns.Count - 1) Then + MoveTo($iRow, $iCol + 1) + Else If $iRow < ($hRows.Count - 1) Then + MoveTo($iRow + 1, 0) + Endif + Endif + Stop Event + + Case Key.Home + If Key.Control Or If Not $bShowCursor Then + MoveTo(0, 0) + Else + MoveTo($iRow, 0) + Endif + Stop Event + + Case Key.End + If Key.Control Or If Not $bShowCursor Then + MoveTo($hRows.Count - 1, $hColumns.Count - 1) + Else + MoveTo($iRow, $hColumns.Count - 1) + Endif + Stop Event + + Case Key.PageUp + iRow = $hRows._FindRowFromPos($hRows._GetRowY($iRow) + $hRows._GetRowHeight($iRow) - ($hView.ClientH - $hColumns.H - _GetFrameWidth() * 2)) + If iRow >= 0 Then + MoveTo(iRow, $iCol) + Else + MoveTo(0, $iCol) + Endif + Stop Event + + Case Key.PageDown + iRow = $hRows._FindRowFromPos($hRows._GetRowY($iRow) + $hView.ClientH - $hColumns.H - _GetFrameWidth() * 2) + If iRow >= 0 Then + MoveTo(iRow, $iCol) + Else + MoveTo($hRows.Count - 1, $iCol) + Endif + Stop Event + + Case Key.Space + If $iRow >= 0 And If $iMode = Select.Multiple Then + If $hRows._IsSelected($iRow) Then + $hRows.UnSelect($iRow) + Else + $hRows.Select($iRow) + Endif + Endif + Stop Event + + End Select + +_RETURN: + + $bKeyEvent = False + +End + +Private Sub MakeSpan(iRowSpan As Integer, iColSpan As Integer) As Integer + + Return Lsl(iRowSpan, 16) Or (iColSpan And &HFFFF&) + +End + +Private Sub UnmakeSpan(iSpan As Integer) As Short[] + + Return [CShort(Lsr(iSpan, 16)), CShort(iSpan And &HFFFF&)] + +End + + +Public Sub _SetSpan(iRow As Integer, iCol As Integer, iRowSpan As Integer, iColSpan As Integer) + + Dim aOldSpan As Short[] + Dim iOldRowSpan As Integer + Dim iOldColSpan As Integer + Dim I, J As Integer + + If iRow < 0 Or If iCol < 0 Or If iRow >= $hRows.Count Or If iCol >= $hColumns.Count Then Return + + If iRowSpan < -32768 Or If iRowSpan > 32767 Then Return + If iColSpan < -32768 Or If iColSpan > 32767 Then Return + + If iRowSpan > 0 And If iColSpan < 0 Then iColSpan = 0 + If iColSpan > 0 And If iRowSpan < 0 Then iRowSpan = 0 + + aOldSpan = _GetSpan(iRow, iCol) + iOldRowSpan = aOldSpan[0] + iOldColSpan = aOldSpan[1] + + If (iOldRowSpan < 0 Or iOldColSpan < 0) And If (iRowSpan <> 0 Or iColSpan <> 0) Then Return + + $cSpan.Remove(GetCellKey(iRow, iCol)) + + If iOldColSpan > 0 Or If iOldRowSpan > 0 Then + + I = 1 + J = 0 + Do + If I > iOldColSpan Then + I = 0 + Inc J + If J > iOldRowSpan Then Break + Endif + _SetSpan(iCol + I, iRow + J, 0, 0) + Inc I + Loop + + Endif + + If iRowSpan = 0 And If iColSpan = 0 Then Return + + $cSpan[GetCellKey(iRow, iCol)] = MakeSpan(iRowSpan, iColSpan) + + If iRowSpan >= 0 And If iColSpan >= 0 Then + + For I = 0 To iRowSpan + For J = 0 To iColSpan + If I = 0 And If J = 0 Then Continue + _SetSpan(iRow + I, iCol + J, -I, -J) + Next + Next + + Endif + +End + +Private Sub HasSpan(iRow As Integer, iCol As Integer) As Boolean + + Return $cSpan.Exist(GetCellKey(iRow, iCol)) + +End + + +Public Sub _GetSpan(iRow As Integer, iCol As Integer) As Short[] + + Dim aSpan As New Short[2] + Dim iSpan As Integer + + If iRow < 0 Or If iCol < 0 Or If iRow >= $hRows.Count Or If iCol >= $hColumns.Count Then Return aSpan + Try iSpan = $cSpan[GetCellKey(iRow, iCol)] + If iSpan = 0 Then Return aSpan + aSpan = UnmakeSpan(iSpan) + aSpan[0] = Min(aSpan[0], $hRows.Count - iRow - 1) + aSpan[1] = Min(aSpan[1], $hColumns.Count - iCol - 1) + Return aSpan + +End + + +Private Function ShowCursor_Read() As Boolean + + Return $bShowCursor + +End + +Private Sub ShowCursor_Write(Value As Boolean) + + $bShowCursor = Value + $hView.Refresh + +End + +Public Sub _GetCellWidth(iRow As Integer, iCol As Integer) As Integer + + Dim W, I As Integer + + If Not HasSpan(iRow, iCol) Then Return $hColumns[iCol].Width + + For I = iCol To iCol + Max(0, _GetSpan(iRow, iCol)[1]) + W += $hColumns[I].Width + Next + + Return W + +End + +Public Sub _GetCellHeight(iRow As Integer, iCol As Integer) As Integer + + Dim H, I As Integer + + If Not HasSpan(iRow, iCol) Then Return $hRows._GetRowHeight(iRow) + + For I = iRow To iRow + Max(0, _GetSpan(iRow, iCol)[0]) + H += $hRows._GetRowHeight(I) + Next + + Return H + +End + +Private Function Current_Read() As _GridView_Cell + + If $iRow < 0 Or If $iCol < 0 Then Return + Return _get($iRow, $iCol) + +End + +Public Sub RowAt(Y As Integer) As Integer + + Y -= $hColumns.Height + If Y < 0 Then Return -1 + + Return $hRows._FindRowFromPos(Y + $hView.ScrollY) + +End + +Public Sub ColumnAt(X As Integer) As Integer + + X -= $hRows.Width + $hView.Proxy.X + If X < 0 Then Return -1 + + Return $hColumns._FindColumnFromPos(X + $hView.ScrollX) + +End + +Public Sub _GetVisibleWidth() As Integer + + Return $hView.ClientW - _GetFrameWidth() * 2 - $hRows.Width + +End + +Public Sub ScrollArea_Resize() + + 'Debug $hView.ClientW + $hColumns.Column__Refresh + +End + +Public Sub ScrollArea_Arrange() + + 'Debug $hView.ClientW + $hColumns.Column__Refresh + +End + +Private Sub MoveCell(iRowSrc As Integer, iColSrc As Integer, iRowDst As Integer, iColDst As Integer) + + Dim S, D As String + + S = GetCellKey(iRowSrc, iColSrc) + D = GetCellKey(iRowDst, iColDst) + + $cCells[D] = $cCells[S] + $cCells[S] = Null + + ' If HasSpan(iRowSrc, iColSrc) Then + ' aSpan = _GetSpan(iRowSrc, iColSrc) + ' _SetSpan(iRowSrc, iColSrc, 0, 0) + ' _SetSpan(iRowDst, iColDst, aSpan[0], aSpan[1]) + ' Endif + +End + + +Public Sub _RemoveRows(Start As Integer, Length As Integer) + + Dim I, J, D As Integer + + If Start < 0 Or If Start >= $hRows.Count Or Length <= 0 Or (Start + Length) > $hRows.Count Then Error.Raise("Bad argument") + + D = Start + + 'For J = 0 To $hColumns.Max + ' _SetSpan(D, J, 0, 0) + 'Next + + For I = Start + Length To $hRows.Max + For J = 0 To $hColumns.Max + MoveCell(I, J, D, J) + Next + Inc D + Next + + $hRows._GetSelection().RemoveRows(Start, Length) + $hRows.Count -= Length + +End + +Public Sub _InsertRows(Start As Integer, Length As Integer) + + Dim I, J As Integer + + If Start < 0 Or If Length <= 0 Or If Start > $hRows.Count Then Error.Raise("Bad argument") + + For I = $hRows.Max DownTo Start + For J = 0 To $hColumns.Max + MoveCell(I, J, I + Length, J) + Next + Next + + $hRows._GetSelection().InsertRows(Start, Length) + $hRows.Count += Length + +End + +Public Sub _GetTextHeight() As Integer + + If $iTextHeight = 0 Then $iTextHeight = Me.Font.TextHeight(" ") + Return $iTextHeight + +End + +' Private Function Mouse_Read() As Integer +' +' Return Super.Mouse +' +' End +' +' Private Sub Mouse_Write(Value As Integer) +' +' Super.Mouse = Value +' $iDefaultMouse = Value +' +' End + +Public Sub _GetPreferredWidth(iCol As Integer) As Integer + + Dim PW, W, I As Integer + Dim hData As _GridView_Data + Dim hFont As Font + Dim iColSpan As Integer + Dim D As Integer + Dim iPadding As Integer + Dim fTime As Float + Dim hBorder As Border + Dim fDiff As Float + Dim bBusy As Boolean + Dim J As Integer + + PW = Me.Font.TextWidth($hColumns[iCol].Text) + Max(Desktop.Scale \ 2, $iPadding) * 2 + If($bSorted, 16, 0) + 2 + + fTime = Timer + + For J = 0 To $hRows.Max Step 10000 + + For I = J To Min($hRows.Max, J + 9999) + + hData = _GetCellData(I, iCol) + + If HasSpan(I, iCol) Then + iColSpan = _GetSpan(I, iCol)[1] + If iColSpan < 0 Then + hData = _GetCellData(I, iCol + iColSpan) + iColSpan = _GetSpan(I, iCol + iColSpan)[1] + Endif + D = iColSpan + 1 + Else + D = 1 + Endif + + With hData + + iPadding = Max($iPadding, .Padding) + W = iPadding * 2 + hFont = .Font + If Not hFont Then hFont = Me.Font + + If .RichText Then + If Not .WordWrap Then W += hFont.RichTextWidth(.RichText) + Else If .Text Then + If Not .WordWrap Then W += hFont.TextWidth(.Text) + Endif + + If .Picture Then + W += .Picture.Width + If .Text Or If .RichText Then W += iPadding + Endif + + hBorder = .Border + + If hBorder Then + With hBorder + W += .LeftPadding + .LeftWidth + .RightPadding + .RightWidth + .LeftMargin + .RightMargin + End With + Endif + + If iCol = 0 Or If iCol = $hColumns.Max Then + hBorder = $hRows._GetRowBorder(I) + If hBorder Then + With hBorder + If iCol = 0 Then W += .LeftPadding + .LeftMargin + .LeftWidth + If iCol = $hColumns.Max Then W += .RightPadding + .RightMargin + .RightWidth + End With + Endif + Endif + + PW = Max(PW, (W + D - 1) \ D) + + End With + + Next + + fDiff = Timer - fTime + 'Debug fDiff + If fDiff > 1 Then + If Not bBusy Then + Inc Application.Busy + bBusy = True + Endif + If fDiff > 5 Then Break + Endif + + Next + + If bBusy Then Dec Application.Busy + + Return PW + 2 + +End + +Public Sub _GetPreferredHeight(iRow As Integer) As Integer + + Dim PH, H, I, J, WC As Integer + Dim hSpan As Short[] + Dim hData As _GridView_Data + Dim hFont As Font + Dim iRowSpan, iColSpan As Integer + Dim iCol As Integer + Dim D As Integer + Dim iPadding As Integer + Dim WT As Float + Dim hBorder As Border + Dim hTopBorder As Border + Dim hBottomBorder As Border + + PH = $hRows.Height + + For I = 0 To $hColumns.Max + + iCol = I + + If HasSpan(iRow, iCol) Then + hSpan = _GetSpan(iRow, iCol) + iRowSpan = hSpan[0] + iColSpan = hSpan[1] + If iRowSpan < 0 Then iRow += iRowSpan + If iColSpan < 0 Then iCol += iColSpan + hData = _GetCellData(iRow, iCol) + hSpan = _GetSpan(iRow, iCol) + iRowSpan = hSpan[0] + iColSpan = hSpan[1] + D = iRowSpan + 1 + Else + D = 1 + iRowSpan = 0 + iColSpan = 0 + hData = _GetCellData(iRow, iCol) + Endif + + WC = $hColumns[iCol].W + For J = 1 To iColSpan + WC += $hColumns[iCol + J].Width + Next + + If Not hData Then Continue + + With hData + + iPadding = Max($iPadding, .Padding) + H = iPadding * 2 + hFont = .Font + If Not hFont Then hFont = Me.Font + + WT = WC - iPadding * 2 - 2 + + hBorder = $hRows._GetRowBorder(iRow) + If hBorder Then WT -= hBorder.LeftPadding + hBorder.RightPadding + hBorder.LeftMargin + hBorder.RightMargin + hBorder.LeftWidth + hBorder.RightWidth + hBorder = .Border + If hBorder Then WT -= hBorder.LeftPadding + hBorder.RightPadding + hBorder.LeftMargin + hBorder.RightMargin + hBorder.LeftWidth + hBorder.RightWidth + + If .RichText Then + If .WordWrap Then + H += hFont.RichTextHeight(.RichText, WT) + Else + H += hFont.RichTextHeight(.RichText) + Endif + Else If .Text Then + If .WordWrap Then + H += hFont.RichTextHeight(Replace(Html(.Text), "\n", "
        "), WT) + Else + H += hFont.TextHeight(.Text) + Endif + Endif + + If .Picture Then + H = Max(.Picture.H + iPadding * 2, H) + Endif + + hBorder = $hRows._GetRowBorder(iRow) + If iRow > 0 Then hTopBorder = $hRows._GetRowBorder(iRow - 1) + If iRow < $hRows.Max Then hBottomBorder = $hRows._GetRowBorder(iRow + 1) + + If hBorder Then + With hBorder + H += .TopPadding + .TopWidth + .BottomPadding + .BottomWidth + .TopMargin + .BottomMargin + If hTopBorder Then H = H - .TopMargin + Max(.TopMargin, hTopBorder.BottomMargin) / 2 + If hBottomBorder Then H = H - .BottomMargin + Max(.BottomMargin, hBottomBorder.TopMargin) / 2 + End With + Endif + + hBorder = .Border + + If hBorder Then + With hBorder + H += .TopPadding + .TopWidth + .BottomPadding + .BottomWidth + .TopMargin + .BottomMargin + End With + Endif + + PH = Max(PH, (H + D - 1) \ D) + + End With + + Next + + Return PH + +End + +Public Sub _RaiseRowResize(iRow As Integer) + + Raise RowResize(iRow) + +End + +Public Sub _RaiseColumnResize(iCol As Integer) + + Raise ColumnResize(iCol) + +End + +Public Sub _RaiseSort() + + Raise Sort + +End + + +Private Function Sorted_Read() As Boolean + + Return $bSorted + +End + +Private Sub Sorted_Write(Value As Boolean) + + $bSorted = Value + If Not $bSorted Then + $hColumns.Sort = -1 + Else + $hColumns.Sort = 0 + $hColumns.Ascending = True + Endif + + Me.Refresh + +End + +Public Sub Scroll(X As Integer, Y As Integer) + + $hView.Scroll(X, Y) + +End + +Public Sub _RaiseColumnSize(iCol As Integer) As Boolean + + Dim bCancel As Boolean + + If Not Object.CanRaise(Me, "ColumnSize") Then Return True + bCancel = Raise ColumnSize(iCol) + Return bCancel + +End + +Public Sub _RaiseRowSize(iRow As Integer) As Boolean + + Dim bCancel As Boolean + + If Not Object.CanRaise(Me, "RowSize") Then Return True + bCancel = Raise RowSize(iRow) + Return bCancel + +End + +Private Function Background_Read() As Integer + + Return $iBg + +End + +Private Sub Background_Write(Value As Integer) + + If $iBg = Value Then Return + $iBg = Value + $hView.Background = Value + $hView.Refresh + +End + +Public Sub GridViewClick_Timer() + + If $bInCell Then Raise Click + +End + +Private Function Padding_Read() As Integer + + Return $iPadding + +End + +Private Sub Padding_Write(Value As Integer) + + If $iPadding = Value Then Return + $iPadding = Value + ScrollArea_Arrange + $hView.Refresh + +End + +Public Sub ScrollArea_Font() + + 'Debug Me.Name + $iTextHeight = 0 + $hColumns._Layout + '$hRows._Clear + _ResizeContents + Raise Font + +End + +Public Sub _RefreshRow(iRow As Integer) + + $hView.RefreshRect(0, $hRows._GetRowY(iRow), $hView.ScrollW, $hRows._GetRowHeight(iRow)) + +End + +Public Sub AddColumn(Text As String, Optional Width As Integer, Alignment As Integer = Align.Normal) As _GridView_Column + + Dim hCol As _GridView_Column + + Inc $hColumns.Count + + hCol = $hColumns[$hColumns.Max] + hCol.Text = Text + If Width < 0 Then + hCol.Expand = True + Else If Width Then + hCol.Width = Width + Endif + hCol.Alignment = Alignment + + Return hCol + +End + diff --git a/comp/src/gb.gui.base/.src/GridView/GridViewSelection.class b/comp/src/gb.gui.base/.src/GridView/GridViewSelection.class new file mode 100644 index 00000000..8263d2b3 --- /dev/null +++ b/comp/src/gb.gui.base/.src/GridView/GridViewSelection.class @@ -0,0 +1,197 @@ +' Gambas class file + +Private $aSel As New Integer[] + +' Private Sub Dump() +' +' Dim I As Integer +' ' +' ' Print System.Backtrace.Join(" ") +' ' +' Print "Selection = "; +' For I = 0 To $aSel.Max Step 2 +' Print "["; $aSel[I]; ","; $aSel[I + 1]; "] "; +' Next +' Print +' +' End + +Public Sub Save() As Variant + + Return $aSel.Copy() + +End + +Public Sub Restore(vSel As Variant) + + $aSel = vSel.Copy() + +End +' +Public Sub Select(iStart As Integer, Optional iLength As Integer = 1) + + Dim I, S, L As Integer + + For I = 0 To $aSel.Max Step 2 + + S = $aSel[I] + L = $aSel[I + 1] + + If iStart >= S And If iStart <= (S + L) Then + $aSel[I + 1] = iStart + iLength - S + 'Dump + Return + Else If (iStart + iLength) >= S And If (iStart + iLength) <= (S + L) Then + $aSel[I + 1] += $aSel[I] - iStart + $aSel[I] = iStart + 'Dump + Return + Endif + + Next + + $aSel.Add(iStart) + $aSel.Add(iLength) + 'Dump + +End + +Public Sub UnSelect(iStart As Integer, Optional iLength As Integer = 1) + + Dim I, S, L As Integer + + I = 0 + While I < $aSel.Count + + S = $aSel[I] + L = $aSel[I + 1] + + If (iStart + iLength) > S And If iStart < (S + L) Then + + If iStart <= S And If (iStart + iLength) >= (S + L) Then + $aSel.Remove(I, 2) + Continue + Endif + + If iStart <= S Then + $aSel[I + 1] -= iStart + iLength - S + $aSel[I] = iStart + iLength + Else If (iStart + iLength) >= (S + L) Then + $aSel[I + 1] = iStart - S + Else + $aSel[I + 1] = iStart - S + $aSel.Add(iStart + iLength) + $aSel.Add(S + L - iStart - iLength) + Endif + + Endif + + I += 2 + Wend + 'Dump + +End + +Public Sub UnSelectAll() + + $aSel.Clear + +End + +Public Sub SelectAll(nRows As Integer) + + UnSelectAll + Select(0, nRows) + +End + + +Public Sub IsSelected(iIndex As Integer) As Boolean + + Dim I, S, L As Integer + + For I = 0 To $aSel.Max Step 2 + + S = $aSel[I] + L = $aSel[I + 1] + + If iIndex >= S And iIndex < (S + L) Then Return True + + Next + +End + +Public Function _GetSelectedRows(iCount As Integer) As Integer[] + + Dim aRet As New Integer[] + Dim I, J, S, L As Integer + + For I = 0 To $aSel.Max Step 2 + S = $aSel[I] + L = $aSel[I + 1] + + For J = 0 To L - 1 + If (S + J) >= iCount Then Break + aRet.Add(S + J) + Next + Next + + Return aRet + +End + +Public Sub InsertRows(iStart As Integer, iLength As Integer) + + Dim I, S, L As Integer + + For I = 0 To $aSel.Max Step 2 + + S = $aSel[i] + L = $aSel[I + 1] + + If iStart <= S Then + $aSel[I] += iLength + Else If iStart <= (S + L) Then + $aSel[I + 1] = iStart - S + $aSel.Add(iStart + iLength) + $aSel.Add(L - (iStart - S)) + Endif + + Next + + 'Dump + +End + +Public Sub RemoveRows(iStart As Integer, iLength As Integer) + + Dim I, S, L As Integer + + I = 0 + While I < $aSel.Count + + S = $aSel[I] + L = $aSel[I + 1] + + If (iStart + iLength) <= S Then + $aSel[I] -= iLength + Else If iStart >= (S + L) Then + Else + If iStart < S Then + iLength -= (S - iStart) + $aSel[I] = iStart + Endif + $aSel[I + 1] -= iLength - (iStart - S) + Endif + + If $aSel[I + 1] <= 0 Then + $aSel.Remove(I, 2) + Else + I += 2 + Endif + + Wend + + 'Dump + +End diff --git a/comp/src/gb.gui.base/.src/GridView/_GridView_Cell.class b/comp/src/gb.gui.base/.src/GridView/_GridView_Cell.class new file mode 100644 index 00000000..96a1b7fe --- /dev/null +++ b/comp/src/gb.gui.base/.src/GridView/_GridView_Cell.class @@ -0,0 +1,244 @@ +' Gambas class file + +Export + +Event _Foo + +Property Text As String +Property RichText As String +Property Picture As Picture +Property Font As Font +Property Alignment As Integer +Property WordWrap As Boolean +Property Background As Integer +Property Foreground As Integer +Property Padding As Integer +Property RowSpan As Integer +Property ColumnSpan As Integer +Property Border As Border + +Property Read X, {Left} As Integer +Property Read Y, {Top} As Integer +Property Read Width, W As Integer +Property Read Height, H As Integer + +Public _Row As Integer +Public _Column As Integer +Public _View As GridView + +Private Sub GetData(bCreate As Boolean) As _GridView_Data + + _View._CheckCell(_Row, _Column) + If bCreate Then _View.Refresh + Return _View._GetCellData(_Row, _Column, bCreate) + +End + + +Private Function Text_Read() As String + + Return GetData(False).Text + +End + +Private Sub Text_Write(Value As String) + + GetData(True).Text = Value + +End + +Private Function Picture_Read() As Picture + + Return GetData(False).Picture + +End + +Private Sub Picture_Write(Value As Picture) + + GetData(True).Picture = Value + +End + + +Private Function X_Read() As Integer + + Return _View.Columns[_Column].X + _View.Proxy.Proxy.X + +End + +Private Function Y_Read() As Integer + + Return _View.Rows[_Row].Y + +End + +Private Function Width_Read() As Integer + + Dim W As Integer = _View._GetCellWidth(_Row, _Column) + If _View.Grid Then Dec W + Return W + +End + +Private Function Height_Read() As Integer + + Dim H As Integer = _View._GetCellHeight(_Row, _Column) + If _View.Grid Then Dec H + Return H + +End + +Private Function RichText_Read() As String + + Return GetData(False).RichText + +End + +Private Sub RichText_Write(Value As String) + + GetData(True).RichText = Value + +End + +Private Function Font_Read() As Font + + Return GetData(False).Font + +End + +Private Sub Font_Write(Value As Font) + + GetData(True).Font = Value + +End + +Private Function Alignment_Read() As Integer + + Return GetData(False).Alignment + +End + +Private Sub Alignment_Write(Value As Integer) + + GetData(True).Alignment = Value + +End + +Private Function WordWrap_Read() As Boolean + + Return GetData(False).WordWrap + +End + +Private Sub WordWrap_Write(Value As Boolean) + + GetData(True).WordWrap = Value + +End + +Private Function Background_Read() As Integer + + Return GetData(False).Background + +End + +Private Sub Background_Write(Value As Integer) + + GetData(True).Background = Value + +End + +Private Function Foreground_Read() As Integer + + Return GetData(False).Foreground + +End + +Private Sub Foreground_Write(Value As Integer) + + GetData(True).Foreground = Value + +End + +Public Sub Clear() + + _View._ClearCell(_Row, _Column) + +End + +Public Sub EnsureVisible() + + _View._EnsureVisible(_Row, _Column) + +End + +Public Sub Refresh() + + _View.Refresh + +End + + +Private Function Padding_Read() As Integer + + Return GetData(False).Padding + +End + +Private Sub Padding_Write(Value As Integer) + + GetData(True).Padding = Value + +End + +Private Function RowSpan_Read() As Integer + + Dim S As Integer = _View._GetSpan(_Row, _Column)[0] + If S >= 0 Then Return S + 1 + Return S + +End + +Private Sub RowSpan_Write(Value As Integer) + + Dim S As Integer = _View._GetSpan(_Row, _Column)[1] + + If S < 0 Then Return + If Value < 1 Or If Value > 32767 Then Return + + _View._SetSpan(_Row, _Column, Value - 1, S) + _View.Refresh + +End + +Private Function ColumnSpan_Read() As Integer + + Dim S As Integer = _View._GetSpan(_Row, _Column)[1] + If S >= 0 Then Return S + 1 + Return S + +End + +Private Sub ColumnSpan_Write(Value As Integer) + + Dim S As Integer = _View._GetSpan(_Row, _Column)[0] + + If S < 0 Then Return + If Value < 1 Or If Value > 32767 Then Return + + _View._SetSpan(_Row, _Column, S, Value - 1) + _View.Refresh + +End + +Private Function Border_Read() As Border + + Return GetData(False).Border + +End + +Private Sub Border_Write(Value As Border) + + GetData(True).Border = Value + +End diff --git a/comp/src/gb.gui.base/.src/GridView/_GridView_Column.class b/comp/src/gb.gui.base/.src/GridView/_GridView_Column.class new file mode 100644 index 00000000..2f7cc6db --- /dev/null +++ b/comp/src/gb.gui.base/.src/GridView/_GridView_Column.class @@ -0,0 +1,149 @@ +' Gambas class file + +Export + +Property Read X, {Left} As Integer +Property Width, W As Integer +Property Text, Title As String +Property Resizable As Boolean +Property Expand As Boolean +Property Alignment As Integer +Property Background As Integer + +Event _Refresh + +Public _X As Integer +Public _W As Integer +Public _Column As Integer + +Private $W As Integer +Private $sText As String +Private $bResizable As Boolean = True +Private $bExpand As Boolean +Private $iAlign As Integer +Private $iBackground As Integer = Color.Default + +Private Sub GetView() As GridView + + Return Object.Parent(Object.Parent(Me)) + +End + +Public Sub _new() + + $W = Desktop.Scale * 8 + +End + +Private Function Width_Read() As Integer + + Return Max(_W, $W) + +End + +Public Sub _GetExplicitWidth() As Integer + + Return $W + +End + + +Private Sub Width_Write(Value As Integer) + + Dim bCancel As Boolean + 'Dim bSetLayout As Boolean + + If Value < 0 Then + bCancel = GetView()._RaiseColumnSize(_Column) + If Not bCancel Then Return + Value = GetView()._GetPreferredWidth(_Column) + 'bSetLayout = True + Endif + + If Value < 0 Or If Value = $W Then Return + $W = Max(0, Value) + 'If bSetLayout Then _W = $W + _W = $W + Raise _Refresh + GetView()._RaiseColumnResize(_Column) + +End + +Private Function Text_Read() As String + + Return $sText + +End + +Private Sub Text_Write(Value As String) + + $sText = Value + $W = Max($W, GetView().Font.TextWidth($sText) + 8 + If(GetView().Sorted, 16, 0)) + Raise _Refresh + +End + +Private Function X_Read() As Integer + + Return _X + +End + +Private Function Resizable_Read() As Boolean + + Return $bResizable + +End + +Private Sub Resizable_Write(Value As Boolean) + + $bResizable = Value + +End + +Private Function Expand_Read() As Boolean + + Return $bExpand + +End + +Private Sub Expand_Write(Value As Boolean) + + $bExpand = Value + Raise _Refresh + +End + +Private Function Alignment_Read() As Integer + + Return $iAlign + +End + +Private Sub Alignment_Write(Value As Integer) + + Select Case Value + Case Align.Left, Align.Right, Align.Normal, Align.Center + Default + Return + End Select + + If $iAlign = Value Then Return + $iAlign = Value + GetView().Refresh + +End + +Private Function Background_Read() As Integer + + Return $iBackground + +End + +Private Sub Background_Write(Value As Integer) + + If $iBackground = Value Then Return + $iBackground = Value + GetView().Refresh + +End diff --git a/comp/src/gb.gui.base/.src/GridView/_GridView_Columns.class b/comp/src/gb.gui.base/.src/GridView/_GridView_Columns.class new file mode 100644 index 00000000..d550de4c --- /dev/null +++ b/comp/src/gb.gui.base/.src/GridView/_GridView_Columns.class @@ -0,0 +1,260 @@ +' Gambas class file + +Export + +Property Count As Integer +Property Read Max As Integer +Property Read Height, H As Integer +Property Resizable As Boolean +Property Width, W As Integer +Property Sort As Integer +Property Ascending As Boolean + +Event _Refresh + +Private $aColumns As New _GridView_Column[] +Private $iWidth As Integer +Private $iHeight As Integer +Private $bResizable As Boolean = True +Private $bLayouting As Boolean +Private $iSort As Integer = -1 +Private $bAscent As Boolean + +Private Sub GetView() As GridView + + Return Object.Parent(Me) + +End + + +Private Function Count_Read() As Integer + + Return $aColumns.Count + +End + +Private Sub Count_Write(Value As Integer) + + Dim iOldCount As Integer = $aColumns.Count + Dim I As Integer + + If Value = iOldCount Then Return + + Try $aColumns.Resize(Value) + If Error Then Error.Raise("Bad argument") + + If Value > iOldCount Then + If GetView().AutoResize And If iOldCount Then $aColumns[iOldCount - 1]._W = 0 + For I = iOldCount To Value - 1 + $aColumns[I] = New _GridView_Column As "Column" + $aColumns[I]._Column = I + Next + Endif + + GetView()._CheckCurrent + + _Layout + +End + +Public Sub Column__Refresh() + + _Layout + +End + +Private Function Height_Read() As Integer + + With GetView() + If $aColumns.Count Then + If .Header = .Horizontal Or If .Header = .Both Then Return $iHeight + 2 + Endif + End With + +End + +Public Sub _get(Index As Integer) As _GridView_Column + + Return $aColumns[Index] + +End + +Public Sub _GetWidth() As Integer + + Return $iWidth + +End + +Public Sub _FindColumnFromPos(X As Integer) As Integer + + Dim I As Integer + + If X < 0 Then Return -1 + + For I = 0 To $aColumns.Max + With $aColumns[I] + If X >= .X And If X < (.X + .Width) Then Return I + End With + Next + + Return -1 + +End + +Private Function Resizable_Read() As Boolean + + Return $bResizable + +End + +Private Sub Resizable_Write(Value As Boolean) + + $bResizable = Value + +End + +Public Sub _Layout() + + Dim hView As GridView = GetView() + Dim I, W, WX, N, NX, VW, H As Integer + Dim hCol As _GridView_Column + Dim X As Integer + Dim FH As Integer + + VW = hView._GetVisibleWidth() + N = $aColumns.Count - 1 + + 'Debug N + If N >= 0 And If hView.AutoResize And If Not $bLayouting Then + + $bLayouting = True + + For I = 0 To N + + With $aColumns[I] + If .Expand Then + WX = ._GetExplicitWidth() + If WX Then + W += WX + Inc NX + Endif + Else + W += .Width + Endif + End With + + Next + + If NX = 0 Then + + W = $aColumns[N].Width + VW - W + + If W > 0 Then + $aColumns[N]._W = W + Endif + + Else If W < VW Then + + For I = 0 To N + If $aColumns[I].Expand Then + WX = (VW - W) / NX + $aColumns[I]._W = $aColumns[I]._GetExplicitWidth() + WX + W += WX + Dec NX + If NX <= 0 Then Break + Endif + Next + + Endif + + $bLayouting = False + + Endif + + FH = GetView().Font.Height + For Each hCol In $aColumns + hCol._X = X + X += hCol.Width + H = Max(H, hView.Font.TextHeight(hCol.Text) + Max(hView.Padding * 2, Desktop.Scale)) + Next + + If System.RightToLeft Then + 'Debug ""; + I = 0 + For Each hCol In $aColumns + hCol._X = Max(X, VW) - hCol._X - hCol.Width + 'Error "["; I; "] "; hCol._X;; + Inc I + Next + 'Error + Endif + + If X <> $iWidth Or If H <> $iHeight Then + $iWidth = X + $iHeight = H + hView._ResizeContents + Endif + + hView.Refresh + +End + +Private Function Max_Read() As Integer + + Return $aColumns.Max + +End + +Private Function Width_Read() As Integer + + If $aColumns.Count Then Return $aColumns[0].Width + Return -1 + +End + +Private Sub Width_Write(Value As Integer) + + Dim hCol As _GridView_Column + + For Each hCol In $aColumns + Object.Lock(hCol) + hCol.Width = Value + Object.Unlock(hCol) + Next + _Layout + +End + +Private Function Sort_Read() As Integer + + Return $iSort + +End + +Private Sub Sort_Write(Value As Integer) + + If $iSort = Value Then Return + $iSort = Value + With GetView() + ._RaiseSort + .Refresh + End With + +End + +Private Function Ascending_Read() As Boolean + + Return $bAscent + +End + +Private Sub Ascending_Write(Value As Boolean) + + If $bAscent = Value Then Return + $bAscent = Value + With GetView() + ._RaiseSort + .Refresh + End With + +End diff --git a/comp/src/gb.gui.base/.src/GridView/_GridView_Data.class b/comp/src/gb.gui.base/.src/GridView/_GridView_Data.class new file mode 100644 index 00000000..f91b428f --- /dev/null +++ b/comp/src/gb.gui.base/.src/GridView/_GridView_Data.class @@ -0,0 +1,37 @@ +' Gambas class file + +Export + +Event _Fake + +Public Text As String +Public RichText As String + +Public (Picture) As Picture +Public Alignment As Integer = Align.Normal +Public Foreground As Integer = Color.Default +Public Background As Integer = Color.Default +Public Padding As Short +Public WordWrap As Boolean +Public Border As Border + +Property Font As Font + +Private $hFont As Font + +Private Function Font_Read() As Font + + Return $hFont + +End + +Private Sub Font_Write(Value As Font) + + If Value Then + $hFont = Value.Copy() + $hFont.Modified = True + Else + $hFont = Null + Endif + +End diff --git a/comp/src/gb.gui.base/.src/GridView/_GridView_Row.class b/comp/src/gb.gui.base/.src/GridView/_GridView_Row.class new file mode 100644 index 00000000..48b0365b --- /dev/null +++ b/comp/src/gb.gui.base/.src/GridView/_GridView_Row.class @@ -0,0 +1,109 @@ +' Gambas class file + +Export + +Event _Refresh + +Property Read Y, {Top} As Integer +Property Height, H As Integer +Property Selected As Boolean +Property Text, Title As String +Property Border As Border +Property TextAlignment As Integer + +Public _Row As Integer + +Private Sub GetRows() As _GridView_Rows + + Return Object.Parent(Me) + +End + +Private Sub GetView() As GridView + + Return Object.Parent(Object.Parent(Me)) + +End + +Private Function Height_Read() As Integer + + Return GetRows()._GetRowHeight(_Row) + +End + +Private Sub Height_Write(Value As Integer) + + GetRows()._SetRowHeight(_Row, Value) + +End + +Private Function Y_Read() As Integer + + Return GetRows()._GetRowY(_Row) + +End + +Private Function Selected_Read() As Boolean + + Return GetView()._IsRowSelected(_Row) + +End + +Private Sub Selected_Write(Value As Boolean) + + Dim hView As GridView = GetView() + Dim hRows As _GridView_Rows = GetRows() + + If hView.Mode = Select.Single Then + hView._SelectRow(_Row, Value) + Else If hView.Mode = Select.Multiple Then + If Value Then + If Not hRows._IsSelected(_Row) Then hRows.Select(_Row) + Else + If hRows._IsSelected(_Row) Then hRows.UnSelect(_Row) + Endif + Endif + +End + +Private Function Text_Read() As String + + Return GetRows()._GetRowText(_Row) + +End + +Private Sub Text_Write(Value As String) + + GetRows()._SetRowText(_Row, Value) + +End + +Public Sub Refresh() + + GetView()._RefreshRow(_Row) + +End + +Private Function Border_Read() As Border + + Return GetRows()._GetRowBorder(_Row) + +End + +Private Sub Border_Write(Value As Border) + + GetRows()._SetRowBorder(_Row, Value) + +End + +Private Function TextAlignment_Read() As Integer + + Return GetRows()._GetRowTextAlign(_Row) + +End + +Private Sub TextAlignment_Write(Value As Integer) + + GetRows()._SetRowTextAlign(_Row, Value) + +End diff --git a/comp/src/gb.gui.base/.src/GridView/_GridView_Rows.class b/comp/src/gb.gui.base/.src/GridView/_GridView_Rows.class new file mode 100644 index 00000000..159846c1 --- /dev/null +++ b/comp/src/gb.gui.base/.src/GridView/_GridView_Rows.class @@ -0,0 +1,558 @@ +' Gambas class file + +Export + +Property Count As Integer +Property Read Max As Integer +Property Width, W As Integer +Property Resizable As Boolean +Property Height, H As Integer +Property Selection As Integer[] +Property Border As Border + +Event _Refresh + +'Private $aRows As New _GridView_Row[] +Private $nRows As Integer +Private $cHeight As Collection +Private $aHeight As Integer[] +Private $bResizable As Boolean = True +Private $cText As Collection +Private $iDefaultHeight As Integer +Private $iWidth As Integer + +Private $hBorder As Border +Private $cBorder As Collection + +Private $cTextAlign As Collection + +Private $hSel As New GridViewSelection + +Public Sub _SetSelection(hSel As GridViewSelection) + + $hSel = hSel + +End + + +Public Sub _GetSelection() As GridViewSelection + + Return $hSel + +End + +Private Sub GetView() As GridView + + Return Object.Parent(Me) + +End + +Private Function Count_Read() As Integer + + Return $nRows + +End + +Private Sub Count_Write(Value As Integer) + + Dim hView As GridView = GetView() + Dim iRow As Integer + + If Value = $nRows Then Return + + $nRows = Value + + If $aHeight Then + While $aHeight.Count + If $aHeight[$aHeight.Max] < $nRows Then Break + iRow = $aHeight[$aHeight.Max] + $cHeight.Remove(iRow) + $aHeight.Remove($aHeight.Max) + If hView.Mode = Select.Multiple Then $hSel.UnSelect(iRow) + Wend + Endif + + If $cText Then + For Each $cText + If CInt($cText.Key) >= Value Then + 'Debug "Remove text from " & $cText.Key + $cText.Remove($cText.Key) + Endif + Next + Endif + + If $cBorder Then + For Each $cBorder + If CInt($cBorder.Key) >= Value Then + $cBorder.Remove($cBorder.Key) + Endif + Next + Endif + + If hView.Row >= $nRows Then hView.Row = -1 + + With hView + ._ResizeContents() + ._CheckCurrent() + .Refresh + End With + +End + +Public Sub _get(Row As Integer) As _GridView_Row + + Dim hRow As _GridView_Row + + hRow = New _GridView_Row As "Row" + hRow._Row = Row + Return hRow + +End + +Public Sub _GetDefaultRowHeight() As Integer + + Dim hView As GridView + Dim H As Integer + + If $iDefaultHeight > 0 Then Return $iDefaultHeight + hView = GetView() + + H = hView._GetTextHeight() + hView.Padding * 2 + 2 + If $hBorder Then + With $hBorder + H += .TopPadding + .BottomPadding + .TopWidth + .BottomWidth + .TopMargin + .BottomMargin + H -= (.TopMargin + .BottomMargin) / 2 + End With + Endif + Return H + +End + +Public Sub _GetRowY(iRow As Integer) As Integer + + Dim Y As Integer + Dim DH As Integer = _GetDefaultRowHeight() + Dim I As Integer + + Y = iRow * DH + + If $cHeight Then + + For Each I In $aHeight + If I < iRow Then Y += $cHeight[I] - DH + Next + Endif + + Return Y + +End + +Public Sub _GetRowHeight(iRow As Integer) As Integer + + Try Return $cHeight[iRow] + Return _GetDefaultRowHeight() + +End + +Private Sub AddSorted(iRow As Integer) + + Dim I, J As Integer + + I = 0 + J = $aHeight.Max + + If J < 0 Or If iRow > $aHeight[J] Then + $aHeight.Add(iRow) + Return + Endif + + '' TODO: Binary search + $aHeight.Add(iRow) + $aHeight.Sort + +End + +Public Sub _ResetRowHeight(iRow As Integer) + + Dim hView As GridView = GetView() + + If $cHeight.Exist(iRow) Then + $cHeight.Remove(iRow) + $aHeight.Remove($aHeight.Find(iRow)) + hView._ResizeContents() + hView._RaiseRowResize(iRow) + Endif + +End + +Public Sub _SetRowHeight(iRow As Integer, H As Integer) + + Dim hView As GridView = GetView() + Dim DH As Integer = _GetDefaultRowHeight() + Dim OH As Integer + Dim bCancel As Boolean + + H = Min(1024, H) + + If Not $cHeight Then + $cHeight = New Collection + $aHeight = New Integer[] + Endif + + If H < 0 Then + bCancel = hView._RaiseRowSize(iRow) + If Not bCancel Then Return + H = hView._GetPreferredHeight(iRow) + Endif + + If H = DH Then + _ResetRowHeight(iRow) + Return + Endif + + If H >= 0 Then + OH = -1 + Try OH = $cHeight[iRow] + If H <> OH Then + If OH < 0 Then AddSorted(iRow) + $cHeight[iRow] = H + hView._ResizeContents() + hView._RaiseRowResize(iRow) + Endif + Endif + +End + +Private Function Width_Read() As Integer + + With GetView() + If $nRows Then + If .Header = .Vertical Or If .Header = .Both Then + If $iWidth Then + Return $iWidth + Else + Return Max(.Font.TextWidth("9"), .Font.TextWidth("0")) * (2 + CInt(Log10(Max(1, $nRows)))) + .Padding * 2 + 2 + Endif + Endif + Endif + End With + +End + +Public Sub _GetHeight() As Integer + + Dim H, DH, HR As Integer + + DH = _GetDefaultRowHeight() + H = DH * $nRows + If $cHeight Then + H -= DH * $cHeight.Count + For Each HR In $cHeight + H += HR + Next + Endif + + Return H + +End + +Public Sub _FindRowFromPos(Y As Integer) As Integer + + Dim iRow, YY, H As Integer + Dim DH As Integer = _GetDefaultRowHeight() + + If $cHeight Then + For Each iRow In $aHeight + YY = iRow * DH + If Y < YY Then Break + H = $cHeight[iRow] + If Y < (YY + H) Then Return iRow + Y -= H - DH + Next + Endif + + iRow = Y / DH + If iRow < 0 Or If iRow >= $nRows Then iRow = -1 + Return iRow + +End + +Private Function Resizable_Read() As Boolean + + Return $bResizable + +End + +Private Sub Resizable_Write(Value As Boolean) + + $bResizable = Value + +End + +Public Sub _GetRowText(iRow As Integer) As String + + Dim sText As String + + If $cText Then sText = $cText[iRow] + If Not sText Then sText = CStr(iRow + 1) + Return sText + +End + +Public Sub _SetRowText(iRow As Integer, sText As String) + + Dim W As Integer + + If Not $cText Then $cText = New Collection + $cText[iRow] = sText + If sText Then + W = GetView().Font.TextWidth(sText) + 8 + If W > Width_Read() Then $iWidth = W + Endif + GetView().Refresh + +End + +Public Sub Select(Optional Start As Integer = 0, Optional Length As Integer = 1) + + Dim hView As GridView = GetView() + + If hView.Mode = Select.Single And If Length = 1 Then + + hView.Row = Start + + Else If hView.Mode = Select.Multiple Then + + If Start < 0 Then Return + If Start >= $nRows Then Return + If Length < 0 Then Length = $nRows - Start + + $hSel.Select(Start, Length) + hView.Refresh + hView._RaiseSelect + + Endif + +End + +Public Sub UnSelect(Optional Start As Integer = 0, Optional Length As Integer = 1) + + Dim hView As GridView = GetView() + + If hView.Mode = Select.Single And If Length = 1 And If hView.Row = Start Then + + hView.Row = -1 + + Else If hView.Mode = Select.Multiple Then + + If Start < 0 Then Return + If Start >= $nRows Then Return + If Length < 0 Then Length = $nRows - Start + + $hSel.UnSelect(Start, Length) + hView._RaiseSelect + + Endif + +End + +Public Sub SelectAll() + + Dim hView As GridView = GetView() + + If hView.Mode <> Select.Multiple Then Return + + $hSel.SelectAll($nRows) + hView._RaiseSelect + +End + +Public Sub UnSelectAll() + + Dim hView As GridView = GetView() + + If hView.Mode = Select.Single Then + + $hSel.UnSelectAll + hView.Row = -1 + + Else If hView.Mode = Select.Multiple Then + + $hSel.UnSelectAll + hView.Refresh + hView._RaiseSelect + + Endif + +End + +Public Sub _IsSelected(iRow As Integer) As Boolean + + Return $hSel.IsSelected(iRow) + +End + +Public Sub _SaveSelection() As Variant + + Return $hSel.Save() + +End + +Public Sub _RestoreSelection(vSel As Variant) + + $hSel.Restore(vSel) + +End + +Private Sub Height_Read() As Integer + + Return _GetDefaultRowHeight() + +End + +Private Sub Height_Write(Value As Integer) + + $iDefaultHeight = Value + GetView()._ResizeContents() + +End + +Private Function Max_Read() As Integer + + Return $nRows - 1 + +End + +Private Sub Width_Write(Value As Integer) + + $iWidth = Max(0, Value) + +End + +Public Sub Remove(Start As Integer, Optional Length As Integer = 1) + + GetView()._RemoveRows(Start, Length) + +End + +Public Sub Insert(Start As Integer, Optional Length As Integer = 1) + + GetView()._InsertRows(Start, Length) + +End + +Public Sub _Clear() + + If $cHeight Then + $cHeight.Clear + $aHeight.Clear + If $cText Then $cText.Clear + Endif + + $hSel.UnSelectAll + +End + +'' Return an integer array of all the selected rows + +Private Function Selection_Read() As Integer[] + + Dim hView As GridView = GetView() + + If hView.Mode = Select.Single Then + If hView.Row >= 0 Then + Return [hView.Row] + Endif + Else If hView.Mode = Select.Multiple Then + Return $hSel._GetSelectedRows($nRows) + Endif + + Return New Integer[] + +End + +Private Sub Selection_Write(Value As Integer[]) + + Dim hView As GridView = GetView() + Dim iRow As Integer + + If hView.Mode = Select.Single Then + If Not Value Then + hView.Row = -1 + Else + hView.Row = Value[Value.Max] + Endif + Else If hView.Mode = Select.Multiple Then + $hSel.UnSelectAll + For Each iRow In Value + $hSel.Select(iRow) + Next + hView.Refresh + Endif + +End + +Private Function Border_Read() As Border + + Return $hBorder + +End + +Private Sub Border_Write(Value As Border) + + $hBorder = Value + +End + +Public Sub _SetRowBorder(iRow As Integer, hBorder As Border) + + If Not $cBorder Then $cBorder = New Collection + $cBorder[iRow] = hBorder + +End + +Public Sub _GetRowBorder(iRow As Integer) As Border + + Dim hBorder As Border + + If $cBorder Then hBorder = $cBorder[iRow] + If Not hBorder Then hBorder = $hBorder + + If hBorder And If Not hBorder.IsVoid() Then Return hBorder + +End + +Public Sub _SetRowTextAlign(iRow As Integer, iAlign As Integer) + + Select Case iAlign + Case Align.Left, Align.Right, Align.Center, Align.Normal + Default + Return + End Select + + If Not $cTextAlign Then + If iAlign = Align.Center Then Return + $cTextAlign = New Collection + $cTextAlign.Default = Align.Center + Endif + + If iAlign = Align.Center Then + $cTextAlign.Remove(iRow) + Else + $cTextAlign[iRow] = iAlign + Endif + + GetView().Refresh + +End + +Public Sub _GetRowTextAlign(iRow As Integer) As Integer + + If $cTextAlign Then + Return $cTextAlign[iRow] + Else + Return Align.Normal + Endif + +End + diff --git a/comp/src/gb.gui.base/.src/IconView/IconView.class b/comp/src/gb.gui.base/.src/IconView/IconView.class new file mode 100644 index 00000000..e9ab8952 --- /dev/null +++ b/comp/src/gb.gui.base/.src/IconView/IconView.class @@ -0,0 +1,1639 @@ +' Gambas class file + +Export + +Inherits UserControl + +Public Const _Properties As String = "*,Picture,Mode{Select.*}=Single,Orientation{Arrange.Horizontal;Vertical}=Vertical,Sorted,Editable,GridSize{Range:0;128},IconLines{Range:1;8}=2,Border=True,ScrollBar{Scroll.*}=Both" +Public Const _Group As String = "View" +Public Const _DefaultEvent As String = "Click" +Public Const _Similar As String = "ListView" + +Property Mode As Integer +Property Orientation As Integer +Property Border As Boolean +Property ScrollBar As Integer +Property Background As Integer + +Property Read Count As Integer +Property Read Current As _IconView_Item +Property Read Item As _IconView_Item +Property Read Available As Boolean +Property Key As String +Property Read Keys As String[] +Property Compare As Integer +Property Editable As Boolean +Property Sorted As Boolean +Property Ascending As Boolean +Property Picture As Picture + +Property Read IconSize As Integer +Property IconLines As Integer +Property GridSize As Integer +Property Read Renaming As Boolean + +Property Read ClientWidth, ClientW As Integer +Property Read ClientHeight, ClientH As Integer +Property ScrollX As Integer +Property ScrollY As Integer +Property Read ScrollW, ScrollWidth As Integer +Property Read ScrollH, ScrollHeight As Integer + +Event Select +Event Activate +Event Click +Event Rename +Event Cancel +Event Compare(Key As String, OtherKey As String) +Event Draw(X As Integer, Y As Integer, Width As Integer, Height As Integer, Key As String) + +Private Enum EVENT_ACTIVATE, EVENT_CLICK, EVENT_RENAME + +Private $iMode As Integer = Select.Single +Private $bHorizontal As Boolean + +Private $hView As ScrollArea +'Private $hObserver As Observer + +Private $cItems As New Collection +Private $aItems As New _IconView_Item[] +Private $cSelection As New Collection + +Private $iIconSize As Integer +Private $iIconLines As Integer = 2 +Private $iGridSize As Integer + +Private $iGridWidth As Integer = 8 +Private $iGridHeight As Integer = 8 +Private $iPad As Integer + +Private $nColumn As Integer + +Private $iHover As Integer = -1 +Private $iStart As Integer = -1 +Private $iCurrent As Integer = -1 + +Private $bSelRect As Boolean +Private $X1 As Integer +Private $Y1 As Integer +Private $X2 As Integer +Private $Y2 As Integer +Private $hSelTimer As Timer + +Private $iIntern As Integer = -1 +Private $iBack As Integer = -1 + +Private $bSelectionChanged As Boolean +Private $hSelChangedTimer As Timer + +Private $bSorted As Boolean +Private $bAscending As Boolean = True +Private $iCompare As Integer +Private $bCompareSet As Boolean + +Private $bSortDirty As Boolean +Private $hUpdateSortTimer As Timer + +Private $bEditable As Boolean +Private $hRenameBox As RenameBox +Private $iRename As Integer = -1 +Private $iCurrentBefore As Integer + +Private $hPicture As Picture + +Private $sFindItem As String +Private $fFindTime As Float + +Private $iLock As Integer +Private $hArrangeTimer As Timer + +Public Sub _new() + + $hView = New ScrollArea(Me) As "ScrollArea" + $hView.Background = Color.TextBackground + $hView.Focus = True + $hView.Tracking = True + $hView.ScrollBar = Scroll.Vertical + + Me.Proxy = $hView + + Border_Write(True) + '$hObserver = New Observer(Me) As "ScrollArea" + + $hSelChangedTimer = New Timer As "SelectionChanged" + +End + +Public Sub _get((Key) As String) As _IconView_Item + + Return $cItems[Key] + +End + +Public Sub Clear() + + ExitRename + $cItems.Clear + $aItems.Clear + $cSelection.Clear + $iCurrent = -1 + $iStart = -1 + $iHover = -1 + $iIntern = -1 + $iBack = -1 + $iIconSize = 0 + ScrollArea_Arrange + +End + +Public Sub Exist((Key) As String) As Boolean + + Return $cItems.Exist(Key) + +End + +Public Sub FindAt(X As Integer, Y As Integer) As Boolean + + $iIntern = FindIconAccurate(X, Y) + Return $iIntern < 0 + +End + +Private Sub SetIntern(iIntern As Integer) + + If iIntern < 0 Or iIntern > $aItems.Max Then + $iBack = $iIntern + $iIntern = -1 + Else + $iIntern = iIntern + Endif + +End + +Public Function MoveTo((Key) As String) As Boolean + + If Not $cItems.Exist(Key) Then + SetIntern(-1) + Else + SetIntern(_FindItem($cItems[Key])) + Endif + Return $iIntern < 0 + +End + +Public Function MoveFirst() As Boolean + + SetIntern(0) + Return $iIntern < 0 + +End + +Public Function MoveNext() As Boolean + + SetIntern($iIntern + 1) + Return $iIntern < 0 + +End + +Public Function MovePrevious() As Boolean + + SetIntern($iIntern - 1) + Return $iIntern < 0 + +End + +Public Sub MoveBack() + + $iIntern = $iBack + $iBack = -1 + +End + +Public Sub _FindItem(hItem As _IconView_Item) As Integer + + If hItem Then + UpdateSort + Return $aItems.FindByRef(hItem) + Else + Return -1 + Endif + +End + +Public Sub _UpdateIconSize((Picture) As Picture) + + If {Picture} And If Picture.Height > $iIconSize Then + $iIconSize = Picture.Height + ScrollArea_Arrange + Else If Not {Picture} Or If Picture.Height < $iIconSize Then + If Not $hArrangeTimer Then + $hArrangeTimer = New Timer As "ArrangeTimer" + $hArrangeTimer.Trigger + Endif + Endif + +End + +Public Sub ArrangeTimer_Timer() + + Dim hItem As _IconView_Item + Dim hPicture As Picture + + $iIconSize = 0 + For Each hItem In $aItems + hPicture = hItem.Picture + If hPicture And If hPicture.Height > $iIconSize Then $iIconSize = hPicture.Height + Next + + ScrollArea_Arrange + $hArrangeTimer = Null + +End + + +Public Function Add((Key) As String, Text As String, Optional (Picture) As Picture, Optional After As String) As _IconView_Item + + Dim hItem As _IconView_Item = New _IconView_Item As "IconViewItem" + Dim hAfter As _IconView_Item + Dim iPos As Integer + + If Not Key Then Error.Raise("Void key") + If $cItems.Exist(Key) Then Error.Raise("Key already used") + + If After Then + hAfter = $cItems[Key] + If Not hAfter Then Error.Raise("After item does not exist") + Endif + + hItem._Key = Key + + $cItems[Key] = hItem + + If hAfter Then + iPos = _FindItem(hAfter) + 1 + $aItems.Add(hItem, iPos) + Else + $aItems.Add(hItem) + iPos = $aItems.Max + Endif + + $iIntern = iPos + + ScrollArea_Arrange + + hItem.Text = Text + hItem.Picture = {Picture} + + _UpdateIconSize(Picture) + _SortIsDirty + + Return hItem + +End + +Public Sub Remove((Key) As String) + + Dim hItem As _IconView_Item + Dim iPos As Integer + + hItem = $cItems[Key] + If Not hItem Then Return + + hItem.Selected = False + iPos = _FindItem(hItem) + $aItems.Remove(iPos) + $cItems.Remove(Key) + RefreshIcon(iPos) + + _SortIsDirty + + ScrollArea_Arrange + +End + +Private Sub FindIcon(X As Integer, Y As Integer, Optional bIgnoreOutside As Boolean) As Integer + + Dim iPos As Integer + + X -= $iPad + Y -= $iPad + + If $bHorizontal Then + + iPos = Y \ $iGridHeight + If iPos >= $nColumn Then + If Not bIgnoreOutside Then Return -1 + iPos = $nColumn - 1 + Endif + + iPos += (X \ $iGridWidth) * $nColumn + If iPos >= $aItems.Count Then + If Not bIgnoreOutside Then Return -1 + iPos = $aItems.Max + Endif + + Else + + iPos = X \ $iGridWidth + If iPos >= $nColumn Then + If Not bIgnoreOutside Then Return -1 + iPos = $nColumn - 1 + Endif + + iPos += (Y \ $iGridHeight) * $nColumn + If iPos >= $aItems.Count Then + If Not bIgnoreOutside Then Return -1 + iPos = $aItems.Max + Endif + + Endif + + Return iPos + +End + +Private Sub FindIconAccurate(X As Integer, Y As Integer) As Integer + + Dim iPos As Integer + Dim hRect As Rect + + iPos = FindIcon(X, Y) + + If iPos >= 0 Then + hRect = New Rect + GetIconGeometry(iPos, hRect) + If Not $aItems[iPos]._Inside(hRect, Me, $bHorizontal, X, Y) Then Return -1 + Endif + + Return iPos + +End + +Private Sub GetRow(iPos As Integer) As Integer + + Return iPos \ $nColumn + +End + +Private Sub GetColumn(iPos As Integer) As Integer + + Return iPos - GetRow(iPos) * $nColumn + +End + +' Private Sub GetPos(iRow As Integer, iColumn As Integer) As Integer +' +' Return iColumn + iRow * $nColumn +' +' End + + +Private Sub GetIconGeometry(iPos As Integer, hRect As Rect) + + Dim iCol, iRow As Integer + + iRow = GetRow(iPos) + iCol = GetColumn(iPos) + + If $bHorizontal Then + hRect.X = iRow * $iGridWidth + $iPad + hRect.Y = iCol * $iGridHeight + $iPad + hRect.W = $iGridWidth + hRect.H = $iGridHeight + Else + hRect.X = iCol * $iGridWidth + $iPad + hRect.Y = iRow * $iGridHeight + $iPad + hRect.W = $iGridWidth + hRect.H = $iGridHeight + Endif + +End + +Public Sub _GetItemGeometry(hItem As _IconView_Item, hRect As Rect) + + GetIconGeometry(_FindItem(hItem), hRect) + +End + +Public Sub ScrollArea_Draw() + + Dim X, Y, W, H As Integer + Dim X1, Y1, X2, Y2 As Integer + Dim hItem As _IconView_Item + Dim iPos, iLast, iCol, nCol As Integer + Dim hRect As New Rect + Dim hClip, hSaveClip As Rect + Dim bHover As Boolean + Dim bRaiseDraw As Boolean + Dim bFocus As Boolean + + If $aItems.Count = 0 Then Return + If $iLock Then Return + + bFocus = $hView.HasFocus + + hSaveClip = Paint.ClipRect + + If $hPicture Then + Draw.FillX = -$hView.ScrollX + Draw.FillY = -$hView.ScrollY + Draw.Tile($hPicture, 0, 0, Draw.Width, Draw.Height) + Endif + + bRaiseDraw = Object.CanRaise(Me, "Draw") + + X = hSaveClip.X + $hView.ScrollX + Y = hSaveClip.Y + $hView.ScrollY + W = hSaveClip.W + H = hSaveClip.H + + iPos = FindIcon(X, Y) + + If $bHorizontal Then + nCol = FindIcon(X, Y + H - 1, True) - iPos + 1 + Else + nCol = FindIcon(X + W - 1, Y, True) - iPos + 1 + Endif + + iLast = FindIcon(X + W - 1, Y + H - 1, True) + iCol = 0 + + While iPos <= iLast + + If iPos >= 0 And If iPos < $aItems.Count Then + + hItem = $aItems[iPos] + GetIconGeometry(iPos, hRect) + hRect.Translate(-$hView.ScrollX, -$hView.ScrollY) + 'Debug iPos + hClip = hRect.Intersection(hSaveClip) + If hClip Then + bHover = iPos = $iHover + 'If $iMode = Select.Multiple And If iPos = $iStart Then bHover = True + hItem._Draw(hRect, hClip, Me, $bHorizontal, bFocus, bHover, iPos = $iCurrent) ' _HaveFocus, $iMouseOver = k And Me.Tracking) + If bRaiseDraw Then + Paint.Save + Raise Draw(hRect.X, hRect.Y, hRect.W, hRect.H, hItem.Key) + Paint.Restore + Endif + + Endif + + Endif + + Inc iCol + Inc iPos + If iCol >= nCol Then + iPos += $nColumn - nCol + iCol = 0 + 'Debug "---" + Endif + + Wend + + Draw.ClipRect = hSaveClip '(X, Y, W, H) + + If $bSelRect Then + + 'Paint.Begin(Draw.Device) + + 'Paint.Rectangle(X, Y, W, H) + Paint.ClipRect = hSaveClip + + Paint.Translate(-$hView.ScrollX, -$hView.ScrollY) + + X1 = $X1 + Y1 = $Y1 + X2 = $X2 + Y2 = $Y2 + + If X2 < X1 Then Swap X1, X2 + If Y2 < Y1 Then Swap Y1, Y2 + + Paint.Rectangle(X1, Y1, X2 - X1 + 1, Y2 - Y1 + 1) + Paint.Background = Color.SetAlpha(Color.SelectedBackground, 192) + Paint.Fill + Paint.Background = Color.SelectedBackground + Paint.Rectangle(X1 + 0.5, Y1 + 0.5, X2 - X1, Y2 - Y1) + Paint.LineWidth = 1 + Paint.Stroke + + 'Paint.End + + Endif + + ' FIXME: GTK+ bug + If $hRenameBox And If $hRenameBox.Visible Then $hRenameBox.Refresh + + 'Debug ">>>" + +End + +Public Sub ScrollArea_Arrange() + + Dim W, H As Integer + Dim nRow As Integer + Dim DS As Integer + + If $iLock Then Return + + DS = Desktop.Scale + + W = $hView.ClientWidth + H = $hView.ClientHeight + + If $aItems.Count = 0 Then + $hView.ResizeContents(4, 4) + $hView.Refresh + Return + Endif + + ExitRename + + If $bHorizontal Then + + $iGridHeight = Max(DS, $iIconSize) + DS * 2 + $iGridHeight = Max($iGridHeight, Me.Font.Height * $iIconLines + DS) + + If $iGridSize Then + $iGridWidth = $iGridSize * DS + Else + $iGridWidth = $iIconSize + DS * 2 + Endif + + $iGridWidth = Max($iGridWidth, $iIconSize + DS) + + $nColumn = Max(1, (H - $iPad * 2) \ $iGridHeight) + nRow = ($aItems.Count + $nColumn - 1) \ $nColumn + + If nRow = 1 Then + $iGridWidth = Max($iGridWidth, W - $iPad * 2) + Else + $iGridHeight = Max(1, (H - $iPad * 2) \ $nColumn) + Endif + + $hView.ResizeContents(nRow * $iGridWidth + $iPad * 2, Max(H, $nColumn * $iGridHeight + $iPad * 2)) + + Else + + $iGridHeight = Max(DS * 4, $iIconSize) + $iIconLines * Me.Font.Height + DS * 4 + + If $iGridSize Then + $iGridWidth = $iGridSize * DS + Else + $iGridWidth = $iIconSize + DS * 2 + Endif + $iGridWidth = Max($iGridWidth, Me.Font.Height * DS) + + $nColumn = Max(1, (W - $iPad * 2) \ $iGridWidth) + $iGridWidth = Max(1, (W - $iPad * 2) \ $nColumn) + + nRow = ($aItems.Count + $nColumn - 1) \ $nColumn + + $hView.ResizeContents(Max(W, $nColumn * $iGridWidth + $iPad * 2), nRow * $iGridHeight + $iPad * 2) + + Endif + +End + +Public Sub ScrollArea_Resize() + + ScrollArea_Arrange + +End + + +Public Sub ScrollArea_Scroll() + + If Not Me.Enabled Or If Me.Design Then Return + ExitRename + SetHoverItem(FindIconAccurate(Mouse.ScreenX - $hView.ScreenX - $hView.ClientX + $hView.ScrollX, Mouse.ScreenY - $hView.ScreenY - $hView.ClientY + $hView.ScrollY)) + +End + +Private Function Count_Read() As Integer + + Return $aItems.Count + +End + +Private Sub RefreshIcon(iPos As Integer) + + Dim hRect As New Rect + + If $iLock Then Return + If iPos < 0 Then Return + GetIconGeometry(iPos, hRect) + hRect.Translate(-$hView.ScrollX, -$hView.ScrollY) + 'Debug "Refresh:";; hRect.X;; hRect.Y;; hRect.W;; hRect.H + $hView.View.Refresh(hRect.X, hRect.Y, hRect.W, hRect.H) + +End + +Private Sub SetHoverItem(iPos As Integer) + + Dim hItem As _IconView_Item + + If iPos = $iHover Then Return + + Swap iPos, $iHover + + RefreshIcon(iPos) + RefreshIcon($iHover) + + $hView.Tooltip = "" + If $iHover >= 0 Then + hItem = $aItems[$iHover] + If hItem._IsEllipsized() Then $hView.Tooltip = hItem.Text + Endif + +End + + +Public Sub ScrollArea_Leave() + + SetHoverItem(-1) + +End + +Public Sub _EnsureVisible(iPos As Integer) + + Dim hRect As New Rect + + GetIconGeometry(iPos, hRect) + $hView.EnsureVisible(hRect.X - $iPad, hRect.Y - $iPad, hRect.W + $iPad * 2, hRect.H + $iPad * 2) + +End + +Private Sub ToggleCurrentItem(iPos As Integer) + + Dim iOld As Integer + + $aItems[iPos].Selected = Not $aItems[iPos].Selected + iOld = $iCurrent + $iCurrent = iPos + $iStart = iPos + RefreshIcon(iOld) + RefreshIcon($iCurrent) + + If $iCurrent >= 0 Then _EnsureVisible($iCurrent) + +End + +Private Sub SetCurrentItem(iCurrent As Integer, Optional bIgnoreOutside As Boolean, Optional bSelect As Boolean) + + Dim iOld As Integer + + If $bSelRect Then Return + If iCurrent = $iCurrent Then Return + + iOld = $iCurrent + + If iCurrent < 0 Or If iCurrent > $aItems.Max Then + iCurrent = -1 + If bIgnoreOutside Or If $iMode = Select.Single Then Return + Endif + + If Not bSelect Then + + If $iMode = Select.Single Then + UnselectAll + Else If $iMode = Select.Multiple Then + If iCurrent < 0 Or If Not $aItems[iCurrent].Selected Then UnselectAll + Endif + + If iCurrent >= 0 Then + $aItems[iCurrent].Selected = True + $iCurrent = iCurrent + $iStart = $iCurrent + Endif + + Else + + If iCurrent >= 0 Then + SelectRect(False) + $iCurrent = iCurrent + SelectRect(True) + Endif + + Endif + + If $iCurrent >= 0 Then _EnsureVisible($iCurrent) + + RefreshIcon(iOld) + RefreshIcon($iCurrent) + +End + + +Private Function Current_Read() As _IconView_Item + + Try Return $aItems[$iCurrent] + +End + +Public Sub SelectAll() + + Dim hItem As _IconView_Item + + For Each hItem In $aItems + hItem.Selected = True + Next + +End + +Public Sub UnselectAll() + + Dim hItem As _IconView_Item + + If $cSelection.Count = 0 Then Return + + For Each hItem In $cSelection + hItem.Selected = False + Next + $iCurrent = -1 + $iStart = -1 + + SelectionChanged + +End + +Private Function Mode_Read() As Integer + + Return $iMode + +End + +Private Sub Mode_Write(Value As Integer) + + Dim iCurrent As Integer + + If $iMode = Value Then Return + + Select Case Value + Case Select.None + UnselectAll + Case Select.Single + iCurrent = $iCurrent + UnselectAll + SetCurrentItem($iCurrent) + Case Select.Multiple + Case Else + Return + End Select + + $iMode = Value + +End + +Public Sub ScrollArea_KeyPress() + + Dim iCode As Integer + Dim bShift As Boolean + Dim fNow As Float + Dim iInd As Integer + Dim iPos As Integer + Dim iStart As Integer + + If Not Me.Enabled Or If Me.Design Then Return + + If $iMode = Select.None Then + + Else + + If $iMode = Select.Multiple Then + bShift = Key.Shift + Endif + + iCode = Key.Code + + If $bHorizontal Then + Select iCode + Case Key.Left + iCode = Key.Up + Case Key.Right + iCode = Key.Down + Case Key.Up + iCode = Key.Left + Case Key.Down + iCode = Key.Right + End Select + Endif + + Select iCode + + Case Key.Left + SetCurrentItem($iCurrent - 1, True, bShift) + Stop Event + + Case Key.Right + SetCurrentItem($iCurrent + 1, True, bShift) + Stop Event + + Case Key.Up + SetCurrentItem($iCurrent - $nColumn, True, bShift) + Stop Event + + Case Key.Down + If $iCurrent < 0 Then + SetCurrentItem(0, True, bShift) + Else + SetCurrentItem($iCurrent + $nColumn, True, bShift) + Endif + Stop Event + + Case Key.Home + SetCurrentItem(0, True, bShift) + Stop Event + + Case Key.End + SetCurrentItem($aItems.Max, True, bShift) + Stop Event + + Case Key["A"] + If Key.Control Then SelectAll + + Case Key.F2 + If $iCurrent >= 0 Then $aItems[$iCurrent].Rename + + Case Key.Space + ScrollArea_DblClick + + End Select + + If Len(Key.Text) >= 2 Or If Asc(Key.Text) >= 32 And IsAscii(Key.Text) Or If Key.Code = Key.Backspace Then + + fNow = Timer + iStart = $iCurrent + If (fNow - $fFindTime) >= 2 Or iStart < 0 Then + $sFindItem = "" + Inc iStart + Endif + $fFindTime = fNow + + If Key.Code = Key.Backspace Then + $sFindItem = String.Left$($sFindItem, -1) + Else + $sFindItem &= String.LCase(Key.Text) + Endif + + iPos = iStart + For iInd = 0 To $aItems.Max + If iPos > $aItems.Max Then iPos = 0 + With $aItems[iPos] + 'Debug iInd;; .Text + If String.LCase(.Text) Begins $sFindItem Then + SetCurrentItem(iPos, True) + Break + Endif + End With + Inc iPos + Next + + Endif + + Endif + +End + +Public Sub ScrollArea_MouseDown() + + Dim X, Y As Integer + Dim iPos As Integer + Dim bShift As Boolean + Dim bCtrl As Boolean + + If Not Me.Enabled Or If Me.Design Then Return + If $aItems.Count = 0 Then Return + If $iMode = Select.None Then Return + 'If Not Mouse.Left Then Return + + $iCurrentBefore = $iCurrent + + If $iMode = Select.Multiple Then + bShift = Mouse.Shift + bCtrl = Mouse.Control + Endif + + X = Mouse.X + $hView.ScrollX + Y = Mouse.Y + $hView.ScrollY + + iPos = FindIconAccurate(X, Y) + + If iPos >= 0 Then + + If bCtrl Then + ToggleCurrentItem(iPos) + Else + SetCurrentItem(iPos) + Endif + + Else + + If Not bCtrl And If $iMode <> Select.Single Then UnselectAll + + Endif + +End + +Public Sub ScrollArea_MouseDrag() + + Dim X, Y As Integer + Dim bShift As Boolean + Dim bCtrl As Boolean + Dim iPos As Integer + + If Not Me.Enabled Or If Me.Design Then Return + If $aItems.Count = 0 Then Return + If $iMode = Select.None Then Return + 'If Not Mouse.Left Then Return + + If $iMode = Select.Multiple And If Mouse.Left And If Not $bSelRect Then + + bShift = Mouse.Shift + bCtrl = Mouse.Control + + X = Mouse.StartX + $hView.ScrollX + Y = Mouse.StartY + $hView.ScrollY + iPos = FindIconAccurate(X, Y) + + $bSelRect = True + $X1 = X + $Y1 = Y + $X2 = X + $Y2 = Y + $hSelTimer = New Timer As "SelTimer" + $hSelTimer.Delay = 50 + $hSelTimer.Start + + Inc $iLock + If iPos >= 0 Then $aItems[iPos].Selected = Not $aItems[iPos].Selected + Dec $iLock + SelectRect(True) + + Endif + +End + + +Private Sub UpdateSelRect(X As Integer, Y As Integer) + + X = Max($iPad, Min($hView.ScrollWidth - $iPad - 1, X)) + Y = Max($iPad, Min($hView.ScrollHeight - $iPad - 1, Y)) + + If X <> $X2 Or If Y <> $Y2 Then + + SelectRect + $X2 = X + $Y2 = Y + $hView.EnsureVisible($X2 - 16, $Y2 - 16, 32, 32) + $hView.View.Refresh + SelectRect + + Endif + +End + + +Public Sub ScrollArea_MouseMove() + + Dim X, Y, iPos As Integer + + If Not Me.Enabled Or If Me.Design Then Return + If $aItems.Count = 0 Then Return + If $iMode = Select.None Then Return + + X = Mouse.X + $hView.ScrollX + Y = Mouse.Y + $hView.ScrollY + iPos = FindIconAccurate(X, Y) + + ' If iPos <> $iHover ThenNot + ' If Mouse.Left And If $iMode = Select.Multiple And iPos >= 0 Then + ' $aItems[iPos].Selected = Not $aItems[iPos].Selected + ' Endif + ' Endif + + If Not Mouse.Left And If Not Mouse.Right Then SetHoverItem(iPos) + If $bSelRect And If Mouse.Left Then UpdateSelRect(X, Y) + +End + +Public Sub SelTimer_Timer() + + UpdateSelRect(Mouse.ScreenX - $hView.ScreenX + $hView.ScrollX, Mouse.ScreenY - $hView.ScreenY + $hView.ScrollY) + +End + +Private Sub SelectRect(Optional iSelect As Integer = 1) + + Dim X, Y, W, H As Integer + Dim iPos, nCol, iLast, iCol As Integer + Dim hItem As _IconView_Item + Dim hRect As New Rect + Dim hSel As Rect + Dim hSelRect As Rect + + If Not $bSelRect Then + GetIconGeometry($iStart, hRect) + $X1 = hRect.X + hRect.W \ 2 + $Y1 = hRect.Y + hRect.H \ 2 + GetIconGeometry($iCurrent, hRect) + $X2 = hRect.X + hRect.W \ 2 + $Y2 = hRect.Y + hRect.H \ 2 + Endif + + If $X1 = $X2 And If $Y1 = $Y2 Then Return + + X = Min($X1, $X2) + Y = Min($Y1, $Y2) + W = Abs($X2 - $X1) + 1 + H = Abs($Y2 - $Y1) + 1 + + hSel = New Rect(X, Y, W, H) + + iPos = FindIcon(X, Y) + If $bHorizontal Then + nCol = FindIcon(X, Y + H - 1, True) - iPos + 1 + Else + nCol = FindIcon(X + W - 1, Y, True) - iPos + 1 + Endif + iLast = FindIcon(X + W - 1, Y + H - 1, True) + + iCol = 0 + + While iPos <= iLast + + If iPos >= 0 And If iPos < $aItems.Count Then + If $bSelRect Or If iPos <> $iStart Then + + GetIconGeometry(iPos, hRect) + hRect.Adjust(2) + + hSelRect = hRect.Intersection(hSel) + + If hSelRect Then + hItem = $aItems[iPos] + If Not $bSelRect Or If hItem._Intersect(hRect, hSelRect, $bHorizontal) Then + If iSelect = 1 Then + hItem.Selected = Not hItem.Selected + Else + hItem.Selected = iSelect + Endif + Endif + Endif + + Endif + Endif + + Inc iCol + Inc iPos + If iCol >= nCol Then + iPos += $nColumn - nCol + iCol = 0 + 'Debug "---" + Endif + + Wend + +End + +Public Sub ScrollArea_MouseUp() + + If Not Me.Enabled Or If Me.Design Then Return + If $aItems.Count = 0 Then Return + + If $bSelRect Then + + $bSelRect = False + $hSelTimer = Null + $hView.View.Refresh + If $cSelection.Count And If $X1 <> $X2 Or $Y1 <> $Y2 Then SelectionChanged + ' If Not Mouse.Control Then + ' UnselectAll + ' ToggleSelectRect + ' Endif + Else + + If $iCurrent >= 0 Then + If $iCurrent = $iCurrentBefore Then + '$aItems[$iCurrent].Rename + Endif + ' Click is always raised, Select may not + RaiseEvent(EVENT_CLICK, $iCurrent) + Endif + + Endif + +End + + +Public Sub _SelectItem(hItem As _IconView_Item, bSelected As Boolean) + + If bSelected Then + If $iMode = Select.Single Then + SetCurrentItem(_FindItem(hItem)) + Endif + $cSelection[hItem.Key] = hItem + Else + If $iMode = Select.Single Then + SetCurrentItem(-1) + Endif + $cSelection.Remove(hItem.Key) + Endif + + SelectionChanged + +End + +Public Sub _RefreshItem(hItem As _IconView_Item) + + If $iLock Then Return + RefreshIcon(_FindItem(hItem)) + +End + + +Private Function Border_Read() As Boolean + + Return $hView.Border + +End + +Private Sub Border_Write(Value As Boolean) + + $hView.Border = Value + $iPad = If(Value, Style.FrameWidth, 0) + $hView.View.Refresh + +End + +Private Function ScrollBar_Read() As Integer + + Return $hView.Scrollbar + +End + +Private Sub ScrollBar_Write(Value As Integer) + + $hView.ScrollBar = Value + +End + +Private Function Item_Read() As _IconView_Item + + If $iIntern >= 0 Then Return $aItems[$iIntern] + +End + +Private Function Available_Read() As Boolean + + Return $iIntern >= 0 + +End + +Private Sub RaiseEvent(iEvent As Integer, iItem As Integer) As Boolean + + Dim iSave As Integer = $iIntern + Dim bCancel As Boolean + + $iIntern = iItem + Select Case iEvent + Case EVENT_ACTIVATE + Raise Activate + Case EVENT_CLICK + Raise Click + Case EVENT_RENAME + bCancel = Raise Rename + End Select + $iIntern = iSave + + Return bCancel + +End + + +Public Sub ScrollArea_DblClick() + + If Not Me.Enabled Or If Me.Design Then Return + + If $iCurrent >= 0 Then + RaiseEvent(EVENT_ACTIVATE, $iCurrent) + Endif + +End + +Public Sub SelectionChanged_Timer() + + $bSelectionChanged = False + Raise Select + +End + +Private Sub SelectionChanged() + + If $bSelectionChanged Then Return + If $bSelRect Then Return + + $hSelChangedTimer.Trigger + $bSelectionChanged = True + +End + +Private Function Key_Read() As String + + If $iCurrent >= 0 And If $iCurrent < $aItems.Count Then Return $aItems[$iCurrent].Key + +End + +Private Function Compare_Read() As Integer + + Return $iCompare + +End + +Private Sub Compare_Write(Value As Integer) + + $iCompare = Value + $bCompareSet = True + +End + +Public Sub _CompareItem(sKey1 As String, sKey2 As String) As Boolean + + Raise Compare(sKey1, sKey2) + If $bCompareSet Then + $bCompareSet = False + Return False + Else + Return True + Endif + +End + +Private Sub UpdateSort() + + If Not $bSorted Then Return + If Not $bSortDirty Then Return + $aItems.Sort(If($bAscending, gb.Ascent, gb.Descent)) + $bSortDirty = False + $hView.View.Refresh + +End + + +Private Function Sorted_Read() As Boolean + + Return $bSorted + +End + +Private Sub Sorted_Write(Value As Boolean) + + If $bSorted = Value Then Return + $bSorted = Value + If $bSorted Then $hUpdateSortTimer = New Timer As "UpdateSort" + $bSortDirty = True + UpdateSort + +End + +Private Function Editable_Read() As Boolean + + Return $bEditable + +End + +Private Sub Editable_Write(Value As Boolean) + + $bEditable = Value + +End + +Private Function Ascending_Read() As Boolean + + Return $bAscending + +End + +Private Sub Ascending_Write(Value As Boolean) + + If $bAscending = Value Then Return + $bAscending = Value + $bSortDirty = True + UpdateSort + +End + +Public Sub UpdateSort_Timer() + + UpdateSort + +End + +Public Sub _SortIsDirty() + + If Not $bSorted Then Return + If $bSortDirty Then Return + $bSortDirty = True + $hUpdateSortTimer.Trigger + +End + +Public Sub _MoveItem(hItem As _IconView_Item, iNewPos As Integer) + + Dim iPos As Integer + + If iNewPos < 0 Then Return + + iPos = _FindItem(hItem) + If iNewPos = iPos Then Return + + $aItems.Remove(iPos) + If iPos < iNewPos Then Dec iNewPos + $aItems.Add(hItem, iNewPos) + $hView.View.Refresh + +End + +Public Sub _IsHovered(hItem As _IconView_Item) As Boolean + + Dim iPos As Integer + + iPos = _FindItem(hItem) + If iPos >= 0 Then Return iPos = $iHover + +End + + +Private Function IconSize_Read() As Integer + + Return $iIconSize + +End + +Private Function GridSize_Read() As Integer + + Return $iGridSize + +End + +Private Sub GridSize_Write(Value As Integer) + + $iGridSize = Max(16, Min(1024, Value)) + ScrollArea_Arrange + +End + +Private Function IconLines_Read() As Integer + + Return $iIconLines + +End + +Private Sub IconLines_Write(Value As Integer) + + $iIconLines = Max(1, Min(8, Value)) + ScrollArea_Arrange + +End + +Public Sub _RenameItem(hItem As _IconView_Item) + + Dim hRect As New Rect + + ExitRename + $iRename = _FindItem(hItem) + + _EnsureVisible($iRename) + GetIconGeometry($iRename, hRect) + hRect = hItem._GetTextRect(hRect, $bHorizontal) + hRect.Adjust(-1) + + If Not $hRenameBox Then + Object.Lock(Me) + $hRenameBox = New RenameBox(Me, 0, True) As "RenameBox" + Object.Unlock(Me) + Endif + + hRect.X = hRect.X - $hView.ScrollX + $hView.ScreenX - Me.ScreenX + hRect.Y = hRect.Y - $hView.ScrollY + $hView.ScreenY - Me.ScreenY + + $hRenameBox.Move(hRect.X, hRect.Y, hRect.W, hRect.H) + $hRenameBox.Alignment = If($bHorizontal, Align.Left, Align.Center) + $hRenameBox.Text = hItem.Text + $hRenameBox.Raise + $hRenameBox.Show + $hRenameBox.SetFocus + +End + +Private Sub ExitRename() + + If $hRenameBox Then + $hRenameBox.Hide + $iRename = -1 + $hView.SetFocus + Endif + +End + +Public Sub RenameBox_Activate() + + Dim bCancel As Boolean + + $aItems[$iRename].Text = $hRenameBox.Text + bCancel = RaiseEvent(EVENT_RENAME, $iRename) + If Not bCancel Then ExitRename + +End + +Public Sub RenameBox_KeyPress() + + If Key.Code = Key.Escape Then + ExitRename + Raise Cancel + Else If Key.Code = Key.Enter Or If Key.Code = Key.Return Then + RenameBox_Activate + Stop Event + Endif + +End + +Public Sub RenameBox_LostFocus() + + ExitRename + +End + +Private Function Orientation_Read() As Integer + + Return If($bHorizontal, Arrange.Horizontal, Arrange.Vertical) + +End + +Private Sub Orientation_Write(Value As Integer) + + Dim bHor As Boolean + + If Value = Arrange.Horizontal Then + bHor = True + Else If Value = Arrange.Vertical Then + bHor = False + Else + Return + Endif + + $bHorizontal = bHor + $hView.ScrollBar = If($bHorizontal, Scroll.Horizontal, Scroll.Vertical) + ScrollArea_Arrange + +End + +Private Function Picture_Read() As Picture + + Return $hPicture + +End + +Private Sub Picture_Write(Value As Picture) + + $hPicture = Value + $hView.Refresh + +End + +Private Function Background_Read() As Integer + + Return $hView.Background + +End + +Private Sub Background_Write(Value As Integer) + + $hView.Background = Value + +End + +Private Sub Key_Write(Value As String) + + Dim hItem As _IconView_Item = $cItems[Value] + + If hItem Then + SetCurrentItem(_FindItem(hItem)) + Else + SetCurrentItem(-1) + Endif + +End + +Public Sub _Begin() + + Inc $iLock + +End + +Public Sub _End() + + Dec $iLock + If $iLock = 0 Then + ScrollArea_Arrange + $hView.Refresh + Endif + +End + + +Private Function Renaming_Read() As Boolean + + Return $iRename >= 0 + +End + +Private Function ClientWidth_Read() As Integer + + Return $hView.ClientW + +End + +Private Function ClientHeight_Read() As Integer + + Return $hView.ClientH + +End + +Private Function ScrollX_Read() As Integer + + Return $hView.ScrollX + +End + +Private Sub ScrollX_Write(Value As Integer) + + $hView.ScrollX = Value + +End + +Private Function ScrollY_Read() As Integer + + Return $hView.ScrollY + +End + +Private Sub ScrollY_Write(Value As Integer) + + $hView.ScrollY = Value + +End + +Private Function ScrollW_Read() As Integer + + Return $hView.ScrollW + +End + +Private Function ScrollH_Read() As Integer + + Return $hView.ScrollH + +End + +Public Sub Scroll(X As Integer, Y As Integer) + + $hView.Scroll(X, Y) + +End + +Public Sub ScrollArea_GotFocus() + + $hView.Refresh + +End + +Public Sub ScrollArea_LostFocus() + + $hView.Refresh + +End + +Public Sub ScrollArea_Font() + + Dim hItem As _IconView_Item + + For Each hItem In $aItems + hItem._Invalidate + Next + + ScrollArea_Arrange + +End + +Private Function Keys_Read() As String[] + + Dim aKeys As New String[] + + For Each $cItems + aKeys.Add($cItems.Key) + Next + Return aKeys + +End diff --git a/comp/src/gb.gui.base/.src/IconView/_IconView_Item.class b/comp/src/gb.gui.base/.src/IconView/_IconView_Item.class new file mode 100644 index 00000000..63a3a008 --- /dev/null +++ b/comp/src/gb.gui.base/.src/IconView/_IconView_Item.class @@ -0,0 +1,772 @@ +' Gambas class file + +Export + +Property Read Key As String +Property {Picture} As Picture +Property Text As String +Property RichText As String +Property Selected As Boolean +Property Editable As Boolean +Property Read Hovered As Boolean + +Property Read X As Integer +Property Read Y As Integer +Property Read Height, H As Integer +Property Read Width, W As Integer + +Public _Key As String + +Private $sText As String +Private $sRichText As String +Private $hPicture As Picture +Private $bSelected As Boolean +Private $bEditable As Boolean +Private $bEllipsized As Boolean + +Private $hInside As Rect + +Event _Foo + +Public Sub _new() + + $bEditable = GetIconView().Editable + +End + + +Private Sub GetIconView() As IconView + + Return Object.Parent(Me) + +End + +Private Sub RefreshView() + + GetIconView()._RefreshItem(Me) + +End + +Private Function Key_Read() As String + + Return _Key + +End + +Private Function Picture_Read() As Picture + + Return $hPicture + +End + +Private Sub Picture_Write(Value As Picture) + + If $hPicture = Value Then Return + $hPicture = Value + $hInside = Null + GetIconView()._UpdateIconSize($hPicture) + RefreshView + +End + +Private Function Text_Read() As String + + Return $sText + +End + +Private Sub Text_Write(Value As String) + + If $sText = Value Then Return + $sText = Value + $hInside = Null + GetIconView()._SortIsDirty + RefreshView + +End + + +Private Function RichText_Read() As String + + Return $sRichText + +End + +Private Sub RichText_Write(Value As String) + + If $sRichText = Value Then Return + $sRichText = Value + $hInside = Null + GetIconView()._SortIsDirty + RefreshView + +End + +' Public Sub _Draw2(X As Integer, Y As Integer, Width As Integer, Height As Integer, bFocus As Boolean, bHover As Boolean) +' +' Dim iBackColor As Integer +' Dim hBackImage As Image +' Dim hParent As IconView +' Dim ix, iy As Integer +' +' If _IconViewItem._hBackPicture.Width <> Width Then +' _IconViewItem._hBackPicture = DrawBackGround(Width, Height, Color.SelectedBackground) +' _IconViewItem._hBackPictureNoFocus = DrawBackGround(Width, Height, Color.Gray) +' _IconViewItem._hBackPictureMouseOver = DrawBackGround(Width, Height, Color.Lighter(Color.SelectedBackground)) +' _IconViewItem._hBackPictureSelOver = DrawBackGround(Width, Height, Color.Darker(Color.SelectedBackground)) +' Endif +' +' If bHover Then +' hBackImage = IIf(Me.Selected, _hBackPictureSelOver, _hBackPictureMouseOver) +' iBackColor = Color.Transparent +' +' Else +' +' If bFocus +' hBackImage = _hBackPicture +' iBackColor = Color.SelectedBackground +' Else +' hBackImage = _hBackPictureNoFocus +' iBackColor = Color.Gray +' Endif +' +' Endif +' +' Draw.Font = _Font +' ix = X + (Width - $hPicture.w) / 2 +' iy = Y + (Height - ($hPicture.Height + Draw.TextHeight($sText) + 5)) / 2 +' +' +' If Me.Selected Or bHover Then +' Draw.Foreground = Color.Lighter(iBackColor) +' Draw.FillColor = iBackColor +' Draw.FillStyle = Fill.Solid +' Draw.Image(hBackImage, X, Y) +' 'Draw.Rect(X, Y, Width, Height) +' Draw.Picture($hPicture.Image.Colorize(iBackColor).Picture, iX, iY) +' +' 'Draw.Rect($iX + ($hPicture.Width - Draw.TextWidth($sText)) / 2 - 4, $iY + $hPicture.Height + 5, Draw.TextWidth($sText) + 8, Draw.TextHeight($sText)) +' Draw.Foreground = IIf(bFocus, Color.SelectedForeground, Color.TextForeground) +' Else +' Draw.Picture($hPicture, iX, iY) +' Draw.Foreground = Color.TextForeground +' +' Endif +' Me._TextX = ix + ($hPicture.Width - Draw.TextWidth($sText)) / 2 +' Me._TextY = Y + (Height - (Draw.TextHeight($sText) + 5)) +' Me._TextWidth = Draw.TextWidth($sText) + 8 +' Me._TextHeight = Draw.TextHeight($sText) +' +' Draw.Text($sText, iX + ($hPicture.Width - Draw.TextWidth($sText)) / 2, iY + $hPicture.Height + 5) +' +' ' Prend le rectangle comme zone +' $ix = X +' $iy = Y +' $iWidth = Width +' $iheight = Height +' +' End + +Public Sub _GetTextRect(hRect As Rect, bHorizontal As Boolean) As Rect + + Dim hText As Rect + Dim X, Y, W, H As Integer + Dim HT As Integer + + hRect.Adjust(8) + + If bHorizontal Then + + X = hRect.X + If $hPicture Then X += $hPicture.W + 4 + + W = hRect.W - (X - hRect.X) + If $sRichText Then + H = GetIconView().Font.RichTextHeight($sRichText, W - 4) + 4 + Else + H = GetIconView().Font.RichTextHeight(Html($sText), W - 4) + 4 + Endif + + hText = New Rect(X, hRect.Y, W, H) + hText.Y -= (H - hRect.H) \ 2 + + Else + + Y = hRect.Y + If $hPicture Then Y += $hPicture.H + 4 + + If $sRichText Then + H = GetIconView().Font.RichTextHeight($sRichText, hRect.W) '+ 4 + Else + H = GetIconView().Font.RichTextHeight(Html($sText), hRect.W) '+ 4 + Endif + HT = Min(H, hRect.H - (Y - hRect.Y) - 8) + + hText = New Rect(hRect.X, Y, hRect.W, HT) + 'hText = hText.Intersection(hRect) + + Endif + + hText.Adjust(-1) + + Return hText + +End + +Private Sub GetBackground(hIconView As IconView, Optional bSelected As Boolean, bFocus As Boolean) As Integer + + Dim iColor As Integer + + iColor = hIconView.Background + If iColor = Color.Default Then iColor = Color.TextBackground + + If bSelected Then + If bFocus Then + iColor = Color.Merge(Color.LightBackground, iColor) + Else + iColor = Color.Merge(Color.LightForeground, iColor, 0.75) + Endif + Endif + + If Not hIconView.Enabled Then iColor = Color.Desaturate(iColor) + Return iColor + +End + +Private Sub GetForeground(hIconView As IconView, Optional bSelected As Boolean) As Integer + + Dim iColor As Integer + + If bSelected Then + iColor = Color.SelectedForeground + Else + iColor = hIconView.Foreground + If iColor = Color.Default Then iColor = Color.TextForeground + Endif + + If Not hIconView.Enabled Then iColor = Color.Desaturate(Color.Merge(iColor, GetBackground(hIconView, bSelected))) + Return iColor + +End + +Private Sub DrawText(sText As String, sRichText As String, X As Float, Y As Float, W As Float, H As Float, iAlign As Integer) + + If sRichText Then + Paint.DrawRichText(sRichText, X, Y, W, H, iAlign) + Else + Paint.DrawRichText(Html(sText), X, Y, W, H, iAlign) + Endif + +End + +Private Sub GetIconSize(ByRef PW As Integer, ByRef PH As Integer) + + If $hPicture Then + PW = $hPicture.W + PH = $hPicture.H + Else + PW = Max(Desktop.Scale * 4, GetIconView().IconSize) + PH = PW + Endif + +End + + +Public Sub _Draw(hRect As Rect, hClip As Rect, hIconView As IconView, bHorizontal As Boolean, bFocus As Boolean, bHover As Boolean, bCurrent As Boolean) + + Dim X, Y, W, H, HT, PW, PH As Integer + Dim iColor As Integer + Dim bFrame As Boolean + Dim sText As String + Dim hRect1, hRectBg As Rect + Dim DS As Integer + + DS = Desktop.Scale + + hRect.Adjust(DS \ 4) + + If Not hIconView.Picture Then + bFrame = True + Endif + + GetIconSize(ByRef PW, ByRef PH) + + 'iColor = hIconView.Background + 'If iColor = Color.Default Then iColor = Color.TextBackground + 'If $bSelected Then iColor = Color.SelectedBackground + 'If bHover Then iColor = Color.Merge(iColor, Color.LightBackground) + + iColor = GetBackground(hIconView, $bSelected, bFocus) + + ' If bHover And Not $bSelected Then + ' Paint.Begin(Draw.Device) + ' Paint.ClipRect = hClip + ' 'Paint.Rectangle(hClip.X, hClip.Y, hClip.Width, hClip.Height) + ' 'Paint.Clip() + ' PaintRoundedRect(hRect.X, hRect.Y, hRect.W, hRect.H, 7) + ' Paint.Brush = Paint.Color(iColor) + ' Paint.Fill + ' 'Paint.Rectangle(hRect.X, hRect.Y, hRect.W, hRect.H) + ' 'Paint.Brush = Paint.Color(Color.Black) + ' 'Paint.Stroke + ' Paint.End + ' bFrame = True + ' Else If $bSelected Then + ' bSelected = True + ' iColor = Color.SelectedBackground + ' If bHover Then iColor = Color.Merge(iColor, Color.LightBackground) + ' Endif + + hClip = hClip.Intersection(hRect) + If IsNull(hClip) Then Return + + ' Paint.Background = Color.Black + ' Paint.Rectangle(hRect.X + 0.5, hRect.Y + 0.5, hRect.W, hRect.H) + ' Paint.Stroke + + 'hClip.Adjust(-1) + hRectBg = hRect.Copy() + hRectBg.Adjust(1) + + hRect.Adjust(DS, DS) + + If bHorizontal Then + + X = hRect.X + W = hRect.W + If $hPicture Then W -= PW + + If $sText Or If $sRichText Then + + sText = $sRichText + If Not sText Then sText = Html($sText) + + H = hIconView.Font.RichTextHeight(sText, W) + HT = hRect.H + DS \ 2 + + If H > HT Then + sText = Paint.TrimRichText(sText, W, HT) + $bEllipsized = True + Else + $bEllipsized = False + Endif + + Endif + + Paint.ClipRect = hClip + + hRect1 = hRectBg.Copy() + 'hRect1.Adjust(1) + GoSub PAINT_BACKGROUND + + hRect1 = hClip.Copy() + hRect1.Adjust(1) + + If System.RightToLeft Then + + If $hPicture Then + Paint.DrawPicture($hPicture, hRect.X + hRect.W - PW, hRect.Y + (hRect.H - PH) / 2) + Endif + + Else + + If $hPicture Then + Paint.DrawPicture($hPicture, hRect.X, hRect.Y + (hRect.H - PH) / 2) + X += PW + 4 + Endif + + Endif + + If $sText Then + Paint.Font = hIconView.Font + If Not bFrame Then + Paint.Background = GetBackground(hIconView, False) 'If($bSelected, Color.SelectedBackground, Color.TextBackground) + DrawText($sText, sText, X + 1, hRect.Y + 1, W, hRect.H, Align.Left) + Endif + Paint.Background = GetForeground(hIconView, False) 'If($bSelected, Color.SelectedForeground, Color.TextForeground) + DrawText($sText, sText, X, hRect.Y, W, hRect.H, Align.Left) + Endif + + Else + + Y = hRect.Y + Y += PH + DS \ 2 + + If $sText Or If $sRichText Then + + sText = $sRichText + If Not sText Then sText = Html($sText) + + H = hIconView.Font.RichTextHeight(sText, hRect.W) + HT = hRect.H - (Y - hRect.Y) + + If H > HT Then + sText = Paint.TrimRichText(sText, hRect.W, HT) + $bEllipsized = True + Else + $bEllipsized = False + Endif + + Endif + + hRect1 = Rect(hRect.X - DS \ 2, hRect.Y - DS \ 2, hRect.W + DS, hRect.H + DS) + 'hRect1 = Rect(hRect.X + (hRect.W - PW) / 2 - DS \ 2, hRect.Y - DS \ 2, PW + DS, PH + DS) + 'If $sText Or If $sRichText Then hRect2 = Rect(hRect.X - DS \ 2, Y - DS \ 2, hRect.W + DS, hIconView.Font.RichTextHeight(sText, hRect.W) + DS) + GoSub PAINT_BACKGROUND + + 'Paint.Save + 'Paint.ClipRect = hClip + + If $hPicture Then Paint.DrawPicture($hPicture, hRect.X + (hRect.W - PW) / 2, hRect.Y) + + If $sText Or If $sRichText Then + 'Draw.Clip(hRect.X, Y, hRect.W, hRect.H - Y) + Paint.Font = hIconView.Font + + If Not $sRichText And If Not $bEllipsized Then sText = "" + + If Not bFrame Then + Paint.Background = GetBackground(hIconView, False) '$bSelected) 'If($bSelected, Color.SelectedBackground, Color.TextBackground) + DrawText($sText, sText, hRect.X + 1, Y + 1, hRect.W, HT, Align.Top) + Endif + Paint.Background = GetForeground(hIconView, False) '$bSelected) 'If($bSelected, Color.SelectedForeground, Color.TextForeground) + DrawText($sText, sText, hRect.X, Y, hRect.W, HT, Align.Top) + 'Draw.Clip.Enabled = False + Endif + + 'Paint.Restore + + Endif + + Return + +PAINT_RECTS: + + If hRect1 Then Paint.Rectangle(hRect1.X, hRect1.Y, hRect1.W, hRect1.H) ', Desktop.Scale / 2) + 'If hRect2 Then Paint.Rectangle(hRect2.X, hRect2.Y, hRect2.W, hRect2.H, Desktop.Scale / 2) + Return + +PAINT_BACKGROUND: + + If bHover Or If $bSelected Or If bCurrent Then + + Paint.Save + Paint.ClipRect = hClip + + If bHover Then + + GoSub PAINT_RECTS + If bCurrent Or If $bSelected Then + Paint.Background = Color.Merge(iColor, Color.TextForeground, 0.2) + Else + Paint.Background = GetBackground(hIconView, True, bFocus) + Endif + Paint.Fill 'LineWidth = 1 + 'Paint.Stroke + + Else If bCurrent Then + + GoSub PAINT_RECTS + Paint.Background = Color.Merge(iColor, Color.TextForeground, 0.1) + Paint.Fill + + Endif + + If bCurrent Or If bHover Then + + If hRect1 Then hRect1.Adjust(1) + 'If hRect2 Then hRect2.Adjust(1) + + Endif + + GoSub PAINT_RECTS + Paint.Background = iColor + Paint.Fill + + Paint.Restore + + Endif + + Return + +End + + +Private Function Selected_Read() As Boolean + + Return $bSelected + +End + +Private Sub Selected_Write(Value As Boolean) + + If $bSelected = Value Then Return + + $bSelected = Value + GetIconView()._SelectItem(Me, Value) + RefreshView + +End + +Public Sub EnsureVisible() + + Dim hParent As IconView = GetIconView() + + hParent._EnsureVisible(hParent._FindItem(Me)) + +End + +Private Sub GetInsideRect(hRect As Rect, YT As Integer) As Rect + + Dim sText As String + Dim hFont As Font + Dim H, HT As Integer + + If Not $hInside Then + + sText = $sText + hFont = GetIconView().Font + H = hFont.RichTextHeight(sText, hRect.W) + HT = hRect.H - (YT - hRect.Y) + If H > HT Then sText = Ellipsize(sText, hFont, hRect.W, HT) + + $hInside = New Rect(hRect.X - 4, YT - 6, hRect.W + 8, hFont.RichTextHeight(sText, hRect.W) + 10) + + Endif + + Return $hInside + +End + +Public Sub _Intersect(hRect As Rect, hOther As Rect, bHorizontal As Boolean) As Boolean + + Dim YT, PW, PH As Integer + Dim hInside As Rect + Dim DS As Integer + + DS = Desktop.Scale + hRect.Adjust(DS \ 2) + + If bHorizontal Then + + Return hRect.Intersection(hOther) + + Else + + GetIconSize(ByRef PW, ByRef PH) + + YT = hRect.Y + + If PW Then + hInside = New Rect(hRect.X + (hRect.W - PW) / 2 - 4, hRect.Y - 4, PW + 8, PH + 8) + If hInside.Intersection(hOther) Then Return True + YT += PH + 4 + Endif + + If $sText Then + hInside = GetInsideRect(hRect, YT) + If hInside.Intersection(hOther) Then Return True + Endif + + Endif + +End + + +Public Sub _Inside(hRect As Rect, hIconView As IconView, bHorizontal As Boolean, X As Integer, Y As Integer) As Boolean + + Dim H, YT, HT, PW, PH As Integer + Dim hInside As Rect + Dim sText As String + Dim DS As Integer + + DS = Desktop.Scale + hRect.Adjust(DS \ 2) + Return hRect.Contains(X, Y) + 'If Not hRect.Contains(X, Y) Then Return False + + If bHorizontal Then + + Return True + + Else + + GetIconSize(ByRef PW, ByRef PH) + + YT = hRect.Y + + If PW Then + hInside = New Rect(hRect.X + (hRect.W - PW) / 2 - 4, hRect.Y - 4, PW + 8, PH + 8) + If hInside.Contains(X, Y) Then Return True + YT += PH + 4 + Endif + + If $sText Then + sText = $sText + H = hIconView.Font.RichTextHeight(sText, hRect.W) + HT = hRect.H - (YT - hRect.Y) + If H > HT Then + sText = Ellipsize(sText, hIconView.Font, hRect.W, HT) + Endif + hInside = New Rect(hRect.X - 4, YT - 6, hRect.W + 8, hIconView.Font.RichTextHeight(sText, hRect.W) + 10) + If hInside.Contains(X, Y) Then Return True + Endif + + Endif + +End + +Public Sub _compare(hItem As _IconView_Item) As Integer + + Dim hParent As IconView = GetIconView() + + If Not hParent._CompareItem(_Key, hItem.Key) Then + Return hParent.Compare + Else + Return Comp($sText, hItem.Text, gb.Natural + gb.IgnoreCase) + Endif + +End + +Private Function Editable_Read() As Boolean + + Return $bEditable + +End + +Private Sub Editable_Write(Value As Boolean) + + $bEditable = Value + +End + +Public Sub Rename() + + If Not $bEditable Then Return + GetIconView()._RenameItem(Me) + +End + +Private Sub GetGeometry() As Rect + + Dim hParent As IconView = GetIconView() + Dim hRect As New Rect + hParent._GetItemGeometry(Me, hRect) + Return hRect + +End + + +Private Function X_Read() As Integer + + Return GetGeometry().X + +End + +Private Function Y_Read() As Integer + + Return GetGeometry().Y + +End + +Private Function Width_Read() As Integer + + Return GetGeometry().Width + +End + +Private Function Height_Read() As Integer + + Return GetGeometry().Height + +End + +Public Sub MoveAfter(Optional (Key) As String) + + Dim hParent As IconView = GetIconView() + Dim iPos As Integer + + If Not Key Then + MoveFirst() + Return + Endif + + iPos = hParent._FindItem(hParent[Key]) + If iPos < 0 Then Error.Raise(Subst("Unknown item: '&1'", Key)) + + hParent._MoveItem(Me, iPos + 1) + +End + +Public Sub MoveBefore(Optional (Key) As String) + + Dim hParent As IconView = GetIconView() + Dim iPos As Integer + + If Not Key Then + MoveLast() + Return + Endif + + iPos = hParent._FindItem(hParent[Key]) + If iPos < 0 Then Error.Raise(Subst("Unknown item: '&1'", Key)) + + hParent._MoveItem(Me, iPos) + +End + +Public Sub MoveFirst() + + Dim hParent As IconView = GetIconView() + hParent._MoveItem(Me, 0) + +End + +Public Sub MoveLast() + + Dim hParent As IconView = GetIconView() + hParent._MoveItem(Me, hParent.Count - 1) + +End + +Private Sub Ellipsize(sText As String, hFont As Font, W As Integer, H As Integer) As String + + Dim sPoints As String = "…" + Dim iPos As Integer + Dim sCar As String + Dim bMarkup As Boolean + + If Not sText Then Return + + For iPos = 1 To String.Len(sText) + sCar = String.Mid(sText, iPos, 1) + If sCar = "<" Then + bMarkup = True + Else If sCar = ">" Then + bMarkup = False + Endif + If bMarkup Then Continue + If hFont.RichTextHeight(String.Left(sText, iPos) & sPoints, W) > H Then Break + Next + + Return String.Left(sText, iPos - 1) & sPoints + +End + +Public Sub _IsEllipsized() As Boolean + + Return $bEllipsized + +End + +Private Function Hovered_Read() As Boolean + + Return GetIconView()._IsHovered(Me) + +End + +Public Sub _Invalidate() + + $hInside = Null + +End diff --git a/comp/src/gb.gui.base/.src/Line.class b/comp/src/gb.gui.base/.src/Line.class new file mode 100644 index 00000000..caea24a5 --- /dev/null +++ b/comp/src/gb.gui.base/.src/Line.class @@ -0,0 +1,5 @@ +' Gambas class file + +Export + +Public Enum None, Solid, Dash, Dot, DashDot, DashDotDot \ No newline at end of file diff --git a/comp/src/gb.gui.base/.src/ListBox/ListBox.class b/comp/src/gb.gui.base/.src/ListBox/ListBox.class new file mode 100644 index 00000000..c7265c2b --- /dev/null +++ b/comp/src/gb.gui.base/.src/ListBox/ListBox.class @@ -0,0 +1,450 @@ +' Gambas class file + +Export +Inherits UserControl + +Public Const _Properties As String = "*,List,Border=True,Mode{Select.*}=Single,ScrollBar{Scroll.*}=Vertical,Sorted" +Public Const _Group As String = "View" +Public Const _DefaultEvent As String = "Click" +Public Const _DefaultSize As String = "16,16" +Public Const _Similar As String = "ListView" + +Property Read Count As Integer +Property Mode As Integer +Property ScrollBar As Integer +Property Border As Boolean +Property Sorted As Boolean +Property Read Current As _ListBox_Item +Property Index As Integer +Property Read Text As String +Property List As String[] +Property Font As Font + +Property ScrollX As Integer +Property ScrollY As Integer +Property Read ScrollW, ScrollWidth As Integer +Property Read ScrollH, ScrollHeight As Integer + +Event Click +Event Activate +Event Select + +'Static Private $bNoEvent As Boolean + +Private $hView As GridView +Private $aText As New String[] +Private $bSorted As Boolean +Private $hSortTimer As Timer +Private $hTimerClick As Timer + +Public Sub _new() + + $hView = New GridView(Me) As "GridView" + $hView.Columns.Count = 1 + $hView.Mode = Select.Single + $hView.Grid = False + $hView.AutoResize = True + $hView._DoNotDrawSelection = True + $hView.ScrollBar = Scroll.Vertical + + Me.Proxy = $hView + +End + +Public Sub _get(Index As Integer) As _ListBox_Item + + Return New _ListBox_Item(Index) As "Item" + +End + +Public Sub Clear() + + 'Object.Lock(Me) + $aText.Clear + $hView.Rows.Count = 0 + 'Object.Unlock(Me) + +End + +Private Sub SortLater() + + If Not $hSortTimer Then + $hSortTimer = New Timer As "Sort" + $hSortTimer.Trigger + Endif + +End + + +Public Sub Add(Text As String, Optional Index As Integer = -1) + + If Index < 0 Then + $aText.Add(Text) + Else + $aText.Add(Text, Index) + $hView.Rows.Insert(Index) + Endif + + $hView.Rows.Count = $aText.Count + SortLater + +End + +Public Sub Remove(Index As Integer, Optional Length As Integer = 1) + + If Length <= 0 Or If Index < 0 Or If (Index + Length) > $aText.Count Then Error.Raise("Out of bounds") + + $aText.Remove(Index, Length) + $hView.Rows.Remove(Index, Length) + $hView.Rows.Count = $aText.Count + +End + +Public Sub GridView_Data(Row As Integer, (Column) As Integer) + + With $hView.Data + Try .Text = $aText[Row] + If $hView.Rows[Row].Selected Then + .Background = Color.SelectedBackground + .Foreground = Color.SelectedForeground + Endif + + End With + +End + +Public Sub GridView_Activate() + + Raise Activate + +End + +Private Function Count_Read() As Integer + + Return $aText.Count + +End + +Private Function Mode_Read() As Integer + + Return $hView.Mode + +End + +Private Sub Mode_Write(Value As Integer) + + $hView.Mode = Value + +End + +Private Function ScrollBar_Read() As Integer + + Return $hView.Scrollbar + +End + +Private Sub ScrollBar_Write(Value As Integer) + + $hView.Scrollbar = Value + If $hView.ScrollBar And Scroll.Horizontal Then + $hView.AutoResize = False + $hView.Columns[0].W = -1 + Else + $hView.AutoResize = True + Endif + +End + +Private Function Border_Read() As Boolean + + Return $hView.Border + +End + +Private Sub Border_Write(Value As Boolean) + + $hView.Border = Value + +End + +Private Function Sorted_Read() As Boolean + + Return $bSorted + +End + +Private Sub Sorted_Write(Value As Boolean) + + $hView.Sorted = Value + $bSorted = Value + If $bSorted Then Sort + +End + +Private Function Current_Read() As _ListBox_Item + + Try Return _get($hView.Row) + +End + +Public Sub GridView_Select() + + 'If $bNoEvent Then Return + If $hView.Row < 0 Then Return + + Raise Select + +End + +Public Sub TimerClick_Timer() + + Raise Click + $hTimerClick = Null + +End + + +Public Sub GridView_Change() + + $hTimerClick = New Timer As "TimerClick" + $hTimerClick.Trigger + +End + +' Private Function ClientWidth_Read() As Integer +' +' Return $hView.ClientW +' +' End +' +' Private Function ClientHeight_Read() As Integer +' +' Return $hView.ClientH +' +' End + +Public Sub SelectAll() + + $hView.SelectAll + +End + +Public Sub UnselectAll() + + $hView.UnselectAll + +End + +Public Sub Find(Text As String, Optional Mode As Integer) As Integer + + Return $aText.Find(Text, Mode) + +End + +' Public Sub FindAt((X) As Integer, Y As Integer) As Boolean +' +' Dim iRow As Integer = $hView.RowAt(Y) +' +' If iRow < 0 Then Return True +' Return SetCursor(RowToItem(iRow).Key) +' +' End + +Public Sub _IsSelected(iRow As Integer) As Boolean + + Try Return $hView.Rows[iRow].Selected + +End + +Public Sub _SetSelected(iRow As Integer, bSelected As Boolean) + + Try $hView.Rows[iRow].Selected = bSelected + +End + +Public Sub Sort_Timer() + + $hSortTimer = Null + If $bSorted Then Sort + $hView.Columns[0].W = -1 + $hView.Refresh + +End + +Private Sub Sort() + + Dim sCurrent As String + Dim bSelect As Boolean + + If $hView.Row > 0 Then + sCurrent = $aText[$hView.Row] + bSelect = True + Endif + + $aText.Sort + $hView.Refresh + + If bSelect Then $hView.Row = $aText.Find(sCurrent) + + If $hSortTimer Then + $hSortTimer.Stop + $hSortTimer = Null + Endif + +End + +' Private Function Selection_Read() As String[] +' +' Dim aSel As New String[] +' Dim iRow As Integer +' +' For Each iRow In $hView.Rows.Selection +' aSel.Add(RowToItem(iRow).Key) +' Next +' +' Return aSel +' +' End +' +' Private Sub Selection_Write(Value As String[]) +' +' Dim sKey As String +' Dim hItem As _TreeView_Item +' +' UnselectAll +' For Each sKey In Value +' If Not sKey Then Continue +' hItem = $cItem[sKey] +' If hItem Then hItem.Selected = True +' Next +' +' End + +Private Function ScrollX_Read() As Integer + + Return $hView.ScrollX + +End + +Private Sub ScrollX_Write(Value As Integer) + + $hView.ScrollX = Value + +End + +Private Function ScrollY_Read() As Integer + + Return $hView.ScrollY + +End + +Private Sub ScrollY_Write(Value As Integer) + + $hView.ScrollY = Value + +End + +Private Function ScrollW_Read() As Integer + + Return $hView.ScrollW + +End + +Private Function ScrollH_Read() As Integer + + Return $hView.ScrollH + +End + +Public Sub Scroll(X As Integer, Y As Integer) + + $hView.Scroll(X, Y) + +End + +Private Function Index_Read() As Integer + + Return $hView.Row + +End + +Private Sub Index_Write(Value As Integer) + + Try $hView.Row = Value + +End + +Private Function Text_Read() As String + + Try Return $aText[$hView.Row] + +End + +Private Function List_Read() As String[] + + Return $aText.Copy() + +End + +Private Sub List_Write(Value As String[]) + + Object.Lock(Me) + If Value Then + $aText = Value.Copy() + Else + $aText.Clear + Endif + $hView.Rows.Count = $aText.Count + $hView.Row = -1 + '$hView.Refresh + Object.Unlock(Me) + SortLater + +End + +Public Sub _GetText(iIndex As Integer) As String + + Try Return $aText[iIndex] + +End + + +Public Sub _SetText(iIndex As Integer, sText As String) + + Try $aText[iIndex] = sText + SortLater + +End + +Private Sub ResizeColumn() + + Dim W As Integer + Dim sText As String + + For Each sText In $aText + W = Max(W, Me.Font.TextWidth(sText)) + Next + + $hView.Columns[0].W = W + 8 + +End + +Public Sub GridView_ColumnSize((Column) As Integer) + + ResizeColumn + +End + + +Private Function Font_Read() As Font + + Return $hView.Font + +End + +Private Sub Font_Write(Value As Font) + + $hView.Font = Value + ResizeColumn + +End diff --git a/comp/src/gb.gui.base/.src/ListBox/_ListBox_Item.class b/comp/src/gb.gui.base/.src/ListBox/_ListBox_Item.class new file mode 100644 index 00000000..d24e6350 --- /dev/null +++ b/comp/src/gb.gui.base/.src/ListBox/_ListBox_Item.class @@ -0,0 +1,47 @@ +' Gambas class file + +Export + +Property Text As String +Property Selected As Boolean + +Private $iIndex As Integer + +Event _Refresh + +Private Sub GetList() As ListBox + + Return Object.Parent(Me) + +End + +Public Sub _new(iIndex As Integer) + + $iIndex = iIndex + +End + +Private Function Text_Read() As String + + Return GetList()._GetText($iIndex) + +End + +Private Sub Text_Write(Value As String) + + GetList()._SetText($iIndex, Value) + +End + +Private Function Selected_Read() As Boolean + + Return GetList()._IsSelected($iIndex) + +End + +Private Sub Selected_Write(Value As Boolean) + + GetList()._SetSelected($iIndex, Value) + +End + diff --git a/comp/src/gb.gui.base/.src/Main.module b/comp/src/gb.gui.base/.src/Main.module new file mode 100644 index 00000000..8e0b418c --- /dev/null +++ b/comp/src/gb.gui.base/.src/Main.module @@ -0,0 +1,65 @@ +' Gambas module file + +' Private $hFadeN As Picture +' ' Private $hFadeW As Picture +' ' Private $hFadeS As Picture +' ' Private $hFadeE As Picture +' +' Private Sub LoadFades() +' +' Dim hImage As Image +' 'Dim Y As Integer +' Dim iColor As Integer +' +' iColor = Color.Desaturate(Color.TextForeground) +' +' 'If iColor = $iFadeColor Then Return +' +' hImage = New Image(32, 8, Color.Transparent) +' ' For Y = 0 To 7 +' ' hImage.FillRect(0, Y, hImage.W, 1, Color.SetAlpha(iColor, 160 + Y * 12)) +' ' Next +' +' $hFadeN = hImage.Picture +' $hFadeN = hImage.Picture +' ' hImage.RotateLeft +' ' $hFadeW = hImage.Picture +' ' hImage.RotateLeft +' ' $hFadeS = hImage.Picture +' ' hImage.RotateLeft +' ' $hFadeE = hImage.Picture +' +' End + +Public Sub Main() + + ' Dim hImage As Image + ' + ' hImage = New Image(256, 256, Color.Transparent) + ' Paint.Begin(hImage) + ' Paint.Background = Color.Red + ' Paint.Cross(16, 16, 224, 224, 64) + ' Paint.Fill + ' Paint.End + ' hImage.Save("~/test.png") + +End + +Public Sub GetFileSize(iSize As Long, Optional nDigit As Integer = 1) As String + + Dim sFormat As String + + sFormat = "0." & String$(nDigit, "#") + + If iSize < 1024 Then + Return Subst(("&1 B"), CStr(iSize)) + Else If iSize < 1048576 Then + Return Subst(("&1 KiB"), Format(iSize / 1024, sFormat)) + Else If iSize < 1073741824 Then + Return Subst(("&1 MiB"), Format(iSize / 1048576, sFormat)) + Else + Return Subst(("&1 GiB"), Format(iSize / 1073741824, sFormat)) + Endif + +End + diff --git a/comp/src/gb.gui.base/.src/Message/FMessage.class b/comp/src/gb.gui.base/.src/Message/FMessage.class new file mode 100644 index 00000000..bf8eb43c --- /dev/null +++ b/comp/src/gb.gui.base/.src/Message/FMessage.class @@ -0,0 +1,106 @@ +' Gambas class file + +Static Private $iButton As Integer + +Public Sub Run(sIcon As String, sText As String, aButton As String[]) As Integer + + Dim sTitle As String + Dim hPict As Picture + Dim H As Integer + Dim W As Integer + Dim I As Integer + Dim hButton As Button + Dim iBusy As Integer + Dim WB As Integer + Dim HT As Integer + + sTitle = Message.Title + If Not sTitle Then sTitle = Application.Title + Message.Title = "" + Me.Title = sTitle + + Do + If aButton.Count = 0 Then + aButton = [("OK")] + Break + Endif + If aButton.Last Then Break + aButton.Pop() + Loop + + hPict = Picture["icon:/64/" & sIcon] + If Not hPict Then hPict = Picture["./gb.gui.base/message" &/ sIcon & ".png"] + If Not hPict Then hPict = Picture["./gb.gui.base/message/info.png"] + picMessage.Picture = hPict + + hPict = Picture["icon:/small/copy"] + If Not hPict Then hPict = Picture["./gb.gui.base/message/copy.png"] + btnCopy.Picture = hPict + + sText = Replace(sText, "\n", "
        ") + + txtMessage.Ignore = True + txtMessage.W = Screen.AvailableWidth \ 3 + txtMessage.Text = sText + txtMessage.Adjust + HT = txtMessage.H + txtMessage.Ignore = False + + H = 0 + For I = 0 To aButton.Max + hButton = New Button(panButton) As "Button" + hButton.Tag = I + hButton.Text = aButton[I] + hButton.W = Max(Desktop.Scale * 14, hButton.Font.TextWidth(hButton.Text) + Desktop.Scale * 2) + H = Max(H, hButton.Font.TextHeight(hButton.Text)) + WB += hButton.W + Desktop.Scale + If I = 0 Then hButton.SetFocus() + If I = aButton.Max Then hButton.Cancel = True + Next + panButton.H = Max(H, Desktop.Scale * 4) + + W = Max(txtMessage.W + 1, WB) + picMessage.W + Desktop.Scale * 4 + H = Max(Desktop.Scale * 8, HT) + panButton.H + Desktop.Scale * 5 + + Me.Resize(W, H) + + If Application.ActiveWindow Then Me.SkipTaskbar = True + + $iButton = aButton.Max + + iBusy = Application.Busy + Application.Busy = 0 + Me.ShowModal() + Application.Busy = iBusy + + Return $iButton + 1 + +End + +Public Sub Button_Click() + + $iButton = Last.Tag + Me.Close + +End + +Public Sub Form_KeyPress() + + Dim hButton As Button + + If Key.Code = Key.Return Or If Key.Code = Key.Enter Then + Try hButton = Application.ActiveControl + If hButton Then + hButton.Value = True + Stop Event + Endif + Endif + +End + +Public Sub btnCopy_Click() + + Component.Load("gb.util") + Clipboard.Copy(String.FromHTML(txtMessage.Text)) + +End diff --git a/comp/src/gb.gui.base/.src/Message/FMessage.form b/comp/src/gb.gui.base/.src/Message/FMessage.form new file mode 100644 index 00000000..d9145fea --- /dev/null +++ b/comp/src/gb.gui.base/.src/Message/FMessage.form @@ -0,0 +1,38 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,64,18) + Resizable = False + Arrangement = Arrange.Vertical + Margin = True + { panMessage HBox + MoveScaled(1,1,58,8) + Expand = True + { Panel3 Panel + MoveScaled(0,0,8,9) + { picMessage PictureBox + MoveScaled(0,0,8,8) + Mode = PictureBox.Fill + } + } + { Panel2 Panel + MoveScaled(10,2,2,4) + } + { txtMessage TextLabel + MoveScaled(16,0,41,4) + Expand = True + } + } + { panButton HBox + MoveScaled(1,13,62,4) + Spacing = True + { btnCopy ToolButton + MoveScaled(2,0,4,4) + ToolTip = ("Copy message") + } + { Panel1 Panel + MoveScaled(9,0,4,4) + Expand = True + } + } +} diff --git a/comp/src/gb.gui.base/.src/Message/Message.class b/comp/src/gb.gui.base/.src/Message/Message.class new file mode 100644 index 00000000..b0634952 --- /dev/null +++ b/comp/src/gb.gui.base/.src/Message/Message.class @@ -0,0 +1,75 @@ +' Gambas class file + +Export + +Static Property Title As String + +Static Private $sTitle As String + +'Export +' GB_DESC CMessageDesc[] = +' { +' GB_DECLARE("Message", 0), GB_VIRTUAL_CLASS(), +' +' GB_STATIC_METHOD("_exit", NULL, CMESSAGE_exit, NULL), +' +' GB_STATIC_METHOD("_call", "i", CMESSAGE_info, "(Message)s[(Button)s]"), +' GB_STATIC_METHOD("Info", "i", CMESSAGE_info, "(Message)s[(Button)s]"), +' GB_STATIC_METHOD("Warning", "i", CMESSAGE_warning, "(Message)s[(Button1)s(Button2)s(Button3)s]"), +' GB_STATIC_METHOD("Question", "i", CMESSAGE_question, "(Message)s[(Button1)s(Button2)s(Button3)s]"), +' GB_STATIC_METHOD("Error", "i", CMESSAGE_error, "(Message)s[(Button1)s(Button2)s(Button3)s]"), +' GB_STATIC_METHOD("Delete", "i", CMESSAGE_delete, "(Message)s[(Button1)s(Button2)s(Button3)s]"), +' +' GB_STATIC_PROPERTY("Title", "s", CMESSAGE_title), +' +' GB_END_DECLARE +' }; +' + +Static Public Sub _call((Message) As String, Optional Button As String = ("OK")) As Integer + + Return Info(Message, Button) + +End + +Static Public Sub Info((Message) As String, Optional Button As String = ("OK")) As Integer + + Return FMessage.Run("info", Message, [Button]) + +End + +Static Public Sub Warning((Message) As String, Optional Button1 As String, Button2 As String, Button3 As String) As Integer + + Return FMessage.Run("warning", Message, [Button1, Button2, Button3]) + +End + +Static Public Sub Question((Message) As String, Optional Button1 As String, Button2 As String, Button3 As String) As Integer + + Return FMessage.Run("question", Message, [Button1, Button2, Button3]) + +End + +Static Public Sub Error((Message) As String, Optional Button1 As String, Button2 As String, Button3 As String) As Integer + + Return FMessage.Run("error", Message, [Button1, Button2, Button3]) + +End + +Static Public Sub Delete((Message) As String, Optional Button1 As String, Button2 As String, Button3 As String) As Integer + + Return FMessage.Run("delete", Message, [Button1, Button2, Button3]) + +End + +Static Private Function Title_Read() As String + + Return $sTitle + +End + +Static Private Sub Title_Write(Value As String) + + $sTitle = Value + +End diff --git a/comp/src/gb.gui.base/.src/MyComboBox.class b/comp/src/gb.gui.base/.src/MyComboBox.class new file mode 100644 index 00000000..3878c4b1 --- /dev/null +++ b/comp/src/gb.gui.base/.src/MyComboBox.class @@ -0,0 +1,43 @@ +' Gambas class file + +Inherits UserControl + +Property ReadOnly As Boolean + +Private $bReadOnly As Boolean = True +Private $hView As DrawingArea + +Public Sub _new() + + $hView = New DrawingArea(Me) As "View" + $hView.Focus = True + Me.Proxy = $hView + +End + +Public Sub View_Draw() + + If $bReadOnly Then + Style.PaintButton(0, 0, Paint.W, Paint.H, False, Style.StateOf($hView)) + Else + Style.PaintBox(0, 0, Paint.W, Paint.H, Style.StateOf($hView)) + Endif + + Paint.Background = Color.Black + Style.PaintArrow(Paint.W - Desktop.Scale * 3, 0, Desktop.Scale * 2, Paint.H, Align.Bottom, Style.StateOf($hView)) + +End + + +Private Function ReadOnly_Read() As Boolean + + Return $bReadOnly + +End + +Private Sub ReadOnly_Write(Value As Boolean) + + $bReadOnly = Value + $hView.Refresh + +End diff --git a/comp/src/gb.gui.base/.src/Paint.class b/comp/src/gb.gui.base/.src/Paint.class new file mode 100644 index 00000000..8f403d88 --- /dev/null +++ b/comp/src/gb.gui.base/.src/Paint.class @@ -0,0 +1,483 @@ +' Gambas class file + +Export + +Static Private $fLastWidth As Float +Static Private $sLastFont As String + +Static Private Sub AddThreeDots(sStr As String) As String + + While InStr(". \n", Right(sStr)) + sStr = Left(sStr, -1) + Wend + Return sStr & "…" + +End + + +Static Public Sub TrimText(Text As String, W As Float, Optional H As Float) As String + + Dim I, S, L As Integer + Dim HL As Integer = Paint.Font.Height + Dim sLine As String + Dim sSep As String + Dim sCar As String + Dim SL As Integer + Dim WT As Integer + Dim HT As Integer + + If Not Text Then Return + + If H = 0 Then H = HT + HT = HL + SL = 1 + L = String.Len(Text) + + For I = 1 To L + + sCar = String.Mid$(Text, I, 1) + If I < L And If InStr(" \n", sCar) = 0 Then Continue + + sLine = String.Mid$(Text, SL, I - SL) + + If (HT + HL) > H Then + WT = Paint.Font.TextWidth(sLine & "…") + If WT > W Then + Return AddThreeDots(String.Left(Text, S - 1)) + Else If sCar = "\n" Then + Return AddThreeDots(String.Left(Text, I - 1)) + Endif + Else + WT = Paint.Font.TextWidth(sLine) + If WT > W Then + Text = String.Left(Text, S - 1) & "\n" & String.Mid$(Text, S + 1) + HT += HL + SL = S + 1 + Dec I + Endif + Endif + + sSep = sCar + S = I + If sSep = "\n" Then HT += HL + + Next + + Return Text + +End + +Static Private Sub HtmlLeft(sHtml As String, iPos As Integer) As String + + Dim sRes As String + Dim bMarkup As Boolean + Dim sCar As String + Dim I As Integer + + For I = 1 To String.Len(sHtml) + sCar = String.Mid(sHtml, I, 1) + If sCar = "<" Then + bMarkup = True + sRes &= sCar + Continue + Else If sCar = ">" Then + bMarkup = False + sRes &= sCar + Continue + Endif + If bMarkup Or If I <= iPos Then sRes &= sCar + Next + + Return sRes + +End + +Static Public Sub TrimRichText(RichText As String, W As Float, Optional H As Float) As String + + Dim I As Integer + Dim sCar As String + Dim bMarkup As Boolean + + If Not RichText Then Return + If H = 0 Then H = Paint.Font.Height + + For I = 1 To String.Len(RichText) + sCar = String.Mid(RichText, I, 1) + If sCar = "<" Then + bMarkup = True + Else If sCar = ">" Then + bMarkup = False + Endif + If bMarkup Then Continue + If Paint.Font.RichTextHeight(HtmlLeft(RichText, I) & "…", W) > H Then Break + Next + + Return HtmlLeft(RichText, I - 1) & "…" + +End + +Static Public Sub DrawTextShadow(Text As String, X As Float, Y As Float, W As Float, H As Float, Optional Alignment As Integer = Align.TopLeft, Optional Radius As Integer = -1, Optional Opacity As Float = 0.5) + + Dim hShadow As Image + Dim hFont As Font + Dim hBrush As PaintBrush + Dim DX, DY As Integer + Dim iBackground As Integer + + hFont = Paint.Font + iBackground = Paint.Background + hBrush = Paint.Brush + + If Radius < 0 Then Radius = Max(1, hFont.Height \ 8) + Radius = Min(256, Radius) + + With Paint.TextSize(Text) + + hShadow = New Image(Ceil(.W) + 2 + Radius * 2, Ceil(.H) + 2 + Radius * 2, Color.Transparent) + + DX = W - .W + DY = H - .H + + Paint.Begin(hShadow) + + Paint.Font = hFont + Paint.Background = iBackground + Paint.Brush = hBrush + + If Align.IsCenter(Alignment) Then + DX /= 2 + Else If Align.IsLeft(Alignment) Then + DX = 0 + Endif + + If Align.IsMiddle(Alignment) Then + DY /= 2 + Else If Align.IsTop(Alignment) Then + DY = 0 + Endif + + Paint.DrawText(Text, Radius - DX, Radius - DY, W, H, Alignment) + Paint.End + hShadow.Fuzzy(Radius) + + End With + + Paint.DrawImage(hShadow, X + DX - Radius, Y + DY - Radius,,, Opacity) + +End + +Static Public Sub DrawRichTextShadow(Text As String, X As Float, Y As Float, W As Float, H As Float, Optional Alignment As Integer = Align.TopLeft, Optional Radius As Integer = -1, Optional Opacity As Float = 0.5) + + Dim hShadow As Image + Dim hFont As Font + Dim hBrush As PaintBrush + Dim DX, DY As Integer + Dim iBackground As Integer + + hFont = Paint.Font + iBackground = Paint.Background + hBrush = Paint.Brush + + If Radius < 0 Then Radius = Max(1, hFont.Height \ 8) + Radius = Min(256, Radius) + + With Paint.RichTextSize(Text, W) + + hShadow = New Image(Ceil(.W) + 2 + Radius * 2, Ceil(.H) + 2 + Radius * 2, Color.Transparent) '&HFF000000) + + DX = W - .W + DY = H - .H + + Paint.Begin(hShadow) + Paint.Font = hFont + Paint.Background = iBackground + Paint.Brush = hBrush + + If Align.IsCenter(Alignment) Then + DX /= 2 + Else If Align.IsLeft(Alignment) Then + DX = 0 + Endif + + If Align.IsMiddle(Alignment) Then + DY /= 2 + Else If Align.IsTop(Alignment) Then + DY = 0 + Endif + + Paint.DrawRichText(Text, Radius - DX, Radius - DY, W, H, Alignment) + Paint.End + hShadow.Fuzzy(Radius) + + End With + + Paint.DrawImage(hShadow, X + DX - Radius, Y + DY - Radius,,, Opacity) + +End + +Static Public Sub StretchImage((Image) As Image, X As Float, Y As Float, Width As Float, Height As Float, Optional Alignment As Integer = Align.Center, Optional Opacity As Float = 1, Optional Source As Rect) + + Dim W As Float + Dim H As Float + Dim S As Float + + If Source Then + W = Source.W + H = Source.H + Else + W = Image.W + H = Image.H + Endif + + If W <= 0 Or If H <= 0 Then Return + + S = Min(Width / W, Height / H) + W *= S + H *= S + + If Align.IsRight(Alignment) Then + X += Width - W + Else If Align.IsCenter(Alignment) Then + X += (Width - W) / 2 + Endif + + If Align.IsBottom(Alignment) Then + Y += Height - H + Else If Align.IsMiddle(Alignment) Then + Y += (Height - H) / 2 + Endif + + Paint.DrawImage(Image, X, Y, W, H, Opacity, Source) + +End + +Static Public Sub DrawRect(X As Float, Y As Float, Width As Float, Height As Float, (Color) As Integer, Optional Size As Float = 1) + + If Size = 0 Then Return + + If Size < 0 Then + Size = -Size + X -= Size + Y -= Size + Width += Size * 2 + Height += Size * 2 + Endif + + If Size >= Min(Width, Height) / 2 Then + Paint.FillRect(X, Y, Width, Height, Color) + Return + Endif + + Paint.Save + Paint.Rectangle(X, Y, Width, Size) + Paint.Rectangle(X + Width - Size, Y + Size, Size, Height - Size) + Paint.Rectangle(X, Y + Height - Size, Width - Size, Size) + Paint.Rectangle(X, Y + Size, Size, Height - Size * 2) + Paint.Background = Color + Paint.Fill + Paint.Restore + +End + +Static Public Sub _EstimateFixedFontCharWidth(hFont As Font) As Float + + Dim iSpaceWidth As Integer + Dim I As Integer + Dim sText As String + Dim sFont As String + + sFont = hFont.ToString() + If sFont = $sLastFont Then Return $fLastWidth + + $sLastFont = sFont + + iSpaceWidth = hFont.TextWidth(" ") + + For I = 33 To 255 + If I > 126 And If I < 160 Then Continue + If I = 173 Then Continue + If hFont.TextWidth(String.Chr$(I)) <> iSpaceWidth Then + $fLastWidth = 0 + Return 0 + Endif + Next + + sText = String$(4, "AbCdEfGh01#@WwmM") + $fLastWidth = hFont.TextWidth(sText) / Len(sText) + Return $fLastWidth + +End + + +' Static Public Debug As Boolean +' +' Static Public Sub MoveTo(X As Float, Y As Float) +' +' Super.MoveTo(X, Y) +' If {Debug} Then Print "MoveTo("; CStr(X); ","; CStr(Y); ")" +' +' End +' +' Static Public Sub LineTo(X As Float, Y As Float) +' +' Super.LineTo(X, Y) +' If {Debug} Then Print "LineTo("; CStr(X); ","; CStr(Y); ")" +' +' End +' +' Static Public Sub CurveTo(X1 As Float, X2 As Float, Y1 As Float, Y2 As Float, X3 As Float, Y3 As Float) +' +' Super.CurveTo(X1, X2, Y1, Y2, X3, Y3) +' If {Debug} Then Print "CurveTo("; CStr(X1); ","; CStr(Y1); ","; CStr(X2); ","; CStr(Y2); ","; CStr(X3); ","; CStr(Y3); ")" +' +' End +' +' +' Static Public Sub Clip(Optional Preserve As Boolean) +' +' If {Debug} Then +' With Paint.ClipExtents +' Print "Clip() ["; CStr(.X); ","; CStr(.Y); ","; CStr(.Width); ","; CStr(.Height); "] -> "; +' End With +' Endif +' Super.Clip(Preserve) +' If {Debug} Then +' With Paint.ClipExtents +' Print "["; CStr(.X); ","; CStr(.Y); ","; CStr(.Width); ","; CStr(.Height); "]" +' End With +' Endif +' +' End +' +' Static Public Sub Restore() +' +' If {Debug} Then +' With Paint.ClipExtents +' Print "Restore() ["; CStr(.X); ","; CStr(.Y); ","; CStr(.Width); ","; CStr(.Height); "] -> "; +' End With +' Endif +' Super.Restore +' If {Debug} Then +' With Paint.ClipExtents +' Print "["; CStr(.X); ","; CStr(.Y); ","; CStr(.Width); ","; CStr(.Height); "]" +' End With +' Endif +' +' End +' +' Static Public Sub Rectangle(X As Float, Y As Float, W As Float, H As Float, Optional R As Float) +' +' Super.Rectangle(X, Y, W, H, R) +' If {Debug} Then +' Print "Rectangle("; CStr(X); ","; CStr(Y); ","; CStr(W); ","; CStr(H); +' If R Then Print ","; CStr(R); +' Print ")" +' Endif +' +' End +' + +' Static Public Sub Cross(X As Float, Y As Float, Width As Float, Height As Float, Size As Float) +' +' Dim XC As Float +' Dim YC As Float +' Dim DH As Float +' Dim DW As Float +' +' XC = X + Width / 2 +' YC = Y + Width / 2 +' +' DW = (Width - Size) / 2 +' DH = (Height - Size) / 2 +' +' Paint.MoveTo(XC - Size / 2, Y) +' Paint.RelLineTo(Size, 0) +' Paint.RelLineTo(0, DH) +' Paint.RelLineTo(DW, 0) +' Paint.RelLineTo(0, Size) +' Paint.RelLineTo(- DW, 0) +' Paint.RelLineTo(0, DH) +' Paint.RelLineTo(- Size, 0) +' Paint.RelLineTo(0, - DH) +' Paint.RelLineTo(- DW, 0) +' Paint.RelLineTo(0, - Size) +' Paint.RelLineTo(DW, 0) +' Paint.RelLineTo(0, - DH) +' +' End +' + +Static Public Sub Arrow(X As Float, Y As Float, Width As Float, Height As Float, Orientation As Integer, Optional Alignment As Integer = Align.Center) + + Dim SX, SY As Float + + SX = Min(Width / 2, Height / 2) / 2 + If SX <= 0 Then Return + SY = SX * 2 + + If Orientation = Align.Top Or If Orientation = Align.Bottom Then Swap SX, SY + + If Align.IsLeft(Alignment) Then + X = SX + Else If Align.IsRight(Alignment) Then + X = Width - SX + Else + X += Width / 2 + Endif + + If Align.IsTop(Alignment) Then + Y = SY + Else If Align.IsBottom(Alignment) Then + Y = Height - SY + Else + Y += Height / 2 + Endif + + Width = SX * 2 + Height = SY * 2 + + Select Case Orientation + + Case Align.Top + + Paint.MoveTo(X - SX, Y + SY) + Paint.RelLineTo(SX, -SY * 2) + Paint.RelLineTo(SX, SY * 2) + + Case Align.Bottom + + Paint.MoveTo(X - SX, Y - SY) + Paint.RelLineTo(SX, SY * 2) + Paint.RelLineTo(SX, -SY * 2) + + Case Align.Left + + Paint.MoveTo(X + SX, Y - SY) + Paint.RelLineTo(-SX * 2, SY) + Paint.RelLineTo(SX * 2, SY) + + Case Align.Right + + Paint.MoveTo(X - SX, Y - SY) + Paint.RelLineTo(SX * 2, SY) + Paint.RelLineTo(-SX * 2, SY) + + End Select + +End + +Static Public Sub Check(X As Float, Y As Float, Width As Float, Height As Float) + + Dim D As Float + + D = Min(Width / 3, Height / 2) + + X += (Width - D * 3) / 2 + Y += (Height - D * 2) / 2 + + Paint.MoveTo(X, Y + D) + Paint.RelLineTo(D, D) + Paint.RelLineTo(D * 2, -D * 2) + +End + diff --git a/comp/src/gb.gui.base/.src/Picture.class b/comp/src/gb.gui.base/.src/Picture.class new file mode 100644 index 00000000..1562c4a1 --- /dev/null +++ b/comp/src/gb.gui.base/.src/Picture.class @@ -0,0 +1,138 @@ +' Gambas class file + +Export + +Class Stock + +Static Private $cCache As New Collection + +Static Private Sub GetKey(sPath As String) As String + + Dim sKey As String + + If sPath Begins "icon:/" Then + + sKey = sPath + + Else If File.IsRelative(sPath) Then + + While sPath Begins "./" + sPath = Mid$(sPath, 3) + Wend + + sKey = Component.FindFromPath(".." &/ sPath) + If sKey Then sKey &= ":" + + While sPath Begins "../" + sPath = Mid$(sPath, 4) + Wend + sKey &= sPath + + Else + + sKey = sPath + + Endif + + Return sKey + +End + + +Static Public Sub _get(Path As String) As Picture + + Dim sKey As String + Dim hPict As Picture + Dim sPath As String + Dim sBaseName As String + Dim sDarkPath As String + Dim bMoveUp As Boolean + + If Not Path Then Return + + sKey = GetKey(Path) + hPict = $cCache[sKey] + If hPict Then Return hPict + + If Path Begins "icon:/" Then + + 'Debug Path + Try hPict = Stock[Mid$(Path, 7)] + If Not hPict Then Return + + Else + + sPath = Path + + If File.IsRelative(sPath) Then + If sPath Begins "./" Then + If sPath Not Begins "./gb." Then + bMoveUp = True + Endif + Else + bMoveUp = True + Endif + Endif + + If bMoveUp Then sPath = ".." &/ sPath + + ' Support for rtl/ltr icons + + sBaseName = File.BaseName(sPath) + If sBaseName Ends "-ltr" And If System.RightToLeft Then + sBaseName = Left(sBaseName, -4) & "-rtl" + sPath = File.SetBaseName(sPath, sBaseName) + Else If sBaseName Ends "-rtl" And If Not System.RightToLeft Then + sBaseName = Left(sBaseName, -4) & "-ltr" + sPath = File.SetBaseName(sPath, sBaseName) + Endif + + ' Support for dark themes + + If Application.DarkTheme Then + sDarkPath = File.SetBaseName(sPath, sBaseName & "-dark") + If Exist(sDarkPath) Then + Try hPict = Image.Load(sDarkPath).Picture + Else + Try hPict = Image.Load(sPath).Invert(True).Picture + Endif + If hPict Then Goto __LOAD_OK + Endif + + Try hPict = Image.Load(sPath).Picture + If Error Then + 'Error "gb.gui: warning: unable to load icon "; Path; ": "; System.Backtrace.Join(" ") + Return Null + Endif + Endif + +__LOAD_OK: + + $cCache[sKey] = hPict + Return hPict + +End + +Static Public Sub _put(Value As Picture, Path As String) + + Dim sKey As String + + If Not Path Then Return + + sKey = GetKey(Path) + $cCache[sKey] = Value + +End + +Static Public Sub Flush() + + $cCache.Clear + +End + +Static Public Sub _exit() + + $cCache.Clear + +End + diff --git a/comp/src/gb.gui.base/.src/PictureBox.class b/comp/src/gb.gui.base/.src/PictureBox.class new file mode 100644 index 00000000..7b8ac63a --- /dev/null +++ b/comp/src/gb.gui.base/.src/PictureBox.class @@ -0,0 +1,311 @@ +' Gambas class file + +Export +Inherits DrawingArea + +Public Const _Properties As String = "*,-Arrangement,-Spacing,-Margin,-Indent,-Invert,-NoBackground,-Tablet,-Cached,-Focus,Padding{Range:0;64},Picture,Stretch,AutoResize,Alignment{Align.*}=TopLeft,Border{Border.None;Plain;Sunken;Raised;Etched},Mode{PictureBox.Normal;Fill;Cover;Contain;Repeat}" +Public Const _DefaultEvent As String = "MouseDown" +Public Const _DefaultSize As String = "16,16" +Public Const _IsContainer As Boolean = False +Public Const _Group As String = "Form" + +Property Picture As Picture +Property Image As Image +Property Alignment As Integer +Property AutoResize As Boolean +Property Padding As Integer +Property Border As Integer +Property Stretch As Boolean +Property Mode As Integer + +Public Enum Normal, Fill, Cover, Contain, {Repeat} + +Static Private $hDefault As Image + +Private $hObs As Observer +Private $iAlign As Integer = Align.TopLeft +Private $iPadding As Integer +Private $iBorder As Integer +Private $iMode As Integer +Private $hPicture As Picture +Private $hImage As Image +Private $bAutoResize As Boolean +Private $bStretch As Boolean + +Public Sub _new() + + $hObs = New Observer(Me) As "DrawingArea" + +End + + +Private Function Alignment_Read() As Integer + + Return $iAlign + +End + +Private Sub Alignment_Write(Value As Integer) + + If $iAlign = Value Then Return + $iAlign = Value + Me.Refresh + +End + +Private Function AutoResize_Read() As Boolean + + Return $bAutoResize + +End + +Private Sub GetPadding() As Integer + + Dim P As Integer + + P = $iPadding + Select Case $iBorder + Case Border.Plain + Inc P + Case Border.Raised, Border.Sunken + P += Style.FrameWidth + End Select + + Return P + +End + +Private Sub UpdateSize() + + Dim W As Integer + Dim H As Integer + Dim P As Integer + + If Me.Design Then Return + If Not $bAutoResize Then Return + If $hImage Then + W = $hImage.W + H = $hImage.H + Else If $hPicture Then + W = $hPicture.W + H = $hPicture.H + Endif + If W And If H Then + P = GetPadding() * 2 + Me.Resize(W + P, H + P) + Endif + +End + +Private Sub AutoResize_Write(Value As Boolean) + + If $bAutoResize = Value Then Return + $bAutoResize = Value + UpdateSize + +End + +Private Function Padding_Read() As Integer + + Return $iPadding + +End + +Private Sub Padding_Write(Value As Integer) + + If $iPadding = Value Then Return + $iPadding = Value + Me.Refresh + +End + +Private Function Border_Read() As Integer + + Return $iBorder + +End + +Private Sub Border_Write(Value As Integer) + + If $iBorder = Value Then Return + $iBorder = Value + UpdateSize + Me.Refresh + +End + +Private Function Stretch_Read() As Boolean + + Return $bStretch + +End + +Private Sub Stretch_Write(Value As Boolean) + + If $bStretch = Value Then Return + $bStretch = Value + Me.Refresh + +End + +Private Function Mode_Read() As Integer + + Return $iMode + +End + +Private Sub Mode_Write(Value As Integer) + + If $iMode = Value Then Return + $iMode = Value + Me.Refresh + +End + +Private Function Picture_Read() As Picture + + Return $hPicture + +End + +Private Sub Picture_Write(Value As Picture) + + $hPicture = Value + UpdateSize + Me.Refresh + +End + +Private Function Image_Read() As Image + + Return $hImage + +End + +Private Sub Image_Write(Value As Image) + + $hImage = Value + UpdateSize + Me.Refresh + +End + +Public Sub DrawingArea_Draw() + + Dim W As Integer + Dim H As Integer + Dim WW As Integer + Dim P As Integer + Dim HH As Integer + Dim SX As Float + Dim SY As Float + Dim S As Float + Dim X As Integer + Dim Y As Integer + Dim XX As Integer + Dim YY As Integer + Dim iMode As Integer + + If $hImage Then + W = $hImage.W + H = $hImage.H + Else If $hPicture Then + W = $hPicture.W + H = $hPicture.H + Endif + + If $iBorder Then Style.PaintPanel(0, 0, Paint.W, Paint.H, $iBorder) + + If W = 0 Or If H = 0 Then + If Me.Design Then + If Not $hDefault Then $hDefault = Image.Load("picturebox.png") + Paint.DrawImage($hDefault, Desktop.Scale, Desktop.Scale) + Endif + Stop Event + Return + Endif + + P = GetPadding() + + If $bAutoResize Then + GoSub PAINT_IMAGE + Stop Event + Return + Endif + + WW = Me.W - P * 2 + HH = Me.H - P * 2 + + If $bStretch Then + iMode = Fill + Else + iMode = $iMode + Endif + + Select Case iMode + + Case Normal, {Repeat} + + Case Fill + W = WW + H = HH + + Case Cover, Contain + SX = WW / W + SY = HH / H + If $iMode = Cover Then + S = Max(SX, SY) + Else + S = Min(SX, SY) + Endif + W *= S + H *= S + + End Select + + If Align.IsLeft($iAlign) Then + X = 0 + Else If Align.IsRight($iAlign) Then + X = WW - W + Else + X = (WW - W) \ 2 + Endif + + If Align.IsTop($iAlign) Then + Y = 0 + Else If Align.IsBottom($iAlign) Then + Y = HH - H + Else + Y = (HH - H) \ 2 + Endif + + If iMode = {Repeat} Then + + XX = X - CInt(Ceil(X / W)) * W + YY = Y - CInt(Ceil(Y / H)) * H + + For X = XX To WW Step W + For Y = YY To HH Step H + GoSub PAINT_IMAGE + Next + Next + + Else + + GoSub PAINT_IMAGE + + Endif + + Stop Event + Return + +PAINT_IMAGE: + + If $hImage Then + Paint.DrawImage($hImage, X + P, Y + P, W, H) + Else + Paint.DrawPicture($hPicture, X + P, Y + P, W, H) + Endif + Return + +End diff --git a/comp/src/gb.gui.base/.src/ProgressBar.class b/comp/src/gb.gui.base/.src/ProgressBar.class new file mode 100644 index 00000000..d59a9c66 --- /dev/null +++ b/comp/src/gb.gui.base/.src/ProgressBar.class @@ -0,0 +1,188 @@ +' Gambas class file + +Export + +Inherits UserControl + +Public Const _Properties As String = "*,Action,Label=True,Border=True,Pulse" +Public Const _Group As String = "Form" +Public Const _DefaultEvent As String = "MouseDown" +Public Const _DefaultSize As String = "24,4" + +Property Label As Boolean +Property Value As Float +Property Pulse As Boolean +Property Border As Boolean + +Private $hDrawingArea As DrawingArea +Private $fValue As Float +Private $bLabel As Boolean = True +Private $bPulse As Boolean +Private $iPulse As Integer +Private $hTimerPulse As Timer +Private $bBorder As Boolean = True + +Public Sub _new() + + $hDrawingArea = New DrawingArea(Me) As "DrawingArea" + Me.Proxy = $hDrawingArea + +End + + +Private Function Label_Read() As Boolean + + Return $bLabel + +End + +Private Sub Label_Write(Value As Boolean) + + $bLabel = Value + $hDrawingArea.Refresh + +End + +Private Function Value_Read() As Float + + If $bPulse Then Return + Return $fValue + +End + +Private Sub Value_Write(Value As Float) + + If $bPulse Then Return + $fValue = Max(0, Min(1, Value)) + $hDrawingArea.Refresh + +End + +Public Sub DrawingArea_Draw() + + Dim F As Integer '= 2 'Max(4, Style.FrameWidth + 2) + Dim iWP As Integer + Dim W As Float + Dim iCol As Integer + + iCol = Color.Merge(Color.Background, Color.LightForeground) + If Not Me.Enabled Then iCol = Color.Desaturate(iCol) + + 'Paint.FillRect(F, F, Paint.W - F * 2, Paint.H - F * 2, iCol) + + If $bBorder Then + 'Paint.AntiAlias = False + Paint.Background = Color.LightForeground + Paint.Rectangle(0.5, 0.5, Paint.W - 1, Paint.H - 1) + Paint.Stroke + 'Paint.AntiAlias = True + F = 2 + Else + F = 0 + Endif + + iCol = Color.SelectedBackground + If Not Me.Enabled Then iCol = Color.Desaturate(iCol) + + 'Draw.Foreground = Color.LightForeground + 'Draw.Rect(0, 0, Paint.W, Paint.H) + + 'Style.PaintPanel(0, 0, Paint.W, Paint.H, Border.Sunken) + + Paint.Rectangle(F, F, Paint.W - F * 2, Paint.H - F * 2) + Paint.Clip + + If $bPulse Then + + iWP = Paint.H * 2 + W = Paint.W - iWP + If W >= 10 Then + W *= $fValue + Paint.FillRect(W, 0, iWP, Paint.H, iCol) + 'Style.PaintPanel(W, 0, iWP, Paint.H, Border.Raised) + Endif + + Else + + W = Paint.W * $fValue + + Paint.FillRect(0, 0, W, Paint.H, iCol) + + 'Style.PaintPanel(F, F, W, Draw.H - F * 2, Border.Raised) + + If $bLabel Then + + Paint.Save + Paint.Rectangle(0, 0, W, Paint.H) + Paint.Clip + Paint.Background = Color.SelectedForeground + Paint.DrawText(Format($fValue, "0%"), 0, 0, Paint.W, Paint.H, Align.Center) + Paint.Restore + + Paint.Save + Paint.Rectangle(W, 0, Paint.W - W, Paint.H) + Paint.Clip + Paint.Background = Color.Foreground + Paint.DrawText(Format($fValue, "0%"), 0, 0, Paint.W, Paint.H, Align.Center) + Paint.Restore + + Endif + + Endif + +End + + +Private Function Pulse_Read() As Boolean + + Return $bPulse + +End + +Private Sub Pulse_Write(Value As Boolean) + + If Value = $bPulse Then Return + + $bPulse = Value + + If Me.Design Then Return + + If $bPulse And If Me.W > (Me.H * 2) Then + $hTimerPulse = New Timer As "Pulse" + $hTimerPulse.Delay = 20 + $hTimerPulse.Start + $fValue = 0 + $iPulse = 1 + Else + $hTimerPulse = Null + Endif + +End + +Public Sub Pulse_Timer() + + $fValue += 0.02 * $iPulse + If $fValue < 0 Then + $fValue = 0 + $iPulse = 1 + Else If $fValue > 1 Then + $fValue = 1 + $iPulse = -1 + Endif + + $hDrawingArea.Refresh + +End + +Private Function Border_Read() As Boolean + + Return $bBorder + +End + +Private Sub Border_Write(Value As Boolean) + + $bBorder = Value + $hDrawingArea.Refresh + +End diff --git a/comp/src/gb.gui.base/.src/ScrollArea.class b/comp/src/gb.gui.base/.src/ScrollArea.class new file mode 100644 index 00000000..131a3196 --- /dev/null +++ b/comp/src/gb.gui.base/.src/ScrollArea.class @@ -0,0 +1,1076 @@ +' Gambas class file + +Export +Inherits UserContainer + +Public Const _Properties As String = "*,Border=True,ScrollBar{Scroll.*}=Both,Focus,NoBackground,Tablet,Shadow,NoShadow" +Public Const _DefaultEvent As String = "Draw" +Public Const _DefaultSize As String = "24,24" +Public Const _Similar As String = "DrawingArea,ScrollView" +'Public Const _Group As String = "View" + +Property ScrollX As Integer +Property ScrollY As Integer +Property Read ScrollWidth, ScrollW, ContentsWidth, ContentsW As Integer +Property Read ScrollHeight, ScrollH, ContentsHeight, ContentsH As Integer + +Property Read ClientWidth, ClientW As Integer +Property Read ClientHeight, ClientH As Integer + +Property Border As Boolean +Property Focus As Boolean +Property Painted As Boolean +Property NoBackground As Boolean +Property ScrollBar As Integer +Property Tracking As Boolean +Property Background As Integer +Property Foreground As Integer +Property Tablet As Boolean +Property Shadow As Boolean +Property NoShadow As Boolean +Property Read View As DrawingArea +Property UseMouse As Boolean +Property Read Scrolling As Boolean + +Event Scroll +Event Draw +Event Resize +Event Font + +Static Private $hFadeN As Picture +Static Private $hFadeS As Picture +Static Private $hFadeW As Picture +Static Private $hFadeE As Picture +Static Private $iFadeColor As Integer = -1 + +Private $bUseMouse As Boolean = True +Private $bNoArrange As Boolean +Private $hDrawingArea As DrawingArea +Private $hHBar As ScrollBar +Private $hVBar As ScrollBar +Private $bHBarVisible As Boolean +Private $bVBarVisible As Boolean +Private $hObserver As Observer +Private $iScroll As Integer = Scroll.Both +Private $iBackground As Integer = Color.Default +Private $hTimerAutoScroll As Timer +Private $hTimerArrange As Timer +Private $DX As Integer +Private $DY As Integer + +Private $W As Integer +Private $H As Integer + +Private $bShadow As Boolean +Private $bNoShadow As Boolean +Private $iShadowN As Integer +Private $iShadowS As Integer +Private $iShadowW As Integer +Private $iShadowE As Integer +Private $hShadowN As DrawingArea +Private $hShadowS As DrawingArea +Private $hShadowW As DrawingArea +Private $hShadowE As DrawingArea +Private $hCorner As DrawingArea +Private $hBorder As DrawingArea + +Private $iScrollX As Integer +Private $iScrollY As Integer +Private $iTargetX As Integer +Private $iTargetY As Integer +Private $hTimerScroll As Timer +Private $bIgnoreNextAnimation As Boolean + +Private Sub LoadFades() + + Dim hImage As Image + Dim Y As Integer + Dim iColor As Integer + + iColor = Color.Desaturate(If(Me.Foreground = Color.Default, Color.TextForeground, Me.Foreground)) + + If iColor = $iFadeColor Then Return + + hImage = New Image(32, 4, Color.Transparent) + For Y = 0 To 3 + hImage.FillRect(0, Y, hImage.W, 1, Color.SetAlpha(iColor, 180 + Y * 24)) + Next + + $hFadeN = hImage.Picture + hImage.RotateLeft + $hFadeW = hImage.Picture + hImage.RotateLeft + $hFadeS = hImage.Picture + hImage.RotateLeft + $hFadeE = hImage.Picture + + $iFadeColor = iColor + +End + + +Public Sub _new() + + Me.Arrangement = Arrange.None + + '$hBorder = New DrawingArea(Me) As "Border" + '$hBorder.Arrangement = Arrange.Fill + + $hDrawingArea = New DrawingArea(Me) As "DrawingArea" + $hObserver = New Observer(Me) As "ScrollArea" + + $hHBar = New ScrollBar(Me) As "Scrollbar" + $hHBar.Step = Desktop.Scale + $hVBar = New ScrollBar(Me) As "Scrollbar" + $hVBar.Step = Desktop.Scale + + $hCorner = New DrawingArea(Me) + $hCorner.Hide + + Me.Proxy = $hDrawingArea + Me._Container = $hDrawingArea + + Border_Write(True) + + $bIgnoreNextAnimation = True + 'ScrollArea_Arrange + ' + 'Debug "<<<<<" + +End + +Private Sub UpdateScrollbarVisibility() + + 'If Me.Hovered Then + + $hHBar.Visible = $bHBarVisible + $hVBar.Visible = $bVBarVisible + $hCorner.Visible = $bHBarVisible And $bHBarVisible + + 'Else + + ' $hHBar.Visible = False + ' $hVBar.Visible = False + + 'Endif + +End + + +Private Sub LayoutScrollbars() + + Dim SB, SP, FW, X, Y, W, H, P As Integer + Dim bHBarAllowed, bVBarAllowed As Boolean + Dim bHBarVisible, bVBarVisible As Boolean + Dim OW, OH, OWC, OHC As Integer + + If $bNoArrange Then Return + + $bNoArrange = True + + 'Debug Me.ClientW;; System.Backtrace.Join(" ") + + SB = Style.ScrollbarSize + SP = 0 'Style.ScrollbarSpacing + If $hBorder Then + FW = 1 + X = 1 + Y = 1 + Endif + + bHBarAllowed = $iScroll = Scroll.Horizontal Or $iScroll = Scroll.Both + bVBarAllowed = $iScroll = Scroll.Vertical Or $iScroll = Scroll.Both + bHBarVisible = $bHBarVisible + bVBarVisible = $bVBarVisible + +RETRY: + + OWC = $W + OHC = $H + + W = Me.Width - FW * 2 + H = Me.Height - FW * 2 + 'Debug W;; H;; "/";; $W;; $H;; bHBarAllowed;; bVBarAllowed + + If W >= $W And If H >= $H Then + + $hHBar.MinValue = 0 + $hHBar.MaxValue = 0 + $hVBar.MinValue = 0 + $hVBar.MaxValue = 0 + '$hHBar.Hide + '$hVBar.Hide + bHBarVisible = False + bVBarVisible = False + + Else If bHBarAllowed And If $W > W And If $H <= (H - SB - SP) Then + + $hHBar.MinValue = 0 + $hHBar.MaxValue = $W - W + $hHBar.PageStep = W + $hVBar.MinValue = 0 + $hVBar.MaxValue = 0 + '$hHBar.Show + '$hVBar.Hide + bHBarVisible = True + bVBarVisible = False + + Else If bVBarAllowed And If $H > H And If $W <= (W - SB - SP) Then + + $hVBar.MinValue = 0 + $hVBar.MaxValue = $H - H + $hVBar.PageStep = H + $hHBar.MinValue = 0 + $hHBar.MaxValue = 0 + '$hHBar.Hide + '$hVBar.Show + bHBarVisible = False + bVBarVisible = True + + Else + + $hHBar.MinValue = 0 + If bVBarAllowed Then + P = W - SB - SP + Else + P = W + Endif + If $W > P Then + $hHBar.MaxValue = $W - P + $hHBar.PageStep = P + '$hHBar.Visible = bHBarAllowed + bHBarVisible = bHBarAllowed + Else + '$hHBar.Hide + $hHBar.MinValue = 0 + $hHBar.MaxValue = 0 + bHBarVisible = False + Endif + + $hVBar.MinValue = 0 + If bHBarAllowed Then + P = H - SB - SP + Else + P = H + Endif + If $H > P Then + $hVBar.MaxValue = $H - P + $hVBar.PageStep = P + '$hVBar.Visible = bVBarAllowed + bVBarVisible = bVBarAllowed + Else + '$hVBar.Hide + $hVBar.MinValue = 0 + $hVBar.MaxValue = 0 + bVBarVisible = False + Endif + + Endif + + 'If $hHBar.Visible Then H -= SB + SP + 'If $hVBar.Visible Then W -= SB + SP + If bHBarVisible Then H -= SB + SP + If bVBarVisible Then W -= SB + SP + + 'W += FW * 2 + 'H += FW * 2 + + If W <> OW Or If H <> OH Then + OW = W + OH = H + Goto RETRY + Endif + + 'Debug W;; H;; "/";; Me.W;; Me.H;; ":";; SB;; SP + + If W < 1 Or If H < 1 Then + $hDrawingArea.Hide + Else + If $bVBarVisible And If System.RightToLeft Then + $hDrawingArea.Move(SP + SB + X, Y, W, H) + Else + $hDrawingArea.Move(X, Y, W, H) + Endif + $hDrawingArea.Show + Endif + + If bHBarVisible <> $bHBarVisible Or If bVBarVisible <> $bVBarVisible Then Raise Resize + + If $W <> OWC Or If $H <> OHC Then Goto RETRY + + $bHBarVisible = bHBarVisible + $bVBarVisible = bVBarVisible + UpdateScrollbarVisibility + + If $bHBarVisible Then + If System.RightToLeft Then + $hHBar.Move(X + Me.W - W, Y + H + SP, W, SB) + Else + $hHBar.Move(X, Y + H + SP, W, SB) + Endif + Endif + If $bVBarVisible Then + If System.RightToLeft Then + $hVBar.Move(X, Y, SB, H) + Else + $hVBar.Move(X + W + SP, Y, SB, H) + Endif + Endif + + If $bHBarVisible And If $bVBarVisible Then + $hCorner.Move($hVBar.X, $hHBar.Y, SB, SB) + $hCorner.Show + Else + $hCorner.Hide + Endif + + $bNoArrange = False + + LayoutShadows + +End + +Private Sub LayoutShadows() + + Dim hSave As Container + Dim bShadow As Boolean + + If Not $bNoShadow Then bShadow = $bShadow Or Application.Shadows + + If Not bShadow Then + + If $hShadowN Then + $hShadowN.Delete + $hShadowN = Null + Endif + If $hShadowS Then + $hShadowS.Delete + $hShadowS = Null + Endif + If $hShadowW Then + $hShadowW.Delete + $hShadowW = Null + Endif + If $hShadowE Then + $hShadowE.Delete + $hShadowE = Null + Endif + Return + + Endif + + If Not $hShadowN Then + hSave = Me._Container + Me._Container = Null + $hShadowN = New DrawingArea(Me) As "Shadow" + $hShadowN.Ignore = True + $hShadowS = New DrawingArea(Me) As "Shadow" + $hShadowS.Ignore = True + $hShadowW = New DrawingArea(Me) As "Shadow" + $hShadowW.Ignore = True + $hShadowE = New DrawingArea(Me) As "Shadow" + $hShadowE.Ignore = True + Me._Container = hSave + Endif + + 'If $bVBarVisible Then + LoadFades() + $hShadowN.Move($hDrawingArea.X + $iShadowW, $hDrawingArea.Y + $iShadowN, Me.ClientW - $iShadowE - $iShadowW, $hFadeN.H) + $hShadowN.Raise + $hShadowS.Move($hDrawingArea.X + $iShadowW, $hDrawingArea.Y + Me.ClientH - $iShadowS - $hFadeS.H, Me.ClientW - $iShadowE - $iShadowW, $hFadeS.H) + $hShadowS.Raise + 'Paint.Rectangle(hClip.X + $iShadowW, hClip.Y + $iShadowN, hClip.W - $iShadowW - $iShadowE, hClip.H - $iShadowN - $iShadowS) + 'Paint.Clip() + $hShadowN.Visible = $iScrollY > $hVBar.MinValue 'Then Draw.Tile($hFadeN, 0, $iShadowN - Max(0, $hFadeN.H - ($iScrollY - $hVBar.MinValue)), DW, $hFadeN.H) + $hShadowS.Visible = $iScrollY < $hVBar.MaxValue 'Then Draw.Tile($hFadeS, 0, DH - $hFadeS.H - $iShadowS + Max(0, $hFadeS.H - ($hVBar.MaxValue - $iScrollY)), DW, $hFadeS.H) + 'Else + ' $hShadowN.Hide + ' $hShadowS.Hide + 'Endif + + 'If $bHBarVisible Then + LoadFades() + $hShadowW.Move($hDrawingArea.X + $iShadowW, $hDrawingArea.Y + $iShadowN, $hFadeW.W, Me.ClientH - $iShadowS - $iShadowN) + $hShadowW.Raise + $hShadowE.Move($hDrawingArea.X + Me.ClientW - $iShadowE - $hFadeE.W, $hDrawingArea.Y + $iShadowN, $hFadeE.W, Me.ClientH - $iShadowS - $iShadowN) + $hShadowE.Raise + 'Paint.Rectangle(hClip.X + $iShadowW, hClip.Y + $iShadowN, hClip.W - $iShadowW - $iShadowE, hClip.H - $iShadowN - $iShadowS) + 'Paint.Clip() + If System.RightToLeft Then + $hShadowE.Visible = $iScrollX > $hHBar.MinValue 'Then Draw.Tile($hFadeN, 0, $iShadowN - Max(0, $hFadeN.H - ($iScrollY - $hVBar.MinValue)), DW, $hFadeN.H) + $hShadowW.Visible = $iScrollX < $hHBar.MaxValue 'Then Draw.Tile($hFadeS, 0, DH - $hFadeS.H - $iShadowS + Max(0, $hFadeS.H - ($hVBar.MaxValue - $iScrollY)), DW, $hFadeS.H) + Else + $hShadowW.Visible = $iScrollX > $hHBar.MinValue 'Then Draw.Tile($hFadeN, 0, $iShadowN - Max(0, $hFadeN.H - ($iScrollY - $hVBar.MinValue)), DW, $hFadeN.H) + $hShadowE.Visible = $iScrollX < $hHBar.MaxValue 'Then Draw.Tile($hFadeS, 0, DH - $hFadeS.H - $iShadowS + Max(0, $hFadeS.H - ($hVBar.MaxValue - $iScrollY)), DW, $hFadeS.H) + Endif + 'Else + ' $hShadowW.Hide + ' $hShadowE.Hide + 'Endif + + ' If $bHBarVisible Then + ' LoadFades() + ' Paint.Rectangle(hClip.X + $iShadowW, hClip.Y + $iShadowN, hClip.W - $iShadowW - $iShadowE, hClip.H - $iShadowN - $iShadowS) + ' Paint.Clip() + ' bWestShadow = $iScrollX > $hHBar.MinValue + ' bEastShadow = $iScrollX < $hHBar.MaxValue + ' iWestWidth = $iScrollX - $hHBar.MinValue + ' iEastWidth = $hHBar.MaxValue - $iScrollX + ' If System.RightToLeft Then + ' Swap bWestShadow, bEastShadow + ' Swap iWestWidth, iEastWidth + ' Endif + ' If bWestShadow Then Draw.Tile($hFadeW, $iShadowW - Max(0, $hFadeW.W - iWestWidth), 0, $hFadeW.W, DH) + ' If bEastShadow Then Draw.Tile($hFadeE, DW - $hFadeE.W - $iShadowE + Max(0, $hFadeE.W - iEastWidth), 0, $hFadeE.W, DH) + ' Endif + +End + +Public Sub Shadow_Draw() + + Select Case Last + Case $hShadowN + Draw.Tile($hFadeN, 0, 0, Paint.W, Paint.H) + Case $hShadowS + Draw.Tile($hFadeS, 0, 0, Paint.W, Paint.H) + Case $hShadowW + Draw.Tile($hFadeW, 0, 0, Paint.W, Paint.H) + Case $hShadowE + Draw.Tile($hFadeE, 0, 0, Paint.W, Paint.H) + End Select + +End + + +Public Sub TimerArrange_Timer() + + LayoutScrollbars + $hTimerArrange = Null + +End + +Public Sub ScrollArea_Arrange() + + LayoutScrollbars + If $hBorder Then + $hBorder.Move(0, 0, Me.W, Me.H) + '' GTK+ does not like if Lower() is called during the Arrange event! + ' $hBorder.Lower + Endif + + ' If Not $hTimerArrange Then + ' $hTimerArrange = New Timer As "TimerArrange" + ' $hTimerArrange.Trigger + ' Endif + +End + +' Public Sub ScrollArea_Enter() +' +' UpdateScrollbarVisibility +' +' End +' +' Public Sub ScrollArea_Leave() +' +' UpdateScrollbarVisibility +' +' End + +Public Sub ResizeContents(Width As Integer, Height As Integer) + + If $W = Width And If $H = Height Then Return + + $bIgnoreNextAnimation = True + + $W = Width + $H = Height + + 'Debug $W;; $H;; System.Backtrace.Join(" ") + + LayoutScrollbars + + $hDrawingArea.Refresh + +End + + +Private Function ScrollX_Read() As Integer + + If System.RightToLeft Then + Return $hHBar.MaxValue - $iScrollX + Else + Return $iScrollX + Endif + +End + +Private Sub ScrollX_Write(Value As Integer) + + If Application.Animations Then + Scroll(Value, $iTargetY) + Else + Scroll(Value, $iScrollY) + Endif + +End + +Private Function ScrollY_Read() As Integer + + Return $iScrollY + +End + +Private Sub ScrollY_Write(Value As Integer) + + If Application.Animations Then + Scroll($iTargetX, Value) + Else + Scroll($iScrollX, Value) + Endif + +End + +Public Sub Scroll(X As Integer, Y As Integer) As Boolean + + If System.RightToLeft Then X = $hHBar.MaxValue - X + + X = Max($hHBar.MinValue, Min($hHBar.MaxValue, X)) + Y = Max($hVBar.MinValue, Min($hVBar.MaxValue, Y)) + + 'If $iTargetX = X And If $iTargetY = Y Then Return + + If X = $hHBar.Value And If Y = $hVBar.Value Then Return True + + $hHBar.Value = X + $hVBar.Value = Y + +End + +Private Sub UpdateScroll(DX As Integer, DY As Integer) + + Dim hChild As Control + + $iScrollX += DX + $iScrollY += DY + + For Each hChild In $hDrawingArea.Children + hChild.Move(hChild.X - DX, hChild.Y - DY) + Next + + LayoutShadows + + $hDrawingArea.Refresh + + Raise Scroll + +End + +Public Sub Scrollbar_Change() + + $iTargetX = $hHBar.Value + $iTargetY = $hVBar.Value + + If $iTargetX <> $iScrollX Or If $iTargetY <> $iScrollY Then + + If Application.Animations And If Not $bIgnoreNextAnimation Then + + If Not $hTimerScroll Then + $hTimerScroll = New Timer As "TimerScroll" + $hTimerScroll.Delay = 20 + Endif + $hTimerScroll.Start + + Else + + UpdateScroll($iTargetX - $iScrollX, $iTargetY - $iScrollY) + + Endif + + Endif + +End + +Public Sub TimerScroll_Timer() + + UpdateScroll(($iTargetX - $iScrollX + Sgn($iTargetX - $iScrollX)) \ 2, ($iTargetY - $iScrollY + Sgn($iTargetY - $iScrollY)) \ 2) + If $iScrollX = $iTargetX And If $iScrollY = $iTargetY Then $hTimerScroll.Stop + +End + + +Public Sub DrawingArea_Draw() + + Dim DW As Integer + Dim DH As Integer + Dim FW As Integer + Dim hClip As Rect + Dim hFrame As Rect + + DW = Draw.W + 'If $bVBarVisible Then DW -= $hVBar.W + 'If System.RightToLeft Then DX = $hVBar.W + Style.ScrollbarSpacing + DH = Draw.H + 'If $bHBarVisible Then DH -= $hHBar.H + + If $iBackground <> Color.Default Then + Paint.FillRect(FW, FW, DW - FW * 2, DH - FW * 2, $iBackground) + Endif + + 'Debug Draw.Clip.X;; Draw.Clip.Y;; Draw.Clip.W;; Draw.Clip.H + + 'hClip = New Rect(Draw.Clip.X, Draw.Clip.Y, Draw.Clip.W, Draw.Clip.H) + hClip = Draw.ClipRect + + If FW Then + hFrame = New Rect(FW, FW, DW - FW * 2, DH - FW * 2) + If hClip Then + hClip = hClip.Intersection(hFrame) + If hClip Then + Paint.Rectangle(hClip.X, hClip.Y, hClip.W, hClip.H) + Paint.Clip() + Endif + Endif + Endif + + If hClip Then + + 'Draw.ClipRect = hClip '(hClip.X, hClip.Y, hClip.W, hClip.H) + + 'If $bShadow Then Paint.Save + + Raise Draw + + Endif + + $bIgnoreNextAnimation = False + +End + +Public Sub DrawingArea_Enter() + + $hDrawingArea.Refresh + +End + +Public Sub DrawingArea_Leave() + + $hDrawingArea.Refresh + +End + +Public Sub DrawingArea_Arrange() + + Raise Resize + +End + +Private Function Border_Read() As Boolean + + Return $hBorder + +End + +Private Sub Border_Write(Value As Boolean) + + Dim hSave As Container + + If Border_Read() = Value Then Return + + If Value Then + hSave = Me._Container + Me._Container = Null + $hBorder = New DrawingArea(Me) As "Border" + $hBorder.Lower '' GTK+ does not like if Lower() is called during the Arrange event! + Me._Container = hSave + Else + $hBorder.Delete + $hBorder = Null + Endif + + ScrollArea_Arrange + +End + +Private Function Focus_Read() As Boolean + + Return $hDrawingArea.Focus + +End + +Private Sub Focus_Write(Value As Boolean) + + $hDrawingArea.Focus = Value + +End + +Private Function Painted_Read() As Boolean + + Error "gb.gui: ScrollArea.Painted is deprecated. Do not use it anymore" + Return True + +End + +Private Sub Painted_Write((Value) As Boolean) + + Painted_Read() + +End + +Private Function NoBackground_Read() As Boolean + + Return $hDrawingArea.NoBackground + +End + +Private Sub NoBackground_Write(Value As Boolean) + + $hDrawingArea.NoBackground = Value + +End + +Private Function Scrollbar_Read() As Integer + + Return $iScroll + +End + +Private Sub Scrollbar_Write(Value As Integer) + + If $iScroll < Scroll.None Or If $iScroll > Scroll.Both Then Return + $iScroll = Value + ScrollArea_Arrange + +End + +Private Function ScrollWidth_Read() As Integer + + Return $W + +End + +Private Function ScrollHeight_Read() As Integer + + Return $H + +End + +Private Function Tracking_Read() As Boolean + + Return $hDrawingArea.Tracking + +End + +Private Sub Tracking_Write(Value As Boolean) + + $hDrawingArea.Tracking = Value + Super.Tracking = Value + +End + +Public Sub DrawingArea_MouseWheel() + + If Not Me.Enabled Or If Me.Design Then Return + If Not $bUseMouse Then Return + + If Mouse.Orientation = Mouse.Horizontal Or If $H <= $hDrawingArea.H Then + Scroll($iScrollX - Mouse.Delta * $hHBar.PageStep / 4, $iScrollY) + Else + Scroll($iScrollX, $iScrollY - Mouse.Delta * $hVBar.PageStep / 4) + Endif + +End + +Private Sub GetActualScroll(ByRef SX As Integer, ByRef SY As Integer) + + If Application.Animations Then + SX = $iScrollX + SY = $iScrollY + Else + SX = Me.ScrollX + SY = Me.ScrollY + Endif + +End + +Public Sub EnsureVisible(X As Integer, Y As Integer, W As Integer, H As Integer) As Boolean + + Dim PW, PH, CX, CY, CW, CH As Integer + Dim XX, YY, WW, HH As Float + + ' If $bBorder Then + ' F = 1 'Style.FrameWidth + ' X -= F + ' Y -= F + ' W += F * 2 + ' H += F * 2 + ' Endif + + 'Debug Me;; X;; Y;; W;; H;; "[";; $hDrawingArea.W;; $hDrawingArea.H;; "]";; System.Backtrace.Join(" ") + + WW = W / 2 + HH = H / 2 + XX = X + WW + YY = Y + HH + + PW = Me.ClientW '$hDrawingArea.W '- F * 2 + PH = Me.ClientH '$hDrawingArea.H '- F * 2 + + GetActualScroll(ByRef CX, ByRef CY) + CX = -CX + CY = -CY + CW = Me.ScrollWidth + CH = Me.ScrollHeight + + If PW < (WW * 2) Then WW = PW / 2 + If PH < (HH * 2) Then HH = PH / 2 + + If CW <= PW Then + WW = 0 + CX = 0 + Endif + + If CH <= PH Then + HH = 0 + CY = 0 + Endif + + If XX < (-CX + WW) Then + CX = Ceil(-XX + WW) + Else If XX >= (-CX + PW - WW) Then + CX = Floor(-XX + PW - WW) + Endif + + If YY < (-CY + HH) Then + CY = Ceil(-YY + HH) + Else If YY >= (-CY + PH - HH) Then + CY = Floor(-YY + PH - HH) + Endif + + If CX > 0 + CX = 0 + Else If CX < (PW - CW) And If CW > PW Then + CX = PW - CW + Endif + + If CY > 0 Then + CY = 0 + Else If CY < (PH - CH) And If CH > PH Then + CY = PH - CH + Endif + + CX = -CX + CY = -CY + + If Application.Animations Then + If $iTargetX = CX And If $iTargetY = CY Then Return True + Else + If $iScrollX = CX And If $iScrollY = CY Then Return True + Endif + + Return Scroll(CX, CY) + +End + +Private Function Background_Read() As Integer + + Return $iBackground + +End + +Private Sub Background_Write(Value As Integer) + + $iBackground = Value + $hHBar.Background = Value + $hVBar.Background = Value + $hCorner.Background = Value + $hDrawingArea.Refresh + +End + +Private Function View_Read() As DrawingArea + + Return $hDrawingArea + +End + +Public Sub _SetShadowOffset(North As Integer, South As Integer, West As Integer, East As Integer) + + $iShadowN = North + $iShadowS = South + $iShadowW = West + $iShadowE = East + +End + +Private Function Tablet_Read() As Boolean + + Return $hDrawingArea.Tablet + +End + +Private Sub Tablet_Write(Value As Boolean) + + $hDrawingArea.Tablet = Value + +End + +Private Function Shadow_Read() As Boolean + + Return $bShadow + +End + +Private Sub Shadow_Write(Value As Boolean) + + If $bShadow = Value Then Return + $bShadow = Value + LayoutShadows + +End + +Public Sub DrawingArea_DragMove() + + If Not $hTimerAutoScroll Then + $hTimerAutoScroll = New Timer As "TimerAutoScroll" + $hTimerAutoScroll.Delay = 50 + $hTimerAutoScroll.Start + Endif + + $DX = Drag.X + $DY = Drag.Y + +End + +Public Sub DrawingArea_DragLeave() + + If $hTimerAutoScroll Then + $hTimerAutoScroll.Stop + $hTimerAutoScroll = Null + Endif + +End + +Public Sub _EnsureVisibleScroll(X As Integer, Y As Integer) + + Dim SX, SY As Integer + + GetActualScroll(ByRef SX, ByRef SY) + If EnsureVisible(SX + X - 16, SY + Y - 16, 32, 32) Then Return + Drag.Hide + +End + + +Public Sub TimerAutoScroll_Timer() + + Me._EnsureVisibleScroll($DX, $DY) + +End + +Private Function ClientWidth_Read() As Integer + + Return $hDrawingArea.W + +End + +Private Function ClientHeight_Read() As Integer + + Return $hDrawingArea.H + +End + +Public Sub ScrollArea_MouseDown() + + 'Debug Mouse.X;; Mouse.Y;; $hDrawingArea.Hovered + + If Not $hDrawingArea.Hovered And If Not Me.Design Then + Stop Event + Return + Endif + + Mouse.Translate(-$hDrawingArea.X, 0) + +End + +Public Sub ScrollArea_MouseMove() + + Mouse.Translate(-$hDrawingArea.X, 0) + +End + + +Private Function UseMouse_Read() As Boolean + + Return $bUseMouse + +End + +Private Sub UseMouse_Write(Value As Boolean) + + $bUseMouse = Value + +End + +Public Sub DrawingArea_Font() + + Raise Font + +End + +Public Sub RefreshRect(X As Integer, Y As Integer, Width As Integer, Height As Integer) + + Dim SX, SY As Integer + GetActualScroll(ByRef SX, ByRef SY) + $hDrawingArea.Refresh(X - SX, Y - SY, Width, Height) + +End + +Private Function Foreground_Read() As Integer + + Return $hCorner.Foreground + +End + +Private Sub Foreground_Write(Value As Integer) + + $hDrawingArea.Foreground = Value + $hCorner.Foreground = Value + $hHBar.Foreground = Value + $hVBar.Foreground = Value + +End + +Public Sub Border_Draw() + + Style.PaintPanel(0, 0, $hBorder.W, $hBorder.H, Border.Plain, Style.StateOf($hDrawingArea)) 'If(Me.HasFocus, Draw.Focus, Draw.Normal)) + +End + +Private Function Scrolling_Read() As Boolean + + If Application.Animations Then + If $iTargetX <> $iScrollX Or If $iTargetY <> $iScrollY Then Return True + Endif + +End + +Public Sub DrawingArea_Change() + + LayoutShadows + +End + +Private Function NoShadow_Read() As Boolean + + Return $bNoShadow + +End + +Private Sub NoShadow_Write(Value As Boolean) + + If $bNoShadow = Value Then Return + $bNoShadow = Value + LayoutShadows + +End diff --git a/comp/src/gb.gui.base/.src/ScrollView.class b/comp/src/gb.gui.base/.src/ScrollView.class new file mode 100644 index 00000000..fb52fcfb --- /dev/null +++ b/comp/src/gb.gui.base/.src/ScrollView.class @@ -0,0 +1,127 @@ +' Gambas class file + +Export +Inherits ScrollArea + +Public Const _Properties As String = "*,Arrangement{Arrange.None;Horizontal;Vertical;Row;Column;Fill},Spacing,Margin,Padding{Range:0;63},Indent" +Public Const _DefaultEvent As String = "Draw" +Public Const _DefaultSize As String = "24,24" +Public Const _Similar As String = "DrawingArea,ScrollView" + +Private $hCont As Panel +Private $hObs As Observer +Private $hTimer As Timer +Private $bLock As Boolean + +Public Sub _new() + + $hObs = New Observer(Me.Proxy) As "Observer" + $hCont = New Panel(Me) As "Panel" + $hCont.Move(0, 0) + '$hCont.Background = Color.Yellow + Me._Container = $hCont + $hTimer = New Timer As "TimerArrange" + $hTimer.Trigger + +End + +Public Sub Panel_BeforeArrange() + + AutoResizeContents + +End + +Public Sub Panel_Arrange() + + AutoResizeContents + +End + +Public Sub TimerArrange_Timer() + + AutoResizeContents + $hTimer = Null + +End + + +Private Sub AutoResizeContents() + + Dim W, H As Integer + Dim hChild As Control + Dim iSaveArr As Integer + Dim D As Integer + + If $bLock Then Return + + 'If Me.Name = "lstRecent" Then Debug "scroll: "; Me.ScrollW;; Me.ScrollH;; "client: "; Me.ClientW;; Me.ClientH 'System.Backtrace.Join(" ") + + $bLock = True + + Do + + W = 0 + H = 0 + + For Each hChild In $hCont.Children + If Not hChild.Visible Then Continue + W = Max(W, hChild.X + hChild.W) + H = Max(H, hChild.Y + hChild.H) + Next + + If Me.Margin Then + D = Me.Padding + If D = 0 Then D = Desktop.Scale + W += D + H += D + Endif + + Select Case Me.Arrangement + Case Arrange.Horizontal, Arrange.TopBottom + H = Me.ClientH + Case Arrange.Vertical, Arrange.LeftRight + W = Me.ClientW + End Select + + 'If Me.Name = "lstRecent" Then Debug "W =";; W;; "H =";; H + If W = Me.ScrollW And If H = Me.ScrollH Then Break + + 'If Me.Name = "lstRecent" Then Debug "ResizeContents:";; W;; H + Me.ResizeContents(W, H) + + Loop + + W = Max(Me.ClientW, W) + H = Max(Me.ClientH, H) + + If $hCont.W <> W Or If $hCont.H <> H Then + 'If Me.Name = "svwTheme" Then Debug "Resize cont "; W;; H + $hCont.Resize(W, H) + iSaveArr = $hCont.Arrangement + $hCont.Arrangement = Arrange.None + $hCont.Arrangement = iSaveArr + Endif + + $bLock = False + +End + +Public Sub Panel_MouseDown() + + Me.SetFocus + 'Me.DrawingArea_MouseWheel + +End + +Public Sub Panel_MouseWheel() + + Me.SetFocus + Me.DrawingArea_MouseWheel + +End + +Public Sub Observer_Arrange() + + AutoResizeContents + +End diff --git a/comp/src/gb.gui.base/.src/Shortcut.class b/comp/src/gb.gui.base/.src/Shortcut.class new file mode 100644 index 00000000..ae6d576d --- /dev/null +++ b/comp/src/gb.gui.base/.src/Shortcut.class @@ -0,0 +1,49 @@ +' Gambas class file + +Export + +Static Public Sub _call(Text As String, Shortcut As String, Optional AddIfMissing As Boolean) As String + + Dim iPos As Integer + + ' iPos = String.InStr(Text, "&") + ' If iPos Then + ' Shortcut = String.Mid$(Text, iPos + 1, 1) + ' Text = String.Left(Text, iPos - 1) & String.Mid$(Text, iPos + 1) + ' Endif + + If Not Shortcut Then Return Text + + iPos = InStr(Text, Shortcut, 1, gb.IgnoreCase) + If iPos = 0 Then + If AddIfMissing Then Text &= " (&" & String.UCase(Shortcut) & ")" + Return Text + Else + Return Left(Text, iPos - 1) & "&" & Mid$(Text, iPos) + Endif + +End + +Static Public Sub FromKey() As String + + Dim sShortcut As String + Dim sSymbol As String + Dim hClass As Class + + If Key.Control Then sShortcut &= "Ctrl+" + If Key.Shift Then sShortcut &= "Shift+" + If Key.Alt Then sShortcut &= "Alt+" + If Key.Meta Then sShortcut &= "Meta+" + + hClass = Classes["Key"] + For Each sSymbol In hClass.Symbols + With hClass[sSymbol] + If .Kind = Class.Constant And If .Value = Key.Code Then + Return sShortcut & .Name + Endif + End With + Next + + Return sShortcut & String.Chr(Key.Code) + +End diff --git a/comp/src/gb.gui.base/.src/SpinBox.class b/comp/src/gb.gui.base/.src/SpinBox.class new file mode 100644 index 00000000..328a2c4d --- /dev/null +++ b/comp/src/gb.gui.base/.src/SpinBox.class @@ -0,0 +1,550 @@ +' Gambas class file + +Export + +Inherits UserControl + +Public Const _Properties As String = "*,Action,MinValue=0,MaxValue=100,Step=1,Wrap,Value,Alignment{Align.Normal;Left;Center;Right}=Normal,Border=True" +Public Const _Group As String = "Form" +Public Const _DefaultEvent As String = "Change" +Public Const _DefaultSize As String = "9,4" +Public Const _Similar As String = "TextBox,Slider" + +Event Change +Event Limit + +Property MinValue As Integer +Property MaxValue As Integer +Property Value As Integer +Property Border As Boolean +Property Wrap As Boolean +Property Step As Integer +Property Text As String +Property Background As Integer +Property Alignment As Integer +Property ShowZero As Boolean +Property ReadOnly As Boolean + +Private Enum ARROW_NONE, ARROW_TOP, ARROW_BOTTOM + +Private $hView As DrawingArea +Private $hTextBox As TextBox + +Private $iValue As Integer +Private $iMin As Integer +Private $iMax As Integer = 100 +Private $iInsideArrow As Integer +Private $hTimer As Timer +Private $bTimerAdd As Boolean +Private $bBorder As Boolean = True +Private $bWrap As Boolean +Private $iStep As Integer = 1 +Private $bShowZero As Boolean + +Public Sub _new() + + $hView = New DrawingArea(Me) As "View" + + $hTextBox = New TextBox($hView) As "TextBox" + $hTextBox.Border = False + $hTextBox.Text = "0" + $hTextBox.Background = Color.TextBackground + + Me.Proxy = $hTextBox + +End + +Private Sub GetArrowRect(iArrow As Integer, Optional bForDrawing As Boolean) As Rect + + Dim W As Integer + Dim H As Integer + Dim D As Integer + Dim hRect As Rect + Dim BW, BH As Integer + + If $bBorder Then + BW = Style.BoxFrameWidth + BH = Style.BoxFrameHeight + Endif + + D = Desktop.Scale + W = D * 2 + BW + H = Me.H \ 2 - BH + + If iArrow = ARROW_TOP Then + hRect = Rect(Me.W - W, BH, W, H) + Else + hRect = Rect(Me.W - W, Me.H - H - BH, W, H) + Endif + + If bForDrawing Then hRect = Rect(hRect.Center().X - D / 2, hRect.Center().Y - D \ 2, D, D) + Return hRect + +End + + +Public Sub View_Arrange() + + Dim W, H As Integer + Dim BW, BH As Integer + + If $bBorder Then + BW = Style.BoxFrameWidth + BH = Style.BoxFrameHeight + Endif + + 'Debug Style.BoxFrameWidth;; Style.BoxFrameHeight + + W = Me.W - BW * 2 - Desktop.Scale * 2 + H = Me.H - BH * 2 + + If W < 1 Or If H < 1 Then + $hTextBox.Hide + Else + $hTextBox.Move(BW, BH, W, H) + $hTextBox.Show + Endif + +End + +Public Sub View_Draw() + + Dim iState As Integer + Dim hRect As Rect + Dim iCol As Integer + + iCol = $hTextBox.Background + If iCol = Color.Default Then iCol = Color.TextBackground + + If $bBorder Then + + iState = Style.StateOf($hView) + If $hTextBox.HasFocus Then iState = iState Or Style.HasFocus + If $hView.Hovered Then iState = iState Or Style.Hovered + 'Debug "state = "; iState + 'Debug "border = "; Style.BoxFrameWidth + + Style.PaintBox(0, 0, Paint.W, Paint.H, iState, iCol) + + Else + + Paint.FillRect(0, 0, Paint.W, Paint.H, iCol) + + Endif + + hRect = GetArrowRect(ARROW_TOP, True) + If $iValue = $iMax Or If $hTextBox.ReadOnly Then + iState = Style.Disabled + Else If $iInsideArrow = ARROW_TOP + iState = Style.Hovered + Else + iState = Style.Normal + Endif + Style.PaintArrow(hRect.X, hRect.Y, hRect.W, hRect.H, Align.Top, iState) + + hRect = GetArrowRect(ARROW_BOTTOM, True) + If $iValue = $iMin Or If $hTextBox.ReadOnly Then + iState = Style.Disabled + Else If $iInsideArrow = ARROW_BOTTOM + iState = Style.Hovered + Else + iState = Style.Normal + Endif + Style.PaintArrow(hRect.X, hRect.Y, hRect.W, hRect.H, Align.Bottom, iState) + +End + +Private Sub ChangeValue(bAdd As Boolean, Optional bFocus As Boolean) + + Dim iValue As Integer + + If $hTextBox.ReadOnly Then Return + iValue = $iValue + SetValue($iValue + $iStep * If(bAdd, 1, -1), bFocus) + If $iValue = iValue Then Raise Limit + +End + + +Public Sub View_MouseWheel() + + If Object.CanRaise(Me, "MouseWheel") Then Return + If $hTextBox.ReadOnly Then Return + + CheckValue + ChangeValue(Mouse.Delta > 0, True) + Stop Event + +End + +Public Sub TextBox_MouseWheel() + + View_MouseWheel + +End + +Public Sub TextBox_Activate() + + CheckValue + +End + + +Private Sub SetValue(iValue As Integer, Optional bFocus As Boolean) + + Dim sValue As String + Dim nZero As Integer + + If iValue < $iMin Then + iValue = If($bWrap, $iMax, $iMin) + Else If iValue > $iMax Then + iValue = If($bWrap, $iMin, $iMax) + Endif + + sValue = CStr(iValue) + If $bShowZero Then + nZero = Max(Len(CStr($iMin)), Len(CStr($iMax))) + If nZero > Len(sValue) Then sValue = String$(nZero - Len(sValue), "0") & sValue + Endif + + If $hTextBox.Text <> sValue Then $hTextBox.Text = sValue + If $iValue <> iValue Then + $iValue = iValue + Raise Change + Endif + $hView.Refresh + + If bFocus Then + $hTextBox.SetFocus + $hTextBox.SelectAll + Endif + +End + +Private Function MinValue_Read() As Integer + + Return $iMin + +End + +Private Sub MinValue_Write(Value As Integer) + + If $iMin = Value Then Return + $iMin = Value + $iMax = Max($iMax, Value) + SetValue($iValue) + +End + +Private Function MaxValue_Read() As Integer + + Return $iMax + +End + +Private Sub MaxValue_Write(Value As Integer) + + If $iMax = Value Then Return + $iMax = Value + $iMin = Min($iMin, Value) + SetValue($iValue) + +End + +Public Sub View_Enter() + + $hView.Tracking = True + $hView.Refresh + +End + +Public Sub View_Leave() + + $iInsideArrow = ARROW_NONE + $hView.Tracking = False + $hView.Refresh + +End + +Public Sub TextBox_GotFocus() + + 'Debug + $hView.Refresh + +End + +Public Sub TextBox_LostFocus() + + 'Debug + If Not $hTextBox.ReadOnly Then + CheckValue + SetValue($iValue) + Endif + + $hView.Refresh + +End + +Public Sub View_MouseMove() + + Dim iInsideArrow As Integer + + If GetArrowRect(ARROW_TOP).Contains(Mouse.X, Mouse.Y) Then + iInsideArrow = ARROW_TOP + Else If GetArrowRect(ARROW_BOTTOM).Contains(Mouse.X, Mouse.Y) Then + iInsideArrow = ARROW_BOTTOM + Else + iInsideArrow = ARROW_NONE + Endif + + If iInsideArrow <> $iInsideArrow Then + 'Debug + $iInsideArrow = iInsideArrow + $hView.Refresh + Endif + +End + +Public Sub View_MouseDown() + + Dim bCancel As Boolean + + bCancel = Raise MouseDown + If bCancel Then + Stop Event + Return + Endif + + If $hTextBox.ReadOnly Then Return + + If $iInsideArrow = ARROW_TOP Then + $bTimerAdd = True + Else If $iInsideArrow = ARROW_BOTTOM Then + $bTimerAdd = False + Else + Return + Endif + + CheckValue + ChangeValue($bTimerAdd, True) + + $hTimer = New Timer(500) As "TimerMouse" + $hTimer.Start + +End + +Public Sub View_MouseUp() + + Dim bCancel As Boolean + + bCancel = Raise MouseUp + If bCancel Then + Stop Event + Return + Endif + + If Not $hTimer Then Return + $hTimer.Stop + $hTimer = Null + +End + + +Public Sub TimerMouse_Timer() + + ChangeValue($bTimerAdd, True) + + If $hTimer.Delay > 50 Then + $hTimer.Delay = 50 + $hTimer.Restart + Endif + +End + + +Private Function Value_Read() As Integer + + Return $iValue + +End + +Private Sub Value_Write(Value As Integer) + + SetValue(Value) + +End + +Private Function Border_Read() As Boolean + + Return $bBorder + +End + +Private Sub Border_Write(Value As Boolean) + + If $bBorder = Value Then Return + $bBorder = Value + View_Arrange + $hView.Refresh + +End + +Public Sub TextBox_KeyPress() + + If Key.Code = Key.BackSpace Or If Key.Code = Key.Delete Then Return + + If $hTextBox.ReadOnly Then Return + + If Key.Code = Key.Up Then + If Not CheckValue() Then + ChangeValue(True, True) + Else + $hTextBox.SelectAll + Endif + Stop Event + Else If Key.Code = Key.Down Then + If Not CheckValue() Then + ChangeValue(False, True) + Else + $hTextBox.SelectAll + Endif + Stop Event + Else If Key.Code = Key.End And If Key.Control Then + SetValue($iMin, True) + Stop Event + Else If Key.Code = Key.Home And If Key.Control Then + SetValue($iMax, True) + Stop Event + Else If Key.Text Then + If IsDigit(Key.Text) Then + Else If Key.Text = "-" Then + If $iMin >= 0 Then Stop Event + Else If Len(Key.Text) >= 2 Or If Asc(Key.Text) >= 32 Then + Stop Event + Endif + Endif + +End + +Private Sub CheckValue() As Boolean + + Dim iValue As Integer + + Try iValue = CInt($hTextBox.Text) + If Error Then Return + If iValue < $iMin Then + SetValue($iMin) + Return True + Else If iValue > $iMax Then + SetValue($iMax) + Return True + Else + SetValue(iValue) + Endif + +End + +Public Sub TextBox_Change() + + If Not $hTextBox.HasFocus Then CheckValue + +End + +Private Function Wrap_Read() As Boolean + + Return $bWrap + +End + +Private Sub Wrap_Write(Value As Boolean) + + $bWrap = Value + +End + +Private Function Step_Read() As Integer + + Return $iStep + +End + +Private Sub Step_Write(Value As Integer) + + If Value < 1 Then Error.Raise("Bad argument") + $iStep = Value + +End + +Private Function Text_Read() As String + + Return CStr($iValue) + +End + +Private Sub Text_Write(Value As String) + + $hTextBox.Text = Value + +End + +Public Sub SelectAll() + + $hTextBox.SelectAll + +End + + +Private Function Background_Read() As Integer + + Return Super.Background + +End + +Private Sub Background_Write(Value As Integer) + + Super.Background = Value + If Value = Color.Default Then + $hTextBox.Background = Color.TextBackground + Else + $hTextBox.Background = Color.Default + Endif + +End + +Private Function Alignment_Read() As Integer + + Return $hTextBox.Alignment + +End + +Private Sub Alignment_Write(Value As Integer) + + $hTextBox.Alignment = Value + +End + +Private Function ShowZero_Read() As Boolean + + Return $bShowZero + +End + +Private Sub ShowZero_Write(Value As Boolean) + + $bShowZero = Value + SetValue($iValue) + +End + +Private Function ReadOnly_Read() As Boolean + + Return $hTextBox.ReadOnly + +End + +Private Sub ReadOnly_Write(Value As Boolean) + + $hTextBox.ReadOnly = Value + $hView.Refresh + +End diff --git a/comp/src/gb.gui.base/.src/Split/HSplit.class b/comp/src/gb.gui.base/.src/Split/HSplit.class new file mode 100644 index 00000000..b22ffd3f --- /dev/null +++ b/comp/src/gb.gui.base/.src/Split/HSplit.class @@ -0,0 +1,15 @@ +' Gambas class file + +Export +Inherits _Split + +Public Const _Properties As String = "*,-Margin,-Padding,-Arrangement,-AutoResize,-Indent,Border=True" +Public Const _DefaultArrangement As String = "H" +Public Const _DefaultEvent As String = "Resize" +Public Const _Similar As String = "Panel" + +Public Sub _new() + + + +End diff --git a/comp/src/gb.gui.base/.src/Split/VSplit.class b/comp/src/gb.gui.base/.src/Split/VSplit.class new file mode 100644 index 00000000..17dc2716 --- /dev/null +++ b/comp/src/gb.gui.base/.src/Split/VSplit.class @@ -0,0 +1,15 @@ +' Gambas class file + +Export +Inherits _Split + +Public Const _Properties As String = "*,-Margin,-Padding,-Arrangement,-AutoResize,-Indent,Border=True" +Public Const _DefaultArrangement As String = "V" +Public Const _DefaultEvent As String = "Resize" +Public Const _Similar As String = "Panel" + +Public Sub _new() + + + +End diff --git a/comp/src/gb.gui.base/.src/Split/_Split.class b/comp/src/gb.gui.base/.src/Split/_Split.class new file mode 100644 index 00000000..ae5a9e48 --- /dev/null +++ b/comp/src/gb.gui.base/.src/Split/_Split.class @@ -0,0 +1,448 @@ +' Gambas class file + +Export +Inherits UserContainer + +Property Layout, Settings As Integer[] +Property Border As Boolean +Property MinSize As Integer + +Event Resize + +Private $hObs As Observer +Private $hObsPanel As Observer +Private $cWeight As New Collection +Private $bLayouting As Boolean +Private $hPanel As Panel +Private $aResize As New DrawingArea[] + +Private $XMin As Integer +Private $XMax As Integer +Private $iNoArrange As Integer +Private $bVertical As Boolean +Private $bBorder As Boolean = True +Private $iMinSize As Integer = Desktop.Scale * 2 + +Public Sub _new() + + $bVertical = Me Is VSplit + $hPanel = New Panel(Me) + '$hPanel.Border = Border.Plain + Me._Container = $hPanel + $hObs = New Observer(Me) As "Container" + $hObsPanel = New Observer($hPanel) As "Container" + +End + +Private Sub GetChildren(Optional bHidden As Boolean) As Control[] + + Dim aControl As New Control[] + Dim hChild As Control + + For Each hChild In $hPanel.Children + If Not bHidden And If Not hChild.Visible Then Continue + aControl.Add(hChild) + Next + + Return aControl + +End + + +' Private Sub GetTotalWeight() As Integer +' +' Dim hChild As Control +' Dim iWeight As Integer +' +' For Each hChild In GetChildren() +' Try iWeight += $cWeight[Object.Address(hChild)] +' Next +' +' Return iWeight +' +' End + +Public Sub Container_Arrange() + + Dim cNewWeight As Collection + Dim hChild As Control + Dim fWeight As Float + Dim fNewWeight As Float + Dim fTotalWeight As Float + Dim I As Integer + Dim aAllChildren As Control[] + Dim aChildren As Control[] + + If $iNoArrange Or If $bLayouting Then Return + + Inc $iNoArrange + + 'Debug Me.W;; Me.H + $hPanel.Move(0, 0, Me.W, Me.H) + + aChildren = GetChildren() + aAllChildren = GetChildren(True) + + If aChildren.Count = 0 Then + + For I = 0 To $aResize.Max + $aResize[I].Delete + Next + $aResize.Clear + $cWeight.Clear + + Else + + 'If $cWeight.Count <> aChildren.Count Then + + fNewWeight = 1 / aChildren.Count + + cNewWeight = New Collection + + For Each hChild In aAllChildren + Try fWeight = $cWeight[Object.Address(hChild)] + If Error Then fWeight = fNewWeight + cNewWeight[Object.Address(hChild)] = fWeight + If hChild.Visible Then fTotalWeight += fWeight + Next + + ' If fTotalWeight <> 1 Then + ' For Each hChild In aChildren + ' cNewWeight[Object.Address(hChild)] /= fTotalWeight + ' Next + ' Endif + ' + + $cWeight = cNewWeight + + 'Endif + + If $aResize.Count > (aChildren.Count - 1) Then + For I = aChildren.Count - 1 To $aResize.Max + $aResize[I].Delete + Next + $aResize.Resize(aChildren.Count - 1) + Else If $aResize.Count < (aChildren.Count - 1) Then + $aResize.Resize(aChildren.Count - 1) + Me._Container = Null + For I = aChildren.Count - 2 DownTo 0 + If $aResize[I] Then Break + $aResize[I] = New DrawingArea(Me) As "Resize" + With $aResize[I] + .NoBackground = True + .Raise + '.Background = Color.Yellow + .Mouse = If($bVertical, Mouse.SplitV, Mouse.SplitH) + .Tag = I + End With + Next + Me._Container = $hPanel + Endif + + Endif + + DoLayout + + Dec $iNoArrange + +End + +Private Sub GetSepWidth() As Integer + + Return If(Me.Spacing, Desktop.Scale, 1) + +End + +Private Function Layout_Read() As Integer[] + + Dim aLayout As New Integer[] + Dim WTotal As Integer = If($bVertical, Me.H, Me.W) + Dim hChild As Control + Dim W As Integer + Dim SW As Integer = GetSepWidth() + + 'For Each fWeight In $cWeight + ' fTotal += fWeight + 'Next + + For Each hChild In $hPanel.Children + If Not hChild.Visible Then + aLayout.Add(0) + Else + 'Try fWeight = $cWeight[Object.Address(hChild)] + 'If Error Then + If $bVertical Then + W = hChild.H + If (hChild.Y + W) < WTotal Then W += SW + Else + W = hChild.W + If (hChild.X + W) < WTotal Then W += SW + Endif + aLayout.Add(W) + 'Else + ' aLayout.Add(Max(1, CInt(WTotal * fWeight / fTotal + 0.5))) + 'Endif + Endif + Next + + 'Debug String[](aLayout).Join(",");; "("; WTotal; ")" + + Return aLayout + +End + +Private Sub DoLayout() + + Dim I, W, WMax, WTotal As Integer + Dim hChild As Control + Dim X As Integer + Dim aChildren As Control[] + Dim fTotalWeight As Float + Dim SW As Integer + + If $bLayouting Then Return + + SW = GetSepWidth() + + $bLayouting = True + + For Each hChild In GetChildren() + Try fTotalWeight += $cWeight[Object.Address(hChild)] + Next + + aChildren = GetChildren(True) + + WMax = If($bVertical, Me.H, Me.W) + + For I = 0 To aChildren.Max + + hChild = aChildren[I] + If Not hChild.Visible Then Continue + + W = Max($iMinSize, CInt($cWeight[Object.Address(hChild)] * WMax / fTotalWeight + 0.5)) + WTotal += W + + If $bVertical Then + aChildren[I].Height = W - SW + Else + aChildren[I].Width = W - SW + Endif + + Next + + aChildren = GetChildren() + + If aChildren.Count Then + + If $bVertical Then + + For Each hChild In aChildren + hChild.Move(0, X, Me.W, hChild.H) + X += hChild.H + SW + Next + + hChild.Height = WMax - hChild.Y + + For I = 0 To $aResize.Max + hChild = aChildren[I + 1] + If Not hChild.Visible Then Continue + $aResize[I].Move(0, hChild.Y - Desktop.Scale \ 2 - SW \ 2, Me.W, Desktop.Scale) + Next + + Else + + If System.RightToLeft Then + + X = WMax + + For Each hChild In aChildren + X -= hChild.W + hChild.Move(X, 0, hChild.W, Me.H) + X -= SW + Next + + hChild.Width += hChild.X + hChild.X = 0 + + For I = 0 To $aResize.Max + hChild = aChildren[I] + $aResize[I].Move(hChild.X - Desktop.Scale \ 2 - SW \ 2, 0, Desktop.Scale, Me.H) + Next + + Else + + For Each hChild In aChildren + hChild.Move(X, 0, hChild.W, Me.H) + X += hChild.W + SW + Next + + hChild.Width = WMax - hChild.X + + For I = 0 To $aResize.Max + hChild = aChildren[I + 1] + $aResize[I].Move(hChild.X - Desktop.Scale \ 2 - SW \ 2, 0, Desktop.Scale, Me.H) + Next + + Endif + + Endif + + Endif + + $bLayouting = False + +End + +Private Sub Layout_Write(Value As Integer[]) + + Dim I As Integer + Dim iTotal As Integer + Dim hChild As Control + + 'Debug String[](Value).Join(",") + + ' Value = Value.Copy() + ' iTotal = NormalizeLayout(Value) + + For I = 0 To Value.Max + If Value[I] > 0 Then iTotal += Value[I] + Next + + $cWeight = New Collection + For I = 0 To $hPanel.Children.Count - 1 + hChild = $hPanel.Children[I] + If I <= Value.Max And If Value[I] > 0 Then + $cWeight[Object.Address(hChild)] = Value[I] / iTotal + hChild.Show + Else + hChild.Hide + Endif + Next + + DoLayout + +End + +Public Sub Resize_MouseDown() + + Dim aChildren As Control[] = GetChildren() + Dim I As Integer = Last.Tag + Dim SW As Integer = GetSepWidth() + + If $bVertical Then + $XMin = aChildren[I].ScreenY + $XMax = aChildren[I + 1].ScreenY + aChildren[I + 1].H + SW + Else + If System.RightToLeft Then + $XMin = aChildren[I + 1].ScreenX + $XMax = aChildren[I].ScreenX + aChildren[I].W + SW + Else + $XMin = aChildren[I].ScreenX + $XMax = aChildren[I + 1].ScreenX + aChildren[I + 1].W + SW + Endif + Endif + +End + +Public Sub Resize_MouseMove() + + Dim aChildren As Control[] = GetChildren() + Dim hResize As DrawingArea = Last + Dim I As Integer = hResize.Tag + Dim I2 As Integer + Dim X As Integer + Dim SW As Integer = GetSepWidth() + + If Not Mouse.Left Then Return + + Inc $iNoArrange + + If $bVertical Then + + X = Min(Max(Mouse.ScreenY, $XMin + $iMinSize), $XMax - $iMinSize) + + aChildren[I].H = X - $XMin - SW + aChildren[I + 1].Move(0, X - Me.ScreenY, Me.W, $XMax - X - SW) + + hResize.Move(0, aChildren[I + 1].Y - Desktop.Scale \ 2 - SW \ 2, Me.W, Desktop.Scale) + + ' For Each hChild In aChildren + ' W = hChild.H + ' If hChild <> aChildren[aChildren.Max] Then Inc W + ' $cWeight[Object.Address(hChild)] = W + ' Next + + Else + + X = Min(Max(Mouse.ScreenX, $XMin + $iMinSize), $XMax - $iMinSize) + + If System.RightToLeft Then + I2 = I + I = I2 + 1 + Else + I2 = I + 1 + Endif + + aChildren[I].W = X - $XMin - SW + aChildren[I2].Move(X - Me.ScreenX, 0, $XMax - X - SW, Me.H) + + hResize.Move(aChildren[I2].X - Desktop.Scale \ 2 - SW \ 2, 0, Desktop.Scale, Me.H) + + Endif + + Dec $iNoArrange + + Raise Resize + +End + +Public Sub Resize_MouseUp() + + $cWeight.Clear + Layout_Write(Layout_Read()) + +End + +Public Sub Resize_Draw() + + Dim X As Integer + + If Not $bBorder Then Return + + X = Desktop.Scale \ 2 - 1 + + Draw.Foreground = Color.LightForeground + If $bVertical Then + Draw.Line(0, X, Me.W - 1, X) + Else + Draw.Line(X, 0, X, Me.H - 1) + Endif + +End + +Private Function Border_Read() As Boolean + + Return $bBorder + +End + +Private Sub Border_Write(Value As Boolean) + + If $bBorder = Value Then Return + $bBorder = Value + DoLayout + +End + +Private Function MinSize_Read() As Integer + + Return $iMinSize + +End + +Private Sub MinSize_Write(Value As Integer) + + $iMinSize = Value + Layout_Write(Layout_Read()) + +End diff --git a/comp/src/gb.gui.base/.src/Spring.class b/comp/src/gb.gui.base/.src/Spring.class new file mode 100644 index 00000000..b17b21cd --- /dev/null +++ b/comp/src/gb.gui.base/.src/Spring.class @@ -0,0 +1,15 @@ +' Gambas class file + +Export + +Inherits Panel + +Public Const _Properties As String = "*,-Margin,-Padding,-Spacing,-Expand,-Invert,-Arrangement,-AutoResize,-Indent,-Border" +Public Const _IsContainer As Boolean = False +Public Const _DefaultSize As String = "4,4" + +Public Sub _new() + + Me.Expand = True + +End diff --git a/comp/src/gb.gui.base/.src/Test/FBorder.class b/comp/src/gb.gui.base/.src/Test/FBorder.class new file mode 100644 index 00000000..bb6e058d --- /dev/null +++ b/comp/src/gb.gui.base/.src/Test/FBorder.class @@ -0,0 +1,28 @@ +' Gambas class file + +Private $hBorder As Border + + +Public Sub DrawingArea1_Draw() + + $hBorder.Paint(0, 0, Paint.W, Paint.H) + +End + +Public Sub Form_Open() + + $hBorder = New Border("margin:8;width:16;left-width:0;right-width:8;top-left-radius:40;slash-style:solid;backslash-style:solid;backslash-color:green;backslash-width:4;slash-color:red;slash-width:16") + '$hBorder.SlashStyle = Border.Solid + '$hBorder.SlashWidth = 32 + '$hBorder.SlashColor = Color.SetAlpha(Color.Red, 128) + + Slider1.Value = 160 + +End + +Public Sub Slider1_Change() + + $hBorder.Radius = Slider1.Value + DrawingArea1.Refresh + +End diff --git a/comp/src/gb.gui.base/.src/Test/FBorder.form b/comp/src/gb.gui.base/.src/Test/FBorder.form new file mode 100644 index 00000000..27686416 --- /dev/null +++ b/comp/src/gb.gui.base/.src/Test/FBorder.form @@ -0,0 +1,16 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,64,69) + Arrangement = Arrange.Vertical + Margin = True + { Slider1 Slider + MoveScaled(1,2,60,4) + MaxValue = 255 + } + { DrawingArea1 DrawingArea + MoveScaled(3,14,55,41) + Background = &HFFFFFF& + Expand = True + } +} diff --git a/comp/src/gb.gui.base/.src/Test/FGridView.class b/comp/src/gb.gui.base/.src/Test/FGridView.class new file mode 100644 index 00000000..dbd83a70 --- /dev/null +++ b/comp/src/gb.gui.base/.src/Test/FGridView.class @@ -0,0 +1,206 @@ +' Gambas class file + + +Public Sub Form_Open() + + Dim I As Integer + 'Dim hCtrl As GridView + 'Dim J As Integer + Dim hBorder As Border + Dim hBorderLeft As Border + Dim hBorderRight As Border + + Print gvwInfo.W;; gvwInfo.H;; "/";; Me.W;; Me.H + + hBorderLeft = New Border("margin:4;width:4;right-style:none;right-margin:0;right-width:0;top-left-radius:16;bottom-left-radius:16;color:#80000000") + hBorder = New Border("margin:4;width:4;left-margin:0;right-margin:0;left-style:none;right-style:none;left-width:0;right-width:0;") + hBorderRight = New Border("margin:4;width:4;left-style:none;left-margin:0;left-width:0;top-right-radius:24;right-color:green") + + 'gvwinfo.Clear + gvwinfo.Columns.Count = 3 + gvwinfo.Rows.Count = 10 + + ' For I = 0 To gvwInfo.Rows.Max + ' gvwInfo[I, 0].Border = hBorderLeft + ' gvwInfo[I, gvwInfo.Columns.Max].Border = hBorderRight + ' For J = 1 To gvwInfo.Columns.Max - 1 + ' gvwInfo[I, J].Border = hBorder + ' Next + ' Next + 'gvwInfo[8, 0].Border = hBorderLeft + + 'gvwInfo.Rows.Border = New Border("margin:4;radius:8;padding:6;width:4.5;style:double") + + 'gvwinfo.Rows.Resizable = True + gvwinfo[0, 0].Text = "Bleu" + gvwinfo[0, 0].Alignment = Align.TopLeft + gvwinfo[0, 1].Text = "Blanc" + gvwinfo[1, 0].Text = "Version" + gvwinfo[1, 1].Text = "0.0.7" + gvwinfo[2, 0].Text = "Type" + gvwinfo[2, 1].Text = "Normal" + gvwinfo[3, 0].Text = "Compiler" + gvwInfo[3, 0].Picture = Picture.Load("picturebox.png") + gvwInfo[3, 0].Border = New Border("style:none;bottom-padding:16") + gvwinfo[3, 1].Text = "Gambas 3.3.90" + gvwinfo[4, 0].Text = "(IsOld)" + gvwinfo[4, 1].Text = False + gvwinfo[5, 0].Text = "Full Name" + gvwinfo[5, 1].Text = "compsrch.gambas" + gvwinfo[6, 0].Text = "Description" + gvwinfo[6, 0].Alignment = Align.TopLeft + gvwinfo[6, 1].WordWrap = True + gvwinfo[6, 1].Text = "This program is a utility to find gambas source projects that use a named component or library. It is intended for internal use only to help resolve which client programs need to be re-issued if the component/library is changed." + gvwinfo[6, 1].Alignment = Align.TopLeft + gvwinfo[7, 0].Text = "State" + gvwinfo[7, 1].Text = "Stable" + gvwinfo[8, 0].Text = "Requires" + gvwinfo[8, 1].Text = "" + gvwinfo[9, 0].Text = "Needs" + gvwinfo[9, 1].Text = "" + + For I = 0 To 9 + gvwInfo[I, 2].Text = CStr(Int(Rnd(0, 1000))) + Next + gvwinfo[0, 2].Text = "Rouge" + + For I = 0 To 2 + gvwInfo.Columns[I].Text = ["Bleu", "Blanc", "Rouge"][I] + Next + + gvwInfo[1, 1].Background = Color.Yellow + + gvwInfo.Rows[6].Border = New Border + With gvwInfo.Rows[6].Border + .Style = Border.None + End With + + For I = 2 To 6 + gvwInfo.Rows[I].TextAlignment = Align.Right + Next + + ' gvwInfo[6, 1].Background = Color.Yellow + ' gvwInfo[6, 1].Border = New Border '.Copy() 'New Border 'hBorderLeft.Copy() + ' With gvwInfo[6, 1].Border + ' .SlashStyle = Border.Dotted + ' .SlashColor = Color.Red + ' .SlashWidth = 4 + ' .BackSlashStyle = Border.Double + Border.Dashed + ' .BackSlashColor = Color.Red + ' .BackSlashWidth = 4 + ' .Color = Color.Green + ' .Margin = 8 + ' .Padding = 8 + ' End With + + + 'gvwInfo.Columns[1].Alignment = Align.Right + + ScrollArea(gvwInfo.Proxy).Shadow = True + + gvwInfo[0, 0].ColumnSpan = gvwInfo.Columns.Count + + gvwinfo.Columns.Width = -1 + gvwInfo.Columns[0].W = 110 + gvwinfo.Rows[6].Height = -1 + + txtPadding.Value = gvwInfo.Padding + + Me.Height += 2 + +End + +Public Sub gvwInfo_ColumnClick(Column As Integer) + + Debug Column + +End + +Public Sub gvwInfo_MouseDrag() + + Drag(gvwInfo, "25", "text/plain") + +End + +Public Sub Label1_Drag() + + Debug Drag.Formats.Join(",") + +End + +Public Sub TextBox1_KeyPress() + + Debug Key.Code + +End + +Public Sub txtPadding_Change() + + 'Dim C As Integer + + gvwinfo.Padding = txtPadding.Value + ' For C = 0 To gvwInfo.Columns.Max + ' gvwInfo.Columns[C].W = -1 + ' Next + +End + +Public Sub gvwInfo_Draw(X As Integer, Y As Integer, Width As Integer, Height As Integer, Row As Integer, Column As Integer) + + If Row = 0 And If Column = 0 Then + Paint.DrawText("Gambas", X, Y, Width, Height, Align.Center) + Endif + +End + +Public Sub Button1_Click() + + Me.Font = Null + +End + +Public Sub Button2_Click() + + gvwInfo.Border = Not gvwInfo.Border + +End + +Public Sub Label1_MouseDown() + + + +End + +Public Sub Label1_MouseDrag() + + Drag(Label1, "text") + +End + +Public Sub gvwInfo_Drop() + + Debug Drag.Paste() + +End + +Public Sub gvwInfo_Click() + + Debug gvwInfo.Row;; gvwInfo.Column + +End + +Public Sub Button3_Click() + + Dim aSel As String[] + + aSel = gvwInfo.Rows.Selection + Debug aSel.Join() + + +End + +Public Sub gvwInfo_MouseDown() + + Debug + +End diff --git a/comp/src/gb.gui.base/.src/Test/FGridView.form b/comp/src/gb.gui.base/.src/Test/FGridView.form new file mode 100644 index 00000000..e89fb1cd --- /dev/null +++ b/comp/src/gb.gui.base/.src/Test/FGridView.form @@ -0,0 +1,57 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,106,68) + Arrangement = Arrange.Vertical + Margin = True + { HBox1 HBox + MoveScaled(6,1,87,4) + Spacing = True + { txtPadding SpinBox + MoveScaled(3,0,8,4) + } + { Button1 Button + MoveScaled(18,0,14,4) + } + { Button2 Button + MoveScaled(34,0,16,4) + Text = ("Border") + } + { Label1 Label + MoveScaled(53,0,13,4) + AutoResize = True + Text = ("Drag me") + Border = Border.Plain + } + { Button3 Button + MoveScaled(68,0,16,4) + Text = ("Selection") + } + } + { Separator1 Separator + MoveScaled(23,7,14,0) + } + { gvwInfo GridView + MoveScaled(8,11,51,31) + Foreground = Color.Orange + Drop = True + Expand = True + Border = False + Mode = Select.Multiple + ShowCursor = True + Header = GridView.Both + Sorted = True + } + { TextBox1 TextBox + MoveScaled(11,47,24,4) + Visible = False + Text = ("TextBox1") + Border = False + } + { TextArea1 TextArea + MoveScaled(12,54,43,10) + Visible = False + Text = ("TextArea1") + Border = False + } +} diff --git a/comp/src/gb.gui.base/.src/Test/FIconView.class b/comp/src/gb.gui.base/.src/Test/FIconView.class new file mode 100644 index 00000000..d89c460c --- /dev/null +++ b/comp/src/gb.gui.base/.src/Test/FIconView.class @@ -0,0 +1,56 @@ +' Gambas class file + + +Public Sub Form_Open() + + Dim sPath As String + Dim sDir As String = "~" '/gambas/3.0/trunk" + + 'Component.Load("gb.form") + Component.Load("gb.form.stock") + + For Each sPath In Dir(sDir).Sort(gb.Language + gb.IgnoreCase) + If IsDir(sDir &/ sPath) Then + IconView1.Add(sPath, sPath, Picture["icon:/64/directory"]).RichText = "" & sPath & "" + Else + IconView1.Add(sPath, sPath, Picture["icon:/64/file"]) + Endif + Next + + 'IconView1.Picture = Picture["img/colormap.png"] + + IconView1.SetFocus + +End + +Public Sub Button1_Click() + + ' If IconView1.Font.Size = 6 Then + ' IconView1.Font.Size = 16 + ' Else + ' Dec IconView1.Font.Size + ' Endif + IconView1.Enabled = Not IconView1.Enabled + +End + +Public Sub IconView1_Activate() + + Debug IconView1.Item.Key + +End + +Public Sub IconView1_Click() + + Debug IconView1.Item.Key + +End + +Public Sub IconView1_Draw(X As Integer, Y As Integer, Width As Integer, Height As Integer, (Key) As String) + + If IconView1[Key].Hovered Then + Paint.Font.Grade = -2 + Paint.DrawText(Format(Stat("~" &/ Key).Size \ 1024, ",0") & "K", X, Y, Width, Height, Align.TopRight) + Endif + +End diff --git a/comp/src/gb.gui.base/.src/Test/FIconView.form b/comp/src/gb.gui.base/.src/Test/FIconView.form new file mode 100644 index 00000000..88654057 --- /dev/null +++ b/comp/src/gb.gui.base/.src/Test/FIconView.form @@ -0,0 +1,29 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,85,80) + Icon = Picture["icon:/medium/color"] + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + { Panel1 HBox + MoveScaled(3,1,77,4) + Spacing = True + { Button1 Button + MoveScaled(0,0,16,4) + #Translate = False + Text = "Enabled" + } + { TextBox1 TextBox + MoveScaled(23,0,24,4) + } + } + { IconView1 IconView + MoveScaled(3,13,38,31) + Expand = True + Mode = Select.Multiple + Sorted = True + Editable = True + GridSize = 24 + } +} diff --git a/comp/src/gb.gui.base/.src/Test/FListBox.class b/comp/src/gb.gui.base/.src/Test/FListBox.class new file mode 100644 index 00000000..6f2e0261 --- /dev/null +++ b/comp/src/gb.gui.base/.src/Test/FListBox.class @@ -0,0 +1,40 @@ +' Gambas class file + + +Public Sub Form_Open() + + 'ListBox1.List = Dir("~") + ListBox1.Index = 0 + +End + +Public Sub Button1_Click() + + 'ListBox1.Remove(3, 4) + ListBox1.Add("item " & CStr(ListBox1.Count + 1)) + +End + +Public Sub Button2_Click() + + ListBox1.Border = Not ListBox1.Border + +End + +Public Sub Button3_Click() + + Try ListBox1.Index = 3 + +End + +Public Sub ListBox1_Click() + + Debug ListBox1.Index + +End + +Public Sub Clear_Click() + + ListBox1.Clear + +End diff --git a/comp/src/gb.gui.base/.src/Test/FListBox.form b/comp/src/gb.gui.base/.src/Test/FListBox.form new file mode 100644 index 00000000..7adeb4ce --- /dev/null +++ b/comp/src/gb.gui.base/.src/Test/FListBox.form @@ -0,0 +1,26 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,57,67) + { ListBox1 ListBox + MoveScaled(3,2,28,60) + Foreground = Color.DarkGreen + Expand = True + List = [("Élément 1"), ("Élément 2"), ("Élément 3"), ("Élément 4"), ("Élément 5"), ("Élément 6"), ("Élément 7")] + Border = False + } + { Button1 Button + MoveScaled(36,4,16,4) + Text = ("Add") + } + { Button2 Button + MoveScaled(35,10,16,4) + Text = ("Border") + } + { Button3 Button + MoveScaled(36,17,16,4) + } + { Clear Button + MoveScaled(35,24,16,4) + } +} diff --git a/comp/src/gb.gui.base/.src/Test/FMain.class b/comp/src/gb.gui.base/.src/Test/FMain.class new file mode 100644 index 00000000..053aaae0 --- /dev/null +++ b/comp/src/gb.gui.base/.src/Test/FMain.class @@ -0,0 +1,35 @@ +' Gambas class file + +Public Sub _new() + +End + +Public Sub Form_Open() + + ' GridView test + GridView1.Columns.Count = 3 + GridView1.Rows.Count = 1 + GridView1.Columns.Width = GridView1.Width + GridView1.Rows[0].Height = 52 + 'GridView1.Rows[0].Height = GridView1.Height + GridView1[0, 0].Picture = Picture["pattern/14.png"] + GridView1[0, 1].Picture = Picture["pattern/14.png"] + GridView1[0, 2].Picture = Picture["pattern/14.png"] + '' Good + GridView1[0, 0].Alignment = Align.Center + GridView1[0, 1].Alignment = Align.Center + GridView1[0, 2].Alignment = Align.Center + + GridView1[0, 0].Alignment = Align.Left + GridView1[0, 1].Alignment = Align.Left + GridView1[0, 2].Alignment = Align.Left + '' No Good + ' GridView1[0, 0].Alignment = Align.Right + ' GridView1[0, 1].Alignment = Align.Right + ' GridView1[0, 2].Alignment = Align.Right + + ' GridView1[0, 0].Alignment = Align.TopRight + ' GridView1[0, 1].Alignment = Align.TopRight + ' GridView1[0, 2].Alignment = Align.TopRight + +End diff --git a/comp/src/gb.gui.base/.src/Test/FMain.form b/comp/src/gb.gui.base/.src/Test/FMain.form new file mode 100644 index 00000000..b535bbd3 --- /dev/null +++ b/comp/src/gb.gui.base/.src/Test/FMain.form @@ -0,0 +1,21 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,92,50) + { GridView1 GridView + MoveScaled(2,1,33,18) + } + { Slider1 Slider + MoveScaled(7,23,32,25) + Background = &HFFFF00& + } + { Slider2 Slider + MoveScaled(43,23,35,25) + Background = &HFFFF00& + Mark = True + } + { ProgressBar1 ProgressBar + MoveScaled(56,7,28,4) + Pulse = True + } +} diff --git a/comp/src/gb.gui.base/.src/Test/FPaint.class b/comp/src/gb.gui.base/.src/Test/FPaint.class new file mode 100644 index 00000000..070e4bdb --- /dev/null +++ b/comp/src/gb.gui.base/.src/Test/FPaint.class @@ -0,0 +1,29 @@ +' Gambas class file + + +Public Sub DrawingArea1_Draw() + + Dim sText As String + + ' Image.Debug = True + ' + ' sText = "Bonjour tout le monde ! Gambas rules !" + ' + ' Paint.Font = Font["Ubuntu,20"] + ' + ' Paint.Background = Color.Gray + ' Paint.DrawRichTextShadow(sText, 16, 16, Paint.W - 32, Paint.H - 32, Align.TopLeft, 2) + ' Paint.Background = Color.Black + ' Paint.DrawRichText(sText, 16, 16, Paint.W - 32, Paint.H - 32, Align.TopLeft) + ' + ' Paint.Background = Color.Black + ' Paint.DrawRichTextShadow(sText, 17, 17, Paint.W - 32, Paint.H - 32, Align.Center, 2) + ' Paint.Background = Color.White + ' Paint.DrawRichText(sText, 16, 16, Paint.W - 32, Paint.H - 32, Align.Center) + + sText = "Anti-aliased drawing with the Paint class.\n\nThis example shows the different methods of the Paint class." + Paint.Font = Font["OxygenSans,9"] + sText = Paint.TrimText(sText, 187, 43) + Paint.DrawText(sText, 0, 0, Paint.W, Paint.H) + +End diff --git a/comp/src/gb.gui.base/.src/Test/FPaint.form b/comp/src/gb.gui.base/.src/Test/FPaint.form new file mode 100644 index 00000000..3f9b4925 --- /dev/null +++ b/comp/src/gb.gui.base/.src/Test/FPaint.form @@ -0,0 +1,10 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,51,40) + Arrangement = Arrange.Fill + { DrawingArea1 DrawingArea + MoveScaled(5,7,39,24) + Background = Color.TextBackground + } +} diff --git a/comp/src/gb.gui.base/.src/Test/FProgressBar.class b/comp/src/gb.gui.base/.src/Test/FProgressBar.class new file mode 100644 index 00000000..4fec2a8a --- /dev/null +++ b/comp/src/gb.gui.base/.src/Test/FProgressBar.class @@ -0,0 +1,21 @@ +' Gambas class file + + +Public Sub Form_Open() + + 'ProgressBar1.Value = 0.5 + 'ProgressBar1.Pulse = True + +End + +Public Sub Timer1_Timer() + + ProgressBar1.Value += 0.01 + +End + +Public Sub Button1_Click() + + ProgressBar1.Pulse = Not ProgressBar1.Pulse + +End diff --git a/comp/src/gb.gui.base/.src/Test/FProgressBar.form b/comp/src/gb.gui.base/.src/Test/FProgressBar.form new file mode 100644 index 00000000..548b6777 --- /dev/null +++ b/comp/src/gb.gui.base/.src/Test/FProgressBar.form @@ -0,0 +1,23 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,62,20) + Margin = True + { Timer1 #Timer + #MoveScaled(45,11) + Enabled = True + Delay = 250 + } + { Button1 Button + MoveScaled(3,13,16,4) + Text = ("Button1") + } + { Panel1 Panel + MoveScaled(3,3,57,6) + Arrangement = Arrange.Fill + { ProgressBar1 ProgressBar + MoveScaled(0,0,56,4) + Font = Font["Bold,Italic"] + } + } +} diff --git a/comp/src/gb.gui.base/.src/Test/FScrollArea.class b/comp/src/gb.gui.base/.src/Test/FScrollArea.class new file mode 100644 index 00000000..4de6e9f0 --- /dev/null +++ b/comp/src/gb.gui.base/.src/Test/FScrollArea.class @@ -0,0 +1,45 @@ +' Gambas class file + +Public Sub Form_Open() + + Print System.RightToLeft + Print Style.ScrollbarSize + Print Style.ScrollbarSpacing + + Application.Animations = True + MyScrollView1.Shadow = True + 'ScrollArea1.ResizeContents(1600, 1600) + +End + +Public Sub ScrollArea1_Draw() + + Debug ScrollArea1.ScrollX;; ScrollArea1.ScrollY + Draw.Translate(-ScrollArea1.ScrollX, -ScrollArea1.ScrollY) + Draw.Fillstyle = Fill.Dense6 + Draw.FillColor = Color.Red + 'Draw.Transparent = True + 'Draw.Ellipse(55, 78, 190, 300) + Draw.Ellipse(0, 0, 1600, 1600) + +End + +Public Sub Button1_Click() + + Label1.Delete + +End + +Public Sub MyScrollView1_Draw() + + Paint.Font.Grade = 20 + Paint.DrawText("Gambas !", 20, 200) + +End + + +Public Sub Button_Click() + + Print Last.Parent + +End diff --git a/comp/src/gb.gui.base/.src/Test/FScrollArea.form b/comp/src/gb.gui.base/.src/Test/FScrollArea.form new file mode 100644 index 00000000..1bf4ee3e --- /dev/null +++ b/comp/src/gb.gui.base/.src/Test/FScrollArea.form @@ -0,0 +1,219 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,78,60) + Arrangement = Arrange.Fill + Margin = True + { ScrollArea1 ScrollArea + MoveScaled(4,3,35,30) + Visible = False + Mouse = Mouse.Pointing + AutoResize = True + { Button1 Button + MoveScaled(10,8,11,5) + Text = ("Button") + } + { Label1 Label + MoveScaled(7,28,19,6) + Border = Border.Plain + } + { TextArea1 TextArea + MoveScaled(32,20,39,29) + } + } + { MyScrollView1 ScrollView + MoveScaled(23,16,55,47) + { Button2 Button Button + Name = "Button2" + MoveScaled(2,3,16,4) + } + { Button8 Button Button + Name = "Button8" + MoveScaled(22,3,16,4) + } + { Button26 Button Button + Name = "Button26" + MoveScaled(41,3,16,4) + } + { Button32 Button Button + Name = "Button32" + MoveScaled(61,3,16,4) + } + { Button3 Button Button + Name = "Button3" + MoveScaled(2,8,16,4) + } + { Button9 Button Button + Name = "Button9" + MoveScaled(22,8,16,4) + } + { Button27 Button Button + Name = "Button27" + MoveScaled(41,8,16,4) + } + { Button33 Button Button + Name = "Button33" + MoveScaled(61,8,16,4) + } + { Button4 Button Button + Name = "Button4" + MoveScaled(2,13,16,4) + } + { Button10 Button Button + Name = "Button10" + MoveScaled(22,13,16,4) + } + { Button28 Button Button + Name = "Button28" + MoveScaled(41,13,16,4) + } + { Button34 Button Button + Name = "Button34" + MoveScaled(61,13,16,4) + } + { Button5 Button Button + Name = "Button5" + MoveScaled(6,18,16,4) + } + { Button11 Button Button + Name = "Button11" + MoveScaled(26,18,16,4) + } + { Button29 Button Button + Name = "Button29" + MoveScaled(45,18,16,4) + } + { Button35 Button Button + Name = "Button35" + MoveScaled(65,18,16,4) + } + { Button6 Button Button + Name = "Button6" + MoveScaled(9,24,16,4) + } + { Button12 Button Button + Name = "Button12" + MoveScaled(29,24,16,4) + } + { Button30 Button Button + Name = "Button30" + MoveScaled(48,24,16,4) + } + { Button36 Button Button + Name = "Button36" + MoveScaled(68,24,16,4) + } + { Button7 Button Button + Name = "Button7" + MoveScaled(13,30,16,4) + } + { Button13 Button Button + Name = "Button13" + MoveScaled(33,30,16,4) + } + { Button31 Button Button + Name = "Button31" + MoveScaled(52,30,16,4) + } + { Button37 Button Button + Name = "Button37" + MoveScaled(72,30,16,4) + } + { Button14 Button Button + Name = "Button14" + MoveScaled(3,36,16,4) + } + { Button38 Button Button + Name = "Button38" + MoveScaled(42,36,16,4) + } + { Button20 Button Button + Name = "Button20" + MoveScaled(23,37,16,4) + } + { Button44 Button Button + Name = "Button44" + MoveScaled(62,37,16,4) + } + { Button15 Button Button + Name = "Button15" + MoveScaled(3,41,16,4) + } + { Button39 Button Button + Name = "Button39" + MoveScaled(42,41,16,4) + } + { Button21 Button Button + Name = "Button21" + MoveScaled(23,42,16,4) + } + { Button45 Button Button + Name = "Button45" + MoveScaled(62,42,16,4) + } + { Button16 Button Button + Name = "Button16" + MoveScaled(3,46,16,4) + } + { Button40 Button Button + Name = "Button40" + MoveScaled(42,46,16,4) + } + { Button22 Button Button + Name = "Button22" + MoveScaled(23,47,16,4) + } + { Button46 Button Button + Name = "Button46" + MoveScaled(62,47,16,4) + } + { Button17 Button Button + Name = "Button17" + MoveScaled(7,51,16,4) + } + { Button41 Button Button + Name = "Button41" + MoveScaled(46,51,16,4) + } + { Button23 Button Button + Name = "Button23" + MoveScaled(27,52,16,4) + } + { Button47 Button Button + Name = "Button47" + MoveScaled(66,52,16,4) + } + { Button18 Button Button + Name = "Button18" + MoveScaled(10,57,16,4) + } + { Button42 Button Button + Name = "Button42" + MoveScaled(49,57,16,4) + } + { Button24 Button Button + Name = "Button24" + MoveScaled(30,58,16,4) + } + { Button48 Button Button + Name = "Button48" + MoveScaled(69,58,16,4) + } + { Button19 Button Button + Name = "Button19" + MoveScaled(14,63,16,4) + } + { Button43 Button Button + Name = "Button43" + MoveScaled(53,63,16,4) + } + { Button25 Button Button + Name = "Button25" + MoveScaled(34,64,16,4) + } + { Button49 Button Button + Name = "Button49" + MoveScaled(73,64,16,4) + } + } +} diff --git a/comp/src/gb.gui.base/.src/Test/FTestClipping.class b/comp/src/gb.gui.base/.src/Test/FTestClipping.class new file mode 100644 index 00000000..c9367779 --- /dev/null +++ b/comp/src/gb.gui.base/.src/Test/FTestClipping.class @@ -0,0 +1,36 @@ +' Gambas class file + + +Public Sub DrawingArea1_Draw() + + 'Paint.Debug = True + + ' Paint.ResetClip + ' Paint.Rectangle(55, 50, 431, 400) + ' Paint.Clip + ' Paint.MoveTo(75, 446) + ' Paint.LineTo(165, 446) + ' Paint.LineTo(165, 487) + ' Paint.LineTo(75, 487) + ' Paint.CurveTo(66.163444, 59, 487, 479.836556, 59, 471) + ' Paint.LineTo(59, 462) + ' Paint.CurveTo(59, 66.163444, 453.163444, 446, 75, 446) + ' Paint.LineTo(75, 446) + ' Paint.Clip() + ' Paint.MoveTo(59, 446) + ' Paint.LineTo(112, 499) + ' Paint.LineTo(112, 450) + ' Paint.LineTo(165, 450) + ' Paint.LineTo(165, 446) + ' Paint.LineTo(59, 446) + ' Paint.Clip() + + 'Paint.Debug = False + + ' Paint.Background = Color.Red + ' Paint.Rectangle(0, 0, Paint.W, Paint.H) + ' Paint.Fill + + Paint.DrawRect(10, 10, 140, 80, Color.Red, 39.2) + +End diff --git a/comp/src/gb.gui.base/.src/Test/FTestClipping.form b/comp/src/gb.gui.base/.src/Test/FTestClipping.form new file mode 100644 index 00000000..e05e3d7a --- /dev/null +++ b/comp/src/gb.gui.base/.src/Test/FTestClipping.form @@ -0,0 +1,10 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,99,72) + Arrangement = Arrange.Fill + { DrawingArea1 DrawingArea + MoveScaled(1,1,62,47) + Background = &HFFFFFF& + } +} diff --git a/comp/src/gb.gui.base/.src/Test/FTestCombo.class b/comp/src/gb.gui.base/.src/Test/FTestCombo.class new file mode 100644 index 00000000..cb866e03 --- /dev/null +++ b/comp/src/gb.gui.base/.src/Test/FTestCombo.class @@ -0,0 +1,48 @@ +' Gambas class file + +Public Sub Form_Open() + + Debug Style.Name + + 'hSpinBox.Border = False + 'hSpinBox.Foreground = Color.Red + 'hSpinBox.Background = Color.LightBackground + +End + +Public Sub Panel1_MouseDown() + + + +End + +Public Sub Button1_Click() + + ComboBox2.H -= Desktop.Scale + +End + +Public Sub Button2_Click() + + ComboBox2.W -= Desktop.Scale + Debug ComboBox2.W + +End + +Public Sub SpinBox1_Change() + + Debug SpinBox1.Value + +End + +Public Sub ComboBox2_Click() + + Debug ComboBox2.Index + +End + +Public Sub Button3_Click() + + Try Inc ComboBox2.Index + +End diff --git a/comp/src/gb.gui.base/.src/Test/FTestCombo.form b/comp/src/gb.gui.base/.src/Test/FTestCombo.form new file mode 100644 index 00000000..e5c12d2a --- /dev/null +++ b/comp/src/gb.gui.base/.src/Test/FTestCombo.form @@ -0,0 +1,85 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,97,87) + { Button1 Button + MoveScaled(14,3,16,4) + Background = Color.Orange + Text = ("Button1") + } + { ComboBox2 ComboBox + MoveScaled(13,20,33,12) + Font = Font["Bold,Italic,Underline,+7"] + List = [("Élément 1"), ("Élément 2"), ("Élément 3"), ("Élément 4"), ("Élément 5")] + Text = ("dhdgfhdfghdf") + } + { Panel3 Panel + MoveScaled(14,36,23,25) + Font = Font["Italic"] + Border = Border.Plain + { TextBox4 TextBox + MoveScaled(3,6,23,6) + Text = ("fdsgsdg") + } + { Label1 Label + MoveScaled(2,1,19,2) + Text = ("trytryertyter") + } + { SpinBox2 SpinBox + MoveScaled(13,14,14,4) + } + { TextBox2 TextBox + MoveScaled(15,19,14,4) + } + } + { Button2 Button + MoveScaled(14,10,16,4) + Font = Font["-2"] + Text = ("2") + } + { CheckBox1 CheckBox + MoveScaled(46,41,26,4) + Font = Font["+2"] + Background = Color.Green + Text = ("bxvcbxcbc") + } + { SpinBox1 SpinBox + MoveScaled(44,3,9,4) + Font = Font["Italic"] + Step = 4 + } + { Frame1 Frame + MoveScaled(56,14,32,24) + Font = Font["Italic"] + Text = ("Frame") + { Label2 Label + MoveScaled(7,11,14,3) + Text = ("tyrtyrty") + } + } + { TabStrip1 TabStrip + MoveScaled(45,56,39,23) + Count = 3 + TextFont = Font["Century Schoolbook L"] + Index = 0 + Text = ("1") + { TextBox1 TextBox + MoveScaled(4,4,23,5) + Font = Font["Liberation Mono,Bold"] + Text = ("TextBox1") + } + { TextBox3 TextBox + MoveScaled(9,12,22,5) + Text = ("Normal quoi") + } + Index = 1 + Text = ("2") + Index = 2 + Text = ("3") + Index = 0 + } + { Button3 Button + MoveScaled(34,11,16,4) + Text = ("Index") + } +} diff --git a/comp/src/gb.gui.base/.src/Test/FTestMouseWheel.class b/comp/src/gb.gui.base/.src/Test/FTestMouseWheel.class new file mode 100644 index 00000000..a92fd7e0 --- /dev/null +++ b/comp/src/gb.gui.base/.src/Test/FTestMouseWheel.class @@ -0,0 +1,14 @@ +' Gambas class file + + +Public Sub DrawingArea1_MouseWheel() + + Debug + +End + +Public Sub SpinBox1_MouseDown() + + Debug Mouse.X;; Mouse.Y + +End diff --git a/comp/src/gb.gui.base/.src/Test/FTestMouseWheel.form b/comp/src/gb.gui.base/.src/Test/FTestMouseWheel.form new file mode 100644 index 00000000..c2a6b400 --- /dev/null +++ b/comp/src/gb.gui.base/.src/Test/FTestMouseWheel.form @@ -0,0 +1,25 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,64,64) + { DrawingArea1 DrawingArea + MoveScaled(17,30,43,31) + Border = Border.Plain + { Button1 Button + MoveScaled(10,11,16,4) + } + { Label1 Label + MoveScaled(13,19,20,5) + Border = Border.Plain + } + } + { TextArea1 TextArea + MoveScaled(6,7,17,13) + Text = ("vfdg\ndf\ngd\nfsgsdfgsdf\ngd\nfg\ndsfg\ndsf\ngs\ndfg\nsdf\ng\nsdf") + } + { SpinBox1 SpinBox + MoveScaled(39,11,12,6) + MinValue = 40 + MaxValue = 1000 + } +} diff --git a/comp/src/gb.gui.base/.src/Test/FTreeView.class b/comp/src/gb.gui.base/.src/Test/FTreeView.class new file mode 100644 index 00000000..9016d6ae --- /dev/null +++ b/comp/src/gb.gui.base/.src/Test/FTreeView.class @@ -0,0 +1,160 @@ +' Gambas class file + +Private $sKey As String + + +Public Sub Form_Open() + + Dim sDir As String = "~/Documents" + Dim sFile As String + Dim sPath As String + Dim hDirPict As Picture + Dim hFilePict As Picture + Dim sParent As String + Dim bDark As Boolean + Dim sFirst As String + + Debug Style.Name + + Component.Load("gb.form") + + hDirPict = Picture["icon:/small/directory"] + hFilePict = Picture["icon:/small/file"] + + tvwTest.Columns.Count = 3 + tvwTest.Columns[0].Text = "Alpha" + tvwTest.Columns[1].Text = "Beta" + tvwTest.Columns[2].Text = "Gamma" + + For Each sFile In RDir(sDir) + sPath = sDir &/ sFile + 'Print File.Name(sPath); " -> "; File.Dir(sPath) + sParent = File.Dir(sPath) + If sParent = sDir Then sParent = "" + With tvwTest.Add(sPath, File.Name(sPath), If(IsDir(sPath), hDirPict, hFilePict), sParent) + .[1] = Stat(sPath).Size + bDark = Not bDark + If bDark Then .Background = Color.RGB(0, 0, 0, 240) + If InStr(sPath, "zip") Then .Foreground = Color.Red + End With + If Not sFirst Then sFirst = sPath + 'ListView1.Add(sPath, File.Name(sPath), If(IsDir(sPath), hDirPict, hFilePict)) + Next + + tvwTest[sFirst].Selected = True + + GridView1.Rows.Count = 10 + GridView1.Columns.Count = 10 + +End + +Public Sub tvwTest_Select() + + Debug tvwTest.Key + 'Try tvwTest.Current.Expanded = True + +End + +Public Sub Button1_Click() + + tvwTest.Remove(tvwTest.Key) + +End + +Public Sub tvwTest_KeyPress() + + If Key.Code = Key.Delete Then Button1_Click + +End + +' Public Sub tvwTest_Compare(Key As String, OtherKey As String) +' +' Try tvwTest.Compare = Sgn(Stat(Key).Size - Stat(OtherKey).Size) +' 'If Error Then Stop Event +' +' End + +Public Sub Button2_Click() + + tvwTest.Border = Not tvwTest.Border + +End + +Public Sub tvwTest_DragMove() + + Debug + 'Stop Event + +End + +Public Sub tvwTest_MouseDrag() + + Debug "START" + Drag.Icon = Picture["icon:/small/text"] + Drag(tvwTest, "toto", "text/plain") + Debug "END" + +End + +Public Sub Button3_MouseDrag() + + Drag(Button3, "titi", "text/plain") + +End + +Public Sub Button3_Click() + + + +End + +Public Sub tvwTest_Menu() + + mnuPopup.Popup + +End + +Public Sub tvwTest_GotFocus() + + Debug + +End + +Public Sub tvwTest_LostFocus() + + Debug + +End + +Public Sub tvwTest_BeforeArrange() + + Debug + +End + +Public Sub Button4_Click() + + $sKey = tvwTest.Key + + tvwTest.Current.Reparent("/home/benoit/Photos/Aumale") + Debug $sKey; " -> "; tvwTest.Key + +End + +Public Sub Button5_Click() + + tvwTest.Current.Rename + +End + +Public Sub Button6_Click() + + tvwTest.ShowCheck = Not tvwTest.ShowCheck + +End + +Public Sub tvwTest_MouseDown() + + Debug + +End diff --git a/comp/src/gb.gui.base/.src/Test/FTreeView.form b/comp/src/gb.gui.base/.src/Test/FTreeView.form new file mode 100644 index 00000000..f315df6b --- /dev/null +++ b/comp/src/gb.gui.base/.src/Test/FTreeView.form @@ -0,0 +1,75 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,121,84) + Arrangement = Arrange.Vertical + Margin = True + { mnuPopup Menu + Text = ("Menu1") + Visible = False + { Menu2 Menu + Text = ("Menu2") + } + { Menu3 Menu + Text = ("Menu3") + } + { Menu4 Menu + Text = ("Menu4") + } + { Menu5 Menu + Text = ("Menu5") + } + } + { HBox1 HBox + MoveScaled(1,9,116,4) + { Button1 Button + MoveScaled(0,0,16,4) + Text = ("Delete") + } + { Button2 Button + MoveScaled(17,0,16,4) + Text = ("Border") + } + { Button3 Button + MoveScaled(34,0,16,4) + Text = ("Drag") + } + { Button4 Button + MoveScaled(51,0,16,4) + Text = ("Reparent") + } + { Button5 Button + MoveScaled(68,0,16,4) + Text = ("Rename") + } + { Button6 Button + MoveScaled(85,0,16,4) + Text = ("Check") + } + { CheckBox1 CheckBox + MoveScaled(102,0,24,4) + } + } + { Separator1 Separator + MoveScaled(29,19,12,0) + } + { tvwTest ColumnView + MoveScaled(13,22,42,26) + Drop = True + Expand = True + Mode = Select.Multiple + Sorted = True + Editable = True + Header = False + Resizable = True + Border = False + ShowLines = True + } + { GridView1 GridView + MoveScaled(20,51,37,27) + Visible = False + Expand = True + ShowCursor = True + Header = GridView.Both + } +} diff --git a/comp/src/gb.gui.base/.src/Test/FileView/CTaskPreview.class b/comp/src/gb.gui.base/.src/Test/FileView/CTaskPreview.class new file mode 100644 index 00000000..271a590f --- /dev/null +++ b/comp/src/gb.gui.base/.src/Test/FileView/CTaskPreview.class @@ -0,0 +1,98 @@ +' Gambas class file + +Inherits Task + +Private $sDir As String +Private $iSize As Integer +Private $aPreview As String[] + +Public Sub _new(sDir As String, iSize As Integer, aPreview As String[]) + + $sDir = sDir + $iSize = iSize + $aPreview = aPreview + +End + +Private Sub PrintIcon(sFile As String, hImage As Image) + + Dim hIcon As Image + Dim sTemp As String + + hIcon = New Image(hImage.W + 4, hImage.H + 4, Color.Transparent) + Paint.Begin(hIcon) + Paint.AntiAlias = False + Paint.LineWidth = 2 + Paint.Rectangle(0, 0, hIcon.W, hIcon.H) + Paint.Background = Color.Gray + Paint.Stroke + Paint.End + hIcon.DrawImage(hImage, 2, 2) + + sTemp = File.SetExt(Temp$(), "png") + hIcon.Save(sTemp) + Print sFile; "\t"; sTemp + +End + +Public Sub Main() + + Dim sFile As String + Dim sExt As String + Dim sPath As String + Dim hImage As Image + Dim hSvgImage As SvgImage + + Application.Priority += 10 + + For Each sFile In $aPreview + + sPath = $sDir &/ sFile + sExt = LCase(File.Ext(sFile)) + + If sExt = "jpg" Or If sExt = "jpeg" Or If sExt = "png" Or If sExt = "gif" Or If sExt = "bmp" Or If sExt = "xpm" Then + + If Stat(sPath).Size > 4194304 Then Continue + + Try hImage = Image.Load(sPath) + If Error Then Continue + + If Not (hImage.Width = $iSize And hImage.Height = $iSize) Then + If hImage.Width > hImage.Height Then + hImage = hImage.Stretch($iSize, ($iSize * hImage.Height) \ hImage.Width) + Else + hImage = hImage.Stretch(($iSize * hImage.Width) \ hImage.Height, $iSize) + Endif + Endif + + PrintIcon(sFile, hImage) + + Else If sExt = "svg" Or If sExt = "svgz" Then + + Try hSvgImage = SvgImage.Load(sPath) + If Error Then Continue + + If hSvgImage.Width > hSvgImage.Height Then + hSvgImage.Resize($iSize, $iSize * hSvgImage.Height / hSvgImage.Width) + Else + hSvgImage.Resize($iSize * hSvgImage.Width / hSvgImage.Height, $iSize) + Endif + + hImage = New Image(hSvgImage.Width, hSvgImage.Height, Color.Transparent) + Paint.Begin(hImage) + hSvgImage.Paint() + Paint.End + + PrintIcon(sFile, hImage) + + Endif + + Next + + Print "." + + Do + Sleep 3600 + Loop + +End diff --git a/comp/src/gb.gui.base/.src/Test/FileView/DirCache.class b/comp/src/gb.gui.base/.src/Test/FileView/DirCache.class new file mode 100644 index 00000000..09063adb --- /dev/null +++ b/comp/src/gb.gui.base/.src/Test/FileView/DirCache.class @@ -0,0 +1,159 @@ +' Gambas class file + +Class DesktopMime + +Static Private $cCache As New Collection + +Private $sDir As String +Private $aList As String[] + +Private $dDate As Date +Private $dLastModified As Date + +Private $cStat As New Collection +Private $cIcon As New Collection +Private $cIsDir As New Collection +Private $iLock As Integer + +Static Public Sub _get(sDir As String) As DirCache + + Dim hCache As DirCache + + If Right(sDir) <> "/" Then sDir &= "/" + + hCache = $cCache[sDir] + If Not hCache Then + hCache = New DirCache(sDir) + $cCache[sDir] = hCache + Endif + + Return hCache + +End + +Static Public Sub Exit() + + $cCache = Null + +End + + +Public Sub _new(sDir As String) + + $sDir = sDir + +End + +Public Sub Clear() + + $dDate = Null + +End + + +Private Sub CheckValid() As Boolean + + Dim dLastModified As Date + + If $iLock Then Return + + dLastModified = Stat($sDir).LastModified + + If IsNull($dLastModified) Or If dLastModified > $dLastModified Or If Now >= DateAdd($dDate, gb.Second, 5) Then + $dDate = Now + $dLastModified = dLastModified + $cStat.Clear + $aList = Null + Endif + +End + +Public Sub Invalidate() + + $dLastModified = Null + $dDate = Null + +End + + +Public Sub GetInfo(sFile As String) As Stat + + Dim hInfo As Stat + + If CheckValid() Then Return + + If sFile = "" Then sFile = "/" + hInfo = $cStat[sFile] + If Not hInfo Then + + 'Debug sFile + hInfo = Stat($sDir &/ sFile) + $cStat[sFile] = hInfo + + Endif + + Return hInfo + +End + +Public Sub IsDir(sFile As String) As Boolean + + If CheckValid() Then Return + + If sFile = "" Then sFile = "/" + + If Not $cIsDir.Exist(sFile) Then + + $cIsDir[sFile] = IsDir($sDir &/ sFile) + + Endif + + Return $cIsDir[sFile] + +End + + +Public Sub GetMimeIcon(sFile As String, iSize As Integer) As Image + + Dim hIcon As Image + + If CheckValid() Then Return + + hIcon = $cIcon[sFile & ":" & CStr(iSize)] + If Not hIcon Then + Try hIcon = DesktopMime.FromFile($sDir &/ sFile).GetIcon(iSize) + $cIcon[sFile & ":" & CStr(iSize)] = hIcon + Endif + + Return hIcon + +End + + +Public Sub GetFiles() As String[] + + If CheckValid() Then Return New String[] + + If Not $aList Then + 'Debug + $aList = Dir($sDir).Sort(gb.Natural) + Endif + + Return $aList + +End + + +Public Sub Lock() + + If $iLock = 0 Then CheckValid + Inc $iLock + +End + +Public Sub Unlock() + + Dec $iLock + +End + diff --git a/comp/src/gb.gui.base/.src/Test/FileView/FTestFileView.class b/comp/src/gb.gui.base/.src/Test/FileView/FTestFileView.class new file mode 100644 index 00000000..cd484a5e --- /dev/null +++ b/comp/src/gb.gui.base/.src/Test/FileView/FTestFileView.class @@ -0,0 +1,14 @@ +' Gambas class file + + +Public Sub Button1_Click() + + FileView1.ShowDetailed = Not FileView1.ShowDetailed + +End + +Public Sub Form_Open() + + FileView1.Dir = "/usr/bin" + +End diff --git a/comp/src/gb.gui.base/.src/Test/FileView/FTestFileView.form b/comp/src/gb.gui.base/.src/Test/FileView/FTestFileView.form new file mode 100644 index 00000000..1ac04e4d --- /dev/null +++ b/comp/src/gb.gui.base/.src/Test/FileView/FTestFileView.form @@ -0,0 +1,17 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,64,64) + Arrangement = Arrange.Vertical + { FileView1 FileView + MoveScaled(3,4,56,32) + Expand = True + } + { HBox1 HBox + MoveScaled(3,55,58,4) + { Button1 Button + MoveScaled(1,0,16,4) + Text = ("Toggle view") + } + } +} diff --git a/comp/src/gb.gui.base/.src/Test/FileView/FileView.class b/comp/src/gb.gui.base/.src/Test/FileView/FileView.class new file mode 100644 index 00000000..8fc9d635 --- /dev/null +++ b/comp/src/gb.gui.base/.src/Test/FileView/FileView.class @@ -0,0 +1,1126 @@ +' Gambas class file + +'Export +Inherits UserControl + +Class Watch + +Public Const _Properties As String = "*,Border=True,Mode{Select.*}=Single,Dir,ShowDetailed,ShowHidden,ShowDirectory,ShowPreview" +Public Const _DefaultEvent As String = "Click" +Public Const _Group As String = "View" + +Event {Select} +Event Click +Event Activate +Event Menu +Event Icon(Path As String) + +Property {Dir} As String +Property ShowHidden As Boolean +Property ShowDirectory As Boolean +Property Current As String +Property Mode As Integer +Property ShowDetailed As Boolean +Property ShowPreview As Boolean +Property Selection As String[] +Property Filter As String[] +Property Icon As Picture +Property IconSize As Integer +Property Border As Boolean +Property Settings As Variant[] +Property Read Count As Integer +Property Background As Integer +Property Foreground As Integer + +Static Private $cExt As New Collection(gb.IgnoreCase) + +Private Const PREFIX_DIR As String = "0" +Private Const PREFIX_FILE As String = "1" + +Private $sDir As String +Private $bShowHidden As Boolean +Private $bShowDir As Boolean +Private $bShowPreview As Boolean +Private $hIconView As IconView +Private $hColumnView As ColumnView +Private $iSort As Integer +Private $bAsc As Boolean = True +Private $aFilter As String[] +Private $hPict As Picture +Private $hRefresh As Timer +Private $bRefreshTriggered As Boolean +Private $iIconSize As Integer = 32 +Private $bDesktopIsLoaded As Boolean + +Private $hPreview As CTaskPreview +Private $hEnsureVisible As Timer +Private $hWatch As Watch +Private $bWatch As Boolean +Private $bRefreshIcon As Boolean +Private $bRefreshAll As Boolean +Private $hWatcher As Watcher +Private $bVisible As Boolean +Private $bInvalidate As Boolean +Private $sSortDir As String + +Static Public Sub _init() + + $cExt["html"] = "html" + $cExt["htm"] = "html" + $cExt["css"] = "html" + $cExt["tar"] = "archive" + $cExt["gz"] = "archive" + $cExt["tgz"] = "archive" + $cExt["bz2"] = "archive" + $cExt["z"] = "archive" + $cExt["zip"] = "archive" + $cExt["txt"] = "text" + $cExt["json"] = "text" + $cExt["mp3"] = "audio" + $cExt["aac"] = "audio" + $cExt["ogg"] = "audio" + $cExt["wav"] = "audio" + $cExt["mpg"] = "video" + $cExt["mpeg"] = "video" + $cExt["avi"] = "video" + $cExt["wmv"] = "video" + $cExt["mov"] = "video" + $cExt["gambas"] = "gambas" + $cExt["c"] = "text" + $cExt["cpp"] = "text" + $cExt["h"] = "text" + $cExt["deb"] = "package" + $cExt["rpm"] = "package" + $cExt["iso"] = "cdrom" + $cExt["jpg"] = "image" + $cExt["jpeg"] = "image" + $cExt["png"] = "image" + $cExt["gif"] = "image" + $cExt["xpm"] = "image" + $cExt["bmp"] = "image" + $cExt["ico"] = "image" + $cExt["xcf"] = "image" + $cExt["svg"] = "image" + $cExt["pdf"] = "pdf" + $cExt["ttf"] = "font" + $cExt["otf"] = "font" + $cExt["bdf"] = "font" + +End + +Static Public Sub _exit() + + Try DirCache.Exit + +End + + +Public Sub _new() + + $bDesktopIsLoaded = Component.IsLoaded("gb.desktop") + $bWatch = Component.IsLoaded("gb.inotify") + If $bWatch Then $hWatcher = New Watcher(Me) As "Watcher" + + With $hIconView = New IconView(Me) As "View" + .Sorted = True + .IconLines = 3 + End With + + With $hColumnView = New ColumnView(Me) As "View" + .Columns.Count = 3 + .Columns[0].Text = ("Name") + .Columns[0].Expand = False + .Columns[1].Text = ("Size") + .Columns[1].Alignment = Align.Right + .Columns[2].Text = ("Last modified") + '.Columns[2].Alignment = Align.Right + '.Columns[0].Width = 64 + '.Columns[1].Width = 64 + '.Columns[2].Width = 96 + .Visible = False + .Sorted = True + .Resizable = True + End With + + Me.Proxy = GetView() + + $hRefresh = New Timer As "Refresh" + $hEnsureVisible = New Timer As "EnsureVisible" + + RefreshViewLater + +End + +Private Function CheckFilter(sFile As String) As Boolean + + Dim sFilter As String + + For Each sFilter In $aFilter + If sFile Like sFilter Then Return + Next + + Return True + +End + +Private Sub GetMimeIcon(sPath As String, iSize As Integer) As Picture + + Try Return DirCache[File.Dir(sPath)].GetMimeIcon(File.Name(sPath), iSize).Picture + +End + +Private Sub GetIcon(sPath As String, iSize As Integer) As Picture + + Dim sIcon As String + Dim hPict As Picture + + $hPict = Null + Try Raise Icon(sPath) + If $hPict Then Return $hPict + + If IsDir(sPath) Then Return + + 'If $bShowPreview And If $cPreview.Exist(sPath) Then Return $cPreview[sPath].Picture + + ' If $bShowPreview And If $aImgExt.Exist(File.Ext(sPath), gb.IgnoreCase) < 0 Then + ' If Stat(sPath).Size <= 65536 Then + ' + ' Try hImage = Image.Load(sPath) + ' If Not Error Then + ' If Not (hImage.Width = iSize And hImage.Height = iSize) Then + ' If hImage.Width > hImage.Height Then + ' hImage = hImage.Stretch(iSize, (iSize * hImage.Height) \ hImage.Width) + ' Else + ' hImage = hImage.Stretch((iSize * hImage.Width) \ hImage.Height, iSize) + ' Endif + ' Endif + ' + ' hIcon = New Image(hImage.W + 4, hImage.H + 4, Color.Transparent) + ' Paint.Begin(hIcon) + ' Paint.AntiAlias = False + ' Paint.LineWidth = 2 + ' Paint.Rectangle(0, 0, hIcon.W, hIcon.H) + ' Paint.Background = Color.Merge(GetView().Background, Color.Gray) + ' Paint.Stroke + ' Paint.End + ' hIcon.DrawImage(hImage, 2, 2) + ' + ' Return hIcon.Picture + ' Else + ' Return Picture["icon:/" & iSize & "/image"] + ' Endif + ' + ' Endif + ' + ' Endif + + If $bDesktopIsLoaded Then + + hPict = GetMimeIcon(sPath, iSize) + If hPict Then Return hPict + + Endif + + Try sIcon = $cExt[File.Ext(sPath)] + If sIcon Then Return Picture["icon:/" & CStr(iSize) &/ sIcon] + + With DirCache[File.Dir(sPath)].GetInfo(File.Name(sPath)) + + If InStr(.Perm[System.User.Name], "x") Then Return Picture["icon:/" & CStr(iSize) &/ "exec"] + + End With + +Catch + + Error "gb.form: unable to get icon for file: "; File.Name(sPath); ": "; Error.Text + +End + +Private Sub GetSelection() As String[] + + Dim hView As Object + Dim aSel As New String[] + + If $hIconView.Visible Then + hView = $hIconView + Else + hView = $hColumnView + Endif + + hView.MoveFirst + While hView.Available + If hView.Item.Selected Then + aSel.Add(hView.Item.Key) + Endif + hView.MoveNext + Wend + + Return aSel + +End + +Private Sub GetIconSize() As Integer + + If $hColumnView.Visible Then + Return 16 'Stock.GetSize("small") + Else + Return $iIconSize + Endif + +End + +Private Sub GetCurrentDir() As String + + If $sDir Then + Return $sDir + Else + Return User.Home + Endif + +End + +Static Public Sub _GetHiddenColor() As Integer + + Return Color.Merge(Color.TextBackground, Color.TextForeground, 0.66) + +End + +Private Sub RefreshView() + + Dim sFile As String + Dim sDir As String + Dim hPictFile As Picture + Dim hPictFolder As Picture + Dim hPict As Picture + Dim sPrefix As String + Dim iSize As Integer + Dim aSel As String[] + Dim aDir As New String[] + Dim I As Integer + Dim sText As String + Dim bRichText As Boolean + Dim hCache As DirCache + Dim iHiddenFg As Integer + Dim SX As Integer + Dim SY As Integer + Dim sKey As String + Dim aPreview As New String[] + Dim sExt As String + + Inc Application.Busy + + $bRefreshTriggered = False + + iHiddenFg = _GetHiddenColor() + + aSel = GetSelection() + + If $hColumnView.Visible Then + SX = $hColumnView.ScrollX + SY = $hColumnView.ScrollY + If Not $bWatch Or If $bRefreshAll Then + $hColumnView.Clear + $hColumnView._Begin() + Endif + $hColumnView.Sorted = False + hPictFile = Picture["icon:/small/file"] + hPictFolder = Picture["icon:/small/directory"] + Else + SX = $hIconView.ScrollX + SY = $hIconView.ScrollY + If Not $bWatch Or If $bRefreshAll Then $hIconView.Clear + $hIconView._Begin + hPictFile = Picture["icon:/" & $iIconSize & "/file"] + hPictFolder = Picture["icon:/" & $iIconSize & "/directory"] + Endif + + iSize = GetIconSize() + + sDir = GetCurrentDir() + + If $bWatch And If $bVisible Then + If Not $hWatch Or If $hWatch.Path <> sDir Then + $hWatch = New Watch(sDir) As "Watch" + Endif + Endif + + hCache = DirCache[sDir] + If $bInvalidate Then + hCache.Invalidate + $bInvalidate = False + Endif + + 'Try aDir = Dir(sDir, "*").Sort() + Try aDir = hCache.GetFiles() + hCache.Lock + For Each sFile In aDir + If Not $bShowHidden And If Left(sFile) = "." Or Right(sFile) = "~" Then Continue + 'With Stat(sDir &/ sFile) + With hCache.GetInfo(sFile) + If hCache.IsDir(sFile) Then + If Not $bShowDir Then Continue + sPrefix = PREFIX_DIR + Else + If $aFilter And If CheckFilter(sFile) Then Continue + sPrefix = PREFIX_FILE + Endif + + sKey = sPrefix & sFile + + hPict = GetIcon(sDir &/ sFile, iSize) + If Not hPict Then + If hCache.IsDir(sFile) Then + hPict = hPictFolder + Else + hPict = hPictFile + Endif + Endif + + bRichText = False + + sText = sFile + If .Link Then + sText = "" & sText & "" + bRichText = True + Endif + If .Hidden Then + sText = "" & sText & "" + bRichText = True + Endif + + If $hColumnView.Visible Then + If Not $hColumnView.Exist(sKey) Then + $hColumnView.Add(sKey, sFile, hPict).Editable = Access(sDir, gb.Write) + GoSub ADD_PREVIEW + Else + $hColumnView[sKey].Editable = Access(sDir, gb.Write) + If $bRefreshIcon Then + $hColumnView[sKey].Picture = hPict + GoSub ADD_PREVIEW + Endif + Endif + $hColumnView[sKey][1] = " " & Main.GetFileSize(.Size) + $hColumnView[sKey][2] = " " & Str(.Time) + If bRichText Then $hColumnView[sPrefix & sFile].RichText = sText + Else + If Not $hIconView.Exist(sKey) Then + $hIconView.Add(sKey, sFile, hPict).Editable = Access(sDir, gb.Write) + GoSub ADD_PREVIEW + Else + $hIconView[sKey].Editable = Access(sDir, gb.Write) + If $bRefreshIcon Then + $hIconView[sKey].Picture = hPict + GoSub ADD_PREVIEW + Endif + Endif + If bRichText Then $hIconView[sKey].RichText = sText + Endif + + End With + Next + + hCache.Unlock + + If $hColumnView.Visible Then + For I = 1 To $hColumnView.Columns.Max + $hColumnView.Columns[I].W = -1 + Next + Endif + + For Each sFile In aSel + Try GetView()[sFile].Selected = True + Next + + If aPreview.Count Then RunPreview(aPreview) + +Finally + + $bRefreshIcon = False + $bRefreshAll = False + If $hColumnView.Visible Then + $hColumnView.Sorted = True + $hColumnView._End() + Else + $hIconView._End + Endif + Try GetView().Scroll(SX, SY) + Dec Application.Busy + +Catch + + Error "gb.form: "; Error.Where; ": "; Error.Text + Return + +ADD_PREVIEW: + + If Not $bShowPreview Then Return + sExt = LCase(File.Ext(sFile)) + If Not sExt Then Return + If $cExt[sExt] <> "image" Then Return + aPreview.Add(sFile) + Return + +End + +Private Sub RunPreview(aPreview As String[]) + + If $hPreview Then $hPreview.Stop + $hPreview = New CTaskPreview(GetCurrentDir(), GetIconSize(), aPreview) As "TaskPreview" + +End + +Public Sub TaskPreview_Read(Data As String) + + Dim iPos As Integer + Dim sPath As String + Dim sPreview As String + Dim sLine As String + + If Not $bShowPreview Then Return + + For Each sLine In Split(Data, "\n", "", True) + + If sLine = "." Then + Try $hPreview.Stop + Return + Endif + + iPos = InStr(sLine, "\t") + sPath = Left(sLine, iPos - 1) + sPreview = Mid$(sLine, iPos + 1) + + Try GetView()[PREFIX_FILE & sPath].Picture = Image.Load(sPreview).Picture + + Next + +End + +Public Sub TaskPreview_Kill() + + If $hPreview = Last Then $hPreview = Null + +End + + +Private Sub RefreshViewLater(Optional bClear As Boolean) + + If $bRefreshTriggered Then Return + If $hRefresh.Enabled Then $hRefresh.Stop + + $bRefreshAll = bClear + $bRefreshTriggered = True + $hRefresh.Trigger + +End + +Public Sub RefreshViewAfter() + + If $bRefreshTriggered Then Return + If $hRefresh.Enabled Then Return + + $hRefresh.Delay = 100 + $hRefresh.Start + +End + + +Public Sub Refresh_Timer() + + If Not $bRefreshTriggered And Not $hRefresh.Enabled Then Return + RefreshView + $hRefresh.Stop + +End + +Public Sub Reload() + + $bInvalidate = True + RefreshViewLater(True) + +End + +Private Function Dir_Read() As String + + Return $sDir + +End + +Private Sub Dir_Write(sDir As String) + + $sDir = sDir + RefreshViewLater(True) + +End + +Private Function ShowHidden_Read() As Boolean + + Return $bShowHidden + +End + +Private Sub ShowHidden_Write(bShowHidden As Boolean) + + If bShowHidden = $bShowHidden Then Return + $bShowHidden = bShowHidden + RefreshViewLater(True) + +End + +Private Function ShowDirectory_Read() As Boolean + + Return $bShowDir + +End + +Private Sub ShowDirectory_Write(bShow As Boolean) + + If $bShowDir = bShow Then Return + $bShowDir = bShow + RefreshViewLater(True) + +End + +Private Function GetView() As Object + + If $hIconView.Visible Then + Return $hIconView + Else + Return $hColumnView + Endif + +End + +Private Function Current_Read() As String + + If GetView().Current.Selected Then Return Mid$(GetView().Current.Key, 2) + +Catch + +End + +Private Sub EnsureRefresh() + + Refresh_Timer + +End + +Public Sub EnsureVisible_Timer() + + Dim hItem As Object + + hItem = GetView().Current + If Not hItem Then Return + + With hItem + If Not .Selected Then Return + .EnsureVisible + End With + +End + + +Private Sub Current_Write(sFile As String) + + Dim sKey As String + + 'Debug sFile + + If sFile = Current_Read() Then Return + + EnsureRefresh + + GetView().UnselectAll + sKey = PREFIX_DIR & sFile + If Not GetView().Exist(sKey) Then sKey = PREFIX_FILE & sFile + If Not GetView().Exist(sKey) Then Return + + GetView()[sKey].Selected = True + $hEnsureVisible.Trigger + +End + +' Private Function Font_Read() As Font +' +' Return Super.Font +' +' End +' +' Private Sub Font_Write(hFont As Font) +' +' Super.Font = hFont +' RefreshGrid +' +' End + +Private Function ShowDetailed_Read() As Boolean + + Return $hColumnView.Visible + +End + +Private Sub ShowDetailed_Write(bDetailed As Boolean) + + Dim hOld As Control + + If bDetailed = ShowDetailed_Read() Then Return + + If bDetailed Then + + hOld = $hIconView + $hColumnView.Show + + Else + + hOld = $hColumnView + $hIconView.Show + + Endif + + hOld.Hide + Me.Proxy = GetView() + Me.Background = hOld.Background + Me.Foreground = hOld.Foreground + $bRefreshAll = True + RefreshView + TakeSelection + +End + +Public Sub View_Select() + + Raise {Select} + +End + +Public Sub View_Click() + + Raise Click + +End + +Public Sub View_Activate() + + Raise Activate + +End + +Public Sub View_Menu() + + Raise Menu + +End + +Public Sub View_BeforeSort() + + $sSortDir = GetCurrentDir() + + If $hColumnView.Visible Then + $iSort = $hColumnView.Columns.Sort + $bAsc = $hColumnView.Columns.Ascending + Else + $hIconView.Ascending = $bAsc + Endif + +End + + +Public Sub View_Compare((Key) As String, OtherKey As String) + + Dim hStat As Stat + Dim hStat2 As Stat + Dim iComp As Integer + + iComp = Sgn(Asc(Key) - Asc(OtherKey)) + + If iComp = 0 Then + + If $iSort Then + hStat = DirCache[$sSortDir].GetInfo(Mid$(Key, 2)) + hStat2 = DirCache[$sSortDir].GetInfo(Mid$(OtherKey, 2)) + Endif + + Select $iSort + + Case 1 + iComp = Sgn(hStat.Size - hStat2.Size) + + Case 2 + iComp = Sgn(hStat.Time - hStat2.Time) + + End Select + + If iComp = 0 Then iComp = Comp(Key, OtherKey, gb.IgnoreCase + gb.Natural) + + 'IF NOT $bAsc THEN iComp = (- iComp) + + Endif + + Last.Compare = iComp + +Catch + +End + +Private Sub Mode_Write(iMode As Integer) + + $hIconView.Mode = iMode + $hColumnView.Mode = iMode + +End + +Private Function Mode_Read() As Integer + + Return $hIconView.Mode + +End + +Private Function Selection_Read() As String[] + + Dim hView As Object + Dim aSel As New String[] + + EnsureRefresh + + hView = GetView() + hView.MoveFirst + While hView.Available + If hView.Item.Selected Then + aSel.Add(hView.Item.Text) + Endif + hView.MoveNext + Wend + + Return aSel + +End + +Private Sub Selection_Write(Value As String[]) + + Dim hView As Object + Dim sFile As String + Dim hCache As DirCache + + If $hIconView.Mode = Select.None Then Return + + EnsureRefresh + + hCache = DirCache[GetCurrentDir()] + + hView = GetView() + hView.UnselectAll + For Each sFile In Value + sFile = If(hCache.IsDir(sFile), PREFIX_DIR, PREFIX_FILE) & sFile + Try hView[sFile].Selected = True + Next + +End + +Private Sub TakeSelection() + + Dim hSrc As Object + Dim hDst As Object + + If $hIconView.Mode = Select.None Then Return + + hSrc = $hIconView + hDst = $hColumnView + If $hIconView.Visible Then Swap hSrc, hDst + + If $hIconView.Mode = Select.Single Then + If hSrc.Current And If hSrc.Current.Selected Then + Object.Lock(hDst) + hDst[hSrc.Key].Selected = True + hDst[hSrc.Key].EnsureVisible + Object.Unlock(hDst) + Endif + Return + Endif + + hDst.UnselectAll + hSrc.MoveFirst + While hSrc.Available + If hSrc.Item.Selected Then + Object.Lock(hDst) + hDst[hSrc.Item.Key].Selected = True + Object.Unlock(hDst) + Endif + hSrc.MoveNext + Wend + +End + +Private Function Filter_Read() As String[] + + Return $aFilter + +End + +Private Sub Filter_Write(aFilter As String[]) + + $aFilter = aFilter.Copy() + RefreshViewLater(True) + +End + +Private Function Icon_Read() As Picture + + Return $hPict + +End + +Private Sub Icon_Write(Value As Picture) + + $hPict = Value + +End + +Private Function Border_Read() As Boolean + + Return $hColumnView.Border + +End + +Private Sub Border_Write(Value As Boolean) + + $hColumnView.Border = Value + $hIconView.Border = Value + +End + +Private Function Settings_Read() As Variant[] + + Return [1, CVariant(ShowDetailed_Read()), ShowHidden_Read(), $hColumnView.Settings, $iIconSize, ShowPreview_Read()] + + 'Return IIf(ShowDetailed_Read(), "1", "0") & "," & IIf(ShowHidden_Read(), "1", "0") & "," & $hColumnView.Settings + +End + +Private Sub Settings_Write(Value As Variant[]) + + If TypeOf(Value[0]) = gb.Integer Then + ShowDetailed_Write(Value[1]) + ShowHidden_Write(Value[2]) + $hColumnView.Settings = Value[3] + IconSize_Write(Value[4]) + If Value.Count >= 6 Then ShowPreview_Write(Value[5]) + Else + ShowDetailed_Write(Value[0]) + ShowHidden_Write(Value[1]) + $hColumnView.Settings = Value[2] + Endif + +Catch + + Error "gb.form :"; Error.Where; ": "; Error.Text + +End + +Private Function Count_Read() As Integer + + If $hIconView.Visible Then + Return $hIconView.Count + Else + Return $hColumnView.Count + Endif + +End + +' PUBLIC SUB View_MouseMove() +' +' IF $hIconView.Visible THEN RETURN +' +' IF $hColumnView.Find(Mouse.X, Mouse.Y) THEN RETURN +' DEBUG $hColumnView.Item.Text +' +' END + +Private Function IconSize_Read() As Integer + + Return $iIconSize + +End + +Private Sub IconSize_Write(Value As Integer) + + $iIconSize = Value + $bRefreshIcon = True + RefreshViewLater + $hIconView.GridSize = Min(40, (Value + 8) \ 3) + +End + +Public Sub SelectAll() + + If $hIconView.Mode <> Select.Multiple Then Return + EnsureRefresh + GetView().SelectAll() + +End + +Public Sub UnselectAll() + + If $hIconView.Mode <> Select.Multiple Then Return + GetView().UnselectAll() + +End + +Private Function Background_Read() As Integer + + Return $hColumnView.Background + +End + +Private Sub Background_Write(Value As Integer) + + $hIconView.Background = Value + $hColumnView.Background = Value + +End + +Private Function Foreground_Read() As Integer + + Return $hColumnView.Foreground + +End + +Private Sub Foreground_Write(Value As Integer) + + $hIconView.Foreground = Value + $hColumnView.Foreground = Value + +End + +Private Function ShowPreview_Read() As Boolean + + Return $bShowPreview + +End + +Private Sub ShowPreview_Write(Value As Boolean) + + If $bShowPreview = Value Then Return + $bShowPreview = Value + $bRefreshIcon = True + RefreshViewLater + +End + +Public Sub Rename() + + Dim hView As Object = GetView() + Dim sPath As String + + Try sPath = hView.Current.Key + If sPath Then + hView[sPath].Rename + Endif + +End + +Public Sub View_Cancel() + + Reload + +End + + +Public Sub View_Rename() + + Dim hView As Object = GetView() + Dim sKey As String = hView.Item.Key + Dim sOldPath As String = GetCurrentDir() &/ Mid$(sKey, 2) + Dim sNewName As String = hView.Item.Text + Dim sMsg As String + + If sNewName = File.Name(sOldPath) Then Return + + sMsg = Help.CheckFileName(sNewName) + If sMsg Then + 'Balloon.Warning(sMsg, hView, hView.Item.X + Min(32 + Desktop.Scale * 8, hView.Item.W) / 2, hView.Item.Y + hView.Item.H / 2) + Stop Event + Return + Endif + + Move sOldPath To File.SetName(sOldPath, sNewName) + + 'sParent = File.Dir(sKey) + + ' TODO: Optimization + + Object.Lock(hView) + hView.Remove(sKey) + Mid$(sKey, 2) = sNewName + 'AddDir(File.Dir(sKey), File.Name(sKey)) + RefreshView + Object.Unlock(hView) + + Try hView.Key = sKey + +Catch + + hView[sKey].Text = File.Name(sOldPath) + Message.Error(("Cannot rename file.") & "\n\n" & Error.Text) + +End + +Private Sub GetWatchKey() As String + + If Watch.IsDir Then + Return PREFIX_DIR & Watch.Name + Else + Return PREFIX_FILE & Watch.Name + Endif + +End + +Public Sub Watch_Create() + + DirCache[GetCurrentDir()].Invalidate + RefreshViewLater + +End + +Public Sub Watch_Delete() + + DirCache[GetCurrentDir()].Invalidate + Try GetView().Remove(GetWatchKey()) + If Not Error Then RefreshViewLater + +End + +Public Sub Watch_MoveFrom() + + DirCache[GetCurrentDir()].Invalidate + Try GetView().Remove(GetWatchKey()) + If Not Error Then RefreshViewLater + +End + +Public Sub Watch_MoveTo() + + DirCache[GetCurrentDir()].Invalidate + RefreshViewLater + +End + +Public Sub Watch_Stat() + + RefreshViewLater + +End + +Public Sub Watcher_Hide() + + 'Debug + $hWatch = Null + $bVisible = False + +End + +Public Sub Watcher_Show() + + 'Debug + $bVisible = True + RefreshViewLater + +End diff --git a/comp/src/gb.gui.base/.src/Test/FileView/Help.module b/comp/src/gb.gui.base/.src/Test/FileView/Help.module new file mode 100644 index 00000000..bb2022b7 --- /dev/null +++ b/comp/src/gb.gui.base/.src/Test/FileView/Help.module @@ -0,0 +1,74 @@ +' Gambas module file + + +Public Sub GotoNext(hCtrl As Control, Optional bSelect As Boolean) + + Dim hTextBox As TextBox + + hCtrl = hCtrl.Next + If hCtrl And If Object.Type(hCtrl) <> "TextBox" Then + hCtrl = hCtrl.Next + Endif + + If hCtrl Then + hTextBox = hCtrl + hCtrl.SetFocus + hCtrl.Pos = 0 + If bSelect Then hCtrl.SelectAll + Endif + +End + + +Public Sub GotoPrevious(hCtrl As Control, Optional bSelect As Boolean) + + Dim hTextBox As TextBox + + hCtrl = hCtrl.Previous + If hCtrl And If Object.Type(hCtrl) <> "TextBox" Then + hCtrl = hCtrl.Previous + Endif + + If hCtrl Then + hTextBox = hCtrl + hCtrl.SetFocus + hCtrl.Pos = hCtrl.Length + If bSelect Then hCtrl.SelectAll + Endif + +End + +Public Sub ManageKeyPress(sCar As String, aTextBox As Object[]) + + Dim hLast As TextBox = Last + + If Asc(Key.Text) >= 32 And Asc(Key.Text) < 127 Then + If Not IsDigit(Key.Text) Then + If InStr(sCar, Key.Text) Then + Help.GotoNext(Last) + Endif + Stop Event + Return + Endif + Else If Key.Code = Key.Home Then + aTextBox[0].SelectAll + aTextBox[0].SetFocus + Stop Event + Else If Key.Code = Key.End Then + aTextBox[2].SelectAll + aTextBox[2].SetFocus + Stop Event + Else If Key.Code = Key.Left Then + If hLast.Pos = 0 Then GotoPrevious(Last) + Else If Key.Code = Key.Right Then + If hLast.Pos = hLast.Length Then GotoNext(Last) + Endif + +End + +Public Sub CheckFileName(sName As String) As String + + If Not sName Then Return ("A file or directory name cannot be void.") + If InStr(sName, "/") Then Return ("The '/' character is forbidden inside file or directory names.") + +End diff --git a/comp/src/gb.gui.base/.src/Test/TestMessage.module b/comp/src/gb.gui.base/.src/Test/TestMessage.module new file mode 100644 index 00000000..b4a12862 --- /dev/null +++ b/comp/src/gb.gui.base/.src/Test/TestMessage.module @@ -0,0 +1,18 @@ +' Gambas module file + +Use "gb.form" +Use "gb.form.stock" + +Public Sub Main() + + ' Print Message.Question("Ceci est un message d'avertissement dont le texte est tout spécialement long afin de tester la boite de dialogue. Toutes les modifications non enregistrées seront perdues !", "Sauvegarder", "Envoyer", "Annuler") + + Dim p As String + p = "

        Desktop Properties


        " + p &= "
        Size: " & Desktop.Width & " x " & Desktop.Height & "" + p &= "
        Resolution DPI: " & Desktop.Resolution & "" + p &= "
        Font pixels: " & Desktop.Scale & "" + p &= "
        Charset: " & Desktop.Charset & "" + Message.Info(p) + +End diff --git a/comp/src/gb.gui.base/.src/TreeView/ColumnView.class b/comp/src/gb.gui.base/.src/TreeView/ColumnView.class new file mode 100644 index 00000000..ce6a6110 --- /dev/null +++ b/comp/src/gb.gui.base/.src/TreeView/ColumnView.class @@ -0,0 +1,232 @@ +' Gambas class file + +Export +Inherits _TreeView + +Public Const _Properties As String = "*,Mode{Select.*}=Single,Sorted,Editable,Header=True,Resizable=False,AutoResize=True,Border=True,ScrollBar{Scroll.*}=Both,ShowLines,ShowCheck" +Public Const _Group As String = "View" +Public Const _DefaultEvent As String = "Click" +Public Const _DefaultSize As String = "16,16" +Public Const _Similar As String = "ListView" + +Property Layout As Variant +Property Header As Boolean +Property Resizable As Boolean +Property AutoResize As Boolean +Property Read Columns As _ColumnView_Columns +Property Settings As String +Property ShowLines As Boolean + +Private $hView As GridView +Private $hColumns As _ColumnView_Columns + +Public Sub _new() + + $hView = Me.Proxy + Me.Header = True + Me.Resizable = False + + $hColumns = New _ColumnView_Columns As "Columns" + +End + + +Public Sub Add((Key) As String, Text As String, Optional (Picture) As Picture, Optional Parent As String, Optional After As String) As _TreeView_Item + + Return Super._Add(Key, Text, Picture, Parent, After) + +End + + +Private Function Header_Read() As Boolean + + Return $hView.Header + +End + +Private Sub Header_Write(Value As Boolean) + + $hView.Header = If(Value, GridView.Horizontal, GridView.None) + +End + +Private Function Resizable_Read() As Boolean + + Return $hView.Resizable + +End + +Private Sub Resizable_Write(Value As Boolean) + + $hView.Resizable = Value + +End + +Private Function AutoResize_Read() As Boolean + + Return $hView.AutoResize + +End + +Private Sub AutoResize_Write(Value As Boolean) + + $hView.AutoResize = Value + +End + +Private Function Columns_Read() As _ColumnView_Columns + + Return $hColumns + +End + +Private Function Settings_Read() As String + + Dim sVal As String + Dim iCol As Integer + + With Me + + sVal = CStr(.Columns.Count) + + For iCol = 0 To .Columns.Count - 1 + 'sVal &= "," & "\"" & Quote(.Columns[iCol].Text) & "\"" + sVal &= "," & CStr(Round(.Columns[iCol].Width / Desktop.Scale, -3)) + Select Case .Columns[iCol].Alignment + Case Align.Left + sVal &= ",<" + Case Align.Right + sVal &= ",>" + End Select + If .Columns.Sort = iCol Then + If .Columns.Ascending Then + sVal &= ",+" + Else + sVal &= ",-" + Endif + Endif + Next + + End With + + 'DEBUG sVal + + Return sVal + +End + +Private Sub Settings_Write(Value As String) + + Dim aVal As String[] + Dim iInd As Integer + Dim iCol As Integer + Dim eWidth As Float[] + Dim eSum As Float + + 'DEBUG sSettings + + aVal = Split(Value, ",", "\"") + + With Me + + .Columns.Count = CInt(aVal[0]) + eWidth = New Float[.Columns.Count] + Inc iInd + While iCol < .Columns.Count + If iInd >= aVal.Count Then Break + 'DEBUG iCol;; "=";; CFloat(aVal[iInd]) + eWidth[iCol] = CFloat(aVal[iInd]) * Desktop.Scale + eSum += eWidth[iCol] + Inc iInd + Do + If iInd >= aVal.Count Then Break + Select Case aVal[iInd] + Case "<" + .Columns[iCol].Alignment = Align.Left + Case ">" + .Columns[iCol].Alignment = Align.Right + Case "+" + .Columns.Sort = iCol + .Columns.Ascending = True + Case "-" + .Columns.Sort = iCol + .Columns.Ascending = False + Case Else + Break + End Select + Inc iInd + Loop + Inc iCol + Wend + + iCol = 0 + While iInd < aVal.Count And iCol < .Columns.Count + .Columns[iCol].Text = UnQuote(aVal[iInd]) + Inc iCol + Inc iInd + Wend + + If eSum > 0 Then + For iCol = 0 To .Columns.Count - 1 + .Columns[iCol].Width = eWidth[iCol] * .ClientW / eSum + Next + ' ELSE + ' FOR iCol = 0 TO .Columns.Count - 1 + ' .Columns[iCol].Width = eWidth[iCol] + ' 'DEBUG iCol;; ":";; .Columns[iCol].Width / Desktop.Scale + ' NEXT + Endif + + 'DEBUG sSettings;; "->";; hColumnView.Settings + + End With + +Catch + + Debug Error.Where; ": "; Error.Text + +End + +Public Sub AddColumn(Text As String, Optional Width As Integer, Alignment As Integer = Align.Normal) As _GridView_Column + + Dim hCol As _GridView_Column + + Inc $hColumns.Count + + hCol = $hColumns[$hColumns.Max] + hCol.Text = Text + If Width < 0 Then + hCol.Expand = True + Else If Width Then + hCol.Width = Width + Endif + hCol.Alignment = Alignment + + Return hCol + +End + + +Private Function Layout_Read() As Variant + + Return Super._GetLayout() + +End + +Private Sub Layout_Write(Value As Variant) + + Super._SetLayout(Value) + +End + +Private Function ShowLines_Read() As Boolean + + Return Super._GetShowLines() + +End + +Private Sub ShowLines_Write(Value As Boolean) + + Super._SetShowLines(Value) + +End diff --git a/comp/src/gb.gui.base/.src/TreeView/ListView.class b/comp/src/gb.gui.base/.src/TreeView/ListView.class new file mode 100644 index 00000000..e77f4848 --- /dev/null +++ b/comp/src/gb.gui.base/.src/TreeView/ListView.class @@ -0,0 +1,17 @@ +' Gambas class file + +Export +Inherits _TreeView + +Public Const _Properties As String = "*,Mode{Select.*}=Single,Sorted,Editable,Border=True,ScrollBar{Scroll.*}=Both,ShowCheck" +Public Const _Group As String = "View" +Public Const _DefaultEvent As String = "Click" +Public Const _DefaultSize As String = "16,16" +Public Const _Similar As String = "ListView" + +Public Sub Add((Key) As String, Text As String, Optional (Picture) As Picture, Optional After As String) As _TreeView_Item + + Return Super._Add(Key, Text, Picture, "", After) + +End + diff --git a/comp/src/gb.gui.base/.src/TreeView/RenameBox.class b/comp/src/gb.gui.base/.src/TreeView/RenameBox.class new file mode 100644 index 00000000..5ee13446 --- /dev/null +++ b/comp/src/gb.gui.base/.src/TreeView/RenameBox.class @@ -0,0 +1,84 @@ +' Gambas class file + +Inherits Panel + +Property Text As String +Property Alignment As Integer + +Private $hTextArea As TextArea +Private $iPadding As Integer + +Public Sub _new(iPadding As Integer, bWrap As Boolean) + + $iPadding = Max(0, iPadding - 1) + Me.Ignore = True + Me.Border = Border.Plain + Me.Background = Color.TextBackground + + $hTextArea = New TextArea(Me) As "TextArea" + $hTextArea.ScrollBar = Scroll.None + $hTextArea.Wrap = bWrap + $hTextArea.Border = False + $hTextArea.Background = Color.TextBackground + + Me.Proxy = $hTextArea + +End + + +Private Function Text_Read() As String + + Return $hTextArea.Text + +End + +Private Sub Text_Write(Value As String) + + $hTextArea.Font = Me.Parent.Font + $hTextArea.Text = Value + $hTextArea.SelectAll + +End + +Private Function Alignment_Read() As Integer + + Return $hTextArea.Alignment + +End + +Private Sub Alignment_Write(Value As Integer) + + $hTextArea.Alignment = Value + +End + +Public Sub TextArea_Change() + + ResizeTextArea + +End + +Public Sub TextArea_GotFocus() + + ResizeTextArea + +End + + +Private Sub ResizeTextArea() + + Dim Y As Integer + Dim H As Integer + + If $hTextArea.Wrap Then + Y = 1 'Max(1, (Me.H - $hTextArea.Font.TextHeight($hTextArea.Text)) \ 2) + H = Me.H - Y * 2 + Else + Y = Max(1, (Me.H - $hTextArea.Font.TextHeight($hTextArea.Text)) \ 2) + H = Me.H - Y * 2 + Endif + + $hTextArea.Move(2, Y, Me.W - 4, H) + +End + diff --git a/comp/src/gb.gui.base/.src/TreeView/TreeView.class b/comp/src/gb.gui.base/.src/TreeView/TreeView.class new file mode 100644 index 00000000..35051625 --- /dev/null +++ b/comp/src/gb.gui.base/.src/TreeView/TreeView.class @@ -0,0 +1,44 @@ +' Gambas class file + +Export +Inherits _TreeView + +Public Const _Properties As String = "*,Mode{Select.*}=Single,Sorted,Editable,Border=True,ScrollBar{Scroll.*}=Both,ShowLines,ShowCheck" +Public Const _Group As String = "View" +Public Const _DefaultEvent As String = "Click" +Public Const _DefaultSize As String = "16,16" +Public Const _Similar As String = "ListView" + +Property Layout As Variant +Property ShowLines As Boolean + +Public Sub Add((Key) As String, Text As String, Optional (Picture) As Picture, Optional Parent As String, Optional After As String) As _TreeView_Item + + Return Super._Add(Key, Text, Picture, Parent, After) + +End + + +Private Function Layout_Read() As Variant + + Return Super._GetLayout() + +End + +Private Sub Layout_Write(Value As Variant) + + Super._SetLayout(Value) + +End + +Private Function ShowLines_Read() As Boolean + + Return Super._GetShowLines() + +End + +Private Sub ShowLines_Write(Value As Boolean) + + Super._SetShowLines(Value) + +End diff --git a/comp/src/gb.gui.base/.src/TreeView/TreeViewSelection.class b/comp/src/gb.gui.base/.src/TreeView/TreeViewSelection.class new file mode 100644 index 00000000..69e6be04 --- /dev/null +++ b/comp/src/gb.gui.base/.src/TreeView/TreeViewSelection.class @@ -0,0 +1,125 @@ +' Gambas class file + +Inherits GridViewSelection + +Event _Fake + +Public Keys As New Collection + +Public Sub Copy() As GridViewSelection + + Dim hSel As TreeViewSelection = New TreeViewSelection + hSel.Keys = Keys.Copy() + Object.Attach(hSel, GetParent(), "TreeViewSelection") + Return hSel + +End + +Public Sub Save() As Variant + + Return Keys.Copy() + +End + +Public Sub Restore(vSel As Variant) + + Keys = vSel.Copy() + +End + +Private Sub GetParent() As _TreeView + + Return Object.Parent(Me) + +End + +Public Sub Select(iStart As Integer, Optional iLength As Integer = 1) + + Dim hParent As _TreeView = GetParent() + Dim I As Integer + Dim hItem As _TreeView_Item + + For I = iStart To iStart + iLength - 1 + + hItem = hParent._RowToItem(I) + If Not hItem Then Break + Keys[hItem.Key] = True + + Next + +End + +Public Sub SelectItem(sKey As String, bSelected As Boolean) + + If bSelected Then + Keys[sKey] = True + Else + Keys.Remove(sKey) + Endif + +End + +Public Sub UnSelect(iStart As Integer, Optional iLength As Integer = 1) + + Dim hParent As _TreeView = GetParent() + Dim I As Integer + Dim hItem As _TreeView_Item + + For I = iStart To iStart + iLength - 1 + + hItem = hParent._RowToItem(I) + If Not hItem Then Break + Keys.Remove(hItem.Key) + + Next + +End + +Public Sub UnSelectAll() + + Keys.Clear + 'Dump + +End + +Public Sub SelectAll((nRows) As Integer) + + Dim sKey As String + + Keys.Clear + For Each sKey In GetParent().Keys + Keys[sKey] = True + Next + +End + + +Public Sub IsItemSelected(sKey As String) As Boolean + + Return Keys.Exist(sKey) + +End + + +Public Sub IsSelected(iIndex As Integer) As Boolean + + Dim hParent As _TreeView = GetParent() + Dim hItem As _TreeView_Item + + hItem = hParent._RowToItem(iIndex) + If hItem Then Return Keys.Exist(hItem.Key) + +End + +Public Function _GetSelectedRows((iCount) As Integer) As Integer[] + +End + +Public Sub InsertRows((iStart) As Integer, (iLength) As Integer) + +End + +Public Sub RemoveRows((iStart) As Integer, (iLength) As Integer) + +End + diff --git a/comp/src/gb.gui.base/.src/TreeView/_ColumnView_Columns.class b/comp/src/gb.gui.base/.src/TreeView/_ColumnView_Columns.class new file mode 100644 index 00000000..a7fb2a06 --- /dev/null +++ b/comp/src/gb.gui.base/.src/TreeView/_ColumnView_Columns.class @@ -0,0 +1,66 @@ +' Gambas class file + +Export + +Property Count As Integer +Property Read Max As Integer +Property Sort As Integer +Property Ascending As Boolean + +Event _Refresh + +Private Sub GetView() As GridView + + Dim hTree As _TreeView = Object.Parent(Me) + Return hTree.Children[0] + +End + +Public Sub _get(Index As Integer) As _GridView_Column + + Return GetView().Columns[Index] + +End + + +Private Function Count_Read() As Integer + + Return GetView().Columns.Count + +End + +Private Sub Count_Write(Value As Integer) + + GetView().Columns.Count = Max(1, Value) + +End + +Private Function Sort_Read() As Integer + + Return GetView().Columns.Sort + +End + +Private Sub Sort_Write(Value As Integer) + + GetView().Columns.Sort = Value + +End + +Private Function Ascending_Read() As Boolean + + Return GetView().Columns.Ascending + +End + +Private Sub Ascending_Write(Value As Boolean) + + GetView().Columns.Ascending = Value + +End + +Private Function Max_Read() As Integer + + Return Count_Read() - 1 + +End diff --git a/comp/src/gb.gui.base/.src/TreeView/_TreeView.class b/comp/src/gb.gui.base/.src/TreeView/_TreeView.class new file mode 100644 index 00000000..45fdaeac --- /dev/null +++ b/comp/src/gb.gui.base/.src/TreeView/_TreeView.class @@ -0,0 +1,1824 @@ +' Gambas class file + +Export +Inherits UserControl + +Property Read Count As Integer +Property Mode As Integer +Property ScrollBar As Integer +Property Border As Boolean +Property Sorted As Boolean +Property Read Current As _TreeView_Item +Property Key As String +Property Read Keys As String[] +Property Read Item As _TreeView_Item +Property Read Available As Boolean +Property Read Renaming As Boolean +Property Editable As Boolean +Property Compare As Integer +Property Selection As String[] +Property ShowCheck As Boolean + +Property Read ClientWidth, ClientW As Integer +Property Read ClientHeight, ClientH As Integer +Property ScrollX As Integer +Property ScrollY As Integer +Property Read ScrollW, ScrollWidth As Integer +Property Read ScrollH, ScrollHeight As Integer + +Event Click +Event Activate +Event Select +Event Expand +Event Collapse +Event Rename +Event Cancel +Event Compare(Key As String, OtherKey As String) +Event BeforeSort +Event Scroll + +Static Private $iNoEvent As Integer + +Private $hView As GridView +Private $cItem As New Collection +Private $hRoot As _TreeView_Item +Private $sLastKey As String +Private $hResizeColumnTimer As Timer +Private $sCursor As String +Private $sSaveCursor As String +Private $iLastRow As Integer = -2 +Private $iCompare As Integer +Private $bEditable As Boolean +Private $hRenameBox As RenameBox +Private $sKeyRenaming As String +Private $iColRenaming As Integer +Private $bSorted As Boolean +Private $cSort As Collection +Private $bSortRoot As Boolean +Private $hSortTimer As Timer +Private $bNoRoot As Boolean +Private $iLock As Integer + +Private $hSelection As TreeViewSelection +Private $iSaveSelection As Integer +Private $vSaveSelection As Variant + +Private $iDepthW As Integer +Private $bShowLines As Boolean +Private $bShowCheck As Boolean + +Public Sub _new() + + $hView = New GridView(Me) As "GridView" + $hView.Columns.Count = 1 + $hView.Mode = Select.Single + $hView.Grid = False + $hView.AutoResize = True + $hView.Name = Me.Name & ":gridview" + $hView.Rows.H = GetDefaultItemHeight() + $hView.Padding = Desktop.Scale \ 2 + + $hSelection = New TreeViewSelection As "TreeViewSelection" + $hView.Rows._SetSelection($hSelection) + '$hView.ShowCursor = True + + Me.Proxy = $hView + + $bNoRoot = Me Is ListView + GridView_Font + + $hRoot = New _TreeView_Item("", "") As "Item" + +End + +Public Sub _get((Key) As String) As _TreeView_Item + + If Not Key Then Error.Raise("Null key") + If Not $cItem.Exist(Key) Then Error.Raise("Unknown item: " & Key) + Return $cItem[Key] + +End + +Public Sub Clear() + + Cancel() + $cItem.Clear + If $cSort Then $cSort.Clear + $bSortRoot = False + $iLastRow = -2 + $sLastKey = "" + $sCursor = "" + $hRoot = New _TreeView_Item("", "") As "Item" + $hView.Rows.Count = 0 + +End + +Private Sub ResizeColumns() + + If Not $hView.AutoResize Then Return + If Not $hResizeColumnTimer Then + $hResizeColumnTimer = New Timer As "ResizeColumns" + $hResizeColumnTimer.Trigger + Endif + +End + +Public Sub _SortParent(sKey As String) + + If sKey Then + $cSort[sKey] = True + Else + $bSortRoot = True + Endif + If Not $hSortTimer Then + $hSortTimer = New Timer As "Sort" + $hSortTimer.Trigger + Endif + +End + + +Public Sub _Add((Key) As String, Text As String, Optional (Picture) As Picture, Optional Parent As String, Optional After As String) As _TreeView_Item + + Dim hItem, hParent As _TreeView_Item + + If $hRenameBox Then Cancel() + + If Not Key Then Error.Raise("Null key") + If $cItem.Exist(Key) Then Error.Raise("Key already used: " & Key) + If Parent And If Not $cItem.Exist(Parent) Then Error.Raise("Parent item does not exist: " & Parent) + If After And If Not $cItem.Exist(After) Then Error.Raise("After item does not exist: " & After) + + hItem = New _TreeView_Item(Key, Parent) As "Item" + + $cItem[Key] = hItem + + If Parent Then + hParent = $cItem[Parent] + Else + hParent = $hRoot + Endif + + hParent._AddChild(Key) + + Inc $iLock + + hItem._Index = hParent.Count - 1 + hItem.Editable = $bEditable + hItem.Text = Text + hItem.Picture = Picture + + Dec $iLock + + If After Then + If _MoveItem(hItem, After, False) Then _UpdateItemHeight(hItem) + Else + _UpdateItemHeight(hItem, True) + Endif + + ResizeColumns + + If $bSorted Then _SortParent(Parent) + + $sCursor = Key + + _RefreshView + + Return hItem + +End + +Public Sub _GetParentItem(hItem As _TreeView_Item) As _TreeView_Item + + If hItem.ParentKey Then + Return $cItem[hItem.ParentKey] + Else If Not hItem._IsRoot() Then + Return $hRoot + Endif + +End + +Private Sub RemoveRec((Key) As String, Optional bDoNotDestroy As Boolean) + + Dim hItem As _TreeView_Item + Dim hParent As _TreeView_Item + Dim sKey As String + + hItem = $cItem[Key] + + If Not bDoNotDestroy And If hItem.Count Then + For Each sKey In hItem._GetChildren().Copy() + RemoveRec(sKey) + Next + Endif + + hParent = _GetParentItem(hItem) + + hParent._RemoveChild(hItem) + While hParent.Expanded + Dec hParent._Rows + If hParent._IsRoot() Then Break + hParent = $cItem[hParent.ParentKey] + If Not hParent Then hParent = $hRoot + Wend + + If Not bDoNotDestroy Then $cItem.Remove(Key) + +End + + +Public Sub Remove((Key) As String) + + Dim sCurrent As String + Dim iRow As Integer + Dim hItem As _TreeView_Item + + If $hRenameBox Then Cancel() + + If Not Key Then Error.Raise("Null key") + + hItem = $cItem[Key] + + If Not hItem Then Error.Raise("Unknown item: " & Key) + + _SaveSelection + + iRow = _ItemToRow(hItem) + + sCurrent = Key_Read() + + RemoveRec(Key) + + _AddCount(0) + + _UpdateCurrent(sCurrent) + + ResizeColumns + + If iRow >= 0 Then UpdateRowHeight(Null, iRow, -1) + + _RestoreSelection + _RefreshView + +End + +Public Sub _ReparentItem(hItem As _TreeView_Item, Parent As String) + + Dim hParent, hCheck As _TreeView_Item + Dim sKey As String + Dim sCurrent As String + Dim bExpanded As Boolean + + If Not Parent Then + hParent = $hRoot + Else + hParent = $cItem[Parent] + If Not hParent Then Error.Raise("Unknown parent item: " & Parent) + Endif + + If hItem.ParentKey = Parent Then Return + + sCurrent = Key_Read() + + hCheck = hParent + While hCheck + If hCheck = hItem Then Error.Raise("New parent cannot be a child item") + sKey = hCheck.ParentKey + If Not sKey Then Break + hCheck = $cItem[sKey] + Wend + + Inc $iLock + + bExpanded = hItem.Expanded + hItem.Expanded = False + sKey = hItem.Key + + RemoveRec(sKey, True) + _AddCount(0) + _GetParentItem(hItem)._ComputeGrandChildren() + + hParent._AddChild(sKey) + + hItem._Index = hParent.Count - 1 + hItem._SetParent(Parent) + hItem._ComputeRows(1) + hParent._ComputeGrandChildren() + hItem.Expanded = bExpanded + + Dec $iLock + + _UpdateItemHeight(hItem, True) + + If $bSorted Then _SortParent(Parent) + + ResizeColumns + _RefreshView + + _UpdateCurrent(sCurrent) + +End + + + +Private Sub GetNextItem(hItem As _Treeview_Item) As _TreeView_Item + + Dim hParent As _TreeView_Item + Dim aChildren As String[] + Dim iPos As Integer + + If hItem.Count And If hItem.Expanded Then + aChildren = hItem._GetChildren() + Return $cItem[aChildren[0]] + Endif + + Do + hParent = _GetParentItem(hItem) + aChildren = hParent._GetChildren() + iPos = hItem._Index 'aChildren.Find(hItem.Key) + If iPos < aChildren.Max Then Return $cItem[aChildren[iPos + 1]] + If hParent._IsRoot() Then Return + hItem = hParent + Loop + +End + +Private Sub GetPreviousItem(hItem As _Treeview_Item) As _TreeView_Item + + Dim hParent As _TreeView_Item + Dim aChildren As String[] + + If hItem._Index = 0 Then Return $cItem[hItem.ParentKey] + + hParent = _GetParentItem(hItem) + aChildren = hParent._GetChildren() + hItem = $cItem[aChildren[hItem._Index - 1]] + + Do + If Not hItem.Expanded Or If hItem.Count = 0 Then Return hItem + hItem = $cItem[hItem._GetChildren()[hItem.Count - 1]] + Loop + +End + +Public Sub _RowToItem(iRow As Integer) As _TreeView_Item + + Dim hParent As _TreeView_Item + Dim hChild As _TreeView_Item + Dim sKey As String + Dim aChildren As String[] + + If iRow < 0 Or If iRow >= $hView.Rows.Count Then Return + + 'Print iRow;; $iLastRow + + If $sLastKey Then hChild = $cItem[$sLastKey] + + If iRow = $iLastRow Then Return hChild + + If iRow = ($iLastRow + 1) Then + $iLastRow = iRow + hChild = GetNextItem(hChild) + $sLastKey = hChild.Key + Return hChild + Endif + + If iRow = ($iLastRow - 1) Then + $iLastRow = iRow + hChild = GetPreviousItem(hChild) + $sLastKey = hChild.Key + Return hChild + Endif + + hParent = $hRoot + $iLastRow = iRow + + Do + + If hParent._GrandChildren = 0 Then + + aChildren = hParent._GetChildren() + sKey = aChildren[iRow] + $sLastKey = sKey + Return $cItem[sKey] + + Else + + For Each sKey In hParent._GetChildren() + hChild = $cItem[sKey] + If iRow = 0 Then + $sLastKey = sKey + Return hChild + Endif + If iRow < hChild._Rows Then + Dec iRow + hParent = hChild + Break + Endif + iRow -= hChild._Rows + Next + + Endif + + Loop + +End + +Public Sub _ItemToRow(hItem As _TreeView_Item) As Integer + + Dim hParent As _TreeView_Item + Dim iRow As Integer + Dim sItemKey As String + Dim sKey As String + Dim iPos As Integer + + If Not hItem Then Debug System.Backtrace.Join(" ") + + If hItem._IsRoot() Then Return -1 + + sItemKey = hItem.Key + hParent = _GetParentItem(hItem) + + If hParent._IsRoot() Then + iRow = -1 + Else + If Not hParent.Expanded Then Return -1 + iRow = _ItemToRow(hParent) + If iRow < 0 Then Return iRow + Endif + + Inc iRow + + If hParent._GrandChildren = 0 Then + + iPos = hParent._GetChildren().Find(sItemKey) + If iPos >= 0 Then + iRow += iPos + Return iRow + Endif + + Else + + For Each sKey In hParent._GetChildren() + If sKey = sItemKey Then + 'Debug sKey; " -> "; iRow + Return iRow + Endif + hItem = $cItem[sKey] + iRow += hItem._Rows + Next + + Endif + + Return -1 + +End + +Public Sub _GetItemX(hItem As _TreeView_Item) As Integer + + Dim X As Integer + + X = hItem._Depth * $iDepthW + If Not $bNoRoot Then X += $iDepthW + Return X + +End + +Private Sub GetDefaultItemHeight() As Integer + + Return Me.Font.Height + (Desktop.Scale \ 4) * 2 + 2 + +End + +Public Sub GridView_Data(Row As Integer, (Column) As Integer) + + Dim hItem As _TreeView_Item = _RowToItem(Row) + If Not hItem Then Return + + $hView.Data.Background = hItem.Background + +End + +Public Sub GridView_Draw(X As Integer, Y As Integer, W As Integer, H As Integer, Row As Integer, Column As Integer) + + Dim hItem As _TreeView_Item = _RowToItem(Row) + Dim sText As String + Dim XA As Float + Dim YA As Float + Dim WA As Float + Dim HA As Float + Dim bHasNext As Boolean + Dim hParent As _TreeView_Item + + If Not hItem Then Return + + If Column = 0 Then + + If System.RightToLeft Then + + W -= hItem._Depth * $iDepthW + $iDepthW + + If Not $bNoRoot Then + + Paint.Save + + If $bShowLines And If hItem._Depth Then + + Paint.Background = Color.SetAlpha(Color.LightForeground, 128) + + bHasNext = GetSibling(hItem.Key, 1) + + If hItem.Count Then + Paint.MoveTo(X + W + $iDepthW, Y + H / 2) + Else + Paint.MoveTo(X + W + $iDepthW / 4, Y + H / 2) + Endif + Paint.LineTo(X + W + $iDepthW + $iDepthW / 2, Y + H / 2) + Paint.RelMoveTo(0, -H) + Paint.RelLineTo(0, H) + If bHasNext Then Paint.RelLineTo(0, H) + + XA = X + W + $iDepthW + $iDepthW / 2 + hParent = hItem + While hParent.ParentKey + hParent = $cItem[hParent.ParentKey] + XA += $iDepthW + If GetSibling(hParent.Key, 1) Then + Paint.MoveTo(XA, Y - H / 2) + Paint.RelLineTo(0, H * 2) + Endif + Wend + + Paint.AntiAlias = False + Paint.LineWidth = 1 + Paint.Stroke + Paint.AntiAlias = True + + Endif + + If hItem.Count Then + + XA = X + W + $iDepthW / 4 + YA = Y + $iDepthW / 4 + WA = $iDepthW / 2 + HA = H - $iDepthW / 2 + Paint.Arrow(XA, YA, WA, HA, If(hItem.Expanded, Align.Bottom, Align.Left)) + Paint.Background = Color.SetAlpha(Style.ForegroundOf($hView), 64) + Paint.LineWidth = $iDepthW / 12 + Paint.LineCap = Paint.LineCapRound + Paint.Stroke + + Endif + + Paint.Restore + W -= $iDepthW + + Endif + + If $bShowCheck And If $hView.Mode Then + + ' If hItem.Selected Then + ' XA = X + W + $iDepthW / 4 + ' YA = Y + $iDepthW / 4 + ' WA = $iDepthW / 2 + ' HA = H - $iDepthW / 2 + ' Paint.Background = Color.SetAlpha(Style.ForegroundOf($hView), 64) + ' Paint.LineWidth = $iDepthW / 12 + ' Paint.LineCap = Paint.LineCapSquare + ' Paint.Check(XA, YA, WA, HA) + ' Paint.Stroke + ' Endif + ' Paint.DrawRect(X + W, Y, H, H, Color.SetAlpha(Style.ForegroundOf($hView), 64), $iDepthW / 18) + + If $hView.Mode = Select.Single Then + Style.PaintOption(X + W, Y, H, H, hItem.Selected) + Else + Style.PaintCheck(X + W, Y, H, H, hItem.Selected) + Endif + + W -= $iDepthW + Desktop.Scale \ 2 + + Endif + + If hItem.Picture Then + 'W -= hItem.Picture.W + Paint.DrawPicture(hItem.Picture, X + W, Y + (H - hItem.Picture.H) / 2) + W -= Desktop.Scale \ 2 + Endif + + Else + + X += hItem._Depth * $iDepthW + + If Not $bNoRoot Then + + Paint.Save + + If $bShowLines And If hItem._Depth Then + + Paint.Background = Color.SetAlpha(Color.LightForeground, 128) + + bHasNext = GetSibling(hItem.Key, 1) + + If hItem.Count Then + Paint.MoveTo(X, Y + H / 2) + Else + Paint.MoveTo(X + $iDepthW - $iDepthW / 4, Y + H / 2) + Endif + Paint.LineTo(X - $iDepthW / 2, Y + H / 2) + Paint.RelMoveTo(0, -H) + Paint.RelLineTo(0, H) + If bHasNext Then Paint.RelLineTo(0, H) + + XA = X - $iDepthW / 2 + hParent = hItem + While hParent.ParentKey + hParent = $cItem[hParent.ParentKey] + XA -= $iDepthW + If GetSibling(hParent.Key, 1) Then + Paint.MoveTo(XA, Y - H / 2) + Paint.RelLineTo(0, H * 2) + Endif + Wend + + Paint.AntiAlias = False + Paint.LineWidth = 1 + Paint.Stroke + Paint.AntiAlias = True + + Endif + + If hItem.Count Then + + Paint.Background = Color.LightForeground + XA = X + $iDepthW / 4 + YA = Y + $iDepthW / 4 + WA = $iDepthW / 2 + HA = H - $iDepthW / 2 + Paint.Arrow(XA, YA, WA, HA, If(hItem.Expanded, Align.Bottom, Align.Right)) + Paint.Background = Color.SetAlpha(Style.ForegroundOf($hView), 64) + Paint.LineWidth = $iDepthW / 12 + Paint.LineCap = Paint.LineCapRound + Paint.Stroke + + Endif + + Paint.Restore + + X += $iDepthW + + Endif + + If $bShowCheck And If $hView.Mode Then + + ' If hItem.Selected Then + ' XA = X + $iDepthW / 4 + ' YA = Y + $iDepthW / 4 + ' WA = H - $iDepthW / 2 + ' HA = H - $iDepthW / 2 + ' Paint.Background = Color.SetAlpha(Style.ForegroundOf($hView), 64) + ' Paint.LineWidth = $iDepthW / 12 + ' Paint.LineCap = Paint.LineCapSquare + ' Paint.Check(XA, YA, WA, HA) + ' Paint.Stroke + ' Endif + ' Paint.DrawRect(X, Y, H, H, Color.SetAlpha(Style.ForegroundOf($hView), 64), $iDepthW / 18) + + 'Paint.FillRect(X, Y, H, H, Color.Yellow) + If $hView.Mode = Select.Single Then + Style.PaintOption(X, Y, H, H, hItem.Selected) + Else + Style.PaintCheck(X, Y, H, H, hItem.Selected) + Endif + + X += $iDepthW + Desktop.Scale \ 2 + + Endif + + If hItem.Picture Then + Paint.DrawPicture(hItem.Picture, X, Y + (H - hItem.Picture.H) / 2) + X += hItem.Picture.W + Desktop.Scale \ 2 + Endif + + Endif + + If hItem.Foreground <> Color.Default Then + Paint.Background = hItem.Foreground + Else + Paint.Background = Style.ForegroundOf(Me) + Endif + If hItem.Font Then Paint.Font = hItem.Font + + 'Draw.Text(hItem.Text & " (" & hItem._Index & ") [" & hItem._Rows & "] {" & hItem._GrandChildren & "}", X, Y, W, H, $hView.Columns[Column].Alignment) + sText = hItem.RichText + If sText Then + Paint.DrawRichText(sText, X, Y, W, H, Align.Normal) + Else + Paint.DrawText(hItem.Text, X, Y, W, H, Align.Normal) + Endif + + Else + + If hItem.Foreground <> Color.Default Then Paint.Background = hItem.Foreground + Paint.DrawText(hItem[Column], X, Y, W, H, $hView.Columns[Column].Alignment) + + Endif + + Stop Event + +End + +Public Sub _AddCount(iCount As Integer) + + $hRoot._Rows += iCount + $hView.Rows.Count = $hRoot._Rows + $iLastRow = -2 + $sLastKey = "" + +End + +Public Sub GridView_Activate() + + Dim hItem As _TreeView_Item = _RowToItem($hView.Row) + Dim bCancel As Boolean + Dim sCursor As String + + If Not hItem Then Return ' The item may have been destroyed during the click event + + sCursor = $sCursor + SetCursor(hItem.Key) + bCancel = Raise Activate + $sCursor = sCursor + + If bCancel Then Return + hItem.Expanded = Not hItem.Expanded + +End + +Public Sub GridView_MouseDown() + + Dim iRow As Integer = $hView.RowAt(Mouse.Y) + Dim hItem As _TreeView_Item = _RowToItem(iRow) + Dim X As Integer + + If Not hItem Then Return + If Mouse.Click > 1 Then Return + + If Mouse.Right And If Not $bShowCheck Then + _SetItemSelected(hItem, True) '.Rows[iRow].Selected = True + Endif + + If System.RightToLeft Then + With $hView.Columns[0] + X = .X + .W - hItem._Depth * $iDepthW - $iDepthW + End With + X -= $hView.Padding + Else + X = hItem._Depth * $iDepthW + X += $hView.Padding + Endif + + X -= $hView.ScrollX + + If Mouse.X < X + $iDepthW Then + If hItem.Count And If Not $bNoRoot And If Mouse.X >= X Then + hItem.Expanded = Not hItem.Expanded + Else + $hView.Row = iRow + Endif + Stop Event + Return + Endif + +End + +Public Sub GridView_KeyPress() + + Dim hItem As _TreeView_Item + + If Key.Code = Key.F2 Then + hItem = Current_Read() + If hItem Then hItem.Rename + Else If Key.Text = "+" Then + hItem = Current_Read() + If hItem Then hItem.Expanded = True + Else If Key.Text = "-" Then + hItem = Current_Read() + If hItem Then hItem.Expanded = False + Else If Key.Code = Key.Space Or If Key.Code = Key.Return Or If Key.Code = Key.Enter Then + hItem = Current_Read() + If hItem Then hItem.Expanded = Not hItem.Expanded + Endif + +End + +Private Function Count_Read() As Integer + + Return $cItem.Count + +End + +Private Function Mode_Read() As Integer + + Return $hView.Mode + +End + +Private Sub Mode_Write(Value As Integer) + + $hView.Mode = Value + +End + +Private Function ScrollBar_Read() As Integer + + Return $hView.Scrollbar + +End + +Private Sub ScrollBar_Write(Value As Integer) + + $hView.Scrollbar = Value + If Not Me Is ColumnView Then + If $hView.ScrollBar And Scroll.Horizontal Then + $hView.AutoResize = False + Else + $hView.AutoResize = True + Endif + Endif + +End + +Private Function Border_Read() As Boolean + + Return $hView.Border + +End + +Private Sub Border_Write(Value As Boolean) + + $hView.Border = Value + +End + +Private Function Sorted_Read() As Boolean + + Return $bSorted + +End + +Public Sub _RaiseCompare(sKey As String, sOtherKey As String) As Integer + + Dim bCancel As Boolean + + bCancel = Raise Compare(sKey, sOtherKey) + Return bCancel + +End + + +Private Sub SortItem(hItem As _TreeView_Item) + + Dim aChildren As String[] + Dim aItem As _TreeView_Item[] + Dim I As Integer + Dim hTree As _TreeView + + If hItem.Count = 0 Then Return + + aChildren = hItem._GetChildren() + aItem = New _TreeView_Item[aChildren.Count] + For I = 0 To aItem.Max + aItem[I] = $cItem[aChildren[I]] + Next + + hTree = _TreeView_Item._Tree + 'System._Breakpoint + If Object.CanRaise(Me, "Compare") Then + _TreeView_Item._Tree = Me + Else + _TreeView_Item._Tree = Null + Endif + + aItem.Sort(If($hView.Columns.Ascending, gb.Ascent, gb.Descent)) + + _TreeView_Item._Tree = hTree + + For I = 0 To aItem.Max + aChildren[I] = aItem[I].Key + aItem[I]._Index = I + Next + + _RefreshView + + For I = 0 To aItem.Max + _UpdateItemHeight(aItem[I]) + Next + +End + +Private Sub SortItemRec(hParent As _TreeView_Item) + + Dim sKey As String + Dim hItem As _TreeView_Item + + If hParent.Count = 0 Then Return + SortItem(hParent) + For Each sKey In hParent._GetChildren() + hItem = $cItem[sKey] + If hItem.Count Then SortItemRec(hItem) + Next + +End + + + +Private Sub Sorted_Write(Value As Boolean) + + $hView.Sorted = Value + $bSorted = Value + If $bSorted Then + $cSort = New Collection + GridView_Sort + Else + $cSort = Null + Endif + $bSortRoot = False + +End + +Public Sub ResizeColumns_Timer() + + $hResizeColumnTimer = Null + + If $cItem.Count = 0 Then Return + If Not $hView.AutoResize Then Return + + If $hView.Columns.Count = 1 Then + If ($hView.ScrollBar And Scroll.Horizontal) = 0 Then Return + Endif + + GridView_ColumnSize(0) + +End + +Private Function Current_Read() As _TreeView_Item + + Return _RowToItem($hView.Row) + +End + +Private Function Key_Read() As String + + Dim hItem As _TreeView_Item = Current_Read() + If hItem Then Return hItem.Key + +End + +Private Sub Key_Write(Value As String) + + Dim iRow As Integer + + If Not Value Or If Not $cItem.Exist(Value) Then + $hView.Row = -1 + Return + Endif + + Try iRow = _ItemToRow($cItem[Value]) + If Error Then + Debug Error.Where; ": "; Error.Text + Return + Endif + Try $hView.Row = iRow + If Error Then $hView.Row = -1 + +End + +Public Sub _UpdateCurrent(sKey As String) + + If Not $cItem.Exist(sKey) Then Return + Inc $iNoEvent + Key_Write(sKey) + Dec $iNoEvent + +End + + +Public Sub GridView_Select() + + Dim sCursor As String + + If $iNoEvent Then Return + If $hView.Row < 0 And If $hView.Mode <> Select.Multiple Then Return + + sCursor = $sCursor + SetCursor(Key_Read()) '_RowToItem($hView.Row).Key) + Raise Select + $sCursor = sCursor + +End + +' Public Sub ResizeRows_Timer() +' +' Dim iRow As Integer +' Dim hItem As _TreeView_Item +' Dim PH As Integer +' +' $hResizeRowsTimer = Null +' +' For Each hItem In $cResizeRows +' iRow = $cResizeRows.Key +' PH = _GetItemHeight(hItem) +' If PH <> $hView.Rows[iRow].H Then +' $hView.Rows[iRow].H = PH +' Endif +' Next +' +' $cResizeRows.Clear +' +' End + +Public Sub Exist((Key) As String) As Boolean + + Return $cItem.Exist(Key) + +End + +Public Sub GridView_Click() + + Dim sSave As String = $sCursor + MoveCurrent() + Raise Click + $sCursor = sSave + +End + +Private Function Item_Read() As _TreeView_Item + + Return $cItem[$sCursor] + +End + +Public Sub _RaiseExpand(sKey As String, bExpand As Boolean) + + Dim sCursor As String = $sCursor + + $sCursor = sKey + + If bExpand Then + Raise Expand + Else + Raise Collapse + Endif + + $sCursor = sCursor + + ResizeColumns + +End + +Public Sub _EnsureVisible(hItem As _TreeView_Item, Optional bChild As Boolean) + + Dim iRow As Integer + + SetItemVisible(hItem) + iRow = _ItemToRow(hItem) + + If bChild And If hItem._Rows > 1 Then + iRow = Min(iRow + $hView.RowAt($hView.ClientH) - $hView.RowAt($hView.Columns.Height) - 2, iRow + hItem._Rows - 1) + Endif + + If iRow >= 0 Then $hView[iRow, 0].EnsureVisible + +End + +Private Sub SetCursor(sKey As String) As Boolean + + If Not sKey Then $sSaveCursor = $sCursor + $sCursor = sKey + Return Not sKey + +End + + +Public Sub MoveFirst() As Boolean + + Dim sKey As String + + Try sKey = $hRoot._GetChildren()[0] + Return SetCursor(sKey) + +End + +Public Sub MoveLast() As Boolean + + Dim aChildren As String[] + Dim sKey As String + + aChildren = $hRoot._GetChildren() + Try sKey = aChildren[aChildren.Max] + Return SetCursor(sKey) + +End + +Public Sub MoveBack() As Boolean + + Dim sKey As String + + sKey = $sSaveCursor + $sSaveCursor = "" + Return SetCursor(sKey) + +End + +Public Sub MoveCurrent() As Boolean + + Return SetCursor(Key_Read()) + +End + +Public Sub MoveTo((Key) As String) As Boolean + + If Not $cItem.Exist(Key) Then Key = "" + Return SetCursor(Key) + +End + +Public Sub MoveAbove() As Boolean + + Dim sKey As String + Dim hItem As _TreeView_Item + + hItem = $cItem[$sCursor] + Try sKey = GetPreviousItem(hItem).Key + Return SetCursor(sKey) + +End + +Public Sub MoveBelow() As Boolean + + Dim sKey As String + Dim hItem As _TreeView_Item + + hItem = $cItem[$sCursor] + Try sKey = GetNextItem(hItem).Key + Return SetCursor(sKey) + +End + +Public Sub MoveChild() As Boolean + + Dim sKey As String + + Try sKey = $cItem[$sCursor]._GetChildren()[0] + Return SetCursor(sKey) + +End + +Private Sub GetSibling(sKey As String, Optional iAdd As Integer) As String + + Dim hItem, hParent As _TreeView_Item + Dim aChildren As String[] + + If Not sKey Then Return + + hItem = $cItem[sKey] + hParent = _GetParentItem(hItem) + + aChildren = hParent._GetChildren() + 'Try Return aChildren[aChildren.Find(hItem.Key) + iAdd] + Try Return aChildren[hItem._Index + iAdd] + +End + +Public Sub MoveNext() As Boolean + + Return SetCursor(GetSibling($sCursor, 1)) + +End + +Public Sub MovePrevious() As Boolean + + Return SetCursor(GetSibling($sCursor, -1)) + +End + +Public Sub MoveParent() As Boolean + + Dim sKey As String + + Try sKey = $cItem[$sCursor].ParentKey + Return SetCursor(sKey) + +End + + +Private Function ClientWidth_Read() As Integer + + Return $hView.ClientW + +End + +Private Function ClientHeight_Read() As Integer + + Return $hView.ClientH + +End + +Private Function Available_Read() As Boolean + + Return $sCursor + +End + +Public Sub SelectAll() + + $hView.SelectAll + +End + +Public Sub UnselectAll() + + $hView.UnselectAll + +End + +Public Sub FindAt((X) As Integer, Y As Integer) As Boolean + + Dim iRow As Integer = $hView.RowAt(Y) + + If iRow < 0 Then Return True + Return SetCursor(_RowToItem(iRow).Key) + +End + +Public Sub _MoveItem(hItem As _TreeView_Item, sKey As String, bBefore As Boolean) As Boolean + + Dim hParent As _TreeView_Item = _GetParentItem(hItem) + Dim aChildren As String[] + Dim iPos, iPosKey, iNewPos As Integer + Dim iStart, I As Integer + + If $bSorted Then Return + + aChildren = hParent._GetChildren() + + 'iPos = aChildren.Find(hItem.Key) + iPos = hItem._Index + If iPos < 0 Then Return + + If sKey Then + iPosKey = $cItem[sKey]._Index 'aChildren.Find(sKey) + If iPosKey < 0 Then Return + If iPos <= iPosKey Then Dec iPosKey + Endif + + If sKey Then + If Not bBefore Then + iNewPos = iPosKey + 1 + Else + iNewPos = iPosKey + Endif + Else + If bBefore Then + iNewPos = aChildren.Count + Else + iNewPos = 0 + Endif + Endif + + If iPos = iNewPos Then Return True + + aChildren.Remove(iPos) + aChildren.Add(hItem.Key, iNewPos) + + iStart = Min(iPos, iNewPos) + For I = iStart To aChildren.Max + hItem = $cItem[aChildren[I]] + hItem._Index = I + _UpdateItemHeight(hItem) + Next + + _RefreshView + +End + +Public Sub _IsItemSelected(hItem As _TreeView_Item) As Boolean + + If $hView.Mode = Select.Single Then Return $hView.Row = _ItemToRow(hItem) + Return $hSelection.IsItemSelected(hItem.Key) + + ' Dim iRow As Integer = _ItemToRow(hItem) + ' Return $hView.Rows[iRow].Selected + +End + +Public Sub _SetItemSelected(hItem As _TreeView_Item, bSelected As Boolean) + + If $hView.Mode = Select.Single Then + SetItemVisible(hItem) + 'UnselectAll + If bSelected Then + $hView.Row = _ItemToRow(hItem) + Else + $hView.Row = -1 + Endif + Return + Endif + + $hSelection.SelectItem(hItem.Key, bSelected) + +End + +Private Function Renaming_Read() As Boolean + + Return $hRenameBox + +End + +Private Function Editable_Read() As Boolean + + Return $bEditable + +End + +Private Sub Editable_Write(Value As Boolean) + + $bEditable = Value + +End + +Private Function Compare_Read() As Integer + + Return $iCompare + +End + +Private Sub Compare_Write(Value As Integer) + + $iCompare = Value + +End + +Private Sub UpdateRenameBox() As Boolean + + Dim hItem As _TreeView_Item + Dim X As Integer + Dim W As Integer + + If Not $hRenameBox Then Return + + hItem = $cItem[$sKeyRenaming] + + '' TODO: System.RightToLeft + + If $iColRenaming = 0 Then + X = hItem.X - $hView.ScrollX + If hItem.Picture Then X += hItem.Picture.W + Desktop.Scale \ 2 + W = Min($hView.ClientW, $hView.Columns[0].Width) - X + Else + X = $hView.Columns[$iColRenaming].X - $hView.ScrollX + W = Min($hView.ClientW - X, $hView.Columns[$iColRenaming].Width) + Endif + + If W < 32 Then + Cancel + Return + Endif + + $hRenameBox.Move(X, hItem.Y, W, hItem.H) + +End + +Public Sub _Rename(hItem As _TreeView_Item, iCol As Integer) + + Dim X As Integer + Dim SX As Integer + + If iCol < 0 Or If iCol >= $hView.Columns.Count Then Error.Raise("Out of bounds") + + _EnsureVisible(hItem) + Wait + Key_Write(hItem.Key) + + Do + X = hItem.X + If iCol Then X += $hView.Columns[iCol].X + SX = Max(0, X - $hView.ClientW - 32) + If SX = $hView.ScrollX Then Break + $hView.ScrollX = SX + Loop + + $hRenameBox = New RenameBox(Me, $hView.Padding, False) As "Editor" + $hRenameBox.Text = hItem[iCol] + $hRenameBox.SetFocus + + $sKeyRenaming = hItem.Key + $iColRenaming = iCol + + UpdateRenameBox + +End + +Private Sub Cancel(Optional bOK As Boolean) + + Dim sCursor As String + Dim bStop As Boolean + Dim hItem As _TreeView_Item + + If Not $hRenameBox Then Return + + $hRenameBox.Delete + $hRenameBox = Null + $hView.SetFocus + + sCursor = $sCursor + $sCursor = $sKeyRenaming + If bOK Then + bStop = Raise Rename + Else + Raise Cancel + Endif + $sCursor = sCursor + + hItem = $cItem[$sKeyRenaming] + $sKeyRenaming = "" + If bStop Then _Rename(hItem, $iColRenaming) + +End + + +Public Sub Editor_LostFocus() + + Cancel + +End + +Public Sub Editor_KeyPress() + + If Key.Code = Key.Escape Then + Cancel + Stop Event + Else If Key.Code = Key.Return Or If Key.Code = Key.Enter Then + Try $cItem[$sKeyRenaming][$iColRenaming] = $hRenameBox.Text + If Not Error Then Cancel(True) + Stop Event + Endif + +End + +Public Sub _RefreshView() + + $iLastRow = -2 + $sLastKey = "" + $hView.Refresh + +End + +Public Sub Sort_Timer() + + $hSortTimer = Null + If Not $cSort Then Return + + Raise BeforeSort + + _SaveSelection + + For Each $cSort + SortItem($cItem[$cSort.Key]) + Next + If $bSortRoot Then + SortItem($hRoot) + Endif + $bSortRoot = False + $cSort.Clear + + 'If hItem Then _SetItemSelected(hItem, True) + _RestoreSelection + +End + +Private Sub IsItemVisible(hItem As _TreeView_Item) As Boolean + + Dim hParent As _TreeView_Item + + hParent = _GetParentItem(hItem) + If hParent._IsRoot() Then Return True + If Not hParent.Expanded Then Return + Return IsItemVisible(hParent) + +End + +Private Sub SetItemVisible(hItem As _TreeView_Item) + + Do + hItem = _GetParentItem(hItem) + If hItem._IsRoot() Then Break + hItem.Expanded = True + Loop + +End + + +Public Sub GridView_Sort() + + Raise BeforeSort + + _SaveSelection + + SortItemRec($hRoot) + + _RestoreSelection + _RefreshView + +End + +Public Sub GridView_Scroll() + + Cancel + Raise Scroll + +End + +Public Sub GridView_Arrange() + + Cancel + +End + + +Private Function Selection_Read() As String[] + + Dim aSel As New String[] + Dim cSel As Collection + Dim sKey As String + + If $hView.Mode = Select.Single Then + sKey = Key_Read() + If sKey Then aSel.Add(sKey) + Else If $hView.Mode = Select.Multiple Then + cSel = $hSelection.Keys + For Each cSel + aSel.Add(cSel.Key) + Next + Endif + + Return aSel + +End + +Private Sub Selection_Write(Value As String[]) + + Dim sKey As String + Dim hItem As _TreeView_Item + + If $hView.Mode = Select.Single Then + Try sKey = Value[Value.Max] + Key_Write(sKey) + Else If $hView.Mode = Select.Multiple Then + Inc $iNoEvent + UnselectAll + For Each sKey In Value + If Not sKey Then Continue + hItem = $cItem[sKey] + If hItem Then hItem.Selected = True + Next + Dec $iNoEvent + Endif + + If $iNoEvent Then Return + Raise Select + +End + +Public Sub _SaveSelection() + + If $iSaveSelection = 0 Then + If $hView.Mode = Select.Multiple Then + $vSaveSelection = $hSelection.Save() + Else + $vSaveSelection = Key_Read() + Endif + Endif + + Inc $iSaveSelection + +End + +Public Sub _RestoreSelection() + + Dec $iSaveSelection + + If $iSaveSelection = 0 Then + + Inc $iNoEvent + Inc $iSaveSelection + + If $hView.Mode = Select.Multiple Then + $hSelection.Restore($vSaveSelection) + Else + Key_Write($vSaveSelection) + Endif + + Dec $iSaveSelection + Dec $iNoEvent + $vSaveSelection = Null + + Endif + +End + +Private Function ScrollX_Read() As Integer + + Return $hView.ScrollX + +End + +Private Sub ScrollX_Write(Value As Integer) + + $hView.ScrollX = Value + +End + +Private Function ScrollY_Read() As Integer + + Return $hView.ScrollY + +End + +Private Sub ScrollY_Write(Value As Integer) + + $hView.ScrollY = Value + +End + +Private Function ScrollW_Read() As Integer + + Return $hView.ScrollW + +End + +Private Function ScrollH_Read() As Integer + + Return $hView.ScrollH + +End + +Public Sub Scroll(X As Integer, Y As Integer) + + $hView.Scroll(X, Y) + +End + +Public Sub GridView_ColumnSize(Column As Integer) + + Dim hItem As _TreeView_Item + Dim W As Integer + + W = Me.Font.TextWidth($hView.Columns[Column].Text) + 8 + If($bSorted, $iDepthW, 0) + + If Column = 0 Then + For Each hItem In $cItem + If Not IsItemVisible(hItem) Then Continue + W = Max(W, hItem._GetWidth() + _GetItemX(hItem)) + Next + Else + For Each hItem In $cItem + If Not IsItemVisible(hItem) Then Continue + W = Max(W, Me.Font.TextWidth(hItem[Column])) + Next + Endif + + $hView.Columns[Column].W = W + 8 + UpdateRenameBox + +End + +Private Sub UpdateRowHeight(hItem As _TreeView_Item, iStart As Integer, Optional iEnd As Integer) + + If iEnd = 0 Then + iEnd = iStart + Else If iEnd < 0 Then + iEnd = $hView.Rows.Max + Endif + + If hItem Then + $hView.Rows[iStart].H = hItem._GetHeight() + Inc iStart + Endif + + While iStart <= iEnd + $hView.Rows[iStart].H = _RowToItem(iStart)._GetHeight() + Inc iStart + Wend + +End + + +Public Sub _UpdateItemHeight(hItem As _TreeView_Item, Optional bNext As Boolean) + + Dim iRow As Integer + + If $iLock Then Return + + iRow = _ItemToRow(hItem) + If iRow < 0 Then Return + + UpdateRowHeight(hItem, iRow, If(bNext, -1, 0)) + +End + + +Public Function _GetLayout() As Variant + + Dim hItem As _TreeView_Item + Dim cLayout As New Collection + + For Each hItem In $cItem + If hItem.Expanded Then cLayout[hItem.Key] = True + Next + + Return cLayout + +End + +Public Sub _SetLayout(Value As Variant) + + Dim cLayout As Collection + Dim hItem As _TreeView_Item + + Try cLayout = Value + If Error Then Error.Raise("Bad layout") + + _SaveSelection + For Each hItem In $cItem.Copy() + hItem.Expanded = cLayout.Exist(hItem.Key) + Next + _RestoreSelection + +End + +Public Sub GridView_Font() + + $iDepthW = Me.Font.Height + $hView.Rows.Height = GetDefaultItemHeight() + UpdateRowHeight(Null, 0, -1) + +End + +Private Function Keys_Read() As String[] + + Dim aKeys As New String[] + + For Each $cItem + aKeys.Add($cItem.Key) + Next + Return aKeys + +End + +Public Sub _Begin() + + Inc $iLock + +End + +Public Sub _End() + + Dec $iLock + If $iLock = 0 Then + UpdateRowHeight(Null, 0, -1) + Endif + +End + +Public Sub _SetShowLines(bShowLines As Boolean) + + If $bShowLines = bShowLines Then Return + $bShowLines = bShowLines + $hView.Refresh + +End + +Public Sub _GetShowLines() As Boolean + + Return $bShowLines + +End + +Private Function ShowCheck_Read() As Boolean + + Return $bShowCheck + +End + +Private Sub ShowCheck_Write(Value As Boolean) + + If $bShowCheck = Value Then Return + $bShowCheck = Value + $hView._DoNotDrawSelection = Value + $hView._ToggleSelection = Value + '$hView._NoMouse = Value + $hView.Refresh + +End diff --git a/comp/src/gb.gui.base/.src/TreeView/_TreeView_Item.class b/comp/src/gb.gui.base/.src/TreeView/_TreeView_Item.class new file mode 100644 index 00000000..7b1dd96f --- /dev/null +++ b/comp/src/gb.gui.base/.src/TreeView/_TreeView_Item.class @@ -0,0 +1,584 @@ +' Gambas class file + +Export + +Property Read Key As String +Property Read ParentKey As String +Property Text As String +Property RichText As String +Property Picture As Picture +Property Read Count, Children As Integer +Property Expanded As Boolean +Property Read X As Integer +Property Read Y As Integer +Property Read Width, W As Integer +Property Read Height, H As Integer +Property Editable As Boolean +Property Selected As Boolean +Property Background As Integer +Property Foreground As Integer +Property Font As Font + +Private $sKey As String +Private $sParent As String +Private $sText As String +Private $sRichText As String +Private $hPicture As Picture +Private $bExpanded As Boolean +Private $bEditable As Boolean +Private $iBg As Integer = Color.Default +Private $iFg As Integer = Color.Default +Private $hFont As Font + +Private $aChildren As String[] +Private $aText As String[] + +Static Public _Tree As _TreeView + +Public _Depth As Integer +Public _Rows As Integer +Public _Index As Integer +Public _GrandChildren As Integer + +Event _Refresh +Private $iLock As Integer + +Private Sub GetTree() As _TreeView + + Return Object.Parent(Me) + +End + +Private Sub GetView() As GridView + + Return GetTree().Children[0] + +End + +Public Sub _IsRoot() As Boolean + + Return Not $sKey + +End + +Public Sub _ComputeDepth() + + Dim hTree As _TreeView + Dim iDepth As Integer + Dim sChild As String + + If $sParent Then + iDepth = GetTree()[$sParent]._Depth + 1 + Else + iDepth = 0 + Endif + + If iDepth = _Depth Then Return + + _Depth = iDepth + + If Not $aChildren Then Return + + hTree = GetTree() + + For Each sChild In $aChildren + hTree[sChild]._ComputeDepth() + Next + +End + +Public Sub _ComputeGrandChildren() + + Dim sChild As String + Dim hTree As _TreeView + + _GrandChildren = 0 + If Not $aChildren Then Return + + hTree = GetTree() + + For Each sChild In $aChildren + If hTree[sChild].Count Then Inc _GrandChildren + Next + +End + + +Public Sub _SetParent(sParent As String) + + $sParent = sParent + _ComputeDepth() + +End + +Public Sub _new(sKey As String, sParent As String) + + $sKey = sKey + $sParent = sParent + + _ComputeDepth() + + If sKey Then + _Rows = 1 + _ComputeRows(1) + Else + $bExpanded = True + Endif + +End + +Public Sub _AddChild(sKey As String) + + If Not $aChildren Then $aChildren = New String[] + $aChildren.Add(sKey) + + If $aChildren.Count = 1 Then + Try Inc GetTree()._GetParentItem(Me)._GrandChildren + Endif + +End + +Public Sub _RemoveChild(hItem As _TreeView_Item) + + Dim hTree As _TreeView = GetTree() + Dim I As Integer + + Try $aChildren.Remove(hItem._Index) + + For I = hItem._Index To $aChildren.Max + hTree[$aChildren[I]]._Index = I + Next + + If $aChildren.Count = 0 Then + $aChildren = Null + Try Dec hTree._GetParentItem(Me)._GrandChildren + Endif + +End + +Public Sub _GetChildren() As String[] + + Return $aChildren + +End + + +Private Function Key_Read() As String + + Return $sKey + +End + +Private Function ParentKey_Read() As String + + Return $sParent + +End + +Private Function Text_Read() As String + + Return $sText + +End + +Private Sub Text_Write(Value As String) + + Dim hTree As _TreeView = GetTree() + + $sText = Value + If $iLock Then Return + + If hTree.Sorted Then hTree._SortParent($sParent) + hTree._UpdateItemHeight(Me) + hTree._RefreshView + +End + +Private Function RichText_Read() As String + + Return $sRichText + +End + +Private Sub RichText_Write(Value As String) + + Dim hTree As _TreeView = GetTree() + + $sRichText = Value + If $iLock Then Return + + If hTree.Sorted Then hTree._SortParent($sParent) + hTree._UpdateItemHeight(Me) + hTree._RefreshView + +End + +Private Function Picture_Read() As Picture + + Return $hPicture + +End + +Private Sub Picture_Write(Value As Picture) + + Dim hTree As _TreeView = GetTree() + + $hPicture = Value + If $iLock Then Return + + hTree._UpdateItemHeight(Me) + hTree._RefreshView + +End + +Private Function Count_Read() As Integer + + If $aChildren Then Return $aChildren.Count + +End + +Private Function Expanded_Read() As Boolean + + Return $bExpanded + +End + +Public Sub _ComputeRows(iAdd As Integer) + + Dim hTree As _TreeView = GetTree() + Dim sKey As String + Dim hItem As _TreeView_Item + + sKey = $sParent + While sKey + hItem = hTree[sKey] + If Not hItem.Expanded Then Return + hItem._Rows += iAdd + sKey = hItem.ParentKey + Wend + + hTree._AddCount(iAdd) + +End + + +Private Sub Expanded_Write(Value As Boolean) + + Dim hTree As _TreeView = GetTree() + Dim sKey As String + Dim iOldRows As Integer + Dim sCurrent As String + + If $bExpanded = Value Then Return + + hTree._SaveSelection + + sCurrent = hTree.Key + + $bExpanded = Value + + iOldRows = _Rows + _Rows = 1 + If Value And If $aChildren Then + For Each sKey In $aChildren + _Rows += hTree[sKey]._Rows + Next + Endif + + If _Rows = iOldRows Then Return + + _ComputeRows(_Rows - iOldRows) + + hTree._UpdateItemHeight(Me, True) + + hTree._UpdateCurrent(sCurrent) + + hTree._RestoreSelection + + If Value Then hTree._EnsureVisible(Me, True) + + hTree._RaiseExpand($sKey, $bExpanded) + +End + +Private Function X_Read() As Integer + + Dim hView As GridView = GetView() + 'Dim FW As Integer = hView._GetFrameWidth() + Return GetTree()._GetItemX(Me) - hView.ScrollX + hView.ClientX + hView.Padding '+ FW + +End + +Private Function Y_Read() As Integer + + Dim hTree As _TreeView = GetTree() + Dim hView As GridView = GetView() + 'Dim FW As Integer = hView._GetFrameWidth() + Return hView.Rows[hTree._ItemToRow(Me)].Y - hView.ScrollY + hView.Columns.Height + hView.ClientY + +End + +Public Sub _GetWidth() As Integer + + Dim W As Integer + Dim hFont As Font + + If $hPicture Then W += $hPicture.W + Desktop.Scale \ 2 + hFont = $hFont + If Not hFont Then hFont = GetTree().Font + + If $sRichText Then + Return W + hFont.RichTextWidth($sRichText) + Else + Return W + hFont.TextWidth($sText) + Endif + +End + +Public Sub _GetHeight() As Integer + + Dim PH As Integer + Dim hFont As Font + + hFont = $hFont + If Not hFont Then hFont = GetTree().Font + PH = hFont.Height + (Desktop.Scale \ 4) * 2 + 2 + If $hPicture Then PH = Max(PH, $hPicture.H + (Desktop.Scale \ 4) * 2 + 2) + Return PH + +End + +Private Function Width_Read() As Integer + + Return _GetWidth() + +End + +Private Function Height_Read() As Integer + + Dim hTree As _TreeView = GetTree() + Dim hView As GridView = GetView() + Return hView.Rows[hTree._ItemToRow(Me)].H + +End + +Public Sub Clear() + + Dim hTree As _TreeView = GetTree() + + hTree._SaveSelection + While $aChildren + hTree.Remove($aChildren[0]) + Wend + hTree._RestoreSelection + +End + +Public Sub Delete() + + Dim hTree As _TreeView = GetTree() + hTree.Remove($sKey) + +End + +Public Sub EnsureVisible() + + Dim hTree As _TreeView = GetTree() + hTree._EnsureVisible(Me) + +End + +Public Sub MoveBefore(Optional (Key) As String) + + Dim hTree As _TreeView = GetTree() + hTree._MoveItem(Me, Key, True) + +End + +Public Sub MoveAfter(Optional (Key) As String) + + Dim hTree As _TreeView = GetTree() + hTree._MoveItem(Me, Key, False) + +End + +Public Sub MoveFirst() + + MoveAfter() + +End + +Public Sub MoveLast() + + MoveBefore() + +End + + +Private Function Editable_Read() As Boolean + + Return $bEditable + +End + +Private Sub Editable_Write(Value As Boolean) + + $bEditable = Value + +End + +Private Function Selected_Read() As Boolean + + Return GetTree()._IsItemSelected(Me) + +End + +Private Sub Selected_Write(Value As Boolean) + + GetTree()._SetItemSelected(Me, Value) + +End + + +Public Sub Rename(Optional Column As Integer = 0) + + If Not $bEditable Then Return + GetTree()._Rename(Me, Column) + +End + +Public Sub _compare(hOther As _TreeView_Item) As Integer + + Dim hColumnView As ColumnView + Dim iSort As Integer + + If _Tree And If Not _Tree._RaiseCompare($sKey, hOther.Key) Then + Return _Tree.Compare + Else + Try hColumnView = GetTree() + + If hColumnView Then + iSort = hColumnView.Columns.Sort + If iSort > 0 Then + Try Return String.Comp($aText[iSort - 1], hOther[iSort], gb.Natural + gb.IgnoreCase) + If Error Then Return 0 + Endif + Endif + + Return String.Comp($sText, hOther.Text, gb.Natural + gb.IgnoreCase) + Endif + +End + +Public Sub _put(Text As String, Column As Integer) + + Dim hTree As _TreeView + Dim hView As GridView + + hTree = GetTree() + hView = GetView() + + If Column = 0 Then + $sText = Text + Else + 'If Column < 0 Or If Column >= hView.Columns.Count Then Error.Raise("Out of bounds") + ' Be backward-compatible + If Column < 0 Then Error.Raise("Out of bounds") + + If Not $aText Then + $aText = New String[Column] + Else + If Column >= $aText.Count Then $aText.Resize(Column) + Endif + + $aText[Column - 1] = Text + Endif + + If $iLock Then Return + hTree._RefreshView() + +End + +Public Sub _get(Column As Integer) As String + + Dim hView As GridView + + If Column = 0 Then Return $sText + + hView = GetTree().Children[0] + + If Column < 0 Then Error.Raise("Out of bounds") + + Try Return $aText[Column - 1] + +End + + +Public Sub Reparent(NewParent As String) + + Dim hTree As _TreeView = GetTree() + + If hTree Is ListView Then Error.Raise("Cannot reparent ListView items") + hTree._ReparentItem(Me, NewParent) + +End + +Private Function Background_Read() As Integer + + Return $iBg + +End + +Private Sub Background_Write(Value As Integer) + + $iBg = Value + +End + +Private Function Foreground_Read() As Integer + + Return $iFg + +End + +Private Sub Foreground_Write(Value As Integer) + + $iFg = Value + +End + +Private Function Font_Read() As Font + + Return $hFont + +End + +Private Sub Font_Write(Value As Font) + + If Value Then + $hFont = Value.Copy() + Else + $hFont = Null + Endif + +End + +Public Sub _Lock() + + Inc $iLock + +End + +Public Sub _Unlock() + + Dim hTree As _TreeView + + Dec $iLock + If $iLock = 0 Then + hTree = GetTree() + If hTree.Sorted Then hTree._SortParent($sParent) + hTree._UpdateItemHeight(Me) + hTree._RefreshView + Endif + +End diff --git a/comp/src/gb.gui.base/.src/_Draw_Clip.class b/comp/src/gb.gui.base/.src/_Draw_Clip.class new file mode 100644 index 00000000..67a350b4 --- /dev/null +++ b/comp/src/gb.gui.base/.src/_Draw_Clip.class @@ -0,0 +1,76 @@ +' Gambas class file + +Export +Create Static + +' GB_DESC CDrawClipDesc[] = +' { +' GB_DECLARE(".MyDraw.Clip", 0), GB_VIRTUAL_CLASS(), +' +' GB_STATIC_PROPERTY_READ("X", "i", CDRAW_clip_x), +' GB_STATIC_PROPERTY_READ("Y", "i", CDRAW_clip_y), +' GB_STATIC_PROPERTY_READ("W", "i", CDRAW_clip_w), +' GB_STATIC_PROPERTY_READ("H", "i", CDRAW_clip_h), +' GB_STATIC_PROPERTY_READ("Width", "i", CDRAW_clip_w), +' GB_STATIC_PROPERTY_READ("Height", "i", CDRAW_clip_h), +' +' GB_STATIC_PROPERTY("Enabled", "b", CDRAW_clip_enabled), +' GB_STATIC_METHOD("_call", NULL, CDRAW_clip, "(X)i(Y)i(Width)i(Height)i"), +' +' GB_END_DECLARE +' }; + +Property Read X As Integer +Property Read Y As Integer +Property Read Width, W As Integer +Property Read Height, H As Integer +Property Enabled As Boolean + +Public Sub _call(X As Integer, Y As Integer, Width As Integer, Height As Integer) + + Draw.ClipRect = Rect(X, Y, Width, Height) + +End + + +Private Function X_Read() As Integer + + Try Return Paint.ClipRect.X + +End + +Private Function Y_Read() As Integer + + Try Return Paint.ClipRect.Y + + +End + +Private Function Width_Read() As Integer + + Try Return Paint.ClipRect.W + + +End + +Private Function Height_Read() As Integer + + Try Return Paint.ClipRect.H + +End + +Private Function Enabled_Read() As Boolean + + Return Paint.ClipRect + +End + +Private Sub Enabled_Write(Value As Boolean) + + If Not Value Then + Paint.ResetClip + Else + Paint.ClipRect = Draw._GetInfo().ClipRect + Endif + +End diff --git a/comp/src/gb.gui.base/.src/_Draw_Style.class b/comp/src/gb.gui.base/.src/_Draw_Style.class new file mode 100644 index 00000000..c87f2b8a --- /dev/null +++ b/comp/src/gb.gui.base/.src/_Draw_Style.class @@ -0,0 +1,55 @@ +' Gambas class file + +Export +Create Static + +Public Sub Arrow(X As Integer, Y As Integer, Width As Integer, Height As Integer, Type As Integer, Optional Flag As Integer) + + Style.PaintArrow(X, Y, Width, Height, Type, Flag) + +End + +Public Sub Check(X As Integer, Y As Integer, Width As Integer, Height As Integer, Value As Integer, Optional Flag As Integer) + + Style.PaintCheck(X, Y, Width, Height, Value, Flag) + +End + +Public Sub Option(X As Integer, Y As Integer, Width As Integer, Height As Integer, Value As Boolean, Optional Flag As Integer) + + Style.PaintOption(X, Y, Width, Height, Value, Flag) + +End + + +Public Sub Separator(X As Integer, Y As Integer, Width As Integer, Height As Integer, Optional Vertical As Boolean, Optional Flag As Integer) + + Style.PaintSeparator(X, Y, Width, Height, Vertical, Flag) + +End + +Public Sub Button(X As Integer, Y As Integer, Width As Integer, Height As Integer, Value As Boolean, Optional Flag As Integer, Flat As Boolean) + + Style.PaintButton(X, Y, Width, Height, Value, Flag, Flat) + +End + +Public Sub Panel(X As Integer, Y As Integer, Width As Integer, Height As Integer, Border As Integer, Optional Flag As Integer) + + Style.PaintPanel(X, Y, Width, Height, Border, Flag) + +End + +Public Sub Handle(X As Integer, Y As Integer, Width As Integer, Height As Integer, Optional Vertical As Boolean, Optional Flag As Integer) + + Style.PaintHandle(X, Y, Width, Height, Vertical, Flag) + +End + +Public Sub Box(X As Integer, Y As Integer, Width As Integer, Height As Integer, Optional Flag As Integer) + + Style.PaintBox(X, Y, Width, Height, Flag) + +End + + diff --git a/comp/src/gb.gui.base/.src/_Gui.class b/comp/src/gb.gui.base/.src/_Gui.class new file mode 100644 index 00000000..7fe3fdae --- /dev/null +++ b/comp/src/gb.gui.base/.src/_Gui.class @@ -0,0 +1,368 @@ +' Gambas class file + +' Gambas class file + +Export + +'Static Private $cMenu As New Collection + +Static Private $aFrame As New Control[4] +Static Private $hFrameCtrl As Control +Static Private $hHideFrameTimer As Timer +Static Private $iFrameX As Integer +Static Private $iFrameY As Integer +Static Private $bInFrame As Boolean + +Static Public Sub FindShortcut(sText As String) As Integer + + Dim iPos As Integer + + Do + iPos = String.InStr(sText, "&", iPos + 1) + If iPos = 0 Then Break + If String.Mid$(sText, iPos + 1, 1) = "&" Then + Inc iPos + Continue + Endif + Return iPos + Loop + +End + +Static Public Sub _DefineShortcut(hParent As Menu) + + Dim hMenu As Menu + Dim sText As String + Dim cShortcut As New Collection + Dim I As Integer + Dim sCar As String + Dim iPos As Integer + 'Dim hObs As Observer + 'Dim cText As Collection + + 'Return + + For Each hMenu In hParent.Children + + sText = hMenu.Text + If Not sText Then Continue + + iPos = String.InStr(sText, "&") + If iPos Then + cShortcut[String.UCase(String.Mid$(sText, iPos + 1, 1))] = True + Continue + Endif + + For I = 1 To String.Len(sText) + + sCar = String.UCase(String.Mid$(sText, I, 1)) + + If Len(sCar) = 1 And If Not IsLetter(sCar) And If Not IsDigit(sCar) Then Continue + + If Not cShortcut.Exist(sCar) Then + + ' If Not hObs Then + ' hObs = New Observer(hParent) As "Menu" + ' cText = New Collection + ' '$cMenu[Object.Address(hParent)] = cText + ' Endif + + hMenu.Text = String.Left(sText, I - 1) & "&" & String.Mid$(sText, I) + hMenu._Text = sText + cShortcut[sCar] = True + + Break + Endif + Next + + 'If hMenu.Children.Count Then _DefineShortcut(hMenu) + + Next + +End + +Static Public Sub _Quit() + + Drag.Icon = Null + +End + +' Static Private Sub RemoveShortcut(sText As String) As String +' +' Dim iPos As Integer +' +' iPos = FindShortcut(sText) +' If iPos Then sText = String.Left(sText, iPos - 1) & String.Mid(sText, iPos + 1) +' Return sText +' +' End + +Static Public Sub _InitMenuBarShortcut(hWindow As Window) + + Dim hMenu As Menu + Dim bVisible As Boolean + Dim sText As String + + bVisible = hWindow.Menus.Visible + + For Each hMenu In hWindow.Menus + + If Not Object.IsValid(hMenu) Then Continue + If Not hMenu.Text Then Continue + + If bVisible Then + If hMenu._Text Then + hMenu.Text = hMenu._Text + Endif + Else + If Not hMenu._Text Then + sText = hMenu.Text + hMenu.Text = " " + hMenu._Text = sText + Endif + Endif + + Next + +End + +Static Private Sub StopHideFrameTimer() + + If $hHideFrameTimer Then + $hHideFrameTimer.Stop + $hHideFrameTimer = Null + Endif + +End + + +Static Public Sub _ShowDNDFrame(hCtrl As Control, X As Integer, Y As Integer, W As Integer, H As Integer) + + Dim I As Integer + + 'Debug hCtrl.Name;; X;; Y;; W;; H;; "|";; System.Backtrace.Join(" ") + + StopHideFrameTimer + + For I = 0 To 3 + If $aFrame[I] = hCtrl Then Return + Next + + If W < 0 Then W = hCtrl.W + If H < 0 Then H = hCtrl.H + + If hCtrl <> $hFrameCtrl Then + + HideDNDFrame() + + For I = 0 To 0 + $aFrame[I] = New DrawingArea(hCtrl.Window) As "DNDFrame" + With $aFrame[I] + .Background = Color.SetAlpha(Color.SelectedBackground, 192) + .Ignore = True + .Drop = True + .Name = "#DndFrame" & CStr(I) + .Design = True + '.Enabled = False + End With + Next + + Endif + + If W <= 0 Or If H <= 0 Then + For I = 0 To 0 + $aFrame[I].Hide + Next + Return + Endif + + $iFrameX = X + $iFrameY = Y + + X += hCtrl.ScreenX - hCtrl.Window.ScreenX - hCtrl.Window.ClientX + Y += hCtrl.ScreenY - hCtrl.Window.ScreenY - hCtrl.Window.ClientY + + 'X -= 2 + 'Y -= 2 + 'W += 4 + 'H += 4 + + With $aFrame[0] + If Not .Visible Or If .X <> X Or If .Y <> Y Or If .W <> W Or If .H <> H Then + 'Debug hCtrl.Name;; X;; Y;; W;; H + .Move(X, Y, W, H) + .Raise + .Show + Endif + End With + + $hFrameCtrl = hCtrl + +End + +Static Private Sub HideDNDFrame() + + Dim I As Integer + + For I = 0 To 3 + Try $aFrame[I].Delete + $aFrame[I] = Null + Next + $hFrameCtrl = Null + $bInFrame = False + +End + +Static Public Sub _HideDNDFrame(Optional hCtrl As Control) + + Dim I As Integer + + If Not $hFrameCtrl Then Return + + ' If hCtrl Then + ' Try Debug hCtrl.Name;; $hFrameCtrl.Name;; $hFrameCtrl.Hovered;; "|";; System.Backtrace.Join(" ") + ' Else + ' Try Debug "NULL";; $hFrameCtrl.Name;; $hFrameCtrl.Hovered;; "|";; System.Backtrace.Join(" ") + ' Endif + + If $bInFrame Then Return + 'If hCtrl = $hFrameCtrl Then Return + + If hCtrl Then + For I = 0 To 3 + If $aFrame[I] = hCtrl Then + hCtrl = $hFrameCtrl + Break + Endif + Next + If hCtrl <> $hFrameCtrl Then Return + Endif + + If Not $hHideFrameTimer Then $hHideFrameTimer = New Timer(50) As "HideFrameTimer" + 'Debug Timer + $hHideFrameTimer.Restart + +End + +Static Public Sub HideFrameTimer_Timer() + + 'Debug Timer + HideDNDFrame + $hHideFrameTimer.Stop + $hHideFrameTimer = Null + +End + +Static Public Sub DndFrame_Drag() + + Dim X As Integer + Dim Y As Integer + + $bInFrame = True + StopHideFrameTimer + + X = Drag.X + Y = Drag.Y + + Drag.X += $iFrameX + Drag.Y += $iFrameY + + Object.Raise($hFrameCtrl, "Drag") + + Drag.X = X + Drag.Y = Y + +End + +Static Private Sub FindChild(hCont As Container, X As Integer, Y As Integer) As Control + + Dim hChild As Control + + For Each hChild In hCont.Children + If hChild = $aFrame[0] Then Continue + If hChild.X > X Or If hChild.Y > Y Or If (hChild.X + hChild.W) <= X Or If (hChild.Y + hChild.H) <= Y Then Continue + Return hChild + Next + +End + +Static Public Sub DndFrame_DragMove() + + Dim hCont As Container + Dim hCtrl As Control + Dim X As Integer + Dim Y As Integer + + 'Debug + + $bInFrame = True + StopHideFrameTimer + + Drag.X += $iFrameX + Drag.Y += $iFrameY + + hCtrl = $hFrameCtrl + + While hCtrl Is Container + hCont = hCtrl + '$aFrame[0].Hide + 'hCtrl = hCont.FindChild(Drag.X - hCont.ClientX, Drag.Y - hCont.ClientY) + '$aFrame[0].Show + hCtrl = FindChild(hCont, Drag.X - hCont.ClientX, Drag.Y - hCont.ClientY) + + If Not hCtrl Then + hCtrl = hCont + Break + Endif + + Drag.X -= hCtrl.X + hCont.ClientX + Drag.Y -= hCtrl.Y + hCont.ClientY + If hCtrl.Drop Then + Object.Raise(hCtrl, "Drag") + Else + If hCtrl Is Container Then Continue + Drag.X += hCtrl.X + hCont.ClientX + Drag.Y += hCtrl.Y + hCont.ClientY + hCtrl = hCont + Endif + + Break + + Wend + + Object.Raise(hCtrl, "DragMove") + + Drag.X = X + Drag.Y = Y + +End + +Static Public Sub DndFrame_Drop() + + 'Debug + Drag.X += $iFrameX + Drag.Y += $iFrameY + Drag._Target = $hFrameCtrl + Object.Raise($hFrameCtrl, "Drop") + Drag.X -= $iFrameX + Drag.Y -= $iFrameY + +End + +Static Public Sub DndFrame_DragLeave() + + Dim hCtrl As Control + + $bInFrame = False + _HideDNDFrame + + hCtrl = $hFrameCtrl + While hCtrl + If Not Mouse.Inside(hCtrl) Then + Object.Raise($hFrameCtrl, "DragLeave") + Break + Endif + hCtrl = hCtrl.Parent + Wend + +End diff --git a/comp/src/gb.gui.base/message/copy.png b/comp/src/gb.gui.base/message/copy.png new file mode 100644 index 0000000000000000000000000000000000000000..9e5a54ed582b117f0419bcd0aa858295aa864f35 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@&H|6fVj%Ab2s2LA=92~q2Ka=y zx)=E5FMsg=|Nr0o6E*+^8B2ovf*Bm1-ADs+EIeHtLnJOICmdi{vrwVoPy{QBH>cr& zRm>A40~I`-dX_F+n88zYrRC6)1RgfF6(VtLS5|uPm@qJuU5cvQx38!RXa<9)tDnm{ Hr-UW|%VaT2 literal 0 HcmV?d00001 diff --git a/comp/src/gb.gui.base/message/delete.png b/comp/src/gb.gui.base/message/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..fdd94defe9b523acbf2483e938a2e4d24c05bd77 GIT binary patch literal 1876 zcmX|B3pms3AOE3?O+`4T5Q~L`LeCMIDbeOEw`r2woRgd|yP)Z@naVA>h2v8GHBWU8 zol>YQDf^2Ku`HK#Mw_ur#F?|@GPj-IwtxTUdEf8*eLwH#^Z9J^63LFkZ6zS>Uc8o|AlF5VV z=|UnA6oR>$qqGHcm6d=(;ZrCeq8=g&Ma|)Z640DN8HH@l#Sj`8a_v269wFHB<0S0-h?Xs3Mq1%ep+k*I^`M z{epl4=5LqV7dy6UaIWu{oY3yup|exIt`(`db}(^M;5BT;sBCxrio1PMkjRAc7XszG zUC%17bf^;YqNOH)X!t(Cpq%%q#34T$okD-Yo+aF9?Yc^PJV)xRg;^I=<@`X#rBN4@M13%o*| zo%&aN^L0$C{C0m8(6nzR_tPY~3|dqPJ+L{<=S#GeXzg5Z>b5Dr;fR--d&79$!OjNv z7ti)*e7V#tUn?(PlQ;i&IqI5QV%Jl% z%xAiXv#{^rbtwBSvArSjna23qpF@Lj)%46RJ}}Vq8Ono)L!IC{krr)Cc3|h0I^xs| zcXrLC(;@Bd7`g@5&YoF6wsMCveA`#NDu5o3V%hr2XY;%IV_*vV<1sy(Ft1)$<-dCv zIVko>mNZb@+yZ%2L@AoHi-q%xW|{EUU~$N!9kYs*<1D&Ot9Li+hv{bpmjrgTlWgb8 znNv@vF`MGwOEliBz^=aLhy8iR95+HOkl_2geOudGD4hWXw_Q`+=WK_VF&>R+k6)y1 zY)tcPm3!L4oTN0dA0~ec!(q9aqZfv<%#o}8q5YWuT}FA#i5qir3Y

        dOsKbOp_6WG^vm4Ci42NvDZEGFdzD#*4xy-7T-r zEdh?}2U70x=jI;`J6j+-do0c9uW#;Rq ztyVmPPvuI^{aUE&Fz)_xewEee-IWuIY}dCPLADye%wgZZq;bh+cx)ye{SR;DnXp8R zXtI$5CbuZPyC;h+CytfNLiG?su0;?mau=CMyNo(=uwqE0W0Zbmu2O^;M$7dkOHJF( z+>*IiO&l|rJZ*?ra4j;zB2P$PL)$WnHXGcf?-ZvPS8a9>!p#7WjaKvy!)m-I964^; z!N`uGcl>fC{K^*jl`L(RVU=_{#xd@olNjy{=THf~C_*RwNPp$+PjF3r$u-X9BFGy= z2G#^=wRaxcQ@2!E{}JxkAiAS(@L`ZsScG}|u_OqC-0ynchnpaO_BA}Bx_;t}j-h9+ z)!@gOTyYMvE}C2fztvq&14nG0pmA8|<)KgI=&KSyY=6%EZ7HS`l95pN;46w6gl z@@iZls5f4AtiD&RKbB?2X`73hVM&Cu2uppZ*xcptyWwNeOeY08JNIt5+0RYIQ{I7` zCKq?ly)m+KSwggKs>rvry}i`;A3?@UcFun!XneqhGVHsZ17c?HD<@M$%k}ORSY9Z1 zNXz)Ngy!H3{Ye(2^OJ0<)giuznFdf}tcePOEzu({pqw+YrnN!JSeo3itG7J!yNn9Q z;bW;idunKJEKv;Z?=((Z|IH%);1Yg5gKx8i5y#rI<0gYQ@%~uK^4LxN$ob_6f6mN? zi3PirAp&(`d%*N+ezbgz1oPo~RCl@N7eqo%o4dbmJT7lFuBjs`0Qa1P_ O27J8zydHW+UH%t1FTKkE literal 0 HcmV?d00001 diff --git a/comp/src/gb.gui.base/message/error.png b/comp/src/gb.gui.base/message/error.png new file mode 100644 index 0000000000000000000000000000000000000000..6c3b296b34fb74f98fdd5c52c846c58c70c62cf1 GIT binary patch literal 1212 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H3?#oinD`S&v7|ftIx;Y9?C1WI$O_~$76-XI zF|0c$^AgD6EbxddW?X?_wfUrhf}aC?LR@_^3-9OW-^LxJKC^YVb?gS@<}4Gj+p3P9|F0-#0^BR~IcQPG2(9H7Wuph!Z(y+V+& z5JP~B`(X7T2E-7EMj$&c53UAi6p#%u5N<5Q5TLOjE5LREMS!yRfEvL@K@A6TfoA6B z-Ud1ttQh0~AOmhM%;f+7|2sFA9S3^fza+>nnBk&0_nBYs84sV;mtg*D{5_B@=zh^} z_hL20ZXXWY50kGg54bx0=95W1Z63kX%4;4UDco{n)`_m_%{IqZsQ1opf2UC9>BheD zwC_ysie>j&^VQitFfcHE_jGX#skrrac4qJ+2Z1)n$rBcM@U%B6wBI>Vds<6w^}D;j z|JR@O+PQUWsAqzj@#Vc+r#?4!wV#@7bosNNiVz62T;4HPuXkR;%B0ejR)W7bB(WF$?rRtpuYLu&RwtE{~8$typvzKLQZ>~@qvyw&0{Ik-@7$- zXM`_vdUKK~Z%dy^tFSOr;ye${`ij{N4JuLXkG^i!6j1mYxS?htThkRTrLV<%!IfGAG;o zuP;9K@n5shjN{F77P=icVc7RyOv9-n_mZw|utvC|PWVX)Xs_KMqKcD(L*8D4bBBb$<%OsX5Ii_)` z_klyA8)BGBV;VcX7c^=c6mZ5o;*!v7*;)`%ItOC;Ty0k?%Osp7g0-@aOXx zHBL@;s><`HO!7bdQe5qcxACW=nm<3y+2`nZZ;@ht(8cX9Pe@OFvNq~hnrY?kc{PWd z>Q1-ST<)s7-B_2tNoi?EvB?ayqnovE1tz-kyPu| z7XIIT!xZzv6{Xg4Cpy2@E#x)Z z&&4wP{yy&OhwjgR-XW3n@Z0-E55K+TSt@FCZ~k*YQVw7{!)&4rA^KkWv zqZ8}SrG;LcdHw$VuuZ4;f9Dqq_xao3I;q+3{haT4-@fdZ6P5e=>#qNn=gZRLEi=#M zK5f7IPv-mTzFFScMg}E!C4APT7KgZ6zY`Y{`n3Ne_npoQrz+&S#DTes!PC{xWt~$( F69AjbPfY*- literal 0 HcmV?d00001 diff --git a/comp/src/gb.gui.base/message/info.png b/comp/src/gb.gui.base/message/info.png new file mode 100644 index 0000000000000000000000000000000000000000..2493366a56b92e10a1c495b737a0e3af71b82629 GIT binary patch literal 308 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?I3?vN&YJLDImUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs1s;*b3=DinK$vl=HlH+5P%gkH#MLLWFn{^||NsA&ta|Y0@4usWJ{`UN zscZYwSD${}dG&pd`Ik(PStUV!!3+-1ZlnP@lRRA1?<^IU_?1RLz5WNvc)D3%9J;%NebZ;g zSz)|S9_EHHuV$DkHG@^->H$56wQN<4UH=(A3!RyrVdwT)VW#`dnwf8|&osYiE3k;+ n50fDi&=eRra9gTe~DWM4f_=<2S literal 0 HcmV?d00001 diff --git a/comp/src/gb.gui.base/message/question.png b/comp/src/gb.gui.base/message/question.png new file mode 100644 index 0000000000000000000000000000000000000000..26086b58fbd5f4963efc7598daa2f77d318f6684 GIT binary patch literal 2316 zcmX|?3pmqn8^?chh*6^YCz6)lj!2QHe}}R4X(|B#um)xeg-d7R z%21S*{ufwjeCZ_TV}9Bk0N$o53q9neIS324u>eS|TI13L9Bg|53jiwgl>xe^tFjpY zWWvwbA*}2!hoEREru5b#tVL3hZdGpoPya&7{{+81rBEvSQ<8RBi76|#e~GjzHK+Y0e;P?O ze>~l3?g3>1sLv~#S%I{_eWlfvBS=l83#lk6Un%{z{kxgpTq2P?`u=EwHz9>WvG5Y@ zl4q5tKqTmx>>xH1^Lq1&nZ-j3Llr|6BMT$wYIN;bZDv;{U&s&o5|q=E<5lG)5{qyR zxZauG{JwnO8s8=1621Z7In`OlF2mMgQ`%F;7RUT*{CGlMYDa2hW90Mx=Y@>I@cQs? zli%vb>vDT?yQjLvV)56BuXD?DmBW=czut^#ju~DUZu-^46>wQ|Ecz(jyV{#C;!{Q_ z$?eJHVe%+&+5*~=*(cvvj*k{Vwz(5X8H>H3NUm`{dm0}-S1ZWt-GCf ztAAGC?zl~8Cd}|>7_*ELW=TXtL_lo-V}>!lIR1Lzb$VxdRAbcVktMbqgUr;6|cSr*U>#WcFeLq0ZKb6_+t`#&)egl($ZmXOyb&ksJuWix z@Mtc!m2Y+gUk~eP?nETq<4sNS{DZi>fHu1@r?4<6bd$$*wRpv!&`7q?t9~na4KP?k z-fHS)Gu~l1HwUUcboxc&H#^nyY3y5IW5Fcv>E+!Wa~T$O$6sNdSktQCU3lV-Gxpl$ z3pKr>>H2c~l((?pyzvOh&y+m)^sdSnr9AnZg8)aaTN2jb?C{_!X{(1vkq&W_rS|Nbaqz1P}jK7 zx#0y3Es#W8ey$=#Z^fm=m|o?333?v)kwDC|B@tp5vtI6<)=Q}4@D8zm0F#_bD;79hXuD&ZXm&>=d1_x>q~ASzE&6(gZwtX`7aPVo ztQ0V0##!PF79c>&Cf$zNr*p?F*li#~Dn%g)5t2z>Jqr|A=Ns!+`9F>>88CGhZS)Nr zlY#7G9guDM^o&H%qQ1UiDVu0SyPqc)@|0n zRUhioUbjSoHC4qXtf8%5@s+fhQ}u`s_hsIxy|VmRGpSIckoMw=-aJ81B9_^IR5@1; zzt-SVZ>5tcZ?&?lwikGccWu^aVo3!<(o_cdiiWgK&8*i_5G)vDNUq7tYc)GQki2J1 zw5Y2oj-iJ0N8l7hzv!rLp1LR`;|1}ch8Vzu%b!r~P2Nag`n0vI?c-I1z;g}@C&8vI zbGYxqeoq~URXmm1rli;>r1U{g+(;pAhv*4wNHJ(Q;dTZqNH&ND`Zvzh6a6ndmcT%= zb`naBlMX7*B+i#t-x;%t$~hWG#CwRJdE^V5cSIGOj3e4PiqqEbx7@PL8Lc6Q0MD6C zB|N#fx%Tw{gr@&R!a>$kv%E$RDehj!HuFtPNL{jxuU!R_*AbpyQyY8!$mRPZt3Vnu zLWU$(xLF~o$UcrJ7b6BzI=OBS5iSWzpsyf~!$E(x%+l5>Rt$}xcfurmFCL5ngebmg zO4Ep0OZ{y5FkO>a7Jz=u!e48IF+s$?@Y#N1<7ySZ~YYB@?Duorz`L3PCkgiIv+ zVDViQ+fN#x)HxFBQK)TMoZ9|sT?qWh?f{>B)=;i+r}>^BXKk-WC$h4t{^JL(9*4}4 zpsu+Wy)G&0!~d|-9PDw$S+S5};--=D!&^Hn&*ZTzGEO8}?@5=tiP)Q_3okmGq?u+> zXyLqZZ#(>r#jxT(uUgv4PA5*hajqBum{FB$1>E=g>d4U{n?~-~HFbe@EY*PRwdy2@$)Y|4BR9RjV%EMwBAv$PW#2s8535 zo)il{^6MT|uL~36ZiYoTV9#Sr+kCH5)f;Zv7VKN4ui2M$hoydVx`;a3%j2~8OSSXmf*tM{p8<*`07ZvRM zkNU%%ckVt8JS*{28gwe=aG?%irF?Yxn4d$vL8S=y!=Tvk)qtDpRH$k0NbS_}>qc@; i_z#1W{nbmX?_wfUrhf^`8tA+A1|h4+`|-&>J?e^~*L0YrC~6y9Hv z_i$<6?QOXb5fHg7|K75^tE(FBFV6!bkje+k@*k|qc>tBozrP~?&I+I`NNWH7h6gL4 z1_HVN|NsB>>D8y(NB{l(^Xbmf2dhe+Ztwd3>W*@q!7QLl6ib5qf*Gz)o$%$K?j~dQ ziPQe>>t$;@`R+=v;^j|z{W>4_vKaMk?^ALYV_;w^^>lFzskrs__RXT%4gwB=i{E

        I9_loNGdcn`~!0Sa7u6~NFJEo@DRwU z;hexSf#-o|gHA&VgFVv{Mi+)ZHHM5VCzv^Yuzz9OA+Uh+z<n)uP`&%JZAfKBDU%}NU^7@pUXO@geCw%RT(V+ literal 0 HcmV?d00001 diff --git a/comp/src/gb.gui.base/pattern/13.png b/comp/src/gb.gui.base/pattern/13.png new file mode 100644 index 0000000000000000000000000000000000000000..d8db1bef20a1d61825418fd533e86081e317f888 GIT binary patch literal 82 zcmeAS@N?(olHy`uVBq!ia0vp^93adHBpBY5G^+tANlzEY5RU7~E7EVAFPQ((_HcRI eeV%&Be~b)9XW4%3>fz)DDfV>rb6Mw<&;$StnHJ>$ literal 0 HcmV?d00001 diff --git a/comp/src/gb.gui.base/pattern/14.png b/comp/src/gb.gui.base/pattern/14.png new file mode 100644 index 0000000000000000000000000000000000000000..7c59bc71a033d42e1bcac5b12bc47409a2ea30b3 GIT binary patch literal 78 zcmeAS@N?(olHy`uVBq!ia0vp^93adHBpBY5G^+tAQBN1g5RU7~E0S-VE|~q$Qs5rj ardJI54_JT49FVL9DfD#pb6Mw<&;$UfI~9ij literal 0 HcmV?d00001 diff --git a/comp/src/gb.gui.base/pattern/2.png b/comp/src/gb.gui.base/pattern/2.png new file mode 100644 index 0000000000000000000000000000000000000000..9cb0a79087e8a14ffcb8a8768f6662ad8558040f GIT binary patch literal 71 zcmeAS@N?(olHy`uVBq!ia0vp^93adHBpBY5G^+tAK2I0N5RU7~FA^FUGmdKI;Vst01m?uX8-^I literal 0 HcmV?d00001 diff --git a/comp/src/gb.gui.base/pattern/9.png b/comp/src/gb.gui.base/pattern/9.png new file mode 100644 index 0000000000000000000000000000000000000000..e853f599ff6c9f8f1a98f6f383de537d8d558d1b GIT binary patch literal 70 zcmeAS@N?(olHy`uVBq!ia0vp^93adHBpBY5G^+tAUQZXt5RU7~2?;;?c^D1uv;7jh RQzr*f;OXk;vd$@?2>{Zi5Jvz2 literal 0 HcmV?d00001 diff --git a/comp/src/gb.gui.base/picturebox.png b/comp/src/gb.gui.base/picturebox.png new file mode 120000 index 00000000..7e85da73 --- /dev/null +++ b/comp/src/gb.gui.base/picturebox.png @@ -0,0 +1 @@ +../../../app/src/gambas3/img/control/picturebox.png \ No newline at end of file diff --git a/comp/src/gb.logging/.component b/comp/src/gb.logging/.component new file mode 100644 index 00000000..1b048ca7 --- /dev/null +++ b/comp/src/gb.logging/.component @@ -0,0 +1,4 @@ +[Component] +Key=gb.logging +Version=3.10.90 +Authors=sebikul diff --git a/comp/src/gb.logging/.directory b/comp/src/gb.logging/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/comp/src/gb.logging/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/comp/src/gb.logging/.icon.png b/comp/src/gb.logging/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a9254f949f86671b58a744a6a93623576acc5217 GIT binary patch literal 10569 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 1 Then Error.Raise("Invalid output console") + + $iOutput = iOutput + + Me.Level = iMinLevel + +End + +Public Sub Write(sMessage As String, Optional iLevel As Integer) + + If Not Me.isEnabledFor(iLevel) Then Return + + If $iOutput = STDOUT Then + + Print sMessage + + Else If $iOutput = STDERR Then + + Print #File.Err, sMessage + + Endif + +End + +Public Function GetOutput() As String + + If $iOutput = STDOUT Then + + Return Logger.Stdout + + Else If $iOutput = STDERR Then + + Return Logger.Stderr + + Endif + +End \ No newline at end of file diff --git a/comp/src/gb.logging/.src/FileHandler.class b/comp/src/gb.logging/.src/FileHandler.class new file mode 100644 index 00000000..84db47bc --- /dev/null +++ b/comp/src/gb.logging/.src/FileHandler.class @@ -0,0 +1,91 @@ +' Gambas class file + +Export + +Inherits LogHandler + +'' Holds the path of the file +Private $sPath As String + +'' Holds a stram to the log file +Private $sLogFile As Stream + +Private $bLogRotateEnabled As Boolean = False +Private $lLogRotateSize As Long + +Public Sub _new(sPath As String, Optional iMinLevel As Integer = LogLevel.Info) + + $sPath = sPath + + Me.Level = iMinLevel + +End + +Public Sub Open() + + If Me.Step > 0 Then Error.Raise("Handler already initialized!") + + If IsDir($sPath) Then + $sPath = $sPath &/ Application.Name & ".log" + Endif + + If Not Access(File.Dir($sPath), gb.Write) Then Error.Raise("Log file not writable.") + + If Exist($sPath) Then + $sLogFile = Open $sPath For Write Append + Else + $sLogFile = Open $sPath For Write Create + Endif + + Me.Step = 1 + +End + +Public Sub Write(sMessage As String, Optional iLevel As Integer) + + If Me.Step <> 1 Then Error.Raise("Uninitialized or already closed handler!") + + If Not Me.isEnabledFor(iLevel) Then Return + + Print #$sLogFile, sMessage + + If $bLogRotateEnabled And LogRotator.shouldRotate($sPath, $lLogRotateSize) Then + + Close $sLogFile + + '' Should automatically rename the old files + LogRotator.Rotate($sPath) + + $sLogFile = Open $sPath For Write Create + + Endif + +End + +Public Sub Close() + + If Me.Step <> 1 Then Error.Raise("Uninitialized or already closed handler!") + + Inc Me.Step + + Close $sLogFile + +End + +Public Function GetOutput() As String + + Return $sPath + +End + +Public Sub RotateAfter(lSize As Long) + + If Me.Step > 0 Then Error.Raise("Handler already initialized!") + + If lSize <= 0 Then Error.Raise("The LogRotate size must be greater than 0") + + $bLogRotateEnabled = True + + $lLogRotateSize = lSize + +End diff --git a/comp/src/gb.logging/.src/Formatter.module b/comp/src/gb.logging/.src/Formatter.module new file mode 100644 index 00000000..9535e055 --- /dev/null +++ b/comp/src/gb.logging/.src/Formatter.module @@ -0,0 +1,167 @@ +' Gambas module file + +''' This class formats a line to automatically replace required Logger data + +Export + +Private Function GetCallLocation() As String + + Dim iCount As Integer = 1 + + While System.Backtrace[iCount] Begins "Logger" Or System.Backtrace[iCount] Begins "Formatter" + Inc iCount + Wend + + Return System.Backtrace[iCount] + +End + +Private Function GetCallFile() As String + + Return Split(GetCallLocation(), ".")[0] + +End + +Private Function GetCallFunction() As String + + Return Split(GetCallLocation(), ".")[1] + +End + +Private Function GetCallLine() As String + + Return Split(GetCallLocation(), ".")[2] + +End + +Public Function _call(sMessage As String, sFormat As String, iLevel As Integer) As String + + Dim sName As String + Dim aLoaded As String[] + Dim oComponent As Component + + If String.InStr(sFormat, "$(message)") > 0 Then + sFormat = Replace$(sFormat, "$(message)", sMessage) + Endif + + If String.InStr(sFormat, "$(callLocation)") > 0 Then + sFormat = Replace$(sFormat, "$(callLocation)", GetCallLocation()) + Endif + + If String.InStr(sFormat, "$(callLine)") > 0 Then + sFormat = Replace$(sFormat, "$(callLine)", GetCallLine()) + Endif + + If String.InStr(sFormat, "$(callFile)") > 0 Then + sFormat = Replace$(sFormat, "$(callFile)", GetCallFile()) + Endif + + If String.InStr(sFormat, "$(callFunction)") > 0 Then + sFormat = Replace$(sFormat, "$(callFunction)", GetCallFunction()) + Endif + + If String.InStr(sFormat, "$(now)") > 0 Then + sFormat = Replace$(sFormat, "$(now)", CStr(Now)) + Endif + + If String.InStr(sFormat, "$(date)") > 0 Then + sFormat = Replace$(sFormat, "$(date)", CStr(Date(Now))) + Endif + + If String.InStr(sFormat, "$(time)") > 0 Then + sFormat = Replace$(sFormat, "$(time)", CStr(Time(Now))) + Endif + + If String.InStr(sFormat, "$(ptimer)") > 0 Then + sFormat = Replace$(sFormat, "$(ptimer)", CStr(Timer)) + Endif + + If String.InStr(sFormat, "$(ptimerint)") > 0 Then + sFormat = Replace$(sFormat, "$(ptimerint)", CStr(Int(Timer))) + Endif + + If String.InStr(sFormat, "$(levelno)") > 0 Then + sFormat = Replace$(sFormat, "$(levelno)", CStr(iLevel)) + Endif + + If String.InStr(sFormat, "$(levelname)") > 0 Then + Select Case iLevel + + Case LogLevel.Critical + sName = "CRITICAL" + + Case LogLevel.Error + sName = "ERROR" + + Case LogLevel.Warning + sName = "WARNING" + + Case LogLevel.Info + sName = "INFO" + + Case LogLevel.Debug + sName = "DEBUG" + + Case Else + sName = "CUSTOM DEBUG" + + End Select + + sFormat = Replace$(sFormat, "$(levelname)", sName) + + Endif + + If String.InStr(sFormat, "$(version)") > 0 Then + sFormat = Replace$(sFormat, "$(version)", Application.Version) + Endif + + If String.InStr(sFormat, "$(gbversion)") > 0 Then + sFormat = Replace$(sFormat, "$(gbversion)", System.FullVersion) + Endif + + If String.InStr(sFormat, "$(host)") > 0 Then + sFormat = Replace$(sFormat, "$(host)", System.Host) + Endif + + If String.InStr(sFormat, "$(pid)") > 0 Then + sFormat = Replace$(sFormat, "$(pid)", CStr(Application.Id)) + Endif + + If String.InStr(sFormat, "$(architecture)") > 0 Then + sFormat = Replace$(sFormat, "$(architecture)", System.Architecture) + Endif + + If String.InStr(sFormat, "$(charset)") > 0 Then + sFormat = Replace$(sFormat, "$(charset)", System.Charset) + Endif + + If String.InStr(sFormat, "$(home)") > 0 Then + sFormat = Replace$(sFormat, "$(home)", User.Home) + Endif + + If String.InStr(sFormat, "$(username)") > 0 Then + sFormat = Replace$(sFormat, "$(username)", User.Name) + Endif + + If String.InStr(sFormat, "$(appPath)") > 0 Then + sFormat = Replace$(sFormat, "$(appPath)", Application.Path) + Endif + + If String.InStr(sFormat, "$(appName)") > 0 Then + sFormat = Replace$(sFormat, "$(appName)", Application.Name) + Endif + + If String.InStr(sFormat, "$(loadedComponents)") > 0 Then + + aLoaded = New String[] + + For Each oComponent In Components + aLoaded.Add(oComponent.Name) + Next + + sFormat = Replace$(sFormat, "$(loadedComponents)", aLoaded.Join(", ")) + Endif + + Return sFormat + +End diff --git a/comp/src/gb.logging/.src/LogHandler.class b/comp/src/gb.logging/.src/LogHandler.class new file mode 100644 index 00000000..c5fb3f00 --- /dev/null +++ b/comp/src/gb.logging/.src/LogHandler.class @@ -0,0 +1,64 @@ +' Gambas class file + +Export + +Property Level As Integer +Property Step As Integer + +'' Holds the minimum level the Logger will write +Private $iLevel As Integer = LogLevel.Info + +'' Describes the status of the logger. A status of 0 means uninitialized, a status of 1 means ready, and a status +'' greater than 1 means it is already closed. +Private $iStep As Integer = 0 + +'' Opens the log handler and prepares it for writing +Public Sub Open() + +End + +'' Write the sMessage with optional level iLevel to the log handler +Public Sub Write(sMessage As String, Optional iLevel As Integer) + +End + +'' Closes the log handler. No further writing is allowed +Public Sub Close() + +End + +Public Function isEnabledFor(iLevel As Integer) As Boolean + + Return (iLevel <= $iLevel) + +End + +Private Function Level_Read() As Integer + + Return $iLevel + +End + +Private Sub Level_Write(Value As Integer) + + If Value < 0 Then Error.Raise("Invalid logging level.") + + $iLevel = Value + +End + +Private Function Step_Read() As Integer + + Return $iStep + +End + +Private Sub Step_Write(Value As Integer) + + $iStep = Value + +End + +Public Function GetOutput() As String + +End diff --git a/comp/src/gb.logging/.src/LogLevel.module b/comp/src/gb.logging/.src/LogLevel.module new file mode 100644 index 00000000..9f378202 --- /dev/null +++ b/comp/src/gb.logging/.src/LogLevel.module @@ -0,0 +1,11 @@ +' Gambas module file + +Export + +Public Enum Critical, {Error}, Warning, Info, {Debug} + +Public Function isEnabledFor(iHandlerLevel As Integer, iLevel As Integer) As Boolean + + Return (iLevel <= iHandlerLevel) + +End \ No newline at end of file diff --git a/comp/src/gb.logging/.src/LogRotator.module b/comp/src/gb.logging/.src/LogRotator.module new file mode 100644 index 00000000..9f4f781f --- /dev/null +++ b/comp/src/gb.logging/.src/LogRotator.module @@ -0,0 +1,65 @@ +' Gambas module file + +Export + +Public Function shouldRotate(sPath As String, lMaxSize As Long) As Boolean + + Dim lSize As Long = Stat(sPath).Size + + Return lSize > lMaxSize + +End + +Public Sub Rotate(sPath As String) + + ''TODO Logica para renombrar los archivos + + Dim sBasePath As String = File.Dir(sPath) + Dim sBaseName As String = File.BaseName(sPath) + Dim sExt As String = File.Ext(sPath) + + Dim sOldFile, sNewFile As String + + Dim i As Integer = 0 + + ''TODO Usar Format + While Exist(sBasePath &/ sBaseName & "." & i & "." & sExt) + Debug "File " & sBasePath &/ sBaseName & "." & i & "." & sExt & " already exists. Skipping" + Inc i + Wend + + '' i tiene el numero del prox archivo + + If i = 0 Then + + sOldFile = sBasePath &/ sBaseName & "." & sExt + sNewFile = sBasePath &/ sBaseName & "." & i & "." & sExt + + Debug "Moving file " & sOldFile & " to " & sNewFile + + Move sOldFile To sNewFile + + Else + + Repeat + + sOldFile = sBasePath &/ sBaseName & "." & (i - 1) & "." & sExt + sNewFile = sBasePath &/ sBaseName & "." & i & "." & sExt + + Debug "Moving file " & sOldFile & " to " & sNewFile + + Move sOldFile To sNewFile + + Dec i + Until i = 0 + + sOldFile = sBasePath &/ sBaseName & "." & sExt + sNewFile = sBasePath &/ sBaseName & "." & i & "." & sExt + + Debug "Moving file " & sOldFile & " to " & sNewFile + + Move sOldFile To sNewFile + + Endif + +End diff --git a/comp/src/gb.logging/.src/Logger.class b/comp/src/gb.logging/.src/Logger.class new file mode 100644 index 00000000..6d71781b --- /dev/null +++ b/comp/src/gb.logging/.src/Logger.class @@ -0,0 +1,108 @@ +' Gambas class file + +Export + +Create Static + +Property Level As Integer +Property Format As String +Property Enabled As Boolean +Property Read Output As String + +Static Public Const DefaultFormat As String = "[$(now)] [$(levelname)] [$(callLocation)] $(message)" + +Private $cLogger As ComplexLogger + +'' This is only here for compatibility and is now deprecated, please use LogLevel instead. +Public Enum Critical, {Error}, Warning, Info, {Debug} + +Static Public Const Stdout As String = ":stdout" +Static Public Const Stderr As String = ":stderr" + +Public Sub _new(Optional iMinLevel As Integer = LogLevel.Info, Optional sFormat As String = DefaultFormat, Optional sOutput As String) + + Dim tmpHandler As LogHandler + + If sOutput = Stdout Then + tmpHandler = New ConsoleHandler(ConsoleHandler.STDOUT, iMinLevel) + Else If sOutput = Stderr Then + tmpHandler = New ConsoleHandler(ConsoleHandler.STDERR, iMinLevel) + Else + tmpHandler = New FileHandler(sOutput, iMinLevel) + Endif + + $cLogger = New ComplexLogger(sFormat, tmpHandler) + +End + +Public Sub Begin() + + $cLogger.Begin() + +End + +Public Function isEnabledFor(iLevel As Integer) As Boolean + + Return $cLogger.Handlers[0].isEnabledFor(iLevel) + +End + +Public Sub Log(sMessage As String, Optional iLevel As Integer = LogLevel.Info) + + $cLogger.Log(sMessage, iLevel) + +End + +Public Sub _call(sMessage As String, Optional iLevel As Integer = LogLevel.Info) + + Me.Log(sMessage, iLevel) + +End + +Public Sub _free() + + If $cLogger Then $cLogger.Close() + +End + +Private Function Level_Read() As Integer + + Return $cLogger.Handlers[0].Level + +End + +Private Sub Level_Write(Value As Integer) + + $cLogger.Handlers[0].Level = Value + +End + +Private Function Format_Read() As String + + Return $cLogger.Format + +End + +Private Sub Format_Write(Value As String) + + $cLogger.Format = Value + +End + +Private Function Enabled_Read() As Boolean + + Return $cLogger.Enabled + +End + +Private Sub Enabled_Write(Value As Boolean) + + $cLogger.Enabled = Value + +End + +Private Function Output_Read() As String + + Return $cLogger.Handlers[0].GetOutput() + +End diff --git a/comp/src/gb.logging/.src/MTest.module b/comp/src/gb.logging/.src/MTest.module new file mode 100644 index 00000000..8c7ea92f --- /dev/null +++ b/comp/src/gb.logging/.src/MTest.module @@ -0,0 +1,36 @@ +' Gambas module file + +Public Sub Main() + + Dim aHandler As LogHandler + Dim bHandler As FileHandler + + Dim bLogger As ComplexLogger + + Dim i As Integer = 0 + + aHandler = New ConsoleHandler(ConsoleHandler.STDOUT) + bHandler = New FileHandler("~/Desktop") + bHandler.RotateAfter(1024) + + bLogger = New ComplexLogger(Null, aHandler) + + bLogger.addHandler(bHandler) + + bLogger.Begin() + + bLogger.Log("I can read this in the console or at a file stored in my Desktop folder.") + + For i = 0 To 100 + + bLogger("Log message " & i) + + Next + + ' cLogger = New Logger(LogLevel.Error, Null, Logger.Stdout) + ' + ' cLogger.Begin() + ' + ' cLogger.Log("Using the old logger interface", LogLevel.Critical) + +End diff --git a/comp/src/gb.map/.component b/comp/src/gb.map/.component new file mode 100644 index 00000000..5be5eab9 --- /dev/null +++ b/comp/src/gb.map/.component @@ -0,0 +1,7 @@ +[Component] +Key=gb.map +Version=3.12.0 +State=1 +Authors=Fabien Bodard +Needs=Form,ImageIO +Requires=gb.net.curl,gb.net diff --git a/comp/src/gb.map/.directory b/comp/src/gb.map/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/comp/src/gb.map/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/comp/src/gb.map/.hidden/control/mapview.png b/comp/src/gb.map/.hidden/control/mapview.png new file mode 100644 index 0000000000000000000000000000000000000000..bf4c592bdfc4f675592d642edf883cdd3bc085ed GIT binary patch literal 1749 zcmV;`1}gc9P)qO3 zD_5>4o}(E6moHy_E}LJydKK+?o*vi=K&h<}**v!1SAbktMlO}Nta}ze@I?r=Td>|1 zLTvQc+Z$G@;{E&&&}CsiO~blz z4eQST=zHUbID2|`^}7YY#)eYjyA3Qmz7_^MM>zjms9r~R_8@CED(t2iiQ&2_qPmM^ zx`@Rnkp;%AFwZz;icR#mrfi<0;UissSw%@40z2dlOMl>*Q!xpo@Fq9k;J}H zY+6Jd6N1MO%+h_}DB*mXJCQV#Gv6d-)aZ2<7%M(P4>eYk36``7_4x$~s};%HDv!AgtGmd2^D17`5@GeeF5se^7B0qW?XEo?slz>Ib=eEJp4XpHjArv&XLx(UsS z%iL_9dh;ttAsOCV;Kk~{8EwoW<`uVN1Ei1KM{l+8N)88tD&H%O^PBD?G)#jY-={k_ zgmWgpdk8ecr2pj0>^pIRnVau1clRHZ9&7k&7(eX8GTOMBfm*Q8d_iF7j8uvo^ota- zb2Q=+jHL$tip|(miF4^=Oz0^NmG0t<9b4xa*a5(oX`(T7>RVW;Q!KnYL47&I&?G)O zC){yP1=k66fkH5 zYc<`r5_T@?J(wnR*GLn`?{n*%$NMkaXhDeKOLRg^OJPcZPy!_+0S2BI#|ssw&Kzdw zi_MkVdLL|C2Rd08`Ff6^tHSNaAEH_&rY@M?Yw+G!483B|?^HS3y~y#R&GcT6#Z;Tr zibkaFGu&%)c0fSrqjYmy26imPoqCCnxVZ6ga19I*P;$HY)!;$AoW`hM=4Z_kR-njE zT69T+M9CoS6|nYIk-vNd-}w>Rp_3>fo?ePOZ$YIL0)f-)C*r4RMi#J|8N~Ea(ngzB zs1cJPmI?@TooG?Rt{cdxqKA3p)ErVOw7}gG=4~~w-DL#OoQ#qhKTo96N8;8u7%QA4 z?Z>G_6ho>8N+ATOUWM#Zpdb(?%Cs=N8cg2aNWNV)(8)ljHJUYo&%4RYzk=pl1a`=1 z(P6MQ%j@yNS~?1a8Hb>vpdv6-fC>Wc4qfEP;TN!WU|>fPt}hIOkb1cVnnd#rLPKGB zP0mgiaYR5nv!C029@7^Jod2go?-CFVXlXWoPM+lh^1PwvIKK_EyNYmqq3?#QF4oZu zjlj?lO0jo&3e&IB)+4lMV(40#nlu>S@1bgOoQgvsGQ|7N3%IQ|QR!`ndRGQEix6OC zu12Hc615HbXYUg6T9|=LsGEpTAdHaYe4ONx%~by)b6KCskKV%YY`Rn%%M!f(_X5+4 zbzc42{@oeaY*H#F{yVb`e|NFESsAa=ORmU-ydKpDNSe2G_)R`<)K|h$`00000NkvXXu0mjfK!-<0 literal 0 HcmV?d00001 diff --git a/comp/src/gb.map/.icon.png b/comp/src/gb.map/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ffb1a2a51b8b338114594e01e58b092aa9fd08e3 GIT binary patch literal 18676 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 literal 0 HcmV?d00001 diff --git a/comp/src/gb.map/.project b/comp/src/gb.map/.project new file mode 100644 index 00000000..d0a447aa --- /dev/null +++ b/comp/src/gb.map/.project @@ -0,0 +1,19 @@ +# Gambas Project File 3.0 +Title=gb.map +Startup=Form4 +Icon=.hidden/control/mapview.png +Version=3.12.0 +VersionFile=1 +Component=gb.image +Component=gb.gui +Component=gb.form +Component=gb.net +Component=gb.net.curl +Description="Map viewer" +Authors="Fabien Bodard" +Environment="GB_GUI=gb.qt5" +TabSize=2 +Language=fr +Type=Component +Packager=1 +DoNotTranslate=".src/Tests" diff --git a/comp/src/gb.map/.src/FCarto.class b/comp/src/gb.map/.src/FCarto.class new file mode 100644 index 00000000..fe5fb5ee --- /dev/null +++ b/comp/src/gb.map/.src/FCarto.class @@ -0,0 +1,133 @@ +' Gambas class file + +' Static Public $prjWGS84 As Proj +' Static Public $prjLamb93 As Proj +' Static Public $prjLatLon As Proj +' +' Static Public Sub _init() +' +' $prjWGS84 = New Proj("+init=epsg:4326") +' $prjLamb93 = New Proj("+init=epsg:2154") +' $prjLatLon = New Proj("init=epsg:3857") +' '$prjMerc = New Proj("+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs") +' +' End + +Public Sub _new() + 'LoadFromPac + MapView1.Map.AddTile("GoogleMap", "https://khms{s}.google.fr/kh/v={version}&src=app&x={x}&y={y}&z={z}&s=Galile", ["version": "128"], "gm").SubDomains = ["0", "1", "2"] + MapView1.Map.AddTile("GoogleRoad", "https://mts{s}.google.com/vt/lyrs=h@215000000&hl=fr&src=app&x={x}&y={y}&z={z}&s=Galile").SubDomains = ["0", "1"] + MapView1.Map.AddShape("MyShape").Color = Color.green + LoadFromFile(MapView1.Map!MyShape) + + ' PictureBox1.Picture = MapView1.Map.Grab(MapView1.Map!MyShape["110"].Bounds, 100, 100, 5).Picture + + MapView1.Map.Center = MapPoint(45.525934, -0.312252) + MapView1.Map.Zoom = 17 + + + +End + +Public Sub LoadFromFile(hShape As Object) + + 'Dim hShape As New Shapes + Dim hmappoints As New MapPoint[][] + Dim hpoints As New MapPoint[] + Dim s, t As String + Dim i As Integer + ' Dim c As Integer + s = File.Load("./pointsparcelle") + hshape.Color = Color.Green + For Each t In Split(s, "\n") + If t = "" Then + hmappoints.Add(hpoints) + hshape.AddPolygon(i, hmappoints) + + Inc i + hmappoints = New MapPoint[][] + hpoints = New MapPoint[] + Else + hpoints.Add(MapPoint(Scan(t, "* *")[1], Scan(t, "* *")[0])) + Endif + + + Next + 'Return hshape +End + + +' Public Function LoadFromPac() +' +' Dim hDoc As New XmlDocument +' Dim el As XmlElement +' 'Dim hshape As New Shapes +' Dim s As String +' Dim haPoly As New MapPoint[][] +' Dim hPoly As New MapPoint[] +' Dim hpoint As MapPoint +' Dim fp As New Pointf +' hDoc.Open("parcellaire.xml") +' +' For Each el In hDoc.GetElementsByTagName("gml:coordinates") +' haPoly = New MapPoint[][] +' hPoly = New MapPoint[] +' For Each s In Split(Replace(el.TextContent, "\n", " "), " ") +' hpoint = New MapPoint +' If s = "" Then Continue +' fp = New Pointf +' fp.X = Split(s)[0] +' fp.Y = Split(s)[1] +' +' fp = $prjLamb93.TransformFp($prjWGS84, fp) +' 'fp = $prjWGS84.TransformFp($prjLatLon, fp) +' 'fp = $prjMerc.Transformfp($prjLatLon, fp) +' Print fp.x, fp.y +' 'fp = $prjLamb93.Transform($prjLatLon, Split(s)[0], Split(s)[1]) +' +' hpoint.Lat = fp.y +' hpoint.Lon = fp.x +' hPoly.Add(hpoint) +' Next +' haPoly.Add(hpoly) +' +' 'hshape.AddPolygon(haPoly) +' Next +' +' +' 'Return hShape +' End + +Public Sub Form_Open() + + + +End + +Public Sub MapView1_Draw() + + 'Me.Text = MapView1.Map.Center.Lat + +End + +Public Sub MapView1_MouseDown() +Dim i As Integer +Dim hmappoints As MapPoint + 'Me.Text = Geo.PixelToMapPoint(Point(Mouse.x, Mouse.y), MapView1.Map.Zoom).Lat + With MapView1.Map + hmappoints = Geo.PixelToMapPoint(Point(.PixelBox.X + Mouse.X, .PixelBox.Y + Mouse.Y), .Zoom) + + For i = 0 To MapView1.Map["MyShape"].Max + 'Print MapView1.Map["MyShape"].Data[i].Box.X, MapView1.Map["MyShape"].Data[i].Box.Y, MapView1.Map["MyShape"].Data[i].Box.Right, MapView1.Map["MyShape"].Data[i].Box.BOTTOM, hmappoints.lon, hmappoints.Lat + If MapView1.Map["MyShape"][i].Contains(hmappoints) Then + + MapView1.Map["MyShape"][i].Selected = True + MapView1.Refresh + + + Endif + 'Endif + + Next + End With +End diff --git a/comp/src/gb.map/.src/FCarto.form b/comp/src/gb.map/.src/FCarto.form new file mode 100644 index 00000000..9c44d191 --- /dev/null +++ b/comp/src/gb.map/.src/FCarto.form @@ -0,0 +1,13 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,107,65) + Arrangement = Arrange.Horizontal + { MapView1 MapView + MoveScaled(1,2,78,52) + Expand = True + } + { PictureBox1 PictureBox + MoveScaled(80,3,20,53) + } +} diff --git a/comp/src/gb.map/.src/Map.class b/comp/src/gb.map/.src/Map.class new file mode 100644 index 00000000..e1b1a5b2 --- /dev/null +++ b/comp/src/gb.map/.src/Map.class @@ -0,0 +1,460 @@ +' Gambas class file + +'TODO: Add methods to remove Tiles and Shapes + +Export +'Static Public Debug As Boolean +Static Public Debug As Boolean '' Returns or sets the Debug messages +Property Read PixelBox As Rect +Property Read Bounds As MapBounds '' Returns the lat/lon coordinates at the limits of the drawed map. +Property Read Count As Integer '' Returns the number of Map Layers +Property Read Proxy As _MapProxy '' Returns a object used for defining proxy parameters. +Property DefaultCache As String '' Returns or sets the default cache path for storing Tiles +Property Top, Y As Integer +Property Left, X As Integer +Property Width As Integer +Property Height As Integer +Property Zoom As Integer '' Returns or sets the actual Map zoom level +Property Center As MapPoint '' Returns or sets the center point of the map +Property MaxZoom As Integer '' Returns or sets the maximum Map zoom level +Private $iMaxZoom As Integer = 18 +Private $iZoom As Integer = 1 +Private $mpCenter As New MapPoint +Private $iTop As Integer +Private $iLeft As Integer +Private $iWidth As Integer +Private $iHeight As Integer +Private tmrLoad As New Timer As "tmrLoad" +Private tmrDraw As New Timer As "tmrDraw" +Private $PixelBox As New Rect +Private $Bounds As New MapBounds +Private $PrevBox As Rect +Private $iPrevent As Integer = 256 +Private $aLayers As New _MapLayer[] +Private $aLayerNames As New String[] +Private $sCachePath As String = User.Home &/ ".cache/gb.map" +Public _ShowWithEffect As Boolean +Public _Proxy As _MapProxy + +Event Refresh +Event Draw + +Private Function Top_Read() As Integer + + Return $iTop + +End + +Private Sub Top_Write(Value As Integer) + + $iTop = Value + +End + +Private Function Left_Read() As Integer + + Return $iLeft + +End + +Private Sub Left_Write(Value As Integer) + + $iLeft = Value + +End + +Private Function Width_Read() As Integer + + Return $iWidth + +End + +Private Sub Width_Write(Value As Integer) + + $iWidth = Value + SetBoxes + +End + +Private Function Height_Read() As Integer + + Return $iHeight + +End + +Private Sub Height_Write(Value As Integer) + + $iHeight = Value + SetBoxes + +End + +Private Sub SetBoxes() + + Dim ptCenter As Point + ' Dim iMaxSize As Integer + If Not $PrevBox Then + $PrevBox = $PixelBox.Copy() + tmrLoad.Trigger + Endif + + 'Create the pixBox + ptCenter = Geo.MapPointToPixel($mpCenter, $iZoom) + + 'trying to understand why "square surface"... + ' 'Set a square surface on max size + ' iMaxSize = Max($iWidth, $iHeight) + ' + ' $PixelBox.X = ptCenter.X - (iMaxSize / 2) + ' $PixelBox.Y = ptCenter.Y - (iMaxSize / 2) + ' $PixelBox.Right = ptCenter.x + (iMaxSize / 2) + ' $PixelBox.Bottom = ptCenter.Y + (iMaxSize / 2) + $PixelBox.X = ptCenter.X - ($iWidth / 2) + $PixelBox.Y = ptCenter.Y - ($iHeight / 2) + $PixelBox.Right = ptCenter.x + ($iWidth / 2) + $PixelBox.Bottom = ptCenter.Y + ($iHeight / 2) + + $Bounds.TopLeft = Geo.PixelToMapPoint(Point($PixelBox.x, $PixelBox.y), $iZoom) + $Bounds.BottomRight = Geo.PixelToMapPoint(Point($PixelBox.Right, $PixelBox.Bottom), $iZoom) + + '$PixelBox.Width = $iWidth + '$PixelBox.Height = $iHeight + ' Print "Largeur/hauteur", $iWidth, $iHeight + ' Print $PixelBox.Right, $PixelBox.Left, $PixelBox.Right - $PixelBox.Left + ' Print ptCenter.x + ($iWidth / 2), ptCenter.X - ($iWidth / 2) + 'Print $PixelBox.Top, $PixelBox.Left, $PixelBox.Height, $PixelBox.Width + 'a Movement ? + If Abs($PixelBox.Left - $PrevBox.Left) > $iPrevent / 2 Or If Abs($PixelBox.Top - $PrevBox.Top) > $iPrevent / 2 Then + $PrevBox = $PixelBox.Copy() + tmrLoad.Trigger + Endif + 'a Resize ? + If Abs($PixelBox.Width - $PrevBox.Height) > $iPrevent / 2 Or If Abs($PixelBox.Height - $PrevBox.Height) > $iPrevent / 2 Then + $PrevBox = $PixelBox.Copy() + tmrLoad.Trigger + Endif + 'tmrLoad.Trigger + +End + +Private Function PixelBox_Read() As Rect + + Return $PixelBox + +End + +Private Function Zoom_Read() As Integer + + Return $iZoom + +End + +Private Sub Zoom_Write(Value As Integer) + + Dim i As Integer + + $iZoom = Min(Max(Value, 1), $iMaxZoom) + For i = 0 To $aLayers.Max + $aLayers[i].Refresh + Next + SetBoxes + tmrLoad.Trigger + +End + +Private Function Center_Read() As MapPoint + + Return $mpCenter + +End + +Private Sub Center_Write(Value As MapPoint) + + 'Print Value.Lat, Value.Lon + $mpCenter = Value + SetBoxes + +End + +Public Sub tmrLoad_Timer() + + Dim hLayer As _MapLayer + + For Each hLayer In $aLayers + If hLayer.Visible Then hLayer._Load + Next + +End + +Public Sub Resize(iWidth As Integer, iHeight As Integer) + + $iWidth = iWidth + $iHeight = iHeight + SetBoxes + +End + +'' Adds a new Tileset Layer from remote server or local cache to the current Map +'' - Name +'' - Pattern +'' - Args +'' - Cachename defines local folder name to store Tiles. +'' If CacheName is provided, stores and load Tiles in/from local cache path defined by *DefaultCache* property. +Public Sub AddTile(Name As String, Pattern As String, Optional Args As Collection, Optional CacheName As String) As _MapTile + + Dim hLayer As New _MapTile(CacheName, Me) + + 'hLayer.Pattern = Pattern + hLayer.SetPattern(Pattern, Args) + $aLayers.Add(hLayer) + $aLayerNames.Add(Name) + 'Object.Attach(hLayer, Me, "Layer") + Return hLayer + +End + +'' Adds a new Shape Layer to the current Map +'' - Name +Public Function AddShape(Name As String) As _MapShape + + Dim hLayer As New _MapShape(Me) + + hLayer.Name = Name + + $aLayers.Add(hLayer) + $aLayerNames.Add(Name) + 'Object.Attach(hLayer, Me, "Layer") + 'If Shape Then hLayer.Data = Shape + Return hLayer + +End + +'' Removes a Layer +'' - Name is any Tile or Shape Layer +Public Sub Remove(Name As String) + + 'If Not $aLayerNames.Exist(Name) Then Error.Raise("Layer not found: " & Name) + + Dim iRet As Integer = $aLayerNames.Find(Name) + $aLayers.Remove(iRet) + $aLayerNames.Remove(iRet) + +End + +'' Returns if a given Layer actually exists +'' - Name +'' - The Mode argument is one of the comparison methods available. +'' See Predefined Constants For a list Of comparison methods. +Public Function Exists(Name As String, Optional Mode As Integer) As Boolean + + Return $aLayerNames.Exist(Name, Mode) + +End + +'' Returns a _MapTile Layer object +'' This is an alternative method to fetch Map array elements +'' - Name is a Tile name +Public Sub GetTile(Name As String) As _MapTile + + Try Return $aLayers[$aLayerNames.Find(Name)] + +End + +'' Returns a _MapShape object layer +'' This is an alternative method to fetch Map array elements +Public Sub GetShape(Name As String) As _MapShape + + Try Return $aLayers[$aLayerNames.Find(Name)] + +End + +'' Hidden method so can be an readable Array +'' - Returns any Layer Object, whatever its a MapTile or MapShape +'' - See GetTile or GetShape +Public Sub _get(Name As String) As Object + + Try Return $aLayers[$aLayerNames.Find(Name)] + +End + +'' Hidden method so can be enumerable +Public Sub _next() As Object + + If IsNull(Enum.Index) Then Enum.Index = 0 Else Inc Enum.Index + + If Enum.Index > $aLayers.Max Then + Enum.Stop + Return + Endif + + Return $aLayers[Enum.Index] + +End + +Public Sub Draw() + + Dim hLayer As _MapLayer + Dim sCopyright As String + Dim iTextHeight, iTextWidth As Integer + 'Draw.Rect(0, 0, Me.Width, Me.Height) + For Each hLayer In $aLayers + If hLayer.Visible Then + hLayer.Draw + sCopyright &/= hLayer.Copyright + Endif + Next + + If sCopyright Then + Draw.FillStyle = Fill.Solid + Draw.FillColor = Color.SetAlpha(Color.Pink, 150) + iTextHeight = Draw.TextHeight(sCopyright) + iTextWidth = Draw.TextWidth(sCopyright) + Draw.Rect(Draw.Width - iTextWidth - 5, Draw.Height - iTextHeight - 2, iTextWidth + 6, iTextHeight + 4) + Draw.Text(sCopyright, Draw.Width - iTextWidth, Draw.Height - iTextHeight) + Endif + Raise Draw + +End + +Public Sub Layer_Refresh() + + tmrDraw.Trigger + +End + +Public Sub tmrDraw_Timer() + + Raise Refresh + +End + +Public Sub Refresh() + + SetBoxes + tmrLoad.Trigger + +End + +' Private Function Preload_Read() As Boolean +' +' End +' +' Private Sub Preload_Write(Value As Boolean) +' +' End + +Private Function Bounds_Read() As MapBounds + + Return $Bounds + +End + +'' Return an image of the given bounds, with +'' the given With And height, With the given margin arround.If +'' the zoom Is Not defined Then the better rendering zoom Is Used. +Public Function Grab(Bounds As MapBounds, iWidth As Integer, iHeight As Integer, Optional Padding As Integer, Optional Zoom As Integer) As Image + + Dim i As Integer + Dim hBndCenter As MapPoint = MapPoint((Bounds.Lat + Bounds.Lat2) / 2, (Bounds.Lon + Bounds.Lon2) / 2) + Dim hPix, hPix2 As Point + Dim hImg As New Image(iWidth, iHeight, Color.white) + Dim bLoad As Boolean + Dim hLayer As _MapLayer + 'Définir la zone a afficher + 'On centre la carte sur le bound + Me.Center = hBndCenter + Me.Resize(iwidth, iHeight) + + If Zoom Then + + Me.Zoom = Zoom + + Else + + For i = $iMaxZoom To 1 Step -1 + hpix = Geo.MapPointToPixel(hBndCenter, i) + hPix2 = Geo.MapPointToPixel(Bounds.BottomRight, i) + If (hPix2.X - hpix.X) <= (iWidth / 2 - Padding) And If (hpix.Y - hPix2.Y) <= (iHeight / 2 - Padding) Then + Break + Endif + Next + + Me.Zoom = i + Endif + + tmrLoad_Timer + + Repeat + bLoad = False + For Each hLayer In $aLayers + If hLayer.loading = True Then bLoad = True + Wait + Next + Until bLoad = False + + Draw.Begin(hImg) + Draw() + Draw.End + + Return hImg + +End + +'' Return a Point relative to the view from a MapPoint +Public Function MapPointToPixelRel(hMapPoint As MapPoint) As Point + + Dim hPoint As Point + hPoint = Geo.MapPointToPixel(hMapPoint, $iZoom) + hPoint.X -= $PixelBox.X + hPoint.Y -= $PixelBox.Y + Return hPoint + +End + +'' Return a MapPoint from a point relative to the view +Public Function PixelToMapPointRel(hPoint As Point) As MapPoint + + Dim pt As Point = hPoint.Copy() + pt.X += $PixelBox.X + pt.Y += $PixelBox.Y + Return Geo.PixelToMapPoint(pt, $iZoom) + +End + +Private Function Count_Read() As Integer + + Return $aLayers.Count + +End + +Private Function MaxZoom_Read() As Integer + + Return $iMaxZoom + +End + +Private Sub MaxZoom_Write(Value As Integer) + + $iMaxZoom = Value + +End + +Private Function Proxy_Read() As _MapProxy + + If Not _Proxy Then _Proxy = New _MapProxy + Return _Proxy + +End + +Private Function DefaultCache_Read() As String + + Return $sCachePath + +End + +Private Sub DefaultCache_Write(Value As String) + 'TODO: check if Ok + + $sCachePath = Value + +End diff --git a/comp/src/gb.map/.src/MapView.class b/comp/src/gb.map/.src/MapView.class new file mode 100644 index 00000000..b74e48bc --- /dev/null +++ b/comp/src/gb.map/.src/MapView.class @@ -0,0 +1,390 @@ +' Gambas class file + +Export +Inherits UserControl + +Public Const _Properties As String = "*,Border{Border.*},AllowEffect=true,ShowControls=true" +Public Const _Group As String = "View" + +Property Read {Map} As Map '' Returns the inner Map object +'Property Read DefaultProxy As _MapProxy '' Returns or sets Default Proxy parameters. +Property Lock As Boolean +Property Border As Integer '' Returns or sets the border type of the control. +Property AllowEffect As Boolean '' Returns or sets this Control visual effects. +Property ShowControls As Boolean '' Returns or sets Zoom control. +' Property Mode As Integer +' Private $iMode As Integer +Private $bShowControls As Boolean = True +Private $hCenter As MapPoint +Private $hMap As New Map As "Map" +Private $hView As DrawingArea +Private $hPan As New Panel(Me) +Private $pCurCenterPx As Point +Private $iX As Integer +Private $iY As Integer +Private $bLock As Boolean +Private $hZoomBuffer As New Image +Private $bZoomEffect As Boolean +Private $tmrZoom As New Timer As "tmrZoom" +Private $tmrOnMove As New Timer As "tmrOnMove" +Private $fZoomEffect As Float = 1 +Private $ZX As Integer +Private $ZY As Integer +Private $iZoomWay As Integer +Private $fSpeedX As Float +Private $fSpeedY As Float +Private $fInertia As Float = 0.90 +Private $bShowInertia As Boolean +Private $bAllowEffect As Boolean = True +Private $hViewLayer As New _ViewLayer As "ViewLayer" +Private $tX As Integer +Private $tY As Integer +' Public _Proxy As _MapProxy +Event Click +Event Draw + +Public Sub _new() + + $hPan.Arrangement = Arrange.Fill + $hView = New DrawingArea($hPan) As "View" + Me.Proxy = $hView + $hMap.resize($hView.ClientW, $hView.ClientH) + $hmap._ShowWithEffect = True + $hView.Tracking = True + $hView.Padding = True + $hView.Background = Color.DarkGray + $tmrZoom.Delay = 30 + $tmrOnMove.Delay = 30 + + '$hmap.Padding = 256 + +End + +Public Sub _GetMaxZoom() As Integer + + Return $hmap.MaxZoom + +End + + +Public Sub SetCenter(hMapPoint As MapPoint) + + $hCenter = hMapPoint + +End + +Private Function Map_Read() As Map + + Return $hMap + +End + +Public Sub View_Draw() + + If Not $bZoomEffect Then + + If $iZoomWay <> 0 Then + Paint.DrawImage($hZoomBuffer, 0, 0) + Endif + $hMap.Draw + Raise Draw + If $bShowControls Then $hViewLayer._Draw + Else + If $iZoomWay = 1 Then + + Paint.DrawImage($hZoomBuffer, ($ZX - $ZX * $fZoomEffect), ($ZY - $ZY * $fZoomEffect), $hZoomBuffer.Width * $fZoomEffect, $hZoomBuffer.Height * $fZoomEffect) + $fZoomEffect += 0.1 + If $fZoomEffect < 2 Then + + Else + $bZoomEffect = False + $fZoomEffect -= 0.1 + Draw.Begin($hZoomBuffer) + Paint.DrawImage($hZoomBuffer, ($ZX - $ZX * $fZoomEffect), ($ZY - $ZY * $fZoomEffect), $hZoomBuffer.Width * $fZoomEffect, $hZoomBuffer.Height * $fZoomEffect) + Draw.End + $fZoomEffect = 1 + $tmrZoom.stop + Refresh + '$tmrZoom.Trigger + Endif + Else + Paint.DrawImage($hZoomBuffer, (Paint.Width - $hZoomBuffer.Width * $fZoomEffect) / 2, (Paint.Height - $hZoomBuffer.Height * $fZoomEffect) / 2, $hZoomBuffer.Width * $fZoomEffect, $hZoomBuffer.Height * $fZoomEffect) + $fZoomEffect -= 0.04 + If $fZoomEffect > 0.5 Then + '$tmrZoom.Trigger + Else + $bZoomEffect = False + $fZoomEffect += 0.04 + Draw.Begin($hZoomBuffer) + Draw.FillRect(0, 0, Paint.Width, Paint.Height, $hView.Background) + Paint.DrawImage($hZoomBuffer, (Paint.Width - $hZoomBuffer.Width * $fZoomEffect) / 2, (Paint.Height - $hZoomBuffer.Height * $fZoomEffect) / 2, $hZoomBuffer.Width * $fZoomEffect, $hZoomBuffer.Height * $fZoomEffect) + Draw.End + $fZoomEffect = 1 + $tmrZoom.Stop + Refresh + '$tmrZoom.Trigger + Endif + Endif + If $bShowControls Then $hViewLayer._Draw + Endif + +End + +Public Sub View_MouseWheel() + + Dim hCenter As MapPoint + Dim iMidViewX, iMidViewY As Integer + + If $bLock Then Return + + Draw.Begin($hZoomBuffer) + Draw.FillRect(0, 0, Draw.Width, Draw.Height, Color.Transparent) + $hmap.Draw + Draw.End + + If Mouse.Delta > 0 Then + _ZoomUp(Mouse.X, Mouse.Y) + $hMap.Center = Geo.PixelToMapPoint(Point($hMap.PixelBox.X + Mouse.X, $hMap.PixelBox.Y + Mouse.Y), $hmap.Zoom) + Else + + iMidViewX = $hView.ClientW / 2 + iMidViewY = $hView.ClientH / 2 + + + hCenter = $hmap.PixelToMapPointRel(Point(Mouse.x, Mouse.y)) + + _ZoomDown(Mouse.X, Mouse.Y) + + $hMap.Center = hCenter + hcenter = $hmap.PixelToMapPointRel(Point(iMidViewX - (Mouse.X - iMidViewX), iMidViewY - (Mouse.Y - iMidViewY))) + $hmap.Center = hcenter + + Endif + + $hView.Refresh + +End + +'' Saves actual MapView picture as file +'' - For file format and quality check +'' [http://gambaswiki.org/wiki/comp/gb.qt4/image/save] +' Public Sub Save(Path As String, Optional Quality As Integer) +' 'http://sourceforge.net/p/gambas/mailman/message/32083180/ +' +' Dim hPicture As New Picture($hView.W, $hView.H) +' Dim bControlState As Boolean = Me.ShowControls +' +' If bControlState = True Then Me.ShowControls = False +' +' Paint.Begin(hPicture) +' ' DrawMap() +' Paint.End() +' +' Me.ShowControls = bControlState +' +' If Exist(Path) Then +' Error.Raise("File already exists: " & Path) +' Else +' hPicture.Save(Path, Quality) +' Endif +' +' End + +Public Sub _ZoomUp(X As Integer, Y As Integer) + + $ZX = X + $ZY = Y + If $bAllowEffect Then + Draw.Begin($hZoomBuffer) + Draw.FillRect(0, 0, Draw.Width, Draw.Height, Color.Transparent) + $hmap.Draw + Draw.End + If $hmap.Zoom <= $hmap.MaxZoom Then + $iZoomWay = 1 + $bZoomEffect = True + $tmrZoom.Start + Endif + Endif + Inc $hMap.Zoom + +End + +Public Sub _ZoomDown(X As Integer, Y As Integer) + + $ZX = X + $ZY = Y + If $bAllowEffect Then + Draw.Begin($hZoomBuffer) + Draw.FillRect(0, 0, Draw.Width, Draw.Height, Color.Transparent) + $hmap.Draw + Draw.End + If $hmap.Zoom > 1 Then + $iZoomWay = -1 + $bZoomEffect = True + $tmrZoom.Start + Endif + Endif + Dec $hMap.Zoom + '$hmap.Center = $hmap.Center + +End + +Public Sub Map_Refresh() + + $hView.Refresh + +End + +Public Sub View_MouseDown() + + $hView.Mouse = Mouse.Pointing + $iX = Mouse.X + $iY = Mouse.Y + $pCurCenterPx = Geo.MapPointToPixel($hmap.Center, $hmap.Zoom) + $bShowInertia = False + $tmrOnMove.Stop + If $bShowControls Then $hViewLayer._MouseDown() + + 'Raise MouseDown + +End + +Public Sub View_MouseUp() + + Last.Mouse = Mouse.Default + If $bAllowEffect Then + If Abs($fSpeedx) > 4 Or If Abs($fSpeedY) > 4 Then $tmrOnMove.Start + Endif + If $bShowControls Then $hViewLayer._MouseUp() + + 'Raise MouseUp + +End + +Public Sub View_MouseMove() + + Dim hPix As Point + + If Mouse.Left And Not $bLock Then + + hPix = New Point($pCurCenterPx.X, $pCurCenterPx.Y) + + $fSpeedX = $tx - Mouse.X + $fSpeedY = $ty - Mouse.y + + hPix.X += $ix - Mouse.X + hPix.Y += $iY - Mouse.Y + $hmap.Center = Geo.PixelToMapPoint(hpix, $hmap.Zoom) + $iZoomWay = 0 + $hView.Refresh + Endif + $tx = Mouse.X + $ty = Mouse.y + If $bShowControls Then $hViewLayer._MouseMove() + 'Raise MouseMove + +End + +Public Sub View_Arrange() + + $hMap.Resize($hView.ClientW, $hView.ClientH) + $hZoomBuffer.Resize($hView.ClientW, $hView.ClientH) + $iZoomWay = 0 + $hmap.Refresh + $hView.Refresh + +End + +Private Function Lock_Read() As Boolean + + Return $bLock + +End + +Private Sub Lock_Write(Value As Boolean) + + $bLock = Value + +End + +Public Sub Refresh() + + $hView.Refresh + +End + +Private Function Border_Read() As Integer + + Return $hPan.Border + +End + +Private Sub Border_Write(Value As Integer) + + $hPan.Border = Value + +End + +Public Sub tmrZoom_Timer() + + 'Wait 3 + $hView.Refresh + +End + +Public Sub tmrOnMove_Timer() + + Dim hpix As Point + 'Print "triger" + hPix = Geo.MapPointToPixel($hmap.Center, $hmap.Zoom) + $fSpeedX *= $fInertia + $fSpeedY *= $fInertia + + If Abs($fSpeedX) < (1 - $fInertia) Or If Abs($fSpeedY) < (1 - $fInertia) Then + $tmrOnMove.stop + $bShowInertia = False + Endif + + hPix.X += $fSpeedX + hPix.Y += $fSpeedY + $hmap.Center = Geo.PixelToMapPoint(hpix, $hmap.Zoom) + $hView.Refresh + +End + +Private Function AllowEffect_Read() As Boolean + + Return $bAllowEffect + +End + +Private Sub AllowEffect_Write(Value As Boolean) + + $bAllowEffect = Value + If Not $bAllowEffect Then $iZoomWay = 0 + +End + +Private Function ShowControls_Read() As Boolean + + Return $bShowControls + +End + +Private Sub ShowControls_Write(Value As Boolean) + + $bShowControls = Value + +End + +' Private Function Mode_Read() As Integer +' +' +' +' End +' +' Private Sub Mode_Write(Value As Integer) +' +' +' +' End diff --git a/comp/src/gb.map/.src/Shapes/_ShapeItem.class b/comp/src/gb.map/.src/Shapes/_ShapeItem.class new file mode 100644 index 00000000..1125ce94 --- /dev/null +++ b/comp/src/gb.map/.src/Shapes/_ShapeItem.class @@ -0,0 +1,112 @@ +' Gambas class file + +''' This class define the Shape Item. + +'Export + +Property Read Key As String '' Returns his Item's Key name +Property Selected As Boolean '' Returns or sets if this Item is selected +'Property Color As Integer +Property Bounds As MapBounds +Private $sKey As String +Private $bSelected As Boolean = False +Private $hBounds As MapBounds +'Private $fLineStyle As Integer +Public Type As Integer '' Returns or sets this Item's type (Point, MultiPoint, Polyline, Polygon, Circle) +Public Points As Object '' Returns or sets the MapPoints that make up this Item +Public Center As MapPoint '' Returns or sets the Item's center in MapPoint +Public Radius As Float '' Returns or sets this Item radius, if circle +'Public Bounds As New MapBounds +Public {Color} As Integer = -1 '' Returns or sets this Item Color, or outline color, if applicable +Public FillColor As Integer = -1 '' Returns or sets this Item Fill Color, if applicable +Public LineWidth As Integer = -1 '' Returns or sets this Item Line Width, if applicable +Public LineStyle As Integer = -1 '' Returns or sets this Item's Line Style, if applicable +Public Image As Image '' Returns or sets this Item's Icon. If Color is defined, Icon will be colorized. + +Event Select +Public Sub _New(Key As String) + + $sKey = Key + $hBounds = New MapBounds + +End + +Public Function Contains(hMapPoint As MapPoint) As Boolean + + If $hBounds.Lon < hMapPoint.Lon And $hBounds.lon2 > hMapPoint.Lon Then + If $hBounds.Lat > hMapPoint.Lat And $hBounds.Lat2 < hMapPoint.Lat Then + Return True + Endif + Endif + + Return False + +End + +Public Function Near(hMapPoint As MapPoint, iZoom As Integer, Padding As Integer) As Boolean + + Dim hTLPoint, hBRPoint As Point + Dim hPoint As Point = Geo.MapPointToPixel(hMapPoint, iZoom) + + hTLPoint = Geo.MapPointToPixel($hBounds.TopLeft, iZoom) + hTLPoint.X -= Padding + hTLPoint.Y -= Padding + + hBRPoint = Geo.MapPointToPixel($hBounds.BottomRight, iZoom) + hBRPoint.X += Padding + hBRPoint.Y += Padding + + Return Rect(hTLPoint.X, hTLPoint.Y, hBRPoint.x, hBRPoint.Y).Contains(hPoint.X, hPoint.Y) + +End + +' Public Sub Delete() +' +' Dim hParent As _MapShape = Object.Parent(Me) +' +' hParent.Remove(Key) +' +' End + +Private Function Selected_Read() As Boolean + + Return $bSelected + +End + +Private Sub Selected_Write(Value As Boolean) + + $bSelected = Value + Raise Select + +End + +Private Function Key_Read() As String + + Return $sKey + +End + +Private Function Bounds_Read() As MapBounds + 'just a workaround to relocate circles + If Type = 33 Then + Dim P1, P2, P3, P4 As MapPoint + P1 = MapPoint.From(Center, 0, Radius) + P2 = MapPoint.From(Center, 90, Radius) + P3 = MapPoint.From(Center, 180, Radius) + P4 = MapPoint.From(Center, 270, Radius) + + $hBounds.TopLeft = MapPoint(P1.Lat, P4.Lon) + $hBounds.BottomRight = MapPoint(P3.Lat, P2.Lon) + Endif + + Return $hBounds + +End + +Private Sub Bounds_Write(Value As MapBounds) + + 'If Not $hBounds Then $hBounds = New MapBounds + $hBounds = Value + +End diff --git a/comp/src/gb.map/.src/Sprite.class b/comp/src/gb.map/.src/Sprite.class new file mode 100644 index 00000000..48e7c06f --- /dev/null +++ b/comp/src/gb.map/.src/Sprite.class @@ -0,0 +1,119 @@ +' Gambas class file + +Private $hRect As Rect +Property {Image} As Image +Property X As Integer +Property Y As Integer +Property Height As Integer +Property Width As Integer +Property Read {Rect} As Rect + +Private $hImage As Image + +Public Sub _new(hImage As Image, Optional hRect As Rect) + + $hImage = hImage + + If hRect Then + $hRect = hRect + Else + $hRect = Rect(0, 0, $hImage.Width, $hImage.Height) + Endif + +End + +Public Sub Draw() + + Draw.Image($hImage, $hRect.x, $hRect.Y, $hRect.Width, $hRect.Height) + +End + + + +Private Function Image_Read() As Image + + Return $hImage + +End + +Private Sub Image_Write(Value As Image) + + $hImage = Value + +End + +Public Sub Move(X As Integer, Y As Integer, Optional Width As Integer, Optional Height As Integer) + + $hRect.X = X + $hRect.Y = Y + If Width Then $hRect.Width = Width + If Height Then $hRect.Y = Height + +End + +Public Sub Resize(Width As Integer, Height As Integer) + + + $hRect.Width = Width + $hRect.Height = Height + +End + + + +Private Function X_Read() As Integer + + Return $hRect.X + +End + +Private Sub X_Write(Value As Integer) + + $hRect.X = Value + +End + +Private Function Y_Read() As Integer + + Return $hRect.Y + +End + +Private Sub Y_Write(Value As Integer) + + $hRect.Y = Value + +End + +Private Function Height_Read() As Integer + + Return $hRect.Height + +End + +Private Sub Height_Write(Value As Integer) + + $hRect.Height = Value + +End + +Private Function Width_Read() As Integer + + Return $hRect.Width + +End + +Private Sub Width_Write(Value As Integer) + + $hRect.Width = Value + +End + + + +Private Function Rect_Read() As Rect + + Return $hRect + +End + diff --git a/comp/src/gb.map/.src/Tests/FMain.class b/comp/src/gb.map/.src/Tests/FMain.class new file mode 100644 index 00000000..18536b4e --- /dev/null +++ b/comp/src/gb.map/.src/Tests/FMain.class @@ -0,0 +1,193 @@ +' Gambas class file + +Private hMap As New Map As "LensMap" + +Private $aNames As New String[] + +Private $iMX As Integer +Private $iMY As Integer +Private $bLens As Boolean +Private hPicture As Picture + +Public Sub _new() + + Dim o As Object + Dim hmp As MapPoint + 'Dim hShapes As Shapes = Shapes.LoadKml("parcellaire.kml") + + hPicture = New Picture(200, 200) + + MapView1.Map.AddTile("GoogleMap", "https://khms{s}.google.fr/kh/v={version}&src=app&x={x}&y={y}&z={z}&s=Galile", ["version": "162"], "GMapCache").SubDomains = ["0", "1", "2"] + MapView1.Map["GoogleMap"].Visible = False + + With MapView1.Map.AddTile("OpenStreet", "http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", Null) + '.Opacity = 0.5 + .Copyright = "OpenStreetMap contributors" + .Opacity = 0.5 + End With + 'MapView1.Map.AddShape("test") + MapView1.Map.AddTile("Virtual Earth", "http://ecn.dynamic.t{s}.tiles.virtualearth.net/comp/ch/{q}?mkt=fr-fr&it=G,VE,BX,L,LA&shading=hill&n=z&cb=1").SubDomains = ["0", "1", "2"] + 'Map for lens + hmap.AddTile("GoogleMap", "https://khms{s}.google.fr/kh/v={version}&src=app&x={x}&y={y}&z={z}&s=Galile", ["version": "141"]).SubDomains = ["0", "1", "2"] + 'hmap.Padding = 256 + hmap.Resize(200, 200) + + MapView1.Map.AddShape("NewShape") + hmp = Proj("epsg:3946").TransformMPoint(Proj("epsg:4326"), MapPoint(5152182, 1442096)) + 'hmp = Proj("epsg:3946").TransformMPoint(Proj("epsg:4326"), MapPoint(-2.4500, 45.0000)) + MapView1.Map!NewShape.AddPoint("archiac", hmp) + MapView1.Map!NewShape.AddPoint("archiac2", MapPoint(0, 0)) + Print MapView1.Map!NewShape[0].Center.Lat + 'MapView1.Map["NewShape"].Points = LoadShapes() +'MapView1.ShowControls = False + + 'Manage the list of layers + For Each o In MapView1.Map + $aNames.Add(o.Name) + Next + GridView1.Rows.count = $aNames.Count + GridView1.Columns.Count = 2 + GridView1.Columns[0].Width = 32 + GridView1.Rows.Height = 32 + +End + +Public Sub Form_Open() + +End + +Public Sub MapView1_MouseDown() + Dim hMapPoint As New MapPoint[][] + 'Print "mousedown" + If Mouse.Control Then + + hmap.Zoom = MapView1.map.Zoom + SpinBox1.Value + $bLens = True + hmap.Center = Geo.PixelToMapPoint(point(MapView1.Map.PixelBox.X + Mouse.X, MapView1.Map.PixelBox.Y + Mouse.y), MapView1.Map.Zoom) + MapView1.Lock = True + MapView1.Refresh + Endif + + If Mouse.Shift Then + If MapView1.Map["NewShape"].Count = 0 Then + hMapPoint.Add([Geo.PixelToMapPoint(point(MapView1.Map.PixelBox.X + Mouse.X, MapView1.Map.PixelBox.Y + Mouse.y), MapView1.Map.Zoom)]) + MapView1.Map["NewShape"].AddPolygon("mypoly", hMapPoint) + MapView1.Map["NewShape"]["mypoly"].Selected = True + Else + MapView1.Map["NewShape"]["mypoly"].Points[0].Add(Geo.PixelToMapPoint(point(MapView1.Map.PixelBox.X + Mouse.X, MapView1.Map.PixelBox.Y + Mouse.y), MapView1.Map.Zoom)) + 'MapView1.Map["NewShape"]["mypoly"].Center = Shapes.GetCenter(MapView1.Map["NewShape"]["mypoly"].Points[0]) + MapView1.Map["NewShape"].Refresh + Endif + 'MapView1.Map["NewShape"].Points.AddPoint(Geo.PixelToMapPoint(point(MapView1.Map.PixelBox.X + Mouse.X, MapView1.Map.PixelBox.Y + Mouse.y), MapView1.Map.Zoom)) + MapView1.Refresh + Endif + +End + +Public Sub MapView1_MouseMove() + + $iMX = Mouse.X + $iMY = Mouse.Y + Me.Text = Geo.PixelToMapPoint(Point(MapView1.Map.PixelBox.x + Mouse.x, MapView1.Map.PixelBox.y + Mouse.y), MapView1.Map.Zoom).Lon + If $bLens Then + hmap.Center = Geo.PixelToMapPoint(Point(MapView1.Map.PixelBox.X + Mouse.X, MapView1.Map.PixelBox.Y + Mouse.y), MapView1.Map.Zoom) + + MapView1.Refresh + Endif + + +End + +Public Sub MapView1_MouseUp() + + If $bLens Then + $bLens = False + MapView1.Lock = False + MapView1.Refresh + Endif + + +End + +Public Sub MapView1_Draw() + + If $bLens Then + Paint.Begin(Draw.Device) + 'Draw the lens temporary picture + Draw.Begin(hPicture) + Draw.FillRect(0, 0, hPicture.Width, hPicture.Height, Color.DarkGray) + hmap.Draw + Draw.End + 'And put it in a circle with a blue border + Paint.Brush = Paint.Image(hPicture.Image, $iMX - 100, $iMY - 100) + Paint.Arc($iMX, $iMY, 100) + Paint.Fill(True) + Paint.Brush = Paint.Color(Color.Blue) + Paint.Stroke + Paint.End + Endif +' ListBox1.Clear +' ListBox1.List = MapView1.Map["GoogleMap"].$aStack +'Me.Text = MapView1.Map["GoogleMap"].CountActiveClients() +End + +Public Sub GridView1_Data(Row As Integer, Column As Integer) + + Select Case Column + Case 0 + Last.Data.Picture = IIf(MapView1.Map[$aNames[row]].Visible, Picture["icon:/22/ok"], Picture["icon:/22/cancel"]) + + Case 1 + Last.Data.Text = $aNames[row] + End Select + +End + +Public Sub GridView1_MouseUp() + + If Last.column = 0 Then MapView1.Map[GridView1[Last.row, 1].Text].Visible = Not MapView1.Map[GridView1[Last.row, 1].Text].Visible + GridView1.Refresh + +End + +Public Sub Button1_Click() + + MapView1.Map.Center = MapPoint(Geo.SexToDec("45°31'33,33''N"), Geo.SexToDec("0°18'43,50''W")) + Print Geo.SexToDec("45°31'33,33''N") + MapView1.Map.Zoom = 17 + MapView1.Refresh + +End + +Public Sub LensMap_Refresh() + 'Resfresh the view when the Lensmap say it need to be refreshed + 'This call the MapView_Draw Event then so the lens is refreshed too + MapView1.Refresh + +End + + +Public Sub SpinBox1_Change() + 'Change the lens zoom + hmap.Zoom = MapView1.map.Zoom + SpinBox1.Value + +End + +Public Sub GridView1_Click() + + + +End + +Public Sub Panel3_MouseDown() + + + +End + + +Public Sub Panel1_MouseDown() + + + +End diff --git a/comp/src/gb.map/.src/Tests/FMain.form b/comp/src/gb.map/.src/Tests/FMain.form new file mode 100644 index 00000000..c16ed2f0 --- /dev/null +++ b/comp/src/gb.map/.src/Tests/FMain.form @@ -0,0 +1,35 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,97,64) + Arrangement = Arrange.Vertical + { Panel1 HBox + MoveScaled(-1,-5,97,55) + Expand = True + { MapView1 MapView + MoveScaled(12,10,16,16) + Expand = True + } + { GridView1 GridView + MoveScaled(72,11,25,35) + Mode = Select.Single + Grid = False + } + } + { Panel2 Panel + MoveScaled(8,55,87,6) + { SpinBox1 SpinBox + MoveScaled(14,0,19,4) + MaxValue = 3 + Value = 1 + } + { Button1 Button + MoveScaled(36,1,49,4) + Text = ("Maison") + } + { Label1 Label + MoveScaled(1,1,12,3) + Text = ("Lens") + } + } +} diff --git a/comp/src/gb.map/.src/Tests/FTestWmts.class b/comp/src/gb.map/.src/Tests/FTestWmts.class new file mode 100644 index 00000000..30925f71 --- /dev/null +++ b/comp/src/gb.map/.src/Tests/FTestWmts.class @@ -0,0 +1,24 @@ +' Gambas class file + +Public Sub Form_Open() + + With MapView1.Map.AddTile("geo", "http://gpp3-wxs.ign.fr/5wp1szpgg6loqy21tpi5wmv8/geoportail/wmts") + + .WMSArgs["SERVICE"] = "WMTS" + .WMSArgs["REQUEST"] = "GetTile" + .WMSArgs["VERSION"] = "1.0.0" + .WMSArgs["LAYER"] = "ORTHOIMAGERY.ORTHOPHOTOS" + .WMSArgs["STYLE"] = "normal" + .WMSArgs["TILEMATRIXSET"] = "PM" + .WMSArgs["TILEMATRIX"] = "{z}" + .WMSArgs["TILEROW"] = "{y}" + .WMSArgs["TILECOL"] = "{x}" + .WMSArgs["FORMAT"] = "image/jpeg" + + End With + +End + +Public Sub MapView1_MouseDown() + +End diff --git a/comp/src/gb.map/.src/Tests/FTestWmts.form b/comp/src/gb.map/.src/Tests/FTestWmts.form new file mode 100644 index 00000000..22985b86 --- /dev/null +++ b/comp/src/gb.map/.src/Tests/FTestWmts.form @@ -0,0 +1,8 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,64,64) + { MapView1 MapView + MoveScaled(2,5,60,43) + } +} diff --git a/comp/src/gb.map/.src/Tests/Form1.class b/comp/src/gb.map/.src/Tests/Form1.class new file mode 100644 index 00000000..c930991d --- /dev/null +++ b/comp/src/gb.map/.src/Tests/Form1.class @@ -0,0 +1,23 @@ +' Gambas class file + +Private $Map As New Map As "Map" +Public Sub Form_Open() +$Map.AddTile("OpenStreet", "http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", Null, "os") +$Map.AddShape("MyShape") +$Map!MyShape.AddPolygon("zone1", [[MapPoint(45.70534, -0.358086), MapPoint(45.709176, -0.314312), MapPoint(45.67968, -0.313454), MapPoint(45.674403, -0.36375), MapPoint(45.689634, -0.379372)]]) +$Map!MyShape!zone1.Color = Color.Red +PictureBox1.Picture = $Map.Grab($Map!MyShape!zone1.Bounds, PictureBox1.Width, PictureBox1.Height, 0).Picture +PictureBox2.Picture = $Map.Grab($Map!MyShape!zone1.Bounds, PictureBox2.Width, PictureBox2.Height, 0).Picture +PictureBox3.Picture = $Map.Grab($Map!MyShape!zone1.Bounds, PictureBox3.Width, PictureBox3.Height, 0).Picture +PictureBox4.Picture = $Map.Grab($Map!MyShape!zone1.Bounds, PictureBox4.Width, PictureBox4.Height, 0).Picture +PictureBox5.Picture = $Map.Grab($Map!MyShape!zone1.Bounds, PictureBox5.Width, PictureBox5.Height, 0).Picture +End + + +Public Sub Map_Draw() + Dim hPoint As Point + hPoint = Geo.MapPointToPixel($Map!MyShape!zone1.Center, $Map.Zoom) + Draw.Foreground = Color.Red + Draw.Text("Cognac", hPoint.x - $Map.PixelBox.x, hPoint.Y - $Map.PixelBox.Y) + +End diff --git a/comp/src/gb.map/.src/Tests/Form1.form b/comp/src/gb.map/.src/Tests/Form1.form new file mode 100644 index 00000000..ff14e153 --- /dev/null +++ b/comp/src/gb.map/.src/Tests/Form1.form @@ -0,0 +1,21 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,132,67) + { PictureBox1 PictureBox + MoveScaled(6,3,8,7) + Background = &H7F00FF& + } + { PictureBox2 PictureBox + MoveScaled(10,13,24,19) + } + { PictureBox3 PictureBox + MoveScaled(48,19,62,44) + } + { PictureBox4 PictureBox + MoveScaled(6,31,8,33) + } + { PictureBox5 PictureBox + MoveScaled(30,4,101,8) + } +} diff --git a/comp/src/gb.map/.src/Tests/Form2.class b/comp/src/gb.map/.src/Tests/Form2.class new file mode 100644 index 00000000..e4bb7154 --- /dev/null +++ b/comp/src/gb.map/.src/Tests/Form2.class @@ -0,0 +1,96 @@ +' Gambas class file + +Public Sub Form_Open() + Dim hClient As New HttpClient + Dim _Lay As _MapTile + Dim cArgs As New Collection + Dim hBounds As New MapBounds + Dim idep, iend As Integer + Dim stext As String + Dim a As String[] + Dim hproj As Proj = Proj("epsg:4326") + hClient.Async = False + hClient.CookiesFile = Temp + hClient.UpdateCookies = True + + hClient.URL = "http://www.cadastre.gouv.fr/scpc/rechercherPlan.do" + hClient.Get() + hClient.URL = "http://www.cadastre.gouv.fr/scpc/listerCommune.do?codeDepartement=017&keepVolatileSession=&listeCommuneNatValeurVueFilterField=&listeCommuneNatValeurVueFilterValue=&offset=500" + hClient.Get() + hClient.URL = "http://www.cadastre.gouv.fr/scpc/afficherCarteCommune.do?c=9B016&keepVolatileSession" + hClient.Get() + 'récupération de la zone + ' + sText = Replace(hClient.Peek(), "\t", "") + + idep = InStr(sText, "GeoBox(") + 7 + iEnd = InStr(sText, ")", idep) + + + a = Split(Replace(Mid(sText, idep, iend - idep), "\n", "")) + + hBounds = Proj("IGNF:RGF93CC46").TransformMBounds(Proj("epsg:4326"), MapBounds(MapPoint(CFloat(a[1]), CFloat(a[0])), MapPoint(CFloat(a[3]), CFloat(a[2])))) + + + + + MapView1.Map.AddTile("GoogleMap", "https://khms{s}.google.fr/kh/v={version}&src=app&x={x}&y={y}&z={z}&s=Galile", ["version": "134"]).SubDomains = ["0", "1", "2"] + MapView1.Map.AddShape("mysh") + + MapView1.Map!mysh.Addpoint("pp", hBounds.NorthEast) + + MapView1.Map!mysh.Addpoint("pp2", hBounds.SouthWest) + MapView1.Map.Zoom = 15 + MapView1.Map.Center = hBounds.NorthEast + + + + _Lay = MapView1.Map.AddTile("CAD", "http://www.cadastre.gouv.fr/scpc/wms") + + + + With _Lay + .WMSProjection = "IGNF:RGF93CC46" + .SetCoockieFile(hClient.CookiesFile) + .UseWebMapService = True + .MaxBounds = hBounds + .WMSArgs!version = "1.1" + .WMSArgs!request = "GetMap" + .WMSArgs!layers = "CDIF:LS3,CDIF:LS2,CDIF:LS1,CDIF:PARCELLE,CDIF:NUMERO,CDIF:PT3,CDIF:PT2,CDIF:PT1,CDIF:LIEUDIT,CDIF:SUBSECTION,CDIF:SECTION,CDIF:COMMUNE" + .WMSArgs!format = "image/png" + .WMSArgs!width = "256" + .WMSArgs!height = "256" + .WMSArgs!exception = "application/vnd.ogc.se_inimage" + .WMSArgs!styles = "LS3_90,LS2_90,LS1_90,PARCELLE_90,NUMERO_90,PT3_90,PT2_90,PT1_90,LIEUDIT_90,SUBSECTION_90,SECTION_90,COMMUNE_90" + '.WMSArgs!bbox = "{lon2},{lat},{lon},{lat2}" + .WMSArgs!bbox = "{lon},{lat2},{lon2},{lat}" + + + End With + +End + + +Public Sub Button1_Click() + + MapView1.Map.Center = MapPoint(Geo.SexToDec("45°31'33,33''N"), Geo.SexToDec("0°18'43,50''W")) + MapView1.Map.Zoom = 17 + MapView1.Refresh + +End + +Public Sub Slider1_Change() + + MapView1.Map!CAD.Opacity = Last.Value / 100 + +End + +Public Sub MapView1_MouseUp() + Dim hMapShape As _MapShape + Dim hShape As _ShapeItem + hMapShape = MapView1.map!mysh + hShape = hMapShape.Find(MapView1.Map.PixelToMapPointRel(Point(Mouse.x, Mouse.Y))) + + If hShape Then Print hShape.Key + +End diff --git a/comp/src/gb.map/.src/Tests/Form2.form b/comp/src/gb.map/.src/Tests/Form2.form new file mode 100644 index 00000000..c1a20eef --- /dev/null +++ b/comp/src/gb.map/.src/Tests/Form2.form @@ -0,0 +1,17 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,173,101) + Arrangement = Arrange.Vertical + { MapView1 MapView + MoveScaled(5,4,54,50) + Expand = True + } + { Button1 Button + MoveScaled(31,53,12,8) + Text = ("Button1") + } + { Slider1 Slider + MoveScaled(5,82,133,5) + } +} diff --git a/comp/src/gb.map/.src/Tests/Form3.class b/comp/src/gb.map/.src/Tests/Form3.class new file mode 100644 index 00000000..41ed886d --- /dev/null +++ b/comp/src/gb.map/.src/Tests/Form3.class @@ -0,0 +1,42 @@ +' Gambas class file + +Public Sub Form_Open() + + Dim hLay As Object + Map.Debug = True + ' With MapView1.Map.AddTile("geo", "http://gpp3-wxs.ign.fr/{API}/geoportail/wmts", ["API": "tyujsdxmzox31ituc2uw0qwl"]) + ' .UseWebMapService = True + ' .WMSArgs!service = "WMTS" + ' .WMSArgs!version = "1.0.0" + ' .WMSArgs!request = "GetTile" + ' .WMSArgs!layer = "ORTHOIMAGERY.ORTHOPHOTOS" + ' .WMSArgs!style = "normal" + ' .WMSArgs!format = "image/jpeg" + ' .WMSArgs!tilematrixset = "PM" + ' .WMSArgs!tilematrix = "{z}" + ' .WMSArgs!tilerow = "{x}" + ' .WMSArgs!tilecol = "{y}" + ' + ' End With + With MapView1.Map.AddTile("geo", "http://v2.suite.opengeo.org/geoserver/gwc/service/wmts/", ["API": "tyujsdxmzox31ituc2uw0qwl"]) + .UseWebMapService = True + .WMSArgs!service = "WMTS" + .WMSArgs!version = "1.0.0" + .WMSArgs!request = "GetTile" + .WMSArgs!layer = "medford:hydro" + '.WMSArgs!style = "normal" + .WMSArgs!format = "image/png" + .WMSArgs!tilematrixset = "EPSG:900913" + .WMSArgs!tilematrix = "{z}" + .WMSArgs!tilerow = "{x}" + .WMSArgs!tilecol = "{y}" + + End With + +End + +Public Sub MapView1_MouseDown() + + + +End diff --git a/comp/src/gb.map/.src/Tests/Form3.form b/comp/src/gb.map/.src/Tests/Form3.form new file mode 100644 index 00000000..6a54b077 --- /dev/null +++ b/comp/src/gb.map/.src/Tests/Form3.form @@ -0,0 +1,8 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,64,64) + { MapView1 MapView + MoveScaled(6,9,46,36) + } +} diff --git a/comp/src/gb.map/.src/Tests/Form4.class b/comp/src/gb.map/.src/Tests/Form4.class new file mode 100644 index 00000000..7f9fea47 --- /dev/null +++ b/comp/src/gb.map/.src/Tests/Form4.class @@ -0,0 +1,75 @@ +' Gambas class file + +Private hMap As New Map +Private hImage As Image +'Private zz As New _ShapeItem +Public Sub Form_Open() +Dim hbound As MapBounds + 'hMap.AddTile("gg", "https://khms{s}.google.fr/kh/v={version}&src=app&x={x}&y={y}&z={z}&s=Galile", ["version": "145"]).SubDomains = ["0", "1", "2"] + 'hImg = Scanners["hpaio:/net/HP_LaserJet_MFP_M426fdn?ip=192.168.1.25"].Scan() + + 'MapView1.Map.AddTile("gmap", "https://khms0.google.com/kh/v={version}?x={x}&y={y}&z={z}", ["version": "821"]).Copyright = "google" + + 'Authenticated proxy settings bellow + ' MapView1.Map.Proxy.Auth = Net.AuthNone 'Net.AuthBasic + ' MapView1.Map.Proxy.Type = Net.ProxyHTTP + ' MapView1.Map.Proxy.Host = "" + ' MapView1.Map.Proxy.User = "" + ' MapView1.Map.Proxy.Password = "" + + 'Storing tiles elsewhere + 'MapView1.Map.DefaultCache = "/home/tmp" + + MapView1.Map.AddTile("OpenStreetMap", "http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", Null, "OpenStreetMap1").Copyright = "© OpenStreetMap contributors" + MapView1.Map.AddTile("NOAA", "https://tileservice.charts.noaa.gov/tiles/50000_1/{z}/{x}/{y}.png",, "NOAA") ', ["projection": "EPSG:3857"]) + 'MapView1.Map.AddTile("NOAA", "https://tileservice.charts.noaa.gov/tiles/13003_1/{z}/{x}/{y}.png", ["projection": "EPSG:3857", "displayProjection": " EPSG: 4326 "]) + '" http: / / tileservice.charts.noaa.gov / tiles / 50000 _1 / {z} / {x} / {y}.png ").SubDomains = [" 0 ", " 1 ", " 2 "]" + MapView1.Map.GetTile("OpenStreetMap").Opacity = 0.3 + MapView1.Map.Center = MapPoint(48.866667, 2.333333) + + 'MapView1.Map.GetTile("OpenStreetMap").ClearCache(10) + + MapView1.Map.Zoom = 10 + MapView1.Map.AddShape("Shape") + MapView1.Map.GetShape("Shape").Opacity = 0.5 + MapView1.Map.GetShape("Shape").LineStyle = Line.Dash + + MapView1.Map.GetShape("Shape").AddPoint("point 1", MapPoint(48.866667, 2.333333)) + MapView1.Map.GetShape("Shape").AddPoint("point 2", MapPoint(48.866667, 2.533333)).Selected = False + MapView1.Map.GetShape("Shape").AddPoint("point 3", MapPoint(48.866667, 2.533333), Color.Yellow, Image.Load("plus.png")) + + Dim tmp1 As New MapPoint[] + Dim tmp2 As New MapPoint + tmp1 = [MapPoint(48.866667, 2.333333), MapPoint(48.866667, 2.433333), MapPoint(48.966667, 2.433333), MapPoint(48.966667, 2.233333)] + tmp2 = MapPoint.GetCenter(tmp1) + + MapView1.Map.GetShape("Shape").AddMultipoint("multipoint1", tmp1, Color.green, Image.Load("plus.png")) + ' + MapView1.Map.GetShape("Shape").AddPolyLine("poly1", tmp1, Color.Yellow, 4, Line.DashDotDot) + MapView1.Map.GetShape("Shape").AddCircle("cir1", tmp2, 5000, Color.green, 4, Line.dot, Color.Transparent) + MapView1.Map.GetShape("Shape").AddCircle("cir2", tmp2, 2500, Color.red, 4, Line.dash, Color.Transparent) + MapView1.Map.GetShape("Shape").AddPoint("central point", tmp2) + MapView1.Map.GetShape("Shape").GetItem("poly1").Selected = True + + ' MapView1.Map.GetShape("Shape").AddCircle("cir", MapPoint(48.866667, 2.333333), 2000) ', Color.Red, 2, Color.Transparent) + ' MapView1.Map.GetShape("Shape").GetItem("cir").center = MapPoint(48.866667, 2.433333) + + 'MapView1.Map + ' MapView1.Map["Shape"].AddPoint("p", MapPoint(48.866667, 2.333333)) + ' MapView1.Map["Shape"].AddPoint("p2", MapPoint(48.866222, 2.360583), Color.Green, Image.Load("cursor.png")) + 'himage = hMap.Grab(hMap.Bounds, 200, 200, 17) + + Print MapPoint(48.866667, 2.333333).Distance(MapPoint(48.866667, 2.333333), MapPoint(48.866222, 2.360583)) + 'hbound = MapView1.Map["Shape"]["cir"].Bounds + 'Print MapPoint.Distance(hbound.TopLeft, MapPoint(hbound.Top, hbound.Right)) + + Debug "Shape count: " & MapView1.Map["Shape"].Count +End + + +Public Sub DrawingArea1_Draw() + + + 'Draw.Image(himage, 0, 0) + +End diff --git a/comp/src/gb.map/.src/Tests/Form4.form b/comp/src/gb.map/.src/Tests/Form4.form new file mode 100644 index 00000000..d714744c --- /dev/null +++ b/comp/src/gb.map/.src/Tests/Form4.form @@ -0,0 +1,10 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,64,64) + Arrangement = Arrange.Fill + { MapView1 MapView + MoveScaled(2,2,56,56) + AllowEffect = False + } +} diff --git a/comp/src/gb.map/.src/Tests/Form5.class b/comp/src/gb.map/.src/Tests/Form5.class new file mode 100644 index 00000000..6b585fb2 --- /dev/null +++ b/comp/src/gb.map/.src/Tests/Form5.class @@ -0,0 +1,28 @@ +' Gambas class file + + + + + Public Sub _new() + +End + +Public Sub Form_Open() +Dim hTile As _mapTile +Map.Debug = True +hTile = Mp.Map.AddTile("tile", "https://gpp3-wxs.ign.fr/5wp1szpgg6loqy21tpi5wmv8/geoportail/wmts") +hTile.UseWebMapService = True +hTile.WMSArgs!SERVICE = "WMTS" +hTile.WMSArgs!REQUEST = "GetTile" +hTile.WMSArgs!VERSION = "1.0.0" + hTile.WMSArgs!LAYER = "ORTHOIMAGERY.ORTHOPHOTOS" + hTile.WMSArgs!STYLE = "normal" + hTile.WMSArgs!TILEMATRIXSET = "PM" + hTile.WMSArgs!TILEMATRIX = "10" + hTile.WMSArgs!TILEROW = "{x}" + hTile.WMSArgs!TILECOL = "{y}" + hTile.WMSArgs!FORMAT = "image/jpeg" +End + + + diff --git a/comp/src/gb.map/.src/Tests/Form5.form b/comp/src/gb.map/.src/Tests/Form5.form new file mode 100644 index 00000000..ee87c340 --- /dev/null +++ b/comp/src/gb.map/.src/Tests/Form5.form @@ -0,0 +1,8 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,64,64) + { mp MapView + MoveScaled(9,3,61,62) + } +} diff --git a/comp/src/gb.map/.src/Tests/Form6.class b/comp/src/gb.map/.src/Tests/Form6.class new file mode 100644 index 00000000..67fa2032 --- /dev/null +++ b/comp/src/gb.map/.src/Tests/Form6.class @@ -0,0 +1,40 @@ +' Gambas class file + + +Public Sub Form_Open() + + Dim hPolyLine As New MapPoint[] + MapView1.Map.AddTile("GoogleMap", "https://khms{s}.google.fr/kh/v={version}&src=app&x={x}&y={y}&z={z}&s=Galile", ["version": "748"]).SubDomains = ["0", "1", "2"] + MapView1.Map["GoogleMap"].Visible = True + + + With MapView1.Map.AddShape("Poly") + + hPolyLine = [MapPoint(48.457454, -4.638139), MapPoint(51.123363, 2.217329), MapPoint(48.921609, 8.106001), MapPoint(43.833550, 7.666547), + MapPoint(42.487303, 3.008345), MapPoint(43.324192, -1.825640), MapPoint(48.457454, -4.638139)] + + + + .AddPolyLine("Section 1", hPolyLine) + .Color = Color.Red + .["Section 1"].Color = Color.Green + End With + + +With MapView1.Map["Poly"] + .AddCircle("pop", MapPoint(48.457454, -4.638139), 2000) + .Opacity = 1 +End With +With MapView1.Map["Poly"]["pop"] + .FillColor = Color.SetAlpha(Color.Yellow, 50) + .Color = Color.Red + .LineWidth = 2 +End With +MapView1.Refresh +End + +Public Sub MapView1_MouseDown() + + + +End diff --git a/comp/src/gb.map/.src/Tests/Form6.form b/comp/src/gb.map/.src/Tests/Form6.form new file mode 100644 index 00000000..8619b90a --- /dev/null +++ b/comp/src/gb.map/.src/Tests/Form6.form @@ -0,0 +1,10 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,64,64) + Arrangement = Arrange.Fill + { MapView1 MapView + MoveScaled(3,2,58,58) + AllowEffect = False + } +} diff --git a/comp/src/gb.map/.src/Tests/MMain.module b/comp/src/gb.map/.src/Tests/MMain.module new file mode 100644 index 00000000..5260a4d4 --- /dev/null +++ b/comp/src/gb.map/.src/Tests/MMain.module @@ -0,0 +1,24 @@ +' Gambas module file + +Public Sub Main() +Dim hpoint As MapPoint +hpoint = MapPoint(Geo.SexToDec("45°31'32.1''N"), Geo.SexToDec("0°18'33.8''W")) +' Dim ars As String[] +' Dim sPath As String = User.Home &/ ".cache/gb.map/GMapCache" +' Dim s As String +' Dim fSince As Float = 5 +' ars = Dir(sPath, "*.png", gb.File) +' +' +' 'Print CFloat(Date(-4801, 1, 1)) +' Print CFloat(Time(Now)) +' For Each s In ars +' Print Now, Stat(sPath &/ s).LastModified +' Print Int(CFloat(Now)), Int(CFloat(Stat(sPath &/ s).LastModified)) +' Print DateDiff(Now(), Stat(sPath &/ s).LastModified, gb.Day) +' Print Int(CFloat(Now)) - Int(CFloat(Stat(sPath &/ s).LastModified)) +' 'Print sPath &/ s, Stat(sPath &/ s).LastChange, Stat(sPath &/ s).LastModified +' +' Next +End + diff --git a/comp/src/gb.map/.src/Tools/Geo.module b/comp/src/gb.map/.src/Tools/Geo.module new file mode 100644 index 00000000..17d236a3 --- /dev/null +++ b/comp/src/gb.map/.src/Tools/Geo.module @@ -0,0 +1,131 @@ +' Gambas module file + +Fast +Export +'Private halfPixelGlobeSize As Integer + + Private $TileSize As Integer = 256 + Private $initialResolution As Float = 2 * Pi * 6378137 / $tileSize + Private $OriginShift As Float = 2 * Pi * 6378137 / 2.0 + + +Public Function MapPointToTile(hMapPoint As MapPoint, Zoom As Integer) As Point + + Dim n As Float = 2 ^ Zoom + Dim hPoint As New Point + + hPoint.X = Int((hMapPoint.Lon + 180.0) / 360.0 * n) + hPoint.y = Int((1.0 - Log(Tan(Rad(hMapPoint.Lat)) + (1 / Cos(Rad(hMapPoint.Lat)))) / Pi) / 2.0 * n) + Return hPoint +End + +Public Function MapPointToPixel(hMapPoint As MapPoint, Zoom As Integer) As Point + + Dim fRes As Float = $initialResolution / (2 ^ Zoom) + Dim fX, fY As Float + + 'Convert in Meters + fX = hMapPoint.lon * $OriginShift / 180.0 + fY = -(Log(Tan((90 + hMapPoint.lat) * Pi / 360.0)) / (Pi / 180.0)) * $OriginShift / 180.0 + 'Convert in Pixels + fX = (fX + $originShift) / fRes + fY = (fY + $originShift) / fRes + Return Point(fX, fY) + +End + + + Public Function PixelToMapPoint(hPoint As Point, Zoom As Integer) As MapPoint + Dim fX, fY As Float + Dim fRes As Float = $initialResolution / (2 ^ Zoom) + Dim mpPoint As New MapPoint + + 'Convert in Meters + fX = hPoint.x * fRes - $originShift + fY = hPoint.y * fRes - $originShift + + 'Convert in Latlon mappoint + mpPoint.Lon = (fX / $originShift) * 180.0 + mpPoint.Lat = (fY / $originShift) * 180.0 + + mpPoint.Lat = -(180 / Pi * (2 * ATan(Exp(mpPoint.Lat * Pi / 180.0)) - Pi / 2.0)) + Return mpPoint + + End + + Public Function PixelToTile(hPoint As Point) As Point + + Return Point(Int(Ceil(hPoint.X / $tileSize) - 1), Int(Ceil(hPoint.Y / $tileSize) - 1)) + +End + + +'' Convert a value in sexagesimal degree to decimal +'' ex: 45°53'36" -> 45,893333 +Public Function SexToDec(Value As String) As Float + + Dim fRet As Float + Dim ars As String[] + 'Lat + ars = Scan(Value, "*°*'*''*") + fRet = Val(ars[0]) + Val(ars[1]) / 60 + CFloat(ars[2]) / 3600 + If ars.Count = 4 Then + Select Case UCase(ars[3]) + Case "N", "E" + Return fRet + Case "S", "W", "O" + Return -fRet + End Select + Endif + Return fRet + +End + +'' Convert from Decimal to Sexagesimal degrees +'' ex:45,893333 -> 45°53'36" +'' Type 0=None 1=Lat 2=Lon +Public Function DecToSex(Value As Float, Type As Integer) As String + + Dim iDeg As Integer + Dim iMin As Integer + Dim fSec As Float + Dim sRet As String + + Select Case Type + Case 0 + + Case 1 + sret = IIf(Value > 0, "N", "S") + Case 2 + sret = IIf(Value > 0, "E", "W") + End Select + Value = Abs(Value) + iDeg = Int(Value) + fSec = Frac(Value) * 60 + iMin = Int(fSec) + fSec = Frac(fSec) * 60 + + sret = Subst("&1°&2'&3''", iDeg, iMin, Format(fSec, "0.##")) & sRet + Return sRet + +End + +Public Function TileBounds(X As Integer, Y As Integer, Zoom As Integer) As MapBounds + Dim hPointTL, hPointBR As Point + Dim mp, mp2 As MapPoint + + hPointTL = Point(X * $tileSize, Y * $tileSize) + hPointBR = Point(hPointTL.X + $tileSize, hPointTL.Y + $tileSize) + mp = PixelToMapPoint(hPointTL, zoom) + mp2 = PixelToMapPoint(hPointBR, zoom) + + Return MapBounds(PixelToMapPoint(hPointTL, zoom), PixelToMapPoint(hPointBR, zoom)) +End + +Public Function TileToMapPoint(X As Integer, Y As Integer, Zoom As Integer) As MapPoint + + Return PixelToMapPoint(x * $tileSize, y * $tileSize, zoom) + +End + + diff --git a/comp/src/gb.map/.src/Tools/MyPaint.class b/comp/src/gb.map/.src/Tools/MyPaint.class new file mode 100644 index 00000000..2c06e849 --- /dev/null +++ b/comp/src/gb.map/.src/Tools/MyPaint.class @@ -0,0 +1,18 @@ +' Gambas class file + +'Export +Static Public Sub Polygone(Pt As Integer[]) + + If pt.Count < 2 Then Return + Paint.MoveTo(pt[0], pt[1]) + For i As Integer = 2 To pt.Max Step 2 + Paint.LineTo(pt[i], pt[i + 1]) + Next + Paint.LineTo(pt[0], pt[1]) +End + +Static Public Sub RectangleRectF(hFbox As RectF) + + Paint.Rectangle(hFbox.x, hFbox.Y, hFbox.Right - hFbox.X, hFbox.Bottom - hFbox.Y) + +End diff --git a/comp/src/gb.map/.src/Tools/Proj.class b/comp/src/gb.map/.src/Tools/Proj.class new file mode 100644 index 00000000..3deb6214 --- /dev/null +++ b/comp/src/gb.map/.src/Tools/Proj.class @@ -0,0 +1,84 @@ +' Gambas class file + +' +Export +Property Read _strProj As String + +Private $strProj As String +Private LastTransformString As String +'Private hprocess As Process +Public Sub _new(sInit As String) + + $strProj = sInit + +End + +Static Public Function _call(sInit As String) As Proj + + Dim hProj As New Proj(sInit) + Return hProj + +End + +Public Function TransformPF(ProjTo As Proj, PF As PointF) As PointF + Dim sCom, sRes As String + Dim a As String[] + + If ProjTo._strProj <> LastTransformString Then + LastTransformString = ProjTo._strProj + + Endif + + sCom = Subst("cs2cs -f \"%f\" +init=&1 +to +init=&2< LastTransformString Then + LastTransformString = ProjTo._strProj + Endif + + sCom = Subst("cs2cs -f \"%f\" +init=&1 +to +init=&2< LastTransformString Then + ' LastTransformString = ProjTo._strProj + ' + ' Endif + ' + ' sCom = Subst("cs2cs -f \"%f\" +init=&1 +to +init=&2< $mpTopLeft.Lon And If p.Lon < $mpBottomRight.Lon Then + If p.Lat > $mpTopLeft.Lat And If p.Lat < $mpBottomRight.Lat Then + Return True + Endif + Endif + +End + +Public Function Contain(Bound As MapBounds) As Boolean + + If Bound.Lon > $mpTopLeft.Lon And If Bound.Lon2 < $mpBottomRight.Lon Then + If Bound.Lat > $mpTopLeft.Lat And If Bound.Lat2 < $mpBottomRight.Lat Then + Return True + Endif + Endif + +End + +Public Function Merge(Bound As MapBounds) As MapBounds + Dim hBound As New MapBounds + hBound.Lon = Min($mpTopLeft.Lon, Bound.Lon) + hBound.Lon2 = Max($mpBottomRight.Lon, Bound.Lon2) + hBound.Lat = Min($mpTopLeft.Lat, Bound.Lat) + hBound.Lat2 = Max($mpBottomRight.Lat, Bound.Lat2) + Return hBound + +End + + +Public Sub Collide(Bound As MapBounds) As Boolean + + 'If Abs(Me.Left - Bound.Left) < (Abs((Me.Right - Me.Left) + (Bound.Right - Bound.Left)) / 2) And Abs(Me.Top - Bound.top) < (Abs(Me.Bottom - Me.Top + Bound.Bottom - Bound.Top) / 2) Then +Dim xIntersect, yIntersect As Boolean + If Not (Min(Me.Left, Me.Right) > Max(Bound.Left, Bound.Right) Or Max(Me.Left, Me.Right) < Min(Bound.Left, Bound.Right)) Then xIntersect = True + If Not (Min(Me.Top, Me.Bottom) > Max(Bound.Top, Bound.Bottom) Or Max(Me.Top, Me.Bottom) < Min(Bound.Top, Bound.Bottom)) Then yIntersect = True + Return xIntersect And yIntersect + +End + + +Private Sub TopLeft_Write(Value As MapPoint) + + $mpTopLeft = Value + +End + +Private Sub BottomRight_Write(Value As MapPoint) + + $mpBottomRight = Value + +End + +Static Public Function _Call(NorthEast As MapPoint, SouthWest As MapPoint) As MapBounds + + Dim hBounds As New MapBounds + + hBounds.TopLeft = NorthEast + hBounds.BottomRight = SouthWest + Return hBounds +End + +Public Function ToString() As String + Dim as As String[] = [Me.lat, Me.lon, Me.lat2, Me.lon2] + Return as.join() + +End + diff --git a/comp/src/gb.map/.src/Types/MapPoint.class b/comp/src/gb.map/.src/Types/MapPoint.class new file mode 100644 index 00000000..c3f90d5e --- /dev/null +++ b/comp/src/gb.map/.src/Types/MapPoint.class @@ -0,0 +1,211 @@ +' Gambas class file + +Fast +Export +' WGS 84 ellipsoid +Static Private A As Float = 6378137 +Static Private B As Float = 6356752.3142 +Static Private F As Float = (1 / 298.257223563) + +Public Lat As Float +Public Lon As Float + +Public Sub _new(Optional Latitude As Float, Longitude As Float) + + Lat = Latitude + Lon = Longitude + +End + +Static Public Function _Call(Latitude As Float, Longitude As Float) As MapPoint + + Dim hLatLon As New MapPoint(Latitude, Longitude) + + Return hLatLon + +End + +'' Calculate geodesic distance (in m) between two points specified by latitude / longitude (in numeric degrees). +'' +'' from: Vincenty inverse formula - T Vincenty, "Direct and Inverse Solutions of Geodesics on the +'' Ellipsoid with application of nested equations", Survey Review, vol XXII no 176, 1975 +'' [http://www.ngs.noaa.gov/PUBS_LIB/inverse.pdf] +'' +'' © 2002-2008 Chris Veness [http://www.movable-type.co.uk/scripts/latlong-vincenty.html] +'' +Static Public Sub Distance(PointA As MapPoint, PointB As MapPoint) As Float + + Dim eLon1 As Float = PointA.Lon + Dim eLat1 As Float = PointA.Lat + Dim eLon2 As Float = PointB.Lon + Dim eLat2 As Float = PointB.Lat + + ' ' WGS 84 ellipsoid + ' Dim A As Float = 6378137 + ' Dim B As Float = 6356752.3142 + ' Dim F As Float = 1 / 298.257223563 + + Dim L As Float = Rad(eLon2 - eLon1) + Dim U1 As Float = ATan((1 - F) * Tan(Rad(eLat1))) + Dim U2 As Float = ATan((1 - F) * Tan(Rad(eLat2))) + Dim SinU1 As Float = Sin(U1), CosU1 As Float = Cos(U1) + Dim SinU2 As Float = Sin(U2), CosU2 As Float = Cos(U2) + + Dim Lambda As Float = L, LambdaP As Float = Pi(2) + Dim IterLimit As Integer = 20 + + Dim SinLambda, CosLambda As Float + Dim Sigma, SinSigma, CosSigma, Cos2SigmaM As Float + Dim SinAlpha, CosSqAlpha As Float + Dim C As Float + + Dim USq, AA, BB, DeltaSigma, S As Float + + While Abs(Lambda - LambdaP) > 1e-12 + + Dec IterLimit + If IterLimit < 0 Then Break + + SinLambda = Sin(Lambda) + CosLambda = Cos(Lambda) + SinSigma = Sqr((CosU2 * SinLambda) * (CosU2 * SinLambda) + (CosU1 * SinU2 - SinU1 * CosU2 * CosLambda) * (CosU1 * SinU2 - SinU1 * CosU2 * CosLambda)) + + ' co-incident points + If (SinSigma = 0) Then Return 0 + + CosSigma = SinU1 * SinU2 + CosU1 * CosU2 * CosLambda + Sigma = ATan2(SinSigma, CosSigma) + SinAlpha = CosU1 * CosU2 * SinLambda / SinSigma + CosSqAlpha = 1 - SinAlpha * SinAlpha + If CosSqAlpha = 0 Then + Cos2SigmaM = 0 + Else + Cos2SigmaM = CosSigma - 2 * SinU1 * SinU2 / CosSqAlpha + Endif + + C = F / 16 * CosSqAlpha * (4 + F * (4 - 3 * CosSqAlpha)) + LambdaP = Lambda + Lambda = L + (1 - C) * F * sinAlpha * (Sigma + C * SinSigma * (Cos2SigmaM + C * CosSigma * (-1 + 2 * Cos2SigmaM * Cos2SigmaM))) + + Wend + + If (IterLimit < 0) Then Return 0 'NaN - formula failed TO converge + + USq = CosSqAlpha * (A * A - B * B) / (B * B) + AA = 1 + USq / 16384 * (4096 + USq * (-768 + USq * (320 - 175 * USq))) + BB = USq / 1024 * (256 + USq * (-128 + USq * (74 - 47 * USq))) + DeltaSigma = BB * SinSigma * (Cos2SigmaM + BB / 4 * (CosSigma * (-1 + 2 * Cos2SigmaM * Cos2SigmaM) - BB / 6 * Cos2SigmaM * (-3 + 4 * SinSigma * SinSigma) * (-3 + 4 * Cos2SigmaM * Cos2SigmaM))) + S = B * AA * (Sigma - DeltaSigma) + Return S + +End + +'' Calculate destination point given starting point lat / long (numeric degrees), +'' bearing (numeric degrees) & distance (in m). +'' +'' from: Vincenty direct formula - T Vincenty, "Direct and Inverse Solutions of Geodesics on the +'' Ellipsoid with application of nested equations", Survey Review, vol XXII no 176, 1975" +'' [http://www.ngs.noaa.gov/PUBS_LIB/inverse.pdf] +'' +'' © 2002-2008 Chris Veness [http://www.movable-type.co.uk/scripts/latlong-vincenty-direct.html] +'' +Static Public Sub From(Point As MapPoint, (Bearing) As Float, (Distance) As Float) As MapPoint + + Dim eLon1 As Float = Point.Lon + Dim eLat1 As Float = Point.Lat + + ' WGS 84 ellipsoid + ' Dim A As Float = 6378137 + ' Dim B As Float = 6356752.3142 + ' Dim F As Float = 1 / 298.257223563 + + Dim S As Float = Distance + Dim Alpha1 As Float = Rad(Bearing) + Dim SinAlpha1 As Float = Sin(Alpha1), CosAlpha1 As Float = Cos(Alpha1) + + Dim TanU1 As Float = (1 - F) * Tan(Rad(eLat1)) + Dim CosU1 As Float = 1 / Sqr((1 + TanU1 * TanU1)) + Dim SinU1 As Float = TanU1 * CosU1 + Dim Sigma1 As Float = ATan2(TanU1, CosAlpha1) + Dim SinAlpha As Float = CosU1 * SinAlpha1 + Dim CosSqAlpha As Float = 1 - SinAlpha * SinAlpha + Dim USq As Float = CosSqAlpha * (A * A - B * B) / (B * B) + Dim AA As Float = 1 + USq / 16384 * (4096 + USq * (-768 + USq * (320 - 175 * USq))) + Dim BB As Float = USq / 1024 * (256 + USq * (-128 + USq * (74 - 47 * USq))) + + Dim Sigma As Float = S / (B * AA) + Dim SigmaP As Float = Pi(2) + + Dim Cos2SigmaM, SinSigma, CosSigma, DeltaSigma As Float + Dim Tmp, Lambda, C, L, Lat2 As Float + + While (Abs(Sigma - SigmaP) > 1e-12) + + Cos2SigmaM = Cos(2 * Sigma1 + Sigma) + SinSigma = Sin(Sigma) + CosSigma = Cos(Sigma) + DeltaSigma = BB * SinSigma * (Cos2SigmaM + BB / 4 * (CosSigma * (-1 + 2 * Cos2SigmaM * Cos2SigmaM) - BB / 6 * Cos2SigmaM * (-3 + 4 * SinSigma * SinSigma) * (-3 + 4 * Cos2SigmaM * Cos2SigmaM))) + SigmaP = Sigma + Sigma = S / (B * AA) + DeltaSigma + + Wend + + Tmp = SinU1 * SinSigma - CosU1 * CosSigma * CosAlpha1 + Lat2 = ATan2(SinU1 * CosSigma + CosU1 * SinSigma * CosAlpha1, (1 - F) * Sqr(SinAlpha * SinAlpha + Tmp * Tmp)) + Lambda = ATan2(SinSigma * SinAlpha1, CosU1 * CosSigma - SinU1 * SinSigma * CosAlpha1) + C = F / 16 * CosSqAlpha * (4 + F * (4 - 3 * CosSqAlpha)) + L = Lambda - (1 - C) * F * SinAlpha * (Sigma + C * SinSigma * (Cos2SigmaM + C * CosSigma * (-1 + 2 * Cos2SigmaM * Cos2SigmaM))) + 'RevAz = ATan2(SinAlpha, - Tmp) ?? + + Return MapPoint(Deg(Lat2), eLon1 + Deg(L)) + +End + +'' Calculate the initial bearing (in degrees) that leads from one point to another point +'' specified by latitude / longitude. + +Static Public Sub Bearing(({From}) As MapPoint, {To} As MapPoint) As Float + + Dim eLon1 As Float = From.Lon + Dim eLat1 As Float = From.Lat + Dim eLon2 As Float = To.Lon + Dim eLat2 As Float = To.Lat + + Dim DLon, fX, fY, fBearing As Float + + eLat1 = Rad(eLat1) + eLat2 = Rad(eLat2) + DLon = Rad(eLon2 - eLon1) + + fY = Sin(DLon) * Cos(eLat2) + fX = Cos(eLat1) * Sin(eLat2) - Sin(eLat1) * Cos(eLat2) * Cos(DLon) + fBearing = Deg(ATan2(fY, fX)) + If fBearing < 0 Then fBearing += 360 + Return fBearing + +End + +'' Returns the Central Point between several MapPoints +Static Public Function GetCenter(hPoints As MapPoint[]) As MapPoint + 'TODO: Movida da classe _MapShape para cá. Avaliar pertinência + Dim tmpA, fA, Gx, Gy As Float + Dim j As Integer + 'calcul du centre + fA = 0 + Gx = 0 + Gy = 0 + For k As Integer = 0 To hPoints.Max + j = IIf(k + 1 <= hPoints.Max, k + 1, 0) + tmpA = (hPoints[k].Lon * hPoints[j].Lat) - (hPoints[j].Lon * hPoints[k].Lat) + fA += tmpA + Gx += tmpA * (hPoints[k].Lon + hPoints[j].Lon) + Gy += tmpA * (hPoints[k].Lat + hPoints[j].Lat) + Next + fA = fA / 2 + Gx = Gx / (6 * fA) + Gy = Gy / (6 * fA) + + Return MapPoint(Gy, Gx) +Catch + +End diff --git a/comp/src/gb.map/.src/Types/TileSource.module b/comp/src/gb.map/.src/Types/TileSource.module new file mode 100644 index 00000000..6b78d6d0 --- /dev/null +++ b/comp/src/gb.map/.src/Types/TileSource.module @@ -0,0 +1,13 @@ +' Gambas module file + +' Gambas class file + +''Standart static tile provider +Public Const Standart As Integer = 0 + +''Web Map Tile Service +Public Const WMTS As Integer = 1 + +''Web Map Service +Public Const WMS As Integer = 2 + diff --git a/comp/src/gb.map/.src/Types/_Tile.class b/comp/src/gb.map/.src/Types/_Tile.class new file mode 100644 index 00000000..ebd1a171 --- /dev/null +++ b/comp/src/gb.map/.src/Types/_Tile.class @@ -0,0 +1,16 @@ +' Gambas class file + +Static Public Const Normal As Integer = 0 +Static Public Const Loading As Integer = 1 +Static Public Const Error As Integer = -1 + + +Public X As Integer +Public Y As Integer +Public Z As Integer +Public Version As Integer = 1 +Public Status As Integer +Public Image As Image +Public TryCount As Integer +Public Name As String +Public Opacity As Float \ No newline at end of file diff --git a/comp/src/gb.map/.src/_MapLayer.class b/comp/src/gb.map/.src/_MapLayer.class new file mode 100644 index 00000000..8b21e596 --- /dev/null +++ b/comp/src/gb.map/.src/_MapLayer.class @@ -0,0 +1,66 @@ +' Gambas class file + +Export + +Property Read Loading As Boolean '' Returns Layer status +Property Visible As Boolean '' Returns or sets Layer visibility +Property Opacity As Float '' Returns or sets Layer opacity +Private $bVisible As Boolean = True +Private $fOpaciy As Float = 1 +Public Name As String '' Returns or sets Layer name +Public Copyright As String '' Returns or sets Layer Copyright notice +'Public $aStack As New String[] + +Event Refresh + +Public Sub Draw() '(Optional bRefresh As Boolean = True) + +End + +Private Function Visible_Read() As Boolean + + Return $bVisible + +End + +Private Sub Visible_Write(Value As Boolean) + + $bVisible = Value + _Load() + Raise Refresh +End + +Public Sub _Load() + +End + +Public Sub Refresh() + +End + +' Public Function CountActiveClients() As Integer +' +' End + +Private Function Opacity_Read() As Float + + Return $fOpaciy + +End + +Private Sub Opacity_Write(Value As Float) + + $fOpaciy = Min(1, Max(0, Value)) + +End + +Private Function Loading_Read() As Boolean + +End + +'' Returns associated Map +Public Function _GetMap() As Map + + Return Object.Parent(Me) + +End diff --git a/comp/src/gb.map/.src/_MapShape.class b/comp/src/gb.map/.src/_MapShape.class new file mode 100644 index 00000000..1c5c1204 --- /dev/null +++ b/comp/src/gb.map/.src/_MapShape.class @@ -0,0 +1,583 @@ +' Gambas class file + +Export +Inherits _MapLayer + +Private Const _Point As Integer = 1 'Item Types +Private Const _MultiPoint As Integer = 8 +Private Const _Polyline As Integer = 3 +Private Const _Polygon As Integer = 5 +Private Const _Circle As Integer = 33 + +' Private Dash As Float[] = [3, 2] 'Line Styles (and Dash values) +' Private DashDot As Float[] = [3, 2, 1, 2] +' Private DashDotDot As Float[] = [3, 2, 1, 2, 1, 2] +' Private Dot As Float[] = [1, 2] + +Property Read Count As Integer '' Returns the total of Shapes +Property Read Max As Integer '' Returns the greatest index +Property Read Key As String '' Returns Shape associated Key +Property {Color} As Integer '' Returns or sets the Shape's items default Color, or outline color +Property FillColor As Integer '' Returns or sets the Shape's items default Fill Color +Property LineWidth As Integer '' Returns or sets the Shape's items default Line Width +Property {Image} As Image '' Returns or sets the Shapes's Points default Image. If set, will override the default Icon. To revert to default Icon, set this to Null +Public LineStyle As Integer = Line.Solid '' Returns or sets the Shape's items default Line Style +Private $iColor As Integer +Private $iFillColor As Integer +Private $iLineWidth As Integer = 2 +'Private $iLineStyle As Integer +Private $aInView As New Integer[] +Private $aShapeNames As New String[] +Private $aShapes As New _ShapeItem[] +Private $sLastKey As String +Private $hImage As Image '' Stores user defined default by Property Image + +'Private $hImgPoint As Image +'Property Points As Shapes + +'Private $colKeyShape As New Collection + + +Public Sub _new(Parent As Object) + + Object.Attach(Me, Parent, "Layer") + ' $hImgPoint = Image.Load("point.png") + +End + +Public Sub _Load() + + Dim hMap As Map = Me._GetMap() + Dim pt1, pt2 As Point + + $aInView.Clear + For i As Integer = 0 To $aShapes.Max + If Not ($aShapes[i].Type = _Point) Then + pt1 = Geo.MapPointToPixel($aShapes[i].Bounds.TopLeft, hMap.Zoom) + pt2 = Geo.MapPointToPixel($aShapes[i].Bounds.BottomRight, hMap.Zoom) + If pt2.x - pt1.x < 2 And If pt2.y - pt1.y < 2 Then Continue + Endif + With $aShapes[i].Bounds + If .Lon2 > hMap.Bounds.Lon Then + If .lon < hMap.Bounds.lon2 + If .lat2 < hMap.Bounds.Lat Then + If .Lat > hMap.Bounds.Lat2 Then + $aInView.Add(i) + Endif + Endif + Endif + Endif + End With + Next + + If Map.Debug Then Debug "Number of items displayed : " & $aInView.Count + +End + +'' Adds a Point object to current Shape +'' - If Icon not defined, assume default Icon +'' - If Color defined, Icon assume defined color +Public Sub AddPoint(Key As String, Points As MapPoint, Optional {Color} As Integer, Optional Icon As Image) As _ShapeItem + + If $aShapeNames.Exist(Key) Then Error.Raise("This key already exist") + + Dim hItem As New _ShapeItem(Key) As "Item" + + If Not IsMissing(Icon) Then hItem.Image = Icon + If Not IsMissing({Color}) Then hItem.Color = {Color} + + hItem.Type = _Point + hItem.Center = Points + hItem.Points = Points + hItem.Bounds = MapBounds(Points, Points) + $aShapes.Add(hItem) + $aShapeNames.Add(Key) + + Return hItem + +End + +'' Adds a Multipoint object to current Shape +Public Sub AddMultipoint(Key As String, Points As MapPoint[], Optional {Color} As Integer, Optional Icon As Image) As _ShapeItem + + 'If $aShapeNames.Exist(Key) Then Error.Raise("Key already exist: " & Key) + + Dim hItem As New _ShapeItem(Key) As "Item" + + If Not IsMissing(Icon) Then hItem.Image = Icon + If Not IsMissing({Color}) Then hItem.Color = {Color} + + hItem.Type = _MultiPoint + hItem.Center = MapPoint.GetCenter(Points) 'GetCenter(Points) + hItem.Points = Points + hItem.Bounds = GetPointBounds(Points) + $aShapes.Add(hItem) + $aShapeNames.Add(Key) + + Return hItem + +End + +'' Adds a Polyline object to current Shape +Public Sub AddPolyLine(Key As String, Points As MapPoint[], Optional {Color} As Integer, Optional {LineWidth} As Integer, Optional {LineStyle} As Integer) As _ShapeItem + + 'If $aShapeNames.Exist(Key) Then Error.Raise("Key already exist: " & Key) + + Dim hItem As New _ShapeItem(Key) As "Item" + + If Not IsMissing({Color}) Then hItem.Color = {Color} + If Not IsMissing({LineWidth}) Then hItem.LineWidth = {LineWidth} + If Not IsMissing({LineStyle}) Then hItem.LineStyle = {LineStyle} + + hItem.Type = _Polyline + hItem.Center = MapPoint.GetCenter(Points) 'GetCenter(Points) + hItem.Bounds = GetPointBounds(Points) + hItem.Points = Points + $aShapes.Add(hItem) + $aShapeNames.Add(Key) + + Return hItem + +End + +'' Adds a Polygon object to current Shape +Public Sub AddPolygon(Key As String, Points As MapPoint[][], Optional {Color} As Integer, Optional {LineWidth} As Integer, Optional {LineStyle} As Integer) As _ShapeItem + + 'If $aShapeNames.Exist(Key) Then Error.Raise("Key already exist: " & Key) + + Dim hItem As New _ShapeItem(Key) As "Item" + + If Not IsMissing({Color}) Then hItem.Color = {Color} + If Not IsMissing({LineWidth}) Then hItem.LineWidth = {LineWidth} + If Not IsMissing({LineStyle}) Then hItem.LineStyle = {LineStyle} + + hItem.Type = _Polygon + hItem.Center = MapPoint.GetCenter(Points[0]) 'GetCenter(Points[0]) + hItem.Bounds = GetPointBounds(Points[0]) + hItem.Points = Points + $aShapes.Add(hItem) + $aShapeNames.Add(Key) + + Return hItem + +End + +'' Adds a Circle object to current Shape +'fillcolor should come after color, but i dont want to break anything... +Public Sub AddCircle(Key As String, Center As MapPoint, Radius As Float, Optional {Color} As Integer, Optional {LineWidth} As Integer, Optional {LineStyle} As Integer, Optional {FillColor} As Integer) As _ShapeItem + + 'If $aShapeNames.Exist(Key) Then Error.Raise("Key already exist: " & Key) + + Dim P1, P2, P3, P4 As MapPoint + Dim hItem As New _ShapeItem(Key) As "Item" + + If Not IsMissing({Color}) Then hItem.Color = {Color} + If Not IsMissing({FillColor}) Then hItem.FillColor = {FillColor} + If Not IsMissing({LineWidth}) Then hItem.LineWidth = {LineWidth} + If Not IsMissing({LineStyle}) Then hItem.LineStyle = {LineStyle} + + hItem.Type = _Circle + hItem.Points = Center + hItem.Center = Center + hItem.Radius = Radius + + P1 = MapPoint.From(Center, 0, Radius) + P2 = MapPoint.From(Center, 90, Radius) + P3 = MapPoint.From(Center, 180, Radius) + P4 = MapPoint.From(Center, 270, Radius) + + hItem.Bounds.TopLeft = MapPoint(P1.Lat, P4.Lon) + hItem.Bounds.BottomRight = MapPoint(P3.Lat, P2.Lon) + + $aShapes.Add(hItem) + $aShapeNames.Add(Key) + + Return hItem + +End + +'' Draws the Mapshape Layer and Itens +Public Sub Draw() + + Dim pt, pt2 As Point + Dim hMap As Map = Me._GetMap() + Dim hPoly As Integer[] + Dim iColor, iBack As Integer + Dim hShape As _ShapeItem + Dim iAlpha As Integer + + If $aShapes.Count = 0 Then Return + For i As Integer = 0 To $aInView.Max + + 'TODO: Check opacity + hShape = $aShapes[$aInView[i]] + 'Set ForeColor + iColor = IIf(hShape.Color = -1, $iColor, hShape.Color) + iAlpha = Color.GetAlpha(icolor) + iColor = Color.SetAlpha(icolor, Min(iAlpha + (255 - (255 * Me.Opacity)), 255)) + + 'Set BackColor + iBack = IIf(hShape.FillColor = -1, $iFillColor, hShape.FillColor) + If iBack = -1 Then iBack = Color.transparent + 'If hShape.Type = Circle Then Stop + iAlpha = Color.GetAlpha(iBack) + iBack = Color.SetAlpha(iBack, Min(iAlpha + (255 - (255 * Me.Opacity)), 255)) + + 'Set LineWidth + Paint.LineWidth = IIf(hShape.LineWidth > -1, hShape.LineWidth, $iLineWidth) + + 'Set LineStyle + Dim tmpLineStyle As Integer + tmpLineStyle = IIf(hShape.LineStyle <> -1, hShape.LineStyle, LineStyle) + Select Case tmpLineStyle + Case Line.Dash + Paint.Dash = [3, 2] + Case Line.DashDot + Paint.Dash = [3, 2, 1, 2] + Case Line.DashDotDot + Paint.Dash = [3, 2, 1, 2, 1, 2] + Case Line.Dot + Paint.Dash = [1, 2] + Case Line.None + Paint.Dash = [0] + Case Else + Paint.Dash = Null + End Select + + 'TODO: Allow to define color for selected item + 'Force Color for selected + If hShape.Selected Then iColor = Color.White + + 'Draw + Select Case hShape.Type + Case _Point + pt = Geo.MapPointToPixel(hShape.Points, hMap.zoom) + If hShape.Image Then + 'Draws centralized + If hShape.Color <> -1 Then hShape.Image.Colorize(hShape.Color) + Paint.DrawImage(hShape.Image, pt.X - hMap.PixelBox.X - hShape.Image.Height / 2, pt.Y - hMap.PixelBox.Y - hShape.Image.width / 2) + Else + 'Draws with default "red point" icon offset + Paint.DrawImage(Me.Image, pt.X - hMap.PixelBox.X - 16, pt.Y - hMap.PixelBox.Y - 32) + Endif + + Case _MultiPoint + For j As Integer = 0 To hShape.Points.Max + pt = Geo.MapPointToPixel(hShape.Points[j], hMap.zoom) + ' If hShape.Image Then + ' Paint.DrawImage(hShape.Image, pt.X - hMap.PixelBox.X - 16, pt.Y - hMap.PixelBox.Y - 32) + ' Else + ' Paint.DrawImage(Me.Image, pt.X - hMap.PixelBox.X - 16, pt.Y - hMap.PixelBox.Y - 32) + ' Endif + If hShape.Image Then + 'Draws centralized + If hShape.Color <> -1 Then hShape.Image.Colorize(hShape.Color) + Paint.DrawImage(hShape.Image, pt.X - hMap.PixelBox.X - hShape.Image.Height / 2, pt.Y - hMap.PixelBox.Y - hShape.Image.width / 2) + 'Paint.DrawImage(IIf(hShape.Color, hShape.Image.Colorize(hShape.Color), hShape.Image), pt.X - hMap.PixelBox.X - hShape.Image.Height / 2, pt.Y - hMap.PixelBox.Y - hShape.Image.width / 2) + Else + 'Draws with default "red point" icon offset + Paint.DrawImage(Me.Image, pt.X - hMap.PixelBox.X - 16, pt.Y - hMap.PixelBox.Y - 32) + Endif + Next + + Case _Polygon + hPoly = New Integer[] + For j As Integer = 0 To hShape.Points[0].Max + pt = Geo.MapPointToPixel(hShape.Points[0][j], hMap.zoom) + hPoly.Add(pt.x - hMap.PixelBox.X) + hPoly.Add(pt.y - hMap.PixelBox.Y) + Next + Paint.LineWidth = hShape.LineWidth + Paint.Brush = Paint.Color(iBack) + Paint.Polygon(hPoly) + Paint.Fill(True) + Paint.Brush = Paint.Color(iColor) + Paint.Stroke + + Case _Polyline + If hShape.Points.Count = 0 Then Continue + pt = Geo.MapPointToPixel(hShape.Points[0], hMap.zoom) + Paint.MoveTo(pt.x - hMap.PixelBox.X, pt.y - hMap.PixelBox.Y) + For j As Integer = 1 To hShape.Points.Max + pt = Geo.MapPointToPixel(hShape.Points[j], hMap.zoom) + Paint.LineTo(pt.x - hMap.PixelBox.X, pt.y - hMap.PixelBox.Y) + Next + Paint.Brush = Paint.Color(iColor) + Paint.Stroke + + Case _Circle + pt = hMap.MapPointToPixelRel(hShape.Bounds.TopLeft) + pt2 = hMap.MapPointToPixelRel(hShape.Bounds.BottomRight) + Paint.Ellipse(pt.x, pt.y, pt2.x - pt.x, pt2.y - pt.y) + Paint.Brush = Paint.Color(iBack) + 'Paint.Brush = Paint.Color(hShape.FillColor) + Paint.Fill(True) + Paint.Brush = Paint.Color(icolor) + 'Paint.Brush = Paint.Color(hShape.Color) + Paint.Stroke + End Select + Next + +End + +'' Returns a Shape Item +Public Function GetItem(Key As String) As _ShapeItem + + 'If Not $aShapeNames.Exist(Key) Then Error.Raise("Item not found: " & Key) + Return $aShapes[$aShapeNames.Find(Key)] + +End + +'' Hidden method so can be an readable Array +'' - Returns a _ShapeItem +'' - See GetItem +Public Function _get(Key As String) As _ShapeItem + + Dim iRet As Integer + iRet = $aShapeNames.Find(key) + If iRet = -1 Then + Return Null + Else + Return $aShapes[iRet] + Endif + +End + +' '' Returns associated Map +' Private Function GetMap() As Map +' +' Return Object.Parent(Me) +' +' End + +Private Function Color_Read() As Integer + + Return $icolor + +End + +Private Sub Color_Write(Value As Integer) + + $icolor = Value + +End + +'' Wrapper to MapPoint.GetCenter() since I dont want to break anything :-D +'' - See MapPoint.GetCenter() +Static Public Function GetCenter(hPoints As MapPoint[]) As MapPoint + Return MapPoint.GetCenter(hPoints) 'just a jump... +' 'TODO: testar essa função, comportamento estranho. considerar mover para dentro da classe MapPoint +' Dim tmpA, A, Gx, Gy As Float +' Dim j As Integer +' 'calcul du centre +' A = 0 +' gx = 0 +' Gy = 0 +' For k As Integer = 0 To hPoints.Max +' j = IIf(k + 1 <= hPoints.Max, k + 1, 0) +' tmpA = (hPoints[k].Lon * hPoints[j].Lat) - (hPoints[j].Lon * hPoints[k].Lat) +' A += tmpA +' Gx += tmpA * (hPoints[k].Lon + hPoints[j].Lon) +' Gy += tmpA * (hPoints[k].Lat + hPoints[j].Lat) +' Next +' A = A / 2 +' gx = gx / (6 * A) +' gy = gy / (6 * A) +' +' Return MapPoint(GY, GX) +' Catch +' +End + +Private Function GetPointBounds(hMapPoints As MapPoint[]) As MapBounds + + Dim fX, fY, fX2, fY2 As Float + + fX = hMapPoints[0].Lon + fY = hMapPoints[0].Lat + fX2 = fX + fY2 = fY + For Each hPoint As MapPoint In hMapPoints + fX = Min(hPoint.lon, fX) + fY2 = Min(hPoint.lat, fY2) + fX2 = Max(hPoint.lon, fX2) + fY = Max(hPoint.lat, fY) + Next + + Return MapBounds(MapPoint(fY, fX), MapPoint(fY2, fX2)) + +End + +Private Function Count_Read() As Integer + + Return $aShapes.Count + +End + +'' Deletes the specified Shape Item +Public Function Remove(Key As String) As Boolean + + Dim iRet As Integer + iRet = $aShapeNames.Find(key) + If iRet = -1 Then Return False + $aShapeNames.Remove(iRet) + $aShapes.Remove(iRet) + _Load() + + Return True + +End + +'' Returns if the specified Shape Item actually exists +Public Sub Exist(Key As String) As Boolean + + Return $aShapeNames.Exist(Key) + +End + +Private Function Image_Read() As Image + + If $hImage Then Return $hImage Else Return Image.Load("point.png") + +End + +Private Sub Image_Write(Value As Image) + + $hImage = Value + '$hImgPoint = Value + +End + +Public Sub Refresh() + + For Each hItem As _ShapeItem In $aShapes + Select Case hItem.Type + Case _Point + hItem.Center = hItem.Points + hItem.Bounds = MapBounds(hItem.Points, hItem.Points) + Case _Polyline, _MultiPoint + hItem.Center = MapPoint.GetCenter(hItem.Points) 'GetCenter(hItem.Points) + hItem.Bounds = GetPointBounds(hItem.Points) + Case _Polygon + hItem.Center = MapPoint.GetCenter(hItem.Points[0]) 'GetCenter(hItem.Points[0]) + hItem.Bounds = GetPointBounds(hItem.Points[0]) + Case _Circle + Dim P1, P2, P3, P4 As MapPoint + P1 = MapPoint.From(hItem.Center, 0, hItem.Radius) + P2 = MapPoint.From(hItem.Center, 90, hItem.Radius) + P3 = MapPoint.From(hItem.Center, 180, hItem.Radius) + P4 = MapPoint.From(hItem.Center, 270, hItem.Radius) + hItem.Bounds.TopLeft = MapPoint(P1.Lat, P4.Lon) + hItem.Bounds.BottomRight = MapPoint(P3.Lat, P2.Lon) + End Select + Next + +End + +Private Function Max_Read() As Integer + + Return $aShapes.Max + +End + +Public Function GetSelected() As _ShapeItem[] + + Dim aShapeItem As New _ShapeItem[] + + For i As Integer = 0 To $aShapes.Max + If $aShapes[i].Selected Then aShapeItem.Add($aShapes[i]) + Next + + Return aShapeItem + +End + +Public Sub UnselectAll() + + For i As Integer = 0 To $aShapes.Max + $aShapes[i].Selected = False + Next + +End + +Public Sub SelectAll() + + For i As Integer = 0 To $aShapes.Max + $aShapes[i].Selected = True + Next + +End + +Public Sub Item_Select() + + If $sLastKey <> Last.key Then + Try _get($sLastKey).Selected = False 'Try Me._get($sLastKey).Selected = False + $sLastKey = Last.Key + Endif + +End + +Private Function Key_Read() As String + + Return $sLastKey + +End + +Public Function Find(hMp As MapPoint) As _ShapeItem + + Dim hShape As _ShapeItem + Dim hMap As Map = Me._GetMap() + 'Optimize by just looking in the view zone + If hMap.Bounds.InBounds(hMp) Then + For i As Integer = 0 To $aInView.Max + hShape = $aInView[i] + If hShape.Type = _Point Then + If hShape.Near(hMp, hMap.Zoom, 10) Then Return hShape + Else + If hShape.Contains(hMp) Then Return hShape + Endif + Next + Else + For i As Integer = 0 To $aShapes.Max + hShape = $aShapes[i] + If hShape.Type = _Point Then + If hShape.Near(hMp, hMap.Zoom, 10) Then Return hShape + Else + If hShape.Contains(hMp) Then Return hShape + Endif + Next + Endif + +End + +'' Clear all shape itens in this Layer +Public Sub Clear() + + $aShapes.Clear + $aShapeNames.Clear + +End + +Private Function LineWidth_Read() As Integer + + Return $iLineWidth + +End + +Private Sub LineWidth_Write(Value As Integer) + + $iLineWidth = Max(Value, 1) + +End + +Private Function FillColor_Read() As Integer + + Return $iFillColor + +End + +Private Sub FillColor_Write(Value As Integer) + + $iFillColor = Value + +End diff --git a/comp/src/gb.map/.src/_MapTile.class b/comp/src/gb.map/.src/_MapTile.class new file mode 100644 index 00000000..f532854c --- /dev/null +++ b/comp/src/gb.map/.src/_MapTile.class @@ -0,0 +1,769 @@ +' Gambas class file + +Export +Inherits _MapLayer + +Property Read Loading As Boolean '' Tile status. +Property SubDomains As String[] +'Property Opacity As Float inherited '' Returns or sets Tile opacity. +Property UseWebMapService As Boolean +Property WMSArgs As Collection '' Defines the Static args for the server(build the url) +Property MaxBounds As MapBounds +Property CacheRefreshDelay As Integer '' Delay before refreshing an image in the cache. (By default 30 day) +Property WMSProjection As String '' Set the projection used by the WMS server. +Property Opacity As Float +Private $aStack As New String[] +Private $aClients As New HttpClient[] +Private $iClientCount As Integer = 4 +Private $sCachePath As String ' = User.Home &/ ".cache/gb.map" +Private $tmrGet As New Timer As "tmrGet" +Private $aTiles As New String[] +Private $colTiles As New Collection +Private $sPattern As String +Private $aSubDomains As String[] = ["a", "b", "c"] +'Private $fOpacity As Float = 1 +Private $aPreload As New String[] +Private $bPreloadMode As Boolean +Private $fGradStep As Float = 0.1 +Private $bIsQuadKey As Boolean +Private $bLoading As Boolean +Private $iCli As Integer +'Private $iTileSource As Integer +'Property TileSource As Integer +Private $bUseWMS As Boolean +Private $cWMSArgs As New Collection +Private $mbMaxBounds As New MapBounds +Private $prjWMS As Proj +Private $prjLatLon As Proj +Private $WMSProj As String +Private $iVersion As Integer = 1 +Private $iCacheRefreshDelay As Integer = 30 +'Private $bCacheRefresh As Boolean = True +Public TileBoundValue As MapBounds + +' Private $aUsedTiles As New String[] +' Private $aNewTiles As New String[] +' Private $bHaveCache As Boolean +Event Refresh + +Public Sub _new(Optional CacheName As String, Parent As Object) + + Dim sTempPath As String + Dim hClient As HttpClient + Dim i As Integer + 'Dim hTable As Table + + 'db.Debug = True + Object.Attach(Me, Parent, "Layer") + $prjLatLon = New Proj("epsg:4326") + + $sCachePath = Me._GetMap().DefaultCache + + If CacheName Then + sTempPath = $sCachePath &/ CacheName + Else + sTempPath = Temp() + Endif + + If Not Exist(sTempPath) Then + If MakeDir(sTempPath) Then Error.Raise("Cannot create Cache Path: \n" & sTempPath) + Endif + + $sCachePath = sTempPath + + $aClients.Resize($iClientCount) + For i = 0 To $aClients.Max + hClient = New HttpClient As "Client" + hClient.Async = True + With Me._GetMap() + If ._Proxy Then + hClient.Proxy.Auth = ._Proxy.Auth + hClient.Proxy.Type = ._Proxy.Type + hClient.Proxy.Host = ._Proxy.Host + hClient.Proxy.User = ._Proxy.User + hClient.Proxy.Password = ._Proxy.Password + Endif + End With + $aClients[i] = hClient + hClient.Timeout = 10 + Next + +End +' svn checkout --username=gambix svn+ssh://gambas@svn.code.sf.net/p/gambas/code/gambas/trunk +' +'' Draws the Maptile Layer +Public Sub Draw() + + Dim s As String + Dim hTile As _Tile + Dim hMap As Map = Me._GetMap() + Dim hBound As MapBounds + Dim hPx As Point + Dim hpx2 As Point + 'Paint.Reset() + 'Paint.Rotate(Rad(90)) + + 'Paint.Translate(hmap.Width / 2, hmap.Height / 2) + For Each s In $aTiles + hTile = $coltiles[s] + + hBound = Geo.TileBounds(hTile.x, hTile.y, hTile.z) + + hpx = Geo.MapPointToPixel(hBound.TopLeft, hmap.Zoom) + hpx2 = Geo.MapPointToPixel(hBound.BottomRight, hmap.Zoom) + + Select Case hTile.Status + Case _Tile.Normal + If hmap._ShowWithEffect Then + Try Paint.DrawImage(hTile.Image, hTile.X * 256 - hMap.PixelBox.X, hTile.Y * 256 - hMap.PixelBox.Y,,, Min(hTile.Opacity, Me.Opacity)) '$fOpacity)) + + If hTile.Opacity < Me.Opacity Then '$fOpacity Then + hTile.Opacity += $fGradStep + Raise Refresh + Endif + Else + Try Paint.DrawImage(hTile.Image, hTile.X * 256 - hMap.PixelBox.X, hTile.Y * 256 - hMap.PixelBox.Y,,, Me.Opacity) '$fOpacity) + Endif + + 'Draw.Foreground = Color.Green + 'Draw.Text("TileOK", hTile.X * 256 - hMap.PixelBox.X, hTile.Y * 256 - hMap.PixelBox.Y) + Case _Tile.Error + Paint.Brush = Paint.Color(Color.SetAlpha(Color.White, Min(125, (255 * Me.Opacity)))) '$fOpacity)))) + Paint.Rectangle(hTile.X * 256 - hMap.PixelBox.X, hTile.Y * 256 - hMap.PixelBox.Y, 256, 256) + Paint.Fill + 'Draw.Image(Picture["icon:/256/cancel"].Image, hTile.X * 256 - hMap.PixelBox.X, hTile.Y * 256 - hMap.PixelBox.Y) + Case _Tile.Loading + ' Draw.Foreground = Color.Red + ' Draw.Font.Bold = True + ' Draw.Text("Loading: " & hTile.x & " / " & hTile.y, hTile.X * 256 - hMap.PixelBox.X, hTile.Y * 256 - hMap.PixelBox.Y) + End Select + + ' Draw.Foreground = Color.Green + ' Draw.rect(hpx.x - hmap.PixelBox.x, hpx.Y - hmap.PixelBox.y, hpx2.x - hpx.x, hpx2.y - hpx.Y) + Next + +End + +'' Loads precached Tiles +Public Sub _Load() + + Dim ptFirst, ptLast As Point + Dim hMap As Map = Me._GetMap() + Dim iX, iY As Integer + Dim hTile As New _Tile + Dim sTileName As String + Dim aTileOrder As New String[] + Dim iDist As Integer + Dim ptTileCenter As Point + Dim ars As String[] + Dim mpFirst As MapPoint + Dim mpLast As MapPoint + Dim sTileUrl As String + 'Dim hresult As Result + ' Dim hStat As Stat + ' Dim s As String + ' Dim sExec As String + ' Dim bFirst As Boolean + + + '*********************************** + + mpFirst = Geo.PixelToMapPoint(Point(hMap.PixelBox.x, hMap.PixelBox.y), hmap.Zoom) + mpLast = Geo.PixelToMapPoint(Point(hMap.PixelBox.Right, hMap.PixelBox.Bottom), hmap.Zoom) + ptTileCenter = Geo.MapPointToTile(hMap.Center, hMap.Zoom) + ptFirst = Geo.MapPointToTile(mpFirst, hmap.Zoom) + ptLast = Geo.MapPointToTile(mpLast, hmap.Zoom) + + $aPreload.Clear + + For iX = ptFirst.X - 1 To ptLast.X + 1 + For iY = ptFirst.Y - 1 To ptLast.Y + 1 + iDist = Sqr((iX - ptTileCenter.X) ^ 2 + (iY - ptTileCenter.Y) ^ 2) + aTileOrder.Add(Subst("&1/&2/&3", iDist, iY, iX)) + Next + Next + aTileOrder.Sort(gb.Descent) + + $aTiles.Clear + '$aStack.Clear + 'ptTileCenter = Geo.MapPointToTile(hMap.Center, hMap.Zoom) + 'Print "Tile Center = " & ptTileCenter.x & " " & ptTileCenter.Y + For Each sTileName In aTileOrder + ars = Split(sTileName, "/") + iY = CInt(ars[1]) + iX = CInt(ars[2]) + sTileName = Subst("&1-&2-&3-&4.png", hMap.Zoom, iY, iX, $iVersion) + If Not $coltiles.Exist(sTileName) Then + hTile = New _Tile + hTile.X = iX + hTile.Y = iY + hTile.Z = hMap.Zoom + hTile.Name = sTileName + If Exist($sCachePath &/ hTile.Name) Then + 'Print $db.Tables["tiles"] + ' hresult = $db.Exec("Select * from tiles where name=&1", "toto") + ' 'hresult = $DB.Find("tiles", "name=&1", hTile.Name) + ' + ' If hresult.Available And If $bCacheRefresh And If DateDiff(Now(), hresult!lastmodified, gb.Day) > $iCacheRefreshDelay Then + ' ReLoadTile(hTile) + ' Else + ' hStat = Stat($sCachePath &/ hTile.Name) + ' Print DateDiff(Now(), hStat.LastModified, gb.Day) + ' If $bCacheRefresh And If DateDiff(Now(), hStat.LastChange, gb.Day) > $iCacheRefreshDelay Then + ' ReLoadTile(hTile) + ' Else + hTile.Status = _Tile.Normal + Try hTile.Image = Image.Load($sCachePath &/ hTile.Name) + If Error Then + 'Error "Image illisible -> " & hTile.Name + ReLoadTile(hTile) + Else + 'On valide la Date de dernier acces + 'If $bHaveCache Then $aUsedTiles.Add(hTile.Name) + 'Exec ["touch", $sCachePath &/ hTile.Name] + hTile.Opacity = Me.Opacity '$fOpacity + Endif + ' Endif + ' Endif + Else + hTile.Status = _Tile.Loading + 'If Map.Debug Then Debug "Loading Tile: " & hTile.Name + If Not $aStack.Exist(hTile.Name) Then + sTileUrl = GetTileUrl(hTile) + If sTileUrl Then + $aStack.Push(hTile.Name) + $aStack.Push(sTileUrl) + Endif + Endif + Endif + + $coltiles[hTile.Name] = hTile + + Else + hTile = $coltiles[sTileName] + ' If hTile.Status = _Tile.Loading Then + ' hTile.TryCount = 0 + ' ReLoadTile(hTile) + ' Endif + Endif + + $aTiles.Add(sTileName) + Next + + 'Loading of uppers tiles + ' If hmap.Zoom > 1 Then + ' ptFirst = Geo.MapPointToTile(mpFirst, hmap.Zoom - 1) + ' ptLast = Geo.MapPointToTile(mpLast, hmap.Zoom - 1) + ' For iX = ptFirst.X To ptLast.X + ' For iY = ptFirst.Y To ptLast.Y + ' sTileName = Subst("&1-&2-&3.png", hMap.Zoom - 1, iY, iX) + ' If Exist($sCachePath &/ sTileName) Then Continue + ' $aPreload.Push(sTileName) + ' $aPreload.Push(GetTileUrlpt(iX, iY, hMap.Zoom - 1)) + ' Next + ' Next + ' Endif + ' If hmap.Zoom < 18 Then + ' ptFirst = Geo.MapPointToTile(mpFirst, hmap.Zoom + 1) + ' ptLast = Geo.MapPointToTile(mpLast, hmap.Zoom + 1) + ' For iX = ptFirst.X To ptLast.X + ' For iY = ptFirst.Y To ptLast.Y + ' sTileName = Subst("&1-&2-&3.png", hMap.Zoom + 1, iY, iX) + ' If Exist($sCachePath &/ sTileName) Then Continue + ' $aPreload.Push(sTileName) + ' $aPreload.Push(GetTileUrlpt(iX, iY, hMap.Zoom + 1)) + ' Next + ' Next + ' Endif + $bLoading = $aStack.Count > 0 + $bPreloadMode = False + $tmrGet.Trigger + 'tmrGet_Timer + +End + +Private Sub ReLoadTile(hTile As _Tile) + ' if more than 3 try then stop try + + 'Dim hresult As Result + + If hTile.TryCount > 3 Then + hTile.Status = _Tile.Error + $tmrGet.Trigger + Raise Refresh + Return + Endif + 'If the tile exist then remove it + If Exist($sCachePath &/ hTile.Name) Then + Kill $sCachePath &/ hTile.Name + + Endif + If Not $aStack.Exist(hTile.Name) Then + hTile.Status = _Tile.Loading + Inc hTile.TryCount + 'Error "rechargement de : " & hTile.Name + + $aStack.Push(hTile.Name) + $aStack.Push(GetTileUrl(hTile)) + $bPreloadMode = False + Endif + $tmrGet.Trigger + +End + +Private Function MakeDir(Path As String) As Boolean + + Dim ars As String[] + Dim sDir, s As String + + sDir = "/" + + ars = Split(Path, "/") + For Each s In ars + sDir &/= s + If Not Exist(sDir) Then + Mkdir sDir + Endif + Next + + If Map.Debug Then Debug "Creating Folder: " & sDir + +Catch + + Return True + +End + +' Private Function GetMap() As Map +' +' Return Object.Parent(Me) +' +' End + +Public Sub tmrGet_Timer() + + Dim sUrl, sFile As String + Dim hClient As HttpClient + + Do + If $bPreloadMode Then + $bLoading = False + If $aPreload.Count = 0 Then Return + hClient = GetClient() + If Not hClient Then Return + sUrl = $aPreload.Pop() + sFile = $aPreload.Pop() + Else + $bLoading = $aStack.Count > 0 + If $aStack.count = 0 Then + $bPreloadMode = True + Return + Endif + hClient = GetClient() + If Not hClient Then Return + Inc $iCli + sUrl = $aStack.Pop() + sFile = $aStack.Pop() + Endif + + hClient.Url = sUrl + 'Print surl + hClient.Tag = sFile + hClient.Get(Null, $sCachePath &/ sFile) + Loop + +End + +Private Sub GetClient() As HttpClient + + For i As Integer = 0 To $aClients.max + If $aClients[i].Status = Net.Inactive Then Return $aClients[i] + Next + +End + +Public Sub Client_Finished() + + Dim hTile As _Tile + 'Dim hresult As Result + + Dec $iCli + 'If Not $bPreloadMode Then6752042.96,2525540.18,6751587.00,2525742.70 + hTile = $colTiles[Last.Tag] + If Not hTile Then Goto Skip + Try hTile.Image = Image.Load($sCachePath &/ hTile.Name) + If Error Then + 'Error "Image illisible -> " & hTile.Name + ReLoadTile(hTile) + Return + Endif + 'Print hTile.Name + hTile.Status = _Tile.Normal + 'If $bHaveCache Then $aNewTiles.Add(hTile.Name) + ' 'The tile have been loaded and the file is created so now + ' 'we add an entry to the database + ' hresult = $DB.Create("tiles") + ' hresult!name = hTile.Name + ' hresult!lastmodified = Now() + ' hresult!version = hTile.Version + ' hresult!lastaccess = Now() + ' hresult.Update + Raise Refresh + 'Endif +Skip: + $tmrGet.Trigger + 'Debug "Fichier téléchargé et chargé: " & Last.Tag + 'If Map.Debug then Debug "Downloaded file: "& Last.Tag + +End + +Public Sub Client_Error() + + Dim hTile As _Tile + + Dec $iCli + 'If Not $bPreloadMode Then + hTile = $coltiles[Last.Tag] + If Not hTile Then Goto Skip + 'Debug "erreur : " & hTile.Name + ReLoadTile(hTile) + 'Endif +Skip: + $tmrGet.Trigger + +End + +'' Refresh Layer contents +Public Sub Refresh() + + Dim i As Integer + + $coltiles.Clear + $aTiles.Clear + $aStack.Clear + $aPreload.Clear + For i = 0 To $aClients.Max + $aClients[i].Stop + Try Kill $sCachePath &/ $aClients[i].Tag + Next + +End + +Private Function GetTileUrl(hTile As _Tile) As String + + Return GetTileUrlpt(hTile.X, hTile.Y, hTile.Z) + +End + +' Private Function GetWMSTilept(X As Integer, Y As Integer, Z As Integer) As String +' +' Dim hBound As MapBounds = Geo.TileBounds(X, Y, Z) +' Dim hbound2 As MapBounds +' ' Dim hbound2 As MapBounds = Geo.TileBounds(x + 1, y - 1, z) +' Dim hConv, hConv2 As MapBounds +' Dim sTemp As String +' Dim s As String +' +' If Not Me.MaxBounds.Collide(hbound) Then Return +' +' For Each s In $cWMSArgs +' +' sTemp &= "&" & $cWMSArgs.Key & "=" & s +' +' Next +' +' If $cWMSArgs.Exist("bbox") Then +' +' 'Invertion de coordonée +' ' Print "de -> ", hbound.lat2, hbound.Lon, hbound.Lat, hbound.Lon2 +' ' hbound2 = $prjLatLon.TransformMBounds($prjWMS, hbound) +' ' Print "de lamb -> ", hbound2.lat2, hbound2.Lon, hbound.Lat, hbound.Lon2 +' hbound = MapBounds(MapPoint(hBound.lat2, hBound.lon), MapPoint(hBound.lat, hBound.lon2)) +' ' Print "converti -> ", hbound.lat, hbound.Lon, hbound.Lat2, hbound.Lon2 +' ' hbound2 = $prjLatLon.TransformMBounds($prjWMS, hbound) +' ' Print "converti lamb -> ", hbound2.lat, hbound2.Lon, hbound.Lat2, hbound.Lon2 +' ' Print +' If $prjWMS Then +' hbound = $prjLatLon.TransformMBounds($prjWMS, hbound) +' Endif +' sTemp = Replace(sTemp, "{lat}", CStr(hBound.Lat)) +' sTemp = Replace(sTemp, "{lon}", CStr(hbound.Lon)) +' sTemp = Replace(sTemp, "{lat2}", CStr(hbound.lat2)) +' sTemp = Replace(sTemp, "{lon2}", CStr(hbound.lon2)) +' +' Else +' If $cWMSArgs.Exist("tilerow") Or If $cWMSArgs.Exist("TILEROW") Then +' If InStr(sTemp, "{q}") Then +' sTemp = Replace(sTemp, "{q}", TileToQuadKey(x, y, z)) +' Else +' sTemp = Replace(sTemp, "{x}", CStr(X)) +' sTemp = Replace(sTemp, "{y}", CStr(Y)) +' sTemp = Replace(sTemp, "{z}", CStr(Z)) +' +' Endif +' Endif +' Endif +' +' 'sTemp = $sPattern & +' 'sTemp = $sPattern & "?bbox=" & hConv.Lat & "," & hConv.Lon & "," & hConv.Lat2 & "," & hConv.Lon2 +' Print sTemp +' Return $sPattern & "?" & sTemp +' +' End +Private Function GetWMSTilept(X As Integer, Y As Integer, Z As Integer) As String + + Dim hBound As MapBounds = Geo.TileBounds(X, Y, Z) + ' Dim hbound2 As MapBounds = Geo.TileBounds(x + 1, y - 1, z) +' Dim hConv, hConv2 As MapBounds + Dim sTemp As String + Dim s As String + + If Not Me.MaxBounds.Collide(hbound) Then Return + + For Each s In $cWMSArgs + sTemp &= "&" & $cWMSArgs.Key & "=" & s + Next + + If $cWMSArgs.Exist("bbox") Then + 'Print X, Y, Z, hbound.Lat, hbound.Lon, hbound.lat2, hbound.lon2 + 'Invertion de coordonée + 'hbound = MapBounds(MapPoint(hBound.lat2, hBound.lon), MapPoint(hBound.lat, hBound.Lon2)) + 'Swap hbound.Lat, hbound.Lat2 + 'Print X, Y, Z, hbound.Lat, hbound.Lon, hbound.lat2, hbound.lon2 + If $prjWMS Then + hbound = $prjLatLon.TransformMBounds($prjWMS, hbound) + Endif + 'Print X, Y, Z, hbound.Lat, hbound.Lon, hbound.lat2, hbound.lon2 + sTemp = Replace(sTemp, "{lat}", CStr(hBound.Lat)) + sTemp = Replace(sTemp, "{lon}", CStr(hbound.Lon)) + sTemp = Replace(sTemp, "{lat2}", CStr(hbound.lat2)) + sTemp = Replace(sTemp, "{lon2}", CStr(hbound.lon2)) + Else + If $cWMSArgs.Exist("tilerow") Or If $cWMSArgs.Exist("TILEROW") Then + If InStr(sTemp, "{q}") Then + sTemp = Replace(sTemp, "{q}", TileToQuadKey(x, y, z)) + Else + sTemp = Replace(sTemp, "{x}", CStr(X)) + sTemp = Replace(sTemp, "{y}", CStr(Y)) + sTemp = Replace(sTemp, "{z}", CStr(Z)) + + Endif + Endif + Endif + + 'sTemp = $sPattern & + 'sTemp = $sPattern & "?bbox=" & hConv.Lat & "," & hConv.Lon & "," & hConv.Lat2 & "," & hConv.Lon2 + + 'Print X, Y, Z, hbound.Lat, hbound.Lon, hbound.lat2, hbound.lon2 + 'Print X, Y, Z, Mid(sTemp, InStr(sTemp, "bbox")) + ' Print + ' Print + + Return $sPattern & "?" & sTemp + +End + +Private Function GetTileUrlpt(X As Integer, Y As Integer, Z As Integer) As String + + Dim sTemp As String + + If $bUseWMS Then + sTemp = GetWMSTilept(X, Y, Z) + If Map.Debug Then Debug sTemp + Return sTemp + Else + If $bIsQuadKey Then + sTemp = Replace($sPattern, "{q}", TileToQuadKey(X, Y, Z)) + Else + sTemp = Replace($sPattern, "{x}", CStr(X)) + sTemp = Replace(sTemp, "{y}", CStr(Y)) + sTemp = Replace(sTemp, "{z}", CStr(Z)) + Endif + sTemp = Replace(sTemp, "{s}", $aSubDomains[Round(Rnd(0, $aSubDomains.Max))]) + If Map.Debug Then Debug sTemp + Return sTemp + + Endif + +End + +Public Sub SetPattern(sPattern As String, Optional cArgs As Collection) + + $sPattern = sPattern + + If InStr($sPattern, "{q}") Then $bIsQuadKey = True Else $bIsQuadKey = False + + If cArgs Then + For Each s As Variant In cArgs + $sPattern = Replace($sPattern, "{" & cArgs.Key & "}", s) + Next + Endif + +End + +Private Function SubDomains_Read() As String[] + + Return $aSubDomains + +End + +Private Sub SubDomains_Write(Value As String[]) + + $aSubDomains = Value + +End + +Public Function CountActiveClients() As Integer + + Dim i, j As Integer + + For i = 0 To $aClients.Max + If $aClients[i].Status <> Net.Inactive Then Inc j + Next + + Return j + +End + +Private Function TileToQuadKey(X As Integer, Y As Integer, Z As Integer) As String + + Dim sQuadKey As String + Dim iDigit, iMask As Integer + + For i As Integer = z To 1 Step -1 + iDigit = 0 + iMask = Lsl(1, (i - 1)) + If (x And iMask) <> 0 Then iDigit += 1 + If (y And iMask) <> 0 Then iDigit += 2 + sQuadKey &= iDigit + Next + + Return sQuadKey + +End + +Private Function Opacity_Read() As Float + + Return Super.Opacity '$fOpacity + +End + +Private Sub Opacity_Write(Value As Float) + + Super.Opacity = Min(1, Max(0, Value)) '$fOpacity = Min(1, Max(0, Value)) + $fGradStep = Super.Opacity / 10 + +End + +Public Sub _free() + + Dim hClient As HttpClient + + For Each hClient In $aClients + hClient.Stop + Next + $aClients.Clear + ' $DB.Close + +End + +Private Function Loading_Read() As Boolean + + Return $bLoading + +End + +'' Define the cookie file +'' Allows to define the cookie file shared by all the httpsockets. +'' Usefull for using with some server that query a session. +Public Function SetCoockieFile(sFile As String) As Object + + Dim hClient As HttpClient + + If Not sFile Then + For Each hClient In $aClients + hClient.UpdateCookies = False + hClient.CookiesFile = "" + Next + Else + For Each hClient In $aClients + hClient.UpdateCookies = True + hClient.CookiesFile = sFile + Next + Endif + +End + +Private Function UseWebMapService_Read() As Boolean + + Return $bUseWMS + +End + +Private Sub UseWebMapService_Write(Value As Boolean) + + $bUseWMS = Value + +End + +Private Function WMSArgs_Read() As Collection + + Return $cWMSArgs + +End + +Private Sub WMSArgs_Write(Value As Collection) + + $cWMSArgs = Value + +End + +Private Function MaxBounds_Read() As MapBounds + + Return $mbMaxBounds + +End + +Private Sub MaxBounds_Write(Value As MapBounds) + + $mbMaxBounds = value + +End + +Private Function WMSProjection_Read() As String + + Return $WMSProj + +End + +Private Sub WMSProjection_Write(Value As String) + + $WMSProj = Value + $prjWMS = New Proj(Value) + +End + +Private Function CacheRefreshDelay_Read() As Integer + + Return $iCacheRefreshDelay + +End + +Private Sub CacheRefreshDelay_Write(Value As Integer) + + $iCacheRefreshDelay = Value + +End + +'' Remove old files from cache. +'' - iLastUse defines file age in days +Public Sub ClearCache(Optional iLastUse As Integer) +'needs some testing... + If $sCachePath = Null Or Len($sCachePath) < 5 Then Return + If iLastUse Then + Exec ["find", $sCachePath, "-mtime", "+" & Str(iLastUse), "-delete"] With ["PWD", $sCachePath] + Else + Exec ["rm", $sCachePath &/ "*"] + Endif +End + diff --git a/comp/src/gb.map/.src/_ViewLayer.class b/comp/src/gb.map/.src/_ViewLayer.class new file mode 100644 index 00000000..d1f9e3c3 --- /dev/null +++ b/comp/src/gb.map/.src/_ViewLayer.class @@ -0,0 +1,124 @@ +' Gambas class file + +Event foo +Private $colSprite As New Collection +Private $bMouseDown As Boolean +Private $memZoom As Integer +Private $bInCursor As Boolean + +Public Sub _new() + + Dim hMv As MapView = GetMapView() + Dim hPlus As Sprite = New Sprite(Image.Load("plus.png")) + + hPlus.Move(30, 70) + + $colSprite!bar = New Sprite(Image.Load("bar.png")) + $colSprite!bar.Move(hplus.X + (hPlus.Width - $colSprite!bar.Width) / 2, hplus.Rect.Bottom - hplus.Height / 3) + $colSprite!bar.Height = 150 + hplus.height / 3 + + $colSprite!plus = hplus + + $colSprite!minus = New Sprite(Image.Load("minus.png")) + $colSprite!minus.Move($colSprite!plus.X, $colSprite!bar.Rect.Bottom - hPlus.Height / 3) + + $colSprite!cursor = New Sprite(Image.Load("cursor.png")) + $colSprite!cursor.Move($colSprite!plus.X, $colSprite!minus.y - $colSprite!cursor.Height - (150 / hMv.Map.MaxZoom * hMv.Map.Zoom)) + $memZoom = hMv.Map.Zoom + +End + +Public Sub _Draw() + + Dim hSpr As Sprite + Dim hMv As MapView = GetMapView() + + If $memZoom <> hMv.Map.Zoom Then + $colSprite!cursor.Move($colSprite!plus.X, $colSprite!minus.y - (150 / hMv.Map.MaxZoom * hMv.Map.Zoom)) + $memZoom = hMv.Map.Zoom + Endif + For Each hSpr In $colSprite + + hSpr.Draw + + Next + +End + +Private Function GetMapView() As MapView + + Return Object.Parent(Me) + +End + +Public Sub _MouseMove() + + Dim hMv As MapView = GetMapView() + Dim iZoom As Integer + + 'hMv.Mouse = Mouse.Default + If $colSprite!plus.Rect.Contains(Mouse.X, Mouse.Y) Then + hMv.Mouse = Mouse.Pointing + Return + Endif + If $colSprite!cursor.Rect.Contains(Mouse.X, Mouse.Y) Then + hMv.Mouse = Mouse.SizeV + + Return + Endif + If $colSprite!minus.Rect.Contains(Mouse.X, Mouse.Y) Then + hMv.Mouse = Mouse.Pointing + Else + + hMv.Mouse = Mouse.Default + Endif + If $bInCursor Then + $colSprite!cursor.Y = Max($colSprite!plus.Rect.bottom, Min($colSprite!minus.Y - $colSprite!cursor.Height / 2, Mouse.y - $colSprite!cursor.Height / 2)) + iZoom = hMv.Map.MaxZoom / 150 * ($colSprite!minus.Y - Mouse.y) + If iZoom <> hMv.Map.Zoom Then + hMv.Map.Zoom = iZoom + $memZoom = iZoom + Endif + hMv.Refresh + Endif + +End + +Public Sub _MouseDown() + + Dim hMv As MapView = GetMapView() + + If Mouse.Left Then + $bMouseDown = True + + If $colSprite!plus.Rect.Contains(Mouse.X, Mouse.Y) Then + hMv._ZoomUp(hMv.ClientW / 2, hMv.ClientH / 2) + hMv.Refresh + hMv.Lock = True + Endif + If $colSprite!minus.Rect.Contains(Mouse.X, Mouse.Y) Then + hMv._ZoomDown(hMv.ClientW / 2, hMv.ClientH / 2) + hMv.Refresh + hMv.Lock = True + Endif + If $colSprite!cursor.Rect.Contains(Mouse.X, Mouse.Y) Then + $bInCursor = True + hMv.Refresh + hMv.Lock = True + Endif + + Endif + +End + +Public Sub _MouseUp() + + Dim hMv As MapView = GetMapView() + + hMv.Lock = False + $bInCursor = False + $bMouseDown = False + +End + + diff --git a/comp/src/gb.map/Text1 b/comp/src/gb.map/Text1 new file mode 100644 index 00000000..642621a0 --- /dev/null +++ b/comp/src/gb.map/Text1 @@ -0,0 +1,10 @@ +.WMSArgs!service="WMTS +.WMSArgs!version="1.0.0 +.WMSArgs!request="GetTile +.WMSArgs!layer="ORTHOIMAGERY.ORTHOPHOTOS +.WMSArgs!style="normal +.WMSArgs!format="image/jpeg +.WMSArgs!tilematrixset="PM +.WMSArgs!tilematrix="{z} +.WMSArgs!tilerow="{x} +.WMSArgs!tilecol="{y} \ No newline at end of file diff --git a/comp/src/gb.map/bar.png b/comp/src/gb.map/bar.png new file mode 100644 index 0000000000000000000000000000000000000000..edfb0af9399393a6f7cd4ed046fc44f48551d0e5 GIT binary patch literal 96 zcmeAS@N?(olHy`uVBq!ia0vp^>>$j+0wnXI=SKi3bx#+^5RU7~8j-u-o&OI8`+xfX q6jNgpIdJ4a$AdrVM<%E?ax<)*&9io{z=y>^EexKnelF{r5}E)*Ga=Ie literal 0 HcmV?d00001 diff --git a/comp/src/gb.map/cursor.png b/comp/src/gb.map/cursor.png new file mode 100644 index 0000000000000000000000000000000000000000..97c1c1988dce1d211ecf99be29a61f76fd8af707 GIT binary patch literal 349 zcmV-j0iyniP)6o#Ms-R}-FBO}a|ZYeS;v#>S`*|SpCij}>8!CzphDM?DCBuiyujfE*$P~^9w znd{Enx%WF3GbWiyc~__RJiX^V78W)gbS+LMhaww`pAyjF{n^erWvUWcXcGC{+*&f* zV`!^4T{>A=_;?ZzI&qg*_kx;;hDM{4u3YGaKGJ?V;F*q~sXaKfZ#|Pk$ z4PF3qsz%5ud|vU**xy1 z7j26_-#^qn&d3d;(P*dES~BalJRGpaP*IXH{I;442`EZ%oxRG)=J@~$(G-5{Ie}|y zC3q&Vn+4~~e{r6=WI*SyGp{L)sX7r@fqMOSFe=8MPtR#sQqgxW-Y6&V*WGQ|d^rMN z&=PU+(Z~HYIS59RU0Uq0fzFl6aSBEZ82C_D`LN%dc|RNoNXqg600004tUy literal 0 HcmV?d00001 diff --git a/comp/src/gb.map/point.png b/comp/src/gb.map/point.png new file mode 100644 index 0000000000000000000000000000000000000000..3ff6f5a087c2ff898c62c58a347b56629ebbddd1 GIT binary patch literal 1010 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

        = 2 Then Return + Return True + +End + +Private Sub ConvertMarkup(aLine As String[], Optional bDoNotSetLine As Boolean) As String + + Dim iLine As Integer + Dim aResult As String[] + Dim sLine As String + Dim I As Integer + Dim bCode As Boolean + Dim iBlockQuote As Integer + Dim sCar As String + Dim bInsidePar As Boolean + Dim bIgnorePar As Boolean + Dim bAddPar As Boolean + Dim iIndent, iCurrentIndent As Integer + Dim hMarkupList As MarkupList + Dim bJustList As Boolean + Dim sLink As String + Dim iPos As Integer + Dim aList As New MarkupList[] + Dim sTable As String + Dim iIndexPos As Integer = -1 + Dim aCommand As String[] + Dim aSaveMarkup As String[] + Dim aSaveTable As String[] + Dim aSaveTablePos As Integer[] + Dim aSaveTableClass As String[] + Dim sClass As String + Dim sList As String + Dim bSaveComment As Boolean + Dim aTemp As String[] + + aResult = New String[] + + aSaveMarkup = $aMarkup + $aMarkup = New String[] + aSaveTable = $aTable + $aTable = New String[] + aSaveTableClass = $aTableClass + $aTableClass = New String[] + aSaveTablePos = $aTablePos + $aTablePos = New Integer[] + bSaveComment = $bComment + + ' iLine = 0 + ' Do + ' If iLine >= aLine.Count Then Break + ' sLine = LTrim(aLine[iLine]) + ' If Left(sLine) = "%" Then + ' If sLine Begins "%IF " Then + ' Else If sLine Begins "%ELSE " Then + ' + ' Endif + ' Endif + ' Inc iLine + ' Loop + + For iLine = 0 To aLine.Max + + sLine = LTrim(aLine[iLine]) + If Not sLine Then Continue + If Left(sLine) <> "[" Then Continue + I = InStr(sLine, "]:") + If I = 0 Then Continue + If I >= 3 Then + sLink = Trim(Mid$(sLine, I + 2)) + $cLink[Mid$(sLine, 2, I - 2)] = sLink + If Left(sLink) = "#" Then + iPos = InStr(sLink, " ") + If iPos Then sLink = Left(sLink, iPos - 1) + aLine[iLine] = "" + Continue + Endif + Endif + aLine[iLine] = "" + + Next + + iLine = -1 + While iLine < aLine.Max + + Inc iLine + sLine = aLine[iLine] + + If Not bDoNotSetLine Then + $hMarkdown.Line = iLine + $hMarkdown.Current = sLine + Endif + + 'If $aMarkup.Count Then + ' aResult.Add(ConvertLine(sLine)) + ' Continue + 'Endif + + sLine = RTrim(sLine) + + If Verbatim Then + If sLine <> "]]" Then + aResult.Add(aLine[iLine]) + Continue + Endif + Endif + + If Not sLine Then sLine = aLine[iLine] + + If $bComment Then + iPos = InStr(sLine, "-->") + If iPos = 0 Then Continue + $bComment = False + sLine = Mid$(sLine, iPos + 4) + Endif + + ' Special command alone on its line + + If Left(sLine, 2) = "@{" And If Right(sLine) = "}" Then + If sLine = "@{index}" Then + iIndexPos = aResult.Count + aResult.Add(sLine) + Else + aCommand = $hMarkdown.Command(Mid$(sLine, 3, -1)) + If aCommand And If aCommand.Count Then + If $hMarkdown.Reinterpret Then + aLine.Insert(aCommand, iLine + 1) + Else + aResult.Insert(aCommand) + Endif + $hMarkdown.Reinterpret = True + Endif + Endif + Continue + Endif + + ' Blockquote + + I = 0 + Do + If Left(sLine) <> ">" Then Break + sCar = Mid$(sLine, 2, 1) + If sCar <> " " And If sCar <> gb.Tab Then Break + Inc I + sLine = LTrim(Mid$(sLine, 3)) + Loop + + If I > iBlockQuote Then + While I > iBlockQuote + aResult.Add("

        ") + Inc iBlockQuote + Wend + Else If I < iBlockQuote Then + While I < iBlockQuote + aResult.Add("
        ") + Dec iBlockQuote + Wend + Endif + + ' Lists + + If Trim(sLine) Then + + iIndent = GetIndent(sLine) + GoSub CLOSE_LIST + + sLine = Mid$(sLine, iCurrentIndent + 1) + + ' Horizontal lines + + ' If Left(sLine) = "*" And If Right(sLine) = "*" Then + ' sText = Replace(sLine, " ", "") + ' If Len(sText) >= 3 And If sText = String$(Len(sText), "*") Then + ' GoSub CLOSE_PARA + ' aResult.Add("
        ") + ' Continue + ' Endif + ' Endif + + If Left(sLine) = "-" And If Right(sLine) = "-" Then + 'sText = Replace(sLine, " ", "") + If Len(sLine) >= 3 And If sLine = String$(Len(sLine), "-") Then + GoSub CLOSE_PARA + aResult.Add("
        ") + Continue + Endif + Endif + + iPos = InStr(sLine, " ") + If iPos Then + sList = Left(sLine, iPos - 1) + Else + sList = "" + Endif + + If sList = "*" Or If sList = "-" Then + + hMarkupList = New MarkupList + hMarkupList.sType = "ul" + hMarkupList.iIndent = iIndent + 1 + GetIndent(Mid$(sLine, 2)) + aList.Add(hMarkupList) + bJustList = True + If aResult.Count And If Trim(aResult[aResult.Max]) = "

    }2e9Ov(6AVbpkamGdlF7kjJedK(sov;DWN-NMqmoe8#CrJSE zJmoQuYy!+{n-OQYVvHJr%N%0{_~83`W#0uUBi^~>Y!|%%ytW7MI~Z5Z90amV1_4l7 z=STpr!UI^(o-zQ+EJsZyqMFGKsqLeH0O0pt~=W6?V^io++c#ZrFUMSnhp+|HPGUK`mOXQ z{Ahp%2egR+)`VdHl?G=x2F@sLOa*SAr`;JYj#RI~KzpVyw0#kf934=frmS0k*Ijj} bScg9WsNVZDMo|oq00000NkvXXu0mjfq5LxQ literal 0 HcmV?d00001 diff --git a/app/examples/Image/PhotoTouch/hflip.png b/app/examples/Image/PhotoTouch/hflip.png new file mode 100644 index 0000000000000000000000000000000000000000..72f46a74625595b9b4575f93bd99043804e858db GIT binary patch literal 953 zcmV;q14jIbP)7NO6vzK>gepNAgh(Z&iACwoqC_MlB`gThg$N5>kyz=14M`=eDpoHfzC(3mYf&sp z5G)$RM^TArd_;92ZK&$|*}T`ecji8wnfE3VdFO53%$$4vznQsn&$&mcSj8$j z4%5pJAIP$zs8=IdJ}^WthnQVX`FdXB+X&m7UfUTlyk4-hT=I1cVB09mLSD-l4R{Su zR}T5PJSS`yLw=VWUeB3Zs(cMkaoO9DXTQ_$2{on2S8>~ncF+Gi9`YS8T)J-~+@dPE ze770tI4#Ce$a}(CIAJ4nCqlrZ(~NSOOk{uzXKaK{y!Zeo%?Mq1C^CTX=&}(y;>sU0 zN8ey7iUlC1a>GVwk0ak^j=akZ6dORy;I56(7FE8LoIk3UIr)Hb0mK}7O@JJ&QRFxC z%OCTOMHAs{fa2C-j9A1w^U^OiO(ws_T+csJZv;yMAnN&KUL0Y~-{e=D@m)B zU2s4yP-BE?{7hdQXZPxCK}?cfXl>@3fA_O^WCHGU+(YTV{q}=;$gG0=bUWuANkv|W zqc%bzPjcBj+mV{Q5FIwcB}r^B&zvKZDnN$wHbS$w=^tHZN~-cgOyRl-&@Da}{`XLw zy1Wq8^!NauJWZ4eW6DMN$V#`I#{2_M+%ldA(^9|xK%I9pFbS{Xr79n&^PoBO8D>)j z$c8_|@Ius{ntZ!^Aqp?W2UC%6v*q(ku`?Ovv`bx%`CF@15oY-V4LHv3)D;=Ext)w8 ziTS+p@qV+zaSzGU@eY2QF0YvHU}Q1xeVxK+e0Cpg)oiny5*2&z4W#q>?16xr594LY}Xk zemzu|ATRy%Mx_+YlK>1;8}h2Px4;z3d5IAIZL?a+x9cC%Pv4~N`ab%3T;_It#VS^@ b|Jwcl^XW?!Ud0Rp00000NkvXXu0mjf@VU3= literal 0 HcmV?d00001 diff --git a/app/examples/Image/PhotoTouch/icon.png b/app/examples/Image/PhotoTouch/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3107012937f062a452029c64c7469d837a07f718 GIT binary patch literal 4904 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 literal 0 HcmV?d00001 diff --git a/app/examples/Image/PhotoTouch/magic.png b/app/examples/Image/PhotoTouch/magic.png new file mode 100644 index 0000000000000000000000000000000000000000..a97ee5fa15543f2d885e2c359697c9314f4cf9c0 GIT binary patch literal 1093 zcmV-L1iJf)P)`VYx+lh!jRHokw%f{THdSuG>IkPTWH|JHe7DJ=jSu!6DA@XFwiHSiuG&E-^|J+2wXi zyUZ5?{*}r(btJrnbR^5YGBrmb*i75AdT~ zyf4pP3kQ`Z5vpBfKA@jA1{~{_TVdsyniumukN6yQoJ#r)ylrZ{%6Ior#wsIk6fnbg z_W*_I3kVYd2pFYX9cEz*xWE$1DP##C^RW?x_h?b8!5 zz=%i9RhILG#;m7&bl*Y3%5nal=>DaH13Ji_fH{UOrF;st&v+!-Io&4>TGFF z+5C4&bb11IraZh}Mny#AuoP%~fxKrte_WGw*$X%+wn2Zrh%}0&aS{1yl0(p5nURfv zUu3q&zII|v^Q2QIM~Bv3ssPVfaGe{YKFoJiPBD`n=TnL@nTBI*;0MRD zIKoHdDYY&tXd^oHT&9L+G7+$yPZX=3I@Yky&~7bll&0Z+JPadDW1vbKVo%>0_aa*- z^!;-(DCr}X{unr~{I8X9*hy0Zo3wUuZloE#H;e+@b$=$un5`snKTj#`x~bESGrkFM z9Uh`wWAZu5V~X9%Mr}y?EZ}wOQn&~ovp})mXGc&1R?}$Y7xI~QZfxLNe+1|!w}pH_ zp2tH=IZD1`348nz@Vi16af}Bhd90QeWnTZ`kAM<|-aqByx{-RPym}e}lq?rJr6@0@ z@#qfnY2qd?v&EkbxLA^=_U$AX;b5AlY4dr}DBv4@okmP%#QEAI3?C3_T7A3`<<`BeaXCXxVOQHA!TG#~}%QXIrV8BX{YjYNM5@Qo$Kr2xMQ9(>Z zEK*27Nk9utVG%H(CLtj~{JYmeHoLbobGv)r+=!5Go1NL8_xZk=eP?%p)%bsdB_80q zehdJ*b zffJ!#AHiMxB1CAB;Y{KvzD7-j{=5i606BsfK#Jf1K!)H1z<_Wgt1mbL&=7#D*$@J~ ziwcLZ2OH69ykb*5gy+~0byT>h26E;>#p8UzZEtd= zOdklA!?Qn#<+CHijYzGaWSlkiV;o14?r1=8=7gru40=GHj!gwH7<7dvyaE`iFv#6r z0W^d)xJ4B;Jplamg@vfug)Ywkz&MV@jcvbo0N@>#qeg6@_XJSD6BMK7$7namf3y5i z!f1Th=P>HE0ttEGvijx`K$E|thU3j918DO1ai;c+rUDq`d(sq8mOdy9g*0!WY1wAN42yKK2O%5gGl0@_nd+MQu9@~b}<`QgA zt;K_l9wfOGdZ;u|XcMeC2t^W%F=9e4(IzR1uF-!Fb@q)rv(F~(yuJ9}%X{B{=6%1J z_h$C(eux5m-c-LPwWR;_P*?Sls{Y@(J5OGt%Zk#HK9(0hz&_npehsN4UVy#U^pbQj zUVsbQP8({rkC711tt9tJ`JHh_nMaiII^DcvjvD5qb(9@k|8aAn16wA$M$^VxRYhD= z@TH$)LCGAeD>x1B*hcZ5e+H=a8xt(&Sic23`)z~l1YnQfSPWTz2Rr3)0Te{L0HqFc zl<+Ps?56@)VUBBz@zf>2H|BMumg!;Km>muPMp@s|UuV>G z>Ky>g+ai??0A!66{kx#(0MGImR?pHBiobG*L$xkYS!b&9A@s0-ixyr%#Q$@=I`iqwyN_mYBOgGQ|Jyw8T^Rmgie~(cf z?S9j`e~%I1RljN7zsCshqTjUc-(v*G%D#Vh08kw50_+0p0(fSxl?s``NL9#9N3^1j zwvM~%nb%!w=)hp4EyqjJm~A(b%yHZDj1r2>p%K5Zv969w>WEt0v%;Xkbfi z%2Kkik2{!9CqMZ(8w~LWkAM`doXS}s5BZ)cG9;+u1kE{DmA7bRAGbXrkH4s=IJ!Zj z#|CE$w8ei`Ez`|r)$Ev7^Ohc0b;VMcoYJht9m^K9!&=heVA-xkQ+X1!2=!2NRl#|(TF;;_3sySRzK^(<^q1K>-s|bvgg{%_iY-~ kEv-nBR&+~)YBLYTzs=P?KoiDjVE_OC07*qoM6N<$f;|SVB>(^b literal 0 HcmV?d00001 diff --git a/app/examples/Image/PhotoTouch/oil.png b/app/examples/Image/PhotoTouch/oil.png new file mode 100644 index 0000000000000000000000000000000000000000..a19068ff368e5d0a59d7a4190a2f65d886f5f2bf GIT binary patch literal 1189 zcmV;W1X}xvP)2*I+eKJeTcMFE8u`(PjS-EgO_iXgrbLZ5^g<(QP3nb^YRINyVghQ2VvHiB zDiWFSgs6b9QHYc4u0@b2Ddm=6&98 z&N<)AIU){&DxRgAetu#N7r0aohhNKCRP=DqbiyNSBR5i1P7glDJLHeQSUDZp@5CHq zyg9}9125>jUY_Ah&_p+PP96RcophMX5f<}x?mTQKF%|e)hIIVJ2!aq{9fLs=UEJXs zALn7x*%MQ<|O3Fc=UbJf1rbE%pW)b-e~7K66yl;Wu!aDm#3PBTDU?N$`SD#(MpM zfd}jiH0fHmg)krpHT0=Lo9wQCms08oi5DsvR>Rh1v?3)rxK|dalh;EJYmk^a>9CoB z&s8G*#6!=(4{F#Sc%|bPF{+fdg~s2c-!{+LC<9?sJhi!DUHJ?`F6L++Ml{q!Yo$YusU)RU7Ge$j z)V~bdy)AL0uJ!Gtc#n7e`1h>vA|!RSt&)$wjj-Jv$!Bt>$5Py`p_W9T8ispS_lvjfI5pFT5mKEXP2K~gep{bHx za%=F%r@im2^B3W5J*m}sv%l7Vn`Gh*2XGOVa#UBnDhD26qrU0P#xAS1ZyfHC3~DEt z<-=b@8+qaj|I$+$KEjTC+C8kDcpL#vvypV}8UZj`@ynulgrFxJ#f%`sAGFa~c`nk&qTm( zw%sm$hF-&}+2$Q^YCvw5i5*PJ*r{AK2aCrSHgJEoF(MxsJIzK#+|Y!P85{km$qq5jRM)&JEq z&1G&3T(2}w@g&h4bbeU)xh-2(vC8d4l&WSwb zli5-)buw2fBq6gUE+Rvcmb9d$SN6+3@9-4l{r|;(7n5AF;0)RI00000NkvXXu0mjf Dh?qrE literal 0 HcmV?d00001 diff --git a/app/examples/Image/PhotoTouch/ok.png b/app/examples/Image/PhotoTouch/ok.png new file mode 100644 index 0000000000000000000000000000000000000000..0bf4198acefa8cab107b35aadbcaf7c38f806df2 GIT binary patch literal 655 zcmV;A0&x9_P)L%DwOnbX_9-B_kQKR_tYUL>zngDzjNM%OCk+xSchDtq5+I)PNQn-ot8`c z#_1^Ylx}@w)E0k)_k?SciNnNODn#I|6e#mL$ov*o*kIf={W3>+VmAdBUdT$Jcld3* zL!pR8#NnL^VWclD-Vk_L~PKxx4h_n1~Ou=OMiwAF>>{Boq{=GnhNq&aM zw~_-NG5j9<{hlW0!U`GiGlSqCI2ySXlJU(H_z~8EryfQ$JI}9tc=zrl9tBS=#WV~n zcu6lwtfs>YaiOE&DZM1oXrFqKfEVH_4U)fhF0-93y(ICaeXh>M6bje)kbu9E1+UQK z$qrK~6yjf%w7c&JoaDPdg-ZI}2NdRM1r?_4(svXVd?*Zz_oI*t?^2k_gsSJ zb$c{3C{zczdj1r=;av(9TYUdrNK&Zz*!|#BsIlueeKv){@Gga_Ene!s3)MKhpWP=- zp=Ouft+0EbaNP>;R=B}mJG|6;7aD1v^NXE=Y5G_NJG@iD7B5NM3_R>^GwZ8whCi)1 prdgeq^jU99K7QXD*0BDM`Um~?H5zz-WO4ui002ovPDHLkV1kE*I>!J2 literal 0 HcmV?d00001 diff --git a/app/examples/Image/PhotoTouch/photo.png b/app/examples/Image/PhotoTouch/photo.png new file mode 100644 index 0000000000000000000000000000000000000000..eb7c3c23ab9113faacaa337822aa7b678741ee21 GIT binary patch literal 1068 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 Eg7$gZqW}N^ literal 0 HcmV?d00001 diff --git a/app/examples/Image/PhotoTouch/redo.png b/app/examples/Image/PhotoTouch/redo.png new file mode 100644 index 0000000000000000000000000000000000000000..c8a64d046861d4a66ddc24edea617f9d822bb950 GIT binary patch literal 1042 zcmV+t1nv8YP)qi6Xdw3o42tf?L3Y;6YJAgD5DjC>}&ah;K-Xn(kKx{AaV$d6;ob z!$`z&7uT%T$l1Ay?`c~T7ep<;kE*qEO_cJJsk5!o0bHiuwnro1m(t|_P!Tpp0WeeO zm9v6PD#E7B11u71AUK*IRfH`O1Aygxts?A*7yul?1{Gmf!~o!6zETnPL<|7-;|mpG zulHC+-vVZ#0z*-RV)Q~M0HqkOAD}O;qQBg+-`bE~tZ~j`4d2n#;JEtmnd)$W!9RFh z!l(2wBwb}rgz7*DEMc9OxE=s3b8;W@jlgkiG?CW>fW>^Mx*c{yh->A?;}UY!zBar> zGn&zC6u?`|#uW?{9V?KVB2-iJFBPW|_$6@V5NaIhOjC zwy)lNtRfs`%o|{v@NeVVz~cX|5*Y z6`|I3EilG<+pB?HLjnMM^1h0&-VI=u@L3m{JP79Th79nN1$uxZw#P3PgbD!m;2jxZ zp{=RT#zebu9!*B?40HR08K@Vx6EpzqhH|@oHDviDu|K*Dj1_mcLl@6S9m>S*O^pjz zi8YcP@(RdTSHMs9v{mJgQK8*vK)74oVqC#6xnr~SK{o~6?8cYO%AZ2DxRC+!G69ez zUyEfH^#F+q;A?2|`MBVeuT+mR7P zjQVc>@+v^${gV@j%5U=jnLGvG?MANGQz1p~%)mDhi_WCHCoP9y(K`Ve?ZzPOf_v*a zh@by`3gaA6vh>zeHB+?P^Wn~Fhdi5d?~?*xfEZ)3wy-*;0eHjb;m8BD#97cWEkF)W z(!+ww1CT;&a@m;0xWRci9iBYEN-sQJ0OG6L`0QTZnG3se{P5}^Oi)OQ#KEi4_uzQ@#xXV9cm+Uw+s9w@5 zj}~e%U+(#g2l(yq>WEQd9|L?tcf%t%qa5U^=VS&}6PkDe;i3=ucPt7S0AP%}*=i(T z&td87=^;k&IDe%S|HA#uOHak4&|@y9q5>tFpPu6uu3Ie`iat8~3u81;%~hE31poj5 M07*qoM6N<$f^dBExBvhE literal 0 HcmV?d00001 diff --git a/app/examples/Image/PhotoTouch/resize.png b/app/examples/Image/PhotoTouch/resize.png new file mode 100644 index 0000000000000000000000000000000000000000..b822742094700595336daa8127a20b5d464e0e32 GIT binary patch literal 852 zcmV-a1FQUrP)dkwWQ{xR|oI^hkkMzC>n?i97Z|PB`-U8ITtdc`Jv&2BK7J8uM_g z;XYVW&H_1(Z-GJP5lxB~r)lDp>xdIU?zlM_kX%9YFINV=!*C0E>9pr0N4tCiVcrFJ zVY?X_WW&hN$9d`=L~M>a?XO1U0lv7+V>Xu4-t_5ONI~Fb3J(n6$+T^Ubu40<8H#;l z54fl#8zBHij8Q`kV?GF7bSRMz0Z7OLR5Q+z9kD3wisS_HfzhZh9F^QnWIFpeBd*%LLIMCyz1pc z-hx#w_#hYrFoh6W2~8l_;o(&-v6M*wxJjv2fb8&am%^fZ0D!2{qPuT^ZpB4+p8&ne zi>|-kk2r~X;1yA4QI*9(s+lq6?swXKDL% z`pPQ;NN*iP10qHM+UX9A831UbCnTyJpq0MRxYpNDXh|cl8DNQlw0*P!lriP5e`Epx z&ZPXaHVlwJC=Q7mmX-9Zu03nyh-dvAbQqDZNNg$rENS-F~bxzXkm0u?UNN+}V z4Mju}-)mAJ?=m7kEBV`*kP>-gT>gD>>vlT}{jy<9{EtMPySF?LiS7F`j%(b$|IQ*~ eJhYOlpML?dnOYZ)U)^p100006o!#P=62mOY;oOkPRWE(YKUKl&k>(|{{nh&6#eMO5U3L(?f=w86jZgg+pIByhZMkiUJ;E)*=h{;6QDZ@ccIob zlW4(jR&&U@aHUY5=A%}<_ZtDd<*-wj9q7Bey$85l=>EaF_hClhIoHUdGxF{Q3Sb;< zu6+PUBNq_73f7>?HTM{Wu0azLxF2y;qXKcrq;BM|?R9-KVM3S9v!M61OC_?@~hBfl^q2tjk; zA=em3ztZtlY%N}K86z0Q4U8a-G5myX9CxHt6eM82Yn(+^;Wh_vcyA2j0D5r<15QeF zuzeoEK6l){RSy5B@(?Gvk>#PVl7K!p>RSqY9d8Q!InFg91nq=%u5nS})P{S+#b)R9 z9TAXJIIR)pU-;StA0U8L$UnP%X?#ekoO?aS~kyi;@Zc z>YqUpwn^wsDn~g#0-S;#%=35jAAx{fw-Y6J&A(cx+oHm&1O%q`4nC|S;AwS~5CTfk zqN;RDemNh(U=c@u0ewCaR*BPG6M~EQ*mQ{xhB|&s{5s`{xLrrU9^rqAbs_N^nUe*q z)e$g@qoPF*%R}Iw@qS3zr-26mZjxJd(Xqs@m0wTDbDX0o00n!>4lDd}rsW`4xKJAp z(DA<9wHxD?@LxH=Fc%r%0f1%vQM4cDY9su7CT096n+@>*z*_z(VvKN+Hok#>%lMmI zZGi^>Hu8dq^AGE_@H03d<$srMhn(BzZ< SSoQ$`0000UB7qPD zA2b*nHA;<9QGBW<+6OA&M^cPnYeK5UTCvdDE%x*815D@6vO9ZccDkNE;B->2UgD zBhhkQPsk z0dTK6y{wURh$jmOfY4&?(Ub`=se1|vfY1h|OoX#qT3`UQT7xD+d%*$F?HcpCnbF-g zx`_zOC98eMQ(nViXTe7Rp$>Bz?keyI0BmQ*Ydrct0Q^XY*Vv?Fu6VB&q};v05&9S= z#lH+Q#_tSpl5-&tnt9J_G&-MKrs-Hvsq0ajnpA4F3Q9EWCGN83)^oWl?uhoQ#sc9} zFXgyBzyiA+!H8ON0&Fu&Q<*(NwT{{#NU!94AsM#DauEV3!CD%*mLv-)BgrDlsK}JI zg?#~?7L%gbZESYlvL1ts<5H?S)vEV(&iq+pIo3k27rG-ac>`p=T6EUy_dp=PVK4Bb zm;eA&>lM5US{wkd*8}JZ?laVz(CKBX>nC|QAacNSt6~HI4$|+s>jJ_CJ-0Ge0B4#{ zT))8%phSz}90BNbohq)*8uYi>D32H5gy*iz8Z>S;<`H1w0eX?^)?^KuFdOq@1#rf_ z@vXK42poaHPdxzDvXMF#X8J`}X3g?V!7jPmi3tYzjIW&;>`V#m3@S=Hvc8Cx2Bm$g zYFmKa!BufjR)C7#;}7O)0%6I+4-vv2q&f)i`mW&yzZTq`6p0BmrbAc-4YXNWH| z2K*2J@L`6#E2zJ$?*P+_-lT2M>tp5ORcBW7Q#Jtid+{@RJWu&0<|ajY+X4V|$lP6S z%tJn@PE&qV*VzFqGmnDCwJxH3LI?eiVT+YKfNs%{mzUC-NB}SStB@8&knws#lmrS30e0VwML`g?{oh%u=0JbVqdS9LNJ`iB6i&SW~8= zJFc~JBoCk(oi?@ZQ$p?jwg1>0%0qgo9@YWBe7K?;5ux6Ha%5Qeq8kyxSE^?%TG5S& z;49UV@+rCz5jL5Bl&D+F3MvnvReD{g^sA2PnGi>_0Q?77-u`9h26vuzlPFp2JGLg(AqDYnaim!$EXxbnqNQ597($uPnNQ7X+!b%8>CM-rQm<5rj zZwp1V8bLx-L}F4+szJ~M@!6^3SWIW$ee?D1n|b4P;eQwJp7Y+h=l|}x@7{av^9Tu) zvWOtdnMtnr&OO>_;~@juHWDkP5|(e`6nbT@pjTp-Vrh2Fc?_SWTAzSNPC4veMC6C8 z&?RuR0PaOZe(D6G2tV6$9(37J!dmNxyws@T0L|RwPmUgaG%!O|1leo-6@-jFi%Ny= z;LTW?)FAwkG1g-sVmyB)Z}&)r{8A}wvK|AIjoxT?An-kOsp53&F`$NH@LI-a+m4U2 zJE;`_JhliJR%Nycl-Rb2p(sZ?$MBzk>jb>{H<1-fXi_BMIc;?QO9Jzlm!f;i9S-w2 zCb$uT02^tg+C2gQqqxorHwi#Fmsp=+3<&RSxA(<9g%S>NE-it6{CT`uglL94MNBon z@dPFn;44^@{1oMe>?`>vWFL{VtJMxC}%BWOq%bU$eV(2k^_cVlZC)NW+iDN z2?DEFWZU&VegW`NRgTC=U^26S7A__<$CSHE*>0P_{y_p}WF$}yKnKSYnkL&Wb>RAH z_@BTKAfW7`i(Mh`*br8_K)_22bK^pgDMSYAeE`g+QF*i=kZLuR>sHd!j+BJ|dHNJo z6T=2=8%Gd6#6)w(JagZ+pd0Q2mvxm zP0>X}dStVdIgqNSFXj+<1fYsL$(x`Lyh-4j^J4Ug9ZctnelO&Y)cLiO)y!uOV;K&>!Zhh+K?wjnQ0AF~g(WZq z_5(wnK(A5t7ho!~CUC>3j;7890?&A32>Yo>)H?v^OO$n4f{FEtrTt2>8-~4xxu_xcjtMie@1OAqGREe_GAiGc^v0Q)uuuoK?8msGFDam z<{DSiCY#w%#4^^IkG1Rc2tXyRW(p1=pgR$DQOj$`-5=wfo$yu4D@T6k#c@hJqV*LR zWun}4%zd*I$9`JbEvu6E&^h3ngrzjrp6(!2;bklJj7!Q|^zf7xu5&k2lHdaV0-sT8 U4^P$zJOBUy07*qoM6N<$f`Zr282|tP literal 0 HcmV?d00001 diff --git a/app/examples/Image/PhotoTouch/save.png b/app/examples/Image/PhotoTouch/save.png new file mode 100644 index 0000000000000000000000000000000000000000..122f75e862ef0915c988c450c71df14ce6dc0574 GIT binary patch literal 674 zcmV;T0$u%yP)P1=ZJd;rl1mA9+*T$-wE98e%|egHzIvY13<3(xeyB=hp3kN zTVMe!fCb0^_$!>~Z?9f}b>Yn5cq#xNgp;Asvj_bEpv$)j$v^WI`%lW{d;;>Xgx>$tb(!l%<=@Z=2LK)3 z=Z<#aeR_P%i&CC&LjFYMFoAO#r^r9CieJ4!C++EZ>c5Eo0mQyS|JW=jdH?_b07*qo IM6N<$f*6%9ga7~l literal 0 HcmV?d00001 diff --git a/app/examples/Image/PhotoTouch/scissors.png b/app/examples/Image/PhotoTouch/scissors.png new file mode 100644 index 0000000000000000000000000000000000000000..de748cfbef2a7dc2d990364465bb49ea257747eb GIT binary patch literal 1549 zcmV+o2J-odP)rM5f-n?^CBlmGz?Mgk;CurUF_A{d{E`avO9q6mB#P-95Y2ofVA zrUVl|L=vzGzJ;g_5JdsQL&c&kv_NQ~t(3NR`O%rP_nA3o=FF{$dp>6FnYH#>_x7B9 z9wqvpBNYcgIW45o)Iq!H+f>>uDYEDus-(fxKp&-k?}t0&U?Vv8A>WBrfc=8C5jmO4 zXJZHSs7GNes}S`8)`!T>%)r|S$GfqtEe6)+OynPjDbkn~$(jXoJeE{`B-)sLQKmYI zfmYT)9J8=mQIgC+Epvatjrdt6TV-XfX3$}j;HYG6Ng`i?UZ2;3kswS&52xxxxsg?l ze|$(c?gU{J&NHhAQugg}q{%*gtj0h>J563MD{l^=q3pR?afM99Y(nQU>0 zCA3Z>Pw_-aXvbhT1B;n6S0y4WkOt0SsKyzJW`6mgU{y-iA~yr7{4^s+q#}GGlW7$} zj{cn*X8syh1g`_7&7=Y@fo9M`OP~5fL`~hC49C_?-x!hQ9wE3$lQ_2=Jzxfw|0B zZb>@|mo@oTlv+AIIhQUzb3h z2!n8vx$jsc3eki{6k6VD%i~iHB`9EFCeLudQj5p}ZSI%Xaw(t2%!KkpMA*a`dN9u- zWWE;483TAL19>9k%BimhPddv#rOO{cZbk-(Fa~EiPcK#?6)T>?OS*gu$}*HEBEkf@ zK>_wyyPV%G14a4@Cig?0hzPTJb_9S!xY;USh97nLj*L2Az(6V1%6bBHqT2Y=SL;rJ zYgmWU{)x}gcKRYd2pOn_CHCRI%*2ba3)Xlwy6OjGm%~ylAU_FB_Ixd>D=xzl@2Lna zQ5G68A&LBCo{UWKj3+u6m(i#;FV7+}+EC#tUm{080Gz~L>{XM)5oCLkeG6`X@t&i$ z<2qi&Uyk!3c1zZ7j8}i>3hV(eLw()~0C-P*o?*nxzThG+7G%As4%EIB9#+r(!s)!& zK~{zE%k{c=f4qT%jIOcF^L=-A>hB*4jQFL}Kz*G2M8?*s6j`_n(?avWR)q|1VuScP zX<<^df%QHvjaxkW2=9dGFh(c=LY5eI&0dQQKUOX+)<+vqr%_+2zI{M(4~oC`6s>ph zs?d!8f}uY}$q(Tk_RhtJy*;IG;ZT;xapX!p1V_%-l0Bm4!sfd+o` z|9W*Apf2z>Bm8Ny2O9m+vdtSn#p2Za5{8AUU}Ag&MFk&HwyVlsiE99WYp7If-zy;l z&iLrVN-Sg~FT3u*25i8%nB|uveqOYJTt4&d!ery@Rv{P3XA|O^Fo2>1D;a%GO-Ou= z)fbC3N%0gH$ir`pZ^I*ET20|meWP>=gOcKddWN%GOsB6&oaUUMkLeF0Dx>*ys|5Da z?9?~O@eYAyaEY2s@h%ot%Qb`{(s-dicoz#*XtkzmMOAhbQ_M2l8sVJ(62H00000NkvXXu0mjfq_)>v literal 0 HcmV?d00001 diff --git a/app/examples/Image/PhotoTouch/sharpen.png b/app/examples/Image/PhotoTouch/sharpen.png new file mode 100644 index 0000000000000000000000000000000000000000..7d6f67e7375afc3fe4c80c47865be5d91ef85c2b GIT binary patch literal 1301 zcmV+w1?u{VP)Xv59?(t!>?fl(4bGN(kyAONserL`( zvvKZwnF8cVa++=PH4x!of#Uhtt8zvH zlv@N}V}mJi9m7ZRX*f0nGZ5vN%y5~j0*u{t{6{a!1wjlPR^{sg zR&R@LVOK5{a+r*k;Q~T)mor#_GYTY(`>_%$QHvx_;v_CPBCIL z@QjEbky7tC$dg&N3T?vtS57yTSxPW2UJME6x1z&o1`FYUaFtODIBql0EM6p}M7fgz zpcc1#Z~$nw8Hjorc*Id&#VQ7(HUm9>@u9lCb4GF9WW!(#ybp{ioc^M%J*A zPw_zo+|1t%@+YM60)l%~NC!REgrBO&v|))U9t-&vzv3Sx$qdi2pD(dY!K_k${&enc z>TErF@1M4=+j7TkT*1Z0OdT()w0*ghgZ#6O^4`aCU4AsbWEOED9#C;N`Mf7>tCM(` zJN4b13|sO5QU0JV|AG(o2Ry12rGC^hVJeW$ImjILpl)-MFZpJYlkCz)d;X|rKW~`i z2gR+s{7Hu{|B9t|&&?u#W3n7Bgfgl)^F2XE?M_91O}UoeEf z9ae0-AX>h|(*OOYejc*kHJ=0W2HbtV=zS*nFSMCApn+kL?Fk=jR|(_^Wufw;C*Q{< zkte_hWX|nI+=nHS&pio$5?RxHOhfH1nS9Q`yE1c{+Xe1$Nrs+mpo-%v{|T<)yA9-;}_K}nPKyl^eRq^}Q7jhlN6;};_kE?G+gt%h) zdsGwyV3cq3tR_Cq9xf?`yw@9(2E2^bSc*v`kwg+_G2yr!5;*9j;6vzL!Mf$Wp>N7T?L9jW-n>u_xI~Z$cQ-xo~A5>Wnr=|kGnC&vP zNgfkwDBuZ zFXImx!D~l=g}94osfnN*H;mvlBfvGNmGS$G;k6>bBGh2C!0$n|*VF=51BjpvZTNyF zJhQqJR>)%h5^3JgQo_}$>1n;Z$3q;G2!1_(%lMr!cwYhktb?bS86SQldu4YvEAScu zNV1Vd!SP$1_>D@urT{X+N)^R33Ar6NG0GkdU@vMtW2AHIx##LQn@X8;d^Me=PMyz#m05%YSu)({>9ugWnf z@Dflj=5%toK|DBJUfHl39}>CW#nndfpu@X%Wg>Egm|-&bcH1d0!d#mwEBPb3+6Sco z_6QV%d{qQ8*e8~tFbOgEBqDH8;i}b(2X;RTcTs3O1}{Z-jyl#y5k0|Vp$=;e3-~O$ z6O{t2kEjrt5JHV%37w)l-g6QwoVC#8emEj-+~K2>`(+6x({ZcQ-ZlDluCtQ znAJ*-1eE}fBbgN@aM@1L5N=}=9(#yA8Qrk`=s`E$BaAi^Ijfrsv4_$&=4wa4r{-E= z9K@hK3R0RT;f%JMzD3_HLBBMuG9$n(A%xqSQJ8E>K)g}V|Ng1*+;vC6r$7(4yWn5xz#OIjCGsTwQW;c26{mPSw5p`@ z5CeRn4Itr_&&zC%{LXLUGb2mbDZ?9C#x$S9NR>Rf*nj|lS;DDWj`2MU9hC8}nb1#V zLcjS!x6i0Ade5;ZzTJ9z zvB+vQ7l927W=tpNBYE;ft@7~&mG{C!R{jt2l*Ea&@S;7_^DYwMZWk>GqR p#{&7tGi2R(i-%TYQhYaKe*q^8PQ?h+p4|Wd002ovPDHLkV1j`T>&5^8 literal 0 HcmV?d00001 diff --git a/app/examples/Image/PhotoTouch/usb.png b/app/examples/Image/PhotoTouch/usb.png new file mode 100644 index 0000000000000000000000000000000000000000..848aa05735c945e4a7e7555154b08584524772b1 GIT binary patch literal 739 zcmV<90v!E`P)^hwihNcRqHW-()AV?+y?vR;*a-T~<&d zJJ5?1wknPE70<1LAu3wj&+Giaa9ZXacA2oB;LDKKQg68%4@iJ(vcAm8kmi~IV7k=VXp~5PPqX0Wz9J)doZQg zFTvyfwf-0YlPrt!Gdh|8VXi9@;EMy`Bpk68&ZDBe0Ssf8La!`7j#Q##gr4jeda>au+os2Sc*(z~I0cFFK3iKmf0G3GWR8-1VaIKmZ$qBAf>e0;tM{ z_x^s}0(-zgrwG3p9eBozM(O}~@Be~PfQ({48;QmMsLGZ(Q7e`pV9SX|&BgTOpn&ae z*lBd&tQU=7XB~is`~u@%G!wWWZF~~pUZVi2vauk-A#7*?fP<$Z+=4v@cf+Gz6r3eE z{_G%)X=4Cc#eTMxM@|$@!!`z>DhI$VTyP707{e3op|1M&|2nglApx+5DB_DEk z;{i$>^{vd>&+`iBIK_S@8U^s3him>EJjkEAk20i|c!^2Zwfcx=6tf17Xwvu**rSLS z*2@3xZu%kBS`ZU_rEMSenC>5fdr-L;(p>AHGWe)=GkVdZm?qHRQEjYPv0|+&{RNwB V{H;l`n7{x4002ovPDHLkV1g&0TFn3e literal 0 HcmV?d00001 diff --git a/app/examples/Image/PhotoTouch/vflip.png b/app/examples/Image/PhotoTouch/vflip.png new file mode 100644 index 0000000000000000000000000000000000000000..63d2ad2c276b38b178b1a0031e518f5ddb72d66e GIT binary patch literal 1018 zcmV_wC#L zz2EOiiGu<|Ofkg}oyk>_!t)GZ#tHIsiC@fb_~QbL=L)}!F~Z^xmdyozH4{{e307r| zf1gQ{ILxqZVUpEZ;yai!X+N`ooNqNUMMqZntxTJwBX|hmam2PT&DJdN+bNoq9%NiS zwuL8bt2O>JW-9t64qA924pK5L%uuK$zS~rPL014TL>Dhi3njX1h3_?WpYcg3UWiY5 zW`7mE>ERyVn~IOwQWY=679QIczQap{&vC+3dqDfFcp=((U|Z-XmlWT?8B^&lYa{VO ztmUq4;S3E)@VEyPb$v@mWeTxGd4UWnyfwJpR;RJ8DyIeL^OvG78? z!>DaxoEBGntDSIuVNqjcR>J#II zsOPwC;frVkS1RxBE9bj3mq(vz;CDYS@IS@0n*M+Fr@j>-7Dsibiuo1#FyyJHLt6j( zX4-3xnt|&?L}%4c+Zi^kO#jpnUDB9()$W~6p%Hfxy6V=szA>wqH!yEt-ax1U)^U{EW-;deyMCi# z#tgSP$_K7PciClV&9Y&UoencVn+DXF$!s_3ByG`O!C@`T1TRSobtu}vN15S6)o0m~ zUDP+BTe5NeTSfg{tqXbT>1%CzedDktyIff{{p3<_N^|s^3-MCq9NF9QAsSNQef6!= zw%k{k{7Q3Td@~o~7bd~d>&|Em0Yv&?!~DT><-+dEf&6w zn>K!!rWklhBF~_yaE}en_zm2%@q>w)`7GckQ{^F>obVs>(8eEkT6&=te3fO9?UDE$ z{!G@Fu21G`)6Gzr6<@G(c-l5y*~9@}RTN*cw<>-gFHQI>_NRuIE$rcWMYqJ4q4*xV zTl}2eHNs2&W;OKsS{I((&#iT{T9VkzBa?89x;OYbez5V6*j!`0B(ahECS{?4AMloIr1i$6#iy-bVmq5g(sATtK-9nw1u7;g=nq*;K#dYL z1+A$|j7yYi)KH{oA?%bO1#F;F*4om(E}uW_%sqGB%)EK;wP*gEd+xdC`|iGsfk47^ z6yh$7$ITdO8?WLZ4qy*<8V$jsBqYq>JXSJ7KRL{m9M&7)gZL^hGnjO;g17Y~cp6Lj zZ$NNMx>&*CJp*6F<8gvp(##b!gCiL(;3;?$OQLgHP>mxvhRbL{2m_FVu_(k~x2V5j zj!~az-81;Lvr?D&E{m8-xP19s$=c|4IK%wJ;0N$GJyIQ)GSd}WeFh)k&rS*#cxU|Z z{a7tyTw^KIVt}i!geRS&VN!hXA$}{%?_y41@c+LwuGcA?0W zVivQ2*SnHWkBTK?tl-B@Q!78{sQ>E#~U;Ij_?wY?PUM*(Vl!n5}B)=4r#~ ziEyIg=-OfzKYy@A>B51%dJC%oh=xZfTV64&MUH=TV zGY8O7NjOl`xMj&jdCv4*wwS*)j>M-<| zG>6@MO=MZ>727x@DR^1_qBQq&Cy;5W&9*TU$%$Pj5z{NIX-`@)@7s`^sMRD*nq9-1 zXo}{2AxQ$Nyw>VXZoVciS*p6y98Z#fDz9CWTXV=GgFOZKC6^0dPmE-or`#`yUaZ< z`9-{{Q&>;Ki$b1r07tlu)5N9I`Q`F8t>MdJrAwtl1~tt&qx1YHf^Pp7o$GnsvJ43x4aut*lCvKo_6#pl~Di zO2-xs_M;Hud>)Mhw@s;?ob5SRw71~r;4d^eljUrQS>-A&W)A;WrdCe%ppYdy;(G)U z_Tvn$=N{)=VuZ(7#wVEF?UyglAWfX;K|#C;o;Ct8P*lPgf-Lj}a0yK~X|y}?3s9+U zBNuTm4!T5{j}I+1f}R!@$z`wJb*mCDsjbN)MpGz}i~k9RqX@hwvU`C5z7Oidoio5EW$m#*Hc zKLF6+R$ut7y$TNi?8EKe@J#L{EO0Bh{qH#M_XnZpNepEv_jmt)Z{{ytLiHMi{{T#$ VPtIeME!O}5002ovPDHLkV1k6y^sxW{ literal 0 HcmV?d00001 diff --git a/app/examples/Image/PhotoTouch/zoom-in.png b/app/examples/Image/PhotoTouch/zoom-in.png new file mode 100644 index 0000000000000000000000000000000000000000..1e8ed3aae01a38a66f880b6bbe4e113b221b69e6 GIT binary patch literal 1634 zcmV-o2A%ndP)OyqxoI-*?t~&KU!~gnf{U z@fd^KktURlsKS0!V5d>A>@Dlw=Crf$v^#o61A^-CU zZb}zRIrRF#=kZ9C;HF&R5(fMu84lnHcoz%omS*h1KRAp_XhsnIk%5uO#UQ7w+cDEP z6>Hm*`J=T_m-rF$m`FJMvbmJi_I{{kc5LwdxkJxX!-Y(7gqA;pkMa*Ih4UO2J$zs8 zQFB~nA(JA2%U=OcSZBk8=-`9=MUCIZ4Bz10za*~KDV*W3Xb7xQV}D>D2Z&^5GoSg) zXAW<2B=I6U)inE=>=%BL8d=PsC2-g zXNd(`l}bKtp)gP1oF4K+V7ZJq$W(2HFX7dQyU%yLL8Gu%HST3EcVq(q7{YNRb}O2Z zgM-4Hgc3X{YIWG91*c)WC|6+$YD6soJCG|K=Nd)c?SDtoeO+lsBDZSo++^wMshYK( zS&D76`T;%4pcj0y{NmLp>)zldOGkSXAgeh*v2IXJQ@jW~EB&5V5-hfjbR+^~83V$a z#ujPV;zi(h)2l&gf2JDln*cdSv41JmtsLNt9$*T@GATxjFf27^Wt6f^iTgyV6Oivh z029#Ltb8lfX_yfcJdlC8qP!hvr6JFafcR!LDT{0tyr!+U%n_w7lu5PAw=sxOX7O)y z2z3Df`?}v{39iFtt=_#aGv&01N#tSZxT+30`38_`7B36s;JDz`_zSAKuQP!Zvv@@)QxKnsHYqvX z(gx6K7UlYFMSLQ6lO$E`m^OeWJMZ&x5|Hs)uQxgQ25`|V$}7#0I0?vj?V9A+t{@I$ zWOp%B@vKHBfFYQwIeVQ40J+zc3ysW)4rQ6CB9Ee{mDAmN$8(RLkCAJhqt3k*K&4q6 zj4Yupj$;5ef}*T^04klm1K1}0<*A_@J7a`zgFFTgH%Au$wz?27&S9Tf2`h#bF%tL; zwW1tWZ@AlBL-?8;sL9F*Z;oLO)N`P)rm{gA%H7Zd0E*FRR+lKIFe;*KeKQ_IgQz`+ z8>Q(h&p>`JsXnFMhU%m0fv{q`nHQv?omph!vDX}~lehzo!aM|9aF3|%#(P@u zI4l#3RKDkbWH~6hY%FvEw$Q#dBzuReGuZmD%}s5 z5apQ=oW>0{U6}1^+Ac11ABGY7y4%AsQGoa7ha?*;Zwnw;V7=fMx>K0I%c^HP*D>7( zcpuK^nQJlkJJ|Ess8d)?!;Qjd>jZA&Mn0lkI<3DfzO8lKDo3xeJg28Ea=o(iHdfl_ zdp%1ypLq;1nP89uIhM1ymIrK}hg^t`vbOAN_g+ZkI(9K;dD(@+2-fJ1uX^nZcdY>H4{1di+>!6qczt)m+5;IFT#$zadXC zwzoi^6yA@xb@g2P0e}XJJmHJt$B0Cs7famX8Q)8o?_O~FzvCR|#Gl(gi8K~+-?gX5 gEBuoSC|`r{KS$aeF1a)NJOBUy07*qoM6N<$g6W0+ZU6uP literal 0 HcmV?d00001 diff --git a/app/examples/Image/PhotoTouch/zoom-original.png b/app/examples/Image/PhotoTouch/zoom-original.png new file mode 100644 index 0000000000000000000000000000000000000000..61f9dec6378c622b7e0af94f7378ea00b51410a5 GIT binary patch literal 1615 zcmV-V2C(^wP)p1>SXHEcOzj@{T%L{++>}PHq0c*#;Q-zTZ(~JhPZJK|Br0(gO^8E(q~Uht zV2D%JpRmBF?dsSQ`K5hOSNR@u8BaL0EUsl$=yN#FtggZL=g)ek8m?rLBeZG;ALI{q z3YU3L^zeOoNanb~0{SC>tCq)Vdo@gs4nB@w%lLy#^9=rf^RrN=aFHXUA+SNle!&C> zh(u;_CTDUcvpL9-#B*$yX)2iL6@G?{+{HLs;xxX>GPY?0tmZaOqha%0pnGld2A{-p zDyEpdw3MT{#|AB>oDbV5EY&|w)4dQ_ry@=;S*!3hyba-SlB0yGgfau>QyXJ%=uvqy$EfTzFS-lbrF^D}$9I#?5{Ur$tmWZjoicBA#`nQmvw}EinHM5l*@hQ2=Q>cL%r0xA z4`WUBH?&#iye`87*<$0YhJ*~~eUcAjO!cH?^yBUr2mopoKB0^Wf|o`hV5(;)`r zL_lqZ{*vZ^ldliSrh3gX4vh(3#y3cFUuObIrrKy3lMtI&V-h*t()!S1s_~Yw1+hu9 zrTL}VF|7~5P~MkgB%tE8ryg|j_2G)Csw2(m7zwC&?U>{^E*~mQHC=dC#YCXg(o{~g ziD~9cAV(aA_QwE!0mm(Uk}{t)TAc}$o9a+xSms?Z5ZDb`dag2;ySQ@@JIwWBwO9>* z5zEVQjjQNM@Qy~aEBnXs8Jd)H{zT1WM4Y^2;awo7_ zdCeB#pLT&j9S2&rWY(+1rEnJp)TV#GNSa_B6ulB?1v|!(;f& z>P$l!1_KD9EJEQ;fgiwP?6fR{aSFGZKiV+Ps0mmsb@|&0x9xBYL%AE;5_@uUz1jDVm~b+iR*bj)G^2h z!cllddA9R$Tao#>iboy5|KS#nbScbC7Vwzv-okl~MF;@&;Tz1heqkNfg^*0eRE)+j z^urC*p$3Ohj&_^R0DTjJ0=zDNwqdEU6VAc_FG#xYvQNb6XK!=4EyR|uZ}B_0()~4z zksEpP5XVOW-k)1Z*4yqDKrqjKz%Ov8Fqzk+=S^;5iU;rnF5|_{m?;kZxxB7ZD5T*= zA=6&Kt=!F7;?QYt8GK87a2p)GCi0S=c8BYcougPDTJLq-!)456fQba-IFJ*$kehit z#PgI3(XsZCeeC`e;<-hxq|wUrE)>RyRg)z7Qn>HJohJA($$+9-s6G z0e~xHt^O)*pHuXG#k|wiPmGCp=BcM9)B{B-r)_yK?hcZ7xC z(WCGHz+T+r4$s(b!aP3(r~f-HMf?Y$TS*LO0graxNH_9FuAsUN!hcM%A>ivStNj1~ N002ovPDHLkV1k#a2Y>(o literal 0 HcmV?d00001 diff --git a/app/examples/Image/PhotoTouch/zoom-out.png b/app/examples/Image/PhotoTouch/zoom-out.png new file mode 100644 index 0000000000000000000000000000000000000000..19f24bb0d7c265e6b9311545d5db9f279b825f9e GIT binary patch literal 1568 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, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: FConsole.class:122 +msgid "Console" +msgstr "" diff --git a/app/examples/Misc/Console/.lang/ru.po b/app/examples/Misc/Console/.lang/ru.po new file mode 100644 index 00000000..7d03070b --- /dev/null +++ b/app/examples/Misc/Console/.lang/ru.po @@ -0,0 +1,46 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Misc/Console/.project:18 +msgid "Console example" +msgstr "Пример консоли" + +#: app/examples/Misc/Console/.src/FConsole.form:5 +msgid "Console" +msgstr "Консоль" + +#: app/examples/Misc/Console/.src/FConsole.form:18 +msgid "^C" +msgstr "^C" + +#: app/examples/Misc/Console/.src/FConsole.form:23 +msgid "^D" +msgstr "^D" + +#: app/examples/Misc/Console/.src/FConsole.form:28 +msgid "^Z" +msgstr "^Z" + diff --git a/app/examples/Misc/Console/.project b/app/examples/Misc/Console/.project new file mode 100644 index 00000000..f34360d0 --- /dev/null +++ b/app/examples/Misc/Console/.project @@ -0,0 +1,16 @@ +# Gambas Project File 3.0 +Title=Console example +Startup=FConsole +Icon=terminal.png +Version=3.13.90 +VersionFile=1 +Component=gb.image +Component=gb.gui +Environment="GB_GUI=gb.qt5" +TabSize=2 +Translate=1 +Maintainer=benoit +Vendor=Princeton +Address=benoit@localhost +License=General Public Licence +Packager=1 diff --git a/app/examples/Misc/Console/.src/FConsole.class b/app/examples/Misc/Console/.src/FConsole.class new file mode 100644 index 00000000..d9a9947f --- /dev/null +++ b/app/examples/Misc/Console/.src/FConsole.class @@ -0,0 +1,162 @@ +' Gambas class file + + +Private $hProcess As Process +Private $sText As String + +Static Public Sub Main() + + Dim hForm As Form + + hForm = New FConsole + hForm.Show + +End + + +Public Sub _new() + + $hProcess = Exec ["bash", "--noediting"] For Input Output As "Process" + +End + + +Public Sub Form_Close() + + $hProcess.Kill + +End + + +Public Sub Process_Read() + + Dim sStr As String + + 'Debug Eof(Last);; Lof(Last);; + 'While Not sStr + Read #$hProcess, sStr, -256 + 'Wend + 'Error sStr + $sText = $sText & sStr + 'Debug Quote(sStr) + UpdateConsole + +End + + +Public Sub Process_Error(sStr As String) + + $sText = $sText & sStr + UpdateConsole + +End + +Private Sub UpdateConsole() + + Dim iPos As Integer + Dim sStr As String + + While Len($sText) + + iPos = InStr($sText, "\n") + If iPos = 0 Then iPos = Len($sText) + + sStr = Normalize(Left$($sText, iPos)) + 'Debug sStr + $sText = Mid$($sText, iPos + 1) + + txtConsole.Pos = txtConsole.Length + txtConsole.Insert(sStr) + + Wend + +End + + + +Public Sub Process_Kill() + + 'hProcess = NULL + Try Me.Close + +End + + + +Public Sub txtCommand_Activate() + + Dim sLig As String + + sLig = txtCommand.Text & gb.NewLine + + 'txtConsole.Pos = txtConsole.Length + 'txtConsole.Insert("# " & sLig) + txtCommand.Clear + + sLig = Conv$(sLig, Desktop.Charset, System.Charset) + + Print #$hProcess, sLig; + +End + + +Static Private Function Normalize(sStr As String) As String + + Dim sNorm As String + Dim iInd As Integer + Dim iCar As Integer + Dim bEsc As Boolean + + ' For iInd = 1 To Len(sStr) + ' + ' iCar = Asc(sStr, iInd) + ' + ' If iCar = 27 Then + ' bEsc = True + ' Continue + ' Endif + ' + ' If bEsc Then + ' If iCar < 32 Then bEsc = False + ' Continue + ' Endif + ' + ' If iCar < 32 And iCar <> 10 Then iCar = 32 + ' + ' sNorm = sNorm & Chr$(iCar) + ' + ' Next + + sNorm = sStr + + If System.Charset = Desktop.Charset Then + Return sNorm + Else + Return Conv$(sNorm, System.Charset, Desktop.Charset) + Endif + +End + +Public Sub Form_Open() + + txtCommand.SetFocus + +End + +Public Sub btnCtrlC_Click() + + Print #$hProcess, Chr$(3); + +End + +Public Sub btnCtrlD_Click() + + Print #$hProcess, Chr$(4); + +End + +Public Sub btnCtrlZ_Click() + + Print #$hProcess, Chr$(26); + +End diff --git a/app/examples/Misc/Console/.src/FConsole.form b/app/examples/Misc/Console/.src/FConsole.form new file mode 100644 index 00000000..6f20aa1a --- /dev/null +++ b/app/examples/Misc/Console/.src/FConsole.form @@ -0,0 +1,37 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(38.4286,16.1429,99,50) + Text = ("Console") + Icon = Picture["terminal.png"] + Arrangement = Arrange.Vertical + { HBox1 HBox + MoveScaled(1,1,85,4) + { txtCommand TextBox + MoveScaled(0,0,23,4) + Font = Font["Monospace,10"] + Expand = True + } + { btnCtrlC ToolButton + MoveScaled(31,0,4,4) + Font = Font["Bold"] + Text = ("^C") + } + { btnCtrlD ToolButton + MoveScaled(36,0,4,4) + Font = Font["Bold"] + Text = ("^D") + } + { btnCtrlZ ToolButton + MoveScaled(41,0,4,4) + Font = Font["Bold"] + Text = ("^Z") + } + } + { txtConsole TextArea + MoveScaled(1,7,47,37) + Font = Font["Monospace,10"] + Expand = True + ReadOnly = True + } +} diff --git a/app/examples/Misc/Console/terminal.png b/app/examples/Misc/Console/terminal.png new file mode 100644 index 0000000000000000000000000000000000000000..3c032bff6147b835d505cd4cc3d3502e2b5b5124 GIT binary patch literal 2312 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⁢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%0D2oB{^m)z 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 m-%*hwe=_Ghx4%%6Ah=1i!qqJ_WuE~R#>wD literal 0 HcmV?d00001 diff --git a/app/examples/Misc/DBusExplorer/.icon.png b/app/examples/Misc/DBusExplorer/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b39f42a15875f43797677672e52f42894ee11d1f GIT binary patch literal 3487 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 literal 0 HcmV?d00001 diff --git a/app/examples/Misc/DBusExplorer/.lang/ru.po b/app/examples/Misc/DBusExplorer/.lang/ru.po new file mode 100644 index 00000000..b379fb75 --- /dev/null +++ b/app/examples/Misc/DBusExplorer/.lang/ru.po @@ -0,0 +1,72 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Misc/DBusExplorer/.project:20 app/examples/Misc/DBusExplorer/.src/FVersiongbXML.form:5 +msgid "Gambas DBus Explorer" +msgstr "Проводник Gambas DBus" + +#: app/examples/Misc/DBusExplorer/.project:21 +msgid "" +"DBus explorer.\n" +"\n" +"This example allows to explore all applications connected to both DBus system and application buses. You can see all exported interfaces, methods, properties and events, with their signature. But you cannot use them." +msgstr "" +"Проводник DBus.\n" +"\n" +"Этот пример позволяет исследовать все приложения, подключенные как к системе DBus, так и к шинам приложений. Вы можете увидеть все экспортированные интерфейсы, методы, свойства и события с их подписью. Но вы не можете их использовать." + +#: app/examples/Misc/DBusExplorer/.src/FVersiongbXML.form:14 +msgid "Refresh" +msgstr "Освежить" + +#: app/examples/Misc/DBusExplorer/.src/FVersiongbXML.form:20 +msgid "Show bus ids" +msgstr "Показать идентификаторы шин" + +#: app/examples/Misc/DBusExplorer/.src/FVersiongbXML.form:37 +msgid "Legend:" +msgstr "Легенда:" + +#: app/examples/Misc/DBusExplorer/.src/FVersiongbXML.form:48 +msgid "Method" +msgstr "Метод" + +#: app/examples/Misc/DBusExplorer/.src/FVersiongbXML.form:59 +msgid "Property" +msgstr "Свойство" + +#: app/examples/Misc/DBusExplorer/.src/FVersiongbXML.form:70 +msgid "Signal" +msgstr "Сигнал" + +#: app/examples/Misc/DBusExplorer/.src/FVersiongbXML.form:85 +msgid "Session" +msgstr "Сеанс" + +#: app/examples/Misc/DBusExplorer/.src/FVersiongbXML.form:93 +msgid "System" +msgstr "Система" + diff --git a/app/examples/Misc/DBusExplorer/.project b/app/examples/Misc/DBusExplorer/.project new file mode 100644 index 00000000..5bcff408 --- /dev/null +++ b/app/examples/Misc/DBusExplorer/.project @@ -0,0 +1,19 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.10.90 +Title=Gambas DBus Explorer +Startup=FVersiongbXML +Icon=dbus64.png +Version=1.0.0 +Component=gb.image +Component=gb.gui +Component=gb.dbus +Component=gb.settings +Component=gb.libxml +Description="DBus explorer.\n\nThis example allows to explore all applications connected to both DBus system and application buses. You can see all exported interfaces, methods, properties and events, with their signature. But you cannot use them." +Authors="Fabien Bodard\nBenoît Minisini" +TabSize=2 +Vendor=Example +Packager=1 +Tags=Example,Utility +CreateMenu=1 +Translate=1 diff --git a/app/examples/Misc/DBusExplorer/.src/FVersiongbXML.class b/app/examples/Misc/DBusExplorer/.src/FVersiongbXML.class new file mode 100644 index 00000000..04e6dd80 --- /dev/null +++ b/app/examples/Misc/DBusExplorer/.src/FVersiongbXML.class @@ -0,0 +1,272 @@ +' Gambas class file + +Private $cArgs As New Collection +Private $cType As New Collection + +Public Sub _new() + + $cType["i"] = "Integer" + $cType["u"] = "Integer" + $cType["s"] = "String" + $cType["g"] = "String" + $cType["o"] = "DBusObject" + $cType["b"] = "Boolean" + $cType["y"] = "Byte" + $cType["v"] = "Variant" + $cType["d"] = "Float" + $cType["n"] = "Short" + $cType["q"] = "Short" + $cType["x"] = "Long" + $cType["t"] = "Long" + $cType["a{sv}"] = "Collection" + +End + +Public Sub Form_Open() + + btnRefresh_Click + 'HSplit1.Layout = [1, 1] + +End + +Public Sub ShowPathContent(sPath As String, sBus As String, sApplication As String) + + Dim xmlDoc As New XmlDocument + Dim sFullDbusPath, s, sAppPath As String + Dim hattr, hattr2, hNode, hNode2 As XmlNode + Dim i, j, k As Integer + Dim aArgs As New String[] + Dim sIntr As String + + 'Dim haArgs As New Object[] + + sIntr = DBus[sBus & sApplication]._Introspect(sPath) + Print sIntr + Try xmlDoc.FromString(sIntr) + + If Error Then Return + + For i = 0 To xmlDoc.Root.Children.Count - 1 + hNode = xmlDoc.Root.Children[i] + If hNode.Name = "interface" Then + For Each hattr In hNode.Attributes + sFullDbusPath = [sBus, sApplication, sPath, CStr(hattr.Value)].Join("|") + If Not tvDbus.Exist(sBus & "|" & sApplication & "|" & sPath) Then + tvDbus.Add(sFullDbusPath, hattr.Value) + Else + tvDbus.Add(sFullDbusPath, hattr.Value,, sBus & "|" & sApplication & "|" & sPath) + Endif + + For j = 0 To hNode.Children.Count - 1 + hNode2 = hNode.Children[j] + If hNode2.Name = "method" Or hNode2.Name = "property" Or hNode2.Name = "signal" Then + For Each hattr In hNode2.Attributes + Break + Next + Try tvDbus.Add(sFullDbusPath & "|" & hattr.Value, hattr.Value, Picture[hNode2.Name & ".png"], sFullDbusPath) + If Error Then Continue + For k = 0 To hNode2.Children.Count - 1 + If hNode2.Children[k].Name = "arg" Then + + For Each hattr2 In hNode2.Children[k].Attributes + + aArgs.Add(hattr2.Name & "=" & hattr2.Value) + + Next + + $cArgs[sFullDbusPath & "|" & hattr.Value] &= aArgs.Join() + + If k < hNode2.Children.Count - 2 Then $cArgs[sFullDbusPath & "|" & hattr.Value] &= "|" + aArgs.Clear + Endif + Next + + Endif + + Next + Next + Endif + Next + + For Each s In DBus[sBus & sApplication][sPath].Children + sAppPath = [sBus, sApplication, sPath].join("|") + + If tvDbus.Exist(sAppPath) Then + tvDbus.Add(sAppPath &/ s, s,, sAppPath) + Else + tvDbus.Add(sAppPath &/ s, s) + Endif + tvDbus.Add(sAppPath &/ s & "|child", "child",, sAppPath &/ s) + tvDbus[sAppPath &/ s].Picture = Picture["icon:/small/directory"] + + Next + +Catch + Print Error.Where; ": "; Error.Text + +End + +Public Sub lstb_activate() + + tvDbus.Clear + $cArgs.Clear + ShowPathContent("/", Last.Tag & "://", Last.current.text) + +End + +Public Sub tvDbus_Expand() + + Dim ars As String[] + + If Not tvDbus.Exist(tvDbus.item.Key & "|" & "child") Then Return + tvDbus.Remove(tvDbus.item.Key & "|" & "child") + ars = Split(tvDbus.Item.Key, "|") + ShowPathContent(ars[2], ars[0], ars[1]) + +End + +Private Sub RemoveIds(aList As String[]) + + Dim iInd As Integer + + While iInd < aList.Count + If Left(aList[iInd]) = ":" Then + aList.Remove(iInd) + Else + Inc iInd + Endif + Wend + +End + +Public Sub btnRefresh_Click() + + Dim aList As String[] + + lstbSystem.Clear + lstbSession.Clear + $cArgs.Clear + tvDbus.Clear + + aList = DBus.Session.Applications.Sort(gb.Natural) + If Not btnShowId.Value Then RemoveIds(aList) + lstbSession.List = aList + aList = DBus.System.Applications.Sort(gb.Natural) + If Not btnShowId.Value Then RemoveIds(aList) + lstbSystem.List = aList + +End + +Public Sub lstb_DblClick() + + Try Print DBus[Last.current.text]._Introspect("/") + +End + +Private Sub GetType(sType As String) As String + + If $cType.Exist(sType) Then Return $cType[sType] + + If Left(sType) = "a" Then Return GetType(Mid$(sType, 2)) & "[]" + + Return "Variant" + +End + +Public Function MakeSignature(sKey As String) As String + + Dim ars As String[] + Dim aIn As New String[] + Dim s, t As String + Dim aArg As String[] + Dim sName, sType As String + Dim iArg As Integer + Dim aOut As New String[] + + ars = Split(skey, "|") + If Not $cArgs.Exist(skey) Then + If ars.Max = 4 Then + Return ars[ars.Max] & "()" + Else + Return + Endif + Endif + + For Each s In Split($cArgs[sKey], "|") + + Inc iArg + + sName = "Arg" & CStr(iArg) + For Each t In Split(s) + aArg = Scan(t, "*=*") + Select Case aArg[0] + Case "type" + sType = GetType(aArg[1]) + Case "name" + sName = aArg[1] + End Select + Next + + If InStr(s, "=out") Then + + aOut.Add(sName & " As " & sType) + + Else + + aIn.Add(sName & " As " & sType) + + Endif + + Next + + s = ars[ars.Max] & "(" & aIn.Join(", ") & ")" + If aOut.Count Then + s &= " As " + If aOut.Count = 1 Then + s &= Scan(aOut[0], "* As *")[1] + Else + s &= "[" & aOut.Join(", ") & "]" + Endif + Endif + + Return s + +End + +Public Sub tvDbus_Select() + + MakeSignature(Last.item.key) + +End + +Public Sub tvDbus_MouseMove() + + Dim s As String + Dim ix, iy As Integer + Dim hcont As Object + + If Not tvDbus.FindAt(Mouse.x, Mouse.y) Then + + s = MakeSignature(tvDbus.item.key) + + hcont = tvDbus.Parent + ix = tvDbus.Item.X + tvDbus.Item.w / 2 + iy = tvDbus.Item.Y + + 'lblsignature.Text = s + 'lblsignature.Left = Min(iX, tvDbus.Width - lblsignature.Width) + 'lblsignature.Y = iY + 'lblsignature.Visible = True + 'lblsignature.Refresh + 'Else + 'lblsignature.Visible = False + Endif + lblsignature.Text = s + +End + +Public Sub btnShowId_Click() + + btnRefresh_Click + +End diff --git a/app/examples/Misc/DBusExplorer/.src/FVersiongbXML.form b/app/examples/Misc/DBusExplorer/.src/FVersiongbXML.form new file mode 100644 index 00000000..0bae38e2 --- /dev/null +++ b/app/examples/Misc/DBusExplorer/.src/FVersiongbXML.form @@ -0,0 +1,127 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,107,84) + Text = ("Gambas DBus Explorer") + Icon = Picture["dbus64.png"] + Arrangement = Arrange.Vertical + { Panel1 Panel + MoveScaled(3,0,102,4) + Arrangement = Arrange.Horizontal + { btnRefresh ToolButton + MoveScaled(0,0,11,4) + AutoResize = True + Text = ("Refresh") + Picture = Picture["icon:/small/refresh"] + } + { btnShowId ToolButton + MoveScaled(12,0,15,4) + AutoResize = True + Text = ("Show bus ids") + Picture = Picture["icon:/small/lamp"] + Toggle = True + } + { Panel2 Panel + MoveScaled(37,1,2,3) + Expand = True + } + { HBox1 HBox + MoveScaled(46,0,44,4) + AutoResize = True + Spacing = True + Margin = True + { Label4 Label + MoveScaled(0,0,9,4) + Font = Font["Bold"] + AutoResize = True + Text = ("Legend:") + } + { PictureBox1 PictureBox + MoveScaled(8,0,3,4) + Picture = Picture["method.png"] + AutoResize = True + Alignment = Align.Center + } + { Label1 Label + MoveScaled(11,0,8,4) + AutoResize = True + Text = ("Method") + } + { PictureBox2 PictureBox + MoveScaled(20,0,3,4) + Picture = Picture["property.png"] + AutoResize = True + Alignment = Align.Center + } + { Label2 Label + MoveScaled(25,0,8,4) + AutoResize = True + Text = ("Property") + } + { PictureBox3 PictureBox + MoveScaled(34,0,3,4) + Picture = Picture["signal.png"] + AutoResize = True + Alignment = Align.Center + } + { Label3 Label + MoveScaled(38,0,6,4) + AutoResize = True + Text = ("Signal") + } + } + } + { Separator2 Separator + MoveScaled(20,5,18,0) + } + { HSplit1 HSplit + MoveScaled(0,8,106,74) + Expand = True + { TabStrip3 TabStrip + MoveScaled(2,5,39,57) + Arrangement = Arrange.Fill + Count = 2 + Index = 0 + Text = ("Session") + { lstbSession ListBox lstb + Name = "lstbSession" + MoveScaled(2,1,30,51) + Tag = "session" + Expand = True + } + Index = 1 + Text = ("System") + { lstbSystem ListBox lstb + Name = "lstbSystem" + MoveScaled(3,1,30,50) + Tag = "system" + Expand = True + } + Index = 0 + } + { VBox1 HBox + MoveScaled(46,2,59,65) + { Separator3 Separator + MoveScaled(2,19,0,30) + } + { VBox2 VBox + MoveScaled(3,8,54,56) + Expand = True + { tvDbus TreeView + MoveScaled(7,4,33,32) + Expand = True + Border = False + } + { Separator4 Separator + MoveScaled(12,45,23,0) + } + { lblsignature TextLabel + MoveScaled(5,49,34,3) + Font = Font["Monospace,-2"] + Padding = 4 + AutoResize = True + } + } + } + } +} diff --git a/app/examples/Misc/DBusExplorer/dbus22.png b/app/examples/Misc/DBusExplorer/dbus22.png new file mode 100644 index 0000000000000000000000000000000000000000..eb4592e8a31fdfb42176a2a111be0ead97ce2618 GIT binary patch literal 894 zcmV-^1A+XBP)by}iAU3r;NZr_#=5$?#KgqR%*@{2-r3pNy1Kf_$;s~T@4~{u#>U3R#>Tq3y3EYX z-rnB2y1K{5$Hc_M?eOx--Ra2O=-KA)^7i@d@bS#v>YBaPXq~`6g0MS)u2PS<z%;YYoEeEgRqLT&-L~7$=vB~p~FIiu|9&YQIEG>m%L4kwn~b$@bmS4tIAJ~ zwqBRKe5=T^&EHm$xmJ?7yVK+F_WA$+|CPGa*yirl606@8moIFMz`B&l{!M>*pTZ{&2Ux0@&^|%8Z#OxbFY}0YgbdK~xyiV_-l4MkZz! zRyKAHBq2^NZXRAf4NWa=9ex3bkf4yT2%D&`p1y&hk&%(Hi5N&wTtZUH)Xdz%(g+Hy zq-B7jveq`Xb}%7(2S+DoIe7*K1s7L)H+K(DFOaCWkFTG=6mVwMJuK-(|p~j%9l3rO=ZDdqqVPsTW2XT+5GJ}$241`_ZP}W!pVKzxJ zFenB<*v)}{fni`)ORE9{gS?zGnA6tY(b;8WWM|vmBP-6pAS2xiQQp@-!NT0kR7z4p z926*G6DI)$4Gr}5bVb=jgoOkl0Vu#fdCF894L)8TZZ1xwu;yTAV`X7xVnh-G0F1&; UGQ-lT6aWAK07*qoM6N<$f}{cRmH+?% literal 0 HcmV?d00001 diff --git a/app/examples/Misc/DBusExplorer/dbus64.png b/app/examples/Misc/DBusExplorer/dbus64.png new file mode 100644 index 0000000000000000000000000000000000000000..49d37d24788424d12d195ed72d581cb38295d723 GIT binary patch literal 4222 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 Cs0%Pjt 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, 2007-2010. +# +# +msgid "" +msgstr "" +"Project-Id-Version: Evaluator\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2010-12-17 01:08+0100\n" +"Last-Translator: Jordi Sayol \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: FEval.form:61 +msgid "45" +msgstr "-" + +#: FEval.form:67 +msgid "60" +msgstr "-" + +#: FEval.form:45 +msgid "a =" +msgstr "-" + +#: FEval.form:77 +msgid "a * Cos(Rad(x)) + b * Sin(Rad(y))" +msgstr "-" + +#: FEval.form:40 +msgid "b =" +msgstr "-" + +#: FEval.form:24 +msgid "Evaluator" +msgstr "Avaluador" + +#: FEval.form:72 +msgid "Expression" +msgstr "Expressió" + +#: .project:1 +msgid "Expression evaluation example" +msgstr "Exemple d'avaluació d'expressions" + +#: FEval.form:98 +msgid "&Quit" +msgstr "&Surt" + +#: FEval.form:82 +msgid "Result" +msgstr "Resultat" + +#: FEval.form:108 +msgid "This is an example of how to use the gb.eval expression evaluator component." +msgstr "Això és un exemple de com fer servir el component d'avaluació d'expressions gb.eval." + +#: FEval.form:92 +msgid "&Update result" +msgstr "&Actualitza el resultat" + +#: FEval.form:35 +msgid "x =" +msgstr "-" + +#: FEval.form:30 +msgid "y =" +msgstr "-" + diff --git a/app/examples/Misc/Evaluator/.lang/cs.po b/app/examples/Misc/Evaluator/.lang/cs.po new file mode 100644 index 00000000..cb920ab0 --- /dev/null +++ b/app/examples/Misc/Evaluator/.lang/cs.po @@ -0,0 +1,68 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Expression evaluation example" +msgstr "Příklad vykonávače výrazů" + +#: FEval.form:24 +msgid "Evaluator" +msgstr "-" + +#: FEval.form:30 +msgid "y =" +msgstr "-" + +#: FEval.form:35 +msgid "x =" +msgstr "-" + +#: FEval.form:40 +msgid "b =" +msgstr "-" + +#: FEval.form:45 +msgid "a =" +msgstr "-" + +#: FEval.form:61 +msgid "45" +msgstr "-" + +#: FEval.form:67 +msgid "60" +msgstr "-" + +#: FEval.form:72 +msgid "Expression" +msgstr "Výraz" + +#: FEval.form:77 +msgid "a * Cos(Rad(x)) + b * Sin(Rad(y))" +msgstr "-" + +#: FEval.form:82 +msgid "Result" +msgstr "Výsledek" + +#: FEval.form:92 +msgid "&Update result" +msgstr "&Vykonej" + +#: FEval.form:98 +msgid "&Quit" +msgstr "&Zavřít" + +#: FEval.form:108 +msgid "This is an example of how to use the gb.eval expression evaluator component." +msgstr "To je příklad, jak použít komponentu gb.eval pro vyhodnocení výrazu." diff --git a/app/examples/Misc/Evaluator/.lang/de.po b/app/examples/Misc/Evaluator/.lang/de.po new file mode 100644 index 00000000..eb17d871 --- /dev/null +++ b/app/examples/Misc/Evaluator/.lang/de.po @@ -0,0 +1,69 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Expression evaluation example" +msgstr "Beispiel für einen Ausdrucks-Auswerter" + +#: FEval.form:24 +msgid "Evaluator" +msgstr "Auswerter" + +#: FEval.form:30 +msgid "y =" +msgstr "-" + +#: FEval.form:35 +msgid "x =" +msgstr "-" + +#: FEval.form:40 +msgid "b =" +msgstr "-" + +#: FEval.form:45 +msgid "a =" +msgstr "-" + +#: FEval.form:61 +msgid "45" +msgstr "-" + +#: FEval.form:67 +msgid "60" +msgstr "-" + +#: FEval.form:72 +msgid "Expression" +msgstr "Ausdruck" + +#: FEval.form:77 +msgid "a * Cos(Rad(x)) + b * Sin(Rad(y))" +msgstr "-" + +#: FEval.form:82 +msgid "Result" +msgstr "Resultat" + +#: FEval.form:92 +msgid "&Update result" +msgstr "Be&rechnen" + +#: FEval.form:98 +msgid "&Quit" +msgstr "&Beenden" + +#: FEval.form:108 +msgid "This is an example of how to use the gb.eval expression evaluator component." +msgstr "Dies ist ein Beispiel, wie man die gb.eval -Komponente benutzt." + diff --git a/app/examples/Misc/Evaluator/.lang/es.po b/app/examples/Misc/Evaluator/.lang/es.po new file mode 100644 index 00000000..cea4870e --- /dev/null +++ b/app/examples/Misc/Evaluator/.lang/es.po @@ -0,0 +1,71 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: FEval.class:72 +msgid "Evaluator" +msgstr "Evaluador" + +#: FEval.class:78 +msgid "y =" +msgstr "y =" + +#: FEval.class:83 +msgid "x =" +msgstr "x =" + +#: FEval.class:88 +msgid "b =" +msgstr "b =" + +#: FEval.class:93 +msgid "a =" +msgstr "a =" + +#: FEval.class:99 +msgid "0,5" +msgstr "0,5" + +#: FEval.class:105 +msgid "1" +msgstr "1" + +#: FEval.class:111 +msgid "45" +msgstr "45" + +#: FEval.class:117 +msgid "60" +msgstr "60" + +#: FEval.class:122 +msgid "Expression" +msgstr "Expresión" + +#: FEval.class:127 +msgid "a * Cos(Rad(x)) + b * Sin(Rad(y))" +msgstr "a * Cos(Rad(x)) + b * Sin(Rad(y))" + +#: FEval.class:132 +msgid "Result" +msgstr "Resultado" + +#: FEval.class:143 +msgid "&Update result" +msgstr "&Actualizar resultado" + +#: FEval.class:149 +msgid "&Quit" +msgstr "&Salir" + +#: FEval.class:155 +msgid "This is a sample of how to use the expression evaluator." +msgstr "Este es un ejemplo de como usar el evaluador de expresiones." diff --git a/app/examples/Misc/Evaluator/.lang/ru.po b/app/examples/Misc/Evaluator/.lang/ru.po new file mode 100644 index 00000000..dceaba59 --- /dev/null +++ b/app/examples/Misc/Evaluator/.lang/ru.po @@ -0,0 +1,82 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Misc/Evaluator/.project:19 +msgid "Expression evaluation example" +msgstr "Пример вычисления выражения" + +#: app/examples/Misc/Evaluator/.src/FEval.form:5 +msgid "Evaluator" +msgstr "Вычислитель" + +#: app/examples/Misc/Evaluator/.src/FEval.form:10 +msgid "y =" +msgstr "y =" + +#: app/examples/Misc/Evaluator/.src/FEval.form:14 +msgid "x =" +msgstr "x =" + +#: app/examples/Misc/Evaluator/.src/FEval.form:18 +msgid "b =" +msgstr "b =" + +#: app/examples/Misc/Evaluator/.src/FEval.form:22 +msgid "a =" +msgstr "a =" + +#: app/examples/Misc/Evaluator/.src/FEval.form:35 +msgid "45" +msgstr "45" + +#: app/examples/Misc/Evaluator/.src/FEval.form:40 +msgid "60" +msgstr "60" + +#: app/examples/Misc/Evaluator/.src/FEval.form:44 +msgid "Expression" +msgstr "Выражение" + +#: app/examples/Misc/Evaluator/.src/FEval.form:48 +msgid "a * Cos(Rad(x)) + b * Sin(Rad(y))" +msgstr "a * Cos(Rad(x)) + b * Sin(Rad(y))" + +#: app/examples/Misc/Evaluator/.src/FEval.form:52 +msgid "Result" +msgstr "Результат" + +#: app/examples/Misc/Evaluator/.src/FEval.form:60 +msgid "&Update result" +msgstr "Обновить результат" + +#: app/examples/Misc/Evaluator/.src/FEval.form:65 +msgid "&Quit" +msgstr "Выход" + +#: app/examples/Misc/Evaluator/.src/FEval.form:74 +msgid "This is an example of how to use the gb.eval expression evaluator component." +msgstr "Это пример того, как использовать компонент вычисления выражения gb.eval." + diff --git a/app/examples/Misc/Evaluator/.project b/app/examples/Misc/Evaluator/.project new file mode 100644 index 00000000..39a65dde --- /dev/null +++ b/app/examples/Misc/Evaluator/.project @@ -0,0 +1,18 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.0.0 +Title=Expression evaluation example +Startup=FEval +Icon=calculator.png +Version=3.6.2 +VersionFile=1 +Component=gb.image +Component=gb.gui +Component=gb.eval +TabSize=2 +Translate=1 +Language=fr +ExecPath=/home/benoit/gambas/gambas.link/share/gambas/examples/Miscellaneous/Evaluator/Evaluator +Maintainer=benoit +Vendor=Princeton +Address=benoit@localhost +License=General Public Licence diff --git a/app/examples/Misc/Evaluator/.src/FEval.class b/app/examples/Misc/Evaluator/.src/FEval.class new file mode 100644 index 00000000..589d4a5a --- /dev/null +++ b/app/examples/Misc/Evaluator/.src/FEval.class @@ -0,0 +1,53 @@ +' Gambas class file + +Private $hExpr As New Expression +Private $cEnv As New Collection + +Static Public Sub Main() + + Dim hForm As Form + + hForm = New FEval + hForm.Show + +End + + +Public Sub btnUpdate_Click() + + Dim cCol As New Collection + + If $hExpr.Text <> txtExpr.Text Then + $hExpr.Text = txtExpr.Text + Endif + + 'cEnv.Compare = gb.Case + + $cEnv["a"] = CFloat(Val(txtValueA.Text)) + $cEnv["b"] = CFloat(Val(txtValueB.Text)) + $cEnv["x"] = CFloat(Val(txtValueX.Text)) + $cEnv["y"] = CFloat(Val(txtValueY.Text)) + + $hExpr.Compile + $hExpr.Environment = $cEnv + + txtResult.Text = Str($hExpr.Value) + +Catch + + txtResult.Text = Error.Text + +End + +Public Sub btnClose_Click() + + Me.Close + +End + +Public Sub Form_Open() + + txtValueA.Text = Str(0.5) + txtValueB.Text = Str(1) + +End diff --git a/app/examples/Misc/Evaluator/.src/FEval.form b/app/examples/Misc/Evaluator/.src/FEval.form new file mode 100644 index 00000000..722a4b9b --- /dev/null +++ b/app/examples/Misc/Evaluator/.src/FEval.form @@ -0,0 +1,83 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(32,28,51,41) + Text = ("Evaluator") + Icon = Picture["calculator.png"] + Resizable = False + { Label4 Label + MoveScaled(27,17,7,4) + Text = ("y =") + } + { Label3 Label + MoveScaled(27,12,7,4) + Text = ("x =") + } + { Label2 Label + MoveScaled(2,17,7,4) + Text = ("b =") + } + { Label1 Label + MoveScaled(2,12,7,4) + Text = ("a =") + } + { txtValueA TextBox txtValue + Name = "txtValueA" + MoveScaled(6,12,17,4) + } + { txtValueB TextBox txtValue + Name = "txtValueB" + MoveScaled(6,17,17,4) + } + { txtValueX TextBox txtValue + Name = "txtValueX" + MoveScaled(31,12,17,4) + Text = ("45") + } + { txtValueY TextBox txtValue + Name = "txtValueY" + MoveScaled(31,17,17,4) + Text = ("60") + } + { Label6 Label + MoveScaled(2,23,13,4) + Text = ("Expression") + } + { txtExpr TextBox + MoveScaled(15,23,35,4) + Text = ("a * Cos(Rad(x)) + b * Sin(Rad(y))") + } + { Label7 Label + MoveScaled(2,28,13,4) + Text = ("Result") + } + { txtResult TextBox + MoveScaled(15,28,35,4) + ReadOnly = True + } + { btnUpdate Button + MoveScaled(13,36,26,4) + Text = ("&Update result") + Default = True + } + { btnClose Button + MoveScaled(40,36,10,4) + Text = ("&Quit") + Cancel = True + } + { TextLabel1 TextLabel + MoveScaled(1,1,49,7) + Font = Font["Bold,Italic"] + Background = Color.SelectedBackground + Foreground = Color.SelectedForeground + Padding = 6 + Text = ("This is an example of how to use the gb.eval expression evaluator component.") + Alignment = Align.Normal + } + { Separator1 Separator + MoveScaled(1,9,49,1) + } + { Separator2 Separator + MoveScaled(0,34,50,1) + } +} diff --git a/app/examples/Misc/Evaluator/calculator.png b/app/examples/Misc/Evaluator/calculator.png new file mode 100644 index 0000000000000000000000000000000000000000..ed5c2b73885e0daf93305bc16dfcd8fc1c664899 GIT binary patch literal 3612 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

" Then + If Not Trim(aLine[iLine - 1]) Then + If iLine < aLine.Max And If GetIndent(aLine[iLine + 1]) >= hMarkupList.iIndent Then + bJustList = False + Endif + aResult[aResult.Max - 1] = "

\n" & aResult[aResult.Max - 1] + Endif + aResult.Remove(aResult.Max) + Else + GoSub CLOSE_PARA + aResult.Add(Space$(iCurrentIndent) & "
    ") + Endif + iCurrentIndent = hMarkupList.iIndent + aResult.Add(Space$(iCurrentIndent) & "
  1. ") + sLine = Mid$(sLine, 3) + Endif + + Endif + + ' Blockquote again! + + I = iBlockQuote + Do + If Left(sLine) <> ">" Then Break + sCar = Mid$(sLine, 2, 1) + If sCar <> " " And If sCar <> gb.Tab Then Break + Inc I + sLine = LTrim(Mid$(sLine, 3)) + Loop + + If I > iBlockQuote Then + While I > iBlockQuote + aResult.Add("
    ") + Inc iBlockQuote + Wend + Else If I < iBlockQuote Then + While I < iBlockQuote + aResult.Add("
    ") + Dec iBlockQuote + Wend + Endif + + If sLine = "[[" Or If sLine Begins "[[ " Then + + GoSub CLOSE_PARA + iIndent = GetIndent(sLine) + GoSub CLOSE_LIST + GoSub CLOSE_CODE + + $aTable.Push("[[") + sLine = Trim(Mid$(sLine, 3)) + $aTableClass.Push(sLine) + $aTablePos.Push(aResult.Count) + If sLine Then + If sLine Begins "code " Then + Inc Verbatim + Else + aCommand = $hMarkdown.Enter(sLine) + If aCommand Then aResult.Insert(aCommand) + Endif + Endif + 'aResult.Add("") + bIgnorePar = False + bInsidePar = False + Continue + + Endif + + If $aTable.Count Then + + If sLine = "]]" Then + + GoSub CLOSE_PARA + iIndent = GetIndent(sLine) + GoSub CLOSE_LIST + GoSub CLOSE_CODE + + sTable = $aTable.Pop() + sClass = $aTableClass.Pop() + iPos = $aTablePos.Pop() + + aCommand = aResult.Extract(iPos, -1) + + If Left(sClass) <> " " Then + aResult.Add("
    ") + If sClass Begins "code " Then + aTemp = ProcessCode(sClass, aCommand) + Else + aTemp = $hMarkdown.Process(sClass, aCommand) + Endif + If aTemp Then aCommand = aTemp + aResult.Insert(aCommand) + aResult.Add("
    ") + Else + sClass = Trim(sClass) + If Not sClass Then sClass = "table" + aResult.Add("") + If aCommand.Count And If aCommand[0] = "" Then + aCommand.Remove(0) + Else + aResult.Add("") + aResult.Add("
    ") + Endif + aResult.Insert(aCommand) + aResult.Add("
    ") + Endif + + If sClass Begins "code " Then + Dec Verbatim + Else If sClass Then + aCommand = $hMarkdown.Leave(sClass) + If aCommand Then aResult.Insert(aCommand) + Endif + + Continue + + Else If sLine = "--" Then + + GoSub CLOSE_PARA + iIndent = GetIndent(sLine) + GoSub CLOSE_LIST + GoSub CLOSE_CODE + + sTable = $aTable[$aTable.Max] + If sTable = "[[" Then + aResult.Add("") + Else + aResult.Add("") + Endif + bIgnorePar = True + bInsidePar = True + $aTableClass[$aTableClass.Max] = " " & Trim($aTableClass[$aTableClass.Max]) + Continue + + Else If sLine = "==" Then + + GoSub CLOSE_PARA + iIndent = GetIndent(sLine) + GoSub CLOSE_LIST + GoSub CLOSE_CODE + + sTable = $aTable[$aTable.Max] + If sTable = "[[" Then + aResult.Add("") + Else + aResult.Add("") + Endif + aResult.Add("") + $aTable[$aTable.Max] = "==" + $aTableClass[$aTableClass.Max] = " " & Trim($aTableClass[$aTableClass.Max]) + bIgnorePar = True + bInsidePar = True + Continue + + Endif + + Endif + + If sLine Begins "==" And If sLine = String$(Len(sLine), "=") Then + sLine = aResult[aResult.Max] + If sLine Not Begins "" Then + sLine = Mid$(sLine, 4) + bInsidePar = False + Endif + GoSub CLOSE_PARA + aResult[aResult.Max] = "

    " & sLine & "

    " + Endif + Continue + Endif + + If sLine Begins "--" And If sLine = String$(Len(sLine), "-") And If bInsidePar Then + sLine = Trim(aResult[aResult.Max]) + If sLine Then + If sLine Not Begins "" Then + sLine = Mid$(sLine, 4) + bInsidePar = False + Endif + GoSub CLOSE_PARA + aResult[aResult.Max] = "

    " & sLine & "

    " + Endif + Continue + Endif + Endif + + ' Code + + If EnableCode >= 0 Then + If sLine Begins " " Or If sLine Begins gb.Tab Then + + If Left(sLine) = gb.Tab Then + sLine = Mid$(sLine, 2) + Else + sLine = Mid$(sLine, 5) + Endif + If sLine = "----" Then + sLine = "
    " + Else + sLine = Html$(sLine) + Endif + If Not bCode Then + GoSub CLOSE_PARA + bCode = True + sLine = "
    " & sLine
    +        Endif
    +        aResult.Add(sLine)
    +        Continue
    +        
    +      Endif
    +    Endif
    +    
    +    GoSub CLOSE_CODE
    +  
    +    ' Title
    +    
    +    If Left(sLine) = "#" Then
    +      I = InStr(sLine, " ")
    +      If I > 0 And If I <= 7 Then
    +        Dec I
    +        If Left(sLine, I) = String$(I, "#") Then
    +          sLine = Mid$(sLine, I + 2)
    +          While sLine Ends "#"
    +            sLine = Left(sLine, -1)
    +          Wend
    +          sLine = RTrim(sLine)
    +          If Left(sLine) = "[" And If Right(sLine) = "]" Then
    +            sLine = ConvertLine(Mid$(sLine, 2, -1))
    +            $aIndex.Add(String$(I - 1, "  ") & "- [" & sLine & "] (#t" & CStr($aIndex.Count + 1) & ")")
    +            sLine = "" & "" & sLine & ""
    +          Else
    +            sLine = "" & ConvertLine(sLine) & ""
    +          Endif
    +          GoSub CLOSE_PARA
    +          aResult.Add(sLine)
    +          Continue
    +        Endif
    +      Endif
    +    Endif
    +      
    +    If Trim(sLine) Then
    +      If Not bInsidePar And If LTrim(sLine) Not Begins "" & LTrim(sLine)
    +      bInsidePar = True
    +      bAddPar = False
    +    Endif
    +    
    +    aResult.Add(sLine)
    +    
    +  Wend
    +  
    +  GoSub CLOSE_PARA
    +  GoSub CLOSE_CODE
    +  GoSub CLOSE_BLOCKQUOTE
    +  iIndent = 0
    +  GoSub CLOSE_LIST
    +  'If $aMarkup.Count Then Error.Raise("Missing markup: " & $aMarkup[$aMarkup.Max])
    +  
    +  If $aIndex.Count And If iIndexPos >= 0 Then
    +    iIndent = GetIndent($aIndex[0])
    +    For I = 1 To $aIndex.Max
    +      iIndent = Min(iIndent, GetIndent($aIndex[I]))
    +    Next
    +    If iIndent Then
    +      For I = 0 To $aIndex.Max
    +        $aIndex[I] = Mid$($aIndex[I], iIndent + 1)
    +      Next
    +    Endif
    +    aResult[iIndexPos] = "
    \n" & ConvertMarkup($aIndex) & "
    \n" + Endif + + $bComment = bSaveComment + $aMarkup = aSaveMarkup + $aTable = aSaveTable + $aTableClass = aSaveTableClass + $aTablePos = aSaveTablePos + Return aResult.Join("\n") + +CLOSE_CODE: + + If bCode Then + aResult.Add("
    ") + bCode = False + Endif + Return + +CLOSE_BLOCKQUOTE: + + While iBlockQuote + aResult.Add("") + Dec iBlockQuote + Wend + Return + +CLOSE_LIST: + + While iIndent < iCurrentIndent + GoSub CLOSE_PARA + GoSub CLOSE_CODE + aResult.Add(Space$(iCurrentIndent) & "
  2. ") + bJustList = False + aResult.Add(Space$(aList[aList.Max].iIndent) & "") + aList.Remove(aList.Max) + If aList.Count Then + iCurrentIndent = aList[aList.Max].iIndent + Else + iCurrentIndent = 0 + Endif + Wend + Return + +CLOSE_PARA: + + If bInsidePar Then + If Not bIgnorePar Then aResult[aResult.Max] &= "

    " + 'aResult.Add("") + bInsidePar = False + bIgnorePar = False + 'Else If iLine > 0 And If aResult[aResult.Max] Then + ' 'aResult.Add("") + Endif + Return + +'Catch + +' Error.Raise("Line " & CStr(iLine + 1) & ": " & Error.Text) + +End + + +Private Sub ConvertLine(sLine As String) As String + + Dim sResult As String + Dim I, L As Integer + Dim sCar As String + Dim I1, I2 As Integer + Dim sPattern As String + Dim bCode As Boolean + Dim bEmph As Boolean + Dim bStrong As Boolean + Dim sText, sTitle, sLink As String + Dim bBlank As Boolean + Dim bUnderline As Boolean + Dim bLimitBefore, bLimitAfter As Boolean + Dim iLen As Integer + Dim sCommand As String + Dim aCommand As String[] + Dim iPos As Integer + + iLen = String.Len(sLine) + +MAIN_LOOP: + + If I >= iLen Then + If bEmph Then + sResult &= "
    " + Else If bStrong Then + sResult &= "
    " + Endif + If bCode Then sResult &= "" + Return sResult + Endif + + GoSub NEXT_CAR + + If sCar = "\\" Then + If I = iLen Then + sResult &= "
    " + Else + GoSub NEXT_CAR + sResult &= Html(sCar) + Endif + Goto MAIN_LOOP + Endif + + If sCar = "<" Then Goto ENTER_MARKUP + + If sCar = "&" Then Goto ENTER_AMPERSAND + + If sCar = "[" And If String.Mid$(sLine, I + 1, 1) <> " " Then Goto ENTER_LINK + + If sCar = "@" And If String.Mid$(sLine, I + 1, 1) = "{" Then Goto ENTER_COMMAND + + If I = 1 Or If IsWordLimit(String.Mid$(sLine, I - 1, 1)) Then + bLimitBefore = True + Else + bLimitBefore = False + Endif + + If IsWordLimit(String.Mid$(sLine, I + 1, 1)) Then + bLimitAfter = True + Else + bLimitAfter = False + Endif + + If bLimitBefore Or If bLimitAfter Then + If sCar = "`" And If Not bCode Then Goto ENTER_CODE + If sCar = "'" Then Goto ENTER_LIGHT_CODE + If sCar = "*" Then Goto ENTER_STAR + If sCar = "~" Then Goto ENTER_UNDERLINE + Endif + + If sCar = ">" Then + sCar = ">" + Endif + + sResult &= sCar + + Goto MAIN_LOOP + +NEXT_CAR: + + If I >= iLen Then + I = iLen + 1 + sCar = "" + Else + Inc I + sCar = String.Mid$(sLine, I, 1) + Endif + Return + +LOOK_CAR: + + sCar = String.Mid$(sLine, I + 1, 1) + Return + +ENTER_MARKUP: + + If String.Mid$(sLine, I, 4) = " "; sData + Print #$hStream, sData + Flush #$hStream + Return GetLine(bMulti) + +End + +Public Sub Print(Optional sData As String) + + If Not Me.Connected Then Return + + If _Debug Then Error "--> "; sData + Print #$hStream, sData + Flush #$hStream + +End + + +Public Function GetLine(Optional bMulti As Boolean) As String + + Dim sLine As String + Dim sResponse As String + Dim iPos As Integer + + If Not Me.Connected Then Return + + bMulti = True + + If bMulti Then + + Do + Line Input #$hStream, sLine + sResponse &= sLine & "\n" + If sLine Like "??? *" Then Break + If $hStream.EndOfFile Then Break + Loop + + Else + + Line Input #$hStream, sLine + sResponse = sLine + + Endif + + LastAnswer = sLine + iPos = InStr(sLine, " ") + If iPos = 0 Then + LastCode = "" + Else + LastCode = Left(sLine, iPos - 1) + Endif + + If _Debug Then Error sResponse + Return sResponse + +End + +Private Function Stream_Read() As Stream + + Return $hStream + +End + +Private Sub Stream_Write(Value As Stream) + + $hStream = Value + +End + +Private Function Connected_Read() As Boolean + +End + +Public Sub PrintHeader(sHeader As String, sStr As String, Optional bAddress As Boolean) + + If Not sStr Or If IsAscii(sStr) Then + If sStr Not Begins "=?utf-8?q?" Or If sStr Not Ends "?=" Then + Print(sHeader & ": " & sStr) + Return + Endif + Endif + + Encode.PrintQuotedHeader($hStream, sHeader, sStr, bAddress, _Debug) + +End + +Private Function Client_Read() As SmtpClient + + Return $hClient + +End diff --git a/comp/src/gb.net.smtp/.src/SslSession.class b/comp/src/gb.net.smtp/.src/SslSession.class new file mode 100644 index 00000000..4f5368ea --- /dev/null +++ b/comp/src/gb.net.smtp/.src/SslSession.class @@ -0,0 +1,76 @@ +' Gambas class file + +Inherits SmtpSession + +Property Read Connected As Boolean + +Private $hProcess As Process +Private $sError As String +Private $bConnected As Boolean +Private $bDisconnect As Boolean + +Public Sub Connect(hClient As SmtpClient, sHost As String, iPort As Integer) + + Dim aExec As String[] + + If Not sHost Then sHost = "localhost" + If iPort = 0 Then iPort = 465 + + Super.Connect(hClient, sHost, iPort) + + aExec = [SmtpSession.GetOpenSSLPath(), "s_client", "-quiet", "-connect", sHost & ":" & iPort] + If Me._Debug Then Error "gb.net.smtp: running: "; aExec.Join(" ") + + $hProcess = Exec aExec For Read Write As "OpenSSL" + $hProcess.Blocking = True + $hProcess.EndOfLine = gb.Windows + + $bConnected = False + Repeat + Wait 0.1 + If Not $hProcess Then + If $sError Then + Error.Raise(Trim(Split($sError, "\n")[0])) + Else + Error.Raise("SSL session has stopped unexpectedly") + Endif + Endif + Until $bConnected + + Me.Stream = $hProcess + +End + +Public Sub Disconnect() + + $bDisconnect = True + $hProcess.Kill() + +End + +Public Sub OpenSSL_Error(Text As String) + + If Me._Debug Then Error "openssl: "; Quote(Text) + $sError &= Text + +End + +Public Sub OpenSSL_Read() + + $bConnected = True + +End + + +Public Sub OpenSSL_Kill() + + Super.Disconnect + $hProcess = Null + +End + +Private Function Connected_Read() As Boolean + + If $hProcess And If $hProcess.State = Process.Running Then Return True + +End diff --git a/comp/src/gb.net.smtp/.src/TcpSession.class b/comp/src/gb.net.smtp/.src/TcpSession.class new file mode 100644 index 00000000..c7d4be85 --- /dev/null +++ b/comp/src/gb.net.smtp/.src/TcpSession.class @@ -0,0 +1,89 @@ +' Gambas class file + +Inherits SmtpSession + +Property Read Connected As Boolean + +Private $hSocket As New Socket + +Public Sub _new() + + 'Wait 10 seconds before timing out + $hSocket.Timeout = 10000 + $hSocket.EndOfLine = gb.Windows + +End + +Public Sub Client_Ready() + + 'Debug "Connected to remote host " & sSocket.Path + +End + +Public Sub Client_Closed() + + 'Debug "Connection Closed by foreign host." + +End + +Public Sub Client_Found() + + 'Debug "Host Found. Connecting..." + +End + +Public Sub Connect(hClient As SmtpClient, sHost As String, iPort As Integer) + + If Not sHost Then sHost = "localhost" + If iPort = 0 Then iPort = 25 + + Super.Connect(hClient, sHost, iPort) + + $hSocket.Timeout = 10000 + $hSocket.Connect(sHost, iPort) + $hSocket.Blocking = True + Me.Stream = $hSocket + + Do + 'Print $hSocket.Status + If $hSocket.Status = Net.Connected Or If $hSocket.Status <= 0 Then Break + Wait 0.1 + Loop + + If $hSocket.Status < 0 Then + + Select Case $hSocket.Status + + Case Net.CannotCreateSocket + Error.Raise("Cannot create socket") + + Case Net.HostNotFound + Error.Raise("Host not Found") + + Case Net.ConnectionRefused + Error.Raise("Connection Refused") + + Case Net.CannotRead + Error.Raise("Read error") + + Case Net.CannotWrite + Error.Raise("Write error") + + End Select + + Endif + +End + +Public Sub Disconnect() + + Try $hSocket.Close + Super.Disconnect + +End + +Private Function Connected_Read() As Boolean + + Return $hSocket.Status = Net.Connected + +End diff --git a/comp/src/gb.net.smtp/.src/TlsSession.class b/comp/src/gb.net.smtp/.src/TlsSession.class new file mode 100644 index 00000000..d90a8c08 --- /dev/null +++ b/comp/src/gb.net.smtp/.src/TlsSession.class @@ -0,0 +1,77 @@ +' Gambas class file + +Inherits SmtpSession + +Property Read Connected As Boolean + +Private $hProcess As Process +Private $bConnected As Boolean +Private $sError As String + +Public Sub Connect(hClient As SmtpClient, sHost As String, iPort As Integer) + + Dim aExec As String[] + Dim I As Integer + + If Not sHost Then sHost = "localhost" + If iPort = 0 Then iPort = 587 + + Super.Connect(hClient, sHost, iPort) + + aExec = [SmtpSession.GetOpenSSLPath(), "s_client", "-quiet", "-starttls", "smtp", "-connect", sHost & ":" & iPort] + If Me._Debug Then Error "gb.net.smtp: running: "; aExec.Join(" ") + + $hProcess = Exec aExec For Read Write As "OpenSSL" + $hProcess.Blocking = True + $hProcess.EndOfLine = gb.Windows + + $bConnected = False + For I = 1 To 10 + Wait 0.1 + If Not $hProcess Then + If $sError Then + Error.Raise(Trim(Split($sError, "\n")[0])) + Else + Error.Raise("TLS session has stopped unexpectedly") + Endif + Endif + Next + + $bConnected = True + + Me.Stream = $hProcess + +End + +Public Sub Disconnect() + + $hProcess.Kill() + +End + +Public Sub OpenSSL_Error(Text As String) + + If Me._Debug Then Error "openssl: "; Quote(Text) + $sError &= Text + +End + +Public Sub OpenSSL_Read() + + $bConnected = True + +End + + +Public Sub OpenSSL_Kill() + + Super.Disconnect + $hProcess = Null + +End + +Private Function Connected_Read() As Boolean + + If $hProcess And If $hProcess.State = Process.Running Then Return True + +End diff --git a/comp/src/gb.report/.component b/comp/src/gb.report/.component new file mode 100644 index 00000000..c980ae9e --- /dev/null +++ b/comp/src/gb.report/.component @@ -0,0 +1,7 @@ +[Component] +Key=gb.report +Version=3.12.90 +State=3 +Authors=Fabien Bodard +Needs=Form,ImageIO +Requires=gb.form diff --git a/comp/src/gb.report/.connection/Connection1.connection b/comp/src/gb.report/.connection/Connection1.connection new file mode 100644 index 00000000..a918b624 --- /dev/null +++ b/comp/src/gb.report/.connection/Connection1.connection @@ -0,0 +1,10 @@ +[Connection] +Type="mysql" +Host="localhost" +RememberPassword=False +IgnoreCharset=False +Database="test" +User="root" +DisplayMetadata=False +Requests=["select distinct firstname from test"] + diff --git a/comp/src/gb.report/.connection/Connection2.connection b/comp/src/gb.report/.connection/Connection2.connection new file mode 100644 index 00000000..cf224bc1 --- /dev/null +++ b/comp/src/gb.report/.connection/Connection2.connection @@ -0,0 +1,10 @@ +[Connection] +Type="mysql" +Host="localhost" +User="root" +RememberPassword=False +IgnoreCharset=False +Database="Laurux01" +DisplayMetadata=False +Requests=[""] + diff --git a/comp/src/gb.report/.connection/MainConn.connection b/comp/src/gb.report/.connection/MainConn.connection new file mode 100644 index 00000000..c6f0d11e --- /dev/null +++ b/comp/src/gb.report/.connection/MainConn.connection @@ -0,0 +1,9 @@ +[Connection] +Type="sqlite" +Path="/home/fabien/Documents/Gestion/Bases" +RememberPassword=False +IgnoreCharset=False +DisplayMetadata=False +Database="gestion" +Requests=[""] + diff --git a/comp/src/gb.report/.dir_icon.png b/comp/src/gb.report/.dir_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..04f17072df13d7cb5c6a2530f1393161a436fc0c GIT binary patch literal 1571 zcmV+;2Hg3HP)4Z zatrxjnD5M)neR9MxeBEe@pxSEG279jM|)GL)VxtDIDGi<#}+&uk7JtV7GMc%X`8QYs+0Ho(rU z8<{}`$O^wAm8Fn{fgnK^07|I@;JRilz=pyrP)eYbDvqeAT7_TwznT~3Kq&~=g?>zv zjRVZwO!4+#=D2nvO**F$4u{y@+s5<5?F{u`B_Z66T@oZufYg!UWn5FR1dFwxs$f& z9js(CSaugTW**^YQ+WAhJU7GTf3NWUg$%D9?B&HhR^8yG(Yvl&{#Wwr0z6vE@XG5a z=^6esc5^F2(-8=ilC(y1IQcwN|Gb5zIfRTQ(uq6#>^Ba32m5*WV2Q+oEFs$>Xz5sn zj%f&Nvs#&k3XEO2$mXGaXu5&tdKjhvp&>L4%Wg(D0`%>Q(%un6GYssYO(c}#cNgbz zle4_|*59wrvuYcuPF3&BJ&acj+K%nV5x)A^%wRn#YCNJ}; zFMXSbo`Ws@V$gaUbq#=P*Kf0U=MJCv%n(5XethT!oV-u0y_sCzW$cgd^XIAC2m~O| z4U>H@eV4_B8KT|Wxt~~I@}iF}2if1N6BLq0RKy#s0EZ3?6Kf3?RnV|Q5w`B!LogIU(+rj#BzgBw@A1~949mWb5TcwKD&V>WO6#m?CnQ9T+ZXm(!C&X^LhUD_e*>@6Jh`E zE_Oc=rpa1o5iTz;)84FOhiry+bXT2Rm8YC4UOKyaBRt*HijO021XVd#AI3p;qSr-fht z^0!P+FEBjxBp-gX$Y5XBnw<(E@O>YE0|yRZ7zR=nj$@@1rfDLjWMpJyJdsGut_c9J z>xnSeZ>8z(j`6|OIi_ds@||x*8?J%My&j9j$}(5li4!L#&YwU3GLUEp(9&eGvnR~p zzyOJ*O}wzLgZ{qmhO$-ytgNh*)d&O%yW`lgV-u%No%$wltJJ39i)i<@F#U(0W4Ql5 z`}b^GcU~*ab=|V;j^i*gGBR=c^y#YL4HWi>7I0vsuobJv(vk+_}2JYXA(xsC&{q4nXPUn@lD-e*E~a z#>U2e1T3u8rV1dJ%l+Q~B^8exIr5Y7@$nx3D~;Ne0pjua{~WlUjgOBXTQ4}ke*oY4 V*+a}sDck@6002ovPDHLkV1oU`2~Yq4 literal 0 HcmV?d00001 diff --git a/comp/src/gb.report/.directory b/comp/src/gb.report/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/comp/src/gb.report/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/comp/src/gb.report/.hidden/control/reportdrawingarea.png b/comp/src/gb.report/.hidden/control/reportdrawingarea.png new file mode 100644 index 0000000000000000000000000000000000000000..cd577a0649a337c0b3ab44729e985cd474d3909c GIT binary patch literal 621 zcmV-z0+RiSP)7yFc8&Z>5i}a$fLzfB%Y# z|M>WJ`iM#4wMf#onsa2NZe+l2f8uw4|GvIR;kI|2ho5d=zixl%d4KK zaACx6fBb%b|FyN&|JJAfr=YpDtZr=Ocz^$af#mrAf876!#pKj< zfB&ni*Yy9cilEMNfB%4h|K{e~_5X>>>#mET#gU=^p`ri5!Snq8fZYGN?EjzT|K|Ar z;P?Nj=l{p>|CQqZ_Wl3T^Z$q5|MmR;_x=CL@c*3T|Dfgnxa|Ms`2U_^$~pi50QN~l zK~y-)V_+Z%81Vx7DPUqo02XWtSlJMOov;E90tz^}xbZ9C;pOARr+{C8msb#<0wG>r zUSSdJ3Pi=kB_ySQ3V5ZlDUgwslb4rQP*egcP*%ZIpsEIxmRHx%)Y1m3(7{k3qYILk z*VETDFfiohH8Mt5APbf^F$F0wGw0>CKv7_6Wo=^%0(SQH4h9AWj=a219H_DB>;eL= z1`yx|bcH*r0uQhPPpASfpaO3n6a~H@c|U(B2nYm%AQT0`AudQD6ibQp#IC@u00000NkvXX Hu0mjf^C?oX literal 0 HcmV?d00001 diff --git a/comp/src/gb.report/.hidden/control/reportgridview.png b/comp/src/gb.report/.hidden/control/reportgridview.png new file mode 100644 index 0000000000000000000000000000000000000000..32872a01a296ff50965b0c8f4cb4d0f25053e216 GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^3Lwk@BpAX3RW*QAkf)1dh{fsToP-1X5fU;I5_}d4 z+zUVO83-CQG%jFrdvqtDU#H}PT<2wvozfcN2M!f9G&Vj|=(^z;!pg_P!~Q1l$;8SK kj+24$J-?b%;swrBF*rY$xn^-Uc0R}!Pgg&ebxsLQ0J@+nH2?qr literal 0 HcmV?d00001 diff --git a/comp/src/gb.report/.hidden/control/reporthbox.png b/comp/src/gb.report/.hidden/control/reporthbox.png new file mode 100644 index 0000000000000000000000000000000000000000..792f8fda3752fec145613e3e18628bb6a932a923 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@o&cW^S0Mc#2pSsxGccU9c-IW% zGnEAS1v4;|O+IS@$w9j<+{{sLF0Hu^Ffl>dZeFgADM9Le-N~)I({*yoiaDfNF z0|W2@Po+}nOSWU9ltQ6UnktO}wT4Hj4RfV=Rqgu((RCfuG@k>;jMAKGJ2szx{S&@0 z`763I)8w7&7{wI#qixI@M`*cgW9Ey5YN8Z7o4ITKnL}!vaJZ55O(7l%6L-GIk7GS7 zG(NK}fa#z01DLQD1By}@)TU;M7c)4{H9WtMbXz<1&Mb`XM{`{OqT;dpzQ^H6C%5~P zw50FS^jw^l1)F$%J>gWCMSc6&)-jqfFtuG*wzi4poz6BL)4vPIlLdwr>`%z zObbIaX5tTNkKe=Y-Aiu|=r8t>?~HILJ&vZSZM6c-`ba61xrAAlCfD3d!KfuuUrQt~ zi*6Jj0kA9zy2<;+Pk2A^G6(jh(0lthbgYYsYZv%NXMm$-0!`PpRHfA80F+Wla0Rb6 z&$2&=8*{Mq3=?iQSt9~~&*#JPnPhz?AuYtsrAdB%>je&V*Rzn->F&Ers3}FnXQ4E0 zORdU)Qi?*LmKmd!8>)c;mB<3{}Oy>abTWbIe(b$y}UR(GM9UUF~ z@<$2gV$Tq2Y$eyw$CT$s)76%`5rDCgj^$7vK6je-`8)UuHks~yeD1FSlsF{@ObpS` zMZ;&A99<3*dqeP42P3EN(9+hz+rQpjj`AHzWf1BbPV}4P>vmzStk8QUfD(967vN5_ z@M)7nUiZ*N!>aLoHIwsT2LsgQhz^y)fOgr$|62(Gj=Pw_KzoM)fhlM^3m;m$4Gr8gHO5i zsw>2l$1AB(ULT)9&(AQ_@<;s3I$Bc*=QW287Wm0%cw4`3)Gf1M9id@x@4)xScGb~V z-$3@MB>SUro;4DzIz>V?I=Qw0xu52_)iA-kSAu+OH}B~5nx;|e!UT|tAl&F5N8iij zt8cNm_%@T{DPmun!pnIyCpw7k>tS+0u%}k|&EHSs1hlG`ka!N_IZ$rg!plz<6Q31i&yjC&x$#RBuL_PUU{vpF#4RFT0bBWOAi~;Yt^5@~Q5_d+9xLvllQrkE4vh&e~`(5Z9n* zPYAkdg0004qNklj!v1=+jk{TC+yZAzak0&(z4UTfjL&qHaB} zMkd|K2N6mH>vq~GA_zC`Zsaz?j%9C4dl+vl4^u{nS$0Piu-_Pv(xc|DVl~n_lb;*| zJn`}a+)fmLB)d-aXAr9N7%~yw-57a_kg>^SbPR_Z*-H&!+9n%Uz@9x|1L5Ab#a5op zMt(<#BEp)(fScMw%A8Ijd=PN}#1xPxU}~^{aOvbQJ_?Fhv?ek4U7M?DSAs)xyp4rIBV8FwCF#g2v z{)ZEvn3cM4u+`S{TWhyu^mFh0lU4AEiysK;4-{JJwSW6@pDj?Y_i2*a3kRSX44$rj JF6*2UngH&LBuM}O literal 0 HcmV?d00001 diff --git a/comp/src/gb.report/.hidden/control/reportpagebreak.png b/comp/src/gb.report/.hidden/control/reportpagebreak.png new file mode 100644 index 0000000000000000000000000000000000000000..3ca2f103d56721395579e192a2543a595529095c GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4Ush%#5As)xyUNPiqFyLu@XfIT7 z`FBOVO}}3d%jL5NT|aQXosh$O^16suPsC3-ZobV74TrCY87M9J=D15v$m4o3t%*J6Eu$YKgkNTkipZ{&t;uc GLK6VR!8YRn literal 0 HcmV?d00001 diff --git a/comp/src/gb.report/.hidden/control/reportpanel.png b/comp/src/gb.report/.hidden/control/reportpanel.png new file mode 100644 index 0000000000000000000000000000000000000000..fce67f7d052048a841374079576e350d53dc010f GIT binary patch literal 154 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 UirGzFm;e9(07*qoM6N<$g7*PU$p8QV literal 0 HcmV?d00001 diff --git a/comp/src/gb.report/.hidden/control/reportvbox.png b/comp/src/gb.report/.hidden/control/reportvbox.png new file mode 100644 index 0000000000000000000000000000000000000000..bc04bb7f24319fc37979abc9713c1a8f99d569b0 GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvp#Yx{S0MfW|NjFA4m310{0AZi zhBM|fJ_1EqN`m}?fi%PB$!W8IRF|iVV~EE2r4tSL8Web3yE}Kw-e^3+T*1tyzo7H` z{;vHCA}%;SPFJY?`_p8~v#5zmp-d0F7~H=0HY{9R(xkz7=P{e8g6)-T)?+yqj7*yz zo+xlxr~dRncI0};f@7y-rYlRh?bUd2v&)fL%=x51!p_1E>J2?*eE;kD{?uEjG>Crq hvt{Q>#_eyn-(qa*xBJd9EhHc0I!{+Wmvv4FO#ng6T^9fV literal 0 HcmV?d00001 diff --git a/comp/src/gb.report/.hidden/control/reportview.png b/comp/src/gb.report/.hidden/control/reportview.png new file mode 100644 index 0000000000000000000000000000000000000000..8f07053ba0d28f7cbd0e1f5c778234cfce9b1e17 GIT binary patch literal 732 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\n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Report designer" +msgstr "Dissenyador d'informes" + +#: .project:2 +msgid "Report engine for gambas" +msgstr "Motor d'informes pel Gambas" + +#: FExample.form:40 +msgid "Demo 1" +msgstr "-" + +#: FExample.form:47 +msgid "Demo 2" +msgstr "-" + +#: FExample.form:54 +msgid "Cloner" +msgstr "Clonador" + +#: FExample.form:61 myReport2.report:51 +msgid "Facture" +msgstr "Factura" + +#: FExample.form:68 +msgid "Report in report" +msgstr "Informe en l'informe" + +#: FExample.form:98 +msgid "Test Print" +msgstr "Prova d'impressió" + +#: FOptions.form:25 +msgid "Size" +msgstr "Mida" + +#: FOptions.form:34 +msgid "Paper size" +msgstr "Mida del paper" + +#: FOptions.form:41 +msgid "Custom paper size" +msgstr "Misa de paper personalitzada" + +#: FOptions.form:45 +msgid "Width:" +msgstr "Amplada:" + +#: FOptions.form:51 +msgid "Height:" +msgstr "Alçada:" + +#: FOptions.form:67 +msgid "Orientation" +msgstr "Orientació" + +#: FOptions.form:72 +msgid "Landscape" +msgstr "Apaïsat" + +#: FOptions.form:72 +msgid "Portrait" +msgstr "Vertical" + +#: FPreview.form:28 +msgid "Report preview" +msgstr "Vista prèvia de l'informe" + +#: FPreview.form:38 +msgid "Print..." +msgstr "Imprimeix..." + +#: FPreview.form:48 +msgid "First page" +msgstr "Primera pàgina" + +#: FPreview.form:61 +msgid "Page" +msgstr "Pàgina" + +#: FPreview.form:87 +msgid "Last page" +msgstr "Última pàgina" + +#: FPreview.form:97 +msgid "Fit to window" +msgstr "Ajusta a la finestra" + +#: FPreview.form:104 +msgid "Zoom 100%" +msgstr "Escala 100%" + +#: FPreview.form:110 +msgid "Zoom out" +msgstr "Allunya" + +#: FPreview.form:124 +msgid "Zoom in" +msgstr "Apropa" + +#: Report1.report:15 +msgid "#3" +msgstr "-" + +#: Report1.report:17 +msgid "#1" +msgstr "-" + +#: Report1.report:27 +msgid "COUCOU" +msgstr "Cucut" + +#: Report1.report:56 +msgid "#2" +msgstr "-" + +#: Report4.report:30 +msgid "IMPRESSION DU PLAN COMPTABLE" +msgstr "Impressió del plà contable" + +#: Report4.report:54 +msgid "Code" +msgstr "Codi" + +#: Report4.report:62 +msgid "Intitulé" +msgstr "Dret" + +#: Report4.report:105 myReport2.report:254 +msgid "Page $PAGE" +msgstr "Pàgina $PAGE" + +#: Report6.report:13 +msgid "coucou" +msgstr "cucut" + +#: myReport1.report:27 +msgid "First Page" +msgstr "Primera pàgina" + +#: myReport1.report:37 +msgid "Report About" +msgstr "Informe Quant a" + +#: myReport1.report:45 +msgid "All my friends" +msgstr "Tots els meus amics" + +#: myReport1.report:53 +msgid "Friend Table" +msgstr "Taula d'amics" + +#: myReport1.report:59 +msgid "Report about all my frends" +msgstr "Informe sobre tots els meus amics" + +#: myReport1.report:66 +msgid "Test Database" +msgstr "Base de dades de prova" + +#: myReport1.report:89 +msgid "Name" +msgstr "Nom" + +#: myReport1.report:99 +msgid "FirstName" +msgstr "Nom" + +#: myReport1.report:110 +msgid "Birth" +msgstr "Naixement" + +#: myReport1.report:151 +msgid "$PAGE/$NPAGE" +msgstr "-" + +#: myReport2.report:40 +msgid "Section 1" +msgstr "Secció 1" + +#: myReport2.report:131 +msgid "Id" +msgstr "Identificació" + +#: myReport2.report:140 +msgid "Designation" +msgstr "Designació" + +#: myReport2.report:148 +msgid "PU HT" +msgstr "-" + +#: myReport2.report:157 +msgid "Quantité" +msgstr "Quantitat" + +#: myReport2.report:165 +msgid "Total HT" +msgstr "HT total" + +#: myReport5.report:42 +msgid "Gambas" +msgstr "-" + +#: myReport5.report:77 +msgid "gambas" +msgstr "-" + +#: myReport5.report:97 +msgid "Page $PAGE on $NPAGE" +msgstr "Pàgina $PAGE de $NPAGE" diff --git a/comp/src/gb.report/.lang/cs.po b/comp/src/gb.report/.lang/cs.po new file mode 100644 index 00000000..bbbb4bb9 --- /dev/null +++ b/comp/src/gb.report/.lang/cs.po @@ -0,0 +1,233 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Report designer" +msgstr "Tvůrce designu" + +#: .project:2 +msgid "Report engine for gambas" +msgstr "Report nástroj pro gambas" + +#: FOptions.form:25 +msgid "Size" +msgstr "Velikost" + +#: FOptions.form:34 +msgid "Paper size" +msgstr "Velikost papíru" + +#: FOptions.form:41 +msgid "Custom paper size" +msgstr "Volitelná velikost papíru" + +#: FOptions.form:45 +msgid "Width:" +msgstr "Šířka:" + +#: FOptions.form:51 +msgid "Height:" +msgstr "Výška:" + +#: FOptions.form:67 +msgid "Orientation" +msgstr "Orientace" + +#: FOptions.form:72 +msgid "Landscape" +msgstr "Na šířku" + +#: FOptions.form:72 +msgid "Portrait" +msgstr "Na výšku" + +#: FPreview.form:28 +msgid "Report preview" +msgstr "Náhled reportu" + +#: FPreview.form:39 +msgid "Print..." +msgstr "Tisk..." + +#: FPreview.form:49 +msgid "First page" +msgstr "První stránka" + +#: FPreview.form:55 +msgid "Previous page" +msgstr "Předchozí stránka" + +#: FPreview.form:62 +msgid "Page" +msgstr "Stránka" + +#: FPreview.form:82 +msgid "Next page" +msgstr "Další stránka" + +#: FPreview.form:88 +msgid "Last page" +msgstr "Poslední stránka" + +#: FPreview.form:98 +msgid "Fit to window" +msgstr "Přizpůsobit oknu" + +#: FPreview.form:105 +msgid "Zoom 100%" +msgstr "100% velikost" + +#: FPreview.form:111 +msgid "Zoom out" +msgstr "Oddálit" + +#: FPreview.form:125 +msgid "Zoom in" +msgstr "Přiblížit" + +#: Report.class:100 +msgid "Section " +msgstr "Sekce" + +#: Report1.report:15 +msgid "#3" +msgstr "-" + +#: Report1.report:17 +msgid "#1" +msgstr "-" + +#: Report1.report:27 +msgid "COUCOU" +msgstr "-" + +#: Report1.report:56 +msgid "#2" +msgstr "-" + +#: Report4.report:31 +msgid "IMPRESSION DU PLAN COMPTABLE" +msgstr "-" + +#: Report4.report:55 +msgid "Code" +msgstr "-" + +#: Report4.report:63 +msgid "Intitulé" +msgstr "-" + +#: Report4.report:106 myReport2.report:253 +msgid "Page $PAGE" +msgstr "Stránka $PAGE" + +#: Report6.report:13 Report7.report:64 +msgid "coucou" +msgstr "-" + +#: Report8.report:24 +msgid "List of all my friends" +msgstr "-" + +#: Report8.report:34 +msgid "List Of My Friends" +msgstr "-" + +#: Report8.report:79 +msgid "Page $PAGE / $NPAGE" +msgstr "Stránka $PAGE / $NPAGE" + +#: Report9.report:13 +msgid "ReportLabel1" +msgstr "-" + +#: myReport1.report:27 +msgid "First Page" +msgstr "První stránka" + +#: myReport1.report:37 +msgid "Report About" +msgstr "O reportu..." + +#: myReport1.report:45 +msgid "All my friends" +msgstr "Všeichni mí přátelé" + +#: myReport1.report:53 +msgid "Friend Table" +msgstr "-" + +#: myReport1.report:59 +msgid "Report about all my frends" +msgstr "-" + +#: myReport1.report:66 +msgid "Test Database" +msgstr "Test databáze" + +#: myReport1.report:89 +msgid "Name" +msgstr "Název" + +#: myReport1.report:99 +msgid "FirstName" +msgstr "Jméno" + +#: myReport1.report:110 +msgid "Birth" +msgstr "Narození" + +#: myReport1.report:151 +msgid "$PAGE/$NPAGE" +msgstr "-" + +#: myReport2.report:40 +msgid "Section 1" +msgstr "Sekce 1" + +#: myReport2.report:51 +msgid "Facture" +msgstr "Faktura" + +#: myReport2.report:130 +msgid "Id" +msgstr "-" + +#: myReport2.report:139 +msgid "Designation" +msgstr "-" + +#: myReport2.report:147 +msgid "PU HT" +msgstr "-" + +#: myReport2.report:156 +msgid "Quantité" +msgstr "-" + +#: myReport2.report:164 +msgid "Total HT" +msgstr "-" + +#: myReport5.report:42 +msgid "Gambas" +msgstr "-" + +#: myReport5.report:77 +msgid "gambas" +msgstr "-" + +#: myReport5.report:96 +msgid "Page $PAGE on $NPAGE" +msgstr "Stránka $PAGE z $NPAGE" + diff --git a/comp/src/gb.report/.lang/es.po b/comp/src/gb.report/.lang/es.po new file mode 100644 index 00000000..81df2af1 --- /dev/null +++ b/comp/src/gb.report/.lang/es.po @@ -0,0 +1,423 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.report 3.6.0\n" +"PO-Revision-Date: 2014-10-13 17:30 UTC\n" +"Last-Translator: jesus \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Report designer" +msgstr "Diseñador de reportes" + +#: .project:2 +msgid "Report engine for gambas" +msgstr "-" + +#: FOptions.form:25 +msgid "Size" +msgstr "Tamaño" + +#: FOptions.form:34 +msgid "Paper size" +msgstr "Tamaño de papel" + +#: FOptions.form:41 +msgid "Custom paper size" +msgstr "Tamaño de papel personalizado" + +#: FOptions.form:45 +msgid "Width:" +msgstr "Ancho:" + +#: FOptions.form:51 +msgid "Height:" +msgstr "" + +#: FOptions.form:67 FPreview.form:208 +msgid "Orientation" +msgstr "Orientación" + +#: FOptions.form:72 FPreview.form:214 +msgid "Landscape" +msgstr "Paisaje" + +#: FOptions.form:72 FPreview.form:214 +msgid "Portrait" +msgstr "Retrato" + +#: FPreview.class:313 FPrint.form:192 +msgid "Cancel" +msgstr "Cancelar" + +#: FPreview.class:327 +msgid "Layout..." +msgstr "Disposición..." + +#: FPreview.form:67 +msgid "Report preview" +msgstr "Vista previa de reporte" + +#: FPreview.form:97 +msgid "Printing..." +msgstr "Impresión..." + +#: FPreview.form:117 +msgid "One page" +msgstr "Una página" + +#: FPreview.form:127 +msgid "Two pages" +msgstr "Dos páginas" + +#: FPreview.form:136 +msgid "Full width" +msgstr "Ajustar ancho" + +#: FPreview.form:145 +msgid "Real size" +msgstr "Tamaño real" + +#: FPreview.form:177 +msgid "Printer" +msgstr "Impresora" + +#: FPreview.form:189 +msgid "File" +msgstr "Archivo" + +#: FPreview.form:223 FPrint.form:109 +msgid "Paper" +msgstr "Papel" + +#: FPreview.form:229 +msgid "A3" +msgstr "-" + +#: FPreview.form:229 +msgid "A4" +msgstr "-" + +#: FPreview.form:229 +msgid "A5" +msgstr "-" + +#: FPreview.form:229 +msgid "B5" +msgstr "-" + +#: FPreview.form:229 Form1.form:78 +msgid "Custom" +msgstr "" + +#: FPreview.form:229 +msgid "Executive" +msgstr "-" + +#: FPreview.form:229 +msgid "Legal" +msgstr "-" + +#: FPreview.form:229 +msgid "Letter" +msgstr "-" + +#: FPreview.form:243 FPrint.form:130 +msgid "Width" +msgstr "Ancho" + +#: FPreview.form:253 FPrint.form:148 +msgid "mm" +msgstr "-" + +#: FPreview.form:258 FPrint.form:135 +msgid "Height" +msgstr "Altura" + +#: FPreview.form:287 +msgid "Recto Verso" +msgstr "" + +#: FPreview.form:293 FPrint.form:100 +msgid "Long side" +msgstr "Lado largo" + +#: FPreview.form:293 FPrint.form:100 +msgid "None" +msgstr "Ninguno" + +#: FPreview.form:293 FPrint.form:100 +msgid "Short side" +msgstr "Lado corto" + +#: FPreview.form:308 +msgid "Gray Scale" +msgstr "Escala de grises" + +#: FPreview.form:315 +msgid "Full Page" +msgstr "Página completa" + +#: FPreview.form:321 +msgid "Reverse order" +msgstr "Orden inverso" + +#: FPreview.form:327 +msgid "Collate copies" +msgstr "" + +#: FPreview.form:348 FPrint.form:71 +msgid "Range" +msgstr "Rango" + +#: FPreview.form:362 +msgid "Copies" +msgstr "Copias" + +#: FPreview.form:385 +msgid "Print" +msgstr "Imprimir" + +#: FPrint.form:38 +msgid "Printer Config" +msgstr "Configurar Impresora" + +#: FPrint.form:58 +msgid "More..." +msgstr "Más..." + +#: FPrint.form:89 +msgid "RectoVerso" +msgstr "" + +#: FPrint.form:178 +msgid "Copies :" +msgstr "" + +#: Form1.form:56 +msgid "One Page" +msgstr "Una página" + +#: Form1.form:64 +msgid "Two Page" +msgstr "Dos páginas" + +#: Form1.form:71 +msgid "FullWidth" +msgstr "Ajustar ancho" + +#: OutputReport.report:74 OutputReport2.report:77 +msgid "Version 1.0" +msgstr "-" + +#: OutputReport.report:81 OutputReport2.report:84 +msgid "Date" +msgstr "Fecha" + +#: OutputReport.report:96 OutputReport2.report:99 +msgid "Project Title:" +msgstr "" + +#: OutputReport.report:103 OutputReport2.report:106 +msgid "Project No.:" +msgstr "" + +#: OutputReport.report:110 OutputReport2.report:113 +msgid "Company:" +msgstr "" + +#: OutputReport.report:117 OutputReport2.report:120 +msgid "Designer:" +msgstr "" + +#: OutputReport.report:131 OutputReport2.report:134 +msgid "Base Plate ID:" +msgstr "" + +#: OutputReport.report:186 OutputReport2.report:185 +msgid "Bearing Pressue" +msgstr "" + +#: OutputReport.report:196 OutputReport2.report:195 +msgid "Node #" +msgstr "" + +#: OutputReport.report:203 OutputReport2.report:202 +msgid "Brg. Press., psi" +msgstr "" + +#: OutputReport.report:268 OutputReport2.report:266 +msgid "Anchor Rod Tension" +msgstr "" + +#: OutputReport.report:278 OutputReport2.report:276 +msgid "Rod #" +msgstr "" + +#: OutputReport.report:285 OutputReport2.report:283 +msgid "Tension, lbs" +msgstr "" + +#: OutputReport.report:350 OutputReport2.report:353 +msgid "Page $PAGE of $NPAGE" +msgstr "Página $PAGE de $NPAGE" + +#: Report.class:108 +msgid "Section " +msgstr "Sección" + +#: Report1.report:16 +msgid "#3" +msgstr "-" + +#: Report1.report:23 +msgid "#1" +msgstr "-" + +#: Report1.report:33 +msgid "COUCOU" +msgstr "" + +#: Report1.report:62 +msgid "#2" +msgstr "-" + +#: Report10.report:27 Report6.report:16 +msgid "ReportLabel1" +msgstr "" + +#: Report10.report:33 +msgid "ReportLabel2" +msgstr "" + +#: Report10.report:39 +msgid "ReportLabel3" +msgstr "" + +#: Report10.report:69 +msgid "Page $NPAGE" +msgstr "Página $NPAGE" + +#: Report11.report:17 +msgid "C'est la maison !" +msgstr "" + +#: Report4.report:31 +msgid "IMPRESSION DU PLAN COMPTABLE" +msgstr "" + +#: Report4.report:55 +msgid "Code" +msgstr "" + +#: Report4.report:63 +msgid "Intitulé" +msgstr "" + +#: Report4.report:106 +msgid "Page $PAGE sur $NPAGE" +msgstr "Page $PAGE de $NPAGE" + +#: Report7.report:64 rpTestShadowGrid.report:19 +msgid "coucou" +msgstr "" + +#: Report8.report:24 +msgid "List of all my friends" +msgstr "" + +#: Report8.report:34 +msgid "List Of My Friends" +msgstr "" + +#: Report8.report:83 +msgid "Page $PAGE / $NPAGE" +msgstr "Página $PAGE / $NPAGE" + +#: myReport1.report:27 +msgid "First Page" +msgstr "Primera página" + +#: myReport1.report:38 +msgid "Report About" +msgstr "" + +#: myReport1.report:46 +msgid "All my friends" +msgstr "" + +#: myReport1.report:55 +msgid "Friend Table" +msgstr "" + +#: myReport1.report:61 +msgid "Report about all my frends" +msgstr "" + +#: myReport1.report:68 +msgid "Test Database" +msgstr "" + +#: myReport1.report:91 +msgid "Name" +msgstr "Nombre" + +#: myReport1.report:101 +msgid "FirstName" +msgstr "" + +#: myReport1.report:112 +msgid "Birth" +msgstr "" + +#: myReport1.report:153 +msgid "$PAGE/$NPAGE" +msgstr "-" + +#: myReport2.report:40 +msgid "Section 1" +msgstr "" + +#: myReport2.report:51 +msgid "Facture" +msgstr "" + +#: myReport2.report:130 +msgid "Id" +msgstr "-" + +#: myReport2.report:139 +msgid "Designation" +msgstr "" + +#: myReport2.report:147 +msgid "PU HT" +msgstr "" + +#: myReport2.report:156 +msgid "Quantité" +msgstr "Cantidad" + +#: myReport2.report:164 +msgid "Total HT" +msgstr "" + +#: myReport2.report:255 +msgid "Page $PAGE" +msgstr "Página $PAGE" + +#: myReport5.report:41 +msgid "Gambas" +msgstr "-" + +#: myReport5.report:75 +msgid "gambas" +msgstr "-" + +#: myReport5.report:94 +msgid "Page $PAGE on $NPAGE" +msgstr "Página $PAGE de $NPAGE" + diff --git a/comp/src/gb.report/.lang/es_ES.po b/comp/src/gb.report/.lang/es_ES.po new file mode 100644 index 00000000..9c94e56f --- /dev/null +++ b/comp/src/gb.report/.lang/es_ES.po @@ -0,0 +1,436 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.report 3.6.0\n" +"POT-Creation-Date: 2015-09-20 17:55 UTC\n" +"PO-Revision-Date: 2014-10-13 17:30 UTC\n" +"Last-Translator: jesus \n" +"Language: es_ES\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Report designer" +msgstr "Diseñador de reportes" + +#: .project:2 +msgid "Report engine for gambas" +msgstr "-" + +#: FOptions.form:25 +msgid "Size" +msgstr "Tamaño" + +#: FOptions.form:34 +msgid "Paper size" +msgstr "Tamaño de papel" + +#: FOptions.form:41 +msgid "Custom paper size" +msgstr "Tamaño de papel personalizado" + +#: FOptions.form:45 +msgid "Width:" +msgstr "Ancho:" + +#: FOptions.form:51 +msgid "Height:" +msgstr "" + +#: FOptions.form:67 FPreview.form:208 +msgid "Orientation" +msgstr "Orientación" + +#: FOptions.form:72 FPreview.form:214 +msgid "Landscape" +msgstr "Paisaje" + +#: FOptions.form:72 FPreview.form:214 +msgid "Portrait" +msgstr "Retrato" + +#: FPreview.class:313 FPrint.form:192 +msgid "Cancel" +msgstr "Cancelar" + +#: FPreview.class:327 +msgid "Layout..." +msgstr "Disposición..." + +#: FPreview.form:67 +msgid "Report preview" +msgstr "Vista previa de reporte" + +#: FPreview.form:97 +msgid "Printing..." +msgstr "Impresión..." + +#: FPreview.form:117 +msgid "One page" +msgstr "Una página" + +#: FPreview.form:127 +msgid "Two pages" +msgstr "Dos páginas" + +#: FPreview.form:136 +msgid "Full width" +msgstr "Ajustar ancho" + +#: FPreview.form:145 +msgid "Real size" +msgstr "Tamaño real" + +#: FPreview.form:177 +msgid "Printer" +msgstr "Impresora" + +#: FPreview.form:189 +msgid "File" +msgstr "Archivo" + +#: FPreview.form:223 FPrint.form:109 +msgid "Paper" +msgstr "Papel" + +#: FPreview.form:229 +msgid "A3" +msgstr "-" + +#: FPreview.form:229 +msgid "A4" +msgstr "-" + +#: FPreview.form:229 +msgid "A5" +msgstr "-" + +#: FPreview.form:229 +msgid "B5" +msgstr "-" + +#: FPreview.form:229 Form1.form:78 +msgid "Custom" +msgstr "" + +#: FPreview.form:229 +msgid "Executive" +msgstr "-" + +#: FPreview.form:229 +msgid "Legal" +msgstr "-" + +#: FPreview.form:229 +msgid "Letter" +msgstr "-" + +#: FPreview.form:243 FPrint.form:130 +msgid "Width" +msgstr "Ancho" + +#: FPreview.form:253 FPrint.form:148 +msgid "mm" +msgstr "-" + +#: FPreview.form:258 FPrint.form:135 +msgid "Height" +msgstr "Altura" + +#: FPreview.form:287 +msgid "Recto Verso" +msgstr "" + +#: FPreview.form:293 FPrint.form:100 +msgid "Long side" +msgstr "Lado largo" + +#: FPreview.form:293 FPrint.form:100 +msgid "None" +msgstr "Ninguno" + +#: FPreview.form:293 FPrint.form:100 +msgid "Short side" +msgstr "Lado corto" + +#: FPreview.form:308 +msgid "Gray Scale" +msgstr "Escala de grises" + +#: FPreview.form:315 +msgid "Full Page" +msgstr "Página completa" + +#: FPreview.form:321 +msgid "Reverse order" +msgstr "Orden inverso" + +#: FPreview.form:327 +msgid "Collate copies" +msgstr "" + +#: FPreview.form:348 FPrint.form:71 +msgid "Range" +msgstr "Rango" + +#: FPreview.form:362 +msgid "Copies" +msgstr "Copias" + +#: FPreview.form:385 +msgid "Print" +msgstr "Imprimir" + +#: FPrint.form:38 +msgid "Printer Config" +msgstr "Configurar Impresora" + +#: FPrint.form:58 +msgid "More..." +msgstr "Más..." + +#: FPrint.form:89 +msgid "RectoVerso" +msgstr "" + +#: FPrint.form:178 +msgid "Copies :" +msgstr "" + +#: Form1.form:56 +msgid "One Page" +msgstr "Una página" + +#: Form1.form:64 +msgid "Two Page" +msgstr "Dos páginas" + +#: Form1.form:71 +msgid "FullWidth" +msgstr "Ajustar ancho" + +#: OutputReport.report:74 OutputReport2.report:77 +msgid "Version 1.0" +msgstr "-" + +#: OutputReport.report:81 OutputReport2.report:84 +msgid "Date" +msgstr "Fecha" + +#: OutputReport.report:96 OutputReport2.report:99 +msgid "Project Title:" +msgstr "" + +#: OutputReport.report:103 OutputReport2.report:106 +msgid "Project No.:" +msgstr "" + +#: OutputReport.report:110 OutputReport2.report:113 +msgid "Company:" +msgstr "" + +#: OutputReport.report:117 OutputReport2.report:120 +msgid "Designer:" +msgstr "" + +#: OutputReport.report:131 OutputReport2.report:134 +msgid "Base Plate ID:" +msgstr "" + +#: OutputReport.report:186 OutputReport2.report:185 +msgid "Bearing Pressue" +msgstr "" + +#: OutputReport.report:196 OutputReport2.report:195 +msgid "Node #" +msgstr "" + +#: OutputReport.report:203 OutputReport2.report:202 +msgid "Brg. Press., psi" +msgstr "" + +#: OutputReport.report:268 OutputReport2.report:266 +msgid "Anchor Rod Tension" +msgstr "" + +#: OutputReport.report:278 OutputReport2.report:276 +msgid "Rod #" +msgstr "" + +#: OutputReport.report:285 OutputReport2.report:283 +msgid "Tension, lbs" +msgstr "" + +#: OutputReport.report:350 OutputReport2.report:353 +msgid "Page $PAGE of $NPAGE" +msgstr "Página $PAGE de $NPAGE" + +#: Report.class:108 +msgid "Section " +msgstr "Sección" + +#: Report1.report:16 +msgid "#3" +msgstr "-" + +#: Report1.report:23 +msgid "#1" +msgstr "-" + +#: Report1.report:33 +msgid "COUCOU" +msgstr "" + +#: Report1.report:62 +msgid "#2" +msgstr "-" + +#: Report10.report:27 Report6.report:16 +msgid "ReportLabel1" +msgstr "" + +#: Report10.report:33 +msgid "ReportLabel2" +msgstr "" + +#: Report10.report:39 +msgid "ReportLabel3" +msgstr "" + +#: Report10.report:69 +msgid "Page $NPAGE" +msgstr "Página $NPAGE" + +#: Report11.report:17 +msgid "C'est la maison !" +msgstr "" + +#: Report14.report:19 myReport2.report:40 +msgid "Section 1" +msgstr "" + +#: Report14.report:39 myReport5.report:41 +msgid "Gambas" +msgstr "-" + +#: Report14.report:59 +msgid "All friends list !" +msgstr "" + +#: Report14.report:77 +msgid "Gambas Report Demo" +msgstr "" + +#: Report14.report:95 +#, fuzzy +msgid "Page $PAGE on $NPAGE " +msgstr "Página $PAGE de $NPAGE" + +#: Report4.report:31 +msgid "IMPRESSION DU PLAN COMPTABLE" +msgstr "" + +#: Report4.report:55 +msgid "Code" +msgstr "" + +#: Report4.report:63 +msgid "Intitulé" +msgstr "" + +#: Report4.report:106 +msgid "Page $PAGE sur $NPAGE" +msgstr "Page $PAGE de $NPAGE" + +#: Report7.report:64 rpTestShadowGrid.report:19 +msgid "coucou" +msgstr "" + +#: Report8.report:24 +msgid "List of all my friends" +msgstr "" + +#: Report8.report:34 +msgid "List Of My Friends" +msgstr "" + +#: Report8.report:83 +msgid "Page $PAGE / $NPAGE" +msgstr "Página $PAGE / $NPAGE" + +#: myReport1.report:27 +msgid "First Page" +msgstr "Primera página" + +#: myReport1.report:38 +msgid "Report About" +msgstr "" + +#: myReport1.report:46 +msgid "All my friends" +msgstr "" + +#: myReport1.report:55 +msgid "Friend Table" +msgstr "" + +#: myReport1.report:61 +msgid "Report about all my frends" +msgstr "" + +#: myReport1.report:68 +msgid "Test Database" +msgstr "" + +#: myReport1.report:91 +msgid "Name" +msgstr "Nombre" + +#: myReport1.report:101 +msgid "FirstName" +msgstr "" + +#: myReport1.report:112 +msgid "Birth" +msgstr "" + +#: myReport1.report:153 +msgid "$PAGE/$NPAGE" +msgstr "-" + +#: myReport2.report:51 +msgid "Facture" +msgstr "" + +#: myReport2.report:130 +msgid "Id" +msgstr "-" + +#: myReport2.report:139 +msgid "Designation" +msgstr "" + +#: myReport2.report:147 +msgid "PU HT" +msgstr "" + +#: myReport2.report:156 +msgid "Quantité" +msgstr "Cantidad" + +#: myReport2.report:164 +msgid "Total HT" +msgstr "" + +#: myReport2.report:255 +msgid "Page $PAGE" +msgstr "Página $PAGE" + +#: myReport5.report:76 +msgid "gambas" +msgstr "-" + +#: myReport5.report:95 +msgid "Page $PAGE on $NPAGE" +msgstr "Página $PAGE de $NPAGE" diff --git a/comp/src/gb.report/.lang/fr.po b/comp/src/gb.report/.lang/fr.po new file mode 100644 index 00000000..5622e2c2 --- /dev/null +++ b/comp/src/gb.report/.lang/fr.po @@ -0,0 +1,454 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2014-12-16 11:06 UTC\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Report designer" +msgstr "" + +#: .project:2 +msgid "Report engine for gambas" +msgstr "" + +#: FOptions.form:25 +msgid "Size" +msgstr "" + +#: FOptions.form:34 +msgid "Paper size" +msgstr "" + +#: FOptions.form:41 +msgid "Custom paper size" +msgstr "" + +#: FOptions.form:45 +msgid "Width:" +msgstr "" + +#: FOptions.form:51 +msgid "Height:" +msgstr "" + +#: FOptions.form:67 FPreview.form:208 +msgid "Orientation" +msgstr "Orientation" + +#: FOptions.form:72 FPreview.form:214 +msgid "Landscape" +msgstr "Paysage" + +#: FOptions.form:72 FPreview.form:214 +msgid "Portrait" +msgstr "Portrait" + +#: FPreview.class:313 FPrint.form:192 +msgid "Cancel" +msgstr "Annuler" + +#: FPreview.class:327 +msgid "Layout..." +msgstr "Mise en page..." + +#: FPreview.form:67 +msgid "Report preview" +msgstr "Aperçu de l'état" + +#: FPreview.form:97 +msgid "Printing..." +msgstr "Imprimer..." + +#: FPreview.form:117 +msgid "One page" +msgstr "Une page" + +#: FPreview.form:127 +msgid "Two pages" +msgstr "Deux pages" + +#: FPreview.form:136 +msgid "Full width" +msgstr "Pleine largeur" + +#: FPreview.form:145 +msgid "Real size" +msgstr "Taille réelle" + +#: FPreview.form:177 +msgid "Printer" +msgstr "Imprimante" + +#: FPreview.form:189 +msgid "File" +msgstr "Fichier" + +#: FPreview.form:223 FPrint.form:109 +msgid "Paper" +msgstr "Papier" + +#: FPreview.form:229 +msgid "A3" +msgstr "" + +#: FPreview.form:229 +msgid "A4" +msgstr "" + +#: FPreview.form:229 +msgid "A5" +msgstr "" + +#: FPreview.form:229 +msgid "B5" +msgstr "" + +#: FPreview.form:229 Form1.form:78 +msgid "Custom" +msgstr "Personnel" + +#: FPreview.form:229 +msgid "Executive" +msgstr "Executive" + +#: FPreview.form:229 +msgid "Legal" +msgstr "Legal" + +#: FPreview.form:229 +msgid "Letter" +msgstr "Lettre" + +#: FPreview.form:243 FPrint.form:130 +msgid "Width" +msgstr "Largeur" + +#: FPreview.form:253 FPrint.form:148 +msgid "mm" +msgstr "" + +#: FPreview.form:258 FPrint.form:135 +msgid "Height" +msgstr "Hauteur" + +#: FPreview.form:287 +msgid "Recto Verso" +msgstr "" + +#: FPreview.form:293 FPrint.form:100 +msgid "Long side" +msgstr "Coté long" + +#: FPreview.form:293 FPrint.form:100 +msgid "None" +msgstr "Aucun" + +#: FPreview.form:293 FPrint.form:100 +msgid "Short side" +msgstr "Coté court" + +#: FPreview.form:308 +msgid "Gray Scale" +msgstr "Niveaux de gris" + +#: FPreview.form:315 +msgid "Full Page" +msgstr "Pleine page" + +#: FPreview.form:321 +msgid "Reverse order" +msgstr "Inverser" + +#: FPreview.form:327 +msgid "Collate copies" +msgstr "Assembler" + +#: FPreview.form:348 FPrint.form:71 +msgid "Range" +msgstr "Echantillon" + +#: FPreview.form:362 +msgid "Copies" +msgstr "Copies" + +#: FPreview.form:385 +msgid "Print" +msgstr "Imprimer" + +#: FPrint.form:38 +msgid "Printer Config" +msgstr "" + +#: FPrint.form:58 +msgid "More..." +msgstr "" + +#: FPrint.form:89 +msgid "RectoVerso" +msgstr "" + +#: FPrint.form:178 +msgid "Copies :" +msgstr "" + +#: Form1.form:56 +msgid "One Page" +msgstr "" + +#: Form1.form:64 +msgid "Two Page" +msgstr "" + +#: Form1.form:71 +msgid "FullWidth" +msgstr "" + +#: OutputReport.report:74 OutputReport2.report:77 +msgid "Version 1.0" +msgstr "" + +#: OutputReport.report:81 OutputReport2.report:84 +msgid "Date" +msgstr "" + +#: OutputReport.report:96 OutputReport2.report:99 +msgid "Project Title:" +msgstr "" + +#: OutputReport.report:103 OutputReport2.report:106 +msgid "Project No.:" +msgstr "" + +#: OutputReport.report:110 OutputReport2.report:113 +msgid "Company:" +msgstr "" + +#: OutputReport.report:117 OutputReport2.report:120 +msgid "Designer:" +msgstr "" + +#: OutputReport.report:131 OutputReport2.report:134 +msgid "Base Plate ID:" +msgstr "" + +#: OutputReport.report:186 OutputReport2.report:185 +msgid "Bearing Pressue" +msgstr "" + +#: OutputReport.report:196 OutputReport2.report:195 +msgid "Node #" +msgstr "" + +#: OutputReport.report:203 OutputReport2.report:202 +msgid "Brg. Press., psi" +msgstr "" + +#: OutputReport.report:268 OutputReport2.report:266 +msgid "Anchor Rod Tension" +msgstr "" + +#: OutputReport.report:278 OutputReport2.report:276 +msgid "Rod #" +msgstr "" + +#: OutputReport.report:285 OutputReport2.report:283 +msgid "Tension, lbs" +msgstr "" + +#: OutputReport.report:350 OutputReport2.report:353 +msgid "Page $PAGE of $NPAGE" +msgstr "" + +#: Report.class:108 +msgid "Section " +msgstr "" + +#: Report1.report:16 +msgid "#3" +msgstr "" + +#: Report1.report:23 +msgid "#1" +msgstr "" + +#: Report1.report:33 +msgid "COUCOU" +msgstr "" + +#: Report1.report:62 +msgid "#2" +msgstr "" + +#: Report10.report:27 Report6.report:16 +msgid "ReportLabel1" +msgstr "" + +#: Report10.report:33 +msgid "ReportLabel2" +msgstr "" + +#: Report10.report:39 +msgid "ReportLabel3" +msgstr "" + +#: Report10.report:69 +msgid "Page $NPAGE" +msgstr "" + +#: Report11.report:17 +msgid "C'est la maison !" +msgstr "" + +#: Report4.report:31 +msgid "IMPRESSION DU PLAN COMPTABLE" +msgstr "" + +#: Report4.report:55 +msgid "Code" +msgstr "" + +#: Report4.report:63 +msgid "Intitulé" +msgstr "" + +#: Report4.report:106 +msgid "Page $PAGE sur $NPAGE" +msgstr "" + +#: Report7.report:64 rpTestShadowGrid.report:19 +msgid "coucou" +msgstr "" + +#: Report8.report:24 +msgid "List of all my friends" +msgstr "" + +#: Report8.report:34 +msgid "List Of My Friends" +msgstr "" + +#: Report8.report:83 +msgid "Page $PAGE / $NPAGE" +msgstr "" + +#: myReport1.report:27 +msgid "First Page" +msgstr "" + +#: myReport1.report:38 +msgid "Report About" +msgstr "" + +#: myReport1.report:46 +msgid "All my friends" +msgstr "" + +#: myReport1.report:55 +msgid "Friend Table" +msgstr "" + +#: myReport1.report:61 +msgid "Report about all my frends" +msgstr "" + +#: myReport1.report:68 +msgid "Test Database" +msgstr "" + +#: myReport1.report:91 +msgid "Name" +msgstr "" + +#: myReport1.report:101 +msgid "FirstName" +msgstr "" + +#: myReport1.report:112 +msgid "Birth" +msgstr "" + +#: myReport1.report:153 +msgid "$PAGE/$NPAGE" +msgstr "" + +#: myReport2.report:40 +msgid "Section 1" +msgstr "" + +#: myReport2.report:51 +msgid "Facture" +msgstr "" + +#: myReport2.report:130 +msgid "Id" +msgstr "" + +#: myReport2.report:139 +msgid "Designation" +msgstr "" + +#: myReport2.report:147 +msgid "PU HT" +msgstr "" + +#: myReport2.report:156 +msgid "Quantité" +msgstr "" + +#: myReport2.report:164 +msgid "Total HT" +msgstr "" + +#: myReport2.report:255 +msgid "Page $PAGE" +msgstr "" + +#: myReport5.report:41 +msgid "Gambas" +msgstr "" + +#: myReport5.report:75 +msgid "gambas" +msgstr "" + +#: myReport5.report:94 +msgid "Page $PAGE on $NPAGE" +msgstr "" + +#~ msgid "Zoom in" +#~ msgstr "Agrandir" + +#~ msgid "Zoom out" +#~ msgstr "Réduire" + +#~ msgid "Zoom 100%" +#~ msgstr "Zoom 100%" + +#~ msgid "Fit to window" +#~ msgstr "Adapter à la fenêtre" + +#~ msgid "Last page" +#~ msgstr "Dernière page" + +#~ msgid "Next page" +#~ msgstr "Page suivante" + +#~ msgid "Page" +#~ msgstr "Page" + +#~ msgid "Previous page" +#~ msgstr "Page précédente" + +#~ msgid "First page" +#~ msgstr "Première page" + +#~ msgid "Print..." +#~ msgstr "Imprimer..." diff --git a/comp/src/gb.report/.lang/nl.po b/comp/src/gb.report/.lang/nl.po new file mode 100644 index 00000000..6b19f31e --- /dev/null +++ b/comp/src/gb.report/.lang/nl.po @@ -0,0 +1,436 @@ +# Willy Raets < gbWilly@openmailbox.org >, 2014 +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.report 3.10.90\n" +"POT-Creation-Date: 2019-04-06 18:41 UTC\n" +"PO-Revision-Date: 2017-08-26 19:45 UTC\n" +"Last-Translator: Willy Raets \n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Report designer" +msgstr "Rapport ontwerper" + +#: .project:2 +msgid "Report engine for gambas" +msgstr "Rapportage voor Gambas" + +#: FOptions.form:25 +msgid "Size" +msgstr "Afmeting" + +#: FOptions.form:34 +msgid "Paper size" +msgstr "Papierformaat" + +#: FOptions.form:41 +msgid "Custom paper size" +msgstr "Aangepast papierformaat" + +#: FOptions.form:45 +msgid "Width:" +msgstr "Breedte:" + +#: FOptions.form:51 +msgid "Height:" +msgstr "Hoogte:" + +#: FOptions.form:67 FPreview.form:208 +msgid "Orientation" +msgstr "Oriëntatie" + +#: FOptions.form:72 FPreview.form:214 +msgid "Landscape" +msgstr "Landschap" + +#: FOptions.form:72 FPreview.form:214 +msgid "Portrait" +msgstr "Portret" + +#: FPreview.class:313 FPrint.form:192 +msgid "Cancel" +msgstr "Annuleren" + +#: FPreview.class:327 +msgid "Layout..." +msgstr "Lay-out..." + +#: FPreview.form:67 +msgid "Report preview" +msgstr "Rapport voorbeeld" + +#: FPreview.form:97 +msgid "Printing..." +msgstr "-" + +#: FPreview.form:117 +msgid "One page" +msgstr "Een pagina" + +#: FPreview.form:127 +msgid "Two pages" +msgstr "Twee pagina's" + +#: FPreview.form:136 +msgid "Full width" +msgstr "Volledige breedte" + +#: FPreview.form:145 +msgid "Real size" +msgstr "Echte afmeting" + +#: FPreview.form:177 +msgid "Printer" +msgstr "-" + +#: FPreview.form:189 +msgid "File" +msgstr "Bestand" + +#: FPreview.form:223 FPrint.form:109 +msgid "Paper" +msgstr "Papier" + +#: FPreview.form:229 +msgid "A3" +msgstr "-" + +#: FPreview.form:229 +msgid "A4" +msgstr "-" + +#: FPreview.form:229 +msgid "A5" +msgstr "-" + +#: FPreview.form:229 +msgid "B5" +msgstr "-" + +#: FPreview.form:229 Form1.form:78 +msgid "Custom" +msgstr "Aangepast" + +#: FPreview.form:229 +msgid "Executive" +msgstr "-" + +#: FPreview.form:229 +msgid "Legal" +msgstr "-" + +#: FPreview.form:229 +msgid "Letter" +msgstr "-" + +#: FPreview.form:243 FPrint.form:130 +msgid "Width" +msgstr "Breedte" + +#: FPreview.form:253 FPrint.form:148 +msgid "mm" +msgstr "mm" + +#: FPreview.form:258 FPrint.form:135 +msgid "Height" +msgstr "Hoogte" + +#: FPreview.form:287 +msgid "Recto Verso" +msgstr "-" + +#: FPreview.form:293 FPrint.form:100 +msgid "Long side" +msgstr "Lange zijde" + +#: FPreview.form:293 FPrint.form:100 +msgid "None" +msgstr "Geen" + +#: FPreview.form:293 FPrint.form:100 +msgid "Short side" +msgstr "Korte zijde" + +#: FPreview.form:308 +msgid "Gray Scale" +msgstr "Grijs schaal" + +#: FPreview.form:315 +msgid "Full Page" +msgstr "Volledige pagina" + +#: FPreview.form:321 +msgid "Reverse order" +msgstr "Omgekeerde volgorde" + +#: FPreview.form:327 +msgid "Collate copies" +msgstr "Soteer kopiën" + +#: FPreview.form:348 FPrint.form:71 +msgid "Range" +msgstr "Bereik" + +#: FPreview.form:362 +msgid "Copies" +msgstr "Kopiën" + +#: FPreview.form:385 +msgid "Print" +msgstr "-" + +#: FPrint.form:38 +msgid "Printer Config" +msgstr "-" + +#: FPrint.form:58 +msgid "More..." +msgstr "Meer..." + +#: FPrint.form:89 +msgid "RectoVerso" +msgstr "-" + +#: FPrint.form:178 +msgid "Copies :" +msgstr "Kopiën:" + +#: Form1.form:56 +msgid "One Page" +msgstr "Een Pagina" + +#: Form1.form:64 +msgid "Two Page" +msgstr "Twee Pagina's" + +#: Form1.form:71 +msgid "FullWidth" +msgstr "VolledigeBreedte" + +#: OutputReport.report:74 OutputReport2.report:77 +msgid "Version 1.0" +msgstr "-" + +#: OutputReport.report:81 OutputReport2.report:84 +msgid "Date" +msgstr "Datum" + +#: OutputReport.report:96 OutputReport2.report:99 +msgid "Project Title:" +msgstr "-" + +#: OutputReport.report:103 OutputReport2.report:106 +msgid "Project No.:" +msgstr "-" + +#: OutputReport.report:110 OutputReport2.report:113 +msgid "Company:" +msgstr "Bedrijf:" + +#: OutputReport.report:117 OutputReport2.report:120 +msgid "Designer:" +msgstr "Ontwerper:" + +#: OutputReport.report:131 OutputReport2.report:134 +msgid "Base Plate ID:" +msgstr "-" + +#: OutputReport.report:186 OutputReport2.report:185 +msgid "Bearing Pressue" +msgstr "-" + +#: OutputReport.report:196 OutputReport2.report:195 +msgid "Node #" +msgstr "-" + +#: OutputReport.report:203 OutputReport2.report:202 +msgid "Brg. Press., psi" +msgstr "-" + +#: OutputReport.report:268 OutputReport2.report:266 +msgid "Anchor Rod Tension" +msgstr "-" + +#: OutputReport.report:278 OutputReport2.report:276 +msgid "Rod #" +msgstr "-" + +#: OutputReport.report:285 OutputReport2.report:283 +msgid "Tension, lbs" +msgstr "-" + +#: OutputReport.report:350 OutputReport2.report:353 +msgid "Page $PAGE of $NPAGE" +msgstr "Pagina $PAGE van $NPAGE" + +#: Report.class:108 +msgid "Section " +msgstr "Sectie" + +#: Report1.report:16 +msgid "#3" +msgstr "-" + +#: Report1.report:23 +msgid "#1" +msgstr "-" + +#: Report1.report:33 +msgid "COUCOU" +msgstr "-" + +#: Report1.report:62 +msgid "#2" +msgstr "-" + +#: Report10.report:27 Report6.report:16 +msgid "ReportLabel1" +msgstr "-" + +#: Report10.report:33 +msgid "ReportLabel2" +msgstr "-" + +#: Report10.report:39 +msgid "ReportLabel3" +msgstr "-" + +#: Report10.report:69 +msgid "Page $NPAGE" +msgstr "Pagina $NPAGE" + +#: Report11.report:17 +msgid "C'est la maison !" +msgstr "-" + +#: Report14.report:19 myReport2.report:40 +msgid "Section 1" +msgstr "-" + +#: Report14.report:39 myReport5.report:41 +msgid "Gambas" +msgstr "-" + +#: Report14.report:59 +msgid "All friends list !" +msgstr "-" + +#: Report14.report:77 +msgid "Gambas Report Demo" +msgstr "-" + +#: Report14.report:95 +msgid "Page $PAGE on $NPAGE " +msgstr "-" + +#: Report4.report:31 +msgid "IMPRESSION DU PLAN COMPTABLE" +msgstr "-" + +#: Report4.report:55 +msgid "Code" +msgstr "-" + +#: Report4.report:63 +msgid "Intitulé" +msgstr "-" + +#: Report4.report:106 +msgid "Page $PAGE sur $NPAGE" +msgstr "Pagina $PAGE van $NPAGE" + +#: Report7.report:64 rpTestShadowGrid.report:19 +msgid "coucou" +msgstr "-" + +#: Report8.report:24 +msgid "List of all my friends" +msgstr "Lijst van al mijn vrienden" + +#: Report8.report:34 +msgid "List Of My Friends" +msgstr "Lijst Van Mijn Vrienden" + +#: Report8.report:83 +msgid "Page $PAGE / $NPAGE" +msgstr "Pagina $PAGE / $NPAGE" + +#: myReport1.report:27 +msgid "First Page" +msgstr "Eerste Pagina" + +#: myReport1.report:38 +msgid "Report About" +msgstr "Over rapport" + +#: myReport1.report:46 +msgid "All my friends" +msgstr "Al mijn vrienden" + +#: myReport1.report:55 +msgid "Friend Table" +msgstr "Vrienden tabel" + +#: myReport1.report:61 +msgid "Report about all my frends" +msgstr "Rapport over al mijn vrienden" + +#: myReport1.report:68 +msgid "Test Database" +msgstr "-" + +#: myReport1.report:91 +msgid "Name" +msgstr "Naam" + +#: myReport1.report:101 +msgid "FirstName" +msgstr "Voornaam" + +#: myReport1.report:112 +msgid "Birth" +msgstr "Geboorte" + +#: myReport1.report:153 +msgid "$PAGE/$NPAGE" +msgstr "-" + +#: myReport2.report:51 +msgid "Facture" +msgstr "Factuur" + +#: myReport2.report:130 +msgid "Id" +msgstr "-" + +#: myReport2.report:139 +msgid "Designation" +msgstr "Aanwijzing" + +#: myReport2.report:147 +msgid "PU HT" +msgstr "-" + +#: myReport2.report:156 +msgid "Quantité" +msgstr "-" + +#: myReport2.report:164 +msgid "Total HT" +msgstr "Totale HT" + +#: myReport2.report:255 +msgid "Page $PAGE" +msgstr "Pagina $PAGE" + +#: myReport5.report:76 +msgid "gambas" +msgstr "-" + +#: myReport5.report:95 +msgid "Page $PAGE on $NPAGE" +msgstr "Pagina $PAGE op $NPAGE" diff --git a/comp/src/gb.report/.lang/ru.po b/comp/src/gb.report/.lang/ru.po new file mode 100644 index 00000000..4ce9344d --- /dev/null +++ b/comp/src/gb.report/.lang/ru.po @@ -0,0 +1,450 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: comp/src/gb.report/.project:26 +msgid "Report designer" +msgstr "Дизайнер отчётов" + +#: comp/src/gb.report/.project:27 +msgid "Report engine for gambas" +msgstr "Движок отчётов для gambas" + +#: comp/src/gb.report/.src/Report.class:108 comp/src/gb.report/.src/Report.class:435 +msgid "Section " +msgstr "Раздел " + +#: comp/src/gb.report/.src/Tests/OutputReport.report:24 comp/src/gb.report/.src/Tests/OutputReport2.report:26 +msgid "Version 1.0" +msgstr "Версия 1.0" + +#: comp/src/gb.report/.src/Tests/OutputReport.report:31 comp/src/gb.report/.src/Tests/OutputReport2.report:33 +msgid "Date" +msgstr "Дата" + +#: comp/src/gb.report/.src/Tests/OutputReport.report:46 comp/src/gb.report/.src/Tests/OutputReport2.report:48 +msgid "Project Title:" +msgstr "Название проекта:" + +#: comp/src/gb.report/.src/Tests/OutputReport.report:53 comp/src/gb.report/.src/Tests/OutputReport2.report:55 +msgid "Project No.:" +msgstr "№ проекта:" + +#: comp/src/gb.report/.src/Tests/OutputReport.report:60 comp/src/gb.report/.src/Tests/OutputReport2.report:62 +msgid "Company:" +msgstr "Компания:" + +#: comp/src/gb.report/.src/Tests/OutputReport.report:67 comp/src/gb.report/.src/Tests/OutputReport2.report:69 +msgid "Designer:" +msgstr "Дизайнер:" + +#: comp/src/gb.report/.src/Tests/OutputReport.report:81 comp/src/gb.report/.src/Tests/OutputReport2.report:83 +msgid "Base Plate ID:" +msgstr "Идентификатор базовой платы:" + +#: comp/src/gb.report/.src/Tests/OutputReport.report:136 comp/src/gb.report/.src/Tests/OutputReport2.report:134 +msgid "Bearing Pressue" +msgstr "Давление подшипника" + +#: comp/src/gb.report/.src/Tests/OutputReport.report:146 comp/src/gb.report/.src/Tests/OutputReport.report:164 comp/src/gb.report/.src/Tests/OutputReport2.report:144 comp/src/gb.report/.src/Tests/OutputReport2.report:162 +msgid "Node #" +msgstr "Узел #" + +#: comp/src/gb.report/.src/Tests/OutputReport.report:153 comp/src/gb.report/.src/Tests/OutputReport.report:171 comp/src/gb.report/.src/Tests/OutputReport2.report:151 comp/src/gb.report/.src/Tests/OutputReport2.report:169 +msgid "Brg. Press., psi" +msgstr "Давление подшипника, psi" + +#: comp/src/gb.report/.src/Tests/OutputReport.report:218 comp/src/gb.report/.src/Tests/OutputReport2.report:215 +msgid "Anchor Rod Tension" +msgstr "Натяжение анкерного стержня" + +#: comp/src/gb.report/.src/Tests/OutputReport.report:228 comp/src/gb.report/.src/Tests/OutputReport.report:246 comp/src/gb.report/.src/Tests/OutputReport2.report:225 comp/src/gb.report/.src/Tests/OutputReport2.report:243 +msgid "Rod #" +msgstr "Стержень #" + +#: comp/src/gb.report/.src/Tests/OutputReport.report:235 comp/src/gb.report/.src/Tests/OutputReport.report:253 comp/src/gb.report/.src/Tests/OutputReport2.report:232 comp/src/gb.report/.src/Tests/OutputReport2.report:250 +msgid "Tension, lbs" +msgstr "Натяжение, lbs" + +#: comp/src/gb.report/.src/Tests/OutputReport.report:300 comp/src/gb.report/.src/Tests/OutputReport2.report:302 +msgid "Page $PAGE of $NPAGE" +msgstr "Страница $PAGE из $NPAGE" + +#: comp/src/gb.report/.src/Tests/Report11.report:13 +msgid "C'est la maison !" +msgstr "Это дом!" + +#: comp/src/gb.report/.src/Tests/rpTestShadowGrid.report:16 comp/src/gb.report/.src/Tests/Old/Report7.report:55 +msgid "coucou" +msgstr "кукушка" + +#: comp/src/gb.report/.src/Tests/Old/Report1.report:7 +msgid "#3" +msgstr "#3" + +#: comp/src/gb.report/.src/Tests/Old/Report1.report:14 +msgid "#1" +msgstr "#1" + +#: comp/src/gb.report/.src/Tests/Old/Report1.report:24 +msgid "COUCOU" +msgstr "КУКУШКА" + +#: comp/src/gb.report/.src/Tests/Old/Report1.report:53 +msgid "#2" +msgstr "#2" + +#: comp/src/gb.report/.src/Tests/Old/Report10.report:17 comp/src/gb.report/.src/Tests/Old/Report10.report:39 comp/src/gb.report/.src/Tests/Old/Report6.report:13 +msgid "ReportLabel1" +msgstr "Метка_отчёта_1" + +#: comp/src/gb.report/.src/Tests/Old/Report10.report:23 comp/src/gb.report/.src/Tests/Old/Report10.report:45 +msgid "ReportLabel2" +msgstr "Метка_отчёта_2" + +#: comp/src/gb.report/.src/Tests/Old/Report10.report:29 comp/src/gb.report/.src/Tests/Old/Report10.report:51 +msgid "ReportLabel3" +msgstr "Метка_отчёта_3" + +#: comp/src/gb.report/.src/Tests/Old/Report10.report:59 +msgid "Page $NPAGE" +msgstr "Страница $NPAGE" + +#: comp/src/gb.report/.src/Tests/Old/Report14.report:7 comp/src/gb.report/.src/Tests/Old/myReport2.report:8 +msgid "Section 1" +msgstr "Раздел 1" + +#: comp/src/gb.report/.src/Tests/Old/Report14.report:27 comp/src/gb.report/.src/Tests/Old/myReport5.report:30 +msgid "Gambas" +msgstr "Gambas" + +#: comp/src/gb.report/.src/Tests/Old/Report14.report:47 +msgid "All friends list !" +msgstr "Список всех друзей!" + +#: comp/src/gb.report/.src/Tests/Old/Report14.report:65 +msgid "Gambas Report Demo" +msgstr "Демонстрация отчёта Gambas" + +#: comp/src/gb.report/.src/Tests/Old/Report14.report:83 +msgid "Page $PAGE on $NPAGE " +msgstr "Страница $PAGE на $NPAGE " + +#: comp/src/gb.report/.src/Tests/Old/Report4.report:16 +msgid "IMPRESSION DU PLAN COMPTABLE" +msgstr "ПЕЧАТЬ БУХГАЛТЕРСКОГО ПЛАНА" + +#: comp/src/gb.report/.src/Tests/Old/Report4.report:40 +msgid "Code" +msgstr "Код" + +#: comp/src/gb.report/.src/Tests/Old/Report4.report:48 +msgid "Intitulé" +msgstr "Заголовок" + +#: comp/src/gb.report/.src/Tests/Old/Report4.report:91 +msgid "Page $PAGE sur $NPAGE" +msgstr "Страница $PAGE на $NPAGE" + +#: comp/src/gb.report/.src/Tests/Old/Report8.report:15 +msgid "List of all my friends" +msgstr "Список всех моих друзей" + +#: comp/src/gb.report/.src/Tests/Old/Report8.report:25 +msgid "List Of My Friends" +msgstr "Список моих друзей" + +#: comp/src/gb.report/.src/Tests/Old/Report8.report:74 +msgid "Page $PAGE / $NPAGE" +msgstr "Страница $PAGE / $NPAGE" + +#: comp/src/gb.report/.src/Tests/Old/myReport1.report:9 +msgid "First Page" +msgstr "Первая страница" + +#: comp/src/gb.report/.src/Tests/Old/myReport1.report:20 +msgid "Report About" +msgstr "Отчёт о" + +#: comp/src/gb.report/.src/Tests/Old/myReport1.report:28 +msgid "All my friends" +msgstr "Все мои друзья" + +#: comp/src/gb.report/.src/Tests/Old/myReport1.report:37 +msgid "Friend Table" +msgstr "Таблица друзей" + +#: comp/src/gb.report/.src/Tests/Old/myReport1.report:43 +msgid "Report about all my frends" +msgstr "Отчёт обо всех моих друзьях" + +#: comp/src/gb.report/.src/Tests/Old/myReport1.report:50 +msgid "Test Database" +msgstr "Тестовая база данных" + +#: comp/src/gb.report/.src/Tests/Old/myReport1.report:73 +msgid "Name" +msgstr "Имя" + +#: comp/src/gb.report/.src/Tests/Old/myReport1.report:83 +msgid "FirstName" +msgstr "Первое имя" + +#: comp/src/gb.report/.src/Tests/Old/myReport1.report:94 +msgid "Birth" +msgstr "Дата рождения" + +#: comp/src/gb.report/.src/Tests/Old/myReport1.report:135 +msgid "$PAGE/$NPAGE" +msgstr "$PAGE/$NPAGE" + +#: comp/src/gb.report/.src/Tests/Old/myReport2.report:19 +msgid "Facture" +msgstr "Фактура" + +#: comp/src/gb.report/.src/Tests/Old/myReport2.report:98 +msgid "Id" +msgstr "Идентификатор" + +#: comp/src/gb.report/.src/Tests/Old/myReport2.report:107 +msgid "Designation" +msgstr "Десигнация" + +#: comp/src/gb.report/.src/Tests/Old/myReport2.report:115 +msgid "PU HT" +msgstr "PU HT" + +#: comp/src/gb.report/.src/Tests/Old/myReport2.report:124 +msgid "Quantité" +msgstr "Количество" + +#: comp/src/gb.report/.src/Tests/Old/myReport2.report:132 +msgid "Total HT" +msgstr "Всего HT" + +#: comp/src/gb.report/.src/Tests/Old/myReport2.report:223 +msgid "Page $PAGE" +msgstr "Страница $PAGE" + +#: comp/src/gb.report/.src/Tests/Old/myReport5.report:65 +msgid "gambas" +msgstr "gambas" + +#: comp/src/gb.report/.src/Tests/Old/myReport5.report:84 +msgid "Page $PAGE on $NPAGE" +msgstr "Страница $PAGE на $NPAGE" + +#: comp/src/gb.report/.src/Preview/FOptions.form:10 +msgid "Size" +msgstr "Размер" + +#: comp/src/gb.report/.src/Preview/FOptions.form:17 +msgid "Paper size" +msgstr "Размер бумаги" + +#: comp/src/gb.report/.src/Preview/FOptions.form:23 +msgid "Custom paper size" +msgstr "Пользовательский размер бумаги" + +#: comp/src/gb.report/.src/Preview/FOptions.form:26 +msgid "Width:" +msgstr "Ширина:" + +#: comp/src/gb.report/.src/Preview/FOptions.form:31 +msgid "Height:" +msgstr "Высота:" + +#: comp/src/gb.report/.src/Preview/FOptions.form:44 comp/src/gb.report/.src/Preview/FPreview.form:122 +msgid "Orientation" +msgstr "Ориентация" + +#: comp/src/gb.report/.src/Preview/FOptions.form:48 comp/src/gb.report/.src/Preview/FPreview.form:127 +msgid "Portrait" +msgstr "Книжная" + +#: comp/src/gb.report/.src/Preview/FOptions.form:48 comp/src/gb.report/.src/Preview/FPreview.form:127 +msgid "Landscape" +msgstr "Альбомная" + +#: comp/src/gb.report/.src/Preview/FPreview.class:313 comp/src/gb.report/.src/Preview/FPrint.form:128 +msgid "Cancel" +msgstr "Отмена" + +#: comp/src/gb.report/.src/Preview/FPreview.class:327 +msgid "Layout..." +msgstr "Макет..." + +#: comp/src/gb.report/.src/Preview/FPreview.class:339 comp/src/gb.report/.src/Preview/FPreview.form:29 +msgid "Printing..." +msgstr "Печать..." + +#: comp/src/gb.report/.src/Preview/FPreview.class:363 comp/src/gb.report/.src/Preview/FPreview.form:264 +msgid "Print" +msgstr "Печать" + +#: comp/src/gb.report/.src/Preview/FPreview.form:5 +msgid "Report preview" +msgstr "Предпросмотр отчёта" + +#: comp/src/gb.report/.src/Preview/FPreview.form:45 +msgid "One page" +msgstr "Одна страница" + +#: comp/src/gb.report/.src/Preview/FPreview.form:54 +msgid "Two pages" +msgstr "Две страницы" + +#: comp/src/gb.report/.src/Preview/FPreview.form:62 +msgid "Full width" +msgstr "Полная ширина" + +#: comp/src/gb.report/.src/Preview/FPreview.form:70 +msgid "Real size" +msgstr "Реальный размер" + +#: comp/src/gb.report/.src/Preview/FPreview.form:97 +msgid "Printer" +msgstr "Принтер" + +#: comp/src/gb.report/.src/Preview/FPreview.form:107 +msgid "File" +msgstr "Файл" + +#: comp/src/gb.report/.src/Preview/FPreview.form:134 comp/src/gb.report/.src/Preview/FPrint.form:62 +msgid "Paper" +msgstr "Бумага" + +#: comp/src/gb.report/.src/Preview/FPreview.form:139 comp/src/gb.report/.src/Preview/Form1.form:56 +msgid "Custom" +msgstr "Пользовательский" + +#: comp/src/gb.report/.src/Preview/FPreview.form:139 +msgid "A3" +msgstr "А3" + +#: comp/src/gb.report/.src/Preview/FPreview.form:139 +msgid "A4" +msgstr "A4" + +#: comp/src/gb.report/.src/Preview/FPreview.form:139 +msgid "A5" +msgstr "А5" + +#: comp/src/gb.report/.src/Preview/FPreview.form:139 +msgid "B5" +msgstr "B5" + +#: comp/src/gb.report/.src/Preview/FPreview.form:139 +msgid "Letter" +msgstr "Лист" + +#: comp/src/gb.report/.src/Preview/FPreview.form:139 +msgid "Executive" +msgstr "Экзекьютив" + +#: comp/src/gb.report/.src/Preview/FPreview.form:139 +msgid "Legal" +msgstr "Легал" + +#: comp/src/gb.report/.src/Preview/FPreview.form:150 comp/src/gb.report/.src/Preview/FPrint.form:79 +msgid "Width" +msgstr "Ширина" + +#: comp/src/gb.report/.src/Preview/FPreview.form:158 comp/src/gb.report/.src/Preview/FPreview.form:170 comp/src/gb.report/.src/Preview/FPrint.form:93 comp/src/gb.report/.src/Preview/FPrint.form:97 +msgid "mm" +msgstr "мм" + +#: comp/src/gb.report/.src/Preview/FPreview.form:162 comp/src/gb.report/.src/Preview/FPrint.form:83 +msgid "Height" +msgstr "Высота" + +#: comp/src/gb.report/.src/Preview/FPreview.form:185 +msgid "Recto Verso" +msgstr "Перед. сторона" + +#: comp/src/gb.report/.src/Preview/FPreview.form:190 comp/src/gb.report/.src/Preview/FPrint.form:55 comp/src/gb.report/.src/Preview/FPrint.form:71 +msgid "None" +msgstr "Нет" + +#: comp/src/gb.report/.src/Preview/FPreview.form:190 comp/src/gb.report/.src/Preview/FPrint.form:55 comp/src/gb.report/.src/Preview/FPrint.form:71 +msgid "Short side" +msgstr "Короткая сторона" + +#: comp/src/gb.report/.src/Preview/FPreview.form:190 comp/src/gb.report/.src/Preview/FPrint.form:55 comp/src/gb.report/.src/Preview/FPrint.form:71 +msgid "Long side" +msgstr "Длинная сторона" + +#: comp/src/gb.report/.src/Preview/FPreview.form:202 +msgid "Gray Scale" +msgstr "Серая шкала" + +#: comp/src/gb.report/.src/Preview/FPreview.form:208 +msgid "Full Page" +msgstr "Полная страница" + +#: comp/src/gb.report/.src/Preview/FPreview.form:213 +msgid "Reverse order" +msgstr "Обратный порядок" + +#: comp/src/gb.report/.src/Preview/FPreview.form:218 +msgid "Collate copies" +msgstr "Собрать по копиям" + +#: comp/src/gb.report/.src/Preview/FPreview.form:235 comp/src/gb.report/.src/Preview/FPrint.form:32 +msgid "Range" +msgstr "Диапазон" + +#: comp/src/gb.report/.src/Preview/FPreview.form:246 +msgid "Copies" +msgstr "Копии" + +#: comp/src/gb.report/.src/Preview/FPrint.form:5 +msgid "Printer Config" +msgstr "Конфигурация принтера" + +#: comp/src/gb.report/.src/Preview/FPrint.form:22 +msgid "More..." +msgstr "Дополнительно..." + +#: comp/src/gb.report/.src/Preview/FPrint.form:46 +msgid "RectoVerso" +msgstr "Передняя сторона" + +#: comp/src/gb.report/.src/Preview/FPrint.form:117 +msgid "Copies :" +msgstr "Копии :" + +#: comp/src/gb.report/.src/Preview/Form1.form:37 +msgid "One Page" +msgstr "Одна страница" + +#: comp/src/gb.report/.src/Preview/Form1.form:44 +msgid "Two Page" +msgstr "Две страницы" + +#: comp/src/gb.report/.src/Preview/Form1.form:50 +msgid "FullWidth" +msgstr "Полная ширина" + diff --git a/comp/src/gb.report/.lang/zh.po b/comp/src/gb.report/.lang/zh.po new file mode 100644 index 00000000..2aa20410 --- /dev/null +++ b/comp/src/gb.report/.lang/zh.po @@ -0,0 +1,423 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.report 3.6.90\n" +"PO-Revision-Date: 2014-12-16 11:07 UTC\n" +"Last-Translator: Benoît Minisini \n" +"Language: zh\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Report designer" +msgstr "报表设计器" + +#: .project:2 +msgid "Report engine for gambas" +msgstr "Gambas报表引擎" + +#: FOptions.form:25 +msgid "Size" +msgstr "尺寸" + +#: FOptions.form:34 +msgid "Paper size" +msgstr "纸张尺寸" + +#: FOptions.form:41 +msgid "Custom paper size" +msgstr "自定义纸张大小" + +#: FOptions.form:45 +msgid "Width:" +msgstr "宽度:" + +#: FOptions.form:51 +msgid "Height:" +msgstr "高度:" + +#: FOptions.form:67 FPreview.form:208 +msgid "Orientation" +msgstr "纸张方向" + +#: FOptions.form:72 FPreview.form:214 +msgid "Landscape" +msgstr "横向" + +#: FOptions.form:72 FPreview.form:214 +msgid "Portrait" +msgstr "纵向" + +#: FPreview.class:313 FPrint.form:192 +msgid "Cancel" +msgstr "取消" + +#: FPreview.class:327 +msgid "Layout..." +msgstr "布局..." + +#: FPreview.form:67 +msgid "Report preview" +msgstr "预览报表" + +#: FPreview.form:97 +msgid "Printing..." +msgstr "打印中..." + +#: FPreview.form:117 +msgid "One page" +msgstr "一页" + +#: FPreview.form:127 +msgid "Two pages" +msgstr "两页" + +#: FPreview.form:136 +msgid "Full width" +msgstr "全宽" + +#: FPreview.form:145 +msgid "Real size" +msgstr "实际尺寸" + +#: FPreview.form:177 +msgid "Printer" +msgstr "打印机" + +#: FPreview.form:189 +msgid "File" +msgstr "文件" + +#: FPreview.form:223 FPrint.form:109 +msgid "Paper" +msgstr "纸张" + +#: FPreview.form:229 +msgid "A3" +msgstr "-" + +#: FPreview.form:229 +msgid "A4" +msgstr "-" + +#: FPreview.form:229 +msgid "A5" +msgstr "-" + +#: FPreview.form:229 +msgid "B5" +msgstr "-" + +#: FPreview.form:229 Form1.form:78 +msgid "Custom" +msgstr "自定义" + +#: FPreview.form:229 +msgid "Executive" +msgstr "行政" + +#: FPreview.form:229 +msgid "Legal" +msgstr "法律" + +#: FPreview.form:229 +msgid "Letter" +msgstr "信函" + +#: FPreview.form:243 FPrint.form:130 +msgid "Width" +msgstr "宽度" + +#: FPreview.form:253 FPrint.form:148 +msgid "mm" +msgstr "毫米" + +#: FPreview.form:258 FPrint.form:135 +msgid "Height" +msgstr "高度" + +#: FPreview.form:287 +msgid "Recto Verso" +msgstr "双面" + +#: FPreview.form:293 FPrint.form:100 +msgid "Long side" +msgstr "长边" + +#: FPreview.form:293 FPrint.form:100 +msgid "None" +msgstr "无" + +#: FPreview.form:293 FPrint.form:100 +msgid "Short side" +msgstr "短边" + +#: FPreview.form:308 +msgid "Gray Scale" +msgstr "灰度" + +#: FPreview.form:315 +msgid "Full Page" +msgstr "整页" + +#: FPreview.form:321 +msgid "Reverse order" +msgstr "逆序" + +#: FPreview.form:327 +msgid "Collate copies" +msgstr "校对稿" + +#: FPreview.form:348 FPrint.form:71 +msgid "Range" +msgstr "范围" + +#: FPreview.form:362 +msgid "Copies" +msgstr "份数" + +#: FPreview.form:385 +msgid "Print" +msgstr "打印" + +#: FPrint.form:38 +msgid "Printer Config" +msgstr "打印机设置" + +#: FPrint.form:58 +msgid "More..." +msgstr "更多..." + +#: FPrint.form:89 +msgid "RectoVerso" +msgstr "双面" + +#: FPrint.form:178 +msgid "Copies :" +msgstr "份数:" + +#: Form1.form:56 +msgid "One Page" +msgstr "一页" + +#: Form1.form:64 +msgid "Two Page" +msgstr "两页" + +#: Form1.form:71 +msgid "FullWidth" +msgstr "全宽" + +#: OutputReport.report:74 OutputReport2.report:77 +msgid "Version 1.0" +msgstr "版本1.0" + +#: OutputReport.report:81 OutputReport2.report:84 +msgid "Date" +msgstr "日期" + +#: OutputReport.report:96 OutputReport2.report:99 +msgid "Project Title:" +msgstr "项目标题:" + +#: OutputReport.report:103 OutputReport2.report:106 +msgid "Project No.:" +msgstr "项目编号:" + +#: OutputReport.report:110 OutputReport2.report:113 +msgid "Company:" +msgstr "公司:" + +#: OutputReport.report:117 OutputReport2.report:120 +msgid "Designer:" +msgstr "设计者:" + +#: OutputReport.report:131 OutputReport2.report:134 +msgid "Base Plate ID:" +msgstr "-" + +#: OutputReport.report:186 OutputReport2.report:185 +msgid "Bearing Pressue" +msgstr "-" + +#: OutputReport.report:196 OutputReport2.report:195 +msgid "Node #" +msgstr "-" + +#: OutputReport.report:203 OutputReport2.report:202 +msgid "Brg. Press., psi" +msgstr "-" + +#: OutputReport.report:268 OutputReport2.report:266 +msgid "Anchor Rod Tension" +msgstr "-" + +#: OutputReport.report:278 OutputReport2.report:276 +msgid "Rod #" +msgstr "-" + +#: OutputReport.report:285 OutputReport2.report:283 +msgid "Tension, lbs" +msgstr "-" + +#: OutputReport.report:350 OutputReport2.report:353 +msgid "Page $PAGE of $NPAGE" +msgstr "-" + +#: Report.class:108 +msgid "Section " +msgstr "节" + +#: Report1.report:16 +msgid "#3" +msgstr "-" + +#: Report1.report:23 +msgid "#1" +msgstr "-" + +#: Report1.report:33 +msgid "COUCOU" +msgstr "-" + +#: Report1.report:62 +msgid "#2" +msgstr "-" + +#: Report10.report:27 Report6.report:16 +msgid "ReportLabel1" +msgstr "-" + +#: Report10.report:33 +msgid "ReportLabel2" +msgstr "-" + +#: Report10.report:39 +msgid "ReportLabel3" +msgstr "-" + +#: Report10.report:69 +msgid "Page $NPAGE" +msgstr "-" + +#: Report11.report:17 +msgid "C'est la maison !" +msgstr "-" + +#: Report4.report:31 +msgid "IMPRESSION DU PLAN COMPTABLE" +msgstr "印刷计划" + +#: Report4.report:55 +msgid "Code" +msgstr "-" + +#: Report4.report:63 +msgid "Intitulé" +msgstr "-" + +#: Report4.report:106 +msgid "Page $PAGE sur $NPAGE" +msgstr "-" + +#: Report7.report:64 rpTestShadowGrid.report:19 +msgid "coucou" +msgstr "-" + +#: Report8.report:24 +msgid "List of all my friends" +msgstr "-" + +#: Report8.report:34 +msgid "List Of My Friends" +msgstr "-" + +#: Report8.report:83 +msgid "Page $PAGE / $NPAGE" +msgstr "-" + +#: myReport1.report:27 +msgid "First Page" +msgstr "-" + +#: myReport1.report:38 +msgid "Report About" +msgstr "-" + +#: myReport1.report:46 +msgid "All my friends" +msgstr "-" + +#: myReport1.report:55 +msgid "Friend Table" +msgstr "-" + +#: myReport1.report:61 +msgid "Report about all my frends" +msgstr "-" + +#: myReport1.report:68 +msgid "Test Database" +msgstr "-" + +#: myReport1.report:91 +msgid "Name" +msgstr "-" + +#: myReport1.report:101 +msgid "FirstName" +msgstr "-" + +#: myReport1.report:112 +msgid "Birth" +msgstr "-" + +#: myReport1.report:153 +msgid "$PAGE/$NPAGE" +msgstr "-" + +#: myReport2.report:40 +msgid "Section 1" +msgstr "-" + +#: myReport2.report:51 +msgid "Facture" +msgstr "-" + +#: myReport2.report:130 +msgid "Id" +msgstr "-" + +#: myReport2.report:139 +msgid "Designation" +msgstr "-" + +#: myReport2.report:147 +msgid "PU HT" +msgstr "-" + +#: myReport2.report:156 +msgid "Quantité" +msgstr "-" + +#: myReport2.report:164 +msgid "Total HT" +msgstr "-" + +#: myReport2.report:255 +msgid "Page $PAGE" +msgstr "-" + +#: myReport5.report:41 +msgid "Gambas" +msgstr "-" + +#: myReport5.report:75 +msgid "gambas" +msgstr "-" + +#: myReport5.report:94 +msgid "Page $PAGE on $NPAGE" +msgstr "-" + diff --git a/comp/src/gb.report/.project b/comp/src/gb.report/.project new file mode 100644 index 00000000..f007381f --- /dev/null +++ b/comp/src/gb.report/.project @@ -0,0 +1,25 @@ +# Gambas Project File 3.0 +Title=Report designer +Startup=Test +Icon=printer1.png +Version=3.12.90 +VersionFile=1 +Component=gb.image +Component=gb.gui +Component=gb.form +Component=gb.db +Component=gb.settings +Component=gb.net +Component=gb.net.curl +Component=gb.report +Description="Report engine for gambas" +Authors="Fabien Bodard" +TabSize=2 +Translate=1 +Language=fr +Type=Component +Maintainer=benoit +Vendor=Princeton +Address=benoit@localhost +License=General Public Licence +Packager=1 diff --git a/comp/src/gb.report/.src/Borders/ReportBorder.class b/comp/src/gb.report/.src/Borders/ReportBorder.class new file mode 100644 index 00000000..a839380b --- /dev/null +++ b/comp/src/gb.report/.src/Borders/ReportBorder.class @@ -0,0 +1,209 @@ +' Gambas class file + +Export + +Static Public Const None As Integer = 0 +Static Public Const Solid As Integer = 1 +Static Private $aShadowStyle As String[] = ["none", "solid", "gradiant"] +'Static Private $aAlign As String[] = Classes["Align"].Symbols +Private hTop As New _ReportBorderSide +Private hBottom As New _ReportBorderSide +Private hLeft As New _ReportBorderSide +Private hRight As New _ReportBorderSide +Private hRCorner As New _ReportRoundCorner + + +Public _Left As Float +Public _Right As Float +Public _Top As Float +Public _Bottom As Float + +Property Read Top As _ReportBorderSide + +Property Read {Left} As _ReportBorderSide + +Property Read bottom As _ReportBorderSide + +Property Read {Right} As _ReportBorderSide + +Property Read RoundCorner As _ReportRoundCorner + +Property Width As String +Property Brush As ReportBrush + +Public Style As Integer + + +' Static Private Sub ResetBorder(hReportBorder As ReportBorder) As Boolean +' +' With hReportBorder +' .Bottom = False +' .Top = False +' .Left = False +' .Right = False +' End With +' +' Return True +' +' End + +Static Public Function _get(sValue As String) As ReportBorder + + Dim hReportBorder As New ReportBorder + + Dim sBorder As String + Dim aScan As String[] + + If Not sValue Then Return hReportBorder + hReportBorder.Style = ReportBorder.Solid + hReportBorder.RoundCorner._Active = False + For Each sBorder In Split(sValue, ";") + + aScan = Scan(sBorder, "*:*") + Select Case LCase(Trim(aScan[0])) + Case "border" + FillObject(hReportBorder, aScan[1]) + Case "left" + FillObject(hReportBorder.Left, aScan[1]) + Case "right" + FillObject(hReportBorder.Right, aScan[1]) + Case "bottom" + FillObject(hReportBorder.bottom, aScan[1]) + Case "top" + FillObject(hReportBorder.Top, aScan[1]) + Case "topleftcorner" + hReportBorder.RoundCorner.TopLeft = aScan[1] + Case "toprightcorner" + hReportBorder.RoundCorner.TopRight = aScan[1] + Case "bottomleftcorner" + hReportBorder.RoundCorner.BottomLeft = aScan[1] + Case "bottomrightcorner" + hReportBorder.RoundCorner.BottomRight = aScan[1] + + + + End Select + + Next + +Finally + Return hReportBorder + +End + +Static Private Sub FillObject(hObj As Object, sValue As String) + + Dim sBrush As String + + For Each sBrush In Split(sValue, " ") + + If IsDigit(Left(sBrush)) Then + Try hObj.Width = sBrush + Else + Try hObj.Brush = ReportBrush[sBrush] + If hObj.Brush = Null Then hObj.Brush = ReportBrush["&H0"] + Endif + Next + +End + + + +Public Function ToString() As String + + Dim aValue As New String[] + + If Me.Style = ReportBorder.None Then Return 'aValue.Add("None") + 'If Me.Style = ReportBorder.Solid Then aValue.Add("Solid") + aValue.Add(Me.Width) + If Me.Top Then aValue.Add("Top") + If Me.Bottom Then aValue.Add("Bottom") + If Me.Left Then aValue.Add("Left") + If Me.Right Then aValue.Add("Right") + aValue.Add("#" & Hex(Me.Color, 6)) + Return aValue.Join() + +End + +Private Function Top_Read() As _ReportBorderSide + + Return hTop + +End + +Private Function Left_Read() As _ReportBorderSide + + Return hLeft + +End + +Private Function bottom_Read() As _ReportBorderSide + + Return hBottom + +End + +Private Function Width_Read() As String + + Return hLeft.Width + +End + +Private Sub Width_Write(Value As String) + + hLeft.Width = Value + hTop.Width = Value + hBottom.Width = Value + hRight.Width = Value + +End + +Private Function Brush_Read() As ReportBrush + + Return hLeft.Brush + +End + +Private Sub Brush_Write(Value As ReportBrush) + + hLeft.Brush = Value + hTop.Brush = Value + hBottom.Brush = Value + hRight.Brush = Value + +End + +Private Function Right_Read() As _ReportBorderSide + + Return hRight + +End + +Private Function RoundCorner_Read() As _ReportRoundCorner + + Return hRCorner + +End + + + +Public Sub _SetUnifiedValues() + + Dim hSizeParse As TSizeParse + + hSizeParse = New TSizeParse(hLeft.Width) + _Left = hSizeParse.GetValue() + hSizeParse = New TSizeParse(hRight.Width) + _Right = hSizeParse.GetValue() + hSizeParse = New TSizeParse(hTop.Width) + _Top = hSizeParse.GetValue() + hSizeParse = New TSizeParse(hBottom.Width) + _Bottom = hSizeParse.GetValue() + + hRCorner._SetUnifiedValues() + + + +End + + diff --git a/comp/src/gb.report/.src/Borders/_ReportBorderSide.class b/comp/src/gb.report/.src/Borders/_ReportBorderSide.class new file mode 100644 index 00000000..968e7c3c --- /dev/null +++ b/comp/src/gb.report/.src/Borders/_ReportBorderSide.class @@ -0,0 +1,16 @@ +' Gambas class file + +Export +Public Width As String +Public Brush As New ReportBrush +Public Round1 As String +Public Round2 As String +Public _Width As Float + +Public Sub _SetUnifiedValues() + Dim hSizeParse As New TSizeParse(Width) + + _Width = hSizeParse.GetValue() + + +End diff --git a/comp/src/gb.report/.src/Borders/_ReportRoundCorner.class b/comp/src/gb.report/.src/Borders/_ReportRoundCorner.class new file mode 100644 index 00000000..2cd2b0fe --- /dev/null +++ b/comp/src/gb.report/.src/Borders/_ReportRoundCorner.class @@ -0,0 +1,136 @@ +' Gambas class file + +Public _Active As Boolean = False +Private $sTopLeft As String = "0cm" +Private $sTopRight As String = "0cm" +Private $sBottomLeft As String = "0cm" +Private $sBottomRight As String = "0cm" + +Property TopLeft As String +Property TopRight As String +Property BottomLeft As String +Property BottomRight As String + +Public _TopLeft1 As Float +Public _TopLeft2 As Float +Public _TopRight1 As Float +Public _TopRight2 As Float +Public _BottomLeft1 As Float +Public _BottomLeft2 As Float +Public _BottomRight1 As Float +Public _BottomRight2 As Float + +Private Function TopLeft_Read() As String + + Return $sTopLeft + +End + +Private Sub TopLeft_Write(Value As String) + + $sTopLeft = Value + _Active = True + +End + +Private Function TopRight_Read() As String + + Return $sTopRight + +End + +Private Sub TopRight_Write(Value As String) + + $sTopRight = Value + _Active = True + +End + +Private Function BottomLeft_Read() As String + + Return $sBottomLeft + +End + +Private Sub BottomLeft_Write(Value As String) + + $sBottomLeft = Value + _Active = True + +End + +Private Function BottomRight_Read() As String + + Return $sBottomRight + +End + +Private Sub BottomRight_Write(Value As String) + + $sBottomRight = Value + _Active = True + +End + +Public Sub _SetUnifiedValues() + + Dim aEl As String[] + + Dim hSizeParse As TSizeParse + + + ael = Split($sTopLeft, " ") + If ael.Count = 1 Then + hSizeParse = New TSizeParse(ael[0]) + _TopLeft1 = hSizeParse.GetValue() + _TopLeft2 = _TopLeft1 + Else + If ael.Count = 2 Then + hSizeParse = New TSizeParse(ael[0]) + _TopLeft1 = hSizeParse.GetValue() + hSizeParse = New TSizeParse(ael[1]) + _TopLeft2 = hSizeParse.GetValue() + Endif + Endif + + ael = Split($sTopRight, " ") + If ael.Count = 1 Then + hSizeParse = New TSizeParse(ael[0]) + _TopRight1 = hSizeParse.GetValue() + _TopRight2 = _TopRight1 + Else + If ael.Count = 2 Then + hSizeParse = New TSizeParse(ael[0]) + _TopRight1 = hSizeParse.GetValue() + hSizeParse = New TSizeParse(ael[1]) + _TopRight2 = hSizeParse.GetValue() + Endif + Endif + ael = Split($sBottomRight, " ") + If ael.Count = 1 Then + hSizeParse = New TSizeParse(ael[0]) + _BottomRight1 = hSizeParse.GetValue() + _BottomRight2 = _BottomRight1 + Else + If ael.Count = 2 Then + hSizeParse = New TSizeParse(ael[0]) + _BottomRight1 = hSizeParse.GetValue() + hSizeParse = New TSizeParse(ael[1]) + _BottomRight2 = hSizeParse.GetValue() + Endif + Endif + ael = Split($sBottomLeft, " ") + If ael.Count = 1 Then + hSizeParse = New TSizeParse(ael[0]) + _BottomLeft1 = hSizeParse.GetValue() + _BottomLeft2 = _BottomLeft1 + Else + If ael.Count = 2 Then + hSizeParse = New TSizeParse(ael[0]) + _BottomLeft1 = hSizeParse.GetValue() + hSizeParse = New TSizeParse(ael[1]) + _BottomLeft2 = hSizeParse.GetValue() + Endif + Endif + +End diff --git a/comp/src/gb.report/.src/BoxShadow/FReportBoxEditor.class b/comp/src/gb.report/.src/BoxShadow/FReportBoxEditor.class new file mode 100644 index 00000000..4d8ed076 --- /dev/null +++ b/comp/src/gb.report/.src/BoxShadow/FReportBoxEditor.class @@ -0,0 +1,26 @@ +' Gambas class file + +Private hBorder As New ReportBorder +Public Sub Form_Open() + + + +End + +Public Sub DrawingArea1_Draw() + + Dim X, Y, Width, Height As Float + + X = Paint.Width / 3 / 2 + Y = Paint.Height / 3 / 2 + Width = Paint.Width / 3 * 2 + Height = Paint.Height / 3 * 2 + + 'Paint.FillRect(0, 0, Paint.Width, Paint.Height, Color.White) + + + Paint.Rectangle(X, Y, Width, Height) + Paint.Stroke + + +End diff --git a/comp/src/gb.report/.src/BoxShadow/FReportBoxEditor.form b/comp/src/gb.report/.src/BoxShadow/FReportBoxEditor.form new file mode 100644 index 00000000..89e4d028 --- /dev/null +++ b/comp/src/gb.report/.src/BoxShadow/FReportBoxEditor.form @@ -0,0 +1,11 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,78,57) + Arrangement = Arrange.Vertical + { DrawingArea1 DrawingArea + MoveScaled(4,5,67,44) + Background = &HFFFFFF& + Expand = True + } +} diff --git a/comp/src/gb.report/.src/BoxShadow/ReportBoxShadow.class b/comp/src/gb.report/.src/BoxShadow/ReportBoxShadow.class new file mode 100644 index 00000000..b8f3e6b9 --- /dev/null +++ b/comp/src/gb.report/.src/BoxShadow/ReportBoxShadow.class @@ -0,0 +1,222 @@ +' Gambas class file + +Private $aBoxShadow As New _ReportBoxShadow[] + +Property XOffset As String +Property YOffset As String +Property Blur As String +Property Spread As String +Property Inset As Boolean +Property Color As Integer +Property Read Count As Integer +Property Read Max As Integer + + +Property Read _XOffset As Float +Property Read _YOffset As Float +Property Read _Blur As Float +Property Read _Spread As Float +Property Read _Active As Boolean + + +Public Sub _new() + + Dim hBoxShadow As New _ReportBoxShadow + $aBoxShadow.Add(hBoxShadow) + +End + +Static Public Function _get(sValue As String) As ReportBoxShadow + + Dim hBoxShadow As New ReportBoxShadow + Dim s As String + Dim i As Integer + For Each s In Split(sValue, " ") + If IsDigit(Left(s)) Then + + Select Case i + Case 0 + hBoxShadow.XOffset = s + Case 1 + hBoxShadow.YOffset = s + Case 2 + hBoxShadow.Blur = s + Case 3 + hBoxShadow.Spread = s + End Select + Inc i + Continue + Endif + If LCase(s) = "inset" Then + hBoxShadow.Inset = True + Continue + Endif + Try hBoxShadow.Color = Val(s) + + Next + Return hBoxShadow + +End + + + +' Public Function _get(Index As Integer) As _ReportBoxShadow +' +' Return $aBoxShadow[Index] +' +' End + +Public Sub Add(Optional XOffset As String, YOffset As String, iColor As Integer, Spread As String, Blur As String, Inset As Boolean) + + Dim hBoxShadow As New _ReportBoxShadow + + If XOffset Then hBoxShadow.XOffset = XOffset + If YOffset Then hBoxShadow.YOffset = YOffset + If iColor Then hBoxShadow.Color = iColor + If SPread Then hBoxShadow.Spread = Spread + If Blur Then hBoxShadow.Blur = Blur + hBoxShadow.Inset = Inset + $aBoxShadow.Add(hBoxShadow) + +End + +Public Sub Remove(Index As Integer) + + $aBoxShadow.Remove(Index) + +End + + + +Private Function XOffset_Read() As String + + Return $aBoxShadow[0].XOffset + +End + +Private Sub XOffset_Write(Value As String) + + $aBoxShadow[0].XOffset = Value + +End + +Private Function YOffset_Read() As String + + Return $aBoxShadow[0].YOffset + +End + +Private Sub YOffset_Write(Value As String) + + $aBoxShadow[0].YOffset = Value + +End + +Private Function Blur_Read() As String + + Return $aBoxShadow[0].Blur + +End + +Private Sub Blur_Write(Value As String) + + $aBoxShadow[0].Blur = Value + +End + +Private Function Spread_Read() As String + + Return $aBoxShadow[0].Spread + +End + +Private Sub Spread_Write(Value As String) + + $aBoxShadow[0].Spread = Value + +End + +Private Function Inset_Read() As Boolean + + Return $aBoxShadow[0].Inset + +End + +Private Sub Inset_Write(Value As Boolean) + + $aBoxShadow[0].Inset = Value + +End + +Private Function Color_Read() As Integer + + Return $aBoxShadow[0].Color + +End + +Private Sub Color_Write(Value As Integer) + + $aBoxShadow[0].Color = Value + +End + +Private Function Count_Read() As Integer + + Return $aBoxShadow.Count + +End + +Private Function Max_Read() As Integer + + Return $aBoxShadow.Max + +End + +Public Sub _SetUnifiedValues() + + Dim i As Integer + Dim SizeParse As TSizeParse + For i = 0 To $aBoxShadow.Max + 'With + $aBoxShadow[i]._XOffset = TSizeParse[$aBoxShadow[i].XOffset].GetValue() + $aBoxShadow[i]._YOffset = TSizeParse[$aBoxShadow[i].YOffset].GetValue() + $aBoxShadow[i]._Spread = TSizeParse[$aBoxShadow[i].Spread].GetValue() + $aBoxShadow[i]._Blur = TSizeParse[$aBoxShadow[i].Blur].GetValue() + + '._Blur = TSizeParse[.Blur].GetValue() + 'End With + + + Next + +End + +Private Function _XOffset_Read() As Float + + Return $aBoxShadow[0]._XOffset + +End + +Private Function _YOffset_Read() As Float + + Return $aBoxShadow[0]._YOffset + +End + +Private Function _Blur_Read() As Float + + Return $aBoxShadow[0]._Blur + +End + +Private Function _Spread_Read() As Float + + Return $aBoxShadow[0]._Spread + +End + +Private Function _Active_Read() As Boolean + + Return Not ($aBoxShadow[0]._XOffset = 0 And $aBoxShadow[0]._YOffset = 0 And $aBoxShadow[0]._Blur = 0 And $aBoxShadow[0]._Spread = 0) + +End diff --git a/comp/src/gb.report/.src/BoxShadow/_ReportBoxShadow.class b/comp/src/gb.report/.src/BoxShadow/_ReportBoxShadow.class new file mode 100644 index 00000000..c204ac4c --- /dev/null +++ b/comp/src/gb.report/.src/BoxShadow/_ReportBoxShadow.class @@ -0,0 +1,13 @@ +' Gambas class file + +Public XOffset As String '= "8mm" +Public YOffset As String '= "2mm" +Public Spread As String +Public Inset As Boolean +Public Color As Integer +Public Blur As String + +Public _XOffset As Float +Public _YOffset As Float +Public _Spread As Float +Public _Blur As Float diff --git a/comp/src/gb.report/.src/Brush/ReportBrush.class b/comp/src/gb.report/.src/Brush/ReportBrush.class new file mode 100644 index 00000000..38f19006 --- /dev/null +++ b/comp/src/gb.report/.src/Brush/ReportBrush.class @@ -0,0 +1,222 @@ +' Gambas class file + +Export + +Public _Type As Integer +Public _X As Float +Public _Y As Float +Public _X2 As Float +Public _Y2 As Float +Public _radius As Float +Public _Image As Image +Public _Color As Integer[] = [0, &HFFFFFF&] +Public _Pos As Float[] = [0, 1] +Private _ImageDir As String + +Public Function _PaintBrush(X1 As Integer, Y1 As Integer, X2 As Integer, Y2 As Integer) As PaintBrush + + Dim hBrush As PaintBrush + Dim fradius As Float + Dim Width As Integer = X2 - X1 + Dim Height As Integer = Y2 - Y1 + + Select Case Me._Type + Case 0 + hBrush = Paint.Color(_Color[0]) + Case 1 + hBrush = paint.Image(_Image, X1, Y1) + Case 2 + hBrush = paint.LinearGradient(Width * _X, Height * _Y, Width * _X2, Height * _Y2, _Color, _Pos) + Case 3 + fradius = Width * _radius + hBrush = paint.RadialGradient(Width * _X, Height * _Y, fradius, Width * _X2, Height * _Y2, _Color, _Pos) + End Select + hBrush.Translate(x1, Y1) + Return hBrush + +End + +Static Public Sub _get(sValue As String) As ReportBrush + + Dim hBrush As New ReportBrush + Dim iPos As Integer + Dim sType As String + + Dim ars As String[] + + + + If Not svalue Then Return Null + + sValue = Trim(sValue) + + iPos = InStr(sValue, "(") + + If iPos Then sType = Left(sValue, iPos - 1) + 'pas de parenthese de fin + If ipos And Not (sValue Ends ")") Then + Error.Raise + Else + If iPos Then svalue = Left(Mid(svalue, ipos + 1), -1) + Endif + ars = Split(sValue, ",", "[]") + Select Case LCase(sType) + Case "image" + hBrush._Type = 1 + + hBrush._Image = Image.Load(ars[0]) + hBrush._ImageDir = ars[0] + Case "radialgradient" + hBrush._Type = 3 + hBrush._X = CFloat(ars[0]) + hBrush._Y = CFloat(ars[1]) + hBrush._Radius = CFloat(ars[2]) + hBrush._X2 = CFloat(ars[3]) + hBrush._Y2 = CFloat(ars[4]) + hBrush._Color = GetIntegerArray(ars[5]) + hBrush._Pos = GetFloatArray(ars[6]) + + Case "lineargradient" + + hBrush._Type = 2 + hBrush._X = CFloat(ars[0]) + hBrush._Y = CFloat(ars[1]) + hBrush._X2 = CFloat(ars[2]) + hBrush._Y2 = CFloat(ars[3]) + hBrush._Color = GetIntegerArray(ars[4]) + hBrush._Pos = GetFloatArray(ars[5]) + + Case Else + 'correction de l'hexon + '= Val(Replace(ars[0], "#", "&H") & "00&") + If ars[0] Begins "#" Then ars[0] = Mid(ars[0], 2) + hBrush._Color[0] = Val("&H" & IIf(Len(ars[0]) = 8, ars[0], 00 & ars[0])) + End Select + Return hBrush + +Finally + If hBrush._Color.Count = 0 Then hBrush._Color = [0, &hFFFFFF&] + If hBrush._Color.Count < 2 Then hBrush._Color.Add(&hFFFFFF&) + If hBrush._Pos.Count < 2 Then hBrush._Pos = [0.0, 1.0] + + +Catch + Return hBrush + +End + +Static Private Function GetIntegerArray(sValue As String) As Integer[] + + Dim ari As New Integer[] + Dim s As String + + For Each s In Split(sValue) + If s Begins "#" Then s = Mid(s, 2) + + ari.Add(Val("&H" & IIf(Len(s) = 8, s, "00" & s))) + Next + + Return ari + +End + +Static Private Function GetFloatArray(sValue As String) As Float[] + + Dim arf As New Float[] + Dim s As String + + For Each s In Split(sValue) + arf.Add(CFloat(s)) + Next + + Return arf + +End + +Public Function ToString() As String + + Dim i As Integer + Dim f As Float + Dim sValue As String + + Select Case _Type + Case 0 + sValue = "&H" & Hex(_Color[0], 8) & "&" + Case 2, 3 + If _Type = 3 Then + sValue = "RadialGradient(" & _X & "," & _Y & "," & _Radius & "," & _X2 & "," & _Y2 & ",[" + + Else + sValue = "LinearGradient(" & _X & "," & _Y & "," & _X2 & "," & _Y2 & ",[" + Endif + + For Each i In _Color + sValue &= "&H" & Hex(i, 6) & "&," + + Next + + sValue = Left(sValue, -1) + + sValue &= "],[" + + For Each f In _Pos + sValue &= f & "," + + Next + sValue = Left(sValue, -1) + + sValue &= "])" + Case 1 + sValue = "Image(" & _ImageDir & ")" + + End Select + + Return svalue + +End + +Static Public Function Color(iColor As Integer) As ReportBrush + + Dim hBrush As New ReportBrush + + hBrush._Color[0] = iColor + hBrush._Type = 0 + Return hBrush + +End + +Static Public Function LinearGradient(X As Float, Y As Float, X2 As Float, Y2 As Float, aColor As Integer[], aPos As Float[]) As ReportBrush + Dim hBrush As New ReportBrush + + hBrush._X = X + hBrush._Y = Y + hBrush._X2 = X2 + hBrush._Y2 = Y2 + hBrush._Color = aColor + hBrush._Pos = aPos + hBrush._Type = 2 + Return hBrush +End + +Static Public Function RadialGradient(X As Float, Y As Float, Radius As Float, X2 As Float, Y2 As Float, aColor As Integer[], aPos As Float[]) As ReportBrush + Dim hBrush As New ReportBrush + + hBrush._X = X + hBrush._Y = Y + hBrush._X2 = X2 + hBrush._Y2 = Y2 + hBrush._radius = Radius + hBrush._Color = aColor + hBrush._Pos = aPos + hBrush._Type = 3 + Return hBrush +End + +Static Public Function Image(hImage As Image) As ReportBrush + Dim hBrush As New ReportBrush + + hBrush._Image = hImage + hBrush._Type = 1 + Return hBrush + +End diff --git a/comp/src/gb.report/.src/Controls/ReportControl.class b/comp/src/gb.report/.src/Controls/ReportControl.class new file mode 100644 index 00000000..acf0c2cb --- /dev/null +++ b/comp/src/gb.report/.src/Controls/ReportControl.class @@ -0,0 +1,596 @@ +' Gambas class file + +Export +Create Private + +Public Const _IsControl As Boolean = True +Public Const _IsContainer As Boolean = False +Public Const _Properties As String = "Left{ReportCoord},Top{ReportCoord},Width{ReportCoord},Height{ReportCoord},Brush{ReportBrush},Visible=True,Fixed,Font,Padding,Ignore,Expand,AutoResize,Tag,Range" +Public Const _Family As String = "Report" +Public _SizeInt As TSizeHint +Public _Count As Integer = 1 +Public _Finished As Boolean +Private $iDataindex As Integer +Property _DataIndex As Integer + +Private $iIndex As Integer + +Public Name As String +'Object Management +Static Public _ObjectFromId As New Collection +Static Public _iCurPagePos As Integer +Static Private $iLastId As Integer + +Private $iMyId As Integer +Private $iParentId As Integer + +Private $vTag As Variant +Private $fPadding As Float +Private $iReportId As Integer + +Private $hBrush As ReportBrush +Private $iColor As Integer + +Private $fLeft As Float = 0.0 +Private $fTop As Float = 0.0 +Private $fWidth As Float = 0.0 +Private $fHeight As Float = 0.0 +Private $sHeight As String = "0cm" +Private $sLeft As String = "0cm" +Private $sWidth As String = "0cm" +Private $sTop As String = "0cm" +Private $hPadding As New ReportPadding +'Private $sPadding As String = "0cm" + +Private $iVisible As Boolean = True +Private $hFont As New Font +Private $bExpand As Boolean +Private $bFixed As Boolean +Private $bAutoresize As Boolean = False +Private $bRelativeLeft As Boolean +Private $bRelativeTop As Boolean +Private $bRelativeWidth As Boolean +Private $bRelativeHeight As Boolean +Private $bRelativePadding As Boolean +Private $bIgnore As Boolean = False +Private $sRange As String +Property Read Id As Integer +Property Read Parent As ReportContainer +Property Tag As Variant +Property Padding As ReportPadding + +Property Brush As ReportBrush +'Property {Color} As Integer + +Property Read _Top As Float ''Top of the control in cm +Property Read _Height As Float ''Height of the control in cm +Property Read _Width As Float ''Width of the control in cm +Property Read _Left As Float ''Left of the control in cm +Property Read _Padding As Float '' Padding of the control in cm +Property Read _RelativeLeft As Boolean ''Use percentage for Left pos? +Property Read _RelativeTop As Boolean ''Use percentage for Top Pos? +Property Read _RelativeWidth As Boolean ''Use percentage for width? +Property Read _RelativeHeight As Boolean ''Use percentage for height ? +Property Read _RelativePadding As Boolean ''Use percentage for padding ? +Property _Index As Integer +Property Range As String +Property Left As String +Property Top As String +Property X As String +Property Y As String + +Property Width As String +Property Height As String + +Property Visible As Boolean +Property {Font} As Font +Property Expand As Boolean +Property Ignore As Boolean +Property Fixed As Boolean + +Property Autoresize As Boolean +Property Read {Report} As Report +Property _ReportId As Integer +Property Read DataIndex As Integer +Property ForceNewPage As Boolean +Private $bForceNewPage As Boolean + +Public Sub _New(Optional Parent As ReportContainer = Null) + + Dim hRep As Report + + $iMyId = $iLastId + Inc $iLastId + If IsNull(Parent) Then + $iParentId = -1 + $iReportId = $iMyId + + Else + If Parent Is Report Then + hRep = Parent + $iParentId = hRep._Container.id + hRep._Container._Add(Me) + $iReportId = hRep.id + Else + $iParentId = Parent.Id + Parent._Add(Me) + $iReportId = Parent._ReportId + Endif + Endif + +End + +Private Function Id_Read() As Integer + + Return $iMyId + +End + +Private Function Parent_Read() As ReportContainer + + Return ReportControl._ObjectFromId[$iParentId] + +End + +Private Function Left_Read() As String + + Return $sLeft + +End + +Private Sub Left_Write(Value As String) + + $sLeft = Value + +End + +Private Function Top_Read() As String + + Return $sTop + +End + +Private Sub Top_Write(Value As String) + + $sTop = Value + +End + +Private Function Width_Read() As String + + Return $sWidth + +End + +Private Sub Width_Write(Value As String) + + $sWidth = Value + +End + +Private Function Height_Read() As String + + Return $sHeight + +End + +Private Sub Height_Write(Value As String) + + $sHeight = Value + +End + +Private Function Expand_Read() As Boolean + + Return $bExpand + +End + +Private Sub Expand_Write(Value As Boolean) + + $bExpand = Value + +End + +Public Sub _GetSizeHints((AvailableW) As Float, (AvailableH) As Float, TotalWidth As Float, TotalHeight As Float, DataIndex As Integer) As TSizeHint + + 'Error.Raise("Something goes wrong the _GetSizeHints is not correctly implemented") + 'Implementaion standart du sizeInt hors autoresize et hbox + ' + + Dim hMyHints As New TSizeHint + + If Me._RelativeHeight Then + hMyHints.Height = TotalHeight * Me._Height / 100 + Else + hMyHints.Height = Me._Height + Endif + + If Me._RelativeWidth Then + hMyHints.Width = TotalWidth * Me._Width / 100 + Else + hMyHints.Width = Me._Width + Endif + Return hMyHints + +End + +Public Sub _PaintBeFore((Page) As Integer, (X) As Float, (Y) As Float, (hControl) As TControl, (DataIndex) As Integer) + +End + +Public Sub _Paint(Page As Integer, X As Float, Y As Float, hControl As TControl, DataIndex As Integer) + +End + +Public Sub _PaintFrame((Page) As Integer, (X) As Float, (Y) As Float, (hControl) As TControl, (DataIndex) As Integer) + + Me._Paint(Page, X, Y, hControl, DataIndex) + +End + +Public Sub _PaintAfter((Page) As Integer, (X) As Float, (Y) As Float, (hControl) As TControl, (DataIndex) As Integer) + +End + +Private Function Visible_Read() As Boolean + + Return $iVisible + +End + +Private Sub Visible_Write(Value As Boolean) + + $iVisible = Value + +End + +Public Sub Move(X As Float, Y As Float, W As Float, H As Float) + + $fLeft = X + $fTop = Y + $fWidth = W + $fHeight = H + +End + +Private Function Tag_Read() As Variant + + Return $vTag + +End + +Private Sub Tag_Write(Value As Variant) + + $vTag = Value + +End + +Private Function Font_Read() As Font + + Return $hFont + +End + +Private Sub Font_Write(Value As Font) + + $hFont = Value + +End + +Private Function Padding_Read() As ReportPadding + + Return $hPadding + +End + +Private Sub Padding_Write(Value As ReportPadding) + + $hPadding = Value + +End + +Private Function _Top_Read() As Float + + Return $fTop + +End + +Private Function _Height_Read() As Float + + Return $fHeight + +End + +Private Function _Width_Read() As Float + + Return $fWidth + +End + +Private Function _Left_Read() As Float + + Return $fLeft + +End + +Private Function _Padding_Read() As Float + + Return $fPadding + +End + +Public Function _SetChildGeometry((X) As Float, (Y) As Float, (W) As Float, (H) As Float, (ContPage) As Integer, (TCont) As TControl, (bInFixed) As Boolean) + +End + +Private Function Autoresize_Read() As Boolean + + Return $bAutoresize + +End + +Private Sub Autoresize_Write(Value As Boolean) + + $bAutoresize = Value + +End + +Private Function _RelativeWidth_Read() As Boolean + + Return $bRelativeWidth + +End + +Private Function _RelativeHeight_Read() As Boolean + + Return $bRelativeHeight + +End + +Private Function _RelativePadding_Read() As Boolean + + Return $bRelativePadding + +End + +''Convert recursively string values to unified values in cm +Public Sub _SetUnifiedValues() + + Dim hSizeParse As TSizeParse + + 'Left + hSizeParse = New TSizeParse($sLeft, True) + $fLeft = hSizeParse.GetValue() + $bRelativeLeft = hSizeParse.IsRelative() + + 'Right + hSizeParse = New TSizeParse($sTop, True) + $fTop = hSizeParse.GetValue() + $bRelativeTop = hSizeParse.IsRelative() + + 'Width + hSizeParse = New TSizeParse($sWidth, True) + $fWidth = hSizeParse.GetValue() + $bRelativeWidth = hSizeParse.IsRelative() + + 'Height + hSizeParse = New TSizeParse($sHeight, True) + $fHeight = hSizeParse.GetValue() + $bRelativeHeight = hSizeParse.IsRelative() + + 'Padding + ' hSizeParse = New TSizeParse($sPadding, True) + ' $fPadding = hSizeParse.GetValue() + ' $bRelativePadding = hSizeParse.IsRelative() + + hSizeParse = New TSizeParse($hPadding.Left, True) + $hPadding._Left = hSizeParse.GetValue() + + hSizeParse = New TSizeParse($hPadding.Right, True) + $hPadding._Right = hSizeParse.GetValue() + + hSizeParse = New TSizeParse($hPadding.Top, True) + $hPadding._Top = hSizeParse.GetValue() + + hSizeParse = New TSizeParse($hPadding.Bottom, True) + $hPadding._Bottom = hSizeParse.GetValue() + + ' + +End + +Private Function Ignore_Read() As Boolean + + Return $bIgnore + +End + +Private Sub Ignore_Write(Value As Boolean) + + $bIgnore = Value + +End + +Private Function Report_Read() As Report + + Return ReportControl._ObjectFromId[$iReportId] + +End + +Private Function _ReportId_Read() As Integer + + Return $iReportId + +End + +Private Function Fixed_Read() As Boolean + + Return $bFixed + +End + +Private Sub Fixed_Write(Value As Boolean) + + $bFixed = Value + +End + +Public Sub _Reset() + + Me._DataIndex = 0 + +End + +Private Function X_Read() As String + + Return $sLeft + +End + +Private Sub X_Write(Value As String) + + $sLeft = Value + +End + +Private Function Y_Read() As String + + Return $sTop + +End + +Private Sub Y_Write(Value As String) + + $sTop = Value + +End + +Private Function Brush_Read() As ReportBrush + + Return $hBrush + +End + +Private Sub Brush_Write(Value As ReportBrush) + + $hBrush = Value + +End + +' Private Function Color_Read() As Integer +' +' Return $iColor +' +' End +' +' Private Sub Color_Write(Value As Integer) +' +' $iColor = Value +' +' End + +Public Function _GetActualBrush(X1 As Integer, Y1 As Integer, X2 As Integer, Y2 As Integer) As PaintBrush + + Dim hBrush As PaintBrush + + If $hBrush Then + hBrush = $hBrush._PaintBrush(X1, Y1, X2, Y2) + Else If $iColor Then + hBrush = Paint.Color($iColor) + Else + Try hBrush = Me.Parent._GetActualBrush(X1, Y1, X2, Y2) + If Not hBrush Then + hBrush = Paint.Color(0) + Endif + Endif + Return hBrush + +End + +Private Sub _ReportId_Write(Value As Integer) + + $iReportId = Value + +End + +Private Function _RelativeLeft_Read() As Boolean + + Return $bRelativeLeft + +End + +Private Function _RelativeTop_Read() As Boolean + + Return $bRelativeTop + +End + +Private Function DataIndex_Read() As Integer + + Return Me._Index 'Return Me._GetIndex() + +End + +Private Function Range_Read() As String + + Return $sRange + +End + +Private Sub Range_Write(Value As String) + + $sRange = Value + +End + +Public Function _GetIndex() As Integer + + Return Me._Index + 'Return Me.Parent._GetIndex() + +End + +Private Function _Index_Read() As Integer + + Return $iIndex + +End + +Private Sub _Index_Write(Value As Integer) + + $iIndex = Value + +End + +Private Function _DataIndex_Read() As Integer + + Return $iDataindex + +End + +Private Sub _DataIndex_Write(Value As Integer) + 'If Me.Tag = "Boite 2" And Value = 0 Then Stop + 'If Me.Report.$iCurPage = 0 Then Print "DataIndex: " & value + + $iDataindex = Value + 'Stop + 'Print "_DataIndex " & Me.Tag & " = " & $iDataindex + +End + +Private Function ForceNewPage_Read() As Boolean + + Return $bForceNewPage + +End + +Private Sub ForceNewPage_Write(Value As Boolean) + + $bForceNewPage = Value + +End + +Public Sub _Free() + +End diff --git a/comp/src/gb.report/.src/MainTools/MReport.module b/comp/src/gb.report/.src/MainTools/MReport.module new file mode 100644 index 00000000..a81b4d10 --- /dev/null +++ b/comp/src/gb.report/.src/MainTools/MReport.module @@ -0,0 +1,26 @@ +' Gambas module file + +Public DrawCount As Integer +Public Resolution As Integer +Private Dash As Float[] = [2.0, 1.0] +Private Dot As Float[] = [1.0, 1.0] +Private DashDot As Float[] = [2.0, 1.0, 1.0, 1.0] +Private DashDotDot As Float[] = [2.0, 1.0, 1.0, 1.0, 1.0, 1.0] + + +Public Sub GetBorder(iStyle As Integer) As Float[] + + Select Case iStyle + + Case Line.Dash + Return Dash + Case Line.Dot + Return Dot + Case Line.DashDot + Return DashDot + Case Line.DashDotDot + Return DashDotDot + End Select + +End + diff --git a/comp/src/gb.report/.src/MainTools/ReportUnits.module b/comp/src/gb.report/.src/MainTools/ReportUnits.module new file mode 100644 index 00000000..642cde8b --- /dev/null +++ b/comp/src/gb.report/.src/MainTools/ReportUnits.module @@ -0,0 +1,92 @@ +' Gambas module file + +Fast +Export +Public AllowedUnits As String[] = ["m", "cm", "mm", "in", "pt", "px"] +Property Read DesktopScale As Float +Public _ReportWidth As Float +Public _Scale As Float = 1.0 +'Public Ratio As Float +Public Function GetFactorUnitToInch(Unit As String, Optional Resolution As Integer) As Float + + + Select Case Unit + Case "cm" + Return 0.3937 + Case "ft" + Return 12 + Case "in" + Return 1 + Case "m" + Return 39.37 + Case "mm" + Return 0.03937 + Case "px" + Return 1 / Paint.ResolutionX 'If(Resolution, Resolution, ReportUnits.Resolution) + Case "pt" + Return 1 / 72 + Case Else + Error.Raise("Unknown unit") + End Select + +End + +Public Function ReportUnitsConverter(Value As Float, Unit1 As String, Unit2 As String) As Float + + Dim fInch As Float + Dim f As Float + + f = GetFactorUnitToInch(Unit1) + finch = value * f + f = GetFactorUnitToInch(Unit2) + Return finch / f + +End + + +Public Function UnitToCm(Value As Float, Unit As String) As Float + + Dim fInch As Float + Dim f As Float + + f = GetFactorUnitToInch(Unit) + finch = value * f + f = 0.3937 + Return finch / f + +End + + +Public Function _ReportUnitsToPixels(Value As Float) As Float + + Dim f As Float + +'Return Value * Ratio +' If Value > 0 Then Stop + f = Value / _ReportWidth * (Paint.Width / _Scale) + 'f = 0.3937 * Paint.ResolutionX + 'f = ReportUnits.GetFactorUnitToInch("cm") * Resolution 'ReportResolution + + 'Return Value * f + Return f + +End + +Public Function _PixelsToReportUnits(Value As Float) As Float + + Dim f As Float + + 'f = 0.3937 * Paint.ResolutionX 'ReportResolution + Return (value / Paint.ResolutionX * 2.54) '/ _ReportWidth * Paint.Width + 'Return (Value) / f + +End + + + + +Private Function DesktopScale_Read() As Float + + Return Paint.ResolutionX / Desktop.Resolution + +End diff --git a/comp/src/gb.report/.src/MainTools/Types/TControl.class b/comp/src/gb.report/.src/MainTools/Types/TControl.class new file mode 100644 index 00000000..27bf86d8 --- /dev/null +++ b/comp/src/gb.report/.src/MainTools/Types/TControl.class @@ -0,0 +1,76 @@ +' Gambas class file + +'Fast + + +Property Read RealLeft As Float ''Return the left relative position size in Pixel + +Property Read RealTop As Float ''Return the top relative position size in Pixel + +Property Read RealWidth As Float ''Return the width in pixel + +Property Read RealHeight As Float ''Return the height in pixel + +Public SizeHint As TSizeHint ''Size hints buffer + +Property Ctrl As ReportControl ''Return or set the link between real widget and virtual object + +Public _PageChildren As New Collection ''The links between page and objects + +Public Index As Integer ''Remember the dataindex + +Public Cache As Variant ''For future data cache + +Private $iCtrl As Integer +Private fX As Float +Private fY As Float +Private fW As Float +Private fH As Float + +''Define the virtual widget size in internal unit (cm) +Public Function _SetGeometry(X As Float, Y As Float, W As Float, H As Float) As Float + + fX = X + fY = Y + fW = W + fH = H + +End + + +Private Function Ctrl_Read() As ReportControl + + Return ReportControl._ObjectFromId[$iCtrl] + +End + + +Private Sub Ctrl_Write(Value As ReportControl) + + $iCtrl = Value.id + +End + +Private Function RealLeft_Read() As Float + + Return ReportUnits._ReportUnitsToPixels(fX) + +End + +Private Function RealTop_Read() As Float + + Return ReportUnits._ReportUnitsToPixels(fY) + +End + +Private Function RealWidth_Read() As Float + + Return ReportUnits._ReportUnitsToPixels(fX + fW) - ReportUnits._ReportUnitsToPixels(fX) + +End + +Private Function RealHeight_Read() As Float + + Return ReportUnits._ReportUnitsToPixels(fY + fH) - ReportUnits._ReportUnitsToPixels(fY) + +End diff --git a/comp/src/gb.report/.src/MainTools/Types/TPageColumn.class b/comp/src/gb.report/.src/MainTools/Types/TPageColumn.class new file mode 100644 index 00000000..9ca0701d --- /dev/null +++ b/comp/src/gb.report/.src/MainTools/Types/TPageColumn.class @@ -0,0 +1,8 @@ +' Gambas class file + +Public Exp As Float +Public NExp As Integer +Public X As Float +Public Width As Float +Public TCtrls As New TControl[] +Public TH As Float \ No newline at end of file diff --git a/comp/src/gb.report/.src/MainTools/Types/TSizeHint.class b/comp/src/gb.report/.src/MainTools/Types/TSizeHint.class new file mode 100644 index 00000000..2b5422ff --- /dev/null +++ b/comp/src/gb.report/.src/MainTools/Types/TSizeHint.class @@ -0,0 +1,5 @@ +' Gambas class file + +Public Height As Float = 0 +Public Width As Float = 0 +Public NotFinished As Boolean diff --git a/comp/src/gb.report/.src/MainTools/Types/TSizeParse.class b/comp/src/gb.report/.src/MainTools/Types/TSizeParse.class new file mode 100644 index 00000000..128ad2f6 --- /dev/null +++ b/comp/src/gb.report/.src/MainTools/Types/TSizeParse.class @@ -0,0 +1,70 @@ +' Gambas class file + +'Fast +Public Value As Float +Public Unit As String + +'' Create a new size object from its description. +'' #bAllowRelative# can be TRUE to allow the use of "%" as unit. +Public Sub _new(Size As String, Optional bAllowRelative As Boolean) + + Dim I As Integer + Dim sCar As String + + Size = Trim(Size) + + If Not Size Then + Unit = "px" + Return + Endif + + For I = 1 To Len(Size) + sCar = Mid$(Size, I, 1) + If Not IsDigit(sCar) And If sCar <> "-" And If sCar <> "." Then Break + Next + + Value = CFloat(Left$(Size, I - 1)) + Unit = Trim(Mid$(Size, I)) + + If Not Unit Then Unit = "%" + + If Not ReportUnits.AllowedUnits.Exist(Unit) Then + If Not bAllowRelative Or Unit <> "%" Then + Error.Raise("Unknown unit") + Endif + Endif + +End + +Public Sub ToCm() As Float + + Return ReportUnits.UnitToCm(Value, Unit) + +End + +Public Sub IsRelative() As Boolean + + Return Unit = "%" + +End + +Public Sub GetValue() As Float + + + If IsRelative() Then + Return Value + Else + Return ToCm() + Endif + +End + + +Static Public Sub _get(Size As String) As TSizeParse + + Dim hSize As TSizeParse = New TSizeParse(Size) + + Return hSize + +End + diff --git a/comp/src/gb.report/.src/Optional/Align.class b/comp/src/gb.report/.src/Optional/Align.class new file mode 100644 index 00000000..485bc6a1 --- /dev/null +++ b/comp/src/gb.report/.src/Optional/Align.class @@ -0,0 +1,10 @@ +' Gambas class file + +Export Optional + +' Must be the same values as in gb.form.const.h in gb.qt4 sources + +Public Enum + Normal = &H00, {Left} = &H01, {Right} = &H02, Center = &H03, + TopNormal = &H10, TopLeft = &H11, TopRight = &H12, Top = &H13, + BottomNormal = &H20, BottomLeft = &H21, BottomRight = &H22, Bottom = &H23 diff --git a/comp/src/gb.report/.src/Optional/Arrange.class b/comp/src/gb.report/.src/Optional/Arrange.class new file mode 100644 index 00000000..1090a9e1 --- /dev/null +++ b/comp/src/gb.report/.src/Optional/Arrange.class @@ -0,0 +1,9 @@ +' Gambas class file + +Export Optional + +Public Const {None} As Integer = 0 +Public Const {Horizontal} As Integer = 1 +Public Const {Vertical} As Integer = 2 +Public Const {Column} As Integer = 4 +Public Const {Fill} As Integer = 5 diff --git a/comp/src/gb.report/.src/Optional/Line.class b/comp/src/gb.report/.src/Optional/Line.class new file mode 100644 index 00000000..c345df55 --- /dev/null +++ b/comp/src/gb.report/.src/Optional/Line.class @@ -0,0 +1,13 @@ +' Gambas class file + +Export Optional + + +' Must be the same values as in gb.form.const.h in gb.qt4 sources + +Public Const {None} As Integer = 0 +Public Const {Solid} As Integer = 1 +Public Const {Dash} As Integer = 2 +Public Const {Dot} As Integer = 3 +Public Const {DashDot} As Integer = 4 +Public Const {DashDotDot} As Integer = 5 \ No newline at end of file diff --git a/comp/src/gb.report/.src/Padding/ReportPadding.class b/comp/src/gb.report/.src/Padding/ReportPadding.class new file mode 100644 index 00000000..97c6a169 --- /dev/null +++ b/comp/src/gb.report/.src/Padding/ReportPadding.class @@ -0,0 +1,63 @@ +' Gambas class file + +Export +Public {Left} As String = "0cm" +Public Right As String = "0cm" +Public Top As String = "0cm" +Public Bottom As String = "0cm" + +Public _Left As Float +Public _Right As Float +Public _Top As Float +Public _Bottom As Float +Property Read _Width As Float +Property Read _Height As Float + +Static Public Sub _Get(Value As String) As ReportPadding + + Dim hPadding As New ReportPadding + Dim hSize As TSizeParse + Dim s As String + Dim ars As String[] + + For Each s In Split(Value, ";") + ars = Scan(s, "*:*") + If ars.count > 1 Then + Select Case LCase(ars[0]) + Case "left" + hPadding.Left = ars[1] + Case "top" + hPadding.top = ars[1] + Case "bottom" + hPadding.bottom = ars[1] + Case "right" + hPadding.Right = ars[1] + Case Else + + End Select + Else + Try hSize = New TSizeParse(s) + If hSize <> Null Then + hPadding.Left = s + hPadding.Right = s + hPadding.Bottom = s + hPadding.Top = s + Endif + Endif + + Next + Return hPadding + +End + +Private Function _Width_Read() As Float + + Return _Left + _Right + +End + +Private Function _Height_Read() As Float + + Return _top + _Bottom + +End diff --git a/comp/src/gb.report/.src/Preview/CPrint.class b/comp/src/gb.report/.src/Preview/CPrint.class new file mode 100644 index 00000000..49d00296 --- /dev/null +++ b/comp/src/gb.report/.src/Preview/CPrint.class @@ -0,0 +1,54 @@ +' Gambas class file + +Create Static +Private hPrinter As New Printer As "Printer" +Private $hPrint As Report + +Public Sub PrintReport(hReport As Report, Optional MyPrinter As Printer) + + Dim hSizeParse As TSizeParse + $hPrint = hReport + '$hPrint = hReport.Clone() + If MyPrinter Then + hPrinter = MyPrinter + Else + hPrinter = New Printer + Endif + Object.Attach(hPrinter, Me, "Printer") + + hPrinter.Paper = $hPrint.Paper + hPrinter.Orientation = $hPrint.Orientation + If $hPrint.Paper = Printer.Custom Then + hSizeParse = New TSizeParse($hPrint.Width) + hPrinter.PaperWidth = hSizeParse.ToCm() * 10 + hSizeParse = New TSizeParse($hPrint.Height) + hPrinter.PaperHeight = hSizeParse.ToCm() * 10 + Endif + If Not MyPrinter Then + If Not hPrinter.Configure() Then + hPrinter.Print + Endif + Else + hPrinter.Print + Endif +End + +Public Sub Printer_Draw() + + $hPrint.Paint(hPrinter.Page) + +End + +Public Sub Printer_Begin() + + 'Debug Object.Type($hReport) + $hPrint.Layout + hPrinter.Count = $hPrint.PageCount + +End + +Public Sub Printer_End() + + $hPrint = Null + +End diff --git a/comp/src/gb.report/.src/Preview/FOptions.class b/comp/src/gb.report/.src/Preview/FOptions.class new file mode 100644 index 00000000..bd549416 --- /dev/null +++ b/comp/src/gb.report/.src/Preview/FOptions.class @@ -0,0 +1,9 @@ +' Gambas class file + + +Public Sub Form_Open() + + ComboBox1.List = ["A3", "A4", "A5", "B5", "Executive", "Legal", "Letter", "Custom"] + ComboBox1.Index = 1 + +End diff --git a/comp/src/gb.report/.src/Preview/FOptions.form b/comp/src/gb.report/.src/Preview/FOptions.form new file mode 100644 index 00000000..d6c086a2 --- /dev/null +++ b/comp/src/gb.report/.src/Preview/FOptions.form @@ -0,0 +1,52 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,68,64) + { VBox1 VBox + MoveScaled(0,0,36,52) + Spacing = True + { Frame1 Frame + MoveScaled(0,3,36,38) + Text = ("Size") + { ComboBox1 ComboBox + MoveScaled(2,7,33,4) + ReadOnly = True + } + { Label1 Label + MoveScaled(3,4,19,3) + Text = ("Paper size") + Transparent = True + } + { Frame3 Frame + MoveScaled(2,12,33,22) + Enabled = False + Text = ("Custom paper size") + { Label2 Label + MoveScaled(2,7,9,3) + Text = ("Width:") + Transparent = True + } + { Label3 Label + MoveScaled(2,13,9,3) + Text = ("Height:") + Transparent = True + } + { txtWidth TextBox + MoveScaled(9,6,14,5) + } + { txtHeight TextBox + MoveScaled(9,12,14,5) + } + } + } + { Frame2 Frame + MoveScaled(0,42,36,9) + Text = ("Orientation") + { ComboBox2 ComboBox + MoveScaled(2,4,28,4) + ReadOnly = True + List = [("Portrait"), ("Landscape")] + } + } + } +} diff --git a/comp/src/gb.report/.src/Preview/FPreview.class b/comp/src/gb.report/.src/Preview/FPreview.class new file mode 100644 index 00000000..8b5f9f41 --- /dev/null +++ b/comp/src/gb.report/.src/Preview/FPreview.class @@ -0,0 +1,400 @@ +' Gambas class file + +Private $aModeButtons As New ToolButton[] +Private bFlag As Boolean +Private $hPrinter As New Printer As "Printer" +Private $iCurPrinterResolution As Integer + +Static Public Function Run(hReport As Report) + + Dim hFPreview As FPreview + + hFpreview = New FPreview + + hFPreview.SetReport(hReport) + hFpreview.ShowModal() + +End + +Public Sub _new() + + Dim s As String + Dim hButton As ToolButton + + $aModeButtons = [ToolButton1, ToolButton2, ToolButton4, ToolButton3] + If Component.IsLoaded("gb.settings") Then + 'Settings.Read(Me, "FPreview") + Settings.Read(View, "View") + + If View.ScaleMode = View.Custom Then + Slider1.Value = View.Scale + Else + For Each hButton In $aModeButtons + hButton.Value = False + Next + $aModeButtons[View.ScaleMode - 1].Value = True + + Endif + + ButtonBox1.Text = Settings["FPreview/OutputFile"] + $hPrinter.Name = Settings["FPreview/Printer"] + If Settings["FPreview/PrintToFile"] = True Then TabPanel1.Index = 1 + + Try $hPrinter.Duplex = Settings["FPreview/Duplex"] + Try $hPrinter.GrayScale = Settings["FPreview/GrayScale"] + Try $hPrinter.ReverseOrder = Settings["FPreview/ReverseOrder"] + Try $hPrinter.CollateCopies = Settings["FPreview/CollateCopies"] + + Endif + + For Each s In Printer.List + cmbPrinter.Add(s) + Next + + SelectPrinter($hPrinter.Name) + Button1.Tag = False + +End + +Private Sub SelectPrinter(Optional sName As String) + + If sName Then + $hPrinter.Name = sName + Object.Lock(cmbPrinter) + Try cmbPrinter.Index = cmbPrinter.List.Find(sName) + Object.Unlock(cmbPrinter) + Else + $hPrinter.Name = Printer.Default + Object.Lock(cmbPrinter) + cmbPrinter.Index = cmbPrinter.List.Find(Printer.Default) + Object.Unlock(cmbPrinter) + Endif + + 'NOTE: force the printer fullpage mode because it make error on report placement + $hPrinter.FullPage = True + + tgbGrayScale.Value = $hPrinter.GrayScale + tgbFullPage.Value = $hPrinter.FullPage + tgbReverseCopies.Value = $hPrinter.ReverseOrder + tgbCollateCopies.Value = $hPrinter.CollateCopies + +End + +Public Sub SetReport(hReport As Report) + + View.Report = hReport + GetValuesFromReport() + +End + +Private Sub GetValuesFromReport() + + cmbPaper.Index = View.Report.Paper + $hPrinter.Orientation = View.Report.Orientation + + If View.Report.Paper = Printer.Custom Then + pnlCustom.Enabled = True + $hPrinter.PaperWidth = TSizeParse[View.Report.Width].ToCm() * 10 + $hPrinter.PaperHeight = TSizeParse[View.Report.Height].ToCm() * 10 + Else + $hPrinter.Paper = View.Report.Paper + Endif + + cmbOrientation.Index = $hPrinter.Orientation + cmbDuplex.Index = $hPrinter.Duplex + cmbPaper.Index = $hPrinter.Paper + Object.Lock(spWidth) + spWidth.Value = $hPrinter.PaperWidth + Object.Unlock(spWidth) + Object.Lock(spHeight) + spHeight.Value = $hPrinter.PaperHeight + Object.Unlock(spHeight) + +End + +Public Sub Slider1_Change() + + Dim hButton As ToolButton + + View.Scale = Slider1.Value / 100 + lblZoom.Text = Str(Slider1.Value) & " %" + bFlag = True + For Each hButton In $aModeButtons + hButton.Value = False + Next + + bFlag = False + +End + +Public Sub View_Change() + + Object.Lock(Slider1) + Slider1.Value = View.Scale * 100 + Object.Unlock(Slider1) + lblZoom.Text = Str(Slider1.Value) & " %" + +End + +Public Sub Mode_Click() + + Dim hButton As ToolButton + Dim hCurButton As ToolButton + + If bFlag Then Return + bFlag = True + hCurButton = Last + + For Each hButton In $aModeButtons + If hButton = hCurButton Then + hButton.Value = True + Else + hButton.Value = False + Endif + Next + + bFlag = False + + View.ScaleMode = hCurButton.Tag + +End + +Public Sub tgbGrayScale_Click() + + Last.Background = IIf(Last.Value, Color.Gray, Color.Default) + $hPrinter.GrayScale = Last.Value + View._GrayScale = Last.Value + +End + +Public Sub tgbFullPage_Click() + + Last.Background = IIf(Last.Value, Color.Gray, Color.Default) + $hPrinter.FullPage = Last.Value + +End + +Public Sub tgbReverseCopies_Click() + + Last.Background = IIf(Last.Value, Color.Gray, Color.Default) + $hPrinter.ReverseOrder = Last.value + +End + +Public Sub tgbCollateCopies_Click() + + Last.Background = IIf(Last.Value, Color.Gray, Color.Default) + $hPrinter.CollateCopies = Last.Value + +End + +Public Sub cmbOrientation_Click() + + If View.Report.Orientation = Last.Index Then Return + View.Report.Orientation = Last.Index + 'View.Report.Refresh + View.Refresh + GetValuesFromReport + +End + +Public Sub cmbPaper_Click() + + Dim i As Integer = Last.Index + 'Print "id "; View.Report.paper + If View.Report.Paper = i Then Return + View.Report.Paper = i + If i = 0 Then + pnlCustom.Enabled = True + Else + pnlCustom.Enabled = False + View.Refresh + GetValuesFromReport + Endif + +End + +Public Sub cmbDuplex_Click() + + $hPrinter.Duplex = Last.index + +End + +Public Sub ButtonBox1_Click() + + Dialog.Path = User.Home + Dialog.Filter = ["*.pdf", "Pdf", "*.ps", "Postscript"] + If Not Dialog.saveFile() Then + ButtonBox1.Text = Dialog.Path + $hPrinter.OutputFile = Dialog.Path + Endif + +End + +Public Sub TabPanel1_Click() + + If TabPanel1.Index = 0 Then + $hPrinter.OutputFile = "" + $hPrinter.Name = cmbPrinter.Text + $iCurPrinterResolution = $hPrinter.Resolution + Else + $hPrinter.OutputFile = ButtonBox1.Text + $hPrinter.Resolution = 600 + Endif + +End + +Public Sub TextBox1_Change() + + View.Range = Last.Text + +End + +Public Sub TextBox1_Click() + + Last.Text = "" + +End + +Public Sub spWidth_Change() + + View.Report.Width = Str(Last.Value) & "mm" + View.Refresh + +End + +Public Sub spHeight_Change() + + View.Report.Height = Str(Last.Value) & "mm" + View.Refresh + +End + +Public Sub Button2_Click() + + View._ForceLayout + +End + +Public Sub cmbPrinter_Click() + + SelectPrinter(Last.Text) + +End + +Public Sub Button1_Click() + + Dim iReturn As Integer + + If Button1.Tag Then + $hPrinter.Cancel + Button1.Tag = False + + Else + If Not View.Report Then Return + If TabPanel1.Index = 1 Then + If $hPrinter.OutputFile Then + If Exist($hPrinter.OutputFile) Then + iReturn = Message.Warning("This file already exist.\nDo you want to replace it ?", "Yes", "No") + If iReturn = 2 Then + ButtonBox1.SetFocus + + Return + Endif + Endif + Else + ButtonBox1_Click + Return + Endif + + Endif + Button1.Tag = True + Button1.Picture = Picture["icon:/22/cancel"] + Button1.Text = ("Cancel") + + $hPrinter.Print + Endif + +End + +Public Sub Printer_Begin() + + hbZoom.Hide + hbPrinting.Show + Inc Application.Busy + ProgressBar1.Value = 0 + ProgressBar1.Pulse = True + lblPrint.Text = ("Layout...") + +End + +Public Sub Printer_Paginate() + + If View.Report._LayoutNotFinished Then + View.LockLayout + View.Report._Layout(View.Report.PageCount) + Else + $hPrinter.Count = View.PageCount + ProgressBar1.Pulse = False + lblPrint.Text = ("Printing...") + View.UnlockLayout + Endif + +End + +Public Sub Printer_Draw() + + If View._RangePages.Count = 0 Then + View.Report.Paint($hPrinter.Page) + Else + View.Report.Paint(View._RangePages[$hPrinter.Page - 1]) + Endif + ProgressBar1.Value = $hPrinter.Page / View.PageCount + +End + +Public Sub Printer_End() + + 'View.UnlockLayout + hbPrinting.Hide + hbZoom.Show + Dec Application.Busy + Button1.Picture = Picture["icon:/22/print"] + Button1.Text = ("Print") + Button1.Tag = False + +End + +Public Sub Panel12_MouseDown() + +End + +Public Sub ButtonBox1_Change() + + $hPrinter.OutputFile = Last.Text + +End + +Public Sub TextBox2_Change() + + $hPrinter.NumCopies = Last.Value + +End + +Public Sub Form_Close() + + If Component.IsLoaded("gb.settings") Then + 'Settings.Write(Me, "FPreview") + Settings.Write(View, "View") + Settings["FPreview/OutputFile"] = ButtonBox1.Text + Settings["FPreview/Printer"] = $hPrinter.Name + Settings["FPreview/PrintToFile"] = TabPanel1.Index = 1 + Settings["FPreview/Duplex"] = cmbDuplex.Index + Settings["FPreview/GrayScale"] = tgbGrayScale.Value + Settings["FPreview/ReverseOrder"] = tgbReverseCopies.Value + Settings["FPreview/CollateCopies"] = tgbCollateCopies.Value + + Settings.Save() + Endif + +End diff --git a/comp/src/gb.report/.src/Preview/FPreview.form b/comp/src/gb.report/.src/Preview/FPreview.form new file mode 100644 index 00000000..246d5ba0 --- /dev/null +++ b/comp/src/gb.report/.src/Preview/FPreview.form @@ -0,0 +1,275 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,114.2857,85.7143) + Text = ("Report preview") + Arrangement = Arrange.Vertical + { Panel4 HBox + MoveScaled(1,1,138,86) + Expand = True + { Panel1 VBox + MoveScaled(0,0,73,84) + Expand = True + { View ReportView + MoveScaled(2,0,70,65) + Background = Color.LightForeground + Tag = "3" + Expand = True + } + { hbPrinting HBox + MoveScaled(1,70,71,4) + Visible = False + { Panel18 Panel + MoveScaled(-1,0,19,3) + Expand = True + Arrangement = Arrange.Horizontal + } + { lblPrint Label + MoveScaled(23,0,11,3) + Text = ("Printing...") + } + { ProgressBar1 ProgressBar + MoveScaled(34,0,37,4) + } + } + { hbZoom HBox + MoveScaled(1,80,73,4) + { Panel2 Panel + MoveScaled(-1,0,19,3) + Expand = True + Arrangement = Arrange.Horizontal + { ToolButton1 ToolButton Mode + Name = "ToolButton1" + MoveScaled(0,0,4,4) + Tag = "1" + ToolTip = ("One page") + Picture = Picture["img/22/OnePage.png"] + Toggle = True + Value = True + } + { ToolButton2 ToolButton Mode + Name = "ToolButton2" + MoveScaled(4,0,4,4) + Tag = "2" + ToolTip = ("Two pages") + Picture = Picture["img/22/TwoPage.png"] + Toggle = True + } + { ToolButton4 ToolButton Mode + Name = "ToolButton4" + MoveScaled(8,0,4,4) + Tag = "3" + ToolTip = ("Full width") + Picture = Picture["img/22/FullWidth.png"] + Toggle = True + } + { ToolButton3 ToolButton Mode + Name = "ToolButton3" + MoveScaled(12,0,4,4) + Tag = "4" + ToolTip = ("Real size") + Picture = Picture["img/22/RealSize.png"] + Toggle = True + } + } + { Slider1 Slider + MoveScaled(36,0,26,4) + MinValue = 12 + MaxValue = 200 + } + { lblZoom Label + MoveScaled(63,1,8,2) + Alignment = Align.Center + } + } + } + { Separator1 Separator + MoveScaled(74,23,0,15) + } + { VBox1 VBox + MoveScaled(75,2,38,83) + Spacing = True + Margin = True + { TabPanel1 TabPanel + MoveScaled(0,-1,36,19) + Count = 2 + Index = 0 + Text = ("Printer") + { PictureBox1 PictureBox + MoveScaled(1,1,7,7) + Picture = Picture["icon:/48/printer"] + } + { cmbPrinter ComboBox + MoveScaled(1,9,34,4) + ReadOnly = True + } + Index = 1 + Text = ("File") + { PictureBox2 PictureBox + MoveScaled(1,1,7,7) + Picture = Picture["icon:/48/pdf"] + } + { ButtonBox1 ButtonBox + MoveScaled(1,9,34,4) + Picture = Picture["icon:/16/open"] + } + Index = 0 + } + { Panel14 HBox + MoveScaled(1,20,36,4) + { Label10 Label + MoveScaled(0,0,12,4) + Text = ("Orientation") + } + { cmbOrientation ComboBox + MoveScaled(14,0,21,4) + ReadOnly = True + List = [("Portrait"), ("Landscape")] + } + } + { Panel8 HBox + MoveScaled(1,24,36,4) + { Label3 Label + MoveScaled(0,0,12,4) + Text = ("Paper") + } + { cmbPaper ComboBox + MoveScaled(13,0,21,4) + ReadOnly = True + List = [("Custom"), ("A3"), ("A4"), ("A5"), ("B5"), ("Letter"), ("Executive"), ("Legal")] + } + } + { pnlCust Panel + MoveScaled(2,30,35,16) + { pnlCustom Panel + MoveScaled(2,0,31,15) + Enabled = False + Border = Border.Etched + { Label5 Label + MoveScaled(3,2,8,4) + Text = ("Width") + } + { spWidth SpinBox + MoveScaled(11,2,13,4) + MaxValue = 1000 + } + { Label7 Label + MoveScaled(24,2,4,4) + Text = ("mm") + } + { Label6 Label + MoveScaled(3,9,8,4) + Text = ("Height") + } + { spHeight SpinBox + MoveScaled(11,9,13,4) + MaxValue = 1000 + } + { Label8 Label + MoveScaled(24,9,4,4) + Text = ("mm") + } + } + } + { Panel11 Panel + MoveScaled(2,46,35,3) + Expand = True + } + { Panel16 VBox + MoveScaled(2,48,37,12) + Spacing = True + { Panel7 HBox + MoveScaled(0,1,36,4) + { Label2 Label + MoveScaled(0,0,15,4) + Text = ("Recto Verso") + } + { cmbDuplex ComboBox + MoveScaled(16,0,20,4) + ReadOnly = True + List = [("None"), ("Short side"), ("Long side")] + } + } + { HBox3 HBox + MoveScaled(-1,6,35,6) + Spacing = True + { Panel13 Panel + MoveScaled(1,1,3,4) + Expand = True + } + { tgbGrayScale ToggleButton + MoveScaled(5,0,6,6) + ToolTip = ("Gray Scale") + Picture = Picture["img/32/grayscale.png"] + } + { tgbFullPage ToggleButton + MoveScaled(11,0,6,6) + Visible = False + ToolTip = ("Full Page") + Picture = Picture["img/32/Empty.png"] + } + { tgbReverseCopies ToggleButton + MoveScaled(17,0,6,6) + ToolTip = ("Reverse order") + Picture = Picture["img/32/reverse.png"] + } + { tgbCollateCopies ToggleButton + MoveScaled(24,0,6,6) + ToolTip = ("Collate copies") + Picture = Picture["img/32/Collatecopie.png"] + } + { Panel15 Panel + MoveScaled(32,2,3,3) + Expand = True + } + } + } + { Panel12 Panel + MoveScaled(2,57,35,5) + Expand = True + } + { Panel6 HBox + MoveScaled(2,61,36,4) + { Label1 Label + MoveScaled(0,0,17,4) + Text = ("Range") + } + { TextBox1 ButtonBox + MoveScaled(17,0,18,4) + Picture = Picture["icon:/16/clear"] + } + } + { HBox1 HBox + MoveScaled(2,66,34,4) + { Label4 Label + MoveScaled(0,0,15,4) + Text = ("Copies") + } + { TextBox2 SpinBox + MoveScaled(15,0,12,4) + MinValue = 1 + Value = 1 + } + } + { Panel5 Panel + MoveScaled(2,71,33,2) + } + { HBox2 HBox + MoveScaled(2,75,33,6) + { Panel10 Panel + MoveScaled(2,1,10,3) + Expand = True + } + { Button1 Button + MoveScaled(7,0,22,6) + Text = ("Print") + Picture = Picture["icon:/22/print"] + } + { Panel9 Panel + MoveScaled(24,4,10,3) + Expand = True + } + } + } + } +} diff --git a/comp/src/gb.report/.src/Preview/FPrint.class b/comp/src/gb.report/.src/Preview/FPrint.class new file mode 100644 index 00000000..cea78187 --- /dev/null +++ b/comp/src/gb.report/.src/Preview/FPrint.class @@ -0,0 +1,37 @@ +' Gambas class file + + +Public Sub Form_Open() +Dim hprinter As New Printer + +Dim sPrinter As String + For Each sPrinter In Printer.List + ListView1.Add(sPrinter, sPrinter, IIf(sPrinter = Printer.Default, Picture["icon:/16/ok"], Picture["icon:/16/printer"])) + If sPrinter = Printer.Default Then ListView1[sPrinter].RichText = "" & sPrinter & "" + Next + +' hprinter.FirstPage +' hprinter.LastPage +' hprinter.NumCopies +' hprinter.Orientation +' hprinter.Page +' hprinter.Paper +' hprinter.PaperHeight +' hprinter.PaperWidth +' + +' hprinter.ReverseOrder + 'hprinter.GrayScal +' hprinter.FullPage +' hprinter.OutputFile + 'hprinter.CollateCopie +' hprinter.ReverseOrder + + +End + +Public Sub Panel6_Show() + + Me.Refresh + +End diff --git a/comp/src/gb.report/.src/Preview/FPrint.form b/comp/src/gb.report/.src/Preview/FPrint.form new file mode 100644 index 00000000..c9a09105 --- /dev/null +++ b/comp/src/gb.report/.src/Preview/FPrint.form @@ -0,0 +1,132 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,81,67) + Text = ("Printer Config") + Resizable = False + Arrangement = Arrange.Horizontal + AutoResize = True + Spacing = True + Margin = True + { Panel3 VBox + MoveScaled(3,4,53,60) + Expand = True + AutoResize = True + Spacing = True + Padding = 20 + { ListView1 ListView + MoveScaled(0,0,52,20) + } + { Panel6 Expander + MoveScaled(1,21,51,37) + Text = ("More...") + Hidden = True + { Panel7 VBox + MoveScaled(1,2,44,32) + Spacing = True + Padding = 20 + { HBox3 HBox + MoveScaled(1,2,50,4) + { Label8 Label + MoveScaled(1,1,18,3) + Text = ("Range") + } + { Panel10 Panel + MoveScaled(15,1,12,3) + Expand = True + } + { TextBox1 TextBox + MoveScaled(19,0,22,4) + } + } + { HBox1 HBox + MoveScaled(2,8,50,4) + { Label1 Label + MoveScaled(1,1,18,3) + Text = ("RectoVerso") + } + { Panel5 Panel + MoveScaled(15,1,12,3) + Expand = True + } + { ComboBox1 ComboBox + MoveScaled(20,1,18,3) + ReadOnly = True + List = [("None"), ("Long side"), ("Short side")] + } + } + { HBox2 HBox + MoveScaled(2,13,50,4) + { Label3 Label + MoveScaled(1,1,18,3) + Text = ("Paper") + } + { Panel8 Panel + MoveScaled(15,1,12,3) + Expand = True + } + { cmbPaper ComboBox + MoveScaled(20,1,18,3) + ReadOnly = True + List = [("None"), ("Long side"), ("Short side")] + } + } + { Panel9 Panel + MoveScaled(2,19,40,11) + Border = Border.Etched + { Label4 Label + MoveScaled(1,1,13,3) + Text = ("Width") + } + { Label5 Label + MoveScaled(23,1,13,3) + Text = ("Height") + } + { SpinBox2 SpinBox + MoveScaled(1,4,13,4) + } + { SpinBox3 SpinBox + MoveScaled(23,4,13,4) + } + { Label6 Label + MoveScaled(14,4,4,4) + Text = ("mm") + } + { Label7 Label + MoveScaled(36,4,4,4) + Text = ("mm") + } + } + } + } + } + { Separator1 Separator + MoveScaled(58,4,1,16) + } + { Panel1 VBox + MoveScaled(61,6,17,45) + { Button1 Button + MoveScaled(0,0,16,16) + Picture = Picture["icon:/64/printer"] + } + { Panel4 Panel + MoveScaled(1,16,14,5) + } + { Label2 Label + MoveScaled(1,21,10,2) + Text = ("Copies :") + } + { SpinBox1 SpinBox + MoveScaled(0,23,16,4) + } + { Panel2 Panel + MoveScaled(2,30,12,6) + Expand = True + } + { Button2 Button + MoveScaled(2,38,15,5) + Text = Shortcut(("Cancel"), "C") + Picture = Picture["icon:/22/cancel"] + } + } +} diff --git a/comp/src/gb.report/.src/Preview/Form1.class b/comp/src/gb.report/.src/Preview/Form1.class new file mode 100644 index 00000000..126ad137 --- /dev/null +++ b/comp/src/gb.report/.src/Preview/Form1.class @@ -0,0 +1,30 @@ +' Gambas class file + + +Public Sub Form_Open() +Dim hreport As New Report4 + ReportView1.Report = hreport +Slider1.Value = ReportView1.Scale * 100 + +End + +Public Sub Slider1_Change() + + ReportView1.Scale = Last.value / 100 + ReportView1.Refresh + +End + +Public Sub ReportView1_Change() + + Object.Lock(Slider1) + Slider1.Value = Last.Scale * 100 + If ReportView1.ScaleMode = ReportView.Custom Then lblCustom.Value = True + Object.Unlock(Slider1) +End + +Public Sub Radio_Click() + + ReportView1.ScaleMode = Last.tag + +End diff --git a/comp/src/gb.report/.src/Preview/Form1.form b/comp/src/gb.report/.src/Preview/Form1.form new file mode 100644 index 00000000..5253ab7c --- /dev/null +++ b/comp/src/gb.report/.src/Preview/Form1.form @@ -0,0 +1,59 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,113,64) + Arrangement = Arrange.Horizontal + { Panel1 Panel + MoveScaled(2,1,68,51) + Expand = True + Arrangement = Arrange.Vertical + { ReportView1 ReportView + MoveScaled(0,0,48,40) + Expand = True + } + { Slider1 Slider + MoveScaled(8,46,59,4) + MaxValue = 200 + } + } + { PictureBox1 PictureBox + MoveScaled(72,30,8,8) + Background = Color.SelectedForeground + Picture = Picture["icon:/16/printer"] + Alignment = Align.Center + } + { PictureBox2 PictureBox + MoveScaled(74,11,14,14) + Background = Color.SelectedForeground + Picture = Picture["icon:/22/file"] + Alignment = Align.Center + } + { VBox1 VBox + MoveScaled(86,1,25,59) + { RadioButton1 RadioButton Radio + Name = "RadioButton1" + MoveScaled(2,2,27,4) + Tag = "0" + Text = ("One Page") + Value = True + } + { RadioButton2 RadioButton Radio + Name = "RadioButton2" + MoveScaled(2,7,27,4) + Tag = "1" + Text = ("Two Page") + } + { RadioButton3 RadioButton Radio + Name = "RadioButton3" + MoveScaled(3,12,24,4) + Tag = "2" + Text = ("FullWidth") + } + { lblCustom RadioButton Radio + Name = "lblCustom" + MoveScaled(2,16,25,4) + Tag = "3" + Text = ("Custom") + } + } +} diff --git a/comp/src/gb.report/.src/Preview/ReportView.class b/comp/src/gb.report/.src/Preview/ReportView.class new file mode 100644 index 00000000..0d157ae5 --- /dev/null +++ b/comp/src/gb.report/.src/Preview/ReportView.class @@ -0,0 +1,709 @@ +' Gambas class file + +Export + +Inherits UserControl +Public Const _IsControl As Boolean = True +Public Const _IsContainer As Boolean = False +'Public Const _Properties As String = "Left{ReportCoord},Top{ReportCoord},Width{ReportCoord},Height{ReportCoord},Brush{ReportBrush},Visible=True,Fixed,Font,Padding,Ignore,Expand,AutoResize,Tag,Range" +'Public Const _Family As String = "Report" + + + +Private $View As ScrollArea +Private $hReport As Report +Private $fScale As Float = 1.0 +Private fReportWidthCm As Float +Private fReportHeightCm As Float +Private $iNbrePage As Integer +Private $iTotNbrePage As Integer +Private $iNbrePageByLine As Integer +Private $fPageWidth As Float +Private $fPageHeight As Float +Property {Report} As Report +Private $fSpace As Float +Property Scale As Float +Property _GrayScale As Boolean +Private $bGrayScale As Boolean +Property Settings As Variant[] + + +Private $fRealPageHeight As Float +Private $fRealPageWidth As Float +Private $fRealSpace As Float + +Private $cBuffer As New Collection +Private $aImageToLoad As New Integer[] +Private $aImageLoaded As New Integer[] + +Private $aTask As New ReportViewTask[8] +Private $Timer As New Timer As "Timer" +Private $tmrRedraw As New Timer As "tmrRedraw" +Private $hSpinner As Spinner +Property Read LayoutInProgress As Boolean +Private $bLayoutInProgress As Boolean +Private htmpImage As New Image(1, 1) +Private $bLayoutEnd As Boolean +Private bNeedToLoad As Boolean = True +Private $iMinLine As Integer +Private $iMaxLine As Integer +Private $iFirstPage As Integer +Private $iLastPage As Integer +Private $iRealCenter As Integer + +Public Const Custom As Integer = 0 +Public Const Page As Integer = 1 +Public Const DualPage As Integer = 2 +Public Const FullWidth As Integer = 3 +Public Const RealSize As Integer = 4 + +Property ScaleMode As Integer +Private $iScaleMode As Integer = Me.Custom +Private $fCurScale As Float = 1.0 +Private $bForceReload As Boolean +Property ShowPageNumbers As Boolean +Property Range As String +Private $sRange As String +Public _RangePages As New Integer[] +Private $bShowPageNumbers As Boolean +Property Read Count As Integer +' Property Read Status As Integer +' Private $iStatus As Integer + +Private $bLayoutLocked As Boolean + +Property Read PageCount As Integer + +Event Progress +Event Change +Event Layout(LayoutInProgress As Boolean) +Private $bLayout As Boolean +Private $MX As Integer +Private $MY As Integer +Public Sub _new(Optional hReport As Report) + + If hReport Then Me.Report = hReport + '$hReport = hReport + $fCurScale = 0.3 + $fRealSpace = 2 * Desktop.Resolution / 2.54 + + $Timer.Delay = 5 + $View = New ScrollArea(Me) As "View" + $View.ScrollBar = Scroll.Both + 'If Not $hReport Then $view.Enabled = False + '$View.Background = Color.Red + +End + +Public Sub Timer_Timer() + + Dim hImg As New Image($fPageWidth, $fPageHeight, Color.White) + 'Dim hSvg As New SvgImage($fRealPageWidth, $fRealPageHeight) + Dim i As Integer + Dim aDiff As Integer[] + + If $bLayoutLocked Then + $Timer.Stop + Return + Endif + + If $aImageToLoad.Count > 0 Then + i = $aImageToLoad.Pop() + 'If $aImageLoaded.Exist(i) Then Return + 'Print "load : "; i + Paint.Begin(hImg) + ReportUnits._Scale = $fCurScale + Paint.Scale($fCurScale, $fCurScale) + + If _RangePages.Count > 0 Then + + $hReport.Paint(_RangePages[i - 1]) + Else + + $hReport.Paint(i) + + Endif + ReportUnits._Scale = 1.0 + + Paint.End + + ' Paint.Begin(hImg) + ' hsvg.Paint() + ' Paint.End + + If $bGrayScale Then hImg = hImg.Desaturate() + If Not $aImageLoaded.Exist(i) Then $aImageLoaded.Add(i) + $cBuffer[i] = hImg + $bLayoutInProgress = $hReport._LayoutNotFinished + $tmrRedraw.Trigger + + Else + + If $bLayoutInProgress Then + Raise Layout(True) + Paint.Begin(htmpImage) + 'Print "Layout : "; $hReport.PageCount + $hReport._layout($hReport.PageCount) + Paint.End + $iTotNbrePage = $hReport.PageCount + $bLayoutInProgress = $hReport._LayoutNotFinished + Layout + Else + If Not $bLayoutEnd Then + $cBuffer.Clear + $aImageLoaded.Clear + $aImageToLoad.Clear + $Timer.Stop + $bLayoutEnd = True + Layout + $tmrRedraw.Trigger + Raise Layout(False) + Else + $Timer.Stop + Endif + Endif + Endif + +End + +Public Sub tmrRedraw_Timer() + + $View.Refresh + +End + +Public Sub View_Draw() + + Dim i, j, iline As Integer + Dim X As Integer + Dim Y As Integer + Dim hImg As Image + Dim bBreak As Boolean + Dim aDiff As Integer[] + Dim iTextWidth As Integer + Dim sText As String + If Not $hReport Then Return + Paint.Scale($fCurScale, $fCurScale) + i = $iFirstPage + iline = $iMinLine + '$aImageToLoad.Clear + 'PrintIArray($aImageLoaded) + 'Print $aImageLoaded.Count + + Do + + For j = 0 To $iNbrePageByLine - 1 + + X = $iRealCenter + $fRealSpace + (($fRealPageWidth + $fRealSpace) * j) - $View.ScrollX / $fCurScale + Y = $fRealSpace + (($fRealPageHeight + $fRealSpace) * iline) - $View.ScrollY / $fCurScale + + Paint.Rectangle(X + 10, Y + 10, $fRealPageWidth, $fRealPageHeight) + Paint.Brush = Paint.Color(&HA0000000) + Paint.Fill + Paint.Rectangle(X, Y, $fRealPageWidth, $fRealPageHeight) + Paint.LineWidth = 2 + Paint.Brush = Paint.Color(Color.Black) + Paint.Stroke(True) + Paint.Brush = Paint.Color(Color.White) + Paint.Fill + + hImg = $cBuffer[i + 1] + + If hImg Then Draw.Image(hImg, X, Y, $fRealPageWidth, $fRealPageHeight) + + If $bShowPageNumbers Then + Paint.Font.size = 200 + Paint.Font.Bold = True + Paint.Brush = Paint.Color(Color.SetAlpha(Color.Gray, 128)) + Paint.Text(i + 1, X, Y, $fRealPageWidth, $fRealPageHeight, Align.Center) + Paint.Fill + Endif + Inc i + + If i >= $iLastPage + 1 Then + bBreak = True + Break + Endif + Next + + + + If bBreak Then Break + Inc iline + + Loop + 'Draw.Background = Color.Yellow + Paint.Reset + sText = Str($iFirstPage + 1) & "/" & Str($iNbrePage) + iTextWidth = Paint.TextSize(sText).Width + 10 + Paint.Rectangle(Paint.Width - iTextWidth - 10, 10, iTextWidth, 25, 5) + Paint.Brush = Paint.Color(Color.SetAlpha(Color.DarkGray, 125)) + Paint.Fill(True) + Paint.Brush = Paint.Color(Color.DarkGray) + Paint.Stroke + Paint.Brush = Paint.Color(Color.White) + Paint.Font.Bold = True + Paint.Text(sText, Paint.Width - iTextWidth - 10, 10, iTextWidth, 25, Align.Center) + Paint.fill + 'Draw.FillRect(Paint.Width - 50, 10 + (Paint.h - 40) * $View.scrolly / $View.ScrollH, 40, 25, Color.Yellow) + + + bNeedToLoad = False + +End + +Private Function GetDiffArray(Array1 As Integer[], Array2 As Integer[]) As Integer[] + + Dim aRet As New Integer[] + Dim i As Integer + + For Each i In Array2 + If Array1.Exist(i) Then Continue + aRet.Add(i) + Next + Return aRet + +End + +Public Function MakePageImage(Index As Integer) As Image + + Dim hImg As New Image($fRealPageWidth, $fRealPageHeight, Color.White) + Dim hSvg As New SvgImage($fRealPageWidth, $fRealPageHeight) + + Paint.Begin(hsvg) + $hReport.Paint(Index) + Paint.End + + Paint.Begin(hImg) + Paint.Scale($fCurScale, $fCurScale) + hsvg.Paint + Paint.End + + Return hImg + +End + +Public Sub View_Arrange() + + Layout + Raise Change + +End + +Private Sub Layout() + + Dim iH, iW, iiS As Integer + Dim $atmpA As New Integer[] + Dim i As Integer + Dim OldScale As Float = $fCurScale + If Not $hReport Then Return + If _RangePages.Count > 0 Then + $iNbrePage = _RangePages.Count + Else + $iNbrePage = $iTotNbrePage + Endif + $iNbrePageByLine = 0 + $aImageToLoad.Clear + 'Dim hImg As New Image($fRealPageWidth, $fRealPageHeight) + $fRealPageWidth = fReportWidthCm * Desktop.Resolution / 2.54 '* $fCurScale + $fRealPageHeight = fReportHeightCm * Desktop.Resolution / 2.54 '* $fCurScale + 'Print $iNbrePage + 'Paint.Begin(hImg) + + 'Paint.Scale($fCurScale, $fCurScale) + '$hReport._Layout(1) + 'Paint.End + '$iNbrePage = 200 + 'If Error Then Return + Select Case $iScaleMode + Case Me.Page + $fCurScale = $View.ClientHeight / ($fRealPageHeight + $fRealSpace * 2) + $iNbrePageByLine = 1 + Case Me.DualPage + $fCurScale = Min($View.ClientWidth / ($fRealPageWidth * 2 + $fRealSpace * 3), $View.ClientHeight / ($fRealPageHeight + $fRealSpace * 2)) + $iNbrePageByLine = 2 + Case Me.FullWidth + $fCurScale = $View.ClientWidth / ($fRealPageWidth + $fRealSpace * 2) + Case Custom + $fCurScale = $fScale + Case RealSize + $fCurScale = 1 + End Select + + If OldScale <> $fCurScale Then $bForceReload = True + + bNeedToLoad = True + $fPageHeight = Max($fRealPageHeight * $fCurScale, 1) + $fPageWidth = Max($fRealPageWidth * $fCurScale, 1) + $fSpace = Max($fRealSpace * $fCurScale, 1) + If Not $iNbrePageByLine Then $iNbrePageByLine = Max(Floor(($View.ClientWidth - $fSpace) / ($fPageWidth + $fSpace)), 1) + + $iMinLine = FindPageLineByPos($fSpace + $View.ScrollY) - 1 + $iMaxLine = Max(1, FindPageLineByPos($View.ClientHeight + $View.ScrollY)) + 'Print $iMinLine, $iMaxLine + $iFirstPage = $iMinLine * $iNbrePageByLine + $iLastPage = Min($iMaxLine * $iNbrePageByLine, $iNbrePage - 1) + If $iNbrePageByLine <= $iNbrePage Then + $iRealCenter = ($View.ClientWidth - ($fSpace + ($fPageWidth + $fSpace) * $iNbrePageByLine)) / 2 / $fCurScale + Else + $iRealCenter = 0 + Endif + 'Calcule des images a charger + + 'Print "Afficher pages de: "; $iFirstPage + 1; " à "; $iLastPage + 1 + 'PrintCol + ' Print "Pages chargées: " + ' PrintIArray($aImageLoaded) + For i = 0 To $aImageLoaded.Max + + If $aImageLoaded[i] < $iFirstPage Or If $aImageLoaded[i] > $iLastPage + 1 Then + 'Print "supprimer : " & i + $cBuffer[$aImageLoaded[i]] = Null + 'Print "Efface : "; $aImageLoaded[i] + Else + $atmpA.Add($aImageLoaded[i]) + Endif + + Next + + $aImageLoaded = $atmpA + 'If not forcing consign is given + 'Add only the not load page to the loading queue + For i = $iFirstPage To $iLastPage + If Not $bForceReload And If $aImageLoaded.Exist(i + 1) Then + Continue + Else + $aImageToLoad.Add(i + 1) + Endif + Next + + If $bForceReload Then $bForceReload = False + + ' Print "Pages à charger: " + ' PrintIArray($aImageToLoad) +' Print + If Not $Timer.Enabled And If $aImageToLoad.Count > 0 Then + $aImageToLoad = $aImageToLoad.Reverse() + $Timer.Start + Endif + $View.ResizeContents(Max($View.ClientWidth, ($fPageWidth + 2 * $fSpace)), $fSpace + Ceil($iNbrePage / $iNbrePageByLine) * ($fPageHeight + $fSpace)) + '$View.ScrollX = Max($View.ClientWidth, ($fPageWidth + 2 * $fSpace)) / 8 +End + +Public Sub View_MouseWheel() + + If Mouse.Control Then + Stop Event + Me.Scale += (Mouse.Delta * 0.1) + Endif +End + + + +Public Sub View_Scroll() + + '$aImageToLoad.Clear + 'bNeedToLoad = True + '$cBuffer.Clear + '$aImageLoaded.Clear + $Timer.Stop + Layout + +End + +Private Sub FindPageLineByPos(Y As Integer) As Integer + + Dim yPage As Integer + Dim i As Integer + + For i = 1 To Ceil($iNbrePage / $iNbrePageByLine) + yPage = $fSpace + ($fPageHeight + $fSpace) * (i - 1) + 'If i = 3 Then Stop + If Y >= yPage And If Y <= (yPage + $fPageHeight + $fSpace) Then Return i + Next + Return -1 + +End + +Private Function Scale_Read() As Float + + Return $fCurScale + +End + +Private Sub Scale_Write(Value As Float) + + $fScale = Max(0.1, Min(2, Value)) + + '$cBuffer.Clear + $bForceReload = True + '$aImageLoaded.Clear + $iScaleMode = Me.Custom + Layout + +End + +Private Function Report_Read() As Report + + Return $hReport + +End + +Private Sub Report_Write(Value As Report) + + Dim hSizeParse As TSizeParse + + If Not Value Then Return + $hReport = Value + '$hReport.Orientation = Printer.Landscape + Paint.Begin(htmpImage) + $hReport._Layout(0) + Paint.End + + $iTotNbrePage = $hReport.PageCount + $bLayoutInProgress = $hReport._LayoutNotFinished + $bLayoutEnd = False + fReportWidthCm = TSizeParse[$hReport.Width].ToCm() + fReportHeightCm = TSizeParse[$hReport.Height].ToCm() + Layout + '$view.Enabled = True + $tmrRedraw.Trigger + +End + +Public Sub View_MouseUp() + + 'Print FindPageByPos(Mouse.y) + +End + +Private Function LayoutInProgress_Read() As Boolean + + Return $bLayoutInProgress + +End + +Private Sub PrintIArray(Array1 As Integer[]) + + Dim i As Integer + + For Each i In Array1 + Print i; " "; + Next + Print "\n"; + +End + +Public Sub PrintCol() + + Dim o As Object + + Print "Collection: " + For Each o In $cBuffer + Print $cBuffer.Key; + + Next + Print "\n" + +End + +Private Function ScaleMode_Read() As Integer + + Return $iScaleMode + +End + +Private Sub ScaleMode_Write(Value As Integer) + + $iScaleMode = Value + $bForceReload = True + Layout + Raise change + $tmrRedraw.Trigger + +End + +Private Function GetScale() As Float + +End + +Private Sub SetCurScale(Value As Integer) + + If $fCurScale <> Value Then + $fCurScale = Value + $bForceReload = True + Endif + +End + +Private Function ShowPageNumbers_Read() As Boolean + + Return $bShowPageNumbers + +End + +Private Sub ShowPageNumbers_Write(Value As Boolean) + + $bShowPageNumbers = Value + $tmrRedraw.Trigger + +End + + +Public Sub Refresh() + $Timer.Stop + $aImageLoaded.Clear + $aImageToLoad.Clear + $cBuffer.Clear + $bLayoutEnd = False + $hReport.Refresh + Me.Report = Me.Report + +End + +Private Function _GrayScale_Read() As Boolean + + Return $bGrayScale + +End + +Private Sub _GrayScale_Write(Value As Boolean) + + If $bGrayScale = Value Then Return + $bGrayScale = Value + $cBuffer.Clear + $aImageLoaded.Clear + $aImageToLoad.Clear + $Timer.Stop + Layout + $tmrRedraw.Trigger + +End + +Private Function Range_Read() As String + + Return $sRange + +End + +Private Sub Range_Write(Value As String) + + $sRange = Value + SetRangePages + $Timer.Stop + $aImageLoaded.Clear + $aImageToLoad.Clear + $cBuffer.Clear + Layout +End + +Public Sub SetRangePages() + + Dim ars As String[] + Dim ars2 As String[] + Dim s As String + Dim iStart, iEnd, i As Integer + _RangePages.Clear + If Not $sRange Then Return + ars = Split($sRange, ";") + + For Each s In ars + If InStr(s, "-") Then + ars2 = Scan(s, "*-*") + iStart = CInt(Val(ars2[0])) + iEnd = Val(ars2[1]) + If iStart < 0 Or If iEnd < 0 Or If iEnd < iStart Then Goto Fin + If _RangePages.Count > 0 And If iStart < _RangePages[_RangePages.Max] Then Goto Fin + For i = iStart To iEnd + + _RangePages.Add(i) + + Next + Else + iStart = CInt(Val(s)) + If _RangePages.Count > 0 And If iStart < _RangePages[_RangePages.Max] Then Goto Fin + _RangePages.Add(iStart) + Endif + Next + Return +Catch +Fin: +'_RangePages.Clear + +End + + +Private Function PageCount_Read() As Integer + + Return $iNbrePage + +End + +Private Function Count_Read() As Integer + + Return $iTotNbrePage + +End + +Public Sub LockLayout() + + $bLayoutLocked = True + +End + + +Public Sub UnlockLayout() + + $bLayoutLocked = False + +End + +Public Sub _ForceLayout() + $Timer.Stop + Paint.Begin(htmpImage) + $hReport.Layout() + Paint.End + $iTotNbrePage = $hReport.PageCount + Layout +End + +Public Sub View_MouseDown() + + If Mouse.Left Then + $MX = Mouse.X + $MY = Mouse.Y + Endif + + +End + +Public Sub View_MouseMove() + + If Mouse.Left Then + 'Print $MX - Mouse.X + $View.ScrollX += $MX - Mouse.X + $MX = Mouse.X + + $View.ScrollY += $MY - Mouse.Y + $MY = Mouse.Y + + $tmrRedraw.Trigger + + Endif + +End + +Private Function Settings_Read() As Variant[] + + Return [$fScale, CVariant($iScaleMode)] + +End + +Private Sub Settings_Write(Value As Variant[]) + + $fScale = Value[0] + $iScaleMode = Value[1] + +Catch + +End diff --git a/comp/src/gb.report/.src/Preview/ReportViewTask.class b/comp/src/gb.report/.src/Preview/ReportViewTask.class new file mode 100644 index 00000000..22c0f6c0 --- /dev/null +++ b/comp/src/gb.report/.src/Preview/ReportViewTask.class @@ -0,0 +1,33 @@ +' Gambas class file + +Inherits Task +Private $hReport As Report + +Public Width As Integer +Public Height As Integer +Private Scale As Float +Public Page As Integer + +Public Sub _new(hReport As Report, iPage As Integer, fScale As Float, W As Integer, H As Integer) + + $hReport = hReport + Width = W + Height = H + Scale = fScale + Page = iPage +End + + +Public Sub Main() As Variant + + Dim hImage As New Image(Width, Height, Color.White) + + Paint.Begin(hImage) + Paint.Scale(Scale, Scale) + $hReport.Paint(page) + Paint.End + + Return hImage.Pixels + + +End diff --git a/comp/src/gb.report/.src/Report.class b/comp/src/gb.report/.src/Report.class new file mode 100644 index 00000000..644698d2 --- /dev/null +++ b/comp/src/gb.report/.src/Report.class @@ -0,0 +1,794 @@ +' Gambas class file + +Create Static +Export +Inherits ReportSection + +' For Stretch properties +Public Enum None, Proportional, Fill + +Public Const _Properties As String = "*,-Left,-Top,-Width,-Height,Count{Range:1;256}=1,Index,Text," +"Paper{Printer.A3;A4;A5;B5;Letter;Executive;Legal;Custom}=A4," +"Orientation{Printer.Portrait;Landscape}=Portrait" +Public Const _HiddenControls As String = "Report,ReportControl,ReportContainer,ReportFrame,ReportSection" +Public Const _IsForm As Boolean = True +Public Const _IsContainer As Boolean = True +Public Const _IsMultiContainer As Boolean = True +Public Const _DrawWith As String = "TabPanel" +Public Const _DefaultEvent As String = "Open" +Public _LayoutNotFinished As Boolean +Public _Container As ReportSection +'Public Constants +Public {Debug} As Boolean = False +Public _bInExec As Boolean +'Public _cPages As New Object[] + +Private $aSections As New TControl[] +Private iCurPage As Integer = 0 +Private $iPageCount As Integer = -1 +Private $bLayoutIsDirty As Boolean = True +Private $fScale As Float = 1.0 +Private $iIndex As Integer +Private $iResolution As Integer = -1 +Private $iCurSection As Integer +Private $iCurPage As Integer = -1 +Private $iPaper As Integer = 2 +Private $iOrientation As Integer +' Private $hPrinter As New Printer As "Printer" +Private $bOpened As Boolean + +' Property Read Printer As Printer +Property Resolution As Integer +Property Scale As Float +Property Read PageCount As Integer +Property Count As Integer +Property Index As Integer + +'All ReportControl Properties +Property Left As String +Property Top As String +Property X As String +Property Y As String + +Property Width As String +Property Height As String + +Property Visible As Boolean +Property {Font} As Font +Property Expand As Boolean +Property Ignore As Boolean +Property Fixed As Boolean + +Property Autoresize As Boolean +Property Padding As ReportPadding +'All ReportFrame Properties +Property Border As ReportBorder +Property BackGround As ReportBrush + +'All ReportContainer Properties +Property Read Children As ReportControl[] +Property Spacing As String +Property Data As Object + +'All ReportSection Properties +Property Text As String + +Property Paper As Integer +Property Orientation As Integer + +Public _Scale As Float + +Event Open + +Static Public Sub Main() + + Dim hObject As Object + + hObject = Application.Startup.AutoCreate() + If Not hObject Is Report Then Return + FPreview.Run(hObject) + +End + +Public Sub _New() + + Dim hSection As New ReportSection + Dim TSection As New TControl + + object.Attach(Me, Me, "Report") + + '$hReportTControl.RelPage = 0 + ReportControl._ObjectFromId[Me.id] = Me + hSection = New ReportSection + hSection._ReportId = Me.Id + + ReportControl._ObjectFromId[hSection.Id] = hSection + TSection.Ctrl = hSection + $aSections.Add(TSection) + hSection.Text = ("Section ") & $aSections.Max + _Container = hSection + Me.paper = Printer.A4 + 'Me.Orientation = Printer.Landscape +End + +Public Sub Layout() + + _Layout() + +End + + + +Public Sub _Layout(Optional iPage As Integer = -1) + + 'Dim iCurPage As Integer + Dim TSection As TControl + Dim CSection As ReportContainer + Dim CBaseSection As ReportContainer + Dim i As Integer + + If Not $bOpened Then + Raise Open + $bOpened = True + Endif + + 'Print Paint.ResolutionX + 'If iPage < 0 Then Return + If Not $bLayoutIsDirty Then Return + If _bInExec Then Return + If iPage > -1 Then + 'La page a déja été calculée + If iPage <= $iCurPage Then Return + Else + 'Mise a zéro + $iCurPage = -1 + $iCurSection = 0 + $iPageCount = 0 + Me._Reset + Endif + 'Set execution Flag to true + _bInExec = True + CBaseSection = $aSections[0].Ctrl + + 'ReportUnits.Resolution = If($iResolution < 0, Paint.ResolutionX, $iResolution) + + For i = $iCurSection To $aSections.Max + Tsection = $aSections[i] + CSection = TSection.Ctrl + CSection.Padding = CBaseSection.Padding + CSection.Spacing = CBaseSection.Spacing + CSection._SetUnifiedValues() + ReportUnits._ReportWidth = CBaseSection._Width + TSection._SetGeometry(0, 0, CSection._Width, CSection._Height) + Inc $iCurPage + Do + + CSection._SetChildGeometry(0, 0, CSection._Width, CSection._Height, $iCurPage, TSection, False) + + If CSection._CurItem > CSection.Children.Max Then Break + + Inc $iCurPage + $iPageCount = $iCurPage + 'Print "Fin Page " & $iCurPage + If iPage > -1 And If $iCurPage > iPage Then + Dec $iCurPage + _LayoutNotFinished = True + $iCurSection = i + _bInExec = False + Return + + Endif + + Loop + 'Inc iCurPage + Next + + $iPageCount = $iCurPage + 1 + 'Debug Me._PageChildren.Count + _LayoutNotFinished = False + 'ReportUnits.PageCount = $iCount + $iCurSection = 0 + '$iCurPage = -1 + $bLayoutIsDirty = False + + 'End of execution + _bInExec = False + +End + +Public Sub Paint(Page As Integer) + + Dim TSection As TControl + Dim fScale As Float + 'Debug "**** "; Page;; Paint.ResolutionX;; Paint.ResolutionY + + If Me.Parent = Null Then + 'If $sOldWidth <> ((Paint.Width / $fScale) & " px") Then $bLayoutIsDirty = True + 'If $sOldHeight <> ((Paint.Height / $fScale) & " px") Then $bLayoutIsDirty = True + Endif + ReportUnits._ReportWidth = $aSections[0].Ctrl._Width + 'ReportUnits.Resolution = If($iResolution < 0, Paint.ResolutionX, $iResolution) + If $bLayoutIsDirty And $iPageCount = -1 Then Layout() + Paint.Save + 'Set execution Flag to true + _bInExec = True + + ' If page < 1 Or page > $iCount Then + ' Error.Raise("This page does not exist") + ' Endif + 'Dec page + + 'Paint.Clip + 'ReportUnits.DrawCount = 0 + + 'Paint.Reset + ' If Paint.Device Is Printer Then + ' Paint.Scale(Paint.ResolutionX / 1200, Paint.ResolutionY / 1200) + ' Endif + ' If Paint.Device Is Printer Then + ' If ReportUnits._ReportUnitsToPixels($aSections[0].Ctrl._Width) > Paint.Width Then + ' + ' fScale = Paint.Width / ReportUnits._ReportUnitsToPixels($aSections[0].Ctrl._Width) + ' + ' Paint.Scale($fScale, $fScale) + ' Endif + ' Endif + 'Print Paint.Width + 'ReportUnits.Ratio = Paint.Width / $aSections[0].Ctrl._Width + ' With Paint.ClipExtents + ' Debug "ClipExtents: "; .X;; .Y;; .Width;; .Height + ' End With + Dec page + 'Me._ClipChildren(Page, 0, 0, $hReportTControl, -1, $fSCale) + For Each TSection In $aSections + TSection.Ctrl._PaintBefore(Page, 0, 0, TSection, -1) + TSection.Ctrl._Paint(Page, 0, 0, TSection, -1) + TSection.Ctrl._PaintAfter(Page, 0, 0, TSection, -1) + Next + 'Debug "DrawCount = "; ReportUnits.DrawCount + 'End of execution + _bInExec = False + Paint.Restore + +End + +Private Function PageCount_Read() As Integer + + If $bLayoutIsDirty And Not _LayoutNotFinished Then Layout() '$iCount = -1 + + Return $iPageCount + +End + +Private Function Height_Read() As String + + Return $aSections[0].Ctrl.Height + +End + +Private Sub Height_Write(Value As String) + + SetHeight(Value) + $iPaper = Printer.Custom + +End + +Private Sub SetHeight(Value As String) + + Dim TSection As TControl + + If $aSections[0].Ctrl.Height <> Value Then + + For Each TSection In $aSections + TSection.Ctrl.Height = Value + Next + $bLayoutIsDirty = True + Endif + +End + +Private Function Width_Read() As String + + Return $aSections[0].Ctrl.Width + +End + +Private Sub Width_Write(Value As String) + + SetWidth(Value) + $iPaper = Printer.Custom + +End + +Private Sub SetWidth(Value As String) + + Dim TSection As TControl + + If $aSections[0].Ctrl.Width <> Value Then + For Each TSection In $aSections + Tsection.Ctrl.Width = Value + Next + $bLayoutIsDirty = True + Endif + +End + +Private Function Scale_Read() As Float + + Return $fScale + +End + +Private Sub Scale_Write(Value As Float) + + $fScale = Value + +End + +Public Sub Clear() + + Super._Free + iCurPage = 0 + $iPageCount = -1 + '$iResolution = Desktop.Resolution + $bLayoutIsDirty = True + $fScale = 1.0 + 'Me.Brush = Null + 'Me.Border = New ReportBorder + 'Me.Spacing = "0 cm" + 'Me.Padding = New ReportPadding + +End +' + +Public Function Preview() + + FPreview.Run(Me) + +End + +' Public Function Image(Value As String, X As String, Y As String) As ReportBrush +' +' Dim hBrush As New ReportBrush +' +' hBrush._Type = 1 +' hBrush._X = New TSizeParse(X) +' hBrush._Y = New TSizeParse(Y) +' hBrush._Image = Image.Load(Value) +' Return hBrush +' +' End +' +' Public Function LinearGradient(Colors As Integer[], Positions As Float[]) As ReportBrush +' +' Dim hBrush As New ReportBrush +' +' hBrush._Type = 2 +' 'hBrush.X = MRTools.ScanValue(X) +' 'hBrush.Y = MRTools.ScanValue(Y) +' +' hBrush._Color = Colors +' hBrush._Pos = Positions +' Return hBrush +' +' End + +' Public Function RadialGradient(Colors As Integer[], Positions As Float[]) As ReportBrush +' +' Dim hBrush As New ReportBrush +' +' hBrush._Type = 3 +' 'hBrush.X = MRTools.ScanValue(X) +' 'hBrush.Y = MRTools.ScanValue(Y) +' +' hBrush._Color = Colors +' hBrush._Pos = Positions +' Return hBrush +' +' End + +' Public Sub {Color}(iColor As Integer) As ReportBrush +' +' Dim hBrush As New ReportBrush +' +' hBrush._Type = 0 +' hBrush._iValue = iColor +' Return hBrush +' +' End + +Public Sub Refresh() + + $bLayoutIsDirty = True + Me._Reset + +End + +Private Function Count_Read() As Integer + + Return $aSections.Count + +End + +Private Sub Count_Write(Value As Integer) + + Dim i As Integer + Dim hSection As ReportSection + Dim TSection As TControl + + If Value < 0 Then Return + If Value < $aSections.Count Then + $aSections.Resize(Value) + Else If Value > $aSections.Count Then + For i = $aSections.Count To Value - 1 + + TSection = New TControl + hSection = New ReportSection + hSection.Text = "Section " & CStr(i) + hSection._ReportId = Me.Id + ReportControl._ObjectFromId[hSection.Id] = hSection + TSection.Ctrl = hSection + hSection.Padding = Me.Padding + hSection.Height = Me.Height + hSection.Width = Me.Width + $aSections.Add(TSection) + hSection.Text = ("Section ") & $aSections.Max + Next + Endif + +End + +Private Function Index_Read() As Integer + + Return $iIndex + +End + +Private Sub Index_Write(Value As Integer) + + $iIndex = Max(Min($aSections.Max, Value), 0) + _Container = $aSections[$iIndex].Ctrl + +End + +Public Sub _get(Index As Integer) As ReportSection + + Return $aSections[Index].Ctrl + +End + +Private Function Padding_Read() As ReportPadding + + Return $aSections[0].Ctrl.Padding + +End + +Private Sub Padding_Write(Value As ReportPadding) + + Dim TSection As TControl + + If Me.Padding <> Value Then + For Each TSection In $aSections + Tsection.Ctrl.Padding = Value + Next + Endif + +End + +Private Function Resolution_Read() As Integer + + Return $iResolution + +End + +Private Sub Resolution_Write(Value As Integer) + + $bLayoutIsDirty = True + $iResolution = Max(0, Value) + +End + +Private Function Left_Read() As String + + Return _Container.Left + +End + +Private Sub Left_Write(Value As String) + + _Container.Left = Value + +End + +Private Function Top_Read() As String + + Return _Container.Top + +End + +Private Sub Top_Write(Value As String) + + _Container.Top = Value + +End + +Private Function X_Read() As String + + Return _Container.Left + +End + +Private Sub X_Write(Value As String) + + _Container.Left = Value + +End + +Private Function Y_Read() As String + + Return _Container.Top + +End + +Private Sub Y_Write(Value As String) + + _Container.Top = Value + +End + +Private Function Visible_Read() As Boolean + + Return _Container.Visible + +End + +Private Sub Visible_Write(Value As Boolean) + + _Container.Visible = Value + +End + +Private Function Font_Read() As Font + + Return _Container.Font + +End + +Private Sub Font_Write(Value As Font) + + _Container.Font = Value + +End + +Private Function Expand_Read() As Boolean + + Return _Container.Expand + +End + +Private Sub Expand_Write(Value As Boolean) + + _Container.Expand = Value + +End + +Private Function Ignore_Read() As Boolean + + Return _Container.Ignore + +End + +Private Sub Ignore_Write(Value As Boolean) + + _Container.Ignore = Value + +End + +Private Function Fixed_Read() As Boolean + + Return _Container.Fixed + +End + +Private Sub Fixed_Write(Value As Boolean) + + _Container.Fixed = Value + +End + +Private Function Autoresize_Read() As Boolean + + Return _Container.Autoresize + +End + +Private Sub Autoresize_Write(Value As Boolean) + + _Container.Autoresize = Value + +End + +Private Function Border_Read() As ReportBorder + + Return _Container.Border + +End + +Private Sub Border_Write(Value As ReportBorder) + + _Container.Border = Value + +End + +Private Function BackGround_Read() As ReportBrush + + Return _Container.BackGround + +End + +Private Sub BackGround_Write(Value As ReportBrush) + + _Container.BackGround = Value + +End + +Private Function Children_Read() As ReportControl[] + + Return _Container.Children + +End + +Private Function Spacing_Read() As String + + Return _Container.Spacing + +End + +Private Sub Spacing_Write(Value As String) + + Dim TSection As TControl + Dim hCont As ReportContainer + + If Me.Spacing <> Value Then + For Each TSection In $aSections + hCont = Tsection.Ctrl + hCont.Spacing = Value + Next + Endif + +End + +Private Function Data_Read() As Object + + Return _Container.Data + +End + +Private Sub Data_Write(Value As Object) + + _Container.Data = Value + +End + +Private Function Text_Read() As String + + Return _Container.Text + +End + +Private Sub Text_Write(Value As String) + + _Container.Text = Value + +End + +''Return a new report object +Public Sub Clone() As Report + + 'Return Object.New(Object.Type(Me)) + Return Object.Class(Me).New() + +End + +Private Function Paper_Read() As Integer + + Return $iPaper + +End + +Private Sub Paper_Write(Value As Integer) + + $iPaper = Value + SetPaper + +End + +Private Function Orientation_Read() As Integer + + Return $iOrientation + +End + +Private Sub Orientation_Write(Value As Integer) + + $iOrientation = Value + SetPaper + +End + +Public Sub Print(Optional hPrinter As Printer) + + If hPrinter Then + CPrint.PrintReport(Me, hPrinter) + Else + CPrint.PrintReport(Me) + Endif + +End + +Private Sub SetPaper() + + Dim sPrev As String + + Select Case $iPaper + Case Printer.A3 + SetWidth("29.7cm") + SetHeight("42cm") + Case Printer.A4 + SetWidth("21cm") + SetHeight("29.7cm") + Case Printer.A5 + SetWidth("14.8cm") + SetHeight("21cm") + Case Printer.B5 + SetWidth("18.7cm") + SetHeight("25.7cm") + Case Printer.Executive + SetWidth("19.1cm") + SetHeight("25.4cm") + Case Printer.Legal + SetWidth("21.6cm") + SetHeight("35.6cm") + Case Printer.Letter + SetWidth("21.6cm") + SetHeight("27.9cm") + + End Select + 'Print $iOrientation, $iPaper + + If $iOrientation = Printer.Landscape And Not ($iPaper = Printer.Custom) Then + sPrev = Me.Height + SetHeight(Me.Width) + SetWidth(sPrev) + ' Print "width = " & Me.Width + ' Print "height = " & Me.Height + Endif + +End + +Public Sub _Reset() + + Dim hSection As TControl + + For Each hSection In $aSections + hSection.Ctrl._Reset + hSection._PageChildren = New Collection + Next + + $iCurPage = -1 + $iCurSection = 0 + $iPageCount = 0 + +End + +' Private Function Printer_Read() As Printer +' +' Return $hPrinter +' +' End + +' Public Sub Print2() +' +' _Reset +' +' End diff --git a/comp/src/gb.report/.src/ReportContainer.class b/comp/src/gb.report/.src/ReportContainer.class new file mode 100644 index 00000000..c4dee7a7 --- /dev/null +++ b/comp/src/gb.report/.src/ReportContainer.class @@ -0,0 +1,945 @@ +' Gambas class file + +Export +Create Private +Inherits ReportFrame + +Public Const _IsContainer As Boolean = True +Public Const _Group As String = "Container" +Public Const _Properties As String = "*,Spacing{ReportCoord},OnePiece,ForceNewPage" +'Public Const _DefaultEvent As String = "Data" +Private $bDataIsResult As Boolean +'Private $iCount As Integer + +Property _CurItem As Integer +Private $iCurItem As Integer + +Public _Arrangement As Integer +Private $bIndexChange As Boolean +Private $aChild As New ReportControl[] +Private $fSpacing As Float +Private $sSpacing As String +Private $bRelativeSpacing As Boolean + +Private $aChildCopy As TControl[] +Private $bOnePiece As Boolean +Private $iIndex As Integer +Private $hData As Object +Private $fFixedSize As Float +Property _Index As Integer + +Property DataCount As Integer + +Property Read Children As ReportControl[] + +'Property Read Index As Integer +Property Spacing As String +'Property Data As Object '<==== remettre pour automation + +Property Read _Spacing As Float +Property Read _RelativeSpacing As Boolean + +Property OnePiece As Boolean +Public _RealSpacing As Integer +Public _NotFinished As Boolean + +Event BeforeData +Event AfterData + +Public Function _Add(cControl As ReportControl) 'As TControl + + 'Dim hTControl As New TControl + + 'hTControl.Ctrl = cControl + $aChild.Add(cControl) + ReportControl._ObjectFromId[cControl.Id] = cControl + 'Return hTControl + +End + +Public Sub _Remove(id As Integer) + + $aChild.Remove($aChild.Find(ReportControl._ObjectFromId[id])) + +End + +Public Sub _Free() + +End + +Private Function Children_Read() As ReportControl[] + + Return $aChild + +End + +Private Function Spacing_Read() As String + + Return $sSpacing + +End + +Private Sub Spacing_Write(Value As String) + + $sSpacing = Value + +End + +Public Sub _Paint(Page As Integer, X As Float, Y As Float, hControl As TControl, (DataIndex) As Integer) + + Dim hChild As TControl + + X += hControl.RealLeft + Y += hControl.RealTop + If Not hControl._PageChildren.Exist(Page) Then Return + 'Me._Index = hControl.Index + For Each hChild In hControl._PageChildren[Page] + 'Print object.Type(hchild.Ctrl), hControl.RelPage, hControl.RealPage + hchild.RelPage, Page - 1 + + 'If hchild.RelPage = -1 Or hControl.RealPage + hchild.RelPage = Page - 1 Then + + 'Inc ReportUnits.DrawCount + 'hchild.Ctrl._Index = hchild.Index + '$iIndex = DataIndex + 'If hControl.DataIndex > -1 Then $iIndex = hControl.DataIndex + Me._Index = hchild.Index + If $bIndexChange Then + Raise BeforeData + $bIndexChange = False + Endif + hChild.Ctrl._Paintframe(Page, X, Y, hChild, hChild.Index) + + Next + +End + +Private Function _Spacing_Read() As Float + + Return $fSpacing + +End + +Private Function _RelativeSpacing_Read() As Boolean + + Return $bRelativeSpacing + +End + +Public Sub _SetUnifiedValues() + + Dim hChild As ReportControl + Dim hSizeParse As TSizeParse + + Super._SetUnifiedValues() + + hSizeParse = New TSizeParse($sSpacing, True) + $fSpacing = hSizeParse.GetValue() + $bRelativeSpacing = hSizeParse.IsRelative() + + For Each hChild In $aChild + 'hchild.SizeHint = Null + hChild._SetUnifiedValues() + Next + +End + +Public Sub _GenerateClones() + + Dim hNewTControl, hTc As TControl + + Dim i As Integer + Dim hCont As ReportContainer + Dim aNewChild As TControl[] + + Dim aCopy As TControl[] + + If $aChildCopy Then + $aChild = $aChildCopy.Copy() + Endif + aCopy = $aChild.Copy() + + For Each hTc In aCopy + If hTc.Ctrl Is ReportContainer Then + hCont = hTc.Ctrl + If hCont.Data Then + aNewChild = New TControl[] + + For i = 0 To hCont.Data.Count - 1 + + hNewTControl = New TControl + hNewTControl.Ctrl = hTc.Ctrl + hNewTControl.DataIndex = i + aNewChild.Add(hNewTControl) + + Next + $aChild = $aChild.Insert(aNewChild, $aChild.Find(hTc)) + $aChild.Remove($aChild.Find(hTc)) + + Endif + hCont._GenerateClones + Endif + Next + If $aChild.Count <> aCopy.Count Then $aChildCopy = aCopy + +End + +Public Sub _GetSizeHints((AvailableW) As Float, (AvailableH) As Float, (TotalWidth) As Float, (TotalHeight) As Float, DataIndex As Integer) As TSizeHint + + Dim hMyHints As New TSizeHint + + 'If Me._SizeInt.StoreSize Then Return Me._SizeInt + 'If Me.tag = "*" Then Stop + If Me._CurItem > Me.Children.max Then + + ' If Me Is ReportSection Then Stop + Me._CurItem = 0 + ' 'Me._DataIndex = 0 + Endif + Me._Index = DataIndex + If $bIndexChange Then + Raise BeforeData + $bIndexChange = False + Endif + Select Case _Arrangement + + Case Arrange.Vertical + Return GetVSizeInt(AvailableW, AvailableH, TotalWidth, TotalHeight, DataIndex) + Case Arrange.Horizontal + Return GetHSizeInt(AvailableW, AvailableH, TotalWidth, TotalHeight, DataIndex) + Case Arrange.Column + Return GetVSizeInt(AvailableW, AvailableH, TotalWidth, TotalHeight, DataIndex) + Case Arrange.Fill, Arrange.None + Return Super._GetSizeHints(AvailableW, AvailableH, TotalWidth, TotalHeight, DataIndex) + 'hMyHints.Height = AvailableH + 'Me._SizeInt.StoreSize = True + 'Me._SizeInt = hMyHints + Return hMyHints + + End Select + Raise AfterData + +End + +Private Function GetHSizeInt((AvailableW) As Float, (AvailableH) As Float, (TotalWidth) As Float, (TotalHeight) As Float, DataIndex As Integer) As TSizeHint + + Dim hChild As ReportControl + Dim fHeight, fWidth As Float + Dim hChildHints As TSizeHint + Dim hMyHints As New TSizeHint + Dim fSpacing As Float + + 'D'abord utiliser la méthode du controle pour définir la taille + hMyHints = Super._GetSizeHints(AvailableW, AvailableH, TotalWidth, TotalHeight, DataIndex) + + 'Puis si besoins voir le besoin des enfants + If Me.Autoresize Or If (Me._Width = 0 And Me._Height = 0) Then + fSpacing = IIf(Me._RelativeSpacing, TotalWidth * Me._Spacing / 100, Me._Spacing) + For Each hChild In Me.Children + hChildHints = hchild._GetSizeHints(AvailableW - fWidth, AvailableH, AvailableW, AvailableH, DataIndex) + fWidth += hChildHints.Width + fSpacing + If fHeight < hChildHints.Height Then fHeight = hChildHints.Height + 'Si l'enfant n'est pas finit alors moi non plus + If hChildHints.NotFinished Then hMyHints.NotFinished = True + Next + If fWidth Then fWidth -= fSpacing + hMyHints.Height = fHeight + Me.Padding._Height + Me.Border._Top + Me.Border._bottom + hMyHints.Width = fWidth + Me.Padding._Width + Me.Border._Left + Me.Border._Right + Endif + + Return hMyHints + +End + +Private Function GetVSizeInt((AvailableW) As Float, (AvailableH) As Float, (TotalWidth) As Float, (TotalHeight) As Float, DataIndex As Integer) As TSizeHint + + Dim hSizeInt As New TSizeHint + Dim htmpInts As TSizeHint + Dim hChild As ReportControl ''Enfants + Dim fHeight, fSpacing, fWidth As Float + Dim i, j As Integer + Dim bExitLoop As Boolean + 'If Me.Tag = "Boite 2" Then Stop + 'D'abord utiliser la méthode du controle pour définir la taille + hSizeInt = Super._GetSizeHints(AvailableW, AvailableH, TotalWidth, TotalHeight, DataIndex) + + fSpacing = IIf(Me._RelativeSpacing, TotalHeight * Me._Spacing / 100, Me._Spacing) + + ' Si ce n'est pas fait on enregistre la place nécéssaire a tout les éléments fixes + + If Not $fFixedSize Then + For i = 0 To Me.Children.Max + hChild = Me.Children[i] + htmpInts = hChild._GetSizeHints(AvailableW, AvailableH, AvailableW, AvailableH, DataIndex) + If hchild.Fixed Then $fFixedSize += htmpInts.Height + fSpacing + + Next + + Endif + + 'La taille ne peut être inférieur a celle de tout les éléments fixes + hSizeInt.Height = Max(hSizeInt.Height, $fFixedSize) + + 'On ajoute la taille des objets fixes précédents + fHeight = $fFixedSize + + If Me.Autoresize Or If (Me._Width = 0 And Me._Height = 0) Then + 'On définit la taille au besoins des enfants + For i = Me._CurItem To Me.Children.Max + hChild = Me.Children[i] + For j = hchild._DataIndex To hchild._Count - 1 + 'If hchild.Tag = "head" Then Print "VDataHint = " & DataIndex + If hChild.Ignore Then Continue + If hChild.Fixed Then Continue + hchild._Index = j + htmpInts = hChild._GetSizeHints(AvailableW, AvailableH - fHeight, AvailableW, AvailableH, j) + 'Si l'enfant n'est pas terminé alors moi non plus + If htmpInts.NotFinished Then hSizeInt.NotFinished = True + 'on ajoute la hauteur aux besoins + fHeight += htmpInts.Height + fSpacing + If fHeight - fSpacing > AvailableH Then + 'Les enfants ne loge pas ... on ne peut pas finir + hSizeInt.NotFinished = True + Break + bExitLoop = True + Endif + 'On récupère la largeur de l'enfant le plus large + If fWidth < htmpInts.Width Then fWidth = htmpInts.Width + Next + If bExitLoop Then Break + Next + + 'on enlève le dernier espace + If fHeight > 0 Then fHeight -= fSpacing + 'bogue bizzard + fHeight += 0.01 + + 'On indique la place nécéssaire aux enfants+les éléments fixes + hSizeInt.Height = fHeight + Me.Padding._Height + Me.Border._Top + Me.Border._Bottom + hSizeInt.Width = fWidth + Me.Padding._Width + Me.Border._Left + Me.Border._Right + Endif + + 'On ne peut pas dépasser la taille disponible (report sur prochaine page) + 'FIXME: Onepiece partially desactivated + If Not Me.OnePiece Then + hSizeInt.Height = Min(hSizeInt.Height, AvailableH) + Endif + + hSizeInt.Height = Min(TotalHeight, hSizeInt.Height) + + Me._SizeInt = hSizeInt + ' If Me.Tag = "Boite 2" Then + ' Print hSizeInt.Height + ' Stop + ' Endif + 'If Me.tag = "toto" Then Stop + Return hSizeInt + +End + +Public Sub _Reset() + + Dim hChild As ReportControl + 'mise a zéro de l'index de suivit de progression + Me._CurItem = 0 + 'Mise a zéro de l'index de reproduction + Me._DataIndex = 0 + 'Netoyage du layout précédent + 'Me._PageChildren.Clear + 'Nettoyage récurssif des enfants + For Each hChild In Me.Children + + hChild._Reset + + Next + +End + +Public Sub _SetChildGeometry(X As Float, Y As Float, W As Float, H As Float, ContPage As Integer, TCont As TControl, bInFixed As Boolean) + 'If Me.Tag = "*" Then Stop + 'Print "Geometry " & Object.Type(Me) + + Me._Index = TCont.Index + + If Me._CurItem > Me.Children.max Then + ' If Me Is ReportSection Then Stop + Me._CurItem = 0 + 'Me._DataIndex = 0 + Endif + + ' If $bIndexChange Then + ' Raise BeforeData + ' $bIndexChange = False + ' Endif + + Select Case _Arrangement + Case Arrange.Vertical + SetVChildGeometry(X, Y, W, H, ContPage, TCont, bInFixed) + Case Arrange.Horizontal + SetHChildGeometry(X, Y, W, H, ContPage, TCont, bInFixed) + Case Arrange.Column + Me._SetCChildGeometry(X, Y, W, H, ContPage, TCont, bInFixed) + Case Arrange.Fill + SetFChildGeometry(X, Y, W, H, ContPage, TCont, bInFixed) + Case Arrange.None + SetNChildGeometry(X, Y, W, H, ContPage, TCont, bInFixed) + End Select + Raise AfterData + +End + +Private Sub SetVChildGeometry(X As Float, Y As Float, W As Float, H As Float, ContPage As Integer, TCont As TControl, bInFixed As Boolean) + + Dim aPageItems As New TControl[] ''Éléments contenu par cette page + Dim hChildHints As TSizeHint ''Besoins en hauteur/largeur de l'enfant + Dim hChild As ReportControl ''Un enfant reportcontrol + Dim fTH As Float ''Hauteur restante + Dim fSpc As Float ''Taille d'un espace + 'Dim X, Y As Float ''Position Haut gauche de départ + Dim hTItem As TControl ''Un objet virtuel + Dim oChild As Object ''Un objet gambas générique + Dim fExp As Float ''taille des objets étendus + Dim iNExp As Integer ''Nombre d'objets étendus + Dim ftmpHeight As Float ''Tampon pour le calcul de la taille répartie + Dim ftmpY As Float ''Curseur temporaire de position haute + Dim fX, fY As Float ''Tampon de position + Dim i, j As Integer ''Des indexs + Dim bExitLoop As Boolean ''Flag de sortie de traitement + 'Dim iPrevIndex As Integer + Dim bForceNewPage As Boolean ''Flag d'anticipation de sortie 1 par page + Dim iPreIndex As Integer + Dim bFirst As Boolean + 'Détermination de la taille d'un espace + 'et prise en compte de la taille relative + fSpc = IIf(Me._RelativeSpacing, H * Me._Spacing / 100, Me._Spacing) + + 'Retrait du padding et des bordures de la hauteur de travail + H = H - Me.Padding._Top - Me.Border._Top - Me.Border._Bottom - Me.Padding._Bottom + + 'Retrait du padding et des bordures a la largeur de travail + W = W - Me.Padding._Left - Me.Border._Left - Me.Border._Right - Me.Padding._Right + + 'Positioinnement du curseur en haut a gauche + X = Me.Padding._Left + Me.Border._Left + Y = Me.Padding._Top + Me.Border._Top + + 'La hauteur restante est initialisée avec la hauteur de travail + fTH = H + + '***************************************************************************************** + 'On enumere tous les enfants a la recherche des éléments fixes + 'Si des éléments fixes sont trouvés alors leur taille est déduite de la taille restante. + For i = 0 To Me.Children.Max + 'On récupère l'enfant + hchild = Me.Children[i] + 'Si l'enfant est fixe alors on le traite. + If hchild.Fixed Then + ' hchild._Index = TCont.Index + 'on commence par récupérer la taille de l'objet + hChildHints = hchild._GetSizeHints(W, fTH, W, H, TCont.Index) + 'On retire la taille de l'objet a la hau'teur restante + 'si l'objet n'est pas ignoré par l'agencement + If Not hchild.Ignore Then fTH = fTH - hChildHints.Height - fSpc + + 'Si l'énumération n'est pas encore arrivée a l'index sauvegardé + 'alors on ajoute directement l'élément a la page + If i < Me._CurItem Then + + 'Génération de l'objet virtuel + hTItem = New TControl + 'Lier l'objet + hTItem.Ctrl = hchild + 'Associer sa taille + hTItem.SizeHint = hChildHints + + hTItem.Index = TCont.Index + 'L'ajouter a la page + aPageItems.Add(hTItem) + + 'Si l'objet est étendu alors on en tient compte + 'sauf si celui-ci est ignoré par l'arrangement + If hchild.Expand And If Not hchild.Ignore Then + fExp += hChildHints.Height + Inc iNExp + Endif + Endif + Endif + Next + + '********************************************************************************* + 'On parcour a présent le reste des éléments + For i = Me._CurItem To Me.Children.Max + 'On récupère l'enfant + hChild = Me.Children[i] + 'Je traite ici la boucle de clonage + 'On définit le point de départ + 'If ContPage = 1 And hchild.Tag = "**" Then Stop + j = hChild._DataIndex + Do + '## Début boucle répétition + + 'On fixe l'index de données des enfants si + 'on est le duplicateur + If hChild._IsContainer And If hChild._count > 1 Then + iPreIndex = j + Else + iPreIndex = TCont.Index + Endif + 'If hchild.tag = "**" Then Print iPreIndex + 'If iPreIndex = 9 Then Stop + 'on récupère la taille de l'enfant + + hChildHints = hchild._GetSizeHints(W, fTH, W, H, iPreIndex) + + 'Les éléments fixes ont déja été traités on ne tient donc pas compte de leur hauteur + 'car elle a déja été déduite de l'espace restant. De meme on ignore les objets flottants (ignore=true) + If Not hchild.Fixed And If Not hchild.Ignore Then + + 'Si l'élément ne loge pas dans la place restante ou + 'si la place restante est insuffisante + 'on provoque la sortie en fin de boucle + If (fTH - hChildHints.Height) < 0 Or If fTH <= 0 Or bForceNewPage Then + ' If hchild.Tag = "*" Then Stop + If Not bFirst Then + hChildHints.Height = fTH + Else + bForceNewPage = False + hchild._DataIndex = j + + 'If Not bForceNewPage Then + bExitLoop = True + Break + Endif + Endif + bFirst = True + 'On déduit la taille de l'objet courant (et l'espace suivant) + fTH = fTH - hChildHints.Height - fspc + + Endif + 'L'objet loge dans la page, on génère donc une représentation de celui-ci + 'c'est a dire un objet virtuel pointant vers celui-ci + 'et apportant les informations nécéssaire au layout final + 'on génère l'objet virtuel + hTItem = New TControl + 'On associe le controle + hTItem.Ctrl = hchild + 'On associe sa taille + hTItem.SizeHint = hChildHints + 'If hchild.Tag = "head" Then Stop + 'On associe l'index de donnée + hTItem.Index = iPreIndex + 'TItem.Index = IIf(hchild._count > 0, j, TCont.Index) + 'On l'ajoute a la page + aPageItems.Add(hTItem) + + 'Si l'objet est étendu alors on tien compte de sa taille + 'pour le calcul de l'espace réparti + If hchild.Expand Then + fExp += hChildHints.Height + Inc iNExp + Endif + + 'If hChildHints.NotFinished Then hchild._DataIndex = j + 'un élément fixe ou ignore ne peut être répété + If hchild.Fixed Or hchild.Ignore Then Break + + 'Sachant que hChild._count peut être à -1 on le considère dans ce cas la comme étant a 0 + 'si j est égale au compte alors on quitte la boucle + If j >= Max(hchild._Count - 1, 0) Then + If Not hChildHints.NotFinished Then hChild._DataIndex = 0 + Break + Endif + + 'sinon on incrémente le compte a condition que le dernier enfant aie finit d'afficher ses enfants + If Not hChildHints.NotFinished Then Inc j + + 'On prévoie un sortie de boucle si l'enfant demande un affichage 1 par page + If hchild.ForceNewPage Then bForceNewPage = True + + Loop + 'Next '## fin de la boucle de répétition + 'Si la sortie anticipé est demandée alors on sort de la boucle + If bExitLoop Then Break + If i < Me.Children.Max Then + If Me.Children[i + 1] Is ReportPageBreak Then + bForceNewPage = True + Inc Me._CurItem + Inc i + Endif + Endif + 'Tout les objets on été répété alors on remet l'index à 0 + 'hchild._DataIndex = 0 + 'On incrémente le compteur des éléments traités + Inc Me._CurItem + Next + + If (H - fTH) > 0 Then + fTH += fspc 'Heu?????? + Endif + + '*************************************************************************** + 'Pour tous les éléments fixes jusqu'à la fin du document + For i = Max(Me._CurItem, 0) To Me.Children.Max + hchild = Me.Children[i] + If hchild.Fixed Then + hChildHints = hchild._GetSizeHints(W, fTH, W, H, iPreIndex) + 'on génère l'objet virtuel + hTItem = New TControl + 'On associe le controle + hTItem.Ctrl = hchild + 'On associe sa taille + hTItem.SizeHint = hChildHints + 'On l'ajoute a la page + aPageItems.Add(hTItem) + + 'Si l'objet est étendu alors on tien compte de sa taille + 'pour le calcul de l'espace réparti + If hchild.Expand Then + fExp += hChildHints.Height + Inc iNExp + Endif + Endif + Next + + '****************************************************************************** + 'A présent tous les éléments pouvant être placé sur la page ont été marqué. + 'On peut donc procéder a la mise en forme de ceux-ci + + ftmpY = Y 'On définit la position de départ + If iNExp Then + fExp = (fExp + fTH) / iNExp + Endif + + For i = 0 To aPageItems.Max + 'on récupère l'objet virtuel + hTItem = aPageItems[i] + 'on récupère l'instance de l'objet réel + ochild = hTItem.Ctrl + + 'Si l'objet est étendu alors on calcul sa hauteur + 'Un objet flottant ne peut pas être étendu + If Not oChild.Ignore And If ochild.Expand Then + 'Calcul de la taille répartie + ftmpHeight = fExp + Else + 'Si l'objet n'est pas étendu alors sa taille est celle demandée par celui-ci + ftmpHeight = hTItem.SizeHint.Height + Endif + 'oChild._Index = hTItem.Index + 'Traitement des objets ignoré + 'Les propriété de taille sont celle fournie par l'objet + If oChild.Ignore Then + 'Calcul de la position de l'objet + 'si sa position est relative (%) alors on fait le ratio a partir de la largeur ou de la hauteur + 'sinon on utilise la position fournie par l'objet + fX = X + IIf(oChild._RelativeLeft, W * oChild._Left / 100, oChild._Left) + fY = Y + IIf(oChild._RelativeTop, H * oChild._Top / 100, oChild._Top) + 'Fixer la position de l'objet + hTItem._SetGeometry(fX, fY, hTItem.SizeHint.Width, ftmpHeight) + 'L'objet flottant peut être un conteneur il faut donc demander aussi a ses enfants de s 'organiser + oChild._SetChildGeometry(fX, fY, hTItem.SizeHint.Width, ftmpHeight, ContPage, hTItem, bInFixed Or Me.Fixed) + + Else + 'Fixer la position de l'objet + hTItem._SetGeometry(X, fTmpY, W, ftmpHeight) + 'L'objet flottant peut être un conteneur il faut donc demander aussi a ses enfants de s 'organiser + oChild._SetChildGeometry(X, fTmpY, W, ftmpHeight, ContPage, hTItem, bInFixed Or Me.Fixed) + 'on incrémente la position verticale de l'objet + 'pour définir sa place sur la page relativement aux autres éléments + fTmpY += ftmpHeight + fspc + + Endif + + 'Si l'objet est un conteneur alors il faut vérifier si il a finit d'être traité + + If oChild Is ReportContainer Then + 'If oChild._NotFinished Then Me.NotFinished = True + 'Si son traitement n'est pas terminé alors on trouve + 'sa position dans la liste des enfant et on l'assigne a l'index de traitement + 'si sa position est > a l'index courant + If ochild._CurItem <= oChild.Children.Max Then + j = Me.Children.Find(oChild) + Me._CurItem = Min(Me._CurItem, j) + Endif + 'Si on est dans la lignée d'un conteneur fixe on incrémente pas la lecture des enfants + 'En clair ce sont toujours les mêmes éléments qui apparaitrons + If bInFixed Then ochild._CurItem = 0 + Endif + Next + + 'On ajoute cette page au dossier du conteneur + TCont._PageChildren[ContPage] = aPageItems + +End + +Private Function SetFChildGeometry(X As Float, Y As Float, W As Float, H As Float, ContPage As Integer, TCont As TControl, bInFixed As Boolean) + + Dim hChild As ReportControl + Dim hTItem As TControl + Dim hChildHints As TSizeHint + Dim aPageItems As New TControl[] + Dim oChild As Object + Dim j As Integer + + X = Me.Padding._Left + Me.Border._Left + Y = Me.Padding._Top + Me.Border._Top + W = W - Me.Padding._Left - Me.Padding._Right - Me.Border._Left - Me.Border._Right + H = H - Me.Padding._Top - Me.Padding._Bottom - Me.Border._Top - Me.Border._Bottom + For Each hChild In Me.Children + hChildHints = hchild._GetSizeHints(W, H, W, H) + hTItem = New TControl + hTItem.Ctrl = hchild + hTItem.SizeHint = hChildHints + + Inc Me._CurItem + aPageItems.Add(hTItem) + + Next + For Each oChild In aPageItems + oChild._Index = hTItem.Index + hTItem._SetGeometry(X, Y, W, H) + hChild._SetChildGeometry(X, Y, W, H, ContPage, hTItem, bInFixed Or Me.Fixed) + If oChild Is ReportContainer Then + + If oChild._CurItem < oChild.Children.count Then + 'Print ochild.tag & " pas fini" + j = Me.Children.Find(oChild) + Me._CurItem = Min(j, Me._CurItem) + Endif + 'ne pas incrémenter la lecture des enfants si je suis dans un élément fixe + If bInFixed Then ochild._CurItem = 0 + End If + Next + + TCont._PageChildren[ContPage] = aPageItems + +End + +Private Function SetNChildGeometry(X As Float, Y As Float, W As Float, H As Float, ContPage As Integer, TCont As TControl, bInFixed As Boolean) + + Dim hChild As ReportControl + Dim ochild As Object + Dim hTItem As TControl + Dim hChildHints As TSizeHint + Dim aPageItems As New TControl[] + Dim iX, iY As Integer + Dim J As Integer + + X = Me.Padding._Left + Me.Border._Left + Y = Me.Padding._Top + Me.Border._Top + W = W - Me.Padding._Left - Me.Padding._Right - Me.Border._Left - Me.Border._Right + H = H - Me.Padding._Top - Me.Padding._Bottom - Me.Border._Top - Me.Border._Bottom + + For Each hChild In Me.Children + + hChildHints = hchild._GetSizeHints(W, H, W, H) + hTItem = New TControl + hTItem.Ctrl = hchild + hTItem.SizeHint = hChildHints + Inc Me._CurItem + aPageItems.Add(hTItem) + + Next + + For Each hTItem In aPageItems + oChild = hTItem.Ctrl + hChildHints = hTItem.SizeHint + iX = X + IIf(oChild._RelativeLeft, W * oChild._Left / 100, oChild._Left) + iY = Y + IIf(oChild._RelativeTop, H * oChild._Top / 100, oChild._Top) + oChild._Index = hTItem.Index + hTItem._SetGeometry(iX, iY, hChildHints.Width, hChildHints.Height) + hChild._SetChildGeometry(iX, iY, hChildHints.Width, hChildHints.Height, ContPage, hTItem, bInFixed Or Me.Fixed) + + If oChild Is ReportContainer Then + + If oChild._CurItem < oChild.Children.count Then + j = Me.Children.Find(oChild) + Me._CurItem = Min(j, Me._CurItem) + Endif + 'ne pas incrémenterla lecture des enfants si je suis dans un élément fixe + If bInFixed Then ochild._CurItem = 0 + End If + Next + TCont._PageChildren[ContPage] = aPageItems + +End + +Private Sub SetHChildGeometry(X As Float, Y As Float, W As Float, H As Float, ContPage As Integer, TCont As TControl, bInFixed As Boolean) + + Dim aPageItems As New TControl[] ''Éléments contenu par cette page + Dim hChildHints As TSizeHint ''Besoins en hauteur/largeur de l'enfant + Dim hChild As ReportControl ''Un enfant reportcontrol + Dim oChild As Object + Dim TW, fWidth, fSpc As Float + Dim fExp As Float + Dim iNExp As Integer + + Dim i, j As Integer + Dim fTmpX, fX, fY As Float + Dim hTItem As TControl + + 'Initialisation des variables + fSpc = IIf(Me._RelativeSpacing, H * Me._Spacing / 100, Me._Spacing) 'ME._Spacing + 'On retire les marges a la hauteur et les bordures + H = H - Me.Padding._Top - Me.Padding._Bottom - Me.Border._Top - Me.Border._Bottom + 'Print H + 'on retire a la largeur les paddings (et les bordure ?) + W = W - Me.Padding._Left - Me.Padding._Right - Me.Border._Left - Me.Border._Right + + 'On positionne le curseur de position au coin a gauche + X = Me.Padding._Left + Me.Border._Left + Y = Me.Padding._Top + Me.Border._Top + + 'On initialise la largeur totale avec la largeur disponible + TW = W + + For i = 0 To Me.Children.Max + + hChild = Me.Children[i] + + 'hchild._Index = IIf(Me.DataCount > 0, j, TCont.Index) + hChild._Index = TCont.Index + hChildHints = hChild._GetSizeHints(w, h, w, h, TCont.Index) + + 'Si l' éléments ne loge pas on quitte et on oublit + If TW - hChildHints.Width < 0 Then Break + + 'Si l'élément n'est pas ignoré + If Not hChild.Ignore Then + TW = TW - hChildHints.Width - fSpc + 'Si il est étendu on en tient compte + If hChild.Expand Then + Inc iNExp + fExp += hChildHints.Width + Endif + Endif + + 'On ajoute l'élément a la page + hTItem = New TControl + hTItem.Ctrl = hChild + hTItem.SizeHint = hChildHints + hTItem.Index = TCont.Index + aPageItems.Add(hTItem) + + Next + + 'De toute les façon je ne cherche pas a parcourir tout + 'Les objet donc j'indique que j'ai tout vu + Me._CurItem = Me.Children.count + + If (W - TW) > 0 Then + TW += fspc + Endif + + 'On va mettre en page a présent + 'On définit la taille des éléments étendus + If iNexp Then + fExp = (TW + fExp) / iNexp + Endif + + fTmpX = X + For Each hTItem In aPageItems + oChild = hTItem.Ctrl + 'Si l'élément est étendu on lui applique la taille répartie + If oChild.Expand And Not oChild.Ignore Then + 'If Me.Tag = "*" Then Stop + fWidth = fExp + Else + 'sinon il maintien sa taille + fWidth = hTItem.SizeHint.Width + Endif + 'oChild._Index = hTItem.Index + If Not oChild.Ignore Then + hTItem._SetGeometry(fTmpX, Y, fWidth, H) + oChild._SetChildGeometry(fTmpX, Y, fWidth, H, ContPage, hTItem, bInFixed Or Me.Fixed) + fTmpX += fWidth + fspc + Else + fX = X + IIf(oChild._RelativeLeft, W * oChild._Left / 100, oChild._Left) + fY = Y + IIf(oChild._RelativeTop, H * oChild._Top / 100, oChild._Top) + hTItem._SetGeometry(fX, fY, fWidth, hTItem.SizeHint.Height) + oChild._SetChildGeometry(fX, fY, fWidth, hTItem.SizeHint.Height, ContPage, hTItem, bInFixed Or Me.Fixed) + Endif + + If oChild Is ReportContainer Then + If oChild._CurItem <= oChild.Children.max Then + 'Print ochild.tag & " pas fini" + j = Me.Children.Find(oChild) + Me._CurItem = Min(Me._CurItem, j) + Endif + 'ne pas incrémenter la lecture des enfants si je suis dans un élément fixe + If bInFixed Then ochild._CurItem = 0 + + Endif + Next + + 'On ajoute la page a la collection de page du conteneur + TCont._PageChildren[ContPage] = aPageItems + +End + +Private Function DataCount_Read() As Integer + + Return Me._Count + +End + +Private Sub DataCount_Write(Value As Integer) + 'If value = 0 Then value = 1 + + Me._Count = Value + +End + +' Public Function _GetIndex() As Integer +' +' If Me._Count > 0 Then 'Si c'est moi le répéteur alors je fournis mon index +' Return Me._Index +' Else +' Try Return Me.Parent._GetIndex 'Sinon je ontinue a remonter la lignée jusqu'au répéteur +' Endif +' +' End + +Private Function _Index_Read() As Integer + + Return Super._Index + +End + +Private Sub _Index_Write(Value As Integer) + + If Super._Index = Value And If Super._Index > 0 Then Return + $bIndexChange = True + Super._Index = Value + +End + +Private Function _CurItem_Read() As Integer + + Return $iCurItem + +End + +Private Sub _CurItem_Write(Value As Integer) + 'Print "_CurItem = " & Value + 'If Me.tag = "Boite 1" And Value = 0 Then Stop + 'If Me.tag = "Boite 1" And ContPage = 1 Then Print "CurItem: " & Me._CurItem + + $iCurItem = Value + +End + +Private Function OnePiece_Read() As Boolean + + Return $bOnePiece + +End + +Private Sub OnePiece_Write(Value As Boolean) + + $bOnePiece = Value + +End + +Public Sub _SetCChildGeometry(X As Float, Y As Float, W As Float, H As Float, ContPage As Integer, TCont As TControl, bInFixed As Boolean) + +End diff --git a/comp/src/gb.report/.src/ReportDrawingArea.class b/comp/src/gb.report/.src/ReportDrawingArea.class new file mode 100644 index 00000000..53fd2453 --- /dev/null +++ b/comp/src/gb.report/.src/ReportDrawingArea.class @@ -0,0 +1,63 @@ +' Gambas class file + +Export +Inherits ReportFrame +Public Const _Properties As String = "*,Cached" +Public Const _Similar As String = "ReportImage" +Public Const _DefaultEvent As String = "Draw" + +Property Cached As Boolean + +Private $bCached As Boolean +Private $iOldResolution As Integer + +Event Layout(Width As Integer, Height As Integer, Index As Integer) +Event Draw(Width As Integer, Height As Integer, Index As Integer) + +Public Sub _Paint(Page As Integer, X As Float, Y As Float, hControl As TControl, DataIndex As Integer) + + Dim hRect As Rect + Dim iX, iY, iW, iH As Integer + Dim hImg As Image + + iX = (x + hControl.RealLeft + ReportUnits._ReportUnitsToPixels(Me.Padding._Left + Me.Border._Left)) + iY = (y + hControl.RealTop + ReportUnits._ReportUnitsToPixels(Me.Padding._Top + Me.Border._Top)) + iW = (hControl.RealWidth - ReportUnits._ReportUnitsToPixels(Me.Padding._Left + Me.Padding._Right + Me.Border._Left + Me.Border._Right)) + iH = (hControl.RealHeight - ReportUnits._ReportUnitsToPixels(Me.Padding._Top + Me.Padding._Bottom + Me.Border._Top + Me.Border._Bottom)) + Paint.Save + + + If $bCached Then + If $iOldResolution <> Paint.ResolutionX Or If hControl.Cache = Null Then + $iOldResolution = Paint.ResolutionX + hImg = New Image(iW, iH, Color.Transparent) + Paint.Begin(hImg) + Raise Draw(iW, iH, DataIndex) + Paint.End + hControl.Cache = himg + Else + If hControl.cache = Null Then Stop + hImg = hControl.Cache + Endif + Draw.Image(hImg, iX, iy) + Else + + Paint.Translate(iX, iY) + Raise Draw(iW, iH, DataIndex) + Paint.Translate(- iX, - iY) + Endif + Paint.Restore + +End + +Private Function Cached_Read() As Boolean + + Return $bCached + +End + +Private Sub Cached_Write(Value As Boolean) + + $bCached = Value + +End diff --git a/comp/src/gb.report/.src/ReportFrame.class b/comp/src/gb.report/.src/ReportFrame.class new file mode 100644 index 00000000..96cd44df --- /dev/null +++ b/comp/src/gb.report/.src/ReportFrame.class @@ -0,0 +1,354 @@ +' Gambas class file + +Export +Create Private +Inherits ReportControl +' Static Private iLevel As Integer +Public Const _Properties As String = "*,Border,Background{ReportBrush}" + +' Private $fLeftBorderWidth As Float +' Private $fRightBorderWidth As Float +' Private $fTopBorderWidth As Float +' Private $fBottomBorderWidth As Float + +Private $hBorder As New ReportBorder + +Private $hBackGround As ReportBrush + +Property Border As ReportBorder +Property BoxShadow As ReportBoxShadow + +Private $hBoxShadow As New ReportBoxShadow +Property BackGround As ReportBrush +'Property Read _BorderWidth As Float + +Private Function Border_Read() As ReportBorder + + Return $hBorder + +End + +Private Sub Border_Write(Value As ReportBorder) + + $hBorder = Value + +End + +Public Sub _PaintBefore((Page) As Integer, (X) As Float, (Y) As Float, (hControl) As TControl, (DataIndex) As Integer) + + Dim X1, Y1, X2, Y2 As Float + Dim iBorder As Integer + Dim hShadowActive As Boolean = $hBoxShadow._Active + Dim himgShadow As Image + Dim fSpread As Float + Dim fBlur As Float + Dim fbx As Float + Dim fby As Float + Dim TL1, TL2, TR1, TR2, BR1, BR2, BL1, BL2 As Float + 'If Me.tag = "*" Then Stop + + X1 = (x + hControl.RealLeft) + Y1 = (y + hControl.RealTop) + X2 = (x + hControl.RealLeft + hControl.RealWidth) + Y2 = (y + hControl.RealTop + hControl.RealHeight) + 'Clipping + paint.save + + ' Print String(iLevel, " ") & "sauvé" + ' Inc iLevel + ' Paint.Rectangle(X1, Y1, X2 - X1, Y2 - Y1) + ' paint.Clip(True) + + If Report.Debug Then + + Paint.Brush = Paint.Color(Color.Green) + 'Paint.Dash = ReportUnits.GetBorder(Line.Dot) + Paint.Rectangle(X1, Y1, X2 - X1, Y2 - Y1) + Paint.Stroke + + Else + 'If $hBorder.Shadow.Style > ReportShadowStyle.None Then PaintShadow(X1, Y1, hControl.RealWidth, hControl.RealHeight, $hBorder.RoundCorner._Active) + If $hBorder.RoundCorner._Active Then + TL1 = ReportUnits._ReportUnitsToPixels($hBorder.RoundCorner._TopLeft1) + TR1 = ReportUnits._ReportUnitsToPixels($hBorder.RoundCorner._TopRight1) + BR1 = ReportUnits._ReportUnitsToPixels($hBorder.RoundCorner._BottomRight1) + BL1 = ReportUnits._ReportUnitsToPixels($hBorder.RoundCorner._BottomLeft1) + TL2 = ReportUnits._ReportUnitsToPixels($hBorder.RoundCorner._TopLeft2) + TR2 = ReportUnits._ReportUnitsToPixels($hBorder.RoundCorner._TopRight2) + BR2 = ReportUnits._ReportUnitsToPixels($hBorder.RoundCorner._BottomRight2) + BL2 = ReportUnits._ReportUnitsToPixels($hBorder.RoundCorner._BottomLeft2) + + If hShadowActive Then + fbx = ReportUnits._ReportUnitsToPixels($hBoxShadow._XOffset) + fby = ReportUnits._ReportUnitsToPixels($hBoxShadow._YOffset) + fSpread = ReportUnits._ReportUnitsToPixels($hBoxShadow._Spread) + If $hBoxShadow._Blur > 0 Then + fBlur = ReportUnits._ReportUnitsToPixels($hBoxShadow._Blur) + himgShadow = New Image(hControl.RealWidth + fSpread * 2 + fBlur * 2, hControl.RealHeight + fSpread * 2 + fBlur * 2, Color.Transparent) + Paint.Begin(himgShadow) + Paint.Brush = Paint.Color($hBoxShadow.Color) + RoundRect(fBlur, fBlur, Paint.Width - fBlur * 2, Paint.Height - fBlur * 2, [TL1, TR1, BR1, BL1], [TL2, TR2, BR2, BL2]) + Paint.Fill + Paint.End + himgShadow.Fuzzy(fBlur) + Draw.Image(himgShadow, X1 + fbx - fSpread - fBlur, Y1 + fby - fSpread - fBlur) + Else + + Paint.Brush = Paint.Color($hBoxShadow.Color) + RoundRect(X1 + fbx - fSpread, Y1 + fby - fSpread, hControl.RealWidth + fSpread * 2, hControl.RealHeight + fSpread * 2, [TL1, TR1, BR1, BL1], [TL2, TR2, BR2, BL2]) + Paint.Fill + Endif + Endif + + iBorder = ReportUnits._ReportUnitsToPixels($hBorder._Top) + + RoundRect(X1 + iBorder, Y1 + iBorder, hControl.RealWidth - iBorder * 2, hControl.RealHeight - iBorder * 2, [TL1, TR1, BR1, BL1], [TL2, TR2, BR2, BL2]) + + Else + + If hShadowActive Then + fbx = ReportUnits._ReportUnitsToPixels($hBoxShadow._XOffset) + fby = ReportUnits._ReportUnitsToPixels($hBoxShadow._YOffset) + fSpread = ReportUnits._ReportUnitsToPixels($hBoxShadow._Spread) + If $hBoxShadow._Blur > 0 Then + fBlur = ReportUnits._ReportUnitsToPixels($hBoxShadow._Blur) + himgShadow = New Image(hControl.RealWidth + fSpread * 2 + fBlur * 2, hControl.RealHeight + fSpread * 2 + fBlur * 2, Color.Transparent) + Paint.Begin(himgShadow) + Paint.Brush = Paint.Color($hBoxShadow.Color) + Paint.rectangle(fBlur, fBlur, Paint.Width - fBlur * 2, Paint.Height - fBlur * 2) + Paint.Fill + Paint.End + himgShadow.Fuzzy(fBlur) + Draw.Image(himgShadow, X1 + fbx - fSpread - fBlur, Y1 + fby - fSpread - fBlur) + Else + Endif + Paint.Brush = Paint.Color($hBoxShadow.Color) + Paint.Rectangle(X1 + fbx - fSpread, Y1 + fby - fSpread, hControl.RealWidth + fSpread * 2, hControl.RealHeight + fSpread * 2) + Paint.Fill + Endif + + Paint.Rectangle(X1, Y1, X2 - X1, Y2 - Y1) + + Endif + + If Me.BackGround = Null Then + paint.Clip + Return + Else + paint.Clip(True) + Endif + paint.Brush = Me.BackGround._PaintBrush(X1, Y1, X2, Y2) + + Paint.Fill + + Endif + +End + +Private Sub PaintBoxShadow(X As Integer, Y As Integer, Width As Integer, Height As Integer) + +End + +Public Sub _PaintFrame((Page) As Integer, (X) As Float, (Y) As Float, (hControl) As TControl, (DataIndex) As Integer) + + _PaintBefore(Page, X, Y, hControl, DataIndex) + Me._Paint(Page, X, Y, hControl, DataIndex) + _PaintAfter(Page, X, Y, hControl, DataIndex) + +End + +Public Sub _PaintAfter((Page) As Integer, (X) As Float, (Y) As Float, (hControl) As TControl, (DataIndex) As Integer) + + Dim X1, Y1, X2, Y2 As Float + 'Dim fWidth As Float + + Dim fTopWidth, fBottomWidth, fLeftWidth, fRighWidth As Float + + 'Fin du clipping + paint.Restore + + X1 = (x + hControl.RealLeft) + Y1 = (y + hControl.RealTop) + X2 = (x + hControl.RealLeft + hControl.RealWidth) + Y2 = (y + hControl.RealTop + hControl.RealHeight) + 'If Me.Tag = "**" Then Stop + If $hBorder.RoundCorner._Active Then + Paint.AntiAlias = True + fLeftWidth = ReportUnits._ReportUnitsToPixels($hBorder._Left) / 2 + paint.LineWidth = fLeftWidth * 2 + paint.Brush = $hBorder.Left.Brush._PaintBrush(X1, Y1, X2, Y2) + ' RoundRect(Paint.LineWidth / 2, Paint.LineWidth / 2, Paint.Width - Paint.LineWidth, Paint.Height - Paint.LineWidth, aX, aY) + RoundRect(X1 + fLeftWidth, Y1 + fLeftWidth, hControl.RealWidth - fLeftWidth * 2, hControl.RealHeight - fLeftWidth * 2, + [ReportUnits._ReportUnitsToPixels($hBorder.RoundCorner._TopLeft1), + ReportUnits._ReportUnitsToPixels($hBorder.RoundCorner._TopRight1), + ReportUnits._ReportUnitsToPixels($hBorder.RoundCorner._BottomRight1), + ReportUnits._ReportUnitsToPixels($hBorder.RoundCorner._BottomLeft1)], + [ReportUnits._ReportUnitsToPixels($hBorder.RoundCorner._TopLeft2), + ReportUnits._ReportUnitsToPixels($hBorder.RoundCorner._TopRight2), + ReportUnits._ReportUnitsToPixels($hBorder.RoundCorner._BottomRight2), + ReportUnits._ReportUnitsToPixels($hBorder.RoundCorner._BottomLeft2)]) + paint.Stroke + + Else + 'Paint.AntiAlias = False + fLeftWidth = ReportUnits._ReportUnitsToPixels($hBorder._Left) + fRighWidth = ReportUnits._ReportUnitsToPixels($hBorder._Right) + fTopWidth = ReportUnits._ReportUnitsToPixels($hBorder._Top) + fBottomWidth = ReportUnits._ReportUnitsToPixels($hBorder._Bottom) + + 'If $hBorder.Style <> Line.None Then + + 'fWidth = ReportUnits._ReportUnitsToPixels($fBorderWidth) + + 'Paint.Brush = Paint.Color($hBorder.Brush._iValue) + + If fTopWidth > 0 Then + paint.Brush = $hBorder.Top.Brush._PaintBrush(X1, Y1, X2, Y2) + paint.Rectangle(X1, Y1, X2 - X1, fTopWidth) + paint.Fill + Endif + If fRighWidth > 0 Then + paint.Brush = $hBorder.Right.Brush._PaintBrush(X1, Y1, X2, Y2) + paint.Rectangle(X2 - fRighWidth, Y1, fRighWidth, Y2 - Y1) + paint.Fill + Endif + If fBottomWidth > 0 Then + paint.Brush = $hBorder.Bottom.Brush._PaintBrush(X1, Y1, X2, Y2) + paint.Rectangle(X1, Y2 - fBottomWidth, X2 - X1, fBottomWidth) + paint.Fill + Endif + If fLeftWidth > 0 Then + paint.Brush = $hBorder.Left.Brush._PaintBrush(X1, Y1, X2, Y2) + paint.Rectangle(X1, Y1, fLeftWidth, Y2 - Y1) + paint.Fill + Endif + 'Paint.AntiAlias = True + ' + + Endif + 'Dec iLevel + 'Print String(iLevel, " ") & "restoré" + + 'Endif + +End + +Private Function BackGround_Read() As ReportBrush + + Return $hBackGround + +End + +Private Sub BackGround_Write(Value As ReportBrush) + + $hBackGround = Value + +End + +Public Sub _SetUnifiedValues() + + Super._SetUnifiedValues() + $hBorder._SetUnifiedValues + $hBoxShadow._SetUnifiedValues + +End + +Public Sub _GetSizeHints((AvailableW) As Float, (AvailableH) As Float, (TotalWidth) As Float, (TotalHeight) As Float, DataIndex As Integer) As TSizeHint + + Dim hMyHints As TSizeHint + + hMyHints = Super._GetSizeHints(AvailableW, AvailableH, TotalWidth, TotalHeight, DataIndex) + + If hMyHints.Height <= 0 Then + hMyHints.Height = Me.Padding._Top + Me.Padding._Bottom + Me.Border._Top + Me.Border._Bottom + 'hMyHints.Height += Abs($hBoxShadow._YOffset) + $hBoxShadow._Spread + $hBoxShadow._Blur + Endif + + If hMyHints.Width <= 0 Then + hMyHints.Width = Me.Padding._Left + Me.Padding._Right + Me.Border._Left + Me.Border._Right + 'hMyHints.Width += Abs($hBoxShadow._xOffset) + $hBoxShadow._Spread + $hBoxShadow._Blur + Endif + + Return hMyHints + +End + +Static Private Sub RoundRect(x As Float, y As Float, w As Float, h As Float, Radius_X As Float[], radius_y As Float[]) + + Dim ARC_TO_BEZIER As Float = 0.55228475 + Dim c1, c2 As Float + Dim i As Integer + + For i = 0 To 3 + If radius_x[i] > w - radius_x[i] Then + radius_x[i] = w / 2 + Endif + + If radius_y[i] > h - radius_y[i] Then + radius_y[i] = h / 2 + Endif + + Next + 'approximate(quite Close )the arc using a bezier curve + + ' A**********B + ' H C + ' * * + ' * * + ' G D + ' F**********E + + '-->A + Paint.MoveTo(x + radius_x[0], y) + + '-->B + Paint.LineTo(x + w - radius_x[1], y) + + '-->C + c1 = ARC_TO_BEZIER * radius_x[1] + c2 = ARC_TO_BEZIER * radius_y[1] + Paint.RelCurveTo(c1, 0.0, radius_x[1], c2, radius_x[1], radius_y[1]) + + '-->D + Paint.LineTo(x + w, y + h - radius_y[2]) + + '-->E + c1 = ARC_TO_BEZIER * radius_x[2] + c2 = ARC_TO_BEZIER * radius_y[2] + Paint.RelCurveTo(0.0, c2, c1 - radius_x[2], radius_y[2], - radius_x[2], radius_y[2]) + + '-->F + Paint.LineTo(x + radius_x[3], y + h) + + '-->G + c1 = ARC_TO_BEZIER * radius_x[3] + c2 = ARC_TO_BEZIER * radius_y[3] + Paint.RelCurveTo(- c1, 0, - radius_x[3], - c2, - radius_x[3], - radius_y[3]) + + '-->H + Paint.LineTo(x, y + radius_y[0]) + + '-->A + c1 = ARC_TO_BEZIER * radius_x[0] + c2 = ARC_TO_BEZIER * radius_y[0] + Paint.relcurveto(0.0, - c2, radius_x[0] - c1, - radius_y[0], radius_x[0], - radius_y[0]) + + 'Paint.closepath() + +End + +Private Function BoxShadow_Read() As ReportBoxShadow + + Return $hBoxShadow + +End + +Private Sub BoxShadow_Write(Value As ReportBoxShadow) + + $hBoxShadow = Value + +End + +Public Sub _Free() + +End diff --git a/comp/src/gb.report/.src/ReportGridView.class b/comp/src/gb.report/.src/ReportGridView.class new file mode 100644 index 00000000..3b61daf1 --- /dev/null +++ b/comp/src/gb.report/.src/ReportGridView.class @@ -0,0 +1,188 @@ +' Gambas class file + +Export +Inherits ReportFrame +Public Const _Properties As String = "*" +Public Const _Similar As String = "ReportTextLabel" +Public Const _DefaultEvent As String = "Data" + +Property Read Columns As _ReportGridViewColumns +Property Read Rows As _ReportGridViewRows +'Property Autoresize As Boolean + +Private $bAutoresize As Boolean +Private $hColumns As _ReportGridViewColumns +Private $hRows As _ReportGridViewRows + + + + +Event Data(Row As Integer, Column As Integer) + +Public Sub _new() + $hColumns = New _ReportGridViewColumns As "Columns" + $hRows = New _ReportGridViewRows As "Rows" + + +End + + +Public Sub _SetUnifiedValues() + + Dim i As Integer + Super._SetUnifiedValues + $hRows._SetUnifiedValues() + $hColumns._SetUnifiedValues() + ' For i = 0 To $hColumns.Max + ' $hColumns[i]._Width = TSizeParse[$hColumns[i].Width].ToCm() + ' Next + ' + ' For i = 0 To $hRows.Max + ' $hRows[i]._Height = TSizeParse[$hRows[i].Height].ToCm() + ' Next + + +End + + + +Public Sub _GetSizeHints((AvailableW) As Float, (AvailableH) As Float, (TotalWidth) As Float, (TotalHeight) As Float, DataIndex As Integer) As TSizeHint + + Dim hMyHints As New TSizeHint + Dim fWidth As Float + Dim i As Integer + 'On Récupère la taille standard + hMyHints = Super._GetSizeHints(AvailableW, AvailableH, TotalWidth, TotalHeight, DataIndex) + If hMyHints.Width = 0 Then hMyHints.Width = 1 + If hMyHints.Height = 0 Then hMyHints.Height = 5 + + If Me.Autoresize Or If (Me._Width = 0 And Me._Height = 0) Then + + 'Largeur + + ' For i = 0 To $hColumns.Max + ' + ' fWidth += $hColumns[i].Width + ' + ' Next + + + + Endif + + + + + + Return hMyHints + + End + +Public Sub _Paint(Page As Integer, X As Float, Y As Float, hControl As TControl, DataIndex As Integer) + + Dim iColWidth As Float = ReportUnits._ReportUnitsToPixels(Me.Rows._Width) + Dim iRowHeight As Float = ReportUnits._ReportUnitsToPixels(Me.Rows._Height) + Dim i, j As Integer + Dim fCurY, fCurX, fH, fRow As Float + Dim fRowWidth As Float = ReportUnits._ReportUnitsToPixels($hRows._Width) + Dim fColHeight As Float = ReportUnits._ReportUnitsToPixels($hColumns._Height) + Dim fX As Float = X + hControl.RealLeft + ReportUnits._ReportUnitsToPixels(Me.Border._Left) + Dim fY As Float = Y + hControl.RealTop + ReportUnits._ReportUnitsToPixels(Me.Border._Top) + 'Paint.Brush = Paint.Color(Color.Red) + 'Paint.Rectangle(X + hControl.RealLeft, Y + hControl.RealTop, hControl.RealWidth, hControl.RealHeight) + 'Paint.Fill + Paint.LineWidth = ReportUnits._ReportUnitsToPixels(Me.Border._Top) + + + fCurY = fY + fColHeight + + + For i = 0 To $hRows.Max + + Paint.MoveTo(fX, fCurY) + Paint.LineTo(fX + hControl.RealWidth, fCurY) + fCurY += ReportUnits._ReportUnitsToPixels($hRows[i]._Height) + + Next + + fCurX = fX + fRowWidth + + For i = 0 To $hColumns.max + + Paint.MoveTo(fCurX, fY) + Paint.LineTo(fCurX, fY + hControl.RealHeight) + fCurX += ReportUnits._ReportUnitsToPixels($hColumns[i]._Width) + + Next + + + + + + + Paint.Stroke + + + + + + + + + + + + fCurY = fY + fColHeight + For i = 0 To $hRows.Max + fH = ReportUnits._ReportUnitsToPixels($hRows[i]._Height) + Paint.Text($hRows[i].Text, fX, fCurY, fRowWidth, fH, Align.Right) + Paint.Fill + fCurY += fH + Next + + + + + + + + + + + +End + + + + + + + + + + + + +Private Function Columns_Read() As _ReportGridViewColumns + + Return $hColumns + +End + +Private Function Rows_Read() As _ReportGridViewRows + + Return $hRows + +End + +Private Function Autoresize_Read() As Boolean + + Return $bAutoresize + +End + +Private Sub Autoresize_Write(Value As Boolean) + + $bAutoresize = Value + +End diff --git a/comp/src/gb.report/.src/ReportGridView/_ReportGridViewCell.class b/comp/src/gb.report/.src/ReportGridView/_ReportGridViewCell.class new file mode 100644 index 00000000..f5baf4d7 --- /dev/null +++ b/comp/src/gb.report/.src/ReportGridView/_ReportGridViewCell.class @@ -0,0 +1 @@ +' Gambas class file diff --git a/comp/src/gb.report/.src/ReportGridView/_ReportGridViewColumn.class b/comp/src/gb.report/.src/ReportGridView/_ReportGridViewColumn.class new file mode 100644 index 00000000..f26daa8a --- /dev/null +++ b/comp/src/gb.report/.src/ReportGridView/_ReportGridViewColumn.class @@ -0,0 +1,18 @@ +' Gambas class file + +Property Width As String +Public _Width As Float + + + +Private Function Width_Read() As String + + + +End + +Private Sub Width_Write(Value As String) + + + +End diff --git a/comp/src/gb.report/.src/ReportGridView/_ReportGridViewColumns.class b/comp/src/gb.report/.src/ReportGridView/_ReportGridViewColumns.class new file mode 100644 index 00000000..bc35faca --- /dev/null +++ b/comp/src/gb.report/.src/ReportGridView/_ReportGridViewColumns.class @@ -0,0 +1,117 @@ +' Gambas class file + +Property Count As Integer +Property Read max As Integer + +Property Width As String +Private $sWidth As String +Property Height As String +Private $sHeight As String +Public _Height As Float +Private $aColumns As New _ReportGridViewColumn[] +Event _Foo + + + + + +Public Sub _SetUnifiedValues() + Dim hCol As _ReportGridViewColumn + If $sHeight Then + _Height = TSizeParse[$sHeight].ToCm() + Else + _Height = ReportUnits._PixelsToReportUnits(GetView().Font.TextHeight("")) + Endif + + For Each hcol In $aColumns + + If hcol.Width Then + hcol._Width = TSizeParse[hcol.Width].ToCm() + Else + 'TODO: Calcul de la largeur des colonnes + hcol._Width = 2 + Endif + Next + + + + +End + + + + + + + + +Private Function Count_Read() As Integer + + Return $aColumns.Max + +End + +Public Function _get(Index As Integer) As _ReportGridViewColumn + + Return $aColumns[Index] + +End + + + +Private Sub Count_Write(Value As Integer) +Dim hRow As _ReportGridViewColumn +Dim i As Integer + If Value = $aColumns.Count Then Return + If Value > $aColumns.Count Then + For i = $aColumns.Count To Value + hRow = New _ReportGridViewColumn + $aColumns.Add(hRow) + Next + + Else + + $aColumns.Remove(Value, $aColumns.Count - Value) + + Endif + +End + +Private Function max_Read() As Integer + + Return $aColumns.Max + +End + +Private Function Width_Read() As String + + If $aColumns.Count Then + Return $aColumns[0].Width + Endif + +End + +Private Sub Width_Write(Value As String) + Dim hCol As _ReportGridViewColumn + For Each hcol In $aColumns + hcol.Width = Value + Next +End + +Private Function Height_Read() As String + + Return $sHeight + +End + +Private Sub Height_Write(Value As String) + + $sHeight = Value + +End + +Private Sub GetView() As ReportGridView + + Return Object.Parent(Me) + +End diff --git a/comp/src/gb.report/.src/ReportGridView/_ReportGridViewRow.class b/comp/src/gb.report/.src/ReportGridView/_ReportGridViewRow.class new file mode 100644 index 00000000..153324af --- /dev/null +++ b/comp/src/gb.report/.src/ReportGridView/_ReportGridViewRow.class @@ -0,0 +1,51 @@ +' Gambas class file + +Property Height As String +Property Text As String + +Property _Height As Float + +Public _Row As Integer +Event _Foo + +Private Function Height_Read() As String + + + +End + +Private Sub Height_Write(Value As String) + + + +End + +Private Function Text_Read() As String + + Return GetView()._GetRowText(_Row) + +End + +Private Sub Text_Write(Value As String) + + + +End + +Private Function _Height_Read() As Float + + Return GetView()._GetHeight() + +End + +Private Sub _Height_Write(Value As Float) + + + +End + +Private Sub GetView() As _ReportGridViewRows + + Return Object.Parent(Me) + +End \ No newline at end of file diff --git a/comp/src/gb.report/.src/ReportGridView/_ReportGridViewRows.class b/comp/src/gb.report/.src/ReportGridView/_ReportGridViewRows.class new file mode 100644 index 00000000..5d9fda26 --- /dev/null +++ b/comp/src/gb.report/.src/ReportGridView/_ReportGridViewRows.class @@ -0,0 +1,160 @@ +' Gambas class file + +Property Count As Integer +Property Read Max As Integer + +Private $cHeight As Collection +Private $aHeight As Integer[] +Private $cText As Collection +Private $nRows As Integer + +Property Height As String +Property Width As String + +Private $sHeight As String +Private $sWidth As String + +Private $fWidth As Float +Private $fHeight As Float +Property Read _Height As Float +Property Read _Width As Float + + + +Event _Foo + +Public Sub _SetUnifiedValues() + Dim hView As ReportGridView = GetView() + If $sHeight Then + $fHeight = TSizeParse[$sHeight].ToCm() + Else + $fHeight = ReportUnits._PixelsToReportUnits(hView.Font.Height + 4) + Endif + + If $sWidth Then + $fWidth = TSizeParse[$sWidth].ToCm() + + Else + $fWidth = ReportUnits._PixelsToReportUnits(hView.Font.TextWidth("9") * (1 + CInt(Log10(Max(1, $nRows)))) + 8) + Endif + + +End + +Public Sub _GetHeight() As Float + + Return $fHeight + +End + + + +Public Sub _GetRowText(iRow As Integer) As String + + Dim sText As String + + If $cText Then sText = $cText[iRow] + If Not sText Then sText = CStr(iRow + 1) + Return sText + +End + +Public Sub _SetRowText(iRow As Integer, sText As String) + + Dim W As Float + + If Not $cText Then $cText = New Collection + $cText[iRow] = sText + If sText Then + W = ReportUnits._PixelsToReportUnits(GetView().Font.TextWidth(sText) + 8) + If W > _Width_Read() Then $fWidth = W + Endif + +End + + + +Public Function _get(Index As Integer) As _ReportGridViewRow + Dim hRow As New _ReportGridViewRow As "Row" + hRow._Row = Index + Return hRow + +End + + +Private Function Count_Read() As Integer + + Return $nRows + +End + +Private Sub Count_Write(Value As Integer) +Dim hView As ReportGridView = GetView() + Dim iRow As Integer + + If Value = $nRows Then Return + + $nRows = Value + + If $aHeight Then + While $aHeight.Count + If $aHeight[$aHeight.Max] < $nRows Then Break + iRow = $aHeight[$aHeight.Max] + $cHeight.Remove(iRow) + $aHeight.Remove($aHeight.Max) + 'If hView.Mode = Select.Multiple Then $hSel.UnSelect(iRow) + Wend + Endif + +End + +Private Function Max_Read() As Integer + + Return $nRows - 1 + +End + +Private Sub GetView() As ReportGridView + + Return Object.Parent(Me) + +End + +Private Function Height_Read() As String + + Return $sHeight + +End + +Private Sub Height_Write(Value As String) + + $sHeight = Value + +End + +Private Function _Height_Read() As Float + + + Return $fHeight + +End + +Private Function _Width_Read() As Float + + Return $fWidth + +End + + +Private Function Width_Read() As String + + Return $sWidth + +End + +Private Sub Width_Write(Value As String) + + $sWidth = value + +End + diff --git a/comp/src/gb.report/.src/ReportHBox.class b/comp/src/gb.report/.src/ReportHBox.class new file mode 100644 index 00000000..95bff9e9 --- /dev/null +++ b/comp/src/gb.report/.src/ReportHBox.class @@ -0,0 +1,21 @@ +' Gambas class file + +Export + +Inherits ReportContainer + +Public Const _Properties As String = "*" +Public Const _Similar As String = "ReportVBox" +Public Const _DefaultArrangement As String = "H" + +Public Sub _new() + + Super._Arrangement = Arrange.Horizontal + +End + +Public Sub _Free() + + Super._Free + +End diff --git a/comp/src/gb.report/.src/ReportImage.class b/comp/src/gb.report/.src/ReportImage.class new file mode 100644 index 00000000..78e95f01 --- /dev/null +++ b/comp/src/gb.report/.src/ReportImage.class @@ -0,0 +1,186 @@ +' Gambas class file + +Export +Inherits ReportFrame + +Public Const _Properties As String = "*,Stretch{Report.None;Proportional;Fill}=Proportional,Alignment{Align.*},Image{Image}" +Public Const _Similar As String = "ReportTextLabel" +Public Const _DefaultEvent As String = "Data" + +Private $iAlignment As Integer = Align.Normal +Private $hPic As Image +Private $iStretchMode As Integer = Report.Proportional + +Property Alignment As Integer +Property Image As Image +Property Stretch As Integer + + + +Public Data As Image + +Event Data(Index As Integer) + +Public Sub _GetSizeHints((AvailableW) As Float, (AvailableH) As Float, (TotalWidth) As Float, (TotalHeight) As Float, DataIndex As Integer) As TSizeHint + + Dim hMyHints As New TSizeHint + + + Dim hPic As Image + + hMyHints = Super._GetSizeHints(AvailableW, AvailableH, TotalWidth, TotalHeight, DataIndex) + + If Me.Autoresize Or If (Me._Width = 0 And Me._Height = 0) Then + If $hpic Then + hpic = $hpic + Else + Raise Data(DataIndex) + hpic = Data + Endif + + If hpic Then + hMyHints.Width = Max(hMyHints.Width, Me.Padding._Left + ReportUnits.UnitToCm(hpic.Width, "px") + Me.Padding._Right) + hMyHints.Height = Max(hMyHints.Width, Me.Padding._Top + ReportUnits.UnitToCm(hpic.Height, "px") + Me.Padding._Bottom) + Endif + + Endif + + Return hMyHints + +End + +Public Sub _Paint(Page As Integer, X As Float, Y As Float, hControl As TControl, DataIndex As Integer) + + Dim ix, iy As Float + Dim hBrush As PaintBrush + Dim hPic As Image + + Dim w, h As Float + + + ix = x + hControl.RealLeft '+ ReportUnits._ReportUnitsToPixels(Me.Padding._Left) + iy = y + hControl.RealTop '+ ReportUnits._ReportUnitsToPixels(Me.Padding._Top) + + If Not $hpic Then + Raise Data(DataIndex) + hpic = Data + If Not hPic Then Return + Else + hPic = $hpic + Endif + + '$hPic = $hPic.Stretch(hControl.RealWidth, hControl.RealHeight) + + hBrush = Paint.Image(hpic) + + If Me.Stretch = Report.Fill Then + iX += ReportUnits._ReportUnitsToPixels(Me.Padding._Left + Me.Border._Left) + iY += ReportUnits._ReportUnitsToPixels(Me.Padding._Top + Me.Border._Top) + w = (hControl.RealWidth - ReportUnits._ReportUnitsToPixels(Me.Padding._Left + Me.Padding._Right + Me.Border._Left + Me.Border._Right)) + h = (hControl.RealHeight - ReportUnits._ReportUnitsToPixels(Me.Padding._Top + Me.Padding._Bottom + Me.Border._Top + Me.Border._Bottom)) + hBrush.Translate(ix, iy - 1) + hBrush.Scale(w / hPic.Width, h / hPic.Height) + Paint.Brush = hBrush + Paint.Rectangle(ix, iy, w, h) + Else + + If $iStretchMode = Report.Proportional Then + 'on détermine la partie prédominante + If hpic.Width >= hpic.Height + 'C'est la largeur + 'on détermine une hauteur en fonction de la largeur connue + w = hControl.RealWidth - ReportUnits._ReportUnitsToPixels(Me.Padding._Width) + h = hPic.H / hpic.W * w + 'si h> a la place disponible alors on adapte en fonction de h en faite + If h > (hControl.RealHeight - ReportUnits._ReportUnitsToPixels(Me.Padding._Height)) Then + h = (hControl.RealHeight - ReportUnits._ReportUnitsToPixels(Me.Padding._Height)) + w = hpic.w / hpic.H * h + Endif + + Else + 'C'est la hauteur + h = (hControl.RealHeight - ReportUnits._ReportUnitsToPixels(Me.Padding._Height)) + w = hpic.w / hpic.H * h + 'si w> la place disponible alors on adapte en fonction de w en faite + If w > (hControl.RealWidth - ReportUnits._ReportUnitsToPixels(Me.Padding._Width)) Then + w = hControl.RealWidth - ReportUnits._ReportUnitsToPixels(Me.Padding._Width) + h = hPic.H / hpic.W * w + Endif + Endif + + Else + w = hpic.Width + h = hpic.H + + Endif + + Select Case $iAlignment + Case Align.Normal, Align.TopLeft, Align.Left, Align.BottomLeft + 'Gauche + ix += ReportUnits._ReportUnitsToPixels(Me.Padding._Left) + Case Align.Bottom, Align.Center, Align.Top + 'centrée + ix += (hControl.RealWidth - w) / 2 + + Case Align.TopRight, Align.Right, Align.BottomRight + 'Droite + ix += hControl.RealWidth - ReportUnits._ReportUnitsToPixels(Me.Padding._Right) - w + End Select + + Select Case $iAlignment + Case Align.TopLeft, Align.Top, Align.TopRight + 'Haut + iy += ReportUnits._ReportUnitsToPixels(Me.Padding._Top) + Case Align.Left, Align.Center, Align.Right + 'Milieu + iy += (hControl.RealHeight - h) / 2 + Case Align.BottomLeft, Align.Bottom, Align.BottomRight + iY += hControl.RealHeight - ReportUnits._ReportUnitsToPixels(Me.Padding._Bottom) - h + End Select + hBrush.Translate(ix, iy - 1) + hBrush.Scale(w / hpic.Width, h / hpic.H) + Paint.Brush = hBrush + Paint.Rectangle(ix, iy, w, h - 1) + Endif + Paint.Fill + +End + +Private Function Image_Read() As Image + + Return $hPic + +End + +Private Sub Image_Write(Value As Image) + + $hPic = Value + 'If Left(Me.Width, 1) = "0" Then Me.Width = $hpic.Width & " px" + 'If Left(Me.Height, 1) = "0" Then Me.Height = $hpic.Height & " px" + +End + +Private Function Alignment_Read() As Integer + + Return $iAlignment + +End + +Private Sub Alignment_Write(Value As Integer) + + $iAlignment = Value + +End + +Private Function Stretch_Read() As Integer + + Return $iStretchMode + +End + +Private Sub Stretch_Write(Value As Integer) + + $iStretchMode = Value + +End + diff --git a/comp/src/gb.report/.src/ReportLabel.class b/comp/src/gb.report/.src/ReportLabel.class new file mode 100644 index 00000000..c44fb1f7 --- /dev/null +++ b/comp/src/gb.report/.src/ReportLabel.class @@ -0,0 +1,226 @@ +' Gambas class file + +Export +Inherits ReportFrame + +Public Const _Properties As String = "*,Text,Format,Alignment{Align.*},Rotate{Angle:Degrees},UseField" '"*,Text,Key,Format,Alignment{Align.*},UseField" +Public Const _Similar As String = "ReportTextLabel" +Public Const _DefaultEvent As String = "Data" +Private $sText As String +Private $iAlignment As Integer = Align.Normal +Private $bIsSpecial As Boolean + +Private $sKey As String +Private $sFormat As String +Private $bUseField As Boolean +Private $fAngle As Float + +Property Text As String +Property Alignment As Integer +Property IsSpecial As Boolean +'Property Key As String +Property {Format} As String +Property UseField As Boolean +Property Rotate As Float + +Public Data As String +Event Data(Index As Integer) + +Private Function Text_Read() As String + + Return $sText + +End + +Private Sub Text_Write(Value As String) + + $sText = Value + 'Me._Count = 2 + +End + +Private Function Alignment_Read() As Integer + + Return $iAlignment + +End + +Private Sub Alignment_Write(Value As Integer) + + $iAlignment = Value + +End + +Public Sub _GetSizeHints((AvailableW) As Float, (AvailableH) As Float, (TotalWidth) As Float, (TotalHeight) As Float, DataIndex As Integer) As TSizeHint + + Dim hMyHints As New TSizeHint + Dim fTextHeight As Float + Dim fTextWidth As Float + Dim hext As PaintExtents + Dim hRect As RectF + Dim sText As String + + 'On Récupère la taille standard + hMyHints = Super._GetSizeHints(AvailableW, AvailableH, TotalWidth, TotalHeight, DataIndex) + + 'if the size choosed by the user is less than the font height, set the object to the font height + + If Me.Autoresize Or If (Me._Width = 0 And Me._Height = 0) Then + If Not IsNull(Me.Font) Then Paint.Font = Me.Font + If Not $sText Then + Raise Data(DataIndex) + sText = Data + + Else + sText = $sText + Endif + If $fAngle = 0.0 Then + + hRect = Paint.TextSize(sText) + fTextWidth = Me.Padding._Left + Me.Border._Left + ReportUnits._PixelsToReportUnits(hRect.Width) + Me.Padding._Right + Me.Border._Right + fTextHeight = ReportUnits._PixelsToReportUnits(hRect.Height) + Me.Padding._Top + Me.Padding._Bottom + Me.Border._Top + Me.Border._Bottom + 'Debug Paint.Font.Height * Paint.ResolutionX / Desktop.Resolution + + Else + Paint.Save + Paint.Rotate(Rad($fAngle)) + Paint.Text(sText, 0, 0) + hExt = Paint.PathExtents + fTextWidth = Me.Padding._Left + Me.Border._Left + ReportUnits._PixelsToReportUnits(hExt.Width) + Me.Padding._Right + Me.Border._Right + fTextHeight = ReportUnits._PixelsToReportUnits(hExt.Height) + Me.Padding._Top + Me.Padding._Bottom + Me.Border._Top + Me.Border._Bottom + Paint.Restore + Endif + hMyHints.Height = Max(hMyHints.Height, fTextHeight) + hMyHints.Width = Max(hMyHints.Width, fTextWidth) + Endif + 'Me._SizeInt = hMyHints + Return hMyHints + +End + +Public Sub _Paint(Page As Integer, X As Float, Y As Float, hControl As TControl, DataIndex As Integer) + + Dim sTempText As Variant + Dim iX, iY, iW, iH As Integer + + + If $sText Then + sTempText = $sText + Else + Raise Data(DataIndex) + sTempText = Data + Endif + + If $sFormat Then + Try sTempText = Format(sTempText, $sFormat) + Endif + If $bUseField Then + sTempText = DecodeText(sTempText, Page) + Endif + + + iX = (x + hControl.RealLeft + ReportUnits._ReportUnitsToPixels(Me.Padding._Left + Me.Border._Left)) + iY = (y + hControl.RealTop + ReportUnits._ReportUnitsToPixels(Me.Padding._Top + Me.Border._Top)) + iW = (hControl.RealWidth - ReportUnits._ReportUnitsToPixels(Me.Padding._Left + Me.Padding._Right + Me.Border._Left + Me.Border._Right)) + + iH = (hControl.RealHeight - ReportUnits._ReportUnitsToPixels(Me.Padding._Top + Me.Padding._Bottom + Me.Border._Top + Me.Border._Bottom)) + + Paint.Brush = Me._GetActualBrush(iX, iY, iX + hControl.RealWidth, iY + hControl.RealHeight) + + If Report.Debug Then + + Paint.Brush = Paint.Color(Color.Red) + Paint.Rectangle(ix, iy, iw, ih) + Paint.Stroke + + Endif + + 'Set the Font if it is initialized + If Not IsNull(Me.Font) Then + Paint.Font = Me.Font + + Endif + + + If $fAngle = 0.0 Then + + Paint.Text(sTempText, iX, iY, iW, iH, $iAlignment) + Else + Paint.Translate(iX + iW / 2, iY + iH / 2) + Paint.Rotate(Rad($fAngle)) + Paint.Translate(- (iX + iW / 2), - (iY + iH / 2)) + Paint.Text(sTempText, iX, iY, iW, iH, Align.Center) + + Endif + Paint.Fill + + 'Paint.ResetClip + 'Paint.Restore + 'Paint.Restore + 'If $sKey Then $sText = Null + 'Draw.Clip.Enabled = False + +End + +Private Function IsSpecial_Read() As Boolean + + Return $bIsSpecial + +End + +Private Sub IsSpecial_Write(Value As Boolean) + + $bIsSpecial = Value + +End + + +Private Function Format_Read() As String + + Return $sFormat + +End + +Private Sub Format_Write(Value As String) + + $sFormat = Value + +End + +Private Function DecodeText(sText As String, Optional Page As Integer, Optional ForSize As Boolean = False) As String + + If ForSize Then + If InStr(sText, "$PAGE") Then sText = Replace(sText, "$PAGE", "999") + If InStr(sText, "$NPAGE") Then sText = Replace(sText, "$NPAGE", "999") + Else + If InStr(sText, "$PAGE") Then sText = Replace(sText, "$PAGE", Str(Page + 1)) + If InStr(sText, "$NPAGE") Then sText = Replace(sText, "$NPAGE", Str(Me.Report.PageCount)) + Endif + + Return sText + +End + +Private Function UseField_Read() As Boolean + + Return $bUseField + +End + +Private Sub UseField_Write(Value As Boolean) + + $bUseField = Value + +End + +Private Function Rotate_Read() As Float + + Return $fAngle + +End + +Private Sub Rotate_Write(Value As Float) + + $fAngle = Value + +End diff --git a/comp/src/gb.report/.src/ReportLine.class b/comp/src/gb.report/.src/ReportLine.class new file mode 100644 index 00000000..de2723e1 --- /dev/null +++ b/comp/src/gb.report/.src/ReportLine.class @@ -0,0 +1,127 @@ +' Gambas class file + +Export +Inherits ReportControl + +Public Const _Properties As String = "*,Direction{Align.TopLeft;Top;TopRight;Left;Right;BottomLeft;Bottom;BottomRight}=BottomRight,LineWidth{ReportCoord}=2 px" +Public Const _Similar As String = "ReportTextLabel" +Property Direction As Integer + +Private $fLineWidth As Float = 1.0 + +Private $iLineStyle As Integer = Line.solid +Private $iDirection As Integer = Align.BottomRight +Private $sLineWidth As String = "2px" +Property LineWidth As String +Property LineStyle As Integer + +Public Sub _new() + + Me.Height = "1cm" + Me.Width = "1cm" + +End + +Private Function LineWidth_Read() As String + + Return $sLineWidth + +End + +Private Sub LineWidth_Write(Value As String) + + $sLineWidth = Value + +End + +Public Sub _SetUnifiedValues() + + Dim hSizeParse As TSizeParse + + Super._SetUnifiedValues() + + hSizeParse = New TSizeParse($sLineWidth) + $fLineWidth = hSizeParse.GetValue() + +End + +Public Sub _GetSizeHints((AvailableW) As Float, (AvailableH) As Float, (TotalWidth) As Float, (TotalHeight) As Float, DataIndex As Integer) As TSizeHint + + Dim hMyHints As New TSizeHint + + hMyHints.Height = Me._Height + hMyHints.Width = Me._Width + Return hMyHints + +End + +Public Sub _Paint(Page As Integer, X As Float, Y As Float, hControl As TControl, DataIndex As Integer) + + Dim iX, iY, W, H, W2, H2 As Integer + + If Me.LineStyle = Line.None Then Return + If Me.LineStyle <> Line.Solid Then Paint.Dash = ReportUnits.GetBorder(Me.LineStyle) + Paint.LineWidth = ReportUnits._ReportUnitsToPixels($fLineWidth) + + iX = (x + hControl.RealLeft + ReportUnits._ReportUnitsToPixels(Me.Padding._Left)) + iY = (y + hControl.RealTop + ReportUnits._ReportUnitsToPixels(Me.Padding._Top)) + + W = iX + hControl.RealWidth - ReportUnits._ReportUnitsToPixels(Me.Padding._Right) + H = iY + hControl.RealHeight - ReportUnits._ReportUnitsToPixels(Me.Padding._Bottom) + Paint.Brush = Me._GetActualBrush(iX, iY, W, H) + W2 = (iX + W) / 2 + H2 = (iY + H) / 2 + Select Case $iDirection + Case Align.TopLeft + Paint.MoveTo(W, H) + Paint.LineTo(iX, iY) + Case Align.Top + Paint.MoveTo(W2, H) + Paint.LineTo(W2, iY) + Case Align.TopRight + Paint.MoveTo(iX, H) + Paint.LineTo(W, iY) + Case Align.Left + Paint.MoveTo(W, H2) + Paint.LineTo(iX, H2) + Case Align.Right + Paint.MoveTo(iX, H2) + Paint.LineTo(W, H2) + Case Align.BottomLeft + Paint.MoveTo(W, iY) + Paint.LineTo(iX, H) + Case Align.Bottom + Paint.MoveTo(W2, iY) + Paint.LineTo(W2, H) + Case Align.BottomRight + Paint.MoveTo(iX, iY) + Paint.LineTo(W, H) + End Select + + Paint.Stroke + +End + +Private Function LineStyle_Read() As Integer + + Return $iLineStyle + +End + +Private Sub LineStyle_Write(Value As Integer) + + $iLineStyle = Value + +End + +Private Function Direction_Read() As Integer + + Return $iDirection + +End + +Private Sub Direction_Write(Value As Integer) + + $iDirection = Value + +End diff --git a/comp/src/gb.report/.src/ReportPageBreak.class b/comp/src/gb.report/.src/ReportPageBreak.class new file mode 100644 index 00000000..ea95ef98 --- /dev/null +++ b/comp/src/gb.report/.src/ReportPageBreak.class @@ -0,0 +1,6 @@ +' Gambas class file + +Export +Inherits ReportControl + +Public Const _Properties As String = "-*" diff --git a/comp/src/gb.report/.src/ReportPanel.class b/comp/src/gb.report/.src/ReportPanel.class new file mode 100644 index 00000000..d05ebd32 --- /dev/null +++ b/comp/src/gb.report/.src/ReportPanel.class @@ -0,0 +1,25 @@ +' Gambas class file + +Export +Inherits ReportContainer +Public Const _Properties As String = "*,Arrangement{Arrange.None;Vertical;Horizontal;Column;Fill}=Vertical" +Public Const _Similar As String = "ReportVBox" +Property Arrangement As Integer + +Public Sub _new() + + Super._Arrangement = Arrange.Vertical + +End + +Private Function Arrangement_Read() As Integer + + Return Super._Arrangement + +End + +Private Sub Arrangement_Write(Value As Integer) + + Super._Arrangement = Value + +End diff --git a/comp/src/gb.report/.src/ReportSection.class b/comp/src/gb.report/.src/ReportSection.class new file mode 100644 index 00000000..94224b5b --- /dev/null +++ b/comp/src/gb.report/.src/ReportSection.class @@ -0,0 +1,23 @@ +' Gambas class file + +Export +Inherits ReportVBox +Public Const _Properties As String = "*,Text" +Property Text As String +Private $sText As String + +Private Function Text_Read() As String + + Return $sText + +End + +Private Sub Text_Write(Value As String) + + $sText = Value + +End + +Public Sub _Free() + +End diff --git a/comp/src/gb.report/.src/ReportSvgImage.class b/comp/src/gb.report/.src/ReportSvgImage.class new file mode 100644 index 00000000..9927574d --- /dev/null +++ b/comp/src/gb.report/.src/ReportSvgImage.class @@ -0,0 +1,185 @@ +' Gambas class file + +Export +Inherits ReportFrame + +Private $hPic As SvgImage +Private $iStretchMode As Integer = Report.Proportional +Private $iAlignment As Integer = Align.Normal +'Private $sPath As String +Public Const _Properties As String = "*,Stretch{Report.None;Proportional;Fill}=Proportional,Alignment{Align.*},Image{SvgImage}" +Public Const _Similar As String = "ReportTextLabel" +Public Data As SvgImage +Property Image As SvgImage +Property Stretch As Integer +Property Alignment As Integer +Event Data(Index As Integer) + +Public Sub _GetSizeHints((AvailableW) As Float, (AvailableH) As Float, (TotalWidth) As Float, (TotalHeight) As Float, DataIndex As Integer) As TSizeHint + + Dim hMyHints As New TSizeHint + 'Dim h As Float = IIf(Me._Height > AvailableH, AvailableH, Me._Height) + 'Dim w As Float = IIf(Me._Width > AvailableW, AvailableW, Me._Width) + + Dim hPic As SvgImage + + hMyHints = Super._GetSizeHints(AvailableW, AvailableH, TotalWidth, TotalWidth, DataIndex) + + If Me.Autoresize Or If (Me._Width = 0 And Me._Height = 0) Then + If $hpic Then + hpic = $hpic + Else + Raise Data(DataIndex) + hpic = Data + Endif + + If hpic Then + hMyHints.Width = Max(hMyHints.Width, Me.Padding._Left + ReportUnits.UnitToCm(hpic.Width, "px") + Me.Padding._Right) + hMyHints.Height = Max(hMyHints.Width, Me.Padding._Top + ReportUnits.UnitToCm(hpic.Height, "px") + Me.Padding._Bottom) + Endif + + Endif + + Return hMyHints + +End + +Public Sub _Paint(Page As Integer, X As Float, Y As Float, hControl As TControl, DataIndex As Integer) + + Dim ix, iy As Float + 'Dim hBrush As PaintBrush + Dim hPic As SvgImage + + Dim w, h As Float + + + ix = x + hControl.RealLeft '+ ReportUnits._ReportUnitsToPixels(Me.Padding._Left) + iy = y + hControl.RealTop '+ ReportUnits._ReportUnitsToPixels(Me.Padding._Top) + + If Not $hpic Then + Raise Data(DataIndex) + hpic = Data + If Not hPic Then Return + Else + hPic = $hpic + Endif + + '$hPic = $hPic.Stretch(hControl.RealWidth, hControl.RealHeight) + + 'hBrush = Paint.Image(hpic) + + If $iStretchMode = Report.Fill Then + iX += ReportUnits._ReportUnitsToPixels(Me.Padding._Left + Me.Border._Left) + iY += ReportUnits._ReportUnitsToPixels(Me.Padding._Top + Me.Border._Top) + w = (hControl.RealWidth - ReportUnits._ReportUnitsToPixels(Me.Padding._Left + Me.Padding._Right + Me.Border._Left + Me.Border._Right)) + h = (hControl.RealHeight - ReportUnits._ReportUnitsToPixels(Me.Padding._Top + Me.Padding._Bottom + Me.Border._Top + Me.Border._Bottom)) + ' hBrush.Translate(ix, iy - 1) + 'hBrush.Scale(w / hPic.Width, h / hPic.Height) + 'Paint.Brush = hBrush + hpic.Width = w + hpic.Height = h + Paint.MoveTo(ix, iy) + hpic.Paint + 'Paint.Rectangle(ix, iy, w, h) + Else + + If $iStretchMode = Report.Proportional Then + 'on détermine la partie prédominante + If hPic.Width >= hPic.Height + 'C'est la largeur + 'on détermine une hauteur en fonction de la largeur connue + w = hControl.RealWidth - ReportUnits._ReportUnitsToPixels(Me.Padding._Width) + h = hPic.Height / hPic.Width * w + 'si h> a la place disponible alors on adapte en fonction de h en faite + If h > (hControl.RealHeight - ReportUnits._ReportUnitsToPixels(Me.Padding._Height)) Then + h = (hControl.RealHeight - ReportUnits._ReportUnitsToPixels(Me.Padding._Height)) + w = hPic.Width / hPic.Height * h + Endif + + Else + 'C'est la hauteur + h = (hControl.RealHeight - ReportUnits._ReportUnitsToPixels(Me.Padding._Height)) + w = hPic.Width / hPic.Height * h + 'si w> la place disponible alors on adapte en fonction de w en faite + If w > (hControl.RealWidth - ReportUnits._ReportUnitsToPixels(Me.Padding._Width)) Then + w = hControl.RealWidth - ReportUnits._ReportUnitsToPixels(Me.Padding._Width) + h = hPic.Height / hPic.Width * w + Endif + Endif + + Else + w = hPic.Width + h = hPic.Height + + Endif + + Select Case $iAlignment + Case Align.Normal, Align.TopLeft, Align.Left, Align.BottomLeft + 'Gauche + ix += ReportUnits._ReportUnitsToPixels(Me.Padding._Left) + Case Align.Bottom, Align.Center, Align.Top + 'centrée + ix += (hControl.RealWidth - w) / 2 + + Case Align.TopRight, Align.Right, Align.BottomRight + 'Droite + ix += hControl.RealWidth - ReportUnits._ReportUnitsToPixels(Me.Padding._Right) - w + End Select + + Select Case $iAlignment + Case Align.TopLeft, Align.Top, Align.TopRight + 'Haut + iy += ReportUnits._ReportUnitsToPixels(Me.Padding._Top) + Case Align.Left, Align.Center, Align.Right + 'Milieu + iy += (hControl.RealHeight - h) / 2 + Case Align.BottomLeft, Align.Bottom, Align.BottomRight + iY += hControl.RealHeight - ReportUnits._ReportUnitsToPixels(Me.Padding._Bottom) - h + End Select + 'hBrush.Translate(ix, iy - 1) + hpic.Width = W + hPic.Height = H + Paint.MoveTo(iX, iY) + hpic.Paint + 'hBrush.Scale(w / hPic.Width, h / hPic.Height) + 'Paint.Brush = hBrush + 'Paint.Rectangle(ix, iy, w, h - 1) + Endif + +End + +Private Function Image_Read() As SvgImage + + Return $hPic + +End + +Private Sub Image_Write(Value As SvgImage) + + $hPic = Value + +End + +Private Function Stretch_Read() As Integer + + Return $iStretchMode + +End + +Private Sub Stretch_Write(Value As Integer) + + $iStretchMode = Value + +End + +Private Function Alignment_Read() As Integer + + Return $iAlignment + +End + +Private Sub Alignment_Write(Value As Integer) + + $iAlignment = Value + +End diff --git a/comp/src/gb.report/.src/ReportTextLabel.class b/comp/src/gb.report/.src/ReportTextLabel.class new file mode 100644 index 00000000..f5e11372 --- /dev/null +++ b/comp/src/gb.report/.src/ReportTextLabel.class @@ -0,0 +1,97 @@ +' Gambas class file + +Export +Inherits ReportFrame + +Public Const _Properties As String = "*,Text,Alignment{Align.*}" +Public Const _Similar As String = "ReportControl" +Public Const _DefaultEvent As String = "Data" +Property Text As String +Property Alignment As Integer + +Private $sText As String +Private $iAlignment As Integer = Align.TopNormal + + +Public Data As String +Event Data(Index As Integer) + +Private Function Text_Read() As String + + Return $sText + +End + +Private Sub Text_Write(Value As String) + + $sText = Value + +End + +Private Function Alignment_Read() As Integer + + Return $iAlignment + +End + +Private Sub Alignment_Write(Value As Integer) + + $iAlignment = Value + +End + +Public Sub _GetSizeHints((AvailableW) As Float, (AvailableH) As Float, (TotalWidth) As Float, (TotalHeight) As Float, DataIndex As Integer) As TSizeHint + + Dim hMyHints As New TSizeHint + Dim fTextHeight As Float + Dim sTmp As String + + hMyHints = Super._GetSizeHints(AvailableW, AvailableH, TotalWidth, TotalWidth, DataIndex) + + If Me.Autoresize Or If (Me._Width = 0 And Me._Height = 0) Then + If Not $sText Then + Raise Data(DataIndex) + sTmp = Data + Else + sTmp = $sText + Endif + 'La largeur est fixée par l'utilisateur + 'Calcule de la hauteur + If Not IsNull(Me.Font) Then Paint.Font = Me.Font + fTextHeight = ReportUnits._PixelsToReportUnits(Paint.RichTextExtents(sTmp, ReportUnits._ReportUnitsToPixels(hMyHints.Width)).Height) + hMyHints.Height = Max(hMyHints.Height, Me.Border._Top + Me.Padding._Top + fTextHeight + Me.Padding._Bottom + Me.Border._Bottom) + Endif + + Return hMyHints + +End + +Public Sub _Paint(Page As Integer, X As Float, Y As Float, hControl As TControl, DataIndex As Integer) + + Dim iX, iY, iW, iH As Integer + Dim sTmp As String + + Paint.Brush = Me._GetActualBrush(iX, iY, iX + hControl.RealWidth, iY + hControl.RealHeight) + + If Not $sText Then + Raise Data(DataIndex) + sTmp = Data + Else + sTmp = $sText + Endif + + 'Set the Font if it is initialized + If Not IsNull(Me.Font) Then Paint.Font = Me.Font + + iX = (x + hControl.RealLeft + ReportUnits._ReportUnitsToPixels(Me.Padding._Left + Me.Border._Left)) + iY = (y + hControl.RealTop + ReportUnits._ReportUnitsToPixels(Me.Padding._Top + Me.Border._Top)) + iW = (hControl.RealWidth - ReportUnits._ReportUnitsToPixels(Me.Padding._Left + Me.Padding._Right + Me.Border._Left + Me.Border._Right)) + iH = (hControl.RealHeight - ReportUnits._ReportUnitsToPixels(Me.Padding._Top + Me.Padding._Bottom + Me.Border._Top + Me.Border._Bottom)) + + 'Paint.Rectangle(iX, iY, iW, iH) + 'Paint.Clip + Paint.RichText(sTmp, iX, iY, iW, iH, $iAlignment) + Paint.Fill + 'Paint.ResetClip + +End diff --git a/comp/src/gb.report/.src/ReportVBox.class b/comp/src/gb.report/.src/ReportVBox.class new file mode 100644 index 00000000..1cb254c3 --- /dev/null +++ b/comp/src/gb.report/.src/ReportVBox.class @@ -0,0 +1,33 @@ +' Gambas class file + +Export +Inherits ReportContainer +Public Const _Properties As String = "*,ForceNewPage" +Public Const _Similar As String = "ReportVBox" +Public Const _DefaultArrangement As String = "V" + +Public Sub _new() + + Super._Arrangement = Arrange.Vertical + +End + +Public Sub _Free() + +End + +' Public Sub _GetSizeHints((AvailableW) As Float, (AvailableH) As Float, (TotalWidth) As Float, (TotalHeight) As Float, DataIndex As Integer) As TSizeHint +' +' 'Print Me.Tag +' If Me.tag Then Print "Besoins de " & Me.Tag & ": ", AvailableW, AvailableH +' Return Super._GetSizeHints(AvailableW, AvailableH, TotalWidth, TotalHeight) +' +' +' End +' +' +' Public Sub _SetChildGeometry(X As Float, Y As Float, W As Float, H As Float, ContPage As Integer, bInFixed As Boolean) +' If Me.Tag Then Print "Disponibilité pour " & Me.Tag & ": H= " & H & " W= " & W +' Super._SetChildGeometry(x, y, w, h, ContPage, bInFixed) +' +' End diff --git a/comp/src/gb.report/.src/ReportVPanel.class b/comp/src/gb.report/.src/ReportVPanel.class new file mode 100644 index 00000000..fe439b23 --- /dev/null +++ b/comp/src/gb.report/.src/ReportVPanel.class @@ -0,0 +1,336 @@ +' Gambas class file + +Export +Inherits ReportContainer +Public Const _Properties As String = "*" +Public Const _Similar As String = "ReportVBox" + +Public Sub _new() + + Super._Arrangement = Arrange.Column + +End + +Public Sub _Free() + + Super._Free + +End + +Public Sub _SetCChildGeometry(X As Float, Y As Float, W As Float, H As Float, ContPage As Integer, TCont As TControl, bInFixed As Boolean) + + Dim aPageColumns As New TPageColumn[] + Dim PageColumn As New TPageColumn + Dim fMaxWidth As Float + Dim fColPos As Float + + Dim aPageItems As New TControl[] ''Éléments contenu par cette page + Dim hChildHints As TSizeHint ''Besoins en hauteur/largeur de l'enfant + Dim hChild As ReportControl ''Un enfant reportcontrol + Dim fTH As Float ''Hauteur restante + Dim fSpc As Float ''Taille d'un espace + 'Dim X, Y As Float ''Position Haut gauche de départ + Dim hTItem As TControl ''Un objet virtuel + Dim oChild As Object ''Un objet gambas générique + Dim fExp As Float ''taille des objets étendus + Dim iNExp As Integer ''Nombre d'objets étendus + Dim ftmpHeight As Float ''Tampon pour le calcul de la taille répartie + Dim ftmpY As Float ''Curseur temporaire de position haute + Dim fX, fY As Float ''Tampon de position + Dim i, j As Integer ''Des indexs + Dim bExitLoop As Boolean ''Flag de sortie de traitement + 'Dim iPrevIndex As Integer + Dim bForceNewPage As Boolean ''Flag d'anticipation de sortie 1 par page + Dim iPreIndex As Integer + 'Détermination de la taille d'un espace + 'et prise en compte de la taille relative + fSpc = IIf(Me._RelativeSpacing, H * Me._Spacing / 100, Me._Spacing) + + 'Retrait du padding et des bordures de la hauteur de travail + H = H - Me.Padding._Top - Me.Border._Top - Me.Border._Bottom - Me.Padding._Bottom + + 'Retrait du padding et des bordures a la largeur de travail + W = W - Me.Padding._Left - Me.Border._Left - Me.Border._Right - Me.Padding._Right + + 'Positioinnement du curseur en haut a gauche + X = Me.Padding._Left + Me.Border._Left + Y = Me.Padding._Top + Me.Border._Top + + 'La hauteur restante est initialisée avec la hauteur de travail + fTH = H + fColPos = X + 'aColX.Add(fNextColPos) + '***************************************************************************************** + 'On enumere tous les enfants a la recherche des éléments fixes + 'Si des éléments fixes sont trouvés alors leur taille est déduite de la taille restante. + For i = 0 To Me.Children.Max + 'On récupère l'enfant + hchild = Me.Children[i] + 'Si l'enfant est fixe alors on le traite. + If hchild.Fixed Then + ' hchild._Index = TCont.Index + 'on commence par récupérer la taille de l'objet + hChildHints = hchild._GetSizeHints(W, fTH, W, H, TCont.Index) + 'On retire la taille de l'objet a la hau'teur restante + 'si l'objet n'est pas ignoré par l'agencement + If Not hchild.Ignore Then fTH = fTH - hChildHints.Height - fSpc + + + 'Si l'énumération n'est pas encore arrivée a l'index sauvegardé + 'alors on ajoute directement l'élément a la page + If i < Me._CurItem Then + 'Génération de l'objet virtuel + hTItem = New TControl + 'Lier l'objet + hTItem.Ctrl = hchild + 'Associer sa taille + hTItem.SizeHint = hChildHints + + hTItem.Index = TCont.Index + 'L'ajouter a la page + PageColumn.TCtrls.Add(hTItem) + + 'Si l'objet est étendu alors on en tient compte + 'sauf si celui-ci est ignoré par l'arrangement + If hchild.Expand And If Not hchild.Ignore Then + fExp += hChildHints.Height + Inc iNExp + Endif + Endif + Endif + Next + + + + + '********************************************************************************* + 'On parcour a présent le reste des éléments + For i = Me._CurItem To Me.Children.Max + 'On récupère l'enfant + hChild = Me.Children[i] + 'Je traite ici la boucle de clonage + 'On définit le point de départ + 'If ContPage = 1 And hchild.Tag = "**" Then Stop + j = hChild._DataIndex + Do + '## Début boucle répétition + + 'On fixe l'index de données des enfants si + 'on est le duplicateur + If hChild._IsContainer And If hChild._count > 1 Then + iPreIndex = j + Else + iPreIndex = TCont.Index + Endif + 'If hchild.tag = "**" Then Print iPreIndex + 'If iPreIndex = 9 Then Stop + 'on récupère la taille de l'enfant + + hChildHints = hchild._GetSizeHints(W, fTH, fMaxWidth, H, iPreIndex) + fMaxWidth = Min(Max(fMaxWidth, hChildHints.Width), W) + 'Les éléments fixes ont déja été traités on ne tient donc pas compte de leur hauteur + 'car elle a déja été déduite de l'espace restant. De meme on ignore les objets flottants (ignore=true) + If Not hchild.Fixed And If Not hchild.Ignore Then + + 'Si l'élément ne loge pas dans la place restante ou + 'si la place restante est insuffisante + 'on provoque la sortie en fin de boucle + If (fTH - hChildHints.Height) < 0 Or If fTH <= 0 Or bForceNewPage Then + ' If hchild.Tag = "*" Then Stop + + + aPageColumns.Add(PageColumn) + PageColumn.Exp = fExp + PageColumn.NExp = iNExp + PageColumn.X = fColPos + fColPos += fMaxWidth + fspc + PageColumn.TH = fTh + + iNExp = 0 + fExp = 0 + + fTH = H + PageColumn = New TPageColumn + + 'Si la nouvelle colonne ne loge pas on arrête la + If fColPos + fMaxWidth > x + W Then + bForceNewPage = False + hchild._DataIndex = j + + 'If Not bForceNewPage Then + bExitLoop = True + Break + Else + Continue + End If + Endif + + 'On déduit la taille de l'objet courant (et l'espace suivant) + fTH = fTH - hChildHints.Height - fspc + + Endif + 'L'objet loge dans la page, on génère donc une représentation de celui-ci + 'c'est a dire un objet virtuel pointant vers celui-ci + 'et apportant les informations nécéssaire au layout final + 'on génère l'objet virtuel + + hTItem = New TControl + 'On associe le controle + hTItem.Ctrl = hchild + 'On associe sa taille + hTItem.SizeHint = hChildHints + 'If hchild.Tag = "head" Then Stop + 'On associe l'index de donnée + hTItem.Index = iPreIndex + 'TItem.Index = IIf(hchild._count > 0, j, TCont.Index) + 'On l'ajoute a la page + PageColumn.TCtrls.Add(hTItem) + + 'Si l'objet est étendu alors on tien compte de sa taille + 'pour le calcul de l'espace réparti + If hchild.Expand Then + fExp += hChildHints.Height + Inc iNExp + Endif + + 'If hChildHints.NotFinished Then hchild._DataIndex = j + 'un élément fixe ou ignore ne peut être répété + If hchild.Fixed Or hchild.Ignore Then Break + + 'Sachant que hChild._count peut être à -1 on le considère dans ce cas la comme étant a 0 + 'si j est égale au compte alors on quitte la boucle + If j >= Max(hchild._Count - 1, 0) Then + If Not hChildHints.NotFinished Then hChild._DataIndex = 0 + Break + Endif + + 'sinon on incrémente le compte a condition que le dernier enfant aie finit d'afficher ses enfants + If Not hChildHints.NotFinished Then Inc j + + 'On prévoie une sortie de boucle si l'enfant demande un affichage 1 par page + If hchild.ForceNewPage Then bForceNewPage = True + + Loop + 'Next '## fin de la boucle de répétition + 'Si la sortie anticipé est demandée alors on sort de la boucle + If bExitLoop Then Break + If i < Me.Children.Max Then + If Me.Children[i + 1] Is ReportPageBreak Then + bForceNewPage = True + Inc Me._CurItem + Inc i + Endif + Endif + 'Tout les objets on été répété alors on remet l'index à 0 + 'hchild._DataIndex = 0 + 'On incrémente le compteur des éléments traités + Inc Me._CurItem + Next + + If (H - fTH) > 0 Then + fTH += fspc 'Heu?????? + Endif + + '*************************************************************************** + 'Pour tous les éléments fixes jusqu'à la fin du document + For i = Max(Me._CurItem, 0) To Me.Children.Max + hchild = Me.Children[i] + If hchild.Fixed Then + hChildHints = hchild._GetSizeHints(W, fTH, W, H, iPreIndex) + 'fNextColPos = Max(fNextColPos, fNextColPos + hChildHints.Width) + 'on génère l'objet virtuel + hTItem = New TControl + 'On associe le controle + hTItem.Ctrl = hchild + 'On associe sa taille + hTItem.SizeHint = hChildHints + 'On l'ajoute a la page + PageColumn.TCtrl.Add(hTItem) + + 'Si l'objet est étendu alors on tien compte de sa taille + 'pour le calcul de l'espace réparti + If hchild.Expand Then + fExp += hChildHints.Height + Inc iNExp + Endif + Endif + Next + PageColumn.Exp = fExp + PageColumn.Nexp = iNExp + PageColumn.TH = fTH + aPageColumns.Add(PageColumn) + PageColumn.X = fColPos + '****************************************************************************** + 'A présent tous les éléments pouvant être placé sur la page ont été marqué. + 'On peut donc procéder a la mise en forme de ceux-ci + 'k = 0 + For Each PageColumn In aPageColumns + ftmpY = Y 'On définit la position de départ + If PageColumn.NExp Then + fExp = (PageColumn.Exp + PageColumn.TH) / PageColumn.NExp + Endif + + For i = 0 To PageColumn.TCtrls.Max + 'on récupère l'objet virtuel + hTItem = PageColumn.TCtrls[i] + 'on récupère l'instance de l'objet réel + ochild = hTItem.Ctrl + + 'Si l'objet est étendu alors on calcul sa hauteur + 'Un objet flottant ne peut pas être étendu + If Not oChild.Ignore And If ochild.Expand Then + 'Calcul de la taille répartie + ftmpHeight = fExp + Else + 'Si l'objet n'est pas étendu alors sa taille est celle demandée par celui-ci + ftmpHeight = hTItem.SizeHint.Height + Endif + 'oChild._Index = hTItem.Index + 'Traitement des objets ignoré + 'Les propriété de taille sont celle fournie par l'objet + If oChild.Ignore Then + 'Calcul de la position de l'objet + 'si sa position est relative (%) alors on fait le ratio a partir de la largeur ou de la hauteur + 'sinon on utilise la position fournie par l'objet + fX = X + IIf(oChild._RelativeLeft, W * oChild._Left / 100, oChild._Left) + fY = Y + IIf(oChild._RelativeTop, H * oChild._Top / 100, oChild._Top) + 'Fixer la position de l'objet + hTItem._SetGeometry(fX, fY, hTItem.SizeHint.Width, ftmpHeight) + 'L'objet flottant peut être un conteneur il faut donc demander aussi a ses enfants de s 'organiser + oChild._SetChildGeometry(fX, fY, hTItem.SizeHint.Width, ftmpHeight, ContPage, hTItem, bInFixed Or Me.Fixed) + + Else + + 'Fixer la position de l'objet + hTItem._SetGeometry(PageColumn.X, fTmpY, fMaxWidth, ftmpHeight) + 'L'objet flottant peut être un conteneur il faut donc demander aussi a ses enfants de s 'organiser + oChild._SetChildGeometry(PageColumn.X, fTmpY, fMaxWidth, ftmpHeight, ContPage, hTItem, bInFixed Or Me.Fixed) + 'on incrémente la position verticale de l'objet + 'pour définir sa place sur la page relativement aux autres éléments + fTmpY += ftmpHeight + fspc + + Endif + + 'Si l'objet est un conteneur alors il faut vérifier si il a finit d'être traité + + If oChild Is ReportContainer Then + 'If oChild._NotFinished Then Me.NotFinished = True + 'Si son traitement n'est pas terminé alors on trouve + 'sa position dans la liste des enfant et on l'assigne a l'index de traitement + 'si sa position est > a l'index courant + If ochild._CurItem <= oChild.Children.Max Then + j = Me.Children.Find(oChild) + Me._CurItem = Min(Me._CurItem, j) + Endif + 'Si on est dans la lignée d'un conteneur fixe on incrémente pas la lecture des enfants + 'En clair ce sont toujours les mêmes éléments qui apparaitrons + If bInFixed Then ochild._CurItem = 0 + Endif + Next + 'Inc k + aPageItems.Insert(PageColumn.TCtrls) + Next + 'On ajoute cette page au dossier du conteneur + TCont._PageChildren[ContPage] = aPageItems + +End \ No newline at end of file diff --git a/comp/src/gb.report/.src/Tests/Old/Paints.class b/comp/src/gb.report/.src/Tests/Old/Paints.class new file mode 100644 index 00000000..01960f38 --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Old/Paints.class @@ -0,0 +1,33 @@ +' Gambas class file + +'Export +' +' Static Public Sub Begin(Device As Object) +' +' Debug +' Super.Begin(Device) +' +' End +' +' Static Public Sub End(Device As Object) +' +' Debug +' Super.End(Device) +' +' End +' +' ' +' Static Public Sub Rectangle(X As Float, Y As Float, W As Float, H As Float) +' +' Debug CStr(X); ", "; CStr(Y); ", "; CStr(W); ", "; CStr(H) +' Super.Rectangle(X, Y, W, H) +' +' End +' +' +' Static Public Sub Text(Text As String, Optional X As Float, Y As Float, Width As Float, Height As Float, Alignment As Integer) +' +' 'Debug Paint.Font.Size +' Super.Text(Text, X, Y, Width, Height, Alignment) +' +' End diff --git a/comp/src/gb.report/.src/Tests/Old/Report1.class b/comp/src/gb.report/.src/Tests/Old/Report1.class new file mode 100644 index 00000000..5be74ff1 --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Old/Report1.class @@ -0,0 +1,8 @@ +' Gambas class file + + +Public Sub ReportLabel2_Data(Index As Integer) + + Last.data = "coucou\n c'est
    moi" + +End diff --git a/comp/src/gb.report/.src/Tests/Old/Report1.report b/comp/src/gb.report/.src/Tests/Old/Report1.report new file mode 100644 index 00000000..2051d2ae --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Old/Report1.report @@ -0,0 +1,55 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,68,64) + Count = 3 + Index = 0 + Text = ("#3") + { ReportLabel2 ReportLabel + #MoveScaled(3,4,33,8) + AutoResize = True + Background = ReportBrush["#FFFF00"] + } + Index = 1 + Text = ("#1") + { ReportHBox1 ReportHBox + #MoveScaled(3,1,58,16) + Height = "5cm" + Border = ReportBorder["Top:1mm #000000;Bottom:1mm #000000;Left:1mm #000000;Right:1mm #000000"] + Background = ReportBrush["#00FF00"] + { ReportLabel1 ReportLabel + #MoveScaled(7,4,40,9) + Font = Font["Bold,+10"] + Expand = True + Text = ("COUCOU") + Alignment = Align.Center + } + } + { ReportHBox2 ReportHBox + #MoveScaled(6,21,57,34) + Expand = True + Border = ReportBorder["Top:1mm #000000;Bottom:1mm #000000;Left:1mm #000000;Right:1mm #000000"] + Background = ReportBrush["LinearGradient(0.84,0.6,0,0,[#000000,#FFFFFF],[0,1])"] + { ReportVBox1 ReportVBox + #MoveScaled(0,4,28,20) + Expand = True + } + { ReportVBox2 ReportVBox + #MoveScaled(33,3,18,24) + Fixed = True + Expand = True + { ReportHBox3 ReportHBox + #MoveScaled(3,2,12,14) + Expand = True + } + { ReportVBox3 ReportVBox + #MoveScaled(2,20,16,3) + Height = "60mm" + Background = ReportBrush["#FFFF00"] + } + } + } + Index = 2 + Text = ("#2") + Index = 0 +} diff --git a/comp/src/gb.report/.src/Tests/Old/Report10.class b/comp/src/gb.report/.src/Tests/Old/Report10.class new file mode 100644 index 00000000..9673987f --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Old/Report10.class @@ -0,0 +1,8 @@ +' Gambas class file + +Public Sub _new() + + ReportHBox2.DataCount = 200 + + +End diff --git a/comp/src/gb.report/.src/Tests/Old/Report10.report b/comp/src/gb.report/.src/Tests/Old/Report10.report new file mode 100644 index 00000000..f5e3d89b --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Old/Report10.report @@ -0,0 +1,64 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,64,64) + Padding = ReportPadding["Top:20mm;Bottom:10mm;Left:25mm;Right:15mm"] + Paper = Printer.A3 + Index = 0 + Text = ("") + { ReportHBox1 ReportHBox + #MoveScaled(1,4,59,5) + Height = "1cm" + Fixed = True + { ReportLabel1 ReportLabel + #MoveScaled(1,1,17,4) + Expand = True + Border = ReportBorder["Top:1mm #000000;Bottom:1mm #000000;Left:1mm #000000;Right:1mm #000000;TopLeftCorner:6mm"] + Text = ("ReportLabel1") + } + { ReportLabel2 ReportLabel + #MoveScaled(21,1,14,4) + Expand = True + Border = ReportBorder["Top:1mm #000000;Bottom:1mm #000000"] + Text = ("ReportLabel2") + } + { ReportLabel3 ReportLabel + #MoveScaled(40,0,13,5) + Expand = True + Border = ReportBorder["Top:1mm #000000;Bottom:1mm #000000;Left:1mm #000000;Right:1mm #000000;TopRightCorner:6mm"] + Text = ("ReportLabel3") + } + } + { ReportHBox2 ReportHBox + #MoveScaled(1,12,59,5) + Height = "1cm" + { ReportLabel4 ReportLabel + #MoveScaled(1,1,17,4) + Expand = True + Border = ReportBorder["Top:1mm #000000;Bottom:1mm #000000;Left:1mm #000000;Right:1mm #000000"] + Text = ("ReportLabel1") + } + { ReportLabel5 ReportLabel + #MoveScaled(21,1,14,4) + Expand = True + Border = ReportBorder["Top:1mm #000000;Bottom:1mm #000000"] + Text = ("ReportLabel2") + } + { ReportLabel6 ReportLabel + #MoveScaled(40,0,13,5) + Expand = True + Border = ReportBorder["Top:1mm #000000;Bottom:1mm #000000;Left:1mm #000000;Right:1mm #000000"] + Text = ("ReportLabel3") + } + } + { ReportLabel7 ReportLabel + #MoveScaled(3,49,60,4) + Fixed = True + Padding = ReportPadding["Top:10mm;Bottom:10mm;Left:10mm;Right:10mm"] + AutoResize = True + Text = ("Page $NPAGE") + Alignment = Align.Right + UseField = True + } + Index = 0 +} diff --git a/comp/src/gb.report/.src/Tests/Old/Report12.class b/comp/src/gb.report/.src/Tests/Old/Report12.class new file mode 100644 index 00000000..f816f33e --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Old/Report12.class @@ -0,0 +1,16 @@ +' Gambas class file + +Public Sub _New() + + ReportHBox1.DataCount = 100 + ReportLabel1.BackGround = ReportBrush.Color(Color.Red) + ReportLabel1.Brush = ReportBrush.Color(Color.Yellow) + +End + + +Public Sub ReportLabel1_Data(Index As Integer) + + Last.Data = Index + +End diff --git a/comp/src/gb.report/.src/Tests/Old/Report12.report b/comp/src/gb.report/.src/Tests/Old/Report12.report new file mode 100644 index 00000000..5f402eed --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Old/Report12.report @@ -0,0 +1,17 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,64,64) + Spacing = "1mm" + Index = 0 + Text = ("") + { ReportHBox1 ReportHBox + #MoveScaled(2,3,60,7) + Height = "1cm" + { ReportLabel1 ReportLabel + #MoveScaled(0,0,58,4) + Expand = True + } + } + Index = 0 +} diff --git a/comp/src/gb.report/.src/Tests/Old/Report13.class b/comp/src/gb.report/.src/Tests/Old/Report13.class new file mode 100644 index 00000000..d2ce3331 --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Old/Report13.class @@ -0,0 +1,38 @@ +' Gambas class file + +Private hResut As Result +Private hResut2 As Result +Private ColResult As New Collection +Public Sub ReportLabel1_Data(Index As Integer) + + hResut.MoveTo(Index) + Last.Data = hResut!firstname + + +End + +Public Sub Report_Open() +Connections["Connection1"].Open +hResut = db.Exec("select distinct firstname from test") + + ReportVBox1.DataCount = hResut.Count + 'ReportVBox2.DataCount = 10 +End + +Public Sub ReportLabel2_Data(Index As Integer) +hResut2 = ColResult[ReportVBox1.DataIndex] +hResut2.MoveTo(Index) +Last.Data = hResut2!birth +Print index +Catch +End + +Public Sub ReportVBox1_BeforeData() + If Not ColResult.Exist(Last.DataIndex) Then + hResut.MoveTo(Last.DataIndex) + hResut2 = db.Exec("select * FROM test where firstname=&1", hResut!firstname) + ColResult[Last.DataIndex] = hResut2 + ReportVBox2.DataCount = hResut2.Count + Endif +Catch +End diff --git a/comp/src/gb.report/.src/Tests/Old/Report13.report b/comp/src/gb.report/.src/Tests/Old/Report13.report new file mode 100644 index 00000000..4a117ceb --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Old/Report13.report @@ -0,0 +1,21 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,64,64) + Index = 0 + Text = ("") + { ReportVBox1 ReportVBox + #MoveScaled(3,5,60,44) + { ReportLabel1 ReportLabel + #MoveScaled(2,1,31,3) + } + { ReportVBox2 ReportVBox + #MoveScaled(2,8,56,12) + { ReportLabel2 ReportLabel + #MoveScaled(0,2,28,3) + Brush = ReportBrush["#00FF00"] + } + } + } + Index = 0 +} diff --git a/comp/src/gb.report/.src/Tests/Old/Report14.class b/comp/src/gb.report/.src/Tests/Old/Report14.class new file mode 100644 index 00000000..13c1ce07 --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Old/Report14.class @@ -0,0 +1,32 @@ +' Gambas class file + +'Static Public Type As String + +Public Sub _new(Optional sType As String = "mysql") + + Dim hResult As Result + Dim Rlbl As ReportLabel + Dim hConn As Connection + + hConn = Connections["Connection1"] + hConn.Type = sType + If hConn.Type = "sqlite" Then hConn.Host = User.Home + Try hConn.Open + If Not hConn.Opened Then + Message.Error(" You have to create the test database with the Database example.") + Return + Endif + + hResult = db.Limit(200).Find("test") + If Not hResult.Available Then Return + + For Each hResult + + Rlbl = New ReportLabel(RVBCont) + Rlbl.Autoresize = True + Rlbl.Text = hResult!name & " " & hResult!firstname + Rlbl.Border.bottom.Width = "1px" + + Next + +End diff --git a/comp/src/gb.report/.src/Tests/Old/Report14.report b/comp/src/gb.report/.src/Tests/Old/Report14.report new file mode 100644 index 00000000..e83b2ebe --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Old/Report14.report @@ -0,0 +1,90 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,100,77) + Padding = ReportPadding["Top:1cm;Bottom:15mm;Left:2cm;Right:2cm"] + Index = 0 + Text = ("Section 1") + { ReportHBox2 ReportHBox + #MoveScaled(0,0,67,14) + Height = "5cm" + Fixed = True + Padding = ReportPadding["Top:5mm;Bottom:5mm;Left:5mm;Right:5mm"] + Border = ReportBorder["Top:1mm #000000;Bottom:1mm #000000;Left:1mm #000000;Right:1mm #000000"] + Background = ReportBrush["#3398C3"] + { ReportSvgImage1 ReportSvgImage + #MoveScaled(1,1,14,12) + Width = "4cm" + Image = SvgImage.Load("gambas.svg") + } + { ReportLabel3 ReportLabel + #MoveScaled(20,2,43,10) + Brush = ReportBrush["LinearGradient(0.71,0.07,0.34,0.06,[#FFFF00,#FFFFFF],[0,1])"] + Fixed = True + Font = Font["DejaVu Sans,Bold,+14"] + Expand = True + AutoResize = True + Text = ("Gambas") + Alignment = Align.Left + } + } + { ReportHBox1 ReportHBox + #MoveScaled(0,15,87,56) + Padding = ReportPadding["0cm"] + Expand = True + Border = ReportBorder["Bottom:1mm #000000;Left:1mm #000000;Right:1mm #000000"] + { ReportVBox1 ReportVBox + #MoveScaled(1,1,25,47) + Width = "6cm" + Padding = ReportPadding["Top:5mm;Bottom:5mm;Left:5mm;Right:5mm"] + Background = ReportBrush["#DF6B00"] + { ReportLabel4 ReportLabel + #MoveScaled(3,2,20,4) + Brush = ReportBrush["#FFFFFF"] + Fixed = True + Font = Font["Bold"] + AutoResize = True + Text = ("All friends list !") + } + } + { ReportVBox2 ReportVBox + #MoveScaled(27,1,60,54) + Expand = True + Border = ReportBorder["Left:1mm #000000"] + Background = ReportBrush["#FFFFFF"] + { RVBCont ReportVBox + #MoveScaled(4,4,53,42) + Padding = ReportPadding["Top:5mm;Bottom:5mm;Left:5mm;Right:5mm"] + Expand = True + Tag = "*" + Spacing = "1mm" + { ReportLabel1 ReportLabel + #MoveScaled(0,0,44,9) + Font = Font["Bitstream Charter,Bold,Italic,+2"] + AutoResize = True + Text = ("Gambas Report Demo") + Alignment = Align.Center + } + { ReportVBox3 ReportVBox + #MoveScaled(0,11,38,4) + Height = "1cm" + AutoResize = True + } + } + { ReportLabel2 ReportLabel + #MoveScaled(7,49,47,3) + Brush = ReportBrush["#FFFFFF"] + Fixed = True + Font = Font["Bold,+1"] + Padding = ReportPadding["Top:1mm;Bottom:1mm;Left:1mm;Right:1mm"] + AutoResize = True + Border = ReportBorder["Top:1mm #000000"] + Background = ReportBrush["#3398C3"] + Text = ("Page $PAGE on $NPAGE ") + Alignment = Align.Right + UseField = True + } + } + } + Index = 0 +} diff --git a/comp/src/gb.report/.src/Tests/Old/Report2.class b/comp/src/gb.report/.src/Tests/Old/Report2.class new file mode 100644 index 00000000..ea9925d3 --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Old/Report2.class @@ -0,0 +1,20 @@ +' Gambas class file + +Public Sub _new() + + Dim Rlbl As ReportLabel + Dim i As Integer + 'Report.Debug = True + For i = 0 To 200 + + Rlbl = New ReportLabel(RVBCont) + Rlbl.Text = "Ligne " & i + Rlbl.Autoresize = True + Rlbl.Border.bottom.Width = "1px" + Rlbl.Padding.Top = "3 mm" + Rlbl.Padding.Bottom = "1mm" + Rlbl.Padding.Left = "2 mm" + + Next + +End diff --git a/comp/src/gb.report/.src/Tests/Old/Report2.report b/comp/src/gb.report/.src/Tests/Old/Report2.report new file mode 100644 index 00000000..0aad391a --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Old/Report2.report @@ -0,0 +1,19 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,64,64) + Index = 0 + Text = ("") + { ReportHBox1 ReportHBox + #MoveScaled(1,1,61,8) + Height = "10cm" + Fixed = True + Expand = True + Background = ReportBrush["#007FFF"] + } + { RVBCont ReportVBox + #MoveScaled(2,11,56,26) + Expand = True + } + Index = 0 +} diff --git a/comp/src/gb.report/.src/Tests/Old/Report3.class b/comp/src/gb.report/.src/Tests/Old/Report3.class new file mode 100644 index 00000000..8ea03ec7 --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Old/Report3.class @@ -0,0 +1,20 @@ +' Gambas class file + +Public Sub _new() + + ReportHBox1.DataCount = 300 + +End + +Public Sub ReportLabel1_Data(Index As Integer) + + 'Print "coucou" + Last.data = Index + +End + +Public Sub ReportLabel2_Data(Index As Integer) + + Last.data = Index + +End diff --git a/comp/src/gb.report/.src/Tests/Old/Report3.report b/comp/src/gb.report/.src/Tests/Old/Report3.report new file mode 100644 index 00000000..59d12d97 --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Old/Report3.report @@ -0,0 +1,42 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,64,64) + Paper = Printer.A3 + Index = 0 + Text = ("") + { ReportHBox2 ReportHBox + #MoveScaled(1,1,61,7) + Height = "18mm" + Fixed = True + Background = ReportBrush["#FFFF00"] + } + { ReportHBox1 ReportHBox + #MoveScaled(1,9,59,6) + Height = "15mm" + { ReportLabel1 ReportLabel + #MoveScaled(0,1,26,5) + Expand = True + } + { ReportLabel2 ReportLabel + #MoveScaled(28,0,30,6) + Font = Font["Bold,+5"] + Expand = True + Alignment = Align.Center + } + } + { ReportPanel1 ReportPanel + #MoveScaled(1,16,60,4) + Fixed = True + Expand = True + Background = ReportBrush["#00FF00"] + Arrangement = Arrange.None + } + { ReportHBox3 ReportHBox + #MoveScaled(0,21,61,7) + Height = "18mm" + Fixed = True + Background = ReportBrush["#FFFF00"] + } + Index = 0 +} diff --git a/comp/src/gb.report/.src/Tests/Old/Report4.class b/comp/src/gb.report/.src/Tests/Old/Report4.class new file mode 100644 index 00000000..e9023949 --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Old/Report4.class @@ -0,0 +1,46 @@ +' Gambas class file + +Private $hres As Result + +Public Sub _new() + + 'Report.Debug = True + + Try Connections["Connection2"].Open + $hres = db.Exec("SELECT fc.cd_sc as codesoc, fc.int_sc as intsoc, fcc.compte_cc as compte, fcc.intitule_cc as intitule From Fiches_Comptes as fcc " + "Left join Fiches_Societes as fc on fc.cd_sc=1") + ReportHBox4.DataCount = $hres.Count + +End + +Public Sub lblCpte_Data(Index As Integer) + + $hres.MoveTo(Index) + Last.data = $hres!compte + +End + +Public Sub lblcpteLab_Data(Index As Integer) + + $hres.MoveTo(Index) + Last.data = $hres!intitule + +End + +Public Sub lblSoc_Data(Index As Integer) + + Last.data = $hres!codesoc & " " & $hres!intsoc + +End + +Public Sub lblDate_Data(Index As Integer) + + Last.data = Format(Now(), "dddd dd mmmm yyyy") + +End + +Public Sub ReportImage1_Data(Index As Integer) + + Last.Data = Picture["icon:/32/directory"].Image + +End diff --git a/comp/src/gb.report/.src/Tests/Old/Report4.report b/comp/src/gb.report/.src/Tests/Old/Report4.report new file mode 100644 index 00000000..e41447cf --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Old/Report4.report @@ -0,0 +1,96 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,64,92) + Padding = ReportPadding["Top:2cm;Bottom:2cm;Left:2cm;Right:2cm"] + Index = 0 + Text = ("") + { ReportLabel3 ReportLabel + #MoveScaled(0,0,58,4) + Height = "2cm" + Fixed = True + Font = Font["Bold,+6"] + Tag = "**" + Border = ReportBorder["Top:1mm #000000;Bottom:1mm #000000;Left:1mm #000000;Right:1mm #000000;TopLeftCorner:6mm;BottomLeftCorner:7mm"] + Background = ReportBrush["LinearGradient(0.7,0,0.7,1,[#FFCFBF,#FFFFFF],[0,1])"] + Text = ("IMPRESSION DU PLAN COMPTABLE") + Alignment = Align.Center + } + { ReportPanel1 ReportVBox + #MoveScaled(2,7,50,69) + Padding = ReportPadding["Bottom:2cm;Left:2cm;Right:2cm"] + Expand = True + Tag = "Contenu1" + { lblSoc ReportLabel + #MoveScaled(1,2,53,4) + Height = "2cm" + Fixed = True + Font = Font["Bold,12"] + } + { ReportHBox1 ReportHBox + #MoveScaled(1,14,45,4) + Height = "1cm" + Fixed = True + Background = ReportBrush["#F7DFFF"] + { ReportLabel1 ReportLabel + #MoveScaled(1,0,14,4) + Width = "20%" + Font = Font["Bold,12"] + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000"] + Text = ("Code") + Alignment = Align.Center + } + { ReportLabel2 ReportLabel + #MoveScaled(20,0,14,4) + Font = Font["Bold,12"] + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Text = ("Intitulé") + Alignment = Align.Center + } + } + { VCont ReportVBox + #MoveScaled(1,20,45,39) + AutoResize = True + Tag = "ListeElements" + { ReportHBox4 ReportHBox + #MoveScaled(1,2,44,7) + Height = "5mm" + { lblCpte ReportLabel + #MoveScaled(8,1,18,4) + Width = "20%" + Padding = ReportPadding["Left:3mm"] + Tag = "*" + } + { lblcpteLab ReportLabel + #MoveScaled(27,0,18,4) + Width = "20%" + Padding = ReportPadding["Left:3mm"] + Expand = True + Border = ReportBorder["Left:1px #000000"] + } + } + } + } + { ReportHBox2 ReportHBox + #MoveScaled(0,77,61,4) + Fixed = True + AutoResize = True + { lblDate ReportLabel + #MoveScaled(0,1,16,4) + Width = "5cm" + } + { ReportHBox3 ReportHBox + #MoveScaled(9,1,24,4) + Expand = True + } + { ReportLabel4 ReportLabel + #MoveScaled(47,1,13,3) + Width = "3cm" + AutoResize = True + Text = ("Page $PAGE sur $NPAGE") + UseField = True + } + } + Index = 0 +} diff --git a/comp/src/gb.report/.src/Tests/Old/Report5.class b/comp/src/gb.report/.src/Tests/Old/Report5.class new file mode 100644 index 00000000..f5baf4d7 --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Old/Report5.class @@ -0,0 +1 @@ +' Gambas class file diff --git a/comp/src/gb.report/.src/Tests/Old/Report5.report b/comp/src/gb.report/.src/Tests/Old/Report5.report new file mode 100644 index 00000000..f2bdbb65 --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Old/Report5.report @@ -0,0 +1,85 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,64,95) + Padding = ReportPadding["Top:1cm;Bottom:1cm;Left:1cm;Right:1cm"] + Index = 0 + Text = ("") + { ReportHBox1 ReportHBox + #MoveScaled(4,2,56,6) + Height = "12mm" + Expand = True + { ReportLabel9 ReportLabel + #MoveScaled(2,1,20,5) + Expand = True + Border = ReportBorder["Top:1mm #000000;Bottom:1mm #000000;Left:1mm #000000;Right:1mm #000000"] + Background = ReportBrush["#FFFF00"] + } + { ReportHBox2 ReportHBox + #MoveScaled(30,2,24,8) + Expand = True + Border = ReportBorder["Top:1mm #000000;Bottom:1mm #000000;Left:1mm #000000;Right:1mm #000000"] + Background = ReportBrush["#FFFF00"] + } + } + { ReportPageBreak1 ReportPageBreak + #MoveScaled(5,10,60,5) + } + { ReportLabel1 ReportImage + #MoveScaled(1,12,59,8) + Height = "7cm" + Border = ReportBorder["Bottom:2mm #000000"] + Background = ReportBrush["#00FF00"] + } + { ReportLabel2 ReportLabel + #MoveScaled(2,18,59,8) + Height = "2cm" + Border = ReportBorder["Bottom:2mm #000000"] + Background = ReportBrush["LinearGradient(1,0,0.28,0.35,[#00FF00,#FFFFFF],[0,1])"] + } + { ReportLabel4 ReportImage + #MoveScaled(3,23,59,8) + Height = "6cm" + Border = ReportBorder["Bottom:2mm #000000"] + Background = ReportBrush["#00FF00"] + } + { ReportPageBreak2 ReportPageBreak + #MoveScaled(2,31,59,2) + } + { ReportLabel5 ReportLabel + #MoveScaled(2,33,59,8) + Height = "2cm" + Border = ReportBorder["Bottom:2mm #000000"] + Background = ReportBrush["#00FF00"] + } + { ReportPageBreak3 ReportPageBreak + #MoveScaled(2,42,58,3) + } + { ReportLabel3 ReportLabel + #MoveScaled(1,44,59,8) + Height = "2cm" + Border = ReportBorder["Bottom:2mm #000000"] + Background = ReportBrush["#00FF00"] + } + { ReportLabel6 ReportLabel + #MoveScaled(2,52,59,8) + Height = "10cm" + Border = ReportBorder["Bottom:2mm #000000"] + Background = ReportBrush["#00FF00"] + } + { ReportLabel7 ReportLabel + #MoveScaled(2,62,59,8) + Height = "2cm" + Expand = True + Border = ReportBorder["Bottom:2mm #000000"] + Background = ReportBrush["#00FF00"] + } + { ReportLabel8 ReportLabel + #MoveScaled(2,72,59,8) + Height = "2cm" + Expand = True + Border = ReportBorder["Bottom:2mm #000000"] + Background = ReportBrush["#00FF00"] + } + Index = 0 +} diff --git a/comp/src/gb.report/.src/Tests/Old/Report6.class b/comp/src/gb.report/.src/Tests/Old/Report6.class new file mode 100644 index 00000000..0a5fa73a --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Old/Report6.class @@ -0,0 +1,2 @@ +' Gambas class file + diff --git a/comp/src/gb.report/.src/Tests/Old/Report6.report b/comp/src/gb.report/.src/Tests/Old/Report6.report new file mode 100644 index 00000000..e4975fe7 --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Old/Report6.report @@ -0,0 +1,17 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,64,64) + Index = 0 + Text = ("") + { ReportPanel1 ReportPanel + #MoveScaled(4,5,59,31) + Padding = ReportPadding["Top:1mm;Bottom:1mm;Left:1mm;Right:1mm"] + { ReportLabel1 ReportLabel + #MoveScaled(2,4,53,20) + Padding = ReportPadding["Top:2cm;Bottom:2cm;Left:2cm;Right:2cm"] + Text = ("ReportLabel1") + } + } + Index = 0 +} diff --git a/comp/src/gb.report/.src/Tests/Old/Report7.class b/comp/src/gb.report/.src/Tests/Old/Report7.class new file mode 100644 index 00000000..2aa731de --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Old/Report7.class @@ -0,0 +1,29 @@ +' Gambas class file + +Public Sub _new() + + 'Report.Debug = True + ' ReportPanel2.Border.RoundCorner.TopLeft = "5mm/5mm" + ' ReportPanel2.Border.RoundCorner.BottomLeft = "5mm/5mm" + ' ReportPanel2.Border.RoundCorner.TopRight = "5mm/5mm" + ' ReportPanel2.Border.RoundCorner.BottomRight = "5mm/5mm" + +End + +Public Sub ReportImage1_Data(Index As Integer) + + Last.Data = Picture["icon:/32/directory"].Image + +End + +Public Sub ReportImage2_Data(Index As Integer) + + Last.Data = Picture["icon:/32/directory"].Image + +End + +Public Sub ReportImage3_Data(Index As Integer) + + Last.Data = Picture["icon:/32/directory"].Image + +End diff --git a/comp/src/gb.report/.src/Tests/Old/Report7.report b/comp/src/gb.report/.src/Tests/Old/Report7.report new file mode 100644 index 00000000..45cf606d --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Old/Report7.report @@ -0,0 +1,59 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,64,64) + Padding = ReportPadding["Top:2cm;Bottom:2cm;Left:2cm;Right:2cm"] + Index = 0 + Text = ("") + { ReportPanel1 ReportHBox + #MoveScaled(0,5,61,10) + Height = "4cm" + Padding = ReportPadding["Top:2mm;Bottom:2mm;Left:2mm;Right:2mm"] + { ReportPanel3 ReportPanel + #MoveScaled(1,2,9,8) + Expand = True + } + { ReportPanel2 ReportPanel + #MoveScaled(10,0,41,10) + Width = "10cm" + AutoResize = True + Border = ReportBorder["Top:1mm #000000;Bottom:1mm #000000;Left:1mm #000000;Right:1mm #000000;TopLeftCorner:1cm;TopRightCorner:1cm;BottomRightCorner:1cm;BottomLeftCorner:1cm"] + Arrangement = Arrange.Horizontal + { ReportImage1 ReportImage + #MoveScaled(1,0,11,9) + Width = "3cm" + Height = "6mm" + Padding = ReportPadding["Top:1mm;Bottom:1mm;Left:1mm;Right:1mm"] + Alignment = Align.Center + } + { ReportImage3 ReportImage + #MoveScaled(26,0,11,9) + Width = "3cm" + Height = "6mm" + Padding = ReportPadding["Top:1mm;Bottom:1mm;Left:1mm;Right:1mm"] + Border = ReportBorder["Left:1mm #000000"] + Alignment = Align.Center + } + { ReportImage2 ReportImage + #MoveScaled(14,0,11,9) + Width = "3cm" + Height = "6mm" + Padding = ReportPadding["Top:1mm;Bottom:1mm;Left:1mm;Right:1mm"] + Border = ReportBorder["Left:1mm #000000"] + Alignment = Align.Center + } + } + { ReportPanel4 ReportPanel + #MoveScaled(52,1,9,9) + Expand = True + } + } + { ReportLabel1 ReportLabel + #MoveScaled(5,18,57,13) + Height = "2cm" + Font = Font["Bold,+6"] + Text = ("coucou") + Alignment = Align.Center + } + Index = 0 +} diff --git a/comp/src/gb.report/.src/Tests/Old/Report8.class b/comp/src/gb.report/.src/Tests/Old/Report8.class new file mode 100644 index 00000000..d9c700c7 --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Old/Report8.class @@ -0,0 +1,56 @@ +' Gambas class file + +Private hResult1 As Result +Private hResult2 As Result + +Public Sub _new() + + Connections["Connection1"].Open + 'Report.Debug = True + hResult1 = db.Exec("select distinct firstname from test") + + ReportPanel1.DataCount = hResult1.Count + 'ReportHBox1.DataCount = 4 + 'ReportHBox1.Border.RoundCorner.TopRight = "5mm 5mm" + 'ReportHBox1.Border.RoundCorner.BottomRight = "5mm/5mm" +'Report.Debug = True +ReportLabel3.BoxShadow.XOffset = "1mm" +ReportLabel3.BoxShadow.YOffset = "1mm" +ReportLabel3.BoxShadow.Blur = "1mm" + + + +End + +Public Sub ReportLabel1_Data(Index As Integer) + + hResult2.MoveTo(Index) + Last.data = hResult2!name + Print "FillData = " & hResult1!firstname +End + +Public Sub ReportPanel1_BeforeData() +If hResult1.Max < ReportPanel1.DataIndex Then + Print "error" & ReportPanel1.DataIndex + Return +Endif + hResult1.MoveTo(ReportPanel1.dataindex) + Print "BeforeData = " & hResult1!firstname + hResult2 = db.Exec("Select * From test where firstname=&1 LIMIT 1,20", hResult1!firstname) + ReportHBox1.DataCount = hResult2.Count + +End + +Public Sub ReportLabel2_Data(Index As Integer) + hResult1.MoveTo(Index) + Last.data = hResult1!firstname + + 'Print hResult1!firstname, Index + +End + +Public Sub Report_Open() + + + +End diff --git a/comp/src/gb.report/.src/Tests/Old/Report8.report b/comp/src/gb.report/.src/Tests/Old/Report8.report new file mode 100644 index 00000000..68d32d17 --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Old/Report8.report @@ -0,0 +1,79 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,64,88) + Padding = ReportPadding["Top:15mm;Bottom:2cm;Left:2cm;Right:2cm"] + Tag = "\"toto\"" + Spacing = "1cm" + Index = 0 + Text = ("") + { ReportLabel5 ReportLabel + #MoveScaled(2,0,61,4) + Brush = ReportBrush["#9F9F9F"] + Fixed = True + AutoResize = True + Text = ("List of all my friends") + Alignment = Align.Right + } + { ReportLabel3 ReportLabel + #MoveScaled(2,3,60,18) + Font = Font["Bold,+10"] + Padding = ReportPadding["Top:2mm;Bottom:2mm;Left:2mm;Right:2mm"] + AutoResize = True + Border = ReportBorder["Top:1mm #9F9F9F;Bottom:1mm #9F9F9F;Left:1mm #9F9F9F;Right:1mm #9F9F9F;TopLeftCorner:5mm;TopRightCorner:5mm;BottomRightCorner:5mm;BottomLeftCorner:5mm"] + Background = ReportBrush["#1FFF8F"] + Text = ("List Of My Friends") + Alignment = Align.Center + } + { ReportPanel2 ReportVBox + #MoveScaled(0,23,65,54) + Expand = True + Tag = "Boite 1" + Spacing = "1cm" + { ReportPanel1 ReportVBox + #MoveScaled(7,3,64,45) + Width = "4cm" + Height = "5cm" + AutoResize = True + Tag = "Boite 2" + Spacing = "1mm" + ForceNewPage = True + { ReportLabel2 ReportLabel + #MoveScaled(2,1,54,8) + Fixed = True + Font = Font["Bold,+3"] + Padding = ReportPadding["Left:5mm"] + AutoResize = True + Tag = "head" + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000;TopLeftCorner:3mm;TopRightCorner:3mm;BottomRightCorner:3mm;BottomLeftCorner:3mm"] + Background = ReportBrush["#1FFF8F"] + } + { ReportHBox1 ReportHBox + #MoveScaled(2,11,71,31) + Width = "5cm" + Height = "2cm" + Padding = ReportPadding["Left:5mm"] + AutoResize = True + Tag = "Boite 3" + Background = ReportBrush["#FFFFFF"] + { ReportLabel1 ReportLabel + #MoveScaled(5,5,47,17) + Font = Font["+1"] + Padding = ReportPadding["Top:1mm;Bottom:1mm;Left:1mm;Right:1mm"] + AutoResize = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Background = ReportBrush["#DFDF6F"] + } + } + } + } + { ReportLabel4 ReportLabel + #MoveScaled(0,79,62,4) + Fixed = True + AutoResize = True + Text = ("Page $PAGE / $NPAGE") + Alignment = Align.Right + UseField = True + } + Index = 0 +} diff --git a/comp/src/gb.report/.src/Tests/Old/myReport1.class b/comp/src/gb.report/.src/Tests/Old/myReport1.class new file mode 100644 index 00000000..dd781dce --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Old/myReport1.class @@ -0,0 +1,43 @@ +' Gambas class file + +Private hCon As Connection = Connections["Connection1"] +Private hResult As Result + +Public Sub _new() + + 'Dim hresult As Result + 'Report.debug = True + ' ReportLabel8.Fixed = True + ' ReportHBox4.Fixed = True + 'ReportHBox3._Count = 200 + ' ReportLabel2.Fixed = True + ' hCon.Type = "sqlite" + ' hCon.Host = User.Home + ' hCon.Name = "test" + hresult = db.Exec("SELECT * FROM test") + 'Print hresult.Count + ReportHBox1.DataCount = hresult.Count + 'ReportLabel1.Brush = ReportBrush["&h00FF00&"] + +End + +Public Sub ReportLabel1_Data(Index As Integer) + + hresult.MoveTo(Index) + Last.data = hresult!name + +End + +Public Sub ReportLabel6_Data(Index As Integer) + + hresult.MoveTo(Index) + Last.data = hresult!firstname + +End + +Public Sub ReportLabel7_Data(Index As Integer) + + hresult.MoveTo(Index) + Last.data = hresult!birth + +End diff --git a/comp/src/gb.report/.src/Tests/Old/myReport1.report b/comp/src/gb.report/.src/Tests/Old/myReport1.report new file mode 100644 index 00000000..81683e3d --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Old/myReport1.report @@ -0,0 +1,142 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,71,97) + Padding = ReportPadding["Top:2cm;Bottom:2cm;Left:2cm;Right:2cm"] + Spacing = "2cm" + Count = 3 + Index = 0 + Text = ("First Page") + { ReportVBox2 ReportVBox + #MoveScaled(2,3,51,11) + Expand = True + } + { ReportLabel9 ReportLabel + #MoveScaled(4,16,48,13) + Font = Font["Bitstream Charter,Bold,+9"] + Padding = ReportPadding["Top:6mm;Bottom:6mm;Left:6mm;Right:6mm"] + AutoResize = True + Border = ReportBorder["Top:2mm LinearGradient(0,0,1,1,[#00FF00,#FFFFFF,#FF0000],[0,1,0.59]);Bottom:2mm LinearGradient(0,0,1,1,[#00FF00,#FFFFFF,#FF0000],[0,1,0.59]);Left:2mm LinearGradient(0,0,1,1,[#00FF00,#FFFFFF,#FF0000],[0,1,0.59]);Right:2mm LinearGradient(0,0,1,1,[#00FF00,#FFFFFF,#FF0000],[0,1,0.59]);TopLeftCorner:8mm;TopRightCorner:8mm;BottomRightCorner:8mm;BottomLeftCorner:8mm"] + Text = ("Report About") + Alignment = Align.Center + } + { ReportLabel10 ReportLabel + #MoveScaled(6,35,43,7) + Font = Font["Bitstream Charter,+9"] + AutoResize = True + Border = ReportBorder["Top:4mm #FFAF5F;Bottom:4mm #FFAF5F;Left:4mm #FFAF5F;Right:4mm #FFAF5F;TopLeftCorner:4mm;TopRightCorner:4mm;BottomRightCorner:4mm;BottomLeftCorner:4mm"] + Text = ("All my friends") + Alignment = Align.Center + } + { ReportVBox3 ReportVBox + #MoveScaled(2,47,52,11) + Expand = True + Border = ReportBorder["Top:2px #000000;Bottom:2px #000000;Left:2px #000000;Right:2px #000000"] + } + Index = 1 + Text = ("Friend Table") + { ReportLabel11 ReportLabel + #MoveScaled(5,3,57,2) + Height = "15mm" + Brush = ReportBrush["#BFBFBF"] + Fixed = True + Text = ("Report about all my frends") + Alignment = Align.TopRight + } + { ReportLabel2 ReportLabel + #MoveScaled(5,6,45,5) + Height = "3cm" + Font = Font["Bitstream Charter,+7"] + Text = ("Test Database") + Alignment = Align.Center + } + { ReportVBox1 ReportVBox + #MoveScaled(5,13,45,38) + Expand = True + AutoResize = True + Tag = "Boite 1" + { ReportVBox4 ReportVBox + #MoveScaled(3,12,41,24) + AutoResize = True + Tag = "Boite 2" + { ReportHBox2 ReportHBox + #MoveScaled(0,0,37.7143,5.1429) + Height = "15mm" + Fixed = True + AutoResize = True + { ReportLabel3 ReportLabel + #MoveScaled(1,1,10.2857,3.4286) + Width = "5 cm" + Height = "10mm" + Font = Font["Bitstream Charter,Bold,16"] + AutoResize = True + Text = ("Name") + Alignment = Align.Center + } + { ReportLabel4 ReportLabel + #MoveScaled(12,1,10.2857,3.4286) + Width = "5 cm" + Height = "10mm" + Font = Font["Bitstream Charter,Bold,16"] + Padding = ReportPadding["0.2 mm"] + AutoResize = True + Text = ("FirstName") + Alignment = Align.Center + } + { ReportLabel5 ReportLabel + #MoveScaled(24.8571,0.8571,10.2857,3.4286) + Width = "5 cm" + Height = "10mm" + Font = Font["Bitstream Charter,Bold,16"] + Padding = ReportPadding["0.2 mm"] + Expand = True + AutoResize = True + Text = ("Birth") + Alignment = Align.Center + } + } + { ReportHBox1 ReportHBox + #MoveScaled(1,8,38,4) + Height = "10mm" + Tag = "Boite 3" + { ReportLabel1 ReportLabel + #MoveScaled(0,0,10.2857,3.4286) + Width = "5 cm" + Font = Font["12"] + Padding = ReportPadding["0.2 mm"] + Alignment = Align.Center + UseField = True + } + { ReportLabel6 ReportLabel + #MoveScaled(11,0,10.2857,3.4286) + Width = "5 cm" + Font = Font["12"] + Padding = ReportPadding["0.2 mm"] + Alignment = Align.Center + } + { ReportLabel7 ReportLabel + #MoveScaled(24,0,10.2857,3.4286) + Width = "5 cm" + Font = Font["12"] + Padding = ReportPadding["2.2mm"] + Expand = True + Format = "dd/mm/aaaa" + Alignment = Align.Right + } + } + } + } + { ReportLabel8 ReportLabel + #MoveScaled(2,51,46,3) + Height = "6mm" + Fixed = True + Padding = ReportPadding["2mm"] + AutoResize = True + Text = ("$PAGE/$NPAGE") + Alignment = Align.Right + UseField = True + } + Index = 2 + Text = ("") + Index = 0 +} diff --git a/comp/src/gb.report/.src/Tests/Old/myReport2.class b/comp/src/gb.report/.src/Tests/Old/myReport2.class new file mode 100644 index 00000000..3588055e --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Old/myReport2.class @@ -0,0 +1,85 @@ +' Gambas class file + +Private cList As New Collection[] +Private cFactHead As New Collection[] + +Public Sub _new() + + Dim cLine As Collection + Dim i As Integer + + 'Report.Debug = True + + cLine = New Collection + cLine["nom"] = "Berton Toto " + cLine["adresse"] = "La belle route" + cLine["CP"] = "17520" + cLine["ville"] = "Archiac" + cLine["TOTALHT"] = 0 + cFactHead.Add(cLine) + 'Me.Data = cFactHead + For i = 0 To 12 + cLine = New Collection + cLine["designation"] = "Patin a roulette" + cLine["PU"] = 19.90 + cLine["Q"] = 1 + cList.Add(cLine) + cLine = New Collection + cLine["designation"] = "Cuilliere en bois" + cLine["PU"] = 8.90 + cLine["Q"] = 1 + cList.Add(cLine) + cLine = New Collection + cLine["designation"] = "Lapin en peluche" + cLine["PU"] = 19.90 + cLine["Q"] = 5 + cList.Add(cLine) + cLine = New Collection + cLine["designation"] = "Cloche de noël" + cLine["PU"] = 20 + cLine["Q"] = 10 + cList.Add(cLine) + cLine = New Collection + cLine["designation"] = "Cheque en bois" + cLine["PU"] = 1000 + cLine["Q"] = 1 + cList.Add(cLine) + cLine = New Collection + cLine["designation"] = "Pense bête" + cLine["PU"] = 2 + cLine["Q"] = 3 + cList.Add(cLine) + Next + 'ReportHBox3.Data = cList + 'ReportHBox12.Data = cList + 'Compute Summaries + i = 0 + For Each cLine In cList + Inc i + cLine["id"] = i + cLine["THT"] = Round(cLine["PU"] * cLine["Q"], -2) + cFactHead[0]["TOTALHT"] += cLine["THT"] + + Next + ReportHBox3.DataCount = cList.Count + +End + +Public Sub ligne_Data(Index As Integer) + + If Not Last.tag Then Return + Last.data = cList[Index][Last.tag] + +End + +Public Sub entete_Data(Index As Integer) + + Last.data = cFactHead[Index][Last.tag] + +End + +Public Sub ReportVBox1_BeforeArrange() + + Debug "Before Arrange" + +End diff --git a/comp/src/gb.report/.src/Tests/Old/myReport2.report b/comp/src/gb.report/.src/Tests/Old/myReport2.report new file mode 100644 index 00000000..643c85f7 --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Old/myReport2.report @@ -0,0 +1,228 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,106,113) + Padding = ReportPadding["1cm"] + Spacing = "1cm" + Index = 0 + Text = ("Section 1") + { ReportVBox2 ReportVBox + #MoveScaled(4,4,80,42) + Fixed = True + AutoResize = True + { ReportLabel9 ReportLabel + #MoveScaled(0,0,68,7) + Fixed = True + Font = Font["Bitstream Charter,+11"] + AutoResize = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Text = ("Facture") + Alignment = Align.Center + } + { ReportHBox1 ReportHBox + #MoveScaled(1,9,72,25) + Height = "4cm" + Fixed = True + Expand = True + Border = ReportBorder["Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + { ReportHBox5 ReportHBox + #MoveScaled(2,1,34,22) + Width = "5cm" + Height = "5cm" + Fixed = True + Expand = True + AutoResize = True + { ReportSvgImage1 ReportSvgImage + #MoveScaled(3,2,25,17) + Width = "50mm" + Height = "30mm" + Alignment = Align.Center + Image = SvgImage.Load("img/logo.svg") + } + } + { ReportVBox3 ReportVBox + #MoveScaled(38,1,34,20) + Padding = ReportPadding["Top:4mm;Bottom:4mm;Left:4mm;Right:4mm"] + Expand = True + AutoResize = True + Tag = "*" + { Nom ReportLabel entete + Name = "Nom" + #MoveScaled(2,1,28,3) + AutoResize = True + Tag = "nom" + } + { Adresse ReportLabel entete + Name = "Adresse" + #MoveScaled(2,6,28,3) + AutoResize = True + Tag = "adresse" + } + { ReportHBox6 ReportHBox + #MoveScaled(1,9,30,5) + AutoResize = True + Tag = "*" + Spacing = "2mm" + { CP ReportLabel entete + Name = "CP" + #MoveScaled(2,1,10,3) + Width = "25mm" + Padding = ReportPadding["Right:1mm"] + AutoResize = True + Tag = "CP" + } + { ville ReportLabel entete + Name = "ville" + #MoveScaled(13,1,16,3) + Expand = True + AutoResize = True + Tag = "ville" + } + } + } + } + } + { ReportVBox1 ReportVBox + #MoveScaled(4,49,90,26) + Expand = True + { ReportHBox2 ReportHBox + #MoveScaled(2,0,86,5) + Height = "1cm" + Fixed = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + { ReportLabel11 ReportLabel + #MoveScaled(0,0,21,4) + Width = "15mm" + Font = Font["Bitstream Charter,Bold"] + Border = ReportBorder["Right:1px #000000"] + Text = ("Id") + Alignment = Align.Center + } + { ReportLabel1 ReportLabel + #MoveScaled(17,1,21,4) + Width = "40%" + Font = Font["Bitstream Charter,Bold"] + Expand = True + Border = ReportBorder["Top=1mm &H00000000&; Bottom=1mm &H00000000&; Left=1mm &H00000000&; "] + Text = ("Designation") + Alignment = Align.Center + } + { ReportLabel2 ReportLabel + #MoveScaled(38,1,13,4) + Width = "3cm" + Font = Font["Bitstream Charter,Bold"] + Border = ReportBorder["Left:1px #000000"] + Text = ("PU HT") + Alignment = Align.Center + } + { ReportLabel3 ReportLabel + #MoveScaled(51,1,13,4) + Width = "3cm" + Font = Font["Bitstream Charter,Bold"] + Tag = "*" + Border = ReportBorder["Left:1px #000000"] + Text = ("Quantité") + Alignment = Align.Center + } + { ReportLabel4 ReportLabel + #MoveScaled(68,1,13,4) + Width = "3cm" + Font = Font["Bitstream Charter,Bold"] + Border = ReportBorder["Left:1px #000000"] + Text = ("Total HT") + Alignment = Align.Center + } + } + { ReportHBox3 ReportHBox + #MoveScaled(2,7,86,5) + Height = "8mm" + AutoResize = True + Tag = "*" + { ReportLabel12 ReportLabel ligne + Name = "ReportLabel12" + #MoveScaled(0,0,17,4) + Width = "15mm" + Padding = ReportPadding["Top:1mm;Bottom:1mm;Left:1mm;Right:1mm"] + AutoResize = True + Border = ReportBorder["Left:1px #000000"] + Alignment = Align.Center + } + { ReportLabel5 ReportLabel ligne + Name = "ReportLabel5" + #MoveScaled(19,0,21,4) + Width = "40%" + Padding = ReportPadding["Top:2mm;Bottom:2mm;Left:2mm;Right:2mm"] + Expand = True + Tag = "designation" + Border = ReportBorder["Left:1px #000000"] + } + { ReportLabel6 ReportLabel ligne + Name = "ReportLabel6" + #MoveScaled(39,1,13,4) + Width = "3cm" + Padding = ReportPadding["Top:2mm;Bottom:2mm;Left:2mm;Right:2mm"] + Tag = "PU" + Border = ReportBorder["Left:1px #000000"] + Alignment = Align.Right + } + { ReportLabel7 ReportLabel ligne + Name = "ReportLabel7" + #MoveScaled(52,1,13,4) + Width = "3cm" + Padding = ReportPadding["Top:2mm;Bottom:2mm;Left:2mm;Right:2mm"] + Tag = "Q" + Border = ReportBorder["Left:1px #000000"] + Alignment = Align.Right + } + { ReportLabel8 ReportLabel ligne + Name = "ReportLabel8" + #MoveScaled(70,1,13,4) + Width = "3cm" + Padding = ReportPadding["Top:2mm;Bottom:2mm;Left:2mm;Right:2mm"] + Border = ReportBorder["Left:1px #000000;Right:1px #000000"] + Format = "#.00 €" + Alignment = Align.Right + } + } + { ReportHBox8 ReportHBox + #MoveScaled(3,13,83,2) + Height = "1mm" + Fixed = True + Border = ReportBorder["Top:1px #000000"] + Background = ReportBrush["#FFFF00"] + } + { ReportHBox4 ReportHBox + #MoveScaled(4,17,81,5) + AutoResize = True + { ReportHBox7 ReportHBox + #MoveScaled(4,2,62,2) + Expand = True + } + { ReportLabel14 ReportLabel + #MoveScaled(68,1,11,4) + Width = "3cm" + Padding = ReportPadding["Top:2mm;Bottom:2mm"] + AutoResize = True + Border = ReportBorder["Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Format = "#.00 €" + Alignment = Align.Right + } + } + } + { ReportHBox9 ReportHBox + #MoveScaled(1,100,101,6) + Fixed = True + AutoResize = True + { ReportHBox10 ReportHBox + #MoveScaled(2,1,31,3) + Expand = True + } + { ReportLabel10 ReportLabel + #MoveScaled(68,0,31,4) + AutoResize = True + Text = ("Page $PAGE") + UseField = True + } + } + Index = 0 +} diff --git a/comp/src/gb.report/.src/Tests/Old/myReport5.class b/comp/src/gb.report/.src/Tests/Old/myReport5.class new file mode 100644 index 00000000..391ceb22 --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Old/myReport5.class @@ -0,0 +1,22 @@ +' Gambas class file + +Public Sub _new() + + Dim Rlbl As ReportLabel + Dim i As Integer + 'Report.Debug = True + For i = 0 To 100 + + Rlbl = New ReportLabel(RVBCont) + Rlbl.Autoresize = True + Rlbl.Text = "Ligne " & i + Rlbl.Border.bottom.Width = "1px" + Rlbl.Padding.Top = "3 mm" + Rlbl.Padding.Bottom = "1mm" + Rlbl.Padding.Left = "2 mm" + Rlbl.Top = i & "cm" + Rlbl.Left = i & "cm" + Rlbl.Width = "1 cm" + Next + +End diff --git a/comp/src/gb.report/.src/Tests/Old/myReport5.report b/comp/src/gb.report/.src/Tests/Old/myReport5.report new file mode 100644 index 00000000..4f106dc2 --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Old/myReport5.report @@ -0,0 +1,91 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,90,76) + Tag = "*" + Index = 0 + Text = ("") + { ReportHBox2 ReportHBox + #MoveScaled(0,0,77,14) + Height = "4cm" + Fixed = True + Padding = ReportPadding["Top:7mm;Bottom:7mm;Left:7mm;Right:7mm"] + Border = ReportBorder["Top:1mm #000000;Bottom:1mm #000000;Left:1mm #000000;Right:1mm #000000"] + Background = ReportBrush["#3398C3"] + { ReportSvgImage1 ReportSvgImage + #MoveScaled(2,2,11,11) + Width = "4cm" + Image = SvgImage.Load("img/logo.svg") + } + { ReportLabel3 ReportLabel + #MoveScaled(20,2,48,10) + Left = "1mm" + Top = "1mm" + Width = "3cm" + Brush = ReportBrush["LinearGradient(1,0.04,0,0.04,[#DF6B00,#FFFFFF],[0,1])"] + Fixed = True + Font = Font["DejaVu Sans,Bold,+14"] + Padding = ReportPadding["Top:6mm;Bottom:6mm;Left:6mm;Right:6mm"] + Expand = True + Text = ("Gambas") + Alignment = Align.Left + } + } + { ReportHBox1 ReportHBox + #MoveScaled(0,15,87,56) + Expand = True + Border = ReportBorder["Bottom:1mm #000000;Left:1mm #000000;Right:1mm #000000"] + Background = ReportBrush["#FF007F"] + { ReportVBox1 ReportVBox + #MoveScaled(1,1,25,47) + Width = "6cm" + Background = ReportBrush["#DF6B00"] + } + { ReportVBox2 ReportVBox + #MoveScaled(28,2,56,54) + Expand = True + Border = ReportBorder["Left:1mm #000000"] + Background = ReportBrush["#FF7F00"] + { RVBCont ReportPanel + #MoveScaled(3,5,45,36) + Expand = True + Tag = "*" + Background = ReportBrush["#FFFF00"] + { ReportLabel1 ReportLabel + #MoveScaled(3,5,43,23) + Left = "25%" + Top = "5cm" + Width = "50%" + Height = "5cm" + Brush = ReportBrush["LinearGradient(0.21,0.91,0.81,0.11,[#FF000000,#FFFFFF],[0,1])"] + Fixed = True + Font = Font["Bold,+15"] + Ignore = True + Background = ReportBrush["#FF1F57"] + Text = ("gambas") + Alignment = Align.Center + } + { ReportImage1 ReportImage + #MoveScaled(10,17,14,8) + Height = "3cm" + Alignment = Align.Center + Image = Image.Load("printer1.png") + } + } + { ReportLabel2 ReportLabel + #MoveScaled(9,47,47,5) + Brush = ReportBrush["#FFFFFF"] + Fixed = True + Font = Font["Bold,+1"] + Padding = ReportPadding["Top:4mm;Bottom:4mm;Left:2mm;Right:2mm"] + AutoResize = True + Border = ReportBorder["Top:1mm #000000"] + Background = ReportBrush["#3398C3"] + Text = ("Page $PAGE on $NPAGE") + Alignment = Align.Right + UseField = True + } + } + } + Index = 0 +} diff --git a/comp/src/gb.report/.src/Tests/OutputReport.class b/comp/src/gb.report/.src/Tests/OutputReport.class new file mode 100644 index 00000000..7fc4dc12 --- /dev/null +++ b/comp/src/gb.report/.src/Tests/OutputReport.class @@ -0,0 +1,146 @@ +' Gambas class file + +Public nnoderows As Integer +Public nanchorrows As Integer + +Public Sub _new() + + 'enter current date on the header + ReportLabel2.Text = Date + + 'enter the project information in the header on the print out page + 'With FMain.Project + ReportLabel3.Text = "Project Title: " ' & .JobTitle + ReportLabel4.Text = "Project No.: " ' & .Number + ReportLabel5.Text = "Company: " ' & .Company + ReportLabel6.Text = "Designer: " '& .Designer + ReportLabel7.Text = "Base Plate ID: " ' & .BasePlateID + 'End With + + 'set count to four to display the results for qmax. Tmax, L, and phi + ReportHBox9.DataCount = 4 + + 'set the number of plate nodes to display in print out tables + 'nnoderows = Module1.RoundUpInt(FMain.ConcreteSection.cNodes.Count / 2) + ReportHBox5.DataCount = 9 + + 'set the number of anchor rods to display in print out tables + ' nanchorrows = Module1.RoundUpInt(FMain.cAnchorRods.Count / 2) + ReportHBox7.DataCount = 3 + FullRepeat.DataCount = 3 + +End + + +Public Sub ReportImage2_Data(Index As Integer) + ' Dim current_results As Results + ' Dim pSection As Picture + ' + ' 'create a new picture object for drawing the base plate + ' pSection = New Picture(300, 300, False) + ' + ' 'get the results for first load case + ' current_results = FMain.AnalysisResults[Str$(ReportHBox3.DataIndex)] + ' + ' 'refresh base plate drawing with results + ' Module1.DrawBasePlate(pSection, 1, current_results) + ' + ' 'add the picture of the base plate to the page + ' ReportImage2.Image = pSection.Image + +End + + +Public Sub ReportLabel9_Data(Index As Integer) + + Last.Data = "Load Case: " '& FMain.cLoads[Str$(ReportHBox3.DataIndex)].label + +End + + +Public Sub ReportLabel14_Data(Index As Integer) + Dim $value As String + + Select Case Index + Case 0 + '$value = Module1.AdvFormat(FMain.AnalysisResults[Str$(ReportHBox3.DataIndex)].Tmax, 2) + Last.Data = "T(max) = " & $value & " lbs" + Case 1 + '$value = Module1.AdvFormat(FMain.AnalysisResults[Str$(ReportHBox3.DataIndex)].maxstress, 2) + Last.Data = "q(max) = " & $value & " psi" + Case 2 + '$value = Module1.AdvFormat(FMain.AnalysisResults[Str$(ReportHBox3.DataIndex)].L, 2) + Last.Data = "L = " & $value & " in" + Case 3 + '$value = Module1.AdvFormat(FMain.AnalysisResults[Str$(ReportHBox3.DataIndex)].phi, 2) + Last.Data = "phi = " & $value & " degrees" + Case Else + End Select + +End + + +Public Sub ReportLabel25_Data(Index As Integer) + + Last.Data = Str(Index + 1) &/ Str(FullRepeat.DataIndex) + +End + +Public Sub ReportLabel29_Data(Index As Integer) + + Last.Data = nnoderows + Index + 1 + +End + +Public Sub ReportLabel26_Data(Index As Integer) + Dim value As Float + + 'value = FMain.AnalysisResults[Str$(ReportVBox4.DataIndex)].stress[Index] + 'Last.Data = Module1.AdvFormat(value, 2) + +End + +Public Sub ReportLabel30_Data(Index As Integer) + ' Dim value As Float + ' Dim current_results As Results + ' + ' current_results = FMain.AnalysisResults[Str$(ReportVBox4.DataIndex)] + ' If nnoderows + Index < current_results.stress.Count Then + ' value = current_results.stress[nnoderows + Index] + ' Last.Data = Module1.AdvFormat(value, 2) + ' Endif + +End + +Public Sub ReportLabel49_Data(Index As Integer) + + Last.Data = Str(Index + 1) &/ Str(FullRepeat.DataIndex) + +End + +Public Sub ReportLabel52_Data(Index As Integer) + + Last.Data = nanchorrows + Index + 1 + +End + +Public Sub ReportLabel50_Data(Index As Integer) + Dim value As Float + + ' value = FMain.AnalysisResults[Str$(ReportVBox6.DataIndex)].T[Index] + ' Last.Data = Module1.AdvFormat(value, 2) + +End + +Public Sub ReportLabel53_Data(Index As Integer) + ' Dim value As Float + ' Dim current_results As Results + ' + ' current_results = FMain.AnalysisResults[Str$(ReportVBox6.DataIndex)] + ' If nanchorrows + Index < current_results.T.Count Then + ' value = current_results.T[nanchorrows + Index] + ' Last.Data = Module1.AdvFormat(value, 2) + ' Endif + +End + diff --git a/comp/src/gb.report/.src/Tests/OutputReport.report b/comp/src/gb.report/.src/Tests/OutputReport.report new file mode 100644 index 00000000..045630c1 --- /dev/null +++ b/comp/src/gb.report/.src/Tests/OutputReport.report @@ -0,0 +1,306 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,76,85) + Fixed = True + Padding = ReportPadding["Top:20mm;Bottom:20mm;Left:20mm;Right:20mm"] + Expand = True + Index = 0 + Text = ("") + { ReportHBox1 ReportHBox + #MoveScaled(2,0,62,11) + Height = "25mm" + Fixed = True + Padding = ReportPadding["Top:1mm;Bottom:1mm;Left:1mm;Right:1mm"] + Border = ReportBorder["Bottom:2px #000000"] + { ReportImage1 ReportImage + #MoveScaled(1,1,18,9) + Width = "51mm" + AutoResize = True + } + { ReportLabel1 ReportLabel + #MoveScaled(21,1,10,9) + AutoResize = True + Text = ("Version 1.0") + Alignment = Align.BottomLeft + } + { ReportLabel2 ReportLabel + #MoveScaled(31,1,30,9) + Expand = True + AutoResize = True + Text = ("Date") + Alignment = Align.BottomRight + UseField = True + } + } + { ReportVBox1 ReportVBox + #MoveScaled(2,11,62,9) + Height = "28.01mm" + Fixed = True + Padding = ReportPadding["Top:1mm;Bottom:1mm;Left:1mm;Right:1mm"] + Border = ReportBorder["Bottom:2px #000000"] + { ReportLabel3 ReportLabel + #MoveScaled(0,0,12,2) + Height = "6mm" + AutoResize = True + Text = ("Project Title:") + Alignment = Align.TopLeft + } + { ReportLabel4 ReportLabel + #MoveScaled(0,2,12,2) + Height = "6mm" + AutoResize = True + Text = ("Project No.:") + Alignment = Align.TopLeft + } + { ReportLabel5 ReportLabel + #MoveScaled(0,4,12,2) + Height = "6mm" + AutoResize = True + Text = ("Company:") + Alignment = Align.TopLeft + } + { ReportLabel6 ReportLabel + #MoveScaled(0,6,12,2) + Height = "6mm" + AutoResize = True + Text = ("Designer:") + Alignment = Align.TopLeft + } + } + { ReportHBox2 ReportHBox + #MoveScaled(2,20,62,3) + Height = "8mm" + Fixed = True + Padding = ReportPadding["Top:1mm;Bottom:1mm;Left:1mm;Right:1mm"] + Border = ReportBorder["Bottom:2px #000000"] + { ReportLabel7 ReportLabel + #MoveScaled(0,0,12,2) + Height = "6mm" + AutoResize = True + Text = ("Base Plate ID:") + Alignment = Align.TopLeft + } + } + { FullRepeat ReportPanel + #MoveScaled(2,25,63,50) + AutoResize = True + Tag = "**" + ForceNewPage = True + { ReportHBox3 ReportHBox + #MoveScaled(0,0,62,17) + Height = "61mm" + Fixed = True + Expand = True + { ReportVBox3 ReportVBox + #MoveScaled(1,1,18,14) + AutoResize = True + { ReportHBox8 ReportHBox + #MoveScaled(1,2,15,4) + Width = "51mm" + Height = "12mm" + { ReportLabel9 ReportLabel + #MoveScaled(1,1,13,2) + Font = Font["+1"] + Expand = True + } + } + { ReportHBox9 ReportHBox + #MoveScaled(1,8,15,4) + Width = "51mm" + Height = "6mm" + { ReportLabel14 ReportLabel + #MoveScaled(1,1,13,2) + Expand = True + } + } + } + { ReportImage2 ReportImage + #MoveScaled(31,1,17,15) + Padding = ReportPadding["Top:5mm;Bottom:5mm;Left:5mm;Right:5mm"] + Expand = True + Background = ReportBrush["#0000FF"] + Alignment = Align.Center + } + } + { ReportVBox4 ReportVBox + #MoveScaled(1,18,62,14) + AutoResize = True + Tag = "Serie 1" + { ReportLabel19 ReportLabel + #MoveScaled(2,0,16,4) + Fixed = True + Font = Font["+1"] + Padding = ReportPadding["Top:3mm"] + AutoResize = True + Text = ("Bearing Pressue") + } + { ReportHBox4 ReportHBox + #MoveScaled(1,3,60,4) + Height = "6mm" + Fixed = True + { ReportLabel20 ReportLabel + #MoveScaled(1,1,13,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Text = ("Node #") + Alignment = Align.Center + } + { ReportLabel21 ReportLabel + #MoveScaled(14,1,14,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Text = ("Brg. Press., psi") + Alignment = Align.Center + } + { ReportLabel22 ReportLabel + #MoveScaled(28,1,4,2) + Width = "5mm" + } + { ReportLabel23 ReportLabel + #MoveScaled(32,1,12,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Text = ("Node #") + Alignment = Align.Center + } + { ReportLabel24 ReportLabel + #MoveScaled(44,1,15,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Text = ("Brg. Press., psi") + Alignment = Align.Center + } + } + { ReportHBox5 ReportHBox + #MoveScaled(1,8,60,4) + Height = "6mm" + { ReportLabel25 ReportLabel + #MoveScaled(1,1,13,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Alignment = Align.Center + } + { ReportLabel26 ReportLabel + #MoveScaled(14,1,14,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Alignment = Align.Center + } + { ReportLabel27 ReportLabel + #MoveScaled(28,1,4,2) + Width = "5mm" + } + { ReportLabel29 ReportLabel + #MoveScaled(32,1,12,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Alignment = Align.Center + } + { ReportLabel30 ReportLabel + #MoveScaled(44,1,15,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Alignment = Align.Center + } + } + } + { ReportVBox6 ReportVBox + #MoveScaled(1,33,62,14) + AutoResize = True + Tag = "Serie2" + { ReportLabel31 ReportLabel + #MoveScaled(2,0,19,4) + Fixed = True + Font = Font["+1"] + Padding = ReportPadding["Top:3mm"] + AutoResize = True + Text = ("Anchor Rod Tension") + } + { ReportHBox6 ReportHBox + #MoveScaled(1,3,60,4) + Height = "6mm" + Fixed = True + { ReportLabel44 ReportLabel + #MoveScaled(1,1,13,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Text = ("Rod #") + Alignment = Align.Center + } + { ReportLabel45 ReportLabel + #MoveScaled(14,1,14,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Text = ("Tension, lbs") + Alignment = Align.Center + } + { ReportLabel46 ReportLabel + #MoveScaled(28,1,4,2) + Width = "5mm" + } + { ReportLabel47 ReportLabel + #MoveScaled(32,1,12,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Text = ("Rod #") + Alignment = Align.Center + } + { ReportLabel48 ReportLabel + #MoveScaled(44,1,15,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Text = ("Tension, lbs") + Alignment = Align.Center + } + } + { ReportHBox7 ReportHBox + #MoveScaled(1,8,60,4) + Height = "6mm" + { ReportLabel49 ReportLabel + #MoveScaled(1,1,13,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Alignment = Align.Center + } + { ReportLabel50 ReportLabel + #MoveScaled(14,1,14,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Alignment = Align.Center + } + { ReportLabel51 ReportLabel + #MoveScaled(28,1,4,2) + Width = "5mm" + } + { ReportLabel52 ReportLabel + #MoveScaled(32,1,12,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Alignment = Align.Center + } + { ReportLabel53 ReportLabel + #MoveScaled(44,1,15,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Alignment = Align.Center + } + } + } + } + { ReportHBox10 ReportHBox + #MoveScaled(2,75,62,4) + Fixed = True + Expand = True + AutoResize = True + { ReportLabel8 ReportLabel + #MoveScaled(22,1,21,2) + Expand = True + AutoResize = True + Text = ("Page $PAGE of $NPAGE") + Alignment = Align.Bottom + UseField = True + } + } + Index = 0 +} diff --git a/comp/src/gb.report/.src/Tests/OutputReport2.class b/comp/src/gb.report/.src/Tests/OutputReport2.class new file mode 100644 index 00000000..4142a133 --- /dev/null +++ b/comp/src/gb.report/.src/Tests/OutputReport2.class @@ -0,0 +1,166 @@ +' Gambas class file + +Public nnoderows As Integer +Public nanchorrows As Integer + +Public Sub _new() +'Report.Debug = True + 'enter current date on the header + ReportLabel2.Text = Date + + 'enter the project information in the header on the print out page + 'With FMain.Project + ReportLabel3.Text = "Project Title: " ' & .JobTitle + ReportLabel4.Text = "Project No.: '" '& .Number + ReportLabel5.Text = "Company: " '& .Company + ReportLabel6.Text = "Designer: " '& .Designer + ReportLabel7.Text = "Base Plate ID: " ' & .BasePlateID + 'End With + + 'set count to four to display the results for qmax. Tmax, L, and phi + ReportHBox9.DataCount = 4 + + 'set the number of plate nodes to display in print out tables + ' nnoderows = Module1.RoundUpInt(FMain.ConcreteSection.cNodes.Count / 2) + ReportHBox5.DataCount = 11 'nnoderows + + 'set the number of anchor rods to display in print out tables + 'nanchorrows = Module1.RoundUpInt(FMain.cAnchorRods.Count / 2) + ReportHBox7.DataCount = 13 'nanchorrows + + 'set the number of report panels - one for each load combination result + ReportPanel1.DataCount = 6 'FMain.AnalysisResults.Count + +End + + +Public Sub ReportImage2_Data(Index As Integer) + 'Dim current_results As Results + Dim pSection As Picture + + 'create a new picture object for drawing the base plate + pSection = New Picture(300, 300, False) + + 'get the results for first load case + 'current_results = FMain.AnalysisResults[Str$(ReportHBox3.DataIndex)] + + 'refresh base plate drawing with results + 'Module1.DrawBasePlate(pSection, 1, current_results) + + 'add the picture of the base plate to the page + ReportImage2.Image = pSection.Image + +End + + +Public Sub ReportLabel9_Data(Index As Integer) + + Last.Data = "Load Case: " '& FMain.cLoads[Str$(ReportHBox3.DataIndex)].label + +End + + +Public Sub ReportLabel14_Data(Index As Integer) + Dim $value As String + + Select Case Index + Case 0 + '$value = Module1.AdvFormat(FMain.AnalysisResults[Str$(ReportHBox3.DataIndex)].Tmax, 2) + Last.Data = "T(max) = " & 3 & " lbs" + Case 1 + '$value = Module1.AdvFormat(FMain.AnalysisResults[Str$(ReportHBox3.DataIndex)].maxstress, 2) + Last.Data = "q(max) = " & 3 & " psi" + Case 2 + '$value = Module1.AdvFormat(FMain.AnalysisResults[Str$(ReportHBox3.DataIndex)].L, 2) + Last.Data = "L = " & 3 & " in" + Case 3 + '$value = Module1.AdvFormat(FMain.AnalysisResults[Str$(ReportHBox3.DataIndex)].phi, 2) + Last.Data = "phi = " & 3 & " degrees" + Case Else + End Select + +End + + +Public Sub ReportLabel25_Data(Index As Integer) + + Last.Data = Index + 1 + +End + +Public Sub ReportLabel29_Data(Index As Integer) + ' Dim current_results As Results + + 'current_results = FMain.AnalysisResults[Str$(ReportPanel1.DataIndex)] + + 'If nnoderows + Index < current_results.stress.Count Then + Last.Data = nnoderows + Index + 1 + 'Else + ' Last.Data = Null + ' Endif + +End + +Public Sub ReportLabel26_Data(Index As Integer) + Dim value As Float + + 'value = FMain.AnalysisResults[Str$(ReportPanel1.DataIndex)].stress[Index] + Last.Data = "tt" 'Module1.AdvFormat(value, 2) + +End + +Public Sub ReportLabel30_Data(Index As Integer) + Dim value As Float + 'Dim current_results As Results + + 'current_results = FMain.AnalysisResults[Str$(ReportPanel1.DataIndex)] + ' If nnoderows + Index < current_results.stress.Count Then + 'value = current_results.stress[nnoderows + Index] + Last.Data = "mm" 'Module1.AdvFormat(value, 2) + ' Else + Last.Data = Null + 'Endif + +End + +Public Sub ReportLabel49_Data(Index As Integer) + + Last.Data = Index + 1 + +End + +Public Sub ReportLabel52_Data(Index As Integer) + 'Dim current_results As Results + + 'current_results = FMain.AnalysisResults[Str$(ReportPanel1.DataIndex)] + + 'If nanchorrows + Index < current_results.T.Count Then + Last.Data = nanchorrows + Index + 1 + 'Else + ' Last.Data = Null + ' Endif + +End + +Public Sub ReportLabel50_Data(Index As Integer) + Dim value As Float + + 'value = FMain.AnalysisResults[Str$(ReportPanel1.DataIndex)].T[Index] + Last.Data = "kkkk" 'Module1.AdvFormat(value, 2) + +End + +Public Sub ReportLabel53_Data(Index As Integer) + Dim value As Float + 'Dim current_results As Results + + ' current_results = FMain.AnalysisResults[Str$(ReportPanel1.DataIndex)] + ' If nanchorrows + Index < current_results.T.Count Then + ' value = current_results.T[nanchorrows + Index] + Last.Data = "qqqqqq" 'Module1.AdvFormat(value, 2) + ' Else + ' Last.Data = Null + 'Endif + +End + diff --git a/comp/src/gb.report/.src/Tests/OutputReport2.report b/comp/src/gb.report/.src/Tests/OutputReport2.report new file mode 100644 index 00000000..f12422c8 --- /dev/null +++ b/comp/src/gb.report/.src/Tests/OutputReport2.report @@ -0,0 +1,308 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,76,88) + Fixed = True + Padding = ReportPadding["Top:20mm;Bottom:10mm;Left:20mm;Right:20mm"] + Ignore = True + AutoResize = True + Index = 0 + Text = ("") + { ReportHBox1 ReportHBox + #MoveScaled(2,0,62,11) + Height = "25mm" + Fixed = True + Padding = ReportPadding["Top:1mm;Bottom:1mm;Left:1mm;Right:1mm"] + Border = ReportBorder["Bottom:2px #000000"] + { ReportImage1 ReportImage + #MoveScaled(1,1,18,9) + Width = "51mm" + AutoResize = True + } + { ReportLabel1 ReportLabel + #MoveScaled(21,1,10,9) + Width = "25mm" + AutoResize = True + Text = ("Version 1.0") + Alignment = Align.BottomLeft + } + { ReportLabel2 ReportLabel + #MoveScaled(31,1,30,9) + Expand = True + AutoResize = True + Text = ("Date") + Alignment = Align.BottomRight + UseField = True + } + } + { ReportVBox1 ReportVBox + #MoveScaled(2,11,62,9) + Height = "28.01mm" + Fixed = True + Padding = ReportPadding["Top:1mm;Bottom:1mm;Left:1mm;Right:1mm"] + Border = ReportBorder["Bottom:2px #000000"] + { ReportLabel3 ReportLabel + #MoveScaled(0,0,12,2) + Height = "6mm" + AutoResize = True + Text = ("Project Title:") + Alignment = Align.TopLeft + } + { ReportLabel4 ReportLabel + #MoveScaled(0,2,12,2) + Height = "6mm" + AutoResize = True + Text = ("Project No.:") + Alignment = Align.TopLeft + } + { ReportLabel5 ReportLabel + #MoveScaled(0,4,12,2) + Height = "6mm" + AutoResize = True + Text = ("Company:") + Alignment = Align.TopLeft + } + { ReportLabel6 ReportLabel + #MoveScaled(0,6,12,2) + Height = "6mm" + AutoResize = True + Text = ("Designer:") + Alignment = Align.TopLeft + } + } + { ReportHBox2 ReportHBox + #MoveScaled(2,20,62,3) + Height = "8mm" + Fixed = True + Padding = ReportPadding["Top:1mm;Bottom:1mm;Left:1mm;Right:1mm"] + Border = ReportBorder["Bottom:2px #000000"] + { ReportLabel7 ReportLabel + #MoveScaled(0,0,12,2) + Height = "6mm" + AutoResize = True + Text = ("Base Plate ID:") + Alignment = Align.TopLeft + } + } + { ReportPanel1 ReportPanel + #MoveScaled(2,25,67,52) + AutoResize = True + ForceNewPage = True + { ReportHBox3 ReportHBox + #MoveScaled(1,1,62,17) + Height = "61mm" + Expand = True + { ReportVBox3 ReportVBox + #MoveScaled(1,1,18,14) + AutoResize = True + { ReportHBox8 ReportHBox + #MoveScaled(1,2,15,4) + Width = "51mm" + Height = "12mm" + { ReportLabel9 ReportLabel + #MoveScaled(1,1,13,2) + Font = Font["+1"] + Expand = True + } + } + { ReportHBox9 ReportHBox + #MoveScaled(1,8,15,4) + Width = "51mm" + Height = "6mm" + { ReportLabel14 ReportLabel + #MoveScaled(1,1,13,2) + Expand = True + } + } + } + { ReportImage2 ReportImage + #MoveScaled(31,1,17,15) + Padding = ReportPadding["Top:5mm;Bottom:5mm;Left:5mm;Right:5mm"] + Expand = True + Alignment = Align.Center + } + } + { ReportVBox4 ReportVBox + #MoveScaled(1,20,62,14) + AutoResize = True + { ReportLabel19 ReportLabel + #MoveScaled(2,0,16,4) + Fixed = True + Font = Font["+1"] + Padding = ReportPadding["Top:3mm"] + AutoResize = True + Text = ("Bearing Pressue") + } + { ReportHBox4 ReportHBox + #MoveScaled(1,3,60,4) + Height = "6mm" + Fixed = True + { ReportLabel20 ReportLabel + #MoveScaled(1,1,13,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Text = ("Node #") + Alignment = Align.Center + } + { ReportLabel21 ReportLabel + #MoveScaled(14,1,14,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Text = ("Brg. Press., psi") + Alignment = Align.Center + } + { ReportLabel22 ReportLabel + #MoveScaled(28,1,4,2) + Width = "5mm" + } + { ReportLabel23 ReportLabel + #MoveScaled(32,1,12,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Text = ("Node #") + Alignment = Align.Center + } + { ReportLabel24 ReportLabel + #MoveScaled(44,1,15,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Text = ("Brg. Press., psi") + Alignment = Align.Center + } + } + { ReportHBox5 ReportHBox + #MoveScaled(1,8,60,4) + Height = "6mm" + { ReportLabel25 ReportLabel + #MoveScaled(1,1,13,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Alignment = Align.Center + } + { ReportLabel26 ReportLabel + #MoveScaled(14,1,14,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Alignment = Align.Center + } + { ReportLabel27 ReportLabel + #MoveScaled(28,1,4,2) + Width = "5mm" + } + { ReportLabel29 ReportLabel + #MoveScaled(32,1,12,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Alignment = Align.Center + } + { ReportLabel30 ReportLabel + #MoveScaled(44,1,15,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Alignment = Align.Center + } + } + } + { ReportVBox6 ReportVBox + #MoveScaled(1,36,62,14) + AutoResize = True + { ReportLabel31 ReportLabel + #MoveScaled(2,0,19,4) + Fixed = True + Font = Font["+1"] + Padding = ReportPadding["Top:3mm"] + AutoResize = True + Text = ("Anchor Rod Tension") + } + { ReportHBox6 ReportHBox + #MoveScaled(1,3,60,4) + Height = "6mm" + Fixed = True + { ReportLabel44 ReportLabel + #MoveScaled(1,1,13,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Text = ("Rod #") + Alignment = Align.Center + } + { ReportLabel45 ReportLabel + #MoveScaled(14,1,14,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Text = ("Tension, lbs") + Alignment = Align.Center + } + { ReportLabel46 ReportLabel + #MoveScaled(28,1,4,2) + Width = "5mm" + } + { ReportLabel47 ReportLabel + #MoveScaled(32,1,12,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Text = ("Rod #") + Alignment = Align.Center + } + { ReportLabel48 ReportLabel + #MoveScaled(44,1,15,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Text = ("Tension, lbs") + Alignment = Align.Center + } + } + { ReportHBox7 ReportHBox + #MoveScaled(1,8,60,4) + Height = "6mm" + { ReportLabel49 ReportLabel + #MoveScaled(1,1,13,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Alignment = Align.Center + } + { ReportLabel50 ReportLabel + #MoveScaled(14,1,14,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Alignment = Align.Center + } + { ReportLabel51 ReportLabel + #MoveScaled(28,1,4,2) + Width = "5mm" + } + { ReportLabel52 ReportLabel + #MoveScaled(32,1,12,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Alignment = Align.Center + } + { ReportLabel53 ReportLabel + #MoveScaled(44,1,15,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Alignment = Align.Center + } + } + } + } + { ReportPanel2 ReportPanel + #MoveScaled(2,77,69,1) + Fixed = True + Expand = True + } + { ReportHBox10 ReportHBox + #MoveScaled(2,79,62,4) + Height = "1cm" + Fixed = True + AutoResize = True + { ReportLabel8 ReportLabel + #MoveScaled(22,1,21,2) + Expand = True + AutoResize = True + Text = ("Page $PAGE of $NPAGE") + Alignment = Align.Bottom + UseField = True + } + } + Index = 0 +} diff --git a/comp/src/gb.report/.src/Tests/Paints.class b/comp/src/gb.report/.src/Tests/Paints.class new file mode 100644 index 00000000..01960f38 --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Paints.class @@ -0,0 +1,33 @@ +' Gambas class file + +'Export +' +' Static Public Sub Begin(Device As Object) +' +' Debug +' Super.Begin(Device) +' +' End +' +' Static Public Sub End(Device As Object) +' +' Debug +' Super.End(Device) +' +' End +' +' ' +' Static Public Sub Rectangle(X As Float, Y As Float, W As Float, H As Float) +' +' Debug CStr(X); ", "; CStr(Y); ", "; CStr(W); ", "; CStr(H) +' Super.Rectangle(X, Y, W, H) +' +' End +' +' +' Static Public Sub Text(Text As String, Optional X As Float, Y As Float, Width As Float, Height As Float, Alignment As Integer) +' +' 'Debug Paint.Font.Size +' Super.Text(Text, X, Y, Width, Height, Alignment) +' +' End diff --git a/comp/src/gb.report/.src/Tests/Report11.class b/comp/src/gb.report/.src/Tests/Report11.class new file mode 100644 index 00000000..ddd552fa --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Report11.class @@ -0,0 +1,29 @@ +' Gambas class file + +' 'Private hMap As New Map +' 'Private hImgCache As Image + Public Sub _new() + ReportDrawingArea1.BoxShadow.XOffset = "1mm" + ReportDrawingArea1.BoxShadow.YOffset = "1mm" + ReportDrawingArea1.BoxShadow.Color = Color.Gray + ReportDrawingArea1.BoxShadow.Blur = "1mm" +' ' +' ' hMap.AddTile("gg", "https://khms{s}.google.fr/kh/v={version}&src=app&x={x}&y={y}&z={z}&s=Galile", ["version": "145"]).SubDomains = ["0", "1", "2"] +' ' +' ' hmap.Zoom = 17 +' ' 'ReportPanel1.DataCount = 200 + End +' ' +' ' + Public Sub ReportDrawingArea1_Draw(width As Integer, Height As Integer, Index As Integer) +' ' +Draw.FillRect(0, 0, width, height, Color.White) +' ' 'Print width, Height +' ' 'hMap.Resize(Width, Height) +' ' 'If Paint.Device Is Printer Then Stop +' ' hMap.Center = MapPoint(Geo.SexToDec("45°31'33,33''N"), Geo.SexToDec("0°18'43,50''W")) +' ' 'hMap.Center = MapPoint(Geo.SexToDec(Str(CInt(Rnd(30, 45))) & "°31'33,33''N"), Geo.SexToDec("0°18'43,50''W")) +' ' 'If Not hImgCache Then +' ' hImgCache = hMap.Grab(hMap.Bounds, width / ReportUnits.DesktopScale, Height / ReportUnits.DesktopScale, 0, 18) +' ' Draw.Image(hImgCache, 0, 0, width, Height) +End diff --git a/comp/src/gb.report/.src/Tests/Report11.report b/comp/src/gb.report/.src/Tests/Report11.report new file mode 100644 index 00000000..5b63930c --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Report11.report @@ -0,0 +1,29 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,64,64) + Padding = ReportPadding["Top:3cm;Bottom:3cm;Left:3cm;Right:3cm"] + Spacing = "2cm" + Index = 0 + Text = ("") + { ReportLabel1 ReportLabel + #MoveScaled(7,1,54,8) + Font = Font["Bold,+12"] + AutoResize = True + Text = ("C'est la maison !") + Alignment = Align.Center + } + { ReportPanel1 ReportPanel + #MoveScaled(6,12,53,31) + Padding = ReportPadding["Top:1cm;Bottom:1cm;Left:1cm;Right:1cm"] + AutoResize = True + { ReportDrawingArea1 ReportDrawingArea + #MoveScaled(5,6,52,30) + Width = "7mm" + Height = "6cm" + Border = ReportBorder["Top:2mm #000000;Bottom:2mm #000000;Left:2mm #000000;Right:2mm #000000;TopLeftCorner:1mm;TopRightCorner:1mm;BottomRightCorner:1mm;BottomLeftCorner:1mm"] + Cached = True + } + } + Index = 0 +} diff --git a/comp/src/gb.report/.src/Tests/Report41.class b/comp/src/gb.report/.src/Tests/Report41.class new file mode 100644 index 00000000..f19d0fdd --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Report41.class @@ -0,0 +1,36 @@ +' Gambas class file + +Private hResult As Result +Private hResult2 As Result + + +Public Sub Report_Open() + Connections["MainConn"].Open + hResult = db.Exec("select * from parc_ilots") + ReportHBox1.DataCount = 3 'hResult.Count + Report.Debug = True +End + +Public Sub ReportLabel1_Data(Index As Integer) + + hResult.MoveTo(Index) + Last.Data = hResult!nom + +End + +Public Sub ReportHBox1_BeforeData() + hResult.MoveTo(ReportHBox1.DataIndex) + Print "Section : " & hResult!id & "/" & ReportHBox1.DataIndex + + hResult2 = db.Exec("select * from liaisonilotparc where id_ilot=&1", hResult!id) + ReportHBox2.DataCount = hResult2.Count + Print "DataCount : " & hResult2.Count +End + +Public Sub ReportLabel2_Data(Index As Integer) + + hResult2.MoveTo(Index) + Print " " & ReportHBox1.DataIndex & "/" & Index + Try Last.Data = hResult2!id_parc + 'If Error Then Stop +End diff --git a/comp/src/gb.report/.src/Tests/Report41.report b/comp/src/gb.report/.src/Tests/Report41.report new file mode 100644 index 00000000..f09d6cdd --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Report41.report @@ -0,0 +1,34 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,109,64) + Padding = ReportPadding["Top:2cm;Bottom:2cm;Left:2cm;Right:2cm"] + Spacing = "1cm" + Index = 0 + Text = ("") + { ReportVBox1 ReportVBox + #MoveScaled(4,5,101,53) + Spacing = "1cm" + { ReportHBox1 ReportHBox + #MoveScaled(3,4,94,35) + { ReportLabel1 ReportLabel + #MoveScaled(0,0,6,32) + Border = ReportBorder["Top:0.1mm #000000;Bottom:0.1mm #000000;Left:0.1mm #000000;Right:0.1mm #000000"] + Rotate = 90 + } + { ReportVBox2 ReportVBox + #MoveScaled(13,1,79,32) + Expand = True + { ReportHBox2 ReportHBox + #MoveScaled(1,1,77,4) + Tag = "*" + { ReportLabel2 ReportLabel + #MoveScaled(2,0,46,4) + Expand = True + } + } + } + } + } + Index = 0 +} diff --git a/comp/src/gb.report/.src/Tests/Report51.class b/comp/src/gb.report/.src/Tests/Report51.class new file mode 100644 index 00000000..a2dec1db --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Report51.class @@ -0,0 +1,69 @@ +' Gambas class file + +Private hResult As Result +Private hResult2 As Result + Private hVBox As ReportVBox + +Public Sub Report_Open() + hVBox = New ReportVBox(ReportHBox1) + hVBox.Spacing = "1cm" + Connections["MainConn"].Open + hResult = db.Exec("select * from parc_ilots") + 'Report.Debug = True + 'ReportHBox1.BackGround = ReportBrush.Color(Color.Yellow) + 'hVBox.BackGround = ReportBrush.Color(Color.red) + hVBox.Width = "50%" + For Each hResult + + AddIlot(hResult!nom, hResult!id) + + Next + +End + + +Private Sub AddIlot(sIlot As String, iIlot As Integer) + Dim hHBox1 As New ReportHBox(hVBox) + Dim hLblIlot As New ReportLabel(hHBox1) + Dim hVBoxList As New ReportVBox(hHBox1) + Dim hHBoxLine As ReportHBox + Dim hLblParcelle As ReportLabel + Dim i As Integer + hLblIlot.Rotate = 90 + hVBoxList.Expand = True + + hVBoxList.Border.Top.Width = "0.1mm" +hVBoxList.Border.Right.Width = "0.1mm" +hHbox1.Border.Bottom.Width = "0.1mm" + hLblIlot.Padding = ReportPadding["Top:1mm;Bottom:1mm;Left:1mm;Right:1mm"] + + hLblIlot.Text = sIlot + hLblIlot.Border = ReportBorder["Top:0.1mm #000000;Left:0.1mm #000000;Right:0.1mm #000000"] + hResult2 = db.Exec("select p.nom parcelle from liaisonilotparc lip left join parcelles p on p.id=lip.id_parc where id_ilot=&1 order by lip.ordre", iIlot) + + + + For Each hResult2 + hHBoxLine = New ReportHBox(hVBoxList) + hHBoxLine.Expand = True + 'hHBoxLine.Height = "5mm" + hLblIlot = New ReportLabel(hHBoxLine) + hHBoxLine.Border = ReportBorder["Bottom:0.1mm #000000;"] + hLblIlot.Text = hResult2!parcelle + hLblIlot.Padding.Left = "1mm" + hLblIlot.Expand = True + 'hHBoxLine.Expand = True + 'hLblIlot.Border = ReportBorder["Bottom:0.1mm #00000"] + For i = 0 To 3 + hLblIlot = New ReportLabel(hHBoxLine) + hLblIlot.Width = "5mm" + hLblIlot.Border = ReportBorder["Left:0.1mm #000000;"] + + Next + Next + + + + + +End diff --git a/comp/src/gb.report/.src/Tests/Report51.report b/comp/src/gb.report/.src/Tests/Report51.report new file mode 100644 index 00000000..d8c8fed1 --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Report51.report @@ -0,0 +1,15 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,64,64) + Padding = ReportPadding["Top:2cm;Bottom:2cm;Left:2cm;Right:2cm"] + Spacing = "1cm" + Index = 0 + Text = ("") + { ReportHBox1 ReportHBox + #MoveScaled(0,2,62,57) + Height = "10cm" + Expand = True + } + Index = 0 +} diff --git a/comp/src/gb.report/.src/Tests/Report52.class b/comp/src/gb.report/.src/Tests/Report52.class new file mode 100644 index 00000000..a2dec1db --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Report52.class @@ -0,0 +1,69 @@ +' Gambas class file + +Private hResult As Result +Private hResult2 As Result + Private hVBox As ReportVBox + +Public Sub Report_Open() + hVBox = New ReportVBox(ReportHBox1) + hVBox.Spacing = "1cm" + Connections["MainConn"].Open + hResult = db.Exec("select * from parc_ilots") + 'Report.Debug = True + 'ReportHBox1.BackGround = ReportBrush.Color(Color.Yellow) + 'hVBox.BackGround = ReportBrush.Color(Color.red) + hVBox.Width = "50%" + For Each hResult + + AddIlot(hResult!nom, hResult!id) + + Next + +End + + +Private Sub AddIlot(sIlot As String, iIlot As Integer) + Dim hHBox1 As New ReportHBox(hVBox) + Dim hLblIlot As New ReportLabel(hHBox1) + Dim hVBoxList As New ReportVBox(hHBox1) + Dim hHBoxLine As ReportHBox + Dim hLblParcelle As ReportLabel + Dim i As Integer + hLblIlot.Rotate = 90 + hVBoxList.Expand = True + + hVBoxList.Border.Top.Width = "0.1mm" +hVBoxList.Border.Right.Width = "0.1mm" +hHbox1.Border.Bottom.Width = "0.1mm" + hLblIlot.Padding = ReportPadding["Top:1mm;Bottom:1mm;Left:1mm;Right:1mm"] + + hLblIlot.Text = sIlot + hLblIlot.Border = ReportBorder["Top:0.1mm #000000;Left:0.1mm #000000;Right:0.1mm #000000"] + hResult2 = db.Exec("select p.nom parcelle from liaisonilotparc lip left join parcelles p on p.id=lip.id_parc where id_ilot=&1 order by lip.ordre", iIlot) + + + + For Each hResult2 + hHBoxLine = New ReportHBox(hVBoxList) + hHBoxLine.Expand = True + 'hHBoxLine.Height = "5mm" + hLblIlot = New ReportLabel(hHBoxLine) + hHBoxLine.Border = ReportBorder["Bottom:0.1mm #000000;"] + hLblIlot.Text = hResult2!parcelle + hLblIlot.Padding.Left = "1mm" + hLblIlot.Expand = True + 'hHBoxLine.Expand = True + 'hLblIlot.Border = ReportBorder["Bottom:0.1mm #00000"] + For i = 0 To 3 + hLblIlot = New ReportLabel(hHBoxLine) + hLblIlot.Width = "5mm" + hLblIlot.Border = ReportBorder["Left:0.1mm #000000;"] + + Next + Next + + + + + +End diff --git a/comp/src/gb.report/.src/Tests/Report52.report b/comp/src/gb.report/.src/Tests/Report52.report new file mode 100644 index 00000000..d8c8fed1 --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Report52.report @@ -0,0 +1,15 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,64,64) + Padding = ReportPadding["Top:2cm;Bottom:2cm;Left:2cm;Right:2cm"] + Spacing = "1cm" + Index = 0 + Text = ("") + { ReportHBox1 ReportHBox + #MoveScaled(0,2,62,57) + Height = "10cm" + Expand = True + } + Index = 0 +} diff --git a/comp/src/gb.report/.src/Tests/Report9.class b/comp/src/gb.report/.src/Tests/Report9.class new file mode 100644 index 00000000..083224ac --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Report9.class @@ -0,0 +1,17 @@ +' Gambas class file + +Public Sub _new() + 'Report.Debug = True + ' Me.Width = "5cm" + ' Me.Height = "10cm" + ReportPanel1.DataCount = 100 +End + +Public Sub Report_Open() + +ReportPanel1.BoxShadow.XOffset = "1mm" +ReportPanel1.BoxShadow.YOffset = "1mm" + 'ReportPanel1.BoxShadow.Spread = "2mm" + ReportPanel1.BoxShadow.Blur = "4mm" + Me.Clear +End diff --git a/comp/src/gb.report/.src/Tests/Report9.report b/comp/src/gb.report/.src/Tests/Report9.report new file mode 100644 index 00000000..c797b67d --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Report9.report @@ -0,0 +1,22 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,64,64) + Padding = ReportPadding["Top:2cm;Bottom:2cm;Left:2cm;Right:2cm"] + Index = 0 + Text = ("") + { ReportVPanel1 ReportVPanel + #MoveScaled(4,1,58,51) + Padding = ReportPadding["Top:5mm;Bottom:5mm;Left:5mm;Right:5mm"] + Expand = True + Spacing = "1cm" + { ReportPanel1 ReportPanel + #MoveScaled(12,6,15,16) + Width = "6cm" + Height = "6cm" + Background = ReportBrush["#FFFFFF"] + OnePiece = True + } + } + Index = 0 +} diff --git a/comp/src/gb.report/.src/Tests/Test.module b/comp/src/gb.report/.src/Tests/Test.module new file mode 100644 index 00000000..593c3ae9 --- /dev/null +++ b/comp/src/gb.report/.src/Tests/Test.module @@ -0,0 +1,9 @@ +' Gambas module file + + Public Sub Main() +' + Dim hreport As New Report9 + Dim hprinter As New Printer + hprinter.OutputFile = User.Home &/ "sortie.pdf" + hreport.Print(hprinter) + End diff --git a/comp/src/gb.report/.src/Tests/rpTestShadowGrid.class b/comp/src/gb.report/.src/Tests/rpTestShadowGrid.class new file mode 100644 index 00000000..f3a08abe --- /dev/null +++ b/comp/src/gb.report/.src/Tests/rpTestShadowGrid.class @@ -0,0 +1,23 @@ +' Gambas class file + +Public Sub ReportDrawingArea1_Draw() + + Paint.MoveTo(0, 0) + Paint.LineTo(Paint.Width, Paint.Height) + Paint.Stroke + +End + +Public Sub Report_Open() + + ReportGridView1.Columns.Count = 3 + ReportGridView1.Rows.Count = 20 + + 'Report.Debug = True +End + +Public Sub rpTestShadow_Open() + + + +End diff --git a/comp/src/gb.report/.src/Tests/rpTestShadowGrid.report b/comp/src/gb.report/.src/Tests/rpTestShadowGrid.report new file mode 100644 index 00000000..502101d7 --- /dev/null +++ b/comp/src/gb.report/.src/Tests/rpTestShadowGrid.report @@ -0,0 +1,25 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,64,64) + Font = Font["+9"] + Padding = ReportPadding["Top:6cm;Bottom:6cm;Left:6cm;Right:6cm"] + Spacing = "1cm" + Index = 0 + Text = ("") + { ReportLabel1 ReportLabel + #MoveScaled(3,2,58,9) + Height = "7cm" + Font = Font["Georgia,+12"] + AutoResize = True + Border = ReportBorder["Top:1mm #000000;Bottom:1mm #000000;Left:1mm #000000;Right:1mm #000000"] + Text = ("coucou") + Rotate = -1 + } + { ReportGridView1 ReportGridView + #MoveScaled(5,18,52,30) + Height = "5cm" + Border = ReportBorder["Top:0.1mm #000000;Bottom:0.1mm #000000;Left:0.1mm #000000;Right:0.1mm #000000"] + } + Index = 0 +} diff --git a/comp/src/gb.report/ChangeLog b/comp/src/gb.report/ChangeLog new file mode 100644 index 00000000..d2decfd1 --- /dev/null +++ b/comp/src/gb.report/ChangeLog @@ -0,0 +1,6 @@ +[GB.REPORT] +* NEW: Negative numbers are allowed on string size properties. It allow to use + negative value on XOffset or YOffset for shadows. + +* BUG: Resolve the bug on clear (Even if i don't remember for what i've done this property) + diff --git a/comp/src/gb.report/gambas.svg b/comp/src/gb.report/gambas.svg new file mode 100644 index 00000000..5bfafe4d --- /dev/null +++ b/comp/src/gb.report/gambas.svg @@ -0,0 +1,540 @@ + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Gambas 3 + 15/09/2008 + + + Fabien Bodard + + + + + Common Creative + + + + + Fabien Bodard + + + gbFBodard150908 + http://gambas.sf.net + + + gambas3 logo basic shrimp + + + A pretty shrimp, a malicious new gambas logo... we got the power ! + + + Fabien Bodard + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/comp/src/gb.report/img/16/red-arrow-h.png b/comp/src/gb.report/img/16/red-arrow-h.png new file mode 100644 index 0000000000000000000000000000000000000000..9ad41c2e596c8b409b5160f89452256327e10a0a GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^93afZ3?z3ZhDiV^&H$ef*Z)9JU;m$hA?NbP6+l78 zk|4ie28U-i(tsQ(PZ!4!j_b(+i3t-@5+)QSOqj*s#;353gPB3bkttbHsl@}Riow&> K&t;ucLK6VBDIaYB literal 0 HcmV?d00001 diff --git a/comp/src/gb.report/img/16/red-arrow-v.png b/comp/src/gb.report/img/16/red-arrow-v.png new file mode 100644 index 0000000000000000000000000000000000000000..a787fe89c60ce899a23198ffa582b5bc1540384d GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^93afZ3?z3ZhDiV^&H$ef*Z)9JU;m$hA?NbP6+l78 zk|4ie28U-i(tsRUPZ!4!j_b(@2?-p$sVAaNDr{|O%w=L;%*+flz<{4Q_>%I`W}rd_ MPgg&ebxsLQ04Dk&EdT%j literal 0 HcmV?d00001 diff --git a/comp/src/gb.report/img/22/FullWidth.png b/comp/src/gb.report/img/22/FullWidth.png new file mode 100644 index 0000000000000000000000000000000000000000..7882c75930df17079b07d001e364a110e5365cb6 GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H0wnYHF4+L2f;?RuLp07`y?Bs|L4kw$g6^;X z@!PyzZY;40mHVo=t-(dGLG_KI*@BdFKjhc%jA$usSynLT+l-Lw9oveJz3C~^{wwJc nk{lEgeEII>IaQx_uYbs zFl1V%NP3T!Twqt^hg1L5T@7_ICrx-;9Oc@wv|K?C>pBwQW PXbyv?tDnm{r-UW|Mdc*X literal 0 HcmV?d00001 diff --git a/comp/src/gb.report/img/22/RealSize.png b/comp/src/gb.report/img/22/RealSize.png new file mode 100644 index 0000000000000000000000000000000000000000..f93d1289b4a9f944672e452e305930159a57637c GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H0wnYHF4+L2CVRR#hG?8mPEcSpFfuUsqwc6X zvFpFFfx*N_JhwE{8ZYJWY~l&xsh8+eKA9+-{NwzA0|LhjraTlrTq@EWaP*(DPgsh@ zkq=#t%&vxJh7}h|7tQR^YBPTEFPXo3lM}P3L6G7c&m!Y9l5#v%JZU_Kcv5-pOR7B< y1e;{g{?J}zUz>D`);D?6IUk!3PImDO;$eteYM}V|B)=EXc?_PeelF{r5}E*|>qzAQ literal 0 HcmV?d00001 diff --git a/comp/src/gb.report/img/22/TwoPage.png b/comp/src/gb.report/img/22/TwoPage.png new file mode 100644 index 0000000000000000000000000000000000000000..306e7cee92a4e4f56325c4578c0a91fc034eba0e GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H0wnYHF4+L296VhdLp07OCnzu)82ve}b*dp$ zhWkgq%OVD~pgD%CDqJ+v9Fv57(seX!-2TimnEO$FRV&BQiYZCYMBG$zOIR2_SaK=7 TmCRcUG>gI0)z4*}Q$iB}hN~o7 literal 0 HcmV?d00001 diff --git a/comp/src/gb.report/img/32/Collatecopie.png b/comp/src/gb.report/img/32/Collatecopie.png new file mode 100644 index 0000000000000000000000000000000000000000..3c0a284961fe7362bd9bc98c0020bdb460f4f017 GIT binary patch literal 449 zcmV;y0Y3hTP)2wR%gW*5 z;m*v<k@N&FAOl=;!C_>gww0>FMd{?Ca~&(9iAc>+I|5>gnjt%*^fV?BCwq zy1BU0(b3M$&BMRG?(OW*&(Gf7-N(km?(Oa7=H z>F3-1oB03$010$bPE!E*#1F|8st?Je;|_TM006~FL_t(I%e|4=4uU`oMeBkJjE-0x z#SPr|1=RolHB)d52~GOOdF{=4=mFRDd|#<-`RMX?UVk;SkM#IZ%O z4#bH?u@0@na5~G-V|#e~wn0`V09%$`4Y0kn)3+AEf*s rgwz3>g?<5?Ck68?CkCA?CtIC?(OaF?(OgH?eFjI@bB*P^6{yq zq~YM<@9*!aq@v>D;_&b9>+9>|vw6n6|;NR5K)62@r%gf5v*xI9_pv}j|@bK`#z`(JvugS>A!NI`C#>d&% z*xcLOpr4-2$HmUc$ETv8>gnj*+uFdszw`3)-rU@to}BOP?aj-~#KXgzoSDwY#ipX5 z!ok7T*4EwJ+?<@6rlFwL)z!eizuVi|ot&G~)6>z^)}Nl8&Bn#2p`h~c@bvTY>FMjz z)z_n;pSrZNrl6m#r=`rs#BKCF>;M1&0d!JMQvg8b*k%9#0We8KK~y-)jnipUfC*1|J}gbU@9e(o`@c+T7l9ti-wdyw|L!n5^Ds;Ud`%vFB=ECb zfDeX3LbE8gNRlMWa@Z8{lOW2qg4&`ahy~&xB}Rkx4iK^ez7xdKKuvUkSd|8X2GVJe z6uLo?BneXK9#C(J2AMvPP6F(G1OA?4?;9{S=YRV@s1>ThgR(0A`3WQJ5g3@fWPcEp zr7vj=BtV0P6$qdqdc&~tdzjPm`H@lj)JocJYM002ovPDHLkV1nd{ BwRHdh literal 0 HcmV?d00001 diff --git a/comp/src/gb.report/img/32/grayscale.png b/comp/src/gb.report/img/32/grayscale.png new file mode 100644 index 0000000000000000000000000000000000000000..670e944d6aeb111916160f2bdf358937d265d71c GIT binary patch literal 1564 zcmV+%2IKjOP)gwz3>g?<5?Ck68?CkCA?CtIC?(OaF?(OgH?eFjI@bB*P^6{yq zq~YM<;^N}tlq(=H=(+<>%+-=;!C?=;-O_=;`U{>gnm~>gn(A@2RAs zgn+B@9XR9cq)=I7_<;NRc5xwzoq;Ogq?@$m22+1RqNvAnyx$j8U6 ztgOk&$+0p?K?W&CR>Ix#HpB!ok4M&(8Al@$T*HxVN{O zn3(0`K_n-QDQt=GfQQ?CR>&)6=G-q0P$2hKBL+ z@bmKW^z-xM;^NlU)%ErC>ged0mX?EpfrNvDtgEWy;o)P4ay1BW>#>MjS@R^yI zg@l8KgoNVY;G?3U^YQV#ySm-o+|SOFMjz)z_n;pSrZNrl6m#r=`rs#6oTBNB{r;0d!JMQvg8b*k%9#0@+DKK~y-)V_+Zx zFf!o)j8Fy4EUawo9Gsk7+&nzIe0+TT{QLqSAjk|=AjB#xA}S^>At@y-BO@y-Coiv{ z2m(q%PzB0tBBJ6dl9C{4Igq3(8yKi5!xX4%h-*q}X=%&K>FDa}>9eYU&gJ1@v4$z&0?E6% zJ2-fFdTDZb`{?@efq)-Ofj^h6bUaL6nuWU35%L ztfyC8d_rQ9rJ`DLN=mAML0S|{LAs1=MogwlR(4KqUR-j1N`XvDN}+*)A51}!m7SbK zv9o7hLJ2Sw)$;QB)TF}s3=9N|pbAP^*viTic`GV|tJ120Kp|0~rnXM8roI$r0#8F@ zQ*%jpORIpIni>mBTRWGkPe*4L+yrYiw(g$ZzVQCOuCA^L6DDv4bFmvwG^we9hl3jX zr1Hdw$y26+q^ql?rb*Q#Pgkv(0aGwjfZbAN)@%dzq&a?m)zva{=gqe$n>S;|jF~VK z7I365T(r1dYDrQ+9Q)E`#>=GwSF8jofSa(&a`l?EYuC+NzkI{SO`BJ3*}AQzW&8a3 zH8bG~xOjH#+|06Tx1dX$<+d7`ZGL<9*7EV~gPE{jjf*EjjV0qiO$J-dhx!kWdnDgK^JYN76M1T~40%`vI3CnFB zJ~Ei|_z5E8JT>6i0#r~13Z?n;t5{v0J%8~Mp`U@_6<7fa3q%1+-0L@Q-yzF`6$pS8 z2nx>MY7qAR!^cl3dGm8M%RG>7kpB7e{l0wthL(B1|3C#le-V@AVE_QtsRkb4V6q1Q O0000fzww@9*!fs;R=gys4z3>+9;`;^Oe{@9^*L^YZbkrljlZ>*M3&@$m2L>+9s? zvw6n6|;NR5K)62@r%gf5v*xI9_pv}j|@bK`#z`(JvugS>A!NI`C#>d&% z*xcLOpr4-2$HmUc$ETv8>gnj*+uFdszw`3)-rU@to}BOP?aj-~#KXgzoSDwY#ipX5 z!ok7T*4EwJ+?<@6rlFwL)z!eizuVi|ot&HL=;zbZ)6vw{pPrq~#>JFd(f*Q24Iy0o&Upr5U$rOd{}5gA^>00001bW%=J06^y0W&i*Il1W5CR5;6Z(^pf2 zKoo}I6E%W}N@Njpk4$I3fxT zOskh$!bC)+13Q^ag-Rw36A_gFI956x9;95^LBzm8Mis;1BAY=(j-!yvbHas_mYsx& zuPKQl*C1jxW3WMt7Y_2WBRc?I>pufe^hq{@LSF$(xrMs$8AvQ3Oz77%4PQ&E4bOcq z7I;3P16}8Q2YrAP0utb0P~r`ShK7rp?*$%yYRR%(yoFV5WOQtNVsdJFW_At{Dwy-O z?Yb$~t|l!kE-kODuC13g5b;siRP5T6t?iw%QrRsrWPpSQd)@m7O6BmViVPP4j+I<( z4cjNDXXhn`Py^tiez0|Ub$wG}2s1*1+q?URM}|;?{ufVW_1Q4!^@16%Z|_xv8uT1K yKI{AXW(YOlw=lwtzjF>k4X7<_Kz(83_v8o7|B&yS(h6z-0000|_zC&mB( literal 0 HcmV?d00001 diff --git a/comp/src/gb.report/img/control/label.png b/comp/src/gb.report/img/control/label.png new file mode 100644 index 0000000000000000000000000000000000000000..7c73e49ff4bcec6c259224ba4ec6ff89e9334bce GIT binary patch literal 466 zcmV;@0WJQCP)kdg0004*NklbO=!sJ`Fy-_?LYs(;F zv-|z&tegtobNcGv%xwNs1${L*U^*-LU_tD#H@aUfEujjGF%iA#vJy^c5x@D}iiq8o zl<-Epr^urinzt0e9r2wavoZ9f48a$%-Cu|t(-|U(1RFp>9-dKoBy+Y-k)WX;=Gi{4WH50LgV@+X?A6xc~qF07*qo IM6N<$f?43scmMzZ literal 0 HcmV?d00001 diff --git a/comp/src/gb.report/img/control/picturebox.png b/comp/src/gb.report/img/control/picturebox.png new file mode 100644 index 0000000000000000000000000000000000000000..a25a9f4e302f5e8d2abcf6f1d3264f06d8f9c40a GIT binary patch literal 2381 zcmV-T39|NyP) zX>e8L8OML`S?<1Mzgccb2q7$ifNX*h5T&3fTSZ(^sBJ|pR;RT(>P#()%UD-Ns$&a+ zD9U04WKmEe2qI!sAYn@aArQ#Uy~(|~+c|GPARyItYCHYVY5$+jGv|4q`JMm!Jnwtp ze_i6AP0a86upWzJwb|0UYWLo2{Ko+@a!0D+P~a*FHwdAXf|lF+iigyLNuXq;)rpU>_$qpzab0EtjkRLy~AaiUqA=vEiHJ(vB@eXKO)2}g0dn$3h}M>)^AO^}>>ec|J-3KZr-`nGks^suG!-EfRNaAQbz!l2 zvDlNT+Poe`AGX9|@!!!{T^jk90j!R+m-73Kn3LCc7%5r#sH%>X28ycF)fu3^x*j3o z1cG)XHZ+?Xi_MGGnSs@j%AO6o7Pr^mG4s1M?|bW{rRikIIdo`x=-yG@*!KW#ynZ$U z!K$^(XKK2-Xv&)%I`m98j)Wrs-CW>&JzfwUbiI0b(<@ssFr|kcUFH^Hm3?e6b+t8^RWY3!iXH1 zde8HIMNu(L6QL*wArL}2Ln_XgWf%#X8yZm*gH&G@LQ$|-Y-pN7vfD*|kIYERvHGaf zVOz1{y+e<0TQ;NaZ@+rT_<3nIcXFoP<36gX-ee3ZFPr?U=lnuZ=?r#KU3HX#UfI|j z4ouU;YO|xL+8GEb@%gjQ6_e5=($#@OM38O=9fs4^77r)p{e03jE>CiF_~iK;z3I7| zKlt;MbG@e6k5?gfR?3WyKMkE*-nm zi4Y(Z6(JP9H3TUQ!ofDSuUpK%ogZMaB~f(I2up@P)wN^&Du4a{b+fYy#`NiP$&8Mg zij|485W|LC$%(41amDL)A|;cmzOJG2i?8VjhVXbTcvCzyH-<4ylVE#0rjfuf66dz! zYzs>%sjJ*U?Vhb1sr-!1OCP5*5a;sg_mYzBZwB~uYY0qPgNNW!in1-Lq+X{Kq;1#X`(>;CiJBfs+~&qo5h$!TmV zm*1pM95K0khEn&`6Z2X6_8Q_24}yS_rn^CN?uxZ~s)Mq(!LQ;-8E%(`E>ush@hkr0AS%in9adip$+IezxS zZ4WzR0HScvbiE^RGI+%eciKK&JnvTD#W%g7_v?l143VfkhGkHH%utA?s-1*ttI&sB zgi&3KG!2BVqeNmjJEF;ncxZ^jo|b;a^{ zX5pxvs;XV4DC$>gB90m8K(X7fjU5T9ijtN>N@EkYhE9}y0i-jN_V&Zb+)VTX4TMvy z?W#R}vuU+#=HddRreM|`C&NDgSMfmNt<8w{-(c|5FR*Y_-UZHlYnxaN;7ToN_SGLl z358Je{GgtJPn>SYHgpj7yzZEJDFkFIGS!Py^^oz4yAXWLy3NGajRU*{cXm zCD9SY;>*I5Q-HH~3D(RUVh!~uQb9{e#q3I8A2SlWY2yB-l0Y;-%la}r!%DICAIjbp zuQ74$Vb)IUc@97Y=xD78+dV!%cujqDpMB#CdvI#omqhkdA&#HK5;D-b4BXv|Nf|x{ z=fELoZVw1S2wBzOq+NG6_aOBKBn+Iz{J^aiKCU3dvBXP zt$6jjn>lv0j$FT+qM{r;N$G5O_w9ZMzbvZ+`1Sn799+JJXvjk#GaGqP2}-sPRF%Z% z73A*QODGZ}>~_-`Gf2XqTap8JzQ)E4Tj5{b| zCC!Id#!^y~Z#i*f&kFv5Mn3a8iD-b+P4%SuN(e?<*)#XP3vvcMy$C(KJFe_*d~`*@ z4;LCR`qAs>zFNL+==8Ev112qzj-*~6^CL9vxn8 zdqd>+zI3?PH>Q`zH)*3gefT9m2H^ktuhU-vP5hv;;=4p&00000NkvXXu0mjfecGPf literal 0 HcmV?d00001 diff --git a/comp/src/gb.report/img/control/vbox.png b/comp/src/gb.report/img/control/vbox.png new file mode 100644 index 0000000000000000000000000000000000000000..07004bb15185d11b45ea7631afd59b025b5d220b GIT binary patch literal 250 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvp#Yx{S0MfW|NjFA4m310fY=NS zB|fH8fGn1hAirQB&9HfL+AJV7+0(@_MC1I@iH>}S6?j;Dm)zUT{w_h2{{{c2*059m z_g^wqIT)}+ZkNn~(-|8#ylH;oZEZD?B!eZmjZzx<~rnEmg45%mS+Oix!omvv4FO#p&DT9p6* literal 0 HcmV?d00001 diff --git a/comp/src/gb.report/img/control/vpanel.png b/comp/src/gb.report/img/control/vpanel.png new file mode 100644 index 0000000000000000000000000000000000000000..64178f994a00f5e6077488054dcee92106a1b5bc GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4*Z=?j1DOpC4gZ0Nf#KDH zIr2b0b4ie2Fp&OLcH|zAO7(Pc4AD5BY~aSq#?#hhpunKiz{KOxFi}vYVTn_Npf4+P zz=4j&qpTbYR9sjmJY`T-WODFi)8I5^Uc%tibe6%Zi8m#&VYS1?)(s4+tR*hoJ=pM$ pk8RhEWQD`bz6{FWSOXgw7}nlVFYj8dc^haUgQu&X%Q~loCIFnAJpcdz literal 0 HcmV?d00001 diff --git a/comp/src/gb.report/img/logo.svg b/comp/src/gb.report/img/logo.svg new file mode 100644 index 00000000..31e20aa0 --- /dev/null +++ b/comp/src/gb.report/img/logo.svg @@ -0,0 +1,540 @@ + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Gambas 3 + 15/09/2008 + + + Fabien Bodard + + + + + Common Creative + + + + + Fabien Bodard + + + gbFBodard150908 + http://gambas.sf.net + + + gambas3 logo basic shrimp + + + A pretty shrimp, a malicious new gambas logo... we got the power ! + + + Fabien Bodard + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/comp/src/gb.report/printer1.png b/comp/src/gb.report/printer1.png new file mode 100644 index 0000000000000000000000000000000000000000..a6ceca7f115a77b989b77315c9d62abff9dbeaf5 GIT binary patch literal 1630 zcmV-k2BGxclxJUNPw!?gxu z3`(i35#akiTI+Sf4N7Ya{Qm{44xf9*7?cXPNw_z$=LN_^hYo#bQxQ0R{P=Ug zKBd%~FTcF^l-3%fSr=S~a}f~2igk8&eiDnte(Sn!FVJ`S^5xPK1)Ml>qFpKVy8{Of zy>{Thw?$*)Gq|qH)vJHS7>#Cq@VOL#=Xt#GMvwK@TW`Oc&1T;n9==6eTl@VRHwHd( zUH8|$y}geX1ax(zkcS-PwYs8SfA09{>2J5#AtgEYpxR$E&`B(icr zDGjwXh3%YC6Xt5qFE*I2EtJ^L!$XAag&D-847t4j=B4AAb13 z5h;XtCK`=mE$OSZ!Sl+@%uG{qU*L9r&gq44J7-AGT1yW3)gm`%CAAaBiK3LIwI)ex zO>)7PNbJD2?G~9xB_5d)m-rhu2m5bH}%d!~FZ>O&x9uzhX2Qav#MhhHkND_$%d_QDz zGRxT56zTK`mSshyl+i~3p68QF4FeF5S5Q}1&5ynn=eglDV;RLn&M;GokPmE%%BG}k z%ElprB4(ATi1<`WpKZ2Jt!qeb7c^B1UTAG(WMq=5sT^UrSR+U&QA*9oQmHTziHN<{ zl3D0^KKJfDpb|J%2i8t-T?f~V5s8$DLDppb9^2#fn%ifjCC4wM$D1pf!DB(DZ zo6Wb#|d2rs>~f5BN>o8ait*GVRuNG6k; zVPgz5H#c+h<}mg3wZ!8NvDlmdr9wtVZrz=pp1vn9Uc7kMaVq|E>eLV0<~NMpyZ2CC zT~9KZAepS$6kI8d5Ee&{bko>akCcM>>V9zW2IJ%7e* za+`#kuUCU22ts!6Zee8P9$=BpW*8j2!Ka`0{_Fbn>%RfiLUQBrxO4E}!JkSgcQrIL zwZHSuFOTitzh@J0z2s6&?F@xAvx_*E`f zFdH$gwF!dIc%E+x1<&Mi1(V6-O`+hKYuEl^y1Kf*zZz@RqV(Bk8-7+*k4UI-V|$As)w*6C_wu8r%MJ{|jC+ z_hCKrPqv;c`KxxTYD0dnC{sGXbZSd~1_Q(Su-MoV91DwxhzLJFzkq-MUteEuZ*L&!@9z&JfdI%22?>F)+uGWuOqr6Em38~}?f*c~ z*cjpDG?kTgXJ+Q_FJHo4TsDV<++Dfy`Sa&pU0to0H$4G*)wU$aFPLGm)Z|HfeSG(v zJ3nRK{0$t8PDQU*$pzjMe0u$^zrgw%Yi@fx7rtC8AM)VI)H!oEa$fxKSowwKOD*kJ zIzNppQsPzs4ch7H;uxZFJ~^R*(JgvS1EXi-TwAsRhrkCfS{UE3w==1wiK*@3inw{h z@`Kicl!OO|RyWLUpU$sxzTdmCVZnqA9U9FuEac)nJiIzRPBVyFSX(Yu>|lzttYmdn zjp1UM5*l*#ilm9j)|d^^3)e1Q&2Hp&|G?F=vir?#ZT4F_JvwT9p<^=w% z98Ip-OwLSPJv|?_4GdEctUhpN4&!*1f;M=;-Ll$;tKg_0`qY<>lqs+1cOU z-wSa8>Hq)$0d!JMQvg8b*k%9#0ES6KK~y-)t&{5xfFKBkLq)Uf`u-2w$k=R&vABA^yn%ahz-Zv@^-ut^c%HpOl7ptwrp!KR-KdVs( XSmOv)KHU<>00000NkvXXu0mjf+iQLg literal 0 HcmV?d00001 diff --git a/comp/src/gb.report2/.hidden/control/reporttextlabel.png b/comp/src/gb.report2/.hidden/control/reporttextlabel.png new file mode 120000 index 00000000..2fec7698 --- /dev/null +++ b/comp/src/gb.report2/.hidden/control/reporttextlabel.png @@ -0,0 +1 @@ +../../../../../app/src/gambas3/img/control/textlabel.png \ No newline at end of file diff --git a/comp/src/gb.report2/.hidden/control/reportvbox.png b/comp/src/gb.report2/.hidden/control/reportvbox.png new file mode 120000 index 00000000..50d7662d --- /dev/null +++ b/comp/src/gb.report2/.hidden/control/reportvbox.png @@ -0,0 +1 @@ +../../../../../app/src/gambas3/img/control/vbox.png \ No newline at end of file diff --git a/comp/src/gb.report2/.hidden/control/reportview.png b/comp/src/gb.report2/.hidden/control/reportview.png new file mode 100644 index 0000000000000000000000000000000000000000..2277da00516e1eb44ec56cdc6d418daff8e08855 GIT binary patch literal 233 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 Q>w^JcbiqWwOb;9VA5256t^fc4 literal 0 HcmV?d00001 diff --git a/comp/src/gb.report2/.lang/es.po b/comp/src/gb.report2/.lang/es.po new file mode 100644 index 00000000..b1d24335 --- /dev/null +++ b/comp/src/gb.report2/.lang/es.po @@ -0,0 +1,343 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.report2 3.8.90\n" +"PO-Revision-Date: 2015-09-20 17:58 UTC\n" +"Last-Translator: Jesus \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "ReportsEvolution" +msgstr "" + +#: FPreview.form:79 +msgid "Report preview" +msgstr "Vista previa de reporte" + +#: FPreview.form:86 +msgid "Print to file" +msgstr "" + +#: FPreview.form:115 +msgid "Printing..." +msgstr "Impresión..." + +#: FPreview.form:145 +msgid "One page" +msgstr "Una página" + +#: FPreview.form:154 +msgid "Two pages" +msgstr "Dos páginas" + +#: FPreview.form:163 +msgid "Full width" +msgstr "Ajustar ancho" + +#: FPreview.form:172 +msgid "Real size" +msgstr "Tamaño real" + +#: FPreview.form:180 +msgid "Zoom out" +msgstr "" + +#: FPreview.form:193 +msgid "100 %" +msgstr "" + +#: FPreview.form:199 +msgid "Zoom in" +msgstr "" + +#: FPreview.form:208 +msgid "Print" +msgstr "Imprimir" + +#: FPreview.form:216 +msgid "Show options" +msgstr "" + +#: FPreview.form:239 +msgid "Printer" +msgstr "Impresora" + +#: FPreview.form:264 +msgid "Recto Verso" +msgstr "" + +#: FPreview.form:271 +msgid "None" +msgstr "Ninguno" + +#: FPreview.form:271 +msgid "Short side" +msgstr "Lado corto" + +#: FPreview.form:271 +msgid "Long side" +msgstr "Lado largo" + +#: FPreview.form:275 +msgid "File" +msgstr "Archivo" + +#: FPreview.form:301 +msgid "Resolution" +msgstr "" + +#: FPreview.form:308 +msgid "75" +msgstr "" + +#: FPreview.form:308 +msgid "150" +msgstr "" + +#: FPreview.form:308 +msgid "300" +msgstr "" + +#: FPreview.form:308 +msgid "600" +msgstr "" + +#: FPreview.form:308 +msgid "1200" +msgstr "" + +#: FPreview.form:313 +msgid "dpi" +msgstr "" + +#: FPreview.form:336 +msgid "Range" +msgstr "Rango" + +#: FPreview.form:352 +msgid "Copies" +msgstr "Copias" + +#: FPreview.form:372 +msgid "Orientation" +msgstr "Orientación" + +#: FPreview.form:379 +msgid "Portrait" +msgstr "Retrato" + +#: FPreview.form:379 +msgid "Landscape" +msgstr "Paisaje" + +#: FPreview.form:389 +msgid "Paper" +msgstr "Papel" + +#: FPreview.form:396 +msgid "Custom" +msgstr "" + +#: FPreview.form:396 +msgid "A3" +msgstr "-" + +#: FPreview.form:396 +msgid "A4" +msgstr "-" + +#: FPreview.form:396 +msgid "A5" +msgstr "-" + +#: FPreview.form:396 +msgid "B5" +msgstr "-" + +#: FPreview.form:396 +msgid "Letter" +msgstr "-" + +#: FPreview.form:396 +msgid "Executive" +msgstr "-" + +#: FPreview.form:396 +msgid "Legal" +msgstr "-" + +#: FPreview.form:411 +msgid "Width" +msgstr "Ancho" + +#: FPreview.form:422 +msgid "mm" +msgstr "-" + +#: FPreview.form:432 +msgid "Height" +msgstr "Altura" + +#: FPreview.form:455 +msgid "Grayscale" +msgstr "" + +#: FPreview.form:461 +msgid "Full page" +msgstr "" + +#: FPreview.form:466 +msgid "Collate copies" +msgstr "" + +#: FPreview.form:471 +msgid "Reverse order" +msgstr "Orden inverso" + +#: FPreview.class:211 +msgid "PDF files" +msgstr "" + +#: FPreview.class:211 +msgid "Postscript files" +msgstr "" + +#: FPreview.class:226 +msgid "Cancel" +msgstr "Cancelar" + +#: FPreview.class:316 +msgid "This file already exists.\nDo you want to replace it?" +msgstr "" + +#: FPreview.class:316 +msgid "Replace" +msgstr "" + +#: FPreview.class:341 +msgid "Layout..." +msgstr "Disposición..." + +#: OutputReport2.report:77 +msgid "Version 1.0" +msgstr "-" + +#: OutputReport2.report:84 Report51.report:60 +msgid "Date" +msgstr "Fecha" + +#: OutputReport2.report:99 +msgid "Project Title:" +msgstr "" + +#: OutputReport2.report:106 +msgid "Project No.:" +msgstr "" + +#: OutputReport2.report:113 +msgid "Company:" +msgstr "" + +#: OutputReport2.report:120 +msgid "Designer:" +msgstr "" + +#: OutputReport2.report:134 +msgid "Base Plate ID:" +msgstr "" + +#: OutputReport2.report:185 +msgid "Bearing Pressue" +msgstr "" + +#: OutputReport2.report:195 +msgid "Node #" +msgstr "" + +#: OutputReport2.report:202 +msgid "Brg. Press., psi" +msgstr "" + +#: OutputReport2.report:266 +msgid "Anchor Rod Tension" +msgstr "" + +#: OutputReport2.report:276 +msgid "Rod #" +msgstr "" + +#: OutputReport2.report:283 +msgid "Tension, lbs" +msgstr "" + +#: OutputReport2.report:353 +msgid "Page $PAGE of $NPAGE" +msgstr "Página $PAGE de $NPAGE" + +#: Report.class:112 +msgid "Section " +msgstr "Sección" + +#: Report1.report:28 +msgid "toto" +msgstr "" + +#: Report11.report:19 +msgid "Section 1" +msgstr "" + +#: Report11.report:39 +msgid "Gambas" +msgstr "-" + +#: Report11.report:59 +msgid "All friends list !" +msgstr "" + +#: Report11.report:81 +msgid "Gambas Report Demo" +msgstr "" + +#: Report11.report:93 +msgid "DEMO" +msgstr "" + +#: Report11.report:106 +msgid "Page $PAGE on $NPAGE " +msgstr "" + +#: Report2.report:19 +msgid "ReportLabel1" +msgstr "" + +#: Report3.report:17 +msgid "PARCELLAIRE" +msgstr "" + +#: Report5.report:20 +msgid "Coucou" +msgstr "" + +#: Report51.report:30 +msgid "Recto" +msgstr "" + +#: Report51.report:38 +msgid "Verso" +msgstr "" + +#: Report51.report:51 +msgid "N°" +msgstr "" + +#: Report51.report:99 +msgid "Observations" +msgstr "" + +#: Report6.report:12 +msgid "Testtest

    \n\n
    " +msgstr "" + diff --git a/comp/src/gb.report2/.lang/es_ES.po b/comp/src/gb.report2/.lang/es_ES.po new file mode 100644 index 00000000..62698041 --- /dev/null +++ b/comp/src/gb.report2/.lang/es_ES.po @@ -0,0 +1,343 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.report2 3.8.90\n" +"PO-Revision-Date: 2015-09-20 17:57 UTC\n" +"Last-Translator: Jesus \n" +"Language: es_ES\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "ReportsEvolution" +msgstr "" + +#: FPreview.form:79 +msgid "Report preview" +msgstr "Vista previa de reporte" + +#: FPreview.form:86 +msgid "Print to file" +msgstr "" + +#: FPreview.form:115 +msgid "Printing..." +msgstr "Impresión..." + +#: FPreview.form:145 +msgid "One page" +msgstr "Una página" + +#: FPreview.form:154 +msgid "Two pages" +msgstr "Dos páginas" + +#: FPreview.form:163 +msgid "Full width" +msgstr "Ajustar ancho" + +#: FPreview.form:172 +msgid "Real size" +msgstr "Tamaño real" + +#: FPreview.form:180 +msgid "Zoom out" +msgstr "" + +#: FPreview.form:193 +msgid "100 %" +msgstr "" + +#: FPreview.form:199 +msgid "Zoom in" +msgstr "" + +#: FPreview.form:208 +msgid "Print" +msgstr "Imprimir" + +#: FPreview.form:216 +msgid "Show options" +msgstr "" + +#: FPreview.form:239 +msgid "Printer" +msgstr "Impresora" + +#: FPreview.form:264 +msgid "Recto Verso" +msgstr "" + +#: FPreview.form:271 +msgid "None" +msgstr "Ninguno" + +#: FPreview.form:271 +msgid "Short side" +msgstr "Lado corto" + +#: FPreview.form:271 +msgid "Long side" +msgstr "Lado largo" + +#: FPreview.form:275 +msgid "File" +msgstr "Archivo" + +#: FPreview.form:301 +msgid "Resolution" +msgstr "" + +#: FPreview.form:308 +msgid "75" +msgstr "" + +#: FPreview.form:308 +msgid "150" +msgstr "" + +#: FPreview.form:308 +msgid "300" +msgstr "" + +#: FPreview.form:308 +msgid "600" +msgstr "" + +#: FPreview.form:308 +msgid "1200" +msgstr "" + +#: FPreview.form:313 +msgid "dpi" +msgstr "" + +#: FPreview.form:336 +msgid "Range" +msgstr "Rango" + +#: FPreview.form:352 +msgid "Copies" +msgstr "Copias" + +#: FPreview.form:372 +msgid "Orientation" +msgstr "Orientación" + +#: FPreview.form:379 +msgid "Portrait" +msgstr "Retrato" + +#: FPreview.form:379 +msgid "Landscape" +msgstr "Paisaje" + +#: FPreview.form:389 +msgid "Paper" +msgstr "Papel" + +#: FPreview.form:396 +msgid "Custom" +msgstr "" + +#: FPreview.form:396 +msgid "A3" +msgstr "-" + +#: FPreview.form:396 +msgid "A4" +msgstr "-" + +#: FPreview.form:396 +msgid "A5" +msgstr "-" + +#: FPreview.form:396 +msgid "B5" +msgstr "-" + +#: FPreview.form:396 +msgid "Letter" +msgstr "-" + +#: FPreview.form:396 +msgid "Executive" +msgstr "-" + +#: FPreview.form:396 +msgid "Legal" +msgstr "-" + +#: FPreview.form:411 +msgid "Width" +msgstr "Ancho" + +#: FPreview.form:422 +msgid "mm" +msgstr "-" + +#: FPreview.form:432 +msgid "Height" +msgstr "Altura" + +#: FPreview.form:455 +msgid "Grayscale" +msgstr "" + +#: FPreview.form:461 +msgid "Full page" +msgstr "" + +#: FPreview.form:466 +msgid "Collate copies" +msgstr "" + +#: FPreview.form:471 +msgid "Reverse order" +msgstr "Orden inverso" + +#: FPreview.class:211 +msgid "PDF files" +msgstr "" + +#: FPreview.class:211 +msgid "Postscript files" +msgstr "" + +#: FPreview.class:226 +msgid "Cancel" +msgstr "Cancelar" + +#: FPreview.class:316 +msgid "This file already exists.\nDo you want to replace it?" +msgstr "" + +#: FPreview.class:316 +msgid "Replace" +msgstr "" + +#: FPreview.class:341 +msgid "Layout..." +msgstr "Disposición..." + +#: OutputReport2.report:77 +msgid "Version 1.0" +msgstr "-" + +#: OutputReport2.report:84 Report51.report:60 +msgid "Date" +msgstr "Fecha" + +#: OutputReport2.report:99 +msgid "Project Title:" +msgstr "" + +#: OutputReport2.report:106 +msgid "Project No.:" +msgstr "" + +#: OutputReport2.report:113 +msgid "Company:" +msgstr "" + +#: OutputReport2.report:120 +msgid "Designer:" +msgstr "" + +#: OutputReport2.report:134 +msgid "Base Plate ID:" +msgstr "" + +#: OutputReport2.report:185 +msgid "Bearing Pressue" +msgstr "" + +#: OutputReport2.report:195 +msgid "Node #" +msgstr "" + +#: OutputReport2.report:202 +msgid "Brg. Press., psi" +msgstr "" + +#: OutputReport2.report:266 +msgid "Anchor Rod Tension" +msgstr "" + +#: OutputReport2.report:276 +msgid "Rod #" +msgstr "" + +#: OutputReport2.report:283 +msgid "Tension, lbs" +msgstr "" + +#: OutputReport2.report:353 +msgid "Page $PAGE of $NPAGE" +msgstr "Página $PAGE de $NPAGE" + +#: Report.class:112 +msgid "Section " +msgstr "Sección" + +#: Report1.report:28 +msgid "toto" +msgstr "" + +#: Report11.report:19 +msgid "Section 1" +msgstr "" + +#: Report11.report:39 +msgid "Gambas" +msgstr "-" + +#: Report11.report:59 +msgid "All friends list !" +msgstr "" + +#: Report11.report:81 +msgid "Gambas Report Demo" +msgstr "" + +#: Report11.report:93 +msgid "DEMO" +msgstr "" + +#: Report11.report:106 +msgid "Page $PAGE on $NPAGE " +msgstr "" + +#: Report2.report:19 +msgid "ReportLabel1" +msgstr "" + +#: Report3.report:17 +msgid "PARCELLAIRE" +msgstr "" + +#: Report5.report:20 +msgid "Coucou" +msgstr "" + +#: Report51.report:30 +msgid "Recto" +msgstr "" + +#: Report51.report:38 +msgid "Verso" +msgstr "" + +#: Report51.report:51 +msgid "N°" +msgstr "" + +#: Report51.report:99 +msgid "Observations" +msgstr "" + +#: Report6.report:12 +msgid "Testtest

    \n\n
    " +msgstr "" + diff --git a/comp/src/gb.report2/.lang/fr.po b/comp/src/gb.report2/.lang/fr.po new file mode 100644 index 00000000..d8592051 --- /dev/null +++ b/comp/src/gb.report2/.lang/fr.po @@ -0,0 +1,389 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.report2 3.10.90\n" +"POT-Creation-Date: 2017-09-30 01:40 UTC\n" +"PO-Revision-Date: 2017-09-30 01:38 UTC\n" +"Last-Translator: benoit \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "ReportsEvolution" +msgstr "" + +#: FPreview.class:212 +msgid "PDF files" +msgstr "Fichiers PDF" + +#: FPreview.class:212 +msgid "Postscript files" +msgstr "Fichiers Postscript" + +#: FPreview.class:227 +msgid "Cancel" +msgstr "Annuler" + +#: FPreview.class:317 +msgid "Replace" +msgstr "Remplacer" + +#: FPreview.class:317 +msgid "" +"This file already exists.\n" +"Do you want to replace it?" +msgstr "" +"Ce fichier existe déjà.\n" +"Voules-vous le remplacer ?" + +#: FPreview.class:342 +msgid "Layout..." +msgstr "Mise en page..." + +#: FPreview.class:354 +msgid "Printing..." +msgstr "Impression en cours..." + +#: FPreview.form:79 +msgid "Report preview" +msgstr "Aperçu de l'état" + +#: FPreview.form:86 +msgid "Print to file" +msgstr "Imprimer dans un fichier" + +#: FPreview.form:115 +#, fuzzy +msgid "Printing" +msgstr "Impression en cours..." + +#: FPreview.form:145 +msgid "One page" +msgstr "Une page" + +#: FPreview.form:154 +msgid "Two pages" +msgstr "Deux pages" + +#: FPreview.form:163 +msgid "Full width" +msgstr "Pleine largeur" + +#: FPreview.form:172 +msgid "Real size" +msgstr "Taille réelle" + +#: FPreview.form:180 +msgid "Zoom out" +msgstr "Réduire" + +#: FPreview.form:193 +msgid "100 %" +msgstr "-" + +#: FPreview.form:199 +msgid "Zoom in" +msgstr "Agrandir" + +#: FPreview.form:208 +msgid "Print" +msgstr "Imprimer" + +#: FPreview.form:216 +msgid "Show options" +msgstr "Afficher les options" + +#: FPreview.form:239 +msgid "Printer" +msgstr "Imprimante" + +#: FPreview.form:264 +msgid "Two-sided" +msgstr "" + +#: FPreview.form:271 +msgid "Long side" +msgstr "Côté long" + +#: FPreview.form:271 +msgid "None" +msgstr "Aucun" + +#: FPreview.form:271 +msgid "Short side" +msgstr "Côté court" + +#: FPreview.form:275 +msgid "File" +msgstr "Fichier" + +#: FPreview.form:301 +msgid "Resolution" +msgstr "" + +#: FPreview.form:313 +msgid "dpi" +msgstr "" + +#: FPreview.form:336 +msgid "Range" +msgstr "Plage" + +#: FPreview.form:352 +msgid "Copies" +msgstr "Copies" + +#: FPreview.form:372 +msgid "Orientation" +msgstr "Orientation" + +#: FPreview.form:379 +msgid "Landscape" +msgstr "Paysage" + +#: FPreview.form:379 +msgid "Portrait" +msgstr "Portrait" + +#: FPreview.form:389 +msgid "Paper" +msgstr "-" + +#: FPreview.form:396 +msgid "A3" +msgstr "-" + +#: FPreview.form:396 +msgid "A4" +msgstr "-" + +#: FPreview.form:396 +msgid "A5" +msgstr "-" + +#: FPreview.form:396 +msgid "B5" +msgstr "-" + +#: FPreview.form:396 +msgid "Custom" +msgstr "Personnalisé" + +#: FPreview.form:396 +msgid "Executive" +msgstr "-" + +#: FPreview.form:396 +msgid "Legal" +msgstr "-" + +#: FPreview.form:396 +msgid "Letter" +msgstr "-" + +#: FPreview.form:411 +msgid "Width" +msgstr "Largeur" + +#: FPreview.form:422 +msgid "mm" +msgstr "-" + +#: FPreview.form:432 +msgid "Height" +msgstr "Hauteur" + +#: FPreview.form:455 +msgid "Grayscale" +msgstr "Niveaux de gris" + +#: FPreview.form:461 +msgid "Full page" +msgstr "Pleine page" + +#: FPreview.form:466 +msgid "Collate copies" +msgstr "Assembler les copies" + +#: FPreview.form:471 +msgid "Reverse order" +msgstr "Inverser" + +#: OutputReport2.report:77 +msgid "Version 1.0" +msgstr "" + +#: OutputReport2.report:84 Report51.report:60 +msgid "Date" +msgstr "" + +#: OutputReport2.report:99 +msgid "Project Title:" +msgstr "" + +#: OutputReport2.report:106 +msgid "Project No.:" +msgstr "" + +#: OutputReport2.report:113 +msgid "Company:" +msgstr "" + +#: OutputReport2.report:120 +msgid "Designer:" +msgstr "" + +#: OutputReport2.report:134 +msgid "Base Plate ID:" +msgstr "" + +#: OutputReport2.report:185 +msgid "Bearing Pressue" +msgstr "" + +#: OutputReport2.report:195 +msgid "Node #" +msgstr "" + +#: OutputReport2.report:202 +msgid "Brg. Press., psi" +msgstr "" + +#: OutputReport2.report:266 +msgid "Anchor Rod Tension" +msgstr "" + +#: OutputReport2.report:276 +msgid "Rod #" +msgstr "" + +#: OutputReport2.report:283 +msgid "Tension, lbs" +msgstr "" + +#: OutputReport2.report:353 +msgid "Page $PAGE of $NPAGE" +msgstr "" + +#: Report.class:112 +msgid "Section " +msgstr "" + +#: Report1.report:29 +msgid "=\"Page \" & Page" +msgstr "" + +#: Report1.report:46 +msgid "=pi() + 4" +msgstr "" + +#: Report10.report:22 Report14.report:53 +msgid "=index" +msgstr "" + +#: Report10.report:31 +msgid "=Index" +msgstr "" + +#: Report10.report:46 +msgid "=\"Index = \" & index" +msgstr "" + +#: Report10.report:54 +msgid "=page & \" / \" & pages" +msgstr "" + +#: Report11.report:19 Report12.report:17 +msgid "Section 1" +msgstr "" + +#: Report11.report:39 +msgid "Gambas" +msgstr "" + +#: Report11.report:59 +msgid "All friends list !" +msgstr "" + +#: Report11.report:81 +msgid "Gambas Report Demo" +msgstr "" + +#: Report11.report:93 +msgid "DEMO" +msgstr "" + +#: Report11.report:106 +msgid "Page $PAGE on $NPAGE " +msgstr "" + +#: Report13.report:36 +msgid "=\"GAMBAS - \" & index" +msgstr "" + +#: Report13.report:44 +msgid "=\"PAGE \" & Page & \" / \" & pages" +msgstr "" + +#: Report14.report:28 +msgid "Reference" +msgstr "" + +#: Report14.report:35 +msgid "Description" +msgstr "" + +#: Report14.report:42 +msgid "Valeur" +msgstr "" + +#: Report14.report:73 +msgid "=page & \" on \" & pages" +msgstr "" + +#: Report16.report:21 Report17.report:22 Report5.report:20 +msgid "Coucou" +msgstr "" + +#: Report2.report:19 +msgid "ReportLabel1" +msgstr "" + +#: Report3.report:18 +msgid "PARCELLAIRE $NPAGE" +msgstr "" + +#: Report51.report:30 +msgid "Recto" +msgstr "" + +#: Report51.report:38 +msgid "Verso" +msgstr "" + +#: Report51.report:51 +msgid "N°" +msgstr "" + +#: Report51.report:99 +#, fuzzy +msgid "Observations" +msgstr "Orientation" + +#: Report6.report:12 +msgid "" +"Testtest

    \n" +"\n" +"
    " +msgstr "" + +#~ msgid "150" +#~ msgstr "-" + +#~ msgid "300" +#~ msgstr "-" + +#~ msgid "75" +#~ msgstr "-" diff --git a/comp/src/gb.report2/.lang/it.po b/comp/src/gb.report2/.lang/it.po new file mode 100644 index 00000000..d22a0750 --- /dev/null +++ b/comp/src/gb.report2/.lang/it.po @@ -0,0 +1,211 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.report2 3.12.90\n" +"PO-Revision-Date: 2019-01-15 14:42 UTC\n" +"Last-Translator: gian \n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "ReportsEvolution" +msgstr "-" + +#: FPreview.class:212 +msgid "PDF files" +msgstr "File PDF" + +#: FPreview.class:212 +msgid "Postscript files" +msgstr "File Postscript" + +#: FPreview.class:227 +msgid "Cancel" +msgstr "Annulla" + +#: FPreview.class:317 +msgid "Replace" +msgstr "Sostituisci" + +#: FPreview.class:317 +msgid "This file already exists.\nDo you want to replace it?" +msgstr "Questo file già esiste.\nDesideri sostituirlo?" + +#: FPreview.class:342 +msgid "Layout..." +msgstr "-" + +#: FPreview.class:354 +msgid "Printing..." +msgstr "Stampa..." + +#: FPreview.form:79 +msgid "Report preview" +msgstr "Anteprima del report" + +#: FPreview.form:86 +msgid "Print to file" +msgstr "Stampa su file" + +#: FPreview.form:115 +msgid "Printing" +msgstr "Stampa" + +#: FPreview.form:145 +msgid "One page" +msgstr "Una pagina" + +#: FPreview.form:154 +msgid "Two pages" +msgstr "Due pagine" + +#: FPreview.form:163 +msgid "Full width" +msgstr "Intera larghezza" + +#: FPreview.form:172 +msgid "Real size" +msgstr "Dimensione reale" + +#: FPreview.form:180 +msgid "Zoom out" +msgstr "Rimpicciolisci" + +#: FPreview.form:193 +msgid "100 %" +msgstr "-" + +#: FPreview.form:199 +msgid "Zoom in" +msgstr "Ingrandisci" + +#: FPreview.form:208 +msgid "Print" +msgstr "Stampa" + +#: FPreview.form:216 +msgid "Show options" +msgstr "Mostra le opzioni" + +#: FPreview.form:239 +msgid "Printer" +msgstr "Stampante" + +#: FPreview.form:264 +msgid "Two-sided" +msgstr "Fronte retro" + +#: FPreview.form:271 +msgid "Long side" +msgstr "Lato lungo" + +#: FPreview.form:271 +msgid "None" +msgstr "Nessuno" + +#: FPreview.form:271 +msgid "Short side" +msgstr "Lato corto" + +#: FPreview.form:275 +msgid "File" +msgstr "-" + +#: FPreview.form:301 +msgid "Resolution" +msgstr "Risoluzione" + +#: FPreview.form:313 +msgid "dpi" +msgstr "-" + +#: FPreview.form:336 +msgid "Range" +msgstr "Pagina" + +#: FPreview.form:352 +msgid "Copies" +msgstr "Copie" + +#: FPreview.form:372 +msgid "Orientation" +msgstr "Orientamento" + +#: FPreview.form:379 +msgid "Landscape" +msgstr "Orizzontale" + +#: FPreview.form:379 +msgid "Portrait" +msgstr "Verticale" + +#: FPreview.form:389 +msgid "Paper" +msgstr "Carta" + +#: FPreview.form:396 +msgid "A3" +msgstr "-" + +#: FPreview.form:396 +msgid "A4" +msgstr "-" + +#: FPreview.form:396 +msgid "A5" +msgstr "-" + +#: FPreview.form:396 +msgid "B5" +msgstr "-" + +#: FPreview.form:396 +msgid "Custom" +msgstr "Personalizzato" + +#: FPreview.form:396 +msgid "Executive" +msgstr "-" + +#: FPreview.form:396 +msgid "Legal" +msgstr "Legale" + +#: FPreview.form:396 +msgid "Letter" +msgstr "Lettera" + +#: FPreview.form:411 +msgid "Width" +msgstr "Larghezza" + +#: FPreview.form:422 +msgid "mm" +msgstr "-" + +#: FPreview.form:432 +msgid "Height" +msgstr "Altezza" + +#: FPreview.form:455 +msgid "Grayscale" +msgstr "Scala di grigi" + +#: FPreview.form:461 +msgid "Full page" +msgstr "Pagina intera" + +#: FPreview.form:466 +msgid "Collate copies" +msgstr "Assembla le copie" + +#: FPreview.form:471 +msgid "Reverse order" +msgstr "Ordine inverso" + +#: Report.class:112 +msgid "Section " +msgstr "Sezione" + diff --git a/comp/src/gb.report2/.lang/nl.po b/comp/src/gb.report2/.lang/nl.po new file mode 100644 index 00000000..fa0105e7 --- /dev/null +++ b/comp/src/gb.report2/.lang/nl.po @@ -0,0 +1,212 @@ +# Willy Raets < gbWilly@openmailbox.org >, 2015 +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.report2 3.12.2\n" +"PO-Revision-Date: 2019-04-06 18:43 UTC\n" +"Last-Translator: gbWilly \n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "ReportsEvolution" +msgstr "Rapport Evolutie" + +#: FPreview.class:212 +msgid "PDF files" +msgstr "PDF bestanden" + +#: FPreview.class:212 +msgid "Postscript files" +msgstr "Postscript bestanden" + +#: FPreview.class:227 +msgid "Cancel" +msgstr "Annuleer" + +#: FPreview.class:317 +msgid "Replace" +msgstr "Vervangen" + +#: FPreview.class:317 +msgid "This file already exists.\nDo you want to replace it?" +msgstr "Dit bestand bestaat reeds.\nWil je het vervangen?" + +#: FPreview.class:342 +msgid "Layout..." +msgstr "-" + +#: FPreview.class:354 +msgid "Printing..." +msgstr "Afdrukken..." + +#: FPreview.form:79 +msgid "Report preview" +msgstr "Rapport voorbeeld" + +#: FPreview.form:86 +msgid "Print to file" +msgstr "Afdrukken naar bestand" + +#: FPreview.form:115 +msgid "Printing" +msgstr "Afdrukken" + +#: FPreview.form:145 +msgid "One page" +msgstr "Een pagina" + +#: FPreview.form:154 +msgid "Two pages" +msgstr "Twee pagina's" + +#: FPreview.form:163 +msgid "Full width" +msgstr "Volledige breedte" + +#: FPreview.form:172 +msgid "Real size" +msgstr "Echte afmeting" + +#: FPreview.form:180 +msgid "Zoom out" +msgstr "Zoom uit" + +#: FPreview.form:193 +msgid "100 %" +msgstr "-" + +#: FPreview.form:199 +msgid "Zoom in" +msgstr "-" + +#: FPreview.form:208 +msgid "Print" +msgstr "Afdrukken" + +#: FPreview.form:216 +msgid "Show options" +msgstr "Opties weergeven" + +#: FPreview.form:239 +msgid "Printer" +msgstr "Printer" + +#: FPreview.form:264 +msgid "Two-sided" +msgstr "Dubbelzijdig" + +#: FPreview.form:271 +msgid "Long side" +msgstr "Lange zijde" + +#: FPreview.form:271 +msgid "None" +msgstr "Geen" + +#: FPreview.form:271 +msgid "Short side" +msgstr "Korte zijde" + +#: FPreview.form:275 +msgid "File" +msgstr "Bestand" + +#: FPreview.form:301 +msgid "Resolution" +msgstr "Resolutie" + +#: FPreview.form:313 +msgid "dpi" +msgstr "-" + +#: FPreview.form:336 +msgid "Range" +msgstr "Bereik" + +#: FPreview.form:352 +msgid "Copies" +msgstr "Kopieën" + +#: FPreview.form:372 +msgid "Orientation" +msgstr "Oriëntatie" + +#: FPreview.form:379 +msgid "Landscape" +msgstr "Landschap" + +#: FPreview.form:379 +msgid "Portrait" +msgstr "Portret" + +#: FPreview.form:389 +msgid "Paper" +msgstr "Papier" + +#: FPreview.form:396 +msgid "A3" +msgstr "-" + +#: FPreview.form:396 +msgid "A4" +msgstr "-" + +#: FPreview.form:396 +msgid "A5" +msgstr "-" + +#: FPreview.form:396 +msgid "B5" +msgstr "-" + +#: FPreview.form:396 +msgid "Custom" +msgstr "Aangepast" + +#: FPreview.form:396 +msgid "Executive" +msgstr "-" + +#: FPreview.form:396 +msgid "Legal" +msgstr "-" + +#: FPreview.form:396 +msgid "Letter" +msgstr "-" + +#: FPreview.form:411 +msgid "Width" +msgstr "Breedte" + +#: FPreview.form:422 +msgid "mm" +msgstr "-" + +#: FPreview.form:432 +msgid "Height" +msgstr "Hoogte" + +#: FPreview.form:455 +msgid "Grayscale" +msgstr "Grijswaarden" + +#: FPreview.form:461 +msgid "Full page" +msgstr "Volledige pagina" + +#: FPreview.form:466 +msgid "Collate copies" +msgstr "Sorteer kopieën" + +#: FPreview.form:471 +msgid "Reverse order" +msgstr "Omgekeerde volgorde" + +#: Report.class:120 +msgid "Section " +msgstr "Sectie" + diff --git a/comp/src/gb.report2/.lang/pt_BR.po b/comp/src/gb.report2/.lang/pt_BR.po new file mode 100644 index 00000000..a4fc8869 --- /dev/null +++ b/comp/src/gb.report2/.lang/pt_BR.po @@ -0,0 +1,221 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.report2 3.14.90\n" +"PO-Revision-Date: 2020-06-12 05:32 UTC\n" +"Last-Translator: Gen Braga \n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +# gb-ignore +#: .project:1 +msgid "ReportsEvolution" +msgstr "" + +#: FPreview.form:79 +msgid "Report preview" +msgstr "Visualizar relatório" + +#: FPreview.form:86 +msgid "Print to file" +msgstr "Imprimir para arquivo" + +#: FPreview.form:115 +msgid "Printing" +msgstr "Imprimindo" + +#: FPreview.form:145 +msgid "One page" +msgstr "Uma página" + +#: FPreview.form:154 +msgid "Two pages" +msgstr "Duas páginas" + +#: FPreview.form:163 +msgid "Full width" +msgstr "Largura cheia" + +#: FPreview.form:172 +msgid "Real size" +msgstr "Tamanho real" + +#: FPreview.form:180 +msgid "Zoom out" +msgstr "Menos zoom" + +# gb-ignore +#: FPreview.form:193 +msgid "100 %" +msgstr "" + +#: FPreview.form:199 +msgid "Zoom in" +msgstr "Mais zoom" + +#: FPreview.form:208 +msgid "Print" +msgstr "Imprimir" + +#: FPreview.form:216 +msgid "Show options" +msgstr "Exibir opções" + +#: FPreview.form:239 +msgid "Printer" +msgstr "Impressora" + +#: FPreview.form:264 +msgid "Two-sided" +msgstr "Dois lados" + +#: FPreview.form:271 +msgid "None" +msgstr "Nenhum" + +#: FPreview.form:271 +msgid "Short side" +msgstr "Lado curto" + +#: FPreview.form:271 +msgid "Long side" +msgstr "Lado longo" + +#: FPreview.form:275 +msgid "File" +msgstr "Arquivo" + +#: FPreview.form:301 +msgid "Resolution" +msgstr "Resolução" + +# gb-ignore +#: FPreview.form:313 +msgid "dpi" +msgstr "" + +#: FPreview.form:336 +msgid "Range" +msgstr "Intervalo" + +#: FPreview.form:352 +msgid "Copies" +msgstr "Cópias" + +#: FPreview.form:372 +msgid "Orientation" +msgstr "Orientação" + +#: FPreview.form:379 +msgid "Portrait" +msgstr "Retrato" + +#: FPreview.form:379 +msgid "Landscape" +msgstr "Paisagem" + +#: FPreview.form:389 +msgid "Paper" +msgstr "Papel" + +#: FPreview.form:396 +msgid "Custom" +msgstr "Personalizado" + +# gb-ignore +#: FPreview.form:396 +msgid "A3" +msgstr "" + +# gb-ignore +#: FPreview.form:396 +msgid "A4" +msgstr "" + +# gb-ignore +#: FPreview.form:396 +msgid "A5" +msgstr "" + +# gb-ignore +#: FPreview.form:396 +msgid "B5" +msgstr "" + +#: FPreview.form:396 +msgid "Letter" +msgstr "Carta" + +#: FPreview.form:396 +msgid "Executive" +msgstr "Executivo" + +# gb-ignore +#: FPreview.form:396 +msgid "Legal" +msgstr "" + +#: FPreview.form:411 +msgid "Width" +msgstr "Largura" + +# gb-ignore +#: FPreview.form:422 +msgid "mm" +msgstr "" + +#: FPreview.form:432 +msgid "Height" +msgstr "Altura" + +#: FPreview.form:455 +msgid "Grayscale" +msgstr "Escala de cinza" + +#: FPreview.form:461 +msgid "Full page" +msgstr "Página cheia" + +#: FPreview.form:466 +msgid "Collate copies" +msgstr "Agrupar cópias" + +#: FPreview.form:471 +msgid "Reverse order" +msgstr "Ordem inversa" + +#: FPreview.class:212 +msgid "PDF files" +msgstr "Arquivos PDF" + +#: FPreview.class:212 +msgid "Postscript files" +msgstr "Arquivos postscript" + +#: FPreview.class:227 +msgid "Cancel" +msgstr "Cancelar" + +#: FPreview.class:317 +msgid "This file already exists.\nDo you want to replace it?" +msgstr "Este arquivo já existe. Sobrescrever?" + +#: FPreview.class:317 +msgid "Replace" +msgstr "Substituir" + +# gb-ignore +#: FPreview.class:342 +msgid "Layout..." +msgstr "" + +#: FPreview.class:356 +msgid "Printing..." +msgstr "Imprimindo..." + +#: Report.class:120 +msgid "Section " +msgstr "Seção" + diff --git a/comp/src/gb.report2/.lang/ru.po b/comp/src/gb.report2/.lang/ru.po new file mode 100644 index 00000000..00f83943 --- /dev/null +++ b/comp/src/gb.report2/.lang/ru.po @@ -0,0 +1,396 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: comp/src/gb.report2/.project:20 +msgid "ReportsEvolution" +msgstr "Эволюция отчётов" + +#: comp/src/gb.report2/.src/Report.class:120 comp/src/gb.report2/.src/Report.class:368 +msgid "Section " +msgstr "Раздел " + +#: comp/src/gb.report2/.src/Viewer/FPreview.class:212 +msgid "PDF files" +msgstr "Файлы PDF" + +#: comp/src/gb.report2/.src/Viewer/FPreview.class:212 +msgid "Postscript files" +msgstr "Файлы Postscript" + +#: comp/src/gb.report2/.src/Viewer/FPreview.class:227 comp/src/gb.report2/.src/Viewer/FPreview.class:317 +msgid "Cancel" +msgstr "Отмена" + +#: comp/src/gb.report2/.src/Viewer/FPreview.class:232 comp/src/gb.report2/.src/Viewer/FPreview.form:114 comp/src/gb.report2/.src/Viewer/FPreview.form:346 +msgid "Print" +msgstr "Печать" + +#: comp/src/gb.report2/.src/Viewer/FPreview.class:317 +msgid "" +"This file already exists.\n" +"Do you want to replace it?" +msgstr "" +"Этот файл уже существует.\n" +"Вы хотите заменить его?" + +#: comp/src/gb.report2/.src/Viewer/FPreview.class:317 +msgid "Replace" +msgstr "Заменить" + +#: comp/src/gb.report2/.src/Viewer/FPreview.class:342 +msgid "Layout..." +msgstr "Макет..." + +#: comp/src/gb.report2/.src/Viewer/FPreview.class:354 +msgid "Printing..." +msgstr "Печать..." + +#: comp/src/gb.report2/.src/Viewer/FPreview.form:5 +msgid "Report preview" +msgstr "Предпросмотр отчёта" + +#: comp/src/gb.report2/.src/Viewer/FPreview.form:10 +msgid "Print to file" +msgstr "Печать в файл" + +#: comp/src/gb.report2/.src/Viewer/FPreview.form:34 +msgid "Printing" +msgstr "Печать" + +#: comp/src/gb.report2/.src/Viewer/FPreview.form:59 +msgid "One page" +msgstr "Одна страница" + +#: comp/src/gb.report2/.src/Viewer/FPreview.form:67 +msgid "Two pages" +msgstr "Две страницы" + +#: comp/src/gb.report2/.src/Viewer/FPreview.form:75 +msgid "Full width" +msgstr "Полная ширина" + +#: comp/src/gb.report2/.src/Viewer/FPreview.form:83 +msgid "Real size" +msgstr "Реальный размер" + +#: comp/src/gb.report2/.src/Viewer/FPreview.form:90 +msgid "Zoom out" +msgstr "Уменьшить" + +#: comp/src/gb.report2/.src/Viewer/FPreview.form:101 +msgid "100 %" +msgstr "100%" + +#: comp/src/gb.report2/.src/Viewer/FPreview.form:106 +msgid "Zoom in" +msgstr "Увеличить" + +#: comp/src/gb.report2/.src/Viewer/FPreview.form:121 +msgid "Show options" +msgstr "Показать параметры" + +#: comp/src/gb.report2/.src/Viewer/FPreview.form:141 +msgid "Printer" +msgstr "Принтер" + +#: comp/src/gb.report2/.src/Viewer/FPreview.form:161 +msgid "Two-sided" +msgstr "Двусторонний" + +#: comp/src/gb.report2/.src/Viewer/FPreview.form:167 +msgid "None" +msgstr "Нет" + +#: comp/src/gb.report2/.src/Viewer/FPreview.form:167 +msgid "Short side" +msgstr "Короткая сторона" + +#: comp/src/gb.report2/.src/Viewer/FPreview.form:167 +msgid "Long side" +msgstr "Длинная сторона" + +#: comp/src/gb.report2/.src/Viewer/FPreview.form:171 +msgid "File" +msgstr "Файл" + +#: comp/src/gb.report2/.src/Viewer/FPreview.form:192 +msgid "Resolution" +msgstr "Разрешение" + +#: comp/src/gb.report2/.src/Viewer/FPreview.form:203 +msgid "dpi" +msgstr "dpi" + +#: comp/src/gb.report2/.src/Viewer/FPreview.form:222 +msgid "Range" +msgstr "Диапазон" + +#: comp/src/gb.report2/.src/Viewer/FPreview.form:235 +msgid "Copies" +msgstr "Копии" + +#: comp/src/gb.report2/.src/Viewer/FPreview.form:251 +msgid "Orientation" +msgstr "Ориентация" + +#: comp/src/gb.report2/.src/Viewer/FPreview.form:257 +msgid "Portrait" +msgstr "Книжная" + +#: comp/src/gb.report2/.src/Viewer/FPreview.form:257 +msgid "Landscape" +msgstr "Альбомная" + +#: comp/src/gb.report2/.src/Viewer/FPreview.form:265 +msgid "Paper" +msgstr "Бумага" + +#: comp/src/gb.report2/.src/Viewer/FPreview.form:271 +msgid "Custom" +msgstr "Пользовательский" + +#: comp/src/gb.report2/.src/Viewer/FPreview.form:271 +msgid "A3" +msgstr "А3" + +#: comp/src/gb.report2/.src/Viewer/FPreview.form:271 +msgid "A4" +msgstr "A4" + +#: comp/src/gb.report2/.src/Viewer/FPreview.form:271 +msgid "A5" +msgstr "А5" + +#: comp/src/gb.report2/.src/Viewer/FPreview.form:271 +msgid "B5" +msgstr "B5" + +#: comp/src/gb.report2/.src/Viewer/FPreview.form:271 +msgid "Letter" +msgstr "Лист" + +#: comp/src/gb.report2/.src/Viewer/FPreview.form:271 +msgid "Executive" +msgstr "Экзекьютив" + +#: comp/src/gb.report2/.src/Viewer/FPreview.form:271 +msgid "Legal" +msgstr "Легал" + +#: comp/src/gb.report2/.src/Viewer/FPreview.form:283 +msgid "Width" +msgstr "Ширина" + +#: comp/src/gb.report2/.src/Viewer/FPreview.form:292 comp/src/gb.report2/.src/Viewer/FPreview.form:309 +msgid "mm" +msgstr "мм" + +#: comp/src/gb.report2/.src/Viewer/FPreview.form:300 +msgid "Height" +msgstr "Высота" + +#: comp/src/gb.report2/.src/Viewer/FPreview.form:319 +msgid "Grayscale" +msgstr "Оттенки серого" + +#: comp/src/gb.report2/.src/Viewer/FPreview.form:324 +msgid "Full page" +msgstr "Полная страница" + +#: comp/src/gb.report2/.src/Viewer/FPreview.form:328 +msgid "Collate copies" +msgstr "Собрать по копиям" + +#: comp/src/gb.report2/.src/Viewer/FPreview.form:332 +msgid "Reverse order" +msgstr "Обратный порядок" + +#: comp/src/gb.report2/.src/Tests/Report10.report:14 comp/src/gb.report2/.src/Tests/Report14.report:42 +msgid "=index" +msgstr "=индекс" + +#: comp/src/gb.report2/.src/Tests/Report10.report:23 +msgid "=Index" +msgstr "=Индекс" + +#: comp/src/gb.report2/.src/Tests/Report10.report:38 +msgid "=\"Index = \" & index" +msgstr "=\"Индекс = \" & индекс" + +#: comp/src/gb.report2/.src/Tests/Report10.report:46 +msgid "=page & \" / \" & pages" +msgstr "=страница & \" / \" & страницы" + +#: comp/src/gb.report2/.src/Tests/Report13.report:30 +msgid "=\"GAMBAS - \" & index" +msgstr "=\"GAMBAS - \" & индекс" + +#: comp/src/gb.report2/.src/Tests/Report13.report:38 comp/src/gb.report2/.src/Tests/Report13.report:45 +msgid "=\"PAGE \" & Page & \" / \" & pages" +msgstr "=\"СТРАНИЦА \" & Страница & \" / \" & страницы" + +#: comp/src/gb.report2/.src/Tests/Report14.report:17 +msgid "Reference" +msgstr "Ссылка" + +#: comp/src/gb.report2/.src/Tests/Report14.report:24 +msgid "Description" +msgstr "Описание" + +#: comp/src/gb.report2/.src/Tests/Report14.report:31 +msgid "Valeur" +msgstr "Значение" + +#: comp/src/gb.report2/.src/Tests/Report14.report:62 +msgid "=page & \" on \" & pages" +msgstr "=страница & \" на \" & страницы" + +#: comp/src/gb.report2/.src/Tests/Report16.report:17 comp/src/gb.report2/.src/Tests/Report17.report:19 comp/src/gb.report2/.src/Tests/old/Report5.report:16 +msgid "Coucou" +msgstr "Кукушка" + +#: comp/src/gb.report2/.src/Tests/old/OutputReport2.report:26 +msgid "Version 1.0" +msgstr "Версия 1.0" + +#: comp/src/gb.report2/.src/Tests/old/OutputReport2.report:33 comp/src/gb.report2/.src/Tests/old/Report51.report:39 +msgid "Date" +msgstr "Дата" + +#: comp/src/gb.report2/.src/Tests/old/OutputReport2.report:48 +msgid "Project Title:" +msgstr "Название проекта:" + +#: comp/src/gb.report2/.src/Tests/old/OutputReport2.report:55 +msgid "Project No.:" +msgstr "№ проекта:" + +#: comp/src/gb.report2/.src/Tests/old/OutputReport2.report:62 +msgid "Company:" +msgstr "Компания:" + +#: comp/src/gb.report2/.src/Tests/old/OutputReport2.report:69 +msgid "Designer:" +msgstr "Дизайнер:" + +#: comp/src/gb.report2/.src/Tests/old/OutputReport2.report:83 +msgid "Base Plate ID:" +msgstr "Идентификатор базовой платы:" + +#: comp/src/gb.report2/.src/Tests/old/OutputReport2.report:134 +msgid "Bearing Pressue" +msgstr "Давление подшипника" + +#: comp/src/gb.report2/.src/Tests/old/OutputReport2.report:144 comp/src/gb.report2/.src/Tests/old/OutputReport2.report:162 +msgid "Node #" +msgstr "Узел #" + +#: comp/src/gb.report2/.src/Tests/old/OutputReport2.report:151 comp/src/gb.report2/.src/Tests/old/OutputReport2.report:169 +msgid "Brg. Press., psi" +msgstr "Давление подшипника, psi" + +#: comp/src/gb.report2/.src/Tests/old/OutputReport2.report:215 +msgid "Anchor Rod Tension" +msgstr "Натяжение анкерного стержня" + +#: comp/src/gb.report2/.src/Tests/old/OutputReport2.report:225 comp/src/gb.report2/.src/Tests/old/OutputReport2.report:243 +msgid "Rod #" +msgstr "Стержень #" + +#: comp/src/gb.report2/.src/Tests/old/OutputReport2.report:232 comp/src/gb.report2/.src/Tests/old/OutputReport2.report:250 +msgid "Tension, lbs" +msgstr "Натяжение, lbs" + +#: comp/src/gb.report2/.src/Tests/old/OutputReport2.report:302 +msgid "Page $PAGE of $NPAGE" +msgstr "Страница $PAGE из $NPAGE" + +#: comp/src/gb.report2/.src/Tests/old/Report1.report:22 +msgid "=\"Page \" & Page" +msgstr "=\"Страница \" & Страница" + +#: comp/src/gb.report2/.src/Tests/old/Report1.report:39 +msgid "=pi() + 4" +msgstr "=пи() + 4" + +#: comp/src/gb.report2/.src/Tests/old/Report11.report:7 comp/src/gb.report2/.src/Tests/old/Report12.report:7 +msgid "Section 1" +msgstr "Раздел 1" + +#: comp/src/gb.report2/.src/Tests/old/Report11.report:27 +msgid "Gambas" +msgstr "Gambas" + +#: comp/src/gb.report2/.src/Tests/old/Report11.report:47 +msgid "All friends list !" +msgstr "Список всех друзей!" + +#: comp/src/gb.report2/.src/Tests/old/Report11.report:69 +msgid "Gambas Report Demo" +msgstr "Демонстрация отчёта Gambas" + +#: comp/src/gb.report2/.src/Tests/old/Report11.report:81 +msgid "DEMO" +msgstr "ДЕМО" + +#: comp/src/gb.report2/.src/Tests/old/Report11.report:94 +msgid "Page $PAGE on $NPAGE " +msgstr "Страница $PAGE на $NPAGE " + +#: comp/src/gb.report2/.src/Tests/old/Report2.report:16 +msgid "ReportLabel1" +msgstr "Метка_отчёта_1" + +#: comp/src/gb.report2/.src/Tests/old/Report3.report:15 +msgid "PARCELLAIRE $NPAGE" +msgstr "ПОСЫЛКА $NPAGE" + +#: comp/src/gb.report2/.src/Tests/old/Report51.report:9 +msgid "Recto" +msgstr "Перёд" + +#: comp/src/gb.report2/.src/Tests/old/Report51.report:17 +msgid "Verso" +msgstr "Оборот" + +#: comp/src/gb.report2/.src/Tests/old/Report51.report:30 +msgid "N°" +msgstr "№" + +#: comp/src/gb.report2/.src/Tests/old/Report51.report:78 +msgid "Observations" +msgstr "Наблюдения" + +#: comp/src/gb.report2/.src/Tests/old/Report6.report:10 +msgid "" +"Testtest

    \n" +"\n" +"
    " +msgstr "" +"Тесттест

    \n" +"\n" +"
    " + diff --git a/comp/src/gb.report2/.project b/comp/src/gb.report2/.project new file mode 100644 index 00000000..683acbab --- /dev/null +++ b/comp/src/gb.report2/.project @@ -0,0 +1,19 @@ +# Gambas Project File 3.0 +Title=ReportsEvolution +Startup=Report13 +Icon=.hidden/control/reportview.png +Version=3.15.90 +VersionFile=1 +Component=gb.image +Component=gb.gui +Component=gb.form +Component=gb.db +Component=gb.eval +Component=gb.settings +Environment="GB_GUI=gb.qt5\nGB_NO_JIT=1" +TabSize=2 +Translate=1 +Language=en +Type=Component +Packager=1 +DoNotTranslate=".src/Tests" diff --git a/comp/src/gb.report2/.src/Evaluator/CResult.class b/comp/src/gb.report2/.src/Evaluator/CResult.class new file mode 100644 index 00000000..2903a454 --- /dev/null +++ b/comp/src/gb.report2/.src/Evaluator/CResult.class @@ -0,0 +1,55 @@ +' Gambas class file + +Public Enum TypeValue, TypeString, TypeOp, TypeVar, TypeFunc, TypeBool, TypeDate +Public Value As Variant +Public {Type} As Integer +Public Pos As Integer +Property Read isValue As Boolean +Property Read isOperator As Boolean +Property Read isString As Boolean +Property Read isVariable As Boolean +Property Read isFunction As Boolean +Property Read isBoolean As Boolean + +Public Sub _new(vValue As Variant, iType As Integer) + + Value = vValue + Me.Type = iType + +End + +Private Function isValue_Read() As Boolean + + Return Me.Type = TypeValue + +End + +Private Function isOperator_Read() As Boolean + + Return Me.Type = TypeOp + +End + +Private Function isString_Read() As Boolean + + Return Me.Type = TypeString + +End + +Private Function isVariable_Read() As Boolean + + Return Me.Type = TypeVar + +End + +Private Function isFunction_Read() As Boolean + + Return Me.Type = TypeFunc + +End + +Private Function isBoolean_Read() As Boolean + + Return Me.Type = TypeBool + +End diff --git a/comp/src/gb.report2/.src/Evaluator/_RepExp.class b/comp/src/gb.report2/.src/Evaluator/_RepExp.class new file mode 100644 index 00000000..ea18e606 --- /dev/null +++ b/comp/src/gb.report2/.src/Evaluator/_RepExp.class @@ -0,0 +1,50 @@ +' Gambas class file + +Inherits Expression +Public Data As Variant +Event Data(Name As String) +Static Private $aFunctions As String[] +Static Private $aAllowedIdentifiers As String[] = ["page", "pages", "index"] + +Static Private Sub LoadFunctions() + + $aFunctions = Split(File.Load("FunctionsList"), "\n") + +End + + + + +Static Public Sub IsIdentifier(Name As String) As Boolean + + 'Print "Identifier : " & Name + + +Return $aAllowedIdentifiers.Exist(LCase(Name)) +End + +Static Public Sub IsSubr(Name As String) As Boolean + If Not $aFunctions Then LoadFunctions + ' Return if a the 'Name' Gambas subroutine is allowed. + Return $aFunctions.Exist(LCase(Name)) +'Print Name + +End + +Public Sub GetValue(Name As String) As Variant + + 'Return the value Of the 'Name' identifier. + Data = 0 + 'Print object.parent(Me) + Raise Data(Name) + Return Data + 'Print "Get Value : " & Name + 'Return "2" + +End + +' Public Sub Coucou(Value As String) As String +' +' Return "Coucou " & Value +' +' End diff --git a/comp/src/gb.report2/.src/Optional/Align.class b/comp/src/gb.report2/.src/Optional/Align.class new file mode 100644 index 00000000..485bc6a1 --- /dev/null +++ b/comp/src/gb.report2/.src/Optional/Align.class @@ -0,0 +1,10 @@ +' Gambas class file + +Export Optional + +' Must be the same values as in gb.form.const.h in gb.qt4 sources + +Public Enum + Normal = &H00, {Left} = &H01, {Right} = &H02, Center = &H03, + TopNormal = &H10, TopLeft = &H11, TopRight = &H12, Top = &H13, + BottomNormal = &H20, BottomLeft = &H21, BottomRight = &H22, Bottom = &H23 diff --git a/comp/src/gb.report2/.src/Optional/Arrange.class b/comp/src/gb.report2/.src/Optional/Arrange.class new file mode 100644 index 00000000..20388fdc --- /dev/null +++ b/comp/src/gb.report2/.src/Optional/Arrange.class @@ -0,0 +1,11 @@ +' Gambas class file + +' Gambas class file + +Export Optional + +Public Const {None} As Integer = 0 +Public Const {Horizontal} As Integer = 1 +Public Const {Vertical} As Integer = 2 +Public Const {Column} As Integer = 4 +Public Const {Fill} As Integer = 5 diff --git a/comp/src/gb.report2/.src/Optional/Line.class b/comp/src/gb.report2/.src/Optional/Line.class new file mode 100644 index 00000000..c345df55 --- /dev/null +++ b/comp/src/gb.report2/.src/Optional/Line.class @@ -0,0 +1,13 @@ +' Gambas class file + +Export Optional + + +' Must be the same values as in gb.form.const.h in gb.qt4 sources + +Public Const {None} As Integer = 0 +Public Const {Solid} As Integer = 1 +Public Const {Dash} As Integer = 2 +Public Const {Dot} As Integer = 3 +Public Const {DashDot} As Integer = 4 +Public Const {DashDotDot} As Integer = 5 \ No newline at end of file diff --git a/comp/src/gb.report2/.src/Report.class b/comp/src/gb.report2/.src/Report.class new file mode 100644 index 00000000..73585b03 --- /dev/null +++ b/comp/src/gb.report2/.src/Report.class @@ -0,0 +1,799 @@ +' Gambas class file + +Create Static +Export +Inherits ReportSection + +' For Stretch properties +Public Enum None, Proportional, Fill + +Public Const _Properties As String = "*,-Left,-Top,-Width,-Height,Count{Range:1;256}=1,Index,Text," +"Paper{Printer.A3;A4;A5;B5;Letter;Executive;Legal;Custom}=A4," +"Orientation{Printer.Portrait;Landscape}=Portrait" +Public Const _HiddenControls As String = "Report,ReportControl,ReportContainer,ReportFrame,ReportSection" +Public Const _IsForm As Boolean = True +Public Const _IsContainer As Boolean = True +Public Const _IsMultiContainer As Boolean = True +Public Const _DrawWith As String = "TabPanel" +Public Const _DefaultEvent As String = "Open" +Static Public AllowedUnits As String[] = ["m", "cm", "mm", "in", "pt", "px"] + +Public _LayoutNotFinished As Boolean + +Public _Container As ReportSection + +Public {Debug} As Boolean = False +Public _bInExec As Boolean + + +Private $aSections As New TControl[] +Private iCurPage As Integer = 0 +Private $iPageCount As Integer = -1 +Public _LayoutIsDirty As Boolean = True +Private $fScale As Float = 1.0 +Private $iIndex As Integer +Private $iResolution As Integer = -1 +Private $iCurSection As Integer +Private $iCurPage As Integer = -1 +Private $iPaper As Integer = 2 +Private $iOrientation As Integer +' Private $hPrinter As New Printer As "Printer" +Private $bOpened As Boolean +Private $fCurReportWidth As Float + +' Property Read Printer As Printer +Property Resolution As Integer +Property Scale As Float +Property Read PageCount As Integer +Property Count As Integer +Property Index As Integer + +'All ReportControl Properties +Property Left As String +Property Top As String +Property X As String +Property Y As String + +Property Width As String +Property Height As String + +Property Visible As Boolean +Property {Font} As Font +Property Expand As Boolean +Property Ignore As Boolean +Property Fixed As Boolean + +Property Autoresize As Boolean +Property Padding As ReportPadding +'All ReportFrame Properties +Property Border As ReportBorder +Property BackGround As ReportBrush + +'All ReportContainer Properties +Property Read Children As ReportControl[] +Property Spacing As String +Property Data As Object + +'All ReportSection Properties +Property Text As String + +Property Paper As Integer +Property Orientation As Integer +Property Read _Width As Float +Property Read _Height As Float + +Event Open + +Static Public Sub Main() + + Dim hObject As Object + + hObject = Application.Startup.AutoCreate() + If Not hObject Is Report Then Return + FPreview.Run(hObject) + +End + +Static Public Sub _init() + + If Not Component.IsLoaded("gb.eval") Then Component.Load("gb.eval") + +End + + + +Public Sub _New() + + Dim hSection As New ReportSection + Dim TSection As New TControl + + object.Attach(Me, Me, "Report") + + '$hReportTControl.RelPage = 0 + ReportControl._ObjectFromId[Me.id] = Me + hSection = New ReportSection + hSection._ReportId = Me.Id + + ReportControl._ObjectFromId[hSection.Id] = hSection + TSection.Ctrl = hSection + $aSections.Add(TSection) + hSection.Text = ("Section ") & $aSections.Max + _Container = hSection + Me.paper = Printer.A4 + 'Me.Orientation = Printer.Landscape +End + +Public Sub Layout(Optional iPage As Integer = -1) + + + 'Dim iCurPage As Integer + Dim TSection As TControl + Dim CSection As ReportContainer + Dim CBaseSection As ReportContainer + Dim i As Integer + Dim hImg As Image + 'Utilise un device par défaut si nécéssaire + If Not Paint.Device Then + hImg = New Image(1, 1) + Paint.Begin(hImg) + Endif + Paint.Font = Me.Font + If Not $bOpened Then + Raise Open + $bOpened = True + Endif + + If Not _LayoutIsDirty Then Return + If _bInExec Then Return + If iPage > -1 Then + 'La page a déja été calculée + If iPage <= $iCurPage Then Return + Else + 'Mise a zéro + $iCurPage = -1 + $iCurSection = 0 + $iPageCount = 0 + Me._Reset + Endif + + 'Set execution Flag to true + _bInExec = True + CBaseSection = $aSections[0].Ctrl + + For i = $iCurSection To $aSections.Max + Tsection = $aSections[i] + CSection = TSection.Ctrl + CSection.Padding = CBaseSection.Padding + CSection.Spacing = CBaseSection.Spacing + CSection._NormalizeUnits() + $fCurReportWidth = CBaseSection._Width + TSection._SetGeometry(0, 0, CSection._Width, CSection._Height) + Inc $iCurPage + Do + + CSection._SetChildGeometry(0, 0, CSection._Width, CSection._Height, $iCurPage, TSection, False) + + If CSection._CurItem > CSection.Children.Max Then Break + + Inc $iCurPage + $iPageCount = $iCurPage + 'Print "Fin Page " & $iCurPage + If iPage > -1 And If $iCurPage > iPage Then + Dec $iCurPage + _LayoutNotFinished = True + $iCurSection = i + _bInExec = False + Return + + Endif + + Loop + 'Inc iCurPage + Next + + $iPageCount = $iCurPage + 1 + _LayoutNotFinished = False + $iCurSection = 0 + _LayoutIsDirty = False + + 'End of execution + _bInExec = False + 'Print "Pages: " & $ipageCount +End + +Public Sub Paint(Page As Integer) + + Dim TSection As TControl + 'Dim fScale As Float + + + If Me.Parent = Null Then + + Endif + Paint.Font = Me.Font + $fCurReportWidth = $aSections[0].Ctrl._Width + + If _LayoutIsDirty Or $iPageCount = -1 Then Layout(Page) + Paint.Save + Paint.Scale($fScale, $fScale) + 'Set execution Flag to true + _bInExec = True + + + Dec page + + For Each TSection In $aSections + TSection.Ctrl._PaintBefore(Page, 0, 0, TSection, -1) + TSection.Ctrl._Paint(Page, 0, 0, TSection, -1) + TSection.Ctrl._PaintAfter(Page, 0, 0, TSection, -1) + Next + 'End of execution + _bInExec = False + Paint.Restore + + +End + +Private Function PageCount_Read() As Integer + + If _LayoutIsDirty And Not _LayoutNotFinished Then Layout(1) + + Return $iPageCount + +End + +Private Function Height_Read() As String + + Return $aSections[0].Ctrl.Height + +End + +Private Sub Height_Write(Value As String) + + SetHeight(Value) + $iPaper = Printer.Custom + +End + +Private Sub SetHeight(Value As String) + + Dim TSection As TControl + + If $aSections[0].Ctrl.Height <> Value Then + + For Each TSection In $aSections + TSection.Ctrl.Height = Value + Next + _LayoutIsDirty = True + Me._reset + Endif + +End + +Private Function Width_Read() As String + + Return $aSections[0].Ctrl.Width + +End + +Private Sub Width_Write(Value As String) + + SetWidth(Value) + $iPaper = Printer.Custom + +End + +Private Sub SetWidth(Value As String) + + Dim TSection As TControl + + If $aSections[0].Ctrl.Width <> Value Then + For Each TSection In $aSections + Tsection.Ctrl.Width = Value + Next + _LayoutIsDirty = True + Me._Reset + Endif + +End + +Private Function Scale_Read() As Float + + Return $fScale + +End + +Private Sub Scale_Write(Value As Float) + + $fScale = Value + +End + +Public Sub Clear() + + Super._Free + iCurPage = 0 + $iPageCount = -1 + + _LayoutIsDirty = True + $fScale = 1.0 + +End +' + +Public Function Preview() + + FPreview.Run(Me) + +End + + + +Public Sub Refresh() + + _LayoutIsDirty = True + Me._Reset + +End + +Private Function Count_Read() As Integer + + Return $aSections.Count + +End + +Private Sub Count_Write(Value As Integer) + + Dim i As Integer + Dim hSection As ReportSection + Dim TSection As TControl + + If Value < 0 Then Return + If Value < $aSections.Count Then + $aSections.Resize(Value) + Else If Value > $aSections.Count Then + For i = $aSections.Count To Value - 1 + + TSection = New TControl + hSection = New ReportSection + hSection.Text = "Section " & CStr(i) + hSection._ReportId = Me.Id + ReportControl._ObjectFromId[hSection.Id] = hSection + TSection.Ctrl = hSection + hSection.Padding = Me.Padding + hSection.Height = Me.Height + hSection.Width = Me.Width + $aSections.Add(TSection) + hSection.Text = ("Section ") & $aSections.Max + Next + Endif + +End + +Private Function Index_Read() As Integer + + Return $iIndex + +End + +Private Sub Index_Write(Value As Integer) + + $iIndex = Max(Min($aSections.Max, Value), 0) + _Container = $aSections[$iIndex].Ctrl + +End + +Public Sub _get(Index As Integer) As ReportSection + + Return $aSections[Index].Ctrl + +End + +Private Function Padding_Read() As ReportPadding + + Return $aSections[0].Ctrl.Padding + +End + +Private Sub Padding_Write(Value As ReportPadding) + + Dim TSection As TControl + + If Me.Padding <> Value Then + For Each TSection In $aSections + Tsection.Ctrl.Padding = Value + Next + Endif + +End + +Private Function Resolution_Read() As Integer + + Return $iResolution + +End + +Private Sub Resolution_Write(Value As Integer) + + _LayoutIsDirty = True + $iResolution = Max(0, Value) + +End + +Private Function Left_Read() As String + + Return _Container.Left + +End + +Private Sub Left_Write(Value As String) + + _Container.Left = Value + +End + +Private Function Top_Read() As String + + Return _Container.Top + +End + +Private Sub Top_Write(Value As String) + + _Container.Top = Value + +End + +Private Function X_Read() As String + + Return _Container.Left + +End + +Private Sub X_Write(Value As String) + + _Container.Left = Value + +End + +Private Function Y_Read() As String + + Return _Container.Top + +End + +Private Sub Y_Write(Value As String) + + _Container.Top = Value + +End + +Private Function Visible_Read() As Boolean + + Return _Container.Visible + +End + +Private Sub Visible_Write(Value As Boolean) + + _Container.Visible = Value + +End + +Private Function Font_Read() As Font + + Return _Container.Font + +End + +Private Sub Font_Write(Value As Font) + + _Container.Font = Value + +End + +Private Function Expand_Read() As Boolean + + Return _Container.Expand + +End + +Private Sub Expand_Write(Value As Boolean) + + _Container.Expand = Value + +End + +Private Function Ignore_Read() As Boolean + + Return _Container.Ignore + +End + +Private Sub Ignore_Write(Value As Boolean) + + _Container.Ignore = Value + +End + +Private Function Fixed_Read() As Boolean + + Return _Container.Fixed + +End + +Private Sub Fixed_Write(Value As Boolean) + + _Container.Fixed = Value + +End + +Private Function Autoresize_Read() As Boolean + + Return _Container.Autoresize + +End + +Private Sub Autoresize_Write(Value As Boolean) + + _Container.Autoresize = Value + +End + +Private Function Border_Read() As ReportBorder + + Return _Container.Border + +End + +Private Sub Border_Write(Value As ReportBorder) + + _Container.Border = Value + +End + +Private Function BackGround_Read() As ReportBrush + + Return _Container.BackGround + +End + +Private Sub BackGround_Write(Value As ReportBrush) + + _Container.BackGround = Value + +End + +Private Function Children_Read() As ReportControl[] + + Return _Container.Children + +End + +Private Function Spacing_Read() As String + + Return _Container.Spacing + +End + +Private Sub Spacing_Write(Value As String) + + Dim TSection As TControl + Dim hCont As ReportContainer + + If Me.Spacing <> Value Then + For Each TSection In $aSections + hCont = Tsection.Ctrl + hCont.Spacing = Value + Next + Endif + +End + +Private Function Data_Read() As Object + + Return _Container.Data + +End + +Private Sub Data_Write(Value As Object) + + _Container.Data = Value + +End + +Private Function Text_Read() As String + + Return _Container.Text + +End + +Private Sub Text_Write(Value As String) + + _Container.Text = Value + +End + +''Return a new report object +Public Sub Clone() As Report + + 'Return Object.New(Object.Type(Me)) + Return Object.Class(Me).New() + +End + +Private Function Paper_Read() As Integer + + Return $iPaper + +End + +Private Sub Paper_Write(Value As Integer) + + $iPaper = Value + SetPaper + +End + +Private Function Orientation_Read() As Integer + + Return $iOrientation + +End + +Private Sub Orientation_Write(Value As Integer) + + $iOrientation = Value + SetPaper + +End + +Public Sub Print(Optional hPrinter As Printer) + + If hPrinter Then + CPrint.PrintReport(Me, hPrinter) + Else + CPrint.PrintReport(Me) + Endif + +End + +Private Sub SetPaper() + + Dim sPrev As String + + Select Case $iPaper + Case Printer.A3 + SetWidth("29.7cm") + SetHeight("42cm") + Case Printer.A4 + SetWidth("21cm") + SetHeight("29.7cm") + Case Printer.A5 + SetWidth("14.8cm") + SetHeight("21cm") + Case Printer.B5 + SetWidth("18.7cm") + SetHeight("25.7cm") + Case Printer.Executive + SetWidth("19.1cm") + SetHeight("25.4cm") + Case Printer.Legal + SetWidth("21.6cm") + SetHeight("35.6cm") + Case Printer.Letter + SetWidth("21.6cm") + SetHeight("27.9cm") + + End Select + + + If $iOrientation = Printer.Landscape Then + sPrev = Me.Height + SetHeight(Me.Width) + SetWidth(sPrev) + Endif + +End + +Public Sub _Reset() + + Dim hSection As TControl + + For Each hSection In $aSections + hSection.Ctrl._Reset + hSection._PageChildren = New Collection + Next + + $iCurPage = -1 + $iCurSection = 0 + $iPageCount = 0 + +End + +''Convert Internal units to scaled pixels. + +Fast Public Function _ToPixels(Value As Float) As Float + + Dim f As Float + + f = Value / $fCurReportWidth * (Paint.Width / $fScale) + + Return f + +End + +''Shortcut to Convert a Pixel Value to Internal unit (Need a paint device). +Fast Public Function _FromPixels(Value As Float) As Float + + Return (value / Paint.ResolutionX) '* 2.54) + +End + +Fast Static Private Function GetFactorToInch(Unit As String) As Float + + Select Case Unit + Case "cm" + Return 0.3937 + Case "ft" + Return 12 + Case "in" + Return 1 + Case "m" + Return 39.37 + Case "mm" + Return 0.03937 + Case "px" + If Paint.ResolutionX Then + Return 1 / Paint.ResolutionX + Else + Return 1 / Desktop.Resolution + Endif + Case "pt" + Return 1 / 72 'http://en.wikipedia.org/wiki/Point_(typography)#Current_DTP_point_system + Case Else + Error.Raise("Unknown unit") + End Select + +End + +''Convert any value from any report allowed Unit to another one. +''For Pixel convertions, be carefull to give the Device +''Resolution in parameter. +Fast Static Public Function UnitTo(Value As Float, Unit1 As String, Unit2 As String) As Float + + Dim fInch As Float + Dim f As Float + + f = GetFactorToInch(Unit1) + finch = value * f + f = GetFactorToInch(Unit2) + Return finch / f + +End + +''Shortcut to convert any report allowed unit to Inch. +Fast Static Public Function UnitToInch(Value As Float, Unit As String) As Float + + Dim fInch As Float + Dim f As Float + + f = GetFactorToInch(Unit) + finch = value * f + Return finch + 'f = 0.3937 + 'Return finch / f + +End + +Private Function _Width_Read() As Float + + Return $aSections[0].Ctrl._Width + +End + +Private Function _Height_Read() As Float + + Return $aSections[0].Ctrl._Height + +End diff --git a/comp/src/gb.report2/.src/ReportContainer.class b/comp/src/gb.report2/.src/ReportContainer.class new file mode 100644 index 00000000..3e95708d --- /dev/null +++ b/comp/src/gb.report2/.src/ReportContainer.class @@ -0,0 +1,1080 @@ +' Gambas class file + +Export +Create Private +Inherits ReportFrame + +Public Const _IsContainer As Boolean = True +Public Const _Group As String = "Container" +Public Const _Properties As String = "*,Spacing{ReportCoord},OnePiece,ForceNewPage" +'Public Const _DefaultEvent As String = "Data" +'Private $bDataIsResult As Boolean +'Private $iCount As Integer + +Property _CurItem As Integer +Private $iCurItem As Integer + +Public _Arrangement As Integer +Private $bIndexChange As Boolean +Private $aChild As New ReportControl[] +Private $fSpacing As Float +Private $sSpacing As String +Private $bRelativeSpacing As Boolean + +'Private $aChildCopy As TControl[] +Private $bOnePiece As Boolean +'Private $iIndex As Integer +'Private $hData As Object +Private $fFixedSize As Float +Property _Index As Integer + +Property DataCount As Integer + +Property Read Children As ReportControl[] + +'Property Read Index As Integer +Property Spacing As String +'Property Data As Object '<==== remettre pour automation + +Property Read _Spacing As Float +Property Read _RelativeSpacing As Boolean + +Property OnePiece As Boolean +Public _RealSpacing As Integer +Public _NotFinished As Boolean + +Event BeforeData +Event AfterData + +Public Function _Add(cControl As ReportControl) 'As TControl + + 'Dim hTControl As New TControl + + 'hTControl.Ctrl = cControl + $aChild.Add(cControl) + ReportControl._ObjectFromId[cControl.Id] = cControl + 'Return hTControl + +End + +Public Sub _Remove(id As Integer) + + $aChild.Remove($aChild.Find(ReportControl._ObjectFromId[id])) + +End + +Public Sub _Free() + +End + +Public Sub _Raise(hControl As ReportControl) + + Dim iPos As Integer + + iPos = $aChild.Find(hControl) + If iPos = -1 Then Return + $aChild.Remove(iPos) + $aChild.add(hControl, 0) + +End + +Public Sub _Lower(hControl As ReportControl) + + Dim iPos As Integer + + iPos = $aChild.Find(hControl) + If iPos = -1 Then Return + $aChild.Remove(iPos) + $aChild.add(hControl) + +End + +Private Function Children_Read() As ReportControl[] + + Return $aChild + +End + +Private Function Spacing_Read() As String + + Return $sSpacing + +End + +Private Sub Spacing_Write(Value As String) + + $sSpacing = Value + +End + +Public Sub _Paint(Page As Integer, X As Float, Y As Float, hControl As TControl, (DataIndex) As Integer) + + Dim hChild As TControl + Dim i As Integer + + X += hControl.RealLeft + Y += hControl.RealTop + ' Paint.Text(DataIndex, X + 20, Y + 20) + ' Paint.Brush = Paint.Color(Color.Black) + ' Paint.Fill + + If Not hControl._PageChildren.Exist(Page) Then Return + 'For Each hChild In hControl._PageChildren[Page] + For i = 0 To hControl._PageChildren[Page].Max + hchild = hControl._PageChildren[Page][i] + Me._Index = hchild.Index + If $bIndexChange Then + Raise BeforeData + $bIndexChange = False + Endif + hChild.Ctrl._Paintframe(Page, X, Y, hChild, hchild.Index) 'hChild.Index) + + Next + +End + +Private Function _Spacing_Read() As Float + + Return $fSpacing + +End + +Private Function _RelativeSpacing_Read() As Boolean + + Return $bRelativeSpacing + +End + +Public Sub _NormalizeUnits() + + Dim hChild As ReportControl + Dim hSizeParse As TSizeParse + + Super._NormalizeUnits() + + hSizeParse = New TSizeParse($sSpacing, True) + $fSpacing = hSizeParse.GetValue() + $bRelativeSpacing = hSizeParse.IsRelative() + + For Each hChild In $aChild + 'hchild.SizeHint = Null + hChild._NormalizeUnits() + Next + +End + +Public Sub _GetSizeHints((AvailableW) As Float, (AvailableH) As Float, (TotalWidth) As Float, (TotalHeight) As Float, DataIndex As Integer) As ReportSizeHints + + Dim hMyHints As New ReportSizeHints + + 'If Me._SizeInt.StoreSize Then Return Me._SizeInt + 'If Me.tag = "*" Then Stop + If Me._CurItem > Me.Children.max Then + + ' If Me Is ReportSection Then Stop + Me._CurItem = 0 + ' 'Me._DataIndex = 0 + Endif + Me._Index = DataIndex + If $bIndexChange Then + Raise BeforeData + $bIndexChange = False + Endif + Select Case _Arrangement + + Case Arrange.Vertical + Return GetVSizeInt(AvailableW, AvailableH, TotalWidth, TotalHeight, DataIndex) + Case Arrange.Horizontal + Return GetHSizeInt(AvailableW, AvailableH, TotalWidth, TotalHeight, DataIndex) + Case Arrange.Column + Return GetVPSizeInt(AvailableW, AvailableH, TotalWidth, TotalHeight, DataIndex) + Case Arrange.Fill, Arrange.None + Return Super._GetSizeHints(AvailableW, AvailableH, TotalWidth, TotalHeight, DataIndex) + 'hMyHints.Height = AvailableH + 'Me._SizeInt.StoreSize = True + 'Me._SizeInt = hMyHints + Return hMyHints + + End Select + Raise AfterData + +End + +Private Function GetHSizeInt((AvailableW) As Float, (AvailableH) As Float, (TotalWidth) As Float, (TotalHeight) As Float, DataIndex As Integer) As ReportSizeHints + + Dim hChild As ReportControl + Dim fHeight, fWidth As Float + Dim hChildHints As ReportSizeHints + Dim hMyHints As New ReportSizeHints + Dim fSpc As Float + Dim fMaxSpc As Float + Dim i As Integer + 'D'abord utiliser la méthode du controle pour définir la taille + hMyHints = Super._GetSizeHints(AvailableW, AvailableH, TotalWidth, TotalHeight, DataIndex) + + 'Puis si besoins voir le besoin des enfants + If Me.Autoresize Or If (Me._Width = 0 And Me._Height = 0) Then + fSpc = IIf(Me._RelativeSpacing, TotalWidth * Me._Spacing / 100, Me._Spacing) + 'on ajoute la marge supérieur du premier objet + If Me.Children.Max > 0 Then fWidth += Me.Children[0].Margin._Top + For i = 0 To Me.Children.Max + hChild = Me.Children[i] + hChildHints = hchild._GetSizeHints(AvailableW - fWidth, AvailableH, AvailableW, AvailableH, DataIndex) + fMaxSpc = Max(fspc, hchild.Margin._Right) + If i < Me.Children.Max Then fMaxSpc = Max(fMaxSpc, Me.Children[i + 1].Margin._Left) + fWidth += hChildHints.Width + fMaxSpc + If fHeight < hChildHints.Height Then fHeight = hChildHints.Height + 'Si l'enfant n'est pas finit alors moi non plus (:-P) + If hChildHints.NotFinished Then hMyHints.NotFinished = True + Next + 'Retrait du dernier espace + If fWidth Then fWidth -= fSpc + hMyHints.Height = fHeight + Me.Padding._Height + Me.Border._Top + Me.Border._bottom + hMyHints.Width = fWidth + Me.Padding._Width + Me.Border._Left + Me.Border._Right + Endif + + Return hMyHints + +End + +Private Function GetVPSizeInt((AvailableW) As Float, (AvailableH) As Float, (TotalWidth) As Float, (TotalHeight) As Float, DataIndex As Integer) As ReportSizeHints + ' Dim hSizeInt As New ReportSizeHints + ' Dim htmpInts As ReportSizeHints + ' Dim hChild As ReportControl ''Enfants + ' Dim fHeight, fSpc, fWidth As Float + ' Dim i, j As Integer + ' Dim bExitLoop As Boolean + ' Dim fMaxSpc As Float + ' + ' 'D'abord utiliser la méthode du controle pour définir la taille + ' hSizeInt = Super._GetSizeHints(AvailableW, AvailableH, TotalWidth, TotalHeight, DataIndex) + ' 'Circuit court + ' If Me.Children.Count = 0 Then Return hSizeInt + ' 'Largeur d'un espace + ' fSpc = IIf(Me._RelativeSpacing, TotalHeight * Me._Spacing / 100, Me._Spacing) + ' ' Si ce n'est pas fait on enregistre la place nécéssaire a tout les éléments fixes + ' If Not $fFixedSize Then + ' + ' Endif + ' +End + + + + +Private Function GetVSizeInt((AvailableW) As Float, (AvailableH) As Float, (TotalWidth) As Float, (TotalHeight) As Float, DataIndex As Integer) As ReportSizeHints + + Dim hSizeInt As New ReportSizeHints + Dim htmpInts As ReportSizeHints + Dim hChild As ReportControl ''Enfants + Dim fHeight, fSpc, fWidth As Float + Dim i, j As Integer + Dim bExitLoop As Boolean + Dim fMaxSpc As Float + 'Dim IndexKey As String = Str(Me.Id) &/ Str(DataIndex) + 'If Me.Tag = "**" Then Stop + 'D'abord utiliser la méthode du controle pour définir la taille + hSizeInt = Super._GetSizeHints(AvailableW, AvailableH, TotalWidth, TotalHeight, DataIndex) + 'Circuit court + If Me.Children.Count = 0 Then Return hSizeInt + + fSpc = IIf(Me._RelativeSpacing, TotalHeight * Me._Spacing / 100, Me._Spacing) + + ' Si ce n'est pas fait on enregistre la place nécéssaire a tout les éléments fixes + + If Not $fFixedSize Then + 'On ajoute la marge superieur du premier objet7 + 'If Me.tag = "**" Then Stop + For i = 0 To Me.Children.Max + hChild = Me.Children[i] + If hchild.Fixed Then + 'On ajoute la marge supérieur du premier objet fixe + If $fFixedSize = 0 Then $fFixedSize = hchild.Margin._Top + htmpInts = hChild._GetSizeHints(AvailableW, AvailableH, AvailableW, AvailableH, DataIndex) + fMaxSpc = Max(hchild.Margin._Bottom, fspc) + If i < Me.Children.Max Then fMaxSpc = Max(fMaxSpc, Me.Children[i + 1].Margin._Top) + $fFixedSize += htmpInts.Height + fMaxSpc + Endif + Next + 'If $fFixedSize Then $fFixedSize = Me.Children[0].Margin._Top + Endif + + 'La taille ne peut être inférieur a celle de tout les éléments fixes ou a défaut + 'a celle du premier élément. + hSizeInt.Height = Max(hSizeInt.Height, $fFixedSize) + + 'On ajoute la taille des objets fixes précédents + If $fFixedSize > 0 Then + fHeight = $fFixedSize + Else + 'On ajoute la marge supérieur du premier objet listé si aucun objet fixe n'est a l'Horizon + fHeight = Me.Children[Me._CurItem].Margin._Top + Endif + + 'If Me.Tag = "**" Then Stop + If Me.Autoresize Or If (Me._Width = 0 And Me._Height = 0) Then + 'On définit la taille au besoins des enfants + For i = Me._CurItem To Me.Children.Max + hChild = Me.Children[i] + For j = hchild._DataIndex To hchild._Count - 1 + 'If hchild.Tag = "head" Then Print "VDataHint = " & DataIndex + If hChild.Ignore Then Continue + If hChild.Fixed Then Continue + hchild._Index = j + htmpInts = hChild._GetSizeHints(AvailableW, AvailableH - fHeight, AvailableW, AvailableH, j) + 'Si l'enfant n'est pas terminé alors moi non plus + If htmpInts.NotFinished Then hSizeInt.NotFinished = True + fMaxSpc = Max(fspc, hchild.Margin._Bottom) + If hchild._Count <= 0 Or If j = hchild._Count - 1 Then + If i < Me.Children.Max Then + fMaxSpc = Max(fMaxSpc, Me.Children[i + 1].Margin._Top) + Endif + Else + fMaxSpc = Max(fMaxSpc, hchild.Margin._Top) + Endif + + 'on ajoute la hauteur aux besoins + fHeight += htmpInts.Height + fMaxSpc + ' If Me.Tag = "**" Then + ' Print "fHeight , AvailableH : ", fHeight - fMaxSpc, AvailableH + ' Print "fMaxSpc : ", fMaxSpc + ' 'If fMaxSpc = 0 Then Stop + ' Endif + + If fHeight - fMaxSpc > AvailableH Then + 'Les enfants ne loge pas ... on ne peut pas finir + hSizeInt.NotFinished = True + bExitLoop = True + 'Print "Avec Parent : " & DataIndex & " Je loge : " & j + Break + Endif + 'On récupère la largeur de l'enfant le plus large + If fWidth < htmpInts.Width Then fWidth = htmpInts.Width + Next + If bExitLoop Then Break + Next + + 'on enlève le dernier espace + If fHeight > 0 Then fHeight -= fSpc + 'bogue bizzard + fHeight += 0.01 + + 'On indique la place nécéssaire aux enfants+les éléments fixes + hSizeInt.Height = fHeight + Me.Padding._Height + Me.Border._Top + Me.Border._Bottom + hSizeInt.Width = fWidth + Me.Padding._Width + Me.Border._Left + Me.Border._Right + Endif + + 'On ne peut pas dépasser la taille disponible (report sur prochaine page) + 'FIXME: Onepiece partially desactivated + If Not Me.OnePiece Then + hSizeInt.Height = Min(hSizeInt.Height, AvailableH) + Endif + + hSizeInt.Height = Min(TotalHeight, hSizeInt.Height) + + Me._SizeInt = hSizeInt + ' If Me.Tag = "Boite 2" Then + ' Print hSizeInt.Height + ' Stop + ' Endif + 'If Me.tag = "toto" Then Stop + ' If hSizeInt.NotFinished = False Then + ' Print Me.Tag & " : EST FINIT" + ' Endif + Return hSizeInt + +End + +Public Sub _Reset() + + Dim hChild As ReportControl + 'mise a zéro de l'index de suivit de progression + Me._CurItem = 0 + 'Mise a zéro de l'index de reproduction + Me._DataIndex = 0 + 'Netoyage du layout précédent + 'Me._PageChildren.Clear + 'Nettoyage récurssif des enfants + For Each hChild In Me.Children + + hChild._Reset + + Next + +End + + + + + + + + +Public Sub _SetChildGeometry(X As Float, Y As Float, W As Float, H As Float, ContPage As Integer, TCont As TControl, bInFixed As Boolean) + 'If Me.Tag = "*" Then Stop + 'Print "Geometry " & Object.Type(Me) + 'If ContPage > 0 Then Return + + Me._Index = TCont.Index + + If Me._CurItem > Me.Children.max Then + ' If Me Is ReportSection Then Stop + Me._CurItem = 0 + 'Me._DataIndex = 0 + Endif + + ' If $bIndexChange Then + ' Raise BeforeData + ' $bIndexChange = False + ' Endif + + Select Case _Arrangement + Case Arrange.Vertical + SetVChildGeometry(X, Y, W, H, ContPage, TCont, bInFixed) + Case Arrange.Horizontal + SetHChildGeometry(X, Y, W, H, ContPage, TCont, bInFixed) + Case Arrange.Column + Me._SetCChildGeometry(X, Y, W, H, ContPage, TCont, bInFixed) + Case Arrange.Fill + SetFChildGeometry(X, Y, W, H, ContPage, TCont, bInFixed) + Case Arrange.None + SetNChildGeometry(X, Y, W, H, ContPage, TCont, bInFixed) + End Select + Raise AfterData + +End + +Private Function SetFChildGeometry(X As Float, Y As Float, W As Float, H As Float, ContPage As Integer, TCont As TControl, bInFixed As Boolean) + + Dim hChild As ReportControl + Dim hTItem As TControl + Dim hChildHints As ReportSizeHints + Dim aPageItems As New TControl[] + Dim oChild As Object + Dim j As Integer + + X = Me.Padding._Left + Me.Border._Left + Y = Me.Padding._Top + Me.Border._Top + W = W - Me.Padding._Left - Me.Padding._Right - Me.Border._Left - Me.Border._Right + H = H - Me.Padding._Top - Me.Padding._Bottom - Me.Border._Top - Me.Border._Bottom + For Each hChild In Me.Children + hChildHints = hchild._GetSizeHints(W, H, W, H) + hTItem = New TControl + hTItem.Ctrl = hchild + hTItem.SizeHint = hChildHints + + Inc Me._CurItem + aPageItems.Add(hTItem) + + Next + For Each oChild In aPageItems + oChild._Index = hTItem.Index + hTItem._SetGeometry(X, Y, W, H) + hChild._SetChildGeometry(X, Y, W, H, ContPage, hTItem, bInFixed Or Me.Fixed) + If oChild Is ReportContainer Then + + If oChild._CurItem < oChild.Children.count Then + 'Print ochild.tag & " pas fini" + j = Me.Children.Find(oChild) + Me._CurItem = Min(j, Me._CurItem) + Endif + 'ne pas incrémenter la lecture des enfants si je suis dans un élément fixe + If bInFixed Then ochild._CurItem = 0 + End If + Next + + TCont._PageChildren[ContPage] = aPageItems + +End + +Private Function SetNChildGeometry(X As Float, Y As Float, W As Float, H As Float, ContPage As Integer, TCont As TControl, bInFixed As Boolean) + + Dim hChild As ReportControl + Dim ochild As Object + Dim hTItem As TControl + Dim hChildHints As ReportSizeHints + Dim aPageItems As New TControl[] + Dim iX, iY As Float + Dim J As Integer + + If Me.Children.Count = 0 Then Return + + X = Me.Padding._Left + Me.Border._Left + Y = Me.Padding._Top + Me.Border._Top + W = W - Me.Padding._Left - Me.Padding._Right - Me.Border._Left - Me.Border._Right + H = H - Me.Padding._Top - Me.Padding._Bottom - Me.Border._Top - Me.Border._Bottom + + For Each hChild In Me.Children + + hChildHints = hchild._GetSizeHints(W, H, W, H, TCont.Index) + hTItem = New TControl + hTItem.Ctrl = hchild + hTItem.SizeHint = hChildHints + Inc Me._CurItem + aPageItems.Add(hTItem) + + Next + + For Each hTItem In aPageItems + oChild = hTItem.Ctrl + hChildHints = hTItem.SizeHint + iX = X + IIf(oChild._RelativeLeft, W * oChild._Left / 100, oChild._Left) + iY = Y + IIf(oChild._RelativeTop, H * oChild._Top / 100, oChild._Top) + oChild._Index = hTItem.Index + hTItem._SetGeometry(iX, iY, hChildHints.Width, hChildHints.Height) + hChild._SetChildGeometry(iX, iY, hChildHints.Width, hChildHints.Height, ContPage, hTItem, bInFixed Or Me.Fixed) + + If oChild Is ReportContainer Then + + If oChild._CurItem < oChild.Children.count Then + j = Me.Children.Find(oChild) + Me._CurItem = Min(j, Me._CurItem) + Endif + 'ne pas incrémenterla lecture des enfants si je suis dans un élément fixe + If bInFixed Then ochild._CurItem = 0 + End If + Next + TCont._PageChildren[ContPage] = aPageItems + +End + +Private Sub SetHChildGeometry(X As Float, Y As Float, W As Float, H As Float, ContPage As Integer, TCont As TControl, bInFixed As Boolean) + + Dim aPageItems As New TControl[] ''Éléments contenu par cette page + Dim hChildHints As ReportSizeHints ''Besoins en hauteur/largeur de l'enfant + Dim hChild As ReportControl ''Un enfant reportcontrol + Dim oChild As Object + Dim TW, fWidth, fSpc As Float + Dim fExp As Float + Dim iNExp As Integer + + Dim i, j As Integer + Dim fTmpX, fX, fY As Float + Dim hTItem As TControl + Dim fMaxSpc As Float + Dim fChildY, fChildH As Float + 'Initialisation des variables + fSpc = IIf(Me._RelativeSpacing, H * Me._Spacing / 100, Me._Spacing) 'ME._Spacing + 'On retire les marges a la hauteur et les bordures + H = H - Me.Padding._Top - Me.Padding._Bottom - Me.Border._Top - Me.Border._Bottom + 'Print H + 'on retire a la largeur les paddings (et les bordure ?) + W = W - Me.Padding._Left - Me.Padding._Right - Me.Border._Left - Me.Border._Right + + 'On positionne le curseur de position au coin a gauche + X = Me.Padding._Left + Me.Border._Left + Y = Me.Padding._Top + Me.Border._Top + + 'On initialise la largeur totale avec la largeur disponible + TW = W + + For i = 0 To Me.Children.Max + + hChild = Me.Children[i] + + 'hchild._Index = IIf(Me.DataCount > 0, j, TCont.Index) + hChild._Index = TCont.Index + hChildHints = hChild._GetSizeHints(w, h, w, h, TCont.Index) + + 'Si l' éléments ne loge pas on quitte et on oublit + If TW - hChildHints.Width < 0 Then Break + + 'Si l'élément n'est pas ignoré + If Not hChild.Ignore Then + fMaxSpc = Max(fspc, hchild.Margin._Right) + If i < Me.Children.Max Then fMaxSpc = Max(fMaxSpc, Me.Children[i + 1].Margin._Left) + + TW = TW - hChildHints.Width - fMaxSpc + 'Si il est étendu on en tient compte + If hChild.Expand Then + Inc iNExp + fExp += hChildHints.Width + Endif + Endif + + 'On ajoute l'élément a la page + hTItem = New TControl + hTItem.Ctrl = hChild + hTItem.SizeHint = hChildHints + hTItem.Index = TCont.Index + aPageItems.Add(hTItem) + + Next + + 'De toute les façon je ne cherche pas a parcourir tout + 'Les objet donc j'indique que j'ai tout vu + Me._CurItem = Me.Children.count + + If (W - TW) > 0 Then + TW += fspc + Endif + + fTmpX = X + If aPageItems.Count > 0 Then + fTmpX += aPageItems[0].Ctrl.Margin._Left + fExp = fExp - aPageItems[0].Ctrl.Margin._Left '- aPageItems[aPageItems.Max].Ctrl.Margin._Right + Endif + + 'On va mettre en page a présent + 'On définit la taille des éléments étendus + If iNexp Then + fExp = (TW + fExp) / iNexp + Endif + + For i = 0 To aPageItems.Max + hTItem = aPageItems[i] + oChild = hTItem.Ctrl + 'Si l'élément est étendu on lui applique la taille répartie + If oChild.Expand And Not oChild.Ignore Then + 'If Me.Tag = "*" Then Stop + fWidth = fExp + Else + 'sinon il maintien sa taille + fWidth = hTItem.SizeHint.Width + Endif + 'oChild._Index = hTItem.Index + If Not oChild.Ignore Then + fChildH = H - ochild.Margin._Top - oChild.Margin._Bottom + fChildY = Y + oChild.Margin._Top + hTItem._SetGeometry(fTmpX, fChildY, fWidth, fChildH) + oChild._SetChildGeometry(fTmpX, fChildY, fWidth, fChildH, ContPage, hTItem, bInFixed Or Me.Fixed) + fMaxSpc = Max(fspc, ochild.Margin._Right) + If i < aPageItems.Max Then fMaxSpc = Max(fMaxSpc, aPageItems[i + 1].Ctrl.Margin._Left) + fTmpX += fWidth + fMaxspc + Else + fX = X + IIf(oChild._RelativeLeft, W * oChild._Left / 100, oChild._Left) + fY = Y + IIf(oChild._RelativeTop, H * oChild._Top / 100, oChild._Top) + hTItem._SetGeometry(fX, fY, fWidth, hTItem.SizeHint.Height) + oChild._SetChildGeometry(fX, fY, fWidth, hTItem.SizeHint.Height, ContPage, hTItem, bInFixed Or Me.Fixed) + Endif + + If oChild Is ReportContainer Then + If oChild._CurItem <= oChild.Children.max Then + 'Print ochild.tag & " pas fini" + j = Me.Children.Find(oChild) + Me._CurItem = Min(Me._CurItem, j) + Endif + 'ne pas incrémenter la lecture des enfants si je suis dans un élément fixe + If bInFixed Then ochild._CurItem = 0 + + Endif + Next + + 'On ajoute la page a la collection de page du conteneur + TCont._PageChildren[ContPage] = aPageItems + +End + +Private Function DataCount_Read() As Integer + + Return Me._Count + +End + +Private Sub DataCount_Write(Value As Integer) + 'If value = 0 Then value = 1 + + Me._Count = Value + +End + +' Public Function _GetIndex() As Integer +' +' If Me._Count > 0 Then 'Si c'est moi le répéteur alors je fournis mon index +' Return Me._Index +' Else +' Try Return Me.Parent._GetIndex 'Sinon je ontinue a remonter la lignée jusqu'au répéteur +' Endif +' +' End + +Private Function _Index_Read() As Integer + + Return Super._Index + +End + +Private Sub _Index_Write(Value As Integer) + + If Super._Index = Value And If Super._Index > 0 Then Return + $bIndexChange = True + Super._Index = Value + +End + +Private Function _CurItem_Read() As Integer + + Return $iCurItem + +End + +Private Sub _CurItem_Write(Value As Integer) + 'Print "_CurItem = " & Value + 'If Me.tag = "Boite 1" And Value = 0 Then Stop + 'If Me.tag = "Boite 1" And ContPage = 1 Then Print "CurItem: " & Me._CurItem + + $iCurItem = Value + +End + +Private Function OnePiece_Read() As Boolean + + Return $bOnePiece + +End + +Private Sub OnePiece_Write(Value As Boolean) + + $bOnePiece = Value + +End + +Public Sub _SetCChildGeometry(X As Float, Y As Float, W As Float, H As Float, ContPage As Integer, TCont As TControl, bInFixed As Boolean) + +End + +Private Sub SetVChildGeometry(X As Float, Y As Float, W As Float, H As Float, ContPage As Integer, TCont As TControl, bInFixed As Boolean) + + Dim aPageItems As New TControl[] ''Éléments contenu par cette page + Dim hChildHints As ReportSizeHints ''Besoins en hauteur/largeur de l'enfant + Dim hChild As ReportControl ''Un enfant reportcontrol + Dim fTH As Float ''Hauteur restante + Dim fSpc As Float ''Taille d'un espace + Dim hTItem As TControl ''Un objet virtuel + Dim oChild As Object ''Un objet gambas générique + Dim fExp As Float ''taille des objets étendus + Dim iNExp As Integer ''Nombre d'objets étendus + Dim ftmpHeight As Float ''Tampon pour le calcul de la taille répartie + Dim ftmpY As Float ''Curseur temporaire de position haute + Dim fX, fY As Float ''Tampon de position + Dim i, j As Integer ''Des indexs + Dim bExitLoop As Boolean ''Flag de sortie de traitement + Dim bForceNewPage As Boolean ''Flag d'anticipation de sortie 1 par page + Dim iPreIndex As Integer + Dim fMaxSpc As Float ''Résultat de la comparaison ds espaces (marges/spacing) + Dim fChildX, fChildW As Float + Dim iIndex As Integer + Dim bFirst As Boolean + 'Dim hSizeInt As Boolean + Dim bTop As Boolean + Dim fPrevTH As Float + Dim cChildFixe As New Collection + Dim iVal As Integer + 'Dim IndexKey As String = Str(Me.Id) &/ Str(TCont.Index) + + 'Détermination de la taille d'un espace + 'et prise en compte de la taille relative + fSpc = IIf(Me._RelativeSpacing, H * Me._Spacing / 100, Me._Spacing) + + 'Retrait du padding et des bordures de la hauteur de travail + H = H - Me.Padding._Top - Me.Border._Top - Me.Border._Bottom - Me.Padding._Bottom + + 'Retrait du padding et des bordures a la largeur de travail + W = W - Me.Padding._Left - Me.Border._Left - Me.Border._Right - Me.Padding._Right + + 'Positioinnement du curseur en haut a gauche + X = Me.Padding._Left + Me.Border._Left + Y = Me.Padding._Top + Me.Border._Top + + 'La hauteur restante est initialisée avec la hauteur de travail + fTH = H + + 'On énumère tout les éléments an tête en ne retenant que les fixes + For i = 0 To Me.Children.Max + hchild = Me.Children[i] + If hchild.Fixed Then + cChildFixe[j] = hchild + Inc j + Endif + Next + + j = 0 + + For i = 0 To Me.Children.Max + hchild = Me.Children[i] + 'If Not hchild._DataIndex.Exist(IndexKey) Then hchild._DataIndex[IndexKey] = 0 + If hchild.Fixed Then + + If Not bTop And If i < Me._CurItem Then + fTH = fTH - Me.Children[i].Margin._Top + bTop = True + Endif + 'trouver le fixe suivant + For j = i + 1 To Me._CurItem + If Me.Children[j].Fixed Then + iVal = j + Break + Endif + Next + 'Si le fixe suivant n'est pas définit alors on utlise l'objet suivant + If Not iVal Then iVal = i + 1 + + fMaxSpc = Max(hchild.Margin._Bottom, fspc) + If i < Me.Children.Max Then fMaxSpc = Max(fMaxSpc, Me.Children[i + 1].Margin._Top) + 'Calcul de l'espace interobjet (c'est a dire la plus grande valeur entre la marge basse de l'objet, + 'le spacing, et la marge haute de l'objet suivant.) + + hChildHints = hchild._GetSizeHints(W, fTH, W, H, TCont.Index) + + If Not hchild.Ignore Then fTH -= hChildHints.Height + fMaxSpc + If i < Me._CurItem Then + 'Génération de l'objet virtuel + hTItem = New TControl + 'Lier l'objet + hTItem.Ctrl = hchild + 'Associer sa taille + hTItem.SizeHint = hChildHints + 'TODO: Restorer + 'hTItem.Index = TCont.Index + hTItem.Index = iIndex + Inc iIndex + 'L'ajouter a la page + aPageItems.Add(hTItem) + + 'Si l'objet est étendu alors on en tient compte + 'sauf si celui-ci est ignoré par l'arrangement + If hchild.Expand And If Not hchild.Ignore Then + fExp += hChildHints.Height + Inc iNExp + Endif + + Endif + + Endif + Next + 'If ContPage = 2 And Me.Tag = "**" Then Stop + 'On parcour les élément de l'index a la fin + For i = Me._CurItem To Me.Children.Max + + If Not bTop Then + fTH = fTH - Me.Children[i].Margin._Top + bTop = True + Endif + hchild = Me.Children[i] + 'Je traite ici la boucle de clonage + 'On définit le point de départ + 'If ContPage = 1 And hchild.Tag = "**" Then Stop + j = hChild._DataIndex + 'hchild._PageDataIndex = hchild._DataIndex + Do + 'Calcul de l'espace interobjet (c'est a dire la plus grande valeur entre la marge basse de l'objet, + 'le spacing, et la marge haute de l'objet suivant.) + fMaxSpc = Max(hchild.Margin._Bottom, fspc) + 'Définit l'espace en fonction du contexte + If hchild._Count > 0 And If j <= hchild._count - 1 Then + fMaxSpc = Max(fMaxSpc, Me.Children[i].Margin._Top) + Else + If i < Me.Children.Max Then fMaxSpc = Max(fMaxSpc, Me.Children[i + 1].Margin._Top) + Endif + 'If Me.Tag = "**" And j = 3 Then Stop + 'If TCont.Index = 2 Then Stop + 'If ContPage = 2 And Me.Tag = "**" Then Stop + hChildHints = hchild._GetSizeHints(W, fTH, W, H, TCont.Index) + 'If ContPage = 2 And Me.Tag = "**" Then Print fTH, hChildHints.Height + 'Les éléments fixes ont déja été traités on ne tient donc pas compte de leur hauteur + 'car elle a déja été déduite de l'espace restant. De meme on ignore les objets flottants (ignore=true) + If Not hchild.Fixed And If Not hchild.Ignore Then + 'Si l'élément ne loge pas dans la place restante ou + 'si la place restante est insuffisante + 'on provoque la sortie en fin de boucle + If fTH - hChildHints.Height <= 0 Or If bForceNewPage Then + ' Debug "Lélément index : " & j & " Ne loge pas dans le conteneur" + ' Debug "fTH : " & fTH + ' Debug "fTH - hChildHints.Height : " & (fTH - hChildHints.Height) + ' Print + If Not bFirst Then + 'SI il est le premier de la série alors il doit loger dans la page coute que coute + hChildHints.Height = fTH - hchild.Margin._bottom + Else + + bForceNewPage = False + hchild._DataIndex = j + + bExitLoop = True + Break + Endif + Endif + bFirst = True + fTH = fTH - hChildHints.Height - fMaxSpc + Endif + 'On l'ajoute a la page + 'Génération de l'objet virtuel + hTItem = New TControl + 'Lier l'objet + hTItem.Ctrl = hchild + 'Associer sa taille + hTItem.SizeHint = hChildHints + 'TODO: Restorer + 'hTItem.Index = TCont.Index + 'Print hchild._count + hTItem.Index = IIf(hchild._count = 1, TCont.Index, j) 'iIndex + ' Print hchild.Tag + ' Print "Set J= " & hTItem.Index + Inc iIndex + 'L'ajouter a la page + aPageItems.Add(hTItem) + + 'Si l'objet est étendu alors on en tient compte + 'sauf si celui-ci est ignoré par l'arrangement + If hchild.Expand And If Not hchild.Ignore Then + fExp += hChildHints.Height + Inc iNExp + Endif + 'If hChildHints.NotFinished Then hchild._DataIndex = j + 'un élément fixe ou ignore ne peut être répété + If hchild.Fixed Or hchild.Ignore Then Break + + 'Sachant que hChild._count peut être à -1 on le considère dans ce cas la comme étant a 0 + 'si j est égale au compte alors on quitte la boucle + If j >= Max(hchild._Count - 1, 0) Then + 'Remise a 0 si le contenu de l 'enfant est entièrement affiché + If Not hChildHints.NotFinished Then + hChild._DataIndex = 0 + Endif + Break + Endif + 'sinon on incrémente le compte a condition que le dernier enfant aie finit d'afficher ses enfants + If Not hChildHints.NotFinished Then Inc j + + 'On prévoie un sortie de boucle si l'enfant demande un affichage 1 par page + If hchild.ForceNewPage Then bForceNewPage = True + + ' If fTH = 0 Then + ' hchild._DataIndex = j + ' Break + ' bExitLoop = True + ' Endif + + Loop + 'Si la sortie anticipé est demandée alors on sort de la boucle + 'If bExitLoop Then Stop + If bExitLoop Then Break + + 'Si l'objet suivant est un objet spécial de rupture de page alors + 'On force la rupture de page + If i < Me.Children.Max And If Me.Children[i + 1] Is ReportPageBreak Then + Inc Me._CurItem + bForceNewPage = True + Inc i 'on saute l'objet. + Endif + + 'Enfin on incrémente la variable de saugarde de l'objet en cour. + 'If Me.Tag = "**" Then Debug "Inc" + Inc Me._CurItem + + Next + '*************************************************************************** + 'Pour tous les éléments fixes jusqu'à la fin du document + For i = Max(Me._CurItem, 0) To Me.Children.Max + hchild = Me.Children[i] + If hchild.Fixed Then + fMaxSpc = Max(hchild.Margin._Bottom, fspc) + If i < Me.Children.Max Then fMaxSpc = Max(fMaxSpc, Me.Children[i + 1].Margin._Top) + hChildHints = hchild._GetSizeHints(W, fPrevTH, W, H, iPreIndex) + 'on génère l'objet virtuel + hTItem = New TControl + 'On associe le controle + hTItem.Ctrl = hchild + 'On associe sa taille + hTItem.SizeHint = hChildHints + 'NOTE: Restorer + hTItem.Index = iIndex + Inc iIndex + 'On l'ajoute a la page + aPageItems.Add(hTItem) + + 'Si l'objet est étendu alors on tien compte de sa taille + 'pour le calcul de l'espace réparti + If hchild.Expand Then + fExp += hChildHints.Height + Inc iNExp + Endif + fPrevTH = fPrevTH - fMaxSpc + Endif + Next + + 'Si on est en mode spacing alors le dernier expace doit être enlevé + If fspc > 0 And If fMaxSpc = fspc Then + fTH += fSpc + Endif + + '****************************************************************************** + 'A présent tous les éléments pouvant être placé sur la page ont été marqué. + 'On peut donc procéder a la mise en forme de ceux-ci + + ftmpY = Y 'On définit la position de départ + If aPageItems.Count > 0 Then + fTmpY += aPageItems[0].Ctrl.Margin._Top + 'fExp = fExp - aPageItems[0].Ctrl.Margin._Top '- aPageItems[aPageItems.Max].Ctrl.Margin._Right + Endif + If iNExp Then + fExp = (fExp + fTH) / iNExp + Endif + + For i = 0 To aPageItems.Max + 'on récupère l'objet virtuel + hTItem = aPageItems[i] + 'on récupère l'instance de l'objet réel + ochild = hTItem.Ctrl + + 'Si l'objet est étendu alors on calcul sa hauteur + 'Un objet flottant ne peut pas être étendu + If Not oChild.Ignore And If ochild.Expand Then + 'Calcul de la taille répartie + ftmpHeight = fExp + Else + 'Si l'objet n'est pas étendu alors sa taille est celle demandée par celui-ci + ftmpHeight = hTItem.SizeHint.Height + Endif + 'oChild._Index = hTItem.Index + 'Traitement des objets ignoré + 'Les propriété de taille sont celle fournie par l'objet + If oChild.Ignore Then + 'Calcul de la position de l'objet + 'si sa position est relative (%) alors on fait le ratio a partir de la largeur ou de la hauteur + 'sinon on utilise la position fournie par l'objet + fX = X + IIf(oChild._RelativeLeft, W * oChild._Left / 100, oChild._Left) + fY = Y + IIf(oChild._RelativeTop, H * oChild._Top / 100, oChild._Top) + 'Fixer la position de l'objet + hTItem._SetGeometry(fX, fY, hTItem.SizeHint.Width, ftmpHeight) + 'L'objet flottant peut être un conteneur il faut donc demander aussi a ses enfants de s 'organiser + oChild._SetChildGeometry(fX, fY, hTItem.SizeHint.Width, ftmpHeight, ContPage, hTItem, bInFixed Or Me.Fixed) + + Else + fChildX = X + oChild.Margin._Left + fChildW = W - oChild.Margin._Left - oChild.Margin._Right + 'Fixer la position de l'objet + hTItem._SetGeometry(fChildX, fTmpY, fChildW, ftmpHeight) + 'L'objet flottant peut être un conteneur il faut donc demander aussi a ses enfants de s 'organiser + oChild._SetChildGeometry(fChildX, fTmpY, fChildW, ftmpHeight, ContPage, hTItem, bInFixed Or Me.Fixed) + 'Calcul de l'espace interobjet (c'est a dire la plus grande valeur entre la marge basse de l'objet, + 'le spacing, et la marge haute de l'objet suivant.) + fMaxSpc = Max(ochild.Margin._Bottom, fspc) + If i < aPageItems.Max Then fMaxSpc = Max(fMaxSpc, aPageItems[i + 1].Ctrl.Margin._Top) + 'on incrémente la position verticale de l'objet + 'pour définir sa place sur la page relativement aux autres éléments + fTmpY += ftmpHeight + fMaxSpc + + Endif + + 'Si l'objet est un conteneur alors il faut vérifier si il a finit d'être traité + + If oChild Is ReportContainer Then + 'If oChild._NotFinished Then Me.NotFinished = True + 'Si son traitement n'est pas terminé alors on trouve + 'sa position dans la liste des enfant et on l'assigne a l'index de traitement + 'si sa position est > a l'index courant + 'If oChild.Tag = "VB1" Then Stop + If ochild._CurItem <= oChild.Children.Max Then + j = Me.Children.Find(oChild) + Me._CurItem = Min(Me._CurItem, j) + Endif + 'Si on est dans la lignée d'un conteneur fixe on incrémente pas la lecture des enfants + 'En clair ce sont toujours les mêmes éléments qui apparaitrons + If bInFixed Then ochild._CurItem = 0 + Endif + Next + 'On ajoute cette page au dossier du conteneur + TCont._PageChildren[ContPage] = aPageItems + +End diff --git a/comp/src/gb.report2/.src/ReportControl.class b/comp/src/gb.report2/.src/ReportControl.class new file mode 100644 index 00000000..9e7f9cf2 --- /dev/null +++ b/comp/src/gb.report2/.src/ReportControl.class @@ -0,0 +1,648 @@ +' Gambas class file + +Export +Create Private + +Public Const _IsControl As Boolean = True +Public Const _IsContainer As Boolean = False +Public Const _Properties As String = "Left{ReportCoord},Top{ReportCoord},Width{ReportCoord},Height{ReportCoord},Brush{ReportBrush},Visible=True,Fixed,Font,Padding,Margin,Ignore,Expand,AutoResize,Tag,Range" +Public Const _Family As String = "Report" +Public _SizeInt As ReportSizeHints +Public _Count As Integer = 1 +Public _Finished As Boolean +Private $iDataindex As Integer + +Private $iIndex As Integer +Public _PageDataIndex As Integer +Public Name As String +'Object Management +Static Public _ObjectFromId As New Collection +Static Public _iCurPagePos As Integer +Static Private $iLastId As Integer +Static Private $aFont As String[] = ["DejaVu Serif", "Liberation Serif", "Bitstream Vera Serif", "Serif", "Arial"] + +Property Read Id As Integer +Property Read Parent As ReportContainer +Property Tag As Variant +Property Padding As ReportPadding +Property Margin As ReportMargin +Property Brush As ReportBrush +'Property {Color} As Integer + +Property Read _Top As Float ''Top of the control in cm +Property Read _Height As Float ''Height of the control in cm +Property Read _Width As Float ''Width of the control in cm +Property Read _Left As Float ''Left of the control in cm +Property Read _RelativeLeft As Boolean ''Use percentage for Left pos? +Property Read _RelativeTop As Boolean ''Use percentage for Top Pos? +Property Read _RelativeWidth As Boolean ''Use percentage for width? +Property Read _RelativeHeight As Boolean ''Use percentage for height ? +Property _Index As Integer +Property Range As String +Property Left As String +Property Top As String +Property X As String +Property Y As String +Property Width As String +Property Height As String +Property Visible As Boolean +Property {Font} As Font +Property Expand As Boolean +Property Ignore As Boolean +Property Fixed As Boolean +Property Autoresize As Boolean +Property Read {Report} As Report +Property _ReportId As Integer +Property Read DataIndex As Integer +Property ForceNewPage As Boolean +Property _DataIndex As Integer +'Public _DataIndex As New Collection +Private $bForceNewPage As Boolean +Private $iMyId As Integer +Private $iParentId As Integer +Private $vTag As Variant +Private $iReportId As Integer +Private $hBrush As ReportBrush +Private $iColor As Integer +Private $fLeft As Float = 0.0 +Private $fTop As Float = 0.0 +Private $fWidth As Float = 0.0 +Private $fHeight As Float = 0.0 +Private $sHeight As String = "0cm" +Private $sLeft As String = "0cm" +Private $sWidth As String = "0cm" +Private $sTop As String = "0cm" +Private $hPadding As New ReportPadding +Private $hMargin As New ReportMargin +Private $iVisible As Boolean = True +Private $hFont As New Font +Private $bExpand As Boolean +Private $bFixed As Boolean +Private $bAutoresize As Boolean = False +Private $bRelativeLeft As Boolean +Private $bRelativeTop As Boolean +Private $bRelativeWidth As Boolean +Private $bRelativeHeight As Boolean +Private $bIgnore As Boolean = False +Private $sRange As String + +Public Sub _New(Optional Parent As ReportContainer = Null) + + Dim hRep As Report + + $iMyId = $iLastId + Inc $iLastId + If IsNull(Parent) Then + $iParentId = -1 + $iReportId = $iMyId + + Else + If Parent Is Report Then + hRep = Parent + $iParentId = hRep._Container.id + hRep._Container._Add(Me) + $iReportId = hRep.id + Else + $iParentId = Parent.Id + Parent._Add(Me) + $iReportId = Parent._ReportId + Endif + Endif + +End + +Private Function Id_Read() As Integer + + Return $iMyId + +End + +Private Function Parent_Read() As ReportContainer + + Return ReportControl._ObjectFromId[$iParentId] + +End + +Private Function Left_Read() As String + + Return $sLeft + +End + +Private Sub Left_Write(Value As String) + + $sLeft = Value + Me.Report._LayoutIsDirty = True + +End + +Private Function Top_Read() As String + + Return $sTop + +End + +Private Sub Top_Write(Value As String) + + $sTop = Value + Me.Report._LayoutIsDirty = True + +End + +Private Function Width_Read() As String + + Return $sWidth + +End + +Private Sub Width_Write(Value As String) + + $sWidth = Value + Me.Report._LayoutIsDirty = True + +End + +Private Function Height_Read() As String + + Return $sHeight + +End + +Private Sub Height_Write(Value As String) + + $sHeight = Value + Me.Report._LayoutIsDirty = True + +End + +Private Function Expand_Read() As Boolean + + Return $bExpand + +End + +Private Sub Expand_Write(Value As Boolean) + + $bExpand = Value + Me.Report._LayoutIsDirty = True + +End + +Public Sub _GetSizeHints((AvailableW) As Float, (AvailableH) As Float, TotalWidth As Float, TotalHeight As Float, DataIndex As Integer) As ReportSizeHints + + 'Error.Raise("Something goes wrong the _GetSizeHints is not correctly implemented") + 'Implementaion standart du sizeInt hors autoresize et hbox + ' + + Dim hMyHints As New ReportSizeHints + + If Me._RelativeHeight Then + hMyHints.Height = TotalHeight * Me._Height / 100 + Else + hMyHints.Height = Me._Height + Endif + + If Me._RelativeWidth Then + hMyHints.Width = TotalWidth * Me._Width / 100 + Else + hMyHints.Width = Me._Width + Endif + Return hMyHints + +End + +Public Sub _PaintBeFore((Page) As Integer, (X) As Float, (Y) As Float, (hControl) As TControl, (DataIndex) As Integer) + +End + +Public Sub _Paint(Page As Integer, X As Float, Y As Float, hControl As TControl, DataIndex As Integer) + +End + +Public Sub _PaintFrame((Page) As Integer, (X) As Float, (Y) As Float, (hControl) As TControl, (DataIndex) As Integer) + + Me._Paint(Page, X, Y, hControl, DataIndex) + +End + +Public Sub _PaintAfter((Page) As Integer, (X) As Float, (Y) As Float, (hControl) As TControl, (DataIndex) As Integer) + +End + +Private Function Visible_Read() As Boolean + + Return $iVisible + +End + +Private Sub Visible_Write(Value As Boolean) + + $iVisible = Value + Me.Report._LayoutIsDirty = True + +End + +Public Sub Move(X As Float, Y As Float, W As Float, H As Float) + + $fLeft = X + $fTop = Y + $fWidth = W + $fHeight = H + Me.Report._LayoutIsDirty = True + +End + +Private Function Tag_Read() As Variant + + Return $vTag + +End + +Private Sub Tag_Write(Value As Variant) + + $vTag = Value + +End + +Private Function Font_Read() As Font + + Dim hFont As Font + 'Dim sFont As String + Dim s As String + + If Not $hFont Then + If $iParentId = -1 Then + For Each s In $aFont + If Fonts.Exist(s) Then + hFont = New Font + hFont.Name = s + Break + Endif + Next + If hFont Then + hFont.Size = 12 + Else + hFont = Paint.Font.Copy + Endif + + Else + hFont = _ObjectFromId[$iParentId].font + Endif + Return hFont + Else + Return $hFont + Endif + +End + +Private Sub Font_Write(Value As Font) + + $hFont = Value '.Copy() + Me.Report._LayoutIsDirty = True + +End + +Private Function Padding_Read() As ReportPadding + + Return $hPadding + +End + +Private Sub Padding_Write(Value As ReportPadding) + + $hPadding = Value + Me.Report._LayoutIsDirty = True + +End + +Private Function _Top_Read() As Float + + Return $fTop + +End + +Private Function _Height_Read() As Float + + Return $fHeight + +End + +Private Function _Width_Read() As Float + + Return $fWidth + +End + +Private Function _Left_Read() As Float + + Return $fLeft + +End + +Public Function _SetChildGeometry((X) As Float, (Y) As Float, (W) As Float, (H) As Float, (ContPage) As Integer, (TCont) As TControl, (bInFixed) As Boolean) + +End + +Private Function Autoresize_Read() As Boolean + + Return $bAutoresize + +End + +Private Sub Autoresize_Write(Value As Boolean) + + $bAutoresize = Value + Me.Report._LayoutIsDirty = True + +End + +Private Function _RelativeWidth_Read() As Boolean + + Return $bRelativeWidth + +End + +Private Function _RelativeHeight_Read() As Boolean + + Return $bRelativeHeight + +End + +''Convert recursively string values to unified values in cm +Public Sub _NormalizeUnits() + + Dim hSizeParse As TSizeParse + + 'Left + hSizeParse = New TSizeParse($sLeft, True) + $fLeft = hSizeParse.GetValue() + $bRelativeLeft = hSizeParse.IsRelative() + + 'Right + hSizeParse = New TSizeParse($sTop, True) + $fTop = hSizeParse.GetValue() + $bRelativeTop = hSizeParse.IsRelative() + + 'Width + hSizeParse = New TSizeParse($sWidth, True) + $fWidth = hSizeParse.GetValue() + $bRelativeWidth = hSizeParse.IsRelative() + + 'Height + hSizeParse = New TSizeParse($sHeight, True) + $fHeight = hSizeParse.GetValue() + $bRelativeHeight = hSizeParse.IsRelative() + + 'Padding + ' hSizeParse = New TSizeParse($sPadding, True) + ' $fPadding = hSizeParse.GetValue() + ' $bRelativePadding = hSizeParse.IsRelative() + + hSizeParse = New TSizeParse($hPadding.Left, True) + $hPadding._Left = hSizeParse.GetValue() + + hSizeParse = New TSizeParse($hPadding.Right, True) + $hPadding._Right = hSizeParse.GetValue() + + hSizeParse = New TSizeParse($hPadding.Top, True) + $hPadding._Top = hSizeParse.GetValue() + + hSizeParse = New TSizeParse($hPadding.Bottom, True) + $hPadding._Bottom = hSizeParse.GetValue() + + hSizeParse = New TSizeParse($hMargin.Left, True) + $hMargin._Left = hSizeParse.GetValue() + + hSizeParse = New TSizeParse($hMargin.Right, True) + $hMargin._Right = hSizeParse.GetValue() + + hSizeParse = New TSizeParse($hMargin.Top, True) + $hMargin._Top = hSizeParse.GetValue() + + hSizeParse = New TSizeParse($hMargin.Bottom, True) + $hMargin._Bottom = hSizeParse.GetValue() + + ' + +End + +Private Function Ignore_Read() As Boolean + + Return $bIgnore + +End + +Private Sub Ignore_Write(Value As Boolean) + + $bIgnore = Value + Me.Report._LayoutIsDirty = True + +End + +Private Function Report_Read() As Report + + Return ReportControl._ObjectFromId[$iReportId] + +End + +Private Function _ReportId_Read() As Integer + + Return $iReportId + +End + +Private Function Fixed_Read() As Boolean + + Return $bFixed + +End + +Private Sub Fixed_Write(Value As Boolean) + + $bFixed = Value + +End + +Public Sub _Reset() + + Me._DataIndex = 0 + +End + +Private Function X_Read() As String + + Return $sLeft + +End + +Private Sub X_Write(Value As String) + + $sLeft = Value + +End + +Private Function Y_Read() As String + + Return $sTop + +End + +Private Sub Y_Write(Value As String) + + $sTop = Value + +End + +Private Function Brush_Read() As ReportBrush + + Return $hBrush + +End + +Private Sub Brush_Write(Value As ReportBrush) + + $hBrush = Value + +End + +' Private Function Color_Read() As Integer +' +' Return $iColor +' +' End +' +' Private Sub Color_Write(Value As Integer) +' +' $iColor = Value +' +' End + +Public Function _GetActualBrush(X1 As Integer, Y1 As Integer, X2 As Integer, Y2 As Integer) As PaintBrush + + Dim hBrush As PaintBrush + + If $hBrush Then + hBrush = $hBrush._PaintBrush(X1, Y1, X2, Y2) + Else If $iColor Then + hBrush = Paint.Color($iColor) + Else + Try hBrush = Me.Parent._GetActualBrush(X1, Y1, X2, Y2) + If Not hBrush Then + hBrush = Paint.Color(0) + Endif + Endif + Return hBrush + +End + +Private Sub _ReportId_Write(Value As Integer) + + $iReportId = Value + +End + +Private Function _RelativeLeft_Read() As Boolean + + Return $bRelativeLeft + +End + +Private Function _RelativeTop_Read() As Boolean + + Return $bRelativeTop + +End + +Private Function DataIndex_Read() As Integer + + Return Me._Index 'Return Me._GetIndex() + +End + +Private Function Range_Read() As String + + Return $sRange + +End + +Private Sub Range_Write(Value As String) + + $sRange = Value + +End + +Public Function _GetIndex() As Integer + + Return Me._Index + 'Return Me.Parent._GetIndex() + +End + +Private Function _Index_Read() As Integer + + Return $iIndex + +End + +Private Sub _Index_Write(Value As Integer) + + $iIndex = Value + +End + +Private Function _DataIndex_Read() As Integer + + Return $iDataindex + +End + +Private Sub _DataIndex_Write(Value As Integer) + 'If Me.Tag = "Boite 2" And Value = 0 Then Stop + 'If Me.Report.$iCurPage = 0 Then Print "DataIndex: " & value + 'If Value = 0 Then Stop + + $iDataindex = Value + 'Stop + 'Print "_DataIndex " & Me.Tag & " = " & $iDataindex + +End + +Private Function ForceNewPage_Read() As Boolean + + Return $bForceNewPage + +End + +Private Sub ForceNewPage_Write(Value As Boolean) + + $bForceNewPage = Value + +End + +Public Sub _Free() + +End + +Private Function Margin_Read() As ReportMargin + + Return $hMargin + +End + +Private Sub Margin_Write(Value As ReportMargin) + + $hMargin = Value + +End + +Public Sub Raise() + + _ObjectFromId[$iParentId]._Raise(Me) + +End + +Public Sub Lower() + + _ObjectFromId[$iParentId]._Lower(Me) + +End diff --git a/comp/src/gb.report2/.src/ReportDrawingArea.class b/comp/src/gb.report2/.src/ReportDrawingArea.class new file mode 100644 index 00000000..d9b9deae --- /dev/null +++ b/comp/src/gb.report2/.src/ReportDrawingArea.class @@ -0,0 +1,96 @@ +' Gambas class file + +Export +Inherits ReportFrame +Public Const _Properties As String = "*,Cached" +Public Const _Similar As String = "ReportImage" +Public Const _DefaultEvent As String = "Draw" +Public SizeHints As ReportSizeHints +Property Cached As Boolean + +Private $bCached As Boolean +Private $iOldResolution As Integer +Event Layout(Width As Float, Height As Float, Index As Integer) +Event Draw(Width As Float, Height As Float, Index As Integer) + + +Public Sub _GetSizeHints((AvailableW) As Float, (AvailableH) As Float, (TotalWidth) As Float, (TotalHeight) As Float, DataIndex As Integer) As ReportSizeHints + Dim hMySize As ReportSizeHints + SizeHints = Null + Raise Layout(AvailableW, AvailableH, DataIndex) + + hMySize = Super._GetSizeHints(AvailableW, AvailableH, TotalWidth, TotalHeight, DataIndex) + + If Me.Autoresize Or If (Me._Width = 0 And Me._Height = 0) Then + If SizeHints <> Null Then + hMySize.Width = SizeHints.Width + hMySize.Height = SizeHints.Height + Endif + Endif + Try hMySize.NotFinished = SizeHints.NotFinished + Return hMySize + + +End + + + +Public Sub _Paint(Page As Integer, X As Float, Y As Float, hControl As TControl, DataIndex As Integer) + + 'Dim hRect As Rect + Dim iX, iY, iW, iH As Integer + Dim hImg As Image + + iX = (x + hControl.RealLeft + Me.Report._ToPixels(Me.Padding._Left + Me.Border._Left)) + iY = (y + hControl.RealTop + Me.Report._ToPixels(Me.Padding._Top + Me.Border._Top)) + iW = (hControl.RealWidth - Me.Report._ToPixels(Me.Padding._Left + Me.Padding._Right + Me.Border._Left + Me.Border._Right)) + iH = (hControl.RealHeight - Me.Report._ToPixels(Me.Padding._Top + Me.Padding._Bottom + Me.Border._Top + Me.Border._Bottom)) + Paint.Save + + + If $bCached Then + If $iOldResolution <> Paint.ResolutionX Or If hControl.Cache = Null Then + $iOldResolution = Paint.ResolutionX + hImg = New Image(iW, iH, Color.Transparent) + Paint.Begin(hImg) + Raise Draw(iW, iH, DataIndex) + Paint.End + hControl.Cache = himg + Else + 'If hControl.cache = Null Then Stop + Try hImg = hControl.Cache + Endif + Draw.Image(hImg, iX, iy) + Else + + 'Paint.Translate(iX, iY) + 'Print "Paint.Begin: "; iX;; iY;; iW;; iH;; "(";; Paint.W;; Paint.H; ")" + Paint.Begin(Paint.Device, RectF(iX, iY, iW, iH)) + Raise Draw(iW, iH, DataIndex) + Paint.End + 'Paint.Translate(- iX, - iY) + Endif + Paint.Restore + +End + +Private Function Cached_Read() As Boolean + + Return $bCached + +End + +Private Sub Cached_Write(Value As Boolean) + + $bCached = Value + +End + +' Public Sub SetHints(Width As Integer, Height As Integer, NotFinished As Boolean) +' $hSizeHints = New ReportSizeHints +' $hSizeHints.Width = Width +' $hSizeHints.Height = Height +' $hSizeHints.NotFinished = NotFinished +' +' End + diff --git a/comp/src/gb.report2/.src/ReportFrame.class b/comp/src/gb.report2/.src/ReportFrame.class new file mode 100644 index 00000000..cb15dd20 --- /dev/null +++ b/comp/src/gb.report2/.src/ReportFrame.class @@ -0,0 +1,366 @@ +' Gambas class file + +Export +Create Private +Inherits ReportControl +' Static Private iLevel As Integer +Public Const _Properties As String = "*,Border,Background{ReportBrush},BoxShadow" +Private $hBorder As New ReportBorder +Private $hBackGround As ReportBrush + +Property Border As ReportBorder +Property BoxShadow As ReportBoxShadow + +Private $hBoxShadow As New ReportBoxShadow +Property BackGround As ReportBrush +'Property Read _BorderWidth As Float + +Private Function Border_Read() As ReportBorder + + Return $hBorder + +End + +Private Sub Border_Write(Value As ReportBorder) + + $hBorder = Value + +End + +Public Sub _PaintBefore((Page) As Integer, (X) As Float, (Y) As Float, (hControl) As TControl, (DataIndex) As Integer) + + Dim X1, Y1, X2, Y2, W, H As Float + Dim iBorder As Integer + Dim hShadowActive As Boolean = $hBoxShadow._Active + Dim himgShadow As Image + Dim fSpread As Float + Dim fBlur As Float + Dim fbx As Float + Dim fby As Float + Dim TL1, TL2, TR1, TR2, BR1, BR2, BL1, BL2 As Float + ' If Me.Tag = "**" Then Stop + 'If Me.tag = "*" Then Stop + 'Return + X1 = (x + hControl.RealLeft) + Y1 = (y + hControl.RealTop) + W = hControl.RealWidth + H = hControl.RealHeight + X2 = (x + hControl.RealLeft + W) + Y2 = (y + hControl.RealTop + H) + + 'Clipping + paint.save + + If Report.Debug Then + + Paint.Brush = Paint.Color(Color.Green) + + Paint.Rectangle(X1, Y1, X2 - X1, Y2 - Y1) + Paint.Stroke + + Else + + If $hBorder.RoundCorner._Active Then + TL1 = Me.Report._ToPixels($hBorder.RoundCorner._TopLeft1) + TR1 = Me.Report._ToPixels($hBorder.RoundCorner._TopRight1) + BR1 = Me.Report._ToPixels($hBorder.RoundCorner._BottomRight1) + BL1 = Me.Report._ToPixels($hBorder.RoundCorner._BottomLeft1) + TL2 = Me.Report._ToPixels($hBorder.RoundCorner._TopLeft2) + TR2 = Me.Report._ToPixels($hBorder.RoundCorner._TopRight2) + BR2 = Me.Report._ToPixels($hBorder.RoundCorner._BottomRight2) + BL2 = Me.Report._ToPixels($hBorder.RoundCorner._BottomLeft2) + + If hShadowActive Then + fbx = Me.Report._ToPixels($hBoxShadow._XOffset) + fby = Me.Report._ToPixels($hBoxShadow._YOffset) + fSpread = Me.Report._ToPixels($hBoxShadow._Spread) + If $hBoxShadow._Blur > 0 Then + fBlur = Me.Report._ToPixels($hBoxShadow._Blur) + himgShadow = New Image(W + fSpread * 2 + fBlur * 2, H + fSpread * 2 + fBlur * 2, Color.Transparent) + Paint.Begin(himgShadow) + Paint.Brush = Paint.Color($hBoxShadow.Color) + RoundRect(fBlur, fBlur, Paint.Width - fBlur * 2, Paint.Height - fBlur * 2, [TL1, TR1, BR1, BL1], [TL2, TR2, BR2, BL2]) + Paint.Fill + Paint.End + himgShadow.Fuzzy(fBlur) + Draw.Image(himgShadow, X1 + fbx - fSpread - fBlur, Y1 + fby - fSpread - fBlur) + Else + + Paint.Brush = Paint.Color($hBoxShadow.Color) + RoundRect(X1 + fbx - fSpread, Y1 + fby - fSpread, W + fSpread * 2, H + fSpread * 2, [TL1, TR1, BR1, BL1], [TL2, TR2, BR2, BL2]) + Paint.Fill + Endif + Endif + + iBorder = Me.Report._ToPixels($hBorder._Top) + + RoundRect(X1 + iBorder, Y1 + iBorder, W - iBorder * 2, H - iBorder * 2, [TL1, TR1, BR1, BL1], [TL2, TR2, BR2, BL2]) + + Else + + If hShadowActive Then + fbx = Me.Report._ToPixels($hBoxShadow._XOffset) + fby = Me.Report._ToPixels($hBoxShadow._YOffset) + fSpread = Me.Report._ToPixels($hBoxShadow._Spread) + If $hBoxShadow._Blur > 0 Then + fBlur = Me.Report._ToPixels($hBoxShadow._Blur) + himgShadow = New Image(W + fSpread * 2 + fBlur * 2, H + fSpread * 2 + fBlur * 2, Color.Transparent) + Paint.Begin(himgShadow) + Paint.Brush = Paint.Color($hBoxShadow.Color) + Paint.rectangle(fBlur, fBlur, Paint.Width - fBlur * 2, Paint.Height - fBlur * 2) + Paint.Fill + Paint.End + himgShadow.Fuzzy(fBlur) + Draw.Image(himgShadow, X1 + fbx - fSpread - fBlur, Y1 + fby - fSpread - fBlur) + Else + Paint.Brush = Paint.Color($hBoxShadow.Color) + Paint.Rectangle(X1 + fbx - fSpread, Y1 + fby - fSpread, W + fSpread * 2, H + fSpread * 2) + Paint.Fill + Endif + Endif + + Paint.Rectangle(X1, Y1, X2 - X1, Y2 - Y1) + + Endif + + If Me.BackGround = Null Then + If hShadowActive Then + Paint.Clip(True) + Paint.Brush = _GetActualBackGround(X1, Y1, X2, Y2) + Paint.Fill + Else + paint.Clip + Endif + 'Return + Else + paint.Clip(True) + paint.Brush = Me.BackGround._PaintBrush(X1, Y1, X2, Y2) + Paint.Fill + Endif + + Endif + +End + +Public Function _GetActualBackGround(X1 As Integer, Y1 As Integer, X2 As Integer, Y2 As Integer) As PaintBrush + + Dim hBackground As PaintBrush + + If $hBackGround Then + hBackground = $hBackGround._PaintBrush(X1, Y1, X2, Y2) + Else + Try hBackground = Me.Parent._GetActualBackGround(X1, Y1, X2, Y2) + If Not hBackground Then + hBackground = Paint.Color(Color.White) + Endif + Endif + Return hBackground + +End + + +Public Sub _PaintFrame((Page) As Integer, (X) As Float, (Y) As Float, (hControl) As TControl, (DataIndex) As Integer) + + _PaintBefore(Page, X, Y, hControl, DataIndex) + Me._Paint(Page, X, Y, hControl, DataIndex) + _PaintAfter(Page, X, Y, hControl, DataIndex) + +End + +Public Sub _PaintAfter((Page) As Integer, (X) As Float, (Y) As Float, (hControl) As TControl, (DataIndex) As Integer) + + Dim X1, Y1, X2, Y2, W, H As Float + 'Dim fWidth As Float + + Dim fTopWidth, fBottomWidth, fLeftWidth, fRighWidth As Float + 'Return + 'Fin du clipping + paint.Restore + + X1 = (x + hControl.RealLeft) + Y1 = (y + hControl.RealTop) + X2 = (x + hControl.RealLeft + hControl.RealWidth) + Y2 = (y + hControl.RealTop + hControl.RealHeight) + 'If Me.Tag = "**" Then Stop + If $hBorder.RoundCorner._Active Then + Paint.AntiAlias = True + fLeftWidth = Me.Report._ToPixels($hBorder._Left) / 2 + paint.LineWidth = fLeftWidth * 2 + paint.Brush = $hBorder.Left.Brush._PaintBrush(X1, Y1, X2, Y2) + ' RoundRect(Paint.LineWidth / 2, Paint.LineWidth / 2, Paint.Width - Paint.LineWidth, Paint.Height - Paint.LineWidth, aX, aY) + RoundRect(X1 + fLeftWidth, Y1 + fLeftWidth, hControl.RealWidth - fLeftWidth * 2, hControl.RealHeight - fLeftWidth * 2, + [Me.Report._ToPixels($hBorder.RoundCorner._TopLeft1), + Me.Report._ToPixels($hBorder.RoundCorner._TopRight1), + Me.Report._ToPixels($hBorder.RoundCorner._BottomRight1), + Me.Report._ToPixels($hBorder.RoundCorner._BottomLeft1)], + [Me.Report._ToPixels($hBorder.RoundCorner._TopLeft2), + Me.Report._ToPixels($hBorder.RoundCorner._TopRight2), + Me.Report._ToPixels($hBorder.RoundCorner._BottomRight2), + Me.Report._ToPixels($hBorder.RoundCorner._BottomLeft2)]) + paint.Stroke + + Else + 'Paint.AntiAlias = False + fLeftWidth = Me.Report._ToPixels($hBorder._Left) + fRighWidth = Me.Report._ToPixels($hBorder._Right) + fTopWidth = Me.Report._ToPixels($hBorder._Top) + fBottomWidth = Me.Report._ToPixels($hBorder._Bottom) + + 'If $hBorder.Style <> Line.None Then + + 'fWidth = Me.Report._ToPixels($fBorderWidth) + + 'Paint.Brush = Paint.Color($hBorder.Brush._iValue) + + If fTopWidth > 0 Then + paint.Brush = $hBorder.Top.Brush._PaintBrush(X1, Y1, X2, Y2) + paint.Rectangle(X1, Y1, X2 - X1, fTopWidth) + paint.Fill + Endif + If fRighWidth > 0 Then + paint.Brush = $hBorder.Right.Brush._PaintBrush(X1, Y1, X2, Y2) + paint.Rectangle(X2 - fRighWidth, Y1, fRighWidth, Y2 - Y1) + paint.Fill + Endif + If fBottomWidth > 0 Then + paint.Brush = $hBorder.Bottom.Brush._PaintBrush(X1, Y1, X2, Y2) + paint.Rectangle(X1, Y2 - fBottomWidth, X2 - X1, fBottomWidth) + paint.Fill + Endif + If fLeftWidth > 0 Then + paint.Brush = $hBorder.Left.Brush._PaintBrush(X1, Y1, X2, Y2) + paint.Rectangle(X1, Y1, fLeftWidth, Y2 - Y1) + paint.Fill + Endif + Paint.AntiAlias = True + If Report.Debug Then + Paint.Text(DataIndex, X1, Y1, 30, 30, Align.Center) + Paint.Fill + Endif + Endif + 'Dec iLevel + 'Print String(iLevel, " ") & "restoré" + + 'Endif + +End + +Private Function BackGround_Read() As ReportBrush + + Return $hBackGround + +End + +Private Sub BackGround_Write(Value As ReportBrush) + + $hBackGround = Value + +End + +Public Sub _NormalizeUnits() + + Super._NormalizeUnits() + $hBorder._NormalizeUnits + $hBoxShadow._NormalizeUnits + +End + +Public Sub _GetSizeHints((AvailableW) As Float, (AvailableH) As Float, (TotalWidth) As Float, (TotalHeight) As Float, DataIndex As Integer) As ReportSizeHints + + Dim hMyHints As ReportSizeHints + + hMyHints = Super._GetSizeHints(AvailableW, AvailableH, TotalWidth, TotalHeight, DataIndex) + + If hMyHints.Height <= 0 Then + hMyHints.Height = Me.Padding._Top + Me.Padding._Bottom + Me.Border._Top + Me.Border._Bottom + 'hMyHints.Height += Abs($hBoxShadow._YOffset) + $hBoxShadow._Spread + $hBoxShadow._Blur + Endif + + If hMyHints.Width <= 0 Then + hMyHints.Width = Me.Padding._Left + Me.Padding._Right + Me.Border._Left + Me.Border._Right + 'hMyHints.Width += Abs($hBoxShadow._xOffset) + $hBoxShadow._Spread + $hBoxShadow._Blur + Endif + + Return hMyHints + +End + +Static Private Sub RoundRect(x As Float, y As Float, w As Float, h As Float, Radius_X As Float[], radius_y As Float[]) + + Dim ARC_TO_BEZIER As Float = 0.55228475 + Dim c1, c2 As Float + Dim i As Integer + + For i = 0 To 3 + If radius_x[i] > w - radius_x[i] Then + radius_x[i] = w / 2 + Endif + + If radius_y[i] > h - radius_y[i] Then + radius_y[i] = h / 2 + Endif + + Next + 'approximate(quite Close )the arc using a bezier curve + + ' A**********B + ' H C + ' * * + ' * * + ' G D + ' F**********E + + '-->A + Paint.MoveTo(x + radius_x[0], y) + + '-->B + Paint.LineTo(x + w - radius_x[1], y) + + '-->C + c1 = ARC_TO_BEZIER * radius_x[1] + c2 = ARC_TO_BEZIER * radius_y[1] + Paint.RelCurveTo(c1, 0.0, radius_x[1], c2, radius_x[1], radius_y[1]) + + '-->D + Paint.LineTo(x + w, y + h - radius_y[2]) + + '-->E + c1 = ARC_TO_BEZIER * radius_x[2] + c2 = ARC_TO_BEZIER * radius_y[2] + Paint.RelCurveTo(0.0, c2, c1 - radius_x[2], radius_y[2], -radius_x[2], radius_y[2]) + + '-->F + Paint.LineTo(x + radius_x[3], y + h) + + '-->G + c1 = ARC_TO_BEZIER * radius_x[3] + c2 = ARC_TO_BEZIER * radius_y[3] + Paint.RelCurveTo(-c1, 0, -radius_x[3], -c2, -radius_x[3], -radius_y[3]) + + '-->H + Paint.LineTo(x, y + radius_y[0]) + + '-->A + c1 = ARC_TO_BEZIER * radius_x[0] + c2 = ARC_TO_BEZIER * radius_y[0] + Paint.relcurveto(0.0, -c2, radius_x[0] - c1, -radius_y[0], radius_x[0], -radius_y[0]) + + 'Paint.closepath() + +End + +Private Function BoxShadow_Read() As ReportBoxShadow + + Return $hBoxShadow + +End + +Private Sub BoxShadow_Write(Value As ReportBoxShadow) + + $hBoxShadow = Value + +End + +Public Sub _Free() + +End diff --git a/comp/src/gb.report2/.src/ReportGridView/ReportGridView.class b/comp/src/gb.report2/.src/ReportGridView/ReportGridView.class new file mode 100644 index 00000000..8da07e70 --- /dev/null +++ b/comp/src/gb.report2/.src/ReportGridView/ReportGridView.class @@ -0,0 +1,52 @@ +' Gambas class file + +'Export +Inherits ReportFrame + +Private $hRows As New _ReportGridViewRows +Private $hColumns As New _ReportGridViewColumns +Private $hData As New _ReportGridViewData + +Property Read Columns As _ReportGridViewColumns +Property Read Rows As _ReportGridViewRows +Property Read Data As _ReportGridViewData + +Private Function Columns_Read() As _ReportGridViewColumns + + Return $hColumns + +End + +Private Function Rows_Read() As _ReportGridViewRows + + Return $hRows + +End + +Private Function Data_Read() As _ReportGridViewData + + Return $hData + +End + +Public Sub _Paint(Page As Integer, X As Float, Y As Float, hControl As TControl, DataIndex As Integer) + +End + +Public Sub _GetSizeHints((AvailableW) As Float, (AvailableH) As Float, TotalWidth As Float, TotalHeight As Float, DataIndex As Integer) As ReportSizeHints + + Return Super._GetSizeHints(AvailableW, AvailableH, TotalWidth, TotalHeight, DataIndex) + +End + +Public Sub _NormalizeUnits() + + Super._NormalizeUnits() + + +End + +Public Function _SetChildGeometry((X) As Float, (Y) As Float, (W) As Float, (H) As Float, (ContPage) As Integer, (TCont) As TControl, (bInFixed) As Boolean) + +End + diff --git a/comp/src/gb.report2/.src/ReportGridView/_ReportGridViewColumn.class b/comp/src/gb.report2/.src/ReportGridView/_ReportGridViewColumn.class new file mode 100644 index 00000000..84582cfe --- /dev/null +++ b/comp/src/gb.report2/.src/ReportGridView/_ReportGridViewColumn.class @@ -0,0 +1,96 @@ +' Gambas class file + +Property Width, W As String +Property Text, Title As String +Property Resizable As Boolean +Property Expand As Boolean +Property Alignment As Integer +Property Background As ReportBrush + +Private $sWidth As String +Private $sText As String +Private $bExpand As String +Private $iAlignment As Integer +Private $hBackGround As New ReportBrush +Private $bResizable As Integer +Public _Width As Float + +Public _Column As Integer ''Column Number + +Private Function Width_Read() As String + + Return $sWidth + +End + +Private Sub Width_Write(Value As String) + + $sWidth = Value + +End + +Private Function Text_Read() As String + + Return $sText + +End + +Private Sub Text_Write(Value As String) + + $sText = Value + +End + +Private Function Resizable_Read() As Boolean + + Return $bResizable + +End + +Private Sub Resizable_Write(Value As Boolean) + + $bResizable = Value + +End + +Private Function Expand_Read() As Boolean + + Return $bExpand + +End + +Private Sub Expand_Write(Value As Boolean) + + $bExpand = Value + +End + +Private Function Alignment_Read() As Integer + + Return $iAlignment + +End + +Private Sub Alignment_Write(Value As Integer) + + $iAlignment = Value + +End + +Private Function Background_Read() As ReportBrush + + Return $hBackGround + +End + +Private Sub Background_Write(Value As ReportBrush) + + $hBackGround = Value + +End + +Public Sub _NormalizeUnits() + + _Width = ReportSizeParser($sWidth) + +End diff --git a/comp/src/gb.report2/.src/ReportGridView/_ReportGridViewColumns.class b/comp/src/gb.report2/.src/ReportGridView/_ReportGridViewColumns.class new file mode 100644 index 00000000..cb044baf --- /dev/null +++ b/comp/src/gb.report2/.src/ReportGridView/_ReportGridViewColumns.class @@ -0,0 +1,141 @@ +' Gambas class file + +Property Count As Integer +Property Read Max As Integer +Property Read Height, H As String +Property Resizable As Boolean +Property Width, W As String +Property Sort As Integer +Property Ascending As Boolean + +Public _Width As Float +Public _Height As Float + + +Private $iCount As Integer +Private $sHeight As String +Private $bResizable As String +Private $sWidth As String = "2cm" +Private $iSort As Integer +Private $bAscendig As Boolean + +Private $aColumns As New _ReportGridViewColumn[] + + + + +Public Sub _NormalizeUnits() + + Dim i As Integer + + For i = 0 To $aColumns.Max + $aColumns[i]._NormalizeUnits() + Next + + _Width = ReportSizeParser[$sWidth].GetValue() + _Height = ReportSizeParser[$sHeight].GetValue() +End + + + +Private Function Count_Read() As Integer + + Return $aColumns.Count + +End + +Private Sub Count_Write(Value As Integer) + + Dim iOldCount As Integer = $aColumns.Count + Dim i As Integer + Dim hCol As _ReportGridViewColumn + + If Value = iOldCount Then Return + + Try $aColumns.Resize(Value) + If Error Then Error.Raise("Bad argument") + + If Value > iOldCount Then + + For i = iOldCount To Value - 1 + hcol = New _ReportGridViewColumn + hcol.Width = "1cm" + $aColumns[i] = hcol + Next + + Endif + + For i = iOldCount To Value + + Next + + +End + +Private Function Max_Read() As Integer + + Return $aColumns.Max + +End + +Private Function Height_Read() As String + + Return $sHeight + +End + +Private Function Resizable_Read() As Boolean + + Return $bResizable + +End + +Private Sub Resizable_Write(Value As Boolean) + + $bResizable = Value + +End + +Private Function Width_Read() As String + + Return $sWidth + +End + +Private Sub Width_Write(Value As String) + + $sWidth = Value + +End + +Private Function Sort_Read() As Integer + + Return $iSort + +End + +Private Sub Sort_Write(Value As Integer) + + $iSort = Value + +End + +Private Function Ascending_Read() As Boolean + + Return $bAscendig + +End + +Private Sub Ascending_Write(Value As Boolean) + + $bAscendig = Value + +End + +Private Function GetView() As ReportGridView + + Return Object.Parent(Me) + +End + + diff --git a/comp/src/gb.report2/.src/ReportGridView/_ReportGridViewData.class b/comp/src/gb.report2/.src/ReportGridView/_ReportGridViewData.class new file mode 100644 index 00000000..0a5fa73a --- /dev/null +++ b/comp/src/gb.report2/.src/ReportGridView/_ReportGridViewData.class @@ -0,0 +1,2 @@ +' Gambas class file + diff --git a/comp/src/gb.report2/.src/ReportGridView/_ReportGridViewRow.class b/comp/src/gb.report2/.src/ReportGridView/_ReportGridViewRow.class new file mode 100644 index 00000000..69fe1c11 --- /dev/null +++ b/comp/src/gb.report2/.src/ReportGridView/_ReportGridViewRow.class @@ -0,0 +1,52 @@ +' Gambas class file + +Property Height, H As String +Property Text, Title As String +'Property Border As Border + +Public _Height As Float + + + +Private $sHeight As Integer +Private $sText As Integer + +Event _Foo + +Private Function Height_Read() As String + + Return $sHeight + +End + +Private Sub Height_Write(Value As String) + + $sHeight = Value + +End + +Private Function Text_Read() As String + + Return $sText + +End + +Private Sub Text_Write(Value As String) + + $sText = Value + +End + +Public Sub _NormalizeUnits() + + _Height = ReportSizeParser[$sHeight].GetValue() + +End + + +Private Function GetRows() As _ReportGridViewRows + + Return Object.Parent(Me) + +End + diff --git a/comp/src/gb.report2/.src/ReportGridView/_ReportGridViewRows.class b/comp/src/gb.report2/.src/ReportGridView/_ReportGridViewRows.class new file mode 100644 index 00000000..0d896f04 --- /dev/null +++ b/comp/src/gb.report2/.src/ReportGridView/_ReportGridViewRows.class @@ -0,0 +1,120 @@ +' Gambas class file + +Property Count As Integer +Property Read Max As Integer +Property Width, W As String +Property Resizable As Boolean +Property Height, H As String +'Property Border As Border + +Private $iCount As Integer +Private aLineCol As New Collection +Private $sHeight As String +Private $sWidth As String +Private $bResizable As Boolean + + +Private Function Count_Read() As Integer + + Return $iCount + +End + +Private Sub Count_Write(Value As Integer) + + + Dim i As Integer + Value = Max(1, Value) + If Value < $iCount Then + For i = $iCount DownTo Value + aLineCol[i - 1] = Null + Next + Endif + + $iCount = Value + +End + +Private Function Max_Read() As Integer + + Return $iCount - 1 + +End + +Private Function Width_Read() As String + + Return $sWidth + +End + +Private Sub Width_Write(Value As String) + + $sWidth = Value + +End + +Private Function Resizable_Read() As Boolean + + Return $bResizable + +End + +Private Sub Resizable_Write(Value As Boolean) + + $bResizable = Value + +End + +Private Function Height_Read() As String + + Return $sHeight + +End + +Private Sub Height_Write(Value As String) + + $sHeight = Value + +End + +Public Sub _NormalizeUnits() + + Dim hRow As New _ReportGridViewRow + + For Each hRow In aLineCol + + hRow._NormalizeUnits() + + Next + +End + + +Public Function _GetStrRowHeight(iVal As Integer) As String + + If aLineCol.Exist(iVal) Then + Return aLineCol(iVal).Height + Else + Return $sHeight + Endif + +End + +Public Function _SetStrRowHeight(iVal As Integer, sValue As String) + Dim hRow As _ReportGridViewRow + If iVal < 0 Then Return + If iVal > $iCount - 1 Then Return + + hRow = aLineCol[iVal] + If Not hRow Then + hRow = New _ReportGridViewRow + aLineCol[iVal] = hRow + Endif + hRow._Row = iVal + hRow.Height = sValue + + + +End + + diff --git a/comp/src/gb.report2/.src/ReportHBox.class b/comp/src/gb.report2/.src/ReportHBox.class new file mode 100644 index 00000000..95bff9e9 --- /dev/null +++ b/comp/src/gb.report2/.src/ReportHBox.class @@ -0,0 +1,21 @@ +' Gambas class file + +Export + +Inherits ReportContainer + +Public Const _Properties As String = "*" +Public Const _Similar As String = "ReportVBox" +Public Const _DefaultArrangement As String = "H" + +Public Sub _new() + + Super._Arrangement = Arrange.Horizontal + +End + +Public Sub _Free() + + Super._Free + +End diff --git a/comp/src/gb.report2/.src/ReportImage.class b/comp/src/gb.report2/.src/ReportImage.class new file mode 100644 index 00000000..57ca16d0 --- /dev/null +++ b/comp/src/gb.report2/.src/ReportImage.class @@ -0,0 +1,200 @@ +' Gambas class file + +Export +Inherits ReportFrame + +Public Const _Properties As String = "*,Stretch{Report.None;Proportional;Fill}=Proportional,Alignment{Align.*},Image{Image}" +Public Const _Similar As String = "ReportTextLabel" +Public Const _DefaultEvent As String = "Data" + +Private $iAlignment As Integer = Align.Normal +Private $hPic As Image +Private $iStretchMode As Integer = Report.Proportional + +Property Alignment As Integer +Property Image As Image +Property Stretch As Integer + +Public Data As Image + +Event Data(Index As Integer) + +Public Sub _GetSizeHints((AvailableW) As Float, (AvailableH) As Float, (TotalWidth) As Float, (TotalHeight) As Float, DataIndex As Integer) As ReportSizeHints + + Dim hMyHints As New ReportSizeHints + + Dim hPic As Image + Dim fRatio As Float + 'Dim fSize As Float + + hMyHints = Super._GetSizeHints(AvailableW, AvailableH, TotalWidth, TotalHeight, DataIndex) + + If Me.Autoresize Or If (Me._Width = 0 And Me._Height = 0) Then + If $hpic Then + hpic = $hpic + Else + Raise Data(DataIndex) + hpic = Data + Endif + + If hpic Then + If Me.Stretch = Report.Proportional Then + If hpic.Width > hpic.Height Then + fRatio = hpic.Height / hpic.Width + + hMyHints.Width = Min(Report.UnitToInch(hpic.Width, "px"), AvailableW) + hMyHints.Height = ((hMyHints.Width - (Me.Border._Width + Me.Padding._Width)) * fRatio) + (Me.Padding._Height + Me.Border._Height) + Else + fRatio = hpic.Width / hpic.Height + hMyHints.Height = Min(Report.UnitToInch(hpic.Height, "px"), AvailableH) + hMyHints.Width = ((hMyHints.Height - (Me.Border._Height + Me.Padding._Height)) * fRatio) + (Me.Border._Width + Me.Padding._Width) + Endif + Else + hMyHints.Width = Max(hMyHints.Width, Me.Padding._Left + Report.UnitToInch(hpic.Width, "px") + Me.Padding._Right) 'Report.UnitToInch(hpic.Width, "px") + Me.Padding._Right) + hMyHints.Height = Max(hMyHints.Height, Me.Padding._Top + Report.UnitToInch(hpic.Height, "px") + Me.Padding._Bottom) 'Report.UnitToInch(hpic.Height, "px") + Me.Padding._Bottom) + Endif + + Endif + + Endif + + Return hMyHints + +End + +Public Sub _Paint(Page As Integer, X As Float, Y As Float, hControl As TControl, DataIndex As Integer) + + Dim ix, iy As Float + 'Dim hBrush As PaintBrush + Dim hPic As Image + + Dim w, h As Float + + ix = x + hControl.RealLeft '+ Me.Report._ToPixels(Me.Padding._Left) + iy = y + hControl.RealTop '+ Me.Report._ToPixels(Me.Padding._Top) + + If Not $hpic Then + Raise Data(DataIndex) + hpic = Data + If Not hPic Then Return + Else + hPic = $hpic + Endif + + Paint.Save + Paint.Rectangle(ix, iy, hControl.RealWidth, hControl.RealHeight) + Paint.Clip + + '$hPic = $hPic.Stretch(hControl.RealWidth, hControl.RealHeight) + + 'hBrush = Paint.Image(hpic) + + If Me.Stretch = Report.Fill Then + iX += Me.Report._ToPixels(Me.Padding._Left + Me.Border._Left) + iY += Me.Report._ToPixels(Me.Padding._Top + Me.Border._Top) + w = (hControl.RealWidth - Me.Report._ToPixels(Me.Padding._Left + Me.Padding._Right + Me.Border._Left + Me.Border._Right)) + h = (hControl.RealHeight - Me.Report._ToPixels(Me.Padding._Top + Me.Padding._Bottom + Me.Border._Top + Me.Border._Bottom)) + + Paint.DrawImage(hpic, ix, iy, w, h - 1) + + Else + + If $iStretchMode = Report.Proportional Then + 'on détermine la partie prédominante + If hpic.Width >= hpic.Height + 'C'est la largeur + 'on détermine une hauteur en fonction de la largeur connue + w = hControl.RealWidth - Me.Report._ToPixels(Me.Padding._Width) + h = hPic.H / hpic.W * w + 'si h> a la place disponible alors on adapte en fonction de h en faite + If h > (hControl.RealHeight - Me.Report._ToPixels(Me.Padding._Height)) Then + h = (hControl.RealHeight - Me.Report._ToPixels(Me.Padding._Height)) + w = hpic.w / hpic.H * h + Endif + + Else + 'C'est la hauteur + h = (hControl.RealHeight - Me.Report._ToPixels(Me.Padding._Height)) + w = hpic.w / hpic.H * h + 'si w> la place disponible alors on adapte en fonction de w en faite + If w > (hControl.RealWidth - Me.Report._ToPixels(Me.Padding._Width)) Then + w = hControl.RealWidth - Me.Report._ToPixels(Me.Padding._Width) + h = hPic.H / hpic.W * w + Endif + Endif + + Else + w = hpic.Width + h = hpic.H + + Endif + + Select Case $iAlignment + Case Align.Normal, Align.TopLeft, Align.Left, Align.BottomLeft + 'Gauche + ix += Me.Report._ToPixels(Me.Padding._Left) + Case Align.Bottom, Align.Center, Align.Top + 'centrée + ix += (hControl.RealWidth - w) / 2 + + Case Align.TopRight, Align.Right, Align.BottomRight + 'Droite + ix += hControl.RealWidth - Me.Report._ToPixels(Me.Padding._Right) - w + End Select + + Select Case $iAlignment + Case Align.TopLeft, Align.Top, Align.TopRight + 'Haut + iy += Me.Report._ToPixels(Me.Padding._Top) + Case Align.Left, Align.Center, Align.Right + 'Milieu + iy += (hControl.RealHeight - h) / 2 + Case Align.BottomLeft, Align.Bottom, Align.BottomRight + iY += hControl.RealHeight - Me.Report._ToPixels(Me.Padding._Bottom) - h + End Select + + Paint.DrawImage(hpic, ix, iy, w, h - 1) + + Endif + Paint.Fill + Paint.Restore +End + +Private Function Image_Read() As Image + + Return $hPic + +End + +Private Sub Image_Write(Value As Image) + + $hPic = Value + 'If Left(Me.Width, 1) = "0" Then Me.Width = $hpic.Width & " px" + 'If Left(Me.Height, 1) = "0" Then Me.Height = $hpic.Height & " px" + +End + +Private Function Alignment_Read() As Integer + + Return $iAlignment + +End + +Private Sub Alignment_Write(Value As Integer) + + $iAlignment = Value + +End + +Private Function Stretch_Read() As Integer + + Return $iStretchMode + +End + +Private Sub Stretch_Write(Value As Integer) + + $iStretchMode = Value + +End + diff --git a/comp/src/gb.report2/.src/ReportLabel.class b/comp/src/gb.report2/.src/ReportLabel.class new file mode 100644 index 00000000..7bac5c9c --- /dev/null +++ b/comp/src/gb.report2/.src/ReportLabel.class @@ -0,0 +1,239 @@ +' Gambas class file + +Export +Inherits ReportFrame + +Public Const _Properties As String = "*,Text,Format,Alignment{Align.*},Rotate{Angle:Degrees},UseField" '"*,Text,Key,Format,Alignment{Align.*},UseField" +Public Const _Similar As String = "ReportTextLabel" +Public Const _DefaultEvent As String = "Data" +Public Data As String + +Property Text As String +Property Format As String +Property Alignment As Integer +Property Rotate As Float +Property UseField As Boolean +Private $sText As String +Private $sFormat As String +Private $iAlignment As Integer +Private $fAngle As Integer +Private $bUseField As Boolean +Private $hEval As _RepExp +Static Private $iPage As Integer +Static Private $iIndex As Integer +Event Data(Index As Integer) + +Public Sub _GetSizeHints((AvailableW) As Float, (AvailableH) As Float, (TotalWidth) As Float, (TotalHeight) As Float, DataIndex As Integer) As ReportSizeHints + + Dim hSizeHint As ReportSizeHints + Dim hRect As RectF + Dim fWidth, fHeight As Float + Dim sText As String + Dim hExt As PaintExtents + 'Obtenir la taille de l'objet de base en tenant compte + 'de padding et des dimensions fournies + hSizeHint = Super._GetSizeHints(AvailableW, AvailableH, TotalWidth, TotalHeight, DataIndex) + 'Inutile de chercher a connaitre la taille réclamée par l'objet si elle est + 'soit définie par le parent, soit imposée par l'utilisateur + + If $sText Begins "=" Then + If Not $hEval Or If $hEval.Text <> Right($sText, -1) Then + $hEval = New _RepExp As "Eval" + $hEval.Text = Right($sText, -1) + Endif + Endif + + If Me.Autoresize Or If (Me._Width = 0 And Me._Height = 0) Then + 'Sinon on cherche la tailmle du texte + + If $sText Then + sText = $sText + Else + + Raise Data(DataIndex) + sText = Data + Endif + + + If $sFormat Then + Try sText = Format(sText, $sFormat) + Endif + + + + + Paint.Font = Me.Font + 'If sText = "Gambas" Then Stop + If $fAngle = 0 Then + hRect = Paint.TextSize(sText) + hSizeHint = New ReportSizeHints + fWidth = Me.Border._Left + Me.Padding._Left + Me.Report._FromPixels(hRect.Width) + Me.Padding._Right + Me.Border._Right + fHeight = Me.Border._Top + Me.Padding._Top + Me.Report._FromPixels(hRect.Height) + Me.Padding._Bottom + Me.Border._Bottom + Else + Paint.Save + Paint.Rotate(Rad($fAngle)) + Paint.Text(sText, 0, 0) + hExt = Paint.PathExtents + fWidth = Me.Border._Left + Me.Padding._Left + Me.Report._FromPixels(hExt.Width) + Me.Padding._Right + Me.Border._Right + fHeight = Me.Border._Top + Me.Padding._Top + Me.Report._FromPixels(hExt.Height) + Me.Padding._Bottom + Me.Border._Bottom + Paint.Restore + Endif + + Endif + + hSizeHint.Width = Max(hSizeHint.Width, fWidth) + hSizeHint.Height = Max(hSizeHint.Height, fHeight) + + Return hSizeHint + +End + +Public Sub _Paint(Page As Integer, X As Float, Y As Float, hControl As TControl, DataIndex As Integer) + + Dim sTempText As Variant + Dim iX, iY, iW, iH As Integer + + $iPage = Page + $iIndex = DataIndex + + If $sText Then + sTempText = $sText + Else + Raise Data(DataIndex) + sTempText = Data + Endif + + If sTempText Begins "=" Then + $hEval.Compile() + sTempText = $hEval.Value + Endif + + If $sFormat Then + Try sTempText = Format(sTempText, $sFormat) + Endif + + If $bUseField Then + sTempText = DecodeText(sTempText, Page) + Endif + + iX = (x + hControl.RealLeft + Me.Report._ToPixels(Me.Padding._Left + Me.Border._Left)) + iY = (y + hControl.RealTop + Me.Report._ToPixels(Me.Padding._Top + Me.Border._Top)) + iW = (hControl.RealWidth - Me.Report._ToPixels(Me.Padding._Left + Me.Padding._Right + Me.Border._Left + Me.Border._Right)) + + iH = (hControl.RealHeight - Me.Report._ToPixels(Me.Padding._Top + Me.Padding._Bottom + Me.Border._Top + Me.Border._Bottom)) + + Paint.Brush = Me._GetActualBrush(iX, iY, iX + hControl.RealWidth, iY + hControl.RealHeight) + + If Report.Debug Then + + Paint.Brush = Paint.Color(Color.Red) + Paint.Rectangle(ix, iy, iw, ih) + Paint.Stroke + + Endif + + 'Set the Font if it is initialized + + Paint.Font = Me.Font + + If $fAngle = 0.0 Then + + Paint.Text(sTempText, iX, iY, iW, iH, $iAlignment) + Else + Paint.Translate(iX + iW / 2, iY + iH / 2) + Paint.Rotate(Rad($fAngle)) + Paint.Translate(-(iX + iW / 2), -(iY + iH / 2)) + Paint.Text(sTempText, iX, iY, iW, iH, Align.Center) + + Endif + Paint.Fill + +End + +Private Function DecodeText(sText As String, Optional Page As Integer, Optional ForSize As Boolean = False) As String + + If ForSize Then + If InStr(sText, "$PAGE") Then sText = Replace(sText, "$PAGE", "999") + If InStr(sText, "$NPAGE") Then sText = Replace(sText, "$NPAGE", "999") + Else + If InStr(sText, "$PAGE") Then sText = Replace(sText, "$PAGE", Str(Page + 1)) + If InStr(sText, "$NPAGE") Then sText = Replace(sText, "$NPAGE", Str(Me.Report.PageCount)) + Endif + + Return sText + +End + +Private Function Text_Read() As String + + Return $sText + +End + +Private Sub Text_Write(Value As String) + + $sText = Value + +End + +Private Function Format_Read() As String + + Return $sFormat + +End + +Private Sub Format_Write(Value As String) + + $sFormat = Value + +End + +Private Function Alignment_Read() As Integer + + Return $iAlignment + +End + +Private Sub Alignment_Write(Value As Integer) + + $iAlignment = Value + +End + +Private Function Rotate_Read() As Float + + Return $fAngle + +End + +Private Sub Rotate_Write(Value As Float) + + $fAngle = Value + +End + +Private Function UseField_Read() As Boolean + + Return $bUseField + +End + +Private Sub UseField_Write(Value As Boolean) + + $bUseField = Value + +End + +Public Sub Eval_Data(Value As String) + 'Print "appel" + Select Case LCase(Value) + Case "page" + Last.Data = $iPage + 1 + Case "index" + Last.Data = $iIndex + Case "pages" + Last.Data = Me.Report.PageCount + End Select + +End + diff --git a/comp/src/gb.report2/.src/ReportLine.class b/comp/src/gb.report2/.src/ReportLine.class new file mode 100644 index 00000000..61183082 --- /dev/null +++ b/comp/src/gb.report2/.src/ReportLine.class @@ -0,0 +1,127 @@ +' Gambas class file + +Export +Inherits ReportControl + +Public Const _Properties As String = "*,Direction{Align.TopLeft;Top;TopRight;Left;Right;BottomLeft;Bottom;BottomRight}=BottomRight,LineWidth{ReportCoord}=2 px" +Public Const _Similar As String = "ReportTextLabel" +Property Direction As Integer + +Private $fLineWidth As Float = 0.1 + +Private $iLineStyle As Integer = Line.solid +Private $iDirection As Integer = Align.BottomRight +Private $sLineWidth As String = "2px" +Property LineWidth As String +Property LineStyle As Integer + +Public Sub _new() + + Me.Height = "1cm" + Me.Width = "1cm" + +End + +Private Function LineWidth_Read() As String + + Return $sLineWidth + +End + +Private Sub LineWidth_Write(Value As String) + + $sLineWidth = Value + +End + +Public Sub _NormalizeUnits() + + Dim hSizeParse As TSizeParse + + Super._NormalizeUnits() + + hSizeParse = New TSizeParse($sLineWidth) + $fLineWidth = hSizeParse.GetValue() + +End + +Public Sub _GetSizeHints((AvailableW) As Float, (AvailableH) As Float, (TotalWidth) As Float, (TotalHeight) As Float, DataIndex As Integer) As ReportSizeHints + + Dim hMyHints As New ReportSizeHints + + hMyHints.Height = Me._Height + hMyHints.Width = Me._Width + Return hMyHints + +End + +Public Sub _Paint(Page As Integer, X As Float, Y As Float, hControl As TControl, DataIndex As Integer) + + Dim iX, iY, W, H, W2, H2 As Integer + + If Me.LineStyle = Line.None Then Return + If Me.LineStyle <> Line.Solid Then Paint.Dash = MUtil.GetBorder(Me.LineStyle) + Paint.LineWidth = Me.Report._ToPixels($fLineWidth) + + iX = (x + hControl.RealLeft + Me.Report._ToPixels(Me.Padding._Left)) + iY = (y + hControl.RealTop + Me.Report._ToPixels(Me.Padding._Top)) + + W = iX + hControl.RealWidth - Me.Report._ToPixels(Me.Padding._Right) + H = iY + hControl.RealHeight - Me.Report._ToPixels(Me.Padding._Bottom) + Paint.Brush = Me._GetActualBrush(iX, iY, W, H) + W2 = (iX + W) / 2 + H2 = (iY + H) / 2 + Select Case $iDirection + Case Align.TopLeft + Paint.MoveTo(W, H) + Paint.LineTo(iX, iY) + Case Align.Top + Paint.MoveTo(W2, H) + Paint.LineTo(W2, iY) + Case Align.TopRight + Paint.MoveTo(iX, H) + Paint.LineTo(W, iY) + Case Align.Left + Paint.MoveTo(W, H2) + Paint.LineTo(iX, H2) + Case Align.Right + Paint.MoveTo(iX, H2) + Paint.LineTo(W, H2) + Case Align.BottomLeft + Paint.MoveTo(W, iY) + Paint.LineTo(iX, H) + Case Align.Bottom + Paint.MoveTo(W2, iY) + Paint.LineTo(W2, H) + Case Align.BottomRight + Paint.MoveTo(iX, iY) + Paint.LineTo(W, H) + End Select + + Paint.Stroke + +End + +Private Function LineStyle_Read() As Integer + + Return $iLineStyle + +End + +Private Sub LineStyle_Write(Value As Integer) + + $iLineStyle = Value + +End + +Private Function Direction_Read() As Integer + + Return $iDirection + +End + +Private Sub Direction_Write(Value As Integer) + + $iDirection = Value + +End diff --git a/comp/src/gb.report2/.src/ReportPageBreak.class b/comp/src/gb.report2/.src/ReportPageBreak.class new file mode 100644 index 00000000..ea95ef98 --- /dev/null +++ b/comp/src/gb.report2/.src/ReportPageBreak.class @@ -0,0 +1,6 @@ +' Gambas class file + +Export +Inherits ReportControl + +Public Const _Properties As String = "-*" diff --git a/comp/src/gb.report2/.src/ReportPanel.class b/comp/src/gb.report2/.src/ReportPanel.class new file mode 100644 index 00000000..f0ba1039 --- /dev/null +++ b/comp/src/gb.report2/.src/ReportPanel.class @@ -0,0 +1,25 @@ +' Gambas class file + +Export +Inherits ReportContainer +Public Const _Properties As String = "*,Arrangement{Arrange.None;Vertical;Horizontal}=None" +Property Arrangement As Integer + +Public Sub New() + + Super._Arrangement = Arrange.None + +End + + +Private Function Arrangement_Read() As Integer + + Return Super._Arrangement + +End + +Private Sub Arrangement_Write(Value As Integer) + + Super._Arrangement = Value + +End diff --git a/comp/src/gb.report2/.src/ReportSection.class b/comp/src/gb.report2/.src/ReportSection.class new file mode 100644 index 00000000..94224b5b --- /dev/null +++ b/comp/src/gb.report2/.src/ReportSection.class @@ -0,0 +1,23 @@ +' Gambas class file + +Export +Inherits ReportVBox +Public Const _Properties As String = "*,Text" +Property Text As String +Private $sText As String + +Private Function Text_Read() As String + + Return $sText + +End + +Private Sub Text_Write(Value As String) + + $sText = Value + +End + +Public Sub _Free() + +End diff --git a/comp/src/gb.report2/.src/ReportSvgImage.class b/comp/src/gb.report2/.src/ReportSvgImage.class new file mode 100644 index 00000000..31820c81 --- /dev/null +++ b/comp/src/gb.report2/.src/ReportSvgImage.class @@ -0,0 +1,200 @@ +' Gambas class file + +Export +Inherits ReportFrame + +Private $hPic As SvgImage +Private $iStretchMode As Integer = Report.Proportional +Private $iAlignment As Integer = Align.Normal +'Private $sPath As String +Public Const _Properties As String = "*,Stretch{Report.None;Proportional;Fill}=Proportional,Alignment{Align.*},Image{SvgImage}" +Public Const _Similar As String = "ReportTextLabel" +Public Data As SvgImage +Property Image As SvgImage +Property Stretch As Integer +Property Alignment As Integer +Event Data(Index As Integer) + +Public Sub _GetSizeHints((AvailableW) As Float, (AvailableH) As Float, (TotalWidth) As Float, (TotalHeight) As Float, DataIndex As Integer) As ReportSizeHints + + Dim hMyHints As New ReportSizeHints + Dim fRatio As Float + 'Dim h As Float = IIf(Me._Height > AvailableH, AvailableH, Me._Height) + 'Dim w As Float = IIf(Me._Width > AvailableW, AvailableW, Me._Width) + + Dim hPic As SvgImage + + hMyHints = Super._GetSizeHints(AvailableW, AvailableH, TotalWidth, TotalWidth, DataIndex) + + If Me.Autoresize Or If (Me._Width = 0 And Me._Height = 0) Then + If $hpic Then + hpic = $hpic + Else + Raise Data(DataIndex) + hpic = Data + Endif + + If hpic Then + If Me.Stretch = Report.Proportional Then + If hpic.Width > hpic.Height Then + fRatio = hpic.Height / hpic.Width + + hMyHints.Width = Min(Report.UnitToInch(hpic.Width, "px"), AvailableW) + hMyHints.Height = ((hMyHints.Width - (Me.Border._Width + Me.Padding._Width)) * fRatio) + (Me.Padding._Height + Me.Border._Height) + Else + fRatio = hpic.Width / hpic.Height + hMyHints.Height = Min(Report.UnitToInch(hpic.Height, "px"), AvailableH) + hMyHints.Width = ((hMyHints.Height - (Me.Border._Height + Me.Padding._Height)) * fRatio) + (Me.Border._Width + Me.Padding._Width) + Endif + Else + hMyHints.Width = Max(hMyHints.Width, Me.Padding._Left + Report.UnitToInch(hpic.Width, "px") + Me.Padding._Right) 'Report.UnitToInch(hpic.Width, "px") + Me.Padding._Right) + hMyHints.Height = Max(hMyHints.Height, Me.Padding._Top + Report.UnitToInch(hpic.Height, "px") + Me.Padding._Bottom) 'Report.UnitToInch(hpic.Height, "px") + Me.Padding._Bottom) + Endif + + Endif + Endif + + Return hMyHints + +End + +Public Sub _Paint(Page As Integer, X As Float, Y As Float, hControl As TControl, DataIndex As Integer) + + Dim ix, iy As Float + 'Dim hBrush As PaintBrush + Dim hPic As SvgImage + + Dim w, h As Float + + ix = x + hControl.RealLeft '+ Me.Report._ToPixels(Me.Padding._Left) + iy = y + hControl.RealTop '+ Me.Report._ToPixels(Me.Padding._Top) + + If Not $hpic Then + Raise Data(DataIndex) + hpic = Data + If Not hPic Then Return + Else + hPic = $hpic + Endif + Paint.Save + Paint.Rectangle(ix, iy, hControl.RealWidth, hControl.RealHeight) + Paint.Clip + '$hPic = $hPic.Stretch(hControl.RealWidth, hControl.RealHeight) + + 'hBrush = Paint.Image(hpic) + + If $iStretchMode = Report.Fill Then + iX += Me.Report._ToPixels(Me.Padding._Left + Me.Border._Left) + iY += Me.Report._ToPixels(Me.Padding._Top + Me.Border._Top) + w = (hControl.RealWidth - Me.Report._ToPixels(Me.Padding._Left + Me.Padding._Right + Me.Border._Left + Me.Border._Right)) + h = (hControl.RealHeight - Me.Report._ToPixels(Me.Padding._Top + Me.Padding._Bottom + Me.Border._Top + Me.Border._Bottom)) + ' hBrush.Translate(ix, iy - 1) + 'hBrush.Scale(w / hPic.Width, h / hPic.Height) + 'Paint.Brush = hBrush + hpic.Width = w + hpic.Height = h + Paint.MoveTo(ix, iy) + hpic.Paint + 'Paint.Rectangle(ix, iy, w, h) + Else + + If $iStretchMode = Report.Proportional Then + 'on détermine la partie prédominante + If hPic.Width >= hPic.Height + 'C'est la largeur + 'on détermine une hauteur en fonction de la largeur connue + w = hControl.RealWidth - Me.Report._ToPixels(Me.Padding._Width) + h = hPic.Height / hPic.Width * w + 'si h> a la place disponible alors on adapte en fonction de h en faite + If h > (hControl.RealHeight - Me.Report._ToPixels(Me.Padding._Height)) Then + h = (hControl.RealHeight - Me.Report._ToPixels(Me.Padding._Height)) + w = hPic.Width / hPic.Height * h + Endif + + Else + 'C'est la hauteur + h = (hControl.RealHeight - Me.Report._ToPixels(Me.Padding._Height)) + w = hPic.Width / hPic.Height * h + 'si w> la place disponible alors on adapte en fonction de w en faite + If w > (hControl.RealWidth - Me.Report._ToPixels(Me.Padding._Width)) Then + w = hControl.RealWidth - Me.Report._ToPixels(Me.Padding._Width) + h = hPic.Height / hPic.Width * w + Endif + Endif + + Else + w = hPic.Width + h = hPic.Height + + Endif + + Select Case $iAlignment + Case Align.Normal, Align.TopLeft, Align.Left, Align.BottomLeft + 'Gauche + ix += Me.Report._ToPixels(Me.Padding._Left) + Case Align.Bottom, Align.Center, Align.Top + 'centrée + ix += (hControl.RealWidth - w) / 2 + + Case Align.TopRight, Align.Right, Align.BottomRight + 'Droite + ix += hControl.RealWidth - Me.Report._ToPixels(Me.Padding._Right) - w + End Select + + Select Case $iAlignment + Case Align.TopLeft, Align.Top, Align.TopRight + 'Haut + iy += Me.Report._ToPixels(Me.Padding._Top) + Case Align.Left, Align.Center, Align.Right + 'Milieu + iy += (hControl.RealHeight - h) / 2 + Case Align.BottomLeft, Align.Bottom, Align.BottomRight + iY += hControl.RealHeight - Me.Report._ToPixels(Me.Padding._Bottom) - h + End Select + 'hBrush.Translate(ix, iy - 1) + hpic.Width = W + hPic.Height = H + Paint.MoveTo(iX, iY) + hpic.Paint + 'hBrush.Scale(w / hPic.Width, h / hPic.Height) + 'Paint.Brush = hBrush + 'Paint.Rectangle(ix, iy, w, h - 1) + Endif + Paint.Restore +End + +Private Function Image_Read() As SvgImage + + Return $hPic + +End + +Private Sub Image_Write(Value As SvgImage) + + $hPic = Value + +End + +Private Function Stretch_Read() As Integer + + Return $iStretchMode + +End + +Private Sub Stretch_Write(Value As Integer) + + $iStretchMode = Value + +End + +Private Function Alignment_Read() As Integer + + Return $iAlignment + +End + +Private Sub Alignment_Write(Value As Integer) + + $iAlignment = Value + +End diff --git a/comp/src/gb.report2/.src/ReportTextLabel.class b/comp/src/gb.report2/.src/ReportTextLabel.class new file mode 100644 index 00000000..9f121ffe --- /dev/null +++ b/comp/src/gb.report2/.src/ReportTextLabel.class @@ -0,0 +1,143 @@ +' Gambas class file + +Export +Inherits ReportFrame + +Public Const _Properties As String = "*,Text,Alignment{Align.*}" '"*,Text,Key,Format,Alignment{Align.*},UseField" +Public Const _Similar As String = "ReportTextLabel" +Public Const _DefaultEvent As String = "Data" +Public Data As String + +Property Text As String +Property Alignment As Integer + +Private $sText As String +Private $iAlignment As Integer + +Event Data(Index As Integer) + +Public Sub _GetSizeHints((AvailableW) As Float, (AvailableH) As Float, (TotalWidth) As Float, (TotalHeight) As Float, DataIndex As Integer) As ReportSizeHints + + Dim hSizeHint As ReportSizeHints + Dim hRect As RectF + Dim fWidth, fHeight As Float + Dim sText As String + 'Dim hExt As PaintExtents + 'Obtenir la taille de l'objet de base en tenant compte + 'de padding et des dimensions fournies + hSizeHint = Super._GetSizeHints(AvailableW, AvailableH, TotalWidth, TotalHeight, DataIndex) + 'Inutile de chercher a connaitre la taille réclamée par l'objet si elle est + 'soit définie par le parent, soit imposée par l'utilisateur + + If Me.Autoresize Or If (Me._Width = 0 And Me._Height = 0) Then + 'Sinon on cherche la tailmle du texte + + If $sText Then + sText = $sText + Else + Raise Data(DataIndex) + sText = Data + Endif + + Paint.Font = Me.Font + 'If sText = "Gambas" Then Stop + 'If $fAngle = 0 Then + hRect = Paint.RichTextSize(sText) + hSizeHint = New ReportSizeHints + fWidth = Me.Border._Left + Me.Padding._Left + Me.Report._FromPixels(hRect.Width) + Me.Padding._Right + Me.Border._Right + fHeight = Me.Border._Top + Me.Padding._Top + Me.Report._FromPixels(hRect.Height) + Me.Padding._Bottom + Me.Border._Bottom + + 'Endif + + Endif + + hSizeHint.Width = Max(hSizeHint.Width, fWidth) + hSizeHint.Height = Max(hSizeHint.Height, fHeight) + + Return hSizeHint + +End + +Public Sub _Paint(Page As Integer, X As Float, Y As Float, hControl As TControl, DataIndex As Integer) + + Dim sTempText As Variant + Dim iX, iY, iW, iH As Integer + + If $sText Then + sTempText = $sText + Else + Raise Data(DataIndex) + sTempText = Data + Endif + + iX = (x + hControl.RealLeft + Me.Report._ToPixels(Me.Padding._Left + Me.Border._Left)) + iY = (y + hControl.RealTop + Me.Report._ToPixels(Me.Padding._Top + Me.Border._Top)) + iW = (hControl.RealWidth - Me.Report._ToPixels(Me.Padding._Left + Me.Padding._Right + Me.Border._Left + Me.Border._Right)) + + iH = (hControl.RealHeight - Me.Report._ToPixels(Me.Padding._Top + Me.Padding._Bottom + Me.Border._Top + Me.Border._Bottom)) + + If Report.Debug Then + + Paint.Brush = Paint.Color(Color.Red) + Paint.Rectangle(ix, iy, iw, ih) + Paint.Stroke + + Endif + + 'Set the Font if it is initialized + + 'Paint.Font = Me.Font + 'If InStr($sText, "color=") Then + Draw.Font = Me.Font + Paint.Brush = Me._GetActualBrush(iX, iY, iX + hControl.RealWidth, iY + hControl.RealHeight) + Draw.RichText(sTempText, iX, iY, iW, iH, $iAlignment) + 'Else + ' Paint.Font = Me.Font + ' Paint.RichText(sTempText, iX, iY, iW, iH, $iAlignment) + ' Endif + 'Paint.Fill + +End + +Private Function DecodeText(sText As String, Optional Page As Integer, Optional ForSize As Boolean = False) As String + + If ForSize Then + If InStr(sText, "$PAGE") Then sText = Replace(sText, "$PAGE", "999") + If InStr(sText, "$NPAGE") Then sText = Replace(sText, "$NPAGE", "999") + Else + If InStr(sText, "$PAGE") Then sText = Replace(sText, "$PAGE", Str(Page + 1)) + If InStr(sText, "$NPAGE") Then sText = Replace(sText, "$NPAGE", Str(Me.Report.PageCount)) + Endif + + Return sText + +End + +Private Function Text_Read() As String + + Return $sText + +End + +Private Sub Text_Write(Value As String) + + $sText = Value + +End + + + +Private Function Alignment_Read() As Integer + + Return $iAlignment + +End + +Private Sub Alignment_Write(Value As Integer) + + $iAlignment = Value + +End + + + diff --git a/comp/src/gb.report2/.src/ReportVBox.class b/comp/src/gb.report2/.src/ReportVBox.class new file mode 100644 index 00000000..48a385e1 --- /dev/null +++ b/comp/src/gb.report2/.src/ReportVBox.class @@ -0,0 +1,17 @@ +' Gambas class file + +Export +Inherits ReportContainer +Public Const _Properties As String = "*,ForceNewPage" +Public Const _Similar As String = "ReportVBox" +Public Const _DefaultArrangement As String = "V" + +Public Sub _new() + + Super._Arrangement = Arrange.Vertical + +End + +Public Sub _Free() + +End diff --git a/comp/src/gb.report2/.src/ReportVPanel.class b/comp/src/gb.report2/.src/ReportVPanel.class new file mode 100644 index 00000000..9a4a55c6 --- /dev/null +++ b/comp/src/gb.report2/.src/ReportVPanel.class @@ -0,0 +1,26 @@ +' Gambas class file + +Export +Inherits ReportContainer +Public Const _Properties As String = "*,ForceNewPage" +Public Const _Similar As String = "ReportVBox" +Public Const _DefaultArrangement As String = "V" + + +' Definition +' C'est la largeur maximal des objets qui donnes la largeur de la colonne. +' Mais un objet ne peu être plus large que le container principal... soit une colonne. + + + + + +Public Sub _new() + + Super._Arrangement = Arrange.Column + +End + +Public Sub _Free() + +End \ No newline at end of file diff --git a/comp/src/gb.report2/.src/Tests/Report10.class b/comp/src/gb.report2/.src/Tests/Report10.class new file mode 100644 index 00000000..15819ab8 --- /dev/null +++ b/comp/src/gb.report2/.src/Tests/Report10.class @@ -0,0 +1,15 @@ +' Gambas class file + + +Public Sub Report_Open() + ReportVBox1.DataCount = 100 + ReportVBox2.DataCount = 4 + ReportPanel1.Datacount = 3 + +End + +Public Sub ReportLabel1_Data(Index As Integer) + + 'Last.data = Index + +End diff --git a/comp/src/gb.report2/.src/Tests/Report10.report b/comp/src/gb.report2/.src/Tests/Report10.report new file mode 100644 index 00000000..878e0df4 --- /dev/null +++ b/comp/src/gb.report2/.src/Tests/Report10.report @@ -0,0 +1,50 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,64,91) + Padding = ReportPadding["Top:2cm;Bottom:2cm;Left:2cm;Right:2cm"] + Tag = "Report" + Index = 0 + Text = ("") + { ReportVBox1 ReportVBox + #MoveScaled(1,1,62,42) + Expand = True + { ReportLabel1 ReportLabel + #MoveScaled(1,1,60,6) + Text = ("=index") + } + { ReportVBox2 ReportVBox + #MoveScaled(1,7,60,15) + Border = ReportBorder["Top:1mm #000000;Bottom:1mm #000000;Left:1mm #000000;Right:1mm #000000"] + Background = ReportBrush["#FF7F00"] + { ReportLabel2 ReportLabel + #MoveScaled(1,1,58,6) + AutoResize = True + Text = ("=Index") + } + { ReportPanel1 ReportPanel + #MoveScaled(1,7,58,6) + Height = "7mm" + Margin = ReportMargin["Top:0mm;Bottom:2mm;Left:1cm;Right:1cm"] + Tag = "hBox" + Border = ReportBorder["Top:1mm #000000;Bottom:1mm #000000;Left:1mm #000000;Right:1mm #000000"] + Background = ReportBrush["#00FF00"] + Arrangement = Arrange.Vertical + { ReportLabel3 ReportLabel + #MoveScaled(4,2,62,7) + Padding = ReportPadding["Left:5mm"] + Expand = True + Tag = "label" + Text = ("=\"Index = \" & index") + } + } + } + } + { ReportLabel4 ReportLabel + #MoveScaled(1,43,62,3) + Fixed = True + Text = ("=page & \" / \" & pages") + Alignment = Align.Right + } + Index = 0 +} diff --git a/comp/src/gb.report2/.src/Tests/Report13.class b/comp/src/gb.report2/.src/Tests/Report13.class new file mode 100644 index 00000000..f08416a1 --- /dev/null +++ b/comp/src/gb.report2/.src/Tests/Report13.class @@ -0,0 +1,8 @@ +' Gambas class file + + +Public Sub Report_Open() + + ReportHBox1.DataCount = 10000 + +End diff --git a/comp/src/gb.report2/.src/Tests/Report13.report b/comp/src/gb.report2/.src/Tests/Report13.report new file mode 100644 index 00000000..e608d98f --- /dev/null +++ b/comp/src/gb.report2/.src/Tests/Report13.report @@ -0,0 +1,48 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,109,91) + Padding = ReportPadding["Top:25mm;Bottom:25mm;Left:25mm;Right:25mm"] + Expand = True + Spacing = "8mm" + Count = 2 + Index = 0 + Text = ("") + { ReportHBox1 ReportHBox + #MoveScaled(1,1,107,20) + Height = "4cm" + Padding = ReportPadding["Top:5mm;Bottom:5mm;Left:5mm;Right:5mm"] + Border = ReportBorder["Top:1mm #7F7F7F;Bottom:1mm #7F7F7F;Left:1mm #7F7F7F;Right:1mm #7F7F7F;TopLeftCorner:5mm;TopRightCorner:5mm;BottomRightCorner:5mm;BottomLeftCorner:5mm"] + Background = ReportBrush["#EFDFFF"] + BoxShadow = ReportBoxShadow["1mm 1mm 2px 0px #C2C2C2"] + { ReportImage1 ReportImage + #MoveScaled(1,1,19,18) + Width = "4cm" + Height = "4cm" + AutoResize = True + Image = Image.Load("gambas.svg") + } + { ReportLabel1 ReportLabel + #MoveScaled(20,1,83,18) + Brush = ReportBrush["LinearGradient(1,0,1,1,[#5F5F5F,#BFBFBF],[0,1])"] + Font = Font["Bold,+10"] + Expand = True + Text = ("=\"GAMBAS - \" & index") + Alignment = Align.Center + } + } + { ReportLabel3 ReportLabel + #MoveScaled(1,22,107,29) + Fixed = True + Font = Font["+12"] + Text = ("=\"PAGE \" & Page & \" / \" & pages") + } + Index = 1 + Text = ("") + { ReportLabel2 ReportLabel + #MoveScaled(1,1,107,29) + Font = Font["+12"] + Text = ("=\"PAGE \" & Page & \" / \" & pages") + } + Index = 0 +} diff --git a/comp/src/gb.report2/.src/Tests/Report14.class b/comp/src/gb.report2/.src/Tests/Report14.class new file mode 100644 index 00000000..51ffa578 --- /dev/null +++ b/comp/src/gb.report2/.src/Tests/Report14.class @@ -0,0 +1,8 @@ +' Gambas class file + + +Public Sub Report_Open() + + RHBList.DataCount = 300 + +End diff --git a/comp/src/gb.report2/.src/Tests/Report14.report b/comp/src/gb.report2/.src/Tests/Report14.report new file mode 100644 index 00000000..6ae250de --- /dev/null +++ b/comp/src/gb.report2/.src/Tests/Report14.report @@ -0,0 +1,66 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,64,91) + Padding = ReportPadding["Top:2cm;Bottom:2cm;Left:2cm;Right:2cm"] + Index = 0 + Text = ("") + { ReportHBox1 ReportHBox + #MoveScaled(1,1,62,7) + Fixed = True + Margin = ReportMargin["Bottom:5mm"] + BoxShadow = ReportBoxShadow["1mm 1mm 3px 0px #000000"] + { ReportLabel1 ReportLabel + #MoveScaled(1,1,12,5) + Width = "3cm" + Border = ReportBorder["Top:3px #000000;Bottom:3px #000000;Left:3px #000000;Right:3px #000000;TopLeftCorner:5mm"] + Text = ("Reference") + Alignment = Align.Center + } + { ReportLabel2 ReportLabel + #MoveScaled(13,1,25,5) + Expand = True + Border = ReportBorder["Top:3px #000000;Bottom:3px #000000;Left:3px #000000"] + Text = ("Description") + Alignment = Align.Center + } + { ReportLabel3 ReportLabel + #MoveScaled(38,1,21,5) + Width = "5cm" + Border = ReportBorder["Top:3px #000000;Bottom:3px #000000;Left:3px #000000;Right:3px #000000;TopRightCorner:0mm;BottomLeftCorner:0mm"] + Text = ("Valeur") + Alignment = Align.Center + } + } + { RHBList ReportHBox + #MoveScaled(1,8,62,6) + Margin = ReportMargin["Bottom:1mm"] + { ReportLabel4 ReportLabel + #MoveScaled(1,1,12,4) + Width = "3cm" + Border = ReportBorder["Top:0px #000000;Bottom:3px #000000;Left:3px #000000"] + Text = ("=index") + } + { ReportLabel5 ReportLabel + #MoveScaled(13,1,25,4) + Expand = True + Border = ReportBorder["Top:0px #000000;Bottom:3px #000000;Left:3px #000000"] + } + { ReportLabel6 ReportLabel + #MoveScaled(38,1,21,4) + Width = "5cm" + Border = ReportBorder["Top:0px #000000;Bottom:3px #000000;Left:3px #000000;Right:3px #000000"] + } + } + { ReportPanel1 ReportPanel + #MoveScaled(1,14,62,6) + Expand = True + } + { ReportLabel7 ReportLabel + #MoveScaled(1,20,62,3) + Fixed = True + Text = ("=page & \" on \" & pages") + Alignment = Align.Right + } + Index = 0 +} diff --git a/comp/src/gb.report2/.src/Tests/Report15.class b/comp/src/gb.report2/.src/Tests/Report15.class new file mode 100644 index 00000000..0a5fa73a --- /dev/null +++ b/comp/src/gb.report2/.src/Tests/Report15.class @@ -0,0 +1,2 @@ +' Gambas class file + diff --git a/comp/src/gb.report2/.src/Tests/Report15.report b/comp/src/gb.report2/.src/Tests/Report15.report new file mode 100644 index 00000000..96cd9a13 --- /dev/null +++ b/comp/src/gb.report2/.src/Tests/Report15.report @@ -0,0 +1,13 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,64,91) + Index = 0 + Text = ("") + { ReportImage1 ReportImage + #MoveScaled(1,1,62,20) + Expand = True + Image = Image.Load("tortueface.gif") + } + Index = 0 +} diff --git a/comp/src/gb.report2/.src/Tests/Report16.class b/comp/src/gb.report2/.src/Tests/Report16.class new file mode 100644 index 00000000..74251a7a --- /dev/null +++ b/comp/src/gb.report2/.src/Tests/Report16.class @@ -0,0 +1,14 @@ +' Gambas class file + + +Public Sub ReportLabel2_Data(Index As Integer) + + Last.Data = "Coucou " & Index + +End + +Public Sub Report_Open() + + ReportHBox1.DataCount = 100 + +End diff --git a/comp/src/gb.report2/.src/Tests/Report16.report b/comp/src/gb.report2/.src/Tests/Report16.report new file mode 100644 index 00000000..76fc659c --- /dev/null +++ b/comp/src/gb.report2/.src/Tests/Report16.report @@ -0,0 +1,27 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,119,91) + Padding = ReportPadding["Top:1cm;Bottom:1cm;Left:1cm;Right:1cm"] + Index = 0 + Text = ("") + { ReportLabel1 ReportLabel + #MoveScaled(1,1,117,8) + Height = "3cm" + Brush = ReportBrush["LinearGradient(0,0,0,0,[#DFBC53,#FFFFFF],[0.97,0.05])"] + Font = Font["Bold,+8"] + Padding = ReportPadding["Top:1cm;Bottom:1cm;Left:1cm;Right:1cm"] + Border = ReportBorder["Top:1mm #000000;Bottom:1mm #000000;Left:1mm #000000;Right:1mm #000000;TopLeftCorner:21mm 6mm;TopRightCorner:21mm 6mm;BottomRightCorner:21mm 6mm;BottomLeftCorner:21mm 6mm"] + Background = ReportBrush["RadialGradient(0.6,0.46,0.5,0.81,0.21,[#FFFFFF,#9F1313,#CF4DCF],[0,1,0.5])"] + BoxShadow = ReportBoxShadow["1mm 1mm 5px 0px #FF5500"] + Text = ("Coucou") + Alignment = Align.Center + } + { ReportHBox1 ReportHBox + #MoveScaled(1,9,117,10) + { ReportLabel2 ReportLabel + #MoveScaled(1,1,112,8) + } + } + Index = 0 +} diff --git a/comp/src/gb.report2/.src/Tests/Report17.class b/comp/src/gb.report2/.src/Tests/Report17.class new file mode 100644 index 00000000..c689a4b4 --- /dev/null +++ b/comp/src/gb.report2/.src/Tests/Report17.class @@ -0,0 +1,8 @@ +' Gambas class file + + +Public Sub Report_Open() + + ReportPanel1.DataCount = 30 + +End diff --git a/comp/src/gb.report2/.src/Tests/Report17.report b/comp/src/gb.report2/.src/Tests/Report17.report new file mode 100644 index 00000000..e22572c1 --- /dev/null +++ b/comp/src/gb.report2/.src/Tests/Report17.report @@ -0,0 +1,24 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,100,91) + Padding = ReportPadding["Top:2cm;Bottom:2cm;Left:2cm;Right:2cm"] + Index = 0 + Text = ("") + { ReportPanel1 ReportPanel + #MoveScaled(1,1,98,22) + Height = "5cm" + AutoResize = True + { ReportLabel1 ReportLabel + #MoveScaled(0,0,98,21) + Brush = ReportBrush["RadialGradient(0.95,0.04,0.5,0.53,0.21,[#FFFFFF,#FF007F],[0,1])"] + Font = Font["Bold,+17"] + Border = ReportBorder["Top:1mm LinearGradient(1,0.88,0,0,[#000000,#FFFFFF],[0,1]);Bottom:1mm LinearGradient(1,0.88,0,0,[#000000,#FFFFFF],[0,1]);Left:1mm LinearGradient(1,0.88,0,0,[#000000,#FFFFFF],[0,1]);Right:1mm LinearGradient(1,0.88,0,0,[#000000,#FFFFFF],[0,1]);TopLeftCorner:12mm;BottomRightCorner:12mm"] + Background = ReportBrush["RadialGradient(0.49,0.46,0.5,0.84,0.14,[#3737DF,#FFFFFF],[0,1])"] + BoxShadow = ReportBoxShadow["1mm 1mm 2mm 0mm #000000"] + Text = ("Coucou") + Alignment = Align.Center + } + } + Index = 0 +} diff --git a/comp/src/gb.report2/.src/Tests/old/FMain.class b/comp/src/gb.report2/.src/Tests/old/FMain.class new file mode 100644 index 00000000..a593d25e --- /dev/null +++ b/comp/src/gb.report2/.src/Tests/old/FMain.class @@ -0,0 +1,16 @@ +' Gambas class file + +Public Sub _new() +Dim hLabel As New ReportLabel(Report) +hLabel.Text = "Test" +Report.Padding = ReportPadding["1cm"] +hLabel.Border = ReportBorder["border:1px;toprightcorner:5mm 1cm"] +hLabel.BackGround = ReportBrush["image(icon.png)"] +Report.Preview() +End + +Public Sub Form_Open() +GridView1.Columns.Count = 6 +GridView1.Columns[0].Text = "titi" +GridView1.Rows.Count = 6 +End diff --git a/comp/src/gb.report2/.src/Tests/old/FMain.form b/comp/src/gb.report2/.src/Tests/old/FMain.form new file mode 100644 index 00000000..993e7c82 --- /dev/null +++ b/comp/src/gb.report2/.src/Tests/old/FMain.form @@ -0,0 +1,10 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,112,67) + { GridView1 GridView + MoveScaled(17,14,61,36) + Grid = False + Header = GridView.Both + } +} diff --git a/comp/src/gb.report2/.src/Tests/old/Module1.module b/comp/src/gb.report2/.src/Tests/old/Module1.module new file mode 100644 index 00000000..06e1d891 --- /dev/null +++ b/comp/src/gb.report2/.src/Tests/old/Module1.module @@ -0,0 +1,19 @@ +' Gambas module file + +Public Sub Main() + + Dim hrc As New Report + Dim vb As ReportVBox + Dim himg As New Image(1, 1) + + hrc.tag = + hrc.Width = "21cm" + hrc.Height = "29.7cm" + vb = New ReportVBox(hrc) + Paint.Begin(himg) + hrc.Layout + Paint.End + Print hrc._Height + Print hrc._Width + +End diff --git a/comp/src/gb.report2/.src/Tests/old/OutputReport2.class b/comp/src/gb.report2/.src/Tests/old/OutputReport2.class new file mode 100644 index 00000000..80e40957 --- /dev/null +++ b/comp/src/gb.report2/.src/Tests/old/OutputReport2.class @@ -0,0 +1,166 @@ +' Gambas class file + +Public nnoderows As Integer +Public nanchorrows As Integer + +Public Sub _new() +'Report.Debug = True + 'enter current date on the header + ReportLabel2.Text = Date + + 'enter the project information in the header on the print out page + 'With FMain.Project + ReportLabel3.Text = "Project Title: " ' & .JobTitle + ReportLabel4.Text = "Project No.: '" '& .Number + ReportLabel5.Text = "Company: " '& .Company + ReportLabel6.Text = "Designer: " '& .Designer + ReportLabel7.Text = "Base Plate ID: " ' & .BasePlateID + 'End With + + 'set count to four to display the results for qmax. Tmax, L, and phi + ReportHBox9.DataCount = 4 + + 'set the number of plate nodes to display in print out tables + ' nnoderows = Module1.RoundUpInt(FMain.ConcreteSection.cNodes.Count / 2) + ReportHBox5.DataCount = 11 'nnoderows + + 'set the number of anchor rods to display in print out tables + 'nanchorrows = Module1.RoundUpInt(FMain.cAnchorRods.Count / 2) + ReportHBox7.DataCount = 13 'nanchorrows + + 'set the number of report panels - one for each load combination result + ReportPanel1.DataCount = 6 'FMain.AnalysisResults.Count + +End + + +Public Sub ReportImage2_Data(Index As Integer) + 'Dim current_results As Results + Dim pSection As Picture + + 'create a new picture object for drawing the base plate + pSection = New Picture(300, 300, False) + + 'get the results for first load case + 'current_results = FMain.AnalysisResults[Str$(ReportHBox3.DataIndex)] + + 'refresh base plate drawing with results + 'Module1.DrawBasePlate(pSection, 1, current_results) + + 'add the picture of the base plate to the page + ReportImage2.Image = pSection.Image + +End + + +Public Sub ReportLabel9_Data(Index As Integer) + + Last.Data = "Load Case: " '& FMain.cLoads[Str$(ReportHBox3.DataIndex)].label + +End + + +Public Sub ReportLabel14_Data(Index As Integer) + 'Dim $value As String + + Select Case Index + Case 0 + '$value = Module1.AdvFormat(FMain.AnalysisResults[Str$(ReportHBox3.DataIndex)].Tmax, 2) + Last.Data = "T(max) = " & 3 & " lbs" + Case 1 + '$value = Module1.AdvFormat(FMain.AnalysisResults[Str$(ReportHBox3.DataIndex)].maxstress, 2) + Last.Data = "q(max) = " & 3 & " psi" + Case 2 + '$value = Module1.AdvFormat(FMain.AnalysisResults[Str$(ReportHBox3.DataIndex)].L, 2) + Last.Data = "L = " & 3 & " in" + Case 3 + '$value = Module1.AdvFormat(FMain.AnalysisResults[Str$(ReportHBox3.DataIndex)].phi, 2) + Last.Data = "phi = " & 3 & " degrees" + Case Else + End Select + +End + + +Public Sub ReportLabel25_Data(Index As Integer) + + Last.Data = Index + 1 + +End + +Public Sub ReportLabel29_Data(Index As Integer) + ' Dim current_results As Results + + 'current_results = FMain.AnalysisResults[Str$(ReportPanel1.DataIndex)] + + 'If nnoderows + Index < current_results.stress.Count Then + Last.Data = nnoderows + Index + 1 + 'Else + ' Last.Data = Null + ' Endif + +End + +Public Sub ReportLabel26_Data(Index As Integer) + Dim value As Float + + 'value = FMain.AnalysisResults[Str$(ReportPanel1.DataIndex)].stress[Index] + Last.Data = "tt" 'Module1.AdvFormat(value, 2) + +End + +Public Sub ReportLabel30_Data(Index As Integer) + Dim value As Float + 'Dim current_results As Results + + 'current_results = FMain.AnalysisResults[Str$(ReportPanel1.DataIndex)] + ' If nnoderows + Index < current_results.stress.Count Then + 'value = current_results.stress[nnoderows + Index] + Last.Data = "mm" 'Module1.AdvFormat(value, 2) + ' Else + Last.Data = Null + 'Endif + +End + +Public Sub ReportLabel49_Data(Index As Integer) + + Last.Data = Index + 1 + +End + +Public Sub ReportLabel52_Data(Index As Integer) + 'Dim current_results As Results + + 'current_results = FMain.AnalysisResults[Str$(ReportPanel1.DataIndex)] + + 'If nanchorrows + Index < current_results.T.Count Then + Last.Data = nanchorrows + Index + 1 + 'Else + ' Last.Data = Null + ' Endif + +End + +Public Sub ReportLabel50_Data(Index As Integer) + Dim value As Float + + 'value = FMain.AnalysisResults[Str$(ReportPanel1.DataIndex)].T[Index] + Last.Data = "kkkk" 'Module1.AdvFormat(value, 2) + +End + +Public Sub ReportLabel53_Data(Index As Integer) + Dim value As Float + 'Dim current_results As Results + + ' current_results = FMain.AnalysisResults[Str$(ReportPanel1.DataIndex)] + ' If nanchorrows + Index < current_results.T.Count Then + ' value = current_results.T[nanchorrows + Index] + Last.Data = "qqqqqq" 'Module1.AdvFormat(value, 2) + ' Else + ' Last.Data = Null + 'Endif + +End + diff --git a/comp/src/gb.report2/.src/Tests/old/OutputReport2.report b/comp/src/gb.report2/.src/Tests/old/OutputReport2.report new file mode 100644 index 00000000..f12422c8 --- /dev/null +++ b/comp/src/gb.report2/.src/Tests/old/OutputReport2.report @@ -0,0 +1,308 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,76,88) + Fixed = True + Padding = ReportPadding["Top:20mm;Bottom:10mm;Left:20mm;Right:20mm"] + Ignore = True + AutoResize = True + Index = 0 + Text = ("") + { ReportHBox1 ReportHBox + #MoveScaled(2,0,62,11) + Height = "25mm" + Fixed = True + Padding = ReportPadding["Top:1mm;Bottom:1mm;Left:1mm;Right:1mm"] + Border = ReportBorder["Bottom:2px #000000"] + { ReportImage1 ReportImage + #MoveScaled(1,1,18,9) + Width = "51mm" + AutoResize = True + } + { ReportLabel1 ReportLabel + #MoveScaled(21,1,10,9) + Width = "25mm" + AutoResize = True + Text = ("Version 1.0") + Alignment = Align.BottomLeft + } + { ReportLabel2 ReportLabel + #MoveScaled(31,1,30,9) + Expand = True + AutoResize = True + Text = ("Date") + Alignment = Align.BottomRight + UseField = True + } + } + { ReportVBox1 ReportVBox + #MoveScaled(2,11,62,9) + Height = "28.01mm" + Fixed = True + Padding = ReportPadding["Top:1mm;Bottom:1mm;Left:1mm;Right:1mm"] + Border = ReportBorder["Bottom:2px #000000"] + { ReportLabel3 ReportLabel + #MoveScaled(0,0,12,2) + Height = "6mm" + AutoResize = True + Text = ("Project Title:") + Alignment = Align.TopLeft + } + { ReportLabel4 ReportLabel + #MoveScaled(0,2,12,2) + Height = "6mm" + AutoResize = True + Text = ("Project No.:") + Alignment = Align.TopLeft + } + { ReportLabel5 ReportLabel + #MoveScaled(0,4,12,2) + Height = "6mm" + AutoResize = True + Text = ("Company:") + Alignment = Align.TopLeft + } + { ReportLabel6 ReportLabel + #MoveScaled(0,6,12,2) + Height = "6mm" + AutoResize = True + Text = ("Designer:") + Alignment = Align.TopLeft + } + } + { ReportHBox2 ReportHBox + #MoveScaled(2,20,62,3) + Height = "8mm" + Fixed = True + Padding = ReportPadding["Top:1mm;Bottom:1mm;Left:1mm;Right:1mm"] + Border = ReportBorder["Bottom:2px #000000"] + { ReportLabel7 ReportLabel + #MoveScaled(0,0,12,2) + Height = "6mm" + AutoResize = True + Text = ("Base Plate ID:") + Alignment = Align.TopLeft + } + } + { ReportPanel1 ReportPanel + #MoveScaled(2,25,67,52) + AutoResize = True + ForceNewPage = True + { ReportHBox3 ReportHBox + #MoveScaled(1,1,62,17) + Height = "61mm" + Expand = True + { ReportVBox3 ReportVBox + #MoveScaled(1,1,18,14) + AutoResize = True + { ReportHBox8 ReportHBox + #MoveScaled(1,2,15,4) + Width = "51mm" + Height = "12mm" + { ReportLabel9 ReportLabel + #MoveScaled(1,1,13,2) + Font = Font["+1"] + Expand = True + } + } + { ReportHBox9 ReportHBox + #MoveScaled(1,8,15,4) + Width = "51mm" + Height = "6mm" + { ReportLabel14 ReportLabel + #MoveScaled(1,1,13,2) + Expand = True + } + } + } + { ReportImage2 ReportImage + #MoveScaled(31,1,17,15) + Padding = ReportPadding["Top:5mm;Bottom:5mm;Left:5mm;Right:5mm"] + Expand = True + Alignment = Align.Center + } + } + { ReportVBox4 ReportVBox + #MoveScaled(1,20,62,14) + AutoResize = True + { ReportLabel19 ReportLabel + #MoveScaled(2,0,16,4) + Fixed = True + Font = Font["+1"] + Padding = ReportPadding["Top:3mm"] + AutoResize = True + Text = ("Bearing Pressue") + } + { ReportHBox4 ReportHBox + #MoveScaled(1,3,60,4) + Height = "6mm" + Fixed = True + { ReportLabel20 ReportLabel + #MoveScaled(1,1,13,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Text = ("Node #") + Alignment = Align.Center + } + { ReportLabel21 ReportLabel + #MoveScaled(14,1,14,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Text = ("Brg. Press., psi") + Alignment = Align.Center + } + { ReportLabel22 ReportLabel + #MoveScaled(28,1,4,2) + Width = "5mm" + } + { ReportLabel23 ReportLabel + #MoveScaled(32,1,12,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Text = ("Node #") + Alignment = Align.Center + } + { ReportLabel24 ReportLabel + #MoveScaled(44,1,15,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Text = ("Brg. Press., psi") + Alignment = Align.Center + } + } + { ReportHBox5 ReportHBox + #MoveScaled(1,8,60,4) + Height = "6mm" + { ReportLabel25 ReportLabel + #MoveScaled(1,1,13,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Alignment = Align.Center + } + { ReportLabel26 ReportLabel + #MoveScaled(14,1,14,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Alignment = Align.Center + } + { ReportLabel27 ReportLabel + #MoveScaled(28,1,4,2) + Width = "5mm" + } + { ReportLabel29 ReportLabel + #MoveScaled(32,1,12,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Alignment = Align.Center + } + { ReportLabel30 ReportLabel + #MoveScaled(44,1,15,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Alignment = Align.Center + } + } + } + { ReportVBox6 ReportVBox + #MoveScaled(1,36,62,14) + AutoResize = True + { ReportLabel31 ReportLabel + #MoveScaled(2,0,19,4) + Fixed = True + Font = Font["+1"] + Padding = ReportPadding["Top:3mm"] + AutoResize = True + Text = ("Anchor Rod Tension") + } + { ReportHBox6 ReportHBox + #MoveScaled(1,3,60,4) + Height = "6mm" + Fixed = True + { ReportLabel44 ReportLabel + #MoveScaled(1,1,13,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Text = ("Rod #") + Alignment = Align.Center + } + { ReportLabel45 ReportLabel + #MoveScaled(14,1,14,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Text = ("Tension, lbs") + Alignment = Align.Center + } + { ReportLabel46 ReportLabel + #MoveScaled(28,1,4,2) + Width = "5mm" + } + { ReportLabel47 ReportLabel + #MoveScaled(32,1,12,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Text = ("Rod #") + Alignment = Align.Center + } + { ReportLabel48 ReportLabel + #MoveScaled(44,1,15,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Text = ("Tension, lbs") + Alignment = Align.Center + } + } + { ReportHBox7 ReportHBox + #MoveScaled(1,8,60,4) + Height = "6mm" + { ReportLabel49 ReportLabel + #MoveScaled(1,1,13,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Alignment = Align.Center + } + { ReportLabel50 ReportLabel + #MoveScaled(14,1,14,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Alignment = Align.Center + } + { ReportLabel51 ReportLabel + #MoveScaled(28,1,4,2) + Width = "5mm" + } + { ReportLabel52 ReportLabel + #MoveScaled(32,1,12,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Alignment = Align.Center + } + { ReportLabel53 ReportLabel + #MoveScaled(44,1,15,2) + Expand = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + Alignment = Align.Center + } + } + } + } + { ReportPanel2 ReportPanel + #MoveScaled(2,77,69,1) + Fixed = True + Expand = True + } + { ReportHBox10 ReportHBox + #MoveScaled(2,79,62,4) + Height = "1cm" + Fixed = True + AutoResize = True + { ReportLabel8 ReportLabel + #MoveScaled(22,1,21,2) + Expand = True + AutoResize = True + Text = ("Page $PAGE of $NPAGE") + Alignment = Align.Bottom + UseField = True + } + } + Index = 0 +} diff --git a/comp/src/gb.report2/.src/Tests/old/Report1.class b/comp/src/gb.report2/.src/Tests/old/Report1.class new file mode 100644 index 00000000..414000b0 --- /dev/null +++ b/comp/src/gb.report2/.src/Tests/old/Report1.class @@ -0,0 +1,43 @@ +' Gambas class file + + +Public Sub Report_Open() +Dim hBox As ReportHBox +Dim i As Integer +'Report.Debug = True +'Me.Spacing = "1cm" + ReportHBox1.Margin.Bottom = "2cm" + 'Report.Debug = True + 'ReportHBox2.Margin.Top = "2cm" + ' ReportHBox1.BoxShadow.Blur = "0.5mm" + ' ReportHBox1.BoxShadow.XOffset = "1mm" + ' ReportHBox1.BoxShadow.YOffset = "1mm" + ' 'ReportHBox1.BoxShadow.Spread = "0.5mm" + ' ReportHBox1.BoxShadow.Color = Color.Gray + + For i = 0 To 14 + hbox = New Reporthbox(ReportVBox1) + HBox.Height = "1cm" + HBox.Border.Width = "2px" + HBox.Margin.Top = "5mm" + HBox.Margin.Bottom = "3mm" + HBox.Margin.Left = "1cm" + HBox.Margin.Right = "2mm" + Next + hBox = New ReportHBox(ReportVBox1) + HBox.BackGround = ReportBrush.Color(Color.Green) + HBox.Height = "3cm" + HBox.Margin.Top = "1cm" + + For i = 0 To 4 + hbox = New Reporthbox(ReportHBox2) + HBox.Width = "1cm" + HBox.Border.Width = "2px" + HBox.Margin.Left = "3mm" + HBox.Margin.Right = "8mm" + HBox.Expand = True + HBox.Margin.Top = "3mm" + HBox.Margin.Bottom = "3px" + Next + ReportHBox2.Padding = ReportPadding["2mm"] +End diff --git a/comp/src/gb.report2/.src/Tests/old/Report1.report b/comp/src/gb.report2/.src/Tests/old/Report1.report new file mode 100644 index 00000000..aef99552 --- /dev/null +++ b/comp/src/gb.report2/.src/Tests/old/Report1.report @@ -0,0 +1,50 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,93,73) + Padding = ReportPadding["Top:2cm;Bottom:2cm;Left:2cm;Right:2cm"] + BoxShadow = ReportBoxShadow["2mm 2mm 0mm 0px #C05800"] + Spacing = "5mm" + Index = 0 + Text = ("") + { ReportHBox1 ReportHBox + #MoveScaled(1,1,91,14) + Height = "2cm" + Fixed = True + Tag = "**" + Border = ReportBorder["Top:1mm #000000;Bottom:1mm #000000;Left:1mm #000000;Right:1mm #000000;TopLeftCorner:3mm;TopRightCorner:3mm;BottomRightCorner:3mm;BottomLeftCorner:3mm"] + BoxShadow = ReportBoxShadow["0mm 3mm 1mm -4px #FF8000"] + { ReportLabel1 ReportLabel + #MoveScaled(1,1,58,12) + Font = Font["+10"] + Expand = True + AutoResize = True + Text = ("=\"Page \" & Page") + Alignment = Align.Center + } + } + { ReportVBox1 ReportVBox + #MoveScaled(1,16,91,10) + Border = ReportBorder["Top:1mm #000000;Bottom:1mm #000000;Left:1mm #000000;Right:1mm #000000;TopLeftCorner:10mm;TopRightCorner:20mm;BottomRightCorner:10mm;BottomLeftCorner:1mm"] + Background = ReportBrush["LinearGradient(0.35,0.74,0.95,0.07,[#FFFFFF,#FFFFFF,#007FFF],[0,1,0.36])"] + BoxShadow = ReportBoxShadow["1mm 1mm 1mm 0px #000000"] + } + { ReportHBox2 ReportPanel + #MoveScaled(1,27,91,16) + Height = "20mm" + Fixed = True + { ReportLabel2 ReportLabel + #MoveScaled(10,3,59,9) + Expand = True + Text = ("=pi() + 4") + Format = "0.00" + } + } + { ReportHBox3 ReportHBox + #MoveScaled(1,44,91,6) + Height = "10mm" + Brush = ReportBrush["#FF0000"] + Border = ReportBorder["Top:1mm #000000;Bottom:1mm #000000;Left:1mm #000000;Right:1mm #000000"] + } + Index = 0 +} diff --git a/comp/src/gb.report2/.src/Tests/old/Report11.class b/comp/src/gb.report2/.src/Tests/old/Report11.class new file mode 100644 index 00000000..ebaa73e2 --- /dev/null +++ b/comp/src/gb.report2/.src/Tests/old/Report11.class @@ -0,0 +1,32 @@ +' Gambas class file + +'Static Public Type As String + +Public Sub _new(Optional sType As String = "sqlite") + + Dim hResult As Result + Dim Rlbl As ReportLabel + Dim hConn As Connection +'Report.Debug = True + hConn = Connections["Connection1"] + hConn.Type = sType + If hConn.Type = "sqlite" Then hConn.Host = User.Home + Try hConn.Open + If Not hConn.Opened Then + Message.Error(" You have to create the test database with the Database example.") + Return + Endif + + hResult = db.Limit(200).Find("test") + If Not hResult.Available Then Return + + For Each hResult + + Rlbl = New ReportLabel(RVBCont) + Rlbl.Autoresize = True + Rlbl.Text = hResult!name & " " & hResult!firstname + Rlbl.Border.bottom.Width = "1px" + + Next + +End diff --git a/comp/src/gb.report2/.src/Tests/old/Report11.report b/comp/src/gb.report2/.src/Tests/old/Report11.report new file mode 100644 index 00000000..3f0ea999 --- /dev/null +++ b/comp/src/gb.report2/.src/Tests/old/Report11.report @@ -0,0 +1,101 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,100,77) + Padding = ReportPadding["Top:1cm;Bottom:15mm;Left:2cm;Right:2cm"] + Index = 0 + Text = ("Section 1") + { ReportHBox2 ReportHBox + #MoveScaled(0,0,67,14) + Height = "5cm" + Fixed = True + Padding = ReportPadding["Top:5mm;Bottom:5mm;Left:5mm;Right:5mm"] + Border = ReportBorder["Top:1mm #000000;Bottom:1mm #000000;Left:1mm #000000;Right:1mm #000000"] + Background = ReportBrush["#3398C3"] + { ReportSvgImage1 ReportSvgImage + #MoveScaled(1,1,14,12) + Width = "4cm" + Image = SvgImage.Load("gambas.svg") + } + { ReportLabel3 ReportLabel + #MoveScaled(20,2,40,10) + Brush = ReportBrush["LinearGradient(0.71,0.07,0.34,0.06,[#FFFF00,#FFFFFF],[0,1])"] + Fixed = True + Font = Font["DejaVu Sans,Bold,+14"] + Expand = True + AutoResize = True + Text = ("Gambas") + Alignment = Align.Left + } + } + { ReportHBox1 ReportHBox + #MoveScaled(0,15,87,56) + Padding = ReportPadding["0cm"] + Expand = True + Border = ReportBorder["Bottom:1mm #000000;Left:1mm #000000;Right:1mm #000000"] + { ReportVBox1 ReportVBox + #MoveScaled(1,1,25,47) + Width = "6cm" + Padding = ReportPadding["Top:5mm;Bottom:5mm;Left:5mm;Right:5mm"] + Background = ReportBrush["#DF6B00"] + { ReportLabel4 ReportLabel + #MoveScaled(3,2,20,4) + Brush = ReportBrush["#FFFFFF"] + Fixed = True + Font = Font["Bold"] + AutoResize = True + Text = ("All friends list !") + } + } + { ReportVBox2 ReportVBox + #MoveScaled(27,1,60,54) + Expand = True + Border = ReportBorder["Left:1mm #000000"] + Background = ReportBrush["#FFFFFF"] + { RVBCont ReportVBox + #MoveScaled(4,4,53,42) + Padding = ReportPadding["Top:5mm;Bottom:5mm;Left:5mm;Right:5mm"] + Expand = True + Tag = "*" + Spacing = "1mm" + { ReportLabel1 ReportLabel + #MoveScaled(0,1,44,9) + Fixed = True + Font = Font["Bitstream Charter,Bold,Italic,+2"] + Margin = ReportMargin["Bottom:1cm"] + AutoResize = True + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000"] + BoxShadow = ReportBoxShadow["1mm 1mm 0px 0px #000000"] + Text = ("Gambas Report Demo") + Alignment = Align.Center + } + { ReportLabel5 ReportLabel + #MoveScaled(3,17,40,21) + Width = "100%" + Height = "100%" + Brush = ReportBrush["#DFDFDF"] + Visible = False + Fixed = True + Font = Font["Bold,+15"] + Ignore = True + Text = ("DEMO") + Alignment = Align.Center + } + } + { ReportLabel2 ReportLabel + #MoveScaled(7,49,47,3) + Brush = ReportBrush["#FFFFFF"] + Fixed = True + Font = Font["Bold,+1"] + Padding = ReportPadding["Top:1mm;Bottom:1mm;Left:1mm;Right:1mm"] + AutoResize = True + Border = ReportBorder["Top:1mm #000000"] + Background = ReportBrush["#3398C3"] + Text = ("Page $PAGE on $NPAGE ") + Alignment = Align.Right + UseField = True + } + } + } + Index = 0 +} diff --git a/comp/src/gb.report2/.src/Tests/old/Report12.class b/comp/src/gb.report2/.src/Tests/old/Report12.class new file mode 100644 index 00000000..b833bfd8 --- /dev/null +++ b/comp/src/gb.report2/.src/Tests/old/Report12.class @@ -0,0 +1,20 @@ +' Gambas class file + + +Public Sub Report_Open() + + TableLine.DataCount = 8 + +End + +Public Sub ReportLabel4_Data(Index As Integer) +Print Index + Last.Data = Index + +End + +Public Sub ReportLabel5_Data(Index As Integer) +Print Index + Last.Data = TableLine.DataIndex + +End diff --git a/comp/src/gb.report2/.src/Tests/old/Report12.report b/comp/src/gb.report2/.src/Tests/old/Report12.report new file mode 100644 index 00000000..ae08ad77 --- /dev/null +++ b/comp/src/gb.report2/.src/Tests/old/Report12.report @@ -0,0 +1,47 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,64,64) + Padding = ReportPadding["Top:2cm;Bottom:2cm;Left:2cm;Right:2cm"] + Index = 0 + Text = ("Section 1") + { ReportHBox1 ReportHBox + #MoveScaled(0,2,60,6) + Height = "1cm" + Border = ReportBorder["Top:2px #000000;Bottom:2px #000000;Left:2px #000000;Right:2px #000000;TopLeftCorner:2mm;TopRightCorner:2mm"] + { ReportLabel1 ReportLabel + #MoveScaled(1,1,16,4) + Width = "5cm" + } + { ReportLabel2 ReportLabel + #MoveScaled(19,1,18,4) + Width = "5cm" + Border = ReportBorder["Left:2px #000000;Right:2px #000000"] + } + { ReportLabel3 ReportLabel + #MoveScaled(39,1,19,4) + Expand = True + } + } + { ReportVBox1 ReportVBox + #MoveScaled(1,12,61,44) + { TableLine ReportHBox + #MoveScaled(0,0,60,4) + Height = "1cm" + Border = ReportBorder["Bottom:2px #000000;Left:2px #000000;Right:2px #000000"] + { ReportLabel4 ReportLabel + #MoveScaled(0,0,17,4) + Width = "5cm" + } + { ReportLabel5 ReportLabel + #MoveScaled(19,1,20,4) + Width = "5cm" + Border = ReportBorder["Left:2px #000000;Right:2px #000000"] + } + { ReportLabel6 ReportLabel + #MoveScaled(42,0,15,4) + } + } + } + Index = 0 +} diff --git a/comp/src/gb.report2/.src/Tests/old/Report2.class b/comp/src/gb.report2/.src/Tests/old/Report2.class new file mode 100644 index 00000000..cc36bd1d --- /dev/null +++ b/comp/src/gb.report2/.src/Tests/old/Report2.class @@ -0,0 +1,22 @@ +' Gambas class file + + + + +Public Sub ReportGridView1_Data(Row As Integer, Column As Integer) + + + +End + +Public Sub Report_Open() + + ' ReportGridView1.Columns.Count = 6 + ' ReportGridView1.Rows.Count = 8 + ' ReportGridView1.Columns[2].Width = "6cm" + ' ReportGridView1.Rows[2].Height = "2cm" + ' ReportGridView1.Rows[4].Height = "8px" + ' ReportGridView1.Rows[4].Text = "totolkjdhdolhldhdhl" + ' ReportGridView1.Header = ReportGridView.Both + +End diff --git a/comp/src/gb.report2/.src/Tests/old/Report2.report b/comp/src/gb.report2/.src/Tests/old/Report2.report new file mode 100644 index 00000000..a14f53eb --- /dev/null +++ b/comp/src/gb.report2/.src/Tests/old/Report2.report @@ -0,0 +1,26 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,64,64) + Padding = ReportPadding["Top:15mm;Bottom:15mm;Left:15mm;Right:15mm"] + Index = 0 + Text = ("") + { ReportLabel1 ReportLabel + #MoveScaled(1,3,59,12) + Height = "2cm" + Font = Font["+12"] + Margin = ReportMargin["Bottom:1cm;Left:2cm;Right:2cm"] + Border = ReportBorder["Top:1mm #000000;Bottom:1mm #000000;Left:1mm #000000;Right:1mm #000000;TopLeftCorner:5mm;TopRightCorner:5mm;BottomRightCorner:5mm;BottomLeftCorner:5mm"] + Background = ReportBrush["LinearGradient(0.49,0,0.49,1,[#00BF5C,#FFE79F],[0,1])"] + BoxShadow = ReportBoxShadow["1mm 1mm 1mm 0mm #000000"] + Text = ("ReportLabel1") + Alignment = Align.Center + } + { ReportGridView1 ReportGridView + #MoveScaled(4,24,46,25) + Expand = True + Border = ReportBorder["Top:1mm #000000;Bottom:1mm #000000;Left:1mm #000000;Right:1mm #000000"] + BoxShadow = ReportBoxShadow["0mm 0mm 2mm 0mm #000000"] + } + Index = 0 +} diff --git a/comp/src/gb.report2/.src/Tests/old/Report3.class b/comp/src/gb.report2/.src/Tests/old/Report3.class new file mode 100644 index 00000000..3b57e5de --- /dev/null +++ b/comp/src/gb.report2/.src/Tests/old/Report3.class @@ -0,0 +1,26 @@ +' Gambas class file + + +Public Sub _new() + + Dim i As Integer + Dim hCont As ReportLabel + Dim hBreak As ReportPageBreak + 'Report.Debug = True + ReportLabel1.Border.Width = "0.5mm" + + 'ReportVBox1.Border.Left.Width = "1mm" + 'ReportVBox1.DataCount = 3 + +For i = 0 To 800 + 'If i = 3 Then hBreak = New ReportPageBreak(Me) + hCont = New ReportLabel(Me) + hCont.BoxShadow.Blur = "5mm" + hCont.Border.Width = "0.5mm" + hCont.Height = "1cm" + hCont.Margin.Top = "5mm" + hCont.Text = i +Next + + +End diff --git a/comp/src/gb.report2/.src/Tests/old/Report3.report b/comp/src/gb.report2/.src/Tests/old/Report3.report new file mode 100644 index 00000000..8c33cd23 --- /dev/null +++ b/comp/src/gb.report2/.src/Tests/old/Report3.report @@ -0,0 +1,27 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,64,57) + Padding = ReportPadding["Top:2cm;Bottom:2cm;Left:2cm;Right:2cm"] + AutoResize = True + Spacing = "5mm" + Paper = Printer.A3 + Index = 0 + Text = ("") + { ReportLabel1 ReportLabel + #MoveScaled(6,0,52,7) + Font = Font["+14"] + BoxShadow = ReportBoxShadow["3mm 3mm 3mm 0mm #FF8000"] + Text = ("PARCELLAIRE $NPAGE") + Alignment = Align.Center + UseField = True + } + { ReportImage1 ReportImage + #MoveScaled(8,10,41,28) + Height = "14cm" + Border = ReportBorder["Top:1mm #000000;Bottom:1mm #000000;Left:1mm #000000;Right:1mm #000000"] + BoxShadow = ReportBoxShadow["1mm 1mm 2px 2px #000000"] + Stretch = Report.None + } + Index = 0 +} diff --git a/comp/src/gb.report2/.src/Tests/old/Report4.class b/comp/src/gb.report2/.src/Tests/old/Report4.class new file mode 100644 index 00000000..060350d8 --- /dev/null +++ b/comp/src/gb.report2/.src/Tests/old/Report4.class @@ -0,0 +1,18 @@ +' Gambas class file + + +Public Sub Report_Open() +'Report.Debug = True +rhh.DataCount = 5 +'rv.DataCount = 10 +rv2.DataCount = 10 +' Me.Layout +' Print Me.PageCount +' rv.DataCount = 4 +' Me.Layout +' Print Me.PageCount +' rv.DataCount = 5 +' Print Me.PageCount + +'rh.Raise +End diff --git a/comp/src/gb.report2/.src/Tests/old/Report4.report b/comp/src/gb.report2/.src/Tests/old/Report4.report new file mode 100644 index 00000000..ac77e4cd --- /dev/null +++ b/comp/src/gb.report2/.src/Tests/old/Report4.report @@ -0,0 +1,23 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,111,87) + Padding = ReportPadding["Top:2cm;Bottom:2cm;Left:2cm;Right:2cm"] + Index = 0 + Text = ("") + { rv2 ReportVBox + #MoveScaled(3,9,107,51) + Padding = ReportPadding["Top:5mm;Bottom:5mm;Left:5mm;Right:5mm"] + Tag = "**" + { rhh ReportHBox + #MoveScaled(12,6,84,7) + Height = "1cm" + Margin = ReportMargin["Top:3mm;Bottom:1mm"] + Background = ReportBrush["#00FF00"] + } + { ReportDrawingArea1 ReportDrawingArea + #MoveScaled(10,16,85,27) + } + } + Index = 0 +} diff --git a/comp/src/gb.report2/.src/Tests/old/Report5.class b/comp/src/gb.report2/.src/Tests/old/Report5.class new file mode 100644 index 00000000..6f5e67c2 --- /dev/null +++ b/comp/src/gb.report2/.src/Tests/old/Report5.class @@ -0,0 +1,8 @@ +' Gambas class file + + +Public Sub Report_Open() + + + +End diff --git a/comp/src/gb.report2/.src/Tests/old/Report5.report b/comp/src/gb.report2/.src/Tests/old/Report5.report new file mode 100644 index 00000000..4b467152 --- /dev/null +++ b/comp/src/gb.report2/.src/Tests/old/Report5.report @@ -0,0 +1,34 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,109,80) + Padding = ReportPadding["Top:1cm;Bottom:1cm;Left:1cm;Right:1cm"] + Index = 0 + Text = ("") + { ReportLabel1 ReportLabel + #MoveScaled(16,1,62,12) + Height = "20mm" + Brush = ReportBrush["LinearGradient(0.67,0,0.35,0,[#000000,#FFFFFF],[0.33,0.73])"] + Font = Font["Bold,+10"] + Margin = ReportMargin["Top:5mm;Bottom:5mm;Left:5mm;Right:5mm"] + Border = ReportBorder["Top:1mm #000000;Bottom:1mm #000000;Left:1mm #000000;Right:1mm #000000;TopLeftCorner:5mm;TopRightCorner:5mm;BottomRightCorner:5mm;BottomLeftCorner:5mm"] + Background = ReportBrush["RadialGradient(0.7,0.14,0.5,0.84,0.18,[#FFFFFF,#000000],[0,1])"] + Text = ("Coucou") + Alignment = Align.Center + } + { ReportHBox1 ReportHBox + #MoveScaled(19,19,65,16) + Height = "8cm" + Margin = ReportMargin["Bottom:10mm;Left:2cm;Right:2cm"] + Background = ReportBrush["RadialGradient(0.53,0.53,0.5,0.88,0.18,[#000000,#FFFFFF,#0000FF],[0,1,0.5])"] + BoxShadow = ReportBoxShadow["2px 2px 10px 0px #55FF7F"] + } + { ReportVBox1 ReportVBox + #MoveScaled(32,44,62,12) + Height = "2cm" + Margin = ReportMargin["Bottom:10mm"] + Expand = True + Background = ReportBrush["#FF7F00"] + } + Index = 0 +} diff --git a/comp/src/gb.report2/.src/Tests/old/Report51.class b/comp/src/gb.report2/.src/Tests/old/Report51.class new file mode 100644 index 00000000..4f5e1f23 --- /dev/null +++ b/comp/src/gb.report2/.src/Tests/old/Report51.class @@ -0,0 +1,207 @@ +' Gambas class file + +Private hResult As Result +Private hResult2 As Result +Private hVBox As ReportVBox +Private $iTotal As Integer +Private $bReel As Boolean ' = True +Public Sub Report_Open() + Dim hPanel As ReportPanel + Dim hHBox1 As ReportHBox + Dim hLine As ReportLine + Dim hLblIlot As ReportLabel + Dim hVBox2 As ReportVBox + Dim i As Integer + 'Report.Debug = True + ReportHBox3.DataCount = 8 + + hVBox = New ReportVBox(ReportHBox1) + hHBox1 = New ReportHBox(hVBox) + hVBox.Expand = True + hHBox1.Height = "1cm" + hLblIlot = New ReportLabel(hHBox1) + hLblIlot.Expand = True + For i = 0 To 2 + hline = New ReportLine(hHBox1) + hLine.Width = "6mm" + hline.LineWidth = "0.1mm" + hline.Direction = Align.topRight + Next + + + + 'hVBox.Spacing = "1mm" + Connections["Connection2"].Open + hResult = db.Exec("select * from secteurs where ordre<=3 order by ordre") + 'Report.Debug = True + 'ReportHBox1.BackGround = ReportBrush.Color(Color.Yellow) + 'hVBox.BackGround = ReportBrush.Color(Color.red) + hVBox.Expand = True + For Each hResult + + AddIlot(hResult!nom, hResult!id_secteur) + If hResult.Index = hResult.Max Then Break + hLblIlot = New ReportLabel(hVBox) + hLblIlot.Height = "4mm" + hLblIlot.Expand = True + Next + + hVBox = New ReportVBox(ReportHBox1) + 'hVBox.Spacing = "2mm" + 'hVBox.Spacing = "1mm" + hResult = db.Exec("select * from secteurs where ordre > 3 order by ordre") + 'Report.Debug = True + 'ReportHBox1.BackGround = ReportBrush.Color(Color.Yellow) + 'hVBox.BackGround = ReportBrush.Color(Color.red) + hVBox2 = New ReportVBox(hVBox) + hVBox2.Border = ReportBorder["Top:0.1mm #000000;Left:0.1mm #000000;Right:0.1mm #000000;Bottom:0.1mm #000000"] + hVBox2.Expand = True + hVBox2.Margin.Bottom = "4mm" + hLblIlot = New ReportLabel(hVBox2) + hLblIlot.Text = "Parcellaire 2015" + hLblIlot.Font = Font["Times,Bold,+3"] + hLblIlot.Margin.Top = "2mm" + hLblIlot.Alignment = Align.Center + hLblIlot = New ReportLabel(hVBox2) + hLblIlot.Text = "Date :" + hLblIlot.Margin.Top = "2mm" + hLblIlot.Padding.Left = "2mm" + 'hLblIlot.Border.bottom.Width = "2px" + hHBox1 = New ReportHBox(hVBox) + hVBox.Expand = True + hHBox1.Height = "1cm" + hLblIlot = New ReportLabel(hHBox1) + hLblIlot.Expand = True + For i = 0 To 2 + hline = New ReportLine(hHBox1) + hLine.Width = "6mm" + hline.LineWidth = "0.1mm" + hline.Direction = Align.topRight + Next + For Each hResult + + AddIlot(hResult!nom, hResult!id_secteur) + hLblIlot = New ReportLabel(hVBox) + hLblIlot.Height = "3mm" + Next + +End + +Private Sub AddIlot(sIlot As String, siIlot As String) + + Dim hHBox1 As New ReportHBox(hVBox) + Dim hLblIlot As New ReportLabel(hHBox1) + Dim hVBoxList As New ReportVBox(hHBox1) + Dim hHBoxLine As ReportHBox + Dim hLblParcelle As ReportLabel + Dim i As Integer + Dim fTot As Float + Dim hLine As ReportLine + + + + hLblIlot.Rotate = 90 + hVBoxList.Expand = True + + hVBoxList.Border.Top.Width = "0.1mm" + hVBoxList.Border.Right.Width = "0.1mm" + hHbox1.Border.Bottom.Width = "0.1mm" + hLblIlot.Padding = ReportPadding["Top:1mm;Bottom:1mm;Left:1mm;Right:1mm"] + + hLblIlot.Text = sIlot + hLblParcelle = hLblIlot + hLblIlot.Border = ReportBorder["Top:0.1mm #000000;Left:0.1mm #000000;Right:0.1mm #000000"] + 'ecartement + 'parcelle + 'surface + 'ordre + hResult2 = db.Exec("Select p.ecartement ecartement, p.nom parcelle, p.surface surface, p.ordre ordre from parcelles p where p.id_secteur=&1 order by p.ordre", siIlot) + + +' hResult2 = db.Exec("Select p.ecartement ecartement, p.nom parcelle, sum(lcp.surface) surface, lip.ordre ordre From liaisonilotparc lip " +' "Left join parcelles p On p.id = lip.id_parc " +' "Left join liaisoncadparc lcp On lcp.idparc = p.id " +' "Left Join cadastre c On c.id = lcp.idcad " +' "where id_ilot = &1 group by p.nom order by lip.ordre", iIlot) + + For Each hResult2 + If hResult2!ordre = 0 Then Continue + hHBoxLine = New ReportHBox(hVBoxList) + hHBoxLine.Expand = True + 'hHBoxLine.Height = "5mm" + + + hLblIlot = New ReportLabel(hHBoxLine) + Try hLblIlot.Text = Format(hResult2!ecartement / 100, "0.0") + 'If hResult2!ecartement > 250 Then hLblIlot.Font.Bold = True + hLblIlot.Alignment = Align.Right + hLblIlot.Border.Right.Width = "0.1mm" + hLblIlot.Font.Size = 6 + hLblIlot.Width = "0.5cm" + hLblIlot.Padding.Right = "0.2mm" + 'hLblIlot.Padding.Top = "0.4mm" + + hLblIlot.Brush = ReportBrush.Color(Color.Gray) + + hLblIlot = New ReportLabel(hHBoxLine) + hLblIlot.Font.Size = 9 + hHBoxLine.Border = ReportBorder["Bottom:0.1mm #000000;"] + hLblIlot.Text = hResult2!parcelle + hLblIlot.Padding.Left = "1mm" + hLblIlot.Padding.Top = "0.6mm" + hLblIlot.Padding.Left = "0.5mm" + hLblIlot.Padding.Bottom = "0.6mm" + hLblIlot.Expand = True + 'hHBoxLine.Expand = True + 'hLblIlot.Border = ReportBorder["Bottom:0.1mm #00000"] + hLblIlot = New ReportLabel(hHBoxLine) + hLblIlot.Width = "1.2cm" + hLblIlot.Border.Left.Width = "0.1mm" + hLblIlot.Alignment = Align.Right + + Try hLblIlot.Text = Format(IIf($bReel, hResult2!surface / 10000, NearFive(hResult2!surface)), "0.00") + Try $iTotal += hResult2!surface + hLblIlot.Padding.Right = "1mm" + hLblIlot.Padding.Top = "0.1mm" + hLblIlot.Padding.Left = "0.5mm" + hLblIlot.Padding.Bottom = "0.1mm" + Try fTot += hResult2!surface + hLblIlot.Font.Size = 9 + + For i = 0 To 2 + hLblIlot = New ReportLabel(hHBoxLine) + hLblIlot.Width = "6mm" + hLblIlot.Border = ReportBorder["Left:0.1mm #000000;"] + + Next + + +Next + + ' hLblIlot = New ReportLabel(hVBoxList) + ' hLblIlot.Text = Format(IIf($bReel, fTot / 10000, NearFive(fTot)), "0.00") + ' hLblIlot.Font.Size = 7 + ' hLblIlot.Padding.Top = "0.8mm" + ' hLblIlot.Alignment = Align.Right + hLblParcelle.Text &= " (" & Format(IIf($bReel, fTot / 10000, NearFive(fTot)), "0.00") & ")" + +End + +Public Sub ReportLabel1_Data(Index As Integer) + + Last.Data = "Parcellaire " & Year(Now) + +End + + +Public Function NearFive(Value As Integer) As Float + +Return Round((Value / 10000) * 20, 0) / 20 + +End + +Public Sub ReportLabel21_Data(Index As Integer) + + Last.data = Str($iTotal / 10000) & " ha" + +End diff --git a/comp/src/gb.report2/.src/Tests/old/Report51.report b/comp/src/gb.report2/.src/Tests/old/Report51.report new file mode 100644 index 00000000..174ef1dc --- /dev/null +++ b/comp/src/gb.report2/.src/Tests/old/Report51.report @@ -0,0 +1,128 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,95,80) + Padding = ReportPadding["Top:1cm;Bottom:1cm;Left:1.5cm;Right:1cm"] + Spacing = "1cm" + Count = 2 + Index = 0 + Text = ("Recto") + { ReportHBox1 ReportHBox + #MoveScaled(3,15,91,52) + Height = "10cm" + Expand = True + Spacing = "8mm" + } + Index = 1 + Text = ("Verso") + { ReportVBox1 ReportVBox + #MoveScaled(2,1,89,71) + Padding = ReportPadding["Top:2cm;Bottom:1cm;Right:1cm"] + Expand = True + { ReportHBox2 ReportHBox + #MoveScaled(0,0,90,6) + { ReportLabel6 ReportLabel + #MoveScaled(1,1,7,4) + Width = "1cm" + Font = Font["+2"] + Padding = ReportPadding["Top:1mm;Bottom:1mm;Left:1mm;Right:1mm"] + Border = ReportBorder["Top:0.1mm #000000;Bottom:0.1mm #000000;Left:0.1mm #000000;Right:0.1mm #000000"] + Text = ("N°") + Alignment = Align.Center + } + { ReportLabel5 ReportLabel + #MoveScaled(9,1,13,4) + Width = "3cm" + Font = Font["+2"] + Padding = ReportPadding["Top:1mm;Bottom:1mm;Left:1mm;Right:1mm"] + Border = ReportBorder["Top:0.1mm #000000;Bottom:0.1mm #000000;Left:0.1mm #000000;Right:0.1mm #000000"] + Text = ("Date") + Alignment = Align.Center + } + { ReportLabel7 ReportLabel + #MoveScaled(23,0,8,5) + Font = Font["+2"] + Expand = True + Border = ReportBorder["Top:0.1mm #000000;Bottom:0.1mm #000000;Left:0.1mm #000000;Right:0.1mm #000000"] + } + { ReportLabel8 ReportLabel + #MoveScaled(33,1,5,5) + Font = Font["+2"] + Expand = True + Border = ReportBorder["Top:0.1mm #000000;Bottom:0.1mm #000000;Left:0.1mm #000000;Right:0.1mm #000000"] + } + { ReportLabel9 ReportLabel + #MoveScaled(40,0,4,5) + Font = Font["+2"] + Expand = True + Border = ReportBorder["Top:0.1mm #000000;Bottom:0.1mm #000000;Left:0.1mm #000000;Right:0.1mm #000000"] + } + { ReportLabel11 ReportLabel + #MoveScaled(47,0,4,5) + Font = Font["+2"] + Expand = True + Border = ReportBorder["Top:0.1mm #000000;Bottom:0.1mm #000000;Left:0.1mm #000000;Right:0.1mm #000000"] + } + { ReportLabel12 ReportLabel + #MoveScaled(55,0,4,5) + Font = Font["+2"] + Expand = True + Border = ReportBorder["Top:0.1mm #000000;Bottom:0.1mm #000000;Left:0.1mm #000000;Right:0.1mm #000000"] + } + { ReportLabel10 ReportLabel + #MoveScaled(68,0,14,5) + Width = "5cm" + Font = Font["+2"] + Padding = ReportPadding["Top:1mm;Bottom:1mm;Left:1mm;Right:1mm"] + Border = ReportBorder["Top:0.1mm #000000;Bottom:0.1mm #000000;Left:0.1mm #000000;Right:0.1mm #000000"] + Text = ("Observations") + Alignment = Align.Center + } + } + { ReportHBox3 ReportHBox + #MoveScaled(0,8,89,14) + Expand = True + { ReportLabel13 ReportLabel + #MoveScaled(0,1,7,4) + Width = "1cm" + Border = ReportBorder["Top:0.1mm #000000;Bottom:0.1mm #000000;Left:0.1mm #000000;Right:0.1mm #000000"] + } + { ReportLabel14 ReportLabel + #MoveScaled(8,1,13,4) + Width = "3cm" + Border = ReportBorder["Top:0.1mm #000000;Bottom:0.1mm #000000;Left:0.1mm #000000;Right:0.1mm #000000"] + } + { ReportLabel15 ReportLabel + #MoveScaled(22,0,8,5) + Expand = True + Border = ReportBorder["Top:0.1mm #000000;Bottom:0.1mm #000000;Left:0.1mm #000000;Right:0.1mm #000000"] + } + { ReportLabel16 ReportLabel + #MoveScaled(32,1,5,5) + Expand = True + Border = ReportBorder["Top:0.1mm #000000;Bottom:0.1mm #000000;Left:0.1mm #000000;Right:0.1mm #000000"] + } + { ReportLabel17 ReportLabel + #MoveScaled(39,0,4,5) + Expand = True + Border = ReportBorder["Top:0.1mm #000000;Bottom:0.1mm #000000;Left:0.1mm #000000;Right:0.1mm #000000"] + } + { ReportLabel18 ReportLabel + #MoveScaled(46,0,4,5) + Expand = True + Border = ReportBorder["Top:0.1mm #000000;Bottom:0.1mm #000000;Left:0.1mm #000000;Right:0.1mm #000000"] + } + { ReportLabel19 ReportLabel + #MoveScaled(54,0,4,5) + Expand = True + Border = ReportBorder["Top:0.1mm #000000;Bottom:0.1mm #000000;Left:0.1mm #000000;Right:0.1mm #000000"] + } + { ReportLabel20 ReportLabel + #MoveScaled(67,0,14,5) + Width = "5cm" + Border = ReportBorder["Top:0.1mm #000000;Bottom:0.1mm #000000;Left:0.1mm #000000;Right:0.1mm #000000"] + } + } + } + Index = 0 +} diff --git a/comp/src/gb.report2/.src/Tests/old/Report6.class b/comp/src/gb.report2/.src/Tests/old/Report6.class new file mode 100644 index 00000000..0a5fa73a --- /dev/null +++ b/comp/src/gb.report2/.src/Tests/old/Report6.class @@ -0,0 +1,2 @@ +' Gambas class file + diff --git a/comp/src/gb.report2/.src/Tests/old/Report6.report b/comp/src/gb.report2/.src/Tests/old/Report6.report new file mode 100644 index 00000000..a0fcce8b --- /dev/null +++ b/comp/src/gb.report2/.src/Tests/old/Report6.report @@ -0,0 +1,14 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,64,64) + Index = 0 + Text = ("") + { ReportLabel1 ReportTextLabel + #MoveScaled(8,4,48,48) + Border = ReportBorder["Top:2mm LinearGradient(1,1,0,0,[#FF0000,#FFFFFF],[1,0]);Bottom:2mm LinearGradient(1,1,0,0,[#FF0000,#FFFFFF],[1,0]);Left:2mm LinearGradient(1,1,0,0,[#FF0000,#FFFFFF],[1,0]);Right:2mm LinearGradient(1,1,0,0,[#FF0000,#FFFFFF],[1,0]);TopLeftCorner:1mm 0cm;TopRightCorner:5mm 1cm;BottomRightCorner:1mm 15mm;BottomLeftCorner:3mm 7mm"] + Text = ("Testtest

    \n\n
    ") + Alignment = Align.Center + } + Index = 0 +} diff --git a/comp/src/gb.report2/.src/Tests/old/Report7.class b/comp/src/gb.report2/.src/Tests/old/Report7.class new file mode 100644 index 00000000..b009d3b2 --- /dev/null +++ b/comp/src/gb.report2/.src/Tests/old/Report7.class @@ -0,0 +1,30 @@ +' Gambas class file + + +Public Sub ReportDrawingArea_Layout() + + + +End + + +Public Sub ReportDrawingArea1_Layout(Width As Float, Height As Float, Index As Integer) + + Last.SizeHints = ReportSizeHints.FromString("3cm", "4cm", False) + +End + + +Public Sub ReportDrawingArea1_Draw(Width As Float, Height As Float, Index As Integer) + +'Print "Largeur passée = " & Width +'Print "Paint.Width = " & Paint.Width + Draw.line(0, 0, Paint.Width, Paint.Height) + +End + +Public Sub Report_Open() + + + +End diff --git a/comp/src/gb.report2/.src/Tests/old/Report7.report b/comp/src/gb.report2/.src/Tests/old/Report7.report new file mode 100644 index 00000000..85481ab2 --- /dev/null +++ b/comp/src/gb.report2/.src/Tests/old/Report7.report @@ -0,0 +1,13 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,64,64) + Padding = ReportPadding["Top:2cm;Bottom:2cm;Left:2cm;Right:2cm"] + Index = 0 + Text = ("") + { ReportDrawingArea1 ReportDrawingArea + #MoveScaled(4,8,59,34) + Border = ReportBorder["Top:2px #000000;Bottom:2px #000000;Left:2px #000000;Right:2px #000000"] + } + Index = 0 +} diff --git a/comp/src/gb.report2/.src/Tests/old/Report8.class b/comp/src/gb.report2/.src/Tests/old/Report8.class new file mode 100644 index 00000000..0a5fa73a --- /dev/null +++ b/comp/src/gb.report2/.src/Tests/old/Report8.class @@ -0,0 +1,2 @@ +' Gambas class file + diff --git a/comp/src/gb.report2/.src/Tests/old/Report8.report b/comp/src/gb.report2/.src/Tests/old/Report8.report new file mode 100644 index 00000000..8039d12d --- /dev/null +++ b/comp/src/gb.report2/.src/Tests/old/Report8.report @@ -0,0 +1,22 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,64,64) + Index = 0 + Text = ("") + { ReportPanel1 ReportPanel + #MoveScaled(1,4,61,53) + Expand = True + { ReportPanel2 ReportPanel + #MoveScaled(16,7,20,14) + Left = "23mm" + Top = "16mm" + Width = "55mm" + Height = "38mm" + Border = ReportBorder["Top:1px #000000;Bottom:1px #000000;Left:1px #000000;Right:1px #000000;TopLeftCorner:5mm 4mm;TopRightCorner:7mm 15mm;BottomRightCorner:5mm;BottomLeftCorner:5mm 2mm"] + Background = ReportBrush["#00FF00"] + BoxShadow = ReportBoxShadow["1mm 1mm 6px -1px #000000"] + } + } + Index = 0 +} diff --git a/comp/src/gb.report2/.src/Tests/old/Report9.class b/comp/src/gb.report2/.src/Tests/old/Report9.class new file mode 100644 index 00000000..fdfb323f --- /dev/null +++ b/comp/src/gb.report2/.src/Tests/old/Report9.class @@ -0,0 +1,9 @@ +' Gambas class file + + +Public Sub Report_Open() + + ReportImage1.Image = Image.Load("~/Documents/SCEA BODARD/Banque/Factures Prêt/Prêt N°00000221849/SCB-Distillerie-1-4.jpg") + + +End diff --git a/comp/src/gb.report2/.src/Tests/old/Report9.report b/comp/src/gb.report2/.src/Tests/old/Report9.report new file mode 100644 index 00000000..252cdbd9 --- /dev/null +++ b/comp/src/gb.report2/.src/Tests/old/Report9.report @@ -0,0 +1,12 @@ +# Gambas Form File 3.0 + +{ Report Report + #MoveScaled(0,0,64,64) + Index = 0 + Text = ("") + { ReportImage1 ReportImage + #MoveScaled(1,1,53,51) + Expand = True + } + Index = 0 +} diff --git a/comp/src/gb.report2/.src/Tools/CPrint.class b/comp/src/gb.report2/.src/Tools/CPrint.class new file mode 100644 index 00000000..414e1d2d --- /dev/null +++ b/comp/src/gb.report2/.src/Tools/CPrint.class @@ -0,0 +1,72 @@ +' Gambas class file + +Create Static + +Private $hPrinter As New Printer As "Printer" +Private $hReport As Report + +Static Public Sub InitPrinterFromReport(hPrinter As Printer, hReport As Report) + + hPrinter.FullPage = True + + hPrinter.Orientation = hReport.Orientation + + If hReport.Paper = Printer.Custom Then + 'pnlCustom.Enabled = True + hPrinter.PaperWidth = Report.UnitTo(TSizeParse[hReport.Width].ToInch(), "in", "mm") + hPrinter.PaperHeight = Report.UnitTo(TSizeParse[hReport.Height].ToInch(), "in", "mm") + Else + hPrinter.Paper = hReport.Paper + Endif + +End + +Public Sub PrintReport(hReport As Report, Optional MyPrinter As Printer) + + Dim hImage As Image + + $hReport = hReport + $hReport.Scale = 1 + '$hPrint = hReport.Clone() + If MyPrinter Then + $hPrinter = MyPrinter + Else + $hPrinter = New Printer + Endif + + Object.Attach($hPrinter, Me, "Printer") + + InitPrinterFromReport($hPrinter, $hReport) + + If Not MyPrinter Then + If $hPrinter.Configure() Then Return + Endif + + ' The report layout only works on Image, i.e. when DPI = 72 + hImage = New Image(1, 1) + Paint.Begin(hImage) + $hReport.Layout() + Paint.End + + $hPrinter.Print + +End + +Public Sub Printer_Draw() + + Paint.FontScale = 25.4 / 72 * Paint.W / $hPrinter.PaperWidth * 72 / 96 * 96 / $hPrinter.Resolution + $hReport.Paint($hPrinter.Page) + +End + +Public Sub Printer_Begin() + + $hPrinter.Count = $hReport.PageCount + +End + +Public Sub Printer_End() + + $hReport = Null + +End diff --git a/comp/src/gb.report2/.src/Tools/MUtil.module b/comp/src/gb.report2/.src/Tools/MUtil.module new file mode 100644 index 00000000..7ff8550f --- /dev/null +++ b/comp/src/gb.report2/.src/Tools/MUtil.module @@ -0,0 +1,24 @@ +' Gambas module file + +Private Dash As Float[] = [2.0, 1.0] +Private Dot As Float[] = [1.0, 1.0] +Private DashDot As Float[] = [2.0, 1.0, 1.0, 1.0] +Private DashDotDot As Float[] = [2.0, 1.0, 1.0, 1.0, 1.0, 1.0] + + +Public Sub GetBorder(iStyle As Integer) As Float[] + + Select Case iStyle + + Case Line.Dash + Return Dash + Case Line.Dot + Return Dot + Case Line.DashDot + Return DashDot + Case Line.DashDotDot + Return DashDotDot + End Select + +End + diff --git a/comp/src/gb.report2/.src/Types/Base/ReportBrush.class b/comp/src/gb.report2/.src/Types/Base/ReportBrush.class new file mode 100644 index 00000000..49b334b2 --- /dev/null +++ b/comp/src/gb.report2/.src/Types/Base/ReportBrush.class @@ -0,0 +1,222 @@ +' Gambas class file + +Export + +Public _Type As Integer +Public _X As Float +Public _Y As Float +Public _X2 As Float +Public _Y2 As Float +Public _radius As Float +Public _Image As Image +Public _Color As Integer[] = [0, &HFFFFFF&] +Public _Pos As Float[] = [0, 1] +Private _ImageDir As String + +Public Function _PaintBrush(X1 As Integer, Y1 As Integer, X2 As Integer, Y2 As Integer) As PaintBrush + + Dim hBrush As PaintBrush + Dim fradius As Float + Dim Width As Integer = X2 - X1 + Dim Height As Integer = Y2 - Y1 + + Select Case Me._Type + Case 0 + hBrush = Paint.Color(_Color[0]) + Case 1 + hBrush = paint.Image(_Image, X1, Y1) + Case 2 + hBrush = paint.LinearGradient(Width * _X, Height * _Y, Width * _X2, Height * _Y2, _Color, _Pos) + Case 3 + fradius = Width * _radius + hBrush = paint.RadialGradient(Width * _X, Height * _Y, fradius, Width * _X2, Height * _Y2, _Color, _Pos) + End Select + hBrush.Translate(x1, Y1) + Return hBrush + +End + +Static Public Sub _get(sValue As String) As ReportBrush + + Dim hBrush As New ReportBrush + Dim iPos As Integer + Dim sType As String + + Dim ars As String[] + + + + If Not svalue Then Return Null + + sValue = Trim(sValue) + + iPos = InStr(sValue, "(") + + If iPos Then sType = Left(sValue, iPos - 1) + 'pas de parenthese de fin + If ipos And Not (sValue Ends ")") Then + Error.Raise + Else + If iPos Then svalue = Left(Mid(svalue, ipos + 1), -1) + Endif + ars = Split(sValue, ",", "[]") + Select Case LCase(sType) + Case "image" + hBrush._Type = 1 + + hBrush._Image = Image.Load(Replace(ars[0], "\"", "")) + hBrush._ImageDir = ars[0] + Case "radialgradient" + hBrush._Type = 3 + hBrush._X = CFloat(ars[0]) + hBrush._Y = CFloat(ars[1]) + hBrush._Radius = CFloat(ars[2]) + hBrush._X2 = CFloat(ars[3]) + hBrush._Y2 = CFloat(ars[4]) + hBrush._Color = GetIntegerArray(ars[5]) + hBrush._Pos = GetFloatArray(ars[6]) + + Case "lineargradient" + + hBrush._Type = 2 + hBrush._X = CFloat(ars[0]) + hBrush._Y = CFloat(ars[1]) + hBrush._X2 = CFloat(ars[2]) + hBrush._Y2 = CFloat(ars[3]) + hBrush._Color = GetIntegerArray(ars[4]) + hBrush._Pos = GetFloatArray(ars[5]) + + Case Else + 'correction de l'hexon + '= Val(Replace(ars[0], "#", "&H") & "00&") + If ars[0] Begins "#" Then ars[0] = Mid(ars[0], 2) + hBrush._Color[0] = Val("&H" & IIf(Len(ars[0]) = 8, ars[0], 00 & ars[0])) + End Select + Return hBrush + +Finally + If hBrush._Color.Count = 0 Then hBrush._Color = [0, &hFFFFFF&] + If hBrush._Color.Count < 2 Then hBrush._Color.Add(&hFFFFFF&) + If hBrush._Pos.Count < 2 Then hBrush._Pos = [0.0, 1.0] + + +Catch + Return hBrush + +End + +Static Private Function GetIntegerArray(sValue As String) As Integer[] + + Dim ari As New Integer[] + Dim s As String + + For Each s In Split(sValue) + If s Begins "#" Then s = Mid(s, 2) + + ari.Add(Val("&H" & IIf(Len(s) = 8, s, "00" & s))) + Next + + Return ari + +End + +Static Private Function GetFloatArray(sValue As String) As Float[] + + Dim arf As New Float[] + Dim s As String + + For Each s In Split(sValue) + arf.Add(CFloat(s)) + Next + + Return arf + +End + +Public Function ToString() As String + + Dim i As Integer + Dim f As Float + Dim sValue As String + + Select Case _Type + Case 0 + sValue = "&H" & Hex(_Color[0], 8) & "&" + Case 2, 3 + If _Type = 3 Then + sValue = "RadialGradient(" & _X & "," & _Y & "," & _Radius & "," & _X2 & "," & _Y2 & ",[" + + Else + sValue = "LinearGradient(" & _X & "," & _Y & "," & _X2 & "," & _Y2 & ",[" + Endif + + For Each i In _Color + sValue &= "&H" & Hex(i, 6) & "&," + + Next + + sValue = Left(sValue, -1) + + sValue &= "],[" + + For Each f In _Pos + sValue &= f & "," + + Next + sValue = Left(sValue, -1) + + sValue &= "])" + Case 1 + sValue = "Image(" & _ImageDir & ")" + + End Select + + Return svalue + +End + +Static Public Function Color(iColor As Integer) As ReportBrush + + Dim hBrush As New ReportBrush + + hBrush._Color[0] = iColor + hBrush._Type = 0 + Return hBrush + +End + +Static Public Function LinearGradient(X As Float, Y As Float, X2 As Float, Y2 As Float, aColor As Integer[], aPos As Float[]) As ReportBrush + Dim hBrush As New ReportBrush + + hBrush._X = X + hBrush._Y = Y + hBrush._X2 = X2 + hBrush._Y2 = Y2 + hBrush._Color = aColor + hBrush._Pos = aPos + hBrush._Type = 2 + Return hBrush +End + +Static Public Function RadialGradient(X As Float, Y As Float, Radius As Float, X2 As Float, Y2 As Float, aColor As Integer[], aPos As Float[]) As ReportBrush + Dim hBrush As New ReportBrush + + hBrush._X = X + hBrush._Y = Y + hBrush._X2 = X2 + hBrush._Y2 = Y2 + hBrush._radius = Radius + hBrush._Color = aColor + hBrush._Pos = aPos + hBrush._Type = 3 + Return hBrush +End + +Static Public Function Image(hImage As Image) As ReportBrush + Dim hBrush As New ReportBrush + + hBrush._Image = hImage + hBrush._Type = 1 + Return hBrush + +End diff --git a/comp/src/gb.report2/.src/Types/Base/ReportMargin.class b/comp/src/gb.report2/.src/Types/Base/ReportMargin.class new file mode 100644 index 00000000..3574c68a --- /dev/null +++ b/comp/src/gb.report2/.src/Types/Base/ReportMargin.class @@ -0,0 +1,40 @@ +' Gambas class file + +Export +Inherits ReportPadding +Static Public Sub _Get(Value As String) As ReportMargin + + Dim hMargin As New ReportMargin + Dim hSize As TSizeParse + Dim s As String + Dim ars As String[] + + For Each s In Split(Value, ";") + ars = Scan(s, "*:*") + If ars.count > 1 Then + Select Case LCase(ars[0]) + Case "left" + hMargin.Left = ars[1] + Case "top" + hMargin.top = ars[1] + Case "bottom" + hMargin.bottom = ars[1] + Case "right" + hMargin.Right = ars[1] + Case Else + + End Select + Else + Try hSize = New TSizeParse(s) + If hSize <> Null Then + hMargin.Left = s + hMargin.Right = s + hMargin.Bottom = s + hMargin.Top = s + Endif + Endif + + Next + Return hMargin + +End diff --git a/comp/src/gb.report2/.src/Types/Base/ReportPadding.class b/comp/src/gb.report2/.src/Types/Base/ReportPadding.class new file mode 100644 index 00000000..6c4ab28a --- /dev/null +++ b/comp/src/gb.report2/.src/Types/Base/ReportPadding.class @@ -0,0 +1,94 @@ +' Gambas class file + +Export + +'>>>>>>>>>>>>>>>>>>>>>> PUBLIC VARIABLES >>>>>>>>>>>>>>>>>>>>>>>>> +Public {Left} As String +Public Right As String +Public Top As String +Public Bottom As String +Public _Left As Float +Public _Right As Float +Public _Top As Float +Public _Bottom As Float + +'>>>>>>>>>>>>>>>>>>>>>>>>>> PROPERTIES >>>>>>>>>>>>>>>>>>>>>>>>>>> +Property Read _Width As Float +Property Read _Height As Float + +'>>>>>>>>>>>>>>>>>>>>>> PRIVATE VARIABLES >>>>>>>>>>>>>>>>>>>>>>>> + +'##################### PUBLIC PROCEDURES ######################### +Public Sub IsActive() As Boolean + + If {Left} Or If Top Or If Right Or If Bottom Then Return True + Return False + +End + +Static Public Sub _Get(Value As String) As ReportPadding + + Dim hPadding As New ReportPadding + Dim hSize As TSizeParse + Dim s As String + Dim ars As String[] + + For Each s In Split(Value, ";") + ars = Scan(s, "*:*") + If ars.count > 1 Then + Select Case LCase(ars[0]) + Case "left" + hPadding.Left = ars[1] + Case "top" + hPadding.top = ars[1] + Case "bottom" + hPadding.bottom = ars[1] + Case "right" + hPadding.Right = ars[1] + Case Else + + End Select + Else + Try hSize = New TSizeParse(s) + If hSize <> Null Then + hPadding.Left = s + hPadding.Right = s + hPadding.Bottom = s + hPadding.Top = s + Endif + Endif + + Next + Return hPadding + +End + +Public Sub _NormalizeUnits() + + Dim hSizeParse As TSizeParse + + hSizeParse = TSizeParse[{Left}] + _Left = hSizeParse.ToInch() + hSizeParse = TSizeParse[Top] + _Top = hSizeParse.ToInch() + hSizeParse = TSizeParse[Right] + _Right = hSizeParse.ToInch() + hSizeParse = TSizeParse[Bottom] + _Bottom = hSizeParse.ToInch() + +End + +'##################### PRIVATE PROCEDURES ######################## + +'######################## PROPERTIES ############################# +Private Function _Width_Read() As Float + + Return _Left + _Right + +End + +Private Function _Height_Read() As Float + + Return _top + _Bottom + +End diff --git a/comp/src/gb.report2/.src/Types/Border/ReportBorder.class b/comp/src/gb.report2/.src/Types/Border/ReportBorder.class new file mode 100644 index 00000000..eb22f118 --- /dev/null +++ b/comp/src/gb.report2/.src/Types/Border/ReportBorder.class @@ -0,0 +1,205 @@ +' Gambas class file + +Export +'>>>>>>>>>>>>>>>>>>>>>> PUBLIC VARIABLES >>>>>>>>>>>>>>>>>>>>>>>>> +Static Public Const None As Integer = 0 +Static Public Const Solid As Integer = 1 + +Public _Left As Float +Public _Right As Float +Public _Top As Float +Public _Bottom As Float +Public Style As Integer +'>>>>>>>>>>>>>>>>>>>>>>>>>> PROPERTIES >>>>>>>>>>>>>>>>>>>>>>>>>>> +Property Read Top As _ReportBorderSide +Property Read {Left} As _ReportBorderSide +Property Read bottom As _ReportBorderSide +Property Read {Right} As _ReportBorderSide +Property Read RoundCorner As _ReportRoundCorner +Property Width As String +Property Brush As ReportBrush +Property Read _Height As Float +Property Read _Width As Float + + +'>>>>>>>>>>>>>>>>>>>>>> PRIVATE VARIABLES >>>>>>>>>>>>>>>>>>>>>>>> +' Static Private $aShadowStyle As String[] = ["none", "solid", "gradiant"] +' Static Private $aAlign As String[] = Classes["Align"].Symbols + +Private hTop As New _ReportBorderSide +Private hBottom As New _ReportBorderSide +Private hLeft As New _ReportBorderSide +Private hRight As New _ReportBorderSide +Private hRCorner As New _ReportRoundCorner + + +'##################### PUBLIC PROCEDURES ######################### + +Static Public Function _get(sValue As String) As ReportBorder + + Dim hReportBorder As New ReportBorder + + Dim sBorder As String + Dim aScan As String[] + + If Not sValue Then Return hReportBorder + hReportBorder.Style = ReportBorder.Solid + hReportBorder.RoundCorner._Active = False + For Each sBorder In Split(sValue, ";") + + aScan = Scan(sBorder, "*:*") + Select Case LCase(Trim(aScan[0])) + Case "border" + FillObject(hReportBorder, aScan[1]) + Case "left" + FillObject(hReportBorder.Left, aScan[1]) + Case "right" + FillObject(hReportBorder.Right, aScan[1]) + Case "bottom" + FillObject(hReportBorder.bottom, aScan[1]) + Case "top" + FillObject(hReportBorder.Top, aScan[1]) + Case "topleftcorner" + hReportBorder.RoundCorner.TopLeft = aScan[1] + Case "toprightcorner" + hReportBorder.RoundCorner.TopRight = aScan[1] + Case "bottomleftcorner" + hReportBorder.RoundCorner.BottomLeft = aScan[1] + Case "bottomrightcorner" + hReportBorder.RoundCorner.BottomRight = aScan[1] + + End Select + + Next + +Finally + Return hReportBorder + +End + +Public Function ToString() As String + + Dim aValue As New String[] + + If Me.Style = ReportBorder.None Then Return 'aValue.Add("None") + 'If Me.Style = ReportBorder.Solid Then aValue.Add("Solid") + aValue.Add(Me.Width) + If Me.Top Then aValue.Add("Top") + If Me.Bottom Then aValue.Add("Bottom") + If Me.Left Then aValue.Add("Left") + If Me.Right Then aValue.Add("Right") + aValue.Add("#" & Hex(Me.Color, 6)) + Return aValue.Join() + +End + +Public Sub _NormalizeUnits() + + Dim hSizeParse As TSizeParse + + hSizeParse = New TSizeParse(hLeft.Width) + _Left = hSizeParse.GetValue() + hSizeParse = New TSizeParse(hRight.Width) + _Right = hSizeParse.GetValue() + hSizeParse = New TSizeParse(hTop.Width) + _Top = hSizeParse.GetValue() + hSizeParse = New TSizeParse(hBottom.Width) + _Bottom = hSizeParse.GetValue() + + hRCorner._NormalizeUnits() + +End + +'##################### PRIVATE PROCEDURES ######################## + +Static Private Sub FillObject(hObj As Object, sValue As String) + + Dim sBrush As String + + For Each sBrush In Split(sValue, " ") + + If IsDigit(Left(sBrush)) Then + Try hObj.Width = sBrush + Else + Try hObj.Brush = ReportBrush[sBrush] + If hObj.Brush = Null Then hObj.Brush = ReportBrush["&H0"] + Endif + Next + +End + +'######################## PROPERTIES ############################# + +Private Function Top_Read() As _ReportBorderSide + + Return hTop + +End + +Private Function Left_Read() As _ReportBorderSide + + Return hLeft + +End + +Private Function bottom_Read() As _ReportBorderSide + + Return hBottom + +End + +Private Function Width_Read() As String + + Return hLeft.Width + +End + +Private Sub Width_Write(Value As String) + + hLeft.Width = Value + hTop.Width = Value + hBottom.Width = Value + hRight.Width = Value + +End + +Private Function Brush_Read() As ReportBrush + + Return hLeft.Brush + +End + +Private Sub Brush_Write(Value As ReportBrush) + + hLeft.Brush = Value + hTop.Brush = Value + hBottom.Brush = Value + hRight.Brush = Value + +End + +Private Function Right_Read() As _ReportBorderSide + + Return hRight + +End + +Private Function RoundCorner_Read() As _ReportRoundCorner + + Return hRCorner + +End + + + +Private Function _Height_Read() As Float + + Return _Top + _Bottom + +End + +Private Function _Width_Read() As Float + + Return _Left + _Right + +End diff --git a/comp/src/gb.report2/.src/Types/Border/_ReportBorderSide.class b/comp/src/gb.report2/.src/Types/Border/_ReportBorderSide.class new file mode 100644 index 00000000..346443be --- /dev/null +++ b/comp/src/gb.report2/.src/Types/Border/_ReportBorderSide.class @@ -0,0 +1,16 @@ +' Gambas class file + +Export +Public Width As String +Public Brush As New ReportBrush +Public Round1 As String +Public Round2 As String +Public _Width As Float + +Public Sub _NormalizeUnits() + Dim hSizeParse As New TSizeParse(Width) + + _Width = hSizeParse.GetValue() + + +End diff --git a/comp/src/gb.report2/.src/Types/Border/_ReportRoundCorner.class b/comp/src/gb.report2/.src/Types/Border/_ReportRoundCorner.class new file mode 100644 index 00000000..e3eb4a5b --- /dev/null +++ b/comp/src/gb.report2/.src/Types/Border/_ReportRoundCorner.class @@ -0,0 +1,137 @@ +' Gambas class file + +Export +Public _Active As Boolean = False +Private $sTopLeft As String = "0cm" +Private $sTopRight As String = "0cm" +Private $sBottomLeft As String = "0cm" +Private $sBottomRight As String = "0cm" + +Property TopLeft As String +Property TopRight As String +Property BottomLeft As String +Property BottomRight As String + +Public _TopLeft1 As Float +Public _TopLeft2 As Float +Public _TopRight1 As Float +Public _TopRight2 As Float +Public _BottomLeft1 As Float +Public _BottomLeft2 As Float +Public _BottomRight1 As Float +Public _BottomRight2 As Float + +Private Function TopLeft_Read() As String + + Return $sTopLeft + +End + +Private Sub TopLeft_Write(Value As String) + + $sTopLeft = Value + _Active = True + +End + +Private Function TopRight_Read() As String + + Return $sTopRight + +End + +Private Sub TopRight_Write(Value As String) + + $sTopRight = Value + _Active = True + +End + +Private Function BottomLeft_Read() As String + + Return $sBottomLeft + +End + +Private Sub BottomLeft_Write(Value As String) + + $sBottomLeft = Value + _Active = True + +End + +Private Function BottomRight_Read() As String + + Return $sBottomRight + +End + +Private Sub BottomRight_Write(Value As String) + + $sBottomRight = Value + _Active = True + +End + +Public Sub _NormalizeUnits() + + Dim aEl As String[] + + Dim hSizeParse As TSizeParse + + + ael = Split($sTopLeft, " ") + If ael.Count = 1 Then + hSizeParse = New TSizeParse(ael[0]) + _TopLeft1 = hSizeParse.GetValue() + _TopLeft2 = _TopLeft1 + Else + If ael.Count = 2 Then + hSizeParse = New TSizeParse(ael[0]) + _TopLeft1 = hSizeParse.GetValue() + hSizeParse = New TSizeParse(ael[1]) + _TopLeft2 = hSizeParse.GetValue() + Endif + Endif + + ael = Split($sTopRight, " ") + If ael.Count = 1 Then + hSizeParse = New TSizeParse(ael[0]) + _TopRight1 = hSizeParse.GetValue() + _TopRight2 = _TopRight1 + Else + If ael.Count = 2 Then + hSizeParse = New TSizeParse(ael[0]) + _TopRight1 = hSizeParse.GetValue() + hSizeParse = New TSizeParse(ael[1]) + _TopRight2 = hSizeParse.GetValue() + Endif + Endif + ael = Split($sBottomRight, " ") + If ael.Count = 1 Then + hSizeParse = New TSizeParse(ael[0]) + _BottomRight1 = hSizeParse.GetValue() + _BottomRight2 = _BottomRight1 + Else + If ael.Count = 2 Then + hSizeParse = New TSizeParse(ael[0]) + _BottomRight1 = hSizeParse.GetValue() + hSizeParse = New TSizeParse(ael[1]) + _BottomRight2 = hSizeParse.GetValue() + Endif + Endif + ael = Split($sBottomLeft, " ") + If ael.Count = 1 Then + hSizeParse = New TSizeParse(ael[0]) + _BottomLeft1 = hSizeParse.GetValue() + _BottomLeft2 = _BottomLeft1 + Else + If ael.Count = 2 Then + hSizeParse = New TSizeParse(ael[0]) + _BottomLeft1 = hSizeParse.GetValue() + hSizeParse = New TSizeParse(ael[1]) + _BottomLeft2 = hSizeParse.GetValue() + Endif + Endif + +End diff --git a/comp/src/gb.report2/.src/Types/BoxShadow/ReportBoxShadow.class b/comp/src/gb.report2/.src/Types/BoxShadow/ReportBoxShadow.class new file mode 100644 index 00000000..95957db3 --- /dev/null +++ b/comp/src/gb.report2/.src/Types/BoxShadow/ReportBoxShadow.class @@ -0,0 +1,225 @@ +' Gambas class file + +Export +Private $aBoxShadow As New _ReportBoxShadow[] + +Property XOffset As String +Property YOffset As String +Property Blur As String +Property Spread As String +Property Inset As Boolean +Property Color As Integer +Property Read Count As Integer +Property Read Max As Integer + + +Property Read _XOffset As Float +Property Read _YOffset As Float +Property Read _Blur As Float +Property Read _Spread As Float +Property Read _Active As Boolean + + +Public Sub _new() + + Dim hBoxShadow As New _ReportBoxShadow + $aBoxShadow.Add(hBoxShadow) + +End + +Static Public Function _get(sValue As String) As ReportBoxShadow + + Dim hBoxShadow As New ReportBoxShadow + Dim s As String + Dim i As Integer + For Each s In Split(sValue, " ") + If IsDigit(Left(s)) Or If Left(s) = "-" Then + + Select Case i + Case 0 + hBoxShadow.XOffset = s + Case 1 + hBoxShadow.YOffset = s + Case 2 + hBoxShadow.Blur = s + Case 3 + hBoxShadow.Spread = s + End Select + Inc i + Continue + Endif + If LCase(s) = "inset" Then + hBoxShadow.Inset = True + Continue + Endif + Try hBoxShadow.Color = Val(Replace(s, "#", "&H")) + + Next + Return hBoxShadow + +End + + + +' Public Function _get(Index As Integer) As _ReportBoxShadow +' +' Return $aBoxShadow[Index] +' +' End + + + +Public Sub Add(Optional XOffset As String, YOffset As String, iColor As Integer, Spread As String, Blur As String, Inset As Boolean) + + Dim hBoxShadow As New _ReportBoxShadow + + If XOffset Then hBoxShadow.XOffset = XOffset + If YOffset Then hBoxShadow.YOffset = YOffset + If iColor Then hBoxShadow.Color = iColor + If SPread Then hBoxShadow.Spread = Spread + If Blur Then hBoxShadow.Blur = Blur + hBoxShadow.Inset = Inset + $aBoxShadow.Add(hBoxShadow) + +End + +Public Sub Remove(Index As Integer) + + $aBoxShadow.Remove(Index) + +End + + + +Private Function XOffset_Read() As String + + Return $aBoxShadow[0].XOffset + +End + +Private Sub XOffset_Write(Value As String) + + $aBoxShadow[0].XOffset = Value + +End + +Private Function YOffset_Read() As String + + Return $aBoxShadow[0].YOffset + +End + +Private Sub YOffset_Write(Value As String) + + $aBoxShadow[0].YOffset = Value + +End + +Private Function Blur_Read() As String + + Return $aBoxShadow[0].Blur + +End + +Private Sub Blur_Write(Value As String) + + $aBoxShadow[0].Blur = Value + +End + +Private Function Spread_Read() As String + + Return $aBoxShadow[0].Spread + +End + +Private Sub Spread_Write(Value As String) + + $aBoxShadow[0].Spread = Value + +End + +Private Function Inset_Read() As Boolean + + Return $aBoxShadow[0].Inset + +End + +Private Sub Inset_Write(Value As Boolean) + + $aBoxShadow[0].Inset = Value + +End + +Private Function Color_Read() As Integer + + Return $aBoxShadow[0].Color + +End + +Private Sub Color_Write(Value As Integer) + + $aBoxShadow[0].Color = Value + +End + +Private Function Count_Read() As Integer + + Return $aBoxShadow.Count + +End + +Private Function Max_Read() As Integer + + Return $aBoxShadow.Max + +End + +Public Sub _NormalizeUnits() + + Dim i As Integer + 'Dim SizeParse As TSizeParse + For i = 0 To $aBoxShadow.Max + 'With + $aBoxShadow[i]._XOffset = TSizeParse[$aBoxShadow[i].XOffset].GetValue() + $aBoxShadow[i]._YOffset = TSizeParse[$aBoxShadow[i].YOffset].GetValue() + $aBoxShadow[i]._Spread = TSizeParse[$aBoxShadow[i].Spread].GetValue() + $aBoxShadow[i]._Blur = TSizeParse[$aBoxShadow[i].Blur].GetValue() + + '._Blur = TSizeParse[.Blur].GetValue() + 'End With + + + Next + +End + +Private Function _XOffset_Read() As Float + + Return $aBoxShadow[0]._XOffset + +End + +Private Function _YOffset_Read() As Float + + Return $aBoxShadow[0]._YOffset + +End + +Private Function _Blur_Read() As Float + + Return $aBoxShadow[0]._Blur + +End + +Private Function _Spread_Read() As Float + + Return $aBoxShadow[0]._Spread + +End + +Private Function _Active_Read() As Boolean + + Return Not ($aBoxShadow[0]._XOffset = 0 And $aBoxShadow[0]._YOffset = 0 And $aBoxShadow[0]._Blur = 0 And $aBoxShadow[0]._Spread = 0) + +End diff --git a/comp/src/gb.report2/.src/Types/BoxShadow/_ReportBoxShadow.class b/comp/src/gb.report2/.src/Types/BoxShadow/_ReportBoxShadow.class new file mode 100644 index 00000000..46f8af6c --- /dev/null +++ b/comp/src/gb.report2/.src/Types/BoxShadow/_ReportBoxShadow.class @@ -0,0 +1,14 @@ +' Gambas class file + +Export +Public XOffset As String '= "8mm" +Public YOffset As String '= "2mm" +Public Spread As String +Public Inset As Boolean +Public Color As Integer +Public Blur As String + +Public _XOffset As Float +Public _YOffset As Float +Public _Spread As Float +Public _Blur As Float diff --git a/comp/src/gb.report2/.src/Types/ReportSizeHints.class b/comp/src/gb.report2/.src/Types/ReportSizeHints.class new file mode 100644 index 00000000..20421e8f --- /dev/null +++ b/comp/src/gb.report2/.src/Types/ReportSizeHints.class @@ -0,0 +1,26 @@ +' Gambas class file + +Export +Public Width As Float +Public Height As Float +Public NotFinished As Boolean + +Static Public Function _call(Width As Float, Height As Float, Optional NotFinished As Float) As ReportSizeHints + Dim hSH As New ReportSizeHints + hSH.Width = Width + hSH.Height = Height + hSH.NotFinished = NotFinished + Return hSH +End + +Static Public Function FromString(Width As String, Height As String, Optional NotFinished As Boolean) As ReportSizeHints + + Dim hSH As New ReportSizeHints + hSH.Width = TSizeParse[Width].ToInch() + hSH.Height = TSizeParse[Height].ToInch() + hSH.NotFinished = NotFinished + Return hSH + +End + + diff --git a/comp/src/gb.report2/.src/Types/ReportSizeParser.class b/comp/src/gb.report2/.src/Types/ReportSizeParser.class new file mode 100644 index 00000000..8ca8b425 --- /dev/null +++ b/comp/src/gb.report2/.src/Types/ReportSizeParser.class @@ -0,0 +1,83 @@ +' Gambas class file + +' Gambas class file + +Export +Fast +'>>>>>>>>>>>>>>>>>>>>>> PUBLIC VARIABLES >>>>>>>>>>>>>>>>>>>>>>>>> +Public Value As Float +Public Unit As String + +'>>>>>>>>>>>>>>>>>>>>>>>>>> PROPERTIES >>>>>>>>>>>>>>>>>>>>>>>>>>> +'>>>>>>>>>>>>>>>>>>>>>> PRIVATE VARIABLES >>>>>>>>>>>>>>>>>>>>>>>> + +'##################### PUBLIC PROCEDURES ######################### +'' Create a new size object from its description. +'' #bAllowRelative# can be TRUE to allow the use of "%" as unit. +Public Sub _new(Size As String, Optional bAllowRelative As Boolean) + + Dim I As Integer + Dim sCar As String + + If Not size Then + Unit = "cm" + Value = 0 + Endif + + Size = Trim(Size) + + If Not Size Then + Unit = "px" + Return + Endif + + For I = 1 To Len(Size) + sCar = Mid$(Size, I, 1) + If Not IsDigit(sCar) And If sCar <> "-" And If sCar <> "." Then Break + Next + + Value = CFloat(Left$(Size, I - 1)) + Unit = Trim(Mid$(Size, I)) + + If Not Unit Then Unit = "px" + + If Not Report.AllowedUnits.Exist(Unit) Then + If Not bAllowRelative Or Unit <> "%" Then + Error.Raise("Unknown unit") + Endif + Endif + +End + +Public Sub ToInch() As Float + + Return Report.UnitToInch(Value, Unit) + +End + +Public Sub IsRelative() As Boolean + + Return Unit = "%" + +End + +Public Sub GetValue() As Float + + If IsRelative() Then + Return Value + Else + Return ToInch() + Endif + +End + +Static Public Sub _get(Size As String) As TSizeParse + + Dim hSize As TSizeParse = New TSizeParse(Size) + + Return hSize + +End + +'##################### PRIVATE PROCEDURES ######################## +'######################## PROPERTIES ############################# diff --git a/comp/src/gb.report2/.src/Types/TControl.class b/comp/src/gb.report2/.src/Types/TControl.class new file mode 100644 index 00000000..071dad65 --- /dev/null +++ b/comp/src/gb.report2/.src/Types/TControl.class @@ -0,0 +1,3 @@ +' Gambas class file + +Inherits _ReportVirtualControl diff --git a/comp/src/gb.report2/.src/Types/TSizeParse.class b/comp/src/gb.report2/.src/Types/TSizeParse.class new file mode 100644 index 00000000..c6ca4e2d --- /dev/null +++ b/comp/src/gb.report2/.src/Types/TSizeParse.class @@ -0,0 +1,5 @@ +' Gambas class file + +Export + +Inherits ReportSizeParser diff --git a/comp/src/gb.report2/.src/Types/_ReportVirtualControl.class b/comp/src/gb.report2/.src/Types/_ReportVirtualControl.class new file mode 100644 index 00000000..ca8fa033 --- /dev/null +++ b/comp/src/gb.report2/.src/Types/_ReportVirtualControl.class @@ -0,0 +1,78 @@ +' Gambas class file + +Export +'Fast +'>>>>>>>>>>>>>>>>>>>>>> PUBLIC VARIABLES >>>>>>>>>>>>>>>>>>>>>>>>> +Public SizeHint As ReportSizeHints ''Size hints buffer +Public _PageChildren As New Collection ''The links between page and objects +Public Index As Integer ''Remember the dataindex +Public Cache As Variant ''For future data cache + +'>>>>>>>>>>>>>>>>>>>>>>>>>> PROPERTIES >>>>>>>>>>>>>>>>>>>>>>>>>>> +Property Read RealLeft As Float ''Return the left relative position size in Pixel +Property Read RealTop As Float ''Return the top relative position size in Pixel +Property Read RealWidth As Float ''Return the width in pixel +Property Read RealHeight As Float ''Return the height in pixel +Property Ctrl As ReportControl ''Return or set the link between real widget and virtual object + +'>>>>>>>>>>>>>>>>>>>>>> PRIVATE VARIABLES >>>>>>>>>>>>>>>>>>>>>>>> +Private $iCtrl As Integer +Private fX As Float +Private fY As Float +Private fW As Float +Private fH As Float + + +'##################### PUBLIC PROCEDURES ######################### +''Define the virtual widget size in internal unit (cm) +Public Function _SetGeometry(X As Float, Y As Float, W As Float, H As Float) As Float + + fX = X + fY = Y + fW = W + fH = H + +End + +'##################### PRIVATE PROCEDURES ######################## + + + +'######################## PROPERTIES ############################# + +Private Function Ctrl_Read() As ReportControl + + Return ReportControl._ObjectFromId[$iCtrl] + +End + + +Private Sub Ctrl_Write(Value As ReportControl) + + $iCtrl = Value.id + +End + +Private Function RealLeft_Read() As Float + + Return ReportControl._ObjectFromId[$iCtrl].Report._ToPixels(fX) 'ReportControl._ObjectFromId[$iCtrl].Report._ToPixels(fX) + +End + +Private Function RealTop_Read() As Float + + Return ReportControl._ObjectFromId[$iCtrl].Report._ToPixels(fY) + +End + +Private Function RealWidth_Read() As Float + + Return ReportControl._ObjectFromId[$iCtrl].Report._ToPixels(fX + fW) - ReportControl._ObjectFromId[$iCtrl].Report._ToPixels(fX) + +End + +Private Function RealHeight_Read() As Float + + Return ReportControl._ObjectFromId[$iCtrl].Report._ToPixels(fY + fH) - ReportControl._ObjectFromId[$iCtrl].Report._ToPixels(fY) + +End diff --git a/comp/src/gb.report2/.src/Viewer/FPreview.class b/comp/src/gb.report2/.src/Viewer/FPreview.class new file mode 100644 index 00000000..88503fbe --- /dev/null +++ b/comp/src/gb.report2/.src/Viewer/FPreview.class @@ -0,0 +1,537 @@ +' Gambas class file + +Private $aModeButtons As New ToolButton[] +Private bFlag As Boolean +Private $hPrinter As New Printer As "Printer" +'Private $iCurPrinterResolution As Integer +Private $bVerif As Boolean +Private $bPrinting As Boolean +Private $iFileRes As Integer = 150 + +Static Public Function Run(hReport As Report) + + Dim hFPreview As FPreview + + hFpreview = New FPreview + + hFPreview.SetReport(hReport) + hFPreview.ShowModal() + +End + +Public Sub _new() + + Dim s As String + Dim hMenu As Menu + + For Each s In Printer.List + cmbPrinter.Add(s) + hMenu = New Menu(mnuPrint) As "mnuPrintPrinter" + hMenu.Tag = s + hMenu.Text = s + Next + +End + +Private Sub SelectPrinter(Optional sName As String) + + Dim iPrinter As Integer + + If sName Then + $hPrinter.Name = sName + Else + $hPrinter.Name = Printer.Default + Endif + + Object.Lock(cmbPrinter) + iPrinter = Max(0, cmbPrinter.List.Find($hPrinter.Name)) + Try cmbPrinter.Index = iPrinter + Object.Unlock(cmbPrinter) + + 'NOTE: force the printer fullpage mode because it make error on report placement + $hPrinter.FullPage = True + $hPrinter.Duplex = cmbDuplex.Index + + tgbGrayScale.Value = $hPrinter.GrayScale + tgbFullPage.Value = $hPrinter.FullPage + tgbReverseCopies.Value = $hPrinter.ReverseOrder + tgbCollateCopies.Value = $hPrinter.CollateCopies + +End + +Public Sub SetReport(hReport As Report) + + View.Report = hReport + GetValuesFromReport() + +End + +Private Sub GetValuesFromReport() + + cmbPaper.Index = View.Report.Paper + + CPrint.InitPrinterFromReport($hPrinter, View.Report) + + If View.Report.Paper = Printer.Custom Then + pnlCustom.Enabled = True + Endif + + cmbOrientation.Index = $hPrinter.Orientation + cmbDuplex.Index = $hPrinter.Duplex + cmbPaper.Index = $hPrinter.Paper + View.Refresh + + Object.Lock(spWidth) + spWidth.Value = $hPrinter.PaperWidth + Object.Unlock(spWidth) + Object.Lock(spHeight) + spHeight.Value = $hPrinter.PaperHeight + Object.Unlock(spHeight) + +End + +Public Sub sldZoom_Change() + + Dim hButton As ToolButton + + View.ScaleMode = View.Custom + View.Zoom = sldZoom.Value / 100 + 'lblZoom.Text = Str(Slider1.Value) & " %" + bFlag = True + For Each hButton In $aModeButtons + hButton.Value = False + Next + + bFlag = False + +End + +Public Sub View_Zoom() + + Object.Lock(sldZoom) + sldZoom.Value = View.Zoom * 100 + Object.Unlock(sldZoom) + + lblZoom.Text = Str(sldZoom.Value) & " %" + +End + +Public Sub Mode_Click() + + Dim hButton As ToolButton + Dim hCurButton As ToolButton + + If bFlag Then Return + bFlag = True + hCurButton = Last + + For Each hButton In $aModeButtons + If hButton = hCurButton Then + hButton.Value = True + Else + hButton.Value = False + Endif + Next + + bFlag = False + + 'View.ScaleMode = hCurButton.Tag + View.ScaleMode = hCurButton.Tag + 'View.Refresh + 'View.Refresh + +End + +Public Sub tgbGrayScale_Click() + + 'Last.Background = IIf(Last.Value, Color.Gray, Color.Default) + $hPrinter.GrayScale = Last.Value + View._GrayScale = Last.Value + View.Refresh() + +End + +Public Sub tgbFullPage_Click() + + 'Last.Background = IIf(Last.Value, Color.Gray, Color.Default) + $hPrinter.FullPage = Last.Value + +End + +Public Sub tgbReverseCopies_Click() + + 'Last.Background = IIf(Last.Value, Color.Gray, Color.Default) + $hPrinter.ReverseOrder = Last.value + +End + +Public Sub tgbCollateCopies_Click() + + 'Last.Background = IIf(Last.Value, Color.Gray, Color.Default) + $hPrinter.CollateCopies = Last.Value + +End + +Public Sub cmbOrientation_Click() + + If View.Report.Orientation = Last.Index Then Return + View.Report.Orientation = Last.Index + 'View.Report.Refresh + View.Refresh + GetValuesFromReport + +End + +Public Sub cmbPaper_Click() + + Dim i As Integer = Last.Index + 'Print "id "; View.Report.paper + If View.Report.Paper = i Then Return + View.Report.Paper = i + If i = 0 Then + pnlCustom.Visible = True + Else + pnlCustom.Visible = False + View.Refresh + GetValuesFromReport + Endif + +End + +Public Sub cmbDuplex_Click() + + $hPrinter.Duplex = Last.index + +End + +Public Sub txtFile_Click() + + Dialog.Path = txtFile.Text + Dialog.Filter = ["*.pdf", ("PDF files"), "*.ps", ("Postscript files")] + + If Dialog.SaveFile() Then Return + + txtFile.Text = Dialog.Path + $bVerif = True + $hPrinter.OutputFile = Dialog.Path + +End + +Private Sub RefreshPrintButton() + + If $bPrinting Then + + btnPrint.Picture = Picture["icon:/small/cancel"] + btnPrint.Text = ("Cancel") + + Else + + btnPrint.Picture = Picture[If(tabPrint.Index = 0, "icon:/small/printer", "icon:/small/pdf")] + btnPrint.Text = ("Print") + + Endif + + btnPrint2.Picture = btnPrint.Picture + btnPrint2.Text = btnPrint.Text + +End + +Public Sub tabPrint_Click() + + If tabPrint.Index = 0 Then + $hPrinter.OutputFile = "" + $hPrinter.Name = cmbPrinter.Text + $hPrinter.Resolution = 1200 + Else + $hPrinter.OutputFile = txtFile.Text + $hPrinter.Resolution = $iFileRes + Object.Lock(cmbResolution) + pnlResolution.Enabled = True + Try cmbResolution.Index = Max(cmbResolution.Find(Str($iFileRes)), 0) + Object.Unlock(cmbResolution) + Endif + + RefreshPrintButton + +End + +Public Sub TextBox1_Change() + + View.Range = TextBox1.Text + +End + +Public Sub TextBox1_Click() + + Last.Text = "" + 'TextBox1_Change + +End + +Public Sub spWidth_Change() + + View.Report.Width = Str(Last.Value) & "mm" + View.Refresh + +End + +Public Sub spHeight_Change() + + View.Report.Height = Str(Last.Value) & "mm" + View.Refresh + +End + +Public Sub Button2_Click() + + View._ForceLayout + +End + +Public Sub cmbPrinter_Click() + + SelectPrinter(Last.Text) + +End + +Public Sub btnPrint_Click() + + Dim iReturn As Integer + + If btnPrint.Tag Then + + $hPrinter.Cancel + btnPrint.Tag = False + + Else + If Not View.Report Then Return + + If tabPrint.Index = 1 Then + + If Not $hPrinter.OutputFile Then txtFile_Click + If Not $hPrinter.OutputFile Then Return + + If Exist($hPrinter.OutputFile) And Not $bVerif Then + iReturn = Message.Warning("" & $hPrinter.OutputFile & "\n\n" & ("This file already exists.\nDo you want to replace it?"), ("Replace"), ("Cancel")) + If iReturn = 2 Then Return + Try Kill $hPrinter.OutputFile + $bVerif = False + Endif + + Endif + + $bPrinting = True + btnPrint.Tag = True + RefreshPrintButton + + $hPrinter.Print + + Endif + +End + +Public Sub Printer_Begin() + + hbZoom.Hide + hbPrinting.Show + Inc Application.Busy + ProgressBar1.Value = 0 + ProgressBar1.Pulse = True + lblPrint.Text = ("Layout...") + + Paint.FontScale = 25.4 / 72 * Paint.W / $hPrinter.PaperWidth * 72 / 96 * 96 / $hPrinter.Resolution + +End + +Public Sub Printer_Paginate() + + If View.Report._LayoutNotFinished Then + View.LockLayout + View.Report.Layout(View.Report.PageCount) + Else + $hPrinter.Count = View.PageCount + ProgressBar1.Pulse = False + lblPrint.Text = ("Printing...") + View.UnlockLayout + Endif + +End + +Public Sub Printer_Draw() + + 'Debug Paint.W;; $hPrinter.PaperWidth;; $hPrinter.Resolution;; Paint.FontScale + + If View.RangePages.Count = 0 Then + View.Report.Paint($hPrinter.Page) + Else + View.Report.Paint(View.RangePages[$hPrinter.Page - 1] + 1) + Endif + ProgressBar1.Value = $hPrinter.Page / View.PageCount + +End + +Public Sub Printer_End() + + 'View.UnlockLayout + hbPrinting.Hide + hbZoom.Show + Dec Application.Busy + btnPrint.Tag = False + $bPrinting = False + RefreshPrintButton + +End + +Public Sub TextBox2_Change() + + $hPrinter.NumCopies = Last.Value + +End + +Public Sub Form_Close() + + If Component.IsLoaded("gb.settings") Then + 'Settings.Write(Me, "FPreview") + Settings.Write(View, "View") + Settings["FPreview/OutputFile"] = txtFile.Text + Settings["FPreview/Printer"] = $hPrinter.Name + Settings["FPreview/PrintToFile"] = tabPrint.Index = 1 + Settings["FPreview/Duplex"] = cmbDuplex.Index + Settings["FPreview/GrayScale"] = tgbGrayScale.Value + Settings["FPreview/ReverseOrder"] = tgbReverseCopies.Value + Settings["FPreview/CollateCopies"] = tgbCollateCopies.Value + Settings["FPreview/FileResolution"] = $iFileRes + Settings.Save() + Endif + +End + +Public Sub Form_Open() + + Dim hButton As ToolButton + + $aModeButtons = [btnOnePage, btnTwoPages, btnFullWidth, btnRealSize] + + If Component.IsLoaded("gb.settings") Then + 'Settings.Read(Me, "FPreview") + Settings.Read(View, "View") + + If View.ScaleMode = View.Custom Then + sldZoom.Value = View.Zoom + Else + For Each hButton In $aModeButtons + hButton.Value = False + Next + $aModeButtons[View.ScaleMode - 1].Value = True + + Endif + + txtFile.Text = Settings["FPreview/OutputFile", User.Home &/ "report.pdf"] + $hPrinter.OutputFile = txtFile.Text + $hPrinter.Name = Settings["FPreview/Printer"] + If Settings["FPreview/PrintToFile"] = True Then + tabPrint.Index = 1 + Endif + + Try $hPrinter.Duplex = Settings["FPreview/Duplex"] + Try $hPrinter.GrayScale = Settings["FPreview/GrayScale"] + Try $hPrinter.ReverseOrder = Settings["FPreview/ReverseOrder"] + Try $hPrinter.CollateCopies = Settings["FPreview/CollateCopies"] + Try $iFileRes = Settings["FPreview/FileResolution", 150] + Try $hPrinter.Duplex = Settings["FPreview/Duplex", Printer.Simplex] = cmbDuplex.Index + Endif + + SelectPrinter($hPrinter.Name) + btnPrint.Tag = False + $bPrinting = False + + btnOnePage.Value = True + tabPrint_Click +End + +Public Sub btnZoomIn_Click() + + sldZoom.Value = 100 * 2 ^ (Int((Log2(sldZoom.Value / 100) + 0.5) * 2 + 0.5) / 2) + 0.5 + +End + +Public Sub btnZoomOut_Click() + + sldZoom.Value = 100 * 2 ^ (Int((Log2(sldZoom.Value / 100)) * 2 - 0.5) / 2) + 0.5 + +End + +Public Sub panSide_Arrange() + + With btnCloseSide + .Move(.Parent.W - .W, 0, Desktop.Scale * 4, Desktop.Scale * 4) + End With + +End + +Public Sub btnCloseSide_Click() + + panSide.Hide + btnShowSide.Show + btnPrint2.Show + +End + +Public Sub btnShowSide_Click() + + panSide.Show + btnShowSide.Hide + btnPrint2.Hide + +End + +Public Sub mnuPrint_Show() + + Dim hMenu As Menu + + mnuPrintPDF.Checked = tabPrint.Index = 1 + For Each hMenu In mnuPrint.Children + If Not hMenu.Tag Then Continue + If tabPrint.Index = 1 Then + hMenu.Checked = False + Else + hMenu.Checked = hMenu.Text = cmbPrinter.Text + Endif + Next + +End + +Public Sub mnuPrintPDF_Click() + + tabPrint.Index = 1 + txtFile_Click + +End + +Public Sub mnuPrintPrinter_Click() + + tabPrint.Index = 0 + cmbPrinter.Text = Last.Text + +End + +Public Sub spResolution_Change() + +End + +Public Sub SpinBar1_Change() + + Last.Text = "toto" & Last.Value + +End + +Public Sub cmbResolution_Click() + + If tabPrint.Index = 0 Then + $hPrinter.Resolution = 1200 + Else + $iFileRes = cmbResolution.Text + $hPrinter.Resolution = $iFileRes + Endif + +End diff --git a/comp/src/gb.report2/.src/Viewer/FPreview.form b/comp/src/gb.report2/.src/Viewer/FPreview.form new file mode 100644 index 00000000..d4a1520f --- /dev/null +++ b/comp/src/gb.report2/.src/Viewer/FPreview.form @@ -0,0 +1,362 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,107,78) + Text = ("Report preview") + Arrangement = Arrange.Horizontal + { mnuPrint Menu + Visible = False + { mnuPrintPDF Menu + Text = ("Print to file") & "..." + } + { Menu1 Menu + } + } + { Panel1 VBox + MoveScaled(1,1,63,72) + Expand = True + Invert = True + { View ReportView + MoveScaled(1,1,50,48) + Background = Color.LightForeground + Tag = "3" + Mouse = Mouse.SizeAll + Expand = True + } + { hbPrinting HBox + MoveScaled(1,57,55,4) + Visible = False + Spacing = True + Indent = True + { lblPrint Label + MoveScaled(11,0,14,4) + AutoResize = True + Text = ("Printing") & "..." + } + { Panel11 Panel + MoveScaled(26,0,25,4) + Expand = True + Arrangement = Arrange.Fill + Margin = True + Padding = 4 + { ProgressBar1 ProgressBar + MoveScaled(0,0,37,3) + Expand = True + Border = False + } + } + } + { hbZoom HBox + MoveScaled(1,62,62,4) + { Panel2 Panel + MoveScaled(0,0,17,4) + Expand = True + Arrangement = Arrange.Horizontal + { btnOnePage ToolButton Mode + Name = "btnOnePage" + MoveScaled(0,0,4,4) + Tag = "1" + ToolTip = ("One page") + Picture = Picture["16/one-page.png"] + Toggle = True + } + { btnTwoPages ToolButton Mode + Name = "btnTwoPages" + MoveScaled(4,0,4,4) + Tag = "2" + ToolTip = ("Two pages") + Picture = Picture["16/two-pages.png"] + Toggle = True + } + { btnFullWidth ToolButton Mode + Name = "btnFullWidth" + MoveScaled(8,0,4,4) + Tag = "3" + ToolTip = ("Full width") + Picture = Picture["16/full-width.png"] + Toggle = True + } + { btnRealSize ToolButton Mode + Name = "btnRealSize" + MoveScaled(12,0,4,4) + Tag = "4" + ToolTip = ("Real size") + Picture = Picture["16/real-size.png"] + Toggle = True + } + } + { btnZoomOut ToolButton + MoveScaled(18,0,4,4) + ToolTip = ("Zoom out") + Picture = Picture["icon:/small/zoom-out"] + } + { sldZoom Slider + MoveScaled(22,0,19,4) + MinValue = 13 + MaxValue = 400 + Value = 100 + } + { lblZoom Label + MoveScaled(41,0,8,4) + Text = ("100 %") + Alignment = Align.Center + } + { btnZoomIn ToolButton + MoveScaled(48,0,4,4) + ToolTip = ("Zoom in") + Picture = Picture["icon:/small/zoom-in"] + } + { btnPrint2 MenuButton btnPrint + Name = "btnPrint2" + MoveScaled(51,0,8,4) + Visible = False + AutoResize = True + Text = ("Print") + Border = False + Menu = "mnuPrint" + } + { btnShowSide ToolButton + MoveScaled(58,0,4,4) + Visible = False + ToolTip = ("Show options") + Picture = Picture["icon:/small/view-split-h"] + } + } + } + { panSide Panel + MoveScaled(65,1,41,76) + Arrangement = Arrange.Horizontal + Border = Border.Plain + { Panel4 VBox + MoveScaled(1,1,39,73) + Expand = True + { tabPrint TabPanel + MoveScaled(0,0,37,15) + Arrangement = Arrange.Vertical + Spacing = True + Margin = True + Border = False + Count = 2 + Index = 0 + Text = ("Printer") + { pnlResolution HBox + MoveScaled(1,1,37,4) + Spacing = True + { PictureBox1 PictureBox + MoveScaled(0,0,4,4) + Picture = Picture["icon:/32/printer"] + Stretch = True + } + { cmbPrinter ComboBox + MoveScaled(5,0,31,4) + Expand = True + ReadOnly = True + } + } + { Panel7 HBox + MoveScaled(1,6,35,4) + Spacing = True + { Label2 Label + MoveScaled(0,0,12,4) + Text = ("Two-sided") + } + { cmbDuplex ComboBox + MoveScaled(15,0,21,4) + Expand = True + ReadOnly = True + List = [("None"), ("Short side"), ("Long side")] + } + } + Index = 1 + Text = ("File") + { Panel12 HBox + MoveScaled(1,1,35,4) + Spacing = True + { PictureBox2 PictureBox + MoveScaled(0,0,4,4) + Picture = Picture["icon:/48/pdf"] + Stretch = True + } + { txtFile ButtonBox + MoveScaled(5,0,29,4) + Expand = True + Picture = Picture["icon:/16/open"] + ReadOnly = True + } + } + { HBox3 HBox + MoveScaled(1,6,35,4) + Spacing = True + { TextLabel1 TextLabel + MoveScaled(1,1,12,3) + Text = ("Resolution") + Alignment = Align.Normal + } + { cmbResolution ComboBox + MoveScaled(15,0,14,4) + #Translate = False + ReadOnly = True + List = ["75", "150", "300", "600", "1200"] + } + { Label11 Label + MoveScaled(30,0,4,4) + Text = ("dpi") + } + } + Index = 0 + } + { Separator2 Separator + MoveScaled(3,15,32,0) + Visible = False + } + { VBox1 VBox + MoveScaled(3,16,38,59) + Expand = True + Spacing = True + Margin = True + { Panel6 HBox + MoveScaled(2,0,34,4) + Spacing = True + { Label1 Label + MoveScaled(0,0,12,4) + Text = ("Range") + } + { TextBox1 ButtonBox + MoveScaled(15,0,18,4) + Expand = True + Picture = Picture["icon:/16/clear"] + } + } + { HBox1 HBox + MoveScaled(2,5,34,4) + Spacing = True + { Label4 Label + MoveScaled(0,0,12,4) + Text = ("Copies") + } + { TextBox2 SpinBox + MoveScaled(15,0,12,4) + Expand = True + MinValue = 1 + } + } + { Panel5 Panel + MoveScaled(2,10,33,5) + } + { Panel14 HBox + MoveScaled(1,17,36,4) + Spacing = True + { Label10 Label + MoveScaled(0,0,12,4) + Text = ("Orientation") + } + { cmbOrientation ComboBox + MoveScaled(14,0,21,4) + Expand = True + ReadOnly = True + List = [("Portrait"), ("Landscape")] + } + } + { Panel8 HBox + MoveScaled(1,21,36,4) + Spacing = True + { Label3 Label + MoveScaled(0,0,12,4) + Text = ("Paper") + } + { cmbPaper ComboBox + MoveScaled(13,0,21,4) + Expand = True + ReadOnly = True + List = [("Custom"), ("A3"), ("A4"), ("A5"), ("B5"), ("Letter"), ("Executive"), ("Legal")] + } + } + { pnlCustom VBox + MoveScaled(0,25,36,9) + Visible = False + Spacing = True + { Panel3 HBox + MoveScaled(1,0,32,4) + Spacing = True + { Label5 Label + MoveScaled(0,0,12,4) + Text = ("Width") + } + { spWidth SpinBox + MoveScaled(14,0,6,4) + Expand = True + MaxValue = 1000 + } + { Label7 Label + MoveScaled(27,0,4,4) + Text = ("mm") + } + } + { Panel17 HBox + MoveScaled(1,4.125,31,4) + Spacing = True + { Label6 Label + MoveScaled(0,0,12,4) + Text = ("Height") + } + { spHeight SpinBox + MoveScaled(13,0,6,4) + Expand = True + MaxValue = 1000 + } + { Label8 Label + MoveScaled(26,0,4,4) + Text = ("mm") + } + } + } + { Panel13 Panel + MoveScaled(2,34,33,4) + Expand = True + } + { tgbGrayScale CheckBox + MoveScaled(1,36,34,4) + Text = ("Grayscale") + } + { tgbFullPage CheckBox + MoveScaled(1,40,24,4) + Visible = False + Text = ("Full page") + } + { tgbCollateCopies CheckBox + MoveScaled(1,45,35,3) + Text = ("Collate copies") + } + { tgbReverseCopies CheckBox + MoveScaled(1,48,36,4) + Text = ("Reverse order") + } + { Panel15 Panel + MoveScaled(1,52,35,2) + } + { HBox2 HBox + MoveScaled(2,55,33,4) + { Panel10 Panel + MoveScaled(2,1,10,3) + Expand = True + } + { btnPrint Button + MoveScaled(7,0,14,4) + AutoResize = True + Text = ("Print") + Picture = Picture["icon:/small/print"] + } + { Panel9 Panel + MoveScaled(21,1,10,3) + Expand = True + } + } + } + } + { btnCloseSide ToolButton + MoveScaled(35,0,3,3) + Ignore = True + Picture = Picture["icon:/small/close"] + } + } +} diff --git a/comp/src/gb.report2/.src/Viewer/ReportView.class b/comp/src/gb.report2/.src/Viewer/ReportView.class new file mode 100644 index 00000000..f40bd4ac --- /dev/null +++ b/comp/src/gb.report2/.src/Viewer/ReportView.class @@ -0,0 +1,413 @@ +' Gambas class file + +Export +Inherits UserControl + +Public Const _IsControl As Boolean = True +Public Const _IsContainer As Boolean = False + +Public Enum Custom, Page, DualPage, FullWidth, RealSize + +Private $aRangePage As New Integer[] + +Property Report As Report +Property Read LayoutInProgress As Boolean +Property ScaleMode As Integer +Property ShowPageNumbers As Boolean +Property Range As String +Property _GrayScale As Boolean +Property Zoom As Float +Property Read Count, PageCount As Integer +Private $bGrayScale As Boolean +Private $hReport As Report +Private $hView As New DocumentView(Me) As "View" +Private hOBS As Observer +Private tmrLayout As New Timer As "TmrLayout" +Private $sRange As String +Private $iScaleMode As Integer +Private $bShowPageNumbers As Boolean +Private $bLockLayout As Boolean +Private $bStopLayout As Boolean +Private tmrView As New Timer As "tmrView" +Property Read RangePages As Integer[] + +Event Zoom + +Public Sub _new() + + hOBS = New Observer($hView.Children[0], True) As "Area" + 'tmrLayout.Delay = 5 + Me.Proxy = $hView + +End + + +Private Function _GrayScale_Read() As Boolean + + Return $bGrayScale + +End + +Private Sub _GrayScale_Write(Value As Boolean) + + $bGrayScale = Value + +End + +Public Sub View_Draw((Page) As Integer, Width As Integer, Height As Integer) + Dim hImg As Image + Dim iPage As Integer + + If $aRangePage.Count > 0 Then + Try iPage = $aRangePage[Page] + If Error Then iPage = Page + Else + iPage = Page + Endif + + Paint.AntiAlias = True + If $bGrayScale Then + hImg = New Image(Width, Height, Color.White) + Paint.Begin(hImg) + Endif + + $hReport.Scale = $hView.Zoom + $hReport.Paint(ipage + 1) + If $bShowPageNumbers Then + Paint.Brush = Paint.Color(Color.SetAlpha(Color.Black, 125)) + Paint.Font = Font["Arial,Bold,+20"] + Paint.Text(iPage + 1, 0, 0, Width, Height, Align.Center) + Paint.Fill + Endif + + If $bGrayScale Then + Paint.End + Paint.DrawImage(hImg.Desaturate(), 0, 0) + Endif + $hReport.Scale = 1.0 + +End + +Public Sub View_Zoom() + + 'tmrLayout.Stop + Raise Zoom + +End + +Public Sub View_Finished() + + If $hReport._LayoutNotFinished Then + $bStopLayout = False + tmrLayout.Trigger + Endif + +End + +Public Sub Area_Scroll() + + tmrLayout.Stop + +End + + +Public Sub Area_MouseWheel() + + If Not $hView.Arrangement = Arrange.Row Then + $hView.Arrangement = Arrange.Row + $hView.Column = 0 + Endif + +End + +Public Sub Area_Draw() + + Dim sText As String + Dim iTextWidth As Integer + + sText = Str($hView.FirstVisibleDocument + 1) & "/" & Str($hView.Count) + iTextWidth = Paint.TextSize(sText).Width + 10 + Paint.Rectangle(Paint.Width - iTextWidth - 10, 10, iTextWidth, 25, 5) + Paint.Brush = Paint.Color(Color.SetAlpha(Color.black, 125)) + Paint.Fill(True) + Paint.Brush = Paint.Color(Color.black) + Paint.Stroke + + Paint.Brush = Paint.Color(Color.White) + Paint.Font.Bold = True + Paint.Text(sText, Paint.Width - iTextWidth - 10, 10, iTextWidth, 25, Align.Center) + Paint.fill + + +End + +Public Sub tmrLayout_Timer() + + If $bLockLayout Or If $bStopLayout Then Goto ESCAPE + If Not $hReport._LayoutNotFinished Then Goto ESCAPE + 'Need to add wait to allow refreshing + Wait 0.01 + tmrLayout.Trigger + $hReport.Layout($hReport.PageCount) + 'Add a try because closing the object cause an invalid object error + 'Certainly because the loop come after deleting + Try $hView.Count = $hReport.PageCount + Return + +ESCAPE: + tmrView.Trigger + +End + +Private Function Report_Read() As Report + + Return $hReport + +End + +Private Sub Report_Write(Value As Report) + + + If Not Value Then Return + + $hReport = Value + $hReport.Layout(1) + $hView.Count = $hReport.PageCount + $hView.Padding = Report.UnitTo(5, "mm", "px") + $hView.Spacing = $hView.Padding + $hView.DocWidth = Report.UnitTo(TSizeParse[Value.Width].ToInch(), "in", "px") + $hView.DocHeight = Report.UnitTo(TSizeParse[Value.Height].ToInch(), "in", "px") + $hView.Reset + + tmrLayout.Trigger + + +End + +Public Sub MoveNext() + + $hView.MoveNext + $hView.Item.EnsureVisible + +End + +Public Sub MovePrevious() + + $hView.MovePrevious + $hView.Item.EnsureVisible + +End + +Public Sub MoveFirst() + + $hView.MoveFirst + $hView.Item.EnsureVisible + +End + +Public Sub MoveLast() + + $hView.MoveLast + $hView.Item.EnsureVisible + +End + +Public Sub MoveTo((Page) As Integer) + + $hView.MoveTo(Page) + $hView.Item.EnsureVisible + +End + + +Private Function LayoutInProgress_Read() As Boolean + + Return $hReport._LayoutNotFinished + +End + +Private Function ScaleMode_Read() As Integer + + Return $iScaleMode + +End + +Private Sub ScaleMode_Write(Value As Integer) + + $iScaleMode = Value + + $hView.AutoCenter = False + + Select Case Value + Case Me.Custom + $hView.Column = 0 + $hView.Arrangement = Arrange.Row + Case Me.Page + $hView.Column = 0 + $hView.Arrangement = Arrange.Fill + $hView.AutoCenter = True + Case Me.DualPage + $hView.Column = 2 + $hView.Arrangement = Arrange.Row + $hView.AutoCenter = True + Case Me.FullWidth + $hView.Column = 0 + $hView.Arrangement = Arrange.Vertical + Case Me.RealSize + $hView.Column = 0 + $hView.Arrangement = Arrange.Row + $hView.Zoom = 1 + End Select + + tmrView.Trigger + +End + +Private Function ShowPageNumbers_Read() As Boolean + + Return $bShowPageNumbers + +End + +Private Sub ShowPageNumbers_Write(Value As Boolean) + + $bShowPageNumbers = Value + tmrView.Trigger + +End + +Private Function Range_Read() As String + + Return $sRange + +End + +Private Sub Range_Write(Value As String) + + + + Dim ars As String[] + Dim ars2 As String[] + Dim s As String + Dim iStart, iEnd, i As Integer + + $sRange = Value + $aRangePage.Clear + + If Not $sRange Then Goto Fin + ars = Split($sRange, ";") + + For Each s In ars + If InStr(s, "-") Then + ars2 = Scan(s, "*-*") + iStart = CInt(Val(ars2[0])) - 1 + iEnd = Val(ars2[1]) - 1 + If iStart < 0 Or If iEnd < 0 Or If iEnd < iStart Then Goto Fin + If $aRangePage.Count > 0 And If iStart < $aRangePage[$aRangePage.Max] Then Goto Fin + For i = iStart To iEnd + + $aRangePage.Add(i) + + Next + Else + iStart = CInt(Val(s)) - 1 + If $aRangePage.Count > 0 And If iStart < $aRangePage[$aRangePage.Max] Then Goto Fin + $aRangePage.Add(iStart) + Endif + Next + +Finally +Fin: + If $aRangePage.Count > 0 Then + $hView.Count = $aRangePage.Count + Me.MoveFirst + Else + Me.MoveFirst + $hView.Count = $hReport.PageCount + Endif + tmrView.Trigger +Catch + +End + +Private Function Zoom_Read() As Float + + Return $hView.Zoom + +End + +Private Sub Zoom_Write(Value As Float) + + $hView.Zoom = Value + +End + +Private Function Settings_Read() As Variant[] + + Return [$hView.Zoom, CVariant($iScaleMode)] + +End + +Private Sub Settings_Write(Value As Variant[]) + + $hView.Zoom = Value[0] + $iScaleMode = Value[1] + +Catch + +End + +Public Sub _ForceLayout() + + Dim htmpImage As New Image(1, 1) + $bStopLayout = True + Paint.Begin(htmpImage) + $hReport.Layout() + Paint.End + $hView.Count = $hReport.PageCount + +End + +Public Sub LockLayout() + + $bLockLayout = True + +End + +Public Sub UnlockLayout() + + + $bLockLayout = False + $bStopLayout = False + tmrLayout.Trigger + +End + +Public Sub Refresh() + + Me.Report = Me.Report + tmrView.Trigger + +End + + + +Private Function Count_Read() As Integer + + If $aRangePage.Count > 0 Then Return $aRangePage.Count + Return $hReport.PageCount + +End + + +Private Function RangePages_Read() As Integer[] + + Return $aRangePage + +End + +Public Sub tmrView_Timer() + + $hView.Refresh + +End diff --git a/comp/src/gb.report2/16/full-width.png b/comp/src/gb.report2/16/full-width.png new file mode 100644 index 0000000000000000000000000000000000000000..f2ad55e4c5d97469dc38c5b21ff753ccbfb1045b GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UAm`Z~Df*BafCZDwc^6Wib977~7 z&+YT%V^H8=c0aT~yZ)VH^XZF|0&X$Sytea-@Z6g${dL@%%dc#;IT#u_LBW4oCS&We fs#SCC57zMTsF?GvozTC*8)Si}tDnm{r-UW|hkPpo literal 0 HcmV?d00001 diff --git a/comp/src/gb.report2/16/one-page.png b/comp/src/gb.report2/16/one-page.png new file mode 100644 index 0000000000000000000000000000000000000000..c4355cffaba40f228e3652f2651d98a3be78bb57 GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UAm`Z~Df*BafCZDwc^2|M5977~7 zpY7ks%V5B9*yrf|CG!ua$2M}m(w(NH+VbP0l+XkK6Q(9p literal 0 HcmV?d00001 diff --git a/comp/src/gb.report2/16/real-size.png b/comp/src/gb.report2/16/real-size.png new file mode 100644 index 0000000000000000000000000000000000000000..ddfd33bd6ad9ffe3bc5e0a69eac4467b25fbdb20 GIT binary patch literal 192 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UAm`Z~Df*BafCZDwc@+v)D977~7 z=bqij+iW1 K&t;ucLK6VBDIaYB literal 0 HcmV?d00001 diff --git a/comp/src/gb.report2/16/red-arrow-v.png b/comp/src/gb.report2/16/red-arrow-v.png new file mode 100644 index 0000000000000000000000000000000000000000..a787fe89c60ce899a23198ffa582b5bc1540384d GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^93afZ3?z3ZhDiV^&H$ef*Z)9JU;m$hA?NbP6+l78 zk|4ie28U-i(tsRUPZ!4!j_b(@2?-p$sVAaNDr{|O%w=L;%*+flz<{4Q_>%I`W}rd_ MPgg&ebxsLQ04Dk&EdT%j literal 0 HcmV?d00001 diff --git a/comp/src/gb.report2/16/two-pages.png b/comp/src/gb.report2/16/two-pages.png new file mode 100644 index 0000000000000000000000000000000000000000..252dbd11e46e32e4e07f7e49855f63b5ffb10e39 GIT binary patch literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UAm`Z~Df*BafCZDwc@~k~w977~7 zZ|yVWVo=~=UVo|n_MbZkMUDg-oSqmk%Z1UwbTX&HtY&Y1$6uIaQx_uYbs zFl1V%NP3T!Twqt^hg1L5T@7_ICrx-;9Oc@wv|K?C>pBwQW PXbyv?tDnm{r-UW|Mdc*X literal 0 HcmV?d00001 diff --git a/comp/src/gb.report2/22/RealSize.png b/comp/src/gb.report2/22/RealSize.png new file mode 100644 index 0000000000000000000000000000000000000000..f93d1289b4a9f944672e452e305930159a57637c GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H0wnYHF4+L2CVRR#hG?8mPEcSpFfuUsqwc6X zvFpFFfx*N_JhwE{8ZYJWY~l&xsh8+eKA9+-{NwzA0|LhjraTlrTq@EWaP*(DPgsh@ zkq=#t%&vxJh7}h|7tQR^YBPTEFPXo3lM}P3L6G7c&m!Y9l5#v%JZU_Kcv5-pOR7B< y1e;{g{?J}zUz>D`);D?6IUk!3PImDO;$eteYM}V|B)=EXc?_PeelF{r5}E*|>qzAQ literal 0 HcmV?d00001 diff --git a/comp/src/gb.report2/22/TwoPage.png b/comp/src/gb.report2/22/TwoPage.png new file mode 100644 index 0000000000000000000000000000000000000000..306e7cee92a4e4f56325c4578c0a91fc034eba0e GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H0wnYHF4+L296VhdLp07OCnzu)82ve}b*dp$ zhWkgq%OVD~pgD%CDqJ+v9Fv57(seX!-2TimnEO$FRV&BQiYZCYMBG$zOIR2_SaK=7 TmCRcUG>gI0)z4*}Q$iB}hN~o7 literal 0 HcmV?d00001 diff --git a/comp/src/gb.report2/32/Collatecopie.png b/comp/src/gb.report2/32/Collatecopie.png new file mode 100644 index 0000000000000000000000000000000000000000..3c0a284961fe7362bd9bc98c0020bdb460f4f017 GIT binary patch literal 449 zcmV;y0Y3hTP)2wR%gW*5 z;m*v<k@N&FAOl=;!C_>gww0>FMd{?Ca~&(9iAc>+I|5>gnjt%*^fV?BCwq zy1BU0(b3M$&BMRG?(OW*&(Gf7-N(km?(Oa7=H z>F3-1oB03$010$bPE!E*#1F|8st?Je;|_TM006~FL_t(I%e|4=4uU`oMeBkJjE-0x z#SPr|1=RolHB)d52~GOOdF{=4=mFRDd|#<-`RMX?UVk;SkM#IZ%O z4#bH?u@0@na5~G-V|#e~wn0`V09%$`4Y0kn)3+AEf*s rgwz3>g?<5?Ck68?CkCA?CtIC?(OaF?(OgH?eFjI@bB*P^6{yq zq~YM<@9*!aq@v>D;_&b9>+9>|vw6n6|;NR5K)62@r%gf5v*xI9_pv}j|@bK`#z`(JvugS>A!NI`C#>d&% z*xcLOpr4-2$HmUc$ETv8>gnj*+uFdszw`3)-rU@to}BOP?aj-~#KXgzoSDwY#ipX5 z!ok7T*4EwJ+?<@6rlFwL)z!eizuVi|ot&G~)6>z^)}Nl8&Bn#2p`h~c@bvTY>FMjz z)z_n;pSrZNrl6m#r=`rs#BKCF>;M1&0d!JMQvg8b*k%9#0We8KK~y-)jnipUfC*1|J}gbU@9e(o`@c+T7l9ti-wdyw|L!n5^Ds;Ud`%vFB=ECb zfDeX3LbE8gNRlMWa@Z8{lOW2qg4&`ahy~&xB}Rkx4iK^ez7xdKKuvUkSd|8X2GVJe z6uLo?BneXK9#C(J2AMvPP6F(G1OA?4?;9{S=YRV@s1>ThgR(0A`3WQJ5g3@fWPcEp zr7vj=BtV0P6$qdqdc&~tdzjPm`H@lj)JocJYM002ovPDHLkV1nd{ BwRHdh literal 0 HcmV?d00001 diff --git a/comp/src/gb.report2/32/grayscale.png b/comp/src/gb.report2/32/grayscale.png new file mode 100644 index 0000000000000000000000000000000000000000..670e944d6aeb111916160f2bdf358937d265d71c GIT binary patch literal 1564 zcmV+%2IKjOP)gwz3>g?<5?Ck68?CkCA?CtIC?(OaF?(OgH?eFjI@bB*P^6{yq zq~YM<;^N}tlq(=H=(+<>%+-=;!C?=;-O_=;`U{>gnm~>gn(A@2RAs zgn+B@9XR9cq)=I7_<;NRc5xwzoq;Ogq?@$m22+1RqNvAnyx$j8U6 ztgOk&$+0p?K?W&CR>Ix#HpB!ok4M&(8Al@$T*HxVN{O zn3(0`K_n-QDQt=GfQQ?CR>&)6=G-q0P$2hKBL+ z@bmKW^z-xM;^NlU)%ErC>ged0mX?EpfrNvDtgEWy;o)P4ay1BW>#>MjS@R^yI zg@l8KgoNVY;G?3U^YQV#ySm-o+|SOFMjz)z_n;pSrZNrl6m#r=`rs#6oTBNB{r;0d!JMQvg8b*k%9#0@+DKK~y-)V_+Zx zFf!o)j8Fy4EUawo9Gsk7+&nzIe0+TT{QLqSAjk|=AjB#xA}S^>At@y-BO@y-Coiv{ z2m(q%PzB0tBBJ6dl9C{4Igq3(8yKi5!xX4%h-*q}X=%&K>FDa}>9eYU&gJ1@v4$z&0?E6% zJ2-fFdTDZb`{?@efq)-Ofj^h6bUaL6nuWU35%L ztfyC8d_rQ9rJ`DLN=mAML0S|{LAs1=MogwlR(4KqUR-j1N`XvDN}+*)A51}!m7SbK zv9o7hLJ2Sw)$;QB)TF}s3=9N|pbAP^*viTic`GV|tJ120Kp|0~rnXM8roI$r0#8F@ zQ*%jpORIpIni>mBTRWGkPe*4L+yrYiw(g$ZzVQCOuCA^L6DDv4bFmvwG^we9hl3jX zr1Hdw$y26+q^ql?rb*Q#Pgkv(0aGwjfZbAN)@%dzq&a?m)zva{=gqe$n>S;|jF~VK z7I365T(r1dYDrQ+9Q)E`#>=GwSF8jofSa(&a`l?EYuC+NzkI{SO`BJ3*}AQzW&8a3 zH8bG~xOjH#+|06Tx1dX$<+d7`ZGL<9*7EV~gPE{jjf*EjjV0qiO$J-dhx!kWdnDgK^JYN76M1T~40%`vI3CnFB zJ~Ei|_z5E8JT>6i0#r~13Z?n;t5{v0J%8~Mp`U@_6<7fa3q%1+-0L@Q-yzF`6$pS8 z2nx>MY7qAR!^cl3dGm8M%RG>7kpB7e{l0wthL(B1|3C#le-V@AVE_QtsRkb4V6q1Q O0000fzww@9*!fs;R=gys4z3>+9;`;^Oe{@9^*L^YZbkrljlZ>*M3&@$m2L>+9s? zvw6n6|;NR5K)62@r%gf5v*xI9_pv}j|@bK`#z`(JvugS>A!NI`C#>d&% z*xcLOpr4-2$HmUc$ETv8>gnj*+uFdszw`3)-rU@to}BOP?aj-~#KXgzoSDwY#ipX5 z!ok7T*4EwJ+?<@6rlFwL)z!eizuVi|ot&HL=;zbZ)6vw{pPrq~#>JFd(f*Q24Iy0o&Upr5U$rOd{}5gA^>00001bW%=J06^y0W&i*Il1W5CR5;6Z(^pf2 zKoo}I6E%W}N@Njpk4$I3fxT zOskh$!bC)+13Q^ag-Rw36A_gFI956x9;95^LBzm8Mis;1BAY=(j-!yvbHas_mYsx& zuPKQl*C1jxW3WMt7Y_2WBRc?I>pufe^hq{@LSF$(xrMs$8AvQ3Oz77%4PQ&E4bOcq z7I;3P16}8Q2YrAP0utb0P~r`ShK7rp?*$%yYRR%(yoFV5WOQtNVsdJFW_At{Dwy-O z?Yb$~t|l!kE-kODuC13g5b;siRP5T6t?iw%QrRsrWPpSQd)@m7O6BmViVPP4j+I<( z4cjNDXXhn`Py^tiez0|Ub$wG}2s1*1+q?URM}|;?{ufVW_1Q4!^@16%Z|_xv8uT1K yKI{AXW(YOlw=lwtzjF>k4X7<_Kz(83_v8o7|B&yS(h6z-0000>>>>>>>>>>>>>>>>>>>>> PUBLIC VARIABLES >>>>>>>>>>>>>>>>>>>>>>>>> +'>>>>>>>>>>>>>>>>>>>>>>>>>> PROPERTIES >>>>>>>>>>>>>>>>>>>>>>>>>>> +'>>>>>>>>>>>>>>>>>>>>>> PRIVATE VARIABLES >>>>>>>>>>>>>>>>>>>>>>>> +'##################### PUBLIC PROCEDURES ######################### +'##################### PRIVATE PROCEDURES ######################## +'######################## PROPERTIES ############################# + diff --git a/comp/src/gb.report2/gambas.svg b/comp/src/gb.report2/gambas.svg new file mode 100644 index 00000000..5bfafe4d --- /dev/null +++ b/comp/src/gb.report2/gambas.svg @@ -0,0 +1,540 @@ + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Gambas 3 + 15/09/2008 + + + Fabien Bodard + + + + + Common Creative + + + + + Fabien Bodard + + + gbFBodard150908 + http://gambas.sf.net + + + gambas3 logo basic shrimp + + + A pretty shrimp, a malicious new gambas logo... we got the power ! + + + Fabien Bodard + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/comp/src/gb.report2/icon.png b/comp/src/gb.report2/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..622c737863940f037e52c57ec5d213056a5dcf26 GIT binary patch literal 2357 zcmV-53Ci|~P)yzkY*rqhtx$LfYcg~H6-7}floxNYYhhYn$AXb4KF z_KY9|T5CutA%wuz))tgf$Ye5DU0u~$>lxQ|zkc-S(M-1i&`vwhS_1&2l<+*S?Z!Dr zu~R<{6jk_JHlj8PB{EG{lWX$=BE2mz%O;_*0y z5Hy)g#z&x&wIWyvqm^c64?>7P9ZD$?i^V`G17i%7G30VNWU^UU zmPK9H9g5$(I3u3r}$_4g%QQQvh7Z^v)p{iG&+6+#GizDJ3k+@*TGwZ_nnodAG*ev5A8H=b*C%r*cBa3Np|5pudy=Z%CAV2lAM)dY(%Xi7t4 zFvcLuP(05A0C=2(mu>1T050Hp92WC@qqB0#|7JOrTI5fG(d-@&N!LG-f*aF4?(hh=4G_CvujO$6|M)__t35Z{Pir9eHI zCHS=%oFCIX~tZ|t@sK+CW({Z=Ia z1%h^V_}T^_wF(*1jrBmYikbyL8DQD{0U)J>58SAzvJ4%HApEjF)@Lmp&?k7 zRkbp#+%2kfpuU&2PZ2^;EEci3xryu7uY*#GFC0077xuk?ojZ3%0n?8jJ@PV{j1Az8 zGiT2Hv{xuyo;{I<1EtV==Lhd#Vc{C0)i?@tdzVH2*c?5Veh%Mz z`}?r0+KI5ZxQJV~ZWXlFd(NFZcOM9(fMr>qS4zcq@7@j0IYgcNYTL4~YjhX(f9e2~ zQl+A(lz(hm@O!OuwPuf2(&4oqpR1MQVN`NodAL<*hrNr7Xm;C3FT_d z0hNNs1#-FEU;t3E)MVoYky0uY8CK=VW&kKD;T4O>WHN&RKuV}4YJllC7%7nvU?9{S zP$_tv4-5dIR8vI|Xd(iFQ&r7QqyqOiMA7Ss^Q{6QVT&3V>)0C7UaPmHoDv0;OjIazFrB<@X7iO@X=*@c4;r zofMD?Qplbaz*Ygkvbt9Ujq{D}1kK&xAOIkCEK~$N&%@Hv67u;xMn*<3K0Y3@J;cr& zn2VbMAeDqB1a|oeannw<@T*7wx<+4wh9Y2da})U7pRq7Di$m{y1EaZ7IF923XqW=# z*0Pq;&!+MCbpJO*qqH~utZ#EH7Q@G^003~DxL@3(z*a4W%u={s1iW(MI9@q%e7k+F zlCjxw9DMr2*KlC@G;G@jjZ^Dli5>-6CkVnWL7HQCnQw^<1D` z)h&WbDg0`Fu5Jh2ej}tQwLMhzg^aSA5wIquRDby6dmX+y*V<-hzhmd+FCA3?*39={ zoU`%q@g3=j=kG%)kQOY9N|$b`8~rP-Ap!jU>Qx7T03dM-o(1#Bn zN+INy;KDUeevBN)!GQw@000*+Uc}PUQda?Vs#Ge4{rmR=01}A=ip65sf5t$x7RJ|d zQwD(Fik$z3Qab4gVe9gnSO8Ec6p+v70RXP+VsvzLyL}GHbzR@Sd_Iptp#YSliVzCh zu>`pMU8TPkN_EI@_y7ITTTku!#Ek8@q4)9?s6W8e)D)(srncMXDjEB@RG{&MM<|V% zb6m>5Y;6ALo0a|=0MZaySy@@f%F6Ml)9L5qj+53}GuKVN$p!ynKA-Pxwd;~fnm?tFm9#m_Wt3W5T_%P0kzBg1SMa?)91)^2w+l3$le{buqx|dbGmg9}8sBtI? bMA!9Sq6r@{L;RH=00000NkvXXu0mjf^6p<( literal 0 HcmV?d00001 diff --git a/comp/src/gb.report2/tmpJournal b/comp/src/gb.report2/tmpJournal new file mode 100644 index 00000000..eb76ce09 --- /dev/null +++ b/comp/src/gb.report2/tmpJournal @@ -0,0 +1,12 @@ +[GB.REPORT2] +* BUG: The ReportControl font property now make a copy of the font given in argument. +* BUG: Now a too big children element is clipped if it is the first one listed + after the fixed ones (no more infinite loop) +* NEW: ReportUnit module is merged with Report class. All functions for convertion + are now available as static functions in Report. The two internal functions scale and + internal width are now public function of report instance. +* NEW: Return of the ReportImage and ReportSvgImage with no change for now. +* NEW: Continue to improve the ReportGridView widget ... really not ready for use. +* NEW: Restore the UseField property in ReportLabel so for now the component is + backward compatible. + \ No newline at end of file diff --git a/comp/src/gb.report2/tortueface.gif b/comp/src/gb.report2/tortueface.gif new file mode 100644 index 0000000000000000000000000000000000000000..249942783056e283b62934c309699e8229228327 GIT binary patch literal 1019 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 2 Then Break + hMenu = New Menu(mnuSources) As "mnuSources" + hMenu.Text = aSources[i] + hMenu.Tag = aList[i] + + If sCur = aList[i] Then + mnbSource.Text = ("Source : ") & hMenu.Text + mnbSource.Tag = hMenu.Tag + Endif + Next + + 'Link menu to button + mnbSource.Menu = "mnuSources" + Endif + + 'Loading Resolution menu + + If $hScan.Exist("Resolution") Then + sCur = $hScan["Resolution"].Value + For Each s In $hScan["Resolution"].List + hMenu = New Menu(mnuResolutions) As "mnuResolutions" + hMenu.Text = s + hMenu.Tag = s + + If s = sCur Then + MnbResolution.Text = ("Resolution : ") & hMenu.Text + MnbResolution.Tag = hMenu.Tag + Endif + + Next + MnbResolution.Menu = "mnuResolutions" + Endif + + If $hScan.Exist("Mode") Then + sCur = $hScan["Mode"].Value + For Each s In $hScan["Mode"].List + 'Well loading Modes as it because + 'they are too many modes style to manage + 'and I don't want to limit my scanners options + + hMenu = New Menu(mnuModes) As "mnuModes" + hMenu.Text = s + hMenu.Tag = s + If sCur = s Then + mnbMode.Text = ("Mode : ") & s + mnbMode.Tag = s + Endif + Next + mnbMode.Menu = "mnuModes" + Endif + +hbScanOptions.Show + +'Set Values from settings +'Take a look if settings for this scanner exist +If Settings[$hScan.Name &/ "mode"] = Null Then Return + +'Set the Mode +mnbMode.Text = Split(Settings[$hScan.Name &/ "mode"])[0] +mnbMode.Tag = Split(Settings[$hScan.Name &/ "mode"])[1] +'Set the Resolution +MnbResolution.Text = Split(Settings[$hScan.Name &/ "resolution"])[0] +MnbResolution.Tag = Split(Settings[$hScan.Name &/ "resolution"])[1] +'Set the Source +mnbSource.Text = Split(Settings[$hScan.Name &/ "source"])[0] +mnbSource.Tag = Split(Settings[$hScan.Name &/ "source"])[1] + +End + +Public Sub mnuScanners_Click() + + If Last.Text = $hScan.Name Then Return + $hScan = Scanners[Last.Text] + SetScanner() + +End + + + +Public Sub mnuSources_Click() + + mnbSource.Text = ("Source : ") & Last.Text + mnbSource.Tag = Last.Tag + Settings[$hScan.Name &/ "source"] = [mnbSource.Text, CStr(mnbSource.Tag)].Join() + +End + + +Public Sub mnuResolutions_Click() + + MnbResolution.Text = ("Resolution : ") & Last.Text + MnbResolution.Tag = Last.tag + Settings[$hScan.Name &/ "resolution"] = [MnbResolution.Text, CStr(MnbResolution.Tag)].Join() +End + + +Public Sub mnuModes_Click() + + mnbMode.Text = ("Mode : ") & Last.Text + mnbMode.Tag = Last.Tag + Settings[$hScan.Name &/ "mode"] = [mnbMode.Text, CStr(mnbMode.Tag)].Join() +End + + +Public Sub Scanner_Begin() + +Spring1.Hide +hbProgress.Show + +End + +Public Sub Scanner_PageBegin() + + + +End + + +Public Sub Scanner_PageEnd() + + Dim hImg As Image + Dim s As String + + Try hImg = Last.Peek() + + If Not hImg Then + msvError.Open("Error : Can't load image.", Picture["icon:/32/warning"]) + Return + Endif + + $aImg.Add(hImg) + dvPages.Count = $aImg.Count + + 'Show the toolbar + hbToolbar.Show + +End + +Public Sub Scanner_End() + + hbProgress.Hide + Spring1.Show +End + + +Public Sub Scanner_Error(ErrorText As String) + + msvError.Open(ErrorText, Picture["icon:/32/error"]) + +End + +Public Sub Scanner_Progress() + + pgbScan.Value = Last.Progress + +End + + + + + +Public Sub dvPages_Draw(Page As Integer, Width As Integer, Height As Integer) + + Paint.DrawImage($aImg[Page], 0, 0, Width, Height) + +End + +Public Sub btnPrint_Click() + + Dim hPrinter As New Printer As "Printer" + hPrinter.FullPage = True + hPrinter.Paper = hPrinter.A4 + hPrinter.Preview() + +End + +Public Sub Printer_Begin() + + Last.count = $aImg.Count + +End + +Public Sub Printer_Draw() + + Paint.DrawImage($aImg[Last.Page - 1], 0, 0, Paint.Width, Paint.Height) + +End + + +Public Sub btnNew_Click() + + If Not $bSaved Then + If Message.Warning("You have not saved the current scanning session !\nAre you sure you want to clear all ?", "&No", "&Yes") = 0 Then + Return + Endif + Endif + $aImg.Clear + dvPages.Count = 0 + hbToolbar.Hide + +End + + +Public Sub mnuScannersRefresh_Click() + + Scanners.Search + +End + + +Public Sub btnSave_Click() + + Dim hPrinter As New Printer As "Printer" + Dim sPath As String + Dim hImg As Image + Dim i As Integer + + Dialog.Path = Settings["General/SavePath", User.home & "/"] + If Not Dialog.SaveFile() Then + sPath = Dialog.Path + If File.Ext(sPath) = "jpg" Then + For i = 0 To $aImg.Max + $aImg[i].Save(File.SetBaseName(sPath, File.BaseName(sPath) & Format(i, "000"))) + Next + Endif + Endif +End + + +Public Sub tmrTry_Timer() + + Dec $iTryDelayCnt + Me.Title = $sAppName & " - No scanner available... New try in " & $iTryDelayCnt & "s" + If $iTryDelayCnt = 0 Then + Me.Title = $sAppName & " - Searching scanners..." + $tmrTry.Stop + $tmrTry = Null + Scanners.Search + Endif +End diff --git a/comp/src/gb.scanner/.src/Demo/FScan.form b/comp/src/gb.scanner/.src/Demo/FScan.form new file mode 100644 index 00000000..f7047823 --- /dev/null +++ b/comp/src/gb.scanner/.src/Demo/FScan.form @@ -0,0 +1,211 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,150,86) + Font = Font["+1"] + Text = ("Gambas Easy Scan") + Arrangement = Arrange.Vertical + { mnuScanners Menu + Text = ("mnuScanners") + Visible = False + } + { mnuResolutions Menu + Text = ("mnuResolutions") + Visible = False + } + { mnuModes Menu + Text = ("mnuModes") + Visible = False + } + { mnuSources Menu + Text = ("mnuSources") + Visible = False + } + { HBox1 HBox + MoveScaled(1,1,149,6.8571) + { mnbScanner MenuButton + MoveScaled(0,0,9,7) + Enabled = False + NoTabFocus = True + Picture = Picture["icon:/32/scanner"] + Border = False + MenuOnly = True + } + { PictureBox1 PictureBox + MoveScaled(15.2857,0,3.4286,6.8571) + Picture = Picture["next.png"] + } + { hbScanOptions HBox + MoveScaled(20,0,129,7) + Visible = False + Expand = True + Spacing = True + { mnbMode MenuButton + MoveScaled(0,0,28.5714,7) + Font = Font["+1"] + AutoResize = True + Text = ("Mode :") + Border = False + MenuOnly = True + } + { PictureBox2 PictureBox + MoveScaled(25.2857,1,3.4286,6.8571) + Picture = Picture["next.png"] + } + { MnbResolution MenuButton + MoveScaled(35,1,28.5714,7) + Font = Font["+1"] + AutoResize = True + Text = ("Resolution :") + Border = False + MenuOnly = True + } + { PictureBox3 PictureBox + MoveScaled(65,1,3.4286,6.8571) + Picture = Picture["next.png"] + } + { mnbSource MenuButton + MoveScaled(71,1,28.5714,7) + Font = Font["+1"] + AutoResize = True + Text = ("Source :") + Border = False + MenuOnly = True + } + { PictureBox4 PictureBox + MoveScaled(97,1,3.4286,6.8571) + Picture = Picture["next.png"] + } + { hbProgress HBox + MoveScaled(101,0,7,7) + Visible = False + Expand = True + Margin = True + Padding = 5 + { pgbScan ProgressBar + MoveScaled(1,0,8,6) + Expand = True + Border = False + } + } + { Spring1 Spring + MoveScaled(110,3,2,3) + } + { btnScan Button + MoveScaled(112,0,16,7) + Font = Font["Bold"] + Background = Color.SelectedBackground + Text = ("Scan") + } + } + } + { Separator1 Separator + MoveScaled(20,9,104,0) + } + { msvError MessageView + MoveScaled(7,10,133,6) + } + { Panel2 Panel + MoveScaled(5,11,163.7143,63.7143) + Expand = True + Arrangement = Arrange.Horizontal + { VBox1 VBox + MoveScaled(0,6,6,50) + Spacing = True + { ToolButton1 ToolButton + MoveScaled(0,0,6,6) + Picture = Picture["icon:/32/left"] + } + { ToolButton2 ToolButton + MoveScaled(0,7,6,6) + Picture = Picture["icon:/32/right"] + } + { Separator3 Separator + MoveScaled(1,13,5,0) + } + { ToolButton3 ToolButton + MoveScaled(0,14,6,6) + Picture = Picture["icon:/32/rotate-left"] + } + { ToolButton4 ToolButton + MoveScaled(0,20,6,6) + Picture = Picture["icon:/32/rotate-right"] + } + { Separator4 Separator + MoveScaled(0,27,5,0) + } + { ToolButton5 ToolButton + MoveScaled(0,29,6,6) + Picture = Picture["icon:/32/cut"] + } + { Separator5 Separator + MoveScaled(0,41,5,0) + } + { ToolButton7 ToolButton + MoveScaled(1,42,6,6) + Picture = Picture["icon:/32/delete"] + } + } + { Panel1 Panel + MoveScaled(17,0,145.8571,62.8571) + Expand = True + Arrangement = Arrange.Fill + { dvPages DocumentView + MoveScaled(17,12,134,51) + Visible = False + Expand = True + Arrangement = Arrange.Horizontal + } + { vbWait VBox + MoveScaled(1,2,125,55) + Background = &HBCBEC0& + Expand = True + { Spring2 Spring + MoveScaled(61,2,3,3) + } + { spnWait Spinner + MoveScaled(32,7,60,40) + Foreground = &HDBDDE0& + } + { lblWait Label + MoveScaled(19,35,89,8) + Font = Font["Bold,+8"] + Foreground = &HDBDDE0& + Text = ("CONNECTING SCANNER") & "..." + Alignment = Align.Center + } + { Spring3 Spring + MoveScaled(50,48,2,4) + } + } + } + } + { Separator2 Separator + MoveScaled(2,77,139,0) + } + { hbToolbar HBox + MoveScaled(2,78,129,6) + Visible = False + Spacing = True + Margin = True + Padding = 2 + { btnNew Button + MoveScaled(0,0,21,5) + Text = ("New") + Picture = Picture["icon:/22/new"] + } + { Spring4 Spring + MoveScaled(22,1,27,1) + } + { btnPrint Button + MoveScaled(85,0,22,5) + Text = ("Print") & "..." + Picture = Picture["icon:/22/print"] + } + { btnSave Button + MoveScaled(108,0,21,5) + Text = ("Save") & "..." + Picture = Picture["icon:/22/save"] + } + } +} diff --git a/comp/src/gb.scanner/.src/Demo/Form1.class b/comp/src/gb.scanner/.src/Demo/Form1.class new file mode 100644 index 00000000..952651f1 --- /dev/null +++ b/comp/src/gb.scanner/.src/Demo/Form1.class @@ -0,0 +1,25 @@ +' Gambas class file + +Private $himage As New Image + + +Public Sub Button1_Click() + Dim hscan As New Scanner("hpaio:/net/OfficeJet_5200_series?ip=192.168.1.25") + '$himage = Scanners["hpaio:/net/OfficeJet_5200_series?ip=192.168.1.25"].Scan() + hscan["Mode"].Value = "Color" + $himage = hscan.Scan() + DrawingArea1.Refresh + +End + +Public Sub Form_Open() + + + +End + +Public Sub DrawingArea1_Draw() + + Draw.Image($himage, 0, 0, Paint.Width, Paint.Height) + +End diff --git a/comp/src/gb.scanner/.src/Demo/Form1.form b/comp/src/gb.scanner/.src/Demo/Form1.form new file mode 100644 index 00000000..0e256646 --- /dev/null +++ b/comp/src/gb.scanner/.src/Demo/Form1.form @@ -0,0 +1,11 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,64,64) + { Button1 Button + MoveScaled(13,6,25,18) + } + { DrawingArea1 DrawingArea + MoveScaled(16,30,38,25) + } +} diff --git a/comp/src/gb.scanner/.src/Demo/Main.module b/comp/src/gb.scanner/.src/Demo/Main.module new file mode 100644 index 00000000..833075c7 --- /dev/null +++ b/comp/src/gb.scanner/.src/Demo/Main.module @@ -0,0 +1,8 @@ +' Gambas module file + +Public Sub Main() + + Application.Theme = "gambas" + FScan.Show + +End diff --git a/comp/src/gb.scanner/.src/Demo/Main2.module b/comp/src/gb.scanner/.src/Demo/Main2.module new file mode 100644 index 00000000..f363507c --- /dev/null +++ b/comp/src/gb.scanner/.src/Demo/Main2.module @@ -0,0 +1,31 @@ +' Gambas module file + + +Public Sub Main() + + +Dim hScan As New Scanner("hpaio:/net/OfficeJet_5200_series?ip=192.168.1.25") +Dim s As String +Dim sUnit As String + +For Each s In hScan + Print hScan[s].Name + 'Print hScan[s].Info + + + If hScan[s].List Then + sUnit = hScan[s].Unit + Print " " & hScan[s].List.Join("|") & sUnit & " (Default: " & hScan[s].Value & sUnit & ") " & IIf(hScan[s].IsActive, "Active", "Inactive") + Endif + + If hScan[s].IsRange Then + Print " " & hScan[s].MinValue & " .. " & hScan[s].MaxValue & hScan[s].Unit & " (Default:" & hScan[s].Value & hScan[s].Unit & ") " & IIf(hScan[s].IsActive, "Active", "Inactive") + Endif + + Print +Next + + + + +End diff --git a/comp/src/gb.scanner/.src/MTest.module b/comp/src/gb.scanner/.src/MTest.module new file mode 100644 index 00000000..607dc4fb --- /dev/null +++ b/comp/src/gb.scanner/.src/MTest.module @@ -0,0 +1,17 @@ +' Gambas module file + +Public Sub Main() + + +Dim hImg As Image + +'Dim hscan As New Scanner("hpaio:/net/HP_LaserJet_M1536dnf_MFP?ip=192.168.1.25") +Dim hscan As New Scanner("v4l:/dev/video0") +hscan.Debug = True +hScan["Mode"].Value = "color" +'hScan[" Resolution "].Value = 30 +hScan!Width.Value = 2560 +hImg = hscan.Scan() +hImg.Save("~/fa.png") +End + diff --git a/comp/src/gb.scanner/.src/MTest2.module b/comp/src/gb.scanner/.src/MTest2.module new file mode 100644 index 00000000..11f7d6ae --- /dev/null +++ b/comp/src/gb.scanner/.src/MTest2.module @@ -0,0 +1,21 @@ +' Gambas module file + +Private hSCan As Scanner + + +Public Sub main() + + + Dim s As String + + hSCan = New Scanner("hpaio:/net/HP_LaserJet_MFP_M426fdn?ip=192.168.1.25") + + For Each s In hSCan + If hSCan[s].IsRange Then + Print "IsRange : ", s, " ", "==>", "min : ", hSCan[s].MinValue, "Max :", hSCan[s].MaxValue, "Units : ", hSCan[s].Unit + Else + Print "IsList : ", s, " ", "==>", hSCan[s].List.Join() + Endif + Next + +End diff --git a/comp/src/gb.scanner/.src/Module1.module b/comp/src/gb.scanner/.src/Module1.module new file mode 100644 index 00000000..abb1cc3b --- /dev/null +++ b/comp/src/gb.scanner/.src/Module1.module @@ -0,0 +1,28 @@ +' Gambas module file + +Private hscan As New Scanner("hpaio:/net/HP_LaserJet_M1536dnf_MFP?ip=192.168.1.25") As "Scan" +Public Sub Main() +Print Object.Parent(hscan) + hScan.ASync = True + +hScan["Mode"].Value = "Color" +'hScan["Resolution"].Value = 300 + +hscan.Scan() +'hImg.Save("~/fa.png") + +End + + + Public Sub Scan_Progress() + + Print hscan.Progress + +End + +Public Sub Scan_End() + + Print "End" + +End + diff --git a/comp/src/gb.scanner/.src/Module2.module b/comp/src/gb.scanner/.src/Module2.module new file mode 100644 index 00000000..1cd27e1b --- /dev/null +++ b/comp/src/gb.scanner/.src/Module2.module @@ -0,0 +1,10 @@ +' Gambas module file + +Public Sub Main() + + Dim s As String + For Each s In Scanners + Print Scanners[s].Name + Next + +End diff --git a/comp/src/gb.scanner/.src/Scanner.class b/comp/src/gb.scanner/.src/Scanner.class new file mode 100644 index 00000000..43db2c22 --- /dev/null +++ b/comp/src/gb.scanner/.src/Scanner.class @@ -0,0 +1,446 @@ +' Gambas class file + +Export +Private $sVendor As String +Private $sModel As String +Private $sType As String +Private $bDebug As Boolean +Property Debug As Boolean +Property ASync As Boolean +Property Read Name As String +Property Read Vendor As String +Property Read Type As String +Property Read Model As String +Private $sDeviceName As String +Private $bASync As Boolean +'Property _Name As String +Private $sName As String +'Private $Options As ScannerOptions + +Property Read Progress As Float +Private bHaveInfo As Boolean + +Private $aOptionsNames As String[] +Private $aOptions As ScannerOption[] +Private $aImgStack As New String[] +Private $sCurImagePath As String + +Public Struct ScannerInfo + Vendor As String + Model As String + Type As String +End Struct + +Private $fProgress As Float +Private $stmpPath As String = File.Dir(Temp()) +Event Begin +Event PageBegin +Event PageEnd +Event Finished +Event End +Event Progress +Event Error(ErrorText As String) + + +Public Sub _New(sDevice As String) + + $sDeviceName = "--device-name='" & sDevice & "'" + $sName = sDevice + 'If Not IsAvailable() Then + ' Error.Raise("Unknown Device") + 'Endif + +End + +Private Sub GetInfo() + + Dim hInfo As ScannerInfo + + hInfo = Scanners._GetInfo($sName) + $sVendor = hInfo.Vendor + $sModel = hInfo.Model + $sType = hInfo.Type + bHaveInfo = True + +End + +Private Function Name_Read() As String + + Return $sName + +End + +Private Function Vendor_Read() As String + + If Not bHaveInfo Then GetInfo + Return $sVendor + +End + +Private Function Type_Read() As String + + If Not bHaveInfo Then GetInfo + Return $sType + +End + +Private Function Model_Read() As String + + If Not bHaveInfo Then GetInfo + Return $sModel + +End + +Private Sub GetOptions() + + Dim sRet As String + Dim s, sCurGroup As String + Dim aLine As String[] + Dim hOption As ScannerOption + Dim a As String[] + Dim iTiret As Integer + Dim sName As String + Dim sValues As String + Dim sDefault As String + Dim iStartOptions As Integer + Dim iEndOptions As Integer + + If Not IsAvailable() Then Error.Raise("Unknown device or device not available") + + $aOptionsNames = New String[] + $aOptions = New ScannerOption[] + Shell "scanimage " & $sDeviceName & " -A" To sRet + + For Each s In Split(sRet, "\n") + s = Trim(s) + If InStr(s, ":") Then + sCurGroup = Trim(Left(s, -1)) + Continue + Endif + + If s Begins "-" Then + 'Correction of some specific mode name (ex: [=(yes|no)]) + If InStr(s, "[=(") Then + s = Replace(s, "[=(", " ") + s = Replace(s, ")]", "") + Endif + + iStartOptions = InStr(s, " ") + If s Ends "]]" Then + iEndOptions = RInStr(s, "[", RInStr(s, "[") - 1) - 1 + Else + iEndOptions = RInStr(s, "[") - 1 + Endif + If iEndOptions = -1 Then iEndOptions = Len(s) + + sName = Left(s, iStartOptions - 1) + sValues = Trim(Mid(s, iStartOptions + 1, iEndOptions - iStartOptions - 1)) + sDefault = Mid(s, iEndOptions + 1) + 'aLine = Split(Mid(s, iStartOptions), " ", "()") + hOption = New ScannerOption + 'Store the option group + hOption._Group = sCurGroup + 'Manage the option cutting + iTiret = IIf(sName Begins "--", -2, -1) + + 'SOme option are standardised so we can manage them with our + 'own way. + Select Case Right(sName, iTiret) + Case "l" + hOption._Name = "Left" + Case "t" + hOption._Name = "Top" + Case "x" + hOption._Name = "Width" + Case "y" + hOption._Name = "Height" + Case Else + hOption._Name = Right(sName, iTiret) + hOption._Name = UCase(Left(hOption._Name)) & Right(hOption._Name, -1) + End Select + 'Remember the real option command line + hOption._Command = sName + 'sOptions = Mid(s, iStartOptions, iEndOptions - iStartOptions) + 'Define the option style (Range/List) + hOption._IsRange = InStr(sValues, "..") + 'Manage the range style option + If hOption._IsRange Then + 'if find a coma then remove it and the text next + If InStr(sValues, ",") Then sValues = Left(sValues, InStr(sValues, ",") - 1) + aLine = Split(sValues, " ", "()") + sValues = aLine[0] + a = Scan(sValues, "*..*") + hOption._MinValue = a[0] + s = GetUnit(a[1]) + If s Then + hOption._MaxValue = Left(a[1], -Len(s)) + hOption._Unit = s + Else + hOption._MaxValue = a[1] + Endif + If aLine.Count = 2 Then + hOption._Steps = CFloat(Mid(aLine[1], RInStr(aLine[1], " "))) + Endif + + Else + 'If hOption.Name = "Mode" Then Stop + 'Manage the list style option + hOption._List = Split(sValues, "|") + 'If the option list have a unit then use it and remove it from the list + s = GetUnit(hOption._List[hOption._List.Max]) + If s Then + hOption._List[hOption._List.Max] = Left(hOption._List[hOption._List.Max], -Len(s)) + hOption._Unit = s + Endif + Endif + + 'Manage the default values and the not activate fag + If sDefault Begins "[" Then + If InStr(sDefault, "inactive") Then + hOption._IsActive = False + Else + If hOption._IsRange Then + hOption._Value = CFloat(Mid(sDefault, 2, -1)) + Else + hOption._Value = Mid(sDefault, 2, -1) + Endif + Endif + Endif + $aOptionsNames.Add(hOption.Name) + $aOptions.Add(hOption) + '$Options._Add(hOption) + Continue + Endif + + Next + +End + +Private Function GetUnit(sValue As String) As String + + Dim i As Integer + Dim s, sRet As String + + If Not sValue Then Return + If IsLetter(Left(sValue)) Then Return + For i = 1 To Len(sValue) + s = Mid(sValue, i, 1) + If (Asc(s) >= 97 And Asc(s) <= 122) Or If (s = "%") Then + sRet &= s + Endif + Next + If Len(sRet) > 3 Then sRet = "" + Return sRet + +End + + +''Return if the current scanner is available +Public Function IsAvailable() As Boolean + + Dim s As String + + Shell "scanimage " & $sDeviceName & " -n 2>&1" To s + + Return InStr(s, "Error during device I/O") = 0 + +End + +Public Function Scan() As Image + + 'Make the option Line + + Dim ss As String + Dim sOptions As String + Dim sCommand As String + 'Dim sTemp As String = Temp + Dim hImage As Image + Dim hOption As ScannerOption + Dim sCount As String + + If Not $aOptionsNames Then GetOptions + $aImgStack.Clear + + For Each hOption In $aOptions + + If hOption.Modified Then + + If hOption._Command Begins "--" Then + sOptions &= hOption._Command & "=" & IIf(hOption.IsRange, hOption.Value, "'" & hOption.Value & "'") & " " + Else + sOptions &= hOption._Command & " " & IIf(hOption.IsRange, hOption.Value, "'" & hOption.Value & "'") & " " + Endif + + Endif + + Next + If Not $bASync Then + $sCurImagePath = Temp + sCommand = "scanimage " & $sDeviceName & " " & sOptions & "--format=jpeg > " & $sCurImagePath + If $bDebug Then Debug sCommand + Shell sCommand Wait + 'Print ss + Try hImage = Image.Load($sCurImagePath) + If Error Then + Error.Raise("Can't get the image, something goes wrong" & Error.Text) + Return + Endif + Return hImage + Else + If Me.Exist("Source") Then + If InStr(LCase(Me["Source"].Value), "flatbed") Then + sCount = "--batch-count=1" + Endif + Endif + sCommand = Subst("scanimage &1 &2 --batch='&3' &4 --batch-print -p --format=jpeg", $sDeviceName, sOptions, $stmpPath &/ "out%d.jpg", sCount) + If $bDebug Then Print sCommand + Shell sCommand For Read As "Process" + + $fProgress = 0 + Raise Begin + Endif + 'Shell "scanimage" + +End + +Public Sub Process_Error(sError As String) + + Dim fRet As Float + + If sError Begins "Progress:" Then + fRet = Round(CFloat(Left(RTrim(Scan(Split(sError, "\r")[0], "* *")[1]), -1)) / 100, -2) + If fRet > $fProgress Then + $fProgress = fRet + Raise Progress + Endif + Return + Endif + If InStr(sError, "Scanning page") Then + Raise PageBegin + Return + Endif + + If InStr(sError, "scanimage: sane_start:") Then + Raise Error(("Scanner error : ") & Mid(sError, RInStr(sError, ":"))) + Return + Endif + +End + +Public Sub Process_Kill() + + '$aImgStack.Push($sCurImagePath) + $fProgress = 1 + Raise Finished + Raise End + +End + +Public Sub Process_Read() + + Dim s As String + + + s = Read #Last, Lof(Last) + $aImgStack.Add(Trim(s)) + Raise PageEnd + +End + + +Private Function Progress_Read() As Float + + Return $fProgress + +End + + + +''Return recurssively all the options available +Public Function _next() As String + + Dim s As String + + If Not $aOptionsNames Then GetOptions + If IsNull(Enum.Index) Then + Enum.Index = 0 + Else + Inc Enum.Index + Endif + If Enum.Index >= $aOptions.Count Then + Enum.Stop + Return + Endif + + s = $aOptionsNames[Enum.Index] + Return s + +End + +''Find an option from it's name (same as hScan[key]) +Public Sub Find(Key As String) As ScannerOption + + If Not $aOptionsNames Then GetOptions + Try Return $aOptions[$aOptionsNames.Find(Key)] + +End + +''Return if the given option exist +Public Sub Exist(Key As String) As Boolean + + If Not $aOptionsNames Then GetOptions + Return $aOptionsNames.Exist(Key) + +End + +''Return an Option from it's name +Public Function _get(Name As String) As ScannerOption + + If Not $aOptionsNames Then GetOptions + If Not $aOptionsNames.Exist(Name) Then + Error.Raise("Unknown option '" & Name & "' for device : " & $sName) + Return + Endif + Return $aOptions[$aOptionsNames.Find(Name)] + +End + + +''Pop and return the last images. +''Return null if not image available +Public Function Peek() As Image + + Dim hImg As Image + Dim sFile As String + If $aImgStack.Count > 0 Then + sFile = $aImgStack.Pop() + Try hImg = Image.Load(sFile) + Try Kill sFile + Return hImg + Endif + +End + +Private Function Debug_Read() As Boolean + + Return $bDebug + +End + +Private Sub Debug_Write(Value As Boolean) + + $bDebug = Value + +End + +Private Function ASync_Read() As Boolean + + Return $bASync + +End + +Private Sub ASync_Write(Value As Boolean) + + $bASync = Value + +End diff --git a/comp/src/gb.scanner/.src/ScannerOption.class b/comp/src/gb.scanner/.src/ScannerOption.class new file mode 100644 index 00000000..d92c0e8f --- /dev/null +++ b/comp/src/gb.scanner/.src/ScannerOption.class @@ -0,0 +1,126 @@ +' Gambas class file + +Export +Property Read Group As String ''Return the group option name +Property Read IsRange As Boolean ''Indicate if the option give a range between too value +Property Read MaxValue As Float ''Return the range max value +Property Read MinValue As Float ''Return the range min value +Property Value As Variant ''Return the current value of the option +Property Read List As String[] ''If the value is a string return the list of the available values +Property Read IsActive As Boolean ''Return if this option is activate +Property Read Info As String ''Return some info about the option +Property Read Name As String ''Return the option name +Property Read Unit As String ''Return the Unit if option is numbers +Property Read Steps As Integer ''Return Steps +Property Read Modified As Boolean ''Return if the current value have been modified + +Private $bModified As Boolean + +Public _Group As String +Public _IsRange As Boolean +Public _MaxValue As Float +Public _MinValue As Float +Public _Value As Variant +Public _List As String[] +Public _IsActive As Boolean = True +Public _Info As String +Public _Name As String +Public _Command As String +Public _Unit As String +Public _Steps As Float +Public _Relative As Boolean + + +Private Function Group_Read() As String + + Return _Group + +End + +Private Function IsRange_Read() As Boolean + + Return _IsRange + +End + +Private Function MaxValue_Read() As Float + + Return _MaxValue + +End + +Private Function MinValue_Read() As Float + + Return _MinValue + +End + +Private Function Value_Read() As Variant + + Return _Value + +End + +Private Sub Value_Write(Value As Variant) + Dim iFind As Integer + _Value = Value + If Me.IsRange Then + If TypeOf(Value) <> gb.Integer And If TypeOf(Value) <> gb.Float Then Error.Raise("This option require a number value") + _Value = Max(Min(Me.MaxValue, _Value), Me.MinValue) + If _Value <> Value Then Error "Warning: Option: '" & Me.Name & "' -> Value out of range... change to : " & _Value + Else + If Not _List.Exist(Value) Then + + Error "Warning: Option '" & Me.Name & "' -> Value not in the list..." + iFind = _List.Find(Value & "*", gb.Like) + If iFind > 0 Then + _Value = _List[iFind] + Error "Warning: Option '" & Me.Name & "' -> Near value found: Set to '" & _Value & "'" + Endif + Endif + Endif + $bModified = True + +End + +Private Function List_Read() As String[] + + Return _List + +End + +Private Function IsActive_Read() As Boolean + + Return _IsActive + +End + +Private Function Info_Read() As String + + Return _Info + +End + +Private Function Name_Read() As String + + Return _Name + +End + +Private Function Unit_Read() As String + + Return _Unit + +End + +Private Function Steps_Read() As Integer + + Return _Steps + +End + +Private Function Modified_Read() As Boolean + + Return $bModified + +End diff --git a/comp/src/gb.scanner/.src/Scanners.class b/comp/src/gb.scanner/.src/Scanners.class new file mode 100644 index 00000000..5b984548 --- /dev/null +++ b/comp/src/gb.scanner/.src/Scanners.class @@ -0,0 +1,168 @@ +' Gambas class file + +Export +Create Static + +Public Struct ScannerInfo + Vendor As String + Model As String + Type As String +End Struct + +Static Private colCache As New Collection + +Static Private $colScannerList As New Collection +Static Private $aScannerNames As String[] +' Static _Vendors As New String[] +' Static _Models As New String[] +' Static _Types As New String[] + +Static hProcess As Process +Static Private $ret As String +Static Private $IsInit As Boolean +Event Found +Static Public Sub _init() + + If Not System.Exist("scanimage") Then + Error.Raise("Scanner CLI tool is not detected. Please Install the Sane package") + Endif + ' GetList(True) + '$IsInit = True +End + + + +Public Sub Search(Optional bWait As Boolean) + + Dim sRet As String + + If hProcess Then Return + $colScannerList.Clear + $aScannerNames = Null + If Not bWait Then + $ret = "" + hProcess = Exec ["scanimage", "--formatted-device-list", "%d|%v|%m|%t%n"] For Read As "Process" + Else + Exec ["scanimage", "--formatted-device-list", "%d|%v|%m|%t%n"] To sRet + FillList(sRet) + Endif + +End + +Public Function _GetInfo(sDeviceName As String) As ScannerInfo + + If Not $aScannerNames Then Search(True) + + If $colScannerList.Exist(sDeviceName) Then + Return $colScannerList[sDeviceName] + Else + 'If Not hProcess Then + 'FillList(GetList(False)) + Search(True) + Return $colScannerList[sDeviceName] + 'Endif + Endif + +End + +Private Sub FillList(sRet As String) + + Dim s As String + Dim ars As New String[] + Dim hScanner As ScannerInfo + + + + $colScannerList.Clear + $aScannerNames = New String[] + For Each s In Split(sRet, "\n") + If Not s Then Break + ars = Split(s, "|") + hScanner = New ScannerInfo + + 'hScanner._Name = ars[0] + hScanner.Vendor = ars[1] + hScanner.Model = ars[2] + hScanner.Type = ars[3] + $colScannerList[ars[0]] = hScanner + $aScannerNames.Add(ars[0]) + Next + +End + + +''List all the existing devices +Public Function _next() As String + + Dim s As String + + + If Not $aScannerNames Then Search(True) + If IsNull(Enum.Index) Then + Enum.Index = 0 + Else + Inc Enum.Index + Endif + If $aScannerNames.Count = 0 Or If Enum.Index >= $aScannerNames.Count Then + Enum.Stop + Return + Endif + + s = $aScannerNames[Enum.Index] + Return s + +End + + +''Return the given device if exist or fail. +Public Function _get(sDeviceName As String) As Scanner + + Dim hScan As Scanner + + If Not $aScannerNames Then Search(True) + + If Not colCache.Exist(sDeviceName) Then + + hScan = New Scanner(sDeviceName) + colCache[sDeviceName] = hScan + Else + hScan = colCache[sDeviceName] + Endif + + Return hScan + +End + +Public Sub Process_Read() + + $ret &= Read #hProcess, Lof(hProcess) + +End + +Public Sub Process_Error(sError As String) + + Print sError + +End + + +Public Sub Process_kill() + + + If hProcess.State <> hProcess.Crashed Then + FillList($ret) + hProcess = Null + Raise Found + Endif + +End + + +Static Public Sub Close() + + Try hProcess.Kill + +End + + + diff --git a/comp/src/gb.scanner/next.png b/comp/src/gb.scanner/next.png new file mode 100644 index 0000000000000000000000000000000000000000..341372937c91fd3bf5b853e66944fee4a2705569 GIT binary patch literal 1304 zcmV+z1?T#SP)o3s;=zk2FVkqE9)x6MkSP!*48z0$-Jgt^#buxo`~1Kd(T&Vx6goE8 z){bs#e{1)6=x>hc)^*#D@1^O#&+B=fex72Q<^$6-U*#!{M+mVWxLi|HBcBG~RZ9IG z3yLnQpy6L&hPg(Tb4Ds7C^_x0n)kB_?! zILH@5h}XPc?;G{?^{YCroB$vWA3j{~@pxYL`Fxc}jvSeG8<<1B5<)y*R8;h4U0q#j zC4eW7&*)ez_AW4P+xGd|+S&rQ0h*heGr)deT{Id!U0Yk5*Z1-U02&$^X2!gR+IZCdLOPMkRLBfyIO8FS69UAs0G z6&1CoQmIpC&YWqQd)*aa+qP{RHf`E;DISkUE?l_K1o(g{AmhdndADrYa&mHVa&t>d z%lE(wKnbuO@T|2(!Z3_aQ>j#COG`_mZQBA^2V}_ZAi1U;96EH!%w#e(?d|Q~B$LTB zPzXE&6ayOo@2Y_V2M$zetv~PX?rt0(A5Q=pNCQb{^)@iODxkW$y29)Ap1pqk`uRvC z^2iCF0TRG4Fa*Sb^ooJKd-uLrP*4!Mb?a8Budna!6Dyx`!XwV(G%IaURaMnypU>Ad zFfedKDfNdFo*{cI4}p8m>K{93{x?}l=_@HIxiT~~6z%Eh`N;{N1yaDMv-11EgcGh; z0u*fBy0tMLkNY}1J3DiP$H@M;dhUz)0KzbgFKyfQheDx?v$M0>39y~O`@mgb?7!i8 z0fu3`m&s(_Zf$KnXWRDN)@`yaxep9FyGS~_S}-{Q!!X_gKI-V`Xq=dsm}b6?6F}4n zf4Ee5PT=6dgWH7=r+a#O&W((W#GVL$OtvY5zz9wqm&#cb*tc)rD;|$0WLeggfq{W2 z^Ie|=9*{lrVdwdh;fn&hckeDOEG+Em@9*!udGqF<%y)g7>~TaKB;lYrX92Kt=gwz~ zi;LSMkw|}UZ|^V6*D(n^a#kK?zU#}*zd%`8Sy5?e>9?_1jIOS(ZWeZZjQOs|$^I64 zk-Q}V&yF2C>ZYcqUJ8Xm7oFg_I?jdP1IAgT>&pU$VSG3mksdj_ zS+tHz0)}C{qqTnj>eZ`_i9{mFD!QH%5JDX5?(RM{JUkp{Vb|9j4)711RV$pG@ZZG% O0000x*$DcC3g0HA)Lq52O1K)|;UfQ$tE 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 "/" And If Left(Path) <> "~" Then + If Not Path Then + Path = Settings.DefaultDir &/ Application.Name & ".conf" + Else If Path Begins "./" Then + Path = "." & Path + Else If Path Begins "../" Then + Else + Path = Settings.DefaultDir &/ Path & ".conf" + Endif + If Left(Path) = "/" Then + For Each sElt In Split(Settings.DefaultDir, "/") + sPath &/= sElt + Try Mkdir "/" & sPath + Next + Endif + Endif + + $sTitle = Title + + $sPath = Path + + Load() + +End + +Public Sub _free() + + Try Me.Save + If Error Then Error "gb.settings: warning: unable to save settings: "; $sPath; ": "; Error.Where;; Error.Text + +End + +Public Sub Save() + + Dim aKey As New String[] + Dim cSave As Collection + Dim cSlot As Collection + Dim sKey As String + Dim hFile As File + Dim vVal As Variant + Dim sTemp As String + Dim hLock As File + Dim cModify As Collection + Dim sSlot As String + + If Not $bModify Then Return + + If Not IsDir(File.Dir($sPath)) Then + Error "gb.settings: warning: unable to save settings: directory does not exist: "; File.Dir($sPath) + Return + Endif + + 'Debug $sPath + + $bModify = False + + hLock = Lock $sPath & ".lock" Wait 2 + + sTemp = $sPath & "#" + + If Not $bModifyAll Then + + cSave = $cSlot + cModify = $cModify + Load + For Each cModify + sKey = cModify.Key + sSlot = GetSlot(sKey) + sKey = File.Name(sKey) + If cSave.Exist(sSlot) Then + Me[sSlot &/ sKey] = cSave[sSlot][sKey] + Else + Me[sSlot &/ sKey] = Null + Endif + Next + + Endif + + For Each cSlot In $cSlot + aKey.Add($cSlot.Key) + Next + aKey.Sort + + hFile = Open sTemp For Create + + If $sTitle Then + Print #hFile, "# "; $sTitle + Endif + + For Each sKey In aKey + + cSlot = $cSlot[sKey] + If cSlot.Count Then + Print #hFile, "[" & sKey & "]" + For Each vVal In cSlot + Print #hFile, cSlot.Key; "="; ToString(vVal) + Next + Print #hFile + Endif + Next + + Close #hFile + Try Kill $sPath & "~" + Try Move $sPath To $sPath & "~" + Try Move sTemp To $sPath + + '$dDateLoad = Stat($sPath).LastModified + +Finally + + If Exist($sPath & ".lock") Then Try Kill $sPath & ".lock" + If Exist(sTemp) Then Try Kill sTemp + If Exist($sPath & "~") Then Try Kill $sPath & "~" + Try Unlock #hLock + +Catch + + Error.Raise("Unable to save settings: " & Error.Where & " " & Error.Text) + +End + +Private Function GetSlot(sKey As String) As String + + Dim sSlot As String + + sSlot = File.Dir(sKey) + If Not sSlot Then sSlot = "/" + If sSlot = "/" Then + sSlot = "General" + Endif + If Left(sSlot) = "/" Then sSlot = Mid$(sSlot, 2) + + Return sSlot + +End + +Public Function _get(Key As String, Optional {Default} As Variant) As Variant + + Dim hSlot As Collection + Dim sSlot As String + 'Dim dDate As Date + + sSlot = GetSlot(Key) + Key = File.Name(Key) + + hSlot = $cSlot[sSlot] + If hSlot And If hSlot.Exist(Key) Then + Return hSlot[Key] + Endif + + Return {Default} + +End + +Public Sub Exist(Key As String) As Boolean + + Dim hSlot As Collection + Dim sSlot As String + 'Dim dDate As Date + + sSlot = GetSlot(Key) + Key = File.Name(Key) + + hSlot = $cSlot[sSlot] + If hSlot And If hSlot.Exist(Key) Then Return True + +End + +Private Sub SameSetting(vOld As Variant, vNew As Variant) As Boolean + + Dim I As Integer + Dim vOldVal As Variant + Dim vNewVal As Variant + + If IsNull(vOld) And If IsNull(vNew) Then Return True + If TypeOf(vOld) <> gb.Object And If TypeOf(vNew) <> gb.Object Then Return vOld = vNew + + If Not (vOld Is Array) Then Return + If Not (vNew Is Array) Then Return + If vOld.Count <> vNew.Count Then Return + If vOld = vNew Then Return + + For I = 0 To vOld.Max + vOldVal = vOld[I] + vNewVal = vNew[I] + If TypeOf(vOldVal) = gb.Object Or If TypeOf(vNewVal) = gb.Object Then Return + If vOldVal <> vNewVal Then Return + Next + + Return True + +End + + +Public Sub _put(Value As Variant, Key As String) + + Dim hSlot As Collection + Dim sSlot As String + + sSlot = GetSlot(Key) + hSlot = $cSlot[sSlot] + If Not hSlot Then + hSlot = New Collection + $cSlot[sSlot] = hSlot + Endif + + Key = File.Name(Key) + + If Not SameSetting(hSlot[Key], Value) Then + hSlot[Key] = Value + $cModify[sSlot &/ Key] = True + $bModify = True + 'Save() + Endif + +End + + +Public Sub Clear(Optional ParentKey As String, Recursive As Boolean) + + Dim sSlot As String + Dim hSlot As Collection + Dim vVal As Variant + Dim sRemove As String + + If Not ParentKey Then + If $cSlot.Count Then + $cSlot.Clear + $bModify = True + $bModifyAll = True + Endif + Return + Endif + + sSlot = GetSlot(ParentKey &/ "g") + + If Not Recursive Then + hSlot = $cSlot[sSlot] + If hSlot Then + sRemove = sSlot + GoSub REMOVE_SLOT + Endif + Else + + For Each hSlot In $cSlot + sRemove = $cSlot.Key + If sRemove = sSlot Or If sRemove Begins sSlot & "/" Then + GoSub REMOVE_SLOT + Endif + Next + Endif + + Return + +REMOVE_SLOT: + + For Each vVal In hSlot + $cModify[sRemove &/ hSlot.Key] = True + Next + $cSlot.Remove(sRemove) + $bModify = True + Return + +End + +Private Sub ReadWindow(hWindow As Window, sKey As String) + + Dim aPos As Integer[] + Dim X, Y, W, H, S As Integer + ' Dim D As Integer + ' Dim hObserver As Observer + + aPos = Me[sKey &/ "Geometry"] + + If Not aPos Or If aPos.Count < 2 Then + Return + Else + X = aPos[0] + Y = aPos[1] + If aPos.Count > 2 Then + W = aPos[2] + H = aPos[3] + If aPos.Count > 4 Then + S = aPos[4] + If S >= Screens.Count Then S = 0 + Endif + Else + W = hWindow.W + H = hWindow.H + Endif + Endif + + X += Screens[S].AvailableX + Y += Screens[S].AvailableY + + ' If Not hWindow.Parent And If Component.IsLoaded("gb.desktop") Then + ' D = -1 + ' Try D = aPos[5] + ' If D >= 0 Then + ' hObserver = New Observer(hWindow, True) As "Window" + ' hObserver.Tag = D + ' $cObserver[hWindow.Id] = hObserver + ' Endif + ' Endif + + ' If Object.Type(hWindow) = "FHelpBrowser" Then + ' Print "ReadWindow: "; X;; Y; " / "; S;; Screens[S].AvailableX;; Screens[S].AvailableY + ' Endif + + If hWindow.Resizable Then + W = Max(32, W) + H = Max(32, H) + If hWindow.Modal Then + hWindow.Resize(W, H) + hWindow.Center + Else + hWindow.Move(X, Y, W, H) + Endif + Else + If Not hWindow.Modal Then hWindow.Move(X, Y) + Endif + +End + +Private Sub WriteWindow(hWindow As Window, sKey As String) + + Dim X, Y, W, H, S As Integer + 'Dim D As Integer + Dim aVal As Integer[] + + X = hWindow.X + Y = hWindow.Y + W = hWindow.Width + H = hWindow.Height + + If hWindow.TopLevel Then + + S = hWindow.Screen + + If S >= 0 Then + X -= Screens[S].AvailableX + Y -= Screens[S].AvailableY + Else + S = 0 + Endif + + Endif + + aVal = [X, Y, W, H, S] + + ' If Not hWindow.Parent And If Component.IsLoaded("gb.desktop") Then + ' hDesktopWin = New DesktopWindow(hWindow.Id) + ' D = -1 + ' Try D = hDesktopWin.Desktop + ' If Error Then Debug Error.Text + ' Debug hWindow.Name;; "Desktop:";; D + ' If D >= 0 Then aVal.Add(D) + ' Endif + + Me[sKey &/ "Geometry"] = aVal + +End + +Private Sub GetTopLevel(hCtrl As Object) As String + + Return Object.Type(hCtrl.Window) + +End + +Public Sub Read(hObject As Object, Optional sKey As String, Optional vDefault As Variant) + + If Object.Is(hObject, "Window") Then + If Not sKey Then sKey = Object.Type(hObject) + ReadWindow(hObject, sKey) + Else + If Not sKey Then + Try sKey = GetTopLevel(hObject) &/ hObject.Name + Else If Left(sKey) <> "/" Then + Try sKey = GetTopLevel(hObject) &/ sKey + Endif + Try hObject.Settings = Me[sKey, vDefault] + Endif + +End + +Public Sub Write(hObject As Object, Optional sKey As String) + + If Object.Is(hObject, "Window") Then + If Not sKey Then sKey = Object.Type(hObject) + WriteWindow(hObject, sKey) + Else + If Not sKey Then + Try sKey = GetTopLevel(hObject) &/ hObject.Name + Else If Left(sKey) <> "/" Then + Try sKey = GetTopLevel(hObject) &/ sKey + Endif + Try Me[sKey] = hObject.Settings + Endif + +End + +Private Function Path_Read() As String + + Return $sPath + +End + +' Static Public Function Array(...) As String[] +' +' Dim aVal As New String[] +' Dim iInd As Integer +' Dim sVal As String +' Dim vVal As Variant +' +' For iInd = 0 To Param.Max +' vVal = Param[iInd] +' If IsBoolean(vVal) Then +' sVal = IIf(vVal, "1", "0") +' Else +' sVal = CStr(vVal) +' Endif +' aVal.Add(sVal) +' Next +' +' Return aVal +' +' End + +' STATIC PUBLIC FUNCTION FromString(Value AS String) AS String[] +' +' DIM aRet AS NEW String[] +' DIM iInd AS Integer +' +' aRet = Split(Value, ",", "\"") +' FOR iInd = 0 TO aRet.Max +' aRet[iInd] = Replace(aRet[iInd], "\"\"", "\"") +' NEXT +' +' RETURN aRet +' +' END +' + +Public Sub Reload() + + Load + +End + +Private Function Keys_Read() As _Settings_Keys + + _Settings_Keys._Slot = $cSlot + _Settings_Keys._Parent = "" + Return _Settings_Keys + +End + +Static Private Function DefaultDir_Read() As String + + Dim sPath As String = Application.Env["XDG_CONFIG_HOME"] + If Not sPath Then sPath = System.User.Home &/ ".config" + Return sPath &/ "gambas" & System.Version + +End + +Static Private Sub WriteValue(vVal As Variant) + + Dim sStr As String + Dim iPos As Integer + Dim aArray As Array + Dim cCol As Collection + + Select Case TypeOf(vVal) + + Case gb.Null + $sStr &= "Null" + + Case gb.Boolean + If vVal Then + $sStr &= "True" + Else + $sStr &= "False" + Endif + + Case gb.Byte, gb.Short, gb.Integer, gb.Long + $sStr &= CStr(vVal) + + Case gb.Float + sStr = CStr(vVal) + If InStr(sStr, ".") = 0 And If InStr(sStr, "E", 1, gb.IgnoreCase) = 0 Then sStr &= ".0" + $sStr &= sStr + + Case gb.Date + $sStr &= Chr$(34) & CStr(vVal) & Chr$(34) + + Case gb.String + sStr = Quote(vVal) + Do + iPos = InStr(sStr, "\\", iPos + 1) + If iPos = 0 Then Break + If Mid$(sStr, iPos + 1, 1) = "x" Then + Mid$(sStr, iPos, 4) = "\\u00" & Mid$(sStr, iPos + 1, 2) + Else + Inc iPos + Endif + Loop + $sStr &= sStr + + Case Else + If vVal Is Array Then + aArray = vVal + $sStr &= "[" + For iPos = 0 To vVal.Max + If iPos Then $sStr &= "," + WriteValue(vVal[iPos]) + Next + $sStr &= "]" + Else If vVal Is Collection Then + cCol = vVal + $sStr &= "{" + For Each vVal In cCol + If iPos Then $sStr &= "," + WriteValue(cCol.Key) + $sStr &= ": " + WriteValue(vVal) + Inc iPos + Next + $sStr &= "}" + Endif + + End Select + +End + +Static Public Sub ToString(Value As Variant) As String + + $sStr = "" + WriteValue(Value) + Return $sStr + +End + +Static Private Sub GetChar() As String + + Dim sCar As String + + If $iPos > Len($sStr) Then Return + sCar = Mid$($sStr, $iPos, 1) + Inc $iPos + Return sCar + +End + + +Static Private Sub ReadChar() As String + + Dim sCar As String + + Do + sCar = GetChar() + If Not sCar Then Return + If sCar > " " Then Return sCar + Loop + +End + + +Static Private Sub ReadToken() As String + + Dim sToken As String + Dim sCar As String + + sCar = ReadChar() + If Not IsLetter(sCar) Then Return sCar + + sToken = sCar + Do + sCar = GetChar() + If Not sCar Then Break + If Not IsLetter(sCar) Then + Dec $iPos + Break + Endif + sToken &= sCar + Loop + + Return sToken + +End + +Static Private Sub ReadString() As String + + Dim sCar As String + Dim sString As String + Dim iPos As Integer + + Do + sCar = GetChar() + If Not sCar Then Error.Raise("Non terminated string") + If sCar = Chr$(34) Then Return sString + If sCar = "\\" Then + sCar = GetChar() + If Not sCar Then Error.Raise("Non terminated string") + iPos = InStr("bfrtn", sCar) + If iPos Then + sCar = Mid$("\b\f\r\t\n", iPos, 1) + ' Else If sCar = "u" Then + ' Try sCar = String.Chr$(Val("&H" & Mid$($sStr, $iPos, 4))) + ' If Not Error Then $iPos += 4 + Else + ' Keep character + Endif + Endif + sString &= sCar + Loop + +End + +Static Private Sub ReadObject() As Collection + + Dim sCar As String + Dim cObject As New Collection + Dim sKey As String + + Do + sCar = ReadChar() + If sCar = "}" Then Return cObject + If sCar <> Chr$(34) Then Error.Raise("String expected") + sKey = ReadString() + sCar = ReadChar() + If sCar <> ":" Then Error.Raise("Colon expected") + cObject[sKey] = ReadValue() + sCar = ReadChar() + If sCar = "}" Then Return cObject + If sCar <> "," Then Error.Raise("Comma expected") + Loop + +End + +Static Private Sub ReadArray() As Array + + Dim sCar As String + Dim aArray As New Variant[] + Dim iInd As Integer + Dim iType As Integer + Dim aTypedArray As Object + + Do + sCar = ReadChar() + If sCar = "]" Then Break + Dec $iPos + aArray.Add(ReadValue()) + sCar = ReadChar() + If sCar = "]" Then Break + If sCar <> "," Then Error.Raise("Comma expected") + Loop + + If aArray.Count = 0 Then Return Null + iType = TypeOf(aArray[0]) + For iInd = 1 To aArray.Max + If TypeOf(aArray[iInd]) <> iType Then Return aArray + Next + + Select Case iType + Case gb.Boolean + aTypedArray = New Boolean[aArray.Count] + Case gb.Integer + aTypedArray = New Integer[aArray.Count] + Case gb.Float + aTypedArray = New Float[aArray.Count] + Case gb.String + aTypedArray = New String[aArray.Count] + Case gb.Object + aTypedArray = New Object[aArray.Count] + Default + aTypedArray = New Variant[aArray.Count] + End Select + + For iInd = 0 To aArray.Max + aTypedArray[iInd] = aArray[iInd] + Next + Return aTypedArray + +End + +Static Private Sub ReadNumber(sNumber As String) As Variant + + Dim sCar As String + Dim vNumber As Variant + Dim bFloat As Boolean + Dim iPos As Integer + + Do + sCar = GetChar() + If Not sCar Then Break + iPos = InStr(".eE-+0123456789", sCar) + If iPos = 0 Then + Dec $iPos + Break + Endif + If iPos <= 3 Then bFloat = True + sNumber &= sCar + Loop + + If bFloat Then + Try vNumber = CFloat(sNumber) + Else + Try vNumber = CInt(sNumber) + Endif + If IsNull(vNumber) Then Error.Raise("Incorrect number") + Return vNumber + +End + +' Static Private Sub ReadType() As Integer +' +' Dim sCar As String +' Dim iPos As Integer +' +' iPos = $iPos +' sCar = ReadToken() +' +' If sCar = "{" Then +' Return gb.Variant +' Else If sCar = "[" Then +' Return gb.Object +' Else If sCar = Chr$(34) Then +' Return gb.String +' Else If sCar = "-" Or If IsDigit(sCar) Then +' Return TypeOf(ReadNumber(sCar)) +' Else If sCar = "null" Then +' Return gb.Null +' Else If sCar == "true" Or If sCar == "false" Then +' Return gb.Boolean +' Else +' Error.Raise("Incorrect token: " & Quote(sCar)) +' Endif +' +' $iPos = iPos +' +' End + +Static Private Sub ReadValue(Optional bNotStrict As Boolean) As Variant + + Dim sCar As String + + sCar = ReadToken() + + If sCar = "{" Then + Return ReadObject() + Else If sCar = "[" Then + Return ReadArray() + Else If sCar = Chr$(34) Then + Return ReadString() + Else If sCar = "-" Or If IsDigit(sCar) Then + Return ReadNumber(sCar) + Else If sCar == "null" Then + Return Null + Else If sCar == "true" Then + Return True + Else If sCar == "false" Then + Return False + Else If bNotStrict Then + Return $sStr + Else + Error.Raise("Incorrect token: " & Quote(sCar)) + Endif + +End + + +Static Public Sub FromString(Value As String) As Variant + + Dim vVal As Variant + $sStr = Value + $iPos = 1 + vVal = ReadValue(True) + $sStr = "" + Return vVal + +End + +Private Function Count_Read() As Integer + + Dim cCol As Collection + Dim iCount As Integer + + For Each cCol In $cSlot + iCount += cCol.Count + Next + + Return iCount + +End diff --git a/comp/src/gb.settings/.src/_Settings_Keys.class b/comp/src/gb.settings/.src/_Settings_Keys.class new file mode 100644 index 00000000..96f1b197 --- /dev/null +++ b/comp/src/gb.settings/.src/_Settings_Keys.class @@ -0,0 +1,93 @@ +' Gambas class file + +Export +Create Static + +Property Read Count As Integer +Property Read All As String[] + +Public _Slot As Collection +Public _Parent As String + +Private $aKeys As String[] + +Public Sub _get(Parent As String) As _Settings_Keys + + Dim hKeys As _Settings_Keys + + hKeys = New _Settings_Keys + hKeys._Slot = _Slot + hKeys._Parent = _Parent &/ Parent + Return hKeys + +End + +Private Sub GetKeys() As Boolean + + Dim vVal As Variant + Dim cCol As Collection + + If _Parent Then + Try cCol = _Slot[_Parent] + Else + cCol = _Slot + Endif + If Not cCol Then Return True + + $aKeys = New String[] + For Each vVal In cCol + If Not _Parent And If vVal.Count = 0 Then Continue + $aKeys.Add(cCol.Key) + Next + $aKeys.Sort + + 'Debug $aKeys.Join() + +End + +Public Sub _next() As String + + Dim sKey As String + + If IsNull(Enum.Index) Then + If GetKeys() Then + Enum.Stop + Return + Endif + Enum.Index = 0 + Endif + + If Enum.Index >= $aKeys.Count Then + Enum.Stop + Else + sKey = $aKeys[Enum.Index] + Inc Enum.Index + Return sKey + Endif + +End + +Public Sub Exist(Key As String) As Boolean + + If Not $aKeys Then GetKeys() + If $aKeys Then Return $aKeys.Exist(Key) + +End + +Private Function Count_Read() As Integer + + If Not $aKeys Then GetKeys() + If $aKeys Then Return $aKeys.Count + +End + +Private Function All_Read() As String[] + + If Not $aKeys Then GetKeys() + If $aKeys Then + Return $aKeys.Copy() + Else + Return New String[] + Endif + +End diff --git a/comp/src/gb.term.form/.component b/comp/src/gb.term.form/.component new file mode 100644 index 00000000..400b4642 --- /dev/null +++ b/comp/src/gb.term.form/.component @@ -0,0 +1,7 @@ +[Component] +Key=gb.term.form +Version=3.14.90 +State=2 +Authors=Fabien Bodard (gambas.fr@gmail.com) +Needs=ImageIO +Requires=gb.term diff --git a/comp/src/gb.term.form/.directory b/comp/src/gb.term.form/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/comp/src/gb.term.form/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/comp/src/gb.term.form/.hidden/CHANGELOG b/comp/src/gb.term.form/.hidden/CHANGELOG new file mode 100644 index 00000000..af8761e0 --- /dev/null +++ b/comp/src/gb.term.form/.hidden/CHANGELOG @@ -0,0 +1,4 @@ +[GB.TERM.FORM] +* OPT: Make the object placement more logical. the 0,0 pos now + is the left corner after the border. + diff --git a/comp/src/gb.term.form/.hidden/control/termbutton.png b/comp/src/gb.term.form/.hidden/control/termbutton.png new file mode 120000 index 00000000..23d989b3 --- /dev/null +++ b/comp/src/gb.term.form/.hidden/control/termbutton.png @@ -0,0 +1 @@ +../../../../../app/src/gambas3/img/control/button.png \ No newline at end of file diff --git a/comp/src/gb.term.form/.hidden/control/termcheckbox.png b/comp/src/gb.term.form/.hidden/control/termcheckbox.png new file mode 120000 index 00000000..b8fe6fbd --- /dev/null +++ b/comp/src/gb.term.form/.hidden/control/termcheckbox.png @@ -0,0 +1 @@ +../../../../../app/src/gambas3/img/control/checkbox.png \ No newline at end of file diff --git a/comp/src/gb.term.form/.hidden/control/termframe.png b/comp/src/gb.term.form/.hidden/control/termframe.png new file mode 120000 index 00000000..0f21ed63 --- /dev/null +++ b/comp/src/gb.term.form/.hidden/control/termframe.png @@ -0,0 +1 @@ +../../../../../app/src/gambas3/img/control/frame.png \ No newline at end of file diff --git a/comp/src/gb.term.form/.hidden/control/termhbox.png b/comp/src/gb.term.form/.hidden/control/termhbox.png new file mode 120000 index 00000000..891ef5b1 --- /dev/null +++ b/comp/src/gb.term.form/.hidden/control/termhbox.png @@ -0,0 +1 @@ +../../../../../app/src/gambas3/img/control/hbox.png \ No newline at end of file diff --git a/comp/src/gb.term.form/.hidden/control/termlabel.png b/comp/src/gb.term.form/.hidden/control/termlabel.png new file mode 120000 index 00000000..4f2f9803 --- /dev/null +++ b/comp/src/gb.term.form/.hidden/control/termlabel.png @@ -0,0 +1 @@ +../../../../../app/src/gambas3/img/control/label.png \ No newline at end of file diff --git a/comp/src/gb.term.form/.hidden/control/termlistbox.png b/comp/src/gb.term.form/.hidden/control/termlistbox.png new file mode 120000 index 00000000..3b461414 --- /dev/null +++ b/comp/src/gb.term.form/.hidden/control/termlistbox.png @@ -0,0 +1 @@ +../../../../../app/src/gambas3/img/control/listbox.png \ No newline at end of file diff --git a/comp/src/gb.term.form/.hidden/control/termpanel.png b/comp/src/gb.term.form/.hidden/control/termpanel.png new file mode 120000 index 00000000..9c8883d4 --- /dev/null +++ b/comp/src/gb.term.form/.hidden/control/termpanel.png @@ -0,0 +1 @@ +../../../../../app/src/gambas3/img/control/panel.png \ No newline at end of file diff --git a/comp/src/gb.term.form/.hidden/control/termpicturebox.png b/comp/src/gb.term.form/.hidden/control/termpicturebox.png new file mode 120000 index 00000000..10a12fe3 --- /dev/null +++ b/comp/src/gb.term.form/.hidden/control/termpicturebox.png @@ -0,0 +1 @@ +../../../../../app/src/gambas3/img/control/picturebox.png \ No newline at end of file diff --git a/comp/src/gb.term.form/.hidden/control/termradiobutton.png b/comp/src/gb.term.form/.hidden/control/termradiobutton.png new file mode 120000 index 00000000..8a6735e3 --- /dev/null +++ b/comp/src/gb.term.form/.hidden/control/termradiobutton.png @@ -0,0 +1 @@ +../../../../../app/src/gambas3/img/control/radiobutton.png \ No newline at end of file diff --git a/comp/src/gb.term.form/.hidden/control/termscrollbar.png b/comp/src/gb.term.form/.hidden/control/termscrollbar.png new file mode 120000 index 00000000..d3308d96 --- /dev/null +++ b/comp/src/gb.term.form/.hidden/control/termscrollbar.png @@ -0,0 +1 @@ +../../../../../app/src/gambas3/img/control/scrollbar.png \ No newline at end of file diff --git a/comp/src/gb.term.form/.hidden/control/termtextbox.png b/comp/src/gb.term.form/.hidden/control/termtextbox.png new file mode 120000 index 00000000..276853b4 --- /dev/null +++ b/comp/src/gb.term.form/.hidden/control/termtextbox.png @@ -0,0 +1 @@ +../../../../../app/src/gambas3/img/control/textbox.png \ No newline at end of file diff --git a/comp/src/gb.term.form/.hidden/control/termvbox.png b/comp/src/gb.term.form/.hidden/control/termvbox.png new file mode 120000 index 00000000..50d7662d --- /dev/null +++ b/comp/src/gb.term.form/.hidden/control/termvbox.png @@ -0,0 +1 @@ +../../../../../app/src/gambas3/img/control/vbox.png \ No newline at end of file diff --git a/comp/src/gb.term.form/.icon.png b/comp/src/gb.term.form/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c2590670d66e2ab608c86882fcf70658f55c919f GIT binary patch literal 10932 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 literal 0 HcmV?d00001 diff --git a/comp/src/gb.term.form/.lang/it.po b/comp/src/gb.term.form/.lang/it.po new file mode 100644 index 00000000..2d30cc47 --- /dev/null +++ b/comp/src/gb.term.form/.lang/it.po @@ -0,0 +1,15 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.term.form 3.13.90\n" +"PO-Revision-Date: 2019-07-03 17:04 UTC\n" +"Last-Translator: gian \n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:2 +msgid "This components allows to dialog with a VT102 terminal.\n\nIt provides a way to use common visual objects like windows, standard controls like labels, checkboxes, lists and so on... as in graphical mode.\n\nIt will also provide a standalone class with common VT100 commands to be used by more simple applications." +msgstr "Questo componente consente di dialogare con un terminale VT102.\n\nConsente di utilizzare oggetti visivi comuni come finestre, controlli standard come etichette, checkbox, liste e così via... come in modalità grafica.\n\nFornisce anche una classe standalone con comandi comuni VT100 da utilizzare con applicazioni più semplici." + diff --git a/comp/src/gb.term.form/.lang/nl.po b/comp/src/gb.term.form/.lang/nl.po new file mode 100644 index 00000000..f4642445 --- /dev/null +++ b/comp/src/gb.term.form/.lang/nl.po @@ -0,0 +1,15 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.term.form 3.13.0\n" +"PO-Revision-Date: 2019-05-18 13:57 UTC\n" +"Last-Translator: gbWilly \n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:2 +msgid "This components allows to dialog with a VT102 terminal.\n\nIt provides a way to use common visual objects like windows, standard controls like labels, checkboxes, lists and so on... as in graphical mode.\n\nIt will also provide a standalone class with common VT100 commands to be used by more simple applications." +msgstr "Dit component staat de dialoog toe met een VT102 terminal.\n\nHet voorziet in een manier om gebruikelijke visuele objecten zoals vensters, standaart controls zoals labels,checkboxen, en zo verder te gebruiken...zoals in grafische modus.\n\nHet voorziet ook in een alleenstaande klasse met gebruikelijke VT100 commando's voor gebruik in eenvoudigere applicaties." + diff --git a/comp/src/gb.term.form/.lang/ru.po b/comp/src/gb.term.form/.lang/ru.po new file mode 100644 index 00000000..9e4c6635 --- /dev/null +++ b/comp/src/gb.term.form/.lang/ru.po @@ -0,0 +1,40 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: comp/src/gb.term.form/.project:19 +msgid "" +"This components allows to dialog with a VT102 terminal.\n" +"\n" +"It provides a way to use common visual objects like windows, standard controls like labels, checkboxes, lists and so on... as in graphical mode.\n" +"\n" +"It will also provide a standalone class with common VT100 commands to be used by more simple applications." +msgstr "" +"Этот компонент позволяет вести диалог с терминалом VT102.\n" +"\n" +"Он позволяет использовать общие визуальные объекты, такие как окна, стандартные элементы управления, такие как метки, чекбоксы (флажки), списки и т. д. как в графическом режиме.\n" +"\n" +"Он также предоставляет отдельный класс с общими командами VT100, которые будут использоваться более простыми приложениями." + diff --git a/comp/src/gb.term.form/.project b/comp/src/gb.term.form/.project new file mode 100644 index 00000000..3b487572 --- /dev/null +++ b/comp/src/gb.term.form/.project @@ -0,0 +1,17 @@ +# Gambas Project File 3.0 +Startup=Termform1 +UseTerminal=1 +RedirectStderr=1 +Version=3.14.90 +VersionFile=1 +Component=gb.image +Component=gb.image.io +Component=gb.term +Description="This components allows to dialog with a VT102 terminal.\n\nIt provides a way to use common visual objects like windows, standard controls like labels, checkboxes, lists and so on... as in graphical mode.\n\nIt will also provide a standalone class with common VT100 commands to be used by more simple applications." +Authors="Fabien Bodard (gambas.fr@gmail.com)" +TabSize=2 +Translate=1 +Language=en_US +Type=Component +Packager=1 +DoNotTranslate=".src/Test" diff --git a/comp/src/gb.term.form/.src/Align.class b/comp/src/gb.term.form/.src/Align.class new file mode 100644 index 00000000..93d652dc --- /dev/null +++ b/comp/src/gb.term.form/.src/Align.class @@ -0,0 +1,8 @@ +' Gambas class file + +Export + +Public Enum + Normal = &H00, {Left} = &H01, {Right} = &H02, Center = &H03, + TopNormal = &H10, TopLeft = &H11, TopRight = &H12, Top = &H13, + BottomNormal = &H20, BottomLeft = &H21, BottomRight = &H22, Bottom = &H23 diff --git a/comp/src/gb.term.form/.src/Arrange.class b/comp/src/gb.term.form/.src/Arrange.class new file mode 100644 index 00000000..26c19ea6 --- /dev/null +++ b/comp/src/gb.term.form/.src/Arrange.class @@ -0,0 +1,4 @@ +' Gambas class file + +Export +Public Enum None, Vertical, Horizontal, Column, Row, Fill diff --git a/comp/src/gb.term.form/.src/Attr.class b/comp/src/gb.term.form/.src/Attr.class new file mode 100644 index 00000000..c4b9af23 --- /dev/null +++ b/comp/src/gb.term.form/.src/Attr.class @@ -0,0 +1,341 @@ +' Gambas class file + +Private Const CSI As String = "\e[" +Property Read Modified As Boolean + +Property ColorMode As Integer +Property Foreground As Integer +Property Background As Integer +Property Bold As Boolean +Property Dim As Boolean +Property Underline As Boolean +Property Reverse As Boolean +Property Blink As Boolean +Private Enum FLAG_BG, FLAG_FG, FLAG_BOLD, FLAG_DIM, FLAG_REV, FLAG_UND, FLAG_BLK +'Private Enum FLAG_BOLD, FLAG_DIM, FLAG_UND, FLAG_REV, FLAG_BLK, FLAG_FG, FLAG_BG + +Private $aModified As New Boolean[8] +Private $aValues As New Boolean[5] + +Private $iColorMode As Integer = TermColor.Default +Private $iForeground As Integer +Private $iBackGround As Integer +Private $bBold As Boolean +Private $bDim As Boolean +Private $bReverse As Boolean +Private $bUnderline As Boolean +Private $bBlink As Boolean + +Public Sub _new() + + $iForeground = TermColor.Black + $iBackGround = TermColor.White + +End + +Private Function Modified_Read() As Boolean + + Dim b As Boolean + + For Each b In $aModified + If b Then Return True + Next + +End + +Private Function Foreground_Read() As Integer + + Return $iForeground + +End + +Private Sub Foreground_Write(Value As Integer) + + If $iForeground <> Value Then $aModified[FLAG_FG] = True + $iForeground = Value + +End + +Private Function Background_Read() As Integer + + Return $iBackGround + +End + +Private Sub Background_Write(Value As Integer) + + If $iBackGround <> Value Then $aModified[FLAG_BG] = True + $iBackGround = Value + +End + +Private Function Bold_Read() As Boolean + + Return $bBold + +End + +Private Sub Bold_Write(Value As Boolean) + + If $bBold <> Value Then + $aModified[FLAG_BOLD] = True + Endif + $bBold = Value + +End + +Private Function Dim_Read() As Boolean + + Return $bDim + +End + +Private Sub Dim_Write(Value As Boolean) + + If $bDim <> Value Then $aModified[FLAG_DIM] = True + $bDim = Value + +End + +Private Function Underline_Read() As Boolean + + Return $bUnderline + +End + +Private Sub Underline_Write(Value As Boolean) + + If $bUnderline <> Value Then $aModified[FLAG_UND] = True + $bUnderline = Value + +End + +Private Function Reverse_Read() As Boolean + + Return $bReverse + +End + +Private Sub Reverse_Write(Value As Boolean) + + If $bReverse <> Value Then $aModified[FLAG_REV] = True + $bReverse = Value + +End + +Private Function Blink_Read() As Boolean + + Return $bBlink + +End + +Private Sub Blink_Write(Value As Boolean) + + If $bBlink <> Value Then $aModified[FLAG_BLK] = True + $bBlink = Value + +End + +Private Function ColorMode_Read() As Integer + + Return $iColorMode + +End + +Private Sub ColorMode_Write(Value As Integer) + + $iColorMode = Value + '$bModified = True + +End + +Public Sub Send() + + Print Me._GetString(); + +End + +Public Function _GetString(Optional Force As Boolean) As String + + Dim sValue As String + + If $aModified[FLAG_BOLD] Then sValue &= IIf($bBold, "1;", "22;") + If $aModified[FLAG_DIM] Then sValue &= IIf($bDim, "8;", "28;") + If $aModified[FLAG_BLK] Then sValue &= IIf($bBlink, "5;", "25;") + If $aModified[FLAG_UND] Then sValue &= IIf($bUnderline, "4;", "24;") + If $aModified[FLAG_REV] Then sValue &= IIf($bReverse, "7;", "27;") + + If $aModified[FLAG_FG] Or Force Then + Select Case $iColorMode + Case TermColor.Default + sValue &= (30 + Max(Min($iForeground, 8), 0)) & ";" + Case TermColor.Mode256 + sValue &= "38;5;" & Max(Min($iForeground, 255), 0) & ";" + Case TermColor.ModeRGB + sValue &= "38;2;" & Subst("&1;&2;&3;", GetRed($iForeGround), GetGreen($iForeground), GetBlue($iForeground)) + End Select + Endif + + If $aModified[FLAG_BG] Or Force Then + Select Case $iColorMode + Case TermColor.Default + sValue &= (40 + Max(Min($iBackGround, 8), 0)) & ";" + Case TermColor.Mode256 + sValue &= "48;5;" & Max(Min($iBackGround, 255), 0) & ";" + Case TermColor.ModeRGB + sValue &= "48;2;" & Subst("&1;&2;&3;", GetRed($iBackGround), GetGreen($iBackGround), GetBlue($iBackGround)) + End Select + Endif + + If Not sValue Then Return + + If sValue Ends ";" Then sValue = Left(sValue, -1) + + sValue = CSI & sValue & "m" + + $aModified = New Boolean[8] + 'Debug sValue + Return sValue + +End + +Public Function WriteToStream(hStream As Stream) + + Dim bFirst As Boolean + Dim iFlag As Integer + + For iFlag = 0 To 6 + If $aModified[iFlag] Then + If Not bFirst Then + Write #hStream, CSI + bFirst = True + Else + Write #hStream, ";" + Endif + + Select Case iFlag + Case FLAG_BOLD + Write #hStream, IIf($bBold, "1", "22") + Case FLAG_DIM + Write #hStream, IIf($bDim, "8", "28") + Case FLAG_BLK + Write #hStream, IIf($bBlink, "5", "25") + Case FLAG_UND + Write #hStream, IIf($bUnderline, "4", "24") + Case FLAG_REV + Write #hStream, IIf($bReverse, "7", "27") + + Case FLAG_FG + Select Case $iColorMode + Case TermColor.Default + Write #hStream, Str((30 + Max(Min($iForeground, 8), 0))) + Case TermColor.Mode256 + Write #hStream, ("38;5;" & Max(Min($iForeground, 255), 0)) + Case TermColor.ModeRGB + Write #hStream, ("38;2;" & Subst("&1;&2;&3", GetRed($iForeGround), GetGreen($iForeground), GetBlue($iForeground))) + End Select + + Case FLAG_BG + Select Case $iColorMode + Case TermColor.Default + Write #hStream, Str((40 + Max(Min($iBackGround, 8), 0))) + + Case TermColor.Mode256 + Write #hStream, ("48;5;" & Max(Min($iBackGround, 255), 0)) + + Case TermColor.ModeRGB + Write #hStream, ("48;2;" & Subst("&1;&2;&3", GetRed($iBackGround), GetGreen($iBackGround), GetBlue($iBackGround))) + + End Select + End Select + + Endif + + Next + If bFirst Then + Write #hStream, "m" + Endif + + $aModified = New Boolean[8] + +End + +Private Function GetRed(iValue As Integer) As Integer + + Return Lsr(iValue, 16) And 255 + +End + +Private Function GetGreen(iValue As Integer) As Integer + + Return Lsr(iValue, 8) And 255 + +End + +Private Function GetBlue(iValue As Integer) As Integer + + Return iValue And 255 + +End + +Public Sub FillFrom(iAttr As Integer) + + If BTst(iAttr, FLAG_BG) Then + Me.Background = Lsr(iAttr, 16) And 255 + Else + Me.Background = 0 + Endif + + If BTst(iAttr, FLAG_FG) Then + Me.Foreground = Lsr(iAttr, 24) And 255 + Else + Me.Foreground = 0 + Endif + + Me.Bold = BTst(iAttr, FLAG_BOLD) + Me.Dim = BTst(iAttr, FLAG_DIM) + Me.Reverse = BTst(iAttr, FLAG_REV) + Me.Underline = BTst(iAttr, FLAG_UND) + Me.Blink = BTst(iAttr, FLAG_BLK) + +End + +Public Sub Reset() + + $iForeground = -1 + $iBackGround = -1 + $bBold = False + $bDim = False + $bUnderline = False + $bReverse = False + $bBlink = False + $aModified = New Boolean[8] + Print CSI & "0m"; + +End + +Public Sub IsVoid() As Boolean + + If $iForeground >= 0 Then Return + If $iBackground >= 0 Then Return + If $bBold Or If $bDim Or If $bUnderline Or If $bReverse Or If $bBlink Then Return + Return True + +End + +Public Function GetInteger() As Integer + + Dim iAttr As Integer + + If Me.Background <> -1 Then iAttr = BSet(iAttr, FLAG_BG) + Lsl(Me.Background And 255, 16) + If Me.Foreground <> -1 Then iAttr = BSet(iAttr, FLAG_FG) + Lsl(Me.Foreground And 255, 24) + + If Me.Bold Then iAttr = BSet(iAttr, FLAG_BOLD) + If Me.Dim Then iAttr = BSet(iAttr, FLAG_DIM) + If Me.Reverse Then iAttr = BSet(iAttr, FLAG_REV) + If Me.Underline Then iAttr = BSet(iAttr, FLAG_UND) + If Me.Blink Then iAttr = BSet(iAttr, FLAG_BLK) + + Return iAttr + +End diff --git a/comp/src/gb.term.form/.src/Border.class b/comp/src/gb.term.form/.src/Border.class new file mode 100644 index 00000000..4e7c413f --- /dev/null +++ b/comp/src/gb.term.form/.src/Border.class @@ -0,0 +1,4 @@ +' Gambas class file + +Export +Public Enum None, Simple, Double \ No newline at end of file diff --git a/comp/src/gb.term.form/.src/Char.class b/comp/src/gb.term.form/.src/Char.class new file mode 100644 index 00000000..e6c22f72 --- /dev/null +++ b/comp/src/gb.term.form/.src/Char.class @@ -0,0 +1,14 @@ +' Gambas class file + +Export +Public c As Integer +Public Attr As Integer + +Static Public Sub _call(ch As String, iAttr As Integer) As Char + + Dim hChar As New Char + hChar.c = String.Code(ch) + hChar.Attr = iAttr + Return hChar + +End diff --git a/comp/src/gb.term.form/.src/Desktop.class b/comp/src/gb.term.form/.src/Desktop.class new file mode 100644 index 00000000..e7be161b --- /dev/null +++ b/comp/src/gb.term.form/.src/Desktop.class @@ -0,0 +1,45 @@ +' Gambas class file + +Export +Create Static +Property Read Width, W As Integer +Property Read Height, H As Integer +Property Background As Char + +Static Private $hChar As New Char + +Static Public Sub _init() + + Dim hAttr As New Attr + 'hAttr.ColorMode = TermColor.Mode256 + hAttr.Background = TermColor.Desktop + $hChar.Attr = hAttr.GetInteger() + $hChar.c = Asc(" ") + +End + + + +Private Function Width_Read() As Integer + + Return File.Out.Term.Width + +End + +Private Function Height_Read() As Integer + + Return File.Out.Term.Height + +End + +Private Function Background_Read() As Char + + Return $hChar + +End + +Private Function Background_Write(Value As Char) + + $hChar = Value + +End diff --git a/comp/src/gb.term.form/.src/Dialog/Message.class b/comp/src/gb.term.form/.src/Dialog/Message.class new file mode 100644 index 00000000..a5a40b54 --- /dev/null +++ b/comp/src/gb.term.form/.src/Dialog/Message.class @@ -0,0 +1,42 @@ +' Gambas class file + +Create Private + + +Static Public Sub _call(Message As String) + + Dim hLabel As TermLabel + Dim hHbox As TermHBox + Dim hButton As TermButton + Dim $hForm As TermForm + $hForm = New TermForm + $hForm.Resizable = False + hLabel = New TermLabel($hForm) + hHbox = New TermHBox($hForm) + hButton = New TermButton(hHbox) As "btnOk" + + $hForm.resize(30, 5) + $hForm.Center + $hForm.Text = "Message Box" + $hForm._Arrangement = Arrange.Vertical + hHbox._Arrangement = Arrange.Horizontal + hHbox.Invert = True + hLabel.Expand = True + $hForm.Border = Border.Simple + hLabel.Text = Message + hButton.Text = "Ok" + 'hButton._Shadow = True + hButton.Background = TermColor.Yellow + hButton.Alignment = Align.Center + $hForm.Show + +End + + +Static Public Sub btnOk_MouseUp() + + Last.window.Close + +End + + diff --git a/comp/src/gb.term.form/.src/Key.class b/comp/src/gb.term.form/.src/Key.class new file mode 100644 index 00000000..51476d70 --- /dev/null +++ b/comp/src/gb.term.form/.src/Key.class @@ -0,0 +1,65 @@ +' Gambas class file + +Export +Public Enum Normal, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, BackSpace, Enter, {Return}, Tab, BackTab, Up, Down, Left, Right, Home, {End}, Insert, Delete, PageDown, PageUp, Menu +Static Property Read Shift As Boolean +Static Property Read Control As Boolean +Static Property Read Code As Integer +Static Property Read Text As String +Static Property Read Alt As Boolean +Static Private $bControl As Boolean +Static Private $bShift As Boolean +Static Private $bAlt As Boolean +Static Private $iCode As Integer +Static Private $sText As String + +Static Public Sub _SetKey(sKey As String, code As Integer, Alt As Boolean, Control As Boolean, Shift As Boolean) + + $bShift = Shift + $bControl = Control + $bALt = ALt + $iCode = Code + $sText = sKey + If TermWindows.Debug = TermWindows.DebugInput Then Error "Alt: " & alt & " Control: " & Control & " Shift: " & Shift & " Code :" & code & " Text :" & sKey + +End + +Static Private Function Shift_Read() As Boolean + + Return $bShift + +End + +Static Private Function Control_Read() As Boolean + + Return $bControl + +End + +Static Private Function Code_Read() As Integer + + Return $iCode + +End + +Static Private Function Text_Read() As String + + Return $sText + +End + +Static Private Function Alt_Read() As Boolean + + Return $bAlt + +End + +Static Public Sub _Reset() + + $bShift = False + $bControl = False + $bALt = False + $iCode = 0 + $sText = "" + +End diff --git a/comp/src/gb.term.form/.src/Mouse.class b/comp/src/gb.term.form/.src/Mouse.class new file mode 100644 index 00000000..bb5e4920 --- /dev/null +++ b/comp/src/gb.term.form/.src/Mouse.class @@ -0,0 +1,102 @@ +' Gambas class file + +Create Private + +Static Property Read {Left} As Boolean +Static Property Read {Right} As Boolean +Static Property Read {Middle} As Boolean +Static Property Read X, Col As Integer +Static Property Read Y, Row As Integer +Static Property Read ScreenX, ScreenCol As Integer +Static Property Read ScreenY, ScreenRow As Integer + +Static Private $iRow As Integer +Static Private $iCol As Integer +Static Private $iScreenRow As Integer +Static Private $iScreenCol As Integer +Static Private $bLeft As Boolean +Static Private $bMiddle As Boolean +Static Private $bRight As Boolean +Static Private $iDelta As Integer + +Static Private Function Left_Read() As Boolean + + Return $bLeft + +End + +Static Private Function Right_Read() As Boolean + + Return $bRight + +End + +Static Private Function Middle_Read() As Boolean + + Return $bMiddle + +End + +Static Public Sub Hide() + + + +End + +Static Public Sub Show() + + + +End + + +Static Public Sub _SetState(hControl As TermControl, Col As Integer, Row As Integer, Optional btnLeft As Boolean, btnMiddle As Boolean, btnRight As Boolean, Delta As Integer) + + If Not IsMissing(btnLeft) Then $bLeft = btnLeft + If Not IsMissing(btnMiddle) Then $bMiddle = btnMiddle + If Not IsMissing(btnRight) Then $bRight = btnRight + $iDelta = Delta + $iScreenRow = Row + $iScreenCol = Col + If hControl = Null Then + $iRow = $iScreenRow + $iCol = $iScreenCol + Else + $irow = $iScreenRow - hControl.ScreenY + $iCol = $iScreenCol - hControl.ScreenX + Endif + + + + + If TermWindows.Debug = TermWindows.DebugInput Then Error "Mouse State: Row: " & $iRow & " Col: " & $iCol & " btnLeft: " & $bLeft & " btnMiddle: " & $bMiddle & " btnRight: " & $bRight & " Delta: " & $iDelta +End + + + +Static Private Function X_Read() As Integer + + Return $iCol + +End + +Static Private Function Y_Read() As Integer + + Return $iRow + +End + +Static Private Function ScreenX_Read() As Integer + + Return $iScreenCol + +End + + + +Static Private Function ScreenY_Read() As Integer + + Return $iScreenRow + +End + diff --git a/comp/src/gb.term.form/.src/TermButton.class b/comp/src/gb.term.form/.src/TermButton.class new file mode 100644 index 00000000..be3e3016 --- /dev/null +++ b/comp/src/gb.term.form/.src/TermButton.class @@ -0,0 +1,150 @@ +' Gambas class file + +Export +Inherits TermControl + +Class Rect + +Public Const _Properties As String = "*,Text,Shadow" +Public Const _DrawWith As String = "Button" + +Property Text As String +Property Shadow As Boolean +Property Alignment As Integer +Property Read _DefaultBackground As Integer +Property Read _DefaultForeGround As Integer +Private $sText As String +Private $iOldLen As Integer +Private $iAlignment As Integer + + +Public Sub _new() + + Me._UseFocus = True + +End + + + +Private Function Text_Read() As String + + Return $sText + +End + +Private Sub Text_Write(Value As String) + + $sText = Value + + +End + +Public Sub _Render() + Dim hAttr As New Attr + Dim iAttr As Integer + Dim i As Integer + Dim sALign As String + Dim hRectC As Rect = Me._GetClientRect() + If Not Me._NeedRender Then Return + Super._Render + + Select Case $iAlignment + Case Align.Right + sALign = String(hRectC.Width - Len($sText), " ") & $sText + Case Align.Center + sALign = String(CInt(Ceil((hRectC.Width - Len($sText)) / 2)), " ") & $sText + Case Else + sALign = $sText + End Select + If Not Me.HaveFocus Then + hAttr.Background = Me._GetBackGround() + hAttr.Foreground = Me._GetForeground() + Else + hAttr.Background = TermColor.Focus + hAttr.Foreground = TermColor.FocusText + Endif + iAttr = hAttr.GetInteger() + + For i = 1 To Me._Content[0].count + If Me._Content[0][Me._Content[0].Max] And If i > Max($iOldLen, String.Len(sALign)) Then Break + If i <= String.Len(sALign) Then + Me._Content[0][i - 1] = Char(Mid(sALign, i, 1), iAttr) + Else + Me._Content[0][i - 1] = Char(" ", iAttr) + Endif + Next + + Me._NeedRender = False +End + + + + +Private Function Shadow_Read() As Boolean + + Return Super._Shadow + +End + +Private Sub Shadow_Write(Value As Boolean) + + Super._Shadow = Value + +End + +Private Function Alignment_Read() As Integer + + Return $iAlignment + +End + +Private Sub Alignment_Write(Value As Integer) + + $iAlignment = Value + + +End + +Public Sub _KeyPress() + + If Key.Code = Key.Return Then Raise Click + + Super._KeyPress + +End + + + + +Private Function _DefaultBackground_Read() As Integer + + Return TermColor.ButtonBackground + +End + +Private Function _DefaultForeGround_Read() As Integer + + Return TermColor.ButtonText + +End + +Public Sub _GetBackGround() As Integer + + If Me.Background = -1 Then + Return TermColor.ButtonBackground + Else + Return Me.Background + Endif + +End + + +Public Sub _GetForeGround() As Integer + + If Me.Foreground = -1 Then + Return TermColor.ButtonText + Else + Return Me.Foreground + Endif + +End diff --git a/comp/src/gb.term.form/.src/TermCheckBox.class b/comp/src/gb.term.form/.src/TermCheckBox.class new file mode 100644 index 00000000..9781d28a --- /dev/null +++ b/comp/src/gb.term.form/.src/TermCheckBox.class @@ -0,0 +1,114 @@ +' Gambas class file + +Export +Inherits TermControl +Class Rect +Property Text As String +Property Value As Integer +Property Tristate As Boolean + +Private $sText As String +Private $iOldLen As Integer +Private $iValue As Integer +Private $bTristate As Boolean + +Private Function Text_Read() As String + + Return $sText + +End + +Private Sub Text_Write(Value As String) + + $sText = Value + +End + +Public Sub _Render() + + Dim hAttr As New Attr + Dim iAttr As Integer + Dim i As Integer + Dim sALign As String + Dim hRectC As Rect = Me._GetClientRect() + Dim sValue As String + Dim iBC As Integer + + If Not Me._NeedRender Then Return + Super._Render + + sValue = Choose($iValue + 2, "x", " ", "/") + + sALign = "[" & sValue & "] " & $sText + + iBC = Me._GetBackGround() + If Me.HaveFocus Then iBC = TermColor.Focus + hAttr.Background = iBC + hAttr.Foreground = Me.Foreground + iAttr = hAttr.GetInteger() + + For i = 1 To Me._Content[0].count + If Me._Content[0][Me._Content[0].Max] And If i > Max($iOldLen, String.Len(sALign)) Then Break + If i <= String.Len(sALign) Then + Me._Content[0][i - 1] = Char(Mid(sALign, i, 1), iAttr) + Else + Me._Content[0][i - 1] = Char(" ", iAttr) + Endif + Next + + Me._NeedRender = False + +End + +Private Function Value_Read() As Integer + + Return $iValue + +End + +Private Sub Value_Write(Value As Integer) + + $iValue = Max(Min(Value, 1), -1) + +End + +Private Function Tristate_Read() As Boolean + + Return $bTristate + +End + +Private Sub Tristate_Write(Value As Boolean) + + $bTristate = Value + +End + +Public Sub _MouseUp() + + ChangeValue + Super._MouseUp + Super._Click + 'Me._NeedRender = True + 'Me.Refresh +End + +Private Sub ChangeValue() + + If Me.Value < IIf($bTristate, 1, 0) Then + Me.Value = $iValue + 1 + Else + Me.Value = -1 + Endif + Me.Refresh +End + + +Public Sub _KeyPress() + + If Key.Text = " " Then + ChangeValue + Endif + Super._Click + Super._KeyPress +End diff --git a/comp/src/gb.term.form/.src/TermColor.class b/comp/src/gb.term.form/.src/TermColor.class new file mode 100644 index 00000000..a5f30b6d --- /dev/null +++ b/comp/src/gb.term.form/.src/TermColor.class @@ -0,0 +1,21 @@ +' Gambas class file + +Export +Public Const Transparent As Integer = -1 +Public Enum Black, Red, Green, Yellow, Blue, Magenta, Cyan, White 'LightGray +'Public Enum DarkGray = 8, LightRed = 9, LightGreen = 10, LightYellow = 11, LightBlue = 12, LightMagenta = 13, LightCyan = 14, White = 15 + +Public Enum {Default}, Mode256, ModeRGB + +Static Public ForeGround As Integer = Black +Static Public Background As Integer = White +Static Public ActiveWindow As Integer = Red +Static Public InactiveWindow As Integer = Magenta +Static Public Focus As Integer = Yellow +Static Public FocusText As Integer = White +Static Public {Desktop} As Integer = Black +Static Public ButtonBackground As Integer = Red +Static Public ButtonText As Integer = White +Static Public Border As Integer = Black +Static Public TextBackground As Integer = Cyan +Static Public TextForeground As Integer = Black diff --git a/comp/src/gb.term.form/.src/TermContainer.class b/comp/src/gb.term.form/.src/TermContainer.class new file mode 100644 index 00000000..cc2706b3 --- /dev/null +++ b/comp/src/gb.term.form/.src/TermContainer.class @@ -0,0 +1,243 @@ +' Gambas class file + +Export +Create Private +Inherits TermControl +Class Rect + +Public Const _IsContainer As Boolean = True +Public Const _Group As String = "Container" +Public Const _Properties As String = "*" + +Property Read Children As TermControl[] +Property Read ClientWidth, CLientW As Integer +Property Read ClientHeight, ClientH As Integer +Property Spacing As Integer +Property Padding As Integer +Property Border As Integer +Property Shadow As Boolean +Property Invert As Boolean + +Private $iSpacing As Integer '= 1 +Private $bInvert As Boolean +Private $aChildren As New Object[] + +Public _Arrangement As Integer '= Arrange.Vertical + +Public Sub _new() + + Me._AllowFocus = False + +End + + +Public Sub _Add(hCtrl As TermControl) + + $aChildren.Add(hCtrl) + +End + +Private Function Children_Read() As TermControl[] + + If Not $aChildren Then $aChildren = New TermControl[] + Return $aChildren + +End + +Public Sub _Render() + + Dim hChild As TermControl + Dim i, j As Integer + Dim hAttr As New Attr + Dim iAttr As Integer + + If Me._NeedRender Then + Super._Render + + Endif + For Each hChild In Me.Children + + hChild._Render + + Next + Me._NeedRender = False +End + +Public Sub _Arrange() + + Dim hChild As Object + Dim H As Integer + Dim iExt As Integer '= Min(5, $yBorder + $iPadding) + Dim iNExp As Integer + Dim iHExp As Integer + Dim hRectClient As Rect = Me._GetClientRect() + Dim iPadding As Integer = Me.Padding + 'If Me.tag = "*" Then Stop + Select Case _Arrangement + Case Arrange.Vertical + + For Each hChild In $aChildren + If Not hChild.Expand Then + iHExp += hChild.Height + If $iSpacing > 0 Then iHExp += $iSpacing + Else + Inc iNExp + Endif + 'If Me Is TermVBox Then Stop + If iHExp >= (hrectClient.Height - iPadding * 2) Then Break + Next + + If iNExp > 0 Then + If iHExp > 0 And If $iSpacing > 0 Then + 'iHExp -= $iSpacing + Endif + iHExp = (hrectClient.Height - iHExp) / iNExp + Endif + + H = 0 'hrectClient.Top + For Each hChild In $aChildren + 'If hChild Is TermPictureBox Then Stop + If Not hChild.Ignore Then + hChild.X = 0 'hrectClient.Left + hChild.Y = H + hChild.Width = hrectClient.Width + If hChild.Expand Then hChild.H = iHExp + H += hChild.H + $iSpacing + Endif + hChild._Arrange() + 'If H >= Me.ClientHeight Then Break + Next + + Case Arrange.Horizontal + For Each hChild In $aChildren + If Not hChild.Expand Then + iHExp += hChild.Width + If $iSpacing > 0 Then iHExp += $iSpacing + Else + Inc iNExp + Endif + 'If Me Is TermVBox Then Stop + If iHExp >= (hrectClient.Width - iPadding * 2) Then Break + Next + + If iNExp > 0 Then + + If iHExp > 0 And If $iSpacing > 0 Then + 'iHExp -= $iSpacing + Endif + iHExp = Ceil((hrectClient.Width - iHExp) / iNExp) + Endif + + If $bInvert Then + H = hrectClient.Right - 1 + Else + H = hrectClient.Width - Me.Width + Endif + For Each hChild In $aChildren + If Not hChild.Ignore Then + If $bInvert Then H -= hChild.W + hChild.Y = hrectClient.Top + + hChild.X = H + hChild.Height = hrectClient.Height + If hChild.Expand Then hChild.W = iHExp + 'f hChild.Expand Then Stop + If $bInvert Then + H -= $iSpacing + Else + H += hChild.W + $iSpacing + Endif + Endif + hChild._Arrange() + 'If H >= Me.ClientHeight Then Break + Next + End Select + +End + +' Public Sub _GetClientRect() As Rect +' +' Return $rectClient.Copy() +' +' End + +Private Function ClientWidth_Read() As Integer + + Return Me._GetClientRect().Width + 'Return $rectClient.Width + 'Return $iCLientW + +End + +Private Function ClientHeight_Read() As Integer + + Return Me._GetClientRect().Height + +End + +Private Function Spacing_Read() As Integer + + Return $iSpacing + +End + +Private Sub Spacing_Write(Value As Integer) + + $iSpacing = Value + +End + +Private Function Padding_Read() As Integer + + Return Me._Padding + +End + +Private Sub Padding_Write(Value As Integer) + + Me._Padding = Value + Me._DefineRect + +End + +Private Function Border_Read() As Integer + + Return Super._Border + +End + +Private Sub Border_Write(Value As Integer) + + Super._Border = Value + + Me._DefineRect + Me.Refresh + + +End + +Private Function Shadow_Read() As Boolean + + Return Super._Shadow + +End + +Private Sub Shadow_Write(Value As Boolean) + + Super._Shadow = True + +End + +Private Function Invert_Read() As Boolean + + Return $bInvert + +End + +Private Sub Invert_Write(Value As Boolean) + + $bInvert = Value + +End + + diff --git a/comp/src/gb.term.form/.src/TermControl.class b/comp/src/gb.term.form/.src/TermControl.class new file mode 100644 index 00000000..d4195665 --- /dev/null +++ b/comp/src/gb.term.form/.src/TermControl.class @@ -0,0 +1,783 @@ +' Gambas class file + +Export +Create Private +Class Rect + +Public Const _IsControl As Boolean = True +Public Const _IsContainer As Boolean = False +Public Const _Properties As String = "X{Position},Y{Position},Width{Dimension},Height{Dimension},Background{Color},Foreground{Color},Ignore" +'"Left{ReportCoord},Top{ReportCoord},Width{ReportCoord},Height{ReportCoord},Brush{ReportBrush},Visible=True,Fixed,Font,Padding,Margin,Ignore,Expand,AutoResize,Tag,Range" +Public Const _Family As String = "TermForm" + +Static Public _IdToControl As New Collection +Static Private $iLastId As Integer = 1 + +Public _Content As Char[][] +Public _NeedRender As Boolean +Public _UseFocus As Boolean +Property Read id As Integer + +Property Read Parent As TermContainer +Property Read ScreenX As Integer +Property Read ScreenY As Integer +Property Read Window As TermWindow + +Property Left, X, Column As Integer +Property Top, Y, {Line} As Integer +Property Width, W As Integer +Property Height, H As Integer +Property Background As Integer +Property Foreground As Integer +Property Tag As Variant +Property Expand As Boolean +Property _Shadow As Boolean +Property _Border As Integer +Property _Padding As Integer +Property _ColorMode As Integer +Property Visible As Boolean +Property Ignore As Boolean + +Property Read Next As TermControl +Property Read Previous As TermControl +Property Read HaveFocus As Boolean +Property Read _DefaultBackground As Integer +Property Read _DefaultForeGround As Integer + +Property Read _ClientHeight As Integer +Property Read _ClientWidth As Integer + +Private $iColorMode As Integer +Private $iBorder As Integer + +Private $bShadow As Boolean +Private $bIgnore As Boolean +Private _RecalcPos As Boolean +Private $rectControl As New Rect +Private $iId As Integer +Private $iParent As Integer +Private $iScreenX As Integer +Private $iScreenY As Integer +Private $iWindow As Integer +Private $iBackGround As Integer = -1 +Private $iForeground As Integer = -1 +Private $vTag As Variant +Private $bExpand As Boolean +Private $yBorder As Byte +Private $iPadding As Integer +Private $rectClient As Rect +Private $iVisible As Boolean = True +Private $bLockRender As Boolean +Public _AllowFocus As Boolean = True +Private $bHaveFocus As Boolean +Event MouseDown +Event MouseUp +Event MouseWheel +Event MouseMove +Event Click +Event KeyPress +Event GotFocus +Event LostFocus + +Public Sub _new(Optional hParent As TermContainer) + + $iId = $iLastId + Inc $iLastId + If hParent Then + $iParent = hParent.Id + hParent._Add(Me) + GetWindow + Else + If Me Is TermWindow Then + TermWindows._Add(Me) + $iWindow = $iId + Endif + Endif + $rectControl.Width = 5 + $rectControl.Height = 1 + _DefineRect + _IdToControl[$iId] = Me + _RecalcPos = True + _NeedRender = True + _AllowFocus = True + If hParent Then + TermWindows.SetRefreshArea(hParent._GetScreenRect()) + 'TermWindows._Render + 'hParent.Refresh + Endif + ' TermWindows._RefreshScreen + 'Me.Window.Refresh + +End + +Private Sub ResizeBuffer(Width As Integer, Height As Integer) + + Dim i As Integer + Dim aLine As Char[] + + 'Debug "Resize", Object.Type(Me) + _Content = New Char[][] + For i = 0 To Height + aLine = New Char[Width] + _Content.Add(aLine) + Next + Me._NeedRender = True + +End + +Public Sub _Render() + + Dim i, j As Integer + Dim hAttr As New Attr + Dim iAttr As Integer + Dim hRectC As Rect + Dim iShadow As Integer = IIf($bShadow, 1, 0) + Dim iBC As Integer + + If Not Me._NeedRender Then Return + 'If Me Is TermContainer Then + hRectC = $rectControl + 'Else + ' hRectC = $rectClient + 'Endif + + If Not _Content Then ResizeBuffer(hRectC.Width, hRectC.Height) + + iBC = Me._GetBackGround() + If Me.HaveFocus Then iBC = TermColor.Focus + hAttr.Background = iBC + + iAttr = hAttr.GetInteger() + + For i = 0 To _Content.Max + hAttr.Foreground = TermColor.Border + For j = 0 To _Content[0].Max + _Content[i][j] = Char(" ", iAttr) + Next + Next + + Select Case $iBorder + Case Border.Simple + hAttr.Background = iBC + + iAttr = hAttr.GetInteger() + For j = 1 To hRectC.width - 2 '_Content[0].Max - 1 + _Content[0][j] = Char(String.Chr(&h2500), iAttr) + Next + For j = 1 To hRectC.width - 2 + _Content[hRectC.Height - 1 - iShadow][j] = Char(String.Chr(&h2500), iAttr) + Next + For i = 1 To hRectC.Height - 2 - iShadow + + _Content[i][0] = Char(String.chr(&H2502), iAttr) + _Content[i][hRectC.Width - 1 - iShadow] = Char(String.chr(&H2502), iAttr) + Next + _Content[0][0] = Char(String.chr(&H250C), iAttr) + _Content[0][hRectC.Width - 1 - iShadow] = Char(String.chr(&H2510), iAttr) + _Content[hRectC.Height - 1 - iShadow][0] = Char(String.chr(&H2514), iAttr) + _Content[hRectC.Height - 1 - iShadow][hRectC.Width - 1 - iShadow] = Char(String.chr(&H2518), iAttr) + + Case Border.Double + hAttr.Background = iBC + + iAttr = hAttr.GetInteger() + For j = 1 To hRectC.width - 2 '_Content[0].Max - 1 + _Content[0][j] = Char(String.Chr(&h2550), iAttr) + Next + For j = 1 To hRectC.width - 2 + _Content[hRectC.Height - 1 - iShadow][j] = Char(String.Chr(&h2550), iAttr) + Next + For i = 1 To hRectC.Height - 2 - iShadow + + _Content[i][0] = Char(String.chr(&H2551), iAttr) + _Content[i][hRectC.Width - 1 - iShadow] = Char(String.chr(&H2551), iAttr) + Next + _Content[0][0] = Char(String.chr(&H2554), iAttr) + _Content[0][hRectC.Width - 1 - iShadow] = Char(String.chr(&H2557), iAttr) + _Content[hRectC.Height - 1 - iShadow][0] = Char(String.chr(&H255A), iAttr) + _Content[hRectC.Height - 1 - iShadow][hRectC.Width - 1 - iShadow] = Char(String.chr(&H255D), iAttr) + Case Else + + End Select + + If $bShadow Then + ' If Me Is TermButton Then Stop + hAttr.Foreground = TermColor.Black + If IsNull(Me.Parent) Then + hAttr.Background = TermColor.Desktop + Else + hAttr.Background = Me.Parent.Background + Endif + + iAttr = hAttr.GetInteger() + For i = 1 To _Content[0].Max + + _Content[_Content.Max - 1][i] = Char(String.chr(&H2580), iAttr) + + Next + For i = 1 To _Content.Max - 2 + _Content[i][_Content[0].Max] = Char(String.chr(&H2588), iAttr) + + Next + 'hAttr.Background = If(IsNull(Me.Parent), Desktop.BackGround, Me.Parent.Background) + _Content[0][_Content[0].Max] = Char(String.chr(&H2584), iAttr) + _Content[_Content.Max - 1][0] = Char(" ", iAttr) + + Endif + +End + +Private Function id_Read() As Integer + + Return $iId + +End + +Private Function Parent_Read() As TermContainer + + Return _IdToControl[$iParent] + +End + +Private Function Left_Read() As Integer + + Return $rectControl.X + +End + +Private Sub Left_Write(Value As Integer) + + If $rectControl.Left = Value Then Return + TermWindows.SetRefreshArea(Rect(Me.ScreenX, Me.ScreenY, $rectControl.Width, $rectControl.Height)) + $rectControl.X = Value + Me._DefineRect + TermWindows.SetRefreshArea(Rect(Me.ScreenX, Me.ScreenY, $rectControl.Width, $rectControl.Height)) + _RecalcPos = True + If Not $bLockRender Then TermWindows._Render + +End + +Private Function Top_Read() As Integer + + 'If Me.tag = "--" Then Stop + + Return $rectControl.Y + +End + +Private Sub Top_Write(Value As Integer) + + If $rectControl.Top = Value Then Return + TermWindows.SetRefreshArea(Rect(Me.ScreenX, Me.ScreenY, $rectControl.Width, $rectControl.Height)) + $rectControl.Y = Value + + Me._DefineRect + _RecalcPos = True + + TermWindows.SetRefreshArea(Rect(Me.ScreenX, Me.ScreenY, $rectControl.Width, $rectControl.Height)) + If Not $bLockRender Then TermWindows._Render + +End + +Private Function Width_Read() As Integer + + Return $rectControl.Width + +End + +Private Sub Width_Write(Value As Integer) + + If $rectControl.Width = Value Then Return + If Value < 1 Then Return + TermWindows.SetRefreshArea(Rect(Me.ScreenX, Me.ScreenY, $rectControl.Width, $rectControl.Height)) + $rectControl.Width = Value + + '$rectDrawing.width = Value + IIf($bShadow, 1, 0) + Me._DefineRect + ResizeBuffer($rectControl.Width, $rectControl.Height) + TermWindows.SetRefreshArea(Rect(Me.ScreenX, Me.ScreenY, $rectControl.Width, $rectControl.Height)) + If Not $bLockRender Then TermWindows._Render 'If Me Is TermContainer Then Me._SetClientRect() + +End + +Private Function Height_Read() As Integer + + Return $rectControl.Height + +End + +Private Sub Height_Write(Value As Integer) + + If $rectControl.Height = Value Then Return + If Value < 1 Then Return + TermWindows.SetRefreshArea(Rect(Me.ScreenX, Me.ScreenY, $rectControl.Width, $rectControl.Height)) + $rectControl.Height = Value + '$rectDrawing.Height = Value + IIf($bShadow, 1, 0) + Me._DefineRect + ResizeBuffer($rectControl.Width, $rectControl.Height) + TermWindows.SetRefreshArea(Rect(Me.ScreenX, Me.ScreenY, $rectControl.Width, $rectControl.Height)) + If Not $bLockRender Then TermWindows._Render 'If Me Is TermContainer Then Me._SetClientRect() + +End + +Private Function ScreenX_Read() As Integer + + Dim hParent As TermControl + Dim iBorder As Integer + + hParent = _IdToControl[$iParent] + If hParent._Border > 0 Then iBorder = 1 + Return _IdToControl[$iParent].ScreenX + iBorder + Me.Left + +End + +Private Function ScreenY_Read() As Integer + + Dim hParent As TermControl + Dim iBorder As Integer + + hParent = _IdToControl[$iParent] + If hParent._Border > 0 Then iBorder = 1 + Return hParent.ScreenY + iBorder + Me.Top + +End + +Private Sub GetWindow() + + Dim hCont As Object = Me.Parent + + Do + If hCont.Parent = Null Then + $iWindow = hCont.Id + Break + Endif + hCont = hCont.Parent + Loop + +End + +Private Sub ComputeScreenXY() + + Dim hC As TermControl = Me.Parent + + If Me Is TermLabel Then Stop + If hC Then + $iScreenX = hC.ScreenX + $rectControl.Left + $iScreenY = hC.ScreenY + $rectControl.Top + Else + $iScreenX = $rectControl.Left + $iScreenY = $rectControl.Top + Endif + _RecalcPos = False + +End + +Private Function Window_Read() As TermWindow + + Return _IdToControl[$iWindow] + +End + +Public Function _GetScreenClientRect() As Rect + + Dim iCorner As Integer = IIf($iBorder > 0, 1, 0) + $iPadding + Dim iSize As Integer = iCorner * 2 + IIf($bShadow, 1, 0) + + Return rect(Me.ScreenX + iCorner, Me.ScreenY + iCorner, $rectControl.Width - iSize, $rectControl.Height - iSize) + +End + +Public Function _GetScreenRect() As Rect + + Return Rect(Me.ScreenX, Me.ScreenY, $rectControl.width, $rectControl.Height) + +End + +Public Function _GetRect() As Rect + + Return $rectControl.Copy() + +End + +Private Function Background_Read() As Integer + + Return $iBackGround + +End + +Private Sub Background_Write(Value As Integer) + + $iBackGround = Value + Me.Refresh + +End + +Private Function Foreground_Read() As Integer + + Return $iForeGround + +End + +Private Sub Foreground_Write(Value As Integer) + + $iForeground = Value + Me.Refresh + +End + +Public Sub _GetChar(c As Integer, l As Integer) As Char + 'If Me.Tag = "#" Then Stop + + Return _Content[l - Me.ScreenY][c - Me.ScreenX] + +End + +Private Function Tag_Read() As Variant + + Return $vTag + +End + +Private Sub Tag_Write(Value As Variant) + + $vTag = Value + +End + +Public Sub _Arrange() + +End + +Public Sub Move(Left As Integer, Top As Integer, Optional Width As Integer, Height As Integer) + + $bLockRender = True + Me.Left = Left + Me.Top = Top + If Not IsMissing(Width) Then Me.Width = Width + If Not IsMissing(Height) Then Me.Height = Height + $bLockRender = False + TermWindows._Render + +End + +Private Function Expand_Read() As Boolean + + Return $bExpand + +End + +Private Sub Expand_Write(Value As Boolean) + + Dim hParent As TermContainer + $bExpand = Value + hParent = Me.Parent + If hParent Then + TermWindows.SetRefreshArea(hParent._GetScreenRect()) + TermWindows._Render + + Endif + +End + +Public Sub _Initialize() + + 'Here generate the content Array to the right size + 'Define the true size for the Client content + +End + +Private Function _Shadow_Read() As Boolean + + Return $bShadow + +End + +Private Sub _Shadow_Write(Value As Boolean) + + $bShadow = Value + Me._NeedRender = True + +End + +Public Sub _DefineRect() + 'If Me Is TermPictureBox Then Stop + + $rectClient = Rect($iPadding + $yBorder, $iPadding + $yBorder, $rectControl.Width - ($iPadding + $yBorder) * 2 - IIf($bShadow, 1, 0), $rectControl.Height - ($iPadding + $yBorder) * 2 - IIf($bShadow, 1, 0)) + +End + +Private Function _Border_Read() As Integer + + Return $iBorder + +End + +Private Sub _Border_Write(Value As Integer) + + $iBorder = Value + $yBorder = IIf($iBorder > Border.None, 1, 0) + Me.Refresh + +End + +Public Sub _GetClientRect() As Rect + ' If Me Is TermFrame Then Stop + '_DefineRect + + Return $rectClient.Copy() + +End + +Private Function _Padding_Read() As Integer + + Return $iPadding + +End + +Private Sub _Padding_Write(Value As Integer) + + $iPadding = Value + +End + +Public Sub _GetBackGround() As Integer + + Dim i As Integer + + If $iBackGround = -1 Then + If $iParent > 0 Then + i = Me.Parent._GetBackGround() + Return i + Else + Return TermColor.Background + Endif + Else + Return $iBackGround + Endif + +End + +Public Sub _GetForeground() As Integer + + Dim i As Integer + + If $iForeground = -1 Then + If $iParent > 0 Then + i = Me.Parent._GetForeground() + Return i + Else + Return TermColor.ForeGround + Endif + Else + Return $iForeground + Endif + +End + +Private Function _ColorMode_Read() As Integer + + Return $iColorMode + +End + +Private Sub _ColorMode_Write(Value As Integer) + + $iColorMode = Value + +End + +Public Sub _MouseDown() + + Dim hwindow As TermWindow + + If TermWindows.Debug = TermWindows.DebugInput Then Error "Mouse Down Event Raised on : " & Me.id & " Type: " & Object.Type(Me) + + If Not Me.Window.Active Then + Me.Window.Activate + Endif + Me.SetFocus + Raise MouseDown + +End + +Public Sub _MouseUp() + + If TermWindows.Debug = TermWindows.DebugInput Then Error "Mouse Up Event Raised on : " & Me.id & " Type: " & Object.Type(Me) + Raise MouseUp + +End + +Public Sub _MouseMove() + + If TermWindows.Debug = TermWindows.DebugInput Then Error "Mouse Move Event Raised on : " & Me.id & " Type: " & Object.Type(Me) + Raise MouseMove + +End + +Public Sub _MouseWheel() + + If TermWindows.Debug = TermWindows.DebugInput Then Error "Mouse Wheel Event Raised on : " & Me.id & " Type: " & Object.Type(Me) + Raise MouseWheel + +End + +Public Sub _Click() + + If TermWindows.Debug = TermWindows.DebugInput Then Error "Mouse Click Event Raised on : " & Me.id & " Type: " & Object.Type(Me) + Raise Click + +End + +Private Function Visible_Read() As Boolean + + Return $iVisible + +End + +Private Sub Visible_Write(Value As Boolean) + + If $iVisible <> Value Then + $iVisible = Value + TermWindows.SetRefreshArea($rectControl) + TermWindows._Render + Endif + +End + +Public Sub Show() + ' If Me Is Termform Then Stop + Me.Visible = True + +End + +Public Sub Hide() + + Me.Visible = False + +End + +Public Sub Resize(Width As Integer, Height As Integer) + + $bLockRender = True + Me.Width = Width + Me.Height = Height + $bLockRender = False + TermWindows._Render + +End + +Public Sub Refresh(Optional hScreenRect As Rect) + + Me._NeedRender = True + If hScreenRect Then + TermWindows.SetRenderArea(hScreenRect) + Else + TermWindows.SetRenderArea(Me._GetScreenRect()) + Endif + TermWindows._Render + +End + +Public Sub _KeyPress() + + Raise KeyPress + +End + +Private Function Next_Read() As TermControl + + Dim iPos As Integer + Dim hChildren As TermControl[] + + hChildren = Me.Parent.Children + ipos = hChildren.Find(Me) + If ipos = hChildren.Max Then Return Null + Return hChildren[iPos + 1] + +End + +Private Function Previous_Read() As TermControl + + Dim iPos As Integer + Dim hChildren As TermControl[] + + hChildren = Me.Parent.Children + iPos = hChildren.Find(Me) + If iPos = 0 Then Return Null + Return hChildren[iPos - 1] + +End + +Public Sub SetFocus() + + Dim hPrev As TermControl + + If Me.HaveFocus Then Return + If _AllowFocus Then + hPrev = TermControl._IdToControl[Me.Window._GetCurrentFocusId()] + hPrev._LostFocus + hPrev.Refresh + Me.Window._SetFocus(Me) + Me._GotFocus + Me.Refresh + Endif + +End + +Private Sub HaveFocus_Read() As Boolean + + Return $bHaveFocus + +End + +Public Sub _LostFocus() + + $bHaveFocus = False + + Raise LostFocus + +End + +Public Sub _GotFocus() + + $bHaveFocus = True + + Raise GotFocus + +End + +Private Function _DefaultBackground_Read() As Integer + + Return TermColor.Background + +End + +Private Function _DefaultForeGround_Read() As Integer + + Return TermColor.ForeGround + +End + +Private Function _ClientHeight_Read() As Integer + + Return $rectClient.Height + +End + +Private Function _ClientWidth_Read() As Integer + + Return $rectClient.Width + +End + +Private Function Ignore_Read() As Boolean + + Return $bIgnore + +End + +Private Sub Ignore_Write(Value As Boolean) + + $bIgnore = Value + +End diff --git a/comp/src/gb.term.form/.src/TermForm.class b/comp/src/gb.term.form/.src/TermForm.class new file mode 100644 index 00000000..d78296cf --- /dev/null +++ b/comp/src/gb.term.form/.src/TermForm.class @@ -0,0 +1,23 @@ +' Gambas class file + +Export +Inherits TermWindow +Public Const _Properties As String = "*,Border{Border.None;Simple;Double}=Simple,Arrangement{Arrange.None;Vertical;Horizontal}=None,Text,Resizable=True" +Public Const _HiddenControls As String = "TermControl,TermForm,TermWindow,TermContainer" +Public Const _IsForm As Boolean = True +Public Const _IsContainer As Boolean = True +Public Const _IsMultiContainer As Boolean = False +Public Const _DrawWith As String = "Form" +Public Const _DefaultEvent As String = "Open" + + +Static Public Sub Main() + + Dim hObject As TermForm + + hObject = Application.Startup.AutoCreate() + hObject.Show + + TermWindows._Render + +End diff --git a/comp/src/gb.term.form/.src/TermFrame.class b/comp/src/gb.term.form/.src/TermFrame.class new file mode 100644 index 00000000..0693b9d7 --- /dev/null +++ b/comp/src/gb.term.form/.src/TermFrame.class @@ -0,0 +1,57 @@ +' Gambas class file + +Export +Inherits TermPanel +Class Rect + +Property Text As String +Private $sText As String +Private $iOldLen As Integer + +Public Sub _Render() + + Dim hAttr As New Attr + Dim iAttr As Integer + Dim i As Integer + Dim iStart As Integer + Dim hRectC As Rect = Me._GetClientRect() + Dim sText As String = " " & $sText & " " + Super._Render + If Not Me._NeedRender Then Return + + ' Select Case $iAlignment + ' Case Align.Right + ' sALign = String(hRectC.Width - Len($sText), " ") & $sText + ' Case Align.Center + iStart = CInt(Ceil((hRectC.Width - Len(sText)) / 2)) + ' Case Else + ' sALign = $sText + ' End Select + + hAttr.Background = Me._GetBackGround() + hAttr.Foreground = Me.Foreground + iAttr = hAttr.GetInteger() + + For i = iStart To Me._Content[0].count + If i - iStart >= String.Len(sText) Then Break + + Me._Content[0][i - 1] = Char(Mid(sText, i - iStart + 1, 1), iAttr) + + + Next + + Me._NeedRender = False + +End + +Private Function Text_Read() As String + + Return $sText + +End + +Private Sub Text_Write(Value As String) + + $sText = Value + +End diff --git a/comp/src/gb.term.form/.src/TermHBox.class b/comp/src/gb.term.form/.src/TermHBox.class new file mode 100644 index 00000000..e03dfd03 --- /dev/null +++ b/comp/src/gb.term.form/.src/TermHBox.class @@ -0,0 +1,9 @@ +' Gambas class file + +Export +Inherits TermContainer +Public Sub _new() + + Super._Arrangement = Arrange.Horizontal + +End diff --git a/comp/src/gb.term.form/.src/TermLabel.class b/comp/src/gb.term.form/.src/TermLabel.class new file mode 100644 index 00000000..8bff882a --- /dev/null +++ b/comp/src/gb.term.form/.src/TermLabel.class @@ -0,0 +1,73 @@ +' Gambas class file + +Export +Inherits TermControl + +Class Rect + +Public Const _Properties As String = "*,Text" +Public Const _DrawWith As String = "Label" + +Property Text As String + +Private $sText As String +Private $iOldLen As Integer + +Public Sub _new() + + Me._AllowFocus = False + +End + + + +Public Sub _Render() + Dim hAttr As New Attr + Dim iAttr As Integer + Dim i As Integer + If Not Me._NeedRender Then Return + Super._Render + If Me.HaveFocus Then + hAttr.Background = TermColor.Yellow + Else + hAttr.Background = Me._GetBackGround() + Endif + hAttr.Foreground = Me._GetForeground() + iAttr = hAttr.GetInteger() + + For i = 1 To Me._Content[0].count + If Me._Content[0][Me._Content[0].Max] And If i > Max($iOldLen, String.Len($sText)) Then Break + If i <= String.Len($sText) Then + Me._Content[0][i - 1] = Char(Mid($sText, i, 1), iAttr) + Else + Me._Content[0][i - 1] = Char(" ", iAttr) + Endif + Next + + Me._NeedRender = False +End + +Private Function Text_Read() As String + + Return $sText + +End + +Private Sub Text_Write(Value As String) + $iOldLen = String.len($sText) + $sText = Value + TermWindows.SetRenderArea(rect(Me.ScreenX, Me.ScreenY, Max($iOldLen, String.Len($sText)), Me.Height)) + Me._NeedRender = True + TermWindows._Render +End + + +Public Sub _GetForeground() As Integer + + If Me.Foreground = -1 Then + Return TermColor.ForeGround + Else + Return Me.Foreground + Endif + +End diff --git a/comp/src/gb.term.form/.src/TermListBox.class b/comp/src/gb.term.form/.src/TermListBox.class new file mode 100644 index 00000000..024fc06b --- /dev/null +++ b/comp/src/gb.term.form/.src/TermListBox.class @@ -0,0 +1,201 @@ +' Gambas class file + +Export +Inherits TermControl + +Property List As String[] +Property Index As Integer +Property Read Count As Integer +Property Read Text As String +Private $iIndex As Integer +Private $aList As New String[] +Private $iFirstVisible As Integer +Private $iPrevIndex As Integer +Event Activate +Event Change +Class Rect + +Private Function List_Read() As String[] + + Return $aList + +End + +Private Sub List_Write(Value As String[]) + + $aList = Value + +End + +Private Function Index_Read() As Integer + + Return $iIndex + +End + +Private Sub Index_Write(Value As Integer) + + Dim iNewIndex As Integer + iNewIndex = Min($aList.Max, Max(0, Value)) + If iNewIndex <> $iIndex Then + $iPrevIndex = $iIndex + $iIndex = iNewIndex + EnsureVisible + Endif + +End + +Private Function Count_Read() As Integer + + Return $aList.Count + +End + +Public Sub _Render() + + Dim hAttr As New Attr + Dim iAttr, iAttr2 As Integer + Dim i, il, k, ilen As Integer + Dim s As String + Dim hRectC As Rect = Me._GetClientRect() + Dim hRect As Rect = Me._GetClientRect() + Dim iCursorPos As Integer + + If Not Me._NeedRender Then Return + Super._Render + + hAttr.FillFrom(Me._Content[0][0].Attr) + + Swap hAttr.Background, hAttr.Foreground + iAttr = hAttr.GetInteger() + k = $iFirstVisible + For i = 0 To Me._Content.Max + If k > $aList.Max Then Break + s = $aList[k] + ilen = String.Len(s) + For il = 0 To IIf(k = $iIndex, hRect.width - 2, Min(hRect.width - 2, ilen)) + 'iAttr = Me._Content[i][il]. + If k = $iIndex Then Me._Content[i][il].Attr = iAttr + If il < ilen Then Me._Content[i][il].c = String.Code(String.Mid(s, il + 1, 1)) + Next + + Inc k + Next + + ilen = Me._Content[0].Max + 'Render the scrollbar + For i = 1 To Me._Content.Max - 2 + Me._Content[i][ilen].c = &H2591 + Next + Me._Content[0][ilen].c = &H25B2 + Me._Content[Me._Content.Max - 1][ilen].c = &H25BC + + hAttr.Foreground = TermColor.Black + iAttr = hAttr.GetInteger() + iCursorPos = ($iFirstVisible + hRect.height) / $aList.Count * (hRect.Height - 3) + Try Me._Content[iCursorPos][hRect.width - 1] = Char(String.Chr(&H2588), iAttr) + + Me._NeedRender = False +Fin: + +End + +Public Sub _KeyPress() + + Select Key.Code + Case Key.Up + Dec Me.Index + Raise Change + Case Key.Down + Inc Me.Index + Raise Change + Case Key.Return, Key.Enter + Raise Activate + + Default + + End Select + Super._KeyPress + +End + +Public Sub _MouseDown() + + Super._MouseDown + Me.Index = $iFirstVisible + Mouse.Row + Raise Change + 'EnsureVisible + +End + +Public Sub _MouseUp() + + Super._MouseUp + Raise Activate + Raise Click + +End + +Public Sub _MouseMove() + + Super._MouseMove + _MouseDown + +End + +Public Sub EnsureVisible() + + Dim hRect As Rect + Dim hRectSc As Rect + + If IsVisible($iIndex) Then + hRectSC = Me._GetScreenClientRect() + Me.Refresh(Rect(hRectSc.X, GetRowByIndex($iPrevIndex), hRectSc.Width, 1)) + Me.Refresh(Rect(hRectSc.X, GetRowByIndex($iIndex), hRectSc.Width, 1)) + Return + Endif + + hRect = Me._GetClientRect() + If $iFirstVisible + (hRect.Height - 1) < $iIndex Then + $iFirstVisible = $iIndex - hRect.Height + 1 + Endif + If $iIndex < $iFirstVisible Then + $iFirstVisible = $iIndex + Endif + Me.Refresh + +End + +Public Sub _put(Value As String, Index As Integer) + + Dim hRect As Rect = Me._GetScreenClientRect() + $aList[Index] = Value + If IsVisible(Index) Then + Me.Refresh(Rect(hRect.X, hRect.Y + GetRowByIndex(Index), hRect.Width, 1)) + Endif + +End + +Public Function _get(Index As Integer) As String + + Return $aList[Index] + +End + +Private Sub IsVisible(Index As Integer) As Boolean + + If Index >= $iFirstVisible And If Index < $iFirstVisible + Me._ClientHeight Then Return True + +End + +Private Function Text_Read() As String + + Return $aList[$iIndex] + +End + +Private Function GetRowByIndex(Index As Integer) As Integer + + Return Index - $iFirstVisible + +End diff --git a/comp/src/gb.term.form/.src/TermPanel.class b/comp/src/gb.term.form/.src/TermPanel.class new file mode 100644 index 00000000..47a4b240 --- /dev/null +++ b/comp/src/gb.term.form/.src/TermPanel.class @@ -0,0 +1,23 @@ +' Gambas class file + +Export +Inherits TermContainer + +Property Arrangement As Integer + + + + +Private Function Arrangement_Read() As Integer + + Return Super._Arrangement + +End + +Private Sub Arrangement_Write(Value As Integer) + + Super._Arrangement = Value + +End + + diff --git a/comp/src/gb.term.form/.src/TermPictureBox.class b/comp/src/gb.term.form/.src/TermPictureBox.class new file mode 100644 index 00000000..bcb2f890 --- /dev/null +++ b/comp/src/gb.term.form/.src/TermPictureBox.class @@ -0,0 +1,222 @@ +' Gambas class file + +Export +Inherits TermControl +Class Rect +Class Image +Class Color +Private $hImage As Image '= Image.Load("all.png") +Property Image As Image +Property Stretch As Integer +Property Alignment As Integer +Private $iAlignment As Integer +Private $iStretch As Integer +'None: Do nothing +'Proportional: Fit to one near border and adapt the other side +'Cut/Zoom: Adapt to the far border and cut the rest +'Fit: use the PictureBox content size +'If Picture box.None is not set the the ALignment property is set to centered +Public Enum None, Proportional, Cut, Fit +Private $aTermColor As Integer[] = [ + &H000000, &H800000, &H008000, &H808000, &H000080, &H800080, &H008080, &Hc0c0c0, + &H808080, &Hff0000, &H00ff00, &Hffff00, &H0000ff, &Hff00ff, &H00ffff, &Hffffff, + &H000000, &H00005f, &H000087, &H0000af, &H0000d7, &H0000ff, + &H005f00, &H005f5f, &H005f87, &H005faf, &H005fd7, &H005fff, + &H008700, &H00875f, &H008787, &H0087af, &H0087d7, &H0087ff, + &H00af00, &H00af5f, &H00af87, &H00afaf, &H00afd7, &H00afff, + &H00d700, &H00d75f, &H00d787, &H00d7af, &H00d7d7, &H00d7ff, + &H00ff00, &H00ff5f, &H00ff87, &H00ffaf, &H00ffd7, &H00ffff, + &H5f0000, &H5f005f, &H5f0087, &H5f00af, &H5f00d7, &H5f00ff, + &H5f5f00, &H5f5f5f, &H5f5f87, &H5f5faf, &H5f5fd7, &H5f5fff, + &H5f8700, &H5f875f, &H5f8787, &H5f87af, &H5f87d7, &H5f87ff, + &H5faf00, &H5faf5f, &H5faf87, &H5fafaf, &H5fafd7, &H5fafff, + &H5fd700, &H5fd75f, &H5fd787, &H5fd7af, &H5fd7d7, &H5fd7ff, + &H5fff00, &H5fff5f, &H5fff87, &H5fffaf, &H5fffd7, &H5fffff, + &H870000, &H87005f, &H870087, &H8700af, &H8700d7, &H8700ff, + &H875f00, &H875f5f, &H875f87, &H875faf, &H875fd7, &H875fff, + &H878700, &H87875f, &H878787, &H8787af, &H8787d7, &H8787ff, + &H87af00, &H87af5f, &H87af87, &H87afaf, &H87afd7, &H87afff, + &H87d700, &H87d75f, &H87d787, &H87d7af, &H87d7d7, &H87d7ff, + &H87ff00, &H87ff5f, &H87ff87, &H87ffaf, &H87ffd7, &H87ffff, + &Haf0000, &Haf005f, &Haf0087, &Haf00af, &Haf00d7, &Haf00ff, + &Haf5f00, &Haf5f5f, &Haf5f87, &Haf5faf, &Haf5fd7, &Haf5fff, + &Haf8700, &Haf875f, &Haf8787, &Haf87af, &Haf87d7, &Haf87ff, + &Hafaf00, &Hafaf5f, &Hafaf87, &Hafafaf, &Hafafd7, &Hafafff, + &Hafd700, &Hafd75f, &Hafd787, &Hafd7af, &Hafd7d7, &Hafd7ff, + &Hafff00, &Hafff5f, &Hafff87, &Hafffaf, &Hafffd7, &Hafffff, + &Hd70000, &Hd7005f, &Hd70087, &Hd700af, &Hd700d7, &Hd700ff, + &Hd75f00, &Hd75f5f, &Hd75f87, &Hd75faf, &Hd75fd7, &Hd75fff, + &Hd78700, &Hd7875f, &Hd78787, &Hd787af, &Hd787d7, &Hd787ff, + &Hd7af00, &Hd7af5f, &Hd7af87, &Hd7afaf, &Hd7afd7, &Hd7afff, + &Hd7d700, &Hd7d75f, &Hd7d787, &Hd7d7af, &Hd7d7d7, &Hd7d7ff, + &Hd7ff00, &Hd7ff5f, &Hd7ff87, &Hd7ffaf, &Hd7ffd7, &Hd7ffff, + &Hff0000, &Hff005f, &Hff0087, &Hff00af, &Hff00d7, &Hff00ff, + &Hff5f00, &Hff5f5f, &Hff5f87, &Hff5faf, &Hff5fd7, &Hff5fff, + &Hff8700, &Hff875f, &Hff8787, &Hff87af, &Hff87d7, &Hff87ff, + &Hffaf00, &Hffaf5f, &Hffaf87, &Hffafaf, &Hffafd7, &Hffafff, + &Hffd700, &Hffd75f, &Hffd787, &Hffd7af, &Hffd7d7, &Hffd7ff, + &Hffff00, &Hffff5f, &Hffff87, &Hffffaf, &Hffffd7, &Hffffff, + &H080808, &H121212, &H1c1c1c, &H262626, &H303030, &H3a3a3a, + &H444444, &H4e4e4e, &H585858, &H606060, &H666666, &H767676, + &H808080, &H8a8a8a, &H949494, &H9e9e9e, &Ha8a8a8, &Hb2b2b2, + &Hbcbcbc, &Hc6c6c6, &Hd0d0d0, &Hdadada, &He4e4e4, &Heeeeee] +'Private $aaImage As New Byte[][] +Static Public Sub _init() + + ' Component.Load(Component.Path &/ "gb.Image") + ' Component.Load(Component.Path &/ "gb.Image.io") + + +End + + + + + +Public Sub _new() + + ' Dim aLine As Byte[] + ' Dim yPix As Byte + ' Dim y As Integer + ' Dim x As Integer + ' + ' $hImage = $hImage.Stretch(150, 100) + ' + ' For y = 0 To $hImage.Height + ' aline = New Byte[] + ' For x = 0 To $hImage.Width + ' aLine.Add(ConvTermColor(Color.SetAlpha($hImage[x, y], 0))) + ' Next + ' $aaImage.Add(aline) + ' Next + ' + ' + ' _Render + Me._ColorMode = TermColor.Mode256 + +End + +Private Function Image_Read() As Image + + Return $hImage + +End + +Private Sub Image_Write(Value As Image) + + $hImage = Value + +End + +Public Sub _Render() + + Dim img As Image + Dim x, y As Integer + Dim fg, bg As Integer + Dim hattr As New Attr + Dim hClientRect As Rect + Dim hChar As Char + Dim hRect As Rect = Me._GetRect() + + If Not Me._NeedRender Then Return + Super._Render + If $hImage = Null Then Return + 'Return + hClientRect = Me._GetClientRect() + 'img2 = $hImage.Copy() + 'hattr.ColorMode = TermColor.Mode256 + Select Case $iStretch + Case TermPictureBox.Cut + Case TermPictureBox.Fit + img = $hImage.Stretch(hClientRect.Width, (hClientRect.Height) * 2) + + Case TermPictureBox.Proportional + Case Else + 'AKA None + img = $hImage.Copy() + End Select + + Select Case $iAlignment + Case Align.Right + Case Align.Center + Case Else + 'AKA ALign.Left + End Select + + For y = 0 To img.Height - 1 Step 2 + For x = 0 To img.Width - 1 + hChar = New Char + + fg = ConvTermColor(Color.SetAlpha(img[x, y], 0)) + bg = ConvTermColor(Color.SetAlpha(img[x, y + 1], 0)) + hattr.ColorMode = TermColor.Mode256 + hattr.Foreground = fg + hattr.Background = bg + hChar.Attr = hattr.GetInteger() + hChar.c = &H2580 + 'Try + Me._Content[hClientRect.Top + y / 2][hClientRect.Left + x] = hChar + Next + Next + + 'Print + ' For y = 0 To $aaImage.Max Step 2 + ' For x = 0 To $aaImage[0].Max + ' fg = $aaImage[y][x] + ' Try bg = $aaImage[y + 1][x] + ' hattr.Foreground = fg + ' hattr.Background = bg + ' hattr.Send() + ' Print String.Chr(&H2580); + ' Next + ' Print + ' + ' + ' + ' + ' Next + Me._NeedRender = False + +End + +Private Function ConvTermColor(iTermColor As Integer) As Integer + + Dim i As Integer + Dim fMax As Float = 1 + Dim fCur As Float + Dim iCur As Integer + + For i = 0 To $aTermColor.Max + fcur = Color.Distance($aTermColor[i], iTermColor) + If fcur < fMax Then + fMax = fcur + iCur = i + Endif + Next + Return iCur + +End + +Private Function Stretch_Read() As Integer + + Return $iStretch + +End + +Private Sub Stretch_Write(Value As Integer) + + $iStretch = Value + +End + +Private Function Alignment_Read() As Integer + + Return $iAlignment + +End + +Private Sub Alignment_Write(Value As Integer) + + $iAlignment = Value + +End diff --git a/comp/src/gb.term.form/.src/TermRadioButton.class b/comp/src/gb.term.form/.src/TermRadioButton.class new file mode 100644 index 00000000..6b7e7a75 --- /dev/null +++ b/comp/src/gb.term.form/.src/TermRadioButton.class @@ -0,0 +1,112 @@ +' Gambas class file + +Export +Inherits TermControl +Class Rect +Property Text As String +Property Value As Boolean + + +Private $sText As String +Private $iOldLen As Integer +Private $bValue As Integer + + +Private Function Text_Read() As String + + Return $sText + +End + +Private Sub Text_Write(Value As String) + + $sText = Value + +End + +Public Sub _Render() + + Dim hAttr As New Attr + Dim iAttr As Integer + Dim i As Integer + Dim sALign As String + Dim hRectC As Rect = Me._GetClientRect() + Dim sValue As String + Dim iBC As Integer + + If Not Me._NeedRender Then Return + Super._Render + + sValue = IIf($bValue, "*", " ") + + sALign = "(" & sValue & ") " & $sText + + iBC = Me._GetBackGround() + If Me.HaveFocus Then iBC = TermColor.Focus + hAttr.Background = iBC + hAttr.Foreground = Me.Foreground + iAttr = hAttr.GetInteger() + + For i = 1 To Me._Content[0].count + If Me._Content[0][Me._Content[0].Max] And If i > Max($iOldLen, String.Len(sALign)) Then Break + If i <= String.Len(sALign) Then + Me._Content[0][i - 1] = Char(Mid(sALign, i, 1), iAttr) + Else + Me._Content[0][i - 1] = Char(" ", iAttr) + Endif + Next + + Me._NeedRender = False + +End + +Private Function Value_Read() As Boolean + + Return $bValue + +End + +Private Sub Value_Write(Value As Boolean) + If $bValue = Value Then Return + If Value Then SetChecked + $bValue = Value + Me.Refresh + '$iValue = Max(Min(Value, 1), -1) +End + +Private Sub SetChecked() + + Dim hParent As TermContainer = Me.Parent + Dim hCtrl As Object + + For Each hCtrl In hParent.Children + If hCtrl Is TermRadioButton Then + If hCtrl.Value Then hCtrl.Value = False + Endif + Next + +End + + + + + +Public Sub _MouseUp() + + Me.Value = True + Super._MouseUp + Super._Click + 'Me._NeedRender = True + 'Me.Refresh +End + + + +Public Sub _KeyPress() + + If Key.Text = " " Then + Me.Value = True + Endif + Super._Click + Super._KeyPress +End diff --git a/comp/src/gb.term.form/.src/TermScrollBar.class b/comp/src/gb.term.form/.src/TermScrollBar.class new file mode 100644 index 00000000..cd18cc77 --- /dev/null +++ b/comp/src/gb.term.form/.src/TermScrollBar.class @@ -0,0 +1,173 @@ +' Gambas class file + +Export +Inherits TermControl + +Property MinValue As Integer +Property MaxValue As Integer +Property Value As Integer + +Private $iMaxValue As Integer = 5 +Private $iMinValue As Integer +Private $iValue As Integer +Private $bInCursor As Boolean +Private $iCursorPos As Integer + +Event Change + +Public Sub _new() + + Me.MaxValue = 5 + Me.Value = 5 + +End + +Private Function MinValue_Read() As Integer + + Return $iMinValue + +End + +Private Sub MinValue_Write(Value As Integer) + + $iMinValue = Max(Value, 0) + Me.Refresh + +End + +Private Function MaxValue_Read() As Integer + + Return $iMaxValue + +End + +Private Sub MaxValue_Write(Value As Integer) + + $iMaxValue = Value + Me.Refresh + +End + +Private Function Value_Read() As Integer + + Return $iValue + +End + +Private Sub Value_Write(Value As Integer) + + $iValue = Max(Min($iMaxValue, Value), $iMinValue) + Me.Refresh + Raise Change + +End + +Public Sub _Render() + + Dim hAttr As New Attr + Dim iAttr As Integer + Dim i As Integer + Dim iHeight As Integer + + If Not Me._NeedRender Then Return + + Super._Render + + If Me.HaveFocus Then + hAttr.Background = TermColor.Yellow + Else + hAttr.Background = Me._GetBackGround() + Endif + + hAttr.Foreground = Me._GetForeground() + iAttr = hAttr.GetInteger() + + If Me.Height >= Me.Width Then + iHeight = Me.Height - 3 + + For i = 1 To Me._Content.Count - 3 + Me._Content[i][0] = Char(String.Chr(&H2591), iAttr) + + Next + + Me._Content[0][0] = Char(String.Chr(&H25B2), iAttr) + Me._Content[Me._Content.Count - 2][0] = Char(String.Chr(&H25BC), iAttr) + + If Me.MaxValue > 0 Then + $iCursorPos = Ceil($iValue / ($iMaxValue - $iMinValue) * iHeight) + 1 + Me._Content[$iCursorPos][0] = Char(String.Chr(&H2588), iAttr) + Endif + + Else + iHeight = Me.Width - 3 + + For i = 1 To Me._Content[0].max - 1 + + Me._Content[0][i] = Char(String.Chr(&H2591), iAttr) + + Next + + Me._Content[0][0] = Char(String.Chr(&H25C0), iAttr) + Me._Content[0][Me._Content[0].Max] = Char(String.Chr(&H25BA), iAttr) + + If Me.MaxValue > 0 Then + $iCursorPos = Ceil($iValue / ($iMaxValue - $iMinValue) * iHeight) + 1 + Me._Content[0][$iCursorPos] = Char(String.Chr(&H2588), iAttr) + Endif + + Endif + Me._NeedRender = False + +End + +Public Sub _MouseDown() + + If Me.Height > Me.Width Then + If Mouse.Row = 0 Then + Dec Me.Value + Else + If Mouse.Row = Me.Height - 1 Then + + Inc Me.Value + Else + If Mouse.Row = $iCursorPos Then $bInCursor = True + + Endif + Endif + Else + If Mouse.Col = 0 Then + Dec Me.Value + Else + If Mouse.Col = Me.Width - 1 Then + Inc Me.Value + Else + If Mouse.Col = $iCursorPos Then $bInCursor = True + Endif + Endif + + Endif + Super._MouseDown + +End + +Public Sub _MouseUp() + + $bInCursor = False + Super._MouseUp + +End + +Public Sub _MouseMove() + + Dim iHeight As Integer + + If Me.Height > Me.Width Then + + Me.Value = (Mouse.Row - 1) / (Me.Height - 3) * ($iMaxValue - $iMinValue) + Else + Me.Value = (Mouse.Col - 1) / (Me.Width - 3) * ($iMaxValue - $iMinValue) + Endif + + Super._MouseMove + +End diff --git a/comp/src/gb.term.form/.src/TermTextBox.class b/comp/src/gb.term.form/.src/TermTextBox.class new file mode 100644 index 00000000..9df4c3e6 --- /dev/null +++ b/comp/src/gb.term.form/.src/TermTextBox.class @@ -0,0 +1,187 @@ +' Gambas class file + +Export +Inherits TermControl + +Class Rect + +Public Const _DrawWith As String = "TextBox" + +Property Text As String + +Private $sText As String +Private $iOldLen As Integer +Property Height As Integer +Private $iCursor As Integer +Private $iLenText As Integer + +Event Change +Event Activate + +Public Sub _new() + + Me._AllowFocus = True + 'Me.Height = 1 + +End + +Public Sub _Render() + + Dim hAttr As New Attr + Dim iAttr As Integer + Dim i As Integer + + If Not Me._NeedRender Then Return + Super._Render + If Me.HaveFocus Then + hAttr.Background = TermColor.Yellow + Else + hAttr.Background = Me._GetBackGround() + Endif + hAttr.Foreground = Me._GetForeground() + iAttr = hAttr.GetInteger() + + For i = 1 To Me._Content[0].count + If Me._Content[0][Me._Content[0].Max] And If i > Max($iOldLen, $iLenText) Then Break + If i <= $iLenText Then + Me._Content[0][i - 1] = Char(Mid($sText, i, 1), iAttr) + Else + Me._Content[0][i - 1] = Char(" ", iAttr) + Endif + Next + If Me.HaveFocus Then + hAttr.FillFrom(iAttr) + hAttr.Blink = True + If $iCursor < Me.Width Then + If $iCursor >= $iLenText Then + Me._Content[0][$iLenText] = Char(String.Chr(&H258F), hAttr.GetInteger()) + hAttr.Blink = False + Me._Content[0][$iLenText + 1] = Char(" ", hAttr.GetInteger()) + Else + Swap hAttr.Background, hAttr.Foreground + Me._Content[0][$iCursor].Attr = hAttr.GetInteger() + Endif + Endif + 'Me._Content[0][string.Len($sText)].Attr = hAttr.GetInteger() + Endif + Me._NeedRender = False + +End + +Private Function Text_Read() As String + + Return $sText + +End + +Private Sub Text_Write(Value As String) + + $iOldLen = String.len($sText) + $sText = Value + $iLenText = String.Len(Value) + RefreshText + ' TermWindows.SetRenderArea(rect(Me.ScreenX, Me.ScreenY, Max($iOldLen + 1, $iLenText), Me.Height)) + ' Me._NeedRender = True + ' Termwindows._Render() + +End + +Public Sub _KeyPress() + Dim sText As String = Me.Text + Select Case Key.Code + Case Key.BackSpace + '$iOldLen = $iLenText + If $iCursor >= $iLenText Then + sText = Left(sText, -1) + Else + If $iCursor = 0 Then + + Else + Mid(sText, $iCursor, 1) = "" + Endif + Endif + '$iLenText = String.Len($sText) + + $iCursor = Max(0, Min($iLenText, $iCursor - 1)) + Me.Text = sText + Raise Change + Case Key.Left + $iCursor = Max(0, Min($iLenText, $iCursor - 1)) + RefreshText + Case Key.Right + $iCursor = Max(0, Min($iLenText, $iCursor + 1)) + RefreshText + Case Key.Home + $iCursor = 0 + RefreshText + Case Key.End + $iCursor = $iLenText + RefreshText + Case Key.Return + Raise Activate + Case Else + If $iCursor >= $iLenText Then + sText &= Key.Text + Else + If $iCursor = 0 Then + sText = Key.Text & sText + Else + sText = Left(sText, $iCursor) & Key.Text & Right(sText, - $iCursor) + Endif + Endif + Inc $iCursor + Me.Text = sText + Raise Change + End Select + Super._KeyPress + +End + +Private Sub RefreshText() + + TermWindows.SetRenderArea(rect(Me.ScreenX, Me.ScreenY, Max($iOldLen + 1, $iLenText + 1), Me.Height)) + Me._NeedRender = True + Termwindows._Render() + +End + +Private Function Height_Read() As Integer + + Return Super.Height + +End + +Private Sub Height_Write(Value As Integer) + +End + +Public Sub _GetBackGround() As Integer + + If Me.Background = -1 Then + Return TermColor.TextBackground + Else + Return Me.Background + Endif + +End + +Public Sub _GetForeGround() As Integer + + If Me.Foreground = -1 Then + Return TermColor.TextForeground + Else + Return Me.Foreground + Endif + +End + +Public Sub _MouseDown() + Dim iPos As Integer = Min(Mouse.x, String.Len($sText)) + If iPos <> $iCursor Then + + $iCursor = iPos + RefreshText + Endif + Super._MouseDown + +End diff --git a/comp/src/gb.term.form/.src/TermVBox.class b/comp/src/gb.term.form/.src/TermVBox.class new file mode 100644 index 00000000..cd221cf1 --- /dev/null +++ b/comp/src/gb.term.form/.src/TermVBox.class @@ -0,0 +1,11 @@ +' Gambas class file + +Export +Inherits TermContainer +Public Sub _new() + + Super._Arrangement = Arrange.Vertical + 'Super.Border = 1 + 'Super._Shadow = True + 'Super.Padding = 1 +End diff --git a/comp/src/gb.term.form/.src/TermWindow.class b/comp/src/gb.term.form/.src/TermWindow.class new file mode 100644 index 00000000..dbd0ea7c --- /dev/null +++ b/comp/src/gb.term.form/.src/TermWindow.class @@ -0,0 +1,577 @@ +' Gambas class file + +Create Static +Export +Inherits TermContainer +Class Rect +Private $sText As String +Property Arrangement As Integer +Property Text, Title As String +Property Maximized As Boolean +Property Read Active As Boolean +Property Resizable As Boolean +Property Visible As Boolean +Property Left, X, Column As Integer +Property Top, Y, {Line} As Integer +Property Width, W As Integer +Property Height, H As Integer +Property Persistent As Boolean +Private $bOpen As Boolean +Private $rectOldPos As Rect +Private $bMaximized As Boolean +Private $iInMove As Integer +Private $tmrMove As Timer +Private $iTmpCol As Integer +Private $iTmpRow As Integer +Private $bResizable As Boolean +Private $bInResize As Boolean +Private $iFocusedId As Integer +Private $bPersistent As Boolean +Property Read ScreenY As Integer +Property Read ScreenX As Integer + +Public _IsModal As Boolean + +Event Close +Event Open + +Public Sub _new() + + Me.Visible = False + $iFocusedId = Me.id + Object.Attach(Me, Me, "TermForm") + +End + +' Static Public Sub Main() +' +' Dim hObject As Object +' +' hObject = Application.Startup.AutoCreate() +' 'If Not hObject Is Report Then Return +' 'FPreview.Run(hObject) +' TermWindows._Render +' +' End + +Public Sub _Render() + + Dim i As Integer + Dim hAttr As New Attr + Dim iAttr As Integer + Dim b As Boolean = Me._NeedRender + + Super._Render + If Not b Then Return + + 'Render TitleBar + If Me.Border > 0 Then + hAttr.Background = IIf(Me.Active, TermColor.ActiveWindow, TermColor.InactiveWindow) + hAttr.Foreground = TermColor.White + hAttr.Bold = True + iAttr = hAttr.GetInteger() + + For i = 0 To Me.Width - 1 '- 2 + Me._Content[0][i] = Char(" ", iAttr) + Next + + Me._Content[0][0].c = Asc("[") + Me._Content[0][1].c = Asc("]") + + For i = 1 To Min(Me._Content[0].Max, String.Len($sText)) - 2 + Me._Content[0][i + 2].c = Asc(Mid($sText, i, 1)) + Next + Me._Content[0][Me._Content[0].Max].c = Asc("X") + Endif + Me._NeedRender = False + + If Me.Resizable Then + hAttr.Background = Me.Background + hAttr.Foreground = Me.Foreground + hAttr.Bold = False + iAttr = hAttr.GetInteger() + + If Not $bMaximized Then Me._Content[Me._Content.Max - 1][Me._Content[0].Max].c = &h25E2 + Endif + 'Catch + +End + +Private Function Text_Read() As String + + Return $sText + +End + +Private Sub Text_Write(Value As String) + + Dim bNeedLayout As Boolean + + If Len($sText) > 0 And Value = "" Then bNeedLayout = True + If $sText = "" And Value <> "" Then bNeedLayout = True + $sText = Value + Me._NeedRender = True + If bNeedLayout Then + TermWindows.SetRefreshArea(Rect(Me.ScreenX, Me.ScreenY, Me.Width, Me.Height)) + Else + TermWindows.SetRenderArea(Rect(Me.ScreenX, Me.ScreenY, Me.Width, 1)) + Endif + TermWindows._Render + +End + +Public Sub _Arrange() + + 'Me._GetClientRect().Move(0, 1, Me.W - 1, Me.Height - 1) + Super._Arrange + +End + +Private Function Maximized_Read() As Boolean + + Return $bMaximized + +End + +Private Sub Maximized_Write(Value As Boolean) + + If $bMaximized = Value And If $bMaximized Then + $bMaximized = False + Me.Move(0, 0, Desktop.Width, Desktop.Height) + $bMaximized = True + Return + Endif + + If Value Then + $rectOldPos = Me._GetRect() + Me.Move(0, 0, Desktop.Width, Desktop.Height) + $bMaximized = Value + Else + If $bMaximized <> value Then + $bMaximized = Value + Me.Move($rectOldPos.Left, $rectOldPos.Top, $rectOldPos.Width, $rectOldPos.Height) + Endif + Endif + +End + +Public Sub _ScreenResize() + + Me.Maximized = $bMaximized + ' If $bMaximized Then + ' Me.Move(0, 0, Desktop.Width, Desktop.Height) + ' + ' Endif + +End + +Public Sub Center() + + Me.Move((Desktop.Width - Me.Width) / 2, (Desktop.Height - Me.Height) / 2, Me.Width, Me.Height) + +End + +Public Sub Close() + + Dim hCont As TermControl + + Me.Visible = False + Raise Close + + If Not Me.Persistent Then + TermWindows.Delete(Me) + Endif + +End + +Public Sub _MouseUp() + + If Mouse.ScreenY = Me.ScreenY Then + If Mouse.ScreenX = Me.ScreenX + Me.Width - 1 Then + Me.Close + Return + Endif + If Mouse.X >= 0 And If Mouse.x <= 1 Then + Me.Maximized = Not Me.Maximized + Endif + Endif + $tmrMove = Null + $iInMove = 0 + $bInResize = False + Super._MouseUp + +End + +Public Sub _MouseDown() + + If Mouse.Left + If Not Me.Active Then Termwindows._RaiseWindow(Me) + If Mouse.y = 0 Then + $iInMove = Mouse.Col + $tmrMove = New Timer As "_tmrMove" + $tmrMove.Delay = 100 + Endif + If Mouse.y = Me.Height - 1 And Mouse.x = Me.Width - 1 Then + If Me.Resizable And If Not Me.Maximized Then + $tmrMove = New Timer As "_tmrMove" + $tmrMove.Delay = 100 + $bInResize = True + Endif + Endif + Endif + Super._MouseDown + +End + +Public Sub _MouseMove() + + If $iInMove > 0 Then + $iTmpCol = Mouse.ScreenCol - $iInMove + $iTmpRow = Mouse.ScreenRow + $tmrMove.Start + 'Me.Move(Mouse.ScreenX - $iInMove, Mouse.screeny) + Endif + + If $bInResize Then + $iTmpCol = Mouse.ScreenCol - Me.ScreenX + $iTmpRow = Mouse.ScreenRow - Me.ScreenY + $tmrMove.Start + Endif + Super._MouseMove + +End + +Private Function Active_Read() As Boolean + + Return TermWindows.GetActiveWindow() = Me + +End + +Public Sub _tmrMove_Timer() + + If $bInResize Then + Me.Move(Me.Left, Me.Top, $iTmpCol, $iTmpRow) + $tmrMove.Stop + Else + Me.Move($iTmpCol, $iTmpRow) + $tmrMove.Stop + Endif + +End + +Public Sub Activate() + + TermWindows._RaiseWindow(Me) + +End + +Private Function Resizable_Read() As Boolean + + Return $bResizable + +End + +Private Sub Resizable_Write(Value As Boolean) + + $bResizable = Value + +End + +Private Function Top_Read() As Integer + + Return Super.Top + +End + +Private Sub Top_Write(Value As Integer) + + If $bMaximized Then Return + Super.Top = Value + +End + +Private Function Left_Read() As Integer + + Return Super.Left + +End + +Private Sub Left_Write(Value As Integer) + + If $bMaximized Then Return + Super.Left = Value + +End + +Private Function Height_Read() As Integer + + Return Super.H + +End + +Private Sub Height_Write(Value As Integer) + + If $bMaximized Then Return + If value < 3 Then Return + Super.H = Value + +End + +Private Function Width_Read() As Integer + + Return Super.W + +End + +Private Sub Width_Write(Value As Integer) + + If $bMaximized Then Return + If value < 5 Then Return + Super.Width = Value + +End + +Public Sub Move(Left As Integer, Top As Integer, Optional Width As Integer, Height As Integer) + + If $bMaximized Then Return + Super.Move(Left, Top, Width, Height) + +End + +Public Sub Resize(Width As Integer, Height As Integer) + + If $bMaximized Then Return + Super.Resize(Width, Height) + +End + +Public Sub GetNextFocusedControl(hCtrl As TermControl, Optional bFirst As Boolean) As TermControl + + Dim hNext As Object + Dim hParent As TermContainer + Dim aChildren As TermControl[] + Dim i As Integer + 'On stock le control passé en argument + Dim hFirst As TermControl = hCtrl + Dim hCont As TermContainer + + hCont = hCtrl.Parent + If Not hCont Then Return Null + 'Trouver le parent du control + aChildren = hCont.Children + 'et la position du control + i = aChildren.Find(hCtrl) + + Do + 'Il n 'y a pas d'enfant a suivre + If i = aChildren.Max Then + 'le control a t'il un parent ? + hParent = aChildren[i].Parent.Parent + If hParent Then + hNext = Null + If hParent.Children.Count > 0 Then hNext = GetNextFocusedControl(hParent.Children[hParent.Children.Find(aChildren[i].Parent)]) + If hNext Then Return hNext + Endif + i = 0 + Else + 'On passe a l'enfant suivant + If Not bFirst Then Inc i + + Endif + + hNext = aChildren[i] + 'Si on reviens au point de départ c'est qu'on a rien trouve + If Not bFirst And If hNext = hFirst Then Return Null + bFirst = False + 'si c'est un conteneur + If hNext Is TermContainer Then + 'parcourir le conteneur + hCtrl = Null + 'si le conteneur a des enfants + If hNext.Children.Count > 0 Then hCtrl = GetNextFocusedControl(hNext.Children[0], True) + 'si on a trouve on Return l'enfant + If hCtrl Then Return hCtrl + 'sinon on passe a l'enfant suivant en repartant de l'enfant courant + Continue + 'si c'est pas un conteneur + Else + 'on verifie si le control accepte le focus + 'si oui on le Return + If hNext._AllowFocus Then Return hNext + 'sinon on passe au control suivant + Continue + Endif + + Loop + +End + +Public Sub GetPrevFocusedControl(hCtrl As TermControl, Optional bFirst As Boolean) As TermControl + + Dim hNext As Object + Dim hParent As TermContainer + Dim aChildren As TermControl[] + Dim i As Integer + 'On stock le control passé en argument + Dim hFirst As TermControl = hCtrl + 'Trouver le parent du control + aChildren = hCtrl.Parent.Children + 'et la position du control + i = aChildren.Find(hCtrl) + + Do + If i = 0 Then + 'le control a t'il un parent ? + hParent = aChildren[i].Parent.Parent + If hParent Then + hNext = Null + If hParent.Children.Count > 0 Then hNext = GetNextFocusedControl(hParent.Children[hParent.Children.Find(aChildren[i].Parent)]) + If hNext Then Return hNext + Endif + i = aChildren.Max + Else + 'On passe a l'enfant suivant + If Not bFirst Then Dec i + + Endif + + hNext = aChildren[i] + 'Si on reviens au point de départ c'est qu'on a rien trouve + If Not bFirst And If hNext = hFirst Then Return Null + + bFirst = False + 'si c'est un conteneur + If hNext Is TermContainer Then + 'parcourir le conteneur + hCtrl = Null + 'si le conteneur a des enfants + If hNext.Children.Count > 0 Then hCtrl = GetNextFocusedControl(hNext.Children[hNext.Children.Max], True) + 'si on a trouve on Return l'enfant + If hCtrl Then Return hCtrl + 'sinon on passe a l'enfant suivant en repartant de l'enfant courant + Continue + 'si c'est pas un conteneur + Else + 'on verifie si le control accepte le focus + 'si oui on le Return + If hNext._AllowFocus Then Return hNext + 'sinon on passe au control suivant + Continue + Endif + + Loop + +End + +Public Sub _SetFocus(hCtrl As TermControl) + + Dim hPrev As TermControl + + hPrev = TermControl._IdToControl[$iFocusedId] + If hPrev Then + hPrev._LostFocus + hPrev.Refresh + Endif + + $iFocusedId = hCtrl.Id + +End + +Public Function _GetCurrentFocusId() As Integer + + Return $iFocusedId + +End + +Public Sub _KeyPress() + + Dim hCtrl As TermControl + + If Key.Code = Key.Tab Then + hCtrl = GetNextFocusedControl(TermControl._IdToControl[$iFocusedId]) + If hCtrl Then hCtrl.SetFocus + Return + Endif + If Key.Code = Key.BackTab Then + GetPrevFocusedControl(TermControl._IdToControl[$iFocusedId]).SetFocus + Return + Endif + Super._KeyPress + hCtrl = TermControl._IdToControl[$iFocusedId] + If hCtrl <> Me Then hCtrl._KeyPress + +End + +Private Function Persistent_Read() As Boolean + + Return $bPersistent + +End + +Private Sub Persistent_Write(Value As Boolean) + + $bPersistent = Value + +End + +Public Sub _GetClientRect() As Rect + ' If Me Is TermFrame Then Stop + '_DefineRect + + Dim hRect As Rect = Super._GetClientRect() + + If Me.Border < 1 And Me.Title <> "" Then + hRect.y += 1 + hRect.Height -= 1 + Endif + Return hRect + +End + +Private Function Visible_Read() As Boolean + + Return Super.Visible + +End + +Private Sub Visible_Write(Value As Boolean) + + If Value And If Not $bOpen Then + Raise Open + $bOpen = True + Endif + + Super.Visible = Value + +End + +Private Function ScreenY_Read() As Integer + + Return Me.Top + +End + +Private Function ScreenX_Read() As Integer + + Return Me.Left + +End + +Public Sub ShowModal() + + Me._IsModal = True + Me.Show + +End + +Private Function Arrangement_Read() As Integer + + Return Me._Arrangement + +End + +Private Sub Arrangement_Write(Value As Integer) + + Me._Arrangement = Value + +End diff --git a/comp/src/gb.term.form/.src/TermWindows.class b/comp/src/gb.term.form/.src/TermWindows.class new file mode 100644 index 00000000..a60f1f1e --- /dev/null +++ b/comp/src/gb.term.form/.src/TermWindows.class @@ -0,0 +1,715 @@ +' Gambas class file + +Export +Create Static +Class Rect +Static Private Obs As Observer +Static Private $aScreen As New Integer[] +Static $hFile As File +Static Private $RectRefreshArea As Rect +Static Private $aChildren As New TermWindow[] +Static Private $hRect As Rect +Static Private $RectRenderArea As Rect +Static Public {Debug} As Integer +Static Private $Index As Integer +Static Private $bThisIsTheEnd As Boolean +Static Private $bInRender As Boolean +Static Private $hCurControl As TermControl +Static Private $iActiveWindow As Integer +Static Public bLock As Boolean +Static Private $hStream As File + +Public Enum DebugNone, DebugInput, DebugOutput + +Static Public Sub _init() + + Dim hRect As Rect + Dim hSetting As TerminalSettings + + Component.Load("gb.geom") + + hRect = New Rect(0, 0, 3, 3) + + $hFile = Open File.In.Term.Name For Read Watch + obs = New Observer(File.In) As "Terminal" + + hSetting = File.In.Term.GetAttr() + 'hSetting.ICANON = False + 'hSetting.ECHO = False + hSetting.MakeRaw + File.In.Term.SetAttr(Term.TCSANOW, hSetting) + 'saveSetting(hSetting) + Print "\e[?1002h\e[?1006h\e[?1049h\e[?25l\e[?2h"; + Print "\e[8;30;200"; + ResizeScreen(File.Out.Term.Width, File.Out.Term.Height) + +End + +Static Private Sub ResizeScreen(Width As Integer, Height As Integer) + + $aScreen = New Integer[Height, Width] + $hRect = Rect(0, 0, Width, Height) + $RectRefreshArea = $hRect.Copy() + +End + +Public Sub _Add(hWin As TermWindow) + + Dim i As Integer + Dim hCurACtive As TermWindow + + + hCurActive = TermControl._IdToControl[$iActiveWindow] + If hCurACtive Then + hCurACtive._NeedRender = True + SetRenderArea(hCurACtive._getrect()) + Endif + $aChildren.Add(hWIn) + $iActiveWindow = hWin.id + + ' For i = 0 To $aChildren.Max - 1 + ' SetRenderArea($aChildren[i]._GetRect()) + ' $aChildren[i]._NeedRender = True + ' Next +End + +Static Public Sub _RefreshScreen() + + $RectRefreshArea = $hRect.Copy() + _Render + +End + +'Recalculate the refresh zone +Static Public Sub DoRefreshArea() + + Dim hChild As TermWindow + Dim hRect As Rect + + If Not $RectRefreshArea Then Return + DoArrange() + 'refresh desktop + 'Try + RefreshDesktop($hRect.InterSection($RectRefreshArea)) + 'Resfresh windows + For Each hChild In $aChildren + hRect = $hRect.InterSection($RectRefreshArea) + 'Try + RefreshChild(hChild, hRect) + Next + + SetRenderArea($RectRefreshArea) + $RectRefreshArea = Null + +End + +Static Private Sub RefreshDesktop(rectUpdate As Rect) + + Dim L, C As Integer + + For L = rectUpdate.Top To rectUpdate.Bottom - 1 + For C = rectUpdate.Left To rectUpdate.Right - 1 + $aScreen[l, C] = 0 + Next + Next + +End + +Static Private Sub RefreshChild(hChild As Object, hRect As Rect) + + Dim rectUpdate As Rect + Dim L, C As Integer + Dim hObj As Object + 'On définit la zone de + rectUpdate = hRect.InterSection(hChild._GetScreenRect()) + 'L 'objet est invisible alors fin + If Not hChild.Visible Then Return + 'La zone n'existe pas alors fin + If Not rectUpdate Then Return + + 'Remplissage de la zone de calepinageavec l'id de l'objet + + For L = rectUpdate.Top To rectUpdate.Bottom - 1 + For C = rectUpdate.Left To rectUpdate.Right - 1 + $aScreen[l, C] = hChild.Id + Next + Next + + 'L'objet est un conteneur ? + If hChild Is TermContainer Then + 'On applique la Client Zone + rectUpdate = hRect.InterSection(hChild._GetScreenClientRect()) + If Not IsNull(rectUpdate) Then + For Each hObj In hChild.Children + + RefreshChild(hObj, rectUpdate) + Next + Endif + Endif + +End + +' Static Private Sub RefreshChild(hChild As Object, hRect As Rect) +' +' Dim iLeft, iRight, iTop, iBottom As Integer +' +' Dim L As Integer +' Dim C As Integer +' Dim hObj As Object +' Dim rectUpdate As Rect +' Dim iMove, iResize As Integer +' 'If hChild Is Window Then Stop +' +' rectUpdate = hRect.Intersection(hChild._GetScreenRect()) +' If hChild.Visible = False Then Return +' If Not rectUpdate Then Return +' +' For L = rectUpdate.Top To rectUpdate.Bottom - 1 +' For C = rectUpdate.Left To rectUpdate.Right - 1 +' $aScreen[l, C] = hChild.Id +' Next +' Next +' +' +' If hChild Is TermContainer Then +' imove = If(hChild.Border > 0, 1, 0) + hChild.Padding +' iResize = iMove * 2 + If(hChild._Shadow, 1, 0) +' rectUpdate.Move(rectUpdate.Left + iMove, rectUpdate.Top + imove, rectUpdate.Width - iResize, rectUpdate.Height - iResize) +' For Each hObj In hChild.Children +' +' RefreshChild(hObj, rectUpdate) +' Next +' +' Endif +' +' End + +Static Public Sub Terminal_Resize() + + Dim hWin As TermWindow + + ResizeScreen(File.Out.Term.Width, File.Out.Term.Height) + For Each hWin In $aChildren + hWin._ScreenResize + Next + 'Try + SetRefreshArea(Rect(0, 0, Desktop.Width, Desktop.Height)) + _Render + +End + +Static Public Sub File_Read() + + Dim s, ss, sss As String + Dim ai As Integer[] + Dim hControl As TermControl + Dim R, C As Integer + Dim i As Integer + Dim b As Byte + Dim ab As Byte[] + Dim bnoesc As Boolean + Dim iPos As Integer = 1 + Dim iPos2 As Integer + Dim bControl As Boolean + Dim bInEscapeSec As Boolean + Dim bFound As Boolean + Dim aa As String[] + Dim bAlt As Boolean + 'Dim bControl As Boolean + Dim bShift As Boolean + + s = Read #$hFile, Lof($hFile) + bnoesc = InStr(s, "\e", 0) = -1 + 'Inc $index + + If s = "" Then Return + Do + ss = Mid(s, iPos, 1) + If ss = "\e" Then + bInEscapeSec = True + Inc ipos + Endif + + If bInEscapeSec Then + 'Is a mouse sequence ? + If Mid(s, ipos, 2) = "[<" Then + 'find the end of the sequence + i = InStr(s, "m", iPos, gb.IgnoreCase) + If i > -1 Then + sss = Mid(s, ipos + 2, i - (ipos + 1)) + ai = Split(Left(sss, -1), ";") + iPos = i + 1 + 'Mouse._setstate(x,y,Left, middle, right,delta) + ai[2] -= 1 + ai[1] -= 1 + Try hControl = TermControl._IdToControl[$aScreen[ai[2], ai[1]]] + If Error Then hControl = Null + Select Case ai[0] + 'Mouse move with left button down + Case 32 + 'Mouse._SetState(hControl, ai[1], ai[2], True,,, 0) + RaiseMouseEvent(hControl, "_MouseMove", ai[1], ai[2], True,,, 0) + 'Mouse move with right button down + Case 34 + 'Mouse._SetState(hControl, ai[1], ai[2],,, True, 0) + RaiseMouseEvent(hControl, "_MouseMove", ai[1], ai[2],,, True, 0) + 'Button left down Or up + Case 0 + 'Mouse._SetState(hControl, ai[1], ai[2], Right(s, 1) = "M",,, 0) + RaiseMouseEvent(hControl, IIf(Right(s, 1) = "M", "_MouseDown", "_MouseUp"), ai[1], ai[2], Right(s, 1) = "M",,, 0) + 'Button middle down Or up + Case 1 + 'Mouse._SetState(hControl, ai[1], ai[2],, Right(s, 1) = "M",, 0) + RaiseMouseEvent(hControl, IIf(Right(s, 1) = "M", "_MouseDown", "_MouseUp"), ai[1], ai[2],, Right(s, 1) = "M",, 0) + 'Button right down or up + Case 2 + 'Mouse._SetState(hControl, ai[1], ai[2],,, Right(s, 1) = "M", 0) + RaiseMouseEvent(hControl, IIf(Right(s, 1) = "M", "_MouseDown", "_MouseUp"), ai[1], ai[2],,, Right(s, 1) = "M", 0) + 'Mouse wheel up or down + Case 64, 65 + 'Mouse._SetState(hControl, ai[1], ai[2],,,, IIf(ai[0] = 64, -1, 1)) + RaiseMouseEvent(hControl, "_MouseWheel", ai[1], ai[2],,,, IIf(ai[0] = 64, -1, 1)) + End Select + + Endif + + bInEscapeSec = False + Continue + Endif + i = 10 + ipos2 = 10 + ' If String.InStr(S, "B") Then Stop + For Each ss In ["~", "A", "B", "C", "D", "H", "F", "P", "Q", "R", "S", "M", "Z"] + i = InStr(s, ss, ipos) + If i = 0 Then Continue + ipos2 = Min(ipos2, i) + Next + Inc ipos2 + sss = Mid(s, ipos, ipos2 - ipos) + aa = Split(sss, ";") + bInEscapeSec = False + bShift = False + bControl = False + bAlt = False + If aa.Count > 1 Then + aa[0] &= Right(aa[1], 1) + aa[1] = Left(aa[1], 1) + If aa[1] = "2" Then bShift = True + If aa[1] = "3" Then bAlt = True + If aa[1] = "5" Then bControl = True + Endif + Select Case aa[0] + Case "OA", "[A" + 'Key.Up + Key._SetKey("", Key.Up, bAlt, bControl, bShift) + bFound = True + + Case "OB", "[B" + 'Key.Down + Key._SetKey("", Key.Down, bAlt, bControl, bShift) + bFound = True + + Case "OC", "[C" + 'Key.Right + Key._SetKey("", Key.Right, bAlt, bControl, bShift) + bFound = True + + Case "OD", "[D" + 'Key.Left + Key._SetKey("", Key.Left, bAlt, bControl, bShift) + bFound = True + + 'Case + 'Key.Enter, Key.Return + ' sText = If(hScreen.NewlineMode, "\r\n", "\n") + + Case "OH", "[H" + 'Key.Home + 'sText="\e[1~" + Key._SetKey("", Key.Home, bAlt, bControl, bShift) + bFound = True + + Case "OF", "[F" + 'Key.End + Key._SetKey("", Key.End, bAlt, bControl, bShift) + bFound = True + Case "OP", "[1P" + 'Key.F1 + Key._SetKey("", Key.F1, bAlt, bControl, bShift) + bFound = True + + Case "OQ", "[1Q" + 'Key.F2 + Key._SetKey("", Key.F2, bAlt, bControl, bShift) + bFound = True + + Case "OR", "[1R" + 'Key.F3 + Key._SetKey("", Key.F3, bAlt, bControl, bShift) + bFound = True + + Case "OS", "[1S" + 'Key.F4 + Key._SetKey("", Key.F4, bAlt, bControl, bShift) + bFound = True + Case "OM" + 'Key.Return, Key.Enter + Key._SetKey("", Key.Return, bAlt, bControl, bShift) + bFound = True + + Case "[Z" + 'Key.BackTab + Key._SetKey("", Key.BackTab, bAlt, bControl, bShift) + bFound = True + + Case "[2~" + 'Key.Insert + Key._SetKey("", Key.Insert, bAlt, bControl, bShift) + bFound = True + + Case "[3~" + 'Key.Delete + Key._SetKey("", Key.Delete, bAlt, bControl, bShift) + bFound = True + + Case "[6~" + 'Key.PageDown + Key._SetKey("", Key.PageDown, bAlt, bControl, bShift) + bFound = True + + Case "[5~" + 'Key.PageUp + Key._SetKey("", Key.PageUp, bAlt, bControl, bShift) + bFound = True + + Case "[15~" + 'Key.F5 + Key._SetKey("", Key.F5, bAlt, bControl, bShift) + bFound = True + + Case "[17~" + 'Key.F6 + Key._SetKey("", Key.F6, bAlt, bControl, bShift) + bFound = True + + Case "[18~" + 'Key.F7 + Key._SetKey("", Key.F7, bAlt, bControl, bShift) + bFound = True + + Case "[19~" + 'Key.F8 + Key._SetKey("", Key.F8, bAlt, bControl, bShift) + bFound = True + + Case "[20~" + 'Key.F9 + Key._SetKey("", Key.F9, bAlt, bControl, bShift) + bFound = True + + Case "[21~" + 'Key.F10 + Key._SetKey("", Key.F10, bAlt, bControl, bShift) + bFound = True + + Case "[23~" + 'Key.F11 + Key._SetKey("", Key.F11, bAlt, bControl, bShift) + bFound = True + + Case "[24~" + 'Key.F12 + Key._SetKey("", Key.F12, bAlt, bControl, bShift) + bFound = True + + Case "[29~" + 'menu + Key._SetKey("", Key.Menu, bAlt, bControl, bShift) + bFound = True + End Select + If bFound Then + ipos = ipos2 + Endif + + bFound = False + + Else + + 'Normal Characters + + ss = Mid(s, iPos, 1) + 'Key._SetKey(s, bControl) + Select Case ss + Case "\n" + Key._SetKey(ss, Key.Return, bAlt, bControl, bShift) + Case "\t" + Key._SetKey(ss, Key.Tab, bAlt, bControl, bShift) + Case Chr(8), Chr(127) + Key._SetKey(ss, Key.BackSpace, bAlt, bControl, bShift) + Case Else + Key._SetKey(ss, 0, bAlt, bControl, bShift) + End Select + + iPos += 1 + Endif + + RaiseKeyEvent() + Key._Reset + + Loop Until iPos > Len(s) + + 'This is the end + + If $bThisIsTheEnd Then + TermControl._IdToControl = Null + hControl = Null + $hFile.Close + + Endif + +End + +Static Private Sub RaiseMouseEvent(hControl As TermControl, sEvent As String, Col As Integer, Row As Integer, Optional btnLeft As Boolean, btnMiddle As Boolean, btnRight As Boolean, Delta As Integer) + + 'Dim hControl As TermControl + + 'hControl = TermControl._IdToControl[$aScreen[Mouse.Row, Mouse.Col]] + + If hControl = Null And If $hCurControl = Null Then Return + If sEvent = "_MouseDown" Then $hCurControl = hControl + + Mouse._SetState($hCurControl, Col, Row, btnLeft, btnMiddle, btnRight, Delta) + + If sEvent = "_MouseUp" Then + If hControl = $hCurControl Then + + Object.Call($hCurControl, "_Click") + Object.Call($hCurControl, sEvent) + $hCurControl = Null + Endif + Endif + If $hCurControl Then Object.Call($hCurControl, sEvent) + +End + +Static Private Sub RaiseKeyEvent() + + Select Case Key.Code + Case Key.Menu + If Key.Alt Then + _RaiseWindow($aChildren[$aChildren.max - 1]) + Endif + Case Else + TermControl._IdToControl[$iActiveWindow]._KeyPress() + End Select + +End + +Static Public Sub _RaiseWindow(hWin As TermWindow) + + Dim hLastActive As TermWindow + Dim i As Integer + Dim bAdded As Boolean + 'If $aChildren.Count = 1 Then Return + 'hWin = $aChildren[0] + hLastActive = $aChildren[$aChildren.Max] + hLastActive._NeedRender = True + hWin._NeedRender = True + + For i = $aChildren.Max DownTo 0 + + If $aChildren[i] <> hwin And If Not $aChildren[i]._IsModal Then + $aChildren.Remove($aChildren.Find(hWIn)) + $aChildren.add(hWin, i + 1) + bAdded = True + Endif + Next + + SetRefreshArea(hWin._GetScreenRect()) + SetRenderArea(hLastActive._GetScreenRect()) + $iActiveWindow = hWin.id + + _Render + +End + +Static Public Sub _Read(sValue As String) + + Write "ok" & sValue + +End + +Static Public Sub SetRenderArea(hRect As Rect) + + If Not $RectRenderArea Then + $RectRenderArea = hRect + Return + Endif + + $RectRenderArea = $RectRenderArea.Union(hRect) + +End + +Static Public Sub SetRefreshArea(hRect As Rect) + + If Not $RectRefreshArea Then $RectRefreshArea = hRect.Copy() 'New Rect + 'If hRect.Top = 3 Then Stop + $RectRefreshArea = $RectRefreshArea.Union(hRect) + 'Error "RefreshARea : " & RectToStr($RectRefreshArea) + +End + +Static Public Sub RectToStr(hRect As Rect) As String + + Error "Top: " & hRect.Top & " Left: " & hRect.Left & " Width: " & hRect.Width & " Height: " & hRect.Height + +End + +Static Public Sub _Render() + + Dim c As Integer + Dim l As Integer + Dim hRect As Rect + Dim hAttr As New Attr + Dim hChar As Char + Dim hCont As TermControl + Dim sAttr As String + Dim sDisplay As String + Dim hOldCont As Object + Dim iOldAttr As Integer + Dim iBgAttr As Integer + Dim iBgChar As Integer + Dim bWroteBg As Boolean + Dim iId As Integer + + If bLock Then Stop + If $bInRender Then Return + + $hStream = Open String For Write + + $bInRender = True + DoRefreshArea() + RenderAll + + If Not IsNull($RectRenderArea) Then hRect = $hRect.Intersection($RectRenderArea) + + If hRect = Null Then + $bInRender = False + Return + Endif + + With Desktop.Background + iBgAttr = .Attr + iBgChar = .c + End With + + sAttr = hAttr._GetString(True) + + Write #$hStream, sAttr + + For l = hRect.Y To hRect.Bottom - 1 + 'Debug "ligne " & l + Write #$hStream, "\e[" & (l + 1) & ";" & (hRect.X + 1) & "H" + iOldAttr = 0 + bWroteBg = False + + For c = hRect.X To hRect.Right - 1 + + iId = $aScreen[l, c] + + If iId Then + + hCont = TermControl._IdToControl[iId] + If hOldCont <> hCont Then + hAttr.Reset + hAttr.ColorMode = hCont._ColorMode + Endif + hOldCont = hCont + hChar = hCont._GetChar(c, l) + If hChar.Attr <> iOldAttr Then + hAttr.FillFrom(hChar.Attr) + hAttr.WriteToStream($hStream) + 'sAttr = hAttr._GetString() + iOldAttr = hChar.Attr + Endif + 'Write #$hStream, sAttr + + Write #$hStream, String.Chr(hChar.c) + bWroteBg = False + + Else + + If Not bWroteBg Then + hAttr.FillFrom(iBgAttr) + hAttr.WriteToStream($hStream) + Endif + + Write #$hStream, String.Chr(iBgChar) + bWroteBg = True + + Endif + + Next + Next + sDisplay = Close #$hStream + If TermWindows.Debug = Me.DebugOutput Then Error Replace(Replace(sDisplay, "\e[", "\n"), "\e", "!"); + Print sDisplay; + Flush + + $RectRenderArea = Null + + $bInRender = False + +End + +Static Private Sub RenderAll() + + Dim hWin As TermWindow + + For Each hWin In $aChildren + hWin._Render + Next + +End + +Static Private Sub DoArrange() + + Dim hChild As TermWindow + + For Each hChild In $aChildren + hChild._Arrange() + Next + +End + +Static Public Sub Delete(hControl As TermControl) + + Dim hObj As Object = hControl + + TermControl._IdToControl[hObj.Id] = Null + hObj._Content = Null + If hObj Is TermContainer Then + For Each hControl In hObj.Children + Delete(hControl) + Next + 'hObj.Children.Clear + Endif + + If hObj Is TermWindow Then + $aChildren.Delete($aChildren.Find(hObj)) + If $aChildren.Count > 0 Then _RaiseWindow($aChildren[$aChildren.Max]) + Endif + + If $aChildren.Count = 0 Then + + $bThisIsTheEnd = True + + Endif + +End + +Static Public Sub GetActiveWindow() As TermWindow + + Return TermControl._IdToControl[$iActiveWindow] + +End diff --git a/comp/src/gb.term.form/.src/Test/FTest2.class b/comp/src/gb.term.form/.src/Test/FTest2.class new file mode 100644 index 00000000..c49d89a7 --- /dev/null +++ b/comp/src/gb.term.form/.src/Test/FTest2.class @@ -0,0 +1,61 @@ +' Gambas class file + +Inherits TermForm +Private aList As New String[] +Private hTim As New Timer As "Tim" +Private hList As TermListBox +Private k As Integer + Private hLbl As TermLabel + +Public Sub _new() + Dim i As Integer +'aList = ["Chien", "Chat", "Eléphant", "Hiène", "Phoque", "Canard", "Hippoppo"] + Me.Spacing = 1 + + hList = New TermListBox(Me) As "ListBox1" + hLbl = New TermLabel(Me) + + For i = 1 To 200 + aList.Add("Item" & i) + Next + 'hList._Shadow = True + hList.List = aList + Me.Move(0, 0, 60, 20) + Me._Arrangement = Arrange.Vertical + hList.Move(1, 1, 3, 3) + 'Me._Arrangement = Arrange.Fill + hList.Expand = True + Me.Border = 0 + hList.Background = termColor.Blue + Me.Center + Me.Show + 'Me.Title = "Test 1" + Me.Maximized = True + hTim.Delay = 500 + hTim.Start + + hLbl.Background = TermColor.Green + hLbl.Foreground = TermColor.Black + TermWindows.Debug = TermWindows.DebugOutput +End + + +Public Sub tim_Timer() + + 'hList[5] = k + Inc k +End + + +Public Sub ListBox1_Change() + + hLbl.Text = Last.Text + +End + +Public Sub Form_close() + + hTim.Stop + +End + diff --git a/comp/src/gb.term.form/.src/Test/Main.module b/comp/src/gb.term.form/.src/Test/Main.module new file mode 100644 index 00000000..333fad3e --- /dev/null +++ b/comp/src/gb.term.form/.src/Test/Main.module @@ -0,0 +1,136 @@ +' Gambas module file + + +Private hTimer As New Timer As "Timer" +Private hWin2 As TermWindow +Private hTermLabel As TermLabel +Private $i As Integer +Private $iBal As Integer = 1 +Private $hCurFocued As Object +'Private hWin2 As TermForm + + Public Sub Main() + + Dim hWin As New TermForm + Dim hTerCheckBox As TermRadioButton + Dim i As Integer + Dim hCont As TermVBox + Dim hCont2 As TermHBox + Dim hTermButton As TermButton + 'TermWindows.Debug = True + + 'Dim hTermLabel As New TermLabel(hWin) + 'Dim hWin2 As New Window + hTermLabel = New TermLabel(hwin) + hTimer.delay = 5 + 'hTimer.Start + + hWin.Left = 3 + hWin.Top = 1 + hWin.Height = 20 + hWin.Width = 70 + hwin.Padding = 1 + hwin.Border = Border.Simple + hTermLabel.Left = 2 + hTermLabel.Top = 2 + hTermLabel.Width = 7 + hTermLabel.tag = "*" + hTermLabel.Background = TermColor.Yellow + hTermLabel.Foreground = TermColor.Green + hTermLabel.Text = "TermLabel 1" + hWin.Text = "Window 1" + hTermLabel = New TermLabel(hWin) + hTermLabel.Width = 15 + hTermLabel.Text = "TermLabel 2" + hTermLabel.Tag = "#" + hTermLabel.SetFocus + + + hWin2 = New TermWindow + hWin2.Background = TermColor.Cyan + hWin2.Border = Border.Simple + hWin2.Width = 50 + hWin2.Spacing = 1 + hWin2.Height = 14 + 'hWin2._Shadow = True + hWin2.top = 6 + hWin2.Left = 15 + 'hWin2.Padding = 1 + 'hWin2.Maximized = True + hWin2.Text = "Window 2" + + 'hCont.Top = 3 + hTermLabel = New TermLabel(hWin2) + hTermLabel.Width = 14 + hTermLabel.Top = 2 + hTermLabel.Left = 2 + hTermLabel.Text = "TermLabel on win 2" + + hCont = New TermVBox(hWin2) + hCont.Expand = True + hcont.Background = TermColor.Green + hcont.Border = Border.Simple + 'hcont.Padding = 1 + hcont.Shadow = True + For i = 0 To 10 + hTerCheckBox = New TermRadioButton(hcont) + hTerCheckBox.Background = TermColor.Green + hTerCheckBox.Text = "TermLabel " & i + + Next + hCont2 = New TermHBox(hWin2) + hCont2.Height = 2 + hCont2.Spacing = 1 + hCont2.Background = TermColor.Cyan + hCont2.Invert = True + 'hCont.Shadow = True + hTermButton = New TermButton(hCont2) As "btnOk" + 'hTermButton.Background = TermColor.Magenta + hTermButton.Text = "Ok" + hTermButton.W = 10 + hTermButton.H = 2 + hTermButton._Shadow = True + hTermButton.Alignment = Align.Center + hTermButton = New TermButton(hCont2) As "btnCancel" + 'hTermButton.Background = TermColor.Magenta + hTermButton.Text = "Cancel" + hTermButton.W = 10 + hTermButton.H = 2 + hTermButton._Shadow = True + hTermButton.Alignment = Align.Center + 'hWin2.Maximized = True + hWin2.Show + hwin.Show + 'TermWindows._Render + $hCurFocued = hTermLabel + hTermButton.SetFocus + End + + +Public Sub Timer_Timer() + + hTermLabel.Text = $i +$hCurFocued = hWin2.GetNextFocusedControl($hCurFocued) + Error Object.Type($hCurFocued) & " "; + Try Error $hCurFocued.Text + $hCurFocued.setFocus() + Inc $i + TermWindows._Render + +End + + +Public Sub btnCancel_Click() + + Last.Window.Visible = False + 'TermWindows._Render + +End + +Public Sub btnOk_Click() + Dim hattr As New Attr + hattr.Background = TermColor.Black + 'Message("Salut a tous !") + Desktop.BackGround = Char(" ", hattr.GetInteger()) + hTimer.Start +End diff --git a/comp/src/gb.term.form/.src/Test/Main2.module b/comp/src/gb.term.form/.src/Test/Main2.module new file mode 100644 index 00000000..13e15453 --- /dev/null +++ b/comp/src/gb.term.form/.src/Test/Main2.module @@ -0,0 +1,61 @@ +' Gambas module file + +Private i As Integer + +Public Sub Main() + Dim hForm As New TermForm + + Dim hCont As TermFrame + Dim hCont2 As TermHBox + Dim hTermButton As TermButton + Dim hLabel As New TermLabel(hForm) + Dim hCheck As TermCheckBox + Dim i As Integer + Dim hPicBox As TermPictureBox + + hLabel.Text = "Hello this is My first terminal window" + + hForm.Padding = 1 + hForm.Height = 15 + hForm.Width = 50 + hForm.Text = "Hi Gambasians" + hForm.Background = TermColor.White + hForm.Border = Border.Double + + hcont = New TermFrame(hForm) + hCont.Expand = True + hCont.Text = "Choose an option" + hCont2 = New TermHBox(hForm) + hCont2.Invert = True + + hTermButton = New TermButton(hCont2) As "btnClose" + hTermButton.Width = 10 + hTermButton.Text = "< Close >" + + hcont.Background = TermColor.Cyan + hcont.Shadow = True + hcont.Border = Border.Simple + hcont.Padding = 1 + For i = 0 To 5 + hCheck = New TermCheckBox(hcont) + + hCheck.Text = "Check me " & i + hCheck.Value = Int(Rnd(-1, 2)) + Next + hPicBox = New TermPictureBox(hcont) + + hPicBox.Expand = True + hPicBox.Image = Image.Load("all.png") + + hForm.Spacing = 1 + hForm.Center + hForm.Show + hForm.Maximized = True + 'TermWindows._Render + +End +Public Sub btnClose_MouseUp() + + Last.Window.Close + +End diff --git a/comp/src/gb.term.form/.src/Test/Main3.module b/comp/src/gb.term.form/.src/Test/Main3.module new file mode 100644 index 00000000..ad16cab8 --- /dev/null +++ b/comp/src/gb.term.form/.src/Test/Main3.module @@ -0,0 +1,7 @@ +' Gambas module file + +Public Sub Main() + + Dim hpicture As New TermPictureBox + Quit +End diff --git a/comp/src/gb.term.form/.src/Test/Module1.module b/comp/src/gb.term.form/.src/Test/Module1.module new file mode 100644 index 00000000..a53e0fc9 --- /dev/null +++ b/comp/src/gb.term.form/.src/Test/Module1.module @@ -0,0 +1,7 @@ +' Gambas module file + +Public Sub Main() + + Print "toto" + +End diff --git a/comp/src/gb.term.form/.src/Test/Termform1.class b/comp/src/gb.term.form/.src/Test/Termform1.class new file mode 100644 index 00000000..64569144 --- /dev/null +++ b/comp/src/gb.term.form/.src/Test/Termform1.class @@ -0,0 +1,8 @@ +' Gambas class file + + +Public Sub TermForm_Open() + + Me.Title = "toto" + +End diff --git a/comp/src/gb.term.form/.src/Test/Termform1.termform b/comp/src/gb.term.form/.src/Test/Termform1.termform new file mode 100644 index 00000000..5b521aa3 --- /dev/null +++ b/comp/src/gb.term.form/.src/Test/Termform1.termform @@ -0,0 +1,16 @@ +# Gambas Form File 3.0 + +{ TermForm TermForm + Move(0,0,52,22) + #Translate = False + { TermTextBox1 TermTextBox + Move(11,7,22,2) + } + { TermLabel2 TermLabel + Move(0,7,11,2) + Text = ("Bonjour") + } + { TermTextBox2 TermTextBox + Move(11,11,22,2) + } +} diff --git a/comp/src/gb.term.form/.src/Test/Termform2.class b/comp/src/gb.term.form/.src/Test/Termform2.class new file mode 100644 index 00000000..2bd7137a --- /dev/null +++ b/comp/src/gb.term.form/.src/Test/Termform2.class @@ -0,0 +1,9 @@ +' Gambas class file + + +Public Sub TermForm_Open() +'Me.Persistent = True + Me.Move(0, 0, 30, 10) + Me.Background = TermColor.Red + +End diff --git a/comp/src/gb.term.form/.src/Test/Termform2.termform b/comp/src/gb.term.form/.src/Test/Termform2.termform new file mode 100644 index 00000000..eee892e7 --- /dev/null +++ b/comp/src/gb.term.form/.src/Test/Termform2.termform @@ -0,0 +1,5 @@ +# Gambas Form File 3.0 + +{ TermForm TermForm + #MoveScaled(0,0,68,37) +} diff --git a/comp/src/gb.term.form/.src/Test/trfTest.class b/comp/src/gb.term.form/.src/Test/trfTest.class new file mode 100644 index 00000000..9af0905b --- /dev/null +++ b/comp/src/gb.term.form/.src/Test/trfTest.class @@ -0,0 +1,85 @@ +' Gambas class file + +Inherits TermForm +Private $hLab2 As TermLabel +'Private hTimer As New Timer As "Timer" + + + +Public Sub _New() + Dim hText As TermTextBox + Dim hBox As New TermHBox(Me) + Dim hLab As New TermLabel(hBox) + Dim hBar As TermScrollBar + Dim bar As TermScrollBar + Dim hbb As TermHBox + 'Dim hlab2 As TermLabel + + 'Me.Maximized = True + 'Me.Background = Color.Yellow + Me.Padding = 1 + Me.Move(3, 3, 50, 20) + Me.Text = "coucou" + Me.Border = Border.Simple + Me.Visible = True + Me.Center + Me._Arrangement = Arrange.Vertical + Me.Spacing = 1 + + hLab.Text = "Votre nom: " + hLab.W = Len(hLab.Text) + + + hText = New TermTextBox(hBox) As "TextBox" + hText.Text = "test" + hText.Expand = True + hText.SetFocus + + hbox = New TermHBox(Me) + hlab = New TermLabel(hbox) + hLab.Text = "Votre prenom: " + hLab.W = Len(hLab.Text) + + + hText = New TermTextBox(hBox) As "TextBox" + hText.Text = "test" + hText.Expand = True + + ' + $hlab2 = New TermLabel(Me) + + $hlab2.Background = TermColor.green + $hlab2.Show + + + hbb = New TermHBox(Me) + hbb.Height = 8 + hbb.Expand = True + hbox = New TermHBox(hbb) + 'hbox.Expand + bar = New TermScrollBar(hbb) As "Bar" + bar.Height = 5 + bar.Width = 1 + bar.Show + bar.Background = TermColor.red + + bar = New TermScrollBar(Me) As "bar" + + bar.Show + bar.MinValue = -20 + bar.MaxValue = 100 +End + + +Public Sub TextBox_Change() + + $hLab2.Text = Last.text + +End + +Public Sub Bar_Change() + + $hlab2.Text = Last.value + +End + diff --git a/comp/src/gb.term.form/all.png b/comp/src/gb.term.form/all.png new file mode 100644 index 0000000000000000000000000000000000000000..bd1c1ce075ebae381f9229434e02249d8096eae8 GIT binary patch literal 1507 zcmV<91swW`P)-)aEgYyjVC0N-l>-)aEgYXIMC0N-l>-)aEAfB@fX0N-l> z-)sWriZ<@BclFP$`Q_97_V51v`{R5b@VSTl@aF&j|KfKP^1+n;{QByhSN!wq;BE!- z!GOrR*G-khGKIW`x7XY1^P|Qq)}hDXDuB6IoXA0r!M4=rhq%{0jKDaFzBq`! zEP=Y*>ht~n{*S!cY^cxhxrXre`i;BV&f@RF+v_!lzKXfo=J5AkpURTH+f0?kxz^}E zjlj*}@66%uH;BDZm&W}4{;JL6Hi*46hQ0Lp`<1}lMUcYb?e*@jb~cB-h`HGH&#b)H z>9o@3a;wq#<q?Wv@%Q@g_WD4M!L`%p{q^qr{{BXh!?@Mx^Z5I>)aNdPyYl$^ zy4L7rq|JA((?^oSLXW{Qg}kWC;-kpnH;BG3gS(Er+DVhc&*Sf4q03U3#&4?7p2gqy z`uxAy>U6BpiMiNwtkE-uyyfurQJBW+^Y~(-%-ZSmJBq*6=JBo0}_SCg6<9{Ro001L&QchC<8d{RO+wl7kZO0E6k@W?4C(kBP z^JxBOc96zdy6^hV1oE$$(}@5815imsK~zY`l~(sd6EPIN0tE|{jqD*%Hi5DcaP$NO zK@c~J6(>Ux1wl{{6=f6$B5qM};vW2gzL!fcxwcpJ{g9^lzIRF9j3l{=!N=Fn=pPW^ zZ}ju^F-U)rb*8{{jRcy4ywHQqA?a=sVh+}!hlY8eQ8wz_Xt<*iS{Y=!Uql9Bf@FjFg#)z@hauWiDUjn ze-%5Cs*Tk(HPyA7H1y4c;LSr6pPSL1%syMT+GHxWZFQVq-vG8k>&DY~!wrfUf4i(o zW0RA=!`2LA3vPjtXhQ!of9;e7sb&1uHhC9%5Pfa}1&rr>c78lh`|dq^_w9$tfrGf# zaR{b|an=dM1jrYRHx@s&$UkD2<)dB4V0s*uPMpNePSLo+NHj=3Fk0B=rvd9GJ+j=} zcLt_sN&mS4db(~3TY#D<`NEjV6wU*70TpB!hnm45cAbk99tNse@`EvpDU47BJ5nx* z*B|Mi@F-A|BqNO3OraUTF;Zvm>9JoH6|N}oI8cp}Ka4rb!bBT@S0{0L?YgLNL&2wj znk)stm`nfPyhYLW>6w{X4S&wTatWv@g2KG4Be#jDz>joCPhp;jN8*>htHZz7PsB@e zvo7c;+;;|{Vpi@rblc(sPF!kieF#58YMd*M00i~_4sb(UXo(} zv!SRhtHr%#wRmh~x^a4qJ{s3r!fT>{L*Qo#i002ov JPDHLkV1kF=GHn0= literal 0 HcmV?d00001 diff --git a/comp/src/gb.util.web/.component b/comp/src/gb.util.web/.component new file mode 100644 index 00000000..1acb33b4 --- /dev/null +++ b/comp/src/gb.util.web/.component @@ -0,0 +1,4 @@ +[Component] +Key=gb.util.web +Version=3.14.90 +State=1 diff --git a/comp/src/gb.util.web/.directory b/comp/src/gb.util.web/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/comp/src/gb.util.web/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/comp/src/gb.util.web/.hidden/control/ccontainer.png b/comp/src/gb.util.web/.hidden/control/ccontainer.png new file mode 100644 index 0000000000000000000000000000000000000000..0c964749ebf7dbdb57d5191e0da2b88753fc8546 GIT binary patch literal 1606 zcmV-M2D$l(P)0zwsps4b}iQOhG0k04crPgN`N zsVXI3c&LP=0e?VYOQ=ZWQb+^oLv3juG^)tUbz)~@JC42U-SzA|4}iYHXZ5i zy?Zr#e*b&!xo6KsMEJbT*~J<^$9_MDjO^qQAO&c%vGKXU=9_f-IrdBUW#XN9O5F3m z68YeZlHbPjKL&5__u`l$}vUDNf!s`2Jm)yGii+T0i580xW%8Q8i ze+lq%>LFd@d97nZJIkMdmMky|6oDe1SpZsq5*QxF*T2OV)c*T^D81Jf%iO7y>K74r z)&ktO)EZr5yT0JI4sQ4*T(TG#iNRrv>V+Y)WI-xmn_!tFzkEHd6>It9YtQYq9qv?0 z^)(Y=Gy(t2$S(c{H*JSYZv_fdz(Ffv6$(HFoB)nxf^Cvn)`|GCY|HHf2Ud6TfKuvj zfGc%D7YjoFcWQ^0Y~RQ=KZPs53kV`*{PIaWdl=s>;d^DQk+ZmF5zjFh@6WSj-8CRU zbsVhmpbwjQ<~&13FO&|P;5$EfgTDfHR7Cs~?7LRz+zbov1_U$@(ur{O(N+jOQG&sf zFmO8fy>1}B0`XC@@rrhFbr7D zkKvJ@L*Zk%dGl1bKMr;k#!KNws-QzKk}8M?%?I6~B^}R2g#iHCLt_mD=mx039B1DH zUEsRgAz=mZ$Z?}oM2r;5il2aqvFl7R?+0lq0qBjlAeD)&iow5tc@kEx2ctX*uuc5Z z7)nzSconR$x$dNm=t--~i**7dB4FYJtRfulhO0V3*FzCi{Bi{&n+bq+H4x!g0XUhO z1d9Z=1$^HL#*GC4sq`c`D#96t6Gd3G0=xhwo;T@s+X~)Grena^7{M10@R|vTcmNd_ zP}`QF9>~nWFPG4i1Ylnvk*tG;_GA){2)m(TjY(sbxQ6dP_2=IoFW4QBCt*z6GP=J?!WM<~@+Ps=Z zz|c_XvAOT>d#UA)JJ9FNi)=+yL^$Ur!B5W)j(`>y5c}5g6x)yW+D{kvypPpC7@UYH zEgkfUWDo3XC&T zlTICc^piY2T?gqsIB@v)eQe#?!x4hwa!5qXhW7%clme1FzQ?Msb?|oEimzrDu75Bt z!f_zc$3(J0!bJt+(y1Yizw{wz|D8X%Z-A{^KjrTPl}uPlQ56xt>BXcb;(--({A3mH z%wKuyvdcI8I1Ee$P6ZPADe&sx2t7Oh%>TMS8TijAuRVK+-4SpZFafVtk~J+zL`0NQ zcGn?#Q;NGcS3i2!F51f$ZF&~HrH$b4ygC7P%N35lyof0cX7?0WPcyb=Oy<&??A zs^VskQp)(z3Ko5TIlo!3cLEk(RH-IUqT_R~YGXvDtQov`+N1_R|i;N`ox8~^|S07*qoM6N<$ Ef+WBOQvd(} literal 0 HcmV?d00001 diff --git a/comp/src/gb.util.web/.hidden/control/ccontrol.png b/comp/src/gb.util.web/.hidden/control/ccontrol.png new file mode 100644 index 0000000000000000000000000000000000000000..0c964749ebf7dbdb57d5191e0da2b88753fc8546 GIT binary patch literal 1606 zcmV-M2D$l(P)0zwsps4b}iQOhG0k04crPgN`N zsVXI3c&LP=0e?VYOQ=ZWQb+^oLv3juG^)tUbz)~@JC42U-SzA|4}iYHXZ5i zy?Zr#e*b&!xo6KsMEJbT*~J<^$9_MDjO^qQAO&c%vGKXU=9_f-IrdBUW#XN9O5F3m z68YeZlHbPjKL&5__u`l$}vUDNf!s`2Jm)yGii+T0i580xW%8Q8i ze+lq%>LFd@d97nZJIkMdmMky|6oDe1SpZsq5*QxF*T2OV)c*T^D81Jf%iO7y>K74r z)&ktO)EZr5yT0JI4sQ4*T(TG#iNRrv>V+Y)WI-xmn_!tFzkEHd6>It9YtQYq9qv?0 z^)(Y=Gy(t2$S(c{H*JSYZv_fdz(Ffv6$(HFoB)nxf^Cvn)`|GCY|HHf2Ud6TfKuvj zfGc%D7YjoFcWQ^0Y~RQ=KZPs53kV`*{PIaWdl=s>;d^DQk+ZmF5zjFh@6WSj-8CRU zbsVhmpbwjQ<~&13FO&|P;5$EfgTDfHR7Cs~?7LRz+zbov1_U$@(ur{O(N+jOQG&sf zFmO8fy>1}B0`XC@@rrhFbr7D zkKvJ@L*Zk%dGl1bKMr;k#!KNws-QzKk}8M?%?I6~B^}R2g#iHCLt_mD=mx039B1DH zUEsRgAz=mZ$Z?}oM2r;5il2aqvFl7R?+0lq0qBjlAeD)&iow5tc@kEx2ctX*uuc5Z z7)nzSconR$x$dNm=t--~i**7dB4FYJtRfulhO0V3*FzCi{Bi{&n+bq+H4x!g0XUhO z1d9Z=1$^HL#*GC4sq`c`D#96t6Gd3G0=xhwo;T@s+X~)Grena^7{M10@R|vTcmNd_ zP}`QF9>~nWFPG4i1Ylnvk*tG;_GA){2)m(TjY(sbxQ6dP_2=IoFW4QBCt*z6GP=J?!WM<~@+Ps=Z zz|c_XvAOT>d#UA)JJ9FNi)=+yL^$Ur!B5W)j(`>y5c}5g6x)yW+D{kvypPpC7@UYH zEgkfUWDo3XC&T zlTICc^piY2T?gqsIB@v)eQe#?!x4hwa!5qXhW7%clme1FzQ?Msb?|oEimzrDu75Bt z!f_zc$3(J0!bJt+(y1Yizw{wz|D8X%Z-A{^KjrTPl}uPlQ56xt>BXcb;(--({A3mH z%wKuyvdcI8I1Ee$P6ZPADe&sx2t7Oh%>TMS8TijAuRVK+-4SpZFafVtk~J+zL`0NQ zcGn?#Q;NGcS3i2!F51f$ZF&~HrH$b4ygC7P%N35lyof0cX7?0WPcyb=Oy<&??A zs^VskQp)(z3Ko5TIlo!3cLEk(RH-IUqT_R~YGXvDtQov`+N1_R|i;N`ox8~^|S07*qoM6N<$ Ef+WBOQvd(} literal 0 HcmV?d00001 diff --git a/comp/src/gb.util.web/.icon.png b/comp/src/gb.util.web/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a9254f949f86671b58a744a6a93623576acc5217 GIT binary patch literal 10569 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 Len($sStr) Then Return + sCar = Mid$($sStr, $iPos, 1) + Inc $iPos + Return sCar + +End + + +Private Sub ReadChar() As String + + Dim sCar As String + + Do + sCar = GetChar() + If Not sCar Then Return + If sCar > " " Then Return sCar + Loop + +End + + +Private Sub ReadToken() As String + + Dim sToken As String + Dim sCar As String + + GoSub READ_CHAR + If Not IsLetter(sCar) Then Return sCar + + sToken = sCar + Do + GoSub GET_CHAR + If Not sCar Then Break + If Not IsLetter(sCar) Then + Dec $iPos + Break + Endif + sToken &= sCar + Loop + + Return sToken + +READ_CHAR: + + Do + GoSub GET_CHAR + If Not sCar Or If sCar > " " Then Return + Loop + Return + +GET_CHAR: + + If $iPos > Len($sStr) Then + sCar = "" + Return + Endif + sCar = Mid$($sStr, $iPos, 1) + Inc $iPos + Return + +End + +Private Sub ReadString() As String + + Dim sCar As String + Dim sString As String + Dim sBuffer As String + Dim iPos As Integer + + Do + GoSub GET_CHAR + If sCar = Chr$(34) Then Return sString & sBuffer + If sCar = "\\" Then + GoSub GET_CHAR + iPos = InStr("bfrtn", sCar) + If iPos Then + sCar = Mid$("\b\f\r\t\n", iPos, 1) + Else If sCar = "u" Then + Try sCar = String.Chr$(Val("&H" & Mid$($sStr, $iPos, 4))) + If Not Error Then $iPos += 4 + Else + ' Keep character + Endif + Endif + sBuffer &= sCar + If Len(sBuffer) > 512 Then + sString &= sBuffer + sBuffer = "" + Endif + Loop + +GET_CHAR: + + If $iPos > Len($sStr) Then Error.Raise("Non terminated string") + sCar = Mid$($sStr, $iPos, 1) + Inc $iPos + Return + +End + +Private Sub ReadObject() As Collection + + Dim sCar As String + Dim cObject As Collection + Dim sKey As String + + If $bUseNull Then + cObject = New JSONCollection + Else + cObject = New Collection + Endif + + Do + GoSub READ_CHAR + If sCar = "}" Then Return cObject + If sCar <> Chr$(34) Then Error.Raise("String expected") + sKey = ReadString() + GoSub READ_CHAR + If sCar <> ":" Then Error.Raise("Colon expected") + cObject[sKey] = ReadValue() + GoSub READ_CHAR + If sCar = "}" Then Return cObject + If sCar <> "," Then Error.Raise("Comma expected") + Loop + +READ_CHAR: + + Do + GoSub GET_CHAR + If Not sCar Or If sCar > " " Then Return + Loop + Return + +GET_CHAR: + + If $iPos > Len($sStr) Then + sCar = "" + Return + Endif + sCar = Mid$($sStr, $iPos, 1) + Inc $iPos + Return + +End + +Private Sub ReadArray() As Variant[] + + Dim sCar As String + Dim aArray As New Variant[] + + Do + sCar = ReadChar() + If sCar = "]" Then Return aArray + Dec $iPos + aArray.Add(ReadValue()) + sCar = ReadChar() + If sCar = "]" Then Return aArray + If sCar <> "," Then Error.Raise("Comma expected") + Loop + +End + +Private Sub ReadNumber(sNumber As String) As Variant + + Dim sCar As String + Dim vNumber As Variant + Dim bFloat As Boolean + + Do + GoSub GET_CHAR + If Not sCar Then Break + If InStr(".eE", sCar) Then + bFloat = True + Else If InStr("-+0123456789", sCar) = 0 Then + Dec $iPos + Break + Endif + sNumber &= sCar + Loop + + If bFloat Then + Try vNumber = CFloat(sNumber) + If Not Error Then Return vNumber + Else + Try vNumber = CInt(sNumber) + If Not Error Then Return vNumber + Try vNumber = CLong(sNumber) + If Not Error Then Return vNumber + Endif + + Error.Raise("Incorrect number") + +GET_CHAR: + + If $iPos > Len($sStr) Then + sCar = "" + Return + Endif + sCar = Mid$($sStr, $iPos, 1) + Inc $iPos + Return + +End + +Private Sub ReadValue() As Variant + + Dim sCar As String + + sCar = ReadToken() + + If sCar = "{" Then + Return ReadObject() + Else If sCar = "[" Then + Return ReadArray() + Else If sCar = Chr$(34) Then + Return ReadString() + Else If sCar = "-" Or If IsDigit(sCar) Then + Return ReadNumber(sCar) + Else If sCar = "null" Then + Return Null + Else If sCar = "true" Then + Return True + Else If sCar = "false" Then + Return False + Else If Not sCar Then + Return + Else + Error.Raise("Incorrect token: " & Quote(sCar)) + Endif + +End + +Private Sub WriteString(sStr As String) + + Dim iPos As Integer + + sStr = Quote(sStr) + Do + iPos = InStr(sStr, "\\", iPos + 1) + If iPos = 0 Then Break + If Mid$(sStr, iPos + 1, 1) = "x" Then + Mid$(sStr, iPos, 4) = "\\u00" & Mid$(sStr, iPos + 2, 2) + Else + Inc iPos + Endif + Loop + Write #$hStream, sStr + +End + + +Private Sub WriteValue(vVal As Variant) + + Dim iPos As Integer + Dim aArray As Array + Dim cCol As Collection + + Select Case TypeOf(vVal) + + Case gb.Null + Write #$hStream, "null" + + Case gb.Boolean + If vVal Then + Write #$hStream, "true" + Else + Write #$hStream, "false" + Endif + + Case gb.Byte, gb.Short, gb.Integer, gb.Long, gb.Float + Write #$hStream, CStr(vVal) + + Case gb.Date + Write #$hStream, Chr$(34) & CStr(vVal) & Chr$(34) + + Case gb.String + WriteString(vVal) + + Case gb.Pointer + If vVal = JSON.Null Then + Write #$hStream, "null" + Else + Write #$hStream, "undefined" + Endif + + Case Else + If vVal Is Array Then + aArray = vVal + Write #$hStream, "[" + For iPos = 0 To vVal.Max + If iPos Then Write #$hStream, "," + WriteValue(vVal[iPos]) + Next + Write #$hStream, "]" + Else If vVal Is Collection Then + cCol = vVal + Write #$hStream, "{" + For Each vVal In cCol + If iPos Then Write #$hStream, "," + WriteString(cCol.Key) + Write #$hStream, ":" + WriteValue(vVal) + Inc iPos + Next + Write #$hStream, "}" + Else If IsNull(vVal) Then + Write #$hStream, "null" + Else + Write #$hStream, "undefined" + Endif + + End Select + +End + + +Public Sub Decode(JSONString As String, Optional UseNull As Boolean) As Variant + + Dim vVal As Variant + $sStr = JSONString + $iPos = 1 + $bUseNull = UseNull + vVal = ReadValue() + $bUseNull = False + $sStr = "" + Return vVal + +End + +Public Sub FromString(JSONString As String, Optional UseNull As Boolean) As Variant + + Return Decode(JSONString, UseNull) + +End + + +Public Sub Encode(Value As Variant) As String + + Dim sStr As String + + $hStream = Open String For Write + WriteValue(Value) + sStr = Close #$hStream + Return sStr + +End + +Public Sub ToString(Value As Variant) As String + + Return Encode(Value) + +End + + +Private Function Null_Read() As Variant + + Return $vNull + +End diff --git a/comp/src/gb.util.web/.src/JSONCollection.class b/comp/src/gb.util.web/.src/JSONCollection.class new file mode 100644 index 00000000..2cac2d76 --- /dev/null +++ b/comp/src/gb.util.web/.src/JSONCollection.class @@ -0,0 +1,42 @@ +' Gambas class file + +Export + +Inherits Collection + +Public Sub _get(Key As String) As Variant + + Dim vVal As Variant + + vVal = Super[Key] + If TypeOf(vVal) = gb.Pointer And If vVal = JSON.Null Then vVal = Null + Return vVal + +End + +Public Sub _put(Value As Variant, Key As String) + + If IsNull(Value) Then Value = JSON.Null + Super[Key] = Value + +End + +Public Sub _next() As Variant + + Super._next() + If Not Enum.Stopped Then Return _get(Me.Key) + +End + +Public Sub Copy() As JSONCollection + + Dim hCopy As New JSONCollection + Dim vVal As Variant + + For Each vVal In Me + hCopy[Me.Key] = vVal + Next + + Return hCopy + +End diff --git a/comp/src/gb.util.web/.src/MMain.module b/comp/src/gb.util.web/.src/MMain.module new file mode 100644 index 00000000..f139b148 --- /dev/null +++ b/comp/src/gb.util.web/.src/MMain.module @@ -0,0 +1,30 @@ +' Gambas module file + +Public Function GetNullVariant() As Variant + + Return Null + +End + +Public Function GetNullObject() As Object + + Return Null + +End + +Public Sub Main2() + + Dim hURL As URL + + hURL = URL.FromString("http://localhost/guygle/find?query=ordre+de+travail+avec+interventions+dont+la+date+planifiée+est+comprise+entre+le+01%2F03%2F2017+et+31%2F03%2F2017+et+type+est+Campagne+dont+agence+est+AG.CIG.GONESSE&format=json&test#f5") + + Print hURL.Query["query"] + + Print hURL.ToString() + +End + + +Public Sub Main() + +End diff --git a/comp/src/gb.util.web/.src/URL.class b/comp/src/gb.util.web/.src/URL.class new file mode 100644 index 00000000..c9f33208 --- /dev/null +++ b/comp/src/gb.util.web/.src/URL.class @@ -0,0 +1,185 @@ +' Gambas class file + +Export + +Public Protocol As String +Public Host As String +Public Port As String +Public (User) As String +Public Password As String +Public Path As String +Public Query As UrlQuery +Public Hash As String + +Static Public Sub Quote((Path) As String) As String + + Dim iInd As Integer + Dim sRes As String + Dim sCar As String + + For iInd = 1 To Len(Path) + sCar = Mid$(Path, iInd, 1) + If IsLetter(sCar) Or If IsDigit(sCar) Or If InStr("-._~,$!", sCar) Then + Else + sCar = "%" & Hex$(Asc(sCar), 2) + Endif + sRes &= sCar + Next + + Return sRes + +End + +Static Public Sub UnQuote((Path) As String, Optional IgnorePlus As Boolean) As String + + Dim iInd As Integer + Dim sRes As String + Dim sCar As String + + For iInd = 1 To Len(Path) + sCar = Mid$(Path, iInd, 1) + If sCar = "%" Then + sCar = Chr$(Val("&H" & Mid$(Path, iInd + 1, 2))) + iInd += 2 + Else If sCar = "+" And If Not IgnorePlus Then + sCar = " " + Endif + sRes &= sCar + Next + + Return sRes + +End + +Static Public Sub Encode((Path) As String) As String + + Return {Quote}(Path) + +End + +Static Public Sub Decode((Path) As String) As String + + Return {UnQuote}(Path) + +End + +Private Sub CreateUrl(sUrl As String) As URL + + Dim iPos As Integer + Dim sTemp As String + Dim sIdent As String + + iPos = InStr(sURL, ":") + If iPos Then + Protocol = Left(sURL, iPos - 1) + sURL = Mid$(sURL, iPos + 1) + Endif + + If sURL Begins "//" Then + + sURL = Mid$(sURL, 3) + iPos = InStr(sURL, "/") + If iPos = 0 Then + sTemp = sURL + sURL = "" + Else + sTemp = Left(sURL, iPos - 1) + sURL = Mid$(sURL, iPos) + Endif + + iPos = InStr(sTemp, "@") + If iPos Then + + sIdent = Left(sTemp, iPos - 1) + sTemp = Mid$(sTemp, iPos + 1) + + iPos = InStr(sIdent, ":") + If iPos Then + User = Left(sIdent, iPos - 1) + Password = Mid$(sIdent, iPos + 1) + Else + User = sIdent + Endif + + Endif + + iPos = InStr(sTemp, ":") + If iPos Then + Host = Left(sTemp, iPos - 1) + Port = Mid(sTemp, iPos + 1) + Else + Host = sTemp + Endif + + Endif + + iPos = InStr(sURL, "#") + If iPos Then + Hash = Mid(sURL, iPos + 1) + sURL = Left(sURL, iPos - 1) + Endif + + iPos = InStr(sURL, "?") + If iPos Then + Path = Left(sURL, iPos - 1) + Query = New URLQuery(Mid$(sURL, iPos + 1)) + Else + Path = sURL + Endif + + User = FromUrl(User) + Password = FromUrl(Password) + Host = FromUrl(Host) + Port = FromUrl(Port) + Path = FromUrl(Path) + Hash = FromUrl(Hash) + +End + +Public Sub _new(URL As String) + + CreateUrl(URL) + +End + +Public Sub ToString() As String + + Dim sURL As String + Dim sQuery As String + + If Protocol Then sURL = Protocol & ":" + + If Host Then + + sUrl &= "//" + + If User Or If Password Then + + sUrl &= Url(User) + If Password Then sUrl &= ":" & Url(Password) + sUrl &= "@" + + Endif + + sUrl &= Url(Host) + + If Port Then sUrl &= ":" & Url(Port) + + Endif + + If Path Then sUrl &/= Url(Path) + + sQuery = Query.ToString() + If sQuery Then sUrl &= "?" & sQuery + + If Hash Then sUrl &= "#" & Url(Hash) + + Return sUrl + +End + +Static Public Sub FromString(URL As String) As URL + + Return New URL(URL) + +End diff --git a/comp/src/gb.util.web/.src/URLQuery.class b/comp/src/gb.util.web/.src/URLQuery.class new file mode 100644 index 00000000..024466d3 --- /dev/null +++ b/comp/src/gb.util.web/.src/URLQuery.class @@ -0,0 +1,113 @@ +' Gambas class file + +Export + +Property Read Count As Integer +Property Read Keys As String[] + +Private $cNull As New Collection +Private $cVal As New Collection + +Public Sub _new(Query As String) + + Dim sElt As String + Dim iPos As Integer + Dim sKey As String + Dim sValue As String + Dim cKey As New Collection + + For Each sElt In Split(Query, "&") + + iPos = InStr(sElt, "=") + If iPos Then + sKey = URL.UnQuote(Left(sElt, iPos - 1), True) + sValue = URL.Unquote(Mid$(sElt, iPos + 1), True) + Else + sKey = URL.UnQuote(sElt) + sValue = "" + Endif + + If Not sKey Then Continue + If cKey.Exist(sKey) Then Continue + + If sValue Then + $cVal[sKey] = sValue + Else + $cNull[sKey] = True + Endif + + Next + +End + +Public Sub Exist(Key As String) As Boolean + + If $cNull.Exist(Key) Then Return True + If $cVal.Exist(Key) Then Return True + +End + + +Public Sub _get(Key As String) As String + + Return $cVal[Key] + +End + +Public Sub _put(Value As String, Key As String) + + $cNull.Remove(Key) + $cVal.Remove(Key) + + If Value Then + $cVal[Key] = Value + Else + $cNull[Key] = True + Endif + +End + +Public Sub ToString() As String + + Dim aQuery As New String[] + Dim sVal As String + + For Each sVal In $cVal + aQuery.Add(URL.Quote($cVal.Key) & "=" & URL.Quote(sVal)) + Next + + For Each $cNull + aQuery.Add(URL.Quote($cNull.Key)) + Next + + Return aQuery.Join("&") + +End + +Static Public Sub FromString(Query As String) As URLQuery + + Return New URLQuery(Query) + +End + + +Private Function Count_Read() As Integer + + Return $cVal.Count + $cNull.Count + +End + +Private Function Keys_Read() As String[] + + Dim aKeys As String[] + + aKeys = New String[] + For Each $cVal + aKeys.Add($cVal.Key) + Next + For Each $cNull + aKeys.Add($cNull.Key) + Next + Return aKeys + +End diff --git a/comp/src/gb.util/.component b/comp/src/gb.util/.component new file mode 100644 index 00000000..9ec16c66 --- /dev/null +++ b/comp/src/gb.util/.component @@ -0,0 +1,4 @@ +[Component] +Key=gb.util +Version=3.14.90 +State=1 diff --git a/comp/src/gb.util/.directory b/comp/src/gb.util/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/comp/src/gb.util/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/comp/src/gb.util/.icon.png b/comp/src/gb.util/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..eedc7d8863854cb8646b25127e14db92ddf35ed5 GIT binary patch literal 10933 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

    \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Utility routines" +msgstr "Routines utilitaires" + +#: File.class:9 +msgid "&1 B" +msgstr "&1 o" + +#: File.class:11 +msgid "&1 KiB" +msgstr "&1 Kio" + +#: File.class:13 +msgid "&1 MiB" +msgstr "&1 Mio" + +#: File.class:15 +msgid "&1 GiB" +msgstr "&1 Gio" + +#: File.class:21 +msgid "&1 KB" +msgstr "&1 Ko" + +#: File.class:23 +msgid "&1 MB" +msgstr "&1 Mo" + +#: File.class:25 +msgid "&1 GB" +msgstr "&1 Go" + diff --git a/comp/src/gb.util/.lang/it.po b/comp/src/gb.util/.lang/it.po new file mode 100644 index 00000000..9a954999 --- /dev/null +++ b/comp/src/gb.util/.lang/it.po @@ -0,0 +1,50 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.util 3.13.90\n" +"PO-Revision-Date: 2019-08-27 15:52 UTC\n" +"Last-Translator: gian \n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Utility routines" +msgstr "Routine di utilità" + +# gb-ignore +#: File.class:9 +msgid "&1 B" +msgstr "" + +# gb-ignore +#: File.class:11 +msgid "&1 KiB" +msgstr "" + +# gb-ignore +#: File.class:13 +msgid "&1 MiB" +msgstr "" + +# gb-ignore +#: File.class:15 +msgid "&1 GiB" +msgstr "" + +# gb-ignore +#: File.class:21 +msgid "&1 KB" +msgstr "" + +# gb-ignore +#: File.class:23 +msgid "&1 MB" +msgstr "" + +# gb-ignore +#: File.class:25 +msgid "&1 GB" +msgstr "" + diff --git a/comp/src/gb.util/.lang/ru.po b/comp/src/gb.util/.lang/ru.po new file mode 100644 index 00000000..69d8c1b4 --- /dev/null +++ b/comp/src/gb.util/.lang/ru.po @@ -0,0 +1,62 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-07-16 08:59+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: comp/src/gb.util/.project:11 +msgid "Gambas utility routines" +msgstr "Подпрограммы утилит Gambas" + +#: comp/src/gb.util/.src/Date.module:91 +msgid "Unknown timezone '&1'" +msgstr "Неизвестный часовой пояс '&1'" + +#: comp/src/gb.util/.src/File.class:9 comp/src/gb.util/.src/File.class:19 +msgid "&1 B" +msgstr "&1 Б" + +#: comp/src/gb.util/.src/File.class:11 +msgid "&1 KiB" +msgstr "&1 кБ" + +#: comp/src/gb.util/.src/File.class:13 +msgid "&1 MiB" +msgstr "&1 МБ" + +#: comp/src/gb.util/.src/File.class:15 +msgid "&1 GiB" +msgstr "&1 ГБ" + +#: comp/src/gb.util/.src/File.class:21 +msgid "&1 KB" +msgstr "&1 Кб" + +#: comp/src/gb.util/.src/File.class:23 +msgid "&1 MB" +msgstr "&1 МБ" + +#: comp/src/gb.util/.src/File.class:25 +msgid "&1 GB" +msgstr "&1 ГБ" + diff --git a/comp/src/gb.util/.project b/comp/src/gb.util/.project new file mode 100644 index 00000000..8644059b --- /dev/null +++ b/comp/src/gb.util/.project @@ -0,0 +1,10 @@ +# Gambas Project File 3.0 +Title=Utility routines +Startup=MMain +Version=3.14.90 +VersionFile=1 +TabSize=2 +Translate=1 +Language=en_US +Type=Component +Packager=1 diff --git a/comp/src/gb.util/.src/Class.class b/comp/src/gb.util/.src/Class.class new file mode 100644 index 00000000..9d1a02ca --- /dev/null +++ b/comp/src/gb.util/.src/Class.class @@ -0,0 +1,127 @@ +' Gambas class file + +Export + +Static Private $iSectionSize As Integer +Static Private $iSectionPos As Integer + +Static Private Sub GotoNextSection(hFile As File) + + $iSectionPos += $iSectionSize + Seek #hFile, $iSectionPos + $iSectionSize = Read #hFile As Integer + $iSectionPos += 4 + +End + +Static Private Sub ReadZeroString(hFile As File) As String + + Dim sStr As String + Dim iPos As Integer + + Do + sStr &= Read #hFile, Min(16, Lof(hFile) - Seek(hFile)) + iPos = InStr(sStr, Chr$(0)) + If iPos Then Return Left(sStr, iPos - 1) + Loop + +End + +'' Return information about a class from its name, by analyzing its bytecode file. +'' +'' By default the class file is searched in the calling component or project. +'' If ~Name~ is prefixed with `../`, then the class file is searched one component up. +'' If ~Name~ is prefixed with '.../', then the class file is searched in the project. + +Static Public Sub Stat(Name As String) As ClassStat + + Dim sPath As String + Dim hFile As File + Dim hStat As ClassStat + Dim iVal As Integer + Dim iParent As Integer + Dim iFlag As Short + Dim bDebug As Boolean + Dim iStringPos As Integer + Dim sDir As String + + If Name Begins ".../" Then + + Name = Mid$(Name, 5) + sPath = ".../.gambas" &/ UCase(Name) + + Else + + While Name Begins "../" + Name = Mid(Name, 4) + sDir &= "../" + Wend + + sPath = ".." &/ sDir &/ ".gambas" &/ UCase(Name) + + Endif + + If Not Exist(sPath) Then Error.Raise("Class not found") + + $iSectionPos = 0 + $iSectionSize = 0 + + hStat = New ClassStat + hStat.Name = Name + + hFile = Open sPath + + Seek #hFile, 8 + iVal = Read #hFile As Integer + If iVal <> &H12345678 Then hFile.ByteOrder = 1 - hFile.ByteOrder + Seek #hFile, 12 + iVal = Read #hFile As Integer + bDebug = iVal And 1 + + $iSectionSize = 16 + + GotoNextSection(hFile) ' info + Seek #hFile, $iSectionPos + iParent = Read #hFile As Short + iFlag = Read #hFile As Short + + hStat.Exported = BTst(iFlag, 0) + hStat.AutoCreate = BTst(iFlag, 1) + hStat.Optional = BTst(iFlag, 2) + hStat.NoCreate = BTst(iFlag, 3) + hStat.HasFast = BTst(iFlag, 4) + hStat.Test = BTst(iFlag, 5) + + GotoNextSection(hFile) ' description + GotoNextSection(hFile) ' constant + GotoNextSection(hFile) ' reference + + If iParent <> -1 Then + + Seek #hFile, $iSectionPos + iParent * 4 + iParent = Read #hFile As Integer + iParent = Abs(iParent) + + Endif + + Do + iStringPos = $iSectionPos + Try GotoNextSection(hFile) + If Error Then Break + Loop + + Seek #hFile, iStringPos + hStat.Name = ReadZeroString(hFile) + + If iParent > 0 Then + + Seek #hFile, iStringPos + iParent + hStat.Parent = ReadZeroString(hFile) + + Endif + + Close hFile + + Return hStat + +End diff --git a/comp/src/gb.util/.src/ClassStat.class b/comp/src/gb.util/.src/ClassStat.class new file mode 100644 index 00000000..f94bbdce --- /dev/null +++ b/comp/src/gb.util/.src/ClassStat.class @@ -0,0 +1,12 @@ +' Gambas class file + +Export + +Public Name As String +Public Parent As String +Public Exported As Boolean +Public HasFast As Boolean +Public AutoCreate As Boolean +Public NoCreate As Boolean +Public Optional As Boolean +Public Test As Boolean diff --git a/comp/src/gb.util/.src/CsvFile.class b/comp/src/gb.util/.src/CsvFile.class new file mode 100644 index 00000000..44be1b3f --- /dev/null +++ b/comp/src/gb.util/.src/CsvFile.class @@ -0,0 +1,216 @@ +' Gambas class file + +Export + +Property Read Eof As Boolean +Property Fields As String[] +Property Read Line As Integer + +Static Private $bCreate As Boolean + +Private $hFile As File +Private $aField As String[] +Private $sSeparator As String +Private $sEscape As String +Private $iLine As Integer +Private $bWrite As Boolean +Private $sCharset As String + +Static Public Sub Open(Path As String, Optional Separator As String = ",", Optional Escape As String = "\"", Optional Charset As String) As CsvFile + + Return New CsvFile(Path, Separator, Escape, Charset) + +End + +Static Public Sub Create(Path As String, Optional Separator As String = ",", Optional Escape As String = "\"", Optional Charset As String) As CsvFile + + $bCreate = True + Return New CsvFile(Path, Separator, Escape, Charset) + +End + +Public Sub _new(Path As String, Optional Separator As String = ",", Optional Escape As String = "\"", Optional Charset As String) + + Dim sLine As String + Dim iInd As Integer + Dim sField As String + + $sSeparator = Separator + $sEscape = Escape + $sCharset = Charset + + If $bCreate Then + $bCreate = False + $bWrite = True + $hFile = Open Path For Output Create + Return + Endif + + If File.IsRelative(Path) Then + If Path Begins "./" Then + Path = "." & Path + Else If Path Not Begins "../" Then + Path = ".." &/ Path + Endif + Endif + + $hFile = Open Path For Input + + sLine = $hFile.ReadLine($sEscape) + + If Not $sCharset And If Not String.IsValid(sLine) Then + $sCharset = "WINDOWS-1252" + Try sLine = Conv(sLine, $sCharset, "UTF-8") + If Error Then + $sCharset = "ISO-8859-15" + Try sLine = Conv(sLine, $sCharset, "UTF-8") + If Error Then Error.Raise("Cannot guess charset") + Endif + Endif + + $aField = Split(sLine, $sSeparator, $sEscape) + + For iInd = 0 To $aField.Max + sField = Trim($aField[iInd]) + sField = Replace(sField, String.Chr(160), " ") + sField = Replace(sField, "\n", " ") + sField = Replace(sField, "\t", " ") + While InStr(sField, " ") + sField = Replace(sField, " ", " ") + Wend + sField = String.LCase(sField) + If Not sField Then sField = "#" & CStr(iInd) + $aField[iInd] = sField + Next + + $iLine = 1 + +End + +Public Sub Read() As Collection + + Dim sLine As String + Dim aLine As String[] + Dim cCol As Collection + Dim iInd As Integer + + If Eof($hFile) Then Return + + cCol = New Collection(gb.IgnoreCase) + + Inc $iLine + sLine = $hFile.ReadLine($sEscape) + If $sCharset Then sLine = Conv(sLine, $sCharset, "UTF-8") + aLine = Split(sLine, $sSeparator, $sEscape) + + For iInd = 0 To Min($aField.Max, aLine.Max) + cCol[$aField[iInd]] = Trim(Replace(aLine[iInd], String.Chr(160), " ")) + Next + + Return cCol + +End + +Private Function Eof_Read() As Boolean + + Return Eof($hFile) + +End + +Private Function Fields_Read() As String[] + + Return $aField.Copy() + +End + +Private Function Line_Read() As Integer + + Return $iLine + +End + +Private Sub Fields_Write(Value As String[]) + + If Not $bWrite Then Error.Raise("Read-only property") + If Not Value Or If Value.Count < 1 Then Error.Raise("Bad number of columns") + $aField = Value.Copy() + +End + +Public Sub Close() + + Close #$hFile + +End + +Static Public Sub Quote(Value As String, Optional Separator As String = ",", Optional Escape As String = "\"") As String + + If InStr(Value, Separator) Or If InStr(Value, "\n") Or If InStr(Value, " ") Or If InStr(Value, Escape) Then + Return Escape & Replace(Replace(Value, "\r", ""), Escape, Escape & Escape) & Escape + Else + Return Value + Endif + +End + +Private Sub Print(sVal As String, Optional bNoSep As Boolean) + + If Not bNoSep Then Print #$hFile, ","; + + If InStr(sVal, $sSeparator) Or If InStr(sVal, "\n") Or If InStr(sVal, " ") Or If InStr(sVal, $sEscape) Then + If $sCharset Then + Print #$hFile, Conv($sEscape & Replace(Replace(sVal, "\r", ""), $sEscape, $sEscape & $sEscape) & $sEscape, "UTF-8", $sCharset); + Else + Print #$hFile, $sEscape; Replace(Replace(sVal, "\r", ""), $sEscape, $sEscape & $sEscape); $sEscape; + Endif + Else + If $sCharset Then + Print #$hFile, Conv(sVal, "UTF-8", $sCharset); + Else + Print #$hFile, sVal; + Endif + Endif + +End + +Public Sub Write({Line} As Variant) + + Dim I As Integer + Dim cLine As Collection + Dim aLine As String[] + + If $iLine = 0 Then + + If Not $aField Or If $aField.Count < 1 Then Error.Raise("The Field property must be set first") + + Print($aField[0], True) + For I = 1 To $aField.Max + Print($aField[I]) + Next + Print #$hFile + Inc $iLine + + Endif + + Try cLine = {Line} + If cLine Then + Print(cLine[$aField[0]], True) + For I = 1 To $aField.Max + Print(cLine[$aField[I]]) + Next + Else + Try aLine = {Line} + If aLine Then + Print(aLine[0], True) + For I = 1 To $aField.Max + Print(aLine[I]) + Next + Else + Error.Raise("Type mismatch. Collection or Array expected") + Endif + Endif + + Print #$hFile + Inc $iLine + +End diff --git a/comp/src/gb.util/.src/Date.module b/comp/src/gb.util/.src/Date.module new file mode 100644 index 00000000..3b145a8d --- /dev/null +++ b/comp/src/gb.util/.src/Date.module @@ -0,0 +1,201 @@ +' Gambas module file + +Export + +Private $aDay As String[] +Private $aMonth As String[] +Private $dEpoch As Date + +Public Sub ToUnixTime({Date} As Date) As Long + + If Not $dEpoch Then $dEpoch = DateAdd(Date(1970, 1, 1), gb.Second, -System.TimeZone) + Return DateDiff($dEpoch, {Date}, gb.Second) + +End + +Public Sub FromUnixTime(UnixTime As Long) As Date + + If Not $dEpoch Then $dEpoch = DateAdd(Date(1970, 1, 1), gb.Second, -System.TimeZone) + Return $dEpoch + UnixTime / 86400 + +End + +' Gregorian algorithm by Aloysius Lilius And Christophorus Clavius. +' Valid For any year since 1583. + +Public Sub EasterDay(Year As Integer) As Date + + Dim A, B, C, D, E, F, G As Integer + + If Year < 1583 Then Error.Raise("Year must be greater or equal than 1583") + + A = Year Mod 19 + 1 + B = Year Div 100 + 1 + C = (3 * B) Div 4 - 12 + D = (8 * B + 5) Div 25 - 5 + E = (Year * 5) Div 4 - 10 - C + F = ((11 * A + 20 + D - C) Mod 30 + 30) Mod 30 + If F = 24 Or (F = 25 And A > 11) Then F = F + 1 + G = 44 - F + If G < 21 Then G = G + 30 + Return DateAdd(Date(Year, 3, 1), gb.Day, G + 7 - (E + G) Mod 7 - 1) + +End + +Private Sub InitDaysMonths() + + If Not $aDay Then + $aDay = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"] + $aMonth = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] + Endif + +End + +Public Sub ToUTC({Date} As Date) As Date + + Return {Date} + System.TimeZone / 86400 + +End + +Public Sub FromUTC({Date} As Date) As Date + + Return {Date} - System.TimeZone / 86400 + +End + +Private Sub GetRFC822Zone(sZone As String) As Float + + Dim fZone As Float + + Select Case sZone + Case "UT", "GMT", "Z" + fZone = 0 + Case "EDT" + fZone = -4 + Case "EST", "CDT" + fZone = -5 + Case "CST", "MDT" + fZone = -6 + Case "MST", "PDT" + fZone = -7 + Case "PST" + fZone = -8 + Case Like "[A-I]" + fZone = -(Asc(sZone) - 64) + Case Like "[J-M]" + fZone = -(Asc(sZone) - 65) + Case Like "[N-Y]" + fZone = Asc(sZone) - 77 + Case Like "[+-][0-1][0-9][0-5][0-9]" + fZone = CInt(Left(sZone, 3)) + CInt(Mid$(sZone, 4)) / 60 + Case Else + Error.Raise(Subst$("Unknown timezone '&1'", sZone)) + End Select + + Return fZone / 24 + +End + +Public Sub ToRFC822({Date} As Date, Optional TimeZone As String = "GMT") As String + + InitDaysMonths + {Date} = ToUTC({Date}) + GetRFC822Zone(TimeZone) + Return $aDay[WeekDay({Date})] & ", " & Format(Day({Date}), "00") & " " & $aMonth[Month({Date}) - 1] & " " & Year({Date}) & " " & Format(Hour({Date}), "00") & ":" & Format(Minute({Date}), "00") & ":" & Format(Second({Date}), "00") & " " & TimeZone + +End + +Public Sub FromRFC822(Value As String, Optional ByRef TimeZone As String) As Date + + Dim aDate As String[] + Dim dDate As Date + Dim iPos As Integer + Dim iWeekDay As Integer + Dim iYear As Integer + + InitDaysMonths + Value = Trim(Value) + + iPos = InStr(Value, ", ") + If iPos Then + iWeekDay = $aDay.Find(Trim(Left(Value, iPos - 1))) + If iWeekDay < 0 Then Error.Raise("Unknown week day") + Value = Trim(Mid$(Value, iPos + 2)) + Else + iWeekDay = -1 + Endif + + aDate = Scan(Value, "* * * *:* *") + If aDate.Count <> 6 Then Return + + iPos = InStr(aDate[4], ":") + If iPos Then + aDate.Add(Mid$(aDate[4], iPos + 1), 5) + aDate[4] = Left(aDate[4], iPos - 1) + Else + aDate.Add("0", 5) + Endif + + iYear = CInt(aDate[2]) + If iYear >= 0 And If iYear <= 99 Then iYear += 1900 + dDate = Date(iYear, $aMonth.Find(aDate[1]) + 1, CInt(aDate[0]), CInt(aDate[3]), CInt(aDate[4]), CInt(aDate[5])) + If iWeekDay >= 0 And If WeekDay(dDate) <> iWeekDay Then Error.Raise("Incorrect week day") + + dDate = FromUTC(dDate) - GetRFC822Zone(aDate[6]) + + TimeZone = aDate[6] + Return dDate + +Catch + + If Error.Class.Name = "Date" Then Error.Propagate + Error.Raise("Not a RFC822 date format") + +End + +Public Sub IsWeekEnd({Date} As Date) As Boolean + + Dim iDay As Integer = WeekDay({Date}) + If iDay = gb.Sunday Or If iDay = gb.Saturday Then Return True + +End + +Public Sub ToISO8601({Date} As Date, Optional Timezone As String) As String + + Dim iYear As Integer + Dim sResult As String + Dim sMicroseconds As String + Dim fTimeZone As Float + + If Not IsMissing(TimeZone) Then + fTimeZone = GetRFC822Zone(TimeZone) + Else + fTimeZone = -System.TimeZone / 86400 + Endif + + {Date} = ToUTC({Date}) + fTimeZone + + If fTimeZone > 0 Then + TimeZone = "+" & Format(CDate(fTimeZone), "hhnn") + Else If fTimeZone < 0 Then + TimeZone = "-" & Format(CDate(-fTimeZone), "hhnn") + Else + TimeZone = "Z" + Endif + + iYear = Year({Date}) + + If iYear Then + + If iYear < 0 Then sResult = "B" + sResult &= Format(iYear, "0000") & "-" & Format(Month({Date}), "00") & "-" & Format(Day({Date}), "00") + + Endif + + sResult &= "T" & Format({Date}, "hhnnss") + + sMicroseconds = Format({Date}, "uuu") + If sMicroseconds <> "000" Then sResult &= "," & sMicroseconds + + Return sResult & TimeZone + +End diff --git a/comp/src/gb.util/.src/File.class b/comp/src/gb.util/.src/File.class new file mode 100644 index 00000000..404acac3 --- /dev/null +++ b/comp/src/gb.util/.src/File.class @@ -0,0 +1,29 @@ +' Gambas class file + +Export + +Static Public Sub FormatSize(Size As Long, Optional {Binary} As Boolean) As String + + If {Binary} Then + If Size < 1024 Then + Return Subst(("&1 B"), CStr(Size)) + Else If Size < 1048576 Then + Return Subst(("&1 KiB"), Format(Size / 1024, "0.##")) + Else If Size < 1073741824 Then + Return Subst(("&1 MiB"), Format(Size / 1048576, "0.##")) + Else + Return Subst(("&1 GiB"), Format(Size / 1073741824, "0.##")) + Endif + Else + If Size < 1000 Then + Return Subst(("&1 B"), CStr(Size)) + Else If Size < 1000000 Then + Return Subst(("&1 KB"), Format(Size / 1000, "0.##")) + Else If Size < 1000000000 Then + Return Subst(("&1 MB"), Format(Size / 1000000, "0.##")) + Else + Return Subst(("&1 GB"), Format(Size / 1000000000, "0.##")) + Endif + Endif + +End diff --git a/comp/src/gb.util/.src/MMain.module b/comp/src/gb.util/.src/MMain.module new file mode 100644 index 00000000..e5e77340 --- /dev/null +++ b/comp/src/gb.util/.src/MMain.module @@ -0,0 +1,61 @@ +' Gambas module file + +' Public Sub Main() +' +' Dim I As Integer +' Dim fTimer As Float +' Dim sData As String +' +' sData = File.Load("~/.local/share/gambas3/wiki/data/en/doc/object-model/~page") +' +' fTimer = Timer +' For I = 1 To 1000 +' String.RemoveDiacritics(sData) +' Next +' Print Timer - fTimer +' +' End + +Public Sub Main() + + 'Print String.PadLeft("Gambas", 16, "×->") + 'Print String.PadRight("Gambas", 16, "×->") + 'Print Now;; Date.ToISO8601(Now);; Date.ToISO8601(Now, "-0200") + + Print DateAdd(Date.EasterDay(2020), gb.Day, 40) + +End + +Public Sub RFC822Test() + + Dim sTimeZone As String + + ' Must be correct in the local timezone + Print CStr(Now) + Print Format(Now) + Print CStr(Date.FromRFC822("Sun, 21 Apr 2019 05:00:00 +0000")) + Print Format$(Date.FromRFC822("Sun, 21 Apr 2019 05:00:00 +0000")) + Print Date.FromRFC822("Sun, 21 Apr 2019 05:00:00 +0100") + Print Date.FromRFC822("Tue, 1 Jan 2019 00:00:00 +0800") + Print Date.ToRFC822(Now) + Print Date.ToRFC822(Now, "+0100") + Print "---" + ' Timezone to-from conversion should be the identity mapping + Print Date.ToRFC822(Date.FromRFC822("Sun, 21 Apr 2019 05:00:00 +0000"), "+0000") + Print Date.ToRFC822(Date.FromRFC822("Sun, 21 Apr 2019 05:00:00 +0000"), "+0100") + Print Date.ToRFC822(Date.FromRFC822("Sun, 21 Apr 2019 05:00:00 +0000"), "+0800") + Print Date.ToRFC822(Date.FromRFC822("Sun, 21 Apr 2019 05:00:00 +0100"), "+0000") + Print Date.ToRFC822(Date.FromRFC822("Sun, 21 Apr 2019 05:00:00 +0100"), "+0100") + Print Date.ToRFC822(Date.FromRFC822("Sun, 21 Apr 2019 05:00:00 +0100"), "+0800") + Print Date.ToRFC822(Date.FromRFC822("Sun, 21 Apr 2019 05:00:00 +0800"), "+0000") + Print Date.ToRFC822(Date.FromRFC822("Sun, 21 Apr 2019 05:00:00 +0800"), "+0100") + Print Date.ToRFC822(Date.FromRFC822("Sun, 21 Apr 2019 05:00:00 +0800"), "+0800") + Print "---" + ' Ability to extract timezone + Date.FromRFC822("Sun, 21 Apr 2019 05:00:00 +0100", ByRef sTimeZone) + Print sTimeZone + ' 21 Apr 2019 is not a Wednesday + Try Date.FromRFC822("Wed, 21 Apr 2019 05:00:00 +0100") + If Error Then Print Error.Text + +End diff --git a/comp/src/gb.util/.src/MPhonetic_English.module b/comp/src/gb.util/.src/MPhonetic_English.module new file mode 100644 index 00000000..7d169be6 --- /dev/null +++ b/comp/src/gb.util/.src/MPhonetic_English.module @@ -0,0 +1,876 @@ +' Gambas module file + +Public Sub Before(sStr As String) As String + + Return sStr + +End + +Public Sub Run((sStr) As String) As String + ' //////////////////////////////////////////////////////////////////////////////// + ' // Double Metaphone (c) 1998, 1999 by Lawrence Philips + ' // + ' // Slightly modified by Kevin Atkinson to fix several bugs and + ' // to allow it to give back more than 4 characters. + ' // + ' // + ' //////////////////////////////////////////////////////////////////////////////// + ' #include "stdafx.h" + ' #include "dmetaph.h" + ' + ' #define AND && + ' #define OR || + ' + ' //////////////////////////////////////////////////////////////////////////////// + ' // + ' //////////////////////////////////////////////////////////////////////////////// + ' MString::MString() + ' { + ' } + ' + ' //////////////////////////////////////////////////////////////////////////////// + ' // + ' //////////////////////////////////////////////////////////////////////////////// + ' MString::MString(const char* in) : CString(in) + ' { + ' } + ' + ' //////////////////////////////////////////////////////////////////////////////// + ' // + ' //////////////////////////////////////////////////////////////////////////////// + ' MString::MString(const CString& in) : CString(in) + ' { + ' } + ' + ' //////////////////////////////////////////////////////////////////////////////// + ' // + ' //////////////////////////////////////////////////////////////////////////////// + ' bool MString::SlavoGermanic() + ' { + ' if((Find('W') > -1) OR (Find('K') > -1) OR (Find("CZ") > -1) OR (Find("WITZ") > -1)) + ' return TRUE; + ' + ' return FALSE; + ' } + ' + ' //////////////////////////////////////////////////////////////////////////////// + ' // + ' //////////////////////////////////////////////////////////////////////////////// + ' inline void MString::MetaphAdd(const char* main) + ' { + ' if(*main) + ' { + ' primary += main; + ' secondary += main; + ' } + ' } + ' + ' //////////////////////////////////////////////////////////////////////////////// + ' // + ' //////////////////////////////////////////////////////////////////////////////// + ' inline void MString::MetaphAdd(const char* main, const char* alt) + ' { + ' if(*main) + ' primary += main; + ' if(*alt) + ' { + ' alternate = TRUE; + ' if(alt[0] != ' ') + ' secondary += alt; + ' }else + ' if(*main AND (main[0] != ' ')) + ' secondary += main; + ' } + ' + ' //////////////////////////////////////////////////////////////////////////////// + ' // + ' //////////////////////////////////////////////////////////////////////////////// + ' bool MString::IsVowel(int at) + ' { + ' + ' if((at < 0) OR (at >= length)) + ' return false; + ' + ' char it = GetAt(at); + ' + ' if((it == 'A') OR (it == 'E') OR (it == 'I') OR (it == 'O') OR (it == 'U') OR (it == 'Y') ) + ' return true; + ' + ' return false; + ' } + ' + ' //////////////////////////////////////////////////////////////////////////////// + ' // + ' //////////////////////////////////////////////////////////////////////////////// + ' bool MString::StringAt(int start, int length, ... ) + ' { + ' + ' if (start < 0) return FALSE; + ' + ' char buffer[64]; + ' char* test; + ' CString target; + ' + ' test = buffer; + ' target = Mid(start, length); + ' + ' va_list sstrings; + ' va_start(sstrings, length); + ' + ' do + ' { + ' test = va_arg(sstrings, char*); + ' if(*test AND (target == test)) + ' return true; + ' + ' }while(strcmp(test, "")); + ' + ' va_end(sstrings); + ' + ' return false; + ' } + ' + ' //////////////////////////////////////////////////////////////////////////////// + ' // main deal + ' //////////////////////////////////////////////////////////////////////////////// + ' void MString::DoubleMetaphone(CString &metaph, CString &metaph2) + ' { + ' + ' int current = 0; + ' + ' length = GetLength(); + ' if(length < 1) + ' return; + ' last = length - 1;//zero based index + ' + ' alternate = FALSE; + ' + ' MakeUpper(); + ' + ' //pad the original string so that we can index beyond the edge of the world + ' Insert(GetLength(), " "); + ' + ' //skip these when at start of word + ' if(StringAt(0, 2, "GN", "KN", "PN", "WR", "PS", "")) + ' current += 1; + ' + ' //Initial 'X' is pronounced 'Z' e.g. 'Xavier' + ' if(GetAt(0) == 'X') + ' { + ' MetaphAdd("S"); //'Z' maps to 'S' + ' current += 1; + ' } + ' + ' ///////////main loop////////////////////////// + ' while(TRUE OR (primary.GetLength() < 4) OR (secondary.GetLength() < 4)) + ' { + ' if(current >= length) + ' break; + ' + ' switch(GetAt(current)) + ' { + ' case 'A': + ' case 'E': + ' case 'I': + ' case 'O': + ' case 'U': + ' case 'Y': + ' if(current == 0) + ' //all init vowels now map to 'A' + ' MetaphAdd("A"); + ' current +=1; + ' break; + ' + ' case 'B': + ' + ' //"-mb", e.g", "dumb", already skipped over... + ' MetaphAdd("P"); + ' + ' if(GetAt(current + 1) == 'B') + ' current +=2; + ' else + ' current +=1; + ' break; + ' + ' case 'Ç': + ' MetaphAdd("S"); + ' current += 1; + ' break; + ' + ' case 'C': + ' //various germanic + ' if((current > 1) + ' AND !IsVowel(current - 2) + ' AND StringAt((current - 1), 3, "ACH", "") + ' AND ((GetAt(current + 2) != 'I') AND ((GetAt(current + 2) != 'E') + ' OR StringAt((current - 2), 6, "BACHER", "MACHER", "")) )) + ' { + ' MetaphAdd("K"); + ' current +=2; + ' break; + ' } + ' + ' //special case 'caesar' + ' if((current == 0) AND StringAt(current, 6, "CAESAR", "")) + ' { + ' MetaphAdd("S"); + ' current +=2; + ' break; + ' } + ' + ' //italian 'chianti' + ' if(StringAt(current, 4, "CHIA", "")) + ' { + ' MetaphAdd("K"); + ' current +=2; + ' break; + ' } + ' + ' if(StringAt(current, 2, "CH", "")) + ' { + ' //find 'michael' + ' if((current > 0) AND StringAt(current, 4, "CHAE", "")) + ' { + ' MetaphAdd("K", "X"); + ' current +=2; + ' break; + ' } + ' + ' //greek roots e.g. 'chemistry', 'chorus' + ' if((current == 0) + ' AND (StringAt((current + 1), 5, "HARAC", "HARIS", "") + ' OR StringAt((current + 1), 3, "HOR", "HYM", "HIA", "HEM", "")) + ' AND !StringAt(0, 5, "CHORE", "")) + ' { + ' MetaphAdd("K"); + ' current +=2; + ' break; + ' } + ' + ' //germanic, greek, or otherwise 'ch' for 'kh' sound + ' if((StringAt(0, 4, "VAN ", "VON ", "") OR StringAt(0, 3, "SCH", "")) + ' // 'architect but not 'arch', 'orchestra', 'orchid' + ' OR StringAt((current - 2), 6, "ORCHES", "ARCHIT", "ORCHID", "") + ' OR StringAt((current + 2), 1, "T", "S", "") + ' OR ((StringAt((current - 1), 1, "A", "O", "U", "E", "") OR (current == 0)) + ' //e.g., 'wachtler', 'wechsler', but not 'tichner' + ' AND StringAt((current + 2), 1, "L", "R", "N", "M", "B", "H", "F", "V", "W", " ", ""))) + ' { + ' MetaphAdd("K"); + ' }else{ + ' if(current > 0) + ' { + ' if(StringAt(0, 2, "MC", "")) + ' //e.g., "McHugh" + ' MetaphAdd("K"); + ' else + ' MetaphAdd("X", "K"); + ' }else + ' MetaphAdd("X"); + ' } + ' current +=2; + ' break; + ' } + ' //e.g, 'czerny' + ' if(StringAt(current, 2, "CZ", "") AND !StringAt((current - 2), 4, "WICZ", "")) + ' { + ' MetaphAdd("S", "X"); + ' current += 2; + ' break; + ' } + ' + ' //e.g., 'focaccia' + ' if(StringAt((current + 1), 3, "CIA", "")) + ' { + ' MetaphAdd("X"); + ' current += 3; + ' break; + ' } + ' + ' //double 'C', but not if e.g. 'McClellan' + ' if(StringAt(current, 2, "CC", "") AND !((current == 1) AND (GetAt(0) == 'M'))) + ' //'bellocchio' but not 'bacchus' + ' if(StringAt((current + 2), 1, "I", "E", "H", "") AND !StringAt((current + 2), 2, "HU", "")) + ' { + ' //'accident', 'accede' 'succeed' + ' if(((current == 1) AND (GetAt(current - 1) == 'A')) + ' OR StringAt((current - 1), 5, "UCCEE", "UCCES", "")) + ' MetaphAdd("KS"); + ' //'bacci', 'bertucci', other italian + ' else + ' MetaphAdd("X"); + ' current += 3; + ' break; + ' }else{//Pierce's rule + ' MetaphAdd("K"); + ' current += 2; + ' break; + ' } + ' + ' if(StringAt(current, 2, "CK", "CG", "CQ", "")) + ' { + ' MetaphAdd("K"); + ' current += 2; + ' break; + ' } + ' + ' if(StringAt(current, 2, "CI", "CE", "CY", "")) + ' { + ' //italian vs. english + ' if(StringAt(current, 3, "CIO", "CIE", "CIA", "")) + ' MetaphAdd("S", "X"); + ' else + ' MetaphAdd("S"); + ' current += 2; + ' break; + ' } + ' + ' //else + ' MetaphAdd("K"); + ' + ' //name sent in 'mac caffrey', 'mac gregor + ' if(StringAt((current + 1), 2, " C", " Q", " G", "")) + ' current += 3; + ' else + ' if(StringAt((current + 1), 1, "C", "K", "Q", "") + ' AND !StringAt((current + 1), 2, "CE", "CI", "")) + ' current += 2; + ' else + ' current += 1; + ' break; + ' + ' case 'D': + ' if(StringAt(current, 2, "DG", "")) + ' if(StringAt((current + 2), 1, "I", "E", "Y", "")) + ' { + ' //e.g. 'edge' + ' MetaphAdd("J"); + ' current += 3; + ' break; + ' }else{ + ' //e.g. 'edgar' + ' MetaphAdd("TK"); + ' current += 2; + ' break; + ' } + ' + ' if(StringAt(current, 2, "DT", "DD", "")) + ' { + ' MetaphAdd("T"); + ' current += 2; + ' break; + ' } + ' + ' //else + ' MetaphAdd("T"); + ' current += 1; + ' break; + ' + ' case 'F': + ' if(GetAt(current + 1) == 'F') + ' current += 2; + ' else + ' current += 1; + ' MetaphAdd("F"); + ' break; + ' + ' case 'G': + ' if(GetAt(current + 1) == 'H') + ' { + ' if((current > 0) AND !IsVowel(current - 1)) + ' { + ' MetaphAdd("K"); + ' current += 2; + ' break; + ' } + ' + ' if(current < 3) + ' { + ' //'ghislane', ghiradelli + ' if(current == 0) + ' { + ' if(GetAt(current + 2) == 'I') + ' MetaphAdd("J"); + ' else + ' MetaphAdd("K"); + ' current += 2; + ' break; + ' } + ' } + ' //Parker's rule (with some further refinements) - e.g., 'hugh' + ' if(((current > 1) AND StringAt((current - 2), 1, "B", "H", "D", "") ) + ' //e.g., 'bough' + ' OR ((current > 2) AND StringAt((current - 3), 1, "B", "H", "D", "") ) + ' //e.g., 'broughton' + ' OR ((current > 3) AND StringAt((current - 4), 1, "B", "H", "") ) ) + ' { + ' current += 2; + ' break; + ' }else{ + ' //e.g., 'laugh', 'McLaughlin', 'cough', 'gough', 'rough', 'tough' + ' if((current > 2) + ' AND (GetAt(current - 1) == 'U') + ' AND StringAt((current - 3), 1, "C", "G", "L", "R", "T", "") ) + ' { + ' MetaphAdd("F"); + ' }else + ' if((current > 0) AND GetAt(current - 1) != 'I') + ' MetaphAdd("K"); + ' + ' current += 2; + ' break; + ' } + ' } + ' + ' if(GetAt(current + 1) == 'N') + ' { + ' if((current == 1) AND IsVowel(0) AND !SlavoGermanic()) + ' { + ' MetaphAdd("KN", "N"); + ' }else + ' //not e.g. 'cagney' + ' if(!StringAt((current + 2), 2, "EY", "") + ' AND (GetAt(current + 1) != 'Y') AND !SlavoGermanic()) + ' { + ' MetaphAdd("N", "KN"); + ' }else + ' MetaphAdd("KN"); + ' current += 2; + ' break; + ' } + ' + ' //'tagliaro' + ' if(StringAt((current + 1), 2, "LI", "") AND !SlavoGermanic()) + ' { + ' MetaphAdd("KL", "L"); + ' current += 2; + ' break; + ' } + ' + ' //-ges-,-gep-,-gel-, -gie- at beginning + ' if((current == 0) + ' AND ((GetAt(current + 1) == 'Y') + ' OR StringAt((current + 1), 2, "ES", "EP", "EB", "EL", "EY", "IB", "IL", "IN", "IE", "EI", "ER", "")) ) + ' { + ' MetaphAdd("K", "J"); + ' current += 2; + ' break; + ' } + ' + ' // -ger-, -gy- + ' if((StringAt((current + 1), 2, "ER", "") OR (GetAt(current + 1) == 'Y')) + ' AND !StringAt(0, 6, "DANGER", "RANGER", "MANGER", "") + ' AND !StringAt((current - 1), 1, "E", "I", "") + ' AND !StringAt((current - 1), 3, "RGY", "OGY", "") ) + ' { + ' MetaphAdd("K", "J"); + ' current += 2; + ' break; + ' } + ' + ' // italian e.g, 'biaggi' + ' if(StringAt((current + 1), 1, "E", "I", "Y", "") OR StringAt((current - 1), 4, "AGGI", "OGGI", "")) + ' { + ' //obvious germanic + ' if((StringAt(0, 4, "VAN ", "VON ", "") OR StringAt(0, 3, "SCH", "")) + ' OR StringAt((current + 1), 2, "ET", "")) + ' MetaphAdd("K"); + ' else + ' //always soft if french ending + ' if(StringAt((current + 1), 4, "IER ", "")) + ' MetaphAdd("J"); + ' else + ' MetaphAdd("J", "K"); + ' current += 2; + ' break; + ' } + ' + ' if(GetAt(current + 1) == 'G') + ' current += 2; + ' else + ' current += 1; + ' MetaphAdd("K"); + ' break; + ' + ' case 'H': + ' //only keep if first & before vowel or btw. 2 vowels + ' if(((current == 0) OR IsVowel(current - 1)) + ' AND IsVowel(current + 1)) + ' { + ' MetaphAdd("H"); + ' current += 2; + ' }else//also takes care of 'HH' + ' current += 1; + ' break; + ' + ' case 'J': + ' //obvious spanish, 'jose', 'san jacinto' + ' if(StringAt(current, 4, "JOSE", "") OR StringAt(0, 4, "SAN ", "") ) + ' { + ' if(((current == 0) AND (GetAt(current + 4) == ' ')) OR StringAt(0, 4, "SAN ", "") ) + ' MetaphAdd("H"); + ' else + ' { + ' MetaphAdd("J", "H"); + ' } + ' current +=1; + ' break; + ' } + ' + ' if((current == 0) AND !StringAt(current, 4, "JOSE", "")) + ' MetaphAdd("J", "A");//Yankelovich/Jankelowicz + ' else + ' //spanish pron. of e.g. 'bajador' + ' if(IsVowel(current - 1) + ' AND !SlavoGermanic() + ' AND ((GetAt(current + 1) == 'A') OR (GetAt(current + 1) == 'O'))) + ' MetaphAdd("J", "H"); + ' else + ' if(current == last) + ' MetaphAdd("J", " "); + ' else + ' if(!StringAt((current + 1), 1, "L", "T", "K", "S", "N", "M", "B", "Z", "") + ' AND !StringAt((current - 1), 1, "S", "K", "L", "")) + ' MetaphAdd("J"); + ' + ' if(GetAt(current + 1) == 'J')//it could happen! + ' current += 2; + ' else + ' current += 1; + ' break; + ' + ' case 'K': + ' if(GetAt(current + 1) == 'K') + ' current += 2; + ' else + ' current += 1; + ' MetaphAdd("K"); + ' break; + ' + ' case 'L': + ' if(GetAt(current + 1) == 'L') + ' { + ' //spanish e.g. 'cabrillo', 'gallegos' + ' if(((current == (length - 3)) + ' AND StringAt((current - 1), 4, "ILLO", "ILLA", "ALLE", "")) + ' OR ((StringAt((last - 1), 2, "AS", "OS", "") OR StringAt(last, 1, "A", "O", "")) + ' AND StringAt((current - 1), 4, "ALLE", "")) ) + ' { + ' MetaphAdd("L", " "); + ' current += 2; + ' break; + ' } + ' current += 2; + ' }else + ' current += 1; + ' MetaphAdd("L"); + ' break; + ' + ' case 'M': + ' if((StringAt((current - 1), 3, "UMB", "") + ' AND (((current + 1) == last) OR StringAt((current + 2), 2, "ER", ""))) + ' //'dumb','thumb' + ' OR (GetAt(current + 1) == 'M') ) + ' current += 2; + ' else + ' current += 1; + ' MetaphAdd("M"); + ' break; + ' + ' case 'N': + ' if(GetAt(current + 1) == 'N') + ' current += 2; + ' else + ' current += 1; + ' MetaphAdd("N"); + ' break; + ' + ' case 'Ñ': + ' current += 1; + ' MetaphAdd("N"); + ' break; + ' + ' case 'P': + ' if(GetAt(current + 1) == 'H') + ' { + ' MetaphAdd("F"); + ' current += 2; + ' break; + ' } + ' + ' //also account for "campbell", "raspberry" + ' if(StringAt((current + 1), 1, "P", "B", "")) + ' current += 2; + ' else + ' current += 1; + ' MetaphAdd("P"); + ' break; + ' + ' case 'Q': + ' if(GetAt(current + 1) == 'Q') + ' current += 2; + ' else + ' current += 1; + ' MetaphAdd("K"); + ' break; + ' + ' case 'R': + ' //french e.g. 'rogier', but exclude 'hochmeier' + ' if((current == last) + ' AND !SlavoGermanic() + ' AND StringAt((current - 2), 2, "IE", "") + ' AND !StringAt((current - 4), 2, "ME", "MA", "")) + ' MetaphAdd("", "R"); + ' else + ' MetaphAdd("R"); + ' + ' if(GetAt(current + 1) == 'R') + ' current += 2; + ' else + ' current += 1; + ' break; + ' + ' case 'S': + ' //special cases 'island', 'isle', 'carlisle', 'carlysle' + ' if(StringAt((current - 1), 3, "ISL", "YSL", "")) + ' { + ' current += 1; + ' break; + ' } + ' + ' //special case 'sugar-' + ' if((current == 0) AND StringAt(current, 5, "SUGAR", "")) + ' { + ' MetaphAdd("X", "S"); + ' current += 1; + ' break; + ' } + ' + ' if(StringAt(current, 2, "SH", "")) + ' { + ' //germanic + ' if(StringAt((current + 1), 4, "HEIM", "HOEK", "HOLM", "HOLZ", "")) + ' MetaphAdd("S"); + ' else + ' MetaphAdd("X"); + ' current += 2; + ' break; + ' } + ' + ' //italian & armenian + ' if(StringAt(current, 3, "SIO", "SIA", "") OR StringAt(current, 4, "SIAN", "")) + ' { + ' if(!SlavoGermanic()) + ' MetaphAdd("S", "X"); + ' else + ' MetaphAdd("S"); + ' current += 3; + ' break; + ' } + ' + ' //german & anglicisations, e.g. 'smith' match 'schmidt', 'snider' match 'schneider' + ' //also, -sz- in slavic language altho in hungarian it is pronounced 's' + ' if(((current == 0) + ' AND StringAt((current + 1), 1, "M", "N", "L", "W", "")) + ' OR StringAt((current + 1), 1, "Z", "")) + ' { + ' MetaphAdd("S", "X"); + ' if(StringAt((current + 1), 1, "Z", "")) + ' current += 2; + ' else + ' current += 1; + ' break; + ' } + ' + ' if(StringAt(current, 2, "SC", "")) + ' { + ' //Schlesinger's rule + ' if(GetAt(current + 2) == 'H') + ' //dutch origin, e.g. 'school', 'schooner' + ' if(StringAt((current + 3), 2, "OO", "ER", "EN", "UY", "ED", "EM", "")) + ' { + ' //'schermerhorn', 'schenker' + ' if(StringAt((current + 3), 2, "ER", "EN", "")) + ' { + ' MetaphAdd("X", "SK"); + ' }else + ' MetaphAdd("SK"); + ' current += 3; + ' break; + ' }else{ + ' if((current == 0) AND !IsVowel(3) AND (GetAt(3) != 'W')) + ' MetaphAdd("X", "S"); + ' else + ' MetaphAdd("X"); + ' current += 3; + ' break; + ' } + ' + ' if(StringAt((current + 2), 1, "I", "E", "Y", "")) + ' { + ' MetaphAdd("S"); + ' current += 3; + ' break; + ' } + ' //else + ' MetaphAdd("SK"); + ' current += 3; + ' break; + ' } + ' + ' //french e.g. 'resnais', 'artois' + ' if((current == last) AND StringAt((current - 2), 2, "AI", "OI", "")) + ' MetaphAdd("", "S"); + ' else + ' MetaphAdd("S"); + ' + ' if(StringAt((current + 1), 1, "S", "Z", "")) + ' current += 2; + ' else + ' current += 1; + ' break; + ' + ' case 'T': + ' if(StringAt(current, 4, "TION", "")) + ' { + ' MetaphAdd("X"); + ' current += 3; + ' break; + ' } + ' + ' if(StringAt(current, 3, "TIA", "TCH", "")) + ' { + ' MetaphAdd("X"); + ' current += 3; + ' break; + ' } + ' + ' if(StringAt(current, 2, "TH", "") + ' OR StringAt(current, 3, "TTH", "")) + ' { + ' //special case 'thomas', 'thames' or germanic + ' if(StringAt((current + 2), 2, "OM", "AM", "") + ' OR StringAt(0, 4, "VAN ", "VON ", "") + ' OR StringAt(0, 3, "SCH", "")) + ' { + ' MetaphAdd("T"); + ' }else{ + ' MetaphAdd("0", "T"); + ' } + ' current += 2; + ' break; + ' } + ' + ' if(StringAt((current + 1), 1, "T", "D", "")) + ' current += 2; + ' else + ' current += 1; + ' MetaphAdd("T"); + ' break; + ' + ' case 'V': + ' if(GetAt(current + 1) == 'V') + ' current += 2; + ' else + ' current += 1; + ' MetaphAdd("F"); + ' break; + ' + ' case 'W': + ' //can also be in middle of word + ' if(StringAt(current, 2, "WR", "")) + ' { + ' MetaphAdd("R"); + ' current += 2; + ' break; + ' } + ' + ' if((current == 0) + ' AND (IsVowel(current + 1) OR StringAt(current, 2, "WH", ""))) + ' { + ' //Wasserman should match Vasserman + ' if(IsVowel(current + 1)) + ' MetaphAdd("A", "F"); + ' else + ' //need Uomo to match Womo + ' MetaphAdd("A"); + ' } + ' + ' //Arnow should match Arnoff + ' if(((current == last) AND IsVowel(current - 1)) + ' OR StringAt((current - 1), 5, "EWSKI", "EWSKY", "OWSKI", "OWSKY", "") + ' OR StringAt(0, 3, "SCH", "")) + ' { + ' MetaphAdd("", "F"); + ' current +=1; + ' break; + ' } + ' + ' //polish e.g. 'filipowicz' + ' if(StringAt(current, 4, "WICZ", "WITZ", "")) + ' { + ' MetaphAdd("TS", "FX"); + ' current +=4; + ' break; + ' } + ' + ' //else skip it + ' current +=1; + ' break; + ' + ' case 'X': + ' //french e.g. breaux + ' if(!((current == last) + ' AND (StringAt((current - 3), 3, "IAU", "EAU", "") + ' OR StringAt((current - 2), 2, "AU", "OU", ""))) ) + ' MetaphAdd("KS"); + ' + ' if(StringAt((current + 1), 1, "C", "X", "")) + ' current += 2; + ' else + ' current += 1; + ' break; + ' + ' case 'Z': + ' //chinese pinyin e.g. 'zhao' + ' if(GetAt(current + 1) == 'H') + ' { + ' MetaphAdd("J"); + ' current += 2; + ' break; + ' }else + ' if(StringAt((current + 1), 2, "ZO", "ZI", "ZA", "") + ' OR (SlavoGermanic() AND ((current > 0) AND GetAt(current - 1) != 'T'))) + ' { + ' MetaphAdd("S", "TS"); + ' } + ' else + ' MetaphAdd("S"); + ' + ' if(GetAt(current + 1) == 'Z') + ' current += 2; + ' else + ' current += 1; + ' break; + ' + ' default: + ' current += 1; + ' } + ' } + ' + ' metaph = primary; + ' //only give back 4 char metaph + ' //if(metaph.GetLength() > 4) + ' // metaph.SetAt(4,'\0'); + ' if(alternate) + ' { + ' metaph2 = secondary; + ' //if(metaph2.GetLength() > 4) + ' // metaph2.SetAt(4,'\0'); + ' } + ' + ' } + ' + +End + diff --git a/comp/src/gb.util/.src/MPhonetic_French.module b/comp/src/gb.util/.src/MPhonetic_French.module new file mode 100644 index 00000000..51bf13cf --- /dev/null +++ b/comp/src/gb.util/.src/MPhonetic_French.module @@ -0,0 +1,278 @@ +' Gambas module file + +Public Sub Before(sStr As String) As String + + ' R0 substitution des caractères accentués par les voyelles "simples" + + sStr = Replace(sStr, "ç", "ss") + sStr = Replace(sStr, "Ç", "ss") + + Return sStr + +End + +Public Sub Run(sStr As String) As String + + Dim sSuff As String + Dim sPref As String + Dim I As Integer + Dim sPat As String + Dim sResult As String + + If IsDigit(sStr) Then Return "(" & sStr & ")" + + ' R1 remplacement du "y" par un "i" + + sStr = Replace(sStr, "y", "i") + + ' R2 remplacement du son "ph" par un simple "f" + + sStr = Replace(sStr, "ph", "f") + + ' R3 suppression des "h" muets, c'est à dire ceux qui ne sont ni précédés d'un "c" ni d'un "s" + + sStr = Replace(sStr, "ch", "cH") + sStr = Replace(sStr, "sh", "sH") + sStr = Replace(sStr, "h", "") + sStr = Replace(sStr, "H", "h") + + ' R4 remplacement du "g" par "k" devant "an/am/ain/aim" gamin -> kamin + + sStr = Replace(sStr, "gan", "kan") + sStr = Replace(sStr, "gam", "kam") + sStr = Replace(sStr, "gain", "kain") + sStr = Replace(sStr, "gaim", "kaim") + + ' R5 + ' + ' remplacement de aina,eina,aima,eima par yna + ' remplacement de aine,eine,aime,eime par yne + ' remplacement de aini,eini,aimi,eimi par yni + ' remplacement de aino,eino,aimo,eimo par yno + ' remplacement de ainu,einu,aimu,eimu par ynu + + For Each sSuff In ["na", "ne", "ni", "no", "nu"] + For Each sPref In ["a", "e", "i", "o", "u"] + sStr = Replace(sStr, sPref & "i" & sSuff, "y" & sSuff) + Next + Next +' + ' R6 + ' + ' remplacement de eau par o + ' remplacement de oua par 2 + ' remplacement de ein par 4 + ' remplacement de ain par 4 + + sStr = Replace(sStr, "eau", "o") + sStr = Replace(sStr, "oua", "2") + sStr = Replace(sStr, "ein", "4") + sStr = Replace(sStr, "ain", "4") + + ' R7 + ' + ' remplacement de ai par y + ' remplacement de ei par y + ' remplacement de ee par y + ' remplacement de er par yr + ' remplacement de ess par yss + ' remplacement de et par yt + ' remplacement de ez par yz + + sStr = Replace(sStr, "ai", "y") + sStr = Replace(sStr, "ei", "y") + sStr = Replace(sStr, "ee", "y") + sStr = Replace(sStr, "er", "yr") + sStr = Replace(sStr, "ess", "yss") + sStr = Replace(sStr, "et", "yt") + sStr = Replace(sStr, "ez", "yz") + + ' R8 suppression des lettres doublées pelle -> pele + + GoSub REMOVE_DOUBLE + + ' R9 + ' + ' remplacement de "an" par "1" + ' remplacement de "am" par "1" + ' remplacement de "en" par "1" + ' remplacement de "em" par "1" + ' remplacement de "in" par "4" + ' à condition que ces modèles ne soient ni suivis d'une voyelle ni d'un son "1" à "4" + ' patient - > pati1t + + For Each sPat In ["an", "am", "en", "em", "in"] + I = 0 + Do + I = InStr(sStr, sPat, I + 1) + If I = 0 Then Break + If InStr("aeiouy1234", Mid$(sStr, I + 2, 1)) Then + I += 2 + Else + sStr = Left(sStr, I - 1) & If(sPat = "in", "4", "1") & Mid$(sStr, I + 2) + Endif + Loop + Next + + ' R10 remplacement du "z" par "s" s'il est en tête de mot ou précédé et suivi d'une voyelle ou d'un son "1" à "4" + ' zebu -> zebu + ' azteque -> azteque + ' bizarre -> bisarre + + I = 0 + Do + I = InStr(sStr, "z", I + 1) + If I = 0 Then Break + If I = 1 + sStr = "s" & Mid$(sStr, 2) + Else If InStr("aeiouy1234", Mid$(sStr, I - 1, 1)) And If InStr("aeiouy1234", Mid$(sStr, I + 1, 1)) Then + sStr = Left(sStr, I - 1) & "s" & Mid(sStr, I + 1) + I += 1 + Endif + Loop + + ' R11 + ' + ' remplacement de "oe" par "e" + ' remplacement de "eu" par "e" + ' remplacement de "au" par "o" + ' remplacement de "oi" par "2" + ' remplacement de "ou" par "3" + ' + ' heureux -> erex + ' paul -> pol + ' roue -> r3e + + sStr = Replace(sStr, "oe", "e") + sStr = Replace(sStr, "eu", "e") + sStr = Replace(sStr, "au", "o") + sStr = Replace(sStr, "oi", "2") + sStr = Replace(sStr, "ou", "3") + + ' R12 + ' + ' remplacement de "ch" par "5" + ' remplacement de "sch" par "5" + ' remplacement de "sh" par "5" + ' remplacement de "ss" par "s" + ' remplacement de "sc" par "s" si suivi d'un "i" ou d'un "e" + ' + ' chat -> 5at + ' scaralatine -> scarlatine + ' scie -> sie + + sStr = Replace(sStr, "ch", "5") + sStr = Replace(sStr, "sch", "5") + sStr = Replace(sStr, "sh", "5") + sStr = Replace(sStr, "ss", "s") + sStr = Replace(sStr, "sci", "si") + sStr = Replace(sStr, "sce", "se") + + ' R13 remplacement du "c" par "s" s'il est suivi dun "e" ou d'un "i" + ' car -> car + ' innocence -> inosense + + sStr = Replace(sStr, "ce", "se") + sStr = Replace(sStr, "ci", "si") + + ' R14 + ' + ' remplacement de "c" par "k" + ' remplacement de "q" par "k" + ' remplacement de "qu" par "k" + ' remplacement de "gu" par "k" + ' remplacement de "ga" par "ka" + ' remplacement de "go" par "ko" + ' + ' car -> kar + ' gateau -> kato + + sStr = Replace(sStr, "c", "k") + sStr = Replace(sStr, "qu", "k") + sStr = Replace(sStr, "q", "k") + sStr = Replace(sStr, "ga", "ga") + sStr = Replace(sStr, "ge", "je") + sStr = Replace(sStr, "gi", "ji") + sStr = Replace(sStr, "go", "go") + sStr = Replace(sStr, "gu", "g") + + ' R15 + ' + ' remplacement de "a" par "o" + ' remplacement de "d" et "p" par "t" + ' remplacement de "j" par "g" + ' remplacement de "b" et "v" par "f" + ' remplacement de "m" par "n" + ' + ' depart -> tetord + ' homme -> one + + 'sStr = Replace(sStr, "a", "o") + 'sStr = Replace(sStr, "d", "t") + 'sStr = Replace(sStr, "p", "t") + 'sStr = Replace(sStr, "j", "g") + 'sStr = Replace(sStr, "b", "f") + 'sStr = Replace(sStr, "v", "f") + 'sStr = Replace(sStr, "m", "n") + 'sStr = Replace(sStr, "w", "v") + + ' R15.1 + + sStr = Replace(sStr, "w", "3") + + ' R16 (optionnelle) remplacement des "y" (les sons "é") par "e" nez -> nyz -> nez + + 'sStr = Replace(sStr, "y", "e") + + ' R17 + ' + ' suppression des finales "t","x","s","z" + ' (optionnelle) suppression du "e" final après une consonne (fait en deux fois pour eliminer les finales "ez" par exemple) + ' + ' heureux -> ere + ' tetard -> tetor + + If Len(sStr) >= 2 And If InStr("rdptxsz", Right(sStr)) Then sStr = Left(sStr, -1) + + ' If Len(sStr) >= 2 Then + ' If Right(sStr) = "e" And InStr("aeiouy", Left(Right(sStr, 2))) = 0 Then + ' sStr = Left(sStr, -1) + ' Endif + ' Endif + ' + ' If Len(sStr) >= 2 And If InStr("rtxsz", Right(sStr)) Then sStr = Left(sStr, -1) + + ' R18 suppression des lettres doubles (pour la 2ème fois) arrivee -> arive + + GoSub REMOVE_DOUBLE + + ' R19 retourne une chaine d'une taille maximale de 16 caractères et ne contenant que les caractères autorisés. + ' Au vu des traductions décrites, les caractères obtenus font partie de l'alphabet réduit: + ' 12345efghiklnorstuwxyz + ' Les caractères qui n'appartiennent pas à cet ensemble sont supprimés + + sResult = "" + For I = 1 To Len(sStr) + sPat = Mid$(sStr, I, 1) + If InStr("12345abdefghijklmnoprstuvxyz", sPat) Then + sResult &= sPat + 'If Len(sResult) = 16 Then Break + Endif + Next + + Return sResult + +REMOVE_DOUBLE: + + I = 1 + While I < Len(sStr) + If Mid$(sStr, I, 1) = Mid$(sStr, I + 1, 1) Then + sStr = Left(sStr, I) & Mid$(sStr, I + 2) + Else + Inc I + Endif + Wend + Return + +End + diff --git a/comp/src/gb.util/.src/Process.class b/comp/src/gb.util/.src/Process.class new file mode 100644 index 00000000..548e92d2 --- /dev/null +++ b/comp/src/gb.util/.src/Process.class @@ -0,0 +1,22 @@ +' Gambas class file + +Export + +Event Prompt(Prompt As String, Answer As String) + +Private $hExpect As ProcessExpect + +Public Sub Expect(Prompt As String, Optional Answer As String) + + If Not Prompt Then Return + + If Not $hExpect Then $hExpect = New ProcessExpect(Me) + $hExpect.Expect(Prompt, Answer) + +End + +Public Sub Expect_Kill() + + $hExpect = Null + +End diff --git a/comp/src/gb.util/.src/ProcessExpect.class b/comp/src/gb.util/.src/ProcessExpect.class new file mode 100644 index 00000000..9037b247 --- /dev/null +++ b/comp/src/gb.util/.src/ProcessExpect.class @@ -0,0 +1,53 @@ +' Gambas class file + +Private $aExpect As String[] +Private $sBuffer As String +Private $hObs As Observer +Private $hObsAfter As Observer + +Public Sub _new(hProcess As Process) + + $aExpect = New String[] + $hObs = New Observer(hProcess) As "Expect" + $hObsAfter = New Observer(hProcess, True) As "ExpectAfter" + +End + +Public Sub Expect(Prompt As String, Optional Answer As String) + + If Prompt Not Begins "*" Then Prompt = "*" & Prompt + $aExpect.Add(Prompt) + $aExpect.Add(Answer) + +End + +Public Sub Expect_Read() + + Dim sData As String + Dim hProcess As Process = $hObs.Object + + sData = Peek #hProcess, Lof(hProcess) + + If Len(sData) >= 1024 Then + $sBuffer = Right(sData, 1024) + Else + $sBuffer = Right($sBuffer & sData, 1024) + Endif + +End + +Public Sub ExpectAfter_Read() + + Dim hProcess As Process = $hObsAfter.Object + Dim I As Integer + + For I = 0 To $aExpect.Max Step 2 + If RTrim($sBuffer) Like $aExpect[I] Then + If $aExpect[I + 1] Then Print #hProcess, $aExpect[I + 1] + Object.Raise(hProcess, "Prompt", [$aExpect[I], $aExpect[I + 1]]) + $sBuffer = "" + Endif + Next + +End + diff --git a/comp/src/gb.util/.src/Shell.module b/comp/src/gb.util/.src/Shell.module new file mode 100644 index 00000000..41b26b9e --- /dev/null +++ b/comp/src/gb.util/.src/Shell.module @@ -0,0 +1,59 @@ +' Gambas module file + +Export + +Public Sub MkDir(Path As String) + + Dim sElt As String + Dim sMake As String = "/" + + If Path Begins "~/" Then Path = User.Home &/ Mid$(Path, 3) + + For Each sElt In Split(Path, "/") + sMake &/= sElt + If IsDir(sMake) Then Continue + Try Mkdir sMake + Next + + If Not Exist(Path) Or If Not IsDir(Path) Then Error.Raise("Cannot create directory") + +End + +Public Sub RmDir(Path As String, Optional Force As Boolean) + + Dim sFile As String + + If Len(Path) > 1 And If Right(Path) = "/" Then Path = Left(Path, -1) + + If Not Force Then + If Path = "~" Or If Path = User.Home Or If Path = "/" Then Error.Raise("Removing this directory recursively is a bad idea: " & Path) + Endif + + For Each sFile In Dir(Path) + If IsDir(Path &/ sFile) Then + RmDir(Path &/ sFile) + Else + Kill Path &/ sFile + Endif + Next + + Rmdir Path + +End + +Public Sub Move(Source As String, Destination As String, Optional Force As Boolean) + + If IsDir(Destination) Then Destination &/= File.Name(Source) + + If Force Then + Try Move Source Kill Destination + Else + Try Move Source To Destination + Endif + If Error Then + If Force Then Try Kill Destination + Copy Source To Destination + Kill Source + Endif + +End diff --git a/comp/src/gb.util/.src/String.class b/comp/src/gb.util/.src/String.class new file mode 100644 index 00000000..dae63d8e --- /dev/null +++ b/comp/src/gb.util/.src/String.class @@ -0,0 +1,335 @@ +' Gambas class file + +Export + +Private Const REMOVE_ACC As String = "ÀÁÂÃÄÅĀĂĄǍǞǠȀȂȦȺǺẠẢẬẶḀẮẰẲẴẪẤẦẨ[A]ÈÉÊËĒĖĘĚȄȨɆĔȆḘḜẸẺỆḚẼỄḔḖẾỀỂ[E]ÌÍÎÏĨĪĬĮİƗǏȈȊḬỈỊḮ[I]ŎÒÓÔÖŌŐƠǑǬȌȎȮỌỎỘỚỜỞỢỠȪȰȬÕṌṎṐṒỐỒỔỖ[O]ǗǙǛȖŬŨŮǕÙÚÛÜŪŰŲƯǓȔɄṲṴṶỤỦỨỪỬỮỰƲṺṸ[U]ÝŶŸƳȲɎẎỲỴỶỸỾ[Y]" + "ƁɃḂḄḆ[B]ÇĆĈĊČƇȻḈ[C]ĎÐĐƉḊḌḎḐḒ[D]ƑḞ[F]ĞĜĠĢƓǤǦǴɢʛḠ[G]ĤȞĦḢḤḦḪḨ[H]ĴɈɟʄʝ[J]ĶƘǨḰḲḴ[K]ĹĻĽĿʟŁȽḶḸḺḼ[L]ḾṀṂ[M]ƝÑŃŅŇŊǸṄṆṈṊ[N]ƤṔṖ[P]ŔŖŘȐȒɌṘṚṜṞ[R]ŚŜŞŠȘṠṢṨṤṦ[S]ŢŤŦƮȚȾṪṬṮṰ[T]ṼṾ[V]ŴẀẂẄẆẈ[W]ẊẌ[X]ŹŻŽƵȤẐẒẔ[Z]" + "ÆǢǼ[AE]Œɶ[OE]ßẞ[ss]æǣǽ[ae]œ[oe]" + "àáâãäåāăąǎǟǡǻȁȃȧắằẳẵḁẚạảấầẩậặẫ[a]èéêëēĕėęěȅȇȩɇḕḗḙḛḝẹẻẽếềểệễ[e]īĭìíïîĩįıǐȉȋɨỉḭḯị[i]òóôõöōŏőơǒǫǭȍȏȫȯȱȭṍṏṑṓọỏốồổỗộớờởỡợ[o]ùúûüũūŭůűųưǔǖǘǚǜȕȗṹṳṷṻụủứừửữựṵ[u]ýÿŷƴȳɏỵẏẙỳỷỹỿ[y]" + "ɓƀḃḅḇ[b]çćĉċčƈȼɕḉ[c]ďɖɗđḋḍḏḑḓ[d]ƒḟ[f]ĝğġģǥǧǵɠɡḡ[g]ĥȟɦɧħḣḥḧḫẖḩ[h]ĵǰȷɉ[j]ķƙǩḱḳḵ[k]ĺľŀłļḽḷḹḻ[l]ɱḿṁṃ[m]ñńņňʼnŋǹṅṇṉṋ[n]ƥṕṗ[p]ʠɋ[q]ŕŗřȑȓṙṛṝṟ[r]śŝşšșʂȿṡṣṥṧṩ[s]ţťŧƫƭțṫṭṯṱẗ[t]ʋṽṿ[v]ŵẁẃẅẇẉẘ[w]ẋẍ[x]źżžƶȥɀʐʑẑẓẕ[z]" + +Static Public Sub RemoveDiacritics({String} As String) As String + + If Not {String} Then Return + If IsAscii({String}) Then Return {String} + + Return DoRemoveAccents({String}) + +End + +Static Private Sub DoRemoveAccents(sStr As String) As String + + Dim sCar As String + Dim iPos As Integer + Dim iPosL As Integer + Dim iPosR As Integer + Dim sNewStr As String + Dim I As Integer + Dim L As Integer + + L = 1 + For I = 1 To Len(sStr) + If IsAscii(Mid$(sStr, I, 1)) Then Continue + If I > L Then sNewStr &= Mid$(sStr, L, I - L) + sCar = String.Left(Mid$(sStr, I)) + L = I + Len(sCar) + I = L - 1 + iPos = InStr(REMOVE_ACC, sCar) + If iPos Then + iPosL = InStr(REMOVE_ACC, "[", iPos + 1) + iPosR = InStr(REMOVE_ACC, "]", iPos + 1) + If iPosL <> 0 And If iPosR <> 0 And If iPosL < iPosR Then + sCar = Mid$(REMOVE_ACC, iPosL + 1, iPosR - iPosL - 1) + Endif + Endif + sNewStr &= sCar + + Next + + If I > L Then sNewStr &= Mid$(sStr, L) + + Return sNewStr + +End + +Static Public Sub Distance(String1 As String, String2 As String) As Integer + + Dim L1 As Integer = String.Len(String1) + Dim L2 As Integer = String.Len(String2) + Dim D As New Integer[L1 + 1, L2 + 1] + Dim I, J, C As Integer + Dim C1, C1M, C2, C2M As String + + For I = 0 To L1 + D[I, 0] = I + Next + + For J = 0 To L2 + D[0, J] = J + Next + + For I = 1 To L1 + + C1M = C1 + C1 = String.Mid$(String1, I, 1) + + C2 = "" + + For J = 1 To L2 + + C2M = C2 + C2 = String.Mid$(String2, J, 1) + + If C1 = C2 Then + C = 0 + Else + C = 1 + Endif + + D[I, J] = Min(Min(D[I - 1, J] + 1, D[I, J - 1] + 1), D[I - 1, J - 1] + C) + + If I > 1 And If J > 1 Then + If C1 = C2M And If C1M = C2 Then + D[I, J] = Min(D[I, J], D[I - 2, J - 2] + C) + Endif + Endif + + Next + Next + + Return D[L1, L2] + +End + +Static Public Sub FromHTML(Html As String) As String + + Dim P As Integer + Dim iLen As Integer + Dim C As String + Dim sResult As String + Dim C2 As String + Dim sEntity As String + Dim sMarkup As String + Dim aMarkup As New String[] + + iLen = String.Len(Html) + +READ_TEXT: + + GoSub READ_CHAR + + If C = "<" Then Goto READ_MARKUP + + If C = "&" Then Goto READ_ENTITY + + If aMarkup.Count = 0 Then sResult &= C + Goto READ_TEXT + +READ_MARKUP: + +READ_MARKUP_NAME: + + GoSub READ_CHAR + + If C = " " Then Goto READ_MARKUP_REST + If C = ">" Then Goto READ_MARKUP_END + + sMarkup &= C + + Goto READ_MARKUP_NAME + +READ_MARKUP_REST: + + GoSub READ_CHAR + + If C = ">" Then Goto READ_MARKUP_END + + If C = Chr$(34) Or If C = "'" Then + C2 = C + Goto READ_STRING + Endif + + Goto READ_MARKUP_REST + +READ_MARKUP_END: + + sMarkup = LCase(sMarkup) + If sMarkup Begins "/" Then + sMarkup = Mid$(sMarkup, 2) + If sMarkup = "li" Then + sResult &= "\n" + Endif + If aMarkup.Count Then + If aMarkup[aMarkup.Max] = sMarkup Then aMarkup.Pop() + Endif + Else + If sMarkup = "script" Or If sMarkup = "style" Then + aMarkup.Push(sMarkup) + Else If sMarkup = "br" Then + sResult &= "\n" + Else If sMarkup = "ul" Or If sMarkup = "ol" Or If sMarkup = "p" Then + If Right(sResult) <> "\n" Then sResult &= "\n" + Else If sMarkup = "li" Then + sResult &= "- " + Endif + Endif + sMarkup = "" + Goto READ_TEXT + +READ_STRING: + + GoSub READ_CHAR + + If C = C2 Then Goto READ_MARKUP + + Goto READ_STRING + +READ_ENTITY: + + GoSub READ_CHAR + + If IsDigit(C) Or If IsLetter(C) Or If C = "#" Then + sEntity &= C + Goto READ_ENTITY + Endif + + Select Case sEntity + Case "lt" + C = "<" + Case "gt" + C = ">" + Case "amp" + C = "&" + Case "nbsp" + C = String.Chr$(160) + Case "quot" + C = Chr$(34) + Case "apos" + C = "'" + Case Else + If sEntity Begins "#x" Then + Try C = String.Chr(Val("&H" & Mid$(sEntity, 3))) + If Error Then C = "?" + Else If sEntity Begins "#" Then + Try C = String.Chr(CInt(Mid$(sEntity, 2))) + If Error Then C = "?" + Else + C = "&" & sEntity + Dec P + Endif + End Select + + If aMarkup.Count = 0 Then sResult &= C + sEntity = "" + Goto READ_TEXT + +READ_CHAR: + + Inc P + If P > iLen Then + Return sResult + Endif + C = String.Mid$(Html, P, 1) + Return + +End + +Static Public Sub ToPhonetic({String} As String, Optional Language As String = System.Language) As String + + Dim I As Integer + Dim sStr As String + Dim sCar As String + Dim J As Integer + Dim sWord As String + Dim sResult As String + + sStr = Trim({String}) + If Not sStr Then Return + + Try Language = LCase(Split(Language, "-._")[0]) + + Select Case Language + + Case "c", "en" + Error.Raise("Unsupported language") + + Case "fr" + sStr = MPhonetic_French.Before(sStr) + + Default + Error.Raise("Unsupported language") + + End Select + + sStr = LCase(RemoveDiacritics(sStr)) & " " + + For I = 1 To Len(sStr) + + sCar = Mid$(sStr, I, 1) + + If IsLetter(sCar) Or IsDigit(sCar) Then + If J = 0 Then J = I + Continue + Endif + + If J = 0 Then Continue + + sWord = Mid$(sStr, J, I - J) + J = 0 + + If sResult And If Right(sResult) <> " " Then sResult &= " " + Select Case Language + + Case "c", "en" + Error.Raise("Unsupported language") + + Case "fr" + sResult &= MPhonetic_French.Run(sWord) + + Default + Error.Raise("Unsupported language") + + End Select + + Next + + Return sResult + +End + +Static Private Sub PadString(sStr As String, iLength As Integer, sPad As String, bRight As Boolean) As String + + Dim iLen As Integer + + If iLength < 0 Then Error.Raise("Bad argument") + iLength -= String.Len(sStr) + + If Len(sPad) = 1 Then + If bRight Then + Return sStr & String$(iLength, sPad) + Else + Return String$(iLength, sPad) & sStr + Endif + Else + iLen = String.Len(sPad) + If bRight Then + Return sStr & String.Right(sPad, iLength Mod iLen) & String$(iLength \ iLen, sPad) + Else + Return String$(iLength \ iLen, sPad) & String.Left(sPad, iLength Mod iLen) & sStr + Endif + Endif + +End + +Static Public Sub PadLeft({String} As String, Length As Integer, Optional Pad As String = " ") As String + + Return PadString({String}, Length, Pad, False) + +End + +Static Public Sub PadRight({String} As String, Length As Integer, Optional Pad As String = " ") As String + + Return PadString({String}, Length, Pad, True) + +End + diff --git a/comp/src/gb.web.feed/.component b/comp/src/gb.web.feed/.component new file mode 100644 index 00000000..c5196136 --- /dev/null +++ b/comp/src/gb.web.feed/.component @@ -0,0 +1,7 @@ +[Component] +Key=gb.web.feed +Version=3.12.90 +State=1 +Authors=(C) 2017-2019 Tobias Boege +Needs=XML +Requires=gb.xml,gb.util diff --git a/comp/src/gb.web.feed/.directory b/comp/src/gb.web.feed/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/comp/src/gb.web.feed/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/comp/src/gb.web.feed/.hidden/TODO b/comp/src/gb.web.feed/.hidden/TODO new file mode 100644 index 00000000..815805d0 --- /dev/null +++ b/comp/src/gb.web.feed/.hidden/TODO @@ -0,0 +1,10 @@ + o Should I Html$() every string? Or better use CDATA? How to detect when it is necessary? + ~> Adrien said gb.xml will take care of escaping in the future. + + o Rss.ParseDate() ignores the timezone. What should I do and what can I do? + ~> Gambas Dates are always UTC. Probably make an RssDate class which saves a Date and the timezone. + Give it conversion methods. Benoit said these should be provided by gb.(web.)util. + o Should Rss.FormatDate() put the timezone string instead of +nnnn. How? + + o Support Atom. Should there be a basis class which represents the common features of Rss and Atom + so that a user can offer both formats cheaply (without keeping a complete Rss and Atom object around)? diff --git a/comp/src/gb.web.feed/.icon.png b/comp/src/gb.web.feed/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..213a3598f68df49e301f9a304e27809f8f177da3 GIT binary patch literal 12094 zcmb_?i93{U^!G59tRs82krtw|FJ&1L$}W{9j3rA6$sT4VvWNN#kzJxJL)o&8?2?Aa z$TlJSI)*X(ywmUfz5l^`UC&(4eO=FU&wb8$KIe1JxzC+qYi-8IEx`={0Qhd+xPA)& zU||kf04F$@HKFk}};~P#P004jAzaLAs62Bw>APcy8-RO2?!A@aB<5`E;HAu^~ zButQ7K|!`1Yw5+)Z2zgsx~po9^pFJ}{c#uSh`ciBFDW@28S9P__w_HFa=Yi>%gR5U zbArS2KNErfUTO$(m!BH->v_9>5MB6ja~CYq_7QsYb{BKx$uRJJ>gMpP_T#Fe<#6-Y5UACD4^F9KKXhA9dEW0VQlvxGSt^s3 zjshXqqWE6*qkrYIhkk-+7)Yc~(MQlh2c%vvXa6z98(6Mo3nKBP-yMo^8|TaO^hx~fPoi#*t#0=iCo=-Vte0dIUN_j@dH9Ml;LrF= zKctXnRWnO};oj#%iUw@Eh+=rQ^ETjN5N`mz?-&w}pPKr>_O;R<_~!vbQ_b&FR7voc z{yy-}Z9a|Swc@|>V^(V#<@()e75)ZwSse0iJpLL*W{NnDq=0w}fp z{{L1HpsB@SfnTCa*KMtLCW2R)B)HTr+Y0`q-E0NI(yU8kf-~__cjKMD|IB( zo`i3!yiII&BhEwGj?lWg_UoE$S^%80rN8*heYH=+H>5Hd>CaEi^1CkAbEN$Uuv4ON zzMYjcG$&U{%iy(o2=GaMo0Np}KP$J78^xM7dTBR7rB`Av?#N--MfzAgG5eyhA8DPd zzVZraoA&s(5h&v&mLAXhn=H?HL2q7gj6RD@FBCw%5{ADn)tX^=yw>|j1LCv?S@QS5 zD6>C~7iZ|13)-&o8j7P)ApPg7MM(;=R1Z%~z&i(?&Lov`=_h2O(S*h&j-(d)e5W8t z!1?7DPJu2CilnKmxg`A#4llW6!53K3M7lHaqhuANpLm_p_2KSaji^&b6lgT}PQUtl zL4EcOeeSET;IgUbh$mxuu~Vj@NYh5h4KR}QAOm0C={u(Bo8VmHnzU%`& z56$TZo;bCweQH;k_4I3-uY=ETDYW6dMB=itf%iP>)!1>ikCKW?sf8JE@*4+_A% zY%e1bFHJdQ5P@4wAJFdg_pk4SDGQ(&1{bCq3C-L3TUfmD*X*xMcP4~?lR2NQ!;@OLQ19+gNHad9~u;Pj7AgMfS} z&1B@5E#I$_mYG|VlC={l*vVptMXg!f62i-Aq!8f3zTnua^>$)Wd+J?FV4c#Y-t5T+&SB)##Y*9U`_Y7i&i6c)YHgY1Y>I0SJB zvipkLpRyJ7v--OmZN%7v*ta=;tTC&K{2?p0!s)bHJ;bU3t(8Y8L+ZKVw9#9GM-~1R zk|3#M?4Hb|xOn<{$M`;g`tD|KY1DeX$5~xL^sg4=Qas>p^5`t#$wCFDW{xjGWHF9G z#JFac?Y;%HwL4r08i%U<><3@}(c9eq^I4h=4~~-)hf~CG8W+HIPj-)z()55x%5`pjm+62VGd;nadp?_aLC);L8_~(?@5GQ zhDVtC>6!~|#{jkWZ;m;KZ+|@72f7d+6X*QP7Pr{Mlf;#@WHU(}Pmln<=m}ZY=Xx-a zUH(4qAX?#s3p_3#+FvF#Z@D4ze8tBq3UE4V_PT#ADfOWSyQdq%$Z*A@Zgdao7yz1D#J=Z>!!Ovr1l!urWP8F&D$6M)`f)j@D|q6aHzMYb?*1 z`f_KQ&-2W!zahr|aeeaBdXj;eOu*bu8|=qUHdT5ywWH8Cl2NJ_Dq43OHGgE5UmN*! zt2~y?gRAByNcOBRrL202#--hL(r?aoVzLNyhBh93M!ch3GEufc;^q?{H%B~0roE^4 zOo32IytBc#@$G;ADu5t{;IlUu?s2 zii-16+|ay!yzhA<Hi-U|Yi6B{<#7n6-by~x2j zquO%>q!^MU>Go^@h|UBOfr);}`U_bCQ`E0b?^ea8fYoZJ{4V@`6o0MmL$N_k@Y{#$ zk-GZ4-7TNDr{XHw%$C8^14tnB}`*TUO0I2 zy~EXSei|~e216h6;SM_XZT_@3|L;2z#c%~pHa1uHR!SFQ?4b8OCQ^+3t4wB+mhqR-pLW4pyoEX@)#x&%3*z^io6aO(5?^d7DJ&9(PdBXx z$s@6P?{rcLW@~4dhTe6`l`%~AR_yK$jyJiw+#9^S%yMFxU1NZdB+{OtEf7<7Dy|{L zr0phkJmjC5y{2maNzzp!t!*F*iG5_~^$dOXCc0$9(Roz)gyi$E9hT?f-?}wI|8PAI z+0AkTxJ}y>KjJW)<3X?&A++KeI2Bbnj0Ch;w-$gWRQXU>{4$z zGn)3h|A(bUx_H`_JHSs5?Uy>`-)L<;ZuJ7#eJtMNYbTx}{tUe1Ah<82CAH;q*1i2r zVvoj>=kc0=R&&;dF;2TV3!HMDl92vAF_}f9Tv$A@2On3w!)?Z)kqLNV$~7R*at?WB z9OiN6^P(O?!1%)eG4|Ff>pKE|FvB8U`4Axa6L=yek?=5K>ZUftMRE*lorlJ*ghV-i z4%h-Hw|msL^KkXZb!_~)iETVg9K8CmO{<1!ldAh5MC$0N{T8vkOY6ev?^mx*h8BX` zf_)>zgr0l*7)JwwdxpCB@8VJjMo$V1#Xgfai;RDTjmuDz9OmPGR;qpLl)VU&^pWcR z;%ABHYgRA#wf2DNf&ER;7%G&B#g>sEpW3ng@<7wPA@aSTc4u=mlXSTYV%~)yR>9 zneyTTHPd2hbWM{uBF9G^1__btGkqUd%mi}cA^{e%zWLOl%()zKjdx1Rel1}&h5}P^ zk}x&fsp~s*7lQ_@&@s~sl3CVYu0exOw?}A>9)zrQzxq>LPhW54vZepLr{y;X-?*`F z2Yp)=N{bGzv|*^GEJnYRr$&{`no^n`q-TP3sOgh z&3wfnEaTmM|ZqbISk zf5~L=nJ>V~yS|%$#h202{k6K2KGGSnLH{k)k2a5R4h8-9wAS_PiRts7D?duXBe|s; zaeNc*k!zPtk9P;^^9@XEgIB*z`mP06Yj!wG@3a{S*iz1GP;Xvih*`!Tey~bIj@vu)fSAdFU<4q&HeaY zZkDGLE`>f)u$hb^+*{s`q07?lWlc0Cg!bJo;^A9PTGgRVK02K6h@Wl#pDUX^1RtJCpWkG@nDzrve$Zr3*_h$Bq)^~9s^=Whsk173U7@AUA9&ot=2 zs?)k+Oqz7+aMq7vISEf%3Yxi%qe)bZ7@h(O*#z{IpFm`zKQI4hp}^0pMmRKTTni=- zJAG8YJX%=VpoW0IbX={r^_aSNVXTBVem)l}k%F!Ml^3&0f@luc>bI~4Rm7oBj3kccLCpo!hCFwS3$oUukjip2pYac zhqJUqk9uzgecdr?`$a3QP%5+Xrk>?DpTwo(L8k}8cP#aV&S7H~V7wE`o4!Q_CeceA z&u<8*L|TEXuX|CFBKBTzkaR-ug8N(lZ{1uY>ecDH3m45PO`U~k^^OU~rKFjH-ou7( zA9Gup1la^Y02BcdJ%(Jgn)M7t7p+fIhegw1sYFZ-u{WSMAQY6bJ0Jgm)XC}#`jH|g zAj<)G14b_1rmf?KcJ;@n=`)ir4)I8PTsaFeh&! zQhYKWtk7Ya&2Wkt*swk9v2>%oneLs?D2X5#t3D(_8OXondw6OY|RPwc#kns$UiTka7r?D~`cKTJ3HsIGOPV|v~GJX7&A3WAa zE3bYzA8Y6oRewtzI@uQV>93_HA4WQA`Y8UpvP= zb12WBZEE^Py0|-pdL+pc-`SaHj7DbF*V`y3@!#Q%eef&u6$1Bd*_{V=?a}Dw=HhoxgszhV>*V<=!@(zkj zRw-JxeS5Dp#|t@*w}?xKWsp2oXB>(PkFhn)M0?xtla#o(4a%*j072xlM}r17JKg$` zz96P@$&l%_+qUnqq9bByuYG-3f%OgFLMjhCIBk(+&CYp@3Lvm)s*vbVZ+QwhJB%d? z{SBgW&1GfULmq>U#lpCx2Y@+KL(DFo&rsi6bIq-M4KAtTGKhUqyS4Uf(=`R2 zSBS`YGppP`2fL6k3lm-2kDUa~rQ^SA#~ioh_9KnjkJdjeM(lif+MB&*y+M*K;eQI? zop`Ymf+-{liJzY$wYV3;d7ct9nkai^^dSg&-lJ0iR*S=k^BTzXGU}SDwOyiiUl)N- z2-960I_e+RwhJ-x>sbvx!g)x!FvL$?h{bMOvEhn^z5+~E>ri`}lDpXL32=V-_2;}l z?;WZ0$7RQ3#{~3$?HjIDJ%)S9kQn8QhP;N{u4(W~&Imv@_IWH#SAqT)@~WNGSrwC# zu1wd06v$lXHI$f7h4V=w1iZx>kWoqr+Hi@j{~Sv4?{t3cQ{IJL{Ul?^({_?^bqxM| zQ}Wz#FZev84RW1t4-`&#NpxtZ*4jn|CPV@*9HtVN#oOyj_Xkj4yEZx%bj5`lp7kk@ zB0~EB@5XD1m|78)1~;PU0rLZ{l3K=zvRVjYKj57lM+rOA!hB)C%j~~Ud=wFIe;3Wz zT}(TX*w22$gsB2kzSt4evnZVOU--7N?U^--?o1lZFjHgkFFlNJy&3 zw#%;@V7F!+#FaKsNGNzaDGL}^6aL{`G@NIXel>dQCRM)< zpOegTqx2q*b6Bzhb(5+vmi=IEIrEPUTqD?Jg{%^R0z~gMy@^Kl&k^)&{mUzS+(J1A zaz-9^9a^jp`;f0%Ge_7?Uqs=gRq^ZWcEvn*J4GpF zvvzNreHb;;C5Z$N)Gqol{YVU#5$ijjjQVB!r--SFqvV|tXRqwO;yHe;kLo(;n8Hm5 z_}kwMn)A2fD9{hDh;n1?7|r@rMw|?rX9J{m}jI#Cib?jhDbY4XKVbsRrS~LKXC_UxGL)J#m+7#4=4%4B9 zihHA$Ld1>RnaJUpsz9=MdG}sjP2V#+N?%%F3@RMvi@-+$yZ@Q|<#|I1e;4ZL;L&8r zBz>p+HG_Pl1A@;$S^U^lix@uN#oz)xCU>UFh~Bb>ik^U5jy6k~U`&YDBnlU-7}3eU z_O)GNK1>M_JYKC5#840?$zhS#rjz1`e9@&M)&EVx; z+=H`I2fAkjQI3e)OdK|3FylMND%zIu6M2iWc3djYue=z)F16e-s~Si~mi%JADUP^( zUmqc?6-Sgrm+WW6W^PtuQ}H{H1Nb@LJXPgr{ee3{_w1LT8Yfy`xk<~NVYxS6LFCcy zoZqWPj+SoW*Jt$F3^>&*aXy1o!7r>!nPXvdNp$6f2}Wwzma^ye7mtl%D@jL8C(kN+ zNsnOTf1PS!YX*|#kWJ@(Nbj*&m>`p_MIx3Io-R3cr1;_nK+7@=gQw)agJeiE6rEwm zpmM4}_kC)%V5uuo5chd9ew}o)z!-Wj7MDi1KM7>+nFcb-9HYKp66?v~5o+)J;MHn| zN{c>(b*yzIUCuPaps!Kw+?tXoW6<(JnSnMM#;)Sh+R(nB9S30q4%{n-aU4$@S1ZCc z*e%VN4w%0`Ocs<*(RycFG||J5Ulm)I;Mbx>;%iD<)%6 zd|MUZp6QSY!H`&f%eQk%5c3tGAR~0qNgPu3?1?v~Elbdk?0!AdWW6UXFvODX?rBDT zrkC5Hv4VPT3h~UxEFCEI${dBE@z%1kB(?Xi8-2@fax(?>E248|CFtBYyxh>EZWBi< zoV>cH`!0$-gmGzoQ{zW(aZfDKetjl1VkwgqD6?S9;9RvKogwF(zU;o+l|RR~_wFgS zxGt4=FN&q}cG1MkV8EsI=IWr|2if56uH8c61+vq&BsNVkBUBzH5p`VD#<^wz0R@IR z9RyzA9WCxS0J}~E$-@_r3*-xm1ym9DyH3z2)PxT{Hy+6HrH=)S{?}=S~2wzC0 z8oF*%@;z~rk-?w3V4ebHeYU|&ma+r;QU8g`w#Is#*lGrOpa|BJ>!fs=g-f@+jm!XT z4s94EhwsRbt~(8%n8hUi4=>+{3QUg#JP1{yXJg>c8eR=d{mtL2S`*2|G-RsmcMre*ZV3H%cDY9=Gd(LLt$$PR{sUE(KR3UT?VKeAF zLKiR7Z7p^i_Usr3$X87-YG~T-kUc{7N%%;3_rqM2hyprIR>n|i>I?DA0nkyIAwI>o z=U+1o3`m0 zV)hIUB6K+E2D32%Gvs{(gHL}I3j6?U8&dtotkXBwU>9bO zII@j4GN6FTgA_Q|(mFenV1CvTMVcrKrsW{UJ%@PjhDW{km4k*RZwRU%m=Xwu-b--a}HS zTROmA_;b=JV7`U#7d{@-oqR|`P{OU69Wif3SPIMgGfcv6lA|l+T|*c5lUhK_b2Nj) z?nNo{oL2nRoKN6zGK^_#^6G7&ofWQCF0=OO=5c-ic?WXwS#iB^P zEIkEXo5h1%@ALF?e&zB4Ox^QE;fHR^(nO6PDEizd>H>7Pf6r`%%mjf>auszHHFOcw z@9(yZ8vdV@g=wvUd@;CJk^w;)zEQV%I~qN8{-Z`}>_q!j0Tjw9da1g#66Et=(i{on z$sdR|{l6w2OAV8ytE3p<#dqiT5)XcBf$Q|2ICQdjjr0ekfosQ$%t%|OqFBuBTFJli zlA(vi8Eh;Qj%G`siH%|3U;_rr&=a;&HHD6CF+jOKj&t@G5Zb37eKzajp)3BOVVE-g zE)7xbO21pCryO^YYifxLlSS<9L81*zXlW46z)MG8a^k+=xoda=aX}M_Ofl`m z4%2D_*1Y!GzGK%-sh9d2n9+qag7>^3B%2GY-Z9WUB6$Fy0iMz|z4 zG003Pu;@cfj#7}mPZ-pG?QmtfD3rkDnd}Sb+E+(R^m5^pfL&aqS)V2i=NNU2Mh?uxiZIK*rgN~`QbM2h{x^H^{;zd=#i&15SHaYtpZ&_FvLYMo zH@vR&1^sr^?kt{zGn0C}+pIGckZ}5igkXG9@>jrNrXV{4zk9QR`)&e3zo(4B)8!Ih|!%w4lo-hQNc`84v25dNF?v+-vW z-j3qAsFU~%2x9356BI3ldvJ-pM_Ry;ZHvHomk&%E>?wif3x_*-#IR$9#9Y}7H)ic4 z;WR}h2@Vi)317xNk@n+Tgo?v%R#3Qss72|%dt+gOPp2UD+q_8 zUGltRyBAE5^*tm?aW-UJ6#FK8T_6kl3+{*JuQ9RiIK$o0MUE&i->=*ukh( zN!K+NSq9aii}brdmS|}v)Bb1VQ0(F1dOT4Z zSbzWf)&k$R?Hg3T$JTnO`0W<;VPpCMIPf0Tugd2>;0dK}$c_5X8Q$r&nCc-k)YjLu z!`;#)rn6(GIKn-*BR&3^&>u^$wmfhzj&Pk_!blX@C++*R6<6I4(gk_1<}leIxm=9N z4%aa8G5heOpf4(f&Q>p6`PVB4fQ8$~BPqWrNK;ACon$b;#$KN|U$>X$;l85-?JGXb zB;xg3RPzsYW%RZ03(ZPbMNtr)p>kLWCGbkNlILDm2h)L_s`T;hm}B;#oetaonIr0z zvcy>uG;-iw-B=NVI84pGZ=ScGCI zgxcgi#T{=U2tnw=gd?_7>hSKx@J_~iK3sXJL3q_xG^=BI`)84V0XtHI$BF~|9CB9$?G0(?Dn&5syV&6+vv>#P<@*AhD%yKN_oyYo1N;%OHh|9> zQm!4$59z zD^`eASyl;$WUe=SP{3?Re5k7H10mM_%rge_)@s7{3jNR<=2YkS=;mmkd&X|SJ*vdm z%A>m%waA>hqA2J3fqZ}`pe(MmDPwQjn);Q0Z_HuLY;RPtx;3fmCT&&uxoSc;EY|NPky6Fmd|#RP4cFvuk#`n#aPi{%er2BUO~EU-S*3{o!<4~ zUe~n=Nyzn;5R_nYt1c6Rc{)>JMO5(KBO9vU{-NWdCa8wyVryqlv?HV?o-1bnBlNglfJ$ zk5JoLkJV+G_|A8ewddF-kHZ+87|?x%npt81%^*DR_C5pK=UJrc{FvYCk3GyPq~#;m zY~g=|UPJJ1hjWoWOJ@EZyc{c4E>I?=6gmkRI(4!5IZy$2FMtcdFwEVqMUg|rLL_$$ zy70cfhu9;<&zc`sT3LqT3I5gJr*UO6j@!m_>b-GtH|$Vd0K&4v6(8%g;GC$WwS zuwJ!cKGMKPE$t*R4VLX|Xfe1dfMmsoc?^4!>H-CqjG3}j0Fg|v4YHT(&)IXjZyRRW zW?ggU$5AMHt6kJV)zX2V1J`+mx59s}LLW<`y_TT6k6h#}i(5IzGpyUmKmVz?ld1RR z%kY3yIxzxUeHgU1y4T_*oEQ z=wSgrgaytqGWaH#vy?68yh68G-o7yRR=M4vQ9W z%F&xH!#=y)i_fzm?5owaRk;j<>jCBg9S3u#)r1|58C6(=NoVya&x?_^36<2iGfU93 zvAUQ{=EB%%5uw25B~I}UcYlp3uZP?B53l5yQto!nT^gx2e%i$auoWNjnt|nx5kt(% zWnY<{yq)z{VJYZc&>9)H^?c*B$@=d!?85DmR&T(5e8;jG^{dVMfLr1(36NwK0JW~G z)D>nFyv6UEDU+V@g||9aH>&M$@lZ+iu^f}1(F%46F=X?f5U419c>Olx}ODLLG6~JPCAu*h? zMU1K&+~`dz_qq&>{A)tpx=u|PhjE~>5&^|mLdDTX0P&eiP4I#uFqe2`P>EsJ>+-7( zOofH}pBXWm2b|sG#^M7`!q(;8X+(7qcw?tKl(N)9KH!BmE2&Lp$y=+1Z3+WObiG($ zKc8!&u1OAC8tS#@eQYws!m@XIg7bn+0?``5v-bGNP5t7~Fk$+r6;92rPhGV8;>aH>Dm;a&|H zlAqcx)C>Nvp%O$6gme*m_v&-M1;`&#A9eTJnm0sYPlS(q9uS3R@H(VP``49~)1Tmw zy9;2e_vvz19RMwHPn7=L9-9%t2}LJ1YVZ)6L{T1j!lsl9k2We*+Ac^e@W3F9JmVyq zAByAk9sv|6?P%^&Qz-y^eEBt2svfW9Tcn>Bu4ylCqZ&fy?QIWNYx4yqdXu_clKHpy|H;bPYhg>xZYffEzTA+U*l{Gjh{<}TxYrt&7 z6OY$U&+^RjNRKUs1ejgghudeD%`!}SqrdL0fq$#NaBYlkE(lMJ1W3D!1vI-hW|Kas z*$-A$Ic&CC7fzt1R==0}Uf=`SNt`Ox(6~`|`|2@!Li2~wQC00L{c}W}5TUGBob2@d zg|CJ2hkT;_GvUeN2x~i-wnuP%_uTI*@2xGDr(7GSzGv8|=o+vfJe>ZfnQV8-z4!JI z_bHoKY&4CQK!*fNCy`_F9)6J;9ed$5b3R^|Lm@rqe&n9uD>uZsGTXyUg1y8AySxu- z5CgNQHo+zn{lQW_b>k=>pX`vf1{KTrCBtW3uLKjUNQwIuE|EkvC0nFUYnT}NXspP(wf36->st!O9&b3_2Y8BItcf$}y3M3Pi-3Pwn;LU+ z*XuLTZ-u%IvNbIC&z8s@s(1p}N|Rp6{u?f_oVdn>w4uOLX4jB;R^Vc(q%GN<-J@LA z$k1rr#0|d;2X3U|qHcMBSr36b{z1_?I`GcQq|NHDjob3OX>mrZ=-cHUi Vv4Pby55WTfH%+Xs*Ijdu`#&{q5?cTO literal 0 HcmV?d00001 diff --git a/comp/src/gb.web.feed/.lang/it.po b/comp/src/gb.web.feed/.lang/it.po new file mode 100644 index 00000000..edb1ac98 --- /dev/null +++ b/comp/src/gb.web.feed/.lang/it.po @@ -0,0 +1,119 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.web.feed 3.12.90\n" +"POT-Creation-Date: 2019-04-22 15:34 UTC\n" +"PO-Revision-Date: 2019-04-22 15:33 UTC\n" +"Last-Translator: gian \n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:2 +msgid "Web feed parser and generator" +msgstr "Parser e generatore di feed Web" + +#: Rss.class:213 +msgid "SkipHours may only contain up to 24 elements" +msgstr "SkipHours può contenere solo fino a 24 elementi" + +#: Rss.class:217 +msgid "SkipHour element must be in the range [0, 23]" +msgstr "L'elemento SkipHour deve essere compreso nell'intervallo [0, 23]" + +#: Rss.class:228 +msgid "SkipDays may only contain up to 7 elements" +msgstr "SkipDays può contenere solo fino a 7 elementi" + +#: Rss.class:255 +msgid "Invalid SkipDays day '&1'" +msgstr "'&1' giorno SkipDays non valido" + +#: Rss.class:275 +msgid "Invalid day '&1'" +msgstr "'&1' giorno non valido" + +#: Rss.class:290 +msgid " expected" +msgstr "previsto " + +#: Rss.class:293 +msgid "End-of-file expected" +msgstr "End-of-file previsto" + +#: Rss.class:318 +msgid " expected" +msgstr "previsto " + +#: Rss.class:322 +msgid " expected" +msgstr "previsto " + +#: Rss.class:383 +msgid "Unexpected element '&1' in " +msgstr "'&1' elemento imprevisto in " + +#: Rss.class:404 +msgid " expected" +msgstr "previsto " + +#: Rss.class:406 +msgid "SkipHours element '&1' out of range [0, 23]" +msgstr "L'elemento SkipHours '&1' è fuori dall'intervallo [0, 23]" + +#: Rss.class:420 +msgid " expected" +msgstr "previsto " + +#: RssCloud.class:24 +msgid "Domain, Port, Path, RegisterProcedure and Protocol must be set in RssCloud" +msgstr "Domain, Port, Path, Procedura di registro e Protocollo devono essere impostati in RssCloud" + +#: RssCloud.class:40 +msgid "Invalid RssCloud protocol constant '&1'" +msgstr "'&1' costante del protocollo RssCloud non valida" + +#: RssCloud.class:52 +msgid "Invalid RssCloud protocol '&1'" +msgstr "'&1' protocollo RssCloud non valido" + +#: RssEnclosure.class:15 +msgid "Url, Length and Type must be set in RssEnclosure" +msgstr "Url, Lunghezza e Tipo devono essere impostati in RssEnclosure" + +#: RssImage.class:37 +msgid "Url, Title and Link must be set in RssImage" +msgstr "Url, Titolo e Link devono essere impostati in RssImage" + +#: RssImage.class:44 +msgid "Maximum width of RssImage is 144" +msgstr "La larghezza massima di RssImage è 144" + +#: RssImage.class:48 +msgid "Maximum height of RssImage is 400" +msgstr "L'altezza massima di RssImage è 400" + +#: RssImage.class:75 +msgid "Unexpected element '&1' in " +msgstr "'&1' elemento imprevisto in " + +#: RssItem.class:52 +msgid "Title or Description must be set in RssItem" +msgstr "Titolo o Descrizione devono essere impostati in RssItem" + +#: RssItem.class:107 +msgid "Unexpected element '&1' in " +msgstr "'&1' elemento imprevisto in " + +#: RssSource.class:16 +msgid "Url must be set in RssSource" +msgstr "L'url deve essere impostato in RssSource" + +#: RssTextInput.class:21 +msgid "Title, Description, Name and Link must be set in RssTextInput" +msgstr "Titolo, Descrizione, Nome e Link devono essere impostati in RssTextInput" + +#: RssTextInput.class:47 +msgid "Unexpected element '&1' in " +msgstr "'&1' elemento imprevisto in " diff --git a/comp/src/gb.web.feed/.lang/nl.po b/comp/src/gb.web.feed/.lang/nl.po new file mode 100644 index 00000000..54fbb95c --- /dev/null +++ b/comp/src/gb.web.feed/.lang/nl.po @@ -0,0 +1,141 @@ +# Willy Raets < gbWilly@openmailbox.org >, 2017 +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.web.feed 3.10.90\n" +"POT-Creation-Date: 2019-04-06 18:47 UTC\n" +"PO-Revision-Date: 2017-08-26 19:52 UTC\n" +"Last-Translator: Willy Raets \n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:2 +msgid "Web feed parser and generator" +msgstr "Web feed parser en generator" + +#: Rss.class:213 +msgid "SkipHours may only contain up to 24 elements" +msgstr "SkipHours kan maximaal 24 elementen bevatten" + +#: Rss.class:217 +msgid "SkipHour element must be in the range [0, 23]" +msgstr "SkipHour element dient in het bereik [0, 23] te vallen" + +#: Rss.class:228 +msgid "SkipDays may only contain up to 7 elements" +msgstr "SkipDays mag niet meer dat 7 elementen bevatten" + +#: Rss.class:255 +msgid "Invalid SkipDays day '&1'" +msgstr "Ongeldige SkipDays dag '&1'" + +#: Rss.class:275 +msgid "Invalid day '&1'" +msgstr "Ongeldige dag '&1'" + +#: Rss.class:290 +msgid " expected" +msgstr " verwacht" + +#: Rss.class:293 +msgid "End-of-file expected" +msgstr "End-of-file verwacht" + +#: Rss.class:318 +msgid " expected" +msgstr " verwacht" + +#: Rss.class:322 +msgid " expected" +msgstr " verwacht" + +#: Rss.class:383 +msgid "Unexpected element '&1' in " +msgstr "Onverwacht element '&1' in " + +#: Rss.class:404 +msgid " expected" +msgstr " verwacht" + +#: Rss.class:406 +msgid "SkipHours element '&1' out of range [0, 23]" +msgstr "SkipHours element '&1' buiten bereik [0, 23]" + +#: Rss.class:420 +msgid " expected" +msgstr " verwacht" + +#: RssCloud.class:24 +msgid "Domain, Port, Path, RegisterProcedure and Protocol must be set in RssCloud" +msgstr "Domain, Port, Path, RegisterProcedure en Protocol moeten ingesteld zijn in RssCloud" + +#: RssCloud.class:40 +msgid "Invalid RssCloud protocol constant '&1'" +msgstr "Ongeldige RssCloud protocol constante '&1'" + +#: RssCloud.class:52 +msgid "Invalid RssCloud protocol '&1'" +msgstr "Ongeldig RssCloud protocol '&1'" + +#: RssEnclosure.class:15 +msgid "Url, Length and Type must be set in RssEnclosure" +msgstr "Url, Length en Type dienen ingestelt in RssEnclosure" + +#: RssImage.class:37 +msgid "Url, Title and Link must be set in RssImage" +msgstr "Url, Title en Link dienen ingestelt in RssImage" + +#: RssImage.class:44 +msgid "Maximum width of RssImage is 144" +msgstr "Maximale breedte van RssImage is 144" + +#: RssImage.class:48 +msgid "Maximum height of RssImage is 400" +msgstr "Maximale hoogte van RssImage is 400" + +#: RssImage.class:75 +msgid "Unexpected element '&1' in " +msgstr "Onverwacht element '&1' in " + +#: RssItem.class:52 +msgid "Title or Description must be set in RssItem" +msgstr "Title of Description dient ingestelt in RssItem" + +#: RssItem.class:107 +msgid "Unexpected element '&1' in " +msgstr "Onverwacht element '&1' in " + +#: RssSource.class:16 +msgid "Url must be set in RssSource" +msgstr "Url dient ingestelt in RssSource" + +#: RssTextInput.class:21 +msgid "Title, Description, Name and Link must be set in RssTextInput" +msgstr "Title, Description, Name en Link dienen ingestelt in RssTextInput" + +#: RssTextInput.class:47 +msgid "Unexpected element '&1' in " +msgstr "Onverwacht element '&1' in " + +#~ msgid "Weekday does not match date: '&1' vs. '&2'" +#~ msgstr "Weekdag komt niet overeen met datum: '&1' vs. '&2'" + +#~ msgid "Invalid second '&1'" +#~ msgstr "Ongeldige seconde '&1'" + +#~ msgid "Invalid minute '&1'" +#~ msgstr "Ongeldige minuut '&1'" + +#~ msgid "Invalid month '&1'" +#~ msgstr "Ongeldige maand '&1'" + +#~ msgid "Invalid year '&1'" +#~ msgstr "Ongeldig jaar '&1'" + +#~ msgid "Invalid weekday '&1'" +#~ msgstr "Ongeldige weekdag '&1'" + +#~ msgid "Date does not conform to RFC 822" +#~ msgstr "Datum conformeert niet met RFC 822" diff --git a/comp/src/gb.web.feed/.lang/ru.po b/comp/src/gb.web.feed/.lang/ru.po new file mode 100644 index 00000000..4720c869 --- /dev/null +++ b/comp/src/gb.web.feed/.lang/ru.po @@ -0,0 +1,106 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: comp/src/gb.web.feed/.project:16 +msgid "Web feed parser and generator" +msgstr "Веб анализатор каналов и генератор" + +#: comp/src/gb.web.feed/.src/Main.module:16 +msgid "diff -u <(sort &1 | sed 's/ *$//' | sed 's/^ *//') <(sort &2 | sed 's/^ *//')" +msgstr "diff -u <(sort &1 | sed 's/ *$//' | sed 's/^ *//') <(sort &2 | sed 's/^ *//')" + +#: comp/src/gb.web.feed/.src/Rss.class:213 comp/src/gb.web.feed/.src/Rss.class:410 +msgid "SkipHours may only contain up to 24 elements" +msgstr "Пропуск часов может содержать до 24 элементов" + +#: comp/src/gb.web.feed/.src/Rss.class:217 +msgid "SkipHour element must be in the range [0, 23]" +msgstr "Элемент пропуска часов должен быть в диапазоне [0, 23]" + +#: comp/src/gb.web.feed/.src/Rss.class:228 comp/src/gb.web.feed/.src/Rss.class:425 +msgid "SkipDays may only contain up to 7 elements" +msgstr "Пропуск дней может содержать до 7 элементов" + +#: comp/src/gb.web.feed/.src/Rss.class:255 +msgid "Invalid SkipDays day '&1'" +msgstr "Неверный день для пропуска дня '&1'" + +#: comp/src/gb.web.feed/.src/Rss.class:275 +msgid "Invalid day '&1'" +msgstr "Неверный день '&1'" + +#: comp/src/gb.web.feed/.src/Rss.class:290 +msgid " expected" +msgstr " ожидается" + +#: comp/src/gb.web.feed/.src/Rss.class:293 +msgid "End-of-file expected" +msgstr "Ожидается конец файла" + +#: comp/src/gb.web.feed/.src/Rss.class:318 +msgid " expected" +msgstr " ожидается" + +#: comp/src/gb.web.feed/.src/Rss.class:322 +msgid " expected" +msgstr " ожидается" + +#: comp/src/gb.web.feed/.src/Rss.class:383 +msgid "Unexpected element '&1' in " +msgstr "Неожиданный элемент '&1' в " + +#: comp/src/gb.web.feed/.src/Rss.class:404 +msgid " expected" +msgstr " ожидается" + +#: comp/src/gb.web.feed/.src/Rss.class:406 +msgid "SkipHours element '&1' out of range [0, 23]" +msgstr "Элемент пропуска часов '&1' вне диапазона [0, 23]" + +#: comp/src/gb.web.feed/.src/Rss.class:420 +msgid " expected" +msgstr " ожидается" + +#: comp/src/gb.web.feed/.src/RssCloud.class:24 +msgid "Domain, Port, Path, RegisterProcedure and Protocol must be set in RssCloud" +msgstr "Домен, порт, путь, процедура регистрации и протокол должны быть установлены в облаке Rss" + +#: comp/src/gb.web.feed/.src/RssCloud.class:40 +msgid "Invalid RssCloud protocol constant '&1'" +msgstr "Неверная константа протокола облака Rss '&1'" + +#: comp/src/gb.web.feed/.src/RssCloud.class:52 +msgid "Invalid RssCloud protocol '&1'" +msgstr "Неверный протокол облака Rss '&1'" + +#: comp/src/gb.web.feed/.src/RssItem.class:52 +msgid "Title or Description must be set in RssItem" +msgstr "Заголовок или описание должны быть установлены в пункте Rss" + +#: comp/src/gb.web.feed/.src/RssItem.class:107 +msgid "Unexpected element '&1' in " +msgstr "Неожиданный элемент '&1' в " + diff --git a/comp/src/gb.web.feed/.project b/comp/src/gb.web.feed/.project new file mode 100644 index 00000000..84278822 --- /dev/null +++ b/comp/src/gb.web.feed/.project @@ -0,0 +1,14 @@ +# Gambas Project File 3.0 +Startup=Main +Icon=Feed-icon.svg +Version=3.12.90 +Component=gb.util +Component=gb.xml +Description="Web feed parser and generator" +Authors="(C) 2017-2019 Tobias Boege " +TabSize=2 +Translate=1 +Language=en_US +Type=Component +SourcePath=/tmp +Packager=1 diff --git a/comp/src/gb.web.feed/.src/Main.module b/comp/src/gb.web.feed/.src/Main.module new file mode 100644 index 00000000..93113731 --- /dev/null +++ b/comp/src/gb.web.feed/.src/Main.module @@ -0,0 +1,28 @@ +' Gambas module file + +Public Sub Main() + Dim sRealInFile As String = "test.xml" + Dim sInFile As String = Temp$() + Dim sOutFile As String = Temp$() + Dim sDiff As String + Dim hRss As New Rss + Dim hItem As New RssItem + + Copy sRealInFile To sInFile + hRss.FromString(File.Load(sInFile)) + File.Save(sOutFile, hRss.ToString()) + + System.Shell = "/bin/bash" + Shell Subst$("diff -u <(sort &1 | sed 's/ *$//' | sed 's/^ *//') <(sort &2 | sed 's/^ *//')", sOutFile, sInFile) To sDiff + Print sDiff + Print "---" + + hRss = New Rss + hRss.Title = "Date test" + hRss.Pub = New RssDate(DateAdd(Now, gb.Hour, -11)) + hRss.LastBuild = New RssDate(DateAdd(Now, gb.Hour, -11), "+0800") + hRss.Add(hItem) + hItem.Title = "Blank RssDate" + hItem.Pub = New RssDate + Print hRss.ToString() +End diff --git a/comp/src/gb.web.feed/.src/Rss.class b/comp/src/gb.web.feed/.src/Rss.class new file mode 100644 index 00000000..e8794b90 --- /dev/null +++ b/comp/src/gb.web.feed/.src/Rss.class @@ -0,0 +1,427 @@ +' Gambas class file + +''' This class represents an RSS document. Its properties are those of its single element. +''' It acts like an array of [RssItem](../rssitem) objects. Add your items in order and then call the +''' ToString() method to get the XML document string. +''' +''' The Title, Link and Description are necessary. All other properties are optional. +''' +''' Conforming to the [RSS 2.0 specification](https://cyber.harvard.edu/rss/rss.html). You have to +''' know the document structure and terminology of RSS to make use of this component. + +Export + +Static Private DAY_NAME As String[] = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"] ' conforms to how WeekDay() works in Gambas +Static Private MONTH_NAME As String[] = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] + +' Mandatory elements +'' The name or title of the feed. +Public Title As String +'' The URL to the website corresponding to this feed. +Public {Link} As String +'' A description of the feed's contents. +Public Description As String + +' Optional elements +'' The language the feed content is written in. Use one of the [defined](https://cyber.harvard.edu/rss/languages.html) values. +Public Language As String +'' Copyright notice for the feed content. +Public Copyright As String +'' EMail address of the managing editor. +Public ManagingEditor As String +'' EMail address of the web master. +Public WebMaster As String +'' Publication date/timezone of the feed. E.g. a newspaper with daily publication would change this once a day. If unset, defaults to the time the XML document is written in the local timezone. +Public Pub As RssDate +'' The date/timezone of the last change to the feed contents. If unset, defaults to the time the XML document is written in the local timezone. +Public LastBuild As RssDate +'' An array of categories for this feed. +'' +'' ## See also +'' [../../rsscategory] +Public Categories As RssCategory[] +'' The program which generated the feed. +Public Generator As String +'' A link to the RSS specification, to inform future generations of what an RSS file is, if they find one. +Public Docs As String +'' Description of an associated cloud service. +'' +'' ## See also +'' [../../rsscloud] +Public Cloud As RssCloud +'' "Time to live", indicates how long the feed contents may be cached. +Public Ttl As Integer +'' An image associated with the feed. +'' +'' ## See also +'' [../../rssimage] +Public Image As RssImage +'' [PICS](http://www.w3.org/PICS/) rating of the feed. +Public Rating As String +'' Describes a text input box to be displayed with the feed. +'' +'' ## See also +'' [../../rsstextinput] +Public TextInput As RssTextInput +'' A hint for news aggregators. It gives a number of hours in the range of 0 to 23 when no new content is to be expected in the feed. +'' A client may ignore this setting, but can also use it to save traffic. You may only specify up to 24 skip hours. +Public SkipHours As Integer[] +'' A hint for news aggregators. It gives a number of weekdays (gb.Monday, gb.Tuesday, etc.) when no new content is to be expected in +'' the feed. A client may ignore this setting, but can also use it to save traffic. You may only specify up to 7 skip days. +Public SkipDays As Integer[] + +'' Returns the number of RssItems in this document. +Property Read Count As Integer + +Private $aItems As New RssItem[] + +'' Add an RssItem to the document. If ~Index~ is given, the item is inserted at the given +'' position in the array of items. By default it is inserted at the end. +Public Sub Add(Item As RssItem, Optional Index As Integer) + If IsMissing(Index) Then + $aItems.Add(Item) + Else + $aItems.Add(Item, Index) + Endif +End + +Private Function Count_Read() As Integer + Return $aItems.Count +End + +'' Return the RssItem at position ~Index~. +Public Sub _get(Index As Integer) As RssItem + Return $aItems[Index] +End + +'' Replace the RssItem at position ~Index~. +Public Sub _put(Item As RssItem, Index As Integer) + $aItems[Index] = Item +End + +'' Iterate through all RssItems, in the order they are given in the document. +Public Sub _next() As RssItem + Dim iIndex As Integer + Dim hItem As RssItem + + iIndex = 0 + If Not IsNull(Enum.Index) Then iIndex = Enum.Index + If iIndex > $aItems.Max Then + Enum.Stop() + Return + Endif + hItem = $aItems[iIndex] + Enum.Index = iIndex + 1 + Return hItem +End + +'' Remove ~Length~-many RssItems from the item array, beginning at position ~Index~. By default ~Length~ is 1. +Public Sub Remove(Index As Integer, Optional Length As Integer = 1) + $aItems.Remove(Index, Length) +End + +'' Reverse the order of RssItems. +Public Sub Reverse() + $aItems.Reverse() +End + +'' Sort the items by their date. You can pick ~Mode~ as gb.Ascent or gb.Descent. +'' The default is descending sort so that the newest items are first in the document. +Public Sub Sort(Optional Mode As Integer = gb.Descent) + $aItems.Sort(Mode) +End + +'' Clear the Rss object. Sets all properties to Null and clears the item array. +Public Sub Clear() + Title = Null + {Link} = Null + Description = Null + Language = Null + Copyright = Null + ManagingEditor = Null + WebMaster = Null + Pub = Null + LastBuild = Null + Categories = Null + Generator = Null + Docs = Null + Cloud = Null + Ttl = 0 + Image = Null + Rating = Null + TextInput = Null + SkipHours = Null + SkipDays = Null + $aItems.Clear() +End + +'' Write this Rss object as an XML document and return its contents. +Public Function ToString() As String + Dim hWriter As New XmlWriter + + hWriter.Open(Null, True) + _Write(hWriter) + Return hWriter.EndDocument() +End + +Public Sub _Write(hWriter As XmlWriter) + Dim hItem As RssItem + Dim hCat As RssCategory + + hWriter.StartElement("rss", ["version", "2.0"]) + hWriter.StartElement("channel") + With hWriter + .Element("title", Title) + .Element("link", {Link}) + .Element("description", Description) + If Language Then .Element("language", Language) + If Copyright Then .Element("copyright", Copyright) + If ManagingEditor Then .Element("managingEditor", ManagingEditor) + If WebMaster Then .Element("webMaster", WebMaster) + If Pub Then Pub._Write(hWriter, "pubDate") + If LastBuild Then LastBuild._Write(hWriter, "lastBuildDate") + If Categories Then + For Each hCat In Categories + hCat._Write(hWriter) + Next + Endif + If Generator Then .Element("generator", Generator) + If Docs Then .Element("docs", Docs) + If Cloud Then Cloud._Write(hWriter) + If Ttl Then .Element("ttl", Str$(Ttl)) + If Image Then Image._Write(hWriter) + ' For the Rating, see Holzner: "Secrets of RSS", chapter 4 + If Rating Then .Element("rating", Rating) + If TextInput Then TextInput._Write(hWriter) + If SkipHours Then _WriteSkipHours(hWriter) + If SkipDays Then _WriteSkipDays(hWriter) + End With + + For Each hItem In $aItems + hItem._Write(hWriter) + Next + hWriter.EndElement() + hWriter.EndElement() +End + +'' https://cyber.harvard.edu/rss/skipHoursDays.html + +Private Sub _WriteSkipHours(hWriter As XmlWriter) + Dim iHour As Integer + + If Not SkipHours.Count Then Return + If SkipHours.Count > 24 Then Error.Raise(("SkipHours may only contain up to 24 elements")) + With hWriter + .StartElement("skipHours") + For Each iHour In SkipHours + If iHour < 0 Or If iHour > 23 Then Error.Raise(("SkipHour element must be in the range [0, 23]")) + .Element("hour", Str$(iHour)) + Next + .EndElement() + End With +End + +Private Sub _WriteSkipDays(hWriter As XmlWriter) + Dim iDay As Integer + + If Not SkipDays.Count Then Return + If SkipDays.Count > 7 Then Error.Raise(("SkipDays may only contain up to 7 elements")) + With hWriter + .StartElement("skipDays") + For Each iDay In SkipDays + .Element("day", GetSkipDay(iDay)) + Next + .EndElement() + End With +End + +Private Function GetSkipDay(iDay As Integer) As String + Select Case iDay + Case gb.Monday + Return "Monday" + Case gb.Tuesday + Return "Tuesday" + Case gb.Wednesday + Return "Wednesday" + Case gb.Thursday + Return "Thursday" + Case gb.Friday + Return "Friday" + Case gb.Saturday + Return "Saturday" + Case gb.Sunday + Return "Sunday" + End Select + Error.Raise(Subst$(("Invalid SkipDays day '&1'"), iDay)) +End + +Private Function GetDay(sDay As String) As Integer + Select Case sDay + Case "Monday" + Return gb.Monday + Case "Tuesday" + Return gb.Tuesday + Case "Wednesday" + Return gb.Wednesday + Case "Thursday" + Return gb.Thursday + Case "Friday" + Return gb.Friday + Case "Saturday" + Return gb.Saturday + Case "Sunday" + Return gb.Sunday + End Select + Error.Raise(Subst$(("Invalid day '&1'"), sDay)) +End + +'' Read the RSS document in XML format, given in ~Data~, and fill the properties of this Rss object +'' accordingly. +Public Sub FromString(Data As String) + Dim hReader As New XmlReader + + Clear() + hReader.FromString(Data) + _Read(hReader) +End + +Public Sub _Read(hReader As XmlReader) + hReader.Read() + If Not hReader.Node.Name = "rss" Then Error.Raise((" expected")) + _ReadRss(hReader) + hReader.Read() + If Not hReader.Eof Then Error.Raise(("End-of-file expected")) +End + +' This method is to be used as a While condition. In this case, the loop will continue until +' an end tag is found on the same depth as ~iDepth~. +Static Public Function _NotClosed(hReader As XmlReader, iDepth As Integer) As Boolean + ' The depth of the end tag is apparently one less than that of the start tag. + ' TODO: It would be nice if hReader.Node.Name contained the name of an element also when we encounter its closing tag. + Return (hReader.Node.Type <> XmlReaderNodeType.EndElement) Or (hReader.Depth <> iDepth - 1) +End + +Static Public Sub _GetText(hReader As XmlReader) As String + Dim sRes As String + Dim iDepth As Integer = hReader.Depth + + hReader.Read() + While _NotClosed(hReader, iDepth) + If hReader.Node.Type = XmlReaderNodeType.Text Or If hReader.Node.Type = XmlReaderNodeType.CDATA Then sRes &= hReader.Node.Value + hReader.Read() + Wend + Return sRes +End + +Private Sub _ReadRss(hReader As XmlReader) + hReader.Read() + If Not hReader.Node.Name = "channel" Then Error.Raise((" expected")) + _ReadChannel(hReader) + hReader.Read() + ' FIXME: Here, hReader.Depth is 0, instead of -1, as it should be if it was consistent with the observation in _NotClosed() + If hReader.Node.Type <> XmlReaderNodeType.EndElement Or If hReader.Depth <> 0 Then Error.Raise((" expected")) +End + +Private Sub _ReadChannel(hReader As XmlReader) + Dim hCat As RssCategory, aCategories As New RssCategory[] + Dim hItem As RssItem, aItems As New RssItem[] + Dim iDepth As Integer = hReader.Depth + + hReader.Read() + While _NotClosed(hReader, iDepth) + Select Case hReader.Node.Name + Case "title" + Title = _GetText(hReader) + Case "link" + {Link} = _GetText(hReader) + Case "description" + Description = _GetText(hReader) + Case "language" + Language = _GetText(hReader) + Case "copyright" + Copyright = _GetText(hReader) + Case "managingEditor" + ManagingEditor = _GetText(hReader) + Case "webMaster" + WebMaster = _GetText(hReader) + Case "pubDate" + Pub = New RssDate + Pub._Read(hReader) + Case "lastBuildDate" + LastBuild = New RssDate + LastBuild._Read(hReader) + Case "category" + hCat = New RssCategory + hCat._Read(hReader) + aCategories.Add(hCat) + Case "generator" + Generator = _GetText(hReader) + Case "docs" + Docs = _GetText(hReader) + Case "cloud" + Cloud = New RssCloud + Cloud._Read(hReader) + Case "ttl" + Ttl = CInt(_GetText(hReader)) + Case "image" + Image = New RssImage + Image._Read(hReader) + Case "rating" + Rating = _GetText(hReader) + Case "textInput" + TextInput = New RssTextInput + TextInput._Read(hReader) + Case "skipHours" + _ReadSkipHours(hReader) + Case "skipDays" + _ReadSkipDays(hReader) + Case "item" + hItem = New RssItem + hItem._Read(hReader) + aItems.Add(hItem) + Default + Error.Raise(Subst$(("Unexpected element '&1' in "), hReader.Node.Name)) + End Select + ' XXX: Empty tags can be or . If the last thing we read was of the + ' latter kind, we have to Read() one step further to consume its closing tag. If it was + ' a self-closing element, we must not read any further. + ' + ' This is how I check for this currently: we have to be at the end of an element now. + ' XmlReader sets hReader.Node.Type To XmlReaderNodeType.EndElement only if a real + ' ending tag was encountered. A self-closing element is an XmlReaderNodeType.Element. + If hReader.Node.Type = XmlReaderNodeType.EndElement Then hReader.Read() + Wend + If aCategories.Count Then Categories = aCategories + $aItems = aItems +End + +Private Sub _ReadSkipHours(hReader As XmlReader) + Dim iDepth As Integer = hReader.Depth + Dim iHour As Integer, aHours As New Integer[] + + hReader.Read() + While _NotClosed(hReader, iDepth) + If hReader.Node.Name <> "hour" Then Error.Raise((" expected")) + iHour = CInt(_GetText(hReader)) + If iHour < 0 Or If iHour > 23 Then Error.Raise(Subst$(("SkipHours element '&1' out of range [0, 23]"), iHour)) + aHours.Add(iHour) + hReader.Read() + Wend + If aHours.Count > 24 Then Error.Raise(("SkipHours may only contain up to 24 elements")) + If aHours.Count Then SkipHours = aHours +End + +Private Sub _ReadSkipDays(hReader As XmlReader) + Dim iDepth As Integer = hReader.Depth + Dim iDay As Integer, aDays As New Integer[] + + hReader.Read() + While _NotClosed(hReader, iDepth) + If hReader.Node.Name <> "day" Then Error.Raise((" expected")) + iDay = GetDay(_GetText(hReader)) + aDays.Add(iDay) + hReader.Read() + Wend + If aDays.Count > 7 Then Error.Raise(("SkipDays may only contain up to 7 elements")) + If aDays.Count Then SkipDays = aDays +End diff --git a/comp/src/gb.web.feed/.src/RssCategory.class b/comp/src/gb.web.feed/.src/RssCategory.class new file mode 100644 index 00000000..23c2f975 --- /dev/null +++ b/comp/src/gb.web.feed/.src/RssCategory.class @@ -0,0 +1,24 @@ +' Gambas class file + +''' This class represents an RSS category. The RSS specification does not provide a standard +''' set of categories. You can invent your own (site-specific) categories. + +Export + +'' The category description string. Use forward slashes as separators to structure categories hierarchically. +Public Category As String +'' The category domain is an ID for, or a URL to, a category taxonomy description. +Public Domain As String + +Public Sub _Write(hWriter As XmlWriter) + With hWriter + .StartElement("category", IIf(Domain, ["domain", Domain], Null)) + .Text(Category) + .EndElement() + End With +End + +Public Sub _Read(hReader As XmlReader) + Domain = hReader.Node.Attributes["domain"] + Category = Rss._GetText(hReader) +End diff --git a/comp/src/gb.web.feed/.src/RssCloud.class b/comp/src/gb.web.feed/.src/RssCloud.class new file mode 100644 index 00000000..7b9d7da4 --- /dev/null +++ b/comp/src/gb.web.feed/.src/RssCloud.class @@ -0,0 +1,64 @@ +' Gambas class file + +''' This class can be used to specify a web application implementing the rssCloud interface. +''' An rssCloud application notifies its registrees of changes in subscribed RSS channels. +''' +''' See [https://cyber.harvard.edu/rss/soapMeetsRss.html#rsscloudInterface] for an explanation. + +Export + +Public Enum XmlRpc, Soap, HttpPost ' Protocol constants + +'' Domain name of the application server. +Public Domain As String +'' TCP port of the application. +Public Port As Integer +'' The script path on the server. +Public Path As String +'' The name of the registration procedure to be called on the server side. +Public RegisterProcedure As String +'' The rssCloud protocol to use. One of [../xmlrpc], [../soap] or [../httppost]. +Public Protocol As Integer + +Public Sub _Write(hWriter As XmlWriter) + If Not Domain Or If Not Port Or If Not Path Or If Not RegisterProcedure Or If Not Protocol Then Error.Raise(("Domain, Port, Path, RegisterProcedure and Protocol must be set in RssCloud")) + With hWriter + .StartElement("cloud", ["domain", Domain, "port", Str$(Port), "path", Path, "registerProcedure", RegisterProcedure, "protocol", GetProtocol(Protocol)]) + .EndElement() + End With +End + +Private Function GetProtocol(iProto As Integer) As String + Select Case iProto + Case XmlRpc + Return "xml-rpc" + Case Soap + Return "soap" + Case HttpPost + Return "http-post" + End Select + Error.Raise(Subst$(("Invalid RssCloud protocol constant '&1'"), iProto)) +End + +Private Function GetProtocolConst(sProto As String) As Integer + Select Case sProto + Case "xml-rpc" + Return XmlRpc + Case "soap" + Return Soap + Case "http-post" + Return HttpPost + End Select + Error.Raise(Subst$(("Invalid RssCloud protocol '&1'"), sProto)) +End + +Public Sub _Read(hReader As XmlReader) + With hReader.Node.Attributes + Domain = .["domain"] + Port = CInt(.["port"]) + Path = .["path"] + RegisterProcedure = .["registerProcedure"] + Protocol = GetProtocolConst(.["protocol"]) + End With + hReader.Read() +End diff --git a/comp/src/gb.web.feed/.src/RssDate.class b/comp/src/gb.web.feed/.src/RssDate.class new file mode 100644 index 00000000..00a72ee0 --- /dev/null +++ b/comp/src/gb.web.feed/.src/RssDate.class @@ -0,0 +1,38 @@ +' Gambas class file + +''' This class represents a date in RSS. It is comprised of a Gambas Date and +''' a Zone timezone string. Since dates are absolute in Gambas, the timezone is +''' only used during reading and writing the XML document backing an RSS feed. +''' It does not have to "applied" to the Date in any way by the user of this component. + +Export + +' We have a member named "Date", which overshadows the global class of the same name. +' Get a reference to it here. +Static Private DateClass As Object = Classes["Date"].New() + +'' The date represented by this object. +Public {Date} As Date +'' The timezone relative to which the Date was or should be printed. +Public Zone As String + +Public Sub _new(Optional {Date} As Date, Optional Zone As String) + ' Now in the local timezone by default + If IsMissing({Date}) Then {Date} = Now + If IsMissing(Zone) Then Zone = Format$(Now, "tt") + Me.Date = {Date} + Me.Zone = Zone +End + +Public Sub _Read(hReader As XmlReader) + {Date} = DateClass.FromRFC822(Rss._GetText(hReader), ByRef Zone) +End + +' The sTag parameter avoids subclassing RssDate to RssPubDate and RssLastBuildDate. +Public Sub _Write(hWriter As XmlWriter, sTag As String) + With hWriter + .StartElement(sTag) + .Text(DateClass.ToRFC822(Me.Date, Me.Zone)) + .EndElement() + End With +End diff --git a/comp/src/gb.web.feed/.src/RssEnclosure.class b/comp/src/gb.web.feed/.src/RssEnclosure.class new file mode 100644 index 00000000..ca6b0733 --- /dev/null +++ b/comp/src/gb.web.feed/.src/RssEnclosure.class @@ -0,0 +1,29 @@ +' Gambas class file + +''' This class represents a media attachment to an RSS item. + +Export + +'' The URL of the attached file. +Public Url As String +'' The length of the file in bytes. +Public Length As Long +'' The MIME type of the file. +Public Type As String + +Public Sub _Write(hWriter As XmlWriter) + If Not Url Or If Not Length Or If Not Type Then Error.Raise(("Url, Length and Type must be set in RssEnclosure")) + With hWriter + .StartElement("enclosure", ["url", Url, "type", Type, "length", Str$(Length)]) + .EndElement() + End With +End + +Public Sub _Read(hReader As XmlReader) + With hReader.Node.Attributes + Url = .["url"] + Length = CLong(.["length"]) + Type = .["type"] + End With + hReader.Read() +End diff --git a/comp/src/gb.web.feed/.src/RssGuid.class b/comp/src/gb.web.feed/.src/RssGuid.class new file mode 100644 index 00000000..6ae27913 --- /dev/null +++ b/comp/src/gb.web.feed/.src/RssGuid.class @@ -0,0 +1,37 @@ +' Gambas class file + +''' This class represents a GUID (**G**lobally **U**nique **ID**entifier) of an RSS item. +''' The RSS specification does not prescribe a particular format. A news aggregator may use +''' this property, if present, to determine whether the item is new. +''' +''' By default the [IsPermaLink] property is True, meaning permalinks are the default way +''' to assign the item a GUID. + +Export + +'' The GUID string. +Public Guid As String +'' Returns or sets if this GUID is a [permalink](https://en.wikipedia.org/wiki/Permalink). +'' The default value of this property is True. +Public IsPermaLink As Boolean + +Public Sub _new() + IsPermaLink = True +End + +Public Sub _Write(hWriter As XmlWriter) + With hWriter + .StartElement("guid", IIf(IsPermaLink, ["isPermaLink", "true"], Null)) + .Text(Guid) + .EndElement() + End With +End + +Public Sub _Read(hReader As XmlReader) + If hReader.Node.Attributes.Exist("isPermaLink") Then + IsPermaLink = (hReader.Node.Attributes["isPermaLink"] = "true") + Else + IsPermaLink = False + Endif + Guid = Rss._GetText(hReader) +End diff --git a/comp/src/gb.web.feed/.src/RssImage.class b/comp/src/gb.web.feed/.src/RssImage.class new file mode 100644 index 00000000..cebf51c7 --- /dev/null +++ b/comp/src/gb.web.feed/.src/RssImage.class @@ -0,0 +1,79 @@ +' Gambas class file + +''' This class represents an image which is associated with an RSS feed. +''' The Title and Link properties should be the same as the corresponding ones of the +''' parent Rss object. + +Export + +'' The URL of the image file. The specification requires this to be a GIF, JPEG or PNG file. +Public Url As String +'' An image title. It is to be used as the 'alt' attribute of the '' HTML tag if the feed is rendered as HTML. +'' +'' ## See also +'' [../link], [../description] +Public Title As String +'' The URL of the website the feed belongs to. When the feed is rendered as HTML the RssImage becomes a link to this website. +'' +'' ## See also +'' [../title], [../description] +Public {Link} As String +'' The width of the image. The maximum width is 144, the default is 88. +Public Width As Integer +'' The height of the image. The maximum height is 400, the default is 31. +Public Height As Integer +'' If the feed is rendered as HTML this string is to be become the 'title' attribute of the link rendered around the image. +'' +'' ## See also +'' [../title], [../link] +Public Description As String + +Public Sub _new() + Width = 88 + Height = 31 +End + +Public Sub _Write(hWriter As XmlWriter) + If Not Url Or If Not Title Or If Not {Link} Then Error.Raise(("Url, Title and Link must be set in RssImage")) + With hWriter + .StartElement("image") + .Element("url", Url) + .Element("title", Title) + .Element("link", {Link}) + If Width Then + If Width > 144 Then Error.Raise(("Maximum width of RssImage is 144")) + .Element("width", Str$(Width)) + Endif + If Height Then + If Height > 400 Then Error.Raise(("Maximum height of RssImage is 400")) + .Element("height", Str$(Height)) + Endif + If Description Then .Element("description", Description) + .EndElement() + End With +End + +Public Sub _Read(hReader As XmlReader) + Dim iDepth As Integer = hReader.Depth + + hReader.Read() + While Rss._NotClosed(hReader, iDepth) + Select Case hReader.Node.Name + Case "url" + Url = Rss._GetText(hReader) + Case "title" + Title = Rss._GetText(hReader) + Case "link" + {Link} = Rss._GetText(hReader) + Case "width" + Width = CInt(Rss._GetText(hReader)) + Case "height" + Height = CInt(Rss._GetText(hReader)) + Case "description" + Description = Rss._GetText(hReader) + Default + Error.Raise(Subst$(("Unexpected element '&1' in "), hReader.Node.Name)) + End Select + hReader.Read() + Wend +End diff --git a/comp/src/gb.web.feed/.src/RssItem.class b/comp/src/gb.web.feed/.src/RssItem.class new file mode 100644 index 00000000..806030c7 --- /dev/null +++ b/comp/src/gb.web.feed/.src/RssItem.class @@ -0,0 +1,113 @@ +' Gambas class file + +''' This class represents a single news item. Create an object of this class, fill its properties +''' and add it to an existing [Rss](../rss) object. +''' +''' All properties of this class are optional, but you have to fill at least Title *or* Description. + +Export + +'' The title of the news item. +Public Title As String +'' A link to the website containing the full content. +Public {Link} As String +'' Synopsis of the item. You can use entity-encoded HTML. +Public Description As String +'' EMail address of the author. +Public Author As String +'' An array of categories for this item. +'' +'' ## See also +'' [../../rsscategory] +Public Categories As RssCategory[] +'' A URL pointing to a comment page for the item. +Public Comments As String +'' Describes a media attachment to this item. +'' +'' ## See also +'' [../../rssenclosure] +Public Enclosure As RssEnclosure +'' A **G**lobally **U**nique **ID**entifier for this item, e.g. a [permalink](https://en.wikipedia.org/wiki/Permalink) +'' to the item's full content on your website. +'' +'' ## See also +'' [../../rssguid] +Public Guid As RssGuid +'' Publication date/timezone of this item. If unset, defaults to the time the XML document is written in the local timezone. +Public Pub As RssDate +'' If this item comes from another RSS feed, use this property to link to the original feed. +'' +'' ## See also +'' [../../rsssource] +Public Source As RssSource + +Public Sub _compare(Other As RssItem) As Integer + ' Only up to seconds. The time formatting in RSS is not any finer anyway. + Return Sgn(DateDiff(Other.Pub.Date, Pub.Date, gb.Second)) +End + +Public Sub _Write(hWriter As XmlWriter) + Dim hCat As RssCategory + + If Not Title And If Not Description Then Error.Raise(("Title or Description must be set in RssItem")) + hWriter.StartElement("item") + With hWriter + If Title Then .Element("title", Title) + If {Link} Then .Element("link", {Link}) + If Description Then .Element("description", Description) + If Author Then .Element("author", Author) + If Categories Then + For Each hCat In Categories + hCat._Write(hWriter) + Next + Endif + If Comments Then .Element("comments", Comments) + If Enclosure Then Enclosure._Write(hWriter) + If Guid Then Guid._Write(hWriter) + If Pub Then Pub._Write(hWriter, "pubDate") + If Source Then Source._Write(hWriter) + End With + hWriter.EndElement() +End + +Public Sub _Read(hReader As XmlReader) + Dim hCat As RssCategory, aCategories As New RssCategory[] + Dim iDepth As Integer = hReader.Depth + + hReader.Read() + While Rss._NotClosed(hReader, iDepth) + Select Case hReader.Node.Name + Case "title" + Title = Rss._GetText(hReader) + Case "link" + {Link} = Rss._GetText(hReader) + Case "description" + Description = Rss._GetText(hReader) + Case "author" + Author = Rss._GetText(hReader) + Case "category" + hCat = New RssCategory + hCat._Read(hReader) + aCategories.Add(hCat) + Case "comments" + Comments = Rss._GetText(hReader) + Case "enclosure" + Enclosure = New RssEnclosure + Enclosure._Read(hReader) + Case "guid" + Guid = New RssGuid + Guid._Read(hReader) + Case "pubDate" + Pub = New RssDate + Pub._Read(hReader) + Case "source" + Source = New RssSource + Source._Read(hReader) + Default + Error.Raise(Subst$(("Unexpected element '&1' in "), hReader.Node.Name)) + End Select + ' XXX: See Rss._ReadChannel() for this construction. + If hReader.Node.Type = XmlReaderNodeType.EndElement Then hReader.Read() + Wend + If aCategories.Count Then Categories = aCategories +End diff --git a/comp/src/gb.web.feed/.src/RssSource.class b/comp/src/gb.web.feed/.src/RssSource.class new file mode 100644 index 00000000..b7debc58 --- /dev/null +++ b/comp/src/gb.web.feed/.src/RssSource.class @@ -0,0 +1,27 @@ +' Gambas class file + +''' This class describes a foreign source of an RSS item which you included in your RSS feed. + +Export + +'' The feed title of the source RSS feed. +'' +'' ## See also +'' [Rss.Title](../../rss/title) +Public Source As String +'' Link to the foreign RSS feed's XML document. +Public Url As String + +Public Sub _Write(hWriter As XmlWriter) + If Not Url Then Error.Raise(("Url must be set in RssSource")) + With hWriter + .StartElement("source", ["url", Url]) + .Text(Source) + .EndElement() + End With +End + +Public Sub _Read(hReader As XmlReader) + Url = hReader.Node.Attributes["url"] + Source = Rss._GetText(hReader) +End diff --git a/comp/src/gb.web.feed/.src/RssTextInput.class b/comp/src/gb.web.feed/.src/RssTextInput.class new file mode 100644 index 00000000..852d9553 --- /dev/null +++ b/comp/src/gb.web.feed/.src/RssTextInput.class @@ -0,0 +1,51 @@ +' Gambas class file + +''' This class represents a text input field which the news aggregator may display +''' with your feed. The [RSS specification](https://cyber.harvard.edu/rss/rss.html#lttextinputgtSubelementOfLtchannelgt) +''' admits that this element's purpose is unclear and that it may not be widely supported. +''' It can be used as a built-in mechanism to provide feedback to the feed owner's website +''' or as a search box. + +Export + +'' The label of the submit button next to the input box. +Public Title As String +'' Explanation of the input box's purpose. +Public Description As String +'' The name of the input box, for use by the CGI script the input is sent to. +Public Name As String +'' Link to the CGI script which processes the input. +Public {Link} As String + +Public Sub _Write(hWriter As XmlWriter) + If Not Title Or If Not Description Or If Not Name Or If Not {Link} Then Error.Raise(("Title, Description, Name and Link must be set in RssTextInput")) + With hWriter + .StartElement("textInput") + .Element("title", Title) + .Element("description", Description) + .Element("name", Name) + .Element("link", {Link}) + .EndElement() + End With +End + +Public Sub _Read(hReader As XmlReader) + Dim iDepth As Integer = hReader.Depth + + hReader.Read() + While Rss._NotClosed(hReader, iDepth) + Select Case hReader.Node.Name + Case "title" + Title = Rss._GetText(hReader) + Case "description" + Description = Rss._GetText(hReader) + Case "name" + Name = Rss._GetText(hReader) + Case "link" + {Link} = Rss._GetText(hReader) + Default + Error.Raise(Subst$(("Unexpected element '&1' in "), hReader.Node.Name)) + End Select + hReader.Read() + Wend +End diff --git a/comp/src/gb.web.feed/Feed-icon.svg b/comp/src/gb.web.feed/Feed-icon.svg new file mode 100644 index 00000000..11fd98a5 --- /dev/null +++ b/comp/src/gb.web.feed/Feed-icon.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/comp/src/gb.web.feed/test.xml b/comp/src/gb.web.feed/test.xml new file mode 100644 index 00000000..7f981ba3 --- /dev/null +++ b/comp/src/gb.web.feed/test.xml @@ -0,0 +1,41 @@ + + + + Liftoff News + http://liftoff.msfc.nasa.gov/ + Liftoff to Space Exploration. + en-us + Tue, 10 Jun 2003 04:00:00 GMT + Tue, 10 Jun 2003 09:41:01 GMT + http://blogs.law.harvard.edu/tech/rss + Weblog Editor 2.0 + editor@example.com + webmaster@example.com + + Star City + http://liftoff.msfc.nasa.gov/news/2003/news-starcity.asp + How do Americans get ready to work with Russians aboard the International Space Station? They take a crash course in culture, language and protocol at Russia's <a href="http://howe.iki.rssi.ru/GCTC/gctc_e.htm">Star City</a>. + Tue, 03 Jun 2003 09:39:21 GMT + http://liftoff.msfc.nasa.gov/2003/06/03.html#item573 + + + Sky watchers in Europe, Asia, and parts of Alaska and Canada will experience a <a href="http://science.nasa.gov/headlines/y2003/30may_solareclipse.htm">partial eclipse of the Sun</a> on Saturday, May 31st. + Fri, 30 May 2003 11:06:42 GMT + http://liftoff.msfc.nasa.gov/2003/05/30.html#item572 + + + The Engine That Does More + http://liftoff.msfc.nasa.gov/news/2003/news-VASIMR.asp + Before man travels to Mars, NASA hopes to design new engines that will let us fly through the Solar System more quickly. The proposed VASIMR engine would do that. + Tue, 27 May 2003 08:37:32 GMT + http://liftoff.msfc.nasa.gov/2003/05/27.html#item571 + + + Astronauts' Dirty Laundry + http://liftoff.msfc.nasa.gov/news/2003/news-laundry.asp + Compared to earlier spacecraft, the International Space Station has many luxuries, but laundry facilities are not one of them. Instead, astronauts have other options. + Tue, 20 May 2003 08:56:02 GMT + http://liftoff.msfc.nasa.gov/2003/05/20.html#item570 + + + \ No newline at end of file diff --git a/comp/src/gb.web.form/.component b/comp/src/gb.web.form/.component new file mode 100644 index 00000000..6a87f1b3 --- /dev/null +++ b/comp/src/gb.web.form/.component @@ -0,0 +1,7 @@ +[Component] +Key=gb.web.form +Version=3.14.90 +State=1 +Authors=Benoît Minisini +Requires=gb.web,gb.util.web,gb.util +Excludes=gb.gui,gb.gui.qt,gb.gtk,gb.gtk3,gb.qt4,gb.qt5,gb.sdl2,gb.sdl,gb.web.form2 diff --git a/comp/src/gb.web.form/.directory b/comp/src/gb.web.form/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/comp/src/gb.web.form/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/comp/src/gb.web.form/.hidden/Uncompressed/gw-style.css b/comp/src/gb.web.form/.hidden/Uncompressed/gw-style.css new file mode 100644 index 00000000..549123a6 --- /dev/null +++ b/comp/src/gb.web.form/.hidden/Uncompressed/gw-style.css @@ -0,0 +1,504 @@ +HTML, BODY { + margin: 0; + padding: 0; + height: 100%; + width: 100%; +} + +HTML, BODY, DIV { + box-sizing: border-box; +} + +SELECT { + min-height: 2rem; + font-size: inherit; +} + +INPUT { + font: inherit; +} + +H1,H2,H3,P { + margin-top: 0.5rem; + margin-bottom: 0.25rem; +} + +/*UL, OL { + padding-left: 2em; + margin-bottom: 0; +} + +P:first-child,UL:first-child,OL:first-child { + margin-top: 0; +}*/ + +.gw-button { + padding: 0; + font: inherit; + padding: 0 0.25em; + /*min-height: 1rem;*/ +} + +.gw-button.gw-noborder { + border: solid 1px transparent; + background: none; + padding: 0; +} + +.gw-button.gw-noborder:hover { + border: solid 1px #C0C0C0; +} + +.gw-button-image { + margin-right: 0.5em; +} + +.gw-button > IMG { + vertical-align: middle; +} + +.gw-button > DIV { + display: inline-block; + vertical-align: middle; +} + +.gw-tab-header { + margin-bottom: -1px; + z-index: 1; + line-height: 2em; +} + +.gw-tab-header.gw-noborder { + margin-bottom: 0; +} + +.gw-tab { + color: gray; + padding: 0 0.5em; + cursor: pointer; + border-top: solid transparent 1px; + border-right: solid transparent 1px; + border-left: solid transparent 1px; +} + +.gw-tab:hover { + color: black; +} + +.gw-tab-selected { + padding: 0 0.5em; + border-left: solid #C0C0C0 1px; + border-top: solid #C0C0C0 1px; + border-right: solid #C0C0C0 1px; + border-top-left-radius: 0.5em; + border-top-right-radius: 0.5em; + background: white; +} + +.gw-tab-header.gw-noborder > div { + border: none; +} + +.gw-tab-contents { + border: solid #C0C0C0 1px; + flex-grow: 1; + display: flex; + flex-flow: column; +} + +.gw-tab-contents > DIV { + flex-grow: 1; +} + +.gw-tab-contents.gw-noborder { + border: none; +} + +.gw-checkbox-label,.gw-radiobutton-label { + vertical-align: middle; +} + +.gw-checkbox-toggle,.gw-radiobutton-toggle { + vertical-align: middle; + margin: 0; + margin-right: 0.5em; +} + +.gw-textbox { + min-height: 2rem; + box-sizing: border-box; + padding: 0 0.25em; +} +.gw-textbox.gw-noborder { + border: none; +} + +.gw-combobox { + display: inline-block; + position: relative; + min-height: 2rem; +} + +.gw-combobox SELECT { + height: 100%; + z-index: 1; + opacity: 0; + float: right; +} + +.gw-combobox INPUT { + width: 100%; + min-height: 2rem; + box-sizing: border-box; + padding: 0 2.25em 0 0.25em; + vertical-align: middle; +} + +.gw-combobox.gw-noborder INPUT { + border: none; +} + +.gw-combobox-arrow { + display: inline-block; + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAI0lEQVQYlWNgoAZoYGBg+I8DN+BT1MCABhrwSSIrwilJHgAAbCcP9dwIQGIAAAAASUVORK5CYII='); + background-position: center; + background-repeat: no-repeat; + height: 2rem; + width: 2rem; + margin-left: -2rem; + /*pointer-events: none;*/ + vertical-align: middle; + border: none; + overflow: hidden; +} + +.gw-selectbox { + display: inline-block; + position: relative; + min-height: 2rem; +} + +.gw-selectbox SELECT { + width: 100%; +} + +.gw-selectbox.gw-noborder SELECT { + border: none; +} + +.gw-window { + position: fixed; + border: solid 1px white; + box-shadow: 0 0 0.5em black; + border-radius: 0.5em; + background: white; + z-index: 10; + overflow: hidden; +} + +.gw-window-titlebar { + display: flex; + flex-flow: row; + background: #2980B9; + font-weight: bold; + height: 2em; + border-top-left-radius: 0.5em; + border-top-right-radius: 0.5em; +} + +.gw-window-title { + flex-grow: 1; + color: white; + line-height: 2em; + padding-left: 0.5em; + pointer-events: none; +} + +.gw-window-button { + position: absolute; + padding: 0; + width: 1.5em; + height: 1.5em; + top: 0.25em; + right: 0.25em; +} + +/*@-moz-document url-prefix() { + .gw-window-button { + display: inline-flex; + }; +}*/ + +.gw-window-contents { + display: flex; + flex-flow: column; + flex-grow: 1; + padding: 0.5em; +} + +.gw-label { + display: flex; + align-items: center; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +#gw-modal { + display: none; + position: fixed; + left: 0; + right: 0; + width: 100%; + height: 100%; + background: black; + opacity: 0.05; +} + +.gw-textarea { + font-family: inherit; + resize: none; +} + +.gw-textarea.gw-noborder { + border: none; +} + + +.gw-menu-title { + display: inline-table; + padding: 0.5em; + padding-top: 0.25em; + cursor: default; + border-top: solid 1px transparent; + border-left: solid 1px transparent; + border-right: solid 1px transparent; + /*margin-top: 0.25em; + margin-bottom: 0.25em;*/ +} + +.gw-menu:hover > .gw-menu-title { + border-top: solid 1px #C0C0C0; + border-left: solid 1px #C0C0C0; + border-right: solid 1px #C0C0C0; + box-shadow: 0 0 0.25em #C0C0C0; + background: white; + z-index: 1002; +} + +.gw-submenu { + display: none; + position: absolute; + border: solid 1px #C0C0C0; + background: white; + box-shadow: 0 0.125em 0.25em #C0C0C0; + margin-top: -0.25em; + z-index: 1003; +} + +.gw-menuitem > .gw-menu > .gw-submenu { + margin-top: 0; + top: 0; + left: 100%; +} + +.gw-menu:hover > .gw-submenu { + display: table; +} + +.gw-menu-tape { + display: none; + position: relative; + background: white; + z-index: 1004; + height: 4px; + margin-top: -4px; + margin-left: 1px; + margin-right: 1px; + top: -2px; +} + +.gw-menu:hover > .gw-menu-tape { + display: block; +} + +.gw-submenu > div:hover { + background: #E0E0E0; +} + +.gw-menuitem { + display: flex; + flex-flow: column; +} + +.gw-menuitem > div { + display: table-cell !important; + vertical-align: middle; +} + +.gw-menuitem-text { + flex-grow: 1; + padding: 0.125em 0.25em; + white-space: nowrap; +} + +.gw-menuitem-icon { + padding: 0.125em 0.25em; +} + +.gw-menuitem-icon > IMG { + vertical-align: middle; +} + +.gw-menuitem-shortcut { + text-align: right; + padding: 0.125em 1em; +} + +.gw-separator { + position: relative; + padding: 0 !important; + pointer-events: none; +} + +.gw-separator-hline { + position: absolute; + display: flex; + flex-flow: row; + align-items: center; + height: inherit; + width: 100%; +} + +.gw-separator-hline > div { + height: 1px; + width: 100%; + background: #C0C0C0; +} + +.gw-separator-vline { + position: absolute; + display: flex; + flex-flow: column; + align-items: center; + height: 100%; + width: inherit; +} + +.gw-separator-vline > div { + width: 1px; + height: 100%; + background: #C0C0C0; +} + +.gw-submenu > div { + display: flex !important; + cursor: default; + padding: 0.25em 1em; + margin: 0; +} + +.gw-submenu > .gw-menuitem { + display: table-row !important; + table-layout: fixed; + cursor: default; + padding: 0; + margin: 0; +} + +.gw-submenu > .gw-separator { + display: table-row !important; + cursor: default; + margin: 0; + width: auto; + height: 1em; +} + +.gw-menuitem > .gw-menu { + display: table-cell !important; + position: relative; + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAJElEQVQYlWNgQIAGBgLgPyFF/wkp+o9NERMhe0m2AqckAy5JALuADHot/KmNAAAAAElFTkSuQmCC'); + background-position: center; + background-repeat: no-repeat; + width: 1em; +} + +.gw-spinbox.gw-noborder { + border: none; +} + +.gw-expander-header + DIV { + margin-top: 0.5em; +} + +.gw-expander-header > IMG { + vertical-align: middle; +} + +.gw-expander-header > DIV { + display: inline-table; + vertical-align: middle; +} + +.gw-expander-border { + border: solid 1px #C0C0C0; + padding: 0.5em; +} + +.gw-table { + position: relative; + overflow: auto; + min-height: 4em; + border: solid 1px #C0C0C0; +} + +.gw-table.gw-noborder { + border: none; +} + +/*.gw-table-header { + height: 1.5em; + background-color: yellow; +}*/ + +.gw-table-contents { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.gw-table > DIV > TABLE { + border-collapse: collapse; +} + +.gw-table > DIV > TABLE > THEAD > TR > TH { + text-align: left; + background-color: #E0E0E0; + padding: 0.25em 0.5em; + vertical-align: top; + border-bottom: solid 1px #C0C0C0; +} + +.gw-table > DIV > TABLE > THEAD > TR > TH:last-child { + border-right: none; +} + +.gw-table > DIV > TABLE > TBODY > TR > TD { + /*border-right: solid 1px #C0C0C0;*/ + padding: 0.25em 0.5em; + vertical-align: top; +} + +/*.gw-table > DIV > TABLE > TBODY > TR > TD:last-child { + border-right: none; +} + +.gw-table > DIV > TABLE > TBODY > TR:last-child > TD { + border-bottom: solid 1px #C0C0C0; +}*/ + +.gw-table > DIV > TABLE > TBODY > TR:nth-child(even) { + background-color: #F0F0F0; +} diff --git a/comp/src/gb.web.form/.hidden/Uncompressed/lib.js b/comp/src/gb.web.form/.hidden/Uncompressed/lib.js new file mode 100644 index 00000000..164ffbd9 --- /dev/null +++ b/comp/src/gb.web.form/.hidden/Uncompressed/lib.js @@ -0,0 +1,1321 @@ +function $(a) +{ + return document.getElementById(a); +} + +if (!String.prototype.endsWith) +{ + String.prototype.endsWith = function(searchString, position) + { + var subjectString = this.toString(); + if (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > subjectString.length) { + position = subjectString.length; + } + position -= searchString.length; + var lastIndex = subjectString.indexOf(searchString, position); + return lastIndex !== -1 && lastIndex === position; + }; +} + +Element.prototype.hasClass = function(klass) +{ + if (this.classList) + return this.classList.contains(klass); + else + return !!this.className.match(new RegExp('(\\s|^)' + klass + '(\\s|$)')); +}; + +Element.prototype.addClass = function(klass) +{ + if (this.classList) + this.classList.add(klass); + else if (!this.hasClass(klass)) + this.className += " " + klass; +}; + +Element.prototype.removeClass = function(klass) +{ + if (this.classList) + this.classList.remove(klass); + else if (this.hasClass(klass)) + { + var reg = new RegExp('(\\s|^)' + klass + '(\\s|$)'); + this.className = this.className.replace(reg, ' '); + } +}; + +/*Element.prototype.ensureVisible = function() +{ + var parent = this.offsetParent; + + while (parent && parent.clientHeight == parent.scrollHeight && parent.clientWidth == parent.scrollWidth) + parent = parent.offsetParent; + + if (parent) + gw.ensureVisible(this.offsetParent, this.offsetLeft, this.offsetTop, this.offsetWidth, this.offsetHeight); +};*/ + +gw = { + + version: '0', + commands: [], + timers: {}, + windows: [], + form: '', + debug: false, + loaded: {}, + uploads: {}, + autocompletion: [], + focus: false, + lock: 0, + + log: function(msg) + { + if (gw.debug) + { + if (gw.startTime == undefined) + gw.startTime = Date.now(); + console.log(((Date.now() - gw.startTime) / 1000).toFixed(3) + ': ' + msg); + } + }, + + load: function(lib) + { + var elt, src; + + if (gw.loaded[lib]) + return; + + if (lib.endsWith('.js')) + { + elt = document.createElement('script'); + elt.setAttribute("type", "text/javascript"); + src = $root + '/lib:' + lib.slice(0, -3) + ':' + gw.version + '.js'; + elt.setAttribute("src", src); + } + else if (lib.endsWith('.css')) + { + elt = document.createElement('link'); + elt.setAttribute("rel", "stylesheet"); + elt.setAttribute("type", "text/css"); + src = $root + '/style:' + lib.slice(0, -4) + ':' + gw.version + '.css'; + elt.setAttribute("href", src); + } + else + return; + + document.getElementsByTagName("head")[0].appendChild(elt); + gw.loaded[lib] = src; + console.log('load: ' + src); + }, + + setInnerHtml : function(id, html) + { + var oldDiv = $(id); + var newDiv = oldDiv.cloneNode(false); + newDiv.innerHTML = html; + oldDiv.parentNode.replaceChild(newDiv, oldDiv); + }, + + setOuterHtml : function(id, html) + { + if ($(id)) + $(id).outerHTML = html; + else + console.log('setOuterHtml: ' + id + '? ' + html); + }, + + removeElement : function(id) + { + var elt = $(id); + //for (i = 0; i < id_list.length; i++) + //{ + //elt = $(id_list[i]); + if (!elt) + return; + + //console.log(id + " removed"); + + elt.parentNode.removeChild(elt); + //} + }, + + insertElement : function(id, parent) + { + var elt = document.createElement('div'); + elt.id = id; + + $(parent).appendChild(elt); + }, + + setVisible : function(id, visible) + { + var elt = $(id); + if (elt) + { + if (visible) + elt.removeClass('gw-hidden'); + else + elt.addClass('gw-hidden'); + } + }, + + saveFocus: function() { + var active = document.activeElement.id; + var selection; + + if (active) + selection = gw.getSelection($(active)); + + return [active, selection]; + }, + + restoreFocus: function(save) { + var elt; + + if (save[0]) + { + elt = $(save[0]) + if (elt) + { + elt.focus(); + gw.setSelection(elt, save[1]); + } + } + //else + // gw.active = document.activeElement.id; + }, + + wait: function(lock) { + var elt; + + if (lock) + { + if (gw.lock == 0) + { + elt = $('gw-lock'); + elt.style.zIndex = 1000; + elt.style.display = 'block'; + + gw.lock_id = setTimeout(function() { + $('gw-lock').style.opacity = '1'; + }, 500); + } + + gw.lock++; + } + else + { + gw.lock--; + if (gw.lock == 0) + { + if (gw.lock_id) + { + clearTimeout(gw.lock_id); + gw.lock_id = undefined; + } + elt = $('gw-lock'); + elt.style.display = 'none'; + elt.style.opacity = '0'; + } + } + }, + + answer: function(xhr, after) + { + if (xhr.readyState == 4) + { + if (xhr.status == 200 && xhr.responseText) + { + xhr.gw_command && gw.log('==> ' + xhr.gw_command + '...'); + + gw.focus = false; + var save = gw.saveFocus(); + + /*if (gw.debug) + console.log('--> ' + xhr.responseText);*/ + + var r = xhr.responseText.split('\n'); + var i, expr; + + for (i = 0; i < r.length; i++) + { + expr = r[i].trim(); + if (expr.length == 0) + continue; + if (gw.debug) + { + if (expr.length > 1024) + gw.log('--> ' + expr.substr(0, 1024) + '...'); + else + gw.log('--> ' + expr); + } + eval(expr); + } + + //eval(xhr.responseText); + + if (!gw.focus) + gw.restoreFocus(save); + + } + + if (after) + after(); + + xhr.gw_command && gw.log('==> ' + xhr.gw_command + ' done.'); + + if (xhr.gw_command && (xhr.gw_command.length < 5 || xhr.gw_command[4] == undefined || xhr.gw_command[4] == false)) + gw.wait(false); + + gw.commands.splice(0, 2); + gw.sendNewCommand(); + } + }, + + sendNewCommand: function() + { + var command, after, len; + var xhr; + + for(;;) { + + len = gw.commands.length; + + if (len < 2) + return; + + command = gw.commands[0]; + after = gw.commands[1]; + + gw.log('[ ' + command + ' ]'); + + if (command) + { + if (command.length < 5 || command[4] == undefined || command[4] == false) + gw.wait(true); + + xhr = new XMLHttpRequest(); + xhr.gw_command = command; + xhr.open('GET', $root + '/x?c=' + encodeURIComponent(JSON.stringify(command)), true); + xhr.onreadystatechange = function() { gw.answer(xhr, after); }; + xhr.send(null); + return; + } + + after(); + gw.commands.splice(0, 2); + } + }, + + send: function(command, after) + { + gw.log('gw.send: ' + command + ' ' + JSON.stringify(gw.commands)); + + gw.commands.push(command); + gw.commands.push(after); + + if (gw.commands.length == 2) + gw.sendNewCommand(); + }, + + raise: function(id, event, args, no_wait) + { + gw.send(['raise', id, event, args, no_wait]); + }, + + update: function(id, prop, value, after) + { + gw.send(['update', id, prop, value, true], after); + }, + + command: function(action) + { + gw.send(null, action); + }, + + getSelection: function(o) + { + var start, end; + + try + { + if (o.createTextRange) + { + var r = document.selection.createRange().duplicate(); + r.moveEnd('character', o.value.length) + if (r.text == '') + start = o.value.length; + else + start = o.value.lastIndexOf(r.text); + r.moveStart('character', -o.value.length); + end = r.text.length; + return [start, end]; + } + + if (o.selectionStart && o.selectionEnd) + return [o.selectionStart, o.selectionEnd]; + } + catch(e) {}; + + return undefined; + }, + + setSelection: function(o, sel) + { + if (sel) + { + if (o.setSelectionRange) + try { o.setSelectionRange(sel[0], sel[1]) } catch(e) {}; + } + }, + + setFocus: function(id) + { + var elt = $(id + ':entry') || $(id); + + if (elt) + { + elt.focus(); + gw.active = document.activeElement.id; + gw.selection = undefined; + gw.focus = true; + } + }, + + resizeComboBox: function(id) + { + $(id + '-select').onmouseover = function() { $(id + '-select').style.width = $(id).offsetWidth + 'px'; } + }, + + highlightMandatory: function(id) + { + var elt = $(id); + var elt_br; + var div; + var div_br; + + if (elt == undefined || elt.gw_mandatory) + return; + + elt.gw_mandatory = div = document.createElement('div'); + div.className = 'gw-mandatory'; + elt.parentNode.insertBefore(div, elt); + + elt_br = gw.getPos(elt); + div_br = gw.getPos(div); + + div.style.top = (elt_br.top - div_br.top) + 'px'; + div.style.left = (elt_br.left - div_br.left) + 'px'; + div.style.width = elt_br.width + 'px'; + div.style.height = elt_br.height + 'px'; + }, + + addTimer: function(id, delay) + { + gw.removeTimer(id); + gw.timers[id] = setInterval(function() { gw.raise(id, 'timer', [], true); }, delay); + }, + + removeTimer: function(id) + { + var t = gw.timers[id]; + if (t) + { + clearInterval(gw.timers[id]); + gw.timers[id] = undefined; + } + }, + + getTargetId: function(elt) + { + for(;;) + { + if (elt.id) + return elt.id; + elt = elt.parentNode; + if (!elt) + return; + } + }, + + getPos: function(elt) + { + var found, left = 0, top = 0, width = 0, height = 0; + var offsetBase = gw.offsetBase; + + if (!offsetBase && document.body) + { + offsetBase = gw.offsetBase = document.createElement('div'); + offsetBase.style.cssText = 'position:absolute;left:0;top:0'; + document.body.appendChild(offsetBase); + } + + if (elt && elt.ownerDocument === document && 'getBoundingClientRect' in elt && offsetBase) + { + var boundingRect = elt.getBoundingClientRect(); + var baseRect = offsetBase.getBoundingClientRect(); + found = true; + left = boundingRect.left - baseRect.left; + top = boundingRect.top - baseRect.top; + width = boundingRect.right - boundingRect.left; + height = boundingRect.bottom - boundingRect.top; + } + + return { found: found, left: left, top: top, width: width, height: height, right: left + width, bottom: top + height }; + }, + + /*ensureVisible: function(id, x, y, w, h) + { + var elt = typeof(id) == 'string' ? $(id) : id; + var pw, ph,cx, cy, cw, ch; + var xx, yy, ww, hh; + + // WW = W / 2 + ww = w / 2; + //HH = H / 2 + hh = h / 2; + // XX = X + WW + xx = x + ww + // YY = Y + HH + yy = y + hh; + + // PW = Me.ClientW + // PH = Me.ClientH + pw = elt.clientWidth; + ph = elt.clientHeight; + + cx = - elt.scrollLeft; + cy = - elt.scrollTop; + cw = elt.scrollWidth; + ch = elt.scrollHeight; + + //If PW < (WW * 2) Then WW = PW / 2 + //If PH < (HH * 2) Then HH = PH / 2 + if (pw < (ww * 2)) ww = pw / 2; + if (ph < (hh * 2)) hh = ph / 2; + + //If CW <= PW Then + // WW = 0 + // CX = 0 + //Endif + if (cw <= pw) { ww = 0; cx = 0; } + + //If CH <= PH Then + // HH = 0 + // CY = 0 + //Endif + if (ch <= ph) { hh = 0; cy = 0 } + + //If XX < (- CX + WW) Then + // CX = Ceil(- XX + WW) + //Else If XX >= (- CX + PW - WW) Then + // CX = Floor(- XX + PW - WW) + //Endif + if (xx < (- cx + ww)) + cx = - xx + ww; + else if (xx >= (- cx + pw - ww)) + cx = - xx + pw - ww; + + //If YY < (- CY + HH) Then + // CY = Ceil(- YY + HH) + //Else If YY >= (- CY + PH - HH) Then + // CY = Floor(- YY + PH - HH) + //Endif + + if (yy < (- cy + hh)) + cy = - yy + hh; + else if (yy >= (- cy + ph - hh)) + cy = - yy + ph - hh; + + //If CX > 0 + // CX = 0 + //Else If CX < (PW - CW) And If CW > PW Then + // CX = PW - CW + //Endif + if (cx > 0) + cx = 0; + else if (cx < (pw - cw) && cw > pw) + cx = pw - cw; + + //If CY > 0 Then + // CY = 0 + //Else If CY < (PH - CH) And If CH > PH Then + // CY = PH - CH + //Endif + if (cy > 0) + cy = 0; + else if (cy < (ph - ch) && ch > ph) + cy = ph - ch; + + //If $hHBar.Value = - CX And If $hVBar.Value = - CY Then Return True + //Scroll(- CX, - CY) + elt.scrollLeft = - cx; + elt.scrollTop = - cy; + },*/ + + window: + { + zIndex: 0, + + open: function(id, resizable, modal, minw, minh) + { + gw.window.close(id); + + if (gw.windows.length == 0) + { + document.addEventListener('mousemove', gw.window.onMove); + document.addEventListener('mouseup', gw.window.onUp); + gw.log('document.addEventListener'); + } + + gw.windows.push(id); + + $(id).addEventListener('mousedown', gw.window.onMouseDown); + + $(id).gw_resizable = resizable; + $(id).gw_modal = modal; + + if (modal) + $(id).gw_focus = gw.saveFocus(); + + if (minw != undefined) + { + $(id).gw_minw = minw; + $(id).gw_minh = minh; + } + else + { + $(id).gw_minw = $(id).offsetWidth; + $(id).gw_minh = $(id).offsetHeight; + } + + //console.log('gw.window.open: minw = ' + $(id).gw_minw + ' minh = ' + $(id).gw_minh); + + // Touch events + //pane.addEventListener('touchstart', onTouchDown); + //document.addEventListener('touchmove', onTouchMove); + //document.addEventListener('touchend', onTouchEnd); + + gw.window.refresh(); + }, + + popup: function(id, resizable, control, alignment, minw, minh) + { + var pos; + + gw.window.close(id); + + if (gw.windows.length == 0) + { + document.addEventListener('mousemove', gw.window.onMove); + document.addEventListener('mouseup', gw.window.onUp); + gw.log('document.addEventListener'); + } + + gw.windows.push(id); + + $(id).addEventListener('mousedown', gw.window.onMouseDown); + + $(id).gw_resizable = resizable; + $(id).gw_modal = true; + $(id).gw_popup = true; + $(id).gw_focus = gw.saveFocus(); + + if (minw != undefined) + { + $(id).gw_minw = minw; + $(id).gw_minh = minh; + } + else + { + $(id).gw_minw = $(id).offsetWidth; + $(id).gw_minh = $(id).offsetHeight; + } + + pos = gw.getPos($(control)); + //console.log(pos); + + /*$(id).style.left = pos.left + 'px'; + $(id).style.top = pos.bottom + 'px';*/ + $(id).style.transform = 'translate(' + pos.left + 'px,' + pos.bottom + 'px)'; + + gw.window.refresh(); + }, + + close: function(id) + { + var i; + + $(id).removeEventListener('mousedown', gw.window.onMouseDown); + + i = gw.windows.indexOf(id); + if (i >= 0) + { + gw.windows.splice(i, 1); + gw.window.refresh(); + } + + if ($(id).gw_focus) + { + gw.restoreFocus($(id).gw_focus); + $(id).gw_focus = undefined; + } + }, + + refresh: function() + { + var i = 0; + var zi; + + while (i < gw.windows.length) + { + if ($(gw.windows[i])) + { + zi = 11 + i * 2; + if ($(gw.windows[i]).style.zIndex != zi) + $(gw.windows[i]).style.zIndex = zi; + i++; + } + else + gw.windows.splice(i, 1); + } + + gw.window.updateModal(); + + if (gw.windows.length == 0) + { + gw.log('document.removeEventListener'); + document.removeEventListener('mousemove', gw.window.onMove); + document.removeEventListener('mouseup', gw.window.onUp); + } + else + gw.window.updateTitleBars(); + }, + + updateTitleBars: function() + { + var i, win, last; + + for (i = 0; i < gw.windows.length - 1; i++) + { + win = gw.windows[i]; + if ($(win).gw_popup) + continue; + $(win).addClass('gw-deactivated'); + $(win + '-titlebar').addClass('gw-deactivated'); + last = win; + } + + if (last && !$(last).gw_popup) + { + $(last).removeClass('gw-deactivated'); + $(last + '-titlebar').removeClass('gw-deactivated'); + } + }, + + raise: function(id, send) + { + var i = gw.windows.indexOf(id); + if (i < 0) + return; + + gw.windows.splice(i, 1); + gw.windows.push(id); + + for (i = 0; i < gw.windows.length; i++) + $(gw.windows[i]).style.zIndex = 11 + i * 2; + + gw.window.updateTitleBars(); + + if (send) + gw.update('', '#windows', gw.windows); + }, + + updateModal: function() + { + var i, elt = $('gw-modal'); + + for (i = gw.windows.length - 1; i >= 0; i--) + { + if ($(gw.windows[i]).gw_modal) + { + gw.window.zIndex = 10 + i * 2; + elt.style.zIndex = 10 + i * 2; + elt.style.display = 'block'; + /*if ($(gw.windows[i]).gw_popup) + elt.style.opacity = '0'; + else + elt.style.opacity = '';*/ + return; + } + } + + gw.window.zIndex = 0; + elt.style.display = 'none'; + }, + + center: function(id) + { + $(id).style.transform = 'translate(' + ((window.innerWidth - $(id).offsetWidth) / 2 | 0) + 'px,' + ((window.innerHeight - $(id).offsetHeight) / 2 | 0) + 'px)'; + gw.window.updateGeometry(id); + }, + + maximize: function(id) + { + var geom = $(id).gw_save_geometry; + if (geom != undefined) + { + //$(id).style.left = geom[0]; + //$(id).style.top = geom[1]; + $(id).style.transform = geom[0] + $(id).style.width = geom[1]; + $(id).style.height = geom[2]; + $(id).gw_save_geometry = undefined; + } + else + { + $(id).gw_save_geometry = [$(id).style.transform, $(id).style.width, $(id).style.height]; + $(id).style.transform = ''; + $(id).style.width = '100%'; + $(id).style.height = '100%'; + } + //gw.window.updateGeometry(id); + }, + + onMouseDown: function(e) + { + gw.window.onDown(e); + }, + + onDown: function(e) + { + var c, win; + + gw.window.context = undefined; + + if (e.target.className == 'gw-window-button') + return; + + gw.window.onMove(e); + + c = gw.window.context; + if (c == undefined) + return; + + if ($(c.id).gw_save_geometry) + return; + + if (c.isMoving || c.isResizing) + { + gw.window.raise(c.id); + gw.window.downEvent = e; + e.preventDefault(); + } + }, + + onDownModal: function() + { + var win = gw.windows[gw.windows.length - 1]; + + if ($(win).gw_popup) + gw.update(win, '#close'); + }, + + onMove: function(e) + { + var i, id, elt, b, x, y, bx, by, bw, bh, th; + var onTopEdge, onLeftEdge, onRightEdge, onBottomEdge, isResizing; + var MARGINS = 6; + + if (gw.window.downEvent) + { + gw.window.context.cx = e.clientX; + gw.window.context.cy = e.clientY; + gw.window.animate(); + return; + } + + gw.window.context = undefined; + + for (i = 0; i < gw.windows.length; i++) + { + id = gw.windows[gw.windows.length - i - 1]; + elt = $(id); + + if (elt.style.zIndex < gw.window.zIndex) + continue; + + b = elt.getBoundingClientRect(); + + bx = b.left; // - MARGINS; + by = b.top; // - MARGINS; + bw = b.width; // + MARGINS * 2; + bh = b.height; // + MARGINS * 2; + + x = e.clientX - bx; + y = e.clientY - by; + + //console.log(x + ',' + y + ' : ' + bx + ',' + by + ',' + bw + ',' + bh); + + if (x >= 0 && x < bw && y >= 0 && y < bh) + { + if (elt.gw_resizable) + { + onTopEdge = y < MARGINS; + onLeftEdge = x < MARGINS; + onRightEdge = x >= (bw - MARGINS); + onBottomEdge = y >= (bh - MARGINS); + + isResizing = onTopEdge || onLeftEdge || onRightEdge || onBottomEdge; + } + else + onTopEdge = onLeftEdge = onRightEdge = onBottomEdge = isResizing = false; + + if ($(id).gw_popup) + th = 0; + else + th = $(id + '-titlebar').offsetHeight; + isMoving = !isResizing && y < (th + MARGINS); + + gw.window.context = { + id: id, + x: b.left + window.scrollX, + y: b.top + window.scrollY, + cx: e.clientX, + cy: e.clientY, + w: b.width, + h: b.height, + isResizing: isResizing, + isMoving: isMoving, + onTopEdge: onTopEdge, + onLeftEdge: onLeftEdge, + onRightEdge: onRightEdge, + onBottomEdge: onBottomEdge + }; + gw.window.animate(); + break; + } + } + }, + + updateGeometry: function(id) + { + var b = $(id).getBoundingClientRect(); + gw.update(id, '#geometry', [ b.left + 'px', b.top + 'px', b.width + 'px', b.height + 'px']); + }, + + onUp: function(e) + { + var c = gw.window.context; + + gw.window.downEvent = undefined; + + if (c && (c.isMoving || c.isResizing)) + { + var id = gw.window.context.id; + gw.window.context = undefined; + gw.window.raise(id, true); + gw.window.updateGeometry(id); + } + }, + + animate: function() + { + var id, elt, c, e, x, y, w, h; + var minWidth; + var minHeight; + + //requestAnimationFrame(gw.window.animate); + + c = gw.window.context; + if (!c) return; + + elt = $(c.id); + minWidth = elt.gw_minw; + minHeight = elt.gw_minh; //$(c.id + '-titlebar').offsetHeight + 2 + elt.gw_minh; + e = gw.window.downEvent; + + if (c && c.isResizing && e) + { + if (c.onRightEdge) + elt.style.width = Math.max(c.w + c.cx - e.clientX, minWidth) + 'px'; + + if (c.onBottomEdge) + elt.style.height = Math.max(c.h + c.cy - e.clientY, minHeight) + 'px'; + + x = c.x; + y = c.y; + + if (c.onLeftEdge) + { + x = c.x + c.cx - e.clientX; + w = c.x + c.w - x; + if (w >= minWidth) + { + elt.style.width = w + 'px'; + //elt.style.left = x + 'px'; + elt.style.transform = 'translate(' + x + 'px,' + y + 'px)'; + //c.x = x; + } + } + + if (c.onTopEdge) + { + y = c.y + c.cy - e.clientY; + h = c.y + c.h - y; + if (h >= minHeight) + { + elt.style.height = h + 'px'; + //elt.style.top = y + 'px'; + elt.style.transform = 'translate(' + x + 'px,' + y + 'px)'; + } + } + + return; + } + + if (c && c.isMoving && e) + { + /*elt.style.left = (Math.max(0, c.x + c.cx - e.clientX)) + 'px'; + elt.style.top = (Math.max(0, c.y + c.cy - e.clientY)) + 'px';*/ + elt.style.transform = 'translate(' + (Math.max(0, c.x + c.cx - e.clientX)) + 'px,' + (Math.max(0, c.y + c.cy - e.clientY)) + 'px)'; + return; + } + + // This code executes when mouse moves without clicking + + if (c.onRightEdge && c.onBottomEdge || c.onLeftEdge && c.onTopEdge) + elt.style.cursor = 'nwse-resize'; + else if (c.onRightEdge && c.onTopEdge || c.onBottomEdge && c.onLeftEdge) + elt.style.cursor = 'nesw-resize'; + else if (c.onRightEdge || c.onLeftEdge) + elt.style.cursor = 'ew-resize'; + else if (c.onBottomEdge || c.onTopEdge) + elt.style.cursor = 'ns-resize'; + else + elt.style.cursor = ''; + } + }, + + menu: + { + hide: function(elt) + { + elt.style.display = 'none'; + setTimeout(function() { elt.style.display = ''; }, 150); + }, + + click: function(name, event) + { + var id = gw.getTargetId(event.target); + gw.update(name, '#click', id); + event.stopPropagation(); + } + }, + + table: + { + select: function(id, row) + { + var elt = $(id); + var tr = $(id + ':' + row); + var current = elt.gw_current; + + if (tr.tagName == 'TR') + { + if (current !== undefined) + { + if (current >= 0) + $(id + ':' + current) && $(id + ':' + current).removeClass('gw-table-row-selected'); + tr.addClass('gw-table-row-selected'); + elt.gw_current = row; + } + else + { + if (tr.hasClass('gw-table-row-selected')) + tr.removeClass('gw-table-row-selected'); + else + tr.addClass('gw-table-row-selected'); + } + } + + gw.update(id, '$' + row, null); + }, + + check: function(id, row) + { + var elt = $(id + ':' + row); + if (event.target.tagName == 'TD') + elt.checked = !elt.checked; + gw.update(id, '!' + row, elt.checked); + event.stopPropagation(); + }, + + toggle: function(id, row) + { + gw.update(id, '?' + row, false); + }, + + onScroll: function(id, more, timeout) + { + var elt = $(id); + var sw = elt.firstChild; + var last = elt.gw_last_scroll; + + if (last && last[0] == sw.scrollLeft && last[1] == sw.scrollTop) + return; + + elt.gw_last_scroll = [sw.scrollLeft, sw.scrollTop]; + + //console.log('onScroll: ' + id + ' ' + sw.scrollLeft + ',' + sw.scrollTop); + + if (more) + { + //if ((sw.scrollHeight - sw.scrollTop) === (sw.clientHeight)) + if (sw.scrollTop >= (sw.scrollHeight - sw.clientHeight - 16)) + { + /*var wait = document.createElement('div'); + wait.className = 'gw-waiting'; + elt.appendChild(wait);*/ + if (elt.gw_scroll) + { + clearTimeout(elt.gw_scroll); + elt.gw_scroll = undefined; + } + + gw.update(id, '#more', [sw.scrollLeft, sw.scrollTop]); + return; + } + } + + if (elt.gw_headerh) + $(elt.gw_headerh).firstChild.scrollLeft = sw.scrollLeft; + + if (elt.gw_headerv) + $(elt.gw_headerv).firstChild.scrollTop = sw.scrollTop; + + if (elt.gw_noscroll) + { + elt.gw_noscroll = undefined; + return; + } + + if (elt.gw_scroll) + clearTimeout(elt.gw_scroll); + + elt.gw_scroll = setTimeout(function() + { + //console.log("gw.table.onScroll: " + id + ": " + sw.scrollLeft + " " + sw.scrollTop); + var pos = [sw.scrollLeft, sw.scrollTop]; + + clearTimeout(elt.gw_scroll); + + gw.update(elt.id, '#scroll', pos, function() + { + elt.gw_scroll = undefined; + if (pos[0] != sw.scrollLeft || pos[1] != sw.scrollTop) + gw.table.onScroll(id, more, timeout); + }); + + //elt.gw_scroll = undefined; + }, timeout || 250); + }, + + scroll: function(id, x, y) + { + var sw = $(id).firstChild + + //console.log("gw.table.scroll: " + id + ": " + x + " " + y); + + if (x != sw.scrollLeft) + { + $(id).gw_noscroll = true; + sw.scrollLeft = x; + } + if (y != sw.scrollTop) + { + $(id).gw_noscroll = true; + sw.scrollTop = y; + } + if (x != sw.scrollLeft || y != sw.scrollTop) + gw.update(id, '#scroll', [sw.scrollLeft, sw.scrollTop]); + }, + + ensureVisible: function(id, row) + { + var sw = $(id).firstChild; + gw.table.scroll(id, sw.scrollLeft, $(id + ':' + row).offsetTop - sw.clientHeight / 2); + } + }, + + scrollview: + { + setHeaders: function(id, hid, vid) + { + $(id).gw_headerh = hid; + $(id).gw_headerv = vid; + } + }, + + file: + { + select: function(id) + { + var elt = $(id + ':file'); + + if ($(id).gw_uploading) + return; + + elt.focus(); + elt.click(); + }, + + finish: function(xhr) + { + if (xhr.gw_progress) + { + setTimeout(function() { gw.file.finish(xhr); }, 250); + return; + } + + gw.update(xhr.gw_id, '#progress', 1, function() { + gw.answer(xhr); + gw.uploads[xhr.gw_id] = undefined; + gw.raise(xhr.gw_id, 'upload', [], true); + xhr.gw_id = undefined; + }); + }, + + upload: function(id) + { + var elt = $(id + ':file'); + var file = elt.files[0]; + var xhr = new XMLHttpRequest(); + var form = new FormData(); + + if (gw.uploads[id]) + return; + + gw.uploads[id] = xhr; + + //gw.log('gw.file.upload: ' + id + ': ' + file.name); + + xhr.gw_progress = 0; + + xhr.gw_progress++; + gw.update(id, '#progress', 0, function() { xhr.gw_progress--; }); + + form.append('file', file); + form.append('name', file.name); + form.append('id', id); + + //xhr.upload.addEventListener("loadstart", loadStartFunction, false); + //xhr.upload.addEventListener("load", transferCompleteFunction, false); + + xhr.upload.addEventListener("progress", + function(e) + { + //console.log('upload: progress ' + e.loaded + ' / ' + e.total); + + if (xhr.gw_id == undefined) + return; + + if (e.lengthComputable) + { + var t = (new Date()).getTime(); + + if ((xhr.gw_time == undefined || (t - xhr.gw_time) > 250) && xhr.gw_progress == 0) + { + xhr.gw_progress++; + gw.update(xhr.gw_id, '#progress', e.loaded / e.total, function() { xhr.gw_progress--; }); + xhr.gw_time = t; + } + } + }, + false); + + xhr.gw_command = ['upload', id]; + xhr.gw_id = id; + + xhr.open("POST", $root + '/u', true); + + xhr.onreadystatechange = function() + { + if (xhr.readyState == 4) + gw.file.finish(xhr); + }; + + xhr.send(form); + }, + + abort: function(id) + { + if (gw.uploads[id]) + gw.uploads[id].abort(); + } + }, + + autocomplete: function(id) + { + new AutoComplete({ + selector: $(id + ':entry'), + cache: false, + source: function(term, response) { + var xhr = $(id).gw_xhr; + if (xhr) + { + try { xhr.abort(); } catch(e) {} + } + + $(id).gw_xhr = xhr = new XMLHttpRequest(); + + xhr.open('GET', $root + '/x?c=' + encodeURIComponent(JSON.stringify(['raise', id, 'completion', [term]])), true); + xhr.onreadystatechange = function() { + if (xhr.readyState == 4) + { + gw.autocompletion = []; + gw.answer(xhr); + response(gw.autocompletion); + } + }; + xhr.send(); + }, + onSelect: function(e, term, item) { + gw.textbox.setText(id, gw.textbox.getText(id)); + } + }); + }, + + textbox: + { + onactivate: function(id, e) + { + gw.log('textbox.onactivate'); + if (e.keyCode == 13) + setTimeout(function() { gw.raise(id, 'activate', [], false); }, 50); + }, + + getText: function(id) + { + return $(id + ':entry').value; + }, + + setText: function(id, text) + { + gw.command(function() { + $(id + ':entry').value = text; + gw.setSelection($(id + ':entry'), [text.length, text.length]); + gw.update(id, 'text', text); + }); + }, + + clear: function(id) + { + gw.textbox.setText(id, ''); + gw.setFocus(id); + gw.raise(id, 'activate', [], false); + } + } +} + diff --git a/comp/src/gb.web.form/.hidden/Uncompressed/style.css b/comp/src/gb.web.form/.hidden/Uncompressed/style.css new file mode 100644 index 00000000..0e8fbb86 --- /dev/null +++ b/comp/src/gb.web.form/.hidden/Uncompressed/style.css @@ -0,0 +1,732 @@ +HTML, BODY { + margin: 0; + padding: 0; + height: 100%; + width: 100%; +} + +HTML, BODY, DIV, INPUT { + box-sizing: border-box; +} + +SELECT { + min-height: 2em; + font-size: inherit; +} + +INPUT { + font: inherit; +} + +H1,H2,H3,P { + margin-top: 0.5rem; + margin-bottom: 0.25rem; +} + +/*UL, OL { + padding-left: 2em; + margin-bottom: 0; +} + +P:first-child,UL:first-child,OL:first-child { + margin-top: 0; +}*/ + +.gw-button { + padding: 0; + font: inherit; + padding: 0.125em 0.25em; + min-height: 2em; +} + +.gw-button.gw-noborder { + border: solid 1px transparent; + background: none; + padding: 0; +} + +.gw-button.gw-noborder:hover { + border: solid 1px #C0C0C0; +} + +.gw-button-image { + margin-right: 0.5em; +} + +.gw-button > DIV { + vertical-align: middle; + position: relative; + display: inline-flex; + justify-content: center; + align-items: center; + flex-flow: row; +} + +.gw-button > DIV > SPAN { + display: inline-block; +} + +.gw-tab-header { + margin-bottom: -1px; + z-index: 1; + line-height: 2em; +} + +.gw-tab-header.gw-noborder { + margin-bottom: 0; +} + +.gw-tab { + color: gray; + padding: 0 0.5em; + cursor: pointer; + border-top: solid transparent 1px; + border-right: solid transparent 1px; + border-left: solid transparent 1px; +} + +.gw-tab:hover { + color: black; +} + +.gw-tab-selected { + padding: 0 0.5em; + border-left: solid #C0C0C0 1px; + border-top: solid #C0C0C0 1px; + border-right: solid #C0C0C0 1px; + border-top-left-radius: 0.5em; + border-top-right-radius: 0.5em; + background: white; +} + +.gw-tab-header.gw-noborder > div { + border: none; +} + +.gw-tab-contents { + border: solid #C0C0C0 1px; + flex-grow: 1; + display: flex; + flex-flow: column; +} + +.gw-tab-contents > DIV { + flex-grow: 1; +} + +.gw-tab-contents.gw-noborder { + border: none; +} + +.gw-checkbox,.gw-radiobutton { + display: flex; + flex-flow: row; + min-height: 2em; +} + +.gw-checkbox-label,.gw-radiobutton-label { + display: flex; + flex-flow: row; + align-items: center; +} + +.gw-checkbox.gw-disabled > .gw-checkbox-label { + opacity: 0.5; +} + +.gw-radiobutton.gw-disabled > .gw-checkbox-label { + opacity: 0.5; +} + +.gw-checkbox-toggle,.gw-radiobutton-toggle { + margin: 0; + margin-right: 0.5em; +} + +.gw-textbox { + min-height: 2em; + /*box-sizing: border-box; firefox bug on refresh !*/ + padding: 0 0.25em; +} + +.gw-textbox.gw-noborder { + border: none; +} + +.gw-combobox { + display: inline-block; + position: relative; + min-height: 2em; +} + +.gw-combobox SELECT { + height: 100%; + z-index: 1; + opacity: 0; + float: right; +} + +.gw-combobox INPUT { + width: 100%; + min-height: 2em; + box-sizing: border-box; + padding: 0 2.25em 0 0.25em; + vertical-align: middle; +} + +.gw-combobox.gw-noborder INPUT { + border: none; +} + +.gw-combobox-arrow { + display: inline-block; + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAI0lEQVQYlWNgoAZoYGBg+I8DN+BT1MCABhrwSSIrwilJHgAAbCcP9dwIQGIAAAAASUVORK5CYII='); + background-position: center; + background-repeat: no-repeat; + height: 2rem; + width: 2rem; + margin-left: -2rem; + /*pointer-events: none;*/ + vertical-align: middle; + border: none; + overflow: hidden; +} + +.gw-selectbox { + display: inline-block; + position: relative; + min-height: 2em; +} + +.gw-selectbox SELECT { + width: 100%; + height: 100%; +} + +.gw-selectbox.gw-noborder SELECT { + border: none; +} + +.gw-window-container { +} + +.gw-window { + position: fixed; + top: 0; + left: 0; + border: solid 1px white; + box-shadow: 0 0 0.5em black; + border-radius: 0.5em; + background: white; + z-index: 10; + overflow: hidden; +} + +.gw-popup { + border: solid 1px #C0C0C0; + border-radius: 0; + box-shadow: none; +} + +.gw-window-titlebar { + display: flex; + flex-flow: row; + background: #2980B9; + font-weight: bold; + border-top-left-radius: 0.5em; + border-top-right-radius: 0.5em; + padding: 0.25em; +} + +.gw-window-titlebar.gw-deactivated { + background: white; +} + +.gw-window-title { + flex-grow: 1; + color: white; + padding: 0 1em; + pointer-events: none; +} + +.gw-window-titlebar.gw-deactivated > DIV.gw-window-title { + color: gray; +} + +.gw-window-button { + width: 1.5em; + height: 1.5em; + padding: 0; + display: inline-flex; + justify-content: center; +} + +.gw-window-button > IMG { + width: 0.8em; + height: 0.8em; + margin: auto; +} + +/*@-moz-document url-prefix() { + .gw-window-button { + display: inline-flex; + }; +}*/ + +.gw-window-contents { + display: flex; + flex-flow: column; + flex-grow: 1; + padding: 0.5em; +} + +.gw-popup > .gw-window-contents { + padding: 0; +} + + +.gw-label { + display: flex; + align-items: center; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.gw-label.gw-disabled { + opacity: 0.5; +} + +#gw-modal { + display: none; + position: fixed; + left: 0; + right: 0; + width: 100%; + height: 100%; + background: black; + opacity: 0.05; +} + +.gw-textarea { + font: inherit; + resize: none; +} + +.gw-textarea.gw-noborder { + border: none; +} + + +.gw-menu-title { + display: inline-table; + padding: 0.5em; + padding-top: 0.25em; + cursor: default; + border-top: solid 1px transparent; + border-left: solid 1px transparent; + border-right: solid 1px transparent; + /*margin-top: 0.25em; + margin-bottom: 0.25em;*/ +} + +.gw-menu:hover > .gw-menu-title { + border-top: solid 1px #C0C0C0; + border-left: solid 1px #C0C0C0; + border-right: solid 1px #C0C0C0; + box-shadow: 0 0 0.25em #C0C0C0; + background: white; + z-index: 1002; +} + +.gw-submenu { + display: none; + position: absolute; + border: solid 1px #C0C0C0; + background: white; + box-shadow: 0 0.125em 0.25em #C0C0C0; + margin-top: -0.25em; + z-index: 1003; +} + +.gw-menuitem > .gw-menu > .gw-submenu { + margin-top: 0; + top: 0; + left: 100%; +} + +.gw-menu:hover > .gw-submenu { + display: table; +} + +.gw-menu-tape { + display: none; + position: relative; + background: white; + z-index: 1004; + height: 4px; + margin-top: -4px; + margin-left: 1px; + margin-right: 1px; + top: -2px; +} + +.gw-menu:hover > .gw-menu-tape { + display: block; +} + +.gw-submenu > div:hover { + background: #E0E0E0; +} + +.gw-menuitem { + display: flex; + flex-flow: column; +} + +.gw-menuitem > div { + display: table-cell !important; + vertical-align: middle; +} + +.gw-menuitem-text { + flex-grow: 1; + padding: 0.125em 0.25em; + white-space: nowrap; +} + +.gw-menuitem-icon { + padding: 0.125em 0.25em; +} + +.gw-menuitem-icon > IMG { + vertical-align: middle; +} + +.gw-menuitem-shortcut { + text-align: right; + padding: 0.125em 1em; +} + +.gw-separator { + position: relative; + padding: 0 !important; + pointer-events: none; +} + +.gw-separator-hline { + position: absolute; + display: flex; + flex-flow: row; + align-items: center; + height: inherit; + width: 100%; +} + +.gw-separator-hline > div { + height: 1px; + width: 100%; + background: #C0C0C0; +} + +.gw-separator-vline { + position: absolute; + display: flex; + flex-flow: column; + align-items: center; + height: 100%; + width: inherit; +} + +.gw-separator-vline > div { + width: 1px; + height: 100%; + background: #C0C0C0; +} + +.gw-submenu > div { + display: flex !important; + cursor: default; + padding: 0.25em 1em; + margin: 0; +} + +.gw-submenu > .gw-menuitem { + display: table-row !important; + table-layout: fixed; + cursor: default; + padding: 0; + margin: 0; +} + +.gw-submenu > .gw-separator { + display: table-row !important; + cursor: default; + margin: 0; + width: auto; + height: 1em; +} + +.gw-menuitem > .gw-menu { + display: table-cell !important; + position: relative; + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAJElEQVQYlWNgQIAGBgLgPyFF/wkp+o9NERMhe0m2AqckAy5JALuADHot/KmNAAAAAElFTkSuQmCC'); + background-position: center; + background-repeat: no-repeat; + width: 1em; +} + +.gw-spinbox { + min-height: 2em; + padding: 0 0.25em; +} + +.gw-spinbox.gw-noborder { + border: none; +} + +.gw-expander-header + DIV { + margin-top: 0.5em; +} + +.gw-expander-header > IMG { + vertical-align: middle; +} + +.gw-expander-header > DIV { + display: inline-table; + vertical-align: middle; +} + +.gw-expander-border { + border: solid 1px #C0C0C0; + padding: 0.5em; +} + +.gw-table { + position: relative; + min-height: 4em; + border: solid 1px #C0C0C0; + cursor: default; +} + +.gw-table.gw-noborder { + border: none; +} + +/*.gw-table-header { + height: 1.5em; + background-color: yellow; +}*/ + +.gw-table-contents { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + overflow: auto; +} + +.gw-table > DIV > TABLE { + border-collapse: collapse; +} + +.gw-table > DIV > TABLE > THEAD > TR > TH { + text-align: left; + background-color: #E0E0E0; + padding: 0.25em 0.5em; + vertical-align: top; + border-bottom: solid 1px #C0C0C0; +} + +.gw-table > DIV > TABLE > THEAD > TR > TH:last-child { + border-right: none; +} + +.gw-table > DIV > TABLE > TBODY > TR > TD { + /*border-right: solid 1px #C0C0C0;*/ + padding: 0.1em 0.5em; + vertical-align: top; +} + +/*.gw-table > DIV > TABLE > TBODY > TR > TD:last-child { + border-right: none; +} + +.gw-table > DIV > TABLE > TBODY > TR:last-child > TD { + border-bottom: solid 1px #C0C0C0; +}*/ + +.gw-table > DIV > TABLE > TBODY > TR:nth-child(even) { + background-color: #F0F0F0; +} + +.gw-table-more { + position: absolute; + padding-left: 4px; +} + +.gw-waiting { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-image: url('//gw-waiting.gif'); + background-position: center; + background-repeat: no-repeat; +} + +.gw-scrollview { + position: relative; +} + +.gw-scrollview > DIV { + position: absolute !important; + overflow: auto; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.gw-datebox { + position: relative; + display: inline-block; + min-height: 2em; +} + +.gw-datebox INPUT { + width: 100%; + min-height: 2em; + box-sizing: border-box; + padding: 0 2.25em 0 0.25em; + vertical-align: middle; +} + +.gw-datebox.gw-noborder INPUT { + border: none; +} + +TABLE.gw-calendar { + width: 100%; +} + +TABLE.gw-calendar > TBODY > TR > TH { + padding: 0.25em 0.5em; + background: #E0E0E0; +} + +TABLE.gw-calendar > TBODY > TR > TD { + padding: 0.25em 0.5em; + text-align: center; + cursor: pointer; + border: solid 1px transparent; +} + +TABLE.gw-calendar > TBODY > TR > TD:hover { + outline: solid 1px #C0C0C0; +} + +TABLE.gw-calendar > TBODY > TR > TD.gw-date-disabled { + color: #C0C0C0; +} + +TABLE.gw-calendar > TBODY > TR > TD.gw-date-today { + font-weight: bold; + border: solid 1px black; +} + +TABLE.gw-calendar > TBODY > TR > TD.gw-date-current { + background-color: #2980B9; + color: white; +} + +.gw-file-input { + position: absolute; + left: -2000px; +} + +.gw-progressbar { + position: relative; + border: solid 1px #C0C0C0; + min-height: 0.5em; + border-radius: 0.25em; +} + +.gw-progressbar.gw-noborder { + border: solid 1px transparent; +} + +.gw-progressbar-bar { + position: absolute; + height: 100%; + background: #C0C0C0; + border: solid 1px white; + border-radius: 0.25em; + z-index: -1; +} + +.gw-progressbar-label { + position: absolute; + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; +} + +.gw-form { + flex-grow: 1; +} + +.gw-image { + border: solid 1px #C0C0C0; + box-sizing: border-box; +} + +.gw-image.gw-noborder { + border: none; +} + +.gw-table-row-selected { + background-color: #2980B9 !important; + color: white !important; +} + +.gw-ac-suggestions { + text-align: left; + cursor: default; + border: 1px solid #C0C0C0; + border-top: 0; + background: white; + /*box-shadow: -1px 1px 3px rgba(0,0,0,.1);*/ + + /* core styles should not be changed */ + position: absolute; + display: none; + z-index: 9999; + max-height: 12em; + overflow: hidden; + overflow-y: auto; + box-sizing: border-box; +} + +.gw-ac-suggestion { + position: relative; + padding: 0 0.5em; + line-height: 1.5em; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.gw-ac-suggestion b { + font-weight: normal; + color: #2980B9; +} + +.gw-ac-suggestion.selected { + background: #E0E0E0; +} diff --git a/comp/src/gb.web.form/.hidden/calendar.js b/comp/src/gb.web.form/.hidden/calendar.js new file mode 100644 index 00000000..e07da523 --- /dev/null +++ b/comp/src/gb.web.form/.hidden/calendar.js @@ -0,0 +1,1577 @@ + +function getAbsoluteParent(obj) +{ + for(;;) + { + obj = obj.offsetParent; + if (obj == null) + break; + if (obj.style.position == 'absolute') + break; + } + + return obj; +} + +function __getIEVersion() { + var rv = -1; // Return value assumes failure. + if (navigator.appName == 'Microsoft Internet Explorer') { + var ua = navigator.userAgent; + var re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})"); + if (re.exec(ua) != null) + rv = parseFloat(RegExp.$1); + } + return rv; +} + +function __getOperaVersion() { + var rv = 0; // Default value + if (window.opera) { + var sver = window.opera.version(); + rv = parseFloat(sver); + } + return rv; +} + +var __userAgent = navigator.userAgent; +var __isIE = navigator.appVersion.match(/MSIE/) != null; +var __IEVersion = __getIEVersion(); +var __isIENew = __isIE && __IEVersion >= 8; +var __isIEOld = __isIE && !__isIENew; + +var __isFireFox = __userAgent.match(/firefox/i) != null; +var __isFireFoxOld = __isFireFox && ((__userAgent.match(/firefox\/2./i) != null) || + (__userAgent.match(/firefox\/1./i) != null)); +var __isFireFoxNew = __isFireFox && !__isFireFoxOld; + +var __isWebKit = navigator.appVersion.match(/WebKit/) != null; +var __isChrome = window.chrome != null; +var __isOpera = window.opera != null; +var __operaVersion = __getOperaVersion(); +var __isOperaOld = __isOpera && (__operaVersion < 10); + +function __parseBorderWidth(width) { + var res = 0; + if (typeof(width) == "string" && width != null && width != "" ) { + var p = width.indexOf("px"); + if (p >= 0) { + res = parseInt(width.substring(0, p)); + } + else { + //do not know how to calculate other values + //(such as 0.5em or 0.1cm) correctly now + //so just set the width to 1 pixel + res = 1; + } + } + return res; +} + +//returns border width for some element +function __getBorderWidth(element) { + var res = new Object(); + res.left = 0; res.top = 0; res.right = 0; res.bottom = 0; + if (window.getComputedStyle) { + //for Firefox + var elStyle = window.getComputedStyle(element, null); + res.left = parseInt(elStyle.borderLeftWidth.slice(0, -2)); + res.top = parseInt(elStyle.borderTopWidth.slice(0, -2)); + res.right = parseInt(elStyle.borderRightWidth.slice(0, -2)); + res.bottom = parseInt(elStyle.borderBottomWidth.slice(0, -2)); + } + else { + //for other browsers + res.left = __parseBorderWidth(element.style.borderLeftWidth); + res.top = __parseBorderWidth(element.style.borderTopWidth); + res.right = __parseBorderWidth(element.style.borderRightWidth); + res.bottom = __parseBorderWidth(element.style.borderBottomWidth); + } + + return res; +} + +//returns the absolute position of some element within document +function getElementAbsolutePos(element) { + var res = new Object(); + res.x = 0; res.y = 0; + + if (element !== null) { + if (element.getBoundingClientRect) { + var viewportElement = document.documentElement; + var box = element.getBoundingClientRect(); + var scrollLeft = viewportElement.scrollLeft; + var scrollTop = viewportElement.scrollTop; + + res.x = box.left + scrollLeft; + res.y = box.top + scrollTop; + + } + else { //for old browsers + res.x = element.offsetLeft; + res.y = element.offsetTop; + + var parentNode = element.parentNode; + var borderWidth = null; + var offsetParent = element.offsetParent; + + while (offsetParent != null) { + res.x += offsetParent.offsetLeft; + res.y += offsetParent.offsetTop; + + var parentTagName = + offsetParent.tagName.toLowerCase(); + + if ((__isIEOld && parentTagName != "table") || + ((__isFireFoxNew || __isChrome) && + parentTagName == "td")) { + borderWidth = kGetBorderWidth + (offsetParent); + res.x += borderWidth.left; + res.y += borderWidth.top; + } + + if (offsetParent != document.body && + offsetParent != document.documentElement) { + res.x -= offsetParent.scrollLeft; + res.y -= offsetParent.scrollTop; + } + + + //next lines are necessary to fix the problem + //with offsetParent + if (!__isIE && !__isOperaOld || __isIENew) { + while (offsetParent != parentNode && + parentNode !== null) { + res.x -= parentNode.scrollLeft; + res.y -= parentNode.scrollTop; + if (__isFireFoxOld || __isWebKit) + { + borderWidth = + kGetBorderWidth(parentNode); + res.x += borderWidth.left; + res.y += borderWidth.top; + } + parentNode = parentNode.parentNode; + } + } + + if (offsetParent.style.position == 'absolute') + break; + parentNode = offsetParent.parentNode; + offsetParent = offsetParent.offsetParent; + } + } + } + return res; +} + + +function getLeftPos(obj) +{ + return getElementAbsolutePos(obj).x +} + +function getTopPos(obj) +{ + return getElementAbsolutePos(obj).y +} + +function moveElementUnder(obj, under, dx, dy, right) +{ + var pos, opos, x, y; + var absUnder, absObj; + + pos = getElementAbsolutePos(under); + + obj.style.position = 'absolute'; + obj.style.left = '0'; + obj.style.top = '0'; + + opos = getElementAbsolutePos(obj); + + x = pos.x - opos.x + dx; //- getLeftPos(under.offsetParent); + y = pos.y - opos.y + under.offsetHeight + dy; //- getTopPos(under.offsetParent); + + if (right) + x -= obj.offsetWidth - under.offsetWidth; + + obj.style.left = x + 'px'; + obj.style.top = y + 'px'; +} + +/************************************************************************************************************ +JS Calendar +Copyright (C) September 2006 DTHMLGoodies.com, Alf Magne Kalleland + +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 2.1 of the License, or (at your option) any later version. + +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 +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Dhtmlgoodies.com., hereby disclaims all copyright interest in this script +written by Alf Magne Kalleland. + +Alf Magne Kalleland, 2006 +Owner of DHTMLgoodies.com + +************************************************************************************************************/ + +var turnOffYearSpan = false; // true = Only show This Year and Next, false = show +/- 5 years +var weekStartsOnSunday = false; // true = Start the week on Sunday, false = start the week on Monday +var showWeekNumber = true; // true = show week number, false = do not show week number + +var calendar_display_time = true; + +// Format of current day at the bottom of the calendar +// [todayString] = the value of todayString +// [dayString] = day of week (example: mon, tue, wed...) +// [UCFdayString] = day of week (example: Mon, Tue, Wed...) ( First letter in uppercase) +// [day] = Day of month, 1..31 +// [monthString] = Name of current month +// [year] = Current year +var todayStringFormat = '[todayString] [UCFdayString]. [day] [monthString] [year]'; +var pathToImages = $root; // Relative to your HTML file + +var speedOfSelectBoxSliding = 50; // Milliseconds between changing year and hour when holding mouse over "-" and "+" - lower value = faster +var intervalSelectBox_minutes = 5; // Minute select box - interval between each option (5 = default) + +var calendar_offsetTop = 3; // Offset - calendar placement - You probably have to modify this value if you're not using a strict doctype +var calendar_offsetLeft = 4; // Offset - calendar placement - You probably have to modify this value if you're not using a strict doctype +var calendarDiv; +var must_submit = false; + +var MSIE = false; +var Opera = false; +//if(navigator.userAgent.indexOf('MSIE')>=0 && navigator.userAgent.indexOf('Opera')<0)MSIE=true; +if(navigator.userAgent.indexOf('Opera')>=0)Opera=true; + +var monthArray = ['Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Août','Septembre','Octobre','Novembre','Décembre']; +var monthArrayShort = ['Jan','Fév','Mar','Avr','Mai','Jun','Jul','Aoû','Sep','Oct','Nov','Déc']; +var dayArray = ['Lun','Mar','Mer','Jeu','Ven','Sam','Dim']; +var weekString = 'Sem'; +var todayString = ""; + + +if (weekStartsOnSunday) { + var tempDayName = dayArray[6]; + for(var theIx = 6; theIx > 0; theIx--) { + dayArray[theIx] = dayArray[theIx-1]; + } + dayArray[0] = tempDayName; +} + +var daysInMonthArray = [31,28,31,30,31,30,31,31,30,31,30,31]; +var currentMonth; +var currentYear; +var currentHour; +var currentMinute; +var calendarContentDiv; +var returnDateTo; +var returnFormat; +var activeSelectBoxMonth; +var activeSelectBoxYear; +var activeSelectBoxHour; +var activeSelectBoxMinute; + +var iframeObj = false; +//// fix for EI frame problem on time dropdowns 09/30/2006 +var iframeObj2 =false; + +function EIS_FIX_EI1(where2fixit) +{ + if (!iframeObj2) + return; + iframeObj2.style.display = 'block'; + iframeObj2.style.height = $(where2fixit).offsetHeight+1; + iframeObj2.style.width= $(where2fixit).offsetWidth; + iframeObj2.style.left=getLeftPos($(where2fixit))+1-calendar_offsetLeft; + iframeObj2.style.top=getTopPos($(where2fixit))-$(where2fixit).offsetHeight-calendar_offsetTop; +} + +function EIS_Hide_Frame() +{ + if(iframeObj2) + iframeObj2.style.display = 'none'; +} + +//// fix for EI frame problem on time dropdowns 09/30/2006 +var returnDateToYear; +var returnDateToMonth; +var returnDateToDay; +var returnDateToHour; +var returnDateToMinute; + +var inputYear; +var inputMonth; +var inputDay; +var inputHour; +var inputMinute; +var calendarDisplayTime = false; + +var selectBoxHighlightColor = '#FF0000'; // Highlight color of select boxes +var selectBoxRolloverBgColor = '#F0F0F0'; // Background color on drop down lists(rollover) + +var selectBoxMovementInProgress = false; +var activeSelectBox = false; + +function cancelCalendarEvent() +{ + return false; +} + +function isLeapYear(inputYear) +{ + return inputYear % 400 == 0 || (inputYear % 4 == 0 && inputYear % 100 != 0); +} + +var activeSelectBoxMonth = false; +var activeSelectBoxDirection = false; + +function selectElt(elt, value) +{ + elt.style.fontWeight = value ? 'bold' : ''; +} + +function scrollMonthYear() +{ + activeSelectBox = this; + + if (this.id.indexOf('UpDiv') >= 0 || this.id.indexOf('DownDiv') >= 0) + { + //if (this.className=='monthYearActive') + selectBoxMovementInProgress = true; + //else + // selectBoxMovementInProgress = false; + + if (this.id.indexOf('UpDiv') >=0 ) + activeSelectBoxDirection = -1; + else + activeSelectBoxDirection = 1; + setTimeout(slideCalendarSelectBox, speedOfSelectBoxSliding); + } + else + selectBoxMovementInProgress = false; +} + +function showMonthDropDown() +{ + if($('monthDropDown').style.display=='block'){ + $('monthDropDown').style.display='none'; + //// fix for EI frame problem on time dropdowns 09/30/2006 + EIS_Hide_Frame(); + }else{ + $('monthDropDown').style.display='block'; + $('yearDropDown').style.display='none'; + $('hourDropDown').style.display='none'; + $('minuteDropDown').style.display='none'; + if (MSIE) + { EIS_FIX_EI1('monthDropDown')} + //// fix for EI frame problem on time dropdowns 09/30/2006 + } +} + +function showYearDropDown() +{ + if($('yearDropDown').style.display=='block'){ + $('yearDropDown').style.display='none'; + //// fix for EI frame problem on time dropdowns 09/30/2006 + EIS_Hide_Frame(); + }else{ + $('yearDropDown').style.display='block'; + $('monthDropDown').style.display='none'; + $('hourDropDown').style.display='none'; + $('minuteDropDown').style.display='none'; + if (MSIE) + { EIS_FIX_EI1('yearDropDown')} + //// fix for EI frame problem on time dropdowns 09/30/2006 + + } + +} +function showHourDropDown() +{ + if($('hourDropDown').style.display=='block'){ + $('hourDropDown').style.display='none'; + //// fix for EI frame problem on time dropdowns 09/30/2006 + EIS_Hide_Frame(); + }else{ + $('hourDropDown').style.display='block'; + $('monthDropDown').style.display='none'; + $('yearDropDown').style.display='none'; + $('minuteDropDown').style.display='none'; + if (MSIE) + { EIS_FIX_EI1('hourDropDown')} + //// fix for EI frame problem on time dropdowns 09/30/2006 + } + +} +function showMinuteDropDown() +{ + if($('minuteDropDown').style.display=='block'){ + $('minuteDropDown').style.display='none'; + //// fix for EI frame problem on time dropdowns 09/30/2006 + EIS_Hide_Frame(); + }else{ + $('minuteDropDown').style.display='block'; + $('monthDropDown').style.display='none'; + $('yearDropDown').style.display='none'; + $('hourDropDown').style.display='none'; + if (MSIE) + { EIS_FIX_EI1('minuteDropDown')} + //// fix for EI frame problem on time dropdowns 09/30/2006 + } + +} + +function selectMonth() +{ + var elt; + + $('calendar_month_txt').innerHTML = this.innerHTML + currentMonth = this.id.replace(/[^\d]/g,''); + + $('monthDropDown').style.display='none'; + //// fix for EI frame problem on time dropdowns 09/30/2006 + EIS_Hide_Frame(); + for(var no=0;no=0){ + currentMonth=currentMonth-1;; + if(currentMonth<0){ + currentMonth=11; + currentYear=currentYear-1; + } + }else{ + currentMonth=currentMonth+1;; + if(currentMonth>11){ + currentMonth=0; + currentYear=currentYear/1+1; + } + } + + updateMonthDiv(); + writeCalendarContent(); +} + +function createMonthDiv(){ + var div = document.createElement('DIV'); + div.className='monthYearPicker'; + div.id = 'monthPicker'; + + for(var no=0;no=0){ + var startYear = yearItems[1].innerHTML/1 -1; + if(activeSelectBoxYear) + selectElt(activeSelectBoxYear, false); + }else{ + var startYear = yearItems[1].innerHTML/1 +1; + if(activeSelectBoxYear) + selectElt(activeSelectBoxYear, false); + } + + for(var no=1;no= 0) + { + var startHour = hourItems[1].innerHTML/1 - 1; + if(startHour < 0) startHour = 0; + } + else + { + var startHour = hourItems[1].innerHTML/1 + 1; + if(startHour >14 ) startHour = 14; + } + + if(activeSelectBoxHour) + selectElt(activeSelectBoxHour, false); + + for (var no = 1; no < (hourItems.length - 1); no++) + { + hourItems[no].innerHTML = padleft(startHour+no-1, '00'); + hourItems[no].id = 'hourDiv' + padleft(startHour+no-1, '00'); + } + + if (activeSelectBoxHour) + { + selectElt(activeSelectBoxHour, false); + if ($('hourDiv'+currentHour)) + { + activeSelectBoxHour = $('hourDiv' + currentHour); + selectElt(activeSelectBoxHour, true); + } + } +} + +function updateYearDiv() +{ + var yearSpan = 5; + if (turnOffYearSpan) { + yearSpan = 0; + } + var div = $('yearDropDown'); + var yearItems = div.getElementsByTagName('DIV'); + for(var no=1;no'; + subDiv.onclick = changeSelectBoxYear; + subDiv.onmouseover = scrollMonthYear; + subDiv.onmouseout = function(){ selectBoxMovementInProgress = false;}; + subDiv.onselectstart = cancelCalendarEvent; + div.appendChild(subDiv); + } else { + startYear = d.getFullYear()/1 - 0; + yearSpan = 2; + } + + for(var no=startYear;no<(startYear+yearSpan);no++){ + var subDiv = document.createElement('DIV'); + subDiv.innerHTML = no; + //subDiv.onmouseover = scrollMonthYear; + //subDiv.onmouseout = scrollMonthYear; + subDiv.onclick = selectYear; + subDiv.id = 'yearDiv' + no; + subDiv.onselectstart = cancelCalendarEvent; + div.appendChild(subDiv); + if(currentYear && currentYear==no){ + selectElt(subDiv, true); + activeSelectBoxYear = subDiv; + } + } + if (! turnOffYearSpan) { + var subDiv = document.createElement('DIV'); + subDiv.id = 'yearDownDiv'; + subDiv.style.height = "13px"; + subDiv.innerHTML = ''; + subDiv.onclick = changeSelectBoxYear; + subDiv.onmouseover = scrollMonthYear; + subDiv.onmouseout = function(){ selectBoxMovementInProgress = false;}; + subDiv.onselectstart = cancelCalendarEvent; + div.appendChild(subDiv); + } + return div; +} + +/* This function creates the hour div at the bottom bar */ + +function slideCalendarSelectBox() +{ + if(selectBoxMovementInProgress){ + if(activeSelectBox.parentNode.id=='hourDropDown') + changeSelectBoxHour(false,activeSelectBox); + else if(activeSelectBox.parentNode.id=='yearDropDown') + changeSelectBoxYear(false,activeSelectBox); + setTimeout(slideCalendarSelectBox, speedOfSelectBoxSliding); + } +} + +function createHourDiv() +{ + if(!$('hourDropDown')){ + var div = document.createElement('DIV'); + div.className='monthYearPicker'; + }else{ + var div = $('hourDropDown'); + var subDivs = div.getElementsByTagName('DIV'); + for(var no=0;no14)startHour=14; + + var subDiv = document.createElement('DIV'); + //subDiv.innerHTML = '  - '; + subDiv.style.height = '13px'; + subDiv.id = 'hourUpDiv'; + subDiv.innerHTML = ''; + subDiv.onclick = changeSelectBoxHour; + subDiv.onmouseover = scrollMonthYear; + subDiv.onmouseout = function(){ selectBoxMovementInProgress = false;}; + subDiv.onselectstart = cancelCalendarEvent; + div.appendChild(subDiv); + + for(var no=startHour;no'; + //subDiv.innerHTML = '  + '; + subDiv.onclick = changeSelectBoxHour; + subDiv.onmouseover = scrollMonthYear; + subDiv.onmouseout = function(){ selectBoxMovementInProgress = false;}; + subDiv.onselectstart = cancelCalendarEvent; + div.appendChild(subDiv); + + return div; +} +/* This function creates the minute div at the bottom bar */ + +function createMinuteDiv() +{ + if(!$('minuteDropDown')){ + var div = document.createElement('DIV'); + div.className='monthYearPicker'; + }else{ + var div = $('minuteDropDown'); + var subDivs = div.getElementsByTagName('DIV'); + for(var no=0;no0){ + calendarContentDiv.removeChild(existingTable[0]); + } + + var calTable = document.createElement('TABLE'); + calTable.width = '100%'; + calTable.cellSpacing = '0'; + calendarContentDiv.appendChild(calTable); + + var calTBody = document.createElement('TBODY'); + calTable.appendChild(calTBody); + var row = calTBody.insertRow(-1); + row.className = 'calendar_week_row'; + if (showWeekNumber) + { + var cell = row.insertCell(-1); + cell.innerHTML = weekString; + cell.className = 'calendar_week_column'; + cell.style.backgroundColor = selectBoxRolloverBgColor; + } + + for(var no=0;no0 && colCounter%7==0){ + var row = calTBody.insertRow(-1); + if (showWeekNumber) { + var cell = row.insertCell(-1); + cell.className = 'calendar_week_column'; + var week = getWeek(currentYear,currentMonth,no); + cell.innerHTML = week; // Week + cell.style.backgroundColor = selectBoxRolloverBgColor; + } + } + var cell = row.insertCell(-1); + if(currentYear==inputYear && currentMonth == inputMonth && no==inputDay) + cell.className='activeDay'; + else + cell.className='normalDay'; + cell.innerHTML = no; + if (calendarDisplayTime) + cell.onclick = setDate; + else + cell.onclick = pickDate; + colCounter++; + } + + if(!document.all){ + if(calendarContentDiv.offsetHeight) + $('topBar').style.top = calendarContentDiv.offsetHeight + $('timeBar').offsetHeight + $('topBar').offsetHeight -1 + 'px'; + else{ + $('topBar').style.top = ''; + $('topBar').style.bottom = '0px'; + } + + } + + if(iframeObj){ + if(!calendarContentDivExists)setTimeout('resizeIframe()',350);else setTimeout('resizeIframe()',10); + } +} + +function resizeIframe() +{ + iframeObj.style.width = calendarDiv.offsetWidth + 'px'; + iframeObj.style.height = calendarDiv.offsetHeight + 'px' ; +} + +function pickTodaysDate(n) +{ + var d = new Date(); + if (n !== undefined) + d.setDate(d.getDate() + n); + + currentMonth = d.getMonth(); + currentYear = d.getFullYear(); + inputDay = d.getDate(); + pickDate(null, inputDay); +} + +function setDate(e, day) +{ + inputDay = this.innerHTML; + inputMonth = currentMonth; + inputYear = currentYear; + writeCalendarContent(); +} + +function pickDate(e, day) +{ + var month; + + month = currentMonth/1 + 1; + if (month < 10) + month = '0' + month; + + if (!day && this && this.innerHTML) + day = this.innerHTML; + else + day = inputDay/1; + + if (day/1 < 10) + day = '0' + day; + + if (returnFormat) + { + returnFormat = returnFormat.replace('dd',day); + returnFormat = returnFormat.replace('mm',month); + returnFormat = returnFormat.replace('yyyy',currentYear); + returnFormat = returnFormat.replace('hh',currentHour); + returnFormat = returnFormat.replace('nn',currentMinute); + returnFormat = returnFormat.replace('d',day/1); + returnFormat = returnFormat.replace('m',month/1); + + returnDateTo.value = returnFormat; + } + else + { + for(var no=0;no= 0 ? 1 : 0)) + 'px'; + //calendarDiv.style.top = (getTopPos(inputObj), calendarDiv) + 'px'; + moveElementUnder(calendarDiv, inputObj, 0, 0); + if(iframeObj){ + iframeObj.style.left = calendarDiv.style.left; + iframeObj.style.top = calendarDiv.style.top; + //// fix for EI frame problem on time dropdowns 09/30/2006 + iframeObj2.style.left = calendarDiv.style.left; + iframeObj2.style.top = calendarDiv.style.top; + } + +} + +function initCalendar() +{ + if(MSIE){ + iframeObj = document.createElement('IFRAME'); + iframeObj.style.filter = 'alpha(opacity=0)'; + iframeObj.style.position = 'absolute'; + iframeObj.border='0px'; + iframeObj.style.border = '0px'; + iframeObj.style.backgroundColor = '#FF0000'; + //// fix for EI frame problem on time dropdowns 09/30/2006 + iframeObj2 = document.createElement('IFRAME'); + iframeObj2.style.position = 'absolute'; + iframeObj2.border='0px'; + iframeObj2.style.border = '0px'; + iframeObj2.style.height = '1px'; + iframeObj2.style.width = '1px'; + //// fix for EI frame problem on time dropdowns 09/30/2006 + // Added fixed for HTTPS + iframeObj2.src = 'blank.html'; + iframeObj.src = 'blank.html'; + document.body.appendChild(iframeObj2); // gfb move this down AFTER the .src is set + document.body.appendChild(iframeObj); + } + + calendarDiv = $("calendarDiv"); + if (calendarDiv == null) + { + calendarDiv = document.createElement('div'); + calendarDiv.id = 'calendarDiv'; + document.getElementsByTagName("body")[0].appendChild(calendarDiv); + } + + writeBottomBar(); + writeTopBar(); + + /*if(!currentYear){ + var d = new Date(); + currentMonth = d.getMonth(); + currentYear = d.getFullYear(); + }*/ + + writeCalendarContent(); +} + +function setTimeProperties() +{ + if (!calendarDisplayTime) + { + $('timeBar').style.display='none'; + $('timeBar').style.visibility='hidden'; + //$('todaysDateString').style.width = '100%'; + $('dayPlus1').style.display = 'inline-table'; + $('dayPlus2').style.display = 'inline-table'; + } + else + { + $('timeBar').style.display='block'; + $('timeBar').style.visibility='visible'; + $('hourDropDown').style.top = $('calendar_minute_txt').parentNode.offsetHeight + calendarContentDiv.offsetHeight + $('topBar').offsetHeight + 'px'; + $('minuteDropDown').style.top = $('calendar_minute_txt').parentNode.offsetHeight + calendarContentDiv.offsetHeight + $('topBar').offsetHeight + 'px'; + $('minuteDropDown').style.right = '50px'; + $('hourDropDown').style.right = '50px'; + //$('todaysDateString').style.width = ''; + $('dayPlus1').style.display = 'none'; + $('dayPlus2').style.display = 'none'; + } +} + +function calendarSortItems(a,b) +{ + return a/1 - b/1; +} + +function trim(str) +{ + return str.replace(/^\s+|\s+$/g, ''); +} + +function padleft(str, fmt) +{ + str = str.toString(); + return fmt.substr(0, fmt.length - str.length) + str; +} + +function displayCalendar(inputField, format, buttonObj, displayTime, submit) +{ + var input, pos, date, time; + var items, d; + + calendarDisplayTime = displayTime == true; + must_submit = submit; + + d = new Date(); + d = new Date(d.getFullYear(), d.getMonth(), d.getDate()); + + input = trim(inputField.value); + + if (input != '') + { + pos = input.indexOf(' '); + if (pos > 0) + { + date = input.substr(0, pos); + time = trim(input.substr(pos)); + } + else + { + date = input; + time = '00:00'; + } + + try + { + items = date.split(/[\/]/gi); + + inputDay = items[0]/1; + currentMonth = items[1]/1; + currentYear = items[2]/1; + + items = time.split(/:/gi); + + currentHour = items[0]/1; + currentMinute = items[1]/1; + + if (isFinite(currentYear) && isFinite(currentMonth) && isFinite(inputDay) && isFinite(currentHour) && isFinite(currentMinute)) + d = new Date(currentYear, currentMonth - 1, inputDay, currentHour, currentMinute, 0); + } + catch(e) + { + } + } + + currentMonth = padleft(d.getMonth() + 1, '00'); + currentYear = padleft(d.getFullYear(), '0000'); + currentHour = padleft(d.getHours(), '00'); + currentMinute = padleft(d.getMinutes(), '00'); + + currentMonth--; + + inputDay = d.getDate()/1; + inputYear = currentYear; + inputMonth = currentMonth; + + if (!calendarDiv) + { + initCalendar(); + } + else + { + if (calendarDiv.style.display == 'block') + { + closeCalendar(); + return false; + } + + writeCalendarContent(); + } + + returnFormat = format; + returnDateTo = inputField; + + calendarDiv.style.visibility = 'visible'; + calendarDiv.style.display = 'block'; + positionCalendar(buttonObj); + + if(iframeObj){ + iframeObj.style.display = ''; + iframeObj.style.height = '140px'; + iframeObj.style.width = '195px'; + iframeObj2.style.display = ''; + iframeObj2.style.height = '140px'; + iframeObj2.style.width = '195px'; + } + + setTimeProperties(); + updateYearDiv(); + updateMonthDiv(); + updateMinuteDiv(); + updateHourDiv(); + + var hShadow = $('gw-modal'); + hShadow.style.visibility = 'visible'; + hShadow.onclick = closeCalendar; +} diff --git a/comp/src/gb.web.form/.hidden/control/webbutton.png b/comp/src/gb.web.form/.hidden/control/webbutton.png new file mode 120000 index 00000000..23d989b3 --- /dev/null +++ b/comp/src/gb.web.form/.hidden/control/webbutton.png @@ -0,0 +1 @@ +../../../../../app/src/gambas3/img/control/button.png \ No newline at end of file diff --git a/comp/src/gb.web.form/.hidden/control/webcheckbox.png b/comp/src/gb.web.form/.hidden/control/webcheckbox.png new file mode 120000 index 00000000..b8fe6fbd --- /dev/null +++ b/comp/src/gb.web.form/.hidden/control/webcheckbox.png @@ -0,0 +1 @@ +../../../../../app/src/gambas3/img/control/checkbox.png \ No newline at end of file diff --git a/comp/src/gb.web.form/.hidden/control/webcombobox.png b/comp/src/gb.web.form/.hidden/control/webcombobox.png new file mode 120000 index 00000000..ccfd857b --- /dev/null +++ b/comp/src/gb.web.form/.hidden/control/webcombobox.png @@ -0,0 +1 @@ +../../../../../app/src/gambas3/img/control/combobox.png \ No newline at end of file diff --git a/comp/src/gb.web.form/.hidden/control/webcontainer.png b/comp/src/gb.web.form/.hidden/control/webcontainer.png new file mode 100644 index 0000000000000000000000000000000000000000..0d4551280dc4bc6289f35fc30d164d41118dad3f GIT binary patch literal 109 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;*aCb)T!HlehK938rg;Kcj3q&S z!3+-1ZlnP@qMj~}Asp9}fAF*L@bd8VH1{)D@-q0@h>HvOP4faOVDNPHb6Mw<&;$Sx Cf*G{{ literal 0 HcmV?d00001 diff --git a/comp/src/gb.web.form/.hidden/control/webdatebox.png b/comp/src/gb.web.form/.hidden/control/webdatebox.png new file mode 120000 index 00000000..119ec46b --- /dev/null +++ b/comp/src/gb.web.form/.hidden/control/webdatebox.png @@ -0,0 +1 @@ +../../../gb.form/.hidden/control/datebox.png \ No newline at end of file diff --git a/comp/src/gb.web.form/.hidden/control/webdatechooser.png b/comp/src/gb.web.form/.hidden/control/webdatechooser.png new file mode 120000 index 00000000..e9aed8c9 --- /dev/null +++ b/comp/src/gb.web.form/.hidden/control/webdatechooser.png @@ -0,0 +1 @@ +../../../gb.form/.hidden/control/datechooser.png \ No newline at end of file diff --git a/comp/src/gb.web.form/.hidden/control/webexpander.png b/comp/src/gb.web.form/.hidden/control/webexpander.png new file mode 120000 index 00000000..fbdd33c7 --- /dev/null +++ b/comp/src/gb.web.form/.hidden/control/webexpander.png @@ -0,0 +1 @@ +../../../gb.form/.hidden/control/expander.png \ No newline at end of file diff --git a/comp/src/gb.web.form/.hidden/control/webhbox.png b/comp/src/gb.web.form/.hidden/control/webhbox.png new file mode 120000 index 00000000..891ef5b1 --- /dev/null +++ b/comp/src/gb.web.form/.hidden/control/webhbox.png @@ -0,0 +1 @@ +../../../../../app/src/gambas3/img/control/hbox.png \ No newline at end of file diff --git a/comp/src/gb.web.form/.hidden/control/webhtml.png b/comp/src/gb.web.form/.hidden/control/webhtml.png new file mode 100644 index 0000000000000000000000000000000000000000..ca4ef5d505fce0007a065eeef76a2c232bd5a8ba GIT binary patch literal 403 zcmV;E0c`$>P)kdg00046Nkl1nmSBeE>@(eLy0bY-OP& zg$W^`*TT5&W`8nfvB+1=oSiwdbLMhk=!q$Ugb+b9OvFas5y z5sZIIK;;U3F5qvV`x@vdk>re5rtEpOo4_=0oc1$`u|or)M%t4=8VjMpc5v}6Q$lF7 zPr}yL5stg#1P8PcN-TLdPjbX3!X>6lKS5Y?%uTKkJ~(8;ZD1ihu;MYU`qV(43WDVp zTL|aO_AFiSt${f%5L#|A%{{_9yNo*24MzgsjIl=(;f_V`3v5wGsF1g{LQev#JR;QD z3@SjKB7$&@0cg}52^icU2nA*cB}J_Iro34)n{L;<$wK|IF{+lGOE-tdS3p1$CIs5f+0!3fhj28M3X5&M&Qx|0ne}y zu08851Q*N>Ug7B_F~RZ9gvn~{4e^J4codY6-uV#!V6LRtj~AZ~KEJ;GDD&Ocnulvo4n;lpMibhXYKbLh*2~7ZWni)#~ literal 0 HcmV?d00001 diff --git a/comp/src/gb.web.form/.hidden/control/webmenubar.png b/comp/src/gb.web.form/.hidden/control/webmenubar.png new file mode 100644 index 0000000000000000000000000000000000000000..20648ca34d68a1e43598f122211048c09a8056fe GIT binary patch literal 472 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy+XH+;T!D02S{jgCzkdC@ckkZ5 zeG6oFc6M&rvgO5#7eIDHL&Ls(`<^^`5*iwM`0(M^uU{WIas;UI)TvV+KYqM$;lis| zuYf8SFJ65A{(YeO_V)J6moEbuB_$Y8F@OI2Ns}i1-d?g0sNbL@ z$S;_Il~LetFq70@A7+_<&dk3ZzT12;eQ)sKZyx)Q(p5$u^;Bn2qYW3LWVT(mKm)6sjAO7EedTQ=^{^TT^)oQkx zx1t;D6$}^}3!S(g{&^HT)9XhW`{kMP6CHQXKl{}4Rr13iovEyiTGuy3ZFXrqT-EH- zxHyg5wJ~&eawpUMUA983`@RQ?EIN4M8YlnK8Sale)p%x|dvqi4mdKI;Vst0RBSF!Tr<>lq=?d<>n0Dypi z|NsB?`ux1t>8Hx$yVvRU`TXni`1kw$=H}+z-Q9Gp(KLpQ&TlHHD6y}+uPe@WMoxURXRF4pP!%k`T6?%{foNU zin-a(;_rL0)GC0vd9c*^`~CCt^V!+i{{H@rjg4(>Z4VC*$H&Lz<>g05N2jN!>+|_X zlEX2DyR6OR>+9>UudjG`csDmUN=izmrlvfLzbt~fN|VG`oXAp`$A*T6Mn*=Rot>JR znp<02y1KeZNJ#4P_(PAvkGAsz?Ck88 zmX<9oEki>?Xl1eui!T>p$Vk5v|-{py2uJt_4Ex4jf_=HOwC{l%q@@=sOei;S=-p!**iF5 zSKwse?BeR??&0a>t)k-N>*pV!VjdV291;pu5Ekwk5gFy_=@}gptD+JYpOBcOVxF9m znwAb#kdf&L0a@7~LvwQT@>R?WR8$K6p$hD>yo!qTOG<6ZGJqoG6_r&$1=T7lHMLL$ zb@dI6P0cNOt!*F!+B;M_yAsU1dsKS+pbGjYOq?`%%G7Do!OosBbJpxRp>qr7)z0sL z`C>to!@@<2m&8ImwshI@!WAo*uL?j4NlnMqjceAz!k}kedcpb)J-Fins9;vX#!Wpi z1sGtna{8=UTeenhhD0|eU}OR+n6-_Wg%w8k4UU7jwEAs)w*b9~a){Z~HiAXjmA z#%Kuw?b%Q6VQoIIB_&)WBwS{mxW>z>!^6X^X}Unp_k}{U z?ZsQtk{aI*tzc|E$RNhn)-2J)?rD5L&e{4S=gR{M9L<5uZo)#LhZ3$Zu(7GNUH3nE t?a!3Pho;HN5B|^OS(GyC!z@EthL}F--%iTOCxNbF@O1TaS?83{1OP=SM_K>? literal 0 HcmV?d00001 diff --git a/comp/src/gb.web.form/.hidden/control/webtabpanel.png b/comp/src/gb.web.form/.hidden/control/webtabpanel.png new file mode 120000 index 00000000..7be554f7 --- /dev/null +++ b/comp/src/gb.web.form/.hidden/control/webtabpanel.png @@ -0,0 +1 @@ +../../../gb.form/.hidden/control/tabpanel.png \ No newline at end of file diff --git a/comp/src/gb.web.form/.hidden/control/webtextarea.png b/comp/src/gb.web.form/.hidden/control/webtextarea.png new file mode 120000 index 00000000..dd1d94b9 --- /dev/null +++ b/comp/src/gb.web.form/.hidden/control/webtextarea.png @@ -0,0 +1 @@ +../../../../../app/src/gambas3/img/control/textarea.png \ No newline at end of file diff --git a/comp/src/gb.web.form/.hidden/control/webtextbox.png b/comp/src/gb.web.form/.hidden/control/webtextbox.png new file mode 120000 index 00000000..276853b4 --- /dev/null +++ b/comp/src/gb.web.form/.hidden/control/webtextbox.png @@ -0,0 +1 @@ +../../../../../app/src/gambas3/img/control/textbox.png \ No newline at end of file diff --git a/comp/src/gb.web.form/.hidden/control/webtimer.png b/comp/src/gb.web.form/.hidden/control/webtimer.png new file mode 120000 index 00000000..0ae99c8a --- /dev/null +++ b/comp/src/gb.web.form/.hidden/control/webtimer.png @@ -0,0 +1 @@ +../../../../../app/src/gambas3/img/control/timer.png \ No newline at end of file diff --git a/comp/src/gb.web.form/.hidden/control/webuploadarea.png b/comp/src/gb.web.form/.hidden/control/webuploadarea.png new file mode 100644 index 0000000000000000000000000000000000000000..0fac5b2ec05670b2127600c217651c80383cc7e6 GIT binary patch literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv#Q>iWS0L>G2KM&$KpH|qME*B4 z02#>vasPpeI7@>3f*E{XybSppvtYj5oiz)9f>oX_jv*T7lV^0YNvIhtVDQW0;?P{g znW5_>9I>_Q9aGOSJ_SaxWX2T?pH~@7aCoJ~yyL*7meAEV7Cm6n30!?BY^_)9)+>x@ z8WZ+ri3W(|aR-zopr02`1^9{>OV literal 0 HcmV?d00001 diff --git a/comp/src/gb.web.form/.hidden/control/webuploadbutton.png b/comp/src/gb.web.form/.hidden/control/webuploadbutton.png new file mode 100644 index 0000000000000000000000000000000000000000..ebd4f966e9b493f33a72ca639fcde4a49bbaeef1 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4U37#&FAs)w*6C_xf`6Z;8|DR70 zP!0Z`eXOLdExiB#e`R62fA>FhwK|4OdMH1WZ$e6fKx$&b5C1@k4F(f({}&h~mB_4W1h^YilZ^6>ER?(XhnWMpAs zVcy=}?Ck7dU|?NcUEST?>+9>>+}!Eu>Dt=bTwGk|=jYhi*yZKr*4EbI;^NHA%;4bQ zfU4wxwg3PB|K#N4#hA#Y00003bW%=J08#2038Sq5006g1L_t(I%hl4$4uUWch2hfT z1&gS-JqtrSi75+Le(7c={{}KD(k4JhO2>4;S^H=>Gz8F7Vyy_to hjOIUr+0UH&QEyzKNGb36V`BgS002ovPDHLkV1h2Hy|MrR literal 0 HcmV?d00001 diff --git a/comp/src/gb.web.form/.hidden/control/webvbox.png b/comp/src/gb.web.form/.hidden/control/webvbox.png new file mode 120000 index 00000000..50d7662d --- /dev/null +++ b/comp/src/gb.web.form/.hidden/control/webvbox.png @@ -0,0 +1 @@ +../../../../../app/src/gambas3/img/control/vbox.png \ No newline at end of file diff --git a/comp/src/gb.web.form/.icon.png b/comp/src/gb.web.form/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..eedc7d8863854cb8646b25127e14db92ddf35ed5 GIT binary patch literal 10933 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

    \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Web application development" +msgstr "" + +#: FMessage.webform:50 +msgid "OK" +msgstr "OK" + +#: Message.class:33 +msgid "Information" +msgstr "Information" + +#: Message.class:45 +msgid "Warning" +msgstr "Avertissement" + +#: Message.class:51 +msgid "Error" +msgstr "Erreur" + +#: Message.class:57 +msgid "Question" +msgstr "Question" + +#: WebUploader.class:36 +msgid "Abort" +msgstr "Annuler" + +#: WebUploader.class:59 +msgid "Upload file..." +msgstr "Envoyer un fichier..." + diff --git a/comp/src/gb.web.form/.lang/it.po b/comp/src/gb.web.form/.lang/it.po new file mode 100644 index 00000000..3ee02b6e --- /dev/null +++ b/comp/src/gb.web.form/.lang/it.po @@ -0,0 +1,43 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.web.form 3.12.90\n" +"PO-Revision-Date: 2019-01-15 14:45 UTC\n" +"Last-Translator: gian \n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:2 +msgid "Web application GUI controls" +msgstr "Controlli della GUI Web" + +#: FMessage.webform:50 +msgid "OK" +msgstr "-" + +#: Message.class:33 +msgid "Information" +msgstr "Informazione" + +#: Message.class:45 +msgid "Warning" +msgstr "Attenzione" + +#: Message.class:51 +msgid "Error" +msgstr "Errore" + +#: Message.class:57 +msgid "Question" +msgstr "Domanda" + +#: WebUploader.class:36 +msgid "Abort" +msgstr "Interruzione" + +#: WebUploader.class:59 +msgid "Upload file..." +msgstr "Carica file..." + diff --git a/comp/src/gb.web.form/.lang/nl.po b/comp/src/gb.web.form/.lang/nl.po new file mode 100644 index 00000000..234fe515 --- /dev/null +++ b/comp/src/gb.web.form/.lang/nl.po @@ -0,0 +1,283 @@ +# Willy Raets < gbWilly@openmailbox.org >, 2017 +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.web.form 3.10.90\n" +"POT-Creation-Date: 2019-04-06 18:47 UTC\n" +"PO-Revision-Date: 2017-08-26 19:52 UTC\n" +"Last-Translator: Willy Raets \n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:2 +msgid "Web application GUI controls" +msgstr "Web applicatie GUI controls" + +#: FHello.webform:14 +msgid "This is a very important message" +msgstr "Dit is een heel belangrijke boodschap" + +#: FHello.webform:18 +msgid "" +"

    Welcome to the gb.web.form component!

    \n" +"

    This component aims at making web application as easy as making desktop applications.

    \n" +"

    This goal is difficult to achieve, but I hope to succeed!

    " +msgstr "-" + +#: FHello.webform:34 FMessage.webform:50 +msgid "OK" +msgstr "-" + +#: Message.class:33 +msgid "Information" +msgstr "Informatie" + +#: Message.class:45 Webform2.webform:169 +msgid "Warning" +msgstr "Waarschuwing" + +#: Message.class:51 +msgid "Error" +msgstr "-" + +#: Message.class:57 +msgid "Question" +msgstr "Vraag" + +#: WebUploader.class:36 +msgid "Abort" +msgstr "Afbreken" + +#: WebUploader.class:59 +msgid "Upload file..." +msgstr "Upload bestand..." + +#: Webform1.webform:35 +msgid "gb.web.form test" +msgstr "-" + +#: Webform1.webform:44 +msgid "Header" +msgstr "Hoofding" + +#: Webform1.webform:65 +msgid "Hello world!" +msgstr "Hallo wereld !" + +#: Webform1.webform:69 +msgid "Reset text" +msgstr "Tekst resetten" + +#: Webform1.webform:73 +msgid "Change text" +msgstr "Wijzig tekst" + +#: Webform1.webform:77 +msgid "0" +msgstr "-" + +#: Webform1.webform:81 +msgid "Border" +msgstr "Rand" + +#: Webform1.webform:85 +msgid "Toggle enabled" +msgstr "-" + +#: Webform1.webform:111 +msgid "Absolute !" +msgstr "Absoluut !" + +#: Webform1.webform:123 +msgid "B1" +msgstr "-" + +#: Webform1.webform:128 +msgid "B5" +msgstr "-" + +#: Webform1.webform:133 +msgid "B7" +msgstr "-" + +#: Webform1.webform:138 +msgid "B6" +msgstr "-" + +#: Webform1.webform:143 +msgid "B2" +msgstr "-" + +#: Webform1.webform:148 +msgid "B3" +msgstr "-" + +#: Webform1.webform:153 +msgid "B4" +msgstr "-" + +#: Webform1.webform:158 +msgid "B8" +msgstr "-" + +#: Webform2.webform:67 +msgid "This is webform2" +msgstr "Dit is webformulier2" + +#: Webform2.webform:73 +msgid "File" +msgstr "Bestand" + +#: Webform2.webform:76 +msgid "New" +msgstr "Nieuw" + +#: Webform2.webform:82 +msgid "Open" +msgstr "Openen" + +#: Webform2.webform:88 +msgid "Project" +msgstr "-" + +#: Webform2.webform:91 +msgid "Compile" +msgstr "Compileer" + +#: Webform2.webform:97 +msgid "Compile all" +msgstr "Compileer alles" + +#: Webform2.webform:105 +msgid "Translate" +msgstr "Vertaal" + +#: Webform2.webform:113 +msgid "Teleport" +msgstr "Teleporteer" + +#: Webform2.webform:121 +msgid "Quit" +msgstr "Afsluiten" + +#: Webform2.webform:159 +msgid "A button" +msgstr "Een knop" + +#: Webform2.webform:164 +msgid "Add window" +msgstr "Venster toevoegen" + +#: Webform2.webform:174 +msgid "Toggle timer" +msgstr "-" + +#: Webform2.webform:179 +msgid "Hidden" +msgstr "Verborgen" + +#: Webform2.webform:202 +msgid "General" +msgstr "Algemeen" + +#: Webform2.webform:205 +msgid "Hello !" +msgstr "Hallo !" + +#: Webform2.webform:209 +msgid "Check and uncheck me!" +msgstr "Vink me aan, vink me uit!" + +#: Webform2.webform:216 Webform6.webform:17 +msgid "Élément 1" +msgstr "-" + +#: Webform2.webform:216 Webform6.webform:17 +msgid "Élément 2" +msgstr "-" + +#: Webform2.webform:216 Webform6.webform:17 +msgid "Élément 3" +msgstr "-" + +#: Webform2.webform:216 +msgid "Élément 4" +msgstr "-" + +#: Webform2.webform:247 +msgid "New element" +msgstr "Nieuw element" + +#: Webform2.webform:251 +msgid "Clear" +msgstr "Opschonen" + +#: Webform2.webform:268 +msgid "This is an expander container" +msgstr "Dit is een expander container" + +#: Webform2.webform:277 +msgid "Alpha" +msgstr "-" + +#: Webform2.webform:281 +msgid "Beta" +msgstr "-" + +#: Webform2.webform:286 +msgid "Gamma" +msgstr "-" + +#: Webform2.webform:290 +msgid "Gambas Almost Means Basic!" +msgstr "-" + +#: Webform2.webform:299 +msgid "Please enter some text:" +msgstr "Voer wat tekst in:" + +#: Webform2.webform:318 +msgid "Options" +msgstr "Opties" + +#: Webform2.webform:321 +msgid "Test" +msgstr "-" + +#: Webform2.webform:324 +msgid "Application state" +msgstr "Applicatie status" + +#: Webform3.webform:24 +msgid "Tab 1" +msgstr "-" + +#: Webform3.webform:27 +msgid "Message" +msgstr "Bericht" + +#: Webform3.webform:36 +msgid "Tab 2" +msgstr "-" + +#: Webform4.webform:28 +msgid "Select file" +msgstr "Selecteer bestand" + +#: Webform4.webform:45 +msgid "Show" +msgstr "Weergeven" + +#: Webform4.webform:49 +msgid "Hide" +msgstr "Verberg" + +#: Webform6.webform:30 +msgid "Copy" +msgstr "" + +#: Webform6.webform:34 +msgid "Text" +msgstr "" diff --git a/comp/src/gb.web.form/.lang/pt_BR.po b/comp/src/gb.web.form/.lang/pt_BR.po new file mode 100644 index 00000000..d72e29ee --- /dev/null +++ b/comp/src/gb.web.form/.lang/pt_BR.po @@ -0,0 +1,44 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: gb.web.form 3.14.90\n" +"PO-Revision-Date: 2020-06-12 00:43 UTC\n" +"Last-Translator: Gen Braga \n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Web application development" +msgstr "Desenvolvimento de aplicação web" + +# gb-ignore +#: FMessage.webform:50 +msgid "OK" +msgstr "" + +#: Message.class:33 +msgid "Information" +msgstr "Informação" + +#: Message.class:45 +msgid "Warning" +msgstr "Atenção" + +#: Message.class:51 +msgid "Error" +msgstr "Erro" + +#: Message.class:57 +msgid "Question" +msgstr "Questão" + +#: WebUploader.class:36 +msgid "Abort" +msgstr "Abortar" + +#: WebUploader.class:59 +msgid "Upload file..." +msgstr "Upload de arquivo..." + diff --git a/comp/src/gb.web.form/.lang/ru.po b/comp/src/gb.web.form/.lang/ru.po new file mode 100644 index 00000000..b18fd4ca --- /dev/null +++ b/comp/src/gb.web.form/.lang/ru.po @@ -0,0 +1,300 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: comp/src/gb.web.form/.project:19 +msgid "Web application GUI controls" +msgstr "Элементы управления графическим интерфейсом веб-приложения" + +#: comp/src/gb.web.form/.src/WebUploader.class:36 +msgid "Abort" +msgstr "Прервать" + +#: comp/src/gb.web.form/.src/WebUploader.class:59 +msgid "Upload file..." +msgstr "Выгрузить файл..." + +#: comp/src/gb.web.form/.src/Test/FHello.webform:8 +msgid "This is a very important message" +msgstr "Это очень важное сообщение" + +#: comp/src/gb.web.form/.src/Test/FHello.webform:12 +msgid "" +"

    Welcome to the gb.web.form component!

    \n" +"

    This component aims at making web application as easy as making desktop applications.

    \n" +"

    This goal is difficult to achieve, but I hope to succeed!

    " +msgstr "" +"

    Добро пожаловать в компонент gb.web.form!

    \n" +"

    тот компонент нацелен на то, чтобы сделать веб-приложение таким же простым, как и настольные приложения.

    \n" +"

    Эту цель трудно достичь, но я надеюсь добиться успеха!

    " + +#: comp/src/gb.web.form/.src/Test/FHello.webform:28 comp/src/gb.web.form/.src/Message/FMessage.webform:40 +msgid "OK" +msgstr "ОК" + +#: comp/src/gb.web.form/.src/Test/Webform1.webform:9 +msgid "gb.web.form test" +msgstr "тест gb.web.form" + +#: comp/src/gb.web.form/.src/Test/Webform1.webform:18 +msgid "Header" +msgstr "Заголовок" + +#: comp/src/gb.web.form/.src/Test/Webform1.webform:39 +msgid "Hello world!" +msgstr "Привет, мир!" + +#: comp/src/gb.web.form/.src/Test/Webform1.webform:43 +msgid "Reset text" +msgstr "Сбросить текст" + +#: comp/src/gb.web.form/.src/Test/Webform1.webform:47 +msgid "Change text" +msgstr "Изменить текст" + +#: comp/src/gb.web.form/.src/Test/Webform1.webform:51 +msgid "0" +msgstr "0" + +#: comp/src/gb.web.form/.src/Test/Webform1.webform:55 +msgid "Border" +msgstr "Граница" + +#: comp/src/gb.web.form/.src/Test/Webform1.webform:59 +msgid "Toggle enabled" +msgstr "Переключатель включен" + +#: comp/src/gb.web.form/.src/Test/Webform1.webform:85 +msgid "Absolute !" +msgstr "Абсолютно!" + +#: comp/src/gb.web.form/.src/Test/Webform1.webform:97 +msgid "B1" +msgstr "B1" + +#: comp/src/gb.web.form/.src/Test/Webform1.webform:102 +msgid "B5" +msgstr "B5" + +#: comp/src/gb.web.form/.src/Test/Webform1.webform:107 +msgid "B7" +msgstr "B7" + +#: comp/src/gb.web.form/.src/Test/Webform1.webform:112 +msgid "B6" +msgstr "B6" + +#: comp/src/gb.web.form/.src/Test/Webform1.webform:117 +msgid "B2" +msgstr "B2" + +#: comp/src/gb.web.form/.src/Test/Webform1.webform:122 +msgid "B3" +msgstr "B3" + +#: comp/src/gb.web.form/.src/Test/Webform1.webform:127 +msgid "B4" +msgstr "B4" + +#: comp/src/gb.web.form/.src/Test/Webform1.webform:132 +msgid "B8" +msgstr "B8" + +#: comp/src/gb.web.form/.src/Test/Webform2.webform:7 +msgid "This is webform2" +msgstr "Это веб_форма_2" + +#: comp/src/gb.web.form/.src/Test/Webform2.webform:13 +msgid "File" +msgstr "Файл" + +#: comp/src/gb.web.form/.src/Test/Webform2.webform:16 +msgid "New" +msgstr "Новый" + +#: comp/src/gb.web.form/.src/Test/Webform2.webform:22 +msgid "Open" +msgstr "Открыть" + +#: comp/src/gb.web.form/.src/Test/Webform2.webform:28 comp/src/gb.web.form/.src/Test/Webform2.webform:66 +msgid "Project" +msgstr "Проект" + +#: comp/src/gb.web.form/.src/Test/Webform2.webform:31 comp/src/gb.web.form/.src/Test/Webform2.webform:69 +msgid "Compile" +msgstr "Компилировать" + +#: comp/src/gb.web.form/.src/Test/Webform2.webform:37 comp/src/gb.web.form/.src/Test/Webform2.webform:75 +msgid "Compile all" +msgstr "Компилировать все" + +#: comp/src/gb.web.form/.src/Test/Webform2.webform:45 comp/src/gb.web.form/.src/Test/Webform2.webform:83 +msgid "Translate" +msgstr "Перевести" + +#: comp/src/gb.web.form/.src/Test/Webform2.webform:53 comp/src/gb.web.form/.src/Test/Webform2.webform:91 +msgid "Teleport" +msgstr "Телепорт" + +#: comp/src/gb.web.form/.src/Test/Webform2.webform:61 +msgid "Quit" +msgstr "Выход" + +#: comp/src/gb.web.form/.src/Test/Webform2.webform:99 +msgid "A button" +msgstr "Кнопка" + +#: comp/src/gb.web.form/.src/Test/Webform2.webform:104 +msgid "Add window" +msgstr "Добавить окно" + +#: comp/src/gb.web.form/.src/Test/Webform2.webform:109 comp/src/gb.web.form/.src/Message/Message.class:45 +msgid "Warning" +msgstr "Предупреждение" + +#: comp/src/gb.web.form/.src/Test/Webform2.webform:114 +msgid "Toggle timer" +msgstr "Переключить таймер" + +#: comp/src/gb.web.form/.src/Test/Webform2.webform:119 +msgid "Hidden" +msgstr "Скрытый" + +#: comp/src/gb.web.form/.src/Test/Webform2.webform:142 +msgid "General" +msgstr "Основное" + +#: comp/src/gb.web.form/.src/Test/Webform2.webform:145 +msgid "Hello !" +msgstr "Привет!" + +#: comp/src/gb.web.form/.src/Test/Webform2.webform:149 +msgid "Check and uncheck me!" +msgstr "Отметьте флажком и снимите его с меня!" + +#: comp/src/gb.web.form/.src/Test/Webform2.webform:156 comp/src/gb.web.form/.src/Test/Webform2.webform:182 comp/src/gb.web.form/.src/Test/Webform6.webform:10 +msgid "Élément 1" +msgstr "Элемент 1" + +#: comp/src/gb.web.form/.src/Test/Webform2.webform:156 comp/src/gb.web.form/.src/Test/Webform2.webform:182 comp/src/gb.web.form/.src/Test/Webform6.webform:10 +msgid "Élément 2" +msgstr "Элемент 2" + +#: comp/src/gb.web.form/.src/Test/Webform2.webform:156 comp/src/gb.web.form/.src/Test/Webform2.webform:182 comp/src/gb.web.form/.src/Test/Webform6.webform:10 +msgid "Élément 3" +msgstr "Элемент 3" + +#: comp/src/gb.web.form/.src/Test/Webform2.webform:156 comp/src/gb.web.form/.src/Test/Webform2.webform:182 +msgid "Élément 4" +msgstr "Элемент 4" + +#: comp/src/gb.web.form/.src/Test/Webform2.webform:187 +msgid "New element" +msgstr "Новый элемент" + +#: comp/src/gb.web.form/.src/Test/Webform2.webform:191 +msgid "Clear" +msgstr "Очистить" + +#: comp/src/gb.web.form/.src/Test/Webform2.webform:208 +msgid "This is an expander container" +msgstr "Это контейнер-расширитель" + +#: comp/src/gb.web.form/.src/Test/Webform2.webform:217 +msgid "Alpha" +msgstr "Альфа" + +#: comp/src/gb.web.form/.src/Test/Webform2.webform:221 +msgid "Beta" +msgstr "Бета" + +#: comp/src/gb.web.form/.src/Test/Webform2.webform:226 +msgid "Gamma" +msgstr "Гамма" + +#: comp/src/gb.web.form/.src/Test/Webform2.webform:230 +msgid "Gambas Almost Means Basic!" +msgstr "Gambas почти что Basic!" + +#: comp/src/gb.web.form/.src/Test/Webform2.webform:239 +msgid "Please enter some text:" +msgstr "Пожалуйста, введите текст:" + +#: comp/src/gb.web.form/.src/Test/Webform2.webform:258 +msgid "Options" +msgstr "Опции" + +#: comp/src/gb.web.form/.src/Test/Webform2.webform:261 +msgid "Test" +msgstr "Тест" + +#: comp/src/gb.web.form/.src/Test/Webform2.webform:264 +msgid "Application state" +msgstr "Состояние приложения" + +#: comp/src/gb.web.form/.src/Test/Webform3.webform:18 +msgid "Tab 1" +msgstr "Вкладка 1" + +#: comp/src/gb.web.form/.src/Test/Webform3.webform:21 +msgid "Message" +msgstr "Сообщение" + +#: comp/src/gb.web.form/.src/Test/Webform3.webform:30 +msgid "Tab 2" +msgstr "Вкладка 2" + +#: comp/src/gb.web.form/.src/Test/Webform4.webform:17 +msgid "Select file" +msgstr "Выбрать файл" + +#: comp/src/gb.web.form/.src/Test/Webform4.webform:34 +msgid "Show" +msgstr "Показать" + +#: comp/src/gb.web.form/.src/Test/Webform4.webform:38 +msgid "Hide" +msgstr "Скрыть" + +#: comp/src/gb.web.form/.src/Test/Webform6.webform:23 +msgid "Copy" +msgstr "Копировать" + +#: comp/src/gb.web.form/.src/Test/Webform6.webform:27 +msgid "Text" +msgstr "Текст" + +#: comp/src/gb.web.form/.src/Message/Message.class:33 +msgid "Information" +msgstr "Информация" + +#: comp/src/gb.web.form/.src/Message/Message.class:51 +msgid "Error" +msgstr "Ошибка" + +#: comp/src/gb.web.form/.src/Message/Message.class:57 +msgid "Question" +msgstr "Вопрос" + diff --git a/comp/src/gb.web.form/.project b/comp/src/gb.web.form/.project new file mode 100644 index 00000000..91b88c4a --- /dev/null +++ b/comp/src/gb.web.form/.project @@ -0,0 +1,18 @@ +# Gambas Project File 3.0 +Title=Web application development +Startup=Webform1 +UseHttpServer=1 +Version=3.14.90 +VersionFile=1 +Component=gb.util +Component=gb.util.web +Component=gb.web +Authors="Benoît Minisini" +Environment="GB_PCODE_VERSION=3.8" +TabSize=2 +Translate=1 +Language=en_US +RunAfter=cp $(FILE) /home/guygle/guygle/cgi-bin/test +Type=Component +Packager=1 +DoNotTranslate=".src/Test" diff --git a/comp/src/gb.web.form/.public/favicon.png b/comp/src/gb.web.form/.public/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..7d6acb4bfb851c591279232c229f84a5f70c129e GIT binary patch literal 16241 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 literal 0 HcmV?d00001 diff --git a/comp/src/gb.web.form/.public/gw-arrow-left.png b/comp/src/gb.web.form/.public/gw-arrow-left.png new file mode 100644 index 0000000000000000000000000000000000000000..0fd95f5830e050ecc0af12332d70f323a64601ba GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6Y&=~YLp07OCrB_T94qL1$YS^M zG|zv@a}THQJEPz>ZHvWW(YF6Q`WKeY^eDEE)Ak4|>T6`2FSLizm6?HI?@qDLIu6#` Qf#xuHy85}Sb4q9e0Ht;%YXATM literal 0 HcmV?d00001 diff --git a/comp/src/gb.web.form/.public/gw-arrow-right.png b/comp/src/gb.web.form/.public/gw-arrow-right.png new file mode 100644 index 0000000000000000000000000000000000000000..936584c0ac5b4e55c06f4f328d98cbabf8077723 GIT binary patch literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6EInNuLp07OCoIsmI9Sl<$TPpG znCHKw-s51UV+Av{yy6W0r0+PSz$cubbXJ~ajlv72rh6(90VYfgPYuOBe<=)I2Q-Ai M)78&qol`;+0MJ%-j5Jq2Iv(>E>T*UG$$$>)dV|ff0B!yeO17v{}5EqyLX=88LbO7hfJh&P zi-?V)Fd?}?93&=c?=L8B?luS7(RZh#5 zHzvwkGv&>x^7dT0K%rcsQ7%%cm+6!Xm8Gz~8-i20KGfa?!KqviXLd9}01Z3N3-_JM z_2Kq*1c!2c$|DK^&m#F zfsqXh@lV(MK!eBhXWu=hGQ~}77x^${eV*gaJ^ON+JyM=6eEqvJ`hGpbbBBWGKeJx- Pg1q4A>gTe~DWM4f=O9|0 literal 0 HcmV?d00001 diff --git a/comp/src/gb.web.form/.public/gw-table-more.gif b/comp/src/gb.web.form/.public/gw-table-more.gif new file mode 100644 index 0000000000000000000000000000000000000000..cad57b9e6459100c1761c989a9e1bdf0a84ac520 GIT binary patch literal 723 zcmZ?wbhEHb6ky zFk#7(B}a}N*|>4zy?gg2O`6o$*tl%jvQM8ry?*`r=g*(BXU~57_U(@!KW^Q+b^iSM zCr_Sy`}U0i1{D8u`?-b$J39ur8tEA@GXljG|4BI)r6!i7rYMwWmSiX-W+hhS zY~S+8;RKIf@w#hVu4|_`VKYG`AyI-gVcv>Nnf8hM4%|Al^3A2?z0cq5eZ4zEUtZ=E6w0k7GR^Oh05+pcfkrLia1{(;>V0gIq~dw;l}*3!`O?bg*0Xq*GoNU&OWNT6 zOSJ#Y#9~Vpsmj&Yx_4>K4N}Brk`W|4u5F5V<`Ou0hsUL)pitM7TVfws#l4+&n=$Qh zeBcXZ#@-XpPOv7=^ICcJs}xqhnL~_GDU5Adu_Z`1Zf z!3WHG(|uL?XP7X>>oS;`onEl-K@bNvC+S1XdIEIMicRlU70IXuZQ*@jy8icenS$xu g-@1;>Dr}Yc6{pK!!sZ;gehJn9BH0XUP!a(H0Loeu2mk;8 literal 0 HcmV?d00001 diff --git a/comp/src/gb.web.form/.public/gw-waiting.gif b/comp/src/gb.web.form/.public/gw-waiting.gif new file mode 100644 index 0000000000000000000000000000000000000000..84d7b8cfdb97a27d75c6d4ca3d2be9b372d2b538 GIT binary patch literal 6968 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/comp/src/gb.web.form/.public/message/error.png b/comp/src/gb.web.form/.public/message/error.png new file mode 100644 index 0000000000000000000000000000000000000000..0b792721102820c1043bddcd132b06d37f60c9e5 GIT binary patch literal 1173 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBgK_U|bU56XFWwUJVU>Y#F-GBIux5 zz-`ay8`gd|T|#bqdfs7I4!Qr0k|k@NL)NJMN(nmA9QijN4%Ccbo!2f^LDgT>T)j_Z&j*I7I;2cbvm+ z0(Aiu0A*oTKo~cjgKoP3-2k*M^tN*#P}$SOv|FwrH(f#>=;+^sNI3&#LAGCVfVdMR z3*_DbIR?T8k|7{n&OjG}89>uOt__741U_5n~1o;I6X%wIyT(M;Hk;TjkQ>Vx?S$+KCsrKlh&Z32kQa2?;e*O{@ z{VmEUDam;M?t+CH+NYvi&N4;DG9GvQocf7LzOd|{{Pc|6qU1?safup5QE_TPi5Z!3 zMdf9gTgwlZGv#joC43XM8~B}YxmDqROyM>Aj3<1SuCr(O?K^jY&E4X=j?0fNX992h zJaU?8ug<4?96wr)oWCFycto|!Ue{u}V*H*}60Lo1F9n5b>wYNkJ>p{Z*HiXr+;LK) z&gaexb>s8t--ToHPc8|&A%CkhDmLzp_=h6pN&d-K{~l-e**UHDUbe}?6A9M88u!&* z&iSdoYu=8Fyl1D0HJ(kG8Mu|vbLLM!+pZ};nPs!I)kA-8oBL6>%JARImj6r5*L`AB zfBNsctaJO1VC~1u^*7n}DrZOT&N+RmZEvl0oNdC-)7z>u&gOIHem4qtU*-D4tZ3Fr z=KufNE3IT~+GI8au+5p%xAD)d54$#0$E8m!-Y?Xz{qOUMnJ@M-Xe=(+7LvLaRK75H My85}Sb4q9e07bkNwg3PC literal 0 HcmV?d00001 diff --git a/comp/src/gb.web.form/.public/message/info.png b/comp/src/gb.web.form/.public/message/info.png new file mode 100644 index 0000000000000000000000000000000000000000..1e7aef08541644e81596a62e2f1b81feca067ad7 GIT binary patch literal 828 zcmV-C1H=4@P)I_nqFpo%jFEyq(>B!ysr5 zL%32cF<1a4#DnI5OA*UsTMf9hM`+&TS!D+np>bDS}`Ly~12eS~5OU+Y@dptF2 zNDauXG>E;~%LA~Wt!iQBgC;=kpx(_;VdIdkLH|@nfZR&GSyetwozP&N^-m`T*6m^~ zAAwOLw~PM9yj^rp1G38N2PZcHq*6?yLUVHELqB6HEu$Zr>j)T6#&;B74?fnG&&n#- z9>(1mps5}$d6Nf#Yf?=TfOX~ga8r%Zg9LzVM|EE10Wh0f2Ozp@s9hw5`kNv#uTW_G z4U7Q{aO@6$$Bulj06^GW?powP_<}C-fH`~~Fal&3d%o+xun6n~10c7F1i)b6CB|YU? zi1VPHfVChu2e6`>{>sjI?o#kYH-O)zZ~zm!0mcCi(1>38%m;8l@nTsQ{bkcIzyWUv zZe0KauEqF2xknd34-f;mM=_q8RvLR7ZG_`p#a&Qd<%v3@P7E+K24`ON`#kTG0D#(o z*}Un`72J-y3BO~xntUk8oF&}+MsU{sJ`DhnTHr*kA8?}Up645vN#_IqC+iIG)`x zmip+j`}5`-8AYTT)=jm7@}qPozVC$r03g???W|d|b6v&&dfXZxnk~!FXfZZ0JK11O zYS30Ng9+waed7&j=L^@_VF*{K`&bb`OU7R(7VfKJdH(^L;^7cA+3XAe0000A^FLgyBSZm=#8cRPyVAd#I6T|fuyV3@Rxq3;+-FGO(<*cPAy zAOq;m{{0}+fX;ww0djXUG|UIdcI;;8gg6yq%T9*g-5_^%0gc)TRu5!@5lAo4K(Jsh z(B54PT{{?7tpck7vmsJIHNAVlvOvLI41GXjAzJo=-4ABBZUvdsvlrxmK1gsu>;mcq zGIoMo1+fko&cFbKuz}8)vWMY6Fq9x#z-mAN4py-0DnlnQNP!Lmx*zOus4k#_Js^?p zqd;>wB8<-i&74#c%_kH(`N)UElR^Y}llJ{d&$6Q z?~k7YQ~&*qdDQJ8$@Ho=!doioPH{)w95;r*N_@!z$U*B!GqUPeSL(Q2xC#UVT zy0n}5%WK={ulLm4RIPQBe_J^$Eix#SPf=FneH|_2C~-8tMZ?usK~!_i291kZdqqU! zoIG?-dt5P4)^*(@9O4v`m6bMg`ZN8qX#q2Dmfw6>bA$i+pL3hvpEEY*Ztw_SWG?X~ zy+>ie=I36geN@zgD_x)dbSjy8Gf8#MnrYluwJLnq_AXepIo{=iH=l6e)Rq5?&d2Zc z;yQKnz^Ci$gn4)7J^5@dy|u#W&a>csC(pW^-JW-UVpP=aTRV^4P5w8po%5ajiJ$zZ zZ?hQ?ElL1^G=_4oVE9X z(Cofhj#EP`JvS@f;|VO5cy6m~BK`DkIKxB3DfPB~Kh3$Uh1$ZV)LT3LJlSDX!T$bY zS=ULD9f_@xr_L|DeU#zzjJ*sSI`Y>`NZjq%%kpEzCyxuBT^EfSWIsO^(?4bI z^<|BsF)O28#Rey*dp@2^<6Yl6u9+}}`}C>p^+&d~t_dis*Vp*tKmV_`#Qaq!#V*CW zT-TUv9eF9-@Lp6=jacnwr`G)C-`#Fay!1@?{^#|}e(n%^KQBdp|JAKu54Fm7{kDkN znHc)q{PK;d@)5Uwb$;G^d)5A_@og8*y|Vx7R+sV+Zr4pu7koMye9xPwE^%lLoS!I$zOx)w}E Wy}$KR&;D@-l{cQQelF{r5}E*r%ox@H literal 0 HcmV?d00001 diff --git a/comp/src/gb.web.form/.public/message/warning.png b/comp/src/gb.web.form/.public/message/warning.png new file mode 100644 index 0000000000000000000000000000000000000000..c67b58f0561b278ec3918e9ff812506b4d9a2617 GIT binary patch literal 588 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sa{_!qT!Hlc{SMbR``p~>duM0h zjjg^wbakuOjjjGSw))-L;tdhG4&-k0yRpUh<~E=Lum7t;A>#Y@JAlNu`rX(FBtd%b z?hd`N&G-6N-|O20AR@Q7c>)>NxA|WK>Gi$2J@Eg329VTtKZvrMTl}trEqb=u7pNDc zeH+kr-?yQ<;z0Kqmjw9*GjLQ^h<*4ZF=M*s??1Xb_IP?QU%tkYnZf(~6@N#&!uOxb zE0$aQvtc|EdLlC7{v)nqt9)ByTr(LM7%(nLAxEPE1X=xM z)^;$x{(JxIvI{0B{U*=lK3;k?@!Ne#y?vP?f3H8XFz`5c=$-Z5&v5}0n8X#oPY-wa zZ>4Y|;9Xn&{KdB#s_pmKvXy^7lhATmuHyUS<5m^3HZ*BInP>T3f4%RAZ|6AD0?fYO z*PoWPA?D}1>++A*3G}yC{EDe=;{C!9|L%81Hrsvsa|(@;2RIjBUfL+^#wE2QfrHJY z;J}Fl?pujZHn8U!WU-lKG%89?IKa0!(Scc;rY3GO9gwi(0ShnB$pgY35|R~;yvpp= z%*~DEqCJBD_cbjv`mnymkawrJ0iWvyzKiqUi(h)ZC(Z0K?{8qRGkCiCxvXU3O!^8jo|80>LVTlx2eG*P~5UZ=JKxP%k$H&RZ z$;HLR`T6gvnO%fG+B z_4W1a?CjLk)YjJ4!otG6y}k4E^Xu#DzP`S@ySwr6@#*R5xw*OT@9*d5=eM`F?d|R6 z=H`Z|BY>nBgQg(0wYB8rlew;bVyw&*E^^=XKWSbewbASY7WaYp>UO`cb6C|Llq6!9TYVztD zAOTG+Z5Ytf;Q|Wi>gmIPo-Rm*fuRu$7#e^Cj7>}-z|7p-0wiFmXaxb*Hnw&k0ec5W z5O8vKadmTd=4N2<@bm%!Zy#Sj|A0Uq28N*E5D*9r3y+A5isofth=~;ifw=gD#H8eS uJ_d#qNhnB7OV0oq%AW}ZS=reF3=9CqRVq%t%^+X^0000tB2$STtgNhGjw@V^B~yqWudlDEsi|O(Dvh9fuCA`EtgQe4|EQ>_si~>IzrTr` zbE>MUW{fkasHlH`e{zVPf0L?khoND6mQikwO>2rwYKp0;sYYRbNo0fo0000000000 zsHmuupoXl*W&Hg7|NsBj@jiIx?&*8q$;=j-0 zztG~p(c+1nvAfLQma)#3vd)*X&X=;!ma@;2u+5UM%!iw;x60g+t;&(D%a5$ejjPFv zsmF+?#)YNDgQLZSm#ehL+l;Bli>Stkrp1P&#Dt^6fuX^Ep1^yYzj&IycbL6%mb-qE zr>()(f1ba5oW6OQymy$pa+SJnlDKS;wrh^HYL2yPkF{!!v~Px;p|{U!j_vQvg5gL)iZHNwfX_=-tZ!`}+j_0~GuM?BLqc$-}+w{-P5lDtSJ};s5{u>q$gG zR2b7^V1NKdCT1v$fkg!fR9V&7*dcrlPIV0pO)YI5T`q1OUOol}emx*x-@wqw*u>OK zKoBSZ"; + Print "
    " + 'Print "displayCalendar($("; JS(Me.Name & ":entry"); "),'dd/mm/yyyy'"; '"; If(bTime And Not bChooseDate, "dd/mm/yyyy hh:nn", "dd/mm/yyyy"); + 'Print ",$("; JS(Me.Name); "),false,false);"; '; If(bTime And Not bChooseDate, "true", "false"); ","; If(bSubmit, "true", "false"); ")\""; + 'Print "\">" + 'WebForm._AddJavascript("gw.load('calendar.css');") + 'WebForm._AddJavascript("gw.load('calendar.js');") + +End + +Public Sub _UpdateProperty(sProp As String, vValue As Variant) + + If sProp = "text" Then + Try Me.Text = vValue + If Error Then Me.Refresh + Else If sProp = "#popup" Then + FCalendar.Value = Date_Read() + FCalendar.ShowPopup(Me, Align.Right) + Endif + +End + + +Public Sub Clear() + + Date_Write(Null) + +End + +Private Function ReadOnly_Read() As Boolean + + Return $bReadOnly + +End + +Private Sub ReadOnly_Write(Value As Boolean) + + $bReadOnly = Value + Me._SetProperty("ReadOnly", Value) + +End + +Private Function Date_Read() As Date + + Return $dDate + +End + +Private Sub Date_Write(Value As Date) + + $dDate = Value + Me._SetProperty("Date", Value) + Raise Change + +End + +Private Function Text_Read() As String + + If $bDateTime Then + Return Format($dDate, gb.GeneralDate) + Else + Return Format($dDate, gb.ShortDate) + Endif + +End + +Private Sub Text_Write(Value As String) + + If IsDate(Value) Or If IsNull(Value) Then + Date_Write(Val(Value)) + Else + Error.Raise("Invalid date") + Endif + +End + +Private Function DateTime_Read() As Boolean + + Return $bDateTime + +End + +Private Sub DateTime_Write(Value As Boolean) + + $bDateTime = Value + Me._SetProperty("DateTime", Value) + +End diff --git a/comp/src/gb.web.form/.src/Calendar/WebDateChooser.class b/comp/src/gb.web.form/.src/Calendar/WebDateChooser.class new file mode 100644 index 00000000..5b0d8eff --- /dev/null +++ b/comp/src/gb.web.form/.src/Calendar/WebDateChooser.class @@ -0,0 +1,244 @@ +' Gambas class file + +''' This class implements a calendar that allows to choose a date. + +Export +Inherits WebContainer + +Public Const _IsContainer As Boolean = False +Public Const _Group As String = "Chooser" +Public Const _Properties As String = "*,Value,Border" +Public Const _DrawWith As String = "DateChooser" + +'' This event is raised when the selected date has changed. +Event Change +'' This event is raised when a date has been selected by the user. +Event Click + +'' Return or set the selected date. +Property Value As Date + +Private $dDate As Date +Private $dMonth As Date +Private $dStart As Date +Private $bLock As Boolean + +Private btnPrev As WebButton +Private btnNext As WebButton +Private cmbMonth As WebComboBox +Private txtYear As WebSpinBox +Private panCalendar As WebContainer +Private $dOldDate As Date + +'' Create a new WebDateChooser control. +Public Sub _new() + + Dim hTop As WebHBox + Dim I As Integer + Dim aList As String[] + + Me.Arrangement = Arrange.Vertical + + hTop = New WebHBox(Me) + + btnPrev = New WebButton(hTop) As "btnPrev" + btnPrev.Image = "gw-arrow-left.png" + btnPrev.Border = False + + btnNext = New WebButton(hTop) As "btnNext" + btnNext.Image = "gw-arrow-right.png" + btnNext.Border = False + + cmbMonth = New WebComboBox(hTop) As "cmbMonth" + cmbMonth.ReadOnly = True + cmbMonth.Expand = True + + txtYear = New WebSpinBox(hTop) As "txtYear" + txtYear.MinValue = 1600 + txtYear.MaxValue = 9999 + txtYear.Width = "6em" + txtYear.Border = False + + panCalendar = New WebContainer(Me) As "panCalendar" + + aList = New String[] + For I = 1 To 12 + aList.Add(Format(Date(1972, I, 1), "mmmm")) + Next + cmbMonth.List = aList + + $dDate = Date(Now) + SetDate() + +End + +Private Sub SetDate(Optional iYear As Integer, Optional iMonth As Integer, Optional iDay As Integer) + + Dim dMonth As Date + Dim dDate As Date + + If $bLock Then Return + $bLock = True + + ' If iYear = 0 And If iMonth = 0 And If iDay = 0 Then + ' $dDate = CheckDate($dDate) + ' Endif + + If iYear <= 0 Then iYear = Year($dDate) + If iMonth <= 0 Then iMonth = Month($dDate) + If iDay <= 0 Then iDay = Day($dDate) + + Do + Try dDate = Date(iYear, iMonth, iDay) + If Not Error Then Break + Dec iDay + If iDay < 28 Then + dDate = Null + Break + Endif + Loop + + 'If dDate And If CheckDate(dDate) <> dDate Then dDate = Null + + If dDate Then + $dDate = dDate + dMonth = Date(Year(dDate), Month(dDate), 1) + Else + dMonth = $dMonth + $dMonth = Null + Endif + + If dMonth <> $dMonth Then + + $dMonth = dMonth + + cmbMonth.Index = Month($dMonth) - 1 + txtYear.Value = Year($dMonth) + + Endif + + iDay = WeekDay($dMonth) - System.FirstDayOfWeek + If iDay < 1 Then iDay += 7 + $dStart = $dMonth - iDay + + ' If $dDate <> $dLast Then + ' $dLast = $dDate + ' 'GetParent()._Change + ' Endif + + 'dwgMonth.SetFocus + panCalendar.Refresh + + Me._SetProperty("Value", $dDate) + + $bLock = False + + If $dDate <> $dOldDate Then + $dOldDate = $dDate + Raise Change + Endif + +End + +Public Sub panCalendar_Render() + + Dim Y As Integer + Dim X As Integer + Dim dDate As Date + Dim sClass As String + Dim dNow As Date + + Print "" + + Print "" + For X = 0 To 6 + Print "" + Next + Print "" + + dDate = Date($dStart) + dNow = Date(Now) + + For Y = 1 To 5 + Print "" + For X = 0 To 6 + Print " Month($dDate) Then sClass &= " gw-date-disabled" + sClass = Trim(sClass) + If sClass Then Print " class=\""; sClass; "\""; + If Month(dDate) = Month($dDate) Then + Print Me._GetUpdateJS("onclick", "#date", JS(CStr(dDate))); + Endif + Print ">"; Day(dDate); "" + Inc dDate + Next + Print "" + Next + + Print "
    "; Html(Format(CDate($dStart + X), "ddd")); "
    " + +End + +Public Sub cmbMonth_Click() + + SetDate(0, cmbMonth.Index + 1) + +End + +Public Sub txtYear_Change() + + SetDate(txtYear.Value, 0) + +End + +Public Sub btnPrev_Click() + + If Month($dDate) = 1 Then + SetDate(Year($dDate) - 1, 12) + Else + SetDate(0, Month($dDate) - 1) + Endif + +End + +Public Sub btnNext_Click() + + If Month($dDate) = 12 Then + SetDate(Year($dDate) + 1, 1) + Else + SetDate(0, Month($dDate) + 1) + Endif + +End + +Public Sub _UpdateProperty(sProp As String, vValue As Variant) + + Select Case sProp + + Case "#date" + $dDate = CDate(vValue) + SetDate() + Raise Click + + Default + Super._UpdateProperty(sProp, vValue) + + End Select + +End + + +Private Function Value_Read() As Date + + Return $dDate + +End + +Private Sub Value_Write(Value As Date) + + SetDate(Year(Value), Month(Value), Day(Value)) + +End diff --git a/comp/src/gb.web.form/.src/Color.class b/comp/src/gb.web.form/.src/Color.class new file mode 100644 index 00000000..cb8dace9 --- /dev/null +++ b/comp/src/gb.web.form/.src/Color.class @@ -0,0 +1,44 @@ +' Gambas class file + +''' This class provides constant for pre-defined colors and color-related methods + +Export Optional + +Public Const Default As Integer = -1 +Public Const Black As Integer = &H000000& +Public Const White As Integer = &HFFFFFF& +Public Const Gray As Integer = &H808080& +Public Const LightGray As Integer = &HC0C0C0& +Public Const DarkGray As Integer = &H404040& +Public Const Blue As Integer = &HFF& +Public Const Green As Integer = &HFF00& +Public Const Red As Integer = &HFF0000& +Public Const Yellow As Integer = &HFFFF00& +Public Const Magenta As Integer = &HFF00FF& +Public Const Cyan As Integer = &H00FFFF& +Public Const Orange As Integer = &HFF7F00& +Public Const Violet As Integer = &H7F00FF& +Public Const RoyalBlue As Integer = &H007FFF& +Public Const Pink As Integer = &HFF80FF& + +'' Change the alpha component of a color and return it. + +Static Public Sub SetAlpha(Color As Integer, Alpha As Integer) As Integer + + Return Color Or Lsl(Alpha, 24) + +End + +'' Returns a color value from its red, green, blue and alpha components. +'' +'' If ~Alpha~ is not specified, then it is assumed to be zero, i.e. you get a fully opaque color. +'' +'' [[ info +'' In Gambas, the alpha value of fully opaque colors is zero, and the alpha value of fully transparent colors is 255. +'' ]] + +Static Public Sub RGB((Red) As Integer, (Green) As Integer, (Blue) As Integer, Optional Alpha As Integer) As Integer + + Return Blue Or Lsl(Green, 8) Or Lsl(Red, 16) Or Lsl(Alpha, 24) + +End diff --git a/comp/src/gb.web.form/.src/Header.class b/comp/src/gb.web.form/.src/Header.class new file mode 100644 index 00000000..7c6ebdb4 --- /dev/null +++ b/comp/src/gb.web.form/.src/Header.class @@ -0,0 +1,36 @@ +' Gambas class file + +Static Public Form As WebForm + +Private Sub GetTitle() As String + + If Form And If Form.Title Then + Print Html(Form.Title); + Else + Print Html(Application.Title); + Endif + +End + +Private Sub GetJavascript() As String + + Dim aFiles As String[] + + aFiles = Form._GetJavascriptFiles() + If aFiles And If aFiles.Count Then Return ":" & aFiles.Join(":") + +End + +Private Sub PrintJavascriptExternFiles() + + Dim aFiles As String[] + Dim sFile As String + + aFiles = Form._GetJavascriptExternFiles() + If aFiles Then + For Each sFile In aFiles + Print "" + Next + Endif + +End diff --git a/comp/src/gb.web.form/.src/Header.webpage b/comp/src/gb.web.form/.src/Header.webpage new file mode 100644 index 00000000..ea8157f6 --- /dev/null +++ b/comp/src/gb.web.form/.src/Header.webpage @@ -0,0 +1,12 @@ + + + + + + + "> + + + <%PrintJavascriptExternFiles()%> + <%=GetTitle()%> + diff --git a/comp/src/gb.web.form/.src/Main.module b/comp/src/gb.web.form/.src/Main.module new file mode 100644 index 00000000..0ef33860 --- /dev/null +++ b/comp/src/gb.web.form/.src/Main.module @@ -0,0 +1,30 @@ +' Gambas module file + +'Public CurrentForm As WebForm + +Public Sub Main() + + 'Debug Base64(File.Load(".public/waiting.gif")) + 'Debug WebForm._GetColor(Color.Gray) + Debug Base64$(File.Load("shadow.png")) + +End + +Public Sub DumpSession() + + Dim sKey As String + + Debug String$(80, "-") + + If Session.Id Then + + For Each sKey In Session.Keys + Error sKey; ": "; JSON.Encode(Session[sKey]) + Next + + Endif + + Debug String$(80, "-") + +End + diff --git a/comp/src/gb.web.form/.src/Message/FMessage.class b/comp/src/gb.web.form/.src/Message/FMessage.class new file mode 100644 index 00000000..cacaa6ab --- /dev/null +++ b/comp/src/gb.web.form/.src/Message/FMessage.class @@ -0,0 +1,94 @@ +' Gambas class file + +Public Sub SetIcon(sIcon As String) + + imgIcon.Image = "message" &/ sIcon & ".png" + +End + +Public Sub SetText(sText As String) + + txtMessage.Text = sText + +End + +Public Sub SetButton(sButton1 As String, Optional sButton2 As String, sButton3 As String) + + If sButton1 Then + btnButton1.Text = sButton1 + Endif + + If sButton2 Then + btnButton2.Text = sButton2 + btnButton2.Show + Endif + + If sButton3 Then + btnButton3.Text = sButton3 + btnButton3.Show + Endif + +End + +Public Sub _new() + + Dim hCtrl As WebButton + + Me.Style["min-width"] = "24em" + Me.Style["min-height"] = "12em" + + For Each hCtrl In [btnButton1, btnButton2, btnButton3] + hCtrl.Style["min-width"] = "8em" + Next + + imgIcon.Style["margin-right"] = "1em" + +End + +Private Sub HandleClick() + + Dim hForm As WebForm + Dim sName As String + Dim hCtrl As WebControl + Dim sText As String + + sText = Last.Text + sName = Me["#message"] + hCtrl = WebControl.FromName(sName) + + If hCtrl Then + If Object.CanRaise(hCtrl, "Message") Then + Object.Raise(hCtrl, "Message", [hCtrl, sText]) + Else + hForm = WebControl.FromId(Me._Window).Form + Object.Raise(hForm, "Message", [hCtrl, sText]) + Endif + Endif + + Me.Close + +End + +Public Sub btnButton1_Click() + + HandleClick() + +End + +Public Sub btnButton2_Click() + + HandleClick() + +End + +Public Sub btnButton3_Click() + + HandleClick() + +End + +Public Sub WebForm_Open() + + btnButton1.SetFocus + +End diff --git a/comp/src/gb.web.form/.src/Message/FMessage.webform b/comp/src/gb.web.form/.src/Message/FMessage.webform new file mode 100644 index 00000000..bceee02e --- /dev/null +++ b/comp/src/gb.web.form/.src/Message/FMessage.webform @@ -0,0 +1,43 @@ +# Gambas Form File 3.0 + +{ WebForm WebForm + #MoveScaled(0,0,77,36) + Arrangement = Arrange.Vertical + Margin = True + Spacing = True + { WebContainer1 WebHBox + #MoveScaled(1,1,75,19) + Expand = True + Spacing = True + { WebContainer2 WebVBox + #MoveScaled(1,1,17,17) + { imgIcon WebImage + #MoveScaled(1,1,15,10) + } + } + { txtMessage WebHtml + #MoveScaled(19,1,33,17) + Expand = True + } + } + { panButton WebHBox + #MoveScaled(1,21,75,7) + Spacing = True + { WebContainer3 WebContainer + #MoveScaled(1,1,5,5) + Expand = True + } + { btnButton3 WebButton + #MoveScaled(7,1,17,5) + Visible = False + } + { btnButton2 WebButton + #MoveScaled(25,1,17,5) + Visible = False + } + { btnButton1 WebButton + #MoveScaled(43,1,17,5) + Text = ("OK") + } + } +} diff --git a/comp/src/gb.web.form/.src/Message/Message.class b/comp/src/gb.web.form/.src/Message/Message.class new file mode 100644 index 00000000..9c27c1ff --- /dev/null +++ b/comp/src/gb.web.form/.src/Message/Message.class @@ -0,0 +1,61 @@ +' Gambas class file + +Export + +Static Public Name As String + +Static Private Sub Open(sIcon As String, sTitle As String, sText As String, Optional sButton1 As String, sButton2 As String, sButton3 As String) + + Dim hMessage As FMessage + Dim sName As String + + hMessage = New FMessage + hMessage.Title = sTitle + hMessage.SetIcon(sIcon) + hMessage.SetText(sText) + hMessage.SetButton(sButton1, sButton2, sButton3) + + If Name Then + sName = Name + Else + Try sName = Last.Name + Endif + + hMessage["#message"] = sName + + hMessage.ShowModal(Null) + +End + + +Static Public Sub _call(Text As String, Optional Button As String) + + Open("info", ("Information"), Text, Button) + +End + +Static Public Sub Info(Text As String, Optional Button As String) + + _call(Text, Button) + +End + +Static Public Sub Warning(Text As String, Optional Button1 As String, Button2 As String, Button3 As String) + + Open("warning", ("Warning"), Text, Button1, Button2, Button3) + +End + +Static Public Sub Error(Text As String, Optional Button As String) + + Open("error", ("Error"), Text, Button) + +End + +Static Public Sub Question(Text As String, Optional Button1 As String, Button2 As String, Button3 As String) + + Open("question", ("Question"), Text, Button1, Button2, Button3) + +End + + diff --git a/comp/src/gb.web.form/.src/Scroll.class b/comp/src/gb.web.form/.src/Scroll.class new file mode 100644 index 00000000..6116dea0 --- /dev/null +++ b/comp/src/gb.web.form/.src/Scroll.class @@ -0,0 +1,14 @@ +' Gambas class file + +''' Constants used by the ScrollBar property of many controls. + +Export + +'' No scrollbar is visible. +Public Const None As Integer = 0 +'' The horizontal scrollbar is visible if needed. +Public Const Horizontal As Integer = 1 +'' The vertical scrollbar is visible if needed. +Public Const Vertical As Integer = 2 +'' Both horizontal and vertical scrollbars are visible if needed. +Public Const Both As Integer = 3 diff --git a/comp/src/gb.web.form/.src/Select.class b/comp/src/gb.web.form/.src/Select.class new file mode 100644 index 00000000..9fe86d76 --- /dev/null +++ b/comp/src/gb.web.form/.src/Select.class @@ -0,0 +1,12 @@ +' Gambas class file + +''' Constants used for the selection mode of WebTable control. + +Export + +'' No selection is possible. +Public Const None As Integer = 0 +'' Only one element can be selected. +Public Const Single As Integer = 1 +'' Many elements can be selected at the same time. +Public Const Multiple As Integer = 2 diff --git a/comp/src/gb.web.form/.src/Test/Embed1.class b/comp/src/gb.web.form/.src/Test/Embed1.class new file mode 100644 index 00000000..c1074686 --- /dev/null +++ b/comp/src/gb.web.form/.src/Test/Embed1.class @@ -0,0 +1,20 @@ +' Gambas class file + +Export + +Public Sub WebButton1_Click() + + 'Dim hForm As Embed2 + + 'hForm = New Embed2(WebContainer1) ', Webform1) + Dim hChild As WebDateBox + + hChild = New WebDateBox(WebContainer1) + +End + +Public Sub WebForm_Open() + + WebForm.Debug = True + +End diff --git a/comp/src/gb.web.form/.src/Test/Embed1.webform b/comp/src/gb.web.form/.src/Test/Embed1.webform new file mode 100644 index 00000000..084067a7 --- /dev/null +++ b/comp/src/gb.web.form/.src/Test/Embed1.webform @@ -0,0 +1,12 @@ +# Gambas Form File 3.0 + +{ WebForm WebForm + #MoveScaled(0,0,64,91) + { WebButton1 WebButton + #MoveScaled(1,2,29,3) + Text = ("Load Form") + } + { WebContainer1 WebVBox + #MoveScaled(1,7,62,43) + } +} diff --git a/comp/src/gb.web.form/.src/Test/Embed2.class b/comp/src/gb.web.form/.src/Test/Embed2.class new file mode 100644 index 00000000..4dbceea5 --- /dev/null +++ b/comp/src/gb.web.form/.src/Test/Embed2.class @@ -0,0 +1,10 @@ +' Gambas class file + +Export + + +Public Sub WebForm_Open() + + WebDateBox1.Value = Now + +End diff --git a/comp/src/gb.web.form/.src/Test/Embed2.webform b/comp/src/gb.web.form/.src/Test/Embed2.webform new file mode 100644 index 00000000..6ae165f2 --- /dev/null +++ b/comp/src/gb.web.form/.src/Test/Embed2.webform @@ -0,0 +1,17 @@ +# Gambas Form File 3.0 + +{ WebForm WebForm + #MoveScaled(0,0,64,91) + { WebContainer1 WebContainer + #MoveScaled(1,1,62,5) + Arrangement = Arrange.Horizontal + Spacing = True + { WebLabel1 WebLabel + #MoveScaled(1,1,12,3) + Text = ("Date") + } + { WebDateBox1 WebDateBox + #MoveScaled(14,1,30,3) + } + } +} diff --git a/comp/src/gb.web.form/.src/Test/FHello.class b/comp/src/gb.web.form/.src/Test/FHello.class new file mode 100644 index 00000000..4e8e8cbe --- /dev/null +++ b/comp/src/gb.web.form/.src/Test/FHello.class @@ -0,0 +1,8 @@ +' Gambas class file + + +Public Sub WebButton1_Click() + + Me.Close + +End diff --git a/comp/src/gb.web.form/.src/Test/FHello.webform b/comp/src/gb.web.form/.src/Test/FHello.webform new file mode 100644 index 00000000..84568cf8 --- /dev/null +++ b/comp/src/gb.web.form/.src/Test/FHello.webform @@ -0,0 +1,31 @@ +# Gambas Form File 3.0 + +{ WebForm WebForm + #MoveScaled(0,0,82,45) + Expand = True + Arrangement = Arrange.Vertical + Margin = True + Title = ("This is a very important message") + Resizable = True + { WebHtml1 WebHtml + #MoveScaled(1,1,80,11) + Text = ("

    Welcome to the gb.web.form component!

    \n

    This component aims at making web application as easy as making desktop applications.

    \n

    This goal is difficult to achieve, but I hope to succeed!

    ") + } + { WebContainer1 WebContainer + #MoveScaled(1,12,80,20) + Expand = True + } + { WebContainer2 WebContainer + #MoveScaled(1,32,80,8) + Arrangement = Arrange.Horizontal + { WebContainer3 WebContainer + #MoveScaled(1,1,57,6) + Expand = True + } + { WebButton1 WebButton + #MoveScaled(58,1,16,6) + Width = "8em" + Text = ("OK") + } + } +} diff --git a/comp/src/gb.web.form/.src/Test/FTestWebUploader.class b/comp/src/gb.web.form/.src/Test/FTestWebUploader.class new file mode 100644 index 00000000..5a74d550 --- /dev/null +++ b/comp/src/gb.web.form/.src/Test/FTestWebUploader.class @@ -0,0 +1,16 @@ +' Gambas class file + +'Export + + +Public Sub WebUploader1_Upload() + + WebImage1.Image = WebUploader1.Path + +End + +Public Sub WebForm_Open() + + WebForm.Debug = True + +End diff --git a/comp/src/gb.web.form/.src/Test/FTestWebUploader.webform b/comp/src/gb.web.form/.src/Test/FTestWebUploader.webform new file mode 100644 index 00000000..8ad84e1c --- /dev/null +++ b/comp/src/gb.web.form/.src/Test/FTestWebUploader.webform @@ -0,0 +1,18 @@ +# Gambas Form File 3.0 + +{ WebForm WebForm + #MoveScaled(0,0,64,91) + Arrangement = Arrange.Vertical + Margin = True + Spacing = True + { WebUploader1 WebUploader + #MoveScaled(1,1,62,8) + } + { WebContainer1 WebContainer + #MoveScaled(1,10,62,35) + { WebImage1 WebImage + #MoveScaled(0,0,25,24) + Border = True + } + } +} diff --git a/comp/src/gb.web.form/.src/Test/Webform1.class b/comp/src/gb.web.form/.src/Test/Webform1.class new file mode 100644 index 00000000..170123b2 --- /dev/null +++ b/comp/src/gb.web.form/.src/Test/Webform1.class @@ -0,0 +1,83 @@ +' Gambas class file + +Public Sub _new() + + WebContainer2.Style["background-color"] = "#BFDFFF" + WebHTML2.Style["font-size"] = "200%" + WebHTML2.Style["font-weight"] = "bold" + +End + +Public Sub WebButton3_Click() + + Last.Text = "Gambas rules!" + +End + +Public Sub WebForm_Open() + + WebForm.Print("Form is opened") + +End + +Public Sub WebButton2_Click() + + WebButton2.Parent.Border = Not WebButton2.Parent.Border + +End + + +Public Sub WebButton1_Click() + + Randomize + WebHTML2.Style["font-size"] = "100%" + WebHTML2.Html &= "Hello world!" + +End + +Public Sub WebForm_Event() + + WebContainer2.Refresh + +End + +Public Sub WebButton4_Click() + + WebButton4.Text = CStr(CInt(WebButton4.Text) + 1) + +End + +Public Sub WebButton5_Click() + + WebHTML2.Style["font-size"] = "200%" + WebHTML2.Html = "Header" + +End + +Public Sub WebButton6_Click() + + WebButton4.Enabled = Not WebButton4.Enabled + +End + +Public Sub btnClose_Click() + + Me.Close + +End + +Public Sub WebTextBox1_Change() + + Dim sText As String + + sText = Last.Text + + If sText Then + WebHtml1.Text = Html("You have entered: « " & sText & " ».") + WebHtml1.Visible = True + Else + WebHtml1.Text = Html("You have entered nothing.") + WebHtml1.Visible = False + Endif + +End diff --git a/comp/src/gb.web.form/.src/Test/Webform1.webform b/comp/src/gb.web.form/.src/Test/Webform1.webform new file mode 100644 index 00000000..dc71ab5e --- /dev/null +++ b/comp/src/gb.web.form/.src/Test/Webform1.webform @@ -0,0 +1,147 @@ +# Gambas Form File 3.0 + +{ WebForm WebForm + #MoveScaled(0,0,98,109) + Height = "100%" + Arrangement = Arrange.Vertical + Margin = True + Spacing = True + Title = ("gb.web.form test") + { WebMenu1 WebMenu + Text = ("WebMenu1") + { WebMenu2 WebMenu + Text = ("WebMenu2") + } + { WebMenu3 WebMenu + Text = ("WebMenu3") + } + } + { WebMenu4 WebMenu + Text = ("WebMenu4") + } + { WebContainer4 WebContainer + #MoveScaled(1,1,96,6) + Arrangement = Arrange.Horizontal + Margin = True + Border = True + { WebHTML2 WebHTML + #MoveScaled(1,1,27,4) + Expand = True + Text = ("Header") + } + { btnClose WebButton + #MoveScaled(28,1,13,4) + Border = False + Image = "gw-close.png" + } + } + { WebContainer3 WebContainer + #MoveScaled(1,8,96,48) + Expand = True + Arrangement = Arrange.Horizontal + Spacing = True + { WebContainer1 WebContainer + #MoveScaled(1,1,23,46) + Arrangement = Arrange.Vertical + Margin = True + Spacing = True + Border = True + { WebButton1 WebButton + #MoveScaled(1,1,21,5) + Text = ("Hello world!") + } + { WebButton5 WebButton + #MoveScaled(1,7,21,5) + Text = ("Reset text") + } + { WebButton3 WebButton + #MoveScaled(1,13,21,5) + Text = ("Change text") + } + { WebButton4 WebButton + #MoveScaled(1,19,21,5) + Text = ("0") + } + { WebButton2 WebButton + #MoveScaled(1,25,21,5) + Text = ("Border") + } + { WebButton6 WebButton + #MoveScaled(1,31,21,5) + Text = ("Toggle enabled") + } + } + { WebContainer5 WebContainer + #MoveScaled(25,1,65,46) + Expand = True + Arrangement = Arrange.Vertical + Margin = True + Spacing = True + Border = True + { WebTextBox1 WebTextBox + #MoveScaled(1,1,63,5) + Height = "2em" + } + { WebHtml1 WebHtml + #MoveScaled(1,7,63,5) + Visible = False + } + { WebContainer2 WebContainer + #MoveScaled(1,13,63,13) + Expand = True + Margin = True + Border = True + } + { WebHtml3 WebHtml + #MoveScaled(1,27,63,8) + Text = ("Absolute !") + } + } + } + { WebContainer6 WebContainer + #MoveScaled(1,57,96,24) + Arrangement = Arrange.Row + Spacing = True + Border = True + { WebButton7 WebButton + #MoveScaled(1,1,10,10) + Width = "8em" + Text = ("B1") + } + { WebButton11 WebButton + #MoveScaled(12,1,10,10) + Width = "8em" + Text = ("B5") + } + { WebButton13 WebButton + #MoveScaled(23,1,10,10) + Width = "8em" + Text = ("B7") + } + { WebButton12 WebButton + #MoveScaled(34,1,10,10) + Width = "8em" + Text = ("B6") + } + { WebButton8 WebButton + #MoveScaled(45,1,10,10) + Width = "8em" + Text = ("B2") + } + { WebButton9 WebButton + #MoveScaled(56,1,10,10) + Width = "8em" + Text = ("B3") + } + { WebButton10 WebButton + #MoveScaled(67,1,10,10) + Width = "8em" + Text = ("B4") + } + { WebButton14 WebButton + #MoveScaled(78,1,10,10) + Width = "8em" + Text = ("B8") + } + } +} diff --git a/comp/src/gb.web.form/.src/Test/Webform2.class b/comp/src/gb.web.form/.src/Test/Webform2.class new file mode 100644 index 00000000..b347bdae --- /dev/null +++ b/comp/src/gb.web.form/.src/Test/Webform2.class @@ -0,0 +1,146 @@ +' Gambas class file + +Public Sub _new() + + WebLabel1.Style["font-size"] = "140%" + WebLabel1.Style["padding-right"] = "1em" + +End + + +Public Sub WebButton1_Click() + + WebTabPanel1.Index = 1 + +End + +Public Sub WebContainer2_Render() + + Dim sKey As String + Dim bTable As Boolean + Dim bDark As Boolean + + If Session.Id Then + + For Each sKey In Session.Keys + If Not bTable Then + Print "" + bTable = True + Endif + If bDark Then + Print "" + Else + Print "" + Endif + Print ""; + Print "" + Print "" + bDark = Not bDark + Next + + If bTable Then Print "
    "; Html(sKey); ":"; Html(JSON.Encode(Session[sKey])); "
    " + + Endif + +End + + +Public Sub WebForm_Event() + + WebContainer2.Refresh + +End + +Public Sub WebTabPanel1_Click() + + 'If WebTabPanel1.Index = 0 Then WebTextBox1.SetFocus + +End + +Public Sub WebButton4_Click() + + WebComboBox1.Add("Item #" & CStr(WebComboBox1.Count)) + +End + +Public Sub WebButton5_Click() + + WebComboBox1.Clear + +End + +Public Sub WebTimer1_Timer() + + WebLabel1.Text = Format(Now, gb.LongTime) + +End + +Public Sub WebButton2_Click() + + Dim hForm As WebForm + + Randomize + + hForm = New FHello + hForm.Show() + hForm.Move(Rand(16, 24), Rand(4, 16), 32, 32) + +Catch + + Me.Print(Error.Text & ": " & Error.Backtrace.Join(" ")) + +End + +Public Sub WebButton6_Click() + + WebTimer1.Enabled = Not WebTimer1.Enabled + +End + +Public Sub WebSlider1_Change() + + WebSpinBox1.Value = WebSlider1.Value + +End + +Public Sub WebSpinBox1_Change() + + WebSlider1.Value = WebSpinBox1.Value + +End + +Public Sub WebButton3_Click() + + Message("Hello world!") + +End + +Public Sub WebButton7_Click() + + Message.Warning("File has been modified.

    All changes will be lost!", "Cancel", "Delete") + +End + +Public Sub WebMenu3_Click(Target As WebControl) + + Message("You have clicked on '" & Target.Name & "' control.") + +End + +Public Sub WebForm_Message(Source As WebControl, Action As String) + + 'Debug "Action '"; Action; "' on '"; Source.Name; "'" + +End + +Public Sub WebMenu4_Click(Target As WebControl) + + Message("You have clicked on '" & Target.Name & "' control.") + +End + +Public Sub WebMenuItem6_Click() + + Message.Error("Quit !") + +End diff --git a/comp/src/gb.web.form/.src/Test/Webform2.webform b/comp/src/gb.web.form/.src/Test/Webform2.webform new file mode 100644 index 00000000..4491d3ee --- /dev/null +++ b/comp/src/gb.web.form/.src/Test/Webform2.webform @@ -0,0 +1,275 @@ +# Gambas Form File 3.0 + +{ WebForm WebForm + #MoveScaled(0,0,138,122) + Height = "100%" + Arrangement = Arrange.Vertical + Title = ("This is webform2") + { WebMenuBar1 WebMenuBar + #MoveScaled(1,1,136,51) + Spacing = True + { WebMenu3 WebMenu + #MoveScaled(1,1,32,49) + Text = ("File") + { WebMenuItem7 WebMenuItem + #MoveScaled(1,1,30,4) + Text = ("New") & "..." + Image = "new.png" + Shortcut = "CTRL+N" + } + { WebMenuItem8 WebMenuItem + #MoveScaled(1,5,30,4) + Text = ("Open") & "..." + Image = "open.png" + Shortcut = "CTRL+O" + } + { WebMenu4 WebMenu + #MoveScaled(1,9,30,26) + Text = ("Project") + { WebMenuItem9 WebMenuItem + #MoveScaled(1,1,28,4) + Text = ("Compile") + Image = "new.png" + Shortcut = "F7" + } + { WebMenuItem10 WebMenuItem + #MoveScaled(1,5,28,4) + Text = ("Compile all") + Image = "new.png" + } + { WebSeparator4 WebSeparator + #MoveScaled(1,9,28,2) + } + { WebMenuItem11 WebMenuItem + #MoveScaled(1,11,28,4) + Text = ("Translate") + Shortcut = "CTRL+T" + } + { WebSeparator1 WebSeparator + #MoveScaled(1,15,28,2) + } + { WebMenuItem1 WebMenuItem + #MoveScaled(1,17,28,4) + Text = ("Teleport") + } + } + { WebSeparator5 WebSeparator + #MoveScaled(1,35,30,2) + } + { WebMenuItem6 WebMenuItem + #MoveScaled(1,37,30,4) + Text = ("Quit") + } + } + { WebMenu1 WebMenu + #MoveScaled(34,1,30,49) + Text = ("Project") + { WebMenuItem2 WebMenuItem + #MoveScaled(1,1,28,4) + Text = ("Compile") + Image = "new.png" + Shortcut = "F7" + } + { WebMenuItem3 WebMenuItem + #MoveScaled(1,5,28,4) + Text = ("Compile all") + Image = "new.png" + } + { WebSeparator2 WebSeparator + #MoveScaled(1,9,28,2) + } + { WebMenuItem4 WebMenuItem + #MoveScaled(1,11,28,4) + Text = ("Translate") + Shortcut = "CTRL+T" + } + { WebSeparator6 WebSeparator + #MoveScaled(1,15,28,2) + } + { WebMenuItem5 WebMenuItem + #MoveScaled(1,17,28,5) + Text = ("Teleport") + } + } + } + { WebContainer1 WebHBox + #MoveScaled(1,52,136,6) + Spacing = True + { WebButton1 WebButton + #MoveScaled(1,1,13,4) + Text = ("A button") + } + { WebButton2 WebButton + #MoveScaled(15,1,13,4) + Border = False + Text = ("Add window") + } + { WebButton7 WebButton + #MoveScaled(29,1,13,4) + Border = False + Text = ("Warning") + } + { WebButton6 WebButton + #MoveScaled(43,1,13,4) + Border = False + Text = ("Toggle timer") + } + { WebButton8 WebButton + #MoveScaled(57,1,13,4) + Visible = False + Text = ("Hidden") + } + { WebContainer6 WebContainer + #MoveScaled(71,1,42,4) + Expand = True + } + { WebLabel1 WebLabel + #MoveScaled(114,1,15,4) + } + } + { WebContainer9 WebContainer + #MoveScaled(1,58,136,88) + Expand = True + Arrangement = Arrange.Vertical + Margin = True + { WebTabPanel1 WebTabPanel + #MoveScaled(1,1,134,82) + Expand = True + Arrangement = Arrange.Vertical + Margin = True + Spacing = True + Count = 3 + Index = 0 + Text = ("General") + { WebTextBox1 WebTextBox + #MoveScaled(1,1,131.75,4) + Text = ("Hello !") + } + { WebCheckBox1 WebCheckBox + #MoveScaled(1,6,131.75,4) + Text = ("Check and uncheck me!") + } + { WebContainer5 WebHBox + #MoveScaled(1,11,131.75,6) + Spacing = True + { WebComboBox2 WebComboBox + #MoveScaled(1,1,22,4) + List = [("Élément 1"), ("Élément 2"), ("Élément 3"), ("Élément 4")] + } + { WebTextBox2 WebTextBox + #MoveScaled(24,1,15,4) + } + { WebDateBox2 WebDateBox + #MoveScaled(40,1,24,4) + } + { WebSpinBox1 WebSpinBox + #MoveScaled(65,1,13,4) + } + { WebSlider1 WebSlider + #MoveScaled(79,1,49,4) + Expand = True + Border = False + } + } + { WebContainer3 WebHBox + #MoveScaled(1,18,131.75,6) + Spacing = True + { WebDateBox1 WebDateBox + #MoveScaled(1,1,24,4) + } + { WebComboBox1 WebComboBox + #MoveScaled(26,1,65.75,4) + Width = "30em" + List = [("Élément 1"), ("Élément 2"), ("Élément 3"), ("Élément 4")] + ReadOnly = False + } + { WebButton4 WebButton + #MoveScaled(92.75,1,19,4) + Text = ("New element") + } + { WebButton5 WebButton + #MoveScaled(112.75,1,19,4) + Text = ("Clear") + } + { WebSeparator3 WebSeparator + #MoveScaled(132.75,1,11,4) + Ignore = True + } + } + { WebSeparator7 WebSeparator + #MoveScaled(1,25,131.75,2) + Height = "1em" + } + { WebContainer7 WebExpander + #MoveScaled(1,28,131.75,32) + Background = &HA0FF7F00& + Arrangement = Arrange.Horizontal + Spacing = True + Indent = True + Text = ("This is an expander container") + Hidden = True + { WebContainer4 WebVBox + #MoveScaled(1.125,1.125,64,25.75) + Expand = True + Background = &H80FFFF00& + Margin = True + { WebRadioButton1 WebRadioButton + #MoveScaled(1,1,62,4) + Text = ("Alpha") + } + { WebRadioButton2 WebRadioButton + #MoveScaled(1,5,62,4) + Text = ("Beta") + Value = True + } + { WebRadioButton3 WebRadioButton + #MoveScaled(1,9,62,4) + Text = ("Gamma") + } + { WebCheckBox2 WebCheckBox + #MoveScaled(1,13,62,4) + Text = ("Gambas Almost Means Basic!") + } + } + { WebContainer8 WebVBox + #MoveScaled(66.125,1.125,58.375,25.75) + Expand = True + Spacing = True + { WebLabel2 WebLabel + #MoveScaled(1,1,56.375,4) + Text = ("Please enter some text:") + } + { WebTextArea1 WebTextArea + #MoveScaled(1,6,56.375,24) + Height = "20em" + Expand = True + Wrap = True + } + } + } + { WebHBox2 WebHBox + #MoveScaled(1,61,131.75,11) + { WebImage1 WebImage + #MoveScaled(1,1,9,9) + Width = "8em" + Image = "message/close.svg" + } + } + Index = 1 + Text = ("Options") + { WebButton3 WebButton + #MoveScaled(1,1,131.75,8) + Text = ("Test") + } + Index = 2 + Text = ("Application state") + { WebContainer2 WebContainer + #MoveScaled(1,1,131.75,32) + } + Index = 0 + } + } + { WebTimer1 WebTimer + #MoveScaled(70,8) + } +} diff --git a/comp/src/gb.web.form/.src/Test/Webform3.class b/comp/src/gb.web.form/.src/Test/Webform3.class new file mode 100644 index 00000000..46ee490b --- /dev/null +++ b/comp/src/gb.web.form/.src/Test/Webform3.class @@ -0,0 +1,75 @@ +' Gambas class file + + +Public Sub _new() + + Dim I As Integer + + WebForm.Debug = True + + WebTable1.Columns.Count = 12 + For I = 0 To WebTable1.Columns.Count - 1 + WebTable1.Columns[I].Text = Chr$(65 + I) + WebTable1.Columns[I].Wrap = False + WebTable1.Columns[I].Sortable = I Mod 3 + Next + 'WebTable1.Columns[3].Expand = True + + WebTable1.Count = 1000 + 'WebTable1.Select(2, 3) + +End + +Public Sub WebForm_Open() + +End + + +Public Sub WebTable1_Data(Row As Integer, Column As Integer, Data As WebTableData) + + Data.Text = "This is the " & CStr(Row) & ":" & CStr(Column) & " cell" + 'Data.Text = 1 / 0 + +End + +Public Sub WebContainer1_Render() + + Dim sKey As String + Dim bTable As Boolean + Dim bDark As Boolean + + If Session.Id Then + + For Each sKey In Session.Keys + If Not bTable Then + Print "" + bTable = True + Endif + If bDark Then + Print "" + Else + Print "" + Endif + Print ""; + Print "" + Print "" + bDark = Not bDark + Next + + If bTable Then Print "
    "; Html(sKey); ":"; Html(JSON.Encode(Session[sKey])); "
    " + + Endif + +End + +Public Sub WebButton1_Click() + + Message.Warning("Ceci est une table avec " & WebTable1.Count & " éléments !") + +End + +Public Sub WebTable1_Select() + + WebForm.Print("Select: " & WebTable1.Selection.Count) + +End diff --git a/comp/src/gb.web.form/.src/Test/Webform3.webform b/comp/src/gb.web.form/.src/Test/Webform3.webform new file mode 100644 index 00000000..738fed7a --- /dev/null +++ b/comp/src/gb.web.form/.src/Test/Webform3.webform @@ -0,0 +1,41 @@ +# Gambas Form File 3.0 + +{ WebForm WebForm + #MoveScaled(0,0,106,85) + Height = "100%" + Arrangement = Arrange.Vertical + Margin = True + Spacing = True + { WebTabPanel1 WebTabPanel + #MoveScaled(1,1,104,69) + Height = "32em" + Expand = True + Arrangement = Arrange.Vertical + Margin = True + Spacing = True + Count = 2 + Index = 0 + Text = ("Tab 1") + { WebButton1 WebButton + #MoveScaled(1,1,101.7143,4) + Text = ("Message") + } + { WebTable1 WebTable + #MoveScaled(1,6,101.7143,32) + Expand = True + Mode = Select.Multiple + Sortable = True + } + Index = 1 + Text = ("Tab 2") + { WebContainer1 WebContainer + #MoveScaled(1,1,101.7143,32) + } + Index = 0 + } + { WebHBox1 WebHBox + #MoveScaled(1,71,104,9) + Height = "6em" + Border = True + } +} diff --git a/comp/src/gb.web.form/.src/Test/Webform4.class b/comp/src/gb.web.form/.src/Test/Webform4.class new file mode 100644 index 00000000..02645880 --- /dev/null +++ b/comp/src/gb.web.form/.src/Test/Webform4.class @@ -0,0 +1,41 @@ +' Gambas class file + +Public Sub _new() + + WebForm.Debug = True + +End + + +Public Sub WebUploadArea1_Progress() + + btnSelectFile.Enabled = False + WebProgressBar1.Value = WebUploadArea1.Progress + +End + +Public Sub WebUploadArea1_Upload() + + Dim sPath As String + + btnSelectFile.Enabled = True + + WebForm.Print("upload") + For Each sPath In Request.Files + Message(Request.Files.Key & ": " & sPath) + Next + +End + + +Public Sub WebButton1_Click() + + Webform5.Show + +End + +Public Sub WebButton2_Click() + + Webform5.Hide + +End diff --git a/comp/src/gb.web.form/.src/Test/Webform4.webform b/comp/src/gb.web.form/.src/Test/Webform4.webform new file mode 100644 index 00000000..93e1d329 --- /dev/null +++ b/comp/src/gb.web.form/.src/Test/Webform4.webform @@ -0,0 +1,45 @@ +# Gambas Form File 3.0 + +{ WebForm WebForm + #MoveScaled(0,0,107,26) + Arrangement = Arrange.Horizontal + Margin = True + Spacing = True + { WebContainer3 WebVBox + #MoveScaled(1,1,60,24) + Spacing = True + { WebContainer2 WebHBox + #MoveScaled(1,1,58,8) + { WebUploadArea1 WebUploadArea + #MoveScaled(1,1,21,6) + { btnSelectFile WebButton + #MoveScaled(1,1,16,4) + Text = ("Select file") & "..." + } + } + } + { WebProgressBar1 WebProgressBar + #MoveScaled(1,10,58,4) + } + } + { WebContainer1 WebContainer + #MoveScaled(62,1,27,24) + Width = "10em" + Arrangement = Arrange.Vertical + { WebDateBox1 WebDateBox + #MoveScaled(1,1,25,4) + } + { WebButton1 WebButton + #MoveScaled(1,5,25,4) + Text = ("Show") + } + { WebButton2 WebButton + #MoveScaled(1,9,25,4) + Text = ("Hide") + } + } + { WebTimer1 WebTimer + #MoveScaled(93,7) + Delay = 500 + } +} diff --git a/comp/src/gb.web.form/.src/Test/Webform5.class b/comp/src/gb.web.form/.src/Test/Webform5.class new file mode 100644 index 00000000..3dab0df7 --- /dev/null +++ b/comp/src/gb.web.form/.src/Test/Webform5.class @@ -0,0 +1,16 @@ +' Gambas class file + + +Public Sub WebForm_Open() + + Dim M As Integer + Dim aMonth As String[] + + aMonth = New String[] + + For M = 1 To 12 + aMonth.Add(Format(Date(1972, M, 1), "mmmm")) + Next + cmbMonth.List = aMonth + +End diff --git a/comp/src/gb.web.form/.src/Test/Webform5.webform b/comp/src/gb.web.form/.src/Test/Webform5.webform new file mode 100644 index 00000000..b634e4c6 --- /dev/null +++ b/comp/src/gb.web.form/.src/Test/Webform5.webform @@ -0,0 +1,25 @@ +# Gambas Form File 3.0 + +{ WebForm WebForm + #MoveScaled(0,0,64,29) + Arrangement = Arrange.Vertical + Spacing = True + Persistent = True + { WebHBox1 WebHBox + #MoveScaled(1,1,62,7) + { WebButton1 WebButton + #MoveScaled(1,1,11,5) + Image = "gw-arrow-left.png" + } + { cmbMonth WebComboBox + #MoveScaled(12,1,24,5) + } + { WebButton2 WebButton + #MoveScaled(36,1,16,5) + Image = "gw-arrow-right.png" + } + } + { WebContainer1 WebContainer + #MoveScaled(1,9,62,18) + } +} diff --git a/comp/src/gb.web.form/.src/Test/Webform6.class b/comp/src/gb.web.form/.src/Test/Webform6.class new file mode 100644 index 00000000..0d4a779b --- /dev/null +++ b/comp/src/gb.web.form/.src/Test/Webform6.class @@ -0,0 +1,20 @@ +' Gambas class file + + +Public Sub WebForm_Open() + + WebForm.Debug = True + +End + +Public Sub WebComboBox1_Click() + + Message(WebComboBox1.Text) + +End + +Public Sub WebButton2_Click() + + Message(Html("TextBox: " & WebTextBox1.Text) & "

    " & Html("TextArea: " & WebTextArea1.Text)) + +End diff --git a/comp/src/gb.web.form/.src/Test/Webform6.webform b/comp/src/gb.web.form/.src/Test/Webform6.webform new file mode 100644 index 00000000..1156f563 --- /dev/null +++ b/comp/src/gb.web.form/.src/Test/Webform6.webform @@ -0,0 +1,30 @@ +# Gambas Form File 3.0 + +{ WebForm WebForm + #MoveScaled(0,0,74,91) + Arrangement = Arrange.Vertical + Margin = True + Spacing = True + { WebComboBox1 WebComboBox + #MoveScaled(1,1,72,4) + List = [(""), ("Élément 1"), ("Élément 2"), ("Élément 3")] + } + { WebTextBox1 WebTextBox + #MoveScaled(1,6,72,4) + } + { WebTextArea1 WebTextArea + #MoveScaled(1,11,72,16) + } + { WebHBox1 WebHBox + #MoveScaled(1,28,72,7) + Spacing = True + { WebButton1 WebButton + #MoveScaled(1,1,16,5) + Text = ("Copy") + } + { WebButton2 WebButton + #MoveScaled(18,1,16,5) + Text = ("Text") + } + } +} diff --git a/comp/src/gb.web.form/.src/Test/Webform7.class b/comp/src/gb.web.form/.src/Test/Webform7.class new file mode 100644 index 00000000..1f6be946 --- /dev/null +++ b/comp/src/gb.web.form/.src/Test/Webform7.class @@ -0,0 +1,4 @@ +' Gambas class file + +'Export + diff --git a/comp/src/gb.web.form/.src/Test/Webform7.webform b/comp/src/gb.web.form/.src/Test/Webform7.webform new file mode 100644 index 00000000..6f2158b1 --- /dev/null +++ b/comp/src/gb.web.form/.src/Test/Webform7.webform @@ -0,0 +1,15 @@ +# Gambas Form File 3.0 + +{ WebForm WebForm + #MoveScaled(0,0,64,91) + { WebContainer4 WebContainer + #MoveScaled(1,1,62,5) + { WebLabel1 WebLabel + #MoveScaled(1,1,12,3) + Text = ("Name") + } + { WebTextBox1 WebTextBox + #MoveScaled(13,1,27,3) + } + } +} diff --git a/comp/src/gb.web.form/.src/Test/Webform8.class b/comp/src/gb.web.form/.src/Test/Webform8.class new file mode 100644 index 00000000..cf218917 --- /dev/null +++ b/comp/src/gb.web.form/.src/Test/Webform8.class @@ -0,0 +1,13 @@ +' Gambas class file + +'Export + + +Public Sub WebButton1_Click() + + Dim hForm As Webform7 + + Debug + hForm = New Webform7(WebContainer1) + +End diff --git a/comp/src/gb.web.form/.src/Test/Webform8.webform b/comp/src/gb.web.form/.src/Test/Webform8.webform new file mode 100644 index 00000000..b527caf4 --- /dev/null +++ b/comp/src/gb.web.form/.src/Test/Webform8.webform @@ -0,0 +1,12 @@ +# Gambas Form File 3.0 + +{ WebForm WebForm + #MoveScaled(0,0,64,91) + { WebButton1 WebButton + #MoveScaled(2,1,18,4) + Text = ("Load Form") + } + { WebContainer1 WebContainer + #MoveScaled(2,6,59,43) + } +} diff --git a/comp/src/gb.web.form/.src/WebButton.class b/comp/src/gb.web.form/.src/WebButton.class new file mode 100644 index 00000000..3f1579a1 --- /dev/null +++ b/comp/src/gb.web.form/.src/WebButton.class @@ -0,0 +1,141 @@ +' Gambas class file + +''' This class implements a push button. + +Export +Inherits WebControl + +Public Const _Properties As String = "*,Border=True,Text,Image{WebImage},Immediate" +'Public Const _DrawWith As String '= "Button" +Public Const _DefaultEvent As String = "Click" +Public Const _DefaultSize As String = "16,4" + +'' This event is raised when the button is pressed. +'' +'' ### See also +'' [../immediate] +Event Click + +'' Return or set the button text. +Property Text As String +'' Return or set the button image relative path. +Property Image As String +'' If the Immediate property is set, the [../click] event is raised to generate javascript code that will be executed on the client side when +'' the button is clicked. +'' +'' In that case, the Click event handler should only call methods that generate javascript on the client side: +'' - [../../webform/exec](WebForm.Exec) +'' - [../../webtextbox/copy](WebTextBox.Copy) +'' - ... +Property Immediate As Boolean + +Private $sText As String +Private $sImage As String +Private $bImmediate As Boolean + +'' Create a new WebButton control. + +Public Sub _new() + +End + + +Private Function Text_Read() As String + + Return $sText + +End + +Private Sub Text_Write(Value As String) + + If $sText = Value Then Return + $sText = Value + Me._SetProperty("Text", Value) + +End + +Private Function Image_Read() As String + + Return $sImage + +End + +Private Sub Image_Write(Value As String) + + If $sImage = Value Then Return + $sImage = Value + Me._SetProperty("Image", Value) + +End + +Public Sub _BeforeRender() + + Dim vSave As Variant + + Print ""; + +End + + +Public Sub _Render() + + If $sImage Then + Print "

    "; + Endif + If $sText Then Print ""; Html($sText); ""; + +End + +Public Sub _AfterRender() + + Raise Render + Print "" + +End + +'' Click on the button. + +Public Sub Click() + + Object.Raise(Me, "Click") + +End + +Private Function Immediate_Read() As Boolean + + Return $bImmediate + +End + +Private Sub Immediate_Write(Value As Boolean) + + If $bImmediate = Value Then Return + $bImmediate = Value + Me._SetProperty("Immediate", Value) + +End diff --git a/comp/src/gb.web.form/.src/WebCheckBox.class b/comp/src/gb.web.form/.src/WebCheckBox.class new file mode 100644 index 00000000..79ccd984 --- /dev/null +++ b/comp/src/gb.web.form/.src/WebCheckBox.class @@ -0,0 +1,71 @@ +' Gambas class file + +''' This class implements a check-box control. + +Export +Inherits WebControl + +Public Const _Properties As String = "*,Text,Value" +Public Const _DrawWith As String = "CheckBox" +Public Const _DefaultSize As String = "24,4" +Public Const _Similar As String = "WebButton" +Public Const _DefaultEvent As String = "Click" + +'' This event is raised when the check-box is toggled. +Event Click + +'' Return or set if the control is checked. +Property Value, Checked As Boolean +'' Return or set the text displayed beside the check mark. +Property Text As String + +Private $sText As String +Private $bChecked As Boolean + +Private Function Text_Read() As String + + Return $sText + +End + +Private Sub Text_Write(Value As String) + + If $sText = Value Then Return + $sText = Value + Me._SetProperty("Text", Value) + +End + +Public Sub _Render() + + If $sText Then Print ""; + Print + +End + +Public Sub _UpdateProperty(sProp As String, vValue As Variant) + + If sProp = "value" Then Try Value_Write(vValue) + +End + + +Private Function Value_Read() As Boolean + + Return $bChecked + +End + +Private Sub Value_Write(Value As Boolean) + + If $bChecked = Value Then Return + $bChecked = Value + Me._SetProperty("Value", Value) + Raise Click + +End diff --git a/comp/src/gb.web.form/.src/WebComboBox.class b/comp/src/gb.web.form/.src/WebComboBox.class new file mode 100644 index 00000000..c6edcf2a --- /dev/null +++ b/comp/src/gb.web.form/.src/WebComboBox.class @@ -0,0 +1,269 @@ +' Gambas class file + +''' This class implements a combo-box control. + +Export +Inherits WebControl + +Public Const _Properties As String = "*,Border=True,List,ReadOnly=True,PlaceHolder,Text" +Public Const _DrawWith As String = "ComboBox" +Public Const _DefaultSize As String = "24,4" +Public Const _Similar As String = "WebTextBox" +Public Const _DefaultEvent As String = "Click" + +'' This event is raised when an item is selected in the list box. +Event Click +'' This event is raised when the combo-box text has changed. Works only if the combo-box is editable. +Event Change +'' This event is raised when the ENTER key is hit. Works only if the combo-box is editable. +Event Activate + +'' Return or set the combo-box text. +Property Text As String +'' Return the number of items in the combo-box popup. +Property Read Count As Integer +'' Return or set the index of the current selected item. +Property Index As Integer +'' Return or set the contents of the combo-box popup as a string array. +Property List As String[] +'' Return or set if the combo-box is read-only, i.e. not editable. +Property ReadOnly As Boolean +'' Return or set the placeholder text displayed when the editable combo-box is empty. +Property PlaceHolder As String + +Private $iIndex As Integer +Private $sText As String +Private $aList As New String[] +Private $bReadOnly As Boolean = True +Private $sPlaceHolder As String + +'' Create a new WebComboBox control. + +Public Sub _new() + + Me._Proxy = ":entry" + +End + + +Public Sub _BeforeRender() + + Dim sClass As String + + If $bReadOnly Then + sClass = "gw-selectbox" + Else + sClass = "gw-combobox" + Endif + + Print "" + +End + +Public Sub _Render() + + Dim I As Integer + + If Not $bReadOnly Then + Print ""; + Print "
    "; + Endif + + Print ""; + + If Not $bReadOnly Then + Print "
    "; + WebForm._AddJavascript("gw.resizeComboBox(" & JS(Me.Name) & ")") + Endif + Print + +End + +Public Sub _UpdateProperty(sProp As String, vValue As Variant) + + If sProp = "index" Then + Try Me.Index = vValue + Else If sProp = "text" Then + Try Me.Text = vValue + Endif + +End + +Private Function Index_Read() As Integer + + Return $iIndex + +End + +Private Sub Index_Write(Value As Integer) + + If Value < -1 Or If Value >= $aList.Count Then Error.Raise("Out of bounds") + If $iIndex = Value Then Return + + $iIndex = Value + If Not $bReadOnly Then + If $iIndex < 0 Then + $sText = "" + Else + $sText = $aList[$iIndex] + Endif + Me._SetProperty("Text", $sText) + Endif + Me._SetProperty("Index", $iIndex) + Raise Click + +End + +Private Function Count_Read() As Integer + + Return $aList.Count + +End + +Private Function List_Read() As String[] + + Return $aList.Copy() + +End + +Private Sub CheckIndex() + + If $iIndex < 0 Or If $iIndex >= $aList.Count Then + If $aList.Count = 0 Then + Index_Write(-1) + Else + Index_Write(0) + Endif + Endif + +End + +Private Sub List_Write(Value As String[]) + + If Value Then + $aList = Value.Copy() + Else + $aList = New String[] + Endif + CheckIndex + Me._SetProperty("List", $aList) + +End + +'' Clear the contents of the combo-box and its popup. +Public Sub Clear() + + $aList.Clear + Index_Write(-1) + Me._SetProperty("List", $aList) + If Not $bReadOnly Then Text_Write("") + +End + +Private Function ReadOnly_Read() As Boolean + + Return $bReadOnly + +End + +Private Sub ReadOnly_Write(Value As Boolean) + + $bReadOnly = Value + If $bReadOnly Then + Me._Proxy = "" + Else + Me._Proxy = ":entry" + Endif + Me._SetProperty("ReadOnly", Value) + +End + +'' Add an item to the popup list. +'' +'' - ~Item~ is the text of the item to add. +'' - ~Index~ is the position the item will be inserted from. If not specified, the item is added at the end of the popup list. + +Public Sub Add(Item As String, Optional Index As Integer = -1) + + $aList.Add(Item, Index) + CheckIndex + Me._SetProperty("List", $aList) + +End + +'' Remove an item from the popup list. +'' +'' - ~Index~ is the index of the item to remove, between 0 and [../count] - 1. + +Public Sub Remove(Index As Integer) + + $aList.Remove(Index) + CheckIndex + Me._SetProperty("List", $aList) + +End + +Private Function Text_Read() As String + + If $bReadOnly Then + Try Return $aList[$iIndex] + Return -1 + Else + Return $sText + Endif + +End + +Private Sub Text_Write(Value As String) + + If $bReadOnly Then + + Index_Write($aList.Find(Value)) + + Else + + If $sText = Value Then Return + $sText = Value + + Inc Me._NoRefresh + Me._SetProperty("Text", Value) + Dec Me._NoRefresh + + If Me._CanRefresh() Then WebForm._AddJavascript("$(" & JS(Me.Name & ":entry") & ").value = " & JS($sText)) + + Raise Change + + Endif + +End + +Private Function PlaceHolder_Read() As String + + Return $sPlaceHolder + +End + +Private Sub PlaceHolder_Write(Value As String) + + $sPlaceHolder = Value + Me._SetProperty("PlaceHolder", Value) + +End diff --git a/comp/src/gb.web.form/.src/WebContainer.class b/comp/src/gb.web.form/.src/WebContainer.class new file mode 100644 index 00000000..2f0d926f --- /dev/null +++ b/comp/src/gb.web.form/.src/WebContainer.class @@ -0,0 +1,445 @@ +' Gambas class file + +''' This class implements a generic container for other controls. +''' +''' It is also the parent class of every other container. + +Export + +Inherits WebControl + +Public Const _IsContainer As Boolean = True +Public Const _Group As String = "Container" +Public Const _Properties As String = "*,Arrangement{Arrange.*},Margin,Spacing,Indent,Border" +Public Const _DefaultArrangement As String = "F" +Public Const _DefaultSize As String = "32,32" + +'' Return or set the how the container arrange its contents. +'' +'' The value of that property can be one of the value of the [../arrange] class. +Property Arrangement As Integer +'' Return or set if there is a margin between the container border and all its children. +'' +'' The margin size is 0.5em. +Property Margin As Boolean +'' Return or set if the children of the container are spaced out. +'' +'' The amount of space is 0.5em. +Property Spacing As Boolean +'' Return or set if the container has a border. +Property Border As Boolean +'' Return or set if the children controls of the container are indented. +'' +'' The direction of the indentation follows the direction of the container arrangement. +'' +'' The amount of indentation is 0.5em. +Property Indent As Boolean + +'' Return an array of all container's children. +Property Read Children As WebControl[] + +Public _Container As WebContainer + +Private $aChildren As New String[] +Private $aExtraChildren As New String[][] +Private $iArrangement As Integer +Private $bMargin As Boolean +Private $bSpacing As Boolean +Private $bBorder As Boolean +Private $bIndent As Boolean + + +'' Create a new WebContainer. +Public Sub _new() + +End + + +Public Sub _Add(hChild As WebControl) + + Dim aExtraChild As String[] + Dim hParent As WebControl + + $aChildren.Add(hChild.Name) + + Inc Me._NoRefresh + + If WebForm._InExec And If Not Object.IsLocked(Me) Then + 'If Not Object.IsLocked(Me) Then + + 'Debug "Add extra "; hChild.Name; " to "; Me.Name + hChild._Extra = True + aExtraChild = [hChild.Name, Object.Type(hChild)] + + If hChild._EventName Then + aExtraChild.Add(hChild._EventName) + Try hParent = Object.Parent(hChild) + If Not Error Then aExtraChild.Add(hParent.Name) + Endif + + $aExtraChildren.Add(aExtraChild) + + Me._SetProperty("#extra", $aExtraChildren) + + Endif + + Me._SetProperty("#children", $aChildren) + + Dec Me._NoRefresh + + If Me._CanRefresh() Then + WebForm._AddJavascriptBefore("gw.insertElement(" & JS(hChild.Name) & "," & JS(Me.Name) & ")") + hChild.Refresh + Endif + +End + +Public Sub _Remove(hChild As WebControl) + + Dim iPos As Integer + + $aChildren.Remove($aChildren.Find(hChild.Name)) + + Inc Me._NoRefresh + + If hChild._Extra Then + + For iPos = 0 To $aExtraChildren.Max + If $aExtraChildren[iPos][0] = hChild.Name Then + 'Debug "Remove extra "; hChild.Name; " from "; Me.Name + $aExtraChildren.Remove(iPos) + Me._SetProperty("#extra", $aExtraChildren) + Break + Endif + Next + + Endif + + Me._SetProperty("#children", $aChildren) + + Dec Me._NoRefresh + + If Me._CanRefresh() Then + WebForm._AddJavascript("gw.removeElement(" & JS(hChild.Name) & ")") + Endif + +End + +Public Sub _UpdateChildName(sOld As String, sNew As String) + + $aChildren[$aChildren.Find(sOld)] = sNew + +End + + +Public Sub _IsFirstVisibleChild(hChild As WebControl) As Boolean + + Dim I As Integer + Dim hCtrl As WebControl + + For I = 0 To $aChildren.Max + If $aChildren[I] = hChild.Name Then Return True + hCtrl = WebControl.FromName($aChildren[I]) + If hCtrl.Visible And If Not hCtrl.Ignore Then Return + Next + +End + +Public Sub _InitProperties() + + Dim I As Integer + + Super._InitProperties() + + For I = 0 To $aChildren.Max + WebControl.FromName($aChildren[I])._InitProperties() + Next + +End + +Public Sub _Render() + + Dim I As Integer + + For I = 0 To $aChildren.Max + With WebControl.FromName($aChildren[I]) + 'If Not .Visible Then Continue + ._BeforeRender() + ._Render() + ._AfterRender() + End With + Next + +End + +Public Sub _RenderStyleSheet() + + 'Dim I As Integer + + Me._StartStyleSheet + + Super._RenderStyleSheet() + + If Not _Container And If Me.Visible Then + + If $iArrangement Then + + Me._AddStyleSheet("display:flex;") + Select Case $iArrangement + Case Arrange.Horizontal + Me._AddStyleSheet("flex-flow:row;") + Me._AddStyleSheet("overflow-x:hidden;") + Case Arrange.Vertical + Me._AddStyleSheet("flex-flow:column;") + Case Arrange.Column + Me._AddStyleSheet("flex-flow:column wrap;") + 'If $bSpacing And If $aChildren.Count Then Me._AddStyleSheet("margin-right:-0.5em;margin-bottom:-0.5em;") + Case Arrange.Row + Me._AddStyleSheet("flex-flow:row wrap;") + 'If $bSpacing And If $aChildren.Count Then Me._AddStyleSheet("margin-right:-0.5em;margin-bottom:-0.5em;") + End Select + + Endif + + If $bMargin Then Me._AddStyleSheet("padding:0.5rem;") + + If $bIndent Then + If $bMargin Then + Me._AddStyleSheet("padding-left:1rem;") + Else + Me._AddStyleSheet("padding-left:0.5rem;") + Endif + Endif + + If $bSpacing Then + If $iArrangement = Arrange.Column Or If $iArrangement = Arrange.Row Then + Me._AddStyleSheet("padding-bottom: 0;") + Me._AddStyleSheet("padding-right: 0;") + Endif + Endif + + Endif + + If $bBorder Then Me._AddStyleSheet("border:solid #C0C0C0 1px;") + + Me._EndStyleSheet + + ' For I = 0 To $aChildren.Max + ' With WebControl.FromId($aChildren[I]) + ' ._RenderStyleSheet() + ' End With + ' Next + +End + +Private Function Arrangement_Read() As Integer + + Return $iArrangement + +End + +Private Sub Arrangement_Write(Value As Integer) + + $iArrangement = Value + Me._SetProperty("Arrangement", Value) + UpdateContainer() + +End + +Private Function Margin_Read() As Boolean + + Return $bMargin + +End + +Private Sub Margin_Write(Value As Boolean) + + $bMargin = Value + Me._SetProperty("Margin", Value) + UpdateContainer() + +End + +Private Function Spacing_Read() As Boolean + + Return $bSpacing + +End + +Private Sub Spacing_Write(Value As Boolean) + + $bSpacing = Value + Me._SetProperty("Spacing", Value) + UpdateContainer() + +End + +Private Function Border_Read() As Boolean + + Return $bBorder + +End + +Private Sub Border_Write(Value As Boolean) + + $bBorder = Value + Me._SetProperty("Border", Value) + +End + +Public Sub _RefreshReply() As Boolean + + Dim I As Integer + + If Super._RefreshReply() Then Return + + For I = 0 To $aChildren.Max + WebControl.FromName($aChildren[I])._RefreshReply() + Next + +End + +Public Sub _SetContainer(hCont As WebContainer) + + _Container = hCont + UpdateContainer() + +End + +Private Sub UpdateContainer() + + If Not _Container Then Return + + With _Container + .Arrangement = $iArrangement + .Spacing = $bSpacing + .Margin = $bMargin + End With + +End + +Private Function Children_Read() As WebControl[] + + Dim aChildren As WebControl[] + Dim I As Integer + + aChildren = New WebControl[$aChildren.Count] + For I = 0 To $aChildren.Max + aChildren[I] = WebControl.FromName($aChildren[I]) + Next + Return aChildren +End + +Public Sub _InitSpecialProperty(sProp As String, vVal As Variant) + + Dim I As Integer + Dim sClass As String + Dim sName As String + Dim hCtrl As WebControl + Dim hForm As WebForm + Dim sEventName As String + Dim aExtraChildren As String[][] + Dim aExtraChild As String[] + Dim sParentName As String + + If sProp = "#extra" Then + + hForm = Me.Form + aExtraChildren = vVal + + For I = 0 To aExtraChildren.Max + + aExtraChild = aExtraChildren[I] + + sName = aExtraChild[0] + sClass = aExtraChild[1] + + WebControl._NextName = sName + hCtrl = Object.New(sClass, [Me]) + + If aExtraChild.Count = 4 Then + sEventName = aExtraChild[2] + sParentName = aExtraChild[3] + 'Debug sName;; sClass; sEventName;; WebControl.FromName(sParentName) + If sEventName Then Object.Attach(hCtrl, WebControl.FromName(sParentName), sEventName) + Endif + + hCtrl._Extra = True + + 'WebForm.Print(WebControl._GetNames()) + + ' TODO: attach to the real form + 'If Left(sName) <> "$" Then Object.Attach(hCtrl, hForm, sName) + + Next + + $aExtraChildren = aExtraChildren + + Else If sProp = "#children" Then + + $aChildren = vVal + Me.Refresh + + Endif + +End + +Public Sub _Raise(sName As String) + + Dim iPos As Integer + + iPos = $aChildren.Find(sName) + If iPos < 0 Then Return + + $aChildren.Remove(iPos) + $aChildren.Add(sName) + Me._SetProperty("#children", $aChildren) + +End + +Public Sub _Lower(sName As String) + + Dim iPos As Integer + + iPos = $aChildren.Find(sName) + If iPos < 0 Then Return + + $aChildren.Remove(iPos) + $aChildren.Add(sName, 0) + Me._SetProperty("#children", $aChildren) + +End + +'' Delete all container's children. + +Public Sub DeleteChildren() + + While $aChildren.Count + WebControl.FromName($aChildren[0]).Delete + Wend + +End + +'' Delete the container with all its children. + +Public Sub Delete() + + Inc WebForm._DisableRefresh + DeleteChildren + Dec WebForm._DisableRefresh + Super.Delete + +End + +Private Function Indent_Read() As Boolean + + Return $bIndent + +End + +Private Sub Indent_Write(Value As Boolean) + + $bIndent = Value + Me._SetProperty("Indent", Value) + +End diff --git a/comp/src/gb.web.form/.src/WebControl.class b/comp/src/gb.web.form/.src/WebControl.class new file mode 100644 index 00000000..0bbfc1f6 --- /dev/null +++ b/comp/src/gb.web.form/.src/WebControl.class @@ -0,0 +1,1102 @@ +' Gambas class file + +''' This class is the parent class of every web controls. + +Export +Create Private + +Public Const _IsControl As Boolean = True +Public Const _Properties As String = "Class,Width{WebCoord},Height{WebCoord},Visible=True,Enabled=True,Tag,Expand,Ignore,Background{Color},Foreground{Color},Tooltip,Font{WebFont}" +Public Const _Family As String = "WebForm" +Public Const _DefaultEvent As String = "Render" + +'' This event is raised just after the rendering of the control, so that you can add your own HTML contents. +Event Render +'' This event is raised after a message box has been closed. +'' - ~Source~ is the source control, i.e. the control owning the method that opened the message box. +'' - ~Action~ is the text of the message box button that has been clicked. +Event Message(Source As WebControl, Action As String) + +Event Dialog(Dialog As WebForm, Result As Variant) + +'' Return the server control identifier. +Property Read Id As Integer + +'' Return or set the name of the control, used as an identifier on the client side. +Property Name As String + +'' Returns or sets the control tag. +'' +'' This property is intended for the programmer and is never used by the component. It can contain any [/lang/type/variant] value. +Property Tag As Variant + +'' Return the parent container of the control. +Property Read Parent As WebContainer + +'' Return or set if the control should expand its size according to its parent arrangement mode. +Property Expand As Boolean + +'' Return or set if the control is visible. +Property Visible As Boolean + +'' Return a virtual object that allows to define specific style sheet elements of the control. +Property Read Style As WebControlStyle + +'' Return the web form that control belongs to. +Property Read Form As WebForm + +'' Return or set the explicit width of the control. +'' +'' This property can take any valid CSS size. If not set, the control will have its default width. +Property Width, W As String + +'' Return or set the explicit height of the control. +'' +'' This property can take any valid CSS size. If not set, the control will have its default height. +Property Height, H As String + +'' Return or set if the control must be ignored by its parent container in automatic arrangement mode. +Property Ignore As Boolean + +'' Return or set if the control is enabled. +Property Enabled As Boolean + +'' Return or set the background color of the control. +Property Background As Integer + +'' Return or set the foreground color of the control. +Property Foreground As Integer + +'' Return or set if the control has a border. +Property Border As Boolean + +'' Return or set the specific CSS classes added to the control. +Property Class As String + +'' Return or set the tooltip displayed when the mouse cursor hovers the control. +Property Tooltip As String + +'' Return or set the specific font of the control. +Property Font As String + +Static Private $iLastId As Integer +Static Private $iLastFormId As Integer +Static Private $cFromId As New Collection +Static Private $cFromName As New Collection + +Static Private $aStyleSheet As String[] + +Static Public _NextName As String + +Public _Refresh As Boolean +Public _EventName As String +Public _Extra As Boolean +Public _Proxy As String +Public _NoRefresh As Integer +Public _Naked As Boolean + +Private $iId As Integer +Private $iParentId As Integer +Private $iFormId As Integer +Private $sName As String +Private $vTag As Variant + +Private $iStyleSheet As Integer +Private $hStyle As WebControlStyle + +Private $iBackground As Integer = Color.Default +Private $iForeground As Integer = Color.Default + +Private $bExpand As Boolean +Private $bIgnore As Boolean +Private $bDisabled As Boolean +Private $bHidden As Boolean +Private $bNoBorder As Boolean +Private $sClass As String +Private $sTooltip As String + +'' Create a new [@{class}](.). + +Public Sub _new(Optional Parent As WebContainer) + + Dim sName As String + + Inc $iLastId + $iId = $iLastId + + If _NextName Then + sName = _NextName + _NextName = "" + Endif + + If Me Is WebForm Then + Object.Attach(Me, Me, "WebForm") + $iFormId = $iId + Inc $iLastFormId + If Not sName Then sName = "@" & CStr($iLastFormId) + Else + _EventName = Param.EventName + Try $iFormId = Parent.Form.Id + If Not sName Then sName = Param.EventName + If Not sName Then sName = "$" & CStr($iId) + Endif + + SetName(sName) + + $cFromId[$iId] = Me + + Parent_Write(Parent) + + 'Debug Object.Type(Me);; $sName;; $iId + +End + +Private Sub SetName(Optional sName As String) + + Dim iSuffix As Integer + Dim sNameSuffix As String + Dim hParent As WebContainer + + If Left(sName) <> "@" Then sName = Form_Read().Name & "." & sName + + If sName = $sName Then Return + + If $sName Then $cFromName[$sName] = Null + + Do + If iSuffix = 0 Then + sNameSuffix = sName + Else + sNameSuffix = sName & "-" & CStr(iSuffix + 1) + Endif + If Not $cFromName.Exist(sNameSuffix) Then + sName = sNameSuffix + Break + Endif + Inc iSuffix + Loop + + hParent = Parent_Read() + If hParent Then hParent._UpdateChildName($sName, sName) + + $cFromName[sName] = $iId + $sName = sName + +End + +Public Sub _SetForm(hForm As WebForm) + + $iFormId = hForm.Id + +End + +Private Function Id_Read() As Integer + + Return $iId + +End + +'' Return a WebControl from its server identifier. + +Static Public Sub FromId(Id As Integer) As WebControl + + Return $cFromId[Id] + +End + +'' Return a WebControl from its name. + +Static Public Sub FromName(Name As String) As WebControl + + Try Return $cFromId[$cFromName[Name]] + +End + +Private Function Parent_Read() As WebContainer + + Dim hParent As WebContainer + + If $iParentId = 0 Then Return + + hParent = $cFromId[$iParentId] +' If hParent.Parent And If hParent.Parent._Container = hParent Then hParent = hParent.Parent + + Return hParent + +End + +Private Sub Parent_Write(Value As WebContainer) + + Dim hParent As WebContainer + Dim sParent As String + + hParent = Parent_Read() + + If Value = hParent Then Return + + If hParent Then hParent._Remove(Me) + + If Value Then + If Value._Container Then Value = Value._Container + $iParentId = Value.Id + $iFormId = Value.Form.Id + Value._Add(Me) + sParent = Value.Name + Else + $iParentId = 0 + Endif + + '_SetProperty("#parent", sParent) + +End + +Private Function Name_Read() As String + + Return $sName + +End + +Private Function Tag_Read() As Variant + + Return $vTag + +End + +Private Sub Tag_Write(Value As Variant) + + $vTag = Value + _SetProperty("Tag", Value) + +End + +Public Sub _GetClassId(Optional sClass As String) As String + + Dim sResult As String + + If Not sClass Then sClass = "gw-" & LCase(Mid$(Object.Type(Me), 4)) + If $bNoBorder Then sClass &= " gw-noborder" + If Not Me.Enabled Then sClass &= " gw-disabled" + If $sClass Then sClass &= " " & $sClass + If $bHidden Then sClass &= " gw-hidden" + sResult = " class=\"" & sClass & "\" id=\"" & $sName & "\"" + If $sTooltip Then sResult &= " title=\"" & Replace($sTooltip, Chr$(34), """) & "\"" + Return sResult + +End + + +Public Sub _BeforeRender() + + Print ""; + +End + +Public Sub _Render() + +End + +Public Sub _AfterRender() + + Raise Render + Print "
    " + +End + +Public Sub _RenderStyleSheet() + + Dim hParent As WebContainer + + _StartStyleSheet + + If $bIgnore Then + + _AddStyleSheet("position:absolute;") + + Else + + If Me Is WebContainer Then _AddStyleSheet("position:relative;") + + If $bExpand Then + _AddStyleSheet("flex-grow:1;") + Else + _AddStyleSheet("flex-shrink:0;") + Endif + + hParent = Me.Parent + If hParent Then + Select Case hParent.Arrangement + Case Arrange.Vertical + 'If bInline Then _AddStyleSheet("display:block;") + If hParent.Spacing And If Not hParent._IsFirstVisibleChild(Me) Then _AddStyleSheet("margin-top:0.5rem;") + Case Arrange.Horizontal + '_AddStyleSheet("display: block;") + If hParent.Spacing And If Not hParent._IsFirstVisibleChild(Me) Then _AddStyleSheet("margin-left:0.5rem;") + Case Arrange.Column, Arrange.Row + _AddStyleSheet("display:inline-block;") + If hParent.Spacing Then _AddStyleSheet("margin-right:0.5rem;margin-bottom:0.5rem;") + End Select + Endif + + Endif + + If $iBackground <> Color.Default Then _AddStyleSheet("background-color:" & _GetColor($iBackground) & ";") + If $iForeground <> Color.Default Then _AddStyleSheet("color:" & _GetColor($iForeground) & ";") + + If $hStyle And If Not $hStyle.IsVoid() Then $aStyleSheet.Insert($hStyle._GetStyleSheet()) + + _EndStyleSheet + +End + +Public Sub _StartStyleSheet() + + Inc $iStyleSheet + If $iStyleSheet = 1 Then $aStyleSheet = New String[] + +End + +Public Sub _AddStyleSheet(sStyle As String) + + $aStyleSheet.Add(sStyle) + +End + +Public Sub _RemoveStyleSheet(sStyle As String) + + Try $aStyleSheet.Remove($aStyleSheet.Find(sStyle)) + +End + + +Public Sub _EndStyleSheet() + + Dec $iStyleSheet + If $iStyleSheet Then Return + + If $aStyleSheet.Count Then + 'Print "#"; Me.Name; " {" + 'Print " "; $aStyleSheet.Join("\n ") + 'Print "}" + Print " style=\""; $aStyleSheet.Join(""); "\""; + $aStyleSheet.Clear + Endif + +End + +Private Function Expand_Read() As Boolean + + Return $bExpand + +End + +Private Sub Expand_Write(Value As Boolean) + + If $bExpand = Value Then Return + $bExpand = Value + _SetProperty("Expand", Value) + Try Me.Parent.Refresh + +End + +Private Function Style_Read() As WebControlStyle + + If Not $hStyle Then $hStyle = New WebControlStyle As "Style" + Return $hStyle + +End + +Private Function Form_Read() As WebForm + + Try Return $cFromId[$iFormId] + +End + +Public Sub _SetProperty(sProp As String, vValue As Variant) + + Dim cProp As Collection + + If Me.Form._Loaded Then + + If WebForm._InExec Then Me.Refresh + + If TypeOf(vValue) = gb.Object And If vValue Is WebControl Then + sProp = "@" & sProp + vValue = vValue.Name + Endif + + cProp = Session[$sName] + If Not cProp Then cProp = New Collection + cProp[sProp] = vValue + Session[$sName] = cProp + + Endif + +End + +Public Sub _InitSpecialProperty((sProp) As String, (vVal) As Variant) + +End + +Public Sub _InitProperties() + + Dim cProp As Collection + Dim vVal As Variant + Dim sProp As String + + If Not Session.Id Then Return + + Try cProp = Session[$sName] + If Not cProp Then Return + + Object.Lock(Me) + For Each vVal In cProp + sProp = cProp.Key + 'WebForm.Print("set " & sProp) + If Left(sProp) = "#" Then + If sProp = "#style" Then + $hStyle = New WebControlStyle As "Style" + $hStyle._Style = vVal + ' Else If sProp = "#parent" Then + ' Parent_Write(FromName(vVal)) + Else + Me._InitSpecialProperty(sProp, vVal) + Endif + Else If Left(sProp) = "@" Then + Object.SetProperty(Me, Mid$(sProp, 2), WebControl.FromName(vVal)) + Else + Try Object.SetProperty(Me, sProp, vVal) + Endif + Next + Object.Unlock(Me) + +End + +Public Sub Style_Change() + + _SetProperty("#style", $hStyle._Style) + +End + +'' Return if the control or one of its parent is hidden. + +Public Sub IsHidden() As Boolean + + Dim hCtrl As WebControl + + hCtrl = Me + While hCtrl + If Not hCtrl.Visible Then Return True + hCtrl = hCtrl.Parent + Wend + +End + +Public Sub _CanRefresh() As Boolean + + If Not Me.Form._Loaded Then Return + If WebForm._InExec = 0 Then Return + If WebForm._DisableRefresh Then Return + If _NoRefresh Then Return + If IsHidden() Then Return + Return True + +End + +'' Refresh the control. + +Public Sub Refresh() + + If WebForm._DisableRefresh Then Return + If _NoRefresh Then Return + If IsHidden() Then Return + If WebForm._InExec Then + _Refresh = True + WebForm._HasRefresh = True + Endif + +End + +Public Sub _RefreshReply() As Boolean + + Dim hFile As File + Dim sResult As String + + If _Refresh Then + + hFile = Open String For Write + Output To #hFile + + If Not _Naked Then Me._BeforeRender() + Me._Render() + If Not _Naked Then Me._AfterRender() + + sResult = Close #hFile + Output To Default + + 'WebForm._AddRefresh("$(" & JS(Me.Name) & ").outerHTML = " & JS(sResult) & ";") + + If _Naked Then + Print "gw.setInnerHtml("; JS(Me.Name); ","; JS(sResult); ");" + Else + Print "gw.setOuterHtml("; JS(Me.Name); ","; JS(sResult); ");" + 'Print "$("; JS(Me.Name); ").outerHTML = "; JS(sResult); ";" + Endif + + _Refresh = False + Return True + + Endif + +Catch + + Output To Default + Error.Propagate() + +End + +Public Sub _GetEventJS(sProp As String, sEvent As String, Optional sArg As String) As String + + Dim sStr As String + + If Not Object.CanRaise(Me, sEvent) Then Return + + sStr = " " & sProp & "=\"gw.raise(" '& JS(Me.Form.Name) & "," + If Me Is WebForm Then + sStr &= "null" + Else + sStr &= JS($sName) + Endif + sStr &= "," & JS(sEvent) + If sArg Then sStr &= "," & sArg + sStr &= ");" + sStr &= "\"" + + Return sStr + +End + +Public Sub _GetUpdateJS(sEvent As String, sProp As String, Optional sGetValue As String = "null", Optional sMore As String) As String + + Dim sStr As String + sStr = " " & sEvent & "=\"gw.update(" & JS($sName) & "," & JS(sProp) & "," & sGetValue & ");" + If sMore Then sStr &= sMore + Return sStr & "\"" + +End + +Public Sub _GetUpdateWaitJS(sEvent As String, sProp As String, Optional sGetValue As String = "null", Optional sMore As String) As String + + Dim sStr As String + sStr = " " & sEvent & "=\"gw.updateWait(" & JS($sName) & "," & JS(sProp) & "," & sGetValue & ");" + If sMore Then sStr &= sMore + Return sStr & "\"" + +End + +Public Sub _UpdateProperty((sProp) As String, (vValue) As Variant) + +End + +Private Function Width_Read() As String + + If $hStyle Then Return $hStyle["width"] + +End + +Private Sub Width_Write(Value As String) + + Style_Read()["width"] = Value + +End + +Private Function Height_Read() As String + + If $hStyle Then Return $hStyle["height"] + +End + +Private Sub Height_Write(Value As String) + + Style_Read()["height"] = Value + +End + +Private Function Visible_Read() As Boolean + + Return Not $bHidden + + ' If Not $hStyle Then Return True + ' Return $hStyle["display"] <> "none" + +End + +Private Sub Visible_Write(Value As Boolean) + + Dim bCanRefresh As Boolean + + If $bHidden <> Value Then Return + + $bHidden = False + bCanRefresh = _CanRefresh() + $bHidden = Not Value + + Inc _NoRefresh + _SetProperty("Visible", Value) + Dec _NoRefresh + If bCanRefresh Then + WebForm._AddJavascript("gw.setVisible(" & JS(Me.Name) & "," & JS(Not $bHidden) & ")") + If Me.Parent Then + Me.Parent.Refresh + Else If Me Is WebContainer Then + Refresh + Endif + Endif + 'Me.Parent.Refresh + + ' If Value Then + ' If $hStyle Then Style_Read()["display"] = "" + ' Else + ' Style_Read()["display"] = "none" + ' Endif + +End + +Private Function Ignore_Read() As Boolean + + Return $bIgnore + +End + +Private Sub Ignore_Write(Value As Boolean) + + If $bIgnore = Value Then Return + $bIgnore = Value + _SetProperty("Ignore", Value) + Me.Parent.Refresh + +End + +'' Set the focus on the control. +'' +'' - ~Highlight~ is an optional argument that specify if the control contents must be highlighted. It usually works only for TextBox or TextArea controls. + +Public Sub SetFocus(Optional Highlight As Boolean) + + Dim sName As String + + sName = $sName + If _Proxy Then sName &= _Proxy + + WebForm._AddReply("gw.setFocus(" & JS(sName) & ")") + If Highlight Then WebForm._AddReply("gw.highlightMandatory(" & JS(sName) & ")") + +End + +Private Function Enabled_Read() As Boolean + + If $bDisabled Then Return + If $iParentId = 0 Then Return True + Return Parent_Read().Enabled + +End + +Private Sub Enabled_Write(Value As Boolean) + + If $bDisabled <> Value Then Return + $bDisabled = Not Value + Me._SetProperty("Enabled", Value) + +End + +Private Function Background_Read() As Integer + + Return $iBackground + +End + +Private Sub Background_Write(Value As Integer) + + If $iBackground = Value Then Return + $iBackground = Value + Me._SetProperty("Background", Value) + +End + +Private Function Foreground_Read() As Integer + + Return $iForeground + +End + +Private Sub Foreground_Write(Value As Integer) + + If $iForeground = Value Then Return + $iForeground = Value + Me._SetProperty("Foreground", Value) + + +End + +Static Public Sub _GetColor(iCol As Integer) As String + + Dim A As Integer + Dim R As Integer + Dim G As Integer + Dim B As Integer + + A = Lsr(iCol, 24) + R = Lsr(iCol, 16) And 255 + G = Lsr(iCol, 8) And 255 + B = iCol And 255 + + If A Then + Return "rgba(" & CStr(R) & "," & CStr(G) & "," & CStr(B) & "," & CStr(Round(A / 255, -2)) & ")" + Else + Return "#" & Hex$(R, 2) & Hex$(G, 2) & Hex$(B, 2) + Endif + +End + +'' Raise the control. + +Public Sub Raise() + + Dim hParent As WebContainer + + hParent = Parent_Read() + If hParent Then hParent._Raise($sName) + +End + +'' Lower the control. + +Public Sub Lower() + + Dim hParent As WebContainer + + hParent = Parent_Read() + If hParent Then hParent._Lower($sName) + +End + +Static Public Sub _GetNames() As String + + Dim aKey As New String[] + + For Each $cFromName + aKey.Add($cFromName.Key) + Next + + Return aKey.Join(",") + +End + +'' Delete the control + +Public Sub Delete() + + Dim hParent As WebContainer + + hParent = Parent_Read() + If hParent Then hParent._Remove(Me) + + Session[$sName] = Null + Session[$sName & ":data"] = Null + + $cFromName[$sName] = Null + $cFromId[$iId] = Null + 'Debug $sName;; $iId;; System.Backtrace.Join(" ") + +End + +'' Show the control. +'' +'' Setting the [../visible] property to TRUE has the same effect. + +Public Sub Show() + + Me.Visible = True + +End + +'' Hide the control. +'' +'' Setting the [../visible] property to FALSE has the same effect. + +Public Sub Hide() + + Me.Visible = False + +End + +'' Return the custom data associated with the string ~Key~. + +Public Sub _get(Key As String) As Variant + + Dim cData As Collection + + If Not Key Then Error.Raise("Void key") + + cData = Session[$sName & ":data"] + If cData Then Return cData[Key] + +End + +'' Associate the some custom data with the string ~Key~. + +Public Sub _put(Value As Variant, Key As String) + + Dim cData As Collection + + If Not Key Then Error.Raise("Void key") + cData = Session[$sName & ":data"] + If Not cData Then cData = New Collection + cData[Key] = Value + Session[$sName & ":data"] = cData + +End + +'' Clear all custom data associated with the control + +Public Sub Reset() + + Session[$sName & ":data"] = Null + +End + + +' Public Sub _GetBaseName() As String +' +' Dim iPos As Integer +' +' iPos = InStr($sName, ".") +' If iPos Then +' Return Mid$($sName, iPos + 1) +' Else +' Return $sName +' Endif +' +' End + +Private Function Border_Read() As Boolean + + Return $bNoBorder + +End + +Private Sub Border_Write(Value As Boolean) + + If $bNoBorder <> Value Then Return + $bNoBorder = Not Value + Me._SetProperty("Border", Value) + +End + +Private Function Class_Read() As String + + Return $sClass + +End + +Private Sub Class_Write(Value As String) + + If $sClass = Value Then Return + $sClass = Value + Me._SetProperty("Class", Value) + +End + +Private Function Tooltip_Read() As String + + Return $sTooltip + +End + +Private Sub Tooltip_Write(Value As String) + + If $sTooltip = Value Then Return + $sTooltip = Value + Me._SetProperty("Tooltip", Value) + +End + +Public Sub _GetImageLink(sImage As String) As String + + If Left(sImage) = "/" Then + Return Application.Root &/ "img:" & Me.Name & "?z=" & Base64(Format(Now, "hhnnssuuu")) + Else + Return Application.Root &/ sImage + Endif + +End + + +Private Sub Name_Write(Value As String) + + SetName(Value) + +End + +'' Add a specific class to the [../class] property. + +Public Sub AddClass((Class) As String) + + Dim aClass As String[] + Dim sClass As String + + sClass = Trim(Class) + If Not sClass Then Return + + aClass = Split($sClass, " ") + + For Each sClass In Split(sClass, " ", "", True) + + If aClass.Exist(sClass) Then Continue + aClass.Add(sClass) + + Next + + Class_Write(aClass.Join(" ")) + +End + +'' Remove a specific class from the [../class] property. + +Public Sub RemoveClass((Class) As String) + + Dim aClass As String[] + Dim iPos As Integer + Dim sClass As String + + sClass = Trim(Class) + If Not sClass Then Return + + aClass = Split($sClass, " ") + + For Each sClass In Split(sClass, " ", "", True) + + iPos = aClass.Find(sClass) + If iPos < 0 Then Continue + + aClass.Remove(iPos) + + Next + + Class_Write(aClass.Join(" ")) + +End + +Private Function Font_Read() As String + + Dim aFont As New String[] + Dim sFamily As String + Dim sWeight As String + Dim sStyle As String + Dim sSize As String + Dim sDecoration As String + + If Not $hStyle Then Return + + sFamily = $hStyle["font-family"] + sWeight = $hStyle["font-weight"] + sStyle = $hStyle["font-style"] + sDecoration = $hStyle["font-decoration"] + sSize = $hStyle["font-size"] + + If sFamily Then aFont.Add(sFamily) + + If sWeight = "normal" And If sStyle = "normal" And If sDecoration = "none" Then + + aFont.Add("normal") + + Else + + If sWeight Then + If sWeight <> "bold" Then sWeight = "weight:" & sWeight + aFont.Add(sWeight) + Endif + + If sStyle Then + If sStyle <> "italic" Then sStyle = "style:" & sStyle + aFont.Add(sStyle) + Endif + + If sDecoration Then + If sDecoration = "underline" Then + aFont.Add(sDecoration) + Else If sDecoration = "line-through" Then + aFont.Add("strikeout") + Else + aFont.Add("decoration:" & sDecoration) + Endif + Endif + + Endif + + If sSize Then + If Not IsDigit(Left(sSize)) Then sSize = "size:" & sSize + aFont.Add(sSize) + Endif + + Return aFont.Join() + +End + +Private Sub Font_Write(Value As String) + + Dim sElt As String + + For Each sElt In Split(Value) + + sElt = Trim(sElt) + If Not sElt Then Continue + + If IsDigit(Left(sElt)) Then + Style_Read()["font-size"] = sElt + Continue + Endif + + If sElt Begins "weight:" Then + Style_Read()["font-weight"] = Mid$(sElt, InStr(sElt, ":") + 1) + Continue + Endif + + If sElt Begins "style:" Then + Style_Read()["font-style"] = Mid$(sElt, InStr(sElt, ":") + 1) + Continue + Endif + + If sElt Begins "decoration:" Then + Style_Read()["text-decoration"] = Mid$(sElt, InStr(sElt, ":") + 1) + Continue + Endif + + If sElt Begins "size:" Then + Style_Read()["font-size"] = Mid$(sElt, InStr(sElt, ":") + 1) + Continue + Endif + + Select Case sElt + Case "normal" + Style_Read()["font-weight"] = "normal" + Style_Read()["font-style"] = "normal" + Style_Read()["text-decoration"] = "none" + Case "bold" + Style_Read()["font-weight"] = sElt + Case "italic" + Style_Read()["font-style"] = sElt + Case "italic" + Style_Read()["font-style"] = sElt + Case "underline" + Style_Read()["text-decoration"] = sElt + Case "strikeout" + Style_Read()["text-decoration"] = "line-through" + Case Else + Style_Read()["font-family"] = sElt + End Select + + Next + +End diff --git a/comp/src/gb.web.form/.src/WebControlStyle.class b/comp/src/gb.web.form/.src/WebControlStyle.class new file mode 100644 index 00000000..a459a416 --- /dev/null +++ b/comp/src/gb.web.form/.src/WebControlStyle.class @@ -0,0 +1,46 @@ +' Gambas class file + +Export + +Event Change + +Public _Style As New Collection + +Public Sub _get({Property} As String) As String + + Return _Style[{Property}] + +End + +Public Sub _put(Value As String, {Property} As String) + + _Style[{Property}] = Value + Raise Change + +End + +Public Sub IsVoid() As Boolean + + Return _Style.Count = 0 + +End + +Public Sub Exist({Property} As String) As Boolean + + Return _Style.Exist({Property}) + +End + + +Public Sub _GetStyleSheet() As String[] + + Dim aStyle As New String[] + Dim sValue As String + + For Each sValue In _Style + aStyle.Add(_Style.Key & ":" & sValue & ";") + Next + + Return aStyle + +End diff --git a/comp/src/gb.web.form/.src/WebExpander.class b/comp/src/gb.web.form/.src/WebExpander.class new file mode 100644 index 00000000..241ba2a5 --- /dev/null +++ b/comp/src/gb.web.form/.src/WebExpander.class @@ -0,0 +1,109 @@ +' Gambas class file + +''' This class implements an expander container. + +Export +Inherits WebContainer + +Public Const _Properties As String = "*,Text,Hidden" +Public Const _DefaultEvent As String = "Show" +Public Const _Similar As String = "WebContainer" +Public Const _DrawWith As String = "Expander" + +'' This event is raised when the expander is opened. +Event Show +'' This event is raised when the expander is closed. +Event Hide + +'' Return or set if the expander contents is hidden. +Property Hidden As Boolean +'' Return or set the expander title. +Property Text As String +'' Return or set if the expander has a border. +Property Border As Boolean + +Private $hCont As WebContainer +Private $bHidden As Boolean +Private $sText As String +Private $bBorder As Boolean + +'' Create a new WebExpander +Public Sub _new() + + $hCont = New WebContainer(Me) + Me._Container = $hCont + +End + +Private Function Hidden_Read() As Boolean + + Return $bHidden + +End + +Private Sub Hidden_Write(Value As Boolean) + + $bHidden = Value + Me._SetProperty("Hidden", Value) + If $bHidden Then + Raise Hide + Else + Raise Show + Endif + +End + +Private Function Text_Read() As String + + Return $sText + +End + +Private Sub Text_Write(Value As String) + + $sText = Value + Me._SetProperty("Text", Value) + +End + + +Public Sub _Render() + + If $bBorder Then Print "
    " + + Print "
    "; + Print ""; + Print "
    "; $sText; "
    "; + Print "
    " + + If Not $bHidden Then + With $hCont + ._BeforeRender() + ._Render() + ._AfterRender() + End With + Endif + + If $bBorder Then Print "
    " + +End + +Public Sub _UpdateProperty(sProp As String, vValue As Variant) + + If sProp = "hidden" Then Try Me.Hidden = vValue + +End + + +Private Function Border_Read() As Boolean + + Return $bBorder + +End + +Private Sub Border_Write(Value As Boolean) + + $bBorder = Value + Me._SetProperty("Border", Value) + +End diff --git a/comp/src/gb.web.form/.src/WebForm.class b/comp/src/gb.web.form/.src/WebForm.class new file mode 100644 index 00000000..5bd30be7 --- /dev/null +++ b/comp/src/gb.web.form/.src/WebForm.class @@ -0,0 +1,1040 @@ +' Gambas class file + +''' This class represents the different pages and dialogs of your Web application. + +Export +Create Static + +Inherits WebContainer + +Public Const _IsForm As Boolean = True +Public Const _HiddenControls As String = "WebControl,WebForm,Timer" +Public Const _Properties As String = "*,Title,Resizable,Persistent" +Public Const _DefaultEvent As String = "Open" + +'' Return or set if debugging messages are printed in the javascript console of the browser. +Static Property Debug As Boolean +'' Return or set the name of the startup form. +'' +'' By default, this is the startup class of your project. +Static Property Startup As String + +Static Public _InExec As Integer +Static Public _Current As WebForm + +Static Private $aJavascriptBefore As New String[] +Static Private $aJavascript As New String[] +Static Private $aRefresh As New String[] + +Static Private $cLibrary As New Collection + +Static Private $iDownload As Integer +'Static Private $aPreload As String[] + +'' This event is raised when the form is opened. +Event Open +'' This event is raised each time an event is handled by the form. +Event Event +'' This event is raised when the form is closed. +Event Close + +'' Return or set the form title. +'' +'' This title is used as HTML page title if the form is the main form. +Property Title As String +'' Return or set if the form is resizable when used as a dialog. +Property Resizable As Boolean +'' Return or set the minimum width of the form. +'' +'' This property can take any valid CSS size. If not set, the control will have no minimum width. +Property Width, W As String +'' Return or set the minimum height of the form. +'' +'' This property can take any valid CSS size. If not set, the control will have no minimum height. +Property Height, H As String +'' Return if the form is a popup. +Property Read Popup As Boolean +'' Return the control that owns the popup. +Property Read PopupParent As WebControl +'' Return or set if the form is persistent. +'' +'' Closing a non-persistent form automatically destroys it. +Property Persistent As Boolean + +Static Public _DisableRefresh As Integer +Static Public _HasRefresh As Boolean + +Public _Loaded As Boolean +Public _Window As Integer + +Private $aJavascriptFiles As String[] +Private $aJavascriptExternfiles As String[] + +Private $sTitle As String +Private $bResizable As Boolean +Private $sX As String +Private $sY As String +Private $sWidth As String +Private $sHeight As String + +Private $hWindowContainer As WebContainer +Private $bPersistent As Boolean +'Private $bCentered As Boolean + +Static Public Sub _init() + + System.Language = Request.Language + +End + +'' This method is called when the form is used as startup class. +'' +'' It handles all HTTP requests received by your application. + +Static Public Sub Main() + + Dim sPath As String + Dim hForm As WebForm + Dim aLib As String[] + Dim sFile As String + Dim sKey As String + Dim sErr As String + Dim sVar As String + + 'System.Log(Format(Timer, "#0.000") & ": start request: [" & Session.Id & "] " & URL.Decode(Application.Request)) + + Try Object.Call(Application.Startup, "HandleRequest") + If Response.Done Then Return + + sPath = Mid$(Request.Path, 2) + + If sPath Then + + If sPath Begins "style:" And sPath Ends ".css" Then + + aLib = Split(Left(sPath, -4), ":") + If aLib.Count >= 3 Then sFile = aLib[1] & ".css" + RenderStyleSheet(sFile) + Goto END_REQUEST + + Else If sPath Begins "lib:" And sPath Ends ".js" Then + + aLib = Split(Left(sPath, -3), ":") + aLib.Remove(aLib.Max) + 'If aLib.Count >= 3 Then sFile = aLib[1] & ".js" + RenderJavascript(aLib) + Goto END_REQUEST + + Else If sPath Begins "img:" Then + + Try sPath = Session[Mid$(sPath, 5)]["Image"] + If Not Error Then Response.SendFile(sPath) + Goto END_REQUEST + + Else If sPath Begins "download:" Then + + If DownloadFile(Mid$(sPath, 10)) Then Goto NOT_FOUND + Goto END_REQUEST + + Else If sPath = "~dump" Then + + Response.ContentType = "text/plain;charset=utf-8" + Response.Begin + + For Each sVar In Env + Print sVar; " = "; Env[sVar] + Next + + If Session.Id Then + + Print + For Each sKey In Session.Keys + Print sKey; " : "; JSON.Encode(Session[sKey]) + Next + + Print + Print "size = "; Session.Size + + Endif + + Response.End + Return + + Else If sPath = "~logout" Then + + Session.Abandon + + Else If Exist("../.public/" &/ sPath) Then + + Response.SendFile("../.public/" &/ sPath) + Goto END_REQUEST + + Else If Exist(".public/" &/ sPath) Then + + Response.SendFile(".public/" &/ sPath) + Goto END_REQUEST + + ' Else + ' + ' iPos = InStr(sPath, "/") + ' If iPos = 0 Then + ' sClass = sPath + ' sPath = "" + ' Else + ' sClass = Left(sPath, iPos - 1) + ' sPath = Mid$(sPath, iPos + 1) + ' Endif + ' + ' Try hStat = Class.Stat(".." &/ sClass) + ' If Not hStat Then + ' Try hStat = Class.Stat(sClass) + ' If Not hStat Then Goto NOT_FOUND + ' Endif + ' + ' If LCase(hStat.Parent) <> "webform" Then Goto NOT_FOUND + ' + ' Try hClass = Class.Load(sClass) + ' If Not hClass Then + ' Debug "Class.Load: "; Error.Text + ' Goto NOT_FOUND + ' Endif + ' + ' 'Main.DumpSession + ' hForm = hClass.AutoCreate() + ' + Endif + + Endif + + If Session.Id And If Session["startup"] Then + Try hForm = Class.Load(Session["startup"]).AutoCreate() + Endif + If Not hForm Then + hForm = Application.Startup.AutoCreate() + Endif + _Current = hForm + + If sPath = "x" Then + hForm._Exec(JSON.Decode(Request["c"])) + Else If sPath = "u" And If Request.Method = "POST" Then + hForm._Upload(Request["id"]) + Else + hForm.Render + Endif + + Goto END_REQUEST + +NOT_FOUND: + + Response.Status = "404 NotFound" + Response.Begin + Print "

    404 NotFound

    " + Response.End + +END_REQUEST: + + 'System.Log(Format(Timer, "#0.000") & ": end request: [" & Session.Id & "] " & URL.Decode(Application.Request)) + Return + +Catch + + sErr = Error.Text & "\n" & Error.Backtrace.Join(" ") + + Response.Cancel + Response.Begin + If sPath <> "x" Then Print "" + Response.End + 'System.Log("End request") + +End + +Static Public Sub _AddRefresh(sStr As String) + + $aRefresh.Add(sStr) + +End + +Static Public Sub _AddReplyBefore(sStr As String) + + $aJavascriptBefore.Add(sStr) + +End + +Static Public Sub _AddReply(sStr As String) + + $aJavascript.Add(sStr) + +End + + +Static Public Sub _AddJavascript(sStr As String) + + _AddReply(sStr) + +End + +Static Public Sub _AddJavascriptBefore(sStr As String) + + _AddReplyBefore(sStr) + +End + +'' Create a new WebForm +'' +'' You can embed a webform into a container. In that case the webform acts like a WebContainer. + +Public Sub _new() + + If Not Me.Parent Then + $hWindowContainer = New WebContainer(Me) + $hWindowContainer.Ignore = True + $hWindowContainer._Naked = True + $hWindowContainer.Class = "gw-window-container" + Endif + +End + +Public Sub _ready() + + If Not Me.Parent Then + Me._InitProperties + $hWindowContainer.Raise + Endif + + _Loaded = True + + 'If Me.Parent And If Then Raise Open + +End + +Public Sub _BeforeRender() + + If Me.Parent Then + Super._BeforeRender() + Return + Endif + + Print "
    " + +End + +Static Private Sub PrintJavascript() + + If $aJavascriptBefore.Count Then + Print $aJavascriptBefore.Join(";\n"); ";" + $aJavascriptBefore.Clear + Endif + + If _HasRefresh Then + _HasRefresh = False + Me._RefreshReply() + Endif + + If $aJavascript.Count Then + Print $aJavascript.Join(";\n"); ";" + $aJavascript.Clear + Endif + +End + +Public Sub _BeginJavascript() As Variant + + Dim aJavascript As String[] + Dim aJavascriptBefore As String[] + + aJavascript = $aJavascript + aJavascriptBefore = $aJavascriptBefore + + $aJavascript = New String[] + $aJavascriptBefore = New String[] + + Return [aJavascript, aJavascriptBefore] + +End + +Public Sub _EndJavascript(vSave As Variant) + + Dim aJavascript As String[] + Dim aJavascriptBefore As String[] + + aJavascript = $aJavascript + aJavascriptBefore = $aJavascriptBefore + + $aJavascript = vSave[0] + $aJavascriptBefore = vSave[1] + + If aJavascriptBefore.Count Then Print aJavascriptBefore.Join(";"); ";"; + If aJavascript.Count Then Print aJavascript.Join(";"); ";"; + +End + +'' Render the form contents to the standard output as HTML. + +Public Sub Render() + + Dim sImage As String + + Response.Buffered = True + Response.Begin + + Header.Form = Me + Header.__Render() + 'Print Header.ToString(); + Header.Form = Null + + $aJavascript.Clear + + Print "" + + Print "
    "; + For Each sImage In ["error.png", "info.png", "question.png", "warning.png"] + Print ""; + Next + Print "
    " + Print "
    " + Print "
    " + "
    " + "
    " + "
    " + "
    " + "
    " + "
    " + + Me._BeforeRender() + Me._Render() + Me._AfterRender() + + Print "" + + Print "" + Print "" + + Response.End + +End + +Static Private Sub RenderStyleSheet(Optional sFile As String) + + If Not sFile Then sFile = "style.css" + + If Not Exist(sFile) Then + Response.Status = "404 NotFound" + Response.Begin + Response.End + Return + Endif + + Response.Buffered = True + Response.ContentType = "text/css;charset=utf-8" + Response.Begin + + Print Replace(File.Load(sFile), "//", Application.Root); + + If Exist("../.public" &/ sFile) Then Print File.Load("../.public/" &/ sFile); + + Response.End + +End + +Static Private Sub RenderJavascript(aLib As String[]) + + Dim sFile As String + + Response.ContentType = "text/javascript;charset=utf-8" + Response.Begin + + For Each sFile In aLib + + sFile &= ".js" + + If sFile = "lib.js" Then + Print "$root = "; JS(Application.Root); ";" + Print File.Load(sFile) + Print File.Load("ac.js") + Else + If Exist(sFile) Then + Print File.Load(sFile) + Else If Exist(".." &/ sFile) Then + Print File.Load(".." &/ sFile) + Endif + Endif + + Next + + Response.End + +End + + +Private Function Title_Read() As String + + Return $sTitle + +End + +Private Sub Title_Write(Value As String) + + $sTitle = Value + Me._SetProperty("Title", Value) + +End + +'' Print some text to the browser javascript console. + +Static Public Sub Print(Text As String) + + $aJavascript.Add("console.log(" & JS(Text) & ")") + +End + +'' Execute some javascript into the browser. + +Static Public Sub Exec(Javascript As String) + + $aJavascript.Add(Javascript) + +End + +Public Sub _Exec(aCmd As Variant[]) + + Dim hCtrl As WebControl + Dim iOldInExec As Integer = _InExec + Dim sErr As String + 'Dim fTimer As Float + + 'fTimer = Timer + + Inc _InExec + + Raise Event + + Select Case aCmd[0] + + Case "raise" + + If aCmd[1] Then + hCtrl = WebControl.FromName(aCmd[1]) + Else + hCtrl = Me + Endif + + If Not hCtrl Then Goto VOID_RESPONSE + + Object.Raise(hCtrl, aCmd[2], aCmd[3]) + + Case "update" + + 'Debug aCmd[1];; aCmd[2];; aCmd[3] + + If aCmd[1] Then + hCtrl = WebControl.FromName(aCmd[1]) + If Not hCtrl Then Goto VOID_RESPONSE + Else + hCtrl = Me + Endif + hCtrl._UpdateProperty(aCmd[2], aCmd[3]) + + End Select + + _InExec = iOldInExec + + Response.Buffered = True + Response.ContentType = "text/javascript;charset=utf-8" + Response.Begin + PrintJavascript + 'Session.Save + 'Print "// WebForm._Exec: " & Format(Timer - fTimer, "0.000 s") + Response.End + Return + +VOID_RESPONSE: + + Response.Begin + 'Print "console.log("; JS("unknown control " & aCmd[1]); ");" + Response.End + Return + +Catch + + sErr = Error.Text & "\n" & Error.Backtrace.Join(" ") + _InExec = iOldInExec + + Response.Cancel + Response.Begin + Print "console.log("; JS(aCmd); ");" + Print "console.log("; JS(sErr); ");" + Print "console.log("; JS($aJavascript.Join("\n")); ");" + Print "alert("; JS(sErr); ");" + Response.End + +End + +'' Close the form. +'' +'' If the form was a dialog, you can specify a return value with the optional ~ReturnValue~ argument. +'' +'' That return value will be passed as an argument to the [../control/.dialog] event of the control that owns the dialog. + +Public Sub Close(Optional ReturnValue As Variant) + + ' Dim bCancel As Boolean + Dim hWindow As WebWindow + + Raise Close + + If Me._Window Then + + hWindow = WebControl.FromId(Me._Window) + With hWindow + .Close(ReturnValue) + If $bPersistent Then + .Hide + Else + .Delete + Endif + End With + + Else + + If $bPersistent Then + Me.Hide + Else + Me.Delete + Endif + _AddReply("window.location.reload(true)") + + Endif + +End + +' Public Sub Open(Child As WebForm) +' +' Dim hWindow As WebWindow +' +' If $bOpened Then Return +' +' hWindow = New WebWindow(Me) +' hWindow.Child = Child +' Child._Window = hWindow.Id +' +' $bOpened = True +' +' End + +'' Hide the form. + +Public Sub Hide() + + Dim hWindow As WebControl + + If Me.Parent Then + Super.Hide() + Return + Endif + + If _Window = 0 Then Return + + hWindow = WebControl.FromId(_Window) + If hWindow Then hWindow.Hide + +End + +Private Sub DoShow() + + Dim hWindow As WebWindow + + If _Window Then + hWindow = WebControl.FromId(_Window) + If hWindow Then hWindow.Show + Return + Endif + + hWindow = New WebWindow(WebForm._Current._GetWindowContainer()) + hWindow.Child = Me + hWindow.Resizable = $bResizable + hWindow.Move($sX, $sY, $sWidth, $sHeight) + + _Window = hWindow.Id + +End + +'' Show the form. + +Public Sub Show() + + If Me.Parent Then Return + DoShow + Raise Open + +End + +'' Show the form as a modal dialog. +'' +'' ~Parent~ is the owner of the dialog. If not specified, then the value of [/lang/last] is used as owner. +'' +'' An error is raised if you try to call this method on an embedded form. + +Public Sub ShowModal(Optional Parent As WebControl) + + Dim hWindow As WebWindow + + If Me.Parent Then Error.Raise("Form is embedded") + If _Window = 0 Then DoShow() + + hWindow = WebControl.FromId(_Window) + If hWindow Then + hWindow.Modal = True + If IsMissing(Parent) Then Try Parent = Last + If Parent Then hWindow.ParentControl = Parent.Name + Endif + + Raise Open + +End + +'' Show the form as a popup. +'' +'' - ~Control~ is the owner of the popup. It is normally the control the popup is attached to. +'' - ~Alignment~ defines the position of the popup on the screen: +'' - [Align.Left](../../align/left) : the popup is aligned to the left of its owner. +'' - [Align.Right](../../align/eight) : the popup is aligned to the right of its owner. +'' +'' By default the popup is aligned to the left of its owner. + +Public Sub ShowPopup(Control As WebControl, Optional Alignment As Integer = Align.Left) + + Dim hWindow As WebWindow + + If Me.Parent Then Error.Raise("Form is embedded") + If _Window Then Return + + hWindow = New WebWindow(WebForm._Current._GetWindowContainer()) + hWindow.Child = Me + hWindow.Resizable = $bResizable + hWindow.PopupAlignment = Alignment + hWindow.PopupControl = Control.Name + hWindow.Modal = True + + _Window = hWindow.Id + + Raise Open + +End + +'' Move and/or resize the form. +'' [[ warning +'' A main form cannot be moved nor resized. +'' ]] +Public Sub Move(X As String, Y As String, Optional Width As String, Optional Height As String) + + Dim hWindow As WebWindow = WebControl.FromId(_Window) + + $sX = X + $sY = Y + If Not IsMissing(Width) Then $sWidth = Width + If Not IsMissing(Height) Then $sHeight = Height + '$bCentered = False + + If hWindow Then hWindow.Move(X, Y, Width, Height) + +End + +'' Resize the form. +'' [[ warning +'' A main form cannot be resized. +'' ]] +Public Sub Resize(Width As String, Height As String) + + Dim hWindow As WebWindow = WebControl.FromId(_Window) + + $sWidth = Width + $sHeight = Height + '$bCentered = False + + If hWindow Then hWindow.Resize(Width, Height) + +End + +Public Sub _UpdateProperty(sProp As String, vValue As Variant) + + Dim aWindows As String[] + Dim sName As String + + Select Case sProp + + Case "#windows" + aWindows = vValue + Inc _DisableRefresh + For Each sName In aWindows + Try WebControl.FromName(sName).Raise() + Next + Dec _DisableRefresh + + End Select + +End + +Private Function Resizable_Read() As Boolean + + Return $bResizable + +End + +Private Sub Resizable_Write(Value As Boolean) + + Dim hWindow As WebWindow = WebControl.FromId(_Window) + $bResizable = Value + UpdateSize + If hWindow Then hWindow.Resizable = Value + +End + +' Public Sub Center() +' +' Dim hWindow As WebWindow = WebControl.FromId(_Window) +' +' $bCentered = True +' If hWindow Then hWindow.Centered = True +' +' End + +Static Private Function Debug_Read() As Boolean + + Try Return Session["debug"] + +End + +Static Private Sub Debug_Write(Value As Boolean) + + Dim bDebug As Boolean + + Try bDebug = Session["debug"] + If Value = bDebug Then Return + + Session["debug"] = Value + _AddJavascript("gw.debug = " & JS(Value)) + +End + +Private Sub UpdateSize() + + If $bResizable Then + Me.Style["width"] = "" + Me.Style["height"] = "" + Else + Me.Style["width"] = Me.Style["min-width"] + Me.Style["height"] = Me.Style["min-height"] + Endif + +End + +Private Function Width_Read() As String + + Return Me.Style["min-width"] + +End + +Private Sub Width_Write(Value As String) + + Me.Style["min-width"] = Value + UpdateSize + +End + +Private Function Height_Read() As String + + Return Me.Style["min-height"] + +End + +Private Sub Height_Write(Value As String) + + Me.Style["min-height"] = Value + UpdateSize + +End + +Public Sub _GetWindowContainer() As WebContainer + + 'If Me.Parent Then Return Me.Form._GetWindowContainer() + Return $hWindowContainer + +End + +' Public Sub _Preload(sUrl As String) +' +' If Not $aPreload Then $aPreload = New String[] +' If $aPreload.Exist(sUrl) Then Return +' $aPreload.Add(sUrl) +' +' End +' +Static Public Sub _AddLibrary(sLib As String) + + $cLibrary[sLib] = True + +End + +Private Function Popup_Read() As Boolean + + Dim hWindow As WebWindow = WebForm.FromId(Me._Window) + If hWindow Then Return hWindow.IsPopup() + +End + +Private Function PopupParent_Read() As WebControl + + Dim hWindow As WebWindow = WebForm.FromId(Me._Window) + If hWindow Then Return WebControl.FromName(hWindow.PopupControl) + +End + +Public Sub _Upload(Id As String) + + Dim hCtrl As WebUploadArea + Dim iOldInExec As Integer = _InExec + Dim sErr As String + + Inc _InExec + + Try hCtrl = WebControl.FromName(Id) + If hCtrl Then hCtrl._UploadFinish + + _InExec = iOldInExec + + Response.Begin + PrintJavascript + Response.End + +Catch + + sErr = Error.Text & "\n" & Error.Backtrace.Join(" ") + 'Debug sErr + _InExec = iOldInExec + + Response.Begin + Print "console.log("; JS(sErr); ");" + Print "console.log("; JS($aJavascript.Join("\n")); ");" + Response.End + +End + +'' Reload the form. +'' +'' It the form is not a main form, then it is refreshed. + +Public Sub Reload() + + If Me = _Current Then + _AddReply("location.reload(true)") + Else + Me.Refresh + Endif + +End + +Public Sub _GetJavascriptFiles() As String[] + + Return $aJavascriptFiles + +End + +Public Sub _GetJavascriptExternFiles() As String[] + + Return $aJavascriptExternFiles + +End + +'' Add a javascript file to the list of javascript ressources defined by the `

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 E0T7;^U;qFB literal 0 HcmV?d00001 diff --git a/app/examples/Drawing/Painting/.icon.png b/app/examples/Drawing/Painting/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f7040fd5c56fd06b126c8d685cfb8f3f3c6d0f54 GIT binary patch literal 3331 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 N002ovPDHLkV1oZ@ZEyep literal 0 HcmV?d00001 diff --git a/app/examples/Drawing/Painting/.lang/ca.po b/app/examples/Drawing/Painting/.lang/ca.po new file mode 100644 index 00000000..58153e20 --- /dev/null +++ b/app/examples/Drawing/Painting/.lang/ca.po @@ -0,0 +1,126 @@ +msgid "" +msgstr "" +"Project-Id-Version: Painting\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: 2011-03-20 21:34+0100\n" +"Last-Translator: Jordi Sayol \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Poedit-Language: Catalan\n" + +#: .project:1 +msgid "Anti-Aliased Drawing" +msgstr "Dibuix suavitzat" + +#: .project:2 +msgid "Anti-aliased drawing with the Paint class" +msgstr "Dibuix suavitzat amb la classe Paint" + +#: FMain.form:62 +msgid "Arc" +msgstr "-" + +#: FMain.form:70 +msgid "Arc negative" +msgstr "Arc negatiu" + +#: FMain.form:77 +msgid "Clip" +msgstr "Punt" + +#: FMain.form:84 +msgid "Clip image" +msgstr "Imatge de mostra" + +#: FMain.form:91 +msgid "Curve rectangle" +msgstr "Rectangle arrodonit" + +#: FMain.form:98 +msgid "Curve to" +msgstr "Corba a" + +#: FMain.form:105 +msgid "Dash" +msgstr "Guions" + +#: FMain.form:51 +msgid "Example" +msgstr "Exemple" + +#: FMain.form:112 +msgid "Fill and stroke" +msgstr "Línia i farciment" + +#: FMain.form:119 +msgid "Fill style" +msgstr "estil de farciment" + +#: FMain.form:126 +msgid "Gradient" +msgstr "Degradat" + +#: FMain.form:133 +msgid "Image" +msgstr "Imatge" + +#: FMain.form:140 +msgid "Image pattern" +msgstr "Patró d'imatge" + +#: FMain.form:147 +msgid "Line widths" +msgstr "Amples de línia" + +#: FMain.form:154 +msgid "Multi segment caps" +msgstr "Caps en múltiples segments" + +#: FMain.form:230 +msgid "Preview" +msgstr "Visualització prèvia" + +#: FMain.form:203 +msgid "Rotate" +msgstr "Gira" + +#: FMain.form:214 +msgid "Scale" +msgstr "Escala" + +#: FMain.form:161 +msgid "Set line cap" +msgstr "Defineix el cap de línia" + +#: FMain.form:168 +msgid "Set line join" +msgstr "Defineix la unió de línies" + +#: FMain.form:239 +msgid "Source" +msgstr "Codi font" + +#: FMain.form:175 +msgid "SVG image" +msgstr "Imatge SVG" + +#: FMain.form:182 +msgid "Text" +msgstr "-" + +#: FMain.form:244 +msgid "TextArea1" +msgstr "-" + +#: FMain.form:189 +msgid "Text clipping" +msgstr "Retallat de text" + +#: FMain.form:196 +msgid "Text extents" +msgstr "Extensions de text" + diff --git a/app/examples/Drawing/Painting/.lang/cs.po b/app/examples/Drawing/Painting/.lang/cs.po new file mode 100644 index 00000000..e74a4157 --- /dev/null +++ b/app/examples/Drawing/Painting/.lang/cs.po @@ -0,0 +1,128 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Anti-Aliased Drawing" +msgstr "Vyhlazené kreslení" + +#: .project:2 +msgid "Anti-aliased drawing with the Paint class" +msgstr "Vyhlazené kreslení s třídou Paint" + +#: FMain.form:53 +msgid "Example" +msgstr "Příklad" + +#: FMain.form:64 +msgid "Arc" +msgstr "Oblouk" + +#: FMain.form:72 +msgid "Arc negative" +msgstr "Obrácený oblouk" + +#: FMain.form:79 +msgid "Clip" +msgstr "Výřez" + +#: FMain.form:86 +msgid "Clip image" +msgstr "Výřez obrázku" + +#: FMain.form:93 +msgid "Curve rectangle" +msgstr "Zaoblený obdelník" + +#: FMain.form:100 +msgid "Curve to" +msgstr "Křivka" + +#: FMain.form:107 +msgid "Dash" +msgstr "Čerchované" + +#: FMain.form:114 +msgid "Fill and stroke" +msgstr "Výplň tahu" + +#: FMain.form:121 +msgid "Fill style" +msgstr "Styl výplně" + +#: FMain.form:128 +msgid "Gradient" +msgstr "Přechod" + +#: FMain.form:135 +msgid "Image" +msgstr "Obrázek" + +#: FMain.form:142 +msgid "Image pattern" +msgstr "Obrázkový vzor" + +#: FMain.form:149 +msgid "Line widths" +msgstr "Šířka čary" + +#: FMain.form:156 +msgid "Multi segment caps" +msgstr "Několika segmentová stopa" + +#: FMain.form:163 +msgid "Rounded rectangle" +msgstr "Zaoblený obdelník" + +#: FMain.form:170 +msgid "Set line cap" +msgstr "Nastavit stopu čáry" + +#: FMain.form:177 +msgid "Set line join" +msgstr "Nastavit spojení čáry" + +#: FMain.form:184 +msgid "SVG image" +msgstr "SVG obrázek" + +#: FMain.form:191 +msgid "Text" +msgstr "Text" + +#: FMain.form:198 +msgid "Text clipping" +msgstr "Výstřižek textu" + +#: FMain.form:205 +msgid "Text extents" +msgstr "Rozsáhlý text" + +#: FMain.form:212 +msgid "Rotate" +msgstr "Rotace" + +#: FMain.form:223 +msgid "Scale" +msgstr "Měřítko" + +#: FMain.form:243 +msgid "Preview" +msgstr "Náhled" + +#: FMain.form:250 +msgid "Source" +msgstr "Zdroj" + +#: FMain.form:255 +msgid "TextArea1" +msgstr "-" diff --git a/app/examples/Drawing/Painting/.lang/de.po b/app/examples/Drawing/Painting/.lang/de.po new file mode 100644 index 00000000..abe77c45 --- /dev/null +++ b/app/examples/Drawing/Painting/.lang/de.po @@ -0,0 +1,129 @@ +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"POT-Creation-Date: 2002-11-01 04:27+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: .project:1 +msgid "Anti-Aliased Drawing" +msgstr "Zeichnen mit Anti-Aliasing" + +#: .project:2 +msgid "Anti-aliased drawing with the Paint class" +msgstr "antialisiertes Zeichnen mit der Paint-Klasse" + +#: FMain.form:54 +msgid "Example" +msgstr "Beispiel" + +#: FMain.form:65 +msgid "Arc" +msgstr "Kreisbogen" + +#: FMain.form:73 +msgid "Arc negative" +msgstr "Negativer Kreisbogen" + +#: FMain.form:80 +msgid "Clip" +msgstr "-" + +#: FMain.form:87 +msgid "Clip image" +msgstr "Bildausschnitt" + +#: FMain.form:94 +msgid "Curve rectangle" +msgstr "Abgerundetes Rechteck" + +#: FMain.form:101 +msgid "Curve to" +msgstr "Bogen nach" + +#: FMain.form:108 +msgid "Dash" +msgstr "Gestrichelt" + +#: FMain.form:115 +msgid "Fill and stroke" +msgstr "Gefüllt und umrandet" + +#: FMain.form:122 +msgid "Fill style" +msgstr "Füllstil" + +#: FMain.form:129 +msgid "Gradient" +msgstr "Verlauf" + +#: FMain.form:136 +msgid "Image" +msgstr "Bild" + +#: FMain.form:143 +msgid "Image pattern" +msgstr "Bildmuster" + +#: FMain.form:150 +msgid "Line widths" +msgstr "Linienbreite" + +#: FMain.form:157 +msgid "Multi segment caps" +msgstr "Mehrere Linienumrandungen" + +#: FMain.form:164 +msgid "Rounded rectangle" +msgstr "Abgerundetes Rechteck" + +#: FMain.form:171 +msgid "Set line cap" +msgstr "Linienumrandung wählen" + +#: FMain.form:178 +msgid "Set line join" +msgstr "Linienverbindung wählen" + +#: FMain.form:185 +msgid "SVG image" +msgstr "SVG-Bild" + +#: FMain.form:192 +msgid "Text" +msgstr "-" + +#: FMain.form:199 +msgid "Text clipping" +msgstr "Text beschneiden" + +#: FMain.form:206 +msgid "Text extents" +msgstr "Textbereiche" + +#: FMain.form:213 +msgid "Rotate" +msgstr "Drehen" + +#: FMain.form:224 +msgid "Scale" +msgstr "Maßstab" + +#: FMain.form:248 +msgid "Preview" +msgstr "Vorschau" + +#: FMain.form:255 +msgid "Source" +msgstr "Quellcode" + +#: FMain.form:260 +msgid "TextArea1" +msgstr "-" + diff --git a/app/examples/Drawing/Painting/.lang/ru.po b/app/examples/Drawing/Painting/.lang/ru.po new file mode 100644 index 00000000..ba0eff67 --- /dev/null +++ b/app/examples/Drawing/Painting/.lang/ru.po @@ -0,0 +1,148 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Drawing/Painting/.project:18 +msgid "Anti-Aliased Drawing" +msgstr "Сглаженное рисование" + +#: app/examples/Drawing/Painting/.project:19 +msgid "" +"Anti-aliased drawing with the Paint class.\n" +"\n" +"This example shows the different methods of the Paint class." +msgstr "" +"Сглаженный рисунок с классом рисования.\n" +"\n" +"В этом примере показаны различные методы класса рисования." + +#: app/examples/Drawing/Painting/.src/FMain.form:15 +msgid "Example" +msgstr "Пример" + +#: app/examples/Drawing/Painting/.src/FMain.form:24 +msgid "Arc" +msgstr "Дуга" + +#: app/examples/Drawing/Painting/.src/FMain.form:31 +msgid "Arc negative" +msgstr "Дуга отрицательная" + +#: app/examples/Drawing/Painting/.src/FMain.form:37 +msgid "Clip" +msgstr "Кадрировать" + +#: app/examples/Drawing/Painting/.src/FMain.form:43 +msgid "Clip image" +msgstr "Кадрировать изображение" + +#: app/examples/Drawing/Painting/.src/FMain.form:49 +msgid "Curve rectangle" +msgstr "Кривой прямоугольник" + +#: app/examples/Drawing/Painting/.src/FMain.form:55 +msgid "Curve to" +msgstr "Кривая к" + +#: app/examples/Drawing/Painting/.src/FMain.form:61 +msgid "Dash" +msgstr "Штрих-пунктирная" + +#: app/examples/Drawing/Painting/.src/FMain.form:67 +msgid "Fill and stroke" +msgstr "Заливка и обводка" + +#: app/examples/Drawing/Painting/.src/FMain.form:73 +msgid "Fill style" +msgstr "Стиль заполнения" + +#: app/examples/Drawing/Painting/.src/FMain.form:79 +msgid "Gradient" +msgstr "Градиент" + +#: app/examples/Drawing/Painting/.src/FMain.form:85 +msgid "Image" +msgstr "Изображение" + +#: app/examples/Drawing/Painting/.src/FMain.form:91 +msgid "Image pattern" +msgstr "Шаблон изображения" + +#: app/examples/Drawing/Painting/.src/FMain.form:97 +msgid "Line widths" +msgstr "Толщина линий" + +#: app/examples/Drawing/Painting/.src/FMain.form:103 +msgid "Multi segment caps" +msgstr "Концы мультисегмента" + +#: app/examples/Drawing/Painting/.src/FMain.form:109 +msgid "Rounded rectangle" +msgstr "Скруглённый прямоугольник" + +#: app/examples/Drawing/Painting/.src/FMain.form:115 +msgid "Set line cap" +msgstr "Установить заглушку" + +#: app/examples/Drawing/Painting/.src/FMain.form:121 +msgid "Set line join" +msgstr "Установить соединение строк" + +#: app/examples/Drawing/Painting/.src/FMain.form:127 +msgid "SVG image" +msgstr "Изображение SVG" + +#: app/examples/Drawing/Painting/.src/FMain.form:133 +msgid "Text" +msgstr "Текст" + +#: app/examples/Drawing/Painting/.src/FMain.form:139 +msgid "Text clipping" +msgstr "Кадрирование текста" + +#: app/examples/Drawing/Painting/.src/FMain.form:145 +msgid "Text extents" +msgstr "Текстовые экстенты" + +#: app/examples/Drawing/Painting/.src/FMain.form:151 +msgid "Rotate" +msgstr "Вращение" + +#: app/examples/Drawing/Painting/.src/FMain.form:160 +msgid "Scale" +msgstr "Масштаб" + +#: app/examples/Drawing/Painting/.src/FMain.form:177 +msgid "Preview" +msgstr "Предпросмотр" + +#: app/examples/Drawing/Painting/.src/FMain.form:183 +msgid "Source" +msgstr "Исходник" + +#: app/examples/Drawing/Painting/.src/FMain.form:187 +msgid "TextArea1" +msgstr "Текстовая_область_1" + diff --git a/app/examples/Drawing/Painting/.project b/app/examples/Drawing/Painting/.project new file mode 100644 index 00000000..8589a006 --- /dev/null +++ b/app/examples/Drawing/Painting/.project @@ -0,0 +1,16 @@ +# Gambas Project File 3.0 +Title=Anti-Aliased Drawing +Startup=FMain +Icon=icon.png +Version=1.0.0 +Component=gb.image +Component=gb.gui +Component=gb.form +Description="Anti-aliased drawing with the Paint class.\n\nThis example shows the different methods of the Paint class." +Authors="Fabien Bodard\nBenoît Minisini" +Environment="GB_GUI=gb.gtk3" +TabSize=2 +Translate=1 +Language=en +Vendor=Example +Packager=1 diff --git a/app/examples/Drawing/Painting/.src/FMain.class b/app/examples/Drawing/Painting/.src/FMain.class new file mode 100644 index 00000000..1bb948ad --- /dev/null +++ b/app/examples/Drawing/Painting/.src/FMain.class @@ -0,0 +1,548 @@ +' Gambas class file + +Private Const IMAGE_NAME As String = "clovis.jpg" +Private Const SVG_EXPORT As String = "~/Gambas with red ballon.svg" + +Private $sFunctionName As String = "Example1" + +Public Sub _new() + + Editor1.Text = File.Load($sFunctionName) + +End + +Public Sub Form_Open() + + HSplit1.Layout = [1, 2] + +End + +Public Sub Example1() + + Dim XC As Float = 128 + Dim YC As Float = 128 + Dim Radius As Float = 100 + Dim Angle1 As Float = Rad(-45) + Dim Angle2 As Float = Rad(-180) + Dim X, Y As Float + + Paint.LineWidth = 10 + Paint.Arc(XC, YC, Radius, Angle1, Angle2 - Angle1) + Paint.Stroke + + 'Draw helping Lines + Paint.LineWidth = 6.0 + Paint.Brush = Paint.Color(Color.RGB(255, 0.2 * 255, 0.2 * 255, 0.6 * 255)) + + Paint.Arc(XC, YC, 10.0) + Paint.Fill + + Paint.Arc(XC, YC, Radius, Angle1, 0) + X = Paint.X + Y = Paint.Y + Paint.Arc(XC, YC, Radius, Angle2, 0) + Paint.LineTo(XC, YC) + Paint.LineTo(X, Y) + Paint.Stroke + +End + + +Public Sub Example2() + + Dim XC As Float = 128 + Dim YC As Float = 128 + Dim Radius As Float = 100 + Dim Angle1 As Float = Rad(-45) + Dim Angle2 As Float = Rad(180) + Dim X, Y As Float + + Paint.LineWidth = 10 + Paint.Arc(XC, YC, Radius, Angle1, Angle2 - Angle1) + Paint.Stroke + + 'Draw helping Lines + Paint.LineWidth = 6.0 + Paint.Brush = Paint.Color(Color.RGB(255, 0.2 * 255, 0.2 * 255, 0.6 * 255)) + + Paint.Arc(XC, YC, 10.0) + Paint.Fill + + Paint.Arc(XC, YC, Radius, Angle1, 0) + X = Paint.X + Y = Paint.Y + Paint.Arc(XC, YC, Radius, Angle2, 0) + Paint.LineTo(XC, YC) + Paint.LineTo(X, Y) + Paint.Stroke + +End + +Public Sub Example3() + + Paint.Arc(128.0, 128.0, 76.8) + Paint.Clip + Paint.Rectangle(0, 0, 256, 256) + Paint.Fill + Paint.Brush = Paint.Color(Color.RGB(0, 255, 0)) + Paint.MoveTo(0, 0) + Paint.LineTo(256, 256) + Paint.MoveTo(256, 0) + Paint.LineTo(0, 256) + Paint.LineWidth = 10.0 + Paint.Stroke + +End + +Public Sub Example4() + + Dim hImg As Image + + Paint.Arc(128.0, 128.0, 76.8) + Paint.Clip + hImg = Image.Load(IMAGE_NAME) + Paint.Scale(256 / hImg.Width, 256 / hImg.Height) + Paint.Brush = Paint.Image(hImg, 0, 0) + Paint.Rectangle(0, 0, 512, 512) + Paint.Fill() + +End + +Public Sub Example5() + + ' A custom shape that could be wrapped in a function + Dim X0 As Float = 25.6 + Dim Y0 As Float = 25.6 + Dim RectWidth As Float = 204.8 + Dim RectHeight As Float = 204.8 + + Dim Radius As Float = 102.4 + + Dim X1, Y1 As Float + + X1 = X0 + RectWidth + Y1 = Y0 + RectHeight + + If Not (RectWidth > 0.0) Or Not (RectHeight > 0.0) Then Return + + If RectWidth / 2 < Radius Then + If RectHeight / 2 < Radius Then + Paint.MoveTo(X0, (Y0 + Y1) / 2) + Paint.CurveTo(X0, Y0, X0, Y0, (X0 + X1) / 2, Y0) + Paint.CurveTo(X1, Y0, X1, Y0, X1, (Y0 + Y1) / 2) + Paint.CurveTo(X1, Y1, X1, Y1, (X1 + X0) / 2, Y1) + Paint.CurveTo(X0, Y1, X0, Y1, X0, (Y0 + Y1) / 2) + Else + Paint.MoveTo(X0, Y0 + Radius) + Paint.CurveTo(X0, Y0, X0, Y0, (X0 + X1) / 2, Y0) + Paint.CurveTo(X1, Y0, X1, Y0, X1, Y0 + Radius) + Paint.LineTo(X1, Y1 - Radius) + Paint.CurveTo(X1, Y1, X1, Y1, (X1 + X0) / 2, Y1) + Paint.CurveTo(X0, Y1, X0, Y1, X0, Y1 - Radius) + Endif + Else + If (RectHeight / 2 < Radius) Then + Paint.MoveTo(X0, (Y0 + Y1) / 2) + Paint.CurveTo(X0, Y0, X0, Y0, X0 + Radius, Y0) + Paint.LineTo(X1 - Radius, Y0) + Paint.CurveTo(X1, Y0, X1, Y0, X1, (Y0 + Y1) / 2) + Paint.CurveTo(X1, Y1, X1, Y1, X1 - Radius, Y1) + Paint.LineTo(X0 + Radius, Y1) + Paint.CurveTo(X0, Y1, X0, Y1, X0, (Y0 + Y1) / 2) + Else + Paint.MoveTo(X0, Y0 + Radius) + Paint.CurveTo(X0, Y0, X0, Y0, X0 + Radius, Y0) + Paint.LineTo(X1 - Radius, Y0) + Paint.CurveTo(X1, Y0, X1, Y0, X1, Y0 + Radius) + Paint.LineTo(X1, Y1 - Radius) + Paint.CurveTo(X1, Y1, X1, Y1, X1 - Radius, Y1) + Paint.LineTo(X0 + Radius, Y1) + Paint.CurveTo(X0, Y1, X0, Y1, X0, Y1 - Radius) + Endif + Endif + + Paint.ClosePath + Paint.Brush = Paint.Color(Color.RGB(128, 128, 255)) + Paint.Fill(True) + Paint.Brush = Paint.Color(Color.RGB(128, 0, 0, 128)) + Paint.LineWidth = 10.0 + Paint.Stroke + +End + +Public Sub Example6() + + Dim X As Float = 25.6 + Dim Y As Float = 128.0 + Dim X1 As Float = 102.4 + Dim Y1 As Float = 230.4 + Dim X2 As Float = 153.6 + Dim Y2 As Float = 25.6 + Dim X3 As Float = 230.4 + Dim Y3 As Float = 128.0 + + Paint.MoveTo(X, Y) + Paint.CurveTo(X1, Y1, X2, Y2, X3, Y3) + + Paint.LineWidth = 10 + Paint.Stroke + + Paint.Brush = Paint.Color(Color.RGB(255, 255 * 0.2, 255 * 0.2, 255 * 0.6)) + Paint.LineWidth = 6 + + Paint.MoveTo(X, Y) + Paint.LineTo(X1, Y1) + Paint.MoveTo(X2, Y2) + Paint.LineTo(X3, Y3) + Paint.Stroke + +End + +Public Sub Example7() + + Dim Dashes As Float[] = [5.0, 'ink + 1.0, 'skip + 1.0, 'ink + 1.0] 'skip + + Paint.Dash = Dashes + Paint.DashOffset = -5 + Paint.LineWidth = 10.0 + Paint.MoveTo(128.0, 25.6) + Paint.LineTo(230.4, 230.4) + Paint.RelLineTo(-102.4, 0) + Paint.CurveTo(51.2, 230.4, 51.2, 128.0, 128.0, 128.0) + Paint.Stroke + +End + +Public Sub Example8() + + Paint.MoveTo(128.0, 25.6) + Paint.LineTo(230.4, 230.4) + Paint.LineTo(Paint.X - 102.4, Paint.Y) + Paint.CurveTo(51.2, 230.4, 51.2, 128.0, 128.0, 128.0) + Paint.ClosePath + + Paint.MoveTo(64.0, 25.6) + Paint.RelLineTo(51.2, 51.2) + Paint.RelLineTo(-51.2, 51.2) + Paint.RelLineTo(-51.2, -51.2) + Paint.ClosePath + + Paint.LineWidth = 10 + Paint.Brush = Paint.Color(Color.Blue) + Paint.Fill(True) + + Paint.Brush = Paint.Color(Color.Black) + Paint.Stroke + +End + +Public Sub Example9() + + Paint.LineWidth = 6 + Paint.Rectangle(12, 12, 232, 70) + Paint.Arc(64, 64, 40, 0, Pi(2)) + Paint.Arc(192, 64, 40, 0, Pi(-2)) + + Paint.FillRule = Paint.FillRuleEvenOdd + Paint.Brush = Paint.Color(Color.RGB(0, 179, 0)) + Paint.Fill(True) + Paint.Brush = Paint.Color(0) + Paint.Stroke + Paint.Translate(0, 128) + Paint.Rectangle(12, 12, 232, 70) + Paint.Arc(64, 64, 40, 0, Pi(-2)) + Paint.Arc(192, 64, 40, 0, Pi(2)) + Paint.FillRule = Paint.FillRuleWinding + Paint.Brush = Paint.Color(Color.RGB(0, 0, 230)) + Paint.Fill(True) + Paint.Brush = Paint.Color(0) + Paint.Stroke + +End + +Public Sub Example10() + + Paint.Brush = Paint.LinearGradient(0, 0, 0, 256, [Color.Black, Color.White], [1.0, 0.0]) + Paint.Rectangle(0, 0, 256, 256) + Paint.Fill + + Paint.Brush = Paint.RadialGradient(102.4, 102.4, 128.0, 115.2, 102.4, [Color.Black, Color.White], [1.0, 0.1]) + Paint.Arc(128, 128, 76.8) + Paint.Fill + +End + +Public Sub Example11() + + Dim X, Y, W, H As Float + Dim hBrush As PaintBrush + Dim hImage As Image + + hImage = Image.Load(IMAGE_NAME) + + X = 16 + Y = 40 + W = 200 + H = 200 + + 'Paint.DrawImage(hImage, X, Y, W, H) + + hBrush = Paint.Image(hImage) + hBrush.Translate(X, Y) + hBrush.Scale(W / hImage.W, H / hImage.H) + Paint.Brush = hBrush + Paint.Rectangle(X, Y, W, H) + Paint.Fill + + Paint.Brush = Paint.Color(Color.RGB(255, 127, 127, 153)) + Paint.Arc(X, Y, 10) + Paint.Fill + +End + +Public Sub Example12() + + Dim hImg As Image + Dim hBrush As PaintBrush + + hImg = Image.Load(IMAGE_NAME) + + Paint.Translate(128, 128) + 'Paint.Rotate(Pi / 4) + Paint.Scale(1 / Sqr(2), 1 / Sqr(2)) + Paint.Translate(-128, -128) + hBrush = Paint.Image(himg, 0, 0) + hBrush.Matrix = hBrush.Matrix.Scale(1 / (himg.w / 256.0 * 5.0), 1 / (hImg.w / 256.0 * 5.0)) + Paint.Brush = hBrush + Paint.Rectangle(0, 0, 256, 256) + Paint.Fill + +End + +Public Sub Example13() + + Paint.MoveTo(50, 75) + Paint.LineTo(200, 75) + + Paint.MoveTo(50, 125) + Paint.LineTo(200, 125) + + Paint.MoveTo(50, 175) + Paint.LineTo(200, 175) + + Paint.LineWidth = 30 + Paint.LineCap = Paint.LineCapRound + Paint.Stroke + +End + +Public Sub Example14() + + Paint.LineWidth = 30 + Paint.LineCap = Paint.LineCapButt + Paint.MoveTo(64, 50) + Paint.LineTo(64, 200) + Paint.Stroke + Paint.LineCap = Paint.LineCapRound + Paint.MoveTo(128, 50) + Paint.LineTo(128, 200) + Paint.Stroke + Paint.LineCap = Paint.LineCapSquare + Paint.MoveTo(192, 50) + Paint.LineTo(192, 200) + Paint.Stroke + + 'Draw helping lines + Paint.Brush = Paint.Color(Color.RGB(255, 31, 31)) + Paint.LineWidth = 6 + Paint.MoveTo(64, 50) + Paint.LineTo(64, 200) + Paint.MoveTo(128, 50) + Paint.LineTo(128, 200) + Paint.MoveTo(192, 50) + Paint.LineTo(192, 200) + Paint.Stroke + +End + +Public Sub Example15() + + Paint.LineWidth = 40.96 + Paint.MoveTo(76.8, 84.48) + Paint.RelLineTo(51.2, -51.2) + Paint.RelLineTo(51.2, 51.2) + Paint.LineJoin = Paint.LineJoinMiter 'Default + Paint.Stroke + + Paint.MoveTo(76.8, 161.28) + Paint.RelLineTo(51.2, -51.2) + Paint.RelLineTo(51.2, 51.2) + Paint.LineJoin = Paint.LineJoinBevel + Paint.Stroke + + Paint.MoveTo(76.8, 238.08) + Paint.RelLineTo(51.2, -51.2) + Paint.RelLineTo(51.2, 51.2) + Paint.LineJoin = Paint.LineJoinRound + Paint.Stroke + +End + +Public Sub Example16() + + Paint.Font.Name = "Sans" + Paint.Font.Size = 90 + Paint.Font.Bold = True + Paint.MoveTo(10, 135) + Paint.Text("Hello") + Paint.Fill + + Paint.MoveTo(70, 165) + Paint.text("void") + Paint.Brush = Paint.Color(Color.RGB(128, 128, 255)) + Paint.Fill(True) + Paint.Brush = Paint.Color(0) + Paint.LineWidth = 0 '2.56 + Paint.Stroke + + 'Draw helping lines + Paint.Brush = Paint.Color(Color.RGB(255, 31, 31, 93)) + Paint.Arc(10, 135, 5.12) + Paint.ClosePath + Paint.Arc(70, 165, 5.12) + Paint.Fill + +End + +Public Sub Example17() + + Dim sText As String = "Gambas
already means
Basic!" + + Dim X, Y As Float + Dim hExt As PaintExtents + + Paint.Font = Font["Sans,40"] + X = 50 + Y = 100 + + Paint.MoveTo(X, Y) + + hExt = Paint.RichTextExtents(sText) + + Paint.Brush = Paint.RadialGradient(50, 100, 300, 50, 100, [Color.Yellow, Color.Cyan], [1.0, 0.0]) + Paint.RichText(sText) + Paint.Fill + + Paint.Brush = Paint.Color(Color.RGB(255, 31, 31, 93)) + Paint.LineWidth = 1 + Paint.Arc(X, Y, 10) + Paint.Fill + + Paint.Brush = Paint.Color(Color.RGB(255, 31, 31, 224)) + Paint.Rectangle(hExt.X, hExt.Y, hExt.Width, hExt.Height) + Paint.Fill + +End + +Public Sub Example18() + + Paint.Save + Paint.Rectangle(10, 10, 200, 100) + Paint.Stroke(True) + Paint.Clip + Paint.Font.Size = 18 + 'Paint.Brush = Paint.Color(Color.Blue) + Paint.Text("TO BE, OR NOT TO BE: THAT IS THE QUESTION:", 10, 10, 30, 30) + Paint.Fill + Paint.Restore + 'Paint.Brush = Paint.Color(Color.Blue) + Paint.Text("TO BE, OR NOT TO BE: THAT IS THE QUESTION:", 10, 40, 30, 30) + Paint.Fill + +End + + +Public Sub Example20() + + Dim eWidth As Float + Dim Y As Float + + Y = 20.5 + For eWidth = 0 To 5 Step 0.25 + Paint.LineWidth = eWidth + Paint.MoveTo(50, Y) + Paint.RelLineTo(200, 0) + Paint.Stroke + Paint.Text(eWidth, 0, Y - 10, 40, 20, Align.Right) + Paint.Fill + Y += 20 + Next + +End + +Private $hSvgImage As SvgImage + +Public Sub Example21() + + If Not $hSvgImage Then + $hSvgImage = SvgImage.Load("gambas.svg") + Paint.Begin($hSvgImage) + Paint.Brush = Paint.RadialGradient(200, 140, 40, 215, 115, [Color.RGB(255, 0, 0, 64), Color.White], [1.0, 0.1]) + Paint.Arc(200, 140, 40) + Paint.Fill + Paint.End + Endif + + $hSvgImage.Paint + +End + +Public Sub Example22() + + Paint.Background = Color.RGB(128, 128, 255) + Paint.Rectangle(32, 32, 192, 192, 32) + Paint.Fill(True) + Paint.Background = Color.RGB(128, 0, 0, 128) + Paint.LineWidth = 10 + Paint.Stroke + 'Paint.Background = Color.Black + 'Paint.Arc(128, 128, 96) + 'Paint.Stroke + +End + +Public Sub optExample_Click() + + $sFunctionName = "Example" & Last.tag + Try Editor1.text = File.Load($sFunctionName) + If Error Then Editor1.Text = Error.Text + DrawingArea1.Refresh + +End + +Public Sub DrawingArea1_Draw() + + Paint.Reset + Paint.Scale(sldScale.Value / 100, sldScale.Value / 100) + Paint.Translate(128, 128) + Paint.Rotate(Rad(sldRotate.Value)) + Paint.Translate(-128, -128) + Object.Call(Me, $sFunctionName) + +End + +Public Sub sldRotate_Change() + + DrawingArea1.Refresh + +End + +Public Sub sldScale_Change() + + DrawingArea1.Refresh + +End + diff --git a/app/examples/Drawing/Painting/.src/FMain.form b/app/examples/Drawing/Painting/.src/FMain.form new file mode 100644 index 00000000..2fbf98c6 --- /dev/null +++ b/app/examples/Drawing/Painting/.src/FMain.form @@ -0,0 +1,195 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,118,89) + Arrangement = Arrange.Fill + { HSplit1 HSplit + MoveScaled(1,1,104,87) + { VBox1 VBox + MoveScaled(1,2,41,85) + Spacing = True + Margin = True + { Label3 Label + MoveScaled(1,1,19,3) + Font = Font["Bold"] + Text = ("Example") + } + { VBox2 VBox + MoveScaled(2,4,38,64) + AutoResize = True + { Exemple1 RadioButton optExample + Name = "Exemple1" + MoveScaled(0,0,38,3) + Tag = "1" + Text = ("Arc") + Value = True + } + { Exemple2 RadioButton optExample + Name = "Exemple2" + MoveScaled(0,3,38,3) + Tag = "2" + Text = ("Arc negative") + } + { Exemple3 RadioButton optExample + Name = "Exemple3" + MoveScaled(0,6,38,3) + Tag = "3" + Text = ("Clip") + } + { Exemple4 RadioButton optExample + Name = "Exemple4" + MoveScaled(0,9,38,3) + Tag = "4" + Text = ("Clip image") + } + { Exemple5 RadioButton optExample + Name = "Exemple5" + MoveScaled(0,12,38,3) + Tag = "5" + Text = ("Curve rectangle") + } + { Exemple6 RadioButton optExample + Name = "Exemple6" + MoveScaled(0,15,38,3) + Tag = "6" + Text = ("Curve to") + } + { Exemple7 RadioButton optExample + Name = "Exemple7" + MoveScaled(0,18,38,3) + Tag = "7" + Text = ("Dash") + } + { Exemple8 RadioButton optExample + Name = "Exemple8" + MoveScaled(0,21,38,3) + Tag = "8" + Text = ("Fill and stroke") + } + { Exemple9 RadioButton optExample + Name = "Exemple9" + MoveScaled(0,24,38,3) + Tag = "9" + Text = ("Fill style") + } + { Exemple10 RadioButton optExample + Name = "Exemple10" + MoveScaled(0,27,38,3) + Tag = "10" + Text = ("Gradient") + } + { Exemple11 RadioButton optExample + Name = "Exemple11" + MoveScaled(0,30,38,3) + Tag = "11" + Text = ("Image") + } + { Exemple12 RadioButton optExample + Name = "Exemple12" + MoveScaled(0,33,38,3) + Tag = "12" + Text = ("Image pattern") + } + { Exemple20 RadioButton optExample + Name = "Exemple20" + MoveScaled(0,36,38,3) + Tag = "20" + Text = ("Line widths") + } + { Exemple13 RadioButton optExample + Name = "Exemple13" + MoveScaled(0,39,38,3) + Tag = "13" + Text = ("Multi segment caps") + } + { Exemple19 RadioButton optExample + Name = "Exemple19" + MoveScaled(0,42,38,3) + Tag = "22" + Text = ("Rounded rectangle") + } + { Exemple14 RadioButton optExample + Name = "Exemple14" + MoveScaled(0,45,38,3) + Tag = "14" + Text = ("Set line cap") + } + { Exemple15 RadioButton optExample + Name = "Exemple15" + MoveScaled(0,48,38,3) + Tag = "15" + Text = ("Set line join") + } + { Exemple21 RadioButton optExample + Name = "Exemple21" + MoveScaled(0,51,38,3) + Tag = "21" + Text = ("SVG image") + } + { Exemple16 RadioButton optExample + Name = "Exemple16" + MoveScaled(0,54,38,3) + Tag = "16" + Text = ("Text") + } + { Exemple18 RadioButton optExample + Name = "Exemple18" + MoveScaled(0,57,38,3) + Tag = "18" + Text = ("Text clipping") + } + { Exemple17 RadioButton optExample + Name = "Exemple17" + MoveScaled(0,60,38,3) + Tag = "17" + Text = ("Text extents") + } + } + { Label1 Label + MoveScaled(2,69,19,3) + Font = Font["Bold"] + Text = ("Rotate") + } + { sldRotate Slider + MoveScaled(2,73,31,4) + MaxValue = 360 + } + { Label2 Label + MoveScaled(2,77,19,3) + Font = Font["Bold"] + Text = ("Scale") + } + { sldScale Slider + MoveScaled(2,81,31,4) + MinValue = 100 + MaxValue = 400 + } + } + { Panel1 HBox + MoveScaled(44,2,56,73) + { TabStrip1 TabPanel + MoveScaled(6,0,49,72) + Expand = True + Arrangement = Arrange.Fill + Border = False + Count = 2 + Index = 0 + Text = ("Preview") + { DrawingArea1 DrawingArea + MoveScaled(3,1,38,45) + Background = &HFFFFFF& + } + Index = 1 + Text = ("Source") + { Editor1 TextArea + MoveScaled(8,2,32,37) + Font = Font["Monospace,-1"] + Text = ("TextArea1") + ReadOnly = True + Border = False + } + Index = 0 + } + } + } +} diff --git a/app/examples/Drawing/Painting/.src/MMakeSourceFile.module b/app/examples/Drawing/Painting/.src/MMakeSourceFile.module new file mode 100644 index 00000000..346b4717 --- /dev/null +++ b/app/examples/Drawing/Painting/.src/MMakeSourceFile.module @@ -0,0 +1,32 @@ +' Gambas module file + +Private Const ROOT As String = "~/gambas/3.0/trunk/examples/examples/Drawing/Painting/" + +Public Sub Main() + + Dim hFile As File + Dim sLine As String + Dim sName As String + Dim sSource As String + + hFile = Open ROOT &/ ".src/FMain.class" + While Not Eof(hFile) + Line Input #hFile, sLine + If Trim(sLine) Like "Public Sub Example*" Then + sName = Scan(sLine, "Public Sub *()")[0] + sSource = sLine & "\n" + Continue + Else If sName Then + If Trim(sLine) = "End" Then + sSource &= sLine & "\n" + File.Save(ROOT &/ sName, sSource) + Print sName + sName = "" + Else + sSource &= sLine & "\n" + Endif + Endif + Wend + Close hFile + +End diff --git a/app/examples/Drawing/Painting/Example1 b/app/examples/Drawing/Painting/Example1 new file mode 100644 index 00000000..46a36054 --- /dev/null +++ b/app/examples/Drawing/Painting/Example1 @@ -0,0 +1,29 @@ +Public Sub Example1() + + Dim XC As Float = 128 + Dim YC As Float = 128 + Dim Radius As Float = 100 + Dim Angle1 As Float = Rad(-45) + Dim Angle2 As Float = Rad(-180) + Dim X, Y As Float + + Paint.LineWidth = 10 + Paint.Arc(XC, YC, Radius, Angle1, Angle2 - Angle1) + Paint.Stroke + + 'Draw helping Lines + Paint.LineWidth = 6.0 + Paint.Brush = Paint.Color(Color.RGB(255, 0.2 * 255, 0.2 * 255, 0.6 * 255)) + + Paint.Arc(XC, YC, 10.0) + Paint.Fill + + Paint.Arc(XC, YC, Radius, Angle1, 0) + X = Paint.X + Y = Paint.Y + Paint.Arc(XC, YC, Radius, Angle2, 0) + Paint.LineTo(XC, YC) + Paint.LineTo(X, Y) + Paint.Stroke + +End diff --git a/app/examples/Drawing/Painting/Example10 b/app/examples/Drawing/Painting/Example10 new file mode 100644 index 00000000..f259831c --- /dev/null +++ b/app/examples/Drawing/Painting/Example10 @@ -0,0 +1,11 @@ +Public Sub Example10() + + Paint.Brush = Paint.LinearGradient(0, 0, 0, 256, [Color.Black, Color.White], [1.0, 0.0]) + Paint.Rectangle(0, 0, 256, 256) + Paint.Fill + + Paint.Brush = Paint.RadialGradient(102.4, 102.4, 128.0, 115.2, 102.4, [Color.Black, Color.White], [1.0, 0.1]) + Paint.Arc(128, 128, 76.8) + Paint.Fill + +End diff --git a/app/examples/Drawing/Painting/Example11 b/app/examples/Drawing/Painting/Example11 new file mode 100644 index 00000000..5f026c8e --- /dev/null +++ b/app/examples/Drawing/Painting/Example11 @@ -0,0 +1,26 @@ +Public Sub Example11() + + Dim X, Y, W, H As Float + Dim hBrush As PaintBrush + Dim hImage As Image + + hImage = Image.Load(IMAGE_NAME) + + X = 16 + Y = 40 + W = 200 + H = 200 + + hBrush = Paint.Image(hImage) + hBrush.Translate(X, Y) + hBrush.Scale(W / hImage.W, H / hImage.H) + Paint.Brush = hBrush + Paint.Rectangle(X, Y, W, H) + Paint.Fill + 'Paint.DrawImage(hImage, X, Y, W, H) + + Paint.Brush = Paint.Color(Color.RGB(255, 127, 127, 153)) + Paint.Arc(X, Y, 10) + Paint.Fill + +End diff --git a/app/examples/Drawing/Painting/Example12 b/app/examples/Drawing/Painting/Example12 new file mode 100644 index 00000000..5dde3f3e --- /dev/null +++ b/app/examples/Drawing/Painting/Example12 @@ -0,0 +1,18 @@ +Public Sub Example12() + + Dim hImg As Image + Dim hBrush As PaintBrush + + hImg = Image.Load(IMAGE_NAME) + + Paint.Translate(128, 128) + 'Paint.Rotate(Pi / 4) + Paint.Scale(1 / Sqr(2), 1 / Sqr(2)) + Paint.Translate(-128, -128) + hBrush = Paint.Image(himg, 0, 0) + hBrush.Matrix = hBrush.Matrix.Scale(1 / (himg.w / 256.0 * 5.0), 1 / (hImg.w / 256.0 * 5.0)) + Paint.Brush = hBrush + Paint.Rectangle(0, 0, 256, 256) + Paint.Fill + +End diff --git a/app/examples/Drawing/Painting/Example13 b/app/examples/Drawing/Painting/Example13 new file mode 100644 index 00000000..20801a6a --- /dev/null +++ b/app/examples/Drawing/Painting/Example13 @@ -0,0 +1,16 @@ +Public Sub Example13() + + Paint.MoveTo(50, 75) + Paint.LineTo(200, 75) + + Paint.MoveTo(50, 125) + Paint.LineTo(200, 125) + + Paint.MoveTo(50, 175) + Paint.LineTo(200, 175) + + Paint.LineWidth = 30 + Paint.LineCap = Paint.LineCapRound + Paint.Stroke + +End diff --git a/app/examples/Drawing/Painting/Example14 b/app/examples/Drawing/Painting/Example14 new file mode 100644 index 00000000..4dca4dd0 --- /dev/null +++ b/app/examples/Drawing/Painting/Example14 @@ -0,0 +1,28 @@ +Public Sub Example14() + + Paint.LineWidth = 30 + Paint.LineCap = Paint.LineCapButt + Paint.MoveTo(64, 50) + Paint.LineTo(64, 200) + Paint.Stroke + Paint.LineCap = Paint.LineCapRound + Paint.MoveTo(128, 50) + Paint.LineTo(128, 200) + Paint.Stroke + Paint.LineCap = Paint.LineCapSquare + Paint.MoveTo(192, 50) + Paint.LineTo(192, 200) + Paint.Stroke + + 'Draw helping lines + Paint.Brush = Paint.Color(Color.RGB(255, 31, 31)) + Paint.LineWidth = 6 + Paint.MoveTo(64, 50) + Paint.LineTo(64, 200) + Paint.MoveTo(128, 50) + Paint.LineTo(128, 200) + Paint.MoveTo(192, 50) + Paint.LineTo(192, 200) + Paint.Stroke + +End diff --git a/app/examples/Drawing/Painting/Example15 b/app/examples/Drawing/Painting/Example15 new file mode 100644 index 00000000..910f33f7 --- /dev/null +++ b/app/examples/Drawing/Painting/Example15 @@ -0,0 +1,22 @@ +Public Sub Example15() + + Paint.LineWidth = 40.96 + Paint.MoveTo(76.8, 84.48) + Paint.RelLineTo(51.2, -51.2) + Paint.RelLineTo(51.2, 51.2) + Paint.LineJoin = Paint.LineJoinMiter 'Default + Paint.Stroke + + Paint.MoveTo(76.8, 161.28) + Paint.RelLineTo(51.2, -51.2) + Paint.RelLineTo(51.2, 51.2) + Paint.LineJoin = Paint.LineJoinBevel + Paint.Stroke + + Paint.MoveTo(76.8, 238.08) + Paint.RelLineTo(51.2, -51.2) + Paint.RelLineTo(51.2, 51.2) + Paint.LineJoin = Paint.LineJoinRound + Paint.Stroke + +End diff --git a/app/examples/Drawing/Painting/Example16 b/app/examples/Drawing/Painting/Example16 new file mode 100644 index 00000000..f70640b7 --- /dev/null +++ b/app/examples/Drawing/Painting/Example16 @@ -0,0 +1,25 @@ +Public Sub Example16() + + Paint.Font.Name = "Sans" + Paint.Font.Size = 90 + Paint.Font.Bold = True + Paint.MoveTo(10, 135) + Paint.Text("Hello") + Paint.Fill + + Paint.MoveTo(70, 165) + Paint.text("void") + Paint.Brush = Paint.Color(Color.RGB(128, 128, 255)) + Paint.Fill(True) + Paint.Brush = Paint.Color(0) + Paint.LineWidth = 2.56 + Paint.Stroke + + 'Draw helping lines + Paint.Brush = Paint.Color(Color.RGB(255, 31, 31, 93)) + Paint.Arc(10, 135, 5.12) + Paint.ClosePath + Paint.Arc(70, 165, 5.12) + Paint.Fill + +End diff --git a/app/examples/Drawing/Painting/Example17 b/app/examples/Drawing/Painting/Example17 new file mode 100644 index 00000000..b4f0e315 --- /dev/null +++ b/app/examples/Drawing/Painting/Example17 @@ -0,0 +1,29 @@ +Public Sub Example17() + + Dim sText As String = "Gambas
already means
Basic!" + + Dim X, Y As Float + Dim hExt As PaintExtents + + Paint.Font = Font["Sans,40"] + X = 50 + Y = 100 + + Paint.MoveTo(X, Y) + + hExt = Paint.RichTextExtents(sText) + + Paint.Brush = Paint.RadialGradient(50, 100, 300, 50, 100, [Color.Yellow, Color.Cyan], [1.0, 0.0]) + Paint.RichText(sText) + Paint.Fill + + Paint.Brush = Paint.Color(Color.RGB(255, 31, 31, 93)) + Paint.LineWidth = 1 + Paint.Arc(X, Y, 10) + Paint.Fill + + Paint.Brush = Paint.Color(Color.RGB(255, 31, 31, 224)) + Paint.Rectangle(hExt.X, hExt.Y, hExt.Width, hExt.Height) + Paint.Fill + +End diff --git a/app/examples/Drawing/Painting/Example18 b/app/examples/Drawing/Painting/Example18 new file mode 100644 index 00000000..083f9032 --- /dev/null +++ b/app/examples/Drawing/Painting/Example18 @@ -0,0 +1,16 @@ +Public Sub Example18() + + Paint.Save + Paint.Rectangle(10, 10, 200, 100) + Paint.Stroke(True) + Paint.Clip + Paint.Font.Size = 18 + 'Paint.Brush = Paint.Color(Color.Blue) + Paint.Text("TO BE, OR NOT TO BE: THAT IS THE QUESTION:", 10, 10, 30, 30) + Paint.Fill + Paint.Restore + 'Paint.Brush = Paint.Color(Color.Blue) + Paint.Text("TO BE, OR NOT TO BE: THAT IS THE QUESTION:", 10, 40, 30, 30) + Paint.Fill + +End diff --git a/app/examples/Drawing/Painting/Example2 b/app/examples/Drawing/Painting/Example2 new file mode 100644 index 00000000..08f7a64d --- /dev/null +++ b/app/examples/Drawing/Painting/Example2 @@ -0,0 +1,29 @@ +Public Sub Example2() + + Dim XC As Float = 128 + Dim YC As Float = 128 + Dim Radius As Float = 100 + Dim Angle1 As Float = Rad(-45) + Dim Angle2 As Float = Rad(180) + Dim X, Y As Float + + Paint.LineWidth = 10 + Paint.Arc(XC, YC, Radius, Angle1, Angle2 - Angle1) + Paint.Stroke + + 'Draw helping Lines + Paint.LineWidth = 6.0 + Paint.Brush = Paint.Color(Color.RGB(255, 0.2 * 255, 0.2 * 255, 0.6 * 255)) + + Paint.Arc(XC, YC, 10.0) + Paint.Fill + + Paint.Arc(XC, YC, Radius, Angle1, 0) + X = Paint.X + Y = Paint.Y + Paint.Arc(XC, YC, Radius, Angle2, 0) + Paint.LineTo(XC, YC) + Paint.LineTo(X, Y) + Paint.Stroke + +End diff --git a/app/examples/Drawing/Painting/Example20 b/app/examples/Drawing/Painting/Example20 new file mode 100644 index 00000000..d7d61caa --- /dev/null +++ b/app/examples/Drawing/Painting/Example20 @@ -0,0 +1,17 @@ +Public Sub Example20() + + Dim eWidth As Float + Dim Y As Float + + Y = 20.5 + For eWidth = 0 To 5 Step 0.25 + Paint.LineWidth = eWidth + Paint.MoveTo(50, Y) + Paint.RelLineTo(200, 0) + Paint.Stroke + Paint.Text(eWidth, 0, Y - 10, 40, 20, Align.Right) + Paint.Fill + Y += 20 + Next + +End diff --git a/app/examples/Drawing/Painting/Example21 b/app/examples/Drawing/Painting/Example21 new file mode 100644 index 00000000..429f40b0 --- /dev/null +++ b/app/examples/Drawing/Painting/Example21 @@ -0,0 +1,14 @@ +Public Sub Example21() + + If Not $hSvgImage Then + $hSvgImage = SvgImage.Load("gambas.svg") + Paint.Begin($hSvgImage) + Paint.Brush = Paint.RadialGradient(200, 140, 40, 215, 115, [Color.RGB(255, 0, 0, 64), Color.White], [1.0, 0.1]) + Paint.Arc(200, 140, 40) + Paint.Fill + Paint.End + Endif + + $hSvgImage.Paint + +End diff --git a/app/examples/Drawing/Painting/Example22 b/app/examples/Drawing/Painting/Example22 new file mode 100644 index 00000000..80132b6b --- /dev/null +++ b/app/examples/Drawing/Painting/Example22 @@ -0,0 +1,10 @@ +Public Sub Example22() + + Paint.Background = Color.RGB(128, 128, 255) + Paint.Rectangle(32, 32, 192, 192, 32) + Paint.Fill(True) + Paint.Background = Color.RGB(128, 0, 0, 128) + Paint.LineWidth = 10 + Paint.Stroke + +End diff --git a/app/examples/Drawing/Painting/Example3 b/app/examples/Drawing/Painting/Example3 new file mode 100644 index 00000000..3e5829b2 --- /dev/null +++ b/app/examples/Drawing/Painting/Example3 @@ -0,0 +1,15 @@ +Public Sub Example3() + + Paint.Arc(128.0, 128.0, 76.8) + Paint.Clip + Paint.Rectangle(0, 0, 256, 256) + Paint.Fill + Paint.Brush = Paint.Color(Color.RGB(0, 255, 0)) + Paint.MoveTo(0, 0) + Paint.LineTo(256, 256) + Paint.MoveTo(256, 0) + Paint.LineTo(0, 256) + Paint.LineWidth = 10.0 + Paint.Stroke + +End diff --git a/app/examples/Drawing/Painting/Example4 b/app/examples/Drawing/Painting/Example4 new file mode 100644 index 00000000..26902e15 --- /dev/null +++ b/app/examples/Drawing/Painting/Example4 @@ -0,0 +1,13 @@ +Public Sub Example4() + + Dim hImg As Image + + Paint.Arc(128.0, 128.0, 76.8) + Paint.Clip + hImg = Image.Load(IMAGE_NAME) + Paint.Scale(256 / hImg.Width, 256 / hImg.Height) + Paint.Brush = Paint.Image(hImg, 0, 0) + Paint.Rectangle(0, 0, 512, 512) + Paint.Fill() + +End diff --git a/app/examples/Drawing/Painting/Example5 b/app/examples/Drawing/Painting/Example5 new file mode 100644 index 00000000..e2056d94 --- /dev/null +++ b/app/examples/Drawing/Painting/Example5 @@ -0,0 +1,61 @@ +Public Sub Example5() + + ' A custom shape that could be wrapped in a function + Dim X0 As Float = 25.6 + Dim Y0 As Float = 25.6 + Dim RectWidth As Float = 204.8 + Dim RectHeight As Float = 204.8 + + Dim Radius As Float = 102.4 + + Dim X1, Y1 As Float + + X1 = X0 + RectWidth + Y1 = Y0 + RectHeight + + If Not (RectWidth > 0.0) Or Not (RectHeight > 0.0) Then Return + + If RectWidth / 2 < Radius Then + If RectHeight / 2 < Radius Then + Paint.MoveTo(X0, (Y0 + Y1) / 2) + Paint.CurveTo(X0, Y0, X0, Y0, (X0 + X1) / 2, Y0) + Paint.CurveTo(X1, Y0, X1, Y0, X1, (Y0 + Y1) / 2) + Paint.CurveTo(X1, Y1, X1, Y1, (X1 + X0) / 2, Y1) + Paint.CurveTo(X0, Y1, X0, Y1, X0, (Y0 + Y1) / 2) + Else + Paint.MoveTo(X0, Y0 + Radius) + Paint.CurveTo(X0, Y0, X0, Y0, (X0 + X1) / 2, Y0) + Paint.CurveTo(X1, Y0, X1, Y0, X1, Y0 + Radius) + Paint.LineTo(X1, Y1 - Radius) + Paint.CurveTo(X1, Y1, X1, Y1, (X1 + X0) / 2, Y1) + Paint.CurveTo(X0, Y1, X0, Y1, X0, Y1 - Radius) + Endif + Else + If (RectHeight / 2 < Radius) Then + Paint.MoveTo(X0, (Y0 + Y1) / 2) + Paint.CurveTo(X0, Y0, X0, Y0, X0 + Radius, Y0) + Paint.LineTo(X1 - Radius, Y0) + Paint.CurveTo(X1, Y0, X1, Y0, X1, (Y0 + Y1) / 2) + Paint.CurveTo(X1, Y1, X1, Y1, X1 - Radius, Y1) + Paint.LineTo(X0 + Radius, Y1) + Paint.CurveTo(X0, Y1, X0, Y1, X0, (Y0 + Y1) / 2) + Else + Paint.MoveTo(X0, Y0 + Radius) + Paint.CurveTo(X0, Y0, X0, Y0, X0 + Radius, Y0) + Paint.LineTo(X1 - Radius, Y0) + Paint.CurveTo(X1, Y0, X1, Y0, X1, Y0 + Radius) + Paint.LineTo(X1, Y1 - Radius) + Paint.CurveTo(X1, Y1, X1, Y1, X1 - Radius, Y1) + Paint.LineTo(X0 + Radius, Y1) + Paint.CurveTo(X0, Y1, X0, Y1, X0, Y1 - Radius) + Endif + Endif + + Paint.ClosePath + Paint.Brush = Paint.Color(Color.RGB(128, 128, 255)) + Paint.Fill(True) + Paint.Brush = Paint.Color(Color.RGB(128, 0, 0, 128)) + Paint.LineWidth = 10.0 + Paint.Stroke + +End diff --git a/app/examples/Drawing/Painting/Example6 b/app/examples/Drawing/Painting/Example6 new file mode 100644 index 00000000..f9b00cfb --- /dev/null +++ b/app/examples/Drawing/Painting/Example6 @@ -0,0 +1,27 @@ +Public Sub Example6() + + Dim X As Float = 25.6 + Dim Y As Float = 128.0 + Dim X1 As Float = 102.4 + Dim Y1 As Float = 230.4 + Dim X2 As Float = 153.6 + Dim Y2 As Float = 25.6 + Dim X3 As Float = 230.4 + Dim Y3 As Float = 128.0 + + Paint.MoveTo(X, Y) + Paint.CurveTo(X1, Y1, X2, Y2, X3, Y3) + + Paint.LineWidth = 10 + Paint.Stroke + + Paint.Brush = Paint.Color(Color.RGB(255, 255 * 0.2, 255 * 0.2, 255 * 0.6)) + Paint.LineWidth = 6 + + Paint.MoveTo(X, Y) + Paint.LineTo(X1, Y1) + Paint.MoveTo(X2, Y2) + Paint.LineTo(X3, Y3) + Paint.Stroke + +End diff --git a/app/examples/Drawing/Painting/Example7 b/app/examples/Drawing/Painting/Example7 new file mode 100644 index 00000000..08ca4a26 --- /dev/null +++ b/app/examples/Drawing/Painting/Example7 @@ -0,0 +1,17 @@ +Public Sub Example7() + + Dim Dashes As Float[] = [5.0, 'ink + 1.0, 'skip + 1.0, 'ink + 1.0] 'skip + + Paint.Dash = Dashes + Paint.DashOffset = -5 + Paint.LineWidth = 10.0 + Paint.MoveTo(128.0, 25.6) + Paint.LineTo(230.4, 230.4) + Paint.RelLineTo(-102.4, 0) + Paint.CurveTo(51.2, 230.4, 51.2, 128.0, 128.0, 128.0) + Paint.Stroke + +End diff --git a/app/examples/Drawing/Painting/Example8 b/app/examples/Drawing/Painting/Example8 new file mode 100644 index 00000000..453c3041 --- /dev/null +++ b/app/examples/Drawing/Painting/Example8 @@ -0,0 +1,22 @@ +Public Sub Example8() + + Paint.MoveTo(128.0, 25.6) + Paint.LineTo(230.4, 230.4) + Paint.LineTo(Paint.X - 102.4, Paint.Y) + Paint.CurveTo(51.2, 230.4, 51.2, 128.0, 128.0, 128.0) + Paint.ClosePath + + Paint.MoveTo(64.0, 25.6) + Paint.RelLineTo(51.2, 51.2) + Paint.RelLineTo(-51.2, 51.2) + Paint.RelLineTo(-51.2, -51.2) + Paint.ClosePath + + Paint.LineWidth = 10 + Paint.Brush = Paint.Color(Color.Blue) + Paint.Fill(True) + + Paint.Brush = Paint.Color(Color.Black) + Paint.Stroke + +End diff --git a/app/examples/Drawing/Painting/Example9 b/app/examples/Drawing/Painting/Example9 new file mode 100644 index 00000000..43ecfc4c --- /dev/null +++ b/app/examples/Drawing/Painting/Example9 @@ -0,0 +1,23 @@ +Public Sub Example9() + + Paint.LineWidth = 6 + Paint.Rectangle(12, 12, 232, 70) + Paint.Arc(64, 64, 40, 0, Pi(2)) + Paint.Arc(192, 64, 40, 0, Pi(-2)) + + Paint.FillRule = Paint.FillRuleEvenOdd + Paint.Brush = Paint.Color(Color.RGB(0, 179, 0)) + Paint.Fill(True) + Paint.Brush = Paint.Color(0) + Paint.Stroke + Paint.Translate(0, 128) + Paint.Rectangle(12, 12, 232, 70) + Paint.Arc(64, 64, 40, 0, Pi(-2)) + Paint.Arc(192, 64, 40, 0, Pi(2)) + Paint.FillRule = Paint.FillRuleWinding + Paint.Brush = Paint.Color(Color.RGB(0, 0, 230)) + Paint.Fill(True) + Paint.Brush = Paint.Color(0) + Paint.Stroke + +End diff --git a/app/examples/Drawing/Painting/clovis.jpg b/app/examples/Drawing/Painting/clovis.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2c4c89ffc7ae280aa7ae45cdf21e81fdbd10daaa GIT binary patch literal 15838 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 K&+;TcSN;#PjmS3u literal 0 HcmV?d00001 diff --git a/app/examples/Drawing/Painting/gambas.svg b/app/examples/Drawing/Painting/gambas.svg new file mode 100644 index 00000000..5bfafe4d --- /dev/null +++ b/app/examples/Drawing/Painting/gambas.svg @@ -0,0 +1,540 @@ + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + Gambas 3 + 15/09/2008 + + + Fabien Bodard + + + + + Common Creative + + + + + Fabien Bodard + + + gbFBodard150908 + http://gambas.sf.net + + + gambas3 logo basic shrimp + + + A pretty shrimp, a malicious new gambas logo... we got the power ! + + + Fabien Bodard + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/examples/Drawing/Painting/icon.png b/app/examples/Drawing/Painting/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..18f9f05d5d8bfbd0b241f564b753218c3c2c3e11 GIT binary patch literal 2078 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 literal 0 HcmV?d00001 diff --git a/app/examples/Drawing/QuasiRegular/.directory b/app/examples/Drawing/QuasiRegular/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/app/examples/Drawing/QuasiRegular/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/app/examples/Drawing/QuasiRegular/.hidden/screenshots/2014-12-14.png b/app/examples/Drawing/QuasiRegular/.hidden/screenshots/2014-12-14.png new file mode 100644 index 0000000000000000000000000000000000000000..a5876b55d2b5a7db3a51fc54a06080e4365aa7b5 GIT binary patch literal 44667 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 literal 0 HcmV?d00001 diff --git a/app/examples/Drawing/QuasiRegular/.icon.png b/app/examples/Drawing/QuasiRegular/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5b793fca03652dc51e469e9f2b6ca2fe14e2578e GIT binary patch literal 3730 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 literal 0 HcmV?d00001 diff --git a/app/examples/Drawing/RandomColorSort/.directory b/app/examples/Drawing/RandomColorSort/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/app/examples/Drawing/RandomColorSort/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/app/examples/Drawing/RandomColorSort/.hidden/screenshots/2014-12-14.png b/app/examples/Drawing/RandomColorSort/.hidden/screenshots/2014-12-14.png new file mode 100644 index 0000000000000000000000000000000000000000..c5fc40610b9c2f4173acce0c7144b42507b920f1 GIT binary patch literal 247987 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 z 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 L%o>n&L literal 0 HcmV?d00001 diff --git a/app/examples/Drawing/RandomColorSort/.icon.png b/app/examples/Drawing/RandomColorSort/.icon.png new file mode 100644 index 0000000000000000000000000000000000000000..de4974fd0932fbb97a3bdb2538ad6f29e2270ca6 GIT binary patch literal 3663 zcmV-V4zTfwP)xQCqyh@@U?7+=#(-sHgI8_VW?8MJ)h(%C_v`oG%^#9%Nwz7=_SnJE zS9Pnp-|If_e&0R!+;h*nFpqi6V;=LE$NyW1^IiPz^FxpLLViapQ*$v!3}n&{2l7Pj z_a6OxMf0^Lb=d;^`OZYohJ_bLehR*UciTyZEpO{%50t%st%+SMDPF^VJ^)W z!;ST(AnmAK-+f`=rfW^?vIOuAxSpAF^L@kmI=^5%D|Y?qCq#tvPJut$IcQc^noBn7 z8)zL6c>cAfHv!K#PR`|}$G=$i`PujMg$TI*r3(PCsPyvwe}xe^aa!&;-;MJN;DP5| z>povu2nb%h089k7>j~Zk=$tFS_r52yIiIBce`Eq*A*3DPdq(o8m_h7Z0gkK^odrqK z_VqOf2FD~E*{uO*`gL*VV~2hijpzpj!aAdhl0|~+YYG75Jd>FEY%saew7XM$|K* zNb4Ddg_xV+PYR@*nfN+xF0G}Iww5zTT*^7w{lq}e3TskGTPr2gO3!4hMbz|111q_VY^Dr3o+9TM`&EP=l7 z@!sC2F-uplWW_D?cQ!M4>KHeC`b*bD0O`*ZASX>mD=lp$)l31z*B~@DLnK!P)4Cw7Rz-Vzk!gVm+C+Vv5S-Sj2 z%==A9C2-OybSMugubvoY7BkCLX|0sZoZ|uJ@;tzGGMpai#HygOY&4JHy2x+ ztp5~BC|a9-#-g=b$tx(odIHQ^-<9$+S}0*_A!q&Y(l$beUVoC)txb3a+zp#3h!*1K z93sV~WZDjJbbl9RbvN?v%RiuF@Hh<{?nYk46-Ue}fH_LoS_@%ciFN;}>%hXTT5x|S$Pn1*$8{-0XY6sUjL16vTOZ%Rwk3=3(2}w%UO5tLo^M$DC6Nf z8Ss4&g6v=~4Y6{Dy~Iq>tmmF#oH{NmQ=PD!laZy z7|s>|%mqf}R7(>nD@WSTa;&e19m~q_%W8S%KrfFR?&Bv<{Fno;{0vdIlBf1}(UHs` z1!u?`V{lG)v#NF#6}3yR-q25t__P@?(JhnGmeO${jgZp>IA1MfU-O&PMN=dLC5(qk zDG`!2iz_)al)*Rf!>4xgh0oqY==Lvj;6yj44t10DK}YiO#zzrKlkM-KI^(i@!!4*w z4F1MASfN)biM>uku!&53A(1g?OYh)x!GmYSJ|Ct}0RzHPI8hKzh-acV+_~de|`a! z5Mpw8eIFr}H=vCW{YoOGoQQqGAf``&_ukma!ozyut$B}&Q{zs^& zTXD%FpE0BSbK%{1vV$dlDaHK(>Q#)wRDfC$plHM=JRD&3!*)d6WtkH|bqwRWg}nLX z2N-oW&9}6Q3xo&Y`G#-Z6{^+%mJ+rQgaM=h-xp-FX~MYye18!`1+|FbBV-49$t40r zmv3aW?J&{O3f^dq6U!V&M~g@v`v5B(A-Zri!J-O&Ywc#NVEB^B101)0!FWCtWfzkg zaFMA5L@F?U36br)+ zT0uc+H820b%P04+09%J?3_mjY!4h?du2#bS)@-$&L-BZMGW)j*{^ zjMSR`oR8Ob5P!*f3hI|*@`8ljF{+fyvBP^=wdS_V7N9?96QGVzD1*rO6h`u?C@3c0 z)J{os0X-cfjKvj=OKwA-vKdOaq@6;dd3h{2oTPo);;)1_Q|>cDWX=j8O>Yzv$XzJLV-$#M?3JwASxoLoP`~& zo{{`$an=KjFzK@bDC{%8lAsJk3t}8OlA`5_e?rA7N%ZuA>!2mvv1uE>IC+dU8u}sy zxMm{NRASH2Ul!-+T@eiFO84^>==v@E7-NlFTudj?szVm&Xt_$)W&hUskH z&yIV(Osu48P690R7xRADV5w1D6(!L-NF-ZKL)|Kd6J5me1>>0*WmT(4^mbAnDI?uI zOr9I2r?F3ja#dz-_aw_9;3r90tcQHNi(gpqA^Gi(WrnBu9Y zdw|v=?N5%LuY{OhJzco8k?mTtx3`leI?bMz4oYs>jvt87-rk7_=acMeB{)7t-qN*T z%%l(kOGy+S%_sXg^6by4udF0JaFU$wvvS3{i}C=8;!BANe$?GT!FY_(ltHG;2~j{K zTtQaH$>oZPkEAJyX~bBBUK{K`C`ATmR=c&FNQ5T5f%I7qkYuEo*eyu`YF1mYXa(C> zZy=BhQ&Uig42AJ?4h8W}J`+}a_O4%JLo7=6@Vgk_M@-iJg|cuy+RF`9HEaq%@boD} zPI2tWew^{tInTLJTWiJG9(^E%+44(YBJ#`=u#G7kfrp z*RcR7;peiW!);<z5M#a7F-NJFpyx00H3Iyu$tE!2@zk9F#f^{P&aqFma5u23QJI z0YyNV3!EnZ1j1(`^-TbMKr7G#WTylWOpJJVQjEYP`RnDZjF}X{nQS)T0%kVB>xJ;e h2r`d(%wrz&_+Ors-N}(3M9}~M002ovPDHLkV1g2L^7sG% literal 0 HcmV?d00001 diff --git a/app/examples/Drawing/RandomColorSort/.lang/ru.po b/app/examples/Drawing/RandomColorSort/.lang/ru.po new file mode 100644 index 00000000..2aab37bb --- /dev/null +++ b/app/examples/Drawing/RandomColorSort/.lang/ru.po @@ -0,0 +1,96 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Дмитрий Ошкало , 2019 +# Kашицин Роман , 2019 +# Олег o1hk , 2019 +# AlexL , 2019 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-23 07:08+0300\n" +"PO-Revision-Date: 2019-05-09 00:48+0000\n" +"Last-Translator: AlexL , 2019\n" +"Language-Team: Russian (https://www.transifex.com/rus-open-source/teams/44267/ru/)\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: app/examples/Drawing/RandomColorSort/.project:17 +msgid "Random Colors, Sorted by Hue" +msgstr "Случайные цвета, отсортированные по оттенкам" + +#: app/examples/Drawing/RandomColorSort/.project:18 +msgid "" +"Random colors, sorted by hue.\n" +"\n" +"Random colors are sorted by hue on a two-dimentional circular chart. Colors are either displayed all at once, or slowed down to see each separate color plotted on the chart. The image can be saved as a PNG file." +msgstr "" +"Случайные цвета, отсортированные по оттенку.\n" +"\n" +"Случайные цвета сортируются по оттенку на двумерной круговой диаграмме. Цвета отображаются сразу или замедляются, чтобы увидеть каждый отдельный цвет, нанесённый на график. Изображение может быть сохранено в виде файла PNG." + +#: app/examples/Drawing/RandomColorSort/.src/FMain.class:219 +msgid "Could not save image" +msgstr "Не удалось сохранить изображение" + +#: app/examples/Drawing/RandomColorSort/.src/FMain.class:219 +msgid "Be sure to end the filename with the .png extension!" +msgstr "Обязательно заканчивайте имя файла расширением .png!" + +#: app/examples/Drawing/RandomColorSort/.src/FMain.form:5 +msgid "Random Colors, Sorted By Hue" +msgstr "Случайные цвета, отсортированные по оттенкам" + +#: app/examples/Drawing/RandomColorSort/.src/FMain.form:19 +msgid "Create PNG File of Current Image" +msgstr "Создать PNG-файл из текущего изображения" + +#: app/examples/Drawing/RandomColorSort/.src/FMain.form:20 +msgid "Save" +msgstr "Сохранить" + +#: app/examples/Drawing/RandomColorSort/.src/FMain.form:24 +msgid "Hues" +msgstr "Оттенки" + +#: app/examples/Drawing/RandomColorSort/.src/FMain.form:28 +msgid "Esc Key Exits Too" +msgstr "Клавиша Esc - тоже выход" + +#: app/examples/Drawing/RandomColorSort/.src/FMain.form:29 +msgid "Exit" +msgstr "Выход" + +#: app/examples/Drawing/RandomColorSort/.src/FMain.form:34 +msgid "Redraw the Colors" +msgstr "Перерисовать цвета" + +#: app/examples/Drawing/RandomColorSort/.src/FMain.form:35 +msgid "Repeat" +msgstr "Повторить" + +#: app/examples/Drawing/RandomColorSort/.src/FMain.form:39 +msgid "Count" +msgstr "Количество" + +#: app/examples/Drawing/RandomColorSort/.src/FMain.form:44 +msgid "2" +msgstr "2" + +#: app/examples/Drawing/RandomColorSort/.src/FMain.form:49 +msgid "Slow" +msgstr "Медленно" + +#: app/examples/Drawing/RandomColorSort/.src/FMain.form:53 +msgid "Change the Number of Colors" +msgstr "Изменить количество цветов" + diff --git a/app/examples/Drawing/RandomColorSort/.project b/app/examples/Drawing/RandomColorSort/.project new file mode 100644 index 00000000..8ae8a6e8 --- /dev/null +++ b/app/examples/Drawing/RandomColorSort/.project @@ -0,0 +1,16 @@ +# Gambas Project File 3.0 +# Compiled with Gambas 3.6.90 +Title=Random Colors, Sorted by Hue +Startup=FMain +Icon=RandomColorSort.png +Version=1.0.0 +Component=gb.image +Component=gb.gui +Description="Random colors, sorted by hue.\n\nRandom colors are sorted by hue on a two-dimentional circular chart. Colors are either displayed all at once, or slowed down to see each separate color plotted on the chart. The image can be saved as a PNG file." +Authors="Louis W. Adams, Jr." +Environment="GB_JIT_DEBUG=1" +TabSize=2 +KeepDebugInfo=0 +Vendor=Example +Packager=1 +Translate=1 diff --git a/app/examples/Drawing/RandomColorSort/.src/FMain.class b/app/examples/Drawing/RandomColorSort/.src/FMain.class new file mode 100644 index 00000000..50054fbd --- /dev/null +++ b/app/examples/Drawing/RandomColorSort/.src/FMain.class @@ -0,0 +1,265 @@ +' Gambas class file + +' RandomColorSort - Louis W. Adams, Jr. - February 2014 +' Drawing routine fixed by Benoît Minisini + +Const cFormWidth As Integer = 927 'Form size. +Const cFormHeight As Integer = 800 + +Const cChartWidthHeight As Integer = 315 'Color chart size, width and height. +Const cInset As Integer = 50 'Width of border around chart. +Const cCircleRadius As Integer = 15 'Radius, in pixels, of color circles. + +'Create picture and initialize size. +Private picChart As New Picture(cChartWidthHeight, cChartWidthHeight) + +Private a As Single 'Color attributes. +Private b As Single +Private cc As Single +Private hh As Single + +Private RR As Integer 'Color RGB values. +Private GG As Integer +Private BB As Integer + +Private iColorCount As Integer 'The number of colors to be plotted. + +Public Sub _new() + + With Me 'Set up form size and display characteristics. + .Width = cFormWidth + .Height = cFormHeight + .Resizable = False + .Center + End With + + With daColorChart 'Set up display area control size and other characteristics. + .Width = cChartWidthHeight + .Height = cChartWidthHeight + End With + + 'pnlControls.X = cChartWidthHeight + 20 'Position panel 20 pixels to the right of the display area control. + 'pnlControls.Y = (cChartWidthHeight - pnlControls.Height) \ 2 'Vertically center the panel on the form. + + scrColorCount.Value = 9 'The initial number of colors to display is 2^9 = 512 colors. + +End + +Private Sub RedrawPicture() + + Dim I As Integer + + iColorCount = 2 ^ scrColorCount.Value 'Number of colors. + lblColorCount.Text = Trim(Format(iColorCount, "##,###")) 'Convert the number of colors into a text label. + + picChart.Fill(Color.White) 'Initialize picture by filling it with white. + 'This also serves to "erase" a pre-existing picture. + + If chkDelay.Value Then 'Check to see if user wants a slow color display. + + For I = 1 To iColorCount + ComputeColor() + Paint.Begin(picChart) + DrawColorCircle() 'Paint/draw the color circle on the picture. + Paint.End + daColorChart.Refresh + Wait 0.25 'Delay next color displayed. + If Not chkDelay.Value Then Break 'Abort slow display if user unchecks checkbox. + Next + + Else 'Display all colors at once. + + Paint.Begin(picChart) + For I = 1 To iColorCount + ComputeColor() + DrawColorCircle() 'Paint/draw the color circle on the picture. + Next + Paint.End + + daColorChart.Refresh + + End If + +End + +Public Sub Form_Open() + + RedrawPicture + +End + +Private Sub ComputeColor() + + RR = Rnd(0, 255) 'Pick random RGB values for a color. + GG = Rnd(0, 255) + BB = Rnd(0, 255) + + cc = (Max(Max(RR, GG), BB) - Min(Min(RR, GG), BB)) / 255.0 'Chromaticness, the distance of the color from center. + hh = ATan2(((RR + GG) - 2 * BB), Sqr(3) * (RR - GG)) 'Hue angle. + + a = cc * Cos(hh) 'Color space coordinates, where a is the horizontal coordinate + b = cc * Sin(hh) 'and b is the vertical coordinate. Both coordinates range from -1 to 1. + +End + +Private Function XX(at As Single) As Integer 'Convert a color coordinate into horizontal screen coordinate. + + Return ((cChartWidthHeight - 2 * cInset) * at + cChartWidthHeight) * 0.5 + +End + +Private Function YY(bt As Single) As Integer 'Convert b color coordinate into vertical screen coordinate. + + Return (-(cChartWidthHeight - 2 * cInset) * bt + cChartWidthHeight) * 0.5 + +End + +Private Function DrawColorCircle() + + With Paint + .Brush = Paint.Color(Color.Black) 'Draw solid black disk. + .Ellipse(XX(a) - cCircleRadius, YY(b) - cCircleRadius, 2 * cCircleRadius, 2 * cCircleRadius) + .Fill() + + .Brush = Paint.Color(Color.RGB(RR, GG, BB)) 'Draw slightly smaller color disk so a black outline remains around the disk. + .Ellipse(XX(a) - cCircleRadius + 1, YY(b) - cCircleRadius + 1, 2 * (cCircleRadius - 1), 2 * (cCircleRadius - 1)) + .Fill() + End With + +End + +Private Function DrawChartAxes() + + Dim I As Integer + Dim T As Single + + If chkAxes.Value Then + + With Paint 'Paint mode is good for drawing lines. + + .AntiAlias = False 'Do not antialias vertical and horizontal lines. Using antialias blurs them a little. + + .Brush = Paint.Color(Color.Black) 'Draw 3 pixel wide a and b axes. + .LineWidth = 3 + + .MoveTo(XX(-1), YY(0)) + .LineTo(XX(1), YY(0)) + .Stroke + + .MoveTo(XX(0), YY(1)) + .LineTo(XX(0), YY(-1)) + .Stroke + + .AntiAlias = True 'Turn on antialiasing to smoothen angled dashed lines. + .Dash = [5, 5] 'The dashes are 5 pixels long separated by 5 pixel gaps. + + For I = 30 To 330 Step 30 'Major color hues are located at 30 degree increments. + If (I = 90) Or (I = 180) Or (I = 270) Then 'Omit dashed lines at 90, 180, and 270 degrees. + Continue + Else + .MoveTo(XX(0), YY(0)) 'Draw 1-unit long lines from the coordinate center at + .LineTo(XX(Cos(Rad(I))), YY(Sin(Rad(I)))) 'specified angles I. Convert degrees to radians for + .Stroke 'trig functions. + Endif + Next + + End With + + With Draw 'Draw mode is good for displaying text. + + .Font.Name = "DejaVu Sans Mono" + .Foreground = Color.Black + .Font.Size = 20 + .Font.Bold = False + + T = 1.09 'Radial distance for color letters. + + .Text("R", XX(T * Cos(Rad(30.0))), YY(T * Sin(Rad(30.0))), 1, 1, 3) 'Red. Center the letter on a 1x1 pixel area; i.e., text base is along radial line. + .Text("Y", XX(0), YY(T), 1, 1, 3) 'Yellow + .Text("O", XX(T * Cos(Rad(60.0))), YY(T * Sin(Rad(60.0))), 1, 1, 3) 'Orange + '.Text("L", XX(T * Cos(Rad(120.0))), YY(T * Sin(Rad(120.0))), 1, 1, 3) 'Lime. Yellowish green. Not a standard hue. + .Text("G", XX(T * Cos(Rad(150.0))), YY(T * Sin(Rad(150.0))), 1, 1, 3) 'Green + .Text("C", XX(T * Cos(Rad(210.0))), YY(T * Sin(Rad(210.0))), 1, 1, 3) 'Cyan + .Text("B", XX(0), YY(-T), 1, 1, 3) 'Blue. This is computer display blue, which is slightly violet. + '.Text("BB", XX(T * Cos(Rad(240.0))), YY(T * Sin(Rad(240.0))), 1, 1, 3) 'Baby Blue, sky blue. This is what many people think of as blue. + .Text("V", XX(T * Cos(Rad(300.0))), YY(T * Sin(Rad(300.0))), 1, 1, 3) 'Violet + .Text("M", XX(T * Cos(Rad(330.0))), YY(T * Sin(Rad(330.0))), 1, 1, 3) 'Magenta + + End With + + End If + +End + +Public Sub scrColorCount_Change() + + If chkDelay.Value Then 'In order to gracefully exit the slow color display loop when the number of colors is changed, + chkDelay.Value = False 'it is necessary to reset the control to stop slow display mode. + Endif + + 'Wait 'Execute all pending events before continuing. Otherwise duplicate scroll events are triggered + RedrawPicture 'for high color counts. Don't know why! + +End + +Public Sub btnSave_Click() + + Dim strFilter As New String[] + + strFilter.Add("*.png") 'GAMBAS can convert the picture into other file formats. + strFilter.Add("PNG") 'PNG uses lossless compression, and is used on the Internet. + + Dialog.Filter = strFilter 'Prompt user for file name. + + If (Dialog.SaveFile()) Then Return 'Cancel request (exit subroutine) if user hit cancel button. + + picChart.Save(Dialog.Path) 'Save picture to file. + +Catch + Message.Warning(("Could not save image") & "\n\n\t" & Dialog.Path & "\n \n" & Error.Text & ". " & ("Be sure to end the filename with the .png extension!")) + +End + +Public Sub chkAxes_Click() + + daColorChart.Refresh + +End + +Public Sub btnReDo_Click() + + RedrawPicture + +End + +Public Sub chkDelay_Click() + + RedrawPicture + +End + +Public Sub btnQuit_Click() + + If chkDelay.Value Then 'Properly terminate delayed graphics calls prior to exiting program. + chkDelay.Value = False 'Force quit on delayed colors. + Wait 0.5 'Make sure delay loop times out. + Endif + + Me.Close + +End + +Public Sub Form_Close() 'If user manually closes window, capture event and redirect to Quit routine. + + btnQuit_Click() + +End + +Public Sub daColorChart_Draw() + + Draw.Picture(picChart, 0, 0) + If chkAxes.Value Then + DrawChartAxes() 'Show how the color space is divided up into hues. + Endif + +End diff --git a/app/examples/Drawing/RandomColorSort/.src/FMain.form b/app/examples/Drawing/RandomColorSort/.src/FMain.form new file mode 100644 index 00000000..61917d79 --- /dev/null +++ b/app/examples/Drawing/RandomColorSort/.src/FMain.form @@ -0,0 +1,59 @@ +# Gambas Form File 3.0 + +{ Form Form + MoveScaled(0,0,74,85) + Text = ("Random Colors, Sorted By Hue") + Icon = Picture["icon:/32/fill"] + Resizable = False + { daColorChart DrawingArea + MoveScaled(1,1,26,26) + Background = &HFFFFFF& + Border = Border.Plain + } + { pnlControls Panel + MoveScaled(47,1,26,83) + Background = &HFFFFFF& + Border = Border.Plain + { btnSave Button + MoveScaled(2,55,22,4) + ToolTip = ("Create PNG File of Current Image") + Text = ("Save") + } + { chkAxes CheckBox + MoveScaled(3,2,22,3) + Text = ("Hues") + } + { btnQuit Button + MoveScaled(2,60,22,4) + ToolTip = ("Esc Key Exits Too") + Text = ("Exit") + Cancel = True + } + { btnReDo Button + MoveScaled(2,50,22,4) + ToolTip = ("Redraw the Colors") + Text = ("Repeat") + } + { Label1 Label + MoveScaled(1,10,24,3) + Text = ("Count") + Alignment = Align.Center + } + { lblColorCount Label + MoveScaled(10,46,6,3) + Text = ("2") + Alignment = Align.Center + } + { chkDelay CheckBox + MoveScaled(3,5,22,3) + Text = ("Slow") + } + { scrColorCount Slider + MoveScaled(11,13,4,33) + ToolTip = ("Change the Number of Colors") + MinValue = 1 + MaxValue = 15 + PageStep = 1 + } + } +} diff --git a/app/examples/Drawing/RandomColorSort/RandomColorSort.png b/app/examples/Drawing/RandomColorSort/RandomColorSort.png new file mode 100644 index 0000000000000000000000000000000000000000..7adc8473d35e3a197319533f2e667510e144f8ae GIT binary patch literal 10533 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 literal 0 HcmV?d00001 diff --git a/app/examples/Drawing/Tablet/.directory b/app/examples/Drawing/Tablet/.directory new file mode 100644 index 00000000..06dab1c8 --- /dev/null +++ b/app/examples/Drawing/Tablet/.directory @@ -0,0 +1,2 @@ +[Desktop Entry] +Icon=./.icon.png diff --git a/app/examples/Drawing/Tablet/.hidden/screenshots/2014-12-14.png b/app/examples/Drawing/Tablet/.hidden/screenshots/2014-12-14.png new file mode 100644 index 0000000000000000000000000000000000000000..93493ce0715b9c3969fff22e7c2686fd2e157e6c GIT binary patch literal 59466 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